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
" + if (locked) + t1 += "Swipe ID
" + else + t1 += "Block
" + + t1 += "Access requirement is set to " + t1 += one_access ? "ONE
" : "ALL
" + + t1 += conf_access == null ? "All
" : "All
" + + t1 += "
" + + var/list/accesses = get_all_station_access() + for (var/acc in accesses) + var/aname = get_access_desc(acc) + + if (!conf_access || !conf_access.len || !(acc in conf_access)) + t1 += "[aname]
" + else if(one_access) + t1 += "[aname]
" + else + t1 += "[aname]
" + + t1 += text("

Close

\n", src) + + user << browse(t1, "window=airlock_electronics") + onclose(user, "airlock") + +/obj/item/weapon/airlock_electronics/Topic(href, href_list) + ..() + if (usr.stat || usr.restrained() || (!ishuman(usr) && !istype(usr,/mob/living/silicon))) + return + if (href_list["close"]) + usr << browse(null, "window=airlock") + return + + if (href_list["login"]) + if(istype(usr,/mob/living/silicon)) + src.locked = 0 + src.last_configurator = usr.name else - t1 += "Block
" - - t1 += "Access requirement is set to " - t1 += one_access ? "ONE
" : "ALL
" - - t1 += conf_access == null ? "All
" : "All
" - - t1 += "
" - - var/list/accesses = get_all_station_access() - for (var/acc in accesses) - var/aname = get_access_desc(acc) - - if (!conf_access || !conf_access.len || !(acc in conf_access)) - t1 += "[aname]
" - else if(one_access) - t1 += "[aname]
" - else - t1 += "[aname]
" - - t1 += text("

Close

