Deconflict

This commit is contained in:
variableundefined
2019-09-11 23:00:13 -04:00
122 changed files with 1161 additions and 846 deletions
+2 -2
View File
@@ -54,7 +54,7 @@ var/global/nologevent = 0
///////////////////////////////////////////////////////////////////////////////////////////////Panels
/datum/admins/proc/show_player_panel(var/mob/M in GLOB.mob_list)
set category = "Admin"
set category = null
set name = "Show Player Panel"
set desc="Edit player (respawn, ban, heal, etc)"
@@ -937,9 +937,9 @@ var/global/nologevent = 0
message_admins("[key_name_admin(usr)] checked the AI laws")
/client/proc/update_mob_sprite(mob/living/carbon/human/H as mob)
set category = "Admin"
set name = "Update Mob Sprite"
set desc = "Should fix any mob sprite update errors."
set category = null
if(!check_rights(R_ADMIN))
return
+4 -5
View File
@@ -71,13 +71,12 @@ var/list/admin_verbs_admin = list(
/client/proc/alt_check,
/client/proc/secrets,
/client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */
/client/proc/change_human_appearance_self, /* Allows the human-based mob itself change its basic appearance */
/client/proc/change_human_appearance_self, /* Allows the human-based mob itself to change its basic appearance */
/client/proc/debug_variables,
/client/proc/reset_all_tcs, /*resets all telecomms scripts*/
/client/proc/toggle_mentor_chat,
/client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/
/client/proc/list_ssds,
/client/proc/list_afks,
/client/proc/list_ssds_afks,
/client/proc/cmd_admin_headset_message,
/client/proc/spawn_floor_cluwne,
/client/proc/show_discord_duplicates, // This needs removing at some point, ingame discord linking got removed in #11359
@@ -803,7 +802,7 @@ var/list/admin_verbs_ticket = list(
/client/proc/change_human_appearance_admin(mob/living/carbon/human/H in GLOB.mob_list)
set name = "C.M.A. - Admin"
set desc = "Allows you to change the mob appearance"
set category = "Admin"
set category = null
if(!check_rights(R_ADMIN))
return
@@ -829,7 +828,7 @@ var/list/admin_verbs_ticket = list(
/client/proc/change_human_appearance_self(mob/living/carbon/human/H in GLOB.mob_list)
set name = "C.M.A. - Self"
set desc = "Allows the mob to change its appearance"
set category = "Admin"
set category = null
if(!check_rights(R_ADMIN))
return
@@ -12,12 +12,12 @@
/client/proc/resolveAllAdminTickets()
set name = "Resolve All Open Admin Tickets"
set category = "Admin"
set category = null
if(!holder || !check_rights(R_ADMIN))
return
if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes")
if(alert("Are you sure you want to resolve ALL open admin tickets?","Resolve all open admin tickets?","Yes","No") != "Yes")
return
SStickets.resolveAllOpenTickets()
@@ -12,12 +12,12 @@
/client/proc/resolveAllMentorTickets()
set name = "Resolve All Open Mentor Tickets"
set category = "Admin"
set category = null
if(!holder || !check_rights(R_ADMIN))
return
if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes")
if(alert("Are you sure you want to resolve ALL open mentor tickets?","Resolve all open mentor tickets?","Yes","No") != "Yes")
return
SSmentor_tickets.resolveAllOpenTickets()
+1 -9
View File
@@ -37,7 +37,7 @@
return
var/ticketID = text2num(href_list["openmentorticket"])
SSmentor_tickets.showDetailUI(usr, ticketID)
if(href_list["stickyban"])
stickyban(href_list["stickyban"],href_list)
@@ -169,14 +169,6 @@
message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom IP and computer id fields replaced with the IP and computer id from the located mob")
DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid )
if(BANTYPE_PERMA)
add_note(banckey, "Permanently Banned - [banreason]", null, usr.ckey, 0)
else if(BANTYPE_TEMP)
add_note(banckey, "Banned for [banduration] minutes - [banreason]", null, usr.ckey, 0)
else if(BANTYPE_JOB_PERMA)
add_note(banckey, "Banned from [banjob] - [banreason]", null, usr.ckey, 0)
else
add_note(banckey, "[banreason]", null, usr.ckey, 0)
else if(href_list["editrights"])
+1 -1
View File
@@ -30,7 +30,7 @@
/client/proc/jumptoturf(var/turf/T in world)
set name = "Jump to Turf"
set category = "Admin"
set category = null
if(!check_rights(R_ADMIN))
return
+4 -4
View File
@@ -191,7 +191,7 @@
else
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
to_chat(X, "<span class='boldnotice'>[type]: [key_name(src, TRUE, type)]-&gt;[key_name(C, TRUE, type)]: [emoji_msg]</span>")
//Check if the mob being PM'd has any open admin tickets.
var/tickets = list()
if(type == "Mentorhelp")
@@ -205,10 +205,10 @@
if(type == "Mentorhelp")
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets
tickets = SSmentor_tickets.checkForTicket(src)
else // Ahelp
else // Ahelp
if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets
tickets = SStickets.checkForTicket(src)
if(tickets)
for(var/datum/ticket/i in tickets)
i.addResponse(src, msg)
@@ -351,7 +351,7 @@
var/client/C = pms[title].client || update_client(title)
if(!C)
return "[title] (Disconnected)"
return "[key_name(C, FALSE)] ([ADMIN_QUE(C.mob,"?")]) ([ADMIN_PP(C.mob,"PP")]) ([ADMIN_VV(C.mob,"VV")]) ([ADMIN_SM(C.mob,"SM")]) ([admin_jump_link(C.mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>)"
return "[key_name(C, FALSE)] ([ADMIN_QUE(C.mob,"?")]) ([ADMIN_PP(C.mob,"PP")]) ([ADMIN_VV(C.mob,"VV")]) ([ADMIN_TP(C.mob,"TP")]) ([ADMIN_SM(C.mob,"SM")]) ([admin_jump_link(C.mob)])"
/datum/pm_tracker/proc/update_client(title)
var/client/C = GLOB.directory[ckey(title)]
+2 -2
View File
@@ -7,8 +7,8 @@
////////////////////////////////////////////////////////////////////////////////
var/global/list/frozen_mob_list = list()
/client/proc/freeze(var/mob/living/M as mob in GLOB.mob_list)
set category = "Admin"
set name = "Freeze"
set category = null
if(!check_rights(R_ADMIN))
return
@@ -87,8 +87,8 @@ var/global/list/frozen_mob_list = list()
//////////////////////////Freeze Mech
/client/proc/freezemecha(var/obj/mecha/O as obj in GLOB.mechas_list)
set category = "Admin"
set name = "Freeze Mech"
set category = null
if(!check_rights(R_ADMIN))
return
+6 -6
View File
@@ -30,7 +30,7 @@
deity = SSticker.cultdat.entity_name
log_say("(PRAYER) [msg]", usr)
msg = "<span class='notice'>[bicon(cross)]<b><font color=[font_color]>[prayer_type][deity ? " (to [deity])" : ""][mind && mind.isholy ? " (blessings: [mind.num_blessed])" : ""]:</font> [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_SC(src,"SC")]) (<A HREF='?_src_=holder;Bless=[UID()]'>BLESS</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b> [msg]</span>"
msg = "<span class='notice'>[bicon(cross)]<b><font color=[font_color]>[prayer_type][deity ? " (to [deity])" : ""][mind && mind.isholy ? " (blessings: [mind.num_blessed])" : ""]:</font> [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_TP(src,"TP")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) ([ADMIN_SC(src,"SC")]) (<A HREF='?_src_=holder;Bless=[UID()]'>BLESS</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b> [msg]</span>"
for(var/client/X in GLOB.admins)
if(check_rights(R_EVENT,0,X.mob))
@@ -41,7 +41,7 @@
/proc/Centcomm_announce(var/text , var/mob/Sender)
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
msg = "<span class='boldnotice'><font color=orange>CENTCOMM: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")])):</span> [msg]"
msg = "<span class='boldnotice'><font color=orange>CENTCOMM: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")])):</span> [msg]"
for(var/client/X in GLOB.admins)
if(R_EVENT & X.holder.rights)
to_chat(X, msg)
@@ -50,7 +50,7 @@
/proc/Syndicate_announce(var/text , var/mob/Sender)
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
msg = "<span class='boldnotice'><font color='#DC143C'>SYNDICATE: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_SYNDICATE_REPLY(Sender,"RPLY")]):</span> [msg]"
msg = "<span class='boldnotice'><font color='#DC143C'>SYNDICATE: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_SYNDICATE_REPLY(Sender,"RPLY")]):</span> [msg]"
for(var/client/X in GLOB.admins)
if(check_rights(R_EVENT,0,X.mob))
to_chat(X, msg)
@@ -59,7 +59,7 @@
/proc/HONK_announce(var/text , var/mob/Sender)
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
msg = "<span class='boldnotice'><font color=pink>HONK: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;HONKReply=[Sender.UID()]'>RPLY</A>):</span> [msg]"
msg = "<span class='boldnotice'><font color=pink>HONK: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;HONKReply=[Sender.UID()]'>RPLY</A>):</span> [msg]"
for(var/client/X in GLOB.admins)
if(R_EVENT & X.holder.rights)
to_chat(X, msg)
@@ -68,7 +68,7 @@
/proc/ERT_Announce(var/text , var/mob/Sender, var/repeat_warning)
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
msg = "<span class='adminnotice'><b><font color=orange>ERT REQUEST: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;ErtReply=[Sender.UID()]'>RESPOND</A>):</b> [msg]</span>"
msg = "<span class='adminnotice'><b><font color=orange>ERT REQUEST: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;ErtReply=[Sender.UID()]'>RESPOND</A>):</b> [msg]</span>"
if(repeat_warning)
msg += "<BR><span class='adminnotice'><b>WARNING: ERT request has gone 5 minutes with no reply!</b></span>"
for(var/client/X in GLOB.admins)
@@ -80,7 +80,7 @@
/proc/Nuke_request(text , mob/Sender)
var/nuke_code = get_nuke_code()
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
msg = "<span class='adminnotice'><b><font color=orange>NUKE CODE REQUEST: </font>[key_name(Sender)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")]):</b> [msg]</span>"
msg = "<span class='adminnotice'><b><font color=orange>NUKE CODE REQUEST: </font>[key_name(Sender)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")]):</b> [msg]</span>"
for(var/client/X in GLOB.admins)
if(check_rights(R_EVENT,0,X.mob))
to_chat(X, msg)
+13 -24
View File
@@ -776,8 +776,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_check_contents(mob/living/M as mob in GLOB.mob_list)
set category = "Admin"
set name = "Check Contents"
set category = null
if(!check_rights(R_ADMIN))
return
@@ -957,21 +957,24 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(usr)] reset NTTC scripts.")
feedback_add_details("admin_verb","RAT2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/list_ssds()
/client/proc/list_ssds_afks()
set category = "Admin"
set name = "List SSDs"
set desc = "Lists SSD players"
set name = "List SSDs and AFKs"
set desc = "Lists SSD and AFK players"
if(!check_rights(R_ADMIN))
return
var/msg = "<html><head><title>SSD Report</title></head><body>"
/* ======== SSD Section ========= */
var/msg = "<html><head><title>SSD & AFK Report</title></head><body>"
msg += "SSD Players:<BR><TABLE border='1'>"
msg += "<TR><TD><B>Key</B></TD><TD><B>Real Name</B></TD><TD><B>Job</B></TD><TD><B>Mins SSD</B></TD><TD><B>Special Role</B></TD><TD><B>Area</B></TD><TD><B>PPN</B></TD><TD><B>Cryo</B></TD></TR>"
var/mins_ssd
var/job_string
var/key_string
var/role_string
var/obj_count = 0
var/obj_string = ""
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
if(!isLivingSSD(H))
continue
@@ -984,8 +987,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(job_string in command_positions)
job_string = "<U>" + job_string + "</U>"
role_string = "-"
var/obj_count = 0
var/obj_string = ""
if(H.mind)
if(H.mind.special_role)
role_string = "<U>[H.mind.special_role]</U>"
@@ -1003,24 +1004,12 @@ Traitors and the like can also be revived with the previous role mostly intact.
else
msg += "<TD><A href='?_src_=holder;cryossd=[H.UID()]'>Cryo</A></TD>"
msg += "</TR>"
msg += "</TABLE></BODY></HTML>"
src << browse(msg, "window=Player_ssd_check")
msg += "</TABLE><br></BODY></HTML>"
/client/proc/list_afks()
set category = "Admin"
set name = "List AFKs"
set desc = "Lists AFK players"
if(!check_rights(R_ADMIN))
return
var/msg = "<html><head><title>AFK Report</title></head><body>"
/* ======== AFK Section ========= */
msg += "AFK Players:<BR><TABLE border='1'>"
msg += "<TR><TD><B>Key</B></TD><TD><B>Real Name</B></TD><TD><B>Job</B></TD><TD><B>Mins AFK</B></TD><TD><B>Special Role</B></TD><TD><B>Area</B></TD><TD><B>PPN</B></TD><TD><B>Cryo</B></TD></TR>"
var/mins_afk
var/job_string
var/key_string
var/role_string
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
if(H.client == null || H.stat == DEAD) // No clientless or dead
continue
@@ -1035,8 +1024,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(job_string in command_positions)
job_string = "<U>" + job_string + "</U>"
role_string = "-"
var/obj_count = 0
var/obj_string = ""
obj_count = 0
obj_string = ""
if(H.mind)
if(H.mind.special_role)
role_string = "<U>[H.mind.special_role]</U>"
@@ -1055,7 +1044,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
msg += "<TD><A href='?_src_=holder;cryossd=[H.UID()];cryoafk=1'>Cryo</A></TD>"
msg += "</TR>"
msg += "</TABLE></BODY></HTML>"
src << browse(msg, "window=Player_afk_check")
src << browse(msg, "window=Player_ssd_afk_check;size=600x300")
/client/proc/toggle_ert_calling()
set category = "Event"
+5
View File
@@ -95,3 +95,8 @@
// Has the client been varedited by an admin? [Inherits from datum now]
// var/var_edited = FALSE
var/client_keysend_amount = 0
var/next_keysend_reset = 0
var/next_keysend_trip_reset = 0
var/keysend_tripped = FALSE
+44 -1
View File
@@ -3,7 +3,46 @@
/client/verb/keyDown(_key as text)
set instant = TRUE
set hidden = TRUE
client_keysend_amount += 1
var/cache = client_keysend_amount
if(keysend_tripped && next_keysend_trip_reset <= world.time)
keysend_tripped = FALSE
if(next_keysend_reset <= world.time)
client_keysend_amount = 0
next_keysend_reset = world.time + (1 SECONDS)
//The "tripped" system is to confirm that flooding is still happening after one spike
//not entirely sure how byond commands interact in relation to lag
//don't want to kick people if a lag spike results in a huge flood of commands being sent
if(cache >= MAX_KEYPRESS_AUTOKICK)
if(!keysend_tripped)
keysend_tripped = TRUE
next_keysend_trip_reset = world.time + (2 SECONDS)
else
log_admin("Client [ckey] was just autokicked for flooding keysends; likely abuse but potentially lagspike.")
message_admins("Client [ckey] was just autokicked for flooding keysends; likely abuse but potentially lagspike.")
QDEL_IN(src, 1)
return
///Check if the key is short enough to even be a real key
if(LAZYLEN(_key) > MAX_KEYPRESS_COMMANDLENGTH)
to_chat(src, "<span class='userdanger'>Invalid KeyDown detected! You have been disconnected from the server automatically.</span>")
log_admin("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.")
message_admins("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.")
QDEL_IN(src, 1)
return
//offset by 1 because the buffer address is 0 indexed because the math was simpler
keys_held[current_key_address + 1] = _key
//the time a key was pressed isn't actually used anywhere (as of 2019-9-10) but this allows easier access usage/checking
keys_held[_key] = world.time
current_key_address = ((current_key_address + 1) % HELD_KEY_BUFFER_LENGTH)
var/movement = SSinput.movement_keys[_key]
if (prefs.toggles & AZERTY) movement = SSinput.alt_movement_keys[_key]
if(!(next_move_dir_sub & movement) && !keys_held["Ctrl"])
@@ -40,7 +79,11 @@
/client/verb/keyUp(_key as text)
set instant = TRUE
set hidden = TRUE
keys_held -= _key
//Can't just do a remove because it would alter the length of the rolling buffer, instead search for the key then null it out if it exists
for(var/i in 1 to HELD_KEY_BUFFER_LENGTH)
if(keys_held[i] == _key)
keys_held[i] = null
break
var/movement = SSinput.movement_keys[_key]
if (prefs.toggles & AZERTY) movement = SSinput.alt_movement_keys[_key]
if(!(next_move_dir_add & movement))
+15 -5
View File
@@ -1,9 +1,14 @@
/client
var/list/keys_held = list() // A list of any keys held currently
// These next two vars are to apply movement for keypresses and releases made while move delayed.
// Because discarding that input makes the game less responsive.
var/next_move_dir_add // On next move, add this dir to the move that would otherwise be done
var/next_move_dir_sub // On next move, subtract this dir from the move that would otherwise be done
/// A rolling buffer of any keys held currently
var/list/keys_held = list()
///used to keep track of the current rolling buffer position
var/current_key_address = 0
/// These next two vars are to apply movement for keypresses and releases made while move delayed.
/// Because discarding that input makes the game less responsive.
/// On next move, add this dir to the move that would otherwise be done
var/next_move_dir_add
/// On next move, subtract this dir from the move that would otherwise be done
var/next_move_dir_sub
// Set a client's focus to an object and override these procs on that object to let it handle keypresses
@@ -31,6 +36,11 @@
/client/proc/set_macros()
set waitfor = FALSE
//Reset and populate the rolling buffer
keys_held.Cut()
for(var/i in 1 to HELD_KEY_BUFFER_LENGTH)
keys_held += null
erase_all_macros()
var/list/macro_sets = SSinput.macro_sets
@@ -213,13 +213,13 @@
if("winter") //Snow terrain is slow to move in and cold! Get the assistants to shovel your driveway.
NewTerrainFloors = /turf/simulated/floor/snow // Needs to be updated after turf update
NewTerrainWalls = /turf/simulated/wall/mineral/wood
NewTerrainChairs = /obj/structure/chair/wood/normal
NewTerrainChairs = /obj/structure/chair/wood
NewTerrainTables = /obj/structure/table/glass
NewFlora = list(/obj/structure/flora/grass/green, /obj/structure/flora/grass/brown, /obj/structure/flora/grass/both)
if("jungle") //Beneficial due to actually having breathable air. Plus, monkeys and bows and arrows.
NewTerrainFloors = /turf/simulated/floor/grass
NewTerrainWalls = /turf/simulated/wall/mineral/sandstone
NewTerrainChairs = /obj/structure/chair/wood/normal
NewTerrainChairs = /obj/structure/chair/wood
NewTerrainTables = /obj/structure/table/wood
NewFlora = list(/obj/structure/flora/ausbushes/sparsegrass, /obj/structure/flora/ausbushes/fernybush, /obj/structure/flora/ausbushes/leafybush,
/obj/structure/flora/ausbushes/grassybush, /obj/structure/flora/ausbushes/sunnybush, /obj/structure/flora/tree/palm, /mob/living/carbon/human/monkey,
@@ -14,8 +14,6 @@
var/custom_pixel_x_offset = 0 //for admin fuckery.
var/custom_pixel_y_offset = 0
pass_flags = PASSTABLE
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120 //120 kPa difference required to throw
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/New()
@@ -8,6 +8,7 @@
heal_rate = 5
large = 1
ventcrawler = 0
pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper.
/mob/living/carbon/alien/humanoid/queen/New()
create_reagents(100)
@@ -1,5 +1,6 @@
/mob/living/carbon
gender = MALE
pressure_resistance = 15
var/list/stomach_contents = list()
var/list/internal_organs = list()
var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access.
@@ -500,11 +500,12 @@ emp_act
return
/mob/living/carbon/human/experience_pressure_difference(pressure_difference, direction)
playsound(src, 'sound/effects/space_wind.ogg', 50, 1)
if(shoes)
if(istype(shoes,/obj/item/clothing/shoes/magboots) && (shoes.flags & NOSLIP)) //TODO: Make a not-shit shoe var system to negate airflow.
return 0
..()
playsound(src, 'sound/effects/space_wind.ogg', 50, TRUE)
if(shoes && istype(shoes, /obj/item/clothing))
var/obj/item/clothing/S = shoes
if (S.flags & NOSLIP)
return FALSE
return ..()
/mob/living/carbon/human/water_act(volume, temperature, source, method = TOUCH)
. = ..()
@@ -2,7 +2,7 @@ var/global/default_martial_art = new/datum/martial_art
/mob/living/carbon/human
hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPMINDSHIELD_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,GLAND_HUD)
pressure_resistance = 25
//Marking colour and style
var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000.
var/list/m_styles = DEFAULT_MARKING_STYLES //All markings set to None.
+30
View File
@@ -604,6 +604,34 @@
else
return pick("trails_1", "trails_2")
/mob/living/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0)
if(buckled)
return
if(client && client.move_delay >= world.time + world.tick_lag * 2)
pressure_resistance_prob_delta -= 30
var/list/turfs_to_check = list()
if(has_limbs)
var/turf/T = get_step(src, angle2dir(dir2angle(direction) + 90))
if (T)
turfs_to_check += T
T = get_step(src, angle2dir(dir2angle(direction) - 90))
if(T)
turfs_to_check += T
for(var/t in turfs_to_check)
T = t
if(T.density)
pressure_resistance_prob_delta -= 20
continue
for(var/atom/movable/AM in T)
if(AM.density && AM.anchored)
pressure_resistance_prob_delta -= 20
break
..(pressure_difference, direction, pressure_resistance_prob_delta)
/*//////////////////////
START RESIST PROCS
@@ -617,6 +645,8 @@
return
changeNext_move(CLICK_CD_RESIST)
SEND_SIGNAL(src, COMSIG_LIVING_RESIST, src)
if(!restrained())
if(resist_grab())
return
+2 -1
View File
@@ -1,5 +1,6 @@
/mob/living
see_invisible = SEE_INVISIBLE_LIVING
pressure_resistance = 10
//Health and life related vars
var/maxHealth = 100 //Maximum health that should be possible.
@@ -65,7 +66,7 @@
hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
var/list/status_effects //a list of all status effects the mob has
var/deathgasp_on_death = FALSE
var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added
@@ -252,7 +252,7 @@
modules += new /obj/item/soap/nanotrasen(src)
modules += new /obj/item/storage/bag/trash/cyborg(src)
modules += new /obj/item/mop/advanced/cyborg(src)
modules += new /obj/item/lightreplacer(src)
modules += new /obj/item/lightreplacer/cyborg(src)
modules += new /obj/item/holosign_creator(src)
emag = new /obj/item/reagent_containers/spray(src)
@@ -544,7 +544,7 @@
modules += new /obj/item/crowbar/cyborg(src)
modules += new /obj/item/wirecutters/cyborg(src)
modules += new /obj/item/multitool/cyborg(src)
modules += new /obj/item/lightreplacer(src)
modules += new /obj/item/lightreplacer/cyborg(src)
modules += new /obj/item/gripper(src)
modules += new /obj/item/matter_decompiler(src)
modules += new /obj/item/reagent_containers/spray/cleaner/drone(src)
@@ -562,10 +562,6 @@
/obj/item/robot_module/drone/respawn_consumable(mob/living/silicon/robot/R)
var/obj/item/reagent_containers/spray/cleaner/C = locate() in modules
C.reagents.add_reagent("cleaner", 3)
var/obj/item/lightreplacer/LR = locate() in modules
LR.Charge(R)
..()
@@ -9,7 +9,6 @@
modtype = "Syndicate"
req_access = list(access_syndicate)
ionpulse = 1
magpulse = 1
lawchannel = "State"
var/playstyle_string = "<span class='userdanger'>You are a Syndicate assault cyborg!</span><br>\
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
@@ -80,7 +79,7 @@
var/datum/action/thermals = new /datum/action/innate/robot_sight/thermal()
thermals.Grant(src)
/mob/living/silicon/robot/syndicate/saboteur/verb/modify_name()
set name = "Modify Name"
set desc = "Change your systems' registered name to fool Nanotrasen systems. No cost."
@@ -16,8 +16,6 @@
faction = list("syndicate")
shoot_sound = 'sound/weapons/wave.ogg'
anchored = 1
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120
window_id = "syndiebot"
window_name = "Syndicate Bot Interface"
var/turf/saved_turf
@@ -18,6 +18,7 @@
minbodytemp = 0
faction = list("cult")
flying = 1
pressure_resistance = 100
universal_speak = 1
AIStatus = AI_OFF //normal constructs don't have AI
var/const_type = "shade"
@@ -24,8 +24,6 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
heat_damage_per_tick = 20
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120 //120 kPa difference required to throw
faction = list("alien")
status_flags = CANPUSH
minbodytemp = 0
@@ -30,6 +30,7 @@
faction = list("carp")
flying = 1
pressure_resistance = 200
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
var/carp_color = "carp" //holder for icon set
@@ -18,7 +18,7 @@
attack_sound = 'sound/creatures/headcrab_attack.ogg'
speak_emote = list("hisses")
var/is_zombie = 0
stat_attack = UNCONSCIOUS //so they continue to attack when they are on the ground.
stat_attack = DEAD //so they continue to attack when they are on the ground.
var/host_species = ""
var/list/human_overlays = list()
@@ -132,7 +132,7 @@
. = ..()
if(.)
var/mob/living/L = target
if (istype(L))
if(istype(L))
L.adjust_fire_stacks(0.1)
L.IgniteMob()
@@ -141,5 +141,12 @@
damage_type = BURN
nodamage = FALSE
/obj/item/projectile/temp/basilisk/icewing/on_hit(atom/target, blocked = FALSE)
. = ..()
if(.)
var/mob/living/L = target
if(istype(L))
L.apply_status_effect(/datum/status_effect/freon/watcher)
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril
fromtendril = TRUE
@@ -46,7 +46,7 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
pressure_resistance = 300
faction = list("undead") // did I mention ghost
loot = list(/obj/item/reagent_containers/food/snacks/ectoplasm)
del_on_death = 1
@@ -49,10 +49,6 @@ var/global/list/ts_spiderling_list = list()
// '1' (default for most simple_mobs, including terror spiders) converts to 3.5, or 2.8 tiles/sec.
// '2' converts to 4.5, or 2.2 tiles/sec.
// Atmos
pressure_resistance = 50 //50 kPa difference required to push
throw_pressure_limit = 100 //100 kPa difference required to throw
// Ventcrawling
ventcrawler = 1 // allows player ventcrawling
var/ai_ventcrawls = TRUE
+5
View File
@@ -556,6 +556,11 @@
genemutcheck(src, block,null, MUTCHK_FORCED)
dna.UpdateSE()
///////////////////////////////// FROZEN /////////////////////////////////////
/mob/living/proc/IsFrozen()
return has_status_effect(/datum/status_effect/freon)
///////////////////////////////////// STUN ABSORPTION /////////////////////////////////////
/mob/living/proc/add_stun_absorption(key, duration, priority, message, self_message, examine_message)
+1 -1
View File
@@ -89,7 +89,7 @@
else if((fall_over || resting) && !lying)
fall(fall_over)
canmove = !(fall_over || resting || stunned || buckled)
canmove = !(fall_over || resting || stunned || IsFrozen() || buckled)
density = !lying
if(lying)
if(layer == initial(layer))
+1 -1
View File
@@ -9,7 +9,7 @@
throw_range = 2
throw_speed = 1
layer = 4
pressure_resistance = 1
pressure_resistance = 2
attack_verb = list("bapped")
var/amount = 0 //Amount of items clipped to the paper. Note: If you have 2 paper, this should be 1
var/page = 1
+1 -4
View File
@@ -303,10 +303,7 @@
//Light replacer code
if(istype(W, /obj/item/lightreplacer))
var/obj/item/lightreplacer/LR = W
if(isliving(user))
var/mob/living/U = user
LR.ReplaceLight(src, U)
return
LR.ReplaceLight(src, user)
// attempt to insert light
if(istype(W, /obj/item/light))
@@ -79,7 +79,7 @@
holds_charge = TRUE
unique_frequency = TRUE
/obj/item/gun/energy/kinetic_accelerator/New()
/obj/item/gun/energy/kinetic_accelerator/Initialize(mapload)
. = ..()
if(!holds_charge)
empty()
@@ -98,8 +98,7 @@
if(!QDELING(src) && !holds_charge)
// Put it on a delay because moving item from slot to hand
// calls dropped().
spawn(2)
empty_if_not_held()
addtimer(CALLBACK(src, .proc/empty_if_not_held), 2)
/obj/item/gun/energy/kinetic_accelerator/proc/empty_if_not_held()
if(!ismob(loc))
@@ -143,17 +142,17 @@
overheat = FALSE
/obj/item/gun/energy/kinetic_accelerator/update_icon()
overlays.Cut()
cut_overlays()
if(empty_state && !can_shoot())
overlays += empty_state
add_overlay(empty_state)
if(gun_light && can_flashlight)
var/iconF = "flight"
if(gun_light.on)
iconF = "flight_on"
overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset))
if(bayonet && can_bayonet)
overlays += knife_overlay
add_overlay(knife_overlay)
/obj/item/gun/energy/kinetic_accelerator/experimental
@@ -165,12 +165,18 @@
/obj/item/gun/energy/plasmacutter/attackby(obj/item/A, mob/user)
if(istype(A, /obj/item/stack/sheet/mineral/plasma))
if(power_supply.charge >= power_supply.maxcharge)
to_chat(user,"<span class='notice'>[src] is already fully charged.")
return
var/obj/item/stack/sheet/S = A
S.use(1)
power_supply.give(1000)
on_recharge()
to_chat(user, "<span class='notice'>You insert [A] in [src], recharging it.</span>")
else if(istype(A, /obj/item/stack/ore/plasma))
if(power_supply.charge >= power_supply.maxcharge)
to_chat(user,"<span class='notice'>[src] is already fully charged.")
return
var/obj/item/stack/ore/S = A
S.use(1)
power_supply.give(500)
+4 -2
View File
@@ -10,7 +10,6 @@
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
hitsound = 'sound/weapons/pierce.ogg'
var/hitsound_wall = ""
pressure_resistance = INFINITY
burn_state = LAVA_PROOF
var/def_zone = "" //Aiming at
var/mob/firer = null//Who shot it
@@ -98,7 +97,7 @@
var/turf/simulated/wall/W = target_loca
if(impact_effect_type)
new impact_effect_type(target_loca, hitx, hity)
W.add_dent(WALL_DENT_SHOT, hitx, hity)
return 0
if(alwayslog)
@@ -334,3 +333,6 @@ obj/item/projectile/Crossed(atom/movable/AM, oldloc) //A mob moving on a tile wi
/obj/item/projectile/proc/setAngle(new_angle) //wrapper for overrides.
Angle = new_angle
return TRUE
/obj/item/projectile/experience_pressure_difference()
return
@@ -362,7 +362,6 @@
drink_icon = "cubalibreglass"
drink_name = "Cuba Libre"
drink_desc = "A classic mix of rum and cola."
taste_description = "fruity alcohol"
taste_description = "liberation"
/datum/reagent/consumable/ethanol/whiskey_cola
@@ -5,6 +5,7 @@
reagent_state = SOLID
color = "#FFFFFF"
can_synth = FALSE
taste_mult = 0
/datum/reagent/spider_eggs/on_mob_life(mob/living/M)
if(volume > 2.5)
@@ -20,6 +21,7 @@
description = "Microscopic construction robots."
color = "#535E66" // rgb: 83, 94, 102
can_synth = FALSE
taste_mult = 0
/datum/reagent/nanomachines/on_mob_life(mob/living/carbon/M)
if(volume > 1.5)
@@ -33,6 +35,7 @@
description = "Microbes with an entirely alien cellular structure."
color = "#535E66" // rgb: 83, 94, 102
can_synth = FALSE
taste_mult = 0
/datum/reagent/xenomicrobes/on_mob_life(mob/living/carbon/M)
if(volume > 1.5)
@@ -45,6 +48,7 @@
description = "Active fungal spores."
color = "#92D17D" // rgb: 146, 209, 125
can_synth = FALSE
taste_mult = 0
/datum/reagent/fungalspores/on_mob_life(mob/living/carbon/M)
if(volume > 2.5)
@@ -58,6 +62,7 @@
reagent_state = SOLID
color = "#FA0000" // rgb: 250, 0, 0
can_synth = FALSE
taste_mult = 0
/datum/reagent/jagged_crystals/on_mob_life(mob/living/carbon/M)
M.ForceContractDisease(new /datum/disease/berserker(0))
@@ -70,6 +75,7 @@
reagent_state = LIQUID
color = "#1E4600"
can_synth = FALSE
taste_mult = 0
/datum/reagent/salmonella/on_mob_life(mob/living/carbon/M)
M.ForceContractDisease(new /datum/disease/food_poisoning(0))
@@ -82,6 +88,7 @@
reagent_state = LIQUID
color = "#FF0000"
can_synth = FALSE
taste_mult = 0
/datum/reagent/gibbis/on_mob_life(mob/living/carbon/M)
if(volume > 2.5)
@@ -95,6 +102,7 @@
reagent_state = LIQUID
color = "#FFFFFF"
can_synth = FALSE
taste_mult = 0
/datum/reagent/prions/on_mob_life(mob/living/carbon/M)
if(volume > 4.5)
@@ -108,6 +116,7 @@
reagent_state = LIQUID
color = "#465046"
can_synth = FALSE
taste_mult = 0
/datum/reagent/grave_dust/on_mob_life(mob/living/carbon/M)
if(volume > 4.5)
@@ -121,6 +130,7 @@
reagent_state = LIQUID
color = "#F7E6B1"
can_synth = FALSE
taste_description = "bacon"
/datum/reagent/bacon_grease/on_mob_life(mob/living/carbon/M)
if(volume > 4.5)
@@ -134,6 +144,7 @@
reagent_state = SOLID
color = "#925D6C"
can_synth = FALSE
taste_mult = 0
/datum/reagent/heartworms/on_mob_life(mob/living/carbon/M)
if(volume > 4.5)
@@ -152,6 +163,7 @@
reagent_state = LIQUID
color = "#AB1CCF"
can_synth = FALSE
taste_mult = 0
/datum/reagent/concentrated_initro/on_mob_life(mob/living/M)
if(volume >= 5)
@@ -170,6 +182,7 @@
reagent_state = LIQUID
nutriment_factor = 2 * REAGENTS_METABOLISM
color = "#899613" // rgb: 137, 150, 19
taste_description = "watery milk"
/datum/reagent/mutagen/mutagenvirusfood
name = "mutagenic agar"
@@ -198,4 +211,4 @@
/datum/reagent/plasma_dust/plasmavirusfood/weak
name = "weakened virus plasma"
id = "weakplasmavirusfood"
color = "#CEC3C6" // rgb: 206,195,198
color = "#CEC3C6" // rgb: 206,195,198
@@ -1,18 +1,3 @@
/datum/reagent/serotrotium
name = "Serotrotium"
id = "serotrotium"
description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans."
reagent_state = LIQUID
color = "#202040" // rgb: 20, 20, 40
metabolization_rate = 0.25 * REAGENTS_METABOLISM
/datum/reagent/serotrotium/on_mob_life(mob/living/M)
if(ishuman(M))
if(prob(7))
M.emote(pick("twitch","drool","moan","gasp"))
return ..()
/datum/reagent/lithium
name = "Lithium"
id = "lithium"
@@ -170,6 +155,7 @@
color = "#60A584" // rgb: 96, 165, 132
overdose_threshold = 20
addiction_chance = 50
taste_description = "bitterness"
/datum/reagent/crank/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -475,7 +461,7 @@
reagent_state = LIQUID
color = "#644600"
addiction_chance = 30
taste_description = "puke... or worse"
taste_description = "the inside of a toilet... or worse"
/datum/reagent/jenkem/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -491,6 +477,7 @@
description = "An illegal performance enhancing drug. Side effects might include chest pain, seizures, swelling, headache, fever... ... ..."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
taste_description = "bitterness"
/datum/reagent/aranesp/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -515,6 +502,7 @@
description = "A mild psychoactive chemical extracted from the cannabis plant."
reagent_state = LIQUID
color = "#0FBE0F"
taste_description = "man like, totally the best like, thing ever dude"
/datum/reagent/thc/on_mob_life(mob/living/M)
M.stuttering += rand(0,2)
@@ -697,7 +685,7 @@
process_flags = SYNTHETIC
overdose_threshold = 20
addiction_chance = 50
taste_description = "silicone"
taste_description = "silicon"
/datum/reagent/surge/on_mob_life(mob/living/M)
@@ -25,6 +25,8 @@
reagent_state = SOLID
nutriment_factor = 15 * REAGENTS_METABOLISM
color = "#664330" // rgb: 102, 67, 48
var/brute_heal = 1
var/burn_heal = 0
/datum/reagent/consumable/nutriment/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -33,10 +35,8 @@
var/mob/living/carbon/human/H = M
if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients
if(prob(50))
update_flags |= M.adjustBruteLoss(-1, FALSE)
if(!(NO_BLOOD in H.dna.species.species_traits))//do not restore blood on things with no blood by nature.
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
H.blood_volume += 0.4
update_flags |= M.adjustBruteLoss(-brute_heal, FALSE)
update_flags |= M.adjustFireLoss(-burn_heal, FALSE)
return ..() | update_flags
/datum/reagent/consumable/nutriment/on_new(list/supplied_data)
@@ -66,36 +66,26 @@
id = "protein"
description = "Various essential proteins and fats commonly found in animal flesh and blood."
diet_flags = DIET_CARN | DIET_OMNI
taste_description = "meat" //TODO: Remove
/datum/reagent/consumable/nutriment/plantmatter // Plant-based biomatter, digestable by herbivores and omnivores, worthless to carnivores
name = "Plant-matter"
id = "plantmatter"
description = "Vitamin-rich fibers and natural sugars commonly found in fresh produce."
diet_flags = DIET_HERB | DIET_OMNI
taste_description = "vegetables" //TODO: Remove
/datum/reagent/consumable/vitamin
/datum/reagent/consumable/nutriment/vitamin
name = "Vitamin"
id = "vitamin"
description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form."
reagent_state = SOLID
color = "#664330" // rgb: 102, 67, 48
taste_description = "nutrition"
brute_heal = 1
burn_heal = 1
/datum/reagent/consumable/vitamin/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
if(prob(50))
update_flags |= M.adjustBruteLoss(-1, FALSE)
update_flags |= M.adjustFireLoss(-1, FALSE)
/datum/reagent/consumable/nutriment/vitamin/on_mob_life(mob/living/M)
if(M.satiety < 600)
M.satiety += 30
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!(NO_BLOOD in H.dna.species.species_traits))//do not restore blood on things with no blood by nature.
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
H.blood_volume += 0.5
return ..() | update_flags
return ..()
/datum/reagent/consumable/sugar
name = "Sugar"
@@ -1,6 +1,7 @@
/datum/reagent/medicine
name = "Medicine"
id = "medicine"
taste_description = "bitterness"
/datum/reagent/medicine/on_mob_life(mob/living/M)
current_cycle++
@@ -290,11 +291,6 @@
addiction_chance = 5
taste_description = "health"
/datum/reagent/medicine/omnizine/godblood
name = "Godblood"
description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power."
overdose_threshold = 150
/datum/reagent/medicine/omnizine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
update_flags |= M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
@@ -728,7 +724,7 @@
id = "mannitol"
description = "Mannitol is a sugar alcohol that can help alleviate cranial swelling."
color = "#D1D1F1"
taste_description = "neurogenisis"
taste_description = "sweetness"
/datum/reagent/medicine/mannitol/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -786,6 +782,7 @@
description = "Increases run speed and eliminates stuns, can heal minor damage. If overdosed it will deal toxin damage and stun."
color = "#C8A5DC"
can_synth = FALSE
taste_description = "<span class='userdanger'>an unstoppable force</span>"
/datum/reagent/medicine/stimulants/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -962,6 +959,12 @@
metabolization_rate = 0.1
taste_description = "faint hope"
/datum/reagent/medicine/omnizine_diluted/godblood
name = "Godblood"
id = "godblood"
description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power."
overdose_threshold = 150
/datum/reagent/medicine/omnizine_diluted/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
update_flags |= M.adjustToxLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
@@ -614,6 +614,7 @@
description = "A potent alchemic ingredient."
reagent_state = LIQUID
color = "#092D09"
taste_description = "alchemy"
/datum/reagent/woolbat
name = "Wool of bat"
@@ -621,6 +622,7 @@
description = "A potent alchemic ingredient."
reagent_state = LIQUID
color = "#080808"
taste_description = "alchemy"
/datum/reagent/tonguedog
name = "Tongue of dog"
@@ -628,6 +630,7 @@
description = "A potent alchemic ingredient."
reagent_state = LIQUID
color = "#2D0909"
taste_description = "alchemy"
/datum/reagent/triplepiss
name = "Triplepiss"
@@ -635,6 +638,7 @@
description = "Ewwwwwwwww."
reagent_state = LIQUID
color = "#857400"
taste_description = "alchemy"
/datum/reagent/spraytan
name = "Spray Tan"
@@ -5,6 +5,7 @@
reagent_state = LIQUID
color = "#FFAF00"
process_flags = ORGANIC | SYNTHETIC
taste_description = "burning"
var/temp_fire = 4000
var/temp_deviance = 1000
var/size_divisor = 40
@@ -49,6 +50,7 @@
reagent_state = LIQUID
process_flags = ORGANIC | SYNTHETIC
color = "#C86432"
taste_description = "burning"
/datum/reagent/napalm/reaction_temperature(exposed_temperature, exposed_volume)
if(exposed_temperature > T0C + 100)
@@ -253,6 +255,7 @@
description = "Sends everything flying from the detonation point."
reagent_state = LIQUID
color = "#FFA500"
taste_description = "air and bitterness"
/datum/reagent/sorium/reaction_turf(turf/T, volume) // oh no
if(prob(75))
@@ -269,7 +272,7 @@
description = "Sucks everything into the detonation point."
reagent_state = LIQUID
color = "#800080"
taste_description = "the end of the world"
taste_description = "compressed bitterness"
/datum/reagent/liquid_dark_matter/reaction_turf(turf/T, volume) //Oh gosh, why
if(prob(75))
@@ -302,6 +305,7 @@
reagent_state = LIQUID
color = "#FFFF00"
penetrates_skin = TRUE
taste_description = "salt"
/datum/reagent/smoke_powder
name = "Smoke Powder"
@@ -309,6 +313,7 @@
description = "Makes a large cloud of smoke that can carry reagents."
reagent_state = LIQUID
color = "#808080"
taste_description = "smoke"
/datum/reagent/sonic_powder
name = "Sonic Powder"
@@ -317,6 +322,7 @@
reagent_state = LIQUID
color = "#0000FF"
penetrates_skin = TRUE
taste_description = "loud noises"
/datum/reagent/cryostylane
name = "Cryostylane"
@@ -324,6 +330,7 @@
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K."
color = "#B2B2FF" // rgb: 139, 166, 233
process_flags = ORGANIC | SYNTHETIC
taste_description = "bitterness"
/datum/reagent/cryostylane/on_mob_life(mob/living/M) //TODO: code freezing into an ice cube
if(M.reagents.has_reagent("oxygen"))
@@ -358,6 +365,7 @@
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly heats all other reagents."
color = "#B20000" // rgb: 139, 166, 233
process_flags = ORGANIC | SYNTHETIC
taste_description = "bitterness"
/datum/reagent/pyrosium/on_mob_life(mob/living/M)
if(M.reagents.has_reagent("oxygen"))
@@ -380,6 +388,7 @@
reagent_state = LIQUID
color = "#A0A090"
var/cooling_temperature = 3 // more effective than water
taste_description = "the inside of a fire extinguisher"
/datum/reagent/firefighting_foam/reaction_mob(mob/living/M, method=TOUCH, volume)
// Put out fire
@@ -5,6 +5,7 @@
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
taste_mult = 1.2
taste_description = "bitterness"
/datum/reagent/toxin/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -17,6 +18,7 @@
description = "A toxic venom injected by spacefaring arachnids."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
taste_description = "bitterness"
/datum/reagent/spider_venom/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -81,6 +83,7 @@
reagent_state = LIQUID
color = "#13BC5E" // rgb: 19, 188, 94
can_synth = FALSE
taste_description = "slime"
/datum/reagent/aslimetoxin/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method != TOUCH)
@@ -95,7 +98,6 @@
color = "#484848" // rgb: 72, 72, 72
metabolization_rate = 0.2
penetrates_skin = TRUE
taste_description = "metal"
taste_mult = 0 // elemental mercury is tasteless
/datum/reagent/mercury/on_mob_life(mob/living/M)
@@ -127,7 +129,7 @@
color = "#6A6054"
penetrates_skin = TRUE
process_flags = ORGANIC | SYNTHETIC
taste_description = "spicy freshness"
taste_description = "acid"
/datum/reagent/fluorine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -142,6 +144,7 @@
reagent_state = SOLID
color = "#C7C7C7" // rgb: 199,199,199
penetrates_skin = TRUE
taste_description = "the colour blue and regret"
/datum/reagent/radium/on_mob_life(mob/living/M)
if(M.radiation < 80)
@@ -160,6 +163,7 @@
color = "#04DF27"
metabolization_rate = 0.3
taste_mult = 0.9
taste_description = "slime"
/datum/reagent/mutagen/reaction_mob(mob/living/M, method=TOUCH, volume)
if(!..())
@@ -186,6 +190,7 @@
description = "Just the regular, boring sort of mutagenic compound. Works in a completely predictable manner."
reagent_state = LIQUID
color = "#7DFF00"
taste_description = "slime"
/datum/reagent/stable_mutagen/on_mob_life(mob/living/M)
if(!ishuman(M) || !M.dna)
@@ -251,6 +256,7 @@
reagent_state = SOLID
color = "#B8B8C0" // rgb: 184, 184, 192
taste_mult = 0
taste_description = "the inside of a reactor"
/datum/reagent/uranium/on_mob_life(mob/living/M)
M.apply_effect(2, IRRADIATE, negate_armor = 1)
@@ -268,6 +274,7 @@
reagent_state = LIQUID
color = "#52685D"
metabolization_rate = 0.2
taste_description = "sweetness"
/datum/reagent/lexorin/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -332,6 +339,7 @@
description = "A deadly neurotoxin produced by the dreaded spess carp."
reagent_state = LIQUID
color = "#003333" // rgb: 0, 51, 51
taste_description = "fish"
/datum/reagent/carpotoxin/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -345,6 +353,7 @@
reagent_state = LIQUID
color = "#6E2828"
data = 13
taste_description = "bitterness"
/datum/reagent/staminatoxin/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -358,6 +367,7 @@
id = "spore"
description = "A natural toxin produced by blob spores that inhibits vision when ingested."
color = "#9ACD32"
taste_description = "bitterness"
/datum/reagent/spores/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -376,6 +386,7 @@
drink_name = "Beer glass"
drink_desc = "A freezing pint of beer"
taste_description = "beer"
taste_description = "piss water"
/datum/reagent/beer2/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -487,6 +498,7 @@
reagent_state = LIQUID
color = "#DED6D0"
penetrates_skin = TRUE
taste_description = "bitterness"
/datum/reagent/formaldehyde/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -504,6 +516,7 @@
metabolization_rate = 0.2
overdose_threshold = 40
can_synth = FALSE
taste_mult = 0
/datum/reagent/venom/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -529,6 +542,7 @@
reagent_state = LIQUID
color = "#60A584"
metabolization_rate = 1
taste_mult = 0
/datum/reagent/neurotoxin2/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -593,6 +607,7 @@
color = "#B0B0B0"
metabolization_rate = 0.3
penetrates_skin = TRUE
taste_description = "prickliness"
/datum/reagent/itching_powder/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_STAT
@@ -806,6 +821,7 @@
reagent_state = LIQUID
color = "#6BA688"
metabolization_rate = 0.1
taste_mult = 0
/datum/reagent/sulfonal/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -871,6 +887,7 @@
color = "#C2D8CD"
metabolization_rate = 0.05
can_synth = FALSE
taste_mult = 0
/datum/reagent/coniine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -886,6 +903,7 @@
color = "#191919"
metabolization_rate = 0.1
penetrates_skin = TRUE
taste_mult = 0
/datum/reagent/curare/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -919,6 +937,7 @@
reagent_state = LIQUID
color = "#C8C8C8" //RGB: 200, 200, 200
metabolization_rate = 0.2 * REAGENTS_METABOLISM
taste_mult = 0
/datum/reagent/heparin/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -993,6 +1012,7 @@
reagent_state = LIQUID
color = "#d3cf50"
var/lethality = 0 //Glyphosate is non-toxic to people
taste_description = "bitterness"
/datum/reagent/glyphosate/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -1045,6 +1065,7 @@
id = "pestkiller"
description = "A harmful toxic mixture to kill pests. Do not ingest!"
color = "#4B004B" // rgb: 75, 0, 75
taste_description = "bitterness"
/datum/reagent/pestkiller/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -1125,6 +1146,7 @@
description = "A filthy, carcinogenic sludge produced by the Slurrypod plant."
reagent_state = LIQUID
color = "#00C81E"
taste_description = "slime"
/datum/reagent/toxic_slurry/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -1143,6 +1165,7 @@
description = "This is probably not good for you."
reagent_state = LIQUID
color = "#00FD00"
taste_description = "slime"
/datum/reagent/glowing_slurry/reaction_mob(mob/living/M, method=TOUCH, volume) //same as mutagen
if(!..())
@@ -246,7 +246,7 @@
description = "Filthy water scoured from a nasty toilet bowl. Absolutely disgusting."
reagent_state = LIQUID
color = "#757547"
taste_description = "puke"
taste_description = "the inside of a toilet... or worse"
/datum/reagent/fishwater/toiletwater/reaction_mob(mob/living/M, method=TOUCH, volume) //For shennanigans
return
@@ -391,7 +391,7 @@
process_flags = ORGANIC | SYNTHETIC //Admin-bus has no brakes! KILL THEM ALL.
metabolization_rate = 1
can_synth = FALSE
taste_description = "admin abuse"
taste_description = "burning"
/datum/reagent/hellwater/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -38,7 +38,7 @@
return
last_process = world.time
to_chat(user, "<span class='notice'>The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards.</span>")
user.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood, 20)
user.reagents.add_reagent("godblood", 20)
update_icon()
addtimer(CALLBACK(src, .proc/update_icon), time_between_uses)
-1
View File
@@ -100,7 +100,6 @@
icon = 'icons/vehicles/CargoTrain.dmi'
icon_state = "ambulance"
anchored = FALSE
throw_pressure_limit = INFINITY //Throwing an ambulance trolley can kill the process scheduler.
/obj/structure/bed/amb_trolley/examine(mob/user)
. = ..()