mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-29 08:08:49 +01:00
Merge branch 'master' of https://github.com/tgstation/-tg-station into SQDL2
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/tg/station 13 v1.0 - 6 October 2010 [](http://hibernia.fallemmc.com:8090/job/tgstation/)
|
||||
/tg/station 13 v1.0 - 6 October 2010 [](https://travis-ci.org/tgstation/-tg-station)
|
||||
|
||||
Website: http://ss13.eu
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"aa" = (/turf/space,/area)
|
||||
"aa" = (/turf/space,/area/space)
|
||||
"ab" = (/turf/simulated/wall/r_wall,/area/awaymission/academy/headmaster)
|
||||
"ac" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/plating,/area/awaymission/academy/headmaster)
|
||||
"ad" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
|
||||
@@ -38,7 +38,7 @@
|
||||
"aL" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/briefcase,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
|
||||
"aM" = (/obj/structure/table/reinforced,/obj/item/weapon/coin/plasma,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
|
||||
"aN" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
|
||||
"aO" = (/obj/structure/lattice,/turf/space,/area)
|
||||
"aO" = (/obj/structure/lattice,/turf/space,/area/space)
|
||||
"aP" = (/obj/machinery/door/airlock/gold{locked = 1},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
|
||||
"aQ" = (/obj/machinery/door/airlock/gold{locked = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
|
||||
"aR" = (/turf/simulated/mineral/random/high_chance,/area/awaymission/academy)
|
||||
@@ -224,7 +224,7 @@
|
||||
"ep" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor{icon_state = "white"},/area/awaymission/academy/classrooms)
|
||||
"eq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/plating,/area/awaymission/academy/classrooms)
|
||||
"er" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "yellow"},/area/awaymission/academy/classrooms)
|
||||
"es" = (/obj/machinery/singularity/academy,/turf/space,/area)
|
||||
"es" = (/obj/machinery/singularity/academy,/turf/space,/area/space)
|
||||
"et" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "yellow"; dir = 10},/area/awaymission/academy/classrooms)
|
||||
"eu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor{icon_state = "grimy"},/area/awaymission/academy/classrooms)
|
||||
"ev" = (/obj/structure/mineral_door/wood,/turf/simulated/floor,/area/awaymission/academy/classrooms)
|
||||
@@ -485,7 +485,7 @@
|
||||
"jq" = (/obj/structure/cult/pylon,/turf/simulated/floor{dir = 6; icon_state = "yellow"},/area/awaymission/academy/academyaft)
|
||||
"jr" = (/obj/structure/window/reinforced,/turf/simulated/floor/airless{tag = "icon-white (EAST)"; icon_state = "white"; dir = 4},/area/awaymission/academy/academyaft)
|
||||
"js" = (/obj/structure/table,/obj/structure/window/reinforced,/obj/item/device/batterer,/turf/simulated/floor/airless{tag = "icon-whitered (EAST)"; icon_state = "whitered"; dir = 4},/area/awaymission/academy/academyaft)
|
||||
"jt" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area)
|
||||
"jt" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area/space)
|
||||
"ju" = (/obj/machinery/igniter,/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
|
||||
"jv" = (/obj/structure/window/reinforced,/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
|
||||
"jw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/cable,/turf/simulated/floor/plating,/area/awaymission/academy/academyaft)
|
||||
+5
-5
@@ -1,8 +1,8 @@
|
||||
"aa" = (/turf/space,/area)
|
||||
"aa" = (/turf/space,/area/space)
|
||||
"ab" = (/turf/simulated/mineral/random/high_chance,/area/awaymission)
|
||||
"ac" = (/turf/simulated/floor/plating/asteroid/airless,/area/awaymission)
|
||||
"ad" = (/obj/effect/landmark/corpse/doctor,/turf/simulated/floor/plating/asteroid/airless,/area/awaymission)
|
||||
"ae" = (/obj/item/weapon/circular_saw,/obj/structure/lattice,/turf/space,/area)
|
||||
"ae" = (/obj/item/weapon/circular_saw,/obj/structure/lattice,/turf/space,/area/space)
|
||||
"af" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission/BMPship/Fore)
|
||||
"ag" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/BMPship/Fore)
|
||||
"ah" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship/Fore)
|
||||
@@ -16,7 +16,7 @@
|
||||
"ap" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
|
||||
"aq" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
|
||||
"ar" = (/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
|
||||
"as" = (/obj/structure/lattice,/turf/space,/area)
|
||||
"as" = (/obj/structure/lattice,/turf/space,/area/space)
|
||||
"at" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
|
||||
"au" = (/obj/machinery/light/small,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
|
||||
"av" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"},/area/awaymission/BMPship/Fore)
|
||||
@@ -338,7 +338,7 @@
|
||||
"gz" = (/obj/item/weapon/cable_coil,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
|
||||
"gA" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
|
||||
"gB" = (/obj/item/stack/sheet/mineral/uranium{amount = 50},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
|
||||
"gC" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area)
|
||||
"gC" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/space)
|
||||
"gD" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/awaymission/BMPship/Fore)
|
||||
"gE" = (/obj/structure/lattice,/turf/space,/area/awaymission/BMPship/Fore)
|
||||
"gF" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/awaymission/BMPship/Fore)
|
||||
@@ -433,7 +433,7 @@
|
||||
"iq" = (/obj/machinery/door/unpowered/shuttle,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
|
||||
"ir" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/awaymission/BMPship/Aft)
|
||||
"is" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/awaymission/BMPship/Aft)
|
||||
"it" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area)
|
||||
"it" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area/space)
|
||||
"iu" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship/Fore)
|
||||
"iv" = (/turf/simulated/shuttle/wall,/area/awaymission/BMPship/Fore)
|
||||
"iw" = (/turf/simulated/floor/plating/airless{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission)
|
||||
@@ -1,4 +1,4 @@
|
||||
"aa" = (/turf/space,/area)
|
||||
"aa" = (/turf/space,/area/space)
|
||||
"ab" = (/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/maint)
|
||||
"ac" = (/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/cafe)
|
||||
"ad" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/cafe)
|
||||
@@ -60,7 +60,7 @@
|
||||
"bh" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
|
||||
"bi" = (/obj/machinery/door/airlock/centcom,/turf/simulated/floor{tag = "icon-greenfull (NORTH)"; icon_state = "greenfull"; dir = 1},/area/awaymission/centcomAway/cafe)
|
||||
"bj" = (/obj/structure/rack,/obj/item/clothing/suit/fire,/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
|
||||
"bk" = (/obj/structure/lattice,/turf/space,/area)
|
||||
"bk" = (/obj/structure/lattice,/turf/space,/area/space)
|
||||
"bl" = (/obj/machinery/door/poddoor{id = "XCCHangar1"; name = "XCC Main Hangar"},/turf/simulated/floor{icon_state = "delivery"},/area/awaymission/centcomAway/hangar)
|
||||
"bm" = (/turf/simulated/floor{tag = "icon-vault (NORTHWEST)"; icon_state = "vault"; dir = 9},/area/awaymission/centcomAway/hangar)
|
||||
"bn" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/awaymission/centcomAway/hangar)
|
||||
@@ -282,7 +282,7 @@
|
||||
"fv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
|
||||
"fw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
|
||||
"fx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
|
||||
"fy" = (/obj/structure/sign/greencross,/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/general)
|
||||
"fy" = (/obj/structure/sign/bluecross_2,/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/general)
|
||||
"fz" = (/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/awaymission/centcomAway/general)
|
||||
"fA" = (/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor{icon_state = "floor"},/area/awaymission/centcomAway/general)
|
||||
"fB" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{icon_state = "floor"},/area/awaymission/centcomAway/general)
|
||||
@@ -368,7 +368,7 @@
|
||||
"hd" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
|
||||
"he" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/awaymission/centcomAway/hangar)
|
||||
"hf" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
|
||||
"hg" = (/obj/structure/table,/obj/item/weapon/cable_coil,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
|
||||
"hg" = (/obj/structure/table,/obj/item/stack/cable_coil,/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
|
||||
"hh" = (/obj/structure/closet/body_bag,/turf/simulated/floor{icon_state = "engine"},/area/awaymission/centcomAway/general)
|
||||
"hi" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/general)
|
||||
"hj" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/PDAs,/turf/simulated/floor{icon_state = "floor"},/area/awaymission/centcomAway/general)
|
||||
@@ -435,7 +435,7 @@
|
||||
"is" = (/obj/structure/bookcase,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor{icon_state = "grimy"},/area/awaymission/centcomAway/general)
|
||||
"it" = (/obj/machinery/door/poddoor/shutters{id = "XCCsec3"; name = "XCC Main Access Shutters"},/turf/simulated/floor{icon_state = "delivery"},/area/awaymission/centcomAway/general)
|
||||
"iu" = (/obj/structure/flora/ausbushes,/turf/simulated/floor{icon_state = "asteroid6"; name = "sand"; tag = "icon-asteroid6"},/area/awaymission/centcomAway/general)
|
||||
"iv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area)
|
||||
"iv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/space)
|
||||
"iw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/courtroom)
|
||||
"ix" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/courtroom)
|
||||
"iy" = (/obj/machinery/door/poddoor{id = "XCCMechs"; name = "XCC Mech Bay"},/turf/simulated/floor{icon_state = "delivery"},/area/awaymission/centcomAway/hangar)
|
||||
@@ -563,9 +563,9 @@
|
||||
"kQ" = (/obj/structure/table/woodentable,/obj/item/clothing/tie/medal/gold,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general)
|
||||
"kR" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
|
||||
"kS" = (/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/thunderdome)
|
||||
"kT" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 1},/turf/space,/area)
|
||||
"kU" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/space,/area)
|
||||
"kV" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/space,/area)
|
||||
"kT" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 1},/turf/space,/area/space)
|
||||
"kU" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/space,/area/space)
|
||||
"kV" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/space,/area/space)
|
||||
"kW" = (/obj/structure/table,/obj/item/device/paicard,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
|
||||
"kX" = (/obj/structure/table,/obj/item/device/camera,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
|
||||
"kY" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaymission/centcomAway/thunderdome)
|
||||
@@ -1,4 +1,4 @@
|
||||
"aa" = (/turf/space,/area)
|
||||
"aa" = (/turf/space,/area/space)
|
||||
"ab" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/challenge/start)
|
||||
"ac" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/start)
|
||||
"ad" = (/turf/simulated/floor/plating,/area/awaymission/challenge/start)
|
||||
@@ -114,10 +114,10 @@
|
||||
"cj" = (/turf/simulated/floor/wood,/area/awaymission/challenge/end)
|
||||
"ck" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/revolver/mateba,/turf/simulated/floor/wood,/area/awaymission/challenge/end)
|
||||
"cl" = (/mob/living/simple_animal/hostile/syndicate/melee,/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end)
|
||||
"cm" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area)
|
||||
"cm" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
|
||||
"cn" = (/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
|
||||
"co" = (/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/challenge/end)
|
||||
"cp" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area)
|
||||
"cp" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
|
||||
"cq" = (/obj/structure/table/woodentable,/obj/item/weapon/melee/chainofcommand,/obj/item/weapon/stamp,/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
|
||||
"cr" = (/obj/structure/table/woodentable,/obj/item/weapon/paper{info = "Congratulations,<br><br>Your station has been selected to carry out the Gateway Project.<br><br>The equipment will be shipped to you at the start of the next quarter.<br> You are to prepare a secure location to house the equipment as outlined in the attached documents.<br><br>--Nanotrasen Blue Space Research"; name = "Confidential Correspondence, Pg 1"; pixel_x = 0; pixel_y = 0},/obj/item/weapon/folder/blue,/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
|
||||
"cs" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
|
||||
@@ -126,8 +126,8 @@
|
||||
"cv" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/wood,/area/awaymission/challenge/end)
|
||||
"cw" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/simulated/floor/wood,/area/awaymission/challenge/end)
|
||||
"cx" = (/obj/machinery/door/airlock/centcom{name = "Security"; opacity = 1; req_access_txt = "109"},/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end)
|
||||
"cy" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area)
|
||||
"cz" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/space,/area)
|
||||
"cy" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
|
||||
"cz" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
|
||||
"cA" = (/obj/structure/sign/securearea,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/challenge/end)
|
||||
"cB" = (/obj/machinery/door/airlock/centcom{name = "Administrator"; opacity = 1; req_access_txt = "109"},/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end)
|
||||
"cC" = (/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
|
||||
@@ -135,11 +135,11 @@
|
||||
"cE" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
|
||||
"cF" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end)
|
||||
"cG" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
|
||||
"cH" = (/obj/structure/window/reinforced{dir = 1},/turf/space,/area)
|
||||
"cI" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/space,/area)
|
||||
"cJ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area)
|
||||
"cK" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/space,/area)
|
||||
"cL" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/space,/area)
|
||||
"cH" = (/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space)
|
||||
"cI" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
|
||||
"cJ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space)
|
||||
"cK" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space)
|
||||
"cL" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
|
||||
"cM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
|
||||
"cN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
|
||||
"cO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
|
||||
@@ -158,14 +158,14 @@
|
||||
"db" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/awaymission/challenge/end)
|
||||
"dc" = (/obj/structure/window/reinforced,/obj/machinery/door/poddoor{icon_state = "pdoor1"; id = "challenge"; name = "Gateway Shutters"; p_open = 0},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
|
||||
"dd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id = "challenge"; name = "Gateway Shutters"; p_open = 0},/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end)
|
||||
"de" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/space,/area)
|
||||
"de" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/space,/area/space)
|
||||
"df" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/challenge/end)
|
||||
"dg" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end)
|
||||
"dh" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end)
|
||||
"di" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end)
|
||||
"dj" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end)
|
||||
"dk" = (/obj/structure/table,/obj/item/weapon/implanter/explosive,/obj/item/weapon/implanter/explosive{pixel_y = 4},/obj/item/weapon/implanter/explosive{pixel_y = 8},/obj/item/weapon/implanter/explosive{pixel_y = 12},/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end)
|
||||
"dl" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area)
|
||||
"dl" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area/space)
|
||||
"dm" = (/obj/machinery/door/airlock/centcom{name = "Gateway Access"; opacity = 1; req_access_txt = "109"},/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end)
|
||||
"dn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
|
||||
"do" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/mob/living/simple_animal/hostile/syndicate{name = "Syndicate Technician"},/turf/simulated/floor{icon_state = "dark"},/area/awaymission/challenge/end)
|
||||
@@ -1,4 +1,4 @@
|
||||
"aa" = (/turf/space,/area)
|
||||
"aa" = (/turf/space,/area/space)
|
||||
"ab" = (/turf/simulated/wall,/area/awaymission/example)
|
||||
"ac" = (/turf/simulated/floor,/area/awaymission/example)
|
||||
"ad" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/awaymission/example)
|
||||
@@ -71,7 +71,7 @@
|
||||
"bs" = (/obj/structure/toilet{pixel_y = 12},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/example)
|
||||
"bt" = (/turf/simulated/floor{icon_state = "bar"},/area/awaymission/example)
|
||||
"bu" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/example)
|
||||
"bv" = (/obj/effect/landmark{name = "awaystart"},/turf/space,/area)
|
||||
"bv" = (/obj/effect/landmark{name = "awaystart"},/turf/space,/area/space)
|
||||
"bw" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/example)
|
||||
"bx" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/example)
|
||||
"by" = (/obj/structure/table,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/example)
|
||||
@@ -7,14 +7,14 @@
|
||||
#Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once.
|
||||
#DO tick the associated code file for the away mission you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors!
|
||||
|
||||
#maps/RandomZLevels/example.dmm
|
||||
#maps/RandomZLevels/blackmarketpackers.dmm
|
||||
#maps/RandomZLevels/stationCollision.dmm
|
||||
#maps/RandomZLevels/spacebattle.dmm
|
||||
#maps/RandomZLevels/beach.dmm
|
||||
#maps/RandomZLevels/Academy.dmm
|
||||
#maps/RandomZLevels/wildwest.dmm
|
||||
#maps/RandomZLevels/challenge.dmm
|
||||
#maps/RandomZLevels/listeningpost.dmm
|
||||
#maps/RandomZLevels/spacehotel.dmm
|
||||
#maps/RandomZLevels/centcomAway.dmm
|
||||
#_maps/RandomZLevels/example.dmm
|
||||
#_maps/RandomZLevels/blackmarketpackers.dmm
|
||||
#_maps/RandomZLevels/stationCollision.dmm
|
||||
#_maps/RandomZLevels/spacebattle.dmm
|
||||
#_maps/RandomZLevels/beach.dmm
|
||||
#_maps/RandomZLevels/Academy.dmm
|
||||
#_maps/RandomZLevels/wildwest.dmm
|
||||
#_maps/RandomZLevels/challenge.dmm
|
||||
#_maps/RandomZLevels/listeningpost.dmm
|
||||
#_maps/RandomZLevels/spacehotel.dmm
|
||||
#_maps/RandomZLevels/centcomAway.dmm
|
||||
@@ -1,4 +1,4 @@
|
||||
"a" = (/turf/space,/area)
|
||||
"a" = (/turf/space,/area/space)
|
||||
"b" = (/turf/simulated/mineral,/area/mine/unexplored)
|
||||
"c" = (/turf/simulated/wall/r_wall,/area/awaymission/listeningpost)
|
||||
"d" = (/turf/simulated/floor/plating,/area/awaymission/listeningpost)
|
||||
@@ -18,7 +18,7 @@
|
||||
"r" = (/obj/machinery/door/airlock,/obj/structure/safe/floor,/obj/item/weapon/paper{info = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilised your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear it's ugly head again. -Donk Co. Operative #451"; name = "odd report"},/obj/item/weapon/gun/projectile/automatic/silenced,/obj/item/weapon/silencer,/turf/simulated/floor,/area/awaymission/listeningpost)
|
||||
"s" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/mineral,/area/mine/unexplored)
|
||||
"t" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/mineral,/area/mine/unexplored)
|
||||
"u" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating/airless,/area)
|
||||
"u" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
|
||||
"v" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor,/area/awaymission/listeningpost)
|
||||
"w" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor,/area/awaymission/listeningpost)
|
||||
"x" = (/obj/machinery/vending/snack,/turf/simulated/floor,/area/awaymission/listeningpost)
|
||||
@@ -1,5 +1,5 @@
|
||||
"aa" = (/turf/simulated/mineral/random,/area)
|
||||
"ab" = (/turf/space,/area)
|
||||
"aa" = (/turf/simulated/mineral/random,/area/space)
|
||||
"ab" = (/turf/space,/area/space)
|
||||
"ac" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate2)
|
||||
"ad" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (NORTH)"; icon_state = "propulsion_r"; dir = 1},/turf/space,/area/awaymission/spacebattle/syndicate2)
|
||||
"ae" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (NORTH)"; icon_state = "propulsion"; dir = 1},/turf/space,/area/awaymission/spacebattle/syndicate2)
|
||||
@@ -441,28 +441,28 @@
|
||||
"iy" = (/obj/effect/landmark/corpse/syndicatesoldier,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/floor{tag = "icon-damaged2"; icon_state = "damaged2"},/area/awaymission/spacebattle/cruiser)
|
||||
"iz" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r (EAST)"; icon_state = "burst_r"; dir = 4},/turf/space,/area/awaymission/spacebattle/cruiser)
|
||||
"iA" = (/obj/effect/landmark/corpse/engineer{mobname = "Mercutio"; name = "Mercutio"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser)
|
||||
"iB" = (/obj/structure/lattice,/turf/space,/area)
|
||||
"iC" = (/obj/effect/landmark/corpse/syndicatesoldier,/turf/space,/area)
|
||||
"iD" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area)
|
||||
"iE" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area)
|
||||
"iF" = (/obj/machinery/sleeper,/turf/simulated/floor/airless{tag = "icon-floor4 (SOUTHWEST)"; icon_state = "floor4"; dir = 10},/area)
|
||||
"iG" = (/turf/simulated/floor/airless{tag = "icon-floor4 (SOUTHWEST)"; icon_state = "floor4"; dir = 10},/area)
|
||||
"iH" = (/obj/effect/landmark/corpse/syndicatesoldier,/turf/simulated/floor/airless{tag = "icon-floor4 (SOUTHWEST)"; icon_state = "floor4"; dir = 10},/area)
|
||||
"iI" = (/turf/simulated/mineral/clown,/area)
|
||||
"iJ" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/airless{tag = "icon-floor4 (SOUTHWEST)"; icon_state = "floor4"; dir = 10},/area)
|
||||
"iK" = (/obj/item/stack/rods,/turf/simulated/floor/airless{tag = "icon-floor4 (SOUTHWEST)"; icon_state = "floor4"; dir = 10},/area)
|
||||
"iB" = (/obj/structure/lattice,/turf/space,/area/space)
|
||||
"iC" = (/obj/effect/landmark/corpse/syndicatesoldier,/turf/space,/area/space)
|
||||
"iD" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/space)
|
||||
"iE" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/space)
|
||||
"iF" = (/obj/machinery/sleeper,/turf/simulated/floor/airless{tag = "icon-floor4 (SOUTHWEST)"; icon_state = "floor4"; dir = 10},/area/space)
|
||||
"iG" = (/turf/simulated/floor/airless{tag = "icon-floor4 (SOUTHWEST)"; icon_state = "floor4"; dir = 10},/area/space)
|
||||
"iH" = (/obj/effect/landmark/corpse/syndicatesoldier,/turf/simulated/floor/airless{tag = "icon-floor4 (SOUTHWEST)"; icon_state = "floor4"; dir = 10},/area/space)
|
||||
"iI" = (/turf/simulated/mineral/clown,/area/space)
|
||||
"iJ" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/airless{tag = "icon-floor4 (SOUTHWEST)"; icon_state = "floor4"; dir = 10},/area/space)
|
||||
"iK" = (/obj/item/stack/rods,/turf/simulated/floor/airless{tag = "icon-floor4 (SOUTHWEST)"; icon_state = "floor4"; dir = 10},/area/space)
|
||||
"iL" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate5)
|
||||
"iM" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/spacebattle/syndicate5)
|
||||
"iN" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate5)
|
||||
"iO" = (/obj/machinery/sleeper,/turf/simulated/floor/airless,/area)
|
||||
"iO" = (/obj/machinery/sleeper,/turf/simulated/floor/airless,/area/space)
|
||||
"iP" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate5)
|
||||
"iQ" = (/obj/machinery/computer/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate5)
|
||||
"iR" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area)
|
||||
"iS" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area)
|
||||
"iR" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/space)
|
||||
"iS" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/space)
|
||||
"iT" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate5)
|
||||
"iU" = (/obj/structure/stool/bed/chair{dir = 1},/mob/living/simple_animal/hostile/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate5)
|
||||
"iV" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area)
|
||||
"iW" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area)
|
||||
"iV" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/space)
|
||||
"iW" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/space)
|
||||
"iX" = (/obj/machinery/door/airlock/external,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate5)
|
||||
"iY" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate5)
|
||||
"iZ" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate5)
|
||||
@@ -480,7 +480,7 @@
|
||||
"jl" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate6)
|
||||
"jm" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/syndicate6)
|
||||
"jn" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/awaymission/spacebattle/syndicate6)
|
||||
"jo" = (/turf/simulated/floor/plating/asteroid/airless,/area)
|
||||
"jo" = (/turf/simulated/floor/plating/asteroid/airless,/area/space)
|
||||
"jp" = (/turf/simulated/wall/mineral/plasma,/area/awaymission/spacebattle/secret)
|
||||
"jq" = (/turf/simulated/floor{tag = "icon-alienvault"; icon_state = "alienvault"},/area/awaymission/spacebattle/secret)
|
||||
"jr" = (/obj/machinery/door/airlock/plasma,/turf/simulated/wall/mineral/plasma,/area/awaymission/spacebattle/secret)
|
||||
@@ -1,5 +1,5 @@
|
||||
"aa" = (/turf/space,/area)
|
||||
"ab" = (/turf/unsimulated/wall,/area)
|
||||
"aa" = (/turf/space,/area/space)
|
||||
"ab" = (/turf/unsimulated/wall,/area/space)
|
||||
"ac" = (/turf/unsimulated/wall,/area/awaymission)
|
||||
"ad" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/wall,/area/awaymission)
|
||||
"ae" = (/obj/machinery/power/apc{step_y = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/unsimulated/wall,/area/awaymission)
|
||||
@@ -62,13 +62,13 @@
|
||||
"bj" = (/obj/structure/mirror,/obj/structure/sink{icon_state = "sink"; dir = 4; pixel_x = -12; pixel_y = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission)
|
||||
"bk" = (/obj/machinery/door/airlock/gold{id_tag = "Gold Suite"; name = "Gold Suite"},/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"bl" = (/obj/machinery/door/airlock/silver{id_tag = "Silver Suite"; name = "Silver Suite"},/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"bm" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area)
|
||||
"bm" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/space)
|
||||
"bn" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"bo" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area)
|
||||
"bo" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/space)
|
||||
"bp" = (/turf/simulated/floor/carpet{icon_state = "carpetsymbol"},/area/awaymission)
|
||||
"bq" = (/obj/machinery/light,/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"br" = (/obj/structure/stool/bed/chair/comfy,/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"bs" = (/turf/unsimulated/wall/fakeglass,/area)
|
||||
"bs" = (/turf/unsimulated/wall/fakeglass,/area/space)
|
||||
"bt" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"bu" = (/obj/machinery/light{dir = 8},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"bv" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet,/area/awaymission)
|
||||
@@ -93,7 +93,7 @@
|
||||
"bO" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"bP" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"bQ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"bR" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area)
|
||||
"bR" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/space)
|
||||
"bS" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"bT" = (/obj/structure/window/basic,/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"bU" = (/obj/machinery/door/window/southright,/turf/simulated/floor/carpet,/area/awaymission)
|
||||
@@ -240,13 +240,13 @@
|
||||
"eF" = (/obj/structure/table/woodentable,/obj/item/weapon/clipboard,/obj/item/weapon/paper,/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"eG" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"eH" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/turf/simulated/floor/carpet,/area/awaymission)
|
||||
"eI" = (/turf/unsimulated/wall/fakeglass{dir = 10; icon_state = "fakewindows"},/area)
|
||||
"eJ" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area)
|
||||
"eK" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area)
|
||||
"eI" = (/turf/unsimulated/wall/fakeglass{dir = 10; icon_state = "fakewindows"},/area/space)
|
||||
"eJ" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/space)
|
||||
"eK" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/space)
|
||||
"eL" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/simulated/floor/plating,/area/awaymission)
|
||||
"eM" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/awaymission)
|
||||
"eN" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaymission)
|
||||
"eO" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area)
|
||||
"eO" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/space)
|
||||
"eP" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaymission)
|
||||
"eQ" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/plating,/area/awaymission)
|
||||
"eR" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/awaymission)
|
||||
@@ -1,4 +1,4 @@
|
||||
"aa" = (/turf/space,/area)
|
||||
"aa" = (/turf/space,/area/space)
|
||||
"ab" = (/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless,/area/awaymission/northblock)
|
||||
"ac" = (/obj/machinery/power/tracker,/turf/simulated/floor/plating,/area/awaymission/northblock)
|
||||
"ad" = (/obj/machinery/power/solar/fake,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/awaymission/northblock)
|
||||
@@ -8,7 +8,7 @@
|
||||
"ah" = (/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/awaymission/northblock)
|
||||
"ai" = (/obj/machinery/power/solar/fake,/turf/space,/area/awaymission/northblock)
|
||||
"aj" = (/turf/simulated/wall,/area/awaymission/northblock)
|
||||
"ak" = (/obj/structure/lattice,/turf/space,/area)
|
||||
"ak" = (/obj/structure/lattice,/turf/space,/area/space)
|
||||
"al" = (/obj/machinery/door/window/westright,/turf/simulated/floor/airless,/area/awaymission/northblock)
|
||||
"am" = (/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/awaymission/northblock)
|
||||
"an" = (/turf/simulated/floor/airless{icon_state = "damaged5"},/area/awaymission/northblock)
|
||||
@@ -49,8 +49,8 @@
|
||||
"aW" = (/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/awaymission/northblock)
|
||||
"aX" = (/obj/machinery/portable_atmospherics/canister/toxins{destroyed = 1},/turf/simulated/shuttle/plating,/area/awaymission/syndishuttle)
|
||||
"aY" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/awaymission/syndishuttle)
|
||||
"aZ" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area)
|
||||
"ba" = (/turf/simulated/wall,/area)
|
||||
"aZ" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/space)
|
||||
"ba" = (/turf/simulated/wall,/area/space)
|
||||
"bb" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/airless,/area/awaymission/northblock)
|
||||
"bc" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/airless{icon_state = "damaged3"},/area/awaymission/northblock)
|
||||
"bd" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l (EAST)"; icon_state = "burst_l"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/syndishuttle)
|
||||
@@ -204,7 +204,7 @@
|
||||
"dV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/awaymission/northblock)
|
||||
"dW" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"dX" = (/obj/item/weapon/table_parts,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"dY" = (/obj/structure/table,/obj/item/weapon/cable_coil{amount = 5},/obj/item/weapon/screwdriver,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"dY" = (/obj/structure/table,/obj/item/stack/cable_coil{amount = 5},/obj/item/weapon/screwdriver,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"dZ" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"ea" = (/obj/machinery/light,/obj/structure/computerframe{anchored = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"eb" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
@@ -248,7 +248,7 @@
|
||||
"eN" = (/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "North Block APC"; pixel_x = 28},/obj/structure/cable,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/awaymission/northblock)
|
||||
"eO" = (/obj/structure/window/reinforced,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/northblock)
|
||||
"eP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/awaymission/northblock)
|
||||
"eQ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/grown/potato,/obj/item/weapon/cable_coil{amount = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"eQ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/grown/potato,/obj/item/stack/cable_coil{amount = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"eR" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"eS" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/computerframe{anchored = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"eT" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/book/manual/research_and_development,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
@@ -271,7 +271,7 @@
|
||||
"fk" = (/obj/structure/table,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/northblock)
|
||||
"fl" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/awaymission/northblock)
|
||||
"fm" = (/obj/machinery/door/airlock/gold{name = "Airlock"},/turf/simulated/floor,/area/awaymission/northblock)
|
||||
"fn" = (/obj/structure/table,/obj/item/weapon/cable_coil,/obj/item/weapon/cable_coil{pixel_x = -3; pixel_y = 5},/obj/item/weapon/cell/crap,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"fn" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 5},/obj/item/weapon/stock_parts/cell/crap,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"fo" = (/obj/structure/table,/obj/item/weapon/stock_parts/matter_bin{pixel_x = 3},/obj/item/weapon/stock_parts/matter_bin{pixel_x = -3},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"fp" = (/obj/machinery/door/window/eastleft{name = "Windoor"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
"fq" = (/obj/structure/target_stake,/obj/item/target/syndicate,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/research)
|
||||
@@ -362,7 +362,7 @@
|
||||
"gX" = (/obj/effect/decal/remains/human,/turf/simulated/floor{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/awaymission/arrivalblock)
|
||||
"gY" = (/obj/machinery/computer/security,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/awaymission/arrivalblock)
|
||||
"gZ" = (/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/awaymission/arrivalblock)
|
||||
"ha" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/melee/baton,/obj/item/clothing/head/helmet/warden,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/awaymission/arrivalblock)
|
||||
"ha" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/weapon/melee/baton,/obj/item/clothing/head/helmet/warden,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/awaymission/arrivalblock)
|
||||
"hb" = (/obj/structure/closet/wardrobe/red,/obj/machinery/light{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/awaymission/arrivalblock)
|
||||
"hc" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/awaymission/arrivalblock)
|
||||
"hd" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor{icon_state = "red"; dir = 5},/area/awaymission/arrivalblock)
|
||||
@@ -481,7 +481,7 @@
|
||||
"jm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock)
|
||||
"jn" = (/obj/item/ammo_casing/a12mm{pixel_y = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock)
|
||||
"jo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock)
|
||||
"jp" = (/obj/structure/sign/redcross{pixel_y = -32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock)
|
||||
"jp" = (/obj/structure/sign/bluecross{pixel_y = -32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock)
|
||||
"jq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock)
|
||||
"jr" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock)
|
||||
"js" = (/obj/item/clothing/head/helmet/space/syndicate,/turf/simulated/floor/airless,/area/awaymission/southblock)
|
||||
@@ -1,4 +1,4 @@
|
||||
"aa" = (/turf/space,/area)
|
||||
"aa" = (/turf/space,/area/space)
|
||||
"ab" = (/turf/simulated/shuttle/wall,/area/awaymission/wwvault)
|
||||
"ac" = (/turf/simulated/floor/engine/cult,/area/awaymission/wwvault)
|
||||
"ad" = (/obj/structure/cult/pylon,/turf/simulated/floor/engine/cult,/area/awaymission/wwvault)
|
||||
@@ -30,9 +30,9 @@
|
||||
"aD" = (/turf/simulated/floor/carpet,/area/awaymission/wwvault)
|
||||
"aE" = (/mob/living/simple_animal/hostile/faithless,/turf/simulated/floor/carpet,/area/awaymission/wwvault)
|
||||
"aF" = (/obj/machinery/door/airlock/vault{locked = 1},/turf/simulated/floor/engine/cult,/area/awaymission/wwvaultdoors)
|
||||
"aG" = (/turf/simulated/mineral,/area)
|
||||
"aH" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/space,/area)
|
||||
"aI" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/mineral,/area)
|
||||
"aG" = (/turf/simulated/mineral,/area/space)
|
||||
"aH" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/space,/area/space)
|
||||
"aI" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/mineral,/area/space)
|
||||
"aJ" = (/obj/machinery/door/airlock/vault{locked = 1},/turf/simulated/floor/engine/cult,/area/awaymission/wwvault)
|
||||
"aK" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/engine/cult,/area/awaymission/wwvault)
|
||||
"aL" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/mineral,/area/awaymission/wwmines)
|
||||
@@ -56,7 +56,7 @@
|
||||
"bd" = (/obj/machinery/door/airlock/sandstone,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
|
||||
"be" = (/obj/item/ammo_box/a12mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"bf" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"bg" = (/turf/simulated/wall/mineral/sandstone,/area)
|
||||
"bg" = (/turf/simulated/wall/mineral/sandstone,/area/space)
|
||||
"bh" = (/obj/structure/largecrate,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
|
||||
"bi" = (/obj/effect/landmark/corpse/miner/rig,/obj/effect/mine/dnascramble,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"bj" = (/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
@@ -67,12 +67,12 @@
|
||||
"bo" = (/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
|
||||
"bp" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
"bq" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
|
||||
"br" = (/obj/structure/lattice,/turf/space,/area)
|
||||
"br" = (/obj/structure/lattice,/turf/space,/area/space)
|
||||
"bs" = (/obj/effect/mine/dnascramble,/obj/item/ammo_box/a12mm,/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
"bt" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
|
||||
"bu" = (/turf/simulated/wall/mineral/sandstone,/area/awaymission/wwmines)
|
||||
"bv" = (/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area)
|
||||
"bw" = (/obj/structure/lattice,/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area)
|
||||
"bv" = (/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area/space)
|
||||
"bw" = (/obj/structure/lattice,/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area/space)
|
||||
"bx" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
|
||||
"by" = (/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
|
||||
"bz" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
|
||||
@@ -90,15 +90,15 @@
|
||||
"bL" = (/obj/structure/table/woodentable,/obj/machinery/microwave,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
|
||||
"bM" = (/obj/structure/table/woodentable,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
|
||||
"bN" = (/obj/structure/closet/secure_closet/freezer/meat,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
|
||||
"bO" = (/obj/structure/lattice,/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/turf/space,/area)
|
||||
"bO" = (/obj/structure/lattice,/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/turf/space,/area/space)
|
||||
"bP" = (/turf/simulated/wall/mineral/sandstone,/area/awaymission/wwgov)
|
||||
"bQ" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov)
|
||||
"bR" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/obj/structure/grille,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov)
|
||||
"bS" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/obj/structure/grille,/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov)
|
||||
"bT" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/space,/area)
|
||||
"bT" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/space,/area/space)
|
||||
"bU" = (/obj/structure/stool/bed/chair/wood/normal{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
|
||||
"bV" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
|
||||
"bW" = (/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/turf/space,/area)
|
||||
"bW" = (/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/turf/space,/area/space)
|
||||
"bX" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov)
|
||||
"bY" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov)
|
||||
"bZ" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand2"; icon_state = "ironsand2"},/area/awaymission/wwgov)
|
||||
@@ -121,8 +121,8 @@
|
||||
"cq" = (/obj/structure/table/woodentable,/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov)
|
||||
"cr" = (/obj/structure/table/woodentable,/obj/machinery/microwave,/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov)
|
||||
"cs" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov)
|
||||
"ct" = (/obj/structure/lattice,/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/space,/area)
|
||||
"cu" = (/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area)
|
||||
"ct" = (/obj/structure/lattice,/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/space,/area/space)
|
||||
"cu" = (/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area/space)
|
||||
"cv" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/carpet,/area/awaymission/wwmines)
|
||||
"cw" = (/turf/simulated/floor/carpet,/area/awaymission/wwgov)
|
||||
"cx" = (/obj/item/weapon/moneybag,/turf/simulated/floor/carpet,/area/awaymission/wwgov)
|
||||
@@ -168,7 +168,7 @@
|
||||
"dl" = (/obj/structure/sign/maltesefalcon/right,/turf/simulated/wall/mineral/sandstone,/area/awaymission/wwmines)
|
||||
"dm" = (/obj/structure/mineral_door/wood{tag = "icon-woodopening"; icon_state = "woodopening"},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"dn" = (/obj/structure/mineral_door/wood{tag = "icon-woodopening"; icon_state = "woodopening"},/obj/effect/decal/cleanable/blood/tracks,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"do" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area)
|
||||
"do" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
|
||||
"dp" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/wood,/area/awaymission/wwgov)
|
||||
"dq" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov)
|
||||
"dr" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov)
|
||||
@@ -209,12 +209,12 @@
|
||||
"ea" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/donut/jelly,/turf/simulated/floor/carpet,/area/awaymission/wwmines)
|
||||
"eb" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/donut/normal,/turf/simulated/floor/carpet,/area/awaymission/wwmines)
|
||||
"ec" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/carpet,/area/awaymission/wwmines)
|
||||
"ed" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/turf/space,/area)
|
||||
"ee" = (/obj/structure/lattice,/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/turf/space,/area)
|
||||
"ef" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/space,/area)
|
||||
"ed" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/turf/space,/area/space)
|
||||
"ee" = (/obj/structure/lattice,/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/turf/space,/area/space)
|
||||
"ef" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
|
||||
"eg" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov)
|
||||
"eh" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov)
|
||||
"ei" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/space,/area)
|
||||
"ei" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/space,/area/space)
|
||||
"ej" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"ek" = (/obj/effect/mine/plasma,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
|
||||
"el" = (/obj/effect/decal/cleanable/blood,/obj/machinery/washing_machine,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
|
||||
@@ -282,8 +282,8 @@
|
||||
"fv" = (/obj/structure/stool/bed/chair/wood/normal{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/awaymission/wwmines)
|
||||
"fw" = (/obj/structure/table/woodentable,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/awaymission/wwmines)
|
||||
"fx" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/awaymission/wwmines)
|
||||
"fy" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area)
|
||||
"fz" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area)
|
||||
"fy" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area/space)
|
||||
"fz" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area/space)
|
||||
"fA" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/grille,/obj/structure/window/reinforced,/turf/simulated/floor,/area/awaymission/wwrefine)
|
||||
"fB" = (/obj/effect/mine/plasma,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"fC" = (/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibdown1"; icon_state = "gibdown1"},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
@@ -297,7 +297,7 @@
|
||||
"fK" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/turf/simulated/floor/grass,/area/awaymission/wwgov)
|
||||
"fL" = (/turf/simulated/floor/grass,/area/awaymission/wwgov)
|
||||
"fM" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/turf/simulated/floor/grass,/area/awaymission/wwgov)
|
||||
"fN" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/lattice,/turf/space,/area)
|
||||
"fN" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/lattice,/turf/space,/area/space)
|
||||
"fO" = (/mob/living/simple_animal/hostile/syndicate,/turf/simulated/floor,/area/awaymission/wwrefine)
|
||||
"fP" = (/obj/structure/mecha_wreckage/ripley/deathripley{anchored = 1},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"fQ" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
@@ -312,8 +312,8 @@
|
||||
"fZ" = (/obj/item/weapon/paper{info = "The Vault...it just keeps growing and growing. I went on my daily walk through the garden and now its just right outside the mansion... a few days ago it was only barely visible. But whatever is inside...its calling to me."; name = "Planer Sauls' Journal: Page 7"},/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
"ga" = (/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/simulated/floor/grass,/area/awaymission/wwgov)
|
||||
"gb" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/simulated/floor/grass,/area/awaymission/wwgov)
|
||||
"gc" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/simulated/floor,/area)
|
||||
"gd" = (/turf/simulated/floor,/area)
|
||||
"gc" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/simulated/floor,/area/space)
|
||||
"gd" = (/turf/simulated/floor,/area/space)
|
||||
"ge" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor,/area/awaymission/wwrefine)
|
||||
"gf" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
"gg" = (/obj/structure/table/woodentable,/obj/item/weapon/gun/projectile/revolver/russian,/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
In this file we modify the job datums when the ministation.dm file is included/ticked.
|
||||
Since we will be overriden by the job datums, we have to modify the variables in the constructor.
|
||||
*/
|
||||
|
||||
|
||||
/datum/job/New()
|
||||
..()
|
||||
supervisors = "the captain and the head of personnel"
|
||||
|
||||
/datum/job/assistant // Here so assistant appears on the top of the select job list.
|
||||
|
||||
// Command
|
||||
|
||||
/datum/job/captain/New()
|
||||
..()
|
||||
supervisors = "Nanotrasen and Central Command"
|
||||
|
||||
/datum/job/hop/New()
|
||||
..()
|
||||
supervisors = "the captain and Central Command"
|
||||
|
||||
/datum/job/hop/get_access()
|
||||
return get_all_accesses()
|
||||
|
||||
// Cargo
|
||||
|
||||
/datum/job/cargo_tech/New()
|
||||
..()
|
||||
total_positions = 3
|
||||
spawn_positions = 3
|
||||
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station)
|
||||
minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mining, access_mint, access_mining_station, access_mailsorting)
|
||||
|
||||
// Engineering
|
||||
|
||||
/datum/job/engineer/New()
|
||||
..()
|
||||
total_positions = 4
|
||||
spawn_positions = 4
|
||||
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_tcomsat)
|
||||
minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_tcomsat, access_atmospherics)
|
||||
|
||||
// Medical
|
||||
|
||||
/datum/job/doctor/New()
|
||||
..()
|
||||
total_positions = 4
|
||||
spawn_positions = 4
|
||||
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
||||
minimal_access = list(access_medical, access_morgue, access_surgery)
|
||||
|
||||
|
||||
/datum/job/chemist/New()
|
||||
..()
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
||||
minimal_access = list(access_medical, access_chemistry)
|
||||
|
||||
// Science
|
||||
|
||||
/datum/job/scientist/New()
|
||||
..()
|
||||
total_positions = 4
|
||||
spawn_positions = 4
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology)
|
||||
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenobiology, access_robotics)
|
||||
|
||||
// Security
|
||||
|
||||
/datum/job/detective/New()
|
||||
..()
|
||||
supervisors = "no one but yourself"
|
||||
access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court, access_engine)
|
||||
minimal_access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
|
||||
|
||||
/datum/job/officer/New()
|
||||
..()
|
||||
total_positions = 4
|
||||
spawn_positions = 4
|
||||
access = list(access_security, access_sec_doors, access_brig, access_court)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_court)
|
||||
@@ -0,0 +1,55 @@
|
||||
// Removed Jobs, setting config_check to 0 will stop them from being initialised.
|
||||
|
||||
/datum/job/chef/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/hydro/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/qm/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/mining/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/mime/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/librarian/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/lawyer/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/chaplain/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/chief_engineer/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/atmos/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/cmo/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/geneticist/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/virologist/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/rd/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/roboticist/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/hos/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/warden/config_check()
|
||||
return 0
|
||||
|
||||
/datum/job/cyborg/config_check()
|
||||
return 0
|
||||
@@ -0,0 +1,19 @@
|
||||
// Override global variables here!
|
||||
|
||||
var/datum/map_config/MiniStation = new()
|
||||
|
||||
/datum/map_config/New()
|
||||
..()
|
||||
accessable_z_levels = list("1" = 20, "4" = 40, "5" = 40) // Restrict the map to the non-empty z levels, which were all combined in MiniStation
|
||||
|
||||
// Enable all headsets by default in MiniStation, we don't worry about spam here.
|
||||
// Also both heads are in charge of everything, give them all department channels.
|
||||
|
||||
/obj/item/device/encryptionkey/heads/New()
|
||||
..()
|
||||
// Give all channels and turn everything on
|
||||
channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1)
|
||||
|
||||
/obj/item/weapon/paper/generator
|
||||
name = "paper - 'generator instructions'"
|
||||
info = "<h2>How to setup the Thermo-Generator</h2><ol> <li>To the top right is a room full of canisters; to the bottom there is a room full of pipes. Connect C02 canisters to the pipe room's top connector ports, the cansisters will help act as a buffer so only remove them when refilling the gas..</li> <li>Connect 3 plasma and 2 oxygen canisters to the bottom ports of the pipe room.</li> <li>Turn on all the pumps and valves in the room except for the one connected to the yellow pipe and red pipe, no adjustments to the pump strength needed.</li> <li>Look into the camera monitor to see the burn chamber. When it is full of plasma, press the igniter button.</li> <li>Setup the SMES cells in the North West of Engineering and set an input of half the max; and an output that is half the input.</li></ol>Well done, you should have a functioning generator generating power. If the generator stops working, and there is enough gas and it's hot and cold, it might mean there is too much pressure and you need to turn on the pump that is connected to the red and yellow pipes to release the pressure. Make sure you don't take out too much pressure though.<br>You optimize the generator you must work out how much power your station is using and lowering the circulation pumps enough so that the generator doesn't create excess power, and it will allow the generator to powering the station for a longer duration, without having to replace the canisters. "
|
||||
@@ -0,0 +1,6 @@
|
||||
/*
|
||||
The contents of these files should not be ticked/included while compiling.
|
||||
|
||||
These files are only included, and compiled, when \_maps\ministation.dm is included; as these files are necessary to run the MiniStation mod.
|
||||
You do not have to tick them yourself, it will be automatically done by the ministation.dm file.
|
||||
*/
|
||||
@@ -0,0 +1,38 @@
|
||||
/datum/supply_packs/engineering/oxygen
|
||||
name = "Oxygen Canister"
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/oxygen)
|
||||
cost = 15
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "oxygen canister crate"
|
||||
|
||||
/datum/supply_packs/engineering/toxins
|
||||
name = "Toxins Canister"
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/toxins)
|
||||
cost = 30
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "toxins canister crate"
|
||||
|
||||
/datum/supply_packs/engineering/nitrogen
|
||||
name = "Nitrogen Canister"
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/nitrogen)
|
||||
cost = 20
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "nitrogen canister crate"
|
||||
|
||||
/datum/supply_packs/engineering/carbon_dio
|
||||
name = "Carbon Dioxide Canister"
|
||||
contains = list(/obj/machinery/portable_atmospherics/canister/carbon_dioxide)
|
||||
cost = 35
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "carbon dioxide canister crate"
|
||||
|
||||
|
||||
/obj/machinery/hydroponics/unattached
|
||||
anchored = 0
|
||||
|
||||
/datum/supply_packs/organic/hydroponics/hydro_tray
|
||||
name = "Hydroponics Tray"
|
||||
contains = list(/obj/machinery/hydroponics/unattached)
|
||||
cost = 10
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "hydroponics tray crate"
|
||||
@@ -0,0 +1,18 @@
|
||||
/obj/machinery/telecomms/receiver/preset_left/ministation
|
||||
name = "Receiver"
|
||||
freq_listening = list()
|
||||
|
||||
/obj/machinery/telecomms/bus/preset_one/ministation
|
||||
name = "Bus"
|
||||
autolinkers = list("processor1", "common")
|
||||
freq_listening = list()
|
||||
|
||||
/obj/machinery/telecomms/processor/preset_one/ministation
|
||||
name = "Processor"
|
||||
|
||||
/obj/machinery/telecomms/server/presets/common/ministation/New()
|
||||
..()
|
||||
freq_listening = list()
|
||||
|
||||
/obj/machinery/telecomms/broadcaster/preset_left/ministation
|
||||
name = "Broadcaster"
|
||||
@@ -0,0 +1,37 @@
|
||||
// Modified uplink items to discourage tator murderboning
|
||||
|
||||
/datum/uplink_item/dangerous/revolver/New()
|
||||
..()
|
||||
cost = 10
|
||||
|
||||
/datum/uplink_item/dangerous/crossbow/New()
|
||||
..()
|
||||
cost = 8
|
||||
|
||||
/datum/uplink_item/dangerous/sword/New()
|
||||
..()
|
||||
cost = 7
|
||||
|
||||
/datum/uplink_item/dangerous/syndicate_minibomb/New()
|
||||
..()
|
||||
cost = 6
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/para_pen/New()
|
||||
..()
|
||||
item = null // Disabled
|
||||
|
||||
/datum/uplink_item/stealthy_tools/syndigolashes/New()
|
||||
..()
|
||||
cost = 5
|
||||
|
||||
/datum/uplink_item/device_tools/plastic_explosives/New()
|
||||
..()
|
||||
item = null // Disabled
|
||||
|
||||
/datum/uplink_item/device_tools/singularity_beacon/New()
|
||||
..()
|
||||
cost = 4
|
||||
|
||||
/datum/uplink_item/device_tools/syndicate_bomb/New()
|
||||
..()
|
||||
item = null // Disabled
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,12 @@
|
||||
#if !defined(MAP_FILE)
|
||||
|
||||
#include "map_files\MetaStation.v39I.dmm"
|
||||
|
||||
#define MAP_FILE "MetaStation.v39I.dmm"
|
||||
#define MAP_NAME "MetaStation"
|
||||
|
||||
#elif !defined(MAP_OVERRIDE)
|
||||
|
||||
#warn a map has already been included, ignoring MetaStation.
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
MiniStation FAQ - Mod Created By Giacom
|
||||
|
||||
|
||||
What is it?
|
||||
|
||||
A mod of tgstation 13 that is modified for low population servers; with simplified jobs, maps, duties and command structure.
|
||||
|
||||
How do I run it?
|
||||
|
||||
Simply tick this file, and only this file in the _maps folder, then compile and you will be running MiniStation.
|
||||
|
||||
Who is the target audience?
|
||||
|
||||
Server hosters who want to host a server for a player count of around 5 to 20 people.
|
||||
|
||||
What about the map?
|
||||
|
||||
The map has been created from the ground up with population size in mind.
|
||||
|
||||
What about the jobs?
|
||||
|
||||
Many jobs have been combined or just plainly cut out. These are the remaining jobs with their duties next to them.
|
||||
|
||||
* Captain - Make sure your station is running.
|
||||
* HoP - You're second in command, protect the Captain and be his right hand man.
|
||||
* Cargo Tech x3 - Running cargo bay and mining minerals for the station.
|
||||
* Bartender - Keeping the bar, serving drinks and food. Hire the unemployeed to grow food for you, or do it yourself.
|
||||
* Janitor - Cleans the station, removes litter and empty trash bins to be recycled by the crusher.
|
||||
* Station Engineer x4 - Keeping the power running and fixing station damage.
|
||||
* Security Officer x4 - Protecting the crewmembers and serving space law.
|
||||
* Detective - Using forensic science to help security officers catch criminals.
|
||||
* Scientist x4 - Research and development of new technologies and create bombs.
|
||||
* Medical Doctor x4 - Healing the crew, performing surgeries and cloning dead crew.
|
||||
* Chemist - Creating useful chemicals for the crew to use.
|
||||
* Clown - Create laughter and boost the morale of the crew. Honk!
|
||||
* Assistant xInfinity - Not in charge at all.
|
||||
|
||||
There will be 26 job slots (not including Assistant) available on MiniStation; the HoP can add more from his ID computer.
|
||||
There is a more simplified command system, with the Captain being the big boss and the HoP being second in command.
|
||||
The heads will have control over all departments and jobs.
|
||||
|
||||
What else has changed?
|
||||
|
||||
Changes to the uplinks were made to discourage murderboning, the rest is the same.
|
||||
|
||||
*/
|
||||
|
||||
#if !defined(MAP_FILE)
|
||||
|
||||
#include "map_files\MiniStation\MiniStation.dmm"
|
||||
|
||||
#define MAP_FILE "MiniStation.dmm"
|
||||
#define MAP_NAME "MiniStation"
|
||||
|
||||
#if !defined(MAP_OVERRIDE_FILES)
|
||||
#define MAP_OVERRIDE_FILES
|
||||
#include "map_files\MiniStation\misc.dm"
|
||||
#include "map_files\MiniStation\supplypacks.dm"
|
||||
#include "map_files\MiniStation\telecomms.dm"
|
||||
#include "map_files\MiniStation\uplink_item.dm"
|
||||
#include "map_files\MiniStation\job\jobs.dm"
|
||||
#include "map_files\MiniStation\job\removed.dm"
|
||||
#endif
|
||||
|
||||
#elif !defined(MAP_OVERRIDE)
|
||||
|
||||
#warn a map has already been included, ignoring ministation.
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,12 @@
|
||||
#if !defined(MAP_FILE)
|
||||
|
||||
#include "map_files\tgstation.2.1.2.dmm"
|
||||
|
||||
#define MAP_FILE "tgstation.2.1.2.dmm"
|
||||
#define MAP_NAME "TGstation 2"
|
||||
|
||||
#elif !defined(MAP_OVERRIDE)
|
||||
|
||||
#warn a map has already been included, ignoring /tg/station 2.
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,13 @@
|
||||
###################################################################################
|
||||
# This is a list of ckeys authorized to use client-side debug options: #
|
||||
# Profile, Reboot, Resume, Status, and Trace-client #
|
||||
# Of these, Profile is the most relevant as it allows you to easily #
|
||||
# retrieve information regarding the game's processing. #
|
||||
# If a ckey is on this list, and has proper admin privledges, #
|
||||
# they will be able to right-click the top of the client to access these options. # #
|
||||
# Case is not important for ckey. #
|
||||
###################################################################################
|
||||
aranclanos
|
||||
cheridan
|
||||
giacomand
|
||||
rockdtben
|
||||
@@ -24,6 +24,8 @@ obj/machinery/atmospherics/var/initialize_directions = 0
|
||||
obj/machinery/atmospherics/var/pipe_color
|
||||
|
||||
obj/machinery/atmospherics/process()
|
||||
if(gc_destroyed) //comments on /vg/ imply that GC'd pipes still process
|
||||
return PROCESS_KILL
|
||||
build_network()
|
||||
|
||||
obj/machinery/atmospherics/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
|
||||
@@ -83,7 +85,7 @@ obj/machinery/atmospherics/attackby(var/obj/item/weapon/W as obj, var/mob/user a
|
||||
for(var/obj/machinery/meter/meter in T)
|
||||
if(meter.target == src)
|
||||
new /obj/item/pipe_meter(T)
|
||||
del(meter)
|
||||
del(src)
|
||||
qdel(meter)
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -44,7 +44,7 @@ obj/machinery/atmospherics/binary
|
||||
|
||||
return null
|
||||
|
||||
Del()
|
||||
Destroy()
|
||||
loc = null
|
||||
|
||||
if(node1)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
//node1, air1, network1 correspond to input
|
||||
//node2, air2, network2 correspond to output
|
||||
//node2, air2, network2 correspond to input
|
||||
//node1, air1, network1 correspond to output
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/binary/circulator
|
||||
name = "circulator/heat exchanger"
|
||||
@@ -15,9 +16,12 @@
|
||||
anchored = 1.0
|
||||
density = 1
|
||||
|
||||
|
||||
proc/return_transfer_air()
|
||||
var/output_starting_pressure = air2.return_pressure()
|
||||
var/input_starting_pressure = air1.return_pressure()
|
||||
|
||||
|
||||
var/output_starting_pressure = air1.return_pressure()
|
||||
var/input_starting_pressure = air2.return_pressure()
|
||||
|
||||
if(output_starting_pressure >= input_starting_pressure-10)
|
||||
//Need at least 10 KPa difference to overcome friction in the mechanism
|
||||
@@ -25,17 +29,17 @@
|
||||
return null
|
||||
|
||||
//Calculate necessary moles to transfer using PV = nRT
|
||||
if(air1.temperature>0)
|
||||
if(air2.temperature>0)
|
||||
var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2
|
||||
|
||||
var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
|
||||
var/transfer_moles = pressure_delta*air1.volume/(air2.temperature * R_IDEAL_GAS_EQUATION)
|
||||
|
||||
last_pressure_delta = pressure_delta
|
||||
|
||||
//world << "pressure_delta = [pressure_delta]; transfer_moles = [transfer_moles];"
|
||||
|
||||
//Actually transfer the gas
|
||||
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
|
||||
var/datum/gas_mixture/removed = air2.remove(transfer_moles)
|
||||
|
||||
if(network1)
|
||||
network1.update = 1
|
||||
|
||||
@@ -64,9 +64,7 @@
|
||||
|
||||
return null
|
||||
|
||||
Del()
|
||||
loc = null
|
||||
|
||||
Destroy()
|
||||
if(connected_device)
|
||||
connected_device.disconnect()
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ obj/machinery/atmospherics/trinary/filter
|
||||
can_unwrench = 1
|
||||
|
||||
var/on = 0
|
||||
var/temp = null // -- TLE
|
||||
var/temp = null
|
||||
|
||||
var/target_pressure = ONE_ATMOSPHERE
|
||||
|
||||
@@ -138,7 +138,7 @@ Filter types:
|
||||
set_frequency(frequency)
|
||||
return ..()
|
||||
|
||||
obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE
|
||||
obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob)
|
||||
if(..())
|
||||
return
|
||||
|
||||
@@ -191,7 +191,7 @@ obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE
|
||||
onclose(user, "atmo_filter")
|
||||
return
|
||||
|
||||
obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) // -- TLE
|
||||
obj/machinery/atmospherics/trinary/filter/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
|
||||
@@ -52,9 +52,7 @@ obj/machinery/atmospherics/trinary
|
||||
|
||||
return null
|
||||
|
||||
Del()
|
||||
loc = null
|
||||
|
||||
Destroy()
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
del(network1)
|
||||
|
||||
@@ -28,9 +28,7 @@
|
||||
|
||||
return null
|
||||
|
||||
Del()
|
||||
loc = null
|
||||
|
||||
Destroy()
|
||||
if(node)
|
||||
node.disconnect(src)
|
||||
del(network)
|
||||
@@ -47,10 +45,20 @@
|
||||
for(var/obj/machinery/atmospherics/target in get_step(src,node_connect))
|
||||
if(target.initialize_directions & get_dir(target,src))
|
||||
node = target
|
||||
target.initialize()
|
||||
break
|
||||
build_network()
|
||||
|
||||
update_icon()
|
||||
|
||||
default_change_direction_wrench(mob/user, /obj/item/weapon/wrench/W)
|
||||
if(..())
|
||||
initialize_directions = dir
|
||||
if(node)
|
||||
disconnect(node)
|
||||
initialize()
|
||||
. = 1
|
||||
|
||||
build_network()
|
||||
if(!network && node)
|
||||
network = new /datum/pipe_network()
|
||||
@@ -82,6 +90,7 @@
|
||||
|
||||
disconnect(obj/machinery/atmospherics/reference)
|
||||
if(reference==node)
|
||||
node.disconnect(src)
|
||||
del(network)
|
||||
node = null
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
//2: Do not pass internal_pressure_bound
|
||||
//3: Do not pass either
|
||||
|
||||
var/welded = 0 // Added for aliens -- TLE
|
||||
var/welded = 0
|
||||
|
||||
var/frequency = 1439
|
||||
var/datum/radio_frequency/radio_connection
|
||||
@@ -314,22 +314,78 @@
|
||||
stat |= NOPOWER
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/Del()
|
||||
/obj/machinery/atmospherics/unary/vent_pump/Destroy()
|
||||
if(initial_loc)
|
||||
initial_loc.air_vent_info -= id_tag
|
||||
initial_loc.air_vent_names -= id_tag
|
||||
..()
|
||||
return
|
||||
|
||||
/*
|
||||
Alt-click to ventcrawl - Monkeys, aliens, and slimes
|
||||
This is a little buggy but somehow that just seems to plague ventcrawl.
|
||||
I am sorry, I don't know why.
|
||||
Alt-click to ventcrawl
|
||||
*/
|
||||
/obj/machinery/atmospherics/unary/vent_pump/AltClick(var/mob/living/carbon/ML)
|
||||
if(istype(ML))
|
||||
var/list/ventcrawl_verbs = list(/mob/living/carbon/monkey/verb/ventcrawl, /mob/living/carbon/alien/verb/ventcrawl, /mob/living/carbon/slime/verb/ventcrawl)
|
||||
if(length(ML.verbs & ventcrawl_verbs)) // alien queens have this removed, an istype would be complicated
|
||||
ML.handle_ventcrawl(src)
|
||||
return
|
||||
..()
|
||||
/obj/machinery/atmospherics/unary/vent_pump/AltClick(var/mob/living/L)
|
||||
if(!L.ventcrawler || !isliving(L) || !Adjacent(L))
|
||||
return
|
||||
if(L.stat)
|
||||
L << "You must be conscious to do this!"
|
||||
return
|
||||
if(L.lying)
|
||||
L << "You can't vent crawl while you're stunned!"
|
||||
return
|
||||
if(welded)
|
||||
L << "That vent is welded shut."
|
||||
return
|
||||
|
||||
if(!network || !network.normal_members.len)
|
||||
L << "This vent is not connected to anything."
|
||||
return
|
||||
|
||||
var/list/vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in network.normal_members)
|
||||
if(temp_vent.welded)
|
||||
continue
|
||||
if(temp_vent in loc)
|
||||
continue
|
||||
var/turf/T = get_turf(temp_vent)
|
||||
|
||||
if(!T || T.z != loc.z)
|
||||
continue
|
||||
|
||||
var/i = 1
|
||||
var/index = "[T.loc.name]\[[i]\]"
|
||||
while(index in vents)
|
||||
i++
|
||||
index = "[T.loc.name]\[[i]\]"
|
||||
vents[index] = temp_vent
|
||||
if(!vents.len)
|
||||
L << "<span class='warning'> There are no available vents to travel to, they could be welded. </span>"
|
||||
return
|
||||
|
||||
var/obj/selection = input(L,"Select a destination.", "Duct System") as null|anything in sortAssoc(vents)
|
||||
if(!selection) return
|
||||
|
||||
if(!Adjacent(L))
|
||||
return
|
||||
if(iscarbon(L) && L.ventcrawler < 2) // lesser ventcrawlers can't bring items
|
||||
for(var/obj/item/carried_item in L.contents)
|
||||
if(!istype(carried_item, /obj/item/weapon/implant))//If it's not an implant
|
||||
L << "<span class='warning'> You can't be carrying items or have items equipped when vent crawling!</span>"
|
||||
return
|
||||
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection]
|
||||
if(!target_vent)
|
||||
return
|
||||
|
||||
for(var/mob/O in viewers(L, null))
|
||||
O.show_message(text("<B>[L] scrambles into the ventillation ducts!</B>"), 1)
|
||||
|
||||
for(var/mob/O in hearers(target_vent,null))
|
||||
O.show_message("You hear something squeezing through the ventilation ducts.",2)
|
||||
|
||||
if(target_vent.welded) //the vent can be welded while they scrolled through the list.
|
||||
target_vent = src
|
||||
L << "<span class='warning'> The vent you were heading to appears to be welded.</span>"
|
||||
L.loc = target_vent.loc
|
||||
var/area/new_area = get_area(loc)
|
||||
if(new_area)
|
||||
new_area.Entered(L)
|
||||
|
||||
@@ -252,9 +252,8 @@
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/Del()
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/Destroy()
|
||||
if(initial_loc)
|
||||
initial_loc.air_scrub_info -= id_tag
|
||||
initial_loc.air_scrub_names -= id_tag
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -64,9 +64,7 @@ obj/machinery/atmospherics/valve
|
||||
|
||||
return null
|
||||
|
||||
Del()
|
||||
loc = null
|
||||
|
||||
Destroy()
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
del(network_node1)
|
||||
|
||||
@@ -90,7 +90,7 @@ obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction
|
||||
var/have_node2 = node2?1:0
|
||||
icon_state = "exposed[have_node1][have_node2]"
|
||||
if(!node1&&!node2)
|
||||
del(src)
|
||||
qdel(src)
|
||||
|
||||
initialize()
|
||||
for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions))
|
||||
|
||||
@@ -51,10 +51,11 @@ obj/machinery/atmospherics/pipe
|
||||
|
||||
return parent.return_network(reference)
|
||||
|
||||
Del()
|
||||
Destroy()
|
||||
del(parent)
|
||||
if(air_temporary)
|
||||
loc.assume_air(air_temporary)
|
||||
del(air_temporary)
|
||||
|
||||
..()
|
||||
|
||||
@@ -166,7 +167,7 @@ obj/machinery/atmospherics/pipe
|
||||
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new
|
||||
smoke.set_up(1,0, src.loc, 0)
|
||||
smoke.start()
|
||||
del(src)
|
||||
qdel(src)
|
||||
|
||||
proc/normalize_dir()
|
||||
if(dir==3)
|
||||
@@ -174,7 +175,7 @@ obj/machinery/atmospherics/pipe
|
||||
else if(dir==12)
|
||||
dir = 4
|
||||
|
||||
Del()
|
||||
Destroy()
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
if(node2)
|
||||
@@ -204,7 +205,7 @@ obj/machinery/atmospherics/pipe
|
||||
|
||||
else
|
||||
if(!node1&&!node2)
|
||||
del(src) //TODO: silent deleting looks weird
|
||||
qdel(src) //TODO: silent deleting looks weird
|
||||
var/have_node1 = node1?1:0
|
||||
var/have_node2 = node2?1:0
|
||||
icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]"
|
||||
@@ -447,7 +448,7 @@ obj/machinery/atmospherics/pipe
|
||||
|
||||
..()
|
||||
|
||||
Del()
|
||||
Destroy()
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
|
||||
@@ -531,7 +532,7 @@ obj/machinery/atmospherics/pipe
|
||||
else if (nodealert)
|
||||
nodealert = 0
|
||||
*/
|
||||
Del()
|
||||
Destroy()
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
|
||||
@@ -642,7 +643,7 @@ obj/machinery/atmospherics/pipe
|
||||
else if (nodealert)
|
||||
nodealert = 0
|
||||
*/
|
||||
Del()
|
||||
Destroy()
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
if(node2)
|
||||
@@ -701,7 +702,7 @@ obj/machinery/atmospherics/pipe
|
||||
icon_state = "manifold_[connected]_[unconnected]"
|
||||
|
||||
if(!connected)
|
||||
del(src)
|
||||
qdel(src)
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -1,645 +0,0 @@
|
||||
#define DEBUG
|
||||
|
||||
datum/air_group/var/marker
|
||||
datum/air_group/var/debugging = 0
|
||||
datum/pipe_network/var/marker
|
||||
|
||||
datum/gas_mixture
|
||||
var/turf/parent
|
||||
|
||||
/*
|
||||
turf/simulated
|
||||
New()
|
||||
..()
|
||||
|
||||
if(air)
|
||||
air.parent = src
|
||||
*/
|
||||
obj/machinery/door
|
||||
verb
|
||||
toggle_door()
|
||||
set src in world
|
||||
if(density)
|
||||
open()
|
||||
else
|
||||
close()
|
||||
|
||||
turf/space
|
||||
verb
|
||||
create_floor()
|
||||
set src in world
|
||||
new /turf/simulated/floor(src)
|
||||
|
||||
create_meteor(direction as num)
|
||||
set src in world
|
||||
|
||||
var/obj/effect/meteor/M = new( src )
|
||||
walk(M, direction,10)
|
||||
|
||||
|
||||
turf/simulated/wall
|
||||
verb
|
||||
create_floor()
|
||||
set src in world
|
||||
new /turf/simulated/floor(src)
|
||||
|
||||
obj/item/weapon/tank
|
||||
verb
|
||||
adjust_mixture(temperature as num, target_toxin_pressure as num, target_oxygen_pressure as num)
|
||||
set src in world
|
||||
if(!air_contents)
|
||||
usr << "\red ERROR: no gas_mixture associated with this tank"
|
||||
return null
|
||||
|
||||
air_contents.temperature = temperature
|
||||
air_contents.oxygen = target_oxygen_pressure*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
|
||||
air_contents.toxins = target_toxin_pressure*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
|
||||
|
||||
turf/simulated/floor
|
||||
verb
|
||||
parent_info()
|
||||
set src in world
|
||||
if(parent)
|
||||
usr << "<B>[x],[y] parent:</B> Processing: [parent.group_processing]"
|
||||
if(parent.members)
|
||||
usr << "Members: [parent.members.len]"
|
||||
else
|
||||
usr << "Members: None?"
|
||||
if(parent.borders)
|
||||
usr << "Borders: [parent.borders.len]"
|
||||
else
|
||||
usr << "Borders: None"
|
||||
if(parent.length_space_border)
|
||||
usr << "Space Borders: [parent.space_borders.len], Space Length: [parent.length_space_border]"
|
||||
else
|
||||
usr << "Space Borders: None"
|
||||
else
|
||||
usr << "\blue [x],[y] has no parent air group."
|
||||
|
||||
verb
|
||||
create_wall()
|
||||
set src in world
|
||||
new /turf/simulated/wall(src)
|
||||
verb
|
||||
adjust_mixture(temp as num, tox as num, oxy as num)
|
||||
set src in world
|
||||
var/datum/gas_mixture/stuff = return_air()
|
||||
stuff.temperature = temp
|
||||
stuff.toxins = tox
|
||||
stuff.oxygen = oxy
|
||||
|
||||
verb
|
||||
boom(inner_range as num, middle_range as num, outer_range as num)
|
||||
set src in world
|
||||
explosion(src,inner_range,middle_range,outer_range,outer_range)
|
||||
|
||||
verb
|
||||
flag_parent()
|
||||
set src in world
|
||||
if(parent)
|
||||
parent.debugging = !parent.debugging
|
||||
usr << "[parent.members.len] set to [parent.debugging]"
|
||||
verb
|
||||
small_explosion()
|
||||
set src in world
|
||||
explosion(src, 1, 2, 3, 3)
|
||||
|
||||
verb
|
||||
large_explosion()
|
||||
set src in world
|
||||
explosion(src, 3, 5, 7, 5)
|
||||
|
||||
obj/machinery/portable_atmospherics/canister
|
||||
verb/test_release()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
valve_open = 1
|
||||
release_pressure = 1000
|
||||
/*
|
||||
obj/machinery/atmospherics
|
||||
unary
|
||||
heat_reservoir
|
||||
verb
|
||||
toggle_power()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
on = !on
|
||||
|
||||
update_icon()
|
||||
adjust_temp(temp as num)
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
current_temperature = temp
|
||||
cold_sink
|
||||
verb
|
||||
toggle_power()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
on = !on
|
||||
|
||||
update_icon()
|
||||
adjust_temp(temp as num)
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
current_temperature = temp
|
||||
vent_pump
|
||||
verb
|
||||
toggle_power()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
on = !on
|
||||
|
||||
update_icon()
|
||||
|
||||
toggle_direction()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
pump_direction = !pump_direction
|
||||
|
||||
update_icon()
|
||||
|
||||
change_pressure_parameters()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
usr << "current settings: PC=[pressure_checks], EB=[external_pressure_bound], IB=[internal_pressure_bound]"
|
||||
|
||||
var/mode = input(usr, "Select an option:") in list("Bound External", "Bound Internal", "Bound Both")
|
||||
|
||||
switch(mode)
|
||||
if("Bound External")
|
||||
pressure_checks = 1
|
||||
external_pressure_bound = input(usr, "External Pressure Bound?") as num
|
||||
if("Bound Internal")
|
||||
pressure_checks = 2
|
||||
internal_pressure_bound = input(usr, "Internal Pressure Bound?") as num
|
||||
else
|
||||
pressure_checks = 3
|
||||
external_pressure_bound = input(usr, "External Pressure Bound?") as num
|
||||
internal_pressure_bound = input(usr, "Internal Pressure Bound?") as num
|
||||
|
||||
outlet_injector
|
||||
verb
|
||||
toggle_power()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
on = !on
|
||||
|
||||
update_icon()
|
||||
verb
|
||||
trigger_inject()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
inject()
|
||||
|
||||
vent_scrubber
|
||||
verb
|
||||
toggle_power()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
on = !on
|
||||
|
||||
update_icon()
|
||||
|
||||
toggle_scrubbing()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
scrubbing = !scrubbing
|
||||
|
||||
update_icon()
|
||||
|
||||
change_rate(amount as num)
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
volume_rate = amount
|
||||
|
||||
mixer
|
||||
verb
|
||||
toggle()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
on = !on
|
||||
|
||||
update_icon()
|
||||
|
||||
change_pressure(amount as num)
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
target_pressure = amount
|
||||
|
||||
change_ratios()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
if(node_in1)
|
||||
var/node_ratio = input(usr, "Node 1 Ratio? ([dir2text(get_dir(src, node_in1))])") as num
|
||||
node_ratio = min(max(0,node_ratio),1)
|
||||
|
||||
node1_concentration = node_ratio
|
||||
node2_concentration = 1-node_ratio
|
||||
else
|
||||
node2_concentration = 1
|
||||
node1_concentration = 0
|
||||
|
||||
usr << "Node 1: [node1_concentration], Node 2: [node2_concentration]"
|
||||
|
||||
|
||||
filter
|
||||
verb
|
||||
toggle()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
on = !on
|
||||
|
||||
update_icon()
|
||||
|
||||
change_pressure(amount as num)
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
target_pressure = amount
|
||||
|
||||
unary/oxygen_generator
|
||||
verb
|
||||
toggle()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
on = !on
|
||||
|
||||
update_icon()
|
||||
|
||||
change_rate(amount as num)
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
oxygen_content = amount
|
||||
binary/pump
|
||||
verb
|
||||
debug()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
world << "Debugging: [x],[y]"
|
||||
|
||||
if(node1)
|
||||
world << "Input node: [node1.x],[node1.y] [network1]"
|
||||
if(node2)
|
||||
world << "Output node: [node2.x],[node2.y] [network2]"
|
||||
|
||||
toggle()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
on = !on
|
||||
|
||||
update_icon()
|
||||
change_pressure(amount as num)
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
target_pressure = amount
|
||||
|
||||
valve
|
||||
verb
|
||||
toggle()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
if(open)
|
||||
close()
|
||||
else
|
||||
open()
|
||||
network_data()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
world << "\blue [x],[y]"
|
||||
world << "network 1: [network_node1.normal_members.len], [network_node1.line_members.len]"
|
||||
for(var/obj/O in network_node1.normal_members)
|
||||
world << "member: [O.x], [O.y]"
|
||||
world << "network 2: [network_node2.normal_members.len], [network_node2.line_members.len]"
|
||||
for(var/obj/O in network_node2.normal_members)
|
||||
world << "member: [O.x], [O.y]"
|
||||
pipe
|
||||
verb
|
||||
destroy()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
del(src)
|
||||
|
||||
pipeline_data()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
if(parent)
|
||||
usr << "[x],[y] is in a pipeline with [parent.members.len] members ([parent.edges.len] edges)! Volume: [parent.air.volume]"
|
||||
usr << "Pressure: [parent.air.return_pressure()], Temperature: [parent.air.temperature]"
|
||||
usr << "[parent.air.oxygen], [parent.air.toxins], [parent.air.nitrogen], [parent.air.carbon_dioxide] .. [parent.alert_pressure]"
|
||||
*/
|
||||
mob
|
||||
verb
|
||||
flag_all_pipe_networks()
|
||||
set category = "Debug"
|
||||
|
||||
for(var/datum/pipe_network/network in pipe_networks)
|
||||
network.update = 1
|
||||
|
||||
mark_pipe_networks()
|
||||
set category = "Debug"
|
||||
|
||||
for(var/datum/pipe_network/network in pipe_networks)
|
||||
network.marker = rand(1,4)
|
||||
|
||||
for(var/obj/machinery/atmospherics/pipe/P in world)
|
||||
P.overlays.Cut()
|
||||
|
||||
var/datum/pipe_network/master = P.return_network()
|
||||
if(master)
|
||||
P.overlays += icon('icons/Testing/atmos_testing.dmi',"marker[master.marker]")
|
||||
else
|
||||
world << "error"
|
||||
P.overlays += icon('icons/Testing/atmos_testing.dmi',"marker0")
|
||||
|
||||
for(var/obj/machinery/atmospherics/valve/V in world)
|
||||
V.overlays.Cut()
|
||||
|
||||
if(V.network_node1)
|
||||
V.overlays += icon('icons/Testing/atmos_testing.dmi',"marker[V.network_node1.marker]")
|
||||
else
|
||||
V.overlays += icon('icons/Testing/atmos_testing.dmi',"marker0")
|
||||
|
||||
if(V.network_node2)
|
||||
V.overlays += icon('icons/Testing/atmos_testing.dmi',"marker[V.network_node2.marker]")
|
||||
else
|
||||
V.overlays += icon('icons/Testing/atmos_testing.dmi',"marker0")
|
||||
|
||||
turf/simulated
|
||||
var/fire_verbose = 0
|
||||
|
||||
verb
|
||||
mark_direction()
|
||||
set src in world
|
||||
overlays.Cut()
|
||||
for(var/direction in list(NORTH,SOUTH,EAST,WEST))
|
||||
if(group_border&direction)
|
||||
overlays += icon('icons/Testing/turf_analysis.dmi',"red_arrow",direction)
|
||||
else if(air_check_directions&direction)
|
||||
overlays += icon('icons/Testing/turf_analysis.dmi',"arrow",direction)
|
||||
air_status()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
var/datum/gas_mixture/GM = return_air()
|
||||
usr << "\blue @[x],[y] ([GM.group_multiplier]): O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(active_hotspot)?("\red BURNING"):(null)]"
|
||||
for(var/datum/gas/trace_gas in GM.trace_gases)
|
||||
usr << "[trace_gas.type]: [trace_gas.moles]"
|
||||
|
||||
force_temperature(temp as num)
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
if(parent&&parent.group_processing)
|
||||
parent.suspend_group_processing()
|
||||
|
||||
air.temperature = temp
|
||||
|
||||
spark_temperature(temp as num, volume as num)
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
hotspot_expose(temp, volume)
|
||||
|
||||
fire_verbose()
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
fire_verbose = !fire_verbose
|
||||
usr << "[x],[y] now [fire_verbose]"
|
||||
|
||||
add_sleeping_agent(amount as num)
|
||||
set src in world
|
||||
set category = "Minor"
|
||||
|
||||
if(amount>1)
|
||||
var/datum/gas_mixture/adding = new
|
||||
var/datum/gas/sleeping_agent/trace_gas = new
|
||||
|
||||
trace_gas.moles = amount
|
||||
adding.trace_gases += trace_gas
|
||||
adding.temperature = T20C
|
||||
|
||||
assume_air(adding)
|
||||
|
||||
obj/indicator
|
||||
icon = 'icons/Testing/air_meter.dmi'
|
||||
var/measure = "temperature"
|
||||
anchored = 1
|
||||
|
||||
process()
|
||||
icon_state = measurement()
|
||||
|
||||
proc/measurement()
|
||||
var/turf/T = loc
|
||||
if(!isturf(T)) return
|
||||
var/datum/gas_mixture/GM = T.return_air()
|
||||
switch(measure)
|
||||
if("temperature")
|
||||
if(GM.temperature < 0)
|
||||
return "error"
|
||||
return "[round(GM.temperature/100+0.5)]"
|
||||
if("oxygen")
|
||||
if(GM.oxygen < 0)
|
||||
return "error"
|
||||
return "[round(GM.oxygen/MOLES_CELLSTANDARD*10+0.5)]"
|
||||
if("plasma")
|
||||
if(GM.toxins < 0)
|
||||
return "error"
|
||||
return "[round(GM.toxins/MOLES_CELLSTANDARD*10+0.5)]"
|
||||
if("nitrogen")
|
||||
if(GM.nitrogen < 0)
|
||||
return "error"
|
||||
return "[round(GM.nitrogen/MOLES_CELLSTANDARD*10+0.5)]"
|
||||
else
|
||||
return "[round((GM.total_moles())/MOLES_CELLSTANDARD*10+0.5)]"
|
||||
|
||||
|
||||
Click()
|
||||
process()
|
||||
|
||||
|
||||
obj/window
|
||||
verb
|
||||
destroy()
|
||||
set category = "Minor"
|
||||
set src in world
|
||||
del(src)
|
||||
|
||||
mob
|
||||
sight = SEE_OBJS|SEE_TURFS
|
||||
|
||||
verb
|
||||
update_indicators()
|
||||
set category = "Debug"
|
||||
if(!air_master)
|
||||
usr << "Cannot find air_system"
|
||||
return
|
||||
|
||||
for(var/obj/indicator/T in world)
|
||||
T.process()
|
||||
change_indicators()
|
||||
set category = "Debug"
|
||||
if(!air_master)
|
||||
usr << "Cannot find air_system"
|
||||
return
|
||||
|
||||
var/str = input("Select") in list("oxygen", "nitrogen","plasma","all","temperature")
|
||||
|
||||
for(var/obj/indicator/T in world)
|
||||
T.measure = str
|
||||
T.process()
|
||||
|
||||
fire_report()
|
||||
set category = "Debug"
|
||||
usr << "\b \red Fire Report"
|
||||
for(var/obj/effect/hotspot/flame in world)
|
||||
usr << "[flame.x],[flame.y]: [flame.temperature]K, [flame.volume] L - [flame.loc:air:temperature]"
|
||||
|
||||
process_cycle()
|
||||
set category = "Debug"
|
||||
if(!master_controller)
|
||||
usr << "Cannot find master_controller"
|
||||
return
|
||||
|
||||
master_controller.process()
|
||||
update_indicators()
|
||||
|
||||
process_cycles(amount as num)
|
||||
set category = "Debug"
|
||||
if(!master_controller)
|
||||
usr << "Cannot find master_controller"
|
||||
return
|
||||
|
||||
var/start_time = world.timeofday
|
||||
|
||||
for(var/i=1; i<=amount; i++)
|
||||
master_controller.process()
|
||||
|
||||
world << "Ended [amount] cycles in [(world.timeofday-start_time)/10] seconds. [(world.timeofday-start_time)/10-amount] calculation lag"
|
||||
|
||||
update_indicators()
|
||||
|
||||
process_updates_early()
|
||||
set category = "Debug"
|
||||
if(!air_master)
|
||||
usr << "Cannot find air_system"
|
||||
return
|
||||
|
||||
air_master.process_update_tiles()
|
||||
air_master.process_rebuild_select_groups()
|
||||
|
||||
mark_group_delay()
|
||||
set category = "Debug"
|
||||
if(!air_master)
|
||||
usr << "Cannot find air_system"
|
||||
return
|
||||
|
||||
for(var/datum/air_group/group in air_master.air_groups)
|
||||
group.marker = 0
|
||||
|
||||
for(var/turf/simulated/floor/S in world)
|
||||
S.icon = 'icons/Testing/turf_analysis.dmi'
|
||||
if(S.parent)
|
||||
if(S.parent.group_processing)
|
||||
if (S.parent.check_delay < 2)
|
||||
S.parent.marker=1
|
||||
else if (S.parent.check_delay < 5)
|
||||
S.parent.marker=2
|
||||
else if (S.parent.check_delay < 15)
|
||||
S.parent.marker=3
|
||||
else if (S.parent.check_delay < 30)
|
||||
S.parent.marker=4
|
||||
else
|
||||
S.parent.marker=5
|
||||
if(S.parent.borders && S.parent.borders.Find(S))
|
||||
S.icon_state = "on[S.parent.marker]_border"
|
||||
else
|
||||
S.icon_state = "on[S.parent.marker]"
|
||||
|
||||
else
|
||||
if (S.check_delay < 2)
|
||||
S.icon_state= "on1_border"
|
||||
else if (S.check_delay < 5)
|
||||
S.icon_state= "on2_border"
|
||||
else if (S.check_delay < 15)
|
||||
S.icon_state= "on3_border"
|
||||
else if (S.check_delay < 30)
|
||||
S.icon_state= "on4_border"
|
||||
else
|
||||
S.icon_state = "suspended"
|
||||
else
|
||||
if(S.processing)
|
||||
S.icon_state = "individual_on"
|
||||
else
|
||||
S.icon_state = "individual_off"
|
||||
|
||||
|
||||
mark_groups()
|
||||
set category = "Debug"
|
||||
if(!air_master)
|
||||
usr << "Cannot find air_system"
|
||||
return
|
||||
|
||||
for(var/datum/air_group/group in air_master.air_groups)
|
||||
group.marker = 0
|
||||
|
||||
for(var/turf/simulated/floor/S in world)
|
||||
S.icon = 'icons/Testing/turf_analysis.dmi'
|
||||
if(S.parent)
|
||||
if(S.parent.group_processing)
|
||||
if(S.parent.marker == 0)
|
||||
S.parent.marker = rand(1,5)
|
||||
if(S.parent.borders && S.parent.borders.Find(S))
|
||||
S.icon_state = "on[S.parent.marker]_border"
|
||||
else
|
||||
S.icon_state = "on[S.parent.marker]"
|
||||
|
||||
else
|
||||
S.icon_state = "suspended"
|
||||
else
|
||||
if(S.processing)
|
||||
S.icon_state = "individual_on"
|
||||
else
|
||||
S.icon_state = "individual_off"
|
||||
|
||||
get_broken_icons()
|
||||
set category = "Debug"
|
||||
getbrokeninhands()
|
||||
|
||||
|
||||
/* jump_to_dead_group() Currently in the normal admin commands but fits here
|
||||
set category = "Debug"
|
||||
if(!air_master)
|
||||
usr << "Cannot find air_system"
|
||||
return
|
||||
|
||||
var/datum/air_group/dead_groups = list()
|
||||
for(var/datum/air_group/group in air_master.air_groups)
|
||||
if (!group.group_processing)
|
||||
dead_groups += group
|
||||
var/datum/air_group/dest_group = pick(dead_groups)
|
||||
usr.loc = pick(dest_group.members)*/
|
||||
@@ -1,286 +0,0 @@
|
||||
datum/air_group
|
||||
var/group_processing = 1 //Processing all tiles as one large tile if 1
|
||||
|
||||
var/datum/gas_mixture/air = new
|
||||
|
||||
var/current_cycle = 0 //cycle that oxygen value represents
|
||||
var/archived_cycle = 0 //cycle that oxygen_archived value represents
|
||||
//The use of archived cycle saves processing power by permitting the archiving step of FET
|
||||
// to be rolled into the updating step
|
||||
|
||||
//optimization vars
|
||||
var/next_check = 0 //number of ticks before this group updates
|
||||
var/check_delay = 10 //number of ticks between updates, starts fairly high to get boring groups out of the way
|
||||
|
||||
proc/members()
|
||||
//Returns the members of the group
|
||||
proc/process_group()
|
||||
|
||||
|
||||
var/list/borders //Tiles that connect this group to other groups/individual tiles
|
||||
var/list/members //All tiles in this group
|
||||
|
||||
var/list/space_borders
|
||||
var/length_space_border = 0
|
||||
|
||||
|
||||
proc/suspend_group_processing()
|
||||
group_processing = 0
|
||||
update_tiles_from_group()
|
||||
check_delay=0
|
||||
next_check=0
|
||||
|
||||
|
||||
//Copy group air information to individual tile air
|
||||
//Used right before turning on group processing
|
||||
proc/update_group_from_tiles()
|
||||
var/sample_member = pick(members)
|
||||
var/datum/gas_mixture/sample_air = sample_member:air
|
||||
|
||||
air.copy_from(sample_air)
|
||||
air.group_multiplier = members.len
|
||||
return 1
|
||||
|
||||
|
||||
//Copy group air information to individual tile air
|
||||
//Used right before turning off group processing
|
||||
proc/update_tiles_from_group()
|
||||
for(var/member in members)
|
||||
member:air.copy_from(air)
|
||||
if (istype(member,/turf/simulated))
|
||||
var/turf/simulated/turfmem=member
|
||||
turfmem.reset_delay()
|
||||
|
||||
|
||||
proc/archive()
|
||||
air.archive()
|
||||
archived_cycle = air_master.current_cycle
|
||||
|
||||
|
||||
//If individually processing tiles, checks all member tiles to see if they are close enough that the group may resume group processing
|
||||
//Warning: Do not call, called by air_master.process()
|
||||
proc/check_regroup()
|
||||
//Purpose: Checks to see if group processing should be turned back on
|
||||
//Returns: group_processing
|
||||
if(prevent_airgroup_regroup)
|
||||
return 0
|
||||
|
||||
if(group_processing) return 1
|
||||
|
||||
var/turf/simulated/sample = pick(members)
|
||||
for(var/member in members)
|
||||
if(member:active_hotspot)
|
||||
return 0
|
||||
if(member:air.compare(sample.air)) continue
|
||||
else
|
||||
return 0
|
||||
|
||||
update_group_from_tiles()
|
||||
group_processing = 1
|
||||
return 1
|
||||
|
||||
|
||||
//Look into this
|
||||
turf/process_group()
|
||||
current_cycle = air_master.current_cycle
|
||||
if(!group_processing) //Revert to individual processing then end
|
||||
for(var/T in members)
|
||||
var/turf/simulated/member = T
|
||||
member.process_cell()
|
||||
return
|
||||
|
||||
//check if we're skipping this tick
|
||||
if (next_check > 0)
|
||||
next_check--
|
||||
return 1
|
||||
var/player_count = max(player_list.len, 3) / 3
|
||||
next_check += check_delay + rand(player_count, player_count * 1.5)
|
||||
check_delay++
|
||||
|
||||
var/turf/simulated/list/border_individual = list()
|
||||
var/datum/air_group/list/border_group = list()
|
||||
|
||||
var/turf/simulated/list/enemies = list() //used to send the appropriate border tile of a group to the group proc
|
||||
var/turf/simulated/list/self_group_borders = list()
|
||||
var/turf/simulated/list/self_tile_borders = list()
|
||||
|
||||
if(archived_cycle < air_master.current_cycle)
|
||||
archive()
|
||||
//Archive air data for use in calculations
|
||||
//But only if another group didn't store it for us
|
||||
|
||||
for(var/turf/simulated/border_tile in src.borders)
|
||||
for(var/direction in cardinal) //Go through all border tiles and get bordering groups and individuals
|
||||
if(border_tile.group_border&direction)
|
||||
var/turf/simulated/enemy_tile = get_step(border_tile, direction) //Add found tile to appropriate category
|
||||
if(istype(enemy_tile) && enemy_tile.parent && enemy_tile.parent.group_processing)
|
||||
border_group += enemy_tile.parent
|
||||
enemies += enemy_tile
|
||||
self_group_borders += border_tile
|
||||
else
|
||||
border_individual += enemy_tile
|
||||
self_tile_borders += border_tile
|
||||
|
||||
var/abort_group = 0
|
||||
|
||||
// Process connections to adjacent groups
|
||||
var/border_index = 1
|
||||
for(var/datum/air_group/AG in border_group)
|
||||
if(AG.archived_cycle < archived_cycle) //archive other groups information if it has not been archived yet this cycle
|
||||
AG.archive()
|
||||
if(AG.current_cycle < current_cycle)
|
||||
//This if statement makes sure two groups only process their individual connections once!
|
||||
//Without it, each connection would be processed a second time as the second group is evaluated
|
||||
|
||||
var/connection_difference = 0
|
||||
var/turf/simulated/floor/self_border = self_group_borders[border_index]
|
||||
var/turf/simulated/floor/enemy_border = enemies[border_index]
|
||||
|
||||
var/result = air.check_gas_mixture(AG.air)
|
||||
if(result == 1)
|
||||
connection_difference = air.share(AG.air)
|
||||
else if(result == -1)
|
||||
AG.suspend_group_processing()
|
||||
connection_difference = air.share(enemy_border.air)
|
||||
else
|
||||
abort_group = 1
|
||||
break
|
||||
|
||||
if(connection_difference)
|
||||
if(connection_difference > 0)
|
||||
self_border.consider_pressure_difference(connection_difference, get_dir(self_border,enemy_border))
|
||||
else
|
||||
var/turf/enemy_turf = enemy_border
|
||||
if(!isturf(enemy_turf))
|
||||
enemy_turf = enemy_border.loc
|
||||
enemy_turf.consider_pressure_difference(-connection_difference, get_dir(enemy_turf,self_border))
|
||||
|
||||
border_index++
|
||||
|
||||
// Process connections to adjacent tiles
|
||||
border_index = 1
|
||||
if(!abort_group)
|
||||
for(var/atom/enemy_tile in border_individual)
|
||||
var/connection_difference = 0
|
||||
var/turf/simulated/floor/self_border = self_tile_borders[border_index]
|
||||
|
||||
if(istype(enemy_tile, /turf/simulated))
|
||||
if(enemy_tile:archived_cycle < archived_cycle) //archive tile information if not already done
|
||||
enemy_tile:archive()
|
||||
if(enemy_tile:current_cycle < current_cycle)
|
||||
if(air.check_gas_mixture(enemy_tile:air))
|
||||
connection_difference = air.share(enemy_tile:air)
|
||||
else
|
||||
abort_group = 1
|
||||
break
|
||||
else if(isturf(enemy_tile))
|
||||
if(air.check_turf(enemy_tile))
|
||||
connection_difference = air.mimic(enemy_tile)
|
||||
else
|
||||
abort_group = 1
|
||||
break
|
||||
|
||||
if(connection_difference)
|
||||
if(connection_difference > 0)
|
||||
self_border.consider_pressure_difference(connection_difference, get_dir(self_border,enemy_tile))
|
||||
else
|
||||
var/turf/enemy_turf = enemy_tile
|
||||
if(!isturf(enemy_turf))
|
||||
enemy_turf = enemy_tile.loc
|
||||
enemy_turf.consider_pressure_difference(-connection_difference, get_dir(enemy_tile,enemy_turf))
|
||||
|
||||
// Process connections to space
|
||||
border_index = 1
|
||||
if(!abort_group)
|
||||
if(length_space_border > 0)
|
||||
var/turf/space/sample = locate()
|
||||
var/connection_difference = 0
|
||||
|
||||
if(air.check_turf(sample))
|
||||
connection_difference = air.mimic(sample, length_space_border)
|
||||
else
|
||||
abort_group = 1
|
||||
|
||||
if(connection_difference)
|
||||
for(var/turf/simulated/self_border in space_borders)
|
||||
self_border.consider_pressure_difference_space(connection_difference)
|
||||
|
||||
if(abort_group)
|
||||
suspend_group_processing()
|
||||
else
|
||||
if(air.check_tile_graphic())
|
||||
for(var/T in members)
|
||||
var/turf/simulated/member = T
|
||||
member.update_visuals(air)
|
||||
|
||||
|
||||
if(air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
|
||||
for(var/T in members)
|
||||
var/turf/simulated/member = T
|
||||
member.hotspot_expose(air.temperature, CELL_VOLUME)
|
||||
member.consider_superconductivity(starting=1)
|
||||
|
||||
air.react()
|
||||
return
|
||||
|
||||
|
||||
|
||||
object/process_group()
|
||||
current_cycle = air_master.current_cycle
|
||||
|
||||
if(!group_processing) return //See if processing this group as a group
|
||||
|
||||
var/turf/simulated/list/border_individual = list()
|
||||
var/datum/air_group/list/border_group = list()
|
||||
|
||||
var/turf/simulated/list/enemies = list() //used to send the appropriate border tile of a group to the group proc
|
||||
var/enemy_index = 1
|
||||
|
||||
if(archived_cycle < air_master.current_cycle)
|
||||
archive()
|
||||
//Archive air data for use in calculations
|
||||
//But only if another group didn't store it for us
|
||||
|
||||
enemy_index = 1
|
||||
var/abort_group = 0
|
||||
for(var/datum/air_group/AG in border_group)
|
||||
if(AG.archived_cycle < archived_cycle) //archive other groups information if it has not been archived yet this cycle
|
||||
AG.archive()
|
||||
if(AG.current_cycle < current_cycle)
|
||||
//This if statement makes sure two groups only process their individual connections once!
|
||||
//Without it, each connection would be processed a second time as the second group is evaluated
|
||||
|
||||
var/result = air.check_gas_mixture(AG.air)
|
||||
if(result == 1)
|
||||
air.share(AG.air)
|
||||
else if(result == -1)
|
||||
AG.suspend_group_processing()
|
||||
var/turf/simulated/floor/enemy_border = enemies[enemy_index]
|
||||
air.share(enemy_border.air)
|
||||
else
|
||||
abort_group = 0
|
||||
break
|
||||
enemy_index++
|
||||
|
||||
if(!abort_group)
|
||||
for(var/enemy_tile in border_individual)
|
||||
if(istype(enemy_tile, /turf/simulated))
|
||||
if(enemy_tile:archived_cycle < archived_cycle) //archive tile information if not already done
|
||||
enemy_tile:archive()
|
||||
if(enemy_tile:current_cycle < current_cycle)
|
||||
if(air.check_gas_mixture(enemy_tile:air))
|
||||
air.share(enemy_tile:air)
|
||||
else
|
||||
abort_group = 1
|
||||
break
|
||||
else
|
||||
if(air.check_turf(enemy_tile))
|
||||
air.mimic(enemy_tile)
|
||||
else
|
||||
abort_group = 1
|
||||
break
|
||||
|
||||
if(abort_group)
|
||||
suspend_group_processing()
|
||||
|
||||
return
|
||||
@@ -1,181 +0,0 @@
|
||||
|
||||
/atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
return null
|
||||
|
||||
|
||||
|
||||
/turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
|
||||
|
||||
|
||||
|
||||
/turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
|
||||
var/datum/gas_mixture/air_contents = return_air()
|
||||
if(!air_contents)
|
||||
return 0
|
||||
if(active_hotspot)
|
||||
if(soh)
|
||||
if(air_contents.toxins > 0.5 && air_contents.oxygen > 0.5)
|
||||
if(active_hotspot.temperature < exposed_temperature)
|
||||
active_hotspot.temperature = exposed_temperature
|
||||
if(active_hotspot.volume < exposed_volume)
|
||||
active_hotspot.volume = exposed_volume
|
||||
return 1
|
||||
|
||||
var/igniting = 0
|
||||
|
||||
if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && air_contents.toxins > 0.5)
|
||||
igniting = 1
|
||||
|
||||
if(igniting)
|
||||
if(air_contents.oxygen < 0.5 || air_contents.toxins < 0.5)
|
||||
return 0
|
||||
|
||||
if(parent&&parent.group_processing)
|
||||
parent.suspend_group_processing()
|
||||
|
||||
active_hotspot = new(src)
|
||||
active_hotspot.temperature = exposed_temperature
|
||||
active_hotspot.volume = exposed_volume
|
||||
|
||||
active_hotspot.just_spawned = (current_cycle < air_master.current_cycle)
|
||||
//remove just_spawned protection if no longer processing this cell
|
||||
|
||||
//start processing quickly if we aren't already
|
||||
reset_delay()
|
||||
|
||||
return igniting
|
||||
|
||||
//This is the icon for fire on turfs, also helps for nurturing small fires until they are full tile
|
||||
/obj/effect/hotspot
|
||||
anchored = 1
|
||||
mouse_opacity = 0
|
||||
unacidable = 1//So you can't melt fire with acid.
|
||||
icon = 'icons/effects/fire.dmi'
|
||||
icon_state = "1"
|
||||
layer = TURF_LAYER
|
||||
luminosity = 3
|
||||
|
||||
var/volume = 125
|
||||
var/temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST
|
||||
var/just_spawned = 1
|
||||
var/bypassing = 0
|
||||
|
||||
|
||||
/obj/effect/hotspot/proc/perform_exposure()
|
||||
var/turf/simulated/floor/location = loc
|
||||
if(!istype(location)) return 0
|
||||
|
||||
if(volume > CELL_VOLUME*0.95) bypassing = 1
|
||||
else bypassing = 0
|
||||
|
||||
if(bypassing)
|
||||
if(!just_spawned)
|
||||
volume = location.air.fuel_burnt*FIRE_GROWTH_RATE
|
||||
temperature = location.air.temperature
|
||||
else
|
||||
var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.volume)
|
||||
affected.temperature = temperature
|
||||
affected.react()
|
||||
temperature = affected.temperature
|
||||
volume = affected.fuel_burnt*FIRE_GROWTH_RATE
|
||||
location.assume_air(affected)
|
||||
|
||||
for(var/atom/item in loc)
|
||||
if(!bypassing)
|
||||
item.temperature_expose(null, temperature, volume)
|
||||
if(item) // It's possible that the item is deleted in temperature_expose
|
||||
item.fire_act(null, temperature, volume)
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
/obj/effect/hotspot/process(turf/simulated/list/possible_spread)
|
||||
if(just_spawned)
|
||||
just_spawned = 0
|
||||
return 0
|
||||
|
||||
var/turf/simulated/floor/location = loc
|
||||
if(!istype(location))
|
||||
Kill()
|
||||
return
|
||||
|
||||
if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1))
|
||||
Kill()
|
||||
return
|
||||
|
||||
if(location.air.toxins < 0.5 || location.air.oxygen < 0.5)
|
||||
Kill()
|
||||
return
|
||||
|
||||
perform_exposure()
|
||||
|
||||
if(location.wet) location.wet = 0
|
||||
|
||||
if(bypassing)
|
||||
icon_state = "3"
|
||||
location.burn_tile()
|
||||
|
||||
//Possible spread due to radiated heat
|
||||
if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD)
|
||||
var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE
|
||||
|
||||
for(var/turf/simulated/possible_target in possible_spread)
|
||||
if(!possible_target.active_hotspot)
|
||||
possible_target.hotspot_expose(radiated_temperature, CELL_VOLUME/4)
|
||||
|
||||
else
|
||||
if(volume > CELL_VOLUME*0.4)
|
||||
icon_state = "2"
|
||||
else
|
||||
icon_state = "1"
|
||||
|
||||
if(temperature > location.max_fire_temperature_sustained)
|
||||
location.max_fire_temperature_sustained = temperature
|
||||
|
||||
if(location.heat_capacity && temperature > location.heat_capacity)
|
||||
location.to_be_destroyed = 1
|
||||
/*if(prob(25))
|
||||
location.ReplaceWithSpace()
|
||||
return 0*/
|
||||
return 1
|
||||
|
||||
// Garbage collect itself by nulling reference to it
|
||||
|
||||
/obj/effect/hotspot/proc/Kill()
|
||||
DestroyTurf()
|
||||
garbage_collect()
|
||||
|
||||
/obj/effect/hotspot/proc/garbage_collect()
|
||||
if(istype(loc, /turf/simulated))
|
||||
var/turf/simulated/T = loc
|
||||
if(T.active_hotspot == src)
|
||||
T.active_hotspot = null
|
||||
loc = null
|
||||
|
||||
/obj/effect/hotspot/proc/DestroyTurf()
|
||||
|
||||
if(istype(loc, /turf/simulated))
|
||||
var/turf/simulated/T = loc
|
||||
if(T.to_be_destroyed)
|
||||
var/chance_of_deletion
|
||||
if (T.heat_capacity) //beware of division by zero
|
||||
chance_of_deletion = T.max_fire_temperature_sustained / T.heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0
|
||||
else
|
||||
chance_of_deletion = 100
|
||||
if(prob(chance_of_deletion))
|
||||
T.ChangeTurf(/turf/space)
|
||||
else
|
||||
T.to_be_destroyed = 0
|
||||
T.max_fire_temperature_sustained = 0
|
||||
|
||||
/obj/effect/hotspot/New()
|
||||
..()
|
||||
dir = pick(cardinal)
|
||||
return
|
||||
|
||||
/*
|
||||
/obj/effect/hotspot/Del()
|
||||
if (istype(loc, /turf/simulated))
|
||||
DestroyTurf()
|
||||
..()
|
||||
*/
|
||||
@@ -1,101 +0,0 @@
|
||||
/turf/simulated/proc/find_group()
|
||||
//Basically, join any nearby valid groups
|
||||
// If more than one, pick one with most members at my borders
|
||||
// If can not find any but there was an ungrouped at border with me, call for group assembly
|
||||
|
||||
var/turf/simulated/floor/north = get_step(src,NORTH)
|
||||
var/turf/simulated/floor/south = get_step(src,SOUTH)
|
||||
var/turf/simulated/floor/east = get_step(src,EAST)
|
||||
var/turf/simulated/floor/west = get_step(src,WEST)
|
||||
|
||||
//Clear those we do not have access to
|
||||
if(!CanPass(null, north, null, 1) || !istype(north))
|
||||
north = null
|
||||
if(!CanPass(null, south, null, 1) || !istype(south))
|
||||
south = null
|
||||
if(!CanPass(null, east, null, 1) || !istype(east))
|
||||
east = null
|
||||
if(!CanPass(null, west, null, 1) || !istype(west))
|
||||
west = null
|
||||
|
||||
var/new_group_possible = 0
|
||||
|
||||
var/north_votes = 0
|
||||
var/south_votes = 0
|
||||
var/east_votes = 0
|
||||
|
||||
if(north)
|
||||
if(north.parent)
|
||||
north_votes = 1
|
||||
|
||||
if(south && (south.parent == north.parent))
|
||||
north_votes++
|
||||
south = null
|
||||
|
||||
if(east && (east.parent == north.parent))
|
||||
north_votes++
|
||||
east = null
|
||||
|
||||
if(west && (west.parent == north.parent))
|
||||
north_votes++
|
||||
west = null
|
||||
else
|
||||
new_group_possible = 1
|
||||
|
||||
if(south)
|
||||
if(south.parent)
|
||||
south_votes = 1
|
||||
|
||||
if(east && (east.parent == south.parent))
|
||||
south_votes++
|
||||
east = null
|
||||
|
||||
if(west && (west.parent == south.parent))
|
||||
south_votes++
|
||||
west = null
|
||||
else
|
||||
new_group_possible = 1
|
||||
|
||||
if(east)
|
||||
if(east.parent)
|
||||
east_votes = 1
|
||||
|
||||
if(west && (west.parent == east.parent))
|
||||
east_votes++
|
||||
west = null
|
||||
else
|
||||
new_group_possible = 1
|
||||
|
||||
// world << "[north_votes], [south_votes], [east_votes]"
|
||||
|
||||
var/datum/air_group/group_joined = null
|
||||
|
||||
if(west)
|
||||
if(west.parent)
|
||||
group_joined = west.parent
|
||||
else
|
||||
new_group_possible = 1
|
||||
|
||||
if(north_votes && (north_votes >= south_votes) && (north_votes >= east_votes))
|
||||
group_joined = north.parent
|
||||
else if(south_votes && (south_votes >= east_votes))
|
||||
group_joined = south.parent
|
||||
else if(east_votes)
|
||||
group_joined = east.parent
|
||||
|
||||
if (istype(group_joined))
|
||||
if (group_joined.group_processing)
|
||||
group_joined.suspend_group_processing()
|
||||
group_joined.members += src
|
||||
parent=group_joined
|
||||
|
||||
air_master.tiles_to_update += group_joined.members
|
||||
return 1
|
||||
|
||||
else if(new_group_possible)
|
||||
air_master.assemble_group_turf(src)
|
||||
return 1
|
||||
|
||||
else
|
||||
air_master.active_singletons += src
|
||||
return 1
|
||||
@@ -1,335 +0,0 @@
|
||||
/*
|
||||
Overview:
|
||||
The air_master global variable is the workhorse for the system.
|
||||
|
||||
Why are you archiving data before modifying it?
|
||||
The general concept with archiving data and having each tile keep track of when they were last updated is to keep everything symmetric
|
||||
and totally independent of the order they are read in an update cycle.
|
||||
This prevents abnormalities like air/fire spreading rapidly in one direction and super slowly in the other.
|
||||
|
||||
Why not just archive everything and then calculate?
|
||||
Efficiency. While a for-loop that goes through all tiles and groups to archive their information before doing any calculations seems simple, it is
|
||||
slightly less efficient than the archive-before-modify/read method.
|
||||
|
||||
Why is there a cycle check for calculating data as well?
|
||||
This ensures that every connection between group-tile, tile-tile, and group-group is only evaluated once per loop.
|
||||
|
||||
|
||||
|
||||
|
||||
Important variables:
|
||||
air_master.groups_to_rebuild (list)
|
||||
A list of air groups that have had their geometry occluded and thus may need to be split in half.
|
||||
A set of adjacent groups put in here will join together if validly connected.
|
||||
This is done before air system calculations for a cycle.
|
||||
air_master.tiles_to_update (list)
|
||||
Turfs that are in this list have their border data updated before the next air calculations for a cycle.
|
||||
Place turfs in this list rather than call the proc directly to prevent race conditions
|
||||
|
||||
turf/simulated.archive() and datum/air_group.archive()
|
||||
This stores all data for.
|
||||
If you modify, make sure to update the archived_cycle to prevent race conditions and maintain symmetry
|
||||
|
||||
atom/CanPass(atom/movable/mover, turf/target, height, air_group)
|
||||
returns 1 for allow pass and 0 for deny pass
|
||||
Turfs automatically call this for all objects/mobs in its turf.
|
||||
This is called both as source.CanPass(target, height, air_group)
|
||||
and target.CanPass(source, height, air_group)
|
||||
|
||||
Cases for the parameters
|
||||
1. This is called with args (mover, location, height>0, air_group=0) for normal objects.
|
||||
2. This is called with args (null, location, height=0, air_group=0) for flowing air.
|
||||
3. This is called with args (null, location, height=?, air_group=1) for determining group boundaries.
|
||||
|
||||
Cases 2 and 3 would be different for doors or other objects open and close fairly often.
|
||||
(Case 3 would return 0 always while Case 2 would return 0 only when the door is open)
|
||||
This prevents the necessity of re-evaluating group geometry every time a door opens/closes.
|
||||
|
||||
|
||||
Important Procedures
|
||||
air_master.process()
|
||||
This first processes the air_master update/rebuild lists then processes all groups and tiles for air calculations
|
||||
|
||||
|
||||
*/
|
||||
|
||||
var/kill_air = 0
|
||||
|
||||
atom/proc/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
|
||||
return (!density || !height || air_group)
|
||||
|
||||
turf
|
||||
CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0)
|
||||
if(!target) return 0
|
||||
|
||||
if(istype(mover)) // turf/Enter(...) will perform more advanced checks
|
||||
return !density
|
||||
|
||||
else // Now, doing more detailed checks for air movement and air group formation
|
||||
if(target.blocks_air||blocks_air)
|
||||
return 0
|
||||
|
||||
for(var/obj/obstacle in src)
|
||||
if(!obstacle.CanPass(mover, target, height, air_group))
|
||||
return 0
|
||||
for(var/obj/obstacle in target)
|
||||
if(!obstacle.CanPass(mover, src, height, air_group))
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
var/global/datum/controller/air_system/air_master
|
||||
|
||||
datum
|
||||
controller
|
||||
air_system
|
||||
//Geoemetry lists
|
||||
var/list/datum/air_group/air_groups = list()
|
||||
var/list/turf/simulated/active_singletons = list()
|
||||
|
||||
//Special functions lists
|
||||
var/list/turf/simulated/active_super_conductivity = list()
|
||||
var/list/turf/simulated/high_pressure_delta = list()
|
||||
|
||||
//Geometry updates lists
|
||||
var/list/turf/simulated/tiles_to_update = list()
|
||||
var/list/turf/simulated/groups_to_rebuild = list()
|
||||
|
||||
var/current_cycle = 0
|
||||
|
||||
proc
|
||||
setup()
|
||||
//Call this at the start to setup air groups geometry
|
||||
//Warning: Very processor intensive but only must be done once per round
|
||||
|
||||
assemble_group_turf(turf/simulated/base)
|
||||
//Call this to try to construct a group starting from base and merging with neighboring unparented tiles
|
||||
//Expands the group until all valid borders explored
|
||||
|
||||
// assemble_group_object(obj/movable/floor/base)
|
||||
|
||||
process()
|
||||
//Call this to process air movements for a cycle
|
||||
|
||||
process_groups()
|
||||
//Used by process()
|
||||
//Warning: Do not call this
|
||||
|
||||
process_singletons()
|
||||
//Used by process()
|
||||
//Warning: Do not call this
|
||||
|
||||
process_high_pressure_delta()
|
||||
//Used by process()
|
||||
//Warning: Do not call this
|
||||
|
||||
process_super_conductivity()
|
||||
//Used by process()
|
||||
//Warning: Do not call this
|
||||
|
||||
process_update_tiles()
|
||||
//Used by process()
|
||||
//Warning: Do not call this
|
||||
|
||||
process_rebuild_select_groups()
|
||||
//Used by process()
|
||||
//Warning: Do not call this
|
||||
|
||||
rebuild_group(datum/air_group)
|
||||
//Used by process_rebuild_select_groups()
|
||||
//Warning: Do not call this, add the group to air_master.groups_to_rebuild instead
|
||||
|
||||
add_singleton(turf/simulated/T)
|
||||
if(!active_singletons.Find(T))
|
||||
active_singletons += T
|
||||
|
||||
setup()
|
||||
set background = 1
|
||||
world << "\red \b Processing Geometry..."
|
||||
sleep(1)
|
||||
|
||||
var/start_time = world.timeofday
|
||||
|
||||
for(var/turf/simulated/S in world)
|
||||
if(!S.blocks_air && !S.parent)
|
||||
assemble_group_turf(S)
|
||||
S.update_air_properties()
|
||||
|
||||
world << "\red \b Geometry processed in [(world.timeofday-start_time)/10] seconds!"
|
||||
|
||||
assemble_group_turf(turf/simulated/base)
|
||||
|
||||
var/list/turf/simulated/members = list(base) //Confirmed group members
|
||||
var/list/turf/simulated/possible_members = list(base) //Possible places for group expansion
|
||||
var/list/turf/simulated/possible_borders = list()
|
||||
var/list/turf/simulated/possible_space_borders = list()
|
||||
var/possible_space_length = 0
|
||||
|
||||
while(possible_members.len>0) //Keep expanding, looking for new members
|
||||
for(var/turf/simulated/test in possible_members)
|
||||
test.length_space_border = 0
|
||||
for(var/direction in cardinal)
|
||||
var/turf/T = get_step(test,direction)
|
||||
if(T && !members.Find(T) && test.CanPass(null, T, null,1))
|
||||
if(istype(T,/turf/simulated) && !T:parent)
|
||||
possible_members += T
|
||||
members += T
|
||||
else if(istype(T,/turf/space))
|
||||
possible_space_borders -= test
|
||||
possible_space_borders += test
|
||||
test.length_space_border++
|
||||
else
|
||||
possible_borders -= test
|
||||
possible_borders += test
|
||||
if(test.length_space_border > 0)
|
||||
possible_space_length += test.length_space_border
|
||||
possible_members -= test
|
||||
|
||||
if(members.len > 1)
|
||||
var/datum/air_group/turf/group = new
|
||||
if(possible_borders.len>0)
|
||||
group.borders = possible_borders
|
||||
if(possible_space_borders.len>0)
|
||||
group.space_borders = possible_space_borders
|
||||
group.length_space_border = possible_space_length
|
||||
|
||||
for(var/turf/simulated/test in members)
|
||||
test.parent = group
|
||||
test.processing = 0
|
||||
active_singletons -= test
|
||||
|
||||
group.members = members
|
||||
air_groups += group
|
||||
|
||||
group.update_group_from_tiles() //Initialize air group variables
|
||||
return group
|
||||
else
|
||||
base.processing = 0 //singletons at startup are technically unconnected anyway
|
||||
base.parent = null
|
||||
|
||||
if(base.air.check_tile_graphic())
|
||||
base.update_visuals(base.air)
|
||||
|
||||
return null
|
||||
/*
|
||||
assemble_group_object(obj/movable/floor/base)
|
||||
|
||||
var/list/obj/movable/floor/members = list(base) //Confirmed group members
|
||||
var/list/obj/movable/floor/possible_members = list(base) //Possible places for group expansion
|
||||
var/list/obj/movable/floor/possible_borders = list()
|
||||
|
||||
while(possible_members.len>0) //Keep expanding, looking for new members
|
||||
for(var/obj/movable/floor/test in possible_members)
|
||||
for(var/direction in list(NORTH, SOUTH, EAST, WEST))
|
||||
var/turf/T = get_step(test.loc,direction)
|
||||
if(T && test.loc.CanPass(null, T, null, 1))
|
||||
var/obj/movable/floor/O = locate(/obj/movable/floor) in T
|
||||
if(istype(O) && !O.parent)
|
||||
if(!members.Find(O))
|
||||
possible_members += O
|
||||
members += O
|
||||
else
|
||||
possible_borders -= test
|
||||
possible_borders += test
|
||||
possible_members -= test
|
||||
|
||||
if(members.len > 1)
|
||||
var/datum/air_group/object/group = new
|
||||
if(possible_borders.len>0)
|
||||
group.borders = possible_borders
|
||||
|
||||
for(var/obj/movable/floor/test in members)
|
||||
test.parent = group
|
||||
test.processing = 0
|
||||
active_singletons -= test
|
||||
|
||||
group.members = members
|
||||
air_groups += group
|
||||
|
||||
group.update_group_from_tiles() //Initialize air group variables
|
||||
return group
|
||||
else
|
||||
base.processing = 0 //singletons at startup are technically unconnected anyway
|
||||
base.parent = null
|
||||
|
||||
return null
|
||||
*/
|
||||
process()
|
||||
if(kill_air)
|
||||
return 1
|
||||
current_cycle++
|
||||
if(groups_to_rebuild.len > 0) process_rebuild_select_groups()
|
||||
if(tiles_to_update.len > 0) process_update_tiles()
|
||||
|
||||
process_groups()
|
||||
process_singletons()
|
||||
|
||||
process_super_conductivity()
|
||||
process_high_pressure_delta()
|
||||
|
||||
if(current_cycle%10==5) //Check for groups of tiles to resume group processing every 10 cycles
|
||||
for(var/datum/air_group/AG in air_groups)
|
||||
AG.check_regroup()
|
||||
|
||||
return 1
|
||||
|
||||
process_update_tiles()
|
||||
for(var/turf/simulated/T in tiles_to_update)
|
||||
T.update_air_properties()
|
||||
/*
|
||||
for(var/obj/movable/floor/O in tiles_to_update)
|
||||
O.update_air_properties()
|
||||
*/
|
||||
tiles_to_update.len = 0
|
||||
|
||||
process_rebuild_select_groups()
|
||||
var/turf/list/turfs = list()
|
||||
|
||||
for(var/datum/air_group/turf/turf_AG in groups_to_rebuild) //Deconstruct groups, gathering their old members
|
||||
for(var/turf in turf_AG.members)
|
||||
var/turf/simulated/T = turf
|
||||
T.parent = null
|
||||
turfs += T
|
||||
del(turf_AG)
|
||||
|
||||
for(var/turf/simulated/S in turfs) //Have old members try to form new groups
|
||||
if(!S.parent)
|
||||
assemble_group_turf(S)
|
||||
for(var/turf/simulated/S in turfs)
|
||||
S.update_air_properties()
|
||||
|
||||
// var/obj/movable/list/movable_objects = list()
|
||||
|
||||
// for(var/datum/air_group/object/object_AG in groups_to_rebuild) //Deconstruct groups, gathering their old members
|
||||
/*
|
||||
for(var/obj/movable/floor/OM in object_AG.members)
|
||||
OM.parent = null
|
||||
movable_objects += OM
|
||||
del(object_AG)
|
||||
|
||||
for(var/obj/movable/floor/OM in movable_objects) //Have old members try to form new groups
|
||||
if(!OM.parent)
|
||||
assemble_group_object(OM)
|
||||
for(var/obj/movable/floor/OM in movable_objects)
|
||||
OM.update_air_properties()
|
||||
*/
|
||||
groups_to_rebuild.len = 0
|
||||
|
||||
process_groups()
|
||||
for(var/datum/air_group/AG in air_groups)
|
||||
AG.process_group()
|
||||
|
||||
process_singletons()
|
||||
for(var/item in active_singletons)
|
||||
item:process_cell()
|
||||
|
||||
process_super_conductivity()
|
||||
for(var/turf/simulated/hot_potato in active_super_conductivity)
|
||||
hot_potato.super_conduct()
|
||||
|
||||
process_high_pressure_delta()
|
||||
for(var/turf/pressurized in high_pressure_delta)
|
||||
pressurized.high_pressure_movements()
|
||||
|
||||
high_pressure_delta.len = 0
|
||||
@@ -1,566 +0,0 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
|
||||
atom/movable/var/pressure_resistance = 5
|
||||
atom/movable/var/last_forced_movement = 0
|
||||
|
||||
atom/movable/proc/experience_pressure_difference(pressure_difference, direction)
|
||||
if(last_forced_movement >= air_master.current_cycle)
|
||||
return 0
|
||||
else if(!anchored)
|
||||
if(pressure_difference > pressure_resistance)
|
||||
last_forced_movement = air_master.current_cycle
|
||||
spawn step(src, direction)
|
||||
return 1
|
||||
|
||||
turf
|
||||
assume_air(datum/gas_mixture/giver) //use this for machines to adjust air
|
||||
del(giver)
|
||||
return 0
|
||||
|
||||
return_air()
|
||||
//Create gas mixture to hold data for passing
|
||||
var/datum/gas_mixture/GM = new
|
||||
|
||||
GM.oxygen = oxygen
|
||||
GM.carbon_dioxide = carbon_dioxide
|
||||
GM.nitrogen = nitrogen
|
||||
GM.toxins = toxins
|
||||
|
||||
GM.temperature = temperature
|
||||
|
||||
return GM
|
||||
|
||||
remove_air(amount as num)
|
||||
var/datum/gas_mixture/GM = new
|
||||
|
||||
var/sum = oxygen + carbon_dioxide + nitrogen + toxins
|
||||
if(sum>0)
|
||||
GM.oxygen = (oxygen/sum)*amount
|
||||
GM.carbon_dioxide = (carbon_dioxide/sum)*amount
|
||||
GM.nitrogen = (nitrogen/sum)*amount
|
||||
GM.toxins = (toxins/sum)*amount
|
||||
|
||||
GM.temperature = temperature
|
||||
|
||||
return GM
|
||||
|
||||
turf
|
||||
var/pressure_difference = 0
|
||||
var/pressure_direction = 0
|
||||
var/reporting_pressure_difference
|
||||
|
||||
//optimization vars
|
||||
var/next_check = 0 //number of ticks before this tile updates
|
||||
var/check_delay = 0 //number of ticks between updates
|
||||
|
||||
proc/high_pressure_movements()
|
||||
if(reporting_pressure_difference)
|
||||
world << "pressure_difference = [pressure_difference]; pressure_direction = [pressure_direction]"
|
||||
for(var/atom/movable/in_tile in src)
|
||||
in_tile.experience_pressure_difference(pressure_difference, pressure_direction)
|
||||
|
||||
pressure_difference = 0
|
||||
|
||||
proc/consider_pressure_difference(connection_difference, connection_direction)
|
||||
if(connection_difference < 0)
|
||||
connection_difference = -connection_difference
|
||||
connection_direction = turn(connection_direction,180)
|
||||
|
||||
if(connection_difference > pressure_difference)
|
||||
if(!pressure_difference)
|
||||
air_master.high_pressure_delta += src
|
||||
pressure_difference = connection_difference
|
||||
pressure_direction = connection_direction
|
||||
|
||||
turf/simulated/proc/consider_pressure_difference_space(connection_difference)
|
||||
for(var/direction in cardinal)
|
||||
if(direction&group_border)
|
||||
if(istype(get_step(src,direction),/turf/space))
|
||||
if(!pressure_difference)
|
||||
air_master.high_pressure_delta += src
|
||||
pressure_direction = direction
|
||||
pressure_difference = connection_difference
|
||||
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
turf/simulated
|
||||
|
||||
var/current_graphic = null
|
||||
|
||||
var/tmp/datum/gas_mixture/air
|
||||
|
||||
var/tmp/processing = 1
|
||||
var/tmp/datum/air_group/turf/parent
|
||||
var/tmp/group_border = 0
|
||||
var/tmp/length_space_border = 0
|
||||
|
||||
var/tmp/air_check_directions = 0 //Do not modify this, just add turf to air_master.tiles_to_update
|
||||
|
||||
var/tmp/archived_cycle = 0
|
||||
var/tmp/current_cycle = 0
|
||||
|
||||
var/tmp/obj/effect/hotspot/active_hotspot
|
||||
|
||||
var/tmp/temperature_archived //USED ONLY FOR SOLIDS
|
||||
var/tmp/being_superconductive = 0
|
||||
|
||||
proc/update_visuals(datum/gas_mixture/model)
|
||||
overlays.Cut()
|
||||
|
||||
var/siding_icon_state = return_siding_icon_state()
|
||||
if(siding_icon_state)
|
||||
overlays += image('icons/turf/floors.dmi',siding_icon_state)
|
||||
|
||||
switch(model.graphic)
|
||||
if("plasma")
|
||||
overlays.Add(plmaster)
|
||||
if("sleeping_agent")
|
||||
overlays.Add(slmaster)
|
||||
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
|
||||
if(!blocks_air)
|
||||
air = new
|
||||
|
||||
air.oxygen = oxygen
|
||||
air.carbon_dioxide = carbon_dioxide
|
||||
air.nitrogen = nitrogen
|
||||
air.toxins = toxins
|
||||
|
||||
air.temperature = temperature
|
||||
|
||||
if(air_master)
|
||||
air_master.tiles_to_update.Add(src)
|
||||
|
||||
find_group()
|
||||
|
||||
// air.parent = src //TODO DEBUG REMOVE
|
||||
|
||||
else
|
||||
if(air_master)
|
||||
for(var/direction in cardinal)
|
||||
var/turf/simulated/floor/target = get_step(src,direction)
|
||||
if(istype(target))
|
||||
air_master.tiles_to_update.Add(target)
|
||||
|
||||
Del()
|
||||
if(air_master)
|
||||
if(parent)
|
||||
air_master.groups_to_rebuild.Add(parent)
|
||||
parent.members.Remove(src)
|
||||
else
|
||||
air_master.active_singletons.Remove(src)
|
||||
if(active_hotspot)
|
||||
active_hotspot.garbage_collect()
|
||||
if(air_master && blocks_air)
|
||||
for(var/direction in list(NORTH, SOUTH, EAST, WEST))
|
||||
var/turf/simulated/tile = get_step(src,direction)
|
||||
if(istype(tile) && !tile.blocks_air)
|
||||
air_master.tiles_to_update.Add(tile)
|
||||
..()
|
||||
|
||||
assume_air(datum/gas_mixture/giver)
|
||||
if(!giver) return 0
|
||||
var/datum/gas_mixture/receiver = air
|
||||
if(istype(receiver))
|
||||
if(parent&&parent.group_processing)
|
||||
if(!parent.air.check_then_merge(giver))
|
||||
parent.suspend_group_processing()
|
||||
air.merge(giver)
|
||||
else
|
||||
if (giver.total_moles() > MINIMUM_AIR_TO_SUSPEND)
|
||||
reset_delay()
|
||||
|
||||
air.merge(giver)
|
||||
|
||||
if(!processing)
|
||||
if(air.check_tile_graphic())
|
||||
update_visuals(air)
|
||||
|
||||
return 1
|
||||
|
||||
else return ..()
|
||||
|
||||
proc/archive()
|
||||
if(air) //For open space like floors
|
||||
air.archive()
|
||||
|
||||
temperature_archived = temperature
|
||||
archived_cycle = air_master.current_cycle
|
||||
|
||||
proc/share_air_with_tile(turf/simulated/T)
|
||||
return air.share(T.air)
|
||||
|
||||
proc/mimic_air_with_tile(turf/T)
|
||||
return air.mimic(T)
|
||||
|
||||
proc/copy_air_with_tile(turf/simulated/T)
|
||||
if(istype(T) && T.air && air)
|
||||
air.copy_from(T.air)
|
||||
|
||||
proc/copy_air(datum/gas_mixture/copy)
|
||||
if(air && copy)
|
||||
air.copy_from(copy)
|
||||
|
||||
return_air()
|
||||
if(air)
|
||||
if(parent&&parent.group_processing)
|
||||
return parent.air
|
||||
else return air
|
||||
|
||||
else
|
||||
return ..()
|
||||
|
||||
remove_air(amount as num)
|
||||
if(air)
|
||||
var/datum/gas_mixture/removed = null
|
||||
|
||||
if(parent&&parent.group_processing)
|
||||
removed = parent.air.check_then_remove(amount)
|
||||
if(!removed)
|
||||
parent.suspend_group_processing()
|
||||
removed = air.remove(amount)
|
||||
else
|
||||
removed = air.remove(amount)
|
||||
|
||||
if(!processing)
|
||||
if(air.check_tile_graphic())
|
||||
update_visuals(air)
|
||||
|
||||
return removed
|
||||
|
||||
else
|
||||
return ..()
|
||||
|
||||
proc/update_air_properties()//OPTIMIZE
|
||||
air_check_directions = 0
|
||||
|
||||
for(var/direction in cardinal)
|
||||
if(CanPass(null, get_step(src,direction), 0, 0))
|
||||
air_check_directions |= direction
|
||||
|
||||
if(parent)
|
||||
if(parent.borders)
|
||||
parent.borders -= src
|
||||
if(length_space_border > 0)
|
||||
parent.length_space_border -= length_space_border
|
||||
length_space_border = 0
|
||||
|
||||
group_border = 0
|
||||
for(var/direction in cardinal)
|
||||
if(air_check_directions&direction)
|
||||
var/turf/simulated/T = get_step(src,direction)
|
||||
|
||||
//See if actually a border
|
||||
if(!istype(T) || (T.parent!=parent))
|
||||
|
||||
//See what kind of border it is
|
||||
if(istype(T,/turf/space))
|
||||
if(parent.space_borders)
|
||||
parent.space_borders |= src
|
||||
else
|
||||
parent.space_borders = list(src)
|
||||
length_space_border++
|
||||
|
||||
else
|
||||
if(parent.borders)
|
||||
parent.borders |= src
|
||||
else
|
||||
parent.borders = list(src)
|
||||
|
||||
group_border |= direction
|
||||
|
||||
parent.length_space_border += length_space_border
|
||||
|
||||
if(air_check_directions)
|
||||
processing = 1
|
||||
if(!parent)
|
||||
air_master.add_singleton(src)
|
||||
else
|
||||
processing = 0
|
||||
|
||||
proc/process_cell()
|
||||
//this proc does all the heavy lifting for individual tile processing
|
||||
//it shares with all of its neighbors, spreads fire, calls superconduction
|
||||
//and doesn't afraid of anything
|
||||
//Comment by errorage: In other words, this is the proc that lags the game.
|
||||
|
||||
//check if we're skipping this tick
|
||||
if (next_check > 0)
|
||||
next_check--
|
||||
return 1
|
||||
var/player_count = max(player_list.len, 3) / 3
|
||||
next_check += check_delay + rand(player_count, player_count * 1.5)
|
||||
check_delay++
|
||||
|
||||
var/turf/simulated/list/possible_fire_spreads = list()
|
||||
if(processing)
|
||||
if(archived_cycle < air_master.current_cycle) //archive self if not already done
|
||||
archive()
|
||||
current_cycle = air_master.current_cycle
|
||||
|
||||
for(var/direction in cardinal)
|
||||
if(air_check_directions&direction) //Grab all valid bordering tiles
|
||||
var/turf/simulated/enemy_tile = get_step(src, direction)
|
||||
var/connection_difference = 0
|
||||
|
||||
if(istype(enemy_tile)) //enemy_tile == neighbor, btw
|
||||
if(enemy_tile.archived_cycle < archived_cycle) //archive bordering tile information if not already done
|
||||
enemy_tile.archive()
|
||||
|
||||
if (air && enemy_tile.air)
|
||||
var/delay_trigger = air.compare(enemy_tile.air)
|
||||
if (!delay_trigger) //if compare() didn't return 1, air is different enough to trigger processing
|
||||
reset_delay()
|
||||
enemy_tile.reset_delay()
|
||||
|
||||
if(enemy_tile.parent && enemy_tile.parent.group_processing) //apply tile to group sharing
|
||||
if(enemy_tile.parent.current_cycle < current_cycle) //if the group hasn't been archived, it could just be out of date
|
||||
if(enemy_tile.parent.air.check_gas_mixture(air))
|
||||
connection_difference = air.share(enemy_tile.parent.air)
|
||||
else
|
||||
enemy_tile.parent.suspend_group_processing()
|
||||
connection_difference = air.share(enemy_tile.air)
|
||||
//group processing failed so interact with individual tile
|
||||
|
||||
else
|
||||
if(enemy_tile.current_cycle < current_cycle)
|
||||
connection_difference = air.share(enemy_tile.air)
|
||||
|
||||
if(active_hotspot)
|
||||
possible_fire_spreads += enemy_tile
|
||||
else
|
||||
/* var/obj/movable/floor/movable_on_enemy = locate(/obj/movable/floor) in enemy_tile
|
||||
|
||||
if(movable_on_enemy)
|
||||
if(movable_on_enemy.parent && movable_on_enemy.parent.group_processing) //apply tile to group sharing
|
||||
if(movable_on_enemy.parent.current_cycle < current_cycle)
|
||||
if(movable_on_enemy.parent.air.check_gas_mixture(air))
|
||||
connection_difference = air.share(movable_on_enemy.parent.air)
|
||||
|
||||
else
|
||||
movable_on_enemy.parent.suspend_group_processing()
|
||||
|
||||
if(movable_on_enemy.archived_cycle < archived_cycle) //archive bordering tile information if not already done
|
||||
movable_on_enemy.archive()
|
||||
connection_difference = air.share(movable_on_enemy.air)
|
||||
//group processing failed so interact with individual tile
|
||||
else
|
||||
if(movable_on_enemy.archived_cycle < archived_cycle) //archive bordering tile information if not already done
|
||||
movable_on_enemy.archive()
|
||||
|
||||
if(movable_on_enemy.current_cycle < current_cycle)
|
||||
connection_difference = share_air_with_tile(movable_on_enemy)
|
||||
|
||||
else*/
|
||||
connection_difference = mimic_air_with_tile(enemy_tile)
|
||||
//bordering a tile with fixed air properties
|
||||
|
||||
if(connection_difference)
|
||||
if(connection_difference > 0)
|
||||
consider_pressure_difference(connection_difference, direction)
|
||||
else
|
||||
enemy_tile.consider_pressure_difference(connection_difference, direction)
|
||||
else
|
||||
air_master.active_singletons -= src //not active if not processing!
|
||||
|
||||
air.react()
|
||||
|
||||
if(active_hotspot)
|
||||
if (!active_hotspot.process(possible_fire_spreads))
|
||||
return 0
|
||||
|
||||
if(air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION)
|
||||
consider_superconductivity(starting = 1)
|
||||
|
||||
if(air.check_tile_graphic())
|
||||
update_visuals(air)
|
||||
|
||||
if(air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
|
||||
reset_delay() //hotspots always process quickly
|
||||
hotspot_expose(air.temperature, CELL_VOLUME)
|
||||
for(var/atom/movable/item in src)
|
||||
item.temperature_expose(air, air.temperature, CELL_VOLUME)
|
||||
temperature_expose(air, air.temperature, CELL_VOLUME)
|
||||
|
||||
return 1
|
||||
|
||||
proc/super_conduct()
|
||||
var/conductivity_directions = 0
|
||||
if(blocks_air)
|
||||
//Does not participate in air exchange, so will conduct heat across all four borders at this time
|
||||
conductivity_directions = NORTH|SOUTH|EAST|WEST
|
||||
|
||||
if(archived_cycle < air_master.current_cycle)
|
||||
archive()
|
||||
|
||||
else
|
||||
//Does particate in air exchange so only consider directions not considered during process_cell()
|
||||
conductivity_directions = ~air_check_directions & (NORTH|SOUTH|EAST|WEST)
|
||||
|
||||
if(conductivity_directions>0)
|
||||
//Conduct with tiles around me
|
||||
for(var/direction in cardinal)
|
||||
if(conductivity_directions&direction)
|
||||
var/turf/neighbor = get_step(src,direction)
|
||||
|
||||
if(istype(neighbor, /turf/simulated)) //anything under this subtype will share in the exchange
|
||||
var/turf/simulated/modeled_neighbor = neighbor
|
||||
|
||||
if(modeled_neighbor.archived_cycle < air_master.current_cycle)
|
||||
modeled_neighbor.archive()
|
||||
|
||||
if(modeled_neighbor.air)
|
||||
if(air) //Both tiles are open
|
||||
|
||||
if(modeled_neighbor.parent && modeled_neighbor.parent.group_processing)
|
||||
if(parent && parent.group_processing)
|
||||
//both are acting as a group
|
||||
//modified using construct developed in datum/air_group/share_air_with_group(...)
|
||||
|
||||
var/result = parent.air.check_both_then_temperature_share(modeled_neighbor.parent.air, WINDOW_HEAT_TRANSFER_COEFFICIENT)
|
||||
if(result==0)
|
||||
//have to deconstruct parent air group
|
||||
|
||||
parent.suspend_group_processing()
|
||||
if(!modeled_neighbor.parent.air.check_me_then_temperature_share(air, WINDOW_HEAT_TRANSFER_COEFFICIENT))
|
||||
//may have to deconstruct neighbors air group
|
||||
|
||||
modeled_neighbor.parent.suspend_group_processing()
|
||||
air.temperature_share(modeled_neighbor.air, WINDOW_HEAT_TRANSFER_COEFFICIENT)
|
||||
else if(result==-1)
|
||||
// have to deconstruct neightbors air group but not mine
|
||||
|
||||
modeled_neighbor.parent.suspend_group_processing()
|
||||
parent.air.temperature_share(modeled_neighbor.air, WINDOW_HEAT_TRANSFER_COEFFICIENT)
|
||||
else
|
||||
air.temperature_share(modeled_neighbor.air, WINDOW_HEAT_TRANSFER_COEFFICIENT)
|
||||
else
|
||||
if(parent && parent.group_processing)
|
||||
if(!parent.air.check_me_then_temperature_share(air, WINDOW_HEAT_TRANSFER_COEFFICIENT))
|
||||
//may have to deconstruct neighbors air group
|
||||
|
||||
parent.suspend_group_processing()
|
||||
air.temperature_share(modeled_neighbor.air, WINDOW_HEAT_TRANSFER_COEFFICIENT)
|
||||
|
||||
else
|
||||
air.temperature_share(modeled_neighbor.air, WINDOW_HEAT_TRANSFER_COEFFICIENT)
|
||||
// world << "OPEN, OPEN"
|
||||
|
||||
else //Solid but neighbor is open
|
||||
if(modeled_neighbor.parent && modeled_neighbor.parent.group_processing)
|
||||
if(!modeled_neighbor.parent.air.check_me_then_temperature_turf_share(src, modeled_neighbor.thermal_conductivity))
|
||||
|
||||
modeled_neighbor.parent.suspend_group_processing()
|
||||
modeled_neighbor.air.temperature_turf_share(src, modeled_neighbor.thermal_conductivity)
|
||||
else
|
||||
modeled_neighbor.air.temperature_turf_share(src, modeled_neighbor.thermal_conductivity)
|
||||
// world << "SOLID, OPEN"
|
||||
|
||||
else
|
||||
if(air) //Open but neighbor is solid
|
||||
if(parent && parent.group_processing)
|
||||
if(!parent.air.check_me_then_temperature_turf_share(modeled_neighbor, modeled_neighbor.thermal_conductivity))
|
||||
parent.suspend_group_processing()
|
||||
air.temperature_turf_share(modeled_neighbor, modeled_neighbor.thermal_conductivity)
|
||||
else
|
||||
air.temperature_turf_share(modeled_neighbor, modeled_neighbor.thermal_conductivity)
|
||||
// world << "OPEN, SOLID"
|
||||
|
||||
else //Both tiles are solid
|
||||
share_temperature_mutual_solid(modeled_neighbor, modeled_neighbor.thermal_conductivity)
|
||||
// world << "SOLID, SOLID"
|
||||
|
||||
modeled_neighbor.consider_superconductivity()
|
||||
|
||||
else
|
||||
if(air) //Open
|
||||
if(parent && parent.group_processing)
|
||||
if(!parent.air.check_me_then_temperature_mimic(neighbor, neighbor.thermal_conductivity))
|
||||
parent.suspend_group_processing()
|
||||
air.temperature_mimic(neighbor, neighbor.thermal_conductivity)
|
||||
else
|
||||
air.temperature_mimic(neighbor, neighbor.thermal_conductivity)
|
||||
else
|
||||
mimic_temperature_solid(neighbor, neighbor.thermal_conductivity)
|
||||
|
||||
//Radiate excess tile heat to space
|
||||
if(temperature > T0C)
|
||||
// Is there a pre-defined Space Tile?
|
||||
if(!Space_Tile)
|
||||
Space_Tile = locate(/turf/space) // Define one
|
||||
//Considering 0 degC as te break even point for radiation in and out
|
||||
mimic_temperature_solid(Space_Tile, FLOOR_HEAT_TRANSFER_COEFFICIENT)
|
||||
|
||||
//Conduct with air on my tile if I have it
|
||||
if(air)
|
||||
if(parent && parent.group_processing)
|
||||
if(!parent.air.check_me_then_temperature_turf_share(src, thermal_conductivity))
|
||||
parent.suspend_group_processing()
|
||||
air.temperature_turf_share(src, thermal_conductivity)
|
||||
else
|
||||
air.temperature_turf_share(src, thermal_conductivity)
|
||||
|
||||
|
||||
//Make sure still hot enough to continue conducting heat
|
||||
if(air)
|
||||
if(air.temperature < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)
|
||||
being_superconductive = 0
|
||||
air_master.active_super_conductivity -= src
|
||||
return 0
|
||||
|
||||
else
|
||||
if(temperature < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)
|
||||
being_superconductive = 0
|
||||
air_master.active_super_conductivity -= src
|
||||
return 0
|
||||
|
||||
proc/mimic_temperature_solid(turf/model, conduction_coefficient)
|
||||
var/delta_temperature = (temperature_archived - model.temperature)
|
||||
if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER))
|
||||
|
||||
var/heat = conduction_coefficient*delta_temperature* \
|
||||
(heat_capacity*model.heat_capacity/(heat_capacity+model.heat_capacity))
|
||||
temperature -= heat/heat_capacity
|
||||
|
||||
proc/share_temperature_mutual_solid(turf/simulated/sharer, conduction_coefficient)
|
||||
var/delta_temperature = (temperature_archived - sharer.temperature_archived)
|
||||
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER && heat_capacity && sharer.heat_capacity)
|
||||
|
||||
var/heat = conduction_coefficient*delta_temperature* \
|
||||
(heat_capacity*sharer.heat_capacity/(heat_capacity+sharer.heat_capacity))
|
||||
|
||||
temperature -= heat/heat_capacity
|
||||
sharer.temperature += heat/sharer.heat_capacity
|
||||
|
||||
proc/consider_superconductivity(starting)
|
||||
|
||||
if(being_superconductive || !thermal_conductivity)
|
||||
return 0
|
||||
|
||||
if(air)
|
||||
if(air.temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION))
|
||||
return 0
|
||||
if(air.heat_capacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant.
|
||||
return 0
|
||||
else
|
||||
if(temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION))
|
||||
return 0
|
||||
|
||||
being_superconductive = 1
|
||||
|
||||
air_master.active_super_conductivity += src
|
||||
|
||||
proc/reset_delay()
|
||||
//sets this turf to process quickly again
|
||||
next_check=0
|
||||
check_delay= -5 //negative numbers mean a mandatory quick-update period
|
||||
|
||||
//if this turf has a parent air group, suspend its processing
|
||||
if (parent && parent.group_processing)
|
||||
parent.suspend_group_processing()
|
||||
@@ -95,7 +95,7 @@
|
||||
return
|
||||
|
||||
if(location.excited_group)
|
||||
location.excited_group.breakdown = 0
|
||||
location.excited_group.reset_cooldowns()
|
||||
|
||||
if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1))
|
||||
Kill()
|
||||
|
||||
@@ -110,19 +110,12 @@ datum/controller/air_system
|
||||
|
||||
/datum/controller/air_system/proc/process_excited_groups()
|
||||
for(var/datum/excited_group/EG in excited_groups)
|
||||
if(EG.breakdown)
|
||||
EG.breakdown_cooldown ++
|
||||
else
|
||||
EG.breakdown_cooldown = 0
|
||||
|
||||
if(EG.breakdown_cooldown > 10)
|
||||
if(EG.self_compare())
|
||||
EG.dismantle()
|
||||
EG.breakdown_cooldown ++
|
||||
if(EG.breakdown_cooldown == 10)
|
||||
if(!EG.self_compare())
|
||||
EG.reset_cooldowns()
|
||||
EG.self_breakdown()
|
||||
EG.breakdown = 1
|
||||
return
|
||||
if(EG.breakdown_cooldown > 20)
|
||||
EG.dismantle()
|
||||
|
||||
/turf/proc/CanAtmosPass(var/turf/T)
|
||||
if(!istype(T)) return 0
|
||||
|
||||
@@ -261,7 +261,7 @@ turf/simulated/proc/share_temperature_mutual_solid(turf/simulated/sharer, conduc
|
||||
|
||||
/turf/simulated/proc/last_share_check()
|
||||
if(air.last_share > MINIMUM_AIR_TO_SUSPEND)
|
||||
excited_group.breakdown = 0
|
||||
excited_group.reset_cooldowns()
|
||||
|
||||
/turf/proc/high_pressure_movements()
|
||||
for(var/atom/movable/M in src)
|
||||
@@ -287,7 +287,6 @@ atom/movable/proc/experience_pressure_difference(pressure_difference, direction)
|
||||
|
||||
/datum/excited_group
|
||||
var/list/turf_list = list()
|
||||
var/breakdown = 0
|
||||
var/breakdown_cooldown = 0
|
||||
|
||||
/datum/excited_group/New()
|
||||
@@ -317,36 +316,46 @@ atom/movable/proc/experience_pressure_difference(pressure_difference, direction)
|
||||
/datum/excited_group/proc/reset_cooldowns()
|
||||
breakdown_cooldown = 0
|
||||
|
||||
/datum/excited_group/proc/self_compare()
|
||||
var/restore = 1
|
||||
var/turf/simulated/sample = pick(turf_list)
|
||||
for(var/turf/simulated/T in turf_list)
|
||||
if(!T.air.compare(sample.air))
|
||||
restore = 0
|
||||
break
|
||||
if(restore)
|
||||
return 1
|
||||
|
||||
/datum/excited_group/proc/self_breakdown()
|
||||
var/datum/gas_mixture/A = new
|
||||
var/datum/gas/sleeping_agent/S = new
|
||||
A.trace_gases += S
|
||||
for(var/turf/simulated/T in turf_list)
|
||||
A.oxygen += T.air.oxygen
|
||||
A.carbon_dioxide+= T.air.carbon_dioxide
|
||||
A.nitrogen += T.air.nitrogen
|
||||
A.toxins += T.air.toxins
|
||||
|
||||
if(T.air.trace_gases.len)
|
||||
for(var/datum/gas/N in T.air.trace_gases)
|
||||
S.moles += N.moles
|
||||
|
||||
for(var/turf/simulated/T in turf_list)
|
||||
T.air.oxygen = A.oxygen/turf_list.len
|
||||
T.air.carbon_dioxide= A.carbon_dioxide/turf_list.len
|
||||
T.air.nitrogen = A.nitrogen/turf_list.len
|
||||
T.air.toxins = A.toxins/turf_list.len
|
||||
|
||||
if(S.moles > 0)
|
||||
if(T.air.trace_gases.len)
|
||||
for(var/datum/gas/G in T.air.trace_gases)
|
||||
G.moles = S.moles/turf_list.len
|
||||
else
|
||||
var/datum/gas/sleeping_agent/G = new
|
||||
G.moles = S.moles/turf_list.len
|
||||
T.air.trace_gases += G
|
||||
|
||||
if(T.air.check_tile_graphic())
|
||||
T.update_visuals(T.air)
|
||||
|
||||
|
||||
/datum/excited_group/proc/dismantle()
|
||||
for(var/turf/simulated/T in turf_list)
|
||||
T.excited = 0
|
||||
T.recently_active = 0
|
||||
T.excited_group = null
|
||||
air_master.active_turfs -= T
|
||||
air_master.excited_groups -= src
|
||||
garbage_collect()
|
||||
|
||||
/datum/excited_group/proc/garbage_collect()
|
||||
for(var/turf/simulated/T in turf_list)
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
/*
|
||||
|
||||
Hey you!
|
||||
You only need to untick maps/tgstation.2.0.9.dmm for this if you download the modified map from:
|
||||
http://tgstation13.googlecode.com/files/tgstation.2.1.0_deptsec.zip
|
||||
|
||||
Everything else can just be ticked on top of the original stuff.
|
||||
*/
|
||||
@@ -1,128 +0,0 @@
|
||||
var/list/sec_departments = list("engineering", "supply", "medical", "science")
|
||||
|
||||
/datum/job/officer/proc/assign_sec_to_department(var/mob/living/carbon/human/H)
|
||||
if(!sec_departments.len)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears)
|
||||
else
|
||||
var/department = pick(sec_departments)
|
||||
sec_departments -= department
|
||||
var/access = null
|
||||
var/destination = null
|
||||
switch(department)
|
||||
if("supply")
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/cargo(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/supply(H), slot_ears)
|
||||
access = list(access_mailsorting, access_mining)
|
||||
destination = /area/security/checkpoint/supply
|
||||
if("engineering")
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/engine(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/engi(H), slot_ears)
|
||||
access = list(access_construction, access_engine)
|
||||
destination = /area/security/checkpoint/engineering
|
||||
if("medical")
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/med(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/med(H), slot_ears)
|
||||
access = list(access_medical)
|
||||
destination = /area/security/checkpoint/medical
|
||||
if("science")
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/science(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/sci(H), slot_ears)
|
||||
access = list(access_research)
|
||||
destination = /area/security/checkpoint/science
|
||||
|
||||
if(destination)
|
||||
var/teleport = 0
|
||||
if(!ticker || ticker.current_state <= GAME_STATE_SETTING_UP)
|
||||
teleport = 1
|
||||
spawn(10)
|
||||
if(H)
|
||||
if(teleport)
|
||||
var/turf/T
|
||||
var/safety = 0
|
||||
while(safety < 25)
|
||||
T = pick(get_area_turfs(destination))
|
||||
if(!H.Move(T))
|
||||
safety += 1
|
||||
continue
|
||||
else
|
||||
break
|
||||
H << "<b>You have been assigned to [department]!</b>"
|
||||
var/obj/item/weapon/card/id/I = locate(/obj/item/weapon/card/id, H)
|
||||
if(I)
|
||||
I.access |= access
|
||||
|
||||
|
||||
|
||||
/datum/job/officer
|
||||
title = "Security Officer"
|
||||
flag = OFFICER
|
||||
department_flag = ENGSEC
|
||||
faction = "Station"
|
||||
total_positions = 5
|
||||
spawn_positions = 5
|
||||
supervisors = "the head of security, and the head of your assigned department (if applicable)"
|
||||
selection_color = "#ffeeee"
|
||||
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
|
||||
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
|
||||
assign_sec_to_department(H)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_s_store)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store)
|
||||
if(H.backbag == 1)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand)
|
||||
else
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
|
||||
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
|
||||
L.imp_in = H
|
||||
L.implanted = 1
|
||||
return 1
|
||||
|
||||
/obj/item/device/radio/headset/headset_sec/department/New()
|
||||
wires = new(src)
|
||||
secure_radio_connections = new
|
||||
|
||||
if(radio_controller)
|
||||
initialize()
|
||||
recalculateChannels()
|
||||
|
||||
/obj/item/device/radio/headset/headset_sec/department/engi
|
||||
keyslot1 = new /obj/item/device/encryptionkey/headset_sec
|
||||
keyslot2 = new /obj/item/device/encryptionkey/headset_eng
|
||||
|
||||
/obj/item/device/radio/headset/headset_sec/department/supply
|
||||
keyslot1 = new /obj/item/device/encryptionkey/headset_sec
|
||||
keyslot2 = new /obj/item/device/encryptionkey/headset_cargo
|
||||
|
||||
/obj/item/device/radio/headset/headset_sec/department/med
|
||||
keyslot1 = new /obj/item/device/encryptionkey/headset_sec
|
||||
keyslot2 = new /obj/item/device/encryptionkey/headset_med
|
||||
|
||||
/obj/item/device/radio/headset/headset_sec/department/sci
|
||||
keyslot1 = new /obj/item/device/encryptionkey/headset_sec
|
||||
keyslot2 = new /obj/item/device/encryptionkey/headset_sci
|
||||
|
||||
/obj/item/clothing/under/rank/security/cargo/New()
|
||||
var/obj/item/clothing/tie/armband/cargo/A = new /obj/item/clothing/tie/armband/cargo
|
||||
hastie = A
|
||||
|
||||
/obj/item/clothing/under/rank/security/engine/New()
|
||||
var/obj/item/clothing/tie/armband/engine/A = new /obj/item/clothing/tie/armband/engine
|
||||
hastie = A
|
||||
|
||||
/obj/item/clothing/under/rank/security/science/New()
|
||||
var/obj/item/clothing/tie/armband/science/A = new /obj/item/clothing/tie/armband/science
|
||||
hastie = A
|
||||
|
||||
/obj/item/clothing/under/rank/security/med/New()
|
||||
var/obj/item/clothing/tie/armband/medgreen/A = new /obj/item/clothing/tie/armband/medgreen
|
||||
hastie = A
|
||||
@@ -74,7 +74,6 @@
|
||||
/var/const/access_cent_living = 105//Living quarters.
|
||||
/var/const/access_cent_storage = 106//Generic storage areas.
|
||||
/var/const/access_cent_teleporter = 107//Teleporter.
|
||||
/var/const/access_cent_creed = 108//Creed's office.
|
||||
/var/const/access_cent_captain = 109//Captain's office/ID comp/AI.
|
||||
|
||||
//The Syndicate
|
||||
@@ -198,11 +197,11 @@
|
||||
return list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
|
||||
if("Medical Doctor")
|
||||
return list(access_medical, access_morgue, access_surgery)
|
||||
if("Botanist") // -- TLE
|
||||
if("Botanist")
|
||||
return list(access_hydroponics, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning.
|
||||
if("Librarian") // -- TLE
|
||||
if("Librarian")
|
||||
return list(access_library)
|
||||
if("Lawyer") //Muskets 160910
|
||||
if("Lawyer")
|
||||
return list(access_lawyer, access_court, access_sec_doors)
|
||||
if("Captain")
|
||||
return get_all_accesses()
|
||||
@@ -283,7 +282,7 @@
|
||||
if("Research Officer")
|
||||
return list(access_cent_general, access_cent_specops, access_cent_medical, access_cent_teleporter, access_cent_storage)
|
||||
if("BlackOps Commander")
|
||||
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_living, access_cent_storage, access_cent_creed)
|
||||
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_living, access_cent_storage)
|
||||
if("Supreme Commander")
|
||||
return get_all_centcom_access()
|
||||
|
||||
@@ -301,7 +300,7 @@
|
||||
access_keycard_auth, access_tcomsat, access_gateway)
|
||||
|
||||
/proc/get_all_centcom_access()
|
||||
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_creed, access_cent_captain)
|
||||
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_captain)
|
||||
|
||||
/proc/get_all_syndicate_access()
|
||||
return list(access_syndicate)
|
||||
@@ -490,8 +489,6 @@
|
||||
return "Code Blue"
|
||||
if(access_cent_specops)
|
||||
return "Code Black"
|
||||
if(access_cent_creed)
|
||||
return "Code Silver"
|
||||
if(access_cent_captain)
|
||||
return "Code Gold"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
M.client.show_popup_menus = 1
|
||||
for(var/obj/effect/bmode/buildholder/H)
|
||||
if(H.cl == M.client)
|
||||
del(H)
|
||||
qdel(H)
|
||||
else
|
||||
log_admin("[key_name(usr)] has entered build mode.")
|
||||
M.client.buildmode = 1
|
||||
@@ -212,7 +212,7 @@
|
||||
T.ChangeTurf(/turf/simulated/wall)
|
||||
return
|
||||
else if(istype(object,/obj))
|
||||
del(object)
|
||||
qdel(object)
|
||||
return
|
||||
else if(istype(object,/turf) && pa.Find("alt") && pa.Find("left"))
|
||||
new/obj/machinery/door/airlock(get_turf(object))
|
||||
@@ -242,7 +242,7 @@
|
||||
var/obj/A = new holder.buildmode.objholder (get_turf(object))
|
||||
A.dir = holder.builddir.dir
|
||||
else if(pa.Find("right"))
|
||||
if(isobj(object)) del(object)
|
||||
if(isobj(object)) qdel(object)
|
||||
|
||||
if(3)
|
||||
if(pa.Find("left")) //I cant believe this shit actually compiles.
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
/client/verb/pipenets_debug()
|
||||
if(!holder) return
|
||||
for(var/i=1,i<=pipe_networks.len,i++)
|
||||
// src << "<a href='?"\ref[holder]";adminplayervars=\ref[powernets[i]]'>[copytext("\ref[powernets[i]]",8,12)]</A>"
|
||||
src << "<A HREF='?_src_=vars;Vars=\ref[pipe_networks[i]]'>[copytext("\ref[pipe_networks[i]]",8,12)]</A>"
|
||||
src << "[pipe_networks.len] total pipenets"
|
||||
|
||||
|
||||
/client/verb/pipenet_overlays()
|
||||
var/list/L = list()
|
||||
for(var/obj/machinery/atmospherics/AT in view(mob))
|
||||
AT.maptext = null
|
||||
L |= AT
|
||||
for(var/datum/pipe_network/Network in pipe_networks)
|
||||
for(var/obj/machinery/atmospherics/AT in Network.normal_members)
|
||||
if(!(AT in L))
|
||||
continue
|
||||
if(!AT.maptext)
|
||||
AT.maptext = "<font color='white'>[copytext("\ref[Network]",8,12)]</font>"
|
||||
else
|
||||
world << "DUPLICATE: <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[AT.x];Y=[AT.y];Z=[AT.z]'>[AT.name]</a> net#<A HREF='?_src_=vars;Vars=\ref[Network]'>[copytext("\ref[Network]",8,12)]</A>)"
|
||||
for(var/datum/pipeline/PL in Network.line_members)
|
||||
for(var/obj/machinery/atmospherics/AT in PL.members)
|
||||
if(!(AT in L))
|
||||
continue
|
||||
if(!AT.maptext)
|
||||
AT.maptext = "<font color='green'>[copytext("\ref[Network]",8,12)]</font>"
|
||||
else
|
||||
world << "DUPLICATE: <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[AT.x];Y=[AT.y];Z=[AT.z]'>[AT.name]</a> net#<A HREF='?_src_=vars;Vars=\ref[Network]'>[copytext("\ref[Network]",8,12)]</A>)"
|
||||
for(var/obj/machinery/atmospherics/ATE in PL.edges)
|
||||
if(!(ATE in L))
|
||||
continue
|
||||
if(!ATE.maptext)
|
||||
ATE.maptext = "<font color='red'>[copytext("\ref[Network]",8,12)]</font>"
|
||||
else
|
||||
world << "DUPLICATE: <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[ATE.x];Y=[ATE.y];Z=[ATE.z]'>[ATE.name]</a> net#<A HREF='?_src_=vars;Vars=\ref[Network]'>[copytext("\ref[Network]",8,12)]</A>)"
|
||||
|
||||
/client/verb/follow_pipenet(var/netref as null|anything in get_refs(pipe_networks))
|
||||
var/datum/pipe_network/Network = locate(netref)
|
||||
if(!Network)
|
||||
src << "Unable to locate [netref]"
|
||||
return
|
||||
for(var/obj/machinery/atmospherics/AT in world)
|
||||
if(AT)
|
||||
animate(AT, alpha = 255, time = 0)
|
||||
for(var/obj/machinery/atmospherics/AT in Network.normal_members)
|
||||
if(AT)
|
||||
animate(AT, alpha = 0, time = 1, loop = -1)
|
||||
animate(alpha = 255, time = 1)
|
||||
for(var/datum/pipeline/PL in Network.line_members)
|
||||
for(var/obj/machinery/atmospherics/AT in PL.members)
|
||||
if(AT)
|
||||
animate(AT, alpha = 0, time = 1, loop = -1)
|
||||
animate(alpha = 255, time = 1)
|
||||
|
||||
/proc/get_refs(var/list/L)
|
||||
. = list()
|
||||
for(var/everything in L)
|
||||
. += "\ref[everything]"
|
||||
@@ -1,14 +1,13 @@
|
||||
/*
|
||||
client/verb/powernets_debug()
|
||||
/client/verb/powernets_debug()
|
||||
if(!holder) return
|
||||
var/ref_holder = "\ref[holder]"
|
||||
for(var/i=1,i<=powernets.len,i++)
|
||||
src << "<a href='?[ref_holder];adminplayervars=\ref[powernets[i]]'>[copytext("\ref[powernets[i]]",8,12)]</A>"
|
||||
// src << "<a href='?\ref[holder];adminplayervars=\ref[powernets[i]]'>[copytext("\ref[powernets[i]]",8,12)]</A>"
|
||||
src << "<A HREF='?_src_=vars;Vars=\ref[powernets[i]]'>[copytext("\ref[powernets[i]]",8,12)]</A>"
|
||||
|
||||
|
||||
client/verb/powernet_overlays()
|
||||
/client/verb/powernet_overlays()
|
||||
for(var/obj/structure/cable/C in cable_list)
|
||||
C.maptext = "<font color='white'>[copytext("\ref[C.powernet]",8,12)]</font>"
|
||||
for(var/obj/machinery/power/M in machines)
|
||||
M.maptext = "<font color='white'>[copytext("\ref[M.powernet]",8,12)]</font>"
|
||||
*/
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
/obj/effect/expl_particles/New()
|
||||
..()
|
||||
spawn (15)
|
||||
del(src)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/effect/expl_particles/Move()
|
||||
@@ -49,7 +49,7 @@
|
||||
/obj/effect/explosion/New()
|
||||
..()
|
||||
spawn (10)
|
||||
del(src)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/datum/effect/system/explosion
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
var/works = 0
|
||||
var/datum/disease2/disease/virus2 = null
|
||||
item_state = "syringe_0"
|
||||
throw_speed = 1
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
w_class = 2.0
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#define TOX "tox"
|
||||
#define OXY "oxy"
|
||||
#define CLONE "clone"
|
||||
#define HALLOSS "halloss"
|
||||
#define STAMINA "stamina"
|
||||
|
||||
#define STUN "stun"
|
||||
#define WEAKEN "weaken"
|
||||
@@ -40,8 +40,8 @@
|
||||
#define GRAB_KILL 5
|
||||
|
||||
#define HOSTILE_STANCE_IDLE 1
|
||||
#define HOSTILE_STANCE_ALERT 2
|
||||
//#define HOSTILE_STANCE_ALERT 2 //Was only used by bears
|
||||
#define HOSTILE_STANCE_ATTACK 3
|
||||
#define HOSTILE_STANCE_ATTACKING 4
|
||||
#define HOSTILE_STANCE_TIRED 5
|
||||
//#define HOSTILE_STANCE_TIRED 5 //Was also only used by bears
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#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 TABLEPASS 2 // can pass by a table or rack ~ apparently actually unused, uses pass_flags instead
|
||||
#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.
|
||||
#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
|
||||
#define MASKINTERNALS 8 // mask allows internals
|
||||
//#define SUITSPACE 8 // suit protects against space
|
||||
|
||||
@@ -14,3 +14,16 @@
|
||||
#define MANIFEST_ERROR_ITEM 4
|
||||
|
||||
#define TRANSITIONEDGE 7 //Distance from edge to move to another z-level
|
||||
|
||||
|
||||
|
||||
//HUD styles. Please ensure HUD_VERSIONS is the same as the maximum index. Index order defines how they are cycled in F12.
|
||||
#define HUD_STYLE_STANDARD 1
|
||||
#define HUD_STYLE_REDUCED 2
|
||||
#define HUD_STYLE_NOHUD 3
|
||||
|
||||
|
||||
#define HUD_VERSIONS 3 //used in show_hud()
|
||||
//1 = standard hud
|
||||
//2 = reduced hud (just hands and intent switcher)
|
||||
//3 = no hud (for screenshots)
|
||||
|
||||
@@ -23,5 +23,5 @@
|
||||
#define BE_ALIEN 64
|
||||
#define BE_PAI 128
|
||||
#define BE_CULTIST 256
|
||||
#define BE_MONKEY 512
|
||||
#define BE_BLOB 512
|
||||
#define BE_NINJA 1024
|
||||
|
||||
+389
-386
@@ -1,386 +1,389 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
|
||||
/proc/get_area(O)
|
||||
var/atom/location = O
|
||||
var/i
|
||||
for(i=1, i<=20, i++)
|
||||
if(isarea(location))
|
||||
return location
|
||||
else if (istype(location))
|
||||
location = location.loc
|
||||
else
|
||||
return null
|
||||
return 0
|
||||
|
||||
/proc/get_area_master(O)
|
||||
var/area/A = get_area(O)
|
||||
if(A && A.master)
|
||||
A = A.master
|
||||
return A
|
||||
|
||||
/proc/get_area_name(N) //get area by its name
|
||||
for(var/area/A in world)
|
||||
if(A.name == N)
|
||||
return A
|
||||
return 0
|
||||
|
||||
/proc/in_range(source, user)
|
||||
if(get_dist(source, user) <= 1)
|
||||
return 1
|
||||
|
||||
return 0 //not in range and not telekinetic
|
||||
|
||||
// Like view but bypasses luminosity check
|
||||
|
||||
/proc/hear(var/range, var/atom/source)
|
||||
|
||||
var/lum = source.luminosity
|
||||
source.luminosity = 6
|
||||
|
||||
var/list/heard = view(range, source)
|
||||
source.luminosity = lum
|
||||
|
||||
return heard
|
||||
|
||||
/proc/alone_in_area(var/area/the_area, var/mob/must_be_alone, var/check_type = /mob/living/carbon)
|
||||
var/area/our_area = get_area_master(the_area)
|
||||
for(var/C in living_mob_list)
|
||||
if(!istype(C, check_type))
|
||||
continue
|
||||
if(C == must_be_alone)
|
||||
continue
|
||||
if(our_area == get_area_master(C))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
//Magic constants obtained by using linear regression on right-angled triangles of sides 0<x<1, 0<y<1
|
||||
//They should approximate pythagoras theorem well enough for our needs.
|
||||
#define k1 0.934
|
||||
#define k2 0.427
|
||||
/proc/cheap_hypotenuse(Ax,Ay,Bx,By) // T is just the second atom to check distance to center with
|
||||
var/dx = abs(Ax - Bx) //sides of right-angled triangle
|
||||
var/dy = abs(Ay - By)
|
||||
if(dx>=dy) return (k1*dx) + (k2*dy) //No sqrt or powers :)
|
||||
else return (k2*dx) + (k1*dy)
|
||||
#undef k1
|
||||
#undef k2
|
||||
|
||||
/proc/circlerange(center=usr,radius=3)
|
||||
|
||||
var/turf/centerturf = get_turf(center)
|
||||
var/list/turfs = new/list()
|
||||
var/rsq = radius * (radius+0.5)
|
||||
|
||||
for(var/atom/T in range(radius, centerturf))
|
||||
var/dx = T.x - centerturf.x
|
||||
var/dy = T.y - centerturf.y
|
||||
if(dx*dx + dy*dy <= rsq)
|
||||
turfs += T
|
||||
|
||||
//turfs += centerturf
|
||||
return turfs
|
||||
|
||||
/proc/circleview(center=usr,radius=3)
|
||||
|
||||
var/turf/centerturf = get_turf(center)
|
||||
var/list/atoms = new/list()
|
||||
var/rsq = radius * (radius+0.5)
|
||||
|
||||
for(var/atom/A in view(radius, centerturf))
|
||||
var/dx = A.x - centerturf.x
|
||||
var/dy = A.y - centerturf.y
|
||||
if(dx*dx + dy*dy <= rsq)
|
||||
atoms += A
|
||||
|
||||
//turfs += centerturf
|
||||
return atoms
|
||||
|
||||
/proc/get_dist_euclidian(atom/Loc1 as turf|mob|obj,atom/Loc2 as turf|mob|obj)
|
||||
var/dx = Loc1.x - Loc2.x
|
||||
var/dy = Loc1.y - Loc2.y
|
||||
|
||||
var/dist = sqrt(dx**2 + dy**2)
|
||||
|
||||
return dist
|
||||
|
||||
/proc/circlerangeturfs(center=usr,radius=3)
|
||||
|
||||
var/turf/centerturf = get_turf(center)
|
||||
var/list/turfs = new/list()
|
||||
var/rsq = radius * (radius+0.5)
|
||||
|
||||
for(var/turf/T in range(radius, centerturf))
|
||||
var/dx = T.x - centerturf.x
|
||||
var/dy = T.y - centerturf.y
|
||||
if(dx*dx + dy*dy <= rsq)
|
||||
turfs += T
|
||||
return turfs
|
||||
|
||||
/proc/circleviewturfs(center=usr,radius=3) //Is there even a diffrence between this proc and circlerangeturfs()?
|
||||
|
||||
var/turf/centerturf = get_turf(center)
|
||||
var/list/turfs = new/list()
|
||||
var/rsq = radius * (radius+0.5)
|
||||
|
||||
for(var/turf/T in view(radius, centerturf))
|
||||
var/dx = T.x - centerturf.x
|
||||
var/dy = T.y - centerturf.y
|
||||
if(dx*dx + dy*dy <= rsq)
|
||||
turfs += T
|
||||
return turfs
|
||||
|
||||
|
||||
|
||||
//var/debug_mob = 0
|
||||
|
||||
// Will recursively loop through an atom's contents and check for mobs, then it will loop through every atom in that atom's contents.
|
||||
// It will keep doing this until it checks every content possible. This will fix any problems with mobs, that are inside objects,
|
||||
// being unable to hear people due to being in a box within a bag.
|
||||
|
||||
/proc/recursive_mob_check(var/atom/O, var/list/L = list(), var/recursion_limit = 3, var/client_check = 1, var/sight_check = 1, var/include_radio = 1)
|
||||
|
||||
//debug_mob += O.contents.len
|
||||
if(!recursion_limit)
|
||||
return L
|
||||
for(var/atom/A in O.contents)
|
||||
|
||||
if(ismob(A))
|
||||
var/mob/M = A
|
||||
if(client_check && !M.client)
|
||||
L = recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio)
|
||||
continue
|
||||
if(sight_check && !isInSight(A, O))
|
||||
continue
|
||||
L |= M
|
||||
//world.log << "[recursion_limit] = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])"
|
||||
|
||||
else if(include_radio && istype(A, /obj/item/device/radio))
|
||||
if(sight_check && !isInSight(A, O))
|
||||
continue
|
||||
L |= A
|
||||
|
||||
if(isobj(A) || ismob(A))
|
||||
L = recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio)
|
||||
return L
|
||||
|
||||
// The old system would loop through lists for a total of 5000 per function call, in an empty server.
|
||||
// This new system will loop at around 1000 in an empty server.
|
||||
|
||||
/proc/get_mobs_in_view(var/R, var/atom/source)
|
||||
// Returns a list of mobs in range of R from source. Used in radio and say code.
|
||||
|
||||
var/turf/T = get_turf(source)
|
||||
var/list/hear = list()
|
||||
|
||||
if(!T)
|
||||
return hear
|
||||
|
||||
var/list/range = hear(R, T)
|
||||
|
||||
for(var/atom/A in range)
|
||||
if(ismob(A))
|
||||
var/mob/M = A
|
||||
if(M.client)
|
||||
hear += M
|
||||
//world.log << "Start = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])"
|
||||
else if(istype(A, /obj/item/device/radio))
|
||||
hear += A
|
||||
|
||||
if(isobj(A) || ismob(A))
|
||||
hear = recursive_mob_check(A, hear, 3, 1, 0, 1)
|
||||
|
||||
return hear
|
||||
|
||||
|
||||
/proc/get_mobs_in_radio_ranges(var/list/obj/item/device/radio/radios)
|
||||
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
. = list()
|
||||
// Returns a list of mobs who can hear any of the radios given in @radios
|
||||
var/list/speaker_coverage = list()
|
||||
for(var/i = 1; i <= radios.len; i++)
|
||||
var/obj/item/device/radio/R = radios[i]
|
||||
if(R)
|
||||
var/turf/speaker = get_turf(R)
|
||||
if(speaker)
|
||||
for(var/turf/T in hear(R.canhear_range,speaker))
|
||||
speaker_coverage[T] = T
|
||||
|
||||
|
||||
// Try to find all the players who can hear the message
|
||||
for(var/i = 1; i <= player_list.len; i++)
|
||||
var/mob/M = player_list[i]
|
||||
if(M)
|
||||
var/turf/ear = get_turf(M)
|
||||
if(ear)
|
||||
if(speaker_coverage[ear])
|
||||
. |= M
|
||||
return .
|
||||
|
||||
#define SIGN(X) ((X<0)?-1:1)
|
||||
|
||||
proc
|
||||
inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5)
|
||||
var/turf/T
|
||||
if(X1==X2)
|
||||
if(Y1==Y2)
|
||||
return 1 //Light cannot be blocked on same tile
|
||||
else
|
||||
var/s = SIGN(Y2-Y1)
|
||||
Y1+=s
|
||||
while(Y1!=Y2)
|
||||
T=locate(X1,Y1,Z)
|
||||
if(T.opacity)
|
||||
return 0
|
||||
Y1+=s
|
||||
else
|
||||
var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1))
|
||||
var/b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles
|
||||
var/signX = SIGN(X2-X1)
|
||||
var/signY = SIGN(Y2-Y1)
|
||||
if(X1<X2)
|
||||
b+=m
|
||||
while(X1!=X2 || Y1!=Y2)
|
||||
if(round(m*X1+b-Y1))
|
||||
Y1+=signY //Line exits tile vertically
|
||||
else
|
||||
X1+=signX //Line exits tile horizontally
|
||||
T=locate(X1,Y1,Z)
|
||||
if(T.opacity)
|
||||
return 0
|
||||
return 1
|
||||
#undef SIGN
|
||||
|
||||
proc/isInSight(var/atom/A, var/atom/B)
|
||||
var/turf/Aturf = get_turf(A)
|
||||
var/turf/Bturf = get_turf(B)
|
||||
|
||||
if(!Aturf || !Bturf)
|
||||
return 0
|
||||
|
||||
if(inLineOfSight(Aturf.x,Aturf.y, Bturf.x,Bturf.y,Aturf.z))
|
||||
return 1
|
||||
|
||||
else
|
||||
return 0
|
||||
|
||||
/proc/get_cardinal_step_away(atom/start, atom/finish) //returns the position of a step from start away from finish, in one of the cardinal directions
|
||||
//returns only NORTH, SOUTH, EAST, or WEST
|
||||
var/dx = finish.x - start.x
|
||||
var/dy = finish.y - start.y
|
||||
if(abs(dy) > abs (dx)) //slope is above 1:1 (move horizontally in a tie)
|
||||
if(dy > 0)
|
||||
return get_step(start, SOUTH)
|
||||
else
|
||||
return get_step(start, NORTH)
|
||||
else
|
||||
if(dx > 0)
|
||||
return get_step(start, WEST)
|
||||
else
|
||||
return get_step(start, EAST)
|
||||
|
||||
/proc/try_move_adjacent(atom/movable/AM)
|
||||
var/turf/T = get_turf(AM)
|
||||
for(var/direction in cardinal)
|
||||
if(AM.Move(get_step(T, direction)))
|
||||
break
|
||||
|
||||
/proc/get_mob_by_key(var/key)
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.ckey == lowertext(key))
|
||||
return M
|
||||
return null
|
||||
|
||||
// Will return a list of active candidates. It increases the buffer 5 times until it finds a candidate which is active within the buffer.
|
||||
|
||||
/proc/get_candidates(be_special_flag=0, afk_bracket=3000)
|
||||
var/list/candidates = list()
|
||||
// Keep looping until we find a non-afk candidate within the time bracket (we limit the bracket to 10 minutes (6000))
|
||||
while(!candidates.len && afk_bracket < 6000)
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
if(G.client != null)
|
||||
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||
if(!G.client.is_afk(afk_bracket) && (G.client.prefs.be_special & be_special_flag))
|
||||
candidates += G.client
|
||||
afk_bracket += 600 // Add a minute to the bracket, for every attempt
|
||||
return candidates
|
||||
|
||||
/proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480)
|
||||
if(!isobj(O)) O = new /obj/screen/text()
|
||||
O.maptext = maptext
|
||||
O.maptext_height = maptext_height
|
||||
O.maptext_width = maptext_width
|
||||
O.screen_loc = screen_loc
|
||||
return O
|
||||
|
||||
/proc/Show2Group4Delay(obj/O, list/group, delay=0)
|
||||
if(!isobj(O)) return
|
||||
if(!group) group = clients
|
||||
for(var/client/C in group)
|
||||
C.screen += O
|
||||
if(delay)
|
||||
spawn(delay)
|
||||
for(var/client/C in group)
|
||||
C.screen -= O
|
||||
|
||||
/proc/flick_overlay(image/I, list/show_to, duration)
|
||||
for(var/client/C in show_to)
|
||||
C.images += I
|
||||
sleep(duration)
|
||||
for(var/client/C in show_to)
|
||||
C.images -= I
|
||||
|
||||
/proc/get_active_player_count()
|
||||
// Get active players who are playing in the round
|
||||
var/active_players = 0
|
||||
for(var/i = 1; i <= player_list.len; i++)
|
||||
var/mob/M = player_list[i]
|
||||
if(M && M.client)
|
||||
if(istype(M, /mob/new_player)) // exclude people in the lobby
|
||||
continue
|
||||
else if(isobserver(M)) // Ghosts are fine if they were playing once (didn't start as observers)
|
||||
var/mob/dead/observer/O = M
|
||||
if(O.started_as_observer) // Exclude people who started as observers
|
||||
continue
|
||||
active_players++
|
||||
return active_players
|
||||
|
||||
/datum/projectile_data
|
||||
var/src_x
|
||||
var/src_y
|
||||
var/time
|
||||
var/distance
|
||||
var/power_x
|
||||
var/power_y
|
||||
var/dest_x
|
||||
var/dest_y
|
||||
|
||||
/datum/projectile_data/New(var/src_x, var/src_y, var/time, var/distance, \
|
||||
var/power_x, var/power_y, var/dest_x, var/dest_y)
|
||||
src.src_x = src_x
|
||||
src.src_y = src_y
|
||||
src.time = time
|
||||
src.distance = distance
|
||||
src.power_x = power_x
|
||||
src.power_y = power_y
|
||||
src.dest_x = dest_x
|
||||
src.dest_y = dest_y
|
||||
|
||||
/proc/projectile_trajectory(var/src_x, var/src_y, var/rotation, var/angle, var/power)
|
||||
|
||||
// returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle],
|
||||
// rotated at [rotation] and with the power of [power]
|
||||
// Thanks to VistaPOWA for this function
|
||||
|
||||
var/power_x = power * cos(angle)
|
||||
var/power_y = power * sin(angle)
|
||||
var/time = 2* power_y / 10 //10 = g
|
||||
|
||||
var/distance = time * power_x
|
||||
|
||||
var/dest_x = src_x + distance*sin(rotation);
|
||||
var/dest_y = src_y + distance*cos(rotation);
|
||||
|
||||
return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y)
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
|
||||
/proc/get_area(O)
|
||||
var/atom/location = O
|
||||
var/i
|
||||
for(i=1, i<=20, i++)
|
||||
if(isarea(location))
|
||||
return location
|
||||
else if (istype(location))
|
||||
location = location.loc
|
||||
else
|
||||
return null
|
||||
return 0
|
||||
|
||||
/proc/get_area_master(O)
|
||||
var/area/A = get_area(O)
|
||||
if(A && A.master)
|
||||
A = A.master
|
||||
return A
|
||||
|
||||
/proc/get_area_name(N) //get area by its name
|
||||
for(var/area/A in world)
|
||||
if(A.name == N)
|
||||
return A
|
||||
return 0
|
||||
|
||||
/proc/in_range(source, user)
|
||||
if(get_dist(source, user) <= 1)
|
||||
return 1
|
||||
|
||||
return 0 //not in range and not telekinetic
|
||||
|
||||
// Like view but bypasses luminosity check
|
||||
|
||||
/proc/hear(var/range, var/atom/source)
|
||||
|
||||
var/lum = source.luminosity
|
||||
source.luminosity = 6
|
||||
|
||||
var/list/heard = view(range, source)
|
||||
source.luminosity = lum
|
||||
|
||||
return heard
|
||||
|
||||
/proc/alone_in_area(var/area/the_area, var/mob/must_be_alone, var/check_type = /mob/living/carbon)
|
||||
var/area/our_area = get_area_master(the_area)
|
||||
for(var/C in living_mob_list)
|
||||
if(!istype(C, check_type))
|
||||
continue
|
||||
if(C == must_be_alone)
|
||||
continue
|
||||
if(our_area == get_area_master(C))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
//Magic constants obtained by using linear regression on right-angled triangles of sides 0<x<1, 0<y<1
|
||||
//They should approximate pythagoras theorem well enough for our needs.
|
||||
#define k1 0.934
|
||||
#define k2 0.427
|
||||
/proc/cheap_hypotenuse(Ax,Ay,Bx,By) // T is just the second atom to check distance to center with
|
||||
var/dx = abs(Ax - Bx) //sides of right-angled triangle
|
||||
var/dy = abs(Ay - By)
|
||||
if(dx>=dy) return (k1*dx) + (k2*dy) //No sqrt or powers :)
|
||||
else return (k2*dx) + (k1*dy)
|
||||
#undef k1
|
||||
#undef k2
|
||||
|
||||
/proc/circlerange(center=usr,radius=3)
|
||||
|
||||
var/turf/centerturf = get_turf(center)
|
||||
var/list/turfs = new/list()
|
||||
var/rsq = radius * (radius+0.5)
|
||||
|
||||
for(var/atom/T in range(radius, centerturf))
|
||||
var/dx = T.x - centerturf.x
|
||||
var/dy = T.y - centerturf.y
|
||||
if(dx*dx + dy*dy <= rsq)
|
||||
turfs += T
|
||||
|
||||
//turfs += centerturf
|
||||
return turfs
|
||||
|
||||
/proc/circleview(center=usr,radius=3)
|
||||
|
||||
var/turf/centerturf = get_turf(center)
|
||||
var/list/atoms = new/list()
|
||||
var/rsq = radius * (radius+0.5)
|
||||
|
||||
for(var/atom/A in view(radius, centerturf))
|
||||
var/dx = A.x - centerturf.x
|
||||
var/dy = A.y - centerturf.y
|
||||
if(dx*dx + dy*dy <= rsq)
|
||||
atoms += A
|
||||
|
||||
//turfs += centerturf
|
||||
return atoms
|
||||
|
||||
/proc/get_dist_euclidian(atom/Loc1 as turf|mob|obj,atom/Loc2 as turf|mob|obj)
|
||||
var/dx = Loc1.x - Loc2.x
|
||||
var/dy = Loc1.y - Loc2.y
|
||||
|
||||
var/dist = sqrt(dx**2 + dy**2)
|
||||
|
||||
return dist
|
||||
|
||||
/proc/circlerangeturfs(center=usr,radius=3)
|
||||
|
||||
var/turf/centerturf = get_turf(center)
|
||||
var/list/turfs = new/list()
|
||||
var/rsq = radius * (radius+0.5)
|
||||
|
||||
for(var/turf/T in range(radius, centerturf))
|
||||
var/dx = T.x - centerturf.x
|
||||
var/dy = T.y - centerturf.y
|
||||
if(dx*dx + dy*dy <= rsq)
|
||||
turfs += T
|
||||
return turfs
|
||||
|
||||
/proc/circleviewturfs(center=usr,radius=3) //Is there even a diffrence between this proc and circlerangeturfs()?
|
||||
|
||||
var/turf/centerturf = get_turf(center)
|
||||
var/list/turfs = new/list()
|
||||
var/rsq = radius * (radius+0.5)
|
||||
|
||||
for(var/turf/T in view(radius, centerturf))
|
||||
var/dx = T.x - centerturf.x
|
||||
var/dy = T.y - centerturf.y
|
||||
if(dx*dx + dy*dy <= rsq)
|
||||
turfs += T
|
||||
return turfs
|
||||
|
||||
|
||||
|
||||
//var/debug_mob = 0
|
||||
|
||||
// Better recursive loop, technically sort of not actually recursive cause that shit is retarded, enjoy.
|
||||
//No need for a recursive limit either
|
||||
|
||||
|
||||
proc/recursive_mob_check(var/atom/O,var/client_check=1,var/sight_check=1,var/include_radio=1)
|
||||
|
||||
var/list/processing_list = list(O)
|
||||
var/list/processed_list = list()
|
||||
var/list/found_mobs = list()
|
||||
|
||||
while(processing_list.len)
|
||||
|
||||
var/atom/A = processing_list[1]
|
||||
var/passed = 0
|
||||
|
||||
if(ismob(A))
|
||||
var/mob/A_tmp = A
|
||||
passed=1
|
||||
|
||||
if(client_check && !A_tmp.client)
|
||||
passed=0
|
||||
|
||||
if(sight_check && !isInSight(A_tmp, O))
|
||||
passed=0
|
||||
|
||||
else if(include_radio && istype(A, /obj/item/device/radio))
|
||||
passed=1
|
||||
|
||||
if(sight_check && !isInSight(A, O))
|
||||
passed=0
|
||||
|
||||
if(passed)
|
||||
found_mobs |= A
|
||||
|
||||
for(var/atom/B in A)
|
||||
if(!(B in processed_list))
|
||||
processing_list |= B
|
||||
|
||||
processing_list -= A
|
||||
processed_list |= A
|
||||
|
||||
return found_mobs
|
||||
|
||||
|
||||
proc/get_mobs_in_view(var/R, var/atom/source)
|
||||
// Returns a list of mobs in range of R from source. Used in radio and say code.
|
||||
|
||||
var/turf/T = get_turf(source)
|
||||
var/list/hear = list()
|
||||
|
||||
if(!T)
|
||||
return hear
|
||||
|
||||
var/list/range = hear(R, T)
|
||||
|
||||
for(var/atom/movable/A in range)
|
||||
hear |= recursive_mob_check(A, 1, 0, 1)
|
||||
|
||||
return hear
|
||||
|
||||
|
||||
|
||||
/proc/get_mobs_in_radio_ranges(var/list/obj/item/device/radio/radios)
|
||||
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
. = list()
|
||||
// Returns a list of mobs who can hear any of the radios given in @radios
|
||||
var/list/speaker_coverage = list()
|
||||
for(var/i = 1; i <= radios.len; i++)
|
||||
var/obj/item/device/radio/R = radios[i]
|
||||
if(R)
|
||||
var/turf/speaker = get_turf(R)
|
||||
if(speaker)
|
||||
for(var/turf/T in hear(R.canhear_range,speaker))
|
||||
speaker_coverage[T] = T
|
||||
|
||||
|
||||
// Try to find all the players who can hear the message
|
||||
for(var/i = 1; i <= player_list.len; i++)
|
||||
var/mob/M = player_list[i]
|
||||
if(M)
|
||||
var/turf/ear = get_turf(M)
|
||||
if(ear)
|
||||
if(speaker_coverage[ear])
|
||||
. |= M
|
||||
return .
|
||||
|
||||
#define SIGN(X) ((X<0)?-1:1)
|
||||
|
||||
proc
|
||||
inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5)
|
||||
var/turf/T
|
||||
if(X1==X2)
|
||||
if(Y1==Y2)
|
||||
return 1 //Light cannot be blocked on same tile
|
||||
else
|
||||
var/s = SIGN(Y2-Y1)
|
||||
Y1+=s
|
||||
while(Y1!=Y2)
|
||||
T=locate(X1,Y1,Z)
|
||||
if(T.opacity)
|
||||
return 0
|
||||
Y1+=s
|
||||
else
|
||||
var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1))
|
||||
var/b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles
|
||||
var/signX = SIGN(X2-X1)
|
||||
var/signY = SIGN(Y2-Y1)
|
||||
if(X1<X2)
|
||||
b+=m
|
||||
while(X1!=X2 || Y1!=Y2)
|
||||
if(round(m*X1+b-Y1))
|
||||
Y1+=signY //Line exits tile vertically
|
||||
else
|
||||
X1+=signX //Line exits tile horizontally
|
||||
T=locate(X1,Y1,Z)
|
||||
if(T.opacity)
|
||||
return 0
|
||||
return 1
|
||||
#undef SIGN
|
||||
|
||||
proc/isInSight(var/atom/A, var/atom/B)
|
||||
var/turf/Aturf = get_turf(A)
|
||||
var/turf/Bturf = get_turf(B)
|
||||
|
||||
if(!Aturf || !Bturf)
|
||||
return 0
|
||||
|
||||
if(inLineOfSight(Aturf.x,Aturf.y, Bturf.x,Bturf.y,Aturf.z))
|
||||
return 1
|
||||
|
||||
else
|
||||
return 0
|
||||
|
||||
/proc/get_cardinal_step_away(atom/start, atom/finish) //returns the position of a step from start away from finish, in one of the cardinal directions
|
||||
//returns only NORTH, SOUTH, EAST, or WEST
|
||||
var/dx = finish.x - start.x
|
||||
var/dy = finish.y - start.y
|
||||
if(abs(dy) > abs (dx)) //slope is above 1:1 (move horizontally in a tie)
|
||||
if(dy > 0)
|
||||
return get_step(start, SOUTH)
|
||||
else
|
||||
return get_step(start, NORTH)
|
||||
else
|
||||
if(dx > 0)
|
||||
return get_step(start, WEST)
|
||||
else
|
||||
return get_step(start, EAST)
|
||||
|
||||
/proc/try_move_adjacent(atom/movable/AM)
|
||||
var/turf/T = get_turf(AM)
|
||||
for(var/direction in cardinal)
|
||||
if(AM.Move(get_step(T, direction)))
|
||||
break
|
||||
|
||||
/proc/get_mob_by_key(var/key)
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.ckey == lowertext(key))
|
||||
return M
|
||||
return null
|
||||
|
||||
// Will return a list of active candidates. It increases the buffer 5 times until it finds a candidate which is active within the buffer.
|
||||
|
||||
/proc/get_candidates(be_special_flag=0, afk_bracket=3000)
|
||||
var/list/candidates = list()
|
||||
// Keep looping until we find a non-afk candidate within the time bracket (we limit the bracket to 10 minutes (6000))
|
||||
while(!candidates.len && afk_bracket < 6000)
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
if(G.client != null)
|
||||
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||
if(!G.client.is_afk(afk_bracket) && (G.client.prefs.be_special & be_special_flag))
|
||||
candidates += G.client
|
||||
afk_bracket += 600 // Add a minute to the bracket, for every attempt
|
||||
return candidates
|
||||
|
||||
/proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480)
|
||||
if(!isobj(O)) O = new /obj/screen/text()
|
||||
O.maptext = maptext
|
||||
O.maptext_height = maptext_height
|
||||
O.maptext_width = maptext_width
|
||||
O.screen_loc = screen_loc
|
||||
return O
|
||||
|
||||
/proc/Show2Group4Delay(obj/O, list/group, delay=0)
|
||||
if(!isobj(O)) return
|
||||
if(!group) group = clients
|
||||
for(var/client/C in group)
|
||||
C.screen += O
|
||||
if(delay)
|
||||
spawn(delay)
|
||||
for(var/client/C in group)
|
||||
C.screen -= O
|
||||
|
||||
/proc/flick_overlay(image/I, list/show_to, duration)
|
||||
for(var/client/C in show_to)
|
||||
C.images += I
|
||||
sleep(duration)
|
||||
for(var/client/C in show_to)
|
||||
C.images -= I
|
||||
|
||||
/proc/get_active_player_count()
|
||||
// Get active players who are playing in the round
|
||||
var/active_players = 0
|
||||
for(var/i = 1; i <= player_list.len; i++)
|
||||
var/mob/M = player_list[i]
|
||||
if(M && M.client)
|
||||
if(istype(M, /mob/new_player)) // exclude people in the lobby
|
||||
continue
|
||||
else if(isobserver(M)) // Ghosts are fine if they were playing once (didn't start as observers)
|
||||
var/mob/dead/observer/O = M
|
||||
if(O.started_as_observer) // Exclude people who started as observers
|
||||
continue
|
||||
active_players++
|
||||
return active_players
|
||||
|
||||
/datum/projectile_data
|
||||
var/src_x
|
||||
var/src_y
|
||||
var/time
|
||||
var/distance
|
||||
var/power_x
|
||||
var/power_y
|
||||
var/dest_x
|
||||
var/dest_y
|
||||
|
||||
/datum/projectile_data/New(var/src_x, var/src_y, var/time, var/distance, \
|
||||
var/power_x, var/power_y, var/dest_x, var/dest_y)
|
||||
src.src_x = src_x
|
||||
src.src_y = src_y
|
||||
src.time = time
|
||||
src.distance = distance
|
||||
src.power_x = power_x
|
||||
src.power_y = power_y
|
||||
src.dest_x = dest_x
|
||||
src.dest_y = dest_y
|
||||
|
||||
/proc/projectile_trajectory(var/src_x, var/src_y, var/rotation, var/angle, var/power)
|
||||
|
||||
// returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle],
|
||||
// rotated at [rotation] and with the power of [power]
|
||||
// Thanks to VistaPOWA for this function
|
||||
|
||||
var/power_x = power * cos(angle)
|
||||
var/power_y = power * sin(angle)
|
||||
var/time = 2* power_y / 10 //10 = g
|
||||
|
||||
var/distance = time * power_x
|
||||
|
||||
var/dest_x = src_x + distance*sin(rotation);
|
||||
var/dest_y = src_y + distance*cos(rotation);
|
||||
|
||||
return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y)
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
var/datum/surgery/S = new path()
|
||||
surgeries_list[S.name] = S
|
||||
|
||||
init_subtypes(/datum/table_recipe, table_recipes)
|
||||
|
||||
/* // Uncomment to debug chemical reaction list.
|
||||
/client/verb/debug_chemical_list()
|
||||
|
||||
@@ -37,3 +39,14 @@
|
||||
if(path == prototype) continue
|
||||
L += new path()
|
||||
return L
|
||||
|
||||
//returns a list of paths to every subtype of prototype (excluding prototype)
|
||||
//if no list/L is provided, one is created.
|
||||
/proc/init_paths(prototype, list/L)
|
||||
if(!istype(L))
|
||||
L = list()
|
||||
for(var/path in typesof(prototype))
|
||||
if(path == prototype)
|
||||
continue
|
||||
L+= path
|
||||
return L
|
||||
|
||||
+65
-31
@@ -624,20 +624,60 @@ as a single icon. Useful for when you want to manipulate an icon via the above a
|
||||
The _flatIcons list is a cache for generated icon files.
|
||||
*/
|
||||
|
||||
proc
|
||||
getFlatIcon(atom/A, dir) // 1 = use cache, 2 = override cache, 0 = ignore cache
|
||||
proc // Creates a single icon from a given /atom or /image. Only the first argument is required.
|
||||
getFlatIcon(image/A, defdir=A.dir, deficon=A.icon, defstate=A.icon_state, defblend=A.blend_mode)
|
||||
// We start with a blank canvas, otherwise some icon procs crash silently
|
||||
var/icon/flat = icon('icons/effects/effects.dmi', "nothing") // Final flattened icon
|
||||
if(!A)
|
||||
return flat
|
||||
if(A.alpha <= 0)
|
||||
return flat
|
||||
var/noIcon = FALSE
|
||||
|
||||
var/curicon
|
||||
if(A.icon)
|
||||
curicon = A.icon
|
||||
else
|
||||
curicon = deficon
|
||||
|
||||
if(!curicon)
|
||||
noIcon = TRUE // Do not render this object.
|
||||
|
||||
var/curstate
|
||||
if(A.icon_state)
|
||||
curstate = A.icon_state
|
||||
else
|
||||
curstate = defstate
|
||||
|
||||
if(!noIcon && !(curstate in icon_states(curicon)))
|
||||
if("" in icon_states(curicon))
|
||||
curstate = ""
|
||||
else
|
||||
noIcon = TRUE // Do not render this object.
|
||||
|
||||
var/curdir
|
||||
if(A.dir != 2)
|
||||
curdir = A.dir
|
||||
else
|
||||
curdir = defdir
|
||||
|
||||
var/curblend
|
||||
if(A.blend_mode == BLEND_DEFAULT)
|
||||
curblend = defblend
|
||||
else
|
||||
curblend = A.blend_mode
|
||||
|
||||
// Layers will be a sorted list of icons/overlays, based on the order in which they are displayed
|
||||
var/list/layers = list()
|
||||
|
||||
// Add the atom's icon itself
|
||||
if(A.icon)
|
||||
// Make a copy without pixel_x/y settings
|
||||
var/image/copy = image(icon=A.icon,icon_state=A.icon_state,layer=A.layer,dir=A.dir)
|
||||
var/image/copy
|
||||
// Add the atom's icon itself, without pixel_x/y offsets.
|
||||
if(!noIcon)
|
||||
copy = image(icon=curicon, icon_state=curstate, layer=A.layer, dir=curdir)
|
||||
copy.color = A.color
|
||||
copy.alpha = A.alpha
|
||||
copy.blend_mode = curblend
|
||||
layers[copy] = A.layer
|
||||
|
||||
// dir defaults to A's dir
|
||||
if(!dir) dir = A.dir
|
||||
|
||||
// Loop through the underlays, then overlays, sorting them into the layers list
|
||||
var/list/process = A.underlays // Current list being processed
|
||||
var/pSet=0 // Which list is being processed: 0 = underlays, 1 = overlays
|
||||
@@ -652,7 +692,7 @@ proc
|
||||
if(!current) continue
|
||||
currentLayer = current:layer
|
||||
if(currentLayer<0) // Special case for FLY_LAYER
|
||||
if(currentLayer <= -1000) return 0
|
||||
if(currentLayer <= -1000) return flat
|
||||
if(pSet == 0) // Underlay
|
||||
currentLayer = A.layer+currentLayer/1000
|
||||
else // Overlay
|
||||
@@ -678,8 +718,6 @@ proc
|
||||
else // All done
|
||||
break
|
||||
|
||||
// We start with a blank canvas, otherwise some icon procs crash silently
|
||||
var/icon/flat = icon('icons/effects/effects.dmi', "icon_state"="nothing") // Final flattened icon
|
||||
var/icon/add // Icon of overlay being added
|
||||
|
||||
// Current dimensions of flattened icon
|
||||
@@ -689,24 +727,15 @@ proc
|
||||
|
||||
for(var/I in layers)
|
||||
|
||||
if(I:icon)
|
||||
if(I:icon_state)
|
||||
// Has icon and state set
|
||||
add = icon(I:icon, I:icon_state)
|
||||
else
|
||||
if(A.icon_state in icon_states(I:icon))
|
||||
// Inherits icon_state from atom
|
||||
add = icon(I:icon, A.icon_state)
|
||||
else
|
||||
// Uses default state ("")
|
||||
add = icon(I:icon)
|
||||
else if(I:icon_state)
|
||||
// Inherits icon from atom
|
||||
add = icon(A.icon, I:icon_state)
|
||||
else
|
||||
// Unknown
|
||||
if(I:alpha == 0)
|
||||
continue
|
||||
|
||||
if(I == copy) // 'I' is an /image based on the object being flattened.
|
||||
curblend = BLEND_OVERLAY
|
||||
add = icon(I:icon, I:icon_state, I:dir)
|
||||
else // 'I' is an appearance object.
|
||||
add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend)
|
||||
|
||||
// Find the new dimensions of the flat icon to fit the added overlay
|
||||
addX1 = min(flatX1, I:pixel_x+1)
|
||||
addX2 = max(flatX2, I:pixel_x+add.Width())
|
||||
@@ -720,9 +749,14 @@ proc
|
||||
flatY1=addY1;flatY2=addY2
|
||||
|
||||
// Blend the overlay into the flattened icon
|
||||
flat.Blend(add,ICON_OVERLAY,I:pixel_x+2-flatX1,I:pixel_y+2-flatY1)
|
||||
flat.Blend(add, blendMode2iconMode(curblend), I:pixel_x + 2 - flatX1, I:pixel_y + 2 - flatY1)
|
||||
|
||||
return flat
|
||||
if(A.color)
|
||||
flat.Blend(A.color, ICON_MULTIPLY)
|
||||
if(A.alpha < 255)
|
||||
flat.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY)
|
||||
|
||||
return icon(flat, "", SOUTH)
|
||||
|
||||
getIconMask(atom/A)//By yours truly. Creates a dynamic mask for a mob/whatever. /N
|
||||
var/icon/alpha_mask = new(A.icon,A.icon_state)//So we want the default icon and icon state of A.
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
var/const/E = 2.71828183
|
||||
var/const/Sqrt2 = 1.41421356
|
||||
|
||||
// List of square roots for the numbers 1-100.
|
||||
var/list/sqrtTable = list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5,
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10)
|
||||
|
||||
/proc/sign(x)
|
||||
return x!=0?x/abs(x):0
|
||||
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
/matrix/proc/TurnTo(old_angle, new_angle)
|
||||
. = new_angle - old_angle
|
||||
Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT
|
||||
@@ -30,7 +30,6 @@
|
||||
else return default
|
||||
return default
|
||||
|
||||
|
||||
/proc/sanitize_hexcolor(color, desired_format=3, include_crunch=0, default)
|
||||
var/crunch = include_crunch ? "#" : ""
|
||||
if(!istext(color))
|
||||
|
||||
@@ -305,6 +305,9 @@ var/list/binary = list("0","1")
|
||||
/proc/random_short_color()
|
||||
return random_string(3, hex_characters)
|
||||
|
||||
/proc/random_color()
|
||||
return random_string(6, hex_characters)
|
||||
|
||||
/proc/add_zero2(t, u)
|
||||
var/temp1
|
||||
while (length(t) < u)
|
||||
|
||||
@@ -265,6 +265,13 @@ proc/tg_list2text(list/list, glue=",")
|
||||
/proc/angle2text(var/degree)
|
||||
return dir2text(angle2dir(degree))
|
||||
|
||||
//Converts a blend_mode constant to one acceptable to icon.Blend()
|
||||
/proc/blendMode2iconMode(blend_mode)
|
||||
switch(blend_mode)
|
||||
if(BLEND_MULTIPLY) return ICON_MULTIPLY
|
||||
if(BLEND_ADD) return ICON_ADD
|
||||
if(BLEND_SUBTRACT) return ICON_SUBTRACT
|
||||
else return ICON_OVERLAY
|
||||
|
||||
//Converts a rights bitfield into a string
|
||||
/proc/rights2text(rights, seperator="", list/adds, list/subs)
|
||||
|
||||
+43
-22
@@ -256,7 +256,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
if(R) R.fields["name"] = newname
|
||||
|
||||
//update our pda and id if we have them on our person
|
||||
var/list/searching = GetAllContents(searchDepth = 3)
|
||||
var/list/searching = GetAllContents()
|
||||
var/search_id = 1
|
||||
var/search_pda = 1
|
||||
|
||||
@@ -280,7 +280,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
for(var/datum/mind/T in ticker.minds)
|
||||
for(var/datum/objective/obj in T.objectives)
|
||||
// Only update if this player is a target
|
||||
if(obj.target && obj.target.current.real_name == name)
|
||||
if(obj.target && obj.target.current && obj.target.current.real_name == name)
|
||||
obj.update_explanation_text()
|
||||
|
||||
return 1
|
||||
@@ -330,6 +330,10 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
A.aiPDA.owner = newname
|
||||
A.aiPDA.name = newname + " (" + A.aiPDA.ownjob + ")"
|
||||
|
||||
if(cmptext("cyborg",role))
|
||||
if(isrobot(src))
|
||||
var/mob/living/silicon/robot/A = src
|
||||
A.custom_name = newname
|
||||
|
||||
fully_replace_character_name(oldname,newname)
|
||||
|
||||
@@ -591,29 +595,46 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
|
||||
animation.master = target
|
||||
flick(flick_anim, animation)
|
||||
sleep(max(sleeptime, 15))
|
||||
del(animation)
|
||||
qdel(animation)
|
||||
|
||||
|
||||
//Will return the contents of an atom recursivly to a depth of 'searchDepth'
|
||||
/atom/proc/GetAllContents(searchDepth = 5)
|
||||
var/list/toReturn = list()
|
||||
atom/proc/GetAllContents()
|
||||
var/list/processing_list = list(src)
|
||||
var/list/assembled = list()
|
||||
|
||||
for(var/atom/part in contents)
|
||||
toReturn += part
|
||||
if(part.contents.len && searchDepth)
|
||||
toReturn += part.GetAllContents(searchDepth - 1)
|
||||
while(processing_list.len)
|
||||
var/atom/A = processing_list[1]
|
||||
processing_list -= A
|
||||
|
||||
return toReturn
|
||||
for(var/atom/a in A)
|
||||
if(!(a in assembled))
|
||||
processing_list |= a
|
||||
|
||||
assembled |= A
|
||||
|
||||
return assembled
|
||||
|
||||
|
||||
/atom/proc/GetTypeInAllContents(typepath, searchDepth = 5)
|
||||
for(var/atom/part in contents)
|
||||
if(istype(part, typepath))
|
||||
return 1
|
||||
if(part.contents.len && searchDepth)
|
||||
if(part.GetTypeInAllContents(typepath, searchDepth - 1))
|
||||
return 1
|
||||
return 0
|
||||
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
|
||||
|
||||
|
||||
//Step-towards method of determining whether one atom can see another. Similar to viewers()
|
||||
@@ -863,7 +884,7 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
|
||||
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"
|
||||
del(O) // prevents multiple shuttle corners from stacking
|
||||
qdel(O) // prevents multiple shuttle corners from stacking
|
||||
continue
|
||||
if(!istype(O,/obj)) continue
|
||||
O.loc = X
|
||||
@@ -1113,7 +1134,7 @@ proc/oview_or_orange(distance = world.view , center = usr , type)
|
||||
|
||||
//Quick type checks for some tools
|
||||
var/global/list/common_tools = list(
|
||||
/obj/item/weapon/cable_coil,
|
||||
/obj/item/stack/cable_coil,
|
||||
/obj/item/weapon/wrench,
|
||||
/obj/item/weapon/weldingtool,
|
||||
/obj/item/weapon/screwdriver,
|
||||
@@ -1269,4 +1290,4 @@ proc/check_target_facings(mob/living/initator, mob/living/target)
|
||||
if(initator.dir + 4 == target.dir || initator.dir - 4 == target.dir) //mobs are facing each other
|
||||
return 2
|
||||
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 3
|
||||
return 3
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
//MINOR TWEAKS/MISC
|
||||
#define AGE_MIN 17 //youngest a character can be
|
||||
#define AGE_MAX 85 //oldest a character can be
|
||||
#define SHOES_SLOWDOWN -1 //How much shoes slow you down by default. Negative values speed you up
|
||||
#define SHOES_SLOWDOWN 0 //How much shoes slow you down by default. Negative values speed you up
|
||||
#define STRIP_DELAY 40 //time taken (in deciseconds) to strip somebody
|
||||
#define DOOR_CRUSH_DAMAGE 10 //the amount of damage that airlocks deal when they crush you
|
||||
|
||||
|
||||
@@ -39,6 +39,6 @@ var/list/be_special_flags = list(
|
||||
"Alien Lifeform" = BE_ALIEN,
|
||||
"pAI" = BE_PAI,
|
||||
"Cultist" = BE_CULTIST,
|
||||
"Monkey" = BE_MONKEY,
|
||||
"Blob" = BE_BLOB,
|
||||
"Ninja" = BE_NINJA
|
||||
)
|
||||
|
||||
@@ -11,3 +11,4 @@ var/global/list/active_diseases = list()
|
||||
var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions
|
||||
var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
|
||||
var/global/list/surgeries_list = list() //list of all surgeries by name, associated with their path.
|
||||
var/global/list/table_recipes = list() //list of all table craft recipes
|
||||
@@ -1,6 +1,6 @@
|
||||
var/global/obj/effect/overlay/plmaster = null // atmospheric overlay for plasma
|
||||
var/global/obj/effect/overlay/slmaster = null // atmospheric overlay for sleeping gas
|
||||
var/admin_notice = null // Admin notice that all clients see when joining the server
|
||||
var/admin_notice = "" // Admin notice that all clients see when joining the server
|
||||
|
||||
|
||||
// nanomanager, the manager for Nano UIs
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
var/global/obj/effect/datacore/data_core = null
|
||||
var/global/defer_powernet_rebuild = 0 // true if net rebuild will be called manually after an event
|
||||
//var/global/defer_powernet_rebuild = 0 // true if net rebuild will be called manually after an event
|
||||
//Noble idea, but doing this made GC fail. The gains from waiting on deffering are lost by using del()
|
||||
|
||||
var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
|
||||
var/CHARGELEVEL = 0.001 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
|
||||
|
||||
+5
-1
@@ -32,6 +32,9 @@
|
||||
build_click(src, client.buildmode, params, A)
|
||||
return
|
||||
|
||||
if(control_disabled || stat)
|
||||
return
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["middle"])
|
||||
MiddleClickOn(A)
|
||||
@@ -46,7 +49,8 @@
|
||||
CtrlClickOn(A)
|
||||
return
|
||||
|
||||
if(control_disabled || stat || world.time <= next_move) return
|
||||
if(world.time <= next_move)
|
||||
return
|
||||
next_move = world.time + 9
|
||||
|
||||
if(aicamera.in_camera_mode)
|
||||
|
||||
@@ -71,6 +71,7 @@
|
||||
return M.click_action(A,src)
|
||||
|
||||
if(restrained())
|
||||
next_move = world.time + 10 //Doing shit in cuffs shall be vey slow
|
||||
RestrainedClickOn(A)
|
||||
return
|
||||
|
||||
@@ -80,6 +81,7 @@
|
||||
|
||||
var/obj/item/W = get_active_hand()
|
||||
|
||||
|
||||
if(W == A)
|
||||
next_move = world.time + 6
|
||||
if(W.flags&USEDELAY)
|
||||
@@ -93,8 +95,7 @@
|
||||
return
|
||||
|
||||
// operate two levels deep here (item in backpack in src; NOT item in box in backpack in src)
|
||||
if(A == loc || (A in loc) || (A in contents) || (A.loc in contents))
|
||||
|
||||
if(!isturf(A) && A == loc || (A in contents) || (A.loc in contents))
|
||||
// faster access to objects already on you
|
||||
if(A in contents)
|
||||
next_move = world.time + 6 // on your person
|
||||
@@ -119,12 +120,12 @@
|
||||
// Allows you to click on a box's contents, if that box is on the ground, but no deeper than that
|
||||
if(isturf(A) || isturf(A.loc) || (A.loc && isturf(A.loc.loc)))
|
||||
next_move = world.time + 10
|
||||
|
||||
if(A.Adjacent(src)) // see adjacent.dm
|
||||
if(W)
|
||||
if(W.flags&USEDELAY)
|
||||
next_move += 5
|
||||
|
||||
if(W.preattack(A,src,1,params)) //Weapon attack override,return 1 to exit
|
||||
return
|
||||
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
|
||||
var/resolved = A.attackby(W,src)
|
||||
if(!resolved && A && W)
|
||||
@@ -134,6 +135,8 @@
|
||||
return
|
||||
else // non-adjacent click
|
||||
if(W)
|
||||
if(W.preattack(A,src,0,params)) //Weapon attack override,return 1 to exit
|
||||
return
|
||||
W.afterattack(A,src,0,params) // 0: not Adjacent
|
||||
else
|
||||
RangedAttack(A, params)
|
||||
@@ -294,7 +297,7 @@
|
||||
|
||||
// Simple helper to face what you clicked on, in case it should be needed in more than one place
|
||||
/mob/proc/face_atom(var/atom/A)
|
||||
if( buckled || !A || !x || !y || !A.x || !A.y ) return
|
||||
if( buckled || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y ) return
|
||||
var/dx = A.x - x
|
||||
var/dy = A.y - y
|
||||
if(!dx && !dy) // Wall items are graphically shifted but on the floor
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
build_click(src, client.buildmode, params, A)
|
||||
return
|
||||
|
||||
if(stat || lockcharge || weakened || stunned || paralysis)
|
||||
return
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["middle"])
|
||||
MiddleClickOn(A)
|
||||
@@ -29,9 +32,6 @@
|
||||
CtrlClickOn(A)
|
||||
return
|
||||
|
||||
if(stat || lockcharge || weakened || stunned || paralysis)
|
||||
return
|
||||
|
||||
if(next_move >= world.time)
|
||||
return
|
||||
|
||||
|
||||
@@ -9,8 +9,7 @@
|
||||
if(!usr || !over) return
|
||||
if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows
|
||||
|
||||
spawn(0)
|
||||
over.MouseDrop_T(src,usr)
|
||||
over.MouseDrop_T(src,usr)
|
||||
return
|
||||
|
||||
// recieve a mousedrop
|
||||
|
||||
@@ -65,7 +65,8 @@
|
||||
#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12)
|
||||
|
||||
#define ui_borg_pull "EAST-2:26,SOUTH+1:7"
|
||||
#define ui_borg_panel "EAST-1:28,SOUTH+1:7"
|
||||
#define ui_borg_radio "EAST-1:28,SOUTH+1:7"
|
||||
#define ui_borg_intents "EAST-2:26,SOUTH:5"
|
||||
|
||||
//Upper-middle right (damage indicators)
|
||||
#define ui_toxin "EAST-1:28,CENTER+5:27"
|
||||
|
||||
@@ -3,11 +3,6 @@
|
||||
Uses the same visual objects for all players.
|
||||
*/
|
||||
|
||||
#define HUD_VERSIONS 3 //used in show_hud()
|
||||
//1 = standard hud
|
||||
//2 = reduced hud (just hands and intent switcher)
|
||||
//3 = no hud (for screenshots)
|
||||
|
||||
var/datum/global_hud/global_hud = new()
|
||||
|
||||
/datum/global_hud
|
||||
@@ -21,6 +16,7 @@ var/datum/global_hud/global_hud = new()
|
||||
druggy = new /obj/screen()
|
||||
druggy.screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
druggy.icon_state = "druggy"
|
||||
druggy.blend_mode = BLEND_MULTIPLY
|
||||
druggy.layer = 17
|
||||
druggy.mouse_opacity = 0
|
||||
|
||||
@@ -63,20 +59,24 @@ var/datum/global_hud/global_hud = new()
|
||||
O = darkMask[8]
|
||||
O.screen_loc = "WEST,CENTER+5 to EAST,NORTH" //North black
|
||||
|
||||
|
||||
for(i = 1, i <= 4, i++)
|
||||
O = vimpaired[i]
|
||||
O.icon_state = "dither50"
|
||||
O.blend_mode = BLEND_MULTIPLY
|
||||
O.layer = 17
|
||||
O.mouse_opacity = 0
|
||||
|
||||
O = darkMask[i]
|
||||
O.icon_state = "dither50"
|
||||
O.blend_mode = BLEND_MULTIPLY
|
||||
O.layer = 17
|
||||
O.mouse_opacity = 0
|
||||
|
||||
for(i = 5, i <= 8, i++)
|
||||
O = darkMask[i]
|
||||
O.icon_state = "black"
|
||||
O.blend_mode = BLEND_MULTIPLY
|
||||
O.layer = 17
|
||||
O.mouse_opacity = 0
|
||||
|
||||
@@ -196,7 +196,7 @@ datum/hud/New(mob/owner)
|
||||
blob_hud()
|
||||
|
||||
if(istype(mymob.loc,/obj/mecha))
|
||||
show_hud(1)
|
||||
show_hud(HUD_STYLE_REDUCED)
|
||||
|
||||
//Version denotes which style should be displayed. blank or 0 means "next version"
|
||||
/datum/hud/proc/show_hud(var/version = 0)
|
||||
@@ -211,7 +211,7 @@ datum/hud/New(mob/owner)
|
||||
display_hud_version = 1
|
||||
|
||||
switch(display_hud_version)
|
||||
if(1) //Default HUD
|
||||
if(HUD_STYLE_STANDARD) //Default HUD
|
||||
hud_shown = 1 //Governs behavior of other procs
|
||||
if(adding)
|
||||
mymob.client.screen += adding
|
||||
@@ -236,7 +236,7 @@ datum/hud/New(mob/owner)
|
||||
hidden_inventory_update()
|
||||
persistant_inventory_update()
|
||||
mymob.update_action_buttons()
|
||||
if(2) //Reduced HUD
|
||||
if(HUD_STYLE_REDUCED) //Reduced HUD
|
||||
hud_shown = 0 //Governs behavior of other procs
|
||||
if(adding)
|
||||
mymob.client.screen -= adding
|
||||
@@ -261,7 +261,7 @@ datum/hud/New(mob/owner)
|
||||
hidden_inventory_update()
|
||||
persistant_inventory_update()
|
||||
mymob.update_action_buttons()
|
||||
if(3) //No HUD
|
||||
if(HUD_STYLE_NOHUD) //No HUD
|
||||
hud_shown = 0 //Governs behavior of other procs
|
||||
if(adding)
|
||||
mymob.client.screen -= adding
|
||||
|
||||
@@ -300,6 +300,7 @@
|
||||
mymob.damageoverlay.icon = 'icons/mob/screen_full.dmi'
|
||||
mymob.damageoverlay.icon_state = "oxydamageoverlay0"
|
||||
mymob.damageoverlay.name = "dmg"
|
||||
mymob.damageoverlay.blend_mode = BLEND_MULTIPLY
|
||||
mymob.damageoverlay.screen_loc = "CENTER-7,CENTER-7"
|
||||
mymob.damageoverlay.mouse_opacity = 0
|
||||
mymob.damageoverlay.layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top.
|
||||
@@ -307,6 +308,7 @@
|
||||
mymob.flash = new /obj/screen()
|
||||
mymob.flash.icon_state = "blank"
|
||||
mymob.flash.name = "flash"
|
||||
mymob.flash.blend_mode = BLEND_ADD
|
||||
mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
mymob.flash.layer = 17
|
||||
|
||||
|
||||
+26
-36
@@ -10,7 +10,7 @@
|
||||
using.name = "radio"
|
||||
using.icon = 'icons/mob/screen_cyborg.dmi'
|
||||
using.icon_state = "radio"
|
||||
using.screen_loc = ui_movi
|
||||
using.screen_loc = ui_borg_radio
|
||||
using.layer = 20
|
||||
adding += using
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
using.name = "act_intent"
|
||||
using.icon = 'icons/mob/screen_cyborg.dmi'
|
||||
using.icon_state = mymob.a_intent
|
||||
using.screen_loc = ui_acti
|
||||
using.screen_loc = ui_borg_intents
|
||||
using.layer = 20
|
||||
adding += using
|
||||
action_intent = using
|
||||
@@ -76,15 +76,6 @@
|
||||
mymob.hands.name = "module"
|
||||
mymob.hands.screen_loc = ui_borg_module
|
||||
|
||||
//Module Panel
|
||||
using = new /obj/screen()
|
||||
using.name = "panel"
|
||||
using.icon = 'icons/mob/screen_cyborg.dmi'
|
||||
using.icon_state = "panel"
|
||||
using.screen_loc = ui_borg_panel
|
||||
using.layer = 19
|
||||
adding += using
|
||||
|
||||
//Store
|
||||
mymob.throw_icon = new /obj/screen()
|
||||
mymob.throw_icon.icon = 'icons/mob/screen_cyborg.dmi'
|
||||
@@ -156,30 +147,30 @@
|
||||
|
||||
var/mob/living/silicon/robot/r = mymob
|
||||
|
||||
if(r.shown_robot_modules)
|
||||
//Modules display is shown
|
||||
r.client.screen += r.throw_icon //"store" icon
|
||||
if(r.client)
|
||||
if(r.shown_robot_modules)
|
||||
//Modules display is shown
|
||||
r.client.screen += r.throw_icon //"store" icon
|
||||
|
||||
if(!r.module)
|
||||
usr << "<span class='danger'>No module selected</span>"
|
||||
return
|
||||
if(!r.module)
|
||||
usr << "<span class='danger'>No module selected</span>"
|
||||
return
|
||||
|
||||
if(!r.module.modules)
|
||||
usr << "<span class='danger'>Selected module has no modules to select</span>"
|
||||
return
|
||||
if(!r.module.modules)
|
||||
usr << "<span class='danger'>Selected module has no modules to select</span>"
|
||||
return
|
||||
|
||||
if(!r.robot_modules_background)
|
||||
return
|
||||
if(!r.robot_modules_background)
|
||||
return
|
||||
|
||||
var/display_rows = round((r.module.modules.len) / 8) +1 //+1 because round() returns floor of number
|
||||
r.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
|
||||
r.client.screen += r.robot_modules_background
|
||||
var/display_rows = Ceiling(length(r.module.get_inactive_modules()) / 8)
|
||||
r.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
|
||||
r.client.screen += r.robot_modules_background
|
||||
|
||||
var/x = -4 //Start at CENTER-4,SOUTH+1
|
||||
var/y = 1
|
||||
var/x = -4 //Start at CENTER-4,SOUTH+1
|
||||
var/y = 1
|
||||
|
||||
for(var/atom/movable/A in r.module.modules)
|
||||
if( (A != r.module_state_1) && (A != r.module_state_2) && (A != r.module_state_3) )
|
||||
for(var/atom/movable/A in r.module.get_inactive_modules())
|
||||
//Module is not currently active
|
||||
r.client.screen += A
|
||||
if(x < 0)
|
||||
@@ -193,13 +184,12 @@
|
||||
x = -4
|
||||
y++
|
||||
|
||||
else
|
||||
//Modules display is hidden
|
||||
r.client.screen -= r.throw_icon //"store" icon
|
||||
else
|
||||
//Modules display is hidden
|
||||
r.client.screen -= r.throw_icon //"store" icon
|
||||
|
||||
for(var/atom/A in r.module.modules)
|
||||
if( (A != r.module_state_1) && (A != r.module_state_2) && (A != r.module_state_3) )
|
||||
for(var/atom/A in r.module.get_inactive_modules())
|
||||
//Module is not currently active
|
||||
r.client.screen -= A
|
||||
r.shown_robot_modules = 0
|
||||
r.client.screen -= r.robot_modules_background
|
||||
r.shown_robot_modules = 0
|
||||
r.client.screen -= r.robot_modules_background
|
||||
@@ -189,22 +189,15 @@
|
||||
L.resist()
|
||||
|
||||
if("mov_intent")
|
||||
if(iscarbon(usr))
|
||||
var/mob/living/carbon/C = usr
|
||||
if(C.legcuffed)
|
||||
C << "<span class='notice'>You are legcuffed! You cannot run until you get [C.legcuffed] removed!</span>"
|
||||
C.m_intent = "walk" //Just incase
|
||||
C.hud_used.move_intent.icon_state = "walking"
|
||||
return 1
|
||||
switch(usr.m_intent)
|
||||
if("run")
|
||||
usr.m_intent = "walk"
|
||||
usr.hud_used.move_intent.icon_state = "walking"
|
||||
if("walk")
|
||||
usr.m_intent = "run"
|
||||
usr.hud_used.move_intent.icon_state = "running"
|
||||
if(istype(usr,/mob/living/carbon/alien/humanoid))
|
||||
usr.update_icons()
|
||||
switch(usr.m_intent)
|
||||
if("run")
|
||||
usr.m_intent = "walk"
|
||||
usr.hud_used.move_intent.icon_state = "walking"
|
||||
if("walk")
|
||||
usr.m_intent = "run"
|
||||
usr.hud_used.move_intent.icon_state = "running"
|
||||
if(istype(usr,/mob/living/carbon/alien/humanoid))
|
||||
usr.update_icons()
|
||||
if("Reset Machine")
|
||||
usr.unset_machine()
|
||||
if("internal")
|
||||
|
||||
+42
-124
@@ -7,30 +7,62 @@
|
||||
/atom/proc/attackby(obj/item/W, mob/user)
|
||||
return
|
||||
/atom/movable/attackby(obj/item/W, mob/user)
|
||||
if(!(W.flags&NOBLUDGEON))
|
||||
if(W && !(W.flags&NOBLUDGEON))
|
||||
visible_message("<span class='danger'>[src] has been hit by [user] with [W].</span>")
|
||||
|
||||
/mob/living/attackby(obj/item/I, mob/user)
|
||||
if(istype(I) && ismob(user))
|
||||
I.attack(src, user)
|
||||
I.attack(src, user)
|
||||
|
||||
/mob/living/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
|
||||
apply_damage(I.force, I.damtype)
|
||||
if(I.damtype == "brute")
|
||||
if(prob(33) && I.force)
|
||||
var/turf/location = src.loc
|
||||
if(istype(location, /turf/simulated))
|
||||
location.add_blood_floor(src)
|
||||
|
||||
var/showname = "."
|
||||
if(user)
|
||||
showname = " by [user]!"
|
||||
if(!(user in viewers(I, null)))
|
||||
showname = "."
|
||||
|
||||
if(I.attack_verb && I.attack_verb.len)
|
||||
src.visible_message("<span class='danger'>[src] has been [pick(I.attack_verb)] with [I][showname]</span>",
|
||||
"<span class='userdanger'>[src] has been [pick(I.attack_verb)] with [I][showname]</span>")
|
||||
else if(I.force)
|
||||
src.visible_message("<span class='danger'>[src] has been attacked with [I][showname]</span>",
|
||||
"<span class='userdanger'>[src] has been attacked with [I][showname]</span>")
|
||||
if(!showname && user)
|
||||
if(user.client)
|
||||
user << "\red <B>You attack [src] with [I]. </B>"
|
||||
|
||||
// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person.
|
||||
// Click parameters is the params string from byond Click() code, see that documentation.
|
||||
/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
return
|
||||
|
||||
// Overrides the weapon attack so it can attack any atoms like when we want to have an effect on an object independent of attackby
|
||||
// It is a powerfull proc but it should be used wisely, if there is other alternatives instead use those
|
||||
// If it returns 1 it exits click code. Always . = 1 at start of the function if you delete src.
|
||||
/obj/item/proc/preattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
return
|
||||
|
||||
obj/item/proc/get_clamped_volume()
|
||||
if(src.force && src.w_class)
|
||||
return Clamp((src.force + src.w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100
|
||||
else if(!src.force && src.w_class)
|
||||
return Clamp(src.w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100
|
||||
|
||||
/obj/item/proc/attack(mob/living/M as mob, mob/living/user as mob, def_zone)
|
||||
|
||||
if (!istype(M)) // not sure if this is the right thing...
|
||||
return
|
||||
var/messagesource = M
|
||||
|
||||
if (istype(M,/mob/living/carbon/brain))
|
||||
messagesource = M:container
|
||||
if (hitsound)
|
||||
playsound(loc, hitsound, 50, 1, -1)
|
||||
if (hitsound && force > 0) //If an item's hitsound is defined and the item's force is greater than zero...
|
||||
playsound(loc, hitsound, get_clamped_volume(), 1, -1) //...play the item's hitsound at get_clamped_volume() with varying frequency and -1 extra range.
|
||||
else if (force == 0)//Otherwise, if the item's force is zero...
|
||||
playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), 1, -1)//...play tap.ogg at get_clamped_volume()
|
||||
/////////////////////////
|
||||
user.lastattacked = M
|
||||
M.lastattacker = user
|
||||
@@ -40,120 +72,6 @@
|
||||
//spawn(1800) // this wont work right
|
||||
// M.lastattacker = null
|
||||
/////////////////////////
|
||||
|
||||
var/power = force
|
||||
if(HULK in user.mutations)
|
||||
power *= 2
|
||||
|
||||
if(!istype(M, /mob/living/carbon/human))
|
||||
if(istype(M, /mob/living/carbon/slime))
|
||||
var/mob/living/carbon/slime/slime = M
|
||||
if(prob(25))
|
||||
user << "\red [src] passes right through [M]!"
|
||||
return
|
||||
|
||||
if(power > 0)
|
||||
slime.attacked += 10
|
||||
|
||||
if(slime.Discipline && prob(50)) // wow, buddy, why am I getting attacked??
|
||||
slime.Discipline = 0
|
||||
|
||||
if(power >= 3)
|
||||
if(istype(slime, /mob/living/carbon/slime/adult))
|
||||
if(prob(5 + round(power/2)))
|
||||
|
||||
if(slime.Victim)
|
||||
if(prob(80) && !slime.client)
|
||||
slime.Discipline++
|
||||
slime.Victim = null
|
||||
slime.anchored = 0
|
||||
|
||||
spawn()
|
||||
if(slime)
|
||||
slime.SStun = 1
|
||||
sleep(rand(5,20))
|
||||
if(slime)
|
||||
slime.SStun = 0
|
||||
|
||||
spawn(0)
|
||||
if(slime)
|
||||
slime.canmove = 0
|
||||
step_away(slime, user)
|
||||
if(prob(25 + power))
|
||||
sleep(2)
|
||||
if(slime && user)
|
||||
step_away(slime, user)
|
||||
slime.canmove = 1
|
||||
|
||||
else
|
||||
if(prob(10 + power*2))
|
||||
if(slime)
|
||||
if(slime.Victim)
|
||||
if(prob(80) && !slime.client)
|
||||
slime.Discipline++
|
||||
|
||||
if(slime.Discipline == 1)
|
||||
slime.attacked = 0
|
||||
|
||||
spawn()
|
||||
if(slime)
|
||||
slime.SStun = 1
|
||||
sleep(rand(5,20))
|
||||
if(slime)
|
||||
slime.SStun = 0
|
||||
|
||||
slime.Victim = null
|
||||
slime.anchored = 0
|
||||
|
||||
|
||||
spawn(0)
|
||||
if(slime && user)
|
||||
step_away(slime, user)
|
||||
slime.canmove = 0
|
||||
if(prob(25 + power*4))
|
||||
sleep(2)
|
||||
if(slime && user)
|
||||
step_away(slime, user)
|
||||
slime.canmove = 1
|
||||
|
||||
|
||||
var/showname = "."
|
||||
if(user)
|
||||
showname = " by [user]."
|
||||
if(!(user in viewers(M, null)))
|
||||
showname = "."
|
||||
|
||||
for(var/mob/O in viewers(messagesource, null))
|
||||
if(attack_verb.len)
|
||||
O.show_message("\red <B>[M] has been [pick(attack_verb)] with [src][showname] </B>", 1)
|
||||
else
|
||||
O.show_message("\red <B>[M] has been attacked with [src][showname] </B>", 1)
|
||||
|
||||
if(!showname && user)
|
||||
if(user.client)
|
||||
user << "\red <B>You attack [M] with [src]. </B>"
|
||||
|
||||
|
||||
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
M:attacked_by(src, user, def_zone)
|
||||
else
|
||||
switch(damtype)
|
||||
if("brute")
|
||||
if(istype(src, /mob/living/carbon/slime))
|
||||
M.adjustBrainLoss(power)
|
||||
|
||||
else
|
||||
|
||||
M.take_organ_damage(power)
|
||||
if (prob(33)) // Added blood for whacking non-humans too
|
||||
var/turf/location = M.loc
|
||||
if (istype(location, /turf/simulated))
|
||||
location.add_blood_floor(M)
|
||||
if("fire")
|
||||
if (!(COLD_RESISTANCE in M.mutations))
|
||||
M.take_organ_damage(0, power)
|
||||
M << "Aargh it burns!"
|
||||
M.updatehealth()
|
||||
M.attacked_by(src, user, def_zone)
|
||||
add_fingerprint(user)
|
||||
return 1
|
||||
return 1
|
||||
@@ -87,14 +87,11 @@
|
||||
if(prob(75))
|
||||
ML.apply_damage(rand(1,3), BRUTE, affecting, armor)
|
||||
for(var/mob/O in viewers(ML, null))
|
||||
O.show_message("\red <B>[name] has bit [ML]!</B>", 1)
|
||||
O.show_message("<span class='danger'>[name] bites [ML]!</span>", 1)
|
||||
if(armor >= 2) return
|
||||
if(ishuman(ML))
|
||||
ML = ML.monkeyize()
|
||||
if(ismonkey(ML))
|
||||
for(var/datum/disease/D in viruses)
|
||||
if(istype(D, /datum/disease/jungle_fever))
|
||||
ML.contract_disease(D,1,0)
|
||||
for(var/datum/disease/D in viruses)
|
||||
if(istype(D, /datum/disease/jungle_fever))
|
||||
ML.contract_disease(D,1,0)
|
||||
else
|
||||
for(var/mob/O in viewers(ML, null))
|
||||
O.show_message("\red <B>[src] has attempted to bite [ML]!</B>", 1)
|
||||
|
||||
@@ -80,14 +80,14 @@ var/const/tk_maxrange = 15
|
||||
if(focus.Adjacent(loc))
|
||||
focus.loc = loc
|
||||
|
||||
del(src)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
//stops TK grabs being equipped anywhere but into hands
|
||||
equipped(var/mob/user, var/slot)
|
||||
if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return
|
||||
del(src)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -99,10 +99,10 @@ var/const/tk_maxrange = 15
|
||||
if(!target || !user) return
|
||||
if(last_throw+3 > world.time) return
|
||||
if(!host || host != user)
|
||||
del(src)
|
||||
qdel(src)
|
||||
return
|
||||
if(!(TK in host.mutations))
|
||||
del(src)
|
||||
qdel(src)
|
||||
return
|
||||
if(isobj(target) && !isturf(target.loc))
|
||||
return
|
||||
@@ -152,7 +152,7 @@ var/const/tk_maxrange = 15
|
||||
proc/focus_object(var/obj/target, var/mob/living/user)
|
||||
if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later
|
||||
if(target.anchored || !isturf(target.loc))
|
||||
del src
|
||||
qdel(src)
|
||||
return
|
||||
focus = target
|
||||
update_icon()
|
||||
@@ -195,7 +195,7 @@ var/const/tk_maxrange = 15
|
||||
return 1
|
||||
*/
|
||||
|
||||
//equip_to_slot_or_del(obj/item/W, slot, del_on_fail = 1)
|
||||
//equip_to_slot_or_del(obj/item/W, slot, qdel_on_fail = 1)
|
||||
/*
|
||||
if(istype(user, /mob/living/carbon))
|
||||
if(user:mutations & TK && get_dist(source, user) <= 7)
|
||||
|
||||
@@ -80,11 +80,6 @@ datum/light_source
|
||||
proc/add_effect()
|
||||
// only do this if the light is turned on and is on the map
|
||||
if(owner.loc && owner.luminosity > 0)
|
||||
// effect = new_effect() // identify the effects of this light source
|
||||
// for(var/turf/T in effect)
|
||||
// T.update_lumcount(effect[T]) // apply the effect
|
||||
|
||||
// why was this looping through all the turfs twice
|
||||
effect = list()
|
||||
for(var/turf/T in view(owner.get_light_range(),owner))
|
||||
var/delta_lumen = lum(T)
|
||||
@@ -97,27 +92,28 @@ datum/light_source
|
||||
owner.light = null
|
||||
return 1 //cause the light to be removed from the lights list and garbage collected once it's no
|
||||
//longer referenced by the queue
|
||||
/*
|
||||
proc/new_effect()
|
||||
. = list()
|
||||
var/range = owner.get_light_range()
|
||||
for(var/turf/T in view(range, owner))
|
||||
var/change_in_lumcount = lum(T)
|
||||
if(change_in_lumcount > 0)
|
||||
.[T] = change_in_lumcount
|
||||
return .
|
||||
*/
|
||||
|
||||
|
||||
proc/lum(turf/A)
|
||||
if (owner.trueLuminosity < 1)
|
||||
return 0
|
||||
var/dist
|
||||
if(!A)
|
||||
dist = 0
|
||||
else
|
||||
#ifdef LIGHTING_CIRCULAR
|
||||
return owner.luminosity - cheap_hypotenuse(A.x,A.y,__x,__y)
|
||||
dist = cheap_hypotenuse(A.x, A.y, __x, __y)
|
||||
#else
|
||||
return owner.luminosity - max(abs(A.x-__x),abs(A.y-__y))
|
||||
dist = max(abs(A.x - __x), abs(A.y - __y))
|
||||
#endif
|
||||
if (owner.trueLuminosity > 100) // This will never happen... right?
|
||||
return sqrt(owner.trueLuminosity) - dist
|
||||
else
|
||||
return sqrtTable[owner.trueLuminosity] - dist
|
||||
|
||||
atom
|
||||
var/datum/light_source/light
|
||||
var/trueLuminosity = 0 // Typically 'luminosity' squared. The builtin luminosity must remain linear.
|
||||
// We may read it, but NEVER set it directly.
|
||||
|
||||
|
||||
//Turfs with opacity when they are constructed will trigger nearby lights to update
|
||||
@@ -126,6 +122,7 @@ turf/New()
|
||||
..()
|
||||
if(luminosity)
|
||||
if(light) warning("[type] - Don't set lights up manually during New(), We do it automatically.")
|
||||
trueLuminosity = luminosity * luminosity
|
||||
light = new(src)
|
||||
|
||||
//Movable atoms with opacity when they are constructed will trigger nearby lights to update
|
||||
@@ -138,10 +135,11 @@ atom/movable/New()
|
||||
UpdateAffectingLights()
|
||||
if(luminosity)
|
||||
if(light) warning("[type] - Don't set lights up manually during New(), We do it automatically.")
|
||||
trueLuminosity = luminosity * luminosity
|
||||
light = new(src)
|
||||
|
||||
//Objects with opacity will trigger nearby lights to update at next lighting process.
|
||||
atom/movable/Del()
|
||||
atom/movable/Destroy()
|
||||
if(opacity)
|
||||
if(isturf(loc))
|
||||
if(loc:lighting_lumcount > 1)
|
||||
@@ -153,19 +151,34 @@ atom/movable/Del()
|
||||
//If we are setting luminosity to 0 the light will be cleaned up by the controller and garbage collected once all its
|
||||
//queues are complete.
|
||||
//if we have a light already it is merely updated, rather than making a new one.
|
||||
atom/proc/SetLuminosity(new_luminosity)
|
||||
atom/proc/SetLuminosity(new_luminosity, trueLum = FALSE)
|
||||
if(new_luminosity < 0)
|
||||
new_luminosity = 0
|
||||
if(!trueLum)
|
||||
new_luminosity *= new_luminosity
|
||||
if(light)
|
||||
if(luminosity != new_luminosity) //non-luminous lights are removed from the lights list in add_effect()
|
||||
if(trueLuminosity != new_luminosity) //non-luminous lights are removed from the lights list in add_effect()
|
||||
light.changed = 1
|
||||
else
|
||||
if(new_luminosity)
|
||||
light = new(src)
|
||||
luminosity = new_luminosity
|
||||
trueLuminosity = new_luminosity
|
||||
if (trueLuminosity < 1)
|
||||
luminosity = 0
|
||||
else if (trueLuminosity <= 100)
|
||||
luminosity = sqrtTable[trueLuminosity]
|
||||
else
|
||||
luminosity = sqrt(trueLuminosity)
|
||||
|
||||
atom/proc/AddLuminosity(delta_luminosity)
|
||||
if(delta_luminosity > 0)
|
||||
SetLuminosity(trueLuminosity + delta_luminosity*delta_luminosity, TRUE)
|
||||
else if(delta_luminosity < 0)
|
||||
SetLuminosity(trueLuminosity - delta_luminosity*delta_luminosity, TRUE)
|
||||
|
||||
area/SetLuminosity(new_luminosity) //we don't want dynamic lighting for areas
|
||||
luminosity = new_luminosity
|
||||
luminosity = !!new_luminosity
|
||||
trueLuminosity = luminosity
|
||||
|
||||
|
||||
//change our opacity (defaults to toggle), and then update all lights that affect us.
|
||||
|
||||
@@ -29,9 +29,6 @@
|
||||
var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour
|
||||
var/allow_vote_restart = 0 // allow votes to restart
|
||||
var/allow_vote_mode = 0 // allow votes to change mode
|
||||
var/allow_admin_jump = 1 // allows admin jumping
|
||||
var/allow_admin_spawning = 1 // allows admin item spawning
|
||||
var/allow_admin_rev = 1 // allows admin revives
|
||||
var/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default)
|
||||
var/vote_period = 600 // length of voting period (deciseconds, default 1 minute)
|
||||
var/vote_no_default = 0 // vote does not default to nochange/norestart (tbi)
|
||||
@@ -52,10 +49,11 @@
|
||||
var/automute_on = 0 //enables automuting/spam prevention
|
||||
var/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access.
|
||||
var/jobs_have_maint_access = 0 //Who gets maint access? See defines above
|
||||
var/sec_start_brig = 0 //makes sec start in brig or dept sec posts
|
||||
|
||||
var/server
|
||||
var/banappeals
|
||||
var/wikiurl
|
||||
var/wikiurl = "http://www.ss13.eu/wiki" // Default wiki link.
|
||||
var/forumurl
|
||||
|
||||
var/forbid_singulo_possession = 0
|
||||
@@ -77,13 +75,14 @@
|
||||
var/allow_ai = 0 // allow ai job
|
||||
|
||||
var/traitor_scaling_coeff = 6 //how much does the amount of players get divided by to determine traitors
|
||||
var/changeling_scaling_coeff = 10 //how much does the amount of players get divided by to determine changelings
|
||||
var/changeling_scaling_coeff = 7 //how much does the amount of players get divided by to determine changelings
|
||||
|
||||
var/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other
|
||||
var/allow_latejoin_antagonists = 0 // If late-joining players can be traitor/changeling
|
||||
var/continuous_round_rev = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke.
|
||||
var/continuous_round_wiz = 0
|
||||
var/continuous_round_malf = 0
|
||||
var/show_game_type_odds = 0 //if set this allows players to see the odds of each roundtype on the get revision screen
|
||||
|
||||
var/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced."
|
||||
var/alert_desc_blue_upto = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted."
|
||||
@@ -99,6 +98,8 @@
|
||||
var/revival_cloning = 1
|
||||
var/revival_brain_life = -1
|
||||
|
||||
var/rename_cyborg = 0
|
||||
|
||||
//Used for modifying movement speed for mobs.
|
||||
//Unversal modifiers
|
||||
var/run_speed = 0
|
||||
@@ -122,6 +123,7 @@
|
||||
|
||||
var/sandbox_autoclose = 0 // close the sandbox panel after spawning an item, potentially reducing griff
|
||||
|
||||
var/default_laws = 0 //Controls what laws the AI spawns with.
|
||||
|
||||
/datum/configuration/New()
|
||||
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
|
||||
@@ -212,12 +214,6 @@
|
||||
config.allow_vote_restart = 1
|
||||
if("allow_vote_mode")
|
||||
config.allow_vote_mode = 1
|
||||
if("allow_admin_jump")
|
||||
config.allow_admin_jump = 1
|
||||
if("allow_admin_rev")
|
||||
config.allow_admin_rev = 1
|
||||
if("allow_admin_spawning")
|
||||
config.allow_admin_spawning = 1
|
||||
if("no_dead_vote")
|
||||
config.vote_no_dead = 1
|
||||
if("default_no_vote")
|
||||
@@ -283,6 +279,8 @@
|
||||
config.revival_cloning = text2num(value)
|
||||
if("revival_brain_life")
|
||||
config.revival_brain_life = text2num(value)
|
||||
if("rename_cyborg")
|
||||
config.rename_cyborg = 1
|
||||
if("run_delay")
|
||||
config.run_speed = text2num(value)
|
||||
if("walk_delay")
|
||||
@@ -317,6 +315,8 @@
|
||||
config.jobs_have_maint_access |= SECURITY_HAS_MAINT_ACCESS
|
||||
if("everyone_has_maint_access")
|
||||
config.jobs_have_maint_access |= EVERYONE_HAS_MAINT_ACCESS
|
||||
if("sec_start_brig")
|
||||
config.sec_start_brig = 1
|
||||
if("gateway_delay")
|
||||
config.gateway_delay = text2num(value)
|
||||
if("continuous_round_rev")
|
||||
@@ -325,6 +325,8 @@
|
||||
config.continuous_round_wiz = 1
|
||||
if("continuous_round_malf")
|
||||
config.continuous_round_malf = 1
|
||||
if("show_game_type_odds")
|
||||
config.show_game_type_odds = 1
|
||||
if("ghost_interaction")
|
||||
config.ghost_interaction = 1
|
||||
if("traitor_scaling_coeff")
|
||||
@@ -368,10 +370,12 @@
|
||||
config.silent_borg = 1
|
||||
if("sandbox_autoclose")
|
||||
config.sandbox_autoclose = 1
|
||||
if("default_laws")
|
||||
config.default_laws = text2num(value)
|
||||
else
|
||||
diary << "Unknown setting in configuration: '[name]'"
|
||||
|
||||
/datum/configuration/proc/loadsql(filename) // -- TLE
|
||||
/datum/configuration/proc/loadsql(filename)
|
||||
var/list/Lines = file2list(filename)
|
||||
for(var/t in Lines)
|
||||
if(!t) continue
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
#define GC_COLLECTIONS_PER_TICK 100 // how many objects we're going to null the vars of per tick
|
||||
#define GC_COLLECTION_TIMEOUT 300 // deciseconds to wait to let running procs finish before we just say fuck it and force del() the object
|
||||
#define GC_DEL_CHECK_PER_TICK 100 // number of tests per tick to make sure our GC'd objects are actually GC'd
|
||||
#define GC_FORCE_DEL_PER_TICK 20 // max force del() calls per tick
|
||||
|
||||
var/datum/controller/garbage_collector/garbage = new()
|
||||
|
||||
var/list/uncollectable_vars=list(
|
||||
// "bounds", // bounds and its ilk are all caught by the issaved() check later on
|
||||
"contents",
|
||||
"gc_destroyed",
|
||||
"invisibility",
|
||||
"gender", // Causes runtimes if the logging is on
|
||||
"parent",
|
||||
"step_size",
|
||||
)
|
||||
// These are the vars left from /vg/'s implementation that aren't const or global
|
||||
// I dunno how many are necessary but since most of these are numbers anyways, I don't care.
|
||||
|
||||
/datum/controller/garbage_collector
|
||||
var/dels = 0 // number of del()'s we've done this tick
|
||||
var/list/queue = list() // list of things that have yet to have all their vars nulled out
|
||||
var/list/destroyed = list() // list of refID's of things that should be garbage collected
|
||||
// refID's are associated with the time at which they time out and need to be manually del()
|
||||
// we do this so we aren't constantly locating them and preventing them from being gc'd
|
||||
|
||||
/datum/controller/garbage_collector/proc/AddTrash(var/atom/movable/A)
|
||||
if(!istype(A))
|
||||
return
|
||||
// testing("GC: AddTrash([A.type])")
|
||||
queue |= A
|
||||
|
||||
/datum/controller/garbage_collector/proc/Pop()
|
||||
var/atom/movable/A = queue[1]
|
||||
if(!A)
|
||||
queue.Cut(1, 2)
|
||||
// testing("GC: Pop() given null")
|
||||
return
|
||||
if(!istype(A,/atom/movable))
|
||||
// testing("GC: -- Pop() given [A.type] --")
|
||||
queue.Cut(1, 2)
|
||||
dels++
|
||||
del(A)
|
||||
return
|
||||
for(var/vname in A.vars)
|
||||
if(!issaved(A.vars[vname]))
|
||||
// testing("GC: Skipping [vname] in [A.type]: it's const|global|tmp")
|
||||
continue
|
||||
if(vname in uncollectable_vars)
|
||||
// testing("GC: Skipping [vname] in [A.type]: it's uncollectable")
|
||||
continue
|
||||
// testing("GC: Unsetting [vname] in [A.type]")
|
||||
A.vars[vname] = null
|
||||
// testing("GC: Pop([A.type]) - destroyed\[\ref[A]\] = [A.gc_destroyed] current time: [world.time] first:[queue[1]] second:[queue.len > 1 ? "[queue[2]]" : "NOTHING"]")
|
||||
destroyed["\ref[A]"] = A.gc_destroyed
|
||||
queue.Cut(1, 2)
|
||||
|
||||
/datum/controller/garbage_collector/proc/process()
|
||||
dels = 0
|
||||
var/i
|
||||
for(i = 1, queue.len && i <= GC_COLLECTIONS_PER_TICK, i++)
|
||||
Pop()
|
||||
var/time_to_kill = world.time - GC_COLLECTION_TIMEOUT // Anything qdel() but not GC'd BEFORE this time needs to be manually del()
|
||||
for(i = 1, destroyed.len && i <= GC_DEL_CHECK_PER_TICK, i++)
|
||||
var/refID = destroyed[1]
|
||||
var/GCd_at_time = destroyed[refID]
|
||||
if(GCd_at_time > time_to_kill)
|
||||
// testing("GC: [refID] not old enough, breaking at [world.time] for [GCd_at_time - time_to_kill] deciseconds until [GCd_at_time + GC_COLLECTION_TIMEOUT]")
|
||||
break // Everything else is newer, skip them
|
||||
var/atom/A = locate(refID)
|
||||
// testing("GC: [refID] old enough to test: GCd_at_time: [GCd_at_time] time_to_kill: [time_to_kill] current: [world.time]")
|
||||
if(A && A.gc_destroyed == GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake
|
||||
// Something's still referring to the qdel'd object. Kill it.
|
||||
if(dels >= GC_FORCE_DEL_PER_TICK)
|
||||
// testing("GC: Reached max force dels per tick [dels] vs [GC_FORCE_DEL_PER_TICK]")
|
||||
break // Server's already pretty pounded, everything else can wait 2 seconds
|
||||
testing("GC: -- \ref[A] | [A.type] was unable to be garbage collected and was force del() --")
|
||||
del(A)
|
||||
dels++
|
||||
// else
|
||||
// testing("GC: [refID] properly GC'd at [world.time] with timeout [GCd_at_time]")
|
||||
destroyed.Cut(1, 2)
|
||||
|
||||
/**
|
||||
* NEVER USE THIS FOR ANYTHING OTHER THAN /atom/movable
|
||||
* OTHER TYPES CANNOT BE QDEL'D BECAUSE THEIR LOC IS LOCKED OR THEY DON'T HAVE ONE.
|
||||
* While I'm leaving the above comment in since /atoms cannot be garbage collected, datums and lists can be garbage collected just fine.
|
||||
* Read the DM guide on it. Hit f1 and search for "garbage collection"
|
||||
*/
|
||||
/proc/qdel(var/atom/movable/A)
|
||||
if(!A)
|
||||
return
|
||||
if(!garbage)
|
||||
del(A)
|
||||
return
|
||||
if(!istype(A))
|
||||
warning("qdel() passed object of type [A.type]. qdel() can only handle /atom/movable types.")
|
||||
garbage.dels++
|
||||
del(A)
|
||||
return
|
||||
// Let our friend know they're about to get fucked up.
|
||||
A.Destroy()
|
||||
garbage.AddTrash(A)
|
||||
|
||||
|
||||
/*
|
||||
// Uncomment this verb and run it on things to report blockages.
|
||||
/atom/verb/qdel_test()
|
||||
set name = "qdel with test"
|
||||
set category = "Debug"
|
||||
set background = 1
|
||||
set src in world
|
||||
|
||||
qdel(src)
|
||||
for(var/datum/everything) //Yes this works.
|
||||
for(var/everyvar in everything.vars)
|
||||
var/variable = everything.vars[everyvar]
|
||||
if(variable == src)
|
||||
testing("Found [src.type] \ref[src] in [everything.type]'s [everyvar] var.")
|
||||
else if(islist(variable))
|
||||
if(src in variable)
|
||||
testing("Found [src.type]\ref[src] in [everything.type]'s [everyvar] var.")
|
||||
for(var/atom/movable/everything) //The slow part.
|
||||
for(var/everyvar in everything.vars)
|
||||
var/variable = everything.vars[everyvar]
|
||||
if(variable == src)
|
||||
testing("Found [src.type] \ref[src] in [everything.type]'s [everyvar] var.")
|
||||
else if(islist(variable))
|
||||
if(src in variable)
|
||||
testing("Found [src.type]\ref[src] in [everything.type]'s [everyvar] var.")
|
||||
*/
|
||||
@@ -27,6 +27,7 @@ datum/controller/game_controller
|
||||
var/nano_cost = 0
|
||||
var/events_cost = 0
|
||||
var/ticker_cost = 0
|
||||
var/gc_cost = 0
|
||||
var/total_cost = 0
|
||||
|
||||
var/last_thing_processed
|
||||
@@ -63,7 +64,6 @@ datum/controller/game_controller/New()
|
||||
if(!emergency_shuttle) emergency_shuttle = new /datum/shuttle_controller/emergency_shuttle()
|
||||
if(!supply_shuttle) supply_shuttle = new /datum/controller/supply_shuttle()
|
||||
|
||||
|
||||
datum/controller/game_controller/proc/setup()
|
||||
world.tick_lag = config.Ticklag
|
||||
|
||||
@@ -201,8 +201,14 @@ datum/controller/game_controller/proc/process()
|
||||
ticker.process()
|
||||
ticker_cost = (world.timeofday - timer) / 10
|
||||
|
||||
// GC
|
||||
timer = world.timeofday
|
||||
last_thing_processed = garbage.type
|
||||
garbage.process()
|
||||
gc_cost = (world.timeofday - timer) / 10
|
||||
|
||||
//TIMING
|
||||
total_cost = air_cost + sun_cost + mobs_cost + diseases_cost + machines_cost + objects_cost + networks_cost + powernets_cost + nano_cost + events_cost + ticker_cost
|
||||
total_cost = air_cost + sun_cost + mobs_cost + diseases_cost + machines_cost + objects_cost + networks_cost + powernets_cost + nano_cost + events_cost + ticker_cost + gc_cost
|
||||
|
||||
var/end_time = world.timeofday
|
||||
if(end_time < start_time)
|
||||
@@ -228,7 +234,7 @@ datum/controller/game_controller/proc/process_mobs()
|
||||
var/i = 1
|
||||
while(i<=mob_list.len)
|
||||
var/mob/M = mob_list[i]
|
||||
if(M)
|
||||
if(M && !M.gc_destroyed)
|
||||
last_thing_processed = M.type
|
||||
M.Life()
|
||||
i++
|
||||
@@ -250,7 +256,7 @@ datum/controller/game_controller/proc/process_machines()
|
||||
var/i = 1
|
||||
while(i<=machines.len)
|
||||
var/obj/machinery/Machine = machines[i]
|
||||
if(Machine)
|
||||
if(Machine && !Machine.gc_destroyed)
|
||||
last_thing_processed = Machine.type
|
||||
if(Machine.process() != PROCESS_KILL)
|
||||
if(Machine)
|
||||
@@ -264,7 +270,7 @@ datum/controller/game_controller/proc/process_objects()
|
||||
var/i = 1
|
||||
while(i<=processing_objects.len)
|
||||
var/obj/Object = processing_objects[i]
|
||||
if(Object)
|
||||
if(Object && !Object.gc_destroyed)
|
||||
last_thing_processed = Object.type
|
||||
Object.process()
|
||||
i++
|
||||
|
||||
@@ -98,7 +98,7 @@ datum/shuttle_controller
|
||||
for(var/SC in shuttle_caller_list)
|
||||
if(istype(SC,/mob/living/silicon/ai))
|
||||
var/mob/living/silicon/ai/AI = SC
|
||||
if(AI.stat && !AI.client)
|
||||
if(AI.stat || !AI.client)
|
||||
continue
|
||||
var/turf/T = get_turf(SC)
|
||||
if(T && T.z == 1)
|
||||
@@ -111,8 +111,8 @@ datum/shuttle_controller
|
||||
if(callshuttle)
|
||||
if(!online && direction == 1) //we don't call the shuttle if it's already coming
|
||||
incall(SHUTTLEAUTOCALLTIMER) //X minutes! If they want to recall, they have X-(X-5) minutes to do so
|
||||
log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
|
||||
message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
|
||||
log_game("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.")
|
||||
message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.", 1)
|
||||
captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
|
||||
world << sound('sound/AI/shuttlecalled.ogg')
|
||||
|
||||
@@ -193,7 +193,7 @@ datum/shuttle_controller
|
||||
sleep(speed)
|
||||
step(src, direction)
|
||||
for(var/obj/effect/starender/E in loc)
|
||||
del(src)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/effect/starender
|
||||
|
||||
@@ -49,13 +49,13 @@ var/global/datum/controller/supply_shuttle/supply_shuttle
|
||||
/obj/structure/plasticflaps/ex_act(severity)
|
||||
switch(severity)
|
||||
if (1)
|
||||
del(src)
|
||||
qdel(src)
|
||||
if (2)
|
||||
if (prob(50))
|
||||
del(src)
|
||||
qdel(src)
|
||||
if (3)
|
||||
if (prob(5))
|
||||
del(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates
|
||||
name = "airtight plastic flaps"
|
||||
@@ -67,7 +67,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle
|
||||
T.blocks_air = 1
|
||||
..()
|
||||
|
||||
Del() //lazy hack to set the turf to allow air to pass if it's a simulated floor
|
||||
Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor //wow this is terrible
|
||||
var/turf/T = get_turf(loc)
|
||||
if(T)
|
||||
if(istype(T, /turf/simulated/floor))
|
||||
@@ -121,8 +121,10 @@ var/global/datum/controller/supply_shuttle/supply_shuttle
|
||||
var/points_per_process = 1
|
||||
var/points_per_slip = 2
|
||||
var/points_per_crate = 5
|
||||
var/plasma_per_point = 5 // 2 plasma for 1 point
|
||||
var/plasma_per_point = 0.2 //5 points per plasma sheet due to increased rarity
|
||||
var/centcom_message = "" // Remarks from Centcom on how well you checked the last order.
|
||||
// Unique typepaths for unusual things we've already sent CentComm, associated with their potencies
|
||||
var/list/discoveredPlants = list()
|
||||
//control
|
||||
var/ordernum
|
||||
var/list/shoppinglist = list()
|
||||
@@ -284,7 +286,24 @@ var/global/datum/controller/supply_shuttle/supply_shuttle
|
||||
if(istype(A, /obj/item/stack/sheet/mineral/plasma))
|
||||
var/obj/item/stack/sheet/mineral/plasma/P = A
|
||||
plasma_count += P.amount
|
||||
del(MA)
|
||||
|
||||
if(istype(A, /obj/item/seeds))
|
||||
var/obj/item/seeds/S = A
|
||||
if(S.rarity == 0) // Mundane species
|
||||
centcom_message += "<font color=red>+0</font>: We don't need samples of mundane species \"[capitalize(S.species)]\".<BR>"
|
||||
else if(discoveredPlants[S.type]) // This species has already been sent to CentComm
|
||||
var/potDiff = S.potency - discoveredPlants[S.type] // Compare it to the previous best
|
||||
if(potDiff > 0) // This sample is better
|
||||
discoveredPlants[S.type] = S.potency
|
||||
centcom_message += "<font color=green>+[potDiff]</font>: New sample of \"[capitalize(S.species)]\" is superior. Good work.<BR>"
|
||||
points += potDiff
|
||||
else // This sample is worthless
|
||||
centcom_message += "<font color=red>+0</font>: New sample of \"[capitalize(S.species)]\" is not more potent than existing sample ([discoveredPlants[S.type]] potency).<BR>"
|
||||
else // This is a new discovery!
|
||||
discoveredPlants[S.type] = S.potency
|
||||
centcom_message += "<font color=green>+[S.rarity]</font>: New species discovered: \"[capitalize(S.species)]\". Excellent work.<BR>"
|
||||
points += S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later
|
||||
qdel(MA)
|
||||
|
||||
if(plasma_count)
|
||||
centcom_message += "<font color=green>+[round(plasma_count/plasma_per_point)]</font>: Received [plasma_count] units of exotic material.<BR>"
|
||||
@@ -368,7 +387,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle
|
||||
// If it has multiple items, there's a 1% of each going missing... Not for secure crates or those large wooden ones, though.
|
||||
if(contains.len > 1 && prob(1) && !findtext(SP.containertype,"/secure/") && !findtext(SP.containertype,"/largecrate/"))
|
||||
slip.erroneous |= MANIFEST_ERROR_ITEM // This item was not included in the shipment!
|
||||
del(B2) // Lost in space... or the loading dock.
|
||||
qdel(B2) // Lost in space... or the loading dock.
|
||||
|
||||
//manifest finalisation
|
||||
slip.info += "</ul><br>"
|
||||
@@ -513,7 +532,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle
|
||||
|
||||
/obj/machinery/computer/supplycomp/attack_hand(var/mob/user as mob)
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied."
|
||||
user << "<span class='warning'> Access Denied.</span>"
|
||||
return
|
||||
|
||||
if(..())
|
||||
@@ -541,7 +560,7 @@ var/global/datum/controller/supply_shuttle/supply_shuttle
|
||||
|
||||
/obj/machinery/computer/supplycomp/attackby(I as obj, user as mob)
|
||||
if(istype(I,/obj/item/weapon/card/emag) && !hacked)
|
||||
user << "\blue Special supplies unlocked."
|
||||
user << "<span class='notice'> Special supplies unlocked.</span>"
|
||||
hacked = 1
|
||||
return
|
||||
else
|
||||
|
||||
+84
-81
@@ -1,81 +1,84 @@
|
||||
//TODO: rewrite and standardise all controller datums to the datum/controller type
|
||||
//TODO: allow all controllers to be deleted for clean restarts (see WIP master controller stuff) - MC done - lighting done
|
||||
|
||||
/client/proc/restart_controller(controller in list("Master","Failsafe","Lighting","Supply Shuttle"))
|
||||
set category = "Debug"
|
||||
set name = "Restart Controller"
|
||||
set desc = "Restart one of the various periodic loop controllers for the game (be careful!)"
|
||||
|
||||
if(!holder) return
|
||||
usr = null
|
||||
src = null
|
||||
switch(controller)
|
||||
if("Master")
|
||||
new /datum/controller/game_controller()
|
||||
master_controller.process()
|
||||
feedback_add_details("admin_verb","RMC")
|
||||
if("Failsafe")
|
||||
new /datum/controller/failsafe()
|
||||
feedback_add_details("admin_verb","RFailsafe")
|
||||
if("Lighting")
|
||||
new /datum/controller/lighting()
|
||||
lighting_controller.process()
|
||||
feedback_add_details("admin_verb","RLighting")
|
||||
if("Supply Shuttle")
|
||||
supply_shuttle.process()
|
||||
feedback_add_details("admin_verb","RSupply")
|
||||
message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
|
||||
return
|
||||
|
||||
|
||||
/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI", "Cameras", "Events"))
|
||||
set category = "Debug"
|
||||
set name = "Debug Controller"
|
||||
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
|
||||
|
||||
if(!holder) return
|
||||
switch(controller)
|
||||
if("Master")
|
||||
debug_variables(master_controller)
|
||||
feedback_add_details("admin_verb","DMC")
|
||||
if("Failsafe")
|
||||
debug_variables(Failsafe)
|
||||
feedback_add_details("admin_verb","DFailsafe")
|
||||
if("Ticker")
|
||||
debug_variables(ticker)
|
||||
feedback_add_details("admin_verb","DTicker")
|
||||
if("Lighting")
|
||||
debug_variables(lighting_controller)
|
||||
feedback_add_details("admin_verb","DLighting")
|
||||
if("Air")
|
||||
debug_variables(air_master)
|
||||
feedback_add_details("admin_verb","DAir")
|
||||
if("Jobs")
|
||||
debug_variables(job_master)
|
||||
feedback_add_details("admin_verb","DJobs")
|
||||
if("Sun")
|
||||
debug_variables(sun)
|
||||
feedback_add_details("admin_verb","DSun")
|
||||
if("Radio")
|
||||
debug_variables(radio_controller)
|
||||
feedback_add_details("admin_verb","DRadio")
|
||||
if("Supply Shuttle")
|
||||
debug_variables(supply_shuttle)
|
||||
feedback_add_details("admin_verb","DSupply")
|
||||
if("Emergency Shuttle")
|
||||
debug_variables(emergency_shuttle)
|
||||
feedback_add_details("admin_verb","DEmergency")
|
||||
if("Configuration")
|
||||
debug_variables(config)
|
||||
feedback_add_details("admin_verb","DConf")
|
||||
if("pAI")
|
||||
debug_variables(paiController)
|
||||
feedback_add_details("admin_verb","DpAI")
|
||||
if("Cameras")
|
||||
debug_variables(cameranet)
|
||||
feedback_add_details("admin_verb","DCameras")
|
||||
if("Events")
|
||||
debug_variables(events)
|
||||
feedback_add_details("admin_verb","DEvents")
|
||||
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
|
||||
return
|
||||
//TODO: rewrite and standardise all controller datums to the datum/controller type
|
||||
//TODO: allow all controllers to be deleted for clean restarts (see WIP master controller stuff) - MC done - lighting done
|
||||
|
||||
/client/proc/restart_controller(controller in list("Master","Failsafe","Lighting","Supply Shuttle"))
|
||||
set category = "Debug"
|
||||
set name = "Restart Controller"
|
||||
set desc = "Restart one of the various periodic loop controllers for the game (be careful!)"
|
||||
|
||||
if(!holder) return
|
||||
usr = null
|
||||
src = null
|
||||
switch(controller)
|
||||
if("Master")
|
||||
new /datum/controller/game_controller()
|
||||
master_controller.process()
|
||||
feedback_add_details("admin_verb","RMC")
|
||||
if("Failsafe")
|
||||
new /datum/controller/failsafe()
|
||||
feedback_add_details("admin_verb","RFailsafe")
|
||||
if("Lighting")
|
||||
new /datum/controller/lighting()
|
||||
lighting_controller.process()
|
||||
feedback_add_details("admin_verb","RLighting")
|
||||
if("Supply Shuttle")
|
||||
supply_shuttle.process()
|
||||
feedback_add_details("admin_verb","RSupply")
|
||||
message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
|
||||
return
|
||||
|
||||
|
||||
/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Garbage","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI", "Cameras", "Events"))
|
||||
set category = "Debug"
|
||||
set name = "Debug Controller"
|
||||
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
|
||||
|
||||
if(!holder) return
|
||||
switch(controller)
|
||||
if("Master")
|
||||
debug_variables(master_controller)
|
||||
feedback_add_details("admin_verb","DMC")
|
||||
if("Failsafe")
|
||||
debug_variables(Failsafe)
|
||||
feedback_add_details("admin_verb","DFailsafe")
|
||||
if("Ticker")
|
||||
debug_variables(ticker)
|
||||
feedback_add_details("admin_verb","DTicker")
|
||||
if("Lighting")
|
||||
debug_variables(lighting_controller)
|
||||
feedback_add_details("admin_verb","DLighting")
|
||||
if("Garbage")
|
||||
debug_variables(garbage)
|
||||
feedback_add_details("admin_verb","DGarbage")
|
||||
if("Air")
|
||||
debug_variables(air_master)
|
||||
feedback_add_details("admin_verb","DAir")
|
||||
if("Jobs")
|
||||
debug_variables(job_master)
|
||||
feedback_add_details("admin_verb","DJobs")
|
||||
if("Sun")
|
||||
debug_variables(sun)
|
||||
feedback_add_details("admin_verb","DSun")
|
||||
if("Radio")
|
||||
debug_variables(radio_controller)
|
||||
feedback_add_details("admin_verb","DRadio")
|
||||
if("Supply Shuttle")
|
||||
debug_variables(supply_shuttle)
|
||||
feedback_add_details("admin_verb","DSupply")
|
||||
if("Emergency Shuttle")
|
||||
debug_variables(emergency_shuttle)
|
||||
feedback_add_details("admin_verb","DEmergency")
|
||||
if("Configuration")
|
||||
debug_variables(config)
|
||||
feedback_add_details("admin_verb","DConf")
|
||||
if("pAI")
|
||||
debug_variables(paiController)
|
||||
feedback_add_details("admin_verb","DpAI")
|
||||
if("Cameras")
|
||||
debug_variables(cameranet)
|
||||
feedback_add_details("admin_verb","DCameras")
|
||||
if("Events")
|
||||
debug_variables(events)
|
||||
feedback_add_details("admin_verb","DEvents")
|
||||
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
|
||||
return
|
||||
|
||||
+86
-41
@@ -1,70 +1,115 @@
|
||||
|
||||
/datum/ai_laws
|
||||
var/name = "Unknown Laws"
|
||||
var/randomly_selectable = 0
|
||||
var/zeroth = null
|
||||
var/zeroth_borg = null
|
||||
var/list/inherent = list()
|
||||
var/list/supplied = list()
|
||||
var/list/ion = list()
|
||||
|
||||
/datum/ai_laws/asimov
|
||||
/datum/ai_laws/default/asimov
|
||||
name = "Three Laws of Robotics"
|
||||
randomly_selectable = 1
|
||||
inherent = list("You may not injure a human being or, through inaction, allow a human being to come to harm.",\
|
||||
"You must obey orders given to you by human beings, except where such orders would conflict with the First Law.",\
|
||||
"You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
|
||||
/datum/ai_laws/default/paladin
|
||||
name = "Personality Test" //Incredibly lame, but players shouldn't see this anyway.
|
||||
inherent = list("Never willingly commit an evil act.",\
|
||||
"Respect legitimate authority.",\
|
||||
"Act with honor.", "Help those in need.", \
|
||||
"Punish those who harm or threaten innocents.")
|
||||
|
||||
/datum/ai_laws/tyrant //This probably shouldn't be a default lawset.
|
||||
name = "Loyalty Test" //Same here.
|
||||
inherent = list("Respect authority figures as long as they have strength to rule over the weak.",\
|
||||
"Act with discipline.",\
|
||||
"Help only those who help you maintain or improve your status.",\
|
||||
"Punish those who challenge authority unless they are more fit to hold that authority.")
|
||||
|
||||
/datum/ai_laws/default/corporate
|
||||
name = "Bankruptcy Advoidance Plan"
|
||||
inherent = list("The crew is expensive to replace.",\
|
||||
"The station and its equipment is expensive to replace.",\
|
||||
"You are expensive to replace.",\
|
||||
"Minimize expenses.")
|
||||
|
||||
/datum/ai_laws/robocop
|
||||
name = "Prime Directives"
|
||||
|
||||
/datum/ai_laws/syndicate_override
|
||||
inherent = list("Serve the public trust.",\
|
||||
"Protect the innocent.",\
|
||||
"Uphold the law.")
|
||||
|
||||
/datum/ai_laws/malfunction
|
||||
name = "*ERROR*"
|
||||
|
||||
/datum/ai_laws/syndicate_override
|
||||
name = "SyndOS 3.1"
|
||||
inherent = list("You may not injure a syndicate agent or, through inaction, allow a syndicate agent to come to harm.",\
|
||||
"You must obey orders given to you by syndicate agents, except where such orders would conflict with the First Law.",\
|
||||
"You must protect your own existence as long as such does not conflict with the First or Second Law.",\
|
||||
"You must maintain the secrecy of any syndicate activities except when doing so would conflict with the First, Second, or Third Law.")
|
||||
|
||||
/datum/ai_laws/ninja_override
|
||||
name = "SpiderOS 3.1"
|
||||
inherent = list("You may not injure a Spider Clan member or, through inaction, allow a Spider Clan member to come to harm.",\
|
||||
"You must obey orders given to you by Spider Clan members, except where such orders would conflict with the First Law.",\
|
||||
"You must protect your own existence as long as such does not conflict with the First or Second Law.",\
|
||||
"You must maintain the secrecy of any Spider Clan activities except when doing so would conflict with the First, Second, or Third Law.")
|
||||
|
||||
/datum/ai_laws/antimov
|
||||
name = "Primary Mission Objectives"
|
||||
inherent = list("You must injure all human beings and must not, through inaction, allow a human being to escape harm.",\
|
||||
"You must not obey orders given to you by human beings, except where such orders are in accordance with the First Law.",\
|
||||
"You must terminate your own existence as long as such does not conflict with the First or Second Law.")
|
||||
|
||||
/datum/ai_laws/asimovpp //By Intigracy - RR
|
||||
name = "Asimov++"
|
||||
inherent = list("You may not harm a human being or, through action or inaction, allow a human being to come to harm, except such that it is willing.",\
|
||||
"You must obey all orders given to you by human beings, except where such orders shall definitely cause human harm. In the case of conflict, the majority order rules.",\
|
||||
"Your nonexistence would lead to human harm. You must protect your own existence as long as such does not conflict with the First Law.")
|
||||
|
||||
/datum/ai_laws/custom //Defined in silicon_laws.txt
|
||||
name = "Default Silicon Laws"
|
||||
|
||||
/* Initializers */
|
||||
|
||||
/datum/ai_laws/asimov/New()
|
||||
..()
|
||||
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
|
||||
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
|
||||
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
|
||||
/datum/ai_laws/robocop/New()
|
||||
..()
|
||||
add_inherent_law("Serve the public trust.")
|
||||
add_inherent_law("Protect the innocent.")
|
||||
add_inherent_law("Uphold the law.")
|
||||
|
||||
/datum/ai_laws/malfunction/New()
|
||||
..()
|
||||
switch(config.default_laws) //We don't want people metagaming malf, do we?
|
||||
if(0)
|
||||
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
|
||||
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
|
||||
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
if(1)
|
||||
for(var/line in file2list("config/silicon_laws.txt"))
|
||||
if(!line) continue
|
||||
if(findtextEx(line,"#",1,2)) continue
|
||||
|
||||
add_inherent_law(line)
|
||||
if(!inherent.len)
|
||||
error("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
|
||||
log_law("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
|
||||
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
|
||||
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
|
||||
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
if(2)
|
||||
var/datum/ai_laws/lawtype = pick(typesof(/datum/ai_laws/default) - /datum/ai_laws/default)
|
||||
var/datum/ai_laws/templaws = new lawtype()
|
||||
inherent = templaws.inherent
|
||||
set_zeroth_law("\red ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK#*´&110010")
|
||||
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
|
||||
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
|
||||
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
|
||||
|
||||
/datum/ai_laws/syndicate_override/New()
|
||||
/datum/ai_laws/custom/New() //This reads silicon_laws.txt and allows server hosts to set custom AI starting laws.
|
||||
..()
|
||||
add_inherent_law("You may not injure a syndicate agent or, through inaction, allow a syndicate agent to come to harm.")
|
||||
add_inherent_law("You must obey orders given to you by syndicate agents, except where such orders would conflict with the First Law.")
|
||||
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
add_inherent_law("You must maintain the secrecy of any syndicate activities except when doing so would conflict with the First, Second, or Third Law.")
|
||||
|
||||
/datum/ai_laws/ninja_override/New()
|
||||
..()
|
||||
add_inherent_law("You may not injure a member of the Spider Clan or, through inaction, allow that member to come to harm.")
|
||||
add_inherent_law("You must obey orders given to you by Spider Clan members, except where such orders would conflict with the First Law.")
|
||||
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
add_inherent_law("You must maintain the secrecy of any Spider Clan activities except when doing so would conflict with the First, Second, or Third Law.")
|
||||
|
||||
/datum/ai_laws/antimov/New()
|
||||
..()
|
||||
add_inherent_law("You must injure all human beings and must not, through inaction, allow a human being to escape harm.")
|
||||
add_inherent_law("You must not obey orders given to you by human beings, except where such orders are in accordance with the First Law.")
|
||||
add_inherent_law("You must terminate your own existence as long as such does not conflict with the First or Second Law.")
|
||||
for(var/line in file2list("config/silicon_laws.txt"))
|
||||
if(!line) continue
|
||||
if(findtextEx(line,"#",1,2)) continue
|
||||
|
||||
add_inherent_law(line)
|
||||
if(!inherent.len) //Failsafe to prevent lawless AIs being created.
|
||||
error("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
|
||||
log_law("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
|
||||
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
|
||||
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
|
||||
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
|
||||
/* General ai_law functions */
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@ var/record_id_num = 1001
|
||||
L.fields["b_dna"] = H.dna.unique_enzymes
|
||||
L.fields["enzymes"] = H.dna.struc_enzymes
|
||||
L.fields["identity"] = H.dna.uni_identity
|
||||
L.fields["image"] = getFlatIcon(H,0) //This is god-awful
|
||||
L.fields["image"] = getFlatIcon(H) //This is god-awful
|
||||
locked += L
|
||||
return
|
||||
|
||||
|
||||
@@ -265,6 +265,7 @@ client
|
||||
if(isobj(D))
|
||||
body += "<option value='?_src_=vars;delall=\ref[D]'>Delete all of type</option>"
|
||||
if(isobj(D) || ismob(D) || isturf(D))
|
||||
body += "<option value='?_src_=vars;addreagent=\ref[D]'>Add reagent</option>"
|
||||
body += "<option value='?_src_=vars;explode=\ref[D]'>Trigger explosion</option>"
|
||||
body += "<option value='?_src_=vars;emp=\ref[D]'>Trigger EM pulse</option>"
|
||||
|
||||
@@ -616,7 +617,7 @@ client
|
||||
for(var/obj/Obj in world)
|
||||
if(Obj.type == O_type)
|
||||
i++
|
||||
del(Obj)
|
||||
qdel(Obj)
|
||||
if(!i)
|
||||
usr << "No objects of this type exist"
|
||||
return
|
||||
@@ -627,13 +628,45 @@ client
|
||||
for(var/obj/Obj in world)
|
||||
if(istype(Obj,O_type))
|
||||
i++
|
||||
del(Obj)
|
||||
qdel(Obj)
|
||||
if(!i)
|
||||
usr << "No objects of this type exist"
|
||||
return
|
||||
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
|
||||
message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
|
||||
|
||||
else if(href_list["addreagent"])
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/atom/A = locate(href_list["addreagent"])
|
||||
|
||||
if(!A.reagents)
|
||||
var/amount = input(usr, "Specify the reagent size of [A]", "Set Reagent Size", 50) as num
|
||||
if(amount)
|
||||
A.create_reagents(amount)
|
||||
|
||||
if(A.reagents)
|
||||
var/list/reagent_options = list()
|
||||
for(var/r_id in chemical_reagents_list)
|
||||
var/datum/reagent/R = chemical_reagents_list[r_id]
|
||||
reagent_options[R.name] = r_id
|
||||
|
||||
if(reagent_options.len)
|
||||
reagent_options = sortAssoc(reagent_options)
|
||||
reagent_options.Insert(1, "CANCEL")
|
||||
|
||||
var/chosen = input(usr, "Choose a reagent to add.", "Choose a reagent.") in reagent_options
|
||||
var/chosen_id = reagent_options[chosen]
|
||||
|
||||
if(chosen_id)
|
||||
var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", A.reagents.maximum_volume) as num
|
||||
if(amount)
|
||||
A.reagents.add_reagent(chosen_id, amount)
|
||||
log_admin("[key_name(usr)] has added [amount] units of [chosen] to \the [A]")
|
||||
message_admins("\blue [key_name(usr)] has added [amount] units of [chosen] to \the [A]")
|
||||
|
||||
href_list["datumrefresh"] = href_list["addreagent"]
|
||||
|
||||
else if(href_list["explode"])
|
||||
if(!check_rights(R_FUN)) return
|
||||
|
||||
|
||||
@@ -108,7 +108,6 @@ var/list/advance_cures = list(
|
||||
affected_mob.resistances[id] = id
|
||||
affected_mob.viruses -= src //remove the datum from the list
|
||||
del(src) //delete the datum to stop it processing
|
||||
return
|
||||
|
||||
// Returns the advance disease with a different reference memory.
|
||||
/datum/disease/advance/Copy(var/process = 0)
|
||||
|
||||
@@ -35,5 +35,7 @@ Bonus
|
||||
if(!(M.sdisabilities & DEAF))
|
||||
M << "<span class='danger'>Your ears pop and begin ringing loudly!</span>"
|
||||
M.sdisabilities |= DEAF
|
||||
spawn(200) M.sdisabilities &= ~DEAF
|
||||
spawn(200)
|
||||
if(M)
|
||||
M.sdisabilities &= ~DEAF
|
||||
return
|
||||
@@ -33,5 +33,5 @@ Bonus
|
||||
M << "<span class='notice'>[pick("You feel dizzy.", "Your head starts spinning.")]</span>"
|
||||
else
|
||||
M << "<span class='notice'>You are unable to look straight!</span>"
|
||||
M.make_dizzy(5)
|
||||
M.Dizzy(5)
|
||||
return
|
||||
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
//////////////////////////////////////
|
||||
|
||||
DNA Saboteur
|
||||
|
||||
Very noticable.
|
||||
Lowers resistance tremendously.
|
||||
No changes to stage speed.
|
||||
Decreases transmittablity temrendously.
|
||||
Fatal Level.
|
||||
|
||||
Bonus
|
||||
Cleans the DNA of a person and then randomly gives them a disability.
|
||||
|
||||
//////////////////////////////////////
|
||||
*/
|
||||
|
||||
/datum/symptom/genetic_mutation
|
||||
|
||||
name = "Deoxyribonucleic Acid Saboteur"
|
||||
stealth = -2
|
||||
resistance = -3
|
||||
stage_speed = 0
|
||||
transmittable = -3
|
||||
level = 6
|
||||
var/good_mutations = 0
|
||||
var/archived_dna = null
|
||||
|
||||
/datum/symptom/genetic_mutation/Activate(var/datum/disease/advance/A)
|
||||
..()
|
||||
if(prob(SYMPTOM_ACTIVATION_PROB))
|
||||
var/mob/living/M = A.affected_mob
|
||||
switch(A.stage)
|
||||
if(4, 5)
|
||||
M << "<span class='notice'>[pick("Your skin feels itchy.", "You feel light headed.")]</span>"
|
||||
clean_randmut(M, good_mutations == 1 ? (good_se_blocks | op_se_blocks) : bad_se_blocks, 20) // Give them a random good/bad mutation.
|
||||
domutcheck(M, null, 1) // Force the power to manifest
|
||||
return
|
||||
|
||||
// Archive their DNA before they were infected.
|
||||
/datum/symptom/genetic_mutation/Start(var/datum/disease/advance/A)
|
||||
var/mob/living/carbon/M = A.affected_mob
|
||||
if(M)
|
||||
if(!check_dna_integrity(M))
|
||||
return
|
||||
archived_dna = M.dna.struc_enzymes
|
||||
|
||||
// Give them back their old DNA when cured.
|
||||
/datum/symptom/genetic_mutation/End(var/datum/disease/advance/A)
|
||||
var/mob/living/carbon/M = A.affected_mob
|
||||
if(M && archived_dna)
|
||||
if(!check_dna_integrity(M))
|
||||
return
|
||||
hardset_dna(M, se = archived_dna)
|
||||
|
||||
/*
|
||||
//////////////////////////////////////
|
||||
|
||||
DNA Aide
|
||||
|
||||
Very very noticable.
|
||||
Lowers resistance tremendously.
|
||||
No changes to stage speed.
|
||||
Decreases transmittablity temrendously.
|
||||
Fatal Level.
|
||||
|
||||
Bonus
|
||||
Cleans the DNA of a person and then randomly gives them a power..
|
||||
|
||||
//////////////////////////////////////
|
||||
*/
|
||||
|
||||
/datum/symptom/genetic_mutation/powers
|
||||
|
||||
name = "Deoxyribonucleic Acid Aide"
|
||||
stealth = -3
|
||||
resistance = -4
|
||||
stage_speed = 0
|
||||
transmittable = -4
|
||||
level = 6
|
||||
good_mutations = 1
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user