\n", src) - - user << browse(t1, "window=airlock_electronics") - onclose(user, "airlock") - - Topic(href, href_list) - ..() - if (usr.stat || usr.restrained() || (!ishuman(usr) && !istype(usr,/mob/living/silicon))) - return - if (href_list["close"]) - usr << browse(null, "window=airlock") - return - - if (href_list["login"]) - if(istype(usr,/mob/living/silicon)) + var/obj/item/I = usr.get_active_hand() + if (istype(I, /obj/item/device/pda)) + var/obj/item/device/pda/pda = I + I = pda.id + if (I && src.check_access(I)) src.locked = 0 - src.last_configurator = usr.name - else - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/device/pda)) - var/obj/item/device/pda/pda = I - I = pda.id - if (I && src.check_access(I)) - src.locked = 0 - src.last_configurator = I:registered_name + src.last_configurator = I:registered_name - if (locked) - return + if (locked) + return - if (href_list["logout"]) - locked = 1 + if (href_list["logout"]) + locked = 1 - if (href_list["one_access"]) - one_access = !one_access + if (href_list["one_access"]) + one_access = !one_access - if (href_list["access"]) - toggle_access(href_list["access"]) + if (href_list["access"]) + toggle_access(href_list["access"]) - attack_self(usr) + attack_self(usr) - proc - toggle_access(var/acc) - if (acc == "all") +/obj/item/weapon/airlock_electronics/proc/toggle_access(var/acc) + if (acc == "all") + conf_access = null + else + var/req = text2num(acc) + + if (conf_access == null) + conf_access = list() + + if (!(req in conf_access)) + conf_access += req + else + conf_access -= req + if (!conf_access.len) conf_access = null - else - var/req = text2num(acc) - - if (conf_access == null) - conf_access = list() - - if (!(req in conf_access)) - conf_access += req - else - conf_access -= req - if (!conf_access.len) - conf_access = null /obj/item/weapon/airlock_electronics/secure diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 6a28f8a647d..586804665a1 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -340,9 +340,7 @@ if( "activate" ) src.timer_start() - log_debug("Updating record") for (var/datum/data/record/E in data_core.general) - log_debug("Searching for criminal with name: [incident.criminal.name]") if(E.fields["name"] == incident.criminal.name) for (var/datum/data/record/R in data_core.security) if(R.fields["id"] == E.fields["id"]) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 38d8f46a1da..cecf17e17cd 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -364,7 +364,7 @@ else use_power(360) else - log_admin("[usr]([usr.ckey]) has forced open an emergency shutter.") + log_admin("[usr]([usr.ckey]) has forced open an emergency shutter.",key_name(usr)) message_admins("[usr]([usr.ckey]) has forced open an emergency shutter.") latetoggle() return ..() diff --git a/code/game/machinery/kitchen/cooking_machines/_appliance.dm b/code/game/machinery/kitchen/cooking_machines/_appliance.dm index 29d727f1d19..65fc78e2112 100644 --- a/code/game/machinery/kitchen/cooking_machines/_appliance.dm +++ b/code/game/machinery/kitchen/cooking_machines/_appliance.dm @@ -26,7 +26,7 @@ var/can_cook_mobs // Whether or not this machine accepts grabbed mobs. var/mobdamagetype = BRUTE // Burn damage for cooking appliances, brute for cereal/candy var/food_color // Colour of resulting food item. - var/cooked_sound // Sound played when cooking completes. + var/cooked_sound = 'sound/machines/ding.ogg' // Sound played when cooking completes. var/can_burn_food // Can the object burn food that is left inside? var/burn_chance = 10 // How likely is the food to burn? var/list/cooking_objs = list() // List of things being cooked @@ -110,14 +110,18 @@ icon_state = off_icon /obj/machinery/appliance/verb/toggle_power() - set src in view() set name = "Toggle Power" - set category = "Object" + set category = null + set src in view() //So that AI can operate it remotely if (!isliving(usr)) usr << "Ghosts aren't allowed to toggle power switches" return + if (isanimal(usr)) + usr << "You lack the dexterity to do that!" + return + if (usr.stat || usr.restrained() || usr.incapacitated()) return @@ -140,15 +144,22 @@ playsound(src, 'sound/machines/click.ogg', 40, 1) update_icon() +/obj/machinery/appliance/AICtrlClick() + toggle_power() + /obj/machinery/appliance/proc/choose_output() set src in view() set name = "Choose output" - set category = "Object" + set category = null if (!isliving(usr)) usr << "Ghosts aren't allowed to mess with cooking machines!" return + if (isanimal(usr)) + usr << "You lack the dexterity to do that!" + return + if (usr.stat || usr.restrained() || usr.incapacitated()) return @@ -558,6 +569,12 @@ return 0 /obj/machinery/appliance/proc/can_remove_items(var/mob/user) + if (!Adjacent(user)) + return 0 + + if (isanimal(user)) + return 0 + return 1 /obj/machinery/appliance/proc/eject(var/datum/cooking_item/CI, var/mob/user = null) diff --git a/code/game/machinery/kitchen/cooking_machines/container.dm b/code/game/machinery/kitchen/cooking_machines/container.dm index f1decf8c811..7ebf28e172a 100644 --- a/code/game/machinery/kitchen/cooking_machines/container.dm +++ b/code/game/machinery/kitchen/cooking_machines/container.dm @@ -7,7 +7,7 @@ var/shortname var/max_space = 20//Maximum sum of w-classes of foods in this container at once var/max_reagents = 80//Maximum units of reagents - + flags = OPENCONTAINER | NOREACT var/list/insertable = list(/obj/item/weapon/reagent_containers/food/snacks, /obj/item/weapon/holder, /obj/item/weapon/paper) @@ -48,13 +48,23 @@ set category = "Object" set desc = "Removes items from the container. does not remove reagents." + if (!isliving(usr)) + usr << "Ghosts can't mess with cooking containers" + //Here we only check for ghosts. Animals are intentionally allowed to remove things from oven trays so they can eat it + return + if (!Adjacent(usr)) usr << "You can't reach the [src] from there, get closer!" return + if (!contents.len) + usr << span("warning", "Theres nothing in the [src] you can remove!") + for (var/atom/movable/A in contents) A.forceMove(get_turf(src)) + usr << span("notice", "You remove all the solid items from the [src].") + /obj/item/weapon/reagent_containers/cooking_container/proc/check_contents() if (contents.len == 0) if (!reagents || reagents.total_volume == 0) @@ -64,6 +74,10 @@ return 1//Contains only a single object which can be extracted alone return 2//Contains multiple objects and/or reagents +/obj/item/weapon/reagent_containers/cooking_container/AltClick(var/mob/user) + .=1 + if(user.stat || user.restrained()) return + empty() //Deletes contents of container. diff --git a/code/game/machinery/kitchen/cooking_machines/fryer.dm b/code/game/machinery/kitchen/cooking_machines/fryer.dm index 843bb1729fd..d96ec32d35f 100644 --- a/code/game/machinery/kitchen/cooking_machines/fryer.dm +++ b/code/game/machinery/kitchen/cooking_machines/fryer.dm @@ -201,7 +201,7 @@ user.attack_log += text("\[[time_stamp()]\] Has [cook_type] \the [victim] ([victim.ckey]) in \a [src]") victim.attack_log += text("\[[time_stamp()]\] Has been [cook_type] in \a [src] by [user.name] ([user.ckey])") - msg_admin_attack("[user] ([user.ckey]) [cook_type] \the [victim] ([victim.ckey]) in \a [src]. (JMP)") + msg_admin_attack("[user] ([user.ckey]) [cook_type] \the [victim] ([victim.ckey]) in \a [src]. (JMP)",ckey=key_name(user),ckey_target=key_name(victim)) //Coat the victim in some oil oil.trans_to(victim, 40) diff --git a/code/game/machinery/kitchen/cooking_machines/oven.dm b/code/game/machinery/kitchen/cooking_machines/oven.dm index c741535df3b..00a6fd13395 100644 --- a/code/game/machinery/kitchen/cooking_machines/oven.dm +++ b/code/game/machinery/kitchen/cooking_machines/oven.dm @@ -50,24 +50,38 @@ /obj/machinery/appliance/cooker/oven/AltClick(var/mob/user) + .=1 if(user.stat || user.restrained()) return user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)//No spamming the door, it makes a sound toggle_door() + /obj/machinery/appliance/cooker/oven/verb/toggle_door() set src in view() set name = "Open/close oven door" - set category = "Object" - if (!Adjacent(usr)) - usr << "You can't reach the [src] from there, get closer!" + set category = null + + + if (!isliving(usr)) + usr << "Ghosts can't mess with ovens." return + if (isanimal(usr)) + usr << "You lack the dexterity to do that." + return + + + if (!Adjacent(usr)) + if (!issilicon(usr)) + usr << "You can't reach the [src] from there, get closer!" + return + if (open) open = 0 loss = (active_power_usage / resistance)*0.5 else open = 1 - loss = (active_power_usage / resistance)*6 + loss = (active_power_usage / resistance)*4 //When the oven door is opened, heat is lost MUCH faster playsound(src, 'sound/machines/hatch_open.ogg', 20, 1) diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 8a3c539062d..20c18e6e2f1 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -218,7 +218,7 @@ src.occupant.attack_log += "\[[time_stamp()]\] Was gibbed by [user]/[user.ckey]" //One shall not simply gib a mob unnoticed! user.attack_log += "\[[time_stamp()]\] Gibbed [src.occupant]/[src.occupant.ckey]" - msg_admin_attack("[user.name] ([user.ckey]) gibbed [src.occupant] ([src.occupant.ckey]) (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) gibbed [src.occupant] ([src.occupant.ckey]) (JMP)",ckey=key_name(user),ckey_target=key_name(src.occupant)) src.occupant.ghostize() diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index 36f49a4c63c..55a7f5adfa0 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -257,7 +257,7 @@ var/bomb_set if (text2num(lastentered) == null) var/turf/LOC = get_turf(usr) message_admins("[key_name_admin(usr)] tried to exploit a nuclear bomb by entering non-numerical codes: [lastentered]! ([LOC ? "JMP" : "null"])", 0) - log_admin("EXPLOIT: [key_name(usr)] tried to exploit a nuclear bomb by entering non-numerical codes: [lastentered]!") + log_admin("EXPLOIT: [key_name(usr)] tried to exploit a nuclear bomb by entering non-numerical codes: [lastentered]!",ckey=key_name(usr)) else code += lastentered if (length(code) > 5) diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index 2b3679dda51..718bcacb835 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -7,7 +7,7 @@ usr.set_machine(src) if(!mapping) return - log_game("[usr]([usr.key]) used station map L[z] in [src.loc.loc]") + log_game("[usr]([usr.key]) used station map L[z] in [src.loc.loc]",ckey=key_name(usr)) src.drawmap(usr) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index ee25385e2a8..af383867256 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -181,6 +181,13 @@ var/paid = 0 var/handled = 0 + if (currently_vending.amount < 1) + visible_message(span("warning","\The [src] buzzes and flashes a message on its LCD: \"Out of stock.\"")) + src.status_error = 1 + playsound(src.loc, 'sound/machines/buzz-two.ogg', 35, 1) + currently_vending = null + return + if (I) //for IDs and PDAs and wallets with IDs paid = pay_with_card(I,W) handled = 1 @@ -321,6 +328,10 @@ visible_message("\The [usr] swipes \the [ID_container] through \the [src].") var/datum/money_account/customer_account = get_account(I.associated_account_number) if (!customer_account) + //Allow BSTs to take stuff from vendors, for debugging and adminbus purposes + if (istype(I, /obj/item/weapon/card/id/bst)) + return 1 + src.status_message = "Error: Unable to access account. Please contact technical support if problem persists." src.status_error = 1 return 0 @@ -507,6 +518,9 @@ nanomanager.update_uis(src) /obj/machinery/vending/proc/vend(datum/data/vending_product/R, mob/user) + if (!R || R.amount < 1) + return + if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH usr << "Access denied." //Unless emagged of course flick(src.icon_deny,src) @@ -516,6 +530,8 @@ src.status_error = 0 nanomanager.update_uis(src) + + if (R.category & CAT_COIN) if(!coin) user << "You need to insert a coin to get this item." @@ -699,7 +715,8 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/chartreusegreen = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/chartreuseyellow =5, /obj/item/weapon/reagent_containers/food/drinks/bottle/cremewhite = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/brandy = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/guinnes = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/drambuie = 4, - /obj/item/weapon/reagent_containers/food/drinks/bottle/cremeyvette = 4) + /obj/item/weapon/reagent_containers/food/drinks/bottle/cremeyvette = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/xuizijuice = 8, + /obj/item/weapon/reagent_containers/food/drinks/bottle/sarezhiwine = 2, /obj/item/weapon/reagent_containers/food/drinks/bottle/victorygin = 2) contraband = list(/obj/item/weapon/reagent_containers/food/drinks/tea = 10) vend_delay = 15 idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. @@ -841,9 +858,9 @@ icon_state = "sec" icon_deny = "sec-deny" req_access = list(access_security) - products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/weapon/grenade/chem_grenade/teargas = 4,/obj/item/device/flash = 5, + products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/chem_grenade/teargas = 4,/obj/item/device/flash = 5, /obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6,/obj/item/device/holowarrant = 5) - contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/box/donut = 2) + contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/box/donut = 2,/obj/item/weapon/grenade/flashbang = 4) /obj/machinery/vending/hydronutrients name = "NutriMax" @@ -956,7 +973,7 @@ icon_deny = "tact-deny" req_access = list(access_security) products = list(/obj/item/weapon/storage/box/shotgunammo = 2,/obj/item/weapon/storage/box/shotgunshells = 2,/obj/item/ammo_magazine/c45m = 6,/obj/item/weapon/grenade/chem_grenade/teargas = 6, - /obj/item/ammo_magazine/mc9mmt = 2, /obj/item/clothing/mask/gas/tactical = 4, /obj/item/weapon/handcuffs/ziptie = 3) + /obj/item/ammo_magazine/mc9mmt = 2, /obj/item/clothing/mask/gas/tactical = 4, /obj/item/weapon/handcuffs/ziptie = 3, /obj/item/weapon/grenade/flashbang = 6) /obj/machinery/vending/tacticool/ert //Slightly more !FUN! name = "Nanosecurity Plus" diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index 698c1cc7646..9a23cc92d23 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -44,13 +44,13 @@ user << "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart." if (!(HULK in user.mutations)) user.mutations.Add(HULK) - user << "\blue Your muscles hurt." + user << "Your muscles hurt." if (!(LASER in user.mutations)) user.mutations.Add(LASER) - user << "\blue You feel pressure building behind your eyes." + user << "You feel pressure building behind your eyes." if (!(COLD_RESISTANCE in user.mutations)) user.mutations.Add(COLD_RESISTANCE) - user << "\blue Your body feels warm." + user << "Your body feels warm." if (!(TK in user.mutations)) user.mutations.Add(TK) if(!(HEAL in user.mutations)) @@ -59,7 +59,7 @@ user.mutations.Add(XRAY) user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) user.see_invisible = SEE_INVISIBLE_LEVEL_TWO - user << "\blue The walls suddenly disappear." + user << "The walls suddenly disappear." user.set_species("Shadow") user.mind.special_role = "Avatar of the Wish Granter" if("I want to be rich") @@ -80,7 +80,7 @@ user.mind.special_role = "Avatar of the Wish Granter" user.hallucination += 10 user.adjustBrainLoss(30) - user.show_message("[user] screams!") + user.emote("screams!") playsound(user, 'sound/hallucinations/wail.ogg', 40, 1) sleep(30) user << "Your mind is assaulted by endless horrors, your only desire is to end it, you must fulfill the Wish Granter's desires!" @@ -114,6 +114,7 @@ C << "You're not dead yet!" return C << "Death is not your end!" + C.verbs -= /mob/living/carbon/proc/immortality spawn(rand(400,800)) if(C.stat == DEAD) @@ -125,4 +126,5 @@ C << "You have regenerated." C.visible_message("[usr] appears to wake from the dead, having healed all wounds.") C.update_canmove() + C.verbs += /mob/living/carbon/proc/immortality return 1 diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index e010b9f45f9..86ae9cc7dd7 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -228,7 +228,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.ckey)] fed [key_name_admin(target)] in a [src]. (JMP)") + msg_admin_attack("[key_name_admin(user.ckey)] 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/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f5a0bcce695..ccf41e8f6c7 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1071,7 +1071,7 @@ if (brokesomething) playsound(get_turf(target), 'sound/weapons/heavysmash.ogg', 100, 1) occupant.attack_log += "\[[time_stamp()]\] driving [name] crashed into [brokesomething] objects at ([target.x];[target.y];[target.z]) " - msg_admin_attack("[key_name(occupant)] driving [name] crashed into [brokesomething] objects at (JMP)" ) + msg_admin_attack("[key_name(occupant)] driving [name] crashed into [brokesomething] objects at (JMP)",ckey=key_name(occupant)) //5. If we get here, then we've broken through everything that could stop us @@ -1110,7 +1110,7 @@ var/mob/living/M = A occupant.attack_log += "\[[time_stamp()]\] Crashed into [key_name(M)]with exosuit [name] " M.attack_log += "\[[time_stamp()]\] Was rammed with the exosuit [name] driven by [key_name(occupant)]" - msg_admin_attack("[key_name(occupant)] driving [name] crashed into [key_name(M)] at (JMP)" ) + msg_admin_attack("[key_name(occupant)] driving [name] crashed into [key_name(M)] at (JMP)",ckey=key_name(occupant),ckey_target=key_name(M) ) A.ex_act(3) diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index d95d9966b29..e1f3bb7c38f 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -24,20 +24,11 @@ pixel_x = -32 + rand(-8, 8) pixel_y = -32 + rand(-8, 8) - //switching opacity on after the smoke has spawned, and then turning it off before it is deleted results in cleaner - //lighting and view range updates (Is this still true with the new lighting system?) - set_opacity(1) - //float over to our destination, if we have one destination = dest_turf if(destination) walk_to(src, destination) -/obj/effect/effect/smoke/chem/Destroy() - set_opacity(0) - fadeOut() - ..() - /obj/effect/effect/smoke/chem/Move() var/list/oldlocs = view(1, src) . = ..() @@ -61,16 +52,6 @@ if(!istype(AM, /obj/effect/effect/smoke/chem)) reagents.splash(AM, splash_amount, copy = 1) -// Fades out the smoke smoothly using it's alpha variable. -/obj/effect/effect/smoke/chem/proc/fadeOut(var/frames = 16) - if(!alpha) return //already transparent - - frames = max(frames, 1) //We will just assume that by 0 frames, the coder meant "during one frame". - var/alpha_step = round(alpha / frames) - while(alpha > 0) - alpha = max(0, alpha - alpha_step) - sleep(world.tick_lag) - ///////////////////////////////////////////// // Chem Smoke Effect System ///////////////////////////////////////////// @@ -154,7 +135,7 @@ if(M) more = "(?)" message_admins("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", 0, 1) - log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].") + log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].",ckey=key_name(M)) else message_admins("A chemical smoke reaction has taken place in ([whereLink]). No associated key.", 0, 1) log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.") diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 1ee8015889c..e5cea9767bd 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -113,7 +113,18 @@ steam.start() -- spawns the effect if (duration) time_to_live = duration spawn (time_to_live) - qdel(src) + kill() + +/obj/effect/effect/smoke/proc/kill() + set waitfor = FALSE + animate(src, alpha = 0, time = 2 SECONDS, easing = QUAD_EASING) + set_opacity(FALSE) + + var/turf/T = get_turf(src) + if (T) + T.force_update_lights() // I hate it, but nothing else seems to work. + + QDEL_IN(src, 2 SECONDS) /obj/effect/effect/smoke/Crossed(mob/living/carbon/M as mob ) ..() @@ -271,8 +282,8 @@ steam.start() -- spawns the effect sleep(10) step(smoke,direction) spawn(smoke.time_to_live*0.75+rand(10,30)) - if (smoke) qdel(smoke) src.total_smoke-- + qdel(smoke) /datum/effect/effect/system/smoke_spread/bad diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index e26db52150d..cda131d121f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -485,7 +485,7 @@ var/list/global/slot_flags_enumeration = list( user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" - msg_admin_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") //BS12 EDIT ALG + msg_admin_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(M)) //BS12 EDIT ALG user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.do_attack_animation(M) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 58a4c4399d3..6673d678dbc 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -853,11 +853,11 @@ var/global/list/obj/item/device/pda/PDAs = list() U.show_message("Energy feeds back into your [src]!", 1) ui.close() detonate_act(src) - log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up") + log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up",ckey=key_name(U),ckey_target=key_name(P)) message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge but failed.", 1) else U.show_message("Success!", 1) - log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge and succeeded") + log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge and succeeded",ckey=key_name(U),ckey_target=key_name(P)) message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge and succeeded.", 1) detonate_act(P) else @@ -1084,7 +1084,7 @@ var/global/list/obj/item/device/pda/PDAs = list() var/reception_message = "\icon[src] Message from [sender] ([sender_job]), \"[message]\" (Reply)" new_info(message_silent, ttone, reception_message) - log_pda("[usr] (PDA: [sending_unit]) sent \"[message]\" to [name]") + log_pda("[usr] (PDA: [sending_unit]) sent \"[message]\" to [name]",ckey=key_name(usr),ckey_target=key_name(name)) new_message = 1 update_icon() @@ -1096,7 +1096,7 @@ var/global/list/obj/item/device/pda/PDAs = list() var/reception_message = "\icon[src] Message from [sender] ([sender_job]), \"[message]\" (Reply) [track]" new_info(message_silent, newstone, reception_message) - log_pda("[usr] (PDA: [sending_unit]) sent \"[message]\" to [name]") + log_pda("[usr] (PDA: [sending_unit]) sent \"[message]\" to [name]",ckey=key_name(usr),ckey_target=key_name(name)) new_message = 1 /obj/item/device/pda/verb/verb_reset_pda() diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index a7270b39c22..ed9ad84f2c7 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -37,7 +37,7 @@ M.attack_log += text("\[[time_stamp()]\] Has been flashed (attempt) with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to flash [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) Used the [src.name] to flash [M.name] ([M.ckey]) (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) Used the [src.name] to flash [M.name] ([M.ckey]) (JMP)",ckey=key_name(user),ckey_target=key_name(M)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.do_attack_animation(M) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 24faa63f439..008e9baef29 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -63,9 +63,11 @@ var/global/list/default_medbay_channels = list( ..() wires = new(src) internal_channels = default_internal_channels.Copy() + listening_objects += src /obj/item/device/radio/Destroy() qdel(wires) + listening_objects -= src wires = null if(radio_controller) radio_controller.remove_object(src, frequency) diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index 063e7a85cea..7e591b4a679 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -23,6 +23,11 @@ ..() radio = new(src) camera = new(src) + listening_objects += src + +/obj/item/device/spy_bug/Destroy() + listening_objects -= src + return ..() /obj/item/device/spy_bug/examine(mob/user) . = ..(user, 0) @@ -62,6 +67,11 @@ /obj/item/device/spy_monitor/New() radio = new(src) + listening_objects += src + +/obj/item/device/spy_monitor/Destroy() + listening_objects -= src + return ..() /obj/item/device/spy_monitor/examine(mob/user) . = ..(user, 1) diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index 7a871283433..95937c01185 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -32,7 +32,7 @@ cell = new/obj/item/weapon/cell() //comes with the crappy default power cell - high-capacity ones shouldn't be hard to find cell.loc = src - + // Checks whether the cooling unit is being worn on the back/suit slot. // That way you can't carry it in your hands while it's running to cool yourself down. /obj/item/device/suit_cooling_unit/proc/is_in_slot() @@ -48,7 +48,7 @@ if (!is_in_slot()) return - + var/mob/living/carbon/human/H = loc var/efficiency = 1 - H.get_pressure_weakness() //you need to have a good seal for effective cooling @@ -197,6 +197,10 @@ if (on) if (attached_to_suit(src.loc)) user << "It's switched on and running." + else if (istype(src.loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = src.loc + if (H.get_species()=="Industrial Frame") + user << "It's switched on and running, connected to the cooling systems of [H]." else user << "It's switched on, but not attached to anything." else diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index e59d3e993b5..3ed02fe7d3a 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -20,6 +20,14 @@ throw_speed = 4 throw_range = 20 +/obj/item/device/taperecorder/New() + ..() + listening_objects += src + +/obj/item/device/taperecorder/Destroy() + listening_objects -= src + return ..() + /obj/item/device/taperecorder/hear_talk(mob/living/M as mob, msg, var/verb="says", datum/language/speaking=null) if(recording) timestamp += timerecorded diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index c45f2a591c4..234afcd569e 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -34,7 +34,7 @@ item.loc = src user << "You attach the tank to the transfer valve." message_admins("[key_name_admin(user)] attached both tanks to a transfer valve. (JMP)") - log_game("[key_name_admin(user)] attached both tanks to a transfer valve.") + log_game("[key_name_admin(user)] attached both tanks to a transfer valve.",ckey=key_name(user)) update_icon() nanomanager.update_uis(src) // update all UIs attached to src @@ -56,7 +56,7 @@ bombers += "[key_name(user)] attached a [item] to a transfer valve." message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. (JMP)") - log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") + log_game("[key_name_admin(user)] attached a [item] to a transfer valve.",ckey=key_name(user)) attacher = user nanomanager.update_uis(src) // update all UIs attached to src return diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 24f6ad53b39..c023a3b0cb5 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -131,7 +131,7 @@ M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [name] to inject [M.name] ([M.ckey])") - log_attack("[user.name] ([user.ckey]) used the [name] to inject [M.name] ([M.ckey])") + log_attack("[user.name] ([user.ckey]) used the [name] to inject [M.name] ([M.ckey])",ckey=key_name(user),ckey_target=key_name(M)) message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with \the [src][injected_with_monkey]") // Apply the DNA shit. diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 78e12af8a07..e42470b9420 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -57,11 +57,11 @@ add_logs(user, target, "planted [name] on") user.visible_message("[user.name] finished planting an explosive on [target.name]!") message_admins("[key_name(user, user.client)](?) planted [src.name] on [key_name(target)](?) with [timer] second fuse",0,1) - log_game("[key_name(user)] planted [src.name] on [key_name(target)] with [timer] second fuse") + log_game("[key_name(user)] planted [src.name] on [key_name(target)] with [timer] second fuse",ckey=key_name(user)) else message_admins("[key_name(user, user.client)](?) planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - JMP) with [timer] second fuse",0,1) - log_game("[key_name(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z]) with [timer] second fuse") + log_game("[key_name(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z]) with [timer] second fuse",ckey=key_name(user)) target.overlays += image_overlay user << "Bomb has been planted. Timer counting down from [timer]." diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index c14ca3a5e8e..bdbe809de2f 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -182,7 +182,7 @@ H.attack_log += text("\[[time_stamp()]\] Has been wrapped with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to wrap [H.name] ([H.ckey])") - msg_admin_attack("[key_name(user)] used [src] to wrap [key_name(H)] (JMP)") + msg_admin_attack("[key_name(user)] used [src] to wrap [key_name(H)] (JMP)",ckey=key_name(user),ckey_target=key_name(H)) else user << "You need more paper." @@ -204,7 +204,7 @@ ..() var/gift_benefactor = pick("John Rolf","Isaac Bureaurgard","David Montrello","Sarah Karpac","Camille Rodgers","Luke Lawrence","Goliath Grills","Torbjorn","Odin","Jesus DeSanto","Santa Claus","Ms. Claus","Mr. Claus","Bjorn","Frodo","Gandalf","Elrond", "Robert Heinlen","Martin Fresco","Lawrence Chamberlain","Buster Kilrain","Nerevar","Neville Trouserkepling","Adam Sortings","Eve's Grocers","Father Christmas","Adolph Romkippler","Adolf Strange","Camille","Maximilian von Biesel","Max","Bob Wallace", - "The Grinch","Cicilia Simon","John F. Kennedy","Joseph Dorn","Mendell City","Ta’Akaix’Scay’extiih’aur Zo’ra","Ta'Akaix'Vaur'skiyet'sca Zo'ra","Miranda Trasen","Jiub","The Biesellian National Guard","The ERT","Baal D. Griffon","Hephaestus Industries","The Sol Alliance (Sorry about the blockade!") + "The Grinch","Cicilia Simon","John F. Kennedy","Joseph Dorn","Mendell City","Ta�Akaix�Scay�extiih�aur Zo�ra","Ta'Akaix'Vaur'skiyet'sca Zo'ra","Miranda Trasen","Jiub","The Biesellian National Guard","The ERT","Baal D. Griffon","Hephaestus Industries","The Sol Alliance (Sorry about the blockade!") var/pick_emotion = pick("love","platonic admiration","approval","love (not in a sexual way or anything, though)","apathy", "schadenfreude","love","God's blessing","Santa's blessing","Non-demoninational deity's blessing","love","compassion","appreciation", "respect","begrudging respect","love") desc = "To: The NSS Exodus
From: [gift_benefactor], with [pick_emotion]" diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 943775194f9..984cde9d208 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -39,7 +39,7 @@ if(stage > 1 && !active && clown_check(user)) user << "You prime \the [name]!" - msg_admin_attack("[user.name] ([user.ckey]) primed \a [src]. (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) primed \a [src]. (JMP)",ckey=key_name(user)) activate() add_fingerprint(user) @@ -132,7 +132,7 @@ icon_state = initial(icon_state) + "_active" if(user) - msg_admin_attack("[user.name] ([user.ckey]) primed \a [src] (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) primed \a [src] (JMP)",ckey=key_name(user)) return diff --git a/code/game/objects/items/weapons/grenades/fragmentation.dm b/code/game/objects/items/weapons/grenades/fragmentation.dm index 7ffc48c5ee1..55162bb93cd 100644 --- a/code/game/objects/items/weapons/grenades/fragmentation.dm +++ b/code/game/objects/items/weapons/grenades/fragmentation.dm @@ -43,7 +43,7 @@ proc/fragem(var/source,var/fragx,var/fragy,var/light_dam,var/flash_dam,var/p_dam desc = "A military fragmentation grenade, designed to explode in a deadly shower of fragments." icon_state = "frag" - var/num_fragments = 200 //total number of fragments produced by the grenade + var/num_fragments = 100 //total number of fragments produced by the grenade var/fragment_damage = 15 var/damage_step = 2 //projectiles lose a fragment each time they travel this distance. Can be a non-integer. var/explosion_size = 3 //size of the center explosion diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 16d8a620f97..63566c3ded8 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -70,7 +70,7 @@ return if(user) - msg_admin_attack("[user.name] ([user.ckey]) primed \a [src] (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) primed \a [src] (JMP)",ckey=key_name(user)) icon_state = initial(icon_state) + "_active" active = 1 diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index dd6d0699356..060298974bd 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -59,7 +59,7 @@ H.attack_log += text("\[[time_stamp()]\] Has been handcuffed (attempt) by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Attempted to handcuff [H.name] ([H.ckey])") - msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(H)] (JMP)") + msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(H)] (JMP)",ckey=key_name(user),ckey_target=key_name(H)) feedback_add_details("handcuffs","H") user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) @@ -98,7 +98,7 @@ var/last_chew = 0 H.visible_message(s, "You chew on your [O.name]!") message_admins("[key_name_admin(H)] is chewing on [H.get_pronoun(1)] restrained hand - (JMP)") H.attack_log += text("\[[time_stamp()]\] [s] ([H.ckey])") - log_attack("[s] ([H.ckey])") + log_attack("[s] ([H.ckey])",ckey=key_name(H)) if(O.take_damage(3,0,1,1,"teeth marks")) H:UpdateDamageIcon() diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 54a774b176c..ecd9a8a610f 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -50,7 +50,7 @@ Destroy() if(part) part.implants.Remove(src) - ..() + return ..() /obj/item/weapon/implant/tracking name = "tracking implant" @@ -162,11 +162,12 @@ Implant Specifics:
"} if (malfunction == MALFUNCTION_PERMANENT) return + var/need_gib = null if(istype(imp_in, /mob/)) var/mob/T = imp_in message_admins("Explosive implant triggered in [T] ([T.key]). (JMP) ") - log_game("Explosive implant triggered in [T] ([T.key]).") + log_game("Explosive implant triggered in [T] ([T.key]).",ckey=key_name(T)) need_gib = 1 if(ishuman(imp_in)) @@ -252,6 +253,15 @@ Implant Specifics:
"} explosion(get_turf(imp_in), -1, -1, 2, 3) qdel(src) +/obj/item/weapon/implant/explosive/New() + ..() + listening_objects += src + +/obj/item/weapon/implant/explosive/Destroy() + listening_objects -= src + return ..() + + /obj/item/weapon/implant/chem name = "chemical implant" desc = "Injects things." diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index 49b1b280a7a..13a76e44558 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -37,9 +37,9 @@ if(src.imp.reagents.total_volume >= src.imp.reagents.maximum_volume) user << "\The [src] is full." else - spawn(5) - I.reagents.trans_to_obj(src.imp, 5) - user << "You inject 5 units of the solution. The syringe now contains [I.reagents.total_volume] units." + var/trans = I.reagents.trans_to_obj(src.imp, 5) + if (trans > 0) + user << "You inject [trans] units of the solution. The syringe now contains [I.reagents.total_volume] units." else if (istype(I, /obj/item/weapon/implanter)) var/obj/item/weapon/implanter/M = I if (M.imp) diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 3bb818ba473..ea1b2508251 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -172,7 +172,7 @@ M.attack_log += text("\[[time_stamp()]\] Implanted with [src.name] ([src.ipc_tag.name]) by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] ([src.ipc_tag.name]) to implant [M.name] ([M.ckey])") - msg_admin_attack("[key_name_admin(user)] implanted [key_name_admin(M)] with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[key_name_admin(user)] implanted [key_name_admin(M)] with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(M)) user.show_message("You implanted the implant into [M].") diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index c65aadfe17a..2d613acb755 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -62,10 +62,9 @@ contained_sprite = 1 slot_flags = SLOT_BELT force = 22 - throwforce = 70 -//This should do around 15 brute when you throw it, there's probably a better way to do it. - throw_speed = 1 - throw_range = 5 + throwforce = 15.0 + throw_speed = 5 + throw_range = 7 attack_verb = list("smashed", "beaten", "slammed", "smacked", "struck", "battered", "bonked") w_class = 3 origin_tech = list(TECH_MATERIAL = 3, TECH_ILLEGAL = 2) diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index faf8a11c76c..86b0738f286 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -59,6 +59,9 @@ if("id") icon_state = "walletid" return + if("guest") + icon_state = "walletid" + return if("silver") icon_state = "walletid_silver" return diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 64a44c1af54..0e99dd69d06 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -158,7 +158,7 @@ L.stun_effect_act(stun, agony, target_zone, src) playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - msg_admin_attack("[key_name(user)] stunned [key_name(L)] with the [src] (JMP)") + msg_admin_attack("[key_name(user)] stunned [key_name(L)] with the [src] (JMP)",ckey=key_name(user),ckey_target=key_name(L)) if(status) deductcharge(hitcost) diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index a5d5db02ad8..74af7679685 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -75,7 +75,7 @@ flick("c-4detonator_click", src) if(src.bomb) src.bomb.detonate() - log_admin("[key_name(user)] has triggered [src.bomb] with [src].") + log_admin("[key_name(user)] has triggered [src.bomb] with [src].",ckey=key_name(user)) message_admins("[key_name_admin(user)] has triggered [src.bomb] with [src].") if("Close the lighter.") diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 8c5ddf22f50..a77f3b19c3a 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -352,7 +352,7 @@ tank.armed = 0 return message_admins("[key_name_admin(user)] triggered a fueltank explosion.") - log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.") + log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.",ckey=key_name(user)) user << span("alert", "That was stupid of you.") tank.explode() return diff --git a/code/game/objects/items/weapons/trays.dm b/code/game/objects/items/weapons/trays.dm index 4f2f3fdd970..0cc54caa9db 100644 --- a/code/game/objects/items/weapons/trays.dm +++ b/code/game/objects/items/weapons/trays.dm @@ -64,7 +64,7 @@ M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)",ckey=key_name(user),ckey_target=key_name(M)) if(prob(15)) if(!issilicon(M)) M.Weaken(3) diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 8cedf53af18..bf54ca2c7ce 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -59,7 +59,7 @@ M.attack_log += text("\[[time_stamp()]\] Is being deconverted with the [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attempt to deconvert [M.name] ([M.ckey])") - msg_admin_attack("[key_name(user)] attempted to deconvert [key_name(M)] with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[key_name(user)] attempted to deconvert [key_name(M)] with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(M)) else return ..() diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index e9b5fdb3793..24369356d72 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -18,7 +18,7 @@ var/obj/item/weapon/weldingtool/T = W if(T.welding & prob(50)) message_admins("[key_name_admin(user)] triggered a fueltank explosion.") - log_game("[key_name(user)] triggered a fueltank explosion.") + log_game("[key_name(user)] triggered a fueltank explosion.",ckey=key_name(user)) user << "That was stupid of you." explosion(get_turf(src),-1,0,2) if(src) diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 23727fb3c0d..79f0c2de9e8 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -4,27 +4,43 @@ icon = 'icons/misc/mark.dmi' icon_state = "rup" var/spawn_nothing_percentage = 0 // this variable determines the likelyhood that this random object will not spawn anything - + var/list/spawnlist + var/list/problist + var/has_postspawn // creates a new object and deletes itself /obj/random/initialize() ..() if (!prob(spawn_nothing_percentage)) - spawn_item() + var/item = spawn_item() + if (has_postspawn && item) + post_spawn(item) qdel(src) // this function should return a specific item to spawn /obj/random/proc/item_to_spawn() return 0 +/obj/random/proc/post_spawn(obj/thing) + log_debug("random_obj: [DEBUG_REF(src)] registered itself as having post_spawn, but did not override post_spawn()!") // creates the random item /obj/random/proc/spawn_item() + if (spawnlist) + var/itemtype = pick(spawnlist) + . = new itemtype(loc) + else if (problist) + var/itemtype = pickweight(problist) + . = new itemtype(loc) - var/build_path = item_to_spawn() - new build_path(loc) + else + var/itemtype = item_to_spawn() + . = new itemtype(loc) + + if (!.) + log_debug("random_obj: [DEBUG_REF(src)] returned null item!") /obj/random/single name = "randomly spawned object" @@ -34,67 +50,66 @@ item_to_spawn() return ispath(spawn_object) ? spawn_object : text2path(spawn_object) - /obj/random/tool name = "random tool" desc = "This is a random tool" icon = 'icons/obj/items.dmi' icon_state = "welder" - item_to_spawn() - return pick(/obj/item/weapon/screwdriver,\ - /obj/item/weapon/wirecutters,\ - /obj/item/weapon/weldingtool,\ - /obj/item/weapon/crowbar,\ - /obj/item/weapon/wrench,\ - /obj/item/device/flashlight) - + spawnlist = list( + /obj/item/weapon/screwdriver, + /obj/item/weapon/wirecutters, + /obj/item/weapon/weldingtool, + /obj/item/weapon/crowbar, + /obj/item/weapon/wrench, + /obj/item/device/flashlight + ) /obj/random/technology_scanner name = "random scanner" desc = "This is a random technology scanner." icon = 'icons/obj/device.dmi' icon_state = "atmos" - item_to_spawn() - return pick(prob(5);/obj/item/device/t_scanner,\ - prob(2);/obj/item/device/radio,\ - prob(5);/obj/item/device/analyzer) - + problist = list( + /obj/item/device/t_scanner = 5, + /obj/item/device/radio = 2, + /obj/item/device/analyzer = 5 + ) /obj/random/powercell name = "random powercell" desc = "This is a random powercell." icon = 'icons/obj/power.dmi' icon_state = "cell" - item_to_spawn() - return pick(prob(10);/obj/item/weapon/cell/crap,\ - prob(40);/obj/item/weapon/cell,\ - prob(40);/obj/item/weapon/cell/high,\ - prob(9);/obj/item/weapon/cell/super,\ - prob(1);/obj/item/weapon/cell/hyper) - + problist = list( + /obj/item/weapon/cell/crap = 10, + /obj/item/weapon/cell = 40, + /obj/item/weapon/cell/high = 40, + /obj/item/weapon/cell/super = 9, + /obj/item/weapon/cell/hyper = 1 + ) /obj/random/bomb_supply name = "bomb supply" desc = "This is a random bomb supply." icon = 'icons/obj/assemblies/new_assemblies.dmi' icon_state = "signaller" - item_to_spawn() - return pick(/obj/item/device/assembly/igniter,\ - /obj/item/device/assembly/prox_sensor,\ - /obj/item/device/assembly/signaler,\ - /obj/item/device/multitool) - + spawnlist = list( + /obj/item/device/assembly/igniter, + /obj/item/device/assembly/prox_sensor, + /obj/item/device/assembly/signaler, + /obj/item/device/multitool + ) /obj/random/toolbox name = "random toolbox" desc = "This is a random toolbox." icon = 'icons/obj/storage.dmi' icon_state = "red" - item_to_spawn() - return pick(prob(3);/obj/item/weapon/storage/toolbox/mechanical,\ - prob(2);/obj/item/weapon/storage/toolbox/electrical,\ - prob(1);/obj/item/weapon/storage/toolbox/emergency) - + spawnlist = list( + /obj/item/weapon/storage/toolbox/mechanical = 3, + /obj/item/weapon/storage/toolbox/electrical = 2, + /obj/item/weapon/storage/toolbox/emergency = 1 + ) /obj/random/tech_supply name = "random tech supply" @@ -102,18 +117,19 @@ icon = 'icons/obj/power.dmi' icon_state = "cell" // spawn_nothing_percentage = 50 - item_to_spawn() - return pick(prob(3);/obj/random/powercell,\ - prob(2);/obj/random/technology_scanner,\ - prob(1);/obj/item/weapon/packageWrap,\ - prob(2);/obj/random/bomb_supply,\ - prob(1);/obj/item/weapon/extinguisher,\ - prob(1);/obj/item/clothing/gloves/fyellow,\ - prob(3);/obj/item/stack/cable_coil,\ - prob(2);/obj/random/toolbox,\ - prob(2);/obj/item/weapon/storage/belt/utility,\ - prob(5);/obj/random/tool,\ - prob(2);/obj/item/weapon/tape_roll) + problist = list( + /obj/random/powercell = 3, + /obj/random/technology_scanner = 2, + /obj/item/weapon/packageWrap = 1, + /obj/random/bomb_supply = 2, + /obj/item/weapon/extinguisher = 1, + /obj/item/clothing/gloves/fyellow = 1, + /obj/item/stack/cable_coil = 3, + /obj/random/toolbox = 2, + /obj/item/weapon/storage/belt/utility = 2, + /obj/random/tool = 5, + /obj/item/weapon/tape_roll = 2 + ) /obj/random/medical name = "Random Medicine" @@ -121,35 +137,35 @@ icon = 'icons/obj/items.dmi' icon_state = "brutepack" spawn_nothing_percentage = 25 - item_to_spawn() - return pick(prob(4);/obj/item/stack/medical/bruise_pack,\ - prob(4);/obj/item/stack/medical/ointment,\ - prob(2);/obj/item/stack/medical/advanced/bruise_pack,\ - prob(2);/obj/item/stack/medical/advanced/ointment,\ - prob(1);/obj/item/stack/medical/splint,\ - prob(2);/obj/item/bodybag,\ - prob(1);/obj/item/bodybag/cryobag,\ - prob(2);/obj/item/weapon/storage/pill_bottle/kelotane,\ - prob(2);/obj/item/weapon/storage/pill_bottle/antitox,\ - prob(2);/obj/item/weapon/storage/pill_bottle/tramadol,\ - prob(2);/obj/item/weapon/reagent_containers/syringe/antitoxin,\ - prob(1);/obj/item/weapon/reagent_containers/syringe/antiviral,\ - prob(2);/obj/item/weapon/reagent_containers/syringe/inaprovaline,\ - prob(1);/obj/item/stack/nanopaste) - + problist = list( + /obj/item/stack/medical/bruise_pack = 4, + /obj/item/stack/medical/ointment = 4, + /obj/item/stack/medical/advanced/bruise_pack = 2, + /obj/item/stack/medical/advanced/ointment = 2, + /obj/item/stack/medical/splint = 1, + /obj/item/bodybag = 2, + /obj/item/bodybag/cryobag = 1, + /obj/item/weapon/storage/pill_bottle/kelotane = 2, + /obj/item/weapon/storage/pill_bottle/antitox = 2, + /obj/item/weapon/storage/pill_bottle/tramadol = 2, + /obj/item/weapon/reagent_containers/syringe/antitoxin = 2, + /obj/item/weapon/reagent_containers/syringe/antiviral = 1, + /obj/item/weapon/reagent_containers/syringe/inaprovaline = 2, + /obj/item/stack/nanopaste = 1 + ) /obj/random/firstaid name = "Random First Aid Kit" desc = "This is a random first aid kit." icon = 'icons/obj/storage.dmi' icon_state = "firstaid" - item_to_spawn() - return pick(prob(3);/obj/item/weapon/storage/firstaid/regular,\ - prob(2);/obj/item/weapon/storage/firstaid/toxin,\ - prob(2);/obj/item/weapon/storage/firstaid/o2,\ - prob(1);/obj/item/weapon/storage/firstaid/adv,\ - prob(2);/obj/item/weapon/storage/firstaid/fire) - + problist = list( + /obj/item/weapon/storage/firstaid/regular = 3, + /obj/item/weapon/storage/firstaid/toxin = 2, + /obj/item/weapon/storage/firstaid/o2 = 2, + /obj/item/weapon/storage/firstaid/adv = 1, + /obj/item/weapon/storage/firstaid/fire = 2 + ) /obj/random/contraband name = "Random Illegal Item" @@ -157,127 +173,133 @@ icon = 'icons/obj/items.dmi' icon_state = "purplecomb" // spawn_nothing_percentage = 50 - item_to_spawn() - return pick(prob(3);/obj/item/weapon/storage/pill_bottle/tramadol,\ - prob(4);/obj/item/weapon/haircomb,\ - prob(2);/obj/item/weapon/storage/pill_bottle/happy,\ - prob(2);/obj/item/weapon/storage/pill_bottle/zoom,\ - prob(5);/obj/item/weapon/contraband/poster,\ - prob(2);/obj/item/weapon/material/butterfly,\ - prob(3);/obj/item/weapon/material/butterflyblade,\ - prob(3);/obj/item/weapon/material/butterflyhandle,\ - prob(3);/obj/item/weapon/material/wirerod,\ - prob(1);/obj/item/weapon/material/butterfly/switchblade,\ - prob(1);/obj/item/weapon/reagent_containers/syringe/drugs) - + problist = list( + /obj/item/weapon/storage/pill_bottle/tramadol = 3, + /obj/item/weapon/haircomb = 4, + /obj/item/weapon/storage/pill_bottle/happy = 2, + /obj/item/weapon/storage/pill_bottle/zoom = 2, + /obj/item/weapon/contraband/poster = 5, + /obj/item/weapon/material/butterfly = 2, + /obj/item/weapon/material/butterflyblade = 3, + /obj/item/weapon/material/butterflyhandle = 3, + /obj/item/weapon/material/wirerod = 3, + /obj/item/weapon/material/butterfly/switchblade = 1, + /obj/item/weapon/reagent_containers/syringe/drugs = 1 + ) /obj/random/energy name = "Random Energy Weapon" desc = "This is a random security weapon." icon = 'icons/obj/gun.dmi' icon_state = "energykill100" - item_to_spawn() - return pick(prob(2);/obj/item/weapon/gun/energy/rifle/laser,\ - prob(2);/obj/item/weapon/gun/energy/gun,\ - prob(1);/obj/item/weapon/gun/energy/stunrevolver) + problist = list( + /obj/item/weapon/gun/energy/rifle/laser = 2, + /obj/item/weapon/gun/energy/gun = 2, + /obj/item/weapon/gun/energy/stunrevolver = 1 + ) /obj/random/projectile name = "Random Projectile Weapon" desc = "This is a random security weapon." icon = 'icons/obj/gun.dmi' icon_state = "revolver" - item_to_spawn() - return pick(prob(3);/obj/item/weapon/gun/projectile/shotgun/pump,\ - prob(2);/obj/item/weapon/gun/projectile/automatic/wt550,\ - prob(1);/obj/item/weapon/gun/projectile/shotgun/pump/combat) + problist = list( + /obj/item/weapon/gun/projectile/shotgun/pump = 3, + /obj/item/weapon/gun/projectile/automatic/wt550 = 2, + /obj/item/weapon/gun/projectile/shotgun/pump/combat = 1 + ) /obj/random/handgun name = "Random Handgun" desc = "This is a random security sidearm." icon = 'icons/obj/gun.dmi' icon_state = "secgundark" - item_to_spawn() - return pick(prob(3);/obj/item/weapon/gun/projectile/sec,\ - prob(1);/obj/item/weapon/gun/projectile/sec/wood) - + problist = list( + /obj/item/weapon/gun/projectile/sec = 3, + /obj/item/weapon/gun/projectile/sec/wood = 1 + ) /obj/random/ammo name = "Random Ammunition" desc = "This is random ammunition." icon = 'icons/obj/ammo.dmi' icon_state = "45-10" - item_to_spawn() - return pick(prob(6);/obj/item/weapon/storage/box/beanbags,\ - prob(2);/obj/item/weapon/storage/box/shotgunammo,\ - prob(4);/obj/item/weapon/storage/box/shotgunshells,\ - prob(1);/obj/item/weapon/storage/box/stunshells,\ - prob(2);/obj/item/ammo_magazine/c45m,\ - prob(4);/obj/item/ammo_magazine/c45m/rubber,\ - prob(4);/obj/item/ammo_magazine/c45m/flash,\ - prob(2);/obj/item/ammo_magazine/mc9mmt,\ - prob(6);/obj/item/ammo_magazine/mc9mmt/rubber) - + problist = list( + /obj/item/weapon/storage/box/beanbags = 6, + /obj/item/weapon/storage/box/shotgunammo = 2, + /obj/item/weapon/storage/box/shotgunshells = 4, + /obj/item/weapon/storage/box/stunshells = 1, + /obj/item/ammo_magazine/c45m = 2, + /obj/item/ammo_magazine/c45m/rubber = 4, + /obj/item/ammo_magazine/c45m/flash = 4, + /obj/item/ammo_magazine/mc9mmt = 2, + /obj/item/ammo_magazine/mc9mmt/rubber = 6 + ) /obj/random/action_figure name = "random action figure" desc = "This is a random action figure." icon = 'icons/obj/toy.dmi' icon_state = "assistant" - item_to_spawn() - return pick(/obj/item/toy/figure/cmo,\ - /obj/item/toy/figure/assistant,\ - /obj/item/toy/figure/atmos,\ - /obj/item/toy/figure/bartender,\ - /obj/item/toy/figure/borg,\ - /obj/item/toy/figure/gardener,\ - /obj/item/toy/figure/captain,\ - /obj/item/toy/figure/cargotech,\ - /obj/item/toy/figure/ce,\ - /obj/item/toy/figure/chaplain,\ - /obj/item/toy/figure/chef,\ - /obj/item/toy/figure/chemist,\ - /obj/item/toy/figure/clown,\ - /obj/item/toy/figure/corgi,\ - /obj/item/toy/figure/detective,\ - /obj/item/toy/figure/dsquad,\ - /obj/item/toy/figure/engineer,\ - /obj/item/toy/figure/geneticist,\ - /obj/item/toy/figure/hop,\ - /obj/item/toy/figure/hos,\ - /obj/item/toy/figure/qm,\ - /obj/item/toy/figure/janitor,\ - /obj/item/toy/figure/agent,\ - /obj/item/toy/figure/librarian,\ - /obj/item/toy/figure/md,\ - /obj/item/toy/figure/mime,\ - /obj/item/toy/figure/miner,\ - /obj/item/toy/figure/ninja,\ - /obj/item/toy/figure/wizard,\ - /obj/item/toy/figure/rd,\ - /obj/item/toy/figure/roboticist,\ - /obj/item/toy/figure/scientist,\ - /obj/item/toy/figure/syndie,\ - /obj/item/toy/figure/secofficer,\ - /obj/item/toy/figure/warden,\ - /obj/item/toy/figure/psychologist,\ - /obj/item/toy/figure/paramedic,\ - /obj/item/toy/figure/ert) - + spawnlist = list( + /obj/item/toy/figure/cmo, + /obj/item/toy/figure/assistant, + /obj/item/toy/figure/atmos, + /obj/item/toy/figure/bartender, + /obj/item/toy/figure/borg, + /obj/item/toy/figure/gardener, + /obj/item/toy/figure/captain, + /obj/item/toy/figure/cargotech, + /obj/item/toy/figure/ce, + /obj/item/toy/figure/chaplain, + /obj/item/toy/figure/chef, + /obj/item/toy/figure/chemist, + /obj/item/toy/figure/clown, + /obj/item/toy/figure/corgi, + /obj/item/toy/figure/detective, + /obj/item/toy/figure/dsquad, + /obj/item/toy/figure/engineer, + /obj/item/toy/figure/geneticist, + /obj/item/toy/figure/hop, + /obj/item/toy/figure/hos, + /obj/item/toy/figure/qm, + /obj/item/toy/figure/janitor, + /obj/item/toy/figure/agent, + /obj/item/toy/figure/librarian, + /obj/item/toy/figure/md, + /obj/item/toy/figure/mime, + /obj/item/toy/figure/miner, + /obj/item/toy/figure/ninja, + /obj/item/toy/figure/wizard, + /obj/item/toy/figure/rd, + /obj/item/toy/figure/roboticist, + /obj/item/toy/figure/scientist, + /obj/item/toy/figure/syndie, + /obj/item/toy/figure/secofficer, + /obj/item/toy/figure/warden, + /obj/item/toy/figure/psychologist, + /obj/item/toy/figure/paramedic, + /obj/item/toy/figure/ert + ) /obj/random/plushie name = "random plushie" desc = "This is a random plushie." icon = 'icons/obj/toy.dmi' icon_state = "nymphplushie" - item_to_spawn() - return pick(/obj/structure/plushie/ian,\ - /obj/structure/plushie/drone,\ - /obj/structure/plushie/carp,\ - /obj/structure/plushie/beepsky,\ - /obj/item/toy/plushie/nymph,\ - /obj/item/toy/plushie/mouse,\ - /obj/item/toy/plushie/kitten,\ - /obj/item/toy/plushie/lizard) + spawnlist = list( + /obj/structure/plushie/ian, + /obj/structure/plushie/drone, + /obj/structure/plushie/carp, + /obj/structure/plushie/beepsky, + /obj/item/toy/plushie/nymph, + /obj/item/toy/plushie/mouse, + /obj/item/toy/plushie/kitten, + /obj/item/toy/plushie/lizard + ) + +/obj/random/smalltank + name = "random small tank" /obj/random/smalltank/item_to_spawn() if (prob(40)) @@ -287,149 +309,156 @@ else return /obj/item/weapon/tank/emergency_oxygen/double -/obj/random/belt/item_to_spawn() - var/list/belts = list(/obj/item/weapon/storage/belt/utility = 1, - /obj/item/weapon/storage/belt/medical = 0.4, - /obj/item/weapon/storage/belt/medical/emt = 0.4, - /obj/item/weapon/storage/belt/security/tactical = 0.1, - /obj/item/weapon/storage/belt/military = 0.1, - /obj/item/weapon/storage/belt/janitor = 0.4 +/obj/random/belt + name = "random belt" + problist = list( + /obj/item/weapon/storage/belt/utility = 1, + /obj/item/weapon/storage/belt/medical = 0.4, + /obj/item/weapon/storage/belt/medical/emt = 0.4, + /obj/item/weapon/storage/belt/security/tactical = 0.1, + /obj/item/weapon/storage/belt/military = 0.1, + /obj/item/weapon/storage/belt/janitor = 0.4 ) - return pickweight(belts) - -//Spawns a random backpack -//Novelty and rare backpacks have lower weights -/obj/random/backpack/item_to_spawn() - var/list/packs = list( - /obj/item/weapon/storage/backpack = 3, - /obj/item/weapon/storage/backpack/holding = 0.5, - /obj/item/weapon/storage/backpack/cultpack = 2, - /obj/item/weapon/storage/backpack/clown = 2, - /obj/item/weapon/storage/backpack/medic = 3, - /obj/item/weapon/storage/backpack/security = 3, - /obj/item/weapon/storage/backpack/captain = 2, - /obj/item/weapon/storage/backpack/industrial = 3, - /obj/item/weapon/storage/backpack/toxins = 3, - /obj/item/weapon/storage/backpack/hydroponics = 3, - /obj/item/weapon/storage/backpack/genetics = 3, - /obj/item/weapon/storage/backpack/virology = 3, - /obj/item/weapon/storage/backpack/chemistry = 3, - /obj/item/weapon/storage/backpack/cloak = 2, - /obj/item/weapon/storage/backpack/syndie = 2, - /obj/item/weapon/storage/backpack/wizard = 2, - /obj/item/weapon/storage/backpack/satchel = 3, - /obj/item/weapon/storage/backpack/satchel_norm = 3, - /obj/item/weapon/storage/backpack/satchel_eng = 3, - /obj/item/weapon/storage/backpack/satchel_med = 3, - /obj/item/weapon/storage/backpack/satchel_vir = 3, - /obj/item/weapon/storage/backpack/satchel_chem = 3, - /obj/item/weapon/storage/backpack/satchel_gen = 3, - /obj/item/weapon/storage/backpack/satchel_tox = 3, - /obj/item/weapon/storage/backpack/satchel_sec = 3, - /obj/item/weapon/storage/backpack/satchel_hyd = 3, - /obj/item/weapon/storage/backpack/satchel_cap = 2, - /obj/item/weapon/storage/backpack/satchel_syndie = 2, - /obj/item/weapon/storage/backpack/satchel_wizard = 2, - /obj/item/weapon/storage/backpack/ert = 2, - /obj/item/weapon/storage/backpack/ert/security = 2, - /obj/item/weapon/storage/backpack/ert/engineer = 2, - /obj/item/weapon/storage/backpack/ert/medical = 2, - /obj/item/weapon/storage/backpack/duffel = 3, - /obj/item/weapon/storage/backpack/duffel/cap = 2, - /obj/item/weapon/storage/backpack/duffel/hyd = 3, - /obj/item/weapon/storage/backpack/duffel/vir = 3, - /obj/item/weapon/storage/backpack/duffel/med = 3, - /obj/item/weapon/storage/backpack/duffel/eng = 3, - /obj/item/weapon/storage/backpack/duffel/tox = 3, - /obj/item/weapon/storage/backpack/duffel/sec = 3, - /obj/item/weapon/storage/backpack/duffel/gen = 3, - /obj/item/weapon/storage/backpack/duffel/chem = 3, - /obj/item/weapon/storage/backpack/duffel/syndie = 2, - /obj/item/weapon/storage/backpack/duffel/wizard = 2 +// Spawns a random backpack. +// Novelty and rare backpacks have lower weights. +/obj/random/backpack + name = "random backpack" + problist = list( + /obj/item/weapon/storage/backpack = 3, + /obj/item/weapon/storage/backpack/holding = 0.5, + /obj/item/weapon/storage/backpack/cultpack = 2, + /obj/item/weapon/storage/backpack/clown = 2, + /obj/item/weapon/storage/backpack/medic = 3, + /obj/item/weapon/storage/backpack/security = 3, + /obj/item/weapon/storage/backpack/captain = 2, + /obj/item/weapon/storage/backpack/industrial = 3, + /obj/item/weapon/storage/backpack/toxins = 3, + /obj/item/weapon/storage/backpack/hydroponics = 3, + /obj/item/weapon/storage/backpack/genetics = 3, + /obj/item/weapon/storage/backpack/virology = 3, + /obj/item/weapon/storage/backpack/chemistry = 3, + /obj/item/weapon/storage/backpack/cloak = 2, + /obj/item/weapon/storage/backpack/syndie = 2, + /obj/item/weapon/storage/backpack/wizard = 2, + /obj/item/weapon/storage/backpack/satchel = 3, + /obj/item/weapon/storage/backpack/satchel_norm = 3, + /obj/item/weapon/storage/backpack/satchel_eng = 3, + /obj/item/weapon/storage/backpack/satchel_med = 3, + /obj/item/weapon/storage/backpack/satchel_vir = 3, + /obj/item/weapon/storage/backpack/satchel_chem = 3, + /obj/item/weapon/storage/backpack/satchel_gen = 3, + /obj/item/weapon/storage/backpack/satchel_tox = 3, + /obj/item/weapon/storage/backpack/satchel_sec = 3, + /obj/item/weapon/storage/backpack/satchel_hyd = 3, + /obj/item/weapon/storage/backpack/satchel_cap = 2, + /obj/item/weapon/storage/backpack/satchel_syndie = 2, + /obj/item/weapon/storage/backpack/satchel_wizard = 2, + /obj/item/weapon/storage/backpack/ert = 2, + /obj/item/weapon/storage/backpack/ert/security = 2, + /obj/item/weapon/storage/backpack/ert/engineer = 2, + /obj/item/weapon/storage/backpack/ert/medical = 2, + /obj/item/weapon/storage/backpack/duffel = 3, + /obj/item/weapon/storage/backpack/duffel/cap = 2, + /obj/item/weapon/storage/backpack/duffel/hyd = 3, + /obj/item/weapon/storage/backpack/duffel/vir = 3, + /obj/item/weapon/storage/backpack/duffel/med = 3, + /obj/item/weapon/storage/backpack/duffel/eng = 3, + /obj/item/weapon/storage/backpack/duffel/tox = 3, + /obj/item/weapon/storage/backpack/duffel/sec = 3, + /obj/item/weapon/storage/backpack/duffel/gen = 3, + /obj/item/weapon/storage/backpack/duffel/chem = 3, + /obj/item/weapon/storage/backpack/duffel/syndie = 2, + /obj/item/weapon/storage/backpack/duffel/wizard = 2 ) - return pickweight(packs) - /obj/random/voidsuit + name = "random voidsuit" var/damaged = 0 - -/obj/random/voidsuit/New(var/_damaged = 0) - damaged = _damaged - ..() - -/obj/random/voidsuit/spawn_item() - var/list/suit_types = list( - "/space/void" = 2, - "/space/void/engineering" = 2, - "/space/void/mining" = 2, - "/space/void/medical" = 2.3, - "/space/void/security" = 1, - "/space/void/atmos" = 1.5, - "/space/void/merc" = 0.5, - "/space/void/captain" = 0.3 + var/list/suitmap = list( + /obj/item/clothing/suit/space/void = /obj/item/clothing/head/helmet/space/void, + /obj/item/clothing/suit/space/void/engineering = /obj/item/clothing/head/helmet/space/void/engineering, + /obj/item/clothing/suit/space/void/mining = /obj/item/clothing/head/helmet/space/void/mining, + /obj/item/clothing/suit/space/void/medical = /obj/item/clothing/head/helmet/space/void/medical, + /obj/item/clothing/suit/space/void/security = /obj/item/clothing/head/helmet/space/void/security, + /obj/item/clothing/suit/space/void/atmos = /obj/item/clothing/head/helmet/space/void/atmos, + /obj/item/clothing/suit/space/void/merc = /obj/item/clothing/head/helmet/space/void/merc, + /obj/item/clothing/suit/space/void/captain = /obj/item/clothing/head/helmet/space/void/merc ) - var/atom/L = src.loc - var/suffix = pickweight(suit_types) + problist = list( + /obj/item/clothing/suit/space/void = 2, + /obj/item/clothing/suit/space/void/engineering = 2, + /obj/item/clothing/suit/space/void/mining = 2, + /obj/item/clothing/suit/space/void/medical = 2.3, + /obj/item/clothing/suit/space/void/security = 1, + /obj/item/clothing/suit/space/void/atmos = 1.5, + /obj/item/clothing/suit/space/void/merc = 0.5, + /obj/item/clothing/suit/space/void/captain = 0.3 + ) + has_postspawn = TRUE - var/stype = "/obj/item/clothing/suit[suffix]" - var/htype = "/obj/item/clothing/head/helmet[suffix]" - var/obj/item/clothing/suit/space/newsuit = new stype(L) - new htype(L) - new /obj/item/clothing/shoes/magboots(L) - if (damaged && prob(60))//put some damage on it - var/damtype = pick(BRUTE,BURN) - var/amount = rand(1,5) - newsuit.create_breaches(damtype, amount) +/obj/random/voidsuit/New(loc, _damaged = 0) + damaged = _damaged + ..(loc) + +/obj/random/voidsuit/post_spawn(obj/item/clothing/suit/space/void/suit) + var/helmet = suitmap[suit.type] + if (helmet) + new helmet(loc) + else + log_debug("random_obj (voidsuit): Type [suit.type] was unable to spawn a matching helmet!") + new /obj/item/clothing/shoes/magboots(loc) + if (damaged && prob(60)) + suit.create_breaches(pick(BRUTE, BURN), rand(1, 5)) /obj/random/vendor + name = "random vendor" var/depleted = 0 - -/obj/random/vendor/New(var/_depleted = 0) - depleted = _depleted - ..() - -/obj/random/vendor/spawn_item() - var/list/options = list( - /obj/machinery/vending/boozeomat = 1, - /obj/machinery/vending/coffee = 1, - /obj/machinery/vending/snack = 1, - /obj/machinery/vending/cola = 1, - /obj/machinery/vending/cart = 1.5, - /obj/machinery/vending/cigarette = 1, - /obj/machinery/vending/medical = 1.2, - /obj/machinery/vending/phoronresearch = 0.7, - /obj/machinery/vending/security = 0.3, - /obj/machinery/vending/hydronutrients = 1, - /obj/machinery/vending/hydroseeds = 1, - /obj/machinery/vending/magivend = 0.5,//The things it dispenses are just costumes to non-wizards - /obj/machinery/vending/dinnerware = 1, - /obj/machinery/vending/sovietsoda = 2, - /obj/machinery/vending/tool = 1, - /obj/machinery/vending/engivend = 0.6, - /obj/machinery/vending/engineering = 1, - /obj/machinery/vending/robotics = 1 + problist = list( + /obj/machinery/vending/boozeomat = 1, + /obj/machinery/vending/coffee = 1, + /obj/machinery/vending/snack = 1, + /obj/machinery/vending/cola = 1, + /obj/machinery/vending/cart = 1.5, + /obj/machinery/vending/cigarette = 1, + /obj/machinery/vending/medical = 1.2, + /obj/machinery/vending/phoronresearch = 0.7, + /obj/machinery/vending/security = 0.3, + /obj/machinery/vending/hydronutrients = 1, + /obj/machinery/vending/hydroseeds = 1, + /obj/machinery/vending/magivend = 0.5, //The things it dispenses are just costumes to non-wizards + /obj/machinery/vending/dinnerware = 1, + /obj/machinery/vending/sovietsoda = 2, + /obj/machinery/vending/tool = 1, + /obj/machinery/vending/engivend = 0.6, + /obj/machinery/vending/engineering = 1, + /obj/machinery/vending/robotics = 1 ) - var/turf/L = get_turf(src) - var/type = pickweight(options) - var/obj/machinery/vending/V = new type(L) + has_postspawn = TRUE +/obj/random/vendor/New(loc, _depleted = 0) + depleted = _depleted + ..(loc) + +/obj/random/vendor/post_spawn(obj/machinery/vending/V) if (!depleted) return //Greatly reduce the contents. it will have 0-20% of what it usually has for (var/content in V.products) if (prob(40)) - V.products[content] = 0//40% chance to completely lose an item + V.products[content] = 0 //40% chance to completely lose an item else - var/multiplier = rand(0,20)//Else, we reduce it to a very low percentage + var/multiplier = rand(0,20) //Else, we reduce it to a very low percentage if (multiplier) multiplier /= 100 V.products[content] *= multiplier - if (V.products[content] < 1 && V.products[content] > 0)//But we'll usually have at least 1 left + if (V.products[content] < 1 && V.products[content] > 0) //But we'll usually have at least 1 left V.products[content] = 0 + // Clamp to an integer so we don't get 0.78 of a screwdriver. + V.products[content] = round(V.products[content]) /obj/random/pda_cart/item_to_spawn() var/list/options = typesof(/obj/item/weapon/cartridge) @@ -446,304 +475,291 @@ desc = "This is a random glowstick." icon = 'icons/obj/glowsticks.dmi' icon_state = "glowstick" - -/obj/random/glowstick/item_to_spawn() - return pick(/obj/item/device/flashlight/glowstick,\ - /obj/item/device/flashlight/glowstick/red,\ - /obj/item/device/flashlight/glowstick/blue,\ - /obj/item/device/flashlight/glowstick/orange,\ - /obj/item/device/flashlight/glowstick/yellow) + spawnlist = list( + /obj/item/device/flashlight/glowstick, + /obj/item/device/flashlight/glowstick/red, + /obj/item/device/flashlight/glowstick/blue, + /obj/item/device/flashlight/glowstick/orange, + /obj/item/device/flashlight/glowstick/yellow + ) /obj/random/booze name = "random alcoholic drink" desc = "This is a random alcoholic drink." icon = 'icons/obj/drinks.dmi' icon_state = "broken_bottle" - -/obj/random/booze/item_to_spawn() - return pick(/obj/item/weapon/reagent_containers/food/drinks/bottle/gin,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/rum,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/cognac,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/wine,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/pwine,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/brandy,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/guinnes,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/drambuie,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,\ - /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale) + spawnlist = list( + /obj/item/weapon/reagent_containers/food/drinks/bottle/gin, + /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, + /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka, + /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla, + /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing, + /obj/item/weapon/reagent_containers/food/drinks/bottle/rum, + /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth, + /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua, + /obj/item/weapon/reagent_containers/food/drinks/bottle/cognac, + /obj/item/weapon/reagent_containers/food/drinks/bottle/wine, + /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe, + /obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor, + /obj/item/weapon/reagent_containers/food/drinks/bottle/pwine, + /obj/item/weapon/reagent_containers/food/drinks/bottle/brandy, + /obj/item/weapon/reagent_containers/food/drinks/bottle/guinnes, + /obj/item/weapon/reagent_containers/food/drinks/bottle/drambuie, + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer, + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale + ) /obj/random/melee name = "random melee weapon" desc = "This is a random melee weapon." icon = 'icons/obj/weapons.dmi' icon_state = "baton" - -/obj/random/melee/item_to_spawn() - return pick(/obj/item/weapon/melee/telebaton,\ - /obj/item/weapon/melee/energy/sword,\ - /obj/item/weapon/melee/energy/sword/pirate,\ - /obj/item/weapon/melee/energy/glaive,\ - /obj/item/weapon/melee/chainsword,\ - /obj/item/weapon/melee/baton/stunrod,\ - /obj/item/weapon/material/harpoon,\ - /obj/item/weapon/material/twohanded/spear/plasteel,\ - /obj/item/weapon/material/sword/trench,\ - /obj/item/weapon/material/sword/rapier,\ - /obj/item/weapon/melee/hammer,\ - /obj/item/weapon/material/twohanded/fireaxe,\ - /obj/item/weapon/melee/classic_baton) + spawnlist = list( + /obj/item/weapon/melee/telebaton, + /obj/item/weapon/melee/energy/sword, + /obj/item/weapon/melee/energy/sword/pirate, + /obj/item/weapon/melee/energy/glaive, + /obj/item/weapon/melee/chainsword, + /obj/item/weapon/melee/baton/stunrod, + /obj/item/weapon/material/harpoon, + /obj/item/weapon/material/twohanded/spear/plasteel, + /obj/item/weapon/material/sword/trench, + /obj/item/weapon/material/sword/rapier, + /obj/item/weapon/melee/hammer, + /obj/item/weapon/material/twohanded/fireaxe, + /obj/item/weapon/melee/classic_baton + ) /obj/random/coin name = "random coin" desc = "This is a random coin." icon = 'icons/obj/items.dmi' icon_state = "coin" - -/obj/random/coin/item_to_spawn() - var/list/coin = list(/obj/item/weapon/coin/iron = 5, - /obj/item/weapon/coin/silver = 3, - /obj/item/weapon/coin/gold = 0.7, - /obj/item/weapon/coin/phoron = 0.5, - /obj/item/weapon/coin/uranium = 0.5, - /obj/item/weapon/coin/platinum = 0.2, - /obj/item/weapon/coin/diamond = 0.1 + problist = list( + /obj/item/weapon/coin/silver = 3, + /obj/item/weapon/coin/gold = 0.7, + /obj/item/weapon/coin/phoron = 0.5, + /obj/item/weapon/coin/uranium = 0.5, + /obj/item/weapon/coin/platinum = 0.2, + /obj/item/weapon/coin/diamond = 0.1 ) - return pickweight(coin) /obj/random/energy_antag name = "random energy weapon" desc = "This is a random energy weapon." icon = 'icons/obj/gun.dmi' icon_state = "retro100" - -/obj/random/energy_antag/item_to_spawn() - - return pick(/obj/item/weapon/gun/energy/retro,\ - /obj/item/weapon/gun/energy/xray,\ - /obj/item/weapon/gun/energy/gun,\ - /obj/item/weapon/gun/energy/pistol,\ - /obj/item/weapon/gun/energy/rifle,\ - /obj/item/weapon/gun/energy/mindflayer,\ - /obj/item/weapon/gun/energy/toxgun,\ - /obj/item/weapon/gun/energy/vaurca/gatlinglaser,\ - /obj/item/weapon/gun/energy/vaurca/blaster,\ - /obj/item/weapon/gun/energy/crossbow/largecrossbow,\ - /obj/item/weapon/gun/energy/rifle/laser/xray) + spawnlist = list( + /obj/item/weapon/gun/energy/retro, + /obj/item/weapon/gun/energy/xray, + /obj/item/weapon/gun/energy/gun, + /obj/item/weapon/gun/energy/pistol, + /obj/item/weapon/gun/energy/rifle, + /obj/item/weapon/gun/energy/mindflayer, + /obj/item/weapon/gun/energy/toxgun, + /obj/item/weapon/gun/energy/vaurca/gatlinglaser, + /obj/item/weapon/gun/energy/vaurca/blaster, + /obj/item/weapon/gun/energy/crossbow/largecrossbow, + /obj/item/weapon/gun/energy/rifle/laser/xray + ) /obj/random/colored_jumpsuit name = "random colored jumpsuit" desc = "This is a random colowerd jumpsuit." icon = 'icons/obj/clothing/uniforms.dmi' icon_state = "black" - -/obj/random/colored_jumpsuit/item_to_spawn() - - return pick(/obj/item/clothing/under/color/black,\ - /obj/item/clothing/under/color/blackf,\ - /obj/item/clothing/under/color/blue,\ - /obj/item/clothing/under/color/green,\ - /obj/item/clothing/under/color/grey,\ - /obj/item/clothing/under/color/orange,\ - /obj/item/clothing/under/color/pink,\ - /obj/item/clothing/under/color/red,\ - /obj/item/clothing/under/color/white,\ - /obj/item/clothing/under/color/yellow,\ - /obj/item/clothing/under/lightblue,\ - /obj/item/clothing/under/aqua,\ - /obj/item/clothing/under/purple,\ - /obj/item/clothing/under/lightpurple,\ - /obj/item/clothing/under/lightgreen,\ - /obj/item/clothing/under/lightbrown,\ - /obj/item/clothing/under/brown,\ - /obj/item/clothing/under/yellowgreen,\ - /obj/item/clothing/under/darkblue,\ - /obj/item/clothing/under/lightred,\ - /obj/item/clothing/under/darkred) + spawnlist = list( + /obj/item/clothing/under/color/black, + /obj/item/clothing/under/color/blackf, + /obj/item/clothing/under/color/blue, + /obj/item/clothing/under/color/green, + /obj/item/clothing/under/color/grey, + /obj/item/clothing/under/color/orange, + /obj/item/clothing/under/color/pink, + /obj/item/clothing/under/color/red, + /obj/item/clothing/under/color/white, + /obj/item/clothing/under/color/yellow, + /obj/item/clothing/under/lightblue, + /obj/item/clothing/under/aqua, + /obj/item/clothing/under/purple, + /obj/item/clothing/under/lightpurple, + /obj/item/clothing/under/lightgreen, + /obj/item/clothing/under/lightbrown, + /obj/item/clothing/under/brown, + /obj/item/clothing/under/yellowgreen, + /obj/item/clothing/under/darkblue, + /obj/item/clothing/under/lightred, + /obj/item/clothing/under/darkred + ) /obj/random/loot name = "random maintenance loot items" desc = "Stuff for the maint-dwellers." icon = 'icons/obj/items.dmi' icon_state = "gift3" - spawn_nothing_percentage = 5 - -/obj/random/loot/item_to_spawn() - - var/list/maint = list(/obj/item/clothing/glasses/meson = 1, - /obj/item/clothing/glasses/meson/prescription = 0.7, - /obj/item/clothing/glasses/material = 0.8, - /obj/item/clothing/glasses/sunglasses = 1.5, - /obj/item/clothing/glasses/welding = 1.2, - /obj/item/clothing/under/captain_fly = 0.5, - /obj/item/clothing/under/rank/mailman = 0.6, - /obj/item/clothing/under/rank/vice = 0.8, - /obj/item/clothing/under/assistantformal = 1, - /obj/item/clothing/under/rainbow = 0.9, - /obj/item/clothing/under/overalls = 1, - /obj/item/clothing/under/redcoat = 0.5, - /obj/item/clothing/under/serviceoveralls = 1, - /obj/item/clothing/under/psyche = 0.5, - /obj/item/clothing/under/rank/dispatch = 0.8, - /obj/item/clothing/under/syndicate/tacticool = 1, - /obj/item/clothing/under/syndicate/tracksuit = 0.2, - /obj/item/clothing/under/rank/clown = 0.1, - /obj/item/clothing/under/mime = 0.1, - /obj/item/clothing/accessory/badge = 0.2, - /obj/item/clothing/accessory/badge/old = 0.2, - /obj/item/clothing/accessory/storage/webbing = 0.6, - /obj/item/clothing/accessory/storage/knifeharness = 0.3, - /obj/item/clothing/head/collectable/petehat = 0.3, - /obj/item/clothing/head/hardhat = 1.2, - /obj/item/clothing/head/redcoat = 0.4, - /obj/item/clothing/head/syndicatefake = 0.5, - /obj/item/clothing/head/richard = 0.3, - /obj/item/clothing/head/soft/rainbow = 0.7, - /obj/item/clothing/head/plaguedoctorhat = 0.5, - /obj/item/clothing/head/cueball = 0.5, - /obj/item/clothing/head/pirate = 0.4, - /obj/item/clothing/head/bearpelt = 0.4, - /obj/item/clothing/head/witchwig = 0.5, - /obj/item/clothing/head/pumpkinhead = 0.6, - /obj/item/clothing/head/kitty = 0.2, - /obj/item/clothing/head/ushanka = 0.6, - /obj/item/clothing/head/helmet/augment = 0.1, - /obj/item/clothing/mask/balaclava = 1, - /obj/item/clothing/mask/gas = 1.5, - /obj/item/clothing/mask/gas/cyborg = 0.7, - /obj/item/clothing/mask/gas/owl_mask = 0.8, - /obj/item/clothing/mask/gas/syndicate = 0.4, - /obj/item/clothing/mask/fakemoustache = 0.4, - /obj/item/clothing/mask/horsehead = 0.9, - /obj/item/clothing/mask/gas/clown_hat = 0.1, - /obj/item/clothing/mask/gas/mime = 0.1, - /obj/item/clothing/shoes/rainbow = 1, - /obj/item/clothing/shoes/jackboots = 1, - /obj/item/clothing/shoes/workboots = 1, - /obj/item/clothing/shoes/cyborg = 0.4, - /obj/item/clothing/shoes/galoshes = 0.6, - /obj/item/clothing/shoes/slippers_worn = 0.5, - /obj/item/clothing/shoes/combat = 0.2, - /obj/item/clothing/shoes/clown_shoes = 0.1, - /obj/item/clothing/suit/storage/hazardvest = 1, - /obj/item/clothing/suit/storage/leather_jacket/nanotrasen = 0.7, - /obj/item/clothing/suit/ianshirt = 0.5, - /obj/item/clothing/suit/syndicatefake = 0.6, - /obj/item/clothing/suit/imperium_monk = 0.4, - /obj/item/clothing/suit/storage/vest = 0.2, - /obj/item/clothing/gloves/black = 1, - /obj/item/clothing/gloves/fyellow = 1.2, - /obj/item/clothing/gloves/yellow = 0.9, - /obj/item/clothing/gloves/watch = 0.3, - /obj/item/clothing/gloves/boxing = 0.3, - /obj/item/clothing/gloves/boxing/green = 0.3, - /obj/item/clothing/gloves/botanic_leather = 0.7, - /obj/item/clothing/gloves/combat = 0.2, - /obj/item/toy/bosunwhistle = 0.5, - /obj/item/toy/balloon = 0.4, - /obj/item/weapon/haircomb = 0.5, - /obj/item/weapon/lipstick = 0.6, - /obj/item/weapon/material/knife/hook = 0.3, - /obj/item/weapon/material/hatchet/tacknife = 0.4, - /obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 1.2, - /obj/item/weapon/storage/bag/plasticbag = 1, - /obj/item/weapon/extinguisher = 1.3, - /obj/item/weapon/extinguisher/mini = 0.9, - /obj/item/device/flashlight = 1, - /obj/item/device/flashlight/heavy = 0.5, - /obj/item/device/flashlight/maglight = 0.4, - /obj/item/device/flashlight/flare = 0.5, - /obj/item/device/flashlight/lantern = 0.4, - /obj/item/device/taperecorder = 0.6, - /obj/item/weapon/reagent_containers/food/drinks/teapot = 0.4, - /obj/item/weapon/reagent_containers/food/drinks/flask/shiny = 0.3, - /obj/item/weapon/reagent_containers/food/drinks/flask/lithium = 0.3, - /obj/item/bodybag = 0.7, - /obj/item/weapon/reagent_containers/spray/cleaner = 0.6, - /obj/item/weapon/tank/emergency_oxygen = 0.7, - /obj/item/weapon/tank/emergency_oxygen/double = 0.4, - /obj/item/clothing/mask/smokable/pipe/cobpipe = 0.5, - /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba = 0.7, - /obj/item/weapon/flame/lighter = 0.9, - /obj/item/weapon/flame/lighter/zippo = 0.7, - /obj/item/device/gps/engineering = 0.6, - /obj/item/device/megaphone = 0.5, - /obj/item/device/floor_painter = 0.6, - /obj/random/toolbox = 1, - /obj/random/coin = 1.2, - /obj/random/tech_supply = 1.2, - /obj/random/powercell = 0.8, - /obj/random/colored_jumpsuit = 0.7, - /obj/random/booze = 1.1, - /obj/random/belt = 0.9, - /obj/random/backpack = 0.7, - /obj/random/contraband = 0.9, - /obj/random/firstaid = 0.4, - /obj/random/medical = 0.4, - /obj/random/glowstick = 0.7, - /obj/item/weapon/caution/cone = 0.7, - /obj/item/weapon/staff/broom = 0.5, - /obj/item/weapon/soap = 0.4, - /obj/item/weapon/storage/box/donkpockets = 0.6, - /obj/item/weapon/contraband/poster = 1.3, - /obj/item/device/magnetic_lock/security = 0.3, - /obj/item/device/magnetic_lock/engineering = 0.3, - /obj/item/weapon/shovel = 0.5, - /obj/item/weapon/pickaxe = 0.4, - /obj/item/weapon/inflatable_duck = 0.2, - /obj/random/hoodie = 0.5 + problist = list( + /obj/item/clothing/glasses/meson = 1, + /obj/item/clothing/glasses/meson/prescription = 0.7, + /obj/item/clothing/glasses/material = 0.8, + /obj/item/clothing/glasses/sunglasses = 1.5, + /obj/item/clothing/glasses/welding = 1.2, + /obj/item/clothing/under/captain_fly = 0.5, + /obj/item/clothing/under/rank/mailman = 0.6, + /obj/item/clothing/under/rank/vice = 0.8, + /obj/item/clothing/under/assistantformal = 1, + /obj/item/clothing/under/rainbow = 0.9, + /obj/item/clothing/under/overalls = 1, + /obj/item/clothing/under/redcoat = 0.5, + /obj/item/clothing/under/serviceoveralls = 1, + /obj/item/clothing/under/psyche = 0.5, + /obj/item/clothing/under/rank/dispatch = 0.8, + /obj/item/clothing/under/syndicate/tacticool = 1, + /obj/item/clothing/under/syndicate/tracksuit = 0.2, + /obj/item/clothing/under/rank/clown = 0.1, + /obj/item/clothing/under/mime = 0.1, + /obj/item/clothing/accessory/badge = 0.2, + /obj/item/clothing/accessory/badge/old = 0.2, + /obj/item/clothing/accessory/storage/webbing = 0.6, + /obj/item/clothing/accessory/storage/knifeharness = 0.3, + /obj/item/clothing/head/collectable/petehat = 0.3, + /obj/item/clothing/head/hardhat = 1.2, + /obj/item/clothing/head/redcoat = 0.4, + /obj/item/clothing/head/syndicatefake = 0.5, + /obj/item/clothing/head/richard = 0.3, + /obj/item/clothing/head/soft/rainbow = 0.7, + /obj/item/clothing/head/plaguedoctorhat = 0.5, + /obj/item/clothing/head/cueball = 0.5, + /obj/item/clothing/head/pirate = 0.4, + /obj/item/clothing/head/bearpelt = 0.4, + /obj/item/clothing/head/witchwig = 0.5, + /obj/item/clothing/head/pumpkinhead = 0.6, + /obj/item/clothing/head/kitty = 0.2, + /obj/item/clothing/head/ushanka = 0.6, + /obj/item/clothing/head/helmet/augment = 0.1, + /obj/item/clothing/mask/balaclava = 1, + /obj/item/clothing/mask/gas = 1.5, + /obj/item/clothing/mask/gas/cyborg = 0.7, + /obj/item/clothing/mask/gas/owl_mask = 0.8, + /obj/item/clothing/mask/gas/syndicate = 0.4, + /obj/item/clothing/mask/fakemoustache = 0.4, + /obj/item/clothing/mask/horsehead = 0.9, + /obj/item/clothing/mask/gas/clown_hat = 0.1, + /obj/item/clothing/mask/gas/mime = 0.1, + /obj/item/clothing/shoes/rainbow = 1, + /obj/item/clothing/shoes/jackboots = 1, + /obj/item/clothing/shoes/workboots = 1, + /obj/item/clothing/shoes/cyborg = 0.4, + /obj/item/clothing/shoes/galoshes = 0.6, + /obj/item/clothing/shoes/slippers_worn = 0.5, + /obj/item/clothing/shoes/combat = 0.2, + /obj/item/clothing/shoes/clown_shoes = 0.1, + /obj/item/clothing/suit/storage/hazardvest = 1, + /obj/item/clothing/suit/storage/leather_jacket/nanotrasen = 0.7, + /obj/item/clothing/suit/ianshirt = 0.5, + /obj/item/clothing/suit/syndicatefake = 0.6, + /obj/item/clothing/suit/imperium_monk = 0.4, + /obj/item/clothing/suit/storage/vest = 0.2, + /obj/item/clothing/gloves/black = 1, + /obj/item/clothing/gloves/fyellow = 1.2, + /obj/item/clothing/gloves/yellow = 0.9, + /obj/item/clothing/gloves/watch = 0.3, + /obj/item/clothing/gloves/boxing = 0.3, + /obj/item/clothing/gloves/boxing/green = 0.3, + /obj/item/clothing/gloves/botanic_leather = 0.7, + /obj/item/clothing/gloves/combat = 0.2, + /obj/item/toy/bosunwhistle = 0.5, + /obj/item/toy/balloon = 0.4, + /obj/item/weapon/haircomb = 0.5, + /obj/item/weapon/lipstick = 0.6, + /obj/item/weapon/material/knife/hook = 0.3, + /obj/item/weapon/material/hatchet/tacknife = 0.4, + /obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 1.2, + /obj/item/weapon/storage/bag/plasticbag = 1, + /obj/item/weapon/extinguisher = 1.3, + /obj/item/weapon/extinguisher/mini = 0.9, + /obj/item/device/flashlight = 1, + /obj/item/device/flashlight/heavy = 0.5, + /obj/item/device/flashlight/maglight = 0.4, + /obj/item/device/flashlight/flare = 0.5, + /obj/item/device/flashlight/lantern = 0.4, + /obj/item/device/taperecorder = 0.6, + /obj/item/weapon/reagent_containers/food/drinks/teapot = 0.4, + /obj/item/weapon/reagent_containers/food/drinks/flask/shiny = 0.3, + /obj/item/weapon/reagent_containers/food/drinks/flask/lithium = 0.3, + /obj/item/bodybag = 0.7, + /obj/item/weapon/reagent_containers/spray/cleaner = 0.6, + /obj/item/weapon/tank/emergency_oxygen = 0.7, + /obj/item/weapon/tank/emergency_oxygen/double = 0.4, + /obj/item/clothing/mask/smokable/pipe/cobpipe = 0.5, + /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba = 0.7, + /obj/item/weapon/flame/lighter = 0.9, + /obj/item/weapon/flame/lighter/zippo = 0.7, + /obj/item/device/gps/engineering = 0.6, + /obj/item/device/megaphone = 0.5, + /obj/item/device/floor_painter = 0.6, + /obj/random/toolbox = 1, + /obj/random/coin = 1.2, + /obj/random/tech_supply = 1.2, + /obj/random/powercell = 0.8, + /obj/random/colored_jumpsuit = 0.7, + /obj/random/booze = 1.1, + /obj/random/belt = 0.9, + /obj/random/backpack = 0.7, + /obj/random/contraband = 0.9, + /obj/random/firstaid = 0.4, + /obj/random/medical = 0.4, + /obj/random/glowstick = 0.7, + /obj/item/weapon/caution/cone = 0.7, + /obj/item/weapon/staff/broom = 0.5, + /obj/item/weapon/soap = 0.4, + /obj/item/weapon/storage/box/donkpockets = 0.6, + /obj/item/weapon/contraband/poster = 1.3, + /obj/item/device/magnetic_lock/security = 0.3, + /obj/item/device/magnetic_lock/engineering = 0.3, + /obj/item/weapon/shovel = 0.5, + /obj/item/weapon/pickaxe = 0.4, + /obj/item/weapon/inflatable_duck = 0.2, + /obj/random/hoodie = 0.5 ) - return pickweight(maint) /obj/random/hoodie name = "random winter coat" desc = "This is a random winter coat." icon = 'icons/obj/hoodies.dmi' icon_state = "coatwinter" - -/obj/random/hoodie/item_to_spawn() - var/list/hoodie = list(/obj/item/clothing/suit/storage/hooded/wintercoat = 5, - /obj/item/clothing/suit/storage/hooded/wintercoat/engineering = 3, - /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos = 3, - /obj/item/clothing/suit/storage/hooded/wintercoat/medical = 3, - /obj/item/clothing/suit/storage/hooded/wintercoat/science = 3, - /obj/item/clothing/suit/storage/hooded/wintercoat/hydro = 3, - /obj/item/clothing/suit/storage/hooded/wintercoat/cargo = 3, - /obj/item/clothing/suit/storage/hooded/wintercoat/miner = 3, - /obj/item/clothing/suit/storage/hooded/wintercoat/security = 2, - /obj/item/clothing/suit/storage/hooded/wintercoat/captain = 1 + problist = list( + /obj/item/clothing/suit/storage/hooded/wintercoat = 5, + /obj/item/clothing/suit/storage/hooded/wintercoat/engineering = 3, + /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos = 3, + /obj/item/clothing/suit/storage/hooded/wintercoat/medical = 3, + /obj/item/clothing/suit/storage/hooded/wintercoat/science = 3, + /obj/item/clothing/suit/storage/hooded/wintercoat/hydro = 3, + /obj/item/clothing/suit/storage/hooded/wintercoat/cargo = 3, + /obj/item/clothing/suit/storage/hooded/wintercoat/miner = 3, + /obj/item/clothing/suit/storage/hooded/wintercoat/security = 2, + /obj/item/clothing/suit/storage/hooded/wintercoat/captain = 1 ) - return pickweight(hoodie) /obj/random/highvalue name = "random high valuable item" desc = "This is a random high valuable item." icon = 'icons/obj/items.dmi' icon_state = "coin_diamond" - -/obj/random/highvalue/item_to_spawn() - var/list/highvalue = list(/obj/item/bluespace_crystal = 7, - /obj/item/weapon/storage/secure/briefcase/money = 5, - /obj/item/stack/telecrystal{amount = 10} = 7, - /obj/item/clothing/suit/armor/reactive = 0.5, - /obj/item/clothing/glasses/thermal = 0.5, - /obj/item/weapon/gun/projectile/automatic/rifle/shotgun = 0.5, - /obj/item/weapon/material/sword/rapier = 0.5, - /obj/item/weapon/gun/energy/lawgiver = 0.5, - /obj/item/weapon/melee/energy/axe = 0.5, - /obj/item/weapon/gun/projectile/automatic/terminator = 0.5, - /obj/item/weapon/rig/military = 0.5, - /obj/item/weapon/rig/unathi/fancy = 0.5, - /obj/item/clothing/mask/ai = 0.5 + problist = list( + /obj/item/bluespace_crystal = 7, + /obj/item/weapon/storage/secure/briefcase/money = 5, + /obj/item/stack/telecrystal{amount = 10} = 7, + /obj/item/clothing/suit/armor/reactive = 0.5, + /obj/item/clothing/glasses/thermal = 0.5, + /obj/item/weapon/gun/projectile/automatic/rifle/shotgun = 0.5, + /obj/item/weapon/material/sword/rapier = 0.5, + /obj/item/weapon/gun/energy/lawgiver = 0.5, + /obj/item/weapon/melee/energy/axe = 0.5, + /obj/item/weapon/gun/projectile/automatic/terminator = 0.5, + /obj/item/weapon/rig/military = 0.5, + /obj/item/weapon/rig/unathi/fancy = 0.5, + /obj/item/clothing/mask/ai = 0.5 ) - return pickweight(highvalue) /obj/random/junk name = "random trash" @@ -751,10 +767,7 @@ icon = 'icons/obj/trash.dmi' icon_state = "koisbar" spawn_nothing_percentage = 5 - -/obj/random/junk/item_to_spawn() - - var/list/junk = list(/obj/item/trash/koisbar = 0.5, + problist = list(/obj/item/trash/koisbar = 0.5, /obj/item/trash/raisins = 1, /obj/item/trash/candy = 1, /obj/item/trash/cheesie = 2, @@ -797,8 +810,6 @@ /obj/item/ammo_casing/c45/flash = 0.5, /obj/item/ammo_casing/shotgun/beanbag = 0.5) - return pickweight(junk) - //Sometimes the chef will have spare oil in storage. //Sometimes they wont, and will need to order it from cargo //Variety is the spice of life! @@ -808,6 +819,6 @@ icon = 'icons/obj/objects.dmi' icon_state = "oiltank" spawn_nothing_percentage = 50 - -/obj/random/cookingoil/item_to_spawn() - return /obj/structure/reagent_dispensers/cookingoil + spawnlist = list( + /obj/structure/reagent_dispensers/cookingoil + ) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index b2d87bb5760..1da283fae05 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -216,8 +216,37 @@ new /obj/item/clothing/head/beret/sec/warden(src) new /obj/item/clothing/accessory/badge/warden(src) new /obj/item/ammo_magazine/c45m/rubber(src) + new /obj/item/weapon/storage/box/ids(src) return +/obj/structure/closet/secure_closet/security_cadet + name = "security cadet's locker" + req_access = list(access_security) + icon_state = "seccadet1" + icon_closed = "seccadet" + icon_locked = "seccadet1" + icon_opened = "seccadetopen" + icon_broken = "seccadetbroken" + icon_off = "seccadetoff" + + New() + ..() + if(prob(50)) + new /obj/item/weapon/storage/backpack/security(src) + else + new /obj/item/weapon/storage/backpack/satchel_sec(src) + new /obj/item/device/radio/headset/headset_sec(src) + new /obj/item/weapon/storage/belt/security(src) + new /obj/item/device/flash(src) + new /obj/item/weapon/reagent_containers/spray/pepper(src) + new /obj/item/taperoll/police(src) + new /obj/item/device/hailer(src) + new /obj/item/clothing/accessory/storage/black_vest(src) + new /obj/item/clothing/head/beret/sec(src) + new /obj/item/clothing/under/rank/security2(src) + new /obj/item/device/holowarrant(src) + new /obj/item/device/flashlight/flare(src) + return /obj/structure/closet/secure_closet/security @@ -236,13 +265,13 @@ new /obj/item/weapon/storage/backpack/security(src) else new /obj/item/weapon/storage/backpack/satchel_sec(src) + new /obj/random/handgun(src) new /obj/item/clothing/suit/storage/vest/officer(src) new /obj/item/clothing/head/helmet(src) new /obj/item/device/radio/headset/headset_sec(src) new /obj/item/weapon/storage/belt/security(src) new /obj/item/device/flash(src) new /obj/item/weapon/reagent_containers/spray/pepper(src) - new /obj/item/weapon/grenade/flashbang(src) new /obj/item/weapon/melee/baton/loaded(src) new /obj/item/clothing/glasses/sunglasses/sechud(src) new /obj/item/taperoll/police(src) @@ -253,6 +282,7 @@ new /obj/item/weapon/gun/energy/taser(src) new /obj/item/ammo_magazine/c45m/rubber(src) new /obj/item/device/holowarrant(src) + new /obj/item/device/flashlight/flare(src) return diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 0778246a81c..bfec020bab2 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -212,17 +212,22 @@ src.state = 0 else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.") - - if(do_after(user, 40)) - if(!src) return - user.drop_item() - W.loc = src - user << "You installed the airlock electronics!" - src.state = 2 - src.name = "Near finished Airlock Assembly" - src.electronics = W + var/obj/item/weapon/airlock_electronics/EL = W + if(!EL.inuse) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) + user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.") + EL.inuse = 1 + if(do_after(user, 40)) + EL.inuse = 0 + if(!src) return + user.drop_item() + EL.forceMove(src) + user << "You installed the airlock electronics!" + src.state = 2 + src.name = "Near finished Airlock Assembly" + src.electronics = EL + else + EL.inuse = 0 else if(istype(W, /obj/item/weapon/crowbar) && state == 2 ) //This should never happen, but just in case I guess diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 2bcbf8aa878..76ea627eac8 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -168,7 +168,7 @@ pulling.attack_log += "\[[time_stamp()]\] Crashed [occupant.name]'s ([occupant.ckey]) [name] into \a [A]" occupant.attack_log += "\[[time_stamp()]\] Thrusted into \a [A] by [pulling.name] ([pulling.ckey]) with \the [name]" - msg_admin_attack("[pulling.name] ([pulling.ckey]) has thrusted [occupant.name]'s ([occupant.ckey]) [name] into \a [A] (JMP)") + msg_admin_attack("[pulling.name] ([pulling.ckey]) has thrusted [occupant.name]'s ([occupant.ckey]) [name] into \a [A] (JMP)",ckey=key_name(pulling),ckey_target=key_name(occupant)) else occupant.visible_message("[occupant] crashed into \the [A]!") diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 0b278903a74..83676aeb43d 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -167,19 +167,21 @@ obj/structure/windoor_assembly/Destroy() //Adding airlock electronics for access. Step 6 complete. else if(istype(W, /obj/item/weapon/airlock_electronics) && W:icon_state != "door_electronics_smoked") - playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.") - - if(do_after(user, 40)) - if(!src) return - - user.drop_item() - W.loc = src - user << "You've installed the airlock electronics!" - src.name = "Near finished Windoor Assembly" - src.electronics = W - else - W.loc = src.loc + var/obj/item/weapon/airlock_electronics/EL = W + if(!EL.inuse) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) + user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.") + EL.inuse = 1 + if(do_after(user, 40)) + EL.inuse = 0 + if(!src) return + user.drop_item() + EL.forceMove(src) + user << "You've installed the airlock electronics!" + src.name = "Near finished Windoor Assembly" + src.electronics = EL + else + EL.inuse = 0 //Screwdriver to remove airlock electronics. Step 6 undone. else if(istype(W, /obj/item/weapon/screwdriver) && src.electronics) diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 0cd466d75a3..2d7121ae1e1 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -34,7 +34,7 @@ var/can_call_ert return message_admins("[key_name_admin(usr)] is dispatching an Emergency Response Team.", 1) - log_admin("[key_name(usr)] used Dispatch Response Team.") + log_admin("[key_name(usr)] used Dispatch Response Team.",admin_key=key_name(usr)) trigger_armed_response_team(1) client/verb/JoinResponseTeam() diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 331d10b3e5e..52548a852cb 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -70,6 +70,7 @@ . = W recalc_atom_opacity() + lighting_overlay = old_lighting_overlay affecting_lights = old_affecting_lights corners = old_corners @@ -103,3 +104,4 @@ src.air.copy_from(other.zone.air) other.zone.remove(other) return 1 + diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 867d73d0408..4b72efafe33 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -33,11 +33,11 @@ return if(findtext(msg, "byond://")) src << "Advertising other servers is not allowed." - log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") + log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]",ckey=key_name(src)) message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return - log_ooc("[mob.name]/[key] : [msg]") + log_ooc("[mob.name]/[key] : [msg]",ckey=key_name(mob)) var/ooc_style = "everyone" if(holder && !holder.fakekey) @@ -104,11 +104,11 @@ return if(findtext(msg, "byond://")) src << "Advertising other servers is not allowed." - log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") + log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]",ckey=key_name(src)) message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return - log_ooc("(LOCAL) [mob.name]/[key] : [msg]") + log_ooc("(LOCAL) [mob.name]/[key] : [msg]",ckey=key_name(mob)) var/mob/source = src.mob var/list/messageturfs = list()//List of turfs we broadcast to. diff --git a/code/global.dm b/code/global.dm index 700bdc2717b..e6df2ff77f1 100644 --- a/code/global.dm +++ b/code/global.dm @@ -17,6 +17,8 @@ var/global/list/sec_hud_users = list() // List of all entities using var/global/list/hud_icon_reference = list() var/global/list/janitorial_supplies = list() // List of all the janitorial supplies on the map that the PDA cart may be tracking. +var/global/list/listening_objects = list() // List of objects that need to be able to hear, used to avoid recursive searching through contents. + var/global/list/global_mutations = list() // List of hidden mutation things. diff --git a/code/modules/admin/DB ban/ban_mirroring.dm b/code/modules/admin/DB ban/ban_mirroring.dm index 961ac952cf1..34a2bf36a98 100644 --- a/code/modules/admin/DB ban/ban_mirroring.dm +++ b/code/modules/admin/DB ban/ban_mirroring.dm @@ -139,6 +139,10 @@ if (!conn_info || !conn_info.len) return + else if (conn_info.len > 100) + log_debug("MIRROR BANS: [C.ckey] has [conn_info.len] unique sets. They were dropped and not processed.") + update_connection_data(C) + return var/ding_bannu = 0 var/new_info = BAD_CKEY|BAD_IP|BAD_CID diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index ab4a7e45539..2b6fc5ce406 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -6,13 +6,13 @@ world/IsBanned(key,address,computer_id) //Guest Checking if(!config.guests_allowed && IsGuestKey(key)) - log_access("Failed Login: [key] - Guests not allowed") + log_access("Failed Login: [key] - Guests not allowed",ckey=key_name(key)) message_admins("\blue Failed Login: [key] - Guests not allowed") return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a byond account.") //check if the IP address is a known TOR node if(config && config.ToRban && ToRban_isbanned(address)) - log_access("Failed Login: [src] - Banned: ToR") + log_access("Failed Login: [src] - Banned: ToR",ckey=key_name(src)) message_admins("\blue Failed Login: [src] - Banned: ToR") //ban their computer_id and ckey for posterity AddBan(ckey(key), computer_id, "Use of ToR", "Automated Ban", 0, 0) @@ -24,7 +24,7 @@ world/IsBanned(key,address,computer_id) //Ban Checking . = CheckBan( ckey(key), computer_id, address ) if(.) - log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]") + log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]",ckey=key_name(key)) message_admins("\blue Failed Login: [key] id:[computer_id] ip:[address] - Banned [.["reason"]]") return . @@ -33,12 +33,12 @@ world/IsBanned(key,address,computer_id) else if (!address) - log_access("Failed Login: [key] null-[computer_id] - Denied access: No IP address broadcast.") + log_access("Failed Login: [key] null-[computer_id] - Denied access: No IP address broadcast.",ckey=key_name(key)) message_admins("[key] tried to connect without an IP address.") return list("reason" = "Temporary ban", "desc" = "Your connection did not broadcast an IP address to check.") if (!computer_id) - log_access("Failed Login: [key] [address]-null - Denied access: No computer ID broadcast.") + log_access("Failed Login: [key] [address]-null - Denied access: No computer ID broadcast.",ckey=key_name(key)) message_admins("[key] tried to connect without a computer ID.") return list("reason" = "Temporary ban", "desc" = "Your connection did not broadcast an computer ID to check.") diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 035b2d23096..0402c4ef469 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -133,11 +133,11 @@ var/savefile/Banlist if (!Banlist.dir.Remove(foldername)) return 0 if(!usr) - log_admin("Ban Expired: [key]") + log_admin("Ban Expired: [key]",ckey=key) message_admins("Ban Expired: [key]") else ban_unban_log_save("[key_name_admin(usr)] unbanned [key]") - log_admin("[key_name_admin(usr)] unbanned [key]") + log_admin("[key_name_admin(usr)] unbanned [key]",admin_key=key_name(usr),ckey=key) message_admins("[key_name_admin(usr)] unbanned: [key]") feedback_inc("ban_unban",1) usr.client.holder.DB_ban_unban( ckey(key), BANTYPE_ANY_FULLBAN) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 69bfe380c65..4c04aab7ff4 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -6,13 +6,12 @@ var/global/floorIsLava = 0 //////////////////////////////// /proc/message_admins(var/msg) msg = "ADMIN LOG: [msg]" - log_adminwarn(msg) for(var/client/C in admins) if((R_ADMIN|R_MOD) & C.holder.rights) C << msg -/proc/msg_admin_attack(var/text) //Toggleable Attack Messages - log_attack(text) +/proc/msg_admin_attack(var/text,var/ckey="",var/ckey_target="") //Toggleable Attack Messages + log_attack(text,ckey=ckey,ckey_target=ckey_target) var/rendered = "ATTACK: [text]" for(var/client/C in admins) if((R_ADMIN|R_MOD) & C.holder.rights) diff --git a/code/modules/admin/admin_attack_log.dm b/code/modules/admin/admin_attack_log.dm index dd49331a7e0..31f1ffc511b 100644 --- a/code/modules/admin/admin_attack_log.dm +++ b/code/modules/admin/admin_attack_log.dm @@ -27,7 +27,7 @@ proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, va if(attacker) attacker.attack_log += text("\[[time_stamp()]\] [key_name(victim)] - [attacker_message]") - msg_admin_attack("[key_name(attacker)] [admin_message] [key_name(victim)] (INTENT: [attacker? uppertext(attacker.a_intent) : "N/A"]) (JMP)") + msg_admin_attack("[key_name(attacker)] [admin_message] [key_name(victim)] (INTENT: [attacker? uppertext(attacker.a_intent) : "N/A"]) (JMP)",ckey=key_name(attacker),ckey_target=key_name(victim)) proc/admin_attacker_log_many_victims(var/mob/attacker, var/list/mob/victims, var/attacker_message, var/victim_message, var/admin_message) if(!victims || !victims.len) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 9e2adb9ba86..37cd449ebc1 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -513,7 +513,7 @@ var/list/admin_verbs_cciaa = list( set category = "Admin" if(holder) holder.check_antagonists() - log_admin("[key_name(usr)] checked antagonists.") //for tsar~ + log_admin("[key_name(usr)] checked antagonists.",ckey=key_name(usr)) //for tsar~ feedback_add_details("admin_verb","CHA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -581,7 +581,7 @@ var/list/admin_verbs_cciaa = list( if(length(new_key) >= 26) new_key = copytext(new_key, 1, 26) holder.fakekey = new_key - log_admin("[key_name(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]") + log_admin("[key_name(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]", admin_key=key_name(usr),ckey=holder.fakekey) message_admins("[key_name_admin(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]", 1) feedback_add_details("admin_verb","SM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -624,7 +624,7 @@ var/list/admin_verbs_cciaa = list( var/path = text2path("/datum/disease/[D]") T.contract_disease(new path, 1) feedback_add_details("admin_verb","GD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].") + log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].",admin_key=key_name(usr),ckey=key_name(T)) message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] the disease [D].", 1) /client/proc/give_disease2(mob/T as mob in mob_list) // -- Giacom @@ -655,7 +655,7 @@ var/list/admin_verbs_cciaa = list( infect_virus2(T,D,1) feedback_add_details("admin_verb","GD2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].") + log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].",admin_key=key_name(usr),ckey=key_name(T)) message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].", 1) /client/proc/make_sound(var/obj/O in range(world.view)) // -- TLE @@ -668,7 +668,7 @@ var/list/admin_verbs_cciaa = list( return for (var/mob/V in hearers(O)) V.show_message(message, 2) - log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound") + log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound", 1) feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -702,7 +702,7 @@ var/list/admin_verbs_cciaa = list( air_processing_killed = 1 usr << "Disabled air processing." feedback_add_details("admin_verb","KA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] used 'kill air'.") + log_admin("[key_name(usr)] used 'kill air'.",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] used 'kill air'.", 1) /client/proc/readmin_self() @@ -711,7 +711,7 @@ var/list/admin_verbs_cciaa = list( if(deadmin_holder) deadmin_holder.reassociate() - log_admin("[src] re-admined themself.") + log_admin("[src] re-admined themself.",admin_key=key_name(src)) message_admins("[src] re-admined themself.", 1) src << "You now have the keys to control the planet, or atleast a small space station" verbs -= /client/proc/readmin_self @@ -722,7 +722,7 @@ var/list/admin_verbs_cciaa = list( if(holder) if(alert("Confirm self-deadmin for the round? You can re-admin yourself at any time.",,"Yes","No") == "Yes") - log_admin("[src] deadmined themself.") + log_admin("[src] deadmined themself.",admin_key=key_name(src)) message_admins("[src] deadmined themself.", 1) deadmin() src << "You are now a normal player." @@ -822,7 +822,7 @@ var/list/admin_verbs_cciaa = list( var sec_level = input(usr, "It's currently code [get_security_level()].", "Select Security Level") as null|anything in (list("green","blue","red","delta")-get_security_level()) if(alert("Switch from code [get_security_level()] to code [sec_level]?","Change security level?","Yes","No") == "Yes") set_security_level(sec_level) - log_admin("[key_name(usr)] changed the security level to code [sec_level].") + log_admin("[key_name(usr)] changed the security level to code [sec_level].",admin_key=key_name(usr)) //---- bs12 verbs ---- @@ -983,7 +983,7 @@ var/list/admin_verbs_cciaa = list( T << "Man up and deal with it." T << "Move on." - log_admin("[key_name(usr)] told [key_name(T)] to man up and deal with it.") + log_admin("[key_name(usr)] told [key_name(T)] to man up and deal with it.", admin_key=key_name(usr), ckey=key_name(T)) message_admins("\blue [key_name_admin(usr)] told [key_name(T)] to man up and deal with it.", 1) /client/proc/global_man_up() @@ -995,7 +995,7 @@ var/list/admin_verbs_cciaa = list( T << "
Man up.
Deal with it.

