From 3afa34db4dd80b9280a18199c0bb9ace54414860 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 26 Apr 2017 07:46:50 -0500 Subject: [PATCH 01/44] new pda sprites --- icons/obj/pda.dmi | Bin 15215 -> 19530 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index 241bb46b98a92760f35f0db8b72fd1edbd91fee0..7897bbb6dd20e35629fd1476432d64007f35e4a3 100644 GIT binary patch literal 19530 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 z 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 literal 15215 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 From be9557b0556cecb62f2a919831bc5ea5163451da Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 26 Apr 2017 08:49:55 -0500 Subject: [PATCH 02/44] updates to newest rev of the icons --- icons/obj/pda.dmi | Bin 19530 -> 28296 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index 7897bbb6dd20e35629fd1476432d64007f35e4a3..d0e2f6845106e0c8be3167c555514e1f79642832 100644 GIT binary patch literal 28296 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 b#}O&te64haePERX0Y7(c-qo$tv5oj2j=EuN literal 19530 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 z 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 From cea81a3357f2df420651fc8615b72c55224401b4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 26 Apr 2017 16:03:17 -0500 Subject: [PATCH 03/44] Initialize Refactor --- code/__DEFINES/qdel.dm | 3 +- code/__DEFINES/subsystems.dm.rej | 18 +++ code/_onclick/hud/screen_objects.dm | 2 +- code/controllers/admin.dm | 4 +- code/controllers/subsystem/atoms.dm | 136 ++++++++++-------- code/controllers/subsystem/atoms.dm.rej | 9 ++ code/game/atoms.dm | 30 ++-- code/game/atoms_movable.dm | 2 +- .../miniantags/abduction/machinery/console.dm | 4 +- .../embedded_controller/access_controller.dm | 12 +- code/game/objects/items.dm.rej | 10 ++ code/game/objects/objs.dm | 2 +- code/game/objects/structures/ladders.dm | 11 +- code/game/turfs/space/space.dm | 2 + code/game/turfs/turf.dm | 1 + code/modules/admin/admin_verbs.dm.rej | 11 ++ code/modules/admin/verbs/debug.dm | 7 + code/modules/holodeck/computer.dm.rej | 47 ++++++ code/modules/mob/dead/dead.dm | 7 +- .../mob/dead/new_player/new_player.dm.rej | 9 ++ code/modules/recycling/conveyor2.dm.rej | 10 ++ code/modules/recycling/disposal-unit.dm | 22 +-- code/modules/shuttle/arrivals.dm.rej | 11 ++ code/modules/surgery/surgery.dm | 2 +- code/modules/surgery/surgery.dm.rej | 10 ++ 25 files changed, 277 insertions(+), 105 deletions(-) create mode 100644 code/__DEFINES/subsystems.dm.rej create mode 100644 code/controllers/subsystem/atoms.dm.rej create mode 100644 code/game/objects/items.dm.rej create mode 100644 code/modules/admin/admin_verbs.dm.rej create mode 100644 code/modules/holodeck/computer.dm.rej create mode 100644 code/modules/mob/dead/new_player/new_player.dm.rej create mode 100644 code/modules/recycling/conveyor2.dm.rej create mode 100644 code/modules/shuttle/arrivals.dm.rej create mode 100644 code/modules/surgery/surgery.dm.rej diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index fe19d7a559..041a6283e7 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -14,5 +14,6 @@ #define GC_QUEUED_FOR_HARD_DEL -2 #define GC_CURRENTLY_BEING_QDELETED -3 -#define QDELETED(X) (!X || X.gc_destroyed) +#define QDELING(X) (X.gc_destroyed) +#define QDELETED(X) (!X || QDELING(X)) #define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) diff --git a/code/__DEFINES/subsystems.dm.rej b/code/__DEFINES/subsystems.dm.rej new file mode 100644 index 0000000000..cf39977224 --- /dev/null +++ b/code/__DEFINES/subsystems.dm.rej @@ -0,0 +1,18 @@ +diff a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm (rejected hunks) +@@ -26,4 +26,13 @@ + + #define INITIALIZE_HINT_NORMAL 0 //Nothing happens + #define INITIALIZE_HINT_LATELOAD 1 //Call LateInitialize +-#define INITIALIZE_HINT_QDEL 2 //Call qdel on the atom +\ No newline at end of file ++#define INITIALIZE_HINT_QDEL 2 //Call qdel on the atom ++ ++//type and all subtypes should always call Initialize in New() ++#define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){\ ++ ..();\ ++ if(!initialized) {\ ++ args[1] = TRUE;\ ++ SSatoms.InitAtom(src, args);\ ++ }\ ++} +\ No newline at end of file diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index a3a60b1f31..81754efc93 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -544,7 +544,7 @@ plane = SPLASHSCREEN_PLANE var/client/holder -/obj/screen/splash/New(client/C, visible, use_previous_title) +/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE holder = C if(!visible) diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm index 99f6a148a4..2be7139a27 100644 --- a/code/controllers/admin.dm +++ b/code/controllers/admin.dm @@ -3,7 +3,9 @@ name = "Initializing..." var/target -/obj/effect/statclick/New(loc, text, target) //Don't port this to Initialize it's too critical +INITIALIZE_IMMEDIATE(/obj/effect/statclick) + +/obj/effect/statclick/Initialize(mapload, text, target) //Don't port this to Initialize it's too critical ..() name = text src.target = target diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index c687a7b0e5..487946696d 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -1,6 +1,7 @@ -#define INITIALIZATION_INSSATOMS 0 //New should not call Initialize -#define INITIALIZATION_INNEW_MAPLOAD 1 //New should call Initialize(TRUE) -#define INITIALIZATION_INNEW_REGULAR 2 //New should call Initialize(FALSE) +#define BAD_INIT_QDEL_BEFORE 1 +#define BAD_INIT_DIDNT_INIT 2 +#define BAD_INIT_SLEPT 4 +#define BAD_INIT_NO_HINT 8 SUBSYSTEM_DEF(atoms) name = "Atoms" @@ -19,64 +20,82 @@ SUBSYSTEM_DEF(atoms) InitializeAtoms() return ..() -/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms = null) +/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms) if(initialized == INITIALIZATION_INSSATOMS) return - initialized = INITIALIZATION_INNEW_MAPLOAD - - var/static/list/NewQdelList = list() - - if(atoms) - for(var/I in atoms) - var/atom/A = I - if(!A.initialized) //this check is to make sure we don't call it twice on an object that was created in a previous Initialize call - if(QDELETED(A)) - if(!(NewQdelList[A.type])) - WARNING("Found new qdeletion in type [A.type]!") - NewQdelList[A.type] = TRUE - continue - var/start_tick = world.time - if(A.Initialize(TRUE)) - LAZYADD(late_loaders, A) - if(start_tick != world.time) - WARNING("[A]: [A.type] slept during it's Initialize!") - CHECK_TICK - testing("Initialized [atoms.len] atoms") - else - #ifdef TESTING - var/count = 0 - #endif - for(var/atom/A in world) - if(!A.initialized) //this check is to make sure we don't call it twice on an object that was created in a previous Initialize call - if(QDELETED(A)) - if(!(NewQdelList[A.type])) - WARNING("Found new qdeletion in type [A.type]!") - NewQdelList[A.type] = TRUE - continue - var/start_tick = world.time - if(A.Initialize(TRUE)) - LAZYADD(late_loaders, A) - #ifdef TESTING - else - ++count - #endif TESTING - if(start_tick != world.time) - WARNING("[A]: [A.type] slept during it's Initialize!") - CHECK_TICK - testing("Roundstart initialized [count] atoms") - - initialized = INITIALIZATION_INNEW_REGULAR - - for(var/I in late_loaders) - var/atom/A = I - var/start_tick = world.time - A.Initialize(FALSE) - if(start_tick != world.time) - WARNING("[A]: [A.type] slept during it's Initialize!") - CHECK_TICK - testing("Late-initialized [LAZYLEN(late_loaders)] atoms") - LAZYCLEARLIST(late_loaders) + initialized = INITIALIZATION_INNEW_MAPLOAD + + LAZYINITLIST(late_loaders) + + var/count + var/list/mapload_arg = list(TRUE) + if(atoms) + created_atoms = list() + count = atoms.len + for(var/I in atoms) + var/atom/A = I + if(!A.initialized) + if(InitAtom(I, mapload_arg)) + atoms -= I + CHECK_TICK + else + count = 0 + for(var/atom/A in world) + if(!A.initialized) + InitAtom(A, mapload_arg) + ++count + CHECK_TICK + + log_world("Initialized [count] atoms") + + initialized = INITIALIZATION_INNEW_REGULAR + + if(late_loaders.len) + for(var/I in late_loaders) + var/atom/A = I + A.LateInitialize() + testing("Late initialized [late_loaders.len] atoms") + late_loaders.Cut() + + if(atoms) + . = created_atoms + atoms + created_atoms = null + +/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments) + var/the_type = A.type + if(QDELING(A)) + BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE + return TRUE + + var/start_tick = world.time + + var/result = A.Initialize(arglist(arguments)) + + if(start_tick != world.time) + BadInitializeCalls[the_type] |= BAD_INIT_SLEPT + + var/qdeleted = FALSE + + if(result != INITIALIZE_HINT_NORMAL) + switch(result) + if(INITIALIZE_HINT_LATELOAD) + if(arguments[1]) //mapload + late_loaders += A + else + A.LateInitialize() + if(INITIALIZE_HINT_QDEL) + qdel(A) + qdeleted = TRUE + else + BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT + + if(!A) //possible harddel + qdeleted = TRUE + else if(!A.initialized) + BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT + + return qdeleted || QDELETED(A) /datum/controller/subsystem/atoms/proc/map_loader_begin() old_initialized = initialized @@ -90,6 +109,7 @@ SUBSYSTEM_DEF(atoms) if(initialized == INITIALIZATION_INNEW_MAPLOAD) InitializeAtoms() old_initialized = SSatoms.old_initialized + BadInitializeCalls = SSatoms.BadInitializeCalls /datum/controller/subsystem/atoms/proc/setupGenetics() var/list/avnums = new /list(DNA_STRUC_ENZYMES_BLOCKS) diff --git a/code/controllers/subsystem/atoms.dm.rej b/code/controllers/subsystem/atoms.dm.rej new file mode 100644 index 0000000000..4d7225164f --- /dev/null +++ b/code/controllers/subsystem/atoms.dm.rej @@ -0,0 +1,9 @@ +diff a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm (rejected hunks) +@@ -12,6 +12,7 @@ SUBSYSTEM_DEF(atoms) + var/old_initialized + + var/list/late_loaders ++ var/list/created_atoms + + var/list/BadInitializeCalls = list() + diff --git a/code/game/atoms.dm b/code/game/atoms.dm index fda74c2ac8..ab0038f7be 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -39,20 +39,21 @@ var/do_initialize = SSatoms.initialized if(do_initialize > INITIALIZATION_INSSATOMS) - if(QDELETED(src)) - CRASH("Found new qdeletion in type [type]!") - var/mapload = do_initialize == INITIALIZATION_INNEW_MAPLOAD - args[1] = mapload - if(Initialize(arglist(args)) && mapload) - LAZYADD(SSatoms.late_loaders, src) + args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD + if(SSatoms.InitAtom(src, args)) + //we were deleted + return + + var/list/created = SSatoms.created_atoms + if(created) + created += src //Called after New if the map is being loaded. mapload = TRUE //Called from base of New if the map is being loaded. mapload = FALSE -//This base must be called or derivatives must set initialized to TRUE to prevent repeat calls -//Derivatives must not sleep -//Returning TRUE while mapload is TRUE will cause the object to be initialized again with mapload = FALSE when everything else is done -//(Useful for things that requires turfs to have air). This base may only be called once, however +//This base must be called or derivatives must set initialized to TRUE +//must not sleep //Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE +//Must return an Initialize hint. Defined in __DEFINES/subsystems.dm //Note: the following functions don't call the base for optimization and must copypasta: // /turf/Initialize @@ -75,7 +76,16 @@ if (opacity && isturf(loc)) var/turf/T = loc T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guaranteed to be on afterwards anyways. + return INITIALIZE_HINT_NORMAL +//called if Initialize returns INITIALIZE_HINT_LATELOAD +//This version shouldn't be called +/atom/proc/LateInitialize() + var/static/list/warned_types = list() + if(!warned_types[type]) + WARNING("Old style LateInitialize behaviour detected in [type]!") + warned_types[type] = TRUE + Initialize(FALSE) /atom/Destroy() if(alternate_appearances) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2d3d19f7c0..acc64fabb0 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -45,7 +45,7 @@ return ..() /atom/movable/Initialize(mapload) - ..() + . = ..() for(var/L in initial_languages) grant_language(L) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index 2a23c37444..27a358081d 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -135,10 +135,10 @@ /obj/machinery/abductor/console/Initialize(mapload) - if(mapload) - return TRUE //wait for machines list ..() + return INITIALIZE_HINT_LATELOAD +/obj/machinery/abductor/console/LateInitialize() if(!team) return diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm index bc8e5972f8..562e2c5b38 100644 --- a/code/game/machinery/embedded_controller/access_controller.dm +++ b/code/game/machinery/embedded_controller/access_controller.dm @@ -19,12 +19,12 @@ /obj/machinery/doorButtons/proc/findObjsByTag() return -/obj/machinery/doorButtons/Initialize(mapload) - if(mapload) - ..() - return TRUE - else - findObjsByTag() +/obj/machinery/doorButtons/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/doorButtons/LateInitialize() + findObjsByTag() /obj/machinery/doorButtons/emag_act(mob/user) if(!emagged) diff --git a/code/game/objects/items.dm.rej b/code/game/objects/items.dm.rej new file mode 100644 index 0000000000..7366e22899 --- /dev/null +++ b/code/game/objects/items.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/objects/items.dm b/code/game/objects/items.dm (rejected hunks) +@@ -102,7 +102,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s + /obj/item/Initialize() + if (!materials) + materials = list() +- ..() ++ . = ..() + for(var/path in actions_types) + new path(src) + actions_types = null diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 4c61b09ca3..e29d372a6c 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -37,7 +37,7 @@ ..() /obj/Initialize() - ..() + . = ..() if (!armor) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) if(on_blueprints && isturf(loc)) diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index ec82b45a1f..5a7988e8d4 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -14,18 +14,15 @@ /obj/structure/ladder/Initialize(mapload) - if(!initialized) - GLOB.ladders += src - ..() - if(mapload) - return TRUE - update_link() + GLOB.ladders += src + ..() + return INITIALIZE_HINT_LATELOAD /obj/structure/ladder/Destroy() GLOB.ladders -= src . = ..() -/obj/structure/ladder/proc/update_link() +/obj/structure/ladder/LateInitialize() for(var/obj/structure/ladder/L in GLOB.ladders) if(L.id == id) if(L.height == (height - 1)) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 6c1e2743cd..a0940eded1 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -42,6 +42,8 @@ if (opacity) has_opaque_atom = TRUE + + return INITIALIZE_HINT_NORMAL /turf/open/space/attack_ghost(mob/dead/observer/user) if(destination_z) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 10eefc4b14..1c2d65355e 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -56,6 +56,7 @@ if (opacity) has_opaque_atom = TRUE + return INITIALIZE_HINT_NORMAL /turf/proc/Initalize_Atmos(times_fired) CalculateAdjacentTurfs() diff --git a/code/modules/admin/admin_verbs.dm.rej b/code/modules/admin/admin_verbs.dm.rej new file mode 100644 index 0000000000..e710d417c2 --- /dev/null +++ b/code/modules/admin/admin_verbs.dm.rej @@ -0,0 +1,11 @@ +diff a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm (rejected hunks) +@@ -153,7 +153,8 @@ var/list/admin_verbs_debug = list( + /client/proc/clear_dynamic_transit, + /client/proc/toggle_medal_disable, + /client/proc/view_runtimes, +- /client/proc/pump_random_event ++ /client/proc/pump_random_event, ++ /client/proc/cmd_display_init_log + ) + var/list/admin_verbs_possess = list( + /proc/possess, diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 54be219a48..c9014da3b0 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -721,6 +721,13 @@ GLOBAL_PROTECT(AdminProcCall) usr << browse(dat, "window=dellog") +/client/proc/cmd_display_init_log() + set category = "Debug" + set name = "Display Initialzie() Log" + set desc = "Displays a list of things that didn't handle Initialize() properly" + + usr << browse(replacetext(SSatoms.InitLog(), "\n", "
"), "window=initlog") + /client/proc/debug_huds(i as num) set category = "Debug" set name = "Debug HUDs" diff --git a/code/modules/holodeck/computer.dm.rej b/code/modules/holodeck/computer.dm.rej new file mode 100644 index 0000000000..7a8dcd75cd --- /dev/null +++ b/code/modules/holodeck/computer.dm.rej @@ -0,0 +1,47 @@ +diff a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm (rejected hunks) +@@ -64,25 +64,26 @@ + ..() + + /obj/machinery/computer/holodeck/Initialize(mapload) +- . = mapload //late-initialize, area_copy need turfs to have air +- if(!mapload) +- ..() +- program_cache = list() +- emag_programs = list() +- for(var/typekey in subtypesof(program_type)) +- var/area/holodeck/A = locate(typekey) +- if(!A || A == offline_program) continue +- if(A.contents.len == 0) continue // not loaded +- if(A.restricted) +- emag_programs += A +- else +- program_cache += A +- if(typekey == init_program) +- load_program(A,force=1) +- if(random_program && program_cache.len && init_program == null) +- load_program(pick(program_cache),force=1) +- else if(!program) +- load_program(offline_program) ++ ..() ++ return INITIALIZE_HINT_LATELOAD ++ ++/obj/machinery/computer/holodeck/LateInitialize() ++ program_cache = list() ++ emag_programs = list() ++ for(var/typekey in subtypesof(program_type)) ++ var/area/holodeck/A = locate(typekey) ++ if(!A || A == offline_program) continue ++ if(A.contents.len == 0) continue // not loaded ++ if(A.restricted) ++ emag_programs += A ++ else ++ program_cache += A ++ if(typekey == init_program) ++ load_program(A,force=1) ++ if(random_program && program_cache.len && init_program == null) ++ load_program(pick(program_cache),force=1) ++ else if(!program) ++ load_program(offline_program) + + /obj/machinery/computer/holodeck/power_change() + ..() diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 81f36bf221..4cc57ca62f 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -1,9 +1,6 @@ //Dead mobs can exist whenever. This is needful -/mob/dead/New(loc) - ..() - if(!initialized) - args[1] = FALSE - Initialize(arglist(args)) //EXIST DAMN YOU!!! + +INITIALIZE_IMMEDIATE(/mob/dead) /mob/dead/dust() //ghosts can't be vaporised. return diff --git a/code/modules/mob/dead/new_player/new_player.dm.rej b/code/modules/mob/dead/new_player/new_player.dm.rej new file mode 100644 index 0000000000..9ebe59e8f8 --- /dev/null +++ b/code/modules/mob/dead/new_player/new_player.dm.rej @@ -0,0 +1,9 @@ +diff a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm (rejected hunks) +@@ -30,6 +30,7 @@ + loc = pick(newplayer_start) + else + loc = locate(1,1,1) ++ return INITIALIZE_HINT_NORMAL + + /mob/dead/new_player/proc/new_player_panel() + diff --git a/code/modules/recycling/conveyor2.dm.rej b/code/modules/recycling/conveyor2.dm.rej new file mode 100644 index 0000000000..328ac26919 --- /dev/null +++ b/code/modules/recycling/conveyor2.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm (rejected hunks) +@@ -220,7 +220,7 @@ + id = newid + update() + +- return INITIALIZE_HINT_LATELOAD ++ return INITIALIZE_HINT_LATELOAD //for machines list + + /obj/machinery/conveyor_switch/LateInitialize() + conveyors = list() diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index 9b1d5e649f..5013d9d879 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -64,17 +64,17 @@ deconstruct() /obj/machinery/disposal/Initialize(mapload) - . = mapload //late-initialize, we need turfs to have air - if(initialized) //will only be run on late mapload initialization - //this will get a copy of the air turf and take a SEND PRESSURE amount of air from it - var/atom/L = loc - var/datum/gas_mixture/env = new - env.copy_from(L.return_air()) - var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1) - air_contents.merge(removed) - trunk_check() - else - ..() + ..() + return INITIALIZE_HINT_LATELOAD //we need turfs to have air + +/obj/machinery/disposal/LateInitialize() + //this will get a copy of the air turf and take a SEND PRESSURE amount of air from it + var/atom/L = loc + var/datum/gas_mixture/env = new + env.copy_from(L.return_air()) + var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1) + air_contents.merge(removed) + trunk_check() /obj/machinery/disposal/attackby(obj/item/I, mob/user, params) add_fingerprint(user) diff --git a/code/modules/shuttle/arrivals.dm.rej b/code/modules/shuttle/arrivals.dm.rej new file mode 100644 index 0000000000..8310a4f3db --- /dev/null +++ b/code/modules/shuttle/arrivals.dm.rej @@ -0,0 +1,11 @@ +diff a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm (rejected hunks) +@@ -30,6 +30,9 @@ + ..() + + preferred_direction = dir ++ return INITIALIZE_HINT_LATELOAD //for latejoin list ++ ++/obj/docking_port/mobile/arrivals/LateInitialize() + areas = list() + + var/list/new_latejoin = list() diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index f9a3b5c0cf..93acbfbb91 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -54,7 +54,7 @@ return new step_type /datum/surgery/proc/complete() - feedback_add_details("surgeries_completed", "[type]") + feedback_add_details("surgeries_completed", type) qdel(src) diff --git a/code/modules/surgery/surgery.dm.rej b/code/modules/surgery/surgery.dm.rej new file mode 100644 index 0000000000..04205e9e66 --- /dev/null +++ b/code/modules/surgery/surgery.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm (rejected hunks) +@@ -54,7 +54,7 @@ + return new step_type + + /datum/surgery/proc/complete() +- feedback_add_details("surgeries_completed", type) ++ feedback_add_details("surgeries_completed", "[type]") + qdel(src) + + From 3a80e3529f38d6f9e2e5edff64a2b935f71c467e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 26 Apr 2017 17:15:44 -0500 Subject: [PATCH 04/44] Fixes chameleon guns projectile --- code/modules/clothing/chameleon.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index b15378c3b3..ce8cbcd04c 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -455,8 +455,7 @@ if(v in blacklisted_vars) continue vars[v] = initial(vars[v]) - if(chambered.BB) - qdel(chambered.BB) + QDEL_NULL(chambered.BB) chambered.newshot() /obj/item/weapon/gun/energy/laser/chameleon/proc/set_chameleon_ammo(obj/item/ammo_casing/AC, passthrough = TRUE, reset = FALSE) From 16ffd5f8dd920461cf158603ddb7386a37006bc8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 26 Apr 2017 17:15:51 -0500 Subject: [PATCH 05/44] Ghosts fresh clones instantly instead of waiting --- code/game/machinery/cloning.dm | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 5773db04be..eeef80ca5b 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -204,11 +204,13 @@ clonemind.transfer_to(H) - H.grab_ghost() - to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
") + if(grab_ghost_when == CLONER_FRESH_CLONE) + H.grab_ghost() + to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
") if(grab_ghost_when == CLONER_MATURE_CLONE) - addtimer(CALLBACK(src, .proc/occupant_dreams), 100) + H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost + to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.") if(H) H.faction |= factions @@ -219,11 +221,6 @@ attempting = FALSE return TRUE -/obj/machinery/clonepod/proc/occupant_dreams() - if(occupant) - to_chat(occupant, "While your body grows, you have the strangest dream, like you can see yourself from the outside.") - occupant.ghostize(TRUE) - //Grow clones to maturity then kick them out. FREELOADERS /obj/machinery/clonepod/process() From 1fcfd0338afbf46cf611323c8dd520b44d493e5b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 26 Apr 2017 17:44:27 -0500 Subject: [PATCH 06/44] Fixes some edges cases in the garbage controller --- code/controllers/subsystem/garbage.dm | 44 ++++++++++++++++----------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 083127c9c3..7d3682cf5f 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -66,6 +66,9 @@ SUBSYSTEM_DEF(garbage) HandleToBeQueued() if(state == SS_RUNNING) HandleQueue() + + if (state == SS_PAUSED) //make us wait again before the next run. + state = SS_RUNNING //If you see this proc high on the profile, what you are really seeing is the garbage collection/soft delete overhead in byond. //Don't attempt to optimize, not worth the effort. @@ -110,24 +113,9 @@ SUBSYSTEM_DEF(garbage) var/type = A.type testing("GC: -- \ref[A] | [type] was unable to be GC'd and was deleted --") didntgc["[type]"]++ - var/time = world.timeofday - var/tick = world.tick_usage - var/ticktime = world.time + HardDelete(A) - tick = (world.tick_usage-tick+((world.time-ticktime)/world.tick_lag*100)) - if (tick > highest_del_tickusage) - highest_del_tickusage = tick - time = world.timeofday - time - if (!time && TICK_DELTA_TO_MS(tick) > 1) - time = TICK_DELTA_TO_MS(tick)/100 - if (time > highest_del_time) - highest_del_time = time - if (time > 10) - log_game("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete)") - message_admins("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete).") - postpone(time/5) - break ++delslasttick ++totaldels else @@ -157,8 +145,28 @@ SUBSYSTEM_DEF(garbage) //this is purely to seperate things profile wise. /datum/controller/subsystem/garbage/proc/HardDelete(datum/A) + var/time = world.timeofday + var/tick = world.tick_usage + var/ticktime = world.time + + var/type = A.type + var/refID = "\ref[A]" + del(A) - + + tick = (world.tick_usage-tick+((world.time-ticktime)/world.tick_lag*100)) + if (tick > highest_del_tickusage) + highest_del_tickusage = tick + time = world.timeofday - time + if (!time && TICK_DELTA_TO_MS(tick) > 1) + time = TICK_DELTA_TO_MS(tick)/100 + if (time > highest_del_time) + highest_del_time = time + if (time > 10) + log_game("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete)") + message_admins("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete).") + postpone(time/5) + /datum/controller/subsystem/garbage/proc/HardQueue(datum/A) if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) tobequeued += A @@ -211,7 +219,7 @@ SUBSYSTEM_DEF(garbage) if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete using a hard reference to save time from the locate() SSgarbage.HardQueue(D) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. - del(D) + SSgarbage.HardDelete(D) if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.QueueForQueuing(D) #ifdef TESTING From a3cd0d980ae17d41d7c7abe7ecb1c71f6148e9dc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 26 Apr 2017 19:29:03 -0500 Subject: [PATCH 07/44] Fixes a bad proc definition --- code/__HELPERS/icons.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 48bf1f3ab9..31e67197a8 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -991,7 +991,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) SET_SECONDARY_FLAG(src, FROZEN) //Assumes already frozed -obj/proc/make_unfrozen() +/obj/proc/make_unfrozen() icon = initial(icon) name = replacetext(name, "frozen ", "") CLEAR_SECONDARY_FLAG(src, FROZEN) From c2de4d175a8b4f3a042a3a9eaf41bbcfe694ac3f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 26 Apr 2017 19:30:08 -0500 Subject: [PATCH 08/44] Anomalous crystal examine and code cleanup --- .../hostile/megafauna/colossus.dm | 134 ++++++++++++------ 1 file changed, 91 insertions(+), 43 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index edcc2eedb7..d822a05886 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -46,7 +46,7 @@ Difficulty: Very Hard del_on_death = 1 medal_type = MEDAL_PREFIX score_type = COLOSSUS_SCORE - loot = list(/obj/machinery/anomalous_crystal/random, /obj/item/organ/vocal_cords/colossus) + loot = list(/obj/effect/spawner/lootdrop/anomalous_crystal, /obj/item/organ/vocal_cords/colossus) butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) deathmessage = "disintegrates, leaving a glowing core in its wake." death_sound = 'sound/magic/demon_dies.ogg' @@ -360,9 +360,20 @@ Difficulty: Very Hard ///Anomolous Crystal/// +#define ACTIVATE_TOUCH "touch" +#define ACTIVATE_SPEECH "speech" +#define ACTIVATE_HEAT "heat" +#define ACTIVATE_BULLET "bullet" +#define ACTIVATE_ENERGY "energy" +#define ACTIVATE_BOMB "bomb" +#define ACTIVATE_MOB_BUMP "bumping" +#define ACTIVATE_WEAPON "weapon" +#define ACTIVATE_MAGIC "magic" + /obj/machinery/anomalous_crystal name = "anomalous crystal" desc = "A strange chunk of crystal, being in the presence of it fills you with equal parts excitement and dread." + var/observer_desc = "Anomalous crystals have descriptions that only observers can see. But this one hasn't been changed from the default." icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "anomaly_crystal" light_range = 8 @@ -370,66 +381,78 @@ Difficulty: Very Hard use_power = 0 density = 1 flags = HEAR - var/activation_method = "touch" + var/activation_method + var/list/possible_methods = list(ACTIVATE_TOUCH, ACTIVATE_SPEECH, ACTIVATE_HEAT, ACTIVATE_BULLET, ACTIVATE_ENERGY, ACTIVATE_BOMB, ACTIVATE_MOB_BUMP, ACTIVATE_WEAPON, ACTIVATE_MAGIC) + var/activation_damage_type = null var/last_use_timer = 0 var/cooldown_add = 30 var/list/affected_targets = list() var/activation_sound = 'sound/effects/break_stone.ogg' -/obj/machinery/anomalous_crystal/New() - activation_method = pick("touch","laser","bullet","energy","bomb","mob_bump","heat","weapon","speech") - ..() +/obj/machinery/anomalous_crystal/Initialize(mapload) + . = ..() + if(!activation_method) + activation_method = pick(possible_methods) + +/obj/machinery/anomalous_crystal/examine(mob/user) + . = ..() + if(isobserver(user)) + to_chat(user, observer_desc) + to_chat(user, "It is activated by [activation_method].") /obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans) ..() if(isliving(speaker)) - ActivationReaction(speaker,"speech") + ActivationReaction(speaker, ACTIVATE_SPEECH) /obj/machinery/anomalous_crystal/attack_hand(mob/user) ..() - ActivationReaction(user,"touch") + ActivationReaction(user, ACTIVATE_TOUCH) /obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, params) if(I.is_hot()) - ActivationReaction(user,"heat") + ActivationReaction(user, ACTIVATE_HEAT) else - ActivationReaction(user,"weapon") + ActivationReaction(user, ACTIVATE_WEAPON) ..() /obj/machinery/anomalous_crystal/bullet_act(obj/item/projectile/P, def_zone) ..() if(istype(P, /obj/item/projectile/magic)) - ActivationReaction(P.firer, "magic", P.damage_type) + ActivationReaction(P.firer, ACTIVATE_MAGIC, P.damage_type) return ActivationReaction(P.firer, P.flag, P.damage_type) /obj/machinery/anomalous_crystal/proc/ActivationReaction(mob/user, method, damtype) if(world.time < last_use_timer) - return 0 + return FALSE if(activation_damage_type && activation_damage_type != damtype) - return 0 + return FALSE if(method != activation_method) - return 0 + return FALSE last_use_timer = (world.time + cooldown_add) playsound(user, activation_sound, 100, 1) - return 1 + return TRUE /obj/machinery/anomalous_crystal/Bumped(atom/AM as mob|obj) ..() if(ismob(AM)) - ActivationReaction(AM,"mob_bump") + ActivationReaction(AM, ACTIVATE_MOB_BUMP) /obj/machinery/anomalous_crystal/ex_act() - ActivationReaction(null,"bomb") + ActivationReaction(null, ACTIVATE_BOMB) -/obj/machinery/anomalous_crystal/random/New()//Just a random crysal spawner for loot - var/random_crystal = pick(typesof(/obj/machinery/anomalous_crystal) - /obj/machinery/anomalous_crystal/random - /obj/machinery/anomalous_crystal) - new random_crystal(loc) - qdel(src) +/obj/effect/spawner/lootdrop/anomalous_crystal + name = "anomalous crystal spawner" + +/obj/effect/spawner/lootdrop/anomalous_crystal/Initialize() + loot = subtypesof(/obj/machinery/anomalous_crystal) + . = ..() /obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing - activation_method = "mob_bump" + observer_desc = "This crystal strips and equips its targets as clowns." + possible_methods = list(ACTIVATE_MOB_BUMP, ACTIVATE_SPEECH) activation_sound = 'sound/items/bikehorn.ogg' /obj/machinery/anomalous_crystal/honk/ActivationReaction(mob/user) @@ -442,12 +465,9 @@ Difficulty: Very Hard qdel(C) affected_targets.Add(H) -/obj/machinery/anomalous_crystal/honk/New() - ..() - activation_method = pick("mob_bump","speech") - /obj/machinery/anomalous_crystal/theme_warp //Warps the area you're in to look like a new one - activation_method = "touch" + observer_desc = "This crystal warps the area around it to a theme." + activation_method = ACTIVATE_TOUCH cooldown_add = 200 var/terrain_theme = "winter" var/NewTerrainFloors @@ -457,9 +477,11 @@ Difficulty: Very Hard var/list/NewFlora = list() var/florachance = 8 -/obj/machinery/anomalous_crystal/theme_warp/New() - ..() +/obj/machinery/anomalous_crystal/theme_warp/Initialize() + . = ..() terrain_theme = pick("lavaland","winter","jungle","ayy lmao") + observer_desc = "This crystal changes the area around it to match the theme of \"[terrain_theme]\"." + switch(terrain_theme) if("lavaland")//Depressurizes the place... and free cult metal, I guess. NewTerrainFloors = /turf/open/floor/grass/snow/basalt @@ -518,15 +540,19 @@ Difficulty: Very Hard affected_targets += A /obj/machinery/anomalous_crystal/emitter //Generates a projectile when interacted with - activation_method = "touch" + observer_desc = "This crystal generates a projectile when activated." + activation_method = ACTIVATE_TOUCH cooldown_add = 50 - var/generated_projectile = /obj/item/projectile/beam/emitter + var/obj/item/projectile/generated_projectile = /obj/item/projectile/beam/emitter -/obj/machinery/anomalous_crystal/emitter/New() - ..() +/obj/machinery/anomalous_crystal/emitter/Initialize() + . = ..() generated_projectile = pick(/obj/item/projectile/magic/aoe/fireball/infernal,/obj/item/projectile/magic/aoe/lightning,/obj/item/projectile/magic/spellblade, /obj/item/projectile/bullet/meteorshot, /obj/item/projectile/beam/xray, /obj/item/projectile/colossus) + var/proj_name = initial(generated_projectile.name) + observer_desc = "This crystal generates \a [proj_name] when activated." + /obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method) if(..()) var/obj/item/projectile/P = new generated_projectile(get_turf(src)) @@ -547,7 +573,8 @@ Difficulty: Very Hard P.fire() /obj/machinery/anomalous_crystal/dark_reprise //Revives anyone nearby, but turns them into shadowpeople and renders them uncloneable, so the crystal is your only hope of getting up again if you go down. - activation_method = "touch" + observer_desc = "When activated, this crystal revives anyone nearby, but turns them into Shadowpeople and makes them unclonable, making the crystal their only hope of getting up again." + activation_method = ACTIVATE_TOUCH activation_sound = 'sound/hallucinations/growl1.ogg' /obj/machinery/anomalous_crystal/dark_reprise/ActivationReaction(mob/user, method) @@ -565,13 +592,20 @@ Difficulty: Very Hard H.grab_ghost(force = TRUE) /obj/machinery/anomalous_crystal/helpers //Lets ghost spawn as helpful creatures that can only heal people slightly. Incredibly fragile and they can't converse with humans - activation_method = "touch" - var/ready_to_deploy = 0 + observer_desc = "This crystal allows ghosts to turn into a fragile creature that can heal people." + activation_method = ACTIVATE_TOUCH + activation_sound = 'sound/effects/ghost2.ogg' + var/ready_to_deploy = FALSE + +/obj/machinery/anomalous_crystal/helpers/Destroy() + GLOB.poi_list -= src + . = ..() /obj/machinery/anomalous_crystal/helpers/ActivationReaction(mob/user, method) if(..() && !ready_to_deploy) - ready_to_deploy = 1 - notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK) + GLOB.poi_list |= src + ready_to_deploy = TRUE + notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", ghost_sound = 'sound/effects/ghost2.ogg', source = src, action = NOTIFY_ATTACK) /obj/machinery/anomalous_crystal/helpers/attack_ghost(mob/dead/observer/user) ..() @@ -613,10 +647,12 @@ Difficulty: Very Hard verb_ask = "floats inquisitively" verb_exclaim = "zaps" verb_yell = "bangs" + initial_languages = list(/datum/language/common, /datum/language/slime) + only_speaks_language = /datum/language/slime damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) light_range = 4 faction = list("neutral") - del_on_death = 1 + del_on_death = TRUE unsuitable_atmos_damage = 0 movement_type = FLYING minbodytemp = 0 @@ -638,7 +674,7 @@ Difficulty: Very Hard . = ..() if(isliving(target) && target != src) var/mob/living/L = target - if(L.stat < DEAD) + if(L.stat != DEAD) L.heal_overall_damage(heal_power, heal_power) new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF") @@ -649,13 +685,14 @@ Difficulty: Very Hard /obj/machinery/anomalous_crystal/refresher //Deletes and recreates a copy of the item, "refreshing" it. - activation_method = "touch" + observer_desc = "This crystal \"refreshes\" items that it affects, rendering them as new." + activation_method = ACTIVATE_TOUCH cooldown_add = 50 activation_sound = 'sound/magic/TIMEPARADOX2.ogg' var/list/banned_items_typecache = list(/obj/item/weapon/storage, /obj/item/weapon/implant, /obj/item/weapon/implanter, /obj/item/weapon/disk/nuclear, /obj/item/projectile, /obj/item/weapon/spellbook) -/obj/machinery/anomalous_crystal/refresher/New() - ..() +/obj/machinery/anomalous_crystal/refresher/Initialize() + . = ..() banned_items_typecache = typecacheof(banned_items_typecache) @@ -675,7 +712,8 @@ Difficulty: Very Hard qdel(CHOSEN) /obj/machinery/anomalous_crystal/possessor //Allows you to bodyjack small animals, then exit them at your leisure, but you can only do this once per activation. Because they blow up. Also, if the bodyjacked animal dies, SO DO YOU. - activation_method = "touch" + observer_desc = "When activated, this crystal allows you to take over small animals, and then exit them at the possessors leisure. Exiting the animal kills it, and if you die while possessing the animal, you die as well." + activation_method = ACTIVATE_TOUCH /obj/machinery/anomalous_crystal/possessor/ActivationReaction(mob/user, method) if(..()) @@ -770,4 +808,14 @@ Difficulty: Very Hard target_mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession) +#undef ACTIVATE_TOUCH +#undef ACTIVATE_SPEECH +#undef ACTIVATE_HEAT +#undef ACTIVATE_BULLET +#undef ACTIVATE_ENERGY +#undef ACTIVATE_BOMB +#undef ACTIVATE_MOB_BUMP +#undef ACTIVATE_WEAPON +#undef ACTIVATE_MAGIC + #undef MEDAL_PREFIX From 2044f10302e42343f5d1da8652f9d93e078c8ee2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 26 Apr 2017 19:33:14 -0500 Subject: [PATCH 09/44] Keeps SSnpc from sleeping --- code/modules/mob/living/simple_animal/simple_animal.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index d87573edd3..d2709e614c 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -127,9 +127,11 @@ stuttering = 0 /mob/living/simple_animal/proc/handle_automated_action() + set waitfor = FALSE return /mob/living/simple_animal/proc/handle_automated_movement() + set waitfor = FALSE if(!stop_automated_movement && wander) if((isturf(src.loc) || allow_movement_on_non_turfs) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. turns_since_move++ @@ -142,6 +144,7 @@ return 1 /mob/living/simple_animal/proc/handle_automated_speech(var/override) + set waitfor = FALSE if(speak_chance) if(prob(speak_chance) || override) if(speak && speak.len) From bba83f9291fefbf7fb4605f826e771a0f540e4ef Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 26 Apr 2017 20:15:54 -0500 Subject: [PATCH 10/44] Lowers max list size in vv --- code/datums/datumvars.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index fbde20a8d7..17a2d7445a 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -446,7 +446,7 @@ var/list/L = value var/list/items = list() - if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > 500)) + if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? 50 : 150))) for (var/i in 1 to L.len) var/key = L[i] var/val From 27feafc6992384763f0ab85e4e3a61a29a9d1110 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 03:00:07 -0500 Subject: [PATCH 11/44] Changes all instances of "RD Console" to "R&D Console" --- code/game/machinery/computer/buildandrepair.dm | 6 +++--- code/modules/research/rdconsole.dm | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 5271dc5293..9ec74dccd3 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -304,17 +304,17 @@ build_path = /obj/machinery/computer/gulag_teleporter_computer /obj/item/weapon/circuitboard/computer/rdconsole - name = "RD Console (Computer Board)" + name = "R&D Console (Computer Board)" build_path = /obj/machinery/computer/rdconsole/core /obj/item/weapon/circuitboard/computer/rdconsole/attackby(obj/item/I, mob/user, params) if(istype(I,/obj/item/weapon/screwdriver)) if(build_path == /obj/machinery/computer/rdconsole/core) - name = "RD Console - Robotics (Computer Board)" + name = "R&D Console - Robotics (Computer Board)" build_path = /obj/machinery/computer/rdconsole/robotics to_chat(user, "Access protocols successfully updated.") else - name = "RD Console (Computer Board)" + name = "R&D Console (Computer Board)" build_path = /obj/machinery/computer/rdconsole/core to_chat(user, "Defaulting access protocols.") else diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index ed5190a701..2541d67d65 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -1068,7 +1068,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, /obj/machinery/computer/rdconsole/robotics/New() ..() if(circuit) - circuit.name = "RD Console - Robotics (Computer Board)" + circuit.name = "R&D Console - Robotics (Computer Board)" circuit.build_path = /obj/machinery/computer/rdconsole/robotics /obj/machinery/computer/rdconsole/core From c0301fbf894031af0095cf92ee398e4bd3ef6c29 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 06:36:48 -0500 Subject: [PATCH 12/44] Changes ID card program to only require head of staff access to download --- code/modules/modular_computers/file_system/programs/card.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index b959ced6cf..eec36d6c4c 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -3,7 +3,7 @@ filedesc = "ID card modification program" program_icon_state = "id" extended_desc = "Program for programming employee ID cards to access parts of the station." - transfer_access = GLOB.access_change_ids + transfer_access = GLOB.access_heads requires_ntnet = 0 size = 8 var/mod_mode = 1 @@ -452,7 +452,7 @@ var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2 if(auth_card) region_access = list() - if(transfer_access in auth_card.GetAccess()) + if(GLOB.access_change_ids in auth_card.GetAccess()) minor = 0 authenticated = 1 return 1 From d77a2bf87de6fefabfe3bc3998066992cf50a780 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 09:13:33 -0500 Subject: [PATCH 13/44] Fixes SDQL global procs --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 7375fac466..bda6354f93 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -477,7 +477,7 @@ var/list/new_args = list() for(var/arg in arguments) new_args += SDQL_expression(source, arg) - if(object == world) // Global proc. + if(object == GLOB) // Global proc. procname = "/proc/[procname]" return WrapAdminProcCall(GLOBAL_PROC, procname, new_args) return WrapAdminProcCall(object, procname, new_args) From fd3fb360df6a73bc730f267648cce50dcbb30231 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 09:17:40 -0500 Subject: [PATCH 14/44] Changes the naming of an ammo to make it more distinct --- .../projectiles/ammunition/ammo_casings.dm | 22 ++++++------ .../boxes_magazines/external_mag.dm | 34 +++++++++---------- .../projectiles/guns/ballistic/automatic.dm | 4 +-- code/modules/uplink/uplink_item.dm | 32 ++++++++--------- 4 files changed, 46 insertions(+), 46 deletions(-) diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 57196e6c80..65b9ef926f 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -135,27 +135,27 @@ /// SAW ROUNDS -/obj/item/ammo_casing/mm556x45 - desc = "A 556x45mm bullet casing." +/obj/item/ammo_casing/mm195x129 + desc = "A 1.95x129mm bullet casing." icon_state = "762-casing" - caliber = "mm55645" + caliber = "mm195129" projectile_type = /obj/item/projectile/bullet/saw -/obj/item/ammo_casing/mm556x45/bleeding - desc = "A 556x45mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding." +/obj/item/ammo_casing/mm195x129/bleeding + desc = "A 1.95x129mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding." icon_state = "762-casing" projectile_type = /obj/item/projectile/bullet/saw/bleeding -/obj/item/ammo_casing/mm556x45/hollow - desc = "A 556x45mm bullet casing designed to cause more damage to unarmored targets." +/obj/item/ammo_casing/mm195x129/hollow + desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets." projectile_type = /obj/item/projectile/bullet/saw/hollow -/obj/item/ammo_casing/mm556x45/ap - desc = "A 556x45mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." +/obj/item/ammo_casing/mm195x129/ap + desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets." projectile_type = /obj/item/projectile/bullet/saw/ap -/obj/item/ammo_casing/mm556x45/incen - desc = "A 556x45mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. " +/obj/item/ammo_casing/mm195x129/incen + desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. " projectile_type = /obj/item/projectile/bullet/saw/incen diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm index d4c6204233..11112ec974 100644 --- a/code/modules/projectiles/boxes_magazines/external_mag.dm +++ b/code/modules/projectiles/boxes_magazines/external_mag.dm @@ -234,35 +234,35 @@ //// SAW MAGAZINES -/obj/item/ammo_box/magazine/mm556x45 - name = "box magazine (5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129 + name = "box magazine (1.95x129mm)" icon_state = "a762-50" origin_tech = "combat=2" - ammo_type = /obj/item/ammo_casing/mm556x45 - caliber = "mm55645" + ammo_type = /obj/item/ammo_casing/mm195x129 + caliber = "mm195129" max_ammo = 50 -/obj/item/ammo_box/magazine/mm556x45/bleeding - name = "box magazine (Bleeding 5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129/bleeding + name = "box magazine (Bleeding 1.95x129mm)" origin_tech = "combat=3" - ammo_type = /obj/item/ammo_casing/mm556x45/bleeding + ammo_type = /obj/item/ammo_casing/mm195x129/bleeding -/obj/item/ammo_box/magazine/mm556x45/hollow - name = "box magazine (Hollow-Point 5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129/hollow + name = "box magazine (Hollow-Point 1.95x129mm)" origin_tech = "combat=3" - ammo_type = /obj/item/ammo_casing/mm556x45/hollow + ammo_type = /obj/item/ammo_casing/mm195x129/hollow -/obj/item/ammo_box/magazine/mm556x45/ap - name = "box magazine (Armor Penetrating 5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129/ap + name = "box magazine (Armor Penetrating 1.95x129mm)" origin_tech = "combat=4" - ammo_type = /obj/item/ammo_casing/mm556x45/ap + ammo_type = /obj/item/ammo_casing/mm195x129/ap -/obj/item/ammo_box/magazine/mm556x45/incen - name = "box magazine (Incendiary 5.56x45mm)" +/obj/item/ammo_box/magazine/mm195x129/incen + name = "box magazine (Incendiary 1.95x129mm)" origin_tech = "combat=4" - ammo_type = /obj/item/ammo_casing/mm556x45/incen + ammo_type = /obj/item/ammo_casing/mm195x129/incen -/obj/item/ammo_box/magazine/mm556x45/update_icon() +/obj/item/ammo_box/magazine/mm195x129/update_icon() ..() icon_state = "a762-[round(ammo_count(),10)]" diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index b334b7b775..1ffdaf0d29 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -278,13 +278,13 @@ /obj/item/weapon/gun/ballistic/automatic/l6_saw name = "\improper L6 SAW" - desc = "A heavily modified 5.56x45mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation." + desc = "A heavily modified 1.95x129mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation." icon_state = "l6closed100" item_state = "l6closedmag" w_class = WEIGHT_CLASS_HUGE slot_flags = 0 origin_tech = "combat=6;engineering=3;syndicate=6" - mag_type = /obj/item/ammo_box/magazine/mm556x45 + mag_type = /obj/item/ammo_box/magazine/mm195x129 weapon_weight = WEAPON_HEAVY fire_sound = 'sound/weapons/Gunshot_smg.ogg' var/cover_open = 0 diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 9ed0565ee7..7fcbb87c59 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -222,7 +222,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/dangerous/machinegun name = "L6 Squad Automatic Weapon" desc = "A fully-loaded Aussec Armoury belt-fed machine gun. \ - This deadly weapon has a massive 50-round magazine of devastating 5.56x45mm ammunition." + This deadly weapon has a massive 50-round magazine of devastating 1.95x129mm ammunition." item = /obj/item/weapon/gun/ballistic/automatic/l6_saw cost = 18 surplus = 0 @@ -469,34 +469,34 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/machinegun/basic - name = "5.56x45mm Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use with the L6 SAW. \ + name = "1.95x129mm Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use with the L6 SAW. \ By the time you need to use this, you'll already be on a pile of corpses." - item = /obj/item/ammo_box/magazine/mm556x45 + item = /obj/item/ammo_box/magazine/mm195x129 /datum/uplink_item/ammo/machinegun/bleeding - name = "5.56x45mm (Bleeding) Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \ + name = "1.95x129mm (Bleeding) Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \ to induce internal bleeding on targets." - item = /obj/item/ammo_box/magazine/mm556x45/bleeding + item = /obj/item/ammo_box/magazine/mm195x129/bleeding /datum/uplink_item/ammo/machinegun/hollow - name = "5.56x45mm (Hollow-Point) Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \ + name = "1.95x129mm (Hollow-Point) Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \ with the unarmored masses of crew." - item = /obj/item/ammo_box/magazine/mm556x45/hollow + item = /obj/item/ammo_box/magazine/mm195x129/hollow /datum/uplink_item/ammo/machinegun/ap - name = "5.56x45mm (Armor Penetrating) Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \ + name = "1.95x129mm (Armor Penetrating) Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \ to puncture even the most durable armor." - item = /obj/item/ammo_box/magazine/mm556x45/ap + item = /obj/item/ammo_box/magazine/mm195x129/ap /datum/uplink_item/ammo/machinegun/incen - name = "5.56x45mm (Incendiary) Box Magazine" - desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; tipped with a special flammable \ + name = "1.95x129mm (Incendiary) Box Magazine" + desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; tipped with a special flammable \ mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn." - item = /obj/item/ammo_box/magazine/mm556x45/incen + item = /obj/item/ammo_box/magazine/mm195x129/incen /datum/uplink_item/ammo/sniper cost = 4 From 83916bee5d026f19604baa1000ec83504eeff68b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 09:17:44 -0500 Subject: [PATCH 15/44] Adds crayon grinding --- code/game/objects/items/crayons.dm | 2 + .../chemistry/machinery/reagentgrinder.dm | 14 ++++++- .../chemistry/reagents/other_reagents.dm | 40 ++++++++++++++----- 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 039237c63c..af8b9341f9 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -465,11 +465,13 @@ icon_state = "crayonblack" paint_color = "#1C1C1C" //Not completely black because total black looks bad. So Mostly Black. item_color = "black" + reagent_contents = list("nutriment" = 1, "blackcrayonpowder" = 1) /obj/item/toy/crayon/white icon_state = "crayonwhite" paint_color = "#FFFFFF" item_color = "white" + reagent_contents = list("nutriment" = 1, "whitecrayonpowder" = 1) /obj/item/toy/crayon/mime icon_state = "crayonmime" diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 5c8d695007..6b02e1ed24 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -54,7 +54,9 @@ /obj/item/slime_extract = list(), /obj/item/weapon/reagent_containers/pill = list(), /obj/item/weapon/reagent_containers/food = list(), - /obj/item/weapon/reagent_containers/honeycomb = list() + /obj/item/weapon/reagent_containers/honeycomb = list(), + /obj/item/toy/crayon = list() + ) var/list/juice_items = list ( @@ -456,3 +458,13 @@ O.reagents.trans_to(beaker, amount) if(!O.reagents.total_volume) remove_object(O) + + for (var/obj/item/toy/crayon/O in holdingitems) + if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + for (var/r_id in O.reagent_contents) + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + if (space == 0) + break + beaker.reagents.add_reagent(r_id, min(O.reagent_contents[r_id], space)) + remove_object(O) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index cf956227ba..c25a1d050d 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1128,7 +1128,7 @@ //For colouring in /proc/mix_color_from_reagents -/datum/reagent/crayonpowder +/datum/reagent/colorful_reagent/crayonpowder name = "Crayon Powder" id = "crayon powder" var/colorname = "none" @@ -1137,50 +1137,72 @@ color = "#FFFFFF" // rgb: 207, 54, 0 taste_description = "the back of class" -/datum/reagent/crayonpowder/New() +/datum/reagent/colorful_reagent/crayonpowder/New() description = "\an [colorname] powder made by grinding down crayons, good for colouring chemical reagents." -/datum/reagent/crayonpowder/red +/datum/reagent/colorful_reagent/crayonpowder/red name = "Red Crayon Powder" id = "redcrayonpowder" colorname = "red" + color = "#DA0000" // red + random_color_list = list("#DA0000") -/datum/reagent/crayonpowder/orange +/datum/reagent/colorful_reagent/crayonpowder/orange name = "Orange Crayon Powder" id = "orangecrayonpowder" colorname = "orange" color = "#FF9300" // orange + random_color_list = list("#FF9300") -/datum/reagent/crayonpowder/yellow +/datum/reagent/colorful_reagent/crayonpowder/yellow name = "Yellow Crayon Powder" id = "yellowcrayonpowder" colorname = "yellow" color = "#FFF200" // yellow + random_color_list = list("#FFF200") -/datum/reagent/crayonpowder/green +/datum/reagent/colorful_reagent/crayonpowder/green name = "Green Crayon Powder" id = "greencrayonpowder" colorname = "green" color = "#A8E61D" // green + random_color_list = list("#A8E61D") -/datum/reagent/crayonpowder/blue +/datum/reagent/colorful_reagent/crayonpowder/blue name = "Blue Crayon Powder" id = "bluecrayonpowder" colorname = "blue" color = "#00B7EF" // blue + random_color_list = list("#00B7EF") -/datum/reagent/crayonpowder/purple +/datum/reagent/colorful_reagent/crayonpowder/purple name = "Purple Crayon Powder" id = "purplecrayonpowder" colorname = "purple" color = "#DA00FF" // purple + random_color_list = list("#DA00FF") -/datum/reagent/crayonpowder/invisible +/datum/reagent/colorful_reagent/crayonpowder/invisible name = "Invisible Crayon Powder" id = "invisiblecrayonpowder" colorname = "invisible" color = "#FFFFFF00" // white + no alpha + random_color_list = list(null) //because using the powder color turns things invisible + +/datum/reagent/colorful_reagent/crayonpowder/black + name = "Black Crayon Powder" + id = "blackcrayonpowder" + colorname = "black" + color = "#1C1C1C" // not quite black + random_color_list = list("#404040") + +/datum/reagent/colorful_reagent/crayonpowder/white + name = "White Crayon Powder" + id = "whitecrayonpowder" + colorname = "white" + color = "#FFFFFF" // white + random_color_list = list("#FFFFFF") //doesn't actually change appearance at all From 3988f256470e0a6bca9321c08e090fd6320aa0a9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 09:18:48 -0500 Subject: [PATCH 16/44] Makes the GLOB stat_entry more indicative that you can edit it --- code/controllers/globals.dm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index a1a0a3f838..cd86e0d97c 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -16,13 +16,14 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) gvars_datum_in_built_vars = exclude_these.vars + list("gvars_datum_protected_varlist", "gvars_datum_in_built_vars", "gvars_datum_init_order") qdel(exclude_these) + log_world("[vars.len - gvars_datum_in_built_vars.len] global variables") + Initialize() /datum/controller/global_vars/Destroy(force) + stack_trace("Some fucker qdel'd the global holder!") if(!force) return QDEL_HINT_LETMELIVE - - stack_trace("Some fucker deleted the global holder!") QDEL_NULL(statclick) gvars_datum_protected_varlist.Cut() @@ -36,10 +37,7 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) if(!statclick) statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - var/static/num_globals - if(!num_globals) - num_globals = vars.len - gvars_datum_in_built_vars.len - stat("Globals:", statclick.update("Count: [num_globals]")) + stat("Globals:", statclick.update("Edit")) /datum/controller/global_vars/can_vv_get(var_name) if(var_name in gvars_datum_protected_varlist) From 0d581751185f435b396acce597d258ae52bd58ff Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 09:20:53 -0500 Subject: [PATCH 17/44] Fixes map rotation with disabled voting --- code/controllers/subsystem/mapping.dm | 46 +++++++++++++++------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 1499bc5029..dd66f3638e 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -144,31 +144,35 @@ SUBSYSTEM_DEF(mapping) mapvotes[global.config.defaultmap.map_name] += 1 continue mapvotes[vote] += 1 + else + for(var/M in global.config.maplist) + mapvotes[M] = 1 - //filter votes - for (var/map in mapvotes) - if (!map) - mapvotes.Remove(map) - if (!(map in global.config.maplist)) - mapvotes.Remove(map) - continue - var/datum/map_config/VM = global.config.maplist[map] - if (!VM) - mapvotes.Remove(map) - continue - if (VM.voteweight <= 0) - mapvotes.Remove(map) - continue - if (VM.config_min_users > 0 && players < VM.config_min_users) - mapvotes.Remove(map) - continue - if (VM.config_max_users > 0 && players > VM.config_max_users) - mapvotes.Remove(map) - continue + //filter votes + for (var/map in mapvotes) + if (!map) + mapvotes.Remove(map) + if (!(map in global.config.maplist)) + mapvotes.Remove(map) + continue + var/datum/map_config/VM = global.config.maplist[map] + if (!VM) + mapvotes.Remove(map) + continue + if (VM.voteweight <= 0) + mapvotes.Remove(map) + continue + if (VM.config_min_users > 0 && players < VM.config_min_users) + mapvotes.Remove(map) + continue + if (VM.config_max_users > 0 && players > VM.config_max_users) + mapvotes.Remove(map) + continue + if(global.config.allow_map_voting) mapvotes[map] = mapvotes[map]*VM.voteweight - var/pickedmap = global.config.allow_map_voting ? pickweight(mapvotes) : pick(global.config.maplist) + var/pickedmap = pickweight(mapvotes) if (!pickedmap) return var/datum/map_config/VM = global.config.maplist[pickedmap] From 870ee9ca6c352da419e9d211f9c46955b8f94e4e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 09:21:57 -0500 Subject: [PATCH 18/44] Minor IV/bloodbag grammar fixes --- code/game/machinery/iv_drip.dm | 2 +- .../modules/reagents/reagent_containers/blood_pack.dm | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index e6d8469943..0da04fbaa2 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -200,7 +200,7 @@ if(beaker.reagents && beaker.reagents.reagent_list.len) to_chat(usr, "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.") else - to_chat(usr, "Attached is an empty [beaker].") + to_chat(usr, "Attached is an empty [beaker.name].") else to_chat(usr, "No chemicals are attached.") diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 1ed89a74db..09fae5ff90 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -25,13 +25,10 @@ /obj/item/weapon/reagent_containers/blood/proc/update_pack_name() if(!labelled) - if(volume) - if(blood_type) - name = "blood pack [blood_type]" - else - name = "blood pack" + if(blood_type) + name = "blood pack - [blood_type]" else - name = "empty blood pack" + name = "blood pack" /obj/item/weapon/reagent_containers/blood/update_icon() var/percent = round((reagents.total_volume / volume) * 100) @@ -69,7 +66,7 @@ blood_type = "L" /obj/item/weapon/reagent_containers/blood/empty - name = "empty blood pack" + name = "blood pack" icon_state = "empty" /obj/item/weapon/reagent_containers/blood/attackby(obj/item/I, mob/user, params) From 1f2c0e898ee18107581162dfa8f749fb027eaf29 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 09:36:25 -0500 Subject: [PATCH 19/44] Small fix --- code/controllers/subsystem/npcpool.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index 7bd412b823..26e6f90b9d 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -19,7 +19,7 @@ SUBSYSTEM_DEF(npcpool) /datum/controller/subsystem/npcpool/stat_entry() ..("NPCS:[processing.len]|D:[needsDelegate.len]|A:[needsAssistant.len]|U:[canBeUsed.len]") -/datum/controller/subsystem/npcpool/proc/stop_processing(mob/living/carbon/human/interactive/I) +/datum/controller/subsystem/npcpool/proc/stop_processing(mob/living/I) processing -= I currentrun -= I needsDelegate -= I From 3103167a87a0660d38da2f036c11967e2149b9b3 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Thu, 27 Apr 2017 11:46:24 -0500 Subject: [PATCH 20/44] more expensive way to render, but MA isn't working or I'm overlooking something --- .../mob/living/carbon/human/species.dm | 146 +++++++++--------- 1 file changed, 72 insertions(+), 74 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 2f5cddb4d7..338289e4cd 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -67,7 +67,7 @@ //Eyes var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes - + //Ears var/obj/item/organ/ears/mutantears = /obj/item/organ/ears @@ -497,6 +497,8 @@ var/g = (H.gender == FEMALE) ? "f" : "m" + var/image/I + for(var/layer in relevant_layers) var/layertext = mutant_bodyparts_layertext(layer) @@ -561,9 +563,9 @@ S = /datum/sprite_accessory/slimecoon_snout*/ if(!S || S.icon_state == "none") continue - - var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layer) - + + var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer =- layer) + //A little rename so we don't have to use tail_lizard or tail_human when naming the sprites. if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "mam_tail" || bodypart == "slimecoontail" || bodypart == "xenotail") bodypart = "tail" @@ -574,11 +576,15 @@ if(bodypart == "xenohead") bodypart = "xhead" + var/icon_string + if(S.gender_specific) accessory_overlay.icon_state = "[g]_[bodypart]_[S.icon_state]_[layertext]" else accessory_overlay.icon_state = "m_[bodypart]_[S.icon_state]_[layertext]" + I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer) + if(S.center) accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y) @@ -614,7 +620,7 @@ standing += accessory_overlay if(S.hasinner) - var/mutable_appearance/inner_accessory_overlay = mutable_appearance(S.icon, layer = -layer) + var/mutable_appearance/inner_accessory_overlay = mutable_appearance(S.icon, layer =- layer) if(S.gender_specific) inner_accessory_overlay.icon_state = "[g]_[bodypart]inner_[S.icon_state]_[layertext]" else @@ -624,86 +630,78 @@ inner_accessory_overlay = center_image(inner_accessory_overlay, S.dimension_x, S.dimension_y) standing += inner_accessory_overlay - + if(S.extra) //apply the extra overlay, if there is one - var/mutable_appearance/extra_accessory_overlay = mutable_appearance(S.icon, layer = -layer) if(S.gender_specific) - extra_accessory_overlay.icon_state = "[g]_[bodypart]_extra_[S.icon_state]_[layertext]" + icon_string = "[g]_[bodypart]_extra_[S.icon_state]_[layertext]" else - extra_accessory_overlay.icon_state = "m_[bodypart]_extra_[S.icon_state]_[layertext]" + icon_string = "m_[bodypart]_extra_[S.icon_state]_[layertext]" + + I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer) if(S.center) - extra_accessory_overlay.icon_state = center_image(extra_accessory_overlay, S.dimension_x, S.dimension_y) - - if(!forced_colour) - switch(S.extra_color_src) //change the color of the extra overlay - if(MUTCOLORS) - if(fixed_mut_color) - extra_accessory_overlay.color = "#[fixed_mut_color]" - else - extra_accessory_overlay.color = "#[H.dna.features["mcolor"]]" - if(MUTCOLORS2) - if(fixed_mut_color2) - extra_accessory_overlay.color = "#[fixed_mut_color2]" - else - extra_accessory_overlay.color = "#[H.dna.features["mcolor2"]]" - if(MUTCOLORS3) - if(fixed_mut_color3) - extra_accessory_overlay.color = "#[fixed_mut_color3]" - else - extra_accessory_overlay.color = "#[H.dna.features["mcolor3"]]" - if(HAIR) - if(hair_color == "mutcolor") - extra_accessory_overlay.color = "#[H.dna.features["mcolor"]]" - else - extra_accessory_overlay.color = "#[H.hair_color]" - if(FACEHAIR) - extra_accessory_overlay.color = "#[H.facial_hair_color]" - if(EYECOLOR) - extra_accessory_overlay.color = "#[H.eye_color]" - else - extra_accessory_overlay.color = forced_colour - standing += extra_accessory_overlay + I = center_image(I,S.dimension_x,S.dimension_y) + + switch(S.extra_color_src) //change the color of the extra overlay + if(MUTCOLORS) + if(fixed_mut_color) + I.color = "#[fixed_mut_color]" + else + I.color = "#[H.dna.features["mcolor"]]" + if(MUTCOLORS2) + if(fixed_mut_color2) + I.color = "#[fixed_mut_color2]" + else + I.color = "#[H.dna.features["mcolor2"]]" + if(MUTCOLORS3) + if(fixed_mut_color3) + I.color = "#[fixed_mut_color3]" + else + I.color = "#[H.dna.features["mcolor3"]]" + if(HAIR) + if(hair_color == "mutcolor") + I.color = "#[H.dna.features["mcolor"]]" + else + I.color = "#[H.hair_color]" + if(FACEHAIR) + I.color = "#[H.facial_hair_color]" + if(EYECOLOR) + I.color = "#[H.eye_color]" + standing += I if(S.extra2) //apply the extra overlay, if there is one - var/mutable_appearance/extra2_accessory_overlay = mutable_appearance(S.icon, layer = -layer) if(S.gender_specific) - extra2_accessory_overlay.icon_state = "[g]_[bodypart]_extra2_[S.icon_state]_[layertext]" + icon_string = "[g]_[bodypart]_extra2_[S.icon_state]_[layertext]" else - extra2_accessory_overlay.icon_state = "m_[bodypart]_extra2_[S.icon_state]_[layertext]" + icon_string = "m_[bodypart]_extra2_[S.icon_state]_[layertext]" + + I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer) if(S.center) - extra2_accessory_overlay.icon_state = center_image(extra2_accessory_overlay, S.dimension_x, S.dimension_y) - - if(!forced_colour) - switch(S.extra_color_src) //change the color of the extra overlay - if(MUTCOLORS) - if(fixed_mut_color) - extra2_accessory_overlay.color = "#[fixed_mut_color]" - else - extra2_accessory_overlay.color = "#[H.dna.features["mcolor"]]" - if(MUTCOLORS2) - if(fixed_mut_color2) - extra2_accessory_overlay.color = "#[fixed_mut_color2]" - else - extra2_accessory_overlay.color = "#[H.dna.features["mcolor2"]]" - if(MUTCOLORS3) - if(fixed_mut_color3) - extra2_accessory_overlay.color = "#[fixed_mut_color3]" - else - extra2_accessory_overlay.color = "#[H.dna.features["mcolor3"]]" - if(HAIR) - if(hair_color == "mutcolor") - extra2_accessory_overlay.color = "#[H.dna.features["mcolor"]]" - else - extra2_accessory_overlay.color = "#[H.hair_color]" - if(FACEHAIR) - extra2_accessory_overlay.color = "#[H.facial_hair_color]" - if(EYECOLOR) - extra2_accessory_overlay.color = "#[H.eye_color]" - else - extra2_accessory_overlay.color = forced_colour - standing += extra2_accessory_overlay + I = center_image(I,S.dimension_x,S.dimension_y) + + switch(S.extra2_color_src) //change the color of the extra overlay + if(MUTCOLORS) + if(fixed_mut_color) + I.color = "#[fixed_mut_color]" + else + I.color = "#[H.dna.features["mcolor"]]" + if(MUTCOLORS2) + if(fixed_mut_color2) + I.color = "#[fixed_mut_color2]" + else + I.color = "#[H.dna.features["mcolor2"]]" + if(MUTCOLORS3) + if(fixed_mut_color3) + I.color = "#[fixed_mut_color3]" + else + I.color = "#[H.dna.features["mcolor3"]]" + if(HAIR) + if(hair_color == "mutcolor") + I.color = "#[H.dna.features["mcolor"]]" + else + I.color = "#[H.hair_color]" + standing += I H.overlays_standing[layer] = standing.Copy() standing = list() From 19b2723aa5e1057987d1b5912d71cf7aeb545ac8 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Thu, 27 Apr 2017 11:48:46 -0500 Subject: [PATCH 21/44] tweak --- code/modules/mob/living/carbon/human/species.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 338289e4cd..a48124e412 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -564,7 +564,7 @@ if(!S || S.icon_state == "none") continue - var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer =- layer) + var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layer) //A little rename so we don't have to use tail_lizard or tail_human when naming the sprites. if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "mam_tail" || bodypart == "slimecoontail" || bodypart == "xenotail") @@ -620,7 +620,7 @@ standing += accessory_overlay if(S.hasinner) - var/mutable_appearance/inner_accessory_overlay = mutable_appearance(S.icon, layer =- layer) + var/mutable_appearance/inner_accessory_overlay = mutable_appearance(S.icon, layer = -layer) if(S.gender_specific) inner_accessory_overlay.icon_state = "[g]_[bodypart]inner_[S.icon_state]_[layertext]" else From 3d30d6d40c28131f18d6f1f8f659815157362f4e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 12:04:48 -0500 Subject: [PATCH 22/44] Automatic changelog generation for PR #604 [ci skip] --- html/changelogs/AutoChangeLog-pr-604.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-604.yml diff --git a/html/changelogs/AutoChangeLog-pr-604.yml b/html/changelogs/AutoChangeLog-pr-604.yml new file mode 100644 index 0000000000..f1628785b8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-604.yml @@ -0,0 +1,4 @@ +author: "LetterJay" +delete-after: True +changes: + - bugfix: "Fixed layers for taurs/nagas not showing correctly." From cf3cb97e7aedb4451cb9ab18cc6d6172d62cf19f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 12:48:28 -0500 Subject: [PATCH 23/44] Automatic changelog generation for PR #598 [ci skip] --- html/changelogs/AutoChangeLog-pr-598.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-598.yml diff --git a/html/changelogs/AutoChangeLog-pr-598.yml b/html/changelogs/AutoChangeLog-pr-598.yml new file mode 100644 index 0000000000..dae86d18bf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-598.yml @@ -0,0 +1,5 @@ +author: "QualityVan" +delete-after: True +changes: + - rscadd: "Crayons can be ground" + - rscadd: "Crayon powder can be used to color stuff" From 6837657afb1e3d36a23818bf1afe26c85b64866a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 12:53:18 -0500 Subject: [PATCH 24/44] Automatic changelog generation for PR #588 [ci skip] --- html/changelogs/AutoChangeLog-pr-588.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-588.yml diff --git a/html/changelogs/AutoChangeLog-pr-588.yml b/html/changelogs/AutoChangeLog-pr-588.yml new file mode 100644 index 0000000000..254298e110 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-588.yml @@ -0,0 +1,9 @@ +author: "coiax" +delete-after: True +changes: + - rscadd: "Anomalous crystals can be examined by ghosts to determine their +function and activation method." + - rscdel: "Lightbringers can understand Slime and Galactic Common, and can +only speak Slime, as before." + - rscadd: "The helper anomalous crystal is in the orbit list after it has been +activated." From 3be007a02c52e22b385e8b2a9def22df98baa6fd Mon Sep 17 00:00:00 2001 From: LetterJay Date: Thu, 27 Apr 2017 13:00:59 -0500 Subject: [PATCH 25/44] DELETE --- html/changelogs/AutoChangeLog-pr-491.yml | 4 ---- html/changelogs/AutoChangeLog-pr-493.yml | 4 ---- html/changelogs/AutoChangeLog-pr-497.yml | 4 ---- html/changelogs/AutoChangeLog-pr-501.yml | 4 ---- html/changelogs/AutoChangeLog-pr-505.yml | 5 ----- html/changelogs/AutoChangeLog-pr-507.yml | 4 ---- html/changelogs/AutoChangeLog-pr-513.yml | 7 ------- html/changelogs/AutoChangeLog-pr-527.yml | 5 ----- html/changelogs/AutoChangeLog-pr-528.yml | 4 ---- html/changelogs/AutoChangeLog-pr-529.yml | 4 ---- html/changelogs/AutoChangeLog-pr-531.yml | 7 ------- html/changelogs/AutoChangeLog-pr-532.yml | 7 ------- html/changelogs/AutoChangeLog-pr-536.yml | 4 ---- html/changelogs/AutoChangeLog-pr-539.yml | 4 ---- html/changelogs/AutoChangeLog-pr-541.yml | 6 ------ html/changelogs/AutoChangeLog-pr-542.yml | 4 ---- html/changelogs/AutoChangeLog-pr-543.yml | 4 ---- html/changelogs/AutoChangeLog-pr-544.yml | 5 ----- html/changelogs/AutoChangeLog-pr-545.yml | 5 ----- html/changelogs/AutoChangeLog-pr-547.yml | 4 ---- html/changelogs/AutoChangeLog-pr-550.yml | 4 ---- html/changelogs/AutoChangeLog-pr-559.yml | 5 ----- html/changelogs/AutoChangeLog-pr-561.yml | 5 ----- html/changelogs/AutoChangeLog-pr-564.yml | 4 ---- html/changelogs/AutoChangeLog-pr-571.yml | 5 ----- html/changelogs/AutoChangeLog-pr-572.yml | 4 ---- html/changelogs/AutoChangeLog-pr-574.yml | 4 ---- html/changelogs/AutoChangeLog-pr-588.yml | 9 --------- html/changelogs/AutoChangeLog-pr-598.yml | 5 ----- html/changelogs/AutoChangeLog-pr-604.yml | 4 ---- 30 files changed, 144 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-491.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-493.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-497.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-501.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-505.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-507.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-513.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-527.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-528.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-529.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-531.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-532.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-536.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-539.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-541.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-542.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-543.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-544.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-545.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-547.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-550.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-559.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-561.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-564.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-571.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-572.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-574.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-588.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-598.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-604.yml diff --git a/html/changelogs/AutoChangeLog-pr-491.yml b/html/changelogs/AutoChangeLog-pr-491.yml deleted file mode 100644 index fa3ddda1ff..0000000000 --- a/html/changelogs/AutoChangeLog-pr-491.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - soundadd: "all new, improved vore sound effects!" diff --git a/html/changelogs/AutoChangeLog-pr-493.yml b/html/changelogs/AutoChangeLog-pr-493.yml deleted file mode 100644 index f7d31cd5a5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-493.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Poojawa" -delete-after: True -changes: - - rscadd: "Admins now have the ticket system returned to us. Should make life easier. A bit WIP still because Cyberboss memes" diff --git a/html/changelogs/AutoChangeLog-pr-497.yml b/html/changelogs/AutoChangeLog-pr-497.yml deleted file mode 100644 index 94e0f7c0d3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-497.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Fixed mining closets having extra, unrelated items" diff --git a/html/changelogs/AutoChangeLog-pr-501.yml b/html/changelogs/AutoChangeLog-pr-501.yml deleted file mode 100644 index a10569bfd2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-501.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - bugfix: "Gold and Light Pink slime extracts no longer disappear before working." diff --git a/html/changelogs/AutoChangeLog-pr-505.yml b/html/changelogs/AutoChangeLog-pr-505.yml deleted file mode 100644 index 2ab0d48ebb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-505.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "Fixed people understanding languages over the radio when they -shouldn't." diff --git a/html/changelogs/AutoChangeLog-pr-507.yml b/html/changelogs/AutoChangeLog-pr-507.yml deleted file mode 100644 index ee6ba121dd..0000000000 --- a/html/changelogs/AutoChangeLog-pr-507.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Conveyors no longer move things they aren't supposed to" diff --git a/html/changelogs/AutoChangeLog-pr-513.yml b/html/changelogs/AutoChangeLog-pr-513.yml deleted file mode 100644 index 97ce1414d9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-513.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "Centcom would like to inform all employees that they have ears." - - rscadd: "Adds \"ear\" organs to all carbons. These organs store ear damage and -deafness. A carbon without any ears is deaf. Genetic -deafness functions as before." diff --git a/html/changelogs/AutoChangeLog-pr-527.yml b/html/changelogs/AutoChangeLog-pr-527.yml deleted file mode 100644 index 87f80c1ad0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-527.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "Swarmers now only speak their own language, rather than swarmer and -common." diff --git a/html/changelogs/AutoChangeLog-pr-528.yml b/html/changelogs/AutoChangeLog-pr-528.yml deleted file mode 100644 index 9d91cc6f1f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-528.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BeeSting12" -delete-after: True -changes: - - bugfix: "Deltastation's secure tech storage is no longer all access." diff --git a/html/changelogs/AutoChangeLog-pr-529.yml b/html/changelogs/AutoChangeLog-pr-529.yml deleted file mode 100644 index f1756d26d8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-529.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "QualityVan" -delete-after: True -changes: - - bugfix: "Changeling brains are now more fully vestigial" diff --git a/html/changelogs/AutoChangeLog-pr-531.yml b/html/changelogs/AutoChangeLog-pr-531.yml deleted file mode 100644 index 731e4a870b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-531.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "coiax, WJohnston" -delete-after: True -changes: - - rscadd: "Plasmamen lungs, also known as \"plasma filters\" now look different -from human lungs." - - rscadd: "Plasmamen now have their own special type of bone tongue. They -still sound the same, it's just purple. Like them." diff --git a/html/changelogs/AutoChangeLog-pr-532.yml b/html/changelogs/AutoChangeLog-pr-532.yml deleted file mode 100644 index b81943d30f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-532.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "You can examine a firedoor for hints on how to -construct/deconstruct it." - - rscadd: "Add an additional hint during construction where you can add -plasteel to make the firedoor reinforced." diff --git a/html/changelogs/AutoChangeLog-pr-536.yml b/html/changelogs/AutoChangeLog-pr-536.yml deleted file mode 100644 index cc711de25c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-536.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jalleo" -delete-after: True -changes: - - rscdel: "WW_maze from lavaland has been removed it wasnt that good really anyhow" diff --git a/html/changelogs/AutoChangeLog-pr-539.yml b/html/changelogs/AutoChangeLog-pr-539.yml deleted file mode 100644 index e61bf150ef..0000000000 --- a/html/changelogs/AutoChangeLog-pr-539.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - bugfix: "Items will no longer be used on backpacks if they fail to insert when they're too full." diff --git a/html/changelogs/AutoChangeLog-pr-541.yml b/html/changelogs/AutoChangeLog-pr-541.yml deleted file mode 100644 index 821d37f331..0000000000 --- a/html/changelogs/AutoChangeLog-pr-541.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "CoreOverload" -delete-after: True -changes: - - bugfix: "Disposals no longer get broken by shuttles rotation." - - bugfix: "Wires no longer get broken by shuttles movement and rotation." - - bugfix: "Atmospheric equipment no longer gets broken by shuttles movement and rotation. Glory to the Flying Fortress of Atmosia!" diff --git a/html/changelogs/AutoChangeLog-pr-542.yml b/html/changelogs/AutoChangeLog-pr-542.yml deleted file mode 100644 index cbfa45a0a5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-542.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "Ghosts no longer drift in space." diff --git a/html/changelogs/AutoChangeLog-pr-543.yml b/html/changelogs/AutoChangeLog-pr-543.yml deleted file mode 100644 index 758f0c4c15..0000000000 --- a/html/changelogs/AutoChangeLog-pr-543.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "basilman" -delete-after: True -changes: - - bugfix: "fixed species with no skin dropping skin when gibbed." diff --git a/html/changelogs/AutoChangeLog-pr-544.yml b/html/changelogs/AutoChangeLog-pr-544.yml deleted file mode 100644 index 43829911c1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-544.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "When you are crushed by a door, it prints a visible message, -instead of, in some cases, silently damaging you." diff --git a/html/changelogs/AutoChangeLog-pr-545.yml b/html/changelogs/AutoChangeLog-pr-545.yml deleted file mode 100644 index 0e555c64ad..0000000000 --- a/html/changelogs/AutoChangeLog-pr-545.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "Fixed easter eggs spawning during non-Easter." - - bugfix: "Fixes stations not having holiday specific prefixes during the holidays." diff --git a/html/changelogs/AutoChangeLog-pr-547.yml b/html/changelogs/AutoChangeLog-pr-547.yml deleted file mode 100644 index a84c98f989..0000000000 --- a/html/changelogs/AutoChangeLog-pr-547.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "The vent in the Escape Coridoor on Omega Station has been fixed." diff --git a/html/changelogs/AutoChangeLog-pr-550.yml b/html/changelogs/AutoChangeLog-pr-550.yml deleted file mode 100644 index c5a7877ffc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-550.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "WJohnston" -delete-after: True -changes: - - tweak: "Skeletons and plasmamen's hitboxes now more closely match that of humans. They are no longer full of holes and incredibly frustrating to hit, should they run around naked." diff --git a/html/changelogs/AutoChangeLog-pr-559.yml b/html/changelogs/AutoChangeLog-pr-559.yml deleted file mode 100644 index 145254887e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-559.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "Examining a window now gives hints to the appropriate tool for the -next stage of construction/deconstruction." diff --git a/html/changelogs/AutoChangeLog-pr-561.yml b/html/changelogs/AutoChangeLog-pr-561.yml deleted file mode 100644 index 29024c2ce6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-561.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - bugfix: "T-Ray scans are no longer visible to bystanders." - - bugfix: "T-Ray scans no longer allow viewers to interact with underfloor objects." diff --git a/html/changelogs/AutoChangeLog-pr-564.yml b/html/changelogs/AutoChangeLog-pr-564.yml deleted file mode 100644 index c65852889b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-564.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - bugfix: "You no longer die when turning into a monkey." diff --git a/html/changelogs/AutoChangeLog-pr-571.yml b/html/changelogs/AutoChangeLog-pr-571.yml deleted file mode 100644 index 2535c774d8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-571.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - tweak: "Ash Drake swoops no longer teleport the Ash Drake to your position. -balance: Some other tweaks to Ash Drake attacks and patterns; discover these yourself!" diff --git a/html/changelogs/AutoChangeLog-pr-572.yml b/html/changelogs/AutoChangeLog-pr-572.yml deleted file mode 100644 index 9fcd56e029..0000000000 --- a/html/changelogs/AutoChangeLog-pr-572.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "flashdim" -delete-after: True -changes: - - bugfix: "Omega Station had two APCs not wired properly. (#26526)" diff --git a/html/changelogs/AutoChangeLog-pr-574.yml b/html/changelogs/AutoChangeLog-pr-574.yml deleted file mode 100644 index c35bc68585..0000000000 --- a/html/changelogs/AutoChangeLog-pr-574.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CoreOverload" -delete-after: True -changes: - - rscadd: "Gas injectors are now buildable!" diff --git a/html/changelogs/AutoChangeLog-pr-588.yml b/html/changelogs/AutoChangeLog-pr-588.yml deleted file mode 100644 index 254298e110..0000000000 --- a/html/changelogs/AutoChangeLog-pr-588.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "Anomalous crystals can be examined by ghosts to determine their -function and activation method." - - rscdel: "Lightbringers can understand Slime and Galactic Common, and can -only speak Slime, as before." - - rscadd: "The helper anomalous crystal is in the orbit list after it has been -activated." diff --git a/html/changelogs/AutoChangeLog-pr-598.yml b/html/changelogs/AutoChangeLog-pr-598.yml deleted file mode 100644 index dae86d18bf..0000000000 --- a/html/changelogs/AutoChangeLog-pr-598.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "QualityVan" -delete-after: True -changes: - - rscadd: "Crayons can be ground" - - rscadd: "Crayon powder can be used to color stuff" diff --git a/html/changelogs/AutoChangeLog-pr-604.yml b/html/changelogs/AutoChangeLog-pr-604.yml deleted file mode 100644 index f1628785b8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-604.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LetterJay" -delete-after: True -changes: - - bugfix: "Fixed layers for taurs/nagas not showing correctly." From 1334608d237f26393e0cab2425f89c8da695bd7f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 14:02:50 -0500 Subject: [PATCH 26/44] Automatic changelog generation for PR #575 [ci skip] --- html/changelogs/AutoChangeLog-pr-575.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-575.yml diff --git a/html/changelogs/AutoChangeLog-pr-575.yml b/html/changelogs/AutoChangeLog-pr-575.yml new file mode 100644 index 0000000000..55bcfcdafc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-575.yml @@ -0,0 +1,4 @@ +author: "LetterJay" +delete-after: True +changes: + - imageadd: "New PDA icons! Sprites by Malamarissa." From 7740e1bfee696f9644469175300343a58cc77893 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Thu, 27 Apr 2017 14:33:41 -0500 Subject: [PATCH 27/44] fix missing icon for the carbine --- code/citadel/cit_guns.dm | 1 + code/citadel/cit_vendors.dm | 1 + icons/obj/guns/cit_guns.dmi | Bin 0 -> 1188 bytes 3 files changed, 2 insertions(+) create mode 100644 icons/obj/guns/cit_guns.dmi diff --git a/code/citadel/cit_guns.dm b/code/citadel/cit_guns.dm index 820fd233d7..6a51ad4bd2 100644 --- a/code/citadel/cit_guns.dm +++ b/code/citadel/cit_guns.dm @@ -1,6 +1,7 @@ /obj/item/weapon/gun/energy/laser/carbine name = "laser carbine" desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal laser gun." + icon = 'icons/obj/guns/cit_guns.dmi' icon_state = "lasernew" item_state = "laser" origin_tech = "combat=4;magnets=4" diff --git a/code/citadel/cit_vendors.dm b/code/citadel/cit_vendors.dm index 32cd034b8b..7fee8705f1 100644 --- a/code/citadel/cit_vendors.dm +++ b/code/citadel/cit_vendors.dm @@ -76,6 +76,7 @@ refill_canister = /obj/item/weapon/vending_refill/soviet + #undef STANDARD_CHARGE #undef CONTRABAND_CHARGE #undef COIN_CHARGE diff --git a/icons/obj/guns/cit_guns.dmi b/icons/obj/guns/cit_guns.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e1b2e8ac1a582c60cf36a7cc2f6dea6a7e0eaa25 GIT binary patch literal 1188 zcmV;V1Y7%wP)V=-0C=30%e@N1Fc^j5Ip0+r+Ev6RU9(7wWN2?eg86I${gEVCdiM?;b+Fqx z@IEE3?alOPIzw-cDJ(NI>hp!f8eI0!P?Ch_F!;Qmlx=2c6r)WXXI={uF2n?lio`S8 ziTC{#-XGq^fvclH9tG+ssQ(8%z4G=umn0mIc7ujGNh;Cy4Vuo-2k1>{6u=#s!~g&T z#z{m$RCt{2+&^d=XBfxv?-?69m_j>T?x5#ET2e!+ie5cjmO=-0krypZmqMTcmo^Qw z(4}-JbaAs}i7BRA$rLZSkikQzMg-&Fn1G-KUx^%g*BhMDcrbXl4)S}oWXZY6HpbEK z1L7X}{=C-v=egIuJAsIZh=_=c8ms7rjYcB_SXx@L06zNZ%`Dy62EZ;)(i{IezuEWL zK@emB&1SQ3+5KGgyzI$d{07h)-`eb7{&Bf+$;-BOCIEQ-m0fz{Z*NA0$}hB0qtVEG z-)C`gk!rO{9LIcq??aYb^X&ZQF?;#qf%uP4-^O)a09IC3-kO=2dDMGc)0o33l}Z`F z?CvhNCnk9KTEus$$M^OocOJmUFVMM;QvTQP?=ttrCeN1Pm*2fSe)XGT<&QNQjm-4! zeu5y#;y5M@Lu$1ezV8FD+?prd*e2cB?i&O6zK?C&c%Jvj#OCGuK8KZClFIe`uaNeqKFHnQob%p5*)`NNfM%{*ie00SwRqFl}d#)P4nJutgfyS$8p~s zlO#Fxz>ec|y|35nc^rlz^?IETu3u*+Nk+N>#+%Kil_W_9VB2=r%2unz^z<~)84XF2 zP^;BQ)AYb->BqKh(lo`kZQAX2*SdDQ&3ni7Db6qpIwus96878Qi_NU1R4QfWL=4X# z3C}a?DQK+s2d2`aD6*Q(X8!7359A{viXyAGBF%P#mH^di_4q!?8I?DHNhyb&7=s|l zT-VLh5x~O2f;Bfc*EO4|)oOX;3|hj`rlBv3uC%hYwgwDN3%v~xMUiFZ!)8D8-lVia z%TZ4~hP6NcJC1|vx_LvGbYXhC$^C~_plJYAa4}=1(xFq)`zzmdU0m1A8)DFu)G#Bd zcM2+ljYFqm`}Ejs{|skueFmM8;5g2KzhX^#I_m#0#uuK1+QUcSiGCr`1{~>G^-&=kGPT z;*(b7`2-OW5fKp)5fKp)5fKp)5fKp)5fKp?Aw%Cof7;*QKl1*4m+U5FS3NK57oYa; zcUFuKyQBG@{=WvqA|fIpA|fIpA|fIpA|fIpr|Lf~z6YX_fUB?o0000 Date: Thu, 27 Apr 2017 15:38:42 -0500 Subject: [PATCH 28/44] Fixes changelog assets --- code/modules/client/asset_cache.dm | 28 ++++++++++++++++++++-------- interface/interface.dm | 20 ++------------------ 2 files changed, 22 insertions(+), 26 deletions(-) diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 2b59e5c64a..c0f029af08 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -172,7 +172,6 @@ GLOBAL_LIST_EMPTY(asset_datums) //DEFINITIONS FOR ASSET DATUMS START HERE. - /datum/asset/simple/tgui assets = list( "tgui.css" = 'tgui/assets/tgui.css', @@ -208,13 +207,6 @@ GLOBAL_LIST_EMPTY(asset_datums) "sig_none.gif" = 'icons/program_icons/sig_none.gif', ) - - - - - - - /datum/asset/simple/pda assets = list( "pda_atmos.png" = 'icons/pda_icons/pda_atmos.png', @@ -267,6 +259,26 @@ GLOBAL_LIST_EMPTY(asset_datums) "jquery-1.10.2.min.js" = 'html/IRV/jquery-1.10.2.min.js' ) +/datum/asset/simple/changelog + assets = list( + "88x31.png" = 'html/88x31.png', + "bug-minus.png" = 'html/bug-minus.png', + "cross-circle.png" = 'html/cross-circle.png', + "hard-hat-exclamation.png" = 'html/hard-hat-exclamation.png', + "image-minus.png" = 'html/image-minus.png', + "image-plus.png" = 'html/image-plus.png', + "music-minus.png" = 'html/music-minus.png', + "music-plus.png" = 'html/music-plus.png', + "tick-circle.png" = 'html/tick-circle.png', + "wrench-screwdriver.png" = 'html/wrench-screwdriver.png', + "spell-check.png" = 'html/spell-check.png', + "burn-exclamation.png" = 'html/burn-exclamation.png', + "chevron.png" = 'html/chevron.png', + "chevron-expand.png" = 'html/chevron-expand.png', + "scales.png" = 'html/scales.png', + "changelog.css" = 'html/changelog.css' + ) + //Registers HTML Interface assets. /datum/asset/HTML_interface/register() for(var/path in typesof(/datum/html_interface)) diff --git a/interface/interface.dm b/interface/interface.dm index 35b70d9caf..5d5592e152 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -83,24 +83,8 @@ Admin: /client/verb/changelog() set name = "Changelog" set category = "OOC" - getFiles( - 'html/88x31.png', - 'html/bug-minus.png', - 'html/cross-circle.png', - 'html/hard-hat-exclamation.png', - 'html/image-minus.png', - 'html/image-plus.png', - 'html/music-minus.png', - 'html/music-plus.png', - 'html/tick-circle.png', - 'html/wrench-screwdriver.png', - 'html/spell-check.png', - 'html/burn-exclamation.png', - 'html/chevron.png', - 'html/chevron-expand.png', - 'html/changelog.css', - 'html/changelog.html' - ) + var/datum/asset/changelog = get_asset_datum(/datum/asset/simple/changelog) + changelog.send(src) src << browse('html/changelog.html', "window=changes;size=675x650") if(prefs.lastchangelog != GLOB.changelog_hash) prefs.lastchangelog = GLOB.changelog_hash From 57a0e0567986a92b78cb983ce2d253bc2bcbecce Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 16:55:12 -0500 Subject: [PATCH 29/44] Even admin-called shuttles will be affected by alert level --- code/controllers/subsystem/shuttle.dm | 10 ++++------ code/game/gamemodes/devil/devilinfo.dm | 4 ++-- .../gamemodes/miniantags/abduction/abduction.dm | 2 +- code/modules/power/singularity/narsie.dm | 2 +- code/modules/shuttle/emergency.dm | 13 +++++++++++-- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index b8d17cab87..e2546f65c4 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -210,12 +210,10 @@ SUBSYSTEM_DEF(shuttle) var/emergency_reason = "\nNature of emergency:\n\n[call_reason]" var/security_num = seclevel2num(get_security_level()) switch(security_num) - if(SEC_LEVEL_GREEN) - emergency.request(null, 2, signal_origin, html_decode(emergency_reason), 0) - if(SEC_LEVEL_BLUE) - emergency.request(null, 1, signal_origin, html_decode(emergency_reason), 0) + if(SEC_LEVEL_RED,SEC_LEVEL_DELTA) + emergency.request(null, signal_origin, html_decode(emergency_reason), 1) //There is a serious threat we gotta move no time to give them five minutes. else - emergency.request(null, 0.5, signal_origin, html_decode(emergency_reason), 1) // There is a serious threat we gotta move no time to give them five minutes. + emergency.request(null, signal_origin, html_decode(emergency_reason), 0) log_game("[key_name(user)] has called the shuttle.") message_admins("[key_name_admin(user)] has called the shuttle.") @@ -274,7 +272,7 @@ SUBSYSTEM_DEF(shuttle) if(callShuttle) if(EMERGENCY_IDLE_OR_RECALLED) - emergency.request(null, 2.5) + emergency.request(null, set_coefficient = 2.5) log_game("There is no means of calling the shuttle anymore. Shuttle automatically called.") message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.") diff --git a/code/game/gamemodes/devil/devilinfo.dm b/code/game/gamemodes/devil/devilinfo.dm index ef9091891f..01437cdf2e 100644 --- a/code/game/gamemodes/devil/devilinfo.dm +++ b/code/game/gamemodes/devil/devilinfo.dm @@ -287,7 +287,7 @@ GLOBAL_LIST_INIT(lawlorify, list ( notify_ghosts("An arch devil has ascended in \the [A.name]. Reach out to the devil to be given a new shell for your soul.", source = owner.current, action=NOTIFY_ATTACK) sleep(50) if(!SSticker.mode.devil_ascended) - SSshuttle.emergency.request(null, 0.3) + SSshuttle.emergency.request(null, set_coefficient = 0.3) SSticker.mode.devil_ascended++ form = ARCH_DEVIL @@ -449,7 +449,7 @@ GLOBAL_LIST_INIT(lawlorify, list ( A.convert_to_archdevil() else throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection") - + /datum/devilinfo/proc/update_hud() if(istype(owner.current, /mob/living/carbon)) diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index e692654bf3..0e4a11f8ab 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -166,7 +166,7 @@ var/obj/machinery/abductor/console/con = get_team_console(team_number) var/datum/objective/objective = team_objectives[team_number] if (con.experiment.points >= objective.target_amount) - SSshuttle.emergency.request(null, 0.5) + SSshuttle.emergency.request(null, set_coefficient = 0.5) finished = 1 return ..() return ..() diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 410181dede..9deebdfe10 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -39,7 +39,7 @@ narsie_spawn_animation() sleep(70) - SSshuttle.emergency.request(null, 0.1) // Cannot recall + SSshuttle.emergency.request(null, set_coefficient = 0.1) // Cannot recall /obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 553210a5f7..a4cf449b85 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -207,8 +207,17 @@ . = ..() -/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, coefficient=1, area/signalOrigin, reason, redAlert) - var/call_time = SSshuttle.emergencyCallTime * coefficient +/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null) + if(!isnum(set_coefficient)) + var/security_num = seclevel2num(get_security_level()) + switch(security_num) + if(SEC_LEVEL_GREEN) + set_coefficient = 2 + if(SEC_LEVEL_BLUE) + set_coefficient = 1 + else + set_coefficient = 0.5 + var/call_time = SSshuttle.emergencyCallTime * set_coefficient switch(mode) // The shuttle can not normally be called while "recalling", so // if this proc is called, it's via admin fiat From b9cc40277bf1a2f3dd234d96f3758886f959abe3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 16:55:15 -0500 Subject: [PATCH 30/44] Fixes the banana honk recipe. --- code/modules/food_and_drinks/recipes/drinks_recipes.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 29d3f6d591..a5c21aa0f5 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -416,8 +416,8 @@ /datum/chemical_reaction/bananahonk name = "Banana Honk" id = "bananahonk" - results = list("bananahonk" = 3) - required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1) + results = list("bananahonk" = 2) + required_reagents = list("laughter" = 1, "cream" = 1) /datum/chemical_reaction/silencer name = "Silencer" @@ -542,9 +542,9 @@ results = list("chocolate_milk" = 2) required_reagents = list("milk" = 1, "cocoa" = 1) mix_message = "The color changes as the mixture blends smoothly." - + /datum/chemical_reaction/eggnog name = "eggnog" id = "eggnog" results = list("eggnog" = 15) - required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5) \ No newline at end of file + required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5) \ No newline at end of file From a0c1f979dc938a8051dba8bde2339c882d41624f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 17:02:33 -0500 Subject: [PATCH 31/44] Fixes templates/ruins not updating area list --- code/__HELPERS/unsorted.dm | 2 +- code/controllers/subsystem/mapping.dm | 9 ++++++--- code/game/area/areas.dm | 1 + code/game/area/areas/holodeck.dm | 1 + code/game/area/areas/ruins.dm | 1 + code/modules/mapping/map_template.dm | 5 ++++- code/modules/mob/dead/observer/observer.dm | 10 +++++++--- 7 files changed, 21 insertions(+), 8 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index a7338a0c5d..1da1b50aa3 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -582,7 +582,7 @@ Turf and target are seperate in case you want to teleport some distance from a t return 0 //Repopulates sortedAreas list -/proc/SortAreas() +/proc/repopulate_sorted_areas() GLOB.sortedAreas = list() for(var/area/A in world) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index dd66f3638e..a27235c592 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -18,6 +18,8 @@ SUBSYSTEM_DEF(mapping) var/list/shuttle_templates = list() var/list/shelter_templates = list() + var/loading_ruins = FALSE + /datum/controller/subsystem/mapping/PreInit() if(!config) #ifdef FORCE_MAP @@ -32,13 +34,13 @@ SUBSYSTEM_DEF(mapping) if(config.defaulted) to_chat(world, "Unable to load next map config, defaulting to Box Station") loadWorld() - SortAreas() + repopulate_sorted_areas() process_teleport_locs() //Sets up the wizard teleport locations preloadTemplates() // Pick a random away mission. createRandomZlevel() // Generate mining. - + loading_ruins = TRUE var/mining_type = config.minetype if (mining_type == "lavaland") seedRuins(list(5), global.config.lavaland_budget, /area/lavaland/surface/outdoors, lava_ruins_templates) @@ -54,7 +56,8 @@ SUBSYSTEM_DEF(mapping) space_zlevels += i seedRuins(space_zlevels, global.config.space_budget, /area/space, space_ruins_templates) - + loading_ruins = FALSE + repopulate_sorted_areas() // Set up Z-level transistions. setup_map_transitions() ..() diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index f3e2de241f..137229db37 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -42,6 +42,7 @@ var/has_gravity = 0 var/noteleport = 0 //Are you forbidden from teleporting to the area? (centcomm, mobs, wizard, hand teleporter) + var/hidden = FALSE //Hides area from player Teleport function. var/safe = 0 //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers var/no_air = null diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm index 21999a74a1..c4b4e02f7b 100644 --- a/code/game/area/areas/holodeck.dm +++ b/code/game/area/areas/holodeck.dm @@ -3,6 +3,7 @@ icon_state = "Holodeck" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED flags = 0 + hidden = TRUE var/obj/machinery/computer/holodeck/linked var/restricted = 0 // if true, program goes on emag list diff --git a/code/game/area/areas/ruins.dm b/code/game/area/areas/ruins.dm index d697c8436f..828d165dd8 100644 --- a/code/game/area/areas/ruins.dm +++ b/code/game/area/areas/ruins.dm @@ -4,6 +4,7 @@ name = "\improper Unexplored Location" icon_state = "away" has_gravity = 1 + hidden = TRUE /area/ruin/unpowered diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index d47c4da04b..e0588acf2b 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -51,7 +51,7 @@ return FALSE smooth_zlevel(world.maxz) - SortAreas() + repopulate_sorted_areas() //initialize things that are normally initialized after map load initTemplateBounds(bounds) @@ -74,6 +74,9 @@ //initialize things that are normally initialized after map load initTemplateBounds(bounds) + if(!SSmapping.loading_ruins) //Will be done manually during mapping ss init + repopulate_sorted_areas() + log_game("[name] loaded at at [T.x],[T.y],[T.z]") return TRUE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 2c5b064137..ab6377b096 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -355,9 +355,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!isobserver(usr)) to_chat(usr, "Not when you're not dead!") return - var/A - A = input("Area to jump to", "BOOYEA", A) as null|anything in GLOB.sortedAreas - var/area/thearea = A + var/list/filtered = list() + for(var/V in GLOB.sortedAreas) + var/area/A = V + if(!A.hidden) + filtered += A + var/area/thearea = input("Area to jump to", "BOOYEA") as null|anything in filtered + if(!thearea) return From df4f3aaaad1fcadcf4af8be203eefc28823eed29 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 17:10:44 -0500 Subject: [PATCH 32/44] Adds a delete verb to the vv_drop_down --- code/datums/datumvars.dm | 11 +++++++++++ code/modules/admin/verbs/randomverbs.dm | 19 ++++++++++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 17a2d7445a..7de57e4bb9 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -27,6 +27,7 @@ . += "---" .["Call Proc"] = "?_src_=vars;proc_call=\ref[src]" .["Mark Object"] = "?_src_=vars;mark_object=\ref[src]" + .["Delete"] = "?_src_=vars;delete=\ref[src]" /datum/proc/on_reagent_change() @@ -526,6 +527,16 @@ if(T) callproc_datum(T) + else if(href_list["delete"]) + if(!check_rights(R_DEBUG, 0)) + return + + var/datum/D = locate(href_list["delete"]) + if(!D) + to_chat(usr, "Unable to locate item!") + admin_delete(D) + href_list["datumrefresh"] = href_list["delete"] + else if(href_list["regenerateicons"]) if(!check_rights(0)) return diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index b447c2a745..f4dcc36576 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -505,7 +505,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(src)] has changed Central Command's name to [input]") log_admin("[key_name(src)] has changed the Central Command name to: [input]") -/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in world) +/client/proc/cmd_admin_delete(atom/A as obj|mob|turf in world) set category = "Admin" set name = "Delete" @@ -513,15 +513,20 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(src, "Only administrators may use this command.") return - if (alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes") - log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])") - message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])") + admin_delete(A) + +/client/proc/admin_delete(datum/D) + var/atom/A = D + var/coords = istype(A) ? " at ([A.x], [A.y], [A.z])" : "" + if (alert(src, "Are you sure you want to delete:\n[D]\nat[coords]?", "Confirmation", "Yes", "No") == "Yes") + log_admin("[key_name(usr)] deleted [D][coords]") + message_admins("[key_name_admin(usr)] deleted [D][coords]") feedback_add_details("admin_verb","Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - if(isturf(O)) - var/turf/T = O + if(isturf(D)) + var/turf/T = D T.ChangeTurf(T.baseturf) else - qdel(O) + qdel(D) /client/proc/cmd_admin_list_open_jobs() set category = "Admin" From 5ee703d21f73033b97f3b0f044821553bb115f8f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 17:35:12 -0500 Subject: [PATCH 33/44] Fixes blank alerts --- code/modules/mob/mob_helpers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 1e748776bf..834d799b79 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -396,7 +396,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp A.action = action A.target = source if(!alert_overlay) - alert_overlay = new(src) + alert_overlay = new(source) alert_overlay.layer = FLOAT_LAYER alert_overlay.plane = FLOAT_PLANE A.add_overlay(alert_overlay) From 6e874d108913762cb3dca5a754d92ee7a27853bc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 17:56:36 -0500 Subject: [PATCH 34/44] Fixes ircadminwho making the wrong list check --- code/modules/admin/verbs/adminhelp.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 3c0bc185b8..16249b4b6d 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -591,7 +591,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) admin_keys += "[C][C.holder.fakekey ? "(Stealth)" : ""][C.is_afk() ? "(AFK)" : ""]" for(var/admin in admin_keys) - if(LAZYLEN(admin_keys) > 1) + if(LAZYLEN(message) > 1) message += ", [admin]" else message += "[admin]" From eb05fbf152cb6ef9d2a51fef8a8786fefe2e5a9a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 27 Apr 2017 22:26:04 -0500 Subject: [PATCH 35/44] Automatic changelog generation for PR #606 [ci skip] --- html/changelogs/AutoChangeLog-pr-606.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-606.yml diff --git a/html/changelogs/AutoChangeLog-pr-606.yml b/html/changelogs/AutoChangeLog-pr-606.yml new file mode 100644 index 0000000000..d5703aeb0a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-606.yml @@ -0,0 +1,4 @@ +author: "LetterJay" +delete-after: True +changes: + - imageadd: "fixed missing sprite for the laser carbine" From aa5fec0bd88046cb035cb7410f62f400b45dd80a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 28 Apr 2017 06:13:42 -0500 Subject: [PATCH 36/44] Abductor fixes and tweaks --- .../miniantags/abduction/abduction_gear.dm | 75 ++++++++++++++----- .../miniantags/abduction/abduction_outfits.dm | 12 +-- .../miniantags/abduction/machinery/console.dm | 72 ++++++++++-------- .../abduction/machinery/dispenser.dm | 4 +- 4 files changed, 105 insertions(+), 58 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index e6365d5e65..d7ab46cb9c 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -14,6 +14,13 @@ origin_tech = "magnets=7;biotech=4;powerstorage=4;abductor=4" armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15, fire = 70, acid = 70) actions_types = list(/datum/action/item_action/hands_free/activate) + allowed = list( + /obj/item/device/abductor, + /obj/item/weapon/abductor_baton, + /obj/item/weapon/melee/baton, + /obj/item/weapon/gun/energy, + /obj/item/weapon/restraints/handcuffs + ) var/mode = VEST_STEALTH var/stealth_active = 0 var/combat_cooldown = 10 @@ -21,6 +28,11 @@ var/stealth_armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15, fire = 70, acid = 70) var/combat_armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 50, rad = 50, fire = 90, acid = 90) +/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop() + flags ^= NODROP + if(ismob(loc)) + to_chat(loc, "Your vest is now [flags & NODROP ? "locked" : "unlocked"].") + /obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() switch(mode) if(VEST_STEALTH) @@ -107,6 +119,18 @@ if(combat_cooldown==initial(combat_cooldown)) STOP_PROCESSING(SSobj, src) +/obj/item/clothing/suit/armor/abductor/Destroy() + STOP_PROCESSING(SSobj, src) + for(var/obj/machinery/abductor/console/C in GLOB.machines) + if(C.vest == src) + C.vest = null + break + . = ..() + + +/obj/item/device/abductor + icon = 'icons/obj/abductor.dmi' + /obj/item/device/abductor/proc/AbductorCheck(user) if(isabductor(user)) return TRUE @@ -114,14 +138,19 @@ return FALSE /obj/item/device/abductor/proc/ScientistCheck(user) + if(!AbductorCheck(user)) + return FALSE + var/mob/living/carbon/human/H = user var/datum/species/abductor/S = H.dna.species - return S.scientist + if(S.scientist) + return TRUE + to_chat(user, "You're not trained to use this!") + return FALSE /obj/item/device/abductor/gizmo name = "science tool" desc = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras." - icon = 'icons/obj/abductor.dmi' icon_state = "gizmo_scan" item_state = "silencer" origin_tech = "engineering=7;magnets=4;bluespace=4;abductor=3" @@ -130,11 +159,12 @@ var/obj/machinery/abductor/console/console /obj/item/device/abductor/gizmo/attack_self(mob/user) - if(!AbductorCheck(user)) - return if(!ScientistCheck(user)) - to_chat(user, "You're not trained to use this!") return + if(!console) + to_chat(user, "The device is not linked to console!") + return + if(mode == GIZMO_SCAN) mode = GIZMO_MARK icon_state = "gizmo_mark" @@ -144,11 +174,12 @@ to_chat(user, "You switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE") /obj/item/device/abductor/gizmo/attack(mob/living/M, mob/user) - if(!AbductorCheck(user)) - return if(!ScientistCheck(user)) - to_chat(user, "You're not trained to use this") return + if(!console) + to_chat(user, "The device is not linked to console!") + return + switch(mode) if(GIZMO_SCAN) scan(M, user) @@ -159,11 +190,12 @@ /obj/item/device/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params) if(flag) return - if(!AbductorCheck(user)) - return if(!ScientistCheck(user)) - to_chat(user, "You're not trained to use this") return + if(!console) + to_chat(user, "The device is not linked to console!") + return + switch(mode) if(GIZMO_SCAN) scan(target, user) @@ -172,9 +204,8 @@ /obj/item/device/abductor/gizmo/proc/scan(atom/target, mob/living/user) if(ishuman(target)) - if(console!=null) - console.AddSnapshot(target) - to_chat(user, "You scan [target] and add them to the database.") + console.AddSnapshot(target) + to_chat(user, "You scan [target] and add them to the database.") /obj/item/device/abductor/gizmo/proc/mark(atom/target, mob/living/user) if(marked == target) @@ -198,11 +229,15 @@ marked = target to_chat(user, "You finish preparing [target] for transport.") +/obj/item/device/abductor/gizmo/Destroy() + if(console) + console.gizmo = null + . = ..() + /obj/item/device/abductor/silencer name = "abductor silencer" desc = "A compact device used to shut down communications equipment." - icon = 'icons/obj/abductor.dmi' icon_state = "silencer" item_state = "gizmo" origin_tech = "materials=4;programming=7;abductor=3" @@ -419,10 +454,10 @@ Congratulations! You are now trained for invasive xenobiology research!"} if(!C.handcuffed) C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/used(C) C.update_handcuffed() - to_chat(user, "You handcuff [C].") + to_chat(user, "You restrain [C].") add_logs(user, C, "handcuffed") else - to_chat(user, "You fail to handcuff [C].") + to_chat(user, "You fail to restrain [C].") else to_chat(user, "[C] doesn't have two hands...") @@ -471,11 +506,11 @@ Congratulations! You are now trained for invasive xenobiology research!"} ..() switch(mode) if(BATON_STUN) - user <<"The baton is in stun mode." + to_chat(user, "The baton is in stun mode.") if(BATON_SLEEP) - user <<"The baton is in sleep inducement mode." + to_chat(user, "The baton is in sleep inducement mode.") if(BATON_CUFF) - user <<"The baton is in restraining mode." + to_chat(user, "The baton is in restraining mode.") if(BATON_PROBE) to_chat(user, "The baton is in probing mode.") diff --git a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm index 100c485263..c92fdddf26 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm @@ -22,13 +22,13 @@ if(console) var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H if(V) - console.vest = V + console.AddVest(V) V.flags |= NODROP - var/obj/item/device/abductor/gizmo/G = locate() in H.getBackSlot() - if(G) - console.gizmo = G - G.console = console + var/obj/item/weapon/storage/backpack/B = locate() in H + if(B) + for(var/obj/item/device/abductor/gizmo/G in B.contents) + console.AddGizmo(G) /datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() @@ -40,10 +40,10 @@ name = "Abductor Agent" head = /obj/item/clothing/head/helmet/abductor suit = /obj/item/clothing/suit/armor/abductor/vest + suit_store = /obj/item/weapon/abductor_baton belt = /obj/item/weapon/storage/belt/military/abductor/full backpack_contents = list( - /obj/item/weapon/abductor_baton = 1, /obj/item/weapon/gun/energy/alien = 1, /obj/item/device/abductor/silencer = 1 ) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index 2a23c37444..c569ac00cc 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -7,7 +7,7 @@ //Console /obj/machinery/abductor/console - name = "Abductor console" + name = "abductor console" desc = "Ship command center." icon = 'icons/obj/abductor.dmi' icon_state = "console" @@ -32,7 +32,7 @@ var/dat = "" dat += "

Abductsoft 3000

" - if(experiment != null) + if(experiment) var/points = experiment.points var/credits = experiment.credits dat += "Collected Samples : [points]
" @@ -46,18 +46,18 @@ else dat += "NO EXPERIMENT MACHINE DETECTED
" - if(pad!=null) + if(pad) dat += "Emergency Teleporter System." dat += "Consider using primary observation console first." dat += "Activate Teleporter
" - if(gizmo!=null && gizmo.marked!=null) + if(gizmo && gizmo.marked) dat += "Retrieve Mark
" else dat += "Retrieve Mark
" else dat += "NO TELEPAD DETECTED
" - if(vest!=null) + if(vest) dat += "

Agent Vest Mode


" var/mode = vest.mode if(mode == VEST_STEALTH) @@ -88,7 +88,8 @@ else if(href_list["flip_vest"]) FlipVest() else if(href_list["toggle_vest"]) - toggle_vest() + if(vest) + vest.toggle_nodrop() else if(href_list["select_disguise"]) SelectDisguise() else if(href_list["dispense"]) @@ -105,23 +106,22 @@ Dispense(/obj/item/clothing/suit/armor/abductor/vest) updateUsrDialog() - /obj/machinery/abductor/console/proc/TeleporterRetrieve() - if(gizmo!=null && pad!=null && gizmo.marked) + if(pad && gizmo && gizmo.marked) pad.Retrieve(gizmo.marked) /obj/machinery/abductor/console/proc/TeleporterSend() - if(pad!=null) + if(pad) pad.Send() /obj/machinery/abductor/console/proc/FlipVest() - if(vest!=null) + if(vest) vest.flip_mode() /obj/machinery/abductor/console/proc/SelectDisguise(remote = 0) var/entry_name = input( "Choose Disguise", "Disguise") as null|anything in disguises var/datum/icon_snapshot/chosen = disguises[entry_name] - if(chosen && (remote || in_range(usr,src))) + if(chosen && vest && (remote || in_range(usr,src))) vest.SetDisguise(chosen) /obj/machinery/abductor/console/proc/SetDroppoint(turf/open/location,user) @@ -169,36 +169,48 @@ return disguises[entry.name] = entry +/obj/machinery/abductor/console/proc/AddGizmo(obj/item/device/abductor/gizmo/G) + if(G == gizmo && G.console == src) + return FALSE + + if(G.console) + G.console.gizmo = null + + gizmo = G + G.console = src + return TRUE + +/obj/machinery/abductor/console/proc/AddVest(obj/item/clothing/suit/armor/abductor/vest/V) + if(vest == V) + return FALSE + + for(var/obj/machinery/abductor/console/C in GLOB.machines) + if(C.vest == V) + C.vest = null + break + + vest = V + return TRUE + /obj/machinery/abductor/console/attackby(obj/O, mob/user, params) - if(istype(O, /obj/item/device/abductor/gizmo)) - var/obj/item/device/abductor/gizmo/G = O + if(istype(O, /obj/item/device/abductor/gizmo) && AddGizmo(O)) to_chat(user, "You link the tool to the console.") - gizmo = G - G.console = src - else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest)) - var/obj/item/clothing/suit/armor/abductor/vest/V = O + else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest) && AddVest(O)) to_chat(user, "You link the vest to the console.") - if(istype(vest)) - if(vest.flags & NODROP) - toggle_vest() - vest = V else return ..() + + /obj/machinery/abductor/console/proc/Dispense(item,cost=1) if(experiment && experiment.credits >= cost) experiment.credits -=cost say("Incoming supply!") + var/drop_location = loc if(pad) flick("alien-pad", pad) - new item(pad.loc) - else - new item(loc) + drop_location = pad.loc + new item(drop_location) + else say("Insufficent data!") - -/obj/machinery/abductor/console/proc/toggle_vest() - vest.flags ^= NODROP - var/mob/M = vest.loc - if(istype(M)) - to_chat(M, "[src] is now [vest.flags & NODROP ? "locked" : "unlocked"].") diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm index d006ba0f68..8cf9acac0b 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm @@ -1,5 +1,5 @@ /obj/machinery/abductor/gland_dispenser - name = "Replacement Organ Storage" + name = "replacement organ storage" desc = "A tank filled with replacement organs." icon = 'icons/obj/abductor.dmi' icon_state = "dispenser" @@ -49,7 +49,7 @@ var/g_color = gland_colors[i] var/amount = amounts[i] dat += "[amount]" - if(item_count == 3) // Three boxes per line + if(item_count == 4) // Four boxes per line dat +="

