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:
GunHog
2014-11-09 12:27:48 -06:00
286 changed files with 6373 additions and 4842 deletions
+8 -2
View File
@@ -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>"
+2 -2
View File
@@ -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>"
+5 -3
View File
@@ -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>")
+14 -2
View File
@@ -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()
+7 -3
View File
@@ -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]]")
+48 -34
View File
@@ -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]]")
+1 -1
View File
@@ -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
+18
View File
@@ -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!
+2 -1
View File
@@ -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'
)
)
+10 -2
View File
@@ -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
+6 -6
View File
@@ -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()
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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)
+6
View File
@@ -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."
+5
View File
@@ -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
+13 -4
View File
@@ -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
..()
+16 -1
View File
@@ -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
+3 -2
View File
@@ -1636,7 +1636,7 @@ ________________________________________________________________________________
dat += "Body Temperature: [U.bodytemperature-T0C]&deg;C ([U.bodytemperature*1.8-459.67]&deg;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)
+2 -1
View File
@@ -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)
+49 -65
View File
@@ -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
..()
+13 -4
View File
@@ -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()
+1 -1
View File
@@ -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
+6
View File
@@ -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
+5 -4
View File
@@ -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
+3 -3
View File
@@ -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
-45
View File
@@ -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)
+2 -100
View File
@@ -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
+3 -2
View File
@@ -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
+11 -26
View File
@@ -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)
+62 -165
View File
@@ -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
+63 -156
View File
@@ -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.
+62 -6
View File
@@ -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.
+134 -1
View File
@@ -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
+13 -44
View File
@@ -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
+2 -1
View File
@@ -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
+56 -137
View File
@@ -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)
+58 -1
View File
@@ -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
View File
@@ -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]")
-171
View File
@@ -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
+1 -1
View File
@@ -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 //
/////////////////////////////
+1 -1
View File
@@ -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))
+3 -1
View File
@@ -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
View File
@@ -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.
+5 -3
View File
@@ -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
-4
View File
@@ -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
+31 -29
View File
@@ -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)
+3 -3
View File
@@ -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
+36 -79
View File
@@ -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
+94 -21
View File
@@ -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
+53 -41
View File
@@ -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
+11 -1
View File
@@ -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)
+24 -2
View File
@@ -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))
+22 -1
View File
@@ -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)
+5 -8
View File
@@ -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