Move on.

" T << 'sound/voice/ManUp1.ogg' - log_admin("[key_name(usr)] told everyone to man up and deal with it.") + log_admin("[key_name(usr)] told everyone to man up and deal with it.",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] told everyone to man up and deal with it.", 1) /client/proc/give_spell(mob/T as mob in mob_list) // -- Urist @@ -1006,7 +1006,7 @@ var/list/admin_verbs_cciaa = list( if(!S) return T.add_spell(new S) feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].") + log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].",admin_key=key_name(usr),ckey=key_name(T)) message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1) /client/proc/toggle_recursive_explosions() diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index 45435caf4fa..7097d74968d 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -16,10 +16,6 @@ var/jobban_keylist[0] //to store the keys & ranks //returns a reason if M is banned from rank, returns 0 otherwise /proc/jobban_isbanned(mob/M, rank) if(M && rank) - /* - if(_jobban_isbanned(M, rank)) return "Reason Unspecified" //for old jobban - */ - if (guest_jobbans(rank)) if(config.guest_jobban && IsGuestKey(M.key)) return "Guest Job-ban" diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm index 41b8998c30a..f99a8ec0a3c 100644 --- a/code/modules/admin/callproc/callproc.dm +++ b/code/modules/admin/callproc/callproc.dm @@ -139,13 +139,13 @@ if(!target) usr << "Your callproc target no longer exists." return - log_admin("[key_name(src)] called [target]'s [procname]() with [arguments.len ? "the arguments [list2params(arguments)]" : "no arguments"].") + log_admin("[key_name(src)] called [target]'s [procname]() with [arguments.len ? "the arguments [list2params(arguments)]" : "no arguments"].",admin_key=key_name(src)) if(arguments.len) returnval = call(target, procname)(arglist(arguments)) else returnval = call(target, procname)() else - log_admin("[key_name(src)] called [procname]() with [arguments.len ? "the arguments [list2params(arguments)]" : "no arguments"].") + log_admin("[key_name(src)] called [procname]() with [arguments.len ? "the arguments [list2params(arguments)]" : "no arguments"].",admin_key=key_name(src)) returnval = call(procname)(arglist(arguments)) usr << "[procname]() returned: [isnull(returnval) ? "null" : returnval]" diff --git a/code/modules/admin/newbanjob.dm b/code/modules/admin/newbanjob.dm index 00ee46de497..cb9d8edd3b2 100644 --- a/code/modules/admin/newbanjob.dm +++ b/code/modules/admin/newbanjob.dm @@ -170,10 +170,10 @@ var/savefile/Banlistjob if (!Banlistjob.dir.Remove(foldername)) return 0 if(!usr) - log_admin("Banjob Expired: [key]") + log_admin("Banjob Expired: [key]",ckey=key) message_admins("Banjob Expired: [key]") else - log_admin("[key_name_admin(usr)] unjobbanned [key] from [rank]") + log_admin("[key_name_admin(usr)] unjobbanned [key] from [rank]",admin_key=key_name(usr),ckey=key) message_admins("[key_name_admin(usr)] unjobbanned:[key] from [rank]") ban_unban_log_save("[key_name_admin(usr)] unjobbanned [key] from [rank]") feedback_inc("ban_job_unban",1) diff --git a/code/modules/admin/player_notes.dm b/code/modules/admin/player_notes.dm index b6293e7941d..b42de114aab 100644 --- a/code/modules/admin/player_notes.dm +++ b/code/modules/admin/player_notes.dm @@ -104,7 +104,7 @@ datum/admins/proc/notes_gethtml(var/ckey) info << infos message_admins("\blue [key_name_admin(user)] has edited [key]'s notes.") - log_admin("[key_name(user)] has edited [key]'s notes.") + log_admin("[key_name(user)] has edited [key]'s notes.",admin_key=key_name(user),ckey=key) del(info) // savefile, so NOT qdel @@ -129,7 +129,7 @@ datum/admins/proc/notes_gethtml(var/ckey) info << infos message_admins("\blue [key_name_admin(usr)] deleted one of [key]'s notes.") - log_admin("[key_name(usr)] deleted one of [key]'s notes.") + log_admin("[key_name(usr)] deleted one of [key]'s notes.",admin_key=key_name(usr),ckey=key) qdel(info) diff --git a/code/modules/admin/player_notes_sql.dm b/code/modules/admin/player_notes_sql.dm index cfd42df4b7c..a9e0360ec22 100644 --- a/code/modules/admin/player_notes_sql.dm +++ b/code/modules/admin/player_notes_sql.dm @@ -30,7 +30,7 @@ insert_query.Execute(query_details) message_admins("\blue [key_name_admin(user)] has edited [player_ckey]'s notes.") - log_admin("[key_name(user)] has edited [player_ckey]'s notes.") + log_admin("[key_name(user)] has edited [player_ckey]'s notes.",admin_key=key_name(user),ckey=player_ckey) /proc/notes_edit_sql(var/note_id, var/note_edit) if (!note_id || !note_edit) @@ -69,7 +69,7 @@ deletequery.Execute(list(":note_id" = note_id)) message_admins("\blue [key_name_admin(usr)] deleted one of [ckey]'s notes.") - log_admin("[key_name(usr)] deleted one of [ckey]'s notes.") + log_admin("[key_name(usr)] deleted one of [ckey]'s notes.",admin_key=key_name(usr),ckey=ckey) else usr << "Cancelled" return diff --git a/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm b/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm index 4097632aa30..a878d37568c 100644 --- a/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm +++ b/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm @@ -29,8 +29,8 @@ S.long_jump(origin_area, destination_area, transition_area, move_duration) message_admins("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle", 1) - log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle") + log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle",admin_key=key_name(user)) else S.short_jump(origin_area, destination_area) message_admins("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle", 1) - log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle") + log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle",admin_key=key_name(user)) diff --git a/code/modules/admin/secrets/fun_secrets/toggle_bomb_cap.dm b/code/modules/admin/secrets/fun_secrets/toggle_bomb_cap.dm index 33ba8a861ce..a4b65a9c5d5 100644 --- a/code/modules/admin/secrets/fun_secrets/toggle_bomb_cap.dm +++ b/code/modules/admin/secrets/fun_secrets/toggle_bomb_cap.dm @@ -18,4 +18,4 @@ var/range_high = max_explosion_range *0.5 var/range_low = max_explosion_range message_admins("[key_name_admin(user)] changed the bomb cap to [range_dev], [range_high], [range_low]", 1) - log_admin("[key_name_admin(user)] changed the bomb cap to [max_explosion_range]") + log_admin("[key_name_admin(user)] changed the bomb cap to [max_explosion_range]",admin_key=key_name(user)) diff --git a/code/modules/admin/secrets/random_events/gravity.dm b/code/modules/admin/secrets/random_events/gravity.dm index 8d4cad49604..5499cbd9588 100644 --- a/code/modules/admin/secrets/random_events/gravity.dm +++ b/code/modules/admin/secrets/random_events/gravity.dm @@ -22,10 +22,10 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","Grav") if(gravity_is_on) - log_admin("[key_name(user)] toggled gravity on.", 1) + log_admin("[key_name(user)] toggled gravity on.", admin_key=key_name(user)) message_admins("[key_name_admin(user)] toggled gravity on.", 1) command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.") else - log_admin("[key_name(user)] toggled gravity off.", 1) + log_admin("[key_name(user)] toggled gravity off.", admin_key=key_name(user)) message_admins("[key_name_admin(usr)] toggled gravity off.", 1) command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes. Have a nice day.") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 217afeb654e..ba5712bd63a 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2,7 +2,7 @@ ..() if(usr.client != src.owner || !check_rights(0)) - log_admin("[key_name(usr)] tried to use the admin panel without authorization.") + log_admin("[key_name(usr)] tried to use the admin panel without authorization.",admin_key=key_name(usr)) message_admins("[usr.key] has attempted to override the admin panel!") return @@ -118,7 +118,7 @@ else if(href_list["editrights"]) if(!check_rights(R_PERMISSIONS)) message_admins("[key_name_admin(usr)] attempted to edit the admin permissions without sufficient rights.") - log_admin("[key_name(usr)] attempted to edit the admin permissions without sufficient rights.") + log_admin("[key_name(usr)] attempted to edit the admin permissions without sufficient rights.",admin_key=key_name(usr)) return var/adm_ckey @@ -147,7 +147,7 @@ D.disassociate() message_admins("[key_name_admin(usr)] removed [adm_ckey] from the admins list") - log_admin("[key_name(usr)] removed [adm_ckey] from the admins list") + log_admin("[key_name(usr)] removed [adm_ckey] from the admins list",admin_key=key_name(usr)) log_admin_rank_modification(adm_ckey, "Removed") else if(task == "rank") @@ -191,7 +191,7 @@ D.associate(C) //link up with the client and add verbs message_admins("[key_name_admin(usr)] edited the admin rank of [adm_ckey] to [new_rank]") - log_admin("[key_name(usr)] edited the admin rank of [adm_ckey] to [new_rank]") + log_admin("[key_name(usr)] edited the admin rank of [adm_ckey] to [new_rank]",admin_key=key_name(usr)) log_admin_rank_modification(adm_ckey, new_rank) else if(task == "permissions") @@ -204,7 +204,7 @@ D.rights ^= permissionlist[new_permission] message_admins("[key_name_admin(usr)] toggled the [new_permission] permission of [adm_ckey]") - log_admin("[key_name(usr)] toggled the [new_permission] permission of [adm_ckey]") + log_admin("[key_name(usr)] toggled the [new_permission] permission of [adm_ckey]", admin_key=key_name(usr)) log_admin_permission_modification(adm_ckey, permissionlist[new_permission]) edit_admin_permissions() @@ -222,7 +222,7 @@ return if (emergency_shuttle.can_call()) emergency_shuttle.call_evac() - log_admin("[key_name(usr)] called the Emergency Shuttle") + log_admin("[key_name(usr)] called the Emergency Shuttle",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] called the Emergency Shuttle to the station", 1) if("2") @@ -230,12 +230,12 @@ return if (emergency_shuttle.can_call()) emergency_shuttle.call_evac() - log_admin("[key_name(usr)] called the Emergency Shuttle") + log_admin("[key_name(usr)] called the Emergency Shuttle",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] called the Emergency Shuttle to the station", 1) else if (emergency_shuttle.can_recall()) emergency_shuttle.recall() - log_admin("[key_name(usr)] sent the Emergency Shuttle back") + log_admin("[key_name(usr)] sent the Emergency Shuttle back",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] sent the Emergency Shuttle back", 1) href_list["secretsadmin"] = "check_antagonist" @@ -248,14 +248,14 @@ emergency_shuttle.launch_time = world.time + new_time_left*10 - log_admin("[key_name(usr)] edited the Emergency Shuttle's launch time to [new_time_left]") + log_admin("[key_name(usr)] edited the Emergency Shuttle's launch time to [new_time_left]",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] edited the Emergency Shuttle's launch time to [new_time_left*10]", 1) else if (emergency_shuttle.shuttle.has_arrive_time()) var/new_time_left = input("Enter new shuttle arrival time (seconds):","Edit Shuttle Arrival Time", emergency_shuttle.estimate_arrival_time() ) as num emergency_shuttle.shuttle.arrive_time = world.time + new_time_left*10 - log_admin("[key_name(usr)] edited the Emergency Shuttle's arrival time to [new_time_left]") + log_admin("[key_name(usr)] edited the Emergency Shuttle's arrival time to [new_time_left]",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] edited the Emergency Shuttle's arrival time to [new_time_left*10]", 1) else alert("The shuttle is neither counting down to launch nor is it in transit. Please try again when it is.") @@ -266,7 +266,7 @@ if(!check_rights(R_SERVER)) return ticker.delay_end = !ticker.delay_end - log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") + log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].",admin_key=key_name(usr)) message_admins("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) href_list["secretsadmin"] = "check_antagonist" @@ -284,7 +284,7 @@ if("Cancel") return if("Yes") delmob = 1 - log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]") + log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]", 1) switch(href_list["simplemake"]) @@ -382,7 +382,7 @@ reason = sanitize(input(usr,"Reason?","reason",reason2) as text|null) if(!reason) return - log_admin("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") + log_admin("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]",admin_key=key_name(usr)) ban_unban_log_save("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") message_admins("\blue [key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]", 1) Banlist.cd = "/base/[banfolder]" @@ -719,7 +719,7 @@ var/msg for(var/job in notbannedlist) ban_unban_log_save("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes. reason: [reason]") - log_admin("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes") + log_admin("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes",admin_key=key_name(usr)) feedback_inc("ban_job_tmp",1) DB_ban_record(BANTYPE_JOB_TEMP, M, mins, reason, job) feedback_add_details("ban_job_tmp","- [job]") @@ -745,7 +745,7 @@ var/msg for(var/job in notbannedlist) ban_unban_log_save("[key_name(usr)] perma-jobbanned [key_name(M)] from [job]. reason: [reason]") - log_admin("[key_name(usr)] perma-banned [key_name(M)] from [job]") + log_admin("[key_name(usr)] perma-banned [key_name(M)] from [job]",admin_key=key_name(usr)) feedback_inc("ban_job",1) DB_ban_record(BANTYPE_JOB_PERMA, M, -1, reason, job) feedback_add_details("ban_job","- [job]") @@ -779,7 +779,7 @@ switch(alert("Job: '[job]' Reason: '[reason]' Un-jobban?","Please Confirm","Yes","No")) if("Yes") ban_unban_log_save("[key_name(usr)] unjobbanned [key_name(M)] from [job]") - log_admin("[key_name(usr)] unbanned [key_name(M)] from [job]") + log_admin("[key_name(usr)] unbanned [key_name(M)] from [job]",admin_key=key_name(usr),ckey=key_name(M)) DB_ban_unban(M.ckey, BANTYPE_JOB_PERMA, job) feedback_inc("ban_job_unban",1) feedback_add_details("ban_job_unban","- [job]") @@ -805,7 +805,7 @@ M << "\red You have been kicked from the server" else M << "\red You have been kicked from the server: [reason]" - log_admin("[key_name(usr)] booted [key_name(M)].") + log_admin("[key_name(usr)] booted [key_name(M)].",admin_key=key_name(usr),ckey=key_name(M)) message_admins("\blue [key_name_admin(usr)] booted [key_name_admin(M)].", 1) //M.client = null qdel(M.client) @@ -816,7 +816,7 @@ var/t = href_list["removejobban"] if(t) if((alert("Do you want to unjobban [t]?","Unjobban confirmation", "Yes", "No") == "Yes") && t) //No more misclicks! Unless you do it twice. - log_admin("[key_name(usr)] removed [t]") + log_admin("[key_name(usr)] removed [t]",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] removed [t]", 1) jobban_remove(t) href_list["ban"] = 1 // lets it fall through and refresh @@ -866,7 +866,7 @@ M << "\red To try to resolve this matter head to [config.banappeals]" else M << "\red No ban appeals URL has been set." - log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") + log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.",admin_key=key_name(usr),ckey=key_name(M)) message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") qdel(M.client) @@ -893,7 +893,7 @@ notes_add(M.ckey,"[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This is a permanent ban.",usr) else notes_add_sql(M.ckey, "[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This is a permanent ban.", usr, M.lastKnownIP, M.computer_id) - log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") + log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.",admin_key=key_name(usr),ckey=key_name(M)) message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") feedback_inc("ban_perma",1) DB_ban_record(BANTYPE_PERMA, M, -1, reason) @@ -949,7 +949,7 @@ if (ticker && ticker.mode) return alert(usr, "The game has already started.", null, null, null, null) master_mode = href_list["c_mode2"] - log_admin("[key_name(usr)] set the mode as [master_mode].") + log_admin("[key_name(usr)] set the mode as [master_mode].",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] set the mode as [master_mode].", 1) world << "\blue The mode is now: [master_mode]" Game() // updates the main game menu @@ -964,7 +964,7 @@ if(master_mode != "secret") return alert(usr, "The game mode has to be secret!", null, null, null, null) secret_force_mode = href_list["f_secret2"] - log_admin("[key_name(usr)] set the forced secret mode as [secret_force_mode].") + log_admin("[key_name(usr)] set the forced secret mode as [secret_force_mode].",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] set the forced secret mode as [secret_force_mode].", 1) Game() // updates the main game menu .(href, list("f_secret"=1)) @@ -977,7 +977,7 @@ usr << "This can only be used on instances of type /mob/living/carbon/human" return - log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]") + log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]", 1) H.monkeyize() @@ -989,7 +989,7 @@ usr << "This can only be used on instances of type /mob/living/carbon/human" return - log_admin("[key_name(usr)] attempting to corgize [key_name(H)]") + log_admin("[key_name(usr)] attempting to corgize [key_name(H)]",admin_key=key_name(usr),ckey=key_name(H)) message_admins("\blue [key_name_admin(usr)] attempting to corgize [key_name_admin(H)]", 1) H.corgize() @@ -1004,7 +1004,7 @@ if(!speech) return M.say(speech) speech = sanitize(speech) // Nah, we don't trust them - log_admin("[key_name(usr)] forced [key_name(M)] to say: [speech]") + log_admin("[key_name(usr)] forced [key_name(M)] to say: [speech]",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]") else if(href_list["sendtoprison"]) @@ -1045,7 +1045,7 @@ prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes) M << "\red You have been sent to the prison station!" - log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.") + log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.",,admin_key=key_name(usr),ckey=key_name(M)) message_admins("\blue [key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.", 1) else if(href_list["tdome1"]) @@ -1070,7 +1070,7 @@ M.loc = pick(tdome1) spawn(50) M << "\blue You have been sent to the Thunderdome." - log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 1)") + log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 1)",admin_key=key_name(usr),ckey=key_name(M)) message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Team 1)", 1) else if(href_list["tdome2"]) @@ -1095,7 +1095,7 @@ M.loc = pick(tdome2) spawn(50) M << "\blue You have been sent to the Thunderdome." - log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 2)") + log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 2)",admin_key=key_name(usr),ckey=key_name(M)) message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Team 2)", 1) else if(href_list["tdomeadmin"]) @@ -1117,7 +1117,7 @@ M.loc = pick(tdomeadmin) spawn(50) M << "\blue You have been sent to the Thunderdome." - log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Admin.)") + log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Admin.)",admin_key=key_name(usr),ckey=key_name(M)) message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Admin.)", 1) else if(href_list["tdomeobserve"]) @@ -1146,7 +1146,7 @@ M.loc = pick(tdomeobserve) spawn(50) M << "\blue You have been sent to the Thunderdome." - log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Observer.)") + log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Observer.)",admin_key=key_name(usr),ckey=key_name(M)) message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Observer.)", 1) else if(href_list["revive"]) @@ -1160,7 +1160,7 @@ if(config.allow_admin_rev) L.revive() message_admins("\red Admin [key_name_admin(usr)] healed / revived [key_name_admin(L)]!", 1) - log_admin("[key_name(usr)] healed / Rrvived [key_name(L)]") + log_admin("[key_name(usr)] healed / Revived [key_name(L)]",admin_key=key_name(usr),ckey=key_name(L)) else usr << "Admin Rejuvinates have been disabled" @@ -1173,7 +1173,7 @@ return message_admins("\red Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!", 1) - log_admin("[key_name(usr)] AIized [key_name(H)]") + log_admin("[key_name(usr)] AIized [key_name(H)]",admin_key=key_name(usr),ckey=key_name(H)) H.AIize() else if(href_list["makeslime"]) @@ -1313,14 +1313,14 @@ if(!(istype(H.l_hand,/obj/item/weapon/reagent_containers/food/snacks/cookie))) H.equip_to_slot_or_del( new /obj/item/weapon/reagent_containers/food/snacks/cookie(H), slot_r_hand ) if(!(istype(H.r_hand,/obj/item/weapon/reagent_containers/food/snacks/cookie))) - log_admin("[key_name(H)] has their hands full, so they did not receive their cookie, spawned by [key_name(src.owner)].") + log_admin("[key_name(H)] has their hands full, so they did not receive their cookie, spawned by [key_name(src.owner)].",admin_key=key_name(src.owner),ckey=key_name(H)) message_admins("[key_name(H)] has their hands full, so they did not receive their cookie, spawned by [key_name(src.owner)].") return else H.update_inv_r_hand()//To ensure the icon appears in the HUD else H.update_inv_l_hand() - log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]") + log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]",admin_key=key_name(src.owner),ckey=key_name(H)) message_admins("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]") feedback_inc("admin_cookies_spawned",1) H << "\blue Your prayers have been answered!! You received the best cookie!" @@ -1345,7 +1345,7 @@ BSACooldown = 0 M << "You've been hit by bluespace artillery!" - log_admin("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]") + log_admin("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]",admin_key=key_name(src.owner),ckey=key_name(M)) message_admins("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]") var/obj/effect/stop/S @@ -1379,7 +1379,7 @@ if(!input) return src.owner << "You sent [input] to [L] via a secure channel." - log_admin("[src.owner] replied to [key_name(L)]'s Centcomm message with the message [input].") + log_admin("[src.owner] replied to [key_name(L)]'s Centcomm message with the message [input].",admin_key=key_name(src.owner),ckey=key_name(L)) message_admins("[src.owner] replied to [key_name(L)]'s Centcom message with: \"[input]\"") if(!isAI(L)) L << "You hear something crackle in your headset for a moment before a voice speaks." @@ -1404,7 +1404,7 @@ if(!input) return src.owner << "You sent [input] to [H] via a secure channel." - log_admin("[src.owner] replied to [key_name(H)]'s illegal message with the message [input].") + log_admin("[src.owner] replied to [key_name(H)]'s illegal message with the message [input].", admin_key=key_name(src.owner), ckey=key_name(H)) H << "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your benefactor. Message as follows, agent. \"[input]\" Message ends.\"" else if(href_list["AdminFaxView"]) @@ -1707,7 +1707,7 @@ if(choice=="Confirm") news_network.CreateFeedChannel(admincaster_feed_channel.channel_name, admincaster_signature, admincaster_feed_channel.locked, 1) feedback_inc("newscaster_channels",1) //Adding channel to the global network - log_admin("[key_name_admin(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!") + log_admin("[key_name_admin(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!",admin_key=key_name(usr)) src.admincaster_screen=5 src.access_news_network() @@ -1730,7 +1730,7 @@ news_network.SubmitArticle(src.admincaster_feed_message.body, src.admincaster_signature, src.admincaster_feed_channel.channel_name, null, 1) src.admincaster_screen=4 - log_admin("[key_name_admin(usr)] submitted a feed story to channel: [src.admincaster_feed_channel.channel_name]!") + log_admin("[key_name_admin(usr)] submitted a feed story to channel: [src.admincaster_feed_channel.channel_name]!",admin_key=key_name(usr)) src.access_news_network() else if(href_list["ac_create_channel"]) @@ -1791,7 +1791,7 @@ news_network.wanted_issue.body = src.admincaster_feed_message.body news_network.wanted_issue.backup_author = src.admincaster_feed_message.backup_author src.admincaster_screen = 19 - log_admin("[key_name_admin(usr)] issued a Station-wide Wanted Notification for [src.admincaster_feed_message.author]!") + log_admin("[key_name_admin(usr)] issued a Station-wide Wanted Notification for [src.admincaster_feed_message.author]!",admin_key=key_name(usr)) src.access_news_network() else if(href_list["ac_cancel_wanted"]) diff --git a/code/modules/admin/verbs/SDQL.dm b/code/modules/admin/verbs/SDQL.dm index a98cc3a1d95..34b6e208169 100644 --- a/code/modules/admin/verbs/SDQL.dm +++ b/code/modules/admin/verbs/SDQL.dm @@ -7,7 +7,7 @@ set category = "Admin" if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe. message_admins("\red ERROR: Non-admin [usr.key] attempted to execute a SDQL query!") - log_admin("Non-admin [usr.key] attempted to execute a SDQL query!") + log_admin("Non-admin [usr.key] attempted to execute a SDQL query!",level=2,ckey=key_name(usr)) var/list/query_list = SDQL_tokenize(query_text) diff --git a/code/modules/admin/verbs/SDQL_2.dm b/code/modules/admin/verbs/SDQL_2.dm index 236237c23ad..134c827958f 100644 --- a/code/modules/admin/verbs/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL_2.dm @@ -4,7 +4,7 @@ set category = "Admin" if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe. message_admins("\red ERROR: Non-admin [usr.key] attempted to execute a SDQL query!") - log_admin("Non-admin [usr.key] attempted to execute a SDQL query!") + log_admin("Non-admin [usr.key] attempted to execute a SDQL query!",level=2,ckey=key_name(usr)) if(!query_text || length(query_text) < 1) return diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 4d85f3b0a75..db2dcb48911 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -116,7 +116,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," src << "PM to-Staff : [original_msg]" var/admin_number_active = admin_number_present - admin_number_afk - log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.") + log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.",admin_key=key_name(src)) if(admin_number_active <= 0) discord_bot.send_to_admins("@everyone Request for Help from [key_name(src)]: [html_decode(original_msg)] - !![admin_number_afk ? "All admins AFK ([admin_number_afk])" : "No admins online"]!!") feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index ae1be18570c..96b2b3475ff 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -15,7 +15,7 @@ usr.on_mob_jump() usr.loc = pick(get_area_turfs(A)) - log_admin("[key_name(usr)] jumped to [A]") + log_admin("[key_name(usr)] jumped to [A]", admin_key=key_name(usr)) message_admins("[key_name_admin(usr)] jumped to [A]", 1) feedback_add_details("admin_verb","JA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! else @@ -27,7 +27,7 @@ if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV)) return if(config.allow_admin_jump) - log_admin("[key_name(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]") + log_admin("[key_name(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]",admin_key=key_name(usr)) message_admins("[key_name_admin(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]", 1) usr.on_mob_jump() usr.loc = T @@ -44,7 +44,7 @@ return if(config.allow_admin_jump) - log_admin("[key_name(usr)] jumped to [key_name(M)]") + log_admin("[key_name(usr)] jumped to [key_name(M)]",admin_key=key_name(usr),ckey=key_name(M)) message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1) if(src.mob) var/mob/A = src.mob @@ -94,7 +94,7 @@ src << "No keys found." return var/mob/M = selection:mob - log_admin("[key_name(usr)] jumped to [key_name(M)]") + log_admin("[key_name(usr)] jumped to [key_name(M)]",admin_key=key_name(usr),ckey=key_name(M)) message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1) usr.on_mob_jump() usr.loc = M.loc @@ -109,7 +109,7 @@ if(!check_rights(R_ADMIN|R_MOD|R_DEBUG)) return if(config.allow_admin_jump) - log_admin("[key_name(usr)] teleported [key_name(M)]") + log_admin("[key_name(usr)] teleported [key_name(M)]",admin_key=key_name(usr),ckey=key_name(M)) message_admins("[key_name_admin(usr)] teleported [key_name_admin(M)]", 1) M.on_mob_jump() M.loc = get_turf(usr) @@ -136,7 +136,7 @@ if(!M) return - log_admin("[key_name(usr)] teleported [key_name(M)]") + log_admin("[key_name(usr)] teleported [key_name(M)]",admin_key=key_name(usr),ckey=key_name(M)) message_admins("[key_name_admin(usr)] teleported [key_name(M)]", 1) if(M) M.on_mob_jump() @@ -157,7 +157,7 @@ M.loc = pick(get_area_turfs(A)) feedback_add_details("admin_verb","SMOB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] teleported [key_name(M)] to [A]") + log_admin("[key_name(usr)] teleported [key_name(M)] to [A]",admin_key=key_name(usr),ckey=key_name(M)) message_admins("[key_name_admin(usr)] teleported [key_name_admin(M)] to [A]", 1) else alert("Admin jumping disabled") diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 24635707c92..f0fa6232232 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -107,7 +107,7 @@ if(C.prefs && C.prefs.toggles & SOUND_ADMINHELP) C << 'sound/effects/adminhelp.ogg' - log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]") + log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]", admin_key = key_name(src), ckey_target = key_name(C)) //we don't use message_admins here because the sender/receiver might get it too for(var/client/X in admins) diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index ecb71aee2c6..41d6751ddce 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -7,7 +7,7 @@ msg = sanitize(msg) if(!msg) return - log_admin("ADMIN: [key_name(src)] : [msg]") + log_admin("ADMIN: [key_name(src)] : [msg]",admin_key=key_name(src)) if(check_rights(R_ADMIN,0)) for(var/client/C in admins) @@ -24,7 +24,7 @@ if(!check_rights(R_ADMIN|R_MOD)) return msg = sanitize(msg) - log_admin("MOD: [key_name(src)] : [msg]") + log_admin("MOD: [key_name(src)] : [msg]",admin_key=key_name(src)) if (!msg) return @@ -48,7 +48,7 @@ msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) if(!msg) return - log_admin("DEV: [key_name(src)] : [msg]") + log_admin("DEV: [key_name(src)] : [msg]",admin_key=key_name(src)) if(check_rights(R_DEV,0)) msg = "DEV: [key_name(usr, 0, 1, 0)]: [msg]" @@ -66,7 +66,7 @@ msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) if(!msg) return - log_admin("CCIASAY: [key_name(src)] : [msg]") + log_admin("CCIASAY: [key_name(src)] : [msg]",admin_key=key_name(src)) if(check_rights((R_CCIAA|R_ADMIN),0)) msg = "CCIAAgent: [key_name(usr, 0, 1, 0)]: [msg]" diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm index f8251796ff8..8374292bba3 100644 --- a/code/modules/admin/verbs/antag-ooc.dm +++ b/code/modules/admin/verbs/antag-ooc.dm @@ -27,7 +27,7 @@ else if (M.mind && M.mind.special_role && M.client) M << "" + create_text_tag("aooc", "Antag-OOC:", M.client) + " [display_name]: [msg]" - log_ooc("(ANTAG) [key] : [msg]") + log_ooc("(ANTAG) [key] : [msg]",ckey=key_name(mob)) // Checks if a newly joined player is an antag, and adds the AOOC verb if they are. // Because they're tied to client objects, this gets removed every time you disconnect. diff --git a/code/modules/admin/verbs/bluespacetech.dm b/code/modules/admin/verbs/bluespacetech.dm index f25a668b327..7ee71ad63ea 100644 --- a/code/modules/admin/verbs/bluespacetech.dm +++ b/code/modules/admin/verbs/bluespacetech.dm @@ -329,6 +329,14 @@ C.holder.original_mob = null suicide() +/mob/living/carbon/human/bst/verb/tgm() + set name = "Toggle Godmode" + set desc = "Enable or disable god mode. For testing things that require you to be vulnerable." + set category = "BST" + + status_flags ^= GODMODE + src << span("notice", "God mode is now [status_flags & GODMODE ? "enabled" : "disabled"]") + //Equipment. All should have canremove set to 0 //All items with a /bst need the attack_hand() proc overrided to stop people getting overpowered items. diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 0ecc220ae2c..79a3a020a0b 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -3,14 +3,14 @@ set category = "Special Verbs" if(M.client) if(M.client.buildmode) - log_admin("[key_name(usr)] has left build mode.") + log_admin("[key_name(usr)] has left build mode.",admin_key=key_name(usr)) M.client.buildmode = 0 M.client.show_popup_menus = 1 for(var/obj/effect/bmode/buildholder/H) if(H.cl == M.client) qdel(H) else - log_admin("[key_name(usr)] has entered build mode.") + log_admin("[key_name(usr)] has entered build mode.",admin_key=key_name(usr)) M.client.buildmode = 1 M.client.show_popup_menus = 0 @@ -278,13 +278,13 @@ if(3) if(pa.Find("left")) //I cant believe this shit actually compiles. if(object.vars.Find(holder.buildmode.varholder)) - log_admin("[key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]") + log_admin("[key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]",admin_key=key_name(usr)) object.vars[holder.buildmode.varholder] = holder.buildmode.valueholder else usr << "\red [initial(object.name)] does not have a var called '[holder.buildmode.varholder]'" if(pa.Find("right")) if(object.vars.Find(holder.buildmode.varholder)) - log_admin("[key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]") + log_admin("[key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]",admin_key=key_name(usr)) object.vars[holder.buildmode.varholder] = initial(object.vars[holder.buildmode.varholder]) else usr << "\red [initial(object.name)] does not have a var called '[holder.buildmode.varholder]'" @@ -296,4 +296,4 @@ if(pa.Find("right")) if(holder.throw_atom) holder.throw_atom.throw_at(object, 10, 1) - log_admin("[key_name(usr)] threw [holder.throw_atom] at [object]") + log_admin("[key_name(usr)] threw [holder.throw_atom] at [object]",admin_key=key_name(usr)) diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index a643b370fc4..915a1e000f5 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -21,7 +21,7 @@ override = input(src,"mode = ?","Enter Parameter",null) as anything in list("blob","mercenary","AI malfunction","no override") ticker.station_explosion_cinematic(parameter,override) - log_admin("[key_name(src)] launched cinematic \"[cinematic]\"") + log_admin("[key_name(src)] launched cinematic \"[cinematic]\"",admin_key=key_name(usr)) message_admins("[key_name_admin(src)] launched cinematic \"[cinematic]\"", 1) return \ No newline at end of file diff --git a/code/modules/admin/verbs/custom_event.dm b/code/modules/admin/verbs/custom_event.dm index 265c16a8689..32ef7df059a 100644 --- a/code/modules/admin/verbs/custom_event.dm +++ b/code/modules/admin/verbs/custom_event.dm @@ -10,11 +10,11 @@ var/input = sanitize(input(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", custom_event_msg) as message|null, MAX_BOOK_MESSAGE_LEN, extra = 0) if(!input || input == "") custom_event_msg = null - log_admin("[usr.key] has cleared the custom event text.") + log_admin("[usr.key] has cleared the custom event text.",admin_key=key_name(usr)) message_admins("[key_name_admin(usr)] has cleared the custom event text.") return - log_admin("[usr.key] has changed the custom event text.") + log_admin("[usr.key] has changed the custom event text.",admin_key=key_name(usr)) message_admins("[key_name_admin(usr)] has changed the custom event text.") custom_event_msg = input diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 358267af6f6..20106b41f64 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -21,7 +21,7 @@ var/stafftype = uppertext(holder.rank) msg = sanitize(msg) - log_admin("DSAY: [key_name(src)] : [msg]") + log_admin("DSAY: [key_name(src)] : [msg]",admin_key=key_name(src)) msg = process_chat_markup(msg) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 2b32e5e15ef..e90f843c2f1 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -6,11 +6,11 @@ if(Debug2) Debug2 = 0 message_admins("[key_name(src)] toggled debugging off.") - log_admin("[key_name(src)] toggled debugging off.") + log_admin("[key_name(src)] toggled debugging off.",admin_key=key_name(usr)) else Debug2 = 1 message_admins("[key_name(src)] toggled debugging on.") - log_admin("[key_name(src)] toggled debugging on.") + log_admin("[key_name(src)] toggled debugging on.",admin_key=key_name(usr)) feedback_add_details("admin_verb","DG2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -46,7 +46,7 @@ alert("Wait until the game starts") return if(istype(M, /mob/living/carbon/human)) - log_admin("[key_name(src)] has robotized [M.key].") + log_admin("[key_name(src)] has robotized [M.key].",admin_key=key_name(usr),ckey=key_name(M)) spawn(10) M:Robotize() @@ -69,7 +69,7 @@ alert("The mob must not be a new_player.") return - log_admin("[key_name(src)] has animalized [M.key].") + log_admin("[key_name(src)] has animalized [M.key].",admin_key=key_name(usr),ckey=key_name(M)) spawn(10) M.Animalize() @@ -82,11 +82,11 @@ alert("Wait until the game starts") return if(ishuman(M)) - log_admin("[key_name(src)] has alienized [M.key].") + log_admin("[key_name(src)] has alienized [M.key].",admin_key=key_name(usr),ckey=key_name(M)) spawn(10) M:Alienize() feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] made [key_name(M)] into an alien.") + log_admin("[key_name(usr)] made [key_name(M)] into an alien.",admin_key=key_name(usr),ckey=key_name(M)) message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into an alien.", 1) else alert("Invalid mob") @@ -99,11 +99,11 @@ alert("Wait until the game starts") return if(ishuman(M)) - log_admin("[key_name(src)] has slimeized [M.key].") + log_admin("[key_name(src)] has slimeized [M.key].",admin_key=key_name(usr)) spawn(10) M:slimeize() feedback_add_details("admin_verb","MKMET") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] made [key_name(M)] into a slime.") + log_admin("[key_name(usr)] made [key_name(M)] into a slime.",admin_key=key_name(usr),ckey=key_name(M)) message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into a slime.", 1) else alert("Invalid mob") @@ -211,7 +211,7 @@ for(var/atom/O in world) if(istype(O, hsbitem)) qdel(O) - log_admin("[key_name(src)] has deleted all instances of [hsbitem].") + log_admin("[key_name(src)] has deleted all instances of [hsbitem].",admin_key=key_name(usr)) message_admins("[key_name_admin(src)] has deleted all instances of [hsbitem].", 0) feedback_add_details("admin_verb","DELA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -219,7 +219,7 @@ set category = "Debug" set name = "Make Powernets" makepowernets() - log_admin("[key_name(src)] has remade the powernet. makepowernets() called.") + log_admin("[key_name(src)] has remade the powernet. makepowernets() called.",admin_key=key_name(usr)) message_admins("[key_name_admin(src)] has remade the powernets. makepowernets() called.", 0) feedback_add_details("admin_verb","MPWN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -228,7 +228,7 @@ set name = "Toggle Aliens" config.aliens_allowed = !config.aliens_allowed - log_admin("[key_name(src)] has turned aliens [config.aliens_allowed ? "on" : "off"].") + log_admin("[key_name(src)] has turned aliens [config.aliens_allowed ? "on" : "off"].",admin_key=key_name(usr)) message_admins("[key_name_admin(src)] has turned aliens [config.aliens_allowed ? "on" : "off"].", 0) feedback_add_details("admin_verb","TAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -260,7 +260,7 @@ else alert("Invalid mob") feedback_add_details("admin_verb","GFA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(src)] has granted [M.key] full access.") + log_admin("[key_name(src)] has granted [M.key] full access.",admin_key=key_name(usr),ckey=key_name(M)) message_admins("\blue [key_name_admin(usr)] has granted [M.key] full access.", 1) /client/proc/cmd_assume_direct_control(var/mob/M in mob_list) @@ -276,7 +276,7 @@ var/mob/dead/observer/ghost = new/mob/dead/observer(M,1) ghost.ckey = M.ckey message_admins("\blue [key_name_admin(usr)] assumed direct control of [M].", 1) - log_admin("[key_name(usr)] assumed direct control of [M].") + log_admin("[key_name(usr)] assumed direct control of [M].",admin_key=key_name(usr)) var/mob/adminmob = src.mob M.ckey = src.ckey if( isobserver(adminmob) ) @@ -882,7 +882,7 @@ M.regenerate_icons() - log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].") + log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].",admin_key=key_name(usr),ckey=key_name(M)) message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode]..", 1) return @@ -968,6 +968,6 @@ var/state="[M.dna.GetSEState(block)?"on":"off"]" var/blockname=assigned_blocks[block] message_admins("[key_name_admin(src)] has toggled [M.key]'s [blockname] block [state]!") - log_admin("[key_name(src)] has toggled [M.key]'s [blockname] block [state]!") + log_admin("[key_name(src)] has toggled [M.key]'s [blockname] block [state]!",admin_key=key_name(src),ckey=key_name(M)) else alert("Invalid mob") diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm index c1777171d7f..fd892d966cb 100644 --- a/code/modules/admin/verbs/massmodvar.dm +++ b/code/modules/admin/verbs/massmodvar.dm @@ -371,5 +371,5 @@ if (A.type == O.type) A.vars[variable] = O.vars[variable] - log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]") + log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]",admin_key=key_name(src)) message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]", 1) diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 9fa64ba6885..af3b30e81ed 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -130,7 +130,7 @@ var/list/VVckey_edit = list("key", "ckey") if("No") L += var_value world.log << "### ListVarEdit by [src]: [O.type] [objectvar]: ADDED=[var_value]" - log_admin("[key_name(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]") + log_admin("[key_name(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]",admin_key=key_name(src)) message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]") /client/proc/mod_list(var/list/L, atom/O, original_name, objectvar) @@ -282,7 +282,7 @@ var/list/VVckey_edit = list("key", "ckey") if("DELETE FROM LIST") world.log << "### ListVarEdit by [src]: [O.type] [objectvar]: REMOVED=[html_encode("[variable]")]" - log_admin("[key_name(src)] modified [original_name]'s [objectvar]: REMOVED=[variable]") + log_admin("[key_name(src)] modified [original_name]'s [objectvar]: REMOVED=[variable]",admin_key=key_name(src)) message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: REMOVED=[variable]") L -= variable return @@ -344,7 +344,7 @@ var/list/VVckey_edit = list("key", "ckey") L[L.Find(variable)] = new_var world.log << "### ListVarEdit by [src]: [O.type] [objectvar]: [original_var]=[new_var]" - log_admin("[key_name(src)] modified [original_name]'s [objectvar]: [original_var]=[new_var]") + log_admin("[key_name(src)] modified [original_name]'s [objectvar]: [original_var]=[new_var]",admin_key=key_name(src)) message_admins("[key_name_admin(src)] modified [original_name]'s varlist [objectvar]: [original_var]=[new_var]") /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0) @@ -588,5 +588,5 @@ var/list/VVckey_edit = list("key", "ckey") O.vars[variable] = holder.marked_datum world.log << "### VarEdit by [src]: [O.type] [variable]=[html_encode("[O.vars[variable]]")]" - log_admin("[key_name(src)] modified [original_name]'s [variable] to [O.vars[variable]]") + log_admin("[key_name(src)] modified [original_name]'s [variable] to [O.vars[variable]]",admin_key=key_name(src)) message_admins("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]") diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 3a4b40d9850..8ee5e269804 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -13,7 +13,7 @@ var/list/sounds_cache = list() if(alert("Do you ready?\nSong: [S]\nNow you can also play this sound using \"Play Server Sound\".", "Confirmation request" ,"Play", "Cancel") == "Cancel") return - log_admin("[key_name(src)] played sound [S]") + log_admin("[key_name(src)] played sound [S]",admin_key=key_name(src)) message_admins("[key_name_admin(src)] played sound [S]", 1) for(var/mob/M in player_list) if(M.client.prefs.toggles & SOUND_MIDI) @@ -26,7 +26,7 @@ var/list/sounds_cache = list() set name = "Play Local Sound" if(!check_rights(R_SOUNDS)) return - log_admin("[key_name(src)] played a local sound [S]") + log_admin("[key_name(src)] played a local sound [S]",admin_key=key_name(src)) message_admins("[key_name_admin(src)] played a local sound [S]", 1) playsound(get_turf(src.mob), S, 50, 0, 0) feedback_add_details("admin_verb","PLS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index a9787261004..0a4e1995be6 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -10,10 +10,10 @@ var/turf/T = get_turf(O) if(T) - log_admin("[key_name(usr)] has possessed [O] ([O.type]) at ([T.x], [T.y], [T.z])") + log_admin("[key_name(usr)] has possessed [O] ([O.type]) at ([T.x], [T.y], [T.z])",admin_key=key_name(src)) message_admins("[key_name(usr)] has possessed [O] ([O.type]) at ([T.x], [T.y], [T.z])", 1) else - log_admin("[key_name(usr)] has possessed [O] ([O.type]) at an unknown location") + log_admin("[key_name(usr)] has possessed [O] ([O.type]) at an unknown location",admin_key=key_name(src)) message_admins("[key_name(usr)] has possessed [O] ([O.type]) at an unknown location", 1) if(!usr.control_object) //If you're not already possessing something... diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index e6c7168a5d7..0c2c03b2659 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -12,7 +12,7 @@ for(var/obj/item/W in M) M.drop_from_inventory(W) - log_admin("[key_name(usr)] made [key_name(M)] drop everything!") + log_admin("[key_name(usr)] made [key_name(M)] drop everything!",admin_key=key_name(usr),ckey=key_name(M)) message_admins("[key_name_admin(usr)] made [key_name_admin(M)] drop everything!", 1) feedback_add_details("admin_verb","DEVR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -39,7 +39,7 @@ prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes) spawn(50) M << "\red You have been sent to the prison station!" - log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.") + log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.",admin_key=key_name(usr),ckey=key_name(M)) message_admins("\blue [key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.", 1) feedback_add_details("admin_verb","PRISON") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -61,7 +61,7 @@ if(usr.client.holder) M << "\bold You hear a voice in your head... \italic [msg]" - log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]") + log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]",admin_key=key_name(usr),ckey=key_name(M)) message_admins("\blue \bold SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]", 1) feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -114,7 +114,7 @@ if (!msg) return world << "[msg]" - log_admin("GlobalNarrate: [key_name(usr)] : [msg]") + log_admin("GlobalNarrate: [key_name(usr)] : [msg]",admin_key=key_name(usr)) message_admins("\blue \bold GlobalNarrate: [key_name_admin(usr)] : [msg]
", 1) feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -138,7 +138,7 @@ return M << msg - log_admin("DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]") + log_admin("DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]",admin_key=key_name(usr),ckey=key_name(M)) message_admins("\blue \bold DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]
", 1) feedback_add_details("admin_verb","DIRN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -151,7 +151,7 @@ M.status_flags ^= GODMODE usr << "\blue Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]" - log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]") + log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]",admin_key=key_name(usr),ckey=key_name(M)) message_admins("[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]", 1) feedback_add_details("admin_verb","GOD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -188,7 +188,7 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) if(automute) muteunmute = "auto-muted" M.client.prefs.muted |= mute_type - log_admin("SPAM AUTOMUTE: [muteunmute] [key_name(M)] from [mute_string]") + log_admin("SPAM AUTOMUTE: [muteunmute] [key_name(M)] from [mute_string]",ckey=key_name(M)) message_admins("SPAM AUTOMUTE: [muteunmute] [key_name_admin(M)] from [mute_string].", 1) M << "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin." feedback_add_details("admin_verb","AUTOMUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -201,7 +201,7 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) muteunmute = "muted" M.client.prefs.muted |= mute_type - log_admin("[key_name(usr)] has [muteunmute] [key_name(M)] from [mute_string]") + log_admin("[key_name(usr)] has [muteunmute] [key_name(M)] from [mute_string]",admin_key=key_name(usr),ckey=key_name(M)) message_admins("[key_name_admin(usr)] has [muteunmute] [key_name_admin(M)] from [mute_string].", 1) M << "You have been [muteunmute] from [mute_string]." feedback_add_details("admin_verb","MUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -214,7 +214,7 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) return var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No") if(confirm != "Yes") return - log_admin("[key_name(src)] has added a random AI law.") + log_admin("[key_name(src)] has added a random AI law.",admin_key=key_name(usr)) message_admins("[key_name_admin(src)] has added a random AI law.", 1) var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No") @@ -292,7 +292,7 @@ proc/get_ghosts(var/notify = 0,var/what = 2, var/client/C = null) G.can_reenter_corpse = 1 G:show_message(text("\blue You may now respawn. You should roleplay as if you learned nothing about the round during your time with the dead."), 1) - log_admin("[key_name(usr)] allowed [key_name(G)] to bypass the 30 minute respawn limit") + log_admin("[key_name(usr)] allowed [key_name(G)] to bypass the 30 minute respawn limit",admin_key=key_name(usr),ckey=key_name(G)) message_admins("Admin [key_name_admin(usr)] allowed [key_name_admin(G)] to bypass the 30 minute respawn limit", 1) @@ -325,7 +325,7 @@ proc/get_ghosts(var/notify = 0,var/what = 2, var/client/C = null) src << "\blue AntagHUD usage has been enabled" - log_admin("[key_name(usr)] has [action] antagHUD usage for observers") + log_admin("[key_name(usr)] has [action] antagHUD usage for observers",admin_key=key_name(usr)) message_admins("Admin [key_name_admin(usr)] has [action] antagHUD usage for observers", 1) @@ -353,7 +353,7 @@ proc/get_ghosts(var/notify = 0,var/what = 2, var/client/C = null) config.antag_hud_restricted = 1 src << "\red AntagHUD restrictions have been enabled" - log_admin("[key_name(usr)] has [action] on joining the round if they use AntagHUD") + log_admin("[key_name(usr)] has [action] on joining the round if they use AntagHUD",admin_key=key_name(usr)) message_admins("Admin [key_name_admin(usr)] has [action] on joining the round if they use AntagHUD", 1) /* @@ -490,7 +490,7 @@ Traitors and the like can also be revived with the previous role mostly intact. O << "\red " + input + "\red...LAWS UPDATED" O.show_laws() - log_admin("Admin [key_name(usr)] has added a new AI law - [input]") + log_admin("Admin [key_name(usr)] has added a new AI law - [input]",admin_key=key_name(usr)) message_admins("Admin [key_name_admin(usr)] has added a new AI law - [input]", 1) var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No") @@ -512,7 +512,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(config.allow_admin_rev) M.revive() - log_admin("[key_name(usr)] healed / revived [key_name(M)]") + log_admin("[key_name(usr)] healed / revived [key_name(M)]",admin_key=key_name(usr),ckey=key_name(M)) message_admins("\red Admin [key_name_admin(usr)] healed / revived [key_name_admin(M)]!", 1) else alert("Admin revive disabled") @@ -576,7 +576,7 @@ Traitors and the like can also be revived with the previous role mostly intact. world << "\red New [company_name] Update available at all communication consoles." world << sound('sound/AI/commandreport.ogg') - log_admin("[key_name(src)] has created a command report: [reportbody]") + log_admin("[key_name(src)] has created a command report: [reportbody]",admin_key=key_name(usr)) message_admins("[key_name_admin(src)] has created a command report", 1) feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -600,7 +600,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/mob/dead/observer/M = O if (M.client && alert(src, "They are still connected. Are you sure, they will loose connection.", "Confirmation", "Yes", "No") != "Yes") return - log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])") + log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])",,admin_key=key_name(usr)) message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])", 1) feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -643,7 +643,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return explosion(O, devastation, heavy, light, flash) - log_admin("[key_name(usr)] created an explosion ([devastation],[heavy],[light],[flash]) at ([O.x],[O.y],[O.z])") + log_admin("[key_name(usr)] created an explosion ([devastation],[heavy],[light],[flash]) at ([O.x],[O.y],[O.z])",admin_key=key_name(usr)) message_admins("[key_name_admin(usr)] created an explosion ([devastation],[heavy],[light],[flash]) at ([O.x],[O.y],[O.z])", 1) feedback_add_details("admin_verb","EXPL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -664,7 +664,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if (heavy || light) empulse(O, heavy, light) - log_admin("[key_name(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])") + log_admin("[key_name(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])",admin_key=key_name(usr)) message_admins("[key_name_admin(usr)] created an EM PUlse ([heavy],[light]) at ([O.x],[O.y],[O.z])", 1) feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -683,7 +683,7 @@ Traitors and the like can also be revived with the previous role mostly intact. //Due to the delay here its easy for something to have happened to the mob if(!M) return - log_admin("[key_name(usr)] has gibbed [key_name(M)]") + log_admin("[key_name(usr)] has gibbed [key_name(M)]",admin_key=key_name(usr),ckey=key_name(M)) message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]", 1) if(istype(M, /mob/dead/observer)) @@ -704,7 +704,7 @@ Traitors and the like can also be revived with the previous role mostly intact. else mob.gib() - log_admin("[key_name(usr)] used gibself.") + log_admin("[key_name(usr)] used gibself.",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] used gibself.", 1) feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /* @@ -819,7 +819,7 @@ Traitors and the like can also be revived with the previous role mostly intact. else view = world.view - log_admin("[key_name(usr)] changed their view range to [view].") + log_admin("[key_name(usr)] changed their view range to [view].",admin_key=key_name(usr)) //message_admins("\blue [key_name_admin(usr)] changed their view range to [view].", 1) //why? removed by order of XSI feedback_add_details("admin_verb","CVRA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -853,7 +853,7 @@ Traitors and the like can also be revived with the previous role mostly intact. feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] admin-called the emergency shuttle.") + log_admin("[key_name(usr)] admin-called the emergency shuttle.",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] admin-called the emergency shuttle.", 1) return @@ -870,7 +870,7 @@ Traitors and the like can also be revived with the previous role mostly intact. emergency_shuttle.recall() feedback_add_details("admin_verb","CCSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] admin-recalled the emergency shuttle.") + log_admin("[key_name(usr)] admin-recalled the emergency shuttle.",admin_key=key_name(usr)) message_admins("\blue [key_name_admin(usr)] admin-recalled the emergency shuttle.", 1) return @@ -886,7 +886,7 @@ Traitors and the like can also be revived with the previous role mostly intact. emergency_shuttle.deny_shuttle = !emergency_shuttle.deny_shuttle - log_admin("[key_name(src)] has [emergency_shuttle.deny_shuttle ? "denied" : "allowed"] the shuttle to be called.") + log_admin("[key_name(src)] has [emergency_shuttle.deny_shuttle ? "denied" : "allowed"] the shuttle to be called.",admin_key=key_name(usr)) message_admins("[key_name_admin(usr)] has [emergency_shuttle.deny_shuttle ? "denied" : "allowed"] the shuttle to be called.") /client/proc/cmd_admin_attack_log(mob/M as mob in mob_list) @@ -921,7 +921,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(notifyplayers == "Cancel") return - log_admin("Admin [key_name(src)] has forced the players to have random appearances.") + log_admin("Admin [key_name(src)] has forced the players to have random appearances.",admin_key=key_name(usr)) message_admins("Admin [key_name_admin(usr)] has forced the players to have random appearances.", 1) if(notifyplayers == "Yes") @@ -975,7 +975,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(usr)] sent a tip of the round.") - log_admin("[key_name(usr)] sent \"[input]\" as the Tip of the Round.") + log_admin("[key_name(usr)] sent \"[input]\" as the Tip of the Round.",admin_key=key_name(usr)) feedback_add_details("admin_verb","TIP") /client/proc/show_tip() @@ -994,5 +994,5 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(usr)] sent a pregenerated tip of the round.") - log_admin("[key_name(usr)] sent a pregenerated Tip of the Round.") + log_admin("[key_name(usr)] sent a pregenerated Tip of the Round.",admin_key=key_name(usr)) feedback_add_details("admin_verb","FAP") \ No newline at end of file diff --git a/code/modules/admin/verbs/ticklag.dm b/code/modules/admin/verbs/ticklag.dm index 9a42c9862aa..a87f0ebf20f 100644 --- a/code/modules/admin/verbs/ticklag.dm +++ b/code/modules/admin/verbs/ticklag.dm @@ -10,7 +10,7 @@ var/newtick = input("Sets a new tick lag. Please don't mess with this too much! The stable, time-tested ticklag value is 0.9","Lag of Tick", world.tick_lag) as num|null //I've used ticks of 2 before to help with serious singulo lags if(newtick && newtick <= 2 && newtick > 0) - log_admin("[key_name(src)] has modified world.tick_lag to [newtick]", 0) + log_admin("[key_name(src)] has modified world.tick_lag to [newtick]", admin_key=key_name(src)) message_admins("[key_name(src)] has modified world.tick_lag to [newtick]", 0) world.tick_lag = newtick feedback_add_details("admin_verb","TICKLAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/warning.dm b/code/modules/admin/verbs/warning.dm index 6889d487c2b..2991164a96a 100644 --- a/code/modules/admin/verbs/warning.dm +++ b/code/modules/admin/verbs/warning.dm @@ -378,7 +378,7 @@ deleteQuery.Execute(query_details, 1) message_admins("\blue [key_name_admin(usr)] deleted one of [ckey]'s warnings.") - log_admin("[key_name(usr)] deleted one of [ckey]'s warnings.") + log_admin("[key_name(usr)] deleted one of [ckey]'s warnings.", admin_key=key_name(usr), ckey=ckey) else usr << "Cancelled" return @@ -395,7 +395,7 @@ reason_query.Execute(query_details, 1) message_admins("\blue [key_name_admin(usr)] edited one of [ckey]'s warning reasons.") - log_admin("[key_name(usr)] edited one of [ckey]'s warning reasons.") + log_admin("[key_name(usr)] edited one of [ckey]'s warning reasons.", admin_key=key_name(usr), ckey=ckey) if("editNotes") query_details += ":new_notes" @@ -409,4 +409,4 @@ notes_query.Execute(query_details, 1) message_admins("\blue [key_name_admin(usr)] edited one of [ckey]'s warning notes.") - log_admin("[key_name(usr)] edited one of [ckey]'s warning notes.") + log_admin("[key_name(usr)] edited one of [ckey]'s warning notes.", admin_key=key_name(usr), ckey=ckey) diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index a3c54a378ff..68c259f5c34 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -20,6 +20,12 @@ message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].") M.fully_replace_character_name(M.real_name,new_name) + + if (issilicon(M) && alert(usr, "Synth detected. Would you like to run rename silicon verb automatically?",, "Yes", "No") == "Yes") + var/mob/living/silicon/S = M + S.SetName(new_name) + to_chat(usr, span("notice", "Silicon properly renamed.")) + href_list["datumrefresh"] = href_list["rename"] else if(href_list["varnameedit"] && href_list["datumedit"]) @@ -194,7 +200,7 @@ if(!i) usr << "No objects of this type exist" return - log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted)") + log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted)", admin_key=key_name(usr)) message_admins("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted)") if("Type and subtypes") var/i = 0 @@ -208,7 +214,7 @@ if(!i) usr << "No objects of this type exist" return - log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)") + log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)", admin_key=key_name(usr)) message_admins("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)") else if(href_list["explode"]) @@ -485,7 +491,7 @@ usr << "Resource files sent" H << "Your NanoUI Resource files have been refreshed" - log_admin("[key_name(usr)] resent the NanoUI resource files to [key_name(H)] ") + log_admin("[key_name(usr)] resent the NanoUI resource files to [key_name(H)] ", admin_key=key_name(usr), ckey=key_name(H)) else if(href_list["regenerateicons"]) if(!check_rights(0)) return @@ -522,7 +528,7 @@ return if(amount != 0) - log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L]") + log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L]", admin_key=key_name(usr), ckey=key_name(L)) message_admins("[key_name(usr)] dealt [amount] amount of [Text] damage to [L]") href_list["datumrefresh"] = href_list["mobToDamage"] diff --git a/code/modules/antag_contest/contest_verbs.dm b/code/modules/antag_contest/contest_verbs.dm index b731e85808a..b9dc3a85b03 100644 --- a/code/modules/antag_contest/contest_verbs.dm +++ b/code/modules/antag_contest/contest_verbs.dm @@ -215,7 +215,7 @@ new_objective.owner = src.mob.mind src.mob.mind.objectives += new_objective src << "New objective assigned! Have fun, and roleplay well!" - log_admin("CONTEST: [key_name(src)] has assigned themselves an objective: [new_objective.type].") + log_admin("CONTEST: [key_name(src)] has assigned themselves an objective: [new_objective.type].", ckey=key_name(src)) return else src << "This character hasn't been set up to participate! Consult an admin or change this yourself!" diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 021216f2181..c29731c677f 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -211,6 +211,15 @@ return 1 +/obj/item/device/assembly_holder/New() + ..() + listening_objects += src + +/obj/item/device/assembly_holder/Destroy() + listening_objects -= src + return ..() + + /obj/item/device/assembly_holder/hear_talk(mob/living/M as mob, msg, verb, datum/language/speaking) if(a_right) a_right.hear_talk(M,msg,verb,speaking) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index b28b0f46b46..06acb04d7ec 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -248,6 +248,8 @@ /obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj) if(istype(AM, /obj/effect/beam)) return + if( (AM.invisibility == INVISIBILITY_OBSERVER) || (AM.invisibility == 101) ) + return spawn(0) hit() return diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 7e8c89cc796..eac18f4afd1 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -7,6 +7,14 @@ var/listening = 0 var/recorded //the activation message +/obj/item/device/assembly/voice/New() + ..() + listening_objects += src + +/obj/item/device/assembly/voice/Destroy() + listening_objects -= src + return ..() + /obj/item/device/assembly/voice/hear_talk(mob/living/M as mob, msg) if(listening) recorded = msg @@ -33,4 +41,4 @@ /obj/item/device/assembly/voice/toggle_secure() . = ..() - listening = 0 \ No newline at end of file + listening = 0 diff --git a/code/modules/cargo/randomstock.dm b/code/modules/cargo/randomstock.dm index 1efaea7d4f3..35c879741cb 100644 --- a/code/modules/cargo/randomstock.dm +++ b/code/modules/cargo/randomstock.dm @@ -115,7 +115,7 @@ var/list/global/random_stock_common = list( "cosmetic" = 2.2, "suitcooler" = 1.2, "officechair" = 1.2, - "booze" = 3.5, + "booze" = 3.7, "plant" = 3.5, "bag" = 2, "extinguish" = 2.2, @@ -134,7 +134,6 @@ var/list/global/random_stock_common = list( "paicard" = 2, "phoronsheets" = 2, "hide" = 1, - "paint" = 0.5, "nothing" = 0) var/list/global/random_stock_uncommon = list( @@ -796,7 +795,7 @@ var/list/global/random_stock_large = list( break new /obj/structure/bed/chair/office/dark(T) if ("booze") - if (prob(8))//Spare keg of beer + if (prob(8))//Spare keg of beer or xuizi juice var/turf/T = get_turf(L) if (!turf_clear(T)) for (var/turf/U in range(T,1)) @@ -804,7 +803,10 @@ var/list/global/random_stock_large = list( T = U break - new /obj/structure/reagent_dispensers/beerkeg(T) + if (prob(80)) + new /obj/structure/reagent_dispensers/beerkeg(T) + else + new /obj/structure/reagent_dispensers/xuizikeg(T) else var/list/drinks = typesof(/obj/item/weapon/reagent_containers/food/drinks/bottle) drinks -= /obj/item/weapon/reagent_containers/food/drinks/bottle @@ -988,67 +990,6 @@ var/list/global/random_stock_large = list( if ("hide") new /obj/item/stack/material/animalhide(L, rand(5,50)) - - if ("paint") - var/list/paints = list( - /obj/item/weapon/reagent_containers/glass/paint/red, - /obj/item/weapon/reagent_containers/glass/paint/yellow, - /obj/item/weapon/reagent_containers/glass/paint/green, - /obj/item/weapon/reagent_containers/glass/paint/blue, - /obj/item/weapon/reagent_containers/glass/paint/purple, - /obj/item/weapon/reagent_containers/glass/paint/black, - /obj/item/weapon/reagent_containers/glass/paint/white - ) - var/type = pick(paints) - new type(L) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //Uncommon items below here @@ -1442,53 +1383,6 @@ var/list/global/random_stock_large = list( new /obj/random/coin(L) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //Rare items below here: //============================================================= //============================================================= @@ -1632,59 +1526,6 @@ var/list/global/random_stock_large = list( new type(L) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //Large items go below here //============================================================= //============================================================= @@ -1819,7 +1660,7 @@ var/list/global/random_stock_large = list( if ("bike") new /obj/vehicle/bike(L) - + if ("sol") if (prob(50)) new /obj/structure/closet/sol/navy(L) diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 3d66037bd16..2478287170d 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -6,8 +6,13 @@ var/datum/admins/deadmin_holder = null var/buildmode = 0 + /////////////////// + //SPAM PROTECTION// + /////////////////// var/last_message = "" //Contains the last message sent by this client - used to protect against copy-paste spamming. var/last_message_count = 0 //contins a number of how many times a message identical to last_message was sent. + var/last_message_time + var/spam_alert = 0 ///////// //OTHER// @@ -31,6 +36,7 @@ //SECURITY// //////////// var/next_allowed_topic_time = 10 + var/info_sent = 0 // comment out the line below when debugging locally to enable the options & messages menu //control_freak = 1 @@ -59,4 +65,4 @@ var/turf/previous_turf = null var/obj/screen/plane_master/parallax_master/parallax_master = null var/obj/screen/plane_master/parallax_dustmaster/parallax_dustmaster = null - var/obj/screen/plane_master/parallax_spacemaster/parallax_spacemaster = null \ No newline at end of file + var/obj/screen/plane_master/parallax_spacemaster/parallax_spacemaster = null diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 5c67ae30d10..b2edde4e29b 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -25,7 +25,12 @@ return if (href_list["EMERG"] && href_list["EMERG"] == "action") - handle_connection_info(src, href_list["data"]) + if (!info_sent) + handle_connection_info(src, href_list["data"]) + info_sent = 1 + else + server_greeting.close_window(src, "Your greeting window has malfunctioned and has been shut down.") + return //Reduces spamming of links by dropping calls that happen during the delay period @@ -197,19 +202,35 @@ ..() //redirect to hsrc.() /client/proc/handle_spam_prevention(var/message, var/mute_type) - if(config.automute_on && !holder && src.last_message == message) - src.last_message_count++ - if(src.last_message_count >= SPAM_TRIGGER_AUTOMUTE) - src << "\red You have exceeded the spam filter limit for identical messages. An auto-mute was applied." - cmd_admin_mute(src.mob, mute_type, 1) - return 1 - if(src.last_message_count >= SPAM_TRIGGER_WARNING) - src << "\red You are nearing the spam filter limit for identical messages." - return 0 - else - last_message = message - src.last_message_count = 0 - return 0 + if (config.automute_on && !holder) + if (last_message_time) + if (world.time - last_message_time < 5) + spam_alert++ + if (spam_alert > 3) + if (!(prefs.muted & mute_type)) + cmd_admin_mute(src.mob, mute_type, 1) + + src << "You have tripped the macro filter. An auto-mute was applied." + last_message_time = world.time + return 1 + else + spam_alert = max(0, spam_alert--) + + last_message_time = world.time + + if(!isnull(message) && last_message == message) + last_message_count++ + if(last_message_count >= SPAM_TRIGGER_AUTOMUTE) + src << "\red You have exceeded the spam filter limit for identical messages. An auto-mute was applied." + cmd_admin_mute(src.mob, mute_type, 1) + return 1 + if(last_message_count >= SPAM_TRIGGER_WARNING) + src << "\red You are nearing the spam filter limit for identical messages." + return 0 + + last_message = message + last_message_count = 0 + return 0 //This stops files larger than UPLOAD_LIMIT being sent from client to server via input(), client.Import() etc. /client/AllowUpload(filename, filelength) @@ -273,7 +294,7 @@ prefs.last_id = computer_id //these are gonna be used for banning . = ..() //calls mob.Login() - + prefs.sanitize_preferences() if (byond_version < config.client_error_version) @@ -434,46 +455,8 @@ 'html/bootstrap/css/bootstrap.min.css', 'html/bootstrap/js/bootstrap.min.js', 'html/jquery/jquery-2.0.0.min.js', - 'html/iestats/ie-truth.min.js', - 'icons/pda_icons/pda_atmos.png', - 'icons/pda_icons/pda_back.png', - 'icons/pda_icons/pda_bell.png', - 'icons/pda_icons/pda_blank.png', - 'icons/pda_icons/pda_boom.png', - 'icons/pda_icons/pda_bucket.png', - 'icons/pda_icons/pda_crate.png', - 'icons/pda_icons/pda_cuffs.png', - 'icons/pda_icons/pda_eject.png', - 'icons/pda_icons/pda_exit.png', - 'icons/pda_icons/pda_flashlight.png', - 'icons/pda_icons/pda_honk.png', - 'icons/pda_icons/pda_mail.png', - 'icons/pda_icons/pda_medical.png', - 'icons/pda_icons/pda_menu.png', - 'icons/pda_icons/pda_mule.png', - 'icons/pda_icons/pda_notes.png', - 'icons/pda_icons/pda_power.png', - 'icons/pda_icons/pda_rdoor.png', - 'icons/pda_icons/pda_reagent.png', - 'icons/pda_icons/pda_refresh.png', - 'icons/pda_icons/pda_scanner.png', - 'icons/pda_icons/pda_signaler.png', - 'icons/pda_icons/pda_status.png', - 'icons/spideros_icons/sos_1.png', - 'icons/spideros_icons/sos_2.png', - 'icons/spideros_icons/sos_3.png', - 'icons/spideros_icons/sos_4.png', - 'icons/spideros_icons/sos_5.png', - 'icons/spideros_icons/sos_6.png', - 'icons/spideros_icons/sos_7.png', - 'icons/spideros_icons/sos_8.png', - 'icons/spideros_icons/sos_9.png', - 'icons/spideros_icons/sos_10.png', - 'icons/spideros_icons/sos_11.png', - 'icons/spideros_icons/sos_12.png', - 'icons/spideros_icons/sos_13.png', - 'icons/spideros_icons/sos_14.png' - ) + 'html/iestats/ie-truth.min.js' + ) /mob/proc/MayRespawn() return 0 diff --git a/code/modules/client/preference_setup/antagonism/01_candidacy.dm b/code/modules/client/preference_setup/antagonism/01_candidacy.dm index 6147a905b52..346b3c4ea27 100644 --- a/code/modules/client/preference_setup/antagonism/01_candidacy.dm +++ b/code/modules/client/preference_setup/antagonism/01_candidacy.dm @@ -35,10 +35,11 @@ /datum/category_item/player_setup_item/antagonism/candidacy/content(var/mob/user) . += "Special Role Availability:
" . += "" + var/is_global_banned = jobban_isbanned(preference_mob(), "Antagonist") for(var/antag_type in all_antag_types) var/datum/antagonist/antag = all_antag_types[antag_type] . += "
[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 = "[speaker.say_quote(message)], \"[message]\"" 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 = "
Security Record

" 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
Security Data

\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
Comments/Log

" + P.info += "
\n
Security Data

\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
Comments/Log

" 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 = "
Medical Record

" 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
Medical Data

\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
Comments/Log

" + + info += "
\n
Medical Data

\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
Comments/Log

" 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 . +* +*/ +/* + + @===================================@ + | | + | Guide to UDP Data Shipping | + | | + @===================================@ + + You can easily send UDP Data via the UDPSHipper.dll + + Simply use the call() function to call the udp shipper DLL and enter your details! + + The first bit of code needed will always be the same, You will never have to touch this, Copy-pasta all you like: + + call("UDPShipper.dll", "send_udp_data") + + Well thats the first part, the harder part is to input the details into DLL. Lets do that now! The syntax to add arguments to the post request is: + + call("UDPShipper.dll", "send_udp_data")(DestinationIP, DestinationPort, Data) + + DLL Written by Arrow768 +*/ + +/* + * A generic proc for sending udp request with the aforementioned .DLL files. + * Expected arg structure: + * 1st arg - the destination ip + * 2nd arg - the destination port + * 3rd arg - The Data to send + * + * @return int - Error code + * -1 indicates proc or library failure. + * + */ +/proc/send_udp_data() + if (args.len < 3) + return -1 + + var/result = call("UDPShipper.dll", "send_udp_data")(arglist(args)) + + return result + +/proc/send_gelf_log(short_message="", long_message="", level = 5, category="", additional_data=list()) + if (!config) + return 100 + if (!config.log_gelf_enabled) + return 101 + var/list/log_data = list() + log_data["version"] = "1.1" + log_data["host"] = world.name + log_data["short_message"] = html_encode(short_message) + log_data["long_message"] = html_encode(long_message) + log_data["level"] = level + log_data["_category"] = category + log_data["_game_id"] = game_id + + log_data.Add(additional_data) + var/gelf_log = json_encode(log_data) + return send_udp_data(config.log_gelf_ip,config.log_gelf_port,gelf_log) + +/obj/item/device/udp_debugger + name = "udp_debugger" + desc = "Used to debug UDP Data sent to the log server." + icon = 'icons/obj/hacktool.dmi' + icon_state = "hacktool-g" + force = 5.0 + w_class = 2.0 + throwforce = 5.0 + throw_range = 15 + throw_speed = 3 + desc = "You can use this to debug sending udp logs to the log server" + +/obj/item/device/udp_debugger/proc/raw(ip=config.log_gelf_ip,port=config.log_gelf_port,data="RAW Test String") + return send_udp_data(ip,port,data) + +/obj/item/device/udp_debugger/proc/gelf(short_message="", long_message="", level = 1) + return send_gelf_log(short_message, long_message, level) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 3578098f7d4..3238d4afc98 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -165,7 +165,7 @@ D << "\red \b You ran over [H]!" visible_message("\red \The [src] ran over [H]!") attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey]), driven by [D.name] ([D.ckey])") - msg_admin_attack("[D.name] ([D.ckey]) ran over [H.name] ([H.ckey]). (JMP)") + msg_admin_attack("[D.name] ([D.ckey]) ran over [H.name] ([H.ckey]). (JMP)",ckey=key_name(D),ckey_target=key_name(H)) else attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey])") diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index d6c0b934e1c..e4f6935657b 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -55,7 +55,7 @@ if(istype(load, /mob/living/carbon/human)) var/mob/living/D = load D << "\red You hit [M]!" - msg_admin_attack("[D.name] ([D.ckey]) hit [M.name] ([M.ckey]) with [src]. (JMP)") + msg_admin_attack("[D.name] ([D.ckey]) hit [M.name] ([M.ckey]) with [src]. (JMP)",ckey=key_name(D),ckey_target=key_name(M)) //------------------------------------------- diff --git a/code/modules/virus2/admin.dm b/code/modules/virus2/admin.dm index dad0a309255..3cacb8eb18b 100644 --- a/code/modules/virus2/admin.dm +++ b/code/modules/virus2/admin.dm @@ -209,7 +209,7 @@ spawned_viruses += D message_admins("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus (Info)") - log_admin("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus!") + log_admin("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus!",admin_key=key_name(usr),ckey=key_name(infectee)) infect_virus2(infectee, D, forced=1) show_ui(usr) diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 3b569cdae64..703b184a66f 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -35,8 +35,8 @@ em {font-style: normal;font-weight: bold;} .mod_channel {color: #735638; font-weight: bold;} .mod_channel .admin {color: #b82e00; font-weight: bold;} .admin_channel {color: #9611D4; font-weight: bold;} -.cciaasay {color: #521590;} -.devsay {color: #02280D;} +.cciaasay {color: #BD871B;} +.devsay {color: #5C7463;} /* Radio: Misc */ .deadsay {color: #530FAD;} diff --git a/code/world.dm b/code/world.dm index 12278513a3a..e4834d89e92 100644 --- a/code/world.dm +++ b/code/world.dm @@ -201,26 +201,6 @@ var/list/world_api_rate_limit = list() processScheduler.stop() - // Handle runtime condensing here - if (config.log_runtime) - // 0x20 = R_DEBUG. world.dm is compiled at the very start, so the macros aren't declared here yet. - admin_notice("Starting to condense runtimes.", 0x20) - var/input_file = "data/logs/_runtime/[diary_date_string]-runtime.log" - var/output_file = "data/logs/_runtime/[diary_date_string]-runtime-condensed.log" - - var/command = "tools/Runtime Condenser/RuntimeCondenser.exe -q -s [input_file] -d [output_file]" - - if (src.system_type == MS_WINDOWS) - command = replacetext(command, "/", "\\") - - var/exit_code = shell(command) - if (exit_code) - log_debug("RuntimeCondenser.exe exited with error code [exit_code].") - admin_notice("Runtime condensing finished.", 0x20) - - // Sleep until the next tick before proceeding. - sleep(1) - if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite for(var/client/C in clients) C << link("byond://[config.server]") diff --git a/config/example/config.txt b/config/example/config.txt index 6082e8703e9..6685da1a160 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -435,3 +435,8 @@ API_RATE_LIMIT 50 ## IPs that should not be throttled by the API RATE Limiter ## IPs are separated by ; API_RATE_LIMIT_WHITELIST 127.0.0.1 + +## GELF Logging Configuration +LOG_GELF_ENABLED 0 +LOG_GELF_IP 192.168.100.80 +LOG_GELF_PORT 12201 \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index b3abe25e263..f5ef44ab3a1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,162 @@ -->
+

29 April 2017

+

Lohikar updated:

+
    +
  • Fixed an issue where Chauncey's name was not set correctly.
  • +
  • Tweaked the grammar of fox and corgi vocalizations slightly.
  • +
+

LordFowl updated:

+
    +
  • Lobotomy is now a surgical operation. Dislocated brains can also be lobotomized. Lobotomy will permanently damage the brain and remove a target's memories.
  • +
  • Placing a brain into an MMI will require a lobotomy to be performed on the brain first.
  • +
+ +

19 April 2017

+

Ccomp5950 updated:

+
    +
  • Objects in bags and other containers (including your hands and pocket) will now hear speach again. This impacts radios, explosive implants, and the universal recorder.
  • +
+ +

14 April 2017

+

Lohikar updated:

+
    +
  • Fixed a bug where RnD machinery with materials inserted could not be disassembled.
  • +
  • The lighting engine and cameras have settled their differences and will work properly together now.
  • +
  • Made a few elements of camera code slightly less completely stupid, camera lag may be slightly lower.
  • +
+

MoondancerPony updated:

+
    +
  • Removed blind IPC clairvoyance. IPCs can no longer see when their optics have been removed.
  • +
  • Industrial IPCs are now officially rated for low-pressure usage.
  • +
+

Nanako updated:

+
    +
  • Fixed a lot of missing safety checks in the kitchen that were allowing mice, ghosts and AIs to do things they shouldnt.
  • +
  • Fixed reagents combining in cooking container that made certain recipes un-creatable. Chemical reactions will no longer happen in cooking containers.
  • +
  • Changed whole eggs to egg yolk instead for a couple of recipes. Also adjusted bread recipe.
  • +
  • AI can now turn cooking appliances on/off with a ctrl+click
  • +
+ +

12 April 2017

+

MoondancerPony updated:

+
    +
  • Taught roboticists how to properly remove IPC organs.
  • +
  • IPC organs are now encased.
  • +
+ +

10 April 2017

+

Lohikar updated:

+
    +
  • Shells have figured out how to put on socks & undershirts. Synth uprising soon.
  • +
  • Repairing holes to space no longer sucks the light out of a room forever.
  • +
  • Footstep sounds now actually work without having to take off your boots.
  • +
  • NanoTrasen has fired several designers in charge of stations' night-mode control systems after it was revealed that they did not actually know how time works.
  • +
  • Red-alert is now kind enough to restore the previous nightmode settings instead of forcing its standards of illumination on the crew.
  • +
+

MoondancerPony updated:

+
    +
  • Eliminated the possibility for 'double-spending' airlock electronics, duplicating boards and allowing you to complete multiple airlocks with one board.
  • +