" item_count = 0 var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200) From caaf42815aebb6cd02526910c8bb353d16722f64 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 28 Apr 2017 06:14:47 -0500 Subject: [PATCH 37/44] Changes some << to to_chat --- code/datums/helper_datums/getrev.dm | 4 ++-- code/datums/martial.dm | 2 +- code/datums/mind.dm | 2 +- code/game/atoms_movable.dm | 4 ++-- .../gamemodes/malfunction/Malf_Modules.dm | 2 +- .../miniantags/abduction/abduction_gear.dm | 6 ++--- code/game/gamemodes/miniantags/borer/borer.dm | 4 ++-- .../miniantags/slaughter/slaughter.dm | 2 +- code/game/machinery/computer/apc_control.dm | 2 +- code/game/machinery/computer/card.dm | 2 +- .../objects/items/weapons/holosign_creator.dm | 4 ++-- code/game/objects/items/weapons/stunbaton.dm | 4 ++-- code/game/objects/structures/fireaxe.dm | 6 ++--- .../atmospherics/machinery/airalarm.dm | 2 +- code/modules/clothing/suits/wiz_robe.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 4 ++-- .../projectiles/guns/energy/special.dm | 2 +- .../research/xenobiology/xenobiology.dm | 22 +++++++++---------- code/modules/shuttle/arrivals.dm | 2 +- .../spells/spell_types/area_teleport.dm | 2 +- code/modules/spells/spell_types/charge.dm | 4 ++-- code/modules/spells/spell_types/devil.dm | 2 +- interface/interface.dm | 10 ++++----- 23 files changed, 48 insertions(+), 48 deletions(-) diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index f1b5d3a973..8c9d7d7704 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -105,13 +105,13 @@ probs[ctag] = 1 prob_sum += config.probabilities[ctag] if(current_odds_differ) - src <<"Game Mode Odds for current round:" + to_chat(src, "Game Mode Odds for current round:") for(var/ctag in probs) if(config.probabilities[ctag] > 0) var/percentage = round(config.probabilities[ctag] / prob_sum * 100, 0.1) to_chat(src, "[ctag] [percentage]%") - src <<"All Game Mode Odds:" + to_chat(src, "All Game Mode Odds:") var/sum = 0 for(var/ctag in config.probabilities) sum += config.probabilities[ctag] diff --git a/code/datums/martial.dm b/code/datums/martial.dm index cc6fa4f2c8..b20bf556d5 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -657,7 +657,7 @@ /obj/item/weapon/cqc_manual/attack_self(mob/living/carbon/human/user) if(!istype(user) || !user) return - user <<"You remember the basics of CQC." + to_chat(user, "You remember the basics of CQC.") var/datum/martial_art/cqc/D = new(null) D.teach(user) user.drop_item() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 535247d750..5a6c34bcc4 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1143,7 +1143,7 @@ log_admin("[key_name_admin(usr)] has made [current] unable to ascend as a devil.") return if(!ishuman(current) && !iscyborg(current)) - usr << "This only works on humans and cyborgs!" + to_chat(usr, "This only works on humans and cyborgs!") return SSticker.mode.devils += src special_role = "devil" diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2d3d19f7c0..9ff8c7c1b6 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -562,7 +562,7 @@ return else var/turf/currentturf = get_turf(src) - get(src, /mob) << "You can't help but feel that you just lost something back there..." + to_chat(get(src, /mob), "You can't help but feel that you just lost something back there...") var/turf/targetturf = relocate() log_game("[src] has been moved out of bounds in [COORD(currentturf)]. Moving it to [COORD(targetturf)].") if(HAS_SECONDARY_FLAG(src, INFORM_ADMINS_ON_RELOCATE)) @@ -627,4 +627,4 @@ /atom/movable/proc/ConveyorMove(movedir) set waitfor = FALSE if(!anchored && has_gravity()) - step(src, movedir) + step(src, movedir) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index a7c466e746..4f09f2e362 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -556,7 +556,7 @@ var/mob/living/silicon/ai/A = usr if(A.stat == DEAD) - A <<"You are already dead!" //Omae Wa Mou Shindeiru + to_chat(A, "You are already dead!") //Omae Wa Mou Shindeiru return for(var/datum/AI_Module/AM in possible_modules) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index e6365d5e65..2c28109f5f 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -471,11 +471,11 @@ Congratulations! You are now trained for invasive xenobiology research!"} ..() switch(mode) if(BATON_STUN) - user <<"The baton is in stun mode." + to_chat(user, "The baton is in stun mode.") if(BATON_SLEEP) - user <<"The baton is in sleep inducement mode." + to_chat(user, "The baton is in sleep inducement mode.") if(BATON_CUFF) - user <<"The baton is in restraining mode." + to_chat(user, "The baton is in restraining mode.") if(BATON_PROBE) to_chat(user, "The baton is in probing mode.") diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index b10fb16768..92cff03ec9 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -628,7 +628,7 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10) chemicals -= 250 to_chat(src, "You send a jolt of energy to your host, reviving them!") victim.grab_ghost(force = TRUE) //brings the host back, no eggscape - victim <<"You bolt upright, gasping for breath!" + to_chat(victim, "You bolt upright, gasping for breath!") /mob/living/simple_animal/borer/verb/bond_brain() set category = "Borer" @@ -672,7 +672,7 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10) if(!bonding) return if(docile) - src <<"You are feeling far too docile to do that." + to_chat(src, "You are feeling far too docile to do that.") return if(is_servant_of_ratvar(victim) || iscultist(victim) || victim.isloyal()) to_chat(src, "[victim]'s mind seems to be blocked by some unknown force!") diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index c3d06bfe2c..53e92c639d 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -92,7 +92,7 @@ playsound(user, 'sound/magic/Demon_consume.ogg', 50, 1) for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl) - user <<"...and you don't feel any different." + to_chat(user, "...and you don't feel any different.") qdel(src) return user.visible_message("[user]'s eyes flare a deep crimson!", \ diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 753cd42a4f..0c1b870771 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -108,7 +108,7 @@ if(!authenticated) //Check for emags var/obj/item/weapon/card/emag/E = usr.get_active_held_item() if(E && istype(E) && usr.Adjacent(src)) - usr << "You bypass [src]'s access requirements using your emag." + to_chat(usr, "You bypass [src]'s access requirements using your emag.") authenticated = TRUE log_activity("logged in") //Auth ID doesn't change, hinting that it was illicit if(href_list["log_out"]) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 907d7b5a6d..ca329f61e5 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -532,7 +532,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) else SSjob.prioritized_jobs += j prioritycount++ - usr << "[j.title] has been successfully [priority ? "prioritized" : "unprioritized"]. Potential employees will notice your request." + to_chat(usr, "[j.title] has been successfully [priority ? "prioritized" : "unprioritized"]. Potential employees will notice your request.") playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) if ("print") diff --git a/code/game/objects/items/weapons/holosign_creator.dm b/code/game/objects/items/weapons/holosign_creator.dm index fb68e33f45..3b611883e6 100644 --- a/code/game/objects/items/weapons/holosign_creator.dm +++ b/code/game/objects/items/weapons/holosign_creator.dm @@ -87,7 +87,7 @@ var/mob/living/silicon/robot/R = user if(shock) - user <<"You clear all active holograms, and reset your projector to normal." + to_chat(user, "You clear all active holograms, and reset your projector to normal.") holosign_type = /obj/structure/holosign/barrier/cyborg creation_time = 5 if(signs.len) @@ -96,7 +96,7 @@ shock = 0 return else if(R.emagged&&!shock) - user <<"You clear all active holograms, and overload your energy projector!" + to_chat(user, "You clear all active holograms, and overload your energy projector!") holosign_type = /obj/structure/holosign/barrier/cyborg/hacked creation_time = 30 if(signs.len) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 91372da6ae..5393f40ec6 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -60,9 +60,9 @@ /obj/item/weapon/melee/baton/examine(mob/user) ..() if(bcell) - user <<"The baton is [round(bcell.percent())]% charged." + to_chat(user, "The baton is [round(bcell.percent())]% charged.") else - user <<"The baton does not have a power source installed." + to_chat(user, "The baton does not have a power source installed.") /obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/stock_parts/cell)) diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index e2331e13dc..8d9c668542 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -115,7 +115,7 @@ update_icon() return if(locked) - user <<" The [name] won't budge!" + to_chat(user, "The [name] won't budge!") return else open = !open @@ -131,7 +131,7 @@ /obj/structure/fireaxecabinet/attack_tk(mob/user) if(locked) - user <<" The [name] won't budge!" + to_chat(user, "The [name] won't budge!") return else open = !open @@ -177,7 +177,7 @@ set src in oview(1) if(locked) - usr <<" The [name] won't budge!" + to_chat(usr, "The [name] won't budge!") return else open = !open diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 5c197332d1..a8a998e349 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -662,7 +662,7 @@ playsound(src.loc, W.usesound, 50, 1) if (do_after(user, 20*W.toolspeed, target = src)) if (buildstage == 1) - user <<"You remove the air alarm electronics." + to_chat(user, "You remove the air alarm electronics.") new /obj/item/weapon/electronics/airalarm( src.loc ) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) buildstage = 0 diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index bb4d1f1e0d..55dbc4d19b 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -224,5 +224,5 @@ to_chat(user, "The rune can only be used on battlemage armour!") return W.current_charges += 8 - user <<"You charge \the [W]. It can now absorb [W.current_charges] hits." + to_chat(user, "You charge \the [W]. It can now absorb [W.current_charges] hits.") qdel(src) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index cb10935323..d3fe5eb6d2 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -238,7 +238,7 @@ else if(icontype == "Angel") icon_state = "ai-angel" //else - //usr <<"You can only change your display once!" + //to_chat(usr, "You can only change your display once!") //return /mob/living/silicon/ai/Stat() @@ -351,7 +351,7 @@ if(isAI(usr)) var/mob/living/silicon/ai/AI = src if(AI.control_disabled) - src << "Wireless control is disabled!" + to_chat(src, "Wireless control is disabled!") return SSshuttle.cancelEvac(src) return diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index cb385db4b8..a8ae4da97a 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -138,7 +138,7 @@ /obj/item/weapon/gun/energy/plasmacutter/examine(mob/user) ..() if(power_supply) - user <<"[src] is [round(power_supply.percent())]% charged." + to_chat(user, "[src] is [round(power_supply.percent())]% charged.") /obj/item/weapon/gun/energy/plasmacutter/attackby(obj/item/A, mob/user) if(istype(A, /obj/item/stack/sheet/mineral/plasma)) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 38d742c5be..04c5c63989 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -20,7 +20,7 @@ if(Uses >= 5) to_chat(user, "You cannot enhance this extract further!") return ..() - user <<"You apply the enhancer to the slime extract. It may now be reused one more time." + to_chat(user, "You apply the enhancer to the slime extract. It may now be reused one more time.") Uses++ qdel(O) ..() @@ -146,8 +146,8 @@ M.docile = 1 M.nutrition = 700 - M <<"You absorb the potion and feel your intense desire to feed melt away." - user <<"You feed the slime the potion, removing its hunger and calming it." + to_chat(M, "You absorb the potion and feel your intense desire to feed melt away.") + to_chat(user, "You feed the slime the potion, removing its hunger and calming it.") var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN) if (!newname) @@ -261,10 +261,10 @@ to_chat(user, "The slime is dead!") return ..() if(M.cores >= 5) - user <<"The slime already has the maximum amount of extract!" + to_chat(user, "The slime already has the maximum amount of extract!") return ..() - user <<"You feed the slime the steroid. It will now produce one more extract." + to_chat(user, "You feed the slime the steroid. It will now produce one more extract.") M.cores++ qdel(src) @@ -288,10 +288,10 @@ to_chat(user, "The slime is dead!") return ..() if(M.mutation_chance == 0) - user <<"The slime already has no chance of mutating!" + to_chat(user, "The slime already has no chance of mutating!") return ..() - user <<"You feed the slime the stabilizer. It is now less likely to mutate." + to_chat(user, "You feed the slime the stabilizer. It is now less likely to mutate.") M.mutation_chance = Clamp(M.mutation_chance-15,0,100) qdel(src) @@ -312,10 +312,10 @@ to_chat(user, "This slime has already consumed a mutator, any more would be far too unstable!") return ..() if(M.mutation_chance == 100) - user <<"The slime is already guaranteed to mutate!" + to_chat(user, "The slime is already guaranteed to mutate!") return ..() - user <<"You feed the slime the mutator. It is now more likely to mutate." + to_chat(user, "You feed the slime the mutator. It is now more likely to mutate.") M.mutation_chance = Clamp(M.mutation_chance+12,0,100) M.mutator_used = TRUE qdel(src) @@ -348,7 +348,7 @@ return ..() R.vehicle_move_delay = 0 - user <<"You slather the red gunk over the [C], making it faster." + to_chat(user, "You slather the red gunk over the [C], making it faster.") C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) C.add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY) qdel(src) @@ -373,7 +373,7 @@ if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) to_chat(user, "The [C] is already fireproof!") return ..() - user <<"You slather the blue gunk over the [C], fireproofing it." + to_chat(user, "You slather the blue gunk over the [C], fireproofing it.") C.name = "fireproofed [C.name]" C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index b4af9d9e17..ef4efd4342 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -177,7 +177,7 @@ Launch(TRUE) - user << "Calling your shuttle. One moment..." + to_chat(user, "Calling your shuttle. One moment...") while(mode != SHUTTLE_CALL && !damaged) stoplag() diff --git a/code/modules/spells/spell_types/area_teleport.dm b/code/modules/spells/spell_types/area_teleport.dm index d9702cd0b7..380b7e4728 100644 --- a/code/modules/spells/spell_types/area_teleport.dm +++ b/code/modules/spells/spell_types/area_teleport.dm @@ -47,7 +47,7 @@ L+=T if(!L.len) - usr <<"The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry." + to_chat(usr, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") return if(target && target.buckled) diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm index 32bdf54a31..c37166a244 100644 --- a/code/modules/spells/spell_types/charge.dm +++ b/code/modules/spells/spell_types/charge.dm @@ -26,9 +26,9 @@ if(M.mind) for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list) S.charge_counter = S.charge_max - M <<"You feel raw magic flowing through you. It feels good!" + to_chat(M, "You feel raw magic flowing through you. It feels good!") else - M <<"you feel very strange for a moment, but then it passes." + to_chat(M, "You feel very strange for a moment, but then it passes.") burnt_out = 1 charged_item = M break diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm index c9ff892910..8e8968fb52 100644 --- a/code/modules/spells/spell_types/devil.dm +++ b/code/modules/spells/spell_types/devil.dm @@ -234,7 +234,7 @@ else var/list/funky_turfs = RANGE_TURFS(1, user) for(var/turf/closed/solid in funky_turfs) - user << "You're too close to a wall." + to_chat(user, "You're too close to a wall.") return dancefloor_exists = TRUE var/i = 1 diff --git a/interface/interface.dm b/interface/interface.dm index 35b70d9caf..6ee0e7ac64 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -78,7 +78,7 @@ Admin: mob.hotkey_help() if(holder) - src << adminhotkeys + to_chat(src, adminhotkeys) /client/verb/changelog() set name = "Changelog" @@ -168,8 +168,8 @@ Any-Mode: (hotkey doesn't need to be on) \tCtrl+Numpad = Body target selection (Press 8 repeatedly for Head->Eyes->Mouth) "} - src << hotkey_mode - src << other + to_chat(src, hotkey_mode) + to_chat(src, other) /mob/living/silicon/robot/hotkey_help() //h = talk-wheel has a nonsense tag in it because \th is an escape sequence in BYOND. @@ -220,8 +220,8 @@ Any-Mode: (hotkey doesn't need to be on) \tPGDN = activate held object "} - src << hotkey_mode - src << other + to_chat(src, hotkey_mode) + to_chat(src, other) // Needed to circumvent a bug where .winset does not work when used on the window.on-size event in skins. // Used by /datum/html_interface/nanotrasen (code/modules/html_interface/nanotrasen/nanotrasen.dm) From 0331578b084d2d3f98b0123aa64172decf167350 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 28 Apr 2017 08:14:01 -0500 Subject: [PATCH 38/44] fix for ear runtime --- code/modules/surgery/organs/ears.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index c35cf5c670..c91cb219af 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -22,7 +22,7 @@ if(C.disabilities & DEAF) deaf = max(deaf, 1) else - if(HAS_SECONDARY_FLAG(C.ears, HEALS_EARS)) + if(C.ears && HAS_SECONDARY_FLAG(C.ears, HEALS_EARS)) deaf = max(deaf - 1, 1) ear_damage = max(ear_damage - 0.10, 0) // if higher than UNHEALING_EAR_DAMAGE, no natural healing occurs. From 4d3c6bb57f1de574eff10b58e1d0457bc918db57 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 28 Apr 2017 08:15:35 -0500 Subject: [PATCH 39/44] Automatic changelog generation for PR #586 [ci skip] --- html/changelogs/AutoChangeLog-pr-586.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-586.yml diff --git a/html/changelogs/AutoChangeLog-pr-586.yml b/html/changelogs/AutoChangeLog-pr-586.yml new file mode 100644 index 0000000000..70003ac843 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-586.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "Tweaked how things were deleted to cut down on lag from consecutive deletes and provide better logging for things that cause lag when hard-deleted." From 23339918135e89d38894518c26c049bd2f8cae70 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 28 Apr 2017 08:15:56 -0500 Subject: [PATCH 40/44] Automatic changelog generation for PR #595 [ci skip] --- html/changelogs/AutoChangeLog-pr-595.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-595.yml diff --git a/html/changelogs/AutoChangeLog-pr-595.yml b/html/changelogs/AutoChangeLog-pr-595.yml new file mode 100644 index 0000000000..d2cf3e3ae6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-595.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "Heads of staff may now download the ID card modification program from NTNet." From 085b421348c4b306fbac6da96438c579f19739f9 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 28 Apr 2017 09:03:56 -0500 Subject: [PATCH 41/44] rej fixes --- code/__DEFINES/subsystems.dm | 18 +++ code/controllers/subsystem/atoms.dm | 143 +++++++++++------- code/modules/admin/admin_verbs.dm | 4 +- code/modules/holodeck/computer.dm | 84 +++++----- .../modules/mob/dead/new_player/new_player.dm | 7 +- code/modules/recycling/conveyor2.dm | 7 +- code/modules/shuttle/arrivals.dm | 14 +- code/modules/surgery/surgery.dm | 2 +- 8 files changed, 165 insertions(+), 114 deletions(-) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 0b27e01326..c0b9a20d3b 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -20,6 +20,24 @@ #define FLIGHTSUIT_PROCESSING_NONE 0 #define FLIGHTSUIT_PROCESSING_FULL 1 +#define INITIALIZATION_INSSATOMS 0 //New should not call Initialize +#define INITIALIZATION_INNEW_MAPLOAD 1 //New should call Initialize(TRUE) +#define INITIALIZATION_INNEW_REGULAR 2 //New should call Initialize(FALSE) + +#define INITIALIZE_HINT_NORMAL 0 //Nothing happens +#define INITIALIZE_HINT_LATELOAD 1 //Call LateInitialize +#define INITIALIZE_HINT_QDEL 2 //Call qdel on the atom + +//type and all subtypes should always call Initialize in New() +#define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){\ + ..();\ + if(!initialized) {\ + args[1] = TRUE;\ + SSatoms.InitAtom(src, args);\ + }\ +} + + // Subsystem init_order, from highest priority to lowest priority // The numbers just define the ordering, they are meaningless otherwise. diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 487946696d..711da25889 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -2,32 +2,35 @@ #define BAD_INIT_DIDNT_INIT 2 #define BAD_INIT_SLEPT 4 #define BAD_INIT_NO_HINT 8 - -SUBSYSTEM_DEF(atoms) - name = "Atoms" + +SUBSYSTEM_DEF(atoms) + name = "Atoms" init_order = INIT_ORDER_ATOMS - flags = SS_NO_FIRE - - var/initialized = INITIALIZATION_INSSATOMS - var/old_initialized - - var/list/late_loaders - -/datum/controller/subsystem/atoms/Initialize(timeofday) - GLOB.fire_overlay.appearance_flags = RESET_COLOR - setupGenetics() //to set the mutations' place in structural enzymes, so monkey.initialize() knows where to put the monkey mutation. - initialized = INITIALIZATION_INNEW_MAPLOAD - InitializeAtoms() - return ..() - + flags = SS_NO_FIRE + + var/initialized = INITIALIZATION_INSSATOMS + var/old_initialized + + var/list/late_loaders + var/list/created_atoms + + var/list/BadInitializeCalls = list() + +/datum/controller/subsystem/atoms/Initialize(timeofday) + GLOB.fire_overlay.appearance_flags = RESET_COLOR + setupGenetics() //to set the mutations' place in structural enzymes, so monkey.initialize() knows where to put the monkey mutation. + initialized = INITIALIZATION_INNEW_MAPLOAD + InitializeAtoms() + return ..() + /datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms) - if(initialized == INITIALIZATION_INSSATOMS) - return - + if(initialized == INITIALIZATION_INSSATOMS) + return + initialized = INITIALIZATION_INNEW_MAPLOAD LAZYINITLIST(late_loaders) - + var/count var/list/mapload_arg = list(TRUE) if(atoms) @@ -57,10 +60,10 @@ SUBSYSTEM_DEF(atoms) A.LateInitialize() testing("Late initialized [late_loaders.len] atoms") late_loaders.Cut() - + if(atoms) . = created_atoms + atoms - created_atoms = null + created_atoms = null /datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments) var/the_type = A.type @@ -74,7 +77,7 @@ SUBSYSTEM_DEF(atoms) if(start_tick != world.time) BadInitializeCalls[the_type] |= BAD_INIT_SLEPT - + var/qdeleted = FALSE if(result != INITIALIZE_HINT_NORMAL) @@ -89,43 +92,67 @@ SUBSYSTEM_DEF(atoms) qdeleted = TRUE else BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT - + if(!A) //possible harddel qdeleted = TRUE else if(!A.initialized) BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT - + return qdeleted || QDELETED(A) - -/datum/controller/subsystem/atoms/proc/map_loader_begin() - old_initialized = initialized - initialized = INITIALIZATION_INSSATOMS - -/datum/controller/subsystem/atoms/proc/map_loader_stop() - initialized = old_initialized - -/datum/controller/subsystem/atoms/Recover() - initialized = SSatoms.initialized - if(initialized == INITIALIZATION_INNEW_MAPLOAD) - InitializeAtoms() - old_initialized = SSatoms.old_initialized + +/datum/controller/subsystem/atoms/proc/map_loader_begin() + old_initialized = initialized + initialized = INITIALIZATION_INSSATOMS + +/datum/controller/subsystem/atoms/proc/map_loader_stop() + initialized = old_initialized + +/datum/controller/subsystem/atoms/Recover() + initialized = SSatoms.initialized + if(initialized == INITIALIZATION_INNEW_MAPLOAD) + InitializeAtoms() + old_initialized = SSatoms.old_initialized BadInitializeCalls = SSatoms.BadInitializeCalls - -/datum/controller/subsystem/atoms/proc/setupGenetics() - var/list/avnums = new /list(DNA_STRUC_ENZYMES_BLOCKS) - for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++) - avnums[i] = i - CHECK_TICK - - for(var/A in subtypesof(/datum/mutation/human)) - var/datum/mutation/human/B = new A() - if(B.dna_block == NON_SCANNABLE) - continue - B.dna_block = pick_n_take(avnums) - if(B.quality == POSITIVE) - GLOB.good_mutations |= B - else if(B.quality == NEGATIVE) - GLOB.bad_mutations |= B - else if(B.quality == MINOR_NEGATIVE) - GLOB.not_good_mutations |= B - CHECK_TICK + +/datum/controller/subsystem/atoms/proc/setupGenetics() + var/list/avnums = new /list(DNA_STRUC_ENZYMES_BLOCKS) + for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++) + avnums[i] = i + CHECK_TICK + + for(var/A in subtypesof(/datum/mutation/human)) + var/datum/mutation/human/B = new A() + if(B.dna_block == NON_SCANNABLE) + continue + B.dna_block = pick_n_take(avnums) + if(B.quality == POSITIVE) + GLOB.good_mutations |= B + else if(B.quality == NEGATIVE) + GLOB.bad_mutations |= B + else if(B.quality == MINOR_NEGATIVE) + GLOB.not_good_mutations |= B + CHECK_TICK + +/datum/controller/subsystem/atoms/proc/InitLog() + . = "" + for(var/path in BadInitializeCalls) + . += "Path : [path] \n" + var/fails = BadInitializeCalls[path] + if(fails & BAD_INIT_DIDNT_INIT) + . += "- Didn't call atom/Initialize()\n" + if(fails & BAD_INIT_NO_HINT) + . += "- Didn't return an Initialize hint\n" + if(fails & BAD_INIT_QDEL_BEFORE) + . += "- Qdel'd in New()\n" + if(fails & BAD_INIT_SLEPT) + . += "- Slept during Initialize()\n" + +/datum/controller/subsystem/atoms/Shutdown() + var/initlog = InitLog() + if(initlog) + log_world(initlog) + +#undef BAD_INIT_QDEL_BEFORE +#undef BAD_INIT_DIDNT_INIT +#undef BAD_INIT_SLEPT +#undef BAD_INIT_NO_HINT diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 22045b99ff..19e2c372b3 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -166,8 +166,10 @@ GLOBAL_LIST_INIT(admin_verbs_debug, AVerbsDebug()) //citadel code /client/proc/give_humans_genitals, /client/proc/test_mammal_overlays, - /client/proc/pump_random_event + /client/proc/pump_random_event, + /client/proc/cmd_display_init_log ) + GLOBAL_PROTECT(admin_verbs_possess) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess,/proc/release)) GLOBAL_PROTECT(admin_verbs_permissions) diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index 18be292e97..7947ef4413 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -45,52 +45,52 @@ var/list/effects = list() var/last_change = 0 - + /obj/machinery/computer/holodeck/Initialize(mapload) - . = mapload //late-initialize, area_copy need turfs to have air - if(!mapload) - ..() + ..() + return INITIALIZE_HINT_LATELOAD - if(ispath(holodeck_type,/area)) - var/list/possible = get_areas(holodeck_type,subtypes = FALSE) - linked = pop(possible) - if(ispath(offline_program,/area)) - var/list/possible = get_areas(offline_program,subtypes = FALSE) - offline_program = pop(possible) - // the following is necessary for power reasons - if(!linked || !offline_program) - log_world("No matching holodeck area found") - qdel(src) - return - var/area/AS = get_area(src) - if(istype(AS,/area/holodeck)) - log_world("### MAPPING ERROR") - log_world("Holodeck computer cannot be in a holodeck.") - log_world("This would cause circular power dependency.") - qdel(src) // todo handle constructed computers - return //l-lewd... - else - linked.linked = src // todo detect multiple/constructed computers +/obj/machinery/computer/holodeck/LateInitialize() + if(ispath(holodeck_type,/area)) + var/list/possible = get_areas(holodeck_type,subtypes = FALSE) + linked = pop(possible) + if(ispath(offline_program,/area)) + var/list/possible = get_areas(offline_program,subtypes = FALSE) + offline_program = pop(possible) + // the following is necessary for power reasons + if(!linked || !offline_program) + log_world("No matching holodeck area found") + qdel(src) + return + var/area/AS = get_area(src) + if(istype(AS,/area/holodeck)) + log_world("### MAPPING ERROR") + log_world("Holodeck computer cannot be in a holodeck.") + log_world("This would cause circular power dependency.") + qdel(src) // todo handle constructed computers + return //l-lewd... + else + linked.linked = src // todo detect multiple/constructed computers - program_cache = list() - emag_programs = list() - for(var/typekey in subtypesof(program_type)) - var/area/holodeck/A = locate(typekey) - if(!A || A == offline_program) - continue - if(A.contents.len == 0) - continue // not loaded - if(A.restricted) - emag_programs += A - else - program_cache += A - if(typekey == init_program) - load_program(A,force=1) - if(random_program && program_cache.len && init_program == null) - load_program(pick(program_cache),force=1) - else if(!program) - load_program(offline_program) + program_cache = list() + emag_programs = list() + for(var/typekey in subtypesof(program_type)) + var/area/holodeck/A = locate(typekey) + if(!A || A == offline_program) + continue + if(A.contents.len == 0) + continue // not loaded + if(A.restricted) + emag_programs += A + else + program_cache += A + if(typekey == init_program) + load_program(A,force=1) + if(random_program && program_cache.len && init_program == null) + load_program(pick(program_cache),force=1) + else if(!program) + load_program(offline_program) /obj/machinery/computer/holodeck/power_change() ..() diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 72f83bf546..e6adb53ff6 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -30,6 +30,7 @@ loc = pick(GLOB.newplayer_start) else loc = locate(1,1,1) + return INITIALIZE_HINT_NORMAL /mob/dead/new_player/proc/new_player_panel() @@ -48,11 +49,11 @@ output += "

