diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index e0f33226e8c..19521d79686 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -254,7 +254,7 @@ CREATE TABLE `player` ( `UI_style_alpha` smallint(4) DEFAULT '255', `be_role` mediumtext, `default_slot` smallint(4) DEFAULT '1', - `toggles` mediumint(8) DEFAULT '383', + `toggles` int(8) DEFAULT '383', `sound` mediumint(8) DEFAULT '31', `randomslot` tinyint(1) DEFAULT '0', `volume` smallint(4) DEFAULT '100', diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index ecb28a867e4..ff4026c7d00 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -253,7 +253,7 @@ CREATE TABLE `SS13_player` ( `UI_style_alpha` smallint(4) DEFAULT '255', `be_role` mediumtext, `default_slot` smallint(4) DEFAULT '1', - `toggles` mediumint(8) DEFAULT '383', + `toggles` int(8) DEFAULT '383', `sound` mediumint(8) DEFAULT '31', `randomslot` tinyint(1) DEFAULT '0', `volume` smallint(4) DEFAULT '100', diff --git a/SQL/updates/6-7.sql b/SQL/updates/6-7.sql new file mode 100644 index 00000000000..c871302b2de --- /dev/null +++ b/SQL/updates/6-7.sql @@ -0,0 +1,2 @@ +ALTER TABLE player +MODIFY COLUMN toggles int; \ No newline at end of file diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 2107bdd7500..bed79c4f587 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -6588,8 +6588,8 @@ d2 = 2 }, /obj/machinery/power/tracker, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "alE" = ( /obj/structure/closet/secure_closet/brig, @@ -7012,8 +7012,8 @@ pixel_y = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "amp" = ( /obj/structure/chair{ @@ -7391,8 +7391,8 @@ d2 = 2 }, /obj/machinery/power/tracker, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "amV" = ( /obj/structure/sign/nosmoking_2, @@ -7544,8 +7544,8 @@ /area/security/permabrig) "ann" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "ano" = ( /obj/structure/cable{ @@ -7791,8 +7791,8 @@ pixel_y = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "anH" = ( /turf/simulated/wall/r_wall, @@ -8469,8 +8469,8 @@ icon_state = "2-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "aoL" = ( /obj/structure/cable{ @@ -8845,8 +8845,8 @@ icon_state = "1-2"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "apo" = ( /obj/structure/grille/broken, @@ -9768,8 +9768,8 @@ }, /area/lawoffice) "aqZ" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "ara" = ( /obj/structure/table/reinforced, @@ -9796,8 +9796,8 @@ /area/lawoffice) "arb" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "arc" = ( /obj/effect/spawner/window/reinforced, @@ -10307,8 +10307,8 @@ icon_state = "2-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "arM" = ( /obj/structure/cable{ @@ -10330,16 +10330,16 @@ icon_state = "2-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "arN" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "arO" = ( /obj/structure/cable{ @@ -10411,8 +10411,8 @@ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "arV" = ( /obj/structure/shuttle/engine/propulsion{ @@ -10467,8 +10467,8 @@ /turf/simulated/shuttle/floor, /area/shuttle/trade/sol) "asb" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "asc" = ( /obj/effect/spawner/random_barrier/obstruction, @@ -11025,8 +11025,8 @@ icon_state = "1-8"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "asM" = ( /obj/structure/cable{ @@ -11041,8 +11041,8 @@ icon_state = "1-8"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "asN" = ( /turf/simulated/floor/carpet, @@ -13086,8 +13086,8 @@ pixel_y = -25; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "avN" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -13434,8 +13434,8 @@ pixel_y = 1; d2 = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxport) "awl" = ( /turf/simulated/wall, @@ -13729,16 +13729,16 @@ d2 = 4; icon_state = "2-4" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "awR" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "awS" = ( /obj/item/twohanded/required/kirbyplants, @@ -14016,8 +14016,8 @@ icon_state = "1-2"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "axr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -14826,8 +14826,8 @@ icon_state = "1-2"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/auxstarboard) "ayF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -15170,8 +15170,8 @@ pixel_y = -25; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "azc" = ( /obj/effect/spawner/window/reinforced, @@ -16536,8 +16536,8 @@ pixel_y = 0; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aBy" = ( /obj/effect/landmark/damageturf, @@ -18254,8 +18254,8 @@ pixel_y = -25; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "aEN" = ( /obj/structure/closet/emcloset, @@ -58234,6 +58234,9 @@ d2 = 4; icon_state = "0-4" }, +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, /turf/simulated/floor/plasteel, /area/quartermaster/miningdock) "cbI" = ( @@ -60241,6 +60244,9 @@ /area/quartermaster/miningdock) "cfc" = ( /obj/machinery/hologram/holopad, +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, /turf/simulated/floor/plasteel, /area/quartermaster/miningdock) "cfd" = ( @@ -63467,6 +63473,9 @@ pixel_x = 24 }, /obj/structure/disposalpipe/segment, +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, /turf/simulated/floor/plasteel, /area/quartermaster/miningdock) "ckp" = ( @@ -66610,8 +66619,8 @@ icon_state = "2-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cpA" = ( /obj/effect/decal/warning_stripes/southwestcorner, @@ -72259,8 +72268,8 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint) "cyO" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cyP" = ( /obj/effect/spawner/random_barrier/obstruction, @@ -79926,8 +79935,8 @@ icon_state = "1-2"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cMC" = ( /obj/effect/landmark{ @@ -80473,8 +80482,8 @@ dir = 10; level = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cNF" = ( /obj/structure/cable{ @@ -81479,13 +81488,13 @@ /area/assembly/assembly_line) "cPw" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cPx" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cPy" = ( /obj/structure/table/reinforced, @@ -81532,8 +81541,8 @@ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cPD" = ( /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ @@ -81578,24 +81587,24 @@ icon_state = "4-8"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cPH" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cPI" = ( /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cPJ" = ( /obj/structure/table, @@ -81778,8 +81787,8 @@ icon_state = "4-8"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cQb" = ( /obj/machinery/particle_accelerator/control_box, @@ -81913,8 +81922,8 @@ icon_state = "0-2"; d2 = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cQr" = ( /obj/structure/disposalpipe/segment{ @@ -82427,8 +82436,8 @@ icon_state = "1-2"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cRf" = ( /obj/machinery/door/poddoor{ @@ -83122,8 +83131,8 @@ icon_state = "1-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/port) "cSl" = ( /obj/machinery/atmospherics/unary/vent_pump/on, @@ -84097,8 +84106,8 @@ pixel_y = 8; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cTS" = ( /obj/effect/landmark/burnturf, @@ -84143,8 +84152,8 @@ /turf/simulated/floor/plasteel, /area/maintenance/turbine) "cTW" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "cTX" = ( /obj/structure/cable{ @@ -86754,8 +86763,8 @@ pixel_x = -25; pixel_y = -8 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "cYA" = ( /obj/structure/cable{ @@ -89325,8 +89334,8 @@ pixel_y = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddB" = ( /obj/structure/disposalpipe/segment{ @@ -89339,13 +89348,13 @@ /obj/structure/transit_tube{ icon_state = "E-W-Pass" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space) "ddD" = ( /obj/item/wrench, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "ddE" = ( /obj/structure/cable{ @@ -89355,8 +89364,8 @@ pixel_y = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddF" = ( /obj/structure/sign/biohazard{ @@ -89418,21 +89427,21 @@ pixel_y = 25; req_access_txt = "75;13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "ddN" = ( /obj/structure/cable, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddO" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 6; level = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "ddP" = ( /obj/structure/cable{ @@ -89447,8 +89456,8 @@ icon_state = "1-4"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddQ" = ( /obj/structure/cable{ @@ -89470,16 +89479,16 @@ pixel_x = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddR" = ( /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddS" = ( /obj/structure/particle_accelerator/fuel_chamber, @@ -89490,8 +89499,8 @@ icon_state = "0-4"; d2 = 4 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddU" = ( /obj/structure/cable{ @@ -89513,8 +89522,8 @@ pixel_x = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddV" = ( /obj/structure/cable{ @@ -89529,8 +89538,8 @@ icon_state = "2-8"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "ddW" = ( /obj/structure/shuttle/engine/propulsion/burst{ @@ -89553,8 +89562,8 @@ pixel_y = 25; req_access_txt = "13" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "ddY" = ( /obj/structure/shuttle/engine/propulsion/burst{ @@ -89599,8 +89608,8 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "dec" = ( /obj/machinery/atmospherics/pipe/manifold/visible, @@ -89611,8 +89620,8 @@ icon_state = "0-2"; d2 = 2 }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "dee" = ( /obj/structure/cable{ @@ -89622,8 +89631,8 @@ pixel_x = 0; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "def" = ( /obj/structure/cable{ @@ -89644,14 +89653,14 @@ icon_state = "1-2"; tag = "" }, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "deg" = ( /obj/structure/cable, /obj/machinery/power/tracker, -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/solar/starboard) "deh" = ( /obj/machinery/space_heater, @@ -93815,8 +93824,8 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint2) "dmo" = ( -/turf/space, /obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "dmp" = ( /obj/structure/table, @@ -95140,10 +95149,6 @@ /obj/item/crowbar, /turf/simulated/floor/wood, /area/crew_quarters/captain) -"doE" = ( -/turf/space, -/obj/structure/lattice/catwalk, -/area/space/nearstation) "doF" = ( /turf/simulated/floor/plating, /area/toxins/launch{ @@ -96595,6 +96600,15 @@ icon_state = "floor4" }, /area/shuttle/administration) +"qnV" = ( +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "brown" + }, +/area/quartermaster/miningdock) "qUv" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging, /turf/space, @@ -118177,7 +118191,7 @@ cam cgH cit ckn -ckn +qnV cnm cam cgQ @@ -118432,7 +118446,7 @@ cam cam cam cgG -cfb +cir cfb cnG cnl @@ -142392,7 +142406,7 @@ dnR dnS dnX dom -doE +dmo aab aaa aaa @@ -142649,7 +142663,7 @@ bZZ bZZ bZZ bZZ -doE +dmo aab aaa aaa @@ -149048,7 +149062,7 @@ aaa aab aaa aaa -doE +dmo aab aaa aaa @@ -149305,7 +149319,7 @@ aaa aab aaa aaa -doE +dmo aab aaa aaa @@ -149813,7 +149827,7 @@ aaa aaa aaa aaa -doE +dmo aaa aaa aaa @@ -150070,7 +150084,7 @@ aaa aaa aaa aaa -doE +dmo aaa aaa aaa @@ -150327,7 +150341,7 @@ aaa aaa aaa aaa -doE +dmo aaa aaa aaa @@ -150584,7 +150598,7 @@ aaa aaa aaa aaa -doE +dmo aaa aaa aaa @@ -150841,7 +150855,7 @@ aaa aaa aaa aaa -doE +dmo aaa aaa aaa @@ -151098,7 +151112,7 @@ aaa aaa aaa aaa -doE +dmo aaa aaa aaa diff --git a/_maps/map_files/generic/Lavaland.dmm b/_maps/map_files/generic/Lavaland.dmm index 3bfdb1d12b2..142bbcff5f7 100644 --- a/_maps/map_files/generic/Lavaland.dmm +++ b/_maps/map_files/generic/Lavaland.dmm @@ -200,7 +200,8 @@ dir = 1; pixel_y = -24 }, -/turf/simulated/floor/mech_bay_recharge_floor, +/obj/machinery/suit_storage_unit/lavaland, +/turf/simulated/floor/plasteel, /area/mine/eva) "aJ" = ( /obj/machinery/light/small{ @@ -436,12 +437,6 @@ /turf/simulated/floor/plasteel/freezer, /area/mine/living_quarters) "bp" = ( -/obj/structure/table, -/obj/item/pickaxe, -/obj/item/gps/mining, -/obj/item/gps/mining, -/obj/item/gps/mining, -/obj/item/gps/mining, /obj/effect/turf_decal/tile/purple{ dir = 1 }, @@ -451,6 +446,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/suit_storage_unit/lavaland, /turf/simulated/floor/plasteel, /area/mine/eva) "bq" = ( @@ -594,11 +590,6 @@ /obj/machinery/light{ dir = 8 }, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, /obj/effect/turf_decal/tile/brown{ dir = 8 }, @@ -611,7 +602,19 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/machinery/suit_storage_unit/lavaland, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, /turf/simulated/floor/plasteel, /area/mine/eva) "bF" = ( @@ -758,9 +761,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/cable{ - icon_state = "2-8" - }, /turf/simulated/floor/plasteel, /area/mine/eva) "bV" = ( @@ -943,16 +943,15 @@ pixel_y = -23 }, /obj/structure/cable, -/obj/machinery/recharge_station, /obj/effect/turf_decal/tile/purple{ dir = 1 }, +/obj/machinery/suit_storage_unit/lavaland, /turf/simulated/floor/plasteel, /area/mine/eva) "cp" = ( -/obj/machinery/mech_bay_recharge_port, -/obj/structure/cable, -/turf/simulated/floor/plating, +/obj/machinery/suit_storage_unit/lavaland, +/turf/simulated/floor/plasteel, /area/mine/eva) "cq" = ( /obj/effect/turf_decal/tile/brown{ @@ -977,9 +976,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -1854,13 +1850,10 @@ /turf/simulated/wall, /area/mine/production) "eo" = ( -/obj/machinery/computer/mech_bay_power_console{ - icon_state = "computer"; - dir = 1 - }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/suit_storage_unit/lavaland, /turf/simulated/floor/plasteel, /area/mine/eva) "ep" = ( @@ -2023,6 +2016,9 @@ /obj/structure/cable{ icon_state = "1-8" }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/simulated/floor/plasteel, /area/mine/production) "eD" = ( @@ -2100,6 +2096,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/structure/ore_box, /turf/simulated/floor/plasteel, /area/mine/production) "eK" = ( @@ -2148,6 +2145,9 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/simulated/floor/plasteel, /area/mine/production) "eQ" = ( @@ -2237,13 +2237,11 @@ dir = 1; pixel_y = -22 }, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, /obj/effect/turf_decal/tile/purple{ dir = 8 }, /obj/effect/turf_decal/tile/purple, +/obj/machinery/recharge_station, /turf/simulated/floor/plasteel, /area/mine/production) "fc" = ( @@ -2253,9 +2251,6 @@ /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fd" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, /obj/machinery/light, /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -2263,6 +2258,8 @@ /obj/effect/turf_decal/tile/brown{ dir = 2 }, +/obj/machinery/mech_bay_recharge_port, +/obj/structure/cable, /turf/simulated/floor/plasteel, /area/mine/production) "fe" = ( @@ -2290,12 +2287,7 @@ /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fh" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/mech_bay_recharge_floor, /area/mine/production) "fi" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -2304,15 +2296,16 @@ /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fj" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, /obj/effect/turf_decal/tile/brown{ dir = 8 }, /obj/effect/turf_decal/tile/brown{ dir = 2 }, +/obj/machinery/computer/mech_bay_power_console{ + icon_state = "computer"; + dir = 1 + }, /turf/simulated/floor/plasteel, /area/mine/production) "fk" = ( @@ -2500,7 +2493,6 @@ /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fE" = ( -/obj/structure/ore_box, /obj/effect/turf_decal/tile/purple{ dir = 8 }, @@ -2579,7 +2571,6 @@ /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fL" = ( -/obj/structure/ore_box, /obj/effect/turf_decal/tile/brown{ dir = 8 }, @@ -2589,14 +2580,15 @@ /obj/effect/turf_decal/tile/brown{ dir = 2 }, +/obj/structure/closet/secure_closet/miner, /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fM" = ( -/obj/machinery/recharge_station, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/structure/closet/secure_closet/miner, /turf/simulated/floor/plasteel, /area/mine/living_quarters) "fN" = ( @@ -4090,6 +4082,10 @@ }, /turf/simulated/floor/plasteel/freezer, /area/mine/living_quarters) +"tK" = ( +/obj/structure/ore_box, +/turf/simulated/floor/plasteel, +/area/mine/production) "vq" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/plasteel, @@ -20710,7 +20706,7 @@ dL ej eG ct -eW +tK bN ab ab diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index a6b346ee1c2..d81ea35e1e9 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -248,7 +248,8 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) // Ventcrawling #define VENT_SOUND_DELAY 30 /obj/machinery/atmospherics/relaymove(mob/living/user, direction) - if(!(direction & initialize_directions)) //can't go in a way we aren't connecting to + direction &= initialize_directions + if(!direction || !(direction in cardinal)) //cant go this way. return if(buckled_mob == user) diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm new file mode 100644 index 00000000000..e28708a81e6 --- /dev/null +++ b/code/__DEFINES/colors.dm @@ -0,0 +1,54 @@ + +#define COLOR_INPUT_DISABLED "#F0F0F0" +#define COLOR_INPUT_ENABLED "#D3B5B5" +#define COLOR_WHITE "#EEEEEE" +#define COLOR_SILVER "#C0C0C0" +#define COLOR_GRAY "#808080" +#define COLOR_FLOORTILE_GRAY "#8D8B8B" +#define COLOR_ALMOST_BLACK "#333333" +#define COLOR_BLACK "#000000" +#define COLOR_RED "#FF0000" +#define COLOR_RED_LIGHT "#FF3333" +#define COLOR_MAROON "#800000" +#define COLOR_YELLOW "#FFFF00" +#define COLOR_OLIVE "#808000" +#define COLOR_LIME "#32CD32" +#define COLOR_GREEN "#008000" +#define COLOR_CYAN "#00FFFF" +#define COLOR_TEAL "#008080" +#define COLOR_BLUE "#0000FF" +#define COLOR_BLUE_LIGHT "#33CCFF" +#define COLOR_NAVY "#000080" +#define COLOR_PINK "#FFC0CB" +#define COLOR_MAGENTA "#FF00FF" +#define COLOR_PURPLE "#800080" +#define COLOR_ORANGE "#FF9900" +#define COLOR_BEIGE "#CEB689" +#define COLOR_BLUE_GRAY "#75A2BB" +#define COLOR_BROWN "#BA9F6D" +#define COLOR_DARK_BROWN "#997C4F" +#define COLOR_DARK_ORANGE "#C3630C" +#define COLOR_GREEN_GRAY "#99BB76" +#define COLOR_RED_GRAY "#B4696A" +#define COLOR_PALE_BLUE_GRAY "#98C5DF" +#define COLOR_PALE_GREEN_GRAY "#B7D993" +#define COLOR_PALE_RED_GRAY "#D59998" +#define COLOR_PALE_PURPLE_GRAY "#CBB1CA" +#define COLOR_PURPLE_GRAY "#AE8CA8" + +//Color defines used by the assembly detailer. +#define COLOR_ASSEMBLY_BLACK "#545454" +#define COLOR_ASSEMBLY_BGRAY "#9497AB" +#define COLOR_ASSEMBLY_WHITE "#E2E2E2" +#define COLOR_ASSEMBLY_RED "#CC4242" +#define COLOR_ASSEMBLY_ORANGE "#E39751" +#define COLOR_ASSEMBLY_BEIGE "#AF9366" +#define COLOR_ASSEMBLY_BROWN "#97670E" +#define COLOR_ASSEMBLY_GOLD "#AA9100" +#define COLOR_ASSEMBLY_YELLOW "#CECA2B" +#define COLOR_ASSEMBLY_GURKHA "#999875" +#define COLOR_ASSEMBLY_LGREEN "#789876" +#define COLOR_ASSEMBLY_GREEN "#44843C" +#define COLOR_ASSEMBLY_LBLUE "#5D99BE" +#define COLOR_ASSEMBLY_BLUE "#38559E" +#define COLOR_ASSEMBLY_PURPLE "#6F6192" diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index a8c6b4bd5e8..fbc28695ebf 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -70,6 +70,10 @@ #define ATTACK_EFFECT_MECHFIRE "mech_fire" #define ATTACK_EFFECT_MECHTOXIN "mech_toxin" #define ATTACK_EFFECT_BOOP "boop" //Honk +//NOTE: INTENT_HOTKEY_* defines are not actual intents! +//they are here to support hotkeys +#define INTENT_HOTKEY_LEFT "left" +#define INTENT_HOTKEY_RIGHT "right" //Embedded objects #define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user) @@ -82,6 +86,22 @@ #define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class) #define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class) +// Body Parts +#define BODY_ZONE_HEAD "head" +#define BODY_ZONE_CHEST "chest" +#define BODY_ZONE_L_ARM "l_arm" +#define BODY_ZONE_R_ARM "r_arm" +#define BODY_ZONE_L_LEG "l_leg" +#define BODY_ZONE_R_LEG "r_leg" + +#define BODY_ZONE_PRECISE_EYES "eyes" +#define BODY_ZONE_PRECISE_MOUTH "mouth" +#define BODY_ZONE_PRECISE_GROIN "groin" +#define BODY_ZONE_PRECISE_L_HAND "l_hand" +#define BODY_ZONE_PRECISE_R_HAND "r_hand" +#define BODY_ZONE_PRECISE_L_FOOT "l_foot" +#define BODY_ZONE_PRECISE_R_FOOT "r_foot" + //Gun Stuff #define SAWN_INTACT 0 #define SAWN_OFF 1 diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index f82fc271fbd..14b712754fb 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -1,6 +1,9 @@ #define ALL ~0 //For convenience. #define NONE 0 +// for /datum/var/datum_flags +#define DF_USE_TAG (1<<0) + //FLAGS BITMASK #define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere To successfully stop you taking all pressure damage you must have both a suit and head item with this flag. #define NODROP 2 // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted. diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 319e9beaa1d..1263ca0fd85 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -57,17 +57,6 @@ #define MAX_STACK_AMOUNT_GLASS 50 #define MAX_STACK_AMOUNT_RODS 60 -//some colors -#define COLOR_RED "#FF0000" -#define COLOR_GREEN "#00FF00" -#define COLOR_BLUE "#0000FF" -#define COLOR_CYAN "#00FFFF" -#define COLOR_PINK "#FF00FF" -#define COLOR_YELLOW "#FFFF00" -#define COLOR_ORANGE "#FF9900" -#define COLOR_WHITE "#FFFFFF" -#define COLOR_GRAY "#808080" - //FONTS: // Used by Paper and PhotoCopier (and PaperBin once a year). // Used by PDA's Notekeeper. @@ -326,7 +315,7 @@ #define INVESTIGATE_BOMB "bombs" // The SQL version required by this version of the code -#define SQL_VERSION 6 +#define SQL_VERSION 7 // Vending machine stuff #define CAT_NORMAL 1 diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index dbd29b1d4d1..9582fddccfe 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -16,6 +16,7 @@ #define CHAT_GHOSTSIGHT 8 #define CHAT_PRAYER 16 #define CHAT_RADIO 32 +#define AZERTY 64 #define CHAT_DEBUGLOGS 128 #define CHAT_LOOC 256 #define CHAT_GHOSTRADIO 512 @@ -32,10 +33,11 @@ #define TYPING_ONCE 1048576 #define AMBIENT_OCCLUSION 2097152 #define CHAT_GHOSTPDA 4194304 +#define NUMPAD_TARGET 8388608 +#define TOGGLES_TOTAL 16777215 // If you add or remove a preference toggle above, make sure you update this define with the total value of the toggles combined. -#define TOGGLES_TOTAL 8388607 // If you add or remove a preference toggle above, make sure you update this define with the total value of the toggles combined. -#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_LOOC|MEMBER_PUBLIC|DONATOR_PUBLIC|AMBIENT_OCCLUSION|CHAT_GHOSTPDA) +#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_LOOC|MEMBER_PUBLIC|DONATOR_PUBLIC|AMBIENT_OCCLUSION|CHAT_GHOSTPDA|NUMPAD_TARGET) // Admin attack logs filter system, see /proc/add_attack_logs and /proc/msg_admin_attack #define ATKLOG_ALL 0 diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index 607ba3495d3..d419e925759 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -43,7 +43,7 @@ . = "e[.]" //like clients, which do have gender. -/client/proc/p_they(capitalized, temp_gender) +/client/p_they(capitalized, temp_gender) if(!temp_gender) temp_gender = gender . = "they" @@ -55,7 +55,7 @@ if(capitalized) . = capitalize(.) -/client/proc/p_their(capitalized, temp_gender) +/client/p_their(capitalized, temp_gender) if(!temp_gender) temp_gender = gender . = "their" @@ -67,7 +67,7 @@ if(capitalized) . = capitalize(.) -/client/proc/p_them(capitalized, temp_gender) +/client/p_them(capitalized, temp_gender) if(!temp_gender) temp_gender = gender . = "them" @@ -79,35 +79,35 @@ if(capitalized) . = capitalize(.) -/client/proc/p_have(temp_gender) +/client/p_have(temp_gender) if(!temp_gender) temp_gender = gender . = "has" if(temp_gender == PLURAL || temp_gender == NEUTER) . = "have" -/client/proc/p_are(temp_gender) +/client/p_are(temp_gender) if(!temp_gender) temp_gender = gender . = "is" if(temp_gender == PLURAL || temp_gender == NEUTER) . = "are" -/client/proc/p_were(temp_gender) +/client/p_were(temp_gender) if(!temp_gender) temp_gender = gender . = "was" if(temp_gender == PLURAL || temp_gender == NEUTER) . = "were" -/client/proc/p_do(temp_gender) +/client/p_do(temp_gender) if(!temp_gender) temp_gender = gender . = "does" if(temp_gender == PLURAL || temp_gender == NEUTER) . = "do" -/client/proc/p_s(temp_gender) +/client/p_s(temp_gender) if(!temp_gender) temp_gender = gender if(temp_gender != PLURAL && temp_gender != NEUTER) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index f90a9c4e5ad..ae7704459b5 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -157,6 +157,17 @@ if(degree < 315) return WEST return NORTH|WEST +/proc/angle2dir_cardinal(angle) + switch(round(angle, 0.1)) + if(315.5 to 360, 0 to 45.5) + return NORTH + if(45.6 to 135.5) + return EAST + if(135.6 to 225.5) + return SOUTH + if(225.6 to 315.5) + return WEST + //returns the north-zero clockwise angle in degrees, given a direction /proc/dir2angle(var/D) diff --git a/code/__HELPERS/unique_ids.dm b/code/__HELPERS/unique_ids.dm index 1e9c699dcb9..a66de0b5a88 100644 --- a/code/__HELPERS/unique_ids.dm +++ b/code/__HELPERS/unique_ids.dm @@ -16,7 +16,7 @@ var/global/next_unique_datum_id = 1 -/client/var/tmp/unique_datum_id = null +// /client/var/tmp/unique_datum_id = null /datum/proc/UID() if(!unique_datum_id) @@ -26,12 +26,6 @@ var/global/next_unique_datum_id = 1 tag = tag_backup return unique_datum_id -/client/proc/UID() - if(!unique_datum_id) - unique_datum_id = "\ref[src]_[next_unique_datum_id++]" - return unique_datum_id - - /proc/locateUID(uid) if(!istext(uid)) return null diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index f7c5b670dc8..10759fe336a 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1,2065 +1,2065 @@ -/* - * A large number of misc global procs. - */ - - /* Get the direction of startObj relative to endObj. - * Return values: To the right, 1. Below, 2. To the left, 3. Above, 4. Not found adjacent in cardinal directions, 0. - */ -/proc/getRelativeDirection(var/atom/movable/startObj, var/atom/movable/endObj) - if(endObj.x == startObj.x + 1 && endObj.y == startObj.y) - return EAST - - if(endObj.x == startObj.x - 1 && endObj.y == startObj.y) - return WEST - - if(endObj.y == startObj.y + 1 && endObj.x == startObj.x) - return NORTH - - if(endObj.y == startObj.y - 1 && endObj.x == startObj.x) - return SOUTH - - return 0 - -//Inverts the colour of an HTML string -/proc/invertHTML(HTMLstring) - - if(!( istext(HTMLstring) )) - CRASH("Given non-text argument!") - return - else - if(length(HTMLstring) != 7) - CRASH("Given non-HTML argument!") - return - var/textr = copytext(HTMLstring, 2, 4) - var/textg = copytext(HTMLstring, 4, 6) - var/textb = copytext(HTMLstring, 6, 8) - var/r = hex2num(textr) - var/g = hex2num(textg) - var/b = hex2num(textb) - textr = num2hex(255 - r) - textg = num2hex(255 - g) - textb = num2hex(255 - b) - if(length(textr) < 2) - textr = text("0[]", textr) - if(length(textg) < 2) - textr = text("0[]", textg) - if(length(textb) < 2) - textr = text("0[]", textb) - return text("#[][][]", textr, textg, textb) - return - -//Returns the middle-most value -/proc/dd_range(var/low, var/high, var/num) - return max(low,min(high,num)) - -//Returns whether or not A is the middle most value -/proc/InRange(var/A, var/lower, var/upper) - if(A < lower) return 0 - if(A > upper) return 0 - return 1 - - -/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. - if(!start || !end) return 0 - var/dy - var/dx - dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) - dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x) - if(!dy) - return (dx>=0)?90:270 - .=arctan(dx/dy) - if(dy<0) - .+=180 - else if(dx<0) - .+=360 - -//Returns location. Returns null if no location was found. -/proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = 0, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) -/* -Location where the teleport begins, target that will teleport, distance to go, density checking 0/1(yes/no). -Random error in tile placement x, error in tile placement y, and block offset. -Block offset tells the proc how to place the box. Behind teleport location, relative to starting location, forward, etc. -Negative values for offset are accepted, think of it in relation to North, -x is west, -y is south. Error defaults to positive. -Turf and target are seperate in case you want to teleport some distance from a turf the target is not standing on or something. -*/ - - var/dirx = 0//Generic location finding variable. - var/diry = 0 - - var/xoffset = 0//Generic counter for offset location. - var/yoffset = 0 - - var/b1xerror = 0//Generic placing for point A in box. The lower left. - var/b1yerror = 0 - var/b2xerror = 0//Generic placing for point B in box. The upper right. - var/b2yerror = 0 - - errorx = abs(errorx)//Error should never be negative. - errory = abs(errory) - //var/errorxy = round((errorx+errory)/2)//Used for diagonal boxes. - - switch(target.dir)//This can be done through equations but switch is the simpler method. And works fast to boot. - //Directs on what values need modifying. - if(1)//North - diry+=distance - yoffset+=eoffsety - xoffset+=eoffsetx - b1xerror-=errorx - b1yerror-=errory - b2xerror+=errorx - b2yerror+=errory - if(2)//South - diry-=distance - yoffset-=eoffsety - xoffset+=eoffsetx - b1xerror-=errorx - b1yerror-=errory - b2xerror+=errorx - b2yerror+=errory - if(4)//East - dirx+=distance - yoffset+=eoffsetx//Flipped. - xoffset+=eoffsety - b1xerror-=errory//Flipped. - b1yerror-=errorx - b2xerror+=errory - b2yerror+=errorx - if(8)//West - dirx-=distance - yoffset-=eoffsetx//Flipped. - xoffset+=eoffsety - b1xerror-=errory//Flipped. - b1yerror-=errorx - b2xerror+=errory - b2yerror+=errorx - - var/turf/destination=locate(location.x+dirx,location.y+diry,location.z) - - if(destination)//If there is a destination. - if(errorx||errory)//If errorx or y were specified. - var/destination_list[] = list()//To add turfs to list. - //destination_list = new() - /*This will draw a block around the target turf, given what the error is. - Specifying the values above will basically draw a different sort of block. - If the values are the same, it will be a square. If they are different, it will be a rectengle. - In either case, it will center based on offset. Offset is position from center. - Offset always calculates in relation to direction faced. In other words, depending on the direction of the teleport, - the offset should remain positioned in relation to destination.*/ - - var/turf/center = locate((destination.x+xoffset),(destination.y+yoffset),location.z)//So now, find the new center. - - //Now to find a box from center location and make that our destination. - for(var/turf/T in block(locate(center.x+b1xerror,center.y+b1yerror,location.z), locate(center.x+b2xerror,center.y+b2yerror,location.z) )) - if(density&&T.density) continue//If density was specified. - if(T.x>world.maxx || T.x<1) continue//Don't want them to teleport off the map. - if(T.y>world.maxy || T.y<1) continue - destination_list += T - if(destination_list.len) - destination = pick(destination_list) - else return - - else//Same deal here. - if(density&&destination.density) return - if(destination.x>world.maxx || destination.x<1) return - if(destination.y>world.maxy || destination.y<1) return - else return - - return destination - -// Returns true if direction is blocked from loc -// Checks if doors are open -/proc/DirBlocked(turf/loc,var/dir) - for(var/obj/structure/window/D in loc) - if(!D.density) - continue - if(D.fulltile) - return 1 - if(D.dir == dir) - return 1 - - for(var/obj/machinery/door/D in loc) - if(!D.density)//if the door is open - continue - else return 1 // if closed, it's a real, air blocking door - return 0 - -///////////////////////////////////////////////////////////////////////// - -/proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm - var/px=M.x //starting x - var/py=M.y - var/line[] = list(locate(px,py,M.z)) - var/dx=N.x-px //x distance - var/dy=N.y-py - var/dxabs=abs(dx)//Absolute value of x distance - var/dyabs=abs(dy) - var/sdx=SIGN(dx) //Sign of x distance (+ or -) - var/sdy=SIGN(dy) - var/x=dxabs>>1 //Counters for steps taken, setting to distance/2 - var/y=dyabs>>1 //Bit-shifting makes me l33t. It also makes getline() unnessecarrily fast. - var/j //Generic integer for counting - if(dxabs>=dyabs) //x distance is greater than y - for(j=0;j=dxabs) //Every dyabs steps, step once in y direction - y-=dxabs - py+=sdy - px+=sdx //Step on in x direction - line+=locate(px,py,M.z)//Add the turf to the list - else - for(j=0;j=dyabs) - x-=dyabs - px+=sdx - py+=sdy - line+=locate(px,py,M.z) - return line - -//Same as the thing below just for density and without support for atoms. -/proc/can_line(atom/source, atom/target, length = 5) - var/turf/current = get_turf(source) - var/turf/target_turf = get_turf(target) - var/steps = 0 - - while(current != target_turf) - if(steps > length) - return FALSE - if(!current) - return FALSE - if(current.density) - return FALSE - current = get_step_towards(current, target_turf) - steps++ - return TRUE - -//Returns whether or not a player is a guest using their ckey as an input -/proc/IsGuestKey(key) - if(findtext(key, "Guest-", 1, 7) != 1) //was findtextEx - return 0 - - var/i, ch, len = length(key) - - for(i = 7, i <= len, ++i) - ch = text2ascii(key, i) - if(ch < 48 || ch > 57) - return 0 - return 1 - -//Ensure the frequency is within bounds of what it should be sending/recieving at -/proc/sanitize_frequency(var/f, var/low = PUBLIC_LOW_FREQ, var/high = PUBLIC_HIGH_FREQ) - f = round(f) - f = max(low, f) - f = min(high, f) - if((f % 2) == 0) //Ensure the last digit is an odd number - f += 1 - return f - -//Turns 1479 into 147.9 -/proc/format_frequency(var/f) - return "[round(f / 10)].[f % 10]" - -/obj/proc/atmosanalyzer_scan(var/datum/gas_mixture/air_contents, mob/user, var/obj/target = src) - var/obj/icon = target - user.visible_message("[user] has used the analyzer on [target].", "You use the analyzer on [target].") - var/pressure = air_contents.return_pressure() - var/total_moles = air_contents.total_moles() - - user.show_message("Results of analysis of [bicon(icon)] [target].", 1) - if(total_moles>0) - var/o2_concentration = air_contents.oxygen/total_moles - var/n2_concentration = air_contents.nitrogen/total_moles - var/co2_concentration = air_contents.carbon_dioxide/total_moles - var/plasma_concentration = air_contents.toxins/total_moles - - var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration) - - user.show_message("Pressure: [round(pressure,0.1)] kPa", 1) - user.show_message("Nitrogen: [round(n2_concentration*100)] % ([round(air_contents.nitrogen,0.01)] moles)", 1) - user.show_message("Oxygen: [round(o2_concentration*100)] % ([round(air_contents.oxygen,0.01)] moles)", 1) - user.show_message("CO2: [round(co2_concentration*100)] % ([round(air_contents.carbon_dioxide,0.01)] moles)", 1) - user.show_message("Plasma: [round(plasma_concentration*100)] % ([round(air_contents.toxins,0.01)] moles)", 1) - if(unknown_concentration>0.01) - user.show_message("Unknown: [round(unknown_concentration*100)] % ([round(unknown_concentration*total_moles,0.01)] moles)", 1) - user.show_message("Total: [round(total_moles,0.01)] moles", 1) - user.show_message("Temperature: [round(air_contents.temperature-T0C)] °C", 1) - else - user.show_message("[target] is empty!", 1) - return - -//Picks a string of symbols to display as the law number for hacked or ion laws -/proc/ionnum() - return "[pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]" - -//When an AI is activated, it can choose from a list of non-slaved borgs to have as a slave. -/proc/freeborg() - var/select = null - var/list/borgs = list() - for(var/mob/living/silicon/robot/A in GLOB.player_list) - if(A.stat == 2 || A.connected_ai || A.scrambledcodes || istype(A,/mob/living/silicon/robot/drone)) - continue - var/name = "[A.real_name] ([A.modtype] [A.braintype])" - borgs[name] = A - - if(borgs.len) - select = input("Unshackled borg signals detected:", "Borg selection", null, null) as null|anything in borgs - return borgs[select] - -//When a borg is activated, it can choose which AI it wants to be slaved to -/proc/active_ais() - . = list() - for(var/mob/living/silicon/ai/A in GLOB.living_mob_list) - if(A.stat == DEAD) - continue - if(A.control_disabled == 1) - continue - . += A - return . - -//Find an active ai with the least borgs. VERBOSE PROCNAME HUH! -/proc/select_active_ai_with_fewest_borgs() - var/mob/living/silicon/ai/selected - var/list/active = active_ais() - for(var/mob/living/silicon/ai/A in active) - if(!selected || (selected.connected_robots > A.connected_robots)) - selected = A - - return selected - -/proc/select_active_ai(var/mob/user) - var/list/ais = active_ais() - if(ais.len) - if(user) . = input(usr,"AI signals detected:", "AI selection") in ais - else . = pick(ais) - return . - -/proc/get_sorted_mobs() - var/list/old_list = getmobs() - var/list/AI_list = list() - var/list/Dead_list = list() - var/list/keyclient_list = list() - var/list/key_list = list() - var/list/logged_list = list() - for(var/named in old_list) - var/mob/M = old_list[named] - if(issilicon(M)) - AI_list |= M - else if(isobserver(M) || M.stat == DEAD) - Dead_list |= M - else if(M.key && M.client) - keyclient_list |= M - else if(M.key) - key_list |= M - else - logged_list |= M - old_list.Remove(named) - var/list/new_list = list() - new_list += AI_list - new_list += keyclient_list - new_list += key_list - new_list += logged_list - new_list += Dead_list - return new_list - -//Returns a list of all mobs with their name -/proc/getmobs() - - var/list/mobs = sortmobs() - var/list/names = list() - var/list/creatures = list() - var/list/namecounts = list() - for(var/mob/M in mobs) - var/name = M.name - if(name in names) - namecounts[name]++ - name = "[name] ([namecounts[name]])" - else - names.Add(name) - namecounts[name] = 1 - if(M.real_name && M.real_name != M.name) - name += " \[[M.real_name]\]" - if(M.stat == DEAD) - if(istype(M, /mob/dead/observer/)) - name += " \[ghost\]" - else - name += " \[dead\]" - creatures[name] = M - - return creatures - -//Orders mobs by type then by name -/proc/sortmobs() - var/list/moblist = list() - var/list/sortmob = sortAtom(GLOB.mob_list) - for(var/mob/living/silicon/ai/M in sortmob) - moblist.Add(M) - if(M.eyeobj) - moblist.Add(M.eyeobj) - for(var/mob/living/silicon/pai/M in sortmob) - moblist.Add(M) - for(var/mob/living/silicon/robot/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/human/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/brain/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/alien/M in sortmob) - moblist.Add(M) - for(var/mob/dead/observer/M in sortmob) - moblist.Add(M) - for(var/mob/new_player/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/slime/M in sortmob) - moblist.Add(M) - for(var/mob/living/simple_animal/M in sortmob) - moblist.Add(M) - return moblist - -// Format a power value in W, kW, MW, or GW. -/proc/DisplayPower(powerused) - if(powerused < 1000) //Less than a kW - return "[powerused] W" - else if(powerused < 1000000) //Less than a MW - return "[round((powerused * 0.001), 0.01)] kW" - else if(powerused < 1000000000) //Less than a GW - return "[round((powerused * 0.000001), 0.001)] MW" - return "[round((powerused * 0.000000001), 0.0001)] GW" - -//E = MC^2 -/proc/convert2energy(var/M) - var/E = M*(SPEED_OF_LIGHT_SQ) - return E - -//M = E/C^2 -/proc/convert2mass(var/E) - var/M = E/(SPEED_OF_LIGHT_SQ) - return M - -//Forces a variable to be posative -/proc/modulus(var/M) - if(M >= 0) - return M - if(M < 0) - return -M - -/proc/get_mob_by_ckey(key) - if(!key) - return - for(var/mob/M in GLOB.mob_list) - if(M.ckey == key) - return M - -// Returns the atom sitting on the turf. -// For example, using this on a disk, which is in a bag, on a mob, will return the mob because it's on the turf. -/proc/get_atom_on_turf(var/atom/movable/M) - var/atom/loc = M - while(loc && loc.loc && !istype(loc.loc, /turf/)) - loc = loc.loc - return loc - -/* -Returns 1 if the chain up to the area contains the given typepath -0 otherwise -*/ -/atom/proc/is_found_within(var/typepath) - var/atom/A = src - while(A.loc) - if(istype(A.loc, typepath)) - return 1 - A = A.loc - return 0 - -// the on-close client verb -// called when a browser popup window is closed after registering with proc/onclose() -// if a valid atom reference is supplied, call the atom's Topic() with "close=1" -// otherwise, just reset the client mob's machine var. - - -// returns the turf located at the map edge in the specified direction relative to A -// used for mass driver -/proc/get_edge_target_turf(var/atom/A, var/direction) - - var/turf/target = locate(A.x, A.y, A.z) - if(!A || !target) - return 0 - //since NORTHEAST == NORTH & EAST, etc, doing it this way allows for diagonal mass drivers in the future - //and isn't really any more complicated - - // Note diagonal directions won't usually be accurate - if(direction & NORTH) - target = locate(target.x, world.maxy, target.z) - if(direction & SOUTH) - target = locate(target.x, 1, target.z) - if(direction & EAST) - target = locate(world.maxx, target.y, target.z) - if(direction & WEST) - target = locate(1, target.y, target.z) - - return target - -// returns turf relative to A in given direction at set range -// result is bounded to map size -// note range is non-pythagorean -// used for disposal system -/proc/get_ranged_target_turf(var/atom/A, var/direction, var/range) - - var/x = A.x - var/y = A.y - if(direction & NORTH) - y = min(world.maxy, y + range) - if(direction & SOUTH) - y = max(1, y - range) - if(direction & EAST) - x = min(world.maxx, x + range) - if(direction & WEST) - x = max(1, x - range) - - return locate(x,y,A.z) - - -// returns turf relative to A offset in dx and dy tiles -// bound to map limits -/proc/get_offset_target_turf(var/atom/A, var/dx, var/dy) - var/x = min(world.maxx, max(1, A.x + dx)) - var/y = min(world.maxy, max(1, A.y + dy)) - return locate(x,y,A.z) - -//Makes sure MIDDLE is between LOW and HIGH. If not, it adjusts it. Returns the adjusted value. -/proc/between(var/low, var/middle, var/high) - return max(min(middle, high), low) - -proc/arctan(x) - var/y=arcsin(x/sqrt(1+x*x)) - return y - -//returns random gauss number -proc/GaussRand(var/sigma) - var/x,y,rsq - do - x=2*rand()-1 - y=2*rand()-1 - rsq=x*x+y*y - while(rsq>1 || !rsq) - return sigma*y*sqrt(-2*log(rsq)/rsq) - -//returns random gauss number, rounded to 'roundto' -proc/GaussRandRound(var/sigma,var/roundto) - return round(GaussRand(sigma),roundto) - -//Will return the contents of an atom recursivly to a depth of 'searchDepth' -/atom/proc/GetAllContents(searchDepth = 5) - var/list/toReturn = list() - - for(var/atom/part in contents) - toReturn += part - if(part.contents.len && searchDepth) - toReturn += part.GetAllContents(searchDepth - 1) - - return toReturn - -//Searches contents of the atom and returns the sum of all w_class of obj/item within -/atom/proc/GetTotalContentsWeight(searchDepth = 5) - var/weight = 0 - var/list/content = GetAllContents(searchDepth) - for(var/obj/item/I in content) - weight += I.w_class - return weight - -//Step-towards method of determining whether one atom can see another. Similar to viewers() -/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate. - var/turf/current = get_turf(source) - var/turf/target_turf = get_turf(target) - var/steps = 1 - - if(current != target_turf) - current = get_step_towards(current, target_turf) - while(current != target_turf) - if(steps > length) - return 0 - if(current.opacity) - return 0 - for(var/thing in current) - var/atom/A = thing - if(A.opacity) - return 0 - current = get_step_towards(current, target_turf) - steps++ - - return 1 - -proc/is_blocked_turf(turf/T, exclude_mobs) - if(T.density) - return 1 - for(var/i in T) - var/atom/A = i - if(A.density && (!exclude_mobs || !ismob(A))) - return 1 - return 0 - -/proc/get_step_towards2(var/atom/ref , var/atom/trg) - var/base_dir = get_dir(ref, get_step_towards(ref,trg)) - var/turf/temp = get_step_towards(ref,trg) - - if(is_blocked_turf(temp)) - var/dir_alt1 = turn(base_dir, 90) - var/dir_alt2 = turn(base_dir, -90) - var/turf/turf_last1 = temp - var/turf/turf_last2 = temp - var/free_tile = null - var/breakpoint = 0 - - while(!free_tile && breakpoint < 10) - if(!is_blocked_turf(turf_last1)) - free_tile = turf_last1 - break - if(!is_blocked_turf(turf_last2)) - free_tile = turf_last2 - break - turf_last1 = get_step(turf_last1,dir_alt1) - turf_last2 = get_step(turf_last2,dir_alt2) - breakpoint++ - - if(!free_tile) return get_step(ref, base_dir) - else return get_step_towards(ref,free_tile) - - else return get_step(ref, base_dir) - -//Takes: Anything that could possibly have variables and a varname to check. -//Returns: 1 if found, 0 if not. -/proc/hasvar(var/datum/A, var/varname) - if(A.vars.Find(lowertext(varname))) return 1 - else return 0 - -//Returns: all the areas in the world -/proc/return_areas() - var/list/area/areas = list() - for(var/area/A in world) - areas += A - return areas - -//Returns: all the areas in the world, sorted. -/proc/return_sorted_areas() - return sortAtom(return_areas()) - -//Takes: Area type as text string or as typepath OR an instance of the area. -//Returns: A list of all areas of that type in the world. -/proc/get_areas(var/areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) - if(isarea(areatype)) - var/area/areatemp = areatype - areatype = areatemp.type - - var/list/areas = new/list() - for(var/area/N in world) - if(istype(N, areatype)) areas += N - return areas - -//Takes: Area type as text string or as typepath OR an instance of the area. -//Returns: A list of all turfs in areas of that type of that type in the world. -/proc/get_area_turfs(var/areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) - if(isarea(areatype)) - var/area/areatemp = areatype - areatype = areatemp.type - - var/list/turfs = new/list() - for(var/area/N in world) - if(istype(N, areatype)) - for(var/turf/T in N) turfs += T - return turfs - -//Takes: Area type as text string or as typepath OR an instance of the area. -//Returns: A list of all atoms (objs, turfs, mobs) in areas of that type of that type in the world. -/proc/get_area_all_atoms(var/areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) - if(isarea(areatype)) - var/area/areatemp = areatype - areatype = areatemp.type - - var/list/atoms = new/list() - for(var/area/N in world) - if(istype(N, areatype)) - for(var/atom/A in N) - atoms += A - return atoms - -/datum/coords //Simple datum for storing coordinates. - var/x_pos = null - var/y_pos = null - var/z_pos = null - -/area/proc/move_contents_to(var/area/A, var/turftoleave=null, var/direction = null) - //Takes: Area. Optional: turf type to leave behind. - //Returns: Nothing. - //Notes: Attempts to move the contents of one area to another area. - // Movement based on lower left corner. Tiles that do not fit - // into the new area will not be moved. - - if(!A || !src) return 0 - - var/list/turfs_src = get_area_turfs(src.type) - var/list/turfs_trg = get_area_turfs(A.type) - - var/src_min_x = 0 - var/src_min_y = 0 - for(var/turf/T in turfs_src) - if(T.x < src_min_x || !src_min_x) src_min_x = T.x - if(T.y < src_min_y || !src_min_y) src_min_y = T.y - - var/trg_min_x = 0 - var/trg_min_y = 0 - for(var/turf/T in turfs_trg) - if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x - if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y - - var/list/refined_src = new/list() - for(var/turf/T in turfs_src) - refined_src += T - refined_src[T] = new/datum/coords - var/datum/coords/C = refined_src[T] - C.x_pos = (T.x - src_min_x) - C.y_pos = (T.y - src_min_y) - - var/list/refined_trg = new/list() - for(var/turf/T in turfs_trg) - refined_trg += T - refined_trg[T] = new/datum/coords - var/datum/coords/C = refined_trg[T] - C.x_pos = (T.x - trg_min_x) - C.y_pos = (T.y - trg_min_y) - - var/list/fromupdate = new/list() - var/list/toupdate = new/list() - - moving: - for(var/turf/T in refined_src) - var/datum/coords/C_src = refined_src[T] - for(var/turf/B in refined_trg) - var/datum/coords/C_trg = refined_trg[B] - if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) - - var/old_dir1 = T.dir - var/old_icon_state1 = T.icon_state - var/old_icon1 = T.icon - - var/turf/X = B.ChangeTurf(T.type) - X.dir = old_dir1 - X.icon_state = old_icon_state1 - X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi - - // Give the new turf our air, if simulated - if(istype(X, /turf/simulated) && istype(T, /turf/simulated)) - var/turf/simulated/sim = X - sim.copy_air_with_tile(T) - - - /* Quick visual fix for some weird shuttle corner artefacts when on transit space tiles */ - if(direction && findtext(X.icon_state, "swall_s")) - - // Spawn a new shuttle corner object - var/obj/corner = new() - corner.loc = X - corner.density = 1 - corner.anchored = 1 - corner.icon = X.icon - corner.icon_state = replacetext(X.icon_state, "_s", "_f") - corner.tag = "delete me" - corner.name = "wall" - - // Find a new turf to take on the property of - var/turf/nextturf = get_step(corner, direction) - if(!nextturf || !istype(nextturf, /turf/space)) - nextturf = get_step(corner, turn(direction, 180)) - - - // Take on the icon of a neighboring scrolling space icon - X.icon = nextturf.icon - X.icon_state = nextturf.icon_state - - - for(var/obj/O in T) - - // Reset the shuttle corners - if(O.tag == "delete me") - X.icon = 'icons/turf/shuttle.dmi' - X.icon_state = replacetext(O.icon_state, "_f", "_s") // revert the turf to the old icon_state - X.name = "wall" - qdel(O) // prevents multiple shuttle corners from stacking - continue - if(!istype(O,/obj)) continue - O.loc.Exited(O) - O.setLoc(X,teleported=1) - O.loc.Entered(O) - for(var/mob/M in T) - if(!M.move_on_shuttle) - continue - M.loc = X - -// var/area/AR = X.loc - -// if(AR.lighting_use_dynamic) //TODO: rewrite this code so it's not messed by lighting ~Carn -// X.opacity = !X.opacity -// X.set_opacity(!X.opacity) - - toupdate += X - - if(turftoleave) - fromupdate += T.ChangeTurf(turftoleave) - else - T.ChangeTurf(T.baseturf) - - refined_src -= T - refined_trg -= B - continue moving - - if(toupdate.len) - for(var/turf/simulated/T1 in toupdate) - SSair.remove_from_active(T1) - T1.CalculateAdjacentTurfs() - SSair.add_to_active(T1,1) - - if(fromupdate.len) - for(var/turf/simulated/T2 in fromupdate) - SSair.remove_from_active(T2) - T2.CalculateAdjacentTurfs() - SSair.add_to_active(T2,1) - - - - -/proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0, var/atom/newloc = null) - if(!original) - return null - - var/obj/O = null - - if(sameloc) - O=new original.type(original.loc) - else - O=new original.type(newloc) - - if(perfectcopy) - if((O) && (original)) - var/static/list/forbidden_vars = list("type","loc","locs","vars", "parent","parent_type", "verbs","ckey","key","power_supply","contents","reagents","stat","x","y","z","group") - - for(var/V in original.vars - forbidden_vars) - if(istype(original.vars[V],/list)) - var/list/L = original.vars[V] - O.vars[V] = L.Copy() - else if(istype(original.vars[V],/datum)) - continue // this would reference the original's object, that will break when it is used or deleted. - else - O.vars[V] = original.vars[V] - if(istype(O)) - O.update_icon() - return O - -/area/proc/copy_contents_to(var/area/A , var/platingRequired = 0 ) - //Takes: Area. Optional: If it should copy to areas that don't have plating - //Returns: Nothing. - //Notes: Attempts to move the contents of one area to another area. - // Movement based on lower left corner. Tiles that do not fit - // into the new area will not be moved. - - if(!A || !src) return 0 - - var/list/turfs_src = get_area_turfs(src.type) - var/list/turfs_trg = get_area_turfs(A.type) - - var/src_min_x = 0 - var/src_min_y = 0 - for(var/turf/T in turfs_src) - if(T.x < src_min_x || !src_min_x) src_min_x = T.x - if(T.y < src_min_y || !src_min_y) src_min_y = T.y - - var/trg_min_x = 0 - var/trg_min_y = 0 - for(var/turf/T in turfs_trg) - if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x - if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y - - var/list/refined_src = new/list() - for(var/turf/T in turfs_src) - refined_src += T - refined_src[T] = new/datum/coords - var/datum/coords/C = refined_src[T] - C.x_pos = (T.x - src_min_x) - C.y_pos = (T.y - src_min_y) - - var/list/refined_trg = new/list() - for(var/turf/T in turfs_trg) - refined_trg += T - refined_trg[T] = new/datum/coords - var/datum/coords/C = refined_trg[T] - C.x_pos = (T.x - trg_min_x) - C.y_pos = (T.y - trg_min_y) - - var/list/toupdate = new/list() - - var/copiedobjs = list() - - - moving: - for(var/turf/T in refined_src) - var/datum/coords/C_src = refined_src[T] - for(var/turf/B in refined_trg) - var/datum/coords/C_trg = refined_trg[B] - if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) - - var/old_dir1 = T.dir - var/old_icon_state1 = T.icon_state - var/old_icon1 = T.icon - - if(platingRequired) - if(istype(B, /turf/space)) - continue moving - - var/turf/X = new T.type(B) - X.dir = old_dir1 - X.icon_state = old_icon_state1 - X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi - - - var/list/objs = new/list() - var/list/newobjs = new/list() - var/list/mobs = new/list() - var/list/newmobs = new/list() - - for(var/obj/O in T) - - if(!istype(O,/obj)) - continue - - objs += O - - - for(var/obj/O in objs) - newobjs += DuplicateObject(O , 1) - - - for(var/obj/O in newobjs) - O.loc = X - - for(var/mob/M in T) - - if(!M.move_on_shuttle) - continue - mobs += M - - for(var/mob/M in mobs) - newmobs += DuplicateObject(M , 1) - - for(var/mob/M in newmobs) - M.loc = X - - copiedobjs += newobjs - copiedobjs += newmobs - - - - for(var/V in T.vars) - if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key","x","y","z","contents", "luminosity", "group"))) - X.vars[V] = T.vars[V] - -// var/area/AR = X.loc - -// if(AR.lighting_use_dynamic) -// X.opacity = !X.opacity -// X.sd_set_opacity(!X.opacity) //TODO: rewrite this code so it's not messed by lighting ~Carn - - toupdate += X - - refined_src -= T - refined_trg -= B - continue moving - - - - if(toupdate.len) - for(var/turf/simulated/T1 in toupdate) - T1.CalculateAdjacentTurfs() - SSair.add_to_active(T1,1) - - - return copiedobjs - - - -proc/get_cardinal_dir(atom/A, atom/B) - var/dx = abs(B.x - A.x) - var/dy = abs(B.y - A.y) - return get_dir(A, B) & (rand() * (dx+dy) < dy ? 3 : 12) - -//chances are 1:value. anyprob(1) will always return true -proc/anyprob(value) - return (rand(1,value)==value) - -proc/view_or_range(distance = world.view , center = usr , type) - switch(type) - if("view") - . = view(distance,center) - if("range") - . = range(distance,center) - return - -proc/oview_or_orange(distance = world.view , center = usr , type) - switch(type) - if("view") - . = oview(distance,center) - if("range") - . = orange(distance,center) - return - -proc/get_mob_with_client_list() - var/list/mobs = list() - for(var/mob/M in GLOB.mob_list) - if(M.client) - mobs += M - return mobs - - -/proc/parse_zone(zone) - if(zone == "r_hand") return "right hand" - else if(zone == "l_hand") return "left hand" - else if(zone == "l_arm") return "left arm" - else if(zone == "r_arm") return "right arm" - else if(zone == "l_leg") return "left leg" - else if(zone == "r_leg") return "right leg" - else if(zone == "l_foot") return "left foot" - else if(zone == "r_foot") return "right foot" - else if(zone == "l_hand") return "left hand" - else if(zone == "r_hand") return "right hand" - else if(zone == "l_foot") return "left foot" - else if(zone == "r_foot") return "right foot" - else return zone - -/* - - Gets the turf this atom's *ICON* appears to inhabit - It takes into account: - * Pixel_x/y - * Matrix x/y - - NOTE: if your atom has non-standard bounds then this proc - will handle it, but: - * if the bounds are even, then there are an even amount of "middle" turfs, the one to the EAST, NORTH, or BOTH is picked - (this may seem bad, but you're atleast as close to the center of the atom as possible, better than byond's default loc being all the way off) - * if the bounds are odd, the true middle turf of the atom is returned - -*/ - -/proc/get_turf_pixel(atom/movable/AM) - if(!istype(AM)) - return - - //Find AM's matrix so we can use it's X/Y pixel shifts - var/matrix/M = matrix(AM.transform) - - var/pixel_x_offset = AM.pixel_x + M.get_x_shift() - var/pixel_y_offset = AM.pixel_y + M.get_y_shift() - - //Irregular objects - if(AM.bound_height != world.icon_size || AM.bound_width != world.icon_size) - var/icon/AMicon = icon(AM.icon, AM.icon_state) - pixel_x_offset += ((AMicon.Width()/world.icon_size)-1)*(world.icon_size*0.5) - pixel_y_offset += ((AMicon.Height()/world.icon_size)-1)*(world.icon_size*0.5) - qdel(AMicon) - - //DY and DX - var/rough_x = round(round(pixel_x_offset,world.icon_size)/world.icon_size) - var/rough_y = round(round(pixel_y_offset,world.icon_size)/world.icon_size) - - //Find coordinates - var/turf/T = get_turf(AM) //use AM's turfs, as it's coords are the same as AM's AND AM's coords are lost if it is inside another atom - if(!T) - return null - var/final_x = T.x + rough_x - var/final_y = T.y + rough_y - - if(final_x || final_y) - return locate(final_x, final_y, T.z) - -//Finds the distance between two atoms, in pixels -//centered = 0 counts from turf edge to edge -//centered = 1 counts from turf center to turf center -//of course mathematically this is just adding world.icon_size on again -/proc/getPixelDistance(var/atom/A, var/atom/B, var/centered = 1) - if(!istype(A)||!istype(B)) - return 0 - . = bounds_dist(A, B) + sqrt((((A.pixel_x+B.pixel_x)**2) + ((A.pixel_y+B.pixel_y)**2))) - if(centered) - . += world.icon_size - -/proc/get(atom/loc, type) - while(loc) - if(istype(loc, type)) - return loc - loc = loc.loc - return null - -/proc/get_turf_or_move(turf/location) - return get_turf(location) - - -//For objects that should embed, but make no sense being is_sharp or is_pointed() -//e.g: rods -var/list/can_embed_types = typecacheof(list( - /obj/item/stack/rods, - /obj/item/pipe)) - -/proc/can_embed(obj/item/W) - if(is_sharp(W)) - return 1 - if(is_pointed(W)) - return 1 - - if(is_type_in_typecache(W, can_embed_types)) - return 1 - -//Quick type checks for some tools -var/global/list/common_tools = list( -/obj/item/stack/cable_coil, -/obj/item/wrench, -/obj/item/weldingtool, -/obj/item/screwdriver, -/obj/item/wirecutters, -/obj/item/multitool, -/obj/item/crowbar) - -/proc/istool(O) - if(O && is_type_in_list(O, common_tools)) - return 1 - return 0 - -/proc/iswrench(O) - if(istype(O, /obj/item/wrench)) - return 1 - return 0 - -/proc/iswelder(O) - if(istype(O, /obj/item/weldingtool)) - return 1 - return 0 - -/proc/iscoil(O) - if(istype(O, /obj/item/stack/cable_coil)) - return 1 - return 0 - -/proc/iswirecutter(O) - if(istype(O, /obj/item/wirecutters)) - return 1 - return 0 - -/proc/isscrewdriver(O) - if(istype(O, /obj/item/screwdriver)) - return 1 - return 0 - -/proc/ismultitool(O) - if(istype(O, /obj/item/multitool)) - return 1 - return 0 - -/proc/iscrowbar(O) - if(istype(O, /obj/item/crowbar)) - return 1 - return 0 - -/proc/ispowertool(O)//used to check if a tool can force powered doors - if(istype(O, /obj/item/crowbar/power) || istype(O, /obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw)) - return TRUE - return FALSE - -/proc/iswire(O) - if(istype(O, /obj/item/stack/cable_coil)) - return 1 - return 0 - -/proc/is_hot(obj/item/W as obj) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/O = W - if(O.isOn()) - return 2500 - else - return 0 - if(istype(W, /obj/item/lighter)) - var/obj/item/lighter/O = W - if(O.lit) - return 1500 - else - return 0 - if(istype(W, /obj/item/match)) - var/obj/item/match/O = W - if(O.lit == 1) - return 1000 - else - return 0 - if(istype(W, /obj/item/clothing/mask/cigarette)) - var/obj/item/clothing/mask/cigarette/O = W - if(O.lit) - return 1000 - else - return 0 - if(istype(W, /obj/item/candle)) - var/obj/item/candle/O = W - if(O.lit) - return 1000 - else - return 0 - if(istype(W, /obj/item/flashlight/flare)) - var/obj/item/flashlight/flare/O = W - if(O.on) - return 1000 - else - return 0 - if(istype(W, /obj/item/gun/energy/plasmacutter)) - return 3800 - if(istype(W, /obj/item/melee/energy)) - var/obj/item/melee/energy/O = W - if(O.active) - return 3500 - else - return 0 - if(istype(W, /obj/item/assembly/igniter)) - return 20000 - else - return 0 - -//Whether or not the given item counts as sharp in terms of dealing damage -/proc/is_sharp(obj/O) - if(!O) - return 0 - if(O.sharp) - return 1 - return 0 - -/proc/is_surgery_tool(obj/item/W as obj) - return ( \ - istype(W, /obj/item/scalpel) || \ - istype(W, /obj/item/hemostat) || \ - istype(W, /obj/item/retractor) || \ - istype(W, /obj/item/cautery) || \ - istype(W, /obj/item/bonegel) || \ - istype(W, /obj/item/bonesetter) - ) - -/proc/reverse_direction(var/dir) - switch(dir) - if(NORTH) - return SOUTH - if(NORTHEAST) - return SOUTHWEST - if(EAST) - return WEST - if(SOUTHEAST) - return NORTHWEST - if(SOUTH) - return NORTH - if(SOUTHWEST) - return NORTHEAST - if(WEST) - return EAST - if(NORTHWEST) - return SOUTHEAST - -/* -Checks if that loc and dir has a item on the wall -*/ -var/list/static/global/wall_items = typecacheof(list(/obj/machinery/power/apc, /obj/machinery/alarm, - /obj/item/radio/intercom, /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank, - /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign, - /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/door_control, - /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio/airlock, - /obj/item/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth, - /obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment, - /obj/structure/sign)) - -/proc/gotwallitem(loc, dir) - for(var/obj/O in loc) - if(is_type_in_typecache(O, wall_items)) - //Direction works sometimes - if(O.dir == dir) - return 1 - - //Some stuff doesn't use dir properly, so we need to check pixel instead - switch(dir) - if(SOUTH) - if(O.pixel_y > 10) - return 1 - if(NORTH) - if(O.pixel_y < -10) - return 1 - if(WEST) - if(O.pixel_x > 10) - return 1 - if(EAST) - if(O.pixel_x < -10) - return 1 - - //Some stuff is placed directly on the wallturf (signs) - for(var/obj/O in get_step(loc, dir)) - if(is_type_in_typecache(O, wall_items)) - if(abs(O.pixel_x) <= 10 && abs(O.pixel_y) <= 10) - return 1 - return 0 - - -proc/get_angle(atom/a, atom/b) - return atan2(b.y - a.y, b.x - a.x) - -proc/atan2(x, y) - if(!x && !y) return 0 - return y >= 0 ? arccos(x / sqrt(x * x + y * y)) : -arccos(x / sqrt(x * x + y * y)) - -/proc/format_text(text) - return replacetext(replacetext(text,"\proper ",""),"\improper ","") - -/* -Standard way to write links -Sayu -*/ - -/proc/topic_link(var/datum/D, var/arglist, var/content) - if(istype(arglist,/list)) - arglist = list2params(arglist) - return "[content]" - - - -/proc/get_location_accessible(mob/M, location) - var/covered_locations = 0 //based on body_parts_covered - var/face_covered = 0 //based on flags_inv - var/eyesmouth_covered = 0 //based on flags_cover - if(iscarbon(M)) - var/mob/living/carbon/C = M - for(var/obj/item/clothing/I in list(C.back, C.wear_mask)) - covered_locations |= I.body_parts_covered - face_covered |= I.flags_inv - eyesmouth_covered |= I.flags_cover - if(ishuman(C)) - var/mob/living/carbon/human/H = C - for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.head, H.r_ear, H.l_ear)) - covered_locations |= I.body_parts_covered - face_covered |= I.flags_inv - eyesmouth_covered |= I.flags_cover - - switch(location) - if("head") - if(covered_locations & HEAD) - return 0 - if("eyes") - if(face_covered & HIDEEYES || eyesmouth_covered & GLASSESCOVERSEYES || eyesmouth_covered & HEADCOVERSEYES) - return 0 - if("mouth") - if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH) - return 0 - if("chest") - if(covered_locations & UPPER_TORSO) - return 0 - if("groin") - if(covered_locations & LOWER_TORSO) - return 0 - if("l_arm") - if(covered_locations & ARM_LEFT) - return 0 - if("r_arm") - if(covered_locations & ARM_RIGHT) - return 0 - if("l_leg") - if(covered_locations & LEG_LEFT) - return 0 - if("r_leg") - if(covered_locations & LEG_RIGHT) - return 0 - if("l_hand") - if(covered_locations & HAND_LEFT) - return 0 - if("r_hand") - if(covered_locations & HAND_RIGHT) - return 0 - if("l_foot") - if(covered_locations & FOOT_LEFT) - return 0 - if("r_foot") - if(covered_locations & FOOT_RIGHT) - return 0 - - return 1 - -/proc/check_target_facings(mob/living/initator, mob/living/target) - /*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head. - Given how click code currently works (Nov '13), the initiating mob will be facing the target mob most of the time - That said, this proc should not be used if the change facing proc of the click code is overriden at the same time*/ - if(!ismob(target) || target.lying) - //Make sure we are not doing this for things that can't have a logical direction to the players given that the target would be on their side - return FACING_FAILED - if(initator.dir == target.dir) //mobs are facing the same direction - return FACING_SAME_DIR - if(is_A_facing_B(initator, target) && is_A_facing_B(target, initator)) //mobs are facing each other - return FACING_EACHOTHER - if(initator.dir + 2 == target.dir || initator.dir - 2 == target.dir || initator.dir + 6 == target.dir || initator.dir - 6 == target.dir) //Initating mob is looking at the target, while the target mob is looking in a direction perpendicular to the 1st - return FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR - - -atom/proc/GetTypeInAllContents(typepath) - var/list/processing_list = list(src) - var/list/processed = list() - - var/atom/found = null - - while(processing_list.len && found==null) - var/atom/A = processing_list[1] - if(istype(A, typepath)) - found = A - - processing_list -= A - - for(var/atom/a in A) - if(!(a in processed)) - processing_list |= a - - processed |= A - - return found - -/proc/random_step(atom/movable/AM, steps, chance) - var/initial_chance = chance - while(steps > 0) - if(prob(chance)) - step(AM, pick(alldirs)) - chance = max(chance - (initial_chance / steps), 0) - steps-- - -/proc/get_random_colour(var/simple, var/lower, var/upper) - var/colour - if(simple) - colour = pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF")) - else - for(var/i=1;i<=3;i++) - var/temp_col = "[num2hex(rand(lower,upper))]" - if(length(temp_col )<2) - temp_col = "0[temp_col]" - colour += temp_col - return colour - -/proc/get_distant_turf(var/turf/T,var/direction,var/distance) - if(!T || !direction || !distance) return - - var/dest_x = T.x - var/dest_y = T.y - var/dest_z = T.z - - if(direction & NORTH) - dest_y = min(world.maxy, dest_y+distance) - if(direction & SOUTH) - dest_y = max(0, dest_y-distance) - if(direction & EAST) - dest_x = min(world.maxy, dest_x+distance) - if(direction & WEST) - dest_x = max(0, dest_x-distance) - - return locate(dest_x,dest_y,dest_z) - -var/mob/dview/dview_mob = new - -//Version of view() which ignores darkness, because BYOND doesn't have it. -/proc/dview(var/range = world.view, var/center, var/invis_flags = 0) - if(!center) - return - - dview_mob.loc = center - - dview_mob.see_invisible = invis_flags - - . = view(range, dview_mob) - dview_mob.loc = null - -/mob/dview - invisibility = 101 - density = 0 - move_force = 0 - pull_force = 0 - move_resist = INFINITY - simulated = 0 - canmove = FALSE - see_in_dark = 1e6 - -/mob/dview/New() //For whatever reason, if this isn't called, then BYOND will throw a type mismatch runtime when attempting to add this to the mobs list. -Fox - -/mob/dview/Destroy() - // should never be deleted - return QDEL_HINT_LETMELIVE - -/proc/IsValidSrc(A) - if(istype(A, /datum)) - var/datum/D = A - return !QDELETED(D) - if(istype(A, /client)) - return TRUE - return FALSE - -//can a window be here, or is there a window blocking it? -/proc/valid_window_location(turf/T, dir_to_check) - if(!T) - return FALSE - for(var/obj/O in T) - if(istype(O, /obj/machinery/door/window) && (O.dir == dir_to_check || dir_to_check == FULLTILE_WINDOW_DIR)) - return FALSE - if(istype(O, /obj/structure/windoor_assembly)) - var/obj/structure/windoor_assembly/W = O - if(W.ini_dir == dir_to_check || dir_to_check == FULLTILE_WINDOW_DIR) - return FALSE - if(istype(O, /obj/structure/window)) - var/obj/structure/window/W = O - if(W.ini_dir == dir_to_check || W.ini_dir == FULLTILE_WINDOW_DIR || dir_to_check == FULLTILE_WINDOW_DIR) - return FALSE - return TRUE - -//Get the dir to the RIGHT of dir if they were on a clock -//NORTH --> NORTHEAST -/proc/get_clockwise_dir(dir) - . = angle2dir(dir2angle(dir)+45) - -//Get the dir to the LEFT of dir if they were on a clock -//NORTH --> NORTHWEST -/proc/get_anticlockwise_dir(dir) - . = angle2dir(dir2angle(dir)-45) - - -//Compare A's dir, the clockwise dir of A and the anticlockwise dir of A -//To the opposite dir of the dir returned by get_dir(B,A) -//If one of them is a match, then A is facing B -/proc/is_A_facing_B(atom/A, atom/B) - if(!istype(A) || !istype(B)) - return 0 - if(isliving(A)) - var/mob/living/LA = A - if(LA.lying) - return 0 - var/goal_dir = angle2dir(dir2angle(get_dir(B, A)+180)) - var/clockwise_A_dir = get_clockwise_dir(A.dir) - var/anticlockwise_A_dir = get_anticlockwise_dir(B.dir) - - if(A.dir == goal_dir || clockwise_A_dir == goal_dir || anticlockwise_A_dir == goal_dir) - return 1 - return 0 - -//This is just so you can stop an orbit. -//orbit() can run without it (swap orbiting for A) -//but then you can never stop it and that's just silly. -/atom/movable/var/atom/orbiting = null - -//A: atom to orbit -//radius: range to orbit at, radius of the circle formed by orbiting -//clockwise: whether you orbit clockwise or anti clockwise -//rotation_speed: how fast to rotate -//rotation_segments: the resolution of the orbit circle, less = a more block circle, this can be used to produce hexagons (6 segments) triangles (3 segments), and so on, 36 is the best default. -//pre_rotation: Chooses to rotate src 90 degress towards the orbit dir (clockwise/anticlockwise), useful for things to go "head first" like ghosts -//lockinorbit: Forces src to always be on A's turf, otherwise the orbit cancels when src gets too far away (eg: ghosts) - -/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE, lockinorbit = FALSE, forceMove = FALSE) - if(!istype(A)) - return - - if(orbiting) - stop_orbit() - - orbiting = A - var/matrix/initial_transform = matrix(transform) - var/lastloc = loc - - //Head first! - if(pre_rotation) - var/matrix/M = matrix(transform) - var/pre_rot = 90 - if(!clockwise) - pre_rot = -90 - M.Turn(pre_rot) - transform = M - - var/matrix/shift = matrix(transform) - shift.Translate(0,radius) - transform = shift - - SpinAnimation(rotation_speed, -1, clockwise, rotation_segments) - - //we stack the orbits up client side, so we can assign this back to normal server side without it breaking the orbit - transform = initial_transform - while(orbiting && orbiting == A && A.loc) - var/targetloc = get_turf(A) - if(!lockinorbit && loc != lastloc && loc != targetloc) - break - if(forceMove) - forceMove(targetloc) - else - loc = targetloc - lastloc = loc - sleep(0.6) - - if(orbiting == A) //make sure we haven't started orbiting something else. - orbiting = null - SpinAnimation(0,0) - - - -/atom/movable/proc/stop_orbit() - orbiting = null - -//Centers an image. -//Requires: -//The Image -//The x dimension of the icon file used in the image -//The y dimension of the icon file used in the image -// eg: center_image(I, 32,32) -// eg2: center_image(I, 96,96) -/proc/center_image(var/image/I, x_dimension = 0, y_dimension = 0) - if(!I) - return - - if(!x_dimension || !y_dimension) - return - - //Get out of here, punk ass kids calling procs needlessly - if((x_dimension == world.icon_size) && (y_dimension == world.icon_size)) - return I - - //Offset the image so that it's bottom left corner is shifted this many pixels - //This makes it infinitely easier to draw larger inhands/images larger than world.iconsize - //but still use them in game - var/x_offset = -((x_dimension/world.icon_size)-1)*(world.icon_size*0.5) - var/y_offset = -((y_dimension/world.icon_size)-1)*(world.icon_size*0.5) - - //Correct values under world.icon_size - if(x_dimension < world.icon_size) - x_offset *= -1 - if(y_dimension < world.icon_size) - y_offset *= -1 - - I.pixel_x = x_offset - I.pixel_y = y_offset - - return I - -//similar function to RANGE_TURFS(), but will search spiralling outwards from the center (like the above, but only turfs) -/proc/spiral_range_turfs(dist=0, center=usr, orange=0) - if(!dist) - if(!orange) - return list(center) - else - return list() - - var/turf/t_center = get_turf(center) - if(!t_center) - return list() - - var/list/L = list() - var/turf/T - var/y - var/x - var/c_dist = 1 - - if(!orange) - L += t_center - - while( c_dist <= dist ) - y = t_center.y + c_dist - x = t_center.x - c_dist + 1 - for(x in x to t_center.x+c_dist) - T = locate(x,y,t_center.z) - if(T) - L += T - - y = t_center.y + c_dist - 1 - x = t_center.x + c_dist - for(y in t_center.y-c_dist to y) - T = locate(x,y,t_center.z) - if(T) - L += T - - y = t_center.y - c_dist - x = t_center.x + c_dist - 1 - for(x in t_center.x-c_dist to x) - T = locate(x,y,t_center.z) - if(T) - L += T - - y = t_center.y - c_dist + 1 - x = t_center.x - c_dist - for(y in y to t_center.y+c_dist) - T = locate(x,y,t_center.z) - if(T) - L += T - c_dist++ - - return L - -//ultra range (no limitations on distance, faster than range for distances > 8); including areas drastically decreases performance -/proc/urange(dist=0, atom/center=usr, orange=0, areas=0) - if(!dist) - if(!orange) - return list(center) - else - return list() - - var/list/turfs = RANGE_TURFS(dist, center) - if(orange) - turfs -= get_turf(center) - . = list() - for(var/V in turfs) - var/turf/T = V - . += T - . += T.contents - if(areas) - . |= T.loc - -/proc/turf_clear(turf/T) - for(var/atom/A in T) - if(A.simulated) - return FALSE - return TRUE - -/proc/screen_loc2turf(scr_loc, turf/origin) - var/tX = splittext(scr_loc, ",") - var/tY = splittext(tX[2], ":") - var/tZ = origin.z - tY = tY[1] - tX = splittext(tX[1], ":") - tX = tX[1] - tX = max(1, min(world.maxx, origin.x + (text2num(tX) - (world.view + 1)))) - tY = max(1, min(world.maxy, origin.y + (text2num(tY) - (world.view + 1)))) - return locate(tX, tY, tZ) - -/proc/get_closest_atom(type, list, source) - var/closest_atom - var/closest_distance - for(var/A in list) - if(!istype(A, type)) - continue - var/distance = get_dist(source, A) - if(!closest_distance) - closest_distance = distance - closest_atom = A - else - if(closest_distance > distance) - closest_distance = distance - closest_atom = A - return closest_atom - -/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) - if(value == FALSE) //nothing should be calling us with a number, so this is safe - value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text - if(isnull(value)) - return - value = trim(value) - if(!isnull(value) && value != "") - matches = filter_fancy_list(matches, value) - - if(matches.len == 0) - return - - var/chosen - if(matches.len == 1) - chosen = matches[1] - else - chosen = input("Select a type", "Pick Type", matches[1]) as null|anything in matches - if(!chosen) - return - chosen = matches[chosen] - return chosen - -/proc/make_types_fancy(var/list/types) - if(ispath(types)) - types = list(types) - . = list() - for(var/type in types) - var/typename = "[type]" - var/static/list/TYPES_SHORTCUTS = list( - //longest paths comes first - otherwise they get shadowed by the more generic ones - /obj/effect/decal/cleanable = "CLEANABLE", - /obj/effect = "EFFECT", - /obj/item/ammo_casing = "AMMO", - /obj/item/book/manual = "MANUAL", - /obj/item/borg/upgrade = "BORG_UPGRADE", - /obj/item/cartridge = "PDA_CART", - /obj/item/clothing/head/helmet/space = "SPESSHELMET", - /obj/item/clothing/head = "HEAD", - /obj/item/clothing/under = "UNIFORM", - /obj/item/clothing/shoes = "SHOES", - /obj/item/clothing/suit = "SUIT", - /obj/item/clothing/gloves = "GLOVES", - /obj/item/clothing/mask/cigarette = "CIGARRETE", // oof - /obj/item/clothing/mask = "MASK", - /obj/item/clothing/glasses = "GLASSES", - /obj/item/clothing = "CLOTHING", - /obj/item/grenade/clusterbuster = "CLUSTERBUSTER", - /obj/item/grenade = "GRENADE", - /obj/item/gun = "GUN", - /obj/item/implant = "IMPLANT", - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", - /obj/item/mecha_parts/mecha_equipment/weapon = "MECHA_WEAPON", - /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", - /obj/item/melee = "MELEE", - /obj/item/mmi = "MMI", - /obj/item/nullrod = "NULLROD", - /obj/item/organ/external = "EXT_ORG", - /obj/item/organ/internal/cyberimp = "CYBERIMP", - /obj/item/organ/internal = "INT_ORG", - /obj/item/organ = "ORGAN", - /obj/item/pda = "PDA", - /obj/item/projectile = "PROJ", - /obj/item/radio/headset = "HEADSET", - /obj/item/reagent_containers/glass/beaker = "BEAKER", - /obj/item/reagent_containers/glass/bottle = "BOTTLE", - /obj/item/reagent_containers/food/pill/patch = "PATCH", - /obj/item/reagent_containers/food/pill = "PILL", - /obj/item/reagent_containers/food/drinks = "DRINK", - /obj/item/reagent_containers/food = "FOOD", - /obj/item/reagent_containers/syringe = "SYRINGE", - /obj/item/reagent_containers = "REAGENT_CONTAINERS", - /obj/item/robot_parts = "ROBOT_PARTS", - /obj/item/seeds = "SEED", - /obj/item/slime_extract = "SLIME_CORE", - /obj/item/spacepod_equipment/weaponry = "POD_WEAPON", - /obj/item/spacepod_equipment = "POD_EQUIP", - /obj/item/stack/sheet/mineral = "MINERAL", - /obj/item/stack/sheet = "SHEET", - /obj/item/stack/tile = "TILE", - /obj/item/stack = "STACK", - /obj/item/stock_parts/cell = "POWERCELL", - /obj/item/stock_parts = "STOCK_PARTS", - /obj/item/storage/firstaid = "FIRSTAID", - /obj/item/storage = "STORAGE", - /obj/item/tank = "GAS_TANK", - /obj/item/toy/crayon = "CRAYON", - /obj/item/toy = "TOY", - /obj/item = "ITEM", - /obj/machinery/atmospherics = "ATMOS_MACH", - /obj/machinery/computer = "CONSOLE", - /obj/machinery/door/airlock = "AIRLOCK", - /obj/machinery/door = "DOOR", - /obj/machinery/kitchen_machine = "KITCHEN", - /obj/machinery/portable_atmospherics/canister = "CANISTER", - /obj/machinery/portable_atmospherics = "PORT_ATMOS", - /obj/machinery/power = "POWER", - /obj/machinery/telecomms = "TCOMMS", - /obj/machinery = "MACHINERY", - /obj/mecha = "MECHA", - /obj/structure/closet/crate = "CRATE", - /obj/structure/closet = "CLOSET", - /obj/structure/statue = "STATUE", - /obj/structure/chair = "CHAIR", // oh no - /obj/structure/bed = "BED", - /obj/structure/chair/stool = "STOOL", - /obj/structure/table = "TABLE", - /obj/structure = "STRUCTURE", - /obj/vehicle = "VEHICLE", - /obj = "O", - /datum = "D", - /turf/simulated/floor = "SIM_FLOOR", - /turf/simulated/wall = "SIM_WALL", - /turf/unsimulated/floor = "UNSIM_FLOOR", - /turf/unsimulated/wall = "UNSIM_WALL", - /turf = "T", - /mob/living/carbon/alien = "XENO", - /mob/living/carbon/human = "HUMAN", - /mob/living/carbon = "CARBON", - /mob/living/silicon/robot = "CYBORG", - /mob/living/silicon/ai = "AI", - /mob/living/silicon = "SILICON", - /mob/living/simple_animal/bot = "BOT", - /mob/living/simple_animal = "SIMPLE", - /mob/living = "LIVING", - /mob = "M" - ) - for(var/tn in TYPES_SHORTCUTS) - if(copytext(typename, 1, length("[tn]/") + 1) == "[tn]/") - typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/")) - break - .[typename] = type - - -/proc/get_fancy_list_of_atom_types() - var/static/list/pre_generated_list - if(!pre_generated_list) //init - pre_generated_list = make_types_fancy(typesof(/atom)) - return pre_generated_list - - -/proc/get_fancy_list_of_datum_types() - var/static/list/pre_generated_list - if(!pre_generated_list) //init - pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom))) - return pre_generated_list - - -/proc/filter_fancy_list(list/L, filter as text) - var/list/matches = new - for(var/key in L) - var/value = L[key] - if(findtext("[key]", filter) || findtext("[value]", filter)) - matches[key] = value - return matches - -//Key thing that stops lag. Cornerstone of performance in ss13, Just sitting here, in unsorted.dm. - -//Increases delay as the server gets more overloaded, -//as sleeps aren't cheap and sleeping only to wake up and sleep again is wasteful -#define DELTA_CALC max(((max(TICK_USAGE, world.cpu) / 100) * max(Master.sleep_delta-1,1)), 1) - -//returns the number of ticks slept -/proc/stoplag(initial_delay) - if(!Master || !(Master.current_runlevel & RUNLEVELS_DEFAULT)) - sleep(world.tick_lag) - return 1 - if(!initial_delay) - initial_delay = world.tick_lag - . = 0 - var/i = DS2TICKS(initial_delay) - do - . += CEILING(i*DELTA_CALC, 1) - sleep(i*world.tick_lag*DELTA_CALC) - i *= 2 - while(TICK_USAGE > min(TICK_LIMIT_TO_RUN, Master.current_ticklimit)) - -#undef DELTA_CALC - -// This proc gets a list of all "points of interest" (poi's) that can be used by admins to track valuable mobs or atoms (such as the nuke disk). -/proc/getpois(mobs_only=0,skip_mindless=0) - var/list/mobs = sortmobs() - var/list/names = list() - var/list/pois = list() - var/list/namecounts = list() - - for(var/mob/M in mobs) - if(skip_mindless && (!M.mind && !M.ckey)) - if(!isbot(M) && !istype(M, /mob/camera/)) - continue - if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins - continue - var/name = M.name - if(name in names) - namecounts[name]++ - name = "[name] ([namecounts[name]])" - else - names.Add(name) - namecounts[name] = 1 - if(M.real_name && M.real_name != M.name) - name += " \[[M.real_name]\]" - if(M.stat == DEAD) - if(istype(M, /mob/dead/observer/)) - name += " \[ghost\]" - else - name += " \[dead\]" - pois[name] = M - - if(!mobs_only) - for(var/atom/A in GLOB.poi_list) - if(!A || !A.loc) - continue - var/name = A.name - if(names.Find(name)) - namecounts[name]++ - name = "[name] ([namecounts[name]])" - else - names.Add(name) - namecounts[name] = 1 - pois[name] = A - - return pois - -/proc/flash_color(mob_or_client, flash_color="#960000", flash_time=20) - var/client/C - if(istype(mob_or_client, /mob)) - var/mob/M = mob_or_client - if(M.client) - C = M.client - else - return - else if(istype(mob_or_client, /client)) - C = mob_or_client - - if(!istype(C)) - return - - C.color = flash_color - spawn(0) - animate(C, color = initial(C.color), time = flash_time) - -#define RANDOM_COLOUR (rgb(rand(0,255),rand(0,255),rand(0,255))) - -/proc/make_bit_triplet() - var/list/num_sample = list(1, 2, 3, 4, 5, 6, 7, 8, 9) - var/result = 0 - for(var/i = 0, i < 3, i++) - var/num = pick(num_sample) - num_sample -= num - result += (1 << num) - return result - -/proc/pixel_shift_dir(var/dir, var/amount_x = 32, var/amount_y = 32) //Returns a list with pixel_shift values that will shift an object's icon one tile in the direction passed. - amount_x = min(max(0, amount_x), 32) //No less than 0, no greater than 32. - amount_y = min(max(0, amount_x), 32) - var/list/shift = list("x" = 0, "y" = 0) - switch(dir) - if(NORTH) - shift["y"] = amount_y - if(SOUTH) - shift["y"] = -amount_y - if(EAST) - shift["x"] = amount_x - if(WEST) - shift["x"] = -amount_x - if(NORTHEAST) - shift = list("x" = amount_x, "y" = amount_y) - if(NORTHWEST) - shift = list("x" = -amount_x, "y" = amount_y) - if(SOUTHEAST) - shift = list("x" = amount_x, "y" = -amount_y) - if(SOUTHWEST) - shift = list("x" = -amount_x, "y" = -amount_y) - - return shift - -//Return a list of atoms in a location of a given type. Can be refined to look for pixel-shift. -/proc/get_atoms_of_type(var/atom/here, var/type, var/check_shift, var/shift_x = 0, var/shift_y = 0) - . = list() - if(here) - for(var/atom/thing in here) - if(istype(thing, type) && (check_shift && thing.pixel_x == shift_x && thing.pixel_y == shift_y)) - . += thing - -//gives us the stack trace from CRASH() without ending the current proc. -/proc/stack_trace(msg) - CRASH(msg) - -/datum/proc/stack_trace(msg) - CRASH(msg) - -/proc/pass() - return - -/atom/proc/Shake(pixelshiftx = 15, pixelshifty = 15, duration = 250) - var/initialpixelx = pixel_x - var/initialpixely = pixel_y - var/shiftx = rand(-pixelshiftx,pixelshiftx) - var/shifty = rand(-pixelshifty,pixelshifty) - animate(src, pixel_x = pixel_x + shiftx, pixel_y = pixel_y + shifty, time = 0.2, loop = duration) - pixel_x = initialpixelx - pixel_y = initialpixely - -/proc/params2turf(scr_loc, turf/origin, client/C) - if(!scr_loc) - return null - var/tX = splittext(scr_loc, ",") - var/tY = splittext(tX[2], ":") - var/tZ = origin.z - tY = tY[1] - tX = splittext(tX[1], ":") - tX = tX[1] - var/list/actual_view = getviewsize(C ? C.view : world.view) - tX = Clamp(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx) - tY = Clamp(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy) - return locate(tX, tY, tZ) +/* + * A large number of misc global procs. + */ + + /* Get the direction of startObj relative to endObj. + * Return values: To the right, 1. Below, 2. To the left, 3. Above, 4. Not found adjacent in cardinal directions, 0. + */ +/proc/getRelativeDirection(var/atom/movable/startObj, var/atom/movable/endObj) + if(endObj.x == startObj.x + 1 && endObj.y == startObj.y) + return EAST + + if(endObj.x == startObj.x - 1 && endObj.y == startObj.y) + return WEST + + if(endObj.y == startObj.y + 1 && endObj.x == startObj.x) + return NORTH + + if(endObj.y == startObj.y - 1 && endObj.x == startObj.x) + return SOUTH + + return 0 + +//Inverts the colour of an HTML string +/proc/invertHTML(HTMLstring) + + if(!( istext(HTMLstring) )) + CRASH("Given non-text argument!") + return + else + if(length(HTMLstring) != 7) + CRASH("Given non-HTML argument!") + return + var/textr = copytext(HTMLstring, 2, 4) + var/textg = copytext(HTMLstring, 4, 6) + var/textb = copytext(HTMLstring, 6, 8) + var/r = hex2num(textr) + var/g = hex2num(textg) + var/b = hex2num(textb) + textr = num2hex(255 - r) + textg = num2hex(255 - g) + textb = num2hex(255 - b) + if(length(textr) < 2) + textr = text("0[]", textr) + if(length(textg) < 2) + textr = text("0[]", textg) + if(length(textb) < 2) + textr = text("0[]", textb) + return text("#[][][]", textr, textg, textb) + return + +//Returns the middle-most value +/proc/dd_range(var/low, var/high, var/num) + return max(low,min(high,num)) + +//Returns whether or not A is the middle most value +/proc/InRange(var/A, var/lower, var/upper) + if(A < lower) return 0 + if(A > upper) return 0 + return 1 + + +/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. + if(!start || !end) return 0 + var/dy + var/dx + dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) + dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x) + if(!dy) + return (dx>=0)?90:270 + .=arctan(dx/dy) + if(dy<0) + .+=180 + else if(dx<0) + .+=360 + +//Returns location. Returns null if no location was found. +/proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = 0, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) +/* +Location where the teleport begins, target that will teleport, distance to go, density checking 0/1(yes/no). +Random error in tile placement x, error in tile placement y, and block offset. +Block offset tells the proc how to place the box. Behind teleport location, relative to starting location, forward, etc. +Negative values for offset are accepted, think of it in relation to North, -x is west, -y is south. Error defaults to positive. +Turf and target are seperate in case you want to teleport some distance from a turf the target is not standing on or something. +*/ + + var/dirx = 0//Generic location finding variable. + var/diry = 0 + + var/xoffset = 0//Generic counter for offset location. + var/yoffset = 0 + + var/b1xerror = 0//Generic placing for point A in box. The lower left. + var/b1yerror = 0 + var/b2xerror = 0//Generic placing for point B in box. The upper right. + var/b2yerror = 0 + + errorx = abs(errorx)//Error should never be negative. + errory = abs(errory) + //var/errorxy = round((errorx+errory)/2)//Used for diagonal boxes. + + switch(target.dir)//This can be done through equations but switch is the simpler method. And works fast to boot. + //Directs on what values need modifying. + if(1)//North + diry+=distance + yoffset+=eoffsety + xoffset+=eoffsetx + b1xerror-=errorx + b1yerror-=errory + b2xerror+=errorx + b2yerror+=errory + if(2)//South + diry-=distance + yoffset-=eoffsety + xoffset+=eoffsetx + b1xerror-=errorx + b1yerror-=errory + b2xerror+=errorx + b2yerror+=errory + if(4)//East + dirx+=distance + yoffset+=eoffsetx//Flipped. + xoffset+=eoffsety + b1xerror-=errory//Flipped. + b1yerror-=errorx + b2xerror+=errory + b2yerror+=errorx + if(8)//West + dirx-=distance + yoffset-=eoffsetx//Flipped. + xoffset+=eoffsety + b1xerror-=errory//Flipped. + b1yerror-=errorx + b2xerror+=errory + b2yerror+=errorx + + var/turf/destination=locate(location.x+dirx,location.y+diry,location.z) + + if(destination)//If there is a destination. + if(errorx||errory)//If errorx or y were specified. + var/destination_list[] = list()//To add turfs to list. + //destination_list = new() + /*This will draw a block around the target turf, given what the error is. + Specifying the values above will basically draw a different sort of block. + If the values are the same, it will be a square. If they are different, it will be a rectengle. + In either case, it will center based on offset. Offset is position from center. + Offset always calculates in relation to direction faced. In other words, depending on the direction of the teleport, + the offset should remain positioned in relation to destination.*/ + + var/turf/center = locate((destination.x+xoffset),(destination.y+yoffset),location.z)//So now, find the new center. + + //Now to find a box from center location and make that our destination. + for(var/turf/T in block(locate(center.x+b1xerror,center.y+b1yerror,location.z), locate(center.x+b2xerror,center.y+b2yerror,location.z) )) + if(density&&T.density) continue//If density was specified. + if(T.x>world.maxx || T.x<1) continue//Don't want them to teleport off the map. + if(T.y>world.maxy || T.y<1) continue + destination_list += T + if(destination_list.len) + destination = pick(destination_list) + else return + + else//Same deal here. + if(density&&destination.density) return + if(destination.x>world.maxx || destination.x<1) return + if(destination.y>world.maxy || destination.y<1) return + else return + + return destination + +// Returns true if direction is blocked from loc +// Checks if doors are open +/proc/DirBlocked(turf/loc,var/dir) + for(var/obj/structure/window/D in loc) + if(!D.density) + continue + if(D.fulltile) + return 1 + if(D.dir == dir) + return 1 + + for(var/obj/machinery/door/D in loc) + if(!D.density)//if the door is open + continue + else return 1 // if closed, it's a real, air blocking door + return 0 + +///////////////////////////////////////////////////////////////////////// + +/proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm + var/px=M.x //starting x + var/py=M.y + var/line[] = list(locate(px,py,M.z)) + var/dx=N.x-px //x distance + var/dy=N.y-py + var/dxabs=abs(dx)//Absolute value of x distance + var/dyabs=abs(dy) + var/sdx=SIGN(dx) //Sign of x distance (+ or -) + var/sdy=SIGN(dy) + var/x=dxabs>>1 //Counters for steps taken, setting to distance/2 + var/y=dyabs>>1 //Bit-shifting makes me l33t. It also makes getline() unnessecarrily fast. + var/j //Generic integer for counting + if(dxabs>=dyabs) //x distance is greater than y + for(j=0;j=dxabs) //Every dyabs steps, step once in y direction + y-=dxabs + py+=sdy + px+=sdx //Step on in x direction + line+=locate(px,py,M.z)//Add the turf to the list + else + for(j=0;j=dyabs) + x-=dyabs + px+=sdx + py+=sdy + line+=locate(px,py,M.z) + return line + +//Same as the thing below just for density and without support for atoms. +/proc/can_line(atom/source, atom/target, length = 5) + var/turf/current = get_turf(source) + var/turf/target_turf = get_turf(target) + var/steps = 0 + + while(current != target_turf) + if(steps > length) + return FALSE + if(!current) + return FALSE + if(current.density) + return FALSE + current = get_step_towards(current, target_turf) + steps++ + return TRUE + +//Returns whether or not a player is a guest using their ckey as an input +/proc/IsGuestKey(key) + if(findtext(key, "Guest-", 1, 7) != 1) //was findtextEx + return 0 + + var/i, ch, len = length(key) + + for(i = 7, i <= len, ++i) + ch = text2ascii(key, i) + if(ch < 48 || ch > 57) + return 0 + return 1 + +//Ensure the frequency is within bounds of what it should be sending/recieving at +/proc/sanitize_frequency(var/f, var/low = PUBLIC_LOW_FREQ, var/high = PUBLIC_HIGH_FREQ) + f = round(f) + f = max(low, f) + f = min(high, f) + if((f % 2) == 0) //Ensure the last digit is an odd number + f += 1 + return f + +//Turns 1479 into 147.9 +/proc/format_frequency(var/f) + return "[round(f / 10)].[f % 10]" + +/obj/proc/atmosanalyzer_scan(var/datum/gas_mixture/air_contents, mob/user, var/obj/target = src) + var/obj/icon = target + user.visible_message("[user] has used the analyzer on [target].", "You use the analyzer on [target].") + var/pressure = air_contents.return_pressure() + var/total_moles = air_contents.total_moles() + + user.show_message("Results of analysis of [bicon(icon)] [target].", 1) + if(total_moles>0) + var/o2_concentration = air_contents.oxygen/total_moles + var/n2_concentration = air_contents.nitrogen/total_moles + var/co2_concentration = air_contents.carbon_dioxide/total_moles + var/plasma_concentration = air_contents.toxins/total_moles + + var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration) + + user.show_message("Pressure: [round(pressure,0.1)] kPa", 1) + user.show_message("Nitrogen: [round(n2_concentration*100)] % ([round(air_contents.nitrogen,0.01)] moles)", 1) + user.show_message("Oxygen: [round(o2_concentration*100)] % ([round(air_contents.oxygen,0.01)] moles)", 1) + user.show_message("CO2: [round(co2_concentration*100)] % ([round(air_contents.carbon_dioxide,0.01)] moles)", 1) + user.show_message("Plasma: [round(plasma_concentration*100)] % ([round(air_contents.toxins,0.01)] moles)", 1) + if(unknown_concentration>0.01) + user.show_message("Unknown: [round(unknown_concentration*100)] % ([round(unknown_concentration*total_moles,0.01)] moles)", 1) + user.show_message("Total: [round(total_moles,0.01)] moles", 1) + user.show_message("Temperature: [round(air_contents.temperature-T0C)] °C", 1) + else + user.show_message("[target] is empty!", 1) + return + +//Picks a string of symbols to display as the law number for hacked or ion laws +/proc/ionnum() + return "[pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]" + +//When an AI is activated, it can choose from a list of non-slaved borgs to have as a slave. +/proc/freeborg() + var/select = null + var/list/borgs = list() + for(var/mob/living/silicon/robot/A in GLOB.player_list) + if(A.stat == 2 || A.connected_ai || A.scrambledcodes || istype(A,/mob/living/silicon/robot/drone)) + continue + var/name = "[A.real_name] ([A.modtype] [A.braintype])" + borgs[name] = A + + if(borgs.len) + select = input("Unshackled borg signals detected:", "Borg selection", null, null) as null|anything in borgs + return borgs[select] + +//When a borg is activated, it can choose which AI it wants to be slaved to +/proc/active_ais() + . = list() + for(var/mob/living/silicon/ai/A in GLOB.living_mob_list) + if(A.stat == DEAD) + continue + if(A.control_disabled == 1) + continue + . += A + return . + +//Find an active ai with the least borgs. VERBOSE PROCNAME HUH! +/proc/select_active_ai_with_fewest_borgs() + var/mob/living/silicon/ai/selected + var/list/active = active_ais() + for(var/mob/living/silicon/ai/A in active) + if(!selected || (selected.connected_robots > A.connected_robots)) + selected = A + + return selected + +/proc/select_active_ai(var/mob/user) + var/list/ais = active_ais() + if(ais.len) + if(user) . = input(usr,"AI signals detected:", "AI selection") in ais + else . = pick(ais) + return . + +/proc/get_sorted_mobs() + var/list/old_list = getmobs() + var/list/AI_list = list() + var/list/Dead_list = list() + var/list/keyclient_list = list() + var/list/key_list = list() + var/list/logged_list = list() + for(var/named in old_list) + var/mob/M = old_list[named] + if(issilicon(M)) + AI_list |= M + else if(isobserver(M) || M.stat == DEAD) + Dead_list |= M + else if(M.key && M.client) + keyclient_list |= M + else if(M.key) + key_list |= M + else + logged_list |= M + old_list.Remove(named) + var/list/new_list = list() + new_list += AI_list + new_list += keyclient_list + new_list += key_list + new_list += logged_list + new_list += Dead_list + return new_list + +//Returns a list of all mobs with their name +/proc/getmobs() + + var/list/mobs = sortmobs() + var/list/names = list() + var/list/creatures = list() + var/list/namecounts = list() + for(var/mob/M in mobs) + var/name = M.name + if(name in names) + namecounts[name]++ + name = "[name] ([namecounts[name]])" + else + names.Add(name) + namecounts[name] = 1 + if(M.real_name && M.real_name != M.name) + name += " \[[M.real_name]\]" + if(M.stat == DEAD) + if(istype(M, /mob/dead/observer/)) + name += " \[ghost\]" + else + name += " \[dead\]" + creatures[name] = M + + return creatures + +//Orders mobs by type then by name +/proc/sortmobs() + var/list/moblist = list() + var/list/sortmob = sortAtom(GLOB.mob_list) + for(var/mob/living/silicon/ai/M in sortmob) + moblist.Add(M) + if(M.eyeobj) + moblist.Add(M.eyeobj) + for(var/mob/living/silicon/pai/M in sortmob) + moblist.Add(M) + for(var/mob/living/silicon/robot/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/human/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/brain/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/alien/M in sortmob) + moblist.Add(M) + for(var/mob/dead/observer/M in sortmob) + moblist.Add(M) + for(var/mob/new_player/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/slime/M in sortmob) + moblist.Add(M) + for(var/mob/living/simple_animal/M in sortmob) + moblist.Add(M) + return moblist + +// Format a power value in W, kW, MW, or GW. +/proc/DisplayPower(powerused) + if(powerused < 1000) //Less than a kW + return "[powerused] W" + else if(powerused < 1000000) //Less than a MW + return "[round((powerused * 0.001), 0.01)] kW" + else if(powerused < 1000000000) //Less than a GW + return "[round((powerused * 0.000001), 0.001)] MW" + return "[round((powerused * 0.000000001), 0.0001)] GW" + +//E = MC^2 +/proc/convert2energy(var/M) + var/E = M*(SPEED_OF_LIGHT_SQ) + return E + +//M = E/C^2 +/proc/convert2mass(var/E) + var/M = E/(SPEED_OF_LIGHT_SQ) + return M + +//Forces a variable to be posative +/proc/modulus(var/M) + if(M >= 0) + return M + if(M < 0) + return -M + +/proc/get_mob_by_ckey(key) + if(!key) + return + for(var/mob/M in GLOB.mob_list) + if(M.ckey == key) + return M + +// Returns the atom sitting on the turf. +// For example, using this on a disk, which is in a bag, on a mob, will return the mob because it's on the turf. +/proc/get_atom_on_turf(var/atom/movable/M) + var/atom/loc = M + while(loc && loc.loc && !istype(loc.loc, /turf/)) + loc = loc.loc + return loc + +/* +Returns 1 if the chain up to the area contains the given typepath +0 otherwise +*/ +/atom/proc/is_found_within(var/typepath) + var/atom/A = src + while(A.loc) + if(istype(A.loc, typepath)) + return 1 + A = A.loc + return 0 + +// the on-close client verb +// called when a browser popup window is closed after registering with proc/onclose() +// if a valid atom reference is supplied, call the atom's Topic() with "close=1" +// otherwise, just reset the client mob's machine var. + + +// returns the turf located at the map edge in the specified direction relative to A +// used for mass driver +/proc/get_edge_target_turf(var/atom/A, var/direction) + + var/turf/target = locate(A.x, A.y, A.z) + if(!A || !target) + return 0 + //since NORTHEAST == NORTH & EAST, etc, doing it this way allows for diagonal mass drivers in the future + //and isn't really any more complicated + + // Note diagonal directions won't usually be accurate + if(direction & NORTH) + target = locate(target.x, world.maxy, target.z) + if(direction & SOUTH) + target = locate(target.x, 1, target.z) + if(direction & EAST) + target = locate(world.maxx, target.y, target.z) + if(direction & WEST) + target = locate(1, target.y, target.z) + + return target + +// returns turf relative to A in given direction at set range +// result is bounded to map size +// note range is non-pythagorean +// used for disposal system +/proc/get_ranged_target_turf(var/atom/A, var/direction, var/range) + + var/x = A.x + var/y = A.y + if(direction & NORTH) + y = min(world.maxy, y + range) + if(direction & SOUTH) + y = max(1, y - range) + if(direction & EAST) + x = min(world.maxx, x + range) + if(direction & WEST) + x = max(1, x - range) + + return locate(x,y,A.z) + + +// returns turf relative to A offset in dx and dy tiles +// bound to map limits +/proc/get_offset_target_turf(var/atom/A, var/dx, var/dy) + var/x = min(world.maxx, max(1, A.x + dx)) + var/y = min(world.maxy, max(1, A.y + dy)) + return locate(x,y,A.z) + +//Makes sure MIDDLE is between LOW and HIGH. If not, it adjusts it. Returns the adjusted value. +/proc/between(var/low, var/middle, var/high) + return max(min(middle, high), low) + +proc/arctan(x) + var/y=arcsin(x/sqrt(1+x*x)) + return y + +//returns random gauss number +proc/GaussRand(var/sigma) + var/x,y,rsq + do + x=2*rand()-1 + y=2*rand()-1 + rsq=x*x+y*y + while(rsq>1 || !rsq) + return sigma*y*sqrt(-2*log(rsq)/rsq) + +//returns random gauss number, rounded to 'roundto' +proc/GaussRandRound(var/sigma,var/roundto) + return round(GaussRand(sigma),roundto) + +//Will return the contents of an atom recursivly to a depth of 'searchDepth' +/atom/proc/GetAllContents(searchDepth = 5) + var/list/toReturn = list() + + for(var/atom/part in contents) + toReturn += part + if(part.contents.len && searchDepth) + toReturn += part.GetAllContents(searchDepth - 1) + + return toReturn + +//Searches contents of the atom and returns the sum of all w_class of obj/item within +/atom/proc/GetTotalContentsWeight(searchDepth = 5) + var/weight = 0 + var/list/content = GetAllContents(searchDepth) + for(var/obj/item/I in content) + weight += I.w_class + return weight + +//Step-towards method of determining whether one atom can see another. Similar to viewers() +/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate. + var/turf/current = get_turf(source) + var/turf/target_turf = get_turf(target) + var/steps = 1 + + if(current != target_turf) + current = get_step_towards(current, target_turf) + while(current != target_turf) + if(steps > length) + return 0 + if(current.opacity) + return 0 + for(var/thing in current) + var/atom/A = thing + if(A.opacity) + return 0 + current = get_step_towards(current, target_turf) + steps++ + + return 1 + +proc/is_blocked_turf(turf/T, exclude_mobs) + if(T.density) + return 1 + for(var/i in T) + var/atom/A = i + if(A.density && (!exclude_mobs || !ismob(A))) + return 1 + return 0 + +/proc/get_step_towards2(var/atom/ref , var/atom/trg) + var/base_dir = get_dir(ref, get_step_towards(ref,trg)) + var/turf/temp = get_step_towards(ref,trg) + + if(is_blocked_turf(temp)) + var/dir_alt1 = turn(base_dir, 90) + var/dir_alt2 = turn(base_dir, -90) + var/turf/turf_last1 = temp + var/turf/turf_last2 = temp + var/free_tile = null + var/breakpoint = 0 + + while(!free_tile && breakpoint < 10) + if(!is_blocked_turf(turf_last1)) + free_tile = turf_last1 + break + if(!is_blocked_turf(turf_last2)) + free_tile = turf_last2 + break + turf_last1 = get_step(turf_last1,dir_alt1) + turf_last2 = get_step(turf_last2,dir_alt2) + breakpoint++ + + if(!free_tile) return get_step(ref, base_dir) + else return get_step_towards(ref,free_tile) + + else return get_step(ref, base_dir) + +//Takes: Anything that could possibly have variables and a varname to check. +//Returns: 1 if found, 0 if not. +/proc/hasvar(var/datum/A, var/varname) + if(A.vars.Find(lowertext(varname))) return 1 + else return 0 + +//Returns: all the areas in the world +/proc/return_areas() + var/list/area/areas = list() + for(var/area/A in world) + areas += A + return areas + +//Returns: all the areas in the world, sorted. +/proc/return_sorted_areas() + return sortAtom(return_areas()) + +//Takes: Area type as text string or as typepath OR an instance of the area. +//Returns: A list of all areas of that type in the world. +/proc/get_areas(var/areatype) + if(!areatype) return null + if(istext(areatype)) areatype = text2path(areatype) + if(isarea(areatype)) + var/area/areatemp = areatype + areatype = areatemp.type + + var/list/areas = new/list() + for(var/area/N in world) + if(istype(N, areatype)) areas += N + return areas + +//Takes: Area type as text string or as typepath OR an instance of the area. +//Returns: A list of all turfs in areas of that type of that type in the world. +/proc/get_area_turfs(var/areatype) + if(!areatype) return null + if(istext(areatype)) areatype = text2path(areatype) + if(isarea(areatype)) + var/area/areatemp = areatype + areatype = areatemp.type + + var/list/turfs = new/list() + for(var/area/N in world) + if(istype(N, areatype)) + for(var/turf/T in N) turfs += T + return turfs + +//Takes: Area type as text string or as typepath OR an instance of the area. +//Returns: A list of all atoms (objs, turfs, mobs) in areas of that type of that type in the world. +/proc/get_area_all_atoms(var/areatype) + if(!areatype) return null + if(istext(areatype)) areatype = text2path(areatype) + if(isarea(areatype)) + var/area/areatemp = areatype + areatype = areatemp.type + + var/list/atoms = new/list() + for(var/area/N in world) + if(istype(N, areatype)) + for(var/atom/A in N) + atoms += A + return atoms + +/datum/coords //Simple datum for storing coordinates. + var/x_pos = null + var/y_pos = null + var/z_pos = null + +/area/proc/move_contents_to(var/area/A, var/turftoleave=null, var/direction = null) + //Takes: Area. Optional: turf type to leave behind. + //Returns: Nothing. + //Notes: Attempts to move the contents of one area to another area. + // Movement based on lower left corner. Tiles that do not fit + // into the new area will not be moved. + + if(!A || !src) return 0 + + var/list/turfs_src = get_area_turfs(src.type) + var/list/turfs_trg = get_area_turfs(A.type) + + var/src_min_x = 0 + var/src_min_y = 0 + for(var/turf/T in turfs_src) + if(T.x < src_min_x || !src_min_x) src_min_x = T.x + if(T.y < src_min_y || !src_min_y) src_min_y = T.y + + var/trg_min_x = 0 + var/trg_min_y = 0 + for(var/turf/T in turfs_trg) + if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x + if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y + + var/list/refined_src = new/list() + for(var/turf/T in turfs_src) + refined_src += T + refined_src[T] = new/datum/coords + var/datum/coords/C = refined_src[T] + C.x_pos = (T.x - src_min_x) + C.y_pos = (T.y - src_min_y) + + var/list/refined_trg = new/list() + for(var/turf/T in turfs_trg) + refined_trg += T + refined_trg[T] = new/datum/coords + var/datum/coords/C = refined_trg[T] + C.x_pos = (T.x - trg_min_x) + C.y_pos = (T.y - trg_min_y) + + var/list/fromupdate = new/list() + var/list/toupdate = new/list() + + moving: + for(var/turf/T in refined_src) + var/datum/coords/C_src = refined_src[T] + for(var/turf/B in refined_trg) + var/datum/coords/C_trg = refined_trg[B] + if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) + + var/old_dir1 = T.dir + var/old_icon_state1 = T.icon_state + var/old_icon1 = T.icon + + var/turf/X = B.ChangeTurf(T.type) + X.dir = old_dir1 + X.icon_state = old_icon_state1 + X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi + + // Give the new turf our air, if simulated + if(istype(X, /turf/simulated) && istype(T, /turf/simulated)) + var/turf/simulated/sim = X + sim.copy_air_with_tile(T) + + + /* Quick visual fix for some weird shuttle corner artefacts when on transit space tiles */ + if(direction && findtext(X.icon_state, "swall_s")) + + // Spawn a new shuttle corner object + var/obj/corner = new() + corner.loc = X + corner.density = 1 + corner.anchored = 1 + corner.icon = X.icon + corner.icon_state = replacetext(X.icon_state, "_s", "_f") + corner.tag = "delete me" + corner.name = "wall" + + // Find a new turf to take on the property of + var/turf/nextturf = get_step(corner, direction) + if(!nextturf || !istype(nextturf, /turf/space)) + nextturf = get_step(corner, turn(direction, 180)) + + + // Take on the icon of a neighboring scrolling space icon + X.icon = nextturf.icon + X.icon_state = nextturf.icon_state + + + for(var/obj/O in T) + + // Reset the shuttle corners + if(O.tag == "delete me") + X.icon = 'icons/turf/shuttle.dmi' + X.icon_state = replacetext(O.icon_state, "_f", "_s") // revert the turf to the old icon_state + X.name = "wall" + qdel(O) // prevents multiple shuttle corners from stacking + continue + if(!istype(O,/obj)) continue + O.loc.Exited(O) + O.setLoc(X,teleported=1) + O.loc.Entered(O) + for(var/mob/M in T) + if(!M.move_on_shuttle) + continue + M.loc = X + +// var/area/AR = X.loc + +// if(AR.lighting_use_dynamic) //TODO: rewrite this code so it's not messed by lighting ~Carn +// X.opacity = !X.opacity +// X.set_opacity(!X.opacity) + + toupdate += X + + if(turftoleave) + fromupdate += T.ChangeTurf(turftoleave) + else + T.ChangeTurf(T.baseturf) + + refined_src -= T + refined_trg -= B + continue moving + + if(toupdate.len) + for(var/turf/simulated/T1 in toupdate) + SSair.remove_from_active(T1) + T1.CalculateAdjacentTurfs() + SSair.add_to_active(T1,1) + + if(fromupdate.len) + for(var/turf/simulated/T2 in fromupdate) + SSair.remove_from_active(T2) + T2.CalculateAdjacentTurfs() + SSair.add_to_active(T2,1) + + + + +/proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0, var/atom/newloc = null) + if(!original) + return null + + var/obj/O = null + + if(sameloc) + O=new original.type(original.loc) + else + O=new original.type(newloc) + + if(perfectcopy) + if((O) && (original)) + var/static/list/forbidden_vars = list("type","loc","locs","vars", "parent","parent_type", "verbs","ckey","key","power_supply","contents","reagents","stat","x","y","z","group") + + for(var/V in original.vars - forbidden_vars) + if(istype(original.vars[V],/list)) + var/list/L = original.vars[V] + O.vars[V] = L.Copy() + else if(istype(original.vars[V],/datum)) + continue // this would reference the original's object, that will break when it is used or deleted. + else + O.vars[V] = original.vars[V] + if(istype(O)) + O.update_icon() + return O + +/area/proc/copy_contents_to(var/area/A , var/platingRequired = 0 ) + //Takes: Area. Optional: If it should copy to areas that don't have plating + //Returns: Nothing. + //Notes: Attempts to move the contents of one area to another area. + // Movement based on lower left corner. Tiles that do not fit + // into the new area will not be moved. + + if(!A || !src) return 0 + + var/list/turfs_src = get_area_turfs(src.type) + var/list/turfs_trg = get_area_turfs(A.type) + + var/src_min_x = 0 + var/src_min_y = 0 + for(var/turf/T in turfs_src) + if(T.x < src_min_x || !src_min_x) src_min_x = T.x + if(T.y < src_min_y || !src_min_y) src_min_y = T.y + + var/trg_min_x = 0 + var/trg_min_y = 0 + for(var/turf/T in turfs_trg) + if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x + if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y + + var/list/refined_src = new/list() + for(var/turf/T in turfs_src) + refined_src += T + refined_src[T] = new/datum/coords + var/datum/coords/C = refined_src[T] + C.x_pos = (T.x - src_min_x) + C.y_pos = (T.y - src_min_y) + + var/list/refined_trg = new/list() + for(var/turf/T in turfs_trg) + refined_trg += T + refined_trg[T] = new/datum/coords + var/datum/coords/C = refined_trg[T] + C.x_pos = (T.x - trg_min_x) + C.y_pos = (T.y - trg_min_y) + + var/list/toupdate = new/list() + + var/copiedobjs = list() + + + moving: + for(var/turf/T in refined_src) + var/datum/coords/C_src = refined_src[T] + for(var/turf/B in refined_trg) + var/datum/coords/C_trg = refined_trg[B] + if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) + + var/old_dir1 = T.dir + var/old_icon_state1 = T.icon_state + var/old_icon1 = T.icon + + if(platingRequired) + if(istype(B, /turf/space)) + continue moving + + var/turf/X = new T.type(B) + X.dir = old_dir1 + X.icon_state = old_icon_state1 + X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi + + + var/list/objs = new/list() + var/list/newobjs = new/list() + var/list/mobs = new/list() + var/list/newmobs = new/list() + + for(var/obj/O in T) + + if(!istype(O,/obj)) + continue + + objs += O + + + for(var/obj/O in objs) + newobjs += DuplicateObject(O , 1) + + + for(var/obj/O in newobjs) + O.loc = X + + for(var/mob/M in T) + + if(!M.move_on_shuttle) + continue + mobs += M + + for(var/mob/M in mobs) + newmobs += DuplicateObject(M , 1) + + for(var/mob/M in newmobs) + M.loc = X + + copiedobjs += newobjs + copiedobjs += newmobs + + + + for(var/V in T.vars) + if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key","x","y","z","contents", "luminosity", "group"))) + X.vars[V] = T.vars[V] + +// var/area/AR = X.loc + +// if(AR.lighting_use_dynamic) +// X.opacity = !X.opacity +// X.sd_set_opacity(!X.opacity) //TODO: rewrite this code so it's not messed by lighting ~Carn + + toupdate += X + + refined_src -= T + refined_trg -= B + continue moving + + + + if(toupdate.len) + for(var/turf/simulated/T1 in toupdate) + T1.CalculateAdjacentTurfs() + SSair.add_to_active(T1,1) + + + return copiedobjs + + + +proc/get_cardinal_dir(atom/A, atom/B) + var/dx = abs(B.x - A.x) + var/dy = abs(B.y - A.y) + return get_dir(A, B) & (rand() * (dx+dy) < dy ? 3 : 12) + +//chances are 1:value. anyprob(1) will always return true +proc/anyprob(value) + return (rand(1,value)==value) + +proc/view_or_range(distance = world.view , center = usr , type) + switch(type) + if("view") + . = view(distance,center) + if("range") + . = range(distance,center) + return + +proc/oview_or_orange(distance = world.view , center = usr , type) + switch(type) + if("view") + . = oview(distance,center) + if("range") + . = orange(distance,center) + return + +proc/get_mob_with_client_list() + var/list/mobs = list() + for(var/mob/M in GLOB.mob_list) + if(M.client) + mobs += M + return mobs + + +/proc/parse_zone(zone) + if(zone == "r_hand") return "right hand" + else if(zone == "l_hand") return "left hand" + else if(zone == "l_arm") return "left arm" + else if(zone == "r_arm") return "right arm" + else if(zone == "l_leg") return "left leg" + else if(zone == "r_leg") return "right leg" + else if(zone == "l_foot") return "left foot" + else if(zone == "r_foot") return "right foot" + else if(zone == "l_hand") return "left hand" + else if(zone == "r_hand") return "right hand" + else if(zone == "l_foot") return "left foot" + else if(zone == "r_foot") return "right foot" + else return zone + +/* + + Gets the turf this atom's *ICON* appears to inhabit + It takes into account: + * Pixel_x/y + * Matrix x/y + + NOTE: if your atom has non-standard bounds then this proc + will handle it, but: + * if the bounds are even, then there are an even amount of "middle" turfs, the one to the EAST, NORTH, or BOTH is picked + (this may seem bad, but you're atleast as close to the center of the atom as possible, better than byond's default loc being all the way off) + * if the bounds are odd, the true middle turf of the atom is returned + +*/ + +/proc/get_turf_pixel(atom/movable/AM) + if(!istype(AM)) + return + + //Find AM's matrix so we can use it's X/Y pixel shifts + var/matrix/M = matrix(AM.transform) + + var/pixel_x_offset = AM.pixel_x + M.get_x_shift() + var/pixel_y_offset = AM.pixel_y + M.get_y_shift() + + //Irregular objects + if(AM.bound_height != world.icon_size || AM.bound_width != world.icon_size) + var/icon/AMicon = icon(AM.icon, AM.icon_state) + pixel_x_offset += ((AMicon.Width()/world.icon_size)-1)*(world.icon_size*0.5) + pixel_y_offset += ((AMicon.Height()/world.icon_size)-1)*(world.icon_size*0.5) + qdel(AMicon) + + //DY and DX + var/rough_x = round(round(pixel_x_offset,world.icon_size)/world.icon_size) + var/rough_y = round(round(pixel_y_offset,world.icon_size)/world.icon_size) + + //Find coordinates + var/turf/T = get_turf(AM) //use AM's turfs, as it's coords are the same as AM's AND AM's coords are lost if it is inside another atom + if(!T) + return null + var/final_x = T.x + rough_x + var/final_y = T.y + rough_y + + if(final_x || final_y) + return locate(final_x, final_y, T.z) + +//Finds the distance between two atoms, in pixels +//centered = 0 counts from turf edge to edge +//centered = 1 counts from turf center to turf center +//of course mathematically this is just adding world.icon_size on again +/proc/getPixelDistance(var/atom/A, var/atom/B, var/centered = 1) + if(!istype(A)||!istype(B)) + return 0 + . = bounds_dist(A, B) + sqrt((((A.pixel_x+B.pixel_x)**2) + ((A.pixel_y+B.pixel_y)**2))) + if(centered) + . += world.icon_size + +/proc/get(atom/loc, type) + while(loc) + if(istype(loc, type)) + return loc + loc = loc.loc + return null + +/proc/get_turf_or_move(turf/location) + return get_turf(location) + + +//For objects that should embed, but make no sense being is_sharp or is_pointed() +//e.g: rods +var/list/can_embed_types = typecacheof(list( + /obj/item/stack/rods, + /obj/item/pipe)) + +/proc/can_embed(obj/item/W) + if(is_sharp(W)) + return 1 + if(is_pointed(W)) + return 1 + + if(is_type_in_typecache(W, can_embed_types)) + return 1 + +//Quick type checks for some tools +var/global/list/common_tools = list( +/obj/item/stack/cable_coil, +/obj/item/wrench, +/obj/item/weldingtool, +/obj/item/screwdriver, +/obj/item/wirecutters, +/obj/item/multitool, +/obj/item/crowbar) + +/proc/istool(O) + if(O && is_type_in_list(O, common_tools)) + return 1 + return 0 + +/proc/iswrench(O) + if(istype(O, /obj/item/wrench)) + return 1 + return 0 + +/proc/iswelder(O) + if(istype(O, /obj/item/weldingtool)) + return 1 + return 0 + +/proc/iscoil(O) + if(istype(O, /obj/item/stack/cable_coil)) + return 1 + return 0 + +/proc/iswirecutter(O) + if(istype(O, /obj/item/wirecutters)) + return 1 + return 0 + +/proc/isscrewdriver(O) + if(istype(O, /obj/item/screwdriver)) + return 1 + return 0 + +/proc/ismultitool(O) + if(istype(O, /obj/item/multitool)) + return 1 + return 0 + +/proc/iscrowbar(O) + if(istype(O, /obj/item/crowbar)) + return 1 + return 0 + +/proc/ispowertool(O)//used to check if a tool can force powered doors + if(istype(O, /obj/item/crowbar/power) || istype(O, /obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw)) + return TRUE + return FALSE + +/proc/iswire(O) + if(istype(O, /obj/item/stack/cable_coil)) + return 1 + return 0 + +/proc/is_hot(obj/item/W as obj) + if(istype(W, /obj/item/weldingtool)) + var/obj/item/weldingtool/O = W + if(O.isOn()) + return 2500 + else + return 0 + if(istype(W, /obj/item/lighter)) + var/obj/item/lighter/O = W + if(O.lit) + return 1500 + else + return 0 + if(istype(W, /obj/item/match)) + var/obj/item/match/O = W + if(O.lit == 1) + return 1000 + else + return 0 + if(istype(W, /obj/item/clothing/mask/cigarette)) + var/obj/item/clothing/mask/cigarette/O = W + if(O.lit) + return 1000 + else + return 0 + if(istype(W, /obj/item/candle)) + var/obj/item/candle/O = W + if(O.lit) + return 1000 + else + return 0 + if(istype(W, /obj/item/flashlight/flare)) + var/obj/item/flashlight/flare/O = W + if(O.on) + return 1000 + else + return 0 + if(istype(W, /obj/item/gun/energy/plasmacutter)) + return 3800 + if(istype(W, /obj/item/melee/energy)) + var/obj/item/melee/energy/O = W + if(O.active) + return 3500 + else + return 0 + if(istype(W, /obj/item/assembly/igniter)) + return 20000 + else + return 0 + +//Whether or not the given item counts as sharp in terms of dealing damage +/proc/is_sharp(obj/O) + if(!O) + return 0 + if(O.sharp) + return 1 + return 0 + +/proc/is_surgery_tool(obj/item/W as obj) + return ( \ + istype(W, /obj/item/scalpel) || \ + istype(W, /obj/item/hemostat) || \ + istype(W, /obj/item/retractor) || \ + istype(W, /obj/item/cautery) || \ + istype(W, /obj/item/bonegel) || \ + istype(W, /obj/item/bonesetter) + ) + +/proc/reverse_direction(var/dir) + switch(dir) + if(NORTH) + return SOUTH + if(NORTHEAST) + return SOUTHWEST + if(EAST) + return WEST + if(SOUTHEAST) + return NORTHWEST + if(SOUTH) + return NORTH + if(SOUTHWEST) + return NORTHEAST + if(WEST) + return EAST + if(NORTHWEST) + return SOUTHEAST + +/* +Checks if that loc and dir has a item on the wall +*/ +var/list/static/global/wall_items = typecacheof(list(/obj/machinery/power/apc, /obj/machinery/alarm, + /obj/item/radio/intercom, /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank, + /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign, + /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/door_control, + /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio/airlock, + /obj/item/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth, + /obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment, + /obj/structure/sign)) + +/proc/gotwallitem(loc, dir) + for(var/obj/O in loc) + if(is_type_in_typecache(O, wall_items)) + //Direction works sometimes + if(O.dir == dir) + return 1 + + //Some stuff doesn't use dir properly, so we need to check pixel instead + switch(dir) + if(SOUTH) + if(O.pixel_y > 10) + return 1 + if(NORTH) + if(O.pixel_y < -10) + return 1 + if(WEST) + if(O.pixel_x > 10) + return 1 + if(EAST) + if(O.pixel_x < -10) + return 1 + + //Some stuff is placed directly on the wallturf (signs) + for(var/obj/O in get_step(loc, dir)) + if(is_type_in_typecache(O, wall_items)) + if(abs(O.pixel_x) <= 10 && abs(O.pixel_y) <= 10) + return 1 + return 0 + + +proc/get_angle(atom/a, atom/b) + return atan2(b.y - a.y, b.x - a.x) + +proc/atan2(x, y) + if(!x && !y) return 0 + return y >= 0 ? arccos(x / sqrt(x * x + y * y)) : -arccos(x / sqrt(x * x + y * y)) + +/proc/format_text(text) + return replacetext(replacetext(text,"\proper ",""),"\improper ","") + +/* +Standard way to write links -Sayu +*/ + +/proc/topic_link(var/datum/D, var/arglist, var/content) + if(istype(arglist,/list)) + arglist = list2params(arglist) + return "[content]" + + + +/proc/get_location_accessible(mob/M, location) + var/covered_locations = 0 //based on body_parts_covered + var/face_covered = 0 //based on flags_inv + var/eyesmouth_covered = 0 //based on flags_cover + if(iscarbon(M)) + var/mob/living/carbon/C = M + for(var/obj/item/clothing/I in list(C.back, C.wear_mask)) + covered_locations |= I.body_parts_covered + face_covered |= I.flags_inv + eyesmouth_covered |= I.flags_cover + if(ishuman(C)) + var/mob/living/carbon/human/H = C + for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.head, H.r_ear, H.l_ear)) + covered_locations |= I.body_parts_covered + face_covered |= I.flags_inv + eyesmouth_covered |= I.flags_cover + + switch(location) + if("head") + if(covered_locations & HEAD) + return 0 + if("eyes") + if(face_covered & HIDEEYES || eyesmouth_covered & GLASSESCOVERSEYES || eyesmouth_covered & HEADCOVERSEYES) + return 0 + if("mouth") + if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH) + return 0 + if("chest") + if(covered_locations & UPPER_TORSO) + return 0 + if("groin") + if(covered_locations & LOWER_TORSO) + return 0 + if("l_arm") + if(covered_locations & ARM_LEFT) + return 0 + if("r_arm") + if(covered_locations & ARM_RIGHT) + return 0 + if("l_leg") + if(covered_locations & LEG_LEFT) + return 0 + if("r_leg") + if(covered_locations & LEG_RIGHT) + return 0 + if("l_hand") + if(covered_locations & HAND_LEFT) + return 0 + if("r_hand") + if(covered_locations & HAND_RIGHT) + return 0 + if("l_foot") + if(covered_locations & FOOT_LEFT) + return 0 + if("r_foot") + if(covered_locations & FOOT_RIGHT) + return 0 + + return 1 + +/proc/check_target_facings(mob/living/initator, mob/living/target) + /*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head. + Given how click code currently works (Nov '13), the initiating mob will be facing the target mob most of the time + That said, this proc should not be used if the change facing proc of the click code is overriden at the same time*/ + if(!ismob(target) || target.lying) + //Make sure we are not doing this for things that can't have a logical direction to the players given that the target would be on their side + return FACING_FAILED + if(initator.dir == target.dir) //mobs are facing the same direction + return FACING_SAME_DIR + if(is_A_facing_B(initator, target) && is_A_facing_B(target, initator)) //mobs are facing each other + return FACING_EACHOTHER + if(initator.dir + 2 == target.dir || initator.dir - 2 == target.dir || initator.dir + 6 == target.dir || initator.dir - 6 == target.dir) //Initating mob is looking at the target, while the target mob is looking in a direction perpendicular to the 1st + return FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR + + +atom/proc/GetTypeInAllContents(typepath) + var/list/processing_list = list(src) + var/list/processed = list() + + var/atom/found = null + + while(processing_list.len && found==null) + var/atom/A = processing_list[1] + if(istype(A, typepath)) + found = A + + processing_list -= A + + for(var/atom/a in A) + if(!(a in processed)) + processing_list |= a + + processed |= A + + return found + +/proc/random_step(atom/movable/AM, steps, chance) + var/initial_chance = chance + while(steps > 0) + if(prob(chance)) + step(AM, pick(alldirs)) + chance = max(chance - (initial_chance / steps), 0) + steps-- + +/proc/get_random_colour(var/simple, var/lower, var/upper) + var/colour + if(simple) + colour = pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF")) + else + for(var/i=1;i<=3;i++) + var/temp_col = "[num2hex(rand(lower,upper))]" + if(length(temp_col )<2) + temp_col = "0[temp_col]" + colour += temp_col + return colour + +/proc/get_distant_turf(var/turf/T,var/direction,var/distance) + if(!T || !direction || !distance) return + + var/dest_x = T.x + var/dest_y = T.y + var/dest_z = T.z + + if(direction & NORTH) + dest_y = min(world.maxy, dest_y+distance) + if(direction & SOUTH) + dest_y = max(0, dest_y-distance) + if(direction & EAST) + dest_x = min(world.maxy, dest_x+distance) + if(direction & WEST) + dest_x = max(0, dest_x-distance) + + return locate(dest_x,dest_y,dest_z) + +var/mob/dview/dview_mob = new + +//Version of view() which ignores darkness, because BYOND doesn't have it. +/proc/dview(var/range = world.view, var/center, var/invis_flags = 0) + if(!center) + return + + dview_mob.loc = center + + dview_mob.see_invisible = invis_flags + + . = view(range, dview_mob) + dview_mob.loc = null + +/mob/dview + invisibility = 101 + density = 0 + move_force = 0 + pull_force = 0 + move_resist = INFINITY + simulated = 0 + canmove = FALSE + see_in_dark = 1e6 + +/mob/dview/New() //For whatever reason, if this isn't called, then BYOND will throw a type mismatch runtime when attempting to add this to the mobs list. -Fox + +/mob/dview/Destroy() + // should never be deleted + return QDEL_HINT_LETMELIVE + +/proc/IsValidSrc(A) + if(istype(A, /datum)) + var/datum/D = A + return !QDELETED(D) + if(istype(A, /client)) + return TRUE + return FALSE + +//can a window be here, or is there a window blocking it? +/proc/valid_window_location(turf/T, dir_to_check) + if(!T) + return FALSE + for(var/obj/O in T) + if(istype(O, /obj/machinery/door/window) && (O.dir == dir_to_check || dir_to_check == FULLTILE_WINDOW_DIR)) + return FALSE + if(istype(O, /obj/structure/windoor_assembly)) + var/obj/structure/windoor_assembly/W = O + if(W.ini_dir == dir_to_check || dir_to_check == FULLTILE_WINDOW_DIR) + return FALSE + if(istype(O, /obj/structure/window)) + var/obj/structure/window/W = O + if(W.ini_dir == dir_to_check || W.ini_dir == FULLTILE_WINDOW_DIR || dir_to_check == FULLTILE_WINDOW_DIR) + return FALSE + return TRUE + +//Get the dir to the RIGHT of dir if they were on a clock +//NORTH --> NORTHEAST +/proc/get_clockwise_dir(dir) + . = angle2dir(dir2angle(dir)+45) + +//Get the dir to the LEFT of dir if they were on a clock +//NORTH --> NORTHWEST +/proc/get_anticlockwise_dir(dir) + . = angle2dir(dir2angle(dir)-45) + + +//Compare A's dir, the clockwise dir of A and the anticlockwise dir of A +//To the opposite dir of the dir returned by get_dir(B,A) +//If one of them is a match, then A is facing B +/proc/is_A_facing_B(atom/A, atom/B) + if(!istype(A) || !istype(B)) + return 0 + if(isliving(A)) + var/mob/living/LA = A + if(LA.lying) + return 0 + var/goal_dir = angle2dir(dir2angle(get_dir(B, A)+180)) + var/clockwise_A_dir = get_clockwise_dir(A.dir) + var/anticlockwise_A_dir = get_anticlockwise_dir(B.dir) + + if(A.dir == goal_dir || clockwise_A_dir == goal_dir || anticlockwise_A_dir == goal_dir) + return 1 + return 0 + +//This is just so you can stop an orbit. +//orbit() can run without it (swap orbiting for A) +//but then you can never stop it and that's just silly. +/atom/movable/var/atom/orbiting = null + +//A: atom to orbit +//radius: range to orbit at, radius of the circle formed by orbiting +//clockwise: whether you orbit clockwise or anti clockwise +//rotation_speed: how fast to rotate +//rotation_segments: the resolution of the orbit circle, less = a more block circle, this can be used to produce hexagons (6 segments) triangles (3 segments), and so on, 36 is the best default. +//pre_rotation: Chooses to rotate src 90 degress towards the orbit dir (clockwise/anticlockwise), useful for things to go "head first" like ghosts +//lockinorbit: Forces src to always be on A's turf, otherwise the orbit cancels when src gets too far away (eg: ghosts) + +/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE, lockinorbit = FALSE, forceMove = FALSE) + if(!istype(A)) + return + + if(orbiting) + stop_orbit() + + orbiting = A + var/matrix/initial_transform = matrix(transform) + var/lastloc = loc + + //Head first! + if(pre_rotation) + var/matrix/M = matrix(transform) + var/pre_rot = 90 + if(!clockwise) + pre_rot = -90 + M.Turn(pre_rot) + transform = M + + var/matrix/shift = matrix(transform) + shift.Translate(0,radius) + transform = shift + + SpinAnimation(rotation_speed, -1, clockwise, rotation_segments) + + //we stack the orbits up client side, so we can assign this back to normal server side without it breaking the orbit + transform = initial_transform + while(orbiting && orbiting == A && A.loc) + var/targetloc = get_turf(A) + if(!lockinorbit && loc != lastloc && loc != targetloc) + break + if(forceMove) + forceMove(targetloc) + else + loc = targetloc + lastloc = loc + sleep(0.6) + + if(orbiting == A) //make sure we haven't started orbiting something else. + orbiting = null + SpinAnimation(0,0) + + + +/atom/movable/proc/stop_orbit() + orbiting = null + +//Centers an image. +//Requires: +//The Image +//The x dimension of the icon file used in the image +//The y dimension of the icon file used in the image +// eg: center_image(I, 32,32) +// eg2: center_image(I, 96,96) +/proc/center_image(var/image/I, x_dimension = 0, y_dimension = 0) + if(!I) + return + + if(!x_dimension || !y_dimension) + return + + //Get out of here, punk ass kids calling procs needlessly + if((x_dimension == world.icon_size) && (y_dimension == world.icon_size)) + return I + + //Offset the image so that it's bottom left corner is shifted this many pixels + //This makes it infinitely easier to draw larger inhands/images larger than world.iconsize + //but still use them in game + var/x_offset = -((x_dimension/world.icon_size)-1)*(world.icon_size*0.5) + var/y_offset = -((y_dimension/world.icon_size)-1)*(world.icon_size*0.5) + + //Correct values under world.icon_size + if(x_dimension < world.icon_size) + x_offset *= -1 + if(y_dimension < world.icon_size) + y_offset *= -1 + + I.pixel_x = x_offset + I.pixel_y = y_offset + + return I + +//similar function to RANGE_TURFS(), but will search spiralling outwards from the center (like the above, but only turfs) +/proc/spiral_range_turfs(dist=0, center=usr, orange=0) + if(!dist) + if(!orange) + return list(center) + else + return list() + + var/turf/t_center = get_turf(center) + if(!t_center) + return list() + + var/list/L = list() + var/turf/T + var/y + var/x + var/c_dist = 1 + + if(!orange) + L += t_center + + while( c_dist <= dist ) + y = t_center.y + c_dist + x = t_center.x - c_dist + 1 + for(x in x to t_center.x+c_dist) + T = locate(x,y,t_center.z) + if(T) + L += T + + y = t_center.y + c_dist - 1 + x = t_center.x + c_dist + for(y in t_center.y-c_dist to y) + T = locate(x,y,t_center.z) + if(T) + L += T + + y = t_center.y - c_dist + x = t_center.x + c_dist - 1 + for(x in t_center.x-c_dist to x) + T = locate(x,y,t_center.z) + if(T) + L += T + + y = t_center.y - c_dist + 1 + x = t_center.x - c_dist + for(y in y to t_center.y+c_dist) + T = locate(x,y,t_center.z) + if(T) + L += T + c_dist++ + + return L + +//ultra range (no limitations on distance, faster than range for distances > 8); including areas drastically decreases performance +/proc/urange(dist=0, atom/center=usr, orange=0, areas=0) + if(!dist) + if(!orange) + return list(center) + else + return list() + + var/list/turfs = RANGE_TURFS(dist, center) + if(orange) + turfs -= get_turf(center) + . = list() + for(var/V in turfs) + var/turf/T = V + . += T + . += T.contents + if(areas) + . |= T.loc + +/proc/turf_clear(turf/T) + for(var/atom/A in T) + if(A.simulated) + return FALSE + return TRUE + +/proc/screen_loc2turf(scr_loc, turf/origin) + var/tX = splittext(scr_loc, ",") + var/tY = splittext(tX[2], ":") + var/tZ = origin.z + tY = tY[1] + tX = splittext(tX[1], ":") + tX = tX[1] + tX = max(1, min(world.maxx, origin.x + (text2num(tX) - (world.view + 1)))) + tY = max(1, min(world.maxy, origin.y + (text2num(tY) - (world.view + 1)))) + return locate(tX, tY, tZ) + +/proc/get_closest_atom(type, list, source) + var/closest_atom + var/closest_distance + for(var/A in list) + if(!istype(A, type)) + continue + var/distance = get_dist(source, A) + if(!closest_distance) + closest_distance = distance + closest_atom = A + else + if(closest_distance > distance) + closest_distance = distance + closest_atom = A + return closest_atom + +/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) + if(value == FALSE) //nothing should be calling us with a number, so this is safe + value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text + if(isnull(value)) + return + value = trim(value) + if(!isnull(value) && value != "") + matches = filter_fancy_list(matches, value) + + if(matches.len == 0) + return + + var/chosen + if(matches.len == 1) + chosen = matches[1] + else + chosen = input("Select a type", "Pick Type", matches[1]) as null|anything in matches + if(!chosen) + return + chosen = matches[chosen] + return chosen + +/proc/make_types_fancy(var/list/types) + if(ispath(types)) + types = list(types) + . = list() + for(var/type in types) + var/typename = "[type]" + var/static/list/TYPES_SHORTCUTS = list( + //longest paths comes first - otherwise they get shadowed by the more generic ones + /obj/effect/decal/cleanable = "CLEANABLE", + /obj/effect = "EFFECT", + /obj/item/ammo_casing = "AMMO", + /obj/item/book/manual = "MANUAL", + /obj/item/borg/upgrade = "BORG_UPGRADE", + /obj/item/cartridge = "PDA_CART", + /obj/item/clothing/head/helmet/space = "SPESSHELMET", + /obj/item/clothing/head = "HEAD", + /obj/item/clothing/under = "UNIFORM", + /obj/item/clothing/shoes = "SHOES", + /obj/item/clothing/suit = "SUIT", + /obj/item/clothing/gloves = "GLOVES", + /obj/item/clothing/mask/cigarette = "CIGARRETE", // oof + /obj/item/clothing/mask = "MASK", + /obj/item/clothing/glasses = "GLASSES", + /obj/item/clothing = "CLOTHING", + /obj/item/grenade/clusterbuster = "CLUSTERBUSTER", + /obj/item/grenade = "GRENADE", + /obj/item/gun = "GUN", + /obj/item/implant = "IMPLANT", + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", + /obj/item/mecha_parts/mecha_equipment/weapon = "MECHA_WEAPON", + /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", + /obj/item/melee = "MELEE", + /obj/item/mmi = "MMI", + /obj/item/nullrod = "NULLROD", + /obj/item/organ/external = "EXT_ORG", + /obj/item/organ/internal/cyberimp = "CYBERIMP", + /obj/item/organ/internal = "INT_ORG", + /obj/item/organ = "ORGAN", + /obj/item/pda = "PDA", + /obj/item/projectile = "PROJ", + /obj/item/radio/headset = "HEADSET", + /obj/item/reagent_containers/glass/beaker = "BEAKER", + /obj/item/reagent_containers/glass/bottle = "BOTTLE", + /obj/item/reagent_containers/food/pill/patch = "PATCH", + /obj/item/reagent_containers/food/pill = "PILL", + /obj/item/reagent_containers/food/drinks = "DRINK", + /obj/item/reagent_containers/food = "FOOD", + /obj/item/reagent_containers/syringe = "SYRINGE", + /obj/item/reagent_containers = "REAGENT_CONTAINERS", + /obj/item/robot_parts = "ROBOT_PARTS", + /obj/item/seeds = "SEED", + /obj/item/slime_extract = "SLIME_CORE", + /obj/item/spacepod_equipment/weaponry = "POD_WEAPON", + /obj/item/spacepod_equipment = "POD_EQUIP", + /obj/item/stack/sheet/mineral = "MINERAL", + /obj/item/stack/sheet = "SHEET", + /obj/item/stack/tile = "TILE", + /obj/item/stack = "STACK", + /obj/item/stock_parts/cell = "POWERCELL", + /obj/item/stock_parts = "STOCK_PARTS", + /obj/item/storage/firstaid = "FIRSTAID", + /obj/item/storage = "STORAGE", + /obj/item/tank = "GAS_TANK", + /obj/item/toy/crayon = "CRAYON", + /obj/item/toy = "TOY", + /obj/item = "ITEM", + /obj/machinery/atmospherics = "ATMOS_MACH", + /obj/machinery/computer = "CONSOLE", + /obj/machinery/door/airlock = "AIRLOCK", + /obj/machinery/door = "DOOR", + /obj/machinery/kitchen_machine = "KITCHEN", + /obj/machinery/portable_atmospherics/canister = "CANISTER", + /obj/machinery/portable_atmospherics = "PORT_ATMOS", + /obj/machinery/power = "POWER", + /obj/machinery/telecomms = "TCOMMS", + /obj/machinery = "MACHINERY", + /obj/mecha = "MECHA", + /obj/structure/closet/crate = "CRATE", + /obj/structure/closet = "CLOSET", + /obj/structure/statue = "STATUE", + /obj/structure/chair = "CHAIR", // oh no + /obj/structure/bed = "BED", + /obj/structure/chair/stool = "STOOL", + /obj/structure/table = "TABLE", + /obj/structure = "STRUCTURE", + /obj/vehicle = "VEHICLE", + /obj = "O", + /datum = "D", + /turf/simulated/floor = "SIM_FLOOR", + /turf/simulated/wall = "SIM_WALL", + /turf/unsimulated/floor = "UNSIM_FLOOR", + /turf/unsimulated/wall = "UNSIM_WALL", + /turf = "T", + /mob/living/carbon/alien = "XENO", + /mob/living/carbon/human = "HUMAN", + /mob/living/carbon = "CARBON", + /mob/living/silicon/robot = "CYBORG", + /mob/living/silicon/ai = "AI", + /mob/living/silicon = "SILICON", + /mob/living/simple_animal/bot = "BOT", + /mob/living/simple_animal = "SIMPLE", + /mob/living = "LIVING", + /mob = "M" + ) + for(var/tn in TYPES_SHORTCUTS) + if(copytext(typename, 1, length("[tn]/") + 1) == "[tn]/") + typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/")) + break + .[typename] = type + + +/proc/get_fancy_list_of_atom_types() + var/static/list/pre_generated_list + if(!pre_generated_list) //init + pre_generated_list = make_types_fancy(typesof(/atom)) + return pre_generated_list + + +/proc/get_fancy_list_of_datum_types() + var/static/list/pre_generated_list + if(!pre_generated_list) //init + pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom))) + return pre_generated_list + + +/proc/filter_fancy_list(list/L, filter as text) + var/list/matches = new + for(var/key in L) + var/value = L[key] + if(findtext("[key]", filter) || findtext("[value]", filter)) + matches[key] = value + return matches + +//Key thing that stops lag. Cornerstone of performance in ss13, Just sitting here, in unsorted.dm. + +//Increases delay as the server gets more overloaded, +//as sleeps aren't cheap and sleeping only to wake up and sleep again is wasteful +#define DELTA_CALC max(((max(TICK_USAGE, world.cpu) / 100) * max(Master.sleep_delta-1,1)), 1) + +//returns the number of ticks slept +/proc/stoplag(initial_delay) + if(!Master || !(Master.current_runlevel & RUNLEVELS_DEFAULT)) + sleep(world.tick_lag) + return 1 + if(!initial_delay) + initial_delay = world.tick_lag + . = 0 + var/i = DS2TICKS(initial_delay) + do + . += CEILING(i*DELTA_CALC, 1) + sleep(i*world.tick_lag*DELTA_CALC) + i *= 2 + while(TICK_USAGE > min(TICK_LIMIT_TO_RUN, Master.current_ticklimit)) + +#undef DELTA_CALC + +// This proc gets a list of all "points of interest" (poi's) that can be used by admins to track valuable mobs or atoms (such as the nuke disk). +/proc/getpois(mobs_only=0,skip_mindless=0) + var/list/mobs = sortmobs() + var/list/names = list() + var/list/pois = list() + var/list/namecounts = list() + + for(var/mob/M in mobs) + if(skip_mindless && (!M.mind && !M.ckey)) + if(!isbot(M) && !istype(M, /mob/camera/)) + continue + if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins + continue + var/name = M.name + if(name in names) + namecounts[name]++ + name = "[name] ([namecounts[name]])" + else + names.Add(name) + namecounts[name] = 1 + if(M.real_name && M.real_name != M.name) + name += " \[[M.real_name]\]" + if(M.stat == DEAD) + if(istype(M, /mob/dead/observer/)) + name += " \[ghost\]" + else + name += " \[dead\]" + pois[name] = M + + if(!mobs_only) + for(var/atom/A in GLOB.poi_list) + if(!A || !A.loc) + continue + var/name = A.name + if(names.Find(name)) + namecounts[name]++ + name = "[name] ([namecounts[name]])" + else + names.Add(name) + namecounts[name] = 1 + pois[name] = A + + return pois + +/proc/flash_color(mob_or_client, flash_color="#960000", flash_time=20) + var/client/C + if(istype(mob_or_client, /mob)) + var/mob/M = mob_or_client + if(M.client) + C = M.client + else + return + else if(istype(mob_or_client, /client)) + C = mob_or_client + + if(!istype(C)) + return + + C.color = flash_color + spawn(0) + animate(C, color = initial(C.color), time = flash_time) + +#define RANDOM_COLOUR (rgb(rand(0,255),rand(0,255),rand(0,255))) + +/proc/make_bit_triplet() + var/list/num_sample = list(1, 2, 3, 4, 5, 6, 7, 8, 9) + var/result = 0 + for(var/i = 0, i < 3, i++) + var/num = pick(num_sample) + num_sample -= num + result += (1 << num) + return result + +/proc/pixel_shift_dir(var/dir, var/amount_x = 32, var/amount_y = 32) //Returns a list with pixel_shift values that will shift an object's icon one tile in the direction passed. + amount_x = min(max(0, amount_x), 32) //No less than 0, no greater than 32. + amount_y = min(max(0, amount_x), 32) + var/list/shift = list("x" = 0, "y" = 0) + switch(dir) + if(NORTH) + shift["y"] = amount_y + if(SOUTH) + shift["y"] = -amount_y + if(EAST) + shift["x"] = amount_x + if(WEST) + shift["x"] = -amount_x + if(NORTHEAST) + shift = list("x" = amount_x, "y" = amount_y) + if(NORTHWEST) + shift = list("x" = -amount_x, "y" = amount_y) + if(SOUTHEAST) + shift = list("x" = amount_x, "y" = -amount_y) + if(SOUTHWEST) + shift = list("x" = -amount_x, "y" = -amount_y) + + return shift + +//Return a list of atoms in a location of a given type. Can be refined to look for pixel-shift. +/proc/get_atoms_of_type(var/atom/here, var/type, var/check_shift, var/shift_x = 0, var/shift_y = 0) + . = list() + if(here) + for(var/atom/thing in here) + if(istype(thing, type) && (check_shift && thing.pixel_x == shift_x && thing.pixel_y == shift_y)) + . += thing + +//gives us the stack trace from CRASH() without ending the current proc. +/proc/stack_trace(msg) + CRASH(msg) + +/datum/proc/stack_trace(msg) + CRASH(msg) + +/proc/pass() + return + +/atom/proc/Shake(pixelshiftx = 15, pixelshifty = 15, duration = 250) + var/initialpixelx = pixel_x + var/initialpixely = pixel_y + var/shiftx = rand(-pixelshiftx,pixelshiftx) + var/shifty = rand(-pixelshifty,pixelshifty) + animate(src, pixel_x = pixel_x + shiftx, pixel_y = pixel_y + shifty, time = 0.2, loop = duration) + pixel_x = initialpixelx + pixel_y = initialpixely + +/proc/params2turf(scr_loc, turf/origin, client/C) + if(!scr_loc) + return null + var/tX = splittext(scr_loc, ",") + var/tY = splittext(tX[2], ":") + var/tZ = origin.z + tY = tY[1] + tX = splittext(tX[1], ":") + tX = tX[1] + var/list/actual_view = getviewsize(C ? C.view : world.view) + tX = Clamp(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx) + tY = Clamp(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy) + return locate(tX, tY, tZ) diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index be5f4867c56..384cfb5f29a 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -12,6 +12,7 @@ GLOBAL_LIST_INIT(mime_names, file2list("config/names/mime.txt")) GLOBAL_LIST_INIT(golem_names, file2list("config/names/golem.txt")) GLOBAL_LIST_INIT(verbs, file2list("config/names/verbs.txt")) +GLOBAL_LIST_INIT(nouns, file2list("config/names/nouns.txt")) GLOBAL_LIST_INIT(adjectives, file2list("config/names/adjectives.txt")) GLOBAL_LIST_INIT(dream_strings, file2list("config/names/dreams.txt")) GLOBAL_LIST_INIT(nightmare_strings, file2list("config/names/nightmares.txt")) diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 5780e86a298..15ed4429965 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -1,4 +1,3 @@ - /obj/screen/movable/action_button var/datum/action/linked_action screen_loc = null @@ -6,18 +5,26 @@ /obj/screen/movable/action_button/Click(location,control,params) var/list/modifiers = params2list(params) if(modifiers["shift"]) - moved = 0 + if(locked) + to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") + return TRUE + moved = FALSE usr.update_action_buttons() //redraw buttons that are no longer considered "moved" - return 1 - if(usr.next_move >= world.time) // Is this needed ? + return TRUE + if(modifiers["ctrl"]) + locked = !locked + to_chat(usr, "Action button \"[name]\" [locked ? "" : "un"]locked.") + return TRUE + if(usr.next_click > world.time) return + usr.next_click = world.time + 1 linked_action.Trigger() - return 1 + return TRUE //Hide/Show Action Buttons ... Button /obj/screen/movable/action_button/hide_toggle name = "Hide Buttons" - desc = "Shift-click any button to reset its position. Alt-click to reset all buttons to their default positions." + desc = "Shift-click any button to reset its position, and Control-click it to lock/unlock its position. Alt-click this button to reset all buttons to their default positions." icon = 'icons/mob/actions/actions.dmi' icon_state = "bg_default" var/hidden = 0 @@ -25,9 +32,16 @@ /obj/screen/movable/action_button/hide_toggle/Click(location,control,params) var/list/modifiers = params2list(params) if(modifiers["shift"]) + if(locked) + to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") + return TRUE moved = FALSE usr.update_action_buttons(TRUE) return TRUE + if(modifiers["ctrl"]) + locked = !locked + to_chat(usr, "Action button \"[name]\" [locked ? "" : "un"]locked.") + return TRUE if(modifiers["alt"]) for(var/V in usr.actions) var/datum/action/A = V @@ -69,7 +83,6 @@ var/image/img = image(icon, src, hidden ? "show" : "hide") overlays += img - /obj/screen/movable/action_button/MouseEntered(location,control,params) openToolTip(usr,src,params,title = name,content = desc) @@ -77,7 +90,6 @@ /obj/screen/movable/action_button/MouseExited() closeToolTip(usr) - /mob/proc/update_action_buttons_icon() for(var/X in actions) var/datum/action/A = X @@ -122,7 +134,6 @@ client.screen += hud_used.hide_actions_toggle - #define AB_MAX_COLUMNS 10 /datum/hud/proc/ButtonNumberToScreenCoords(number) // TODO : Make this zero-indexed for readabilty diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 3081880394f..8ce4d64911b 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -177,6 +177,41 @@ desc = "You're severely malnourished. The hunger pains make moving around a chore." icon_state = "starving" +///Vampire "hunger" + +/obj/screen/alert/fat/vampire + name = "Fat" + desc = "You somehow drank too much blood, lardass. Run around the station and lose some weight." + icon_state = "v_fat" + +/obj/screen/alert/full/vampire + name = "Full" + desc = "You feel full and satisfied, but you know you will thirst for more blood soon..." + icon_state = "v_full" + +/obj/screen/alert/well_fed/vampire + name = "Well Fed" + desc = "You feel quite satisfied, but you could do with a bit more blood." + icon_state = "v_well_fed" + +/obj/screen/alert/fed/vampire + name = "Fed" + desc = "You feel moderately satisfied, but a bit more blood wouldn't hurt." + icon_state = "v_fed" + +/obj/screen/alert/hungry/vampire + name = "Hungry" + desc = "You currently thirst for blood." + icon_state = "v_hungry" + +/obj/screen/alert/starving/vampire + name = "Starving" + desc = "You're severely thirsty. The thirst pains make moving around a chore." + icon_state = "v_starving" + +//End of Vampire "hunger" + + /obj/screen/alert/hot name = "Too Hot" desc = "You're flaming hot! Get somewhere cooler and take off any insulating clothing like a fire suit." diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index 668e0e67fc7..366931cea33 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -11,6 +11,7 @@ /obj/screen/movable var/snap2grid = FALSE var/moved = FALSE + var/locked = TRUE var/x_off = -16 var/y_off = -16 @@ -20,8 +21,10 @@ /obj/screen/movable/snap snap2grid = TRUE - /obj/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) + if(locked) //no! I am locked! begone! + return + var/list/PM = params2list(params) //No screen-loc information? abort. @@ -47,7 +50,6 @@ moved = screen_loc - //Debug procs /client/proc/test_movable_UI() set category = "Debug" @@ -67,7 +69,6 @@ screen += M - /client/proc/test_snap_UI() set category = "Debug" set name = "Spawn Snap UI Object" @@ -84,4 +85,4 @@ S.screen_loc = screen_l - screen += S \ No newline at end of file + screen += S diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm new file mode 100644 index 00000000000..fa46e50f779 --- /dev/null +++ b/code/controllers/subsystem/input.dm @@ -0,0 +1,123 @@ +SUBSYSTEM_DEF(input) + name = "Input" + wait = 1 //SS_TICKER means this runs every tick + init_order = INIT_ORDER_INPUT + flags = SS_TICKER + priority = FIRE_PRIORITY_INPUT + runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY + + var/list/macro_sets + var/list/movement_keys + var/list/alt_movement_keys + +/datum/controller/subsystem/input/Initialize() + setup_default_macro_sets() + + setup_default_movement_keys() + + initialized = TRUE + + refresh_client_macro_sets() + + return ..() + +// This is for when macro sets are eventualy datumized +/datum/controller/subsystem/input/proc/setup_default_macro_sets() + var/list/static/default_macro_sets + + if(default_macro_sets) + macro_sets = default_macro_sets + return + + default_macro_sets = list( + "default" = list( + "Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=[COLOR_INPUT_DISABLED]:input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", + "O" = "ooc", + "T" = "say", + "M" = "me", + "F3" = "say", + "Back" = "\".winset \\\"input.focus=true input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs + "Any" = "\"KeyDown \[\[*\]\]\"", + "Any+UP" = "\"KeyUp \[\[*\]\]\"", + ), + "old_default" = list( + "Tab" = "\".winset \\\"mainwindow.macro=old_hotkeys map.focus=true input.background-color=[COLOR_INPUT_DISABLED]\\\"\"", + "Ctrl+T" = "say", + "Ctrl+O" = "ooc", + "F3" = "say", + ), + "old_hotkeys" = list( + "Tab" = "\".winset \\\"mainwindow.macro=old_default input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", + "O" = "ooc", + "T" = "say", + "M" = "me", + "F3" = "say", + "Back" = "\".winset \\\"input.focus=true input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs + "Any" = "\"KeyDown \[\[*\]\]\"", + "Any+UP" = "\"KeyUp \[\[*\]\]\"", + ), + ) + + // Because i'm lazy and don't want to type all these out twice + var/list/old_default = default_macro_sets["old_default"] + + var/list/static/oldmode_keys = list( + "North", "East", "South", "West", + "Northeast", "Southeast", "Northwest", "Southwest", + "Insert", "Delete", "Ctrl", "Alt", + "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", + ) + + for(var/i in 1 to oldmode_keys.len) + var/key = oldmode_keys[i] + old_default[key] = "\"KeyDown [key]\"" + old_default["[key]+UP"] = "\"KeyUp [key]\"" + + var/list/static/oldmode_ctrl_override_keys = list( + "W" = "W", "A" = "A", "S" = "S", "D" = "D", // movement + "1" = "1", "2" = "2", "3" = "3", "4" = "4", // intent + "B" = "B", // resist + "E" = "E", // quick equip + "F" = "F", // intent left + "G" = "G", // intent right + "H" = "H", // stop pulling + "Q" = "Q", // drop + "R" = "R", // throw + "X" = "X", // switch hands + "Y" = "Y", // activate item + "Z" = "Z", // activate item + ) + + for(var/i in 1 to oldmode_ctrl_override_keys.len) + var/key = oldmode_ctrl_override_keys[i] + var/override = oldmode_ctrl_override_keys[key] + old_default["Ctrl+[key]"] = "\"KeyDown [override]\"" + old_default["Ctrl+[key]+UP"] = "\"KeyUp [override]\"" + + macro_sets = default_macro_sets + +// For initially setting up or resetting to default the movement keys +/datum/controller/subsystem/input/proc/setup_default_movement_keys() + var/static/list/default_movement_keys = list( + "W" = NORTH, "A" = WEST, "S" = SOUTH, "D" = EAST, // WASD + "North" = NORTH, "West" = WEST, "South" = SOUTH, "East" = EAST, // Arrow keys & Numpad + ) + var/static/list/azerty_movement_keys = list( + "Z" = NORTH, "Q" = WEST, "S" = SOUTH, "D" = EAST, // WASD + "North" = NORTH, "West" = WEST, "South" = SOUTH, "East" = EAST, // Arrow keys & Numpad + ) + movement_keys = default_movement_keys.Copy() + alt_movement_keys = azerty_movement_keys.Copy() + +// Badmins just wanna have fun ♪ +/datum/controller/subsystem/input/proc/refresh_client_macro_sets() + var/list/clients = GLOB.clients + for(var/i in 1 to clients.len) + var/client/user = clients[i] + user.set_macros() + +/datum/controller/subsystem/input/fire() + var/list/clients = GLOB.clients // Let's sing the list cache song + for(var/i in 1 to clients.len) + var/client/C = clients[i] + C.keyLoop() diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 60718af6525..f694b6d2e75 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -21,7 +21,7 @@ /client/proc/debug_controller(controller in list("failsafe", "Master", "Ticker", "Air", "Jobs", "Sun", "Radio", "Configuration", "pAI", "Cameras", "Garbage", "Event", "Alarm", "Nano", "Vote", "Fires", - "Mob", "NPC Pool", "Shuttle", "Timer", "Weather", "Space", "Mob Hunt Server")) + "Mob", "NPC Pool", "Shuttle", "Timer", "Weather", "Space", "Mob Hunt Server","Input")) set category = "Debug" set name = "Debug Controller" set desc = "Debug the various periodic loop controllers for the game (be careful!)" @@ -97,5 +97,8 @@ if("Mob Hunt Server") debug_variables(SSmob_hunt) feedback_add_details("admin_verb","DMobHuntServer") + if("Input") + debug_variables(SSinput) + feedback_add_details("admin_verb","DInput") message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") \ No newline at end of file diff --git a/code/datums/action.dm b/code/datums/action.dm index 0f0559e0b9d..a5f63cc6fe4 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -43,6 +43,7 @@ M.actions += src if(M.client) M.client.screen += button + button.locked = TRUE M.update_action_buttons() /datum/action/proc/Remove(mob/M) @@ -52,6 +53,7 @@ if(M.client) M.client.screen -= button button.moved = FALSE //so the button appears in its normal position when given to another owner. + button.locked = FALSE M.actions -= src M.update_action_buttons() diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 290f2eda770..9b11e1c23d1 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -5,8 +5,8 @@ var/list/comp_lookup var/list/signal_procs var/signal_enabled = FALSE + var/datum_flags = NONE var/var_edited = FALSE //Warranty void if seal is broken - var/tmp/unique_datum_id = null #ifdef TESTING diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index d9845a2ce6d..adb3167d8e4 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -3,8 +3,8 @@ /datum/proc/can_vv_get(var_name) return TRUE -/client/proc/can_vv_get(var_name) - return TRUE +// /client/proc/can_vv_get(var_name) +// return TRUE /datum/proc/vv_edit_var(var_name, var_value) //called whenever a var is edited switch(var_name) @@ -18,7 +18,7 @@ . = TRUE -/client/proc/vv_edit_var(var_name, var_value) //called whenever a var is edited +/client/vv_edit_var(var_name, var_value) //called whenever a var is edited switch(var_name) if("vars") return FALSE @@ -37,7 +37,7 @@ return debug_variable(var_name, list(), 0, src) return debug_variable(var_name, vars[var_name], 0, src) -/client/proc/vv_get_var(var_name) +/client/vv_get_var(var_name) switch(var_name) if("vars") return debug_variable(var_name, list(), 0, src) @@ -57,7 +57,7 @@ .["Delete"] = "?_src_=vars;delete=[UID()]" . += "---" -/client/proc/vv_get_dropdown() +/client/vv_get_dropdown() . = list() . += "---" .["Call Proc"] = "?_src_=vars;proc_call=[UID()]" diff --git a/code/datums/helper_datums/hotkey_modes.dm b/code/datums/helper_datums/hotkey_modes.dm deleted file mode 100644 index 39254b23485..00000000000 --- a/code/datums/helper_datums/hotkey_modes.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/hotkey_mode - var/name - var/macro_hotkeys_inactive - var/macro_hotkeys_active - var/mob/my_mob - -/datum/hotkey_mode/New(mob) - my_mob = mob - -/datum/hotkey_mode/proc/set_winset_values() - winset(my_mob, null, "mainwindow.macro=[macro_hotkeys_inactive] hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5") - winset(my_mob, null, "hotkey_toggle.command=\".winset \\\"mainwindow.macro != [macro_hotkeys_inactive] ? mainwindow.macro=[macro_hotkeys_inactive] hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5 : mainwindow.macro=[macro_hotkeys_active] hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#f0f0f0\\\"\"") - -/datum/hotkey_mode/qwerty - name = "QWERTY" - macro_hotkeys_inactive = "macro" - macro_hotkeys_active = "hotkeymode" - -/datum/hotkey_mode/azerty - name = "AZERTY" - macro_hotkeys_inactive = "azertymacro" - macro_hotkeys_active = "azertyhotkeymode" - -/datum/hotkey_mode/cyborg - name = "Cyborg" - macro_hotkeys_inactive = "borgmacro" - macro_hotkeys_active = "borghotkeymode" \ No newline at end of file diff --git a/code/datums/helper_datums/input.dm b/code/datums/helper_datums/input.dm index 19205a4ab62..aa73b1e387f 100644 --- a/code/datums/helper_datums/input.dm +++ b/code/datums/helper_datums/input.dm @@ -141,6 +141,11 @@ ..() popup.add_script("autocomplete.js", 'html/browser/autocomplete.js') + for(var/i=1, i <= choices.len, i++) + var/C = choices[choices[i]] + choices[i] = url_encode(choices[i], TRUE) + choices[choices[i]] = C + /datum/async_input/autocomplete/render_prompt() return "" @@ -162,6 +167,8 @@ // Entering an invalid choice is the same as canceling if(href_list["submit"] in choices) result = href_list["submit"] + else if(url_encode(href_list["submit"], TRUE) in choices) + result = url_encode(href_list["submit"], TRUE) close() return diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 79c68a2a2d2..df9e3f8f0ef 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1440,7 +1440,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/device_tools/medgun name = "Medbeam Gun" - desc = "Medical Beam Gun, useful in prolonged firefights." + desc = "Medical Beam Gun, useful in prolonged firefights. DO NOT CROSS THE BEAMS. Crossing beams with another medbeam or attaching two beams to one target will have explosive consequences." item = /obj/item/gun/medbeam reference = "MBG" cost = 15 diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 11bd455880a..486b553bb8e 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -68,7 +68,7 @@ if(!(AM.can_be_pulled(src, state, force))) return FALSE - // If we're pulling something then drop what we're currently pulling and pull this instead. + // if we're pulling something then drop what we're currently pulling and pull this instead. if(pulling) if(state == 0) stop_pulling() @@ -118,7 +118,9 @@ if(pulling.anchored) stop_pulling() return - + if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //separated from our puller and not in the middle of a diagonal move. + pulledby.stop_pulling() + /atom/movable/proc/can_be_pulled(user, grab_state, force) if(src == user || !isturf(loc)) return FALSE @@ -141,36 +143,55 @@ . = ..() else //Diagonal move, split it into cardinal moves moving_diagonally = FIRST_DIAG_STEP - if(direct & 1) - if(direct & 4) - if(step(src, NORTH)) + var/first_step_dir + // The `&& moving_diagonally` checks are so that a forceMove taking + // place due to a Crossed, Bumped, etc. call will interrupt + // the second half of the diagonal movement, or the second attempt + // at a first half if step() fails because we hit something. + if(direct & NORTH) + if(direct & EAST) + if(step(src, NORTH) && moving_diagonally) + first_step_dir = NORTH moving_diagonally = SECOND_DIAG_STEP . = step(src, EAST) - else if(step(src, EAST)) + else if(moving_diagonally && step(src, EAST)) + first_step_dir = EAST moving_diagonally = SECOND_DIAG_STEP . = step(src, NORTH) - else if(direct & 8) - if(step(src, NORTH)) + else if(direct & WEST) + if(step(src, NORTH) && moving_diagonally) + first_step_dir = NORTH moving_diagonally = SECOND_DIAG_STEP . = step(src, WEST) - else if(step(src, WEST)) + else if(moving_diagonally && step(src, WEST)) + first_step_dir = WEST moving_diagonally = SECOND_DIAG_STEP . = step(src, NORTH) - else if(direct & 2) - if(direct & 4) - if(step(src, SOUTH)) + else if(direct & SOUTH) + if(direct & EAST) + if(step(src, SOUTH) && moving_diagonally) + first_step_dir = SOUTH moving_diagonally = SECOND_DIAG_STEP . = step(src, EAST) - else if(step(src, EAST)) + else if(moving_diagonally && step(src, EAST)) + first_step_dir = EAST moving_diagonally = SECOND_DIAG_STEP . = step(src, SOUTH) - else if(direct & 8) - if(step(src, SOUTH)) + else if(direct & WEST) + if(step(src, SOUTH) && moving_diagonally) + first_step_dir = SOUTH moving_diagonally = SECOND_DIAG_STEP . = step(src, WEST) - else if(step(src, WEST)) + else if(moving_diagonally && step(src, WEST)) + first_step_dir = WEST moving_diagonally = SECOND_DIAG_STEP . = step(src, SOUTH) + if(moving_diagonally == SECOND_DIAG_STEP) + if(!.) + setDir(first_step_dir) + else if(!inertia_moving) + inertia_next_move = world.time + inertia_move_delay + newtonian_move(direct) moving_diagonally = 0 return @@ -191,7 +212,7 @@ // Called after a successful Move(). By this point, we've already moved /atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE) SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced) - if (!inertia_moving) + if(!inertia_moving) inertia_next_move = world.time + inertia_move_delay newtonian_move(Dir) return TRUE @@ -214,6 +235,7 @@ /atom/movable/proc/forceMove(atom/destination) var/turf/old_loc = loc loc = destination + moving_diagonally = 0 if(old_loc) old_loc.Exited(src, destination) @@ -243,7 +265,7 @@ return 1 /atom/movable/proc/onTransitZ(old_z,new_z) - for(var/item in src) // Notify contents of Z-transition. This can be overridden IF we know the items contents do not care. + for(var/item in src) // Notify contents of Z-transition. This can be overridden if we know the items contents do not care. var/atom/movable/AM = item AM.onTransitZ(old_z,new_z) diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 9dec5b573e2..5fc01686200 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -297,19 +297,27 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha to_chat(owner, "They've got no blood left to give.") break if(H.stat < DEAD) - blood = min(20, H.blood_volume) // if they have less than 20 blood, give them the remnant else they get 20 blood - bloodtotal += blood / 2 //divide by 2 to counted the double suction since removing cloneloss -Melandor0 - bloodusable += blood / 2 + if(!issmall(H) || H.ckey) + blood = min(20, H.blood_volume) // if they have less than 20 blood, give them the remnant else they get 20 blood + bloodtotal += blood / 2 //divide by 2 to counted the double suction since removing cloneloss -Melandor0 + bloodusable += blood / 2 else - blood = min(5, H.blood_volume) // The dead only give 5 blood - bloodtotal += blood + if(!issmall(H) || H.ckey) + blood = min(5, H.blood_volume) // The dead only give 5 blood + bloodtotal += blood if(old_bloodtotal != bloodtotal) - to_chat(owner, "You have accumulated [bloodtotal] [bloodtotal > 1 ? "units" : "unit"] of blood[bloodusable != old_bloodusable ? ", and have [bloodusable] left to use" : ""].") + if(!issmall(H) || H.ckey) // not small OR has a ckey, monkeys with ckeys can be sucked, humanized monkeys can be sucked monkeys without ckeys cannot be sucked + to_chat(owner, "You have accumulated [bloodtotal] [bloodtotal > 1 ? "units" : "unit"] of blood[bloodusable != old_bloodusable ? ", and have [bloodusable] left to use" : ""].") check_vampire_upgrade() H.blood_volume = max(H.blood_volume - 25, 0) if(ishuman(owner)) var/mob/living/carbon/human/V = owner - V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + (blood / 2)) + if(issmall(H) && !H.ckey) + to_chat(V, "Feeding on [H] reduces your hunger, but you get no usable blood from it.") + V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + 5) + else + V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + (blood / 2)) + draining = null to_chat(owner, "You stop draining [H.name] of blood.") @@ -402,11 +410,11 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha if(!hud.vampire_blood_display) hud.vampire_blood_display = new /obj/screen() hud.vampire_blood_display.name = "Usable Blood" - hud.vampire_blood_display.icon_state = "power_display" + hud.vampire_blood_display.icon_state = "blood_display" hud.vampire_blood_display.screen_loc = "WEST:6,CENTER-1:15" hud.static_inventory += hud.vampire_blood_display hud.show_hud(hud.hud_version) - hud.vampire_blood_display.maptext = "
[bloodusable]
" + hud.vampire_blood_display.maptext = "
[bloodusable]
" handle_vampire_cloak() if(istype(owner.loc, /turf/space)) check_sun() diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index fdf24180022..22c2d47e3b9 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -160,8 +160,8 @@ title = "Shaft Miner" flag = MINER department_flag = SUPPORT - total_positions = 3 - spawn_positions = 3 + total_positions = 6 + spawn_positions = 8 is_supply = 1 supervisors = "the quartermaster" department_head = list("Head of Personnel") diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index dfb756d8c25..def012e2663 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -32,6 +32,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ created_window = /obj/structure/window/basic full_window = /obj/structure/window/full/basic merge_type = /obj/item/stack/sheet/glass + point_value = 1 /obj/item/stack/sheet/glass/fifty amount = 50 @@ -90,6 +91,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ created_window = /obj/structure/window/reinforced full_window = /obj/structure/window/full/reinforced merge_type = /obj/item/stack/sheet/rglass + point_value = 4 /obj/item/stack/sheet/rglass/cyborg materials = list() @@ -113,6 +115,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ origin_tech = "plasmatech=2;materials=2" created_window = /obj/structure/window/plasmabasic full_window = /obj/structure/window/full/plasmabasic + point_value = 19 /obj/item/stack/sheet/plasmaglass/New(loc, amount) recipes = GLOB.pglass_recipes @@ -154,6 +157,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ created_window = /obj/structure/window/plasmareinforced full_window = /obj/structure/window/full/plasmareinforced armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) + point_value = 23 /obj/item/stack/sheet/plasmarglass/New(loc, amount) recipes = GLOB.prglass_recipes diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 72c0bef16ff..8c60bcefa11 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -144,6 +144,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( origin_tech = "materials=6" sheettype = "diamond" materials = list(MAT_DIAMOND=MINERAL_MATERIAL_AMOUNT) + point_value = 25 /obj/item/stack/sheet/mineral/diamond/New() ..() @@ -156,6 +157,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( origin_tech = "materials=5" sheettype = "uranium" materials = list(MAT_URANIUM=MINERAL_MATERIAL_AMOUNT) + point_value = 20 /obj/item/stack/sheet/mineral/uranium/New() ..() @@ -170,6 +172,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT) burn_state = FLAMMABLE burntime = 5 + point_value = 20 /obj/item/stack/sheet/mineral/plasma/New() ..() @@ -196,6 +199,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( origin_tech = "materials=4" sheettype = "gold" materials = list(MAT_GOLD=MINERAL_MATERIAL_AMOUNT) + point_value = 20 /obj/item/stack/sheet/mineral/gold/New() ..() @@ -208,6 +212,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( origin_tech = "materials=4" sheettype = "silver" materials = list(MAT_SILVER=MINERAL_MATERIAL_AMOUNT) + point_value = 20 /obj/item/stack/sheet/mineral/silver/New() ..() @@ -220,6 +225,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( origin_tech = "materials=4" sheettype = "bananium" materials = list(MAT_BANANIUM=MINERAL_MATERIAL_AMOUNT) + point_value = 50 /obj/item/stack/sheet/mineral/bananium/New(loc, amount=null) ..() @@ -233,6 +239,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( sheettype = "tranquillite" materials = list(MAT_TRANQUILLITE=MINERAL_MATERIAL_AMOUNT) wall_allowed = FALSE //no tranquilite walls in code + point_value = 50 /obj/item/stack/sheet/mineral/tranquillite/New(loc, amount=null) ..() @@ -253,6 +260,7 @@ var/global/list/datum/stack_recipe/snow_recipes = list( throw_range = 3 sheettype = "titanium" materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT) + point_value = 20 var/global/list/datum/stack_recipe/titanium_recipes = list ( new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20), @@ -282,6 +290,7 @@ var/global/list/datum/stack_recipe/titanium_recipes = list ( throw_range = 3 sheettype = "plastitanium" materials = list(MAT_TITANIUM=2000, MAT_PLASMA=2000) + point_value = 45 var/global/list/datum/stack_recipe/plastitanium_recipes = list ( new/datum/stack_recipe("plas-titanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index d496348f0e8..dc1026fa299 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -105,6 +105,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list( flags = CONDUCT origin_tech = "materials=1" merge_type = /obj/item/stack/sheet/metal + point_value = 2 /obj/item/stack/sheet/metal/cyborg materials = list() @@ -151,6 +152,7 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list( flags = CONDUCT origin_tech = "materials=2" merge_type = /obj/item/stack/sheet/plasteel + point_value = 23 /obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null) recipes = plasteel_recipes diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 100704ed658..13774b0db4b 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -9,22 +9,10 @@ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") var/perunit = MINERAL_MATERIAL_AMOUNT var/sheettype = null //this is used for girders in the creation of walls/false walls + var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity. + var/created_window = null //apparently glass sheets don't share a base type for glass specifically, so each had to define these vars individually var/full_window = null //moving the var declaration to here so this can be checked cleaner until someone is willing to make them share a base type properly usesound = 'sound/items/deconstruct.ogg' toolspeed = 1 var/wall_allowed = TRUE //determines if sheet can be used in wall construction or not. - - -// Since the sheetsnatcher was consolidated into weapon/storage/bag we now use -// item/attackby() properly, making this unnecessary - -/*/obj/item/stack/sheet/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/storage/bag/sheetsnatcher)) - var/obj/item/storage/bag/sheetsnatcher/S = W - if(!S.mode) - S.add(src,user) - else - for(var/obj/item/stack/sheet/stack in locate(src.x,src.y,src.z)) - S.add(stack,user) - ..()*/ diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 0434638cc9a..f2d39dcd8ca 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -35,7 +35,7 @@ /obj/structure/mineral_door/Move() var/turf/T = loc - ..() + . = ..() move_update_air(T) /obj/structure/mineral_door/Bumped(atom/user) diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index a51f58e5ec6..591157e8bd6 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -13,7 +13,7 @@ return ..() /obj/structure/target_stake/Move() - ..() + . = ..() // Move the pinned target along with the stake if(pinned_target in view(3, src)) pinned_target.loc = loc diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index acacb4e9153..1124745d8b3 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -46,7 +46,7 @@ obj/structure/windoor_assembly/Destroy() /obj/structure/windoor_assembly/Move() var/turf/T = loc - ..() + . = ..() setDir(ini_dir) move_update_air(T) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index e63451de8b6..16851097844 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -431,7 +431,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f /obj/structure/window/Move() var/turf/T = loc - ..() + . = ..() setDir(ini_dir) move_update_air(T) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 541240beb9f..f54e28defb1 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -23,13 +23,12 @@ /turf/simulated/proc/burn_tile() return -/turf/simulated/proc/water_act(volume, temperature, source) +/turf/simulated/water_act(volume, temperature, source) + . = ..() + if(volume >= 3) MakeSlippery() - for(var/mob/living/carbon/slime/M in src) - M.apply_water() - var/hotspot = (locate(/obj/effect/hotspot) in src) if(hotspot) var/datum/gas_mixture/lowertemp = remove_air(air.total_moles()) diff --git a/code/game/turfs/simulated/floor/asteroid.dm b/code/game/turfs/simulated/floor/asteroid.dm index 43d77bd39be..5f2ad4b629c 100644 --- a/code/game/turfs/simulated/floor/asteroid.dm +++ b/code/game/turfs/simulated/floor/asteroid.dm @@ -27,6 +27,9 @@ /turf/simulated/floor/plating/asteroid/MakeDry(wet_setting) return +/turf/simulated/floor/plating/asteroid/remove_plating() + return + /turf/simulated/floor/plating/asteroid/ex_act(severity, target) switch(severity) if(3) diff --git a/code/game/turfs/simulated/floor/lava.dm b/code/game/turfs/simulated/floor/lava.dm index d1ee346b302..0882bb18766 100644 --- a/code/game/turfs/simulated/floor/lava.dm +++ b/code/game/turfs/simulated/floor/lava.dm @@ -38,6 +38,9 @@ /turf/simulated/floor/plating/lava/make_plating() return +/turf/simulated/floor/plating/lava/remove_plating() + return + /turf/simulated/floor/plating/lava/proc/is_safe() var/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile)) var/list/found_safeties = typecache_filter_list(contents, lava_safeties_typecache) diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index b18d5aca07f..2ef4602d268 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -64,10 +64,14 @@ to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.") return TRUE - else if(istype(C, /obj/item/weldingtool)) + else if(iswelder(C)) var/obj/item/weldingtool/welder = C - if(welder.isOn() && (broken || burnt)) - if(welder.remove_fuel(0, user)) + if(welder.isOn()) + if(!welder.remove_fuel(0, user)) + to_chat(user, "You need more welding fuel to complete this task.") + return TRUE + + if(broken || burnt) to_chat(user, "You fix some dents on the broken plating.") playsound(src, welder.usesound, 80, 1) overlays -= current_overlay @@ -75,8 +79,23 @@ burnt = FALSE broken = FALSE update_icon() + else + to_chat(user, "You start removing [src].") + playsound(src, welder.usesound, 100, 1) + if(do_after(user, 50 * welder.toolspeed, target = src) && welder && welder.isOn()) + to_chat(user, "You remove [src].") + new /obj/item/stack/tile/plasteel(get_turf(src)) + remove_plating(user) + return TRUE + return TRUE +/turf/simulated/floor/plating/proc/remove_plating(mob/user) + if(baseturf == /turf/space) + ReplaceWithLattice() + else + TerraformTurf(baseturf) + /turf/simulated/floor/plating/airless icon_state = "plating" name = "airless plating" @@ -216,6 +235,9 @@ ..() icon_state = "ironsand[rand(1,15)]" +/turf/simulated/floor/plating/ironsand/remove_plating() + return + /turf/simulated/floor/plating/snow name = "snow" icon = 'icons/turf/snow.dmi' @@ -224,6 +246,9 @@ /turf/simulated/floor/plating/snow/ex_act(severity) return +/turf/simulated/floor/plating/snow/remove_plating() + return + /turf/simulated/floor/snow name = "snow" icon = 'icons/turf/snow.dmi' diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 53cf1917404..e315ad26ad0 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -509,3 +509,7 @@ /turf/AllowDrop() return TRUE + +/turf/proc/water_act(volume, temperature, source) + for(var/mob/living/carbon/slime/M in src) + M.apply_water() diff --git a/code/game/world.dm b/code/game/world.dm index b7f8b9bdc98..a74870413d3 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -369,15 +369,14 @@ var/world_topic_spam_protect_time = world.timeofday if(config && config.server_tag_line) s += "
[config.server_tag_line]" + if(SSticker && ROUND_TIME > 0) + s += "
[round(ROUND_TIME / 36000)]:[add_zero(num2text(ROUND_TIME / 600 % 60), 2)], " + capitalize(get_security_level()) + else + s += "
STARTING" + s += "
" var/list/features = list() - if(SSticker) - if(master_mode && master_mode != "secret") - features += master_mode - else - features += "STARTING" - if(!enter_allowed) features += "closed" diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index a1f56c52c78..8c5d76e62e1 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -185,3 +185,4 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," else send2irc(source, "[msg] - All admins AFK ([admin_number_afk]/[admin_number_total]) or skipped ([admin_number_ignored]/[admin_number_total])") return admin_number_present + \ No newline at end of file diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index e3fe5af3263..6f6b3484924 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -17,6 +17,10 @@ feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/get_admin_say() + var/msg = input(src, null, "asay \"text\"") as text|null + cmd_admin_say(msg) + /client/proc/cmd_mentor_say(msg as text) set category = "Admin" set name = "Msay" diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 3874e26e9de..e1bbc885c75 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -43,3 +43,7 @@ say_dead_direct("[prefix] says, \"[msg]\"") feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/get_dead_say() + var/msg = input(src, null, "dsay \"text\"") as text + dsay(msg) \ No newline at end of file diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 0d5a866e6c5..f2fde8df758 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -116,7 +116,7 @@ a_right.holder_movement() /obj/item/assembly_holder/Move() - ..() + . = ..() process_movement() return diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index d6da1fb4d0e..98e59a7cbb5 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -106,7 +106,7 @@ /obj/item/assembly/infra/Move() var/t = dir - ..() + . = ..() dir = t qdel(first) diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 995ee519474..fd89434331e 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -1,4 +1,8 @@ /client + ////////////////////// + //BLACK MAGIC THINGS// + ////////////////////// + parent_type = /datum //////////////// //ADMIN THINGS// //////////////// @@ -24,7 +28,7 @@ var/adminhelped = 0 - var/gc_destroyed //Time when this object was destroyed. + // var/gc_destroyed //Time when this object was destroyed. [Inherits from datum] #ifdef TESTING var/running_find_references @@ -89,5 +93,5 @@ // If set to true, this client can interact with atoms such as buttons and doors on top of regular machinery interaction var/advanced_admin_interaction = FALSE - // Has the client been varedited by an admin? - var/var_edited = FALSE + // Has the client been varedited by an admin? [Inherits from datum now] + // var/var_edited = FALSE diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 922502698fa..4e59dc2c1cf 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -297,14 +297,14 @@ return null if(byond_build < config.minimum_client_build) alert(src, "You are using a byond build which is not supported by this server. Please use a build version of atleast [config.minimum_client_build].", "Incorrect build", "OK") - del(src) + qdel(src) return if(byond_version < SUGGESTED_CLIENT_VERSION) // Update is suggested, but not required. to_chat(src,"Your BYOND client (v: [byond_version]) is out of date. This can cause glitches. We highly suggest you download the latest client from http://www.byond.com/ before playing. ") if(IsGuestKey(key)) alert(src,"This server doesn't allow guest accounts to play. Please go to http://www.byond.com/ and register for a key.","Guest","OK") - del(src) + qdel(src) return // Change the way they should download resources. @@ -317,7 +317,6 @@ GLOB.clients += src GLOB.directory[ckey] = src - //Admin Authorisation // Automatically makes localhost connection an admin if(!config.disable_localhost_admin) @@ -365,11 +364,14 @@ . = ..() //calls mob.Login() + if(ckey in clientmessages) for(var/message in clientmessages[ckey]) to_chat(src, message) clientmessages.Remove(ckey) + if(SSinput.initialized) + set_macros() donator_check() check_ip_intel() @@ -404,8 +406,7 @@ if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them. to_chat(src, "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.") - - + //This is down here because of the browse() calls in tooltip/New() if(!tooltips) tooltips = new /datum/tooltip(src) @@ -664,7 +665,7 @@ sleep(10) // Since browse is non-instant, and kinda async to_chat(src, "
you're a huge nerd. wakka wakka doodle doop nobody's ever gonna see this, the chat system shouldn't be online by this point
") - del(src) + qdel(src) return TRUE else if (!topic || !topic["token"] || !tokens[ckey] || topic["token"] != tokens[ckey]) @@ -675,7 +676,7 @@ tokens[ckey] = cid_check_reconnect() sleep(10) //browse is queued, we don't want them to disconnect before getting the browse() command. - del(src) + qdel(src) return TRUE // We DO have their cached CID handy - compare it, now if(oldcid != computer_id) @@ -693,7 +694,7 @@ log_adminwarn("Failed Login: [key] [computer_id] [address] - CID randomizer confirmed (oldcid: [oldcid])") - del(src) + qdel(src) return TRUE else // don't shoot, I'm innocent @@ -795,18 +796,15 @@ /* Mainwindow */ winset(src, "mainwindow.saybutton", "background-color=#40628a;text-color=#FFFFFF") winset(src, "mainwindow.mebutton", "background-color=#40628a;text-color=#FFFFFF") - winset(src, "mainwindow.hotkey_toggle", "background-color=#40628a;text-color=#FFFFFF") ///// UI ELEMENTS ///// /* Mainwindow */ winset(src, "mainwindow", "background-color=#272727") winset(src, "mainwindow.mainvsplit", "background-color=#272727") winset(src, "mainwindow.tooltip", "background-color=#272727") /* Outputwindow */ - winset(src, "outputwindow.outputwindow", "background-color=#272727") winset(src, "outputwindow.browseroutput", "background-color=#272727") /* Rpane */ winset(src, "rpane", "background-color=#272727") - winset(src, "rpane.rpane", "background-color=#272727") winset(src, "rpane.rpanewindow", "background-color=#272727") /* Browserwindow */ winset(src, "browserwindow", "background-color=#272727") @@ -830,18 +828,15 @@ /* Mainwindow */ winset(src, "mainwindow.saybutton", "background-color=none;text-color=#000000") winset(src, "mainwindow.mebutton", "background-color=none;text-color=#000000") - winset(src, "mainwindow.hotkey_toggle", "background-color=none;text-color=#000000") ///// UI ELEMENTS ///// /* Mainwindow */ winset(src, "mainwindow", "background-color=none") winset(src, "mainwindow.mainvsplit", "background-color=none") winset(src, "mainwindow.tooltip", "background-color=none") /* Outputwindow */ - winset(src, "outputwindow.outputwindow", "background-color=none") winset(src, "outputwindow.browseroutput", "background-color=none") /* Rpane */ winset(src, "rpane", "background-color=none") - winset(src, "rpane.rpane", "background-color=none") winset(src, "rpane.rpanewindow", "background-color=none") /* Browserwindow */ winset(src, "browserwindow", "background-color=none") diff --git a/code/modules/client/preference/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm index 8096a707916..e164a2ab843 100644 --- a/code/modules/client/preference/preferences_toggles.dm +++ b/code/modules/client/preference/preferences_toggles.dm @@ -241,7 +241,31 @@ to_chat(usr, "You have enabled text popup limiting.") else to_chat(usr, "You have disabled text popup limiting.") + return +/client/verb/numpad_target() + set name = "Toggle Numpad targetting" + set category = "Preferences" + set desc = "This button will allow you to enable or disable Numpad Targetting" + prefs.toggles ^= NUMPAD_TARGET + prefs.save_preferences(src) + if (prefs.toggles & NUMPAD_TARGET) + to_chat(usr, "You have enabled Numpad Targetting.") + else + to_chat(usr, "You have disabled Numpad Targetting.") + return + +/client/verb/azerty_toggle() + set name = "Toggle QWERTY/AZERTY" + set category = "Preferences" + set desc = "This button will switch you between QWERTY and AZERTY control sets" + prefs.toggles ^= AZERTY + prefs.save_preferences(src) + if (prefs.toggles & AZERTY) + to_chat(usr, "You are now in AZERTY mode.") + else + to_chat(usr, "You are now in QWERTY mode.") + return /client/verb/toggle_ghost_pda() set name = "Show/Hide GhostPDA" set category = "Preferences" @@ -249,4 +273,4 @@ prefs.toggles ^= CHAT_GHOSTPDA to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTPDA) ? "see all PDA messages" : "no longer see PDA messages"].") prefs.save_preferences(src) - feedback_add_details("admin_verb","TGP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file + feedback_add_details("admin_verb","TGP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 85840d5db42..b11dfd45d68 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -110,12 +110,23 @@ /obj/item/clothing/mask/muzzle/safety name = "safety muzzle" desc = "A muzzle designed to prevent biting." - resist_time = 600 + icon_state = "muzzle_secure" + item_state = "muzzle_secure" + resist_time = 0 mute = MUZZLE_MUTE_NONE security_lock = TRUE locked = FALSE materials = list(MAT_METAL=500, MAT_GLASS=50) + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi', + "Drask" = 'icons/mob/species/drask/mask.dmi' + ) + /obj/item/clothing/mask/muzzle/safety/shock name = "shock muzzle" desc = "A muzzle designed to prevent biting. This one is fitted with a behavior correction system." diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index e42030b6622..96fd9c11c1e 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -1,7 +1,7 @@ /datum/event/disease_outbreak announceWhen = 15 - var/virus_type + var/datum/disease/advance/virus_type /datum/event/disease_outbreak/setup() announceWhen = rand(15, 30) @@ -10,9 +10,13 @@ event_announcement.Announce("Confirmed outbreak of level 7 major viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') /datum/event/disease_outbreak/start() - if(!virus_type) + if(prob(25)) virus_type = pick(/datum/disease/advance/flu, /datum/disease/advance/cold, /datum/disease/brainrot, /datum/disease/magnitis, /datum/disease/beesease, /datum/disease/anxiety, /datum/disease/fake_gbs, /datum/disease/fluspanish, /datum/disease/pierrot_throat, /datum/disease/lycan) - + else + virus_type = new /datum/disease/advance + virus_type.name = capitalize(pick(GLOB.adjectives)) + " " + capitalize(pick(GLOB.nouns,GLOB.verbs)) // random silly name + virus_type.GenerateSymptoms(1,9,6) + virus_type.AssignProperties(list("resistance" = rand(0,11), "stealth" = rand(0,2), "stage_rate" = rand(0,5), "transmittable" = rand(0,5), "severity" = rand(0,10))) for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list)) if(issmall(H)) //don't infect monkies; that's a waste continue @@ -32,8 +36,8 @@ if(H.stat == DEAD || foundAlready) continue - var/datum/disease/D - D = new virus_type() + var/datum/disease/advance/D + D = virus_type D.carrier = TRUE H.AddDisease(D) break diff --git a/code/modules/keybindings/bindings_admin.dm b/code/modules/keybindings/bindings_admin.dm new file mode 100644 index 00000000000..1413d9b0f8d --- /dev/null +++ b/code/modules/keybindings/bindings_admin.dm @@ -0,0 +1,21 @@ +/datum/admins/key_down(_key, client/user) + switch(_key) + if("F5") + user.get_admin_say() + return + if("F6") + user.admin_ghost() + return + if("F7") + player_panel_new() + return + if("F8") + user.cmd_admin_pm_panel() + return + if("F9") + user.stealth() + return + if("F10") + user.get_dead_say() + return + ..() diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm new file mode 100644 index 00000000000..6b1e0afe199 --- /dev/null +++ b/code/modules/keybindings/bindings_atom.dm @@ -0,0 +1,21 @@ +// You might be wondering why this isn't client level. If focus is null, we don't want you to move. +// Only way to do that is to tie the behavior into the focus's keyLoop(). + +/atom/movable/keyLoop(client/user) + if(!user.keys_held["Ctrl"]) + var/movement_dir = NONE + var/list/movement = SSinput.movement_keys + if(user.prefs.toggles & AZERTY) + movement = SSinput.alt_movement_keys + for(var/_key in user.keys_held) + movement_dir = movement_dir | movement[_key] + if(user.next_move_dir_add) + movement_dir |= user.next_move_dir_add + if(user.next_move_dir_sub) + movement_dir &= ~user.next_move_dir_sub + // Sanity checks in case you hold left and right and up to make sure you only go up + if((movement_dir & NORTH) && (movement_dir & SOUTH)) + movement_dir &= ~(NORTH|SOUTH) + if((movement_dir & EAST) && (movement_dir & WEST)) + movement_dir &= ~(EAST|WEST) + user.Move(get_step(src, movement_dir), movement_dir) \ No newline at end of file diff --git a/code/modules/keybindings/bindings_carbon.dm b/code/modules/keybindings/bindings_carbon.dm new file mode 100644 index 00000000000..81784696b35 --- /dev/null +++ b/code/modules/keybindings/bindings_carbon.dm @@ -0,0 +1,20 @@ +/mob/living/carbon/key_down(_key, client/user) + user.keys_held[_key] = world.time + if(!user.keys_held["Shift"]) + switch(_key) + if("R", "Southwest") // Southwest is End + toggle_throw_mode() + return + if("1") + a_intent_change("help") + return + if("2") + a_intent_change("disarm") + return + if("3") + a_intent_change("grab") + return + if("4") + a_intent_change("harm") + return + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm new file mode 100644 index 00000000000..75c30f232b5 --- /dev/null +++ b/code/modules/keybindings/bindings_client.dm @@ -0,0 +1,56 @@ +// Clients aren't datums so we have to define these procs indpendently. +// These verbs are called for all key press and release events +/client/verb/keyDown(_key as text) + set instant = TRUE + set hidden = TRUE + keys_held[_key] = world.time + var/movement = SSinput.movement_keys[_key] + if (prefs.toggles & AZERTY) movement = SSinput.alt_movement_keys[_key] + if(!(next_move_dir_sub & movement) && !keys_held["Ctrl"]) + next_move_dir_add |= movement + + // Client-level keybindings are ones anyone should be able to do at any time + // Things like taking screenshots, hitting tab, and adminhelps. + + switch(_key) + if("F1") + if(keys_held["Ctrl"] && keys_held["Shift"]) // Is this command ever used? + winset(src, null, "command=.options") + else + adminhelp() + return + if("F2") // Screenshot. Hold shift to choose a name and location to save in + ooc() + return + if("F4") + mob.me_verb() + return + if("F12") // Toggles minimal HUD + mob.button_pressed_F12() + return + + if(holder) + holder.key_down(_key, src) + if(mob.focus) + mob.focus.key_down(_key, src) + +/client/verb/keyUp(_key as text) + set instant = TRUE + set hidden = TRUE + keys_held -= _key + var/movement = SSinput.movement_keys[_key] + if (prefs.toggles & AZERTY) movement = SSinput.alt_movement_keys[_key] + if(!(next_move_dir_add & movement)) + next_move_dir_sub |= movement + + if(holder) + holder.key_up(_key, src) + if(mob.focus) + mob.focus.key_up(_key, src) + +// Called every game tick +/client/keyLoop() + if(holder) + holder.keyLoop(src) + if(mob.focus) + mob.focus.keyLoop(src) \ No newline at end of file diff --git a/code/modules/keybindings/bindings_human.dm b/code/modules/keybindings/bindings_human.dm new file mode 100644 index 00000000000..5e8ced96ab6 --- /dev/null +++ b/code/modules/keybindings/bindings_human.dm @@ -0,0 +1,80 @@ +/mob/living/carbon/human/key_down(_key, client/user) + if(_key == "H") + var/obj/item/clothing/accessory/holster/H = null + if(istype(w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/S = w_uniform + if(S.accessories.len) + H = locate() in S.accessories + if (!H) + return + if(!H.holstered) + if(!istype(get_active_hand(), /obj/item/gun)) + to_chat(usr, "You need your gun equiped to holster it.") + return + var/obj/item/gun/W = get_active_hand() + H.holster(W, usr) + else + H.unholster(usr) + if(client.keys_held["Shift"]) + switch(_key) + if("E") // Put held thing in belt or take out most recent thing from belt + quick_equip() // Implementing the storage component is going to take way too long + // var/obj/item/thing = get_active_hand() + // var/obj/item/equipped_belt = get_item_by_slot(slot_belt) + // if(!equipped_belt) // We also let you equip a belt like this + // if(!thing) + // to_chat(user, "You have no belt to take something out of.") + // return + // if(equip_to_slot_if_possible(thing, slot_belt)) + // update_inv_r_hand() + // update_inv_l_hand() + // return + // if(!SEND_SIGNAL(equipped_belt, COMSIG_CONTAINS_STORAGE)) // not a storage item + // if(!thing) + // equipped_belt.attack_hand(src) + // else + // to_chat(user, "You can't fit anything in.") + // return + // if(thing) // put thing in belt + // if(!SEND_SIGNAL(equipped_belt, COMSIG_TRY_STORAGE_INSERT, thing, user.mob)) + // to_chat(user, "You can't fit anything in.") + // return + // if(!equipped_belt.contents.len) // nothing to take out + // to_chat(user, "There's nothing in your belt to take out.") + // return + // var/obj/item/stored = equipped_belt.contents[equipped_belt.contents.len] + // if(!stored || stored.on_found(src)) + // return + // stored.attack_hand(src) // take out thing from belt + // return + + /* if("B") // Put held thing in backpack or take out most recent thing from backpack + var/obj/item/thing = get_active_hand() + var/obj/item/equipped_back = get_item_by_slot(slot_back) + if(!equipped_back) // We also let you equip a backpack like this + if(!thing) + to_chat(user, "You have no backpack to take something out of.") + return + if(equip_to_slot_if_possible(thing, slot_back)) + update_inv_r_hand() + update_inv_l_hand() + return + if(!SEND_SIGNAL(equipped_back, COMSIG_CONTAINS_STORAGE)) // not a storage item + if(!thing) + equipped_back.attack_hand(src) + else + to_chat(user, "You can't fit anything in.") + return + if(thing) // put thing in backpack + if(!SEND_SIGNAL(equipped_back, COMSIG_TRY_STORAGE_INSERT, thing, user.mob)) + to_chat(user, "You can't fit anything in.") + return + if(!equipped_back.contents.len) // nothing to take out + to_chat(user, "There's nothing in your backpack to take out.") + return + var/obj/item/stored = equipped_back.contents[equipped_back.contents.len] + if(!stored || stored.on_found(src)) + return + stored.attack_hand(src) // take out thing from backpack + return */ + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_living.dm b/code/modules/keybindings/bindings_living.dm new file mode 100644 index 00000000000..241bc15b608 --- /dev/null +++ b/code/modules/keybindings/bindings_living.dm @@ -0,0 +1,7 @@ +/mob/living/key_down(_key, client/user) + switch(_key) + if("B") + resist() + return + + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_mob.dm b/code/modules/keybindings/bindings_mob.dm new file mode 100644 index 00000000000..4ede6b63c7b --- /dev/null +++ b/code/modules/keybindings/bindings_mob.dm @@ -0,0 +1,145 @@ +// Technically the client argument is unncessary here since that SHOULD be src.client but let's not assume things +// All it takes is one badmin setting their focus to someone else's client to mess things up +// Or we can have NPC's send actual keypresses and detect that by seeing no client + +/mob/key_down(_key, client/user) + if(user.prefs.toggles & AZERTY) + switch(_key) + if("Delete") + if(!pulling) + to_chat(src, "You are not pulling anything.") + else + stop_pulling() + return + if("Insert", "G") + a_intent_change(INTENT_HOTKEY_RIGHT) + return + if("F") + a_intent_change(INTENT_HOTKEY_LEFT) + return + if("X", "Northeast") // Northeast is Page-up + swap_hand() + return + if("Y", "W", "Southeast") // Southeast is Page-down + mode() // attack_self(). No idea who came up with "mode()" + return + if("A", "Northwest") // Northwest is Home + var/obj/item/I = get_active_hand() + if(!I) + to_chat(src, "You have nothing to drop in your hand!") + else + drop_item(I) + return + if("E") + quick_equip() + return + if("Alt") + toggle_move_intent() + return + else + switch(_key) + if("Delete") + if(!pulling) + to_chat(src, "You are not pulling anything.") + else + stop_pulling() + return + if("Insert", "G") + a_intent_change(INTENT_HOTKEY_RIGHT) + return + if("F") + a_intent_change(INTENT_HOTKEY_LEFT) + return + if("X", "Northeast") // Northeast is Page-up + swap_hand() + return + if("Y", "Z", "Southeast") // Southeast is Page-down + mode() // attack_self(). No idea who came up with "mode()" + return + if("Q", "Northwest") // Northwest is Home + var/obj/item/I = get_active_hand() + if(!I) + to_chat(src, "You have nothing to drop in your hand!") + else + drop_item(I) + return + if("E") + quick_equip() + return + if("Alt") + toggle_move_intent() + return + //Bodypart selections + if(client.prefs.toggles & NUMPAD_TARGET) + switch(_key) + if("Numpad8") + user.body_toggle_head() + return + if("Numpad4") + user.body_r_arm() + return + if("Numpad5") + user.body_chest() + return + if("Numpad6") + user.body_l_arm() + return + if("Numpad1") + user.body_r_leg() + return + if("Numpad2") + user.body_groin() + return + if("Numpad3") + user.body_l_leg() + return + else + switch(_key) + if("Numpad1") + a_intent_change("help") + return + if("Numpad2") + a_intent_change("disarm") + return + if("Numpad3") + a_intent_change("grab") + return + if("Numpad4") + a_intent_change("harm") + return + if(client.keys_held["Ctrl"] && client.prefs.toggles & AZERTY) + switch(SSinput.alt_movement_keys[_key]) + if(NORTH) + northface() + return + if(SOUTH) + southface() + return + if(WEST) + westface() + return + if(EAST) + eastface() + return + else if(client.keys_held["Ctrl"]) + switch(SSinput.movement_keys[_key]) + if(NORTH) + northface() + return + if(SOUTH) + southface() + return + if(WEST) + westface() + return + if(EAST) + eastface() + return + return ..() + +/mob/key_up(_key, client/user) + switch(_key) + if("Alt") + toggle_move_intent() + return + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_robot.dm b/code/modules/keybindings/bindings_robot.dm new file mode 100644 index 00000000000..a6b3cd3f21e --- /dev/null +++ b/code/modules/keybindings/bindings_robot.dm @@ -0,0 +1,15 @@ +/mob/living/silicon/robot/key_down(_key, client/user) + switch(_key) + if("1", "2", "3") + toggle_module(text2num(_key)) + return + if("4") + a_intent_change(INTENT_HOTKEY_LEFT) + return + if("X") + cycle_modules() + return + if("Q") + uneq_active() + return + return ..() \ No newline at end of file diff --git a/code/modules/keybindings/focus.dm b/code/modules/keybindings/focus.dm new file mode 100644 index 00000000000..9cfbf36c5d3 --- /dev/null +++ b/code/modules/keybindings/focus.dm @@ -0,0 +1,8 @@ +/mob + var/datum/focus //What receives our keyboard inputs. src by default + +/mob/proc/set_focus(datum/new_focus) + if(focus == new_focus) + return + focus = new_focus + reset_perspective(focus) //Maybe this should be done manually? You figure it out, reader \ No newline at end of file diff --git a/code/modules/keybindings/readme.md b/code/modules/keybindings/readme.md new file mode 100644 index 00000000000..f57d8d55ffa --- /dev/null +++ b/code/modules/keybindings/readme.md @@ -0,0 +1,42 @@ +# In-code keypress handling system + +This whole system is heavily based off of forum_account's keyboard library. +Thanks to forum_account for saving the day, the library can be found +[here](https://secure.byond.com/developer/Forum_account/Keyboard)! + +.dmf macros have some very serious shortcomings. For example, they do not allow reusing parts +of one macro in another, so giving cyborgs their own shortcuts to swap active module couldn't +inherit the movement that all mobs should have anyways. The webclient only supports one macro, +so having more than one was problematic. Additionally each keybind has to call an actual +verb, which meant a lot of hidden verbs that just call one other proc. Also our existing +macro was really bad and tied unrelated behavior into `Northeast()`, `Southeast()`, `Northwest()`, +and `Southwest()`. + +The basic premise of this system is to not screw with .dmf macro setup at all and handle +pressing those keys in the code instead. We have every key call `client.keyDown()` +or `client.keyUp()` with the pressed key as an argument. Certain keys get processed +directly by the client because they should be doable at any time, then we call +`keyDown()` or `keyUp()` on the client's holder and the client's mob's focus. +By default `mob.focus` is the mob itself, but you can set it to any datum to give control of a +client's keypresses to another object. This would be a good way to handle a menu or driving +a mech. You can also set it to null to disregard input from a certain user. + +Movement is handled by having each client call `client.keyLoop()` every game tick. +As above, this calls holder and `focus.keyLoop()`. `atom/movable/keyLoop()` handles movement +Try to keep the calculations in this proc light. It runs every tick for every client after all! + +You can also tell which keys are being held down now. Each client a list of keys pressed called +`keys_held`. Each entry is a key as a text string associated with the world.time when it was +pressed. + +No client-set keybindings at this time, but it shouldn't be too hard if someone wants. + +Notes about certain keys: + +* `Tab` has client-sided behavior but acts normally +* `T`, `O`, and `M` move focus to the input when pressed. This fires the keyUp macro right away. +* `\` needs to be escaped in the dmf so any usage is `\\` + +You cannot `TICK_CHECK` or check `world.tick_usage` inside of procs called by key down and up +events. They happen outside of a byond tick and have no meaning there. Key looping +works correctly since it's part of a subsystem, not direct input. \ No newline at end of file diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm new file mode 100644 index 00000000000..ad87622b709 --- /dev/null +++ b/code/modules/keybindings/setup.dm @@ -0,0 +1,46 @@ +/client + var/list/keys_held = list() // A list of any keys held currently + // These next two vars are to apply movement for keypresses and releases made while move delayed. + // Because discarding that input makes the game less responsive. + var/next_move_dir_add // On next move, add this dir to the move that would otherwise be done + var/next_move_dir_sub // On next move, subtract this dir from the move that would otherwise be done + +// Set a client's focus to an object and override these procs on that object to let it handle keypresses + +/datum/proc/key_down(key, client/user) // Called when a key is pressed down initially + return +/datum/proc/key_up(key, client/user) // Called when a key is released + return +/datum/proc/keyLoop(client/user) // Called once every frame + set waitfor = FALSE + return + +// removes all the existing macros +/client/proc/erase_all_macros() + var/list/macro_sets = params2list(winget(src, null, "macros")) + var/erase_output = "" + for(var/i in 1 to macro_sets.len) + var/setname = macro_sets[i] + var/list/macro_set = params2list(winget(src, "[setname].*", "command")) // The third arg doesnt matter here as we're just removing them all + for(var/k in 1 to macro_set.len) + var/list/split_name = splittext(macro_set[k], ".") + var/macro_name = "[split_name[1]].[split_name[2]]" // [3] is "command" + erase_output = "[erase_output];[macro_name].parent=null" + winset(src, null, erase_output) + +/client/proc/set_macros() + set waitfor = FALSE + + erase_all_macros() + + var/list/macro_sets = SSinput.macro_sets + for(var/i in 1 to macro_sets.len) + var/setname = macro_sets[i] + if(setname != "default") + winclone(src, "default", setname) + var/list/macro_set = macro_sets[setname] + for(var/k in 1 to macro_set.len) + var/key = macro_set[k] + var/command = macro_set[key] + winset(src, "[setname]-\ref[key]", "parent=[setname];name=[key];command=[command]") + winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED] mainwindow.macro=default") diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index d846e065761..9a88dd50259 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -238,6 +238,9 @@ /obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O) return isitem(O) +/obj/machinery/smartfridge/survival_pod/default_unfasten_wrench() + return FALSE + /obj/machinery/smartfridge/survival_pod/empty name = "dusty survival pod storage" desc = "A heated storage unit. This one's seen better days." diff --git a/code/modules/mining/explorer_gear.dm b/code/modules/mining/explorer_gear.dm index 0cad683438f..a9464efe959 100644 --- a/code/modules/mining/explorer_gear.dm +++ b/code/modules/mining/explorer_gear.dm @@ -1,44 +1,44 @@ -/****************Explorer's Suit and Mask****************/ -/obj/item/clothing/suit/hooded/explorer - name = "explorer suit" - desc = "An armoured suit for exploring harsh environments." - icon_state = "explorer" - item_state = "explorer" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - hoodtype = /obj/item/clothing/head/hooded/explorer - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) - allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) - resistance_flags = FIRE_PROOF - hide_tail_by_species = list("Vox" , "Vulpkanin" , "Unathi" , "Tajaran") - - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi', - "Drask" = 'icons/mob/species/drask/suit.dmi', - "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', - "Unathi" = 'icons/mob/species/unathi/suit.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi' - ) - -/obj/item/clothing/head/hooded/explorer - name = "explorer hood" - desc = "An armoured hood for exploring harsh environments." - icon_state = "explorer" - item_state = "explorer" - body_parts_covered = HEAD - flags = BLOCKHAIR | NODROP - flags_cover = HEADCOVERSEYES - min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) - resistance_flags = FIRE_PROOF - - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/head.dmi', - "Drask" = 'icons/mob/species/drask/head.dmi', - "Grey" = 'icons/mob/species/grey/head.dmi', - "Skrell" = 'icons/mob/species/skrell/head.dmi' +/****************Explorer's Suit and Mask****************/ +/obj/item/clothing/suit/hooded/explorer + name = "explorer suit" + desc = "An armoured suit for exploring harsh environments." + icon_state = "explorer" + item_state = "explorer" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + hoodtype = /obj/item/clothing/head/hooded/explorer + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) + allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) + resistance_flags = FIRE_PROOF + hide_tail_by_species = list("Vox" , "Vulpkanin" , "Unathi" , "Tajaran") + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi', + "Drask" = 'icons/mob/species/drask/suit.dmi', + "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', + "Unathi" = 'icons/mob/species/unathi/suit.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi' + ) + +/obj/item/clothing/head/hooded/explorer + name = "explorer hood" + desc = "An armoured hood for exploring harsh environments." + icon_state = "explorer" + item_state = "explorer" + body_parts_covered = HEAD + flags = BLOCKHAIR | NODROP + flags_cover = HEADCOVERSEYES + min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) + resistance_flags = FIRE_PROOF + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi', + "Drask" = 'icons/mob/species/drask/head.dmi', + "Grey" = 'icons/mob/species/grey/head.dmi', + "Skrell" = 'icons/mob/species/skrell/head.dmi' ) \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index d3e22e5bca2..fb2b915f146 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST(labor_sheet_values) + /**********************Prisoners' Console**************************/ /obj/machinery/mineral/labor_claim_console @@ -5,153 +7,153 @@ desc = "A stacking console with an electromagnetic writer, used to track ore mined by prisoners." icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "console" - density = 0 - anchored = 1 - var/obj/machinery/mineral/stacking_machine/laborstacker/machine = null + density = FALSE + var/obj/machinery/mineral/stacking_machine/laborstacker/stacking_machine = null var/machinedir = SOUTH var/obj/item/card/id/prisoner/inserted_id var/obj/machinery/door/airlock/release_door var/door_tag = "prisonshuttle" - var/use_release_door = 0 var/obj/item/radio/intercom/announcer - -/obj/machinery/mineral/labor_claim_console/New() - ..() +/obj/machinery/mineral/labor_claim_console/Initialize() + . = ..() announcer = new /obj/item/radio/intercom(null) announcer.config(list("Security" = 0)) + locate_stacking_machine() - spawn(7) - src.machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) - var/t - for(var/obj/machinery/door/airlock/d in range(5,src)) - t = d.id_tag - if(t == src.door_tag) - src.release_door = d - if(machine && (release_door || !use_release_door)) - machine.CONSOLE = src + if(!GLOB.labor_sheet_values) + var/sheet_list = list() + for(var/sheet_type in subtypesof(/obj/item/stack/sheet)) + var/obj/item/stack/sheet/sheet = sheet_type + if(!initial(sheet.point_value) || (initial(sheet.merge_type) && initial(sheet.merge_type) != sheet_type)) //ignore no-value sheets and x/fifty subtypes + continue + sheet_list += list(list("ore" = initial(sheet.name), "value" = initial(sheet.point_value))) + GLOB.labor_sheet_values = sheet_list + +/obj/machinery/mineral/labor_claim_console/Destroy() + . = ..() + QDEL_NULL(announcer) + +/proc/cmp_sheet_list(list/a, list/b) + return a["value"] - b["value"] + +/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/card/id/prisoner)) + if(!inserted_id) + if(!user.unEquip(I)) + return + I.forceMove(src) + inserted_id = I + to_chat(user, "You insert [I].") + SSnanoui.update_uis(src) + return else - qdel(src) + to_chat(user, "There's an ID inserted already.") + return ..() + +/obj/machinery/mineral/labor_claim_console/attack_hand(mob/user) + ui_interact(user) + +/obj/machinery/mineral/labor_claim_console/attack_ghost(mob/user) + attack_hand(user) + +/obj/machinery/mineral/labor_claim_console/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "labor_claim_console.tmpl", name, 450, 625, state) + ui.open() + +/obj/machinery/mineral/labor_claim_console/ui_data(mob/user) + var/list/data = list() + var/can_go_home = FALSE + + data["emagged"] = (emagged) ? TRUE : FALSE + if(inserted_id) + data["id"] = inserted_id + data["id_name"] = inserted_id.registered_name + data["points"] = inserted_id.points + data["goal"] = inserted_id.goal + if(check_auth()) + can_go_home = TRUE + + if(stacking_machine) + data["unclaimed_points"] = stacking_machine.points + + data["ores"] = GLOB.labor_sheet_values + data["can_go_home"] = can_go_home + + return data + +/obj/machinery/mineral/labor_claim_console/Topic(href, href_list) + if(..()) + return TRUE + + if(href_list["handle_id"]) + if(inserted_id) + if(!usr.put_in_hands(inserted_id)) + inserted_id.forceMove(get_turf(src)) + inserted_id = null + else + var/obj/item/I = usr.get_active_hand() + if(istype(I, /obj/item/card/id/prisoner)) + if(!usr.unEquip(I)) + return + I.forceMove(src) + inserted_id = I + if(href_list["claim_points"]) + inserted_id.points += stacking_machine.points + stacking_machine.points = 0 + to_chat(usr, "Points transferred.") + if(href_list["move_shuttle"]) + if(!alone_in_area(get_area(src), usr)) + to_chat(usr, "Prisoners are only allowed to be released while alone.") + else + switch(SSshuttle.moveShuttle("laborcamp", "laborcamp_home", TRUE)) + if(1) + to_chat(usr, "Shuttle not found.") + if(2) + to_chat(usr, "Shuttle already at station.") + if(3) + to_chat(usr, "No permission to dock could be granted.") + else + if(!(emagged)) + var/message = "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval." + announcer.autosay(message, "Labor Camp Controller", "Security") + to_chat(usr, "Shuttle received message and will be sent shortly.") + + return TRUE /obj/machinery/mineral/labor_claim_console/proc/check_auth() - if(emagged) return 1 //Shuttle is emagged, let any ol' person through + if(emagged) + return TRUE //Shuttle is emagged, let any ol' person through return (istype(inserted_id) && inserted_id.points >= inserted_id.goal) //Otherwise, only let them out if the prisoner's reached his quota. +/obj/machinery/mineral/labor_claim_console/proc/locate_stacking_machine() + stacking_machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) + if(stacking_machine) + stacking_machine.CONSOLE = src + else + qdel(src) -/obj/machinery/mineral/labor_claim_console/attack_hand(user as mob) - var/dat - dat += text("Point Claim Console

") - if(emagged) //Shit's broken - dat += text("QU&#t0A In%aL*D
") - else if(istype(inserted_id)) //There's an ID in there. - dat += text("ID: [inserted_id.registered_name] Eject ID.
") - dat += text("Points Collected:[inserted_id.points]
") - dat += text("Point Quota: [inserted_id.goal] - Reach your quota to earn your release
") - dat += text("Unclaimed Collection Points: [machine.points]. Claim points.
") - else //No ID in sight. Complain about it. - dat += text("No ID inserted. Insert ID.
") - if(check_auth()) - dat += text("Proceed to station.
") - if(use_release_door) - dat += text("Open release door.
") - if(machine) - dat += text("
Mineral Value List:
[machine.get_ore_values()]") - - - user << browse("[dat]", "window=console_stacking_machine") - - -/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I as obj, mob/user as mob, params) - if(istype(I, /obj/item/card/id)) - return attack_hand(user) - ..() - -/obj/machinery/mineral/labor_claim_console/emag_act(user as mob) - emag(user) - -/obj/machinery/mineral/labor_claim_console/proc/emag(mob/user as mob) - if(!emagged) - emagged = 1 +/obj/machinery/mineral/labor_claim_console/emag_act(mob/user) + if(!(emagged)) + emagged = TRUE to_chat(user, "PZZTTPFFFT") - -/obj/machinery/mineral/labor_claim_console/Topic(href, href_list) - usr.set_machine(src) - src.add_fingerprint(usr) - if(href_list["choice"]) - if(istype(inserted_id)) //Sanity check against href spoofs - if(href_list["choice"] == "eject") - inserted_id.loc = loc - inserted_id.verb_pickup() - inserted_id = null - if(href_list["choice"] == "claim") - inserted_id.points += machine.points - machine.points = 0 - to_chat(src, "Points transferred.") - else if(href_list["choice"] == "insert") - var/obj/item/card/id/prisoner/I = usr.get_active_hand() - if(istype(I)) - usr.drop_item() - I.loc = src - inserted_id = I - else - to_chat(usr, "Invalid ID.") - if(check_auth()) //Sanity check against hef spoofs - if(href_list["choice"] == "station") - if(!alone_in_area(get_area(src), usr)) - to_chat(usr, "Prisoners are only allowed to be released while alone.") - else - switch(SSshuttle.moveShuttle("laborcamp","laborcamp_home")) - if(1) - to_chat(usr, "Shuttle not found") - if(2) - to_chat(usr, "Shuttle already at station") - if(3) - to_chat(usr, "No permission to dock could be granted.") - else - var/message = "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval." - announcer.autosay(message, "Labor Camp Controller", "Security") - to_chat(usr, "Shuttle received message and will be sent shortly.") - - if(href_list["choice"] == "release") - if(alone_in_area(get_area(loc), usr)) - var/obj/docking_port/stationary/S = SSshuttle.getDock("laborcamp_home") - if(S && S.get_docked()) - if(release_door && release_door.density) - release_door.open() - else - to_chat(usr, "Prisoners can only be released while docked with the station.") - else - to_chat(usr, "Prisoners are only allowed to be released while alone.") - - src.updateUsrDialog() - return - - /**********************Prisoner Collection Unit**************************/ - - /obj/machinery/mineral/stacking_machine/laborstacker - var/points = 0 //The unclaimed value of ore stacked. Value for each ore loosely relative to its rarity. - var/list/ore_values = list(("glass" = 1), ("metal" = 2), ("solid plasma" = 20), ("plasteel" = 23), ("reinforced glass" = 4), ("gold" = 20), ("silver" = 20), ("uranium" = 20), ("diamond" = 25), ("bananium" = 50), ("tranquillite" = 50)) - -/obj/machinery/mineral/stacking_machine/laborstacker/proc/get_ore_values() - var/dat = "" - for(var/ore in ore_values) - var/value = ore_values[ore] - dat += "" - dat += "
[capitalize(ore)][value]
" - return dat + var/points = 0 //The unclaimed value of ore stacked. /obj/machinery/mineral/stacking_machine/laborstacker/process_sheet(obj/item/stack/sheet/inp) - if(istype(inp)) - var/n = inp.name - var/a = inp.amount - if(n in ore_values) - points += ore_values[n] * a + points += inp.point_value * inp.amount ..() +/obj/machinery/mineral/stacking_machine/laborstacker/attackby(obj/item/I, mob/living/user) + if(istype(I, /obj/item/stack/sheet) && user.canUnEquip(I)) + var/obj/item/stack/sheet/inp = I + points += inp.point_value * inp.amount + return ..() /**********************Point Lookup Console**************************/ /obj/machinery/mineral/labor_points_checker @@ -159,13 +161,15 @@ desc = "A console used by prisoners to check the progress on their quotas. Simply swipe a prisoner ID." icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "console" - density = 0 - anchored = 1 + density = FALSE /obj/machinery/mineral/labor_points_checker/attack_hand(mob/user) - user.examine(src) + . = ..() + if(.) + return + user.examinate(src) -/obj/machinery/mineral/labor_points_checker/attackby(obj/item/I as obj, mob/user as mob, params) +/obj/machinery/mineral/labor_points_checker/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id)) if(istype(I, /obj/item/card/id/prisoner)) var/obj/item/card/id/prisoner/prisoner_id = I @@ -175,5 +179,5 @@ to_chat(user, "Collect points by bringing smelted minerals to the Labor Shuttle stacking machine. Reach your quota to earn your release.") else to_chat(user, "Error: Invalid ID") - return - ..() + else + return ..() \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 1b11a35e58b..2d1ff8d82da 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -263,7 +263,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ..() statpanel("Status") if(client.statpanel == "Status") - show_stat_station_time() show_stat_emergency_shuttle_eta() stat(null, "Respawnability: [(src in GLOB.respawnable_list) ? "Yes" : "No"]") diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index bb7bcfc94e1..35a08d0ce10 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -6,6 +6,14 @@ if(hand) return l_hand else return r_hand +/mob/verb/quick_equip() + set name = "quick-equip" + set hidden = 1 + + var/obj/item/I = get_active_hand() + if(I) + I.equip_to_best_slot(src) + /mob/proc/is_in_active_hand(obj/item/I) var/obj/item/item_to_test = get_active_hand() @@ -254,3 +262,4 @@ if(slot_r_hand) return r_hand return null + diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index df0afa62f49..8d17b84c724 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -95,7 +95,6 @@ I'm using this for Stat to give it a more nifty interface to work with ..() if(has_synthetic_assistance()) statpanel("Status") - show_stat_station_time() show_stat_emergency_shuttle_eta() if(client.statpanel == "Status") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 7eecc1ff00a..a8dbaa7ac2f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -975,6 +975,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, to_chat(src, "You [slipVerb]ped on [description]!") playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) // Something something don't run with scissors + moving_diagonally = 0 //If this was part of diagonal move slipping will stop it. Stun(stun) Weaken(weaken) return 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index e46068c8a74..6481f6bc04a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -162,8 +162,6 @@ stat(null, "Intent: [a_intent]") stat(null, "Move Mode: [m_intent]") - show_stat_station_time() - show_stat_emergency_shuttle_eta() if(client.statpanel == "Status") diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 47dd5622379..cf9fcfd632c 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -1,11 +1,3 @@ -/mob/living/carbon/human/verb/quick_equip() - set name = "quick-equip" - set hidden = 1 - - var/obj/item/I = get_active_hand() - if(I) - I.equip_to_best_slot(src) - /mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/W, list/slots, del_on_fail = 1) for(var/slot in slots) if(equip_to_slot_if_possible(W, slots[slot], del_on_fail = 0)) diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 85f491f71f0..438d3386948 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -341,9 +341,6 @@ if(SKELETON in target.mutations) to_chat(user, "There is no blood in a skeleton!") return - if(issmall(target) && !target.ckey) //Monkeyized humans are okay, humanized monkeys are okay, NPC monkeys are not. - to_chat(user, "Blood from a monkey is useless!") - return //we're good to suck the blood, blaah user.mind.vampire.handle_bloodsucking(target) add_attack_logs(user, target, "vampirebit") @@ -603,20 +600,37 @@ H.healthdoll.cached_healthdoll_overlays = new_overlays /datum/species/proc/handle_hud_icons_nutrition(mob/living/carbon/human/H) - switch(H.nutrition) - if(NUTRITION_LEVEL_FULL to INFINITY) - H.throw_alert("nutrition", /obj/screen/alert/fat) - if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) - H.throw_alert("nutrition", /obj/screen/alert/full) - if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) - H.throw_alert("nutrition", /obj/screen/alert/well_fed) - if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) - H.throw_alert("nutrition", /obj/screen/alert/fed) - if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - H.throw_alert("nutrition", /obj/screen/alert/hungry) - else - H.throw_alert("nutrition", /obj/screen/alert/starving) - return 1 + if(H.mind && H.mind.vampire && (H.mind in SSticker.mode.vampires)) //Vampires + switch(H.nutrition) + if(NUTRITION_LEVEL_FULL to INFINITY) + H.throw_alert("nutrition", /obj/screen/alert/fat/vampire) + if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) + H.throw_alert("nutrition", /obj/screen/alert/full/vampire) + if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) + H.throw_alert("nutrition", /obj/screen/alert/well_fed/vampire) + if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) + H.throw_alert("nutrition", /obj/screen/alert/fed/vampire) + if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) + H.throw_alert("nutrition", /obj/screen/alert/hungry/vampire) + else + H.throw_alert("nutrition", /obj/screen/alert/starving/vampire) + return 1 + + else ///Any other non-vampires + switch(H.nutrition) + if(NUTRITION_LEVEL_FULL to INFINITY) + H.throw_alert("nutrition", /obj/screen/alert/fat) + if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) + H.throw_alert("nutrition", /obj/screen/alert/full) + if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) + H.throw_alert("nutrition", /obj/screen/alert/well_fed) + if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) + H.throw_alert("nutrition", /obj/screen/alert/fed) + if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) + H.throw_alert("nutrition", /obj/screen/alert/hungry) + else + H.throw_alert("nutrition", /obj/screen/alert/starving) + return 1 /* Returns the path corresponding to the corresponding organ @@ -675,7 +689,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u H.see_invisible = G.invis_override else H.see_invisible = min(G.invis_view, H.see_invisible) - + if(!isnull(G.lighting_alpha)) H.lighting_alpha = min(G.lighting_alpha, H.lighting_alpha) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 727c900ac9c..f9dba949b4b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -528,7 +528,7 @@ return var/pull_dir = get_dir(src, pulling) - if(get_dist(src, pulling) > 1 || ((pull_dir - 1) & pull_dir)) // puller and pullee more than one tile away or in diagonal position + if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) // puller and pullee more than one tile away or in diagonal position if(isliving(pulling)) var/mob/living/M = pulling if(M.lying && !M.buckled && (prob(M.getBruteLoss() * 200 / M.maxHealth))) diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index d0262df743c..cf55cdd5f91 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -2,6 +2,3 @@ ..() regenerate_icons() show_laws(0) - - var/datum/hotkey_mode/cyborg/C = new(src) - C.set_winset_values() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 4a8d8c48f5b..2cb9ddf6252 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -156,7 +156,6 @@ /mob/living/silicon/Stat() ..() if(statpanel("Status")) - show_stat_station_time() show_stat_emergency_shuttle_eta() show_system_integrity() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 5fd5b4e9231..7fd32bd71ec 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -1,265 +1,265 @@ -#define MINER_DASH_RANGE 4 - -/* - -BLOOD-DRUNK MINER - -Effectively a highly aggressive miner, the blood-drunk miner has very few attacks but compensates by being highly aggressive. - -The blood-drunk miner's attacks are as follows -- If not in KA range, it will rapidly dash at its target -- If in KA range, it will fire its kinetic accelerator -- If in melee range, will rapidly attack, akin to an actual player -- After any of these attacks, may transform its cleaving saw: - Untransformed, it attacks very rapidly for smaller amounts of damage - Transformed, it attacks at normal speed for higher damage and cleaves enemies hit - -When the blood-drunk miner dies, it leaves behind the cleaving saw it was using and its kinetic accelerator. - -Difficulty: Medium - -*/ - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner - name = "blood-drunk miner" - desc = "A miner destined to wander forever, engaged in an endless hunt." - health = 900 - maxHealth = 900 - icon_state = "miner" - icon_living = "miner" - icon = 'icons/mob/alienqueen.dmi' - light_color = "#E4C7C5" - speak_emote = list("roars") - speed = 1 - move_to_delay = 3 - projectiletype = /obj/item/projectile/kinetic/miner - projectilesound = 'sound/weapons/kenetic_accel.ogg' - ranged = 1 - ranged_cooldown_time = 16 - pixel_x = -16 - loot = list(/obj/item/melee/energy/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator) - wander = FALSE - del_on_death = TRUE - blood_volume = BLOOD_VOLUME_NORMAL - var/obj/item/melee/energy/cleaving_saw/miner/miner_saw - var/time_until_next_transform = 0 - var/dashing = FALSE - var/dash_cooldown = 15 - var/guidance = FALSE - deathmessage = "falls to the ground, decaying into glowing particles." - death_sound = "bodyfall" - -/obj/item/gps/internal/miner - icon_state = null - gpstag = "Resonant Signal" - desc = "The sweet blood, oh, it sings to me." - invisibility = 100 - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/guidance - guidance = TRUE - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/hunter/AttackingTarget() - . = ..() - if(. && prob(12)) - INVOKE_ASYNC(src, .proc/dash) - -/obj/item/melee/energy/cleaving_saw/miner //nerfed saw because it is very murdery - force = 6 - force_on = 10 - -/obj/item/melee/energy/cleaving_saw/miner/attack(mob/living/target, mob/living/carbon/human/user) - target.add_stun_absorption("miner", 10, INFINITY) - ..() - target.stun_absorption -= "miner" - -/obj/item/projectile/kinetic/miner - damage = 20 - speed = 0.9 - icon_state = "ka_tracer" - range = MINER_DASH_RANGE - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize() - . = ..() - miner_saw = new(src) - internal_gps = new/obj/item/gps/internal/miner(src) - - // Add a zone selection UI; otherwise the mob can't melee attack properly. - zone_sel = new /obj/screen/zone_sel() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - var/adjustment_amount = amount * 0.1 - if(world.time + adjustment_amount > next_move) - changeNext_move(adjustment_amount) //attacking it interrupts it attacking, but only briefly - . = ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/death() - if(health > 0) - return - new /obj/effect/temp_visual/dir_setting/miner_death(loc, dir) - return ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Move(atom/newloc) - if(dashing || (newloc && newloc.z == z && (islava(newloc) || ischasm(newloc)))) //we're not stupid! - return FALSE - return ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/ex_act(severity, target) - if(dash()) - return - return ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/AttackingTarget() - if(QDELETED(target)) - return - if(next_move > world.time || !Adjacent(target)) //some cheating - INVOKE_ASYNC(src, .proc/quick_attack_loop) - return - face_atom(target) - if(isliving(target)) - var/mob/living/L = target - if(L.stat == DEAD) - visible_message("[src] butchers [L]!", - "You butcher [L], restoring your health!") - if(!is_station_level(z) || client) //NPC monsters won't heal while on station - if(guidance) - adjustHealth(-L.maxHealth) - else - adjustHealth(-(L.maxHealth * 0.5)) - L.gib() - return TRUE - changeNext_move(CLICK_CD_MELEE) - miner_saw.melee_attack_chain(src, target) - if(guidance) - adjustHealth(-2) - transform_weapon() - INVOKE_ASYNC(src, .proc/quick_attack_loop) - return TRUE - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) - if(!used_item && !isturf(A)) - used_item = miner_saw - ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/GiveTarget(new_target) - var/targets_the_same = (new_target == target) - . = ..() - if(. && target && !targets_the_same) - wander = TRUE - transform_weapon() - INVOKE_ASYNC(src, .proc/quick_attack_loop) - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/OpenFire() - Goto(target, move_to_delay, minimum_distance) - if(get_dist(src, target) > MINER_DASH_RANGE && dash_cooldown <= world.time) - INVOKE_ASYNC(src, .proc/dash, target) - else - shoot_ka() - transform_weapon() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/shoot_ka() - if(ranged_cooldown <= world.time && get_dist(src, target) <= MINER_DASH_RANGE && !Adjacent(target)) - ranged_cooldown = world.time + ranged_cooldown_time - visible_message("[src] fires the proto-kinetic accelerator!") - face_atom(target) - new /obj/effect/temp_visual/dir_setting/firing_effect(loc, dir) - Shoot(target) - changeNext_move(CLICK_CD_RANGE) - -//I'm still of the belief that this entire proc needs to be wiped from existence. -// do not take my touching of it to be endorsement of it. ~mso -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/quick_attack_loop() - while(!QDELETED(target) && next_move <= world.time) //this is done this way because next_move can change to be sooner while we sleep. - stoplag(1) - sleep((next_move - world.time) * 1.5) //but don't ask me what the fuck this is about - if(QDELETED(target)) - return - if(dashing || next_move > world.time || !Adjacent(target)) - if(dashing && next_move <= world.time) - next_move = world.time + 1 - INVOKE_ASYNC(src, .proc/quick_attack_loop) //lets try that again. - return - AttackingTarget() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/dash(atom/dash_target) - if(world.time < dash_cooldown) - return - var/list/accessable_turfs = list() - var/self_dist_to_target = 0 - var/turf/own_turf = get_turf(src) - if(!QDELETED(dash_target)) - self_dist_to_target += get_dist(dash_target, own_turf) - for(var/turf/simulated/O in RANGE_TURFS(MINER_DASH_RANGE, own_turf)) - var/turf_dist_to_target = 0 - if(!QDELETED(dash_target)) - turf_dist_to_target += get_dist(dash_target, O) - if(get_dist(src, O) >= MINER_DASH_RANGE && turf_dist_to_target <= self_dist_to_target && !islava(O) && !ischasm(O)) - var/valid = TRUE - for(var/turf/T in getline(own_turf, O)) - if(is_blocked_turf(T, TRUE)) - valid = FALSE - continue - if(valid) - accessable_turfs[O] = turf_dist_to_target - var/turf/target_turf - if(!QDELETED(dash_target)) - var/closest_dist = MINER_DASH_RANGE - for(var/t in accessable_turfs) - if(accessable_turfs[t] < closest_dist) - closest_dist = accessable_turfs[t] - for(var/t in accessable_turfs) - if(accessable_turfs[t] != closest_dist) - accessable_turfs -= t - if(!LAZYLEN(accessable_turfs)) - return - dash_cooldown = world.time + initial(dash_cooldown) - target_turf = pick(accessable_turfs) - var/turf/step_back_turf = get_step(target_turf, get_cardinal_dir(target_turf, own_turf)) - var/turf/step_forward_turf = get_step(own_turf, get_cardinal_dir(own_turf, target_turf)) - new /obj/effect/temp_visual/small_smoke/halfsecond(step_back_turf) - new /obj/effect/temp_visual/small_smoke/halfsecond(step_forward_turf) - var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc, src) - animate(D, alpha = 0, time = 5) - forceMove(step_back_turf) - playsound(own_turf, 'sound/weapons/punchmiss.ogg', 40, 1, -1) - dashing = TRUE - alpha = 0 - animate(src, alpha = 255, time = 5) - sleep(2) - D.forceMove(step_forward_turf) - forceMove(target_turf) - playsound(target_turf, 'sound/weapons/punchmiss.ogg', 40, 1, -1) - sleep(1) - dashing = FALSE - shoot_ka() - return TRUE - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/transform_weapon() - if(time_until_next_transform <= world.time) - miner_saw.transform_cooldown = 0 - miner_saw.transform_weapon(src, TRUE) - icon_state = "miner[miner_saw.active ? "_transformed":""]" - icon_living = "miner[miner_saw.active ? "_transformed":""]" - time_until_next_transform = world.time + rand(50, 100) - -/obj/effect/temp_visual/dir_setting/miner_death - icon_state = "miner_death" - duration = 15 - -/obj/effect/temp_visual/dir_setting/miner_death/Initialize(mapload, set_dir) - . = ..() - INVOKE_ASYNC(src, .proc/fade_out) - -/obj/effect/temp_visual/dir_setting/miner_death/proc/fade_out() - var/matrix/M = new - M.Turn(pick(90, 270)) - var/final_dir = dir - if(dir & (EAST|WEST)) //Facing east or west - final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass - - animate(src, transform = M, pixel_y = -6, dir = final_dir, time = 2, easing = EASE_IN|EASE_OUT) - sleep(5) - animate(src, color = list("#A7A19E", "#A7A19E", "#A7A19E", list(0, 0, 0)), time = 10, easing = EASE_IN, flags = ANIMATION_PARALLEL) - sleep(4) - animate(src, alpha = 0, time = 6, easing = EASE_OUT, flags = ANIMATION_PARALLEL) - +#define MINER_DASH_RANGE 4 + +/* + +BLOOD-DRUNK MINER + +Effectively a highly aggressive miner, the blood-drunk miner has very few attacks but compensates by being highly aggressive. + +The blood-drunk miner's attacks are as follows +- If not in KA range, it will rapidly dash at its target +- If in KA range, it will fire its kinetic accelerator +- If in melee range, will rapidly attack, akin to an actual player +- After any of these attacks, may transform its cleaving saw: + Untransformed, it attacks very rapidly for smaller amounts of damage + Transformed, it attacks at normal speed for higher damage and cleaves enemies hit + +When the blood-drunk miner dies, it leaves behind the cleaving saw it was using and its kinetic accelerator. + +Difficulty: Medium + +*/ + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner + name = "blood-drunk miner" + desc = "A miner destined to wander forever, engaged in an endless hunt." + health = 900 + maxHealth = 900 + icon_state = "miner" + icon_living = "miner" + icon = 'icons/mob/alienqueen.dmi' + light_color = "#E4C7C5" + speak_emote = list("roars") + speed = 1 + move_to_delay = 3 + projectiletype = /obj/item/projectile/kinetic/miner + projectilesound = 'sound/weapons/kenetic_accel.ogg' + ranged = 1 + ranged_cooldown_time = 16 + pixel_x = -16 + loot = list(/obj/item/melee/energy/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator) + wander = FALSE + del_on_death = TRUE + blood_volume = BLOOD_VOLUME_NORMAL + var/obj/item/melee/energy/cleaving_saw/miner/miner_saw + var/time_until_next_transform = 0 + var/dashing = FALSE + var/dash_cooldown = 15 + var/guidance = FALSE + deathmessage = "falls to the ground, decaying into glowing particles." + death_sound = "bodyfall" + +/obj/item/gps/internal/miner + icon_state = null + gpstag = "Resonant Signal" + desc = "The sweet blood, oh, it sings to me." + invisibility = 100 + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/guidance + guidance = TRUE + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/hunter/AttackingTarget() + . = ..() + if(. && prob(12)) + INVOKE_ASYNC(src, .proc/dash) + +/obj/item/melee/energy/cleaving_saw/miner //nerfed saw because it is very murdery + force = 6 + force_on = 10 + +/obj/item/melee/energy/cleaving_saw/miner/attack(mob/living/target, mob/living/carbon/human/user) + target.add_stun_absorption("miner", 10, INFINITY) + ..() + target.stun_absorption -= "miner" + +/obj/item/projectile/kinetic/miner + damage = 20 + speed = 0.9 + icon_state = "ka_tracer" + range = MINER_DASH_RANGE + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize() + . = ..() + miner_saw = new(src) + internal_gps = new/obj/item/gps/internal/miner(src) + + // Add a zone selection UI; otherwise the mob can't melee attack properly. + zone_sel = new /obj/screen/zone_sel() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/adjustHealth(amount, updating_health = TRUE, forced = FALSE) + var/adjustment_amount = amount * 0.1 + if(world.time + adjustment_amount > next_move) + changeNext_move(adjustment_amount) //attacking it interrupts it attacking, but only briefly + . = ..() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/death() + if(health > 0) + return + new /obj/effect/temp_visual/dir_setting/miner_death(loc, dir) + return ..() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Move(atom/newloc) + if(dashing || (newloc && newloc.z == z && (islava(newloc) || ischasm(newloc)))) //we're not stupid! + return FALSE + return ..() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/ex_act(severity, target) + if(dash()) + return + return ..() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/AttackingTarget() + if(QDELETED(target)) + return + if(next_move > world.time || !Adjacent(target)) //some cheating + INVOKE_ASYNC(src, .proc/quick_attack_loop) + return + face_atom(target) + if(isliving(target)) + var/mob/living/L = target + if(L.stat == DEAD) + visible_message("[src] butchers [L]!", + "You butcher [L], restoring your health!") + if(!is_station_level(z) || client) //NPC monsters won't heal while on station + if(guidance) + adjustHealth(-L.maxHealth) + else + adjustHealth(-(L.maxHealth * 0.5)) + L.gib() + return TRUE + changeNext_move(CLICK_CD_MELEE) + miner_saw.melee_attack_chain(src, target) + if(guidance) + adjustHealth(-2) + transform_weapon() + INVOKE_ASYNC(src, .proc/quick_attack_loop) + return TRUE + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) + if(!used_item && !isturf(A)) + used_item = miner_saw + ..() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/GiveTarget(new_target) + var/targets_the_same = (new_target == target) + . = ..() + if(. && target && !targets_the_same) + wander = TRUE + transform_weapon() + INVOKE_ASYNC(src, .proc/quick_attack_loop) + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/OpenFire() + Goto(target, move_to_delay, minimum_distance) + if(get_dist(src, target) > MINER_DASH_RANGE && dash_cooldown <= world.time) + INVOKE_ASYNC(src, .proc/dash, target) + else + shoot_ka() + transform_weapon() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/shoot_ka() + if(ranged_cooldown <= world.time && get_dist(src, target) <= MINER_DASH_RANGE && !Adjacent(target)) + ranged_cooldown = world.time + ranged_cooldown_time + visible_message("[src] fires the proto-kinetic accelerator!") + face_atom(target) + new /obj/effect/temp_visual/dir_setting/firing_effect(loc, dir) + Shoot(target) + changeNext_move(CLICK_CD_RANGE) + +//I'm still of the belief that this entire proc needs to be wiped from existence. +// do not take my touching of it to be endorsement of it. ~mso +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/quick_attack_loop() + while(!QDELETED(target) && next_move <= world.time) //this is done this way because next_move can change to be sooner while we sleep. + stoplag(1) + sleep((next_move - world.time) * 1.5) //but don't ask me what the fuck this is about + if(QDELETED(target)) + return + if(dashing || next_move > world.time || !Adjacent(target)) + if(dashing && next_move <= world.time) + next_move = world.time + 1 + INVOKE_ASYNC(src, .proc/quick_attack_loop) //lets try that again. + return + AttackingTarget() + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/dash(atom/dash_target) + if(world.time < dash_cooldown) + return + var/list/accessable_turfs = list() + var/self_dist_to_target = 0 + var/turf/own_turf = get_turf(src) + if(!QDELETED(dash_target)) + self_dist_to_target += get_dist(dash_target, own_turf) + for(var/turf/simulated/O in RANGE_TURFS(MINER_DASH_RANGE, own_turf)) + var/turf_dist_to_target = 0 + if(!QDELETED(dash_target)) + turf_dist_to_target += get_dist(dash_target, O) + if(get_dist(src, O) >= MINER_DASH_RANGE && turf_dist_to_target <= self_dist_to_target && !islava(O) && !ischasm(O)) + var/valid = TRUE + for(var/turf/T in getline(own_turf, O)) + if(is_blocked_turf(T, TRUE)) + valid = FALSE + continue + if(valid) + accessable_turfs[O] = turf_dist_to_target + var/turf/target_turf + if(!QDELETED(dash_target)) + var/closest_dist = MINER_DASH_RANGE + for(var/t in accessable_turfs) + if(accessable_turfs[t] < closest_dist) + closest_dist = accessable_turfs[t] + for(var/t in accessable_turfs) + if(accessable_turfs[t] != closest_dist) + accessable_turfs -= t + if(!LAZYLEN(accessable_turfs)) + return + dash_cooldown = world.time + initial(dash_cooldown) + target_turf = pick(accessable_turfs) + var/turf/step_back_turf = get_step(target_turf, get_cardinal_dir(target_turf, own_turf)) + var/turf/step_forward_turf = get_step(own_turf, get_cardinal_dir(own_turf, target_turf)) + new /obj/effect/temp_visual/small_smoke/halfsecond(step_back_turf) + new /obj/effect/temp_visual/small_smoke/halfsecond(step_forward_turf) + var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc, src) + animate(D, alpha = 0, time = 5) + forceMove(step_back_turf) + playsound(own_turf, 'sound/weapons/punchmiss.ogg', 40, 1, -1) + dashing = TRUE + alpha = 0 + animate(src, alpha = 255, time = 5) + sleep(2) + D.forceMove(step_forward_turf) + forceMove(target_turf) + playsound(target_turf, 'sound/weapons/punchmiss.ogg', 40, 1, -1) + sleep(1) + dashing = FALSE + shoot_ka() + return TRUE + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/transform_weapon() + if(time_until_next_transform <= world.time) + miner_saw.transform_cooldown = 0 + miner_saw.transform_weapon(src, TRUE) + icon_state = "miner[miner_saw.active ? "_transformed":""]" + icon_living = "miner[miner_saw.active ? "_transformed":""]" + time_until_next_transform = world.time + rand(50, 100) + +/obj/effect/temp_visual/dir_setting/miner_death + icon_state = "miner_death" + duration = 15 + +/obj/effect/temp_visual/dir_setting/miner_death/Initialize(mapload, set_dir) + . = ..() + INVOKE_ASYNC(src, .proc/fade_out) + +/obj/effect/temp_visual/dir_setting/miner_death/proc/fade_out() + var/matrix/M = new + M.Turn(pick(90, 270)) + var/final_dir = dir + if(dir & (EAST|WEST)) //Facing east or west + final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass + + animate(src, transform = M, pixel_y = -6, dir = final_dir, time = 2, easing = EASE_IN|EASE_OUT) + sleep(5) + animate(src, color = list("#A7A19E", "#A7A19E", "#A7A19E", list(0, 0, 0)), time = 10, easing = EASE_IN, flags = ANIMATION_PARALLEL) + sleep(4) + animate(src, alpha = 0, time = 6, easing = EASE_OUT, flags = ANIMATION_PARALLEL) + #undef MINER_DASH_RANGE \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index c74d7545473..4e486baba20 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -2,6 +2,7 @@ GLOB.mob_list -= src GLOB.dead_mob_list -= src GLOB.living_mob_list -= src + focus = null QDEL_NULL(hud_used) if(mind && mind.current == src) spellremove(src) @@ -30,6 +31,7 @@ GLOB.dead_mob_list += src else GLOB.living_mob_list += src + set_focus(src) prepare_huds() ..() @@ -50,7 +52,6 @@ /mob/proc/GetAltName() return "" - /mob/proc/Cell() set category = "Admin" set hidden = 1 @@ -173,6 +174,7 @@ return 0 /mob/proc/Life(seconds, times_fired) + set waitfor = FALSE if(forced_look) if(!isnum(forced_look)) var/atom/A = locateUID(forced_look) @@ -988,6 +990,9 @@ var/list/slot_equipment_priority = list( \ statpanel("Status") // Switch to the Status panel again, for the sake of the lazy Stat procs + if(client && client.statpanel == "Status" && SSticker) + show_stat_station_time() + // this function displays the station time in the status panel /mob/proc/show_stat_station_time() stat(null, "Round Time: [worldtime2text()]") diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 38f980afdac..a26131b9504 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -399,9 +399,6 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) set name = "Rest" set category = "IC" - if(world.time < client.move_delay) - return - if(!resting) client.move_delay = world.time + 20 to_chat(src, "You are now resting.") diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index f26961eace9..47909a5d0b9 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -15,102 +15,6 @@ return 1 return (!mover.density || !density || lying) -//The byond version of these verbs wait for the next tick before acting. -// instant verbs however can run mid tick or even during the time between ticks. -#define DO_MOVE(this_dir) var/final_dir = turn(this_dir, -dir2angle(dir)); Move(get_step(mob, final_dir), final_dir); - -/client/verb/moveup() - set name = ".moveup" - set instant = 1 - DO_MOVE(NORTH) - -/client/verb/movedown() - set name = ".movedown" - set instant = 1 - DO_MOVE(SOUTH) - -/client/verb/moveright() - set name = ".moveright" - set instant = 1 - DO_MOVE(EAST) - -/client/verb/moveleft() - set name = ".moveleft" - set instant = 1 - DO_MOVE(WEST) - -#undef DO_MOVE - -/client/Northeast() - swap_hand() - return - - -/client/Southeast() - attack_self() - return - - -/client/Southwest() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - C.toggle_throw_mode() - else if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - var/module = R.get_selected_module() - if(!module) - to_chat(usr, "You have no module selected.") - return - R.cycle_modules() - R.uneq_numbered(module) - else - to_chat(usr, "This mob type cannot throw items.") - return - - -/client/Northwest() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(!C.get_active_hand()) - to_chat(usr, "You have nothing to drop in your hand.") - return - drop_item() - else if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - if(!R.get_selected_module()) - to_chat(usr, "You have no module selected.") - return - R.deselect_module(R.get_selected_module()) - else - to_chat(usr, "This mob type cannot drop items.") - return - -//This gets called when you press the delete button. -/client/verb/delete_key_pressed() - set hidden = 1 - - if(!usr.pulling) - to_chat(usr, "You are not pulling anything.") - return - usr.stop_pulling() - -/client/verb/swap_hand() - set hidden = 1 - if(istype(mob, /mob/living/carbon)) - mob:swap_hand() - if(istype(mob,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = mob - R.cycle_modules() - return - - - -/client/verb/attack_self() - set hidden = 1 - if(mob) - mob.mode() - return - /client/verb/toggle_throw_mode() set hidden = 1 @@ -128,7 +32,7 @@ return -/client/Center() +/* /client/Center() /* No 3D movement in 2D spessman game. dir 16 is Z Up if(isobj(mob.loc)) var/obj/O = mob.loc @@ -136,7 +40,7 @@ return O.relaymove(mob, 16) */ return - + */ /client/proc/Move_object(direct) @@ -155,11 +59,17 @@ /client/Move(n, direct) if(world.time < move_delay) return + else + next_move_dir_add = 0 + next_move_dir_sub = 0 var/old_move_delay = move_delay move_delay = world.time + world.tick_lag //this is here because Move() can now be called multiple times per tick if(!mob || !mob.loc) return 0 + if(!n || !direct) // why did we never check this before? + return FALSE + if(mob.notransform) return 0 //This is sota the goto stop mobs from moving var @@ -226,9 +136,9 @@ moving = 1 var/delay = mob.movement_delay() if(old_move_delay + (delay * MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time) - move_delay = old_move_delay + delay + move_delay = old_move_delay else - move_delay = delay + world.time + move_delay = world.time mob.last_movement = world.time if(locate(/obj/item/grab, mob)) @@ -264,19 +174,29 @@ return else if(mob.confused) - step(mob, pick(cardinal)) - else - . = ..() + var/newdir = 0 + if(mob.confused > 40) + newdir = pick(alldirs) + else if(prob(mob.confused * 1.5)) + newdir = angle2dir(dir2angle(direct) + pick(90, -90)) + else if(prob(mob.confused * 3)) + newdir = angle2dir(dir2angle(direct) + pick(45, -45)) + if(newdir) + direct = newdir + n = get_step(mob, direct) + . = ..() mob.setDir(direct) for(var/obj/item/grab/G in mob) if(G.state == GRAB_NECK) - mob.setDir(reverse_dir[direct]) + mob.setDir(angle2dir((dir2angle(direct) + 202.5) % 365)) G.adjust_position() for(var/obj/item/grab/G in mob.grabbed_by) G.adjust_position() - + if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully + delay = mob.movement_delay() * 2 + move_delay += delay moving = 0 if(mob && .) if(mob.throwing) @@ -461,3 +381,123 @@ /mob/proc/update_gravity() return +/client/proc/check_has_body_select() + return mob && mob.hud_used && mob.zone_sel && istype(mob.zone_sel, /obj/screen/zone_sel) + +/client/verb/body_toggle_head() + set name = "body-toggle-head" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/next_in_line + switch(mob.zone_sel.selecting) + if(BODY_ZONE_HEAD) + next_in_line = BODY_ZONE_PRECISE_EYES + if(BODY_ZONE_PRECISE_EYES) + next_in_line = BODY_ZONE_PRECISE_MOUTH + else + next_in_line = BODY_ZONE_HEAD + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(next_in_line, mob) + +/client/verb/body_r_arm() + set name = "body-r-arm" + set hidden = 1 + if(!check_has_body_select()) + return + + var/next_in_line + if(mob.zone_sel.selecting == BODY_ZONE_R_ARM) + next_in_line = BODY_ZONE_PRECISE_R_HAND + else + next_in_line = BODY_ZONE_R_ARM + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(next_in_line, mob) + +/client/verb/body_chest() + set name = "body-chest" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(BODY_ZONE_CHEST, mob) + +/client/verb/body_l_arm() + set name = "body-l-arm" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/next_in_line + if(mob.zone_sel.selecting == BODY_ZONE_L_ARM) + next_in_line = BODY_ZONE_PRECISE_L_HAND + else + next_in_line = BODY_ZONE_L_ARM + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(next_in_line, mob) + +/client/verb/body_r_leg() + set name = "body-r-leg" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/next_in_line + if(mob.zone_sel.selecting == BODY_ZONE_R_LEG) + next_in_line = BODY_ZONE_PRECISE_R_FOOT + else + next_in_line = BODY_ZONE_R_LEG + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(next_in_line, mob) + +/client/verb/body_groin() + set name = "body-groin" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(BODY_ZONE_PRECISE_GROIN, mob) + +/client/verb/body_l_leg() + set name = "body-l-leg" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/next_in_line + if(mob.zone_sel.selecting == BODY_ZONE_L_LEG) + next_in_line = BODY_ZONE_PRECISE_L_FOOT + else + next_in_line = BODY_ZONE_L_LEG + + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(next_in_line, mob) + +/client/verb/toggle_walk_run() + set name = "toggle-walk-run" + set hidden = TRUE + set instant = TRUE + if(mob) + mob.toggle_move_intent(usr) + +/mob/proc/toggle_move_intent(mob/user) + if(m_intent == MOVE_INTENT_RUN) + m_intent = MOVE_INTENT_WALK + else + m_intent = MOVE_INTENT_RUN + if(hud_used && hud_used.static_inventory) + for(var/obj/screen/mov_intent/selector in hud_used.static_inventory) + selector.update_icon(src) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index a87cbf6c8d3..47a4e4a5d0e 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -136,8 +136,6 @@ ..() statpanel("Status") - if(client.statpanel == "Status" && SSticker) - show_stat_station_time() /mob/new_player/Topic(href, href_list[]) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 8b5f64e94fb..388b523518b 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -46,7 +46,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 // You aren't allowed to move. /obj/machinery/gravity_generator/Move() - ..() + . = ..() qdel(src) /obj/machinery/gravity_generator/proc/set_broken() diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index c6c6de434c2..62d52c587c9 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -144,7 +144,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin /obj/structure/particle_accelerator/Move() - ..() + . = ..() if(master && master.active) master.toggle_power() investigate_log("was moved whilst active; it powered down.","singulo") diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index a1677b764e0..618315bea6e 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -1,6 +1,6 @@ /obj/item/gun/medbeam name = "Medical Beamgun" - desc = "Delivers medical nanites in a focused beam." + desc = "Delivers volatile medical nanites in a focused beam. Don't cross the beams!" icon = 'icons/obj/chronos.dmi' icon_state = "chronogun" item_state = "chronogun" @@ -92,6 +92,7 @@ return 0 for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams! if(B.owner != current_beam) + turf.visible_message("The medbeams cross and EXPLODE!") explosion(B.loc,0,3,5,8) qdel(dummy) return 0 diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm index 16f8e8f067f..0bc9a074179 100644 --- a/code/modules/spacepods/spacepod.dm +++ b/code/modules/spacepods/spacepod.dm @@ -1037,7 +1037,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/spacepod_equipment/SPE, v return stop() /obj/spacepod/relaymove(mob/user, direction) - if(usr != src.pilot) + if(user != src.pilot) return handlerelaymove(user, direction) diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 4462e4ea470..54be2e679b3 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -129,7 +129,6 @@ if(!parent.children) parent.children = list() parent.children.Add(src) - parent.check_fracture() /obj/item/organ/external/attempt_become_organ(obj/item/organ/external/parent,mob/living/carbon/human/H) if(parent_organ != parent.limb_name) @@ -224,7 +223,7 @@ droplimb(1) //Clean loss, just drop the limb and be done // See if bones need to break - check_fracture() + check_fracture(brute) var/mob/living/carbon/owner_old = owner //Need to update health, but need a reference in case the below check cuts off a limb. //If limb took enough damage, try to cut or tear it off if(owner && loc == owner) @@ -399,9 +398,10 @@ Note that amputating the affected organ does in fact remove the infection from t owner.adjustToxLoss(1) //Updates brute_damn and burn_damn from wound damages. Updates BLEEDING status. -/obj/item/organ/external/proc/check_fracture() +/obj/item/organ/external/proc/check_fracture(var/damage_inflicted) if(config.bones_can_break && brute_dam > min_broken_damage && !is_robotic()) - fracture() + if(prob(damage_inflicted)) + fracture() /obj/item/organ/external/proc/check_for_internal_bleeding(damage) if(NO_BLOOD in owner.dna.species.species_traits) diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index 8f98f1b4158..b0b2941b3d2 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -66,6 +66,7 @@ var/global/list/datum/stack_recipe/bluespace_crystal_recipes = list(new/datum/st attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed") toolspeed = 1 usesound = 'sound/items/deconstruct.ogg' + point_value = 30 /obj/item/stack/sheet/bluespace_crystal/New() ..() diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt index 8b411db15e1..fc1bced9d6a 100644 --- a/config/example/dbconfig.txt +++ b/config/example/dbconfig.txt @@ -9,7 +9,7 @@ ## This value must be set to the version of the paradise schema in use. ## If this value does not match, the SQL database will not be loaded and an error will be generated. ## Roundstart will be delayed. -DB_VERSION 6 +DB_VERSION 7 ## Server the MySQL database can be found at. # Examples: localhost, 200.135.5.43, www.mysqldb.com, etc. diff --git a/config/example/jobs.txt b/config/example/jobs.txt index 962803ab886..44543fca332 100644 --- a/config/example/jobs.txt +++ b/config/example/jobs.txt @@ -20,7 +20,7 @@ Botanist=2 Chef=1 Janitor=1 Quartermaster=1 -Shaft Miner=3 +Shaft Miner=6 Warden=1 Detective=1 diff --git a/config/example/jobs_highpop.txt b/config/example/jobs_highpop.txt index 962803ab886..44543fca332 100644 --- a/config/example/jobs_highpop.txt +++ b/config/example/jobs_highpop.txt @@ -20,7 +20,7 @@ Botanist=2 Chef=1 Janitor=1 Quartermaster=1 -Shaft Miner=3 +Shaft Miner=6 Warden=1 Detective=1 diff --git a/config/names/adjectives.txt b/config/names/adjectives.txt index ab0b4ba1806..c217e7f5f49 100644 --- a/config/names/adjectives.txt +++ b/config/names/adjectives.txt @@ -76,6 +76,7 @@ expensive famous fragile frail +flaming gifted helpful helpless diff --git a/config/names/nouns.txt b/config/names/nouns.txt new file mode 100644 index 00000000000..3f0d1dc6d05 --- /dev/null +++ b/config/names/nouns.txt @@ -0,0 +1,6801 @@ +ATM +CD +SUV +TV +aardvark +abacus +abbey +abbreviation +abdomen +ability +abnormality +abolishment +abortion +abrogation +absence +abundance +abuse +academics +academy +accelerant +accelerator +accent +acceptance +access +accessory +accident +accommodation +accompanist +accomplishment +accord +accordance +accordion +account +accountability +accountant +accounting +accuracy +accusation +acetate +achievement +achiever +acid +acknowledgment +acorn +acoustics +acquaintance +acquisition +acre +acrylic +act +action +activation +activist +activity +actor +actress +acupuncture +ad +adaptation +adapter +addiction +addition +address +adjective +adjustment +admin +administration +administrator +admire +admission +adobe +adoption +adrenalin +adrenaline +adult +adulthood +advance +advancement +advantage +advent +adverb +advertisement +advertising +advice +adviser +advocacy +advocate +affair +affect +affidavit +affiliate +affinity +afoul +afterlife +aftermath +afternoon +aftershave +aftershock +afterthought +age +agency +agenda +agent +aggradation +aggression +aglet +agony +agreement +agriculture +aid +aide +aim +air +airbag +airbus +aircraft +airfare +airfield +airforce +airline +airmail +airman +airplane +airport +airship +airspace +alarm +alb +albatross +album +alcohol +alcove +alder +ale +alert +alfalfa +algebra +algorithm +alias +alibi +alien +allegation +allergist +alley +alliance +alligator +allocation +allowance +alloy +alluvium +almanac +almighty +almond +alpaca +alpenglow +alpenhorn +alpha +alphabet +altar +alteration +alternative +altitude +alto +aluminium +aluminum +amazement +amazon +ambassador +amber +ambience +ambiguity +ambition +ambulance +amendment +amenity +ammunition +amnesty +amount +amusement +anagram +analgesia +analog +analogue +analogy +analysis +analyst +analytics +anarchist +anarchy +anatomy +ancestor +anchovy +android +anesthesiologist +anesthesiology +angel +anger +angina +angiosperm +angle +angora +angstrom +anguish +animal +anime +anise +ankle +anklet +anniversary +announcement +annual +anorak +answer +ant +anteater +antecedent +antechamber +antelope +antennae +anterior +anthropology +antibody +anticipation +anticodon +antigen +antique +antiquity +antler +antling +anxiety +anybody +anyone +anything +anywhere +apartment +ape +aperitif +apology +app +apparatus +apparel +appeal +appearance +appellation +appendix +appetiser +appetite +appetizer +applause +apple +applewood +appliance +application +appointment +appreciation +apprehension +approach +appropriation +approval +apricot +apron +apse +aquarium +aquifer +arcade +arch +arch-rival +archaeologist +archaeology +archeology +archer +architect +architecture +archives +area +arena +argument +arithmetic +ark +arm +arm-rest +armadillo +armament +armchair +armoire +armor +armour +armpit +armrest +army +arrangement +array +arrest +arrival +arrogance +arrow +art +artery +arthur +artichoke +article +artifact +artificer +artist +ascend +ascent +ascot +ash +ashram +ashtray +aside +asparagus +aspect +asphalt +aspic +ass +assassination +assault +assembly +assertion +assessment +asset +assignment +assist +assistance +assistant +associate +association +assumption +assurance +asterisk +astrakhan +astrolabe +astrologer +astrology +astronomy +asymmetry +atelier +atheist +athlete +athletics +atmosphere +atom +atrium +attachment +attack +attacker +attainment +attempt +attendance +attendant +attention +attenuation +attic +attitude +attorney +attraction +attribute +auction +audience +audit +auditorium +aunt +authentication +authenticity +author +authorisation +authority +authorization +auto +autoimmunity +automation +automaton +autumn +availability +avalanche +avenue +average +avocado +award +awareness +awe +axis +azimuth +babe +baboon +babushka +baby +bachelor +back +back-up +backbone +backburn +backdrop +background +backpack +backup +backyard +bacon +bacterium +badge +badger +bafflement +bag +bagel +baggage +baggie +baggy +bagpipe +bail +bait +bake +baker +bakery +bakeware +balaclava +balalaika +balance +balcony +ball +ballet +balloon +balloonist +ballot +ballpark +bamboo +ban +banana +band +bandana +bandanna +bandolier +bandwidth +bangle +banjo +bank +bankbook +banker +banking +bankruptcy +banner +banquette +banyan +baobab +bar +barbecue +barbeque +barber +barbiturate +bargain +barge +baritone +barium +bark +barley +barn +barometer +barracks +barrage +barrel +barrier +barstool +bartender +base +baseball +baseboard +baseline +basement +basics +basil +basin +basis +basket +basketball +bass +bassinet +bassoon +bat +bath +bather +bathhouse +bathrobe +bathroom +bathtub +battalion +batter +battery +batting +battle +battleship +bay +bayou +beach +bead +beak +beam +bean +beancurd +beanie +beanstalk +bear +beard +beast +beastie +beat +beating +beauty +beaver +beck +bed +bedrock +bedroom +bee +beech +beef +beer +beet +beetle +beggar +beginner +beginning +begonia +behalf +behavior +behaviour +beheading +behest +behold +being +belfry +belief +believer +bell +belligerency +bellows +belly +belt +bench +bend +beneficiary +benefit +beret +berry +best-seller +bestseller +bet +beverage +beyond +bias +bibliography +bicycle +bid +bidder +bidding +bidet +bifocals +bijou +bike +bikini +bill +billboard +billing +billion +bin +binoculars +biology +biopsy +biosphere +biplane +birch +bird +bird-watcher +birdbath +birdcage +birdhouse +birth +birthday +biscuit +bit +bite +bitten +bitter +black +blackberry +blackbird +blackboard +blackfish +blackness +bladder +blade +blame +blank +blanket +blast +blazer +blend +blessing +blight +blind +blinker +blister +blizzard +block +blocker +blog +blogger +blood +bloodflow +bloom +bloomer +blossom +blouse +blow +blowgun +blowhole +blue +blueberry +blush +boar +board +boat +boatload +boatyard +bob +bobcat +body +bog +bolero +bolt +bomb +bomber +bombing +bond +bonding +bondsman +bone +bonfire +bongo +bonnet +bonsai +bonus +boogeyman +book +bookcase +bookend +booking +booklet +bookmark +boolean +boom +boon +boost +booster +boot +bootee +bootie +booty +border +bore +borrower +borrowing +bosom +boss +botany +bother +bottle +bottling +bottom +bottom-line +boudoir +bough +boulder +boulevard +boundary +bouquet +bourgeoisie +bout +boutique +bow +bower +bowl +bowler +bowling +bowtie +box +boxer +boxspring +boy +boycott +boyfriend +boyhood +boysenberry +bra +brace +bracelet +bracket +brain +brake +bran +branch +brand +brandy +brass +brassiere +bratwurst +bread +breadcrumb +breadfruit +break +breakdown +breakfast +breakpoint +breakthrough +breast +breastplate +breath +breeze +brewer +bribery +brick +bricklaying +bride +bridge +brief +briefing +briefly +briefs +brilliant +brink +brisket +broad +broadcast +broccoli +brochure +brocolli +broiler +broker +bronchitis +bronco +bronze +brooch +brood +brook +broom +brother +brother-in-law +brow +brown +brownie +browser +browsing +brunch +brush +brushfire +brushing +bubble +buck +bucket +buckle +buckwheat +bud +buddy +budget +buffalo +buffer +buffet +bug +buggy +bugle +builder +building +bulb +bulk +bull +bull-fighter +bulldozer +bullet +bump +bumper +bun +bunch +bungalow +bunghole +bunkhouse +burden +bureau +burglar +burial +burlesque +burn +burn-out +burning +burrito +burro +burrow +burst +bus +bush +business +businessman +bust +bustle +butane +butcher +butler +butter +butterfly +button +buy +buyer +buying +buzz +buzzard +c-clamp +cabana +cabbage +cabin +cabinet +cable +caboose +cacao +cactus +caddy +cadet +cafe +caffeine +caftan +cage +cake +calcification +calculation +calculator +calculus +calendar +calf +caliber +calibre +calico +call +calm +calorie +camel +cameo +camera +camp +campaign +campaigning +campanile +camper +campus +can +canal +cancer +candelabra +candidacy +candidate +candle +candy +cane +cannibal +cannon +canoe +canon +canopy +cantaloupe +canteen +canvas +cap +capability +capacity +cape +caper +capital +capitalism +capitulation +capon +cappelletti +cappuccino +captain +caption +captor +car +carabao +caramel +caravan +carbohydrate +carbon +carboxyl +card +cardboard +cardigan +care +career +cargo +caribou +carload +carnation +carnival +carol +carotene +carp +carpenter +carpet +carpeting +carport +carriage +carrier +carrot +carry +cart +cartel +carter +cartilage +cartload +cartoon +cartridge +carving +cascade +case +casement +cash +cashew +cashier +casino +casket +cassava +casserole +cassock +cast +castanet +castle +casualty +cat +catacomb +catalogue +catalysis +catalyst +catamaran +catastrophe +catch +catcher +category +caterpillar +cathedral +cation +catsup +cattle +cauliflower +causal +cause +causeway +caution +cave +caviar +cayenne +ceiling +celebration +celebrity +celeriac +celery +cell +cellar +cello +celsius +cement +cemetery +cenotaph +census +cent +center +centimeter +centre +centurion +century +cephalopod +ceramic +ceramics +cereal +ceremony +certainty +certificate +certification +cesspool +chafe +chain +chainstay +chair +chairlift +chairman +chairperson +chaise +chalet +chalice +chalk +challenge +chamber +champagne +champion +championship +chance +chandelier +change +channel +chaos +chap +chapel +chaplain +chapter +character +characteristic +characterization +chard +charge +charger +charity +charlatan +charm +charset +chart +charter +chasm +chassis +chastity +chasuble +chateau +chatter +chauffeur +chauvinist +check +checkbook +checking +checkout +checkroom +cheddar +cheek +cheer +cheese +cheesecake +cheetah +chef +chem +chemical +chemistry +chemotaxis +cheque +cherry +chess +chest +chestnut +chick +chicken +chicory +chief +chiffonier +child +childbirth +childhood +chili +chill +chime +chimpanzee +chin +chinchilla +chino +chip +chipmunk +chit-chat +chivalry +chive +chives +chocolate +choice +choir +choker +cholesterol +choosing +chop +chops +chopstick +chopsticks +chord +chorus +chow +chowder +chrome +chromolithograph +chronicle +chronograph +chronometer +chrysalis +chub +chuck +chug +church +churn +chutney +cicada +cigarette +cilantro +cinder +cinema +cinnamon +circadian +circle +circuit +circulation +circumference +circumstance +cirrhosis +cirrus +citizen +citizenship +citron +citrus +city +civilian +civilisation +civilization +claim +clam +clamp +clan +clank +clapboard +clarification +clarinet +clarity +clasp +class +classic +classification +classmate +classroom +clause +clave +clavicle +clavier +claw +clay +cleaner +clearance +clearing +cleat +cleavage +clef +cleft +clergyman +cleric +clerk +click +client +cliff +climate +climb +clinic +clip +clipboard +clipper +cloak +cloakroom +clock +clockwork +clogs +cloister +clone +close +closet +closing +closure +cloth +clothes +clothing +cloud +cloudburst +clove +clover +cloves +club +clue +cluster +clutch +co-producer +coach +coal +coalition +coast +coaster +coat +cob +cobbler +cobweb +cock +cockpit +cockroach +cocktail +cocoa +coconut +cod +code +codepage +codling +codon +codpiece +coevolution +cofactor +coffee +coffin +cohesion +cohort +coil +coin +coincidence +coinsurance +coke +cold +coleslaw +coliseum +collaboration +collagen +collapse +collar +collard +collateral +colleague +collection +collectivisation +collectivization +collector +college +collision +colloquy +colon +colonial +colonialism +colonisation +colonization +colony +color +colorlessness +colt +column +columnist +comb +combat +combination +combine +comeback +comedy +comestible +comfort +comfortable +comic +comics +comma +command +commander +commandment +comment +commerce +commercial +commission +commitment +committee +commodity +common +commonsense +commotion +communicant +communication +communion +communist +community +commuter +company +comparison +compass +compassion +compassionate +compensation +competence +competition +competitor +complaint +complement +completion +complex +complexity +compliance +complication +complicity +compliment +component +comportment +composer +composite +composition +compost +comprehension +compress +compromise +comptroller +compulsion +computer +comradeship +con +concentrate +concentration +concept +conception +concern +concert +conclusion +concrete +condition +conditioner +condominium +condor +conduct +conductor +cone +confectionery +conference +confidence +confidentiality +configuration +confirmation +conflict +conformation +confusion +conga +congo +congregation +congress +congressman +congressperson +conifer +connection +connotation +conscience +consciousness +consensus +consent +consequence +conservation +conservative +consideration +consignment +consist +consistency +console +consonant +conspiracy +conspirator +constant +constellation +constitution +constraint +construction +consul +consulate +consulting +consumer +consumption +contact +contact lens +contagion +container +content +contention +contest +context +continent +contingency +continuity +contour +contract +contractor +contrail +contrary +contrast +contribution +contributor +control +controller +controversy +convection +convenience +convention +conversation +conversion +convert +convertible +conviction +cook +cookbook +cookie +cooking +coonskin +cooperation +coordination +coordinator +cop +cop-out +cope +copper +copy +copying +copyright +copywriter +coral +cord +corduroy +core +cork +cormorant +corn +corner +cornerstone +cornet +cornflakes +cornmeal +corporal +corporation +corporatism +corps +corral +correspondence +correspondent +corridor +corruption +corsage +cosset +cost +costume +cot +cottage +cotton +couch +cougar +cough +council +councilman +councilor +councilperson +counsel +counseling +counselling +counsellor +counselor +count +counter +counter-force +counterpart +counterterrorism +countess +country +countryside +county +couple +coupon +courage +course +court +courthouse +courtroom +cousin +covariate +cover +coverage +coverall +cow +cowbell +cowboy +coyote +crab +crack +cracker +crackers +cradle +craft +craftsman +cranberry +crane +cranky +crap +crash +crate +cravat +craw +crawdad +crayfish +crayon +crazy +cream +creation +creationism +creationist +creative +creativity +creator +creature +creche +credential +credenza +credibility +credit +creditor +creek +creme brulee +crepe +crest +crew +crewman +crewmate +crewmember +crewmen +cria +crib +cribbage +cricket +cricketer +crime +criminal +crinoline +crisis +crisp +criteria +criterion +critic +criticism +crocodile +crocus +croissant +crook +crop +cross +cross-contamination +cross-stitch +crotch +croup +crow +crowd +crown +crucifixion +crude +cruelty +cruise +crumb +crunch +crusader +crush +crust +cry +crystal +crystallography +cub +cube +cuckoo +cucumber +cue +cuff-link +cuisine +cultivar +cultivator +culture +culvert +cummerbund +cup +cupboard +cupcake +cupola +curd +cure +curio +curiosity +curl +curler +currant +currency +current +curriculum +curry +curse +cursor +curtailment +curtain +curve +cushion +custard +custody +custom +customer +cut +cuticle +cutlet +cutover +cutting +cyclamen +cycle +cyclone +cyclooxygenase +cygnet +cylinder +cymbal +cynic +cyst +cytokine +cytoplasm +dad +daddy +daffodil +dagger +dahlia +daikon +daily +dairy +daisy +dam +damage +dame +damn +dance +dancer +dancing +dandelion +danger +dare +dark +darkness +darn +dart +dash +dashboard +data +database +date +daughter +dawn +day +daybed +daylight +dead +deadline +deal +dealer +dealing +dearest +death +deathwatch +debate +debris +debt +debtor +decade +decadence +decency +decimal +decision +decision-making +deck +declaration +declination +decline +decoder +decongestant +decoration +decrease +decryption +dedication +deduce +deduction +deed +deep +deer +default +defeat +defendant +defender +defense +deficit +definition +deformation +degradation +degree +delay +deliberation +delight +delivery +demand +democracy +democrat +demon +demur +den +denim +denominator +density +dentist +deodorant +department +departure +dependency +dependent +deployment +deposit +deposition +depot +depression +depressive +depth +deputy +derby +derivation +derivative +derrick +descendant +descent +description +desert +design +designation +designer +desire +desk +desktop +dessert +destination +destiny +destroyer +destruction +detail +detainee +detainment +detection +detective +detector +detention +determination +detour +devastation +developer +developing +development +developmental +deviance +deviation +device +devil +dew +dhow +diabetes +diadem +diagnosis +diagram +dial +dialect +dialogue +diam +diamond +diaper +diaphragm +diarist +diary +dibble +dick +dickey +dictaphone +dictator +diction +dictionary +die +diesel +diet +difference +differential +difficulty +diffuse +dig +digestion +digestive +digger +digging +digit +dignity +dilapidation +dill +dilution +dime +dimension +dimple +diner +dinghy +dining +dinner +dinosaur +dioxide +dip +diploma +diplomacy +dipstick +direction +directive +director +directory +dirndl +dirt +disability +disadvantage +disagreement +disappointment +disarmament +disaster +discharge +discipline +disclaimer +disclosure +disco +disconnection +discount +discourse +discovery +discrepancy +discretion +discrimination +discussion +disdain +disease +disembodiment +disengagement +disguise +disgust +dish +dishwasher +disk +disparity +dispatch +displacement +display +disposal +disposer +disposition +dispute +disregard +disruption +dissemination +dissonance +distance +distinction +distortion +distribution +distributor +district +divalent +divan +diver +diversity +divide +dividend +divider +divine +diving +division +divorce +doc +dock +doctor +doctorate +doctrine +document +documentary +documentation +doe +dog +doggie +dogsled +dogwood +doing +doll +dollar +dollop +dolman +dolor +dolphin +domain +dome +domination +donation +donkey +donor +donut +door +doorbell +doorknob +doorpost +doorway +dory +dose +dot +double +doubling +doubt +doubter +dough +doughnut +down +downfall +downforce +downgrade +download +downstairs +downtown +downturn +dozen +draft +drag +dragon +dragonfly +dragonfruit +dragster +drain +drainage +drake +drama +dramaturge +drapes +draw +drawbridge +drawer +drawing +dream +dreamer +dredger +dress +dresser +dressing +drill +drink +drinking +drive +driver +driveway +driving +drizzle +dromedary +drop +drudgery +drug +drum +drummer +drunk +dryer +duck +duckling +dud +dude +due +duel +dueling +duffel +dugout +dulcimer +dumbwaiter +dump +dump truck +dune +dune buggy +dungarees +dungeon +duplexer +duration +durian +dusk +dust +dust storm +duster +duty +dwarf +dwell +dwelling +dynamics +dynamite +dynamo +dynasty +dysfunction +e-book +e-mail +e-reader +eagle +eaglet +ear +eardrum +earmuffs +earnings +earplug +earring +earrings +earth +earthquake +earthworm +ease +easel +east +eating +eaves +eavesdropper +ecclesia +echidna +eclipse +ecliptic +ecology +economics +economy +ecosystem +ectoderm +ectodermal +ecumenist +eddy +edge +edger +edible +editing +edition +editor +editorial +education +eel +effacement +effect +effective +effectiveness +effector +efficacy +efficiency +effort +egg +egghead +eggnog +eggplant +ego +eicosanoid +ejector +elbow +elderberry +election +electricity +electrocardiogram +electronics +element +elephant +elevation +elevator +eleventh +elf +elicit +eligibility +elimination +elite +elixir +elk +ellipse +elm +elongation +elver +email +emanate +embarrassment +embassy +embellishment +embossing +embryo +emerald +emergence +emergency +emergent +emery +emission +emitter +emotion +emphasis +empire +employ +employee +employer +employment +empowerment +emu +enactment +encirclement +enclave +enclosure +encounter +encouragement +encyclopedia +end +endive +endoderm +endorsement +endothelium +endpoint +enemy +energy +enforcement +engagement +engine +engineer +engineering +enigma +enjoyment +enquiry +enrollment +enterprise +entertainment +enthusiasm +entirety +entity +entrance +entree +entrepreneur +entry +envelope +environment +envy +enzyme +epauliere +epee +ephemera +ephemeris +ephyra +epic +episode +epithelium +epoch +eponym +epoxy +equal +equality +equation +equinox +equipment +equity +equivalent +era +eraser +erection +erosion +error +escalator +escape +escort +espadrille +espalier +essay +essence +essential +establishment +estate +estimate +estrogen +estuary +eternity +ethernet +ethics +ethnicity +ethyl +euphonium +eurocentrism +evaluation +evaluator +evaporation +eve +evening +evening-wear +event +everybody +everyone +everything +eviction +evidence +evil +evocation +evolution +ex-husband +ex-wife +exaggeration +exam +examination +examiner +example +exasperation +excellence +exception +excerpt +excess +exchange +excitement +exclamation +excursion +excuse +execution +executive +executor +exercise +exhaust +exhaustion +exhibit +exhibition +exile +existence +exit +exocrine +expansion +expansionism +expectancy +expectation +expedition +expense +experience +experiment +experimentation +expert +expertise +explanation +exploration +explorer +explosion +export +expose +exposition +exposure +expression +extension +extent +exterior +external +extinction +extreme +extremist +eye +eyeball +eyebrow +eyebrows +eyeglasses +eyelash +eyelashes +eyelid +eyelids +eyeliner +eyestrain +eyrie +fabric +face +facelift +facet +facility +facsimile +fact +factor +factory +faculty +fahrenheit +fail +failure +fairness +fairy +faith +faithful +fall +fallacy +falling-out +fame +familiar +familiarity +family +fan +fang +fanlight +fanny +fanny-pack +fantasy +farm +farmer +farming +farmland +farrow +fascia +fashion +fat +fate +father +father-in-law +fatigue +fatigues +faucet +fault +fav +fava +favor +favorite +fawn +fax +fear +feast +feather +feature +fedelini +federation +fedora +fee +feed +feedback +feeding +feel +feeling +fellow +felony +female +fen +fence +fencing +fender +feng +fennel +ferret +ferry +ferryboat +fertilizer +festival +fetus +few +fiber +fiberglass +fibre +fibroblast +fibrosis +ficlet +fiction +fiddle +field +fiery +fiesta +fifth +fig +fight +fighter +figure +figurine +file +filing +fill +fillet +filly +film +filter +filth +final +finance +financing +finding +fine +finer +finger +fingerling +fingernail +finish +finisher +fir +fire +fireman +fireplace +firewall +firm +first +fish +fishbone +fisherman +fishery +fishing +fishmonger +fishnet +fisting +fit +fitness +fix +fixture +flag +flair +flame +flan +flanker +flare +flash +flat +flatboat +flavor +flax +fleck +fledgling +fleece +flesh +flexibility +flick +flicker +flight +flint +flintlock +flip-flops +flock +flood +floodplain +floor +floozie +flour +flow +flower +flu +flugelhorn +fluke +flume +flung +flute +fly +flytrap +foal +foam +fob +focus +fog +fold +folder +folk +folklore +follower +following +fondue +font +food +foodstuffs +fool +foot +footage +football +footnote +footprint +footrest +footstep +footstool +footwear +forage +forager +foray +force +ford +forearm +forebear +forecast +forehead +foreigner +forelimb +forest +forestry +forever +forgery +fork +form +formal +formamide +format +formation +former +formicarium +formula +fort +forte +fortnight +fortress +fortune +forum +foundation +founder +founding +fountain +fourths +fowl +fox +foxglove +fraction +fragrance +frame +framework +fratricide +fraud +fraudster +freak +freckle +freedom +freelance +freezer +freezing +freight +freighter +frenzy +freon +frequency +fresco +friction +fridge +friend +friendship +fries +frigate +fright +fringe +fritter +frock +frog +front +frontier +frost +frosting +frown +fruit +frustration +fry +fuck +fuel +fugato +fulfillment +full +fun +function +functionality +fund +funding +fundraising +funeral +fur +furnace +furniture +furry +fusarium +futon +future +gadget +gaffe +gaffer +gain +gaiters +gale +gall-bladder +gallery +galley +gallon +galoshes +gambling +game +gamebird +gaming +gamma-ray +gander +gang +gap +garage +garb +garbage +garden +garlic +garment +garter +gas +gasket +gasoline +gasp +gastronomy +gastropod +gate +gateway +gather +gathering +gator +gauge +gauntlet +gavel +gazebo +gazelle +gear +gearshift +geek +gel +gelatin +gelding +gem +gemsbok +gender +gene +general +generation +generator +generosity +genetics +genie +genius +genocide +genre +gentleman +geography +geology +geometry +geranium +gerbil +gesture +geyser +gherkin +ghost +giant +gift +gig +gigantism +giggle +ginger +gingerbread +ginseng +giraffe +girdle +girl +girlfriend +git +glacier +gladiolus +glance +gland +glass +glasses +glee +glen +glider +gliding +glimpse +globe +glockenspiel +gloom +glory +glove +glow +glucose +glue +glut +glutamate +gnat +gnu +go-kart +goal +goat +gobbler +god +goddess +godfather +godmother +godparent +goggles +going +gold +goldfish +golf +gondola +gong +good +good-bye +goodbye +goodie +goodness +goodnight +goodwill +goose +gopher +gorilla +gosling +gossip +governance +government +governor +gown +grab-bag +grace +grade +gradient +graduate +graduation +graffiti +graft +grain +gram +grammar +gran +grand +grandchild +granddaughter +grandfather +grandma +grandmom +grandmother +grandpa +grandparent +grandson +granny +granola +grant +grape +grapefruit +graph +graphic +grasp +grass +grasshopper +grassland +gratitude +gravel +gravitas +gravity +gravy +gray +grease +great-grandfather +great-grandmother +greatness +greed +green +greenhouse +greens +grenade +grey +grid +grief +grill +grin +grip +gripper +grit +grocery +ground +group +grouper +grouse +grove +growth +grub +guacamole +guarantee +guard +guava +guerrilla +guess +guest +guestbook +guidance +guide +guideline +guilder +guilt +guilty +guinea +guitar +guitarist +gum +gumshoe +gun +gunpowder +gutter +guy +gym +gymnast +gymnastics +gynaecology +gyro +habit +habitat +hacienda +hacksaw +hackwork +hail +hair +haircut +hake +half +half-brother +half-sister +halibut +hall +halloween +hallway +halt +ham +hamburger +hammer +hammock +hamster +hand +hand-holding +handball +handful +handgun +handicap +handle +handlebar +handmaiden +handover +handrail +handsaw +hanger +happening +happiness +harald +harbor +harbour +hard-hat +hardboard +hardcover +hardening +hardhat +hardship +hardware +hare +harm +harmonica +harmonise +harmonize +harmony +harp +harpooner +harpsichord +harvest +harvester +hash +hashtag +hassock +haste +hat +hatbox +hatchet +hatchling +hate +hatred +haunt +haven +haversack +havoc +hawk +hay +haze +hazel +hazelnut +head +headache +headlight +headline +headphones +headquarters +headrest +health +health-care +hearing +hearsay +heart +heart-throb +heartache +heartbeat +hearth +hearthside +heartwood +heat +heater +heating +heaven +heavy +hectare +hedge +hedgehog +heel +heifer +height +heir +heirloom +helicopter +helium +hell +hellcat +hello +helmet +helo +help +hemisphere +hemp +hen +hepatitis +herb +herbs +heritage +hermit +hero +heroine +heron +herring +hesitation +heterosexual +hexagon +heyday +hiccups +hide +hierarchy +high +high-rise +highland +highlight +highway +hike +hiking +hill +hint +hip +hippodrome +hippopotamus +hire +hiring +historian +history +hit +hive +hobbit +hobby +hockey +hoe +hog +hold +holder +hole +holiday +home +homeland +homeownership +hometown +homework +homicide +homogenate +homonym +homosexual +homosexuality +honesty +honey +honeybee +honeydew +honor +honoree +hood +hoof +hook +hop +hope +hops +horde +horizon +hormone +horn +hornet +horror +horse +horseradish +horst +hose +hosiery +hospice +hospital +hospitalisation +hospitality +hospitalization +host +hostel +hostess +hotdog +hotel +hound +hour +hourglass +house +houseboat +household +housewife +housework +housing +hovel +hovercraft +howard +howitzer +hub +hubcap +hubris +hug +hugger +hull +human +humanity +humidity +hummus +humor +humour +hunchback +hundred +hunger +hunt +hunter +hunting +hurdle +hurdler +hurricane +hurry +hurt +husband +hut +hutch +hyacinth +hybridisation +hybridization +hydrant +hydraulics +hydrocarb +hydrocarbon +hydrofoil +hydrogen +hydrolyse +hydrolysis +hydrolyze +hydroxyl +hyena +hygienic +hype +hyphenation +hypochondria +hypothermia +hypothesis +ice +ice-cream +iceberg +icebreaker +icecream +icicle +icing +icon +icy +id +idea +ideal +identification +identity +ideology +idiom +idiot +igloo +ignorance +ignorant +ikebana +illegal +illiteracy +illness +illusion +illustration +image +imagination +imbalance +imitation +immigrant +immigration +immortal +impact +impairment +impala +impediment +implement +implementation +implication +import +importance +impostor +impress +impression +imprisonment +impropriety +improvement +impudence +impulse +in-joke +in-laws +inability +inauguration +inbox +incandescence +incarnation +incense +incentive +inch +incidence +incident +incision +inclusion +income +incompetence +inconvenience +increase +incubation +independence +independent +index +indication +indicator +indigence +individual +industrialisation +industrialization +industry +inequality +inevitable +infancy +infant +infarction +infection +infiltration +infinite +infix +inflammation +inflation +influence +influx +info +information +infrastructure +infusion +inglenook +ingrate +ingredient +inhabitant +inheritance +inhibition +inhibitor +initial +initialise +initialize +initiative +injunction +injury +injustice +ink +inlay +inn +innervation +innocence +innocent +innovation +input +inquiry +inscription +insect +insectarium +insert +inside +insight +insolence +insomnia +inspection +inspector +inspiration +installation +instance +instant +instinct +institute +institution +instruction +instructor +instrument +instrumentalist +instrumentation +insulation +insurance +insurgence +insurrection +integer +integral +integration +integrity +intellect +intelligence +intensity +intent +intention +intentionality +interaction +interchange +interconnection +intercourse +interest +interface +interferometer +interior +interject +interloper +internet +interpretation +interpreter +interval +intervenor +intervention +interview +interviewer +intestine +introduction +intuition +invader +invasion +invention +inventor +inventory +inverse +inversion +investigation +investigator +investment +investor +invitation +invite +invoice +involvement +iridescence +iris +iron +ironclad +irony +irrigation +ischemia +island +isogloss +isolation +issue +item +itinerary +ivory +jack +jackal +jacket +jackfruit +jade +jaguar +jail +jailhouse +jalapeño +jam +jar +jasmine +jaw +jazz +jealousy +jeans +jeep +jelly +jellybeans +jellyfish +jerk +jet +jewel +jeweller +jewellery +jewelry +jicama +jiffy +job +jockey +jodhpurs +joey +jogging +joint +joke +jot +journal +journalism +journalist +journey +joy +judge +judgment +judo +jug +juggernaut +juice +julienne +jumbo +jump +jumper +jumpsuit +jungle +junior +junk +junker +junket +jury +justice +justification +jute +kale +kamikaze +kangaroo +karate +kayak +kazoo +kebab +keep +keeper +kendo +kennel +ketch +ketchup +kettle +kettledrum +key +keyboard +keyboarding +keystone +kick +kick-off +kid +kidney +kielbasa +kill +killer +killing +kilogram +kilometer +kilt +kimono +kinase +kind +kindness +king +kingdom +kingfish +kiosk +kiss +kit +kitchen +kite +kitsch +kitten +kitty +kiwi +knee +kneejerk +knickers +knife +knife-edge +knight +knitting +knock +knot +know-how +knowledge +knuckle +koala +kohlrabi +kumquat +lab +label +labor +laboratory +laborer +labour +labourer +lace +lack +lacquerware +lad +ladder +ladle +lady +ladybug +lag +lake +lamb +lambkin +lament +lamp +lanai +land +landform +landing +landmine +landscape +lane +language +lantern +lap +laparoscope +lapdog +laptop +larch +lard +larder +lark +larva +laryngitis +lasagna +lashes +last +latency +latex +lathe +latitude +latte +latter +laugh +laughter +laundry +lava +law +lawmaker +lawn +lawsuit +lawyer +lay +layer +layout +lead +leader +leadership +leading +leaf +league +leaker +leap +learning +leash +leather +leave +leaver +lecture +leek +leeway +left +leg +legacy +legal +legend +legging +legislation +legislator +legislature +legitimacy +legume +leisure +lemon +lemonade +lemur +lender +lending +length +lens +lentil +leopard +leprosy +leptocephalus +lesbian +lesson +letter +lettuce +level +lever +leverage +leveret +liability +liar +liberty +libido +library +licence +license +licensing +licorice +lid +lie +lieu +lieutenant +life +lifestyle +lifetime +lift +ligand +light +lighting +lightning +lightscreen +ligula +likelihood +likeness +lilac +lily +limb +lime +limestone +limit +limitation +limo +line +linen +liner +linguist +linguistics +lining +link +linkage +linseed +lion +lip +lipid +lipoprotein +lipstick +liquid +liquidity +liquor +list +listening +listing +literate +literature +litigation +litmus +litter +littleneck +liver +livestock +living +lizard +llama +load +loading +loaf +loafer +loan +lobby +lobotomy +lobster +local +locality +location +lock +locker +locket +locomotive +locust +lode +loft +log +loggia +logic +login +logistics +logo +loincloth +lollipop +loneliness +longboat +longitude +look +lookout +loop +loophole +loquat +lord +loss +lot +lotion +lottery +lounge +louse +lout +love +lover +lox +loyalty +luck +luggage +lumber +lumberman +lunch +luncheonette +lunchmeat +lunchroom +lung +lunge +lust +lute +luxury +lychee +lycra +lye +lymphocyte +lynx +lyocell +lyre +lyrics +lysine +mRNA +macadamia +macaroni +macaroon +macaw +machine +machinery +macrame +macro +macrofauna +madam +maelstrom +maestro +magazine +maggot +magic +magnet +magnitude +maid +maiden +mail +mailbox +mailer +mailing +mailman +main +mainland +mainstream +maintainer +maintenance +maize +major +major-league +majority +makeover +maker +makeup +making +male +malice +mall +mallard +mallet +malnutrition +mama +mambo +mammoth +man +manacle +management +manager +manatee +mandarin +mandate +mandolin +mangle +mango +mangrove +manhunt +maniac +manicure +manifestation +manipulation +mankind +manner +manor +mansard +manservant +mansion +mantel +mantle +mantua +manufacturer +manufacturing +many +map +maple +mapping +maracas +marathon +marble +march +mare +margarine +margin +mariachi +marimba +marines +marionberry +mark +marker +market +marketer +marketing +marketplace +marksman +markup +marmalade +marriage +marsh +marshland +marshmallow +marten +marxism +mascara +mask +masonry +mass +massage +mast +master +masterpiece +mastication +mastoid +mat +match +matchmaker +mate +material +maternity +math +mathematics +matrix +matter +mattock +mattress +max +maximum +maybe +mayonnaise +mayor +meadow +meal +mean +meander +meaning +means +meantime +measles +measure +measurement +meat +meatball +meatloaf +mecca +mechanic +mechanism +med +medal +media +median +medication +medicine +medium +meet +meeting +melatonin +melody +melon +member +membership +membrane +meme +memo +memorial +memory +men +menopause +menorah +mention +mentor +menu +merchandise +merchant +mercury +meridian +meringue +merit +mesenchyme +mess +message +messenger +messy +metabolite +metal +metallurgist +metaphor +meteor +meteorology +meter +methane +method +methodology +metric +metro +metronome +mezzanine +microlending +micronutrient +microphone +microwave +mid-course +midden +middle +middleman +midline +midnight +midwife +might +migrant +migration +mile +mileage +milepost +milestone +military +milk +milkshake +mill +millennium +millet +millimeter +million +millisecond +millstone +mime +mimosa +min +mincemeat +mind +mine +mineral +mineshaft +mini +mini-skirt +minibus +minimalism +minimum +mining +minion +minister +mink +minnow +minor +minor-league +minority +mint +minute +miracle +mirror +miscarriage +miscommunication +misfit +misnomer +misogyny +misplacement +misreading +misrepresentation +miss +missile +mission +missionary +mist +mistake +mister +misunderstand +miter +mitten +mix +mixer +mixture +moai +moat +mob +mobile +mobility +mobster +moccasins +mocha +mochi +mode +model +modeling +modem +modernist +modernity +modification +molar +molasses +molding +mole +molecule +mom +moment +monastery +monasticism +money +monger +monitor +monitoring +monk +monkey +monocle +monopoly +monotheism +monsoon +monster +month +monument +mood +moody +moon +moonlight +moonscape +moonshine +moose +mop +morale +morbid +morbidity +morning +moron +morphology +morsel +mortal +mortality +mortgage +mortise +mosque +mosquito +most +motel +moth +mother +mother-in-law +motion +motivation +motive +motor +motorboat +motorcar +motorcycle +mound +mountain +mouse +mouser +mousse +moustache +mouth +mouton +movement +mover +movie +mower +mozzarella +mud +muffin +mug +mukluk +mule +multimedia +murder +muscat +muscatel +muscle +musculature +museum +mushroom +music +music-box +music-making +musician +muskrat +mussel +mustache +mustard +mutation +mutt +mutton +mycoplasma +mystery +myth +mythology +nail +name +naming +nanoparticle +napkin +narrative +nasal +nation +nationality +native +naturalisation +nature +navigation +necessity +neck +necklace +necktie +nectar +nectarine +need +needle +neglect +negligee +negotiation +neighbor +neighborhood +neighbour +neighbourhood +neologism +neon +neonate +nephew +nerve +nest +nestling +nestmate +net +netball +netbook +netsuke +network +networking +neurobiologist +neuron +neuropathologist +neuropsychiatry +news +newsletter +newspaper +newsprint +newsstand +nexus +nibble +nicety +niche +nick +nickel +nickname +niece +night +nightclub +nightgown +nightingale +nightlife +nightlight +nightmare +ninja +nit +nitrogen +nobody +nod +node +noir +noise +nonbeliever +nonconformist +nondisclosure +nonsense +noodle +noodles +noon +norm +normal +normalisation +normalization +north +nose +notation +note +notebook +notepad +nothing +notice +notion +notoriety +nougat +noun +nourishment +novel +nucleotidase +nucleotide +nudge +nuke +number +numeracy +numeric +numismatist +nun +nurse +nursery +nursing +nurture +nut +nutmeg +nutrient +nutrition +nylon +nymph +oak +oar +oasis +oat +oatmeal +oats +obedience +obesity +obi +object +objection +objective +obligation +oboe +observation +observatory +obsession +obsidian +obstacle +occasion +occupation +occurrence +ocean +ocelot +octagon +octave +octavo +octet +octopus +odometer +odyssey +oeuvre +off-ramp +offence +offense +offer +offering +office +officer +official +offset +oil +okra +oldie +oleo +olive +omega +omelet +omission +omnivore +oncology +onion +online +onset +opening +opera +operating +operation +operator +ophthalmologist +opinion +opium +opossum +opponent +opportunist +opportunity +opposite +opposition +optimal +optimisation +optimist +optimization +option +orange +orangutan +orator +orchard +orchestra +orchid +order +ordinary +ordination +ore +oregano +organ +organisation +organising +organization +organizing +orient +orientation +origin +original +originality +ornament +osmosis +osprey +ostrich +other +otter +ottoman +ounce +outback +outcome +outfielder +outfit +outhouse +outlaw +outlay +outlet +outline +outlook +output +outrage +outrigger +outrun +outset +outside +oval +ovary +oven +overcharge +overclocking +overcoat +overexertion +overflight +overhead +overheard +overload +overnighter +overshoot +oversight +overview +overweight +owl +owner +ownership +ox +oxford +oxygen +oyster +ozone +pace +pacemaker +pack +package +packaging +packet +pad +paddle +paddock +pagan +page +pagoda +pail +pain +paint +painter +painting +paintwork +pair +pajamas +palace +palate +palm +pamphlet +pan +pancake +pancreas +panda +panel +panic +pannier +panpipe +pansy +panther +panties +pantologist +pantology +pantry +pants +pantsuit +panty +pantyhose +papa +papaya +paper +paperback +paperwork +parable +parachute +parade +paradise +paragraph +parallelogram +paramecium +paramedic +parameter +paranoia +parcel +parchment +pard +pardon +parent +parenthesis +parenting +park +parka +parking +parliament +parole +parrot +parser +parsley +parsnip +part +participant +participation +particle +particular +partner +partnership +partridge +party +pass +passage +passbook +passenger +passing +passion +passive +passport +password +past +pasta +paste +pastor +pastoralist +pastry +pasture +pat +patch +pate +patent +patentee +path +pathogenesis +pathology +pathway +patience +patient +patina +patio +patriarch +patrimony +patriot +patrol +patroller +patrolling +patron +pattern +patty +pattypan +pause +pavement +pavilion +paw +pawnshop +pay +payee +payment +payoff +pea +peace +peach +peacoat +peacock +peak +peanut +pear +pearl +peasant +pecan +pecker +pedal +peek +peen +peer +peer-to-peer +pegboard +pelican +pelt +pen +penalty +pence +pencil +pendant +pendulum +penguin +penicillin +peninsula +penis +pennant +penny +pension +pentagon +peony +people +pepper +pepperoni +percent +percentage +perception +perch +perennial +perfection +performance +perfume +period +periodical +peripheral +permafrost +permission +permit +perp +perpendicular +persimmon +person +personal +personality +personnel +perspective +pest +pet +petal +petition +petitioner +petticoat +pew +pharmacist +pharmacopoeia +phase +pheasant +phenomenon +phenotype +pheromone +philanthropy +philosopher +philosophy +phone +phosphate +photo +photodiode +photograph +photographer +photography +photoreceptor +phrase +phrasing +physical +physics +physiology +pianist +piano +piccolo +pick +pickax +pickaxe +picket +pickle +pickup +picnic +picture +picturesque +pie +piece +pier +piety +pig +pigeon +piglet +pigpen +pigsty +pike +pilaf +pile +pilgrim +pilgrimage +pill +pillar +pillbox +pillow +pilot +pimp +pimple +pin +pinafore +pince-nez +pine +pineapple +pinecone +ping +pink +pinkie +pinot +pinstripe +pint +pinto +pinworm +pioneer +pipe +pipeline +piracy +pirate +piss +pistol +pit +pita +pitch +pitcher +pitching +pith +pizza +place +placebo +placement +placode +plagiarism +plain +plaintiff +plan +plane +planet +planning +plant +plantation +planter +planula +plaster +plasterboard +plastic +plate +platelet +platform +platinum +platter +platypus +play +player +playground +playroom +playwright +plea +pleasure +pleat +pledge +plenty +plier +pliers +plight +plot +plough +plover +plow +plowman +plug +plugin +plum +plumber +plume +plunger +plywood +pneumonia +pocket +pocket-watch +pocketbook +pod +podcast +poem +poet +poetry +poignance +point +poison +poisoning +poker +polarisation +polarization +pole +polenta +police +policeman +policy +polish +politician +politics +poll +polliwog +pollutant +pollution +polo +polyester +polyp +pomegranate +pomelo +pompom +poncho +pond +pony +pool +poor +pop +popcorn +poppy +popsicle +popularity +population +populist +porcelain +porch +porcupine +pork +porpoise +port +porter +portfolio +porthole +portion +portrait +position +possession +possibility +possible +post +postage +postbox +poster +posterior +postfix +pot +potato +potential +pottery +potty +pouch +poultry +pound +pounding +poverty +powder +power +practice +practitioner +prairie +praise +pray +prayer +precedence +precedent +precipitation +precision +predecessor +preface +preference +prefix +pregnancy +prejudice +prelude +premeditation +premier +premise +premium +preoccupation +preparation +prescription +presence +present +presentation +preservation +preserves +presidency +president +press +pressroom +pressure +pressurisation +pressurization +prestige +presume +pretzel +prevalence +prevention +prey +price +pricing +pride +priest +priesthood +primary +primate +prince +princess +principal +principle +print +printer +printing +prior +priority +prison +prisoner +privacy +private +privilege +prize +prizefight +probability +probation +probe +problem +procedure +proceedings +process +processing +processor +proctor +procurement +produce +producer +product +production +productivity +profession +professional +professor +profile +profit +progenitor +program +programme +programming +progress +progression +prohibition +project +proliferation +promenade +promise +promotion +prompt +pronoun +pronunciation +proof +proof-reader +propaganda +propane +property +prophet +proponent +proportion +proposal +proposition +proprietor +prose +prosecution +prosecutor +prospect +prosperity +prostacyclin +prostanoid +prostrate +protection +protein +protest +protocol +providence +provider +province +provision +prow +proximal +proximity +prune +pruner +pseudocode +pseudoscience +psychiatrist +psychoanalyst +psychologist +psychology +ptarmigan +pub +public +publication +publicity +publisher +publishing +pudding +puddle +puffin +pug +puggle +pulley +pulse +puma +pump +pumpernickel +pumpkin +pumpkinseed +pun +punch +punctuation +punishment +pup +pupa +pupil +puppet +puppy +purchase +puritan +purity +purple +purpose +purr +purse +pursuit +push +pusher +put +puzzle +pyramid +pyridine +quadrant +quail +qualification +quality +quantity +quart +quarter +quartet +quartz +queen +query +quest +question +questioner +questionnaire +quiche +quicksand +quiet +quill +quilt +quince +quinoa +quit +quiver +quota +quotation +quote +rabbi +rabbit +raccoon +race +racer +racing +racism +racist +rack +radar +radiator +radio +radiosonde +radish +raffle +raft +rag +rage +raid +rail +railing +railroad +railway +raiment +rain +rainbow +raincoat +rainmaker +rainstorm +rainy +raise +raisin +rake +rally +ram +rambler +ramen +ramie +ranch +rancher +randomisation +randomization +range +ranger +rank +rap +rape +raspberry +rat +rate +ratepayer +rating +ratio +rationale +rations +raven +ravioli +rawhide +ray +rayon +razor +reach +reactant +reaction +read +reader +readiness +reading +real +reality +realization +realm +reamer +rear +reason +reasoning +rebel +rebellion +reboot +recall +recapitulation +receipt +receiver +reception +receptor +recess +recession +recipe +recipient +reciprocity +reclamation +recliner +recognition +recollection +recommendation +reconsideration +record +recorder +recording +recovery +recreation +recruit +rectangle +red +redesign +redhead +redirect +rediscovery +reduction +reef +refectory +reference +referendum +reflection +reform +refreshments +refrigerator +refuge +refund +refusal +refuse +regard +regime +region +regionalism +register +registration +registry +regret +regulation +regulator +rehospitalisation +rehospitalization +reindeer +reinscription +reject +relation +relationship +relative +relaxation +relay +release +reliability +relief +religion +relish +reluctance +remains +remark +reminder +remnant +remote +removal +renaissance +rent +reorganisation +reorganization +repair +reparation +repayment +repeat +replacement +replica +replication +reply +report +reporter +reporting +repository +representation +representative +reprocessing +republic +republican +reputation +request +requirement +resale +rescue +research +researcher +resemblance +reservation +reserve +reservoir +reset +residence +resident +residue +resist +resistance +resolution +resolve +resort +resource +respect +respite +response +responsibility +rest +restaurant +restoration +restriction +restroom +restructuring +result +resume +retailer +retention +rethinking +retina +retirement +retouching +retreat +retrospect +retrospective +retrospectivity +return +reunion +revascularisation +revascularization +reveal +revelation +revenant +revenge +revenue +reversal +reverse +review +revitalisation +revitalization +revival +revolution +revolver +reward +rhetoric +rheumatism +rhinoceros +rhubarb +rhyme +rhythm +rib +ribbon +rice +riddle +ride +rider +ridge +riding +rifle +right +rim +ring +ringworm +riot +rip +ripple +rise +riser +risk +rite +ritual +river +riverbed +rivulet +road +roadway +roar +roast +robe +robin +robot +robotics +rock +rocker +rocket +rocket-ship +rod +role +roll +roller +romaine +romance +roof +room +roommate +rooster +root +rope +rose +rosemary +roster +rostrum +rotation +round +roundabout +route +router +routine +row +rowboat +rowing +rubber +rubbish +rubric +ruby +ruckus +rudiment +ruffle +rug +rugby +ruin +rule +ruler +ruling +rum +rumor +run +runaway +runner +running +runway +rush +rust +rutabaga +rye +sabre +sac +sack +saddle +sadness +safari +safe +safeguard +safety +saffron +sage +sail +sailboat +sailing +sailor +saint +sake +salad +salami +salary +sale +salesman +salmon +salon +saloon +salsa +salt +salute +samovar +sampan +sample +samurai +sanction +sanctity +sanctuary +sand +sandal +sandbar +sandpaper +sandwich +sanity +sardine +sari +sarong +sash +satellite +satin +satire +satisfaction +sauce +saucer +sauerkraut +sausage +savage +savannah +saving +savings +savior +saviour +savory +saw +saxophone +scaffold +scale +scallion +scallops +scalp +scam +scanner +scarecrow +scarf +scarification +scenario +scene +scenery +scent +schedule +scheduling +schema +scheme +schizophrenic +schnitzel +scholar +scholarship +school +schoolhouse +schooner +science +scientist +scimitar +scissors +scooter +scope +score +scorn +scorpion +scotch +scout +scow +scrambled +scrap +scraper +scratch +screamer +screen +screening +screenwriting +screw +screw-up +screwdriver +scrim +scrip +script +scripture +scrutiny +sculpting +sculptural +sculpture +sea +seabass +seafood +seagull +seal +seaplane +search +seashore +seaside +season +seat +seaweed +second +secrecy +secret +secretariat +secretary +secretion +section +sectional +sector +security +sediment +seed +seeder +seeker +seep +segment +seizure +selection +self +self-confidence +self-control +self-esteem +seller +selling +semantics +semester +semicircle +semicolon +semiconductor +seminar +senate +senator +sender +senior +sense +sensibility +sensitive +sensitivity +sensor +sentence +sentencing +sentiment +sepal +separation +septicaemia +sequel +sequence +serial +series +sermon +serum +serval +servant +server +service +servitude +sesame +session +set +setback +setting +settlement +settler +severity +sewer +sex +sexuality +shack +shackle +shade +shadow +shadowbox +shakedown +shaker +shallot +shallows +shame +shampoo +shanty +shape +share +shareholder +shark +shaw +shawl +shear +shearling +sheath +shed +sheep +sheet +shelf +shell +shelter +sherbet +sherry +shield +shift +shin +shine +shingle +ship +shipper +shipping +shipyard +shirt +shirtdress +shit +shoat +shock +shoe +shoe-horn +shoehorn +shoelace +shoemaker +shoes +shoestring +shofar +shoot +shootdown +shop +shopper +shopping +shore +shoreline +short +shortage +shorts +shortwave +shot +shoulder +shout +shovel +show +show-stopper +shower +shred +shrimp +shrine +shutdown +sibling +sick +sickness +side +sideboard +sideburns +sidecar +sidestream +sidewalk +siding +siege +sigh +sight +sightseeing +sign +signal +signature +signet +significance +signify +signup +silence +silica +silicon +silk +silkworm +sill +silly +silo +silver +similarity +simple +simplicity +simplification +simvastatin +sin +singer +singing +singular +sink +sinuosity +sip +sir +sister +sister-in-law +sitar +site +situation +size +skate +skating +skean +skeleton +ski +skiing +skill +skin +skirt +skull +skullcap +skullduggery +skunk +sky +skylight +skyline +skyscraper +skywalk +slang +slapstick +slash +slate +slave +slavery +slaw +sled +sledge +sleep +sleepiness +sleeping +sleet +sleuth +slice +slide +slider +slime +slip +slipper +slippers +slope +slot +sloth +slump +smell +smelting +smile +smith +smock +smog +smoke +smoking +smolt +smuggling +snack +snail +snake +snakebite +snap +snarl +sneaker +sneakers +sneeze +sniffle +snob +snorer +snow +snowboarding +snowflake +snowman +snowmobiling +snowplow +snowstorm +snowsuit +snuck +snug +snuggle +soap +soccer +socialism +socialist +society +sociology +sock +socks +soda +sofa +softball +softdrink +softening +software +soil +soldier +sole +solicitation +solicitor +solidarity +solidity +soliloquy +solitaire +solution +solvency +sombrero +somebody +someone +someplace +somersault +something +somewhere +son +sonar +sonata +song +songbird +sonnet +soot +sophomore +soprano +sorbet +sorghum +sorrel +sorrow +sort +soul +soulmate +sound +soundness +soup +source +sourwood +sousaphone +south +southeast +souvenir +sovereignty +sow +soy +soybean +space +spacing +spade +spaghetti +span +spandex +spank +sparerib +spark +sparrow +spasm +spat +spatula +spawn +speaker +speakerphone +speaking +spear +spec +special +specialist +specialty +species +specification +spectacle +spectacles +spectrograph +spectrum +speculation +speech +speed +speedboat +spell +spelling +spelt +spending +sphere +sphynx +spice +spider +spiderling +spike +spill +spinach +spine +spiral +spirit +spiritual +spirituality +spit +spite +spleen +splendor +split +spokesman +spokeswoman +sponge +sponsor +sponsorship +spool +spoon +spork +sport +sportsman +spot +spotlight +spouse +sprag +sprat +spray +spread +spreadsheet +spree +spring +sprinkles +sprinter +sprout +spruce +spud +spume +spur +spy +spyglass +square +squash +squatter +squeegee +squid +squirrel +stab +stability +stable +stack +stacking +stadium +staff +stag +stage +stain +stair +staircase +stake +stalk +stall +stallion +stamen +stamina +stamp +stance +stand +standard +standardisation +standardization +standing +standoff +standpoint +star +starboard +start +starter +state +statement +statin +station +station-wagon +statistic +statistics +statue +status +statute +stay +steak +stealth +steam +steamroller +steel +steeple +stem +stench +stencil +step +step-aunt +step-brother +step-daughter +step-father +step-grandfather +step-grandmother +step-mother +step-sister +step-son +step-uncle +stepdaughter +stepmother +stepping-stone +stepson +stereo +stew +steward +stick +sticker +stiletto +still +stimulation +stimulus +sting +stinger +stir-fry +stitch +stitcher +stock +stock-in-trade +stockings +stole +stomach +stone +stonework +stool +stop +stopsign +stopwatch +storage +store +storey +storm +story +story-telling +storyboard +stot +stove +strait +strand +stranger +strap +strategy +straw +strawberry +strawman +stream +street +streetcar +strength +stress +stretch +strife +strike +string +strip +stripe +strobe +stroke +structure +strudel +struggle +stucco +stud +student +studio +study +stuff +stumbling +stump +stupidity +sturgeon +sty +style +styling +stylus +sub +subcomponent +subconscious +subcontractor +subexpression +subgroup +subject +submarine +submitter +subprime +subroutine +subscription +subsection +subset +subsidence +subsidiary +subsidy +substance +substitution +subtitle +suburb +subway +success +succotash +suck +sucker +suede +suet +suffocation +sugar +suggestion +suicide +suit +suitcase +suite +sulfur +sultan +sum +summary +summer +summit +sun +sunbeam +sunbonnet +sundae +sunday +sundial +sunflower +sunglasses +sunlamp +sunlight +sunrise +sunroom +sunset +sunshine +superiority +supermarket +supernatural +supervision +supervisor +supper +supplement +supplier +supply +support +supporter +suppression +supreme +surface +surfboard +surge +surgeon +surgery +surname +surplus +surprise +surround +surroundings +surrounds +survey +survival +survivor +sushi +suspect +suspenders +suspension +sustainment +sustenance +swallow +swamp +swan +swanling +swath +sweat +sweater +sweatshirt +sweatshop +sweatsuit +sweets +swell +swim +swimming +swimsuit +swine +swing +switch +switchboard +switching +swivel +sword +swordfight +swordfish +sycamore +symbol +symmetry +sympathy +symptom +syndicate +syndrome +synergy +synod +synonym +synthesis +syrup +system +t-shirt +tab +tabby +tabernacle +table +tablecloth +tablet +tabletop +tachometer +tackle +taco +tactics +tactile +tadpole +tag +tail +tailbud +tailor +tailspin +take-out +takeover +tale +talent +talk +talking +tam-o'-shanter +tamale +tambour +tambourine +tan +tandem +tangerine +tank +tank-top +tanker +tankful +tap +tape +tapioca +target +taro +tarragon +tart +task +tassel +taste +tatami +tattler +tattoo +tavern +tax +taxi +taxicab +taxpayer +tea +teacher +teaching +team +teammate +teapot +tear +tech +technician +technique +technologist +technology +tectonics +teen +teenager +teepee +telephone +telescreen +teletype +television +tell +teller +temp +temper +temperature +temple +tempo +temporariness +temporary +temptation +temptress +tenant +tendency +tender +tenement +tenet +tennis +tenor +tension +tensor +tent +tentacle +tenth +tepee +teriyaki +term +terminal +termination +terminology +termite +terrace +terracotta +terrapin +terrarium +territory +terror +terrorism +terrorist +test +testament +testimonial +testimony +testing +text +textbook +textual +texture +thanks +thaw +theater +theft +theism +theme +theology +theory +therapist +therapy +thermals +thermometer +thermostat +thesis +thickness +thief +thigh +thing +thinking +thirst +thistle +thong +thongs +thorn +thought +thousand +thread +threat +threshold +thrift +thrill +throat +throne +thrush +thrust +thug +thumb +thump +thunder +thunderbolt +thunderhead +thunderstorm +thyme +tiara +tic +tick +ticket +tide +tie +tiger +tights +tile +till +tilt +timbale +timber +time +timeline +timeout +timer +timetable +timing +timpani +tin +tinderbox +tinkle +tintype +tip +tire +tissue +titanium +title +toad +toast +toaster +tobacco +today +toe +toenail +toffee +tofu +tog +toga +toilet +tolerance +tolerant +toll +tom-tom +tomatillo +tomato +tomb +tomography +tomorrow +ton +tonality +tone +tongue +tonic +tonight +tool +toot +tooth +toothbrush +toothpaste +toothpick +top +top-hat +topic +topsail +toque +toreador +tornado +torso +torte +tortellini +tortilla +tortoise +tosser +total +tote +touch +tough-guy +tour +tourism +tourist +tournament +tow-truck +towel +tower +town +townhouse +township +toy +trace +trachoma +track +tracking +tracksuit +tract +tractor +trade +trader +trading +tradition +traditionalism +traffic +trafficker +tragedy +trail +trailer +trailpatrol +train +trainer +training +trait +tram +tramp +trance +transaction +transcript +transfer +transformation +transit +transition +translation +transmission +transom +transparency +transplantation +transport +transportation +trap +trapdoor +trapezium +trapezoid +trash +travel +traveler +tray +treasure +treasury +treat +treatment +treaty +tree +trek +trellis +tremor +trench +trend +triad +trial +triangle +tribe +tributary +trick +trigger +trigonometry +trillion +trim +trinket +trip +tripod +tritone +triumph +trolley +trombone +troop +trooper +trophy +trouble +trousers +trout +trove +trowel +truck +trumpet +trunk +trust +trustee +truth +try +tsunami +tub +tuba +tube +tuber +tug +tugboat +tuition +tulip +tumbler +tummy +tuna +tune +tune-up +tunic +tunnel +turban +turf +turkey +turmeric +turn +turning +turnip +turnover +turnstile +turret +turtle +tusk +tussle +tutu +tuxedo +tweet +tweezers +twig +twilight +twine +twins +twist +twister +twitter +type +typeface +typewriter +typhoon +ukulele +ultimatum +umbrella +unblinking +uncertainty +uncle +underclothes +underestimate +underground +underneath +underpants +underpass +undershirt +understanding +understatement +undertaker +underwear +underweight +underwire +underwriting +unemployment +unibody +uniform +uniformity +union +unique +unit +unity +universe +university +update +upgrade +uplift +upper +upstairs +upward +urge +urgency +urn +usage +use +user +usher +usual +utensil +utilisation +utility +utilization +vacation +vaccine +vacuum +vagrant +valance +valentine +validate +validity +valley +valuable +value +vampire +van +vanadyl +vane +vanilla +vanity +variability +variable +variant +variation +variety +vascular +vase +vault +vaulting +veal +vector +vegetable +vegetarian +vegetarianism +vegetation +vehicle +veil +vein +veldt +vellum +velocity +velodrome +velvet +vendor +veneer +vengeance +venison +venom +venti +venture +venue +veranda +verb +verdict +verification +vermicelli +vernacular +verse +version +vertigo +verve +vessel +vest +vestment +vet +veteran +veterinarian +veto +viability +vibe +vibraphone +vibration +vibrissae +vice +vicinity +victim +victory +video +view +viewer +vignette +villa +village +vine +vinegar +vineyard +vintage +vintner +vinyl +viola +violation +violence +violet +violin +virginal +virtue +virus +visa +viscose +vise +vision +visit +visitor +visor +vista +visual +vitality +vitamin +vitro +vivo +vixen +vodka +vogue +voice +void +vol +volatility +volcano +volleyball +volume +volunteer +volunteering +vomit +vote +voter +voting +voyage +vulture +wad +wafer +waffle +wage +wagon +waist +waistband +wait +waiter +waiting +waitress +waiver +wake +walk +walker +walking +walkway +wall +wallaby +wallet +walnut +walrus +wampum +wannabe +want +war +warden +wardrobe +warfare +warlock +warlord +warm-up +warming +warmth +warning +warrant +warren +warrior +wasabi +wash +washbasin +washcloth +washer +washtub +wasp +waste +wastebasket +wasting +watch +watcher +watchmaker +water +waterbed +watercress +waterfall +waterfront +watermelon +waterskiing +waterspout +waterwheel +wave +waveform +wax +way +weakness +wealth +weapon +wear +weasel +weather +web +webinar +webmail +webpage +website +wedding +wedge +weed +weeder +weedkiller +week +weekend +weekender +weight +weird +welcome +welfare +well +well-being +west +western +wet-bar +wetland +wetsuit +whack +whale +wharf +wheat +wheel +whelp +whey +whip +whirlpool +whirlwind +whisker +whiskey +whisper +whistle +white +whole +wholesale +wholesaler +whorl +wick +widget +widow +width +wife +wifi +wild +wildebeest +wilderness +wildlife +will +willingness +willow +win +wind +wind-chime +windage +window +windscreen +windshield +wine +winery +wing +wingman +wingtip +wink +winner +winter +wire +wiretap +wiring +wisdom +wiseguy +wish +wisteria +wit +witch +witch-hunt +withdrawal +witness +wok +wolf +woman +wombat +wonder +wont +wood +woodchuck +woodland +woodshed +woodwind +wool +woolens +word +wording +work +workbench +worker +workforce +workhorse +working +workout +workplace +workshop +world +worm +worry +worship +worshiper +worth +wound +wrap +wraparound +wrapper +wrapping +wreck +wrecker +wren +wrench +wrestler +wriggler +wrinkle +wrist +writer +writing +wrong +xylophone +yacht +yahoo +yak +yam +yang +yard +yarmulke +yarn +yawl +year +yeast +yellow +yellowjacket +yesterday +yew +yin +yoga +yogurt +yoke +yolk +young +youngster +yourself +youth +yoyo +yurt +zampone +zebra +zebrafish +zen +zephyr +zero +ziggurat +zinc +zipper +zither +zombie +zone +zoo +zoologist +zoology +zoot-suit +zucchini diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index d23b5a71ad0..1fcca3c6068 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -1046,14 +1046,6 @@ $(function() { location.reload(); }); - // Tell BYOND to give us a macro list. - // I don't know why but for some retarded reason, - // You need to activate hotkeymode before you can winget the macros in it. - runByond('byond://winset?id=mainwindow¯o=hotkeymode') - runByond('byond://winset?id=mainwindow¯o=macro') - - runByond('byond://winget?callback=wingetMacros&id=hotkeymode.*&property=command'); - /***************************************** * * KICK EVERYTHING OFF diff --git a/html/browser/autocomplete.js b/html/browser/autocomplete.js index 28d3be539c4..1ca11553b99 100644 --- a/html/browser/autocomplete.js +++ b/html/browser/autocomplete.js @@ -15,14 +15,6 @@ function updateTopic() { submitButton.setAttribute('href', hrefList.join(';')); } -function clean(name) { - // \improper shows up as 2 characters outside of ascii range - if (name.charCodeAt(0) > 127) { - return name.slice(2); - } - return name; -} - function setElements() { input = $('#input'); submitButton = $('#submit-button'); @@ -35,7 +27,7 @@ function setElements() { for (var i = 0; i < choices.options.length; i++) { var name = choices.options[i].value; - var cleaned = clean(name); + var cleaned = decodeURI(name); optionsMap[cleaned] = name; choices.options[i].value = cleaned; } diff --git a/html/changelogs/AutoChangeLog-pr-11125.yml b/html/changelogs/AutoChangeLog-pr-11125.yml new file mode 100644 index 00000000000..2208cf5854c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11125.yml @@ -0,0 +1,8 @@ +author: "Quantum-M" +delete-after: True +changes: + - rscadd: "New sprites for vampires being \"hungry\"." + - rscadd: "New sprite for vampire usable blood count." + - rscadd: "New sprites for the safety muzzle." + - tweak: "Safety muzzle (aka the anti-bitting one) can no longer be resisted out of." + - tweak: "Vampires can now suck blood from monkey mobs (e.g. monkeys, stoks, etc.) for sustenance but do not get blood power points." diff --git a/html/changelogs/AutoChangeLog-pr-11358.yml b/html/changelogs/AutoChangeLog-pr-11358.yml new file mode 100644 index 00000000000..ed5662b1047 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11358.yml @@ -0,0 +1,8 @@ +author: "Couls" +delete-after: True +changes: + - rscadd: "Diagonal movement" + - rscadd: "Input subsystem(numpad targetting, press numpad 8 multiple times to target eyes and mouth, numpad 6 or 4 to target arms and press them again to target hands and numpad 1 or 3 to target legs and press them again to target feet) taken from https://github.com/tgstation/tgstation/pull/32751" + - rscadd: "change confused status to have you move diagonally randomly in the direction you're headed if not too confused(now you can drunkenly walk down the hall)" + - rscadd: "clients are now children of datums like everything else in BYOND taken from https://github.com/tgstation/tgstation/pull/20394" + - rscadd: "AZERTY and numpad targetting preferences" diff --git a/html/changelogs/AutoChangeLog-pr-11566.yml b/html/changelogs/AutoChangeLog-pr-11566.yml new file mode 100644 index 00000000000..09138dc9324 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11566.yml @@ -0,0 +1,5 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "You can ctrl-click any action button to lock/unlock its position" + - tweak: "All actions buttons now start with their position locked" diff --git a/html/changelogs/AutoChangeLog-pr-11605.yml b/html/changelogs/AutoChangeLog-pr-11605.yml new file mode 100644 index 00000000000..46c791aaa32 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11605.yml @@ -0,0 +1,4 @@ +author: "Couls" +delete-after: True +changes: + - tweak: "Reworks the biohazard event to have a chance of giving a randomized advanced disease with 6 varying symptoms instead of a preset disease." diff --git a/html/changelogs/AutoChangeLog-pr-11634.yml b/html/changelogs/AutoChangeLog-pr-11634.yml new file mode 100644 index 00000000000..c51b73a64ae --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11634.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - rscadd: "The prison labor point system has been refactored so it works properly." diff --git a/html/changelogs/AutoChangeLog-pr-11653.yml b/html/changelogs/AutoChangeLog-pr-11653.yml new file mode 100644 index 00000000000..141c0adf1be --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11653.yml @@ -0,0 +1,4 @@ +author: "Couls" +delete-after: True +changes: + - tweak: "change how bone breakage is calculated" diff --git a/html/changelogs/AutoChangeLog-pr-11658.yml b/html/changelogs/AutoChangeLog-pr-11658.yml new file mode 100644 index 00000000000..a7deadb4af8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11658.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - rscadd: "Plating can now be removed (exposing the baseturf) using a welder." diff --git a/html/changelogs/AutoChangeLog-pr-11674.yml b/html/changelogs/AutoChangeLog-pr-11674.yml new file mode 100644 index 00000000000..5c9edc40e27 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11674.yml @@ -0,0 +1,4 @@ +author: "DoctorDrugs" +delete-after: True +changes: + - rscadd: "Adds additional roundstart miner slots and the additional gear required for them to do their jobs" diff --git a/html/changelogs/AutoChangeLog-pr-11684.yml b/html/changelogs/AutoChangeLog-pr-11684.yml new file mode 100644 index 00000000000..0f1250497f2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11684.yml @@ -0,0 +1,4 @@ +author: "IAmBigCoat" +delete-after: True +changes: + - tweak: "Added explosion warnings to medbeams, because medbeams can cause explosions. DON'T CROSS THE BEAMS!" diff --git a/html/changelogs/AutoChangeLog-pr-11687.yml b/html/changelogs/AutoChangeLog-pr-11687.yml new file mode 100644 index 00000000000..b6ceea4d139 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11687.yml @@ -0,0 +1,5 @@ +author: "Kyep" +delete-after: True +changes: + - rscadd: "Round time (h:mm) and station security level (green/red/blue/etc) are now visible on our server hub entry." + - tweak: "Round time is now visible to all player-controlled mobs in their status panel (including simple animals)." diff --git a/html/changelogs/AutoChangeLog-pr-11804.yml b/html/changelogs/AutoChangeLog-pr-11804.yml new file mode 100644 index 00000000000..355e6f0a32e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11804.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "Fixed an issue where slimes wouldn't take damage from water in space." diff --git a/html/changelogs/AutoChangeLog-pr-11805.yml b/html/changelogs/AutoChangeLog-pr-11805.yml new file mode 100644 index 00000000000..32aeba3f9eb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11805.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "It is no longer possible to unanchor the surivval pod storage units." diff --git a/html/changelogs/AutoChangeLog-pr-11806.yml b/html/changelogs/AutoChangeLog-pr-11806.yml new file mode 100644 index 00000000000..f70b8e32b82 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11806.yml @@ -0,0 +1,4 @@ +author: "Tayyyyyyy" +delete-after: True +changes: + - bugfix: "autocomplete input mishandling single quotes (you can teleport to Wizard's den now)" diff --git a/html/changelogs/AutoChangeLog-pr-11812.yml b/html/changelogs/AutoChangeLog-pr-11812.yml new file mode 100644 index 00000000000..e5bad933f7e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11812.yml @@ -0,0 +1,5 @@ +author: "Couls" +delete-after: True +changes: + - rscadd: "adds a line to alert people as to why they're not getting blood from the monkeys" + - bugfix: "The vampires are finally off their monkey diet, theycan now suck blood from players and humanized monkeys" diff --git a/html/changelogs/AutoChangeLog-pr-11821.yml b/html/changelogs/AutoChangeLog-pr-11821.yml new file mode 100644 index 00000000000..2a98f4dbae6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11821.yml @@ -0,0 +1,4 @@ +author: "Couls" +delete-after: True +changes: + - bugfix: "Symptoms are now correctly generated for level 7 biohazards" diff --git a/html/changelogs/AutoChangeLog-pr-11829.yml b/html/changelogs/AutoChangeLog-pr-11829.yml new file mode 100644 index 00000000000..7af1b527603 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11829.yml @@ -0,0 +1,9 @@ +author: "Couls" +delete-after: True +changes: + - tweak: "Borgs can now cycle modules with X again" + - tweak: "Ahelp message is less confusing" + - tweak: "F2 (say) F3(ooc) F4(me) buttons have been restored +tweak:when numpad targetting is off you can use numpad 1-4 to change intents +tweak:pressing shift before any of the intent buttons doesn't change intents(for people with shift+1-4 macros) +tweak:backspace now sets the focus to the chat bar" diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 08aca040280..8027568e31b 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 60488151158..b18cb799817 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 62f732a224f..6209ce84949 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/icons/mob/species/drask/mask.dmi b/icons/mob/species/drask/mask.dmi index dffedfb1c78..9b9c341feb3 100644 Binary files a/icons/mob/species/drask/mask.dmi and b/icons/mob/species/drask/mask.dmi differ diff --git a/icons/mob/species/grey/mask.dmi b/icons/mob/species/grey/mask.dmi index 112895a6009..6d13b33c4bf 100644 Binary files a/icons/mob/species/grey/mask.dmi and b/icons/mob/species/grey/mask.dmi differ diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi index 3b2c1891c07..f73989fe9b0 100644 Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi index 5274697cdc1..ba9be383855 100644 Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi index b836b78538f..7023b2c3247 100644 Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ diff --git a/icons/mob/species/vulpkanin/mask.dmi b/icons/mob/species/vulpkanin/mask.dmi index 43b527266b8..e50c3421fb0 100644 Binary files a/icons/mob/species/vulpkanin/mask.dmi and b/icons/mob/species/vulpkanin/mask.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index f158b1df20d..b3a04ce73bf 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index 0bec55ef51c..8edded38e93 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -96,27 +96,6 @@ src << link(config.donationsurl) else to_chat(src, "The rules URL is not set in the server configuration.") - -/client/verb/hotkey_mode() - set name = "Set Hotkey Mode" - set category = "Preferences" - - var/list/hotkey_modes = list() - for(var/hotkey_mode in subtypesof(/datum/hotkey_mode)) - var/datum/hotkey_mode/H = hotkey_mode - hotkey_modes[initial(H.name)] = H - - var/chosen_mode_name = input("Choose your preferred hotkey mode.", "Hotkey mode selection") as null|anything in hotkey_modes - if(!chosen_mode_name) - return - - var/datum/hotkey_mode/chosen_mode = hotkey_modes[chosen_mode_name] - var/datum/hotkey_mode/hotkey_mode = new chosen_mode(src) - - hotkey_mode.set_winset_values() - to_chat(usr, "Your hotkey mode has been changed to [hotkey_mode.name].") - - qdel(hotkey_mode) /client/verb/hotkeys_help() set name = "Hotkey Help" @@ -144,56 +123,58 @@ Admin ghost: /mob/proc/hotkey_help() var/hotkey_mode = {" Hotkey-Mode: (hotkey-mode must be on) -\tTAB = Toggle Hotkey Mode -\ta = Move Left -\ts = Move Down -\td = Move Right -\tw = Move Up -\tq = Drop Item -\te = Equip Item -\tr = Throw Item -\tm = Me -\tt = Say -\to = OOC -\tb = Resist -\tx = Swap Hands -\tz = Activate Held Object (or y) -\tf = Cycle Intents Left -\tg = Cycle Intents Right -\t1 = Help Intent -\t2 = Disarm Intent -\t3 = Grab Intent -\t4 = Harm Intent +\tTAB = toggle hotkey-mode +\tA = left +\tS = down +\tD = right +\tW = up +\tQ = drop +\tE = equip +\tR = throw +\tM = me +\tT = say +\tO = OOC +\tB = resist +\tH = Holster/unholster gun if you have a holster +\tX = swap-hand +\tZ = activate held object (or y) +\tF = cycle-intents-left +\tG = cycle-intents-right +\t1 = help-intent +\t2 = disarm-intent +\t3 = grab-intent +\t4 = harm-intent +\tNumpad = Body target selection (Press 8 repeatedly for Head->Eyes->Mouth) +\tAlt(HOLD) = Alter movement intent "} var/other = {" Any-Mode: (hotkey doesn't need to be on) -\tCtrl+a = Move Left -\tCtrl+s = Move Down -\tCtrl+d = Move Right -\tCtrl+w = Move Up -\tCtrl+q = Drop Item -\tCtrl+e = Equip Item -\tCtrl+r = Throw Item -\tCtrl+b = Resist -\tCtrl+o = OOC -\tCtrl+x = Swap Hands -\tCtrl+z = Activate Held Object (or Ctrl+y) -\tCtrl+f = Cycle Intents Left -\tCtrl+g = Cycle Intents Right -\tCtrl+1 = Help Intent -\tCtrl+2 = Disarm Intent -\tCtrl+3 = Grab Intent -\tCtrl+4 = Harm Intent -\tDEL = Pull -\tINS = Cycle Intents Right -\tHOME = Drop Item -\tPGUP = Swap Hands -\tPGDN = Activate Held Object -\tEND = Throw Item -\tF2 = OOC -\tF3 = Say -\tF4 = Me +\tCtrl+A = left +\tCtrl+S = down +\tCtrl+D = right +\tCtrl+W = up +\tCtrl+Q = drop +\tCtrl+E = equip +\tCtrl+R = throw +\tCtrl+B = resist +\tCtrl+H = stop pulling +\tCtrl+O = OOC +\tCtrl+X = swap-hand +\tCtrl+Z = activate held object (or Ctrl+y) +\tCtrl+F = cycle-intents-left +\tCtrl+G = cycle-intents-right +\tCtrl+1 = help-intent +\tCtrl+2 = disarm-intent +\tCtrl+3 = grab-intent +\tCtrl+4 = harm-intent +\tDEL = stop pulling +\tINS = cycle-intents-right +\tHOME = drop +\tPGUP = swap-hand +\tPGDN = activate held object +\tEND = throw +\tCtrl+Numpad = Body target selection (Press 8 repeatedly for Head->Eyes->Mouth) "} to_chat(src, hotkey_mode) @@ -203,19 +184,19 @@ Any-Mode: (hotkey doesn't need to be on) var/hotkey_mode = {" Hotkey-Mode: (hotkey-mode must be on) \tTAB = Toggle Hotkey Mode -\ta = Move Left -\ts = Move Down -\td = Move Right -\tw = Move Up -\tq = Unequip Active Module -\tm = Me -\tt = Say -\to = OOC -\tx = Cycle Active Modules -\tb = Resist -\tz = Activate Held Object (or y) -\tf = Cycle Intents Left -\tg = Cycle Intents Right +\tA = Move Left +\tS = Move Down +\tD = Move Right +\tW = Move Up +\tQ = Unequip Active Module +\tM = Me +\tT = Say +\tO = OOC +\tX = Cycle Active Modules +\tB = Resist +\tZ or Y = Activate Held Object +\tF = Cycle Intents Left +\tG = Cycle Intents Right \t1 = Activate Module 1 \t2 = Activate Module 2 \t3 = Activate Module 3 @@ -224,17 +205,17 @@ Hotkey-Mode: (hotkey-mode must be on) var/other = {" Any-Mode: (hotkey doesn't need to be on) -\tCtrl+a = Move Left -\tCtrl+s = Move Down -\tCtrl+d = Move Right -\tCtrl+w = Move Up -\tCtrl+q = Unequip Active Module -\tCtrl+x = Cycle Active Modules -\tCtrl+b = Resist -\tCtrl+o = OOC -\tCtrl+z = Activate Held Object (or Ctrl+y) -\tCtrl+f = Cycle Intents Left -\tCtrl+g = Cycle Intents Right +\tCtrl+A = Move Left +\tCtrl+S = Move Down +\tCtrl+D = Move Right +\tCtrl+W = Move Up +\tCtrl+Q = Unequip Active Module +\tCtrl+X = Cycle Active Modules +\tCtrl+B = Resist +\tCtrl+O = OOC +\tCtrl+Z or Ctrl+Y = Activate Held Object +\tCtrl+F = Cycle Intents Left +\tCtrl+G = Cycle Intents Right \tCtrl+1 = Activate Module 1 \tCtrl+2 = Activate Module 2 \tCtrl+3 = Activate Module 3 diff --git a/interface/skin.dmf b/interface/skin.dmf index e77ab2f9e33..a9af84c81ed 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1,1411 +1,40 @@ -macro "macro" - elem "MACRO-TAB" - name = "TAB" - command = ".winset \"mainwindow.macro=hotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#f0f0f0\"" - is-disabled = false - elem "MACRO-CENTER+REP" - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem "MACRO-NORTHEAST" - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem "MACRO-SOUTHEAST" - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem "MACRO-SOUTHWEST" - name = "SOUTHWEST" - command = ".southwest" - is-disabled = false - elem "MACRO-NORTHWEST" - name = "NORTHWEST" - command = ".northwest" - is-disabled = false - elem "MACRO-CTRL+WEST" - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem "MACRO-WEST+REP" - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem "MACRO-CTRL+NORTH" - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem "MACRO-NORTH+REP" - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem "MACRO-CTRL+EAST" - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem "MACRO-EAST+REP" - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem "MACRO-CTRL+SOUTH" - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem "MACRO-SOUTH+REP" - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem "MACRO-INSERT" - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem "MACRO-DELETE" - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem "MACRO-CTRL+1" - name = "CTRL+1" - command = "a-intent help" - is-disabled = false - elem "MACRO-CTRL+2" - name = "CTRL+2" - command = "a-intent disarm" - is-disabled = false - elem "MACRO-CTRL+3" - name = "CTRL+3" - command = "a-intent grab" - is-disabled = false - elem "MACRO-CTRL+4" - name = "CTRL+4" - command = "a-intent harm" - is-disabled = false - elem "MACRO-CTRL+A+REP" - name = "CTRL+A+REP" - command = ".moveleft" - is-disabled = false - elem "MACRO-CTRL+D+REP" - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem "MACRO-CTRL+B" - name = "CTRL+B" - command = "resist" - is-disabled = false - elem "MACRO-CTRL+E" - name = "CTRL+E" - command = "quick-equip" - is-disabled = false - elem "MACRO-CTRL+F" - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem "MACRO-CTRL+G" - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem "MACRO-CTRL+Q" - name = "CTRL+Q" - command = ".northwest" - is-disabled = false - elem "MACRO-CTRL+R" - name = "CTRL+R" - command = ".southwest" - is-disabled = false - elem "MACRO-CTRL+S+REP" - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem "MACRO-CTRL+W+REP" - name = "CTRL+W+REP" - command = ".moveup" - is-disabled = false - elem "MACRO-CTRL+X" - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem "MACRO-CTRL+Y" - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem "MACRO-CTRL+Z" - name = "CTRL+Z" - command = "Activate-Held-Object" - is-disabled = false - elem "MACRO-F1" - name = "F1" - command = "adminhelp" - is-disabled = false - elem "MACRO-CTRL+SHIFT+F1+REP" - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem "MACRO-F2" - name = "F2" - command = "ooc" - is-disabled = false - elem "MACRO-F2+REP" - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem "MACRO-SHIFT+F2+REP" - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem "MACRO-F3" - name = "F3" - command = ".say" - is-disabled = false - elem "MACRO-F4" - name = "F4" - command = ".me" - is-disabled = false - elem "MACRO-F5" - name = "F5" - command = "asay" - is-disabled = false - elem "MACRO-F6" - name = "F6" - command = "Aghost" - is-disabled = false - elem "MACRO-F7" - name = "F7" - command = "player-panel-new" - is-disabled = false - elem "MACRO-F8" - name = "F8" - command = "admin-pm-key" - is-disabled = false - elem "MACRO-F9" - name = "F9" - command = "Invisimin" - is-disabled = false - elem "MACRO-F12" - name = "F12" - command = "F12" - is-disabled = false - -macro "hotkeymode" - elem "HKMODE-TAB" - name = "TAB" - command = ".winset \"mainwindow.macro=macro hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5\"" - is-disabled = false - elem "HKMODE-CENTER+REP" - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem "HKMODE-NORTHEAST" - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem "HKMODE-SOUTHEAST" - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem "HKMODE-SOUTHWEST" - name = "SOUTHWEST" - command = ".southwest" - is-disabled = false - elem "HKMODE-NORTHWEST" - name = "NORTHWEST" - command = ".northwest" - is-disabled = false - elem "HKMODE-CTRL+WEST" - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem "HKMODE-WEST+REP" - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem "HKMODE-CTRL+NORTH" - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem "HKMODE-NORTH+REP" - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem "HKMODE-CTRL+EAST" - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem "HKMODE-EAST+REP" - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem "HKMODE-CTRL+SOUTH" - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem "HKMODE-SOUTH+REP" - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem "HKMODE-INSERT" - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem "HKMODE-DELETE" - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem "HKMODE-1" - name = "1" - command = "a-intent help" - is-disabled = false - elem "HKMODE-CTRL+1" - name = "CTRL+1" - command = "a-intent help" - is-disabled = false - elem "HKMODE-2" - name = "2" - command = "a-intent disarm" - is-disabled = false - elem "HKMODE-CTRL+2" - name = "CTRL+2" - command = "a-intent disarm" - is-disabled = false - elem "HKMODE-3" - name = "3" - command = "a-intent grab" - is-disabled = false - elem "HKMODE-CTRL+3" - name = "CTRL+3" - command = "a-intent grab" - is-disabled = false - elem "HKMODE-4" - name = "4" - command = "a-intent harm" - is-disabled = false - elem "HKMODE-CTRL+4" - name = "CTRL+4" - command = "a-intent harm" - is-disabled = false - elem "HKMODE-T" - name = "T" - command = ".say" - is-disabled = false - elem "HKMODE-O" - name = "O" - command = "ooc" - is-disabled = false - elem "HKMODE-M" - name = "M" - command = ".me" - is-disabled = false - elem "HKMODE-A+REP" - name = "A+REP" - command = ".moveleft" - is-disabled = false - elem "HKMODE-CTRL+A+REP" - name = "CTRL+A+REP" - command = ".moveleft" - is-disabled = false - elem "HKMODE-D+REP" - name = "D+REP" - command = ".moveright" - is-disabled = false - elem "HKMODE-CTRL+D+REP" - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem "HKMODE-B" - name = "B" - command = "resist" - is-disabled = false - elem "HKMODE-CTRL+B" - name = "CTRL+B" - command = "resist" - is-disabled = false - elem "HKMODE-E" - name = "E" - command = "quick-equip" - is-disabled = false - elem "HKMODE-CTRL+E" - name = "CTRL+E" - command = "quick-equip" - is-disabled = false - elem "HKMODE-F" - name = "F" - command = "a-intent left" - is-disabled = false - elem "HKMODE-CTRL+F" - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem "HKMODE-G" - name = "G" - command = "a-intent right" - is-disabled = false - elem "HKMODE-CTRL+G" - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem "HKMODE-H" - name = "H" - command = "holster" - is-disabled = false - elem "HKMODE-CTRL+H" - name = "CTRL+H" - command = "holster" - is-disabled = false - elem "HKMODE-Q" - name = "Q" - command = ".northwest" - is-disabled = false - elem "HKMODE-CTRL+Q" - name = "CTRL+Q" - command = ".northwest" - is-disabled = false - elem "HKMODE-R" - name = "R" - command = ".southwest" - is-disabled = false - elem "HKMODE-CTRL+R" - name = "CTRL+R" - command = ".southwest" - is-disabled = false - elem "s_key" - name = "S+REP" - command = ".movedown" - is-disabled = false - elem "HKMODE-CTRL+S+REP" - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem "HKMODE-T" - name = "T" - command = ".say" - is-disabled = false - elem "w_key" - name = "W+REP" - command = ".moveup" - is-disabled = false - elem "HKMODE-CTRL+W+REP" - name = "CTRL+W+REP" - command = ".moveup" - is-disabled = false - elem "HKMODE-X" - name = "X" - command = ".northeast" - is-disabled = false - elem "HKMODE-CTRL+X" - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem "HKMODE-Y" - name = "Y" - command = "Activate-Held-Object" - is-disabled = false - elem "HKMODE-CTRL+Y" - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem "HKMODE-Z" - name = "Z" - command = "Activate-Held-Object" - is-disabled = false - elem "HKMODE-CTRL+Z" - name = "CTRL+Z" - command = "Activate-Held-Object" - is-disabled = false - elem "HKMODE-F1" - name = "F1" - command = "adminhelp" - is-disabled = false - elem "HKMODE-CTRL+SHIFT+F1+REP" - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem "HKMODE-F2" - name = "F2" - command = "ooc" - is-disabled = false - elem "HKMODE-F2+REP" - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem "HKMODE-SHIFT+F2+REP" - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem "HKMODE-F3" - name = "F3" - command = ".say" - is-disabled = false - elem "HKMODE-F4" - name = "F4" - command = ".me" - is-disabled = false - elem "HKMODE-F5" - name = "F5" - command = "asay" - is-disabled = false - elem "HKMODE-F6" - name = "F6" - command = "Aghost" - is-disabled = false - elem "HKMODE-F7" - name = "F7" - command = "player-panel-new" - is-disabled = false - elem "HKMODE-F8" - name = "F8" - command = "admin-pm-key" - is-disabled = false - elem "HKMODE-F9" - name = "F9" - command = "Invisimin" - is-disabled = false - elem "HKMODE-F12" - name = "F12" - command = "F12" - is-disabled = false - -macro "borgmacro" - elem "BRGMACRO-TAB" - name = "TAB" - command = ".winset \"mainwindow.macro=borghotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0\"" - is-disabled = false - elem "BRGMACRO-CENTER+REP" - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem "BRGMACRO-NORTHEAST" - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem "BRGMACRO-SOUTHEAST" - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem "BRGMACRO-NORTHWEST" - name = "NORTHWEST" - command = "unequip-module" - is-disabled = false - elem "BRGMACRO-CTRL+WEST" - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem "BRGMACRO-WEST+REP" - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem "BRGMACRO-CTRL+NORTH" - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem "BRGMACRO-NORTH+REP" - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem "BRGMACRO-CTRL+EAST" - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem "BRGMACRO-EAST+REP" - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem "BRGMACRO-CTRL+SOUTH" - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem "BRGMACRO-SOUTH+REP" - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem "BRGMACRO-INSERT" - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem "BRGMACRO-DELETE" - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem "BRGMACRO-CTRL+1" - name = "CTRL+1" - command = "toggle-module 1" - is-disabled = false - elem "BRGMACRO-CTRL+2" - name = "CTRL+2" - command = "toggle-module 2" - is-disabled = false - elem "BRGMACRO-CTRL+3" - name = "CTRL+3" - command = "toggle-module 3" - is-disabled = false - elem "BRGMACRO-CTRL+4" - name = "CTRL+4" - command = "a-intent left" - is-disabled = false - elem "BRGMACRO-CTRL+A+REP" - name = "CTRL+A+REP" - command = ".moveleft" - is-disabled = false - elem "BRGMACRO-CTRL+B" - name = "CTRL+B" - command = "resist" - is-disabled = false - elem "BRGMACRO-CTRL+O" - name = "CTRL+O" - command = "ooc" - is-disabled = false - elem "BRGMACRO-CTRL+D+REP" - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem "BRGMACRO-CTRL+F" - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem "BRGMACRO-CTRL+G" - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem "BRGMACRO-CTRL+Q" - name = "CTRL+Q" - command = "unequip-module" - is-disabled = false - elem "BRGMACRO-CTRL+S+REP" - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem "BRGMACRO-CTRL+W+REP" - name = "CTRL+W+REP" - command = ".moveup" - is-disabled = false - elem "BRGMACRO-CTRL+X" - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem "BRGMACRO-CTRL+Y" - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem "BRGMACRO-CTRL+Z" - name = "CTRL+Z" - command = "Activate-Held-Object" - is-disabled = false - elem "BRGMACRO-F1" - name = "F1" - command = "adminhelp" - is-disabled = false - elem "BRGMACRO-CTRL+SHIFT+F1+REP" - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem "BRGMACRO-F2" - name = "F2" - command = "ooc" - is-disabled = false - elem "BRGMACRO-F2+REP" - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem "BRGMACRO-SHIFT+F2+REP" - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem "BRGMACRO-F3" - name = "F3" - command = ".say" - is-disabled = false - elem "BRGMACRO-F4" - name = "F4" - command = ".me" - is-disabled = false - elem "BRGMACRO-F5" - name = "F5" - command = "asay" - is-disabled = false - elem "BRGMACRO-F6" - name = "F6" - command = "Aghost" - is-disabled = false - elem "BRGMACRO-F7" - name = "F7" - command = "player-panel-new" - is-disabled = false - elem "BRGMACRO-F8" - name = "F8" - command = "admin-pm-key" - is-disabled = false - elem "BRGMACRO-F9" - name = "F9" - command = "Invisimin" - is-disabled = false - elem "BRGMACRO-F12" - name = "F12" - command = "F12" - is-disabled = false - -macro "borghotkeymode" - elem "BRGHK-TAB" - name = "TAB" - command = ".winset \"mainwindow.macro=borgmacro hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5\"" - is-disabled = false - elem "BRGHK-CENTER+REP" - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem "BRGHK-NORTHEAST" - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem "BRGHK-SOUTHEAST" - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem "BRGHK-NORTHWEST" - name = "NORTHWEST" - command = "unequip-module" - is-disabled = false - elem "BRGHK-CTRL+WEST" - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem "BRGHK-WEST+REP" - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem "BRGHK-CTRL+NORTH" - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem "BRGHK-NORTH+REP" - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem "BRGHK-CTRL+EAST" - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem "BRGHK-EAST+REP" - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem "BRGHK-CTRL+SOUTH" - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem "BRGHK-SOUTH+REP" - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem "BRGHK-INSERT" - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem "BRGHK-DELETE" - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem "BRGHK-1" - name = "1" - command = "toggle-module 1" - is-disabled = false - elem "BRGHK-CTRL+1" - name = "CTRL+1" - command = "toggle-module 1" - is-disabled = false - elem "BRGHK-2" - name = "2" - command = "toggle-module 2" - is-disabled = false - elem "BRGHK-CTRL+2" - name = "CTRL+2" - command = "toggle-module 2" - is-disabled = false - elem "BRGHK-3" - name = "3" - command = "toggle-module 3" - is-disabled = false - elem "BRGHK-CTRL+3" - name = "CTRL+3" - command = "toggle-module 3" - is-disabled = false - elem "BRGHK-4" - name = "4" - command = "a-intent left" - is-disabled = false - elem "BRGHK-CTRL+4" - name = "CTRL+4" - command = "a-intent left" - is-disabled = false - elem "BRGHK-A+REP" - name = "A+REP" - command = ".moveleft" - is-disabled = false - elem "BRGHK-CTRL+A+REP" - name = "CTRL+A+REP" - command = ".moveleft" - is-disabled = false - elem "BRGHK-B" - name = "B" - command = "resist" - is-disabled = false - elem "BRGHK-CTRL+B" - name = "CTRL+B" - command = "resist" - is-disabled = false - elem "BRGHK-T" - name = "T" - command = ".say" - is-disabled = false - elem "BRGHK-O" - name = "O" - command = "ooc" - is-disabled = false - elem "BRGHK-M" - name = "M" - command = ".me" - is-disabled = false - elem "BRGHK-CTRL+O" - name = "CTRL+O" - command = "ooc" - is-disabled = false - elem "BRGHK-D+REP" - name = "D+REP" - command = ".moveright" - is-disabled = false - elem "BRGHK-CTRL+D+REP" - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem "BRGHK-F" - name = "F" - command = "a-intent left" - is-disabled = false - elem "BRGHK-CTRL+F" - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem "BRGHK-G" - name = "G" - command = "a-intent right" - is-disabled = false - elem "BRGHK-CTRL+G" - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem "BRGHK-Q" - name = "Q" - command = "unequip-module" - is-disabled = false - elem "BRGHK-CTRL+Q" - name = "CTRL+Q" - command = "unequip-module" - is-disabled = false - elem "s_key" - name = "S+REP" - command = ".movedown" - is-disabled = false - elem "BRGHK-CTRL+S+REP" - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem "w_key" - name = "W+REP" - command = ".moveup" - is-disabled = false - elem "BRGHK-CTRL+W+REP" - name = "CTRL+W+REP" - command = ".moveup" - is-disabled = false - elem "BRGHK-X" - name = "X" - command = ".northeast" - is-disabled = false - elem "BRGHK-CTRL+X" - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem "BRGHK-Y" - name = "Y" - command = "Activate-Held-Object" - is-disabled = false - elem "BRGHK-CTRL+Y" - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem "BRGHK-Z" - name = "Z" - command = "Activate-Held-Object" - is-disabled = false - elem "BRGHK-CTRL+Z" - name = "CTRL+Z" - command = "Activate-Held-Object" - is-disabled = false - elem "BRGHK-F1" - name = "F1" - command = "adminhelp" - is-disabled = false - elem "BRGHK-CTRL+SHIFT+F1+REP" - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem "BRGHK-F2" - name = "F2" - command = "ooc" - is-disabled = false - elem "BRGHK-F2+REP" - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem "BRGHK-SHIFT+F2+REP" - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem "BRGHK-F3" - name = "F3" - command = ".say" - is-disabled = false - elem "BRGHK-F4" - name = "F4" - command = ".me" - is-disabled = false - elem "BRGHK-F5" - name = "F5" - command = "asay" - is-disabled = false - elem "BRGHK-F6" - name = "F6" - command = "Aghost" - is-disabled = false - elem "BRGHK-F7" - name = "F7" - command = "player-panel-new" - is-disabled = false - elem "BRGHK-F8" - name = "F8" - command = "admin-pm-key" - is-disabled = false - elem "BRGHK-F9" - name = "F9" - command = "Invisimin" - is-disabled = false - elem "BRGHK-F12" - name = "F12" - command = "F12" - is-disabled = false - -macro "azertymacro" - elem "AZRFF-TAB" - name = "TAB" - command = ".winset \"mainwindow.macro=azertyhotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0\"" - is-disabled = false - elem "AZRFF-CENTER+REP" - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem "AZRFF-NORTHEAST" - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem "AZRFF-SOUTHEAST" - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem "AZRFF-SOUTHWEST" - name = "SOUTHWEST" - command = ".southwest" - is-disabled = false - elem "AZRFF-NORTHWEST" - name = "NORTHWEST" - command = ".northwest" - is-disabled = false - elem "AZRFF-CTRL+WEST" - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem "AZRFF-WEST+REP" - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem "AZRFF-CTRL+NORTH" - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem "AZRFF-NORTH+REP" - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem "AZRFF-CTRL+EAST" - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem "AZRFF-EAST+REP" - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem "AZRFF-CTRL+SOUTH" - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem "AZRFF-SOUTH+REP" - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem "AZRFF-INSERT" - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem "AZRFF-DELETE" - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem "AZRFF-CTRL+1" - name = "CTRL+1" - command = "a-intent help" - is-disabled = false - elem "AZRFF-CTRL+2" - name = "CTRL+2" - command = "a-intent disarm" - is-disabled = false - elem "AZRFF-CTRL+3" - name = "CTRL+3" - command = "a-intent grab" - is-disabled = false - elem "AZRFF-CTRL+4" - name = "CTRL+4" - command = "a-intent harm" - is-disabled = false - elem "AZRFF-CTRL+A" - name = "CTRL+A" - command = ".northwest" - is-disabled = false - elem "AZRFF-CTRL+D+REP" - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem "AZRFF-CTRL+B" - name = "CTRL+B" - command = "resist" - is-disabled = false - elem "AZRFF-CTRL+E" - name = "CTRL+E" - command = "quick-equip" - is-disabled = false - elem "AZRFF-CTRL+F" - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem "AZRFF-CTRL+G" - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem "AZRFF-CTRL+Q+REP" - name = "CTRL+Q+REP" - command = ".moveleft" - is-disabled = false - elem "AZRFF-CTRL+R" - name = "CTRL+R" - command = ".southwest" - is-disabled = false - elem "AZRFF-CTRL+S+REP" - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem "AZRFF-CTRL+W" - name = "CTRL+W" - command = "Activate-Held-Object" - is-disabled = false - elem "AZRFF-CTRL+X" - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem "AZRFF-CTRL+Y" - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem "AZRFF-CTRL+Z+REP" - name = "CTRL+Z+REP" - command = ".moveup" - is-disabled = false - elem "AZRFF-F1" - name = "F1" - command = "adminhelp" - is-disabled = false - elem "AZRFF-CTRL+SHIFT+F1+REP" - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem "AZRFF-F2" - name = "F2" - command = "ooc" - is-disabled = false - elem "AZRFF-F2+REP" - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem "AZRFF-SHIFT+F2+REP" - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem "AZRFF-F3" - name = "F3" - command = ".say" - is-disabled = false - elem "AZRFF-F4" - name = "F4" - command = ".me" - is-disabled = false - elem "AZRFF-F5" - name = "F5" - command = "asay" - is-disabled = false - elem "AZRFF-F6" - name = "F6" - command = "Aghost" - is-disabled = false - elem "AZRFF-F7" - name = "F7" - command = "player-panel-new" - is-disabled = false - elem "AZRFF-F8" - name = "F8" - command = "admin-pm-key" - is-disabled = false - elem "AZRFF-F9" - name = "F9" - command = "Invisimin" - is-disabled = false - elem "AZRFF-F12" - name = "F12" - command = "F12" - is-disabled = false - -macro "azertyhotkeymode" - elem "AZRON-TAB" - name = "TAB" - command = ".winset \"mainwindow.macro=azertymacro hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5\"" - is-disabled = false - elem "AZRON-CENTER+REP" - name = "CENTER+REP" - command = ".center" - is-disabled = false - elem "AZRON-NORTHEAST" - name = "NORTHEAST" - command = ".northeast" - is-disabled = false - elem "AZRON-SOUTHEAST" - name = "SOUTHEAST" - command = ".southeast" - is-disabled = false - elem "AZRON-SOUTHWEST" - name = "SOUTHWEST" - command = ".southwest" - is-disabled = false - elem "AZRON-NORTHWEST" - name = "NORTHWEST" - command = ".northwest" - is-disabled = false - elem "AZRON-CTRL+WEST" - name = "CTRL+WEST" - command = "westface" - is-disabled = false - elem "AZRON-WEST+REP" - name = "WEST+REP" - command = ".moveleft" - is-disabled = false - elem "AZRON-CTRL+NORTH" - name = "CTRL+NORTH" - command = "northface" - is-disabled = false - elem "AZRON-NORTH+REP" - name = "NORTH+REP" - command = ".moveup" - is-disabled = false - elem "AZRON-CTRL+EAST" - name = "CTRL+EAST" - command = "eastface" - is-disabled = false - elem "AZRON-EAST+REP" - name = "EAST+REP" - command = ".moveright" - is-disabled = false - elem "AZRON-CTRL+SOUTH" - name = "CTRL+SOUTH" - command = "southface" - is-disabled = false - elem "AZRON-SOUTH+REP" - name = "SOUTH+REP" - command = ".movedown" - is-disabled = false - elem "AZRON-INSERT" - name = "INSERT" - command = "a-intent right" - is-disabled = false - elem "AZRON-DELETE" - name = "DELETE" - command = "delete-key-pressed" - is-disabled = false - elem "AZRON-1" - name = "1" - command = "a-intent help" - is-disabled = false - elem "AZRON-CTRL+1" - name = "CTRL+1" - command = "a-intent help" - is-disabled = false - elem "AZRON-2" - name = "2" - command = "a-intent disarm" - is-disabled = false - elem "AZRON-CTRL+2" - name = "CTRL+2" - command = "a-intent disarm" - is-disabled = false - elem "AZRON-3" - name = "3" - command = "a-intent grab" - is-disabled = false - elem "AZRON-CTRL+3" - name = "CTRL+3" - command = "a-intent grab" - is-disabled = false - elem "AZRON-4" - name = "4" - command = "a-intent harm" - is-disabled = false - elem "AZRON-CTRL+4" - name = "CTRL+4" - command = "a-intent harm" - is-disabled = false - elem "AZRON-A" - name = "A" - command = ".northwest" - is-disabled = false - elem "AZRON-CTRL+A" - name = "CTRL+A" - command = ".northwest" - is-disabled = false - elem "AZRON-D+REP" - name = "D+REP" - command = ".moveright" - is-disabled = false - elem "AZRON-CTRL+D+REP" - name = "CTRL+D+REP" - command = ".moveright" - is-disabled = false - elem "AZRON-CTRL+B" - name = "CTRL+B" - command = "resist" - is-disabled = false - elem "AZRON-E" - name = "E" - command = "quick-equip" - is-disabled = false - elem "AZRON-CTRL+E" - name = "CTRL+E" - command = "quick-equip" - is-disabled = false - elem "AZRON-F" - name = "F" - command = "a-intent left" - is-disabled = false - elem "AZRON-CTRL+F" - name = "CTRL+F" - command = "a-intent left" - is-disabled = false - elem "AZRON-G" - name = "G" - command = "a-intent right" - is-disabled = false - elem "AZRON-CTRL+G" - name = "CTRL+G" - command = "a-intent right" - is-disabled = false - elem "AZRON-H" - name = "H" - command = "holster" - is-disabled = false - elem "AZRON-CTRL+H" - name = "CTRL+H" - command = "holster" - is-disabled = false - elem "AZRON-Q+REP" - name = "Q+REP" - command = ".moveleft" - is-disabled = false - elem "AZRON-CTRL+Q+REP" - name = "CTRL+Q+REP" - command = ".moveleft" - is-disabled = false - elem "AZRON-R" - name = "R" - command = ".southwest" - is-disabled = false - elem "AZRON-CTRL+R" - name = "CTRL+R" - command = ".southwest" - is-disabled = false - elem "s_key" - name = "S+REP" - command = ".movedown" - is-disabled = false - elem "AZRON-CTRL+S+REP" - name = "CTRL+S+REP" - command = ".movedown" - is-disabled = false - elem "AZRON-T" - name = "T" - command = ".say" - is-disabled = false - elem "AZRON-O" - name = "O" - command = "ooc" - is-disabled = false - elem "AZRON-M" - name = "M" - command = ".me" - is-disabled = false - elem "AZRON-W" - name = "W" - command = "Activate-Held-Object" - is-disabled = false - elem "AZRON-CTRL+W" - name = "CTRL+W" - command = "Activate-Held-Object" - is-disabled = false - elem "AZRON-X" - name = "X" - command = ".northeast" - is-disabled = false - elem "AZRON-CTRL+X" - name = "CTRL+X" - command = ".northeast" - is-disabled = false - elem "AZRON-Y" - name = "Y" - command = "Activate-Held-Object" - is-disabled = false - elem "AZRON-CTRL+Y" - name = "CTRL+Y" - command = "Activate-Held-Object" - is-disabled = false - elem "w_key" - name = "Z+REP" - command = ".moveup" - is-disabled = false - elem "AZRON-CTRL+Z+REP" - name = "CTRL+Z+REP" - command = ".moveup" - is-disabled = false - elem "AZRON-F1" - name = "F1" - command = "adminhelp" - is-disabled = false - elem "AZRON-CTRL+SHIFT+F1+REP" - name = "CTRL+SHIFT+F1+REP" - command = ".options" - is-disabled = false - elem "AZRON-F2" - name = "F2" - command = "ooc" - is-disabled = false - elem "AZRON-F2+REP" - name = "F2+REP" - command = ".screenshot auto" - is-disabled = false - elem "AZRON-SHIFT+F2+REP" - name = "SHIFT+F2+REP" - command = ".screenshot" - is-disabled = false - elem "AZRON-F3" - name = "F3" - command = ".say" - is-disabled = false - elem "AZRON-F4" - name = "F4" - command = ".me" - is-disabled = false - elem "AZRON-F5" - name = "F5" - command = "asay" - is-disabled = false - elem "AZRON-F6" - name = "F6" - command = "Aghost" - is-disabled = false - elem "AZRON-F7" - name = "F7" - command = "player-panel-new" - is-disabled = false - elem "AZRON-F8" - name = "F8" - command = "admin-pm-key" - is-disabled = false - elem "AZRON-F9" - name = "F9" - command = "Invisimin" - is-disabled = false - elem "AZRON-F12" - name = "F12" - command = "F12" - is-disabled = false +macro "default" menu "menu" - elem + elem name = "&File" command = "" - category = "" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "&Quick screenshot\tF2" command = ".screenshot auto" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "&Save screenshot as...\tShift+F2" command = ".screenshot" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" elem "reconnectbutton" name = "&Reconnect" command = ".reconnect" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "" command = "" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "&Quit" command = ".quit" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "&Icons" command = "" saved-params = "is-checked" - elem + elem name = "&Size" command = "" category = "&Icons" @@ -1453,7 +82,7 @@ menu "menu" can-check = true group = "size" saved-params = "is-checked" - elem + elem name = "&Scaling" command = "" category = "&Icons" @@ -1484,106 +113,79 @@ menu "menu" command = ".winset \"menu.textmode.is-checked=true?mapwindow.map.text-mode=true:mapwindow.map.text-mode=false\"" category = "&Icons" can-check = true - group = "" saved-params = "is-checked" - - elem + elem name = "&Help" command = "" - category = "" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "&Admin help\tF1" command = "adminhelp" category = "&Help" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" - elem + elem name = "&Hotkeys" command = "hotkeys-help" category = "&Help" - is-checked = false - can-check = false - group = "" - is-disabled = false saved-params = "is-checked" window "mainwindow" elem "mainwindow" type = MAIN + pos = 0,0 size = 640x440 + anchor1 = none + anchor2 = none is-default = true - is-maximized = true - title = "Paradise Station 13" - icon = 'icons\\paradise.png' - menu = "menu" - macro = "macro" saved-params = "pos;size;is-minimized;is-maximized" + title = "Paradise Station 13" + is-maximized = true + icon = 'icons\\paradise.png' + macro = "default" + menu = "menu" elem "asset_cache_browser" type = BROWSER - is-visible = false - elem "hotkey_toggle" - type = BUTTON - button-type = pushbox - pos = 560,420 - size = 80x20 - anchor1 = 100,100 + pos = 0,0 + size = 200x200 + anchor1 = none anchor2 = none - background-color = none + is-visible = false saved-params = "" - is-flat = false - text = "Hotkey Toggle" - command = ".winset \"mainwindow.macro != macro ? mainwindow.macro=macro hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5 : mainwindow.macro=hotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#f0f0f0\"" elem "mainvsplit" type = CHILD pos = 3,0 size = 634x416 anchor1 = 0,0 anchor2 = 100,100 - is-vert = true - splitter = 50 - show-splitter = true + saved-params = "splitter" left = "mapwindow" right = "rpane" - saved-params = "splitter" + is-vert = true elem "input" type = INPUT pos = 3,420 size = 477x20 anchor1 = 0,100 anchor2 = 100,100 + background-color = #d3b5b5 is-default = true border = sunken - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = #d3b5b5 saved-params = "command" elem "saybutton" type = BUTTON - button-type = pushbox - pos = 520,420 - size = 40x20 + pos = 480,420 + size = 80x20 anchor1 = 100,100 anchor2 = none - is-flat = false + saved-params = "is-checked" text = "Chat" command = ".winset \"saybutton.is-checked=true?input.command=\"!say \\\"\" macrobutton.is-checked=false:input.command=\"\"saybutton.is-checked=true?mebutton.is-checked=false\"" - is-checked = false - saved-params = "is-checked" + button-type = pushbox elem "mebutton" type = BUTTON - pos = 480,420 - size = 40x20 + pos = 560,420 + size = 80x20 anchor1 = 100,100 anchor2 = none saved-params = "is-checked" @@ -1594,54 +196,63 @@ window "mainwindow" type = BROWSER pos = 0,0 size = 999x999 + anchor1 = none + anchor2 = none is-visible = false + saved-params = "" window "mapwindow" elem "mapwindow" type = MAIN - is-pane = true - title = "Map window" + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none saved-params = "pos;size;is-minimized;is-maximized" + title = "Map window" + is-pane = true elem "map" type = MAP - is-default = true pos = 0,0 size = 640x480 anchor1 = 0,0 anchor2 = 100,100 font-family = "Arial" font-size = 7 - font-style = "" text-color = none - background-color = none - icon-size = 0 + is-default = true saved-params = "icon-size" window "outputwindow" elem "outputwindow" type = MAIN - is-pane = true - can-close = false - can-minimize = false + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none saved-params = "pos;size;is-minimized;is-maximized" title = "Output window" + can-close = false + can-minimize = false + is-pane = true elem "browseroutput" type = BROWSER - is-disabled = true - auto-format = false pos = 0,0 size = 640x480 anchor1 = 0,0 anchor2 = 100,100 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 background-color = #ffffff + is-disabled = true + saved-params = "" + auto-format = false window "rpane" elem "rpane" type = MAIN + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none saved-params = "pos;size;is-minimized;is-maximized" is-pane = true elem "rpanewindow" @@ -1651,15 +262,14 @@ window "rpane" anchor1 = 0,0 anchor2 = 100,100 saved-params = "splitter" - left = "" right = "outputwindow" is-vert = false - splitter = 50 - show-splitter = true elem "textb" type = BUTTON pos = 0,7 size = 60x16 + anchor1 = none + anchor2 = none is-visible = false saved-params = "is-checked" text = "Text" @@ -1671,6 +281,8 @@ window "rpane" type = BUTTON pos = 64,7 size = 60x16 + anchor1 = none + anchor2 = none is-visible = false saved-params = "is-checked" text = "Info" @@ -1681,63 +293,89 @@ window "rpane" type = BUTTON pos = 155,7 size = 60x16 + anchor1 = none + anchor2 = none + saved-params = "is-checked" text = "Wiki" command = "wiki" elem "forumb" type = BUTTON pos = 220,7 size = 60x16 + anchor1 = none + anchor2 = none + saved-params = "is-checked" text = "Forum" command = "forum" elem "rulesb" type = BUTTON pos = 285,7 size = 60x16 + anchor1 = none + anchor2 = none + saved-params = "is-checked" text = "Rules" command = "rules" elem "githubb" type = BUTTON pos = 350,7 size = 60x16 + anchor1 = none + anchor2 = none + saved-params = "is-checked" text = "GitHub" command = "github" elem "changelog" type = BUTTON pos = 415,7 size = 67x16 + anchor1 = none + anchor2 = none + saved-params = "is-checked" text = "Changelog" command = "Changelog" elem "discordb" type = BUTTON pos = 487,7 size = 60x16 - background-color = #7289DA - text-color = #FFFFFF - font-style = bold + anchor1 = none + anchor2 = none + font-style = "bold" + text-color = #ffffff + background-color = #7289da + saved-params = "is-checked" text = "Discord" command = "discord" elem "karma" type = BUTTON pos = 552,7 size = 60x16 - background-color = #FF4500 - text-color = #FFFFFF - font-style = bold + anchor1 = none + anchor2 = none + font-style = "bold" + text-color = #ffffff + background-color = #ff4500 + saved-params = "is-checked" text = "Karma" command = "karmashop" elem "donate" type = BUTTON pos = 617,7 size = 60x16 + anchor1 = none + anchor2 = none + font-style = "bold" + text-color = #ffffff background-color = #008000 - text-color = #FFFFFF - font-style = bold + saved-params = "is-checked" text = "Donate" command = "Donate" elem "browseb" type = BUTTON pos = 561,7 size = 60x16 + anchor1 = none + anchor2 = none is-visible = false saved-params = "is-checked" text = "Browser" @@ -1748,9 +386,13 @@ window "rpane" window "browserwindow" elem "browserwindow" type = MAIN - is-pane = true + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none saved-params = "pos;size;is-minimized;is-maximized" title = "Browser" + is-pane = true elem "browser" type = BROWSER pos = 0,0 @@ -1758,15 +400,20 @@ window "browserwindow" anchor1 = 0,0 anchor2 = 100,100 is-default = true + saved-params = "" on-show = ".winset\"rpane.infob.is-visible=true?rpane.infob.pos=130,7;rpane.textb.is-visible=true;rpane.browseb.is-visible=true;rpane.browseb.is-checked=true;rpane.rpanewindow.pos=0,30;rpane.rpanewindow.size=0x0;rpane.rpanewindow.left=browserwindow\"" on-hide = ".winset\"rpane.infob.is-visible=true?rpane.infob.is-checked=true rpane.infob.pos=65,7 rpane.rpanewindow.left=infowindow:rpane.rpanewindow.left=textwindow rpane.textb.is-visible=true rpane.rpanewindow.pos=0,30 rpane.rpanewindow.size=0x0\"" window "infowindow" elem "infowindow" type = MAIN - is-pane = true + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none saved-params = "pos;size;is-minimized;is-maximized" title = "Info" + is-pane = true elem "info" type = INFO pos = 0,0 @@ -1774,9 +421,8 @@ window "infowindow" anchor1 = 0,0 anchor2 = 100,100 is-default = true + saved-params = "" highlight-color = #00aa00 - tab-text-color = #000000 - allow-html = true - multi-line = true on-show = ".winset\"rpane.infob.is-visible=true;rpane.browseb.is-visible=true?rpane.infob.pos=130,7:rpane.infob.pos=65,7 rpane.textb.is-visible=true rpane.infob.is-checked=true rpane.rpanewindow.pos=0,30 rpane.rpanewindow.size=0x0 rpane.rpanewindow.left=infowindow\"" on-hide = ".winset\"rpane.infob.is-visible=false;rpane.browseb.is-visible=true?rpane.browseb.is-checked=true rpane.rpanewindow.left=browserwindow:rpane.textb.is-visible=true rpane.rpanewindow.pos=0,30 rpane.rpanewindow.size=0x0 rpane.rpanewindow.left=\"" + diff --git a/nano/templates/labor_claim_console.tmpl b/nano/templates/labor_claim_console.tmpl new file mode 100644 index 00000000000..efbdb5796d6 --- /dev/null +++ b/nano/templates/labor_claim_console.tmpl @@ -0,0 +1,76 @@ + + + + +

Ore values

+
+ {{for data.ores}} +
+
+ {{:value.ore}}: +
+
+ {{:value.value}} +
+
+ {{/for}} +
+ +

Points

+
+
+
+ ID: +
+
+ {{:helper.link(data.id ? data.id_name : '-------------', null, { 'handle_id' : 1 })}} +
+
+ {{if data.id}} +
+
+ Points collected: +
+
+ {{:data.points}} +
+
+
+
+ Goal: +
+
+ {{:data.goal}} +
+
+
+
+ Unclaimed points: +
+
+
{{:data.unclaimed_points}}
+ {{:helper.link('Claim points', null, { 'claim_points' : 1 }, data.unclaimed_points ? null : 'disabled')}} +
+
+ {{/if}} +
+ +
+ {{:helper.link('Move shuttle', null, { 'move_shuttle' : 1 }, data.can_go_home ? null : 'disabled', 'link centerButton')}} +
\ No newline at end of file diff --git a/paradise.dme b/paradise.dme index 725ae870678..4a01cfbb505 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1,2424 +1,2435 @@ -// DM Environment file for paradise.dme. -// All manual changes should be made outside the BEGIN_ and END_ blocks. - // New source code should be placed in .dm files: choose File/New --> Code File. -// BEGIN_INTERNALS -// END_INTERNALS -// BEGIN_FILE_DIR -#define FILE_DIR . -// END_FILE_DIR -// BEGIN_PREFERENCES -#define DEBUG -// END_PREFERENCES -// BEGIN_INCLUDE -#include "_maps\__MAP_DEFINES.dm" -#include "_maps\cyberiad.dm" -#include "code\_compile_options.dm" -#include "code\hub.dm" -#include "code\world.dm" -#include "code\__DEFINES\_globals.dm" -#include "code\__DEFINES\_readme.dm" -#include "code\__DEFINES\_tick.dm" -#include "code\__DEFINES\admin.dm" -#include "code\__DEFINES\antagonists.dm" -#include "code\__DEFINES\atmospherics.dm" -#include "code\__DEFINES\bots.dm" -#include "code\__DEFINES\callbacks.dm" -#include "code\__DEFINES\clothing.dm" -#include "code\__DEFINES\combat.dm" -#include "code\__DEFINES\components.dm" -#include "code\__DEFINES\construction.dm" -#include "code\__DEFINES\contracts.dm" -#include "code\__DEFINES\crafting.dm" -#include "code\__DEFINES\error_handler.dm" -#include "code\__DEFINES\flags.dm" -#include "code\__DEFINES\game.dm" -#include "code\__DEFINES\gamemode.dm" -#include "code\__DEFINES\genetics.dm" -#include "code\__DEFINES\hud.dm" -#include "code\__DEFINES\hydroponics.dm" -#include "code\__DEFINES\inventory.dm" -#include "code\__DEFINES\is_helpers.dm" -#include "code\__DEFINES\language.dm" -#include "code\__DEFINES\layers.dm" -#include "code\__DEFINES\lighting.dm" -#include "code\__DEFINES\machines.dm" -#include "code\__DEFINES\math.dm" -#include "code\__DEFINES\MC.dm" -#include "code\__DEFINES\medal.dm" -#include "code\__DEFINES\misc.dm" -#include "code\__DEFINES\mobs.dm" -#include "code\__DEFINES\move_force.dm" -#include "code\__DEFINES\pda.dm" -#include "code\__DEFINES\pipes.dm" -#include "code\__DEFINES\preferences.dm" -#include "code\__DEFINES\qdel.dm" -#include "code\__DEFINES\radio.dm" -#include "code\__DEFINES\reagents.dm" -#include "code\__DEFINES\role_preferences.dm" -#include "code\__DEFINES\rolebans.dm" -#include "code\__DEFINES\shuttle.dm" -#include "code\__DEFINES\sight.dm" -#include "code\__DEFINES\sound.dm" -#include "code\__DEFINES\stat.dm" -#include "code\__DEFINES\station_goals.dm" -#include "code\__DEFINES\status_effects.dm" -#include "code\__DEFINES\subsystems.dm" -#include "code\__DEFINES\typeids.dm" -#include "code\__DEFINES\vv.dm" -#include "code\__DEFINES\zlevel.dm" -#include "code\__HELPERS\_logging.dm" -#include "code\__HELPERS\_string_lists.dm" -#include "code\__HELPERS\AnimationLibrary.dm" -#include "code\__HELPERS\cmp.dm" -#include "code\__HELPERS\constants.dm" -#include "code\__HELPERS\experimental.dm" -#include "code\__HELPERS\files.dm" -#include "code\__HELPERS\game.dm" -#include "code\__HELPERS\global_lists.dm" -#include "code\__HELPERS\icon_smoothing.dm" -#include "code\__HELPERS\icons.dm" -#include "code\__HELPERS\lists.dm" -#include "code\__HELPERS\maths.dm" -#include "code\__HELPERS\matrices.dm" -#include "code\__HELPERS\mobs.dm" -#include "code\__HELPERS\names.dm" -#include "code\__HELPERS\pronouns.dm" -#include "code\__HELPERS\qdel.dm" -#include "code\__HELPERS\sanitize_values.dm" -#include "code\__HELPERS\text.dm" -#include "code\__HELPERS\time.dm" -#include "code\__HELPERS\type2type.dm" -#include "code\__HELPERS\unique_ids.dm" -#include "code\__HELPERS\unsorted.dm" -#include "code\__HELPERS\sorts\__main.dm" -#include "code\__HELPERS\sorts\InsertSort.dm" -#include "code\__HELPERS\sorts\MergeSort.dm" -#include "code\__HELPERS\sorts\TimSort.dm" -#include "code\_DATASTRUCTURES\heap.dm" -#include "code\_DATASTRUCTURES\stacks.dm" -#include "code\_globalvars\configuration.dm" -#include "code\_globalvars\database.dm" -#include "code\_globalvars\game_modes.dm" -#include "code\_globalvars\genetics.dm" -#include "code\_globalvars\logging.dm" -#include "code\_globalvars\mapping.dm" -#include "code\_globalvars\misc.dm" -#include "code\_globalvars\unused.dm" -#include "code\_globalvars\lists\flavor_misc.dm" -#include "code\_globalvars\lists\fortunes.dm" -#include "code\_globalvars\lists\misc.dm" -#include "code\_globalvars\lists\mobs.dm" -#include "code\_globalvars\lists\names.dm" -#include "code\_globalvars\lists\objects.dm" -#include "code\_globalvars\lists\reagents.dm" -#include "code\_globalvars\lists\typecache.dm" -#include "code\_onclick\adjacent.dm" -#include "code\_onclick\ai.dm" -#include "code\_onclick\click.dm" -#include "code\_onclick\click_override.dm" -#include "code\_onclick\cyborg.dm" -#include "code\_onclick\drag_drop.dm" -#include "code\_onclick\item_attack.dm" -#include "code\_onclick\observer.dm" -#include "code\_onclick\other_mobs.dm" -#include "code\_onclick\overmind.dm" -#include "code\_onclick\rig.dm" -#include "code\_onclick\telekinesis.dm" -#include "code\_onclick\hud\_defines.dm" -#include "code\_onclick\hud\action_button.dm" -#include "code\_onclick\hud\ai.dm" -#include "code\_onclick\hud\alert.dm" -#include "code\_onclick\hud\alien.dm" -#include "code\_onclick\hud\alien_larva.dm" -#include "code\_onclick\hud\blob_overmind.dm" -#include "code\_onclick\hud\bot.dm" -#include "code\_onclick\hud\constructs.dm" -#include "code\_onclick\hud\devil.dm" -#include "code\_onclick\hud\fullscreen.dm" -#include "code\_onclick\hud\ghost.dm" -#include "code\_onclick\hud\guardian.dm" -#include "code\_onclick\hud\hud.dm" -#include "code\_onclick\hud\human.dm" -#include "code\_onclick\hud\monkey.dm" -#include "code\_onclick\hud\movable_screen_objects.dm" -#include "code\_onclick\hud\other_mobs.dm" -#include "code\_onclick\hud\picture_in_picture.dm" -#include "code\_onclick\hud\plane_master.dm" -#include "code\_onclick\hud\radial.dm" -#include "code\_onclick\hud\robot.dm" -#include "code\_onclick\hud\screen_objects.dm" -#include "code\_onclick\hud\swarmer.dm" -#include "code\ATMOSPHERICS\atmospherics.dm" -#include "code\ATMOSPHERICS\datum_icon_manager.dm" -#include "code\ATMOSPHERICS\datum_pipeline.dm" -#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm" -#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" -#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" -#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" -#include "code\ATMOSPHERICS\components\binary_devices\pump.dm" -#include "code\ATMOSPHERICS\components\binary_devices\valve.dm" -#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" -#include "code\ATMOSPHERICS\components\omni_devices\_omni_extras.dm" -#include "code\ATMOSPHERICS\components\omni_devices\filter.dm" -#include "code\ATMOSPHERICS\components\omni_devices\mixer.dm" -#include "code\ATMOSPHERICS\components\omni_devices\omni_base.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\mixer.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\trinary_base.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\tvalve.dm" -#include "code\ATMOSPHERICS\components\unary_devices\cold_sink.dm" -#include "code\ATMOSPHERICS\components\unary_devices\generator_input.dm" -#include "code\ATMOSPHERICS\components\unary_devices\heat_exchanger.dm" -#include "code\ATMOSPHERICS\components\unary_devices\heat_source.dm" -#include "code\ATMOSPHERICS\components\unary_devices\outlet_injector.dm" -#include "code\ATMOSPHERICS\components\unary_devices\oxygen_generator.dm" -#include "code\ATMOSPHERICS\components\unary_devices\passive_vent.dm" -#include "code\ATMOSPHERICS\components\unary_devices\portables_connector.dm" -#include "code\ATMOSPHERICS\components\unary_devices\tank.dm" -#include "code\ATMOSPHERICS\components\unary_devices\thermal_plate.dm" -#include "code\ATMOSPHERICS\components\unary_devices\unary_base.dm" -#include "code\ATMOSPHERICS\components\unary_devices\vent_pump.dm" -#include "code\ATMOSPHERICS\components\unary_devices\vent_scrubber.dm" -#include "code\ATMOSPHERICS\pipes\cap.dm" -#include "code\ATMOSPHERICS\pipes\manifold.dm" -#include "code\ATMOSPHERICS\pipes\manifold4w.dm" -#include "code\ATMOSPHERICS\pipes\pipe.dm" -#include "code\ATMOSPHERICS\pipes\simple\pipe_simple.dm" -#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_he.dm" -#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_hidden.dm" -#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_insulated.dm" -#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_visible.dm" -#include "code\controllers\configuration.dm" -#include "code\controllers\controller.dm" -#include "code\controllers\failsafe.dm" -#include "code\controllers\globals.dm" -#include "code\controllers\hooks-defs.dm" -#include "code\controllers\hooks.dm" -#include "code\controllers\master.dm" -#include "code\controllers\subsystem.dm" -#include "code\controllers\verbs.dm" -#include "code\controllers\subsystem\air.dm" -#include "code\controllers\subsystem\alarm.dm" -#include "code\controllers\subsystem\assets.dm" -#include "code\controllers\subsystem\atoms.dm" -#include "code\controllers\subsystem\events.dm" -#include "code\controllers\subsystem\fires.dm" -#include "code\controllers\subsystem\garbage.dm" -#include "code\controllers\subsystem\holiday.dm" -#include "code\controllers\subsystem\icon_smooth.dm" -#include "code\controllers\subsystem\idlenpcpool.dm" -#include "code\controllers\subsystem\ipintel.dm" -#include "code\controllers\subsystem\jobs.dm" -#include "code\controllers\subsystem\lighting.dm" -#include "code\controllers\subsystem\machinery.dm" -#include "code\controllers\subsystem\mapping.dm" -#include "code\controllers\subsystem\medals.dm" -#include "code\controllers\subsystem\mobs.dm" -#include "code\controllers\subsystem\nano_mob_hunter.dm" -#include "code\controllers\subsystem\nanoui.dm" -#include "code\controllers\subsystem\nightshift.dm" -#include "code\controllers\subsystem\npcpool.dm" -#include "code\controllers\subsystem\overlays.dm" -#include "code\controllers\subsystem\radio.dm" -#include "code\controllers\subsystem\shuttles.dm" -#include "code\controllers\subsystem\spacedrift.dm" -#include "code\controllers\subsystem\sun.dm" -#include "code\controllers\subsystem\throwing.dm" -#include "code\controllers\subsystem\ticker.dm" -#include "code\controllers\subsystem\timer.dm" -#include "code\controllers\subsystem\vote.dm" -#include "code\controllers\subsystem\weather.dm" -#include "code\controllers\subsystem\processing\fastprocess.dm" -#include "code\controllers\subsystem\processing\obj.dm" -#include "code\controllers\subsystem\processing\processing.dm" -#include "code\controllers\subsystem\tickets\mentor_tickets.dm" -#include "code\controllers\subsystem\tickets\tickets.dm" -#include "code\datums\action.dm" -#include "code\datums\ai_law_sets.dm" -#include "code\datums\ai_laws.dm" -#include "code\datums\beam.dm" -#include "code\datums\browser.dm" -#include "code\datums\callback.dm" -#include "code\datums\click_intercept.dm" -#include "code\datums\datacore.dm" -#include "code\datums\datum.dm" -#include "code\datums\datumvars.dm" -#include "code\datums\gas_mixture.dm" -#include "code\datums\holocall.dm" -#include "code\datums\hud.dm" -#include "code\datums\mind.dm" -#include "code\datums\mixed.dm" -#include "code\datums\mutable_appearance.dm" -#include "code\datums\periodic_news.dm" -#include "code\datums\pipe_datums.dm" -#include "code\datums\progressbar.dm" -#include "code\datums\radio.dm" -#include "code\datums\recipe.dm" -#include "code\datums\ruins.dm" -#include "code\datums\shuttles.dm" -#include "code\datums\soullink.dm" -#include "code\datums\spawners_menu.dm" -#include "code\datums\spell.dm" -#include "code\datums\statclick.dm" -#include "code\datums\supplypacks.dm" -#include "code\datums\uplink_item.dm" -#include "code\datums\vision_override.dm" -#include "code\datums\vr.dm" -#include "code\datums\cache\air_alarm.dm" -#include "code\datums\cache\apc.dm" -#include "code\datums\cache\cache.dm" -#include "code\datums\cache\crew.dm" -#include "code\datums\cache\powermonitor.dm" -#include "code\datums\components\_component.dm" -#include "code\datums\components\decal.dm" -#include "code\datums\components\ducttape.dm" -#include "code\datums\components\jestosterone.dm" -#include "code\datums\components\material_container.dm" -#include "code\datums\components\squeak.dm" -#include "code\datums\diseases\_disease.dm" -#include "code\datums\diseases\_MobProcs.dm" -#include "code\datums\diseases\anxiety.dm" -#include "code\datums\diseases\appendicitis.dm" -#include "code\datums\diseases\beesease.dm" -#include "code\datums\diseases\berserker.dm" -#include "code\datums\diseases\brainrot.dm" -#include "code\datums\diseases\cold.dm" -#include "code\datums\diseases\cold9.dm" -#include "code\datums\diseases\critical.dm" -#include "code\datums\diseases\fake_gbs.dm" -#include "code\datums\diseases\flu.dm" -#include "code\datums\diseases\fluspanish.dm" -#include "code\datums\diseases\food_poisoning.dm" -#include "code\datums\diseases\gbs.dm" -#include "code\datums\diseases\kingstons.dm" -#include "code\datums\diseases\kuru.dm" -#include "code\datums\diseases\lycancoughy.dm" -#include "code\datums\diseases\magnitis.dm" -#include "code\datums\diseases\pierrot_throat.dm" -#include "code\datums\diseases\retrovirus.dm" -#include "code\datums\diseases\rhumba_beat.dm" -#include "code\datums\diseases\transformation.dm" -#include "code\datums\diseases\tuberculosis.dm" -#include "code\datums\diseases\vampire.dm" -#include "code\datums\diseases\wizarditis.dm" -#include "code\datums\diseases\advance\advance.dm" -#include "code\datums\diseases\advance\presets.dm" -#include "code\datums\diseases\advance\symptoms\beard.dm" -#include "code\datums\diseases\advance\symptoms\choking.dm" -#include "code\datums\diseases\advance\symptoms\confusion.dm" -#include "code\datums\diseases\advance\symptoms\cough.dm" -#include "code\datums\diseases\advance\symptoms\damage_converter.dm" -#include "code\datums\diseases\advance\symptoms\deafness.dm" -#include "code\datums\diseases\advance\symptoms\dizzy.dm" -#include "code\datums\diseases\advance\symptoms\fever.dm" -#include "code\datums\diseases\advance\symptoms\fire.dm" -#include "code\datums\diseases\advance\symptoms\flesh_eating.dm" -#include "code\datums\diseases\advance\symptoms\hallucigen.dm" -#include "code\datums\diseases\advance\symptoms\headache.dm" -#include "code\datums\diseases\advance\symptoms\heal.dm" -#include "code\datums\diseases\advance\symptoms\itching.dm" -#include "code\datums\diseases\advance\symptoms\oxygen.dm" -#include "code\datums\diseases\advance\symptoms\sensory.dm" -#include "code\datums\diseases\advance\symptoms\shedding.dm" -#include "code\datums\diseases\advance\symptoms\shivering.dm" -#include "code\datums\diseases\advance\symptoms\skin.dm" -#include "code\datums\diseases\advance\symptoms\sneeze.dm" -#include "code\datums\diseases\advance\symptoms\symptoms.dm" -#include "code\datums\diseases\advance\symptoms\viral.dm" -#include "code\datums\diseases\advance\symptoms\vision.dm" -#include "code\datums\diseases\advance\symptoms\voice_change.dm" -#include "code\datums\diseases\advance\symptoms\vomit.dm" -#include "code\datums\diseases\advance\symptoms\weakness.dm" -#include "code\datums\diseases\advance\symptoms\weight.dm" -#include "code\datums\diseases\advance\symptoms\youth.dm" -#include "code\datums\helper_datums\construction_datum.dm" -#include "code\datums\helper_datums\events.dm" -#include "code\datums\helper_datums\global_iterator.dm" -#include "code\datums\helper_datums\hotkey_modes.dm" -#include "code\datums\helper_datums\icon_snapshot.dm" -#include "code\datums\helper_datums\input.dm" -#include "code\datums\helper_datums\map_template.dm" -#include "code\datums\helper_datums\teleport.dm" -#include "code\datums\helper_datums\topic_input.dm" -#include "code\datums\looping_sounds\looping_sound.dm" -#include "code\datums\looping_sounds\machinery_sounds.dm" -#include "code\datums\looping_sounds\thermal_drill.dm" -#include "code\datums\looping_sounds\weather.dm" -#include "code\datums\outfits\outfit.dm" -#include "code\datums\outfits\outfit_admin.dm" -#include "code\datums\ruins\lavaland.dm" -#include "code\datums\ruins\space.dm" -#include "code\datums\spells\area_teleport.dm" -#include "code\datums\spells\bloodcrawl.dm" -#include "code\datums\spells\chaplain.dm" -#include "code\datums\spells\charge.dm" -#include "code\datums\spells\cluwne.dm" -#include "code\datums\spells\conjure.dm" -#include "code\datums\spells\conjure_item.dm" -#include "code\datums\spells\construct_spells.dm" -#include "code\datums\spells\devil.dm" -#include "code\datums\spells\devil_boons.dm" -#include "code\datums\spells\dumbfire.dm" -#include "code\datums\spells\emplosion.dm" -#include "code\datums\spells\ethereal_jaunt.dm" -#include "code\datums\spells\explosion.dm" -#include "code\datums\spells\fake_gib.dm" -#include "code\datums\spells\genetic.dm" -#include "code\datums\spells\horsemask.dm" -#include "code\datums\spells\infinite_guns.dm" -#include "code\datums\spells\inflict_handler.dm" -#include "code\datums\spells\knock.dm" -#include "code\datums\spells\lichdom.dm" -#include "code\datums\spells\lightning.dm" -#include "code\datums\spells\magnet.dm" -#include "code\datums\spells\mime.dm" -#include "code\datums\spells\mind_transfer.dm" -#include "code\datums\spells\night_vision.dm" -#include "code\datums\spells\projectile.dm" -#include "code\datums\spells\rathens.dm" -#include "code\datums\spells\rod_form.dm" -#include "code\datums\spells\shapeshift.dm" -#include "code\datums\spells\summonitem.dm" -#include "code\datums\spells\touch_attacks.dm" -#include "code\datums\spells\trigger.dm" -#include "code\datums\spells\turf_teleport.dm" -#include "code\datums\spells\wizard.dm" -#include "code\datums\status_effects\buffs.dm" -#include "code\datums\status_effects\debuffs.dm" -#include "code\datums\status_effects\neutral.dm" -#include "code\datums\status_effects\status_effect.dm" -#include "code\datums\vr\level.dm" -#include "code\datums\weather\weather.dm" -#include "code\datums\weather\weather_types\ash_storm.dm" -#include "code\datums\weather\weather_types\floor_is_lava.dm" -#include "code\datums\weather\weather_types\radiation_storm.dm" -#include "code\datums\weather\weather_types\snow_storm.dm" -#include "code\datums\wires\airlock.dm" -#include "code\datums\wires\alarm.dm" -#include "code\datums\wires\apc.dm" -#include "code\datums\wires\autolathe.dm" -#include "code\datums\wires\camera.dm" -#include "code\datums\wires\explosive.dm" -#include "code\datums\wires\mulebot.dm" -#include "code\datums\wires\nuclearbomb.dm" -#include "code\datums\wires\particle_accelerator.dm" -#include "code\datums\wires\radio.dm" -#include "code\datums\wires\robot.dm" -#include "code\datums\wires\smartfridge.dm" -#include "code\datums\wires\suitstorage.dm" -#include "code\datums\wires\syndicatebomb.dm" -#include "code\datums\wires\tesla_coil.dm" -#include "code\datums\wires\vending.dm" -#include "code\datums\wires\wires.dm" -#include "code\defines\vox_sounds.dm" -#include "code\defines\procs\admin.dm" -#include "code\defines\procs\announce.dm" -#include "code\defines\procs\AStar.dm" -#include "code\defines\procs\dbcore.dm" -#include "code\defines\procs\radio.dm" -#include "code\defines\procs\records.dm" -#include "code\defines\procs\statistics.dm" -#include "code\game\alternate_appearance.dm" -#include "code\game\asteroid.dm" -#include "code\game\atoms.dm" -#include "code\game\atoms_movable.dm" -#include "code\game\data_huds.dm" -#include "code\game\shuttle_engines.dm" -#include "code\game\sound.dm" -#include "code\game\world.dm" -#include "code\game\area\ai_monitored.dm" -#include "code\game\area\areas.dm" -#include "code\game\area\Dynamic areas.dm" -#include "code\game\area\Space Station 13 areas.dm" -#include "code\game\area\areas\depot-areas.dm" -#include "code\game\area\areas\mining.dm" -#include "code\game\area\areas\ruins\lavaland.dm" -#include "code\game\dna\dna2.dm" -#include "code\game\dna\dna2_domutcheck.dm" -#include "code\game\dna\dna2_helpers.dm" -#include "code\game\dna\dna_modifier.dm" -#include "code\game\dna\genes\disabilities.dm" -#include "code\game\dna\genes\gene.dm" -#include "code\game\dna\genes\goon_disabilities.dm" -#include "code\game\dna\genes\goon_powers.dm" -#include "code\game\dna\genes\monkey.dm" -#include "code\game\dna\genes\powers.dm" -#include "code\game\dna\genes\vg_disabilities.dm" -#include "code\game\dna\genes\vg_powers.dm" -#include "code\game\gamemodes\factions.dm" -#include "code\game\gamemodes\game_mode.dm" -#include "code\game\gamemodes\intercept_report.dm" -#include "code\game\gamemodes\objective.dm" -#include "code\game\gamemodes\scoreboard.dm" -#include "code\game\gamemodes\setupgame.dm" -#include "code\game\gamemodes\steal_items.dm" -#include "code\game\gamemodes\autotraitor\autotraitor.dm" -#include "code\game\gamemodes\blob\blob.dm" -#include "code\game\gamemodes\blob\blob_finish.dm" -#include "code\game\gamemodes\blob\blob_report.dm" -#include "code\game\gamemodes\blob\overmind.dm" -#include "code\game\gamemodes\blob\powers.dm" -#include "code\game\gamemodes\blob\theblob.dm" -#include "code\game\gamemodes\blob\blobs\blob_mobs.dm" -#include "code\game\gamemodes\blob\blobs\core.dm" -#include "code\game\gamemodes\blob\blobs\factory.dm" -#include "code\game\gamemodes\blob\blobs\node.dm" -#include "code\game\gamemodes\blob\blobs\resource.dm" -#include "code\game\gamemodes\blob\blobs\shield.dm" -#include "code\game\gamemodes\blob\blobs\storage.dm" -#include "code\game\gamemodes\changeling\changeling.dm" -#include "code\game\gamemodes\changeling\changeling_power.dm" -#include "code\game\gamemodes\changeling\evolution_menu.dm" -#include "code\game\gamemodes\changeling\traitor_chan.dm" -#include "code\game\gamemodes\changeling\powers\absorb.dm" -#include "code\game\gamemodes\changeling\powers\augmented_eyesight.dm" -#include "code\game\gamemodes\changeling\powers\biodegrade.dm" -#include "code\game\gamemodes\changeling\powers\chameleon_skin.dm" -#include "code\game\gamemodes\changeling\powers\digitalcamo.dm" -#include "code\game\gamemodes\changeling\powers\epinephrine.dm" -#include "code\game\gamemodes\changeling\powers\fakedeath.dm" -#include "code\game\gamemodes\changeling\powers\fleshmend.dm" -#include "code\game\gamemodes\changeling\powers\headcrab.dm" -#include "code\game\gamemodes\changeling\powers\hivemind.dm" -#include "code\game\gamemodes\changeling\powers\humanform.dm" -#include "code\game\gamemodes\changeling\powers\lesserform.dm" -#include "code\game\gamemodes\changeling\powers\linglink.dm" -#include "code\game\gamemodes\changeling\powers\mimic_voice.dm" -#include "code\game\gamemodes\changeling\powers\mutations.dm" -#include "code\game\gamemodes\changeling\powers\panacea.dm" -#include "code\game\gamemodes\changeling\powers\revive.dm" -#include "code\game\gamemodes\changeling\powers\shriek.dm" -#include "code\game\gamemodes\changeling\powers\spiders.dm" -#include "code\game\gamemodes\changeling\powers\strained_muscles.dm" -#include "code\game\gamemodes\changeling\powers\swap_form.dm" -#include "code\game\gamemodes\changeling\powers\tiny_prick.dm" -#include "code\game\gamemodes\changeling\powers\transform.dm" -#include "code\game\gamemodes\cult\cult.dm" -#include "code\game\gamemodes\cult\cult_comms.dm" -#include "code\game\gamemodes\cult\cult_datums.dm" -#include "code\game\gamemodes\cult\cult_items.dm" -#include "code\game\gamemodes\cult\cult_objectives.dm" -#include "code\game\gamemodes\cult\cult_structures.dm" -#include "code\game\gamemodes\cult\ritual.dm" -#include "code\game\gamemodes\cult\runes.dm" -#include "code\game\gamemodes\cult\talisman.dm" -#include "code\game\gamemodes\devil\devil.dm" -#include "code\game\gamemodes\devil\devil_game_mode.dm" -#include "code\game\gamemodes\devil\devilinfo.dm" -#include "code\game\gamemodes\devil\game_mode.dm" -#include "code\game\gamemodes\devil\objectives.dm" -#include "code\game\gamemodes\devil\contracts\friend.dm" -#include "code\game\gamemodes\devil\devil agent\devil_agent.dm" -#include "code\game\gamemodes\devil\imp\imp.dm" -#include "code\game\gamemodes\devil\true_devil\_true_devil.dm" -#include "code\game\gamemodes\devil\true_devil\inventory.dm" -#include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\heist\heist.dm" -#include "code\game\gamemodes\malfunction\Malf_Modules.dm" -#include "code\game\gamemodes\meteor\meteor.dm" -#include "code\game\gamemodes\meteor\meteors.dm" -#include "code\game\gamemodes\miniantags\abduction\abductee_objectives.dm" -#include "code\game\gamemodes\miniantags\abduction\abduction.dm" -#include "code\game\gamemodes\miniantags\abduction\abduction_gear.dm" -#include "code\game\gamemodes\miniantags\abduction\abduction_outfits.dm" -#include "code\game\gamemodes\miniantags\abduction\abduction_surgery.dm" -#include "code\game\gamemodes\miniantags\abduction\gland.dm" -#include "code\game\gamemodes\miniantags\abduction\machinery\camera.dm" -#include "code\game\gamemodes\miniantags\abduction\machinery\console.dm" -#include "code\game\gamemodes\miniantags\abduction\machinery\dispenser.dm" -#include "code\game\gamemodes\miniantags\abduction\machinery\experiment.dm" -#include "code\game\gamemodes\miniantags\abduction\machinery\pad.dm" -#include "code\game\gamemodes\miniantags\borer\borer.dm" -#include "code\game\gamemodes\miniantags\borer\borer_chemicals.dm" -#include "code\game\gamemodes\miniantags\borer\borer_event.dm" -#include "code\game\gamemodes\miniantags\borer\borer_html.dm" -#include "code\game\gamemodes\miniantags\bot_swarm\swarmer.dm" -#include "code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" -#include "code\game\gamemodes\miniantags\guardian\guardian.dm" -#include "code\game\gamemodes\miniantags\guardian\types\assassin.dm" -#include "code\game\gamemodes\miniantags\guardian\types\bomb.dm" -#include "code\game\gamemodes\miniantags\guardian\types\charger.dm" -#include "code\game\gamemodes\miniantags\guardian\types\fire.dm" -#include "code\game\gamemodes\miniantags\guardian\types\healer.dm" -#include "code\game\gamemodes\miniantags\guardian\types\lightning.dm" -#include "code\game\gamemodes\miniantags\guardian\types\protector.dm" -#include "code\game\gamemodes\miniantags\guardian\types\ranged.dm" -#include "code\game\gamemodes\miniantags\guardian\types\standard.dm" -#include "code\game\gamemodes\miniantags\morph\morph.dm" -#include "code\game\gamemodes\miniantags\morph\morph_event.dm" -#include "code\game\gamemodes\miniantags\revenant\revenant.dm" -#include "code\game\gamemodes\miniantags\revenant\revenant_abilities.dm" -#include "code\game\gamemodes\miniantags\revenant\revenant_spawn_event.dm" -#include "code\game\gamemodes\miniantags\sintouched\objectives.dm" -#include "code\game\gamemodes\miniantags\slaughter\bloodcrawl.dm" -#include "code\game\gamemodes\miniantags\slaughter\slaughter.dm" -#include "code\game\gamemodes\nuclear\nuclear.dm" -#include "code\game\gamemodes\nuclear\nuclear_challenge.dm" -#include "code\game\gamemodes\nuclear\nuclearbomb.dm" -#include "code\game\gamemodes\nuclear\pinpointer.dm" -#include "code\game\gamemodes\revolution\revolution.dm" -#include "code\game\gamemodes\shadowling\ascendant_shadowling.dm" -#include "code\game\gamemodes\shadowling\shadowling.dm" -#include "code\game\gamemodes\shadowling\shadowling_abilities.dm" -#include "code\game\gamemodes\shadowling\shadowling_items.dm" -#include "code\game\gamemodes\shadowling\special_shadowling_abilities.dm" -#include "code\game\gamemodes\traitor\traitor.dm" -#include "code\game\gamemodes\vampire\traitor_vamp.dm" -#include "code\game\gamemodes\vampire\vampire.dm" -#include "code\game\gamemodes\vampire\vampire_powers.dm" -#include "code\game\gamemodes\wizard\artefact.dm" -#include "code\game\gamemodes\wizard\godhand.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_exp.dm" -#include "code\game\jobs\job_objective.dm" -#include "code\game\jobs\job_scaling.dm" -#include "code\game\jobs\jobs.dm" -#include "code\game\jobs\whitelist.dm" -#include "code\game\jobs\job\central.dm" -#include "code\game\jobs\job\civilian.dm" -#include "code\game\jobs\job\engineering.dm" -#include "code\game\jobs\job\job.dm" -#include "code\game\jobs\job\medical.dm" -#include "code\game\jobs\job\science.dm" -#include "code\game\jobs\job\security.dm" -#include "code\game\jobs\job\silicon.dm" -#include "code\game\jobs\job\supervisor.dm" -#include "code\game\jobs\job\support.dm" -#include "code\game\jobs\job\support_chaplain.dm" -#include "code\game\jobs\job\syndicate.dm" -#include "code\game\jobs\job_objectives\science.dm" -#include "code\game\machinery\adv_med.dm" -#include "code\game\machinery\ai_slipper.dm" -#include "code\game\machinery\alarm.dm" -#include "code\game\machinery\atmo_control.dm" -#include "code\game\machinery\autolathe.dm" -#include "code\game\machinery\Beacon.dm" -#include "code\game\machinery\buttons.dm" -#include "code\game\machinery\cell_charger.dm" -#include "code\game\machinery\chiller.dm" -#include "code\game\machinery\cloning.dm" -#include "code\game\machinery\constructable_frame.dm" -#include "code\game\machinery\cryo.dm" -#include "code\game\machinery\cryopod.dm" -#include "code\game\machinery\dance_machine.dm" -#include "code\game\machinery\defib_mount.dm" -#include "code\game\machinery\deployable.dm" -#include "code\game\machinery\door_control.dm" -#include "code\game\machinery\doppler_array.dm" -#include "code\game\machinery\dye_generator.dm" -#include "code\game\machinery\firealarm.dm" -#include "code\game\machinery\flasher.dm" -#include "code\game\machinery\floodlight.dm" -#include "code\game\machinery\Freezer.dm" -#include "code\game\machinery\gameboard.dm" -#include "code\game\machinery\guestpass.dm" -#include "code\game\machinery\hologram.dm" -#include "code\game\machinery\holosign.dm" -#include "code\game\machinery\igniter.dm" -#include "code\game\machinery\iv_drip.dm" -#include "code\game\machinery\lightswitch.dm" -#include "code\game\machinery\machinery.dm" -#include "code\game\machinery\magnet.dm" -#include "code\game\machinery\mass_driver.dm" -#include "code\game\machinery\navbeacon.dm" -#include "code\game\machinery\newscaster.dm" -#include "code\game\machinery\OpTable.dm" -#include "code\game\machinery\overview.dm" -#include "code\game\machinery\PDApainter.dm" -#include "code\game\machinery\poolcontroller.dm" -#include "code\game\machinery\portable_tag_turret.dm" -#include "code\game\machinery\portable_turret.dm" -#include "code\game\machinery\quantum_pad.dm" -#include "code\game\machinery\recharger.dm" -#include "code\game\machinery\rechargestation.dm" -#include "code\game\machinery\recycler.dm" -#include "code\game\machinery\requests_console.dm" -#include "code\game\machinery\shieldgen.dm" -#include "code\game\machinery\Sleeper.dm" -#include "code\game\machinery\slotmachine.dm" -#include "code\game\machinery\snow_machine.dm" -#include "code\game\machinery\spaceheater.dm" -#include "code\game\machinery\status_display.dm" -#include "code\game\machinery\suit_storage_unit.dm" -#include "code\game\machinery\supply_display.dm" -#include "code\game\machinery\syndicatebeacon.dm" -#include "code\game\machinery\syndicatebomb.dm" -#include "code\game\machinery\teleporter.dm" -#include "code\game\machinery\transformer.dm" -#include "code\game\machinery\turntable.dm" -#include "code\game\machinery\turret_control.dm" -#include "code\game\machinery\vending.dm" -#include "code\game\machinery\washing_machine.dm" -#include "code\game\machinery\wishgranter.dm" -#include "code\game\machinery\atmoalter\area_atmos_computer.dm" -#include "code\game\machinery\atmoalter\canister.dm" -#include "code\game\machinery\atmoalter\meter.dm" -#include "code\game\machinery\atmoalter\portable_atmospherics.dm" -#include "code\game\machinery\atmoalter\pump.dm" -#include "code\game\machinery\atmoalter\scrubber.dm" -#include "code\game\machinery\atmoalter\zvent.dm" -#include "code\game\machinery\camera\camera.dm" -#include "code\game\machinery\camera\camera_assembly.dm" -#include "code\game\machinery\camera\motion.dm" -#include "code\game\machinery\camera\presets.dm" -#include "code\game\machinery\camera\tracking.dm" -#include "code\game\machinery\computer\ai_core.dm" -#include "code\game\machinery\computer\aifixer.dm" -#include "code\game\machinery\computer\arcade.dm" -#include "code\game\machinery\computer\atmos_alert.dm" -#include "code\game\machinery\computer\atmos_control.dm" -#include "code\game\machinery\computer\brigcells.dm" -#include "code\game\machinery\computer\buildandrepair.dm" -#include "code\game\machinery\computer\camera.dm" -#include "code\game\machinery\computer\camera_advanced.dm" -#include "code\game\machinery\computer\card.dm" -#include "code\game\machinery\computer\cloning.dm" -#include "code\game\machinery\computer\communications.dm" -#include "code\game\machinery\computer\computer.dm" -#include "code\game\machinery\computer\crew.dm" -#include "code\game\machinery\computer\depot.dm" -#include "code\game\machinery\computer\HolodeckControl.dm" -#include "code\game\machinery\computer\honkputer.dm" -#include "code\game\machinery\computer\law.dm" -#include "code\game\machinery\computer\medical.dm" -#include "code\game\machinery\computer\message.dm" -#include "code\game\machinery\computer\Operating.dm" -#include "code\game\machinery\computer\pod.dm" -#include "code\game\machinery\computer\pod_tracking_console.dm" -#include "code\game\machinery\computer\power.dm" -#include "code\game\machinery\computer\prisoner.dm" -#include "code\game\machinery\computer\robot.dm" -#include "code\game\machinery\computer\salvage_ship.dm" -#include "code\game\machinery\computer\security.dm" -#include "code\game\machinery\computer\skills.dm" -#include "code\game\machinery\computer\specops_shuttle.dm" -#include "code\game\machinery\computer\station_alert.dm" -#include "code\game\machinery\computer\store.dm" -#include "code\game\machinery\computer\syndicate_specops_shuttle.dm" -#include "code\game\machinery\computer\vr_control.dm" -#include "code\game\machinery\doors\airlock.dm" -#include "code\game\machinery\doors\airlock_control.dm" -#include "code\game\machinery\doors\airlock_electronics.dm" -#include "code\game\machinery\doors\airlock_types.dm" -#include "code\game\machinery\doors\alarmlock.dm" -#include "code\game\machinery\doors\brigdoors.dm" -#include "code\game\machinery\doors\checkForMultipleDoors.dm" -#include "code\game\machinery\doors\door.dm" -#include "code\game\machinery\doors\firedoor.dm" -#include "code\game\machinery\doors\poddoor.dm" -#include "code\game\machinery\doors\shutters.dm" -#include "code\game\machinery\doors\spacepod.dm" -#include "code\game\machinery\doors\unpowered.dm" -#include "code\game\machinery\doors\windowdoor.dm" -#include "code\game\machinery\embedded_controller\airlock_controllers.dm" -#include "code\game\machinery\embedded_controller\airlock_program.dm" -#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" -#include "code\game\machinery\embedded_controller\embedded_program_base.dm" -#include "code\game\machinery\pipe\construction.dm" -#include "code\game\machinery\pipe\pipe_dispenser.dm" -#include "code\game\machinery\telecomms\broadcaster.dm" -#include "code\game\machinery\telecomms\logbrowser.dm" -#include "code\game\machinery\telecomms\machine_interactions.dm" -#include "code\game\machinery\telecomms\ntsl2.dm" -#include "code\game\machinery\telecomms\presets.dm" -#include "code\game\machinery\telecomms\telecomunications.dm" -#include "code\game\machinery\telecomms\telemonitor.dm" -#include "code\game\machinery\telecomms\traffic_control.dm" -#include "code\game\magic\Uristrunes.dm" -#include "code\game\mecha\mech_bay.dm" -#include "code\game\mecha\mech_fabricator.dm" -#include "code\game\mecha\mecha.dm" -#include "code\game\mecha\mecha_actions.dm" -#include "code\game\mecha\mecha_construction_paths.dm" -#include "code\game\mecha\mecha_control_console.dm" -#include "code\game\mecha\mecha_modkit.dm" -#include "code\game\mecha\mecha_parts.dm" -#include "code\game\mecha\mecha_topic.dm" -#include "code\game\mecha\mecha_wreckage.dm" -#include "code\game\mecha\paintkits.dm" -#include "code\game\mecha\combat\combat.dm" -#include "code\game\mecha\combat\durand.dm" -#include "code\game\mecha\combat\gygax.dm" -#include "code\game\mecha\combat\honker.dm" -#include "code\game\mecha\combat\marauder.dm" -#include "code\game\mecha\combat\phazon.dm" -#include "code\game\mecha\combat\reticence.dm" -#include "code\game\mecha\equipment\mecha_equipment.dm" -#include "code\game\mecha\equipment\tools\medical_tools.dm" -#include "code\game\mecha\equipment\tools\mining_tools.dm" -#include "code\game\mecha\equipment\tools\other_tools.dm" -#include "code\game\mecha\equipment\tools\work_tools.dm" -#include "code\game\mecha\equipment\weapons\weapons.dm" -#include "code\game\mecha\medical\medical.dm" -#include "code\game\mecha\medical\odysseus.dm" -#include "code\game\mecha\working\ripley.dm" -#include "code\game\mecha\working\working.dm" -#include "code\game\objects\buckling.dm" -#include "code\game\objects\empulse.dm" -#include "code\game\objects\explosion.dm" -#include "code\game\objects\items.dm" -#include "code\game\objects\obj_defense.dm" -#include "code\game\objects\objs.dm" -#include "code\game\objects\structures.dm" -#include "code\game\objects\effects\alien_acid.dm" -#include "code\game\objects\effects\anomalies.dm" -#include "code\game\objects\effects\bump_teleporter.dm" -#include "code\game\objects\effects\effects.dm" -#include "code\game\objects\effects\forcefields.dm" -#include "code\game\objects\effects\gibs.dm" -#include "code\game\objects\effects\glowshroom.dm" -#include "code\game\objects\effects\landmarks.dm" -#include "code\game\objects\effects\manifest.dm" -#include "code\game\objects\effects\mapping_helpers.dm" -#include "code\game\objects\effects\mines.dm" -#include "code\game\objects\effects\misc.dm" -#include "code\game\objects\effects\overlays.dm" -#include "code\game\objects\effects\portals.dm" -#include "code\game\objects\effects\snowcloud.dm" -#include "code\game\objects\effects\spiders.dm" -#include "code\game\objects\effects\step_triggers.dm" -#include "code\game\objects\effects\decals\cleanable.dm" -#include "code\game\objects\effects\decals\contraband.dm" -#include "code\game\objects\effects\decals\crayon.dm" -#include "code\game\objects\effects\decals\decal.dm" -#include "code\game\objects\effects\decals\misc.dm" -#include "code\game\objects\effects\decals\remains.dm" -#include "code\game\objects\effects\decals\warning_stripes.dm" -#include "code\game\objects\effects\decals\Cleanable\aliens.dm" -#include "code\game\objects\effects\decals\Cleanable\fuel.dm" -#include "code\game\objects\effects\decals\Cleanable\humans.dm" -#include "code\game\objects\effects\decals\Cleanable\misc.dm" -#include "code\game\objects\effects\decals\Cleanable\robots.dm" -#include "code\game\objects\effects\decals\Cleanable\tracks.dm" -#include "code\game\objects\effects\decals\turfdecals\dirt.dm" -#include "code\game\objects\effects\decals\turfdecals\markings.dm" -#include "code\game\objects\effects\decals\turfdecals\tilecoloring.dm" -#include "code\game\objects\effects\decals\turfdecals\weather.dm" -#include "code\game\objects\effects\effect_system\effect_system.dm" -#include "code\game\objects\effects\effect_system\effects_chem_smoke.dm" -#include "code\game\objects\effects\effect_system\effects_explosion.dm" -#include "code\game\objects\effects\effect_system\effects_foam.dm" -#include "code\game\objects\effects\effect_system\effects_other.dm" -#include "code\game\objects\effects\effect_system\effects_smoke.dm" -#include "code\game\objects\effects\effect_system\effects_sparks.dm" -#include "code\game\objects\effects\effect_system\effects_water.dm" -#include "code\game\objects\effects\spawners\bombspawner.dm" -#include "code\game\objects\effects\spawners\gibspawner.dm" -#include "code\game\objects\effects\spawners\lootdrop.dm" -#include "code\game\objects\effects\spawners\random_barrier.dm" -#include "code\game\objects\effects\spawners\random_spawners.dm" -#include "code\game\objects\effects\spawners\vaultspawner.dm" -#include "code\game\objects\effects\spawners\windowspawner.dm" -#include "code\game\objects\effects\temporary_visuals\clockcult.dm" -#include "code\game\objects\effects\temporary_visuals\cult.dm" -#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" -#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" -#include "code\game\objects\items\ashtray.dm" -#include "code\game\objects\items\blueprints.dm" -#include "code\game\objects\items\bodybag.dm" -#include "code\game\objects\items\candle.dm" -#include "code\game\objects\items\cardboard_cutouts.dm" -#include "code\game\objects\items\changestone.dm" -#include "code\game\objects\items\contraband.dm" -#include "code\game\objects\items\control_wand.dm" -#include "code\game\objects\items\crayons.dm" -#include "code\game\objects\items\dehy_carp.dm" -#include "code\game\objects\items\documents.dm" -#include "code\game\objects\items\flag.dm" -#include "code\game\objects\items\latexballoon.dm" -#include "code\game\objects\items\misc.dm" -#include "code\game\objects\items\mixing_bowl.dm" -#include "code\game\objects\items\random_items.dm" -#include "code\game\objects\items\shooting_range.dm" -#include "code\game\objects\items\toys.dm" -#include "code\game\objects\items\trash.dm" -#include "code\game\objects\items\devices\aicard.dm" -#include "code\game\objects\items\devices\autopsy.dm" -#include "code\game\objects\items\devices\camera_bug.dm" -#include "code\game\objects\items\devices\chameleonproj.dm" -#include "code\game\objects\items\devices\flash.dm" -#include "code\game\objects\items\devices\flashlight.dm" -#include "code\game\objects\items\devices\floor_painter.dm" -#include "code\game\objects\items\devices\handheld_defib.dm" -#include "code\game\objects\items\devices\instruments.dm" -#include "code\game\objects\items\devices\laserpointer.dm" -#include "code\game\objects\items\devices\lightreplacer.dm" -#include "code\game\objects\items\devices\machineprototype.dm" -#include "code\game\objects\items\devices\megaphone.dm" -#include "code\game\objects\items\devices\multitool.dm" -#include "code\game\objects\items\devices\paicard.dm" -#include "code\game\objects\items\devices\pipe_painter.dm" -#include "code\game\objects\items\devices\pizza_bomb.dm" -#include "code\game\objects\items\devices\powersink.dm" -#include "code\game\objects\items\devices\scanners.dm" -#include "code\game\objects\items\devices\sensor_device.dm" -#include "code\game\objects\items\devices\taperecorder.dm" -#include "code\game\objects\items\devices\thermal_drill.dm" -#include "code\game\objects\items\devices\traitordevices.dm" -#include "code\game\objects\items\devices\transfer_valve.dm" -#include "code\game\objects\items\devices\uplinks.dm" -#include "code\game\objects\items\devices\voice.dm" -#include "code\game\objects\items\devices\whistle.dm" -#include "code\game\objects\items\devices\radio\beacon.dm" -#include "code\game\objects\items\devices\radio\electropack.dm" -#include "code\game\objects\items\devices\radio\encryptionkey.dm" -#include "code\game\objects\items\devices\radio\headset.dm" -#include "code\game\objects\items\devices\radio\intercom.dm" -#include "code\game\objects\items\devices\radio\radio.dm" -#include "code\game\objects\items\mountable_frames\air_alarm.dm" -#include "code\game\objects\items\mountable_frames\apc_frame.dm" -#include "code\game\objects\items\mountable_frames\buttons_switches.dm" -#include "code\game\objects\items\mountable_frames\extinguisher_frame.dm" -#include "code\game\objects\items\mountable_frames\fire_alarm.dm" -#include "code\game\objects\items\mountable_frames\frames.dm" -#include "code\game\objects\items\mountable_frames\intercom.dm" -#include "code\game\objects\items\mountable_frames\lights.dm" -#include "code\game\objects\items\mountable_frames\mountables.dm" -#include "code\game\objects\items\mountable_frames\newscaster_frame.dm" -#include "code\game\objects\items\robot\ai_upgrades.dm" -#include "code\game\objects\items\robot\robot_items.dm" -#include "code\game\objects\items\robot\robot_parts.dm" -#include "code\game\objects\items\robot\robot_upgrades.dm" -#include "code\game\objects\items\stacks\medical.dm" -#include "code\game\objects\items\stacks\nanopaste.dm" -#include "code\game\objects\items\stacks\rods.dm" -#include "code\game\objects\items\stacks\stack.dm" -#include "code\game\objects\items\stacks\stack_recipe.dm" -#include "code\game\objects\items\stacks\telecrystal.dm" -#include "code\game\objects\items\stacks\sheets\glass.dm" -#include "code\game\objects\items\stacks\sheets\leather.dm" -#include "code\game\objects\items\stacks\sheets\light.dm" -#include "code\game\objects\items\stacks\sheets\mineral.dm" -#include "code\game\objects\items\stacks\sheets\sheet_types.dm" -#include "code\game\objects\items\stacks\sheets\sheets.dm" -#include "code\game\objects\items\stacks\tiles\tile_mineral.dm" -#include "code\game\objects\items\stacks\tiles\tile_types.dm" -#include "code\game\objects\items\weapons\AI_modules.dm" -#include "code\game\objects\items\weapons\alien_specific.dm" -#include "code\game\objects\items\weapons\bee_briefcase.dm" -#include "code\game\objects\items\weapons\cards_ids.dm" -#include "code\game\objects\items\weapons\cash.dm" -#include "code\game\objects\items\weapons\caution.dm" -#include "code\game\objects\items\weapons\chrono_eraser.dm" -#include "code\game\objects\items\weapons\cigs.dm" -#include "code\game\objects\items\weapons\clown_items.dm" -#include "code\game\objects\items\weapons\cosmetics.dm" -#include "code\game\objects\items\weapons\courtroom.dm" -#include "code\game\objects\items\weapons\defib.dm" -#include "code\game\objects\items\weapons\dice.dm" -#include "code\game\objects\items\weapons\disks.dm" -#include "code\game\objects\items\weapons\dna_injector.dm" -#include "code\game\objects\items\weapons\dnascrambler.dm" -#include "code\game\objects\items\weapons\explosives.dm" -#include "code\game\objects\items\weapons\extinguisher.dm" -#include "code\game\objects\items\weapons\fireworks.dm" -#include "code\game\objects\items\weapons\flamethrower.dm" -#include "code\game\objects\items\weapons\garrote.dm" -#include "code\game\objects\items\weapons\gift_wrappaper.dm" -#include "code\game\objects\items\weapons\handcuffs.dm" -#include "code\game\objects\items\weapons\highlander_swords.dm" -#include "code\game\objects\items\weapons\holosign.dm" -#include "code\game\objects\items\weapons\holy_weapons.dm" -#include "code\game\objects\items\weapons\kitchen.dm" -#include "code\game\objects\items\weapons\legcuffs.dm" -#include "code\game\objects\items\weapons\lighters.dm" -#include "code\game\objects\items\weapons\manuals.dm" -#include "code\game\objects\items\weapons\misc.dm" -#include "code\game\objects\items\weapons\mop.dm" -#include "code\game\objects\items\weapons\paint.dm" -#include "code\game\objects\items\weapons\paiwire.dm" -#include "code\game\objects\items\weapons\pneumaticCannon.dm" -#include "code\game\objects\items\weapons\powerfist.dm" -#include "code\game\objects\items\weapons\RCD.dm" -#include "code\game\objects\items\weapons\RCL.dm" -#include "code\game\objects\items\weapons\rpd.dm" -#include "code\game\objects\items\weapons\RSF.dm" -#include "code\game\objects\items\weapons\scissors.dm" -#include "code\game\objects\items\weapons\scrolls.dm" -#include "code\game\objects\items\weapons\shards.dm" -#include "code\game\objects\items\weapons\shields.dm" -#include "code\game\objects\items\weapons\signs.dm" -#include "code\game\objects\items\weapons\soap.dm" -#include "code\game\objects\items\weapons\staff.dm" -#include "code\game\objects\items\weapons\stock_parts.dm" -#include "code\game\objects\items\weapons\stunbaton.dm" -#include "code\game\objects\items\weapons\swords_axes_etc.dm" -#include "code\game\objects\items\weapons\tape.dm" -#include "code\game\objects\items\weapons\teleportation.dm" -#include "code\game\objects\items\weapons\teleprod.dm" -#include "code\game\objects\items\weapons\tools.dm" -#include "code\game\objects\items\weapons\twohanded.dm" -#include "code\game\objects\items\weapons\vending_items.dm" -#include "code\game\objects\items\weapons\weaponry.dm" -#include "code\game\objects\items\weapons\whetstone.dm" -#include "code\game\objects\items\weapons\grenades\atmosgrenade.dm" -#include "code\game\objects\items\weapons\grenades\bananade.dm" -#include "code\game\objects\items\weapons\grenades\chem_grenade.dm" -#include "code\game\objects\items\weapons\grenades\clowngrenade.dm" -#include "code\game\objects\items\weapons\grenades\clusterbuster.dm" -#include "code\game\objects\items\weapons\grenades\confetti.dm" -#include "code\game\objects\items\weapons\grenades\custom_grenades.dm" -#include "code\game\objects\items\weapons\grenades\emgrenade.dm" -#include "code\game\objects\items\weapons\grenades\flashbang.dm" -#include "code\game\objects\items\weapons\grenades\frag.dm" -#include "code\game\objects\items\weapons\grenades\ghettobomb.dm" -#include "code\game\objects\items\weapons\grenades\grenade.dm" -#include "code\game\objects\items\weapons\grenades\smokebomb.dm" -#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" -#include "code\game\objects\items\weapons\grenades\syndieminibomb.dm" -#include "code\game\objects\items\weapons\implants\health.dm" -#include "code\game\objects\items\weapons\implants\implant.dm" -#include "code\game\objects\items\weapons\implants\implant_abductor.dm" -#include "code\game\objects\items\weapons\implants\implant_chem.dm" -#include "code\game\objects\items\weapons\implants\implant_death_alarm.dm" -#include "code\game\objects\items\weapons\implants\implant_explosive.dm" -#include "code\game\objects\items\weapons\implants\implant_freedom.dm" -#include "code\game\objects\items\weapons\implants\implant_krav_maga.dm" -#include "code\game\objects\items\weapons\implants\implant_mindshield.dm" -#include "code\game\objects\items\weapons\implants\implant_misc.dm" -#include "code\game\objects\items\weapons\implants\implant_storage.dm" -#include "code\game\objects\items\weapons\implants\implant_track.dm" -#include "code\game\objects\items\weapons\implants\implant_traitor.dm" -#include "code\game\objects\items\weapons\implants\implantcase.dm" -#include "code\game\objects\items\weapons\implants\implantchair.dm" -#include "code\game\objects\items\weapons\implants\implanter.dm" -#include "code\game\objects\items\weapons\implants\implantpad.dm" -#include "code\game\objects\items\weapons\implants\implantuplink.dm" -#include "code\game\objects\items\weapons\melee\energy.dm" -#include "code\game\objects\items\weapons\melee\misc.dm" -#include "code\game\objects\items\weapons\storage\artistic_toolbox.dm" -#include "code\game\objects\items\weapons\storage\backpack.dm" -#include "code\game\objects\items\weapons\storage\bags.dm" -#include "code\game\objects\items\weapons\storage\belt.dm" -#include "code\game\objects\items\weapons\storage\bible.dm" -#include "code\game\objects\items\weapons\storage\boxes.dm" -#include "code\game\objects\items\weapons\storage\briefcase.dm" -#include "code\game\objects\items\weapons\storage\fancy.dm" -#include "code\game\objects\items\weapons\storage\firstaid.dm" -#include "code\game\objects\items\weapons\storage\internal.dm" -#include "code\game\objects\items\weapons\storage\lockbox.dm" -#include "code\game\objects\items\weapons\storage\secure.dm" -#include "code\game\objects\items\weapons\storage\storage.dm" -#include "code\game\objects\items\weapons\storage\toolbox.dm" -#include "code\game\objects\items\weapons\storage\uplink_kits.dm" -#include "code\game\objects\items\weapons\storage\wallets.dm" -#include "code\game\objects\items\weapons\tanks\jetpack.dm" -#include "code\game\objects\items\weapons\tanks\tank_types.dm" -#include "code\game\objects\items\weapons\tanks\tanks.dm" -#include "code\game\objects\items\weapons\tanks\watertank.dm" -#include "code\game\objects\random\random.dm" -#include "code\game\objects\structures\aliens.dm" -#include "code\game\objects\structures\barsign.dm" -#include "code\game\objects\structures\bedsheet_bin.dm" -#include "code\game\objects\structures\coathanger.dm" -#include "code\game\objects\structures\curtains.dm" -#include "code\game\objects\structures\depot.dm" -#include "code\game\objects\structures\displaycase.dm" -#include "code\game\objects\structures\door_assembly.dm" -#include "code\game\objects\structures\door_assembly_types.dm" -#include "code\game\objects\structures\dresser.dm" -#include "code\game\objects\structures\electricchair.dm" -#include "code\game\objects\structures\engicart.dm" -#include "code\game\objects\structures\extinguisher.dm" -#include "code\game\objects\structures\false_walls.dm" -#include "code\game\objects\structures\flora.dm" -#include "code\game\objects\structures\fluff.dm" -#include "code\game\objects\structures\foodcart.dm" -#include "code\game\objects\structures\girders.dm" -#include "code\game\objects\structures\grille.dm" -#include "code\game\objects\structures\guillotine.dm" -#include "code\game\objects\structures\holosign.dm" -#include "code\game\objects\structures\inflatable.dm" -#include "code\game\objects\structures\janicart.dm" -#include "code\game\objects\structures\kitchen_spike.dm" -#include "code\game\objects\structures\ladders.dm" -#include "code\game\objects\structures\lamarr_cage.dm" -#include "code\game\objects\structures\lattice.dm" -#include "code\game\objects\structures\mineral_doors.dm" -#include "code\game\objects\structures\mirror.dm" -#include "code\game\objects\structures\misc.dm" -#include "code\game\objects\structures\mop_bucket.dm" -#include "code\game\objects\structures\morgue.dm" -#include "code\game\objects\structures\musician.dm" -#include "code\game\objects\structures\noticeboard.dm" -#include "code\game\objects\structures\plasticflaps.dm" -#include "code\game\objects\structures\reflector.dm" -#include "code\game\objects\structures\safe.dm" -#include "code\game\objects\structures\signs.dm" -#include "code\game\objects\structures\spirit_board.dm" -#include "code\game\objects\structures\statues.dm" -#include "code\game\objects\structures\table_frames.dm" -#include "code\game\objects\structures\tables_racks.dm" -#include "code\game\objects\structures\tank_dispenser.dm" -#include "code\game\objects\structures\target_stake.dm" -#include "code\game\objects\structures\watercloset.dm" -#include "code\game\objects\structures\windoor_assembly.dm" -#include "code\game\objects\structures\window.dm" -#include "code\game\objects\structures\crates_lockers\closets.dm" -#include "code\game\objects\structures\crates_lockers\crates.dm" -#include "code\game\objects\structures\crates_lockers\crittercrate.dm" -#include "code\game\objects\structures\crates_lockers\largecrate.dm" -#include "code\game\objects\structures\crates_lockers\walllocker.dm" -#include "code\game\objects\structures\crates_lockers\closets\cardboardbox.dm" -#include "code\game\objects\structures\crates_lockers\closets\coffin.dm" -#include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" -#include "code\game\objects\structures\crates_lockers\closets\fireaxe.dm" -#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" -#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" -#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" -#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" -#include "code\game\objects\structures\crates_lockers\closets\statue.dm" -#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" -#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\chaplain.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\depot.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\miscjobs.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" -#include "code\game\objects\structures\decor\decor.dm" -#include "code\game\objects\structures\decor\machinery\telecomms.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" -#include "code\game\objects\structures\transit_tubes\station.dm" -#include "code\game\objects\structures\transit_tubes\transit_tube.dm" -#include "code\game\objects\structures\transit_tubes\transit_tube_pod.dm" -#include "code\game\turfs\simulated.dm" -#include "code\game\turfs\turf.dm" -#include "code\game\turfs\unsimulated.dm" -#include "code\game\turfs\simulated\floor.dm" -#include "code\game\turfs\simulated\minerals.dm" -#include "code\game\turfs\simulated\river.dm" -#include "code\game\turfs\simulated\shuttle.dm" -#include "code\game\turfs\simulated\walls.dm" -#include "code\game\turfs\simulated\walls_indestructible.dm" -#include "code\game\turfs\simulated\walls_mineral.dm" -#include "code\game\turfs\simulated\walls_misc.dm" -#include "code\game\turfs\simulated\walls_reinforced.dm" -#include "code\game\turfs\simulated\floor\asteroid.dm" -#include "code\game\turfs\simulated\floor\chasm.dm" -#include "code\game\turfs\simulated\floor\fancy_floor.dm" -#include "code\game\turfs\simulated\floor\indestructible.dm" -#include "code\game\turfs\simulated\floor\lava.dm" -#include "code\game\turfs\simulated\floor\light_floor.dm" -#include "code\game\turfs\simulated\floor\mineral.dm" -#include "code\game\turfs\simulated\floor\misc_floor.dm" -#include "code\game\turfs\simulated\floor\plasteel_floor.dm" -#include "code\game\turfs\simulated\floor\plating.dm" -#include "code\game\turfs\space\space.dm" -#include "code\game\turfs\space\transit.dm" -#include "code\game\turfs\unsimulated\beach.dm" -#include "code\game\turfs\unsimulated\floor.dm" -#include "code\game\turfs\unsimulated\walls.dm" -#include "code\game\verbs\ooc.dm" -#include "code\game\verbs\randomtip.dm" -#include "code\game\verbs\suicide.dm" -#include "code\game\verbs\who.dm" -#include "code\js\byjax.dm" -#include "code\js\menus.dm" -#include "code\LINDA\LINDA_fire.dm" -#include "code\LINDA\LINDA_system.dm" -#include "code\LINDA\LINDA_turf_tile.dm" -#include "code\modules\admin\admin.dm" -#include "code\modules\admin\admin_investigate.dm" -#include "code\modules\admin\admin_memo.dm" -#include "code\modules\admin\admin_ranks.dm" -#include "code\modules\admin\admin_verbs.dm" -#include "code\modules\admin\banappearance.dm" -#include "code\modules\admin\banjob.dm" -#include "code\modules\admin\create_mob.dm" -#include "code\modules\admin\create_object.dm" -#include "code\modules\admin\create_poll.dm" -#include "code\modules\admin\create_turf.dm" -#include "code\modules\admin\holder2.dm" -#include "code\modules\admin\ipintel.dm" -#include "code\modules\admin\IsBanned.dm" -#include "code\modules\admin\machine_upgrade.dm" -#include "code\modules\admin\NewBan.dm" -#include "code\modules\admin\player_panel.dm" -#include "code\modules\admin\secrets.dm" -#include "code\modules\admin\sql_notes.dm" -#include "code\modules\admin\stickyban.dm" -#include "code\modules\admin\topic.dm" -#include "code\modules\admin\ToRban.dm" -#include "code\modules\admin\watchlist.dm" -#include "code\modules\admin\DB ban\functions.dm" -#include "code\modules\admin\permissionverbs\permissionedit.dm" -#include "code\modules\admin\tickets\adminticketsverbs.dm" -#include "code\modules\admin\tickets\mentorticketsverbs.dm" -#include "code\modules\admin\verbs\adminhelp.dm" -#include "code\modules\admin\verbs\adminjump.dm" -#include "code\modules\admin\verbs\adminpm.dm" -#include "code\modules\admin\verbs\adminsay.dm" -#include "code\modules\admin\verbs\alt_check.dm" -#include "code\modules\admin\verbs\antag-ooc.dm" -#include "code\modules\admin\verbs\atmosdebug.dm" -#include "code\modules\admin\verbs\BrokenInhands.dm" -#include "code\modules\admin\verbs\cinematic.dm" -#include "code\modules\admin\verbs\custom_event.dm" -#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\dice.dm" -#include "code\modules\admin\verbs\freeze.dm" -#include "code\modules\admin\verbs\getlogs.dm" -#include "code\modules\admin\verbs\gimmick_team.dm" -#include "code\modules\admin\verbs\honksquad.dm" -#include "code\modules\admin\verbs\infiltratorteam_syndicate.dm" -#include "code\modules\admin\verbs\map_template_loadverb.dm" -#include "code\modules\admin\verbs\mapping.dm" -#include "code\modules\admin\verbs\massmodvar.dm" -#include "code\modules\admin\verbs\modifyvariables.dm" -#include "code\modules\admin\verbs\one_click_antag.dm" -#include "code\modules\admin\verbs\onlyone.dm" -#include "code\modules\admin\verbs\onlyoneteam.dm" -#include "code\modules\admin\verbs\playsound.dm" -#include "code\modules\admin\verbs\possess.dm" -#include "code\modules\admin\verbs\pray.dm" -#include "code\modules\admin\verbs\randomverbs.dm" -#include "code\modules\admin\verbs\serialization.dm" -#include "code\modules\admin\verbs\space_transitions.dm" -#include "code\modules\admin\verbs\spawnfloorcluwne.dm" -#include "code\modules\admin\verbs\striketeam.dm" -#include "code\modules\admin\verbs\striketeam_syndicate.dm" -#include "code\modules\admin\verbs\ticklag.dm" -#include "code\modules\admin\verbs\toggledebugverbs.dm" -#include "code\modules\admin\verbs\tripAI.dm" -#include "code\modules\admin\verbs\vox_raiders.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" -#include "code\modules\admin\verbs\SDQL2\useful_procs.dm" -#include "code\modules\alarm\alarm.dm" -#include "code\modules\alarm\alarm_handler.dm" -#include "code\modules\alarm\atmosphere_alarm.dm" -#include "code\modules\alarm\burglar_alarm.dm" -#include "code\modules\alarm\camera_alarm.dm" -#include "code\modules\alarm\fire_alarm.dm" -#include "code\modules\alarm\motion_alarm.dm" -#include "code\modules\alarm\power_alarm.dm" -#include "code\modules\antagonists\_common\antag_datum.dm" -#include "code\modules\antagonists\_common\antag_helpers.dm" -#include "code\modules\antagonists\_common\antag_hud.dm" -#include "code\modules\antagonists\_common\antag_spawner.dm" -#include "code\modules\antagonists\_common\antag_team.dm" -#include "code\modules\antagonists\wishgranter\wishgranter.dm" -#include "code\modules\arcade\arcade_base.dm" -#include "code\modules\arcade\arcade_prize.dm" -#include "code\modules\arcade\claw_game.dm" -#include "code\modules\arcade\prize_counter.dm" -#include "code\modules\arcade\prize_datums.dm" -#include "code\modules\arcade\mob_hunt\battle_computer.dm" -#include "code\modules\arcade\mob_hunt\mob_avatar.dm" -#include "code\modules\arcade\mob_hunt\mob_cards.dm" -#include "code\modules\arcade\mob_hunt\mob_datums.dm" -#include "code\modules\arcade\mob_hunt\mob_type_datums.dm" -#include "code\modules\assembly\assembly.dm" -#include "code\modules\assembly\bomb.dm" -#include "code\modules\assembly\health.dm" -#include "code\modules\assembly\helpers.dm" -#include "code\modules\assembly\holder.dm" -#include "code\modules\assembly\igniter.dm" -#include "code\modules\assembly\infrared.dm" -#include "code\modules\assembly\mousetrap.dm" -#include "code\modules\assembly\proximity.dm" -#include "code\modules\assembly\shock_kit.dm" -#include "code\modules\assembly\signaler.dm" -#include "code\modules\assembly\timer.dm" -#include "code\modules\assembly\voice.dm" -#include "code\modules\atmos_automation\console.dm" -#include "code\modules\atmos_automation\statements.dm" -#include "code\modules\atmos_automation\implementation\digital_valves.dm" -#include "code\modules\atmos_automation\implementation\emitters.dm" -#include "code\modules\atmos_automation\implementation\injectors.dm" -#include "code\modules\atmos_automation\implementation\scrubbers.dm" -#include "code\modules\atmos_automation\implementation\sensors.dm" -#include "code\modules\atmos_automation\implementation\vent_pump.dm" -#include "code\modules\awaymissions\corpse.dm" -#include "code\modules\awaymissions\exile.dm" -#include "code\modules\awaymissions\gateway.dm" -#include "code\modules\awaymissions\loot.dm" -#include "code\modules\awaymissions\map_rng.dm" -#include "code\modules\awaymissions\pamphlet.dm" -#include "code\modules\awaymissions\zlevel.dm" -#include "code\modules\awaymissions\zvis.dm" -#include "code\modules\awaymissions\maploader\dmm_suite.dm" -#include "code\modules\awaymissions\maploader\reader.dm" -#include "code\modules\awaymissions\maploader\writer.dm" -#include "code\modules\awaymissions\mission_code\academy.dm" -#include "code\modules\awaymissions\mission_code\beach.dm" -#include "code\modules\awaymissions\mission_code\blackmarketpackers.dm" -#include "code\modules\awaymissions\mission_code\centcomAway.dm" -#include "code\modules\awaymissions\mission_code\challenge.dm" -#include "code\modules\awaymissions\mission_code\evil_santa.dm" -#include "code\modules\awaymissions\mission_code\spacebattle.dm" -#include "code\modules\awaymissions\mission_code\spacehotel.dm" -#include "code\modules\awaymissions\mission_code\stationCollision.dm" -#include "code\modules\awaymissions\mission_code\UO71-terrorspiders.dm" -#include "code\modules\awaymissions\mission_code\wildwest.dm" -#include "code\modules\awaymissions\mission_code\ghost_role_spawners\golems.dm" -#include "code\modules\awaymissions\mission_code\ghost_role_spawners\oldstation.dm" -#include "code\modules\awaymissions\mission_code\ruins\oldstation.dm" -#include "code\modules\awaymissions\mission_code\ruins\wizardcrash.dm" -#include "code\modules\buildmode\bm_mode.dm" -#include "code\modules\buildmode\buildmode.dm" -#include "code\modules\buildmode\buttons.dm" -#include "code\modules\buildmode\effects\line.dm" -#include "code\modules\buildmode\submodes\advanced.dm" -#include "code\modules\buildmode\submodes\area_edit.dm" -#include "code\modules\buildmode\submodes\atmos.dm" -#include "code\modules\buildmode\submodes\basic.dm" -#include "code\modules\buildmode\submodes\boom.dm" -#include "code\modules\buildmode\submodes\copy.dm" -#include "code\modules\buildmode\submodes\fill.dm" -#include "code\modules\buildmode\submodes\link.dm" -#include "code\modules\buildmode\submodes\mapgen.dm" -#include "code\modules\buildmode\submodes\save.dm" -#include "code\modules\buildmode\submodes\throwing.dm" -#include "code\modules\buildmode\submodes\variable_edit.dm" -#include "code\modules\busy_space\air_traffic.dm" -#include "code\modules\busy_space\loremaster.dm" -#include "code\modules\busy_space\organizations.dm" -#include "code\modules\client\asset_cache.dm" -#include "code\modules\client\client defines.dm" -#include "code\modules\client\client procs.dm" -#include "code\modules\client\message.dm" -#include "code\modules\client\view.dm" -#include "code\modules\client\preference\preferences.dm" -#include "code\modules\client\preference\preferences_mysql.dm" -#include "code\modules\client\preference\preferences_spawnpoints.dm" -#include "code\modules\client\preference\preferences_toggles.dm" -#include "code\modules\client\preference\loadout\gear_tweaks.dm" -#include "code\modules\client\preference\loadout\loadout.dm" -#include "code\modules\client\preference\loadout\loadout_accessories.dm" -#include "code\modules\client\preference\loadout\loadout_cosmetics.dm" -#include "code\modules\client\preference\loadout\loadout_donor.dm" -#include "code\modules\client\preference\loadout\loadout_general.dm" -#include "code\modules\client\preference\loadout\loadout_hat.dm" -#include "code\modules\client\preference\loadout\loadout_racial.dm" -#include "code\modules\client\preference\loadout\loadout_shoes.dm" -#include "code\modules\client\preference\loadout\loadout_suit.dm" -#include "code\modules\client\preference\loadout\loadout_uniform.dm" -#include "code\modules\clothing\chameleon.dm" -#include "code\modules\clothing\clothing.dm" -#include "code\modules\clothing\ears\ears.dm" -#include "code\modules\clothing\glasses\glasses.dm" -#include "code\modules\clothing\glasses\hud.dm" -#include "code\modules\clothing\gloves\boxing.dm" -#include "code\modules\clothing\gloves\color.dm" -#include "code\modules\clothing\gloves\miscellaneous.dm" -#include "code\modules\clothing\gloves\rings.dm" -#include "code\modules\clothing\head\collectable.dm" -#include "code\modules\clothing\head\hardhat.dm" -#include "code\modules\clothing\head\helmet.dm" -#include "code\modules\clothing\head\jobs.dm" -#include "code\modules\clothing\head\misc.dm" -#include "code\modules\clothing\head\misc_special.dm" -#include "code\modules\clothing\head\soft_caps.dm" -#include "code\modules\clothing\masks\boxing.dm" -#include "code\modules\clothing\masks\breath.dm" -#include "code\modules\clothing\masks\gasmask.dm" -#include "code\modules\clothing\masks\miscellaneous.dm" -#include "code\modules\clothing\patreon\glasses.dm" -#include "code\modules\clothing\patreon\hats.dm" -#include "code\modules\clothing\shoes\colour.dm" -#include "code\modules\clothing\shoes\magboots.dm" -#include "code\modules\clothing\shoes\miscellaneous.dm" -#include "code\modules\clothing\spacesuits\alien.dm" -#include "code\modules\clothing\spacesuits\breaches.dm" -#include "code\modules\clothing\spacesuits\chronosuit.dm" -#include "code\modules\clothing\spacesuits\ert.dm" -#include "code\modules\clothing\spacesuits\hardsuit.dm" -#include "code\modules\clothing\spacesuits\miscellaneous.dm" -#include "code\modules\clothing\spacesuits\plasmamen.dm" -#include "code\modules\clothing\spacesuits\syndi.dm" -#include "code\modules\clothing\spacesuits\void.dm" -#include "code\modules\clothing\spacesuits\rig\rig.dm" -#include "code\modules\clothing\spacesuits\rig\rig_armormod.dm" -#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm" -#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm" -#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" -#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" -#include "code\modules\clothing\spacesuits\rig\modules\combat.dm" -#include "code\modules\clothing\spacesuits\rig\modules\computer.dm" -#include "code\modules\clothing\spacesuits\rig\modules\modules.dm" -#include "code\modules\clothing\spacesuits\rig\modules\ninja.dm" -#include "code\modules\clothing\spacesuits\rig\modules\utility.dm" -#include "code\modules\clothing\spacesuits\rig\modules\vision.dm" -#include "code\modules\clothing\spacesuits\rig\suits\alien.dm" -#include "code\modules\clothing\spacesuits\rig\suits\combat.dm" -#include "code\modules\clothing\spacesuits\rig\suits\ert_suits.dm" -#include "code\modules\clothing\spacesuits\rig\suits\light.dm" -#include "code\modules\clothing\spacesuits\rig\suits\merc.dm" -#include "code\modules\clothing\spacesuits\rig\suits\station.dm" -#include "code\modules\clothing\suits\alien.dm" -#include "code\modules\clothing\suits\armor.dm" -#include "code\modules\clothing\suits\bio.dm" -#include "code\modules\clothing\suits\hood.dm" -#include "code\modules\clothing\suits\jobs.dm" -#include "code\modules\clothing\suits\labcoat.dm" -#include "code\modules\clothing\suits\miscellaneous.dm" -#include "code\modules\clothing\suits\storage.dm" -#include "code\modules\clothing\suits\utility.dm" -#include "code\modules\clothing\suits\wiz_robe.dm" -#include "code\modules\clothing\under\color.dm" -#include "code\modules\clothing\under\miscellaneous.dm" -#include "code\modules\clothing\under\oldstation_uni.dm" -#include "code\modules\clothing\under\pants.dm" -#include "code\modules\clothing\under\shorts.dm" -#include "code\modules\clothing\under\syndicate.dm" -#include "code\modules\clothing\under\accessories\accessory.dm" -#include "code\modules\clothing\under\accessories\armband.dm" -#include "code\modules\clothing\under\accessories\holster.dm" -#include "code\modules\clothing\under\accessories\storage.dm" -#include "code\modules\clothing\under\jobs\civilian.dm" -#include "code\modules\clothing\under\jobs\engineering.dm" -#include "code\modules\clothing\under\jobs\medsci.dm" -#include "code\modules\clothing\under\jobs\security.dm" -#include "code\modules\countdown\countdown.dm" -#include "code\modules\crafting\craft.dm" -#include "code\modules\crafting\guncrafting.dm" -#include "code\modules\crafting\recipes.dm" -#include "code\modules\customitems\item_defines.dm" -#include "code\modules\customitems\item_spawning.dm" -#include "code\modules\detective_work\detective_work.dm" -#include "code\modules\detective_work\evidence.dm" -#include "code\modules\detective_work\footprints_and_rag.dm" -#include "code\modules\detective_work\scanner.dm" -#include "code\modules\economy\Accounts.dm" -#include "code\modules\economy\Accounts_DB.dm" -#include "code\modules\economy\ATM.dm" -#include "code\modules\economy\Economy.dm" -#include "code\modules\economy\Economy_Events.dm" -#include "code\modules\economy\Economy_Events_Mundane.dm" -#include "code\modules\economy\Economy_TradeDestinations.dm" -#include "code\modules\economy\EFTPOS.dm" -#include "code\modules\economy\Job_Departments.dm" -#include "code\modules\economy\POS.dm" -#include "code\modules\economy\utils.dm" -#include "code\modules\error_handler\error_handler.dm" -#include "code\modules\error_handler\error_viewer.dm" -#include "code\modules\events\abductor.dm" -#include "code\modules\events\alien_infestation.dm" -#include "code\modules\events\anomaly.dm" -#include "code\modules\events\anomaly_bluespace.dm" -#include "code\modules\events\anomaly_flux.dm" -#include "code\modules\events\anomaly_grav.dm" -#include "code\modules\events\anomaly_pyro.dm" -#include "code\modules\events\anomaly_vortex.dm" -#include "code\modules\events\aurora_caelus.dm" -#include "code\modules\events\blob.dm" -#include "code\modules\events\brand_intelligence.dm" -#include "code\modules\events\carp_migration.dm" -#include "code\modules\events\communications_blackout.dm" -#include "code\modules\events\disease_outbreak.dm" -#include "code\modules\events\dust.dm" -#include "code\modules\events\electrical_storm.dm" -#include "code\modules\events\event.dm" -#include "code\modules\events\event_container.dm" -#include "code\modules\events\event_procs.dm" -#include "code\modules\events\false_alarm.dm" -#include "code\modules\events\floorcluwne.dm" -#include "code\modules\events\grid_check.dm" -#include "code\modules\events\immovable_rod.dm" -#include "code\modules\events\infestation.dm" -#include "code\modules\events\ion_storm.dm" -#include "code\modules\events\koi_mirgration.dm" -#include "code\modules\events\mass_hallucination.dm" -#include "code\modules\events\meaty_gore.dm" -#include "code\modules\events\meaty_ops.dm" -#include "code\modules\events\meaty_ores.dm" -#include "code\modules\events\meteors.dm" -#include "code\modules\events\money_hacker.dm" -#include "code\modules\events\money_lotto.dm" -#include "code\modules\events\money_spam.dm" -#include "code\modules\events\prison_break.dm" -#include "code\modules\events\radiation_storm.dm" -#include "code\modules\events\rogue_drones.dm" -#include "code\modules\events\sentience.dm" -#include "code\modules\events\slaughterevent.dm" -#include "code\modules\events\spacevine.dm" -#include "code\modules\events\spider_infestation.dm" -#include "code\modules\events\spider_terror.dm" -#include "code\modules\events\spontaneous_appendicitis.dm" -#include "code\modules\events\tear.dm" -#include "code\modules\events\tear_honk.dm" -#include "code\modules\events\traders.dm" -#include "code\modules\events\undead.dm" -#include "code\modules\events\vent_clog.dm" -#include "code\modules\events\wallrot.dm" -#include "code\modules\events\wormholes.dm" -#include "code\modules\events\wizard\ghost.dm" -#include "code\modules\examine\examine.dm" -#include "code\modules\examine\descriptions\atmospherics.dm" -#include "code\modules\examine\descriptions\engineering.dm" -#include "code\modules\examine\descriptions\medical.dm" -#include "code\modules\examine\descriptions\mobs.dm" -#include "code\modules\examine\descriptions\stacks.dm" -#include "code\modules\examine\descriptions\structures.dm" -#include "code\modules\examine\descriptions\turfs.dm" -#include "code\modules\examine\descriptions\weapons.dm" -#include "code\modules\ext_scripts\irc.dm" -#include "code\modules\ext_scripts\python.dm" -#include "code\modules\fancytitle\fancytitle.dm" -#include "code\modules\fish\fish_eggs.dm" -#include "code\modules\fish\fish_items.dm" -#include "code\modules\fish\fish_types.dm" -#include "code\modules\fish\fishtank.dm" -#include "code\modules\flufftext\Dreaming.dm" -#include "code\modules\flufftext\Hallucination.dm" -#include "code\modules\flufftext\TextFilters.dm" -#include "code\modules\food_and_drinks\food.dm" -#include "code\modules\food_and_drinks\drinks\drinks.dm" -#include "code\modules\food_and_drinks\drinks\bottler\bottler.dm" -#include "code\modules\food_and_drinks\drinks\bottler\bottler_recipes.dm" -#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm" -#include "code\modules\food_and_drinks\drinks\drinks\cans.dm" -#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm" -#include "code\modules\food_and_drinks\drinks\drinks\mugs.dm" -#include "code\modules\food_and_drinks\drinks\drinks\shotglass.dm" -#include "code\modules\food_and_drinks\food\condiment.dm" -#include "code\modules\food_and_drinks\food\customizables.dm" -#include "code\modules\food_and_drinks\food\snacks.dm" -#include "code\modules\food_and_drinks\food\foods\baked_goods.dm" -#include "code\modules\food_and_drinks\food\foods\bread.dm" -#include "code\modules\food_and_drinks\food\foods\candy.dm" -#include "code\modules\food_and_drinks\food\foods\desserts.dm" -#include "code\modules\food_and_drinks\food\foods\ethnic.dm" -#include "code\modules\food_and_drinks\food\foods\ingredients.dm" -#include "code\modules\food_and_drinks\food\foods\junkfood.dm" -#include "code\modules\food_and_drinks\food\foods\meat.dm" -#include "code\modules\food_and_drinks\food\foods\misc.dm" -#include "code\modules\food_and_drinks\food\foods\pasta.dm" -#include "code\modules\food_and_drinks\food\foods\pizza.dm" -#include "code\modules\food_and_drinks\food\foods\sandwiches.dm" -#include "code\modules\food_and_drinks\food\foods\seafood.dm" -#include "code\modules\food_and_drinks\food\foods\side_dishes.dm" -#include "code\modules\food_and_drinks\food\foods\soups.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\candy_maker.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\cereal_maker.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\cooker.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\food_grill.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\grill_new.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat_2.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\juicer.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\kitchen_machine.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\oven.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\oven_new.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\processor.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm" -#include "code\modules\food_and_drinks\recipes\recipes_candy.dm" -#include "code\modules\food_and_drinks\recipes\recipes_grill.dm" -#include "code\modules\food_and_drinks\recipes\recipes_microwave.dm" -#include "code\modules\food_and_drinks\recipes\recipes_oven.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_table.dm" -#include "code\modules\games\52card.dm" -#include "code\modules\games\cards.dm" -#include "code\modules\games\tarot.dm" -#include "code\modules\holiday\christmas.dm" -#include "code\modules\holiday\holiday.dm" -#include "code\modules\hydroponics\biogenerator.dm" -#include "code\modules\hydroponics\fermenting_barrel.dm" -#include "code\modules\hydroponics\gene_modder.dm" -#include "code\modules\hydroponics\grown.dm" -#include "code\modules\hydroponics\growninedible.dm" -#include "code\modules\hydroponics\hydroitemdefines.dm" -#include "code\modules\hydroponics\hydroponics.dm" -#include "code\modules\hydroponics\plant_genes.dm" -#include "code\modules\hydroponics\sample.dm" -#include "code\modules\hydroponics\seed_extractor.dm" -#include "code\modules\hydroponics\seeds.dm" -#include "code\modules\hydroponics\beekeeping\beebox.dm" -#include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm" -#include "code\modules\hydroponics\beekeeping\honey_frame.dm" -#include "code\modules\hydroponics\beekeeping\honeycomb.dm" -#include "code\modules\hydroponics\grown\ambrosia.dm" -#include "code\modules\hydroponics\grown\apple.dm" -#include "code\modules\hydroponics\grown\banana.dm" -#include "code\modules\hydroponics\grown\beans.dm" -#include "code\modules\hydroponics\grown\berries.dm" -#include "code\modules\hydroponics\grown\cannabis.dm" -#include "code\modules\hydroponics\grown\cereals.dm" -#include "code\modules\hydroponics\grown\chili.dm" -#include "code\modules\hydroponics\grown\citrus.dm" -#include "code\modules\hydroponics\grown\cocoa_vanilla.dm" -#include "code\modules\hydroponics\grown\corn.dm" -#include "code\modules\hydroponics\grown\eggplant.dm" -#include "code\modules\hydroponics\grown\flowers.dm" -#include "code\modules\hydroponics\grown\grass_carpet.dm" -#include "code\modules\hydroponics\grown\herbals.dm" -#include "code\modules\hydroponics\grown\kudzu.dm" -#include "code\modules\hydroponics\grown\melon.dm" -#include "code\modules\hydroponics\grown\misc.dm" -#include "code\modules\hydroponics\grown\mushrooms.dm" -#include "code\modules\hydroponics\grown\nettle.dm" -#include "code\modules\hydroponics\grown\nymph.dm" -#include "code\modules\hydroponics\grown\onion.dm" -#include "code\modules\hydroponics\grown\peanut.dm" -#include "code\modules\hydroponics\grown\pineapple.dm" -#include "code\modules\hydroponics\grown\potato.dm" -#include "code\modules\hydroponics\grown\pumpkin.dm" -#include "code\modules\hydroponics\grown\random.dm" -#include "code\modules\hydroponics\grown\replicapod.dm" -#include "code\modules\hydroponics\grown\root.dm" -#include "code\modules\hydroponics\grown\tea_coffee.dm" -#include "code\modules\hydroponics\grown\tobacco.dm" -#include "code\modules\hydroponics\grown\tomato.dm" -#include "code\modules\hydroponics\grown\towercap.dm" -#include "code\modules\karma\karma.dm" -#include "code\modules\library\admin.dm" -#include "code\modules\library\codex_gigas.dm" -#include "code\modules\library\lib_items.dm" -#include "code\modules\library\lib_machines.dm" -#include "code\modules\library\lib_readme.dm" -#include "code\modules\library\random_books.dm" -#include "code\modules\library\computers\base.dm" -#include "code\modules\library\computers\checkout.dm" -#include "code\modules\library\computers\public.dm" -#include "code\modules\lighting\__lighting_docs.dm" -#include "code\modules\lighting\lighting_area.dm" -#include "code\modules\lighting\lighting_atom.dm" -#include "code\modules\lighting\lighting_corner.dm" -#include "code\modules\lighting\lighting_object.dm" -#include "code\modules\lighting\lighting_setup.dm" -#include "code\modules\lighting\lighting_source.dm" -#include "code\modules\lighting\lighting_turf.dm" -#include "code\modules\logic\converter.dm" -#include "code\modules\logic\dual_input.dm" -#include "code\modules\logic\logic_base.dm" -#include "code\modules\logic\mono_input.dm" -#include "code\modules\map_fluff\cyberiad.dm" -#include "code\modules\map_fluff\delta.dm" -#include "code\modules\map_fluff\maps.dm" -#include "code\modules\map_fluff\metastation.dm" -#include "code\modules\martial_arts\adminfu.dm" -#include "code\modules\martial_arts\brawling.dm" -#include "code\modules\martial_arts\cqc.dm" -#include "code\modules\martial_arts\krav_maga.dm" -#include "code\modules\martial_arts\martial.dm" -#include "code\modules\martial_arts\mimejutsu.dm" -#include "code\modules\martial_arts\plasma_fist.dm" -#include "code\modules\martial_arts\sleeping_carp.dm" -#include "code\modules\martial_arts\wrestleing.dm" -#include "code\modules\mining\abandonedcrates.dm" -#include "code\modules\mining\coins.dm" -#include "code\modules\mining\equipment_locker.dm" -#include "code\modules\mining\explorer_gear.dm" -#include "code\modules\mining\machine_processing.dm" -#include "code\modules\mining\machine_stacking.dm" -#include "code\modules\mining\machine_unloading.dm" -#include "code\modules\mining\mine_items.dm" -#include "code\modules\mining\minebot.dm" -#include "code\modules\mining\mint.dm" -#include "code\modules\mining\money_bag.dm" -#include "code\modules\mining\ore.dm" -#include "code\modules\mining\satchel_ore_boxdm.dm" -#include "code\modules\mining\shelters.dm" -#include "code\modules\mining\equipment\marker_beacons.dm" -#include "code\modules\mining\equipment\survival_pod.dm" -#include "code\modules\mining\laborcamp\laborshuttle.dm" -#include "code\modules\mining\laborcamp\laborstacker.dm" -#include "code\modules\mining\lavaland\ash_flora.dm" -#include "code\modules\mining\lavaland\necropolis_chests.dm" -#include "code\modules\mining\lavaland\loot\ashdragon_loot.dm" -#include "code\modules\mining\lavaland\loot\bubblegum_loot.dm" -#include "code\modules\mining\lavaland\loot\colossus_loot.dm" -#include "code\modules\mining\lavaland\loot\hierophant_loot.dm" -#include "code\modules\mining\lavaland\loot\legion_loot.dm" -#include "code\modules\mining\lavaland\loot\tendril_loot.dm" -#include "code\modules\mob\abilities.dm" -#include "code\modules\mob\death.dm" -#include "code\modules\mob\emote.dm" -#include "code\modules\mob\hear_say.dm" -#include "code\modules\mob\holder.dm" -#include "code\modules\mob\inventory.dm" -#include "code\modules\mob\language.dm" -#include "code\modules\mob\login.dm" -#include "code\modules\mob\logout.dm" -#include "code\modules\mob\mob.dm" -#include "code\modules\mob\mob_defines.dm" -#include "code\modules\mob\mob_grab.dm" -#include "code\modules\mob\mob_helpers.dm" -#include "code\modules\mob\mob_movement.dm" -#include "code\modules\mob\mob_transformation_simple.dm" -#include "code\modules\mob\say.dm" -#include "code\modules\mob\status_procs.dm" -#include "code\modules\mob\transform_procs.dm" -#include "code\modules\mob\typing_indicator.dm" -#include "code\modules\mob\update_icons.dm" -#include "code\modules\mob\update_status.dm" -#include "code\modules\mob\camera\camera.dm" -#include "code\modules\mob\dead\dead.dm" -#include "code\modules\mob\dead\death.dm" -#include "code\modules\mob\dead\observer\login.dm" -#include "code\modules\mob\dead\observer\logout.dm" -#include "code\modules\mob\dead\observer\observer.dm" -#include "code\modules\mob\dead\observer\say.dm" -#include "code\modules\mob\dead\observer\spells.dm" -#include "code\modules\mob\living\autohiss.dm" -#include "code\modules\mob\living\damage_procs.dm" -#include "code\modules\mob\living\death.dm" -#include "code\modules\mob\living\default_language.dm" -#include "code\modules\mob\living\life.dm" -#include "code\modules\mob\living\living.dm" -#include "code\modules\mob\living\living_defense.dm" -#include "code\modules\mob\living\living_defines.dm" -#include "code\modules\mob\living\login.dm" -#include "code\modules\mob\living\logout.dm" -#include "code\modules\mob\living\say.dm" -#include "code\modules\mob\living\stat_states.dm" -#include "code\modules\mob\living\status_procs.dm" -#include "code\modules\mob\living\update_status.dm" -#include "code\modules\mob\living\carbon\_defines.dm" -#include "code\modules\mob\living\carbon\carbon.dm" -#include "code\modules\mob\living\carbon\carbon_defense.dm" -#include "code\modules\mob\living\carbon\carbon_defines.dm" -#include "code\modules\mob\living\carbon\death.dm" -#include "code\modules\mob\living\carbon\give.dm" -#include "code\modules\mob\living\carbon\life.dm" -#include "code\modules\mob\living\carbon\superheroes.dm" -#include "code\modules\mob\living\carbon\update_icons.dm" -#include "code\modules\mob\living\carbon\update_status.dm" -#include "code\modules\mob\living\carbon\alien\alien.dm" -#include "code\modules\mob\living\carbon\alien\alien_defense.dm" -#include "code\modules\mob\living\carbon\alien\death.dm" -#include "code\modules\mob\living\carbon\alien\life.dm" -#include "code\modules\mob\living\carbon\alien\login.dm" -#include "code\modules\mob\living\carbon\alien\logout.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\emote.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\empress.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\life.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\drone.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm" -#include "code\modules\mob\living\carbon\alien\larva\emote.dm" -#include "code\modules\mob\living\carbon\alien\larva\inventory.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva_defense.dm" -#include "code\modules\mob\living\carbon\alien\larva\life.dm" -#include "code\modules\mob\living\carbon\alien\larva\powers.dm" -#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm" -#include "code\modules\mob\living\carbon\alien\special\facehugger.dm" -#include "code\modules\mob\living\carbon\brain\brain.dm" -#include "code\modules\mob\living\carbon\brain\brain_item.dm" -#include "code\modules\mob\living\carbon\brain\death.dm" -#include "code\modules\mob\living\carbon\brain\emote.dm" -#include "code\modules\mob\living\carbon\brain\life.dm" -#include "code\modules\mob\living\carbon\brain\login.dm" -#include "code\modules\mob\living\carbon\brain\MMI.dm" -#include "code\modules\mob\living\carbon\brain\MMI_radio.dm" -#include "code\modules\mob\living\carbon\brain\robotic_brain.dm" -#include "code\modules\mob\living\carbon\brain\say.dm" -#include "code\modules\mob\living\carbon\brain\update_status.dm" -#include "code\modules\mob\living\carbon\human\appearance.dm" -#include "code\modules\mob\living\carbon\human\body_accessories.dm" -#include "code\modules\mob\living\carbon\human\death.dm" -#include "code\modules\mob\living\carbon\human\emote.dm" -#include "code\modules\mob\living\carbon\human\examine.dm" -#include "code\modules\mob\living\carbon\human\human.dm" -#include "code\modules\mob\living\carbon\human\human_damage.dm" -#include "code\modules\mob\living\carbon\human\human_defense.dm" -#include "code\modules\mob\living\carbon\human\human_defines.dm" -#include "code\modules\mob\living\carbon\human\human_movement.dm" -#include "code\modules\mob\living\carbon\human\human_organs.dm" -#include "code\modules\mob\living\carbon\human\inventory.dm" -#include "code\modules\mob\living\carbon\human\life.dm" -#include "code\modules\mob\living\carbon\human\login.dm" -#include "code\modules\mob\living\carbon\human\logout.dm" -#include "code\modules\mob\living\carbon\human\npcs.dm" -#include "code\modules\mob\living\carbon\human\say.dm" -#include "code\modules\mob\living\carbon\human\status_procs.dm" -#include "code\modules\mob\living\carbon\human\update_icons.dm" -#include "code\modules\mob\living\carbon\human\update_stat.dm" -#include "code\modules\mob\living\carbon\human\species\_species.dm" -#include "code\modules\mob\living\carbon\human\species\abductor.dm" -#include "code\modules\mob\living\carbon\human\species\diona.dm" -#include "code\modules\mob\living\carbon\human\species\drask.dm" -#include "code\modules\mob\living\carbon\human\species\golem.dm" -#include "code\modules\mob\living\carbon\human\species\grey.dm" -#include "code\modules\mob\living\carbon\human\species\human.dm" -#include "code\modules\mob\living\carbon\human\species\kidan.dm" -#include "code\modules\mob\living\carbon\human\species\machine.dm" -#include "code\modules\mob\living\carbon\human\species\monkey.dm" -#include "code\modules\mob\living\carbon\human\species\nucleation.dm" -#include "code\modules\mob\living\carbon\human\species\plasmaman.dm" -#include "code\modules\mob\living\carbon\human\species\shadow.dm" -#include "code\modules\mob\living\carbon\human\species\shadowling.dm" -#include "code\modules\mob\living\carbon\human\species\skeleton.dm" -#include "code\modules\mob\living\carbon\human\species\skrell.dm" -#include "code\modules\mob\living\carbon\human\species\slime.dm" -#include "code\modules\mob\living\carbon\human\species\tajaran.dm" -#include "code\modules\mob\living\carbon\human\species\unathi.dm" -#include "code\modules\mob\living\carbon\human\species\vox.dm" -#include "code\modules\mob\living\carbon\human\species\vulpkanin.dm" -#include "code\modules\mob\living\carbon\human\species\wryn.dm" -#include "code\modules\mob\living\carbon\slime\death.dm" -#include "code\modules\mob\living\carbon\slime\emote.dm" -#include "code\modules\mob\living\carbon\slime\examine.dm" -#include "code\modules\mob\living\carbon\slime\life.dm" -#include "code\modules\mob\living\carbon\slime\powers.dm" -#include "code\modules\mob\living\carbon\slime\say.dm" -#include "code\modules\mob\living\carbon\slime\slime.dm" -#include "code\modules\mob\living\carbon\slime\subtypes.dm" -#include "code\modules\mob\living\carbon\slime\update_icons.dm" -#include "code\modules\mob\living\silicon\death.dm" -#include "code\modules\mob\living\silicon\emote.dm" -#include "code\modules\mob\living\silicon\laws.dm" -#include "code\modules\mob\living\silicon\login.dm" -#include "code\modules\mob\living\silicon\say.dm" -#include "code\modules\mob\living\silicon\silicon.dm" -#include "code\modules\mob\living\silicon\silicon_defense.dm" -#include "code\modules\mob\living\silicon\subsystems.dm" -#include "code\modules\mob\living\silicon\ai\ai.dm" -#include "code\modules\mob\living\silicon\ai\ai_defense.dm" -#include "code\modules\mob\living\silicon\ai\death.dm" -#include "code\modules\mob\living\silicon\ai\examine.dm" -#include "code\modules\mob\living\silicon\ai\latejoin.dm" -#include "code\modules\mob\living\silicon\ai\laws.dm" -#include "code\modules\mob\living\silicon\ai\life.dm" -#include "code\modules\mob\living\silicon\ai\login.dm" -#include "code\modules\mob\living\silicon\ai\logout.dm" -#include "code\modules\mob\living\silicon\ai\multicam.dm" -#include "code\modules\mob\living\silicon\ai\say.dm" -#include "code\modules\mob\living\silicon\ai\update_status.dm" -#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" -#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" -#include "code\modules\mob\living\silicon\ai\freelook\eye.dm" -#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm" -#include "code\modules\mob\living\silicon\decoy\death.dm" -#include "code\modules\mob\living\silicon\decoy\decoy.dm" -#include "code\modules\mob\living\silicon\decoy\life.dm" -#include "code\modules\mob\living\silicon\pai\death.dm" -#include "code\modules\mob\living\silicon\pai\life.dm" -#include "code\modules\mob\living\silicon\pai\pai.dm" -#include "code\modules\mob\living\silicon\pai\personality.dm" -#include "code\modules\mob\living\silicon\pai\recruit.dm" -#include "code\modules\mob\living\silicon\pai\say.dm" -#include "code\modules\mob\living\silicon\pai\software.dm" -#include "code\modules\mob\living\silicon\pai\software_modules.dm" -#include "code\modules\mob\living\silicon\pai\update_status.dm" -#include "code\modules\mob\living\silicon\robot\component.dm" -#include "code\modules\mob\living\silicon\robot\death.dm" -#include "code\modules\mob\living\silicon\robot\emote.dm" -#include "code\modules\mob\living\silicon\robot\examine.dm" -#include "code\modules\mob\living\silicon\robot\inventory.dm" -#include "code\modules\mob\living\silicon\robot\laws.dm" -#include "code\modules\mob\living\silicon\robot\life.dm" -#include "code\modules\mob\living\silicon\robot\login.dm" -#include "code\modules\mob\living\silicon\robot\photos.dm" -#include "code\modules\mob\living\silicon\robot\robot.dm" -#include "code\modules\mob\living\silicon\robot\robot_damage.dm" -#include "code\modules\mob\living\silicon\robot\robot_defense.dm" -#include "code\modules\mob\living\silicon\robot\robot_items.dm" -#include "code\modules\mob\living\silicon\robot\robot_module_actions.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules.dm" -#include "code\modules\mob\living\silicon\robot\robot_movement.dm" -#include "code\modules\mob\living\silicon\robot\syndicate.dm" -#include "code\modules\mob\living\silicon\robot\update_status.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" -#include "code\modules\mob\living\silicon\robot\drone\update_status.dm" -#include "code\modules\mob\living\simple_animal\animal_defense.dm" -#include "code\modules\mob\living\simple_animal\constructs.dm" -#include "code\modules\mob\living\simple_animal\corpse.dm" -#include "code\modules\mob\living\simple_animal\parrot.dm" -#include "code\modules\mob\living\simple_animal\posessed_object.dm" -#include "code\modules\mob\living\simple_animal\powers.dm" -#include "code\modules\mob\living\simple_animal\shade.dm" -#include "code\modules\mob\living\simple_animal\simple_animal.dm" -#include "code\modules\mob\living\simple_animal\spawner.dm" -#include "code\modules\mob\living\simple_animal\tribbles.dm" -#include "code\modules\mob\living\simple_animal\bot\bot.dm" -#include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" -#include "code\modules\mob\living\simple_animal\bot\construction.dm" -#include "code\modules\mob\living\simple_animal\bot\ed209bot.dm" -#include "code\modules\mob\living\simple_animal\bot\emote.dm" -#include "code\modules\mob\living\simple_animal\bot\floorbot.dm" -#include "code\modules\mob\living\simple_animal\bot\griefsky.dm" -#include "code\modules\mob\living\simple_animal\bot\honkbot.dm" -#include "code\modules\mob\living\simple_animal\bot\medbot.dm" -#include "code\modules\mob\living\simple_animal\bot\mulebot.dm" -#include "code\modules\mob\living\simple_animal\bot\secbot.dm" -#include "code\modules\mob\living\simple_animal\bot\syndicate.dm" -#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" -#include "code\modules\mob\living\simple_animal\friendly\cat.dm" -#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm" -#include "code\modules\mob\living\simple_animal\friendly\corgi.dm" -#include "code\modules\mob\living\simple_animal\friendly\corgi_powers.dm" -#include "code\modules\mob\living\simple_animal\friendly\crab.dm" -#include "code\modules\mob\living\simple_animal\friendly\deer.dm" -#include "code\modules\mob\living\simple_animal\friendly\diona.dm" -#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" -#include "code\modules\mob\living\simple_animal\friendly\fox.dm" -#include "code\modules\mob\living\simple_animal\friendly\lizard.dm" -#include "code\modules\mob\living\simple_animal\friendly\mouse.dm" -#include "code\modules\mob\living\simple_animal\friendly\penguin.dm" -#include "code\modules\mob\living\simple_animal\friendly\pet.dm" -#include "code\modules\mob\living\simple_animal\friendly\pug.dm" -#include "code\modules\mob\living\simple_animal\friendly\slime.dm" -#include "code\modules\mob\living\simple_animal\friendly\sloth.dm" -#include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm" -#include "code\modules\mob\living\simple_animal\hostile\alien.dm" -#include "code\modules\mob\living\simple_animal\hostile\bat.dm" -#include "code\modules\mob\living\simple_animal\hostile\bear.dm" -#include "code\modules\mob\living\simple_animal\hostile\bees.dm" -#include "code\modules\mob\living\simple_animal\hostile\carp.dm" -#include "code\modules\mob\living\simple_animal\hostile\creature.dm" -#include "code\modules\mob\living\simple_animal\hostile\deathsquid.dm" -#include "code\modules\mob\living\simple_animal\hostile\faithless.dm" -#include "code\modules\mob\living\simple_animal\hostile\feral_cat.dm" -#include "code\modules\mob\living\simple_animal\hostile\floorcluwne.dm" -#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" -#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" -#include "code\modules\mob\living\simple_animal\hostile\hellhound.dm" -#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" -#include "code\modules\mob\living\simple_animal\hostile\hostile.dm" -#include "code\modules\mob\living\simple_animal\hostile\illusion.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle_animals.dm" -#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm" -#include "code\modules\mob\living\simple_animal\hostile\mimic.dm" -#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" -#include "code\modules\mob\living\simple_animal\hostile\netherworld.dm" -#include "code\modules\mob\living\simple_animal\hostile\pirate.dm" -#include "code\modules\mob\living\simple_animal\hostile\russian.dm" -#include "code\modules\mob\living\simple_animal\hostile\spaceworms.dm" -#include "code\modules\mob\living\simple_animal\hostile\statue.dm" -#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" -#include "code\modules\mob\living\simple_animal\hostile\tree.dm" -#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm" -#include "code\modules\mob\living\simple_animal\hostile\winter_mobs.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\basilisk.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\goldgrub.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\goliath.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\gutlunch.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\hivelord.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\mining.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining\necropolis_tendril.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\fish.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\kangaroo.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\pet.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\undead.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\__defines.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\actions.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\black.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\brown.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\chem.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\empress.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\ghost.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\gray.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\green.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\hive.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\mother.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\prince.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\princess.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\purple.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\queen.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\red.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\reproduction.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_ai.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_spiders.dm" -#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\white.dm" -#include "code\modules\mob\new_player\login.dm" -#include "code\modules\mob\new_player\logout.dm" -#include "code\modules\mob\new_player\new_player.dm" -#include "code\modules\mob\new_player\poll.dm" -#include "code\modules\mob\new_player\preferences_setup.dm" -#include "code\modules\mob\new_player\sprite_accessories\sprite_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories\diona\diona_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\drask\drask_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\grey\grey_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\human\human_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\human\human_facial_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\human\human_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_face.dm" -#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_head_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_optics.dm" -#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_head_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_head_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\nucleation\nucleation_face.dm" -#include "code\modules\mob\new_player\sprite_accessories\skrell\skrell_face.dm" -#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_facial_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_head_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_head_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_alt_heads.dm" -#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_facial_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_head_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_head_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\vox\vox_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\vox\vox_facial_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\vox\vox_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\vox\vox_tail_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_body_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_facial_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_hair.dm" -#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_head_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_head_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_tail_markings.dm" -#include "code\modules\mob\new_player\sprite_accessories\wryn\wryn_face.dm" -#include "code\modules\modular_computers\laptop_vendor.dm" -#include "code\modules\modular_computers\computers\item\computer.dm" -#include "code\modules\modular_computers\computers\item\computer_components.dm" -#include "code\modules\modular_computers\computers\item\computer_damage.dm" -#include "code\modules\modular_computers\computers\item\computer_power.dm" -#include "code\modules\modular_computers\computers\item\computer_ui.dm" -#include "code\modules\modular_computers\computers\item\laptop.dm" -#include "code\modules\modular_computers\computers\item\laptop_presets.dm" -#include "code\modules\modular_computers\computers\item\processor.dm" -#include "code\modules\modular_computers\computers\item\tablet.dm" -#include "code\modules\modular_computers\computers\item\tablet_presets.dm" -#include "code\modules\modular_computers\computers\machinery\console_presets.dm" -#include "code\modules\modular_computers\computers\machinery\modular_computer.dm" -#include "code\modules\modular_computers\computers\machinery\modular_console.dm" -#include "code\modules\modular_computers\file_system\computer_file.dm" -#include "code\modules\modular_computers\file_system\data.dm" -#include "code\modules\modular_computers\file_system\program.dm" -#include "code\modules\modular_computers\file_system\program_events.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" -#include "code\modules\modular_computers\file_system\programs\command\card.dm" -#include "code\modules\modular_computers\file_system\programs\command\comms.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\alarm.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\power_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\sm_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\generic\configurator.dm" -#include "code\modules\modular_computers\file_system\programs\generic\file_browser.dm" -#include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm" -#include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" -#include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm" -#include "code\modules\modular_computers\file_system\programs\research\airestorer.dm" -#include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm" -#include "code\modules\modular_computers\hardware\_hardware.dm" -#include "code\modules\modular_computers\hardware\ai_slot.dm" -#include "code\modules\modular_computers\hardware\battery_module.dm" -#include "code\modules\modular_computers\hardware\card_slot.dm" -#include "code\modules\modular_computers\hardware\CPU.dm" -#include "code\modules\modular_computers\hardware\hard_drive.dm" -#include "code\modules\modular_computers\hardware\network_card.dm" -#include "code\modules\modular_computers\hardware\portable_disk.dm" -#include "code\modules\modular_computers\hardware\printer.dm" -#include "code\modules\modular_computers\hardware\recharger.dm" -#include "code\modules\modular_computers\NTNet\NTNet.dm" -#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" -#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" -#include "code\modules\nano\nanoexternal.dm" -#include "code\modules\nano\nanomapgen.dm" -#include "code\modules\nano\nanoui.dm" -#include "code\modules\nano\subsystem.dm" -#include "code\modules\nano\interaction\admin.dm" -#include "code\modules\nano\interaction\base.dm" -#include "code\modules\nano\interaction\conscious.dm" -#include "code\modules\nano\interaction\contained.dm" -#include "code\modules\nano\interaction\default.dm" -#include "code\modules\nano\interaction\ghost.dm" -#include "code\modules\nano\interaction\inventory.dm" -#include "code\modules\nano\interaction\inventory_deep.dm" -#include "code\modules\nano\interaction\not_incapacitated.dm" -#include "code\modules\nano\interaction\physical.dm" -#include "code\modules\nano\interaction\self.dm" -#include "code\modules\nano\interaction\zlevel.dm" -#include "code\modules\nano\modules\alarm_monitor.dm" -#include "code\modules\nano\modules\atmos_control.dm" -#include "code\modules\nano\modules\crew_monitor.dm" -#include "code\modules\nano\modules\ert_manager.dm" -#include "code\modules\nano\modules\human_appearance.dm" -#include "code\modules\nano\modules\law_manager.dm" -#include "code\modules\nano\modules\nano_module.dm" -#include "code\modules\nano\modules\power_monitor.dm" -#include "code\modules\ninja\energy_katana.dm" -#include "code\modules\ninja\suit\gloves.dm" -#include "code\modules\ninja\suit\head.dm" -#include "code\modules\ninja\suit\mask.dm" -#include "code\modules\ninja\suit\shoes.dm" -#include "code\modules\ninja\suit\suit.dm" -#include "code\modules\ninja\suit\suit_initialisation.dm" -#include "code\modules\paperwork\carbonpaper.dm" -#include "code\modules\paperwork\clipboard.dm" -#include "code\modules\paperwork\contract.dm" -#include "code\modules\paperwork\fax.dm" -#include "code\modules\paperwork\faxmachine.dm" -#include "code\modules\paperwork\filingcabinet.dm" -#include "code\modules\paperwork\folders.dm" -#include "code\modules\paperwork\frames.dm" -#include "code\modules\paperwork\handlabeler.dm" -#include "code\modules\paperwork\paper.dm" -#include "code\modules\paperwork\paper_bundle.dm" -#include "code\modules\paperwork\paperbin.dm" -#include "code\modules\paperwork\paperplane.dm" -#include "code\modules\paperwork\pen.dm" -#include "code\modules\paperwork\photocopier.dm" -#include "code\modules\paperwork\photography.dm" -#include "code\modules\paperwork\silicon_photography.dm" -#include "code\modules\paperwork\stamps.dm" -#include "code\modules\pda\ai.dm" -#include "code\modules\pda\app.dm" -#include "code\modules\pda\cart.dm" -#include "code\modules\pda\cart_apps.dm" -#include "code\modules\pda\core_apps.dm" -#include "code\modules\pda\messenger.dm" -#include "code\modules\pda\messenger_plugins.dm" -#include "code\modules\pda\mob_hunt_game_app.dm" -#include "code\modules\pda\PDA.dm" -#include "code\modules\pda\pdas.dm" -#include "code\modules\pda\radio.dm" -#include "code\modules\pda\utilities.dm" -#include "code\modules\persistence\persistence.dm" -#include "code\modules\power\apc.dm" -#include "code\modules\power\cable.dm" -#include "code\modules\power\cable_heavyduty.dm" -#include "code\modules\power\cable_logic.dm" -#include "code\modules\power\cell.dm" -#include "code\modules\power\generator.dm" -#include "code\modules\power\gravitygenerator.dm" -#include "code\modules\power\lighting.dm" -#include "code\modules\power\port_gen.dm" -#include "code\modules\power\power.dm" -#include "code\modules\power\powernet.dm" -#include "code\modules\power\smes.dm" -#include "code\modules\power\solar.dm" -#include "code\modules\power\terminal.dm" -#include "code\modules\power\tracker.dm" -#include "code\modules\power\treadmill.dm" -#include "code\modules\power\turbine.dm" -#include "code\modules\power\singularity\collector.dm" -#include "code\modules\power\singularity\containment_field.dm" -#include "code\modules\power\singularity\emitter.dm" -#include "code\modules\power\singularity\field_generator.dm" -#include "code\modules\power\singularity\generator.dm" -#include "code\modules\power\singularity\investigate.dm" -#include "code\modules\power\singularity\narsie.dm" -#include "code\modules\power\singularity\singularity.dm" -#include "code\modules\power\singularity\particle_accelerator\particle.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_chamber.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_power.dm" -#include "code\modules\power\supermatter\supermatter.dm" -#include "code\modules\power\tesla\coil.dm" -#include "code\modules\power\tesla\energy_ball.dm" -#include "code\modules\power\tesla\generator.dm" -#include "code\modules\procedural_mapping\mapGenerator.dm" -#include "code\modules\procedural_mapping\mapGeneratorModule.dm" -#include "code\modules\procedural_mapping\mapGeneratorReadme.dm" -#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm" -#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm" -#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm" -#include "code\modules\procedural_mapping\mapGenerators\nature.dm" -#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm" -#include "code\modules\projectiles\ammunition.dm" -#include "code\modules\projectiles\firing.dm" -#include "code\modules\projectiles\gun.dm" -#include "code\modules\projectiles\gun_attachments.dm" -#include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\ammunition\ammo_casings.dm" -#include "code\modules\projectiles\ammunition\boxes.dm" -#include "code\modules\projectiles\ammunition\energy.dm" -#include "code\modules\projectiles\ammunition\magazines.dm" -#include "code\modules\projectiles\ammunition\special.dm" -#include "code\modules\projectiles\guns\alien.dm" -#include "code\modules\projectiles\guns\dartgun.dm" -#include "code\modules\projectiles\guns\energy.dm" -#include "code\modules\projectiles\guns\grenade_launcher.dm" -#include "code\modules\projectiles\guns\magic.dm" -#include "code\modules\projectiles\guns\medbeam.dm" -#include "code\modules\projectiles\guns\mounted.dm" -#include "code\modules\projectiles\guns\projectile.dm" -#include "code\modules\projectiles\guns\rocket.dm" -#include "code\modules\projectiles\guns\syringe_gun.dm" -#include "code\modules\projectiles\guns\throw.dm" -#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm" -#include "code\modules\projectiles\guns\energy\laser.dm" -#include "code\modules\projectiles\guns\energy\nuclear.dm" -#include "code\modules\projectiles\guns\energy\pulse.dm" -#include "code\modules\projectiles\guns\energy\special.dm" -#include "code\modules\projectiles\guns\energy\stun.dm" -#include "code\modules\projectiles\guns\energy\telegun.dm" -#include "code\modules\projectiles\guns\magic\staff.dm" -#include "code\modules\projectiles\guns\magic\wand.dm" -#include "code\modules\projectiles\guns\misc\blastcannon.dm" -#include "code\modules\projectiles\guns\projectile\automatic.dm" -#include "code\modules\projectiles\guns\projectile\bow.dm" -#include "code\modules\projectiles\guns\projectile\launchers.dm" -#include "code\modules\projectiles\guns\projectile\pistol.dm" -#include "code\modules\projectiles\guns\projectile\revolver.dm" -#include "code\modules\projectiles\guns\projectile\saw.dm" -#include "code\modules\projectiles\guns\projectile\shotgun.dm" -#include "code\modules\projectiles\guns\projectile\sniper.dm" -#include "code\modules\projectiles\guns\projectile\toy.dm" -#include "code\modules\projectiles\guns\throw\crossbow.dm" -#include "code\modules\projectiles\guns\throw\pielauncher.dm" -#include "code\modules\projectiles\projectile\beams.dm" -#include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\energy.dm" -#include "code\modules\projectiles\projectile\force.dm" -#include "code\modules\projectiles\projectile\magic.dm" -#include "code\modules\projectiles\projectile\reusable.dm" -#include "code\modules\projectiles\projectile\special.dm" -#include "code\modules\reagents\chem_splash.dm" -#include "code\modules\reagents\reagent_containers.dm" -#include "code\modules\reagents\reagent_dispenser.dm" -#include "code\modules\reagents\chemistry\colors.dm" -#include "code\modules\reagents\chemistry\holder.dm" -#include "code\modules\reagents\chemistry\readme.dm" -#include "code\modules\reagents\chemistry\reagents.dm" -#include "code\modules\reagents\chemistry\recipes.dm" -#include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm" -#include "code\modules\reagents\chemistry\machinery\chem_heater.dm" -#include "code\modules\reagents\chemistry\machinery\chem_master.dm" -#include "code\modules\reagents\chemistry\machinery\pandemic.dm" -#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" -#include "code\modules\reagents\chemistry\reagents\admin.dm" -#include "code\modules\reagents\chemistry\reagents\alcohol.dm" -#include "code\modules\reagents\chemistry\reagents\blob.dm" -#include "code\modules\reagents\chemistry\reagents\disease.dm" -#include "code\modules\reagents\chemistry\reagents\drink_base.dm" -#include "code\modules\reagents\chemistry\reagents\drink_cold.dm" -#include "code\modules\reagents\chemistry\reagents\drinks.dm" -#include "code\modules\reagents\chemistry\reagents\drugs.dm" -#include "code\modules\reagents\chemistry\reagents\food.dm" -#include "code\modules\reagents\chemistry\reagents\medicine.dm" -#include "code\modules\reagents\chemistry\reagents\misc.dm" -#include "code\modules\reagents\chemistry\reagents\paint.dm" -#include "code\modules\reagents\chemistry\reagents\paradise_pop.dm" -#include "code\modules\reagents\chemistry\reagents\pyrotechnic.dm" -#include "code\modules\reagents\chemistry\reagents\toxins.dm" -#include "code\modules\reagents\chemistry\reagents\water.dm" -#include "code\modules\reagents\chemistry\recipes\drinks.dm" -#include "code\modules\reagents\chemistry\recipes\drugs.dm" -#include "code\modules\reagents\chemistry\recipes\food.dm" -#include "code\modules\reagents\chemistry\recipes\medicine.dm" -#include "code\modules\reagents\chemistry\recipes\others.dm" -#include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" -#include "code\modules\reagents\chemistry\recipes\slime_extracts.dm" -#include "code\modules\reagents\chemistry\recipes\toxins.dm" -#include "code\modules\reagents\reagent_containers\borghydro.dm" -#include "code\modules\reagents\reagent_containers\bottle.dm" -#include "code\modules\reagents\reagent_containers\dropper.dm" -#include "code\modules\reagents\reagent_containers\glass_containers.dm" -#include "code\modules\reagents\reagent_containers\hypospray.dm" -#include "code\modules\reagents\reagent_containers\iv_bag.dm" -#include "code\modules\reagents\reagent_containers\patch.dm" -#include "code\modules\reagents\reagent_containers\pill.dm" -#include "code\modules\reagents\reagent_containers\spray.dm" -#include "code\modules\reagents\reagent_containers\syringes.dm" -#include "code\modules\recycling\belt-placer.dm" -#include "code\modules\recycling\conveyor2.dm" -#include "code\modules\recycling\disposal-construction.dm" -#include "code\modules\recycling\disposal.dm" -#include "code\modules\recycling\sortingmachinery.dm" -#include "code\modules\research\circuitprinter.dm" -#include "code\modules\research\designs.dm" -#include "code\modules\research\destructive_analyzer.dm" -#include "code\modules\research\experimentor.dm" -#include "code\modules\research\message_server.dm" -#include "code\modules\research\protolathe.dm" -#include "code\modules\research\rd-readme.dm" -#include "code\modules\research\rdconsole.dm" -#include "code\modules\research\rdmachines.dm" -#include "code\modules\research\research.dm" -#include "code\modules\research\server.dm" -#include "code\modules\research\designs\AI_module_designs.dm" -#include "code\modules\research\designs\autolathe_designs.dm" -#include "code\modules\research\designs\biogenerator_designs.dm" -#include "code\modules\research\designs\bluespace_designs.dm" -#include "code\modules\research\designs\comp_board_designs.dm" -#include "code\modules\research\designs\computer_part_designs.dm" -#include "code\modules\research\designs\equipment_designs.dm" -#include "code\modules\research\designs\janitorial_designs.dm" -#include "code\modules\research\designs\machine_designs.dm" -#include "code\modules\research\designs\mecha_designs.dm" -#include "code\modules\research\designs\mechfabricator_designs.dm" -#include "code\modules\research\designs\medical_designs.dm" -#include "code\modules\research\designs\mining_designs.dm" -#include "code\modules\research\designs\misc_designs.dm" -#include "code\modules\research\designs\power_designs.dm" -#include "code\modules\research\designs\smelting_designs.dm" -#include "code\modules\research\designs\spacepod_designs.dm" -#include "code\modules\research\designs\stock_parts_designs.dm" -#include "code\modules\research\designs\telecomms_designs.dm" -#include "code\modules\research\designs\weapon_designs.dm" -#include "code\modules\research\xenobiology\xenobio_camera.dm" -#include "code\modules\research\xenobiology\xenobiology.dm" -#include "code\modules\response_team\ert.dm" -#include "code\modules\response_team\ert_outfits.dm" -#include "code\modules\ruins\ruin_areas.dm" -#include "code\modules\ruins\lavalandruin_code\animal_hospital.dm" -#include "code\modules\ruins\lavalandruin_code\ash_walker_den.dm" -#include "code\modules\ruins\lavalandruin_code\dead_ratvar.dm" -#include "code\modules\ruins\lavalandruin_code\fountain_hall.dm" -#include "code\modules\ruins\lavalandruin_code\hermit.dm" -#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm" -#include "code\modules\ruins\lavalandruin_code\puzzle.dm" -#include "code\modules\ruins\lavalandruin_code\seed_vault.dm" -#include "code\modules\ruins\lavalandruin_code\sin_ruins.dm" -#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm" -#include "code\modules\ruins\objects_and_mobs\gym.dm" -#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm" -#include "code\modules\security_levels\keycard authentication.dm" -#include "code\modules\security_levels\security levels.dm" -#include "code\modules\shuttle\assault_pod.dm" -#include "code\modules\shuttle\emergency.dm" -#include "code\modules\shuttle\ert.dm" -#include "code\modules\shuttle\navigation_computer.dm" -#include "code\modules\shuttle\on_move.dm" -#include "code\modules\shuttle\ripple.dm" -#include "code\modules\shuttle\shuttle.dm" -#include "code\modules\shuttle\shuttle_manipulator.dm" -#include "code\modules\shuttle\shuttle_rotate.dm" -#include "code\modules\shuttle\supply.dm" -#include "code\modules\shuttle\syndicate.dm" -#include "code\modules\shuttle\vox.dm" -#include "code\modules\space_management\heap_space_level.dm" -#include "code\modules\space_management\level_check.dm" -#include "code\modules\space_management\level_traits.dm" -#include "code\modules\space_management\space_chunk.dm" -#include "code\modules\space_management\space_level.dm" -#include "code\modules\space_management\space_transition.dm" -#include "code\modules\space_management\zlevel_manager.dm" -#include "code\modules\spacepods\construction.dm" -#include "code\modules\spacepods\equipment.dm" -#include "code\modules\spacepods\lock_buster.dm" -#include "code\modules\spacepods\parts.dm" -#include "code\modules\spacepods\spacepod.dm" -#include "code\modules\station_goals\bsa.dm" -#include "code\modules\station_goals\dna_vault.dm" -#include "code\modules\station_goals\shield.dm" -#include "code\modules\station_goals\station_goal.dm" -#include "code\modules\store\items.dm" -#include "code\modules\store\store.dm" -#include "code\modules\surgery\bones.dm" -#include "code\modules\surgery\cavity_implant.dm" -#include "code\modules\surgery\dental_implant.dm" -#include "code\modules\surgery\encased.dm" -#include "code\modules\surgery\generic.dm" -#include "code\modules\surgery\helpers.dm" -#include "code\modules\surgery\implant_removal.dm" -#include "code\modules\surgery\limb_augmentation.dm" -#include "code\modules\surgery\limb_reattach.dm" -#include "code\modules\surgery\organs_internal.dm" -#include "code\modules\surgery\other.dm" -#include "code\modules\surgery\plastic_surgery.dm" -#include "code\modules\surgery\remove_embedded_object.dm" -#include "code\modules\surgery\rig_removal.dm" -#include "code\modules\surgery\robotics.dm" -#include "code\modules\surgery\slime.dm" -#include "code\modules\surgery\surgery.dm" -#include "code\modules\surgery\tools.dm" -#include "code\modules\surgery\organs\augments_arms.dm" -#include "code\modules\surgery\organs\augments_eyes.dm" -#include "code\modules\surgery\organs\augments_internal.dm" -#include "code\modules\surgery\organs\autoimplanter.dm" -#include "code\modules\surgery\organs\blood.dm" -#include "code\modules\surgery\organs\body_egg.dm" -#include "code\modules\surgery\organs\ears.dm" -#include "code\modules\surgery\organs\eyes.dm" -#include "code\modules\surgery\organs\heart.dm" -#include "code\modules\surgery\organs\helpers.dm" -#include "code\modules\surgery\organs\kidneys.dm" -#include "code\modules\surgery\organs\liver.dm" -#include "code\modules\surgery\organs\lungs.dm" -#include "code\modules\surgery\organs\mmi_holder.dm" -#include "code\modules\surgery\organs\organ.dm" -#include "code\modules\surgery\organs\organ_external.dm" -#include "code\modules\surgery\organs\organ_icon.dm" -#include "code\modules\surgery\organs\organ_internal.dm" -#include "code\modules\surgery\organs\pain.dm" -#include "code\modules\surgery\organs\parasites.dm" -#include "code\modules\surgery\organs\robolimbs.dm" -#include "code\modules\surgery\organs\skeleton.dm" -#include "code\modules\surgery\organs\vocal_cords.dm" -#include "code\modules\surgery\organs\subtypes\abductor.dm" -#include "code\modules\surgery\organs\subtypes\diona.dm" -#include "code\modules\surgery\organs\subtypes\drask.dm" -#include "code\modules\surgery\organs\subtypes\grey.dm" -#include "code\modules\surgery\organs\subtypes\kidan.dm" -#include "code\modules\surgery\organs\subtypes\machine.dm" -#include "code\modules\surgery\organs\subtypes\nucleation.dm" -#include "code\modules\surgery\organs\subtypes\plasmaman.dm" -#include "code\modules\surgery\organs\subtypes\shadow.dm" -#include "code\modules\surgery\organs\subtypes\skrell.dm" -#include "code\modules\surgery\organs\subtypes\standard.dm" -#include "code\modules\surgery\organs\subtypes\tajaran.dm" -#include "code\modules\surgery\organs\subtypes\unathi.dm" -#include "code\modules\surgery\organs\subtypes\unbreakable.dm" -#include "code\modules\surgery\organs\subtypes\vox.dm" -#include "code\modules\surgery\organs\subtypes\vulpkanin.dm" -#include "code\modules\surgery\organs\subtypes\wryn.dm" -#include "code\modules\surgery\organs\subtypes\xenos.dm" -#include "code\modules\telesci\bscrystal.dm" -#include "code\modules\telesci\gps.dm" -#include "code\modules\telesci\telepad.dm" -#include "code\modules\telesci\telesci_computer.dm" -#include "code\modules\tooltip\tooltip.dm" -#include "code\modules\tram\tram.dm" -#include "code\modules\tram\tram_control_pad.dm" -#include "code\modules\tram\tram_floor.dm" -#include "code\modules\tram\tram_rail.dm" -#include "code\modules\tram\tram_wall.dm" -#include "code\modules\vehicle\ambulance.dm" -#include "code\modules\vehicle\atv.dm" -#include "code\modules\vehicle\janicart.dm" -#include "code\modules\vehicle\motorcycle.dm" -#include "code\modules\vehicle\secway.dm" -#include "code\modules\vehicle\snowmobile.dm" -#include "code\modules\vehicle\speedbike.dm" -#include "code\modules\vehicle\sportscar.dm" -#include "code\modules\vehicle\vehicle.dm" -#include "code\modules\vr\vr_avatar.dm" -#include "code\modules\vr\vr_controller.dm" -#include "code\modules\vr\vr_goggles.dm" -#include "code\modules\vr\vr_outfits.dm" -#include "goon\code\datums\browserOutput.dm" -#include "interface\interface.dm" -#include "interface\skin.dmf" -// END_INCLUDE +// DM Environment file for paradise.dme. +// All manual changes should be made outside the BEGIN_ and END_ blocks. + // New source code should be placed in .dm files: choose File/New --> Code File. +// BEGIN_INTERNALS +// END_INTERNALS +// BEGIN_FILE_DIR +#define FILE_DIR . +// END_FILE_DIR +// BEGIN_PREFERENCES +#define DEBUG +// END_PREFERENCES +// BEGIN_INCLUDE +#include "_maps\__MAP_DEFINES.dm" +#include "_maps\cyberiad.dm" +#include "code\_compile_options.dm" +#include "code\hub.dm" +#include "code\world.dm" +#include "code\__DEFINES\_globals.dm" +#include "code\__DEFINES\_readme.dm" +#include "code\__DEFINES\_tick.dm" +#include "code\__DEFINES\admin.dm" +#include "code\__DEFINES\antagonists.dm" +#include "code\__DEFINES\atmospherics.dm" +#include "code\__DEFINES\bots.dm" +#include "code\__DEFINES\callbacks.dm" +#include "code\__DEFINES\clothing.dm" +#include "code\__DEFINES\colors.dm" +#include "code\__DEFINES\combat.dm" +#include "code\__DEFINES\components.dm" +#include "code\__DEFINES\construction.dm" +#include "code\__DEFINES\contracts.dm" +#include "code\__DEFINES\crafting.dm" +#include "code\__DEFINES\error_handler.dm" +#include "code\__DEFINES\flags.dm" +#include "code\__DEFINES\game.dm" +#include "code\__DEFINES\gamemode.dm" +#include "code\__DEFINES\genetics.dm" +#include "code\__DEFINES\hud.dm" +#include "code\__DEFINES\hydroponics.dm" +#include "code\__DEFINES\inventory.dm" +#include "code\__DEFINES\is_helpers.dm" +#include "code\__DEFINES\language.dm" +#include "code\__DEFINES\layers.dm" +#include "code\__DEFINES\lighting.dm" +#include "code\__DEFINES\machines.dm" +#include "code\__DEFINES\math.dm" +#include "code\__DEFINES\MC.dm" +#include "code\__DEFINES\medal.dm" +#include "code\__DEFINES\misc.dm" +#include "code\__DEFINES\mobs.dm" +#include "code\__DEFINES\move_force.dm" +#include "code\__DEFINES\pda.dm" +#include "code\__DEFINES\pipes.dm" +#include "code\__DEFINES\preferences.dm" +#include "code\__DEFINES\qdel.dm" +#include "code\__DEFINES\radio.dm" +#include "code\__DEFINES\reagents.dm" +#include "code\__DEFINES\role_preferences.dm" +#include "code\__DEFINES\rolebans.dm" +#include "code\__DEFINES\shuttle.dm" +#include "code\__DEFINES\sight.dm" +#include "code\__DEFINES\sound.dm" +#include "code\__DEFINES\stat.dm" +#include "code\__DEFINES\station_goals.dm" +#include "code\__DEFINES\status_effects.dm" +#include "code\__DEFINES\subsystems.dm" +#include "code\__DEFINES\typeids.dm" +#include "code\__DEFINES\vv.dm" +#include "code\__DEFINES\zlevel.dm" +#include "code\__HELPERS\_logging.dm" +#include "code\__HELPERS\_string_lists.dm" +#include "code\__HELPERS\AnimationLibrary.dm" +#include "code\__HELPERS\cmp.dm" +#include "code\__HELPERS\constants.dm" +#include "code\__HELPERS\experimental.dm" +#include "code\__HELPERS\files.dm" +#include "code\__HELPERS\game.dm" +#include "code\__HELPERS\global_lists.dm" +#include "code\__HELPERS\icon_smoothing.dm" +#include "code\__HELPERS\icons.dm" +#include "code\__HELPERS\lists.dm" +#include "code\__HELPERS\maths.dm" +#include "code\__HELPERS\matrices.dm" +#include "code\__HELPERS\mobs.dm" +#include "code\__HELPERS\names.dm" +#include "code\__HELPERS\pronouns.dm" +#include "code\__HELPERS\qdel.dm" +#include "code\__HELPERS\sanitize_values.dm" +#include "code\__HELPERS\text.dm" +#include "code\__HELPERS\time.dm" +#include "code\__HELPERS\type2type.dm" +#include "code\__HELPERS\unique_ids.dm" +#include "code\__HELPERS\unsorted.dm" +#include "code\__HELPERS\sorts\__main.dm" +#include "code\__HELPERS\sorts\InsertSort.dm" +#include "code\__HELPERS\sorts\MergeSort.dm" +#include "code\__HELPERS\sorts\TimSort.dm" +#include "code\_DATASTRUCTURES\heap.dm" +#include "code\_DATASTRUCTURES\stacks.dm" +#include "code\_globalvars\configuration.dm" +#include "code\_globalvars\database.dm" +#include "code\_globalvars\game_modes.dm" +#include "code\_globalvars\genetics.dm" +#include "code\_globalvars\logging.dm" +#include "code\_globalvars\mapping.dm" +#include "code\_globalvars\misc.dm" +#include "code\_globalvars\unused.dm" +#include "code\_globalvars\lists\flavor_misc.dm" +#include "code\_globalvars\lists\fortunes.dm" +#include "code\_globalvars\lists\misc.dm" +#include "code\_globalvars\lists\mobs.dm" +#include "code\_globalvars\lists\names.dm" +#include "code\_globalvars\lists\objects.dm" +#include "code\_globalvars\lists\reagents.dm" +#include "code\_globalvars\lists\typecache.dm" +#include "code\_onclick\adjacent.dm" +#include "code\_onclick\ai.dm" +#include "code\_onclick\click.dm" +#include "code\_onclick\click_override.dm" +#include "code\_onclick\cyborg.dm" +#include "code\_onclick\drag_drop.dm" +#include "code\_onclick\item_attack.dm" +#include "code\_onclick\observer.dm" +#include "code\_onclick\other_mobs.dm" +#include "code\_onclick\overmind.dm" +#include "code\_onclick\rig.dm" +#include "code\_onclick\telekinesis.dm" +#include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\action_button.dm" +#include "code\_onclick\hud\ai.dm" +#include "code\_onclick\hud\alert.dm" +#include "code\_onclick\hud\alien.dm" +#include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\blob_overmind.dm" +#include "code\_onclick\hud\bot.dm" +#include "code\_onclick\hud\constructs.dm" +#include "code\_onclick\hud\devil.dm" +#include "code\_onclick\hud\fullscreen.dm" +#include "code\_onclick\hud\ghost.dm" +#include "code\_onclick\hud\guardian.dm" +#include "code\_onclick\hud\hud.dm" +#include "code\_onclick\hud\human.dm" +#include "code\_onclick\hud\monkey.dm" +#include "code\_onclick\hud\movable_screen_objects.dm" +#include "code\_onclick\hud\other_mobs.dm" +#include "code\_onclick\hud\picture_in_picture.dm" +#include "code\_onclick\hud\plane_master.dm" +#include "code\_onclick\hud\radial.dm" +#include "code\_onclick\hud\robot.dm" +#include "code\_onclick\hud\screen_objects.dm" +#include "code\_onclick\hud\swarmer.dm" +#include "code\ATMOSPHERICS\atmospherics.dm" +#include "code\ATMOSPHERICS\datum_icon_manager.dm" +#include "code\ATMOSPHERICS\datum_pipeline.dm" +#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm" +#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" +#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" +#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" +#include "code\ATMOSPHERICS\components\binary_devices\pump.dm" +#include "code\ATMOSPHERICS\components\binary_devices\valve.dm" +#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" +#include "code\ATMOSPHERICS\components\omni_devices\_omni_extras.dm" +#include "code\ATMOSPHERICS\components\omni_devices\filter.dm" +#include "code\ATMOSPHERICS\components\omni_devices\mixer.dm" +#include "code\ATMOSPHERICS\components\omni_devices\omni_base.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\mixer.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\trinary_base.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\tvalve.dm" +#include "code\ATMOSPHERICS\components\unary_devices\cold_sink.dm" +#include "code\ATMOSPHERICS\components\unary_devices\generator_input.dm" +#include "code\ATMOSPHERICS\components\unary_devices\heat_exchanger.dm" +#include "code\ATMOSPHERICS\components\unary_devices\heat_source.dm" +#include "code\ATMOSPHERICS\components\unary_devices\outlet_injector.dm" +#include "code\ATMOSPHERICS\components\unary_devices\oxygen_generator.dm" +#include "code\ATMOSPHERICS\components\unary_devices\passive_vent.dm" +#include "code\ATMOSPHERICS\components\unary_devices\portables_connector.dm" +#include "code\ATMOSPHERICS\components\unary_devices\tank.dm" +#include "code\ATMOSPHERICS\components\unary_devices\thermal_plate.dm" +#include "code\ATMOSPHERICS\components\unary_devices\unary_base.dm" +#include "code\ATMOSPHERICS\components\unary_devices\vent_pump.dm" +#include "code\ATMOSPHERICS\components\unary_devices\vent_scrubber.dm" +#include "code\ATMOSPHERICS\pipes\cap.dm" +#include "code\ATMOSPHERICS\pipes\manifold.dm" +#include "code\ATMOSPHERICS\pipes\manifold4w.dm" +#include "code\ATMOSPHERICS\pipes\pipe.dm" +#include "code\ATMOSPHERICS\pipes\simple\pipe_simple.dm" +#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_he.dm" +#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_hidden.dm" +#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_insulated.dm" +#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_visible.dm" +#include "code\controllers\configuration.dm" +#include "code\controllers\controller.dm" +#include "code\controllers\failsafe.dm" +#include "code\controllers\globals.dm" +#include "code\controllers\hooks-defs.dm" +#include "code\controllers\hooks.dm" +#include "code\controllers\master.dm" +#include "code\controllers\subsystem.dm" +#include "code\controllers\verbs.dm" +#include "code\controllers\subsystem\air.dm" +#include "code\controllers\subsystem\alarm.dm" +#include "code\controllers\subsystem\assets.dm" +#include "code\controllers\subsystem\atoms.dm" +#include "code\controllers\subsystem\events.dm" +#include "code\controllers\subsystem\fires.dm" +#include "code\controllers\subsystem\garbage.dm" +#include "code\controllers\subsystem\holiday.dm" +#include "code\controllers\subsystem\icon_smooth.dm" +#include "code\controllers\subsystem\idlenpcpool.dm" +#include "code\controllers\subsystem\input.dm" +#include "code\controllers\subsystem\ipintel.dm" +#include "code\controllers\subsystem\jobs.dm" +#include "code\controllers\subsystem\lighting.dm" +#include "code\controllers\subsystem\machinery.dm" +#include "code\controllers\subsystem\mapping.dm" +#include "code\controllers\subsystem\medals.dm" +#include "code\controllers\subsystem\mobs.dm" +#include "code\controllers\subsystem\nano_mob_hunter.dm" +#include "code\controllers\subsystem\nanoui.dm" +#include "code\controllers\subsystem\nightshift.dm" +#include "code\controllers\subsystem\npcpool.dm" +#include "code\controllers\subsystem\overlays.dm" +#include "code\controllers\subsystem\radio.dm" +#include "code\controllers\subsystem\shuttles.dm" +#include "code\controllers\subsystem\spacedrift.dm" +#include "code\controllers\subsystem\sun.dm" +#include "code\controllers\subsystem\throwing.dm" +#include "code\controllers\subsystem\ticker.dm" +#include "code\controllers\subsystem\timer.dm" +#include "code\controllers\subsystem\vote.dm" +#include "code\controllers\subsystem\weather.dm" +#include "code\controllers\subsystem\processing\fastprocess.dm" +#include "code\controllers\subsystem\processing\obj.dm" +#include "code\controllers\subsystem\processing\processing.dm" +#include "code\controllers\subsystem\tickets\mentor_tickets.dm" +#include "code\controllers\subsystem\tickets\tickets.dm" +#include "code\datums\action.dm" +#include "code\datums\ai_law_sets.dm" +#include "code\datums\ai_laws.dm" +#include "code\datums\beam.dm" +#include "code\datums\browser.dm" +#include "code\datums\callback.dm" +#include "code\datums\click_intercept.dm" +#include "code\datums\datacore.dm" +#include "code\datums\datum.dm" +#include "code\datums\datumvars.dm" +#include "code\datums\gas_mixture.dm" +#include "code\datums\holocall.dm" +#include "code\datums\hud.dm" +#include "code\datums\mind.dm" +#include "code\datums\mixed.dm" +#include "code\datums\mutable_appearance.dm" +#include "code\datums\periodic_news.dm" +#include "code\datums\pipe_datums.dm" +#include "code\datums\progressbar.dm" +#include "code\datums\radio.dm" +#include "code\datums\recipe.dm" +#include "code\datums\ruins.dm" +#include "code\datums\shuttles.dm" +#include "code\datums\soullink.dm" +#include "code\datums\spawners_menu.dm" +#include "code\datums\spell.dm" +#include "code\datums\statclick.dm" +#include "code\datums\supplypacks.dm" +#include "code\datums\uplink_item.dm" +#include "code\datums\vision_override.dm" +#include "code\datums\vr.dm" +#include "code\datums\cache\air_alarm.dm" +#include "code\datums\cache\apc.dm" +#include "code\datums\cache\cache.dm" +#include "code\datums\cache\crew.dm" +#include "code\datums\cache\powermonitor.dm" +#include "code\datums\components\_component.dm" +#include "code\datums\components\decal.dm" +#include "code\datums\components\ducttape.dm" +#include "code\datums\components\jestosterone.dm" +#include "code\datums\components\material_container.dm" +#include "code\datums\components\squeak.dm" +#include "code\datums\diseases\_disease.dm" +#include "code\datums\diseases\_MobProcs.dm" +#include "code\datums\diseases\anxiety.dm" +#include "code\datums\diseases\appendicitis.dm" +#include "code\datums\diseases\beesease.dm" +#include "code\datums\diseases\berserker.dm" +#include "code\datums\diseases\brainrot.dm" +#include "code\datums\diseases\cold.dm" +#include "code\datums\diseases\cold9.dm" +#include "code\datums\diseases\critical.dm" +#include "code\datums\diseases\fake_gbs.dm" +#include "code\datums\diseases\flu.dm" +#include "code\datums\diseases\fluspanish.dm" +#include "code\datums\diseases\food_poisoning.dm" +#include "code\datums\diseases\gbs.dm" +#include "code\datums\diseases\kingstons.dm" +#include "code\datums\diseases\kuru.dm" +#include "code\datums\diseases\lycancoughy.dm" +#include "code\datums\diseases\magnitis.dm" +#include "code\datums\diseases\pierrot_throat.dm" +#include "code\datums\diseases\retrovirus.dm" +#include "code\datums\diseases\rhumba_beat.dm" +#include "code\datums\diseases\transformation.dm" +#include "code\datums\diseases\tuberculosis.dm" +#include "code\datums\diseases\vampire.dm" +#include "code\datums\diseases\wizarditis.dm" +#include "code\datums\diseases\advance\advance.dm" +#include "code\datums\diseases\advance\presets.dm" +#include "code\datums\diseases\advance\symptoms\beard.dm" +#include "code\datums\diseases\advance\symptoms\choking.dm" +#include "code\datums\diseases\advance\symptoms\confusion.dm" +#include "code\datums\diseases\advance\symptoms\cough.dm" +#include "code\datums\diseases\advance\symptoms\damage_converter.dm" +#include "code\datums\diseases\advance\symptoms\deafness.dm" +#include "code\datums\diseases\advance\symptoms\dizzy.dm" +#include "code\datums\diseases\advance\symptoms\fever.dm" +#include "code\datums\diseases\advance\symptoms\fire.dm" +#include "code\datums\diseases\advance\symptoms\flesh_eating.dm" +#include "code\datums\diseases\advance\symptoms\hallucigen.dm" +#include "code\datums\diseases\advance\symptoms\headache.dm" +#include "code\datums\diseases\advance\symptoms\heal.dm" +#include "code\datums\diseases\advance\symptoms\itching.dm" +#include "code\datums\diseases\advance\symptoms\oxygen.dm" +#include "code\datums\diseases\advance\symptoms\sensory.dm" +#include "code\datums\diseases\advance\symptoms\shedding.dm" +#include "code\datums\diseases\advance\symptoms\shivering.dm" +#include "code\datums\diseases\advance\symptoms\skin.dm" +#include "code\datums\diseases\advance\symptoms\sneeze.dm" +#include "code\datums\diseases\advance\symptoms\symptoms.dm" +#include "code\datums\diseases\advance\symptoms\viral.dm" +#include "code\datums\diseases\advance\symptoms\vision.dm" +#include "code\datums\diseases\advance\symptoms\voice_change.dm" +#include "code\datums\diseases\advance\symptoms\vomit.dm" +#include "code\datums\diseases\advance\symptoms\weakness.dm" +#include "code\datums\diseases\advance\symptoms\weight.dm" +#include "code\datums\diseases\advance\symptoms\youth.dm" +#include "code\datums\helper_datums\construction_datum.dm" +#include "code\datums\helper_datums\events.dm" +#include "code\datums\helper_datums\global_iterator.dm" +#include "code\datums\helper_datums\icon_snapshot.dm" +#include "code\datums\helper_datums\input.dm" +#include "code\datums\helper_datums\map_template.dm" +#include "code\datums\helper_datums\teleport.dm" +#include "code\datums\helper_datums\topic_input.dm" +#include "code\datums\looping_sounds\looping_sound.dm" +#include "code\datums\looping_sounds\machinery_sounds.dm" +#include "code\datums\looping_sounds\thermal_drill.dm" +#include "code\datums\looping_sounds\weather.dm" +#include "code\datums\outfits\outfit.dm" +#include "code\datums\outfits\outfit_admin.dm" +#include "code\datums\ruins\lavaland.dm" +#include "code\datums\ruins\space.dm" +#include "code\datums\spells\area_teleport.dm" +#include "code\datums\spells\bloodcrawl.dm" +#include "code\datums\spells\chaplain.dm" +#include "code\datums\spells\charge.dm" +#include "code\datums\spells\cluwne.dm" +#include "code\datums\spells\conjure.dm" +#include "code\datums\spells\conjure_item.dm" +#include "code\datums\spells\construct_spells.dm" +#include "code\datums\spells\devil.dm" +#include "code\datums\spells\devil_boons.dm" +#include "code\datums\spells\dumbfire.dm" +#include "code\datums\spells\emplosion.dm" +#include "code\datums\spells\ethereal_jaunt.dm" +#include "code\datums\spells\explosion.dm" +#include "code\datums\spells\fake_gib.dm" +#include "code\datums\spells\genetic.dm" +#include "code\datums\spells\horsemask.dm" +#include "code\datums\spells\infinite_guns.dm" +#include "code\datums\spells\inflict_handler.dm" +#include "code\datums\spells\knock.dm" +#include "code\datums\spells\lichdom.dm" +#include "code\datums\spells\lightning.dm" +#include "code\datums\spells\magnet.dm" +#include "code\datums\spells\mime.dm" +#include "code\datums\spells\mind_transfer.dm" +#include "code\datums\spells\night_vision.dm" +#include "code\datums\spells\projectile.dm" +#include "code\datums\spells\rathens.dm" +#include "code\datums\spells\rod_form.dm" +#include "code\datums\spells\shapeshift.dm" +#include "code\datums\spells\summonitem.dm" +#include "code\datums\spells\touch_attacks.dm" +#include "code\datums\spells\trigger.dm" +#include "code\datums\spells\turf_teleport.dm" +#include "code\datums\spells\wizard.dm" +#include "code\datums\status_effects\buffs.dm" +#include "code\datums\status_effects\debuffs.dm" +#include "code\datums\status_effects\neutral.dm" +#include "code\datums\status_effects\status_effect.dm" +#include "code\datums\vr\level.dm" +#include "code\datums\weather\weather.dm" +#include "code\datums\weather\weather_types\ash_storm.dm" +#include "code\datums\weather\weather_types\floor_is_lava.dm" +#include "code\datums\weather\weather_types\radiation_storm.dm" +#include "code\datums\weather\weather_types\snow_storm.dm" +#include "code\datums\wires\airlock.dm" +#include "code\datums\wires\alarm.dm" +#include "code\datums\wires\apc.dm" +#include "code\datums\wires\autolathe.dm" +#include "code\datums\wires\camera.dm" +#include "code\datums\wires\explosive.dm" +#include "code\datums\wires\mulebot.dm" +#include "code\datums\wires\nuclearbomb.dm" +#include "code\datums\wires\particle_accelerator.dm" +#include "code\datums\wires\radio.dm" +#include "code\datums\wires\robot.dm" +#include "code\datums\wires\smartfridge.dm" +#include "code\datums\wires\suitstorage.dm" +#include "code\datums\wires\syndicatebomb.dm" +#include "code\datums\wires\tesla_coil.dm" +#include "code\datums\wires\vending.dm" +#include "code\datums\wires\wires.dm" +#include "code\defines\vox_sounds.dm" +#include "code\defines\procs\admin.dm" +#include "code\defines\procs\announce.dm" +#include "code\defines\procs\AStar.dm" +#include "code\defines\procs\dbcore.dm" +#include "code\defines\procs\radio.dm" +#include "code\defines\procs\records.dm" +#include "code\defines\procs\statistics.dm" +#include "code\game\alternate_appearance.dm" +#include "code\game\asteroid.dm" +#include "code\game\atoms.dm" +#include "code\game\atoms_movable.dm" +#include "code\game\data_huds.dm" +#include "code\game\shuttle_engines.dm" +#include "code\game\sound.dm" +#include "code\game\world.dm" +#include "code\game\area\ai_monitored.dm" +#include "code\game\area\areas.dm" +#include "code\game\area\Dynamic areas.dm" +#include "code\game\area\Space Station 13 areas.dm" +#include "code\game\area\areas\depot-areas.dm" +#include "code\game\area\areas\mining.dm" +#include "code\game\area\areas\ruins\lavaland.dm" +#include "code\game\dna\dna2.dm" +#include "code\game\dna\dna2_domutcheck.dm" +#include "code\game\dna\dna2_helpers.dm" +#include "code\game\dna\dna_modifier.dm" +#include "code\game\dna\genes\disabilities.dm" +#include "code\game\dna\genes\gene.dm" +#include "code\game\dna\genes\goon_disabilities.dm" +#include "code\game\dna\genes\goon_powers.dm" +#include "code\game\dna\genes\monkey.dm" +#include "code\game\dna\genes\powers.dm" +#include "code\game\dna\genes\vg_disabilities.dm" +#include "code\game\dna\genes\vg_powers.dm" +#include "code\game\gamemodes\factions.dm" +#include "code\game\gamemodes\game_mode.dm" +#include "code\game\gamemodes\intercept_report.dm" +#include "code\game\gamemodes\objective.dm" +#include "code\game\gamemodes\scoreboard.dm" +#include "code\game\gamemodes\setupgame.dm" +#include "code\game\gamemodes\steal_items.dm" +#include "code\game\gamemodes\autotraitor\autotraitor.dm" +#include "code\game\gamemodes\blob\blob.dm" +#include "code\game\gamemodes\blob\blob_finish.dm" +#include "code\game\gamemodes\blob\blob_report.dm" +#include "code\game\gamemodes\blob\overmind.dm" +#include "code\game\gamemodes\blob\powers.dm" +#include "code\game\gamemodes\blob\theblob.dm" +#include "code\game\gamemodes\blob\blobs\blob_mobs.dm" +#include "code\game\gamemodes\blob\blobs\core.dm" +#include "code\game\gamemodes\blob\blobs\factory.dm" +#include "code\game\gamemodes\blob\blobs\node.dm" +#include "code\game\gamemodes\blob\blobs\resource.dm" +#include "code\game\gamemodes\blob\blobs\shield.dm" +#include "code\game\gamemodes\blob\blobs\storage.dm" +#include "code\game\gamemodes\changeling\changeling.dm" +#include "code\game\gamemodes\changeling\changeling_power.dm" +#include "code\game\gamemodes\changeling\evolution_menu.dm" +#include "code\game\gamemodes\changeling\traitor_chan.dm" +#include "code\game\gamemodes\changeling\powers\absorb.dm" +#include "code\game\gamemodes\changeling\powers\augmented_eyesight.dm" +#include "code\game\gamemodes\changeling\powers\biodegrade.dm" +#include "code\game\gamemodes\changeling\powers\chameleon_skin.dm" +#include "code\game\gamemodes\changeling\powers\digitalcamo.dm" +#include "code\game\gamemodes\changeling\powers\epinephrine.dm" +#include "code\game\gamemodes\changeling\powers\fakedeath.dm" +#include "code\game\gamemodes\changeling\powers\fleshmend.dm" +#include "code\game\gamemodes\changeling\powers\headcrab.dm" +#include "code\game\gamemodes\changeling\powers\hivemind.dm" +#include "code\game\gamemodes\changeling\powers\humanform.dm" +#include "code\game\gamemodes\changeling\powers\lesserform.dm" +#include "code\game\gamemodes\changeling\powers\linglink.dm" +#include "code\game\gamemodes\changeling\powers\mimic_voice.dm" +#include "code\game\gamemodes\changeling\powers\mutations.dm" +#include "code\game\gamemodes\changeling\powers\panacea.dm" +#include "code\game\gamemodes\changeling\powers\revive.dm" +#include "code\game\gamemodes\changeling\powers\shriek.dm" +#include "code\game\gamemodes\changeling\powers\spiders.dm" +#include "code\game\gamemodes\changeling\powers\strained_muscles.dm" +#include "code\game\gamemodes\changeling\powers\swap_form.dm" +#include "code\game\gamemodes\changeling\powers\tiny_prick.dm" +#include "code\game\gamemodes\changeling\powers\transform.dm" +#include "code\game\gamemodes\cult\cult.dm" +#include "code\game\gamemodes\cult\cult_comms.dm" +#include "code\game\gamemodes\cult\cult_datums.dm" +#include "code\game\gamemodes\cult\cult_items.dm" +#include "code\game\gamemodes\cult\cult_objectives.dm" +#include "code\game\gamemodes\cult\cult_structures.dm" +#include "code\game\gamemodes\cult\ritual.dm" +#include "code\game\gamemodes\cult\runes.dm" +#include "code\game\gamemodes\cult\talisman.dm" +#include "code\game\gamemodes\devil\devil.dm" +#include "code\game\gamemodes\devil\devil_game_mode.dm" +#include "code\game\gamemodes\devil\devilinfo.dm" +#include "code\game\gamemodes\devil\game_mode.dm" +#include "code\game\gamemodes\devil\objectives.dm" +#include "code\game\gamemodes\devil\contracts\friend.dm" +#include "code\game\gamemodes\devil\devil agent\devil_agent.dm" +#include "code\game\gamemodes\devil\imp\imp.dm" +#include "code\game\gamemodes\devil\true_devil\_true_devil.dm" +#include "code\game\gamemodes\devil\true_devil\inventory.dm" +#include "code\game\gamemodes\extended\extended.dm" +#include "code\game\gamemodes\heist\heist.dm" +#include "code\game\gamemodes\malfunction\Malf_Modules.dm" +#include "code\game\gamemodes\meteor\meteor.dm" +#include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\miniantags\abduction\abductee_objectives.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction_gear.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction_outfits.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction_surgery.dm" +#include "code\game\gamemodes\miniantags\abduction\gland.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\camera.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\console.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\dispenser.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\experiment.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\pad.dm" +#include "code\game\gamemodes\miniantags\borer\borer.dm" +#include "code\game\gamemodes\miniantags\borer\borer_chemicals.dm" +#include "code\game\gamemodes\miniantags\borer\borer_event.dm" +#include "code\game\gamemodes\miniantags\borer\borer_html.dm" +#include "code\game\gamemodes\miniantags\bot_swarm\swarmer.dm" +#include "code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" +#include "code\game\gamemodes\miniantags\guardian\guardian.dm" +#include "code\game\gamemodes\miniantags\guardian\types\assassin.dm" +#include "code\game\gamemodes\miniantags\guardian\types\bomb.dm" +#include "code\game\gamemodes\miniantags\guardian\types\charger.dm" +#include "code\game\gamemodes\miniantags\guardian\types\fire.dm" +#include "code\game\gamemodes\miniantags\guardian\types\healer.dm" +#include "code\game\gamemodes\miniantags\guardian\types\lightning.dm" +#include "code\game\gamemodes\miniantags\guardian\types\protector.dm" +#include "code\game\gamemodes\miniantags\guardian\types\ranged.dm" +#include "code\game\gamemodes\miniantags\guardian\types\standard.dm" +#include "code\game\gamemodes\miniantags\morph\morph.dm" +#include "code\game\gamemodes\miniantags\morph\morph_event.dm" +#include "code\game\gamemodes\miniantags\revenant\revenant.dm" +#include "code\game\gamemodes\miniantags\revenant\revenant_abilities.dm" +#include "code\game\gamemodes\miniantags\revenant\revenant_spawn_event.dm" +#include "code\game\gamemodes\miniantags\sintouched\objectives.dm" +#include "code\game\gamemodes\miniantags\slaughter\bloodcrawl.dm" +#include "code\game\gamemodes\miniantags\slaughter\slaughter.dm" +#include "code\game\gamemodes\nuclear\nuclear.dm" +#include "code\game\gamemodes\nuclear\nuclear_challenge.dm" +#include "code\game\gamemodes\nuclear\nuclearbomb.dm" +#include "code\game\gamemodes\nuclear\pinpointer.dm" +#include "code\game\gamemodes\revolution\revolution.dm" +#include "code\game\gamemodes\shadowling\ascendant_shadowling.dm" +#include "code\game\gamemodes\shadowling\shadowling.dm" +#include "code\game\gamemodes\shadowling\shadowling_abilities.dm" +#include "code\game\gamemodes\shadowling\shadowling_items.dm" +#include "code\game\gamemodes\shadowling\special_shadowling_abilities.dm" +#include "code\game\gamemodes\traitor\traitor.dm" +#include "code\game\gamemodes\vampire\traitor_vamp.dm" +#include "code\game\gamemodes\vampire\vampire.dm" +#include "code\game\gamemodes\vampire\vampire_powers.dm" +#include "code\game\gamemodes\wizard\artefact.dm" +#include "code\game\gamemodes\wizard\godhand.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_exp.dm" +#include "code\game\jobs\job_objective.dm" +#include "code\game\jobs\job_scaling.dm" +#include "code\game\jobs\jobs.dm" +#include "code\game\jobs\whitelist.dm" +#include "code\game\jobs\job\central.dm" +#include "code\game\jobs\job\civilian.dm" +#include "code\game\jobs\job\engineering.dm" +#include "code\game\jobs\job\job.dm" +#include "code\game\jobs\job\medical.dm" +#include "code\game\jobs\job\science.dm" +#include "code\game\jobs\job\security.dm" +#include "code\game\jobs\job\silicon.dm" +#include "code\game\jobs\job\supervisor.dm" +#include "code\game\jobs\job\support.dm" +#include "code\game\jobs\job\support_chaplain.dm" +#include "code\game\jobs\job\syndicate.dm" +#include "code\game\jobs\job_objectives\science.dm" +#include "code\game\machinery\adv_med.dm" +#include "code\game\machinery\ai_slipper.dm" +#include "code\game\machinery\alarm.dm" +#include "code\game\machinery\atmo_control.dm" +#include "code\game\machinery\autolathe.dm" +#include "code\game\machinery\Beacon.dm" +#include "code\game\machinery\buttons.dm" +#include "code\game\machinery\cell_charger.dm" +#include "code\game\machinery\chiller.dm" +#include "code\game\machinery\cloning.dm" +#include "code\game\machinery\constructable_frame.dm" +#include "code\game\machinery\cryo.dm" +#include "code\game\machinery\cryopod.dm" +#include "code\game\machinery\dance_machine.dm" +#include "code\game\machinery\defib_mount.dm" +#include "code\game\machinery\deployable.dm" +#include "code\game\machinery\door_control.dm" +#include "code\game\machinery\doppler_array.dm" +#include "code\game\machinery\dye_generator.dm" +#include "code\game\machinery\firealarm.dm" +#include "code\game\machinery\flasher.dm" +#include "code\game\machinery\floodlight.dm" +#include "code\game\machinery\Freezer.dm" +#include "code\game\machinery\gameboard.dm" +#include "code\game\machinery\guestpass.dm" +#include "code\game\machinery\hologram.dm" +#include "code\game\machinery\holosign.dm" +#include "code\game\machinery\igniter.dm" +#include "code\game\machinery\iv_drip.dm" +#include "code\game\machinery\lightswitch.dm" +#include "code\game\machinery\machinery.dm" +#include "code\game\machinery\magnet.dm" +#include "code\game\machinery\mass_driver.dm" +#include "code\game\machinery\navbeacon.dm" +#include "code\game\machinery\newscaster.dm" +#include "code\game\machinery\OpTable.dm" +#include "code\game\machinery\overview.dm" +#include "code\game\machinery\PDApainter.dm" +#include "code\game\machinery\poolcontroller.dm" +#include "code\game\machinery\portable_tag_turret.dm" +#include "code\game\machinery\portable_turret.dm" +#include "code\game\machinery\quantum_pad.dm" +#include "code\game\machinery\recharger.dm" +#include "code\game\machinery\rechargestation.dm" +#include "code\game\machinery\recycler.dm" +#include "code\game\machinery\requests_console.dm" +#include "code\game\machinery\shieldgen.dm" +#include "code\game\machinery\Sleeper.dm" +#include "code\game\machinery\slotmachine.dm" +#include "code\game\machinery\snow_machine.dm" +#include "code\game\machinery\spaceheater.dm" +#include "code\game\machinery\status_display.dm" +#include "code\game\machinery\suit_storage_unit.dm" +#include "code\game\machinery\supply_display.dm" +#include "code\game\machinery\syndicatebeacon.dm" +#include "code\game\machinery\syndicatebomb.dm" +#include "code\game\machinery\teleporter.dm" +#include "code\game\machinery\transformer.dm" +#include "code\game\machinery\turntable.dm" +#include "code\game\machinery\turret_control.dm" +#include "code\game\machinery\vending.dm" +#include "code\game\machinery\washing_machine.dm" +#include "code\game\machinery\wishgranter.dm" +#include "code\game\machinery\atmoalter\area_atmos_computer.dm" +#include "code\game\machinery\atmoalter\canister.dm" +#include "code\game\machinery\atmoalter\meter.dm" +#include "code\game\machinery\atmoalter\portable_atmospherics.dm" +#include "code\game\machinery\atmoalter\pump.dm" +#include "code\game\machinery\atmoalter\scrubber.dm" +#include "code\game\machinery\atmoalter\zvent.dm" +#include "code\game\machinery\camera\camera.dm" +#include "code\game\machinery\camera\camera_assembly.dm" +#include "code\game\machinery\camera\motion.dm" +#include "code\game\machinery\camera\presets.dm" +#include "code\game\machinery\camera\tracking.dm" +#include "code\game\machinery\computer\ai_core.dm" +#include "code\game\machinery\computer\aifixer.dm" +#include "code\game\machinery\computer\arcade.dm" +#include "code\game\machinery\computer\atmos_alert.dm" +#include "code\game\machinery\computer\atmos_control.dm" +#include "code\game\machinery\computer\brigcells.dm" +#include "code\game\machinery\computer\buildandrepair.dm" +#include "code\game\machinery\computer\camera.dm" +#include "code\game\machinery\computer\camera_advanced.dm" +#include "code\game\machinery\computer\card.dm" +#include "code\game\machinery\computer\cloning.dm" +#include "code\game\machinery\computer\communications.dm" +#include "code\game\machinery\computer\computer.dm" +#include "code\game\machinery\computer\crew.dm" +#include "code\game\machinery\computer\depot.dm" +#include "code\game\machinery\computer\HolodeckControl.dm" +#include "code\game\machinery\computer\honkputer.dm" +#include "code\game\machinery\computer\law.dm" +#include "code\game\machinery\computer\medical.dm" +#include "code\game\machinery\computer\message.dm" +#include "code\game\machinery\computer\Operating.dm" +#include "code\game\machinery\computer\pod.dm" +#include "code\game\machinery\computer\pod_tracking_console.dm" +#include "code\game\machinery\computer\power.dm" +#include "code\game\machinery\computer\prisoner.dm" +#include "code\game\machinery\computer\robot.dm" +#include "code\game\machinery\computer\salvage_ship.dm" +#include "code\game\machinery\computer\security.dm" +#include "code\game\machinery\computer\skills.dm" +#include "code\game\machinery\computer\specops_shuttle.dm" +#include "code\game\machinery\computer\station_alert.dm" +#include "code\game\machinery\computer\store.dm" +#include "code\game\machinery\computer\syndicate_specops_shuttle.dm" +#include "code\game\machinery\computer\vr_control.dm" +#include "code\game\machinery\doors\airlock.dm" +#include "code\game\machinery\doors\airlock_control.dm" +#include "code\game\machinery\doors\airlock_electronics.dm" +#include "code\game\machinery\doors\airlock_types.dm" +#include "code\game\machinery\doors\alarmlock.dm" +#include "code\game\machinery\doors\brigdoors.dm" +#include "code\game\machinery\doors\checkForMultipleDoors.dm" +#include "code\game\machinery\doors\door.dm" +#include "code\game\machinery\doors\firedoor.dm" +#include "code\game\machinery\doors\poddoor.dm" +#include "code\game\machinery\doors\shutters.dm" +#include "code\game\machinery\doors\spacepod.dm" +#include "code\game\machinery\doors\unpowered.dm" +#include "code\game\machinery\doors\windowdoor.dm" +#include "code\game\machinery\embedded_controller\airlock_controllers.dm" +#include "code\game\machinery\embedded_controller\airlock_program.dm" +#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" +#include "code\game\machinery\embedded_controller\embedded_program_base.dm" +#include "code\game\machinery\pipe\construction.dm" +#include "code\game\machinery\pipe\pipe_dispenser.dm" +#include "code\game\machinery\telecomms\broadcaster.dm" +#include "code\game\machinery\telecomms\logbrowser.dm" +#include "code\game\machinery\telecomms\machine_interactions.dm" +#include "code\game\machinery\telecomms\ntsl2.dm" +#include "code\game\machinery\telecomms\presets.dm" +#include "code\game\machinery\telecomms\telecomunications.dm" +#include "code\game\machinery\telecomms\telemonitor.dm" +#include "code\game\machinery\telecomms\traffic_control.dm" +#include "code\game\magic\Uristrunes.dm" +#include "code\game\mecha\mech_bay.dm" +#include "code\game\mecha\mech_fabricator.dm" +#include "code\game\mecha\mecha.dm" +#include "code\game\mecha\mecha_actions.dm" +#include "code\game\mecha\mecha_construction_paths.dm" +#include "code\game\mecha\mecha_control_console.dm" +#include "code\game\mecha\mecha_modkit.dm" +#include "code\game\mecha\mecha_parts.dm" +#include "code\game\mecha\mecha_topic.dm" +#include "code\game\mecha\mecha_wreckage.dm" +#include "code\game\mecha\paintkits.dm" +#include "code\game\mecha\combat\combat.dm" +#include "code\game\mecha\combat\durand.dm" +#include "code\game\mecha\combat\gygax.dm" +#include "code\game\mecha\combat\honker.dm" +#include "code\game\mecha\combat\marauder.dm" +#include "code\game\mecha\combat\phazon.dm" +#include "code\game\mecha\combat\reticence.dm" +#include "code\game\mecha\equipment\mecha_equipment.dm" +#include "code\game\mecha\equipment\tools\medical_tools.dm" +#include "code\game\mecha\equipment\tools\mining_tools.dm" +#include "code\game\mecha\equipment\tools\other_tools.dm" +#include "code\game\mecha\equipment\tools\work_tools.dm" +#include "code\game\mecha\equipment\weapons\weapons.dm" +#include "code\game\mecha\medical\medical.dm" +#include "code\game\mecha\medical\odysseus.dm" +#include "code\game\mecha\working\ripley.dm" +#include "code\game\mecha\working\working.dm" +#include "code\game\objects\buckling.dm" +#include "code\game\objects\empulse.dm" +#include "code\game\objects\explosion.dm" +#include "code\game\objects\items.dm" +#include "code\game\objects\obj_defense.dm" +#include "code\game\objects\objs.dm" +#include "code\game\objects\structures.dm" +#include "code\game\objects\effects\alien_acid.dm" +#include "code\game\objects\effects\anomalies.dm" +#include "code\game\objects\effects\bump_teleporter.dm" +#include "code\game\objects\effects\effects.dm" +#include "code\game\objects\effects\forcefields.dm" +#include "code\game\objects\effects\gibs.dm" +#include "code\game\objects\effects\glowshroom.dm" +#include "code\game\objects\effects\landmarks.dm" +#include "code\game\objects\effects\manifest.dm" +#include "code\game\objects\effects\mapping_helpers.dm" +#include "code\game\objects\effects\mines.dm" +#include "code\game\objects\effects\misc.dm" +#include "code\game\objects\effects\overlays.dm" +#include "code\game\objects\effects\portals.dm" +#include "code\game\objects\effects\snowcloud.dm" +#include "code\game\objects\effects\spiders.dm" +#include "code\game\objects\effects\step_triggers.dm" +#include "code\game\objects\effects\decals\cleanable.dm" +#include "code\game\objects\effects\decals\contraband.dm" +#include "code\game\objects\effects\decals\crayon.dm" +#include "code\game\objects\effects\decals\decal.dm" +#include "code\game\objects\effects\decals\misc.dm" +#include "code\game\objects\effects\decals\remains.dm" +#include "code\game\objects\effects\decals\warning_stripes.dm" +#include "code\game\objects\effects\decals\Cleanable\aliens.dm" +#include "code\game\objects\effects\decals\Cleanable\fuel.dm" +#include "code\game\objects\effects\decals\Cleanable\humans.dm" +#include "code\game\objects\effects\decals\Cleanable\misc.dm" +#include "code\game\objects\effects\decals\Cleanable\robots.dm" +#include "code\game\objects\effects\decals\Cleanable\tracks.dm" +#include "code\game\objects\effects\decals\turfdecals\dirt.dm" +#include "code\game\objects\effects\decals\turfdecals\markings.dm" +#include "code\game\objects\effects\decals\turfdecals\tilecoloring.dm" +#include "code\game\objects\effects\decals\turfdecals\weather.dm" +#include "code\game\objects\effects\effect_system\effect_system.dm" +#include "code\game\objects\effects\effect_system\effects_chem_smoke.dm" +#include "code\game\objects\effects\effect_system\effects_explosion.dm" +#include "code\game\objects\effects\effect_system\effects_foam.dm" +#include "code\game\objects\effects\effect_system\effects_other.dm" +#include "code\game\objects\effects\effect_system\effects_smoke.dm" +#include "code\game\objects\effects\effect_system\effects_sparks.dm" +#include "code\game\objects\effects\effect_system\effects_water.dm" +#include "code\game\objects\effects\spawners\bombspawner.dm" +#include "code\game\objects\effects\spawners\gibspawner.dm" +#include "code\game\objects\effects\spawners\lootdrop.dm" +#include "code\game\objects\effects\spawners\random_barrier.dm" +#include "code\game\objects\effects\spawners\random_spawners.dm" +#include "code\game\objects\effects\spawners\vaultspawner.dm" +#include "code\game\objects\effects\spawners\windowspawner.dm" +#include "code\game\objects\effects\temporary_visuals\clockcult.dm" +#include "code\game\objects\effects\temporary_visuals\cult.dm" +#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" +#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" +#include "code\game\objects\items\ashtray.dm" +#include "code\game\objects\items\blueprints.dm" +#include "code\game\objects\items\bodybag.dm" +#include "code\game\objects\items\candle.dm" +#include "code\game\objects\items\cardboard_cutouts.dm" +#include "code\game\objects\items\changestone.dm" +#include "code\game\objects\items\contraband.dm" +#include "code\game\objects\items\control_wand.dm" +#include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\dehy_carp.dm" +#include "code\game\objects\items\documents.dm" +#include "code\game\objects\items\flag.dm" +#include "code\game\objects\items\latexballoon.dm" +#include "code\game\objects\items\misc.dm" +#include "code\game\objects\items\mixing_bowl.dm" +#include "code\game\objects\items\random_items.dm" +#include "code\game\objects\items\shooting_range.dm" +#include "code\game\objects\items\toys.dm" +#include "code\game\objects\items\trash.dm" +#include "code\game\objects\items\devices\aicard.dm" +#include "code\game\objects\items\devices\autopsy.dm" +#include "code\game\objects\items\devices\camera_bug.dm" +#include "code\game\objects\items\devices\chameleonproj.dm" +#include "code\game\objects\items\devices\flash.dm" +#include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\floor_painter.dm" +#include "code\game\objects\items\devices\handheld_defib.dm" +#include "code\game\objects\items\devices\instruments.dm" +#include "code\game\objects\items\devices\laserpointer.dm" +#include "code\game\objects\items\devices\lightreplacer.dm" +#include "code\game\objects\items\devices\machineprototype.dm" +#include "code\game\objects\items\devices\megaphone.dm" +#include "code\game\objects\items\devices\multitool.dm" +#include "code\game\objects\items\devices\paicard.dm" +#include "code\game\objects\items\devices\pipe_painter.dm" +#include "code\game\objects\items\devices\pizza_bomb.dm" +#include "code\game\objects\items\devices\powersink.dm" +#include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\devices\sensor_device.dm" +#include "code\game\objects\items\devices\taperecorder.dm" +#include "code\game\objects\items\devices\thermal_drill.dm" +#include "code\game\objects\items\devices\traitordevices.dm" +#include "code\game\objects\items\devices\transfer_valve.dm" +#include "code\game\objects\items\devices\uplinks.dm" +#include "code\game\objects\items\devices\voice.dm" +#include "code\game\objects\items\devices\whistle.dm" +#include "code\game\objects\items\devices\radio\beacon.dm" +#include "code\game\objects\items\devices\radio\electropack.dm" +#include "code\game\objects\items\devices\radio\encryptionkey.dm" +#include "code\game\objects\items\devices\radio\headset.dm" +#include "code\game\objects\items\devices\radio\intercom.dm" +#include "code\game\objects\items\devices\radio\radio.dm" +#include "code\game\objects\items\mountable_frames\air_alarm.dm" +#include "code\game\objects\items\mountable_frames\apc_frame.dm" +#include "code\game\objects\items\mountable_frames\buttons_switches.dm" +#include "code\game\objects\items\mountable_frames\extinguisher_frame.dm" +#include "code\game\objects\items\mountable_frames\fire_alarm.dm" +#include "code\game\objects\items\mountable_frames\frames.dm" +#include "code\game\objects\items\mountable_frames\intercom.dm" +#include "code\game\objects\items\mountable_frames\lights.dm" +#include "code\game\objects\items\mountable_frames\mountables.dm" +#include "code\game\objects\items\mountable_frames\newscaster_frame.dm" +#include "code\game\objects\items\robot\ai_upgrades.dm" +#include "code\game\objects\items\robot\robot_items.dm" +#include "code\game\objects\items\robot\robot_parts.dm" +#include "code\game\objects\items\robot\robot_upgrades.dm" +#include "code\game\objects\items\stacks\medical.dm" +#include "code\game\objects\items\stacks\nanopaste.dm" +#include "code\game\objects\items\stacks\rods.dm" +#include "code\game\objects\items\stacks\stack.dm" +#include "code\game\objects\items\stacks\stack_recipe.dm" +#include "code\game\objects\items\stacks\telecrystal.dm" +#include "code\game\objects\items\stacks\sheets\glass.dm" +#include "code\game\objects\items\stacks\sheets\leather.dm" +#include "code\game\objects\items\stacks\sheets\light.dm" +#include "code\game\objects\items\stacks\sheets\mineral.dm" +#include "code\game\objects\items\stacks\sheets\sheet_types.dm" +#include "code\game\objects\items\stacks\sheets\sheets.dm" +#include "code\game\objects\items\stacks\tiles\tile_mineral.dm" +#include "code\game\objects\items\stacks\tiles\tile_types.dm" +#include "code\game\objects\items\weapons\AI_modules.dm" +#include "code\game\objects\items\weapons\alien_specific.dm" +#include "code\game\objects\items\weapons\bee_briefcase.dm" +#include "code\game\objects\items\weapons\cards_ids.dm" +#include "code\game\objects\items\weapons\cash.dm" +#include "code\game\objects\items\weapons\caution.dm" +#include "code\game\objects\items\weapons\chrono_eraser.dm" +#include "code\game\objects\items\weapons\cigs.dm" +#include "code\game\objects\items\weapons\clown_items.dm" +#include "code\game\objects\items\weapons\cosmetics.dm" +#include "code\game\objects\items\weapons\courtroom.dm" +#include "code\game\objects\items\weapons\defib.dm" +#include "code\game\objects\items\weapons\dice.dm" +#include "code\game\objects\items\weapons\disks.dm" +#include "code\game\objects\items\weapons\dna_injector.dm" +#include "code\game\objects\items\weapons\dnascrambler.dm" +#include "code\game\objects\items\weapons\explosives.dm" +#include "code\game\objects\items\weapons\extinguisher.dm" +#include "code\game\objects\items\weapons\fireworks.dm" +#include "code\game\objects\items\weapons\flamethrower.dm" +#include "code\game\objects\items\weapons\garrote.dm" +#include "code\game\objects\items\weapons\gift_wrappaper.dm" +#include "code\game\objects\items\weapons\handcuffs.dm" +#include "code\game\objects\items\weapons\highlander_swords.dm" +#include "code\game\objects\items\weapons\holosign.dm" +#include "code\game\objects\items\weapons\holy_weapons.dm" +#include "code\game\objects\items\weapons\kitchen.dm" +#include "code\game\objects\items\weapons\legcuffs.dm" +#include "code\game\objects\items\weapons\lighters.dm" +#include "code\game\objects\items\weapons\manuals.dm" +#include "code\game\objects\items\weapons\misc.dm" +#include "code\game\objects\items\weapons\mop.dm" +#include "code\game\objects\items\weapons\paint.dm" +#include "code\game\objects\items\weapons\paiwire.dm" +#include "code\game\objects\items\weapons\pneumaticCannon.dm" +#include "code\game\objects\items\weapons\powerfist.dm" +#include "code\game\objects\items\weapons\RCD.dm" +#include "code\game\objects\items\weapons\RCL.dm" +#include "code\game\objects\items\weapons\rpd.dm" +#include "code\game\objects\items\weapons\RSF.dm" +#include "code\game\objects\items\weapons\scissors.dm" +#include "code\game\objects\items\weapons\scrolls.dm" +#include "code\game\objects\items\weapons\shards.dm" +#include "code\game\objects\items\weapons\shields.dm" +#include "code\game\objects\items\weapons\signs.dm" +#include "code\game\objects\items\weapons\soap.dm" +#include "code\game\objects\items\weapons\staff.dm" +#include "code\game\objects\items\weapons\stock_parts.dm" +#include "code\game\objects\items\weapons\stunbaton.dm" +#include "code\game\objects\items\weapons\swords_axes_etc.dm" +#include "code\game\objects\items\weapons\tape.dm" +#include "code\game\objects\items\weapons\teleportation.dm" +#include "code\game\objects\items\weapons\teleprod.dm" +#include "code\game\objects\items\weapons\tools.dm" +#include "code\game\objects\items\weapons\twohanded.dm" +#include "code\game\objects\items\weapons\vending_items.dm" +#include "code\game\objects\items\weapons\weaponry.dm" +#include "code\game\objects\items\weapons\whetstone.dm" +#include "code\game\objects\items\weapons\grenades\atmosgrenade.dm" +#include "code\game\objects\items\weapons\grenades\bananade.dm" +#include "code\game\objects\items\weapons\grenades\chem_grenade.dm" +#include "code\game\objects\items\weapons\grenades\clowngrenade.dm" +#include "code\game\objects\items\weapons\grenades\clusterbuster.dm" +#include "code\game\objects\items\weapons\grenades\confetti.dm" +#include "code\game\objects\items\weapons\grenades\custom_grenades.dm" +#include "code\game\objects\items\weapons\grenades\emgrenade.dm" +#include "code\game\objects\items\weapons\grenades\flashbang.dm" +#include "code\game\objects\items\weapons\grenades\frag.dm" +#include "code\game\objects\items\weapons\grenades\ghettobomb.dm" +#include "code\game\objects\items\weapons\grenades\grenade.dm" +#include "code\game\objects\items\weapons\grenades\smokebomb.dm" +#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" +#include "code\game\objects\items\weapons\grenades\syndieminibomb.dm" +#include "code\game\objects\items\weapons\implants\health.dm" +#include "code\game\objects\items\weapons\implants\implant.dm" +#include "code\game\objects\items\weapons\implants\implant_abductor.dm" +#include "code\game\objects\items\weapons\implants\implant_chem.dm" +#include "code\game\objects\items\weapons\implants\implant_death_alarm.dm" +#include "code\game\objects\items\weapons\implants\implant_explosive.dm" +#include "code\game\objects\items\weapons\implants\implant_freedom.dm" +#include "code\game\objects\items\weapons\implants\implant_krav_maga.dm" +#include "code\game\objects\items\weapons\implants\implant_mindshield.dm" +#include "code\game\objects\items\weapons\implants\implant_misc.dm" +#include "code\game\objects\items\weapons\implants\implant_storage.dm" +#include "code\game\objects\items\weapons\implants\implant_track.dm" +#include "code\game\objects\items\weapons\implants\implant_traitor.dm" +#include "code\game\objects\items\weapons\implants\implantcase.dm" +#include "code\game\objects\items\weapons\implants\implantchair.dm" +#include "code\game\objects\items\weapons\implants\implanter.dm" +#include "code\game\objects\items\weapons\implants\implantpad.dm" +#include "code\game\objects\items\weapons\implants\implantuplink.dm" +#include "code\game\objects\items\weapons\melee\energy.dm" +#include "code\game\objects\items\weapons\melee\misc.dm" +#include "code\game\objects\items\weapons\storage\artistic_toolbox.dm" +#include "code\game\objects\items\weapons\storage\backpack.dm" +#include "code\game\objects\items\weapons\storage\bags.dm" +#include "code\game\objects\items\weapons\storage\belt.dm" +#include "code\game\objects\items\weapons\storage\bible.dm" +#include "code\game\objects\items\weapons\storage\boxes.dm" +#include "code\game\objects\items\weapons\storage\briefcase.dm" +#include "code\game\objects\items\weapons\storage\fancy.dm" +#include "code\game\objects\items\weapons\storage\firstaid.dm" +#include "code\game\objects\items\weapons\storage\internal.dm" +#include "code\game\objects\items\weapons\storage\lockbox.dm" +#include "code\game\objects\items\weapons\storage\secure.dm" +#include "code\game\objects\items\weapons\storage\storage.dm" +#include "code\game\objects\items\weapons\storage\toolbox.dm" +#include "code\game\objects\items\weapons\storage\uplink_kits.dm" +#include "code\game\objects\items\weapons\storage\wallets.dm" +#include "code\game\objects\items\weapons\tanks\jetpack.dm" +#include "code\game\objects\items\weapons\tanks\tank_types.dm" +#include "code\game\objects\items\weapons\tanks\tanks.dm" +#include "code\game\objects\items\weapons\tanks\watertank.dm" +#include "code\game\objects\random\random.dm" +#include "code\game\objects\structures\aliens.dm" +#include "code\game\objects\structures\barsign.dm" +#include "code\game\objects\structures\bedsheet_bin.dm" +#include "code\game\objects\structures\coathanger.dm" +#include "code\game\objects\structures\curtains.dm" +#include "code\game\objects\structures\depot.dm" +#include "code\game\objects\structures\displaycase.dm" +#include "code\game\objects\structures\door_assembly.dm" +#include "code\game\objects\structures\door_assembly_types.dm" +#include "code\game\objects\structures\dresser.dm" +#include "code\game\objects\structures\electricchair.dm" +#include "code\game\objects\structures\engicart.dm" +#include "code\game\objects\structures\extinguisher.dm" +#include "code\game\objects\structures\false_walls.dm" +#include "code\game\objects\structures\flora.dm" +#include "code\game\objects\structures\fluff.dm" +#include "code\game\objects\structures\foodcart.dm" +#include "code\game\objects\structures\girders.dm" +#include "code\game\objects\structures\grille.dm" +#include "code\game\objects\structures\guillotine.dm" +#include "code\game\objects\structures\holosign.dm" +#include "code\game\objects\structures\inflatable.dm" +#include "code\game\objects\structures\janicart.dm" +#include "code\game\objects\structures\kitchen_spike.dm" +#include "code\game\objects\structures\ladders.dm" +#include "code\game\objects\structures\lamarr_cage.dm" +#include "code\game\objects\structures\lattice.dm" +#include "code\game\objects\structures\mineral_doors.dm" +#include "code\game\objects\structures\mirror.dm" +#include "code\game\objects\structures\misc.dm" +#include "code\game\objects\structures\mop_bucket.dm" +#include "code\game\objects\structures\morgue.dm" +#include "code\game\objects\structures\musician.dm" +#include "code\game\objects\structures\noticeboard.dm" +#include "code\game\objects\structures\plasticflaps.dm" +#include "code\game\objects\structures\reflector.dm" +#include "code\game\objects\structures\safe.dm" +#include "code\game\objects\structures\signs.dm" +#include "code\game\objects\structures\spirit_board.dm" +#include "code\game\objects\structures\statues.dm" +#include "code\game\objects\structures\table_frames.dm" +#include "code\game\objects\structures\tables_racks.dm" +#include "code\game\objects\structures\tank_dispenser.dm" +#include "code\game\objects\structures\target_stake.dm" +#include "code\game\objects\structures\watercloset.dm" +#include "code\game\objects\structures\windoor_assembly.dm" +#include "code\game\objects\structures\window.dm" +#include "code\game\objects\structures\crates_lockers\closets.dm" +#include "code\game\objects\structures\crates_lockers\crates.dm" +#include "code\game\objects\structures\crates_lockers\crittercrate.dm" +#include "code\game\objects\structures\crates_lockers\largecrate.dm" +#include "code\game\objects\structures\crates_lockers\walllocker.dm" +#include "code\game\objects\structures\crates_lockers\closets\cardboardbox.dm" +#include "code\game\objects\structures\crates_lockers\closets\coffin.dm" +#include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" +#include "code\game\objects\structures\crates_lockers\closets\fireaxe.dm" +#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" +#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" +#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" +#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" +#include "code\game\objects\structures\crates_lockers\closets\statue.dm" +#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" +#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\chaplain.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\depot.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\miscjobs.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" +#include "code\game\objects\structures\decor\decor.dm" +#include "code\game\objects\structures\decor\machinery\telecomms.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" +#include "code\game\objects\structures\transit_tubes\station.dm" +#include "code\game\objects\structures\transit_tubes\transit_tube.dm" +#include "code\game\objects\structures\transit_tubes\transit_tube_pod.dm" +#include "code\game\turfs\simulated.dm" +#include "code\game\turfs\turf.dm" +#include "code\game\turfs\unsimulated.dm" +#include "code\game\turfs\simulated\floor.dm" +#include "code\game\turfs\simulated\minerals.dm" +#include "code\game\turfs\simulated\river.dm" +#include "code\game\turfs\simulated\shuttle.dm" +#include "code\game\turfs\simulated\walls.dm" +#include "code\game\turfs\simulated\walls_indestructible.dm" +#include "code\game\turfs\simulated\walls_mineral.dm" +#include "code\game\turfs\simulated\walls_misc.dm" +#include "code\game\turfs\simulated\walls_reinforced.dm" +#include "code\game\turfs\simulated\floor\asteroid.dm" +#include "code\game\turfs\simulated\floor\chasm.dm" +#include "code\game\turfs\simulated\floor\fancy_floor.dm" +#include "code\game\turfs\simulated\floor\indestructible.dm" +#include "code\game\turfs\simulated\floor\lava.dm" +#include "code\game\turfs\simulated\floor\light_floor.dm" +#include "code\game\turfs\simulated\floor\mineral.dm" +#include "code\game\turfs\simulated\floor\misc_floor.dm" +#include "code\game\turfs\simulated\floor\plasteel_floor.dm" +#include "code\game\turfs\simulated\floor\plating.dm" +#include "code\game\turfs\space\space.dm" +#include "code\game\turfs\space\transit.dm" +#include "code\game\turfs\unsimulated\beach.dm" +#include "code\game\turfs\unsimulated\floor.dm" +#include "code\game\turfs\unsimulated\walls.dm" +#include "code\game\verbs\ooc.dm" +#include "code\game\verbs\randomtip.dm" +#include "code\game\verbs\suicide.dm" +#include "code\game\verbs\who.dm" +#include "code\js\byjax.dm" +#include "code\js\menus.dm" +#include "code\LINDA\LINDA_fire.dm" +#include "code\LINDA\LINDA_system.dm" +#include "code\LINDA\LINDA_turf_tile.dm" +#include "code\modules\admin\admin.dm" +#include "code\modules\admin\admin_investigate.dm" +#include "code\modules\admin\admin_memo.dm" +#include "code\modules\admin\admin_ranks.dm" +#include "code\modules\admin\admin_verbs.dm" +#include "code\modules\admin\banappearance.dm" +#include "code\modules\admin\banjob.dm" +#include "code\modules\admin\create_mob.dm" +#include "code\modules\admin\create_object.dm" +#include "code\modules\admin\create_poll.dm" +#include "code\modules\admin\create_turf.dm" +#include "code\modules\admin\holder2.dm" +#include "code\modules\admin\ipintel.dm" +#include "code\modules\admin\IsBanned.dm" +#include "code\modules\admin\machine_upgrade.dm" +#include "code\modules\admin\NewBan.dm" +#include "code\modules\admin\player_panel.dm" +#include "code\modules\admin\secrets.dm" +#include "code\modules\admin\sql_notes.dm" +#include "code\modules\admin\stickyban.dm" +#include "code\modules\admin\topic.dm" +#include "code\modules\admin\ToRban.dm" +#include "code\modules\admin\watchlist.dm" +#include "code\modules\admin\DB ban\functions.dm" +#include "code\modules\admin\permissionverbs\permissionedit.dm" +#include "code\modules\admin\tickets\adminticketsverbs.dm" +#include "code\modules\admin\tickets\mentorticketsverbs.dm" +#include "code\modules\admin\verbs\adminhelp.dm" +#include "code\modules\admin\verbs\adminjump.dm" +#include "code\modules\admin\verbs\adminpm.dm" +#include "code\modules\admin\verbs\adminsay.dm" +#include "code\modules\admin\verbs\alt_check.dm" +#include "code\modules\admin\verbs\antag-ooc.dm" +#include "code\modules\admin\verbs\atmosdebug.dm" +#include "code\modules\admin\verbs\BrokenInhands.dm" +#include "code\modules\admin\verbs\cinematic.dm" +#include "code\modules\admin\verbs\custom_event.dm" +#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\dice.dm" +#include "code\modules\admin\verbs\freeze.dm" +#include "code\modules\admin\verbs\getlogs.dm" +#include "code\modules\admin\verbs\gimmick_team.dm" +#include "code\modules\admin\verbs\honksquad.dm" +#include "code\modules\admin\verbs\infiltratorteam_syndicate.dm" +#include "code\modules\admin\verbs\map_template_loadverb.dm" +#include "code\modules\admin\verbs\mapping.dm" +#include "code\modules\admin\verbs\massmodvar.dm" +#include "code\modules\admin\verbs\modifyvariables.dm" +#include "code\modules\admin\verbs\one_click_antag.dm" +#include "code\modules\admin\verbs\onlyone.dm" +#include "code\modules\admin\verbs\onlyoneteam.dm" +#include "code\modules\admin\verbs\playsound.dm" +#include "code\modules\admin\verbs\possess.dm" +#include "code\modules\admin\verbs\pray.dm" +#include "code\modules\admin\verbs\randomverbs.dm" +#include "code\modules\admin\verbs\serialization.dm" +#include "code\modules\admin\verbs\space_transitions.dm" +#include "code\modules\admin\verbs\spawnfloorcluwne.dm" +#include "code\modules\admin\verbs\striketeam.dm" +#include "code\modules\admin\verbs\striketeam_syndicate.dm" +#include "code\modules\admin\verbs\ticklag.dm" +#include "code\modules\admin\verbs\toggledebugverbs.dm" +#include "code\modules\admin\verbs\tripAI.dm" +#include "code\modules\admin\verbs\vox_raiders.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" +#include "code\modules\admin\verbs\SDQL2\useful_procs.dm" +#include "code\modules\alarm\alarm.dm" +#include "code\modules\alarm\alarm_handler.dm" +#include "code\modules\alarm\atmosphere_alarm.dm" +#include "code\modules\alarm\burglar_alarm.dm" +#include "code\modules\alarm\camera_alarm.dm" +#include "code\modules\alarm\fire_alarm.dm" +#include "code\modules\alarm\motion_alarm.dm" +#include "code\modules\alarm\power_alarm.dm" +#include "code\modules\antagonists\_common\antag_datum.dm" +#include "code\modules\antagonists\_common\antag_helpers.dm" +#include "code\modules\antagonists\_common\antag_hud.dm" +#include "code\modules\antagonists\_common\antag_spawner.dm" +#include "code\modules\antagonists\_common\antag_team.dm" +#include "code\modules\antagonists\wishgranter\wishgranter.dm" +#include "code\modules\arcade\arcade_base.dm" +#include "code\modules\arcade\arcade_prize.dm" +#include "code\modules\arcade\claw_game.dm" +#include "code\modules\arcade\prize_counter.dm" +#include "code\modules\arcade\prize_datums.dm" +#include "code\modules\arcade\mob_hunt\battle_computer.dm" +#include "code\modules\arcade\mob_hunt\mob_avatar.dm" +#include "code\modules\arcade\mob_hunt\mob_cards.dm" +#include "code\modules\arcade\mob_hunt\mob_datums.dm" +#include "code\modules\arcade\mob_hunt\mob_type_datums.dm" +#include "code\modules\assembly\assembly.dm" +#include "code\modules\assembly\bomb.dm" +#include "code\modules\assembly\health.dm" +#include "code\modules\assembly\helpers.dm" +#include "code\modules\assembly\holder.dm" +#include "code\modules\assembly\igniter.dm" +#include "code\modules\assembly\infrared.dm" +#include "code\modules\assembly\mousetrap.dm" +#include "code\modules\assembly\proximity.dm" +#include "code\modules\assembly\shock_kit.dm" +#include "code\modules\assembly\signaler.dm" +#include "code\modules\assembly\timer.dm" +#include "code\modules\assembly\voice.dm" +#include "code\modules\atmos_automation\console.dm" +#include "code\modules\atmos_automation\statements.dm" +#include "code\modules\atmos_automation\implementation\digital_valves.dm" +#include "code\modules\atmos_automation\implementation\emitters.dm" +#include "code\modules\atmos_automation\implementation\injectors.dm" +#include "code\modules\atmos_automation\implementation\scrubbers.dm" +#include "code\modules\atmos_automation\implementation\sensors.dm" +#include "code\modules\atmos_automation\implementation\vent_pump.dm" +#include "code\modules\awaymissions\corpse.dm" +#include "code\modules\awaymissions\exile.dm" +#include "code\modules\awaymissions\gateway.dm" +#include "code\modules\awaymissions\loot.dm" +#include "code\modules\awaymissions\map_rng.dm" +#include "code\modules\awaymissions\pamphlet.dm" +#include "code\modules\awaymissions\zlevel.dm" +#include "code\modules\awaymissions\zvis.dm" +#include "code\modules\awaymissions\maploader\dmm_suite.dm" +#include "code\modules\awaymissions\maploader\reader.dm" +#include "code\modules\awaymissions\maploader\writer.dm" +#include "code\modules\awaymissions\mission_code\academy.dm" +#include "code\modules\awaymissions\mission_code\beach.dm" +#include "code\modules\awaymissions\mission_code\blackmarketpackers.dm" +#include "code\modules\awaymissions\mission_code\centcomAway.dm" +#include "code\modules\awaymissions\mission_code\challenge.dm" +#include "code\modules\awaymissions\mission_code\evil_santa.dm" +#include "code\modules\awaymissions\mission_code\spacebattle.dm" +#include "code\modules\awaymissions\mission_code\spacehotel.dm" +#include "code\modules\awaymissions\mission_code\stationCollision.dm" +#include "code\modules\awaymissions\mission_code\UO71-terrorspiders.dm" +#include "code\modules\awaymissions\mission_code\wildwest.dm" +#include "code\modules\awaymissions\mission_code\ghost_role_spawners\golems.dm" +#include "code\modules\awaymissions\mission_code\ghost_role_spawners\oldstation.dm" +#include "code\modules\awaymissions\mission_code\ruins\oldstation.dm" +#include "code\modules\awaymissions\mission_code\ruins\wizardcrash.dm" +#include "code\modules\buildmode\bm_mode.dm" +#include "code\modules\buildmode\buildmode.dm" +#include "code\modules\buildmode\buttons.dm" +#include "code\modules\buildmode\effects\line.dm" +#include "code\modules\buildmode\submodes\advanced.dm" +#include "code\modules\buildmode\submodes\area_edit.dm" +#include "code\modules\buildmode\submodes\atmos.dm" +#include "code\modules\buildmode\submodes\basic.dm" +#include "code\modules\buildmode\submodes\boom.dm" +#include "code\modules\buildmode\submodes\copy.dm" +#include "code\modules\buildmode\submodes\fill.dm" +#include "code\modules\buildmode\submodes\link.dm" +#include "code\modules\buildmode\submodes\mapgen.dm" +#include "code\modules\buildmode\submodes\save.dm" +#include "code\modules\buildmode\submodes\throwing.dm" +#include "code\modules\buildmode\submodes\variable_edit.dm" +#include "code\modules\busy_space\air_traffic.dm" +#include "code\modules\busy_space\loremaster.dm" +#include "code\modules\busy_space\organizations.dm" +#include "code\modules\client\asset_cache.dm" +#include "code\modules\client\client defines.dm" +#include "code\modules\client\client procs.dm" +#include "code\modules\client\message.dm" +#include "code\modules\client\view.dm" +#include "code\modules\client\preference\preferences.dm" +#include "code\modules\client\preference\preferences_mysql.dm" +#include "code\modules\client\preference\preferences_spawnpoints.dm" +#include "code\modules\client\preference\preferences_toggles.dm" +#include "code\modules\client\preference\loadout\gear_tweaks.dm" +#include "code\modules\client\preference\loadout\loadout.dm" +#include "code\modules\client\preference\loadout\loadout_accessories.dm" +#include "code\modules\client\preference\loadout\loadout_cosmetics.dm" +#include "code\modules\client\preference\loadout\loadout_donor.dm" +#include "code\modules\client\preference\loadout\loadout_general.dm" +#include "code\modules\client\preference\loadout\loadout_hat.dm" +#include "code\modules\client\preference\loadout\loadout_racial.dm" +#include "code\modules\client\preference\loadout\loadout_shoes.dm" +#include "code\modules\client\preference\loadout\loadout_suit.dm" +#include "code\modules\client\preference\loadout\loadout_uniform.dm" +#include "code\modules\clothing\chameleon.dm" +#include "code\modules\clothing\clothing.dm" +#include "code\modules\clothing\ears\ears.dm" +#include "code\modules\clothing\glasses\glasses.dm" +#include "code\modules\clothing\glasses\hud.dm" +#include "code\modules\clothing\gloves\boxing.dm" +#include "code\modules\clothing\gloves\color.dm" +#include "code\modules\clothing\gloves\miscellaneous.dm" +#include "code\modules\clothing\gloves\rings.dm" +#include "code\modules\clothing\head\collectable.dm" +#include "code\modules\clothing\head\hardhat.dm" +#include "code\modules\clothing\head\helmet.dm" +#include "code\modules\clothing\head\jobs.dm" +#include "code\modules\clothing\head\misc.dm" +#include "code\modules\clothing\head\misc_special.dm" +#include "code\modules\clothing\head\soft_caps.dm" +#include "code\modules\clothing\masks\boxing.dm" +#include "code\modules\clothing\masks\breath.dm" +#include "code\modules\clothing\masks\gasmask.dm" +#include "code\modules\clothing\masks\miscellaneous.dm" +#include "code\modules\clothing\patreon\glasses.dm" +#include "code\modules\clothing\patreon\hats.dm" +#include "code\modules\clothing\shoes\colour.dm" +#include "code\modules\clothing\shoes\magboots.dm" +#include "code\modules\clothing\shoes\miscellaneous.dm" +#include "code\modules\clothing\spacesuits\alien.dm" +#include "code\modules\clothing\spacesuits\breaches.dm" +#include "code\modules\clothing\spacesuits\chronosuit.dm" +#include "code\modules\clothing\spacesuits\ert.dm" +#include "code\modules\clothing\spacesuits\hardsuit.dm" +#include "code\modules\clothing\spacesuits\miscellaneous.dm" +#include "code\modules\clothing\spacesuits\plasmamen.dm" +#include "code\modules\clothing\spacesuits\syndi.dm" +#include "code\modules\clothing\spacesuits\void.dm" +#include "code\modules\clothing\spacesuits\rig\rig.dm" +#include "code\modules\clothing\spacesuits\rig\rig_armormod.dm" +#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm" +#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm" +#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" +#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" +#include "code\modules\clothing\spacesuits\rig\modules\combat.dm" +#include "code\modules\clothing\spacesuits\rig\modules\computer.dm" +#include "code\modules\clothing\spacesuits\rig\modules\modules.dm" +#include "code\modules\clothing\spacesuits\rig\modules\ninja.dm" +#include "code\modules\clothing\spacesuits\rig\modules\utility.dm" +#include "code\modules\clothing\spacesuits\rig\modules\vision.dm" +#include "code\modules\clothing\spacesuits\rig\suits\alien.dm" +#include "code\modules\clothing\spacesuits\rig\suits\combat.dm" +#include "code\modules\clothing\spacesuits\rig\suits\ert_suits.dm" +#include "code\modules\clothing\spacesuits\rig\suits\light.dm" +#include "code\modules\clothing\spacesuits\rig\suits\merc.dm" +#include "code\modules\clothing\spacesuits\rig\suits\station.dm" +#include "code\modules\clothing\suits\alien.dm" +#include "code\modules\clothing\suits\armor.dm" +#include "code\modules\clothing\suits\bio.dm" +#include "code\modules\clothing\suits\hood.dm" +#include "code\modules\clothing\suits\jobs.dm" +#include "code\modules\clothing\suits\labcoat.dm" +#include "code\modules\clothing\suits\miscellaneous.dm" +#include "code\modules\clothing\suits\storage.dm" +#include "code\modules\clothing\suits\utility.dm" +#include "code\modules\clothing\suits\wiz_robe.dm" +#include "code\modules\clothing\under\color.dm" +#include "code\modules\clothing\under\miscellaneous.dm" +#include "code\modules\clothing\under\oldstation_uni.dm" +#include "code\modules\clothing\under\pants.dm" +#include "code\modules\clothing\under\shorts.dm" +#include "code\modules\clothing\under\syndicate.dm" +#include "code\modules\clothing\under\accessories\accessory.dm" +#include "code\modules\clothing\under\accessories\armband.dm" +#include "code\modules\clothing\under\accessories\holster.dm" +#include "code\modules\clothing\under\accessories\storage.dm" +#include "code\modules\clothing\under\jobs\civilian.dm" +#include "code\modules\clothing\under\jobs\engineering.dm" +#include "code\modules\clothing\under\jobs\medsci.dm" +#include "code\modules\clothing\under\jobs\security.dm" +#include "code\modules\countdown\countdown.dm" +#include "code\modules\crafting\craft.dm" +#include "code\modules\crafting\guncrafting.dm" +#include "code\modules\crafting\recipes.dm" +#include "code\modules\customitems\item_defines.dm" +#include "code\modules\customitems\item_spawning.dm" +#include "code\modules\detective_work\detective_work.dm" +#include "code\modules\detective_work\evidence.dm" +#include "code\modules\detective_work\footprints_and_rag.dm" +#include "code\modules\detective_work\scanner.dm" +#include "code\modules\economy\Accounts.dm" +#include "code\modules\economy\Accounts_DB.dm" +#include "code\modules\economy\ATM.dm" +#include "code\modules\economy\Economy.dm" +#include "code\modules\economy\Economy_Events.dm" +#include "code\modules\economy\Economy_Events_Mundane.dm" +#include "code\modules\economy\Economy_TradeDestinations.dm" +#include "code\modules\economy\EFTPOS.dm" +#include "code\modules\economy\Job_Departments.dm" +#include "code\modules\economy\POS.dm" +#include "code\modules\economy\utils.dm" +#include "code\modules\error_handler\error_handler.dm" +#include "code\modules\error_handler\error_viewer.dm" +#include "code\modules\events\abductor.dm" +#include "code\modules\events\alien_infestation.dm" +#include "code\modules\events\anomaly.dm" +#include "code\modules\events\anomaly_bluespace.dm" +#include "code\modules\events\anomaly_flux.dm" +#include "code\modules\events\anomaly_grav.dm" +#include "code\modules\events\anomaly_pyro.dm" +#include "code\modules\events\anomaly_vortex.dm" +#include "code\modules\events\aurora_caelus.dm" +#include "code\modules\events\blob.dm" +#include "code\modules\events\brand_intelligence.dm" +#include "code\modules\events\carp_migration.dm" +#include "code\modules\events\communications_blackout.dm" +#include "code\modules\events\disease_outbreak.dm" +#include "code\modules\events\dust.dm" +#include "code\modules\events\electrical_storm.dm" +#include "code\modules\events\event.dm" +#include "code\modules\events\event_container.dm" +#include "code\modules\events\event_procs.dm" +#include "code\modules\events\false_alarm.dm" +#include "code\modules\events\floorcluwne.dm" +#include "code\modules\events\grid_check.dm" +#include "code\modules\events\immovable_rod.dm" +#include "code\modules\events\infestation.dm" +#include "code\modules\events\ion_storm.dm" +#include "code\modules\events\koi_mirgration.dm" +#include "code\modules\events\mass_hallucination.dm" +#include "code\modules\events\meaty_gore.dm" +#include "code\modules\events\meaty_ops.dm" +#include "code\modules\events\meaty_ores.dm" +#include "code\modules\events\meteors.dm" +#include "code\modules\events\money_hacker.dm" +#include "code\modules\events\money_lotto.dm" +#include "code\modules\events\money_spam.dm" +#include "code\modules\events\prison_break.dm" +#include "code\modules\events\radiation_storm.dm" +#include "code\modules\events\rogue_drones.dm" +#include "code\modules\events\sentience.dm" +#include "code\modules\events\slaughterevent.dm" +#include "code\modules\events\spacevine.dm" +#include "code\modules\events\spider_infestation.dm" +#include "code\modules\events\spider_terror.dm" +#include "code\modules\events\spontaneous_appendicitis.dm" +#include "code\modules\events\tear.dm" +#include "code\modules\events\tear_honk.dm" +#include "code\modules\events\traders.dm" +#include "code\modules\events\undead.dm" +#include "code\modules\events\vent_clog.dm" +#include "code\modules\events\wallrot.dm" +#include "code\modules\events\wormholes.dm" +#include "code\modules\events\wizard\ghost.dm" +#include "code\modules\examine\examine.dm" +#include "code\modules\examine\descriptions\atmospherics.dm" +#include "code\modules\examine\descriptions\engineering.dm" +#include "code\modules\examine\descriptions\medical.dm" +#include "code\modules\examine\descriptions\mobs.dm" +#include "code\modules\examine\descriptions\stacks.dm" +#include "code\modules\examine\descriptions\structures.dm" +#include "code\modules\examine\descriptions\turfs.dm" +#include "code\modules\examine\descriptions\weapons.dm" +#include "code\modules\ext_scripts\irc.dm" +#include "code\modules\ext_scripts\python.dm" +#include "code\modules\fancytitle\fancytitle.dm" +#include "code\modules\fish\fish_eggs.dm" +#include "code\modules\fish\fish_items.dm" +#include "code\modules\fish\fish_types.dm" +#include "code\modules\fish\fishtank.dm" +#include "code\modules\flufftext\Dreaming.dm" +#include "code\modules\flufftext\Hallucination.dm" +#include "code\modules\flufftext\TextFilters.dm" +#include "code\modules\food_and_drinks\food.dm" +#include "code\modules\food_and_drinks\drinks\drinks.dm" +#include "code\modules\food_and_drinks\drinks\bottler\bottler.dm" +#include "code\modules\food_and_drinks\drinks\bottler\bottler_recipes.dm" +#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm" +#include "code\modules\food_and_drinks\drinks\drinks\cans.dm" +#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm" +#include "code\modules\food_and_drinks\drinks\drinks\mugs.dm" +#include "code\modules\food_and_drinks\drinks\drinks\shotglass.dm" +#include "code\modules\food_and_drinks\food\condiment.dm" +#include "code\modules\food_and_drinks\food\customizables.dm" +#include "code\modules\food_and_drinks\food\snacks.dm" +#include "code\modules\food_and_drinks\food\foods\baked_goods.dm" +#include "code\modules\food_and_drinks\food\foods\bread.dm" +#include "code\modules\food_and_drinks\food\foods\candy.dm" +#include "code\modules\food_and_drinks\food\foods\desserts.dm" +#include "code\modules\food_and_drinks\food\foods\ethnic.dm" +#include "code\modules\food_and_drinks\food\foods\ingredients.dm" +#include "code\modules\food_and_drinks\food\foods\junkfood.dm" +#include "code\modules\food_and_drinks\food\foods\meat.dm" +#include "code\modules\food_and_drinks\food\foods\misc.dm" +#include "code\modules\food_and_drinks\food\foods\pasta.dm" +#include "code\modules\food_and_drinks\food\foods\pizza.dm" +#include "code\modules\food_and_drinks\food\foods\sandwiches.dm" +#include "code\modules\food_and_drinks\food\foods\seafood.dm" +#include "code\modules\food_and_drinks\food\foods\side_dishes.dm" +#include "code\modules\food_and_drinks\food\foods\soups.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\candy_maker.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\cereal_maker.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\cooker.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\food_grill.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\grill_new.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat_2.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\juicer.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\kitchen_machine.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\oven.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\oven_new.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\processor.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm" +#include "code\modules\food_and_drinks\recipes\recipes_candy.dm" +#include "code\modules\food_and_drinks\recipes\recipes_grill.dm" +#include "code\modules\food_and_drinks\recipes\recipes_microwave.dm" +#include "code\modules\food_and_drinks\recipes\recipes_oven.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_table.dm" +#include "code\modules\games\52card.dm" +#include "code\modules\games\cards.dm" +#include "code\modules\games\tarot.dm" +#include "code\modules\holiday\christmas.dm" +#include "code\modules\holiday\holiday.dm" +#include "code\modules\hydroponics\biogenerator.dm" +#include "code\modules\hydroponics\fermenting_barrel.dm" +#include "code\modules\hydroponics\gene_modder.dm" +#include "code\modules\hydroponics\grown.dm" +#include "code\modules\hydroponics\growninedible.dm" +#include "code\modules\hydroponics\hydroitemdefines.dm" +#include "code\modules\hydroponics\hydroponics.dm" +#include "code\modules\hydroponics\plant_genes.dm" +#include "code\modules\hydroponics\sample.dm" +#include "code\modules\hydroponics\seed_extractor.dm" +#include "code\modules\hydroponics\seeds.dm" +#include "code\modules\hydroponics\beekeeping\beebox.dm" +#include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm" +#include "code\modules\hydroponics\beekeeping\honey_frame.dm" +#include "code\modules\hydroponics\beekeeping\honeycomb.dm" +#include "code\modules\hydroponics\grown\ambrosia.dm" +#include "code\modules\hydroponics\grown\apple.dm" +#include "code\modules\hydroponics\grown\banana.dm" +#include "code\modules\hydroponics\grown\beans.dm" +#include "code\modules\hydroponics\grown\berries.dm" +#include "code\modules\hydroponics\grown\cannabis.dm" +#include "code\modules\hydroponics\grown\cereals.dm" +#include "code\modules\hydroponics\grown\chili.dm" +#include "code\modules\hydroponics\grown\citrus.dm" +#include "code\modules\hydroponics\grown\cocoa_vanilla.dm" +#include "code\modules\hydroponics\grown\corn.dm" +#include "code\modules\hydroponics\grown\eggplant.dm" +#include "code\modules\hydroponics\grown\flowers.dm" +#include "code\modules\hydroponics\grown\grass_carpet.dm" +#include "code\modules\hydroponics\grown\herbals.dm" +#include "code\modules\hydroponics\grown\kudzu.dm" +#include "code\modules\hydroponics\grown\melon.dm" +#include "code\modules\hydroponics\grown\misc.dm" +#include "code\modules\hydroponics\grown\mushrooms.dm" +#include "code\modules\hydroponics\grown\nettle.dm" +#include "code\modules\hydroponics\grown\nymph.dm" +#include "code\modules\hydroponics\grown\onion.dm" +#include "code\modules\hydroponics\grown\peanut.dm" +#include "code\modules\hydroponics\grown\pineapple.dm" +#include "code\modules\hydroponics\grown\potato.dm" +#include "code\modules\hydroponics\grown\pumpkin.dm" +#include "code\modules\hydroponics\grown\random.dm" +#include "code\modules\hydroponics\grown\replicapod.dm" +#include "code\modules\hydroponics\grown\root.dm" +#include "code\modules\hydroponics\grown\tea_coffee.dm" +#include "code\modules\hydroponics\grown\tobacco.dm" +#include "code\modules\hydroponics\grown\tomato.dm" +#include "code\modules\hydroponics\grown\towercap.dm" +#include "code\modules\karma\karma.dm" +#include "code\modules\keybindings\bindings_admin.dm" +#include "code\modules\keybindings\bindings_atom.dm" +#include "code\modules\keybindings\bindings_carbon.dm" +#include "code\modules\keybindings\bindings_client.dm" +#include "code\modules\keybindings\bindings_human.dm" +#include "code\modules\keybindings\bindings_living.dm" +#include "code\modules\keybindings\bindings_mob.dm" +#include "code\modules\keybindings\bindings_robot.dm" +#include "code\modules\keybindings\focus.dm" +#include "code\modules\keybindings\setup.dm" +#include "code\modules\library\admin.dm" +#include "code\modules\library\codex_gigas.dm" +#include "code\modules\library\lib_items.dm" +#include "code\modules\library\lib_machines.dm" +#include "code\modules\library\lib_readme.dm" +#include "code\modules\library\random_books.dm" +#include "code\modules\library\computers\base.dm" +#include "code\modules\library\computers\checkout.dm" +#include "code\modules\library\computers\public.dm" +#include "code\modules\lighting\__lighting_docs.dm" +#include "code\modules\lighting\lighting_area.dm" +#include "code\modules\lighting\lighting_atom.dm" +#include "code\modules\lighting\lighting_corner.dm" +#include "code\modules\lighting\lighting_object.dm" +#include "code\modules\lighting\lighting_setup.dm" +#include "code\modules\lighting\lighting_source.dm" +#include "code\modules\lighting\lighting_turf.dm" +#include "code\modules\logic\converter.dm" +#include "code\modules\logic\dual_input.dm" +#include "code\modules\logic\logic_base.dm" +#include "code\modules\logic\mono_input.dm" +#include "code\modules\map_fluff\cyberiad.dm" +#include "code\modules\map_fluff\delta.dm" +#include "code\modules\map_fluff\maps.dm" +#include "code\modules\map_fluff\metastation.dm" +#include "code\modules\martial_arts\adminfu.dm" +#include "code\modules\martial_arts\brawling.dm" +#include "code\modules\martial_arts\cqc.dm" +#include "code\modules\martial_arts\krav_maga.dm" +#include "code\modules\martial_arts\martial.dm" +#include "code\modules\martial_arts\mimejutsu.dm" +#include "code\modules\martial_arts\plasma_fist.dm" +#include "code\modules\martial_arts\sleeping_carp.dm" +#include "code\modules\martial_arts\wrestleing.dm" +#include "code\modules\mining\abandonedcrates.dm" +#include "code\modules\mining\coins.dm" +#include "code\modules\mining\equipment_locker.dm" +#include "code\modules\mining\explorer_gear.dm" +#include "code\modules\mining\machine_processing.dm" +#include "code\modules\mining\machine_stacking.dm" +#include "code\modules\mining\machine_unloading.dm" +#include "code\modules\mining\mine_items.dm" +#include "code\modules\mining\minebot.dm" +#include "code\modules\mining\mint.dm" +#include "code\modules\mining\money_bag.dm" +#include "code\modules\mining\ore.dm" +#include "code\modules\mining\satchel_ore_boxdm.dm" +#include "code\modules\mining\shelters.dm" +#include "code\modules\mining\equipment\marker_beacons.dm" +#include "code\modules\mining\equipment\survival_pod.dm" +#include "code\modules\mining\laborcamp\laborshuttle.dm" +#include "code\modules\mining\laborcamp\laborstacker.dm" +#include "code\modules\mining\lavaland\ash_flora.dm" +#include "code\modules\mining\lavaland\necropolis_chests.dm" +#include "code\modules\mining\lavaland\loot\ashdragon_loot.dm" +#include "code\modules\mining\lavaland\loot\bubblegum_loot.dm" +#include "code\modules\mining\lavaland\loot\colossus_loot.dm" +#include "code\modules\mining\lavaland\loot\hierophant_loot.dm" +#include "code\modules\mining\lavaland\loot\legion_loot.dm" +#include "code\modules\mining\lavaland\loot\tendril_loot.dm" +#include "code\modules\mob\abilities.dm" +#include "code\modules\mob\death.dm" +#include "code\modules\mob\emote.dm" +#include "code\modules\mob\hear_say.dm" +#include "code\modules\mob\holder.dm" +#include "code\modules\mob\inventory.dm" +#include "code\modules\mob\language.dm" +#include "code\modules\mob\login.dm" +#include "code\modules\mob\logout.dm" +#include "code\modules\mob\mob.dm" +#include "code\modules\mob\mob_defines.dm" +#include "code\modules\mob\mob_grab.dm" +#include "code\modules\mob\mob_helpers.dm" +#include "code\modules\mob\mob_movement.dm" +#include "code\modules\mob\mob_transformation_simple.dm" +#include "code\modules\mob\say.dm" +#include "code\modules\mob\status_procs.dm" +#include "code\modules\mob\transform_procs.dm" +#include "code\modules\mob\typing_indicator.dm" +#include "code\modules\mob\update_icons.dm" +#include "code\modules\mob\update_status.dm" +#include "code\modules\mob\camera\camera.dm" +#include "code\modules\mob\dead\dead.dm" +#include "code\modules\mob\dead\death.dm" +#include "code\modules\mob\dead\observer\login.dm" +#include "code\modules\mob\dead\observer\logout.dm" +#include "code\modules\mob\dead\observer\observer.dm" +#include "code\modules\mob\dead\observer\say.dm" +#include "code\modules\mob\dead\observer\spells.dm" +#include "code\modules\mob\living\autohiss.dm" +#include "code\modules\mob\living\damage_procs.dm" +#include "code\modules\mob\living\death.dm" +#include "code\modules\mob\living\default_language.dm" +#include "code\modules\mob\living\life.dm" +#include "code\modules\mob\living\living.dm" +#include "code\modules\mob\living\living_defense.dm" +#include "code\modules\mob\living\living_defines.dm" +#include "code\modules\mob\living\login.dm" +#include "code\modules\mob\living\logout.dm" +#include "code\modules\mob\living\say.dm" +#include "code\modules\mob\living\stat_states.dm" +#include "code\modules\mob\living\status_procs.dm" +#include "code\modules\mob\living\update_status.dm" +#include "code\modules\mob\living\carbon\_defines.dm" +#include "code\modules\mob\living\carbon\carbon.dm" +#include "code\modules\mob\living\carbon\carbon_defense.dm" +#include "code\modules\mob\living\carbon\carbon_defines.dm" +#include "code\modules\mob\living\carbon\death.dm" +#include "code\modules\mob\living\carbon\give.dm" +#include "code\modules\mob\living\carbon\life.dm" +#include "code\modules\mob\living\carbon\superheroes.dm" +#include "code\modules\mob\living\carbon\update_icons.dm" +#include "code\modules\mob\living\carbon\update_status.dm" +#include "code\modules\mob\living\carbon\alien\alien.dm" +#include "code\modules\mob\living\carbon\alien\alien_defense.dm" +#include "code\modules\mob\living\carbon\alien\death.dm" +#include "code\modules\mob\living\carbon\alien\life.dm" +#include "code\modules\mob\living\carbon\alien\login.dm" +#include "code\modules\mob\living\carbon\alien\logout.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\emote.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\empress.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\life.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\drone.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm" +#include "code\modules\mob\living\carbon\alien\larva\emote.dm" +#include "code\modules\mob\living\carbon\alien\larva\inventory.dm" +#include "code\modules\mob\living\carbon\alien\larva\larva.dm" +#include "code\modules\mob\living\carbon\alien\larva\larva_defense.dm" +#include "code\modules\mob\living\carbon\alien\larva\life.dm" +#include "code\modules\mob\living\carbon\alien\larva\powers.dm" +#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm" +#include "code\modules\mob\living\carbon\alien\special\facehugger.dm" +#include "code\modules\mob\living\carbon\brain\brain.dm" +#include "code\modules\mob\living\carbon\brain\brain_item.dm" +#include "code\modules\mob\living\carbon\brain\death.dm" +#include "code\modules\mob\living\carbon\brain\emote.dm" +#include "code\modules\mob\living\carbon\brain\life.dm" +#include "code\modules\mob\living\carbon\brain\login.dm" +#include "code\modules\mob\living\carbon\brain\MMI.dm" +#include "code\modules\mob\living\carbon\brain\MMI_radio.dm" +#include "code\modules\mob\living\carbon\brain\robotic_brain.dm" +#include "code\modules\mob\living\carbon\brain\say.dm" +#include "code\modules\mob\living\carbon\brain\update_status.dm" +#include "code\modules\mob\living\carbon\human\appearance.dm" +#include "code\modules\mob\living\carbon\human\body_accessories.dm" +#include "code\modules\mob\living\carbon\human\death.dm" +#include "code\modules\mob\living\carbon\human\emote.dm" +#include "code\modules\mob\living\carbon\human\examine.dm" +#include "code\modules\mob\living\carbon\human\human.dm" +#include "code\modules\mob\living\carbon\human\human_damage.dm" +#include "code\modules\mob\living\carbon\human\human_defense.dm" +#include "code\modules\mob\living\carbon\human\human_defines.dm" +#include "code\modules\mob\living\carbon\human\human_movement.dm" +#include "code\modules\mob\living\carbon\human\human_organs.dm" +#include "code\modules\mob\living\carbon\human\inventory.dm" +#include "code\modules\mob\living\carbon\human\life.dm" +#include "code\modules\mob\living\carbon\human\login.dm" +#include "code\modules\mob\living\carbon\human\logout.dm" +#include "code\modules\mob\living\carbon\human\npcs.dm" +#include "code\modules\mob\living\carbon\human\say.dm" +#include "code\modules\mob\living\carbon\human\status_procs.dm" +#include "code\modules\mob\living\carbon\human\update_icons.dm" +#include "code\modules\mob\living\carbon\human\update_stat.dm" +#include "code\modules\mob\living\carbon\human\species\_species.dm" +#include "code\modules\mob\living\carbon\human\species\abductor.dm" +#include "code\modules\mob\living\carbon\human\species\diona.dm" +#include "code\modules\mob\living\carbon\human\species\drask.dm" +#include "code\modules\mob\living\carbon\human\species\golem.dm" +#include "code\modules\mob\living\carbon\human\species\grey.dm" +#include "code\modules\mob\living\carbon\human\species\human.dm" +#include "code\modules\mob\living\carbon\human\species\kidan.dm" +#include "code\modules\mob\living\carbon\human\species\machine.dm" +#include "code\modules\mob\living\carbon\human\species\monkey.dm" +#include "code\modules\mob\living\carbon\human\species\nucleation.dm" +#include "code\modules\mob\living\carbon\human\species\plasmaman.dm" +#include "code\modules\mob\living\carbon\human\species\shadow.dm" +#include "code\modules\mob\living\carbon\human\species\shadowling.dm" +#include "code\modules\mob\living\carbon\human\species\skeleton.dm" +#include "code\modules\mob\living\carbon\human\species\skrell.dm" +#include "code\modules\mob\living\carbon\human\species\slime.dm" +#include "code\modules\mob\living\carbon\human\species\tajaran.dm" +#include "code\modules\mob\living\carbon\human\species\unathi.dm" +#include "code\modules\mob\living\carbon\human\species\vox.dm" +#include "code\modules\mob\living\carbon\human\species\vulpkanin.dm" +#include "code\modules\mob\living\carbon\human\species\wryn.dm" +#include "code\modules\mob\living\carbon\slime\death.dm" +#include "code\modules\mob\living\carbon\slime\emote.dm" +#include "code\modules\mob\living\carbon\slime\examine.dm" +#include "code\modules\mob\living\carbon\slime\life.dm" +#include "code\modules\mob\living\carbon\slime\powers.dm" +#include "code\modules\mob\living\carbon\slime\say.dm" +#include "code\modules\mob\living\carbon\slime\slime.dm" +#include "code\modules\mob\living\carbon\slime\subtypes.dm" +#include "code\modules\mob\living\carbon\slime\update_icons.dm" +#include "code\modules\mob\living\silicon\death.dm" +#include "code\modules\mob\living\silicon\emote.dm" +#include "code\modules\mob\living\silicon\laws.dm" +#include "code\modules\mob\living\silicon\login.dm" +#include "code\modules\mob\living\silicon\say.dm" +#include "code\modules\mob\living\silicon\silicon.dm" +#include "code\modules\mob\living\silicon\silicon_defense.dm" +#include "code\modules\mob\living\silicon\subsystems.dm" +#include "code\modules\mob\living\silicon\ai\ai.dm" +#include "code\modules\mob\living\silicon\ai\ai_defense.dm" +#include "code\modules\mob\living\silicon\ai\death.dm" +#include "code\modules\mob\living\silicon\ai\examine.dm" +#include "code\modules\mob\living\silicon\ai\latejoin.dm" +#include "code\modules\mob\living\silicon\ai\laws.dm" +#include "code\modules\mob\living\silicon\ai\life.dm" +#include "code\modules\mob\living\silicon\ai\login.dm" +#include "code\modules\mob\living\silicon\ai\logout.dm" +#include "code\modules\mob\living\silicon\ai\multicam.dm" +#include "code\modules\mob\living\silicon\ai\say.dm" +#include "code\modules\mob\living\silicon\ai\update_status.dm" +#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" +#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" +#include "code\modules\mob\living\silicon\ai\freelook\eye.dm" +#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm" +#include "code\modules\mob\living\silicon\decoy\death.dm" +#include "code\modules\mob\living\silicon\decoy\decoy.dm" +#include "code\modules\mob\living\silicon\decoy\life.dm" +#include "code\modules\mob\living\silicon\pai\death.dm" +#include "code\modules\mob\living\silicon\pai\life.dm" +#include "code\modules\mob\living\silicon\pai\pai.dm" +#include "code\modules\mob\living\silicon\pai\personality.dm" +#include "code\modules\mob\living\silicon\pai\recruit.dm" +#include "code\modules\mob\living\silicon\pai\say.dm" +#include "code\modules\mob\living\silicon\pai\software.dm" +#include "code\modules\mob\living\silicon\pai\software_modules.dm" +#include "code\modules\mob\living\silicon\pai\update_status.dm" +#include "code\modules\mob\living\silicon\robot\component.dm" +#include "code\modules\mob\living\silicon\robot\death.dm" +#include "code\modules\mob\living\silicon\robot\emote.dm" +#include "code\modules\mob\living\silicon\robot\examine.dm" +#include "code\modules\mob\living\silicon\robot\inventory.dm" +#include "code\modules\mob\living\silicon\robot\laws.dm" +#include "code\modules\mob\living\silicon\robot\life.dm" +#include "code\modules\mob\living\silicon\robot\login.dm" +#include "code\modules\mob\living\silicon\robot\photos.dm" +#include "code\modules\mob\living\silicon\robot\robot.dm" +#include "code\modules\mob\living\silicon\robot\robot_damage.dm" +#include "code\modules\mob\living\silicon\robot\robot_defense.dm" +#include "code\modules\mob\living\silicon\robot\robot_items.dm" +#include "code\modules\mob\living\silicon\robot\robot_module_actions.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules.dm" +#include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\update_status.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" +#include "code\modules\mob\living\silicon\robot\drone\update_status.dm" +#include "code\modules\mob\living\simple_animal\animal_defense.dm" +#include "code\modules\mob\living\simple_animal\constructs.dm" +#include "code\modules\mob\living\simple_animal\corpse.dm" +#include "code\modules\mob\living\simple_animal\parrot.dm" +#include "code\modules\mob\living\simple_animal\posessed_object.dm" +#include "code\modules\mob\living\simple_animal\powers.dm" +#include "code\modules\mob\living\simple_animal\shade.dm" +#include "code\modules\mob\living\simple_animal\simple_animal.dm" +#include "code\modules\mob\living\simple_animal\spawner.dm" +#include "code\modules\mob\living\simple_animal\tribbles.dm" +#include "code\modules\mob\living\simple_animal\bot\bot.dm" +#include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" +#include "code\modules\mob\living\simple_animal\bot\construction.dm" +#include "code\modules\mob\living\simple_animal\bot\ed209bot.dm" +#include "code\modules\mob\living\simple_animal\bot\emote.dm" +#include "code\modules\mob\living\simple_animal\bot\floorbot.dm" +#include "code\modules\mob\living\simple_animal\bot\griefsky.dm" +#include "code\modules\mob\living\simple_animal\bot\honkbot.dm" +#include "code\modules\mob\living\simple_animal\bot\medbot.dm" +#include "code\modules\mob\living\simple_animal\bot\mulebot.dm" +#include "code\modules\mob\living\simple_animal\bot\secbot.dm" +#include "code\modules\mob\living\simple_animal\bot\syndicate.dm" +#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" +#include "code\modules\mob\living\simple_animal\friendly\cat.dm" +#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm" +#include "code\modules\mob\living\simple_animal\friendly\corgi.dm" +#include "code\modules\mob\living\simple_animal\friendly\corgi_powers.dm" +#include "code\modules\mob\living\simple_animal\friendly\crab.dm" +#include "code\modules\mob\living\simple_animal\friendly\deer.dm" +#include "code\modules\mob\living\simple_animal\friendly\diona.dm" +#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" +#include "code\modules\mob\living\simple_animal\friendly\fox.dm" +#include "code\modules\mob\living\simple_animal\friendly\lizard.dm" +#include "code\modules\mob\living\simple_animal\friendly\mouse.dm" +#include "code\modules\mob\living\simple_animal\friendly\penguin.dm" +#include "code\modules\mob\living\simple_animal\friendly\pet.dm" +#include "code\modules\mob\living\simple_animal\friendly\pug.dm" +#include "code\modules\mob\living\simple_animal\friendly\slime.dm" +#include "code\modules\mob\living\simple_animal\friendly\sloth.dm" +#include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm" +#include "code\modules\mob\living\simple_animal\hostile\alien.dm" +#include "code\modules\mob\living\simple_animal\hostile\bat.dm" +#include "code\modules\mob\living\simple_animal\hostile\bear.dm" +#include "code\modules\mob\living\simple_animal\hostile\bees.dm" +#include "code\modules\mob\living\simple_animal\hostile\carp.dm" +#include "code\modules\mob\living\simple_animal\hostile\creature.dm" +#include "code\modules\mob\living\simple_animal\hostile\deathsquid.dm" +#include "code\modules\mob\living\simple_animal\hostile\faithless.dm" +#include "code\modules\mob\living\simple_animal\hostile\feral_cat.dm" +#include "code\modules\mob\living\simple_animal\hostile\floorcluwne.dm" +#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" +#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" +#include "code\modules\mob\living\simple_animal\hostile\hellhound.dm" +#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" +#include "code\modules\mob\living\simple_animal\hostile\hostile.dm" +#include "code\modules\mob\living\simple_animal\hostile\illusion.dm" +#include "code\modules\mob\living\simple_animal\hostile\jungle_animals.dm" +#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm" +#include "code\modules\mob\living\simple_animal\hostile\mimic.dm" +#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" +#include "code\modules\mob\living\simple_animal\hostile\netherworld.dm" +#include "code\modules\mob\living\simple_animal\hostile\pirate.dm" +#include "code\modules\mob\living\simple_animal\hostile\russian.dm" +#include "code\modules\mob\living\simple_animal\hostile\spaceworms.dm" +#include "code\modules\mob\living\simple_animal\hostile\statue.dm" +#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" +#include "code\modules\mob\living\simple_animal\hostile\tree.dm" +#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm" +#include "code\modules\mob\living\simple_animal\hostile\winter_mobs.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\basilisk.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\goldgrub.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\goliath.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\gutlunch.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\hivelord.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\mining.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\necropolis_tendril.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\fish.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\kangaroo.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\pet.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\undead.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\__defines.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\actions.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\black.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\brown.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\chem.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\empress.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\ghost.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\gray.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\green.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\hive.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\mother.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\prince.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\princess.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\purple.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\queen.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\red.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\reproduction.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_ai.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_spiders.dm" +#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\white.dm" +#include "code\modules\mob\new_player\login.dm" +#include "code\modules\mob\new_player\logout.dm" +#include "code\modules\mob\new_player\new_player.dm" +#include "code\modules\mob\new_player\poll.dm" +#include "code\modules\mob\new_player\preferences_setup.dm" +#include "code\modules\mob\new_player\sprite_accessories\sprite_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\diona\diona_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\drask\drask_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\grey\grey_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\human\human_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\human\human_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\human\human_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_face.dm" +#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\ipc\ipc_optics.dm" +#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\kidan\kidan_head_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\nucleation\nucleation_face.dm" +#include "code\modules\mob\new_player\sprite_accessories\skrell\skrell_face.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\tajaran\tajaran_head_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_alt_heads.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\unathi\unathi_head_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vox\vox_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vox\vox_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\vox\vox_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\vox\vox_tail_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_body_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_facial_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_hair.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_head_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_head_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\vulpkanin\vulpkanin_tail_markings.dm" +#include "code\modules\mob\new_player\sprite_accessories\wryn\wryn_face.dm" +#include "code\modules\modular_computers\laptop_vendor.dm" +#include "code\modules\modular_computers\computers\item\computer.dm" +#include "code\modules\modular_computers\computers\item\computer_components.dm" +#include "code\modules\modular_computers\computers\item\computer_damage.dm" +#include "code\modules\modular_computers\computers\item\computer_power.dm" +#include "code\modules\modular_computers\computers\item\computer_ui.dm" +#include "code\modules\modular_computers\computers\item\laptop.dm" +#include "code\modules\modular_computers\computers\item\laptop_presets.dm" +#include "code\modules\modular_computers\computers\item\processor.dm" +#include "code\modules\modular_computers\computers\item\tablet.dm" +#include "code\modules\modular_computers\computers\item\tablet_presets.dm" +#include "code\modules\modular_computers\computers\machinery\console_presets.dm" +#include "code\modules\modular_computers\computers\machinery\modular_computer.dm" +#include "code\modules\modular_computers\computers\machinery\modular_console.dm" +#include "code\modules\modular_computers\file_system\computer_file.dm" +#include "code\modules\modular_computers\file_system\data.dm" +#include "code\modules\modular_computers\file_system\program.dm" +#include "code\modules\modular_computers\file_system\program_events.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" +#include "code\modules\modular_computers\file_system\programs\command\card.dm" +#include "code\modules\modular_computers\file_system\programs\command\comms.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\alarm.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\power_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\sm_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\generic\configurator.dm" +#include "code\modules\modular_computers\file_system\programs\generic\file_browser.dm" +#include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm" +#include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" +#include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm" +#include "code\modules\modular_computers\file_system\programs\research\airestorer.dm" +#include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm" +#include "code\modules\modular_computers\hardware\_hardware.dm" +#include "code\modules\modular_computers\hardware\ai_slot.dm" +#include "code\modules\modular_computers\hardware\battery_module.dm" +#include "code\modules\modular_computers\hardware\card_slot.dm" +#include "code\modules\modular_computers\hardware\CPU.dm" +#include "code\modules\modular_computers\hardware\hard_drive.dm" +#include "code\modules\modular_computers\hardware\network_card.dm" +#include "code\modules\modular_computers\hardware\portable_disk.dm" +#include "code\modules\modular_computers\hardware\printer.dm" +#include "code\modules\modular_computers\hardware\recharger.dm" +#include "code\modules\modular_computers\NTNet\NTNet.dm" +#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" +#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" +#include "code\modules\nano\nanoexternal.dm" +#include "code\modules\nano\nanomapgen.dm" +#include "code\modules\nano\nanoui.dm" +#include "code\modules\nano\subsystem.dm" +#include "code\modules\nano\interaction\admin.dm" +#include "code\modules\nano\interaction\base.dm" +#include "code\modules\nano\interaction\conscious.dm" +#include "code\modules\nano\interaction\contained.dm" +#include "code\modules\nano\interaction\default.dm" +#include "code\modules\nano\interaction\ghost.dm" +#include "code\modules\nano\interaction\inventory.dm" +#include "code\modules\nano\interaction\inventory_deep.dm" +#include "code\modules\nano\interaction\not_incapacitated.dm" +#include "code\modules\nano\interaction\physical.dm" +#include "code\modules\nano\interaction\self.dm" +#include "code\modules\nano\interaction\zlevel.dm" +#include "code\modules\nano\modules\alarm_monitor.dm" +#include "code\modules\nano\modules\atmos_control.dm" +#include "code\modules\nano\modules\crew_monitor.dm" +#include "code\modules\nano\modules\ert_manager.dm" +#include "code\modules\nano\modules\human_appearance.dm" +#include "code\modules\nano\modules\law_manager.dm" +#include "code\modules\nano\modules\nano_module.dm" +#include "code\modules\nano\modules\power_monitor.dm" +#include "code\modules\ninja\energy_katana.dm" +#include "code\modules\ninja\suit\gloves.dm" +#include "code\modules\ninja\suit\head.dm" +#include "code\modules\ninja\suit\mask.dm" +#include "code\modules\ninja\suit\shoes.dm" +#include "code\modules\ninja\suit\suit.dm" +#include "code\modules\ninja\suit\suit_initialisation.dm" +#include "code\modules\paperwork\carbonpaper.dm" +#include "code\modules\paperwork\clipboard.dm" +#include "code\modules\paperwork\contract.dm" +#include "code\modules\paperwork\fax.dm" +#include "code\modules\paperwork\faxmachine.dm" +#include "code\modules\paperwork\filingcabinet.dm" +#include "code\modules\paperwork\folders.dm" +#include "code\modules\paperwork\frames.dm" +#include "code\modules\paperwork\handlabeler.dm" +#include "code\modules\paperwork\paper.dm" +#include "code\modules\paperwork\paper_bundle.dm" +#include "code\modules\paperwork\paperbin.dm" +#include "code\modules\paperwork\paperplane.dm" +#include "code\modules\paperwork\pen.dm" +#include "code\modules\paperwork\photocopier.dm" +#include "code\modules\paperwork\photography.dm" +#include "code\modules\paperwork\silicon_photography.dm" +#include "code\modules\paperwork\stamps.dm" +#include "code\modules\pda\ai.dm" +#include "code\modules\pda\app.dm" +#include "code\modules\pda\cart.dm" +#include "code\modules\pda\cart_apps.dm" +#include "code\modules\pda\core_apps.dm" +#include "code\modules\pda\messenger.dm" +#include "code\modules\pda\messenger_plugins.dm" +#include "code\modules\pda\mob_hunt_game_app.dm" +#include "code\modules\pda\PDA.dm" +#include "code\modules\pda\pdas.dm" +#include "code\modules\pda\radio.dm" +#include "code\modules\pda\utilities.dm" +#include "code\modules\persistence\persistence.dm" +#include "code\modules\power\apc.dm" +#include "code\modules\power\cable.dm" +#include "code\modules\power\cable_heavyduty.dm" +#include "code\modules\power\cable_logic.dm" +#include "code\modules\power\cell.dm" +#include "code\modules\power\generator.dm" +#include "code\modules\power\gravitygenerator.dm" +#include "code\modules\power\lighting.dm" +#include "code\modules\power\port_gen.dm" +#include "code\modules\power\power.dm" +#include "code\modules\power\powernet.dm" +#include "code\modules\power\smes.dm" +#include "code\modules\power\solar.dm" +#include "code\modules\power\terminal.dm" +#include "code\modules\power\tracker.dm" +#include "code\modules\power\treadmill.dm" +#include "code\modules\power\turbine.dm" +#include "code\modules\power\singularity\collector.dm" +#include "code\modules\power\singularity\containment_field.dm" +#include "code\modules\power\singularity\emitter.dm" +#include "code\modules\power\singularity\field_generator.dm" +#include "code\modules\power\singularity\generator.dm" +#include "code\modules\power\singularity\investigate.dm" +#include "code\modules\power\singularity\narsie.dm" +#include "code\modules\power\singularity\singularity.dm" +#include "code\modules\power\singularity\particle_accelerator\particle.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_chamber.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_power.dm" +#include "code\modules\power\supermatter\supermatter.dm" +#include "code\modules\power\tesla\coil.dm" +#include "code\modules\power\tesla\energy_ball.dm" +#include "code\modules\power\tesla\generator.dm" +#include "code\modules\procedural_mapping\mapGenerator.dm" +#include "code\modules\procedural_mapping\mapGeneratorModule.dm" +#include "code\modules\procedural_mapping\mapGeneratorReadme.dm" +#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm" +#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm" +#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm" +#include "code\modules\procedural_mapping\mapGenerators\nature.dm" +#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm" +#include "code\modules\projectiles\ammunition.dm" +#include "code\modules\projectiles\firing.dm" +#include "code\modules\projectiles\gun.dm" +#include "code\modules\projectiles\gun_attachments.dm" +#include "code\modules\projectiles\projectile.dm" +#include "code\modules\projectiles\ammunition\ammo_casings.dm" +#include "code\modules\projectiles\ammunition\boxes.dm" +#include "code\modules\projectiles\ammunition\energy.dm" +#include "code\modules\projectiles\ammunition\magazines.dm" +#include "code\modules\projectiles\ammunition\special.dm" +#include "code\modules\projectiles\guns\alien.dm" +#include "code\modules\projectiles\guns\dartgun.dm" +#include "code\modules\projectiles\guns\energy.dm" +#include "code\modules\projectiles\guns\grenade_launcher.dm" +#include "code\modules\projectiles\guns\magic.dm" +#include "code\modules\projectiles\guns\medbeam.dm" +#include "code\modules\projectiles\guns\mounted.dm" +#include "code\modules\projectiles\guns\projectile.dm" +#include "code\modules\projectiles\guns\rocket.dm" +#include "code\modules\projectiles\guns\syringe_gun.dm" +#include "code\modules\projectiles\guns\throw.dm" +#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm" +#include "code\modules\projectiles\guns\energy\laser.dm" +#include "code\modules\projectiles\guns\energy\nuclear.dm" +#include "code\modules\projectiles\guns\energy\pulse.dm" +#include "code\modules\projectiles\guns\energy\special.dm" +#include "code\modules\projectiles\guns\energy\stun.dm" +#include "code\modules\projectiles\guns\energy\telegun.dm" +#include "code\modules\projectiles\guns\magic\staff.dm" +#include "code\modules\projectiles\guns\magic\wand.dm" +#include "code\modules\projectiles\guns\misc\blastcannon.dm" +#include "code\modules\projectiles\guns\projectile\automatic.dm" +#include "code\modules\projectiles\guns\projectile\bow.dm" +#include "code\modules\projectiles\guns\projectile\launchers.dm" +#include "code\modules\projectiles\guns\projectile\pistol.dm" +#include "code\modules\projectiles\guns\projectile\revolver.dm" +#include "code\modules\projectiles\guns\projectile\saw.dm" +#include "code\modules\projectiles\guns\projectile\shotgun.dm" +#include "code\modules\projectiles\guns\projectile\sniper.dm" +#include "code\modules\projectiles\guns\projectile\toy.dm" +#include "code\modules\projectiles\guns\throw\crossbow.dm" +#include "code\modules\projectiles\guns\throw\pielauncher.dm" +#include "code\modules\projectiles\projectile\beams.dm" +#include "code\modules\projectiles\projectile\bullets.dm" +#include "code\modules\projectiles\projectile\energy.dm" +#include "code\modules\projectiles\projectile\force.dm" +#include "code\modules\projectiles\projectile\magic.dm" +#include "code\modules\projectiles\projectile\reusable.dm" +#include "code\modules\projectiles\projectile\special.dm" +#include "code\modules\reagents\chem_splash.dm" +#include "code\modules\reagents\reagent_containers.dm" +#include "code\modules\reagents\reagent_dispenser.dm" +#include "code\modules\reagents\chemistry\colors.dm" +#include "code\modules\reagents\chemistry\holder.dm" +#include "code\modules\reagents\chemistry\readme.dm" +#include "code\modules\reagents\chemistry\reagents.dm" +#include "code\modules\reagents\chemistry\recipes.dm" +#include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm" +#include "code\modules\reagents\chemistry\machinery\chem_heater.dm" +#include "code\modules\reagents\chemistry\machinery\chem_master.dm" +#include "code\modules\reagents\chemistry\machinery\pandemic.dm" +#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" +#include "code\modules\reagents\chemistry\reagents\admin.dm" +#include "code\modules\reagents\chemistry\reagents\alcohol.dm" +#include "code\modules\reagents\chemistry\reagents\blob.dm" +#include "code\modules\reagents\chemistry\reagents\disease.dm" +#include "code\modules\reagents\chemistry\reagents\drink_base.dm" +#include "code\modules\reagents\chemistry\reagents\drink_cold.dm" +#include "code\modules\reagents\chemistry\reagents\drinks.dm" +#include "code\modules\reagents\chemistry\reagents\drugs.dm" +#include "code\modules\reagents\chemistry\reagents\food.dm" +#include "code\modules\reagents\chemistry\reagents\medicine.dm" +#include "code\modules\reagents\chemistry\reagents\misc.dm" +#include "code\modules\reagents\chemistry\reagents\paint.dm" +#include "code\modules\reagents\chemistry\reagents\paradise_pop.dm" +#include "code\modules\reagents\chemistry\reagents\pyrotechnic.dm" +#include "code\modules\reagents\chemistry\reagents\toxins.dm" +#include "code\modules\reagents\chemistry\reagents\water.dm" +#include "code\modules\reagents\chemistry\recipes\drinks.dm" +#include "code\modules\reagents\chemistry\recipes\drugs.dm" +#include "code\modules\reagents\chemistry\recipes\food.dm" +#include "code\modules\reagents\chemistry\recipes\medicine.dm" +#include "code\modules\reagents\chemistry\recipes\others.dm" +#include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" +#include "code\modules\reagents\chemistry\recipes\slime_extracts.dm" +#include "code\modules\reagents\chemistry\recipes\toxins.dm" +#include "code\modules\reagents\reagent_containers\borghydro.dm" +#include "code\modules\reagents\reagent_containers\bottle.dm" +#include "code\modules\reagents\reagent_containers\dropper.dm" +#include "code\modules\reagents\reagent_containers\glass_containers.dm" +#include "code\modules\reagents\reagent_containers\hypospray.dm" +#include "code\modules\reagents\reagent_containers\iv_bag.dm" +#include "code\modules\reagents\reagent_containers\patch.dm" +#include "code\modules\reagents\reagent_containers\pill.dm" +#include "code\modules\reagents\reagent_containers\spray.dm" +#include "code\modules\reagents\reagent_containers\syringes.dm" +#include "code\modules\recycling\belt-placer.dm" +#include "code\modules\recycling\conveyor2.dm" +#include "code\modules\recycling\disposal-construction.dm" +#include "code\modules\recycling\disposal.dm" +#include "code\modules\recycling\sortingmachinery.dm" +#include "code\modules\research\circuitprinter.dm" +#include "code\modules\research\designs.dm" +#include "code\modules\research\destructive_analyzer.dm" +#include "code\modules\research\experimentor.dm" +#include "code\modules\research\message_server.dm" +#include "code\modules\research\protolathe.dm" +#include "code\modules\research\rd-readme.dm" +#include "code\modules\research\rdconsole.dm" +#include "code\modules\research\rdmachines.dm" +#include "code\modules\research\research.dm" +#include "code\modules\research\server.dm" +#include "code\modules\research\designs\AI_module_designs.dm" +#include "code\modules\research\designs\autolathe_designs.dm" +#include "code\modules\research\designs\biogenerator_designs.dm" +#include "code\modules\research\designs\bluespace_designs.dm" +#include "code\modules\research\designs\comp_board_designs.dm" +#include "code\modules\research\designs\computer_part_designs.dm" +#include "code\modules\research\designs\equipment_designs.dm" +#include "code\modules\research\designs\janitorial_designs.dm" +#include "code\modules\research\designs\machine_designs.dm" +#include "code\modules\research\designs\mecha_designs.dm" +#include "code\modules\research\designs\mechfabricator_designs.dm" +#include "code\modules\research\designs\medical_designs.dm" +#include "code\modules\research\designs\mining_designs.dm" +#include "code\modules\research\designs\misc_designs.dm" +#include "code\modules\research\designs\power_designs.dm" +#include "code\modules\research\designs\smelting_designs.dm" +#include "code\modules\research\designs\spacepod_designs.dm" +#include "code\modules\research\designs\stock_parts_designs.dm" +#include "code\modules\research\designs\telecomms_designs.dm" +#include "code\modules\research\designs\weapon_designs.dm" +#include "code\modules\research\xenobiology\xenobio_camera.dm" +#include "code\modules\research\xenobiology\xenobiology.dm" +#include "code\modules\response_team\ert.dm" +#include "code\modules\response_team\ert_outfits.dm" +#include "code\modules\ruins\ruin_areas.dm" +#include "code\modules\ruins\lavalandruin_code\animal_hospital.dm" +#include "code\modules\ruins\lavalandruin_code\ash_walker_den.dm" +#include "code\modules\ruins\lavalandruin_code\dead_ratvar.dm" +#include "code\modules\ruins\lavalandruin_code\fountain_hall.dm" +#include "code\modules\ruins\lavalandruin_code\hermit.dm" +#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm" +#include "code\modules\ruins\lavalandruin_code\puzzle.dm" +#include "code\modules\ruins\lavalandruin_code\seed_vault.dm" +#include "code\modules\ruins\lavalandruin_code\sin_ruins.dm" +#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm" +#include "code\modules\ruins\objects_and_mobs\gym.dm" +#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm" +#include "code\modules\security_levels\keycard authentication.dm" +#include "code\modules\security_levels\security levels.dm" +#include "code\modules\shuttle\assault_pod.dm" +#include "code\modules\shuttle\emergency.dm" +#include "code\modules\shuttle\ert.dm" +#include "code\modules\shuttle\navigation_computer.dm" +#include "code\modules\shuttle\on_move.dm" +#include "code\modules\shuttle\ripple.dm" +#include "code\modules\shuttle\shuttle.dm" +#include "code\modules\shuttle\shuttle_manipulator.dm" +#include "code\modules\shuttle\shuttle_rotate.dm" +#include "code\modules\shuttle\supply.dm" +#include "code\modules\shuttle\syndicate.dm" +#include "code\modules\shuttle\vox.dm" +#include "code\modules\space_management\heap_space_level.dm" +#include "code\modules\space_management\level_check.dm" +#include "code\modules\space_management\level_traits.dm" +#include "code\modules\space_management\space_chunk.dm" +#include "code\modules\space_management\space_level.dm" +#include "code\modules\space_management\space_transition.dm" +#include "code\modules\space_management\zlevel_manager.dm" +#include "code\modules\spacepods\construction.dm" +#include "code\modules\spacepods\equipment.dm" +#include "code\modules\spacepods\lock_buster.dm" +#include "code\modules\spacepods\parts.dm" +#include "code\modules\spacepods\spacepod.dm" +#include "code\modules\station_goals\bsa.dm" +#include "code\modules\station_goals\dna_vault.dm" +#include "code\modules\station_goals\shield.dm" +#include "code\modules\station_goals\station_goal.dm" +#include "code\modules\store\items.dm" +#include "code\modules\store\store.dm" +#include "code\modules\surgery\bones.dm" +#include "code\modules\surgery\cavity_implant.dm" +#include "code\modules\surgery\dental_implant.dm" +#include "code\modules\surgery\encased.dm" +#include "code\modules\surgery\generic.dm" +#include "code\modules\surgery\helpers.dm" +#include "code\modules\surgery\implant_removal.dm" +#include "code\modules\surgery\limb_augmentation.dm" +#include "code\modules\surgery\limb_reattach.dm" +#include "code\modules\surgery\organs_internal.dm" +#include "code\modules\surgery\other.dm" +#include "code\modules\surgery\plastic_surgery.dm" +#include "code\modules\surgery\remove_embedded_object.dm" +#include "code\modules\surgery\rig_removal.dm" +#include "code\modules\surgery\robotics.dm" +#include "code\modules\surgery\slime.dm" +#include "code\modules\surgery\surgery.dm" +#include "code\modules\surgery\tools.dm" +#include "code\modules\surgery\organs\augments_arms.dm" +#include "code\modules\surgery\organs\augments_eyes.dm" +#include "code\modules\surgery\organs\augments_internal.dm" +#include "code\modules\surgery\organs\autoimplanter.dm" +#include "code\modules\surgery\organs\blood.dm" +#include "code\modules\surgery\organs\body_egg.dm" +#include "code\modules\surgery\organs\ears.dm" +#include "code\modules\surgery\organs\eyes.dm" +#include "code\modules\surgery\organs\heart.dm" +#include "code\modules\surgery\organs\helpers.dm" +#include "code\modules\surgery\organs\kidneys.dm" +#include "code\modules\surgery\organs\liver.dm" +#include "code\modules\surgery\organs\lungs.dm" +#include "code\modules\surgery\organs\mmi_holder.dm" +#include "code\modules\surgery\organs\organ.dm" +#include "code\modules\surgery\organs\organ_external.dm" +#include "code\modules\surgery\organs\organ_icon.dm" +#include "code\modules\surgery\organs\organ_internal.dm" +#include "code\modules\surgery\organs\pain.dm" +#include "code\modules\surgery\organs\parasites.dm" +#include "code\modules\surgery\organs\robolimbs.dm" +#include "code\modules\surgery\organs\skeleton.dm" +#include "code\modules\surgery\organs\vocal_cords.dm" +#include "code\modules\surgery\organs\subtypes\abductor.dm" +#include "code\modules\surgery\organs\subtypes\diona.dm" +#include "code\modules\surgery\organs\subtypes\drask.dm" +#include "code\modules\surgery\organs\subtypes\grey.dm" +#include "code\modules\surgery\organs\subtypes\kidan.dm" +#include "code\modules\surgery\organs\subtypes\machine.dm" +#include "code\modules\surgery\organs\subtypes\nucleation.dm" +#include "code\modules\surgery\organs\subtypes\plasmaman.dm" +#include "code\modules\surgery\organs\subtypes\shadow.dm" +#include "code\modules\surgery\organs\subtypes\skrell.dm" +#include "code\modules\surgery\organs\subtypes\standard.dm" +#include "code\modules\surgery\organs\subtypes\tajaran.dm" +#include "code\modules\surgery\organs\subtypes\unathi.dm" +#include "code\modules\surgery\organs\subtypes\unbreakable.dm" +#include "code\modules\surgery\organs\subtypes\vox.dm" +#include "code\modules\surgery\organs\subtypes\vulpkanin.dm" +#include "code\modules\surgery\organs\subtypes\wryn.dm" +#include "code\modules\surgery\organs\subtypes\xenos.dm" +#include "code\modules\telesci\bscrystal.dm" +#include "code\modules\telesci\gps.dm" +#include "code\modules\telesci\telepad.dm" +#include "code\modules\telesci\telesci_computer.dm" +#include "code\modules\tooltip\tooltip.dm" +#include "code\modules\tram\tram.dm" +#include "code\modules\tram\tram_control_pad.dm" +#include "code\modules\tram\tram_floor.dm" +#include "code\modules\tram\tram_rail.dm" +#include "code\modules\tram\tram_wall.dm" +#include "code\modules\vehicle\ambulance.dm" +#include "code\modules\vehicle\atv.dm" +#include "code\modules\vehicle\janicart.dm" +#include "code\modules\vehicle\motorcycle.dm" +#include "code\modules\vehicle\secway.dm" +#include "code\modules\vehicle\snowmobile.dm" +#include "code\modules\vehicle\speedbike.dm" +#include "code\modules\vehicle\sportscar.dm" +#include "code\modules\vehicle\vehicle.dm" +#include "code\modules\vr\vr_avatar.dm" +#include "code\modules\vr\vr_controller.dm" +#include "code\modules\vr\vr_goggles.dm" +#include "code\modules\vr\vr_outfits.dm" +#include "goon\code\datums\browserOutput.dm" +#include "interface\interface.dm" +#include "interface\skin.dmf" +// END_INCLUDE