+ +

08 April 2017

+

MoondancerPony updated:

+
    +
  • Fixed protohumans.
  • +
  • Tajaran subspecies now have their own subspecies of Farwa.
  • +
+

Nanako updated:

+
    +
  • Added butanol, an alcohol that is safe, though largely ineffective, for humans and most species, but highly intoxicating (and safe in moderation) for unathi. Pure butanol is in the chem dispenser, and can be distilled by combining sugar, corn oil and universal enzyme.
  • +
  • Added two new butanol-based drinks, imported from Moghes, they can be found in the bar and rarely in the cargo warehouse.
  • +
  • Added a new tajaran spirit, can be found in the bar fridge and sometimes in the warehouse.
  • +
  • Kegs of beer or xuizi juice can now be ordered at cargo.
  • +
  • Fixed several issues with alcohol effects getting stuck and not wearing off when you sober up.
  • +
  • Reduced the rate at which the liver filters alcohol, making it slightly easier to get drunk and take longer to sober up. Drink responsibly!
  • +
+

Printer16 updated:

+
    +
  • Vampires now know when they finished enthralling someone.
  • +
  • The Auxilliary Forensics Tools crate now spawns with a UV light.
  • +
  • A Malf AI's advanced encryption hack has been given a lot more space to work with.
  • +
+

inselc updated:

+
    +
  • Drones are now able to decompile burnt matches.
  • +
  • Ghosts will no longer trigger infrared emitters.
  • +
  • Transferring chemicals to a chem implant will now show actual amount of reagents transferred.
  • +
  • Relocating your/someone's limb will now properly show a message to all bystanders.
  • +
+ +

03 April 2017

+

Lohikar updated:

+
    +
  • Fixed a bug where holstering didn't quite work right with tactical armor.
  • +
  • Industrial IPC units' eye controller firmware has been upgraded, fixing a bug where a unit's configured eye color would not display.
  • +
+

Nanako updated:

+
    +
  • Fixed some issues where creatures being sacrificed to pylons could bug out.
  • +
+ +

02 April 2017

+

Alberyk updated:

+
    +
  • Increased hp, damage and utility of the dark form spell.
  • +
  • Healing spells should heal more now.
  • +
+

Lohikar updated:

+
    +
  • An error in shell manufacturing processes has been corrected; shell units should now be produced with correct eye and skin coloration.
  • +
  • Industrials now actually have visible eyes.
  • +
  • ERT, CCIA, BSTs, Wizards, and other non-station human-types now no longer skip breakfast before arriving at the station.
  • +
+ +

30 March 2017

+

Lohikar updated:

+
    +
  • The mining ore smelter has received some percussive maintenance from the bluespace technicians and now should process iron and carbon correctly.
  • +
  • Apparently the smelter conveyor belt isn't supposed to lead into a wall.
  • +
+ +

29 March 2017

+

Skull132 updated:

+
    +
  • Robotic internal organ removal surgery now works as intended again.
  • +
+ +

26 March 2017

+

Lohikar updated:

+
    +
  • Smoke no longer causes unexplainable patches of darkness. Thanks oldcode.
  • +
+ +

25 March 2017

+

inselc updated:

+
    +
  • Fixed reagents disappearing from beakers when used to construct circuit imprinters and protolathes.
  • +
  • Fixed fax machines getting stuck on '0 seconds remaining'.
  • +
  • Suspension field generator can now be unwrenched again.
  • +
  • Medical and security record notes formatting fixed to show line breaks for pAI on PDA, and on records in the filing cabinets.
  • +
  • Wallet now showing correct sprite after inserting a guest pass.
  • +
+ +

22 March 2017

+

Lohikar updated:

+
    +
  • An update has been issued for all standard-issue PDAs; users note crew manifest no longer causes crashes.
  • +
+

Nanako updated:

+
    +
  • Slightly reduced the power of cult pylon turrets. This is an iterative process, they will be rebalanced gradually.
  • +
  • Fixed an exploit that allowed duplicating items in vendors and buying more than the vendor has.
  • +
+

Skull132 updated:

+
    +
  • Administrators can now invoke rename-synths verb by normally renaming a character from the VV panel.
  • +
+

19 March 2017