Observe

" if(!IsGuestKey(src.key)) - if (SSdbcore.Connect()) + if (SSdbcore.Connect()) var/isadmin = 0 if(src.client && src.client.holder) isadmin = 1 - var/datum/DBQuery/query_get_new_polls = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM [format_table_name("poll_vote")] WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM [format_table_name("poll_textreply")] WHERE ckey = \"[ckey]\")") + var/datum/DBQuery/query_get_new_polls = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM [format_table_name("poll_vote")] WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM [format_table_name("poll_textreply")] WHERE ckey = \"[ckey]\")") if(!query_get_new_polls.Execute()) return var/newpoll = 0 @@ -302,7 +303,7 @@ if(!IsJobAvailable(rank)) alert(src, "[rank] is not available. Please try another.") return 0 - + if(SSticker.late_join_disabled) alert(src, "An administrator has disabled late join spawning.") return FALSE diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 264b6a167d..68190f5e45 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -212,13 +212,14 @@ /obj/machinery/conveyor_switch/Initialize(mapload, newid) - if(mapload) - return TRUE //need machines list - . = ..() + ..() if(!id) id = newid update() + return INITIALIZE_HINT_LATELOAD //for machines list + +/obj/machinery/conveyor_switch/LateInitialize() conveyors = list() for(var/obj/machinery/conveyor/C in GLOB.machines) if(C.id == id) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index b4af9d9e17..6b0279e859 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -22,20 +22,22 @@ var/perma_docked = FALSE //highlander with RESPAWN??? OH GOD!!! /obj/docking_port/mobile/arrivals/Initialize(mapload) - if(mapload) - return TRUE //late initialize to make sure the latejoin list is populated - preferred_direction = dir if(SSshuttle.arrivals) WARNING("More than one arrivals docking_port placed on map!") - qdel(src) - return + + return INITIALIZE_HINT_QDEL SSshuttle.arrivals = src - . = ..() + . = ..() + preferred_direction = dir + return INITIALIZE_HINT_LATELOAD //for latejoin list + + +/obj/docking_port/mobile/arrivals/LateInitialize() areas = list() var/list/new_latejoin = list() diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 93acbfbb91..f9a3b5c0cf 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -54,7 +54,7 @@ return new step_type /datum/surgery/proc/complete() - feedback_add_details("surgeries_completed", type) + feedback_add_details("surgeries_completed", "[type]") qdel(src) From 67300fc3b28db46e391c328d65ca24f62e070a72 Mon Sep 17 00:00:00 2001 From: lm40 Date: Fri, 28 Apr 2017 20:17:21 -0400 Subject: [PATCH 42/44] Update emotes.dm --- code/datums/emotes.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 0d6488c633..9f2753dfee 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -35,10 +35,6 @@ var/msg = select_message_type(user) if(params && message_param) msg = select_param(user, params) - if(findtext(msg, "their")) - msg = replacetext(msg, "their", user.p_their()) - if(findtext(msg, "them")) - msg = replacetext(msg, "them", user.p_them()) if(findtext(msg, "%s")) msg = replacetext(msg, "%s", user.p_s()) From 588cad87b6f7e4f4966f1d473099bf9e607ca1da Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sat, 29 Apr 2017 03:20:28 -0500 Subject: [PATCH 43/44] Update headcrab.dm --- code/modules/mob/living/simple_animal/hostile/headcrab.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 07ff6592df..77b68a936d 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -22,7 +22,7 @@ ventcrawler = VENTCRAWLER_ALWAYS var/datum/mind/origin var/egg_lain = 0 - gold_core_spawnable = 1 //are you sure about this?? +// gold_core_spawnable = 1 //are you sure about this?? /mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim) var/obj/item/organ/body_egg/changeling_egg/egg = new(victim) From fca3f200b38be759a79cb26e8640cbe3e9e933d9 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sat, 29 Apr 2017 08:27:54 -0500 Subject: [PATCH 44/44] fixed RD PDA sprite --- icons/obj/pda.dmi | Bin 28296 -> 28294 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index d0e2f6845106e0c8be3167c555514e1f79642832..413503f7b3af1b421a5a28762f611b7d40ebabb5 100644 GIT binary patch delta 568 zcmV-80>}M`-2sN(0gxnr9ePw)bVOxyV{&P5bZKvH004NLm6yS8+b|4<&-POY?KK&e zY=>TaDN+nMw68EQ5@WNGMORYe`R#Woux`QH{Jhz~M^X|g@#n3(fB3O~a=XWUd*)n3 zlk42~FJIecmQV-Rxo_LH8Cd$EzWtO+m0jmdDf=Sa&<+XTsf#dU7eHpfgOzkR=> zsc^0^K9Rs|lzzZHUk@E)S5CpOV^6uq6W~=(pTW(bwM<%F=Qf+wcDuT;4_w(-IU7nkGGV*%lq&?S z8N)^l^8=$Kh7A~2z@Sm*grS6C&lvWCVO4*DAXCQ31BOL^0YP5SiV-lwiY5;X>_^4G z4BfhkBvrnC+VALEk4FoB$a>=IW%-wdk6IY)LBg+<6D7P&L^))_-(|?>pT`dGgoYN2 z>I_)C;O!KYPI&*ZXg!mV#G5`S#c2Pe8aQ#SWqe^RuPZ)~Vn<+~>l2@@r{W{v);&D!-0pGT{s!uz57JdaRvNQR G0z7OjEE<3S delta 570 zcmV-A0>%A?-2sT*0gxnrA9_?+bVOxyV{&P5bZKvH004NLt(U=W+b|4<&-POY?KK&i zY=>TaDN+nMw68EQ5@WNGMORXj`t5fpwr;`N`~-HhfsdplQsU2RcX$7N`{*_g+xE!0 zh$h#$Z(nZO<|LsGu5(}4Z8Na+Lw)-xl`6Z=T}k+%N6wMvtF{S$l8fuys%`d}Mt=K# zM^oWkVSFNi*(m*hd%hex&@wMIhJTamwh0_*cAdLj-2QF$q0yQ9k%M@OFn^S+QTrJ- zDC}RdRNTPRR7nyZU`|1B?*mQI;@(F+;WVdS67wfXJ2QBqBvo;~c;Vz3=ATEr6lBEx z4m#mSh`aTp!fXzIhSe6BjdYp~2^{8-4Qtk&R`F7*AuY+U9IB&XuRSNO;&B5%@F=Bb z{5qc~2gWbZj&kJ`3_JFedprSN_3#EypGv%jWJTyPnmS<4fPPo-Fy+lTwahs*i+2)K6lj~lmn*tS0bCE*d)+CBer Ivq}OyY;4LKy#N3J