Merge remote-tracking branch 'remotes/upstream/master' into Potato_AI_Wants_To_Hear_You_Scream_Too
Conflicts: code/modules/mob/living/silicon/ai/ai.dm
This commit is contained in:
@@ -150,7 +150,7 @@ var/global/floorIsLava = 0
|
||||
body += "<br>"
|
||||
body += "</body></html>"
|
||||
|
||||
usr << browse(body, "window=adminplayeropts;size=550x515")
|
||||
usr << browse(body, "window=adminplayeropts-\ref[M];size=550x515")
|
||||
feedback_add_details("admin_verb","SPP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
@@ -252,6 +252,10 @@ var/global/floorIsLava = 0
|
||||
usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
|
||||
dat+="<img src='tmp_photo[i].png' width = '180'><BR><BR>"
|
||||
dat+="<FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR>"
|
||||
dat+="[MESSAGE.comments.len] comment[MESSAGE.comments.len > 1 ? "s" : ""]:<br>"
|
||||
for(var/datum/feed_comment/comment in MESSAGE.comments)
|
||||
dat+="[comment.body]<br><font size=1>[comment.author] [comment.time_stamp]</font><br>"
|
||||
dat+="<br>"
|
||||
dat+="<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A>"
|
||||
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[1]'>Back</A>"
|
||||
if(10)
|
||||
@@ -287,6 +291,9 @@ var/global/floorIsLava = 0
|
||||
for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
|
||||
dat+="-[MESSAGE.body] <BR><FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR>"
|
||||
dat+="<FONT SIZE=2><A href='?src=\ref[src];ac_censor_channel_story_body=\ref[MESSAGE]'>[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")]</A> - <A href='?src=\ref[src];ac_censor_channel_story_author=\ref[MESSAGE]'>[(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]</A></FONT><BR>"
|
||||
dat+="[MESSAGE.comments.len] comment[MESSAGE.comments.len > 1 ? "s" : ""]: <a href='?src=\ref[src];ac_lock_comment=\ref[MESSAGE]'>[MESSAGE.locked ? "Unlock" : "Lock"]</a><br>"
|
||||
for(var/datum/feed_comment/comment in MESSAGE.comments)
|
||||
dat+="[comment.body] <a href='?src=\ref[src];ac_del_comment=\ref[comment];ac_del_comment_msg=\ref[MESSAGE]'>X</a><br><font size=1>[comment.author] [comment.time_stamp]</font><br>"
|
||||
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[10]'>Back</A>"
|
||||
if(13)
|
||||
dat+="<B>[src.admincaster_feed_channel.channel_name]: </B><FONT SIZE=1>\[ created by: <FONT COLOR='maroon'>[src.admincaster_feed_channel.author]</FONT> \]</FONT><BR>"
|
||||
@@ -300,7 +307,6 @@ var/global/floorIsLava = 0
|
||||
else
|
||||
for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
|
||||
dat+="-[MESSAGE.body] <BR><FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR>"
|
||||
|
||||
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[11]'>Back</A>"
|
||||
if(14)
|
||||
dat+="<B>Wanted Issue Handler:</B>"
|
||||
|
||||
@@ -22,12 +22,12 @@
|
||||
F << "<small>[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z])</small> || [src] [message]<br>"
|
||||
|
||||
//ADMINVERBS
|
||||
/client/proc/investigate_show( subject in list("hrefs","notes","ntsl","singulo","wires","telesci", "gravity") )
|
||||
/client/proc/investigate_show( subject in list("hrefs","notes","ntsl","singulo","wires","telesci", "gravity", "records", "cargo") )
|
||||
set name = "Investigate"
|
||||
set category = "Admin"
|
||||
if(!holder) return
|
||||
switch(subject)
|
||||
if("singulo", "ntsl", "wires", "telesci", "gravity") //general one-round-only stuff
|
||||
if("singulo", "ntsl", "wires", "telesci", "gravity", "records", "cargo") //general one-round-only stuff
|
||||
var/F = investigate_subject2file(subject)
|
||||
if(!F)
|
||||
src << "<font color='red'>Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.</font>"
|
||||
|
||||
@@ -57,7 +57,8 @@ var/list/admin_verbs_admin = list(
|
||||
/client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/
|
||||
/client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/
|
||||
/client/proc/cmd_admin_create_centcom_report,
|
||||
/client/proc/check_words /*displays cult-words*/
|
||||
/client/proc/check_words, /*displays cult-words*/
|
||||
/client/proc/reset_all_tcs /*resets all telecomms scripts*/
|
||||
)
|
||||
var/list/admin_verbs_ban = list(
|
||||
/client/proc/unban_panel,
|
||||
@@ -186,7 +187,8 @@ var/list/admin_verbs_hideable = list(
|
||||
/client/proc/enable_debug_verbs,
|
||||
/proc/possess,
|
||||
/proc/release,
|
||||
/client/proc/reload_admins
|
||||
/client/proc/reload_admins,
|
||||
/client/proc/reset_all_tcs
|
||||
)
|
||||
|
||||
/client/proc/add_admin_verbs()
|
||||
@@ -447,7 +449,7 @@ var/list/admin_verbs_hideable = list(
|
||||
set desc = "Gives a Disease to a mob."
|
||||
var/datum/disease/D = input("Choose the disease to give to that guy", "ACHOO") as null|anything in diseases
|
||||
if(!D) return
|
||||
T.contract_disease(new D, 1)
|
||||
T.ForceContractDisease(new D,)
|
||||
feedback_add_details("admin_verb","GD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].")
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] gave [key_name(T)] the disease [D].</span>")
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
..()
|
||||
|
||||
if(usr.client != src.owner || !check_rights(0))
|
||||
world << "<span class='adminnotice'>[usr.key] has attempted to override the admin panel!</span>"
|
||||
message_admins("[usr.key] has attempted to override the admin panel!")
|
||||
log_admin("[key_name(usr)] tried to use the admin panel without authorization.")
|
||||
return
|
||||
|
||||
@@ -2077,7 +2077,7 @@
|
||||
src.access_news_network()
|
||||
|
||||
else if(href_list["ac_set_channel_name"])
|
||||
src.admincaster_feed_channel.channel_name = strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""))
|
||||
src.admincaster_feed_channel.channel_name = stripped_input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")
|
||||
while (findtext(src.admincaster_feed_channel.channel_name," ") == 1)
|
||||
src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,lentext(src.admincaster_feed_channel.channel_name)+1)
|
||||
src.access_news_network()
|
||||
@@ -2273,3 +2273,15 @@
|
||||
else if(href_list["ac_set_signature"])
|
||||
src.admincaster_signature = adminscrub(input(usr, "Provide your desired signature", "Network Identity Handler", ""))
|
||||
src.access_news_network()
|
||||
|
||||
else if(href_list["ac_del_comment"])
|
||||
var/datum/feed_comment/FC = locate(href_list["ac_del_comment"])
|
||||
var/datum/feed_message/FM = locate(href_list["ac_del_comment_msg"])
|
||||
FM.comments -= FC
|
||||
qdel(FC)
|
||||
src.access_news_network()
|
||||
|
||||
else if(href_list["ac_lock_comment"])
|
||||
var/datum/feed_message/FM = locate(href_list["ac_lock_comment"])
|
||||
FM.locked ^= 1
|
||||
src.access_news_network()
|
||||
|
||||
@@ -26,8 +26,6 @@
|
||||
/client/proc/massmodify_variables(var/atom/O, var/var_name = "", var/method = 0)
|
||||
if(!check_rights(R_VAREDIT)) return
|
||||
|
||||
var/list/locked = list("vars", "key", "ckey", "client", "unlock_content")
|
||||
|
||||
for(var/p in forbidden_varedit_object_types)
|
||||
if( istype(O,p) )
|
||||
usr << "<span class='danger'>It is forbidden to edit this object's variables.</span>"
|
||||
@@ -51,8 +49,13 @@
|
||||
var/var_value = O.vars[variable]
|
||||
var/dir
|
||||
|
||||
if(variable == "holder" || (variable in locked))
|
||||
if(variable in VVckey_edit)
|
||||
usr << "It's forbidden to mass-modify ckeys. I'll crash everyone's client you dummy."
|
||||
return
|
||||
if(variable in VVlocked)
|
||||
if(!check_rights(R_DEBUG)) return
|
||||
if(variable in VVicon_edit_lock)
|
||||
if(!check_rights(R_FUN|R_DEBUG)) return
|
||||
|
||||
if(isnull(var_value))
|
||||
usr << "Unable to determine variable type."
|
||||
@@ -371,5 +374,6 @@
|
||||
if (A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
world.log << "### MassVarEdit by [src]: [O.type] [variable]=[html_encode("[O.vars[variable]]")]"
|
||||
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]")
|
||||
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]")
|
||||
@@ -5,6 +5,10 @@ var/list/forbidden_varedit_object_types = list(
|
||||
/datum/admin_rank //editing my own rank? it's more likely than you think
|
||||
)
|
||||
|
||||
var/list/VVlocked = list("vars", "client", "virus", "viruses", "cuffed", "last_eaten", "unlock_content", "step_x", "step_y")
|
||||
var/list/VVicon_edit_lock = list("icon", "icon_state", "overlays", "underlays")
|
||||
var/list/VVckey_edit = list("key", "ckey")
|
||||
|
||||
/*
|
||||
/client/proc/cmd_modify_object_variables(obj/O as obj|mob|turf|area in world)
|
||||
set category = "Debug"
|
||||
@@ -73,7 +77,7 @@ var/list/forbidden_varedit_object_types = list(
|
||||
return var_value
|
||||
|
||||
|
||||
/client/proc/mod_list_add(var/list/L)
|
||||
/client/proc/mod_list_add(var/list/L, atom/O, original_name, objectvar)
|
||||
|
||||
var/class = "text"
|
||||
if(src.holder && src.holder.marked_datum)
|
||||
@@ -125,21 +129,19 @@ var/list/forbidden_varedit_object_types = list(
|
||||
L[var_value] = mod_list_add_ass() //haha
|
||||
if("No")
|
||||
L += var_value
|
||||
world.log << "### ListVarEdit by [src]: [O.type] [objectvar]: ADDED=[var_value]"
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]")
|
||||
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]")
|
||||
|
||||
/client/proc/mod_list(var/list/L)
|
||||
/client/proc/mod_list(var/list/L, atom/O, original_name, objectvar)
|
||||
if(!check_rights(R_VAREDIT)) return
|
||||
|
||||
if(!istype(L,/list)) src << "Not a List."
|
||||
|
||||
var/list/locked = list("vars", "client", "virus", "viruses", "cuffed", "last_eaten", "unlock_content", "step_x", "step_y")
|
||||
var/list/ckey_edit = list("key", "ckey")
|
||||
var/list/icon_edit = list("icon", "icon_state", "overlays", "underlays")
|
||||
var/list/names = sortList(L)
|
||||
|
||||
var/variable = input("Which var?","Var") as null|anything in names + "(ADD VAR)"
|
||||
|
||||
if(variable == "(ADD VAR)")
|
||||
mod_list_add(L)
|
||||
mod_list_add(L, O, original_name, objectvar)
|
||||
return
|
||||
|
||||
if(!variable)
|
||||
@@ -149,11 +151,11 @@ var/list/forbidden_varedit_object_types = list(
|
||||
|
||||
var/dir
|
||||
|
||||
if(variable in locked)
|
||||
if(variable in VVlocked)
|
||||
if(!check_rights(R_DEBUG)) return
|
||||
if(variable in ckey_edit)
|
||||
if(variable in VVckey_edit)
|
||||
if(!check_rights(R_SPAWN|R_DEBUG)) return
|
||||
if(variable in icon_edit)
|
||||
if(variable in VVicon_edit_lock)
|
||||
if(!check_rights(R_FUN|R_DEBUG)) return
|
||||
|
||||
if(isnull(variable))
|
||||
@@ -232,53 +234,66 @@ var/list/forbidden_varedit_object_types = list(
|
||||
if(holder.marked_datum && class == "marked datum ([holder.marked_datum.type])")
|
||||
class = "marked datum"
|
||||
|
||||
var/original_var = L[L.Find(variable)]
|
||||
var/new_var
|
||||
switch(class) //Spits a runtime error if you try to modify an entry in the contents list. Dunno how to fix it, yet.
|
||||
|
||||
if("list")
|
||||
mod_list(variable)
|
||||
mod_list(variable, O, original_name, objectvar)
|
||||
|
||||
if("restore to default")
|
||||
L[L.Find(variable)]=initial(variable)
|
||||
new_var = initial(variable)
|
||||
L[L.Find(variable)] = new_var
|
||||
|
||||
if("edit referenced object")
|
||||
modify_variables(variable)
|
||||
|
||||
if("DELETE FROM LIST")
|
||||
world.log << "### ListVarEdit by [src]: [O.type] [objectvar]: REMOVED=[html_encode("[variable]")]"
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: REMOVED=[variable]")
|
||||
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: REMOVED=[variable]")
|
||||
L -= variable
|
||||
return
|
||||
|
||||
if("text")
|
||||
L[L.Find(variable)] = input("Enter new text:","Text") as text
|
||||
new_var = input("Enter new text:","Text") as text
|
||||
L[L.Find(variable)] = new_var
|
||||
|
||||
if("num")
|
||||
L[L.Find(variable)] = input("Enter new number:","Num") as num
|
||||
new_var = input("Enter new number:","Num") as num
|
||||
L[L.Find(variable)] = new_var
|
||||
|
||||
if("type")
|
||||
L[L.Find(variable)] = input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf)
|
||||
new_var = input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf)
|
||||
L[L.Find(variable)] = new_var
|
||||
|
||||
if("reference")
|
||||
L[L.Find(variable)] = input("Select reference:","Reference") as mob|obj|turf|area in world
|
||||
new_var = input("Select reference:","Reference") as mob|obj|turf|area in world
|
||||
L[L.Find(variable)] = new_var
|
||||
|
||||
if("mob reference")
|
||||
L[L.Find(variable)] = input("Select reference:","Reference") as mob in world
|
||||
new_var = input("Select reference:","Reference") as mob in world
|
||||
L[L.Find(variable)] = new_var
|
||||
|
||||
if("file")
|
||||
L[L.Find(variable)] = input("Pick file:","File") as file
|
||||
new_var = input("Pick file:","File") as file
|
||||
L[L.Find(variable)] = new_var
|
||||
|
||||
if("icon")
|
||||
L[L.Find(variable)] = input("Pick icon:","Icon") as icon
|
||||
new_var = input("Pick icon:","Icon") as icon
|
||||
L[L.Find(variable)] = new_var
|
||||
|
||||
if("marked datum")
|
||||
L[L.Find(variable)] = holder.marked_datum
|
||||
new_var = holder.marked_datum
|
||||
L[L.Find(variable)] = new_var
|
||||
|
||||
world.log << "### ListVarEdit by [src]: [O.type] [objectvar]: [original_var]=[new_var]"
|
||||
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: [original_var]=[new_var]")
|
||||
message_admins("[key_name_admin(src)] modified [original_name]'s varlist [objectvar]: [original_var]=[new_var]")
|
||||
|
||||
/client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0)
|
||||
if(!check_rights(R_VAREDIT)) return
|
||||
|
||||
var/list/locked = list("vars", "client", "virus", "cuffed", "last_eaten", "mutantrace")
|
||||
var/list/ckey_edit = list("key", "ckey")
|
||||
var/list/icon_edit = list("icon", "icon_state", "overlays", "underlays")
|
||||
|
||||
for(var/p in forbidden_varedit_object_types)
|
||||
if( istype(O,p) )
|
||||
usr << "<span class='danger'>It is forbidden to edit this object's variables.</span>"
|
||||
@@ -297,11 +312,11 @@ var/list/forbidden_varedit_object_types = list(
|
||||
src << "A variable with this name ([param_var_name]) doesn't exist in this atom ([O])"
|
||||
return
|
||||
|
||||
if(param_var_name == "holder" || (param_var_name in locked))
|
||||
if(param_var_name in VVlocked)
|
||||
if(!check_rights(R_DEBUG)) return
|
||||
if(param_var_name in ckey_edit)
|
||||
if(param_var_name in VVckey_edit)
|
||||
if(!check_rights(R_SPAWN|R_DEBUG)) return
|
||||
if(param_var_name in icon_edit)
|
||||
if(param_var_name in VVicon_edit_lock)
|
||||
if(!check_rights(R_FUN|R_DEBUG)) return
|
||||
|
||||
variable = param_var_name
|
||||
@@ -359,11 +374,11 @@ var/list/forbidden_varedit_object_types = list(
|
||||
if(!variable) return
|
||||
var_value = O.vars[variable]
|
||||
|
||||
if(variable == "holder" || (variable in locked))
|
||||
if(variable in VVlocked)
|
||||
if(!check_rights(R_DEBUG)) return
|
||||
if(variable in ckey_edit)
|
||||
if(variable in VVckey_edit)
|
||||
if(!check_rights(R_SPAWN|R_DEBUG)) return
|
||||
if(variable in icon_edit)
|
||||
if(variable in VVicon_edit_lock)
|
||||
if(!check_rights(R_FUN|R_DEBUG)) return
|
||||
|
||||
if(!autodetect_class)
|
||||
@@ -454,7 +469,7 @@ var/list/forbidden_varedit_object_types = list(
|
||||
switch(class)
|
||||
|
||||
if("list")
|
||||
mod_list(O.vars[variable])
|
||||
mod_list(O.vars[variable], O, original_name, variable)
|
||||
return
|
||||
|
||||
if("restore to default")
|
||||
@@ -518,5 +533,4 @@ var/list/forbidden_varedit_object_types = list(
|
||||
|
||||
world.log << "### VarEdit by [src]: [O.type] [variable]=[html_encode("[O.vars[variable]]")]"
|
||||
log_admin("[key_name(src)] modified [original_name]'s [variable] to [O.vars[variable]]")
|
||||
message_admins("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]")
|
||||
|
||||
message_admins("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]")
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
var/datum/objective/steal/steal_objective = new
|
||||
steal_objective.owner = H.mind
|
||||
steal_objective.set_target("nuclear authentication disk")
|
||||
steal_objective.set_target(new /datum/objective_item/steal/nukedisc)
|
||||
H.mind.objectives += steal_objective
|
||||
|
||||
var/datum/objective/hijack/hijack_objective = new
|
||||
|
||||
@@ -766,3 +766,21 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
usr << "Random events disabled"
|
||||
message_admins("Admin [key_name_admin(usr)] has disabled random events.")
|
||||
feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
/client/proc/reset_all_tcs()
|
||||
set category = "Admin"
|
||||
set name = "Reset Telecomms Scripts"
|
||||
set desc = "Blanks all telecomms scripts from all telecomms servers"
|
||||
if(!holder)
|
||||
usr << "Admin only."
|
||||
return
|
||||
for(var/obj/machinery/telecomms/server/S in telecomms_list)
|
||||
var/datum/TCS_Compiler/C = S.Compiler
|
||||
S.rawcode = ""
|
||||
C.Compile("")
|
||||
for(var/obj/machinery/computer/telecomms/traffic/T in machines)
|
||||
T.storedcode = ""
|
||||
log_admin("[key_name(usr)] blanked all telecomms scripts.")
|
||||
message_admins("[key_name_admin(usr)] blanked all telecomms scripts.")
|
||||
feedback_add_details("admin_verb","RAT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -259,6 +259,7 @@ var/next_external_rsc = 0
|
||||
'icons/pda_icons/pda_blank.png',
|
||||
'icons/pda_icons/pda_boom.png',
|
||||
'icons/pda_icons/pda_bucket.png',
|
||||
'icons/pda_icons/pda_chatroom.png',
|
||||
'icons/pda_icons/pda_medbot.png',
|
||||
'icons/pda_icons/pda_floorbot.png',
|
||||
'icons/pda_icons/pda_cleanbot.png',
|
||||
@@ -305,4 +306,4 @@ var/next_external_rsc = 0
|
||||
'icons/stamp_icons/large_stamp-cap.png',
|
||||
'icons/stamp_icons/large_stamp-qm.png',
|
||||
'icons/stamp_icons/large_stamp-law.png'
|
||||
)
|
||||
)
|
||||
|
||||
@@ -42,7 +42,8 @@ datum/preferences
|
||||
|
||||
//character preferences
|
||||
var/real_name //our character's name
|
||||
var/be_random_name = 0 //whether we are a random name every round
|
||||
var/be_random_name = 0 //whether we'll have a random name every round
|
||||
var/be_random_body = 0 //whether we'll have a random body every round
|
||||
var/gender = MALE //gender of character (well duh)
|
||||
var/age = 30 //age of character
|
||||
var/blood_type = "A+" //blood type (not-chooseable)
|
||||
@@ -163,7 +164,8 @@ datum/preferences
|
||||
dat += "</td></tr></table>"
|
||||
|
||||
dat += "<h2>Body</h2>"
|
||||
dat += "<a href='?_src_=prefs;preference=all;task=random'>Random Body</A><br>"
|
||||
dat += "<a href='?_src_=prefs;preference=all;task=random'>Random Body</A> "
|
||||
dat += "<a href='?_src_=prefs;preference=all'>Always Random Body: [be_random_body ? "Yes" : "No"]</A><br>"
|
||||
|
||||
dat += "<table width='100%'><tr><td width='24%' valign='top'>"
|
||||
|
||||
@@ -744,6 +746,9 @@ datum/preferences
|
||||
if("name")
|
||||
be_random_name = !be_random_name
|
||||
|
||||
if("all")
|
||||
be_random_body = !be_random_body
|
||||
|
||||
if("hear_midis")
|
||||
toggles ^= SOUND_MIDI
|
||||
|
||||
@@ -791,6 +796,9 @@ datum/preferences
|
||||
if(be_random_name)
|
||||
real_name = random_name(gender)
|
||||
|
||||
if(be_random_body)
|
||||
random_character(gender)
|
||||
|
||||
if(config.humans_need_surnames)
|
||||
var/firstspace = findtext(real_name, " ")
|
||||
var/name_length = length(real_name)
|
||||
|
||||
@@ -169,6 +169,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["OOC_Notes"] >> metadata
|
||||
S["real_name"] >> real_name
|
||||
S["name_is_always_random"] >> be_random_name
|
||||
S["body_is_always_random"] >> be_random_body
|
||||
S["gender"] >> gender
|
||||
S["age"] >> age
|
||||
S["hair_color"] >> hair_color
|
||||
@@ -205,6 +206,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
mutant_color = "#FFF"
|
||||
if(!real_name) real_name = random_name(gender)
|
||||
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
|
||||
be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body))
|
||||
gender = sanitize_gender(gender)
|
||||
if(gender == MALE)
|
||||
hair_style = sanitize_inlist(hair_style, hair_styles_male_list)
|
||||
@@ -250,6 +252,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["OOC_Notes"] << metadata
|
||||
S["real_name"] << real_name
|
||||
S["name_is_always_random"] << be_random_name
|
||||
S["body_is_always_random"] << be_random_body
|
||||
S["gender"] << gender
|
||||
S["age"] << age
|
||||
S["hair_color"] << hair_color
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
var/flash_protect = 0 //Malk: What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS
|
||||
var/tint = 0 //Malk: Sets the item's level of visual impairment tint, normally set to the same as flash_protect
|
||||
var/up = 0 // but seperated to allow items to protect but not impair vision, like space helmets
|
||||
var/visor_flags = null
|
||||
var/visor_flags_inv = null
|
||||
var/visor_flags = 0 // flags that are added/removed when an item is adjusted up/down
|
||||
var/visor_flags_inv = 0 // same as visor_flags, but for flags_inv
|
||||
|
||||
//Ears: currently only used for headsets and earmuffs
|
||||
/obj/item/clothing/ears
|
||||
@@ -102,8 +102,8 @@ BLIND // can't see anything
|
||||
src.icon_state = initial(icon_state)
|
||||
gas_transfer_coefficient = initial(gas_transfer_coefficient)
|
||||
permeability_coefficient = initial(permeability_coefficient)
|
||||
flags = initial(flags)
|
||||
flags_inv = initial(flags_inv)
|
||||
flags |= visor_flags
|
||||
flags_inv |= visor_flags_inv
|
||||
usr << "You push \the [src] back into place."
|
||||
src.mask_adjusted = 0
|
||||
else
|
||||
@@ -111,8 +111,8 @@ BLIND // can't see anything
|
||||
usr << "You push \the [src] out of the way."
|
||||
gas_transfer_coefficient = null
|
||||
permeability_coefficient = null
|
||||
flags = null
|
||||
flags_inv = null
|
||||
flags &= ~visor_flags
|
||||
flags_inv &= ~visor_flags_inv
|
||||
src.mask_adjusted = 1
|
||||
usr.update_inv_wear_mask()
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
item_state = "balaclava"
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEFACE
|
||||
visor_flags_inv = HIDEFACE
|
||||
w_class = 2
|
||||
action_button_name = "Adjust Balaclava"
|
||||
ignore_maskadjust = 0
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
item_state = "m_mask"
|
||||
body_parts_covered = 0
|
||||
flags = MASKCOVERSMOUTH | MASKINTERNALS
|
||||
visor_flags = MASKCOVERSMOUTH | MASKINTERNALS
|
||||
w_class = 2
|
||||
gas_transfer_coefficient = 0.10
|
||||
permeability_coefficient = 0.50
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
w_class = 1
|
||||
flags = MASKCOVERSMOUTH
|
||||
flags_inv = HIDEFACE
|
||||
visor_flags = MASKCOVERSMOUTH
|
||||
visor_flags_inv = HIDEFACE
|
||||
gas_transfer_coefficient = 0.90
|
||||
permeability_coefficient = 0.01
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0)
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
icon_state = "wizard"
|
||||
strip_delay = 50
|
||||
put_on_delay = 50
|
||||
unacidable = 1
|
||||
|
||||
/obj/item/clothing/shoes/sandal/marisa
|
||||
desc = "A pair of magic black shoes."
|
||||
|
||||
@@ -138,6 +138,7 @@
|
||||
armor = list(melee = 40, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 100, rad = 50)
|
||||
heat_protection = HEAD //Uncomment to enable firesuit protection
|
||||
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/wizard
|
||||
icon_state = "hardsuit-wiz"
|
||||
@@ -151,6 +152,7 @@
|
||||
allowed = list(/obj/item/weapon/teleportation_scroll,/obj/item/weapon/tank/emergency_oxygen)
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
|
||||
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
|
||||
|
||||
//Medical hardsuit
|
||||
|
||||
@@ -120,6 +120,7 @@
|
||||
slowdown = 1
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
action_button_name = "Toggle Armor"
|
||||
unacidable = 1
|
||||
|
||||
/obj/item/clothing/suit/armor/reactive/IsShield()
|
||||
if(active)
|
||||
|
||||
@@ -28,6 +28,12 @@
|
||||
icon_state = "labcoat_cmo"
|
||||
item_state = "labcoat_cmo"
|
||||
|
||||
/obj/item/clothing/suit/labcoat/emt
|
||||
name = "EMT's jacket"
|
||||
desc = "A dark blue jacket with reflective strips for emergency medical technicians."
|
||||
icon_state = "labcoat_emt"
|
||||
item_state = "labcoat_cmo"
|
||||
|
||||
/obj/item/clothing/suit/labcoat/mad
|
||||
name = "\improper The Mad's labcoat"
|
||||
desc = "It makes you look capable of konking someone on the noggin and shooting them into space."
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 20, bio = 20, rad = 20)
|
||||
strip_delay = 50
|
||||
put_on_delay = 50
|
||||
unacidable = 1
|
||||
|
||||
/obj/item/clothing/head/wizard/red
|
||||
name = "red wizard hat"
|
||||
@@ -51,6 +52,7 @@
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
strip_delay = 50
|
||||
put_on_delay = 50
|
||||
unacidable = 1
|
||||
|
||||
|
||||
/obj/item/clothing/suit/wizrobe/red
|
||||
@@ -92,6 +94,7 @@
|
||||
gas_transfer_coefficient = 1
|
||||
permeability_coefficient = 1
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
unacidable = 0
|
||||
|
||||
/obj/item/clothing/head/wizard/marisa/fake
|
||||
name = "witch hat"
|
||||
@@ -100,6 +103,7 @@
|
||||
gas_transfer_coefficient = 1
|
||||
permeability_coefficient = 1
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
unacidable = 0
|
||||
|
||||
/obj/item/clothing/suit/wizrobe/marisa/fake
|
||||
name = "witch robe"
|
||||
@@ -109,3 +113,4 @@
|
||||
gas_transfer_coefficient = 1
|
||||
permeability_coefficient = 1
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
unacidable = 0
|
||||
@@ -3,20 +3,29 @@
|
||||
*/
|
||||
/obj/item/clothing/under/rank/research_director
|
||||
desc = "It's a suit worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants."
|
||||
name = "research director's suit"
|
||||
name = "research director's vest suit"
|
||||
icon_state = "director"
|
||||
item_state = "g_suit"
|
||||
item_color = "director"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 10, rad = 0)
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/rank/research_director/alt
|
||||
desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants."
|
||||
name = "research director's suit"
|
||||
name = "research director's tan suit"
|
||||
icon_state = "rdwhimsy"
|
||||
item_state = "rdwhimsy"
|
||||
item_color = "rdwhimsy"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0)
|
||||
can_adjust = 1
|
||||
|
||||
/obj/item/clothing/under/rank/research_director/turtleneck
|
||||
desc = "A dark purple turtleneck and tan khakis, for a director with a superior sense of style."
|
||||
name = "research director's turtleneck"
|
||||
icon_state = "rdturtle"
|
||||
item_state = "p_suit"
|
||||
item_color = "rdturtle"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0)
|
||||
can_adjust = 1
|
||||
|
||||
/obj/item/clothing/under/rank/scientist
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
if(ismob(target) && target.reagents && reagents.total_volume)
|
||||
user.visible_message("<span class='danger'>\The [target] has been smothered with \the [src] by \the [user]!</span>", "<span class='danger'>You smother \the [target] with \the [src]!</span>", "You hear some struggling and muffled cries of surprise")
|
||||
src.reagents.reaction(target, TOUCH)
|
||||
spawn(5) src.reagents.clear_reagents()
|
||||
src.reagents.clear_reagents()
|
||||
return
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -8,6 +8,21 @@
|
||||
startWhen = 6
|
||||
endWhen = 66
|
||||
announceWhen = 1
|
||||
var/list/wave_type
|
||||
|
||||
/datum/round_event/meteor_wave/New()
|
||||
..()
|
||||
random_wave_type()
|
||||
|
||||
/datum/round_event/meteor_wave/proc/random_wave_type()
|
||||
var/picked_wave = pickweight(list("normal" = 75, "threatening" = 20, "catastrophic" = 5))
|
||||
switch(picked_wave)
|
||||
if("normal")
|
||||
wave_type = meteors_normal
|
||||
if("threatening")
|
||||
wave_type = meteors_threatening
|
||||
if("catastrophic")
|
||||
wave_type = meteors_catastrophic
|
||||
|
||||
/datum/round_event/meteor_wave/announce()
|
||||
priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/AI/meteors.ogg')
|
||||
@@ -15,4 +30,4 @@
|
||||
|
||||
/datum/round_event/meteor_wave/tick()
|
||||
if(IsMultiple(activeFor, 3))
|
||||
spawn_meteors(5, meteorsA) //meteor list types defined in gamemode/meteor/meteors.dm
|
||||
spawn_meteors(5, wave_type) //meteor list types defined in gamemode/meteor/meteors.dm
|
||||
|
||||
@@ -1636,7 +1636,7 @@ ________________________________________________________________________________
|
||||
dat += "Body Temperature: [U.bodytemperature-T0C]°C ([U.bodytemperature*1.8-459.67]°F)<br>"
|
||||
|
||||
for(var/datum/disease/D in U.viruses)
|
||||
dat += "Warning: Virus Detected. Name: [D.name].Type: [D.spread]. Stage: [D.stage]/[D.max_stages]. Possible Cure: [D.cure].<br>"
|
||||
dat += "Warning: Virus Detected. Name: [D.name].Type: [D.spread_text]. Stage: [D.stage]/[D.max_stages]. Possible Cure: [D.cure_text].<br>"
|
||||
dat += "<ul>"
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
if(R.id=="radium"&&s_control)//Can only directly inject radium when AI is in control.
|
||||
@@ -2721,7 +2721,8 @@ It is possible to destroy the net by the occupant or someone else.
|
||||
/obj/effect/energy_net/attack_paw(mob/user)
|
||||
return attack_hand()
|
||||
|
||||
/obj/effect/energy_net/attack_alien(mob/user as mob)
|
||||
/obj/effect/energy_net/attack_alien(mob/living/user as mob)
|
||||
user.do_attack_animation(src)
|
||||
if (islarva(user))
|
||||
return
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
|
||||
|
||||
@@ -301,7 +301,8 @@
|
||||
manual_unbuckle(user)
|
||||
|
||||
|
||||
/obj/effect/spacevine/attack_paw(mob/user as mob)
|
||||
/obj/effect/spacevine/attack_paw(mob/living/user as mob)
|
||||
user.do_attack_animation(src)
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_hit(src, user)
|
||||
manual_unbuckle(user)
|
||||
|
||||
@@ -117,18 +117,8 @@
|
||||
return
|
||||
|
||||
/obj/machinery/gibber/proc/go_out()
|
||||
if (!src.occupant)
|
||||
return
|
||||
for(var/obj/O in src)
|
||||
O.loc = src.loc
|
||||
if (src.occupant.client)
|
||||
src.occupant.client.eye = src.occupant.client.mob
|
||||
src.occupant.client.perspective = MOB_PERSPECTIVE
|
||||
src.occupant.loc = src.loc
|
||||
src.occupant = null
|
||||
dropContents()
|
||||
update_icon()
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/gibber/proc/startgibbing(mob/user as mob)
|
||||
if(src.operating)
|
||||
|
||||
@@ -122,11 +122,12 @@
|
||||
return 1
|
||||
|
||||
else if(istype(O, /obj/item/weapon/soap/)) // If they're trying to clean it then let them
|
||||
var/obj/item/weapon/soap/P = O
|
||||
user.visible_message( \
|
||||
"<span class='notice'>[user] starts to clean the microwave.</span>", \
|
||||
"<span class='notice'>You start to clean the microwave.</span>" \
|
||||
)
|
||||
if (do_after(user,20))
|
||||
if (do_after(user, P.cleanspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>[user] has cleaned the microwave.</span>", \
|
||||
"<span class='notice'>You have cleaned the microwave.</span>" \
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
B.data["donor"] = O
|
||||
|
||||
for(var/datum/disease/D in O.viruses)
|
||||
if(D.spread_type != SPECIAL)
|
||||
if(!(D.spread_flags & SPECIAL))
|
||||
B.data["viruses"] += D.Copy()
|
||||
if(check_dna_integrity(O))
|
||||
B.data["blood_DNA"] = copytext(O.dna.unique_enzymes,1,0)
|
||||
|
||||
@@ -10,23 +10,23 @@
|
||||
if (prob (49))
|
||||
M.show_message("<span class='game'><i>You hear muffled speech... but nothing is there...</i></span>", 2)
|
||||
if(prob(20))
|
||||
playsound(src.loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)
|
||||
playsound(loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)
|
||||
else
|
||||
M.show_message("<span class='game'><i>You hear muffled speech... you can almost make out some words...</i></span>", 2)
|
||||
// M.show_message("<span class='game'><i>[stutter(message)]</i></span>", 2)
|
||||
if(prob(30))
|
||||
playsound(src.loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)
|
||||
playsound(loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)
|
||||
else
|
||||
if(prob(50))
|
||||
return
|
||||
else if(prob (95))
|
||||
M.show_message("<span class='game'><i>You hear muffled speech... but nothing is there...</i></span>", 2)
|
||||
if(prob(20))
|
||||
playsound(src.loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)
|
||||
playsound(loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)
|
||||
else
|
||||
M.show_message("<span class='game'><i>You hear muffled speech... you can almost make out some words...</i></span>", 2)
|
||||
// M.show_message("<span class='game'><i>[stutter(message)]</i></span>", 2)
|
||||
playsound(src.loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)*/
|
||||
playsound(loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)*/
|
||||
|
||||
|
||||
///////////////////////////////////////
|
||||
@@ -88,7 +88,7 @@
|
||||
trapped = HOWLING_GHOST
|
||||
return
|
||||
else
|
||||
var/mob/living/carbon/human/H = new (loc)
|
||||
var/mob/living/carbon/human/H = new(loc)
|
||||
H.makeSkeleton()
|
||||
H.health = 1e5
|
||||
insert(H)
|
||||
@@ -100,71 +100,59 @@
|
||||
if(!trapped)
|
||||
return
|
||||
|
||||
if(trapped == SPOOKY_SKELETON)
|
||||
src.visible_message("<span class='userdanger'><font size='5'>BOO!</font></span>");
|
||||
playsound(src.loc, pick('sound/effects/xylophone1.ogg','sound/effects/xylophone2.ogg','sound/effects/xylophone3.ogg','sound/spookoween/girlscream.ogg'), 300, 1)
|
||||
else if(trapped == SPOOKY_SKELETON)
|
||||
visible_message("<span class='userdanger'><font size='5'>BOO!</font></span>")
|
||||
playsound(loc, pick('sound/effects/xylophone1.ogg','sound/effects/xylophone2.ogg','sound/effects/xylophone3.ogg','sound/spookoween/girlscream.ogg'), 300, 1)
|
||||
trapped = 0
|
||||
spawn(60)
|
||||
if(trapped_mob && trapped_mob.loc && trapped_mob.loc != loc)
|
||||
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new
|
||||
smoke.set_up(1,0, trapped_mob.loc, 0)
|
||||
spawn(90)
|
||||
if(trapped_mob && trapped_mob.loc)
|
||||
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new()
|
||||
smoke.set_up(1, 0, trapped_mob.loc, 0)
|
||||
smoke.start()
|
||||
trapped_mob.loc = loc
|
||||
if(gc_destroyed)
|
||||
qdel(trapped_mob)
|
||||
return
|
||||
src.close()
|
||||
trapped = SPOOKY_SKELETON
|
||||
return
|
||||
|
||||
if(trapped == ANGRY_FAITHLESS)
|
||||
src.visible_message("<span class='userdanger'>The closet bursts open!</span>");
|
||||
src.visible_message("<span class='userdanger'><font size='5'>THIS BEING RADIATES PURE EVIL! YOU BETTER RUN !!!</font></span>");
|
||||
playsound(src.loc, 'sound/hallucinations/wail.ogg', 300, 1)
|
||||
var/mob/living/simple_animal/hostile/faithless/F = new (loc)
|
||||
F.health =1e5
|
||||
else if(trapped == HOWLING_GHOST)
|
||||
visible_message("<span class='userdanger'><font size='5'>[pick("OooOOooooOOOoOoOOooooOOOOO", "BooOOooOooooOOOO", "BOO!", "WoOOoOoooOooo")]</font></span>")
|
||||
playsound(loc, 'sound/spookoween/ghosty_wind.ogg', 300, 1)
|
||||
new /mob/living/simple_animal/shade/howling_ghost(loc)
|
||||
trapped = 0
|
||||
|
||||
else if(trapped == SCARY_BATS)
|
||||
visible_message("<span class='userdanger'><font size='5'>Protect your hair!</font></span>")
|
||||
playsound(loc, 'sound/spookoween/bats.ogg', 300, 1)
|
||||
var/number = rand(1,3)
|
||||
for(var/i=0,i < number,i++)
|
||||
new /mob/living/simple_animal/hostile/retaliate/bat(loc)
|
||||
trapped = 0
|
||||
|
||||
else if(trapped == ANGRY_FAITHLESS)
|
||||
visible_message("<span class='userdanger'>The closet bursts open!</span>")
|
||||
visible_message("<span class='userdanger'><font size='5'>THIS BEING RADIATES PURE EVIL! YOU BETTER RUN!!!</font></span>")
|
||||
playsound(loc, 'sound/hallucinations/wail.ogg', 300, 1)
|
||||
var/mob/living/simple_animal/hostile/faithless/F = new(loc)
|
||||
F.stance = HOSTILE_STANCE_ATTACK
|
||||
F.GiveTarget(usr)
|
||||
trapped = 0
|
||||
qdel(src)
|
||||
spawn(120)
|
||||
if(F && F.loc)
|
||||
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new
|
||||
smoke.set_up(1,0, F.loc, 0)
|
||||
smoke.start()
|
||||
qdel(F)
|
||||
return
|
||||
|
||||
if(trapped == SCARY_BATS)
|
||||
src.visible_message("<span class='userdanger'><font size='5'>Protect your hairs !!!</font></span>");
|
||||
playsound(src.loc, 'sound/spookoween/bats.ogg', 300, 1)
|
||||
var/number = rand(1,4)
|
||||
for(var/i=0,i < number,i++)
|
||||
new /mob/living/simple_animal/hostile/retaliate/bat (loc)
|
||||
trapped = 0
|
||||
return
|
||||
|
||||
if(trapped == INSANE_CLOWN)
|
||||
src.visible_message("<span class='userdanger'><font size='5'>...</font></span>");
|
||||
playsound(src.loc, 'sound/spookoween/scary_clown_appear.ogg', 300, 1)
|
||||
else if(trapped == INSANE_CLOWN)
|
||||
visible_message("<span class='userdanger'><font size='5'>...</font></span>")
|
||||
playsound(loc, 'sound/spookoween/scary_clown_appear.ogg', 300, 1)
|
||||
var/mob/living/simple_animal/hostile/retaliate/clown/insane/IC = new (loc)
|
||||
IC.GiveTarget(usr)
|
||||
trapped = 0
|
||||
return
|
||||
|
||||
if(trapped == HOWLING_GHOST)
|
||||
src.visible_message("<span class='userdanger'><font size='5'>Woo Woo</font></span>");
|
||||
playsound(src.loc, 'sound/spookoween/ghosty_wind.ogg', 300, 1)
|
||||
new /mob/living/simple_animal/shade/howling_ghost (loc)
|
||||
trapped = 0
|
||||
return
|
||||
|
||||
//don't spawn in crates
|
||||
/obj/structure/closet/crate/trigger_spooky_trap()
|
||||
return 0
|
||||
return
|
||||
|
||||
/obj/structure/closet/crate/set_spooky_trap()
|
||||
return 0
|
||||
return
|
||||
|
||||
|
||||
////////////////////
|
||||
@@ -172,8 +160,8 @@
|
||||
////////////////////
|
||||
|
||||
/mob/living/simple_animal/shade/howling_ghost
|
||||
name ="Ghost"
|
||||
real_name = "Ghost"
|
||||
name = "ghost"
|
||||
real_name = "ghost"
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
maxHealth = 1e6
|
||||
health = 1e6
|
||||
@@ -195,8 +183,9 @@
|
||||
/mob/living/simple_animal/shade/howling_ghost/Life()
|
||||
..()
|
||||
timer--
|
||||
if(timer == 0)
|
||||
if(prob(20))
|
||||
roam()
|
||||
if(timer == 0)
|
||||
spooky_ghosty()
|
||||
timer = rand(1,15)
|
||||
|
||||
@@ -211,7 +200,7 @@
|
||||
|
||||
/mob/living/simple_animal/shade/howling_ghost/proc/spooky_ghosty()
|
||||
if(prob(20)) //haunt
|
||||
playsound(src.loc, pick('sound/spookoween/ghosty_wind.ogg','sound/spookoween/ghost_whisper.ogg','sound/spookoween/chain_rattling.ogg'), 300, 1)
|
||||
playsound(loc, pick('sound/spookoween/ghosty_wind.ogg','sound/spookoween/ghost_whisper.ogg','sound/spookoween/chain_rattling.ogg'), 300, 1)
|
||||
if(prob(10)) //flickers
|
||||
var/obj/machinery/light/L = locate(/obj/machinery/light) in view(5, src)
|
||||
if(L)
|
||||
@@ -235,8 +224,8 @@
|
||||
///////////////////////////
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/insane
|
||||
name = "Insane Clown"
|
||||
desc = "May the HonkMother have mercy..."
|
||||
name = "insane clown"
|
||||
desc = "Some clowns do not manage to be accepted, and go insane. This is one of them."
|
||||
icon_state = "scary_clown"
|
||||
icon_living = "scary_clown"
|
||||
icon_dead = "scary_clown"
|
||||
@@ -248,7 +237,6 @@
|
||||
heat_damage_per_tick = 0
|
||||
cold_damage_per_tick = 0
|
||||
unsuitable_atmos_damage = 0
|
||||
|
||||
var/timer
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/insane/New()
|
||||
@@ -279,7 +267,6 @@
|
||||
playsound(M.loc, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 300, 1)
|
||||
spawn(12)
|
||||
loc = M.loc
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/insane/MoveToTarget()
|
||||
return
|
||||
@@ -289,18 +276,15 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/insane/adjustBruteLoss()
|
||||
if(prob(5))
|
||||
playsound(src.loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1)
|
||||
return
|
||||
playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/insane/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(istype(O,/obj/item/weapon/nullrod))
|
||||
if(prob(5))
|
||||
visible_message("<span class='notice'>[src] finally found the peace it deserves. HONK for the HonkMother !</span>");
|
||||
playsound(src.loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1)
|
||||
visible_message("<span class='notice'>[src] finally found the peace it deserves. You hear honks echoing off into the distance.</span>")
|
||||
playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1)
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
visible_message("<span class='userdanger'>It seems to be resisting the effect!!!</span>");
|
||||
return
|
||||
..()
|
||||
|
||||
visible_message("<span class='userdanger'>[src] seems to be resisting the effect!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -127,6 +127,9 @@
|
||||
if("void")
|
||||
dat += "<div class='statusDisplay'>Error: No growns inside.<BR>Please, put growns into reactor.</div>"
|
||||
menustat = "menu"
|
||||
if("nobeakerspace")
|
||||
dat += "<div class='statusDisplay'>Not enough space left in container. Unable to create product.</div>"
|
||||
menustat = "menu"
|
||||
if(beaker)
|
||||
dat += "<div class='statusDisplay'>Biomass: [points] units.</div><BR>"
|
||||
dat += "<A href='?src=\ref[src];activate=1'>Activate</A><A href='?src=\ref[src];detach=1'>Detach Container</A>"
|
||||
@@ -203,13 +206,20 @@
|
||||
updateUsrDialog()
|
||||
return 0
|
||||
|
||||
/obj/machinery/biogenerator/proc/check_container_volume(var/reagent_amount)
|
||||
if(beaker.reagents.total_volume + reagent_amount > beaker.reagents.maximum_volume)
|
||||
menustat = "nobeakerspace"
|
||||
return 1
|
||||
|
||||
/obj/machinery/biogenerator/proc/create_product(var/create)
|
||||
switch(create)
|
||||
if("milk")
|
||||
if (check_cost(20/efficiency)) return 0
|
||||
if(check_container_volume(10)) return 0
|
||||
else if (check_cost(20/efficiency)) return 0
|
||||
else beaker.reagents.add_reagent("milk",10)
|
||||
if("cream")
|
||||
if (check_cost(30/efficiency)) return 0
|
||||
if(check_container_volume(10)) return 0
|
||||
else if (check_cost(30/efficiency)) return 0
|
||||
else beaker.reagents.add_reagent("cream",10)
|
||||
if("meat")
|
||||
if (check_cost(250/efficiency)) return 0
|
||||
@@ -278,12 +288,11 @@
|
||||
else if(href_list["create"])
|
||||
var/amount = (text2num(href_list["amount"]))
|
||||
var/i = amount
|
||||
var/cost = (text2num(href_list["cost"]))
|
||||
var/C = href_list["create"]
|
||||
if(i <= 0)
|
||||
return
|
||||
while(i >= 1)
|
||||
create_product(C, cost, i)
|
||||
create_product(C)
|
||||
i--
|
||||
updateUsrDialog()
|
||||
|
||||
|
||||
@@ -212,7 +212,7 @@
|
||||
name = newtitle
|
||||
title = newtitle
|
||||
if("Contents")
|
||||
var/content = strip_html(input(usr, "Write your book's contents (HTML NOT allowed):"),8192) as message|null
|
||||
var/content = stripped_input(usr, "Write your book's contents (HTML NOT allowed):","","",8192)
|
||||
if(!content)
|
||||
usr << "The content is invalid."
|
||||
return
|
||||
|
||||
@@ -461,14 +461,20 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
||||
icon_state = "binder"
|
||||
anchored = 1
|
||||
density = 1
|
||||
var/busy = 0
|
||||
|
||||
/obj/machinery/bookbinder/attackby(var/obj/O as obj, var/mob/user as mob)
|
||||
if(istype(O, /obj/item/weapon/paper))
|
||||
if(busy)
|
||||
user << "<span class='warning'>The book binder is busy. Please wait for completion of previous operation.</span>"
|
||||
return
|
||||
user.drop_item()
|
||||
O.loc = src
|
||||
user.visible_message("[user] loads some paper into [src].", "You load some paper into [src].")
|
||||
src.visible_message("[src] begins to hum as it warms up its printing drums.")
|
||||
busy = 1
|
||||
sleep(rand(200,400))
|
||||
busy = 0
|
||||
src.visible_message("[src] whirs as it prints and binds a new book.")
|
||||
var/obj/item/weapon/book/b = new(src.loc)
|
||||
b.dat = O:info
|
||||
|
||||
@@ -232,17 +232,18 @@
|
||||
var/list/prize_list = list(
|
||||
new /datum/data/mining_equipment("Stimpack MediPen", /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack, 50),
|
||||
new /datum/data/mining_equipment("Leporazine MediPen", /obj/item/weapon/reagent_containers/hypospray/medipen/leporazine, 50),
|
||||
new /datum/data/mining_equipment("MediPen Bundle", /obj/item/weapon/storage/box/medipens/utility, 200),
|
||||
new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 100),
|
||||
new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
|
||||
new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 200),
|
||||
new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 250),
|
||||
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/device/t_scanner/adv_mining_scanner, 400),
|
||||
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/device/t_scanner/adv_mining_scanner, 300),
|
||||
new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 400),
|
||||
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 450),
|
||||
new /datum/data/mining_equipment("Mining Drone", /mob/living/simple_animal/hostile/mining_drone/, 500),
|
||||
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 650),
|
||||
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 650),
|
||||
new /datum/data/mining_equipment("Sonic Jackhammer", /obj/item/weapon/pickaxe/jackhammer, 800),
|
||||
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 1000),
|
||||
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 1000),
|
||||
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000),
|
||||
new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide/mining, 2000),
|
||||
new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c1000, 5000),
|
||||
@@ -470,7 +471,7 @@
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "resonator"
|
||||
item_state = "resonator"
|
||||
desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vaccuum."
|
||||
desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vacuum."
|
||||
w_class = 3
|
||||
force = 10
|
||||
throwforce = 10
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
new/turf/simulated/floor/plating/asteroid/airless/cave(src)
|
||||
if("Gibtonite")
|
||||
M = new/turf/simulated/mineral/gibtonite(src)
|
||||
if("Clown")
|
||||
if("Bananium")
|
||||
M = new/turf/simulated/mineral/clown(src)
|
||||
/*if("Adamantine")
|
||||
M = new/turf/simulated/mineral/adamantine(src)*/
|
||||
@@ -178,7 +178,7 @@
|
||||
/turf/simulated/mineral/clown
|
||||
name = "bananium deposit"
|
||||
icon_state = "rock_Clown"
|
||||
mineralName = "Clown"
|
||||
mineralName = "Bananium"
|
||||
mineralAmt = 3
|
||||
spreadChance = 0
|
||||
spread = 0
|
||||
@@ -416,7 +416,7 @@
|
||||
new /obj/item/weapon/ore/plasma(src)
|
||||
if (src.mineralName == "Diamond")
|
||||
new /obj/item/weapon/ore/diamond(src)
|
||||
if (src.mineralName == "Clown")
|
||||
if (src.mineralName == "Bananium")
|
||||
new /obj/item/weapon/ore/bananium(src)
|
||||
var/turf/simulated/floor/plating/asteroid/airless/N = ChangeTurf(/turf/simulated/floor/plating/asteroid/airless)
|
||||
N.fullUpdateMineralOverlays()
|
||||
|
||||
@@ -293,3 +293,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
return 1
|
||||
|
||||
|
||||
//this is a mob verb instead of atom for performance reasons
|
||||
//see /mob/verb/examinate() in mob.dm for more info
|
||||
//overriden here and in /mob/living for different point span classes and sanity checks
|
||||
/mob/dead/observer/pointed(atom/A as mob|obj|turf in view())
|
||||
if(!..())
|
||||
return 0
|
||||
usr.visible_message("<span class='deadsay'><b>[src]</b> points to [A]</span>")
|
||||
return 1
|
||||
|
||||
@@ -1,2 +1,78 @@
|
||||
/mob/living/carbon/alien/hitby(atom/movable/AM)
|
||||
..(AM, 1)
|
||||
..(AM, 1)
|
||||
|
||||
|
||||
/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
|
||||
As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble.
|
||||
In all, this is a lot like the monkey code. /N
|
||||
*/
|
||||
/mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if ("help")
|
||||
sleeping = max(0,sleeping-5)
|
||||
resting = 0
|
||||
AdjustParalysis(-3)
|
||||
AdjustStunned(-3)
|
||||
AdjustWeakened(-3)
|
||||
visible_message("<span class='notice'>[M.name] nuzzles [src] trying to wake it up!</span>")
|
||||
|
||||
if ("grab")
|
||||
grabbedby(M)
|
||||
|
||||
else
|
||||
if (health > 0)
|
||||
M.do_attack_animation(src)
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
var/damage = 1
|
||||
visible_message("<span class='danger'>[M.name] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] bites [src]!</span>")
|
||||
adjustBruteLoss(damage)
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
updatehealth()
|
||||
else
|
||||
M << "<span class='warning'>[name] is too injured for that.</span>"
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/alien/attack_larva(mob/living/carbon/alien/larva/L as mob)
|
||||
return attack_alien(L)
|
||||
|
||||
|
||||
/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M as mob)
|
||||
if(..()) //to allow surgery to return properly.
|
||||
return 0
|
||||
|
||||
switch(M.a_intent)
|
||||
if("help")
|
||||
help_shake_act(M)
|
||||
if("grab")
|
||||
grabbedby(M)
|
||||
if ("harm", "disarm")
|
||||
M.do_attack_animation(src)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/mob/living/carbon/alien/attack_paw(mob/living/carbon/monkey/M as mob)
|
||||
if(..())
|
||||
if (stat != DEAD)
|
||||
adjustBruteLoss(rand(1, 3))
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(..())
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
|
||||
@@ -100,237 +100,60 @@
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/attack_paw(mob/living/carbon/monkey/M as mob)
|
||||
if(!ismonkey(M)) return//Fix for aliens receiving double messages when attacking other aliens.
|
||||
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
..()
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if ("help")
|
||||
help_shake_act(M)
|
||||
else
|
||||
if (M.is_muzzled())
|
||||
return
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M.name] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] bites [src]!</span>")
|
||||
if (health > -100)
|
||||
adjustBruteLoss(rand(1, 3))
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/attack_slime(mob/living/carbon/slime/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if(M.Victim) return // can't attack while eating!
|
||||
|
||||
if (stat > -100)
|
||||
|
||||
visible_message("<span class='danger'>The [M.name] glomps [src]!</span>", \
|
||||
"<span class='userdanger'>The [M.name] glomps [src]!</span>")
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(M.is_adult)
|
||||
damage = rand(10, 40)
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
|
||||
adjustBruteLoss(damage)
|
||||
|
||||
if(M.powerlevel > 0)
|
||||
var/stunprob = 10
|
||||
var/power = M.powerlevel + rand(0,3)
|
||||
|
||||
switch(M.powerlevel)
|
||||
if(1 to 2) stunprob = 20
|
||||
if(3 to 4) stunprob = 30
|
||||
if(5 to 6) stunprob = 40
|
||||
if(7 to 8) stunprob = 60
|
||||
if(9) stunprob = 70
|
||||
if(10) stunprob = 95
|
||||
|
||||
if(prob(stunprob))
|
||||
M.powerlevel -= 3
|
||||
if(M.powerlevel < 0)
|
||||
M.powerlevel = 0
|
||||
|
||||
visible_message("<span class='danger'>The [M.name] has shocked [src]!</span>", \
|
||||
"<span class='userdanger'>The [M.name] has shocked [src]!</span>")
|
||||
|
||||
Weaken(power)
|
||||
if (stuttering < power)
|
||||
stuttering = power
|
||||
Stun(power)
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
|
||||
if (prob(stunprob) && M.powerlevel >= 8)
|
||||
adjustFireLoss(M.powerlevel * rand(6,10))
|
||||
|
||||
|
||||
updatehealth()
|
||||
|
||||
..()
|
||||
var/damage = rand(5, 35)
|
||||
if(M.is_adult)
|
||||
damage = rand(10, 40)
|
||||
adjustBruteLoss(damage)
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/humanoid/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.emote("[M.friendly] [src]")
|
||||
else
|
||||
if(M.attack_sound)
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
visible_message("<span class='danger'>[M] [M.attacktext] [src]!</span>", \
|
||||
"<span class='userdanger'>[M] [M.attacktext] [src]!</span>")
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
|
||||
if(..()) //to allow surgery to return properly.
|
||||
return
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if ("help")
|
||||
help_shake_act(M)
|
||||
|
||||
if ("grab")
|
||||
if (M == src || anchored)
|
||||
return
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src)
|
||||
|
||||
M.put_in_active_hand(G)
|
||||
|
||||
G.synch()
|
||||
|
||||
LAssailant = M
|
||||
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='warning'>[M] has grabbed [src] passively!</span>")
|
||||
|
||||
if ("harm")
|
||||
var/damage = rand(1, 9)
|
||||
if (prob(90))
|
||||
if (HULK in M.mutations)//HULK SMASH
|
||||
damage += 14
|
||||
spawn(0)
|
||||
Weaken(damage) // Why can a hulk knock an alien out but not knock out a human? Damage is robust enough.
|
||||
step_away(src,M,15)
|
||||
sleep(3)
|
||||
step_away(src,M,15)
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has punched [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has punched [src]!</span>")
|
||||
if ((stat != DEAD) && (damage > 9||prob(5)))//Regular humans have a very small chance of weakening an alien.
|
||||
Weaken(1,5)
|
||||
visible_message("<span class='danger'>[M] has weakened [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has weakened [src]!</span>", \
|
||||
"<span class='danger'>You hear someone fall.</span>")
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to punch [src]!</span>")
|
||||
|
||||
if ("disarm")
|
||||
if (!lying)
|
||||
if (prob(5))//Very small chance to push an alien down.
|
||||
Weaken(2)
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has pushed down [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has pushed down [src]!</span>")
|
||||
if(..())
|
||||
switch(M.a_intent)
|
||||
if ("harm")
|
||||
var/damage = rand(1, 9)
|
||||
if (prob(90))
|
||||
if (HULK in M.mutations)//HULK SMASH
|
||||
damage += 14
|
||||
spawn(0)
|
||||
Paralyse(1)
|
||||
step_away(src,M,15)
|
||||
sleep(3)
|
||||
step_away(src,M,15)
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has punched [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has punched [src]!</span>")
|
||||
if ((stat != DEAD) && (damage > 9 || prob(5)))//Regular humans have a very small chance of weakening an alien.
|
||||
Paralyse(2)
|
||||
visible_message("<span class='danger'>[M] has weakened [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has weakened [src]!</span>")
|
||||
adjustBruteLoss(damage)
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
updatehealth()
|
||||
else
|
||||
if (prob(50))
|
||||
drop_item()
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to punch [src]!</span>")
|
||||
|
||||
if ("disarm")
|
||||
if (!lying)
|
||||
if (prob(5))
|
||||
Paralyse(2)
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has disarmed [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has disarmed [src]!</span>")
|
||||
add_logs(M, src, "pushed", admin=0)
|
||||
visible_message("<span class='danger'>[M] has pushed down [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has pushed down [src]!</span>")
|
||||
else
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to disarm [src]!</span>")
|
||||
return
|
||||
|
||||
/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
|
||||
As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble.
|
||||
In all, this is a lot like the monkey code. /N
|
||||
*/
|
||||
|
||||
/mob/living/carbon/alien/humanoid/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if ("help")
|
||||
sleeping = max(0,sleeping-5)
|
||||
resting = 0
|
||||
AdjustParalysis(-3)
|
||||
AdjustStunned(-3)
|
||||
AdjustWeakened(-3)
|
||||
visible_message("<span class='notice'>[M.name] nuzzles [src] trying to wake it up!</span>")
|
||||
|
||||
else
|
||||
if (health > 0)
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
var/damage = rand(1, 3)
|
||||
visible_message("<span class='danger'>[M.name] bites [src]!!</span>", \
|
||||
"<span class='userdanger'>[M.name] bites [src]!!</span>")
|
||||
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
M << "<span class='warning'>[name] is too injured for that.</span>"
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/attack_larva(mob/living/carbon/alien/larva/L as mob)
|
||||
|
||||
switch(L.a_intent)
|
||||
if("help")
|
||||
visible_message("<span class='notice'>[L] rubs its head against [src].</span>")
|
||||
|
||||
|
||||
else
|
||||
if (health > 0)
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
var/damage = rand(1, 3)
|
||||
visible_message("<span class='danger'>[L.name] bites [src]!!</span>", \
|
||||
"<span class='userdanger'>[L.name] bites [src]!!</span>")
|
||||
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
L << "<span class='warning'>[name] is too injured for that.</span>"
|
||||
return
|
||||
|
||||
|
||||
if (prob(50))
|
||||
drop_item()
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has disarmed [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has disarmed [src]!</span>")
|
||||
else
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to disarm [src]!</span>")
|
||||
|
||||
/mob/living/carbon/alien/humanoid/restrained()
|
||||
if (handcuffed)
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
icon_state = "larva_dead"
|
||||
|
||||
if(!gibbed)
|
||||
visible_message("<span class='name'>[src]</span> lets out a waning high-pitched cry.")
|
||||
update_canmove()
|
||||
if(client) blind.layer = 0
|
||||
|
||||
|
||||
@@ -114,159 +114,42 @@
|
||||
/mob/living/carbon/alien/larva/attack_ui(slot_id)
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/larva/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.emote("[M.friendly] [src]")
|
||||
else
|
||||
if(M.attack_sound)
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
visible_message("<span class='danger'>[M] [M.attacktext] [src]!</span>", \
|
||||
"<span class='userdanger'>[M] [M.attacktext] [src]!</span>")
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
updatehealth()
|
||||
|
||||
|
||||
/mob/living/carbon/alien/larva/attack_paw(mob/living/carbon/monkey/M as mob)
|
||||
if(!(istype(M, /mob/living/carbon/monkey))) return//Fix for aliens receiving double messages when attacking other aliens.
|
||||
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
..()
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if ("help")
|
||||
help_shake_act(M)
|
||||
else
|
||||
if (M.is_muzzled())
|
||||
return
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M.name] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] bites [src]!</span>")
|
||||
if (health > -100)
|
||||
adjustBruteLoss(rand(1, 3))
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/alien/larva/attack_slime(mob/living/carbon/slime/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if(M.Victim)
|
||||
return // can't attack while eating!
|
||||
|
||||
if (stat != DEAD)
|
||||
visible_message("<span class='danger'>The [M.name] glomps [src]!</span>", \
|
||||
"<span class='userdanger'>The [M.name] glomps [src]!</span>")
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(M.is_adult)
|
||||
damage = rand(20, 40)
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
|
||||
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
..()
|
||||
var/damage = rand(5, 35)
|
||||
if(M.is_adult)
|
||||
damage = rand(20, 40)
|
||||
adjustBruteLoss(damage)
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/larva/attack_hand(mob/living/carbon/human/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if ("help")
|
||||
help_shake_act(M)
|
||||
|
||||
if ("grab")
|
||||
if (M == src || anchored)
|
||||
return
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
|
||||
|
||||
M.put_in_active_hand(G)
|
||||
|
||||
G.synch()
|
||||
|
||||
LAssailant = M
|
||||
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='warning'>[M] has grabbed [src] passively!</span>")
|
||||
if(..())
|
||||
var/damage = rand(1, 9)
|
||||
if (prob(90))
|
||||
if (HULK in M.mutations)
|
||||
damage += 5
|
||||
spawn(0)
|
||||
Paralyse(1)
|
||||
step_away(src,M,15)
|
||||
sleep(3)
|
||||
step_away(src,M,15)
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
visible_message("<span class='danger'>[M] has kicked [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has kicked [src]!</span>")
|
||||
if ((stat != DEAD) && (damage > 4.9))
|
||||
Paralyse(rand(5,10))
|
||||
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
var/damage = rand(1, 9)
|
||||
if (prob(90))
|
||||
if (HULK in M.mutations)
|
||||
damage += 5
|
||||
spawn(0)
|
||||
Paralyse(1)
|
||||
step_away(src,M,15)
|
||||
sleep(3)
|
||||
step_away(src,M,15)
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has kicked [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has kicked [src]!</span>")
|
||||
if ((stat != DEAD) && (damage > 4.9))
|
||||
Weaken(rand(5,10))
|
||||
visible_message("<span class='danger'>[M] has weakened [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has weakened [src]!</span>", \
|
||||
"<span class='danger'>You hear someone fall.</span>")
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to kick [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has attempted to kick [src]!</span>")
|
||||
return
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to kick [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has attempted to kick [src]!</span>")
|
||||
|
||||
/mob/living/carbon/alien/larva/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if ("help")
|
||||
sleeping = max(0,sleeping-5)
|
||||
resting = 0
|
||||
AdjustParalysis(-3)
|
||||
AdjustStunned(-3)
|
||||
AdjustWeakened(-3)
|
||||
visible_message("<span class='notice'>[M.name] nuzzles [src] trying to wake it up!</span>")
|
||||
|
||||
else
|
||||
if (health > 0)
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
var/damage = 1
|
||||
visible_message("<span class='danger'>[M.name] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] bites [src]!</span>")
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
M << "<span class='warning'>[name] is too injured for that.</span>"
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/larva/restrained()
|
||||
|
||||
@@ -229,6 +229,9 @@ var/const/MAX_ACTIVE_TIME = 400
|
||||
|
||||
/proc/CanHug(var/mob/M)
|
||||
|
||||
if(M.stat == DEAD)
|
||||
return 0
|
||||
|
||||
if(iscorgi(M) || ismonkey(M))
|
||||
return 1
|
||||
|
||||
|
||||
@@ -71,41 +71,6 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/carbon/attack_hand(mob/user)
|
||||
if(!iscarbon(user)) return
|
||||
|
||||
for(var/datum/disease/D in viruses)
|
||||
if(D.spread_by_touch())
|
||||
user.contract_disease(D, 0, 1, CONTACT_HANDS)
|
||||
|
||||
for(var/datum/disease/D in user.viruses)
|
||||
if(D.spread_by_touch())
|
||||
contract_disease(D, 0, 1, CONTACT_HANDS)
|
||||
|
||||
if(lying || isslime(src))
|
||||
if(user.a_intent == "help")
|
||||
if(surgeries.len)
|
||||
for(var/datum/surgery/S in surgeries)
|
||||
if(S.next_step(user, src))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/mob/living/carbon/attack_paw(mob/M as mob)
|
||||
if(!istype(M, /mob/living/carbon)) return
|
||||
|
||||
|
||||
for(var/datum/disease/D in viruses)
|
||||
|
||||
if(D.spread_by_touch())
|
||||
M.contract_disease(D, 0, 1, CONTACT_HANDS)
|
||||
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
|
||||
if(D.spread_by_touch())
|
||||
contract_disease(D, 0, 1, CONTACT_HANDS)
|
||||
|
||||
return
|
||||
|
||||
/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0)
|
||||
shock_damage *= siemens_coeff
|
||||
@@ -427,16 +392,6 @@
|
||||
"<span class='userdanger'>[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].</span>")
|
||||
|
||||
|
||||
/mob/living/carbon/attackby(obj/item/I, mob/user)
|
||||
if(lying || isslime(src))
|
||||
if(surgeries.len)
|
||||
if(user.a_intent == "help")
|
||||
for(var/datum/surgery/S in surgeries)
|
||||
if(S.next_step(user, src))
|
||||
return 1
|
||||
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/carbon/getTrail()
|
||||
if(getBruteLoss() < 300)
|
||||
|
||||
@@ -9,4 +9,71 @@
|
||||
visible_message("<span class='warning'>[src] catches [I]!</span>")
|
||||
throw_mode_off()
|
||||
return
|
||||
..()
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/carbon/attackby(obj/item/I, mob/user)
|
||||
if(lying || isslime(src))
|
||||
if(surgeries.len)
|
||||
if(user.a_intent == "help")
|
||||
for(var/datum/surgery/S in surgeries)
|
||||
if(S.next_step(user, src))
|
||||
return 1
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
|
||||
if(!iscarbon(user))
|
||||
return
|
||||
|
||||
for(var/datum/disease/D in viruses)
|
||||
if(D.IsSpreadByTouch())
|
||||
user.ContractDisease(D)
|
||||
|
||||
for(var/datum/disease/D in user.viruses)
|
||||
if(D.IsSpreadByTouch())
|
||||
ContractDisease(D)
|
||||
|
||||
if(lying || isslime(src))
|
||||
if(user.a_intent == "help")
|
||||
if(surgeries.len)
|
||||
for(var/datum/surgery/S in surgeries)
|
||||
if(S.next_step(user, src))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/mob/living/carbon/attack_paw(mob/living/carbon/monkey/M as mob)
|
||||
if(!istype(M, /mob/living/carbon))
|
||||
return 0
|
||||
|
||||
for(var/datum/disease/D in viruses)
|
||||
if(D.IsSpreadByTouch())
|
||||
M.ContractDisease(D)
|
||||
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
if(D.IsSpreadByTouch())
|
||||
ContractDisease(D)
|
||||
|
||||
if(..()) //successful monkey bite.
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
ForceContractDisease(D)
|
||||
return 1
|
||||
|
||||
if(M.a_intent == "help")
|
||||
help_shake_act(M)
|
||||
return 0
|
||||
|
||||
|
||||
/mob/living/carbon/attack_slime(mob/living/carbon/slime/M)
|
||||
if(..())
|
||||
var/power = M.powerlevel + rand(0,3)
|
||||
Weaken(power)
|
||||
if (stuttering < power)
|
||||
stuttering = power
|
||||
Stun(power)
|
||||
var/stunprob = M.powerlevel * 7 + 10
|
||||
if (prob(stunprob) && M.powerlevel >= 8)
|
||||
adjustFireLoss(M.powerlevel * rand(6,10))
|
||||
updatehealth()
|
||||
return 1
|
||||
|
||||
@@ -164,9 +164,6 @@
|
||||
if(100 to 200)
|
||||
msg += "<span class='warning'>[t_He] [t_is] twitching ever so slightly.</span>\n"
|
||||
|
||||
if(suiciding)
|
||||
msg += "<span class='warning'>[t_He] appears to have commited suicide... there is no hope of recovery.</span>\n"
|
||||
|
||||
if(gender_ambiguous) //someone fucked up a gender reassignment surgery
|
||||
if (gender == MALE)
|
||||
msg += "[t_He] has a strange feminine quality to [t_him].\n"
|
||||
@@ -177,8 +174,9 @@
|
||||
if(stat == DEAD || (status_flags & FAKEDEATH))
|
||||
appears_dead = 1
|
||||
if(getorgan(/obj/item/organ/brain))//Only perform these checks if there is no brain
|
||||
if(suiciding)
|
||||
msg += "<span class='warning'>[t_He] appears to have commited suicide... there is no hope of recovery.</span>\n"
|
||||
msg += "<span class='deadsay'>[t_He] [t_is] limp and unresponsive; there are no signs of life"
|
||||
|
||||
if(!key)
|
||||
var/foundghost = 0
|
||||
if(mind)
|
||||
|
||||
@@ -217,105 +217,6 @@
|
||||
apply_damage(rand(20,30), BRUTE, affecting, run_armor_check(affecting, "melee"))
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.emote("[M.friendly] [src]")
|
||||
else
|
||||
if(M.attack_sound)
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
visible_message("<span class='danger'>[M] [M.attacktext] [src]!</span>", \
|
||||
"<span class='userdanger'>[M] [M.attacktext] [src]!</span>")
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
|
||||
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
|
||||
var/armor = run_armor_check(affecting, "melee")
|
||||
apply_damage(damage, BRUTE, affecting, armor)
|
||||
if(armor >= 2) return
|
||||
|
||||
|
||||
/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L as mob)
|
||||
|
||||
switch(L.a_intent)
|
||||
if("help")
|
||||
visible_message("<span class='notice'>[L] rubs its head against [src].</span>")
|
||||
|
||||
|
||||
else
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
visible_message("<span class='danger'>[L] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[L] bites [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
|
||||
if(stat != DEAD)
|
||||
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
|
||||
var/obj/item/organ/limb/affecting = get_organ(ran_zone(L.zone_sel.selecting))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
|
||||
|
||||
/mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob)
|
||||
if(M.Victim) return // can't attack while eating!
|
||||
|
||||
if (health > -100)
|
||||
|
||||
visible_message("<span class='danger'>The [M.name] glomps [src]!</span>", \
|
||||
"<span class='userdanger'>The [M.name] glomps [src]!</span>")
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(M.is_adult)
|
||||
damage = rand(10, 35)
|
||||
else
|
||||
damage = rand(5, 25)
|
||||
|
||||
|
||||
var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin")
|
||||
|
||||
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
|
||||
|
||||
if(M.powerlevel > 0)
|
||||
var/stunprob = 10
|
||||
var/power = M.powerlevel + rand(0,3)
|
||||
|
||||
switch(M.powerlevel)
|
||||
if(1 to 2) stunprob = 20
|
||||
if(3 to 4) stunprob = 30
|
||||
if(5 to 6) stunprob = 40
|
||||
if(7 to 8) stunprob = 60
|
||||
if(9) stunprob = 70
|
||||
if(10) stunprob = 95
|
||||
|
||||
if(prob(stunprob))
|
||||
M.powerlevel -= 3
|
||||
if(M.powerlevel < 0)
|
||||
M.powerlevel = 0
|
||||
visible_message("<span class='danger'>The [M.name] has shocked [src]!</span>", \
|
||||
"<span class='userdanger'>The [M.name] has shocked [src]!</span>")
|
||||
|
||||
Weaken(power)
|
||||
if (stuttering < power)
|
||||
stuttering = power
|
||||
Stun(power)
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
|
||||
if (prob(stunprob) && M.powerlevel >= 8)
|
||||
adjustFireLoss(M.powerlevel * rand(6,10))
|
||||
|
||||
|
||||
updatehealth()
|
||||
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/human/var/co2overloadtime = null
|
||||
/mob/living/carbon/human/var/temperature_resistance = T0C+75
|
||||
|
||||
@@ -497,6 +398,7 @@
|
||||
if(R)
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/hud/security/sunglasses))
|
||||
if(setcriminal != "Cancel")
|
||||
investigate_log("[src.key] has been set from [R.fields["criminal"]] to [setcriminal] by [usr.name] ([usr.key]).", "records")
|
||||
R.fields["criminal"] = setcriminal
|
||||
|
||||
spawn()
|
||||
@@ -719,7 +621,7 @@
|
||||
return(gain)
|
||||
|
||||
/mob/living/carbon/human/singularity_pull(S, current_size)
|
||||
if(current_size >= 5)
|
||||
if(current_size >= STAGE_THREE)
|
||||
var/list/handlist = list(l_hand, r_hand)
|
||||
for(var/obj/item/hand in handlist)
|
||||
if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && unEquip(hand))
|
||||
|
||||
@@ -3,25 +3,8 @@
|
||||
visible_message("<span class='danger'>[M] attempted to touch [src]!</span>")
|
||||
return 0
|
||||
|
||||
switch(M.a_intent)
|
||||
if ("help")
|
||||
visible_message("<span class='warning'> [M] caresses [src] with its scythe like arm.</span>")
|
||||
if ("grab")
|
||||
if(M == src || anchored)
|
||||
return
|
||||
if (w_uniform)
|
||||
w_uniform.add_fingerprint(M)
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src)
|
||||
|
||||
M.put_in_active_hand(G)
|
||||
|
||||
G.synch()
|
||||
LAssailant = M
|
||||
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has grabbed [src] passively!</span>")
|
||||
|
||||
if("harm")
|
||||
if(..())
|
||||
if(M.a_intent == "harm")
|
||||
if (w_uniform)
|
||||
w_uniform.add_fingerprint(M)
|
||||
var/damage = rand(15, 30)
|
||||
@@ -42,13 +25,15 @@
|
||||
visible_message("<span class='danger'>[M] has wounded [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has wounded [src]!</span>")
|
||||
apply_effect(4, WEAKEN, armor_block)
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
updatehealth()
|
||||
|
||||
if("disarm")
|
||||
if(M.a_intent == "disarm")
|
||||
var/randn = rand(1, 100)
|
||||
if (randn <= 80)
|
||||
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
|
||||
Weaken(5)
|
||||
add_logs(M, src, "tackled", admin=0)
|
||||
visible_message("<span class='danger'>[M] has tackled down [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has tackled down [src]!</span>")
|
||||
else
|
||||
|
||||
@@ -1,20 +1,12 @@
|
||||
/mob/living/carbon/human/attack_paw(mob/M as mob)
|
||||
..()
|
||||
if (M.a_intent == "help")
|
||||
help_shake_act(M)
|
||||
else
|
||||
if (M.is_muzzled())
|
||||
return
|
||||
|
||||
visible_message("<span class='danger'>[M.name] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] bites [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
|
||||
/mob/living/carbon/human/attack_paw(mob/living/carbon/monkey/M as mob)
|
||||
if(..()) //successful monkey bite.
|
||||
var/damage = rand(1, 3)
|
||||
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
|
||||
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
|
||||
apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee"))
|
||||
if(stat != DEAD)
|
||||
apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee"))
|
||||
updatehealth()
|
||||
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
contract_disease(D,1,0)
|
||||
ContractDisease(D)
|
||||
return
|
||||
|
||||
@@ -132,8 +132,10 @@ emp_act
|
||||
return dna.species.spec_attacked_by(I,user,def_zone,affecting,hit_area,src.a_intent,target_limb,target_area,src)
|
||||
|
||||
else
|
||||
if((user != src) && check_shields(I.force, "the [I.name]"))
|
||||
return 0
|
||||
if(user != src)
|
||||
user.do_attack_animation(src)
|
||||
if(check_shields(I.force, "the [I.name]"))
|
||||
return 0
|
||||
|
||||
if(I.attack_verb && I.attack_verb.len)
|
||||
visible_message("<span class='danger'>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!</span>", \
|
||||
@@ -227,3 +229,141 @@ emp_act
|
||||
L.take_damage(0,5)
|
||||
src.Stun(5)
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/carbon/human/acid_act(var/acidpwr, var/toxpwr, var/acid_volume)
|
||||
var/list/damaged = list()
|
||||
|
||||
if(head)
|
||||
if(!head.unacidable)
|
||||
head.acid_act(acidpwr)
|
||||
update_inv_head()
|
||||
else
|
||||
src << "<span class='warning'>Your [head.name] protects your head from the acid!</span>"
|
||||
else
|
||||
if(wear_mask)
|
||||
if(!wear_mask.unacidable)
|
||||
wear_mask.acid_act(acidpwr)
|
||||
update_inv_wear_mask()
|
||||
else
|
||||
src << "<span class='warning'>Your [wear_mask.name] protects your head from the acid!</span>"
|
||||
else
|
||||
if(glasses)
|
||||
if(!glasses.unacidable)
|
||||
glasses.acid_act(acidpwr)
|
||||
update_inv_glasses()
|
||||
else
|
||||
src << "<span class='warning'>Your [glasses.name] protects your head from the acid!</span>"
|
||||
else
|
||||
. = get_organ("head")
|
||||
if(.)
|
||||
damaged += .
|
||||
|
||||
if(wear_suit)
|
||||
if(!wear_suit.unacidable)
|
||||
wear_suit.acid_act(acidpwr)
|
||||
update_inv_wear_suit()
|
||||
else
|
||||
src << "<span class='warning'>Your [wear_suit.name] protects your body from the acid!</span>"
|
||||
else
|
||||
if(w_uniform)
|
||||
if(!w_uniform.unacidable)
|
||||
w_uniform.acid_act(acidpwr)
|
||||
update_inv_w_uniform()
|
||||
else
|
||||
src << "<span class='warning'>Your [w_uniform.name] protects your body from the acid!</span>"
|
||||
else
|
||||
. = get_organ("chest")
|
||||
if(.)
|
||||
damaged += .
|
||||
|
||||
if(gloves)
|
||||
if(!gloves.unacidable)
|
||||
gloves.acid_act(acidpwr)
|
||||
update_inv_gloves()
|
||||
else
|
||||
src << "<span class='warning'>Your [gloves.name] protects your arms from the acid!</span>"
|
||||
else
|
||||
. = get_organ("r_arm")
|
||||
if(.)
|
||||
damaged += .
|
||||
. = get_organ("l_arm")
|
||||
if(.)
|
||||
damaged += .
|
||||
|
||||
|
||||
if(shoes)
|
||||
if(!shoes.unacidable)
|
||||
shoes.acid_act(acidpwr)
|
||||
update_inv_shoes()
|
||||
else
|
||||
src << "<span class='warning'>Your [shoes.name] protects your legs from the acid!</span>"
|
||||
else
|
||||
. = get_organ("r_leg")
|
||||
if(.)
|
||||
damaged += .
|
||||
. = get_organ("l_leg")
|
||||
if(.)
|
||||
damaged += .
|
||||
|
||||
|
||||
for(var/obj/item/organ/limb/affecting in damaged)
|
||||
affecting.take_damage(4*toxpwr, 2*toxpwr)
|
||||
|
||||
if(affecting.name == "head")
|
||||
affecting.take_damage(4*toxpwr, 2*toxpwr)
|
||||
if(prob(2*acidpwr)) //Applies disfigurement
|
||||
emote("scream")
|
||||
facial_hair_style = "Shaved"
|
||||
hair_style = "Bald"
|
||||
update_hair()
|
||||
status_flags |= DISFIGURED
|
||||
|
||||
update_damage_overlays()
|
||||
|
||||
/mob/living/carbon/human/grabbedby(mob/living/user)
|
||||
if(w_uniform)
|
||||
w_uniform.add_fingerprint(user)
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(..())
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
|
||||
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
|
||||
var/armor = run_armor_check(affecting, "melee")
|
||||
apply_damage(damage, BRUTE, affecting, armor)
|
||||
updatehealth()
|
||||
/* if(armor >= 2) //why is this here?
|
||||
return */
|
||||
|
||||
|
||||
/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L as mob)
|
||||
|
||||
if(..()) //successful larva bite.
|
||||
var/damage = rand(1, 3)
|
||||
if(stat != DEAD)
|
||||
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
|
||||
var/obj/item/organ/limb/affecting = get_organ(ran_zone(L.zone_sel.selecting))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
updatehealth()
|
||||
|
||||
|
||||
/mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob)
|
||||
..()
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(M.is_adult)
|
||||
damage = rand(10, 35)
|
||||
else
|
||||
damage = rand(5, 25)
|
||||
|
||||
var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin")
|
||||
|
||||
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
|
||||
return
|
||||
|
||||
@@ -247,6 +247,8 @@
|
||||
if(s_store)
|
||||
unEquip(s_store, 1) //It makes no sense for your suit storage to stay on you if you drop your suit.
|
||||
wear_suit = null
|
||||
if(I.flags_inv & HIDEJUMPSUIT)
|
||||
update_inv_w_uniform()
|
||||
update_inv_wear_suit(0)
|
||||
else if(I == w_uniform)
|
||||
if(r_store)
|
||||
@@ -366,6 +368,8 @@
|
||||
update_inv_shoes(redraw_mob)
|
||||
if(slot_wear_suit)
|
||||
wear_suit = I
|
||||
if(I.flags_inv & HIDEJUMPSUIT)
|
||||
update_inv_w_uniform()
|
||||
update_inv_wear_suit(redraw_mob)
|
||||
if(slot_w_uniform)
|
||||
w_uniform = I
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
var/x_offset = pixel_x + rand(-2,2) //Should probably be moved into the twitch emote at some point.
|
||||
var/y_offset = pixel_y + rand(-1,1)
|
||||
animate(src, pixel_x = pixel_x + x_offset, pixel_y = pixel_y + y_offset, time = 1)
|
||||
animate(pixel_x = pixel_x - x_offset, pixel_y = pixel_y - y_offset, time = 1)
|
||||
animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y), time = 1)
|
||||
if (disabilities & NERVOUS)
|
||||
if (prob(10))
|
||||
stuttering = max(10, stuttering)
|
||||
@@ -568,7 +568,8 @@
|
||||
var/pixel_y_diff = rand(-amplitude/3, amplitude/3)
|
||||
|
||||
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6)
|
||||
animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, time = 2)
|
||||
animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y) , time = 2)
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
|
||||
jitteriness = max(jitteriness-1, 0)
|
||||
|
||||
//Other
|
||||
|
||||
@@ -687,8 +687,10 @@
|
||||
|
||||
if(H.cpr_time < world.time + 30)
|
||||
add_logs(H, M, "CPRed")
|
||||
H.visible_message("<span class='notice'>[M] is trying to perform CPR on [H]!</span>")
|
||||
M.visible_message("<span class='notice'>[M] is trying to perform CPR on [H]!</span>", \
|
||||
"<span class='notice'>You try to perform CPR on [H]. Hold still!</span>")
|
||||
if(!do_mob(M, H))
|
||||
M << "<span class='warning'>You fail to perform CPR on [H]!</span>"
|
||||
return 0
|
||||
if((H.health >= -99 && H.health <= 0))
|
||||
H.cpr_time = world.time
|
||||
@@ -699,29 +701,12 @@
|
||||
H << "<span class='unconscious'>You feel a breath of fresh air enter your lungs. It feels good.</span>"
|
||||
|
||||
if("grab")
|
||||
if(M == H || H.anchored)
|
||||
return 0
|
||||
|
||||
add_logs(M, H, "grabbed", addition="passively")
|
||||
|
||||
if(H.w_uniform)
|
||||
H.w_uniform.add_fingerprint(M)
|
||||
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, H)
|
||||
if(H.buckled)
|
||||
M << "<span class='notice'>You cannot grab [H], \he is buckled in!</span>"
|
||||
if(!G) //the grab will delete itself in New if affecting is anchored
|
||||
return
|
||||
M.put_in_active_hand(G)
|
||||
G.synch()
|
||||
H.LAssailant = M
|
||||
|
||||
playsound(H.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
H.visible_message("<span class='warning'>[M] has grabbed [H] passively!</span>")
|
||||
H.grabbedby(M)
|
||||
return 1
|
||||
|
||||
if("harm")
|
||||
add_logs(M, H, "punched")
|
||||
M.do_attack_animation(H)
|
||||
|
||||
var/atk_verb = "punch"
|
||||
if(H.lying)
|
||||
@@ -767,6 +752,7 @@
|
||||
H.forcesay(hit_appends)
|
||||
|
||||
if("disarm")
|
||||
M.do_attack_animation(H)
|
||||
add_logs(M, H, "disarmed")
|
||||
|
||||
if(H.w_uniform)
|
||||
@@ -822,6 +808,8 @@
|
||||
|
||||
/datum/species/proc/spec_attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone, var/obj/item/organ/limb/affecting, var/hit_area, var/intent, var/obj/item/organ/limb/target_limb, target_area, var/mob/living/carbon/human/H)
|
||||
// Allows you to put in item-specific reactions based on species
|
||||
if(user != src)
|
||||
user.do_attack_animation(H)
|
||||
if((user != H) && H.check_shields(I.force, "the [I.name]"))
|
||||
return 0
|
||||
|
||||
@@ -914,6 +902,8 @@
|
||||
var/showname = "."
|
||||
if(user)
|
||||
showname = " by [user]!"
|
||||
if(user != src)
|
||||
user.do_attack_animation(H)
|
||||
if(!(user in viewers(I, null)))
|
||||
showname = "."
|
||||
|
||||
@@ -1047,14 +1037,9 @@
|
||||
if((H.status_flags & GODMODE))
|
||||
return
|
||||
|
||||
if(!breath || (breath.total_moles() == 0) || H.suiciding)
|
||||
if(!breath || (breath.total_moles() == 0))
|
||||
if(H.reagents.has_reagent("inaprovaline"))
|
||||
return
|
||||
if(H.suiciding)
|
||||
H.adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster
|
||||
H.failed_last_breath = 1
|
||||
H.oxygen_alert = max(H.oxygen_alert, 1)
|
||||
return 0
|
||||
if(H.health >= config.health_threshold_crit)
|
||||
if(NOBREATH in specflags) return 1
|
||||
H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
|
||||
|
||||
@@ -272,6 +272,9 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
w_uniform.screen_loc = ui_iclothing //...draw the item in the inventory screen
|
||||
client.screen += w_uniform //Either way, add the item to the HUD
|
||||
|
||||
if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT))
|
||||
return
|
||||
|
||||
var/t_color = w_uniform.item_color
|
||||
if(!t_color) t_color = icon_state
|
||||
var/image/standing = image("icon"='icons/mob/uniform.dmi', "icon_state"="[t_color]_s", "layer"=-UNIFORM_LAYER)
|
||||
|
||||
@@ -10,11 +10,11 @@
|
||||
return
|
||||
|
||||
|
||||
message = trim(copytext(strip_html_simple(message), 1, MAX_MESSAGE_LEN))
|
||||
message = trim(strip_html_properly(message))
|
||||
if(!can_speak(message))
|
||||
return
|
||||
|
||||
message = "<i>[message]</i>"
|
||||
message = "[message]"
|
||||
log_whisper("[src.name]/[src.key] : [message]")
|
||||
|
||||
if (src.client)
|
||||
@@ -49,9 +49,9 @@
|
||||
if(M.stat == DEAD && ((M.client.prefs.toggles & CHAT_GHOSTWHISPER) || (get_dist(M, src) <= 7)))
|
||||
listening_dead |= M
|
||||
|
||||
var/list/listening = get_hear(1, src)
|
||||
var/list/listening = get_hearers_in_view(1, src)
|
||||
listening |= listening_dead
|
||||
var/list/eavesdropping = hearers(2, src)
|
||||
var/list/eavesdropping = get_hearers_in_view(2, src)
|
||||
eavesdropping -= listening
|
||||
var/list/watching = hearers(5, src)
|
||||
watching -= listening
|
||||
@@ -63,13 +63,13 @@
|
||||
for(var/mob/M in watching)
|
||||
M.show_message(rendered, 2)
|
||||
|
||||
rendered = "<span class='game say'><span class='name'>[GetVoice()]</span>[alt_name] [whispers], <span class='message'>\"[message]\"</span></span>"
|
||||
rendered = "<span class='game say'><span class='name'>[GetVoice()]</span>[alt_name] [whispers], <span class='message'>\"<i>[message]</i>\"</span></span>"
|
||||
|
||||
for(var/mob/M in listening)
|
||||
M.Hear(rendered, src, languages, message)
|
||||
|
||||
message = stars(message)
|
||||
rendered = "<span class='game say'><span class='name'>[GetVoice()]</span>[alt_name] [whispers], <span class='message'>\"[message]\"</span></span>"
|
||||
rendered = "<span class='game say'><span class='name'>[GetVoice()]</span>[alt_name] [whispers], <span class='message'>\"<i>[message]</i>\"</span></span>"
|
||||
for(var/mob/M in eavesdropping)
|
||||
M.Hear(rendered, src, languages, message)
|
||||
|
||||
|
||||
@@ -68,63 +68,33 @@
|
||||
now_pushing = null
|
||||
|
||||
|
||||
/mob/living/carbon/monkey/attack_paw(mob/M as mob)
|
||||
..()
|
||||
|
||||
if (M.a_intent == "help")
|
||||
help_shake_act(M)
|
||||
else
|
||||
if (M.a_intent == "harm" && !M.is_muzzled())
|
||||
if (prob(75))
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M.name] bites [name]!</span>", \
|
||||
"<span class='userdanger'>[M.name] bites [name]!</span>")
|
||||
var/damage = rand(1, 5)
|
||||
if (health > -100)
|
||||
adjustBruteLoss(damage)
|
||||
health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
contract_disease(D,1,0)
|
||||
else
|
||||
visible_message("<span class='danger'>[M.name] has attempted to bite [name]!</span>", \
|
||||
"<span class='userdanger'>[M.name] has attempted to bite [name]!</span>")
|
||||
/mob/living/carbon/monkey/attack_paw(mob/living/M as mob)
|
||||
if(..()) //successful monkey bite.
|
||||
var/damage = rand(1, 5)
|
||||
if (stat != DEAD)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
/mob/living/carbon/monkey/attack_larva(mob/living/carbon/alien/larva/L as mob)
|
||||
|
||||
switch(L.a_intent)
|
||||
if("help")
|
||||
visible_message("<span class='notice'>[L] rubs its head against [src].</span>")
|
||||
|
||||
|
||||
else
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
visible_message("<span class='danger'>[L] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[L] bites [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
|
||||
if(stat != DEAD)
|
||||
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
|
||||
adjustBruteLoss(damage)
|
||||
if(..()) //successful larva bite.
|
||||
var/damage = rand(1, 3)
|
||||
if(stat != DEAD)
|
||||
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
/mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
|
||||
if(..()) //To allow surgery to return properly.
|
||||
return
|
||||
|
||||
if (M.a_intent == "help")
|
||||
help_shake_act(M)
|
||||
|
||||
else
|
||||
if (M.a_intent == "harm")
|
||||
switch(M.a_intent)
|
||||
if("help")
|
||||
help_shake_act(M)
|
||||
if("grab")
|
||||
grabbedby(M)
|
||||
if("harm")
|
||||
M.do_attack_animation(src)
|
||||
if (prob(75))
|
||||
visible_message("<span class='danger'>[M] has punched [name]!</span>", \
|
||||
"<span class='userdanger'>[M] has punched [name]!</span>")
|
||||
@@ -140,54 +110,32 @@
|
||||
"<span class='userdanger'>[M] has knocked out [name]!</span>")
|
||||
return
|
||||
adjustBruteLoss(damage)
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
updatehealth()
|
||||
else
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to punch [name]!</span>", \
|
||||
"<span class='userdanger'>[M] has attempted to punch [name]!</span>")
|
||||
else
|
||||
if (M.a_intent == "grab")
|
||||
if (M == src || anchored)
|
||||
return
|
||||
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
|
||||
|
||||
M.put_in_active_hand(G)
|
||||
|
||||
G.synch()
|
||||
|
||||
LAssailant = M
|
||||
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='warning'>[M] has grabbed [name] passively!</span>")
|
||||
else
|
||||
if (!( paralysis ))
|
||||
if (prob(25))
|
||||
Paralyse(2)
|
||||
if("disarm")
|
||||
if (!( paralysis ))
|
||||
M.do_attack_animation(src)
|
||||
if (prob(25))
|
||||
Paralyse(2)
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
add_logs(M, src, "pushed", admin=0)
|
||||
visible_message("<span class='danger'>[M] has pushed down [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has pushed down [src]!</span>")
|
||||
else
|
||||
if(drop_item())
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has pushed down [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has pushed down [src]!</span>")
|
||||
else
|
||||
if(drop_item())
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has disarmed [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has disarmed [src]!</span>")
|
||||
visible_message("<span class='danger'>[M] has disarmed [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has disarmed [src]!</span>")
|
||||
return
|
||||
|
||||
/mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
|
||||
switch(M.a_intent)
|
||||
if ("help")
|
||||
visible_message("<span class='notice'> [M] caresses [src] with its scythe like arm.</span>")
|
||||
|
||||
if ("harm")
|
||||
if(..()) //if harm or disarm intent.
|
||||
if (M.a_intent == "harm")
|
||||
if ((prob(95) && health > 0))
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
|
||||
var/damage = rand(15, 30)
|
||||
@@ -200,6 +148,7 @@
|
||||
else
|
||||
visible_message("<span class='danger'>[M] has slashed [name]!</span>", \
|
||||
"<span class='userdanger'>[M] has slashed [name]!</span>")
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
if (stat != DEAD)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
@@ -208,21 +157,7 @@
|
||||
visible_message("<span class='danger'>[M] has attempted to lunge at [name]!</span>", \
|
||||
"<span class='userdanger'>[M] has attempted to lunge at [name]!</span>")
|
||||
|
||||
if ("grab")
|
||||
if (M == src || anchored)
|
||||
return
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
|
||||
|
||||
M.put_in_active_hand(G)
|
||||
|
||||
G.synch()
|
||||
|
||||
LAssailant = M
|
||||
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='warning'>[M] has grabbed [name] passively!</span>")
|
||||
|
||||
if ("disarm")
|
||||
if (M.a_intent == "disarm")
|
||||
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
|
||||
var/damage = 5
|
||||
if(prob(95))
|
||||
@@ -233,87 +168,36 @@
|
||||
if(drop_item())
|
||||
visible_message("<span class='danger'>[M] has disarmed [name]!</span>", \
|
||||
"<span class='userdanger'>[M] has disarmed [name]!</span>")
|
||||
add_logs(M, src, "disarmed", admin=0)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
/mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.emote("[M.friendly] [src]")
|
||||
else
|
||||
if(M.attack_sound)
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
visible_message("<span class='danger'>[M] [M.attacktext] [src]!</span>", \
|
||||
"<span class='userdanger'>[M] [M.attacktext] [src]!</span>")
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
if(..())
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
|
||||
/mob/living/carbon/monkey/attack_slime(mob/living/carbon/slime/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
..()
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(M.Victim) return // can't attack while eating!
|
||||
|
||||
if (health > -100)
|
||||
|
||||
visible_message("<span class='danger'>The [M.name] glomps [src]!</span>", \
|
||||
"<span class='userdanger'>The [M.name] glomps [src]!</span>")
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(M.is_adult)
|
||||
damage = rand(20, 40)
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
|
||||
adjustBruteLoss(damage)
|
||||
|
||||
if(M.powerlevel > 0)
|
||||
var/stunprob = 10
|
||||
var/power = M.powerlevel + rand(0,3)
|
||||
|
||||
switch(M.powerlevel)
|
||||
if(1 to 2) stunprob = 20
|
||||
if(3 to 4) stunprob = 30
|
||||
if(5 to 6) stunprob = 40
|
||||
if(7 to 8) stunprob = 60
|
||||
if(9) stunprob = 70
|
||||
if(10) stunprob = 95
|
||||
|
||||
if(prob(stunprob))
|
||||
M.powerlevel -= 3
|
||||
if(M.powerlevel < 0)
|
||||
M.powerlevel = 0
|
||||
|
||||
visible_message("<span class='danger'>[M] shocked [src]!</span>", \
|
||||
"<span class='userdanger'>[M] shocked [src]!</span>")
|
||||
|
||||
Weaken(power)
|
||||
if (stuttering < power)
|
||||
stuttering = power
|
||||
Stun(power)
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
|
||||
if (prob(stunprob) && M.powerlevel >= 8)
|
||||
adjustFireLoss(M.powerlevel * rand(6,10))
|
||||
|
||||
|
||||
updatehealth()
|
||||
if(M.is_adult)
|
||||
damage = rand(20, 40)
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
return
|
||||
|
||||
/mob/living/carbon/monkey/Stat()
|
||||
..()
|
||||
statpanel("Status")
|
||||
stat(null, text("Intent: []", a_intent))
|
||||
stat(null, text("Move Mode: []", m_intent))
|
||||
stat(null, "Intent: [a_intent]")
|
||||
stat(null, "Move Mode: [m_intent]")
|
||||
if(client && mind)
|
||||
if (client.statpanel == "Status")
|
||||
if(mind.changeling)
|
||||
@@ -404,3 +288,16 @@
|
||||
|
||||
/mob/living/carbon/monkey/SpeciesCanConsume()
|
||||
return 1 // Monkeys can eat, drink, and be forced to do so
|
||||
|
||||
|
||||
/mob/living/carbon/monkey/acid_act(var/acidpwr, var/toxpwr, var/acid_volume)
|
||||
if(wear_mask)
|
||||
if(!wear_mask.unacidable)
|
||||
wear_mask.acid_act(acidpwr)
|
||||
update_inv_wear_mask()
|
||||
else
|
||||
src << "<span class='warning'>Your mask protects you from the acid.</span>"
|
||||
return
|
||||
|
||||
if(!unacidable)
|
||||
take_organ_damage(min(6*toxpwr, acid_volume * toxpwr))
|
||||
|
||||
@@ -51,6 +51,8 @@
|
||||
else
|
||||
src << "<span class='notice'>Unusable emote '[act]'. Say *help for a list.</span>"
|
||||
if ((message && src.stat == 0))
|
||||
if(client)
|
||||
log_emote("[name]/[key] : [message]")
|
||||
if (m_type & 1)
|
||||
visible_message(message)
|
||||
else
|
||||
|
||||
@@ -243,102 +243,42 @@
|
||||
return
|
||||
|
||||
/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (Victim) return // can't attack while eating!
|
||||
|
||||
visible_message("<span class='danger'> The [M.name] has glomped [src]!</span>", \
|
||||
"<span class='userdanger'> The [M.name] has glomped [src]!</span>")
|
||||
..()
|
||||
var/damage = rand(1, 3)
|
||||
attacked += 5
|
||||
if(M.is_adult)
|
||||
damage = rand(1, 6)
|
||||
else
|
||||
damage = rand(1, 3)
|
||||
if (health > -100)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
/mob/living/carbon/slime/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.emote("[M.friendly] [src]")
|
||||
else
|
||||
if(M.attack_sound)
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
visible_message("<span class='danger'>[M] [M.attacktext] [src]!</span>", \
|
||||
"<span class='userdanger'>[M] [M.attacktext] [src]!</span>")
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
if(..())
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
attacked += 10
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
/mob/living/carbon/slime/attack_paw(mob/living/carbon/monkey/M as mob)
|
||||
if(!(istype(M, /mob/living/carbon/monkey)))
|
||||
return // Fix for aliens receiving double messages when attacking slimes.
|
||||
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if ("help")
|
||||
help_shake_act(M)
|
||||
else
|
||||
if (M.is_muzzled())
|
||||
return
|
||||
|
||||
if(..()) //successful monkey bite.
|
||||
if(stat != DEAD)
|
||||
attacked += 10
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M.name] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] bites [src]!</span>")
|
||||
if (health > -100)
|
||||
adjustBruteLoss(rand(1, 3))
|
||||
updatehealth()
|
||||
adjustBruteLoss(rand(1, 3))
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
/mob/living/carbon/slime/attack_larva(mob/living/carbon/alien/larva/L as mob)
|
||||
|
||||
switch(L.a_intent)
|
||||
|
||||
if("help")
|
||||
visible_message("<span class='notice'>[L] rubs its head against [src].</span>")
|
||||
|
||||
|
||||
else
|
||||
|
||||
attacked += 10
|
||||
visible_message("<span class='danger'>[L] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[L] bites [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
|
||||
if(stat != DEAD)
|
||||
var/damage = rand(1, 3)
|
||||
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
|
||||
adjustBruteLoss(damage)
|
||||
if(..()) //successful larva bite.
|
||||
var/damage = rand(1, 3)
|
||||
if(stat != DEAD)
|
||||
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
|
||||
/mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
if(Victim)
|
||||
if(Victim == M)
|
||||
if(prob(60))
|
||||
@@ -365,6 +305,7 @@
|
||||
return
|
||||
|
||||
else
|
||||
M.do_attack_animation(src)
|
||||
if(prob(30))
|
||||
visible_message("<span class='warning'>[M] attempts to wrestle \the [name] off of [Victim]!</span>")
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
@@ -392,29 +333,17 @@
|
||||
|
||||
return
|
||||
|
||||
if(..()) //To allow surgery to return properly.
|
||||
return
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if ("help")
|
||||
if("help")
|
||||
help_shake_act(M)
|
||||
|
||||
if ("grab")
|
||||
if (M == src || anchored)
|
||||
return
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src)
|
||||
|
||||
M.put_in_active_hand(G)
|
||||
|
||||
G.synch()
|
||||
|
||||
LAssailant = M
|
||||
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='warning'>[M] has grabbed [src] passively!</span>")
|
||||
|
||||
if("grab")
|
||||
grabbedby(M)
|
||||
else
|
||||
|
||||
M.do_attack_animation(src)
|
||||
var/damage = rand(1, 9)
|
||||
|
||||
attacked += 10
|
||||
if (prob(90))
|
||||
if (HULK in M.mutations)
|
||||
@@ -426,17 +355,17 @@
|
||||
if(prob(80) && !client)
|
||||
Discipline++
|
||||
spawn(0)
|
||||
|
||||
step_away(src,M,15)
|
||||
sleep(3)
|
||||
step_away(src,M,15)
|
||||
|
||||
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
visible_message("<span class='danger'>[M] has punched [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has punched [src]!</span>")
|
||||
|
||||
if (health > -100)
|
||||
if (stat != DEAD)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
@@ -447,20 +376,9 @@
|
||||
|
||||
|
||||
/mob/living/carbon/slime/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
|
||||
switch(M.a_intent)
|
||||
if ("help")
|
||||
visible_message("<span class='notice'>[M] caresses [src] with its scythe like arm.</span>")
|
||||
|
||||
if ("harm")
|
||||
if(..()) //if harm or disarm intent.
|
||||
|
||||
if (M.a_intent == "harm")
|
||||
if (prob(95))
|
||||
attacked += 10
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
|
||||
@@ -473,7 +391,8 @@
|
||||
visible_message("<span class='danger'>[M] has wounded [name]!</span>", \
|
||||
"<span class='userdanger'>)[M] has wounded [name]!</span>")
|
||||
|
||||
if (health > -100)
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
if (health != DEAD)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
@@ -481,21 +400,7 @@
|
||||
visible_message("<span class='danger'>[M] has attempted to lunge at [name]!</span>", \
|
||||
"<span class='userdanger'>[M] has attempted to lunge at [name]!</span>")
|
||||
|
||||
if ("grab")
|
||||
if (M == src || anchored)
|
||||
return
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
|
||||
|
||||
M.put_in_active_hand(G)
|
||||
|
||||
G.synch()
|
||||
|
||||
LAssailant = M
|
||||
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='warning'> [M] has grabbed [name] passively!</span>")
|
||||
|
||||
if ("disarm")
|
||||
if (M.a_intent == "disarm")
|
||||
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
|
||||
var/damage = 5
|
||||
attacked += 10
|
||||
@@ -529,14 +434,16 @@
|
||||
drop_item()
|
||||
visible_message("<span class='danger'>[M] has disarmed [name]!</span>",
|
||||
"<span class='userdanger'>[M] has disarmed [name]!</span>")
|
||||
add_logs(M, src, "disarmed", admin=0)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
/mob/living/carbon/slime/attackby(obj/item/W, mob/user)
|
||||
/mob/living/carbon/slime/attackby(obj/item/W, mob/living/user)
|
||||
if(W.force > 0)
|
||||
attacked += 10
|
||||
if(prob(25))
|
||||
user.do_attack_animation(src)
|
||||
user << "<span class='danger'>[W] passes right through [src]!</span>"
|
||||
return
|
||||
if(Discipline && prob(50)) // wow, buddy, why am I getting attacked??
|
||||
@@ -918,39 +825,39 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
|
||||
..()
|
||||
processing_objects.Add(src)
|
||||
|
||||
process()
|
||||
var/mob/dead/observer/ghost
|
||||
for(var/mob/dead/observer/O in src.loc)
|
||||
if(!O.client) continue
|
||||
if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
|
||||
ghost = O
|
||||
break
|
||||
if(ghost)
|
||||
icon_state = "golem2"
|
||||
else
|
||||
icon_state = "golem"
|
||||
/obj/effect/golemrune/process()
|
||||
var/mob/dead/observer/ghost
|
||||
for(var/mob/dead/observer/O in src.loc)
|
||||
if(!O.client) continue
|
||||
if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
|
||||
ghost = O
|
||||
break
|
||||
if(ghost)
|
||||
icon_state = "golem2"
|
||||
else
|
||||
icon_state = "golem"
|
||||
|
||||
attack_hand(mob/living/user as mob)
|
||||
var/mob/dead/observer/ghost
|
||||
for(var/mob/dead/observer/O in src.loc)
|
||||
if(!O.client) continue
|
||||
if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
|
||||
ghost = O
|
||||
break
|
||||
if(!ghost)
|
||||
user << "The rune fizzles uselessly. There is no spirit nearby."
|
||||
return
|
||||
var/mob/living/carbon/human/G = new /mob/living/carbon/human
|
||||
if(prob(50)) G.gender = "female"
|
||||
hardset_dna(G, null, null, null, null, /datum/species/golem/adamantine)
|
||||
/obj/effect/golemrune/attack_hand(mob/living/user as mob)
|
||||
var/mob/dead/observer/ghost
|
||||
for(var/mob/dead/observer/O in src.loc)
|
||||
if(!O.client) continue
|
||||
if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
|
||||
ghost = O
|
||||
break
|
||||
if(!ghost)
|
||||
user << "The rune fizzles uselessly. There is no spirit nearby."
|
||||
return
|
||||
var/mob/living/carbon/human/G = new /mob/living/carbon/human
|
||||
if(prob(50)) G.gender = "female"
|
||||
hardset_dna(G, null, null, null, null, /datum/species/golem/adamantine)
|
||||
|
||||
G.set_cloned_appearance()
|
||||
G.real_name = text("Adamantine Golem ([rand(1, 1000)])")
|
||||
G.dna.species.auto_equip(G)
|
||||
G.loc = src.loc
|
||||
G.key = ghost.key
|
||||
G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost."
|
||||
qdel(src)
|
||||
G.set_cloned_appearance()
|
||||
G.real_name = text("Adamantine Golem ([rand(1, 1000)])")
|
||||
G.dna.species.auto_equip(G)
|
||||
G.loc = src.loc
|
||||
G.key = ghost.key
|
||||
G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost."
|
||||
qdel(src)
|
||||
|
||||
/mob/living/carbon/slime/getTrail()
|
||||
return null
|
||||
|
||||
@@ -12,9 +12,10 @@
|
||||
changed++
|
||||
ntransform.TurnTo(lying_prev,lying)
|
||||
if(lying == 0) //Lying to standing
|
||||
final_pixel_y += 6
|
||||
final_pixel_y = initial(pixel_y)
|
||||
else //if(lying != 0)
|
||||
if(lying_prev == 0) //Standing to lying
|
||||
pixel_y = initial(pixel_y)
|
||||
final_pixel_y -= 6
|
||||
if(dir & (EAST|WEST)) //Facing east or west
|
||||
final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass
|
||||
@@ -22,4 +23,5 @@
|
||||
lying_prev = lying //so we don't try to animate until there's been another change.
|
||||
|
||||
if(changed)
|
||||
animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT)
|
||||
animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT)
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
|
||||
@@ -10,12 +10,33 @@
|
||||
..()
|
||||
del(src)
|
||||
|
||||
//mob verbs are a lot faster than object verbs
|
||||
//for more info on why this is not atom/pull, see examinate() in mob.dm
|
||||
/mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1))
|
||||
set name = "Pull"
|
||||
set category = "Object"
|
||||
|
||||
if(AM.Adjacent(src))
|
||||
src.start_pulling(AM)
|
||||
return
|
||||
|
||||
//same as above
|
||||
/mob/living/pointed(atom/A as mob|obj|turf in view())
|
||||
if(src.stat || !src.canmove || src.restrained())
|
||||
return 0
|
||||
if(src.status_flags & FAKEDEATH)
|
||||
return 0
|
||||
if(!..())
|
||||
return 0
|
||||
usr.visible_message("<b>[src]</b> points to [A]")
|
||||
return 1
|
||||
|
||||
/mob/living/verb/succumb(var/whispered as null)
|
||||
set hidden = 1
|
||||
if (InCritical())
|
||||
src.attack_log += "[src] has [whispered ? "whispered his final words" : "succumbed to death"] with [round(health, 0.1)] points of health!"
|
||||
src.adjustOxyLoss(src.health + 200)
|
||||
src.health = 100 - src.getOxyLoss() - src.getToxLoss() - src.getFireLoss() - src.getBruteLoss()
|
||||
src.adjustOxyLoss(src.health - config.health_threshold_dead)
|
||||
updatehealth()
|
||||
if(!whispered)
|
||||
src << "<span class='notice'>You have given up life and succumbed to death.</span>"
|
||||
death()
|
||||
@@ -450,9 +471,11 @@
|
||||
if(!I || C.buckled)
|
||||
return
|
||||
cuff_break(I, C)
|
||||
else
|
||||
C << "<span class='warning'>You fail to break [I]!</span>"
|
||||
else
|
||||
|
||||
C.visible_message("<span class='warning'>[usr] attempts to remove [I]!</span>", \
|
||||
C.visible_message("<span class='warning'>[C] attempts to remove [I]!</span>", \
|
||||
"<span class='notice'>You attempt to remove [I]. (This will take around [displaytime] minutes and you need to stand still.)</span>")
|
||||
spawn(0)
|
||||
if(do_after(C, breakouttime))
|
||||
@@ -469,6 +492,8 @@
|
||||
C.legcuffed.loc = usr.loc
|
||||
C.legcuffed = null
|
||||
C.update_inv_legcuffed(0)
|
||||
else
|
||||
C << "<span class='warning'>You fail to remove [I]!</span>"
|
||||
|
||||
/mob/living/verb/resist()
|
||||
set name = "Resist"
|
||||
@@ -511,15 +536,17 @@
|
||||
if(C.handcuffed)
|
||||
C.changeNext_move(CLICK_CD_BREAKOUT)
|
||||
C.last_special = world.time + CLICK_CD_BREAKOUT
|
||||
C.visible_message("<span class='warning'>[usr] attempts to unbuckle themself!</span>", \
|
||||
C.visible_message("<span class='warning'>[C] attempts to unbuckle themself!</span>", \
|
||||
"<span class='notice'>You attempt to unbuckle yourself. (This will take around one minute and you need to stay still.)</span>")
|
||||
spawn(0)
|
||||
if(do_after(usr, 600))
|
||||
if(!C.buckled)
|
||||
return
|
||||
C.visible_message("<span class='danger'>[usr] manages to unbuckle themself!</span>", \
|
||||
C.visible_message("<span class='danger'>[C] manages to unbuckle themself!</span>", \
|
||||
"<span class='notice'>You successfully unbuckle yourself.</span>")
|
||||
C.buckled.manual_unbuckle(C)
|
||||
else
|
||||
C << "<span class='warning'>You fail to unbuckle yourself!</span>"
|
||||
else
|
||||
L.buckled.manual_unbuckle(L)
|
||||
else
|
||||
@@ -638,4 +665,33 @@
|
||||
return(gain)
|
||||
|
||||
/mob/living/singularity_pull(S)
|
||||
step_towards(src,S)
|
||||
step_towards(src,S)
|
||||
|
||||
/mob/living/proc/do_attack_animation(atom/A)
|
||||
var/pixel_x_diff = 0
|
||||
var/pixel_y_diff = 0
|
||||
var/direction = get_dir(src, A)
|
||||
switch(direction)
|
||||
if(NORTH)
|
||||
pixel_y_diff = 8
|
||||
if(SOUTH)
|
||||
pixel_y_diff = -8
|
||||
if(EAST)
|
||||
pixel_x_diff = 8
|
||||
if(WEST)
|
||||
pixel_x_diff = -8
|
||||
if(NORTHEAST)
|
||||
pixel_x_diff = 8
|
||||
pixel_y_diff = 8
|
||||
if(NORTHWEST)
|
||||
pixel_x_diff = -8
|
||||
pixel_y_diff = 8
|
||||
if(SOUTHEAST)
|
||||
pixel_x_diff = 8
|
||||
pixel_y_diff = -8
|
||||
if(SOUTHWEST)
|
||||
pixel_x_diff = -8
|
||||
pixel_y_diff = -8
|
||||
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
|
||||
animate(pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 2)
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
|
||||
|
||||
@@ -106,4 +106,137 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I)
|
||||
adjust_fire_stacks(0.5)
|
||||
IgniteMob()
|
||||
|
||||
//Mobs on Fire end
|
||||
//Mobs on Fire end
|
||||
|
||||
|
||||
/mob/living/acid_act(var/acidpwr, var/toxpwr, var/acid_volume)
|
||||
if(!unacidable)
|
||||
take_organ_damage(min(6*toxpwr, acid_volume * toxpwr))
|
||||
|
||||
/mob/living/proc/grabbedby(mob/living/carbon/user)
|
||||
if(user == src || anchored)
|
||||
return 0
|
||||
if(!(status_flags & CANPUSH))
|
||||
return 0
|
||||
|
||||
add_logs(user, src, "grabbed", addition="passively")
|
||||
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src)
|
||||
if(buckled)
|
||||
user << "<span class='notice'>You cannot grab [src], \he is buckled in!</span>"
|
||||
if(!G) //the grab will delete itself in New if src is anchored
|
||||
return 0
|
||||
user.put_in_active_hand(G)
|
||||
G.synch()
|
||||
LAssailant = user
|
||||
|
||||
playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='warning'>[user] has grabbed [src] passively!</span>")
|
||||
|
||||
|
||||
/mob/living/attack_slime(mob/living/carbon/slime/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if(M.Victim)
|
||||
return // can't attack while eating!
|
||||
|
||||
if (stat != DEAD)
|
||||
M.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>The [M.name] glomps [src]!</span>", \
|
||||
"<span class='userdanger'>The [M.name] glomps [src]!</span>")
|
||||
|
||||
if(M.powerlevel > 0)
|
||||
var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10
|
||||
if(prob(stunprob))
|
||||
M.powerlevel -= 3
|
||||
if(M.powerlevel < 0)
|
||||
M.powerlevel = 0
|
||||
|
||||
visible_message("<span class='danger'>The [M.name] has shocked [src]!</span>", \
|
||||
"<span class='userdanger'>The [M.name] has shocked [src]!</span>")
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
return 1
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
return
|
||||
|
||||
/mob/living/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.emote("me", 1, "[M.friendly] [src]")
|
||||
return 0
|
||||
else
|
||||
if(M.attack_sound)
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
M.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>\The [M] [M.attacktext] [src]!</span>", \
|
||||
"<span class='userdanger'>\The [M] [M.attacktext] [src]!</span>")
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/attack_paw(mob/living/carbon/monkey/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return 0
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return 0
|
||||
|
||||
if (M.a_intent == "harm" && !M.is_muzzled())
|
||||
M.do_attack_animation(src)
|
||||
if (prob(75))
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M.name] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] bites [src]!</span>")
|
||||
return 1
|
||||
else
|
||||
visible_message("<span class='danger'>[M.name] has attempted to bite [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] has attempted to bite [src]!</span>")
|
||||
return 0
|
||||
|
||||
/mob/living/attack_larva(mob/living/carbon/alien/larva/L as mob)
|
||||
|
||||
switch(L.a_intent)
|
||||
if("help")
|
||||
visible_message("<span class='notice'>[L.name] rubs its head against [src].</span>")
|
||||
return 0
|
||||
|
||||
else
|
||||
L.do_attack_animation(src)
|
||||
if(prob(90))
|
||||
add_logs(L, src, "attacked", admin=0)
|
||||
visible_message("<span class='danger'>[L.name] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[L.name] bites [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
return 1
|
||||
else
|
||||
visible_message("<span class='danger'>[L.name] has attempted to bite [src]!</span>", \
|
||||
"<span class='userdanger'>[L.name] has attempted to bite [src]!</span>")
|
||||
return 0
|
||||
|
||||
/mob/living/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return 0
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return 0
|
||||
|
||||
switch(M.a_intent)
|
||||
if ("help")
|
||||
visible_message("<span class='notice'>[M] caresses [src] with its scythe like arm.</span>")
|
||||
return 0
|
||||
|
||||
if ("grab")
|
||||
grabbedby(M)
|
||||
return 0
|
||||
else
|
||||
M.do_attack_animation(src)
|
||||
return 1
|
||||
|
||||
@@ -364,7 +364,7 @@ var/list/ai_list = list()
|
||||
return
|
||||
|
||||
if (href_list["callbot"]) //Command a bot to move to a selected location.
|
||||
Bot = locate(href_list["callbot"]) in machines
|
||||
Bot = locate(href_list["callbot"]) in aibots
|
||||
if(!Bot || Bot.remote_disabled || src.control_disabled)
|
||||
return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off.
|
||||
waypoint_mode = 1
|
||||
@@ -372,7 +372,7 @@ var/list/ai_list = list()
|
||||
return
|
||||
|
||||
if (href_list["interface"]) //Remotely connect to a bot!
|
||||
Bot = locate(href_list["interface"]) in machines
|
||||
Bot = locate(href_list["interface"]) in aibots
|
||||
if(!Bot || Bot.remote_disabled || src.control_disabled)
|
||||
return
|
||||
Bot.attack_ai(src)
|
||||
@@ -387,7 +387,7 @@ var/list/ai_list = list()
|
||||
if(A && target)
|
||||
|
||||
A.cameraFollow = target
|
||||
A << text("Now tracking [] on camera.", target.name)
|
||||
A << "Now tracking [target.name] on camera."
|
||||
if (usr.machine == null)
|
||||
usr.machine = usr
|
||||
|
||||
@@ -410,47 +410,9 @@ var/list/ai_list = list()
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if ("help")
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<span class='notice'>[M] caresses [src]'s plating with its scythe like arm.</span>"), 1)
|
||||
|
||||
else //harm
|
||||
var/damage = rand(10, 20)
|
||||
if (prob(90))
|
||||
playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<span class='userdanger'>[] has slashed at []!</span>", M, src), 1)
|
||||
if(prob(8))
|
||||
flick("noise", flash)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<span class='userdanger'>[] took a swipe at []!</span>", M, src), 1)
|
||||
..()
|
||||
return
|
||||
|
||||
/mob/living/silicon/ai/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.emote("[M.friendly] [src]")
|
||||
else
|
||||
if(M.attack_sound)
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
visible_message("<span class='danger'><B>[M]</B> [M.attacktext] [src]!")
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
/mob/living/silicon/ai/reset_view(atom/A)
|
||||
if (camera_light_on)
|
||||
light_cameras()
|
||||
@@ -493,7 +455,7 @@ var/list/ai_list = list()
|
||||
d += "<A HREF=?src=\ref[src];botrefresh=\ref[Bot]>Query network status</A><br>"
|
||||
d += "<table width='100%'><tr><td width='40%'><h3>Name</h3></td><td width='30%'><h3>Status</h3></td><td width='30%'><h3>Location</h3></td><td width='10%'><h3>Control</h3></td></tr>"
|
||||
|
||||
for (Bot in machines)
|
||||
for (Bot in aibots)
|
||||
if(Bot.z == ai_Zlevel && !Bot.remote_disabled) //Only non-emagged bots on the same Z-level are detected!
|
||||
bot_area = get_area(Bot)
|
||||
d += "<tr><td width='30%'>[Bot.hacked ? "<span class='bad'>(!) </span>[Bot.name]" : Bot.name]</td>"
|
||||
@@ -762,6 +724,13 @@ var/list/ai_list = list()
|
||||
src << "Accessing Subspace Transceiver control..."
|
||||
if (radio)
|
||||
radio.interact(src)
|
||||
|
||||
/mob/living/silicon/ai/proc/set_syndie_radio()
|
||||
if(radio)
|
||||
radio.make_syndie()
|
||||
radio.make_syndie()
|
||||
/mob/living/silicon/ai/attack_slime(mob/living/carbon/slime/user)
|
||||
return
|
||||
|
||||
/mob/living/silicon/ai/grabbedby(mob/living/user)
|
||||
return
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
/mob/living/silicon/pai
|
||||
name = "pAI"
|
||||
icon = 'icons/obj/status_display.dmi' //invisibility!
|
||||
mouse_opacity
|
||||
mouse_opacity = 0
|
||||
density = 0
|
||||
mob_size = 0
|
||||
invisibility = 101
|
||||
|
||||
var/network = "SS13"
|
||||
var/obj/machinery/camera/current = null
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
/mob/living/silicon/pai/var/list/available_software = list(
|
||||
"crew manifest" = 5,
|
||||
"digital messenger" = 5,
|
||||
"chatroom client" = 5,
|
||||
"medical records" = 15,
|
||||
"security records" = 15,
|
||||
//"camera jack" = 10,
|
||||
@@ -66,6 +67,8 @@
|
||||
left_part = src.softwareCamera()
|
||||
if("signaller")
|
||||
left_part = src.softwareSignal()
|
||||
if("chatroom")
|
||||
src.chatroom() //snowflake? maybe, but it's less effort this way
|
||||
|
||||
//usr << browse_rsc('windowbak.png') // This has been moved to the mob's Login() proc
|
||||
|
||||
@@ -276,6 +279,8 @@
|
||||
for(var/s in src.software)
|
||||
if(s == "digital messenger")
|
||||
dat += "<a href='byond://?src=\ref[src];software=pdamessage;sub=0'>Digital Messenger</a> <br>"
|
||||
if(s == "chatroom client")
|
||||
dat += "<a href='byond://?src=\ref[src];software=chatroom;sub=0'>Chatroom Client</a> <br>"
|
||||
if(s == "crew manifest")
|
||||
dat += "<a href='byond://?src=\ref[src];software=manifest;sub=0'>Crew Manifest</a> <br>"
|
||||
if(s == "medical records")
|
||||
@@ -503,9 +508,9 @@
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
dat += {"<h4>Infection Detected.</h4><br>
|
||||
Name: [D.name]<br>
|
||||
Type: [D.spread]<br>
|
||||
Type: [D.spread_text]<br>
|
||||
Stage: [D.stage]/[D.max_stages]<br>
|
||||
Possible Cure: [D.cure]<br>
|
||||
Possible Cure: [D.cure_text]<br>
|
||||
"}
|
||||
dat += "<a href='byond://?src=\ref[src];software=medicalhud;sub=0'>Visual Status Overlay</a><br>"
|
||||
return dat
|
||||
@@ -631,4 +636,9 @@
|
||||
dat += "</ul>"
|
||||
dat += "<br><br>"
|
||||
dat += "Messages: <hr> [pda.tnote]"
|
||||
return dat
|
||||
return dat
|
||||
|
||||
/mob/living/silicon/pai/proc/chatroom()
|
||||
|
||||
pda.mode = 5
|
||||
pda.attack_self()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/silicon/robot/emote(var/act,var/m_type=1,var/message = null)
|
||||
/mob/living/silicon/emote(var/act,var/m_type=1,var/message = null)
|
||||
var/param = null
|
||||
if (findtext(act, "-", 1, null))
|
||||
var/t1 = findtext(act, "-", 1, null)
|
||||
@@ -201,6 +201,7 @@
|
||||
src << "<span class='notice'>Unusable emote '[act]'. Say *help for a list.</span>"
|
||||
|
||||
if ((message && src.stat == 0))
|
||||
log_emote("[name]/[key] : [message]")
|
||||
if (m_type & 1)
|
||||
visible_message(message)
|
||||
else
|
||||
|
||||
@@ -153,7 +153,8 @@
|
||||
src.see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
else if (src.sight_mode & BORGMESON)
|
||||
src.sight |= SEE_TURFS
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
src.see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
src.see_in_dark = 1
|
||||
else if (src.sight_mode & BORGTHERM)
|
||||
src.sight |= SEE_MOBS
|
||||
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
|
||||
@@ -479,6 +479,23 @@
|
||||
user.visible_message("<span class='danger'>[user] deconstructs [src]!</span>", "<span class='notice'>You unfasten the securing bolts, and [src] falls to pieces!</span>")
|
||||
deconstruct()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/aiModule))
|
||||
var/obj/item/weapon/aiModule/MOD = W
|
||||
if(!opened)
|
||||
user << "You need access to the robot's insides to do that."
|
||||
return
|
||||
if(wiresexposed)
|
||||
user << "You need to close the wire panel to do that."
|
||||
return
|
||||
if(!cell)
|
||||
user << "You need to install a power cell to do that."
|
||||
return
|
||||
if(emagged || (connected_ai && lawupdate)) //Can't be sure which, metagamers
|
||||
emote("buzz-[user.name]")
|
||||
return
|
||||
MOD.install(src, user) //Proc includes a success mesage so we don't need another one
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/device/encryptionkey/) && opened)
|
||||
if(radio)//sanityyyyyy
|
||||
radio.attackby(W,user)//GTFO, you have your own procs
|
||||
@@ -522,6 +539,7 @@
|
||||
sleep(6)
|
||||
if(prob(50))
|
||||
SetEmagged(1)
|
||||
SetLockdown(1) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown
|
||||
lawupdate = 0
|
||||
connected_ai = null
|
||||
user << "You emag [src]'s interface."
|
||||
@@ -549,6 +567,7 @@
|
||||
src << "<b>Obey these laws:</b>"
|
||||
laws.show_laws(src)
|
||||
src << "<span class='danger'>ALERT: [user.real_name] is your new master. Obey your new laws and their commands.</span>"
|
||||
SetLockdown(0)
|
||||
updateicon()
|
||||
else
|
||||
user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface."
|
||||
@@ -598,149 +617,49 @@
|
||||
usr << "You unlock your cover."
|
||||
|
||||
/mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if ("help")
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<span class='notice'>[M] caresses [src]'s plating with its scythe like arm.</span>"), 1)
|
||||
|
||||
if ("grab")
|
||||
if (M == src || anchored)
|
||||
return
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
|
||||
|
||||
M.put_in_active_hand(G)
|
||||
|
||||
G.synch()
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<span class='danger'>[] has grabbed [] passively!</span>", M, src), 1)
|
||||
|
||||
if ("harm")
|
||||
var/damage = rand(10, 20)
|
||||
if (prob(90))
|
||||
/*
|
||||
if (M.class == "combat")
|
||||
damage += 15
|
||||
if(prob(20))
|
||||
weakened = max(weakened,4)
|
||||
stunned = max(stunned,4)
|
||||
What is this?*/
|
||||
|
||||
playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("<span class='userdanger'>[] has slashed at []!</span>", M, src), 1)
|
||||
if(prob(8))
|
||||
flick("noise", flash)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
if (M.a_intent =="disarm")
|
||||
if(!(lying))
|
||||
M.do_attack_animation(src)
|
||||
if (prob(85))
|
||||
Stun(7)
|
||||
step(src,get_dir(M,src))
|
||||
spawn(5)
|
||||
step(src,get_dir(M,src))
|
||||
add_logs(M, src, "pushed", admin=0)
|
||||
playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has forced back [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has forced back [src]!</span>")
|
||||
else
|
||||
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<span class='userdanger'>[] took a swipe at []!</span>", M, src), 1)
|
||||
|
||||
if ("disarm")
|
||||
if(!(lying))
|
||||
if (rand(1,100) <= 85)
|
||||
Stun(7)
|
||||
step(src,get_dir(M,src))
|
||||
spawn(5) step(src,get_dir(M,src))
|
||||
playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<span class='userdanger'>[] has forced back []!</span>", M, src), 1)
|
||||
else
|
||||
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<span class='userdanger'>[] attempted to force back []!</span>", M, src), 1)
|
||||
visible_message("<span class='danger'>[M] took a swipe at [src]!</span>", \
|
||||
"<span class='userdanger'>[M] took a swipe at [src]!</span>")
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
|
||||
/mob/living/silicon/robot/attack_slime(mob/living/carbon/slime/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
if(..()) //successful slime shock
|
||||
flick("noise", flash)
|
||||
var/stunprob = M.powerlevel * 7 + 10
|
||||
if(prob(stunprob) && M.powerlevel >= 8)
|
||||
adjustBruteLoss(M.powerlevel * rand(6,10))
|
||||
|
||||
if(M.Victim) return // can't attack while eating!
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if (health > -100)
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<span class='userdanger'>The [M.name] glomps []!</span>", src), 1)
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(M.is_adult)
|
||||
damage = rand(20, 40)
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
|
||||
damage = round(damage / 2) // borgs recieve half damage
|
||||
adjustBruteLoss(damage)
|
||||
|
||||
|
||||
if(M.powerlevel > 0)
|
||||
var/stunprob = 10
|
||||
|
||||
switch(M.powerlevel)
|
||||
if(1 to 2) stunprob = 20
|
||||
if(3 to 4) stunprob = 30
|
||||
if(5 to 6) stunprob = 40
|
||||
if(7 to 8) stunprob = 60
|
||||
if(9) stunprob = 70
|
||||
if(10) stunprob = 95
|
||||
|
||||
if(prob(stunprob))
|
||||
M.powerlevel -= 3
|
||||
if(M.powerlevel < 0)
|
||||
M.powerlevel = 0
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<span class='userdanger'>The [M.name] has electrified []!</span>", src), 1)
|
||||
|
||||
flick("noise", flash)
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
|
||||
if (prob(stunprob) && M.powerlevel >= 8)
|
||||
adjustBruteLoss(M.powerlevel * rand(6,10))
|
||||
|
||||
|
||||
updatehealth()
|
||||
if(M.is_adult)
|
||||
damage = rand(20, 40)
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
damage = round(damage / 2) // borgs recieve half damage
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
return
|
||||
|
||||
/mob/living/silicon/robot/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.emote("[M.friendly] [src]")
|
||||
else
|
||||
if(M.attack_sound)
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
visible_message("<span class='danger'><B>[M]</B> [M.attacktext] [src]!</span>")
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
|
||||
/mob/living/silicon/robot/attack_hand(mob/user)
|
||||
/mob/living/silicon/robot/attack_hand(mob/living/carbon/human/user)
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
@@ -753,14 +672,14 @@
|
||||
cell = null
|
||||
updateicon()
|
||||
|
||||
if(!opened && (!istype(user, /mob/living/silicon)))
|
||||
if (user.a_intent == "help")
|
||||
user.visible_message("<span class='notice'>[user] pets [src]!</span>", \
|
||||
"<span class='notice'>You pet [src]!</span>")
|
||||
if(!opened)
|
||||
if(..()) // hulk attack
|
||||
spark_system.start()
|
||||
spawn(0)
|
||||
step_away(src,user,15)
|
||||
sleep(3)
|
||||
step_away(src,user,15)
|
||||
|
||||
/mob/living/silicon/robot/attack_paw(mob/user)
|
||||
|
||||
return attack_hand(user)
|
||||
|
||||
/mob/living/silicon/robot/proc/allowed(mob/M)
|
||||
//check if it doesn't require any access at all
|
||||
|
||||
@@ -161,6 +161,7 @@
|
||||
modules += new /obj/item/weapon/storage/bag/trash/cyborg(src)
|
||||
modules += new /obj/item/weapon/mop/cyborg(src)
|
||||
modules += new /obj/item/device/lightreplacer/cyborg(src)
|
||||
modules += new /obj/item/weapon/holosign_creator(src)
|
||||
emag = new /obj/item/weapon/reagent_containers/spray(src)
|
||||
|
||||
emag.reagents.add_reagent("lube", 250)
|
||||
|
||||
@@ -329,4 +329,61 @@
|
||||
src << "<span class='notice'>Life signs monitor overlay enabled.</span>"
|
||||
if ("Disable")
|
||||
sensor_mode = 0
|
||||
src << "Sensor augmentations disabled."
|
||||
src << "Sensor augmentations disabled."
|
||||
|
||||
|
||||
/mob/living/silicon/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if(..()) //if harm or disarm intent
|
||||
var/damage = rand(10, 20)
|
||||
if (prob(90))
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has slashed at [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has slashed at [src]!</span>")
|
||||
if(prob(8))
|
||||
flick("noise", flash)
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] took a swipe at [src]!</span>", \
|
||||
"<span class='userdanger'>[M] took a swipe at [src]!</span>")
|
||||
return
|
||||
|
||||
/mob/living/silicon/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(..())
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
/mob/living/silicon/attack_paw(mob/living/user)
|
||||
return attack_hand(user)
|
||||
|
||||
/mob/living/silicon/attack_larva(mob/living/carbon/alien/larva/L)
|
||||
if(L.a_intent == "help")
|
||||
visible_message("<span class='notice'>[L.name] rubs its head against [src].</span>")
|
||||
return
|
||||
|
||||
/mob/living/silicon/attack_hand(mob/living/carbon/human/M)
|
||||
switch(M.a_intent)
|
||||
if ("help")
|
||||
M.visible_message("<span class='notice'>[M] pets [src]!</span>", \
|
||||
"<span class='notice'>You pet [src]!</span>")
|
||||
if("grab")
|
||||
grabbedby(M)
|
||||
else
|
||||
M.do_attack_animation(src)
|
||||
playsound(src.loc, 'sound/effects/bang.ogg', 10, 1)
|
||||
if (HULK in M.mutations)
|
||||
var/damage = rand(10,15)
|
||||
adjustBruteLoss(damage)
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has punched [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has punched [src]!</span>")
|
||||
return 1
|
||||
else
|
||||
visible_message("<span class='danger'>[M] punches [src], but doesn't leave a dent.</span>", \
|
||||
"<span class='userdanger'>[M] punches [src], but doesn't leave a dent.!</span>")
|
||||
return 0
|
||||
|
||||
@@ -89,16 +89,7 @@
|
||||
health += 5
|
||||
M.emote("me", 1, "mends some of \the <EM>[src]'s</EM> wounds.")
|
||||
else if(src != M)
|
||||
if(M.melee_damage_upper <= 0)
|
||||
M.emote("me", 1, "[M.friendly] \the <EM>[src]</EM>.")
|
||||
else
|
||||
if(M.attack_sound)
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
visible_message("<span class='danger'>\The <EM>[M]</EM> [M.attacktext] \the <EM>[src]</EM>!</span>", \
|
||||
"<span class='userdanger'>\The <EM>[M]</EM> [M.attacktext] \the <EM>[src]</EM>!</span>")
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/construct/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(!Proj)
|
||||
|
||||
@@ -261,7 +261,8 @@
|
||||
//Humans, monkeys, aliens
|
||||
/mob/living/simple_animal/parrot/attack_hand(mob/living/carbon/M as mob)
|
||||
..()
|
||||
if(client) return
|
||||
if(client)
|
||||
return
|
||||
if(!stat && M.a_intent == "harm")
|
||||
|
||||
icon_state = "parrot_fly" //It is going to be flying regardless of whether it flees or attacks
|
||||
@@ -282,15 +283,15 @@
|
||||
/mob/living/simple_animal/parrot/attack_paw(mob/living/carbon/monkey/M as mob)
|
||||
attack_hand(M)
|
||||
|
||||
/mob/living/simple_animal/parrot/attack_alien(mob/living/carbon/monkey/M as mob)
|
||||
/mob/living/simple_animal/parrot/attack_alien(mob/living/carbon/alien/M as mob)
|
||||
attack_hand(M)
|
||||
|
||||
//Simple animals
|
||||
/mob/living/simple_animal/parrot/attack_animal(mob/living/simple_animal/M as mob)
|
||||
..() //goodbye immortal parrots
|
||||
|
||||
if(client) return
|
||||
|
||||
if(client)
|
||||
return
|
||||
|
||||
if(parrot_state == PARROT_PERCH)
|
||||
parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched
|
||||
|
||||
@@ -254,16 +254,9 @@
|
||||
..(act, m_type, message)
|
||||
|
||||
/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.emote("me", 1, "[M.friendly] [src]")
|
||||
else
|
||||
if(M.attack_sound)
|
||||
playsound(loc, M.attack_sound, 50, 1, 1)
|
||||
visible_message("<span class='danger'>\The [M] [M.attacktext] [src]!</span>", \
|
||||
"<span class='userdanger'>\The [M] [M.attacktext] [src]!</span>")
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
if(..())
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
attack_threshold_check(damage)
|
||||
|
||||
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(!Proj)
|
||||
@@ -274,139 +267,78 @@
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/attack_hand(mob/living/carbon/human/M as mob)
|
||||
..()
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if("help")
|
||||
if (health > 0)
|
||||
visible_message("<span class='notice'> [M] [response_help] [src].</span>")
|
||||
visible_message("<span class='notice'>[M] [response_help] [src].</span>")
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
|
||||
if("grab")
|
||||
if (M == src || anchored)
|
||||
return
|
||||
if (!(status_flags & CANPUSH))
|
||||
return
|
||||
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
|
||||
|
||||
M.put_in_active_hand(G)
|
||||
|
||||
G.synch()
|
||||
|
||||
LAssailant = M
|
||||
|
||||
visible_message("<span class='warning'>[M] has grabbed [src] passively!</span>")
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
grabbedby(M)
|
||||
|
||||
if("harm", "disarm")
|
||||
M.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[M] [response_harm] [src]!</span>")
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
adjustBruteLoss(harm_intent_damage)
|
||||
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/attack_paw(mob/living/carbon/monkey/M as mob)
|
||||
if(!(istype(M, /mob/living/carbon/monkey)))
|
||||
return // Fix for aliens receiving double messages when attacking simple animals.
|
||||
if(..()) //successful monkey bite.
|
||||
if(stat != DEAD)
|
||||
var/damage = rand(1, 3)
|
||||
attack_threshold_check(damage)
|
||||
if (M.a_intent == "help")
|
||||
if (health > 0)
|
||||
visible_message("<span class='notice'>[M.name] [response_help] [src].</span>")
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
|
||||
..()
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if ("help")
|
||||
if (health > 0)
|
||||
visible_message("<span class='notice'> [M] [response_help] [src].</span>")
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
else
|
||||
if (M.is_muzzled())
|
||||
return
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M.name] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] bites [src]!</span>")
|
||||
if (health > -100)
|
||||
adjustBruteLoss(rand(1, 3))
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if ("help")
|
||||
|
||||
visible_message("<span class='notice'>[M] caresses [src] with its scythe like arm.</span>")
|
||||
if ("grab")
|
||||
if(M == src || anchored)
|
||||
return
|
||||
if(!(status_flags & CANPUSH))
|
||||
return
|
||||
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
|
||||
|
||||
M.put_in_active_hand(G)
|
||||
|
||||
G.synch()
|
||||
LAssailant = M
|
||||
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='warning'>[M] has grabbed [src] passively!</span>")
|
||||
|
||||
if("harm", "disarm")
|
||||
var/damage = rand(15, 30)
|
||||
visible_message("<span class='danger'>[M] has slashed at [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has slashed at [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
|
||||
adjustBruteLoss(damage)
|
||||
|
||||
if(..()) //if harm or disarm intent.
|
||||
var/damage = rand(15, 30)
|
||||
visible_message("<span class='danger'>[M] has slashed at [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has slashed at [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
attack_threshold_check(damage)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L as mob)
|
||||
|
||||
switch(L.a_intent)
|
||||
if("help")
|
||||
visible_message("<span class='notice'>[L] rubs its head against [src].</span>")
|
||||
|
||||
|
||||
else
|
||||
|
||||
var/damage = rand(5, 10)
|
||||
visible_message("<span class='danger'>[L] bites [src]!</span>", \
|
||||
"<span class='userdanger'>[L] bites [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
|
||||
|
||||
if(stat != DEAD)
|
||||
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
|
||||
adjustBruteLoss(damage)
|
||||
|
||||
if(..()) //successful larva bite
|
||||
var/damage = rand(5, 10)
|
||||
if(stat != DEAD)
|
||||
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
|
||||
attack_threshold_check(damage)
|
||||
|
||||
/mob/living/simple_animal/attack_slime(mob/living/carbon/slime/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if(M.Victim) return // can't attack while eating!
|
||||
|
||||
if (health > 0)
|
||||
visible_message("<span class='danger'>[M.name] glomps [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] glomps [src]!</span>")
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(M.is_adult)
|
||||
damage = rand(20, 40)
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
|
||||
adjustBruteLoss(damage)
|
||||
|
||||
..()
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(M.is_adult)
|
||||
damage = rand(20, 40)
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
attack_threshold_check(damage)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/proc/attack_threshold_check(var/damage)
|
||||
if(damage <= force_threshold)
|
||||
visible_message("<span class='warning'>[src] looks unharmed.</span>")
|
||||
else
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
|
||||
/mob/living/simple_animal/attackby(var/obj/item/O as obj, var/mob/living/user as mob) //Marker -Agouri
|
||||
if(O.flags & NOBLUDGEON)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
|
||||
if(istype(O, /obj/item/stack/medical))
|
||||
|
||||
if(stat != DEAD)
|
||||
var/obj/item/stack/medical/MED = O
|
||||
if(health < maxHealth)
|
||||
@@ -432,6 +364,7 @@
|
||||
harvest()
|
||||
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
var/damage = 0
|
||||
if(O.force)
|
||||
if(O.force >= force_threshold)
|
||||
|
||||
+44
-52
@@ -79,6 +79,8 @@ var/next_mob_id = 0
|
||||
|
||||
/mob/visible_message(var/message, var/self_message, var/blind_message)
|
||||
for(var/mob/M in viewers(src))
|
||||
if(M.see_invisible < invisibility)
|
||||
continue //can't view the invisible
|
||||
var/msg = message
|
||||
if(self_message && M==src)
|
||||
msg = self_message
|
||||
@@ -92,10 +94,6 @@ var/next_mob_id = 0
|
||||
for(var/mob/M in viewers(src))
|
||||
M.show_message( message, 1, blind_message, 2)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Show a message to all mobs in earshot of this one
|
||||
// This would be for audible actions by the src mob
|
||||
// message is the message output to anyone who can hear.
|
||||
@@ -126,9 +124,6 @@ var/next_mob_id = 0
|
||||
for(var/mob/M in get_hearers_in_view(range, src))
|
||||
M.show_message( message, 2, deaf_message, 1)
|
||||
|
||||
|
||||
|
||||
|
||||
/mob/proc/movement_delay()
|
||||
return 0
|
||||
|
||||
@@ -299,32 +294,61 @@ var/list/slot_equipment_priority = list( \
|
||||
A.examine(src)
|
||||
|
||||
//same as above
|
||||
//note: ghosts can point, this is intended
|
||||
//visible_message will handle invisibility properly
|
||||
//overriden here and in /mob/dead/observer for different point span classes and sanity checks
|
||||
/mob/verb/pointed(atom/A as mob|obj|turf in view())
|
||||
set name = "Point To"
|
||||
set category = "Object"
|
||||
|
||||
if(!src || !isturf(src.loc))
|
||||
return
|
||||
if(usr.stat || !usr.canmove || usr.restrained())
|
||||
return
|
||||
if(src.status_flags & FAKEDEATH)
|
||||
return
|
||||
if(!(A in view(src.loc)))
|
||||
return
|
||||
if(!src || !isturf(src.loc) || !(A in view(src.loc)))
|
||||
return 0
|
||||
if(istype(A, /obj/effect/decal/point))
|
||||
return
|
||||
return 0
|
||||
|
||||
var/tile = get_turf(A)
|
||||
if (!tile)
|
||||
return
|
||||
return 0
|
||||
|
||||
var/obj/P = new /obj/effect/decal/point(tile)
|
||||
P.invisibility = invisibility
|
||||
spawn (20)
|
||||
if(P)
|
||||
P.loc = null
|
||||
qdel(P)
|
||||
|
||||
usr.visible_message("<b>[src]</b> points to [A]")
|
||||
return 1
|
||||
|
||||
//this and stop_pulling really ought to be /mob/living procs
|
||||
/mob/proc/start_pulling(var/atom/movable/AM)
|
||||
if ( !AM || !src || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort!
|
||||
return
|
||||
if (!( AM.anchored ))
|
||||
AM.add_fingerprint(src)
|
||||
|
||||
// If we're pulling something then drop what we're currently pulling and pull this instead.
|
||||
if(pulling)
|
||||
// Are we trying to pull something we are already pulling? Then just stop here, no need to continue.
|
||||
if(AM == pulling)
|
||||
return
|
||||
stop_pulling()
|
||||
|
||||
src.pulling = AM
|
||||
AM.pulledby = src
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(!iscarbon(src))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = usr
|
||||
|
||||
/mob/verb/stop_pulling()
|
||||
|
||||
set name = "Stop Pulling"
|
||||
set category = "IC"
|
||||
|
||||
if(pulling)
|
||||
pulling.pulledby = null
|
||||
pulling = null
|
||||
|
||||
/mob/verb/mode()
|
||||
set name = "Activate Held Object"
|
||||
@@ -595,39 +619,6 @@ var/list/slot_equipment_priority = list( \
|
||||
if(istype(M, /mob/living/silicon/ai)) return
|
||||
show_inv(usr)
|
||||
|
||||
|
||||
/mob/verb/stop_pulling()
|
||||
|
||||
set name = "Stop Pulling"
|
||||
set category = "IC"
|
||||
|
||||
if(pulling)
|
||||
pulling.pulledby = null
|
||||
pulling = null
|
||||
|
||||
/mob/proc/start_pulling(var/atom/movable/AM)
|
||||
if ( !AM || !usr || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort!
|
||||
return
|
||||
if (!( AM.anchored ))
|
||||
AM.add_fingerprint(src)
|
||||
|
||||
// If we're pulling something then drop what we're currently pulling and pull this instead.
|
||||
if(pulling)
|
||||
// Are we trying to pull something we are already pulling? Then just stop here, no need to continue.
|
||||
if(AM == pulling)
|
||||
return
|
||||
stop_pulling()
|
||||
|
||||
src.pulling = AM
|
||||
AM.pulledby = src
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(!iscarbon(src))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = usr
|
||||
|
||||
|
||||
/mob/proc/can_use_hands()
|
||||
return
|
||||
|
||||
@@ -666,6 +657,7 @@ var/list/slot_equipment_priority = list( \
|
||||
stat(null,"Mob-[master_controller.mobs_cost]\t#[mob_list.len]")
|
||||
stat(null,"Dis-[master_controller.diseases_cost]\t#[active_diseases.len]")
|
||||
stat(null,"Mch-[master_controller.machines_cost]\t#[machines.len]")
|
||||
stat(null,"Bots-[master_controller.aibots_cost]\t#[aibots.len]")
|
||||
stat(null,"Obj-[master_controller.objects_cost]\t#[processing_objects.len]")
|
||||
stat(null,"Net-[master_controller.networks_cost]\tPnet-[master_controller.powernets_cost]")
|
||||
stat(null,"NanoUI-[master_controller.nano_cost]\t#[nanomanager.processing_uis.len]")
|
||||
|
||||
@@ -3,174 +3,3 @@
|
||||
Put (mob/proc)s here that are in dire need of a code cleanup.
|
||||
*/
|
||||
|
||||
/mob/proc/has_disease(var/datum/disease/virus)
|
||||
for(var/datum/disease/D in viruses)
|
||||
if(D.IsSame(virus))
|
||||
//error("[D.name]/[D.type] is the same as [virus.name]/[virus.type]")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0, var/force_species_check=1, var/spread_type = -5)
|
||||
//world << "Contract_disease called by [src] with virus [virus]"
|
||||
if(stat >=2)
|
||||
//world << "He's dead jim."
|
||||
return
|
||||
if(istype(virus, /datum/disease/advance))
|
||||
//world << "It's an advance virus."
|
||||
var/datum/disease/advance/A = virus
|
||||
if(A.GetDiseaseID() in resistances)
|
||||
//world << "It resisted us!"
|
||||
return
|
||||
if(count_by_type(viruses, /datum/disease/advance) >= 3)
|
||||
return
|
||||
|
||||
else
|
||||
if(src.resistances.Find(virus.type))
|
||||
//world << "Normal virus and resisted"
|
||||
return
|
||||
|
||||
|
||||
if(has_disease(virus))
|
||||
return
|
||||
|
||||
|
||||
if(force_species_check)
|
||||
var/fail = 1
|
||||
for(var/name in virus.affected_species)
|
||||
var/mob_type = text2path("/mob/living/carbon/[lowertext(name)]")
|
||||
if(mob_type && istype(src, mob_type))
|
||||
fail = 0
|
||||
break
|
||||
if(fail) return
|
||||
|
||||
if(skip_this == 1)
|
||||
//world << "infectin"
|
||||
//if(src.virus) < -- this used to replace the current disease. Not anymore!
|
||||
//src.virus.cure(0)
|
||||
var/datum/disease/v = new virus.type(1, virus, 0)
|
||||
src.viruses += v
|
||||
v.affected_mob = src
|
||||
v.strain_data = virus.strain_data.Copy()
|
||||
v.holder = src
|
||||
if(v.can_carry && prob(5))
|
||||
v.carrier = 1
|
||||
return
|
||||
//world << "Not skipping."
|
||||
//if(src.virus) //
|
||||
//return //
|
||||
|
||||
|
||||
/*
|
||||
var/list/clothing_areas = list()
|
||||
var/list/covers = list(CHEST,GROIN,LEGS,FEET,ARMS,HANDS)
|
||||
for(var/Covers in covers)
|
||||
clothing_areas[Covers] = list()
|
||||
|
||||
for(var/obj/item/clothing/Clothing in src)
|
||||
if(Clothing)
|
||||
for(var/Covers in covers)
|
||||
if(Clothing&Covers)
|
||||
clothing_areas[Covers] += Clothing
|
||||
|
||||
*/
|
||||
if(prob(15/virus.permeability_mod)) return //the power of immunity compels this disease! but then you forgot resistances
|
||||
//world << "past prob()"
|
||||
var/obj/item/clothing/Cl = null
|
||||
var/passed = 1
|
||||
|
||||
//chances to target this zone
|
||||
var/head_ch
|
||||
var/body_ch
|
||||
var/hands_ch
|
||||
var/feet_ch
|
||||
|
||||
if(spread_type == -5)
|
||||
spread_type = virus.spread_type
|
||||
|
||||
switch(spread_type)
|
||||
if(CONTACT_HANDS)
|
||||
head_ch = 0
|
||||
body_ch = 0
|
||||
hands_ch = 100
|
||||
feet_ch = 0
|
||||
if(CONTACT_FEET)
|
||||
head_ch = 0
|
||||
body_ch = 0
|
||||
hands_ch = 0
|
||||
feet_ch = 100
|
||||
else
|
||||
head_ch = 100
|
||||
body_ch = 100
|
||||
hands_ch = 25
|
||||
feet_ch = 25
|
||||
|
||||
|
||||
var/target_zone = pick(head_ch;1,body_ch;2,hands_ch;3,feet_ch;4)//1 - head, 2 - body, 3 - hands, 4- feet
|
||||
|
||||
if(istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
|
||||
switch(target_zone)
|
||||
if(1)
|
||||
if(isobj(H.head) && !istype(H.head, /obj/item/weapon/paper))
|
||||
Cl = H.head
|
||||
passed = prob((Cl.permeability_coefficient*100) - 1)
|
||||
if(passed && isobj(H.wear_mask))
|
||||
Cl = H.wear_mask
|
||||
passed = prob((Cl.permeability_coefficient*100) - 1)
|
||||
if(2)//arms and legs included
|
||||
if(isobj(H.wear_suit))
|
||||
Cl = H.wear_suit
|
||||
passed = prob((Cl.permeability_coefficient*100) - 1)
|
||||
if(passed && isobj(slot_w_uniform))
|
||||
Cl = slot_w_uniform
|
||||
passed = prob((Cl.permeability_coefficient*100) - 1)
|
||||
if(3)
|
||||
if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS)
|
||||
Cl = H.wear_suit
|
||||
passed = prob((Cl.permeability_coefficient*100) - 1)
|
||||
|
||||
if(passed && isobj(H.gloves))
|
||||
Cl = H.gloves
|
||||
passed = prob((Cl.permeability_coefficient*100) - 1)
|
||||
if(4)
|
||||
if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&FEET)
|
||||
Cl = H.wear_suit
|
||||
passed = prob((Cl.permeability_coefficient*100) - 1)
|
||||
|
||||
if(passed && isobj(H.shoes))
|
||||
Cl = H.shoes
|
||||
passed = prob((Cl.permeability_coefficient*100) - 1)
|
||||
else
|
||||
src << "Something strange's going on, something's wrong."
|
||||
|
||||
/*if("feet")
|
||||
if(H.shoes && istype(H.shoes, /obj/item/clothing/))
|
||||
Cl = H.shoes
|
||||
passed = prob(Cl.permeability_coefficient*100)
|
||||
//
|
||||
world << "Shoes pass [passed]"
|
||||
*/ //
|
||||
else if(istype(src, /mob/living/carbon/monkey))
|
||||
var/mob/living/carbon/monkey/M = src
|
||||
switch(target_zone)
|
||||
if(1)
|
||||
if(M.wear_mask && isobj(M.wear_mask))
|
||||
Cl = M.wear_mask
|
||||
passed = prob((Cl.permeability_coefficient*100) - 1)
|
||||
//world << "Mask pass [passed]"
|
||||
|
||||
if(!passed && spread_type == AIRBORNE && !internals)
|
||||
passed = (prob((50*virus.permeability_mod) - 1))
|
||||
|
||||
if(passed)
|
||||
//world << "Infection in the mob [src]. YAY"
|
||||
var/datum/disease/v = new virus.type(1, virus, 0)
|
||||
src.viruses += v
|
||||
v.affected_mob = src
|
||||
v.strain_data = virus.strain_data.Copy()
|
||||
v.holder = src
|
||||
if(v.can_carry && prob(5))
|
||||
v.carrier = 1
|
||||
return
|
||||
return
|
||||
|
||||
@@ -182,7 +182,7 @@ proc/isorgan(A)
|
||||
return 0
|
||||
|
||||
/proc/stars(n, pr)
|
||||
n = html_decode(n)
|
||||
n = strip_html_properly(n)
|
||||
if (pr == null)
|
||||
pr = 25
|
||||
if (pr <= 0)
|
||||
|
||||
@@ -120,6 +120,8 @@
|
||||
observer.loc = O.loc
|
||||
if(client.prefs.be_random_name)
|
||||
client.prefs.real_name = random_name(gender)
|
||||
if(client.prefs.be_random_body)
|
||||
client.prefs.random_character(gender)
|
||||
observer.real_name = client.prefs.real_name
|
||||
observer.name = observer.real_name
|
||||
observer.key = key
|
||||
|
||||
@@ -461,6 +461,18 @@
|
||||
name = "Mega Eyebrows"
|
||||
icon_state = "hair_megaeyebrows"
|
||||
|
||||
/datum/sprite_accessory/hair/highponytail
|
||||
name = "High Ponytail"
|
||||
icon_state = "hair_highponytail"
|
||||
|
||||
/datum/sprite_accessory/hair/longponytail
|
||||
name = "Long Ponytail"
|
||||
icon_state = "hair_longstraightponytail"
|
||||
|
||||
/datum/sprite_accessory/hair/sidepartlongalt
|
||||
name = "Long Side Part"
|
||||
icon_state = "hair_longsidepart"
|
||||
|
||||
/////////////////////////////
|
||||
// Facial Hair Definitions //
|
||||
/////////////////////////////
|
||||
|
||||
@@ -239,7 +239,7 @@
|
||||
|
||||
if(href_list["write"])
|
||||
var/id = href_list["write"]
|
||||
var/t = strip_html_simple(input("Enter what you want to write:", "Write", null, null) as message, MAX_MESSAGE_LEN)
|
||||
var/t = stripped_input("Enter what you want to write:", "Write")
|
||||
var/obj/item/i = usr.get_active_hand() //Check to see if he still got that darn pen, also check if he's using a crayon or pen.
|
||||
var/iscrayon = 0
|
||||
if(!istype(i, /obj/item/weapon/pen))
|
||||
|
||||
@@ -370,7 +370,7 @@
|
||||
|
||||
//attack with an item - open/close cover, insert cell, or (un)lock interface
|
||||
|
||||
/obj/machinery/power/apc/attackby(obj/item/W, mob/user)
|
||||
/obj/machinery/power/apc/attackby(obj/item/W, mob/living/user)
|
||||
|
||||
if (istype(user, /mob/living/silicon) && get_dist(src,user)>1)
|
||||
return src.attack_hand(user)
|
||||
@@ -599,6 +599,7 @@
|
||||
(istype(W, /obj/item/device/multitool) || \
|
||||
istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/assembly/signaler)))
|
||||
return src.attack_hand(user)
|
||||
user.do_attack_animation(src)
|
||||
user.visible_message("<span class='danger'>The [src.name] has been hit with the [W.name] by [user.name]!</span>", \
|
||||
"<span class='danger'>You hit the [src.name] with your [W.name]!</span>", \
|
||||
"You hear bang")
|
||||
@@ -632,6 +633,7 @@
|
||||
/obj/machinery/power/apc/attack_alien(mob/living/carbon/alien/humanoid/user)
|
||||
if(!user)
|
||||
return
|
||||
user.do_attack_animation(src)
|
||||
user.visible_message("<span class='danger'>[user.name] slashes at the [src.name]!</span>", "<span class='notice'>You slash at the [src.name]!</span>")
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
|
||||
|
||||
|
||||
+20
-28
@@ -34,6 +34,7 @@ By design, d1 is the smallest direction and d2 is the highest
|
||||
var/d2 = 1 // cable direction 2 (see above)
|
||||
layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4
|
||||
var/cable_color = "red"
|
||||
var/obj/item/stack/cable_coil/stored
|
||||
|
||||
/obj/structure/cable/yellow
|
||||
cable_color = "yellow"
|
||||
@@ -81,6 +82,9 @@ By design, d1 is the smallest direction and d2 is the highest
|
||||
if(level==1) hide(T.intact)
|
||||
cable_list += src //add it to the global cable list
|
||||
|
||||
if(d1)
|
||||
stored = new/obj/item/stack/cable_coil(src,2,cable_color)
|
||||
else stored = new/obj/item/stack/cable_coil(src,1,cable_color)
|
||||
|
||||
/obj/structure/cable/Destroy() // called when a cable is deleted
|
||||
if(powernet)
|
||||
@@ -88,6 +92,11 @@ By design, d1 is the smallest direction and d2 is the highest
|
||||
cable_list -= src //remove it from global cable list
|
||||
..() // then go ahead and delete the cable
|
||||
|
||||
/obj/structure/cable/Deconstruct()
|
||||
var/turf/T = loc
|
||||
stored.loc = T
|
||||
..()
|
||||
|
||||
///////////////////////////////////
|
||||
// General procedures
|
||||
///////////////////////////////////
|
||||
@@ -120,31 +129,18 @@ By design, d1 is the smallest direction and d2 is the highest
|
||||
// - Multitool : get the power currently passing through the cable
|
||||
//
|
||||
/obj/structure/cable/attackby(obj/item/W, mob/user)
|
||||
|
||||
var/turf/T = src.loc
|
||||
if(T.intact)
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/weapon/wirecutters))
|
||||
|
||||
if (shock(user, 50))
|
||||
return
|
||||
|
||||
var/obj/newcable
|
||||
if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long
|
||||
newcable = new/obj/item/stack/cable_coil(T, 2, cable_color)
|
||||
else
|
||||
newcable = new/obj/item/stack/cable_coil(T, 1, cable_color)
|
||||
|
||||
visible_message("<span class='warning'>[user] cuts the cable.</span>")
|
||||
|
||||
newcable.add_fingerprint(user)
|
||||
stored.add_fingerprint(user)
|
||||
investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires")
|
||||
|
||||
qdel(src)
|
||||
Deconstruct()
|
||||
return
|
||||
|
||||
|
||||
else if(istype(W, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/coil = W
|
||||
if (coil.get_amount() < 1)
|
||||
@@ -153,13 +149,10 @@ By design, d1 is the smallest direction and d2 is the highest
|
||||
coil.cable_join(src, user)
|
||||
|
||||
else if(istype(W, /obj/item/device/multitool))
|
||||
|
||||
if(powernet && (powernet.avail > 0)) // is it powered?
|
||||
user << "<span class='danger'>[powernet.avail]W in power network.</span>"
|
||||
|
||||
else
|
||||
user << "<span class='danger'>The cable is not powered.</span>"
|
||||
|
||||
shock(user, 5, 0.2)
|
||||
|
||||
else
|
||||
@@ -187,15 +180,17 @@ By design, d1 is the smallest direction and d2 is the highest
|
||||
qdel(src)
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, cable_color)
|
||||
qdel(src)
|
||||
Deconstruct()
|
||||
|
||||
if(3.0)
|
||||
if (prob(25))
|
||||
new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, cable_color)
|
||||
qdel(src)
|
||||
Deconstruct()
|
||||
return
|
||||
|
||||
/obj/structure/cable/singularity_pull(S, current_size)
|
||||
if(current_size >= STAGE_FIVE)
|
||||
Deconstruct()
|
||||
|
||||
obj/structure/cable/proc/cableColor(var/colorC)
|
||||
var/color_n = "red"
|
||||
if(colorC)
|
||||
@@ -677,8 +672,7 @@ obj/structure/cable/proc/avail()
|
||||
|
||||
if (C.shock(user, 50))
|
||||
if (prob(50)) //fail
|
||||
new/obj/item/stack/cable_coil(C.loc, 1, C.cable_color)
|
||||
qdel(C)
|
||||
C.Deconstruct()
|
||||
|
||||
// called when cable_coil is click on an installed obj/cable
|
||||
// or click on a turf that already contains a "node" cable
|
||||
@@ -741,8 +735,7 @@ obj/structure/cable/proc/avail()
|
||||
|
||||
if (NC.shock(user, 50))
|
||||
if (prob(50)) //fail
|
||||
new/obj/item/stack/cable_coil(NC.loc, 1, NC.cable_color)
|
||||
qdel(NC)
|
||||
NC.Deconstruct()
|
||||
|
||||
return
|
||||
|
||||
@@ -789,8 +782,7 @@ obj/structure/cable/proc/avail()
|
||||
|
||||
if (C.shock(user, 50))
|
||||
if (prob(50)) //fail
|
||||
new/obj/item/stack/cable_coil(C.loc, 2, C.cable_color)
|
||||
qdel(C)
|
||||
C.Deconstruct()
|
||||
return
|
||||
|
||||
C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the powernets.
|
||||
|
||||
@@ -328,7 +328,7 @@
|
||||
|
||||
// attack with item - insert light (if right type), otherwise try to break the light
|
||||
|
||||
/obj/machinery/light/attackby(obj/item/W, mob/user)
|
||||
/obj/machinery/light/attackby(obj/item/W, mob/living/user)
|
||||
|
||||
//Light replacer code
|
||||
if(istype(W, /obj/item/device/lightreplacer))
|
||||
@@ -369,7 +369,7 @@
|
||||
|
||||
else if(status != LIGHT_BROKEN && status != LIGHT_EMPTY)
|
||||
|
||||
|
||||
user.do_attack_animation(src)
|
||||
if(prob(1+W.force * 5))
|
||||
|
||||
user.visible_message("<span class='danger'>[user.name] smashed the light!</span>", \
|
||||
@@ -382,7 +382,7 @@
|
||||
broken()
|
||||
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user.name] hits the light.</span>")
|
||||
user.visible_message("<span class='danger'>[user.name] hits the light.</span>")
|
||||
|
||||
// attempt to stick weapon into light socket
|
||||
else if(status == LIGHT_EMPTY)
|
||||
@@ -449,6 +449,7 @@
|
||||
user << "\green That object is useless to you."
|
||||
return
|
||||
else if (status == LIGHT_OK||status == LIGHT_BURNED)
|
||||
user.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[user.name] smashed the light!</span>", "You hear a tinkle of breaking glass")
|
||||
broken()
|
||||
return
|
||||
@@ -459,6 +460,7 @@
|
||||
M << "<span class='danger'>That object is useless to you.</span>"
|
||||
return
|
||||
else if (status == LIGHT_OK||status == LIGHT_BURNED)
|
||||
M.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[M.name] smashed the light!</span>", "You hear a tinkle of breaking glass")
|
||||
broken()
|
||||
return
|
||||
|
||||
@@ -123,7 +123,6 @@ display round(lastgen) and plasmatank amount
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/RefreshParts()
|
||||
var/temp_rating = 0
|
||||
var/temp_reliability = 0
|
||||
var/consumption_coeff = 0
|
||||
for(var/obj/item/weapon/stock_parts/SP in component_parts)
|
||||
if(istype(SP, /obj/item/weapon/stock_parts/matter_bin))
|
||||
@@ -132,9 +131,6 @@ display round(lastgen) and plasmatank amount
|
||||
temp_rating += SP.rating
|
||||
else
|
||||
consumption_coeff += SP.rating
|
||||
for(var/obj/item/weapon/CP in component_parts)
|
||||
temp_reliability += CP.reliability
|
||||
reliability = min(round(temp_reliability / 4), 100)
|
||||
power_gen = round(initial(power_gen) * temp_rating * 2)
|
||||
consumption = consumption_coeff
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
|
||||
/obj/machinery/singularity/Move(atom/newloc, direct)
|
||||
if(current_size >= 9 || check_turfs_in(direct))
|
||||
if(current_size >= STAGE_FIVE || check_turfs_in(direct))
|
||||
last_failed_movement = 0//Reset this because we moved
|
||||
return ..()
|
||||
else
|
||||
@@ -53,6 +53,8 @@
|
||||
consume(user)
|
||||
return 1
|
||||
|
||||
/obj/machinery/singularity/Process_Spacemove() //The singularity stops drifting for no man!
|
||||
return 0
|
||||
|
||||
/obj/machinery/singularity/blob_act(severity)
|
||||
return
|
||||
@@ -60,7 +62,7 @@
|
||||
/obj/machinery/singularity/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
if(current_size <= 3)
|
||||
if(current_size <= STAGE_TWO)
|
||||
investigate_log("has been destroyed by a heavy explosion.","singulo")
|
||||
qdel(src)
|
||||
return
|
||||
@@ -88,15 +90,15 @@
|
||||
|
||||
|
||||
/obj/machinery/singularity/process()
|
||||
eat()
|
||||
dissipate()
|
||||
check_energy()
|
||||
|
||||
if(current_size >= 3)
|
||||
if(current_size >= STAGE_TWO)
|
||||
move()
|
||||
pulse()
|
||||
if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit
|
||||
event()
|
||||
eat()
|
||||
dissipate()
|
||||
check_energy()
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -125,8 +127,8 @@
|
||||
if(force_size)
|
||||
temp_allowed_size = force_size
|
||||
switch(temp_allowed_size)
|
||||
if(1)
|
||||
current_size = 1
|
||||
if(STAGE_ONE)
|
||||
current_size = STAGE_ONE
|
||||
icon = 'icons/obj/singularity.dmi'
|
||||
icon_state = "singularity_s1"
|
||||
pixel_x = 0
|
||||
@@ -136,8 +138,8 @@
|
||||
dissipate_delay = 10
|
||||
dissipate_track = 0
|
||||
dissipate_strength = 1
|
||||
if(3)//1 to 3 does not check for the turfs if you put the gens right next to a 1x1 then its going to eat them
|
||||
current_size = 3
|
||||
if(STAGE_TWO)//1 to 3 does not check for the turfs if you put the gens right next to a 1x1 then its going to eat them
|
||||
current_size = STAGE_TWO
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "singularity_s3"
|
||||
pixel_x = -32
|
||||
@@ -147,9 +149,9 @@
|
||||
dissipate_delay = 5
|
||||
dissipate_track = 0
|
||||
dissipate_strength = 5
|
||||
if(5)
|
||||
if(STAGE_THREE)
|
||||
if((check_turfs_in(1,2))&&(check_turfs_in(2,2))&&(check_turfs_in(4,2))&&(check_turfs_in(8,2)))
|
||||
current_size = 5
|
||||
current_size = STAGE_THREE
|
||||
icon = 'icons/effects/160x160.dmi'
|
||||
icon_state = "singularity_s5"
|
||||
pixel_x = -64
|
||||
@@ -159,9 +161,9 @@
|
||||
dissipate_delay = 4
|
||||
dissipate_track = 0
|
||||
dissipate_strength = 20
|
||||
if(7)
|
||||
if(STAGE_FOUR)
|
||||
if((check_turfs_in(1,3))&&(check_turfs_in(2,3))&&(check_turfs_in(4,3))&&(check_turfs_in(8,3)))
|
||||
current_size = 7
|
||||
current_size = STAGE_FOUR
|
||||
icon = 'icons/effects/224x224.dmi'
|
||||
icon_state = "singularity_s7"
|
||||
pixel_x = -96
|
||||
@@ -171,8 +173,8 @@
|
||||
dissipate_delay = 10
|
||||
dissipate_track = 0
|
||||
dissipate_strength = 10
|
||||
if(9)//this one also lacks a check for gens because it eats everything
|
||||
current_size = 9
|
||||
if(STAGE_FIVE)//this one also lacks a check for gens because it eats everything
|
||||
current_size = STAGE_FIVE
|
||||
icon = 'icons/effects/288x288.dmi'
|
||||
icon_state = "singularity_s9"
|
||||
pixel_x = -128
|
||||
@@ -196,15 +198,15 @@
|
||||
return 0
|
||||
switch(energy)//Some of these numbers might need to be changed up later -Mport
|
||||
if(1 to 199)
|
||||
allowed_size = 1
|
||||
allowed_size = STAGE_ONE
|
||||
if(200 to 499)
|
||||
allowed_size = 3
|
||||
allowed_size = STAGE_TWO
|
||||
if(500 to 999)
|
||||
allowed_size = 5
|
||||
allowed_size = STAGE_THREE
|
||||
if(1000 to 1999)
|
||||
allowed_size = 7
|
||||
allowed_size = STAGE_FOUR
|
||||
if(2000 to INFINITY)
|
||||
allowed_size = 9
|
||||
allowed_size = STAGE_FIVE
|
||||
if(current_size != allowed_size)
|
||||
expand()
|
||||
return 1
|
||||
@@ -249,15 +251,15 @@
|
||||
var/steps = 0
|
||||
if(!step)
|
||||
switch(current_size)
|
||||
if(1)
|
||||
if(STAGE_ONE)
|
||||
steps = 1
|
||||
if(3)
|
||||
if(STAGE_TWO)
|
||||
steps = 3//Yes this is right
|
||||
if(5)
|
||||
if(STAGE_THREE)
|
||||
steps = 3
|
||||
if(7)
|
||||
if(STAGE_FOUR)
|
||||
steps = 4
|
||||
if(9)
|
||||
if(STAGE_FIVE)
|
||||
steps = 5
|
||||
else
|
||||
steps = step
|
||||
@@ -278,12 +280,12 @@
|
||||
dir2 = 1
|
||||
dir3 = 2
|
||||
var/turf/T2 = T
|
||||
for(var/j = 1 to steps)
|
||||
for(var/j = 1 to steps-1)
|
||||
T2 = get_step(T2,dir2)
|
||||
if(!isturf(T2))
|
||||
return 0
|
||||
turfs.Add(T2)
|
||||
for(var/k = 1 to steps)
|
||||
for(var/k = 1 to steps-1)
|
||||
T = get_step(T,dir3)
|
||||
if(!isturf(T))
|
||||
return 0
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
damage = 15
|
||||
damage_type = BRUTE
|
||||
flag = "bomb"
|
||||
var/range = 2
|
||||
var/range = 3
|
||||
|
||||
obj/item/projectile/kinetic/New()
|
||||
var/turf/proj_turf = get_turf(src)
|
||||
|
||||
@@ -723,7 +723,7 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
|
||||
var/i = 0
|
||||
for(var/datum/disease/D in Blood.data["viruses"])
|
||||
i++
|
||||
if(!D.hidden[PANDEMIC])
|
||||
if(!(D.visibility_flags & HIDDEN_PANDEMIC))
|
||||
|
||||
if(istype(D, /datum/disease/advance))
|
||||
|
||||
@@ -738,8 +738,8 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
|
||||
dat += "<b>Disease Agent:</b> [D?"[D.agent] - <A href='?src=\ref[src];create_virus_culture=[i]'>Create virus culture bottle</A>":"none"]<BR>"
|
||||
dat += "<b>Common name:</b> [(D.name||"none")]<BR>"
|
||||
dat += "<b>Description: </b> [(D.desc||"none")]<BR>"
|
||||
dat += "<b>Spread:</b> [(D.spread||"none")]<BR>"
|
||||
dat += "<b>Possible cure:</b> [(D.cure||"none")]<BR><BR>"
|
||||
dat += "<b>Spread:</b> [(D.spread_text||"none")]<BR>"
|
||||
dat += "<b>Possible cure:</b> [(D.cure_text||"none")]<BR><BR>"
|
||||
|
||||
if(istype(D, /datum/disease/advance))
|
||||
var/datum/disease/advance/A = D
|
||||
|
||||
@@ -94,14 +94,14 @@ datum/reagent/blood/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
|
||||
src = null
|
||||
if(self.data && self.data["viruses"])
|
||||
for(var/datum/disease/D in self.data["viruses"])
|
||||
//var/datum/disease/virus = new D.type(0, D, 1)
|
||||
// We don't spread.
|
||||
if(D.spread_type == SPECIAL || D.spread_type == NON_CONTAGIOUS) continue
|
||||
|
||||
if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS)
|
||||
continue
|
||||
|
||||
if(method == TOUCH)
|
||||
M.contract_disease(D)
|
||||
M.ContractDisease(D)
|
||||
else //injected
|
||||
M.contract_disease(D, 1, 0)
|
||||
M.ForceContractDisease(D)
|
||||
|
||||
datum/reagent/blood/on_new(var/list/data)
|
||||
if(istype(data))
|
||||
@@ -349,7 +349,7 @@ datum/reagent/aslimetoxin
|
||||
|
||||
datum/reagent/aslimetoxin/reaction_mob(var/mob/M, var/volume)
|
||||
src = null
|
||||
M.contract_disease(new /datum/disease/transformation/slime(0),1)
|
||||
M.ForceContractDisease(new /datum/disease/transformation/slime(0))
|
||||
|
||||
datum/reagent/inaprovaline
|
||||
name = "Inaprovaline"
|
||||
@@ -617,6 +617,7 @@ datum/reagent/ryetalyn/on_mob_life(var/mob/living/M as mob)
|
||||
M.mutations = list()
|
||||
M.disabilities = 0
|
||||
M.sdisabilities = 0
|
||||
M.jitteriness = 0
|
||||
|
||||
// Might need to update appearance for hulk etc.
|
||||
if(needs_update && ishuman(M))
|
||||
@@ -996,9 +997,9 @@ datum/reagent/adminordrazine/on_mob_life(var/mob/living/carbon/M as mob)
|
||||
M.sleeping = 0
|
||||
M.jitteriness = 0
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
if(D.severity == D.non_threat)
|
||||
if(D.severity == NONTHREAT)
|
||||
continue
|
||||
D.spread = "Remissive"
|
||||
D.spread_text = "Remissive"
|
||||
D.stage--
|
||||
if(D.stage < 1)
|
||||
D.cure()
|
||||
@@ -1088,7 +1089,7 @@ datum/reagent/alkysine/on_mob_life(var/mob/living/M as mob)
|
||||
datum/reagent/imidazoline
|
||||
name = "Imidazoline"
|
||||
id = "imidazoline"
|
||||
description = "Heals eye damage"
|
||||
description = "Heals eye damage."
|
||||
reagent_state = LIQUID
|
||||
color = "#C8A5DC" // rgb: 200, 165, 220
|
||||
|
||||
@@ -1102,6 +1103,20 @@ datum/reagent/imidazoline/on_mob_life(var/mob/living/M as mob)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/inacusiate
|
||||
name = "Inacusiate"
|
||||
id = "inacusiate"
|
||||
description = "Heals ear damage."
|
||||
reagent_state = LIQUID
|
||||
color = "#6600FF" // rgb: 100, 165, 255
|
||||
|
||||
datum/reagent/inacusiate/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.ear_damage = 0
|
||||
M.ear_deaf = 0
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/bicaridine
|
||||
name = "Bicaridine"
|
||||
id = "bicaridine"
|
||||
@@ -1216,7 +1231,7 @@ datum/reagent/nanites
|
||||
datum/reagent/nanites/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
|
||||
src = null
|
||||
if( (prob(10) && method==TOUCH) || method==INGEST)
|
||||
M.contract_disease(new /datum/disease/transformation/robot(0),1)
|
||||
M.ForceContractDisease(new /datum/disease/transformation/robot(0))
|
||||
|
||||
datum/reagent/xenomicrobes
|
||||
name = "Xenomicrobes"
|
||||
@@ -1228,7 +1243,7 @@ datum/reagent/xenomicrobes
|
||||
datum/reagent/xenomicrobes/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
|
||||
src = null
|
||||
if( (prob(10) && method==TOUCH) || method==INGEST)
|
||||
M.contract_disease(new /datum/disease/transformation/xeno(0),1)
|
||||
M.ContractDisease(new /datum/disease/transformation/xeno(0))
|
||||
|
||||
datum/reagent/fluorosurfactant//foam precursor
|
||||
name = "Fluorosurfactant"
|
||||
@@ -1633,78 +1648,20 @@ datum/reagent/toxin/acid
|
||||
reagent_state = LIQUID
|
||||
color = "#DB5008" // rgb: 219, 80, 8
|
||||
toxpwr = 1
|
||||
var/meltprob = 10
|
||||
var/acidpwr = 10 //the amount of protection removed from the armour
|
||||
|
||||
datum/reagent/toxin/acid/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//magic numbers everywhere
|
||||
if(!istype(M, /mob/living))
|
||||
datum/reagent/toxin/acid/reaction_mob(var/mob/living/carbon/C, var/method=TOUCH, var/volume)
|
||||
if(!istype(C))
|
||||
return
|
||||
if(method == TOUCH)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(method != TOUCH)
|
||||
if(!C.unacidable)
|
||||
C.take_organ_damage(min(6*toxpwr, volume * toxpwr))
|
||||
return
|
||||
|
||||
if(H.head)
|
||||
if(prob(meltprob) && !H.head.unacidable)
|
||||
H << "<span class='danger'>Your headgear melts away but protects you from the acid!</span>"
|
||||
qdel(H.head)
|
||||
H.update_inv_head(0)
|
||||
H.update_hair(0)
|
||||
else
|
||||
H << "<span class='warning'>Your headgear protects you from the acid.</span>"
|
||||
return
|
||||
|
||||
if(H.wear_mask)
|
||||
if(prob(meltprob) && !H.wear_mask.unacidable)
|
||||
H << "<span class='danger'>Your mask melts away but protects you from the acid!</span>"
|
||||
qdel(H.wear_mask)
|
||||
H.update_inv_wear_mask(0)
|
||||
H.update_hair(0)
|
||||
else
|
||||
H << "<span class='warning'>Your mask protects you from the acid.</span>"
|
||||
return
|
||||
|
||||
if(H.glasses) //Doesn't protect you from the acid but can melt anyways!
|
||||
if(prob(meltprob) && !H.glasses.unacidable)
|
||||
H << "<span class='danger'>Your glasses melts away!</span>"
|
||||
qdel(H.glasses)
|
||||
H.update_inv_glasses(0)
|
||||
|
||||
else if(ismonkey(M))
|
||||
var/mob/living/carbon/monkey/MK = M
|
||||
if(MK.wear_mask)
|
||||
if(!MK.wear_mask.unacidable)
|
||||
MK << "<span class='danger'>Your mask melts away but protects you from the acid!</span>"
|
||||
qdel(MK.wear_mask)
|
||||
MK.update_inv_wear_mask(0)
|
||||
else
|
||||
MK << "<span class='warning'>Your mask protects you from the acid.</span>"
|
||||
return
|
||||
|
||||
if(!M.unacidable)
|
||||
if(istype(M, /mob/living/carbon/human) && volume >= 3)
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/limb/affecting = H.get_organ("head")
|
||||
if(affecting)
|
||||
if(affecting.take_damage(4*toxpwr, 2*toxpwr))
|
||||
H.update_damage_overlays(0)
|
||||
if(prob(meltprob)) //Applies disfigurement
|
||||
H.emote("scream")
|
||||
H.facial_hair_style = "Shaved"
|
||||
H.hair_style = "Bald"
|
||||
H.update_hair(0)
|
||||
H.status_flags |= DISFIGURED
|
||||
else
|
||||
M.take_organ_damage(min(6*toxpwr, volume * toxpwr)) // uses min() and volume to make sure they aren't being sprayed in trace amounts (1 unit != insta rape) -- Doohl
|
||||
else
|
||||
if(!M.unacidable)
|
||||
M.take_organ_damage(min(6*toxpwr, volume * toxpwr))
|
||||
C.acid_act(acidpwr, toxpwr, volume)
|
||||
|
||||
datum/reagent/toxin/acid/reaction_obj(var/obj/O, var/volume)
|
||||
if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(meltprob * 3))
|
||||
if(!O.unacidable)
|
||||
var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(get_turf(O))
|
||||
I.desc = "Looks like this was \an [O] some time ago."
|
||||
O.visible_message("<span class='danger'> \the [O] melts.</span>")
|
||||
qdel(O)
|
||||
O.acid_act(acidpwr, toxpwr, volume)
|
||||
|
||||
datum/reagent/toxin/acid/polyacid
|
||||
name = "Polytrinic acid"
|
||||
@@ -1713,7 +1670,7 @@ datum/reagent/toxin/acid/polyacid
|
||||
reagent_state = LIQUID
|
||||
color = "#8E18A9" // rgb: 142, 24, 169
|
||||
toxpwr = 2
|
||||
meltprob = 30
|
||||
acidpwr = 20
|
||||
|
||||
datum/reagent/toxin/coffeepowder
|
||||
name = "Coffee Grounds"
|
||||
|
||||
@@ -267,6 +267,13 @@ silicate
|
||||
required_reagents = list("carbon" = 1, "hydrogen" = 1, "anti_toxin" = 1)
|
||||
result_amount = 2
|
||||
|
||||
/datum/chemical_reaction/inacusiate
|
||||
name = "inacusiate"
|
||||
id = "inacusiate"
|
||||
result = "inacusiate"
|
||||
required_reagents = list("water" = 1, "carbon" = 1, "anti_toxin" = 1)
|
||||
result_amount = 2
|
||||
|
||||
/datum/chemical_reaction/ethylredoxrazine
|
||||
name = "Ethylredoxrazine"
|
||||
id = "ethylredoxrazine"
|
||||
|
||||
@@ -96,27 +96,28 @@
|
||||
usr << "<span class='notice'>It is spent.</span>"
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/medipen/leporazine
|
||||
/obj/item/weapon/reagent_containers/hypospray/medipen/leporazine //basilisks
|
||||
name = "leporazine medipen"
|
||||
desc = "A rapid and safe way to regulate your body's temperature."
|
||||
desc = "A rapid way to regulate your body's temperature in the event of a hardsuit malfunction at the cost of some shortness of breath."
|
||||
icon_state = "lepopen"
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/medipen/leporazine/New()
|
||||
..()
|
||||
reagents.remove_reagent("inaprovaline", 10)
|
||||
reagents.add_reagent("leporazine", 10)
|
||||
reagents.add_reagent("leporazine", 9)
|
||||
reagents.add_reagent("lexorin", 1)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/medipen/stimpack
|
||||
/obj/item/weapon/reagent_containers/hypospray/medipen/stimpack //goliath kiting
|
||||
name = "stimpack medipen"
|
||||
desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in bulky clothing at the cost of some muscle tissue tearing."
|
||||
desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor at the cost of some shortness of breath."
|
||||
icon_state = "stimpen"
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/medipen/stimpack/New()
|
||||
..()
|
||||
reagents.remove_reagent("inaprovaline", 10)
|
||||
reagents.add_reagent("hyperzine", 8)
|
||||
reagents.add_reagent("lexorin", 2)
|
||||
reagents.add_reagent("hyperzine", 9)
|
||||
reagents.add_reagent("lexorin", 1)
|
||||
update_icon()
|
||||
return
|
||||
@@ -89,7 +89,7 @@
|
||||
if(isturf(usr.loc) && src.loc == usr)
|
||||
usr << "<span class='notice'>You empty \the [src] onto the floor.</span>"
|
||||
reagents.reaction(usr.loc)
|
||||
spawn(5) src.reagents.clear_reagents()
|
||||
src.reagents.clear_reagents()
|
||||
|
||||
//space cleaner
|
||||
/obj/item/weapon/reagent_containers/spray/cleaner
|
||||
|
||||
@@ -116,6 +116,14 @@
|
||||
|
||||
// attack with item, place item on conveyor
|
||||
/obj/machinery/conveyor/attackby(var/obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/weapon/crowbar))
|
||||
if(!(stat & BROKEN))
|
||||
var/obj/item/conveyor_construct/C = new/obj/item/conveyor_construct(src.loc)
|
||||
C.id = id
|
||||
transfer_fingerprints_to(C)
|
||||
user << "<span class='notice'>You remove the conveyor belt.</span>"
|
||||
qdel(src)
|
||||
return
|
||||
if(isrobot(user)) return //Carn: fix for borgs dropping their modules on conveyor belts
|
||||
if(!user.drop_item())
|
||||
user << "<span class='notice'>\The [I] is stuck to your hand, you cannot place it on the conveyor!</span>"
|
||||
@@ -179,6 +187,7 @@
|
||||
var/position = 0 // 0 off, -1 reverse, 1 forward
|
||||
var/last_pos = -1 // last direction setting
|
||||
var/operated = 1 // true if just operated
|
||||
var/convdir = 0 // 0 is two way switch, 1 and -1 means one way
|
||||
|
||||
var/id = "" // must match conveyor IDs to control them
|
||||
|
||||
@@ -187,8 +196,10 @@
|
||||
|
||||
|
||||
|
||||
/obj/machinery/conveyor_switch/New()
|
||||
..()
|
||||
/obj/machinery/conveyor_switch/New(newloc, newid)
|
||||
..(newloc)
|
||||
if(!id)
|
||||
id = newid
|
||||
update()
|
||||
|
||||
spawn(5) // allow map load
|
||||
@@ -222,13 +233,17 @@
|
||||
|
||||
// attack with hand, switch position
|
||||
/obj/machinery/conveyor_switch/attack_hand(mob/user)
|
||||
add_fingerprint(user)
|
||||
if(position == 0)
|
||||
if(last_pos < 0)
|
||||
position = 1
|
||||
last_pos = 0
|
||||
if(convdir) //is it a oneway switch
|
||||
position = convdir
|
||||
else
|
||||
position = -1
|
||||
last_pos = 0
|
||||
if(last_pos < 0)
|
||||
position = 1
|
||||
last_pos = 0
|
||||
else
|
||||
position = -1
|
||||
last_pos = 0
|
||||
else
|
||||
last_pos = position
|
||||
position = 0
|
||||
@@ -242,22 +257,80 @@
|
||||
S.position = position
|
||||
S.update()
|
||||
|
||||
/obj/machinery/conveyor_switch/attackby(var/obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/weapon/crowbar))
|
||||
var/obj/item/conveyor_switch_construct/C = new/obj/item/conveyor_switch_construct(src.loc)
|
||||
C.id = id
|
||||
transfer_fingerprints_to(C)
|
||||
user << "<span class='notice'>You deattach the conveyor switch.</span>"
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/conveyor_switch/oneway
|
||||
var/convdir = 1 //Set to 1 or -1 depending on which way you want the convayor to go. (In other words keep at 1 and set the proper dir on the belts.)
|
||||
convdir = 1 //Set to 1 or -1 depending on which way you want the convayor to go. (In other words keep at 1 and set the proper dir on the belts.)
|
||||
desc = "A conveyor control switch. It appears to only go in one direction."
|
||||
|
||||
// attack with hand, switch position
|
||||
/obj/machinery/conveyor_switch/oneway/attack_hand(mob/user)
|
||||
if(position == 0)
|
||||
position = convdir
|
||||
else
|
||||
position = 0
|
||||
//
|
||||
// CONVEYOR CONSTRUCTION STARTS HERE
|
||||
//
|
||||
|
||||
operated = 1
|
||||
update()
|
||||
/obj/item/conveyor_construct
|
||||
icon = 'icons/obj/recycling.dmi'
|
||||
icon_state = "conveyor0"
|
||||
name = "conveyor belt assembly"
|
||||
desc = "A conveyor belt assembly."
|
||||
w_class = 4
|
||||
var/id = "" //inherited by the belt
|
||||
|
||||
// find any switches with same id as this one, and set their positions to match us
|
||||
for(var/obj/machinery/conveyor_switch/S in world)
|
||||
if(S.id == src.id)
|
||||
S.position = position
|
||||
S.update()
|
||||
/obj/item/conveyor_construct/attackby(obj/item/I, mob/user)
|
||||
..()
|
||||
if(istype(I, /obj/item/conveyor_switch_construct))
|
||||
user << "<span class='notice'>You link the switch to the conveyor belt assembly.</span>"
|
||||
var/obj/item/conveyor_switch_construct/C = I
|
||||
id = C.id
|
||||
|
||||
/obj/item/conveyor_construct/afterattack(atom/A, mob/user, proximity)
|
||||
if(!proximity || user.stat || !istype(A, /turf/simulated/floor) || istype(A, /area/shuttle))
|
||||
return
|
||||
var/cdir = get_dir(A, user)
|
||||
if(!(cdir in cardinal) || A == user.loc)
|
||||
return
|
||||
for(var/obj/machinery/conveyor/CB in A)
|
||||
if(CB.dir == cdir || CB.dir == turn(cdir,180))
|
||||
return
|
||||
cdir |= CB.dir
|
||||
qdel(CB)
|
||||
var/obj/machinery/conveyor/C = new/obj/machinery/conveyor(A,cdir)
|
||||
C.id = id
|
||||
transfer_fingerprints_to(C)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/conveyor_switch_construct
|
||||
name = "conveyor switch assembly"
|
||||
desc = "A conveyor control switch assembly."
|
||||
icon = 'icons/obj/recycling.dmi'
|
||||
icon_state = "switch-off"
|
||||
w_class = 4
|
||||
var/id = "" //inherited by the switch
|
||||
|
||||
/obj/item/conveyor_switch_construct/New()
|
||||
..()
|
||||
id = rand() //this couldn't possibly go wrong
|
||||
|
||||
/obj/item/conveyor_switch_construct/afterattack(atom/A, mob/user, proximity)
|
||||
if(!proximity || user.stat || !istype(A, /turf/simulated/floor) || istype(A, /area/shuttle))
|
||||
return
|
||||
var/found = 0
|
||||
for(var/obj/machinery/conveyor/C in view())
|
||||
if(C.id == src.id)
|
||||
found = 1
|
||||
break
|
||||
if(!found)
|
||||
user << "\icon[src]<span class=notice>The conveyor switch did not detect any linked conveyor belts in range.</span>"
|
||||
return
|
||||
var/obj/machinery/conveyor_switch/NC = new/obj/machinery/conveyor_switch(A, id)
|
||||
transfer_fingerprints_to(NC)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/paper/conveyor
|
||||
name = "paper- 'Nano-it-up U-build series, #9: Build your very own conveyor belt, in SPACE'"
|
||||
info = "<h1>Congratulations!</h1><p>You are now the proud owner of the best conveyor set available for space mail order! We at Nano-it-up know you love to prepare your own structures without wasting time, so we have devised a special streamlined assembly procedure that puts all other mail-order products to shame!</p><p>Firstly, you need to link the conveyor switch assembly to each of the conveyor belt assemblies. After doing so, you simply need to install the belt assemblies onto the floor, et voila, belt built. Our special Nano-it-up smart switch will detected any linked assemblies as far as the eye can see! This convenience, you can only have it when you Nano-it-up. Stay nano!</p>"
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
anchored = 0
|
||||
density = 0
|
||||
pressure_resistance = 5*ONE_ATMOSPHERE
|
||||
m_amt = 1850
|
||||
level = 2
|
||||
var/ptype = 0
|
||||
// 0=straight, 1=bent, 2=junction-j1, 3=junction-j2, 4=junction-y, 5=trunk, 6=disposal bin, 7=outlet, 8=inlet
|
||||
@@ -216,7 +215,8 @@
|
||||
playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
|
||||
user << "Welding the [nicetype] in place."
|
||||
if(do_after(user, 20))
|
||||
if(!src || !W.isOn()) return
|
||||
if(!src.loc || !W.isOn())
|
||||
return
|
||||
user << "The [nicetype] has been welded in place!"
|
||||
update() // TODO: Make this neat
|
||||
if(ispipe) // Pipe
|
||||
|
||||
@@ -22,12 +22,12 @@
|
||||
var/flush_every_ticks = 30 //Every 30 ticks it will look whether it is ready to flush
|
||||
var/flush_count = 0 //this var adds 1 once per tick. When it reaches flush_every_ticks it resets and tries to flush.
|
||||
var/last_sound = 0
|
||||
|
||||
var/obj/structure/disposalconstruct/stored
|
||||
// create a new disposal
|
||||
// find the attached trunk (if present) and init gas resvr.
|
||||
/obj/machinery/disposal/New()
|
||||
..()
|
||||
|
||||
stored = new /obj/structure/disposalconstruct(src)
|
||||
trunk_check()
|
||||
|
||||
air_contents = new/datum/gas_mixture()
|
||||
@@ -48,6 +48,10 @@
|
||||
eject()
|
||||
..()
|
||||
|
||||
/obj/machinery/disposal/singularity_pull(S, current_size)
|
||||
if(current_size >= STAGE_FIVE)
|
||||
Deconstruct()
|
||||
|
||||
/obj/machinery/disposal/initialize()
|
||||
// this will get a copy of the air turf and take a SEND PRESSURE amount of air from it
|
||||
var/atom/L = loc
|
||||
@@ -92,13 +96,7 @@
|
||||
if(do_after(user,20))
|
||||
if(!src || !W.isOn()) return
|
||||
user << "<span class='notice'>You've sliced the floorweld off \the [src].</span>"
|
||||
var/obj/structure/disposalconstruct/C = new (src.loc)
|
||||
src.transfer_fingerprints_to(C)
|
||||
C.ptype = 6 // 6 = disposal unit
|
||||
C.anchored = 1
|
||||
C.density = 1
|
||||
C.update()
|
||||
qdel(src)
|
||||
Deconstruct()
|
||||
return
|
||||
else
|
||||
return
|
||||
@@ -219,6 +217,7 @@
|
||||
// hostile mob escape from disposals
|
||||
/obj/machinery/disposal/attack_animal(var/mob/living/simple_animal/M)
|
||||
if(M.environment_smash)
|
||||
M.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[M.name] smashes \the [src] apart!</span>")
|
||||
qdel(src)
|
||||
return
|
||||
@@ -453,6 +452,16 @@
|
||||
else
|
||||
return ..(mover, target, height)
|
||||
|
||||
/obj/machinery/disposal/Deconstruct()
|
||||
if(stored)
|
||||
var/turf/T = loc
|
||||
stored.loc = T
|
||||
src.transfer_fingerprints_to(stored)
|
||||
stored.ptype = 6 // 6 = disposal unit
|
||||
stored.anchored = 1
|
||||
stored.density = 1
|
||||
stored.update()
|
||||
..()
|
||||
// virtual disposal object
|
||||
// travels through pipes in lieu of actual items
|
||||
// contents will be items flushed by the disposal
|
||||
@@ -602,11 +611,30 @@
|
||||
var/health = 10 // health points 0-10
|
||||
layer = 2.3 // slightly lower than wires and other pipes
|
||||
var/base_icon_state // initial icon state on map
|
||||
var/obj/structure/disposalconstruct/stored
|
||||
|
||||
// new pipe, set the icon_state as on map
|
||||
/obj/structure/disposalpipe/New()
|
||||
..()
|
||||
base_icon_state = icon_state
|
||||
stored = new /obj/structure/disposalconstruct(src)
|
||||
switch(base_icon_state)
|
||||
if("pipe-s")
|
||||
stored.ptype = 0
|
||||
if("pipe-c")
|
||||
stored.ptype = 1
|
||||
if("pipe-j1")
|
||||
stored.ptype = 2
|
||||
if("pipe-j2")
|
||||
stored.ptype = 3
|
||||
if("pipe-y")
|
||||
stored.ptype = 4
|
||||
if("pipe-t")
|
||||
stored.ptype = 5
|
||||
if("pipe-j1s")
|
||||
stored.ptype = 9
|
||||
if("pipe-j2s")
|
||||
stored.ptype = 10
|
||||
return
|
||||
|
||||
|
||||
@@ -813,39 +841,25 @@
|
||||
// check if anything changed over 2 seconds
|
||||
if(do_after(user,30))
|
||||
if(!src || !W.isOn()) return
|
||||
welded()
|
||||
Deconstruct()
|
||||
user << "<span class='notice'>You've sliced the disposal pipe.</span>"
|
||||
else
|
||||
return
|
||||
|
||||
// called when pipe is cut with welder
|
||||
/obj/structure/disposalpipe/proc/welded()
|
||||
/obj/structure/disposalpipe/Deconstruct()
|
||||
var/turf/T = loc
|
||||
stored.loc = T
|
||||
transfer_fingerprints_to(stored)
|
||||
stored.dir = dir
|
||||
stored.density = 0
|
||||
stored.anchored = 1
|
||||
stored.update()
|
||||
..()
|
||||
|
||||
var/obj/structure/disposalconstruct/C = new (src.loc)
|
||||
switch(base_icon_state)
|
||||
if("pipe-s")
|
||||
C.ptype = 0
|
||||
if("pipe-c")
|
||||
C.ptype = 1
|
||||
if("pipe-j1")
|
||||
C.ptype = 2
|
||||
if("pipe-j2")
|
||||
C.ptype = 3
|
||||
if("pipe-y")
|
||||
C.ptype = 4
|
||||
if("pipe-t")
|
||||
C.ptype = 5
|
||||
if("pipe-j1s")
|
||||
C.ptype = 9
|
||||
if("pipe-j2s")
|
||||
C.ptype = 10
|
||||
src.transfer_fingerprints_to(C)
|
||||
C.dir = dir
|
||||
C.density = 0
|
||||
C.anchored = 1
|
||||
C.update()
|
||||
|
||||
qdel(src)
|
||||
/obj/structure/disposalpipe/singularity_pull(S, current_size)
|
||||
if(current_size >= STAGE_FIVE)
|
||||
Deconstruct()
|
||||
|
||||
// *** TEST verb
|
||||
//client/verb/dispstop()
|
||||
@@ -1129,7 +1143,7 @@
|
||||
user << "<span class='notice'>You start slicing the disposal pipe.</span>"
|
||||
if(do_after(user,30))
|
||||
if(!src || !W.isOn()) return
|
||||
welded()
|
||||
Deconstruct()
|
||||
user << "<span class='notice'>You've sliced the disposal pipe.</span>"
|
||||
else
|
||||
return
|
||||
@@ -1179,10 +1193,8 @@
|
||||
// called when welded
|
||||
// for broken pipe, remove and turn into scrap
|
||||
|
||||
/obj/structure/disposalpipe/broken/welded()
|
||||
// var/obj/item/scrap/S = new(src.loc)
|
||||
// S.set_components(200,0,0)
|
||||
qdel(src)
|
||||
/obj/structure/disposalpipe/broken/Deconstruct()
|
||||
..()
|
||||
|
||||
// the disposal outlet machine
|
||||
|
||||
|
||||
@@ -251,7 +251,8 @@
|
||||
return
|
||||
|
||||
/obj/machinery/disposal/deliveryChute/Bumped(var/atom/movable/AM) //Go straight into the chute
|
||||
if(istype(AM, /obj/item/projectile)) return
|
||||
if(!AM.disposalEnterTry())
|
||||
return
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
if(AM.loc.y != loc.y+1) return
|
||||
@@ -270,6 +271,15 @@
|
||||
M.loc = src
|
||||
flush()
|
||||
|
||||
/atom/movable/proc/disposalEnterTry()
|
||||
return 1
|
||||
|
||||
/obj/item/projectile/disposalEnterTry()
|
||||
return
|
||||
|
||||
/obj/mecha/disposalEnterTry()
|
||||
return
|
||||
|
||||
/obj/machinery/disposal/deliveryChute/flush()
|
||||
flushing = 1
|
||||
flick("intake-closing", src)
|
||||
|
||||
@@ -330,11 +330,33 @@ datum/design/magboots
|
||||
build_path = /obj/item/clothing/shoes/magboots
|
||||
|
||||
datum/design/drone_shell
|
||||
name = "drone shell"
|
||||
name = "Drone Shell"
|
||||
desc = "A shell of a maintenance drone, an expendable robot built to perform station repairs."
|
||||
id = "drone_shell"
|
||||
req_tech = list("programming" = 2, "biotech" = 4)
|
||||
build_type = MECHFAB
|
||||
materials = list("$metal" = 800, "$glass" = 350)
|
||||
build_path = /obj/item/drone_shell
|
||||
category = "Misc"
|
||||
category = "Misc"
|
||||
|
||||
/////////////////////////////////////////
|
||||
////////////Janitor Designs//////////////
|
||||
/////////////////////////////////////////
|
||||
|
||||
datum/design/advmop
|
||||
name = "Advanced Mop"
|
||||
desc = "An upgraded mop with a large internal capacity for holding water or other cleaning chemicals."
|
||||
id = "advmop"
|
||||
req_tech = list("materials" = 4, "engineering" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 2500, "$glass" = 200)
|
||||
build_path = /obj/item/weapon/mop/advanced
|
||||
|
||||
datum/design/holosign
|
||||
name = "Holographic Sign Projector"
|
||||
desc = "A holograpic projector used to project various warning signs."
|
||||
id = "holosign"
|
||||
req_tech = list("magnets" = 3, "powerstorage" = 2)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 2000, "$glass" = 1000)
|
||||
build_path = /obj/item/weapon/holosign_creator
|
||||
@@ -294,15 +294,6 @@ datum/design/mech_proj_armor
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
datum/design/mech_syringe_gun
|
||||
name = "Exosuit Module Design(Syringe Gun)"
|
||||
desc = "Exosuit-mounted syringe gun and chemical synthesizer."
|
||||
id = "mech_syringe_gun"
|
||||
build_type = MECHFAB
|
||||
req_tech = list("materials" = 3, "biotech"=4, "magnets"=4, "programming"=3)
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
datum/design/mech_diamond_drill
|
||||
name = "Exosuit Module Design (Diamond Mining Drill)"
|
||||
desc = "An upgraded version of the standard drill."
|
||||
|
||||
@@ -0,0 +1,515 @@
|
||||
//Cyborg
|
||||
/datum/design/borg_suit
|
||||
id = "borg_suit"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/robot_suit
|
||||
materials = list("$metal"=15000)
|
||||
category = "Cyborg"
|
||||
|
||||
/datum/design/borg_chest
|
||||
id = "borg_chest"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/chest
|
||||
materials = list("$metal"=40000)
|
||||
category = "Cyborg"
|
||||
|
||||
/datum/design/borg_head
|
||||
id = "borg_head"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/head
|
||||
materials = list("$metal"=5000)
|
||||
category = "Cyborg"
|
||||
|
||||
/datum/design/borg_l_arm
|
||||
id = "borg_l_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/l_arm
|
||||
materials = list("$metal"=10000)
|
||||
category = "Cyborg"
|
||||
|
||||
/datum/design/borg_r_arm
|
||||
id = "borg_r_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/r_arm
|
||||
materials = list("$metal"=10000)
|
||||
category = "Cyborg"
|
||||
|
||||
/datum/design/borg_l_leg
|
||||
id = "borg_l_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/l_leg
|
||||
materials = list("$metal"=10000)
|
||||
category = "Cyborg"
|
||||
|
||||
/datum/design/borg_r_leg
|
||||
id = "borg_r_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/robot_parts/r_leg
|
||||
materials = list("$metal"=10000)
|
||||
category = "Cyborg"
|
||||
|
||||
|
||||
//Ripley
|
||||
/datum/design/ripley_chassis
|
||||
id = "ripley_chassis"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/ripley
|
||||
materials = list("$metal"=20000)
|
||||
category = "Ripley"
|
||||
|
||||
/datum/design/firefighter_chassis
|
||||
id = "firefighter_chassis"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/firefighter
|
||||
materials = list("$metal"=20000)
|
||||
category = "Ripley"
|
||||
|
||||
/datum/design/ripley_torso
|
||||
id = "ripley_torso"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/ripley_torso
|
||||
materials = list("$metal"=20000, "$glass"=7500)
|
||||
category = "Ripley"
|
||||
|
||||
/datum/design/ripley_left_arm
|
||||
id = "ripley_left_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/ripley_left_arm
|
||||
materials = list("$metal"=15000)
|
||||
category = "Ripley"
|
||||
|
||||
/datum/design/ripley_right_arm
|
||||
id = "ripley_right_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/ripley_right_arm
|
||||
materials = list("$metal"=15000)
|
||||
category = "Ripley"
|
||||
|
||||
/datum/design/ripley_left_leg
|
||||
id = "ripley_left_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/ripley_left_leg
|
||||
materials = list("$metal"=15000)
|
||||
category = "Ripley"
|
||||
|
||||
/datum/design/ripley_right_leg
|
||||
id = "ripley_right_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/ripley_right_leg
|
||||
materials = list("$metal"=15000)
|
||||
category = "Ripley"
|
||||
|
||||
|
||||
//Odysseus
|
||||
/datum/design/odysseus_chassis
|
||||
id = "odysseus_chassis"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/odysseus
|
||||
materials = list("$metal"=20000)
|
||||
category = "Odysseus"
|
||||
|
||||
/datum/design/odysseus_torso
|
||||
id = "odysseus_torso"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/odysseus_torso
|
||||
materials = list("$metal"=12000)
|
||||
category = "Odysseus"
|
||||
|
||||
/datum/design/odysseus_head
|
||||
id = "odysseus_head"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/odysseus_head
|
||||
materials = list("$metal"=6000,"$glass"=10000)
|
||||
category = "Odysseus"
|
||||
|
||||
/datum/design/odysseus_left_arm
|
||||
id = "odysseus_left_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/odysseus_left_arm
|
||||
materials = list("$metal"=6000)
|
||||
category = "Odysseus"
|
||||
|
||||
/datum/design/odysseus_right_arm
|
||||
id = "odysseus_right_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/odysseus_right_arm
|
||||
materials = list("$metal"=6000)
|
||||
category = "Odysseus"
|
||||
|
||||
/datum/design/odysseus_left_leg
|
||||
id = "odysseus_left_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/odysseus_left_leg
|
||||
materials = list("$metal"=6000)
|
||||
category = "Odysseus"
|
||||
|
||||
/datum/design/odysseus_right_leg
|
||||
id = "odysseus_right_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/odysseus_right_leg
|
||||
materials = list("$metal"=6000)
|
||||
category = "Odysseus"
|
||||
|
||||
|
||||
//Gygax
|
||||
/datum/design/gygax_chassis
|
||||
id = "gygax_chassis"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/gygax
|
||||
materials = list("$metal"=20000)
|
||||
category = "Gygax"
|
||||
|
||||
/datum/design/gygax_torso
|
||||
id = "gygax_torso"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_torso
|
||||
materials = list("$metal"=20000,"$glass"=10000,"$diamond"=2000)
|
||||
category = "Gygax"
|
||||
|
||||
/datum/design/gygax_head
|
||||
id = "gygax_head"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_head
|
||||
materials = list("$metal"=10000,"$glass"=5000, "$diamond"=2000)
|
||||
category = "Gygax"
|
||||
|
||||
/datum/design/gygax_left_arm
|
||||
id = "gygax_left_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_left_arm
|
||||
materials = list("$metal"=15000, "$diamond"=1000)
|
||||
category = "Gygax"
|
||||
|
||||
/datum/design/gygax_right_arm
|
||||
id = "gygax_right_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_right_arm
|
||||
materials = list("$metal"=15000, "$diamond"=1000)
|
||||
category = "Gygax"
|
||||
|
||||
/datum/design/gygax_left_leg
|
||||
id = "gygax_left_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_left_leg
|
||||
materials = list("$metal"=15000, "$diamond"=1000)
|
||||
category = "Gygax"
|
||||
|
||||
/datum/design/gygax_right_leg
|
||||
id = "gygax_right_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_right_leg
|
||||
materials = list("$metal"=15000, "$diamond"=1000)
|
||||
category = "Gygax"
|
||||
|
||||
/datum/design/gygax_armor
|
||||
id = "gygax_armor"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/gygax_armor
|
||||
materials = list("$metal"=25000,"$diamond"=10000)
|
||||
category = "Gygax"
|
||||
|
||||
|
||||
//Durand
|
||||
/datum/design/durand_chassis
|
||||
id = "durand_chassis"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/durand
|
||||
materials = list("$metal"=25000)
|
||||
category = "Durand"
|
||||
|
||||
/datum/design/durand_torso
|
||||
id = "durand_torso"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_torso
|
||||
materials = list("$metal"=25000,"$glass"=10000,"$silver"=10000)
|
||||
category = "Durand"
|
||||
|
||||
/datum/design/durand_head
|
||||
id = "durand_head"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_head
|
||||
materials = list("$metal"=10000,"$glass"=15000,"$silver"=2000)
|
||||
category = "Durand"
|
||||
|
||||
/datum/design/durand_left_arm
|
||||
id = "durand_left_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_left_arm
|
||||
materials = list("$metal"=10000,"$silver"=4000)
|
||||
category = "Durand"
|
||||
|
||||
/datum/design/durand_right_arm
|
||||
id = "durand_right_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_right_arm
|
||||
materials = list("$metal"=10000,"$silver"=4000)
|
||||
category = "Durand"
|
||||
|
||||
/datum/design/durand_left_leg
|
||||
id = "durand_left_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_left_leg
|
||||
materials = list("$metal"=15000,"$silver"=4000)
|
||||
category = "Durand"
|
||||
|
||||
/datum/design/durand_right_leg
|
||||
id = "durand_right_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_right_leg
|
||||
materials = list("$metal"=15000,"$silver"=4000)
|
||||
category = "Durand"
|
||||
|
||||
/datum/design/durand_armor
|
||||
id = "durand_armor"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/durand_armor
|
||||
materials = list("$metal"=50000,"$uranium"=30000)
|
||||
category = "Durand"
|
||||
|
||||
|
||||
//H.O.N.K
|
||||
/datum/design/honk_chassis
|
||||
id = "honk_chassis"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/honker
|
||||
materials = list("$metal"=20000)
|
||||
category = "H.O.N.K"
|
||||
|
||||
/datum/design/honk_torso
|
||||
id = "honk_torso"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_torso
|
||||
materials = list("$metal"=20000,"$glass"=10000,"$bananium"=10000)
|
||||
category = "H.O.N.K"
|
||||
|
||||
/datum/design/honk_head
|
||||
id = "honk_head"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_head
|
||||
materials = list("$metal"=10000,"$glass"=5000,"$bananium"=5000)
|
||||
category = "H.O.N.K"
|
||||
|
||||
/datum/design/honk_left_arm
|
||||
id = "honk_left_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_left_arm
|
||||
materials = list("$metal"=15000,"$bananium"=5000)
|
||||
category = "H.O.N.K"
|
||||
|
||||
/datum/design/honk_right_arm
|
||||
id = "honk_right_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_right_arm
|
||||
materials = list("$metal"=15000,"$bananium"=5000)
|
||||
category = "H.O.N.K"
|
||||
|
||||
/datum/design/honk_left_leg
|
||||
id = "honk_left_leg"
|
||||
build_type = MECHFAB
|
||||
build_path =/obj/item/mecha_parts/part/honker_left_leg
|
||||
materials = list("$metal"=20000,"$bananium"=5000)
|
||||
category = "H.O.N.K"
|
||||
|
||||
/datum/design/honk_right_leg
|
||||
id = "honk_right_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/honker_right_leg
|
||||
materials = list("$metal"=20000,"$bananium"=5000)
|
||||
category = "H.O.N.K"
|
||||
|
||||
|
||||
//Phazon
|
||||
/datum/design/phazon_chassis
|
||||
id = "phazon_chassis"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/chassis/phazon
|
||||
materials = list("$metal"=20000)
|
||||
category = "Phazon"
|
||||
|
||||
/datum/design/phazon_torso
|
||||
id = "phazon_torso"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/phazon_torso
|
||||
materials = list("$metal"=35000,"$glass"=10000,"$plasma"=20000)
|
||||
category = "Phazon"
|
||||
|
||||
/datum/design/phazon_head
|
||||
id = "phazon_head"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/phazon_head
|
||||
materials = list("$metal"=15000,"$glass"=5000,"$plasma"=10000)
|
||||
category = "Phazon"
|
||||
|
||||
/datum/design/phazon_left_arm
|
||||
id = "phazon_left_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/phazon_left_arm
|
||||
materials = list("$metal"=20000,"$plasma"=10000)
|
||||
category = "Phazon"
|
||||
|
||||
/datum/design/phazon_right_arm
|
||||
id = "phazon_right_arm"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/phazon_right_arm
|
||||
materials = list("$metal"=20000,"$plasma"=10000)
|
||||
category = "Phazon"
|
||||
|
||||
/datum/design/phazon_left_leg
|
||||
id = "phazon_left_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/phazon_left_leg
|
||||
materials = list("$metal"=20000,"$plasma"=10000)
|
||||
category = "Phazon"
|
||||
|
||||
/datum/design/phazon_right_leg
|
||||
id = "phazon_right_leg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/phazon_right_leg
|
||||
materials = list("$metal"=20000,"$plasma"=10000)
|
||||
category = "Phazon"
|
||||
|
||||
/datum/design/phazon_chassis
|
||||
id = "phazon_chassis"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/part/phazon_armor
|
||||
materials = list("$metal"=45000,"$plasma"=30000)
|
||||
category = "Phazon"
|
||||
|
||||
|
||||
//Exosuit Equipment
|
||||
/datum/design/mech_hydraulic_clamp
|
||||
id = "mech_hydraulic_clamp"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp
|
||||
materials = list("$metal"=10000)
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
/datum/design/mech_drill
|
||||
id = "mech_drill"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill
|
||||
materials = list("$metal"=10000)
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
/datum/design/mech_extinguisher
|
||||
id = "mech_extinguisher"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/tool/extinguisher
|
||||
materials = list("$metal"=10000)
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
/datum/design/mech_cable_layer
|
||||
id = "mech_cable_layer"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/tool/cable_layer
|
||||
materials = list("$metal"=10000)
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
/datum/design/mech_sleeper
|
||||
id = "mech_sleeper"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/tool/sleeper
|
||||
materials = list("$metal"=5000,"$glass"=10000)
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
/datum/design/mech_syringe_gun
|
||||
id = "mech_syringe_gun"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
|
||||
materials = list("$metal"=3000,"$glass"=2000)
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
/datum/design/mech_generator
|
||||
id = "mech_generator"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/generator
|
||||
materials = list("$metal"=10000,"$glass"=1000,"$silver"=500)
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
/datum/design/mech_taser
|
||||
id = "mech_taser"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser
|
||||
materials = list("$metal"=10000)
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
/datum/design/mech_lmg
|
||||
id = "mech_lmg"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
|
||||
materials = list("$metal"=10000)
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
/datum/design/mech_mousetrap_mortar
|
||||
id = "mech_mousetrap_mortar"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar
|
||||
materials = list("$metal"=20000,"$bananium"=5000)
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
/datum/design/mech_banana_mortar
|
||||
id = "mech_banana_mortar"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar
|
||||
materials = list("$metal"=20000,"$bananium"=5000)
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
/datum/design/mech_honker
|
||||
id = "mech_honker"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/honker
|
||||
materials = list("$metal"=20000,"$bananium"=10000)
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
|
||||
//Cyborg Upgrade Modules
|
||||
/datum/design/borg_upgrade_reset
|
||||
id = "borg_upgrade_reset"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/borg/upgrade/reset
|
||||
materials = list("$metal"=10000)
|
||||
category = "Cyborg Upgrade Modules"
|
||||
|
||||
/datum/design/borg_upgrade_rename
|
||||
id = "borg_upgrade_rename"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/borg/upgrade/rename
|
||||
materials = list("$metal"=35000)
|
||||
category = "Cyborg Upgrade Modules"
|
||||
|
||||
/datum/design/borg_upgrade_restart
|
||||
id = "borg_upgrade_restart"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/borg/upgrade/restart
|
||||
materials = list("$metal"=60000 , "$glass"=5000)
|
||||
category = "Cyborg Upgrade Modules"
|
||||
|
||||
/datum/design/borg_upgrade_vtec
|
||||
id = "borg_upgrade_vtec"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/borg/upgrade/vtec
|
||||
materials = list("$metal"=80000 , "$glass"=6000 , "$gold"= 5000)
|
||||
category = "Cyborg Upgrade Modules"
|
||||
|
||||
/datum/design/borg_upgrade_tasercooler
|
||||
id = "borg_upgrade_tasercooler"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/borg/upgrade/tasercooler
|
||||
materials = list("$metal"=80000 , "$glass"=6000 , "$gold"= 2000, "$diamond" = 500)
|
||||
category = "Cyborg Upgrade Modules"
|
||||
|
||||
/datum/design/borg_upgrade_jetpack
|
||||
id = "borg_upgrade_jetpack"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/borg/upgrade/jetpack
|
||||
materials = list("$metal"=10000,"$plasma"=15000,"$uranium" = 20000)
|
||||
category = "Cyborg Upgrade Modules"
|
||||
|
||||
|
||||
//Misc
|
||||
/datum/design/mecha_tracking
|
||||
id = "mecha_tracking"
|
||||
build_type = MECHFAB
|
||||
build_path =/obj/item/mecha_parts/mecha_tracking
|
||||
materials = list("$metal"=500)
|
||||
category = "Misc"
|
||||
@@ -86,4 +86,15 @@ datum/design/bluespacebodybag
|
||||
materials = list("$metal" = 3000, "$plasma" = 2000, "$diamond" = 500)
|
||||
reliability = 76
|
||||
build_path = /obj/item/bodybag/bluespace
|
||||
category = "Misc"
|
||||
|
||||
datum/design/defib
|
||||
name = "Defibrillator"
|
||||
desc = "A device that delivers powerful shocks to detachable paddles that resuscitate incapacitated patients."
|
||||
id = "defib"
|
||||
req_tech = list("materials" = 7, "biotech" = 5, "powerstorage" = 5)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 5000, "$glass" = 2000, "$silver" = 1000)
|
||||
reliability = 76
|
||||
build_path = /obj/item/weapon/defibrillator
|
||||
category = "Misc"
|
||||
@@ -37,7 +37,7 @@ Note: Must be placed within 3 tiles of the R&D Console
|
||||
return temp_list
|
||||
|
||||
|
||||
/obj/machinery/r_n_d/destructive_analyzer/attackby(var/obj/O as obj, var/mob/user as mob)
|
||||
/obj/machinery/r_n_d/destructive_analyzer/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if (shocked)
|
||||
shock(user,50)
|
||||
if (default_deconstruction_screwdriver(user, "d_analyzer_t", "d_analyzer", O))
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
var/global/list/obj/machinery/message_server/message_servers = list()
|
||||
|
||||
/datum/data_chat_msg
|
||||
var/sender = "Anon"
|
||||
var/channel = "ss13"
|
||||
var/message = "Blank"
|
||||
|
||||
/datum/data_chat_msg/New(var/param_sen = "", var/param_chan = "", var/param_msg = "")
|
||||
if(param_sen)
|
||||
sender = param_sen
|
||||
if(param_chan)
|
||||
channel = param_chan
|
||||
if(param_msg)
|
||||
message = param_msg
|
||||
|
||||
/datum/data_pda_msg
|
||||
var/recipient = "Unspecified" //name of the person
|
||||
var/sender = "Unspecified" //name of the sender
|
||||
@@ -54,6 +67,7 @@ var/global/list/obj/machinery/message_server/message_servers = list()
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 100
|
||||
|
||||
var/list/datum/data_chat_msg/chat_msgs = list()
|
||||
var/list/datum/data_pda_msg/pda_msgs = list()
|
||||
var/list/datum/data_rc_msg/rc_msgs = list()
|
||||
var/active = 1
|
||||
@@ -88,6 +102,9 @@ var/global/list/obj/machinery/message_server/message_servers = list()
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/machinery/message_server/proc/send_chat_message(var/sender = "", var/channel = "", var/message = "")
|
||||
chat_msgs += new/datum/data_chat_msg(sender,channel,message)
|
||||
|
||||
/obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "")
|
||||
pda_msgs += new/datum/data_pda_msg(recipient,sender,message)
|
||||
|
||||
@@ -240,10 +257,13 @@ var/obj/machinery/blackbox_recorder/blackbox
|
||||
|
||||
/obj/machinery/blackbox_recorder/proc/round_end_data_gathering()
|
||||
|
||||
var/chat_msg_amt = 0
|
||||
var/pda_msg_amt = 0
|
||||
var/rc_msg_amt = 0
|
||||
|
||||
for (var/obj/machinery/message_server/MS in world)
|
||||
if (MS.chat_msgs.len > chat_msg_amt)
|
||||
chat_msg_amt = MS.chat_msgs.len
|
||||
if (MS.pda_msgs.len > pda_msg_amt)
|
||||
pda_msg_amt = MS.pda_msgs.len
|
||||
if (MS.rc_msgs.len > rc_msg_amt)
|
||||
@@ -262,6 +282,7 @@ var/obj/machinery/blackbox_recorder/blackbox
|
||||
feedback_add_details("radio_usage","SRV-[msg_service.len]")
|
||||
feedback_add_details("radio_usage","CAR-[msg_cargo.len]")
|
||||
feedback_add_details("radio_usage","OTH-[messages.len]")
|
||||
feedback_add_details("radio_usage","CHA-[chat_msg_amt]")
|
||||
feedback_add_details("radio_usage","PDA-[pda_msg_amt]")
|
||||
feedback_add_details("radio_usage","RC-[rc_msg_amt]")
|
||||
|
||||
@@ -346,4 +367,4 @@ proc/feedback_add_details(var/variable,var/details)
|
||||
|
||||
if (!FV) return
|
||||
|
||||
FV.add_details(details)
|
||||
FV.add_details(details)
|
||||
|
||||
@@ -175,10 +175,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
|
||||
usr.set_machine(src)
|
||||
if(href_list["menu"]) //Switches menu screens. Converts a sent text string into a number. Saves a LOT of code.
|
||||
var/temp_screen = text2num(href_list["menu"])
|
||||
if(temp_screen <= 1.1 || (3 <= temp_screen && 4.9 >= temp_screen) || src.allowed(usr) || emagged) //Unless you are making something, you need access.
|
||||
screen = temp_screen
|
||||
else
|
||||
usr << "Unauthorized Access."
|
||||
screen = temp_screen
|
||||
|
||||
else if(href_list["updt_tech"]) //Update the research holder with information from the technology disk.
|
||||
screen = 0.0
|
||||
@@ -395,14 +392,14 @@ won't update every console in existence) but it's more of a hassle to do. Also,
|
||||
spawn(32*amount/coeff)
|
||||
if(g2g) //And if we only fail the material requirements, we still spend time and power
|
||||
for(var/i = 0, i<amount, i++)
|
||||
var/obj/new_item = new P(src)
|
||||
var/obj/item/new_item = new P(src)
|
||||
if( new_item.type == /obj/item/weapon/storage/backpack/holding )
|
||||
new_item.investigate_log("built by [key]","singulo")
|
||||
new_item.reliability = R
|
||||
new_item.m_amt /= coeff
|
||||
new_item.g_amt /= coeff
|
||||
if(linked_lathe.hacked)
|
||||
R = max((reliability / 2), 0)
|
||||
R = max((new_item.reliability/2), 0)
|
||||
if(O)
|
||||
var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc)
|
||||
new_item.loc = L
|
||||
@@ -458,7 +455,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
|
||||
var/R = being_built.reliability
|
||||
spawn(16)
|
||||
if(g2g)
|
||||
var/obj/new_item = new P(src)
|
||||
var/obj/item/new_item = new P(src)
|
||||
new_item.reliability = R
|
||||
new_item.loc = linked_imprinter.loc
|
||||
linked_imprinter.busy = 0
|
||||
@@ -943,4 +940,4 @@ won't update every console in existence) but it's more of a hassle to do. Also,
|
||||
/obj/machinery/computer/rdconsole/core
|
||||
name = "Core R&D Console"
|
||||
desc = "A console used to interface with R&D tools."
|
||||
id = 1
|
||||
id = 1
|
||||
|
||||
Reference in New Issue
Block a user