Merge branch 'master' into client-hud-consistency

This commit is contained in:
mochi
2020-07-13 10:31:00 +02:00
117 changed files with 37237 additions and 281148 deletions
+2
View File
@@ -25,6 +25,8 @@
#define ORE_LEVEL "Mining"
// Levels the AI can control bots on
#define AI_OK "AI Allowed"
/// Ruins will spawn on this z-level
#define SPAWN_RUINS "Spawn Ruins"
// Level names
#define MAIN_STATION "Main Station"
+3 -15
View File
@@ -5,31 +5,19 @@ Old code checked for the number of the z-level (for example whether there are an
currently it should check for the define (for example whether there are any revheads on any z-levels defined as STATION_LEVEL).
z1 = station
z2 = centcomm
z3 = telecommunications center
z4 = engineering ship
z5 = mining
z6 = russian derelict
z7 = empty
z3 = engineering stuff (called Z4, dont question it)
z4 = lavaland
*/
#if !defined(USING_MAP_DATUM)
#include "map_files\cyberiad\cyberiad.dmm"
#include "map_files\cyberiad\z2.dmm"
#include "map_files\generic\tcommsat-blown.dmm"
#include "map_files\generic\z4.dmm"
#include "map_files\generic\Lavaland.dmm"
#include "map_files\cyberiad\z6.dmm"
#include "map_files\generic\z7.dmm"
#define MAP_TRANSITION_CONFIG list(\
DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\
DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\
DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)))
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)))
#define USING_MAP_DATUM /datum/map/cyberiad
#elif !defined(MAP_OVERRIDE)
+3 -14
View File
@@ -5,11 +5,8 @@ Old code checked for the number of the z-level (for example whether there are an
currently it should check for the define (for example whether there are any revheads on any z-levels defined as STATION_LEVEL).
z1 = station
z2 = centcomm
z3 = telecommunications center
z4 = engineering ship
z5 = mining
z6 = russian derelict
z7 = empty
z3 = space (empty)
z4 = lavaland
Original design by Okand37 of TG Station
Lovingly ported by Purpose2 to Paradise
@@ -18,22 +15,14 @@ Lovingly ported by Purpose2 to Paradise
#if !defined(USING_MAP_DATUM)
#include "map_files\delta\delta.dmm"
#include "map_files\cyberiad\z2.dmm"
#include "map_files\generic\tcommsat-blown.dmm"
#include "map_files\generic\z4.dmm"
#include "map_files\generic\Lavaland.dmm"
#include "map_files\cyberiad\z6.dmm"
#include "map_files\generic\z7.dmm"
#define MAP_FILE "delta.dmm"
#define MAP_NAME "Kerberos"
#define MAP_TRANSITION_CONFIG list(\
DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\
DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\
DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)))
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)))
#define USING_MAP_DATUM /datum/map/delta
File diff suppressed because it is too large Load Diff
@@ -58653,7 +58653,7 @@
},
/area/crew_quarters/kitchen)
"bXn" = (
/obj/machinery/icecream_vat,
/obj/machinery/icemachine,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 10
},
@@ -96666,6 +96666,15 @@
icon_state = "dark"
},
/area/space/nearstation)
"sDC" = (
/obj/docking_port/stationary/whiteship{
dir = 8;
icon_state = "pinonfar";
id = "whiteship_cerebron";
name = "North of Cerebron"
},
/turf/space,
/area/space)
"sJe" = (
/obj/structure/window/reinforced{
dir = 4
@@ -128710,7 +128719,7 @@ aaa
aaa
aaa
aaa
aaa
sDC
aaa
aaa
aaa
@@ -112,7 +112,7 @@
dir = 1
},
/obj/item/flashlight/lantern,
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"av" = (
/obj/structure/stone_tile/block,
@@ -122,7 +122,7 @@
/obj/structure/stone_tile{
dir = 4
},
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"aw" = (
/obj/structure/stone_tile/block,
@@ -133,7 +133,7 @@
dir = 4
},
/obj/effect/decal/cleanable/blood,
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"ax" = (
/obj/structure/stone_tile/block,
@@ -143,7 +143,7 @@
/obj/structure/stone_tile{
dir = 4
},
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"ay" = (
/obj/structure/stone_tile,
@@ -157,7 +157,7 @@
dir = 8
},
/obj/item/flashlight/lantern,
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"az" = (
/obj/structure/stone_tile/block{
@@ -214,7 +214,7 @@
/obj/structure/stone_tile{
dir = 8
},
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"aH" = (
/obj/structure/stone_tile/surrounding_tile/cracked,
@@ -251,7 +251,7 @@
},
/obj/structure/stone_tile,
/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck,
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"aM" = (
/obj/structure/stone_tile/cracked{
@@ -307,7 +307,7 @@
dir = 4
},
/obj/effect/decal/cleanable/blood,
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"aT" = (
/obj/structure/stone_tile/block/cracked{
@@ -333,7 +333,7 @@
/obj/structure/stone_tile{
dir = 1
},
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"aY" = (
/obj/structure/stone_tile,
@@ -381,7 +381,7 @@
dir = 4
},
/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen,
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"bd" = (
/obj/structure/stone_tile/surrounding_tile/cracked{
@@ -421,7 +421,7 @@
dir = 1
},
/obj/structure/stone_tile,
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"bh" = (
/obj/structure/stone_tile/block{
@@ -519,7 +519,7 @@
dir = 4
},
/obj/item/flashlight/lantern,
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"bq" = (
/obj/structure/stone_tile/block{
@@ -529,11 +529,11 @@
/obj/structure/stone_tile{
dir = 8
},
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"br" = (
/obj/structure/stone_tile/slab/cracked,
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"bs" = (
/obj/structure/stone_tile/block/cracked{
@@ -544,7 +544,7 @@
},
/obj/structure/stone_tile,
/obj/effect/decal/cleanable/blood,
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"bt" = (
/obj/structure/stone_tile,
@@ -558,7 +558,7 @@
dir = 4
},
/obj/item/flashlight/lantern,
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"bv" = (
/obj/structure/stone_tile/cracked{
@@ -632,7 +632,7 @@
/obj/structure/stone_tile/block/cracked{
dir = 8
},
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"bC" = (
/obj/structure/stone_tile/block/cracked{
@@ -672,7 +672,7 @@
},
/obj/structure/fans/tiny/invisible,
/obj/effect/decal/cleanable/blood,
/turf/simulated/floor/indestructible/boss/air,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"bI" = (
/obj/structure/stone_tile/slab/cracked,
@@ -95,6 +95,7 @@
/area/ruin/unpowered)
"p" = (
/obj/machinery/door/airlock/hatch,
/obj/structure/fans/tiny/invisible,
/turf/simulated/floor/plating,
/area/ruin/unpowered)
"q" = (
@@ -77,6 +77,7 @@
/area/ruin/powered/pride)
"Y" = (
/obj/machinery/door/airlock/diamond,
/obj/structure/fans/tiny/invisible,
/turf/simulated/floor/mineral/silver{
blocks_air = 1
},
@@ -20,6 +20,7 @@
/area/ruin/unpowered)
"e" = (
/obj/machinery/door/airlock/wood,
/obj/structure/fans/tiny/invisible,
/turf/simulated/floor/sepia{
blocks_air = 0;
slowdown = 10
@@ -103,6 +103,7 @@
"t" = (
/obj/machinery/door/airlock/survival_pod/glass,
/obj/effect/decal/cleanable/blood/tracks,
/obj/structure/fans/tiny,
/turf/simulated/floor/pod/dark,
/area/ruin/powered)
"v" = (
@@ -0,0 +1,311 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/template_noop)
"b" = (
/turf/simulated/wall/r_wall,
/area/AIsattele)
"c" = (
/obj/structure/lattice,
/turf/template_noop,
/area/space/nearstation)
"d" = (
/obj/structure/computerframe,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"e" = (
/obj/machinery/teleport/station,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"f" = (
/obj/machinery/teleport/hub,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"g" = (
/obj/item/shard{
icon_state = "medium"
},
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"h" = (
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"i" = (
/obj/structure/rack,
/obj/item/clothing/gloves/color/yellow,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"j" = (
/obj/effect/spawner/window/reinforced{
useFull = 0
},
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"k" = (
/obj/item/stock_parts/cell,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"l" = (
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"m" = (
/obj/effect/decal/cleanable/blood/gibs/robot,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"n" = (
/obj/machinery/atmospherics/unary/tank/oxygen_agent_b,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"o" = (
/obj/machinery/door/airlock/external,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"p" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/flashlight,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"q" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/radio/beacon,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"r" = (
/obj/machinery/atmospherics/unary/portables_connector{
dir = 1
},
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"s" = (
/obj/machinery/portable_atmospherics/canister/air,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"t" = (
/obj/effect/decal/cleanable/blood/old,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"u" = (
/obj/effect/decal/cleanable/blood/oil,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"v" = (
/obj/item/shard,
/obj/item/apc_electronics,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"w" = (
/obj/structure/closet,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"x" = (
/obj/item/storage/toolbox/electrical{
pixel_x = 1;
pixel_y = -1
},
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"y" = (
/obj/structure/closet/crate,
/obj/item/aicard,
/obj/item/multitool,
/obj/item/weldingtool,
/obj/item/wrench,
/obj/item/circuitboard/teleporter,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"z" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
"A" = (
/obj/structure/lattice,
/turf/template_noop,
/area/AIsattele)
"B" = (
/obj/structure/girder,
/turf/simulated/floor/plating/airless,
/area/AIsattele)
(1,1,1) = {"
a
a
a
a
c
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
a
c
a
c
a
c
a
a
a
a
a
"}
(3,1,1) = {"
a
a
c
j
o
j
c
a
a
a
a
a
"}
(4,1,1) = {"
a
c
c
j
h
j
c
c
a
a
a
a
"}
(5,1,1) = {"
a
c
b
b
o
b
b
c
a
a
a
a
"}
(6,1,1) = {"
a
b
b
h
h
s
b
b
a
a
a
a
"}
(7,1,1) = {"
b
b
g
k
p
t
h
b
b
c
a
a
"}
(8,1,1) = {"
b
d
h
l
m
h
h
y
b
c
c
a
"}
(9,1,1) = {"
b
e
h
h
q
u
l
h
A
c
a
c
"}
(10,1,1) = {"
b
f
h
m
h
h
h
z
h
a
a
c
"}
(11,1,1) = {"
b
b
i
l
h
v
x
b
B
c
a
a
"}
(12,1,1) = {"
c
b
b
n
r
w
b
b
c
a
a
a
"}
(13,1,1) = {"
a
a
b
b
b
b
b
a
a
a
a
a
"}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,918 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/template_noop)
"b" = (
/turf/template_noop,
/turf/simulated/shuttle/wall{
dir = 2;
icon_state = "swall_f6";
tag = "icon-swall_f6"
},
/area/space/nearstation)
"c" = (
/obj/structure/shuttle/engine/heater{
tag = "icon-heater (NORTH)";
icon_state = "heater";
dir = 1
},
/obj/structure/window/reinforced,
/turf/simulated/shuttle/plating,
/area/space/nearstation)
"d" = (
/turf/template_noop,
/turf/simulated/shuttle/wall{
tag = "icon-swall_f10";
icon_state = "swall_f10";
dir = 2
},
/area/space/nearstation)
"e" = (
/obj/machinery/door/unpowered/shuttle,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"f" = (
/obj/item/broken_bottle,
/obj/effect/mob_spawn/human/mime/corpse,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"g" = (
/obj/item/shard,
/obj/effect/mob_spawn/human/mime/corpse,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"h" = (
/obj/item/shard{
icon_state = "medium"
},
/obj/effect/mob_spawn/human/mime/corpse,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"i" = (
/turf/simulated/shuttle/wall{
tag = "icon-swall11";
icon_state = "swall11";
dir = 2
},
/area/space/nearstation)
"j" = (
/obj/structure/closet/crate,
/obj/item/stack/ore/tranquillite,
/obj/item/stack/ore/tranquillite,
/obj/item/stack/ore/tranquillite,
/obj/item/stack/ore/tranquillite,
/obj/item/stack/ore/tranquillite,
/obj/item/stack/ore/tranquillite,
/obj/item/stack/ore/tranquillite,
/obj/item/stack/ore/tranquillite,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"k" = (
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"l" = (
/turf/simulated/shuttle/wall{
icon_state = "swall7";
dir = 2
},
/area/space/nearstation)
"m" = (
/turf/simulated/mineral,
/area/space/nearstation)
"n" = (
/turf/simulated/floor/plating/asteroid/airless,
/area/space/nearstation)
"o" = (
/turf/simulated/floor/plating/asteroid/airless,
/turf/simulated/shuttle/wall{
icon_state = "swall_f5";
dir = 2
},
/area/space/nearstation)
"p" = (
/obj/item/shard{
icon_state = "small"
},
/turf/simulated/floor/plating/asteroid/airless,
/area/space/nearstation)
"q" = (
/obj/structure/closet/crate,
/obj/item/stack/ore/tranquillite,
/obj/item/stack/ore/tranquillite,
/obj/item/stack/ore/tranquillite,
/obj/item/stack/ore/tranquillite,
/obj/item/stack/ore/tranquillite,
/obj/item/stack/ore/tranquillite,
/obj/item/stack/ore/tranquillite,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"r" = (
/turf/template_noop,
/turf/simulated/shuttle/wall{
tag = "icon-swall_f9";
icon_state = "swall_f9";
dir = 2
},
/area/space/nearstation)
"s" = (
/obj/item/shard,
/turf/simulated/floor/plating/asteroid/airless,
/area/space/nearstation)
"t" = (
/obj/effect/mob_spawn/human/mime/corpse{
name = "Mime Pilot"
},
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"u" = (
/turf/simulated/shuttle/wall{
icon_state = "swall3";
dir = 2
},
/area/space/nearstation)
"v" = (
/turf/simulated/shuttle/wall{
tag = "icon-swall12";
icon_state = "swall12";
dir = 2
},
/area/space/nearstation)
"w" = (
/turf/simulated/floor/plating/asteroid/airless,
/turf/simulated/shuttle/wall{
tag = "icon-swall_f9";
icon_state = "swall_f9";
dir = 2
},
/area/space/nearstation)
"x" = (
/obj/effect/mob_spawn/human/clown/corpse,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"y" = (
/obj/structure/closet/crate,
/obj/item/stack/ore/bananium,
/obj/item/stack/ore/bananium,
/obj/item/stack/ore/bananium,
/obj/item/stack/ore/bananium,
/obj/item/stack/ore/bananium,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"z" = (
/obj/structure/closet/crate{
icon_state = "crateopen";
opened = 1
},
/obj/item/stack/ore/bananium,
/obj/item/grenade/bananade,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"A" = (
/obj/structure/shuttle/engine/heater{
tag = "icon-heater (EAST)";
icon_state = "heater";
dir = 4
},
/obj/structure/window/reinforced{
dir = 8
},
/turf/simulated/shuttle/plating,
/area/space/nearstation)
"B" = (
/obj/structure/shuttle/engine/propulsion{
dir = 4;
icon_state = "propulsion_l";
tag = "icon-propulsion_l (WEST)"
},
/obj/structure/shuttle/engine/propulsion{
dir = 4;
icon_state = "burst_r";
tag = "icon-burst_r (WEST)"
},
/turf/simulated/shuttle/plating,
/area/space/nearstation)
"C" = (
/obj/effect/mob_spawn/human/corpse/clownmili,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"D" = (
/obj/item/stack/ore/bananium,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"E" = (
/obj/structure/shuttle/engine/propulsion{
dir = 4;
icon_state = "propulsion_l";
tag = "icon-propulsion_l (WEST)"
},
/turf/simulated/shuttle/plating,
/area/space/nearstation)
"F" = (
/obj/structure/computerframe/HONKputer,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"G" = (
/obj/item/shard{
icon_state = "medium"
},
/obj/structure/chair/comfy/shuttle{
dir = 8
},
/turf/simulated/floor/plating/asteroid/airless,
/area/space/nearstation)
"H" = (
/obj/effect/mob_spawn/human/clown/corpse{
name = "Clown Pilot"
},
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"I" = (
/obj/item/paper/clownship,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"J" = (
/obj/structure/grille,
/obj/structure/window/reinforced,
/obj/structure/window/reinforced{
dir = 8
},
/obj/structure/window/reinforced{
dir = 4
},
/turf/simulated/floor/plating/airless,
/area/space/nearstation)
"K" = (
/obj/item/shard,
/obj/structure/chair/comfy/shuttle{
dir = 8
},
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"L" = (
/obj/item/shard{
icon_state = "medium"
},
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"M" = (
/turf/simulated/mineral/random/labormineral,
/turf/simulated/shuttle/wall{
tag = "icon-swall_f5";
icon_state = "swall_f5";
dir = 2
},
/area/space/nearstation)
"N" = (
/turf/simulated/floor/plasteel/airless,
/turf/simulated/shuttle/wall{
tag = "icon-swall_f10";
icon_state = "swall_f10";
dir = 2
},
/area/space/nearstation)
"O" = (
/obj/effect/mob_spawn/human/corpse/clownoff,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"P" = (
/obj/item/pickaxe,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"Q" = (
/obj/structure/closet/crate,
/obj/item/stack/ore/bananium,
/obj/item/stack/ore/bananium,
/obj/item/stack/ore/bananium,
/obj/item/stack/ore/bananium,
/turf/simulated/floor/plasteel/airless,
/area/space/nearstation)
"R" = (
/obj/structure/shuttle/engine/propulsion{
dir = 4;
icon_state = "propulsion_l";
tag = "icon-propulsion_l (WEST)"
},
/obj/structure/shuttle/engine/propulsion{
dir = 4;
icon_state = "propulsion_l";
tag = "icon-propulsion_l (WEST)"
},
/turf/simulated/shuttle/plating,
/area/space/nearstation)
(1,1,1) = {"
a
a
a
a
m
m
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
a
a
m
m
m
m
m
a
a
a
a
a
a
m
m
a
a
a
a
"}
(3,1,1) = {"
a
a
a
m
m
m
m
m
m
a
m
m
m
m
m
m
a
a
a
a
"}
(4,1,1) = {"
a
a
a
a
m
m
m
m
m
m
m
m
m
m
m
a
a
a
a
a
"}
(5,1,1) = {"
a
a
a
a
a
m
m
m
m
m
m
m
m
m
m
m
m
m
m
a
"}
(6,1,1) = {"
a
a
a
a
a
m
m
m
m
m
m
m
m
m
m
m
m
m
a
a
"}
(7,1,1) = {"
a
a
a
a
m
m
m
m
m
m
m
m
m
m
m
m
m
a
a
a
"}
(8,1,1) = {"
a
a
a
n
m
m
m
m
m
m
m
m
m
m
m
m
m
a
a
a
"}
(9,1,1) = {"
a
a
b
o
m
m
m
m
m
m
m
m
m
m
m
m
n
a
a
a
"}
(10,1,1) = {"
b
e
i
i
m
m
m
m
m
m
m
m
m
m
m
n
n
a
a
a
"}
(11,1,1) = {"
c
f
j
p
m
m
m
m
m
m
m
m
m
m
m
n
n
n
a
a
"}
(12,1,1) = {"
c
g
k
q
s
n
m
m
m
m
m
m
m
m
m
m
m
n
n
a
"}
(13,1,1) = {"
c
h
j
q
t
n
m
m
m
m
m
m
m
m
m
m
m
m
m
a
"}
(14,1,1) = {"
d
e
l
l
u
m
m
n
m
m
m
m
m
m
m
m
m
n
m
a
"}
(15,1,1) = {"
a
a
d
r
m
m
m
n
n
m
m
m
m
m
m
m
m
m
m
m
"}
(16,1,1) = {"
a
a
a
a
m
a
a
a
b
m
m
J
M
m
m
m
m
m
m
m
"}
(17,1,1) = {"
a
a
a
a
a
a
a
a
v
m
F
k
v
m
m
m
m
n
m
m
"}
(18,1,1) = {"
a
a
a
a
a
a
a
b
w
m
G
K
N
M
m
m
m
n
m
m
"}
(19,1,1) = {"
a
a
a
a
a
a
a
v
n
p
H
k
O
v
m
m
m
n
n
n
"}
(20,1,1) = {"
a
a
a
a
a
a
a
v
x
C
k
L
P
v
m
m
m
a
a
a
"}
(21,1,1) = {"
a
a
a
a
a
a
a
e
k
k
I
k
k
e
m
m
a
a
a
a
"}
(22,1,1) = {"
a
a
a
a
a
a
a
e
k
k
D
x
k
e
m
m
a
a
a
a
"}
(23,1,1) = {"
a
a
a
a
a
a
a
v
y
k
k
k
Q
v
m
a
a
a
a
a
"}
(24,1,1) = {"
a
a
a
a
a
a
a
v
y
k
D
k
y
v
m
a
a
a
a
a
"}
(25,1,1) = {"
a
a
a
a
a
a
a
v
z
D
k
k
y
v
m
a
a
a
a
a
"}
(26,1,1) = {"
a
a
a
a
a
a
a
v
k
k
D
D
k
v
a
a
a
a
a
a
"}
(27,1,1) = {"
a
a
a
a
a
a
a
d
A
A
A
A
A
r
a
a
a
a
a
a
"}
(28,1,1) = {"
a
a
a
a
a
a
a
a
B
E
E
E
R
a
a
a
a
a
a
a
"}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,386 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/template_noop)
"b" = (
/turf/simulated/mineral,
/area/space/nearstation)
"c" = (
/obj/machinery/floodlight{
in_use = 1
},
/turf/simulated/floor/plating,
/area/exploration/methlab)
"d" = (
/obj/structure/closet/crate,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"e" = (
/obj/structure/closet,
/obj/item/clothing/head/bio_hood,
/obj/item/clothing/suit/bio_suit,
/obj/item/clothing/gloves/color/black,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"f" = (
/obj/effect/decal/cleanable/blood/drip,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"g" = (
/obj/effect/decal/cleanable/blood,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"h" = (
/obj/machinery/door/airlock/external{
name = "Crackden Airlock"
},
/turf/simulated/floor/plating,
/area/exploration/methlab)
"i" = (
/obj/item/grenade/chem_grenade/drugs,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"j" = (
/turf/simulated/floor/plating,
/area/exploration/methlab)
"k" = (
/obj/machinery/door/airlock/external{
name = "Plain Airlock"
},
/turf/simulated/floor/plating,
/area/exploration/methlab)
"l" = (
/obj/structure/table,
/obj/item/reagent_containers/food/snacks/chips,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"m" = (
/obj/item/ammo_casing{
pixel_y = 3
},
/turf/simulated/floor/plating,
/area/exploration/methlab)
"n" = (
/obj/effect/decal/cleanable/blood/oil,
/obj/item/ammo_casing{
pixel_x = -4;
pixel_y = -6
},
/turf/simulated/floor/plating,
/area/exploration/methlab)
"o" = (
/obj/structure/table,
/obj/item/reagent_containers/glass/beaker/drugs/meth,
/obj/item/reagent_containers/glass/beaker/drugs/meth,
/obj/item/reagent_containers/glass/beaker/drugs/meth,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"p" = (
/obj/structure/cable{
icon_state = "0-2";
pixel_y = 1;
d2 = 2
},
/obj/machinery/power/apc{
dir = 4;
layer = 5;
name = "east bump";
pixel_x = 24
},
/turf/simulated/floor/plating,
/area/exploration/methlab)
"q" = (
/obj/machinery/floodlight,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"r" = (
/obj/machinery/chem_master,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"s" = (
/obj/effect/decal/cleanable/blood/oil,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"t" = (
/obj/machinery/power/port_gen/pacman,
/obj/structure/cable,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"u" = (
/obj/machinery/chem_dispenser,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"v" = (
/obj/structure/chair,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"w" = (
/obj/machinery/chem_heater,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"x" = (
/obj/machinery/portable_atmospherics/canister/air,
/turf/simulated/floor/plating,
/area/exploration/methlab)
"y" = (
/obj/structure/table,
/obj/machinery/kitchen_machine/microwave,
/turf/simulated/floor/plating,
/area/exploration/methlab)
(1,1,1) = {"
a
a
a
a
a
a
b
b
b
b
a
a
a
a
"}
(2,1,1) = {"
a
a
a
a
b
b
b
b
b
b
a
a
a
a
"}
(3,1,1) = {"
a
a
a
b
b
b
b
b
b
b
b
a
a
a
"}
(4,1,1) = {"
a
a
a
b
b
l
o
r
u
w
b
a
a
a
"}
(5,1,1) = {"
a
a
a
b
c
i
j
j
v
j
b
b
b
b
"}
(6,1,1) = {"
a
a
b
b
d
j
j
s
j
j
y
b
b
b
"}
(7,1,1) = {"
a
a
b
b
e
j
p
t
b
b
b
b
b
a
"}
(8,1,1) = {"
a
b
b
b
f
m
b
b
b
b
b
a
a
a
"}
(9,1,1) = {"
b
b
b
b
f
n
j
i
j
x
b
a
a
a
"}
(10,1,1) = {"
b
b
b
b
g
i
j
j
j
x
b
a
a
a
"}
(11,1,1) = {"
a
a
b
b
h
b
q
b
b
b
b
a
a
a
"}
(12,1,1) = {"
a
a
b
b
i
b
b
b
b
a
a
a
a
a
"}
(13,1,1) = {"
a
b
b
b
j
b
b
b
b
a
a
a
a
a
"}
(14,1,1) = {"
a
b
b
b
k
b
b
b
a
a
a
a
a
a
"}
(15,1,1) = {"
a
a
b
b
a
a
b
a
a
a
a
a
a
a
"}
(16,1,1) = {"
a
a
a
b
a
a
a
a
a
a
a
a
a
a
"}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,473 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/template_noop)
"b" = (
/obj/structure/lattice,
/turf/template_noop,
/area/space/nearstation)
"c" = (
/obj/item/stack/cable_coil/cut{
amount = 1
},
/turf/template_noop,
/area/space/nearstation)
"d" = (
/obj/item/shard,
/turf/template_noop,
/area/space/nearstation)
"e" = (
/obj/structure/lattice,
/obj/item/shard{
icon_state = "small"
},
/turf/template_noop,
/area/space/nearstation)
"f" = (
/turf/simulated/floor/plating/airless,
/area/derelict/teleporter)
"g" = (
/turf/simulated/wall,
/area/derelict/teleporter)
"h" = (
/obj/structure/grille,
/obj/structure/window/reinforced{
dir = 5;
max_integrity = 1e+007
},
/turf/simulated/floor/plating/airless,
/area/derelict/teleporter)
"i" = (
/obj/structure/grille{
density = 0;
icon_state = "brokengrille"
},
/turf/simulated/floor/plating/airless,
/area/derelict/teleporter)
"j" = (
/turf/simulated/wall/rust,
/area/derelict/teleporter)
"k" = (
/obj/structure/girder,
/turf/simulated/floor/plating/airless,
/area/derelict/teleporter)
"l" = (
/obj/item/rack_parts,
/turf/simulated/floor/plating/airless,
/area/derelict/teleporter)
"m" = (
/turf/simulated/floor/plasteel/airless{
icon_state = "floorgrime"
},
/area/derelict/teleporter)
"n" = (
/obj/effect/landmark/damageturf,
/obj/item/shard{
icon_state = "small"
},
/turf/simulated/floor/plasteel/airless{
icon_state = "floorgrime"
},
/area/derelict/teleporter)
"o" = (
/obj/machinery/light_construct/small{
dir = 1
},
/obj/effect/landmark/damageturf,
/obj/structure/filingcabinet/chestdrawer,
/turf/simulated/floor/plasteel/airless{
dir = 8;
icon_state = "green"
},
/area/derelict/teleporter)
"p" = (
/obj/machinery/light_construct/small{
dir = 4
},
/obj/machinery/atmospherics/unary/portables_connector{
layer = 2
},
/turf/simulated/floor/plasteel/airless{
icon_state = "floorgrime"
},
/area/derelict/teleporter)
"q" = (
/obj/structure/table,
/obj/item/clipboard,
/turf/simulated/floor/plasteel/airless{
dir = 8;
icon_state = "green"
},
/area/derelict/teleporter)
"r" = (
/obj/machinery/computer/teleporter,
/turf/simulated/floor/plasteel/airless{
icon_state = "dark"
},
/area/derelict/teleporter)
"s" = (
/obj/machinery/teleport/station,
/turf/simulated/floor/plasteel/airless{
icon_state = "floorgrime"
},
/area/derelict/teleporter)
"t" = (
/obj/machinery/teleport/hub,
/turf/simulated/floor/plasteel/airless{
icon_state = "floorgrime"
},
/area/derelict/teleporter)
"u" = (
/obj/machinery/atmospherics/pipe/simple/visible{
dir = 5
},
/turf/simulated/floor/plating/airless,
/area/derelict/teleporter)
"v" = (
/obj/structure/door_assembly/door_assembly_ext{
name = "Broken External Airlock"
},
/turf/simulated/floor/plating/airless,
/area/derelict/teleporter)
"w" = (
/obj/structure/lattice/catwalk,
/turf/template_noop,
/area/space/nearstation)
"x" = (
/obj/structure/table,
/obj/item/stock_parts/cell{
charge = 100;
maxcharge = 15000
},
/turf/simulated/floor/plasteel/airless{
dir = 8;
icon_state = "green"
},
/area/derelict/teleporter)
"y" = (
/obj/effect/landmark/damageturf,
/turf/simulated/floor/plasteel/airless{
icon_state = "floorgrime"
},
/area/derelict/teleporter)
"z" = (
/obj/effect/landmark/damageturf,
/obj/item/twohanded/required/kirbyplants/dead{
desc = "A dead potted plant. Must have died from lack of EVA equipment.";
item_state = "plant-dead";
name = "potted plant"
},
/turf/simulated/floor/plasteel/airless{
dir = 6;
icon_state = "green"
},
/area/derelict/teleporter)
"A" = (
/obj/structure/sign/vacuum,
/turf/simulated/wall,
/area/derelict/teleporter)
"B" = (
/obj/machinery/power/apc/noalarm{
dir = 0;
name = "Worn-out APC";
pixel_y = -24
},
/turf/simulated/floor/plasteel/airless{
icon_state = "floorgrime"
},
/area/derelict/teleporter)
(1,1,1) = {"
a
a
a
a
b
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
a
a
a
b
b
a
a
a
a
a
a
"}
(3,1,1) = {"
a
a
a
b
b
b
a
a
a
a
a
a
"}
(4,1,1) = {"
a
a
a
b
b
b
a
a
a
a
a
a
"}
(5,1,1) = {"
a
a
a
a
b
b
g
h
h
h
g
a
"}
(6,1,1) = {"
a
a
a
a
b
g
g
o
q
x
j
g
"}
(7,1,1) = {"
a
a
a
e
b
g
l
m
m
y
f
g
"}
(8,1,1) = {"
a
a
a
b
f
h
f
m
r
f
B
g
"}
(9,1,1) = {"
a
a
b
b
f
i
m
m
s
m
m
g
"}
(10,1,1) = {"
a
d
b
b
f
i
n
m
t
m
m
g
"}
(11,1,1) = {"
b
b
b
b
f
j
m
m
m
m
f
f
"}
(12,1,1) = {"
a
b
b
b
b
k
f
p
u
z
g
k
"}
(13,1,1) = {"
b
b
b
a
b
f
f
g
v
A
g
a
"}
(14,1,1) = {"
a
b
a
a
b
f
b
b
f
k
a
a
"}
(15,1,1) = {"
a
a
a
b
b
f
b
b
f
k
a
a
"}
(16,1,1) = {"
c
b
a
b
b
b
b
a
b
a
a
a
"}
(17,1,1) = {"
b
b
a
b
b
a
a
c
b
a
a
a
"}
(18,1,1) = {"
a
b
b
b
a
a
a
a
w
a
a
a
"}
(19,1,1) = {"
a
b
b
b
b
b
b
a
a
a
a
a
"}
(20,1,1) = {"
b
b
b
a
b
b
a
a
a
a
a
a
"}
(21,1,1) = {"
a
b
a
a
a
b
a
a
a
a
a
a
"}
File diff suppressed because it is too large Load Diff
@@ -6142,7 +6142,7 @@
},
/area/awaymission/centcomAway/thunderdome)
"oN" = (
/obj/machinery/icecream_vat,
/obj/machinery/icemachine,
/turf/simulated/floor/plasteel{
tag = "icon-barber (WEST)";
icon_state = "barber";
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+190 -113
View File
@@ -38,7 +38,7 @@
/area/shuttle/escape)
"ah" = (
/obj/machinery/computer/security{
network = list("SS13","Research Outpost","Mining Outpost","Telecomms")
network = list("SS13","Telecomms","Research Outpost","Mining Outpost")
},
/turf/simulated/shuttle/floor,
/area/shuttle/escape)
@@ -192,9 +192,7 @@
/obj/structure/chair/comfy/shuttle{
dir = 4
},
/turf/simulated/shuttle/floor{
icon_state = "floor3"
},
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"aF" = (
/obj/structure/grille,
@@ -214,33 +212,6 @@
icon_state = "floor3"
},
/area/shuttle/escape)
"aH" = (
/obj/structure/table,
/obj/item/storage/firstaid/regular{
pixel_x = 2;
pixel_y = 6
},
/obj/item/storage/firstaid/regular{
pixel_x = -2;
pixel_y = 4
},
/obj/item/bodybag{
pixel_x = 5
},
/obj/item/radio/intercom{
dir = 4;
name = "station intercom (General)";
pixel_x = 28
},
/obj/item/storage/firstaid/o2{
layer = 2.8;
pixel_x = 4;
pixel_y = 6
},
/turf/simulated/shuttle/floor{
icon_state = "floor3"
},
/area/shuttle/escape)
"aI" = (
/turf/simulated/shuttle/floor{
icon_state = "floor3"
@@ -311,10 +282,6 @@
icon_state = "floor3"
},
/area/shuttle/escape)
"aO" = (
/obj/machinery/recharge_station,
/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"aP" = (
/obj/machinery/door/airlock/shuttle{
aiControlDisabled = 1;
@@ -346,10 +313,11 @@
/turf/simulated/floor/plating,
/area/shuttle/escape)
"aT" = (
/obj/machinery/door/airlock/medical/glass{
/obj/machinery/door/airlock/shuttle{
aiControlDisabled = 1;
hackProof = 1;
id_tag = null;
name = "Escape Shuttle Infirmary";
req_access_txt = "0"
name = "Shuttle Cargo Hatch"
},
/turf/simulated/shuttle/floor{
icon_state = "floor3"
@@ -363,11 +331,12 @@
},
/area/shuttle/escape)
"aV" = (
/obj/machinery/door/airlock/security/glass{
name = "Escape Shuttle Cell";
req_access_txt = "2"
/obj/machinery/door/airlock/medical/glass{
id_tag = null;
name = "Escape Shuttle Infirmary";
req_access_txt = "0"
},
/turf/simulated/shuttle/floor4,
/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"aW" = (
/obj/machinery/door/airlock/shuttle{
@@ -376,14 +345,12 @@
id_tag = "s_docking_airlock";
name = "Shuttle Hatch"
},
/turf/simulated/shuttle/floor{
icon_state = "floor3"
},
/turf/simulated/floor/plating,
/area/shuttle/escape)
"aX" = (
/obj/structure/bed/roller,
/obj/structure/closet/crate,
/turf/simulated/shuttle/floor{
icon_state = "floor3"
icon_state = "floor2"
},
/area/shuttle/escape)
"aZ" = (
@@ -394,30 +361,19 @@
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"bb" = (
/obj/machinery/sleeper{
icon_state = "sleeper-open";
dir = 4
},
/obj/structure/closet/cardboard,
/turf/simulated/shuttle/floor{
icon_state = "floor3"
icon_state = "floor2"
},
/area/shuttle/escape)
"bc" = (
/obj/structure/bed/roller,
/obj/machinery/vending/wallmed{
layer = 3.3;
name = "Emergency NanoMed";
pixel_x = 28;
pixel_y = 0;
req_access_txt = "0"
},
/obj/machinery/light/spot{
tag = "icon-tube1 (EAST)";
icon_state = "tube1";
dir = 4
},
/turf/simulated/shuttle/floor{
icon_state = "floor3"
icon_state = "floor2"
},
/area/shuttle/escape)
"bd" = (
@@ -430,7 +386,9 @@
icon_state = "tube1";
dir = 8
},
/turf/simulated/shuttle/floor4,
/turf/simulated/shuttle/floor{
icon_state = "floor3"
},
/area/shuttle/escape)
"be" = (
/obj/item/radio/intercom{
@@ -438,16 +396,17 @@
name = "station intercom (General)";
pixel_x = 28
},
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"bf" = (
/obj/machinery/sleeper{
dir = 4
},
/obj/structure/bed/roller,
/turf/simulated/shuttle/floor{
icon_state = "floor3"
},
/area/shuttle/escape)
"bf" = (
/obj/machinery/mech_bay_recharge_port,
/turf/simulated/shuttle/floor{
icon_state = "floor2"
},
/area/shuttle/escape)
"bh" = (
/obj/structure/chair/comfy/shuttle{
dir = 1
@@ -492,6 +451,124 @@
/obj/structure/shuttle/engine/propulsion,
/turf/simulated/shuttle/plating,
/area/shuttle/escape)
"db" = (
/obj/machinery/door/airlock/security/glass{
name = "Escape Shuttle Cell";
req_access_txt = "2"
},
/turf/simulated/floor/plating,
/area/shuttle/escape)
"ev" = (
/obj/machinery/sleeper{
tag = "icon-sleeper (NORTH)";
icon_state = "sleeper";
dir = 1
},
/turf/simulated/shuttle/floor{
icon_state = "floor3"
},
/area/shuttle/escape)
"iM" = (
/obj/structure/table,
/obj/item/storage/firstaid/o2{
layer = 2.8;
pixel_x = 4;
pixel_y = 6
},
/obj/item/storage/firstaid/regular{
pixel_x = 2;
pixel_y = 6
},
/obj/item/storage/firstaid/regular{
pixel_x = -2;
pixel_y = 4
},
/obj/item/bodybag{
pixel_x = 5
},
/turf/simulated/shuttle/floor{
icon_state = "floor3"
},
/area/shuttle/escape)
"kP" = (
/turf/simulated/shuttle/wall{
tag = "icon-swall7";
icon_state = "swall7";
dir = 2
},
/area/shuttle/escape)
"lJ" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
},
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"mk" = (
/obj/machinery/status_display{
pixel_y = 30
},
/obj/machinery/light/spot{
tag = "icon-tube1 (NORTH)";
icon_state = "tube1";
dir = 1
},
/obj/structure/chair/comfy/shuttle,
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"rj" = (
/obj/machinery/vending/wallmed{
layer = 3.3;
name = "Emergency NanoMed";
pixel_x = 28;
pixel_y = 0;
req_access_txt = "0"
},
/obj/structure/bed/roller,
/turf/simulated/shuttle/floor{
icon_state = "floor3"
},
/area/shuttle/escape)
"xo" = (
/obj/machinery/recharge_station,
/turf/simulated/shuttle/floor{
icon_state = "floor2"
},
/area/shuttle/escape)
"zT" = (
/obj/structure/noticeboard,
/turf/simulated/shuttle/wall{
icon_state = "swall12";
dir = 2
},
/area/shuttle/escape)
"Bs" = (
/obj/machinery/door/airlock/shuttle{
aiControlDisabled = 1;
hackProof = 1;
id_tag = "s_docking_airlock";
name = "Shuttle Hatch"
},
/turf/simulated/shuttle/floor{
icon_state = "floor2"
},
/area/shuttle/escape)
"DZ" = (
/turf/simulated/shuttle/floor{
icon_state = "floor2"
},
/area/shuttle/escape)
"OC" = (
/obj/structure/grille,
/obj/structure/window/full/shuttle{
icon_state = "15"
},
/turf/simulated/shuttle/floor{
icon_state = "floor3"
},
/area/shuttle/escape)
"XL" = (
/turf/simulated/floor/mech_bay_recharge_floor,
/area/shuttle/escape)
(1,1,1) = {"
aa
@@ -504,7 +581,7 @@ ab
ar
ar
aW
ar
kP
ak
ar
aD
@@ -512,8 +589,8 @@ aF
aJ
ar
aP
ar
aW
kP
Bs
ac
ar
bi
@@ -527,10 +604,10 @@ aa
aa
aa
aw
aA
lJ
aE
aI
aA
ba
aw
an
aL
aA
@@ -538,8 +615,8 @@ aA
aA
aN
an
aR
aI
aw
DZ
bb
bf
az
@@ -553,7 +630,10 @@ aa
ab
ar
ax
aB
mk
ba
ba
aw
an
an
an
@@ -561,13 +641,10 @@ an
an
an
an
an
an
an
aS
aI
aI
aI
zT
DZ
DZ
XL
bj
bo
"}
@@ -579,10 +656,10 @@ ac
ae
as
aw
aC
aC
aC
aC
aZ
ba
bh
aw
an
aC
aC
@@ -591,9 +668,9 @@ aC
an
an
aT
aI
aI
aI
DZ
DZ
xo
bj
bo
"}
@@ -605,10 +682,10 @@ al
ap
at
aw
aD
aF
aF
aJ
aZ
ba
bh
aw
an
aD
aF
@@ -616,10 +693,10 @@ aF
aJ
an
an
ac
aw
aX
bc
aH
xo
bj
bo
"}
@@ -631,10 +708,10 @@ ai
an
an
aw
aA
aA
aA
aA
ac
db
aD
OC
an
aA
aA
@@ -721,9 +798,9 @@ aJ
an
an
ac
aZ
iM
bd
bh
ev
bm
bo
"}
@@ -747,9 +824,9 @@ aA
an
an
aV
ba
ba
bh
aI
aI
aI
bm
bo
"}
@@ -773,9 +850,9 @@ an
an
an
aR
aZ
ba
bh
aI
aI
ev
bm
bo
"}
@@ -796,12 +873,12 @@ aM
aC
aC
aC
aO
aO
an
an
aS
aZ
rj
be
bh
aI
az
bn
"}
+1 -9
View File
@@ -16,22 +16,14 @@ z7 = empty space
#if !defined(USING_MAP_DATUM)
#include "map_files\MetaStation\MetaStation.v41A.II.dmm"
#include "map_files\MetaStation\z2.dmm"
#include "map_files\generic\tcommsat-blown.dmm"
#include "map_files\generic\z4.dmm"
#include "map_files\generic\Lavaland.dmm"
#include "map_files\generic\z6.dmm"
#include "map_files\generic\z7.dmm"
#define MAP_FILE "MetaStation.v41A.II.dmm"
#define MAP_NAME "MetaStation"
#define MAP_TRANSITION_CONFIG list(\
DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\
DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)),\
DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA_3, CROSSLINKED, list(REACHABLE)))
DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)))
#define USING_MAP_DATUM /datum/map/metastation
@@ -87,7 +87,7 @@
else return 1
/obj/machinery/atmospherics/pipe/simple/proc/burst()
src.visible_message("<span class='danger'>\The [src] bursts!</span>");
src.visible_message("<span class='danger'>\The [src] bursts!</span>")
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(1,0, src.loc, 0)
+2 -21
View File
@@ -11,25 +11,6 @@
#define TICKS2DS(T) ((T) TICKS)
#define TimeOfGame (get_game_time())
#define TimeOfTick (world.tick_usage*0.01*world.tick_lag)
/proc/get_game_time()
var/global/time_offset = 0
var/global/last_time = 0
var/global/last_usage = 0
var/wtime = world.time
var/wusage = world.tick_usage * 0.01
if(last_time < wtime && last_usage > 1)
time_offset += last_usage - 1
last_time = wtime
last_usage = wusage
return wtime + (time_offset + wusage) * world.tick_lag
/* This proc should only be used for world/Topic.
* If you want to display the time for which dream daemon has been running ("round time") use worldtime2text.
* If you want to display the canonical station "time" (aka the in-character time of the station) use station_time_timestamp
@@ -98,14 +79,14 @@ proc/isDay(var/month, var/day)
* Returns "watch handle" (really just a timestamp :V)
*/
/proc/start_watch()
return TimeOfGame
return REALTIMEOFDAY
/**
* Returns number of seconds elapsed.
* @param wh number The "Watch Handle" from start_watch(). (timestamp)
*/
/proc/stop_watch(wh)
return round(0.1 * (TimeOfGame - wh), 0.1)
return round(0.1 * (REALTIMEOFDAY - wh), 0.1)
/proc/numberToMonthName(number)
return GLOB.month_names.Find(number)
+3
View File
@@ -2016,3 +2016,6 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/proc/CallAsync(datum/source, proctype, list/arguments)
set waitfor = FALSE
return call(source, proctype)(arglist(arguments))
/// Waits at a line of code until X is true
#define UNTIL(X) while(!(X)) stoplag()
+7 -4
View File
@@ -161,10 +161,13 @@
#define ui_bot_pull "EAST-2:26,SOUTH:7"
//Ghosts
#define ui_ghost_jumptomob "SOUTH:6,CENTER-2:24"
#define ui_ghost_orbit "SOUTH:6,CENTER-1:24"
#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24"
#define ui_ghost_teleport "SOUTH:6,CENTER+1:24"
#define ui_ghost_jumptomob "SOUTH:6,CENTER-2"
#define ui_ghost_orbit "SOUTH:6,CENTER-1"
#define ui_ghost_reenter_corpse "SOUTH:6,CENTER"
#define ui_ghost_teleport "SOUTH:6,CENTER+1"
#define ui_ghost_respawn_list "SOUTH:6,CENTER+2"
#define ui_ghost_respawn_mob "SOUTH:6+1,CENTER+2"
#define ui_ghost_respawn_pai "SOUTH:6+2,CENTER+2"
//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
+62
View File
@@ -40,6 +40,52 @@
var/mob/dead/observer/G = usr
G.dead_tele()
/obj/screen/ghost/respawn_list
name = "Ghost spawns"
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "template"
/obj/screen/ghost/respawn_list/Initialize(mapload)
. = ..()
update_hidden_state()
/obj/screen/ghost/respawn_list/Click()
var/client/C = hud.mymob.client
hud.inventory_shown = !hud.inventory_shown
if(hud.inventory_shown)
C.screen += hud.toggleable_inventory
else
C.screen -= hud.toggleable_inventory
update_hidden_state()
/obj/screen/ghost/respawn_list/proc/update_hidden_state()
var/matrix/M = matrix(transform)
M.Turn(-90)
overlays.Cut()
var/image/img = image('icons/mob/actions/actions.dmi', src, (hud && hud.inventory_shown) ? "hide" : "show")
img.transform = M
overlays += img
/obj/screen/ghost/respawn_mob
name = "Mob spawners"
icon_state = "mob_spawner"
/obj/screen/ghost/respawn_mob/Click()
var/mob/dead/observer/G = usr
G.open_spawners_menu()
/obj/screen/ghost/respawn_pai
name = "Configure pAI"
icon_state = "pai"
/obj/screen/ghost/respawn_pai/Click()
var/mob/dead/observer/G = usr
GLOB.paiController.recruitWindow(G)
/datum/hud/ghost
inventory_shown = FALSE
/datum/hud/ghost/New(mob/owner)
..()
var/obj/screen/using
@@ -59,6 +105,22 @@
using = new /obj/screen/ghost/teleport()
using.screen_loc = ui_ghost_teleport
static_inventory += using
static_inventory += using
using = new /obj/screen/ghost/respawn_list()
using.screen_loc = ui_ghost_respawn_list
static_inventory += using
using = new /obj/screen/ghost/respawn_mob()
using.screen_loc = ui_ghost_respawn_mob
toggleable_inventory += using
using = new /obj/screen/ghost/respawn_pai()
using.screen_loc = ui_ghost_respawn_pai
toggleable_inventory += using
for(var/obj/screen/S in (static_inventory + toggleable_inventory))
S.hud = src
/datum/hud/ghost/show_hud()
mymob.client.screen = list()
+12 -2
View File
@@ -200,8 +200,8 @@
var/disable_away_missions = 0 // disable away missions
var/disable_space_ruins = 0 //disable space ruins
var/extra_space_ruin_levels_min = 2
var/extra_space_ruin_levels_max = 4
var/extra_space_ruin_levels_min = 4
var/extra_space_ruin_levels_max = 8
var/ooc_allowed = 1
var/looc_allowed = 1
@@ -265,6 +265,11 @@
src.votable_modes += "secret"
/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist
if(IsAdminAdvancedProcCall())
to_chat(usr, "<span class='boldannounce'>Config reload blocked: Advanced ProcCall detected.</span>")
message_admins("[key_name(usr)] attempted to reload configuration via advanced proc-call")
log_admin("[key_name(usr)] attempted to reload configuration via advanced proc-call")
return
var/list/Lines = file2list(filename)
for(var/t in Lines)
@@ -808,6 +813,11 @@
log_config("Unknown setting in configuration: '[name]'")
/datum/configuration/proc/loadsql(filename) // -- TLE
if(IsAdminAdvancedProcCall())
to_chat(usr, "<span class='boldannounce'>SQL configuration reload blocked: Advanced ProcCall detected.</span>")
message_admins("[key_name(usr)] attempted to reload SQL configuration via advanced proc-call")
log_admin("[key_name(usr)] attempted to reload SQL configuration via advanced proc-call")
return
var/list/Lines = file2list(filename)
for(var/t in Lines)
if(!t) continue
+1 -1
View File
@@ -42,7 +42,7 @@ SUBSYSTEM_DEF(machines)
while(currentrun.len)
var/obj/O = currentrun[currentrun.len]
currentrun.len--
if(O)
if(O && !QDELETED(O))
var/datum/powernet/newPN = new() // create a new powernet...
propagate_network(O, newPN)//... and propagate it to the other side of the cable
+19 -8
View File
@@ -11,24 +11,35 @@ SUBSYSTEM_DEF(mapping)
createRandomZlevel()
// Seed space ruins
if(!config.disable_space_ruins)
var/timer = start_watch()
log_startup_progress("Creating random space levels...")
seedRuins(list(level_name_to_num(EMPTY_AREA)), rand(0, 3), /area/space, GLOB.space_ruins_templates)
log_startup_progress("Loaded random space levels in [stop_watch(timer)]s.")
// load in extra levels of space ruins
var/load_zlevels_timer = start_watch()
log_startup_progress("Creating random space levels...")
var/num_extra_space = rand(config.extra_space_ruin_levels_min, config.extra_space_ruin_levels_max)
for(var/i = 1, i <= num_extra_space, i++)
var/zlev = GLOB.space_manager.add_new_zlevel("[EMPTY_AREA] #[i]", linkage = CROSSLINKED, traits = list(REACHABLE))
seedRuins(list(zlev), rand(0, 3), /area/space, GLOB.space_ruins_templates)
GLOB.space_manager.add_new_zlevel("Ruin Area #[i]", linkage = CROSSLINKED, traits = list(REACHABLE, SPAWN_RUINS))
log_startup_progress("Loaded random space levels in [stop_watch(load_zlevels_timer)]s.")
// Now spawn ruins, random budget between 20 and 30 for all zlevels combined.
// While this may seem like a high number, the amount of ruin Z levels can be anywhere between 3 and 7.
// Note that this budget is not split evenly accross all zlevels
log_startup_progress("Seeding ruins...")
var/seed_ruins_timer = start_watch()
seedRuins(levels_by_trait(SPAWN_RUINS), rand(20, 30), /area/space, GLOB.space_ruins_templates)
log_startup_progress("Successfully seeded ruins in [stop_watch(seed_ruins_timer)]s.")
// Makes a blank space level for the sake of randomness
GLOB.space_manager.add_new_zlevel("Empty Area", linkage = CROSSLINKED, traits = list(REACHABLE))
// Setup the Z-level linkage
GLOB.space_manager.do_transition_setup()
// Spawn Lavaland ruins and rivers.
log_startup_progress("Populating lavaland...")
var/lavaland_setup_timer = start_watch()
seedRuins(list(level_name_to_num(MINING)), config.lavaland_budget, /area/lavaland/surface/outdoors/unexplored, GLOB.lava_ruins_templates)
spawn_rivers(list(level_name_to_num(MINING)))
log_startup_progress("Successfully populated lavaland in [stop_watch(lavaland_setup_timer)]s.")
return ..()
@@ -1,8 +1,8 @@
GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets)
/datum/controller/subsystem/tickets/mentor_tickets/New()
NEW_SS_GLOBAL(SSmentor_tickets);
PreInit();
NEW_SS_GLOBAL(SSmentor_tickets)
PreInit()
/datum/controller/subsystem/tickets/mentor_tickets
name = "Mentor Tickets"
@@ -15,7 +15,7 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets
message_mentorTicket(msg)
/datum/controller/subsystem/tickets/mentor_tickets/Initialize()
close_messages = list("<font color='red' size='3'><b>- [ticket_name] Closed -</b></font>",
"<span class='boldmessage'>Please try to be as descriptive as possible in mentor helps. Mentors do not know the full situation you're in and need more information to give you a helpful response.</span>",
close_messages = list("<font color='red' size='3'><b>- [ticket_name] Closed -</b></font>",
"<span class='boldmessage'>Please try to be as descriptive as possible in mentor helps. Mentors do not know the full situation you're in and need more information to give you a helpful response.</span>",
"<span class='[span_class]'>Your [ticket_name] has now been closed.</span>")
return ..()
+10 -10
View File
@@ -20,16 +20,16 @@ SUBSYSTEM_DEF(tickets)
init_order = INIT_ORDER_TICKETS
wait = 300
priority = FIRE_PRIORITY_TICKETS
flags = SS_BACKGROUND
var/list/allTickets = list() //make it here because someone might ahelp before the system has initialized
var/ticketCounter = 1
/datum/controller/subsystem/tickets/Initialize()
close_messages = list("<font color='red' size='4'><b>- [ticket_name] Rejected! -</b></font>",
"<span class='boldmessage'>Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.</span>",
"<span class='boldmessage'>Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.</span>",
"<span class='[span_class]'>Your [ticket_name] has now been closed.</span>")
return ..()
@@ -112,7 +112,7 @@ SUBSYSTEM_DEF(tickets)
message_staff("<span class='[span_class]'>[usr.client] / ([usr]) resolved [ticket_name] number [N]</span>")
to_chat_safe(returnClient(N), "<span class='[span_class]'>Your [ticket_name] has now been resolved.</span>")
return TRUE
/datum/controller/subsystem/tickets/proc/autoRespond(N)
if(!check_rights(R_ADMIN|R_MOD))
@@ -124,19 +124,19 @@ SUBSYSTEM_DEF(tickets)
if(alert(usr, "[T.ticketState == TICKET_OPEN ? "Another admin appears to already be handling this." : "This ticket is already marked as closed or resolved"] Are you sure you want to continue?", "Confirmation", "Yes", "No") != "Yes")
return
T.assignStaff(C)
var/response_phrases = list("Thanks" = "Thanks, have a Paradise day!",
var/response_phrases = list("Thanks" = "Thanks, have a Paradise day!",
"Handling It" = "The issue is being looked into, thanks.",
"Already Resolved" = "The problem has been resolved already.",
"Mentorhelp" = "Please redirect your question to Mentorhelp, as they are better experienced with these types of questions.",
"Happens Again" = "Thanks, let us know if it continues to happen.",
"Clear Cache" = "To fix a blank screen, please leave the game and clear your Byond Cache. To clear your Byond Cache, there is a Settings icon in the top right of the launcher. After you click that, go into the Games tab and hit the Clear Cache button. If the issue persists a few minutes after rejoining and doing this, please adminhelp again and state you cleared your cache." ,
"Clear Cache" = "To fix a blank screen, go to the 'Special Verbs' tab and press 'Reload UI Resources'. If that fails, clear your BYOND cache (instructions provided with 'Reload UI Resources'). If that still fails, please adminhelp again, stating you have already done the following." ,
"IC Issue" = "This is an In Character (IC) issue and will not be handled by admins. You could speak to Security, Internal Affairs, a Departmental Head, Nanotrasen Representetive, or any other relevant authority currently on station.",
"Reject" = "Reject",
"Man Up" = "Man Up",
"Appeal on the Forums" = "Appealing a ban must occur on the forums. Privately messaging, or adminhelping about your ban will not resolve it. To appeal your ban, please head to <a href='[config.banappeals]'>[config.banappeals]</a>"
)
var/sorted_responses = list()
for(var/key in response_phrases) //build a new list based on the short descriptive keys of the master list so we can send this as the input instead of the full paragraphs to the admin choosing which autoresponse
sorted_responses += key
@@ -351,7 +351,7 @@ UI STUFF
dat += "<tr><td>[T.content[i]]</td></tr>"
dat += "</table><br /><br />"
dat += "<a href='?src=[UID()];detailreopen=[T.ticketNum]'>Re-Open</a>[check_rights(R_ADMIN|R_MOD, 0) ? "<a href='?src=[UID()];autorespond=[T.ticketNum]'>Auto</a>": ""]<a href='?src=[UID()];detailresolve=[T.ticketNum]'>Resolve</a><br /><br />"
dat += "<a href='?src=[UID()];detailreopen=[T.ticketNum]'>Re-Open</a>[check_rights(R_ADMIN|R_MOD, 0) ? "<a href='?src=[UID()];autorespond=[T.ticketNum]'>Auto</a>": ""]<a href='?src=[UID()];detailresolve=[T.ticketNum]'>Resolve</a><br /><br />"
if(!T.staffAssigned)
dat += "No staff member assigned to this [ticket_name] - <a href='?src=[UID()];assignstaff=[T.ticketNum]'>Take Ticket</a><br />"
@@ -447,7 +447,7 @@ UI STUFF
return
if(closeTicket(indexNum))
showDetailUI(usr, indexNum)
if(href_list["detailreopen"])
var/indexNum = text2num(href_list["detailreopen"])
+9 -16
View File
@@ -1,5 +1,14 @@
// reference: /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0)
/**
* Proc to check if a datum allows proc calls on it
*
* Returns TRUE if you can call a proc on the datum, FALSE if you cant
*
*/
/datum/proc/CanProcCall(procname)
return TRUE
/datum/proc/can_vv_get(var_name)
return TRUE
@@ -1232,22 +1241,6 @@
log_admin("[key_name(usr)] has removed the organ [rem_organ] from [key_name(M)]")
qdel(rem_organ)
else if(href_list["fix_nano"])
if(!check_rights(R_DEBUG)) return
var/mob/H = locateUID(href_list["fix_nano"])
if(!istype(H) || !H.client)
to_chat(usr, "This can only be done on mobs with clients")
return
H.client.reload_nanoui_resources()
to_chat(usr, "Resource files sent")
to_chat(H, "Your NanoUI Resource files have been refreshed")
log_admin("[key_name(usr)] resent the NanoUI resource files to [key_name(H)]")
else if(href_list["regenerateicons"])
if(!check_rights(0)) return
@@ -69,10 +69,10 @@
/datum/construction/proc/check_all_steps(atom/used_atom,mob/user as mob) //check all steps, remove matching one.
for(var/i=1;i<=steps.len;i++)
var/list/L = steps[i];
var/list/L = steps[i]
if(do_tool_or_atom_check(used_atom, L["key"]) && custom_action(i, used_atom, user))
steps[i]=null;//stupid byond list from list removal...
listclearnulls(steps);
listclearnulls(steps)
if(!steps.len)
spawn_result(user)
return 1
+13 -4
View File
@@ -547,11 +547,20 @@
if(objective&&(objective.type in objective_list) && objective:target)
def_target = objective.target.current
possible_targets = sortAtom(possible_targets)
possible_targets += "Free objective"
var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets
if(!new_target)
return
var/new_target
if(length(possible_targets) > 0)
if(alert(usr, "Do you want to pick the objective yourself? No will randomise it", "Pick objective", "Yes", "No") == "Yes")
possible_targets += "Free objective"
new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets
else
new_target = pick(possible_targets)
if(!new_target)
return
else
to_chat(usr, "<span class='warning'>No possible target found. Defaulting to a Free objective.</span>")
new_target = "Free objective"
var/objective_path = text2path("/datum/objective/[new_obj_type]")
if(new_target == "Free objective")
+65
View File
@@ -182,3 +182,68 @@
name = "Crashed Wizard Shuttle"
description = "A shuttle of the Wizard Federation, sent out to crush some wandless scum. Unfortunately, the pilot suffered a magic-related accident and the shuttle crashed into a nearby asteroid."
cost = 2
/datum/map_template/ruin/space/abandonedtele
id = "abandonedtele"
suffix = "abandonedtele.dmm"
name = "Abandoned Teleporter"
description = "An old teleporter, seemingly part of what used to be a larger satellite."
/datum/map_template/ruin/space/blowntcommsat
id = "blowntcommsat"
suffix = "blowntcommsat.dmm"
name = "Blown-out Telecommunications Satellite"
description = "The remains of an old telecommunications satellite once utilised by NanoTrasen. It lays derelict, with quite a few pieces missing."
cost = 5 // This is a chonky boy
allow_duplicates = FALSE // Absolutely huge, also has its own APC and the area isnt set to allow many
/datum/map_template/ruin/space/clownmime
id = "clownmime"
suffix = "clownmime.dmm"
name = "Clown & Mime Mineral Deposits"
description = "A crash site of two opposing factions, both trying to complete mining trips for their own valuable minerals. While all the crew have long perished, the minerals are likely intact."
/datum/map_template/ruin/space/dj
id = "dj"
suffix = "dj.dmm"
name = "Russian DJ Station"
description = "An old russian listening station, long since defunct and lifeless, however the equipment is likely still in working condition."
cost = 2
/datum/map_template/ruin/space/druglab
id = "druglab"
suffix = "druglab.dmm"
name = "Drug Lab"
description = "An old abandoned \"Chemistry\" site, which has a strong aura of amphetamines around it."
/datum/map_template/ruin/space/syndiedepot
id = "syndiedepot"
suffix = "syndiedepot.dmm"
name = "Suspicious Supply Depot"
description = "A syndicate supply depot, heavily stocked, but heavily guarded with an assortment of shields, sentry bots, armed operatives and more."
allow_duplicates = FALSE // One of these is enough
always_place = TRUE // This is on the always spawn list because of the shielding chance
cost = 0 // Force spawned so shouldnt have a cost
/datum/map_template/ruin/space/ussp_tele
id = "ussp_tele"
suffix = "ussp_tele.dmm"
name = "USSP Teleporter"
description = "An old, almost fully destroyed teleporter, seemingly part of what used to be a much larger structure."
/datum/map_template/ruin/space/ussp
id = "ussp"
suffix = "ussp.dmm"
name = "USSP"
description = "A decript station of seemingly russian origin. The last contact had with this station was a distress signal, and the rest was dark."
allow_duplicates = FALSE // One of these has enough loot
cost = 5 // This ruin is 100x100 tiles, so we dont want it to be treated like a 10x10 meteor
/datum/map_template/ruin/space/whiteship
id = "whiteship"
suffix = "whiteship.dmm"
name = "NT Medical Ship"
description = "An old, abandoned NT medical ship. Its computer can navigate to other landmarks within space with ease."
allow_duplicates = FALSE // I dont even want to think about what happens if you have 2 shuttles with the same ID. Likely scary stuff.
always_place = TRUE // Its designed to make exploring other space ruins more accessible
cost = 0 // Force spawned so shouldnt have a cost
+8
View File
@@ -238,6 +238,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 2
job = list("Chef")
/datum/uplink_item/jobspecific/Chef_CQC
name = " A chefs manual to CQC"
desc = "An old manual teaching you how to bring your home advantage outside the kitchen."
reference = "CCQC"
item = /obj/item/CQC_manual/chef
cost = 12
job = list("Chef")
//Chaplain
/datum/uplink_item/jobspecific/voodoo
-1
View File
@@ -96,7 +96,6 @@
if(BOMB_WIRE_ACTIVATE)
if(!mended && B.active)
holder.visible_message("<span class='notice'>[bicon(B)] The timer stops! The bomb has been defused!</span>")
B.active = FALSE
B.defused = TRUE
B.update_icon()
..()
+9
View File
@@ -72,12 +72,21 @@ DBConnection/proc/NewQuery(sql_query,cursor_handler=src.default_cursor) return n
DBQuery/New(sql_query,DBConnection/connection_handler,cursor_handler)
if(IsAdminAdvancedProcCall())
to_chat(usr, "<span class='boldannounce'>DB query blocked: Advanced ProcCall detected.</span>")
message_admins("[key_name(usr)] attempted to create a DB query via advanced proc-call")
log_admin("[key_name(usr)] attempted to create a DB query via advanced proc-call")
return
if(sql_query) src.sql = sql_query
if(connection_handler) src.db_connection = connection_handler
if(cursor_handler) src.default_cursor = cursor_handler
_db_query = _dm_db_new_query()
return ..()
DBQuery/CanProcCall()
// dont even try it
return FALSE
DBQuery
var/sql // The sql query being executed.
+4 -4
View File
@@ -555,6 +555,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/exploration/methlab
name = "\improper Abandoned Drug Lab"
icon_state = "green"
there_can_be_many = TRUE
//Abductors
/area/abductor_ship
@@ -678,10 +679,6 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
name = "Engineering Maintenance"
icon_state = "amaint"
/area/maintenance/engi_shuttle
name = "Engineering Shuttle Access"
icon_state = "maint_e_shuttle"
/area/maintenance/storage
name = "Atmospherics Maintenance"
icon_state = "green"
@@ -1230,6 +1227,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
name = "\improper Abandoned Teleporter"
icon_state = "teleporter"
ambientsounds = list('sound/ambience/ambimalf.ogg', 'sound/ambience/signal.ogg')
there_can_be_many = TRUE
/area/toxins/explab
name = "\improper E.X.P.E.R.I-MENTOR Lab"
@@ -1740,6 +1738,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/djstation
name = "\improper Ruskie DJ Station"
icon_state = "DJ"
there_can_be_many = TRUE
/area/djstation/solars
name = "\improper Ruskie DJ Station Solars"
@@ -1816,6 +1815,7 @@ GLOBAL_LIST_EMPTY(ghostteleportlocs)
/area/derelict/teleporter
name = "\improper Derelict Teleporter"
icon_state = "teleporter"
there_can_be_many = TRUE
/area/derelict/eva
name = "Derelict EVA Storage"
+1 -1
View File
@@ -292,7 +292,7 @@
if(!reactor.has_overloaded)
reactor.overload(containment_failure)
else
log_debug("Depot: [src] called activate_self_destruct with no reactor.");
log_debug("Depot: [src] called activate_self_destruct with no reactor.")
message_admins("<span class='adminnotice'>Syndicate Depot lacks reactor to initiate self-destruct. Must be destroyed manually.</span>")
updateicon()
+12 -14
View File
@@ -118,17 +118,15 @@
if(usr.incapacitated())
return
eject_occupant()
eject_occupant(usr)
add_fingerprint(usr)
/obj/machinery/dna_scannernew/Destroy()
eject_occupant()
eject_occupant(null, TRUE)
return ..()
/obj/machinery/dna_scannernew/proc/eject_occupant()
go_out()
/obj/machinery/dna_scannernew/proc/eject_occupant(user, force)
go_out(user, force)
for(var/obj/O in src)
if(!istype(O,/obj/item/circuitboard/clonescanner) && \
!istype(O,/obj/item/stock_parts) && \
@@ -271,15 +269,15 @@
occupant.notify_ghost_cloning(source = src)
/obj/machinery/dna_scannernew/proc/go_out()
/obj/machinery/dna_scannernew/proc/go_out(mob/user, force)
if(!occupant)
to_chat(usr, "<span class='warning'>The scanner is empty!</span>")
if(user)
to_chat(user, "<span class='warning'>The scanner is empty!</span>")
return
if(locked)
to_chat(usr, "<span class='warning'>The scanner is locked!</span>")
if(locked && !force)
if(user)
to_chat(user, "<span class='warning'>The scanner is locked!</span>")
return
occupant.forceMove(loc)
occupant = null
icon_state = "scanner_open"
@@ -489,7 +487,7 @@
occupantData["uniqueIdentity"] = connected.occupant.dna.uni_identity
occupantData["structuralEnzymes"] = connected.occupant.dna.struc_enzymes
occupantData["radiationLevel"] = connected.occupant.radiation
data["occupant"] = occupantData;
data["occupant"] = occupantData
data["isBeakerLoaded"] = connected.beaker ? 1 : 0
data["beakerLabel"] = null
@@ -751,7 +749,7 @@
return TRUE
if(href_list["ejectOccupant"])
connected.eject_occupant()
connected.eject_occupant(usr)
return TRUE
// Transfer Buffer Management
@@ -49,7 +49,7 @@
/obj/item/organ/internal/cyberimp/eyes/shield/ling/on_life()
..()
var/obj/item/organ/internal/eyes/E = owner.get_int_organ(/obj/item/organ/internal/eyes)
if(owner.eye_blind || owner.eye_blurry || (BLINDNESS in owner.mutations) || (NEARSIGHTED in owner.mutations) || (E.damage > 0))
if(owner.eye_blind || owner.eye_blurry || (BLINDNESS in owner.mutations) || (NEARSIGHTED in owner.mutations) || (E && E.damage > 0))
owner.reagents.add_reagent("oculine", 1)
/obj/item/organ/internal/cyberimp/eyes/shield/ling/prepare_eat()
@@ -65,7 +65,7 @@
if(loc == summoner)
if(toggle)
a_intent = INTENT_HARM
hud_used.action_intent.icon_state = a_intent;
hud_used.action_intent.icon_state = a_intent
speed = 0
damage_transfer = 0.7
if(adminseal)
@@ -76,7 +76,7 @@
toggle = FALSE
else
a_intent = INTENT_HELP
hud_used.action_intent.icon_state = a_intent;
hud_used.action_intent.icon_state = a_intent
speed = 1
damage_transfer = 1
if(adminseal)
+56 -38
View File
@@ -1,5 +1,21 @@
/datum/controller/subsystem/ticker/proc/scoreboard()
//Thresholds for Score Ratings
#define SINGULARITY_DESERVES_BETTER -3500
#define SINGULARITY_FODDER -3000
#define ALL_FIRED -2500
#define WASTE_OF_OXYGEN -2000
#define HEAP_OF_SCUM -1500
#define LAB_MONKEYS -1000
#define UNDESIREABLES -500
#define SERVANTS_OF_SCIENCE 500
#define GOOD_BUNCH 1000
#define MACHINE_THIRTEEN 1500
#define PROMOTIONS_FOR_EVERYONE 2000
#define AMBASSADORS_OF_DISCOVERY 3000
#define PRIDE_OF_SCIENCE 4000
#define NANOTRANSEN_FINEST 5000
//Print a list of antagonists to the server log
var/list/total_antagonists = list()
//Look into all mobs in world, dead or alive
@@ -93,15 +109,14 @@
// Bonus Modifiers
//var/traitorwins = score_traitorswon
var/deathpoints = GLOB.score_deadcrew * 25 //done
var/researchpoints = GLOB.score_researchdone * 30
var/eventpoints = GLOB.score_eventsendured * 50
var/escapoints = GLOB.score_escapees * 25 //done
var/harvests = GLOB.score_stuffharvested * 5 //done
var/harvests = GLOB.score_stuffharvested * 5
var/shipping = GLOB.score_stuffshipped * 5
var/mining = GLOB.score_oremined * 2 //done
var/meals = GLOB.score_meals * 5 //done, but this only counts cooked meals, not drinks served
var/mining = GLOB.score_oremined * 2 //done, might want polishing
var/meals = GLOB.score_meals * 5
var/power = GLOB.score_powerloss * 20
var/messpoints
if(GLOB.score_mess != 0)
@@ -121,13 +136,9 @@
GLOB.score_crewscore += 2500
GLOB.score_powerbonus = 1
if(GLOB.score_mess == 0)
GLOB.score_crewscore += 3000
GLOB.score_messbonus = 1
GLOB.score_crewscore += meals
if(GLOB.score_allarrested)
if(GLOB.score_allarrested) // This only seems to be implemented for Rev and Nukies. -DaveKorhal
GLOB.score_crewscore *= 3 // This needs to be here for the bonus to be applied properly
@@ -177,26 +188,19 @@
dat += {"
<b><u>General Statistics</u></b><br>
<u>The Good:</u><br>
<b>Useful Items Shipped:</b> [GLOB.score_stuffshipped] ([GLOB.score_stuffshipped * 5] Points)<br>
<b>Hydroponics Harvests:</b> [GLOB.score_stuffharvested] ([GLOB.score_stuffharvested * 5] Points)<br>
<b>Ore Mined:</b> [GLOB.score_oremined] ([GLOB.score_oremined * 2] Points)<br>
<b>Refreshments Prepared:</b> [GLOB.score_meals] ([GLOB.score_meals * 5] Points)<br>
<b>Research Completed:</b> [GLOB.score_researchdone] ([GLOB.score_researchdone * 30] Points)<br>"}
<u>The Good</u><br>
<b>Ore Mined:</b> [GLOB.score_oremined] ([GLOB.score_oremined * 2] Points)<br>"}
if(SSshuttle.emergency.mode == SHUTTLE_ENDGAME) dat += "<b>Shuttle Escapees:</b> [GLOB.score_escapees] ([GLOB.score_escapees * 25] Points)<br>"
dat += {"<b>Random Events Endured:</b> [GLOB.score_eventsendured] ([GLOB.score_eventsendured * 50] Points)<br>
<b>Whole Station Powered:</b> [GLOB.score_powerbonus ? "Yes" : "No"] ([GLOB.score_powerbonus * 2500] Points)<br>
<b>Ultra-Clean Station:</b> [GLOB.score_mess ? "No" : "Yes"] ([GLOB.score_messbonus * 3000] Points)<br><br>
<U>The bad:</U><br>
dat += {"
<b>Whole Station Powered:</b> [GLOB.score_powerbonus ? "Yes" : "No"] ([GLOB.score_powerbonus * 2500] Points)<br><br>
<U>The Bad</U><br>
<b>Dead bodies on Station:</b> [GLOB.score_deadcrew] (-[GLOB.score_deadcrew * 25] Points)<br>
<b>Uncleaned Messes:</b> [GLOB.score_mess] (-[GLOB.score_mess] Points)<br>
<b>Station Power Issues:</b> [GLOB.score_powerloss] (-[GLOB.score_powerloss * 20] Points)<br>
<b>Rampant Diseases:</b> [GLOB.score_disease] (-[GLOB.score_disease * 30] Points)<br>
<b>AI Destroyed:</b> [GLOB.score_deadaipenalty ? "Yes" : "No"] (-[GLOB.score_deadaipenalty * 250] Points)<br><br>
<U>The Weird</U><br>
<U>The Weird</U><br>
<b>Food Eaten:</b> [GLOB.score_foodeaten] bites/sips<br>
<b>Times a Clown was Abused:</b> [GLOB.score_clownabuse]<br><br>
"}
@@ -218,22 +222,36 @@
var/score_rating = "The Aristocrats!"
switch(GLOB.score_crewscore)
if(-99999 to -50000) score_rating = "Even the Singularity Deserves Better"
if(-49999 to -5000) score_rating = "Singularity Fodder"
if(-4999 to -1000) score_rating = "You're All Fired"
if(-999 to -500) score_rating = "A Waste of Perfectly Good Oxygen"
if(-499 to -250) score_rating = "A Wretched Heap of Scum and Incompetence"
if(-249 to -100) score_rating = "Outclassed by Lab Monkeys"
if(-99 to -21) score_rating = "The Undesirables"
if(-20 to 20) score_rating = "Ambivalently Average"
if(21 to 99) score_rating = "Not Bad, but Not Good"
if(100 to 249) score_rating = "Skillful Servants of Science"
if(250 to 499) score_rating = "Best of a Good Bunch"
if(500 to 999) score_rating = "Lean Mean Machine Thirteen"
if(1000 to 4999) score_rating = "Promotions for Everyone"
if(5000 to 9999) score_rating = "Ambassadors of Discovery"
if(10000 to 49999) score_rating = "The Pride of Science Itself"
if(50000 to INFINITY) score_rating = "Nanotrasen's Finest"
if(-99999 to SINGULARITY_DESERVES_BETTER) score_rating = "Even the Singularity Deserves Better"
if(SINGULARITY_DESERVES_BETTER+1 to SINGULARITY_FODDER) score_rating = "Singularity Fodder"
if(SINGULARITY_FODDER+1 to ALL_FIRED) score_rating = "You're All Fired"
if(ALL_FIRED+1 to WASTE_OF_OXYGEN) score_rating = "A Waste of Perfectly Good Oxygen"
if(WASTE_OF_OXYGEN+1 to HEAP_OF_SCUM) score_rating = "A Wretched Heap of Scum and Incompetence"
if(HEAP_OF_SCUM+1 to LAB_MONKEYS) score_rating = "Outclassed by Lab Monkeys"
if(LAB_MONKEYS+1 to UNDESIREABLES) score_rating = "The Undesirables"
if(UNDESIREABLES+1 to SERVANTS_OF_SCIENCE-1) score_rating = "Ambivalently Average"
if(SERVANTS_OF_SCIENCE to GOOD_BUNCH-1) score_rating = "Skillful Servants of Science"
if(GOOD_BUNCH to MACHINE_THIRTEEN-1) score_rating = "Best of a Good Bunch"
if(MACHINE_THIRTEEN to PROMOTIONS_FOR_EVERYONE-1) score_rating = "Lean Mean Machine Thirteen"
if(PROMOTIONS_FOR_EVERYONE to AMBASSADORS_OF_DISCOVERY-1) score_rating = "Promotions for Everyone"
if(AMBASSADORS_OF_DISCOVERY to PRIDE_OF_SCIENCE-1) score_rating = "Ambassadors of Discovery"
if(PRIDE_OF_SCIENCE to NANOTRANSEN_FINEST-1) score_rating = "The Pride of Science Itself"
if(NANOTRANSEN_FINEST to INFINITY) score_rating = "Nanotrasen's Finest"
dat += "<b><u>RATING:</u></b> [score_rating]"
src << browse(dat, "window=roundstats;size=500x600")
#undef SINGULARITY_DESERVES_BETTER
#undef SINGULARITY_FODDER
#undef ALL_FIRED
#undef WASTE_OF_OXYGEN
#undef HEAP_OF_SCUM
#undef LAB_MONKEYS
#undef UNDESIREABLES
#undef SERVANTS_OF_SCIENCE
#undef GOOD_BUNCH
#undef MACHINE_THIRTEEN
#undef PROMOTIONS_FOR_EVERYONE
#undef AMBASSADORS_OF_DISCOVERY
#undef PRIDE_OF_SCIENCE
#undef NANOTRANSEN_FINEST
+2 -2
View File
@@ -4,8 +4,8 @@
var/highpop_trigger = 80
if(playercount >= highpop_trigger)
log_debug("Playercount: [playercount] versus trigger: [highpop_trigger] - loading highpop job config");
log_debug("Playercount: [playercount] versus trigger: [highpop_trigger] - loading highpop job config")
SSjobs.LoadJobs("config/jobs_highpop.txt")
else
log_debug("Playercount: [playercount] versus trigger: [highpop_trigger] - keeping standard job config");
log_debug("Playercount: [playercount] versus trigger: [highpop_trigger] - keeping standard job config")
return 1
@@ -346,6 +346,22 @@
return
// HOLOFLOOR DOES NOT GIVE A FUCK
/turf/simulated/floor/holofloor/space
name = "\proper space"
icon = 'icons/turf/space.dmi'
icon_state = "0"
plane = PLANE_SPACE
/turf/simulated/floor/holofloor/space/Initialize(mapload)
icon_state = SPACE_ICON_STATE // so realistic
. = ..()
/turf/simulated/floor/holofloor/space/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
underlay_appearance.icon = 'icons/turf/space.dmi'
underlay_appearance.icon_state = SPACE_ICON_STATE
underlay_appearance.plane = PLANE_SPACE
return TRUE
/obj/structure/table/holotable
flags = NODECONSTRUCT
canSmoothWith = list(/obj/structure/table/holotable)
+3
View File
@@ -153,6 +153,9 @@
to_chat(user, "<span class='notice'>You screw the circuit board into place.</span>")
state = SCREWED_CORE
if(GLASS_CORE)
var/area/R = get_area(src)
message_admins("[key_name_admin(usr)] has completed an AI core in [R]: [ADMIN_COORDJMP(loc)].")
log_game("[key_name(usr)] has completed an AI core in [R]: [COORD(loc)].")
to_chat(user, "<span class='notice'>You connect the monitor.</span>")
if(!brain)
var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes"
+1 -1
View File
@@ -52,7 +52,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
//This is used to keep track of opened positions for jobs to allow instant closing
//Assoc array: "JobName" = (int)<Opened Positions>
var/list/opened_positions = list();
var/list/opened_positions = list()
/obj/machinery/computer/card/proc/is_centcom()
return istype(src, /obj/machinery/computer/card/centcom)
@@ -424,8 +424,6 @@
else
return menu_state
/proc/enable_prison_shuttle(var/mob/user);
/proc/call_shuttle_proc(var/mob/user, var/reason)
if(GLOB.sent_strike_team == 1)
to_chat(user, "<span class='warning'>Central Command will not allow the shuttle to be called. Consider all contracts terminated.</span>")
+1 -1
View File
@@ -237,7 +237,7 @@
occupantData["toxLoss"] = occupant.getToxLoss()
occupantData["fireLoss"] = occupant.getFireLoss()
occupantData["bodyTemperature"] = occupant.bodytemperature
data["occupant"] = occupantData;
data["occupant"] = occupantData
data["cellTemperature"] = round(air_contents.temperature)
data["cellTemperatureStatus"] = "good"
+2 -2
View File
@@ -192,10 +192,10 @@ About the new airlock wires panel:
return wires.IsIndexCut(wireIndex)
/obj/machinery/door/airlock/proc/canAIControl()
return ((aiControlDisabled!=1) && (!isAllPowerLoss()));
return ((aiControlDisabled!=1) && (!isAllPowerLoss()))
/obj/machinery/door/airlock/proc/canAIHack()
return ((aiControlDisabled==1) && (!hackProof) && (!isAllPowerLoss()));
return ((aiControlDisabled==1) && (!hackProof) && (!isAllPowerLoss()))
/obj/machinery/door/airlock/proc/arePowerSystemsOn()
if(stat & (NOPOWER|BROKEN))
+1 -1
View File
@@ -195,7 +195,7 @@ GLOBAL_LIST_EMPTY(holopads)
for(var/mob/living/silicon/ai/AI in GLOB.ai_list)
if(!AI.client)
continue
to_chat(AI, "<span class='info'>Your presence is requested at <a href='?src=\ref[AI];jumptoholopad=[UID()]'>\the [area]</a>.</span>")
to_chat(AI, "<span class='info'>Your presence is requested at <a href='?src=[AI.UID()];jumptoholopad=[UID()]'>\the [area]</a>.</span>")
else
temp = "A request for AI presence was already sent recently.<br>"
temp += "<a href='?src=[UID()];mainmenu=1'>Main Menu</a>"
+1 -1
View File
@@ -59,7 +59,7 @@ GLOBAL_LIST_EMPTY(allRequestConsoles)
var/announceAuth = 0 //Will be set to 1 when you authenticate yourself for announcements
var/msgVerified = "" //Will contain the name of the person who varified it
var/msgStamped = "" //If a message is stamped, this will contain the stamp name
var/message = "";
var/message = ""
var/recipient = ""; //the department which will be receiving the message
var/priority = -1 ; //Priority of the message being sent
light_range = 0
+6
View File
@@ -20,6 +20,12 @@
account = null
ui_interact(user)
/obj/machinery/slot_machine/wrench_act(mob/user, obj/item/I)
. = TRUE
if(!I.tool_use_check(user, 0))
return
default_unfasten_wrench(user, I)
/obj/machinery/slot_machine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
+3 -4
View File
@@ -77,11 +77,10 @@
update_icon()
try_detonate(TRUE)
//Counter terrorists win
else if(!active || defused)
if(defused && (payload in src))
else if(defused)
active = FALSE
if(payload in src)
payload.defuse()
countdown.stop()
STOP_PROCESSING(SSfastprocess, src)
/obj/machinery/syndicatebomb/New()
wires = new(src)
+1 -1
View File
@@ -1134,7 +1134,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
qdel(src)
/obj/structure/foamedmetal/attack_alien(mob/living/carbon/alien/humanoid/M)
M.visible_message("<span class='danger'>[M] tears apart \the [src]!</span>");
M.visible_message("<span class='danger'>[M] tears apart \the [src]!</span>")
qdel(src)
/obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5)
@@ -48,7 +48,7 @@
if(..())
return
if(!R.allow_rename)
to_chat(R, "<span class='warning'>Internal diagnostic error: incompatible upgrade module detected.</span>");
to_chat(R, "<span class='warning'>Internal diagnostic error: incompatible upgrade module detected.</span>")
return 0
R.notify_ai(3, R.name, heldname)
R.name = heldname
@@ -196,7 +196,7 @@
if(R.emagged)
return
if(R.weapons_unlock)
to_chat(R, "<span class='warning'>Internal diagnostic error: incompatible upgrade module detected.</span>");
to_chat(R, "<span class='warning'>Internal diagnostic error: incompatible upgrade module detected.</span>")
return
R.emagged = 1
return TRUE
+5 -2
View File
@@ -31,6 +31,7 @@ LIGHTERS ARE IN LIGHTERS.DM
var/smoketime = 150
var/chem_volume = 60
var/list/list_reagents = list("nicotine" = 40)
var/first_puff = TRUE // the first puff is a bit more reagents ingested
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
@@ -194,8 +195,9 @@ LIGHTERS ARE IN LIGHTERS.DM
if(reagents && reagents.total_volume) // check if it has any reagents at all
if(is_being_smoked) // if it's being smoked, transfer reagents to the mob
var/mob/living/carbon/C = loc
for (var/datum/reagent/R in reagents.reagent_list)
reagents.trans_id_to(C, R.id, max(REAGENTS_METABOLISM / reagents.reagent_list.len, 0.1)) //transfer at least .1 of each chem
for(var/datum/reagent/R in reagents.reagent_list)
reagents.trans_id_to(C, R.id, first_puff ? 1 : max(REAGENTS_METABOLISM / reagents.reagent_list.len, 0.1)) //transfer at least .1 of each chem
first_puff = FALSE
if(!reagents.total_volume) // There were reagents, but now they're gone
to_chat(C, "<span class='notice'>Your [name] loses its flavor.</span>")
else // else just remove some of the reagents
@@ -377,6 +379,7 @@ LIGHTERS ARE IN LIGHTERS.DM
to_chat(user, "<span class='notice'>You refill the pipe with tobacco.</span>")
reagents.add_reagent("nicotine", chem_volume)
smoketime = initial(smoketime)
first_puff = TRUE
/obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/reagent_containers))
@@ -230,7 +230,7 @@
add_fingerprint(user)
/obj/structure/closet/attack_ai(mob/user)
if(isrobot(user) && Adjacent(user)) //Robots can open/close it, but not the AI
if(isrobot(user) && Adjacent(user) && !istype(user.loc, /obj/machinery/atmospherics)) //Robots can open/close it, but not the AI
attack_hand(user)
/obj/structure/closet/relaymove(mob/user)
+2 -2
View File
@@ -40,7 +40,7 @@
food_slots[s]=I
update_icon()
success = 1
break;
break
if(!success)
to_chat(user, fail_msg)
else if(istype(I, /obj/item/reagent_containers/food/drinks))
@@ -51,7 +51,7 @@
drink_slots[s]=I
update_icon()
success = 1
break;
break
if(!success)
to_chat(user, fail_msg)
else if(istype(I, /obj/item/wrench))
@@ -45,6 +45,7 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
/turf/simulated/floor/indestructible/necropolis/Initialize(mapload)
. = ..()
@@ -52,8 +53,8 @@
icon_state = "necro[rand(2,3)]"
/turf/simulated/floor/indestructible/necropolis/air
oxygen = 0
nitrogen = 0
oxygen = MOLES_O2STANDARD
nitrogen = MOLES_N2STANDARD
temperature = T20C
/turf/simulated/floor/indestructible/boss //you put stone tiles on this and use it as a base
@@ -64,6 +65,7 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
/turf/simulated/floor/indestructible/boss/air
oxygen = MOLES_O2STANDARD
@@ -77,6 +79,7 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
smooth = SMOOTH_TRUE
/turf/simulated/floor/indestructible/hierophant/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
@@ -111,6 +111,7 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
/turf/simulated/floor/lubed
name = "slippery floor"
+2 -2
View File
@@ -211,7 +211,7 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "")
query.Execute()
while(query.NextRow())
ban_id = query.item[1]
ban_number++;
ban_number++
if(ban_number == 0)
to_chat(usr, "<span class='warning'>Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin.</span>")
@@ -314,7 +314,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
query.Execute()
while(query.NextRow())
pckey = query.item[1]
ban_number++;
ban_number++
if(ban_number == 0)
to_chat(usr, "<span class='warning'>Database update failed due to a ban id not being present in the database.</span>")
+5
View File
@@ -61,6 +61,11 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons
return 1
/proc/load_admins()
if(IsAdminAdvancedProcCall())
to_chat(usr, "<span class='boldannounce'>Admin reload blocked: Advanced ProcCall detected.</span>")
message_admins("[key_name(usr)] attempted to reload admins via advanced proc-call")
log_admin("[key_name(usr)] attempted to reload admins via advanced proc-call")
return
//clear the datums references
GLOB.admin_datums.Cut()
for(var/client/C in GLOB.admins)
+25
View File
@@ -16,6 +16,11 @@ GLOBAL_PROTECT(admin_datums) // This is protected because we dont want people ma
var/admincaster_signature //What you'll sign the newsfeeds as
/datum/admins/New(initial_rank = "Temporary Admin", initial_rights = 0, ckey)
if(IsAdminAdvancedProcCall())
to_chat(usr, "<span class='boldannounce'>Admin rank creation blocked: Advanced ProcCall detected.</span>")
message_admins("[key_name(usr)] attempted to create a new admin rank via advanced proc-call")
log_admin("[key_name(usr)] attempted to edit feedback a new admin rank via advanced proc-call")
return
if(!ckey)
error("Admin datum created without a ckey argument. Datum has been deleted")
qdel(src)
@@ -26,10 +31,20 @@ GLOBAL_PROTECT(admin_datums) // This is protected because we dont want people ma
GLOB.admin_datums[ckey] = src
/datum/admins/Destroy()
if(IsAdminAdvancedProcCall())
to_chat(usr, "<span class='boldannounce'>Admin rank deletion blocked: Advanced ProcCall detected.</span>")
message_admins("[key_name(usr)] attempted to delete an admin rank via advanced proc-call")
log_admin("[key_name(usr)] attempted to delete an admin rank via advanced proc-call")
return
..()
return QDEL_HINT_HARDDEL_NOW
/datum/admins/proc/associate(client/C)
if(IsAdminAdvancedProcCall())
to_chat(usr, "<span class='boldannounce'>Rank association blocked: Advanced ProcCall detected.</span>")
message_admins("[key_name(usr)] attempted to associate an admin rank to a new client via advanced proc-call")
log_admin("[key_name(usr)] attempted to associate an admin rank to a new client via advanced proc-call")
return
if(istype(C))
owner = C
owner.holder = src
@@ -39,6 +54,11 @@ GLOBAL_PROTECT(admin_datums) // This is protected because we dont want people ma
GLOB.admins |= C
/datum/admins/proc/disassociate()
if(IsAdminAdvancedProcCall())
to_chat(usr, "<span class='boldannounce'>Rank disassociation blocked: Advanced ProcCall detected.</span>")
message_admins("[key_name(usr)] attempted to disassociate an admin rank from a client via advanced proc-call")
log_admin("[key_name(usr)] attempted to disassociate an admin rank from a client via advanced proc-call")
return
if(owner)
GLOB.admins -= owner
owner.remove_admin_verbs()
@@ -88,6 +108,11 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself.
return 0
/client/proc/deadmin()
if(IsAdminAdvancedProcCall())
to_chat(usr, "<span class='boldannounce'>Deadmin blocked: Advanced ProcCall detected.</span>")
message_admins("[key_name(usr)] attempted to de-admin a client via advanced proc-call")
log_admin("[key_name(usr)] attempted to de-admin a client via advanced proc-call")
return
GLOB.admin_datums -= ckey
if(holder)
holder.disassociate()
@@ -102,6 +102,11 @@
to_chat(usr, "<span class='notice'>Admin rank changed.</span>")
/datum/admins/proc/log_admin_permission_modification(var/adm_ckey, var/new_permission)
if(IsAdminAdvancedProcCall())
to_chat(usr, "<span class='boldannounce'>Admin edit blocked: Advanced ProcCall detected.</span>")
message_admins("[key_name(usr)] attempted to edit admin ranks via advanced proc-call")
log_admin("[key_name(usr)] attempted to edit admin ranks via advanced proc-call")
return
if(config.admin_legacy_system)
return
+2 -2
View File
@@ -3475,9 +3475,9 @@
hunter_mind.objectives += protect_objective
SSticker.mode.traitors |= hunter_mob.mind
to_chat(hunter_mob, "<span class='danger'>ATTENTION:</span> You are now on a mission!")
to_chat(hunter_mob, "<B>Goal: <span class='danger'>[killthem ? "MURDER" : "PROTECT"] [H.real_name]</span>, currently in [get_area(H.loc)]. </B>");
to_chat(hunter_mob, "<B>Goal: <span class='danger'>[killthem ? "MURDER" : "PROTECT"] [H.real_name]</span>, currently in [get_area(H.loc)]. </B>")
if(killthem)
to_chat(hunter_mob, "<B>If you kill [H.p_them()], [H.p_they()] cannot be revived.</B>");
to_chat(hunter_mob, "<B>If you kill [H.p_them()], [H.p_they()] cannot be revived.</B>")
hunter_mob.mind.special_role = SPECIAL_ROLE_TRAITOR
var/datum/atom_hud/antag/tatorhud = GLOB.huds[ANTAG_HUD_TRAITOR]
tatorhud.join_hud(hunter_mob)
+2 -2
View File
@@ -444,9 +444,9 @@
if(object == world) // Global proc.
procname = "/proc/[procname]"
return call(procname)(arglist(new_args))
return (WrapAdminProcCall(GLOBAL_PROC, procname, new_args))
return call(object, procname)(arglist(new_args))
return (WrapAdminProcCall(object, procname, new_args))
/proc/SDQL2_tokenize(query_text)
+1 -1
View File
@@ -165,7 +165,7 @@ GLOBAL_LIST_INIT(adminhelp_ignored_words, list("unknown","the","a","an","of","mo
var/admin_number_ignored = 0 //Holds the number of admins without +BAN (so admins who are not really admins)
var/admin_number_decrease = 0 //Holds the number of admins with are afk, ignored or both
for(var/client/X in GLOB.admins)
admin_number_total++;
admin_number_total++
var/invalid = 0
if(requiredflags != 0 && !check_rights_for(X, requiredflags))
admin_number_ignored++
+66 -19
View File
@@ -85,18 +85,80 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
message_admins("[key_name_admin(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
returnval = WrapAdminProcCall(target, procname, lst) // Pass the lst as an argument list to the proc
else
//this currently has no hascall protection. wasn't able to get it working.
message_admins("[key_name_admin(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc
returnval = WrapAdminProcCall(GLOBAL_PROC, procname, lst) // Pass the lst as an argument list to the proc
to_chat(usr, "<font color='blue'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</font>")
feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
// All these vars are related to proc call protection
// If you add more of these, for the love of fuck, protect them
/// Who is currently calling procs
GLOBAL_VAR(AdminProcCaller)
GLOBAL_PROTECT(AdminProcCaller)
/// How many procs have been called
GLOBAL_VAR_INIT(AdminProcCallCount, 0)
GLOBAL_PROTECT(AdminProcCallCount)
/// UID of the admin who last called
GLOBAL_VAR(LastAdminCalledTargetUID)
GLOBAL_PROTECT(LastAdminCalledTargetUID)
/// Last target to have a proc called on it
GLOBAL_VAR(LastAdminCalledTarget)
GLOBAL_PROTECT(LastAdminCalledTarget)
/// Last proc called
GLOBAL_VAR(LastAdminCalledProc)
GLOBAL_PROTECT(LastAdminCalledProc)
/// List to handle proc call spam prevention
GLOBAL_LIST_EMPTY(AdminProcCallSpamPrevention)
GLOBAL_PROTECT(AdminProcCallSpamPrevention)
// Wrapper for proccalls where the datum is flagged as vareditted
/proc/WrapAdminProcCall(datum/target, procname, list/arguments)
if(target && procname == "Del")
to_chat(usr, "Calling Del() is not allowed")
return
if(target != GLOBAL_PROC && !target.CanProcCall(procname))
to_chat(usr, "Proccall on [target.type]/proc/[procname] is disallowed!")
return
var/current_caller = GLOB.AdminProcCaller
var/ckey = usr ? usr.client.ckey : GLOB.AdminProcCaller
if(!ckey)
CRASH("WrapAdminProcCall with no ckey: [target] [procname] [english_list(arguments)]")
if(current_caller && current_caller != ckey)
if(!GLOB.AdminProcCallSpamPrevention[ckey])
to_chat(usr, "<span class='adminnotice'>Another set of admin called procs are still running, your proc will be run after theirs finish.</span>")
GLOB.AdminProcCallSpamPrevention[ckey] = TRUE
UNTIL(!GLOB.AdminProcCaller)
to_chat(usr, "<span class='adminnotice'>Running your proc</span>")
GLOB.AdminProcCallSpamPrevention -= ckey
else
UNTIL(!GLOB.AdminProcCaller)
GLOB.LastAdminCalledProc = procname
if(target != GLOBAL_PROC)
GLOB.LastAdminCalledTargetUID = target.UID()
GLOB.AdminProcCaller = ckey //if this runtimes, too bad for you
++GLOB.AdminProcCallCount
. = world.WrapAdminProcCall(target, procname, arguments)
if(--GLOB.AdminProcCallCount == 0)
GLOB.AdminProcCaller = null
//adv proc call this, ya nerds
/world/proc/WrapAdminProcCall(datum/target, procname, list/arguments)
if(target == GLOBAL_PROC)
return call(procname)(arglist(arguments))
else if(target != world)
return call(target, procname)(arglist(arguments))
else
to_chat(usr, "<span class='boldannounce'>Call to world/proc/[procname] blocked: Advanced ProcCall detected.</span>")
message_admins("[key_name(usr)] attempted to call world/proc/[procname] with arguments: [english_list(arguments)]")
log_admin("[key_name(usr)] attempted to call world/proc/[procname] with arguments: [english_list(arguments)]l")
/proc/IsAdminAdvancedProcCall()
#ifdef TESTING
@@ -131,7 +193,7 @@ GLOBAL_PROTECT(AdminProcCaller)
log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
spawn()
var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
var/returnval = WrapAdminProcCall(A, procname, lst) // Pass the lst as an argument list to the proc
to_chat(src, "<span class='notice'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</span>")
feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -428,7 +490,7 @@ GLOBAL_PROTECT(AdminProcCaller)
id.icon_state = "gold"
id:access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access()
else
var/obj/item/card/id/id = new/obj/item/card/id(M);
var/obj/item/card/id/id = new/obj/item/card/id(M)
id.icon_state = "gold"
id:access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access()
id.registered_name = H.real_name
@@ -816,21 +878,6 @@ GLOBAL_PROTECT(AdminProcCaller)
else
alert("Invalid mob")
/client/proc/reload_nanoui_resources()
set category = "Debug"
set name = "Reload NanoUI Resources"
set desc = "Force the client to redownload NanoUI Resources"
// Close open NanoUIs.
SSnanoui.close_user_uis(usr)
// Re-load the assets.
var/datum/asset/assets = get_asset_datum(/datum/asset/nanoui)
assets.register()
// Clear the user's cache so they get resent.
usr.client.cache = list()
/client/proc/view_runtimes()
set category = "Debug"
set name = "View Runtimes"
+2 -2
View File
@@ -53,7 +53,7 @@ GLOBAL_LIST_EMPTY(sounds_cache)
set name = "Play Server Sound"
if(!check_rights(R_SOUNDS)) return
var/list/sounds = file2list("sound/serversound_list.txt");
var/list/sounds = file2list("sound/serversound_list.txt")
sounds += GLOB.sounds_cache
var/melody = input("Select a sound from the server to play", "Server sound list") as null|anything in sounds
@@ -71,7 +71,7 @@ GLOBAL_LIST_EMPTY(sounds_cache)
var/A = alert("This will play a sound at every intercomm, are you sure you want to continue? This works best with short sounds, beware.","Warning","Yep","Nope")
if(A != "Yep") return
var/list/sounds = file2list("sound/serversound_list.txt");
var/list/sounds = file2list("sound/serversound_list.txt")
sounds += GLOB.sounds_cache
var/melody = input("Select a sound from the server to play", "Server sound list") as null|anything in sounds
+1 -1
View File
@@ -627,7 +627,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
print_command_report(input, "[command_name()] Update")
if("No")
//same thing as the blob stuff - it's not public, so it's classified, dammit
GLOB.command_announcer.autosay("A classified message has been printed out at all communication consoles.");
GLOB.command_announcer.autosay("A classified message has been printed out at all communication consoles.")
print_command_report(input, "Classified [command_name()] Update")
else
return
@@ -18,7 +18,6 @@ GLOBAL_LIST_INIT(admin_verbs_show_debug_verbs, list(
/client/proc/print_jobban_old_filter,
/client/proc/forceEvent,
/client/proc/nanomapgen_DumpImage,
/client/proc/reload_nanoui_resources,
/client/proc/admin_redo_space_transitions,
/client/proc/make_turf_space_map,
/client/proc/vv_by_ref
+3
View File
@@ -85,3 +85,6 @@
var/next_keysend_reset = 0
var/next_keysend_trip_reset = 0
var/keysend_tripped = FALSE
// Last world.time that the player tried to request their resources.
var/last_ui_resource_send = 0
+32
View File
@@ -913,3 +913,35 @@
return TRUE
#undef SSD_WARNING_TIMER
/client/verb/resend_ui_resources()
set name = "Reload UI Resources"
set desc = "Reload your UI assets if they are not working"
set category = "Special Verbs"
if(last_ui_resource_send > world.time)
to_chat(usr, "<span class='warning'>You requested your UI resource files too quickly. Please try again in [(last_ui_resource_send - world.time)/10] seconds.</span>")
return
var/choice = alert(usr, "This will reload your NanoUI and TGUI resources. If you have any open UIs this may break them. Are you sure?", "Resource Reloading", "Yes", "No")
if(choice == "Yes")
// 600 deciseconds = 1 minute
last_ui_resource_send = world.time + 60 SECONDS
// Close their open UIs
SSnanoui.close_user_uis(usr)
SStgui.close_user_uis(usr)
// Resend the resources
var/datum/asset/nano_assets = get_asset_datum(/datum/asset/nanoui)
nano_assets.register()
var/datum/asset/tgui_assets = get_asset_datum(/datum/asset/simple/tgui)
tgui_assets.register()
// Clear the user's cache so they get resent.
// This is not fully clearing their BYOND cache, just their assets sent from the server this round
cache = list()
to_chat(usr, "<span class='notice'>UI resource files resent successfully. If you are still having issues, please try manually clearing your BYOND cache. <b>This can be achieved by opening your BYOND launcher, pressing the cog in the top right, selecting preferences, going to the Games tab, and pressing 'Clear Cache'.</b></span>")
+1 -1
View File
@@ -38,7 +38,7 @@ GLOBAL_VAR_INIT(account_hack_attempted, 0)
if(!isnull(affected_account) && !affected_account.suspended)
message = "The hack attempt has succeeded."
var/lost = affected_account.money * (MINIMUM_PERCENTAGE_LOSS + rand(0,VARIABLE_LOSS) / 10);
var/lost = affected_account.money * (MINIMUM_PERCENTAGE_LOSS + rand(0,VARIABLE_LOSS) / 10)
affected_account.phantom_charge(lost)
@@ -17,10 +17,10 @@
update_icon()
/obj/item/reagent_containers/food/snacks/icecream/update_icon()
overlays.Cut()
var/image/filling = image('icons/obj/kitchen.dmi', src, "icecream_color")
filling.icon += mix_color_from_reagents(reagents.reagent_list)
overlays += filling
cut_overlays()
var/mutable_appearance/filling = mutable_appearance('icons/obj/kitchen.dmi', "icecream_color")
filling.color = mix_color_from_reagents(reagents.reagent_list)
add_overlay(filling)
/obj/item/reagent_containers/food/snacks/icecream/icecreamcone
name = "ice cream cone"
@@ -43,10 +43,9 @@
return
if(istype(I, /obj/item/reagent_containers/food/snacks/icecream))
if(!I.reagents.has_reagent("sprinkles"))
if(I.reagents.total_volume > 29) I.reagents.remove_any(1)
I.reagents.add_reagent("sprinkles",1)
var/image/sprinkles = image('icons/obj/kitchen.dmi', src, "sprinkles")
I.overlays += sprinkles
if(I.reagents.total_volume > 29)
I.reagents.remove_any(1)
I.reagents.add_reagent("sprinkles", 1)
I.name += " with sprinkles"
I.desc += ". This also has sprinkles."
else
@@ -1,256 +0,0 @@
#define ICECREAM_VANILLA 1
#define FLAVOUR_CHOCOLATE 2
#define FLAVOUR_STRAWBERRY 3
#define FLAVOUR_BLUE 4
#define CONE_WAFFLE 5
#define CONE_CHOC 6
#define INGR_MILK 7
#define INGR_FLOUR 8
#define INGR_SUGAR 9
#define INGR_ICE 10
#define MUCK 11
GLOBAL_LIST_INIT(ingredients_source, list(
"berryjuice" = FLAVOUR_STRAWBERRY,\
"cocoa" = FLAVOUR_CHOCOLATE,\
"singulo" = FLAVOUR_BLUE,\
"milk" = INGR_MILK,\
"soymilk" = INGR_MILK,\
"ice" = INGR_ICE,\
"flour" = INGR_FLOUR,\
"sugar" = INGR_SUGAR,\
))
/proc/get_icecream_flavour_string(var/flavour_type)
switch(flavour_type)
if(FLAVOUR_CHOCOLATE)
return "chocolate"
if(FLAVOUR_STRAWBERRY)
return "strawberry"
if(FLAVOUR_BLUE)
return "blue"
if(CONE_WAFFLE)
return "waffle"
if(CONE_CHOC)
return "chocolate"
if(INGR_MILK)
return "milk"
if(INGR_FLOUR)
return "flour"
if(INGR_SUGAR)
return "sugar"
if(INGR_ICE)
return "ice"
if(MUCK)
return "muck"
else
return "vanilla"
/obj/machinery/icecream_vat
name = "icecream vat"
desc = "Ding-aling ding dong. Get your Nanotrasen-approved ice cream!"
icon = 'icons/obj/kitchen.dmi'
icon_state = "icecream_vat"
density = 1
anchored = 0
max_integrity = 300
var/list/ingredients = list()
var/dispense_flavour = 1
var/obj/item/reagent_containers/glass/held_container
/obj/machinery/icecream_vat/New()
..()
create_reagents(50)
while(ingredients.len < 11)
ingredients.Add(5)
/obj/machinery/icecream_vat/attack_hand(mob/user)
user.set_machine(src)
interact(user)
/obj/machinery/icecream_vat/interact(mob/user)
var/dat
dat += "<a href='?src=[UID()];dispense=[ICECREAM_VANILLA]'><b>Dispense vanilla icecream</b></a> There is [ingredients[ICECREAM_VANILLA]] scoops of vanilla icecream left (made from milk and ice).<br>"
dat += "<a href='?src=[UID()];dispense=[FLAVOUR_STRAWBERRY]'><b>Dispense strawberry icecream</b></a> There is [ingredients[FLAVOUR_STRAWBERRY]] dollops of strawberry flavouring left (obtained from berry juice.<br>"
dat += "<a href='?src=[UID()];dispense=[FLAVOUR_CHOCOLATE]'><b>Dispense chocolate icecream</b></a> There is [ingredients[FLAVOUR_CHOCOLATE]] dollops of chocolate flavouring left (obtained from cocoa powder).<br>"
dat += "<a href='?src=[UID()];dispense=[FLAVOUR_BLUE]'><b>Dispense blue icecream</b></a> There is [ingredients[FLAVOUR_BLUE]] dollops of blue flavouring left (obtained from bluespace tomato singulo).<br>"
dat += "<br>"
dat += "<a href='?src=[UID()];cone=[CONE_WAFFLE]'><b>Dispense waffle cones</b></a> There are [ingredients[CONE_WAFFLE]] waffle cones left. <br>"
dat += "<a href='?src=[UID()];cone=[CONE_CHOC]'><b>Dispense chocolate cones</b></a> There are [ingredients[CONE_CHOC]] chocolate cones left.<br>"
dat += "<br>"
dat += "<a href='?src=[UID()];make=[CONE_WAFFLE]'><b>Make waffle cones</b></a> There is [ingredients[INGR_FLOUR]]/[ingredients[INGR_SUGAR]] of flour and sugar left.<br>"
dat += "<a href='?src=[UID()];make=[CONE_CHOC]'><b>Make chocolate cones</b></a> There is [ingredients[FLAVOUR_CHOCOLATE]]/[ingredients[CONE_WAFFLE]] of chocolate flavouring and waffle cones left.<br>"
dat += "<a href='?src=[UID()];make=[ICECREAM_VANILLA]'><b>Make vanilla icecream</b></a> There is [ingredients[INGR_MILK]]/[ingredients[INGR_ICE]] of milk and ice left.<br>"
dat += "<br>"
if(held_container)
dat += "<a href='?src=[UID()];eject=1'>Eject [held_container]</a> "
else
dat += "No beaker inserted. "
dat += "<a href='?src=[UID()];refresh=1'>Refresh</a> <a href='?src=[UID()];close=1'>Close</a>"
var/datum/browser/popup = new(user, "icecreamvat", name, 600, 400)
popup.set_content(dat)
popup.open(0)
/obj/machinery/icecream_vat/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/reagent_containers))
if(istype(O, /obj/item/reagent_containers/food/snacks/icecream))
var/obj/item/reagent_containers/food/snacks/icecream/I = O
if(!I.ice_creamed)
if(ingredients[ICECREAM_VANILLA] > 0)
var/flavour_name = get_icecream_flavour_string(dispense_flavour)
if(dispense_flavour < 11 && ingredients[dispense_flavour] > 0)
visible_message("[bicon(src)] <span class='info'>[user] scoops delicious [flavour_name] flavoured icecream into [I].</span>")
ingredients[dispense_flavour] -= 1
ingredients[ICECREAM_VANILLA] -= 1
I.add_ice_cream(dispense_flavour)
if(held_container)
held_container.reagents.trans_to(I, 10)
if(I.reagents.total_volume < 10)
I.reagents.add_reagent("sugar", 10 - I.reagents.total_volume)
else
to_chat(user, "<span class='warning'>There is not enough [flavour_name] flavouring left! Insert more of the required ingredients.</span>")
else
to_chat(user, "<span class='warning'>There is not enough icecream left! Insert more milk and ice.</span>")
else
to_chat(user, "<span class='notice'>[O] already has icecream in it.</span>")
else if(istype(O, /obj/item/reagent_containers/glass))
if(held_container)
to_chat(user, "<span class='notice'>You must remove [held_container] from [src] first.</span>")
else
if(!user.drop_item())
to_chat(user, "<span class='warning'>\The [O] is stuck to your hand!</span>")
return
O.forceMove(src)
to_chat(user, "<span class='info'>You insert [O] into [src].</span>")
held_container = O
else
var/obj/item/reagent_containers/R = O
if(R.reagents)
visible_message("<span class='info'>[user] has emptied all of [R] into [src].</span>")
for(var/datum/reagent/current_reagent in R.reagents.reagent_list)
if(GLOB.ingredients_source[current_reagent.id])
add(GLOB.ingredients_source[current_reagent.id], current_reagent.volume / 2)
else
add(MUCK, current_reagent.volume / 5)
R.reagents.clear_reagents()
return 1
else
return ..()
/obj/machinery/icecream_vat/proc/add(var/add_type, var/amount)
if(add_type <= ingredients.len)
ingredients[add_type] += amount
updateDialog()
/obj/machinery/icecream_vat/proc/make(var/mob/user, var/make_type)
switch(make_type)
if(CONE_WAFFLE)
if(ingredients[INGR_FLOUR] > 0 && ingredients[INGR_SUGAR] > 0)
var/amount = max( min(ingredients[INGR_FLOUR], ingredients[INGR_SUGAR]), 5)
ingredients[INGR_FLOUR] -= amount
ingredients[INGR_SUGAR] -= amount
ingredients[CONE_WAFFLE] += amount
visible_message("<span class='info'>[user] cooks up some waffle cones.</span>")
else
to_chat(user, "<span class='notice'>You require sugar and flour to make waffle cones.</span>")
if(CONE_CHOC)
if(ingredients[FLAVOUR_CHOCOLATE] > 0 && ingredients[CONE_WAFFLE] > 0)
var/amount = min(ingredients[CONE_WAFFLE], ingredients[FLAVOUR_CHOCOLATE])
ingredients[CONE_WAFFLE] -= amount
ingredients[FLAVOUR_CHOCOLATE] -= amount
ingredients[CONE_CHOC] += amount
visible_message("<span class='info'>[user] cooks up some chocolate cones.</span>")
else
to_chat(user, "<span class='notice'>You require waffle cones and chocolate flavouring to make chocolate cones.</span>")
if(ICECREAM_VANILLA)
if(ingredients[INGR_ICE] > 0 && ingredients[INGR_MILK] > 0)
var/amount = min(ingredients[INGR_ICE], ingredients[INGR_MILK])
ingredients[INGR_ICE] -= amount
ingredients[INGR_MILK] -= amount
ingredients[ICECREAM_VANILLA] += amount
visible_message("<span class='info'>[user] whips up some vanilla icecream.</span>")
else
to_chat(user, "<span class='notice'>You require milk and ice to make vanilla icecream.</span>")
updateDialog()
/obj/machinery/icecream_vat/Topic(href, href_list)
if(..())
return
if(href_list["dispense"])
dispense_flavour = text2num(href_list["dispense"])
visible_message("<span class='notice'>[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream.</span>")
if(href_list["cone"])
var/dispense_cone = text2num(href_list["cone"])
if(ingredients[dispense_cone] <= ingredients.len)
var/cone_name = get_icecream_flavour_string(dispense_cone)
if(ingredients[dispense_cone] >= 1)
ingredients[dispense_cone] -= 1
var/obj/item/reagent_containers/food/snacks/icecream/I = new(loc)
I.cone_type = cone_name
I.icon_state = "icecream_cone_[cone_name]"
I.desc = "Delicious [cone_name] cone, but no ice cream."
visible_message("<span class='info'>[usr] dispenses a crunchy [cone_name] cone from [src].</span>")
else
to_chat(usr, "<span class='warning'>There are no [cone_name] cones left!</span>")
updateDialog()
if(href_list["make"])
make( usr, text2num(href_list["make"]) )
updateDialog()
if(href_list["eject"])
if(held_container)
held_container.forceMove(loc)
held_container = null
updateDialog()
if(href_list["refresh"])
updateDialog()
if(href_list["close"])
usr.unset_machine()
usr << browse(null,"window=icecreamvat")
return
/obj/machinery/icecream_vat/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
new /obj/item/stack/sheet/metal(loc, 4)
qdel(src)
/obj/item/reagent_containers/food/snacks/icecream
name = "ice cream cone"
desc = "Delicious waffle cone, but no ice cream."
icon = 'icons/obj/kitchen.dmi'
icon_state = "icecream_cone"
layer = 3.1
var/ice_creamed = 0
var/cone_type
bitesize = 3
/obj/item/reagent_containers/food/snacks/icecream/New()
..()
create_reagents(20)
reagents.add_reagent("nutriment", 5)
/obj/item/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour)
var/flavour_name = get_icecream_flavour_string(flavour)
name = "[flavour_name] icecream"
overlays += "icecream_[flavour_name]"
desc = "Delicious [cone_type] cone with a dollop of [flavour_name] ice cream."
ice_creamed = 1
#undef ICECREAM_VANILLA
#undef FLAVOUR_CHOCOLATE
#undef FLAVOUR_STRAWBERRY
#undef FLAVOUR_BLUE
#undef CONE_WAFFLE
#undef CONE_CHOC
#undef INGR_MILK
#undef INGR_FLOUR
#undef INGR_SUGAR
#undef INGR_ICE
#undef MUCK
+3
View File
@@ -195,6 +195,9 @@
icon = 'icons/obj/library.dmi'
icon_state = "cqcmanual"
/obj/item/CQC_manual/chef
desc = "A small, black manual. Written on the back it says: Bringing the home advantage with you."
/obj/item/CQC_manual/attack_self(mob/living/carbon/human/user)
if(!istype(user) || !user)
return
+1 -1
View File
@@ -624,7 +624,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(href_list["jump"])
var/mob/target = locate(href_list["jump"])
var/mob/A = usr;
var/mob/A = usr
to_chat(A, "Teleporting to [target]...")
//var/mob/living/silicon/ai/A = locate(href_list["track2"]) in GLOB.mob_list
if(target && target != usr)
@@ -16,7 +16,7 @@
death()
return
if(paralysis || sleeping || getOxyLoss() > 50 || (HEALTH_THRESHOLD_CRIT <= health && check_death_method()))
if(paralysis || sleeping || getOxyLoss() > 50 || (health <= HEALTH_THRESHOLD_CRIT && check_death_method()))
if(stat == CONSCIOUS)
KnockOut()
create_debug_log("fell unconscious, trigger reason: [reason]")
@@ -227,7 +227,7 @@
throw_speed = 5
throw_range = 10
origin_tech = "magnets=1;biotech=1"
var/mode = 1;
var/mode = 1
/obj/item/robotanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
if(( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50))
@@ -14,6 +14,7 @@
braintype = "Robot"
lawupdate = 0
density = 0
has_camera = FALSE
req_one_access = list(ACCESS_ENGINE, ACCESS_ROBOTICS)
ventcrawler = 2
magpulse = 1
@@ -85,6 +85,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
var/lockcharge //Used when locking down a borg to preserve cell charge
var/speed = 0 //Cause sec borgs gotta go fast //No they dont!
var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them.
var/has_camera = TRUE
var/pdahide = 0 //Used to hide the borg from the messenger list
var/tracking_entities = 0 //The number of known entities currently accessing the internal camera
var/braintype = "Cyborg"
@@ -135,7 +136,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
init()
if(!camera && (!scrambledcodes || designation == "ERT"))
if(has_camera && !camera)
camera = new /obj/machinery/camera(src)
camera.c_tag = real_name
camera.network = list("SS13","Robots")
@@ -238,7 +239,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
if(custom_name)
return 0
if(!allow_rename)
to_chat(src, "<span class='warning'>Rename functionality is not enabled on this unit.</span>");
to_chat(src, "<span class='warning'>Rename functionality is not enabled on this unit.</span>")
return 0
rename_self(braintype, 1)
@@ -1332,6 +1333,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
designation = "SpecOps"
lawupdate = 0
scrambledcodes = 1
has_camera = FALSE
req_one_access = list(ACCESS_CENT_SPECOPS)
ionpulse = 1
magpulse = 1
@@ -1420,6 +1422,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
designation = "Destroyer"
lawupdate = 0
scrambledcodes = 1
has_camera = FALSE
req_one_access = list(ACCESS_CENT_SPECOPS)
ionpulse = 1
magpulse = 1
@@ -3,6 +3,7 @@
icon_state = "syndie_bloodhound"
lawupdate = 0
scrambledcodes = 1
has_camera = FALSE
pdahide = 1
faction = list("syndicate")
bubble_icon = "syndibot"
-2
View File
@@ -1297,8 +1297,6 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
.["Add Organ"] = "?_src_=vars;addorgan=[UID()]"
.["Remove Organ"] = "?_src_=vars;remorgan=[UID()]"
.["Fix NanoUI"] = "?_src_=vars;fix_nano=[UID()]"
.["Add Verb"] = "?_src_=vars;addverb=[UID()]"
.["Remove Verb"] = "?_src_=vars;remverb=[UID()]"
+2 -2
View File
@@ -92,7 +92,7 @@
var output = "<!DOCTYPE html><html><body>"
if(polltype == POLLTYPE_MULTI || polltype == POLLTYPE_OPTION)
select_query = GLOB.dbcon.NewQuery("SELECT text, percentagecalc, (SELECT COUNT(optionid) FROM [format_table_name("poll_vote")] WHERE optionid = poll_option.id GROUP BY optionid) AS votecount FROM [format_table_name("poll_option")] WHERE pollid = [pollid]");
select_query = GLOB.dbcon.NewQuery("SELECT text, percentagecalc, (SELECT COUNT(optionid) FROM [format_table_name("poll_vote")] WHERE optionid = poll_option.id GROUP BY optionid) AS votecount FROM [format_table_name("poll_option")] WHERE pollid = [pollid]")
select_query.Execute()
var/list/options = list()
var/total_votes = 1
@@ -177,7 +177,7 @@
output += "</table></td></tr>"
output += "</table>"
if(polltype == POLLTYPE_TEXT)
select_query = GLOB.dbcon.NewQuery("SELECT replytext, COUNT(replytext) AS countresponse, GROUP_CONCAT(DISTINCT ckey SEPARATOR ', ') as ckeys FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] GROUP BY replytext ORDER BY countresponse DESC");
select_query = GLOB.dbcon.NewQuery("SELECT replytext, COUNT(replytext) AS countresponse, GROUP_CONCAT(DISTINCT ckey SEPARATOR ', ') as ckeys FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] GROUP BY replytext ORDER BY countresponse DESC")
select_query.Execute()
output += {"
<table width='900' align='center' bgcolor='#eeffee' cellspacing='0' cellpadding='4'>
+1 -1
View File
@@ -57,7 +57,7 @@
log_world("NanoMapGen: <B>GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])</B>")
to_chat(usr, "NanoMapGen: <B>GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])</B>")
var/count = 0;
var/count = 0
for(var/WorldX = startX, WorldX <= endX, WorldX++)
for(var/WorldY = startY, WorldY <= endY, WorldY++)
+1 -1
View File
@@ -163,7 +163,7 @@
if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
open_uis[src_object_key] = list(ui.ui_key = list())
else if(isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
open_uis[src_object_key][ui.ui_key] = list();
open_uis[src_object_key][ui.ui_key] = list()
ui.user.open_uis.Add(ui)
var/list/uis = open_uis[src_object_key][ui.ui_key]
+1 -1
View File
@@ -231,7 +231,7 @@ GLOBAL_LIST_INIT(SpookyGhosts, list("ghost","shade","shade2","ghost-narsie","hor
var/atoms[] = list()
for(var/turf/the_turf in turfs)
// Add ourselves to the list of stuff to draw
atoms.Add(the_turf);
atoms.Add(the_turf)
// As well as anything that isn't invisible.
for(var/atom/A in the_turf)
if(A.invisibility)

Some files were not shown because too many files have changed in this diff Show More