diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm
index d3c520a6696..6a368e05b16 100644
--- a/_maps/map_files/RandomZLevels/spacehotel.dmm
+++ b/_maps/map_files/RandomZLevels/spacehotel.dmm
@@ -473,7 +473,7 @@
"je" = (/obj/machinery/gateway{dir = 4},/turf/unsimulated/floor{icon_state = "warning"; dir = 4},/area/awaymission/spacehotel)
"jf" = (/obj/structure/window/basic{icon_state = "window"; dir = 8},/obj/structure/flora/rock,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/grass,/area/awaymission/spacehotel)
"jg" = (/obj/item/candle,/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
-"jh" = (/obj/effect/rune,/obj/item/organ/brain,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"jh" = (/obj/effect/rune,/obj/item/organ/internal/brain,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
"ji" = (/obj/item/candle,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
"jj" = (/obj/item/weapon/tome,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
"jk" = (/obj/structure/closet/crate/critter,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel)
diff --git a/code/__DEFINES/process_scheduler.dm b/code/__DEFINES/process_scheduler.dm
index d9c8f106efc..f1e30c23ed3 100644
--- a/code/__DEFINES/process_scheduler.dm
+++ b/code/__DEFINES/process_scheduler.dm
@@ -7,13 +7,12 @@
#define PROCESS_STATUS_HUNG 6
// Process time thresholds
-#define PROCESS_DEFAULT_HANG_WARNING_TIME 300 // 30 seconds
-#define PROCESS_DEFAULT_HANG_ALERT_TIME 600 // 60 seconds
-#define PROCESS_DEFAULT_HANG_RESTART_TIME 900 // 90 seconds
-#define PROCESS_DEFAULT_SCHEDULE_INTERVAL 50 // 50 ticks
-#define PROCESS_DEFAULT_SLEEP_INTERVAL 8 // 1/8th of a tick
+#define PROCESS_DEFAULT_HANG_WARNING_TIME 300 // 30 seconds
+#define PROCESS_DEFAULT_HANG_ALERT_TIME 600 // 60 seconds
+#define PROCESS_DEFAULT_HANG_RESTART_TIME 900 // 90 seconds
+#define PROCESS_DEFAULT_SCHEDULE_INTERVAL 50 // 50 ticks
+#define PROCESS_DEFAULT_SLEEP_INTERVAL 20 // 20% of a tick
+#define PROCESS_DEFAULT_DEFER_USAGE 90 // 90% of a tick
-// SCHECK macros
-// This references src directly to work around a weird bug with try/catch
-#define SCHECK_EVERY(this_many_calls) if(++src.calls_since_last_scheck >= this_many_calls) sleepCheck()
-#define SCHECK sleepCheck()
+// Sleep check macro
+#define SCHECK if(world.tick_usage >= next_sleep_usage) defer()
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 50653a71199..a476fbc78d5 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -221,7 +221,7 @@
A.ShiftClick(src)
return
/atom/proc/ShiftClick(var/mob/user)
- if(user.client && user.client.eye == user)
+ if(user.client && get_turf(user.client.eye) == get_turf(user))
user.examinate(src)
return
diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm
index 8cbf9ec3faa..b29ef0f2fa2 100644
--- a/code/controllers/ProcessScheduler/core/process.dm
+++ b/code/controllers/ProcessScheduler/core/process.dm
@@ -48,7 +48,10 @@
// This controls how often the process will yield (call sleep(0)) while it is running.
// Every concurrent process should sleep periodically while running in order to allow other
// processes to execute concurrently.
- var/tmp/sleep_interval
+ var/tmp/sleep_interval = PROCESS_DEFAULT_SLEEP_INTERVAL
+
+ // Defer usage; the tick usage at which this process will defer until the next tick
+ var/tmp/defer_usage = PROCESS_DEFAULT_DEFER_USAGE
// hang_warning_time - this is the time (in 1/10 seconds) after which the server will begin to show "maybe hung" in the context window
var/tmp/hang_warning_time = PROCESS_DEFAULT_HANG_WARNING_TIME
@@ -59,19 +62,13 @@
// hang_restart_time - After this much time(in 1/10 seconds), the server will automatically kill and restart the process.
var/tmp/hang_restart_time = PROCESS_DEFAULT_HANG_RESTART_TIME
- // How many times in the current run has the process deferred work till the next tick?
- var/tmp/cpu_defer_count = 0
-
- // How many SCHECKs have been skipped (to limit btime calls)
- var/tmp/calls_since_last_scheck = 0
+ // Number of deciseconds to delay before starting the process
+ var/start_delay = 0
/**
* recordkeeping vars
*/
- // Records the time (1/10s timeoftick) at which the process last finished sleeping
- var/tmp/last_slept = 0
-
// Records the time (1/10s timeofgame) at which the process last began running
var/tmp/run_start = 0
@@ -85,11 +82,29 @@
var/tmp/last_object
+ // How many times in the current run has the process deferred work till the next tick?
+ var/tmp/cpu_defer_count = 0
+
// Counts the number of times an exception has occurred; gets reset after 10
var/tmp/list/exceptions = list()
- // Number of deciseconds to delay before starting the process
- var/start_delay = 0
+ // The next tick_usage the process will sleep at
+ var/tmp/next_sleep_usage
+
+ // Last run duration, in seconds
+ var/tmp/last_run_time = 0
+
+ // Last 20 run durations
+ var/tmp/list/last_twenty_run_times = list()
+
+ // Highest run duration, in seconds
+ var/tmp/highest_run_time = 0
+
+ // Tick usage at start of current run (updates upon deferring)
+ var/tmp/tick_usage_start
+
+ // Accumulated tick usage from before each deferral
+ var/tmp/tick_usage_accumulated = 0
/datum/controller/process/New(var/datum/controller/processScheduler/scheduler)
..()
@@ -97,9 +112,6 @@
previousStatus = "idle"
idle()
name = "process"
- schedule_interval = 50
- sleep_interval = world.tick_lag / PROCESS_DEFAULT_SLEEP_INTERVAL
- last_slept = 0
run_start = 0
ticks = 0
last_task = 0
@@ -116,6 +128,10 @@
// Initialize defer count
cpu_defer_count = 0
+ // Prepare usage tracking (defer() updates these)
+ tick_usage_start = world.tick_usage
+ tick_usage_accumulated = 0
+
running()
main.processStarted(src)
@@ -123,11 +139,23 @@
/datum/controller/process/proc/finished()
ticks++
+ recordRunTime()
idle()
main.processFinished(src)
onFinish()
+/datum/controller/process/proc/recordRunTime()
+ // Convert from tick usage (100/tick) to seconds of CPU time used
+ var/total_usage = (tick_usage_accumulated + (world.tick_usage - tick_usage_start)) / 1000 * world.tick_lag
+
+ last_run_time = total_usage
+ if(total_usage > highest_run_time)
+ highest_run_time = total_usage
+ if(last_twenty_run_times.len == 20)
+ last_twenty_run_times.Cut(1, 2)
+ last_twenty_run_times += total_usage
+
/datum/controller/process/proc/doWork()
/datum/controller/process/proc/setup()
@@ -186,9 +214,8 @@
qdel(src)
-// Do not call this directly - use SHECK or SCHECK_EVERY
-/datum/controller/process/proc/sleepCheck(var/tickId = 0)
- calls_since_last_scheck = 0
+// Do not call this directly - use SHECK
+/datum/controller/process/proc/defer()
if(killed)
// The kill proc is the only place where killed is set.
// The kill proc should have deleted this datum, and all sleeping procs that are
@@ -199,15 +226,14 @@
handleHung()
CRASH("Process [name] hung and was restarted.")
- if(main.getCurrentTickElapsedTime() > main.timeAllowance)
+ tick_usage_accumulated += (world.tick_usage - tick_usage_start)
+ if(world.tick_usage < defer_usage)
+ sleep(0)
+ else
sleep(world.tick_lag)
cpu_defer_count++
- last_slept = 0
- else
- if(TimeOfTick > last_slept + sleep_interval)
- // If we haven't slept in sleep_interval deciseconds, sleep to allow other work to proceed.
- sleep(0)
- last_slept = TimeOfTick
+ tick_usage_start = world.tick_usage
+ next_sleep_usage = min(world.tick_usage + sleep_interval, defer_usage)
/datum/controller/process/proc/update()
// Clear delta
@@ -234,14 +260,14 @@
return
/datum/controller/process/proc/getContext()
- return "
| [name] | [main.averageRunTime(src)] | [main.last_run_time[src]] | [main.highest_run_time[src]] | [ticks] |
\n"
+ return "| [name] | [getAverageRunTime()] | [last_run_time] | [highest_run_time] | [ticks] |
\n"
/datum/controller/process/proc/getContextData()
return list(
"name" = name,
- "averageRunTime" = main.averageRunTime(src),
- "lastRunTime" = main.last_run_time[src],
- "highestRunTime" = main.highest_run_time[src],
+ "averageRunTime" = getAverageRunTime(),
+ "lastRunTime" = last_run_time,
+ "highestRunTime" = highest_run_time,
"ticks" = ticks,
"schedule" = schedule_interval,
"status" = getStatusText(),
@@ -289,7 +315,6 @@
name = target.name
schedule_interval = target.schedule_interval
sleep_interval = target.sleep_interval
- last_slept = 0
run_start = 0
times_killed = target.times_killed
ticks = target.ticks
@@ -312,23 +337,33 @@
disabled = 0
/datum/controller/process/proc/getAverageRunTime()
- return main.averageRunTime(src)
+ var/t = 0
+ var/c = 0
+ for(var/time in last_twenty_run_times)
+ t += time
+ c++
+
+ if(c > 0)
+ return t / c
+ return c
+
/datum/controller/process/proc/getLastRunTime()
- return main.getProcessLastRunTime(src)
+ return last_run_time
/datum/controller/process/proc/getHighestRunTime()
- return main.getProcessHighestRunTime(src)
+ return highest_run_time
/datum/controller/process/proc/getTicks()
return ticks
/datum/controller/process/proc/statProcess()
- var/averageRunTime = round(getAverageRunTime(), 0.1)/10
- var/lastRunTime = round(getLastRunTime(), 0.1)/10
- var/highestRunTime = round(getHighestRunTime(), 0.1)/10
+ var/averageRunTime = round(getAverageRunTime(), 0.001)
+ var/lastRunTime = round(last_run_time, 0.001)
+ var/highestRunTime = round(highest_run_time, 0.001)
+ var/deferTime = round(cpu_defer_count / 10 * world.tick_lag, 0.01)
if(!statclick)
statclick = new (src)
- stat("[name]", statclick.update("T#[getTicks()] | AR [averageRunTime] | LR [lastRunTime] | HR [highestRunTime] | D [cpu_defer_count]"))
+ stat("[name]", statclick.update("T#[getTicks()] | AR [averageRunTime] | LR [lastRunTime] | HR [highestRunTime] | D [deferTime]"))
/datum/controller/process/proc/catchException(var/exception/e, var/thrower)
if(istype(e)) // Real runtimes go to the real error handler
diff --git a/code/controllers/ProcessScheduler/core/processScheduler.dm b/code/controllers/ProcessScheduler/core/processScheduler.dm
index 9f13f08fde8..aed1a125d96 100644
--- a/code/controllers/ProcessScheduler/core/processScheduler.dm
+++ b/code/controllers/ProcessScheduler/core/processScheduler.dm
@@ -20,18 +20,6 @@ var/global/datum/controller/processScheduler/processScheduler
// Process last queued times (world time)
var/tmp/datum/controller/process/list/last_queued = new
- // Process last start times (real time)
- var/tmp/datum/controller/process/list/last_start = new
-
- // Process last run durations
- var/tmp/datum/controller/process/list/last_run_time = new
-
- // Per process list of the last 20 durations
- var/tmp/datum/controller/process/list/last_twenty_run_times = new
-
- // Process highest run time
- var/tmp/datum/controller/process/list/highest_run_time = new
-
// How long to sleep between runs (set to tick_lag in New)
var/tmp/scheduler_sleep_interval
@@ -41,22 +29,12 @@ var/global/datum/controller/processScheduler/processScheduler
// Setup for these processes will be deferred until all the other processes are set up.
var/tmp/list/deferredSetupList = new
- var/tmp/currentTick = 0
-
- var/tmp/timeAllowance = 0
-
- var/tmp/cpuAverage = 0
-
- var/tmp/timeAllowanceMax = 0
-
/datum/controller/processScheduler/New()
..()
// When the process scheduler is first new'd, tick_lag may be wrong, so these
// get re-initialized when the process scheduler is started.
// (These are kept here for any processes that decide to process before round start)
scheduler_sleep_interval = world.tick_lag
- timeAllowance = world.tick_lag * 0.5
- timeAllowanceMax = world.tick_lag
/datum/controller/processScheduler/Destroy()
..()
@@ -92,20 +70,12 @@ var/global/datum/controller/processScheduler/processScheduler
isRunning = 1
// tick_lag will have been set by now, so re-initialize these
scheduler_sleep_interval = world.tick_lag
- timeAllowance = world.tick_lag * 0.5
- timeAllowanceMax = world.tick_lag
updateStartDelays()
spawn(0)
process()
/datum/controller/processScheduler/proc/process()
- updateCurrentTickData()
-
- for(var/i=world.tick_lag,i highest_run_time[process])
- highest_run_time[process] = time
-
- var/list/lastTwenty = last_twenty_run_times[process]
- if(lastTwenty.len == 20)
- lastTwenty.Cut(1, 2)
- lastTwenty.len++
- lastTwenty[lastTwenty.len] = time
-
-/**
- * averageRunTime
- * returns the average run time (over the last 20) of the process
- */
-/datum/controller/processScheduler/proc/averageRunTime(var/datum/controller/process/process)
- var/lastTwenty = last_twenty_run_times[process]
-
- var/t = 0
- var/c = 0
- for(var/time in lastTwenty)
- t += time
- c++
-
- if(c > 0)
- return t / c
- return c
-
-/datum/controller/processScheduler/proc/getProcessLastRunTime(var/datum/controller/process/process)
- return last_run_time[process]
-
-/datum/controller/processScheduler/proc/getProcessHighestRunTime(var/datum/controller/process/process)
- return highest_run_time[process]
-
/datum/controller/processScheduler/proc/getStatusData()
var/list/data = new
@@ -342,28 +224,6 @@ var/global/datum/controller/processScheduler/processScheduler
var/datum/controller/process/process = nameToProcessMap[processName]
process.disable()
-/datum/controller/processScheduler/proc/getCurrentTickElapsedTime()
- if(world.time > currentTick)
- updateCurrentTickData()
- return 0
- else
- return TimeOfTick
-
-/datum/controller/processScheduler/proc/updateCurrentTickData()
- if(world.time > currentTick)
- // New tick!
- currentTick = world.time
- updateTimeAllowance()
- cpuAverage = (world.cpu + cpuAverage + cpuAverage) / 3
-
-/datum/controller/processScheduler/proc/updateTimeAllowance()
- // Time allowance goes down linearly with world.cpu.
- var/tmp/error = cpuAverage - 100
- var/tmp/timeAllowanceDelta = SIMPLE_SIGN(error) * -0.5 * world.tick_lag * max(0, 0.001 * abs(error))
-
- //timeAllowance = world.tick_lag * min(1, 0.5 * ((200/max(1,cpuAverage)) - 1))
- timeAllowance = min(timeAllowanceMax, max(0, timeAllowance + timeAllowanceDelta))
-
/datum/controller/processScheduler/proc/statProcesses()
if(!isRunning)
stat("Processes", "Scheduler not running")
@@ -371,6 +231,5 @@ var/global/datum/controller/processScheduler/processScheduler
if(!statclick)
statclick = new (src)
stat("Processes", statclick.update("[processes.len] (R [running.len] / Q [queued.len] / I [idle.len])"))
- stat(null, "[round(cpuAverage, 0.1)] CPU, [round(timeAllowance, 0.1)/10] TA")
for(var/datum/controller/process/p in processes)
p.statProcess()
diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm
index 85007e4f492..268e1c073a2 100644
--- a/code/controllers/Processes/machinery.dm
+++ b/code/controllers/Processes/machinery.dm
@@ -38,7 +38,7 @@
catchBadType(M)
machine_processing -= M
- SCHECK_EVERY(100)
+ SCHECK
/datum/controller/process/machinery/proc/process_power()
for(last_object in deferred_powernet_rebuilds)
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index 775e4273f27..82f7ffb2e93 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -69,14 +69,6 @@ var/global/list/datum/dna/gene/dna_genes[0]
var/global/list/good_blocks[0]
var/global/list/bad_blocks[0]
-/////////////////
-// GENE DEFINES
-/////////////////
-
-// Skip checking if it's already active.
-// Used for genes that check for value rather than a binary on/off.
-#define GENE_ALWAYS_ACTIVATE 1
-
/datum/dna
// READ-ONLY, GETS OVERWRITTEN
// DO NOT FUCK WITH THESE OR BYOND WILL EAT YOUR FACE
diff --git a/code/game/dna/dna2_domutcheck.dm b/code/game/dna/dna2_domutcheck.dm
index 911d91ef63d..6175d547d63 100644
--- a/code/game/dna/dna2_domutcheck.dm
+++ b/code/game/dna/dna2_domutcheck.dm
@@ -31,16 +31,14 @@
if(!gene || !istype(gene))
return 0
+ // Current state
+ var/gene_active = M.dna.GetSEState(gene.block)
+
// Sanity checks, don't skip.
- if(!gene.can_activate(M,flags))
+ if(!gene.can_activate(M,flags) && gene_active)
//testing("[M] - Failed to activate [gene.name] (can_activate fail).")
return 0
- // Current state
- var/gene_active = (gene.flags & GENE_ALWAYS_ACTIVATE)
- if(!gene_active)
- gene_active = M.dna.GetSEState(gene.block)
-
var/defaultgenes // Do not mutate inherent species abilities
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -51,12 +49,12 @@
// Prior state
var/gene_prior_status = (gene.type in M.active_genes)
- var/changed = gene_active != gene_prior_status || (gene.flags & GENE_ALWAYS_ACTIVATE)
+ var/changed = gene_active != gene_prior_status
// If gene state has changed:
if(changed)
// Gene active (or ALWAYS ACTIVATE)
- if(gene_active || (gene.flags & GENE_ALWAYS_ACTIVATE))
+ if(gene_active)
//testing("[gene.name] activated!")
gene.activate(M,connected,flags)
if(M)
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 838be9337cb..3f3db24ed73 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -226,10 +226,13 @@
// This proc gives the DNA info for eye color to the given eyes
/datum/dna/proc/write_eyes_attributes(obj/item/organ/internal/eyes/eyes_organ)
+ var/red = GetUIValueRange(DNA_UI_EYES_R, 255)
+ var/green = GetUIValueRange(DNA_UI_EYES_G, 255)
+ var/blue = GetUIValueRange(DNA_UI_EYES_B, 255)
eyes_organ.eye_colour = list(
- GetUIValueRange(DNA_UI_EYES_R, 255),
- GetUIValueRange(DNA_UI_EYES_G, 255),
- GetUIValueRange(DNA_UI_EYES_B, 255)
+ red,
+ green,
+ blue
)
/*
diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index ece89e32a9c..5dfb40b5cfc 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -61,7 +61,7 @@
return 1
-obj/effect/proc_holder/changeling/sting/transformation
+/obj/effect/proc_holder/changeling/sting/transformation
name = "Transformation Sting"
desc = "We silently sting a human, injecting a retrovirus that forces them to transform."
helptext = "The victim will transform much like a changeling would. The effects will be obvious to the victim, and the process will damage our genomes."
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index 46c92271308..f60a37be397 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -2,9 +2,6 @@
name = "Mech Bay Recharge Station"
icon = 'icons/mecha/mech_bay.dmi'
icon_state = "recharge_floor"
- var/obj/machinery/mech_bay_recharge_port/recharge_port
- var/obj/machinery/computer/mech_bay_power_console/recharge_console
- var/obj/mecha/recharging_mecha = null
/turf/simulated/floor/mech_bay_recharge_floor/airless
icon_state = "recharge_floor_asteroid"
@@ -12,63 +9,6 @@
nitrogen = 0.01
temperature = TCMB
-/turf/simulated/floor/mech_bay_recharge_floor/Destroy()
- if(recharge_console && recharge_console.recharge_floor == src)
- recharge_console.recharge_floor = null
- recharge_console = null
- if(recharge_port && recharge_port.recharge_floor == src)
- recharge_port.recharge_floor = null
- recharge_port = null
- recharging_mecha = null
- return ..()
-
-/turf/simulated/floor/mech_bay_recharge_floor/Entered(var/obj/mecha/mecha, atom/OL, ignoreRest = 0)
- . = ..()
- if(istype(mecha))
- mecha.occupant_message("Initializing power control devices.")
- init_devices()
- if(recharge_console && recharge_port)
- recharging_mecha = mecha
- recharge_console.mecha_in(mecha)
- return
- else if(!recharge_console)
- mecha.occupant_message("Control console not found. Terminating.")
- else if(!recharge_port)
- mecha.occupant_message("Power port not found. Terminating.")
- return
-
-/turf/simulated/floor/mech_bay_recharge_floor/Exited(atom)
- . = ..()
- if(atom == recharging_mecha)
- recharging_mecha = null
- if(recharge_console)
- recharge_console.mecha_out()
- return
-
-/turf/simulated/floor/mech_bay_recharge_floor/proc/init_devices()
- if(!recharge_console)
- recharge_console = locate() in range(1,src)
- if(!recharge_port)
- recharge_port = locate() in get_step(src, WEST)
-
- if(recharge_console)
- recharge_console.recharge_floor = src
- if(recharge_port)
- recharge_console.recharge_port = recharge_port
- if(recharge_port)
- recharge_port.recharge_floor = src
- if(recharge_console)
- recharge_port.recharge_console = recharge_console
- return
-
-/* // temporary fix for broken icon until somebody gets around to make these player-buildable
-/turf/simulated/floor/mech_bay_recharge_floor/attackby(obj/item/C as obj, mob/user as mob)
- ..()
- if(floor_type)
- icon_state = "recharge_floor"
- else
- icon_state = "support_lattice" */
-
/obj/machinery/mech_bay_recharge_port
name = "Mech Bay Power Port"
density = 1
@@ -76,9 +16,11 @@
dir = EAST
icon = 'icons/mecha/mech_bay.dmi'
icon_state = "recharge_port"
- var/turf/simulated/floor/mech_bay_recharge_floor/recharge_floor
+ var/obj/mecha/recharging_mecha
var/obj/machinery/computer/mech_bay_power_console/recharge_console
- var/datum/global_iterator/mech_bay_recharger/pr_recharger
+ var/max_charge = 50
+ var/on = 0
+ var/turf/recharging_turf = null
/obj/machinery/mech_bay_recharge_port/New()
..()
@@ -91,8 +33,7 @@
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
component_parts += new /obj/item/stack/cable_coil(null, 1)
RefreshParts()
-
- pr_recharger = new /datum/global_iterator/mech_bay_recharger(null,0)
+ recharging_turf = get_step(loc, dir)
/obj/machinery/mech_bay_recharge_port/upgraded/New()
..()
@@ -105,97 +46,53 @@
component_parts += new /obj/item/weapon/stock_parts/capacitor/super(null)
component_parts += new /obj/item/stack/cable_coil(null, 1)
RefreshParts()
+ recharging_turf = get_step(loc, dir)
/obj/machinery/mech_bay_recharge_port/RefreshParts()
var/MC
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
MC += C.rating
- if(pr_recharger)
- pr_recharger.max_charge = MC * 10
- if(recharge_console)
- recharge_console.voltage = MC * 10
-
-/obj/machinery/mech_bay_recharge_port/Destroy()
- qdel(pr_recharger)
- pr_recharger = null
- recharge_console.recharge_port = null
- recharge_floor.recharge_port = null
- return ..()
+ max_charge = MC * 25
/obj/machinery/mech_bay_recharge_port/attackby(obj/item/I, mob/user, params)
if(default_deconstruction_screwdriver(user, "recharge_port-o", "recharge_port", I))
return
if(default_change_direction_wrench(user, I))
+ recharging_turf = get_step(loc, dir)
return
if(exchange_parts(user, I))
return
- default_deconstruction_crowbar(I)
+ if(default_deconstruction_crowbar(I))
+ return
+ return ..()
-/obj/machinery/mech_bay_recharge_port/proc/start_charge(var/obj/mecha/recharging_mecha)
- if(stat&(NOPOWER|BROKEN))
- recharging_mecha.occupant_message("Power port not responding. Terminating.")
- return 0
- else
- if(recharging_mecha.cell)
- recharging_mecha.occupant_message("Now charging...")
- pr_recharger.start(list(src,recharging_mecha))
- return 1
+/obj/machinery/mech_bay_recharge_port/Destroy()
+ if(recharge_console)
+ recharge_console.recharge_port = null
+ recharge_console.update_icon()
+ return ..()
+
+/obj/machinery/mech_bay_recharge_port/process()
+ if(stat & NOPOWER || !recharge_console)
+ return
+ if(!recharging_mecha)
+ recharging_mecha = locate(/obj/mecha) in recharging_turf
+ if(recharging_mecha)
+ recharge_console.update_icon()
+ if(recharging_mecha && recharging_mecha.cell)
+ if(recharging_mecha.cell.charge < recharging_mecha.cell.maxcharge)
+ var/delta = min(max_charge, recharging_mecha.cell.maxcharge - recharging_mecha.cell.charge)
+ recharging_mecha.give_power(delta)
+ use_power(delta*150)
else
- return 0
+ recharge_console.update_icon()
+ if(recharging_mecha.loc != recharging_turf)
+ recharging_mecha = null
+ recharge_console.update_icon()
-/obj/machinery/mech_bay_recharge_port/proc/stop_charge()
- if(recharge_console && !recharge_console.stat)
- update_icon()
- pr_recharger.stop()
- return
-
-/obj/machinery/mech_bay_recharge_port/proc/active()
- if(pr_recharger.active())
- return 1
- else
- return 0
-
-
-/obj/machinery/mech_bay_recharge_port/power_change()
- if(powered())
- stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- stat |= NOPOWER
- pr_recharger.stop()
- return
-
-/obj/machinery/mech_bay_recharge_port/proc/set_voltage(new_voltage)
- if(new_voltage && isnum(new_voltage))
- pr_recharger.max_charge = new_voltage
- return 1
- else
- return 0
-
-/datum/global_iterator/mech_bay_recharger
- delay = 20
- var/max_charge = 50
- check_for_null = 0 //since port.stop_charge() must be called. The checks are made in process()
-
-/datum/global_iterator/mech_bay_recharger/process(var/obj/machinery/mech_bay_recharge_port/port, var/obj/mecha/mecha)
- if(!port)
- return 0
- if(mecha && mecha in port.recharge_floor)
- if(!mecha.cell)
- return
- var/delta = min(max_charge, mecha.cell.maxcharge - mecha.cell.charge)
- if(delta>0)
- mecha.give_power(delta)
- port.use_power(delta*150)
- else
- mecha.occupant_message("Fully charged.")
- port.stop_charge()
- else
- port.stop_charge()
- return
/obj/machinery/computer/mech_bay_power_console
name = "mech bay power control console"
@@ -206,82 +103,63 @@
icon_screen = "recharge_comp"
light_color = LIGHT_COLOR_FADEDPURPLE
circuit = /obj/item/weapon/circuitboard/mech_bay_power_console
- var/autostart = 1
- var/voltage = 50
- var/turf/simulated/floor/mech_bay_recharge_floor/recharge_floor
var/obj/machinery/mech_bay_recharge_port/recharge_port
-/obj/machinery/computer/mech_bay_power_console/Destroy()
- recharge_port.recharge_console = null
- recharge_floor.recharge_console = null
- return ..()
-
-/obj/machinery/computer/mech_bay_power_console/proc/mecha_in(var/obj/mecha/mecha)
- if(stat&(NOPOWER|BROKEN))
- mecha.occupant_message("Control console not responding. Terminating...")
- return
- if(recharge_port && autostart)
- var/answer = recharge_port.start_charge(mecha)
- if(answer)
- recharge_port.set_voltage(voltage)
- update_icon()
- return
-
-/obj/machinery/computer/mech_bay_power_console/proc/mecha_out()
- if(recharge_port)
- recharge_port.stop_charge()
- update_icon()
- return
-
-/obj/machinery/computer/mech_bay_power_console/power_change()
- ..()
- if(stat & BROKEN)
- update_icon()
- if(recharge_port)
- recharge_port.stop_charge()
- else if(powered())
- update_icon()
- stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- update_icon()
- stat |= NOPOWER
- if(recharge_port)
- recharge_port.stop_charge()
-
-/obj/machinery/computer/mech_bay_power_console/set_broken()
- ..()
- if(recharge_port)
- recharge_port.stop_charge()
/obj/machinery/computer/mech_bay_power_console/update_icon()
- if(!recharge_floor || !recharge_floor.recharging_mecha || !recharge_floor.recharging_mecha.cell || !(recharge_floor.recharging_mecha.cell.charge < recharge_floor.recharging_mecha.cell.maxcharge))
+ if(!recharge_port || !recharge_port.recharging_mecha || !recharge_port.recharging_mecha.cell || !(recharge_port.recharging_mecha.cell.charge < recharge_port.recharging_mecha.cell.maxcharge) || stat & (NOPOWER|BROKEN))
icon_screen = "recharge_comp"
else
icon_screen = "recharge_comp_on"
..()
+/obj/machinery/computer/mech_bay_power_console/proc/reconnect()
+ if(recharge_port)
+ return
+ recharge_port = locate(/obj/machinery/mech_bay_recharge_port) in range(1)
+ if(!recharge_port)
+ for(var/D in cardinal)
+ var/turf/A = get_step(src, D)
+ A = get_step(A, D)
+ recharge_port = locate(/obj/machinery/mech_bay_recharge_port) in A
+ if(recharge_port)
+ if(!recharge_port.recharge_console)
+ break
+ else
+ recharge_port = null
+ if(recharge_port)
+ if(!recharge_port.recharge_console)
+ recharge_port.recharge_console = src
+ else
+ recharge_port = null
+
+
+/obj/machinery/computer/mech_bay_power_console/Destroy()
+ if(recharge_port)
+ recharge_port.recharge_console = null
+ return ..()
+
/obj/machinery/computer/mech_bay_power_console/attack_hand(mob/user as mob)
if(..())
return
- if(!recharge_floor || !recharge_port)
- var/turf/simulated/floor/mech_bay_recharge_floor/F = locate() in range(1,src)
- if(F)
- F.init_devices()
ui_interact(user)
/obj/machinery/computer/mech_bay_power_console/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/list/data = list()
- data["has_floor"] = recharge_floor
- data["has_port"] = recharge_port
- if(recharge_floor && recharge_floor.recharging_mecha && recharge_floor.recharging_mecha.cell)
- data["has_mech"] = 1
- data["mecha_name"] = recharge_floor.recharging_mecha || "None"
- data["mecha_charge"] = isnull(recharge_floor.recharging_mecha) ? 0 : recharge_floor.recharging_mecha.cell.charge
- data["mecha_maxcharge"] = isnull(recharge_floor.recharging_mecha) ? 0 : recharge_floor.recharging_mecha.cell.maxcharge
- data["mecha_charge_percentage"] = isnull(recharge_floor.recharging_mecha) ? 0 : round(recharge_floor.recharging_mecha.cell.percent())
- else
- data["has_mech"] = 0
+ if(!recharge_port)
+ reconnect()
+ if(recharge_port && !qdeleted(recharge_port))
+ data["recharge_port"] = list("mech" = null)
+ if(recharge_port.recharging_mecha && !qdeleted(recharge_port.recharging_mecha))
+ data["recharge_port"]["mech"] = list("health" = recharge_port.recharging_mecha.health, "maxhealth" = initial(recharge_port.recharging_mecha.health), "cell" = null)
+ if(recharge_port.recharging_mecha.cell && !qdeleted(recharge_port.recharging_mecha.cell))
+ data["has_mech"] = 1
+ data["mecha_name"] = recharge_port.recharging_mecha || "None"
+ data["mecha_charge"] = isnull(recharge_port.recharging_mecha) ? 0 : recharge_port.recharging_mecha.cell.charge
+ data["mecha_maxcharge"] = isnull(recharge_port.recharging_mecha) ? 0 : recharge_port.recharging_mecha.cell.maxcharge
+ data["mecha_charge_percentage"] = isnull(recharge_port.recharging_mecha) ? 0 : round(recharge_port.recharging_mecha.cell.percent())
+ else
+ data["has_mech"] = 0
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
// the ui does not exist, so we'll create a new() one
@@ -293,3 +171,9 @@
ui.open()
// auto update every Master Controller tick
ui.set_auto_update(1)
+ return data
+
+/obj/machinery/computer/mech_bay_power_console/initialize()
+ reconnect()
+ update_icon()
+ return ..()
\ No newline at end of file
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index b8a1bda8c4c..30b8c8bb8e9 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -893,9 +893,6 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space
toArea = locate(/area/shuttle/gamma/space)
fromArea.move_contents_to(toArea)
- for(var/turf/simulated/floor/mech_bay_recharge_floor/F in toArea)
- F.init_devices()
-
for(var/obj/machinery/power/apc/A in toArea)
A.init()
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index fe2b5399676..552de1b536a 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -1985,8 +1985,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
character.age = age
character.b_type = b_type
- character.change_eye_color(r_eyes, g_eyes, b_eyes)
-
//Head-specific
var/obj/item/organ/external/head/H = character.get_organ("head")
@@ -2115,6 +2113,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.")
character.change_gender(MALE)
+ character.change_eye_color(r_eyes, g_eyes, b_eyes)
+
character.dna.ready_dna(character, flatten_SE = 0)
character.sync_organ_dna(assimilate=1)
character.UpdateAppearance()
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index dcda7fa037e..41ce57865b5 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -327,6 +327,11 @@
if(H.head == src)
H.slurring = max(3, H.slurring) //always slur
+/obj/item/clothing/head/beret/fluff/linda //Epic_Charger: Linda Clark
+ name = "Green beret"
+ desc = "A beret, an artist's favorite headwear. This one has two holes cut on the edges."
+ icon_state = "linda_beret"
+
//////////// Suits ////////////
/obj/item/clothing/suit/storage/labcoat/fluff/aeneas_rinil //Socialsystem: Lynn Fea
name = "Robotics labcoat"
@@ -393,6 +398,16 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "stobarico_jacket"
+
+/obj/item/clothing/suit/hooded/hoodie/fluff/linda // Epic_Charger: Linda Clark
+ name = "Green Nanotrasen Hoodie"
+ desc = "A green hoodie with the Nanotrasen logo on the back. It looks weathered."
+ icon_state = "linda_hoodie"
+ hoodtype = /obj/item/clothing/head/hood/fluff/linda
+
+/obj/item/clothing/head/hood/fluff/linda //Epic_Charger: Linda Clark
+ icon_state = "greenhood"
+
//////////// Uniforms ////////////
/obj/item/clothing/under/fluff/kharshai // Kharshai: Athena Castile
name = "Castile formal outfit"
diff --git a/code/modules/garbage_collection/garbage_collector.dm b/code/modules/garbage_collection/garbage_collector.dm
index 29db9198ae4..c33190d4203 100644
--- a/code/modules/garbage_collection/garbage_collector.dm
+++ b/code/modules/garbage_collection/garbage_collector.dm
@@ -60,8 +60,6 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
queue.Cut(1, 2)
remainingForceDelPerTick--
- // Sleep check more aggressively when force deleting.
- calls_since_last_scheck += 9
else // Otherwise, it was GC'd - remove it from the queue
queue.Cut(1, 2)
soft_dels++
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index 26d25238197..621efe89ac1 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -115,7 +115,7 @@
mmi_icon_state = "slime_mmi"
// parent_organ = "chest" Hello I am from the ministry of rubber forehead aliens how are you
-/obj/item/organ/brain/slime/take_damage(var/amount, var/silent = 1)
+/obj/item/organ/internal/brain/slime/take_damage(var/amount, var/silent = 1)
//Slimes are 150% more vulnerable to brain damage
damage = between(0, src.damage + (1.5*amount), max_damage) //Since they take the damage twice, this is +150%
return ..()
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index 7d5d4dd2a7f..0cd9ab9e836 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -211,6 +211,7 @@
eyes_organ.eye_colour[2] = green
eyes_organ.eye_colour[3] = blue
dna.eye_color_to_dna(eyes_organ)
+ eyes_organ.set_dna(dna)
if(update_dna)
update_dna()
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 9defb5fc5ba..9884ef74354 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -193,10 +193,8 @@
for(var/index in has_organ)
var/organ = has_organ[index]
- H.internal_organs |= new organ(H)
-
- for(var/obj/item/organ/internal/I in H.internal_organs)
- I.insert(H)
+ // organ new code calls `insert` on its own
+ new organ(H)
for(var/name in H.organs_by_name)
H.organs |= H.organs_by_name[name]
diff --git a/code/modules/mob/living/silicon/pai/personality.dm b/code/modules/mob/living/silicon/pai/personality.dm
index d089b76a3fb..1abf61e633b 100644
--- a/code/modules/mob/living/silicon/pai/personality.dm
+++ b/code/modules/mob/living/silicon/pai/personality.dm
@@ -17,10 +17,10 @@
var/savefile/F = new /savefile(src.savefile_path(user))
- to_chat(F["name"], src.name)
- to_chat(F["description"], src.description)
- to_chat(F["role"], src.role)
- to_chat(F["comments"], src.comments)
+ F["name"] << src.name
+ F["description"] << src.description
+ F["role"] << src.role
+ F["comments"] << src.comments
F["version"] << 1
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 1f461bc18e6..d99bad202d7 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -23,14 +23,12 @@
if(emag)
emag.emp_act(severity)
..()
- return
/obj/item/weapon/robot_module/New()
- src.modules += new /obj/item/device/flashlight(src)
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.emag = new /obj/item/toy/sword(src)
- src.emag.name = "Placeholder Emag Item"
+ modules += new /obj/item/device/flash/cyborg(src)
+ emag = new /obj/item/toy/sword(src)
+ emag.name = "Placeholder Emag Item"
/obj/item/weapon/robot_module/Destroy()
for(var/module in modules)
@@ -48,18 +46,19 @@
emag.flags |= NODROP
emag.mouse_opacity = 2
-/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R)
- if(!stacktypes || !stacktypes.len) return
+/obj/item/weapon/robot_module/proc/respawn_consumable(mob/living/silicon/robot/R)
+ if(!stacktypes || !stacktypes.len)
+ return
var/stack_respawned = 0
for(var/T in stacktypes)
- var/O = locate(T) in src.modules
+ var/O = locate(T) in modules
var/obj/item/stack/S = O
if(!S)
- src.modules -= null
+ modules -= null
S = new T(src)
- src.modules += S
+ modules += S
S.amount = 1
stack_respawned = 1
@@ -75,7 +74,7 @@
if(O)
modules += O
-/obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R)
+/obj/item/weapon/robot_module/proc/add_languages(mob/living/silicon/robot/R)
//full set of languages
R.add_language("Galactic Common", 1)
R.add_language("Sol Common", 1)
@@ -93,10 +92,10 @@
R.add_language("Orluum", 0)
R.add_language("Clownish",0)
-/obj/item/weapon/robot_module/proc/add_subsystems(var/mob/living/silicon/robot/R)
+/obj/item/weapon/robot_module/proc/add_subsystems(mob/living/silicon/robot/R)
R.verbs |= subsystems
-/obj/item/weapon/robot_module/proc/remove_subsystems(var/mob/living/silicon/robot/R)
+/obj/item/weapon/robot_module/proc/remove_subsystems(mob/living/silicon/robot/R)
R.verbs -= subsystems
/obj/item/weapon/robot_module/standard
@@ -104,13 +103,13 @@
module_type = "Standard"
/obj/item/weapon/robot_module/standard/New()
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/weapon/melee/baton/loaded(src)
- src.modules += new /obj/item/weapon/extinguisher(src)
- src.modules += new /obj/item/weapon/wrench(src)
- src.modules += new /obj/item/weapon/crowbar(src)
- src.modules += new /obj/item/device/healthanalyzer(src)
- src.emag = new /obj/item/weapon/melee/energy/sword/cyborg(src)
+ ..()
+ modules += new /obj/item/weapon/melee/baton/loaded(src)
+ modules += new /obj/item/weapon/extinguisher(src)
+ modules += new /obj/item/weapon/wrench(src)
+ modules += new /obj/item/weapon/crowbar(src)
+ modules += new /obj/item/device/healthanalyzer(src)
+ emag = new /obj/item/weapon/melee/energy/sword/cyborg(src)
fix_modules()
@@ -126,40 +125,40 @@
)
/obj/item/weapon/robot_module/medical/New()
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/device/healthanalyzer/advanced(src)
- src.modules += new /obj/item/device/reagent_scanner/adv(src)
- src.modules += new /obj/item/weapon/borg_defib(src)
- src.modules += new /obj/item/roller_holder(src)
- src.modules += new /obj/item/weapon/reagent_containers/borghypo(src)
- src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
- src.modules += new /obj/item/weapon/reagent_containers/dropper(src)
- src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
- src.modules += new /obj/item/weapon/extinguisher/mini(src)
- src.modules += new /obj/item/stack/medical/bruise_pack/advanced(src)
- src.modules += new /obj/item/stack/medical/ointment/advanced(src)
- src.modules += new /obj/item/stack/medical/splint(src)
- src.modules += new /obj/item/stack/nanopaste(src)
- src.modules += new /obj/item/weapon/scalpel(src)
- src.modules += new /obj/item/weapon/hemostat(src)
- src.modules += new /obj/item/weapon/retractor(src)
- src.modules += new /obj/item/weapon/cautery(src)
- src.modules += new /obj/item/weapon/bonegel(src)
- src.modules += new /obj/item/weapon/FixOVein(src)
- src.modules += new /obj/item/weapon/bonesetter(src)
- src.modules += new /obj/item/weapon/circular_saw(src)
- src.modules += new /obj/item/weapon/surgicaldrill(src)
+ ..()
+ modules += new /obj/item/device/healthanalyzer/advanced(src)
+ modules += new /obj/item/device/reagent_scanner/adv(src)
+ modules += new /obj/item/weapon/borg_defib(src)
+ modules += new /obj/item/roller_holder(src)
+ modules += new /obj/item/weapon/reagent_containers/borghypo(src)
+ modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
+ modules += new /obj/item/weapon/reagent_containers/dropper(src)
+ modules += new /obj/item/weapon/reagent_containers/syringe(src)
+ modules += new /obj/item/weapon/extinguisher/mini(src)
+ modules += new /obj/item/stack/medical/bruise_pack/advanced(src)
+ modules += new /obj/item/stack/medical/ointment/advanced(src)
+ modules += new /obj/item/stack/medical/splint(src)
+ modules += new /obj/item/stack/nanopaste(src)
+ modules += new /obj/item/weapon/scalpel(src)
+ modules += new /obj/item/weapon/hemostat(src)
+ modules += new /obj/item/weapon/retractor(src)
+ modules += new /obj/item/weapon/cautery(src)
+ modules += new /obj/item/weapon/bonegel(src)
+ modules += new /obj/item/weapon/FixOVein(src)
+ modules += new /obj/item/weapon/bonesetter(src)
+ modules += new /obj/item/weapon/circular_saw(src)
+ modules += new /obj/item/weapon/surgicaldrill(src)
- src.emag = new /obj/item/weapon/reagent_containers/spray(src)
+ emag = new /obj/item/weapon/reagent_containers/spray(src)
- src.emag.reagents.add_reagent("facid", 250)
- src.emag.name = "Polyacid spray"
+ emag.reagents.add_reagent("facid", 250)
+ emag.name = "Polyacid spray"
fix_modules()
-/obj/item/weapon/robot_module/medical/respawn_consumable(var/mob/living/silicon/robot/R)
- if(src.emag)
- var/obj/item/weapon/reagent_containers/spray/PS = src.emag
+/obj/item/weapon/robot_module/medical/respawn_consumable(mob/living/silicon/robot/R)
+ if(emag)
+ var/obj/item/weapon/reagent_containers/spray/PS = emag
PS.reagents.add_reagent("facid", 2)
..()
@@ -178,29 +177,29 @@
)
/obj/item/weapon/robot_module/engineering/New()
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/borg/sight/meson(src)
- src.modules += new /obj/item/weapon/rcd/borg(src)
- src.modules += new /obj/item/weapon/extinguisher(src)
- src.modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
- src.modules += new /obj/item/weapon/screwdriver(src)
- src.modules += new /obj/item/weapon/wrench(src)
- src.modules += new /obj/item/weapon/crowbar(src)
- src.modules += new /obj/item/weapon/wirecutters(src)
- src.modules += new /obj/item/device/multitool(src)
- src.modules += new /obj/item/device/t_scanner(src)
- src.modules += new /obj/item/device/analyzer(src)
- src.modules += new /obj/item/taperoll/engineering(src)
- src.modules += new /obj/item/weapon/gripper(src)
- src.modules += new /obj/item/weapon/matter_decompiler(src)
- src.modules += new /obj/item/device/floor_painter(src)
+ ..()
+ modules += new /obj/item/borg/sight/meson(src)
+ modules += new /obj/item/weapon/rcd/borg(src)
+ modules += new /obj/item/weapon/extinguisher(src)
+ modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
+ modules += new /obj/item/weapon/screwdriver(src)
+ modules += new /obj/item/weapon/wrench(src)
+ modules += new /obj/item/weapon/crowbar(src)
+ modules += new /obj/item/weapon/wirecutters(src)
+ modules += new /obj/item/device/multitool(src)
+ modules += new /obj/item/device/t_scanner(src)
+ modules += new /obj/item/device/analyzer(src)
+ modules += new /obj/item/taperoll/engineering(src)
+ modules += new /obj/item/weapon/gripper(src)
+ modules += new /obj/item/weapon/matter_decompiler(src)
+ modules += new /obj/item/device/floor_painter(src)
- src.emag = new /obj/item/borg/stun(src)
+ emag = new /obj/item/borg/stun(src)
for(var/G in stacktypes) //Attempt to unify Engi-Borg material stacks into fewer lines. See Line 492 for example. Variables changed out of paranoia.
var/obj/item/stack/sheet/M = new G(src)
M.amount = stacktypes[G]
- src.modules += M
+ modules += M
fix_modules()
@@ -210,13 +209,13 @@
subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor)
/obj/item/weapon/robot_module/security/New()
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
- src.modules += new /obj/item/weapon/melee/baton/loaded/robot(src)
- src.modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src)
- src.modules += new /obj/item/taperoll/police(src)
- src.modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src)
- src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
+ ..()
+ modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
+ modules += new /obj/item/weapon/melee/baton/loaded/robot(src)
+ modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src)
+ modules += new /obj/item/taperoll/police(src)
+ modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src)
+ emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
fix_modules()
@@ -225,16 +224,16 @@
module_type = "Janitor"
/obj/item/weapon/robot_module/janitor/New()
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/weapon/soap/nanotrasen(src)
- src.modules += new /obj/item/weapon/storage/bag/trash/cyborg(src)
- src.modules += new /obj/item/weapon/mop/advanced/cyborg(src)
- src.modules += new /obj/item/device/lightreplacer(src)
- src.modules += new /obj/item/weapon/holosign_creator(src)
- src.emag = new /obj/item/weapon/reagent_containers/spray(src)
+ ..()
+ modules += new /obj/item/weapon/soap/nanotrasen(src)
+ modules += new /obj/item/weapon/storage/bag/trash/cyborg(src)
+ modules += new /obj/item/weapon/mop/advanced/cyborg(src)
+ modules += new /obj/item/device/lightreplacer(src)
+ modules += new /obj/item/weapon/holosign_creator(src)
+ emag = new /obj/item/weapon/reagent_containers/spray(src)
- src.emag.reagents.add_reagent("lube", 250)
- src.emag.name = "Lube spray"
+ emag.reagents.add_reagent("lube", 250)
+ emag.name = "Lube spray"
fix_modules()
@@ -243,37 +242,37 @@
module_type = "Service"
/obj/item/weapon/robot_module/butler/New()
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
- src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
- src.modules += new /obj/item/weapon/pen(src)
- src.modules += new /obj/item/weapon/razor(src)
- src.modules += new /obj/item/device/violin(src)
- src.modules += new /obj/item/device/guitar(src)
+ ..()
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
+ modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
+ modules += new /obj/item/weapon/pen(src)
+ modules += new /obj/item/weapon/razor(src)
+ modules += new /obj/item/device/violin(src)
+ modules += new /obj/item/device/guitar(src)
var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
M.matter = 30
- src.modules += M
+ modules += M
- src.modules += new /obj/item/weapon/reagent_containers/dropper/cyborg(src)
- src.modules += new /obj/item/weapon/lighter/zippo(src)
- src.modules += new /obj/item/weapon/storage/bag/tray/cyborg(src)
- src.modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src)
- src.emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
+ modules += new /obj/item/weapon/reagent_containers/dropper/cyborg(src)
+ modules += new /obj/item/weapon/lighter/zippo(src)
+ modules += new /obj/item/weapon/storage/bag/tray/cyborg(src)
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src)
+ emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
var/datum/reagents/R = new/datum/reagents(50)
- src.emag.reagents = R
- R.my_atom = src.emag
+ emag.reagents = R
+ R.my_atom = emag
R.add_reagent("beer2", 50)
- src.emag.name = "Mickey Finn's Special Brew"
+ emag.name = "Mickey Finn's Special Brew"
fix_modules()
/obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R)
- var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules
+ var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in modules
E.reagents.add_reagent("enzyme", 2)
- if(src.emag)
- var/obj/item/weapon/reagent_containers/food/drinks/cans/beer/B = src.emag
+ if(emag)
+ var/obj/item/weapon/reagent_containers/food/drinks/cans/beer/B = emag
B.reagents.add_reagent("beer2", 2)
..()
@@ -294,27 +293,13 @@
R.add_language("Bubblish", 1)
R.add_language("Clownish",1)
-/*
-/obj/item/weapon/robot_module/clerical //Whyyyyy?
- name = "clerical robot module"
-
- New()
- src.modules += new /obj/item/device/flashlight(src)
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/weapon/pen/multi/robopen(src)
- src.modules += new /obj/item/weapon/form_printer(src)
- src.modules += new /obj/item/device/taperecorder(src)
- src.modules += new /obj/item/weapon/gripper/paperwork(src)
-
- src.emag = new /obj/item/weapon/stamp/denied(src)
-*/
/obj/item/weapon/robot_module/miner
name = "miner robot module"
module_type = "Miner"
/obj/item/weapon/robot_module/miner/New()
- modules += new /obj/item/device/flash/cyborg(src)
+ ..()
modules += new /obj/item/borg/sight/meson(src)
modules += new /obj/item/weapon/storage/bag/ore/cyborg(src)
modules += new /obj/item/weapon/pickaxe/drill/cyborg(src)
@@ -334,12 +319,12 @@
module_type = "Malf"
/obj/item/weapon/robot_module/deathsquad/New()
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/borg/sight/thermal(src)
- src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
- src.modules += new /obj/item/weapon/gun/energy/pulse/cyborg(src)
- src.modules += new /obj/item/weapon/crowbar(src)
- src.emag = null
+ ..()
+ modules += new /obj/item/borg/sight/thermal(src)
+ modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
+ modules += new /obj/item/weapon/gun/energy/pulse/cyborg(src)
+ modules += new /obj/item/weapon/crowbar(src)
+ emag = null
fix_modules()
@@ -348,14 +333,14 @@
module_type = "Malf" // cuz it looks cool
/obj/item/weapon/robot_module/syndicate/New()
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
- src.modules += new /obj/item/weapon/gun/energy/printer(src)
- src.modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi/cyborg(src)
- src.modules += new /obj/item/weapon/card/emag(src)
- src.modules += new /obj/item/weapon/crowbar(src)
- src.modules += new /obj/item/weapon/pinpointer/operative(src)
- src.emag = null
+ ..()
+ modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
+ modules += new /obj/item/weapon/gun/energy/printer(src)
+ modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi/cyborg(src)
+ modules += new /obj/item/weapon/card/emag(src)
+ modules += new /obj/item/weapon/crowbar(src)
+ modules += new /obj/item/weapon/pinpointer/operative(src)
+ emag = null
fix_modules()
@@ -370,30 +355,30 @@
)
/obj/item/weapon/robot_module/syndicate_medical/New()
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/device/healthanalyzer/advanced(src)
- src.modules += new /obj/item/device/reagent_scanner/adv(src)
- src.modules += new /obj/item/weapon/borg_defib(src)
- src.modules += new /obj/item/roller_holder(src)
- src.modules += new /obj/item/weapon/reagent_containers/borghypo/syndicate(src)
- src.modules += new /obj/item/weapon/extinguisher/mini(src)
- src.modules += new /obj/item/stack/medical/bruise_pack/advanced(src)
- src.modules += new /obj/item/stack/medical/ointment/advanced(src)
- src.modules += new /obj/item/stack/medical/splint(src)
- src.modules += new /obj/item/stack/nanopaste(src)
- src.modules += new /obj/item/weapon/scalpel(src)
- src.modules += new /obj/item/weapon/hemostat(src)
- src.modules += new /obj/item/weapon/retractor(src)
- src.modules += new /obj/item/weapon/cautery(src)
- src.modules += new /obj/item/weapon/bonegel(src)
- src.modules += new /obj/item/weapon/FixOVein(src)
- src.modules += new /obj/item/weapon/bonesetter(src)
- src.modules += new /obj/item/weapon/surgicaldrill(src)
- src.modules += new /obj/item/weapon/melee/energy/sword/cyborg/saw(src) //Energy saw -- primary weapon
- src.modules += new /obj/item/weapon/card/emag(src)
- src.modules += new /obj/item/weapon/crowbar(src)
- src.modules += new /obj/item/weapon/pinpointer/operative(src)
- src.emag = null
+ ..()
+ modules += new /obj/item/device/healthanalyzer/advanced(src)
+ modules += new /obj/item/device/reagent_scanner/adv(src)
+ modules += new /obj/item/weapon/borg_defib(src)
+ modules += new /obj/item/roller_holder(src)
+ modules += new /obj/item/weapon/reagent_containers/borghypo/syndicate(src)
+ modules += new /obj/item/weapon/extinguisher/mini(src)
+ modules += new /obj/item/stack/medical/bruise_pack/advanced(src)
+ modules += new /obj/item/stack/medical/ointment/advanced(src)
+ modules += new /obj/item/stack/medical/splint(src)
+ modules += new /obj/item/stack/nanopaste(src)
+ modules += new /obj/item/weapon/scalpel(src)
+ modules += new /obj/item/weapon/hemostat(src)
+ modules += new /obj/item/weapon/retractor(src)
+ modules += new /obj/item/weapon/cautery(src)
+ modules += new /obj/item/weapon/bonegel(src)
+ modules += new /obj/item/weapon/FixOVein(src)
+ modules += new /obj/item/weapon/bonesetter(src)
+ modules += new /obj/item/weapon/surgicaldrill(src)
+ modules += new /obj/item/weapon/melee/energy/sword/cyborg/saw(src) //Energy saw -- primary weapon
+ modules += new /obj/item/weapon/card/emag(src)
+ modules += new /obj/item/weapon/crowbar(src)
+ modules += new /obj/item/weapon/pinpointer/operative(src)
+ emag = null
fix_modules()
@@ -402,15 +387,15 @@
module_type = "Malf"
/obj/item/weapon/robot_module/combat/New()
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
- src.modules += new /obj/item/borg/sight/thermal(src)
- src.modules += new /obj/item/weapon/gun/energy/gun/cyborg(src)
- src.modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src)
- src.modules += new /obj/item/borg/combat/shield(src)
- src.modules += new /obj/item/borg/combat/mobility(src)
- src.modules += new /obj/item/weapon/wrench(src)
- src.emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
+ ..()
+ modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
+ modules += new /obj/item/borg/sight/thermal(src)
+ modules += new /obj/item/weapon/gun/energy/gun/cyborg(src)
+ modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src)
+ modules += new /obj/item/borg/combat/shield(src)
+ modules += new /obj/item/borg/combat/mobility(src)
+ modules += new /obj/item/weapon/wrench(src)
+ emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
fix_modules()
@@ -419,14 +404,14 @@
module_type = "Malf"
/obj/item/weapon/robot_module/peacekeeper/New()
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
- src.modules += new /obj/item/weapon/gun/energy/gun/cyborg(src)
- src.modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src)
- src.modules += new /obj/item/borg/combat/shield(src)
- src.modules += new /obj/item/borg/combat/mobility(src)
- src.modules += new /obj/item/weapon/wrench(src)
- src.emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
+ ..()
+ modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
+ modules += new /obj/item/weapon/gun/energy/gun/cyborg(src)
+ modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src)
+ modules += new /obj/item/borg/combat/shield(src)
+ modules += new /obj/item/borg/combat/mobility(src)
+ modules += new /obj/item/weapon/wrench(src)
+ emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
fix_modules()
@@ -435,18 +420,18 @@
module_type = "Standard"
/obj/item/weapon/robot_module/alien/hunter/New()
- src.modules += new /obj/item/weapon/melee/energy/alien/claws(src)
- src.modules += new /obj/item/device/flash/cyborg/alien(src)
- src.modules += new /obj/item/borg/sight/thermal/alien(src)
+ modules += new /obj/item/weapon/melee/energy/alien/claws(src)
+ modules += new /obj/item/device/flash/cyborg/alien(src)
+ modules += new /obj/item/borg/sight/thermal/alien(src)
var/obj/item/weapon/reagent_containers/spray/alien/stun/S = new /obj/item/weapon/reagent_containers/spray/alien/stun(src)
S.reagents.add_reagent("ether",250) //nerfed to sleeptoxin to make it less instant drop.
- src.modules += S
+ modules += S
var/obj/item/weapon/reagent_containers/spray/alien/smoke/A = new /obj/item/weapon/reagent_containers/spray/alien/smoke(src)
S.reagents.add_reagent("water",50) //Water is used as a dummy reagent for the smoke bombs. More of an ammo counter.
- src.modules += A
- src.emag = new /obj/item/weapon/reagent_containers/spray/alien/acid(src)
- src.emag.reagents.add_reagent("facid", 125)
- src.emag.reagents.add_reagent("sacid", 125)
+ modules += A
+ emag = new /obj/item/weapon/reagent_containers/spray/alien/acid(src)
+ emag.reagents.add_reagent("facid", 125)
+ emag.reagents.add_reagent("sacid", 125)
fix_modules()
@@ -469,44 +454,42 @@
)
/obj/item/weapon/robot_module/drone/New()
- src.modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
- src.modules += new /obj/item/weapon/screwdriver(src)
- src.modules += new /obj/item/weapon/wrench(src)
- src.modules += new /obj/item/weapon/crowbar(src)
- src.modules += new /obj/item/weapon/wirecutters(src)
- src.modules += new /obj/item/device/multitool(src)
- src.modules += new /obj/item/device/lightreplacer(src)
- src.modules += new /obj/item/weapon/gripper(src)
- src.modules += new /obj/item/weapon/matter_decompiler(src)
- src.modules += new /obj/item/weapon/reagent_containers/spray/cleaner/drone(src)
- src.modules += new /obj/item/weapon/soap(src)
- src.modules += new /obj/item/device/t_scanner(src)
+ modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
+ modules += new /obj/item/weapon/screwdriver(src)
+ modules += new /obj/item/weapon/wrench(src)
+ modules += new /obj/item/weapon/crowbar(src)
+ modules += new /obj/item/weapon/wirecutters(src)
+ modules += new /obj/item/device/multitool(src)
+ modules += new /obj/item/device/lightreplacer(src)
+ modules += new /obj/item/weapon/gripper(src)
+ modules += new /obj/item/weapon/matter_decompiler(src)
+ modules += new /obj/item/weapon/reagent_containers/spray/cleaner/drone(src)
+ modules += new /obj/item/weapon/soap(src)
+ modules += new /obj/item/device/t_scanner(src)
- src.emag = new /obj/item/weapon/pickaxe/drill/cyborg/diamond(src)
+ emag = new /obj/item/weapon/pickaxe/drill/cyborg/diamond(src)
for(var/T in stacktypes)
var/obj/item/stack/sheet/W = new T(src)
W.amount = stacktypes[T]
- src.modules += W
+ modules += W
fix_modules()
-/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R)
- var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in src.modules
+/obj/item/weapon/robot_module/drone/respawn_consumable(mob/living/silicon/robot/R)
+ var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in modules
C.reagents.add_reagent("cleaner", 3)
- var/obj/item/device/lightreplacer/LR = locate() in src.modules
+ var/obj/item/device/lightreplacer/LR = locate() in modules
LR.Charge(R)
..()
- return
-
//checks whether this item is a module of the robot it is located in.
/obj/item/proc/is_robot_module()
- if(!istype(src.loc, /mob/living/silicon/robot))
+ if(!istype(loc, /mob/living/silicon/robot))
return 0
- var/mob/living/silicon/robot/R = src.loc
+ var/mob/living/silicon/robot/R = loc
return (src in R.module.modules)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 66b0ba2b186..4ebf599a189 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -257,8 +257,8 @@
//The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot.
var/list/slot_equipment_priority = list( \
slot_back,\
- slot_wear_id,\
slot_wear_pda,\
+ slot_wear_id,\
slot_w_uniform,\
slot_wear_suit,\
slot_wear_mask,\
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
index aaaf11f0591..794bf2a3e9f 100644
--- a/code/modules/surgery/limb_reattach.dm
+++ b/code/modules/surgery/limb_reattach.dm
@@ -157,6 +157,7 @@
// Fixes fabricator IPC heads
if(!(E.dna) && E.robotic == 2 && target.dna)
E.set_dna(target.dna)
+ ..()
if(E.limb_name == "head")
var/obj/item/organ/external/head/H = target.get_organ("head")
var/datum/robolimb/robohead = all_robolimbs[H.model]
@@ -164,7 +165,6 @@
H.h_style = "Bald"
H.f_style = "Shaved"
target.m_styles["head"] = "None"
- ..()
E.status &= ~ORGAN_DESTROYED
if(E.children)
for(var/obj/item/organ/external/C in E.children)
diff --git a/html/changelog.html b/html/changelog.html
index 5214279f440..a74a9abecc0 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,152 @@
-->
+
18 August 2016
+
Alexshreds updated:
+
+ - pAIs can see the crew manifest again.
+ - Engineers and Atmos Techs have access to the ORM
+
+
Ar3nn updated:
+
+ - dusting playermobs now generates remains fitting for their race.
+
+
Chakishreds updated:
+
+ - You can now click on objects in a gassy room at the expense of ninja floors.
+
+
Chopchop1614 updated:
+
+ - fixes transformation sting not working.
+ - transformation sting now checks if the target has DNA or not
+
+
Crazylemon updated:
+
+ - Alt+Click should be quicker now
+ - The Alt+Click panel vanishes only when you alt click a turf distant from yourself
+ - Adds `json_to_object_arbitrary_vars`, a proc intended for use with SDQL
+ - Eye color is tracked on the eyes only, instead of on the body.
+ - The CMA panel no longer runtimes when you change species.
+ - Deserializing a human now preserves hair and eyes.
+ - Associative lists in VV now display properly again
+ - Admins can now click on the DI panel buttons to debug the corresponding controller in VV
+ - Fat people are now fat when naked.
+ - Encased mobs can now examine
+
+
Crazylemon64 updated:
+
+ - Makes teleportation checks more consistent, which will ensure that teleporting in the away mission no longer works.
+ - People on the space ruins level no longer count as dead for assassinate objectives.
+ - Space border turfs will now regain their destination when over-written and replaced on the edge of the map
+ - The space manager will no longer runtime if a space ruin writes on the edge of the map
+
+
DaveTheHeadcrab updated:
+
+ - ERT gloves reverted to how they used to be.
+
+
FalseIncarnate updated:
+
+ - WOLOLO! Traitor Chaplains can now WOLOLO with the new Missionary Staff and Robes. WOLOLO!
+
+
Fethas updated:
+
+ - The whitelist will respect addons better, didn't even have to make a ban appeal..
+
+
FlattestGuitar updated:
+
+ - Detective's coolness variable cranked up to 14.5, they will no longer vomit over corpses.
+ - Now you're less likely to vomit over a corpse if you're a normal human being.
+ - golems now have their master saved in attack logs
+
+
Fox McCloud updated:
+
+ - Adds in formal captain's uniform and armor
+ - Adds rapier to captain's locker
+ - Adds lace up shoes to captain's locker
+ - Adds crown to captain's locker
+ - Dramatically speeds up conveyor belts
+ - Appendicitis and Disease Outbreak events will no longer impact clientless mobs
+ - Fixes bandolier being invisible on spawn
+ - Removes the jukebox from the bar
+ - Detective Scanner, Fedora Tipping, Pontificating, and Cap Flipping are now action buttons
+ - Cane Gun and NT Rep's cane now acts as actual canes
+
+
FreeStylaLT updated:
+
+ - Fixed missing space transition tiles in emergency shuttle transit
+ - Fixed lack of prisoner access to lower part of labor camp shuttle
+ - Changed UO45's and MO19's away missions' external tiles to just airless ones.
+ - Changed MO19's exterior to be more rock than ground, this is to make Linda cry less when this mission is passed.
+
+
General Chaos updated:
+
+ - Ports TG's mech bay recharger code.
+
+
IcyV updated:
+
+ - Adds an exploding chameleon flag for traitors.
+
+
KorPhaeron and Fox McCloud updated:
+
+ - Merges Malf AI into traitor AI
+ - Malf AI's starting CPU reduced from 100 to 50
+ - Hacking APCs gives 10 additional CPU
+ - Hacking APCs throws an alert to the AI when it's hacking that automatically clears when hacking is complete (sounds too)
+ - Traitor AI's start off with a syndicate headset
+ - Adds doomsday device module for AI's for 130 CPU; when activated, it will purge the station of all life if the AI is not destroyed after 7.5 minutes
+ - Adds in AI upgrade modules which allows you to giving hacking abilities to the AI or allow it to have increase surveillance capabilities
+
+
Krausus updated:
+
+ - Karma spending is now slightly more straightforward and sanity-checked.
+ - Ghosts can now see non-crew antagonists in the Award Karma listing.
+ - You can now ctrl+click on yourself to stop pulling something.
+
+
Kyep updated:
+
+ - Added Syndicate Infiltration Teams (SITs), which are like Syndicate Strike Teams (SSTs) but focusing on stealth rather than direct combat. Useful for getting ghosts into rounds, spicing up rounds, having traitors with teamwork, and new kinds of traitor objectives like kidnap.
+ - Fixed bug that Dust implants had no icon.
+
+
LittleBigKid2000 updated:
+
+ - The arrivals checkpoint camera monitor is now connected to some camera networks by default.
+ - Talking swords can now be understood by their wielders, and everyone else.
+ - Engineering cyborgs now have floor painters. Absolutely nothing bad can happen because of this.
+
+
Norgad updated:
+
+ - Coated Reinforced Walls now have unique sprites
+
+
TullyBurnalot updated:
+
+ - Trash Bags fit in satchels/bags/duffelbags, but cannot be transported after being filled up.
+ - Advanced Mops clean faster, can clean more
+ - Holosign Projectors can create more signs
+ - Ghosts can no longer create dirt
+ - Dirt creation slowed down. "Clean Station" may actually be remotely possible now
+ - Janitorial Closet tidied up
+ - Can fill Light Replacers with boxes directly
+ - Can recycle 3 broken/burnt bulbs into a functioning one
+ - Can no longer cheat around NODROP by inserting NODROP lightbulbs into Light Replacers
+ - Ghosts can no longer trip Proximity Sensors
+ - Ghosts can no longer trip Infrared Sensors
+ - Effects (like hallucinations) can no longer trip Proximity and Infrared Sensors
+ - IDs are no longer dropped if their owner cryos with the ID inside a PDA inside a bag (very specific, yes)
+
+
Ty-Omaha updated:
+
+ - Allows sechailer phrases to be selectable
+ - Quick-equipping a PDA will now prioritize the PDA slot before the ID slot.
+
+
taukausanake updated:
+
+ - Gives proper mix_messages for Uplink, Synthignon, and Synth 'n Soda drinks
+
+
tristan1333 updated:
+
+
08 August 2016
Ar3nn updated: