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:

+ +

Ar3nn updated:

+ +

Chakishreds updated:

+ +

Chopchop1614 updated:

+ +

Crazylemon updated:

+ +

Crazylemon64 updated:

+ +

DaveTheHeadcrab updated:

+ +

FalseIncarnate updated:

+ +

Fethas updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

General Chaos updated:

+ +

IcyV updated:

+ +

KorPhaeron and Fox McCloud updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ +

LittleBigKid2000 updated:

+ +

Norgad updated:

+ +

TullyBurnalot updated:

+ +

Ty-Omaha updated:

+ +

taukausanake updated:

+ +

tristan1333 updated:

+ +

08 August 2016

Ar3nn updated: