@@ -340,7 +340,7 @@ nanoui is used to open and update nano browser uis
winset(user, "mapwindow.map", "focus=true") // return keyboard focus to map
on_close_winset()
//onclose(user, window_id)
- nanomanager.ui_opened(src)
+ SSnano.ui_opened(src)
/**
* Close this UI
@@ -349,7 +349,7 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/close()
is_auto_updating = 0
- nanomanager.ui_closed(src)
+ SSnano.ui_closed(src)
user << browse(null, "window=[window_id]")
/**
@@ -392,7 +392,7 @@ nanoui is used to open and update nano browser uis
return
if (src_object && src_object.Topic(href, href_list))
- nanomanager.update_uis(src_object) // update all UIs attached to src_object
+ SSnano.update_uis(src_object) // update all UIs attached to src_object
/**
* Process this UI, updating the entire UI or just the status (aka visibility)
@@ -406,7 +406,7 @@ nanoui is used to open and update nano browser uis
if (!src_object || !user)
close()
return
-
+
if (status && (update || is_auto_updating))
src_object.ui_interact(user, ui_key, src) // Update the UI (update_status() is called whenever a UI is updated)
else
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index df41e44c61f..2d5ead77aff 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -84,7 +84,7 @@
/obj/item/weapon/paper/attack_self(mob/user)
user.examinate(src)
- if(rigged && (events.holiday == "April Fool's Day"))
+ if(rigged && (SSevent.holiday == "April Fool's Day"))
if(spam_flag == 0)
spam_flag = 1
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index a85940d0f81..e4e8a72694d 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -47,7 +47,7 @@
papers.Remove(P)
else
P = new /obj/item/weapon/paper
- if(events.holiday == "April Fool's Day")
+ if(SSevent.holiday == "April Fool's Day")
if(prob(30))
P.info = "
HONK HONK HONK HONK HONK HONK HONK
HOOOOOOOOOOOOOOOOOOOOOONK
APRIL FOOLS"
P.rigged = 1
diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm
index 0cec896235e..e30567795c0 100644
--- a/code/modules/power/antimatter/shielding.dm
+++ b/code/modules/power/antimatter/shielding.dm
@@ -155,7 +155,8 @@ proc/cardinalrange(var/center)
/obj/machinery/am_shielding/proc/setup_core()
processing = 1
- machines.Add(src)
+ machines |= src
+ SSmachine.processing |= src
if(!control_unit) return
control_unit.linked_cores.Add(src)
control_unit.reported_core_efficiency += efficiency
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 7f933f37e06..7014dec8cc4 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -714,7 +714,7 @@
)
// update the ui if it exists, returns null if no ui is passed/found
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
+ ui = SSnano.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 964b1fa6440..47bc5989647 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -370,6 +370,8 @@
else if(status != LIGHT_BROKEN && status != LIGHT_EMPTY)
user.do_attack_animation(src)
+ if(W.damtype == STAMINA)
+ return
if(prob(1+W.force * 5))
user.visible_message("
[user.name] smashed the light!", \
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index a9f1c3a0611..3ee6979100f 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -217,7 +217,7 @@
// rebuild all power networks from scratch - only called at world creation or by the admin verb
-/proc/makepowernets()
+/datum/subsystem/power/proc/makepowernets()
for(var/datum/powernet/PN in powernets)
del(PN)
powernets.Cut()
@@ -356,10 +356,10 @@
////////////////////////////////////////////
/datum/powernet/New()
- powernets += src
+ SSpower.powernets += src
/datum/powernet/Destroy()
- powernets -= src
+ SSpower.powernets -= src
/datum/powernet/proc/is_empty()
return !cables.len && !nodes.len
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 1ed275131b6..c502e814eff 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -34,8 +34,7 @@
narsie_spawn_animation()
sleep(70)
- if(emergency_shuttle)
- emergency_shuttle.incall(0.3) // Cannot recall
+ SSshuttle.emergency.request(null, 0.3) // Cannot recall
/obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 8f1443cb6c3..78998bac96e 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -32,7 +32,7 @@
src.energy = starting_energy
..()
- processing_objects.Add(src)
+ SSobj.processing.Add(src)
for(var/obj/machinery/power/singularity_beacon/singubeacon in world)
if(singubeacon.active)
target = singubeacon
@@ -40,7 +40,7 @@
return
/obj/singularity/Destroy()
- processing_objects.Remove(src)
+ SSobj.processing.Remove(src)
..()
/obj/singularity/Move(atom/newloc, direct)
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 64d0ac7bbd4..3ee6f487554 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -315,7 +315,7 @@
)
// update the ui if it exists, returns null if no ui is passed/found
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
+ ui = SSnano.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 7c70cb2c484..c0341f3eb52 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -1,8 +1,6 @@
#define SOLAR_MAX_DIST 40
#define SOLARGENRATE 1500
-var/list/solars_list = list()
-
/obj/machinery/power/solar
name = "solar panel"
desc = "A solar electrical generator."
@@ -108,14 +106,12 @@ var/list/solars_list = list()
//calculates the fraction of the sunlight that the panel recieves
/obj/machinery/power/solar/proc/update_solar_exposure()
- if(!sun)
- return
if(obscured)
sunfrac = 0
return
//find the smaller angle between the direction the panel is facing and the direction of the sun (the sign is not important here)
- var/p_angle = min(abs(adir - sun.angle), 360 - abs(adir - sun.angle))
+ var/p_angle = min(abs(adir - SSsun.angle), 360 - abs(adir - SSsun.angle))
if(p_angle > 90) // if facing more than 90deg from sun, zero output
sunfrac = 0
@@ -127,7 +123,7 @@ var/list/solars_list = list()
/obj/machinery/power/solar/process()//TODO: remove/add this from machines to save on processing as needed ~Carn PRIORITY
if(stat & BROKEN)
return
- if(!sun || !control) //if there's no sun or the panel is not linked to a solar control computer, no need to proceed
+ if(!control) //if there's no sun or the panel is not linked to a solar control computer, no need to proceed
return
if(powernet)
@@ -178,10 +174,12 @@ var/list/solars_list = list()
var/ax = x // start at the solar panel
var/ay = y
var/turf/T = null
+ var/dx = SSsun.dx
+ var/dy = SSsun.dy
for(var/i = 1 to 20) // 20 steps is enough
- ax += sun.dx // do step
- ay += sun.dy
+ ax += dx // do step
+ ay += dy
T = locate( round(ax,0.5),round(ay,0.5),z)
@@ -308,12 +306,12 @@ var/list/solars_list = list()
/obj/machinery/power/solar_control/disconnect_from_network()
..()
- solars_list.Remove(src)
+ SSsun.solars.Remove(src)
/obj/machinery/power/solar_control/connect_to_network()
var/to_return = ..()
if(powernet) //if connected and not already in solar_list...
- solars_list |= src //... add it
+ SSsun.solars |= src //... add it
return to_return
//search for unconnected panels and trackers in the computer powernet and connect them
@@ -341,7 +339,7 @@ var/list/solars_list = list()
cdir = targetdir //...the current direction is the targetted one (and rotates panels to it)
if(2) // auto-tracking
if(connected_tracker)
- connected_tracker.set_angle(sun.angle)
+ connected_tracker.set_angle(SSsun.angle)
set_panels(cdir)
updateDialog()
@@ -475,7 +473,7 @@ var/list/solars_list = list()
track = text2num(href_list["track"])
if(track == 2)
if(connected_tracker)
- connected_tracker.set_angle(sun.angle)
+ connected_tracker.set_angle(SSsun.angle)
set_panels(cdir)
else if (track == 1) //begin manual tracking
src.targetdir = src.cdir
@@ -485,7 +483,7 @@ var/list/solars_list = list()
if(href_list["search_connected"])
search_for_connected()
if(connected_tracker && track == 2)
- connected_tracker.set_angle(sun.angle)
+ connected_tracker.set_angle(SSsun.angle)
set_panels(cdir)
src.updateUsrDialog()
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 5129c8f259f..b3c855e71da 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -90,7 +90,7 @@
if(!can_trigger_gun(L))
return
- process_fire(target,user,flag,params)
+ process_fire(target,user,1,params)
/obj/item/weapon/gun/proc/can_trigger_gun(mob/living/carbon/user)
if (!user.IsAdvancedToolUser())
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 75d5a076186..f30ce4493de 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -30,11 +30,11 @@ obj/item/weapon/gun/energy/laser/retro
/obj/item/weapon/gun/energy/laser/captain/New()
..()
- processing_objects.Add(src)
+ SSobj.processing.Add(src)
/obj/item/weapon/gun/energy/laser/captain/Destroy()
- processing_objects.Remove(src)
+ SSobj.processing.Remove(src)
..()
@@ -115,11 +115,11 @@ obj/item/weapon/gun/energy/laser/retro
/obj/item/weapon/gun/energy/laser/bluetag/New()
..()
- processing_objects.Add(src)
+ SSobj.processing.Add(src)
/obj/item/weapon/gun/energy/laser/bluetag/Destroy()
- processing_objects.Remove(src)
+ SSobj.processing.Remove(src)
..()
@@ -154,11 +154,11 @@ obj/item/weapon/gun/energy/laser/retro
/obj/item/weapon/gun/energy/laser/redtag/New()
..()
- processing_objects.Add(src)
+ SSobj.processing.Add(src)
/obj/item/weapon/gun/energy/laser/redtag/Destroy()
- processing_objects.Remove(src)
+ SSobj.processing.Remove(src)
..()
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 15885dcdc43..a22dd334186 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -23,11 +23,11 @@
/obj/item/weapon/gun/energy/gun/nuclear/New()
..()
- processing_objects.Add(src)
+ SSobj.processing.Add(src)
/obj/item/weapon/gun/energy/gun/nuclear/Destroy()
- processing_objects.Remove(src)
+ SSobj.processing.Remove(src)
..()
@@ -61,7 +61,7 @@
M << "
You feel a wave of heat wash over you."
M.apply_effect(300, IRRADIATE)
crit_fail = 1 //break the gun so it stops recharging
- processing_objects.Remove(src)
+ SSobj.processing.Remove(src)
update_icon()
return 0
@@ -108,4 +108,4 @@
/obj/item/weapon/gun/energy/gun/turret
name = "hybrid turret gun"
desc = "A basic hybrid energy gun with two settings: Stun and kill."
- ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
\ No newline at end of file
+ ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 4db3e4a9ffb..561e8a15f5e 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -33,11 +33,11 @@
/obj/item/weapon/gun/energy/floragun/New()
..()
- processing_objects.Add(src)
+ SSobj.processing.Add(src)
/obj/item/weapon/gun/energy/floragun/Destroy()
- processing_objects.Remove(src)
+ SSobj.processing.Remove(src)
..()
@@ -69,11 +69,11 @@
/obj/item/weapon/gun/energy/meteorgun/New()
..()
- processing_objects.Add(src)
+ SSobj.processing.Add(src)
/obj/item/weapon/gun/energy/meteorgun/Destroy()
- processing_objects.Remove(src)
+ SSobj.processing.Remove(src)
..()
/obj/item/weapon/gun/energy/meteorgun/process()
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 8f28a53effc..f79e0b24d0c 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -32,11 +32,11 @@
/obj/item/weapon/gun/energy/gun/advtaser/cyborg/New()
..()
- processing_objects.Add(src)
+ SSobj.processing.Add(src)
/obj/item/weapon/gun/energy/gun/advtaser/cyborg/Destroy()
- processing_objects.Remove(src)
+ SSobj.processing.Remove(src)
..()
/obj/item/weapon/gun/energy/gun/advtaser/cyborg/process() //Every [recharge_time] ticks, recharge a shot for the cyborg
@@ -72,11 +72,11 @@
/obj/item/weapon/gun/energy/crossbow/New()
..()
- processing_objects.Add(src)
+ SSobj.processing.Add(src)
/obj/item/weapon/gun/energy/crossbow/Destroy()
- processing_objects.Remove(src)
+ SSobj.processing.Remove(src)
..()
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index c575632c498..063e135516a 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -46,11 +46,11 @@
..()
charges = max_charges
chambered = new ammo_type(src)
- if(can_charge) processing_objects.Add(src)
+ if(can_charge) SSobj.processing.Add(src)
/obj/item/weapon/gun/magic/Destroy()
- if(can_charge) processing_objects.Remove(src)
+ if(can_charge) SSobj.processing.Remove(src)
..()
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index a66edfd891d..0022664d00f 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -28,7 +28,7 @@
energy = min(energy + addenergy, max_energy)
if(energy != oldenergy)
use_power(1500) // This thing uses up alot of power (this is still low as shit for creating reagents from thin air)
- nanomanager.update_uis(src) // update all UIs attached to src
+ SSnano.update_uis(src) // update all UIs attached to src
/obj/machinery/chem_dispenser/power_change()
if(powered())
@@ -36,7 +36,7 @@
else
spawn(rand(0, 15))
stat |= NOPOWER
- nanomanager.update_uis(src) // update all UIs attached to src
+ SSnano.update_uis(src) // update all UIs attached to src
/obj/machinery/chem_dispenser/process()
@@ -103,7 +103,7 @@
data["chemicals"] = chemicals
// update the ui if it exists, returns null if no ui is passed/found
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
+ ui = SSnano.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
@@ -138,6 +138,7 @@
var/obj/item/weapon/reagent_containers/glass/B = beaker
B.loc = loc
beaker = null
+ overlays -= "disp_beaker"
add_fingerprint(usr)
return 1 // update UIs attached to this object
@@ -157,7 +158,8 @@
user.drop_item()
B.loc = src
user << "You add the beaker to the machine!"
- nanomanager.update_uis(src) // update all UIs attached to src
+ SSnano.update_uis(src) // update all UIs attached to src
+ overlays += "disp_beaker"
/obj/machinery/chem_dispenser/attack_ai(mob/user as mob)
return src.attack_hand(user)
@@ -666,7 +668,7 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
if(archive_diseases[id])
var/datum/disease/advance/A = archive_diseases[id]
A.AssignName(new_name)
- for(var/datum/disease/advance/AD in active_diseases)
+ for(var/datum/disease/advance/AD in SSdisease.processing)
AD.Refresh()
src.updateUsrDialog()
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
index 2151bbec53f..02983913ee8 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
@@ -650,6 +650,10 @@ datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume)
for(var/mob/living/carbon/slime/M in T)
M.adjustToxLoss(rand(5,10))
+ if(istype(T, /turf/simulated/floor))
+ var/turf/simulated/floor/F = T
+ if(volume >= 1)
+ F.dirt = 0
datum/reagent/space_cleaner/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(iscarbon(M))
@@ -689,6 +693,7 @@ datum/reagent/cryptobiolin/on_mob_life(var/mob/living/M as mob)
if(!M.confused)
M.confused = 1
M.confused = max(M.confused, 20)
+ ..()
return
datum/reagent/impedrezene
@@ -854,4 +859,4 @@ datum/reagent/plantnutriment/robustharvestnutriment
// Undefine the alias for REAGENTS_EFFECT_MULTIPLER
-#undef REM
\ No newline at end of file
+#undef REM
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 6fe8b06f328..b4a3825e249 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -38,11 +38,11 @@ Borg Hypospray
modes[R] = iteration
iteration++
- processing_objects.Add(src)
+ SSobj.processing.Add(src)
/obj/item/weapon/reagent_containers/borghypo/Destroy()
- processing_objects.Remove(src)
+ SSobj.processing.Remove(src)
..()
diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm
index 35707c8792a..bccc3191087 100644
--- a/code/modules/reagents/reagent_containers/glass/bottle.dm
+++ b/code/modules/reagents/reagent_containers/glass/bottle.dm
@@ -289,6 +289,28 @@
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
+/obj/item/weapon/reagent_containers/glass/bottle/anxiety
+ name = "Severe Anxiety culture bottle"
+ desc = "A small bottle. Contains a sample of Lepidopticides."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle3"
+ New()
+ ..()
+ var/datum/disease/F = new /datum/disease/anxiety(0)
+ var/list/data = list("viruses"= list(F))
+ reagents.add_reagent("blood", 20, data)
+
+/obj/item/weapon/reagent_containers/glass/bottle/beesease
+ name = "Beesease culture bottle"
+ desc = "A small bottle. Contains a sample of invasive Apidae."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle3"
+ New()
+ ..()
+ var/datum/disease/F = new /datum/disease/beesease(0)
+ var/list/data = list("viruses"= list(F))
+ reagents.add_reagent("blood", 20, data)
+
/obj/item/weapon/reagent_containers/glass/bottle/pacid
name = "Polytrinic Acid Bottle"
desc = "A small bottle. Contains a small amount of Polytrinic Acid"
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 3bc86346e64..e8d18906c53 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -1,52 +1,472 @@
-var/obj/list/shuttles = list(("escape" = new /datum/shuttle_manager(/area/shuttle/escape/centcom, 0)), ("pod1" = new /datum/shuttle_manager(/area/shuttle/escape_pod1/station, 0)), ("pod2" = new /datum/shuttle_manager(/area/shuttle/escape_pod2/station, 0)), ("pod3" = new /datum/shuttle_manager(/area/shuttle/escape_pod3/station, 0)), ("pod4" = new /datum/shuttle_manager(/area/shuttle/escape_pod4/station, 0)), ("mining" = new /datum/shuttle_manager(/area/shuttle/mining/station, 10)), ("laborcamp" = new /datum/shuttle_manager(/area/shuttle/laborcamp/station, 10)), ("ferry" = new /datum/shuttle_manager(/area/shuttle/transport1/centcom, 0)))
- //Pre-made shuttles should have non-number keys, so that buildable shuttles can use numbered keys without allowing 'I build a shuttle console with the escape number as its ID.'
-datum/shuttle_manager
- var/tickstomove = 10 //How long does it take to move the shuttle?
- var/moving = 0 //Is it moving?
- var/area/shuttle/location //The current location of the actual shuttle
+//use this define to highlight docking port bounding boxes (ONLY FOR DEBUG USE)
+//#define DOCKING_PORT_HIGHLIGHT
-datum/shuttle_manager/New(var/area, var/delay) //Create a new shuttle manager for the shuttle starting area, "area" and with a movement delay of tickstomove
- location = area
- tickstomove = delay
- var/area/A = locate(location)
- A.has_gravity = 1
+//NORTH default dir
+/obj/docking_port
+ invisibility = 101
+ icon = 'icons/obj/device.dmi'
+ //icon = 'icons/dirsquare.dmi'
+ icon_state = "pinonfar"
+
+ unacidable = 1
+ anchored = 1
+
+ var/id
+ dir = NORTH //this should point -away- from the dockingport door, ie towards the ship
+ var/width = 0 //size of covered area, perpendicular to dir
+ var/height = 0 //size of covered area, paralell to dir
+ var/dwidth = 0 //position relative to covered area, perpendicular to dir
+ var/dheight = 0 //position relative to covered area, parallel to dir
+
+ //these objects are indestructable
+ Destroy()
+ return 1
-datum/shuttle_manager/proc/move_shuttle(var/override_delay)
- if(moving) return 0
- moving = 1
- spawn(override_delay == null ? tickstomove*10 : override_delay)
- var/area/shuttle/fromArea
- var/area/shuttle/toArea
- fromArea = locate(location) //the location of the shuttle
- toArea = locate(fromArea.destination)
+ //returns a list(x0,y0, x1,y1) where points 0 and 1 are bounding corners of the projected rectangle
+ proc/return_coords(_x, _y, _dir)
+ if(!_dir)
+ _dir = dir
+ if(!_x)
+ _x = x
+ if(!_y)
+ _y = y
- toArea.clear_docking_area()
+ //byond's sin and cos functions are inaccurate. This is faster and perfectly accurate
+ var/cos = 1
+ var/sin = 0
+ switch(_dir)
+ if(WEST)
+ cos = 0
+ sin = 1
+ if(SOUTH)
+ cos = -1
+ sin = 0
+ if(EAST)
+ cos = 0
+ sin = -1
- fromArea.move_contents_to(toArea)
- location = toArea.type
+ return list(
+ _x + (-dwidth*cos) - (-dheight*sin),
+ _y + (-dwidth*sin) + (-dheight*cos),
+ _x + (-dwidth+width-1)*cos - (-dheight+height-1)*sin,
+ _y + (-dwidth+width-1)*sin + (-dheight+height-1)*cos
+ )
- fromArea.has_gravity = 0
- toArea.has_gravity = 1
- for(var/obj/machinery/door/D in toArea) //Close any doors on the shuttle
- spawn(0)
- D.close()
+ //returns turfs within our projected rectangle in a specific order.
+ //this ensures that turfs are copied over in the same order, regardless of any rotation
+ proc/return_ordered_turfs(_x, _y, _z, _dir)
+ if(!_dir)
+ _dir = dir
+ if(!_x)
+ _x = x
+ if(!_y)
+ _y = y
+ if(!_z)
+ _z = z
+ var/cos = 1
+ var/sin = 0
+ switch(_dir)
+ if(WEST)
+ cos = 0
+ sin = 1
+ if(SOUTH)
+ cos = -1
+ sin = 0
+ if(EAST)
+ cos = 0
+ sin = -1
- for(var/mob/M in toArea)
- if(M.client)
- spawn(0)
- if(M.buckled)
- shake_camera(M, 2, 1) // turn it down a bit come on
+ . = list()
+
+ var/xi
+ var/yi
+ for(var/dx=0, dx
S.dwidth)
+ return 2
+ if(width-dwidth > S.width-S.dwidth)
+ return 3
+ if(dheight > S.dheight)
+ return 4
+ if(height-dheight > S.height-S.dheight)
+ return 5
+ //check the dock isn't occupied
+ if(S.get_docked())
+ return 6
+ return 0 //0 means we can dock
+
+ //call the shuttle to destination S
+ proc/request(obj/docking_port/stationary/S)
+ if(canDock(S))
+ ERROR("[type](\"[name]\") cannot dock at [S]\")")
+ return 1 //we can't dock at S
+
+ switch(mode)
+ if(SHUTTLE_CALL)
+ if(S == destination)
+ if(world.time <= timer)
+ timer = world.time
+ else
+ destination = S
+ timer = world.time
+ if(SHUTTLE_RECALL)
+ if(S == destination)
+ timer = world.time - timeLeft(1)
+ else
+ destination = S
+ timer = world.time
+ mode = SHUTTLE_CALL
+ else
+ destination = S
+ mode = SHUTTLE_CALL
+ timer = world.time
+ enterTransit() //hyperspace
+
+ //recall the shuttle to where it was previously
+ proc/cancel()
+ if(mode != SHUTTLE_CALL)
+ return
+
+ timer = world.time - timeLeft(1)
+ mode = SHUTTLE_RECALL
+
+ proc/enterTransit()
+ previous = null
+// if(!destination)
+// return
+ var/obj/docking_port/stationary/S0 = get_docked()
+ var/obj/docking_port/stationary/S1 = findTransitDock()
+ if(S1)
+ if(dock(S1))
+ WARNING("shuttle \"[id]\" could not enter transit space. Docked at [S0 ? S0.id : "null"]. Transit dock [S1 ? S1.id : "null"].")
+ else
+ previous = S0
+ else
+ WARNING("shuttle \"[id]\" could not enter transit space. S0=[S0 ? S0.id : "null"] S1=[S1 ? S1.id : "null"]")
+
+ //this is the main proc. It instantly moves our mobile port to stationary port S1
+ //it handles all the generic behaviour, such as sanity checks, closing doors on the shuttle, stunning mobs, etc
+ proc/dock(obj/docking_port/stationary/S1)
+ . = canDock(S1)
+ if(.)
+ ERROR("[type](\"[name]\") cannot dock at [S1]")
+ return .
+
+ if(canMove())
+ return -1
+
+ closePortDoors()
+
+// //rotate transit docking ports, so we don't need zillions of variants
+// if(istype(S1, /obj/docking_port/stationary/transit))
+// S1.dir = turn(NORTH, -travelDir)
+
+ var/obj/docking_port/stationary/S0 = get_docked()
+ var/turf_type = /turf/space
+ var/area_type = /area/space
+ if(S0)
+ if(S0.turf_type)
+ turf_type = S0.turf_type
+ if(S0.area_type)
+ area_type = S0.area_type
+
+ var/list/L0 = return_ordered_turfs()
+ var/list/L1 = return_ordered_turfs(S1.x, S1.y, S1.z, S1.dir)
+
+ //remove area surrounding docking port
+ if(areaInstance.contents.len)
+ var/area/A0 = locate("[area_type]")
+ if(!A0)
+ A0 = new area_type(null)
+ for(var/turf/T0 in L0)
+ A0.contents += T0
+
+ //move or squish anything in the way ship at destination
+ roadkill(L1, S1.dir)
+
+ for(var/i=1, i<=L0.len, ++i)
+ var/turf/T0 = L0[i]
+ if(!istype(T0, /turf/simulated/shuttle)) //only move shuttle turfs!
+ continue
+
+ var/turf/T1 = L1[i]
+ if(!T1)
+ continue
+
+ T0.copyTurf(T1)
+ areaInstance.contents += T1
+
+ //copy over air
+ if(istype(T1, /turf/simulated))
+ var/turf/simulated/Ts1 = T1
+ Ts1.copy_air_with_tile(T0)
+
+ //move mobile to new location
+ loc = S1.loc
+ dir = S1.dir
+
+ //move all objects
+ for(var/obj/O in T0)
+ if(O.invisibility >= 101)
+ continue
+ O.loc = T1
+
+ //close open doors
+ if(istype(O, /obj/machinery/door))
+ var/obj/machinery/door/Door = O
+ spawn(-1)
+ if(Door)
+ Door.close()
+
+ for(var/mob/M in T0)
+ if(!M.move_on_shuttle)
+ continue
+ M.loc = T1
+
+ //docking turbulence
+ if(M.client)
+ spawn(0)
+ if(M.buckled)
+ shake_camera(M, 2, 1) // turn it down a bit come on
+ else
+ shake_camera(M, 7, 1)
+ if(istype(M, /mob/living/carbon))
+ if(!M.buckled)
+ M.Weaken(3)
+
+ T0.ChangeTurf(turf_type)
+
+ //air system updates
+ for(var/turf/T1 in L1)
+ T1.shift_to_subarea()
+ SSair.remove_from_active(T1)
+ T1.CalculateAdjacentTurfs()
+ SSair.add_to_active(T1,1)
+
+ for(var/turf/T0 in L0)
+ T0.shift_to_subarea()
+ SSair.remove_from_active(T0)
+ T0.CalculateAdjacentTurfs()
+ SSair.add_to_active(T0,1)
+
+/*
+ if(istype(S1, /obj/docking_port/stationary/transit))
+ var/d = turn(dir, 180 + travelDir)
+ for(var/turf/space/transit/T in S1.return_ordered_turfs())
+ T.pushdirection = d
+ T.update_icon()
+*/
+
+ proc/findTransitDock()
+ var/obj/docking_port/stationary/transit/T = SSshuttle.getDock("[id]_transit")
+ if(T && !canDock(T))
+ return T
+ /* commented out due to issues with rotation
+ for(var/obj/docking_port/stationary/transit/S in SSshuttle.transit)
+ if(S.id)
+ continue
+ if(!canDock(S))
+ return S
+ */
+
+
+ //shuttle-door closing is handled in the dock() proc whilst looping through turfs
+ //this one closes the door where we are docked at, if there is one there.
+ proc/closePortDoors()
+ var/turf/T = get_step(loc, turn(dir,180))
+ if(T)
+ var/obj/machinery/door/Door = locate() in T
+ if(Door)
+ spawn(-1)
+ Door.close()
+
+ proc/roadkill(list/L, dir, x, y)
+ for(var/turf/T in L)
+ for(var/atom/movable/AM in T)
+ if(ismob(AM))
+ if(istype(AM, /mob/living))
+ var/mob/living/M = AM
+ M.Paralyse(10)
+ M.take_organ_damage(80)
+ M.anchored = 0
else
- shake_camera(M, 7, 1)
- if(istype(M, /mob/living/carbon))
- if(!M.buckled)
- M.Weaken(3)
+ continue
- moving = 0
- return 1
+ if(!AM.anchored)
+ step(AM, dir)
+ else
+ qdel(AM)
+/*
+ //used to check if atom/A is within the shuttle's bounding box
+ proc/onShuttleCheck(atom/A)
+ var/turf/T = get_turf(A)
+ if(!T)
+ return 0
+ var/list/L = return_coords()
+ if(L[1] > L[3])
+ L.Swap(1,3)
+ if(L[2] > L[4])
+ L.Swap(2,4)
+
+ if(L[1] <= T.x && T.x <= L[3])
+ if(L[2] <= T.y && T.y <= L[4])
+ return 1
+ return 0
+*/
+ //used by shuttle subsystem to check timers
+ proc/check()
+ var/timeLeft = timeLeft(1)
+ if(timeLeft <= 0)
+ switch(mode)
+ if(SHUTTLE_CALL)
+ if(dock(destination))
+ setTimer(20) //can't dock for some reason, try again in 2 seconds
+ return
+ if(SHUTTLE_RECALL)
+ if(dock(previous))
+ setTimer(20) //can't dock for some reason, try again in 2 seconds
+ return
+ mode = SHUTTLE_IDLE
+ timer = 0
+ destination = null
+
+
+ proc/setTimer(wait)
+ if(timer <= 0)
+ timer = world.time
+ timer += wait - timeLeft(1)
+
+ //returns timeLeft
+ proc/timeLeft(divisor)
+ if(divisor <= 0)
+ divisor = 10
+ if(!timer)
+ return round(callTime/divisor, 1)
+ return max( round((timer+callTime-world.time)/divisor,1), 0 )
+
+ proc/getStatusText()
+ var/obj/docking_port/stationary/dockedAt = get_docked()
+ . = (dockedAt && dockedAt.name) ? dockedAt.name : "unknown"
+ if(istype(dockedAt, /obj/docking_port/stationary/transit))
+ var/obj/docking_port/stationary/dst
+ if(mode == SHUTTLE_RECALL)
+ dst = previous
+ else
+ dst = destination
+ . += " towards [dst ? dst.name : "unknown location"] ([timeLeft(600)]mins)"
/obj/machinery/computer/shuttle
name = "Shuttle Console"
@@ -54,17 +474,34 @@ datum/shuttle_manager/proc/move_shuttle(var/override_delay)
icon_state = "shuttle"
req_access = list( )
circuit = /obj/item/weapon/circuitboard/shuttle
- var/id
+ var/shuttleId
+ var/possible_destinations = ""
+
+/obj/machinery/computer/shuttle/New(location, obj/item/weapon/circuitboard/shuttle/C)
+ ..()
+ if(istype(C))
+ possible_destinations = C.possible_destinations
+ shuttleId = C.shuttleId
/obj/machinery/computer/shuttle/attack_hand(user as mob)
if(..(user))
return
src.add_fingerprint(usr)
- var/dat
- dat = text("Send Shuttle")
- //user << browse("[dat]", "window=miningshuttle;size=200x100")
- var/datum/browser/popup = new(user, "miningshuttle", name, 200, 140)
- popup.set_content(dat)
+
+ var/list/options = params2list(possible_destinations)
+ var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
+ var/dat = "Status: [M ? M.getStatusText() : "*Missing*"]
"
+ if(M)
+ for(var/obj/docking_port/stationary/S in SSshuttle.stationary)
+ if(!options.Find(S.id))
+ continue
+ if(M.canDock(S))
+ continue
+ dat += "Send to [S.name]
"
+ dat += "Close"
+
+ var/datum/browser/popup = new(user, "computer", M ? M.name : "shuttle", 300, 200)
+ popup.set_content("[dat]")
popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
@@ -76,15 +513,12 @@ datum/shuttle_manager/proc/move_shuttle(var/override_delay)
if(!allowed(usr))
usr << "Access denied."
return
+
if(href_list["move"])
- if(id in shuttles)
- var/datum/shuttle_manager/s = shuttles[id]
- if (s.move_shuttle())
- usr << "Shuttle recieved message and will be sent shortly."
- else
- usr << "Shuttle is already moving."
- else
- usr << "Invalid shuttle requested."
+ switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1))
+ if(0) usr << "Shuttle recieved message and will be sent shortly."
+ if(1) usr << "Invalid shuttle requested."
+ else usr << "Unable to comply."
/obj/machinery/computer/shuttle/emag_act(mob/user as mob)
if(!emagged)
@@ -95,20 +529,30 @@ datum/shuttle_manager/proc/move_shuttle(var/override_delay)
/obj/machinery/computer/shuttle/ferry
name = "transport ferry console"
circuit = /obj/item/weapon/circuitboard/ferry
- id = "ferry"
+ shuttleId = "ferry"
+ possible_destinations = "ferry_home;ferry_away"
+
/obj/machinery/computer/shuttle/ferry/request
name = "ferry console"
circuit = /obj/item/weapon/circuitboard/ferry/request
var/cooldown //prevents spamming admins
+ possible_destinations = "ferry_home"
-/obj/machinery/computer/shuttle/ferry/request/Topic(href, href_list)
- if(href_list["move"])
- if(cooldown)
- return
- cooldown = 1
- usr << "Docking locks are engaged. Requesting authorization..."
- var/datum/shuttle_manager/s = shuttles["ferry"]
- admins << "FERRY: [key_name(usr)] (?) (JMP) (Move) is requesting to move the transport ferry to [s.location == /area/shuttle/transport1/centcom ? "the station" : "Centcom"]."
- spawn(600) //One minute cooldown
- cooldown = 0
\ No newline at end of file
+
+
+#undef DOCKING_PORT_HIGHLIGHT
+
+
+/turf/proc/copyTurf(turf/T)
+ if(T.type != type)
+ T = new type(T)
+ if(T.icon_state != icon_state)
+ T.icon_state = icon_state
+ if(T.icon != icon)
+ T.icon = icon
+ if(T.color != color)
+ T.color = color
+ if(T.dir != dir)
+ T.dir = dir
+ return T
\ No newline at end of file
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index e0eccaff92b..98c42e57f46 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -119,14 +119,14 @@
/obj/item/weapon/rcs/New()
..()
- processing_objects.Add(src)
+ SSobj.processing.Add(src)
/obj/item/weapon/rcs/examine(mob/user)
..()
user << "There are [rcharges] charge\s left."
/obj/item/weapon/rcs/Destroy()
- processing_objects.Remove(src)
+ SSobj.processing.Remove(src)
..()
/obj/item/weapon/rcs/process()
if(rcharges > 10)
@@ -154,4 +154,4 @@
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
- user << " You emag the RCS. Click on it to toggle between modes."
\ No newline at end of file
+ user << " You emag the RCS. Click on it to toggle between modes."
diff --git a/code/world.dm b/code/world.dm
index c31d225da1d..a548eb0d160 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -3,11 +3,11 @@
turf = /turf/space
area = /area/space
view = "15x15"
- cache_lifespan = 1
-
-#define RECOMMENDED_VERSION 495
+ cache_lifespan = 7
/world/New()
+ map_ready = 1
+
#if (PRELOAD_RSC == 0)
external_rsc_urls = file2list("config/external_rsc_urls.txt","\n")
var/i=1
@@ -30,9 +30,6 @@
diaryofmeanpeople << "\n\nStarting up. [time2text(world.timeofday, "hh:mm.ss")]\n---------------------"
changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently
- if(byond_version < RECOMMENDED_VERSION)
- world.log << "Your server's BYOND version does not meet the recommended requirements for /tg/station code. Please update BYOND."
-
make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
load_configuration()
@@ -54,48 +51,21 @@
timezoneOffset = text2num(time2text(0,"hh")) * 36000
- sun = new /datum/sun()
- radio_controller = new /datum/controller/radio()
- data_core = new /obj/effect/datacore()
- paiController = new /datum/paiController()
-
if(config.sql_enabled)
if(!setup_database_connection())
world.log << "Your server failed to establish a connection with the database."
else
world.log << "Database connection established."
- plmaster = new /obj/effect/overlay()
- plmaster.icon = 'icons/effects/tile_effects.dmi'
- plmaster.icon_state = "plasma"
- plmaster.layer = FLY_LAYER
- plmaster.mouse_opacity = 0
- slmaster = new /obj/effect/overlay()
- slmaster.icon = 'icons/effects/tile_effects.dmi'
- slmaster.icon_state = "sleeping_agent"
- slmaster.layer = FLY_LAYER
- slmaster.mouse_opacity = 0
+ data_core = new /obj/effect/datacore()
- setup_map_transitions()
- for(var/i=0, iYou have been inactive for more than 10 minutes and have been disconnected."
- del(C)
-#undef INACTIVITY_KICK
-
-
/world/proc/load_mode()
var/list/Lines = file2list("data/mode.txt")
if(Lines.len)
diff --git a/config/admins.txt b/config/admins.txt
index cec937826ec..f71ed183fde 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -73,3 +73,5 @@ Cuboos = Game Master
thunder12345 = Game Master
wjohnston = Game Master
mandurrh = Game Master
+thurgatar = Game Master
+xerux = Game Master
diff --git a/config/game_options.txt b/config/game_options.txt
index 00fad47a4de..62bfc11ff59 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -88,6 +88,7 @@ PROBABILITY CHANGELING 2
PROBABILITY WIZARD 4
PROBABILITY MALFUNCTION 1
PROBABILITY BLOB 2
+PROBABILITY RAGINMAGES 2
PROBABILITY MONKEY 1
PROBABILITY METEOR 0
PROBABILITY EXTENDED 0
diff --git a/html/changelog.html b/html/changelog.html
index 092b4c9d99f..5d8ce1986bc 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,14 @@
-->
+
+
06 January 2015
+
JJRcop, Nienhaus updated:
+
+ - Adds emoji to OOC chat.
+
+
+
27 December 2014
Dorsidwarf updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index c68eb21a486..efcd2c9516c 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2229,3 +2229,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
item has been made available to the Space Station 13 cargo team for the cost
of a hundred supply points, as a reward for all your hard work. Good luck, and
stay safe.
+2015-01-06:
+ JJRcop, Nienhaus:
+ - rscadd: Adds emoji to OOC chat.
diff --git a/html/changelogs/JJRcop-OOCemoji.yml b/html/changelogs/JJRcop-OOCemoji.yml
deleted file mode 100644
index fa65b93fb7e..00000000000
--- a/html/changelogs/JJRcop-OOCemoji.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: JJRcop, Nienhaus
-delete-after: True
-changes:
- - rscadd: "Adds emoji to OOC chat."
\ No newline at end of file
diff --git a/icons/effects/ss13_dark_alpha6.dmi b/icons/effects/ss13_dark_alpha6.dmi
index 742337358da..44f84ec33ad 100644
Binary files a/icons/effects/ss13_dark_alpha6.dmi and b/icons/effects/ss13_dark_alpha6.dmi differ
diff --git a/icons/emoji.dmi b/icons/emoji.dmi
index a78a7e3df79..8da34d9a468 100644
Binary files a/icons/emoji.dmi and b/icons/emoji.dmi differ
diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi
index 7e161846df6..d28501b353c 100644
Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 25580035f9e..43dcda058a5 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 8c3eee2a656..af5e4e68ac5 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi
index 848647eae2d..8bc456a4787 100644
Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ
diff --git a/icons/obj/pipes/disposal.dmi b/icons/obj/pipes/disposal.dmi
index 709344a6782..086915ed3eb 100644
Binary files a/icons/obj/pipes/disposal.dmi and b/icons/obj/pipes/disposal.dmi differ
diff --git a/icons/obj/pipes/heat.dmi b/icons/obj/pipes/heat.dmi
index 4b6f4b7b741..977fde8cad9 100644
Binary files a/icons/obj/pipes/heat.dmi and b/icons/obj/pipes/heat.dmi differ
diff --git a/icons/obj/pipes/junction.dmi b/icons/obj/pipes/junction.dmi
index 88d96929eaa..0b1625f563f 100644
Binary files a/icons/obj/pipes/junction.dmi and b/icons/obj/pipes/junction.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 28b324793bc..adaa8481569 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index 738a6964f27..52b8bd9aa96 100644
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/icons/turf/space.dmi b/icons/turf/space.dmi
index 9f15fbbe63a..2bd62851550 100644
Binary files a/icons/turf/space.dmi and b/icons/turf/space.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 08500dcc1f8..379c4a1b688 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -59,7 +59,6 @@
#include "code\_globalvars\logging.dm"
#include "code\_globalvars\misc.dm"
#include "code\_globalvars\station.dm"
-#include "code\_globalvars\unused.dm"
#include "code\_globalvars\lists\flavor_misc.dm"
#include "code\_globalvars\lists\mapping.dm"
#include "code\_globalvars\lists\mobs.dm"
@@ -119,13 +118,30 @@
#include "code\controllers\_DynamicAreaLighting_TG.dm"
#include "code\controllers\configuration.dm"
#include "code\controllers\failsafe.dm"
-#include "code\controllers\garbage.dm"
-#include "code\controllers\lighting_controller.dm"
#include "code\controllers\master_controller.dm"
-#include "code\controllers\shuttle_controller.dm"
-#include "code\controllers\supply_shuttle.dm"
+#include "code\controllers\subsystems.dm"
#include "code\controllers\verbs.dm"
-#include "code\controllers\voting.dm"
+#include "code\controllers\subsystem\air.dm"
+#include "code\controllers\subsystem\bots.dm"
+#include "code\controllers\subsystem\diseases.dm"
+#include "code\controllers\subsystem\events.dm"
+#include "code\controllers\subsystem\garbage.dm"
+#include "code\controllers\subsystem\jobs.dm"
+#include "code\controllers\subsystem\lighting.dm"
+#include "code\controllers\subsystem\machines.dm"
+#include "code\controllers\subsystem\mobs.dm"
+#include "code\controllers\subsystem\nanoUI.dm"
+#include "code\controllers\subsystem\objects.dm"
+#include "code\controllers\subsystem\pipenets.dm"
+#include "code\controllers\subsystem\power.dm"
+#include "code\controllers\subsystem\radio.dm"
+#include "code\controllers\subsystem\server_maintenance.dm"
+#include "code\controllers\subsystem\shuttles.dm"
+#include "code\controllers\subsystem\sun.dm"
+#include "code\controllers\subsystem\ticker.dm"
+#include "code\controllers\subsystem\voting.dm"
+#include "code\controllers\subsystem\shuttles\emergency.dm"
+#include "code\controllers\subsystem\shuttles\supply.dm"
#include "code\datums\ai_laws.dm"
#include "code\datums\browser.dm"
#include "code\datums\computerfiles.dm"
@@ -139,7 +155,6 @@
#include "code\datums\mutations.dm"
#include "code\datums\recipe.dm"
#include "code\datums\spell.dm"
-#include "code\datums\sun.dm"
#include "code\datums\supplypacks.dm"
#include "code\datums\uplink_item.dm"
#include "code\datums\diseases\_disease.dm"
@@ -253,7 +268,6 @@
#include "code\game\gamemodes\events.dm"
#include "code\game\gamemodes\factions.dm"
#include "code\game\gamemodes\game_mode.dm"
-#include "code\game\gamemodes\gameticker.dm"
#include "code\game\gamemodes\intercept_report.dm"
#include "code\game\gamemodes\objective.dm"
#include "code\game\gamemodes\objective_items.dm"
@@ -314,12 +328,12 @@
#include "code\game\gamemodes\traitor\double_agents.dm"
#include "code\game\gamemodes\traitor\traitor.dm"
#include "code\game\gamemodes\wizard\artefact.dm"
+#include "code\game\gamemodes\wizard\raginmages.dm"
#include "code\game\gamemodes\wizard\rightandwrong.dm"
#include "code\game\gamemodes\wizard\soulstone.dm"
#include "code\game\gamemodes\wizard\spellbook.dm"
#include "code\game\gamemodes\wizard\wizard.dm"
#include "code\game\jobs\access.dm"
-#include "code\game\jobs\job_controller.dm"
#include "code\game\jobs\jobs.dm"
#include "code\game\jobs\whitelist.dm"
#include "code\game\jobs\job\assistant.dm"
@@ -754,6 +768,7 @@
#include "code\modules\admin\verbs\deadsay.dm"
#include "code\modules\admin\verbs\debug.dm"
#include "code\modules\admin\verbs\diagnostics.dm"
+#include "code\modules\admin\verbs\fps.dm"
#include "code\modules\admin\verbs\getlogs.dm"
#include "code\modules\admin\verbs\mapping.dm"
#include "code\modules\admin\verbs\massmodvar.dm"
@@ -765,7 +780,6 @@
#include "code\modules\admin\verbs\pray.dm"
#include "code\modules\admin\verbs\randomverbs.dm"
#include "code\modules\admin\verbs\reestablish_db_connection.dm"
-#include "code\modules\admin\verbs\ticklag.dm"
#include "code\modules\admin\verbs\tripAI.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm"
@@ -871,7 +885,6 @@
#include "code\modules\events\dust.dm"
#include "code\modules\events\electrical_storm.dm"
#include "code\modules\events\event.dm"
-#include "code\modules\events\event_manager.dm"
#include "code\modules\events\false_alarm.dm"
#include "code\modules\events\immovable_rod.dm"
#include "code\modules\events\ion_storm.dm"