AgentWhatever updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index bf07c82768c..e6e935a7d75 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -4014,3 +4014,134 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. server if the bot is properly set up! VikingPingvin: - rscadd: Added a filter function for departments in the PDA messenger screen. +2017-03-22: + Lohikar: + - bugfix: An update has been issued for all standard-issue PDAs; users note crew + manifest no longer causes crashes. + Nanako: + - tweak: Slightly reduced the power of cult pylon turrets. This is an iterative + process, they will be rebalanced gradually. + - bugfix: Fixed an exploit that allowed duplicating items in vendors and buying + more than the vendor has. + Skull132: + - tweak: Administrators can now invoke rename-synths verb by normally renaming a + character from the VV panel. +2017-03-25: + inselc: + - bugfix: Fixed reagents disappearing from beakers when used to construct circuit + imprinters and protolathes. + - bugfix: Fixed fax machines getting stuck on '0 seconds remaining'. + - bugfix: Suspension field generator can now be unwrenched again. + - bugfix: Medical and security record notes formatting fixed to show line breaks + for pAI on PDA, and on records in the filing cabinets. + - bugfix: Wallet now showing correct sprite after inserting a guest pass. +2017-03-26: + Lohikar: + - bugfix: Smoke no longer causes unexplainable patches of darkness. Thanks oldcode. +2017-03-29: + Skull132: + - bugfix: Robotic internal organ removal surgery now works as intended again. +2017-03-30: + Lohikar: + - bugfix: The mining ore smelter has received some percussive maintenance from the + bluespace technicians and now should process iron and carbon correctly. + - bugfix: Apparently the smelter conveyor belt isn't supposed to lead into a wall. +2017-04-02: + Alberyk: + - tweak: Increased hp, damage and utility of the dark form spell. + - tweak: Healing spells should heal more now. + Lohikar: + - bugfix: An error in shell manufacturing processes has been corrected; shell units + should now be produced with correct eye and skin coloration. + - bugfix: Industrials now actually have visible eyes. + - tweak: ERT, CCIA, BSTs, Wizards, and other non-station human-types now no longer + skip breakfast before arriving at the station. +2017-04-03: + Lohikar: + - bugfix: Fixed a bug where holstering didn't quite work right with tactical armor. + - bugfix: Industrial IPC units' eye controller firmware has been upgraded, fixing + a bug where a unit's configured eye color would not display. + Nanako: + - bugfix: Fixed some issues where creatures being sacrificed to pylons could bug + out. +2017-04-08: + MoondancerPony: + - bugfix: Fixed protohumans. + - rscadd: Tajaran subspecies now have their own subspecies of Farwa. + Nanako: + - rscadd: Added butanol, an alcohol that is safe, though largely ineffective, for + humans and most species, but highly intoxicating (and safe in moderation) for + unathi. Pure butanol is in the chem dispenser, and can be distilled by combining + sugar, corn oil and universal enzyme. + - rscadd: Added two new butanol-based drinks, imported from Moghes, they can be + found in the bar and rarely in the cargo warehouse. + - rscadd: Added a new tajaran spirit, can be found in the bar fridge and sometimes + in the warehouse. + - tweak: Kegs of beer or xuizi juice can now be ordered at cargo. + - bugfix: Fixed several issues with alcohol effects getting stuck and not wearing + off when you sober up. + - tweak: Reduced the rate at which the liver filters alcohol, making it slightly + easier to get drunk and take longer to sober up. Drink responsibly! + Printer16: + - bugfix: Vampires now know when they finished enthralling someone. + - bugfix: The Auxilliary Forensics Tools crate now spawns with a UV light. + - bugfix: A Malf AI's advanced encryption hack has been given a lot more space to + work with. + inselc: + - bugfix: Drones are now able to decompile burnt matches. + - bugfix: Ghosts will no longer trigger infrared emitters. + - bugfix: Transferring chemicals to a chem implant will now show actual amount of + reagents transferred. + - bugfix: Relocating your/someone's limb will now properly show a message to all + bystanders. +2017-04-10: + Lohikar: + - rscadd: Shells have figured out how to put on socks & undershirts. Synth uprising + soon. + - bugfix: Repairing holes to space no longer sucks the light out of a room forever. + - bugfix: Footstep sounds now actually work without having to take off your boots. + - bugfix: NanoTrasen has fired several designers in charge of stations' night-mode + control systems after it was revealed that they did not actually know how time + works. + - tweak: Red-alert is now kind enough to restore the previous nightmode settings + instead of forcing its standards of illumination on the crew. + MoondancerPony: + - bugfix: Eliminated the possibility for 'double-spending' airlock electronics, + duplicating boards and allowing you to complete multiple airlocks with one board. +2017-04-12: + MoondancerPony: + - bugfix: Taught roboticists how to properly remove IPC organs. + - tweak: IPC organs are now encased. +2017-04-14: + Lohikar: + - bugfix: Fixed a bug where RnD machinery with materials inserted could not be disassembled. + - bugfix: The lighting engine and cameras have settled their differences and will + work properly together now. + - tweak: Made a few elements of camera code slightly less completely stupid, camera + lag may be slightly lower. + MoondancerPony: + - bugfix: Removed blind IPC clairvoyance. IPCs can no longer see when their optics + have been removed. + - tweak: Industrial IPCs are now officially rated for low-pressure usage. + Nanako: + - bugfix: Fixed a lot of missing safety checks in the kitchen that were allowing + mice, ghosts and AIs to do things they shouldnt. + - bugfix: Fixed reagents combining in cooking container that made certain recipes + un-creatable. Chemical reactions will no longer happen in cooking containers. + - bugfix: Changed whole eggs to egg yolk instead for a couple of recipes. Also adjusted + bread recipe. + - tweak: AI can now turn cooking appliances on/off with a ctrl+click +2017-04-19: + Ccomp5950: + - bugfix: Objects in bags and other containers (including your hands and pocket) + will now hear speach again. This impacts radios, explosive implants, and the + universal recorder. +2017-04-29: + Lohikar: + - bugfix: Fixed an issue where Chauncey's name was not set correctly. + - spellcheck: Tweaked the grammar of fox and corgi vocalizations slightly. + LordFowl: + - rscadd: Lobotomy is now a surgical operation. Dislocated brains can also be lobotomized. + Lobotomy will permanently damage the brain and remove a target's memories. + - tweak: Placing a brain into an MMI will require a lobotomy to be performed on + the brain first. diff --git a/html/changelogs/Fire-and-Glory - Fire-and-Glory-1.yml b/html/changelogs/Fire-and-Glory - Fire-and-Glory-1.yml new file mode 100644 index 00000000000..51a4868ed40 --- /dev/null +++ b/html/changelogs/Fire-and-Glory - Fire-and-Glory-1.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Fire and Glory + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "Adjusted the Kneebreaker Hammer's throwing mechanics, it can be thrown through the air faster, it no longer instantly kills people when shot out of a cannon." diff --git a/html/changelogs/LordFowl-FixingGogle.yml b/html/changelogs/LordFowl-FixingGogle.yml new file mode 100644 index 00000000000..5ce57b2c5a3 --- /dev/null +++ b/html/changelogs/LordFowl-FixingGogle.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: LordFowl + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Goggles will now blink every 40 seconds, instead of every 4 seconds." diff --git a/html/changelogs/LordFowl-PR-6665.yml b/html/changelogs/LordFowl-PR-6665.yml new file mode 100644 index 00000000000..2bd753b4067 --- /dev/null +++ b/html/changelogs/LordFowl-PR-6665.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: LordFowl + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Wardens now spawn with a box of blank IDs in their locker, for easily profiling criminals that 'lost' their own ID, or never had one." diff --git a/html/changelogs/alberky-PR-2036.yml b/html/changelogs/alberky-PR-2036.yml new file mode 100644 index 00000000000..305c21b7a07 --- /dev/null +++ b/html/changelogs/alberky-PR-2036.yml @@ -0,0 +1,6 @@ +author: Alberyk + +delete-after: True + +changes: + - tweak: "Changed the tajara random name generator to use more lore friendly names." diff --git a/html/changelogs/arrow768-various-changes.yml b/html/changelogs/arrow768-various-changes.yml new file mode 100644 index 00000000000..79477e1bae2 --- /dev/null +++ b/html/changelogs/arrow768-various-changes.yml @@ -0,0 +1,45 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Arrow768 + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Synthetics are no longer able to authorize warrants." + - rscdel: "Removed the bootknive from custom loadouts." + - rscadd: "Added crowbars to the borg modules that were missing them." + - rscdel: "Removed the flashbangs from the lockers and the security vending machine" + - tweak: "Warden access is now required to access the armory" + - rscdel: "Removed the .45s from the armory" + - rscadd: "Officer lockers now contain a .45" + - rscadd: "Added cadet lockers with their essential gear" + - rscadd: "Properly named the cadet uniform" + - tweak: "There are now 4 officer and 2 cadet lockers" \ No newline at end of file diff --git a/html/changelogs/lohikar-PR-1943.yml b/html/changelogs/lohikar-PR-1943.yml deleted file mode 100644 index 1e519ef6fef..00000000000 --- a/html/changelogs/lohikar-PR-1943.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Lohikar -delete-after: True -changes: - - bugfix: "An update has been issued for all standard-issue PDAs; users note crew manifest no longer causes crashes." diff --git a/html/changelogs/lohikar-sounds-1.yml b/html/changelogs/lohikar-sounds-1.yml new file mode 100644 index 00000000000..006b6b9daac --- /dev/null +++ b/html/changelogs/lohikar-sounds-1.yml @@ -0,0 +1,5 @@ +author: Lohikar +delete-after: True +changes: + - soundadd: "NanoTrasen would like to remind employees that the doors have always made a different noise on close. Do not listen to anyone who claims otherwise, they are lying to you." + - soundadd: "Airlock doors now actually make a click sound on bolt instead of yelling 'CLICK' at you." diff --git a/icons/effects/lighting_overlay.dmi b/icons/effects/lighting_overlay.dmi new file mode 100644 index 00000000000..d0d43312a53 Binary files /dev/null and b/icons/effects/lighting_overlay.dmi differ diff --git a/icons/effects/lighting_overlay.png b/icons/effects/lighting_overlay.png deleted file mode 100644 index c7f308204fb..00000000000 Binary files a/icons/effects/lighting_overlay.png and /dev/null differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index d7bc9ad8ba2..8be358bc7ea 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index 26073227936..b88d837d18a 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index ad0146bc12f..b5c29c7cef9 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index c3a7a120df0..9d047ce09be 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/lib/ByondPostDLL/ByondPostDLL.cpp b/lib/ByondPostDLL/ByondPostDLL.cpp index b2807695d9a..1fcc3ec48a2 100644 --- a/lib/ByondPostDLL/ByondPostDLL.cpp +++ b/lib/ByondPostDLL/ByondPostDLL.cpp @@ -14,73 +14,89 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include + +#include "stdafx.h" #include -extern "C" __declspec(dllexport) char *send_post_request(int argc, char *argv[]) +#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport) + +#include +#include +#include +#include + +using namespace std; + +// Global buffer for the GET request callback. +static string getBuffer; + +// Helper function prototypes. Definitions at the bottom. +CURL *SetupCurl(char *url, struct curl_slist *header); +void LogException(exception& e); +static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp); + +EXTERN_DLL_EXPORT char *send_post_request(int argc, char *argv[]) { if (argc < 2) { return "proc=1"; } - curl_global_init(CURL_GLOBAL_DEFAULT); - CURL *curl = curl_easy_init(); - - if (!curl) + // Giant try-catch block, for simplicity sake. + try { - return "proc=2"; + // Initialize variables. + CURL *curl = NULL; + static char return_value[33] = {0}; + long http_code = 0; + CURLcode res; + struct curl_slist *headers = NULL; + + for (int i = 2; i < argc; i++) + { + headers = curl_slist_append(headers, argv[i]); + } + + // Set up cURL. + curl = SetupCurl(argv[0], headers); + + if (!curl) + { + return "proc=2"; + } + + // Set additional cURL options. + curl_easy_setopt(curl, CURLOPT_POST, 1L); + + char *data = argv[1]; + + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); + + // Save the response. + res = curl_easy_perform(curl); + + // Get the response code and save it to http_code. + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + + // Clean up the session info. + curl_global_cleanup(); + + // Create the feedback message. + // Format used is key=value&key=value. + snprintf(return_value, 32, "http=%d&curl=%d", http_code, res); + + return return_value; } - - // Initialize variables. - static char return_value[33] = {0}; - long http_code = 0; - CURLcode res; - struct curl_slist *chunk = NULL; - - for (int i = 2; i < argc; i++) + catch (exception& e) { - chunk = curl_slist_append(chunk, argv[i]); + // Catch any exceptions that are encountered and log them. + LogException(e); + + return "proc=3"; } - - // Set curl options. - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 2L); - curl_easy_setopt(curl, CURLOPT_URL, argv[0]); - - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); - curl_easy_setopt(curl, CURLOPT_POST, 1L); - - char *data = argv[1]; - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); - - // Save the response. - res = curl_easy_perform(curl); - - // Get the response code and save it to http_code. - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); - - // Clean up the session info. - curl_global_cleanup(); - - // Create the feedback message. - // Format used is key=value&key=value. - snprintf(return_value, 32, "http=%d&curl=%d", http_code, res); - - return return_value; } -static std::string getBuffer; - -// Callback function to write into the return string. -static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) -{ - size_t realsize = size * nmemb; - getBuffer.append((char*)contents, realsize); - return realsize; -} - -extern "C" __declspec(dllexport) char *send_get_request(int argc, char *argv[]) +EXTERN_DLL_EXPORT char *send_get_request(int argc, char *argv[]) { // If you're not using this with at least 1 custom header, why /are/ you using it? // Use world.Export() instead you dolt. @@ -89,55 +105,138 @@ extern "C" __declspec(dllexport) char *send_get_request(int argc, char *argv[]) return "proc=1"; } - // A lot of code duplication from send_post_request. But. It's like 2AM. - curl_global_init(CURL_GLOBAL_DEFAULT); - CURL *curl = curl_easy_init(); - - if (!curl) + // Catch any exceptions you find. + try { - return "proc=2"; + // Initialize variables. + getBuffer.clear(); + + CURL *curl = NULL; + long http_code = 0; + CURLcode res; + struct curl_slist *headers = NULL; + + // Generate headers. + for (int i = 1; i < argc; i++) + { + headers = curl_slist_append(headers, argv[i]); + } + + // Initialize cURL. + curl = SetupCurl(argv[0], headers); + + if (!curl) + { + return "proc=2"; + } + + // Set additional options. + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &getBuffer); + + // Save the response. + res = curl_easy_perform(curl); + + // Get the response code and save it to http_code. + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + + // Clean up the session info. + curl_global_cleanup(); + + if (res != CURLE_OK || http_code != 200) + { + static char return_value[33] = { 0 }; + // Create the feedback message. + // Format used is key=value&key=value. + snprintf(return_value, 32, "http=%d&curl=%d", http_code, res); + + return return_value; + } + else + { + // No error, return the body. + return (char *)getBuffer.c_str(); + } } - - // Initialize variables. - getBuffer.clear(); - long http_code = 0; - CURLcode res; - struct curl_slist *chunk = NULL; - - for (int i = 1; i < argc; i++) + catch (exception& e) { - chunk = curl_slist_append(chunk, argv[i]); - } + LogException(e); - // Set curl options. - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 2L); - curl_easy_setopt(curl, CURLOPT_URL, argv[0]); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &getBuffer); - - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); - - // Save the response. - res = curl_easy_perform(curl); - - // Get the response code and save it to http_code. - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); - - // Clean up the session info. - curl_global_cleanup(); - - if (res != CURLE_OK || http_code != 200) - { - static char return_value[33] = {0}; - // Create the feedback message. - // Format used is key=value&key=value. - snprintf(return_value, 32, "http=%d&curl=%d", http_code, res); - - return return_value; - } - else - { - // No error, return the body. - return (char *)getBuffer.c_str(); + return "proc=3"; } } + +/** + * A function to set up a CURL object. + * + * Expects a URL and a header. Header can be NULL. + * Will also run curl_global_init() with default settings. + * + * Will return a pointer to the CURL object. NULL upon failure. + */ +CURL *SetupCurl(char *url, struct curl_slist *header) +{ + CURL *curl = NULL; + + if (!url || !strlen(url)) + { + return NULL; + } + + // Run cURL global init. + curl_global_init(CURL_GLOBAL_DEFAULT); + + // Easy init the thing itself. + curl = curl_easy_init(); + + // Init failed. RIP. + if (!curl) + { + return NULL; + } + + // Set timeout to 2 seconds per request. + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 2L); + + // Set the URL. + curl_easy_setopt(curl, CURLOPT_URL, url); + + // If we have headers, set them. + if (header) + { + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header); + } + + return curl; +} + +/** + * Function for exception logging. + * + * Excepts an exception reference as an argument. + */ +void LogException(exception& e) +{ + ofstream fp; + + fp.open("CURL-ERROR.txt"); + + if (fp.is_open()) + { + fp << e.what() << std::endl; + fp.close(); + } + + return; +} + +/** + * A callback function that cURL uses for writing down request results. + */ +static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) +{ + size_t realsize = size *nmemb; + getBuffer.append((char *)contents, realsize); + + return realsize; +} diff --git a/lib/UDPShipper/UDPShipper.cpp b/lib/UDPShipper/UDPShipper.cpp new file mode 100644 index 00000000000..9560893d272 --- /dev/null +++ b/lib/UDPShipper/UDPShipper.cpp @@ -0,0 +1,70 @@ +/** +* 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 . +* +*/ + +#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport) + +#include "stdafx.h" +#include + +#include "boost/asio.hpp" +using namespace boost::asio; + +// Expects 3 Args: +// Arg 1: Destination IP +// Arg 2: Destination Port +// Arg 3: Message String +EXTERN_DLL_EXPORT const char *send_udp_data(int argc, char *argv[]) +{ + std::ofstream myfile; + + + try + { + if (argc < 3) + { + return "proc=2"; + } + + int port = std::stoi(argv[1]); + + io_service io_service; + ip::udp::socket socket(io_service); + ip::udp::endpoint remote_endpoint; + socket.open(ip::udp::v4()); + + remote_endpoint = ip::udp::endpoint(ip::address::from_string(argv[0]), port); + + boost::system::error_code err; + + size_t request_length = strlen(argv[2]); + + socket.send_to(buffer(argv[2], request_length), remote_endpoint, 0, err); + + socket.close(); + myfile.close(); + return "proc=0"; + } + catch (std::exception& ex) + { + myfile.open("UDP-ERROR.txt"); + myfile << ex.what() << std::endl; + myfile.close(); + return ex.what(); + } +} \ No newline at end of file diff --git a/maps/Aurora-MapDev/aurora-4.dmm b/maps/Aurora-MapDev/aurora-4.dmm index 5b5c32ed5d9..44a70391184 100644 --- a/maps/Aurora-MapDev/aurora-4.dmm +++ b/maps/Aurora-MapDev/aurora-4.dmm @@ -96,7 +96,7 @@ "bR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor/tiled,/area/maintenance/library) "bS" = (/obj/machinery/access_button{command = "cycle_interior"; master_tag = "fuckyou3"; name = "interior access button"; pixel_x = 32; pixel_y = -26},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/maintenance/library) "bT" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/airlock/external{icon_state = "door_locked"; id_tag = "fuckyou3_inner"; locked = 1},/turf/simulated/floor/plating,/area/maintenance/library) -"bU" = (/obj/effect/decal/warning_stripes,/obj/machinery/embedded_controller/radio/airlock/airlock_controller{id_tag = "fuckyou3"; pixel_w = 0; pixel_x = 0; pixel_y = -32; tag_airpump = "fuckyou3_pump"; tag_chamber_sensor = "fuckyou3_sensor"; tag_exterior_door = "fuckyou3_outer"; tag_interior_door = "fuckyou3_inner"},/obj/machinery/airlock_sensor{id_tag = "fuckyou3_sensor"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; id_tag = "fuckyou3_pump"},/obj/machinery/light/small/emergency,/turf/simulated/floor/plating,/area/maintenance/library) +"bU" = (/obj/effect/decal/warning_stripes,/obj/machinery/embedded_controller/radio/airlock/airlock_controller{id_tag = "fuckyou3"; pixel_x = 0; pixel_y = -32; tag_airpump = "fuckyou3_pump"; tag_chamber_sensor = "fuckyou3_sensor"; tag_exterior_door = "fuckyou3_outer"; tag_interior_door = "fuckyou3_inner"},/obj/machinery/airlock_sensor{id_tag = "fuckyou3_sensor"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; id_tag = "fuckyou3_pump"},/obj/machinery/light/small/emergency,/turf/simulated/floor/plating,/area/maintenance/library) "bV" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; id_tag = "fuckyou3_outer"; locked = 1},/turf/simulated/floor/plating,/area/maintenance/library) "bW" = (/obj/machinery/access_button{command = "cycle_exterior"; master_tag = "fuckyou3"; name = "exterior access button"; pixel_x = -32; pixel_y = 26},/turf/simulated/floor/asteroid,/area/mine/unexplored) "bX" = (/obj/structure/grille,/obj/machinery/door/firedoor,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/library) diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 7b6112c3e68..2aa6e5dc186 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -239,9 +239,9 @@ "aeE" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor/plating,/area/maintenance/security_port) "aeF" = (/obj/structure/closet/crate/secure{name = "FOR DISPOSAL"; req_access = list(58)},/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/balaclava,/obj/effect/decal/cleanable/cobweb2,/obj/item/clothing/mask/muzzle,/obj/item/weapon/reagent_containers/syringe/ld50_syringe/choral,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/security_port) "aeG" = (/turf/simulated/wall/r_wall,/area/security/warden) -"aeH" = (/obj/structure/closet/secure_closet/security,/obj/item/device/flashlight/flare,/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/main) +"aeH" = (/obj/structure/closet/secure_closet/security,/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/main) "aeI" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/security/main) -"aeJ" = (/obj/structure/disposalpipe/segment,/obj/structure/closet/secure_closet/security,/obj/item/device/flashlight/flare,/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/main) +"aeJ" = (/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/closet/secure_closet/security_cadet,/turf/simulated/floor/tiled,/area/security/main) "aeK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) "aeL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/main) "aeM" = (/turf/simulated/wall,/area/security/warden) @@ -251,7 +251,7 @@ "aeQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/main) "aeR" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/security/warden) "aeS" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/security/warden) -"aeT" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/crate{name = "security mag lock crate"},/obj/item/device/magnetic_lock/security,/obj/item/device/magnetic_lock/security,/turf/simulated/floor/tiled,/area/security/warden) +"aeT" = (/obj/structure/disposalpipe/segment,/obj/structure/closet/secure_closet/security,/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/main) "aeU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/security/main) "aeV" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/camera/network/security{c_tag = "Security - Equipment North"; dir = 4},/turf/simulated/floor/tiled,/area/security/main) "aeW" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/main) @@ -280,7 +280,7 @@ "aft" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "afu" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape_pod3/station) "afv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/security/warden) -"afw" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Armoury"; req_access = list(2)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/warden) +"afw" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/security/warden) "afx" = (/obj/effect/decal/cleanable/blood/oil,/obj/effect/decal/remains/robot,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/security_port) "afy" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/camera/xray/security{c_tag = "Security Escape Pod"; dir = 8},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "afz" = (/obj/structure/table/rack,/obj/effect/decal/cleanable/dirt,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/security_port) @@ -295,8 +295,8 @@ "afI" = (/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/papershredder,/turf/simulated/floor/tiled,/area/security/main) "afJ" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) "afK" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) -"afL" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/window/brigdoor{dir = 1; name = "Weapons locker"; req_access = list(2)},/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) -"afM" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/machinery/door/window/brigdoor{dir = 1; name = "Weapons locker"; req_access = list(2)},/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) +"afL" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Armoury"; req_access = list(3)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/warden) +"afM" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/closet/crate{name = "security mag lock crate"},/obj/item/device/magnetic_lock/security,/obj/item/device/magnetic_lock/security,/turf/simulated/floor/tiled,/area/security/warden) "afN" = (/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/main) "afO" = (/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1475; listening = 0; name = "Station Intercom (Security)"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/main) "afP" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; dir = 1; freq = 1400; location = "Security"},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/security/main) @@ -328,7 +328,7 @@ "agp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/command{id_tag = "HoSdoor"; name = "Head of Security"; req_access = list(58)},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "agq" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_c (WEST)"; icon_state = "swall_c"; dir = 8},/area/shuttle/escape_pod3/station) "agr" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Warden's Office"; req_access = list(3)},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/security/warden) -"ags" = (/obj/structure/closet/secure_closet/security,/obj/item/device/flashlight/flare,/obj/structure/window/reinforced,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/main) +"ags" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/machinery/door/window/brigdoor{dir = 1; name = "Weapons locker"; req_access = list(2)},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 8},/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/turf/simulated/floor/tiled,/area/security/warden) "agt" = (/obj/structure/closet/wardrobe/red,/obj/structure/window/reinforced,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/turf/simulated/floor/tiled,/area/security/main) "agu" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) "agv" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table/rack,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/security_port) @@ -3989,7 +3989,7 @@ "byK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/chargebay) "byL" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green,/turf/simulated/floor/tiled,/area/assembly/chargebay) "byM" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/assembly/chargebay) -"byN" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/hemostat,/obj/item/weapon/retractor,/obj/effect/floor_decal/corner/white,/turf/simulated/floor/tiled,/area/assembly/robotics) +"byN" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/hemostat,/obj/item/weapon/retractor,/obj/effect/floor_decal/corner/white,/obj/item/weapon/surgicaldrill,/turf/simulated/floor/tiled,/area/assembly/robotics) "byO" = (/obj/structure/grille,/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced/polarized{dir = 4},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/heads/hop) "byP" = (/obj/structure/table/standard,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/obj/item/device/mmi/digital/posibrain,/obj/item/device/robotanalyzer,/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/assembly/robotics) "byQ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop) @@ -4941,7 +4941,7 @@ "bRa" = (/obj/item/weapon/aicard,/obj/item/weapon/aiModule/reset,/obj/structure/table/steel,/turf/simulated/floor/plating,/area/storage/tech) "bRb" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/pandemic{pixel_x = -3; pixel_y = 3},/obj/item/weapon/circuitboard/rdconsole,/obj/item/weapon/circuitboard/destructive_analyzer,/obj/item/weapon/circuitboard/protolathe,/obj/item/weapon/circuitboard/rdserver{pixel_x = 3; pixel_y = -3},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/tech) "bRc" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/security/mining,/obj/item/weapon/circuitboard/autolathe{pixel_x = 3; pixel_y = -3},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/storage/tech) -"bRd" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/arcade,/obj/item/weapon/circuitboard/message_monitor{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech) +"bRd" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/message_monitor{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech) "bRe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/rnd/mixing) "bRf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/mixing) "bRg" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Toxins Launch Room Access"; req_access = list(7)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/mixing) @@ -7140,6 +7140,8 @@ "cHp" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) "cHq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/engineering/engine_room) "cHr" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHs" = (/obj/structure/closet/secure_closet/security,/obj/structure/window/reinforced,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/main) +"cHt" = (/obj/structure/window/reinforced,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/closet/secure_closet/security_cadet,/turf/simulated/floor/tiled,/area/security/main) "cHu" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/airless,/area/solar/port) "cHv" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/plating,/area/engineering/engine_waste) "cHw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_waste) @@ -7446,11 +7448,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaJaafaaracRaasaaaaaracRaasaaaaaracRaasaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaadHadIaceadxacUacUacUacUacCacUadyacVacYacMadaadAadCadBadKadJadMadLadLadLadOadNacsadUadEabdadVadWafsabdaapaapaafaaaaafaaaaapaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaJaafaaracRaasaaaaaracRaasaafaaracRaasaafaafaafaaaaafaafaaaaaaaaaaaaaaaadXadIaceaceadQadPadSadRadYadTaceaceadZacMadaaeaadcaebaehaduadMadLaeaadLaedaecacsadUaekabdabdabdabdabdaapaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaafaafaapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaqaafaaraeeaasaaaaaraeeaasaaaaaraeeaasaafaaaaafaafaafaaaaaaaaaaaaaaaaaaadXaemaceaceaceaceaceaceaefaceaceaceaeiaegaelaejaeoaenaeqaepaesaeraetaeraevaeuacsadDaeBabdaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaeCadIaeDaeEaeFaeGaexaewaezaeyaeAaeMaeIaeHaeJaeHadcaebaeQaeKaeLaeLaeNaeLaePaeOaeWaeXaeYabdaeZaeZaeZaeZaeZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaJafaaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabhadIafbafcafdaeGaexaexaeSaeRaeTaeMaeVaeUaffafeadcafgafmafhacMacMafiacMafkafjacsafrafyabdaftafuaflaflafnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaacaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhabhabhabhabhabhabhabhabhabhabhabhabhadIafxafzagcaeGafpafoafvafqafqafwafBafAafCafAafEafDadzafFafGacMafiacMafIafHafPafQafRafSadEafTafUafVafWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhafXafYafZabhagaagbagvagdageagfaggaggaggaggaggaggaghagiagjagkaeGafKafJaezafLafMaeMafOafNagmaglagoagnagwagxagyagzagpagBagCagxagDagEagFabdadEagGaflaflagqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaabhahcagJaggaggaggagfagfaggagKagLagLagLagLagLagLagLagLagLagLagMaeGaeMagNagragOaeMaeMagtagsagsagsadcaguagVagAagIagHagPagHagIagSagDahbadEabdabdaeZaeZaeZaeZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaeCadIaeDaeEaeFaeGaexaewaezaeyaeAaeMaeIaeHaeTaeJadcaebaeQaeKaeLaeLaeNaeLaePaeOaeWaeXaeYabdaeZaeZaeZaeZaeZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaJafaaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabhadIafbafcafdaeGaexaexaeSaeRafwaeMaeVaeUaffafeadcafgafmafhacMacMafiacMafkafjacsafrafyabdaftafuaflaflafnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaacaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhabhabhabhabhabhabhabhabhabhabhabhabhadIafxafzagcaeGafpafoafvafqafqafLafBafAafCafAafEafDadzafFafGacMafiacMafIafHafPafQafRafSadEafTafUafVafWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhafXafYafZabhagaagbagvagdageagfaggaggaggaggaggaggaghagiagjagkaeGafKafJaezafMagsaeMafOafNagmaglagoagnagwagxagyagzagpagBagCagxagDagEagFabdadEagGaflaflagqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaabhahcagJaggaggaggagfagfaggagKagLagLagLagLagLagLagLagLagLagLagMaeGaeMagNagragOaeMaeMagtcHscHscHtadcaguagVagAagIagHagPagHagIagSagDahbadEabdabdaeZaeZaeZaeZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhaioahdaheaheaheaheaheaheaheagLagTagWagUaheagXagQagYahfahaahgahoagRahhahkahjahmahlahnahnahnahnadcahpahxahqahsahrahuahtahwahvagDahFaiMahyahAahzahBabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahHaaaaaaahHaaaaaaaaaahHaaaaaaaaaaaaaaaahHaaaaaaaaaahHaaaaaaahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhafXafYahIabhahJahKaheahDahCahNahEahLahGagLagUahMahEahPahOahOahOahRahQahTahSahUahUahVahUahXahWacMacMacMaeaadcahYaifahZaibaiaaidaicaigaieagDahFanXaihbZvbZyaiiabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHaaaaaaaaaahHahHahHahHahHahHahHaaaaaaaaaahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHainamMaipabhaiqahKaheaimailaitairaiuaisagLagUahMaivaheaijahOaixagZahOahTaizaiAahUaiBahUahUahiaiDacMacMacMadcaiEaiHaiFagIagIaiyagIagIaiIagDaiLaFtakDakDakDakFabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHaaaaaaahHahHahHahHahHahHahHahHahHaaaaaaahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm index c3c20caa476..2f2ccd35d07 100644 --- a/maps/exodus-5.dmm +++ b/maps/exodus-5.dmm @@ -1564,7 +1564,6 @@ "Ed" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) "Ee" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "mining_outpost_outer"; locked = 1; name = "Mining Dock Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/outpost/mining_main/east_hall) "Ef" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) -"Eg" = (/obj/machinery/conveyor{icon_state = "conveyor0"; dir = 10; id = "mining_internal"},/obj/machinery/mineral/input,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) "Eh" = (/obj/machinery/mineral/stacking_machine,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) "Ei" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/space,/area/space) "Ej" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/mine/explored) @@ -1581,7 +1580,8 @@ "Ey" = (/obj/machinery/mineral/processing_unit_console,/turf/simulated/wall/r_wall,/area/outpost/mining_main/refinery) "EI" = (/turf/simulated/wall/r_wall,/area/outpost/mining_main/east_hall) "EO" = (/obj/machinery/mineral/stacking_unit_console,/turf/simulated/wall/r_wall,/area/outpost/mining_main/refinery) - +"VO" = (/obj/machinery/conveyor{dir = 5; icon_state = "conveyor0"; id = "mining_internal"},/obj/machinery/mineral/input,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1774,7 +1774,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdmRbdbdabababababababababababababababababababababababababbdbdbdbdbdacpBacacacacacacacacDBpXpXpXpXpXpXoAacacacacacacacaaaaaaaaaaaaafCBCBCBCBCBzJAHBxDCAOCnClClClCrCqCqDHEyDIDgCNacacjamRabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdababababababababababababababababababababababababababababbdbdbdbdacpGpFpFpFpFpFpFpFpFDJpFpFpFpFpFpFpFpFDKacacacacacacaaaaaaaaaaafCBCBCBCBCBDLaaBNzIDMCDAOAOAOCFCECGCGCUDPDgCNacacacbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababbdbdbdbdbdababababababababababababababababababababababababababababababababbdbdbdbdacacacacacacacacacacacacacacacacacacactkacpcofacacacpzacaaaaaaCgCBCBCBCBCBCgaaaaaaEIDQBUCLCKDSDRDTEODACTDgCNacacacbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdmRjbDUDWDVDXDWDWDWDYDWDZDZDZDZDZDZDZDZDZDZDZDZEbEaEtAOCSAOCZEcEfEdEhEgDgCNacbdbdbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdmRjbDUDWDVDXDWDWDWDYDWDZDZDZDZDZDZDZDZDZDZDZDZEbEaEtAOCSAOCZEcEfEdEhVODgCNacbdbdbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdacacacmToAacacacpzacafaaaaaaaaaaaaaaaaaaaaaaEiEIAdzJzIAdDgDgDgDgDgDgDgCNacbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdacacacafaaaaaaaaaaaaaaaaaaaaaaEkEjuPuPuPuPuPuPuPuPuPuPuPElacbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdacrJacacaaaaaaaaaaaaaaaaaaaaaaaapzbdbdbdbdbdbdbdbdbdbdbdbdbdbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/nano/templates/digitalwarrant.tmpl b/nano/templates/digitalwarrant.tmpl index cb09637d2a0..bb7ebe0d4c0 100644 --- a/nano/templates/digitalwarrant.tmpl +++ b/nano/templates/digitalwarrant.tmpl @@ -8,7 +8,7 @@ {{/if}} {{if data.type == "search"}}
    - 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}}
    {{/if}} diff --git a/nano/templates/pai_secrecords.tmpl b/nano/templates/pai_secrecords.tmpl index e139034c0de..656a0720a36 100644 --- a/nano/templates/pai_secrecords.tmpl +++ b/nano/templates/pai_secrecords.tmpl @@ -65,7 +65,7 @@ code/modules/mob/living/silicon/pai/software_modules.dm
Important Notes
-
{{:data.security.notes}}
+
{{:data.security.notes}}
{{/if}} diff --git a/nano/templates/pda.tmpl b/nano/templates/pda.tmpl index bdb9f82f7d2..2befc5b0779 100644 --- a/nano/templates/pda.tmpl +++ b/nano/templates/pda.tmpl @@ -654,7 +654,7 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm Details: {{:data.records.medical.alg_d}}

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