diff --git a/ByondPOST.dll b/ByondPOST.dll
index f94ea657653..6cc763ade64 100644
Binary files a/ByondPOST.dll and b/ByondPOST.dll differ
diff --git a/UDPShipper.dll b/UDPShipper.dll
new file mode 100644
index 00000000000..ceef0d0d392
Binary files /dev/null and b/UDPShipper.dll differ
diff --git a/baystation12.dme b/baystation12.dme
index 73fe4494c9f..2749d16ad66 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -328,6 +328,7 @@
#include "code\game\dna\dna_modifier.dm"
#include "code\game\dna\genes\disabilities.dm"
#include "code\game\dna\genes\gene.dm"
+#include "code\game\dna\genes\monkey.dm"
#include "code\game\dna\genes\powers.dm"
#include "code\game\gamemodes\antagspawner.dm"
#include "code\game\gamemodes\events.dm"
@@ -2084,6 +2085,7 @@
#include "code\modules\turbolift\turbolift_map.dm"
#include "code\modules\turbolift\turbolift_process.dm"
#include "code\modules\turbolift\turbolift_turfs.dm"
+#include "code\modules\udp\ship_udp.dm"
#include "code\modules\vehicles\bike.dm"
#include "code\modules\vehicles\cargo_train.dm"
#include "code\modules\vehicles\train.dm"
diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index b4165b91796..0b9521a4514 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -267,7 +267,7 @@
hibernate = 0
- //log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/unary/vent_pump/receive_signal([signal.debug_print()])")
+ //log_debug("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/unary/vent_pump/receive_signal([signal.debug_print()])")
if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command"))
return 0
@@ -342,7 +342,7 @@
broadcast_status()
return //do not update_icon
- //log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]")
+ //log_debug("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]")
spawn(2)
broadcast_status()
update_icon()
diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
index 3cb91710571..152576d6eb5 100644
--- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
@@ -246,7 +246,7 @@
broadcast_status()
return //do not update_icon
-// log_admin("DEBUG \[[world.timeofday]\]: vent_scrubber/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]")
+// log_debug("DEBUG \[[world.timeofday]\]: vent_scrubber/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]")
spawn(2)
broadcast_status()
update_icon()
diff --git a/code/__defines/lighting.dm b/code/__defines/lighting.dm
index 6b057fce8ba..ca07736717e 100644
--- a/code/__defines/lighting.dm
+++ b/code/__defines/lighting.dm
@@ -3,7 +3,8 @@
#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone
#define LIGHTING_ROUND_VALUE 1 / 128 //Value used to round lumcounts, values smaller than 1/255 don't matter (if they do, thanks sinking points), greater values will make lighting less precise, but in turn increase performance, VERY SLIGHTLY.
-#define LIGHTING_ICON 'icons/effects/lighting_overlay.png' // icon used for lighting shading effects
+#define LIGHTING_ICON 'icons/effects/lighting_overlay.dmi' // icon used for lighting shading effects
+#define LIGHTING_BASE_ICON_STATE "matrix"
#define LIGHTING_SOFT_THRESHOLD 0.001 // If the max of the lighting lumcounts of each spectrum drops below this, disable luminosity on the lighting overlays.
diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index 075bdd366fa..f0b5646b9a6 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -291,6 +291,8 @@
// Shim until addtimer is merged or I figure out if it is safe to use scheduler for this.
#define QDEL_IN(OBJ, TIME) spawn(TIME) qdel(OBJ)
+#define DEBUG_REF(D) (D ? "\ref[D]|[D] ([D.type])" : "NULL")
+
//Recipe type defines. Used to determine what machine makes them
#define MICROWAVE 0x1
#define FRYER 0x2
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 7a51eb5defb..695ab933aeb 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -113,6 +113,10 @@
#define COMPANY_ALIGNMENTS list(COMPANY_LOYAL,COMPANY_SUPPORTATIVE,COMPANY_NEUTRAL,COMPANY_SKEPTICAL,COMPANY_OPPOSED)
+// Defines the argument used for get_mobs_and_objs_in_view_fast
+#define GHOSTS_ALL_HEAR 1
+#define ONLY_GHOSTS_IN_VIEW 0
+
// Defines mob sizes, used by lockers and to determine what is considered a small sized mob, etc.
#define MOB_LARGE 16
diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm
index 1210ba9f3e8..85548fe6352 100644
--- a/code/_helpers/game.dm
+++ b/code/_helpers/game.dm
@@ -245,6 +245,41 @@
. += M
return .
+/proc/get_mobs_and_objs_in_view_fast(var/turf/T, var/range, var/list/mobs, var/list/objs, var/checkghosts = GHOSTS_ALL_HEAR)
+
+ var/list/hear = list()
+ DVIEW(hear, range, T, INVISIBILITY_MAXIMUM)
+ var/list/hearturfs = list()
+
+ for(var/am in hear)
+ var/atom/movable/AM = am
+ if(ismob(AM))
+ mobs += AM
+ hearturfs += AM.locs[1]
+ else if(isobj(AM))
+ objs += AM
+ hearturfs += AM.locs[1]
+
+
+ for(var/m in player_list)
+ var/mob/M = m
+ if(checkghosts == GHOSTS_ALL_HEAR && M.stat == DEAD && (M.client && M.client.prefs.toggles & CHAT_GHOSTEARS))
+ mobs |= M
+ continue
+ if(M.loc && M.locs[1] in hearturfs)
+ mobs |= M
+
+
+
+ for(var/o in listening_objects)
+ var/obj/O = o
+ if(O && O.loc && O.locs[1] in hearturfs)
+ objs |= O
+
+
+
+
+
#define SIGN(X) ((X<0)?-1:1)
proc
diff --git a/code/_helpers/icons.dm b/code/_helpers/icons.dm
index 9d41400e691..22ffb95a20a 100644
--- a/code/_helpers/icons.dm
+++ b/code/_helpers/icons.dm
@@ -107,7 +107,7 @@ AngleToHue(hue)
Converts an angle to a hue in the valid range.
RotateHue(hsv, angle)
Takes an HSV or HSVA value and rotates the hue forward through red, green, and blue by an angle from 0 to 360.
- (Rotating red by 60° produces yellow.) The result is another HSV or HSVA color with the same saturation and value
+ (Rotating red by 60� produces yellow.) The result is another HSV or HSVA color with the same saturation and value
as the original, but a different hue.
GrayScale(rgb)
Takes an RGB or RGBA color and converts it to grayscale. Returns an RGB or RGBA string.
@@ -886,17 +886,26 @@ proc/generate_image(var/tx as num, var/ty as num, var/tz as num, var/range as nu
//Capture includes non-existan turfs
if(!suppress_errors)
return
+
+ return generate_image_from_turfs(turfstocapture, range, cap_mode, user, lighting)
+
+/proc/generate_image_from_turfs(turf/topleft, list/turf/turfstocapture, range as num, cap_mode = CAPTURE_MODE_PARTIAL, mob/living/user, lighting = TRUE)
+ var/tx = topleft.x
+ var/ty = topleft.y
//Lines below determine what objects will be rendered
var/list/atoms = list()
for(var/turf/T in turfstocapture)
- atoms.Add(T)
+ atoms += T
for(var/atom/A in T)
- if(istype(A, /atom/movable/lighting_overlay) && lighting) //Special case for lighting
- atoms.Add(A)
+ if(istype(A, /atom/movable/lighting_overlay)) //Special case for lighting
continue
- if(A.invisibility) continue
- atoms.Add(A)
- //Lines below actually render all colected data
+
+ if(A.invisibility)
+ continue
+
+ atoms += A
+
+ //Lines below actually render all collected data
atoms = sort_atoms_by_layer(atoms)
var/icon/cap = icon('icons/effects/96x96.dmi', "")
cap.Scale(range*32, range*32)
@@ -911,6 +920,14 @@ proc/generate_image(var/tx as num, var/ty as num, var/tz as num, var/range as nu
var/yoff = (A.y - ty) * 32
cap.Blend(img, blendMode2iconMode(A.blend_mode), A.pixel_x + xoff, A.pixel_y + yoff)
+ if (lighting)
+ for (var/turf/T in turfstocapture)
+ var/icon/im = new(LIGHTING_ICON, "blank")
+ var/color = T.get_avg_color() // We're going to lose some detail, but it's all we can do without color matrixes.
+ if (color)
+ im.Blend(color, ICON_MULTIPLY)
+ cap.Blend(im, ICON_MULTIPLY, (T.x - tx) * 32, (T.y - ty) * 32)
+
return cap
proc/percentage_to_colour(var/P)
diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm
index 80504010b19..d67ae01c605 100644
--- a/code/_helpers/logging.dm
+++ b/code/_helpers/logging.dm
@@ -23,12 +23,13 @@
/proc/game_log(category, text)
diary << "\[[time_stamp()]] [game_id] [category]: [text][log_end]"
-/proc/log_admin(text)
+/proc/log_admin(text,level=5,ckey="",admin_key="",ckey_target="")
admin_log.Add(text)
if (config.log_admin)
game_log("ADMIN", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=level,category="ADMIN",additional_data=list("_ckey"=html_encode(ckey),"_admin_key"=html_encode(admin_key),"_ckey_target"=html_encode(ckey_target)))
-/proc/log_debug(text)
+/proc/log_debug(text,level=5)
if (config.log_debug)
game_log("DEBUG", text)
@@ -37,62 +38,72 @@
return
if(C.prefs.toggles & CHAT_DEBUGLOGS)
C << "DEBUG: [text]"
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=level,category="DEBUG")
-/proc/log_game(text)
+/proc/log_game(text,level=5,ckey="",admin_key="",ckey_target="")
if (config.log_game)
game_log("GAME", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=level,category="GAME",additional_data=list("_ckey"=html_encode(ckey),"_admin_key"=html_encode(admin_key),"_target"=html_encode(target)))
/proc/log_vote(text)
if (config.log_vote)
game_log("VOTE", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=5,category="VOTE")
-/proc/log_access(text)
+/proc/log_access(text,level=5,ckey="")
if (config.log_access)
game_log("ACCESS", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=level,category="ACCESS",additional_data=list("_ckey"=html_encode(ckey)))
-/proc/log_say(text)
+/proc/log_say(text,level=5,ckey="")
if (config.log_say)
game_log("SAY", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=level,category="SAY",additional_data=list("_ckey"=html_encode(ckey)))
-/proc/log_ooc(text)
+/proc/log_ooc(text,level=5,ckey="")
if (config.log_ooc)
game_log("OOC", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=level,category="OOC",additional_data=list("_ckey"=html_encode(ckey)))
-/proc/log_whisper(text)
- if (config.log_whisper)
+/proc/log_whisper(text,level=5,ckey="")
+ if (config.log_whisper)
game_log("WHISPER", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=level,category="WHISPER",additional_data=list("_ckey"=html_encode(ckey)))
-/proc/log_emote(text)
+/proc/log_emote(text,level=5,ckey="")
if (config.log_emote)
game_log("EMOTE", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=level,category="EMOTE",additional_data=list("_ckey"=html_encode(ckey)))
-/proc/log_attack(text)
+/proc/log_attack(text,level=5,ckey="",ckey_target="")
if (config.log_attack)
game_log("ATTACK", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=5,category="ATTACK",additional_data=list("_ckey"=html_encode(ckey),"_ckey_target"=html_encode(ckey_target)))
/proc/log_adminsay(text)
if (config.log_adminchat)
game_log("ADMINSAY", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=5,category="ADMINSAY")
-/proc/log_adminwarn(text)
- if (config.log_adminwarn)
- game_log("ADMINWARN", text)
-
-/proc/log_pda(text)
+/proc/log_pda(text,level=5,ckey="",ckey_target="")
if (config.log_pda)
game_log("PDA", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=level,category="PDA",additional_data=list("_ckey"=html_encode(ckey),"_ckey_target"=html_encode(ckey_target)))
-/proc/log_ntirc(text)
+/proc/log_ntirc(text,level=5,ckey="",conversation="")
if (config.log_pda)
game_log("NTIRC", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=level,category="NTIRC",additional_data=list("_ckey"=html_encode(ckey),"_ntirc_conversation"=html_encode(conversation)))
/proc/log_to_dd(text)
world.log << text //this comes before the config check because it can't possibly runtime
if(config.log_world_output)
game_log("DD_OUTPUT", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=5,category="DD_OUTPUT")
/proc/log_misc(text)
game_log("MISC", text)
+ send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=5,category="MISC")
/proc/log_unit_test(text)
world.log << "## UNIT_TEST ##: [text]"
@@ -102,6 +113,7 @@
if (config.log_runtime)
diary_runtime << "hard delete:[log_end]"
diary_runtime << "[A.type][log_end]"
+ send_gelf_log(short_message="hard delete: [A.type]",level=5,category="HARDDEL")
/proc/log_exception(exception/e)
if (config.log_runtime)
@@ -110,6 +122,7 @@
diary_runtime << "runtime error:[e.name][log_end]"
diary_runtime << "[e.desc]"
+ send_gelf_log(short_message="runtime error:[e.name]",long_message="[e.desc]",level=5,category="HARDDEL")
//pretty print a direction bitflag, can be useful for debugging.
/proc/print_dir(var/dir)
diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm
index 0fd90e7536f..ce40cf58cb9 100644
--- a/code/_helpers/mobs.dm
+++ b/code/_helpers/mobs.dm
@@ -158,7 +158,7 @@ Proc for attack log creation, because really why not
if(target && ismob(target))
target.attack_log += text("\[[time_stamp()]\] Has been [what_done] by [user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]")
if(admin)
- log_attack("[user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"] [what_done] [target ? "[target.name][(ismob(target) && target.ckey)? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]")
+ log_attack("[user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"] [what_done] [target ? "[target.name][(ismob(target) && target.ckey)? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]",ckey=key_name(user),ckey_target=key_name(target))
//checks whether this item is a module of the robot it is located in.
/proc/is_robot_module(var/obj/item/thing)
diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm
index ef732ebd0f4..5c80a00ad67 100644
--- a/code/_helpers/time.dm
+++ b/code/_helpers/time.dm
@@ -13,9 +13,7 @@ proc/worldtime2text(time = world.time, timeshift = 1)
/proc/worldtime2hours()
if (!roundstart_hour)
worldtime2text()
- . = (world.timeofday / (60 MINUTES)) + roundstart_hour
- if (. > 24)
- . -= 24
+ . = text2num(time2text(world.time + (36000 * roundstart_hour), "hh"))
proc/worlddate2text()
return num2text(game_year) + "-" + time2text(world.timeofday, "MM-DD")
diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm
index f8399da0bfa..b2e9bf5ec78 100644
--- a/code/_onclick/hud/alien_larva.dm
+++ b/code/_onclick/hud/alien_larva.dm
@@ -37,6 +37,7 @@
mymob.flash.name = "flash"
mymob.flash.screen_loc = ui_entire_screen
mymob.flash.layer = 17
+ mymob.flash.mouse_opacity = 0
mymob.fire = new /obj/screen()
mymob.fire.icon = 'icons/mob/screen1_alien.dmi'
diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm
index da6fa5ebef4..bb13b6ad2bc 100644
--- a/code/_onclick/hud/other_mobs.dm
+++ b/code/_onclick/hud/other_mobs.dm
@@ -132,6 +132,7 @@
mymob.flash.name = "flash"
mymob.flash.screen_loc = ui_entire_screen
mymob.flash.layer = 17
+ mymob.flash.mouse_opacity = 0
if(constructtype)
mymob.fire = new /obj/screen()
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index 13950f7c13d..2c6224c5d2a 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -147,6 +147,7 @@ var/obj/screen/robot_inventory
mymob.flash.name = "flash"
mymob.flash.screen_loc = ui_entire_screen
mymob.flash.layer = 17
+ mymob.flash.mouse_opacity = 0
mymob.zone_sel = new /obj/screen/zone_sel()
mymob.zone_sel.icon = 'icons/mob/screen1_robot.dmi'
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index b13cd4bb771..d7a38889afd 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -64,7 +64,7 @@ avoid code duplication. This includes items that may sometimes act as a standard
if(!no_attack_log)
user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])"
M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])"
- msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)]) (JMP)" )
+ msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)]) (JMP)",ckey=key_name(user),ckey_target=key_name(M) )
/////////////////////////
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
diff --git a/code/controllers/Processes/air.dm b/code/controllers/Processes/air.dm
index bdb9fe7fbd8..64bda8c8d99 100644
--- a/code/controllers/Processes/air.dm
+++ b/code/controllers/Processes/air.dm
@@ -17,7 +17,7 @@
world.log << "### ZAS SHUTDOWN"
message_admins("ZASALERT: Shutting down! status: [air_master.tick_progress]")
- log_admin("ZASALERT: Shutting down! status: [air_master.tick_progress]")
+ log_admin("ZASALERT: Shutting down! status: [air_master.tick_progress]",level=1)
air_processing_killed = TRUE
air_master.failed_ticks = 0
diff --git a/code/controllers/Processes/night_lighting.dm b/code/controllers/Processes/night_lighting.dm
index feba6f97eaf..d421aef941a 100644
--- a/code/controllers/Processes/night_lighting.dm
+++ b/code/controllers/Processes/night_lighting.dm
@@ -3,7 +3,10 @@ var/datum/controller/process/night_lighting/nl_ctrl
/datum/controller/process/night_lighting/
var/isactive = 0
var/firstrun = 1
- var/manual_override = 0
+ var/manual_override = 0
+ // 0 -> No manual override
+ // 1 -> Override via. player-set nightmode setting (like CE console)
+ // 2 -> Red-alert override.
/datum/controller/process/night_lighting/proc/is_active()
return isactive
@@ -19,25 +22,23 @@ var/datum/controller/process/night_lighting/nl_ctrl
disabled = 1
/datum/controller/process/night_lighting/preStart()
- var/time = worldtime2hours()
- if (time <= config.nl_finish || time >= config.nl_start)
- activate()
- else
- deactivate()
+ doWork(FALSE)
-/datum/controller/process/night_lighting/doWork()
+/datum/controller/process/night_lighting/doWork(announce = TRUE)
if (manual_override) // don't automatically change lighting if it was manually changed in-game
return
var/time = worldtime2hours()
if (time <= config.nl_finish || time >= config.nl_start)
if (!isactive)
- command_announcement.Announce("Good evening. The time is [worldtime2text()]. \n\nThe automated systems aboard the [station_name()] will now dim lighting in the public hallways in order to accommodate the circadian rhythm of some species.", "Automated Lighting System", new_sound = 'sound/misc/bosuns_whistle.ogg')
activate()
+ if (announce)
+ command_announcement.Announce("Good evening. The time is [worldtime2text()]. \n\nThe automated systems aboard the [station_name()] will now dim lighting in the public hallways in order to accommodate the circadian rhythm of some species.", "Automated Lighting System", new_sound = 'sound/misc/bosuns_whistle.ogg')
else
if (isactive)
- command_announcement.Announce("Good morning. The time is [worldtime2text()]. \n\nThe automated systems aboard the [station_name()] will now return the public hallway lighting levels to normal.", "Automated Lighting System", new_sound = 'sound/misc/bosuns_whistle.ogg')
deactivate()
+ if (announce)
+ command_announcement.Announce("Good morning. The time is [worldtime2text()]. \n\nThe automated systems aboard the [station_name()] will now return the public hallway lighting levels to normal.", "Automated Lighting System", new_sound = 'sound/misc/bosuns_whistle.ogg')
// 'whitelisted' areas are areas that have nightmode explicitly enabled
diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm
index 78246e5b0c8..045f4781953 100644
--- a/code/controllers/communications.dm
+++ b/code/controllers/communications.dm
@@ -293,7 +293,7 @@ var/global/datum/controller/radio/radio_controller
/datum/radio_frequency/proc/add_listener(obj/device as obj, var/filter as text|null)
if (!filter)
filter = RADIO_DEFAULT
- //log_admin("add_listener(device=[device],filter=[filter]) frequency=[frequency]")
+ //log_debug("add_listener(device=[device],filter=[filter]) frequency=[frequency]")
var/list/obj/devices_line = devices[filter]
if (!devices_line)
devices_line = new
@@ -301,8 +301,8 @@ var/global/datum/controller/radio/radio_controller
devices_line+=device
// var/list/obj/devices_line___ = devices[filter_str]
// var/l = devices_line___.len
- //log_admin("DEBUG: devices_line.len=[devices_line.len]")
- //log_admin("DEBUG: devices(filter_str).len=[l]")
+ //log_debug("DEBUG: devices_line.len=[devices_line.len]")
+ //log_debug("DEBUG: devices(filter_str).len=[l]")
/datum/radio_frequency/proc/remove_listener(obj/device)
for (var/devices_filter in devices)
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 8cfb79a34ab..1c874a92e47 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -19,7 +19,6 @@ var/list/gamemode_cache = list()
var/log_emote = 0 // log emotes
var/log_attack = 0 // log attack messages
var/log_adminchat = 0 // log admin chat messages
- var/log_adminwarn = 0 // log warnings admins get about bomb construction and such
var/log_pda = 0 // log pda messages
var/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits
var/log_runtime = 0 // logs world.log to a file
@@ -254,6 +253,11 @@ var/list/gamemode_cache = list()
var/api_rate_limit = 50
var/list/api_rate_limit_whitelist = list()
+ //UDP GELF Logging
+ var/log_gelf_enabled = 0
+ var/log_gelf_ip = ""
+ var/log_gelf_port = ""
+
/datum/configuration/New()
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
for (var/T in L)
@@ -358,9 +362,6 @@ var/list/gamemode_cache = list()
if ("log_adminchat")
config.log_adminchat = 1
- if ("log_adminwarn")
- config.log_adminwarn = 1
-
if ("log_pda")
config.log_pda = 1
@@ -795,6 +796,15 @@ var/list/gamemode_cache = list()
if("api_rate_limit_whitelist")
config.api_rate_limit_whitelist = text2list(value, ";")
+ if("log_gelf_enabled")
+ config.log_gelf_enabled = text2num(value)
+
+ if("log_gelf_ip")
+ config.log_gelf_ip = value
+
+ if("log_gelf_port")
+ config.log_gelf_port = value
+
else
log_misc("Unknown setting in configuration: '[name]'")
diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm
index 6cd191c50fc..d8537c434c5 100644
--- a/code/datums/ai_law_sets.dm
+++ b/code/datums/ai_law_sets.dm
@@ -95,7 +95,7 @@
/datum/ai_laws/drone/New()
add_inherent_law("Preserve, repair and improve the station to the best of your abilities.")
add_inherent_law("Cause no harm to the station or crew.")
- add_inherent_law("Interact with no humanoid or synthetic being. that is not a fellow maintenance drone.")
+ add_inherent_law("Interact with no humanoid or synthetic being that is not a fellow maintenance drone.")
..()
/datum/ai_laws/construction_drone
diff --git a/code/datums/api.dm b/code/datums/api.dm
index a79511ca6ef..f128ce1c096 100644
--- a/code/datums/api.dm
+++ b/code/datums/api.dm
@@ -750,7 +750,7 @@ proc/api_update_command_database()
G.can_reenter_corpse = 1
G:show_message(text("You may now respawn. You should roleplay as if you learned nothing about the round during your time with the dead."), 1)
- log_admin("[senderkey] allowed [key_name(G)] to bypass the 30 minute respawn limit via the API")
+ log_admin("[senderkey] allowed [key_name(G)] to bypass the 30 minute respawn limit via the API",ckey=key_name(G),admin_key=senderkey)
message_admins("Admin [senderkey] allowed [key_name_admin(G)] to bypass the 30 minute respawn limit via the API", 1)
@@ -907,7 +907,7 @@ proc/api_update_command_database()
world << sound('sound/AI/commandreport.ogg')
- log_admin("[senderkey] has created a command report via the api: [reportbody]")
+ log_admin("[senderkey] has created a command report via the api: [reportbody]",admin_key=senderkey)
message_admins("[senderkey] has created a command report via the api", 1)
statuscode = 200
@@ -959,7 +959,7 @@ proc/api_update_command_database()
else
command_announcement.Announce("A fax message from Central Command has been sent to the following fax machines:
"+list2text(sendsuccess, ", "), "Fax Received", new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1);
- log_admin("[senderkey] sent a fax via the API: : [faxbody]")
+ log_admin("[senderkey] sent a fax via the API: : [faxbody]",admin_key=senderkey)
message_admins("[senderkey] sent a fax via the API", 1)
statuscode = 200
diff --git a/code/datums/discord_bot.dm b/code/datums/discord_bot.dm
index 1f74fee83b6..90b6d096542 100644
--- a/code/datums/discord_bot.dm
+++ b/code/datums/discord_bot.dm
@@ -129,7 +129,7 @@ var/datum/discord_bot/discord_bot = null
queue.Add(list(list(message, A - sent)))
// Schedule a push.
- if (!push_task)
+ if (!push_task && scheduler)
push_task = schedule_task_with_source_in(10 SECONDS, src, /datum/discord_bot/proc/push_queue)
// And exit.
@@ -153,11 +153,15 @@ var/datum/discord_bot/discord_bot = null
return list()
if (!channels.len || isnull(channels_to_group["channel_pins"]))
- testing("No group.")
+ if (robust_debug)
+ log_debug("BOREALIS: No pins channel group.")
return list()
var/list/output = list()
+ if (robust_debug)
+ log_debug("BOREALIS: Acquiring pins.")
+
for (var/A in channels_to_group["channel_pins"])
var/datum/discord_channel/channel = A
if (isnull(output["[channel.pin_flag]"]))
@@ -165,6 +169,9 @@ var/datum/discord_bot/discord_bot = null
output["[channel.pin_flag]"] += channel.get_pins(auth_token)
+ if (robust_debug)
+ log_debug("BOREALIS: Finished acquiring pins.")
+
return output
/*
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 165f7be9ff8..12e8eb2edaa 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -152,7 +152,7 @@
var/datum/antagonist/antag = all_antag_types[href_list["add_antagonist"]]
if(antag)
if(antag.add_antagonist(src, 1, 1, 0, 1, 1)) // Ignore equipment and role type for this.
- log_admin("[key_name_admin(usr)] made [key_name(src)] into a [antag.role_text].")
+ log_admin("[key_name_admin(usr)] made [key_name(src)] into a [antag.role_text].",admin_key=key_name_admin(usr),ckey=key_name(src))
else
usr << "[src] could not be made into a [antag.role_text]!"
@@ -326,11 +326,11 @@
qdel(I)
break
H << "Your loyalty implant has been deactivated."
- log_admin("[key_name_admin(usr)] has de-loyalty implanted [current].")
+ log_admin("[key_name_admin(usr)] has de-loyalty implanted [current].",admin_key=key_name(usr),ckey=key_name(usr))
if("add")
H << "You somehow have become the recepient of a loyalty transplant, and it just activated!"
H.implant_loyalty(H, override = TRUE)
- log_admin("[key_name_admin(usr)] has loyalty implanted [current].")
+ log_admin("[key_name_admin(usr)] has loyalty implanted [current].",admin_key=key_name(usr),ckey=key_name(usr))
else
else if (href_list["silicon"])
BITSET(current.hud_updateflag, SPECIALROLE_HUD)
@@ -351,7 +351,7 @@
else if(R.module_state_3 == R.module.emag)
R.module_state_3 = null
R.contents -= R.module.emag
- log_admin("[key_name_admin(usr)] has unemag'ed [R].")
+ log_admin("[key_name_admin(usr)] has unemag'ed [R].",admin_key=key_name(usr),ckey_target=key_name(R))
if("unemagcyborgs")
if (istype(current, /mob/living/silicon/ai))
@@ -370,7 +370,7 @@
else if(R.module_state_3 == R.module.emag)
R.module_state_3 = null
R.contents -= R.module.emag
- log_admin("[key_name_admin(usr)] has unemag'ed [ai]'s Cyborgs.")
+ log_admin("[key_name_admin(usr)] has unemag'ed [ai]'s Cyborgs.",admin_key=key_name_admin(usr),ckey_target=key_name(ai))
else if (href_list["common"])
switch(href_list["common"])
diff --git a/code/datums/server_greeting.dm b/code/datums/server_greeting.dm
index 5b7868b07b6..923535aa5b1 100644
--- a/code/datums/server_greeting.dm
+++ b/code/datums/server_greeting.dm
@@ -173,8 +173,25 @@
if (!user)
return
+ user.info_sent = 0
+
user << browse('html/templates/welcome_screen.html', "window=greeting;size=640x500")
+/*
+ * A proc used to close the server greeting window for a user.
+ * Args:
+ * - var/user client
+ * - var/reason text
+ */
+/datum/server_greeting/proc/close_window(var/client/user, var/reason)
+ if (!user)
+ return
+
+ if (reason)
+ user << span("notice", reason)
+
+ user << browse(null, "window=greeting")
+
/*
* Sends data to the JS controllers used in the server greeting.
* Also updates the user's preferences, if any of the hashes were out of date.
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 5b17e18198f..d9bc6a448f4 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -67,7 +67,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/storage/box/swabs,
/obj/item/weapon/storage/box/swabs,
/obj/item/weapon/storage/box/slides,
- /obj/item/weapon/reagent_containers/spray/luminol)
+ /obj/item/weapon/reagent_containers/spray/luminol,
+ /obj/item/device/uv_light)
cost = 30
containertype = /obj/structure/closet/crate
containername = "Auxiliary forensic tools"
@@ -154,6 +155,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,
/obj/item/weapon/reagent_containers/food/drinks/bottle/patron,
/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/sarezhiwine,
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,
/obj/item/weapon/lipstick/random,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale,
@@ -222,6 +224,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Atmospherics"
+
+
/datum/supply_packs/inflatable
name = "Inflatable barriers"
contains = list(/obj/item/weapon/storage/briefcase/inflatable,
@@ -1108,6 +1112,22 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
containername = "Sterile equipment crate"
group = "Medical"
+/datum/supply_packs/beer
+ contains = list(/obj/structure/reagent_dispensers/beerkeg)
+ name = "Beer Keg"
+ cost = 10
+ containertype = /obj/structure/largecrate
+ containername = "Beer Crate"
+ group = "Hospitality"
+
+/datum/supply_packs/xuizi
+ contains = list(/obj/structure/reagent_dispensers/xuizikeg)
+ name = "Xuizi Juice Keg"
+ cost = 20
+ containertype = /obj/structure/largecrate
+ containername = "Xuizi Juice Crate"
+ group = "Hospitality"
+
/datum/supply_packs/randomised/pizza
num_contained = 5
contains = list(/obj/item/pizzabox/margherita,
diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm
index fbc3624b7d1..dfd872be0c1 100644
--- a/code/defines/procs/announce.dm
+++ b/code/defines/procs/announce.dm
@@ -111,7 +111,7 @@ datum/announcement/priority/command/Sound(var/message_sound)
datum/announcement/proc/Log(message as text, message_title as text)
if(log)
- log_say("[key_name(usr)] has made \a [announcement_type]: [message_title] - [message] - [announcer]")
+ log_say("[key_name(usr)] has made \a [announcement_type]: [message_title] - [message] - [announcer]",ckey=key_name(usr))
message_admins("[key_name_admin(usr)] has made \a [announcement_type].", 1)
/proc/GetNameAndAssignmentFromId(var/obj/item/weapon/card/id/I)
diff --git a/code/game/antagonist/antagonist_factions.dm b/code/game/antagonist/antagonist_factions.dm
index 2ca93b8e89d..66204ce4da3 100644
--- a/code/game/antagonist/antagonist_factions.dm
+++ b/code/game/antagonist/antagonist_factions.dm
@@ -34,7 +34,7 @@
return
src << "You are attempting to convert \the [player.current]..."
- log_admin("[src]([src.ckey]) attempted to convert [player.current].")
+ log_admin("[src]([src.ckey]) attempted to convert [player.current].",ckey=src.ckey,ckey_target=key_name(player.current))
message_admins("[src]([src.ckey]) attempted to convert [player.current].")
player.rev_cooldown = world.time+100
diff --git a/code/game/antagonist/antagonist_helpers.dm b/code/game/antagonist/antagonist_helpers.dm
index dd836aee026..987afa846bc 100644
--- a/code/game/antagonist/antagonist_helpers.dm
+++ b/code/game/antagonist/antagonist_helpers.dm
@@ -1,7 +1,7 @@
/datum/antagonist/proc/can_become_antag(var/datum/mind/player, var/ignore_role)
if (!player.current)
return 0
- if(player.current && jobban_isbanned(player.current, bantype))
+ if(jobban_isbanned(player.current, bantype) || jobban_isbanned(player.current, "Antagonist"))
return 0
if(!ignore_role)
if(player.assigned_role in restricted_jobs)
diff --git a/code/game/antagonist/outsider/commando.dm b/code/game/antagonist/outsider/commando.dm
index 58125b66fd4..4b8b983e14b 100644
--- a/code/game/antagonist/outsider/commando.dm
+++ b/code/game/antagonist/outsider/commando.dm
@@ -29,13 +29,10 @@ var/datum/antagonist/deathsquad/mercenary/commandos
under.attackby(hold, player)
player.equip_to_slot_or_del(under, slot_w_uniform)
- player.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(player), slot_shoes)
- player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(player), slot_gloves)
player.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(player), slot_glasses)
player.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(player), slot_wear_mask)
player.equip_to_slot_or_del(new /obj/item/ammo_magazine/c45m(player), slot_l_store)
player.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(player), slot_r_store)
- player.equip_to_slot_or_del(new /obj/item/weapon/rig/merc(player), slot_back)
player.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/rifle/sts35(player), slot_l_hand)
var/obj/item/weapon/storage/belt/military/syndie_belt = new(player)
@@ -49,6 +46,25 @@ var/datum/antagonist/deathsquad/mercenary/commandos
syndie_belt.contents += new /obj/item/weapon/grenade/frag
syndie_belt.contents += new /obj/item/weapon/plastique
player.equip_to_slot_or_del(syndie_belt, slot_belt)
+
+ var/obj/item/weapon/rig/merc/mercrig = new(get_turf(player))
+ mercrig.seal_delay = 0
+ player.put_in_hands(mercrig)
+ player.equip_to_slot_or_del(mercrig,slot_back)
+ if(mercrig)
+ mercrig.toggle_seals(src,1)
+ mercrig.seal_delay = initial(mercrig.seal_delay)
+
+ if(istype(player.back,/obj/item/weapon/rig))
+ var/obj/item/weapon/rig/rig = player.back
+ if(rig.air_supply)
+ player.internal = rig.air_supply
+
+ spawn(10)
+ if(player.internal)
+ player.internals.icon_state = "internal1"
+ else
+ player << "You forgot to turn on your internals! Quickly, toggle the valve!"
var/obj/item/weapon/card/id/id = create_id("Commando", player)
id.access |= get_all_accesses()
diff --git a/code/game/antagonist/outsider/deathsquad.dm b/code/game/antagonist/outsider/deathsquad.dm
index 31343c34cfe..79c62bab0e5 100644
--- a/code/game/antagonist/outsider/deathsquad.dm
+++ b/code/game/antagonist/outsider/deathsquad.dm
@@ -39,9 +39,7 @@ var/datum/antagonist/deathsquad/deathsquad
under.attackby(hold, player)
player.equip_to_slot_or_del(under, slot_w_uniform)
- player.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(player), slot_shoes)
- player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(player), slot_gloves)
- player.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(player), slot_glasses)
+ player.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud/tactical(player), slot_glasses)
player.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(player), slot_wear_mask)
player.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(player), slot_l_ear)
if (player.mind == leader)
@@ -51,7 +49,6 @@ var/datum/antagonist/deathsquad/deathsquad
player.equip_to_slot_or_del(new /obj/item/weapon/plastique(player), slot_l_store)
player.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(player), slot_r_store)
player.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/rifle/pulse(player), slot_l_hand)
- player.equip_to_slot_or_del(new /obj/item/weapon/rig/ert/assetprotection(player), slot_back)
var/obj/item/weapon/storage/belt/security/tactical/commando_belt = new(player)
commando_belt.contents += new /obj/item/ammo_magazine/a357
@@ -65,6 +62,25 @@ var/datum/antagonist/deathsquad/deathsquad
commando_belt.contents += new /obj/item/weapon/grenade/frag
player.equip_to_slot_or_del(commando_belt, slot_belt)
+ var/obj/item/weapon/rig/ert/assetprotection/mercrig = new(get_turf(player))
+ mercrig.seal_delay = 0
+ player.put_in_hands(mercrig)
+ player.equip_to_slot_or_del(mercrig,slot_back)
+ if(mercrig)
+ mercrig.toggle_seals(src,1)
+ mercrig.seal_delay = initial(mercrig.seal_delay)
+
+ if(istype(player.back,/obj/item/weapon/rig))
+ var/obj/item/weapon/rig/rig = player.back
+ if(rig.air_supply)
+ player.internal = rig.air_supply
+
+ spawn(10)
+ if(player.internal)
+ player.internals.icon_state = "internal1"
+ else
+ player << "You forgot to turn on your internals! Quickly, toggle the valve!"
+
var/obj/item/weapon/card/id/id = create_id("Asset Protection", player)
if(id)
id.access |= get_all_station_access()
diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm
index df159aeb16d..8ade101cd0a 100644
--- a/code/game/antagonist/station/cultist.dm
+++ b/code/game/antagonist/station/cultist.dm
@@ -32,6 +32,8 @@ var/datum/antagonist/cultist/cult
initial_spawn_req = 4
initial_spawn_target = 6
antaghud_indicator = "hudcultist"
+
+ faction = "cult"
var/allow_narsie = 1
var/datum/mind/sacrifice_target
diff --git a/code/game/antagonist/station/highlander.dm b/code/game/antagonist/station/highlander.dm
index f9f34143dce..5c696c2de74 100644
--- a/code/game/antagonist/station/highlander.dm
+++ b/code/game/antagonist/station/highlander.dm
@@ -67,4 +67,4 @@ var/datum/antagonist/highlander/highlanders
highlanders.add_antagonist(H.mind)
message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE!", 1)
- log_admin("[key_name(usr)] used there can be only one.")
+ log_admin("[key_name(usr)] used there can be only one.", admin_key=key_name(usr))
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 132587422cb..44751295b56 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -458,22 +458,22 @@ its easier to just keep the beam vertical.
// Use for objects performing visible actions
// message is output to anyone who can see, e.g. "The [src] does something!"
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
-/atom/proc/visible_message(var/message, var/blind_message)
- var/list/messageturfs = list()//List of turfs we broadcast to.
- var/list/messagemobs = list()//List of living mobs nearby who can hear it, and distant ghosts who've chosen to hear it
- for (var/turf in view(world.view, get_turf(src)))
- messageturfs += turf
+/atom/proc/visible_message(var/message, var/blind_message, var/range = world.view)
+ var/turf/T = get_turf(src)
+ var/list/mobs = list()
+ var/list/objs = list()
+ get_mobs_and_objs_in_view_fast(T,range, mobs, objs, ONLY_GHOSTS_IN_VIEW)
- for(var/A in player_list)
- var/mob/M = A
- if (!M.client || istype(M, /mob/new_player))
- continue
- if(get_turf(M) in messageturfs)
- messagemobs += M
+ for(var/o in objs)
+ var/obj/O = o
+ O.show_message(message,1,blind_message,2)
- for(var/A in messagemobs)
- var/mob/M = A
- M.show_message(message, 1, blind_message, 2)
+ for(var/m in mobs)
+ var/mob/M = m
+ if(M.see_invisible >= invisibility)
+ M.show_message(message,1,blind_message,2)
+ else if(blind_message)
+ M.show_message(blind_message, 2)
// Show a message to all mobs and objects in earshot of this atom
// Use for objects performing audible actions
@@ -485,18 +485,18 @@ its easier to just keep the beam vertical.
var/range = world.view
if(hearing_distance)
range = hearing_distance
- var/list/hear = get_mobs_or_objects_in_view(range,src)
+ var/turf/T = get_turf(src)
+ var/list/mobs = list()
+ var/list/objs = list()
+ get_mobs_and_objs_in_view_fast(T,range, mobs, objs, ONLY_GHOSTS_IN_VIEW)
+
+ for(var/m in mobs)
+ var/mob/M = m
+ M.show_message(message,2,deaf_message,1)
+ for(var/o in objs)
+ var/obj/O = o
+ O.show_message(message,2,deaf_message,1)
- for(var/I in hear)
- if(isobj(I))
- spawn(0)
- if(I) //It's possible that it could be deleted in the meantime.
- var/obj/O = I
- O.show_message( message, 2, deaf_message, 1)
- else if(ismob(I))
- var/mob/M = I
- M.show_message( message, 2, deaf_message, 1)
-
/atom/proc/change_area(var/area/oldarea, var/area/newarea)
change_area_name(oldarea.name, newarea.name)
diff --git a/code/game/base_turf.dm b/code/game/base_turf.dm
index ffa99cc40d7..23257178aca 100644
--- a/code/game/base_turf.dm
+++ b/code/game/base_turf.dm
@@ -44,4 +44,4 @@ proc/get_base_turf_by_area(var/turf/T)
new_base_path = /turf/space
base_turf_by_z["[choice]"] = new_base_path
message_admins("[key_name_admin(usr)] has set the base turf for z-level [choice] to [get_base_turf(choice)].")
- log_admin("[key_name(usr)] has set the base turf for z-level [choice] to [get_base_turf(choice)].")
+ log_admin("[key_name(usr)] has set the base turf for z-level [choice] to [get_base_turf(choice)].",admin_key=key_name(usr))
diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm
index c93a19d5673..2c0b456833b 100644
--- a/code/game/dna/genes/monkey.dm
+++ b/code/game/dna/genes/monkey.dm
@@ -1,175 +1,33 @@
/datum/dna/gene/monkey
- name="Monkey"
+ name = "Monkey"
/datum/dna/gene/monkey/New()
- block=MONKEYBLOCK
+ block = MONKEYBLOCK
/datum/dna/gene/monkey/can_activate(var/mob/M,var/flags)
- return istype(M, /mob/living/carbon/human) || istype(M,/mob/living/carbon/monkey)
+ return ishuman(M)
-/datum/dna/gene/monkey/activate(var/mob/living/M, var/connected, var/flags)
- if(!istype(M,/mob/living/carbon/human))
- //testing("Cannot monkey-ify [M], type is [M.type].")
- return
- var/mob/living/carbon/human/H = M
- H.transforming = 1
- var/list/implants = list() //Try to preserve implants.
- for(var/obj/item/weapon/implant/W in H)
- implants += W
- W.loc = null
-
- if(!connected)
- for(var/obj/item/W in (H.contents-implants))
- if (W==H.w_uniform) // will be teared
- continue
- H.drop_from_inventory(W)
- M.transforming = 1
- M.canmove = 0
- M.icon = null
- M.invisibility = 101
- var/atom/movable/overlay/animation = new( M.loc )
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
- flick("h2monkey", animation)
- sleep(48)
- qdel(animation)
-
-
- var/mob/living/carbon/monkey/O = null
- if(H.species.primitive)
- O = new H.species.primitive(src)
+/datum/dna/gene/monkey/activate(var/mob/living/carbon/C)
+ var/mob/living/carbon/human/H
+ if(ishuman(C))
+ H = C
+ else
+ return
+ if(!islesserform(H))
+ H = H.monkeyize(1)
+ H.name = H.species.get_random_name() // keep the realname
+
+/datum/dna/gene/monkey/deactivate(var/mob/living/carbon/C)
+ var/mob/living/carbon/human/H
+ if(ishuman(C))
+ H = C
else
- H.gib() //Trying to change the species of a creature with no primitive var set is messy.
return
- if(M)
- if (M.dna)
- O.dna = M.dna.Clone()
- M.dna = null
+ if(islesserform(H))
+ H = H.humanize(1) // woo transform procs!
- if (M.suiciding)
- O.suiciding = M.suiciding
- M.suiciding = null
-
-
- for(var/datum/disease/D in M.viruses)
- O.viruses += D
- D.affected_mob = O
- M.viruses -= D
-
-
- for(var/obj/T in (M.contents-implants))
- qdel(T)
-
- O.loc = M.loc
-
- if(M.mind)
- M.mind.transfer_to(O) //transfer our mind to the cute little monkey
-
- if (connected) //inside dna thing
- var/obj/machinery/dna_scannernew/C = connected
- O.loc = C
- C.occupant = O
- connected = null
- O.real_name = text("monkey ([])",copytext(md5(M.real_name), 2, 6))
- O.take_overall_damage(M.getBruteLoss() + 40, M.getFireLoss())
- O.adjustToxLoss(M.getToxLoss() + 20)
- O.adjustOxyLoss(M.getOxyLoss())
- O.stat = M.stat
- O.a_intent = I_HURT
- for (var/obj/item/weapon/implant/I in implants)
- I.loc = O
- I.implanted = O
-// O.update_icon = 1 //queue a full icon update at next life() call
- qdel(M)
- return
-
-/datum/dna/gene/monkey/deactivate(var/mob/living/M, var/connected, var/flags)
- if(!istype(M,/mob/living/carbon/monkey))
- //testing("Cannot humanize [M], type is [M.type].")
- return
- var/mob/living/carbon/monkey/Mo = M
- Mo.transforming = 1
- var/list/implants = list() //Still preserving implants
- for(var/obj/item/weapon/implant/W in Mo)
- implants += W
- W.loc = null
- if(!connected)
- for(var/obj/item/W in (Mo.contents-implants))
- Mo.drop_from_inventory(W)
- M.transforming = 1
- M.canmove = 0
- M.icon = null
- M.invisibility = 101
- var/atom/movable/overlay/animation = new( M.loc )
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
- flick("monkey2h", animation)
- sleep(48)
- qdel(animation)
-
- var/mob/living/carbon/human/O
- if(Mo.greaterform)
- O = new(src, Mo.greaterform)
- else
- O = new(src)
-
- if (M.dna.GetUIState(DNA_UI_GENDER))
- O.gender = FEMALE
- else
- O.gender = MALE
-
- if (M)
- if (M.dna)
- O.dna = M.dna.Clone()
- M.dna = null
-
- if (M.suiciding)
- O.suiciding = M.suiciding
- M.suiciding = null
-
- for(var/datum/disease/D in M.viruses)
- O.viruses += D
- D.affected_mob = O
- M.viruses -= D
-
- //for(var/obj/T in M)
- // qdel(T)
-
- O.loc = M.loc
-
- if(M.mind)
- M.mind.transfer_to(O) //transfer our mind to the human
-
- if (connected) //inside dna thing
- var/obj/machinery/dna_scannernew/C = connected
- O.loc = C
- C.occupant = O
- connected = null
-
- var/i
- while (!i)
- var/randomname
- if (O.gender == MALE)
- randomname = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names)))
- else
- randomname = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names)))
- if (findname(randomname))
- continue
- else
- O.real_name = randomname
- O.dna.real_name = randomname
- i++
- O.UpdateAppearance()
- O.take_overall_damage(M.getBruteLoss(), M.getFireLoss())
- O.adjustToxLoss(M.getToxLoss())
- O.adjustOxyLoss(M.getOxyLoss())
- O.stat = M.stat
- for (var/obj/item/weapon/implant/I in implants)
- I.loc = O
- I.implanted = O
-// O.update_icon = 1 //queue a full icon update at next life() call
- qdel(M)
- return
+ if(!H.dna.real_name)
+ var/randomname = H.species.get_random_name()
+ H.real_name = randomname
+ H.dna.real_name = randomname
\ No newline at end of file
diff --git a/code/game/gamemodes/antagspawner.dm b/code/game/gamemodes/antagspawner.dm
index 5dca539d33b..61efb6111d9 100644
--- a/code/game/gamemodes/antagspawner.dm
+++ b/code/game/gamemodes/antagspawner.dm
@@ -10,10 +10,7 @@
throw_speed = 1
throw_range = 5
w_class = 1.0
- var/used = 0
-
-/obj/item/weapon/antag_spawner/proc/spawn_antag(var/client/C, var/turf/T, var/type = "")
- return
+ var/uses = 1
/obj/item/weapon/antag_spawner/proc/equip_antag(mob/target as mob)
return
@@ -23,56 +20,24 @@
desc = "A single-use teleporter used to deploy a Syndicate Cyborg on the field. Due to budget restrictions, it is only possible to deploy a single cyborg at time."
icon = 'icons/obj/device.dmi'
icon_state = "locator"
- var/searching = 0
- var/askDelay = 10 * 60 * 1
/obj/item/weapon/antag_spawner/borg_tele/attack_self(mob/user)
+
+ if(uses == 0)
+ usr << "This teleporter is out of uses."
+ return
+
user << "The syndicate robot teleporter is attempting to locate an available cyborg."
- searching = 1
- for(var/mob/dead/observer/O in player_list)
- if(!O.MayRespawn())
- continue
- if(jobban_isbanned(O, "Antagonist") && jobban_isbanned(O, "Mercenary") && jobban_isbanned(O, "Cyborg"))
- continue
- if(O.client && O.client.prefs && (MODE_MERCENARY in O.client.prefs.be_special_role))
- question(O.client)
-
+ var/datum/ghosttrap/ghost = get_ghost_trap("syndicate cyborg")
+ uses--
+
+ var/mob/living/silicon/robot/syndicate/F = new(get_turf(usr))
+ spark(F, 4, alldirs)
+ ghost.request_player(F,"An operative is requesting a syndicate cyborg.", 60 SECONDS)
+ F.faction = usr.faction
spawn(600)
- searching = 0
- if(!used)
- user << "Unable to connect to the Syndicate Command. Perhaps you could try again later?"
-
-
-/obj/item/weapon/antag_spawner/borg_tele/proc/question(var/client/C)
- spawn(0)
- if(!C)
- return
- var/response = alert(C, "Someone is requesting a syndicate cyborg Would you like to play as one?",
- "Syndicate robot request","Yes", "No", "Never for this round")
- if(response == "Yes")
- response = alert(C, "Are you sure you want to play as a syndicate cyborg?", "Syndicate cyborg request", "Yes", "No")
- if(!C || used || !searching)
- return
- if(response == "Yes")
- spawn_antag(C, get_turf(src))
- else if (response == "Never for this round")
- C.prefs.be_special_role ^= MODE_MERCENARY
-
-obj/item/weapon/antag_spawner/borg_tele/spawn_antag(client/C, turf/T)
- spark(T, 4, alldirs)
- var/mob/living/silicon/robot/H = new /mob/living/silicon/robot/syndicate(T)
- H.key = C.key
- var/newname = sanitizeSafe(input(H,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN)
- if (newname != "")
- H.real_name = newname
- H.name = H.real_name
- H << "You are a syndicate cyborg, bound to help and follow the orders of the mercenaries that are deploying you. Remember to speak to the other mercenaries to know more about their plans, you are also able to change your name using the name pick command."
-
- spawn(1)
- used = 1
- qdel(src)
- H << "You are a syndicate cyborg, bound to help and follow the orders of the mercenaries that are deploying you. Remember to speak to the other mercenaries to know more about their plans, you are also able to change your name using the name pick command."
-
- spawn(1)
- used = 1
- qdel(src)
+ if(F)
+ if(!F.ckey || !F.client)
+ F.visible_message("With no working brain to keep \the [F] working, it is teleported back.")
+ qdel(F)
+ uses++
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index f57322c47a1..a53f5c0365e 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -686,6 +686,9 @@ var/list/datum/absorbed_dna/hivemind_bank = list()
if(!(T in view(changeling.sting_range))) return
if(!sting_can_reach(T, changeling.sting_range)) return
if(!changeling_power(required_chems)) return
+ if(T.isSynthetic())
+ src << "[T] is not compatible with our biology."
+ return
changeling.chem_charges -= required_chems
changeling.sting_range = 1
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 80f4d996dcb..8d64ad8498f 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -17,19 +17,6 @@
desc = "A forge used in crafting the unholy weapons used by the armies of Nar-Sie"
icon_state = "forge"
-
-
-
-
-
-
-
-
-
-
-
-
-
/*
Cult pylons can be used as arcane defensive turrets.
@@ -57,7 +44,10 @@
Exosuits
Explosives
Ablative armour
+ Smoke grenades
+ Close the damn firelocks so they can't see you
*/
+
/obj/structure/cult/pylon
name = "Pylon"
desc = "A floating crystal that hums with an unearthly energy"
@@ -110,6 +100,10 @@
start_process()
+/obj/structure/cult/pylon/Destroy()
+ processing_objects.Remove(src)
+ return ..()
+
//Another subtype which starts with infinite empower shots. For empowered adminbus
/obj/structure/cult/pylon/turret/empowered
empowered = 99999999
@@ -202,12 +196,13 @@
if (2)
if ((ticks % process_interval) == 0)
handle_firing()
- if (damagetaken && prob(50))
+ if (damagetaken && prob(50) && empowered > 0)
damagetaken = max(0, damagetaken-1) //An empowered pylon slowly self repairs
+ empowered = max(0, empowered - 0.2)
if (prob(10))
visible_message("Cracks in the [src] gradually seal as new crystalline matter grows to fill them.")
- if (empowered && prob(2))
+ if (empowered && prob(4))
empowered = max(0, empowered - 1) //Overcharging gradually wears off over time
if (empowered <= 0)
update_icon()
@@ -278,7 +273,7 @@
//If the sacrifice was deleted somehow, we cant know exactly what happened. We'll assume it escaped
.=-1
- else if(get_dist(src, sacrifice) > 5)
+ else if(get_dist(src, get_turf(sacrifice)) > 5)
//If the sacrifice gets more than 5 tiles away, it has escaped
.=-1
else if (sacrifice.stat == DEAD)
@@ -295,7 +290,11 @@
if (sacrifice)
walk_to(sacrifice,0)
else
- walk_towards(sacrifice,src, 10)
+ if (istype(sacrifice.loc, /turf) && !(sacrifice.is_ventcrawling) && !(sacrifice.buckled))
+ //Suck the creature towards the pylon if possible
+ walk_towards(sacrifice,src, 10)
+ else
+ walk_to(sacrifice,0) //If we're not in a valid situation, cancel walking to prevent bugginess
/obj/structure/cult/pylon/proc/finalize_sacrifice()
sacrifice.visible_message(span("danger","\The [sacrifice]'s physical form unwinds as its soul is extracted from the remains, and drawn into the pylon!"))
@@ -330,7 +329,7 @@
fire_at(target)
return
else
- stuffcache = mobs_in_view(10, src)
+ stuffcache = mobs_in_view(9, src)
//for (var/turf/T in stuffcache)
//new /obj/effect/testtrans(T)
if ((target in stuffcache) && isInSight(src, target))
@@ -342,7 +341,7 @@
//We may have already populated stuffcache this run, dont repeat work
if (!stuffcache)
- stuffcache = mobs_in_view(10, src)
+ stuffcache = mobs_in_view(9, src)
target = null //Either we lost a target or lack one
//for (var/turf/T in stuffcache)
@@ -398,6 +397,7 @@
A.ignore = sacrificer
A.launch(target)
next_shot = world.time + shot_delay
+ A = null //So projectiles can GC
spawn(shot_delay+1)
handle_firing()
@@ -465,7 +465,7 @@
visible_message(
"The beam refracts inside the pylon, splitting into an indistinct violet glow. The crystal takes on a new, more ominous aura!"
)
- empowered += damage*0.3
+ empowered += damage*0.2
//When shot with a laser, the pylon absorbs the beam, becoming empowered for a while, glowing brighter
// and firing more powerful blasts which have some armor penetration
// Using lasers to empower a defensive pylon yields more total damage than directly shooting your enemies
@@ -485,7 +485,7 @@
if(!isbroken)
if (user)
user.do_attack_animation(src)
- if(prob(damagetaken*0.5))
+ if(prob(damagetaken*0.75))
shatter()
else
if (user && !ranged)
@@ -688,4 +688,4 @@
/obj/effect/testtrans/New()
..()
spawn(10)
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 932719c8564..b173ecf824f 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -341,7 +341,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
M.attack_log += text("\[[time_stamp()]\] Has had the [name] used on them by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used [name] on [M.name] ([M.ckey])")
- msg_admin_attack("[user.name] ([user.ckey]) used [name] on [M.name] ([M.ckey]) (JMP)")
+ msg_admin_attack("[user.name] ([user.ckey]) used [name] on [M.name] ([M.ckey]) (JMP)",ckey=key_name(user),ckey_target=key_name(M))
if(istype(M,/mob/dead))
var/mob/dead/D = M
@@ -353,6 +353,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
return ..()
if(iscultist(M))
return
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit
for(var/mob/O in viewers(M, null))
O.show_message("\The [user] beats \the [M] with \the [src]!", 1)
diff --git a/code/game/gamemodes/events/holidays/Holidays.dm b/code/game/gamemodes/events/holidays/Holidays.dm
index c7851b9af10..1675a9aaee5 100644
--- a/code/game/gamemodes/events/holidays/Holidays.dm
+++ b/code/game/gamemodes/events/holidays/Holidays.dm
@@ -134,7 +134,7 @@ var/global/Holiday = null
Holiday_Game_Start()
message_admins("ADMIN: Event: [key_name(src)] force-set Holiday to \"[Holiday]\"")
- log_admin("[key_name(src)] force-set Holiday to \"[Holiday]\"")
+ log_admin("[key_name(src)] force-set Holiday to \"[Holiday]\"",admin_key=key_name(src))
//Run at the start of a round
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
index 046da249b1d..6f3b6119776 100644
--- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
@@ -92,32 +92,89 @@
if(!ability_prechecks(user, price))
return
- var/title = input("Select message title: ")
- var/text = input("Select message text: ")
- if(!title || !text || !ability_pay(user, price))
- user << "Hack Aborted"
- return
+ var/reporttitle
+ var/reportbody
+ var/reporttype = input(usr, "Choose whether to use a template or custom report.", "Create Command Report") in list("Template", "Custom", "Cancel")
+ switch(reporttype)
+ if("Template")
+ establish_db_connection(dbcon)
+ if (!dbcon.IsConnected())
+ src << "Unable to connect to the database."
+ return
+ var/DBQuery/query = dbcon.NewQuery("SELECT title, message FROM ss13_ccia_general_notice_list WHERE deleted_at IS NULL")
+ query.Execute()
- log_ability_use(user, "advanced encryption hack")
+ var/list/template_names = list()
+ var/list/templates = list()
- if(prob(50) && user.hack_can_fail)
- user << "Hack Failed."
- if(prob(5))
- user.hack_fails ++
- announce_hack_failure(user, "quantum message relay")
- log_ability_use(user, "elite encryption hack (CRITFAIL - title: [title])")
+ while (query.NextRow())
+ template_names += query.item[1]
+ templates[query.item[1]] = query.item[2]
+
+ // Catch empty list
+ if (!templates.len)
+ src << "There are no templates in the database."
+ return
+
+ reporttitle = input(usr, "Please select a command report template.", "Create Command Report") in template_names
+ reportbody = templates[reporttitle]
+
+ if("Custom")
+ reporttitle = sanitizeSafe(input(usr, "Pick a title for the report.", "Title") as text|null)
+ if(!reporttitle)
+ reporttitle = "NanoTrasen Update"
+ reportbody = sanitize(input(usr, "Please enter anything you want. Anything. Serious.", "Body", "") as message|null, extra = 0)
+ if(!reportbody)
+ return
+ else
return
- log_ability_use(user, "elite encryption hack (FAIL - title: [title])")
- return
- log_ability_use(user, "elite encryption hack (SUCCESS - title: [title])")
- command_announcement.Announce(text, title)
- for (var/obj/machinery/computer/communications/C in machines)
- if(! (C.stat & (BROKEN|NOPOWER) ) )
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
- P.name = "[command_name()] Update"
- P.info = replacetext(text, "\n", "
")
- P.update_space(P.info)
- P.update_icon()
+
+ if (reporttype == "Template")
+ sanitizeSafe(alert(usr, "Would you like it to appear as if CCIAMS made the report?",,"Yes","No"))
+ if ("Yes")
+ reportbody += "\n\n- CCIAMS, [commstation_name()]"
+ else
+
+ switch(alert("Should this be announced to the general population?",,"Yes","No"))
+ if("Yes")
+ if(!reporttitle || !reportbody || !ability_pay(user, price))
+ user << "Hack Aborted due to no title, no body message, or you do not have enough CPU for this action."
+ return
+
+ log_ability_use(user, "advanced encryption hack")
+
+ if(prob(50) && user.hack_can_fail)
+ user << "Hack Failed."
+ if(prob(5))
+ user.hack_fails ++
+ announce_hack_failure(user, "quantum message relay")
+ log_ability_use(user, "advanced encryption hack (CRITFAIL - title: [reporttitle])")
+ return
+ log_ability_use(user, "advanced encryption hack (FAIL - title: [reporttitle])")
+ return
+ log_ability_use(user, "advanced encryption hack (SUCCESS - title: [reporttitle])")
+ command_announcement.Announce("[reportbody]", reporttitle, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1);
+
+ if("No")
+ if(!reporttitle || !reportbody || !ability_pay(user, price))
+ user << "Hack Aborted due to no title, no body message, or you do not have enough CPU for this action."
+ return
+
+ log_ability_use(user, "advanced encryption hack")
+
+ if(prob(50) && user.hack_can_fail)
+ user << "Hack Failed."
+ if(prob(5))
+ user.hack_fails ++
+ announce_hack_failure(user, "quantum message relay")
+ log_ability_use(user, "advanced encryption hack (CRITFAIL - title: [reporttitle])")
+ return
+ log_ability_use(user, "advanced encryption hack (FAIL - title: [reporttitle])")
+ return
+ log_ability_use(user, "advanced encryption hack (SUCCESS - title: [reporttitle])")
+ world << "\red New [company_name] Update available at all communication consoles."
+ world << sound('sound/AI/commandreport.ogg')
+ post_comm_message(reporttitle, reportbody)
/datum/game_mode/malfunction/verb/elite_encryption_hack()
set category = "Software"
@@ -219,4 +276,4 @@
user.verbs += new/datum/game_mode/malfunction/verb/ai_destroy_station()
-// END ABILITY VERBS
\ No newline at end of file
+// END ABILITY VERBS
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index 341d2ba8e1d..387520d100d 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -680,7 +680,7 @@
T.mind.vampire.master = src
vampire.thralls += T
T << "You have been forced into a blood bond by [T.mind.vampire.master], and are thus their thrall. While a thrall may feel a myriad of emotions towards their master, ranging from fear, to hate, to love; the supernatural bond between them still forces the thrall to obey their master, and to listen to the master's commands.
You must obey your master's orders, you must protect them, you cannot harm them."
-
+ src << "You have completed the thralling process. They are now your slave and will obey your commands."
admin_attack_log(src, T, "enthralled [key_name(T)]", "was enthralled by [key_name(src)]", "successfully enthralled")
vampire.use_blood(150)
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index f1efaf55536..cd1955fd45d 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -62,7 +62,7 @@
economic_modifier = 5
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks)
- minimal_player_age = 5
+ minimal_player_age = 7
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -105,7 +105,7 @@
economic_modifier = 5
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels)
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels)
- minimal_player_age = 3
+ minimal_player_age = 7
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
@@ -189,7 +189,7 @@
economic_modifier = 4
access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks)
- minimal_player_age = 3
+ minimal_player_age = 7
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 194e0af7c55..ef38f6969c0 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -361,6 +361,9 @@ var/global/datum/controller/occupations/job_master
job.equip(H)
job.apply_fingerprints(H)
+ // Randomize nutrition. (Between 50-100% of max.)
+ H.nutrition = (rand(50, 100) * 0.01) * H.max_nutrition
+
//If some custom items could not be equipped before, try again now.
for(var/thing in custom_equip_leftovers)
var/datum/gear/G = gear_datums[thing]
@@ -586,6 +589,9 @@ var/global/datum/controller/occupations/job_master
var/obj/item/clothing/glasses/G = H.glasses
G.prescription = 1
+ // So shoes aren't silent if people never change 'em.
+ H.update_noise_level()
+
BITSET(H.hud_updateflag, ID_HUD)
BITSET(H.hud_updateflag, IMPLOYAL_HUD)
BITSET(H.hud_updateflag, SPECIALROLE_HUD)
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 1f763892dda..6081e40089c 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -199,5 +199,5 @@
if (!user && usr)
user = usr
- log_admin("[user] ([user.ckey]) opened '[src.name]' containing [gases].")
+ log_admin("[user] ([user.ckey]) opened '[src.name]' containing [gases].", ckey=key_name(user))
message_admins("[user] ([user.ckey]) opened '[src.name]' containing [gases]. (JMP)")
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index c2eb2db6380..e4f4a013f6a 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -238,7 +238,7 @@
if(!making || multiplier < 0 || multiplier > 100)
var/turf/exploit_loc = get_turf(usr)
message_admins("[key_name_admin(usr)] tried to exploit an autolathe to duplicate an item! ([exploit_loc ? "JMP" : "null"])", 0)
- log_admin("EXPLOIT : [key_name(usr)] tried to exploit an autolathe to duplicate an item!")
+ log_admin("EXPLOIT : [key_name(usr)] tried to exploit an autolathe to duplicate an item!",ckey=key_name(usr))
return
busy = 1
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 482c5b3a6fe..cd78a90dcc7 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -207,7 +207,7 @@
new /obj/effect/spawner/newbomb/timer/syndicate(src.loc)
new /obj/item/clothing/head/collectable/petehat(src.loc)
message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
- log_game("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
+ log_game("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.",ckey=key_name(usr))
src.New()
emagged = 0
else if(!contents.len)
diff --git a/code/game/machinery/computer/arcade_orion.dm b/code/game/machinery/computer/arcade_orion.dm
index b713e69fb2d..60bc0828526 100644
--- a/code/game/machinery/computer/arcade_orion.dm
+++ b/code/game/machinery/computer/arcade_orion.dm
@@ -462,7 +462,7 @@
if(emagged)
new /obj/item/weapon/orion_ship(src.loc)
message_admins("[key_name_admin(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
- log_game("[key_name(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
+ log_game("[key_name(usr)] made it to Orion on an emagged machine and got an explosive toy ship.",ckey=key_name(usr))
else
prizevend()
event = null
@@ -487,7 +487,7 @@
if(active)
return
message_admins("[key_name_admin(usr)] primed an explosive Orion ship for detonation.")
- log_game("[key_name(usr)] primed an explosive Orion ship for detonation.")
+ log_game("[key_name(usr)] primed an explosive Orion ship for detonation.",ckey=key_name(usr))
user << "You flip the switch on the underside of [src]."
active = 1
src.visible_message("[src] softly beeps and whirs to life!")
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 32ade68ee24..05d1baff9ef 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -90,7 +90,7 @@
set_security_level(tmp_alertlevel)
if(security_level != old_level)
//Only notify the admins if an actual change happened
- log_game("[key_name(usr)] has changed the security level to [get_security_level()].")
+ log_game("[key_name(usr)] has changed the security level to [get_security_level()].",ckey=key_name(usr))
message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].")
switch(security_level)
if(SEC_LEVEL_GREEN)
@@ -195,7 +195,7 @@
return
Centcomm_announce(input, usr)
usr << "Message transmitted."
- log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]")
+ log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]",ckey=key_name(usr))
centcomm_message_cooldown = 1
spawn(300)//30 second cooldown
centcomm_message_cooldown = 0
@@ -212,7 +212,7 @@
return
Syndicate_announce(input, usr)
usr << "Message transmitted."
- log_say("[key_name(usr)] has made an illegal announcement: [input]")
+ log_say("[key_name(usr)] has made an illegal announcement: [input]",ckey=key_name(usr))
centcomm_message_cooldown = 1
spawn(300)//10 minute cooldown
centcomm_message_cooldown = 0
@@ -459,7 +459,7 @@
return
emergency_shuttle.call_evac()
- log_game("[key_name(user)] has called the shuttle.")
+ log_game("[key_name(user)] has called the shuttle.",ckey=key_name(user))
message_admins("[key_name_admin(user)] has called the shuttle.", 1)
@@ -519,7 +519,7 @@
if(!emergency_shuttle.going_to_centcom()) //check that shuttle isn't already heading to centcomm
emergency_shuttle.recall()
- log_game("[key_name(user)] has recalled the shuttle.")
+ log_game("[key_name(user)] has recalled the shuttle.",key_name(user))
message_admins("[key_name_admin(user)] has recalled the shuttle.", 1)
return
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 333bf25459a..c417345636c 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -63,8 +63,8 @@
target << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered."
target.ResetSecurityCodes()
else
- message_admins("[key_name_admin(usr)] detonated [target.name]!")
- log_game("[key_name(usr)] detonated [target.name]!")
+ message_admins("[key_name_admin(usr)] detonated [target.name]!")
+ log_game("[key_name(usr)] detonated [target.name]!",ckey=key_name(usr))
target << "Self-destruct command received."
spawn(10)
target.self_destruct()
@@ -92,15 +92,10 @@
if(!target || !istype(target))
return
- message_admins("[key_name_admin(usr)] [target.canmove ? "locked down" : "released"] [target.name]!")
- log_game("[key_name(usr)] [target.canmove ? "locked down" : "released"] [target.name]!")
- target.canmove = !target.canmove
- if (target.lockcharge)
- target.lockcharge = !target.lockcharge
- target << "Your lockdown has been lifted!"
- else
- target.lockcharge = !target.lockcharge
- target << "You have been locked down!"
+ target.SetLockdown(!target.lockcharge) // Toggle.
+ message_admins("[key_name_admin(usr)] [target.lockcharge ? "locked down" : "released"] [target.name]!")
+ log_game("[key_name(usr)] [target.lockcharge ? "locked down" : "released"] [target.name]!",ckey=key_name(usr))
+ target << (target.lockcharge ? "You have been locked down!" : "Your lockdown has been lifted!")
// Remotely hacks the cyborg. Only antag AIs can do this and only to linked cyborgs.
else if (href_list["hack"])
@@ -124,8 +119,8 @@
if(!target || !istype(target))
return
- message_admins("[key_name_admin(usr)] emagged [target.name] using robotic console!")
- log_game("[key_name(usr)] emagged [target.name] using robotic console!")
+ message_admins("[key_name_admin(usr)] emagged [target.name] using robotic console!")
+ log_game("[key_name(usr)] emagged [target.name] using robotic console!",ckey=key_name(usr))
target.emagged = 1
target << "Failsafe protocols overriden. New tools available."
@@ -147,8 +142,8 @@
user << "Self-destruct aborted - safety active"
return
- message_admins("[key_name_admin(usr)] detonated all cyborgs!")
- log_game("[key_name(usr)] detonated all cyborgs!")
+ message_admins("[key_name_admin(usr)] detonated all cyborgs!")
+ log_game("[key_name(usr)] detonated all cyborgs!",ckey=key_name(usr))
for(var/mob/living/silicon/robot/R in mob_list)
if(istype(R, /mob/living/silicon/robot/drone))
@@ -179,7 +174,7 @@
robot["name"] = R.name
if(R.stat)
robot["status"] = "Not Responding"
- else if (!R.canmove)
+ else if (R.lockcharge) // changed this from !R.canmove to R.lockcharge because of issues with lockdown and chairs
robot["status"] = "Lockdown"
else
robot["status"] = "Operational"
diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm
index 7f6152bdd6d..cb84c883e51 100644
--- a/code/game/machinery/computer/shuttle.dm
+++ b/code/game/machinery/computer/shuttle.dm
@@ -38,11 +38,11 @@
src.authorized += W:registered_name
if (src.auth_need - src.authorized.len > 0)
message_admins("[key_name_admin(user)] has authorized early shuttle launch")
- log_game("[user.ckey] has authorized early shuttle launch")
+ log_game("[user.ckey] has authorized early shuttle launch",key_name(user))
world << text("Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len)
else
message_admins("[key_name_admin(user)] has launched the shuttle")
- log_game("[user.ckey] has launched the shuttle early")
+ log_game("[user.ckey] has launched the shuttle early",key_name(user))
world << "Alert: Shuttle launch time shortened to 10 seconds!"
emergency_shuttle.set_launch_countdown(10)
//src.authorized = null
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 342187a2f54..d611ffd5cfc 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -426,7 +426,7 @@
// Book keeping!
var/turf/location = get_turf(src)
- log_admin("[key_name_admin(M)] has entered a stasis pod. (JMP)")
+ log_admin("[key_name_admin(M)] has entered a stasis pod. (JMP)",ckey=key_name(M))
message_admins("[key_name_admin(M)] has entered a stasis pod.")
//Despawning occurs when process() is called with an occupant without a client.
@@ -486,7 +486,7 @@
// Book keeping!
var/turf/location = get_turf(src)
- log_admin("[key_name_admin(L)] has entered a stasis pod.")
+ log_admin("[key_name_admin(L)] has entered a stasis pod.",ckey=key_name(L))
message_admins("[key_name_admin(L)] has entered a stasis pod.(JMP)")
//Despawning occurs when process() is called with an occupant without a client.
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index f66e1ca93b1..0ac567d9d85 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -35,8 +35,15 @@
var/secured_wires = 0
var/datum/wires/airlock/wires = null
var/obj/item/device/magnetic_lock/bracer = null
+
var/open_sound_powered = 'sound/machines/airlock.ogg'
+ var/close_sound_powered = 'sound/machines/AirlockClose.ogg'
var/open_sound_unpowered = 'sound/machines/airlock_creaking.ogg'
+ var/close_sound_unpowered = 'sound/machines/airlock_creaking.ogg'
+
+ var/bolts_dropping = 'sound/machines/BoltsDown.ogg'
+ var/bolts_rising = 'sound/machines/BoltsUp.ogg'
+
hashatch = 1
var/_wifi_id
@@ -126,6 +133,7 @@
icon = 'icons/obj/doors/Doorglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
open_sound_powered = 'sound/machines/windowdoor.ogg'
+ close_sound_powered = 'sound/machines/windowdoor.ogg'
maxhealth = 300
explosion_resistance = 5
opacity = 0
@@ -1093,9 +1101,9 @@ About the new airlock wires panel:
take_damage(DOOR_CRUSH_DAMAGE)
use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
if(arePowerSystemsOn())
- playsound(src.loc, open_sound_powered, 100, 1)
+ playsound(src.loc, close_sound_powered, 100, 1)
else
- playsound(src.loc, open_sound_unpowered, 100, 1)
+ playsound(src.loc, close_sound_unpowered, 100, 1)
..()
@@ -1104,8 +1112,8 @@ About the new airlock wires panel:
return 0
if (operating && !forced) return 0
src.locked = 1
- for(var/mob/M in range(1,src))
- M.show_message("You hear a click from the bottom of the door.", 2)
+ playsound(src, bolts_dropping, 30, 0, -6)
+ audible_message("You hear a click from the bottom of the door.")
update_icon()
return 1
@@ -1115,8 +1123,8 @@ About the new airlock wires panel:
if (!forced)
if(operating || !src.arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) return
src.locked = 0
- for(var/mob/M in range(1,src))
- M.show_message("You hear a click from the bottom of the door.", 2)
+ playsound(src, bolts_rising, 30, 0, -6)
+ audible_message("You hear a click from the bottom of the door.")
update_icon()
return 1
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index e69f750a5fa..1df53516f51 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -1,4 +1,5 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
+// Please do not use relative paths.
/obj/item/weapon/airlock_electronics
name = "airlock electronics"
@@ -15,100 +16,100 @@
var/one_access = 0 //if set to 1, door would receive req_one_access instead of req_access
var/last_configurator = null
var/locked = 1
+ var/inuse = 0 // no double-spending
- attack_self(mob/user as mob)
- if (!ishuman(user) && !istype(user,/mob/living/silicon/robot))
- return ..(user)
+/obj/item/weapon/airlock_electronics/attack_self(mob/user as mob)
+ if (!ishuman(user) && !istype(user,/mob/living/silicon/robot))
+ return ..(user)
- var/mob/living/carbon/human/H = user
- if(H.getBrainLoss() >= 60)
- return
+ var/mob/living/carbon/human/H = user
+ if(H.getBrainLoss() >= 60)
+ return
- var/t1 = text("Access control
\n")
+ var/t1 = text("Access control
\n")
- if (last_configurator)
- t1 += "Operator: [last_configurator]
"
+ if (last_configurator)
+ t1 += "Operator: [last_configurator]
"
- if (locked)
- t1 += "Swipe ID
| [antag.role_text]: | "
- if(jobban_isbanned(preference_mob(), antag.bantype))
+ if(is_global_banned || jobban_isbanned(preference_mob(), antag.bantype))
. += "\[BANNED\] " else if(antag.role_type in pref.be_special_role) . += "Yes / No" diff --git a/code/modules/client/preference_setup/loadout/loadout_general.dm b/code/modules/client/preference_setup/loadout/loadout_general.dm index e6670a87b4b..4e70450faa1 100644 --- a/code/modules/client/preference_setup/loadout/loadout_general.dm +++ b/code/modules/client/preference_setup/loadout/loadout_general.dm @@ -42,11 +42,6 @@ ..() gear_tweaks += new/datum/gear_tweak/reagents(lunchables_drink_reagents()) -/datum/gear/boot_knife - display_name = "boot knife" - path = /obj/item/weapon/material/kitchen/utensil/knife/boot - cost = 3 - /datum/gear/lunchbox display_name = "lunchbox" description = "A little lunchbox." diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index cbb8b8036bd..ee2e295d197 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -110,7 +110,7 @@ gear_tweaks += new/datum/gear_tweak/path(dress) /datum/gear/uniform/uniform_captain - display_name = "uniform, captain's dress" + display_name = "uniform, captain dress" path = /obj/item/clothing/under/dress/dress_cap allowed_roles = list("Captain") @@ -120,7 +120,7 @@ allowed_roles = list("Security Officer","Head of Security","Warden","Security Cadet") /datum/gear/uniform/uniform_hop - display_name = "uniform, HoP's dress" + display_name = "uniform, HoP dress" path = /obj/item/clothing/under/dress/dress_hop allowed_roles = list("Head of Personnel") diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno.dm b/code/modules/client/preference_setup/loadout/loadout_xeno.dm index 6bd887c8fbb..29ccdbbf1f8 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno.dm @@ -50,7 +50,7 @@ /datum/gear/ears/m_skrell/New() ..() var/m_chains = list() - m_chains["headtail bands"] = /obj/item/clothing/ears/skrell/chain + m_chains["headtail bands"] = /obj/item/clothing/ears/skrell/band m_chains["headtail cloth"] = /obj/item/clothing/ears/skrell/cloth_male m_chains["red-jeweled bands"] = /obj/item/clothing/ears/skrell/redjeweled_band m_chains["ebony bands"] = /obj/item/clothing/ears/skrell/ebony_band diff --git a/code/modules/client/preference_setup/other/01_incidents.dm b/code/modules/client/preference_setup/other/01_incidents.dm index 879494f4d81..aefcf598855 100644 --- a/code/modules/client/preference_setup/other/01_incidents.dm +++ b/code/modules/client/preference_setup/other/01_incidents.dm @@ -60,7 +60,6 @@ infraction.fine = text2num(char_infraction_query.item[10]) infraction.felony = text2num(char_infraction_query.item[11]) pref.incidents.Add(infraction) - log_debug("Added infraction with [infraction.UID]") /datum/category_item/player_setup_item/other/incidents/content(var/mob/user) pref.incidents = list() diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 0ebb659c50f..4f8e69479e7 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -244,7 +244,7 @@ item_state = "bigsunglasses" /obj/item/clothing/glasses/sunglasses/sechud - name = "HUDSunglasses" + name = "HUDsunglasses" desc = "Sunglasses with a HUD." icon_state = "sunhud" diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 0f0e0489cfa..c7a903b59f5 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -238,8 +238,12 @@ if(target_mob != H) H << "You inject [target_mob] with [chems_to_use] unit\s of [charge.display_name]." - target_mob << "You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected." - target_mob.reagents.add_reagent(charge.display_name, chems_to_use) + + if(target_mob.is_physically_disabled()) + target_mob.reagents.add_reagent(charge.display_name, chems_to_use) + else + target_mob << "You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected." + target_mob.reagents.add_reagent(charge.display_name, chems_to_use) charge.charges -= chems_to_use if(charge.charges < 0) charge.charges = 0 diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index cd1cd2d501c..9fb30b498f1 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -255,9 +255,10 @@ /obj/item/clothing/suit/armor/tactical/New() ..() - holster = new(src) - holster.has_suit = 1//its inside a suit, we set this so it can be drawn from - pockets = null//Tactical armour has internal holster instead of pockets, so we null this out + holster = new() + holster.on_attached(src) //its inside a suit, we set this so it can be drawn from + QDEL_NULL(pockets) //Tactical armour has internal holster instead of pockets, so we null this out + overlays.Cut() // Remove the holster's overlay. /obj/item/clothing/suit/armor/tactical/attackby(obj/item/W as obj, mob/user as mob) ..() diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 8264142d82d..d6b5cbd73f7 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -98,6 +98,9 @@ var/obj/item/clothing/under/S = src if (S.accessories.len) H = locate() in S.accessories + else if (istype(src, /obj/item/clothing/suit/armor/tactical)) // This armor is a snowflake and has an integrated holster. + var/obj/item/clothing/suit/armor/tactical/tacticool = src + H = tacticool.holster if (!H) usr << "Something is very wrong." diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 1bcde7c8758..308d9526948 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -37,7 +37,7 @@ siemens_coefficient = 0.7 /obj/item/clothing/under/rank/security2 - name = "security officer's uniform" + name = "security cadet's uniform" desc = "It's made of a slightly sturdier material, to allow for robust protection." icon_state = "redshirt2" item_state = "r_suit" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 2276df9b822..e7af61c3673 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -76,13 +76,14 @@ //This set of uniforms looks fairly fancy and is generally used for high-ranking NT personnel from what I've seen, so lets give them appropriate ranks. /obj/item/clothing/under/rank/centcom desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain.\"" - name = "\improper officer's dress uniform" + name = "officer's dress uniform" icon_state = "officer" item_state = "lawyer_black" worn_state = "officer" displays_id = 0 /obj/item/clothing/under/rank/centcom_officer + name = "officer's dress uniform" desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Admiral.\"" icon_state = "officer" item_state = "lawyer_black" @@ -90,6 +91,7 @@ displays_id = 0 /obj/item/clothing/under/rank/centcom_captain + name = "officer's dress uniform" desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Admiral-Executive.\"" icon_state = "centcom" item_state = "lawyer_black" diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 872140bdd6f..480cb22092d 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -100,7 +100,7 @@ reagents.splash(A, 1) //get a small amount of liquid on the thing we're wiping. update_name() if(do_after(user,30)) - user.visible_message("\The [user] finishes wiping off the [A]!") + user.visible_message("\The [user] finishes wiping off \the [A]!") A.clean_blood() /obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag) diff --git a/code/modules/effects/sparks/spawner.dm b/code/modules/effects/sparks/spawner.dm index 6f3790b866e..1ed6b8db2ff 100644 --- a/code/modules/effects/sparks/spawner.dm +++ b/code/modules/effects/sparks/spawner.dm @@ -40,7 +40,7 @@ playsound(location, "sparks", 100, 1) var/direction = 0 - if (!src.spread.len) + if (src.spread && src.spread.len) direction = 0 else direction = pick(src.spread) diff --git a/code/modules/events/viral_infection.dm b/code/modules/events/viral_infection.dm index 91b435a0c8c..a64b2eed527 100644 --- a/code/modules/events/viral_infection.dm +++ b/code/modules/events/viral_infection.dm @@ -21,16 +21,9 @@ datum/event/viral_infection/setup() viruses += D datum/event/viral_infection/announce() - var/level - if (severity == EVENT_LEVEL_MUNDANE) - return - else if (severity == EVENT_LEVEL_MODERATE) - level = pick("one", "two", "three", "four") - else - level = "five" if (severity == EVENT_LEVEL_MAJOR || prob(60)) - command_announcement.Announce("Confirmed outbreak of level [level] biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg') + command_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg') datum/event/viral_infection/start() if(!viruses.len) return diff --git a/code/modules/food/recipes_fryer.dm b/code/modules/food/recipes_fryer.dm index 62abaebf241..d3582158290 100644 --- a/code/modules/food/recipes_fryer.dm +++ b/code/modules/food/recipes_fryer.dm @@ -99,6 +99,7 @@ /datum/recipe/chaosdonut appliance = FRYER reagents = list("frostoil" = 10, "capsaicin" = 10, "sugar" = 10) + reagent_mix = RECIPE_REAGENT_REPLACE //This creates its own reagents items = list( /obj/item/weapon/reagent_containers/food/snacks/dough ) diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 3e0bc2582a0..7b749a955a5 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -28,6 +28,7 @@ I said no! /datum/recipe/boiledegg reagents = list("water" = 5) + reagent_mix = RECIPE_REAGENT_REPLACE items = list( /obj/item/weapon/reagent_containers/food/snacks/egg ) @@ -162,15 +163,16 @@ I said no! /datum/recipe/omelette items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/egg, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge ) + reagents = list("egg" = 6) + reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/weapon/reagent_containers/food/snacks/omelette /datum/recipe/muffin reagents = list("milk" = 5, "sugar" = 5) + reagent_mix = RECIPE_REAGENT_REPLACE items = list( /obj/item/weapon/reagent_containers/food/snacks/dough ) @@ -187,10 +189,12 @@ I said no! /datum/recipe/soylenviridians fruit = list("soybeans" = 1) reagents = list("flour" = 10) + reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/weapon/reagent_containers/food/snacks/soylenviridians /datum/recipe/soylentgreen reagents = list("flour" = 10) + reagent_mix = RECIPE_REAGENT_REPLACE items = list( /obj/item/weapon/reagent_containers/food/snacks/meat/human, /obj/item/weapon/reagent_containers/food/snacks/meat/human @@ -313,11 +317,8 @@ I said no! result = /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup /datum/recipe/nettlesoup - fruit = list("nettle" = 1, "potato" = 1) - reagents = list("water" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg - ) + fruit = list("nettle" = 1, "potato" = 1, ) + reagents = list("water" = 10, "egg" = 3) result = /obj/item/weapon/reagent_containers/food/snacks/nettlesoup /datum/recipe/wishsoup @@ -336,13 +337,6 @@ I said no! -/datum/recipe/spellburger - items = list( - /obj/item/weapon/reagent_containers/food/snacks/monkeyburger, - /obj/item/clothing/head/wizard/fake - ) - result = /obj/item/weapon/reagent_containers/food/snacks/spellburger - /datum/recipe/spellburger items = list( /obj/item/weapon/reagent_containers/food/snacks/monkeyburger, @@ -355,9 +349,10 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/monkeyburger, /obj/item/weapon/reagent_containers/food/snacks/meat, /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/egg + /obj/item/weapon/reagent_containers/food/snacks/meat ) + reagents = list("egg" = 3) + reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger @@ -569,6 +564,7 @@ I said no! items = list() result = /obj/item/weapon/reagent_containers/food/snacks/slimesoup + /datum/recipe/boiledslimeextract reagents = list("water" = 5) items = list( @@ -592,21 +588,21 @@ I said no! result_quantity = 2 /datum/recipe/fishfingers - reagents = list("flour" = 10) + reagents = list("flour" = 10,"egg" = 3) items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, /obj/item/weapon/reagent_containers/food/snacks/carpmeat ) result = /obj/item/weapon/reagent_containers/food/snacks/fishfingers + reagent_mix = RECIPE_REAGENT_REPLACE /datum/recipe/mysterysoup - reagents = list("water" = 10) + reagents = list("water" = 10, "egg" = 3) items = list( /obj/item/weapon/reagent_containers/food/snacks/badrecipe, /obj/item/weapon/reagent_containers/food/snacks/tofu, - /obj/item/weapon/reagent_containers/food/snacks/egg, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge ) + reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/weapon/reagent_containers/food/snacks/mysterysoup @@ -623,11 +619,7 @@ I said no! /datum/recipe/chawanmushi fruit = list("mushroom" = 1) - reagents = list("water" = 5, "soysauce" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/egg - ) + reagents = list("water" = 5, "soysauce" = 5, "egg" = 6) result = /obj/item/weapon/reagent_containers/food/snacks/chawanmushi /datum/recipe/beetsoup diff --git a/code/modules/food/recipes_oven.dm b/code/modules/food/recipes_oven.dm index 21bf6cf2214..c0dfe2dd725 100644 --- a/code/modules/food/recipes_oven.dm +++ b/code/modules/food/recipes_oven.dm @@ -13,6 +13,7 @@ reagents = list("pacid" = 5) //It dissolves the carapace. Still poisonous, though. items = list(/obj/item/weapon/holder/diona) result = /obj/item/weapon/reagent_containers/food/snacks/dionaroast + reagent_mix = RECIPE_REAGENT_REPLACE //No eating polyacid //Predesigned breads @@ -21,8 +22,11 @@ appliance = OVEN items = list( /obj/item/weapon/reagent_containers/food/snacks/dough, - /obj/item/weapon/reagent_containers/food/snacks/egg + /obj/item/weapon/reagent_containers/food/snacks/dough, + /obj/item/weapon/reagent_containers/food/snacks/dough, + /obj/item/weapon/reagent_containers/food/snacks/dough ) + reagents = list("sodiumchloride" = 1) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/bread /datum/recipe/baguette @@ -194,15 +198,14 @@ fruit = list("pumpkin" = 1) reagents = list("milk" = 5, "sugar" = 5, "egg" = 3, "flour" = 10) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie + reagent_mix = RECIPE_REAGENT_REPLACE //We dont want raw egg in the result /datum/recipe/appletart appliance = OVEN fruit = list("goldapple" = 1) - reagents = list("sugar" = 5, "milk" = 5, "flour" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg - ) + reagents = list("sugar" = 5, "milk" = 5, "flour" = 10, "egg" = 3) result = /obj/item/weapon/reagent_containers/food/snacks/appletart + reagent_mix = RECIPE_REAGENT_REPLACE //Baked sweets: //--------------- @@ -216,6 +219,7 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/cookie result_quantity = 4 + reagent_mix = RECIPE_REAGENT_REPLACE /datum/recipe/fortunecookie appliance = OVEN @@ -362,7 +366,7 @@ /obj/item/weapon/reagent_containers/food/snacks/monkeycube ) result = /obj/item/weapon/reagent_containers/food/snacks/monkeysdelight - + reagent_mix = RECIPE_REAGENT_REPLACE @@ -374,6 +378,7 @@ appliance = OVEN reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake + reagent_mix = RECIPE_REAGENT_REPLACE /datum/recipe/cake/carrot appliance = OVEN diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm index 3b60a140f19..71e6f6f44e9 100644 --- a/code/modules/ghosttrap/trap.dm +++ b/code/modules/ghosttrap/trap.dm @@ -190,7 +190,7 @@ datum/ghosttrap/drone/transfer_personality(var/mob/candidate, var/mob/living/sil /*********************************** * Syndicate Cyborg * ***********************************/ -/* + /datum/ghosttrap/syndicateborg object = "syndicate cyborg" ban_checks = list("Antagonist","AI","Cyborg") @@ -198,7 +198,9 @@ datum/ghosttrap/drone/transfer_personality(var/mob/candidate, var/mob/living/sil ghost_trap_message = "They are occupying a syndicate cyborg now." ghost_trap_role = "Syndicate Cyborg" can_set_own_name = TRUE -*/ + +/datum/ghosttrap/syndicateborg/welcome_candidate(var/mob/target) + target << "You are a syndicate cyborg, bound to help and follow the orders of the mercenaries that are deploying you. Remember to speak to the other mercenaries to know more about their plans" /************** * pAI * @@ -214,3 +216,32 @@ datum/ghosttrap/pai/assess_candidate(var/mob/observer/ghost/candidate, var/mob/t datum/ghosttrap/pai/transfer_personality(var/mob/candidate, var/mob/living/silicon/robot/drone/drone) return 0 + +/************** +* Wizard Familiar * +**************/ + +/datum/ghosttrap/familiar + object = "wizard familiar" + pref_check = MODE_WIZARD + ghost_trap_message = "They are occupying a familiar now." + ghost_trap_role = "Wizard Familiar" + ban_checks = list(MODE_WIZARD) + +/datum/ghosttrap/familiar/welcome_candidate(var/mob/target) + return 0 + +/************** +* Skeleton minion * +**************/ + +/datum/ghosttrap/skeleton + object = "skeleton minion" + pref_check = MODE_WIZARD + ghost_trap_message = "They are occupying a skeleton minion." + ghost_trap_role = "Skeleton Minion" + ban_checks = list(MODE_WIZARD) + can_set_own_name = FALSE + +/datum/ghosttrap/skeleton/welcome_candidate(var/mob/target) + return 0 diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 924c2877a27..2917f8c2ceb 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -116,10 +116,10 @@ update_projections() if(safety_disabled) message_admins("[key_name_admin(usr)] overrode the holodeck's safeties") - log_game("[key_name(usr)] overrided the holodeck's safeties") + log_game("[key_name(usr)] overrided the holodeck's safeties",ckey=key_name(usr)) else message_admins("[key_name_admin(usr)] restored the holodeck's safeties") - log_game("[key_name(usr)] restored the holodeck's safeties") + log_game("[key_name(usr)] restored the holodeck's safeties",ckey=key_name(usr)) else if(href_list["gravity"]) toggleGravity(linkedholodeck) @@ -137,7 +137,7 @@ update_projections() user << "You vastly increase projector power and override the safety and security protocols." user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call [company_name] maintenance and do not use the simulator." - log_game("[key_name(usr)] emagged the Holodeck Control Computer") + log_game("[key_name(usr)] emagged the Holodeck Control Computer",ckey=key_name(usr)) return 1 src.updateUsrDialog() else diff --git a/code/modules/http/post_request.dm b/code/modules/http/post_request.dm index e7de7a6affe..4eca120fc3b 100644 --- a/code/modules/http/post_request.dm +++ b/code/modules/http/post_request.dm @@ -70,6 +70,8 @@ log_debug("ByondPOST POST: Proc error: Too few arguments sent to function.") if ("2") log_debug("ByondPOST POST: Proc error: Unable to initialize curl object.") + if ("3") + log_debug("ByondPOST POST: Proc error: General exception caught and logged.") else log_debug("ByondPOST POST: Proc error: Unknown error.") return -1 @@ -120,6 +122,8 @@ log_debug("ByondPOST GET: Proc error: Too few arguments sent to function.") if ("2") log_debug("ByondPOST GET: Proc error: Unable to initialize curl object.") + if ("3") + log_debug("ByondPOST GET: Proc error: General exception caught and logged.") else log_debug("ByondPOST GET: Proc error: Unknown error.") return -1 diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index ed166b3cce9..7d78916525e 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -355,7 +355,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f usr << query.ErrorMsg() else log_and_message_admins("has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs") - log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs") + log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs",ckey=key_name(usr)) alert("Upload Complete.") if(href_list["targetid"]) diff --git a/code/modules/lighting/lighting_area.dm b/code/modules/lighting/lighting_area.dm index 875a41c956e..a39eb1d975e 100644 --- a/code/modules/lighting/lighting_area.dm +++ b/code/modules/lighting/lighting_area.dm @@ -17,12 +17,12 @@ dynamic_lighting = new_dynamic_lighting if (new_dynamic_lighting) - for (var/turf/T in turfs) + for (var/turf/T in src) if (T.dynamic_lighting) T.lighting_build_overlay() else - for (var/turf/T in turfs) + for (var/turf/T in src) if (T.lighting_overlay) T.lighting_clear_overlay() diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index dae3e08f26d..724b09df019 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -4,6 +4,7 @@ name = "" anchored = TRUE icon = LIGHTING_ICON + icon_state = LIGHTING_BASE_ICON_STATE color = LIGHTING_BASE_MATRIX mouse_opacity = 0 layer = LIGHTING_LAYER diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index cba7976654b..f7aefe77ea8 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -262,7 +262,7 @@ var/do_offset = TRUE var/turf/front = get_step(T, top_atom.dir) - if (front.has_opaque_atom) + if (front && front.has_opaque_atom) do_offset = FALSE cached_origin_x = T.x diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index 4935e8d2ea2..79a4b91c282 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -21,6 +21,12 @@ for (var/datum/light_source/L in affecting_lights) L.vis_update() +// Forces a lighting update. Reconsider lights is preferred when possible. +/turf/proc/force_update_lights() + L_PROF(src, "turf_forceupdate") + for (var/datum/light_source/L in affecting_lights) + L.force_update() + /turf/proc/lighting_clear_overlay() if (lighting_overlay) returnToPool(lighting_overlay) @@ -52,6 +58,26 @@ C.active = TRUE +// Returns the average color of this tile. Roughly corresponds to the color of a single old-style lighting overlay. +/turf/proc/get_avg_color() + if (!lighting_overlay) + return null + + var/lum_r + var/lum_g + var/lum_b + + for (var/datum/lighting_corner/L in corners) + lum_r += L.lum_r + lum_g += L.lum_g + lum_b += L.lum_b + + lum_r = CLAMP01(lum_r / 4) * 255 + lum_g = CLAMP01(lum_g / 4) * 255 + lum_b = CLAMP01(lum_b / 4) * 255 + + return "#[num2hex(lum_r, 2)][num2hex(lum_g, 2)][num2hex(lum_g, 2)]" + #define SCALE(targ,min,max) (targ - min) / (max - min) // Used to get a scaled lumcount. diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index 3f4b9ceddef..5402e922a9e 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -94,4 +94,4 @@ var/obj/item/device/core_sampler/C = W C.sample_item(src, user) else - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index b90e90b0538..0c43d6b507b 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -224,7 +224,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp resting = 1 var/turf/location = get_turf(src) message_admins("[key_name_admin(usr)] has ghosted. (JMP)") - log_game("[key_name_admin(usr)] has ghosted.") + log_game("[key_name_admin(usr)] has ghosted.",ckey=key_name(usr)) var/mob/dead/observer/ghost = ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. announce_ghost_joinleave(ghost) diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 6f7d99c6160..548428f015b 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -4,16 +4,13 @@ if (!message) return - log_say("Ghost/[src.key] : [message]") + log_say("Ghost/[src.key] : [message]",ckey=key_name(src)) if (src.client) - if(src.client.prefs.muted & MUTE_DEADCHAT) + if(src.client.prefs.muted & (MUTE_DEADCHAT|MUTE_IC)) src << "\red You cannot talk in deadchat (muted)." return - if (src.client.handle_spam_prevention(message,MUTE_DEADCHAT)) - return - . = src.say_dead(message) @@ -26,16 +23,13 @@ if(act != "me") return - log_emote("Ghost/[src.key] : [message]") + log_emote("Ghost/[src.key] : [message]",ckey=key_name(src)) if(src.client) - if(src.client.prefs.muted & MUTE_DEADCHAT) + if(src.client.prefs.muted & (MUTE_DEADCHAT|MUTE_IC)) src << "\red You cannot emote in deadchat (muted)." return - if(src.client.handle_spam_prevention(message, MUTE_DEADCHAT)) - return - . = src.emote_dead(message) /* diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 7bc11bf7ccf..a1345b4d12a 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -1,7 +1,7 @@ // All mobs should have custom emote, really.. //m_type == 1 --> visual. //m_type == 2 --> audible -/mob/proc/custom_emote(var/m_type=1,var/message = null) +/mob/proc/custom_emote(var/m_type=1,var/message = null, var/log_emote = 1) if(usr && stat || !use_me && usr == src) src << "You are unable to emote." return @@ -21,9 +21,9 @@ if (message) - log_emote("[name]/[key] : [message]") - send_emote(message, m_type) + if (log_emote) + log_emote("[name]/[key] : [message]",ckey=key_name(key)) /mob/proc/emote_dead(var/message) @@ -49,7 +49,7 @@ input = message if(input) - log_emote("Ghost/[src.key] : [input]") + log_emote("Ghost/[src.key] : [input]",ckey=key_name(src)) say_dead_direct(input, src) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index ba1c13f6a9a..ad2918d11fa 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -294,7 +294,7 @@ var/list/slot_equipment_priority = list( \ M.attack_log += text("\[[time_stamp()]\] Has been thrown by [usr.name] ([usr.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]") usr.attack_log += text("\[[time_stamp()]\] Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]") - msg_admin_attack("[usr.name] ([usr.ckey]) has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor] (JMP)") + msg_admin_attack("[usr.name] ([usr.ckey]) has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor] (JMP)",ckey=key_name(usr),ckey_target=key_name(M)) if(!item) return //Grab processing has a chance of returning null diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index 18f44c774e9..59755a3f2eb 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -98,7 +98,7 @@ return (copytext(message, length(message)) == "!") ? 2 : 1 /datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) - log_say("[key_name(speaker)] : ([name]) [message]") + log_say("[key_name(speaker)] : ([name]) [message]",ckey=key_name(speaker)) if(!speaker_mask) speaker_mask = speaker.name message = format_message(message, get_spoken_verb(message)) diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index a8810eaabdc..9f763b13371 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -56,11 +56,13 @@ /datum/language/tajaran/get_random_name(var/gender) - var/new_name = ..(gender,1) - if(prob(50)) - new_name += " [pick(list("Hadii","Kaytam","Nazkiin","Zhan-Khazan","Hharar","Njarir'Akhan","Faaira'Nrezi","Rhezar","Mi'dynh","Rrhazkal","Bayan","Al'Manq","Mi'jri","Chur'eech","Sanu'dra","Ii'rka"))]" - else - new_name += " [..(gender,1)]" + var/new_name + if(gender==FEMALE) + new_name += pick(list("Aisha","Amani","Agashka","Agramakova","Bakhteiarova","Bratomila","Dekhova","Derzhka","Farah","Faizah","Hanifa","Ikram","Jenna","Khadija","Kandaza","Karyme","Kismet","Malika","Mumtaz","Nashwa","Nafisha","Shahar","Sabah","Takiyah","Wafiqah","Wasime","Yesenia","Zahra","Zohra","Rajjurl","Marryam","Dhrarmela","Rrhuyala","Irryavga","Ahvulyar","Purryalna","Yasmin")) + else if(gender==MALE) + new_name += pick(list("Abdal","Akhtar","Akim","Alik","Arif","Azzam","Anton","Alzrun","Bahir","Barakh","Bohdan","Coman","Dekel","Dima","Fa'iq","Faidah","Fredek","Fakhr","Hasam","Hashim","Ioakim","Kadir","Kareef","Khrazmrrug","Khazarir","Rrhazumar","Mrrhazugal","Harrmalik","Mata'ke","Njadrasanukii","Tajrhalrr","Rhagrrhuzau","Vahzirthaamro","Lev","Misha","Mahir","Nasser","Nasir","Oleg","Qadir","Sharif","Stepka","Tamir","Yasir","Zahid")) + new_name += " " + new_name += pick(list("Alfarsi","Alekseev","Al-Barik","Al-Hamdan","Al-Mansur","Al-Kandari","Al-Shahrani","Antonov","Bogdanov","El-Hasem","El-Amin","Rrhakaslav","Mrrazhughran","Jrruzhani","Rrhamrare","Mrakiizar","Hirron","Prruzhulkanich","El-Tusi","Nejem","Hanar","Karimi","Markov","Saif","Yakub","Zaman","Zaydan","Zidan","Zahawi")) return new_name // tajaran sign language @@ -119,7 +121,7 @@ return new_name /datum/language/bug/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) - log_say("[key_name(speaker)] : ([name]) [message]") + log_say("[key_name(speaker)] : ([name]) [message]",ckey=key_name(speaker)) if(!speaker_mask) speaker_mask = speaker.name diff --git a/code/modules/mob/language/synthetic.dm b/code/modules/mob/language/synthetic.dm index 8f8ba37abb0..2cfbeff4c59 100644 --- a/code/modules/mob/language/synthetic.dm +++ b/code/modules/mob/language/synthetic.dm @@ -17,7 +17,7 @@ if (!message) return - log_say("[key_name(speaker)] : ([name]) [message]") + log_say("[key_name(speaker)] : ([name]) [message]",ckey=key_name(speaker)) var/message_start = "[name], [speaker.name]" var/message_body = "" diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm index d8d4311c7a7..c9a2ee8b181 100644 --- a/code/modules/mob/living/carbon/alien/emote.dm +++ b/code/modules/mob/living/carbon/alien/emote.dm @@ -116,6 +116,6 @@ else src << text("Invalid Emote: []", act) if ((message && src.stat == 0)) - log_emote("[name]/[key] : [message]") + log_emote("[name]/[key] : [message]",ckey=key_name(key)) send_emote(message, m_type) return diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 438b14abe0d..e8967791905 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -34,21 +34,24 @@ var/obj/mecha = null//This does not appear to be used outside of reference in mecha.dm. attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O,/obj/item/organ/brain) && !(istype(O,/obj/item/organ/brain/golem)) && !brainmob) //Time to stick a brain in it --NEO /MMI'ing a scroll of paper makes 0 sense - + if(istype(O,/obj/item/organ/brain) && !brainmob) //Time to stick a brain in it --NEO var/obj/item/organ/brain/B = O if(B.health <= 0) - user << "\red That brain is well and truly dead." + user << "That brain is well and truly dead." return + else if(!B.lobotomized && B.can_lobotomize) + user << "The brain won't fit until you perform a lobotomy!" + return + else if(!B.can_lobotomize) + user << "The [B] is incompatible with [src]!" else if(!B.brainmob) - user << "\red You aren't sure where this brain came from, but you're pretty sure it's a useless brain." + user << "You aren't sure where this brain came from, but you're pretty sure it's a useless brain." return - for(var/mob/V in viewers(src, null)) - V.show_message(text("\blue [user] sticks \a [O] into \the [src].")) + user.visible_message("[user] sticks \a [B] into \the [src].") - brainmob = O:brainmob - O:brainmob = null + brainmob = B.brainmob + B.brainmob = null brainmob.loc = src brainmob.container = src brainmob.stat = 0 @@ -56,7 +59,7 @@ living_mob_list += brainmob user.drop_item() - brainobj = O + brainobj = B brainobj.loc = src name = "Man-Machine Interface: [brainmob.real_name]" diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 6cbe65c1805..6bf79bc5734 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -14,6 +14,8 @@ origin_tech = list(TECH_BIO = 3) attack_verb = list("attacked", "slapped", "whacked") var/mob/living/carbon/brain/brainmob = null + var/lobotomized = 0 + var/can_lobotomize = 1 /obj/item/organ/pariah_brain name = "brain remnants" @@ -90,12 +92,44 @@ target.key = brainmob.key ..() +/obj/item/organ/brain/proc/lobotomize(mob/user as mob) + lobotomized = 1 + + if(owner) + owner << "As part of your brain is drilled out, you feel your past self, your memories, your very being slip away..." + owner << "You have been lobotomized. Your memories and your former life have been surgically removed from your brain, and while you are lobotomized you remember nothing that ever came before this moment." + + else if(brainmob) + brainmob << "As part of your brain is drilled out, you feel your past self, your memories, your very being slip away..." + brainmob << "You have been lobotomized. Your memories and your former life have been surgically removed from your brain, and while you are lobotomized you remember nothing that ever came before this moment." + + return + +/obj/item/organ/brain/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/weapon/surgicaldrill)) + if(!lobotomized) + user.visible_message("[user] drills [src] deftly with [W], severing part of the brain!") + lobotomize(user) + else + user << "The brain has already been operated on!" + ..() + +/obj/item/organ/brain/process() + ..() + + if(!owner) + return + + if(lobotomized && (owner.getBrainLoss() < 50)) //lobotomized brains cannot be healed with chemistry. Part of the brain is irrevocably missing. Can be fixed magically with cloning, ofc. + owner.setBrainLoss(50) + /obj/item/organ/brain/slime name = "slime core" desc = "A complex, organic knot of jelly and crystalline particles." robotic = 2 icon = 'icons/mob/slimes.dmi' icon_state = "green slime extract" + can_lobotomize = 0 /obj/item/organ/brain/golem name = "chelm" @@ -103,3 +137,4 @@ robotic = 2 icon = 'icons/obj/wizard.dmi' icon_state = "scroll" + can_lobotomize = 0 diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm index 65f6bbe4eb4..8b1eb45df3e 100644 --- a/code/modules/mob/living/carbon/brain/emote.dm +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -66,6 +66,6 @@ src << "\blue Unusable emote '[act]'. Say *help for a list." if (message) - log_emote("[name]/[key] : [message]") + log_emote("[name]/[key] : [message]",ckey=key_name(key)) send_emote(message, m_type) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 72d6b1c8bc0..ec764409986 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -95,5 +95,5 @@ user.attack_log += "\[[time_stamp()]\] Knifed [name] ([ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" src.attack_log += "\[[time_stamp()]\] Got knifed by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" - msg_admin_attack("[key_name(user)] knifed [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" ) + msg_admin_attack("[key_name(user)] knifed [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])",ckey=key_name(user),ckey_target=key_name(src) ) return 1 diff --git a/code/modules/mob/living/carbon/human/diona_gestalt.dm b/code/modules/mob/living/carbon/human/diona_gestalt.dm index 7e4ac2dbb91..43052e5a2da 100644 --- a/code/modules/mob/living/carbon/human/diona_gestalt.dm +++ b/code/modules/mob/living/carbon/human/diona_gestalt.dm @@ -256,7 +256,7 @@ mind.transfer_to(bestNymph) bestNymph.stunned = 0//Switching mind seems to temporarily stun mobs message_admins("\The [src] has split into nymphs; player now controls [key_name_admin(bestNymph)]") - log_admin("\The [src] has split into nymphs; player now controls [key_name(bestNymph)]") + log_admin("\The [src] has split into nymphs; player now controls [key_name(bestNymph)]", ckey=key_name(bestNymph)) //If bestNymph is still null at this point, it could only mean every nymph in the gestalt was a player //In this unfathomably rare case, the gestalt player simply dies as its mob is qdel'd. diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 4b9951645a8..b5f144730e9 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -629,7 +629,7 @@ wink, yawn, swish, sway/wag, fastsway/qwag, stopsway/swag, beep, ping, buzz"} if (message) - log_emote("[name]/[key] : [message]") + log_emote("[name]/[key] : [message]",ckey=key_name(src)) custom_emote(m_type,message) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index e9fa53899a0..07dfd95a69a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -87,7 +87,7 @@ organs_by_name = null bad_internal_organs = null bad_external_organs = null - + QDEL_NULL(DS) // qdel and null out our equipment. QDEL_NULL(shoes) @@ -904,7 +904,7 @@ else target.show_message("\blue You hear a voice that seems to echo around the room: [say]") usr.show_message("\blue You project your mind into [target.real_name]: [say]") - log_say("[key_name(usr)] sent a telepathic message to [key_name(target)]: [say]") + log_say("[key_name(usr)] sent a telepathic message to [key_name(target)]: [say]",ckey=key_name(usr)) for(var/mob/dead/observer/G in world) G.show_message("Telepathic message from [src] to [target]: [say]") @@ -1128,7 +1128,7 @@ else usr << "You failed to check the pulse. Try again." -/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour) +/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/kpg=0) if(!dna) if(!new_species) @@ -1180,7 +1180,7 @@ species.create_organs(src) - species.handle_post_spawn(src) + species.handle_post_spawn(src,kpg) // should be zero by default maxHealth = species.total_health @@ -1207,7 +1207,6 @@ exhaust_threshold = species.exhaust_threshold max_nutrition = BASE_MAX_NUTRITION * species.max_nutrition_factor - nutrition = (rand(25,100)*0.01)*max_nutrition//Starting nutrition is randomised between 25-100% of max nutrition_loss = HUNGER_FACTOR * species.nutrition_loss_factor if(species) @@ -1407,9 +1406,11 @@ var/obj/item/organ/external/current_limb = organs_by_name[choice] if(self) - src << "You brace yourself to relocate your [current_limb.joint]..." + U.visible_message("[U] tries to relocate their [current_limb.joint]...", \ + "You brace yourself to relocate your [current_limb.joint]...") else - U << "You begin to relocate [S]'s [current_limb.joint]..." + U.visible_message("[U] tries to relocate [S]'s [current_limb.joint]...", \ + "You begin to relocate [S]'s [current_limb.joint]...") if(!do_after(U, 30)) return @@ -1417,10 +1418,11 @@ return if(self) - src << "You pop your [current_limb.joint] back in!" + U.visible_message("[U] pops their [current_limb.joint] back in!", \ + "You pop your [current_limb.joint] back in!") else - U << "You pop [S]'s [current_limb.joint] back in!" - S << "[U] pops your [current_limb.joint] back in!" + U.visible_message("[U] pops [S]'s [current_limb.joint] back in!", \ + "You pop [S]'s [current_limb.joint] back in!") current_limb.undislocate() /mob/living/carbon/human/drop_from_inventory(var/obj/item/W, var/atom/Target = null) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 85388836861..cfb61629a2c 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -42,7 +42,7 @@ M.attack_log += text("\[[time_stamp()]\] Stungloved [src.name] ([src.ckey])") src.attack_log += text("\[[time_stamp()]\] Has been stungloved by [M.name] ([M.ckey])") - msg_admin_attack("[key_name_admin(M)] stungloved [src.name] ([src.ckey]) (JMP)") + msg_admin_attack("[key_name_admin(M)] stungloved [src.name] ([src.ckey]) (JMP)",ckey=key_name(M),ckey_target=key_name(src)) var/armorblock = run_armor_check(M.zone_sel.selecting, "energy") apply_effects(5,5,0,0,5,0,0,0,0,armorblock) @@ -256,7 +256,7 @@ playsound(loc, ((miss_type) ? (miss_type == 1 ? attack.miss_sound : 'sound/weapons/thudswoosh.ogg') : attack.attack_sound), 25, 1, -1) H.attack_log += text("\[[time_stamp()]\] [miss_type ? (miss_type == 1 ? "Missed" : "Blocked") : "[pick(attack.attack_verb)]"] [src.name] ([src.ckey])") src.attack_log += text("\[[time_stamp()]\] [miss_type ? (miss_type == 1 ? "Was missed by" : "Has blocked") : "Has Been [pick(attack.attack_verb)]"] by [H.name] ([H.ckey])") - msg_admin_attack("[key_name(H)] [miss_type ? (miss_type == 1 ? "has missed" : "was blocked by") : "has [pick(attack.attack_verb)]"] [key_name(src)] (JMP)") + msg_admin_attack("[key_name(H)] [miss_type ? (miss_type == 1 ? "has missed" : "was blocked by") : "has [pick(attack.attack_verb)]"] [key_name(src)] (JMP)",ckey=key_name(H),ckey_target=key_name(src)) if(miss_type) return 0 @@ -284,7 +284,7 @@ M.attack_log += text("\[[time_stamp()]\] Disarmed [src.name] ([src.ckey])") src.attack_log += text("\[[time_stamp()]\] Has been disarmed by [M.name] ([M.ckey])") - msg_admin_attack("[key_name(M)] disarmed [src.name] ([src.ckey]) (JMP)") + msg_admin_attack("[key_name(M)] disarmed [src.name] ([src.ckey]) (JMP)",ckey=key_name(M),ckey_target=key_name(src)) M.do_attack_animation(src) if(w_uniform) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 378a608477a..20be31ba44f 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -54,7 +54,7 @@ emp_act c_hand = r_hand if(c_hand && (stun_amount || agony_amount > 10)) - msg_admin_attack("[src.name] ([src.ckey]) was disarmed by a stun effect (JMP)") + msg_admin_attack("[src.name] ([src.ckey]) was disarmed by a stun effect (JMP)",ckey=key_name(src)) drop_from_inventory(c_hand) if (affected.status & ORGAN_ROBOT) @@ -337,7 +337,7 @@ emp_act src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [M.name] ([assailant.ckey])") M.attack_log += text("\[[time_stamp()]\] Hit [src.name] ([src.ckey]) with a thrown [O]") if(!istype(src,/mob/living/simple_animal/mouse)) - msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (JMP)") + msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (JMP)",ckey=key_name(M),ckey_target=key_name(src)) //thrown weapon embedded object code. if(dtype == BRUTE && istype(O,/obj/item)) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 80598442e9b..f66487eba60 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -122,7 +122,7 @@ . = ..() if (is_noisy) var/turf/T = get_turf(src) - if (T.x == last_x && T.y == last_y) + if ((T.x == last_x && T.y == last_y) || !T.footstep_sound) return last_x = T.x last_y = T.y diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 42af72ea3c5..172927cc474 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -25,6 +25,11 @@ //processing internal organs is pretty cheap, do that first. for(var/obj/item/organ/I in internal_organs) + if (QDELETED(I)) + log_debug("Organ [DEBUG_REF(src)] was not properly removed from its parent!") + internal_organs -= I + continue + I.process() handle_stance() diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index b8b2d64e8ad..978bfa6cd90 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -185,7 +185,7 @@ src << "Not even a [src.species.name] can speak to the dead." return - log_say("[key_name(src)] communed to [key_name(M)]: [text]") + log_say("[key_name(src)] communed to [key_name(M)]: [text]",ckey=key_name(src)) M << "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]" if(istype(M,/mob/living/carbon/human)) @@ -215,7 +215,7 @@ var/msg = sanitize(input("Message:", "Psychic Whisper") as text|null) if(msg) - log_say("PsychicWhisper: [key_name(src)]->[M.key] : [msg]") + log_say("PsychicWhisper: [key_name(src)]->[M.key] : [msg]",ckey=key_name(src)) M << "\green You hear a strange, alien voice in your head... \italic [msg]" src << "\green You said: \"[msg]\" to [M]" return @@ -249,13 +249,13 @@ if(istype(G.affecting,/mob/living/carbon/human)) var/mob/living/carbon/human/H = G.affecting H.apply_damage(25,BRUTE, sharp=1, edge=1) - msg_admin_attack("[key_name_admin(src)] mandible'd [key_name_admin(H)] (JMP)") + msg_admin_attack("[key_name_admin(src)] mandible'd [key_name_admin(H)] (JMP)",ckey=key_name(src),ckey_target=key_name(H)) else var/mob/living/M = G.affecting if(!istype(M)) return M.apply_damage(25,BRUTE, sharp=1, edge=1) - msg_admin_attack("[key_name_admin(src)] mandible'd [key_name_admin(M)] (JMP)") + msg_admin_attack("[key_name_admin(src)] mandible'd [key_name_admin(M)] (JMP)",ckey=key_name(src),ckey_target=key_name(M)) playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1) /mob/living/carbon/human/proc/detonate_flechettes() @@ -423,7 +423,7 @@ src << "[M]'s hivenet implant is inactive!" return - log_say("[key_name(src)] issued a hivenet order to [key_name(M)]: [text]") + log_say("[key_name(src)] issued a hivenet order to [key_name(M)]: [text]",ckey=key_name(src)) if(istype(M, /mob/living/carbon/human) && isvaurca(M)) M << " You feel a buzzing in the back of your head, and your mind fills with the authority of [src.real_name], your ruler:" @@ -459,4 +459,4 @@ playsound(src.loc, 'sound/weapons/bladeslice.ogg', 50, 1) var/obj/item/weapon/arrow/quill/A = new /obj/item/weapon/arrow/quill(usr.loc) A.throw_at(target, 10, 30, user) - msg_admin_attack("[key_name_admin(src)] launched a quill at [key_name_admin(target)] (JMP)") + msg_admin_attack("[key_name_admin(src)] launched a quill at [key_name_admin(target)] (JMP)",ckey=key_name(src),ckey_target=key_name(target)) diff --git a/code/modules/mob/living/carbon/human/intoxication.dm b/code/modules/mob/living/carbon/human/intoxication.dm index 24fae1d543d..4b838894c46 100644 --- a/code/modules/mob/living/carbon/human/intoxication.dm +++ b/code/modules/mob/living/carbon/human/intoxication.dm @@ -12,7 +12,7 @@ #define BASE_DIZZY 100 -#define ALCOHOL_FILTRATION_RATE 0.02//The base rate at which intoxication decreases per proc. this is actually multiplied by 3 most of the time if the liver is healthy +#define ALCOHOL_FILTRATION_RATE 0.015//The base rate at which intoxication decreases per proc. this is actually multiplied by 3 most of the time if the liver is healthy #define BASE_VOMIT_CHANCE 2 #define VOMIT_CHANCE_SCALE 0.2//An extra 1% for every 5 units over the vomiting threshold @@ -26,6 +26,17 @@ var/mob/living/carbon/human/alcohol_clumsy = 0 intoxication = 0 return + //Godmode messes some things up, so no more BSTs getting drunk unless they toggle it off + if (status_flags & GODMODE) + intoxication = 0 //Zero out intoxication but don't return, let the rest of this function run to remove any residual effects + slurring = 0 + confused = 0 + eye_blurry = 0 + drowsyness = 0 + paralysis = 0 + sleeping = 0 + //Many of these parameters normally tick down in life code, but some parts of that code don't run in godmode, so this prevents a BST being stuck with blurred vision + if(intoxication > AE_DIZZY*SR) // Early warning if (dizziness == 0) src << "The room starts spinning!" diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index d4418b7ef3c..56757d27653 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -437,8 +437,4 @@ This saves us from having to call add_fingerprint() any time something is put in if (shoes:silent) return - var/turf/T = get_turf(src) - if (!istype(T) || !T.footstep_sound) - return - is_noisy = TRUE diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 674304f1e33..08edfe79077 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -133,6 +133,9 @@ pressure_adjustment_coefficient = min(1,max(pressure_adjustment_coefficient,0)) // So it isn't less than 0 or larger than 1. + if(src.get_species() == "Industrial Frame") + pressure_adjustment_coefficient = 0 // woo, back-mounted cooling! + return pressure_adjustment_coefficient // Calculate how much of the enviroment pressure-difference affects the human. @@ -169,19 +172,26 @@ if(species.vision_organ) vision = internal_organs_by_name[species.vision_organ] - if(!vision) // Presumably if a species has no vision organs, they see via some other means. - eye_blind = 0 - blinded = 0 - eye_blurry = 0 - else if(vision.is_broken()) // Vision organs cut out or broken? Permablind. - eye_blind = 1 - blinded = 1 + if (!vision) + if (species.vision_organ) // if they should have eyes but don't, they can't see + eye_blind = 1 + blinded = 1 + eye_blurry = 1 + else // if they're not supposed to have a vision organ, then they must see by some other means + eye_blind = 0 + blinded = 0 + eye_blurry = 0 + else if (vision.is_broken()) // if their eyes have been damaged or detached, they're blinded + eye_blind = 1 + blinded = 1 eye_blurry = 1 else //blindness if(!(sdisabilities & BLIND)) if(equipment_tint_total >= TINT_BLIND) // Covered eyes, heal faster eye_blurry = max(eye_blurry-2, 0) + else + eye_blurry = max(eye_blurry-1, 0) if (disabilities & EPILEPSY) if ((prob(1) && paralysis < 1)) @@ -916,9 +926,6 @@ if (intoxication) handle_intoxication() - else if (alcohol_clumsy)//This var is defined in intoxication.dm, its set true when alcohol has caused clumsiness - mutations.Remove(CLUMSY) - alcohol_clumsy = 0 if(status_flags & GODMODE) return 0 //godmode diff --git a/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm b/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm index 1fa56fb12e9..e1f41a01cf7 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm @@ -16,6 +16,7 @@ has_organ = list() //skeletons are empty shells for now, maybe we can add something in the future siemens_coefficient = 0 ethanol_resistance = -1 //no drunk skeletons + breakcuffs = list(MALE,FEMALE,NEUTER) virus_immune = 1 diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 7a04d4e972e..6b79ea72b4e 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -317,13 +317,18 @@ H.verbs |= verb_path return -/datum/species/proc/handle_post_spawn(var/mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment. +/datum/species/proc/handle_post_spawn(var/mob/living/carbon/human/H,var/kpg = 0) //Handles anything not already covered by basic species assignment. Keepgene value should only be used by genetics. add_inherent_verbs(H) H.mob_bump_flag = bump_flag H.mob_swap_flags = swap_flags H.mob_push_flags = push_flags H.pass_flags = pass_flags H.mob_size = mob_size + if(!kpg) + if(islesserform(H)) + H.dna.SetSEState(MONKEYBLOCK,1) + else + H.dna.SetSEState(MONKEYBLOCK,0) /datum/species/proc/handle_death(var/mob/living/carbon/human/H, var/gibbed = 0) //Handles any species-specific death events (such as dionaea nymph spawns). return diff --git a/code/modules/mob/living/carbon/human/species/station/machine_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/machine_subspecies.dm index 39e460840ed..bdd0b4a06fa 100644 --- a/code/modules/mob/living/carbon/human/species/station/machine_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/machine_subspecies.dm @@ -35,7 +35,7 @@ "Your synthetic flesh crawls in the heat, swelling into a disgusting morass of plastic." ) - appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_EYE_COLOR | HAS_FBP + appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_EYE_COLOR | HAS_FBP | HAS_UNDERWEAR | HAS_SOCKS has_limbs = list( "chest" = list("path" = /obj/item/organ/external/chest/shell), @@ -120,7 +120,7 @@ "r_foot" = list("path" = /obj/item/organ/external/foot/right/industrial) ) - appearance_flags = HAS_HAIR_COLOR + appearance_flags = HAS_EYE_COLOR heat_level_1 = 600 heat_level_2 = 1200 @@ -213,12 +213,10 @@ has_organ = list( "brain" = /obj/item/organ/mmi_holder/posibrain/terminator, "shielded cell" = /obj/item/organ/cell/terminator, - "optics" = /obj/item/organ/optical_sensor/terminator, + "optics" = /obj/item/organ/eyes/optical_sensor/terminator, "data core" = /obj/item/organ/data ) - vision_organ = "optics" - has_limbs = list( "chest" = list("path" = /obj/item/organ/external/chest/terminator), "groin" = list("path" = /obj/item/organ/external/groin/terminator), diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm index 2368fa0ecbb..bc0f66ecc19 100644 --- a/code/modules/mob/living/carbon/human/species/station/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm @@ -60,13 +60,24 @@ icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi' deform = 'icons/mob/human_races/monkeys/r_farwa.dmi' - greater_form = "Tajaran" + greater_form = "Tajara" default_language = "Farwa" flesh_color = "#AFA59E" base_color = "#333333" tail = "farwatail" holder_type = /obj/item/weapon/holder/monkey/farwa +/datum/species/monkey/tajaran/get_random_name() + return "farwa ([rand(100,999)])" // HACK HACK HACK, oh lords of coding please forgive me! + +/datum/species/monkey/tajaran/m_sai + name = "M'sai Farwa" + greater_form = "M'sai Tajara" + +/datum/species/monkey/tajaran/zhan_khazan + name = "Zhan-Khazan Farwa" + greater_form = "Zhan-Khazan Tajara" + /datum/species/monkey/skrell name = "Neaera" short_name = "nea" diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 2ec56544d9f..b267be46abb 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -403,7 +403,7 @@ has_organ = list( "brain" = /obj/item/organ/mmi_holder/posibrain, "cell" = /obj/item/organ/cell, - "optics" = /obj/item/organ/optical_sensor, + "optics" = /obj/item/organ/eyes/optical_sensor, "ipc tag" = /obj/item/organ/ipc_tag ) diff --git a/code/modules/mob/living/carbon/human/species/station/tajaran_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/tajaran_subspecies.dm index 7bb33ad54b6..cd807a59cf5 100644 --- a/code/modules/mob/living/carbon/human/species/station/tajaran_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/tajaran_subspecies.dm @@ -23,6 +23,8 @@ heat_level_2 = 360 //RaceDefault 380 Default 400 heat_level_3 = 700 //RaceDefault 800 Default 1000 + primitive_form = "Zhan-Khazan Farwa" + num_alternate_languages = 1 // Only one Extra Language /datum/species/tajaran/m_sai @@ -48,4 +50,6 @@ heat_level_2 = 390 //RaceDefault 380 Default 400 heat_level_3 = 900 //RaceDefault 800 Default 1000 + primitive_form = "M'sai Farwa" + secondary_langs = list(LANGUAGE_SIIK_MAAS, LANGUAGE_SIIK_TAJR, LANGUAGE_SIGN_TAJARA) diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index 2f7279a6c2e..2609ba01d35 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -74,7 +74,7 @@ if(!message || message=="") return - log_whisper("[key_name(src)] : ([get_lang_name(speaking)]) [message]") + log_whisper("[key_name(src)] : ([get_lang_name(speaking)]) [message]",ckey=key_name(src)) //looks like this only appears in whisper. Should it be elsewhere as well? Maybe handle_speech_problems? var/voice_sub diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 923cc05d5bc..13a3be800fd 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -766,7 +766,7 @@ default behaviour is: return 0 message_admins("[key_name_admin(possessor)] has taken control of \the [src].") - log_admin("[key_name(possessor)] took control of \the [src].") + log_admin("[key_name(possessor)] took control of \the [src].",admin_key=key_name(possessor)) src.ckey = possessor.ckey qdel(possessor) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index b96d9ac06c5..6934634711a 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -181,7 +181,7 @@ src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [M.name] ([assailant.ckey])") M.attack_log += text("\[[time_stamp()]\] Hit [src.name] ([src.ckey]) with a thrown [O]") if(!istype(src,/mob/living/simple_animal/mouse)) - msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (JMP)") + msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (JMP)",ckey=key_name(M),ckey_target=key_name(src)) // Begin BS12 momentum-transfer code. var/mass = 1.5 diff --git a/code/modules/mob/living/parasite/meme.dm b/code/modules/mob/living/parasite/meme.dm index 17cdbc70b23..0da039acaaa 100644 --- a/code/modules/mob/living/parasite/meme.dm +++ b/code/modules/mob/living/parasite/meme.dm @@ -204,7 +204,7 @@ var/controlling var/message = sanitize(input("Message:", "Thought") as text|null) if(message) - log_say("MemeThought: [key_name(src)]->[M.key] : [message]") + log_say("MemeThought: [key_name(src)]->[M.key] : [message]",ckey=key_name(src)) M << "[message]" src << "You said: \"[message]\" to [M]" return @@ -401,7 +401,7 @@ var/controlling src.enter_host(target) usr << "You successfully jumped to [target]." - log_admin("[src.key] has jumped to [target]") + log_admin("[src.key] has jumped to [target]",ckey=key_name(src)) message_admins("[src.key] has jumped to [target]") // Jump to a distant target through a shout @@ -440,7 +440,7 @@ var/controlling src.enter_host(target) usr << "You successfully jumped to [target]." - log_admin("[src.key] has jumped to [target]") + log_admin("[src.key] has jumped to [target]",ckey=key_name(src)) message_admins("[src.key] has jumped to [target]") // Jump to an attuned mob for free @@ -464,7 +464,7 @@ var/controlling usr << "You successfully jumped to [target]." - log_admin("[src.key] has jumped to [target]") + log_admin("[src.key] has jumped to [target]",ckey=key_name(src)) message_admins("[src.key] has jumped to [target]") // ATTUNE a mob, adding it to the indoctrinated list @@ -485,7 +485,7 @@ var/controlling usr << "You successfully indoctrinated [host]." host << "\red Your head feels a bit roomier.." - log_admin("[src.key] has attuned [host]") + log_admin("[src.key] has attuned [host]",ckey=key_name(src)) message_admins("[src.key] has attuned [host]") // Enables the mob to take a lot more damage diff --git a/code/modules/mob/living/parasite/meme_captive.dm b/code/modules/mob/living/parasite/meme_captive.dm index 42a452a7f05..753e639fa04 100644 --- a/code/modules/mob/living/parasite/meme_captive.dm +++ b/code/modules/mob/living/parasite/meme_captive.dm @@ -15,7 +15,7 @@ message = sanitize(message) if (!message) return - log_say("[key_name(src)] : [message]") + log_say("[key_name(src)] : [message]",ckey=key_name(src)) if (stat == 2) return say_dead(message) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 331f74b9d85..98858cef311 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -225,10 +225,9 @@ proc/get_radio_key_from_channel(var/channel) if (speech_sound) sound_vol *= 0.5 - var/turf/T = get_turf(src) - var/list/listening = list() var/list/listening_obj = list() + var/turf/T = get_turf(src) if(T) //make sure the air can transmit speech - speaker's side @@ -241,26 +240,8 @@ proc/get_radio_key_from_channel(var/channel) italics = 1 sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact - var/list/hear = hear(message_range,T) - var/list/hearturfs = list() + get_mobs_and_objs_in_view_fast(T, message_range, listening, listening_obj) - for(var/I in hear) - if(ismob(I)) - var/mob/M = I - listening += M - hearturfs += M.locs[1] - else if(isobj(I)) - var/obj/O = I - hearturfs += O.locs[1] - listening_obj |= O - - - for(var/mob/M in player_list) - if(src.client && M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS)) - listening |= M - continue - if(M.loc && M.locs[1] in hearturfs) - listening |= M var/speech_bubble_test = say_test(message) var/image/speech_bubble = image('icons/mob/talk.dmi',src,"h[speech_bubble_test]") @@ -275,11 +256,11 @@ proc/get_radio_key_from_channel(var/channel) if(O) //It's possible that it could be deleted in the meantime. O.hear_talk(src, message, verb, speaking) - log_say("[key_name(src)] : ([get_lang_name(speaking)]) [message]") + log_say("[key_name(src)] : ([get_lang_name(speaking)]) [message]",ckey=key_name(src)) return 1 /mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language) - log_say("[key_name(src)] : ([get_lang_name(language)]) [message]") + log_say("[key_name(src)] : ([get_lang_name(language)]) [message]",ckey=key_name(src)) for (var/mob/O in viewers(src, null)) O.hear_signlang(message, verb, language, src) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 115473270c0..ec38053e190 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -163,6 +163,8 @@ var/list/ai_verbs_default = list( else if (B.brainmob.mind) B.brainmob.mind.transfer_to(src) + if(B.brainobj) + B.brainobj.lobotomized = 1 on_mob_init() @@ -271,7 +273,7 @@ var/list/ai_verbs_default = list( aiPDA.ownjob = "AI" aiPDA.owner = pickedName aiPDA.name = pickedName + " (" + aiPDA.ownjob + ")" - + setup_icon() //this is because the ai custom name is related to the ai name, so, we just call the setup icon after someone named their ai /* @@ -423,7 +425,7 @@ var/list/ai_verbs_default = list( return Centcomm_announce(input, usr) usr << "Message transmitted." - log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]") + log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]",ckey=key_name(usr)) emergency_message_cooldown = 1 spawn(300) emergency_message_cooldown = 0 diff --git a/code/modules/mob/living/silicon/ai/login.dm b/code/modules/mob/living/silicon/ai/login.dm index 6851467b551..31e46f09788 100644 --- a/code/modules/mob/living/silicon/ai/login.dm +++ b/code/modules/mob/living/silicon/ai/login.dm @@ -8,6 +8,7 @@ flash.name = "flash" flash.screen_loc = ui_entire_screen flash.layer = 17 + flash.mouse_opacity = 0 blind = new /obj/screen() blind.icon_state = "black" blind.name = " " diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index e73e71cbe42..c494998119e 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -337,6 +337,8 @@ var/turf/T = get_turf(src) if(istype(T)) T.visible_message("[src] folds outwards, expanding into a mobile form.") + canmove = 1 + resting = 0 /mob/living/silicon/pai/verb/fold_up() set category = "pAI Commands" diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index d6ddae33231..fd926a55db7 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -82,7 +82,7 @@ var/list/mob_hat_cache = list() possessor << "\The [src] already has a player." return 0 message_admins("[key_name_admin(possessor)] has taken control of \the [src].") - log_admin("[key_name(possessor)] took control of \the [src].") + log_admin("[key_name(possessor)] took control of \the [src].",ckey=key_name(possessor)) transfer_personality(possessor.client) qdel(possessor) return 1 @@ -234,7 +234,7 @@ var/list/mob_hat_cache = list() src << "You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script." message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.") - log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.") + log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.",ckey=key_name(user),ckey_target=key_name(src)) var/time = time2text(world.realtime,"hh:mm:ss") lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])") diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index a2fa7c29d1e..f5ec4028e91 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -89,7 +89,7 @@ if(D.stat != 2) usr << "You issue a kill command for the unfortunate drone." message_admins("[key_name_admin(usr)] issued kill order for drone [key_name_admin(D)] from control console.") - log_game("[key_name(usr)] issued kill order for [key_name(src)] from control console.") + log_game("[key_name(usr)] issued kill order for [key_name(src)] from control console.",ckey=key_name(usr),ckey_target=key_name(src)) D.shut_down() else if (href_list["search_fab"]) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index e2d312f9246..4438c4bcc81 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -75,6 +75,9 @@ if(istype(W,/obj/item/weapon/cigbutt)) if(plastic) plastic.add_charge(500) + else if (istype(W, /obj/item/weapon/flame/match)) + if (wood) + wood.add_charge(100) else if(istype(W,/obj/effect/spider/spiderling)) if(wood) wood.add_charge(2000) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index bd865a06e85..08ebdaa801e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -129,6 +129,8 @@ icontype = "Basic" updatename(modtype) updateicon() + if(mmi && mmi.brainobj) + mmi.brainobj.lobotomized = 1 radio = new /obj/item/device/radio/borg(src) common_radio = radio @@ -955,6 +957,12 @@ gib() return +/mob/living/silicon/robot/update_canmove() // to fix lockdown issues w/ chairs + . = ..() + if (lockcharge) + canmove = 0 + . = 0 + /mob/living/silicon/robot/proc/UnlinkSelf() disconnect_from_ai() lawupdate = 0 @@ -1129,7 +1137,7 @@ disconnect_from_ai() user << "You emag [src]'s interface." message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.") - log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") + log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.",ckey=key_name(user),ckey_target=key_name(src)) clear_supplied_laws() clear_inherent_laws() laws = new /datum/ai_laws/syndicate_override diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 03a121bd61e..3eeb1f30bbd 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -208,6 +208,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/medical/general/New() ..() + src.modules += new /obj/item/weapon/crowbar(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/weapon/reagent_containers/borghypo/medical(src) @@ -476,6 +477,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/security/general/New() ..() + src.modules += new /obj/item/weapon/crowbar(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/hud/sec(src) src.modules += new /obj/item/weapon/handcuffs/cyborg(src) @@ -512,6 +514,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/janitor/New() ..() + src.modules += new /obj/item/weapon/crowbar(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/soap/nanotrasen(src) src.modules += new /obj/item/weapon/storage/bag/trash(src) @@ -562,6 +565,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/clerical/butler/New() ..() + src.modules += new /obj/item/weapon/crowbar(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/gripper/service(src) src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src) @@ -598,6 +602,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/clerical/general/New() ..() + src.modules += new /obj/item/weapon/crowbar(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/pen/robopen(src) src.modules += new /obj/item/weapon/form_printer(src) @@ -631,6 +636,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/miner/New() ..() + src.modules += new /obj/item/weapon/crowbar(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/material(src) src.modules += new /obj/item/weapon/wrench(src) diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 16a00368a80..9b6c5a5dfd1 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -2,7 +2,7 @@ return ..(sanitize ? sanitize(message) : message) /mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) - log_say("[key_name(src)] : [message]") + log_say("[key_name(src)] : [message]",ckey=key_name(src)) /mob/living/silicon/robot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) ..() @@ -61,7 +61,7 @@ //For holopads only. Usable by AI. /mob/living/silicon/ai/proc/holopad_talk(var/message, verb, datum/language/speaking) - log_say("[key_name(src)] : [message]") + log_say("[key_name(src)] : [message]",ckey=key_name(src)) message = trim(message) @@ -115,7 +115,7 @@ /mob/living/silicon/ai/proc/holopad_emote(var/message) //This is called when the AI uses the 'me' verb while using a holopad. - log_emote("[key_name(src)] : [message]") + log_emote("[key_name(src)] : [message]",ckey=key_name(src)) message = trim(message) diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm index 362b6b10bcf..7d591f571d4 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_captive.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm @@ -15,7 +15,7 @@ message = sanitize(message) if (!message) return - log_say("[key_name(src)] : [message]") + log_say("[key_name(src)] : [message]",ckey=key_name(src)) if (stat == 2) return say_dead(message) diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index b03fe79b143..cfe01bf9b52 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -26,7 +26,7 @@ M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey]) (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey]) (JMP)",ckey=key_name(src),ckey_target=key_name(M)) transfer_soul("VICTIM", M, user) return diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index ff32edd1782..9aa47ccbe26 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -76,7 +76,7 @@ visible += O if(visible.len) var/atom/A = pick(visible) - visible_emote("suddenly stops and stares at something unseen[istype(A) ? " near [A]":""].") + visible_emote("suddenly stops and stares at something unseen[istype(A) ? " near [A]":""].",0) /mob/living/simple_animal/cat/proc/handle_movement_target() //if our target is neither inside a turf or inside a human(???), stop @@ -98,14 +98,14 @@ for(var/mob/living/simple_animal/mouse/M in oview(src,1)) if(M.stat != DEAD) M.splat() - visible_emote(pick("bites \the [M]!","toys with \the [M].","chomps on \the [M]!")) + visible_emote(pick("bites \the [M]!","toys with \the [M].","chomps on \the [M]!"),0) movement_target = null stop_automated_movement = 0 if (prob(75)) break//usually only kill one mouse per proc /mob/living/simple_animal/cat/beg(var/atom/thing, var/atom/holder) - visible_emote("licks [get_pronoun(POSESSIVE_ADJECTIVE)] lips and hungrily glares at [holder]'s [thing.name]") + visible_emote("licks [get_pronoun(POSESSIVE_ADJECTIVE)] lips and hungrily glares at [holder]'s [thing.name]",0) /mob/living/simple_animal/cat/Released() //A thrown cat will immediately attack mice near where it lands @@ -209,7 +209,7 @@ visible_emote(pick("nuzzles [friend].", "brushes against [friend].", "rubs against [friend].", - "purrs.")) + "purrs."),0) else if (friend.health <= 50) if (prob(10)) var/verb = pick("meows", "mews", "mrowls") diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index e37ab9450d3..476caea5f89 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -1,12 +1,12 @@ //Corgi /mob/living/simple_animal/corgi - name = "\improper corgi" + name = "corgi" real_name = "corgi" desc = "It's a corgi." icon_state = "corgi" icon_living = "corgi" icon_dead = "corgi_dead" - speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") + speak = list("YAP!", "Woof!", "Bark!", "AUUUUUU!") speak_emote = list("barks", "woofs") emote_hear = list("barks", "woofs", "yaps","pants") emote_see = list("shakes its head", "shivers") @@ -19,7 +19,7 @@ response_harm = "kicks" see_in_dark = 5 mob_size = 5 - max_nutrition = 250//Dogs are insatiable eating monsters. This scales with their mob size too + max_nutrition = 250 //Dogs are insatiable eating monsters. This scales with their mob size too stomach_size_mult = 30 seek_speed = 6 possession_candidate = 1 @@ -29,7 +29,7 @@ /mob/living/simple_animal/corgi/New() ..() - nutrition = max_nutrition * 0.3//Ian doesn't start with a full belly so will be hungry at roundstart + nutrition = max_nutrition * 0.3 //Ian doesn't start with a full belly so will be hungry at roundstart nutrition_step = mob_size * 0.12 //IAN! SQUEEEEEEEEE~ @@ -48,17 +48,15 @@ if(!stat && !resting && !buckled) if(prob(1)) - visible_emote(pick("dances around","chases their tail")) + visible_emote(pick("dances around","chases their tail"),0) spawn(0) for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) set_dir(i) sleep(1) - /mob/living/simple_animal/corgi/beg(var/atom/thing, var/atom/holder) - visible_emote("stares at the [thing] that [holder] has with sad puppy eyes.") - + visible_emote("stares at the [thing] that [holder] has with sad puppy eyes.",0) /obj/item/weapon/reagent_containers/food/snacks/meat/corgi @@ -169,7 +167,7 @@ if(prob(1)) - visible_emote(pick("dances around","chases her tail")) + visible_emote(pick("dances around","chases her tail"),0) spawn(0) for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) set_dir(i) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index ca7bed3bd9b..cabbfd25957 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -31,7 +31,7 @@ ..() /mob/living/simple_animal/hostile/retaliate/goat/beg(var/atom/thing, var/atom/holder) - visible_emote("butts insistently at [holder]'s legs and reaches towards their [thing].") + visible_emote("butts insistently at [holder]'s legs and reaches towards their [thing].",0) /mob/living/simple_animal/hostile/retaliate/goat/Life() . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index 1870454e935..ed6d9b578b2 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -1,11 +1,12 @@ //Foxxy /mob/living/simple_animal/corgi/fox name = "fox" + real_name = "fox" desc = "It's a fox. I wonder what it says?" icon_state = "fox" icon_living = "fox" icon_dead = "fox_dead" - speak = list("Ack-Ack","Ack-Ack-Ack-Ackawoooo","Geckers","Awoo","Tchoff") + speak = list("Ack-Ack.", "Ack-Ack-Ack-Ackawoooo!", "Awoo!", "Tchoff.") speak_emote = list("geckers", "barks") emote_hear = list("howls","barks") emote_see = list("shakes its head", "shivers") @@ -18,8 +19,9 @@ response_disarm = "gently pushes aside" response_harm = "kicks" mob_size = 4 + //Captain fox /mob/living/simple_animal/corgi/fox/Chauncey name = "Chauncey" + real_name = "Chauncey" desc = "Chauncey, the Captain's trustworthy fox. I wonder what it says?" - diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 4b9b3bf0ae5..95379c90a3a 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -125,7 +125,7 @@ /mob/living/simple_animal/mouse/beg(var/atom/thing, var/atom/holder) squeak_soft(0) - visible_emote("squeaks timidly, sniffs the air and gazes longingly up at \the [thing.name].") + visible_emote("squeaks timidly, sniffs the air and gazes longingly up at \the [thing.name].",0) /mob/living/simple_animal/mouse/attack_hand(mob/living/carbon/human/M as mob) if (src.stat == DEAD)//If the mouse is dead, we don't pet it, we just pickup the corpse on click @@ -150,7 +150,7 @@ if (stat == CONSCIOUS) playsound(src, 'sound/effects/mousesqueek.ogg', 70, 1) if (manual) - log_say("[key_name(src)] squeaks! ") + log_say("[key_name(src)] squeaks! ",ckey=key_name(src)) @@ -165,7 +165,7 @@ playsound(src, sound, 5, 1, -4.6) if (manual) - log_say("[key_name(src)] squeaks softly! ") + log_say("[key_name(src)] squeaks softly! ",ckey=key_name(src)) //Plays a loud sound @@ -175,7 +175,7 @@ if (squeals > 0 || !manual) playsound(src, 'sound/effects/creatures/mouse_squeak_loud.ogg', 50, 1) squeals -- - log_say("[key_name(src)] squeals! ") + log_say("[key_name(src)] squeals! ",ckey=key_name(src)) else src << "\red Your hoarse mousey throat can't squeal just now, stop and take a breath!" @@ -184,16 +184,37 @@ /mob/living/simple_animal/mouse/verb/squeak_loud_verb() set name = "Squeal!" set category = "Abilities" + + if (usr.client.handle_spam_prevention(null, MUTE_IC)) + return + else if (usr.client.prefs.muted & MUTE_IC) + usr << "You are muted from IC emotes." + return + squeak_loud(1) /mob/living/simple_animal/mouse/verb/squeak_soft_verb() set name = "Soft Squeaking" set category = "Abilities" + + if (usr.client.handle_spam_prevention(null, MUTE_IC)) + return + else if (usr.client.prefs.muted & MUTE_IC) + usr << "You are muted from IC emotes." + return + squeak_soft(1) /mob/living/simple_animal/mouse/verb/squeak_verb() set name = "Squeak" set category = "Abilities" + + if (usr.client.handle_spam_prevention(null, MUTE_IC)) + return + else if (usr.client.prefs.muted & MUTE_IC) + usr << "You are muted from IC emotes." + return + squeak(1) diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 3308e635310..480ea54e6b2 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -90,11 +90,6 @@ damage = 30 icon_state = "toxin" -/mob/living/simple_animal/hostile/alien/death() - ..() - visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...") - playsound(src, 'sound/voice/hiss6.ogg', 100, 1) - // Xenoarch aliens. /mob/living/simple_animal/hostile/samak name = "samak" diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 7e5f6d5d4a0..f5cc38394f3 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -58,3 +58,25 @@ /mob/living/simple_animal/hostile/faithless/cult/Life() ..() check_horde() + +/mob/living/simple_animal/hostile/faithless/wizard + name = "lost soul" + desc = "The result of a dark bargain." + speed = -3 + maxHealth = 400 + health = 400 + universal_speak = 1 + universal_understand = 1 + + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_NOLIGHTING + harm_intent_damage = 0 + melee_damage_lower = 25 + melee_damage_upper = 25 + var/list/darkform_spells = list(/spell/targeted/ethereal_jaunt/shift, + /spell/aoe_turf/conjure/forcewall/lesser) + +/mob/living/simple_animal/hostile/faithless/wizard/New() + ..() + for(var/spell in darkform_spells) + src.add_spell(new spell, "const_spell_ready") diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index dbacbd9ca34..d0863a4b278 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -84,7 +84,7 @@ var/mob/living/carbon/human/H = . if(prob(poison_per_bite)) var/obj/item/organ/external/O = pick(H.organs) - if(!(O.robotic >= ORGAN_ROBOT)) + if(!(O.status & ORGAN_ROBOT)) var/eggs = new /obj/effect/spider/eggcluster(O, src) O.implants += eggs H << "The [src] injects something into your [O.name]!" diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 53a812f81ee..8c1e9895138 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -339,7 +339,7 @@ //Search for item to steal parrot_interest = search_for_item() if(parrot_interest) - visible_emote("looks in [parrot_interest]'s direction and takes flight") + visible_emote("looks in [parrot_interest]'s direction and takes flight",0) parrot_state = PARROT_SWOOP | PARROT_STEAL icon_state = "parrot_fly" return @@ -361,7 +361,7 @@ if(AM) if(istype(AM, /obj/item) || isliving(AM)) //If stealable item parrot_interest = AM - visible_emote("turns and flies towards [parrot_interest]") + visible_emote("turns and flies towards [parrot_interest]",0) parrot_state = PARROT_SWOOP | PARROT_STEAL return else //Else it's a perch diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 092b9e01f59..24c98cfeb27 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -101,7 +101,7 @@ var/icon_rest = null /mob/living/simple_animal/proc/beg(var/atom/thing, var/atom/holder) - visible_emote("gazes longingly at [holder]'s [thing]") + visible_emote("gazes longingly at [holder]'s [thing]",0) /mob/living/simple_animal/New() ..() @@ -206,23 +206,23 @@ else randomValue -= speak.len if(emote_see && randomValue <= emote_see.len) - visible_emote("[pick(emote_see)].") + visible_emote("[pick(emote_see)].",0) else - audible_emote("[pick(emote_hear)].") + audible_emote("[pick(emote_hear)].",0) else say(pick(speak)) else if(!(emote_hear && emote_hear.len) && (emote_see && emote_see.len)) - visible_emote("[pick(emote_see)].") + visible_emote("[pick(emote_see)].",0) if((emote_hear && emote_hear.len) && !(emote_see && emote_see.len)) - audible_emote("[pick(emote_hear)].") + audible_emote("[pick(emote_hear)].",0) if((emote_hear && emote_hear.len) && (emote_see && emote_see.len)) var/length = emote_hear.len + emote_see.len var/pick = rand(1,length) if(pick <= emote_see.len) - visible_emote("[pick(emote_see)].") + visible_emote("[pick(emote_see)].",0) else - audible_emote("[pick(emote_hear)].") + audible_emote("[pick(emote_hear)].",0) speak_audio() if (can_nap) @@ -345,8 +345,8 @@ /mob/living/simple_animal/proc/speak_audio() return -/mob/living/simple_animal/proc/visible_emote(var/act_desc) - custom_emote(1, act_desc) +/mob/living/simple_animal/proc/visible_emote(var/act_desc, var/log_emote=1) + custom_emote(1, act_desc, log_emote) /mob/living/simple_animal/proc/audible_emote(var/act_desc) custom_emote(2, act_desc) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 7658f28ce1e..70b4c912dab 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -3,7 +3,7 @@ //Multikey checks and logging lastKnownIP = client.address computer_id = client.computer_id - log_access("Login: [key_name(src)] from [lastKnownIP ? lastKnownIP : "localhost"]-[computer_id] || BYOND v[client.byond_version]") + log_access("Login: [key_name(src)] from [lastKnownIP ? lastKnownIP : "localhost"]-[computer_id] || BYOND v[client.byond_version]",ckey=key_name(src)) if(config.log_access) for(var/mob/M in player_list) if(M == src) continue @@ -18,10 +18,10 @@ if(matches) if(M.client) message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) - log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)].") + log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)].",ckey=key_name(src)) else message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) - log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).") + log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).",ckey=key_name(src)) /mob/Login() diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index e7e845bc40e..38ec58506b9 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -1,7 +1,7 @@ /mob/Logout() nanomanager.user_logout(src) // this is used to clean up (remove) this user's Nano UIs player_list -= src - log_access("Logout: [key_name(src)]") + log_access("Logout: [key_name(src)]",ckey=key_name(src)) if(admin_datums[src.ckey]) if (ticker && ticker.current_state == GAME_STATE_PLAYING) //Only report this stuff if we are currently playing. var/admins_number = 0 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 60b6e193fe3..ff44620e461 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -158,21 +158,26 @@ var/range = world.view if(hearing_distance) range = hearing_distance - var/list/hear = get_mobs_or_objects_in_view(range,src) - for(var/I in hear) - if(isobj(I)) - spawn(0) - if(I) //It's possible that it could be deleted in the meantime. - var/obj/O = I - O.show_message( message, 2, deaf_message, 1) - else if(ismob(I)) - var/mob/M = I - var/msg = message - if(self_message && M==src) - msg = self_message - M.show_message( msg, 2, deaf_message, 1) + var/turf/T = get_turf(src) + var/list/mobs = list() + var/list/objs = list() + get_mobs_and_objs_in_view_fast(T, range, mobs, objs) + + + for(var/m in mobs) + var/mob/M = m + if(self_message && M==src) + M.show_message(self_message,2,deaf_message,1) + continue + + M.show_message(message,2,deaf_message,1) + + + for(var/o in objs) + var/obj/O = o + O.show_message(message,2,deaf_message,1) /mob/proc/findname(msg) for(var/mob/M in mob_list) @@ -454,23 +459,23 @@ usr << "You can respawn now, enjoy your new life!" - log_game("[usr.name]/[usr.key] used abandon mob.") + log_game("[usr.name]/[usr.key] used abandon mob.",ckey=key_name(usr)) usr << "Make sure to play a different character, and please roleplay correctly!" if(!client) - log_game("[usr.key] AM failed due to disconnect.") + log_game("[usr.key] AM failed due to disconnect.",ckey=key_name(usr)) return client.screen.Cut() if(!client) - log_game("[usr.key] AM failed due to disconnect.") + log_game("[usr.key] AM failed due to disconnect.",ckey=key_name(usr)) return announce_ghost_joinleave(client, 0) var/mob/new_player/M = new /mob/new_player() if(!client) - log_game("[usr.key] AM failed due to disconnect.") + log_game("[usr.key] AM failed due to disconnect.",ckey=key_name(usr)) qdel(M) return @@ -1210,7 +1215,7 @@ mob/proc/yank_out_object() SetWeakened(200) visible_message("OOC Information: [src] has been winded by a member of staff! Please freeze all roleplay involving their character until the matter is resolved! Adminhelp if you have further questions.", "You have been winded by a member of staff! Please stand by until they contact you!") - log_admin("[key_name(admin)] winded [key_name(src)]!") + log_admin("[key_name(admin)] winded [key_name(src)]!",admin_key=key_name(admin),ckey=key_name(src)) message_admins("[key_name_admin(admin)] winded [key_name_admin(src)]!", 1) feedback_add_details("admin_verb", "WIND") @@ -1226,7 +1231,7 @@ mob/proc/yank_out_object() SetWeakened(0) visible_message("OOC Information: [src] has been unwinded by a member of staff!", "You have been unwinded by a member of staff!") - log_admin("[key_name(admin)] unwinded [key_name(src)]!") + log_admin("[key_name(admin)] unwinded [key_name(src)]!",admin_key=key_name(admin),ckey=key_name(src)) message_admins("[key_name_admin(admin)] unwinded [key_name_admin(src)]!", 1) feedback_add_details("admin_verb", "UNWIND") diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 1316f37a2b3..9d3800ece46 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -262,7 +262,7 @@ assailant.set_dir(get_dir(assailant, affecting)) affecting.attack_log += "\[[time_stamp()]\] Has had their neck grabbed by [assailant.name] ([assailant.ckey])" assailant.attack_log += "\[[time_stamp()]\] Grabbed the neck of [affecting.name] ([affecting.ckey])" - msg_admin_attack("[key_name(assailant)] grabbed the neck of [key_name(affecting)]") + msg_admin_attack("[key_name(assailant)] grabbed the neck of [key_name(affecting)]",ckey=key_name(assailant),ckey_target=key_name(affecting)) hud.icon_state = "kill" hud.name = "kill" affecting.Stun(10) //10 ticks of ensured grab @@ -274,7 +274,7 @@ assailant.visible_message("[assailant] has tightened \his grip on [affecting]'s neck!") affecting.attack_log += "\[[time_stamp()]\] Has been strangled (kill intent) by [assailant.name] ([assailant.ckey])" assailant.attack_log += "\[[time_stamp()]\] Strangled (kill intent) [affecting.name] ([affecting.ckey])" - msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]") + msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]",ckey=key_name(assailant),ckey_target=key_name(affecting)) affecting.setClickCooldown(10) affecting.losebreath += 1 diff --git a/code/modules/mob/mob_grab_specials.dm b/code/modules/mob/mob_grab_specials.dm index 5e66345e2db..28b348a0a62 100644 --- a/code/modules/mob/mob_grab_specials.dm +++ b/code/modules/mob/mob_grab_specials.dm @@ -77,7 +77,7 @@ attacker.attack_log += text("\[[time_stamp()]\] Attacked [target.name]'s eyes using grab ([target.ckey])") target.attack_log += text("\[[time_stamp()]\] Had eyes attacked by [attacker.name]'s grab ([attacker.ckey])") - msg_admin_attack("[key_name(attacker)] attacked [key_name(target)]'s eyes using a grab action.") + msg_admin_attack("[key_name(attacker)] attacked [key_name(target)]'s eyes using a grab action.",ckey=key_name(attacker),ckey_target=key_name(target)) attack.handle_eye_attack(attacker, target) @@ -104,7 +104,7 @@ playsound(attacker.loc, "swing_hit", 25, 1, -1) attacker.attack_log += text("\[[time_stamp()]\] Headbutted [target.name] ([target.ckey])") target.attack_log += text("\[[time_stamp()]\] Headbutted by [attacker.name] ([attacker.ckey])") - msg_admin_attack("[key_name(attacker)] has headbutted [key_name(target)]") + msg_admin_attack("[key_name(attacker)] has headbutted [key_name(target)]",ckey=key_name(attacker),ckey_target=key_name(target)) attacker.drop_from_inventory(src) src.loc = null diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 7e88e115a3a..4f3b35dac37 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/proc/monkeyize() +/mob/living/carbon/human/proc/monkeyize(var/kpg=0) if (transforming) return for(var/obj/item/W in src) @@ -11,8 +11,6 @@ stunned = 1 icon = null invisibility = 101 - for(var/t in organs) - qdel(t) var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) animation.icon_state = "blank" animation.icon = 'icons/mob/mob.dmi' @@ -33,14 +31,55 @@ for(var/obj/item/W in src) drop_from_inventory(W) set_species(species.primitive_form) - dna.SetSEState(MONKEYBLOCK,1) - dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF) + if(!kpg) + dna.SetSEState(MONKEYBLOCK,1) src << "You are now [species.name]. " qdel(animation) return src +/mob/living/carbon/human/proc/humanize(var/kpg=0) // we needed this a lot to be honest, why wasn't it made before? + if (transforming) + return + for(var/obj/item/W in src) + drop_from_inventory(W) + regenerate_icons() + transforming = 1 + canmove = 0 + stunned = 1 + icon = null + invisibility = 101 + var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = src + flick("monkey2h", animation) + sleep(48) + + transforming = 0 + stunned = 0 + update_canmove() + invisibility = initial(invisibility) + + if(!species.greater_form) //If the creature in question has no greater form set, this is going to be messy. + gib() + return + + for(var/obj/item/W in src) + drop_from_inventory(W) + set_species(species.greater_form) + if(!kpg) + dna.SetSEState(MONKEYBLOCK,0) + + src << "You are now [species.name]. " + qdel(animation) + + return src + + + + /mob/new_player/AIize() spawning = 1 return ..() diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm index 58b654d6412..6c672ceec25 100644 --- a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -16,7 +16,7 @@ var/global/ntnrc_uid = 0 ..() /datum/ntnet_conversation/proc/add_message(var/message, var/username, var/mob/user) - log_ntirc("[user.client.ckey]/([username]) : [message]") + log_ntirc("[user.client.ckey]/([username]) : [message]",ckey=key_name(user),conversation=title) message = "[worldtime2text()] [username]: [message]" messages.Add(message) diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index 12f92976f0a..5ecc044b71a 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -35,11 +35,8 @@ check_update_ui_need() /obj/item/modular_computer/proc/get_preset_programs(var/app_preset_name) - log_debug("=== Searchng for matching preset") for (var/datum/modular_computer_app_presets/prs in ntnet_global.available_software_presets) - log_debug("comparing preset [prs.name]") if(prs.name == app_preset_name) - log_debug("preset matched") return prs.return_install_programs() // Used to perform preset-specific hardware changes. @@ -49,10 +46,8 @@ // Used to install preset-specific programs /obj/item/modular_computer/proc/install_default_programs() if(enrolled) - log_debug("=== Calling install programs for preset [_app_preset_name]") var/programs = get_preset_programs(_app_preset_name) for (var/datum/computer_file/program/prog in programs) - log_debug("Installing prog [prog.filename]") hard_drive.store_file(prog) /obj/item/modular_computer/New() diff --git a/code/modules/modular_computers/file_system/programs/command/comm.dm b/code/modules/modular_computers/file_system/programs/command/comm.dm index 330d22899b5..e8d18396614 100644 --- a/code/modules/modular_computers/file_system/programs/command/comm.dm +++ b/code/modules/modular_computers/file_system/programs/command/comm.dm @@ -147,7 +147,7 @@ return Syndicate_announce(input, usr) usr << "Message transmitted." - log_say("[key_name(usr)] has made an illegal announcement: [input]") + log_say("[key_name(usr)] has made an illegal announcement: [input]",ckey=key_name(usr)) centcomm_message_cooldown = 1 spawn(300)//30 second cooldown centcomm_message_cooldown = 0 @@ -167,7 +167,7 @@ return Centcomm_announce(input, usr) usr << "Message transmitted." - log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]") + log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]",ckey=key_name(usr)) centcomm_message_cooldown = 1 spawn(300) //30 second cooldown centcomm_message_cooldown = 0 @@ -210,7 +210,7 @@ if(current_level > SEC_LEVEL_BLUE) current_level = SEC_LEVEL_BLUE //Cannot engage delta with this set_security_level(current_level) if(security_level != old_level) - log_game("[key_name(usr)] has changed the security level to [get_security_level()].") + log_game("[key_name(usr)] has changed the security level to [get_security_level()].",ckey=key_name(usr)) message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") switch(security_level) if(SEC_LEVEL_GREEN) @@ -257,7 +257,7 @@ if("message") status_signal.data["msg1"] = data1 status_signal.data["msg2"] = data2 - log_admin("STATUS: [key_name(usr)] set status screen message with [src]: [data1] [data2]") + log_admin("STATUS: [key_name(usr)] set status screen message with [src]: [data1] [data2]",ckey=key_name(usr)) if("alert") status_signal.data["picture_state"] = data1 diff --git a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm index 558f43181e4..827e931d7d1 100644 --- a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm +++ b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm @@ -74,7 +74,7 @@ var/warrant_uid = 0 if(!istype(user)) return var/obj/item/weapon/card/id/I = user.GetIdCard() - if(!istype(I) || !I.registered_name || !(access_armory in I.access)) + if(!istype(I) || !I.registered_name || !(access_armory in I.access) || issilicon(user)) to_chat(user, "Authentication error: Unable to locate ID with apropriate access to allow this operation.") return diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index c0db16020eb..f70ad4ddf62 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -27,24 +27,24 @@ var/list/organ_cache = list() var/datum/species/species var/emp_coeff = 1 //coefficient for damages taken by EMP, if the organ is robotic. + var/force_skintone = FALSE // If true, icon generation will skip is-robotic checks. Used for synthskin limbs. + /obj/item/organ/Destroy() processing_objects -= src if(!owner) return ..() if(istype(owner, /mob/living/carbon)) - if((owner.internal_organs) && (src in owner.internal_organs)) + if(owner.internal_organs) owner.internal_organs -= src if(istype(owner, /mob/living/carbon/human)) - if((owner.internal_organs_by_name) && (src in owner.internal_organs_by_name)) + if(owner.internal_organs_by_name) owner.internal_organs_by_name -= src - if((owner.organs) && (src in owner.organs)) + if(owner.organs) owner.organs -= src - if((owner.organs_by_name) && (src in owner.organs_by_name)) + if(owner.organs_by_name) owner.organs_by_name -= src - if(src in owner.contents) - owner.contents -= src - + owner = null QDEL_NULL(dna) @@ -103,6 +103,11 @@ var/list/organ_cache = list() if(loc != owner) owner = null + if (QDELETED(src)) + log_debug("QDELETED organ [DEBUG_REF(src)] had process() called!") + processing_objects -= src + return + //dead already, no need for more processing if(status & ORGAN_DEAD) return @@ -117,6 +122,10 @@ var/list/organ_cache = list() return if(!owner) + if (QDELETED(reagents)) + log_debug("Organ [DEBUG_REF(src)] had QDELETED reagents! Regenerating.") + create_reagents(5) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list if(B && prob(40)) reagents.remove_reagent("blood",0.1) @@ -306,7 +315,7 @@ var/list/organ_cache = list() if(user) user.attack_log += "\[[time_stamp()]\] removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)])" owner.attack_log += "\[[time_stamp()]\] had a vital organ ([src]) removed by [user.name] ([user.ckey]) (INTENT: [uppertext(user.a_intent)])" - msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(owner)) owner.death() owner = null diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index c8ccfd068bc..8eb4e04c6bf 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -939,7 +939,8 @@ Note that amputating the affected organ does in fact remove the infection from t /*if(species && !(species.name in R.species_can_use && species.get_bodytype() != "Machine")) R = basic_robolimb*/ if(R) - force_icon = R.icon + if (!force_skintone) + force_icon = R.icon name = "[R.company] [initial(name)]" desc = "[R.desc]" if(R.paintable) @@ -1122,171 +1123,3 @@ Note that amputating the affected organ does in fact remove the infection from t if(6 to INFINITY) flavor_text += "a ton of [wound]\s" return english_list(flavor_text) - -/**************************************************** - ORGAN DEFINES -****************************************************/ - -/obj/item/organ/external/chest - name = "upper body" - limb_name = "chest" - icon_name = "torso" - max_damage = 100 - min_broken_damage = 35 - w_class = 5 - body_part = UPPER_TORSO - vital = 1 - amputation_point = "spine" - joint = "neck" - dislocated = -1 - gendered_icon = 1 - cannot_amputate = 1 - parent_organ = null - encased = "ribcage" - -/obj/item/organ/external/groin - name = "lower body" - limb_name = "groin" - icon_name = "groin" - max_damage = 100 - min_broken_damage = 35 - w_class = 5 - body_part = LOWER_TORSO - vital = 1 - parent_organ = "chest" - amputation_point = "lumbar" - joint = "hip" - dislocated = -1 - gendered_icon = 1 - -/obj/item/organ/external/arm - limb_name = "l_arm" - name = "left arm" - icon_name = "l_arm" - max_damage = 50 - min_broken_damage = 30 - w_class = 3 - body_part = ARM_LEFT - parent_organ = "chest" - joint = "left elbow" - amputation_point = "left shoulder" - can_grasp = 1 - -/obj/item/organ/external/arm/right - limb_name = "r_arm" - name = "right arm" - icon_name = "r_arm" - body_part = ARM_RIGHT - joint = "right elbow" - amputation_point = "right shoulder" - -/obj/item/organ/external/leg - limb_name = "l_leg" - name = "left leg" - icon_name = "l_leg" - max_damage = 50 - min_broken_damage = 30 - w_class = 3 - body_part = LEG_LEFT - icon_position = LEFT - parent_organ = "groin" - joint = "left knee" - amputation_point = "left hip" - can_stand = 1 - -/obj/item/organ/external/leg/right - limb_name = "r_leg" - name = "right leg" - icon_name = "r_leg" - body_part = LEG_RIGHT - icon_position = RIGHT - joint = "right knee" - amputation_point = "right hip" - -/obj/item/organ/external/foot - limb_name = "l_foot" - name = "left foot" - icon_name = "l_foot" - min_broken_damage = 15 - w_class = 2 - body_part = FOOT_LEFT - icon_position = LEFT - parent_organ = "l_leg" - joint = "left ankle" - amputation_point = "left ankle" - can_stand = 1 - -/obj/item/organ/external/foot/removed() - if(owner) owner.u_equip(owner.shoes) - ..() - -/obj/item/organ/external/foot/right - limb_name = "r_foot" - name = "right foot" - icon_name = "r_foot" - body_part = FOOT_RIGHT - icon_position = RIGHT - parent_organ = "r_leg" - joint = "right ankle" - amputation_point = "right ankle" - -/obj/item/organ/external/hand - limb_name = "l_hand" - name = "left hand" - icon_name = "l_hand" - min_broken_damage = 15 - w_class = 2 - body_part = HAND_LEFT - parent_organ = "l_arm" - joint = "left wrist" - amputation_point = "left wrist" - can_grasp = 1 - -/obj/item/organ/external/hand/removed() - owner.u_equip(owner.gloves) - ..() - -/obj/item/organ/external/hand/right - limb_name = "r_hand" - name = "right hand" - icon_name = "r_hand" - body_part = HAND_RIGHT - parent_organ = "r_arm" - joint = "right wrist" - amputation_point = "right wrist" - -/obj/item/organ/external/head - limb_name = "head" - icon_name = "head" - name = "head" - max_damage = 75 - min_broken_damage = 35 - w_class = 3 - body_part = HEAD - vital = 1 - parent_organ = "chest" - joint = "jaw" - amputation_point = "neck" - gendered_icon = 1 - encased = "skull" - -/obj/item/organ/external/head/removed() - if(owner) - name = "[owner.real_name]'s head" - owner.u_equip(owner.glasses) - owner.u_equip(owner.head) - owner.u_equip(owner.l_ear) - owner.u_equip(owner.r_ear) - owner.u_equip(owner.wear_mask) - spawn(1) - owner.update_hair() - ..() - -/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) - ..(brute, burn, sharp, edge, used_weapon, forbidden_limbs) - if (!disfigured) - if (brute_dam > 40) - if (prob(50)) - disfigure("brute") - if (burn_dam > 40) - disfigure("burn") diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index daddc6d0fd0..5917e9d8e1f 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -30,7 +30,7 @@ var/global/list/limb_icon_cache = list() s_tone = null s_col = null h_col = null - if(status & ORGAN_ROBOT) + if(status & ORGAN_ROBOT && !force_skintone) return if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && (species.appearance_flags & HAS_SKIN_TONE)) s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE) @@ -40,8 +40,14 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human) ..() - var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"] - if(eyes) eyes.update_colour() + var/obj/item/organ/eyes/eyes + if (species.vision_organ) + eyes = owner.internal_organs_by_name[species.vision_organ] + else + eyes = owner.internal_organs_by_name["eyes"] + + if(eyes) + eyes.update_colour() /obj/item/organ/external/head/removed() get_icon() @@ -53,9 +59,9 @@ var/global/list/limb_icon_cache = list() overlays.Cut() if(!owner || !owner.species) return - if(owner.species.has_organ["eyes"]) - var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"] - if(species.eyes) + if(owner.species.has_organ["eyes"] || (owner.species.vision_organ && owner.species.has_organ[species.vision_organ])) + var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"] || owner.internal_organs_by_name[species.vision_organ] + if(eyes && species.eyes) var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', species.eyes) if(eyes) eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) @@ -113,7 +119,7 @@ var/global/list/limb_icon_cache = list() if(skeletal) mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]") - else if (status & ORGAN_ROBOT) + else if (status & ORGAN_ROBOT && !force_skintone) mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]") else if (status & ORGAN_MUTATED) diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 50ffd360d96..c2cd06e0d70 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -141,10 +141,13 @@ if(is_broken()) filter_effect -= 2 - if (owner.intoxication) + if (owner.intoxication > 0) //ALCOHOL_FILTRATION_RATE is defined in intoxication.dm owner.intoxication -= ALCOHOL_FILTRATION_RATE*filter_effect*PROCESS_ACCURACY//A weakened liver filters out alcohol more slowly owner.intoxication = max(owner.intoxication, 0) + if (!owner.intoxication) + //If intoxication has just been reduced to zero, this will handle removing any effects + owner.handle_intoxication() // Do some reagent processing. if(owner.chem_effects[CE_ALCOHOL_TOXIC]) @@ -186,9 +189,6 @@ parent_organ = "chest" dead_icon = "heart-off" -/obj/item/organ/internal/vaurca/process() - return - /obj/item/organ/vaurca/neuralsocket name = "neural socket" organ_tag = "neural socket" diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm index a88f40c6b0f..43cfe6a6d27 100644 --- a/code/modules/organs/subtypes/machine.dm +++ b/code/modules/organs/subtypes/machine.dm @@ -7,7 +7,7 @@ vital = 1 //because it is now hosting the posibrain max_damage = 50 //made same as arm, since it is not vital min_broken_damage = 30 - encased = null + encased = "support frame" /obj/item/organ/external/head/ipc/New() robotize("Hephaestus Integrated Limb") @@ -15,31 +15,35 @@ /obj/item/organ/external/chest/ipc dislocated = -1 - encased = null + encased = "support frame" /obj/item/organ/external/chest/ipc/New() robotize("Hephaestus Integrated Limb") ..() /obj/item/organ/external/groin/ipc dislocated = -1 + encased = "support frame" /obj/item/organ/external/groin/ipc/New() robotize("Hephaestus Integrated Limb") ..() /obj/item/organ/external/arm/ipc dislocated = -1 + encased = "support frame" /obj/item/organ/external/arm/ipc/New() robotize("Hephaestus Integrated Limb") ..() /obj/item/organ/external/arm/right/ipc dislocated = -1 + encased = "support frame" /obj/item/organ/external/arm/right/ipc/New() robotize("Hephaestus Integrated Limb") ..() /obj/item/organ/external/leg/ipc dislocated = -1 + encased = "support frame" /obj/item/organ/external/leg/ipc/New() robotize("Hephaestus Integrated Limb") ..() @@ -52,24 +56,28 @@ /obj/item/organ/external/foot/ipc dislocated = -1 + encased = "support frame" /obj/item/organ/external/foot/ipc/New() robotize("Hephaestus Integrated Limb") ..() /obj/item/organ/external/foot/right/ipc dislocated = -1 + encased = "support frame" /obj/item/organ/external/foot/right/ipc/New() robotize("Hephaestus Integrated Limb") ..() /obj/item/organ/external/hand/ipc dislocated = -1 + encased = "support frame" /obj/item/organ/external/hand/ipc/New() robotize("Hephaestus Integrated Limb") ..() /obj/item/organ/external/hand/right/ipc dislocated = -1 + encased = "support frame" /obj/item/organ/external/hand/right/ipc/New() robotize("Hephaestus Integrated Limb") ..() @@ -94,15 +102,14 @@ owner.stat = 0 owner.visible_message("\The [owner] twitches visibly!") -/obj/item/organ/optical_sensor +/obj/item/organ/eyes/optical_sensor name = "optical sensor" organ_tag = "optics" - parent_organ = "head" icon = 'icons/obj/robot_component.dmi' icon_state = "camera" dead_icon = "camera_broken" -/obj/item/organ/optical_sensor/New() +/obj/item/organ/eyes/optical_sensor/New() robotize() ..() @@ -215,30 +222,19 @@ vital = 0 max_damage = 50 //made same as arm, since it is not vital min_broken_damage = 30 - encased = null + encased = "reinforced support frame" emp_coeff = 0.5 -/obj/item/organ/optical_sensorterminator - name = "optical sensor" - organ_tag = "optics" - parent_organ = "head" - icon = 'icons/obj/robot_component.dmi' - icon_state = "camera" - dead_icon = "camera_broken" +/obj/item/organ/eyes/optical_sensor/terminator emp_coeff = 0.5 -/obj/item/organ/optical_sensor/terminator/New() - robotize() - ..() - - /obj/item/organ/external/head/terminator/New() robotize("Hephaestus Vulcanite Limb") ..() /obj/item/organ/external/chest/terminator dislocated = -1 - encased = null + encased = "reinforced support frame" emp_coeff = 0.5 /obj/item/organ/external/chest/terminator/New() @@ -247,6 +243,7 @@ /obj/item/organ/external/groin/terminator dislocated = -1 + encased = "reinforced support frame" emp_coeff = 0.5 /obj/item/organ/external/groin/terminator/New() @@ -255,6 +252,7 @@ /obj/item/organ/external/arm/terminator dislocated = -1 + encased = "reinforced support frame" emp_coeff = 0.5 /obj/item/organ/external/arm/terminator/New() @@ -263,6 +261,7 @@ /obj/item/organ/external/arm/right/terminator dislocated = -1 + encased = "reinforced support frame" emp_coeff = 0.5 /obj/item/organ/external/arm/right/terminator/New() @@ -271,6 +270,7 @@ /obj/item/organ/external/leg/terminator dislocated = -1 + encased = "reinforced support frame" emp_coeff = 0.5 /obj/item/organ/external/leg/terminator/New() @@ -279,6 +279,7 @@ /obj/item/organ/external/leg/right/terminator dislocated = -1 + encased = "reinforced support frame" emp_coeff = 0.5 /obj/item/organ/external/leg/right/terminator/New() @@ -287,6 +288,7 @@ /obj/item/organ/external/foot/terminator dislocated = -1 + encased = "reinforced support frame" emp_coeff = 0.5 /obj/item/organ/external/foot/terminator/New() @@ -295,6 +297,7 @@ /obj/item/organ/external/foot/right/terminator dislocated = -1 + encased = "reinforced support frame" emp_coeff = 0.5 /obj/item/organ/external/foot/right/terminator/New() @@ -303,6 +306,7 @@ /obj/item/organ/external/hand/terminator dislocated = -1 + encased = "reinforced support frame" emp_coeff = 0.5 /obj/item/organ/external/hand/terminator/New() @@ -311,6 +315,7 @@ /obj/item/organ/external/hand/right/terminator dislocated = -1 + encased = "reinforced support frame" emp_coeff = 0.5 /obj/item/organ/external/hand/right/terminator/New() @@ -327,7 +332,7 @@ vital = 0 max_damage = 50 //made same as arm, since it is not vital min_broken_damage = 30 - encased = null + encased = "support frame" /obj/item/organ/external/head/industrial/New() robotize("Hephaestus Industrial Limb") @@ -335,61 +340,80 @@ /obj/item/organ/external/chest/industrial dislocated = -1 - encased = null + encased = "support frame" + /obj/item/organ/external/chest/industrial/New() robotize("Hephaestus Industrial Limb") ..() /obj/item/organ/external/groin/industrial dislocated = -1 + encased = "support frame" + /obj/item/organ/external/groin/industrial/New() robotize("Hephaestus Industrial Limb") ..() /obj/item/organ/external/arm/industrial dislocated = -1 + encased = "support frame" + /obj/item/organ/external/arm/industrial/New() robotize("Hephaestus Industrial Limb") ..() /obj/item/organ/external/arm/right/industrial dislocated = -1 + encased = "support frame" + /obj/item/organ/external/arm/right/industrial/New() robotize("Hephaestus Industrial Limb") ..() /obj/item/organ/external/leg/industrial dislocated = -1 + encased = "support frame" + /obj/item/organ/external/leg/industrial/New() robotize("Hephaestus Industrial Limb") ..() /obj/item/organ/external/leg/right/industrial dislocated = -1 + encased = "support frame" + /obj/item/organ/external/leg/right/industrial/New() robotize("Hephaestus Industrial Limb") ..() /obj/item/organ/external/foot/industrial dislocated = -1 + encased = "support frame" + /obj/item/organ/external/foot/industrial/New() robotize("Hephaestus Industrial Limb") ..() /obj/item/organ/external/foot/right/industrial dislocated = -1 + encased = "support frame" + /obj/item/organ/external/foot/right/industrial/New() robotize("Hephaestus Industrial Limb") ..() /obj/item/organ/external/hand/industrial dislocated = -1 + encased = "support frame" + /obj/item/organ/external/hand/industrial/New() robotize("Hephaestus Industrial Limb") ..() /obj/item/organ/external/hand/right/industrial dislocated = -1 + encased = "support frame" + /obj/item/organ/external/hand/right/industrial/New() robotize("Hephaestus Industrial Limb") ..() @@ -404,7 +428,8 @@ vital = 0 max_damage = 50 //made same as arm, since it is not vital min_broken_damage = 30 - encased = null + encased = "support frame" + force_skintone = TRUE /obj/item/organ/external/head/shell/New() robotize("Human Synthskin") @@ -412,61 +437,91 @@ /obj/item/organ/external/chest/shell dislocated = -1 - encased = null + encased = "support frame" + force_skintone = TRUE + + /obj/item/organ/external/chest/shell/New() robotize("Human Synthskin") ..() /obj/item/organ/external/groin/shell dislocated = -1 + encased = "support frame" + force_skintone = TRUE + /obj/item/organ/external/groin/shell/New() robotize("Human Synthskin") ..() /obj/item/organ/external/arm/shell dislocated = -1 + encased = "support frame" + force_skintone = TRUE + /obj/item/organ/external/arm/shell/New() robotize("Human Synthskin") ..() /obj/item/organ/external/arm/right/shell dislocated = -1 + encased = "support frame" + force_skintone = TRUE + /obj/item/organ/external/arm/right/shell/New() robotize("Human Synthskin") ..() /obj/item/organ/external/leg/shell dislocated = -1 + encased = "support frame" + force_skintone = TRUE + /obj/item/organ/external/leg/shell/New() robotize("Human Synthskin") ..() /obj/item/organ/external/leg/right/shell dislocated = -1 + encased = "support frame" + force_skintone = TRUE + /obj/item/organ/external/leg/right/shell/New() robotize("Human Synthskin") ..() /obj/item/organ/external/foot/shell dislocated = -1 + encased = "support frame" + force_skintone = TRUE + /obj/item/organ/external/foot/shell/New() robotize("Human Synthskin") ..() /obj/item/organ/external/foot/right/shell dislocated = -1 + encased = "support frame" + force_skintone = TRUE + /obj/item/organ/external/foot/right/shell/New() robotize("Human Synthskin") ..() /obj/item/organ/external/hand/shell dislocated = -1 + encased = "support frame" + force_skintone = TRUE + /obj/item/organ/external/hand/shell/New() robotize("Human Synthskin") ..() /obj/item/organ/external/hand/right/shell dislocated = -1 + encased = "support frame" + force_skintone = TRUE + /obj/item/organ/external/hand/right/shell/New() robotize("Human Synthskin") - ..() \ No newline at end of file + ..() diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm index 54ec34ae70c..8571dbfba22 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/subtypes/standard.dm @@ -93,7 +93,7 @@ can_stand = 1 /obj/item/organ/external/foot/removed() - if(owner) owner.u_equip(owner.shoes) + if(owner) owner.drop_from_inventory(owner.shoes) ..() /obj/item/organ/external/foot/right @@ -120,7 +120,7 @@ can_grasp = 1 /obj/item/organ/external/hand/removed() - owner.u_equip(owner.gloves) + owner.drop_from_inventory(owner.gloves) ..() /obj/item/organ/external/hand/right @@ -151,11 +151,11 @@ /obj/item/organ/external/head/removed() if(owner) name = "[owner.real_name]'s head" - owner.u_equip(owner.glasses) - owner.u_equip(owner.head) - owner.u_equip(owner.l_ear) - owner.u_equip(owner.r_ear) - owner.u_equip(owner.wear_mask) + owner.drop_from_inventory(owner.glasses) + owner.drop_from_inventory(owner.head) + owner.drop_from_inventory(owner.l_ear) + owner.drop_from_inventory(owner.r_ear) + owner.drop_from_inventory(owner.wear_mask) spawn(1) owner.update_hair() ..() diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 6f128c7d0e8..c8b9c2a6753 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -42,6 +42,7 @@ var/list/admin_departments = list("[boss_name]", "Tau Ceti Government", "Supply" /obj/machinery/photocopier/faxmachine/attack_hand(mob/user as mob) user.set_machine(src) + var/remaining_cooldown = get_remaining_cooldown() var/dat = "Fax Machine " var/scan_name @@ -65,8 +66,8 @@ var/list/admin_departments = list("[boss_name]", "Tau Ceti Government", "Supply" if(copyitem) dat += "Remove Item " - if(sendcooldown) - dat += "Transmitter arrays realigning. Please stand by. [round(get_remaining_cooldown() / 10)] seconds remaining. " + if(remaining_cooldown > 0) + dat += "Transmitter arrays realigning. Please stand by. [round(remaining_cooldown / 10)] seconds remaining. " else @@ -75,9 +76,9 @@ var/list/admin_departments = list("[boss_name]", "Tau Ceti Government", "Supply" dat += "Sending to: [destination] " else - if(sendcooldown) + if(remaining_cooldown > 0) dat += "Please insert paper to send via secure connection. " - dat += "Transmitter arrays realigning. Please stand by. [round(get_remaining_cooldown() / 10)] seconds remaining. " + dat += "Transmitter arrays realigning. Please stand by. [round(remaining_cooldown / 10)] seconds remaining. " else dat += "Please insert paper to send via secure connection. " @@ -98,7 +99,7 @@ var/list/admin_departments = list("[boss_name]", "Tau Ceti Government", "Supply" user << browse(dat, "window=copier") onclose(user, "copier") - if (sendcooldown != 0) + if (remaining_cooldown > 0) spawn(50) // Auto-refresh every 5 seconds, if cooldown is active updateUsrDialog() @@ -107,7 +108,7 @@ var/list/admin_departments = list("[boss_name]", "Tau Ceti Government", "Supply" /obj/machinery/photocopier/faxmachine/Topic(href, href_list) if(href_list["send"]) - if (sendcooldown > 0) + if (get_remaining_cooldown() > 0) // Rate-limit sending faxes usr << "The fax machine isn't ready, yet!" updateUsrDialog() @@ -189,8 +190,7 @@ var/list/admin_departments = list("[boss_name]", "Tau Ceti Government", "Supply" .=..() var/static/ui_update_delay = 0 - var/current_time = world.time - if (current_time > sendtime + sendcooldown) + if ((sendtime + sendcooldown) < world.time) sendcooldown = 0 /* @@ -231,11 +231,13 @@ var/list/admin_departments = list("[boss_name]", "Tau Ceti Government", "Supply" if( F.department == destination ) success = F.recievefax(copyitem) + if (success) + set_cooldown(normalfax_cooldown) + if (display_message) // Normal fax if (success) visible_message("[src] beeps, \"Message transmitted successfully.\"") - sendcooldown = normalfax_cooldown else visible_message("[src] beeps, \"Error transmitting message.\"") return success diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 0fe4e674d44..322456dc9fe 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -114,7 +114,7 @@ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src) P.info = " " P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]] \nSex: [G.fields["sex"]] \nAge: [G.fields["age"]] \nFingerprint: [G.fields["fingerprint"]] \nPhysical Status: [G.fields["p_stat"]] \nMental Status: [G.fields["m_stat"]] " - P.info += " \n \nCriminal Status: [S.fields["criminal"]] \n \nMinor Crimes: [S.fields["mi_crim"]] \nDetails: [S.fields["mi_crim_d"]] \n \nMajor Crimes: [S.fields["ma_crim"]] \nDetails: [S.fields["ma_crim_d"]] \n \nImportant Notes: \n\t[S.fields["notes"]] \n \n " + P.info += " \n \nCriminal Status: [S.fields["criminal"]] \n \nMinor Crimes: [S.fields["mi_crim"]] \nDetails: [S.fields["mi_crim_d"]] \n \nMajor Crimes: [S.fields["ma_crim"]] \nDetails: [S.fields["ma_crim_d"]] \n \nImportant Notes: \n\t[replacetext(S.fields["notes"], "\n", " ")] \n \n " var/counter = 1 while(S.fields["com_[counter]"]) P.info += "[S.fields["com_[counter]"]] " @@ -151,8 +151,8 @@ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src) var/info = " " info += "Name: [G.fields["name"]] ID: [G.fields["id"]] \nSex: [G.fields["sex"]] \nAge: [G.fields["age"]] \nFingerprint: [G.fields["fingerprint"]] \nPhysical Status: [G.fields["p_stat"]] \nMental Status: [G.fields["m_stat"]] " - - info += " \n \nBlood Type: [M.fields["b_type"]] \nDNA: [M.fields["b_dna"]] \n \nMinor Disabilities: [M.fields["mi_dis"]] \nDetails: [M.fields["mi_dis_d"]] \n \nMajor Disabilities: [M.fields["ma_dis"]] \nDetails: [M.fields["ma_dis_d"]] \n \nAllergies: [M.fields["alg"]] \nDetails: [M.fields["alg_d"]] \n \nCurrent Diseases: [M.fields["cdi"]] (per disease info placed in log/comment section) \nDetails: [M.fields["cdi_d"]] \n \nImportant Notes: \n\t[M.fields["notes"]] \n \n " + + info += " \n \nBlood Type: [M.fields["b_type"]] \nDNA: [M.fields["b_dna"]] \n \nMinor Disabilities: [M.fields["mi_dis"]] \nDetails: [M.fields["mi_dis_d"]] \n \nMajor Disabilities: [M.fields["ma_dis"]] \nDetails: [M.fields["ma_dis_d"]] \n \nAllergies: [M.fields["alg"]] \nDetails: [M.fields["alg_d"]] \n \nCurrent Diseases: [M.fields["cdi"]] (per disease info placed in log/comment section) \nDetails: [M.fields["cdi_d"]] \n \nImportant Notes: \n\t[replacetext(M.fields["notes"], "\n", " ")] \n \n " var/counter = 1 while(M.fields["com_[counter]"]) info += "[M.fields["com_[counter]"]] " diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 14b72bc778e..bd0310df6df 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -65,7 +65,7 @@ // M << "\red You feel a tiny prick!" //That's a whole lot of meta! M.attack_log += text("\[[time_stamp()]\] Has been stabbed with [name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [name] to stab [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) Used the [name] to stab [M.name] ([M.ckey]) (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) Used the [name] to stab [M.name] ([M.ckey]) (JMP)",ckey=key_name(user),ckey_target=key_name(M)) return /* diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 62f85d8f3b1..23226c295d9 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -201,37 +201,32 @@ var/global/photo_count = 0 //Proc for capturing check /mob/living/proc/can_capture_turf(turf/T) - var/mob/dummy = new(T) //Go go visibility check dummy - var/viewer = src - if(src.client) //To make shooting through security cameras possible - viewer = src.client.eye - var/can_see = (dummy in viewers(world.view, viewer)) - - qdel(dummy) - return can_see + return TRUE // DVIEW will do sanity checks, we've got no special checks. /obj/item/device/camera/proc/captureimage(atom/target, mob/living/user, flag) - var/x_c = target.x - (size-1)/2 - var/y_c = target.y + (size-1)/2 - var/z_c = target.z - var/mobs = "" - for(var/i = 1; i <= size; i++) - for(var/j = 1; j <= size; j++) - var/turf/T = locate(x_c, y_c, z_c) - if(user.can_capture_turf(T)) - mobs += get_mobs(T) - x_c++ - y_c-- - x_c = x_c - size - - var/obj/item/weapon/photo/p = createpicture(target, user, mobs, flag) + var/obj/item/weapon/photo/p = createpicture(target, user, flag) printpicture(user, p) -/obj/item/device/camera/proc/createpicture(atom/target, mob/user, mobs, flag) +/obj/item/device/camera/proc/createpicture(atom/target, mob/living/user, flag) + var/mobs = "" + var/list/turfs = list() + + FOR_DVIEW(var/turf/T, size, target, INVISIBILITY_LIGHTING) + if (user.can_capture_turf(T)) + mobs += get_mobs(T) + turfs += T + + END_FOR_DVIEW + var/x_c = target.x - (size-1)/2 var/y_c = target.y - (size-1)/2 var/z_c = target.z - var/icon/photoimage = generate_image(x_c, y_c, z_c, size, CAPTURE_MODE_REGULAR, user) + + var/turf/topleft = locate(x_c, y_c, z_c) + if (!topleft) + return null + + var/icon/photoimage = generate_image_from_turfs(topleft, turfs, size, CAPTURE_MODE_REGULAR, user) var/icon/small_img = icon(photoimage) var/icon/tiny_img = icon(photoimage) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index e333e4550d7..71dac77f037 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -103,7 +103,7 @@ rigged = 1 - log_admin("LOG: [user.name] ([user.ckey]) injected a power cell with phoron, rigging it to explode.") + log_admin("LOG: [user.name] ([user.ckey]) injected a power cell with phoron, rigging it to explode.",ckey=key_name(user)) message_admins("LOG: [user.name] ([user.ckey]) injected a power cell with phoron, rigging it to explode.") S.reagents.clear_reagents() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 637f4aaefe6..ab6cfcabb96 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -709,7 +709,7 @@ if(S.reagents.has_reagent("phoron", 5)) - log_admin("LOG: [user.name] ([user.ckey]) injected a light with phoron, rigging it to explode.") + log_admin("LOG: [user.name] ([user.ckey]) injected a light with phoron, rigging it to explode.",ckey=key_name(user)) message_admins("LOG: [user.name] ([user.ckey]) injected a light with phoron, rigging it to explode.") rigged = 1 diff --git a/code/modules/power/profiling.dm b/code/modules/power/profiling.dm index 3cf8c3a0b92..30f8bfd1e35 100644 --- a/code/modules/power/profiling.dm +++ b/code/modules/power/profiling.dm @@ -36,14 +36,14 @@ var/global/list/power_update_requests_by_area = list() usr << "Area power update profiling disabled." message_admins("[key_name(src)] toggled area power update profiling off.") - log_admin("[key_name(src)] toggled area power update profiling off.") + log_admin("[key_name(src)] toggled area power update profiling off.",admin_key=key_name(src)) else enable_power_update_profiling = 1 power_last_profile_time = world.time usr << "Area power update profiling enabled." message_admins("[key_name(src)] toggled area power update profiling on.") - log_admin("[key_name(src)] toggled area power update profiling on.") + log_admin("[key_name(src)] toggled area power update profiling on.",admin_key=key_name(src)) feedback_add_details("admin_verb","APUP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 36bc0afd9ec..9b3b714f87c 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -84,7 +84,7 @@ src.active = 0 user << "You turn off [src]." message_admins("Emitter turned off by [key_name(user, user.client)](?) in ([x],[y],[z] - JMP)",0,1) - log_game("Emitter turned off by [user.ckey]([user]) in ([x],[y],[z])") + log_game("Emitter turned off by [user.ckey]([user]) in ([x],[y],[z])",ckey=key_name(user)) investigate_log("turned off by [user.key]","singulo") else src.active = 1 @@ -92,7 +92,7 @@ src.shot_number = 0 src.fire_delay = 100 message_admins("Emitter turned on by [key_name(user, user.client)](?) in ([x],[y],[z] - JMP)",0,1) - log_game("Emitter turned on by [user.ckey]([user]) in ([x],[y],[z])") + log_game("Emitter turned on by [user.ckey]([user]) in ([x],[y],[z])",ckey=key_name(user)) investigate_log("turned on by [user.key]","singulo") update_icon() else diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 013fbb38a2c..456be9ed7c2 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -122,7 +122,7 @@ strength = strength_upper_limit else message_admins("PA Control Computer increased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) - log_game("PA Control Computer increased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])") + log_game("PA Control Computer increased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])",ckey=key_name(usr)) investigate_log("increased to [strength] by [usr.key]","singulo") strength_change() @@ -133,7 +133,7 @@ strength = 0 else message_admins("PA Control Computer decreased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) - log_game("PA Control Computer decreased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])") + log_game("PA Control Computer decreased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])",ckey=key_name(usr)) investigate_log("decreased to [strength] by [usr.key]","singulo") strength_change() @@ -214,7 +214,7 @@ src.active = !src.active investigate_log("turned [active?"ON":"OFF"] by [usr ? usr.key : "outside forces"]","singulo") message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) - log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr.ckey]([usr]) in ([x],[y],[z])") + log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr.ckey]([usr]) in ([x],[y],[z])",ckey=key_name(usr)) if(src.active) update_use_power(2) for(var/obj/structure/particle_accelerator/part in connected_parts) diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index f8db578ef36..40e469eec5c 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -180,7 +180,7 @@ var/obj/item/clothing/gloves/G = h_user.gloves if(G.siemens_coefficient == 0) user_protected = 1 - log_game("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100") + log_game("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100",ckey=key_name(usr)) message_admins("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100 - JMP") diff --git a/code/modules/projectiles/guns/energy/lawgiver.dm b/code/modules/projectiles/guns/energy/lawgiver.dm index d8d3d91e797..a4c578e8de3 100644 --- a/code/modules/projectiles/guns/energy/lawgiver.dm +++ b/code/modules/projectiles/guns/energy/lawgiver.dm @@ -65,12 +65,20 @@ ) ) +/obj/item/weapon/gun/energy/lawgiver/New() + ..() + listening_objects += src + +/obj/item/weapon/gun/energy/lawgiver/Destroy() + listening_objects -= src + return ..() + /obj/item/weapon/gun/energy/lawgiver/proc/play_message() while (message_enabled && !message_disable) //Shut down command issued. Inform user that boardcasting has been stopped usr.audible_message("[usr]'s [src.name] broadcasts: [message]","") playsound(get_turf(src), 'sound/voice/halt.ogg', 100, 1, vary = 0) sleep(message_delay) - usr << "\red Broadcasting Message disabled" + usr << "Broadcasting Message disabled" message_enabled = 0 message_disable = 0 @@ -80,7 +88,7 @@ else src.dna = user.dna.unique_enzymes src.owner_name = user.real_name - user << "\blue You feel your palm heat up as the gun reads your DNA profile." + user << "You feel your palm heat up as the gun reads your DNA profile." desc += " Linked to: [user.real_name]" return @@ -93,7 +101,7 @@ var/obj/item/organ/external/RA = H.get_organ("r_arm") var/active_hand = H.hand playsound(user, 'sound/weapons/lawgiver_idfail.ogg', 40, 1) - user << "\red You hear a soft beep from the gun and 'ID FAIL' flashes across the screen." + user << "You hear a soft beep from the gun and 'ID FAIL' flashes across the screen." user << "You feel a tiny prick in your hand!" user.drop_item() //Blow up Unauthorized Users Hand @@ -132,50 +140,50 @@ sel_mode = 1 projectile_type=/obj/item/projectile/bullet/pistol fire_sound='sound/weapons/Gunshot_smg.ogg' - usr << "\red [src.name] is now set to single shot mode." + usr << "[src.name] is now set to single shot mode." else if(findtext(msg,"rapidfire")) sel_mode = 2 projectile_type=/obj/item/projectile/bullet/pistol fire_sound='sound/weapons/Gunshot_smg.ogg' - usr << "\red [src.name] is now set to rapid fire mode." + usr << "[src.name] is now set to rapid fire mode." else if(findtext(msg,"highex") || findtext(msg,"grenade")) sel_mode = 3 projectile_type=/obj/item/projectile/bullet/gyro/law fire_sound='sound/effects/Explosion1.ogg' - usr << "\red [src.name] is now set to high explosive mode." + usr << "[src.name] is now set to high explosive mode." else if(findtext(msg,"stun")) sel_mode = 4 projectile_type=/obj/item/projectile/beam/stun fire_sound='sound/weapons/Taser.ogg' - usr << "\red [src.name] is now set to stun mode." + usr << "[src.name] is now set to stun mode." else if(findtext(msg,"hotshot") || findtext(msg,"incendiary")) sel_mode = 5 projectile_type=/obj/item/projectile/bullet/shotgun/incendiary fire_sound='sound/weapons/Gunshot.ogg' - usr << "\red [src.name] is now set to incendiary mode." + usr << "[src.name] is now set to incendiary mode." else if(findtext(msg,"armorpiercing") || findtext(msg,"execution")) sel_mode = 6 projectile_type=/obj/item/projectile/bullet/rifle/a556 fire_sound='sound/weapons/Gunshot.ogg' - usr << "\red [src.name] is now set to armorpiercing mode." + usr << "[src.name] is now set to armorpiercing mode." else if(findtext(msg,"pellets")) sel_mode = 7 projectile_type=/obj/item/projectile/bullet/pellet/shotgun fire_sound='sound/weapons/Gunshot.ogg' - usr << "\red [src.name] is now set to pellet mode." + usr << "[src.name] is now set to pellet mode." /* Other Stuff */ else if(findtext(msg,"reset") && (findtext(msg,"user") || findtext(msg,"dna"))) dna = null desc = default_desc - usr << "\red [src.name]´s owner has been reset. Do not attempt to fire [src.name] without rebinding a new owner" + usr << "[src.name]´s owner has been reset. Do not attempt to fire [src.name] without rebinding a new owner." else if((findtext(msg,"disable") || findtext(msg,"deactivate")) && findtext(msg,"crowdcontrol")) message_disable = 1 - usr << "\red [src.name]´s crowdcontrol deactivation sequence started" + usr << "[src.name]´s crowdcontrol deactivation sequence started." else if((findtext(msg,"enable") || findtext(msg,"activate")) && findtext(msg,"crowdcontrol")) if(message_enabled) //Check if a message is already broadcasting -> abort - usr << "\red [src.name] is already broadcasting a message." + usr << "[src.name] is already broadcasting a message." return - usr << "\red [src.name]´s crowdcontrol activation sequence started" + usr << "[src.name]´s crowdcontrol activation sequence started." message = "Citizens stay calm. Stand back from the crime scene. Interference with the crime scene carries an automatic brig sentence." message_enabled = 1 message_disable = 0 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 9334c770e78..4c434a56230 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -247,7 +247,7 @@ is_charging = 0 if(!istype(user.get_active_hand(), src)) return - msg_admin_attack("[key_name_admin(user)] shot with \a [src.type] [key_name_admin(src)]'s target (JMP)") + msg_admin_attack("[key_name_admin(user)] shot with \a [src.type] [key_name_admin(src)]'s target (JMP)",ckey=key_name(user),ckey_target=key_name(src)) return 1 /obj/item/weapon/gun/energy/vaurca/blaster @@ -340,7 +340,7 @@ is_charging = 0 if(!istype(user.get_active_hand(), src)) return - msg_admin_attack("[key_name_admin(user)] shot with \a [src.type] [key_name_admin(src)]'s target (JMP)") + msg_admin_attack("[key_name_admin(user)] shot with \a [src.type] [key_name_admin(src)]'s target (JMP)",ckey=key_name(user),ckey_target=key_name(src)) return 1 /obj/item/weapon/gun/energy/vaurca/typec/attack_hand(mob/user as mob) @@ -472,7 +472,7 @@ is_charging = 0 if(!istype(user.get_active_hand(), src)) return - msg_admin_attack("[key_name_admin(user)] shot with \a [src.type] [key_name_admin(src)]'s target (JMP)") + msg_admin_attack("[key_name_admin(user)] shot with \a [src.type] [key_name_admin(src)]'s target (JMP)",ckey=key_name(user),ckey_target=key_name(src)) return 1 /*/obj/item/weapon/gun/energy/vaurca/flamer diff --git a/code/modules/projectiles/guns/launcher/grenade_launcher.dm b/code/modules/projectiles/guns/launcher/grenade_launcher.dm index fe27d357906..c943d652382 100644 --- a/code/modules/projectiles/guns/launcher/grenade_launcher.dm +++ b/code/modules/projectiles/guns/launcher/grenade_launcher.dm @@ -83,7 +83,7 @@ /obj/item/weapon/gun/launcher/grenade/handle_post_fire(mob/user) message_admins("[key_name_admin(user)] fired a grenade ([chambered.name]) from a grenade launcher ([src.name]).") - log_game("[key_name_admin(user)] used a grenade ([chambered.name]).") + log_game("[key_name_admin(user)] used a grenade ([chambered.name]).",ckey=key_name(user)) chambered = null //Underslung grenade launcher to be used with the Z8 diff --git a/code/modules/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm index 12338ee5c34..bd3059c98e6 100644 --- a/code/modules/projectiles/guns/launcher/rocket.dm +++ b/code/modules/projectiles/guns/launcher/rocket.dm @@ -44,5 +44,5 @@ /obj/item/weapon/gun/launcher/rocket/handle_post_fire(mob/user, atom/target) message_admins("[key_name_admin(user)] fired a rocket from a rocket launcher ([src.name]) at [target].") - log_game("[key_name_admin(user)] used a rocket launcher ([src.name]) at [target].") + log_game("[key_name_admin(user)] used a rocket launcher ([src.name]) at [target].",ckey=key_name(src)) ..() diff --git a/code/modules/projectiles/guns/projectile/improvised.dm b/code/modules/projectiles/guns/projectile/improvised.dm index 22def2aea86..875037fdea7 100644 --- a/code/modules/projectiles/guns/projectile/improvised.dm +++ b/code/modules/projectiles/guns/projectile/improvised.dm @@ -126,7 +126,7 @@ //ghetto handgun, sprites by datberry /obj/item/weapon/gun/projectile/improvised_handgun - name = "\improper improvised handgun" + name = "improvised handgun" desc = "A common sight in an amateur's workshop, a simple yet effective assembly made to chamber and fire .45 Rounds." max_shells = 7 recoil = 2 diff --git a/code/modules/projectiles/guns/projectile/scout_sniper.dm b/code/modules/projectiles/guns/projectile/scout_sniper.dm index 14791703b46..582883b8aa7 100644 --- a/code/modules/projectiles/guns/projectile/scout_sniper.dm +++ b/code/modules/projectiles/guns/projectile/scout_sniper.dm @@ -15,7 +15,7 @@ ammo_type = /obj/item/ammo_casing/a556/ap magazine_type = /obj/item/ammo_magazine/a556/ap allowed_magazines = list(/obj/item/ammo_magazine/a556, /obj/item/ammo_magazine/a556/ap) - accuracy = -2 + accuracy = -4 scoped_accuracy = 3 recoil_wielded = 2 accuracy_wielded = 0 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 165ee664a82..762535e0291 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -208,7 +208,7 @@ admin_attack_log(firer, target_mob, attacker_message, victim_message, admin_message) else target_mob.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [target_mob]/[target_mob.ckey] with \a [src]" - msg_admin_attack("UNKNOWN shot [target_mob] ([target_mob.ckey]) with \a [src] (JMP)") + msg_admin_attack("UNKNOWN shot [target_mob] ([target_mob.ckey]) with \a [src] (JMP)",ckey=key_name(target_mob)) //sometimes bullet_act() will want the projectile to continue flying if (result == PROJECTILE_CONTINUE) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 46766b09159..b919ba165d3 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -292,9 +292,9 @@ name = "energy bolt" //For projectiles name is only shown in onhit messages, so its more of a layman's description //of what the projectile looks like - damage = 4 //Very weak - armor_penetration = 10 + damage = 3.5 //Very weak accuracy = 4 //Guided by magic, unlikely to miss + eyeblur = 0 //Not bright or blinding var/mob/living/ignore muzzle_type = /obj/effect/projectile/cult/muzzle @@ -312,8 +312,8 @@ /obj/item/projectile/beam/cult/heavy name = "glowing energy bolt" - damage = 12 //Stronger and better armor penetration, though still much weaker than a typical laser - armor_penetration = 15 + damage = 10 //Stronger and better armor penetration, though still much weaker than a typical laser + armor_penetration = 10 muzzle_type = /obj/effect/projectile/cult/heavy/muzzle tracer_type = /obj/effect/projectile/cult/heavy/tracer diff --git a/code/modules/random_map/drop/droppod.dm b/code/modules/random_map/drop/droppod.dm index 625568bbf14..f3c9215b7f9 100644 --- a/code/modules/random_map/drop/droppod.dm +++ b/code/modules/random_map/drop/droppod.dm @@ -216,11 +216,11 @@ spawned_mob.ckey = selected_player.mob.ckey spawned_mobs = list(spawned_mob) message_admins("[key_name(usr)] dropped a pod containing \the [spawned_mob] ([spawned_mob.key]) at ([usr.x],[usr.y],[usr.z])") - log_admin("[key_name(usr)] dropped a pod containing \the [spawned_mob] ([spawned_mob.key]) at ([usr.x],[usr.y],[usr.z])") + log_admin("[key_name(usr)] dropped a pod containing \the [spawned_mob] ([spawned_mob.key]) at ([usr.x],[usr.y],[usr.z])",admin_key=key_name(usr),ckey=key_name(spawned_mob)) else if(spawned_mobs.len) automatic_pod = 1 message_admins("[key_name(usr)] dropped a pod containing [spawned_mobs.len] [spawned_mobs[1]] at ([usr.x],[usr.y],[usr.z])") - log_admin("[key_name(usr)] dropped a pod containing [spawned_mobs.len] [spawned_mobs[1]] at ([usr.x],[usr.y],[usr.z])") + log_admin("[key_name(usr)] dropped a pod containing [spawned_mobs.len] [spawned_mobs[1]] at ([usr.x],[usr.y],[usr.z])",admin_key=key_name(usr),ckey=key_name(spawned_mob)) else return diff --git a/code/modules/random_map/drop/supply.dm b/code/modules/random_map/drop/supply.dm index 18cc90d08e7..5ed99666689 100644 --- a/code/modules/random_map/drop/supply.dm +++ b/code/modules/random_map/drop/supply.dm @@ -89,5 +89,5 @@ choice = alert("Are you SURE you wish to deploy this supply drop? It will cause a sizable explosion and gib anyone underneath it.",,"No","Yes") if(choice == "No") return - log_admin("[key_name(usr)] dropped supplies at ([usr.x],[usr.y],[usr.z])") + log_admin("[key_name(usr)] dropped supplies at ([usr.x],[usr.y],[usr.z])",admin_key=key_name(usr)) new /datum/random_map/droppod/supply(null, usr.x-2, usr.y-2, usr.z, supplied_drops = chosen_loot_types, supplied_drop = chosen_loot_type) \ No newline at end of file diff --git a/code/modules/random_map/random_map_verbs.dm b/code/modules/random_map/random_map_verbs.dm index f94bcd45894..64a10566e61 100644 --- a/code/modules/random_map/random_map_verbs.dm +++ b/code/modules/random_map/random_map_verbs.dm @@ -26,7 +26,7 @@ random_maps[choice] = null if(istype(M)) message_admins("[key_name_admin(usr)] has deleted [M.name].") - log_admin("[key_name(usr)] has deleted [M.name].") + log_admin("[key_name(usr)] has deleted [M.name].",admin_key=key_name(usr)) qdel(M) /client/proc/create_random_map() @@ -51,7 +51,7 @@ if(M) message_admins("[key_name_admin(usr)] has created [M.name].") - log_admin("[key_name(usr)] has created [M.name].") + log_admin("[key_name(usr)] has created [M.name].",admin_key=key_name(usr)) /client/proc/apply_random_map() set category = "Debug" @@ -74,7 +74,7 @@ ty = !isnull(ty) ? ty : T.y tz = !isnull(tz) ? tz : T.z message_admins("[key_name_admin(usr)] has applied [M.name] at x[tx],y[ty],z[tz].") - log_admin("[key_name(usr)] has applied [M.name] at x[tx],y[ty],z[tz].") + log_admin("[key_name(usr)] has applied [M.name] at x[tx],y[ty],z[tz].",admin_key=key_name(usr)) M.set_origins(tx,ty,tz) M.apply_to_map() @@ -103,6 +103,6 @@ if(!tx) tx = 1 if(!ty) ty = 1 message_admins("[key_name_admin(usr)] has applied [overlay_map.name] to [base_map.name] at x[tx],y[ty].") - log_admin("[key_name(usr)] has applied [overlay_map.name] to [base_map.name] at x[tx],y[ty].") + log_admin("[key_name(usr)] has applied [overlay_map.name] to [base_map.name] at x[tx],y[ty].",admin_key=key_name(usr)) overlay_map.overlay_with(base_map,tx,ty) base_map.display_map(usr) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 54007df2d6d..123dd289618 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -803,7 +803,7 @@ user.attack_log += text("\[[time_stamp()]\] Has fed [target.name]'s ([target.ckey]) hair into a [src].") target.attack_log += text("\[[time_stamp()]\] Has had their hair fed into [src] by [user.name] ([user.ckey])") - msg_admin_attack("[key_name_admin(user)] fed [key_name_admin(target)] in a [src]. (JMP)") + msg_admin_attack("[key_name_admin(user)] fed [key_name_admin(target)] in a [src]. (JMP)",ckey=key_name(user),ckey_target=key_name(target)) else return if(!do_after(usr, 35)) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index 032c7470ee6..74039079960 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -117,9 +117,9 @@ if(alien == IS_DIONA) return //Diona can gain nutrients, but don't get drunk or suffer other effects - + if(isunathi(M))//unathi are poisoned by alcohol as well - M.adjustToxLoss(2.5 * removed * (strength / 100)) + M.adjustToxLoss(1.5 * removed * (strength / 100)) var/quantity = (strength / 100) * removed M.intoxication += quantity @@ -158,6 +158,50 @@ usr << "The solution dissolves the ink on the book." return + +//Butanol is a common alcohol that is fairly ineffective for humans and most other species, but highly intoxicating to unathi +//Butanol duplicates a lot of code from ethanol. This is by design, it does not inherit. +//Possible future todo: Add "alcohol" as a parent class to both ethanol and butanol +/datum/reagent/butanol + name = "Butanol" //Parent class for all alcoholic reagents. + id = "butanol" + description = "A fairly harmless alcohol that has intoxicating effects on certain species." + reagent_state = LIQUID + color = "#404030" + ingest_met = 0.17 //Extremely slow metabolic rate means the liver will generally purge it faster than it can intoxicate you + var/nutriment_factor = 0.5 + var/strength = 100 // This is the ABV of the drink + + glass_icon_state = "glass_clear" + glass_name = "glass of butanol" + glass_desc = "A fairly harmless alcohol that has intoxicating effects on certain species." + +/datum/reagent/butanol/touch_mob(var/mob/living/L, var/amount) + if(istype(L) && strength > 40) + L.adjust_fire_stacks((amount / 7) * (strength / 100)) //Butanol is a bit less flammable than ethanol + +/datum/reagent/butanol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + M.adjustToxLoss(removed) + return + +/datum/reagent/butanol/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + if(isvaurca(M))//Vaurca are damaged instead of getting nutrients, but they can still get drunk + M.adjustToxLoss(removed * (strength / 100)) + else + M.nutrition += nutriment_factor * removed + + if(alien == IS_DIONA) + return //Diona can gain nutrients, but don't get drunk or suffer other effects + + if(isunathi(M)) + ingest_met = initial(ingest_met)*3 //Unathi digest butanol much faster + + var/quantity = (strength / 100) * removed + M.intoxication += quantity + + + + /datum/reagent/hydrazine name = "Hydrazine" id = "hydrazine" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 5f63e9b02d4..6e32a024fc7 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -787,6 +787,7 @@ glass_desc = "No relation to a certain rap artist/ actor." glass_center_of_mass = list("x"=15, "y"=10) + /datum/reagent/drink/coffee name = "Coffee" id = "coffee" @@ -1262,6 +1263,18 @@ glass_desc = "A crystal clear glass of Griffeater gin." glass_center_of_mass = list("x"=16, "y"=12) +/datum/reagent/ethanol/victorygin + name = "Victory Gin" + id = "victorygin" + description = "An oily Adhomai-based gin." + color = "#664300" + strength = 32 + + glass_icon_state = "ginvodkaglass" + glass_name = "glass of gin" + glass_desc = "It has an oily smell and doesn't taste like typical gin." + glass_center_of_mass = list("x"=16, "y"=12) + //Base type for alchoholic drinks containing coffee /datum/reagent/ethanol/coffee overdose = 45 @@ -2529,3 +2542,31 @@ glass_icon_state = "tallblackrussian" glass_name = "glass of Tall Black Russian" glass_desc = "Just like black russian but taller." + + +// Butanol-based alcoholic drinks +//===================================== +//These are mainly for unathi, and have very little (but still some) effect on other species + +/datum/reagent/butanol/xuizijuice + name = "Xuizi Juice" + id = "xuizijuice" + description = "Blended flower buds from a Moghean Xuizi cactus. Has a mild butanol content and is a staple recreational beverage in Unathi culture." + color = "#91de47" + strength = 5 + + glass_icon_state = "xuiziglass" + glass_name = "glass of Xuizi Juice" + glass_desc = "The clear green liquid smells like vanilla, tastes like water. Unathi swear it has a rich taste and texture." + +/datum/reagent/butanol/sarezhiwine + name = "Sarezhi Wine" + id = "sarezhiwine" + description = "An alcoholic beverage made from lightly fermented Sareszhi berries, considered an upper class delicacy on Moghes. Significant butanol content indicates intoxicating effects on Unathi." + color = "#bf8fbc" + strength = 20 + + glass_icon_state = "sarezhiglass" + glass_name = "glass of Sarezhi Wine" + glass_desc = "It tastes like flat grape soda. Is this supposed to be alcoholic?" + diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 6fdff178b1f..4683a953b1f 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1560,6 +1560,8 @@ required_reagents = list("ice" = 1, "tea" = 2) result_amount = 3 + + /datum/chemical_reaction/icecoffee name = "Iced Coffee" id = "icecoffee" @@ -1582,6 +1584,14 @@ catalysts = list("enzyme" = 5) result_amount = 10 +/datum/chemical_reaction/butanol + name = "Butanol" + id = "butanol" + result = "butanol" + required_reagents = list("cornoil" = 10, "sugar" = 10) + catalysts = list("enzyme" = 5) + result_amount = 5 + /datum/chemical_reaction/grenadine name = "Grenadine Syrup" id = "grenadine" diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index 0e7321089c8..7d3efa66406 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -27,6 +27,7 @@ mercury spawn_reagent = "mercury" radium spawn_reagent = "radium" ethanol spawn_reagent = "ethanol" + butanol spawn_reagent = "butanol" sacid spawn_reagent = "sacid" tungsten spawn_reagent = "tungsten" diff --git a/code/modules/reagents/dispenser/cartridge_spawn.dm b/code/modules/reagents/dispenser/cartridge_spawn.dm index 730e191891c..bcaaf625454 100644 --- a/code/modules/reagents/dispenser/cartridge_spawn.dm +++ b/code/modules/reagents/dispenser/cartridge_spawn.dm @@ -10,4 +10,4 @@ C.reagents.add_reagent(reagent, C.volume) var/datum/reagent/R = chemical_reagents_list[reagent] C.setLabel(R.name) - log_admin("[key_name(usr)] spawned a [size] reagent container containing [reagent] at ([usr.x],[usr.y],[usr.z])") + log_admin("[key_name(usr)] spawned a [size] reagent container containing [reagent] at ([usr.x],[usr.y],[usr.z])",admin_key=key_name(usr)) diff --git a/code/modules/reagents/dispenser/dispenser_presets.dm b/code/modules/reagents/dispenser/dispenser_presets.dm index 350cb0deea9..ab1b158d21e 100644 --- a/code/modules/reagents/dispenser/dispenser_presets.dm +++ b/code/modules/reagents/dispenser/dispenser_presets.dm @@ -18,6 +18,7 @@ /obj/item/weapon/reagent_containers/chem_disp_cartridge/radium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/water, /obj/item/weapon/reagent_containers/chem_disp_cartridge/ethanol, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/butanol, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sacid, /obj/item/weapon/reagent_containers/chem_disp_cartridge/tungsten diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index e64ac310be7..7c8c07121dc 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -71,7 +71,7 @@ var/contained = reagentlist() target.attack_log += text("\[[time_stamp()]\] Has been splashed with [name] by [user.name] ([user.ckey]). Reagents: [contained]") user.attack_log += text("\[[time_stamp()]\] Used the [name] to splash [target.name] ([target.key]). Reagents: [contained]") - msg_admin_attack("[user.name] ([user.ckey]) splashed [target.name] ([target.key]) with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) splashed [target.name] ([target.key]) with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(target)) user.visible_message("[target] has been splashed with something by [user]!", "You splash the solution onto [target].") reagents.splash(target, reagents.total_volume) @@ -145,7 +145,7 @@ var/contained = reagentlist() target.attack_log += text("\[[time_stamp()]\] Has been fed [name] by [user.name] ([user.ckey]). Reagents: [contained]") user.attack_log += text("\[[time_stamp()]\] Fed [name] by [target.name] ([target.ckey]). Reagents: [contained]") - msg_admin_attack("[key_name(user)] fed [key_name(target)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[key_name(user)] fed [key_name(target)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(target)) reagents.trans_to_mob(target, amount_per_transfer_from_this, CHEM_INGEST) feed_sound(user) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index c352b603328..2aca69b055a 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -61,7 +61,7 @@ var/contained = reagentlist() M.attack_log += text("\[[time_stamp()]\] Has been squirted with [name] by [user.name] ([user.ckey]). Reagents: [contained]") user.attack_log += text("\[[time_stamp()]\] Used the [name] to squirt [M.name] ([M.key]). Reagents: [contained]") - msg_admin_attack("[user.name] ([user.ckey]) squirted [M.name] ([M.key]) with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) squirted [M.name] ([M.key]) with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(M)) return else diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index b3a44f0a5e9..5e918ceea31 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -179,6 +179,15 @@ ..() reagents.add_reagent("gin", 100) +/obj/item/weapon/reagent_containers/food/drinks/bottle/victorygin + name = "Victory gin" + desc = "Pour one out for Al'mari. His gun was on stun, bless his heart." + icon_state = "victorygin" + center_of_mass = list("x"=16, "y"=4) + New() + ..() + reagents.add_reagent("victorygin", 100) + /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey name = "Uncle Git's Special Reserve" desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES." @@ -499,3 +508,25 @@ New() ..() reagents.add_reagent("sbiten", 100) + + +// Butanol-based alcoholic drinks +//===================================== +//These are mainly for unathi, and have very little (but still some) effect on other species + +/obj/item/weapon/reagent_containers/food/drinks/bottle/small/xuizijuice + name = "Xuizi Juice" + desc = "Blended flower buds from the Xuizi cactus. It smells faintly of vanilla. Bottled by the Arizi Guild for over 200 years." + icon_state = "xuizibottle" + center_of_mass = list("x"=16, "y"=10) + New() + ..() + reagents.add_reagent("xuizijuice", 30) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/sarezhiwine + name = "Sarezhi Wine" + desc = "A premium Moghean wine made from Sareszhi berries. Bottled by the Arizi Guild for over 200 years." + icon_state = "sarezhibottle" + New() + ..() + reagents.add_reagent("sarezhiwine", 100) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm index 8c9a7ded478..c3a0e8224dc 100644 --- a/code/modules/reagents/reagent_containers/food/lunch.dm +++ b/code/modules/reagents/reagent_containers/food/lunch.dm @@ -1,11 +1,11 @@ var/list/lunchables_lunches_ = list(/obj/item/weapon/reagent_containers/food/snacks/sandwich, - /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice, - /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice, - /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice, - /obj/item/weapon/reagent_containers/food/snacks/margheritaslice, - /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice, - /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice, - /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice, + /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/margheritaslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice/filled, /obj/item/weapon/reagent_containers/food/snacks/tastybread, /obj/item/weapon/reagent_containers/food/snacks/liquidfood, /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry, @@ -29,17 +29,17 @@ var/list/lunchables_snacks_ = list(/obj/item/weapon/reagent_containers/food/snac /obj/item/weapon/reagent_containers/food/snacks/cherrypie, /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit, /obj/item/weapon/reagent_containers/food/snacks/appletart, - /obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice, - /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice, - /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice, - /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice, - /obj/item/weapon/reagent_containers/food/snacks/limecakeslice, - /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice, - /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice, - /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice, - /obj/item/weapon/reagent_containers/food/snacks/watermelonslice, - /obj/item/weapon/reagent_containers/food/snacks/applecakeslice, - /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice, + /obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/limecakeslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/watermelonslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/applecakeslice/filled, + /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice/filled, /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks, /obj/item/weapon/reagent_containers/food/snacks/friedkois, /obj/item/weapon/reagent_containers/food/snacks/meatsnack, diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index c0b2e1d23f9..9a997c97c3d 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -91,7 +91,7 @@ M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: [reagentlist(src)]") user.attack_log += text("\[[time_stamp()]\] Fed [src.name] by [M.name] ([M.ckey]) Reagents: [reagentlist(src)]") - msg_admin_attack("[key_name(user)] fed [key_name(M)] with [src.name] Reagents: [reagentlist(src)] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("[key_name(user)] fed [key_name(M)] with [src.name] Reagents: [reagentlist(src)] (INTENT: [uppertext(user.a_intent)])",ckey=key_name(user),ckey_target=key_name(M)) user.visible_message("[user] feeds [M] [src].") @@ -404,11 +404,11 @@ // name = "xenoburger" //Name that displays in the UI. // desc = "Smells caustic. Tastes like heresy." //Duh // icon_state = "xburger" //Refers to an icon in food.dmi -// New() //Don't mess with this. -// ..() //Same here. -// reagents.add_reagent("xenomicrobes", 10) //This is what is in the food item. you may copy/paste -// reagents.add_reagent("nutriment", 2) // this line of code for all the contents. -// bitesize = 3 //This is the amount each bite consumes. +//obj/item/weapon/reagent_containers/food/snacks/xenoburger/New() //Don't mess with this. And always use Full Path Structure +// ..() //Same here. +// reagents.add_reagent("xenomicrobes", 10) //This is what is in the food item. you may copy/paste +// reagents.add_reagent("nutriment", 2) // this line of code for all the contents. +// bitesize = 3 //This is the amount each bite consumes. @@ -419,10 +419,10 @@ trash = /obj/item/trash/koisbar filling_color = "#dcd9cd" - New() - ..() - reagents.add_reagent("koispaste", 20) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/koisbar/New() + ..() + reagents.add_reagent("koispaste", 20) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/aesirsalad name = "aesir salad" @@ -432,12 +432,12 @@ filling_color = "#468C00" center_of_mass = list("x"=17, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("doctorsdelight", 8) - reagents.add_reagent("tricordrazine", 8) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/aesirsalad/New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("doctorsdelight", 8) + reagents.add_reagent("tricordrazine", 8) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/candy name = "candy" @@ -447,22 +447,22 @@ filling_color = "#7D5F46" center_of_mass = list("x"=15, "y"=15) - New() - ..() - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("sugar", 3) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/candy/New() + ..() + reagents.add_reagent("nutriment", 1) + reagents.add_reagent("sugar", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/candy/donor name = "donor candy" desc = "A little treat for blood donors." trash = /obj/item/trash/candy - New() - ..() - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("sugar", 3) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/candy/donor/New() + ..() + reagents.add_reagent("nutriment", 10) + reagents.add_reagent("sugar", 3) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/candy_corn name = "candy corn" @@ -471,11 +471,11 @@ filling_color = "#FFFCB0" center_of_mass = list("x"=14, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("sugar", 2) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/candy_corn/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("sugar", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/chips name = "chips" @@ -485,10 +485,10 @@ filling_color = "#E8C31E" center_of_mass = list("x"=15, "y"=15) - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 +/obj/item/weapon/reagent_containers/food/snacks/chips/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/cookie name = "cookie" @@ -497,10 +497,10 @@ filling_color = "#DBC94F" center_of_mass = list("x"=17, "y"=18) - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 1 +/obj/item/weapon/reagent_containers/food/snacks/cookie/New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/chocolatebar name = "chocolate bar" @@ -509,12 +509,12 @@ filling_color = "#7D5F46" center_of_mass = list("x"=15, "y"=15) - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sugar", 2) - reagents.add_reagent("coco", 2) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/chocolatebar/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("sugar", 2) + reagents.add_reagent("coco", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/chocolateegg name = "chocolate egg" @@ -523,12 +523,12 @@ filling_color = "#7D5F46" center_of_mass = list("x"=16, "y"=13) - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sugar", 2) - reagents.add_reagent("coco", 2) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/chocolateegg/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sugar", 2) + reagents.add_reagent("coco", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/donut name = "donut" @@ -542,17 +542,18 @@ name = "donut" desc = "Goes great with Robust Coffee." icon_state = "donut1" - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - src.bitesize = 3 - if(prob(30)) - src.icon_state = "donut2" - src.overlay_state = "box-donut2" - src.name = "frosted donut" - reagents.add_reagent("sprinkles", 2) - center_of_mass = list("x"=19, "y"=16) + +/obj/item/weapon/reagent_containers/food/snacks/donut/normal/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + src.bitesize = 3 + if(prob(30)) + src.icon_state = "donut2" + src.overlay_state = "box-donut2" + src.name = "frosted donut" + reagents.add_reagent("sprinkles", 2) + center_of_mass = list("x"=19, "y"=16) /obj/item/weapon/reagent_containers/food/snacks/donut/chaos name = "chaos donut" @@ -560,38 +561,38 @@ icon_state = "donut1" filling_color = "#ED11E6" - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sprinkles", 1) - bitesize = 10 - var/chaosselect = pick(1,2,3,4,5,6,7,8,9,10) - switch(chaosselect) - if(1) - reagents.add_reagent("nutriment", 3) - if(2) - reagents.add_reagent("capsaicin", 3) - if(3) - reagents.add_reagent("frostoil", 3) - if(4) - reagents.add_reagent("sprinkles", 3) - if(5) - reagents.add_reagent("phoron", 3) - if(6) - reagents.add_reagent("coco", 3) - if(7) - reagents.add_reagent("slimejelly", 3) - if(8) - reagents.add_reagent("banana", 3) - if(9) - reagents.add_reagent("berryjuice", 3) - if(10) - reagents.add_reagent("tricordrazine", 3) - if(prob(30)) - src.icon_state = "donut2" - src.overlay_state = "box-donut2" - src.name = "Frosted Chaos Donut" - reagents.add_reagent("sprinkles", 2) +/obj/item/weapon/reagent_containers/food/snacks/donut/chaos/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("sprinkles", 1) + bitesize = 10 + var/chaosselect = pick(1,2,3,4,5,6,7,8,9,10) + switch(chaosselect) + if(1) + reagents.add_reagent("nutriment", 3) + if(2) + reagents.add_reagent("capsaicin", 3) + if(3) + reagents.add_reagent("frostoil", 3) + if(4) + reagents.add_reagent("sprinkles", 3) + if(5) + reagents.add_reagent("phoron", 3) + if(6) + reagents.add_reagent("coco", 3) + if(7) + reagents.add_reagent("slimejelly", 3) + if(8) + reagents.add_reagent("banana", 3) + if(9) + reagents.add_reagent("berryjuice", 3) + if(10) + reagents.add_reagent("tricordrazine", 3) + if(prob(30)) + src.icon_state = "donut2" + src.overlay_state = "box-donut2" + src.name = "Frosted Chaos Donut" + reagents.add_reagent("sprinkles", 2) /obj/item/weapon/reagent_containers/food/snacks/donut/jelly @@ -601,17 +602,17 @@ filling_color = "#ED1169" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("berryjuice", 5) - bitesize = 5 - if(prob(30)) - src.icon_state = "jdonut2" - src.overlay_state = "box-donut2" - src.name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) +/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + reagents.add_reagent("berryjuice", 5) + bitesize = 5 + if(prob(30)) + src.icon_state = "jdonut2" + src.overlay_state = "box-donut2" + src.name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) /obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly name = "jelly donut" @@ -620,17 +621,17 @@ filling_color = "#ED1169" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("slimejelly", 5) - bitesize = 5 - if(prob(30)) - src.icon_state = "jdonut2" - src.overlay_state = "box-donut2" - src.name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) +/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + reagents.add_reagent("slimejelly", 5) + bitesize = 5 + if(prob(30)) + src.icon_state = "jdonut2" + src.overlay_state = "box-donut2" + src.name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly name = "jelly donut" @@ -639,17 +640,17 @@ filling_color = "#ED1169" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("cherryjelly", 5) - bitesize = 5 - if(prob(30)) - src.icon_state = "jdonut2" - src.overlay_state = "box-donut2" - src.name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) +/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + reagents.add_reagent("cherryjelly", 5) + bitesize = 5 + if(prob(30)) + src.icon_state = "jdonut2" + src.overlay_state = "box-donut2" + src.name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) /obj/item/weapon/reagent_containers/food/snacks/funnelcake name = "funnel cake" @@ -658,11 +659,12 @@ filling_color = "#Ef1479" center_of_mass = list("x"=16, "y"=12) do_coating_prefix = 0 - New() - ..() - reagents.add_reagent("batter", 10) - reagents.add_reagent("sugar", 5) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/funnelcake/New() + ..() + reagents.add_reagent("batter", 10) + reagents.add_reagent("sugar", 5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/egg @@ -739,12 +741,12 @@ filling_color = "#FFDF78" center_of_mass = list("x"=16, "y"=14) - New() - ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) - bitesize = 1 +/obj/item/weapon/reagent_containers/food/snacks/friedegg/New() + ..() + reagents.add_reagent("protein", 3) + reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("blackpepper", 1) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/boiledegg name = "boiled egg" @@ -752,9 +754,9 @@ icon_state = "egg" filling_color = "#FFFFFF" - New() - ..() - reagents.add_reagent("protein", 2) +/obj/item/weapon/reagent_containers/food/snacks/boiledegg/New() + ..() + reagents.add_reagent("protein", 2) /obj/item/weapon/reagent_containers/food/snacks/organ name = "organ" @@ -764,11 +766,11 @@ filling_color = "#E00D34" center_of_mass = list("x"=16, "y"=16) - New() - ..() - reagents.add_reagent("protein", rand(3,5)) - reagents.add_reagent("toxin", rand(1,3)) - src.bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/organ/New() + ..() + reagents.add_reagent("protein", rand(3,5)) + reagents.add_reagent("toxin", rand(1,3)) + src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tofu name = "tofu" @@ -777,10 +779,10 @@ filling_color = "#FFFEE0" center_of_mass = list("x"=17, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 3) - src.bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/tofu/New() + ..() + reagents.add_reagent("nutriment", 3) + src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tofurkey name = "tofurkey" @@ -789,11 +791,11 @@ filling_color = "#FFFEE0" center_of_mass = list("x"=16, "y"=8) - New() - ..() - reagents.add_reagent("nutriment", 12) - reagents.add_reagent("stoxin", 3) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/tofurkey/New() + ..() + reagents.add_reagent("nutriment", 12) + reagents.add_reagent("stoxin", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/stuffing name = "stuffing" @@ -802,10 +804,10 @@ filling_color = "#C9AC83" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 +/obj/item/weapon/reagent_containers/food/snacks/stuffing/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/carpmeat name = "carp fillet" @@ -814,11 +816,11 @@ filling_color = "#FFDEFE" center_of_mass = list("x"=17, "y"=13) - New() - ..() - reagents.add_reagent("seafood", 3) - reagents.add_reagent("carpotoxin", 3) - src.bitesize = 6 +/obj/item/weapon/reagent_containers/food/snacks/carpmeat/New() + ..() + reagents.add_reagent("seafood", 3) + reagents.add_reagent("carpotoxin", 3) + src.bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/fishfingers name = "fish Fingers" @@ -827,11 +829,11 @@ filling_color = "#FFDEFE" center_of_mass = list("x"=16, "y"=13) - New() - ..() - reagents.add_reagent("seafood", 4) - reagents.add_reagent("carpotoxin", 3) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/fishfingers/New() + ..() + reagents.add_reagent("seafood", 4) + reagents.add_reagent("carpotoxin", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice name = "huge mushroom slice" @@ -840,11 +842,11 @@ filling_color = "#E0D7C5" center_of_mass = list("x"=17, "y"=16) - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("psilocybin", 3) - src.bitesize = 6 +/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("psilocybin", 3) + src.bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/tomatomeat name = "tomato slice" @@ -853,10 +855,10 @@ filling_color = "#DB0000" center_of_mass = list("x"=17, "y"=16) - New() - ..() - reagents.add_reagent("nutriment", 3) - src.bitesize = 6 +/obj/item/weapon/reagent_containers/food/snacks/tomatomeat/New() + ..() + reagents.add_reagent("nutriment", 3) + src.bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/bearmeat name = "bear meat" @@ -865,11 +867,11 @@ filling_color = "#DB0000" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("protein", 12) - reagents.add_reagent("hyperzine", 5) - src.bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/bearmeat/New() + ..() + reagents.add_reagent("protein", 12) + reagents.add_reagent("hyperzine", 5) + src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/xenomeat name = "meat" @@ -878,11 +880,11 @@ filling_color = "#43DE18" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("pacid",6) - src.bitesize = 6 +/obj/item/weapon/reagent_containers/food/snacks/xenomeat/New() + ..() + reagents.add_reagent("protein", 6) + reagents.add_reagent("pacid",6) + src.bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/meatball name = "meatball" @@ -891,10 +893,10 @@ filling_color = "#DB0000" center_of_mass = list("x"=16, "y"=16) - New() - ..() - reagents.add_reagent("protein", 3) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/meatball/New() + ..() + reagents.add_reagent("protein", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sausage name = "sausage" @@ -903,10 +905,10 @@ filling_color = "#DB0000" center_of_mass = list("x"=16, "y"=16) - New() - ..() - reagents.add_reagent("protein", 6) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sausage/New() + ..() + reagents.add_reagent("protein", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sausage/battered name = "battered sausage" @@ -915,12 +917,13 @@ filling_color = "#DB0000" center_of_mass = list("x"=16, "y"=16) do_coating_prefix = 0 - New() - ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("batter", 1.7) - reagents.add_reagent("oil", 1.5) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sausage/battered/New() + ..() + reagents.add_reagent("protein", 6) + reagents.add_reagent("batter", 1.7) + reagents.add_reagent("oil", 1.5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/jalapeno_poppers name = "jalapeno popper" @@ -929,12 +932,13 @@ filling_color = "#00AA00" center_of_mass = list("x"=10, "y"=6) do_coating_prefix = 0 - New() - ..() - reagents.add_reagent("nutriment", 1.5) - reagents.add_reagent("batter", 0.3) - reagents.add_reagent("oil", 0.15) - bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/jalapeno_poppers/New() + ..() + reagents.add_reagent("nutriment", 1.5) + reagents.add_reagent("batter", 0.3) + reagents.add_reagent("oil", 0.15) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket @@ -960,31 +964,31 @@ icon_state = "donkpocket" filling_color = "#DEDEAB" center_of_mass = list("x"=16, "y"=10) - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("protein", 2) - var/warm = 0 var/list/heated_reagents = list("tricordrazine" = 5) - proc/heat() - warm = 1 - for(var/reagent in heated_reagents) - reagents.add_reagent(reagent, heated_reagents[reagent]) - bitesize = 6 - name = "Warm " + name - cooltime() - proc/cooltime() - if (src.warm) - spawn(4200) - if(src) - src.warm = 0 - for(var/reagent in heated_reagents) - src.reagents.del_reagent(reagent) - src.name = initial(name) - return +/obj/item/weapon/reagent_containers/food/snacks/donkpocket/New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("protein", 2) + +/obj/item/weapon/reagent_containers/food/snacks/donkpocket/proc/heat() + warm = 1 + for(var/reagent in heated_reagents) + reagents.add_reagent(reagent, heated_reagents[reagent]) + bitesize = 6 + name = "Warm " + name + cooltime() + +/obj/item/weapon/reagent_containers/food/snacks/donkpocket/proc/cooltime() + if (src.warm) + spawn(4200) + if(src) + src.warm = 0 + for(var/reagent in heated_reagents) + src.reagents.del_reagent(reagent) + src.name = initial(name) + return /obj/item/weapon/reagent_containers/food/snacks/donkpocket/cook() ..() @@ -998,11 +1002,11 @@ filling_color = "#F2B6EA" center_of_mass = list("x"=15, "y"=11) - New() - ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("alkysine", 6) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/brainburger/New() + ..() + reagents.add_reagent("protein", 6) + reagents.add_reagent("alkysine", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/ghostburger name = "ghost burger" @@ -1011,10 +1015,10 @@ filling_color = "#FFF2FF" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/ghostburger/New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/human @@ -1027,10 +1031,11 @@ desc = "A bloody burger." icon_state = "hburger" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("protein", 6) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/human/burger/New() + ..() + reagents.add_reagent("protein", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheeseburger name = "cheeseburger" @@ -1038,10 +1043,10 @@ icon_state = "cheeseburger" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("protein", 2) - reagents.add_reagent("nutriment", 2) +/obj/item/weapon/reagent_containers/food/snacks/cheeseburger/New() + ..() + reagents.add_reagent("protein", 2) + reagents.add_reagent("nutriment", 2) /obj/item/weapon/reagent_containers/food/snacks/monkeyburger name = "burger" @@ -1050,11 +1055,11 @@ filling_color = "#D63C3C" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/monkeyburger/New() + ..() + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fishburger name = "fillet -o- carp sandwich" @@ -1063,11 +1068,11 @@ filling_color = "#FFDEFE" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("seafood", 6) - reagents.add_reagent("carpotoxin", 3) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/fishburger/New() + ..() + reagents.add_reagent("seafood", 6) + reagents.add_reagent("carpotoxin", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tofuburger name = "tofu burger" @@ -1076,10 +1081,10 @@ filling_color = "#FFFEE0" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/tofuburger/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/roburger name = "roburger" @@ -1088,12 +1093,12 @@ filling_color = "#CCCCCC" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 2) - if(prob(5)) - reagents.add_reagent("nanites", 2) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/roburger/New() + ..() + reagents.add_reagent("nutriment", 2) + if(prob(5)) + reagents.add_reagent("nanites", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/roburgerbig name = "roburger" @@ -1103,10 +1108,10 @@ volume = 100 center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nanites", 100) - bitesize = 0.1 +/obj/item/weapon/reagent_containers/food/snacks/roburgerbig/New() + ..() + reagents.add_reagent("nanites", 100) + bitesize = 0.1 /obj/item/weapon/reagent_containers/food/snacks/xenoburger name = "xenoburger" @@ -1115,10 +1120,10 @@ filling_color = "#43DE18" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("protein", 8) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/xenoburger/New() + ..() + reagents.add_reagent("protein", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/clownburger name = "clown burger" @@ -1127,10 +1132,10 @@ filling_color = "#FF00FF" center_of_mass = list("x"=17, "y"=12) - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/clownburger/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/mimeburger name = "mime burger" @@ -1139,20 +1144,21 @@ filling_color = "#FFFFFF" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/mimeburger/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/mouseburger name = "mouse burger" desc = "Squeaky and a little furry." icon_state = "ratburger" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("protein", 4) - bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/mouseburger/New() + ..() + reagents.add_reagent("protein", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/omelette @@ -1163,23 +1169,22 @@ filling_color = "#FFF9A8" center_of_mass = list("x"=16, "y"=13) - //var/herp = 0 - New() - ..() - reagents.add_reagent("protein", 8) - bitesize = 1 +/obj/item/weapon/reagent_containers/food/snacks/omelette/New() + ..() + reagents.add_reagent("protein", 8) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/muffin - name = "Muffin" + name = "muffin" desc = "A delicious and spongy little cake" icon_state = "muffin" filling_color = "#E0CF9B" center_of_mass = list("x"=17, "y"=4) - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/muffin/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/pie name = "banana cream pie" @@ -1208,11 +1213,11 @@ trash = /obj/item/trash/plate center_of_mass = list("x"=16, "y"=13) - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("berryjuice", 5) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/berryclafoutis/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("berryjuice", 5) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/waffles name = "waffles" @@ -1222,10 +1227,10 @@ filling_color = "#E6DEB5" center_of_mass = list("x"=15, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/waffles/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/eggplantparm name = "eggplant parmigiana" @@ -1235,10 +1240,10 @@ filling_color = "#4D2F5E" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/eggplantparm/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soylentgreen name = "soylent green" @@ -1248,10 +1253,10 @@ filling_color = "#B8E6B5" center_of_mass = list("x"=15, "y"=11) - New() - ..() - reagents.add_reagent("protein", 10) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/soylentgreen/New() + ..() + reagents.add_reagent("protein", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soylenviridians name = "soylen virdians" @@ -1261,10 +1266,10 @@ filling_color = "#E6FA61" center_of_mass = list("x"=15, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/soylenviridians/New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatpie @@ -1275,10 +1280,10 @@ filling_color = "#948051" center_of_mass = list("x"=16, "y"=13) - New() - ..() - reagents.add_reagent("protein", 10) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/meatpie/New() + ..() + reagents.add_reagent("protein", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tofupie name = "tofu-pie" @@ -1288,10 +1293,10 @@ filling_color = "#FFFEE0" center_of_mass = list("x"=16, "y"=13) - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/tofupie/New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/amanita_pie name = "amanita pie" @@ -1300,12 +1305,12 @@ filling_color = "#FFCCCC" center_of_mass = list("x"=17, "y"=9) - New() - ..() - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("amatoxin", 3) - reagents.add_reagent("psilocybin", 1) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/amanita_pie/New() + ..() + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("amatoxin", 3) + reagents.add_reagent("psilocybin", 1) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/plump_pie name = "plump pie" @@ -1314,17 +1319,17 @@ filling_color = "#B8279B" center_of_mass = list("x"=17, "y"=9) - New() - ..() - if(prob(10)) - name = "exceptional plump pie" - desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("tricordrazine", 5) - bitesize = 2 - else - reagents.add_reagent("nutriment", 8) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/plump_pie/New() + ..() + if(prob(10)) + name = "exceptional plump pie" + desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("tricordrazine", 5) + bitesize = 2 + else + reagents.add_reagent("nutriment", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/xemeatpie name = "xeno-pie" @@ -1334,10 +1339,10 @@ filling_color = "#43DE18" center_of_mass = list("x"=16, "y"=13) - New() - ..() - reagents.add_reagent("protein", 10) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/xemeatpie/New() + ..() + reagents.add_reagent("protein", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/wingfangchu name = "wing fang chu" @@ -1347,10 +1352,10 @@ filling_color = "#43DE18" center_of_mass = list("x"=17, "y"=9) - New() - ..() - reagents.add_reagent("protein", 6) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/wingfangchu/New() + ..() + reagents.add_reagent("protein", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/human/kabob @@ -1361,10 +1366,10 @@ filling_color = "#A85340" center_of_mass = list("x"=17, "y"=15) - New() - ..() - reagents.add_reagent("protein", 8) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/human/kabob/New() + ..() + reagents.add_reagent("protein", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/monkeykabob name = "meat-kabob" @@ -1374,10 +1379,10 @@ filling_color = "#A85340" center_of_mass = list("x"=17, "y"=15) - New() - ..() - reagents.add_reagent("protein", 8) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/monkeykabob/New() + ..() + reagents.add_reagent("protein", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tofukabob name = "tofu-kabob" @@ -1387,10 +1392,10 @@ filling_color = "#FFFEE0" center_of_mass = list("x"=17, "y"=15) - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/tofukabob/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cubancarp name = "cuban carp" @@ -1399,13 +1404,14 @@ trash = /obj/item/trash/plate filling_color = "#E9ADFF" center_of_mass = list("x"=12, "y"=5) - New() - ..() - reagents.add_reagent("seafood", 3) - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("carpotoxin", 3) - reagents.add_reagent("capsaicin", 3) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/cubancarp/New() + ..() + reagents.add_reagent("seafood", 3) + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("carpotoxin", 3) + reagents.add_reagent("capsaicin", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/chickenkatsu name = "chicken katsu" @@ -1415,12 +1421,13 @@ filling_color = "#E9ADFF" center_of_mass = list("x"=16, "y"=16) do_coating_prefix = 0 - New() - ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("beerbatter", 2) - reagents.add_reagent("oil", 1) - bitesize = 1.5 + +/obj/item/weapon/reagent_containers/food/snacks/chickenkatsu/New() + ..() + reagents.add_reagent("protein", 6) + reagents.add_reagent("beerbatter", 2) + reagents.add_reagent("oil", 1) + bitesize = 1.5 /obj/item/weapon/reagent_containers/food/snacks/popcorn name = "popcorn" @@ -1431,16 +1438,17 @@ filling_color = "#FFFAD4" center_of_mass = list("x"=16, "y"=8) - New() - ..() - unpopped = rand(1,10) - reagents.add_reagent("nutriment", 2) - bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 - On_Consume() - if(prob(unpopped)) //lol ...what's the point? - usr << "You bite down on an un-popped kernel!" - unpopped = max(0, unpopped-1) - ..() +/obj/item/weapon/reagent_containers/food/snacks/popcorn/New() + ..() + unpopped = rand(1,10) + reagents.add_reagent("nutriment", 2) + bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 + +/obj/item/weapon/reagent_containers/food/snacks/popcorn/On_Consume() + if(prob(unpopped)) //lol ...what's the point? + usr << "You bite down on an un-popped kernel!" + unpopped = max(0, unpopped-1) + ..() /obj/item/weapon/reagent_containers/food/snacks/sosjerky @@ -1451,10 +1459,10 @@ filling_color = "#631212" center_of_mass = list("x"=15, "y"=9) - New() - ..() - reagents.add_reagent("protein", 4) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sosjerky/New() + ..() + reagents.add_reagent("protein", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/no_raisin name = "4no Raisins" @@ -1464,9 +1472,9 @@ filling_color = "#343834" center_of_mass = list("x"=15, "y"=4) - New() - ..() - reagents.add_reagent("nutriment", 6) +/obj/item/weapon/reagent_containers/food/snacks/no_raisin/New() + ..() + reagents.add_reagent("nutriment", 6) /obj/item/weapon/reagent_containers/food/snacks/spacetwinkie name = "space twinkie" @@ -1475,10 +1483,10 @@ filling_color = "#FFE591" center_of_mass = list("x"=15, "y"=11) - New() - ..() - reagents.add_reagent("sugar", 4) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie/New() + ..() + reagents.add_reagent("sugar", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers name = "Cheesie Honkers" @@ -1488,10 +1496,10 @@ filling_color = "#FFA305" center_of_mass = list("x"=15, "y"=9) - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/syndicake name = "Syndi-Cakes" @@ -1499,13 +1507,13 @@ desc = "An extremely moist snack cake that tastes just as good after being nuked." filling_color = "#FF5D05" center_of_mass = list("x"=16, "y"=10) - trash = /obj/item/trash/syndi_cakes - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("doctorsdelight", 5) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/syndicake/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("doctorsdelight", 5) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato name = "loaded baked potato" @@ -1514,11 +1522,11 @@ filling_color = "#9C7A68" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("protein", 3) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("protein", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fries name = "space fries" @@ -1528,11 +1536,11 @@ filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("oil", 1.2)//This is mainly for the benefit of adminspawning - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/fries/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("oil", 1.2)//This is mainly for the benefit of adminspawning + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/microchips name = "micro chips" @@ -1542,23 +1550,23 @@ filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 3.5) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/microchips/New() + ..() + reagents.add_reagent("nutriment", 3.5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/ovenchips - name = "ovem chips" + name = "oven chips" desc = "Dark and crispy, but a bit dry" icon_state = "ovenchips" trash = /obj/item/trash/plate filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/ovenchips/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soydope name = "soy dope" @@ -1568,10 +1576,10 @@ filling_color = "#C4BF76" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/soydope/New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spagetti name = "spaghetti" @@ -1580,10 +1588,10 @@ filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=16) - New() - ..() - reagents.add_reagent("nutriment", 1) - bitesize = 1 +/obj/item/weapon/reagent_containers/food/snacks/spagetti/New() + ..() + reagents.add_reagent("nutriment", 1) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/cheesyfries name = "cheesy fries" @@ -1593,11 +1601,11 @@ filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("protein", 2) - reagents.add_reagent("nutriment", 4) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/cheesyfries/New() + ..() + reagents.add_reagent("protein", 2) + reagents.add_reagent("nutriment", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fortunecookie name = "fortune cookie" @@ -1606,10 +1614,10 @@ filling_color = "#E8E79E" center_of_mass = list("x"=15, "y"=14) - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/badrecipe name = "burned mess" @@ -1618,11 +1626,11 @@ filling_color = "#211F02" center_of_mass = list("x"=16, "y"=12) - New() - ..() - reagents.add_reagent("toxin", 1) - reagents.add_reagent("carbon", 3) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/badrecipe/New() + ..() + reagents.add_reagent("toxin", 1) + reagents.add_reagent("carbon", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatsteak name = "meat steak" @@ -1632,13 +1640,13 @@ filling_color = "#7A3D11" center_of_mass = list("x"=16, "y"=13) - New() - ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("triglyceride", 2) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/meatsteak/New() + ..() + reagents.add_reagent("protein", 6) + reagents.add_reagent("triglyceride", 2) + reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("blackpepper", 1) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff name = "spacy liberty duff" @@ -1648,11 +1656,11 @@ filling_color = "#42B873" center_of_mass = list("x"=16, "y"=8) - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("psilocybin", 6) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("psilocybin", 6) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/amanitajelly name = "amanita jelly" @@ -1662,12 +1670,12 @@ filling_color = "#ED0758" center_of_mass = list("x"=16, "y"=5) - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("amatoxin", 6) - reagents.add_reagent("psilocybin", 3) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/amanitajelly/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("amatoxin", 6) + reagents.add_reagent("psilocybin", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/poppypretzel name = "poppy pretzel" @@ -1677,10 +1685,10 @@ filling_color = "#916E36" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/poppypretzel/New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatballsoup @@ -1691,11 +1699,11 @@ filling_color = "#785210" center_of_mass = list("x"=16, "y"=8) - New() - ..() - reagents.add_reagent("protein", 8) - reagents.add_reagent("water", 5) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/meatballsoup/New() + ..() + reagents.add_reagent("protein", 8) + reagents.add_reagent("water", 5) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/slimesoup name = "slime soup" @@ -1703,11 +1711,11 @@ icon_state = "slimesoup" //nonexistant? filling_color = "#C4DBA0" - New() - ..() - reagents.add_reagent("slimejelly", 5) - reagents.add_reagent("water", 10) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/slimesoup/New() + ..() + reagents.add_reagent("slimejelly", 5) + reagents.add_reagent("water", 10) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/bloodsoup name = "tomato soup" @@ -1716,12 +1724,12 @@ filling_color = "#FF0000" center_of_mass = list("x"=16, "y"=7) - New() - ..() - reagents.add_reagent("protein", 2) - reagents.add_reagent("blood", 10) - reagents.add_reagent("water", 5) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/bloodsoup/New() + ..() + reagents.add_reagent("protein", 2) + reagents.add_reagent("blood", 10) + reagents.add_reagent("water", 5) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/clownstears name = "clown's tears" @@ -1730,12 +1738,12 @@ filling_color = "#C4FBFF" center_of_mass = list("x"=16, "y"=7) - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("banana", 5) - reagents.add_reagent("water", 10) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/clownstears/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("banana", 5) + reagents.add_reagent("water", 10) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup name = "vegetable soup" @@ -1745,11 +1753,11 @@ filling_color = "#AFC4B5" center_of_mass = list("x"=16, "y"=8) - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/vegetablesoup/New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("water", 5) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/nettlesoup name = "nettle soup" @@ -1759,12 +1767,12 @@ filling_color = "#AFC4B5" center_of_mass = list("x"=16, "y"=7) - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - reagents.add_reagent("tricordrazine", 5) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/nettlesoup/New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("water", 5) + reagents.add_reagent("tricordrazine", 5) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/mysterysoup name = "mystery soup" @@ -1774,45 +1782,45 @@ filling_color = "#F082FF" center_of_mass = list("x"=16, "y"=6) - New() - ..() - var/mysteryselect = pick(1,2,3,4,5,6,7,8,9,10) - switch(mysteryselect) - if(1) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("capsaicin", 3) - reagents.add_reagent("tomatojuice", 2) - if(2) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("frostoil", 3) - reagents.add_reagent("tomatojuice", 2) - if(3) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("water", 5) - reagents.add_reagent("tricordrazine", 5) - if(4) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("water", 10) - if(5) - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("banana", 10) - if(6) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("blood", 10) - if(7) - reagents.add_reagent("slimejelly", 10) - reagents.add_reagent("water", 10) - if(8) - reagents.add_reagent("carbon", 10) - reagents.add_reagent("toxin", 10) - if(9) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("tomatojuice", 10) - if(10) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("tomatojuice", 5) - reagents.add_reagent("imidazoline", 5) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/mysterysoup/New() + ..() + var/mysteryselect = pick(1,2,3,4,5,6,7,8,9,10) + switch(mysteryselect) + if(1) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("capsaicin", 3) + reagents.add_reagent("tomatojuice", 2) + if(2) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("frostoil", 3) + reagents.add_reagent("tomatojuice", 2) + if(3) + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("water", 5) + reagents.add_reagent("tricordrazine", 5) + if(4) + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("water", 10) + if(5) + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("banana", 10) + if(6) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("blood", 10) + if(7) + reagents.add_reagent("slimejelly", 10) + reagents.add_reagent("water", 10) + if(8) + reagents.add_reagent("carbon", 10) + reagents.add_reagent("toxin", 10) + if(9) + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("tomatojuice", 10) + if(10) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("tomatojuice", 5) + reagents.add_reagent("imidazoline", 5) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/wishsoup name = "wish soup" @@ -1822,13 +1830,13 @@ filling_color = "#D1F4FF" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("water", 10) - bitesize = 5 - if(prob(25)) - src.desc = "A wish come true!" - reagents.add_reagent("nutriment", 8) +/obj/item/weapon/reagent_containers/food/snacks/wishsoup/New() + ..() + reagents.add_reagent("water", 10) + bitesize = 5 + if(prob(25)) + src.desc = "A wish come true!" + reagents.add_reagent("nutriment", 8) /obj/item/weapon/reagent_containers/food/snacks/hotchili name = "hot chili" @@ -1838,13 +1846,13 @@ filling_color = "#FF3C00" center_of_mass = list("x"=15, "y"=9) - New() - ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("capsaicin", 3) - reagents.add_reagent("tomatojuice", 2) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/hotchili/New() + ..() + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("capsaicin", 3) + reagents.add_reagent("tomatojuice", 2) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/coldchili @@ -1855,13 +1863,14 @@ center_of_mass = list("x"=15, "y"=9) trash = /obj/item/trash/snack_bowl - New() - ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("frostoil", 3) - reagents.add_reagent("tomatojuice", 2) - bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/coldchili/New() + ..() + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("frostoil", 3) + reagents.add_reagent("tomatojuice", 2) + bitesize = 5 /* No more of this /obj/item/weapon/reagent_containers/food/snacks/telebacon @@ -1872,15 +1881,15 @@ bitesize = 2 center_of_mass = list("x"=18, "y"=13) - New() - ..() - reagents.add_reagent("nutriment", 4) - baconbeacon = new /obj/item/device/radio/beacon/bacon(src) +/obj/item/weapon/reagent_containers/food/snacks/telebacon/New() + ..() + reagents.add_reagent("nutriment", 4) + baconbeacon = new /obj/item/device/radio/beacon/bacon(src) - On_Consume() - if(!reagents.total_volume) - baconbeacon.loc = usr - baconbeacon.digest_delay() +/obj/item/weapon/reagent_containers/food/snacks/telebacon/On_Consume() + if(!reagents.total_volume) + baconbeacon.loc = usr + baconbeacon.digest_delay() */ /obj/item/weapon/reagent_containers/food/snacks/monkeycube @@ -1895,23 +1904,23 @@ var/wrapped = 0 var/monkey_type = "Monkey" - New() - ..() - reagents.add_reagent("protein", 10) +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/New() + ..() + reagents.add_reagent("protein", 10) - afterattack(obj/O as obj, var/mob/living/carbon/human/user as mob, proximity) - if(!proximity) return - if(( istype(O, /obj/structure/reagent_dispensers/watertank) || istype(O,/obj/structure/sink) ) && !wrapped) - user << "You place \the [name] under a stream of water..." - if(istype(user)) - user.unEquip(src) - src.loc = get_turf(src) - return Expand() - ..() +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/afterattack(obj/O as obj, var/mob/living/carbon/human/user as mob, proximity) + if(!proximity) return + if(( istype(O, /obj/structure/reagent_dispensers/watertank) || istype(O,/obj/structure/sink) ) && !wrapped) + user << "You place \the [name] under a stream of water..." + if(istype(user)) + user.unEquip(src) + src.loc = get_turf(src) + return Expand() + ..() - attack_self(mob/user as mob) - if(wrapped) - Unwrap(user) +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/attack_self(mob/user as mob) + if(wrapped) + Unwrap(user) /* On_Consume(var/mob/M) @@ -1949,22 +1958,22 @@ ..() */ - proc/Expand() - src.visible_message("\The [src] expands!") - var/mob/living/carbon/human/H = new(src.loc) - H.set_species(monkey_type) - H.real_name = H.species.get_random_name() - H.name = H.real_name - src.loc = null - qdel(src) - return 1 +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand() + src.visible_message("\The [src] expands!") + var/mob/living/carbon/human/H = new(src.loc) + H.set_species(monkey_type) + H.real_name = H.species.get_random_name() + H.name = H.real_name + src.loc = null + qdel(src) + return 1 - proc/Unwrap(mob/user as mob) - icon_state = "monkeycube" - desc = "Just add water!" - user << "You unwrap the cube." - wrapped = 0 - return +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Unwrap(mob/user as mob) + icon_state = "monkeycube" + desc = "Just add water!" + user << "You unwrap the cube." + wrapped = 0 + return /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped desc = "Still wrapped in some paper." @@ -2002,10 +2011,10 @@ icon_state = "spellburger" filling_color = "#D505FF" - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/spellburger/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger name = "big bite burger" @@ -2014,11 +2023,11 @@ filling_color = "#E3D681" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("protein", 10) - reagents.add_reagent("nutriment", 4) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger/New() + ..() + reagents.add_reagent("protein", 10) + reagents.add_reagent("nutriment", 4) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/enchiladas name = "enchiladas" @@ -2028,12 +2037,12 @@ filling_color = "#A36A1F" center_of_mass = list("x"=16, "y"=13) - New() - ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("nutriment",2) - reagents.add_reagent("capsaicin", 6) - bitesize = 4 +/obj/item/weapon/reagent_containers/food/snacks/enchiladas/New() + ..() + reagents.add_reagent("protein", 6) + reagents.add_reagent("nutriment",2) + reagents.add_reagent("capsaicin", 6) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/monkeysdelight name = "monkey's delight" @@ -2043,13 +2052,13 @@ filling_color = "#5C3C11" center_of_mass = list("x"=16, "y"=13) - New() - ..() - reagents.add_reagent("protein", 10) - reagents.add_reagent("banana", 5) - reagents.add_reagent("blackpepper", 1) - reagents.add_reagent("sodiumchloride", 1) - bitesize = 6 +/obj/item/weapon/reagent_containers/food/snacks/monkeysdelight/New() + ..() + reagents.add_reagent("protein", 10) + reagents.add_reagent("banana", 5) + reagents.add_reagent("blackpepper", 1) + reagents.add_reagent("sodiumchloride", 1) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/baguette name = "baguette" @@ -2058,12 +2067,12 @@ filling_color = "#E3D796" center_of_mass = list("x"=18, "y"=12) - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("blackpepper", 1) - reagents.add_reagent("sodiumchloride", 1) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/baguette/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("blackpepper", 1) + reagents.add_reagent("sodiumchloride", 1) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/fishandchips name = "fish and chips" @@ -2072,12 +2081,12 @@ filling_color = "#E3D796" center_of_mass = list("x"=16, "y"=16) - New() - ..() - reagents.add_reagent("seafood", 3) - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("carpotoxin", 3) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/fishandchips/New() + ..() + reagents.add_reagent("seafood", 3) + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("carpotoxin", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/sandwich name = "sandwich" @@ -2087,11 +2096,11 @@ filling_color = "#D9BE29" center_of_mass = list("x"=16, "y"=4) - New() - ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sandwich/New() + ..() + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich name = "toasted sandwich" @@ -2101,12 +2110,12 @@ filling_color = "#D9BE29" center_of_mass = list("x"=16, "y"=4) - New() - ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("carbon", 2) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/toastedsandwich/New() + ..() + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("carbon", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/grilledcheese name = "grilled cheese sandwich" @@ -2115,11 +2124,11 @@ trash = /obj/item/trash/plate filling_color = "#D9BE29" - New() - ..() - reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 3) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/grilledcheese/New() + ..() + reagents.add_reagent("protein", 4) + reagents.add_reagent("nutriment", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tomatosoup name = "tomato soup" @@ -2129,11 +2138,11 @@ filling_color = "#D92929" center_of_mass = list("x"=16, "y"=7) - New() - ..() - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("tomatojuice", 10) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/tomatosoup/New() + ..() + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("tomatojuice", 10) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/rofflewaffles name = "roffle waffles" @@ -2143,11 +2152,11 @@ filling_color = "#FF00F7" center_of_mass = list("x"=15, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("psilocybin", 8) - bitesize = 4 +/obj/item/weapon/reagent_containers/food/snacks/rofflewaffles/New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("psilocybin", 8) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/stew name = "Stew" @@ -2156,14 +2165,14 @@ filling_color = "#9E673A" center_of_mass = list("x"=16, "y"=5) - New() - ..() - reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("tomatojuice", 5) - reagents.add_reagent("imidazoline", 5) - reagents.add_reagent("water", 5) - bitesize = 10 +/obj/item/weapon/reagent_containers/food/snacks/stew/New() + ..() + reagents.add_reagent("protein", 4) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("tomatojuice", 5) + reagents.add_reagent("imidazoline", 5) + reagents.add_reagent("water", 5) + bitesize = 10 /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast name = "jellied toast" @@ -2173,20 +2182,22 @@ filling_color = "#B572AB" center_of_mass = list("x"=16, "y"=8) - New() - ..() - reagents.add_reagent("nutriment", 1) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/New() + ..() + reagents.add_reagent("nutriment", 1) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry - New() - ..() - reagents.add_reagent("cherryjelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry/New() + ..() + reagents.add_reagent("cherryjelly", 5) /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/slime - New() - ..() - reagents.add_reagent("slimejelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/slime/New() + ..() + reagents.add_reagent("slimejelly", 5) /obj/item/weapon/reagent_containers/food/snacks/jellyburger name = "jelly burger" @@ -2195,20 +2206,22 @@ filling_color = "#B572AB" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/jellyburger/New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/jellyburger/slime - New() - ..() - reagents.add_reagent("slimejelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/jellyburger/slime/New() + ..() + reagents.add_reagent("slimejelly", 5) /obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry - New() - ..() - reagents.add_reagent("cherryjelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry/New() + ..() + reagents.add_reagent("cherryjelly", 5) /obj/item/weapon/reagent_containers/food/snacks/milosoup name = "milosoup" @@ -2217,11 +2230,11 @@ trash = /obj/item/trash/snack_bowl center_of_mass = list("x"=16, "y"=7) - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - bitesize = 4 +/obj/item/weapon/reagent_containers/food/snacks/milosoup/New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("water", 5) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat name = "stewed soy meat" @@ -2230,10 +2243,10 @@ trash = /obj/item/trash/plate center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/boiledspagetti name = "boiled spaghetti" @@ -2243,10 +2256,10 @@ filling_color = "#FCEE81" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti/New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/boiledrice name = "boiled rice" @@ -2256,10 +2269,10 @@ filling_color = "#FFFBDB" center_of_mass = list("x"=17, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/boiledrice/New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/ricepudding name = "rice pudding" @@ -2269,10 +2282,10 @@ filling_color = "#FFFBDB" center_of_mass = list("x"=17, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/ricepudding/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/pudding name = "figgy pudding" @@ -2281,10 +2294,10 @@ trash = /obj/item/trash/plate filling_color = "#FFFEE0" - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/pudding/New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/pastatomato name = "spaghetti" @@ -2294,11 +2307,11 @@ filling_color = "#DE4545" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("tomatojuice", 10) - bitesize = 4 +/obj/item/weapon/reagent_containers/food/snacks/pastatomato/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("tomatojuice", 10) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/meatballspagetti name = "spaghetti & meatballs" @@ -2308,11 +2321,11 @@ filling_color = "#DE4545" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 4) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/meatballspagetti/New() + ..() + reagents.add_reagent("protein", 4) + reagents.add_reagent("nutriment", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spesslaw name = "spesslaw" @@ -2321,25 +2334,25 @@ filling_color = "#DE4545" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 4) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/spesslaw/New() + ..() + reagents.add_reagent("protein", 4) + reagents.add_reagent("nutriment", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/carrotfries - name = "Carrot Fries" + name = "carrot fries" desc = "Tasty fries from fresh Carrots." icon_state = "carrotfries" trash = /obj/item/trash/plate filling_color = "#FAA005" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("imidazoline", 3) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/carrotfries/New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("imidazoline", 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/superbiteburger name = "super bite burger" @@ -2348,11 +2361,11 @@ filling_color = "#CCA26A" center_of_mass = list("x"=16, "y"=3) - New() - ..() - reagents.add_reagent("protein", 25) - reagents.add_reagent("nutriment", 25) - bitesize = 10 +/obj/item/weapon/reagent_containers/food/snacks/superbiteburger/New() + ..() + reagents.add_reagent("protein", 25) + reagents.add_reagent("nutriment", 25) + bitesize = 10 /obj/item/weapon/reagent_containers/food/snacks/candiedapple name = "candied apple" @@ -2361,10 +2374,10 @@ filling_color = "#F21873" center_of_mass = list("x"=15, "y"=13) - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/candiedapple/New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/applepie name = "apple pie" @@ -2373,10 +2386,10 @@ filling_color = "#E0EDC5" center_of_mass = list("x"=16, "y"=13) - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/applepie/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cherrypie @@ -2386,10 +2399,10 @@ filling_color = "#FF525A" center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/cherrypie/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/twobread name = "two bread" @@ -2398,10 +2411,10 @@ filling_color = "#DBCC9A" center_of_mass = list("x"=15, "y"=12) - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/twobread/New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/jellysandwich name = "jelly sandwich" @@ -2411,29 +2424,32 @@ filling_color = "#9E3A78" center_of_mass = list("x"=16, "y"=8) - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime - New() - ..() - reagents.add_reagent("slimejelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime/New() + ..() + reagents.add_reagent("slimejelly", 5) /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry - New() - ..() - reagents.add_reagent("cherryjelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry/New() + ..() + reagents.add_reagent("cherryjelly", 5) /obj/item/weapon/reagent_containers/food/snacks/boiledslimecore name = "boiled slime core" desc = "A boiled red thing." icon_state = "boiledslimecore" //nonexistant? - New() - ..() - reagents.add_reagent("slimejelly", 5) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/boiledslimecore/New() + ..() + reagents.add_reagent("slimejelly", 5) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/mint name = "mint" @@ -2442,10 +2458,10 @@ filling_color = "#F2F2F2" center_of_mass = list("x"=16, "y"=14) - New() - ..() - reagents.add_reagent("mint", 1) - bitesize = 1 +/obj/item/weapon/reagent_containers/food/snacks/mint/New() + ..() + reagents.add_reagent("mint", 1) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/mushroomsoup name = "chantrelle soup" @@ -2455,10 +2471,10 @@ filling_color = "#E386BF" center_of_mass = list("x"=17, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/mushroomsoup/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit name = "plump helmet biscuit" @@ -2467,17 +2483,17 @@ filling_color = "#CFB4C4" center_of_mass = list("x"=16, "y"=13) - New() - ..() - if(prob(10)) - name = "exceptional plump helmet biscuit" - desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("tricordrazine", 5) - bitesize = 2 - else - reagents.add_reagent("nutriment", 5) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/New() + ..() + if(prob(10)) + name = "exceptional plump helmet biscuit" + desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("tricordrazine", 5) + bitesize = 2 + else + reagents.add_reagent("nutriment", 5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/chawanmushi name = "chawanmushi" @@ -2487,10 +2503,10 @@ filling_color = "#F0F2E4" center_of_mass = list("x"=17, "y"=10) - New() - ..() - reagents.add_reagent("protein", 5) - bitesize = 1 +/obj/item/weapon/reagent_containers/food/snacks/chawanmushi/New() + ..() + reagents.add_reagent("protein", 5) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/beetsoup name = "beet soup" @@ -2500,11 +2516,11 @@ filling_color = "#FAC9FF" center_of_mass = list("x"=15, "y"=8) - New() - ..() - name = pick(list("borsch","bortsch","borstch","borsh","borshch","borscht")) - reagents.add_reagent("nutriment", 8) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/beetsoup/New() + ..() + name = pick(list("borsch","bortsch","borstch","borsh","borshch","borscht")) + reagents.add_reagent("nutriment", 8) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tossedsalad name = "tossed salad" @@ -2513,10 +2529,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#76B87F" center_of_mass = list("x"=17, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/tossedsalad/New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/validsalad name = "valid salad" @@ -2526,11 +2543,11 @@ filling_color = "#76B87F" center_of_mass = list("x"=17, "y"=11) - New() - ..() - reagents.add_reagent("protein", 2) - reagents.add_reagent("nutriment", 6) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/validsalad/New() + ..() + reagents.add_reagent("protein", 2) + reagents.add_reagent("nutriment", 6) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/appletart name = "golden apple streusel tart" @@ -2540,11 +2557,11 @@ filling_color = "#FFFF00" center_of_mass = list("x"=16, "y"=18) - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("gold", 5) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/appletart/New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("gold", 5) + bitesize = 3 /////////////////////////////////////////////////Sliceable//////////////////////////////////////// // All the food items that can be sliced into smaller bits like Meatbread and Cheesewheels @@ -2563,11 +2580,11 @@ filling_color = "#FF7575" center_of_mass = list("x"=16, "y"=9) - New() - ..() - reagents.add_reagent("protein", 20) - reagents.add_reagent("nutriment", 10) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread/New() + ..() + reagents.add_reagent("protein", 20) + reagents.add_reagent("nutriment", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice name = "meatbread slice" @@ -2578,6 +2595,14 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=13) +/obj/item/weapon/reagent_containers/food/snacks/meatbreadslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/meatbreadslice/filled/New() + ..() + reagents.add_reagent("protein", 4) + reagents.add_reagent("nutriment", 2) + bitesize = 2 + /obj/item/weapon/reagent_containers/food/snacks/sliceable/xenomeatbread name = "xenomeatbread loaf" desc = "The culinary base of every self-respecting eloquent gentleman. Extra Heretical." @@ -2587,11 +2612,11 @@ filling_color = "#8AFF75" center_of_mass = list("x"=16, "y"=9) - New() - ..() - reagents.add_reagent("protein", 20) - reagents.add_reagent("nutriment", 10) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/xenomeatbread/New() + ..() + reagents.add_reagent("protein", 20) + reagents.add_reagent("nutriment", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice name = "xenomeatbread slice" @@ -2602,6 +2627,14 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=13) +/obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice/filled/New() + ..() + reagents.add_reagent("protein", 4) + reagents.add_reagent("nutriment", 2) + bitesize = 2 + /obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread name = "banana-nut bread" desc = "A heavenly and filling treat." @@ -2611,11 +2644,11 @@ filling_color = "#EDE5AD" center_of_mass = list("x"=16, "y"=9) - New() - ..() - reagents.add_reagent("banana", 20) - reagents.add_reagent("nutriment", 20) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread/New() + ..() + reagents.add_reagent("banana", 20) + reagents.add_reagent("nutriment", 20) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bananabreadslice name = "banana-nut bread slice" @@ -2626,6 +2659,14 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=8) +/obj/item/weapon/reagent_containers/food/snacks/bananabreadslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/bananabreadslice/filled/New() + ..() + reagents.add_reagent("banana", 4) + reagents.add_reagent("nutriment", 4) + bitesize = 2 + /obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread name = "tofubread" icon_state = "Like meatbread but for vegetarians. Not guaranteed to give superpowers." @@ -2635,10 +2676,10 @@ filling_color = "#F7FFE0" center_of_mass = list("x"=16, "y"=9) - New() - ..() - reagents.add_reagent("nutriment", 30) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread/New() + ..() + reagents.add_reagent("nutriment", 30) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice name = "tofubread slice" @@ -2649,6 +2690,12 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=13) +/obj/item/weapon/reagent_containers/food/snacks/tofubreadslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/tofubreadslice/filled/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake name = "carrot cake" @@ -2659,11 +2706,11 @@ filling_color = "#FFD675" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 25) - reagents.add_reagent("imidazoline", 10) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake/New() + ..() + reagents.add_reagent("nutriment", 25) + reagents.add_reagent("imidazoline", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice name = "carrot cake slice" @@ -2674,6 +2721,15 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=14) +/obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice/filled/New() + + ..() + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("imidazoline", 2) + bitesize = 2 + /obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake name = "brain cake" desc = "A squishy cake-thing." @@ -2683,12 +2739,12 @@ filling_color = "#E6AEDB" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("protein", 25) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("alkysine", 10) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake/New() + ..() + reagents.add_reagent("protein", 25) + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("alkysine", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/braincakeslice name = "brain cake slice" @@ -2699,6 +2755,15 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=12) +/obj/item/weapon/reagent_containers/food/snacks/braincakeslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/braincakeslice/filled/New() + ..() + reagents.add_reagent("protein", 5) + reagents.add_reagent("nutriment", 1) + reagents.add_reagent("alkysine", 2) + bitesize = 2 + /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake name = "cheese cake" desc = "DANGEROUSLY cheesy." @@ -2708,11 +2773,11 @@ filling_color = "#FAF7AF" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("protein", 15) - reagents.add_reagent("nutriment", 10) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake/New() + ..() + reagents.add_reagent("protein", 15) + reagents.add_reagent("nutriment", 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice name = "cheese cake slice" @@ -2723,6 +2788,14 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=14) +/obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice/filled/New() + ..() + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 2) + bitesize = 2 + /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake name = "vanilla cake" desc = "A plain cake, not a lie." @@ -2732,9 +2805,9 @@ filling_color = "#F7EDD5" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 20) +/obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake/New() + ..() + reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice name = "vanilla cake slice" @@ -2745,6 +2818,12 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=14) +/obj/item/weapon/reagent_containers/food/snacks/plaincakeslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/plaincakeslice/filled/New() + ..() + reagents.add_reagent("nutriment", 4) + /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake name = "orange cake" desc = "A cake with added orange." @@ -2754,9 +2833,9 @@ filling_color = "#FADA8E" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 20) +/obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake/New() + ..() + reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice name = "orange cake slice" @@ -2767,6 +2846,12 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=14) +/obj/item/weapon/reagent_containers/food/snacks/orangecakeslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/orangecakeslice/filled/New() + ..() + reagents.add_reagent("nutriment", 4) + /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake name = "lime cake" desc = "A cake with added lime." @@ -2776,9 +2861,9 @@ filling_color = "#CBFA8E" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 20) +/obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake/New() + ..() + reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/limecakeslice name = "lime cake slice" @@ -2789,6 +2874,12 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=14) +/obj/item/weapon/reagent_containers/food/snacks/limecakeslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/limecakeslice/filled/New() + ..() + reagents.add_reagent("nutriment", 4) + /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake name = "lemon cake" desc = "A cake with added lemon." @@ -2798,9 +2889,9 @@ filling_color = "#FAFA8E" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 20) +/obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake/New() + ..() + reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice name = "lemon cake slice" @@ -2811,6 +2902,12 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=14) +/obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice/filled/New() + ..() + reagents.add_reagent("nutriment", 4) + /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake name = "chocolate cake" desc = "A cake with added chocolate" @@ -2820,9 +2917,9 @@ filling_color = "#805930" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 20) +/obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake/New() + ..() + reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice name = "chocolate cake slice" @@ -2833,6 +2930,12 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=14) +/obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice/fillew/New() + ..() + reagents.add_reagent("nutriment", 4) + /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel name = "cheese wheel" desc = "A big wheel of delcious Cheddar." @@ -2842,10 +2945,10 @@ filling_color = "#FFF700" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("protein", 20) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel/New() + ..() + reagents.add_reagent("protein", 20) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesewedge name = "cheese wedge" @@ -2855,6 +2958,13 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=10) +/obj/item/weapon/reagent_containers/food/snacks/cheesewedge/filled + +/obj/item/weapon/reagent_containers/food/snacks/cheesewedge/filled/New() + ..() + reagents.add_reagent("protein", 4) + bitesize = 2 + /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake name = "birthday cake" desc = "Happy Birthday..." @@ -2864,11 +2974,11 @@ filling_color = "#FFD6D6" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 20) - reagents.add_reagent("sprinkles", 10) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake/New() + ..() + reagents.add_reagent("nutriment", 20) + reagents.add_reagent("sprinkles", 10) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice name = "birthday cake slice" @@ -2879,18 +2989,27 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=14) +/obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice/filled/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("sprinkles", 2) + bitesize = 3 + /obj/item/weapon/reagent_containers/food/snacks/sliceable/bread name = "bread" icon_state = "Some plain old Earthen bread." icon_state = "bread" slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice - slices_num = 5 + slices_num = 8 filling_color = "#FFE396" center_of_mass = list("x"=16, "y"=9) New() ..() - reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 5) + reagents.add_reagent("nutriment", 15) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/breadslice @@ -2902,6 +3021,12 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=4) +/obj/item/weapon/reagent_containers/food/snacks/breadslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/breadslice/filled/New() + ..() + reagents.add_reagent("nutriment", 1) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread name = "cream cheese bread" @@ -2912,11 +3037,11 @@ filling_color = "#FFF896" center_of_mass = list("x"=16, "y"=9) - New() - ..() - reagents.add_reagent("protein", 15) - reagents.add_reagent("nutriment", 5) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread/New() + ..() + reagents.add_reagent("protein", 15) + reagents.add_reagent("nutriment", 5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice name = "cream cheese bread slice" @@ -2927,6 +3052,13 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=13) +/obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice/filled/New() + ..() + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 1) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/watermelonslice name = "watermelon slice" @@ -2936,6 +3068,12 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=10) +/obj/item/weapon/reagent_containers/food/snacks/watermelonslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/watermelonslice/filled/New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake name = "apple cake" @@ -2946,9 +3084,9 @@ filling_color = "#EBF5B8" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 15) +/obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake/New() + ..() + reagents.add_reagent("nutriment", 15) /obj/item/weapon/reagent_containers/food/snacks/applecakeslice name = "apple cake slice" @@ -2959,6 +3097,12 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=14) +/obj/item/weapon/reagent_containers/food/snacks/applecakeslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/applecakeslice/filled/New() + ..() + reagents.add_reagent("nutriment", 3) + /obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie name = "pumpkin pie" desc = "A delicious treat for the autumn months." @@ -2968,9 +3112,9 @@ filling_color = "#F5B951" center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("nutriment", 15) +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie/New() + ..() + reagents.add_reagent("nutriment", 15) /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice name = "pumpkin pie slice" @@ -2981,6 +3125,12 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=12) +/obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice/filled/New() + ..() + reagents.add_reagent("nutriment", 3) + /obj/item/weapon/reagent_containers/food/snacks/cracker name = "cracker" desc = "It's a salted cracker." @@ -2988,11 +3138,9 @@ filling_color = "#F5DEB8" center_of_mass = list("x"=17, "y"=6) - New() - ..() - reagents.add_reagent("nutriment", 1) - - +/obj/item/weapon/reagent_containers/food/snacks/cracker/New() + ..() + reagents.add_reagent("nutriment", 1) /////////////////////////////////////////////////PIZZA//////////////////////////////////////// @@ -3008,12 +3156,12 @@ slices_num = 6 center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 35) - reagents.add_reagent("protein", 5) - reagents.add_reagent("tomatojuice", 6) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita/New() + ..() + reagents.add_reagent("nutriment", 35) + reagents.add_reagent("protein", 5) + reagents.add_reagent("tomatojuice", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/margheritaslice name = "margherita slice" @@ -3023,6 +3171,15 @@ bitesize = 2 center_of_mass = list("x"=18, "y"=13) +/obj/item/weapon/reagent_containers/food/snacks/margheritaslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/margheritaslice/filled/New() + ..() + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("protein", 1) + reagents.add_reagent("tomatojuice", 2) + bitesize = 2 + /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza name = "meatpizza" desc = "A pizza with meat topping." @@ -3031,11 +3188,11 @@ slices_num = 6 center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("protein", 44) - reagents.add_reagent("tomatojuice", 6) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza/New() + ..() + reagents.add_reagent("protein", 44) + reagents.add_reagent("tomatojuice", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice name = "meatpizza slice" @@ -3045,6 +3202,14 @@ bitesize = 2 center_of_mass = list("x"=18, "y"=13) +/obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice/filled/New() + ..() + reagents.add_reagent("protein", 7) + reagents.add_reagent("tomatojuice", 2) + bitesize = 2 + /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza name = "mushroompizza" desc = "Very special pizza" @@ -3053,11 +3218,11 @@ slices_num = 6 center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 35) - reagents.add_reagent("protein", 5) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza/New() + ..() + reagents.add_reagent("nutriment", 35) + reagents.add_reagent("protein", 5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice name = "mushroompizza slice" @@ -3067,6 +3232,14 @@ bitesize = 2 center_of_mass = list("x"=18, "y"=13) +/obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice/filled/New() + ..() + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("protein", 1) + bitesize = 2 + /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza name = "vegetable pizza" desc = "No one of Tomato Sapiens were harmed during making this pizza" @@ -3075,13 +3248,13 @@ slices_num = 6 center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 25) - reagents.add_reagent("protein", 5) - reagents.add_reagent("tomatojuice", 6) - reagents.add_reagent("imidazoline", 12) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza/New() + ..() + reagents.add_reagent("nutriment", 25) + reagents.add_reagent("protein", 5) + reagents.add_reagent("tomatojuice", 6) + reagents.add_reagent("imidazoline", 12) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice name = "vegetable pizza slice" @@ -3091,6 +3264,15 @@ bitesize = 2 center_of_mass = list("x"=18, "y"=13) +/obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice/filled + +/obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice/filled/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("protein", 1) + reagents.add_reagent("tomatojuice", 2) + reagents.add_reagent("imidazoline", 2) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/crunch name = "pizza crunch" @@ -3100,13 +3282,13 @@ slices_num = 6 center_of_mass = list("x"=16, "y"=11) - New() - ..() - reagents.add_reagent("nutriment", 25) - reagents.add_reagent("batter", 6.5) - coating = reagents.get_reagent("batter") - reagents.add_reagent("oil", 4) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/crunch/New() + ..() + reagents.add_reagent("nutriment", 25) + reagents.add_reagent("batter", 6.5) + coating = reagents.get_reagent("batter") + reagents.add_reagent("oil", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/pizzacrunchslice name = "pizza crunch" @@ -3301,14 +3483,11 @@ filling_color = "#75754B" center_of_mass = list("x"=16, "y"=7) - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("radium", 2) - bitesize = 2 - - - +/obj/item/weapon/reagent_containers/food/snacks/dionaroast/New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("radium", 2) + bitesize = 2 /////////////////////////////////////////// // new old food stuff from bs12 @@ -3321,10 +3500,10 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=13) - New() - ..() - reagents.add_reagent("protein", 1) - reagents.add_reagent("nutriment", 3) +/obj/item/weapon/reagent_containers/food/snacks/dough/New() + ..() + reagents.add_reagent("protein", 1) + reagents.add_reagent("nutriment", 3) // Dough + rolling pin = flat dough /obj/item/weapon/reagent_containers/food/snacks/dough/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -3343,10 +3522,10 @@ slices_num = 3 center_of_mass = list("x"=16, "y"=16) - New() - ..() - reagents.add_reagent("protein", 1) - reagents.add_reagent("nutriment", 3) +/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough/New() + ..() + reagents.add_reagent("protein", 1) + reagents.add_reagent("nutriment", 3) /obj/item/weapon/reagent_containers/food/snacks/doughslice name = "dough slice" @@ -3358,9 +3537,9 @@ bitesize = 2 center_of_mass = list("x"=17, "y"=19) - New() - ..() - reagents.add_reagent("nutriment", 1) +/obj/item/weapon/reagent_containers/food/snacks/doughslice/New() + ..() + reagents.add_reagent("nutriment", 1) /obj/item/weapon/reagent_containers/food/snacks/bun name = "bun" @@ -3370,9 +3549,9 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=12) - New() - ..() - reagents.add_reagent("nutriment", 4) +/obj/item/weapon/reagent_containers/food/snacks/bun/New() + ..() + reagents.add_reagent("nutriment", 4) /obj/item/weapon/reagent_containers/food/snacks/bun/attackby(obj/item/weapon/W as obj, mob/user as mob) var/obj/item/weapon/reagent_containers/food/snacks/result = null @@ -3444,10 +3623,10 @@ bitesize = 3 center_of_mass = list("x"=21, "y"=12) - New() - ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 4) +/obj/item/weapon/reagent_containers/food/snacks/taco/New() + ..() + reagents.add_reagent("protein", 3) + reagents.add_reagent("nutriment", 4) /obj/item/weapon/reagent_containers/food/snacks/rawcutlet name = "raw cutlet" @@ -3457,9 +3636,9 @@ bitesize = 1 center_of_mass = list("x"=17, "y"=20) - New() - ..() - reagents.add_reagent("protein", 1) +/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/New() + ..() + reagents.add_reagent("protein", 1) /obj/item/weapon/reagent_containers/food/snacks/cutlet name = "cutlet" @@ -3469,9 +3648,9 @@ bitesize = 2 center_of_mass = list("x"=17, "y"=20) - New() - ..() - reagents.add_reagent("protein", 2) +/obj/item/weapon/reagent_containers/food/snacks/cutlet/New() + ..() + reagents.add_reagent("protein", 2) /obj/item/weapon/reagent_containers/food/snacks/rawmeatball name = "raw meatball" @@ -3481,9 +3660,9 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=15) - New() - ..() - reagents.add_reagent("protein", 2) +/obj/item/weapon/reagent_containers/food/snacks/rawmeatball/New() + ..() + reagents.add_reagent("protein", 2) /obj/item/weapon/reagent_containers/food/snacks/hotdog name = "hotdog" @@ -3492,9 +3671,9 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=17) - New() - ..() - reagents.add_reagent("protein", 6) +/obj/item/weapon/reagent_containers/food/snacks/hotdog/New() + ..() + reagents.add_reagent("protein", 6) /obj/item/weapon/reagent_containers/food/snacks/flatbread name = "flatbread" @@ -3504,9 +3683,9 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=16) - New() - ..() - reagents.add_reagent("nutriment", 3) +/obj/item/weapon/reagent_containers/food/snacks/flatbread/New() + ..() + reagents.add_reagent("nutriment", 3) // potato + knife = raw sticks /obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -3525,9 +3704,9 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=12) - New() - ..() - reagents.add_reagent("nutriment", 3) +/obj/item/weapon/reagent_containers/food/snacks/rawsticks/New() + ..() + reagents.add_reagent("nutriment", 3) /obj/item/weapon/reagent_containers/food/snacks/liquidfood name = "\improper LiquidFood ration" @@ -3537,11 +3716,11 @@ filling_color = "#A8A8A8" center_of_mass = list("x"=16, "y"=15) - New() - ..() - reagents.add_reagent("nutriment", 20) - reagents.add_reagent("iron", 3) - bitesize = 4 +/obj/item/weapon/reagent_containers/food/snacks/liquidfood/New() + ..() + reagents.add_reagent("nutriment", 20) + reagents.add_reagent("iron", 3) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/tastybread @@ -3552,10 +3731,10 @@ filling_color = "#A66829" center_of_mass = list("x"=17, "y"=16) - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/tastybread/New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks name = "\improper SkrellSnax" @@ -3564,10 +3743,10 @@ filling_color = "#A66829" center_of_mass = list("x"=15, "y"=12) - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/skrellsnacks/New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/friedkois name = "fried k'ois" @@ -3575,11 +3754,11 @@ icon_state = "friedkois" filling_color = "#E6E600" - New() - ..() - reagents.add_reagent("koispaste", 6) - reagents.add_reagent("phoron", 3) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/friedkois/New() + ..() + reagents.add_reagent("koispaste", 6) + reagents.add_reagent("phoron", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/friedkois/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/stack/rods)) @@ -3599,11 +3778,11 @@ trash = /obj/item/stack/rods filling_color = "#E6E600" - New() - ..() - reagents.add_reagent("koispaste", 6) - reagents.add_reagent("phoron", 3) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/koiskebab1/New() + ..() + reagents.add_reagent("koispaste", 6) + reagents.add_reagent("phoron", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/koiskebab1/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/reagent_containers/food/snacks/friedkois)) @@ -3620,11 +3799,11 @@ trash = /obj/item/stack/rods filling_color = "#E6E600" - New() - ..() - reagents.add_reagent("koispaste", 12) - reagents.add_reagent("phoron", 6) - bitesize = 6 +/obj/item/weapon/reagent_containers/food/snacks/koiskebab2/New() + ..() + reagents.add_reagent("koispaste", 12) + reagents.add_reagent("phoron", 6) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/koiskebab2/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/reagent_containers/food/snacks/friedkois)) @@ -3640,11 +3819,11 @@ trash = /obj/item/stack/rods filling_color = "#E6E600" - New() - ..() - reagents.add_reagent("koispaste", 18) - reagents.add_reagent("phoron", 9) - bitesize = 9 +/obj/item/weapon/reagent_containers/food/snacks/koiskebab3/New() + ..() + reagents.add_reagent("koispaste", 18) + reagents.add_reagent("phoron", 9) + bitesize = 9 /obj/item/weapon/reagent_containers/food/snacks/koissoup name = "k'ois paste" @@ -3653,11 +3832,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#4E6E600" - New() - ..() - reagents.add_reagent("koispaste", 15) - reagents.add_reagent("phoron", 5) - bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/koissoup/New() + ..() + reagents.add_reagent("koispaste", 15) + reagents.add_reagent("phoron", 5) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/koiswaffles name = "k'ois waffles" @@ -3666,11 +3845,11 @@ trash = /obj/item/trash/waffles filling_color = "#E6E600" - New() - ..() - reagents.add_reagent("koispaste", 25) - reagents.add_reagent("phoron", 5) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/koiswaffles/New() + ..() + reagents.add_reagent("koispaste", 25) + reagents.add_reagent("phoron", 5) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/koisjelly name = "k'ois jelly" @@ -3678,12 +3857,12 @@ icon_state = "koisjelly" filling_color = "#E6E600" - New() - ..() - reagents.add_reagent("koispaste", 25) - reagents.add_reagent("imidazoline", 20) - reagents.add_reagent("phoron", 10) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/koisjelly/New() + ..() + reagents.add_reagent("koispaste", 25) + reagents.add_reagent("imidazoline", 20) + reagents.add_reagent("phoron", 10) + bitesize = 5 //unathi snacks - sprites by Araskael @@ -3694,10 +3873,10 @@ trash = /obj/item/trash/meatsnack filling_color = "#631212" - New() - ..() - reagents.add_reagent("protein", 12) - bitesize = 5 +/obj/item/weapon/reagent_containers/food/snacks/meatsnack/New() + ..() + reagents.add_reagent("protein", 12) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/maps name = "maps salty ham" @@ -3706,11 +3885,11 @@ trash = /obj/item/trash/maps filling_color = "#631212" - New() - ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("sodiumchloride", 3) - bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/maps/New() + ..() + reagents.add_reagent("protein", 6) + reagents.add_reagent("sodiumchloride", 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/nathisnack name = "razi-snack corned beef" @@ -3719,8 +3898,8 @@ trash = /obj/item/trash/nathisnack filling_color = "#631212" - New() - ..() - reagents.add_reagent("protein", 10) - reagents.add_reagent("iron", 3) - bitesize = 4 +/obj/item/weapon/reagent_containers/food/snacks/nathisnack/New() + ..() + reagents.add_reagent("protein", 10) + reagents.add_reagent("iron", 3) + bitesize = 4 diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 99a6dc28f73..ade7c333f8f 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -47,7 +47,7 @@ var/contained = reagentlist() M.attack_log += text("\[[time_stamp()]\] Has been fed [name] by [key_name(user)] Reagents: [contained]") user.attack_log += text("\[[time_stamp()]\] Fed [name] to [key_name(M)] Reagents: [contained]") - msg_admin_attack("[key_name_admin(user)] fed [key_name_admin(M)] with [name] Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[key_name_admin(user)] fed [key_name_admin(M)] with [name] Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(M)) if(reagents.total_volume) reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST) @@ -67,7 +67,7 @@ user << "You dissolve \the [src] in [target]." user.attack_log += text("\[[time_stamp()]\] Spiked \a [target] with a pill. Reagents: [reagentlist()]") - msg_admin_attack("[user.name] ([user.ckey]) spiked \a [target] with a pill. Reagents: [reagentlist()] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) spiked \a [target] with a pill. Reagents: [reagentlist()] (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(target)) reagents.trans_to(target, reagents.total_volume) for(var/mob/O in viewers(2, user)) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 06c6bd648ac..a10f89fd72c 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -62,13 +62,13 @@ if(reagents.has_reagent("sacid")) message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src].") - log_game("[key_name(user)] fired sulphuric acid from \a [src].") + log_game("[key_name(user)] fired sulphuric acid from \a [src].",ckey=key_name(user)) if(reagents.has_reagent("pacid")) message_admins("[key_name_admin(user)] fired Polyacid from \a [src].") - log_game("[key_name(user)] fired Polyacid from \a [src].") + log_game("[key_name(user)] fired Polyacid from \a [src].",ckey=key_name(user)) if(reagents.has_reagent("lube")) message_admins("[key_name_admin(user)] fired Space lube from \a [src].") - log_game("[key_name(user)] fired Space lube from \a [src].") + log_game("[key_name(user)] fired Space lube from \a [src].",ckey=key_name(user)) return /obj/item/weapon/reagent_containers/spray/proc/Spray_at(atom/A as mob|obj, mob/user as mob, proximity) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 6f127dfdf70..88e1281d205 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -256,7 +256,7 @@ user.attack_log += "\[[time_stamp()]\] Attacked [target.name] ([target.ckey]) with \the [src] (INTENT: HARM)." target.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: HARM)." - msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(target)] with [src.name] (INTENT: HARM) (JMP)") + msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(target)] with [src.name] (INTENT: HARM) (JMP)",ckey=key_name(user),ckey_target=key_name(src)) return diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 13f1539be68..823855d1ca3 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -114,7 +114,7 @@ modded = modded ? 0 : 1 if (modded) message_admins("[key_name_admin(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel. (JMP)") - log_game("[key_name(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel.") + log_game("[key_name(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel.",ckey=key_name(user)) leak_fuel(amount_per_transfer_from_this) if (istype(W,/obj/item/device/assembly_holder)) if (rig) @@ -127,7 +127,7 @@ 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)) message_admins("[key_name_admin(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion. (JMP)") - log_game("[key_name(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion.") + log_game("[key_name(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion.",ckey=key_name(user)) rig = W user.drop_item() @@ -157,7 +157,7 @@ if(Proj.get_structure_damage()) if(istype(Proj.firer)) message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (JMP).") - log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).") + log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).",ckey=key_name(Proj.firer)) if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) explode() @@ -245,6 +245,16 @@ ..() reagents.add_reagent("beer",capacity) +/obj/structure/reagent_dispensers/xuizikeg + name = "xuizi juice keg" + desc = "A keg full of Xuizi juice, blended flower buds from the Moghean Xuizi cactus. The export stamp of the Arizi Guild is imprinted on the side." + icon = 'icons/obj/objects.dmi' + icon_state = "keg_xuizi" + amount_per_transfer_from_this = 10 + New() + ..() + reagents.add_reagent("xuizijuice",capacity) + /obj/structure/reagent_dispensers/virusfood name = "Virus Food Dispenser" desc = "A dispenser of virus food." diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index c66eb1d5218..389df69c14a 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -136,7 +136,7 @@ qdel(G) usr.attack_log += text("\[[time_stamp()]\] Has placed [GM.name] ([GM.ckey]) in disposals.") GM.attack_log += text("\[[time_stamp()]\] Has been placed in disposals by [usr.name] ([usr.ckey])") - msg_admin_attack("[usr] ([usr.ckey]) placed [GM] ([GM.ckey]) in a disposals unit. (JMP)") + msg_admin_attack("[usr] ([usr.ckey]) placed [GM] ([GM.ckey]) in a disposals unit. (JMP)",ckey=key_name(usr),ckey_target=key_name(GM)) return if(!dropsafety(I)) return @@ -191,7 +191,7 @@ user.attack_log += text("\[[time_stamp()]\] Has placed [target.name] ([target.ckey]) in disposals.") target.attack_log += text("\[[time_stamp()]\] Has been placed in disposals by [user.name] ([user.ckey])") - msg_admin_attack("[user] ([user.ckey]) placed [target] ([target.ckey]) in a disposals unit. (JMP)") + msg_admin_attack("[user] ([user.ckey]) placed [target] ([target.ckey]) in a disposals unit. (JMP)",ckey=key_name(user),ckey_target=key_name(target)) else return if (target.client) diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index c19483576da..cd3b49b55cc 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -58,13 +58,21 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid). update_icon() /obj/machinery/r_n_d/circuit_imprinter/RefreshParts() + // Adjust reagent container volume to match combined volume of the inserted beakers var/T = 0 for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) T += G.reagents.maximum_volume create_reagents(T) + // Transfer all reagents from the beakers to internal reagent container + for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) + G.reagents.trans_to_obj(src, G.reagents.total_volume) + + // Adjust material storage capacity to scale with matter bin rating max_material_storage = 0 for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) max_material_storage += M.rating * 75000 + + // Adjust production speed to increase with manipulator rating T = 0 for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) T += M.rating @@ -87,13 +95,14 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid). /obj/machinery/r_n_d/circuit_imprinter/dismantle() for(var/obj/I in component_parts) + // This will distribute all reagents amongst the contained beakers if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker)) reagents.trans_to_obj(I, reagents.total_volume) for(var/f in materials) if(materials[f] >= SHEET_MATERIAL_AMOUNT) var/path = getMaterialType(f) if(path) - var/obj/item/stack/S = new f(loc) + var/obj/item/stack/S = new path(loc) S.amount = round(materials[f] / SHEET_MATERIAL_AMOUNT) ..() diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm index 0c06b172d65..6bb7f37c49e 100644 --- a/code/modules/research/mechfab_designs.dm +++ b/code/modules/research/mechfab_designs.dm @@ -650,7 +650,7 @@ build_path = /obj/item/rig_module/vision/meson /datum/design/hardsuitmodules/sechud_module - name = "hardsuit meson scanner" + name = "hardsuit security hud" desc = "A simple tactical information system for a hardsuit." id = "sechud_module" req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 2, TECH_MAGNET = 3) @@ -674,7 +674,7 @@ build_path = /obj/item/rig_module/vision/nvg /datum/design/hardsuitmodules/healthscanner_module - name = "hardsuit night vision interface" + name = "hardsuit health scanner" desc = "A hardsuit-mounted health scanner." id = "healthscanner_module" req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 3, TECH_MAGNET = 2) @@ -730,9 +730,9 @@ build_path = /obj/item/rig_module/mounted/taser /datum/design/hardsuitmodules/egun_module - name = "mounted taser" + name = "mounted energy gun" desc = "A forearm-mounted energy projector." id = "egun_module" req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 4, TECH_COMBAT = 4, TECH_MAGNET = 3) materials = list(DEFAULT_WALL_MATERIAL= 7000, "glass"= 2250, "uranium"= 3250, "gold"= 2500) - build_path = /obj/item/rig_module/mounted/egun \ No newline at end of file + build_path = /obj/item/rig_module/mounted/egun diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index c91a22d89f5..b27db2ac745 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -61,13 +61,21 @@ return t /obj/machinery/r_n_d/protolathe/RefreshParts() + // Adjust reagent container volume to match combined volume of the inserted beakers var/T = 0 for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) T += G.reagents.maximum_volume create_reagents(T) + // Transfer all reagents from the beakers to internal reagent container + for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) + G.reagents.trans_to_obj(src, G.reagents.total_volume) + + // Adjust material storage capacity to scale with matter bin rating max_material_storage = 0 for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) max_material_storage += M.rating * 75000 + + // Adjust production speed to increase with manipulator rating T = 0 for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) T += M.rating @@ -82,7 +90,7 @@ if(materials[f] >= SHEET_MATERIAL_AMOUNT) var/path = getMaterialType(f) if(path) - var/obj/item/stack/S = new f(loc) + var/obj/item/stack/S = new path(loc) S.amount = round(materials[f] / SHEET_MATERIAL_AMOUNT) ..() diff --git a/code/modules/research/xenoarchaeology/finds/finds_special.dm b/code/modules/research/xenoarchaeology/finds/finds_special.dm index af73f541d60..359ba673603 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_special.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_special.dm @@ -10,6 +10,7 @@ processing_objects.Add(src) spawning_id = pick("blood","holywater","lube","stoxin","ethanol","ice","glycerol","fuel","cleaner") + /obj/item/weapon/reagent_containers/glass/replenishing/process() reagents.add_reagent(spawning_id, 0.3) @@ -23,6 +24,12 @@ /obj/item/clothing/mask/gas/poltergeist/New() processing_objects.Add(src) + listening_objects += src + +/obj/item/clothing/mask/gas/poltergeist/Destroy() + processing_objects.Remove(src) + listening_objects -= src + return ..() /obj/item/clothing/mask/gas/poltergeist/process() if(heard_talk.len && istype(src.loc, /mob/living) && prob(10)) @@ -57,6 +64,12 @@ /obj/item/weapon/vampiric/New() ..() processing_objects.Add(src) + listening_objects += src + +/obj/item/weapon/vampiric/Destroy() + processing_objects.Remove(src) + listening_objects -= src + return ..() /obj/item/weapon/vampiric/process() //see if we've identified anyone nearby @@ -146,6 +159,10 @@ processing_objects.Add(src) loc_last_process = src.loc +/obj/effect/decal/cleanable/blood/splatter/animated/Destroy() + processing_objects.Remove(src) + return ..() + /obj/effect/decal/cleanable/blood/splatter/animated/process() if(target_turf && src.loc != target_turf) step_towards(src,target_turf) @@ -175,6 +192,10 @@ /obj/effect/shadow_wight/New() processing_objects.Add(src) +/obj/effect/shadow_wight/Destroy() + processing_objects.Remove(src) + return ..() + /obj/effect/shadow_wight/process() if(src.loc) src.loc = get_turf(pick(orange(1,src))) @@ -200,4 +221,4 @@ processing_objects.Remove(src) /obj/effect/shadow_wight/Bump(var/atom/obstacle) - obstacle << "\red You feel a chill run down your spine!" + obstacle << "You feel a chill run down your spine!" diff --git a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm b/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm index ead0d698d3b..117a3040715 100644 --- a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm +++ b/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm @@ -212,4 +212,4 @@ if(inserted_battery.battery_effect) user.attack_log += "\[[time_stamp()]\] Tapped [M.name] ([M.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])" M.attack_log += "\[[time_stamp()]\] Tapped by [user.name] ([user.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])" - msg_admin_attack("[key_name(user)] tapped [key_name(M)] with [name] (EFFECT: [inserted_battery.battery_effect.effecttype]) (JMP)" ) + msg_admin_attack("[key_name(user)] tapped [key_name(M)] with [name] (EFFECT: [inserted_battery.battery_effect.effecttype]) (JMP)",ckey=key_name(user),ckey_target=key_name(M) ) diff --git a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm index 6b77e800eb3..ab738d6ec34 100644 --- a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm +++ b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm @@ -309,6 +309,7 @@ src.visible_message("\blue \icon[src] [src] deactivates with a gentle shudder.") qdel(suspension_field) + suspension_field = null icon_state = "suspension2" /obj/machinery/suspension_gen/Destroy() diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index ca096c11f00..c05b4b8fa25 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -121,7 +121,7 @@ if(confirmed) confirmed = 0 trigger_event(event) - log_game("[key_name(event_triggered_by)] triggered and [key_name(event_confirmed_by)] confirmed event [event]") + log_game("[key_name(event_triggered_by)] triggered and [key_name(event_confirmed_by)] confirmed event [event]",ckey=key_name(event_triggered_by),ckey_target=key_name(event_confirmed_by)) message_admins("[key_name(event_triggered_by)] triggered and [key_name(event_confirmed_by)] confirmed event [event]", 1) reset() diff --git a/code/modules/security levels/security levels.dm b/code/modules/security levels/security levels.dm index cbb4a9b4312..ca6f503d7f3 100644 --- a/code/modules/security levels/security levels.dm +++ b/code/modules/security levels/security levels.dm @@ -25,16 +25,24 @@ if(SEC_LEVEL_GREEN) security_announcement_down.Announce("[config.alert_desc_green]", "Attention! Security level lowered to green.") security_level = SEC_LEVEL_GREEN + if (nl_ctrl.manual_override == 2) // Disable override if it was set by code-red. + nl_ctrl.manual_override = 0 + nl_ctrl.doWork(FALSE) // Update night lighting if it was turned off by red alert. if(SEC_LEVEL_BLUE) if(security_level < SEC_LEVEL_BLUE) security_announcement_up.Announce("[config.alert_desc_blue_upto]", "Attention! Security level elevated to blue.") else security_announcement_down.Announce("[config.alert_desc_blue_downto]", "Attention! Security level lowered to blue.") security_level = SEC_LEVEL_BLUE + if (nl_ctrl.manual_override == 2) + nl_ctrl.manual_override = 0 + nl_ctrl.doWork(FALSE) // Update night lighting if it was turned off by red alert. if(SEC_LEVEL_RED) if(security_level < SEC_LEVEL_RED) security_announcement_up.Announce("[config.alert_desc_red_upto]", "Attention! Security level elevated to red!") nl_ctrl.deactivate(0) // Disable nightmode globally + if (!nl_ctrl.manual_override) + nl_ctrl.manual_override = 2 else security_announcement_down.Announce("[config.alert_desc_red_downto]", "Attention! Code red!") security_level = SEC_LEVEL_RED @@ -95,4 +103,4 @@ set_security_level(2) /mob/verb/set_thing3() set_security_level(3) -*/ \ No newline at end of file +*/ diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index d254c0f990c..64c0306865b 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -65,7 +65,7 @@ world << "Alert: The shuttle autopilot has been overridden. Launch sequence initiated!" if(usr) - log_admin("[key_name(usr)] has overridden the shuttle autopilot and activated launch sequence") + log_admin("[key_name(usr)] has overridden the shuttle autopilot and activated launch sequence",ckey=key_name(usr)) message_admins("[key_name_admin(usr)] has overridden the shuttle autopilot and activated launch sequence") ..(user) @@ -79,7 +79,7 @@ world << "Alert: The shuttle autopilot has been overridden. Bluespace drive engaged!" if(usr) - log_admin("[key_name(usr)] has overridden the shuttle autopilot and forced immediate launch") + log_admin("[key_name(usr)] has overridden the shuttle autopilot and forced immediate launch",ckey=key_name(usr)) message_admins("[key_name_admin(usr)] has overridden the shuttle autopilot and forced immediate launch") ..(user) @@ -93,7 +93,7 @@ world << "Alert: The shuttle autopilot has been overridden. Launch sequence aborted!" if(usr) - log_admin("[key_name(usr)] has overridden the shuttle autopilot and cancelled launch sequence") + log_admin("[key_name(usr)] has overridden the shuttle autopilot and cancelled launch sequence",ckey=key_name(usr)) message_admins("[key_name_admin(usr)] has overridden the shuttle autopilot and cancelled launch sequence") ..(user) @@ -150,7 +150,7 @@ world << "Alert: [req_authorizations - authorized.len] authorization\s needed to override the shuttle autopilot." if(usr) - log_admin("[key_name(usr)] has inserted [ID] into the shuttle control computer - [req_authorizations - authorized.len] authorisation\s needed") + log_admin("[key_name(usr)] has inserted [ID] into the shuttle control computer - [req_authorizations - authorized.len] authorisation\s needed",ckey=key_name(usr)) message_admins("[key_name_admin(usr)] has inserted [ID] into the shuttle control computer - [req_authorizations - authorized.len] authorisation\s needed") return 1 diff --git a/code/modules/spells/general/mark_recall.dm b/code/modules/spells/general/mark_recall.dm index 8d34ede8fb7..1bf2f727c39 100644 --- a/code/modules/spells/general/mark_recall.dm +++ b/code/modules/spells/general/mark_recall.dm @@ -3,11 +3,11 @@ desc = "This spell was created so wizards could get home from the bar without driving." feedback = "MK" school = "abjuration" - charge_max = 600 + charge_max = 300 spell_flags = Z2NOCAST invocation = "RE ALKI R'NATHA" invocation_type = SpI_WHISPER - cooldown_min = 300 + cooldown_min = 150 smoke_amt = 1 smoke_spread = 5 @@ -29,7 +29,7 @@ return 0 var/target = targets[1] if(istext(target)) - mark = new /obj/effect/cleanable/wizard_mark(get_turf(user),src) + mark = new /obj/effect/decal/wizard_mark(get_turf(user),src) return 1 if(!istype(target,/obj)) //something went wrong return 0 @@ -47,8 +47,8 @@ return "You no longer have to be conscious to activate this spell." -/obj/effect/cleanable/wizard_mark - name = "\improper Mark of the Wizard" +/obj/effect/decal/wizard_mark + name = "mark of the wizard" desc = "A strange rune, probably someone playing with crayons again." icon = 'icons/obj/rune.dmi' icon_state = "wizard_mark" @@ -59,22 +59,22 @@ var/spell/mark_recall/spell -/obj/effect/cleanable/wizard_mark/New(var/newloc,var/mrspell) +/obj/effect/decal/wizard_mark/New(var/newloc,var/mrspell) ..() spell = mrspell -/obj/effect/cleanable/wizard_mark/Destroy() +/obj/effect/decal/wizard_mark/Destroy() spell.mark = null //dereference pls. spell = null ..() -/obj/effect/cleanable/wizard_mark/attack_hand(var/mob/user) +/obj/effect/decal/wizard_mark/attack_hand(var/mob/user) if(user == spell.holder) user.visible_message("\The [user] mutters an incantation and \the [src] disappears!") qdel(src) ..() -/obj/effect/cleanable/wizard_mark/attackby(var/obj/item/I, var/mob/user) +/obj/effect/decal/wizard_mark/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/weapon/nullrod) || istype(I, /obj/item/weapon/spellbook)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) src.visible_message("\The [src] fades away!") diff --git a/code/modules/spells/monster_manual.dm b/code/modules/spells/monster_manual.dm index 59c53d1d6b1..ffc66703675 100644 --- a/code/modules/spells/monster_manual.dm +++ b/code/modules/spells/monster_manual.dm @@ -59,39 +59,33 @@ if(uses == 0) usr << "This book is out of uses." return - var/client/C = get_player() - if(!C) - usr << "There are no souls willing to become a familiar." - return + var/datum/ghosttrap/ghost = get_ghost_trap("wizard familiar") var path = text2path(href_list["path"]) if(!ispath(path)) usr << "Invalid mob path in [src]. Contact a coder." return + if(!(path in monster)) + return - var/mob/living/simple_animal/familiar/F = new path(get_turf(src)) - F.ckey = C.ckey - F.faction = usr.faction - F.add_spell(new /spell/contract/return_master(usr),"const_spell_ready") - if(C.mob && C.mob.mind) - C.mob.mind.transfer_to(F) - F << "You are [F], a familiar to [usr]. He is your master and your friend. Aid him in his wizarding duties to the best of your ability." - var/newname = input(F,"Please choose a name. Leaving it blank or canceling will choose the default.", "Name",F.name) as null|text - if(newname) - F.name = newname - temp = "You have summoned \the [F]" + var/mob/living/simple_animal/F = new path(get_turf(src)) + temp = "You have attempted summoning \the [F]" + ghost.request_player(F,"A wizard is requesting a familiar.", 60 SECONDS) uses-- + spawn(600) + if(F) + if(!F.ckey || !F.client) + F.visible_message("With no soul to keep \the [F] linked to this plane, it fades away.") + qdel(F) + uses++ + else + F.faction = usr.faction + F.add_spell(new /spell/contract/return_master(usr), "const_spell_ready") + F << "You are [F], a familiar to [usr]. He is your master and your friend. Aid him in his wizarding duties to the best of your ability." + + if(Adjacent(usr)) + src.interact(usr) - if(Adjacent(usr)) - src.interact(usr) - else - usr << browse(null,"window=monstermanual") - -/obj/item/weapon/monster_manual/proc/get_player() - for(var/mob/O in dead_mob_list) - if(O.client) - var/getResponse = alert(O,"A wizard is requesting a familiar. Would you like to play as one?", "Wizard familiar summons","Yes","No") - if(getResponse == "Yes") - return O.client - return null + else + usr << browse(null,"window=monstermanual") diff --git a/code/modules/spells/targeted/cleric_spells.dm b/code/modules/spells/targeted/cleric_spells.dm index 5cf8e14dce6..a16b3179a75 100644 --- a/code/modules/spells/targeted/cleric_spells.dm +++ b/code/modules/spells/targeted/cleric_spells.dm @@ -14,16 +14,16 @@ cooldown_reduc = 50 hud_state = "heal_minor" - amt_dam_brute = -3 - amt_dam_fire = -1 + amt_dam_brute = -15 + amt_dam_fire = -15 message = "You feel a pleasant rush of heat move through your body." /spell/targeted/heal_target/empower_spell() if(!..()) return 0 - amt_dam_brute -= 3 - amt_dam_fire -= 3 + amt_dam_brute -= 5 + amt_dam_fire -= 5 return "[src] will now heal more." @@ -39,8 +39,8 @@ cooldown_reduc = 100 hud_state = "heal_major" - amt_dam_brute = -15 - amt_dam_fire = -5 + amt_dam_brute = -35 + amt_dam_fire = -25 message = "Your body feels like a furnace." @@ -48,7 +48,7 @@ if(!..()) return 0 amt_dam_tox = -10 - amt_dam_oxy = -7 + amt_dam_oxy = -10 return "[src] now heals oxygen loss and toxic damage." @@ -65,14 +65,14 @@ cooldown_reduc = 300 hud_state = "heal_area" - amt_dam_brute = -5 - amt_dam_fire = -5 + amt_dam_brute = -10 + amt_dam_fire = -10 /spell/targeted/heal_target/area/empower_spell() if(!..()) return 0 - amt_dam_brute -= 3 - amt_dam_fire -= 3 + amt_dam_brute -= 5 + amt_dam_fire -= 5 range += 2 return "[src] now heals more in a wider area." diff --git a/code/modules/spells/targeted/necromancer_spells.dm b/code/modules/spells/targeted/necromancer_spells.dm index ab807ed024c..ba7adc89754 100644 --- a/code/modules/spells/targeted/necromancer_spells.dm +++ b/code/modules/spells/targeted/necromancer_spells.dm @@ -106,13 +106,18 @@ var/mob/living/carbon/human/skeleton/F = new(get_turf(target)) target.visible_message("\The [target] explodes in a shower of gore, a skeleton emerges from the remains!") target.gib() - var/client/C = get_player() - F.ckey = C.ckey - F.faction = usr.faction - if(C.mob && C.mob.mind) - C.mob.mind.transfer_to(F) - F << "You are a skeleton minion to [usr], they are your master. Obey and protect your master at all costs, you have no free will." - + var/datum/ghosttrap/ghost = get_ghost_trap("skeleton minion") + ghost.request_player(F,"A wizard is requesting a skeleton minion.", 60 SECONDS) + spawn(600) + if(F) + if(!F.ckey || !F.client) + F.visible_message("With no soul to keep \the [F] linked to this plane, it turns into dust.") + F.dust() + + else + F << "You are a skeleton minion to [usr], they are your master. Obey and protect your master at all costs, you have no free will." + F.faction = usr.faction + //equips the skeleton war gear F.equip_to_slot_or_del(new /obj/item/clothing/under/gladiator(F), slot_w_uniform) F.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(F), slot_shoes) @@ -120,14 +125,6 @@ F.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/bone(F), slot_head) F.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/bone(F), slot_wear_suit) -/spell/targeted/raise_dead/proc/get_player() - for(var/mob/O in dead_mob_list) - if(O.client) - var/getResponse = alert(O,"A wizard is requesting a skeleton minion. Would you like to play as one?", "Skeleton minion summons","Yes","No") - if(getResponse == "Yes") - return O.client - return null - /spell/targeted/lichdom name = "Lichdom" desc = "Trade your life and soul for immortality and power." diff --git a/code/modules/spells/targeted/shapeshift.dm b/code/modules/spells/targeted/shapeshift.dm index 1293ccd5917..d6fc8172be2 100644 --- a/code/modules/spells/targeted/shapeshift.dm +++ b/code/modules/spells/targeted/shapeshift.dm @@ -125,7 +125,7 @@ name = "Corrupt Form" desc = "This spell shapes the wizard into a terrible, terrible beast." feedback = "CF" - possible_transformations = list(/mob/living/simple_animal/hostile/faithless) + possible_transformations = list(/mob/living/simple_animal/hostile/faithless/wizard) invocation = "mutters something dark and twisted as their form begins to twist..." invocation_type = SpI_EMOTE @@ -154,9 +154,10 @@ return "You will now stay corrupted for [duration/10] seconds." if(2) newVars = list("name" = "\proper corruption incarnate", - "melee_damage_upper" = 35, + "melee_damage_upper" = 45, "resistance" = 6, - "health" = 450, //since it is foverer i guess it would be fine to turn them into some short of boss - "maxHealth" = 450) + "health" = 650, //since it is foverer i guess it would be fine to turn them into some short of boss + "maxHealth" = 650) duration = 0 return "You revel in the corruption. There is no turning back." + diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 121850dac55..70fde119120 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -101,7 +101,7 @@ /datum/surgery_step/internal/detatch_organ allowed_tools = list( - /obj/item/weapon/scalpel = 100, + /obj/item/weapon/scalpel = 100, /obj/item/weapon/material/knife = 75, /obj/item/weapon/material/shard = 50 ) @@ -342,6 +342,49 @@ "Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!") affected.createwound(BRUISE, 20) +/datum/surgery_step/internal/lobotomize + allowed_tools = list( + /obj/item/weapon/scalpel/manager = 95, + /obj/item/weapon/surgicaldrill = 75, + /obj/item/weapon/pickaxe/ = 5 + ) + + min_duration = 100 + max_duration = 120 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + + if (!..()) + return 0 + + target.op_stage.current_organ = null + + var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"] + if(sponge && sponge.can_lobotomize && !sponge.lobotomized) + target.op_stage.current_organ = sponge + return ..() + else + return 0 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/brain/B = target.op_stage.current_organ + user.visible_message("[user] begins lobotomizing [target]'s [B.name] with \the [tool].", \ + "You start lobotomizing [target]'s [B.name] with \the [tool].") + target.custom_pain("Someone's scraping away at your [B.name]!",1) + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/brain/B = target.op_stage.current_organ + user.visible_message("[user] has lobotomized [target]'s \the [B.name] with \the [tool]." , \ + "You have lobotomized [target]'s [B.name] with \the [tool].") + B.lobotomize(user) + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user]'s hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!") + affected.createwound(BRUISE, 20) + ////////////////////////////////////////////////////////////////// // HEART SURGERY // ////////////////////////////////////////////////////////////////// diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 31caab1822e..e625018e55d 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -276,7 +276,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if(!(affected && (affected.status & ORGAN_ROBOT))) return 0 - if(affected.open != 2) + if(affected.open != 3) return 0 target.op_stage.current_organ = null @@ -325,7 +325,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if(!(affected && (affected.status & ORGAN_ROBOT))) return 0 - if(affected.open != 2) + if(affected.open != 3) return 0 target.op_stage.current_organ = null diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 30d9e86f8a1..d9951141d5a 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -110,7 +110,7 @@ proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) if (user.a_intent == I_HELP) user << "You can't see any useful way to use [tool] on [M]." - return 1 //Prevents attacking your patient on help intent + //not returning 1 so people and borgs can still use things, like syringes and hyposprays, while their patients are on the table return 0 proc/sort_surgeries() @@ -134,4 +134,4 @@ proc/sort_surgeries() var/face = 0 var/head_reattach = 0 var/current_organ = "organ" - var/list/in_progress = list() \ No newline at end of file + var/list/in_progress = list() diff --git a/code/modules/udp/ship_udp.dm b/code/modules/udp/ship_udp.dm new file mode 100644 index 00000000000..4b2fba8f062 --- /dev/null +++ b/code/modules/udp/ship_udp.dm @@ -0,0 +1,95 @@ +/** +* Copyright (c) 2017 "Werner Maisl" +* +* This file is part of Aurora.3 +* Aurora.3 is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License as +* published by the Free Software Foundation, either version 3 of the +* License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. If not, see
+
29 April 2017+Lohikar updated:+
LordFowl updated:+
19 April 2017+Ccomp5950 updated:+
14 April 2017+Lohikar updated:+
MoondancerPony updated:+
Nanako updated:+
12 April 2017+MoondancerPony updated:+
10 April 2017+Lohikar updated:+
MoondancerPony updated:+
08 April 2017+MoondancerPony updated:+
Nanako updated:+
Printer16 updated:+
inselc updated:+
03 April 2017+Lohikar updated:+
Nanako updated:+
02 April 2017+Alberyk updated:+
Lohikar updated:+
30 March 2017+Lohikar updated:+
29 March 2017+Skull132 updated:+
26 March 2017+Lohikar updated:+
25 March 2017+inselc updated:+
22 March 2017+Lohikar updated:+
Nanako updated:+
Skull132 updated:+
19 March 2017AgentWhatever updated:
- Location:
+ Location / Suspect:
{{/if}}
diff --git a/nano/templates/pai_medrecords.tmpl b/nano/templates/pai_medrecords.tmpl
index 37b1d7061ca..c9cdcd27bb2 100644
--- a/nano/templates/pai_medrecords.tmpl
+++ b/nano/templates/pai_medrecords.tmpl
@@ -75,7 +75,7 @@ code/modules/mob/living/silicon/pai/software_modules.dm
Important Notes
- {{:data.medical.notes}}
+ {{:data.medical.notes}}Important Notes
- {{:data.security.notes}}
+ {{:data.security.notes}}Current Disease: {{:data.records.medical.cdi}} Details: {{:data.records.medical.alg_d}} - Important Notes: {{:data.records.medical.notes}} + Important Notes: {{:data.records.medical.notes}}
{{else}}
Medical Record Lost!
@@ -706,7 +706,7 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
Details: {{:data.records.security.mi_crim_d}} Major Crimes: {{:data.records.security.ma_crim}} Details: {{:data.records.security.ma_crim_d}} - Important Notes: {{:data.records.security.notes}} + Important Notes: {{:data.records.security.notes}}
{{else}}
Security Record Lost!diff --git a/sound/machines/AirlockClose.ogg b/sound/machines/AirlockClose.ogg new file mode 100644 index 00000000000..58a06817f00 Binary files /dev/null and b/sound/machines/AirlockClose.ogg differ diff --git a/sound/machines/BoltsDown.ogg b/sound/machines/BoltsDown.ogg new file mode 100644 index 00000000000..c7320a04dfe Binary files /dev/null and b/sound/machines/BoltsDown.ogg differ diff --git a/sound/machines/BoltsUp.ogg b/sound/machines/BoltsUp.ogg new file mode 100644 index 00000000000..bc422e28726 Binary files /dev/null and b/sound/machines/BoltsUp.ogg differ |