diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index dd54aea2e92..ec34b6632f3 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -249,7 +249,7 @@ CREATE TABLE `player` (
`volume` smallint(4) DEFAULT '100',
`nanoui_fancy` smallint(4) DEFAULT '1',
`show_ghostitem_attack` smallint(4) DEFAULT '1',
- `lastchangelog` varchar(32) NOT NULL,
+ `lastchangelog` varchar(32) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`)
) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1;
diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql
index 453554f5c69..b5115a93caf 100644
--- a/SQL/paradise_schema_prefixed.sql
+++ b/SQL/paradise_schema_prefixed.sql
@@ -249,7 +249,7 @@ CREATE TABLE `SS13_player` (
`volume` smallint(4) DEFAULT '100',
`nanoui_fancy` smallint(4) DEFAULT '1',
`show_ghostitem_attack` smallint(4) DEFAULT '1',
- `lastchangelog` varchar(32) NOT NULL,
+ `lastchangelog` varchar(32) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`)
) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1;
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index e1965cf701e..889a0824f35 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -270,4 +270,75 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul
. = 0
break
if(progress)
- qdel(progbar)
\ No newline at end of file
+ qdel(progbar)
+
+/proc/admin_mob_info(mob/M, mob/user = usr)
+ if(!ismob(M))
+ to_chat(user, "This can only be used on instances of type /mob")
+ return
+
+ var/location_description = ""
+ var/special_role_description = ""
+ var/health_description = ""
+ var/gender_description = ""
+ var/turf/T = get_turf(M)
+
+ //Location
+ if(isturf(T))
+ if(isarea(T.loc))
+ location_description = "([M.loc == T ? "at coordinates " : "in [M.loc] at coordinates "] [T.x], [T.y], [T.z] in area [T.loc])"
+ else
+ location_description = "([M.loc == T ? "at coordinates " : "in [M.loc] at coordinates "] [T.x], [T.y], [T.z])"
+
+ //Job + antagonist
+ if(M.mind)
+ special_role_description = "Role: [M.mind.assigned_role]; Antagonist: [M.mind.special_role]; Has been rev: [(M.mind.has_been_rev)?"Yes":"No"]"
+ else
+ special_role_description = "Role: Mind datum missing Antagonist: Mind datum missing; Has been rev: Mind datum missing;"
+
+ //Health
+ if(isliving(M))
+ var/mob/living/L = M
+ var/status
+ switch(M.stat)
+ if(CONSCIOUS)
+ status = "Alive"
+ if(UNCONSCIOUS)
+ status = "Unconscious"
+ if(DEAD)
+ status = "Dead"
+ health_description = "Status = [status]"
+ health_description += "
Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()]"
+ else
+ health_description = "This mob type has no health to speak of."
+
+ //Gener
+ switch(M.gender)
+ if(MALE, FEMALE)
+ gender_description = "[M.gender]"
+ else
+ gender_description = "[M.gender]"
+
+ to_chat(user, "Info about [M.name]: ")
+ to_chat(user, "Mob type = [M.type]; Gender = [gender_description] Damage = [health_description]")
+ to_chat(user, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];")
+ to_chat(user, "Location = [location_description];")
+ to_chat(user, "[special_role_description]")
+ to_chat(user, "(PM) (PP) (VV) (SM) (FLW) (CA)")
+
+// Gets the first mob contained in an atom, and warns the user if there's not exactly one
+/proc/get_mob_in_atom_with_warning(atom/A, mob/user = usr)
+ if(!istype(A))
+ return null
+ if(ismob(A))
+ return A
+
+ . = null
+ for(var/mob/M in A)
+ if(!.)
+ . = M
+ else
+ to_chat(user, "Multiple mobs in [A], using first mob found...")
+ break
+ if(!.)
+ to_chat(user, "No mob located in [A].")
diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm
index 869ee83ff9c..d04abfe5a87 100644
--- a/code/_onclick/observer.dm
+++ b/code/_onclick/observer.dm
@@ -25,6 +25,21 @@
return
var/list/modifiers = params2list(params)
+ if(check_rights(R_ADMIN, 0)) // Admin click shortcuts
+ var/mob/M
+ if(modifiers["shift"] && modifiers["ctrl"])
+ client.debug_variables(A)
+ return
+ if(modifiers["ctrl"])
+ M = get_mob_in_atom_with_warning(A)
+ if(M)
+ client.holder.show_player_panel(M)
+ return
+ if(modifiers["shift"] && modifiers["middle"])
+ M = get_mob_in_atom_with_warning(A)
+ if(M)
+ admin_mob_info(M)
+ return
if(modifiers["shift"])
ShiftClickOn(A)
return
diff --git a/code/controllers/Processes/vote.dm b/code/controllers/Processes/vote.dm
deleted file mode 100644
index 47cf079eeba..00000000000
--- a/code/controllers/Processes/vote.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-/datum/controller/process/vote/setup()
- name = "vote"
- schedule_interval = 10 // every second
- log_startup_progress("Voting ticker starting up.")
-
-/datum/controller/process/vote/doWork()
- vote.process()
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index 25b038554cc..3aa638aa40f 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -18,7 +18,7 @@
return
-/client/proc/debug_controller(controller in list("Master","failsafe","Ticker","Air","Lighting","Jobs","Sun","Radio","Configuration","pAI", "Cameras","Garbage", "Transfer Controller","Event","Alarm","Scheduler","Nano"))
+/client/proc/debug_controller(controller in list("Master","failsafe","Ticker","Air","Lighting","Jobs","Sun","Radio","Configuration","pAI", "Cameras","Garbage", "Transfer Controller","Event","Alarm","Scheduler","Nano","Vote"))
set category = "Debug"
set name = "Debug Controller"
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
@@ -73,6 +73,9 @@
if("Nano")
debug_variables(nanomanager)
feedback_add_details("admin_verb","DNano")
+ if("Vote")
+ debug_variables(vote)
+ feedback_add_details("admin_verb","DVote")
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
return
diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm
index 52c976ec470..451fdbd99e3 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -2,7 +2,7 @@ var/datum/controller/vote/vote = new()
var/global/list/round_voters = list() //Keeps track of the individuals voting for a given round, for use in forcedrafting.
-datum/controller/vote
+/datum/controller/vote
var/initiator = null
var/started_time = null
var/time_remaining = 0
@@ -14,340 +14,395 @@ datum/controller/vote
var/list/current_votes = list()
var/auto_muted = 0
- New()
- if(vote != src)
- if(istype(vote))
- qdel(vote)
- vote = src
+/datum/controller/vote/New()
+ if(vote != src)
+ if(istype(vote))
+ qdel(vote)
+ vote = src
+ spawn(0)
+ while(!gcDestroyed)
+ try
+ while(!gcDestroyed)
+ sleep(10)
+ process()
+ catch(var/exception/e)
+ log_runtime(e, src, "Caught in vote controller")
- proc/process() //called by master_controller
- if(mode)
- // No more change mode votes after the game has started.
- // 3 is GAME_STATE_PLAYING, but that #define is undefined for some reason
- if(mode == "gamemode" && ticker.current_state >= 2)
- to_chat(world, "Voting aborted due to game start.")
- src.reset()
- return
+/datum/controller/vote/proc/process()
+ if(mode)
+ // No more change mode votes after the game has started.
+ if(mode == "gamemode" && ticker.current_state >= GAME_STATE_SETTING_UP)
+ to_chat(world, "Voting aborted due to game start.")
+ reset()
+ return
- // Calculate how much time is remaining by comparing current time, to time of vote start,
- // plus vote duration
- time_remaining = round((started_time + config.vote_period - world.time)/10)
+ // Calculate how much time is remaining by comparing current time, to time of vote start,
+ // plus vote duration
+ time_remaining = round((started_time + config.vote_period - world.time)/10)
- if(time_remaining < 0)
- result()
- for(var/client/C in voting)
- if(C)
- C << browse(null,"window=vote;can_close=0")
- reset()
- else
- for(var/client/C in voting)
- if(C)
- C << browse(vote.interface(C),"window=vote;can_close=0")
+ if(time_remaining < 0)
+ result()
+ for(var/client/C in voting)
+ if(C)
+ C << browse(null,"window=vote")
+ reset()
+ else
+ for(var/client/C in voting)
+ update_panel(C)
+ CHECK_TICK
- voting.Cut()
+/datum/controller/vote/proc/autotransfer()
+ initiate_vote("crew_transfer","the server")
- proc/autotransfer()
- initiate_vote("crew_transfer","the server")
+/datum/controller/vote/proc/reset()
+ initiator = null
+ time_remaining = 0
+ mode = null
+ question = null
+ choices.Cut()
+ voted.Cut()
+ voting.Cut()
+ current_votes.Cut()
- proc/reset()
- initiator = null
- time_remaining = 0
- mode = null
- question = null
- choices.Cut()
- voted.Cut()
- voting.Cut()
- current_votes.Cut()
-
- if(auto_muted && !config.ooc_allowed)
- auto_muted = 0
- config.ooc_allowed = !( config.ooc_allowed )
- to_chat(world, "The OOC channel has been automatically enabled due to vote end.")
- log_admin("OOC was toggled automatically due to vote end.")
- message_admins("OOC has been toggled on automatically.")
+ if(auto_muted && !config.ooc_allowed)
+ auto_muted = 0
+ config.ooc_allowed = !( config.ooc_allowed )
+ to_chat(world, "The OOC channel has been automatically enabled due to vote end.")
+ log_admin("OOC was toggled automatically due to vote end.")
+ message_admins("OOC has been toggled on automatically.")
- proc/get_result()
- //get the highest number of votes
- var/greatest_votes = 0
- var/total_votes = 0
+/datum/controller/vote/proc/get_result()
+ var/greatest_votes = 0
+ var/total_votes = 0
+ var/list/sorted_choices = list()
+ var/sorted_highest
+ var/sorted_votes = -1
+ //get the highest number of votes, while also sorting the list
+ while(choices.len)
+ // This is a very inefficient sorting method, but that's okay
for(var/option in choices)
var/votes = choices[option]
- total_votes += votes
+ if(sorted_votes < votes)
+ sorted_highest = option
+ sorted_votes = votes
if(votes > greatest_votes)
greatest_votes = votes
- //default-vote for everyone who didn't vote
- if(!config.vote_no_default && choices.len)
- var/non_voters = (clients.len - total_votes)
- if(non_voters > 0)
- if(mode == "restart")
- choices["Continue Playing"] += non_voters
- if(choices["Continue Playing"] >= greatest_votes)
- greatest_votes = choices["Continue Playing"]
- else if(mode == "gamemode")
- if(master_mode in choices)
- choices[master_mode] += non_voters
- if(choices[master_mode] >= greatest_votes)
- greatest_votes = choices[master_mode]
- else if(mode == "crew_transfer")
- var/factor = 0.5
- switch(world.time / (10 * 60)) // minutes
- if(0 to 60)
- factor = 0.5
- if(61 to 120)
- factor = 0.8
- if(121 to 240)
- factor = 1
- if(241 to 300)
- factor = 1.2
- else
- factor = 1.4
- choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor)
- to_chat(world, "Crew Transfer Factor: [factor]")
- greatest_votes = max(choices["Initiate Crew Transfer"], choices["Continue The Round"])
-
-
- //get all options with that many votes and return them in a list
- . = list()
- if(greatest_votes)
- for(var/option in choices)
- if(choices[option] == greatest_votes)
- . += option
- return .
-
- proc/announce_result()
- var/list/winners = get_result()
- var/text
- if(winners.len > 0)
- if(winners.len > 1)
- if(mode != "gamemode" || ticker.hide_mode == 0) // Here we are making sure we don't announce potential game modes
- text = "Vote Tied Between:\n"
- for(var/option in winners)
- text += "\t[option]\n"
- . = pick(winners)
-
- for(var/key in current_votes)
- if(choices[current_votes[key]] == .)
- round_voters += key // Keep track of who voted for the winning round.
- if((mode == "gamemode" && . == "extended") || ticker.hide_mode == 0) // Announce Extended gamemode, but not other gamemodes
- text += "Vote Result: [.]"
- else
- if(mode != "gamemode")
- text += "Vote Result: [.]"
- else
- text += "The vote has ended." // What will be shown if it is a gamemode vote that isn't extended
-
- else
- text += "Vote Result: Inconclusive - No Votes!"
- log_vote(text)
- to_chat(world, "[text]")
- return .
-
- proc/result()
- . = announce_result()
- var/restart = 0
- if(.)
- switch(mode)
- if("restart")
- if(. == "Restart Round")
- restart = 1
- if("gamemode")
- if(master_mode != .)
- world.save_mode(.)
- if(ticker && ticker.mode)
- restart = 1
- else
- master_mode = .
- if(!going)
- going = 1
- to_chat(world, "The round will start soon.")
- if("crew_transfer")
- if(. == "Initiate Crew Transfer")
- init_shift_change(null, 1)
-
-
- if(restart)
- world.Reboot("Restart vote successful.", "end_error", "restart vote")
-
- return .
-
- proc/submit_vote(var/ckey, var/vote)
- if(mode)
- if(config.vote_no_dead && usr.stat == DEAD && !usr.client.holder)
- return 0
- if(current_votes[ckey])
- choices[choices[current_votes[ckey]]]--
- if(vote && 1<=vote && vote<=choices.len)
- voted += usr.ckey
- choices[choices[vote]]++ //check this
- current_votes[ckey] = vote
- return vote
- return 0
-
- proc/initiate_vote(var/vote_type, var/initiator_key)
- if(!mode)
- if(started_time != null && !check_rights(R_ADMIN))
- var/next_allowed_time = (started_time + config.vote_delay)
- if(next_allowed_time > world.time)
- return 0
-
- reset()
- switch(vote_type)
- if("restart")
- choices.Add("Restart Round","Continue Playing")
- if("gamemode")
- if(ticker.current_state >= 2)
- return 0
- choices.Add(config.votable_modes)
- if("crew_transfer")
- if(check_rights(R_ADMIN|R_MOD))
- if(ticker.current_state <= 2)
- return 0
- question = "End the shift?"
- choices.Add("Initiate Crew Transfer", "Continue The Round")
+ sorted_votes = -1
+ total_votes += choices[sorted_highest]
+ sorted_choices[sorted_highest] = choices[sorted_highest] || 0
+ choices -= sorted_highest
+ choices = sorted_choices
+ //default-vote for everyone who didn't vote
+ if(!config.vote_no_default && choices.len)
+ var/non_voters = (clients.len - total_votes)
+ if(non_voters > 0)
+ if(mode == "restart")
+ choices["Continue Playing"] += non_voters
+ if(choices["Continue Playing"] >= greatest_votes)
+ greatest_votes = choices["Continue Playing"]
+ else if(mode == "gamemode")
+ if(master_mode in choices)
+ choices[master_mode] += non_voters
+ if(choices[master_mode] >= greatest_votes)
+ greatest_votes = choices[master_mode]
+ else if(mode == "crew_transfer")
+ var/factor = 0.5
+ switch(world.time / (10 * 60)) // minutes
+ if(0 to 60)
+ factor = 0.5
+ if(61 to 120)
+ factor = 0.8
+ if(121 to 240)
+ factor = 1
+ if(241 to 300)
+ factor = 1.2
else
- if(ticker.current_state <= 2)
- return 0
- question = "End the shift?"
- choices.Add("Initiate Crew Transfer", "Continue The Round")
- if("custom")
- question = html_encode(input(usr,"What is the vote for?") as text|null)
- if(!question) return 0
- for(var/i=1,i<=10,i++)
- var/option = capitalize(html_encode(input(usr,"Please enter an option or hit cancel to finish") as text|null))
- if(!option || mode || !usr.client) break
- choices.Add(option)
- else return 0
- mode = vote_type
- initiator = initiator_key
- started_time = world.time
- var/text = "[capitalize(mode)] vote started by [initiator]."
- if(mode == "custom")
- text += "\n[question]"
-
- log_vote(text)
- to_chat(world, "[text]\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote.")
- switch(vote_type)
- if("crew_transfer")
- world << sound('sound/ambience/alarm4.ogg')
- if("gamemode")
- world << sound('sound/ambience/alarm4.ogg')
- if("custom")
- world << sound('sound/ambience/alarm4.ogg')
- if(mode == "gamemode" && going)
- going = 0
- to_chat(world, "Round start has been delayed.")
- if(mode == "crew_transfer" && config.ooc_allowed)
- auto_muted = 1
- config.ooc_allowed = !( config.ooc_allowed )
- to_chat(world, "The OOC channel has been automatically disabled due to a crew transfer vote.")
- log_admin("OOC was toggled automatically due to crew_transfer vote.")
- message_admins("OOC has been toggled off automatically.")
- if(mode == "gamemode" && config.ooc_allowed)
- auto_muted = 1
- config.ooc_allowed = !( config.ooc_allowed )
- to_chat(world, "The OOC channel has been automatically disabled due to the gamemode vote.")
- log_admin("OOC was toggled automatically due to gamemode vote.")
- message_admins("OOC has been toggled off automatically.")
- if(mode == "custom" && config.ooc_allowed)
- auto_muted = 1
- config.ooc_allowed = !( config.ooc_allowed )
- to_chat(world, "The OOC channel has been automatically disabled due to a custom vote.")
- log_admin("OOC was toggled automatically due to custom vote.")
- message_admins("OOC has been toggled off automatically.")
+ factor = 1.4
+ choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor)
+ to_chat(world, "Crew Transfer Factor: [factor]")
+ greatest_votes = max(choices["Initiate Crew Transfer"], choices["Continue The Round"])
+ //get all options with that many votes and return them in a list
+ . = list()
+ if(greatest_votes)
+ for(var/option in choices)
+ if(choices[option] == greatest_votes)
+ . += option
+ return .
+/datum/controller/vote/proc/announce_result()
+ var/list/winners = get_result()
+ var/text
+ if(winners.len > 0)
+ if(winners.len > 1)
+ if(mode != "gamemode" || ticker.hide_mode == 0) // Here we are making sure we don't announce potential game modes
+ text = "Vote Tied Between:\n"
+ for(var/option in winners)
+ text += "\t[option]\n"
+ . = pick(winners)
- time_remaining = round(config.vote_period/10)
- return 1
- return 0
-
- proc/interface(var/client/C)
- if(!C) return
- var/admin = check_rights(R_ADMIN,0)
- voting |= C
-
- . = "
Voting Panel"
- if(mode)
- if(question) . += "Vote: '[question]'
"
- else . += "Vote: [capitalize(mode)]
"
- . += "Time Left: [time_remaining] s
"
- if(admin)
- . += "(Cancel Vote) "
+ for(var/key in current_votes)
+ if(choices[current_votes[key]] == .)
+ round_voters += key // Keep track of who voted for the winning round.
+ if(mode == "gamemode" && (. == "extended" || ticker.hide_mode == 0)) // Announce Extended gamemode, but not other gamemodes
+ text += "Vote Result: [.] ([choices[.]] vote\s)"
else
- . += "Start a vote:
- "
- //restart
- if(admin || config.allow_vote_restart)
- . += "Restart"
+ if(mode == "custom")
+ // Completely replace text to show all results in custom votes
+ text = "[question]\n"
+ for(var/option in winners)
+ text += "\t[option]: [choices[option]] vote\s\n"
+ for(var/option in (choices-winners))
+ text += "\t[option]: [choices[option]] vote\s\n"
+ else if(mode != "gamemode")
+ text += "Vote Result: [.] ([choices[.]] vote\s)"
else
- . += "Restart (Disallowed)"
- . += "
- "
- if(admin || config.allow_vote_restart)
- . += "Crew Transfer"
- else
- . += "Crew Transfer (Disallowed)"
- if(admin)
- . += "\t([config.allow_vote_restart?"Allowed":"Disallowed"])"
- . += "
- "
- //gamemode
- if(admin || config.allow_vote_mode)
- . += "GameMode"
- else
- . += "GameMode (Disallowed)"
- if(admin)
- . += "\t([config.allow_vote_mode?"Allowed":"Disallowed"])"
+ text += "The vote has ended." // What will be shown if it is a gamemode vote that isn't extended
- . += "
"
- //custom
- if(admin)
- . += "- Custom
"
- . += "
"
- . += "Close"
- return .
+ else
+ text += "Vote Result: Inconclusive - No Votes!"
+ log_vote(text)
+ to_chat(world, "[text]")
+ return .
-
- Topic(href,href_list[],hsrc)
- if(!usr || !usr.client) return //not necessary but meh...just in-case somebody does something stupid
- var/admin = check_rights(R_ADMIN,0)
- switch(href_list["vote"])
- if("close")
- voting -= usr.client
- usr << browse(null, "window=vote")
- return
- if("cancel")
- if(admin)
- reset()
- if("toggle_restart")
- if(admin)
- config.allow_vote_restart = !config.allow_vote_restart
- if("toggle_gamemode")
- if(admin)
- config.allow_vote_mode = !config.allow_vote_mode
+/datum/controller/vote/proc/result()
+ . = announce_result()
+ var/restart = 0
+ if(.)
+ switch(mode)
if("restart")
- if(config.allow_vote_restart || admin)
- initiate_vote("restart",usr.key)
+ if(. == "Restart Round")
+ restart = 1
if("gamemode")
- if(config.allow_vote_mode || admin)
- initiate_vote("gamemode",usr.key)
+ if(master_mode != .)
+ world.save_mode(.)
+ if(ticker && ticker.mode)
+ restart = 1
+ else
+ master_mode = .
+ if(!going)
+ going = 1
+ to_chat(world, "The round will start soon.")
if("crew_transfer")
- if(config.allow_vote_restart || admin)
- initiate_vote("crew_transfer",usr.key)
+ if(. == "Initiate Crew Transfer")
+ init_shift_change(null, 1)
+
+
+ if(restart)
+ world.Reboot("Restart vote successful.", "end_error", "restart vote")
+
+ return .
+
+/datum/controller/vote/proc/submit_vote(var/ckey, var/vote)
+ if(mode)
+ if(config.vote_no_dead && usr.stat == DEAD && !usr.client.holder)
+ return 0
+ if(current_votes[ckey])
+ choices[choices[current_votes[ckey]]]--
+ if(vote && 1<=vote && vote<=choices.len)
+ voted += usr.ckey
+ choices[choices[vote]]++ //check this
+ current_votes[ckey] = vote
+ return vote
+ return 0
+
+/datum/controller/vote/proc/initiate_vote(var/vote_type, var/initiator_key)
+ if(!mode)
+ if(started_time != null && !check_rights(R_ADMIN))
+ var/next_allowed_time = (started_time + config.vote_delay)
+ if(next_allowed_time > world.time)
+ return 0
+
+ reset()
+ switch(vote_type)
+ if("restart")
+ choices.Add("Restart Round","Continue Playing")
+ if("gamemode")
+ if(ticker.current_state >= 2)
+ return 0
+ choices.Add(config.votable_modes)
+ if("crew_transfer")
+ if(check_rights(R_ADMIN|R_MOD))
+ if(ticker.current_state <= 2)
+ return 0
+ question = "End the shift?"
+ choices.Add("Initiate Crew Transfer", "Continue The Round")
+ else
+ if(ticker.current_state <= 2)
+ return 0
+ question = "End the shift?"
+ choices.Add("Initiate Crew Transfer", "Continue The Round")
if("custom")
- if(admin)
- initiate_vote("custom",usr.key)
+ question = html_encode(input(usr,"What is the vote for?") as text|null)
+ if(!question) return 0
+ for(var/i=1,i<=10,i++)
+ var/option = capitalize(html_encode(input(usr,"Please enter an option or hit cancel to finish") as text|null))
+ if(!option || mode || !usr.client) break
+ choices.Add(option)
else
- submit_vote(usr.ckey, round(text2num(href_list["vote"])))
- usr.vote()
+ return 0
+ mode = vote_type
+ initiator = initiator_key
+ started_time = world.time
+ var/text = "[capitalize(mode)] vote started by [initiator]."
+ if(mode == "custom")
+ text += "\n[question]"
+ if(usr)
+ log_admin("[capitalize(mode)] ([question]) vote started by [key_name(usr)].")
+ else if(usr)
+ log_admin("[capitalize(mode)] vote started by [key_name(usr)].")
+
+ log_vote(text)
+ to_chat(world, {"[text]
+ Click here or type vote to place your vote.
+ You have [config.vote_period/10] seconds to vote."})
+ switch(vote_type)
+ if("crew_transfer")
+ world << sound('sound/ambience/alarm4.ogg')
+ if("gamemode")
+ world << sound('sound/ambience/alarm4.ogg')
+ if("custom")
+ world << sound('sound/ambience/alarm4.ogg')
+ if(mode == "gamemode" && going)
+ going = 0
+ to_chat(world, "Round start has been delayed.")
+ if(mode == "crew_transfer" && config.ooc_allowed)
+ auto_muted = 1
+ config.ooc_allowed = !( config.ooc_allowed )
+ to_chat(world, "The OOC channel has been automatically disabled due to a crew transfer vote.")
+ log_admin("OOC was toggled automatically due to crew_transfer vote.")
+ message_admins("OOC has been toggled off automatically.")
+ if(mode == "gamemode" && config.ooc_allowed)
+ auto_muted = 1
+ config.ooc_allowed = !( config.ooc_allowed )
+ to_chat(world, "The OOC channel has been automatically disabled due to the gamemode vote.")
+ log_admin("OOC was toggled automatically due to gamemode vote.")
+ message_admins("OOC has been toggled off automatically.")
+ if(mode == "custom" && config.ooc_allowed)
+ auto_muted = 1
+ config.ooc_allowed = !( config.ooc_allowed )
+ to_chat(world, "The OOC channel has been automatically disabled due to a custom vote.")
+ log_admin("OOC was toggled automatically due to custom vote.")
+ message_admins("OOC has been toggled off automatically.")
+
+ time_remaining = round(config.vote_period/10)
+ return 1
+ return 0
+
+/datum/controller/vote/proc/browse_to(var/client/C)
+ if(!C)
+ return
+ var/admin = check_rights(R_ADMIN, 0, user = C.mob)
+ voting |= C
+
+ var/dat = {""}
+ if(mode)
+ dat += "[vote_html(C)]
"
+ if(admin)
+ dat += "(Cancel Vote) "
+ else
+ dat += "
"
+ var/datum/browser/popup = new(C.mob, "vote", "Voting Panel", nref=src)
+ popup.set_content(dat)
+ popup.open()
+
+/datum/controller/vote/proc/update_panel(var/client/C)
+ C << output(url_encode(vote_html(C)), "vote.browser:update_vote_div")
+
+/datum/controller/vote/proc/vote_html(var/client/C)
+ . = ""
+ if(question)
+ . += "Vote: '[question]'
"
+ else
+ . += "Vote: [capitalize(mode)]
"
+ . += "Time Left: [time_remaining] s
"
+
+
+/datum/controller/vote/Topic(href,href_list[],hsrc)
+ if(!usr || !usr.client)
+ return //not necessary but meh...just in-case somebody does something stupid
+ var/admin = check_rights(R_ADMIN,0)
+ if(href_list["close"])
+ voting -= usr.client
+ return
+ switch(href_list["vote"])
+ if("open")
+ // vote proc will automatically get called after this switch ends
+ if("cancel")
+ if(admin && mode)
+ var/votedesc = capitalize(mode)
+ if(mode == "custom")
+ votedesc += " ([question])"
+ admin_log_and_message_admins("cancelled the running [votedesc] vote.")
+ reset()
+ if("toggle_restart")
+ if(admin)
+ config.allow_vote_restart = !config.allow_vote_restart
+ if("toggle_gamemode")
+ if(admin)
+ config.allow_vote_mode = !config.allow_vote_mode
+ if("restart")
+ if(config.allow_vote_restart || admin)
+ initiate_vote("restart",usr.key)
+ if("gamemode")
+ if(config.allow_vote_mode || admin)
+ initiate_vote("gamemode",usr.key)
+ if("crew_transfer")
+ if(config.allow_vote_restart || admin)
+ initiate_vote("crew_transfer",usr.key)
+ if("custom")
+ if(admin)
+ initiate_vote("custom",usr.key)
+ else
+ submit_vote(usr.ckey, round(text2num(href_list["vote"])))
+ update_panel(usr.client)
+ return
+ usr.vote()
/mob/verb/vote()
@@ -355,4 +410,4 @@ datum/controller/vote
set name = "Vote"
if(vote)
- src << browse(vote.interface(client),"window=vote;can_close=0")
+ vote.browse_to(client)
diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm
index 83b3a4a226a..172c4b63757 100644
--- a/code/datums/diseases/advance/symptoms/choking.dm
+++ b/code/datums/diseases/advance/symptoms/choking.dm
@@ -43,11 +43,11 @@ Bonus
return
/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
- var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth())*1)
+ var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth())
M.adjustOxyLoss(get_damage)
return 1
/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
- var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth()*5))
+ var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()*5)
M.adjustOxyLoss(get_damage)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/advance/symptoms/damage_converter.dm
index eb7afcaf6be..cba4d4a4cd0 100644
--- a/code/datums/diseases/advance/symptoms/damage_converter.dm
+++ b/code/datums/diseases/advance/symptoms/damage_converter.dm
@@ -45,9 +45,11 @@ Bonus
if(!parts.len)
return
- M.heal_overall_damage(get_damage, get_damage)
+ for(var/obj/item/organ/external/E in parts)
+ E.heal_damage(get_damage, get_damage, 0, 0)
M.adjustToxLoss(get_damage*parts.len)
+
else
if(M.getFireLoss() > 0 || M.getBruteLoss() > 0)
M.adjustFireLoss(-get_damage)
diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm
index 3ec0f16358a..9234b54b088 100644
--- a/code/datums/diseases/advance/symptoms/sensory.dm
+++ b/code/datums/diseases/advance/symptoms/sensory.dm
@@ -21,7 +21,7 @@ Bonus
resistance = -4
stage_speed = -4
transmittable = -3
- level = 6
+ level = 5
severity = 0
/datum/symptom/sensory_restoration/Activate(var/datum/disease/advance/A)
@@ -38,12 +38,12 @@ Bonus
M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10))
to_chat(M, "You feel sober.")
if(4)
- if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10)
- M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10, "synaptizine"=5))
+ if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaphydramine") < 10)
+ M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10, "synaphydramine"=5))
to_chat(M, "You feel focused.")
if(5)
- if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10 && M.reagents.get_reagent_amount("mannitol") < 10)
- M.reagents.add_reagent_list(list("mannitol"=10, "antihol"=10, "oculine"=10, "synaptizine"=10))
+ if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaphydramine") < 10 && M.reagents.get_reagent_amount("mannitol") < 10)
+ M.reagents.add_reagent_list(list("mannitol"=10, "antihol"=10, "oculine"=10, "synaphydramine"=10))
to_chat(M, "Your mind feels relaxed.")
return
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index c8ba2b49c40..7e5c26b52e5 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -84,14 +84,14 @@
if(istype(A, /datum/reagent))
if(!reagents)
reagents = new()
- reagents.reagent_list.Add(A)
- reagents.conditional_update()
+ reagents.reagent_list.Add(A)
+ reagents.conditional_update()
else if(istype(A, /atom/movable))
var/atom/movable/M = A
if(istype(M.loc, /mob/living))
var/mob/living/L = M.loc
L.unEquip(M)
- M.loc = src
+ M.forceMove(src)
/atom/proc/assume_air(datum/gas_mixture/giver)
qdel(giver)
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index e2f4fc50c12..5b0884788b9 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -36,7 +36,6 @@
melee_damage_upper = 4
attacktext = "hits"
attack_sound = 'sound/weapons/genhit1.ogg'
- del_on_death = 1
speak_emote = list("pulses")
var/obj/effect/blob/factory/factory = null
var/list/human_overlays = list()
@@ -92,6 +91,7 @@
loc.visible_message("The corpse of [H.name] suddenly rises!")
/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed)
+ ..()
// On death, create a small smoke of harmful gas (s-Acid)
var/datum/effect/system/chem_smoke_spread/S = new
var/turf/location = get_turf(src)
@@ -108,7 +108,7 @@
S.attach(location)
S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud
S.start()
- ..()
+ qdel(src)
/mob/living/simple_animal/hostile/blob/blobspore/Destroy()
if(factory)
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 35d17607709..7d6ea9b4e7d 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -48,9 +48,7 @@ var/round_start_time = 0
to_chat(world, "Welcome to the pre-game lobby!")
to_chat(world, "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds")
while(current_state == GAME_STATE_PREGAME)
- for(var/i=0, i<10, i++)
- sleep(1)
- vote.process()
+ sleep(10)
if(going)
pregame_timeleft--
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index ae687d70116..825e1183529 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -799,7 +799,17 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \
/datum/objective/heist/inviolate_death
explanation_text = "Follow the Inviolate. Minimise death and loss of resources."
- completed = 1
+
+ check_completion()
+ var/vox_allowed_kills = 3 // The number of people the vox can accidently kill. Mostly a counter to people killing themselves if a raider touches them to force fail.
+ var/vox_total_kills = 0
+
+ var/datum/game_mode/heist/H = ticker.mode
+ for(var/datum/mind/raider in H.raiders)
+ vox_total_kills += raider.kills.len // Kills are listed in the mind; uses this to calculate vox kills
+
+ if(vox_total_kills > vox_allowed_kills) return 0
+ return 1
// Traders
diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm
index 1de4ecef264..982d2be445f 100644
--- a/code/game/jobs/job/support.dm
+++ b/code/game/jobs/job/support.dm
@@ -339,7 +339,8 @@
equip(var/mob/living/carbon/human/H)
- if(!H) return 0
+ if(!H)
+ return 0
switch(H.backbag)
if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
@@ -348,12 +349,10 @@
H.equip_or_collect(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/device/pda/librarian(H), slot_wear_pda)
H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/barcodescanner(H), slot_l_hand)
+ H.equip_or_collect(new /obj/item/weapon/storage/bag/books(H), slot_l_hand)
+ H.equip_or_collect(new /obj/item/weapon/barcodescanner(H), slot_r_store)
H.equip_or_collect(new /obj/item/device/laser_pointer(H), slot_l_store)
- if(H.backbag == 1)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
- else
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
return 1
/datum/job/barber
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 343f421b4e8..097efa2c75c 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -12,11 +12,12 @@
/obj/machinery/computer/aifixer/attackby(I as obj, user as mob, params)
if(occupant && istype(I, /obj/item/weapon/screwdriver))
- if(stat & (NOPOWER|BROKEN))
+ if(stat & BROKEN)
+ ..()
+ if(stat & NOPOWER)
to_chat(user, "The screws on [name]'s screen won't budge.")
else
- to_chat(user, "The screws on [name]'s screen won't budge and it emits a warning beep.")
- return
+ to_chat(user, "The screws on [name]'s screen won't budge and it emits a warning beep!.")
else
..()
@@ -135,3 +136,18 @@
to_chat(user, "ERROR: Reconstruction in progress.")
else if(!occupant)
to_chat(user, "ERROR: Unable to locate artificial intelligence.")
+
+/obj/machinery/computer/aifixer/Destroy()
+ if(occupant)
+ occupant.ghostize()
+ qdel(occupant)
+ occupant = null
+ return ..()
+
+/obj/machinery/computer/aifixer/emp_act()
+ if(occupant)
+ occupant.ghostize()
+ qdel(occupant)
+ occupant = null
+ else
+ ..()
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 3ca8d6e479d..89712fefad3 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -460,7 +460,7 @@
// Book keeping!
log_admin("[key_name(M)] has entered a stasis pod.")
- message_admins("[key_name_admin(user)] has entered a stasis pod. (JMP)")
+ message_admins("[key_name_admin(M)] has entered a stasis pod. (JMP)")
//Despawning occurs when process() is called with an occupant without a client.
src.add_fingerprint(M)
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 9c6b0fc548d..fb55eee1200 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -1,101 +1,127 @@
/obj/machinery/iv_drip
name = "\improper IV drip"
icon = 'icons/obj/iv_drip.dmi'
+ icon_state = "iv_drip"
anchored = 0
density = 1
+ var/mob/living/carbon/human/attached = null
+ var/mode = 1 // 1 is injecting, 0 is taking blood.
+ var/obj/item/weapon/reagent_containers/beaker = null
+/obj/machinery/iv_drip/New()
+ ..()
+ update_icon()
-/obj/machinery/iv_drip/var/mob/living/carbon/human/attached = null
-/obj/machinery/iv_drip/var/mode = 1 // 1 is injecting, 0 is taking blood.
-/obj/machinery/iv_drip/var/obj/item/weapon/reagent_containers/beaker = null
+/obj/machinery/iv_drip/Destroy()
+ attached = null
+ if(beaker)
+ qdel(beaker)
+ beaker = null
+ return ..()
/obj/machinery/iv_drip/update_icon()
- if(src.attached)
- icon_state = "hooked"
+ if(attached)
+ if(mode)
+ icon_state = "injecting"
+ else
+ icon_state = "donating"
else
- icon_state = ""
+ if(mode)
+ icon_state = "injectidle"
+ else
+ icon_state = "donateidle"
- overlays = null
+ overlays.Cut()
if(beaker)
- var/datum/reagents/reagents = beaker.reagents
- if(reagents.total_volume)
+ if(attached)
+ overlays += "beakeractive"
+ else
+ overlays += "beakeridle"
+ if(beaker.reagents.total_volume)
var/image/filling = image('icons/obj/iv_drip.dmi', src, "reagent")
- var/percent = round((reagents.total_volume / beaker.volume) * 100)
+ var/percent = round((beaker.reagents.total_volume / beaker.volume) * 100)
switch(percent)
- if(0 to 9) filling.icon_state = "reagent0"
- if(10 to 24) filling.icon_state = "reagent10"
- if(25 to 49) filling.icon_state = "reagent25"
- if(50 to 74) filling.icon_state = "reagent50"
- if(75 to 79) filling.icon_state = "reagent75"
- if(80 to 90) filling.icon_state = "reagent80"
- if(91 to INFINITY) filling.icon_state = "reagent100"
+ if(0 to 9)
+ filling.icon_state = "reagent0"
+ if(10 to 24)
+ filling.icon_state = "reagent10"
+ if(25 to 49)
+ filling.icon_state = "reagent25"
+ if(50 to 74)
+ filling.icon_state = "reagent50"
+ if(75 to 79)
+ filling.icon_state = "reagent75"
+ if(80 to 90)
+ filling.icon_state = "reagent80"
+ if(91 to INFINITY)
+ filling.icon_state = "reagent100"
- filling.icon += mix_color_from_reagents(reagents.reagent_list)
+ filling.icon += mix_color_from_reagents(beaker.reagents.reagent_list)
overlays += filling
-/obj/machinery/iv_drip/MouseDrop(over_object, src_location, over_location)
- ..()
-
- if(!ishuman(usr) && !isrobot(usr))
- return
-
- var/turf/T = get_turf(src)
- if(!usr in range(1, T))
+/obj/machinery/iv_drip/MouseDrop(mob/living/target)
+ if(!ishuman(usr))
return
if(attached)
- visible_message("[src.attached] is detached from \the [src]")
- src.attached = null
- src.update_icon()
+ visible_message("[attached] is detached from [src].")
+ attached = null
+ update_icon()
return
- if(in_range(src, usr) && ishuman(over_object) && get_dist(over_object, src) <= 1)
- visible_message("[usr] attaches \the [src] to \the [over_object].")
- src.attached = over_object
- src.update_icon()
+ if(!target.dna)
+ to_chat(usr, "The drip beeps: Warning, incompatible creature!")
+ return
-
-/obj/machinery/iv_drip/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/reagent_containers))
- if(!isnull(src.beaker))
- to_chat(user, "There is already a reagent container loaded!")
- return
-
- if(user.drop_item())
- W.forceMove(src)
- src.beaker = W
- to_chat(user, "You attach \the [W] to \the [src].")
- src.update_icon()
- return
+ if(Adjacent(target) && usr.Adjacent(target))
+ if(beaker)
+ usr.visible_message("[usr] attaches [src] to [target].", "You attach [src] to [target].")
+ attached = target
+ addAtProcessing()
+ update_icon()
else
- to_chat(user, "\The [W] is stuck to you!")
+ to_chat(usr, "There's nothing attached to the IV drip!")
+
+/obj/machinery/iv_drip/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/weapon/reagent_containers))
+ if(beaker)
+ to_chat(user, "There is already a reagent container loaded!")
+ return
+ if(!user.drop_item())
+ return
+
+ W.forceMove(src)
+ beaker = W
+ to_chat(user, "You attach [W] to [src].")
+ update_icon()
else
return ..()
/obj/machinery/iv_drip/process()
- //set background = 1
+ if(!attached)
+ return PROCESS_KILL
- if(src.attached)
+ if(get_dist(src, attached) > 1 && isturf(attached.loc))
+ to_chat(attached, "The IV drip needle is ripped out of you!")
+ attached.apply_damage(3, BRUTE, pick("r_arm", "l_arm"))
+ attached = null
+ update_icon()
+ return PROCESS_KILL
- if(!(get_dist(src, src.attached) <= 1 && isturf(src.attached.loc)))
- visible_message("The needle is ripped out of [src.attached], doesn't that hurt?")
- src.attached:apply_damage(3, BRUTE, pick("r_arm", "l_arm"))
- src.attached = null
- src.update_icon()
- return
-
- if(src.attached && src.beaker)
+ if(beaker)
// Give blood
if(mode)
- if(src.beaker.volume > 0)
- var/transfer_amount = REAGENTS_METABOLISM
- if(istype(src.beaker, /obj/item/weapon/reagent_containers/blood))
+ if(beaker.volume > 0)
+ var/transfer_amount = 5
+ if(istype(beaker, /obj/item/weapon/reagent_containers/blood))
// speed up transfer on blood packs
- transfer_amount = 4
- src.beaker.reagents.trans_to(src.attached, transfer_amount)
+ transfer_amount = 10
+ var/fraction = min(transfer_amount/beaker.volume, 1) //the fraction that is transfered of the total volume
+ beaker.reagents.reaction(attached, INGEST, fraction) //make reagents reacts, but don't spam messages
+ beaker.reagents.trans_to(attached, transfer_amount)
update_icon()
// Take blood
@@ -104,71 +130,111 @@
amount = min(amount, 4)
// If the beaker is full, ping
if(amount == 0)
- if(prob(5)) visible_message("\The [src] pings.")
+ if(prob(5))
+ visible_message("[src] pings.")
return
var/mob/living/carbon/human/T = attached
- if(!istype(T)) return
+ if(!ishuman(T))
+ return
+
if(!T.dna)
return
+
if(NOCLONE in T.mutations)
return
- if(T.species && T.species.flags & NO_BLOOD)
+ if(T.species.flags & NO_BLOOD)
return
- // If the human is losing too much blood, beep.
- if(T.vessel.get_reagent_amount("blood") < BLOOD_VOLUME_SAFE) if(prob(5))
- visible_message("\The [src] beeps loudly.")
-
- var/datum/reagent/B = T.take_blood(beaker,amount)
-
- if(B)
- beaker.reagents.reagent_list |= B
- beaker.reagents.update_total()
- beaker.on_reagent_change()
- beaker.reagents.handle_reactions()
+ if(T.species.exotic_blood)
+ T.vessel.trans_to(beaker, amount)
update_icon()
+ else
+ var/datum/reagent/B = T.take_blood(beaker, amount)
-/obj/machinery/iv_drip/attack_hand(mob/living/carbon/user)
- if(!istype(user))
+ if(B)
+ beaker.reagents.reagent_list |= B
+ beaker.reagents.update_total()
+ beaker.on_reagent_change()
+ beaker.reagents.handle_reactions()
+ update_icon()
+
+ // If attached is losing too much blood, beep.
+ var/blood_type = attached.get_blood_name()
+ if(T.vessel.get_reagent_amount(blood_type) < BLOOD_VOLUME_SAFE && prob(5))
+ visible_message("[src] beeps loudly.")
+ playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
+
+/obj/machinery/iv_drip/attack_hand(mob/user)
+ if(!ishuman(user))
return
- if(src.beaker)
- src.beaker.loc = get_turf(src)
- src.beaker = null
+ if(attached)
+ visible_message("[attached] is detached from [src]")
+ attached = null
update_icon()
+ return
+ else if(beaker)
+ eject_beaker(user)
else
- return ..()
+ toggle_mode()
+/obj/machinery/iv_drip/AltClick(mob/user)
+ ..()
+ if(user.incapacitated())
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!Adjacent(user))
+ return
+ toggle_mode()
-/obj/machinery/iv_drip/verb/toggle_mode()
- set name = "Toggle Mode"
+/obj/machinery/iv_drip/verb/eject_beaker(mob/user)
set category = "Object"
+ set name = "Remove IV Container"
set src in view(1)
- if(!istype(usr, /mob/living))
- to_chat(usr, "\red You can't do that.")
+ if(!iscarbon(usr))
+ to_chat(usr, "You can't do that!")
return
- if(usr.stat)
+ if(usr.incapacitated())
+ return
+
+ if(beaker)
+ beaker.forceMove(get_turf(src))
+ beaker = null
+ update_icon()
+
+/obj/machinery/iv_drip/verb/toggle_mode()
+ set category = "Object"
+ set name = "Toggle Mode"
+ set src in view(1)
+
+ if(!iscarbon(usr))
+ to_chat(usr, "You can't do that!")
+ return
+
+ if(usr.incapacitated())
return
mode = !mode
to_chat(usr, "The IV drip is now [mode ? "injecting" : "taking blood"].")
+ update_icon()
/obj/machinery/iv_drip/examine(mob/user)
..(user)
- if(!(user in view(2)) && usr != src.loc) return
+ if(!(user in view(2)) && user != loc)
+ return
- to_chat(usr, "The IV drip is [mode ? "injecting" : "taking blood"].")
+ to_chat(user, "The IV drip is [mode ? "injecting" : "taking blood"].")
if(beaker)
if(beaker.reagents && beaker.reagents.reagent_list.len)
- to_chat(user, "\blue Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.")
+ to_chat(user, "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.")
else
- to_chat(user, "\blue Attached is an empty [beaker].")
+ to_chat(user, "Attached is an empty [beaker].")
else
- to_chat(user, "\blue No chemicals are attached.")
+ to_chat(user, "No chemicals are attached.")
- to_chat(user, "\blue [attached ? attached : "No one"] is attached.")
+ to_chat(user, "[attached ? attached : "No one"] is attached.")
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index ae299d78a90..c0ecd475f5e 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -361,10 +361,9 @@ Class Procs:
return ..()
-/obj/machinery/CheckParts()
+/obj/machinery/CheckParts(list/parts_list)
..()
RefreshParts()
- return
/obj/machinery/proc/RefreshParts() //Placeholder proc for machines that are built using frames.
return
diff --git a/code/game/objects/effects/datacore-effect.dm b/code/game/objects/effects/datacore-effect.dm
index 5c2fe3f5167..65d873666d1 100644
--- a/code/game/objects/effects/datacore-effect.dm
+++ b/code/game/objects/effects/datacore-effect.dm
@@ -158,6 +158,7 @@ var/global/list/PDA_Manifest = list()
var/name = sanitize(t.fields["name"])
var/rank = sanitize(t.fields["rank"])
var/real_rank = t.fields["real_rank"]
+
var/isactive = t.fields["p_stat"]
var/department = 0
var/depthead = 0 // Department Heads will be placed at the top of their lists.
@@ -165,44 +166,44 @@ var/global/list/PDA_Manifest = list()
heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
depthead = 1
- if(rank=="Captain" && heads.len != 1)
- heads.Swap(1,heads.len)
+ if(rank == "Captain" && heads.len != 1)
+ heads.Swap(1, heads.len)
if(real_rank in security_positions)
sec[++sec.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && sec.len != 1)
- sec.Swap(1,sec.len)
+ sec.Swap(1, sec.len)
if(real_rank in engineering_positions)
eng[++eng.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && eng.len != 1)
- eng.Swap(1,eng.len)
+ eng.Swap(1, eng.len)
if(real_rank in medical_positions)
med[++med.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && med.len != 1)
- med.Swap(1,med.len)
+ med.Swap(1, med.len)
if(real_rank in science_positions)
sci[++sci.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && sci.len != 1)
- sci.Swap(1,sci.len)
+ sci.Swap(1, sci.len)
if(real_rank in service_positions)
ser[++ser.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && ser.len != 1)
- ser.Swap(1,ser.len)
+ ser.Swap(1, ser.len)
if(real_rank in supply_positions)
sup[++sup.len] = list("name" = name, "rank" = rank, "active" = isactive)
department = 1
if(depthead && sup.len != 1)
- sup.Swap(1,sup.len)
+ sup.Swap(1, sup.len)
if(real_rank in nonhuman_positions)
bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 017583b7336..111f7c4dc33 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -1,3 +1,5 @@
+var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.dmi', "icon_state" = "fire")
+
/obj/item
name = "item"
icon = 'icons/obj/items.dmi'
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 50dc5c3b467..98fa7a955ab 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -184,7 +184,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \
new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \
new/datum/stack_recipe("folder", /obj/item/weapon/folder), \
new/datum/stack_recipe("cardboard tube", /obj/item/weapon/c_tube), \
- new/datum/stack_recipe("large box", /obj/structure/closet/cardboard, 4), \
+ new/datum/stack_recipe("cardboard box", /obj/structure/closet/cardboard, 4), \
)
/obj/item/stack/sheet/cardboard //BubbleWrap
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index dd5102a25d7..ec524314b71 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -1372,7 +1372,7 @@ obj/item/toy/cards/deck/syndicate/black
is_empty = 1
playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1)
user.visible_message("The [src] goes off!")
- M.apply_damage(200, "brute", "head", used_weapon = "Self-inflicted gunshot would to the head.", sharp=1)
+ M.apply_damage(200, BRUTE, "head", sharp =1, used_weapon = "Self-inflicted gunshot would to the head.")
M.death()
else
user.visible_message("[user] lowers the [src] from their head.")
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index 416608b77f7..aea1ebd3e1b 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -105,4 +105,28 @@
desc = "Damn son, where'd you find this?"
icon_state = "air_horn"
honk_sound = 'sound/items/AirHorn2.ogg'
- cooldowntime = 50
\ No newline at end of file
+ cooldowntime = 50
+
+/obj/item/weapon/bikehorn/golden
+ name = "golden bike horn"
+ desc = "Golden? Clearly, its made with bananium! Honk!"
+ icon_state = "gold_horn"
+ item_state = "gold_horn"
+
+/obj/item/weapon/bikehorn/golden/attack()
+ flip_mobs()
+ return ..()
+
+/obj/item/weapon/bikehorn/golden/attack_self(mob/user)
+ flip_mobs()
+ ..()
+
+/obj/item/weapon/bikehorn/golden/proc/flip_mobs(mob/living/carbon/M, mob/user)
+ if(!spam_flag)
+ var/turf/T = get_turf(src)
+ for(M in ohearers(7, T))
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs) || H.ear_deaf)
+ continue
+ M.emote("flip")
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 9ccff568b87..d14c48a761e 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -69,7 +69,7 @@
ratio = Ceiling(ratio*4) * 25
overlays += "[icon_state]-charge[ratio]"
-/obj/item/weapon/defibrillator/CheckParts()
+/obj/item/weapon/defibrillator/CheckParts(list/parts_list)
..()
bcell = locate(/obj/item/weapon/stock_parts/cell) in contents
update_icon()
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index c3a23b2ba7d..e595ab33afc 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -164,10 +164,13 @@
update_icon()
return
-/obj/item/weapon/flamethrower/CheckParts()
+/obj/item/weapon/flamethrower/CheckParts(list/parts_list)
..()
weldtool = locate(/obj/item/weapon/weldingtool) in contents
igniter = locate(/obj/item/device/assembly/igniter) in contents
+ weldtool.status = 0
+ igniter.secured = 0
+ status = 1
update_icon()
//Called from turf.dm turf/dblclick
diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm
index cad1b7630e3..745afd967ee 100644
--- a/code/game/objects/items/weapons/grenades/ghettobomb.dm
+++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm
@@ -93,7 +93,7 @@
else
range = pick(2,2,2,3,3,3,4)
-/obj/item/weapon/grenade/iedcasing/CheckParts()
+/obj/item/weapon/grenade/iedcasing/CheckParts(list/parts_list)
..()
var/obj/item/weapon/reagent_containers/food/drinks/cans/can = locate() in contents
if(can)
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index ff509982d10..2fb7b0de0b8 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -65,8 +65,8 @@
/obj/item/weapon/restraints/handcuffs/cable
name = "cable restraints"
desc = "Looks like some cables tied together. Could be used to tie something up."
- icon_state = "cuff_white"
- item_state = "coil_red"
+ icon_state = "cuff_red"
+ materials = list(MAT_METAL=150, MAT_GLASS=75)
breakouttime = 300 //Deciseconds = 30s
cuffsound = 'sound/weapons/cablecuff.ogg'
@@ -135,6 +135,7 @@
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
icon_state = "cuff_white"
breakouttime = 450 //Deciseconds = 45s
+ materials = list()
trashtype = /obj/item/weapon/restraints/handcuffs/cable/zipties/used
/obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user)
diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm
index 7e251532bd1..a7741267d09 100644
--- a/code/game/objects/items/weapons/paint.dm
+++ b/code/game/objects/items/weapons/paint.dm
@@ -1,7 +1,5 @@
//NEVER USE THIS IT SUX -PETETHEGOAT
-var/global/list/cached_icons = list()
-
/obj/item/weapon/reagent_containers/glass/paint
desc = "It's a paint bucket."
name = "paint bucket"
@@ -10,220 +8,57 @@ var/global/list/cached_icons = list()
item_state = "paintcan"
materials = list(MAT_METAL=200)
w_class = 3
- amount_per_transfer_from_this = 10
- possible_transfer_amounts = list(10,20,30,50,70)
+ amount_per_transfer_from_this = 5
+ possible_transfer_amounts = list(5,10,20,30,50,70)
volume = 70
flags = OPENCONTAINER
- var/paint_type = ""
- afterattack(turf/simulated/target, mob/user, proximity)
- if(!proximity) return
- if(istype(target) && reagents.total_volume > 5)
- for(var/mob/O in viewers(user))
- O.show_message("\red \The [target] has been splashed with something by [user]!", 1)
- spawn(5)
- reagents.reaction(target, TOUCH)
- reagents.remove_any(5)
- else
- return ..()
-
- New()
- if(paint_type == "remover")
- name = "paint remover bucket"
- else if(paint_type && lentext(paint_type) > 0)
- name = paint_type + " " + name
- ..()
- reagents.add_reagent("paint_[paint_type]", volume)
-
- red
- icon_state = "paint_red"
- paint_type = "red"
-
- green
- icon_state = "paint_green"
- paint_type = "green"
-
- blue
- icon_state = "paint_blue"
- paint_type = "blue"
-
- yellow
- icon_state = "paint_yellow"
- paint_type = "yellow"
-
- violet
- icon_state = "paint_violet"
- paint_type = "violet"
-
- black
- icon_state = "paint_black"
- paint_type = "black"
-
- white
- icon_state = "paint_white"
- paint_type = "white"
-
- remover
- paint_type = "remover"
-/*
-/obj/item/weapon/paint
- name = "Paint Can"
- desc = "Used to recolor floors and walls. Can not be removed by the janitor."
- icon = 'icons/obj/items.dmi'
- icon_state = "paint_neutral"
- color = "FFFFFF"
- item_state = "paintcan"
- w_class = 3
-
-/obj/item/weapon/paint/red
- name = "Red paint"
- color = "FF0000"
- icon_state = "paint_red"
-
-/obj/item/weapon/paint/green
- name = "Green paint"
- color = "00FF00"
- icon_state = "paint_green"
-
-/obj/item/weapon/paint/blue
- name = "Blue paint"
- color = "0000FF"
- icon_state = "paint_blue"
-
-/obj/item/weapon/paint/yellow
- name = "Yellow paint"
- color = "FFFF00"
- icon_state = "paint_yellow"
-
-/obj/item/weapon/paint/violet
- name = "Violet paint"
- color = "FF00FF"
- icon_state = "paint_violet"
-
-/obj/item/weapon/paint/black
- name = "Black paint"
- color = "333333"
- icon_state = "paint_black"
-
-/obj/item/weapon/paint/white
- name = "White paint"
- color = "FFFFFF"
- icon_state = "paint_white"
-
-
-/obj/item/weapon/paint/anycolor
- name = "Any color"
- icon_state = "paint_neutral"
-
- attack_self(mob/user as mob)
- var/t1 = input(user, "Please select a color:", "Locking Computer", null) in list( "red", "blue", "green", "yellow", "black", "white")
- if((user.get_active_hand() != src || user.stat || user.restrained()))
- return
- switch(t1)
- if("red")
- color = "FF0000"
- if("blue")
- color = "0000FF"
- if("green")
- color = "00FF00"
- if("yellow")
- color = "FFFF00"
- if("violet")
- color = "FF00FF"
- if("white")
- color = "FFFFFF"
- if("black")
- color = "333333"
- icon_state = "paint_[t1]"
- add_fingerprint(user)
+/obj/item/weapon/reagent_containers/glass/paint/afterattack(turf/simulated/target, mob/user, proximity)
+ if(!proximity)
return
-
-
-/obj/item/weapon/paint/afterattack(turf/target, mob/user as mob, proximity)
- if(!proximity) return
- if(!istype(target) || istype(target, /turf/space))
- return
- var/ind = "[initial(target.icon)][color]"
- if(!cached_icons[ind])
- var/icon/overlay = new/icon(initial(target.icon))
- overlay.Blend("#[color]",ICON_MULTIPLY)
- overlay.SetIntensity(1.4)
- target.icon = overlay
- cached_icons[ind] = target.icon
+ if(istype(target) && reagents.total_volume >= 5)
+ user.visible_message("[target] has been splashed with something by [user]!")
+ spawn(5)
+ reagents.reaction(target, TOUCH)
+ reagents.remove_any(5)
else
- target.icon = cached_icons[ind]
- return
+ return ..()
-/obj/item/weapon/paint/paint_remover
- name = "Paint remover"
- icon_state = "paint_neutral"
+/obj/item/weapon/reagent_containers/glass/paint/red
+ name = "red paint bucket"
+ icon_state = "paint_red"
+ list_reagents = list("paint_red" = 70)
- afterattack(turf/target, mob/user as mob)
- if(istype(target) && target.icon != initial(target.icon))
- target.icon = initial(target.icon)
- return
-*/
+/obj/item/weapon/reagent_containers/glass/paint/green
+ name = "green paint bucket"
+ icon_state = "paint_green"
+ list_reagents = list("paint_green" = 70)
-datum/reagent/paint
- name = "Paint"
- id = "paint_"
- description = "Floor paint is used to color floor tiles."
- reagent_state = 2
- color = "#808080"
+/obj/item/weapon/reagent_containers/glass/paint/blue
+ name = "blue paint bucket"
+ icon_state = "paint_blue"
+ list_reagents = list("paint_blue" = 70)
- reaction_turf(var/turf/T, var/volume)
- if(!istype(T) || istype(T, /turf/space))
- return
- T.color = color
+/obj/item/weapon/reagent_containers/glass/paint/yellow
+ name = "yellow paint bucket"
+ icon_state = "paint_yellow"
+ list_reagents = list("paint_yellow" = 70)
- reaction_obj(var/obj/O, var/volume)
- ..()
- if(istype(O,/obj/item/weapon/light))
- O.color = color
+/obj/item/weapon/reagent_containers/glass/paint/violet
+ name = "violet paint bucket"
+ icon_state = "paint_violet"
+ list_reagents = list("paint_violet" = 70)
- red
- name = "Red Paint"
- id = "paint_red"
- color = "#FF0000"
+/obj/item/weapon/reagent_containers/glass/paint/black
+ name = "black paint bucket"
+ icon_state = "paint_black"
+ list_reagents = list("paint_black" = 70)
- green
- name = "Green Paint"
- color = "#00FF00"
- id = "paint_green"
+/obj/item/weapon/reagent_containers/glass/paint/white
+ name = "white paint bucket"
+ icon_state = "paint_white"
+ list_reagents = list("paint_white" = 70)
- blue
- name = "Blue Paint"
- color = "#0000FF"
- id = "paint_blue"
-
- yellow
- name = "Yellow Paint"
- color = "#FFFF00"
- id = "paint_yellow"
-
- violet
- name = "Violet Paint"
- color = "#FF00FF"
- id = "paint_violet"
-
- black
- name = "Black Paint"
- color = "#333333"
- id = "paint_black"
-
- white
- name = "White Paint"
- color = "#FFFFFF"
- id = "paint_white"
-
-datum/reagent/paint_remover
- name = "Paint Remover"
- id = "paint_remover"
- description = "Paint remover is used to remove floor paint from floor tiles."
- reagent_state = 2
- color = "#808080"
-
- reaction_turf(var/turf/T, var/volume)
- if(istype(T) && T.icon != initial(T.icon))
- T.icon = initial(T.icon)
- return
+/obj/item/weapon/reagent_containers/glass/paint/remover
+ name = "paint remover bucket"
+ list_reagents = list("paint_remover" = 70)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 66cb11a9dd6..af4d9aa6008 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -375,7 +375,7 @@
max_combined_w_class = 21
max_w_class = 3
w_class = 4 //Bigger than a book because physics
- can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/spellbook") //No bibles, consistent with bookcase
+ can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/storage/bible", "/obj/item/weapon/tome", "/obj/item/weapon/spellbook")
/*
* Trays - Agouri
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 8348bef8bb1..76cbc9ab102 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -705,3 +705,73 @@
new /obj/item/weapon/lipstick/green(src)
new /obj/item/weapon/lipstick/blue(src)
new /obj/item/weapon/lipstick/white(src)
+
+#define NODESIGN "None"
+#define NANOTRASEN "NanotrasenStandard"
+#define SYNDI "SyndiSnacks"
+#define HEART "Heart"
+#define SMILE "SmileyFace"
+
+/obj/item/weapon/storage/box/papersack
+ name = "paper sack"
+ desc = "A sack neatly crafted out of paper."
+ icon_state = "paperbag_None"
+ item_state = "paperbag_None"
+ foldable = null
+ var/design = NODESIGN
+
+/obj/item/weapon/storage/box/papersack/update_icon()
+ if(!contents.len)
+ icon_state = "[item_state]"
+ else icon_state = "[item_state]_closed"
+
+/obj/item/weapon/storage/box/papersack/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/weapon/pen))
+ //if a pen is used on the sack, dialogue to change its design appears
+ if(contents.len)
+ to_chat(user, "You can't modify [src] with items still inside!")
+ return
+ var/list/designs = list(NODESIGN, NANOTRASEN, SYNDI, HEART, SMILE)
+ var/switchDesign = input("Select a Design:", "Paper Sack Design", designs[1]) as null|anything in designs
+ if(!switchDesign)
+ return
+ if(get_dist(usr, src) > 1 && !usr.incapacitated())
+ to_chat(usr, "You have moved too far away!")
+ return
+ if(design == switchDesign)
+ return
+ to_chat(usr, "You make some modifications to [src] using your pen.")
+ design = switchDesign
+ icon_state = "paperbag_[design]"
+ item_state = "paperbag_[design]"
+ switch(design)
+ if(NODESIGN)
+ desc = "A sack neatly crafted out of paper."
+ if(NANOTRASEN)
+ desc = "A standard Nanotrasen paper lunch sack for loyal employees on the go."
+ if(SYNDI)
+ desc = "The design on this paper sack is a remnant of the notorious 'SyndieSnacks' program."
+ if(HEART)
+ desc = "A paper sack with a heart etched onto the side."
+ if(SMILE)
+ desc = "A paper sack with a crude smile etched onto the side."
+ return
+ else if(is_sharp(W))
+ if(!contents.len)
+ if(item_state == "paperbag_None")
+ to_chat(user, "You cut eyeholes into [src].")
+ new /obj/item/clothing/head/papersack(user.loc)
+ qdel(src)
+ return
+ else if(item_state == "paperbag_SmileyFace")
+ to_chat(user, "You cut eyeholes into [src] and modify the design.")
+ new /obj/item/clothing/head/papersack/smiley(user.loc)
+ qdel(src)
+ return
+ return ..()
+
+#undef NODESIGN
+#undef NANOTRASEN
+#undef SYNDI
+#undef HEART
+#undef SMILE
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 305befe2ecb..c0935f5d316 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -23,7 +23,7 @@
update_icon()
return
-/obj/item/weapon/melee/baton/CheckParts()
+/obj/item/weapon/melee/baton/CheckParts(list/parts_list)
..()
bcell = locate(/obj/item/weapon/stock_parts/cell) in contents
update_icon()
@@ -47,11 +47,11 @@
/obj/item/weapon/melee/baton/update_icon()
if(status)
- icon_state = "[initial(icon_state)]_active"
+ icon_state = "[initial(name)]_active"
else if(!bcell)
- icon_state = "[initial(icon_state)]_nocell"
+ icon_state = "[initial(name)]_nocell"
else
- icon_state = "[initial(icon_state)]"
+ icon_state = "[initial(name)]"
/obj/item/weapon/melee/baton/examine(mob/user)
..(user)
@@ -198,12 +198,4 @@
throwforce = 5
stunforce = 5
hitcost = 3750
- slot_flags = null
-
-/obj/item/weapon/melee/baton/cattleprod/update_icon()
- if(status)
- icon_state = "stunprod_active"
- else if(!bcell)
- icon_state = "stunprod_nocell"
- else
- icon_state = "stunprod"
+ slot_flags = null
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/teleprod.dm b/code/game/objects/items/weapons/teleprod.dm
new file mode 100644
index 00000000000..0bc1b23f6d6
--- /dev/null
+++ b/code/game/objects/items/weapons/teleprod.dm
@@ -0,0 +1,18 @@
+/obj/item/weapon/melee/baton/cattleprod/teleprod
+ name = "teleprod"
+ desc = "A prod with a bluespace crystal on the end. The crystal doesn't look too fun to touch."
+ icon_state = "teleprod_nocell"
+ item_state = "teleprod"
+ origin_tech = "combat=2;bluespace=4;materials=3"
+
+/obj/item/weapon/melee/baton/cattleprod/teleprod/attack(mob/living/carbon/M, mob/living/carbon/user)//handles making things teleport when hit
+ ..()
+ if(status)
+ if((CLUMSY in user.mutations) && prob(50))
+ user.visible_message("[user] accidentally hits themself with [src]!", \
+ "You accidentally hit yourself with [src]!")
+ user.Weaken(stunforce*3)
+ deductcharge(hitcost)
+ do_teleport(user, get_turf(user), 50)//honk honk
+ else if(iscarbon(M) && !M.anchored)
+ do_teleport(M, get_turf(M), 15)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 7ecbef740cd..88138657270 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -283,20 +283,90 @@
w_class = 4
slot_flags = SLOT_BACK
force_unwielded = 10
- force_wielded = 18 // Was 13, Buffed - RR
+ force_wielded = 18
throwforce = 20
- throw_speed = 3
+ throw_speed = 4
armour_penetration = 10
- no_spin_thrown = 1 // Thrown spears that spin look dumb. -Fox
+ materials = list(MAT_METAL=1150, MAT_GLASS=2075)
+ hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
+ sharp = 1
+ edge = 1
+ no_spin_thrown = 1
+ var/obj/item/weapon/grenade/explosive = null
+ var/war_cry = "AAAAARGH!!!"
/obj/item/weapon/twohanded/spear/update_icon()
- icon_state = "spearglass[wielded]"
- return
+ if(explosive)
+ icon_state = "spearbomb[wielded]"
+ else
+ icon_state = "spearglass[wielded]"
-/obj/item/weapon/twohanded/spear/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
+/obj/item/weapon/twohanded/spear/afterattack(atom/movable/AM, mob/user, proximity)
+ if(!proximity)
+ return
+ if(isturf(AM)) //So you can actually melee with it
+ return
+ if(explosive && wielded)
+ user.say("[war_cry]")
+ explosive.forceMove(AM)
+ explosive.prime()
+ qdel(src)
+
+/obj/item/weapon/twohanded/spear/throw_impact(atom/target)
+ . = ..()
+ if(explosive)
+ explosive.prime()
+ qdel(src)
+
+/obj/item/weapon/twohanded/spear/AltClick(mob/user)
+ ..()
+ if(!explosive)
+ return
+ if(ismob(loc))
+ var/mob/M = loc
+ var/input = stripped_input(M, "What do you want your war cry to be? You will shout it when you hit someone in melee.", ,"", 50)
+ if(input)
+ war_cry = input
+
+/obj/item/weapon/twohanded/spear/CheckParts(list/parts_list)
+ ..()
+ if(explosive)
+ explosive.forceMove(get_turf(loc))
+ explosive = null
+ update_icon()
+ var/obj/item/weapon/grenade/G = locate() in contents
+ if(G)
+ explosive = G
+ name = "explosive lance"
+ desc = "A makeshift spear with [G] attached to it. Alt+click on the spear to set your war cry!"
+ update_icon()
+
+//GREY TIDE
+/obj/item/weapon/twohanded/spear/grey_tide
+ icon_state = "spearglass0"
+ name = "\improper Grey Tide"
+ desc = "Recovered from the aftermath of a revolt aboard Defense Outpost Theta Aegis, in which a seemingly endless tide of Assistants caused heavy casualities among Nanotrasen military forces."
+ force_unwielded = 15
+ force_wielded = 25
+ throwforce = 20
+ throw_speed = 4
+ attack_verb = list("gored")
+
+/obj/item/weapon/twohanded/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity)
+ ..()
+ if(!proximity)
+ return
+ user.faction |= "greytide(\ref[user])"
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(istype (L, /mob/living/simple_animal/hostile/illusion))
+ return
+ if(!L.stat && prob(50))
+ var/mob/living/simple_animal/hostile/illusion/M = new(user.loc)
+ M.faction = user.faction.Copy()
+ M.Copy_Parent(user, 100, user.health/2.5, 12, 30)
+ M.GiveTarget(L)
//Putting heads on spears
/obj/item/organ/external/head/attackby(var/obj/item/weapon/W, var/mob/living/user, params)
@@ -348,6 +418,53 @@
name = "Kidan spear"
desc = "A spear brought over from the Kidan homeworld."
+// DIY CHAINSAW
+/obj/item/weapon/twohanded/required/chainsaw
+ name = "chainsaw"
+ desc = "A versatile power tool. Useful for limbing trees and delimbing humans."
+ icon_state = "gchainsaw_off"
+ flags = CONDUCT
+ force = 13
+ w_class = 5
+ throwforce = 13
+ throw_speed = 2
+ throw_range = 4
+ materials = list(MAT_METAL=13000)
+ origin_tech = "materials=3;engineering=4;combat=2"
+ attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered")
+ hitsound = "swing_hit"
+ sharp = 1
+ edge = 1
+ actions_types = list(/datum/action/item_action/startchainsaw)
+ var/on = 0
+
+/obj/item/weapon/twohanded/required/chainsaw/attack_self(mob/user)
+ on = !on
+ to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]")
+ if(on)
+ playsound(loc, 'sound/weapons/chainsawstart.ogg', 50, 1)
+ force = on ? 21 : 13
+ throwforce = on ? 21 : 13
+ icon_state = "gchainsaw_[on ? "on" : "off"]"
+
+ if(hitsound == "swing_hit")
+ hitsound = 'sound/weapons/chainsaw.ogg'
+ else
+ hitsound = "swing_hit"
+
+ if(src == user.get_active_hand()) //update inhands
+ user.update_inv_l_hand()
+ user.update_inv_r_hand()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
+/obj/item/weapon/twohanded/required/chainsaw/doomslayer
+ name = "OOOH BABY"
+ desc = "VRRRRRRR!!!"
+ armour_penetration = 100
+
+
///CHAINSAW///
/obj/item/weapon/twohanded/chainsaw
icon_state = "chainsaw0"
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index c62df2f6cca..a12f804d308 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -66,6 +66,14 @@
handle_rotation()
return
+/obj/structure/stool/bed/chair/AltClick(mob/user)
+ if(user.incapacitated())
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!Adjacent(user))
+ return
+ rotate()
+
// Chair types
/obj/structure/stool/bed/chair/wood
// TODO: Special ash subtype that looks like charred chair legs
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 47e0823f549..4e41daef289 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -322,6 +322,14 @@ obj/structure/windoor_assembly/Destroy()
update_icon()
return
+/obj/structure/windoor_assembly/AltClick(mob/user)
+ if(user.incapacitated())
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!Adjacent(user))
+ return
+ revrotate()
+
//Flips the windoor assembly, determines whather the door opens to the left or the right
/obj/structure/windoor_assembly/verb/flip()
set name = "Flip Windoor Assembly"
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 2293e04a746..7ae2ddcd27d 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -318,6 +318,14 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
return
+/obj/structure/window/AltClick(mob/user)
+ if(user.incapacitated())
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!Adjacent(user))
+ return
+ revrotate()
+
/*
/obj/structure/window/proc/updateSilicate()
if(silicateIcon && silicate)
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index 6751f201f98..abda62f9420 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -426,7 +426,7 @@ var/ert_request_answered = 0
switch(officer_type)
if("Engineer")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/engi(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(M), slot_glasses)
@@ -446,7 +446,7 @@ var/ert_request_answered = 0
if("Security")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/security(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
@@ -464,7 +464,7 @@ var/ert_request_answered = 0
if("Medic")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex/nitrile(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/health_advanced(M), slot_glasses)
@@ -483,7 +483,7 @@ var/ert_request_answered = 0
if("Commander")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/commander(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
@@ -511,7 +511,7 @@ var/ert_request_answered = 0
switch(officer_type)
if("Engineer")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/night(M), slot_glasses)
diff --git a/code/modules/admin/buildmode.dm b/code/modules/admin/buildmode.dm
index 34fcd5738c2..db97d7eb5ec 100644
--- a/code/modules/admin/buildmode.dm
+++ b/code/modules/admin/buildmode.dm
@@ -7,7 +7,8 @@
#define AREAEDIT_BUILDMODE 7
#define FILL_BUILDMODE 8
#define LINK_BUILDMODE 9
-#define NUM_BUILDMODES 9
+#define BOOM_BUILDMODE 10
+#define NUM_BUILDMODES 10
/obj/screen/buildmode
icon = 'icons/misc/buildmode.dmi'
@@ -167,6 +168,12 @@
var/list/link_lines = list()
var/obj/link_obj
var/valid_links = 0
+ //Explosion mode
+ var/devastation = -1
+ var/heavy = -1
+ var/light = -1
+ var/flash = -1
+ var/flames = -1
/datum/click_intercept/buildmode/New(client/c)
..()
@@ -250,6 +257,10 @@
to_chat(user, "Left Mouse Button on obj = Select button to link")
to_chat(user, "Right Mouse Button on obj = Link/unlink to selected button")
to_chat(user, "***********************************************************")
+ if(BOOM_BUILDMODE)
+ to_chat(user, "***********************************************************")
+ to_chat(user, "Mouse Button on obj = Kaboom")
+ to_chat(user, "***********************************************************")
/datum/click_intercept/buildmode/proc/change_settings(mob/user)
switch(mode)
@@ -322,6 +333,17 @@
if(ispath(objholder,/mob) && !check_rights(R_DEBUG,0))
objholder = /obj/structure/closet
deselect_region()
+ if(BOOM_BUILDMODE)
+ devastation = input("Range of total devastation. -1 to none", text("Input")) as num|null
+ if(devastation == null) devastation = -1
+ var/heavy = input("Range of heavy impact. -1 to none", text("Input")) as num|null
+ if(heavy == null) heavy = -1
+ var/light = input("Range of light impact. -1 to none", text("Input")) as num|null
+ if(light == null) light = -1
+ var/flash = input("Range of flash. -1 to none", text("Input")) as num|null
+ if(flash == null) flash = -1
+ var/flames = input("Range of flames. -1 to none", text("Input")) as num|null
+ if(flames == null) flames = -1
/datum/click_intercept/buildmode/proc/change_dir()
switch(build_dir)
@@ -601,3 +623,5 @@
var/obj/effect/buildmode_line/L2 = new(holder, P, M, "[M.name] to [P.name]") // Yes, reversed one so that you can see it from both sides.
L2.color = L.color
link_lines += L2
+ if(BOOM_BUILDMODE)
+ explosion(object, devastation, heavy, light, flash, null, null,flames)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 2556330a87c..1edc80eaf51 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1566,53 +1566,7 @@
else if(href_list["adminmoreinfo"])
var/mob/M = locate(href_list["adminmoreinfo"])
- if(!ismob(M))
- to_chat(usr, "This can only be used on instances of type /mob")
- return
-
- var/location_description = ""
- var/special_role_description = ""
- var/health_description = ""
- var/gender_description = ""
- var/turf/T = get_turf(M)
-
- //Location
- if(isturf(T))
- if(isarea(T.loc))
- location_description = "([M.loc == T ? "at coordinates " : "in [M.loc] at coordinates "] [T.x], [T.y], [T.z] in area [T.loc])"
- else
- location_description = "([M.loc == T ? "at coordinates " : "in [M.loc] at coordinates "] [T.x], [T.y], [T.z])"
-
- //Job + antagonist
- if(M.mind)
- special_role_description = "Role: [M.mind.assigned_role]; Antagonist: [M.mind.special_role]; Has been rev: [(M.mind.has_been_rev)?"Yes":"No"]"
- else
- special_role_description = "Role: Mind datum missing Antagonist: Mind datum missing; Has been rev: Mind datum missing;"
-
- //Health
- if(isliving(M))
- var/mob/living/L = M
- var/status
- switch(M.stat)
- if(0) status = "Alive"
- if(1) status = "Unconscious"
- if(2) status = "Dead"
- health_description = "Status = [status]"
- health_description += "
Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()]"
- else
- health_description = "This mob type has no health to speak of."
-
- //Gener
- switch(M.gender)
- if(MALE,FEMALE) gender_description = "[M.gender]"
- else gender_description = "[M.gender]"
-
- to_chat(src.owner, "Info about [M.name]: ")
- to_chat(src.owner, "Mob type = [M.type]; Gender = [gender_description] Damage = [health_description]")
- to_chat(src.owner, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];")
- to_chat(src.owner, "Location = [location_description];")
- to_chat(src.owner, "[special_role_description]")
- to_chat(src.owner, "(PM) (PP) (VV) (SM) (FLW) (CA)")
+ admin_mob_info(M)
else if(href_list["adminspawncookie"])
if(!check_rights(R_ADMIN|R_EVENT)) return
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 1cc723ab903..01f6736e5ca 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -593,17 +593,25 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
"tournament janitor",
"pirate",
"space pirate",
+ "soviet tourist",
+ "soviet soldier",
"soviet admiral",
"tunnel clown",
+ "mime assassin",
"survivor",
+ "greytide",
+ "greytide leader",
+ "greytide xeno",
"masked killer",
"singuloth knight",
"dark lord",
"assassin",
"spy",
+ "vox",
"death commando",
"syndicate agent",
"syndicate operative",
+ "syndicate bomber",
"syndicate strike team",
"syndicate officer",
"chrono legionnaire",
@@ -746,30 +754,29 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("pirate")
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
- equip_special_id(M,get_all_accesses(), "Pirate", /obj/item/weapon/card/id)
+ equip_special_id(M,list(access_maint_tunnels), "Pirate", /obj/item/weapon/card/id)
- if("space pirate")
+ if("space pirate") // not spaceworthy, just has fancier coat.
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/pirate(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/pirate(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
- equip_special_id(M,get_all_accesses(), "Space Pirate", /obj/item/weapon/card/id)
-
- if("soviet soldier")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
- equip_special_id(M,get_all_accesses(), "Soviet Soldier", /obj/item/weapon/card/id)
+ equip_special_id(M,list(access_maint_tunnels), "Space Pirate", /obj/item/weapon/card/id)
if("tunnel clown")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask)
@@ -780,25 +787,106 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/suit/chaplain_hoodie(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store)
- equip_special_id(M,get_all_accesses(), "Tunnel Clown", /obj/item/weapon/card/id)
+ equip_special_id(M,list(access_clown, access_theatre, access_maint_tunnels), "Tunnel Clown", /obj/item/weapon/card/id)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
M.equip_to_slot_or_del(fire_axe, slot_r_hand)
+
+ if("mime assassin")
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/mime(M), slot_back)
+ if(M.gender == FEMALE)
+ M.equip_or_collect(new /obj/item/clothing/under/sexymime(M), slot_w_uniform)
+ M.equip_or_collect(new /obj/item/clothing/mask/gas/sexymime(M), slot_wear_mask)
+ else
+ M.equip_or_collect(new /obj/item/clothing/under/mime(M), slot_w_uniform)
+ M.equip_or_collect(new /obj/item/clothing/mask/gas/mime(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/beret(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/syndie_kit/caneshotgun, slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/toy/crayon/mime, slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/suppressor(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
+ var/obj/item/device/pda/mime/pda = new(M)
+ pda.owner = M.real_name
+ pda.ownjob = "Mime"
+ pda.name = "PDA-[M.real_name] ([pda.ownjob])"
+ M.equip_to_slot_or_del(pda, slot_wear_pda)
+ equip_special_id(M,list(access_mime, access_theatre, access_maint_tunnels), "Mime", /obj/item/weapon/card/id/syndicate)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
+
if("survivor")
M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- equip_special_id(M,get_all_accesses(), "Survivor", /obj/item/weapon/card/id)
+ equip_special_id(M,list(access_maint_tunnels), "Survivor", /obj/item/weapon/card/id)
for(var/obj/item/carried_item in M.contents)
if(!istype(carried_item, /obj/item/weapon/implant))
carried_item.add_blood(M)
+ if("greytide")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand)
+ M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
+ equip_special_id(M,list(access_maint_tunnels), "Greytide", /obj/item/weapon/card/id)
+
+ if("greytide leader")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand)
+ M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
+ equip_special_id(M,list(access_maint_tunnels), "Greytide Leader", /obj/item/weapon/card/id)
+
+ if("greytide xeno")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/xenos(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/xenos(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(M), slot_glasses)
+ M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_l_store)
+ M.equip_to_slot_or_del(new /obj/item/toy/toy_xeno(M), slot_r_store)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
+ equip_special_id(M,list(access_maint_tunnels), "Legit Xenomorph", /obj/item/weapon/card/id)
+
if("masked killer")
M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask)
@@ -809,7 +897,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- equip_special_id(M,get_all_accesses(), "Masked Killer", /obj/item/weapon/card/id/syndicate, "syndie")
+ equip_special_id(M,list(access_maint_tunnels), "Masked Killer", /obj/item/weapon/card/id/syndicate, "syndie")
var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
M.equip_to_slot_or_del(fire_axe, slot_r_hand)
for(var/obj/item/carried_item in M.contents)
@@ -821,6 +909,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_hand)
@@ -841,6 +930,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M)
for(var/obj/item/briefcase_item in sec_briefcase)
@@ -880,14 +970,39 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_r_store)
var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
DUST.implant(M)
- var/obj/item/weapon/implant/dust/STOR = new /obj/item/weapon/implant/storage(M)
- STOR.implant(M)
+ M.equip_to_slot_or_del(new /obj/item/weapon/implanter/storage(M), slot_in_backpack)
var/obj/item/device/pda/heads/pda = new(M)
pda.owner = M.real_name
pda.ownjob = "Spy"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
M.equip_to_slot_or_del(pda, slot_belt)
- equip_special_id(M,get_all_accesses(), "Spy", /obj/item/weapon/card/id/syndicate, "syndie")
+ equip_special_id(M,list(access_maint_tunnels), "Spy", /obj/item/weapon/card/id/syndicate, "syndie")
+
+
+ if("vox")
+ if(istype(M, /mob/living/carbon/human/voxarmalis)) // have to do this, they cannot wear normal vox gear!
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/vox_grey(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/vox/vox_robes (M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate/vox(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate, slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow/vox, slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic, slot_l_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/vox, slot_r_store)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle, slot_glasses)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight, slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs/cable/zipties, slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/flash, slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/noisecannon, slot_in_backpack)
+ equip_special_id(M,get_all_accesses(), "Vox Armalis", /obj/item/weapon/card/id/syndicate/vox, "syndie")
+ else
+ M.equip_vox_raider()
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_l_hand)
+ M.regenerate_icons()
if("death commando")
M.equip_death_commando()
@@ -909,15 +1024,31 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
U.hidden_uplink.uses = 20
M.equip_to_slot_or_del(U, slot_r_store)
+ if("syndicate bomber")
+ M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
+ M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
+ M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/syndicatedetonator(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
+ M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
+ equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Bomber", /obj/item/weapon/card/id/syndicate, "syndie")
+
if("syndicate operative")
M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/ammo_box/magazine/m10mm(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/crowbar/red(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/clothing/glasses/night(M), slot_glasses)
M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt)
@@ -948,8 +1079,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/clothing/glasses/thermal(M), slot_glasses)
M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt)
M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store)
@@ -974,6 +1105,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_or_collect(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/clothing/head/that(M), slot_head)
M.equip_or_collect(new /obj/item/device/radio/headset/ert(M), slot_l_ear)
M.equip_or_collect(new /obj/item/device/pda/(M), slot_wear_pda)
@@ -989,6 +1121,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
@@ -1007,6 +1140,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
@@ -1051,6 +1185,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // job has /obj/item/clothing/glasses/hud/security/sunglasses
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad/officer(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
@@ -1078,6 +1213,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_in_backpack)
@@ -1117,7 +1253,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
if("red wizard")
@@ -1130,7 +1266,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
if("marisa wizard")
@@ -1143,20 +1279,53 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
+ if("soviet tourist")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
+ equip_special_id(M,list(access_maint_tunnels), "Soviet Tourist", /obj/item/weapon/card/id)
+
+ if("soviet soldier")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
+ equip_special_id(M,list(access_maint_tunnels), "Soviet Soldier", /obj/item/weapon/card/id)
+
if("soviet admiral")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Admiral", /obj/item/weapon/card/id, "commander")
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
+ equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Soviet Admiral", /obj/item/weapon/card/id, "commander")
//W.icon_state = "commander"
if("chrono legionnaire")
diff --git a/code/modules/client/preference/loadout/loadout_general.dm b/code/modules/client/preference/loadout/loadout_general.dm
index 40d581d030e..6447c2bed2a 100644
--- a/code/modules/client/preference/loadout/loadout_general.dm
+++ b/code/modules/client/preference/loadout/loadout_general.dm
@@ -29,7 +29,7 @@
/datum/gear/sechud
display_name = "a classic security HUD"
path = /obj/item/clothing/glasses/hud/security
- allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
+ allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent")
/datum/gear/matches
display_name = "a box of matches"
@@ -38,3 +38,35 @@
/datum/gear/cards
display_name = "a deck of cards"
path = /obj/item/toy/cards/deck
+
+/datum/gear/blackbandana
+ display_name = "bandana, black"
+ path = /obj/item/clothing/mask/bandana/black
+
+/datum/gear/purplebandana
+ display_name = "bandana, purple"
+ path = /obj/item/clothing/mask/bandana/purple
+
+/datum/gear/orangebandana
+ display_name = "bandana, orange"
+ path = /obj/item/clothing/mask/bandana/orange
+
+/datum/gear/greenbandana
+ display_name = "bandana, green"
+ path = /obj/item/clothing/mask/bandana/green
+
+/datum/gear/bluebandana
+ display_name = "bandana, blue"
+ path = /obj/item/clothing/mask/bandana/blue
+
+/datum/gear/redbandana
+ display_name = "bandana, red"
+ path = /obj/item/clothing/mask/bandana/red
+
+/datum/gear/goldbandana
+ display_name = "bandana, gold"
+ path = /obj/item/clothing/mask/bandana/gold
+
+/datum/gear/skullbandana
+ display_name = "bandana, skull"
+ path = /obj/item/clothing/mask/bandana/skull
diff --git a/code/modules/client/preference/loadout/loadout_shoes.dm b/code/modules/client/preference/loadout/loadout_shoes.dm
index 97e64e74f83..ec32e30d661 100644
--- a/code/modules/client/preference/loadout/loadout_shoes.dm
+++ b/code/modules/client/preference/loadout/loadout_shoes.dm
@@ -4,5 +4,15 @@
sort_category = "Shoes"
/datum/gear/shoes/sandals
- display_name = "sandals"
- path = /obj/item/clothing/shoes/sandal
\ No newline at end of file
+ display_name = "sandals, wooden"
+ path = /obj/item/clothing/shoes/sandal
+
+/datum/gear/shoes/fancysandals
+ display_name = "sandals, fancy"
+ cost = 5
+ path = /obj/item/clothing/shoes/sandal/fancy
+
+/datum/gear/shoes/dressshoes
+ display_name = "dress shoes"
+ cost = 5
+ path = /obj/item/clothing/shoes/centcom
diff --git a/code/modules/client/preference/loadout/loadout_suit.dm b/code/modules/client/preference/loadout/loadout_suit.dm
index 29f0c15c71c..2ac4b3bb7e9 100644
--- a/code/modules/client/preference/loadout/loadout_suit.dm
+++ b/code/modules/client/preference/loadout/loadout_suit.dm
@@ -59,7 +59,7 @@
/datum/gear/suit/coat/job/miner
display_name = "winter coat, miner"
path = /obj/item/clothing/suit/hooded/wintercoat/miner
- allowed_roles = list("Miner")
+ allowed_roles = list("Shaft Miner")
//LABCOATS
/datum/gear/suit/labcoat_emt
@@ -144,3 +144,17 @@
/datum/gear/suit/blackhoodie
display_name = "hoodie, black"
path = /obj/item/clothing/suit/hooded/hoodie
+
+//SUITS!
+
+/datum/gear/suit/blacksuit
+ display_name = "suit jacket, black"
+ path = /obj/item/clothing/suit/storage/lawyer/blackjacket
+
+/datum/gear/suit/bluesuit
+ display_name = "suit jacket, blue"
+ path = /obj/item/clothing/suit/storage/lawyer/bluejacket
+
+/datum/gear/suit/purplesuit
+ display_name = "suit jacket, purple"
+ path = /obj/item/clothing/suit/storage/lawyer/purpjacket
diff --git a/code/modules/client/preference/loadout/loadout_uniform.dm b/code/modules/client/preference/loadout/loadout_uniform.dm
index 8768e15199c..aaec97829c8 100644
--- a/code/modules/client/preference/loadout/loadout_uniform.dm
+++ b/code/modules/client/preference/loadout/loadout_uniform.dm
@@ -66,7 +66,7 @@
/datum/gear/uniform/skirt/job/med
display_name = "skirt, medical"
path = /obj/item/clothing/under/rank/medical/skirt
- allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic")
+ allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic","Brig Physician")
/datum/gear/uniform/skirt/job/sci
display_name = "skirt, scientist"
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index f7253a82cdf..6e53e8a9b04 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -372,3 +372,17 @@
desc = "A horribly bloated and mismatched human head."
icon_state = "lingspacehelmet"
item_state = "lingspacehelmet"
+
+/obj/item/clothing/head/papersack
+ name = "paper sack hat"
+ desc = "A paper sack with crude holes cut out for eyes. Useful for hiding one's identity or ugliness."
+ icon_state = "papersack"
+ flags = BLOCKHAIR
+ flags_inv = HIDEFACE|HIDEEARS
+
+/obj/item/clothing/head/papersack/smiley
+ name = "paper sack hat"
+ desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all."
+ icon_state = "papersack_smile"
+ flags = BLOCKHAIR
+ flags_inv = HIDEFACE|HIDEEARS
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 184d4c14c40..dd66740f966 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -222,37 +222,37 @@
/obj/item/clothing/mask/bandana/attack_self(var/mob/user)
adjustmask(user)
-obj/item/clothing/mask/bandana/red
+/obj/item/clothing/mask/bandana/red
name = "red bandana"
icon_state = "bandred"
item_color = "red"
desc = "It's a red bandana."
-obj/item/clothing/mask/bandana/blue
+/obj/item/clothing/mask/bandana/blue
name = "blue bandana"
icon_state = "bandblue"
item_color = "blue"
desc = "It's a blue bandana."
-obj/item/clothing/mask/bandana/gold
+/obj/item/clothing/mask/bandana/gold
name = "gold bandana"
icon_state = "bandgold"
item_color = "yellow"
desc = "It's a gold bandana."
-obj/item/clothing/mask/bandana/green
+/obj/item/clothing/mask/bandana/green
name = "green bandana"
icon_state = "bandgreen"
item_color = "green"
desc = "It's a green bandana."
-obj/item/clothing/mask/bandana/orange
+/obj/item/clothing/mask/bandana/orange
name = "orange bandana"
icon_state = "bandorange"
item_color = "orange"
desc = "It's an orange bandana."
-obj/item/clothing/mask/bandana/purple
+/obj/item/clothing/mask/bandana/purple
name = "purple bandana"
icon_state = "bandpurple"
item_color = "purple"
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 4a059158e2f..6f946146aa4 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -26,6 +26,24 @@
time = 15
category = CAT_WEAPON
+/datum/crafting_recipe/lance
+ name = "explosive lance (grenade)"
+ result = /obj/item/weapon/twohanded/spear
+ reqs = list(/obj/item/weapon/twohanded/spear = 1,
+ /obj/item/weapon/grenade = 1)
+ parts = list(/obj/item/weapon/grenade = 1)
+ time = 15
+ category = CAT_WEAPON
+
+/datum/crafting_recipe/molotov
+ name = "Molotov"
+ result = /obj/item/weapon/reagent_containers/food/drinks/bottle/molotov
+ reqs = list(/obj/item/weapon/reagent_containers/glass/rag = 1,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle = 1)
+ parts = list(/obj/item/weapon/reagent_containers/food/drinks/bottle = 1)
+ time = 40
+ category = CAT_WEAPON
+
/datum/crafting_recipe/stunprod
name = "Stunprod"
result = /obj/item/weapon/melee/baton/cattleprod
@@ -109,7 +127,9 @@
result = /obj/item/weapon/flamethrower
reqs = list(/obj/item/weapon/weldingtool = 1,
/obj/item/device/assembly/igniter = 1,
- /obj/item/stack/rods = 2)
+ /obj/item/stack/rods = 1)
+ parts = list(/obj/item/device/assembly/igniter = 1,
+ /obj/item/weapon/weldingtool = 1)
tools = list(/obj/item/weapon/screwdriver)
time = 10
category = CAT_WEAPON
@@ -206,6 +226,16 @@
time = 100
category = CAT_WEAPON
+/datum/crafting_recipe/chainsaw
+ name = "Chainsaw"
+ result = /obj/item/weapon/twohanded/required/chainsaw
+ reqs = list(/obj/item/weapon/circular_saw = 1,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/stack/sheet/plasteel = 1)
+ tools = list(/obj/item/weapon/weldingtool)
+ time = 50
+ category = CAT_WEAPON
+
/datum/crafting_recipe/spear
name = "Spear"
result = /obj/item/weapon/twohanded/spear
@@ -223,6 +253,13 @@
/datum/reagent/holywater = 10)
parts = list(/obj/item/device/camera = 1)
+/datum/crafting_recipe/papersack
+ name = "Paper Sack"
+ result = /obj/item/weapon/storage/box/papersack
+ time = 10
+ reqs = list(/obj/item/weapon/paper = 5)
+ category = CAT_MISC
+
/datum/crafting_recipe/notreallysoap
name = "Homemade Soap"
result = /obj/item/weapon/soap/ducttape
@@ -264,4 +301,12 @@
result = /obj/item/latexballon
time = 15
reqs = list(/obj/item/clothing/gloves/color/latex = 1,
- /obj/item/stack/cable_coil = 5)
\ No newline at end of file
+ /obj/item/stack/cable_coil = 5)
+
+/datum/crafting_recipe/gold_horn
+ name = "Golden bike horn"
+ result = /obj/item/weapon/bikehorn/golden
+ time = 20
+ reqs = list(/obj/item/stack/sheet/mineral/bananium = 5,
+ /obj/item/weapon/bikehorn)
+ category = CAT_MISC
\ No newline at end of file
diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm
index 5955d60cbec..deaa1b85aa8 100644
--- a/code/modules/events/event_container.dm
+++ b/code/modules/events/event_container.dm
@@ -149,7 +149,7 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 100)),
//new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100)),
//new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100)),
- //new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 60)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 60)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 250, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 30), 1),
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index 0863302f5a0..93d80552de6 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -277,3 +277,70 @@
item_state = "carton"
isGlass = 0
list_reagents = list("limejuice" = 100)
+
+////////////////////////// MOLOTOV ///////////////////////
+/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov
+ name = "molotov cocktail"
+ desc = "A throwing weapon used to ignite things, typically filled with an accelerant. Recommended highly by rioters and revolutionaries. Light and toss."
+ icon_state = "vodkabottle"
+ list_reagents = list()
+ var/list/accelerants = list(/datum/reagent/ethanol,/datum/reagent/fuel,/datum/reagent/clf3,/datum/reagent/phlogiston,
+ /datum/reagent/napalm,/datum/reagent/hellwater,/datum/reagent/plasma,/datum/reagent/plasma_dust)
+ var/active = 0
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/CheckParts(list/parts_list)
+ ..()
+ var/obj/item/weapon/reagent_containers/food/drinks/bottle/B = locate() in contents
+ if(B)
+ icon_state = B.icon_state
+ B.reagents.copy_to(src, 100)
+ if(!B.isGlass)
+ desc += " You're not sure if making this out of a carton was the brightest idea."
+ isGlass = 0
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/throw_impact(atom/target,mob/thrower)
+ var/firestarter = 0
+ for(var/datum/reagent/R in reagents.reagent_list)
+ for(var/A in accelerants)
+ if(istype(R, A))
+ firestarter = 1
+ break
+ SplashReagents(target)
+ if(firestarter && active)
+ target.fire_act()
+ new /obj/effect/hotspot(get_turf(target))
+ ..()
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params)
+ if(is_hot(I) && !active)
+ active = 1
+ var/turf/bombturf = get_turf(src)
+ var/area/bombarea = get_area(bombturf)
+ message_admins("[key_name(user)]? has primed a [name] for detonation at [bombarea] (JMP).")
+ log_game("[key_name(user)] has primed a [name] for detonation at [bombarea] ([bombturf.x],[bombturf.y],[bombturf.z]).")
+
+ to_chat(user, "You light [src] on fire.")
+ overlays += fire_overlay
+ if(!isGlass)
+ spawn(50)
+ if(active)
+ var/counter
+ var/target = loc
+ for(counter = 0, counter < 2, counter++)
+ if(istype(target, /obj/item/weapon/storage))
+ var/obj/item/weapon/storage/S = target
+ target = S.loc
+ if(istype(target, /atom))
+ var/atom/A = target
+ SplashReagents(A)
+ A.fire_act()
+ qdel(src)
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/attack_self(mob/user)
+ if(active)
+ if(!isGlass)
+ to_chat(user, "The flame's spread too far on it!")
+ return
+ to_chat(user, "You snuff out the flame on \the [src].")
+ overlays -= fire_overlay
+ active = 0
\ No newline at end of file
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 4d58fee8e11..aa7d9ea4607 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -20,26 +20,32 @@
opacity = 1
var/health = 50
var/tmp/busy = 0
- var/list/valid_types = list(/obj/item/weapon/book, \
- /obj/item/weapon/tome, \
- /obj/item/weapon/spellbook, \
- /obj/item/weapon/storage/bible)
+ var/list/allowed_books = list(/obj/item/weapon/book, /obj/item/weapon/spellbook, /obj/item/weapon/storage/bible, /obj/item/weapon/tome) //Things allowed in the bookcase
/obj/structure/bookcase/initialize()
..()
for(var/obj/item/I in loc)
- if(is_type_in_list(I, valid_types))
+ if(is_type_in_list(I, allowed_books))
I.forceMove(src)
update_icon()
/obj/structure/bookcase/attackby(obj/O as obj, mob/user as mob, params)
if(busy) //So that you can't mess with it while deconstructing
return 1
- if(is_type_in_list(O, valid_types))
- user.drop_item()
+ if(is_type_in_list(O, allowed_books))
+ if(!user.drop_item())
+ return
O.forceMove(src)
update_icon()
return 1
+ else if(istype(O, /obj/item/weapon/storage/bag/books))
+ var/obj/item/weapon/storage/bag/books/B = O
+ for(var/obj/item/T in B.contents)
+ if(istype(T, /obj/item/weapon/book) || istype(T, /obj/item/weapon/spellbook) || istype(T, /obj/item/weapon/tome) || istype(T, /obj/item/weapon/storage/bible))
+ B.remove_from_storage(T, src)
+ to_chat(user, "You empty [O] into [src].")
+ update_icon()
+ return 1
else if(istype(O, /obj/item/weapon/wrench))
user.visible_message("[user] starts disassembling \the [src].", \
"You start disassembling \the [src].")
@@ -51,8 +57,6 @@
user.visible_message("[user] disassembles \the [src].", \
"You disassemble \the [src].")
busy = 0
- for(var/i = 1 to 5)
- new /obj/item/stack/sheet/wood(get_turf(src))
density = 0
qdel(src)
else
@@ -72,9 +76,6 @@
else
if(health <= 0)
visible_message("The bookcase is smashed apart!")
- new /obj/item/stack/sheet/wood(get_turf(src))
- new /obj/item/stack/sheet/wood(get_turf(src))
- new /obj/item/stack/sheet/wood(get_turf(src))
qdel(src)
return ..()
@@ -110,10 +111,10 @@
return
/obj/structure/bookcase/Destroy()
- for(var/i = 1 to 3)
+ for(var/i in 1 to 5)
new /obj/item/stack/sheet/wood(get_turf(src))
for(var/obj/item/I in contents)
- if(is_type_in_list(I, valid_types))
+ if(is_type_in_list(I, allowed_books))
I.forceMove(get_turf(src))
return ..()
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 559dac3abbf..9ebbb29ac02 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -110,7 +110,7 @@
if(!I) //If there's nothing to drop, the drop is automatically succesfull. If(unEquip) should generally be used to check for NODROP.
return 1
- if((I.flags & NODROP) && !force)
+ if(!canUnEquip(I, force))
return 0
if(I == r_hand)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index f30ff8ed0f2..3c18cddb18f 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -569,6 +569,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
return 1
return
+
/mob/living/carbon/unEquip(obj/item/I) //THIS PROC DID NOT CALL ..()
. = ..() //Sets the default return value to what the parent returns.
if(!. || !I) //We don't want to set anything to null if the parent returned 0.
@@ -1041,4 +1042,4 @@ so that different stomachs can handle things in different ways VB*/
/mob/living/carbon/proc/update_internals_hud_icon(internal_state = 0)
if(hud_used && hud_used.internals)
- hud_used.internals.icon_state = "internal[internal_state]"
\ No newline at end of file
+ hud_used.internals.icon_state = "internal[internal_state]"
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 0919c3de016..0264e874d17 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -107,15 +107,19 @@
if(slot_tie)
return 1
+// The actual dropping happens at the mob level - checks to prevent drops should
+// come here
+/mob/living/carbon/human/canUnEquip(obj/item/I, force)
+ . = ..()
+ var/obj/item/organ/O = I
+ if(istype(O) && O.owner == src)
+ . = 0 // keep a good grip on your heart
+
/mob/living/carbon/human/unEquip(obj/item/I)
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
if(!. || !I)
return
- var/obj/item/organ/internal/O = I //Organs shouldn't be removed unless you call droplimb.
- if(istype(O) && O.owner == src)
- return
-
if(I == wear_suit)
if(s_store)
unEquip(s_store, 1) //It makes no sense for your suit storage to stay on you if you drop your suit.
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 866c01c9702..921080c989a 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -8,7 +8,7 @@
Returns
standard 0 if fail
*/
-/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0)
+/mob/living/proc/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/used_weapon = null)
blocked = (100-blocked)/100
if(!damage || (blocked <= 0)) return 0
switch(damagetype)
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 689799680ec..a09589f22ee 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -153,7 +153,7 @@
var/see_ghosts = 0 //for the spoop of it
-/obj/item/device/camera/spooky/CheckParts()
+/obj/item/device/camera/spooky/CheckParts(list/parts_list)
..()
var/obj/item/device/camera/C = locate(/obj/item/device/camera) in contents
if(C)
diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm
index 9da5c8e6cb1..fafa27a24f7 100755
--- a/code/modules/pda/PDA.dm
+++ b/code/modules/pda/PDA.dm
@@ -300,15 +300,16 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
to_chat(usr, "You cannot do this while restrained.")
-/obj/item/device/pda/AltClick()
+/obj/item/device/pda/AltClick(mob/user)
+ ..()
if(issilicon(usr))
return
- if(can_use(usr))
+ if(can_use(user))
if(id)
remove_id()
else
- usr << "This PDA does not have an ID in it!"
+ to_chat(user, "This PDA does not have an ID in it!")
/obj/item/device/pda/proc/remove_id()
if(id)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 6a6933db72d..3bbfbb2248c 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -457,10 +457,15 @@ obj/structure/cable/proc/cableColor(var/colorC)
#define MAXCOIL 30
+var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \
+ new/datum/stack_recipe("cable restraints", /obj/item/weapon/restraints/handcuffs/cable, 15), \
+ )
+
/obj/item/stack/cable_coil
name = "cable coil"
icon = 'icons/obj/power.dmi'
icon_state = "coil"
+ item_state = "coil_red"
amount = MAXCOIL
max_amount = MAXCOIL
color = COLOR_RED
@@ -492,6 +497,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
pixel_x = rand(-2,2)
pixel_y = rand(-2,2)
update_icon()
+ recipes = cable_coil_recipes
update_wclass()
///////////////////////////////////
@@ -556,37 +562,12 @@ obj/structure/cable/proc/cableColor(var/colorC)
else
to_chat(user, "A coil of power cable. There are [get_amount()] lengths of cable in the coil.")
-
-/obj/item/stack/cable_coil/verb/make_restraint()
- set name = "Make Cable Restraints"
- set category = "Object"
- var/mob/M = usr
-
- if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned)
- if(!istype(usr.loc,/turf)) return
- if(src.amount <= 14)
- to_chat(usr, "You need at least 15 lengths to make restraints!")
- return
- var/obj/item/weapon/restraints/handcuffs/cable/B = new /obj/item/weapon/restraints/handcuffs/cable(usr.loc)
- B.color = color
- to_chat(usr, "You wind some cable together to make some restraints.")
- src.use(15)
- else
- to_chat(usr, "You cannot do that.")
- ..()
-
// Items usable on a cable coil :
// - Wirecutters : cut them duh !
// - Cable coil : merge cables
/obj/item/stack/cable_coil/attackby(obj/item/weapon/W, mob/user)
..()
- if( istype(W, /obj/item/weapon/wirecutters) && src.amount > 1)
- src.amount--
- new/obj/item/stack/cable_coil(user.loc, 1,color)
- to_chat(user, "You cut a piece off the cable coil.")
- src.update_icon()
- return
- else if(istype(W, /obj/item/stack/cable_coil))
+ if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = W
if(C.amount >= MAXCOIL)
to_chat(user, "The coil is too long, you cannot add any more cable to it.")
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 89119df21a8..2493e492d48 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -70,6 +70,14 @@
src.dir = turn(src.dir, 90)
return 1
+/obj/machinery/power/emitter/AltClick(mob/user)
+ if(user.incapacitated())
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!Adjacent(user))
+ return
+ rotate()
+
/obj/machinery/power/emitter/initialize()
..()
if(state == 2 && anchored)
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index 051440525f3..a75bdd3ec80 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -101,6 +101,14 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
src.dir = turn(src.dir, 270)
return 1
+/obj/structure/particle_accelerator/AltClick(mob/user)
+ if(user.incapacitated())
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!Adjacent(user))
+ return
+ rotate()
+
/obj/structure/particle_accelerator/verb/rotateccw()
set name = "Rotate Counter Clockwise"
set category = "Object"
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index bce80d857b1..ecc9c9ddc18 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -10,6 +10,8 @@ var/const/INGEST = 2
var/total_volume = 0
var/maximum_volume = 100
var/atom/my_atom = null
+ var/chem_temp = 300
+ var/list/datum/reagent/addiction_list = new/list()
/datum/reagents/New(maximum=100)
maximum_volume = maximum
@@ -56,17 +58,19 @@ var/const/INGEST = 2
current_list_element = rand(1,reagent_list.len)
while(total_transfered != amount)
- if(total_transfered >= amount) break
- if(total_volume <= 0 || !reagent_list.len) break
+ if(total_transfered >= amount)
+ break
+ if(total_volume <= 0 || !reagent_list.len)
+ break
if(current_list_element > reagent_list.len) current_list_element = 1
var/datum/reagent/current_reagent = reagent_list[current_list_element]
- src.remove_reagent(current_reagent.id, min(1, amount - total_transfered))
+ remove_reagent(current_reagent.id, min(1, amount - total_transfered))
current_list_element++
total_transfered++
- src.update_total()
+ update_total()
handle_reactions()
return total_transfered
@@ -94,7 +98,7 @@ var/const/INGEST = 2
/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
if(!target)
return
- if(src.total_volume <= 0)
+ if(total_volume <= 0)
return
var/datum/reagents/R
if(istype(target, /obj))
@@ -102,7 +106,7 @@ var/const/INGEST = 2
if(!O.reagents )
return
R = O.reagents
- else if(istype(target, /mob/living))
+ else if(isliving(target))
var/mob/living/M = target
if(!M.reagents)
return
@@ -112,10 +116,10 @@ var/const/INGEST = 2
else
return
- amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
- var/part = amount / src.total_volume
+ amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume)
+ var/part = amount / total_volume
var/trans_data = null
- for(var/datum/reagent/current_reagent in src.reagent_list)
+ for(var/datum/reagent/current_reagent in reagent_list)
if(!current_reagent)
continue
if(current_reagent.id == "blood" && ishuman(target))
@@ -126,59 +130,59 @@ var/const/INGEST = 2
if(preserve_data)
trans_data = copy_data(current_reagent)
- R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, src.chem_temp)
- src.remove_reagent(current_reagent.id, current_reagent_transfer)
+ R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp)
+ remove_reagent(current_reagent.id, current_reagent_transfer)
- src.update_total()
+ update_total()
R.update_total()
R.handle_reactions()
- src.handle_reactions()
+ handle_reactions()
return amount
/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1, safety = 0)
if(!target)
return
- if(!target.reagents || src.total_volume<=0)
+ if(!target.reagents || total_volume<=0)
return
var/datum/reagents/R = target.reagents
- amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
- var/part = amount / src.total_volume
+ amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume)
+ var/part = amount / total_volume
var/trans_data = null
- for(var/datum/reagent/current_reagent in src.reagent_list)
+ for(var/datum/reagent/current_reagent in reagent_list)
var/current_reagent_transfer = current_reagent.volume * part
if(preserve_data)
trans_data = copy_data(current_reagent)
R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data)
- src.update_total()
+ update_total()
R.update_total()
R.handle_reactions()
- src.handle_reactions()
+ handle_reactions()
return amount
/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N
if(!target)
return
- if(!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent))
+ if(!target.reagents || total_volume<=0 || !get_reagent_amount(reagent))
return
var/datum/reagents/R = target.reagents
- if(src.get_reagent_amount(reagent) 0) // added a limit to slime cores -- Muskets requested this
- matching_other = 1*/
- if(istype(my_atom, /obj/item/slime_extract))
- var/obj/item/slime_extract/M = my_atom
-
- if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this
- matching_other = 1
+ if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this
+ matching_other = 1
if(min_temp == 0)
min_temp = chem_temp
@@ -302,14 +301,14 @@ var/const/INGEST = 2
var/list/seen = viewers(4, get_turf(my_atom))
for(var/mob/M in seen)
if(!C.no_message)
- to_chat(M, "\blue [bicon(my_atom)] [C.mix_message]")
+ to_chat(M, "[bicon(my_atom)] [C.mix_message]")
if(istype(my_atom, /obj/item/slime_extract))
var/obj/item/slime_extract/ME2 = my_atom
ME2.Uses--
if(ME2.Uses <= 0) // give the notification that the slime core is dead
for(var/mob/M in seen)
- to_chat(M, "\blue [bicon(my_atom)] The [my_atom]'s power is consumed in the reaction.")
+ to_chat(M, "[bicon(my_atom)] The [my_atom]'s power is consumed in the reaction.")
ME2.name = "used slime extract"
ME2.desc = "This extract has been used up."
@@ -334,7 +333,7 @@ var/const/INGEST = 2
for(var/A in reagent_list)
var/datum/reagent/R = A
if(R.id == reagent)
- if(istype(my_atom, /mob/living))
+ if(isliving(my_atom))
var/mob/living/M = my_atom
R.reagent_deleted(M)
reagent_list -= A
@@ -361,10 +360,8 @@ var/const/INGEST = 2
del_reagent(R.id)
return 0
-/datum/reagents/proc/reaction_check(mob/M, datum/reagent/R)
+/datum/reagents/proc/reaction_check(mob/living/M, datum/reagent/R)
var/can_process = 0
- if(!istype(M, /mob/living)) //Non-living mobs can't metabolize reagents, so don't bother trying (runtime safety check)
- return can_process
if(ishuman(M))
var/mob/living/carbon/human/H = M
//Check if this mob's species is set and can process this type of reagent
@@ -389,45 +386,28 @@ var/const/INGEST = 2
switch(method)
if(TOUCH)
for(var/datum/reagent/R in reagent_list)
- if(ismob(A))
- if(!R)
- return
+ if(isliving(A))
var/check = reaction_check(A, R)
if(!check)
continue
else
R.reaction_mob(A, TOUCH, R.volume*volume_modifier)
if(isturf(A))
- if(!R)
- return
- else
- R.reaction_turf(A, R.volume*volume_modifier)
+ R.reaction_turf(A, R.volume*volume_modifier)
if(isobj(A))
- if(!R)
- return
- else
- R.reaction_obj(A, R.volume*volume_modifier)
+ R.reaction_obj(A, R.volume*volume_modifier)
if(INGEST)
for(var/datum/reagent/R in reagent_list)
- if(ismob(A) && R)
- if(!R)
- return
+ if(isliving(A))
var/check = reaction_check(A, R)
if(!check)
continue
else
R.reaction_mob(A, INGEST, R.volume*volume_modifier)
- if(isturf(A) && R)
- if(!R)
- return
- else
- R.reaction_turf(A, R.volume*volume_modifier)
- if(isobj(A) && R)
- if(!R)
- return
- else
- R.reaction_obj(A, R.volume*volume_modifier)
- return
+ if(isturf(A))
+ R.reaction_turf(A, R.volume*volume_modifier)
+ if(isobj(A))
+ R.reaction_obj(A, R.volume*volume_modifier)
/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15)
for(var/r_id in list_reagents)
@@ -435,10 +415,12 @@ var/const/INGEST = 2
add_reagent(r_id, amt, data)
/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300)
- if(!isnum(amount)) return 1
+ if(!isnum(amount))
+ return 1
update_total()
if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen.
- if(amount <= 0) return 0
+ if(amount <= 0)
+ return 0
chem_temp = round(((amount * reagtemp) + (total_volume * chem_temp)) / (total_volume + amount)) //equalize with new chems
for(var/A in reagent_list)
@@ -476,7 +458,8 @@ var/const/INGEST = 2
/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to
- if(!isnum(amount)) return 1
+ if(!isnum(amount))
+ return 1
for(var/A in reagent_list)
var/datum/reagent/R = A
@@ -495,10 +478,13 @@ var/const/INGEST = 2
for(var/A in reagent_list)
var/datum/reagent/R = A
if(R.id == reagent)
- if(!amount) return R
+ if(!amount)
+ return R
else
- if(R.volume >= amount) return R
- else return 0
+ if(R.volume >= amount)
+ return R
+ else
+ return 0
return 0
@@ -522,7 +508,8 @@ var/const/INGEST = 2
. = locate(type) in reagent_list
/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included.
- if(!isnum(amount)) return 1
+ if(!isnum(amount))
+ return 1
var/has_removed_reagent = 0
@@ -566,8 +553,10 @@ var/const/INGEST = 2
D.data = new_data
/datum/reagents/proc/copy_data(datum/reagent/current_reagent)
- if(!current_reagent || !current_reagent.data) return null
- if(!istype(current_reagent.data, /list)) return current_reagent.data
+ if(!current_reagent || !current_reagent.data)
+ return null
+ if(!istype(current_reagent.data, /list))
+ return current_reagent.data
var/list/trans_data = current_reagent.data.Copy()
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 197df4425ec..fd5faf4d7bd 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -167,7 +167,7 @@
if(href_list["dispense"])
if(dispensable_reagents.Find(href_list["dispense"]) && beaker != null)
- var/obj/item/weapon/reagent_containers/glass/B = src.beaker
+ var/obj/item/weapon/reagent_containers/glass/B = beaker
var/datum/reagents/R = B.reagents
var/space = R.maximum_volume - R.total_volume
@@ -207,21 +207,21 @@
S.use(1)
else
if(!user.drop_item())
- to_chat(user, "\The [B] is stuck to you!")
+ to_chat(user, "[B] is stuck to you!")
return
qdel(B)
broken_requirements -= broken_requirements[1]
to_chat(user, "You fix [src].")
return
- if(src.beaker)
+ if(beaker)
to_chat(user, "Something is already loaded into the machine.")
return
if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks))
- src.beaker = B
+ beaker = B
if(!user.drop_item())
- to_chat(user, "\The [B] is stuck to you!")
+ to_chat(user, "[B] is stuck to you!")
return
B.forceMove(src)
to_chat(user, "You set [B] on the machine.")
@@ -248,10 +248,10 @@
return
/obj/machinery/chem_dispenser/attack_ai(mob/user)
- return src.attack_hand(user)
+ return attack_hand(user)
/obj/machinery/chem_dispenser/attack_ghost(mob/user)
- return src.attack_hand(user)
+ return attack_hand(user)
/obj/machinery/chem_dispenser/attack_hand(mob/user)
if(stat & BROKEN)
@@ -362,10 +362,10 @@
playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
if(anchored)
anchored = 0
- to_chat(user, "\The [src] can now be moved.")
+ to_chat(user, "[src] can now be moved.")
else if(!anchored)
anchored = 1
- to_chat(user, "\The [src] is now secured.")
+ to_chat(user, "[src] is now secured.")
if(panel_open)
if(istype(I, /obj/item/weapon/crowbar))
@@ -430,13 +430,13 @@
if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass))
- if(src.beaker)
+ if(beaker)
to_chat(user, "A beaker is already loaded into the machine.")
return
if(!user.drop_item())
- to_chat(user, "\The [B] is stuck to you!")
+ to_chat(user, "[B] is stuck to you!")
return
- src.beaker = B
+ beaker = B
B.forceMove(src)
to_chat(user, "You add the beaker to the machine!")
nanomanager.update_uis(src)
@@ -444,14 +444,14 @@
else if(istype(B, /obj/item/weapon/storage/pill_bottle))
- if(src.loaded_pill_bottle)
+ if(loaded_pill_bottle)
to_chat(user, "A pill bottle is already loaded into the machine.")
return
if(!user.drop_item())
- to_chat(user, "\The [B] is stuck to you!")
+ to_chat(user, "[B] is stuck to you!")
return
- src.loaded_pill_bottle = B
+ loaded_pill_bottle = B
B.forceMove(src)
to_chat(user, "You add the pill bottle into the dispenser slot!")
nanomanager.update_uis(src)
@@ -461,13 +461,13 @@
if(..())
return 1
- src.add_fingerprint(usr)
+ add_fingerprint(usr)
usr.set_machine(src)
if(href_list["ejectp"])
if(loaded_pill_bottle)
- loaded_pill_bottle.forceMove(src.loc)
+ loaded_pill_bottle.forceMove(loc)
loaded_pill_bottle = null
else if(href_list["close"])
usr << browse(null, "window=chem_master")
@@ -476,12 +476,11 @@
return
if(href_list["print_p"])
- if(!(src.printing))
- src.printing = 1
- for(var/mob/O in viewers(usr))
- O.show_message("\blue \the [src] rattles and prints out a sheet of paper.", 1)
+ if(!(printing))
+ printing = 1
+ visible_message("[src] rattles and prints out a sheet of paper.")
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc )
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
P.info = "Chemical Analysis
"
P.info += "Time of analysis: [worldtime2text(world.time)]
"
P.info += "Chemical name: [href_list["name"]]
"
@@ -499,7 +498,7 @@
P.info += "Description: [href_list["desc"]]"
P.info += "
Notes:
"
P.name = "Chemical Analysis - [href_list["name"]]"
- src.printing = null
+ printing = null
if(beaker)
var/datum/reagents/R = beaker.reagents
@@ -537,7 +536,7 @@
var/id = href_list["addcustom"]
useramount = input("Select the amount to transfer.", 30, useramount) as num
useramount = isgoodnumber(useramount)
- src.Topic(null, list("amount" = "[useramount]", "add" = "[id]"))
+ Topic(null, list("amount" = "[useramount]", "add" = "[id]"))
else if(href_list["remove"])
@@ -555,7 +554,7 @@
var/id = href_list["removecustom"]
useramount = input("Select the amount to transfer.", 30, useramount) as num
useramount = isgoodnumber(useramount)
- src.Topic(null, list("amount" = "[useramount]", "remove" = "[id]"))
+ Topic(null, list("amount" = "[useramount]", "remove" = "[id]"))
else if(href_list["toggle"])
mode = !mode
@@ -586,23 +585,23 @@
return
name = reject_bad_text(name)
while(count--)
- var/obj/item/weapon/reagent_containers/food/pill/P = new/obj/item/weapon/reagent_containers/food/pill(src.loc)
+ var/obj/item/weapon/reagent_containers/food/pill/P = new/obj/item/weapon/reagent_containers/food/pill(loc)
if(!name) name = reagents.get_master_reagent_name()
P.name = "[name] pill"
P.pixel_x = rand(-7, 7) //random position
P.pixel_y = rand(-7, 7)
P.icon_state = "pill"+pillsprite
reagents.trans_to(P,amount_per_pill)
- if(src.loaded_pill_bottle)
+ if(loaded_pill_bottle)
if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots)
P.forceMove(loaded_pill_bottle)
- src.updateUsrDialog()
+ updateUsrDialog()
else
var/name = input(usr,"Name:","Name your bag!",reagents.get_master_reagent_name()) as text|null
if(!name)
return
name = reject_bad_text(name)
- var/obj/item/weapon/reagent_containers/food/condiment/pack/P = new/obj/item/weapon/reagent_containers/food/condiment/pack(src.loc)
+ var/obj/item/weapon/reagent_containers/food/condiment/pack/P = new/obj/item/weapon/reagent_containers/food/condiment/pack(loc)
if(!name) name = reagents.get_master_reagent_name()
P.originalname = name
P.name = "[name] pack"
@@ -627,7 +626,7 @@
name = reject_bad_text(name)
var/is_medical_patch = chemical_safety_check(reagents)
while(count--)
- var/obj/item/weapon/reagent_containers/food/pill/patch/P = new/obj/item/weapon/reagent_containers/food/pill/patch(src.loc)
+ var/obj/item/weapon/reagent_containers/food/pill/patch/P = new/obj/item/weapon/reagent_containers/food/pill/patch(loc)
if(!name) name = reagents.get_master_reagent_name()
P.name = "[name] patch"
P.pixel_x = rand(-7, 7) //random position
@@ -642,7 +641,7 @@
if(!name)
return
name = reject_bad_text(name)
- var/obj/item/weapon/reagent_containers/glass/bottle/P = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
+ var/obj/item/weapon/reagent_containers/glass/bottle/P = new/obj/item/weapon/reagent_containers/glass/bottle(loc)
if(!name) name = reagents.get_master_reagent_name()
P.name = "[name] bottle"
P.pixel_x = rand(-7, 7) //random position
@@ -650,7 +649,7 @@
P.icon_state = "bottle"+bottlesprite
reagents.trans_to(P,30)
else
- var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc)
+ var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(loc)
reagents.trans_to(P,50)
else if(href_list["change_pill"])
#define MAX_PILL_SPRITE 20 //max icon state of the pill sprites
@@ -693,10 +692,10 @@
return
/obj/machinery/chem_master/attack_ai(mob/user)
- return src.attack_hand(user)
+ return attack_hand(user)
/obj/machinery/chem_master/attack_ghost(mob/user)
- return src.attack_hand(user)
+ return attack_hand(user)
/obj/machinery/chem_master/attack_hand(mob/user)
if(..())
@@ -733,7 +732,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
- ui = new(user, src, ui_key, "chem_master.tmpl", src.name, 575, 400)
+ ui = new(user, src, ui_key, "chem_master.tmpl", name, 575, 400)
ui.set_initial_data(data)
ui.open()
@@ -793,7 +792,7 @@
default_deconstruction_crowbar(B)
return 1
else
- to_chat(user, "You can't use the [src.name] while it's panel is opened!")
+ to_chat(user, "You can't use the [name] while it's panel is opened!")
return 1
else
..()
@@ -884,12 +883,12 @@
return 1
else
if(!user.drop_item())
- to_chat(user, "\The [O] is stuck to you!")
+ to_chat(user, "[O] is stuck to you!")
return
- src.beaker = O
+ beaker = O
O.forceMove(src)
update_icon()
- src.updateUsrDialog()
+ updateUsrDialog()
return 0
if(holdingitems && holdingitems.len >= limit)
@@ -910,7 +909,7 @@
if(!O.contents.len)
to_chat(user, "You empty the plant bag into the All-In-One grinder.")
- src.updateUsrDialog()
+ updateUsrDialog()
return 0
@@ -921,7 +920,7 @@
user.unEquip(O)
O.forceMove(src)
holdingitems += O
- src.updateUsrDialog()
+ updateUsrDialog()
return 0
/obj/machinery/reagentgrinder/attack_ai(mob/user)
@@ -989,7 +988,7 @@
eject()
if("detach")
detach()
- src.updateUsrDialog()
+ updateUsrDialog()
return
/obj/machinery/reagentgrinder/proc/detach()
@@ -998,7 +997,7 @@
return
if(!beaker)
return
- beaker.forceMove(src.loc)
+ beaker.forceMove(loc)
beaker = null
update_icon()
@@ -1010,7 +1009,7 @@
return
for(var/obj/item/O in holdingitems)
- O.forceMove(src.loc)
+ O.forceMove(loc)
holdingitems -= O
holdingitems = list()
@@ -1071,7 +1070,7 @@
return
if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
return
- playsound(src.loc, 'sound/machines/juicer.ogg', 20, 1)
+ playsound(loc, 'sound/machines/juicer.ogg', 20, 1)
var/offset = prob(50) ? -2 : 2
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
inuse = 1
@@ -1111,7 +1110,7 @@
return
if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
return
- playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
+ playsound(loc, 'sound/machines/blender.ogg', 50, 1)
var/offset = prob(50) ? -2 : 2
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
inuse = 1
diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/Chemistry-Readme.dm
index fee6e61e2b9..cae0c31162c 100644
--- a/code/modules/reagents/Chemistry-Readme.dm
+++ b/code/modules/reagents/Chemistry-Readme.dm
@@ -24,22 +24,22 @@ About the Holder:
The holder (reagents datum) is the datum that holds a list of all reagents
currently in the object.It also has all the procs needed to manipulate reagents
- remove_any(var/amount)
+ remove_any(amount)
This proc removes reagents from the holder until the passed amount
is matched. It'll try to remove some of ALL reagents contained.
- trans_to(var/obj/target, var/amount)
+ trans_to(obj/target, amount)
This proc equally transfers the contents of the holder to another
objects holder. You need to pass it the object (not the holder) you want
to transfer to and the amount you want to transfer. Its return value is the
actual amount transfered (if one of the objects is full/empty)
- trans_id_to(var/obj/target, var/reagent, var/amount)
+ trans_id_to(obj/target, reagent, amount)
Same as above but only for a specific reagent in the reagent list.
If the specified amount is greater than what is available, it will use
the amount of the reagent that is available. If no reagent exists, returns null.
- metabolize(var/mob/M)
+ metabolize(mob/living/M)
This proc is called by the mobs life proc. It simply calls on_mob_life for
all contained reagents. You shouldnt have to use this one directly.
@@ -49,16 +49,13 @@ About the Holder:
Currently, this proc is automatically called by trans_to.
- Modified from the original to preserve reagent data across reactions (originally for xenoarchaeology)
- isolate_reagent(var/reagent)
+ isolate_reagent(reagent)
Pass it a reagent id and it will remove all reagents but that one.
It's that simple.
- del_reagent(var/reagent)
+ del_reagent(reagent)
Completely remove the reagent with the matching id.
- reaction_fire(exposed_temp)
- Simply calls the reaction_fire procs of all contained reagents.
-
update_total()
This one simply updates the total volume of the holder.
(the volume of all reagents added together)
@@ -66,7 +63,7 @@ About the Holder:
clear_reagents()
This proc removes ALL reagents from the holder.
- reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=0)
+ reaction(atom/A, method=TOUCH, volume_modifier=0)
This proc calls the appropriate reaction procs of the reagents.
I.e. if A is an object, it will call the reagents reaction_obj
proc. The method var is used for reaction on mobs. It simply tells
@@ -79,22 +76,22 @@ About the Holder:
contact with the reagents of a holder. (in the 'splash' part of a beaker i.e.)
More on the reaction in the reagent part of this readme.
- add_reagent(var/reagent, var/amount, var/data)
+ add_reagent(reagent, amount, data)
Attempts to add X of the matching reagent to the holder.
You wont use this much. Mostly in new procs for pre-filled
objects.
- remove_reagent(var/reagent, var/amount)
+ remove_reagent(reagent, amount)
The exact opposite of the add_reagent proc.
- Modified from original to return the reagent's data, in order to preserve reagent data across reactions (originally for xenoarchaeology)
- has_reagent(var/reagent, var/amount)
+ has_reagent(reagent, amount)
Returns 1 if the holder contains this reagent.
Or 0 if not.
If you pass it an amount it will additionally check
if the amount is matched. This is optional.
- get_reagent_amount(var/reagent)
+ get_reagent_amount(reagent)
Returns the amount of the matching reagent inside the
holder. Returns 0 if the reagent is missing.
@@ -123,26 +120,27 @@ About Reagents:
Reagents are all the things you can mix and fille in bottles etc. This can be anything from
rejuvs over water to ... iron. Each reagent also has a few procs - i'll explain those below.
- reaction_mob(var/mob/M, var/method=TOUCH)
+ reaction_mob(mob/living/M, method=TOUCH)
This is called by the holder's reation proc.
This version is only called when the reagent
reacts with a mob. The method var can be either
TOUCH or INGEST. You'll want to put stuff like
- acid-facemelting in here.
+ acid-facemelting in here. Should only ever be
+ called, directly, on living mobs.
- reaction_obj(var/obj/O)
+ reaction_obj(obj/O)
This is called by the holder's reation proc.
This version is called when the reagents reacts
with an object. You'll want to put stuff like
object melting in here ... or something. i dunno.
- reaction_turf(var/turf/T)
+ reaction_turf(turf/T)
This is called by the holder's reation proc.
This version is called when the reagents reacts
with a turf. You'll want to put stuff like extra
slippery floors for lube or something in here.
- on_mob_life(var/mob/M)
+ on_mob_life(mob/living/M)
This proc is called everytime the mobs life proc executes.
This is the place where you put damage for toxins ,
drowsyness for sleep toxins etc etc.
@@ -166,8 +164,7 @@ About Reagents:
The name of the reagent.
data
- This var can be used for whatever the fuck you want. I used it for the sleep
- toxins to make them work slowly instead of instantly. You could also use this
+ This var can be used for whatever the fuck you want.You could use this
for DNA in a blood reagent or ... well whatever you want.
color
@@ -185,7 +182,7 @@ About Recipes:
Recipes are simple datums that contain a list of required reagents and a result.
They also have a proc that is called when the recipe is matched.
- on_reaction(var/datum/reagents/holder, var/created_volume)
+ on_reaction(datum/reagents/holder, created_volume)
This proc is called when the recipe is matched.
You'll want to add explosions etc here.
To find the location you'll have to do something
@@ -232,7 +229,7 @@ About the Tools:
R.my_atom = src, <<< set the holders my_atom to src so that we know where we are.
This can also be done by calling a convenience proc:
- atom/proc/create_reagents(var/max_volume)
+ atom/proc/create_reagents(max_volume)
Other important stuff:
diff --git a/code/modules/reagents/newchem/Blob-Reagents.dm b/code/modules/reagents/newchem/Blob-Reagents.dm
index e451b561469..d3ebcc447b5 100644
--- a/code/modules/reagents/newchem/Blob-Reagents.dm
+++ b/code/modules/reagents/newchem/Blob-Reagents.dm
@@ -35,8 +35,7 @@
volume = ..()
M.apply_damage(0.6*volume, BURN)
M.IgniteMob()
- if(isliving(M))
- M.emote("scream")
+ M.emote("scream")
/datum/reagent/blob/envenomed_filaments //toxin, hallucination, and some bonus spore toxin
name = "Envenomed Filaments"
diff --git a/code/modules/reagents/newchem/chem_heater.dm b/code/modules/reagents/newchem/chem_heater.dm
index daea5802d64..28d1f4c2afa 100644
--- a/code/modules/reagents/newchem/chem_heater.dm
+++ b/code/modules/reagents/newchem/chem_heater.dm
@@ -100,8 +100,8 @@
ui_interact(user)
/obj/machinery/chem_heater/attack_ai(mob/user)
- src.add_hiddenprint(user)
- return src.attack_hand(user)
+ add_hiddenprint(user)
+ return attack_hand(user)
/obj/machinery/chem_heater/Topic(href, href_list)
if(..())
diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm
index 6f8e7fd6308..def94ba9a2c 100644
--- a/code/modules/reagents/newchem/disease.dm
+++ b/code/modules/reagents/newchem/disease.dm
@@ -122,6 +122,25 @@
qdel(ate_heart)
..()
+//virus-specific symptom reagents
+
+/datum/reagent/synaphydramine
+ name = "Diphen-Synaptizine"
+ id = "synaphydramine"
+ description = "Reduces drowsiness and hallucinations while also purging histamine from the body."
+ color = "#EC536D" // rgb: 236, 83, 109
+
+/datum/reagent/synaphydramine/on_mob_life(mob/living/M)
+ M.drowsyness = max(M.drowsyness-5, 0)
+ if(holder.has_reagent("lsd"))
+ holder.remove_reagent("lsd", 5)
+ if(holder.has_reagent("histamine"))
+ holder.remove_reagent("histamine", 5)
+ M.hallucination = max(0, M.hallucination - 10)
+ if(prob(30))
+ M.adjustToxLoss(1)
+ ..()
+
//virus food
/datum/reagent/virus_food
name = "Virus Food"
diff --git a/code/modules/reagents/newchem/drinks.dm b/code/modules/reagents/newchem/drinks.dm
index 4790b4d01ec..5f4dc5b0018 100644
--- a/code/modules/reagents/newchem/drinks.dm
+++ b/code/modules/reagents/newchem/drinks.dm
@@ -133,9 +133,7 @@
M.fakevomit()
..()
-/datum/reagent/ethanol/synthanol/reaction_mob(mob/M, method=TOUCH, volume)
- if(!istype(M, /mob/living))
- return
+/datum/reagent/ethanol/synthanol/reaction_mob(mob/living/M, method=TOUCH, volume)
if(M.isSynthetic())
return
if(method == INGEST)
diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm
index ac9f2bdcc39..99a637e4fca 100644
--- a/code/modules/reagents/newchem/drugs.dm
+++ b/code/modules/reagents/newchem/drugs.dm
@@ -522,9 +522,7 @@
result_amount = 4
mix_message = "The mixture swirls around excitedly!"
-/datum/reagent/fliptonium/reaction_mob(mob/M, method=TOUCH, volume)
- if(!istype(M, /mob/living))
- return
+/datum/reagent/fliptonium/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == INGEST || method == TOUCH)
M.SpinAnimation(speed = 12, loops = -1)
..()
diff --git a/code/modules/reagents/newchem/food.dm b/code/modules/reagents/newchem/food.dm
index c1b78581534..6909a60e2e5 100644
--- a/code/modules/reagents/newchem/food.dm
+++ b/code/modules/reagents/newchem/food.dm
@@ -6,9 +6,7 @@
color = "#63DE63"
metabolization_rate = 0.4
-/datum/reagent/questionmark/reaction_mob(mob/M, method=TOUCH, volume)
- if(!istype(M, /mob/living))
- return
+/datum/reagent/questionmark/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == INGEST)
M.Stun(2)
M.Weaken(2)
@@ -45,9 +43,7 @@
mix_message = "The citrus juices begin to blend together."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-/datum/reagent/triple_citrus/reaction_mob(mob/living/carbon/M, method=TOUCH, volume)
- if(!istype(M, /mob/living/carbon))
- return
+/datum/reagent/triple_citrus/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == INGEST)
M.adjustToxLoss(-rand(1,2))
@@ -134,8 +130,7 @@
..()
/datum/reagent/chocolate/reaction_turf(turf/T, volume)
- src = null
- if(volume >= 5)
+ if(volume >= 5 && !istype(T, /turf/space))
new /obj/item/weapon/reagent_containers/food/snacks/choc_pile(T)
/datum/reagent/mugwort
@@ -146,7 +141,7 @@
color = "#21170E"
/datum/reagent/mugwort/on_mob_life(mob/living/M)
- if(istype(M, /mob/living/carbon/human) && M.mind)
+ if(ishuman(M) && M.mind)
if(M.mind.special_role == "Wizard")
M.adjustToxLoss(-1*REM)
M.adjustOxyLoss(-1*REM)
@@ -177,9 +172,7 @@
reagent_state = LIQUID
color = "#C87D28"
-/datum/reagent/fungus/reaction_mob(mob/M, method=TOUCH, volume)
- if(!istype(M, /mob/living))
- return
+/datum/reagent/fungus/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == INGEST)
var/ranchance = rand(1,10)
if(ranchance == 1)
@@ -211,9 +204,7 @@
color = "#F5F5F5"
metabolization_rate = 0.2
-/datum/reagent/msg/reaction_mob(mob/M, method=TOUCH, volume)
- if(!istype(M, /mob/living))
- return
+/datum/reagent/msg/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == INGEST)
to_chat(M, "That tasted amazing!")
@@ -242,8 +233,7 @@
..()
/datum/reagent/cheese/reaction_turf(turf/T, volume)
- src = null
- if(volume >= 5)
+ if(volume >= 5 && !istype(T, /turf/space))
new /obj/item/weapon/reagent_containers/food/snacks/cheesewedge(T)
/datum/chemical_reaction/cheese
@@ -286,8 +276,7 @@
..()
/datum/reagent/weird_cheese/reaction_turf(turf/T, volume)
- src = null
- if(volume >= 5)
+ if(volume >= 5 && !istype(T, /turf/space))
new /obj/item/weapon/reagent_containers/food/snacks/weirdcheesewedge(T)
/datum/chemical_reaction/weird_cheese
@@ -323,8 +312,7 @@
color = "#9C5013"
/datum/reagent/bread/reaction_turf(turf/T, volume)
- src = null
- if(volume >= 5)
+ if(volume >= 5 && !istype(T, /turf/space))
new /obj/item/weapon/reagent_containers/food/snacks/breadslice(T)
/datum/reagent/vomit
@@ -335,8 +323,7 @@
color = "#FFFF00"
/datum/reagent/vomit/reaction_turf(turf/T, volume)
- src = null
- if(volume >= 5)
+ if(volume >= 5 && !istype(T, /turf/space))
new /obj/effect/decal/cleanable/vomit(T)
playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
@@ -348,8 +335,7 @@
color = "#78FF74"
/datum/reagent/greenvomit/reaction_turf(turf/T, volume)
- src = null
- if(volume >= 5)
+ if(volume >= 5 && !istype(T, /turf/space))
new /obj/effect/decal/cleanable/vomit/green(T)
playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
@@ -362,9 +348,7 @@
color = "#8EAE7B"
process_flags = ORGANIC | SYNTHETIC //Because apparently ghosts in the shell
-/datum/reagent/ectoplasm/reaction_mob(mob/M, method=TOUCH, volume)
- if(!istype(M, /mob/living))
- return
+/datum/reagent/ectoplasm/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == INGEST)
var/spooky_eat = pick("Ugh, why did you eat that? Your mouth feels haunted. Haunted with bad flavors.", "Ugh, why did you eat that? It has the texture of ham aspic. From the 1950s. Left out in the sun.", "Ugh, why did you eat that? It tastes like a ghost fart.", "Ugh, why did you eat that? It tastes like flavor died.")
to_chat(M, "[spooky_eat]")
@@ -376,8 +360,7 @@
..()
/datum/reagent/ectoplasm/reaction_turf(turf/T, volume)
- src = null
- if(volume >= 10)
+ if(volume >= 10 && !istype(T, /turf/space))
new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm(T)
/datum/reagent/soybeanoil
@@ -448,8 +431,7 @@
..()
/datum/reagent/meatslurry/reaction_turf(turf/T, volume)
- src = null
- if(volume >= 5 && prob(10))
+ if(volume >= 5 && prob(10) && !istype(T, /turf/space))
new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T)
playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm
index 5b5e5722c46..e5e7af93b66 100644
--- a/code/modules/reagents/newchem/medicine.dm
+++ b/code/modules/reagents/newchem/medicine.dm
@@ -89,8 +89,7 @@
..()
/datum/reagent/synthflesh/reaction_turf(turf/T, volume) //let's make a mess!
- src = null
- if(volume >= 5)
+ if(volume >= 5 && !istype(T, /turf/space))
new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T)
playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
@@ -620,7 +619,7 @@
SM.loot.Cut() //no abusing strange reagent for unlimited farming of resources
SM.visible_message("[M] seems to rise from the dead!")
- if(istype(M, /mob/living/carbon))
+ if(iscarbon(M))
if(method == INGEST)
if(M.stat == DEAD)
if(M.getBruteLoss()+M.getFireLoss() >= 150)
@@ -952,11 +951,8 @@
result_amount = 2
/datum/reagent/degreaser/reaction_turf(turf/simulated/T, volume)
- if(!istype(T))
- return
- src = null
- if(volume >= 1)
- if(istype(T) && T.wet)
+ if(volume >= 1 && istype(T))
+ if(T.wet)
T.MakeDry(TURF_WET_LUBE)
/datum/reagent/degreaser/on_mob_life(mob/living/M)
diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm
index 4508125387e..68e618a9ac7 100644
--- a/code/modules/reagents/newchem/newchem_procs.dm
+++ b/code/modules/reagents/newchem/newchem_procs.dm
@@ -8,17 +8,13 @@
var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick.
var/current_cycle = 1
-/datum/reagents
- var/chem_temp = 300
- var/list/datum/reagent/addiction_list = new/list()
-
/datum/reagents/proc/metabolize(mob/living/M)
if(M)
chem_temp = M.bodytemperature
handle_reactions()
for(var/A in reagent_list)
var/datum/reagent/R = A
- if(!istype(R))
+ if(!istype(R)) // How are non-reagents ending up in the reagents_list?
continue
if(!R.holder)
continue
diff --git a/code/modules/reagents/newchem/other.dm b/code/modules/reagents/newchem/other.dm
index 44d506a026a..2ff4a18c3d0 100644
--- a/code/modules/reagents/newchem/other.dm
+++ b/code/modules/reagents/newchem/other.dm
@@ -124,7 +124,7 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
mix_message = "The substance flashes multiple colors and emits the smell of a pocket protector."
/datum/reagent/colorful_reagent/reaction_mob(mob/living/simple_animal/M, method=TOUCH, volume)
- if(M && istype(M))
+ if(isanimal(M))
M.color = pick(random_color_list)
..()
@@ -187,7 +187,7 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
result_amount = 2
/datum/reagent/hair_dye/reaction_mob(mob/living/M, volume)
- if(M && ishuman(M))
+ if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
head_organ.r_facial = rand(0,255)
@@ -217,7 +217,7 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
mix_message = "The liquid becomes slightly hairy."
/datum/reagent/hairgrownium/reaction_mob(mob/living/M, volume)
- if(M && ishuman(M))
+ if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
head_organ.h_style = random_hair_style(H.gender, head_organ.species.name)
@@ -244,7 +244,7 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111
mix_message = "The liquid becomes amazingly furry and smells peculiar."
/datum/reagent/super_hairgrownium/reaction_mob(mob/living/M, volume)
- if(M && ishuman(M))
+ if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
var/datum/sprite_accessory/tmp_hair_style = hair_styles_list["Very Long Hair"]
diff --git a/code/modules/reagents/newchem/pyro.dm b/code/modules/reagents/newchem/pyro.dm
index 96cbecf3680..7afdc564647 100644
--- a/code/modules/reagents/newchem/pyro.dm
+++ b/code/modules/reagents/newchem/pyro.dm
@@ -65,7 +65,7 @@
new /obj/effect/hotspot(T)
/datum/reagent/clf3/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == TOUCH && isliving(M))
+ if(method == TOUCH)
M.adjust_fire_stacks(5)
M.IgniteMob()
M.bodytemperature += 30
@@ -177,9 +177,8 @@
mix_sound = null
/datum/reagent/blackpowder/reaction_turf(turf/T, volume) //oh shit
- src = null
- if(volume >= 5)
- if(!locate(/obj/effect/decal/cleanable/dirt/blackpowder) in get_turf(T)) //let's not have hundreds of decals of black powder on the same turf
+ if(volume >= 5 && !istype(T, /turf/space))
+ if(!locate(/obj/effect/decal/cleanable/dirt/blackpowder) in T) //let's not have hundreds of decals of black powder on the same turf
new /obj/effect/decal/cleanable/dirt/blackpowder(T)
/datum/chemical_reaction/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume)
@@ -436,7 +435,7 @@
..()
/datum/reagent/napalm/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == TOUCH && isliving(M))
+ if(method == TOUCH)
M.adjust_fire_stacks(7)
/datum/chemical_reaction/napalm
@@ -474,7 +473,7 @@
holder.handle_reactions()
..()
-/datum/reagent/cryostylane/reaction_turf(turf/simulated/T, volume)
+/datum/reagent/cryostylane/reaction_turf(turf/T, volume)
if(volume >= 5)
for(var/mob/living/carbon/slime/M in T)
M.adjustToxLoss(rand(15,30))
@@ -537,9 +536,6 @@
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
/datum/reagent/firefighting_foam/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(!istype(M, /mob/living))
- return
-
// Put out fire
if(method == TOUCH)
M.adjust_fire_stacks(-(volume / 5)) // more effective than water
@@ -550,24 +546,23 @@
if(!istype(T))
return
var/CT = cooling_temperature
- src = null
- if(!istype(T, /turf/space))
- new /obj/effect/decal/cleanable/flour/foam(T) //foam mess; clears up quickly.
+ new /obj/effect/decal/cleanable/flour/foam(T) //foam mess; clears up quickly.
var/hotspot = (locate(/obj/effect/hotspot) in T)
- if(hotspot && !istype(T, /turf/space))
- var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
- lowertemp.temperature = max( min(lowertemp.temperature-(CT*1000),lowertemp.temperature / CT) ,0)
+ if(hotspot)
+ var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles())
+ lowertemp.temperature = max(min(lowertemp.temperature-(CT*1000), lowertemp.temperature / CT), 0)
lowertemp.react()
T.assume_air(lowertemp)
qdel(hotspot)
/datum/reagent/firefighting_foam/reaction_obj(obj/O, volume)
- src = null
- var/turf/T = get_turf(O)
+ var/turf/simulated/T = get_turf(O)
+ if(!istype(T))
+ return
var/hotspot = (locate(/obj/effect/hotspot) in T)
- if(hotspot && !istype(T, /turf/space))
- var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
- lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
+ if(hotspot)
+ var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles())
+ lowertemp.temperature = max(min(lowertemp.temperature-2000,lowertemp.temperature / 2), 0)
lowertemp.react()
T.assume_air(lowertemp)
qdel(hotspot)
@@ -625,8 +620,6 @@
T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume)
/datum/reagent/plasma_dust/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma dust is stronger than fuel!
- if(!istype(M, /mob/living))
- return
if(method == TOUCH)
M.adjust_fire_stacks(volume / 5)
return
diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm
index e9729b47f10..56d64d9a62e 100644
--- a/code/modules/reagents/newchem/toxins.dm
+++ b/code/modules/reagents/newchem/toxins.dm
@@ -289,8 +289,6 @@
process_flags = ORGANIC | SYNTHETIC
/datum/reagent/facid/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(!istype(M, /mob/living))
- return //wooo more runtime fixin
if(method == TOUCH || method == INGEST)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -311,18 +309,18 @@
if(!H.wear_mask.unacidable)
qdel(H.wear_mask)
H.update_inv_wear_mask()
- to_chat(H, "\red Your mask melts away but protects you from the acid!")
+ to_chat(H, "Your mask melts away but protects you from the acid!")
else
- to_chat(H, "\red Your mask protects you from the acid!")
+ to_chat(H, "Your mask protects you from the acid!")
return
if(H.head)
if(!H.head.unacidable)
qdel(H.head)
H.update_inv_head()
- to_chat(H, "\red Your helmet melts away but protects you from the acid")
+ to_chat(H, "Your helmet melts away but protects you from the acid")
else
- to_chat(H, "\red Your helmet protects you from the acid!")
+ to_chat(H, "Your helmet protects you from the acid!")
return
if(!H.unacidable)
@@ -333,12 +331,11 @@
H.status_flags |= DISFIGURED
/datum/reagent/facid/reaction_obj(obj/O, volume)
- if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)))
+ if((istype(O, /obj/item) || istype(O, /obj/effect/glowshroom)))
if(!O.unacidable)
var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc)
I.desc = "Looks like this was \an [O] some time ago."
- for(var/mob/M in viewers(5, O))
- to_chat(M, "\red \the [O] melts.")
+ O.visible_message("[O] melts.")
qdel(O)
/datum/chemical_reaction/facid
@@ -694,45 +691,41 @@
..()
// Clear off wallrot fungi
-/datum/reagent/atrazine/reaction_turf(turf/T, volume)
- if(istype(T, /turf/simulated/wall))
- var/turf/simulated/wall/W = T
- if(W.rotting)
- W.rotting = 0
- for(var/obj/effect/E in W)
- if(E.name == "Wallrot")
- qdel(E)
+/datum/reagent/atrazine/reaction_turf(turf/simulated/wall/W, volume)
+ if(istype(W) && W.rotting)
+ W.rotting = 0
+ for(var/obj/effect/overlay/O in W)
+ if(O.name == "Wallrot") // This is so awful
+ qdel(O)
- for(var/mob/O in viewers(W, null))
- O.show_message(text("\blue The fungi are completely dissolved by the solution!"), 1)
+ W.visible_message("The fungi are completely dissolved by the solution!")
/datum/reagent/atrazine/reaction_obj(obj/O, volume)
if(istype(O,/obj/structure/alien/weeds/))
var/obj/structure/alien/weeds/alien_weeds = O
alien_weeds.health -= rand(15,35) // Kills alien weeds pretty fast
alien_weeds.healthcheck()
- else if(istype(O,/obj/effect/glowshroom)) //even a small amount is enough to kill it
+ else if(istype(O, /obj/effect/glowshroom)) //even a small amount is enough to kill it
qdel(O)
else if(istype(O,/obj/effect/plant))
- if(prob(50)) qdel(O) //Kills kudzu too.
+ if(prob(50))
+ qdel(O) //Kills kudzu too.
// Damage that is done to growing plants is separately at code/game/machinery/hydroponics at obj/item/hydroponics
/datum/reagent/atrazine/reaction_mob(mob/living/M, method=TOUCH, volume)
- src = null
if(iscarbon(M))
var/mob/living/carbon/C = M
if(!C.wear_mask) // If not wearing a mask
- C.adjustToxLoss(2) // 4 toxic damage per application, doubled for some reason
+ C.adjustToxLoss(2) // 2 toxic damage per application
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.dna)
- if(H.species.flags & IS_PLANT) //plantmen take a LOT of damage
- H.adjustToxLoss(50)
- ..()
- else if(istype(M,/mob/living/simple_animal/diona)) //plantmen monkeys (diona) take EVEN MORE damage
- var/mob/living/simple_animal/diona/D = M
- D.adjustHealth(100)
- ..()
+ if(H.species.flags & IS_PLANT) //plantmen take a LOT of damage
+ H.adjustToxLoss(50)
+ ..()
+ else if(istype(M, /mob/living/simple_animal/diona)) //plantmen monkeys (diona) take EVEN MORE damage
+ var/mob/living/simple_animal/diona/D = M
+ D.adjustHealth(100)
+ ..()
/datum/chemical_reaction/atrazine
name = "atrazine"
@@ -817,10 +810,11 @@
reagent_state = LIQUID
color = "#00FD00"
-/datum/reagent/glowing_slurry/reaction_mob(mob/M, method=TOUCH, volume) //same as mutagen
- if(!..()) return
- if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
- src = null
+/datum/reagent/glowing_slurry/reaction_mob(mob/living/M, method=TOUCH, volume) //same as mutagen
+ if(!..())
+ return
+ if(!M.dna)
+ return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
if((method==TOUCH && prob(50)) || method==INGEST)
randmutb(M)
domutcheck(M, null)
@@ -828,6 +822,8 @@
/datum/reagent/glowing_slurry/on_mob_life(mob/living/M)
M.apply_effect(2, IRRADIATE, 0, negate_armor = 1)
+ if(!M.dna)
+ return
if(prob(15))
randmutb(M)
if(prob(3))
diff --git a/code/modules/reagents/oldchem/reagents/_reagent_base.dm b/code/modules/reagents/oldchem/reagents/_reagent_base.dm
index 3adfab86292..fbf1398decb 100644
--- a/code/modules/reagents/oldchem/reagents/_reagent_base.dm
+++ b/code/modules/reagents/oldchem/reagents/_reagent_base.dm
@@ -21,57 +21,42 @@
var/process_flags = ORGANIC
var/admin_only = 0
-/datum/reagent/proc/reaction_mob(mob/M, method=TOUCH, volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
- if(!istype(M, /mob/living))
- return 0
- var/datum/reagent/self = src
- src = null
-
- if(self.holder) //for catching rare runtimes
- if(method == TOUCH && self.penetrates_skin)
- if(isliving(M))
- var/mob/living/L = M
- var/block = L.get_permeability_protection()
- var/amount = round(self.volume * (1.0 - block), 0.1)
- if(L.reagents)
- if(amount >= 1)
- L.reagents.add_reagent(self.id,amount)
-
+/datum/reagent/proc/reaction_mob(mob/living/M, method=TOUCH, volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
+ if(holder) //for catching rare runtimes
+ if(method == TOUCH && penetrates_skin)
+ var/block = M.get_permeability_protection()
+ var/amount = round(volume * (1.0 - block), 0.1)
+ if(M.reagents)
+ if(amount >= 1)
+ M.reagents.add_reagent(id, amount)
if(method == INGEST) //Yes, even Xenos can get addicted to drugs.
- var/can_become_addicted = M.reagents.reaction_check(M, self)
+ var/can_become_addicted = M.reagents.reaction_check(M, src)
if(can_become_addicted)
- if(prob(self.addiction_chance) && !is_type_in_list(self, M.reagents.addiction_list))
+ if(prob(addiction_chance) && !is_type_in_list(src, M.reagents.addiction_list))
to_chat(M, "You suddenly feel invigorated and guilty...")
- var/datum/reagent/new_reagent = new self.type()
+ var/datum/reagent/new_reagent = new type()
new_reagent.last_addiction_dose = world.timeofday
M.reagents.addiction_list.Add(new_reagent)
- else if(is_type_in_list(self, M.reagents.addiction_list))
+ else if(is_type_in_list(src, M.reagents.addiction_list))
to_chat(M, "You feel slightly better, but for how long?")
for(var/A in M.reagents.addiction_list)
var/datum/reagent/AD = A
- if(AD && istype(AD, self))
+ if(AD && istype(AD, src))
AD.last_addiction_dose = world.timeofday
AD.addiction_stage = 1
return 1
-/datum/reagent/proc/reaction_obj(obj/O, volume) //By default we transfer a small part of the reagent to the object
- src = null //if it can hold reagents. nope!
- //if(O.reagents)
- // O.reagents.add_reagent(id,volume/3)
+/datum/reagent/proc/reaction_obj(obj/O, volume)
return
/datum/reagent/proc/reaction_turf(turf/T, volume)
- src = null
return
/datum/reagent/proc/on_mob_life(mob/living/M)
- if(!istype(M))
- return
- if(holder)
- holder.remove_reagent(id, metabolization_rate) //By default it slowly disappears.
- current_cycle++
+ current_cycle++
+ holder.remove_reagent(id, metabolization_rate) //By default it slowly disappears.
/datum/reagent/proc/on_mob_death(mob/living/M) //use this to have chems have a "death-triggered" effect
return
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
index bc3fc46c1af..da92ffee0f2 100644
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
@@ -29,14 +29,10 @@
to_chat(usr, "The solution melts away the ink on the book.")
else
to_chat(usr, "It wasn't enough...")
- return
/datum/reagent/ethanol/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with ethanol isn't quite as good as fuel.
- if(!istype(M, /mob/living))
- return
if(method == TOUCH)
M.adjust_fire_stacks(volume / 15)
- return
/datum/reagent/ethanol/beer
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
index 418fc80daf4..26bad6c1665 100644
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
@@ -102,7 +102,7 @@
/datum/reagent/drink/banana/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
- if((istype(M, /mob/living/carbon/human) && M.job in list("Clown") ) || issmall(M))
+ if((ishuman(M) && M.job in list("Clown") ) || issmall(M))
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
..()
@@ -114,7 +114,7 @@
/datum/reagent/drink/nothing/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
- if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
+ if(ishuman(M) && M.job in list("Mime"))
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
..()
@@ -265,7 +265,7 @@
/datum/reagent/drink/bananahonk/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
- if((istype(M, /mob/living/carbon/human) && M.job in list("Clown") ) || issmall(M))
+ if((ishuman(M) && M.job in list("Clown") ) || issmall(M))
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
..()
@@ -279,7 +279,7 @@
/datum/reagent/drink/silencer/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
- if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
+ if(ishuman(M) && M.job in list("Mime"))
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
..()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm
index 45059ed84dd..52d33e21e07 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm
@@ -6,8 +6,6 @@
color = "#060606"
/datum/reagent/fuel/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with welding fuel to make them easy to ignite!
- if(!istype(M, /mob/living))
- return
if(method == TOUCH)
M.adjust_fire_stacks(volume / 10)
return
@@ -56,8 +54,6 @@
..()
/datum/reagent/plasma/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma is stronger than fuel!
- if(!istype(M, /mob/living))
- return
if(method == TOUCH)
M.adjust_fire_stacks(volume / 5)
..()
@@ -71,13 +67,11 @@
color = "#673910" // rgb: 103, 57, 16
process_flags = ORGANIC | SYNTHETIC
-/datum/reagent/thermite/reaction_turf(turf/T, volume)
- src = null
- if(volume >= 5)
- if(istype(T, /turf/simulated/wall))
- T:thermite = 1
- T.overlays.Cut()
- T.overlays = image('icons/effects/effects.dmi',icon_state = "thermite")
+/datum/reagent/thermite/reaction_turf(turf/simulated/wall/W, volume)
+ if(volume >= 5 && istype(W))
+ W.thermite = 1
+ W.overlays.Cut()
+ W.overlays = image('icons/effects/effects.dmi',icon_state = "thermite")
/datum/reagent/glycerol
name = "Glycerol"
diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm
index 57dfd93c19d..1dbe1f05a20 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_food.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_food.dm
@@ -92,19 +92,19 @@
M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT
if(holder.has_reagent("frostoil"))
holder.remove_reagent("frostoil", 5)
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature += rand(5,20)
if(15 to 25)
M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature += rand(10,20)
if(25 to 35)
M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature += rand(15,20)
if(35 to INFINITY)
M.bodytemperature += 20 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature += rand(20,25)
..()
@@ -122,27 +122,27 @@
M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
if(holder.has_reagent("capsaicin"))
holder.remove_reagent("capsaicin", 5)
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature -= rand(5,20)
if(15 to 25)
M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature -= rand(10,20)
if(25 to 35)
M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT
if(prob(1))
M.emote("shiver")
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature -= rand(15,20)
if(35 to INFINITY)
M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT
if(prob(1))
M.emote("shiver")
- if(istype(M, /mob/living/carbon/slime))
+ if(isslime(M))
M.bodytemperature -= rand(20,25)
..()
-/datum/reagent/frostoil/reaction_turf(turf/simulated/T, volume)
+/datum/reagent/frostoil/reaction_turf(turf/T, volume)
if(volume >= 5)
for(var/mob/living/carbon/slime/M in T)
M.adjustToxLoss(rand(15,30))
@@ -202,7 +202,7 @@
/datum/reagent/sprinkles/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
- if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Security Pod Pilot", "Detective", "Warden", "Head of Security", "Brig Physician", "Internal Affairs Agent", "Magistrate"))
+ if(ishuman(M) && M.job in list("Security Officer", "Security Pod Pilot", "Detective", "Warden", "Head of Security", "Brig Physician", "Internal Affairs Agent", "Magistrate"))
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
..()
@@ -221,14 +221,14 @@
..()
/datum/reagent/cornoil/reaction_turf(turf/simulated/T, volume)
- if(!istype(T)) return
- src = null
+ if(!istype(T))
+ return
if(volume >= 3)
T.MakeSlippery()
var/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot)
- var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
- lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
+ var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles())
+ lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0)
lowertemp.react()
T.assume_air(lowertemp)
qdel(hotspot)
@@ -297,7 +297,6 @@
..()
/datum/reagent/flour/reaction_turf(turf/T, volume)
- src = null
if(!istype(T, /turf/space))
new /obj/effect/decal/cleanable/flour(T)
diff --git a/code/modules/reagents/oldchem/reagents/reagents_misc.dm b/code/modules/reagents/oldchem/reagents/reagents_misc.dm
index c4fec24d054..ff729dcdf3f 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_misc.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_misc.dm
@@ -5,9 +5,8 @@
reagent_state = LIQUID
color = "#C7FFFF" // rgb: 199, 255, 255
-/datum/reagent/silicate/reaction_obj(var/obj/O, var/volume)
- src = null
- if(istype(O,/obj/structure/window))
+/datum/reagent/silicate/reaction_obj(obj/O, volume)
+ if(istype(O, /obj/structure/window))
if(O:silicate <= 200)
O:silicate += volume
@@ -30,9 +29,7 @@
var/b = (volume / 50) + 1
I.SetIntensity(r,g,b)
O.icon = I
- O:silicateIcon = I
-
- return*/
+ O:silicateIcon = I */
/datum/reagent/oxygen
@@ -99,12 +96,9 @@
color = "#1C1300" // rgb: 30, 20, 0
/datum/reagent/carbon/reaction_turf(turf/T, volume)
- src = null
- // Only add one dirt per turf. Was causing people to crash.
- if(!istype(T, /turf/space) && !(locate(/obj/effect/decal/cleanable/dirt) in T))
+ if(!istype(T, /turf/space) && !(locate(/obj/effect/decal/cleanable/dirt) in T)) // Only add one dirt per turf. Was causing people to crash.
new /obj/effect/decal/cleanable/dirt(T)
-
/datum/reagent/gold
name = "Gold"
id = "gold"
diff --git a/code/modules/reagents/oldchem/reagents/reagents_paint.dm b/code/modules/reagents/oldchem/reagents/reagents_paint.dm
new file mode 100644
index 00000000000..0ca67259126
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/reagents_paint.dm
@@ -0,0 +1,60 @@
+/datum/reagent/paint
+ name = "Paint"
+ id = "paint_"
+ description = "Floor paint is used to color floor tiles."
+ reagent_state = LIQUID
+ color = "#808080"
+
+/datum/reagent/paint/reaction_turf(turf/T, volume)
+ if(!istype(T, /turf/space))
+ T.color = color
+
+/datum/reagent/paint/reaction_obj(obj/O, volume)
+ if(istype(O, /obj/item/weapon/light))
+ O.color = color
+
+/datum/reagent/paint/red
+ name = "Red Paint"
+ id = "paint_red"
+ color = "#FF0000"
+
+/datum/reagent/paint/green
+ name = "Green Paint"
+ id = "paint_green"
+ color = "#00FF00"
+
+/datum/reagent/paint/blue
+ name = "Blue Paint"
+ id = "paint_blue"
+ color = "#0000FF"
+
+/datum/reagent/paint/yellow
+ name = "Yellow Paint"
+ id = "paint_yellow"
+ color = "#FFFF00"
+
+/datum/reagent/paint/violet
+ name = "Violet Paint"
+ id = "paint_violet"
+ color = "#FF00FF"
+
+/datum/reagent/paint/black
+ name = "Black Paint"
+ id = "paint_black"
+ color = "#333333"
+
+/datum/reagent/paint/white
+ name = "White Paint"
+ id = "paint_white"
+ color = "#FFFFFF"
+
+/datum/reagent/paint_remover
+ name = "Paint Remover"
+ id = "paint_remover"
+ description = "Paint remover is used to remove floor paint from floor tiles."
+ reagent_state = LIQUID
+ color = "#808080"
+
+/datum/reagent/paint_remover/reaction_turf(turf/T, volume)
+ if(!istype(T, /turf/space))
+ T.color = initial(T.color)
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm
index 20ccb420e85..bbdf92b8693 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm
@@ -53,7 +53,7 @@
/datum/reagent/slimejelly/on_mob_life(mob/living/M)
if(prob(10))
- to_chat(M, "\red Your insides are burning!")
+ to_chat(M, "Your insides are burning!")
M.adjustToxLoss(rand(20,60)*REM)
else if(prob(40))
M.adjustBruteLoss(-5*REM)
@@ -70,10 +70,10 @@
if(ishuman(M))
var/mob/living/carbon/human/human = M
if(human.species.name != "Shadow")
- to_chat(M, "\red Your flesh rapidly mutates!")
- to_chat(M, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
- to_chat(M, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.")
- to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
+ to_chat(M, "Your flesh rapidly mutates!")
+ to_chat(M, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
+ to_chat(M, "Your body reacts violently to light. \green However, it naturally heals in darkness.")
+ to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
human.set_species("Shadow")
..()
@@ -84,7 +84,7 @@
reagent_state = LIQUID
color = "#13BC5E" // rgb: 19, 188, 94
-/datum/reagent/aslimetoxin/reaction_mob(mob/M, method=TOUCH, volume)
+/datum/reagent/aslimetoxin/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method != TOUCH)
M.ForceContractDisease(new /datum/disease/transformation/slime(0))
@@ -145,12 +145,8 @@
..()
/datum/reagent/radium/reaction_turf(turf/T, volume)
- src = null
- if(volume >= 3)
- if(!istype(T, /turf/space))
- new /obj/effect/decal/cleanable/greenglow(T)
- return
-
+ if(volume >= 3 && !istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/greenglow(T)
/datum/reagent/mutagen
name = "Unstable mutagen"
@@ -160,17 +156,19 @@
color = "#04DF27"
metabolization_rate = 0.3
-/datum/reagent/mutagen/reaction_mob(mob/M, method=TOUCH, volume)
- if(!..()) return
- if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
- src = null
+/datum/reagent/mutagen/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(!..())
+ return
+ if(!M.dna)
+ return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
if((method==TOUCH && prob(33)) || method==INGEST)
randmutb(M)
domutcheck(M, null)
M.UpdateAppearance()
/datum/reagent/mutagen/on_mob_life(mob/living/M)
- if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
+ if(!M.dna)
+ return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
M.apply_effect(2*REM, IRRADIATE, negate_armor = 1)
if(prob(4))
randmutb(M)
@@ -189,10 +187,8 @@
..()
/datum/reagent/uranium/reaction_turf(turf/T, volume)
- src = null
- if(volume >= 3)
- if(!istype(T, /turf/space))
- new /obj/effect/decal/cleanable/greenglow(T)
+ if(volume >= 3 && !istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/greenglow(T)
/datum/reagent/lexorin
@@ -221,8 +217,6 @@
..()
/datum/reagent/sacid/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(!istype(M, /mob/living))
- return
if(method == TOUCH)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -230,11 +224,11 @@
if(volume > 25)
if(H.wear_mask)
- to_chat(H, "\red Your mask protects you from the acid!")
+ to_chat(H, "Your mask protects you from the acid!")
return
if(H.head)
- to_chat(H, "\red Your helmet protects you from the acid!")
+ to_chat(H, "Your helmet protects you from the acid!")
return
if(!M.unacidable)
@@ -278,8 +272,7 @@
if(!O.unacidable)
var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc)
I.desc = "Looks like this was \an [O] some time ago."
- for(var/mob/M in viewers(5, O))
- to_chat(M, "\red \the [O] melts.")
+ O.visible_message("[O] melts.")
qdel(O)
@@ -361,10 +354,8 @@
color = "#B31008" // rgb: 179, 16, 8
/datum/reagent/condensedcapsaicin/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(!istype(M, /mob/living))
- return
if(method == TOUCH)
- if(istype(M, /mob/living/carbon/human))
+ if(ishuman(M))
var/mob/living/carbon/human/victim = M
var/mouth_covered = 0
var/eyes_covered = 0
@@ -388,10 +379,10 @@
if( !safe_thing )
safe_thing = victim.glasses
if( eyes_covered && mouth_covered )
- to_chat(victim, "\red Your [safe_thing] protects you from the pepperspray!")
+ to_chat(victim, "Your [safe_thing] protects you from the pepperspray!")
return
else if( mouth_covered ) // Reduced effects if partially protected
- to_chat(victim, "\red Your [safe_thing] protect you from most of the pepperspray!")
+ to_chat(victim, "Your [safe_thing] protect you from most of the pepperspray!")
if(prob(5))
victim.emote("scream")
victim.eye_blurry = max(M.eye_blurry, 3)
@@ -402,14 +393,14 @@
victim.drop_item()
return
else if( eyes_covered ) // Eye cover is better than mouth cover
- to_chat(victim, "\red Your [safe_thing] protects your eyes from the pepperspray!")
+ to_chat(victim, "Your [safe_thing] protects your eyes from the pepperspray!")
victim.eye_blurry = max(M.eye_blurry, 3)
victim.damageoverlaytemp = 30
return
else // Oh dear :D
if(prob(5))
victim.emote("scream")
- to_chat(victim, "\red You're sprayed directly in the eyes with pepperspray!")
+ to_chat(victim, "You're sprayed directly in the eyes with pepperspray!")
victim.eye_blurry = max(M.eye_blurry, 5)
victim.eye_blind = max(M.eye_blind, 2)
victim.confused = max(M.confused, 6)
diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm
index 7df0fd3fdba..a2ec51f1811 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_water.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm
@@ -17,9 +17,6 @@
process_flags = ORGANIC | SYNTHETIC
/datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(!istype(M, /mob/living))
- return
-
// Put out fire
if(method == TOUCH)
M.adjust_fire_stacks(-(volume / 10))
@@ -30,7 +27,6 @@
/datum/reagent/water/reaction_turf(turf/simulated/T, volume)
if(!istype(T))
return
- src = null
if(volume >= 3)
T.MakeSlippery()
@@ -38,32 +34,31 @@
M.apply_water()
var/hotspot = (locate(/obj/effect/hotspot) in T)
- if(hotspot && !istype(T, /turf/space))
- var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
- lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
+ if(hotspot)
+ var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles())
+ lowertemp.temperature = max(min(lowertemp.temperature-2000,lowertemp.temperature / 2), 0)
lowertemp.react()
T.assume_air(lowertemp)
qdel(hotspot)
/datum/reagent/water/reaction_obj(obj/O, volume)
- src = null
- var/turf/T = get_turf(O)
- var/hotspot = (locate(/obj/effect/hotspot) in T)
- if(hotspot && !istype(T, /turf/space))
- var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
- lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
- lowertemp.react()
- T.assume_air(lowertemp)
- qdel(hotspot)
- if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube))
+ var/turf/simulated/T = get_turf(O)
+ if(istype(T))
+ var/hotspot = (locate(/obj/effect/hotspot) in T)
+ if(hotspot)
+ var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles() )
+ lowertemp.temperature = max(min(lowertemp.temperature-2000,lowertemp.temperature / 2), 0)
+ lowertemp.react()
+ T.assume_air(lowertemp)
+ qdel(hotspot)
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
if(!cube.wrapped)
cube.Expand()
// Dehydrated carp
- if(istype(O,/obj/item/toy/carpplushie/dehy_carp))
+ if(istype(O, /obj/item/toy/carpplushie/dehy_carp))
var/obj/item/toy/carpplushie/dehy_carp/dehy = O
dehy.Swell() // Makes a carp
- return
/datum/reagent/lube
@@ -74,9 +69,7 @@
color = "#1BB1AB"
/datum/reagent/lube/reaction_turf(turf/simulated/T, volume)
- if(!istype(T)) return
- src = null
- if(volume >= 1)
+ if(volume >= 1 && istype(T))
T.MakeSlippery(TURF_WET_LUBE)
@@ -90,11 +83,10 @@
/datum/reagent/space_cleaner/reaction_obj(obj/O, volume)
if(O && !istype(O, /atom/movable/lighting_overlay))
O.color = initial(O.color)
- if(istype(O,/obj/effect/decal/cleanable))
+ if(istype(O, /obj/effect/decal/cleanable))
qdel(O)
- else
- if(O)
- O.clean_blood()
+ else if(O)
+ O.clean_blood()
/datum/reagent/space_cleaner/reaction_turf(turf/T, volume)
if(volume >= 1)
@@ -106,14 +98,14 @@
for(var/mob/living/carbon/slime/M in T)
M.adjustToxLoss(rand(5,10))
- if(istype(T,/turf/simulated))
+ if(istype(T, /turf/simulated))
var/turf/simulated/S = T
S.dirt = 0
-/datum/reagent/space_cleaner/reaction_mob(mob/M, method=TOUCH, volume)
+/datum/reagent/space_cleaner/reaction_mob(mob/living/M, method=TOUCH, volume)
if(iscarbon(M))
var/mob/living/carbon/C = M
- if(istype(M,/mob/living/carbon/human))
+ if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.lip_style)
H.lip_style = null
@@ -141,7 +133,6 @@
H.update_inv_shoes(0,0)
M.clean_blood()
..()
- return
/datum/reagent/blood
@@ -151,7 +142,7 @@
reagent_state = LIQUID
color = "#C80000" // rgb: 200, 0, 0
-/datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, volume)
+/datum/reagent/blood/reaction_mob(mob/living/M, method=TOUCH, volume)
if(data && data["viruses"])
for(var/datum/disease/D in data["viruses"])
@@ -232,7 +223,7 @@
id = "vaccine"
color = "#C81040" // rgb: 200, 16, 64
-/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, volume)
+/datum/reagent/vaccine/reaction_mob(mob/living/M, method=TOUCH, volume)
if(islist(data) && (method == INGEST))
for(var/datum/disease/D in M.viruses)
if(D.GetDiseaseID() in data)
@@ -241,7 +232,7 @@
/datum/reagent/vaccine/on_merge(list/data)
if(istype(data))
- src.data |= data.Copy()
+ data |= data.Copy()
/datum/reagent/fishwater
name = "Fish Water"
@@ -250,9 +241,7 @@
reagent_state = LIQUID
color = "#757547"
-/datum/reagent/fishwater/reaction_mob(mob/M, method=TOUCH, volume)
- if(!istype(M, /mob/living))
- return
+/datum/reagent/fishwater/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == INGEST)
to_chat(M, "Oh god, why did you drink that?")
@@ -271,7 +260,7 @@
reagent_state = LIQUID
color = "#757547"
-/datum/reagent/fishwater/toiletwater/reaction_mob(mob/M, method=TOUCH, volume) //For shennanigans
+/datum/reagent/fishwater/toiletwater/reaction_mob(mob/living/M, method=TOUCH, volume) //For shennanigans
return
/datum/reagent/holywater
@@ -293,14 +282,14 @@
M.confused += 3
if(isvampirethrall(M))
ticker.mode.remove_vampire_mind(M.mind)
- holder.remove_reagent(src.id, src.volume)
+ holder.remove_reagent(id, volume)
M.jitteriness = 0
M.stuttering = 0
M.confused = 0
return
if(iscultist(M))
ticker.mode.remove_cultist(M.mind)
- holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
+ holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
M.jitteriness = 0
M.stuttering = 0
M.confused = 0
@@ -331,10 +320,10 @@
var/mob/living/carbon/human/H=M
if(method == TOUCH)
if(H.wear_mask)
- to_chat(H, "\red Your mask protects you from the holy water!")
+ to_chat(H, "Your mask protects you from the holy water!")
return
else if(H.head)
- to_chat(H, "\red Your helmet protects you from the holy water!")
+ to_chat(H, "Your helmet protects you from the holy water!")
return
else
to_chat(M, "Something holy interferes with your powers!")
@@ -342,8 +331,8 @@
/datum/reagent/holywater/reaction_turf(turf/simulated/T, volume)
- ..()
- if(!istype(T)) return
+ if(!istype(T))
+ return
if(volume>=10)
for(var/obj/effect/rune/R in T)
qdel(R)
@@ -358,13 +347,9 @@
reagent_state = LIQUID
/datum/reagent/liquidgibs/reaction_turf(turf/T, volume) //yes i took it from synthflesh...
- src = null
- if(volume >= 5)
+ if(volume >= 5 && !istype(T, /turf/space))
new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T)
playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
- return
-
-
/datum/reagent/lye
name = "Lye"
diff --git a/code/modules/reagents/pandemic.dm b/code/modules/reagents/pandemic.dm
index d39b274db8c..059da261c5a 100644
--- a/code/modules/reagents/pandemic.dm
+++ b/code/modules/reagents/pandemic.dm
@@ -51,9 +51,9 @@
wait = 1
update_icon()
spawn(waittime)
- src.wait = null
+ wait = null
update_icon()
- playsound(src.loc, 'sound/machines/ping.ogg', 30, 1)
+ playsound(loc, 'sound/machines/ping.ogg', 30, 1)
/obj/machinery/computer/pandemic/update_icon()
if(stat & BROKEN)
@@ -75,8 +75,8 @@
if(!beaker) return
if(href_list["create_vaccine"])
- if(!src.wait)
- var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
+ if(!wait)
+ var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(loc)
if(B)
B.pixel_x = rand(-3, 3)
B.pixel_y = rand(-3, 3)
@@ -101,8 +101,8 @@
B.reagents.add_reagent("vaccine", 15, list(vaccine_type))
replicator_cooldown(200)
else
- src.temp_html = "The replicator is not ready yet."
- src.updateUsrDialog()
+ temp_html = "The replicator is not ready yet."
+ updateUsrDialog()
return
else if(href_list["create_virus_culture"])
if(!wait)
@@ -121,7 +121,7 @@
var/name = stripped_input(usr,"Name:","Name the culture",D.name,MAX_NAME_LEN)
if(name == null || wait)
return
- var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
+ var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(loc)
B.icon_state = "bottle3"
B.pixel_x = rand(-3, 3)
B.pixel_y = rand(-3, 3)
@@ -130,24 +130,24 @@
B.name = "[name] culture bottle"
B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium."
B.reagents.add_reagent("blood",20,data)
- src.updateUsrDialog()
+ updateUsrDialog()
else
- src.temp_html = "The replicator is not ready yet."
- src.updateUsrDialog()
+ temp_html = "The replicator is not ready yet."
+ updateUsrDialog()
return
else if(href_list["empty_beaker"])
beaker.reagents.clear_reagents()
- src.updateUsrDialog()
+ updateUsrDialog()
return
else if(href_list["eject"])
- beaker:loc = src.loc
+ beaker:loc = loc
beaker = null
icon_state = "mixer0"
- src.updateUsrDialog()
+ updateUsrDialog()
return
else if(href_list["clear"])
- src.temp_html = ""
- src.updateUsrDialog()
+ temp_html = ""
+ updateUsrDialog()
return
else if(href_list["name_disease"])
var/new_name = stripped_input(usr, "Name the Disease", "New Name", "", MAX_NAME_LEN)
@@ -161,15 +161,15 @@
A.AssignName(new_name)
for(var/datum/disease/advance/AD in disease_master.processing)
AD.Refresh()
- src.updateUsrDialog()
+ updateUsrDialog()
else
usr << browse(null, "window=pandemic")
- src.updateUsrDialog()
+ updateUsrDialog()
return
- src.add_fingerprint(usr)
+ add_fingerprint(usr)
return
/obj/machinery/computer/pandemic/attack_hand(mob/user)
@@ -177,8 +177,8 @@
return
user.set_machine(src)
var/dat = ""
- if(src.temp_html)
- dat = "[src.temp_html]
Main Menu"
+ if(temp_html)
+ dat = "[temp_html]
Main Menu"
else if(!beaker)
dat += "Please insert beaker.
"
dat += "Close"
@@ -284,11 +284,11 @@
beaker = I
beaker.loc = src
to_chat(user, "You add the beaker to the machine.")
- src.updateUsrDialog()
+ updateUsrDialog()
icon_state = "mixer1"
else if(istype(I, /obj/item/weapon/screwdriver))
- if(src.beaker)
+ if(beaker)
beaker.loc = get_turf(src)
..()
return
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index f977047d700..f8e6f626bb1 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -28,7 +28,7 @@
/obj/item/weapon/reagent_containers/New()
..()
if(!possible_transfer_amounts)
- src.verbs -= /obj/item/weapon/reagent_containers/verb/set_APTFT
+ verbs -= /obj/item/weapon/reagent_containers/verb/set_APTFT
var/datum/reagents/R = new/datum/reagents(volume)
reagents = R
R.my_atom = src
@@ -80,7 +80,7 @@
/obj/item/weapon/reagent_containers/wash(mob/user, atom/source)
if(is_open_container())
if(reagents.total_volume >= volume)
- to_chat(user, "\The [src] is full.")
+ to_chat(user, "[src] is full.")
return
else
reagents.add_reagent("water", min(volume - reagents.total_volume, amount_per_transfer_from_this))
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 6f53f4c423b..634e0875aaf 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -49,8 +49,8 @@
if(charge_tick < recharge_time) return 0
charge_tick = 0
- if(isrobot(src.loc))
- var/mob/living/silicon/robot/R = src.loc
+ if(isrobot(loc))
+ var/mob/living/silicon/robot/R = loc
if(R && R.cell)
var/datum/reagents/RG = reagent_list[mode]
if(RG.total_volume < RG.maximum_volume) //Don't recharge reagents and drain power if the storage is full.
@@ -84,10 +84,10 @@
if(M.reagents)
var/datum/reagent/injected = chemical_reagents_list[reagent_ids[mode]]
var/contained = injected.name
- M.attack_log += text("\[[time_stamp()]\] Has been injected with [src.name] by [key_name(user)]. Reagents: [contained]")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to inject [key_name(M)]. Reagents: [contained]")
+ M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [key_name(user)]. Reagents: [contained]")
+ user.attack_log += text("\[[time_stamp()]\] Used the [name] to inject [key_name(M)]. Reagents: [contained]")
if(M.ckey)
- msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
+ msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
M.LAssailant = user
var/trans = R.trans_to(M, amount_per_transfer_from_this)
@@ -95,7 +95,7 @@
return
/obj/item/weapon/reagent_containers/borghypo/attack_self(mob/user)
- playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) //Change the mode
+ playsound(loc, 'sound/effects/pop.ogg', 50, 0) //Change the mode
mode++
if(mode > reagent_list.len)
mode = 1
diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm
index 419325445f0..deeeb76b58d 100644
--- a/code/modules/reagents/reagent_containers/dropper.dm
+++ b/code/modules/reagents/reagent_containers/dropper.dm
@@ -18,11 +18,11 @@
if(filled)
if(target.reagents.total_volume >= target.reagents.maximum_volume)
- to_chat(user, "\red [target] is full.")
+ to_chat(user, "[target] is full.")
return
if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/clothing/mask/cigarette)) //You can inject humans and food but you cant remove the shit.
- to_chat(user, "\red You cannot directly fill this object.")
+ to_chat(user, "You cannot directly fill this object.")
return
var/trans = 0
@@ -45,60 +45,58 @@
if(safe_thing)
if(!safe_thing.reagents)
safe_thing.create_reagents(100)
- trans = src.reagents.trans_to(safe_thing, amount_per_transfer_from_this)
+ trans = reagents.trans_to(safe_thing, amount_per_transfer_from_this)
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [] tries to squirt something into []'s eyes, but fails!", user, target), 1)
+ visible_message("[user] tries to squirt something into [victim]'s eyes, but fails!")
spawn(5)
- src.reagents.reaction(safe_thing, TOUCH)
+ reagents.reaction(safe_thing, TOUCH)
- to_chat(user, "\blue You transfer [trans] units of the solution.")
- if(src.reagents.total_volume<=0)
+ to_chat(user, "You transfer [trans] units of the solution.")
+ if(reagents.total_volume<=0)
filled = 0
icon_state = "[initial(icon_state)]"
return
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [] squirts something into []'s eyes!", user, target), 1)
- src.reagents.reaction(target, TOUCH)
+ visible_message("[user] squirts something into [target]'s eyes!")
+ reagents.reaction(target, TOUCH)
var/mob/living/M = target
var/list/injected = list()
- for(var/datum/reagent/R in src.reagents.reagent_list)
+ for(var/datum/reagent/R in reagents.reagent_list)
injected += R.name
var/contained = english_list(injected)
- M.attack_log += text("\[[time_stamp()]\] Has been squirted with [src.name] by [key_name(user)]. Reagents: [contained]")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to squirt [key_name(M)]. Reagents: [contained]")
+ M.attack_log += text("\[[time_stamp()]\] Has been squirted with [name] by [key_name(user)]. Reagents: [contained]")
+ user.attack_log += text("\[[time_stamp()]\] Used the [name] to squirt [key_name(M)]. Reagents: [contained]")
if(M.ckey)
- msg_admin_attack("[key_name_admin(user)] squirted [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
+ msg_admin_attack("[key_name_admin(user)] squirted [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
if(!iscarbon(user))
M.LAssailant = null
else
M.LAssailant = user
- trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
- to_chat(user, "\blue You transfer [trans] units of the solution.")
- if(src.reagents.total_volume<=0)
+ trans = reagents.trans_to(target, amount_per_transfer_from_this)
+ to_chat(user, "You transfer [trans] units of the solution.")
+ if(reagents.total_volume<=0)
filled = 0
icon_state = "[initial(icon_state)]"
else
if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers))
- to_chat(user, "\red You cannot directly remove reagents from [target].")
+ to_chat(user, "You cannot directly remove reagents from [target].")
return
if(!target.reagents.total_volume)
- to_chat(user, "\red [target] is empty.")
+ to_chat(user, "[target] is empty.")
return
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
- to_chat(user, "\blue You fill the [src] with [trans] units of the solution.")
+ to_chat(user, "You fill [src] with [trans] units of the solution.")
filled = 1
icon_state = "[initial(icon_state)][filled]"
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index 2dbc77e0ba7..10187280265 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -54,10 +54,10 @@
/obj/item/weapon/reagent_containers/glass/attack_self()
..()
if(is_open_container())
- to_chat(usr, "You put the lid on \the [src].")
+ to_chat(usr, "You put the lid on [src].")
flags ^= OPENCONTAINER
else
- to_chat(usr, "You take the lid off \the [src].")
+ to_chat(usr, "You take the lid off [src].")
flags |= OPENCONTAINER
update_icon()
@@ -208,7 +208,7 @@
if(usr.incapacitated())
return
if(assembly)
- to_chat(usr, "You detach [assembly] from \the [src]")
+ to_chat(usr, "You detach [assembly] from [src]")
usr.put_in_hands(assembly)
assembly = null
update_icon()
@@ -223,7 +223,7 @@
/obj/item/weapon/reagent_containers/glass/beaker/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/device/assembly_holder) && can_assembly)
if(assembly)
- to_chat(usr, "The [src] already has an assembly.")
+ to_chat(usr, "[src] already has an assembly.")
return ..()
assembly = W
user.drop_item()
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 205d025383f..3972f0a4a13 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -27,24 +27,24 @@
if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution
if(!A.reagents.total_volume && A.reagents)
- to_chat(user, "\The [A] is empty.")
+ to_chat(user, "[A] is empty.")
return
if(reagents.total_volume >= reagents.maximum_volume)
- to_chat(user, "\The [src] is full.")
+ to_chat(user, "[src] is full.")
return
var/trans = A.reagents.trans_to(src, A:amount_per_transfer_from_this)
- to_chat(user, "You fill \the [src] with [trans] units of the contents of \the [A].")
+ to_chat(user, "You fill [src] with [trans] units of the contents of [A].")
return
if(reagents.total_volume < amount_per_transfer_from_this)
- to_chat(user, "\The [src] is empty!")
+ to_chat(user, "[src] is empty!")
return
spray(A)
- playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
+ playsound(loc, 'sound/effects/spray2.ogg', 50, 1, -6)
user.changeNext_move(CLICK_CD_RANGE*2)
user.newtonian_move(get_dir(A, user))
@@ -82,8 +82,8 @@
to_chat(user, "You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.")
/obj/item/weapon/reagent_containers/spray/examine(mob/user)
- if(..(user, 0) && user==src.loc)
- to_chat(user, "[round(src.reagents.total_volume)] units left.")
+ if(..(user, 0) && user == loc)
+ to_chat(user, "[round(reagents.total_volume)] units left.")
/obj/item/weapon/reagent_containers/spray/verb/empty()
@@ -94,10 +94,10 @@
return
if(alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes")
return
- if(isturf(usr.loc) && src.loc == usr)
- to_chat(usr, "You empty \the [src] onto the floor.")
+ if(isturf(usr.loc) && loc == usr)
+ to_chat(usr, "You empty [src] onto the floor.")
reagents.reaction(usr.loc)
- src.reagents.clear_reagents()
+ reagents.clear_reagents()
//space cleaner
/obj/item/weapon/reagent_containers/spray/cleaner
@@ -156,10 +156,10 @@
/obj/item/weapon/reagent_containers/spray/chemsprayer/spray(var/atom/A)
var/Sprays[3]
for(var/i=1, i<=3, i++) // intialize sprays
- if(src.reagents.total_volume < 1) break
+ if(reagents.total_volume < 1) break
var/obj/effect/decal/chempuff/D = new/obj/effect/decal/chempuff(get_turf(src))
D.create_reagents(amount_per_transfer_from_this)
- src.reagents.trans_to(D, amount_per_transfer_from_this)
+ reagents.trans_to(D, amount_per_transfer_from_this)
D.icon += mix_color_from_reagents(D.reagents.reagent_list)
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 71232fa1dad..772eef4d0f9 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -82,7 +82,7 @@
if(istype(target, /mob/living/carbon/slime))
to_chat(user, "\red You are unable to locate any blood.")
return
- if(src.reagents.has_reagent("blood"))
+ if(reagents.has_reagent("blood"))
to_chat(user, "\red There is already a blood sample in this syringe")
return
if(istype(target, /mob/living/carbon))//maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea.
@@ -109,7 +109,7 @@
if(!do_mob(user, target, time))
return
- var/amount = src.reagents.maximum_volume - src.reagents.total_volume
+ var/amount = reagents.maximum_volume - reagents.total_volume
if(amount == 0)
to_chat(usr, "The syringe is full!")
return
@@ -125,10 +125,10 @@
B = T.take_blood(src,amount)
if(B)
- src.reagents.reagent_list |= B
- src.reagents.update_total()
- src.on_reagent_change()
- src.reagents.handle_reactions()
+ reagents.reagent_list |= B
+ reagents.update_total()
+ on_reagent_change()
+ reagents.handle_reactions()
to_chat(user, "\blue You take a blood sample from [target]")
for(var/mob/O in viewers(4, user))
@@ -193,25 +193,25 @@
if(istype(target,/mob/living))
var/mob/living/M = target
var/list/injected = list()
- for(var/datum/reagent/R in src.reagents.reagent_list)
+ for(var/datum/reagent/R in reagents.reagent_list)
injected += R.name
var/contained = english_list(injected)
- M.attack_log += text("\[[time_stamp()]\] Has been injected with [src.name] by [key_name(user)]. Reagents: [contained]")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to inject [key_name(M)]. Reagents: [contained]")
+ M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [key_name(user)]. Reagents: [contained]")
+ user.attack_log += text("\[[time_stamp()]\] Used the [name] to inject [key_name(M)]. Reagents: [contained]")
if(M.ckey)
- msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
+ msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
if(!iscarbon(user))
M.LAssailant = null
else
M.LAssailant = user
- src.reagents.reaction(target, INGEST)
+ reagents.reaction(target, INGEST)
if(ismob(target) && target == user)
- src.reagents.reaction(target, INGEST)
+ reagents.reaction(target, INGEST)
spawn(5)
var/datum/reagent/blood/B
- for(var/datum/reagent/blood/d in src.reagents.reagent_list)
+ for(var/datum/reagent/blood/d in reagents.reagent_list)
B = d
break
var/trans
@@ -219,8 +219,8 @@
var/mob/living/carbon/C = target
C.inject_blood(src, 5)
else
- trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
- to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.")
+ trans = reagents.trans_to(target, amount_per_transfer_from_this)
+ to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [reagents.total_volume] units.")
if(istype(target, /obj/item/weapon/reagent_containers/food/pill/patch))
var/obj/item/weapon/reagent_containers/food/pill/patch/P = target
if(P.instant_application)
@@ -342,12 +342,12 @@
if(!do_mob(user, target, 300)) return
for(var/mob/O in viewers(world.view, user))
O.show_message(text("\red [] injects [] with a giant syringe!", user, target), 1)
- src.reagents.reaction(target, INGEST)
+ reagents.reaction(target, INGEST)
if(ismob(target) && target == user)
- src.reagents.reaction(target, INGEST)
+ reagents.reaction(target, INGEST)
spawn(5)
- var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
- to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.")
+ var/trans = reagents.trans_to(target, amount_per_transfer_from_this)
+ to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [reagents.total_volume] units.")
if(reagents.total_volume >= reagents.maximum_volume && mode==SYRINGE_INJECT)
mode = SYRINGE_DRAW
update_icon()
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 5d2323b9b6e..f5225daeae1 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -20,18 +20,18 @@
reagents = R
R.my_atom = src
if(!possible_transfer_amounts)
- src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
+ verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
..()
/obj/structure/reagent_dispensers/examine(mob/user)
if(!..(user, 2))
return
- to_chat(user, "\blue It contains:")
+ to_chat(user, "It contains:")
if(reagents && reagents.reagent_list.len)
for(var/datum/reagent/R in reagents.reagent_list)
- to_chat(user, "\blue [R.volume] units of [R.name]")
+ to_chat(user, "[R.volume] units of [R.name]")
else
- to_chat(user, "\blue Nothing.")
+ to_chat(user, "Nothing.")
/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this
set name = "Set transfer amount"
@@ -50,12 +50,12 @@
return
if(2.0)
if(prob(50))
- new /obj/effect/effect/water(src.loc)
+ new /obj/effect/effect/water(loc)
qdel(src)
return
if(3.0)
if(prob(5))
- new /obj/effect/effect/water(src.loc)
+ new /obj/effect/effect/water(loc)
qdel(src)
return
else
@@ -63,7 +63,7 @@
/obj/structure/reagent_dispensers/blob_act()
if(prob(50))
- new /obj/effect/effect/water(src.loc)
+ new /obj/effect/effect/water(loc)
qdel(src)
@@ -106,7 +106,7 @@
boom()
/obj/structure/reagent_dispensers/fueltank/proc/boom()
- explosion(src.loc,0,1,5,7,10, flame_range = 5)
+ explosion(loc,0,1,5,7,10, flame_range = 5)
if(src)
qdel(src)
@@ -128,13 +128,13 @@
if(!..(user, 2))
return
if(rig)
- to_chat(usr, "There is some kind of device rigged to the tank.")
+ to_chat(usr, "There is some kind of device rigged to the tank.")
/obj/structure/reagent_dispensers/fueltank/attack_hand()
if(rig)
- usr.visible_message("[usr] begins to detach [rig] from \the [src].", "You begin to detach [rig] from \the [src]")
+ usr.visible_message("[usr] begins to detach [rig] from [src].", "You begin to detach [rig] from [src].")
if(do_after(usr, 20, target = src))
- usr.visible_message("\blue [usr] detaches [rig] from \the [src].", "\blue You detach [rig] from \the [src]")
+ usr.visible_message("[usr] detaches [rig] from [src].", "You detach [rig] from [src].")
rig.loc = get_turf(usr)
rig = null
overlays = new/list()
@@ -142,11 +142,11 @@
/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W,/obj/item/device/assembly_holder) && accepts_rig)
if(rig)
- to_chat(user, "\red There is another device in the way.")
+ to_chat(user, "There is another device in the way.")
return ..()
- user.visible_message("[user] begins rigging [W] to \the [src].", "You begin rigging [W] to \the [src]")
+ user.visible_message("[user] begins rigging [W] to [src].", "You begin rigging [W] to [src]")
if(do_after(user, 20, target = src))
- user.visible_message("\blue [user] rigs [W] to \the [src].", "\blue You rig [W] to \the [src]")
+ user.visible_message("[user] rigs [W] to [src].", "You rig [W] to [src].")
var/obj/item/device/assembly_holder/H = W
if(istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter))
@@ -231,7 +231,7 @@
reagents.add_reagent("beer",1000)
/obj/structure/reagent_dispensers/beerkeg/blob_act()
- explosion(src.loc,0,3,5,7,10)
+ explosion(loc,0,3,5,7,10)
qdel(src)
/obj/structure/reagent_dispensers/virusfood
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index 948973bc3bc..4e720f39c00 100644
--- a/code/modules/recycling/disposal-construction.dm
+++ b/code/modules/recycling/disposal-construction.dm
@@ -96,6 +96,14 @@
dir = turn(dir, -90)
update()
+/obj/structure/disposalconstruct/AltClick(mob/user)
+ if(user.incapacitated())
+ to_chat(user << "You can't do that right now!")
+ return
+ if(!Adjacent(user))
+ return
+ rotate()
+
/obj/structure/disposalconstruct/verb/flip()
set name = "Flip Pipe"
set src in view(1)
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 30c58cce776..262820990c2 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -260,7 +260,7 @@
if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("[src] malfunctions and destroys [exp_on], lashing its arms out at nearby people!")
for(var/mob/living/m in oview(1, src))
- m.apply_damage(15,"brute",pick("head","chest","groin"))
+ m.apply_damage(15,BRUTE,pick("head","chest","groin"))
investigate_log("Experimentor dealt minor brute to [m].", "experimentor")
ejectItem(TRUE)
if(prob(EFFECT_PROB_LOW-badThingCoeff))
@@ -398,7 +398,7 @@
visible_message("[src] malfunctions, activating its emergency coolant systems!")
throwSmoke(src.loc)
for(var/mob/living/m in oview(1, src))
- m.apply_damage(5,"burn",pick("head","chest","groin"))
+ m.apply_damage(5,BURN,pick("head","chest","groin"))
investigate_log("Experimentor has dealt minor burn damage to [m]", "experimentor")
ejectItem()
////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index 1c1ad5dfa1d..6e947511dd6 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -128,7 +128,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(" [user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \
" Your hand slips, tearing skin on [target]'s face with \the [tool]!")
- target.apply_damage(10, BRUTE, affected, sharp=1, sharp=1)
+ target.apply_damage(10, BRUTE, affected, sharp=1, edge=1)
return 0
/datum/surgery_step/face/cauterize
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 44c0e30d9f2..21328599a19 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -256,11 +256,11 @@
if(iscarbon(user))
var/mob/living/carbon/C = user
C.Weaken(6)
- C.apply_damage(20, "brute", "chest")
+ C.apply_damage(20, BRUTE, "chest")
else if(issilicon(user))
var/mob/living/silicon/S = user
S.Weaken(8)
- S.apply_damage(20, "brute")
+ S.apply_damage(20, BRUTE)
playsound(S, 'sound/effects/bang.ogg', 50, 1)
return 0
user.visible_message("[user] shines light onto the tumor in [target]'s head!", "You cleanse the contamination from [target]'s brain!")
diff --git a/code/world.dm b/code/world.dm
index 6fa54acfbe7..c82b00b8e9a 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -154,6 +154,39 @@ var/world_topic_spam_protect_time = world.timeofday
return list2params(s)
+ else if("manifest" in input)
+ var/list/positions = list()
+ var/list/set_names = list(
+ "heads" = command_positions,
+ "sec" = security_positions,
+ "eng" = engineering_positions,
+ "med" = medical_positions,
+ "sci" = science_positions,
+ "car" = supply_positions,
+ "srv" = service_positions,
+ "civ" = civilian_positions,
+ "bot" = nonhuman_positions
+ )
+
+ for(var/datum/data/record/t in data_core.general)
+ var/name = t.fields["name"]
+ var/rank = t.fields["rank"]
+ var/real_rank = t.fields["real_rank"]
+
+ var/department = 0
+ for(var/k in set_names)
+ if(real_rank in set_names[k])
+ if(!positions[k])
+ positions[k] = list()
+ positions[k][name] = rank
+ department = 1
+ if(!department)
+ if(!positions["misc"])
+ positions["misc"] = list()
+ positions["misc"][name] = rank
+
+ return json_encode(positions)
+
else if("adminmsg" in input)
/*
We got an adminmsg from IRC bot lets split the input then validate the input.
diff --git a/html/changelog.html b/html/changelog.html
index 27fe9b5f57f..674ceedea5f 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,128 @@
-->
+
28 July 2016
+
A Giant-Ass Mountain of Salt updated:
+
+
Crazylemon64 updated:
+
+ - Adds an explosion buildmode
+ - "Drop Everything" in VV no longer causes limbs to fall to the ground.
+
+
FlattestGuitar updated:
+
+ - IAAs can now select the classic secHUD in loadouts
+ - adds bananas and suit jackets to the loadout system
+ - adds dress shoes and fancy sandals to the loadout system
+ - Miners can now get the mining coat from loadouts
+
+
Fox McCloud updated:
+
+ - Fixes organ repair surgery saying an organ wasn't damaged when it actually was
+ - Removes the 1 burn heal from regular ointment
+ - Regular bandages will now disinfect (in addition to stopping bleeding as they previously did)
+ - Fixes a few crafting recipes not having the proper category
+ - Fixes laser slugs not firing lasers
+ - Adjusts the damage/consistency of improvised slugs
+ - Adds in craftable bolas; throw them at someone to slow them down
+ - Secvend starts off with e-bolas
+ - Can make spears with personal crafting now
+ - Fixes teacups and some other drinks having no sprite, in-hand, or object
+ - adds alt-click rotating of chairs, disposal pipes, windows, the PA, emitters, and windoor assemblies
+ - Cablecuffs are now made by opening the cable stack's crafting menu by using it in your hand
+ - Fixes cablecuffs not having a unique in-hand icon
+ - Fixes cable coils not having a unique in-hand icon
+ - All cablecuffs will be red, regardless of what they're produced from
+ - Fixes an unlimited metal exploit
+ - IV Drip sprites updated; has visual feedback for if it's injecting or taking blood
+ - IV Drip injection rate dramatically increased
+ - Warning ping for when someone is low on blood
+ - Support for species with exotic blood type
+ - Alt-Click to toggle between modes
+ - Sensory restoration virology symptom no longer has anti-stun properties nor heals brain damage, but has a lower acquisition level
+ - Damage convert heals individual limbs instead of healing overall damage (actual impact is low)
+ - Librarian now starts off with a bookbag
+ - Bookbag can now hold Bibles, cult tomes, books, and spellbooks
+ - Can empty a bookbag into a bookshelf
+ - Fixes an exploit where you could generate wood out of thin air
+ - Fixes blobspores doing more damage than intended
+
+
Fox-McCloud updated:
+
+ - Adds in a few makeshift items/weapons: molotovs, grenade lances, golden bikehorn, paper bags, and DIY chainsaws
+ - Fixes some personal crafting behaving as other than intended
+
+
FreeStylaLT updated:
+
+ - Fixed brig cell block APCs not getting power
+ - Fixed space buggery Kyet made :angry:
+ - Fixed missing light near labor shuttle dock
+ - Fixed wrongly placed cobweb in solitary
+ - Fixed basketball court not having a basketball
+ - Added windows to brig processing entrance
+ - Re-added the missing EOD and biohazard lockers in Armory
+ - 6 gas masks from Armory
+ - Added grid check into random events.
+
+
Krausus updated:
+
+ - The voting panel now uses the browser datum, which means it looks nicer.
+ - The voting panel now updates while a vote is in progress.
+ - When a vote is started, it will now include a link to open the vote panel, as an alternative to typing in "vote".
+ - Custom votes will now show full voting results upon completion.
+ - Admins should no longer lose the "cancel vote" link in the voting panel.
+ - View Variables should probably stop crashing admins.
+ - The RnD console now shows an overlay while you're waiting for it to do work, rather than using a separate wait screen.
+ - Admins now have click shortcuts for opening a player panel, showing mob info, and viewing variables. Specifics are in Hotkey Help.
+
+
Kyep updated:
+
+ - Admins can now see attacks against SSD players more easily.
+ - Clarified the text you get when examining a SSD player.
+ - It is now possible for admins to remove a person's vamp thrall status.
+ - Adds Vox, Greytide & Soviet loadouts to admin Select Equipment verb.
+ - Fixes an issue with spy loadouts, and excessive access on loadouts in general
+
+
Spacemanspark updated:
+
+ - Cardboard boxes now have their own specific name in the cardboard sheets menu.
+
+
TheDZD updated:
+
+ - Fixes tempgun not recharging.
+ - Fixes tempgun beams costing one tenth of what they are supposed to.
+ - Admin-only jobs check for R_EVENT now, instead of R_ADMIN, as event-related tools should.
+ - Mentors should no longer get spammed by the library checkout computer on occasion.
+ - Mentors should no longer get spammed by mirrors due to body accessories.
+
+
TullyBurnalot updated:
+
+ - AI Integrity Restorers now destroy any AIs inside if they get EMP'd
+ - AI Integrity Restorers can be deconstructed if broken via explosions. This kills the AI inside
+
+
Twinmold updated:
+
+ - Can no longer destroy pods with anything other than brute and burn weapons.
+ - Can no longer pull someone out of a pod when no one is actually in the pod.
+ - Can now melee attack pods with weapons when harm intent is on.
+ - Vox Objective 4 now calculates the kills vox raiders actually have, instead of always complete.
+
+
Ty-Omaha updated:
+
+ - Gives Combat Gloves to Code Red ERT agents.
+ - Gives Code Gamma Engineering ERT agents Combat Gloves.
+
+
monster860, clusterfack, and DeityLink updated:
+
+
tigercat2000 updated:
+
+ - Removes space parallax, due to server overhead, input lag & bugs
+
+
21 July 2016
Alffd updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 1309d5211dd..ff1c0d89d1e 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2433,3 +2433,112 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
and Xenomorph Larva Whack-A-Mole
monster860:
- bugfix: Brig timer UI reopening after being closed fixed.
+2016-07-28:
+ A Giant-Ass Mountain of Salt:
+ - rscadd: Re-adds PDA slot.
+ Crazylemon64:
+ - rscadd: Adds an explosion buildmode
+ - bugfix: '"Drop Everything" in VV no longer causes limbs to fall to the ground.'
+ FlattestGuitar:
+ - tweak: IAAs can now select the classic secHUD in loadouts
+ - rscadd: adds bananas and suit jackets to the loadout system
+ - rscadd: adds dress shoes and fancy sandals to the loadout system
+ - bugfix: Miners can now get the mining coat from loadouts
+ Fox McCloud:
+ - bugfix: Fixes organ repair surgery saying an organ wasn't damaged when it actually
+ was
+ - tweak: Removes the 1 burn heal from regular ointment
+ - tweak: Regular bandages will now disinfect (in addition to stopping bleeding as
+ they previously did)
+ - bugfix: Fixes a few crafting recipes not having the proper category
+ - bugfix: Fixes laser slugs not firing lasers
+ - tweak: Adjusts the damage/consistency of improvised slugs
+ - rscadd: Adds in craftable bolas; throw them at someone to slow them down
+ - rscadd: Secvend starts off with e-bolas
+ - rscadd: Can make spears with personal crafting now
+ - bugfix: Fixes teacups and some other drinks having no sprite, in-hand, or object
+ - rscadd: adds alt-click rotating of chairs, disposal pipes, windows, the PA, emitters,
+ and windoor assemblies
+ - tweak: Cablecuffs are now made by opening the cable stack's crafting menu by using
+ it in your hand
+ - bugfix: Fixes cablecuffs not having a unique in-hand icon
+ - bugfix: Fixes cable coils not having a unique in-hand icon
+ - tweak: All cablecuffs will be red, regardless of what they're produced from
+ - bugfix: Fixes an unlimited metal exploit
+ - rscadd: IV Drip sprites updated; has visual feedback for if it's injecting or
+ taking blood
+ - tweak: IV Drip injection rate dramatically increased
+ - rscadd: Warning ping for when someone is low on blood
+ - rscadd: Support for species with exotic blood type
+ - rscadd: Alt-Click to toggle between modes
+ - tweak: Sensory restoration virology symptom no longer has anti-stun properties
+ nor heals brain damage, but has a lower acquisition level
+ - tweak: Damage convert heals individual limbs instead of healing overall damage
+ (actual impact is low)
+ - rscadd: Librarian now starts off with a bookbag
+ - tweak: Bookbag can now hold Bibles, cult tomes, books, and spellbooks
+ - rscadd: Can empty a bookbag into a bookshelf
+ - bugfix: Fixes an exploit where you could generate wood out of thin air
+ - bugfix: Fixes blobspores doing more damage than intended
+ Fox-McCloud:
+ - rscadd: 'Adds in a few makeshift items/weapons: molotovs, grenade lances, golden
+ bikehorn, paper bags, and DIY chainsaws'
+ - bugfix: Fixes some personal crafting behaving as other than intended
+ FreeStylaLT:
+ - bugfix: Fixed brig cell block APCs not getting power
+ - bugfix: 'Fixed space buggery Kyet made :angry:'
+ - bugfix: Fixed missing light near labor shuttle dock
+ - bugfix: Fixed wrongly placed cobweb in solitary
+ - bugfix: Fixed basketball court not having a basketball
+ - rscadd: Added windows to brig processing entrance
+ - rscadd: Re-added the missing EOD and biohazard lockers in Armory
+ - rscdel: 6 gas masks from Armory
+ - rscadd: Added grid check into random events.
+ Krausus:
+ - tweak: The voting panel now uses the browser datum, which means it looks nicer.
+ - tweak: The voting panel now updates while a vote is in progress.
+ - tweak: When a vote is started, it will now include a link to open the vote panel,
+ as an alternative to typing in "vote".
+ - tweak: Custom votes will now show full voting results upon completion.
+ - bugfix: Admins should no longer lose the "cancel vote" link in the voting panel.
+ - bugfix: View Variables should probably stop crashing admins.
+ - tweak: The RnD console now shows an overlay while you're waiting for it to do
+ work, rather than using a separate wait screen.
+ - rscadd: Admins now have click shortcuts for opening a player panel, showing mob
+ info, and viewing variables. Specifics are in Hotkey Help.
+ Kyep:
+ - rscadd: Admins can now see attacks against SSD players more easily.
+ - tweak: Clarified the text you get when examining a SSD player.
+ - bugfix: It is now possible for admins to remove a person's vamp thrall status.
+ - rscadd: Adds Vox, Greytide & Soviet loadouts to admin Select Equipment verb.
+ - bugfix: Fixes an issue with spy loadouts, and excessive access on loadouts in
+ general
+ Spacemanspark:
+ - bugfix: Cardboard boxes now have their own specific name in the cardboard sheets
+ menu.
+ TheDZD:
+ - bugfix: Fixes tempgun not recharging.
+ - bugfix: Fixes tempgun beams costing one tenth of what they are supposed to.
+ - bugfix: Admin-only jobs check for R_EVENT now, instead of R_ADMIN, as event-related
+ tools should.
+ - bugfix: Mentors should no longer get spammed by the library checkout computer
+ on occasion.
+ - bugfix: Mentors should no longer get spammed by mirrors due to body accessories.
+ TullyBurnalot:
+ - tweak: AI Integrity Restorers now destroy any AIs inside if they get EMP'd
+ - tweak: AI Integrity Restorers can be deconstructed if broken via explosions. This
+ kills the AI inside
+ Twinmold:
+ - bugfix: Can no longer destroy pods with anything other than brute and burn weapons.
+ - bugfix: Can no longer pull someone out of a pod when no one is actually in the
+ pod.
+ - tweak: Can now melee attack pods with weapons when harm intent is on.
+ - tweak: Vox Objective 4 now calculates the kills vox raiders actually have, instead
+ of always complete.
+ Ty-Omaha:
+ - tweak: Gives Combat Gloves to Code Red ERT agents.
+ - tweak: Gives Code Gamma Engineering ERT agents Combat Gloves.
+ monster860, clusterfack, and DeityLink:
+ - rscadd: Adds space parallax
+ tigercat2000:
+ - rscdel: Removes space parallax, due to server overhead, input lag & bugs
diff --git a/html/changelogs/AutoChangeLog-pr-5100.yml b/html/changelogs/AutoChangeLog-pr-5100.yml
deleted file mode 100644
index 4da76e20694..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5100.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: A Giant-Ass Mountain of Salt
-delete-after: True
-changes:
- - rscadd: "Re-adds PDA slot."
diff --git a/html/changelogs/AutoChangeLog-pr-5108.yml b/html/changelogs/AutoChangeLog-pr-5108.yml
deleted file mode 100644
index 91ad159673c..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5108.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Twinmold
-delete-after: True
-changes:
- - bugfix: "Can no longer destroy pods with anything other than brute and burn weapons."
- - bugfix: "Can no longer pull someone out of a pod when no one is actually in the pod."
- - tweak: "Can now melee attack pods with weapons when harm intent is on."
diff --git a/html/changelogs/AutoChangeLog-pr-5137.yml b/html/changelogs/AutoChangeLog-pr-5137.yml
deleted file mode 100644
index ec2f850e681..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5137.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Kyep
-delete-after: True
-changes:
- - rscadd: "Admins can now see attacks against SSD players more easily."
- - tweak: "Clarified the text you get when examining a SSD player."
diff --git a/html/changelogs/AutoChangeLog-pr-5138.yml b/html/changelogs/AutoChangeLog-pr-5138.yml
deleted file mode 100644
index c6c227bb522..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5138.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-author: FreeStylaLT
-delete-after: True
-changes:
- - bugfix: "Fixed brig cell block APCs not getting power"
- - bugfix: "Fixed space buggery Kyet made :angry:"
- - bugfix: "Fixed missing light near labor shuttle dock"
- - bugfix: "Fixed wrongly placed cobweb in solitary"
- - bugfix: "Fixed basketball court not having a basketball"
- - rscadd: "Added windows to brig processing entrance"
- - rscadd: "Re-added the missing EOD and biohazard lockers in Armory"
- - rscdel: "6 gas masks from Armory"
diff --git a/html/changelogs/AutoChangeLog-pr-5144.yml b/html/changelogs/AutoChangeLog-pr-5144.yml
deleted file mode 100644
index e0805cd23d4..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5144.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - bugfix: "Fixes organ repair surgery saying an organ wasn't damaged when it actually was"
- - tweak: "Removes the 1 burn heal from regular ointment"
- - tweak: "Regular bandages will now disinfect (in addition to stopping bleeding as they previously did)"
diff --git a/html/changelogs/AutoChangeLog-pr-5159.yml b/html/changelogs/AutoChangeLog-pr-5159.yml
deleted file mode 100644
index f61ea6e1943..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5159.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - bugfix: "Fixes a few crafting recipes not having the proper category"
- - bugfix: "Fixes laser slugs not firing lasers"
- - tweak: "Adjusts the damage/consistency of improvised slugs"
- - rscadd: "Adds in craftable bolas; throw them at someone to slow them down"
- - rscadd: "Secvend starts off with e-bolas"
- - rscadd: "Can make spears with personal crafting now"
diff --git a/html/changelogs/AutoChangeLog-pr-5161.yml b/html/changelogs/AutoChangeLog-pr-5161.yml
deleted file mode 100644
index a40bea35861..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5161.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - bugfix: "Fixes teacups and some other drinks having no sprite, in-hand, or object"
diff --git a/html/changelogs/AutoChangeLog-pr-5164.yml b/html/changelogs/AutoChangeLog-pr-5164.yml
deleted file mode 100644
index a8255aa162d..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5164.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: TheDZD
-delete-after: True
-changes:
- - bugfix: "Fixes tempgun not recharging."
- - bugfix: "Fixes tempgun beams costing one tenth of what they are supposed to."
diff --git a/html/changelogs/AutoChangeLog-pr-5178.yml b/html/changelogs/AutoChangeLog-pr-5178.yml
deleted file mode 100644
index 78b2f4f927e..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5178.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - bugfix: "View Variables should probably stop crashing admins."
diff --git a/html/changelogs/AutoChangeLog-pr-5190.yml b/html/changelogs/AutoChangeLog-pr-5190.yml
deleted file mode 100644
index 232f6bb3f51..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5190.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Kyep
-delete-after: True
-changes:
- - bugfix: "It is now possible for admins to remove a person's vamp thrall status."
diff --git a/html/changelogs/AutoChangeLog-pr-5191.yml b/html/changelogs/AutoChangeLog-pr-5191.yml
deleted file mode 100644
index ffa6d33de26..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5191.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - tweak: "The RnD console now shows an overlay while you're waiting for it to do work, rather than using a separate wait screen."
diff --git a/html/changelogs/AutoChangeLog-pr-5200.yml b/html/changelogs/AutoChangeLog-pr-5200.yml
deleted file mode 100644
index dad0ed52822..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5200.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: TheDZD
-delete-after: True
-changes:
- - bugfix: "Admin-only jobs check for R_EVENT now, instead of R_ADMIN, as event-related tools should."
- - bugfix: "Mentors should no longer get spammed by the library checkout computer on occasion."
- - bugfix: "Mentors should no longer get spammed by mirrors due to body accessories."
diff --git a/icons/goonstation/effects/fire.dmi b/icons/goonstation/effects/fire.dmi
new file mode 100644
index 00000000000..48a1f9b90e6
Binary files /dev/null and b/icons/goonstation/effects/fire.dmi differ
diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi
index 1d206b45e75..062d5b404c8 100644
Binary files a/icons/misc/buildmode.dmi and b/icons/misc/buildmode.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 7553227171c..fec4fdce7a1 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 2a5ac2889c2..bdc47e32599 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index f950b2bdf74..20ff8795432 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 21205081639..25ec0162866 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 40ef753fb6f..f81f4ab555a 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/iv_drip.dmi b/icons/obj/iv_drip.dmi
index 40068f216e7..016513245e1 100644
Binary files a/icons/obj/iv_drip.dmi and b/icons/obj/iv_drip.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 9c90b468860..d21263adf0f 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 2c9a230d1df..745f976c1ca 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/interface/interface.dm b/interface/interface.dm
index f144b225160..cf3419cc1a7 100644
--- a/interface/interface.dm
+++ b/interface/interface.dm
@@ -89,6 +89,11 @@ Admin:
\tF7 = Player Panel
\tF8 = Admin PM
\tF9 = Invisimin
+
+Admin ghost:
+\tCtrl+Click = Player Panel
+\tCtrl+Shift+Click = View Variables
+\tShift+Middle Click = Mob Info
"}
mob.hotkey_help()
diff --git a/paradise.dme b/paradise.dme
index 4f7fa9adeb9..d79069d135d 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -180,7 +180,6 @@
#include "code\controllers\Processes\sun.dm"
#include "code\controllers\Processes\ticker.dm"
#include "code\controllers\Processes\timer.dm"
-#include "code\controllers\Processes\vote.dm"
#include "code\controllers\Processes\weather.dm"
#include "code\controllers\ProcessScheduler\core\process.dm"
#include "code\controllers\ProcessScheduler\core\processScheduler.dm"
@@ -826,6 +825,7 @@
#include "code\game\objects\items\weapons\table_rack_parts.dm"
#include "code\game\objects\items\weapons\tape.dm"
#include "code\game\objects\items\weapons\teleportation.dm"
+#include "code\game\objects\items\weapons\teleprod.dm"
#include "code\game\objects\items\weapons\tools.dm"
#include "code\game\objects\items\weapons\twohanded.dm"
#include "code\game\objects\items\weapons\vending_items.dm"
@@ -1866,6 +1866,7 @@
#include "code\modules\reagents\oldchem\reagents\reagents_food.dm"
#include "code\modules\reagents\oldchem\reagents\reagents_med.dm"
#include "code\modules\reagents\oldchem\reagents\reagents_misc.dm"
+#include "code\modules\reagents\oldchem\reagents\reagents_paint.dm"
#include "code\modules\reagents\oldchem\reagents\reagents_toxin.dm"
#include "code\modules\reagents\oldchem\reagents\reagents_water.dm"
#include "code\modules\reagents\oldchem\reagents\drink\reagents_alcohol.dm"