mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-12 07:33:34 +01:00
Merge branch 'master' into overhaul-event-mob-selection
This commit is contained in:
@@ -2,7 +2,6 @@
|
||||
[](https://travis-ci.org/ParadiseSS13/Paradise)
|
||||
[](http://isitmaintained.com/project/paradisess13/paradise "Average time to resolve an issue")
|
||||
[](http://isitmaintained.com/project/paradisess13/paradise "Percentage of issues still open")
|
||||
[](http://www.krihelinator.xyz)
|
||||

|
||||
|
||||
[](http://forthebadge.com)
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ z4 = lavaland
|
||||
#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(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)))
|
||||
DECLARE_LEVEL(MINING, SELFLOOPING, list(ORE_LEVEL, REACHABLE, STATION_CONTACT, HAS_WEATHER, AI_OK)))
|
||||
#define USING_MAP_DATUM /datum/map/cyberiad
|
||||
|
||||
#elif !defined(MAP_OVERRIDE)
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@ Lovingly ported by Purpose2 to Paradise
|
||||
#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(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)))
|
||||
DECLARE_LEVEL(MINING, SELFLOOPING, list(ORE_LEVEL, REACHABLE, STATION_CONTACT, HAS_WEATHER, AI_OK)))
|
||||
|
||||
#define USING_MAP_DATUM /datum/map/delta
|
||||
|
||||
|
||||
@@ -1205,9 +1205,9 @@
|
||||
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors)
|
||||
"dg" = (
|
||||
/obj/structure/bonfire/dense,
|
||||
/obj/structure/stone_tile/center,
|
||||
/obj/effect/mapping_helpers/no_lava,
|
||||
/obj/structure/bonfire,
|
||||
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors)
|
||||
"di" = (
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/simulated/floor/plating/asteroid/airless,
|
||||
/area/ruin/unpowered)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/simulated/floor/plating/asteroid/airless,
|
||||
/area/ruin/unpowered)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/simulated/floor/plating/asteroid/airless,
|
||||
/area/ruin/unpowered)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/simulated/mineral,
|
||||
/area/ruin/unpowered)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/simulated/mineral,
|
||||
/area/ruin/unpowered)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"aa" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"ab" = (
|
||||
/turf/simulated/mineral/random/low_chance,
|
||||
/area/ruin/unpowered)
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/obj/structure/lattice,
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"c" = (
|
||||
/turf/simulated/wall,
|
||||
/area/ruin/unpowered)
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/obj/structure/window/reinforced{
|
||||
tag = "icon-rwindow (EAST)";
|
||||
icon_state = "rwindow";
|
||||
dir = 4
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"c" = (
|
||||
/obj/machinery/door/airlock/external,
|
||||
@@ -20,7 +20,7 @@
|
||||
icon_state = "rwindow";
|
||||
dir = 8
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"e" = (
|
||||
/obj/structure/window/reinforced{
|
||||
@@ -64,7 +64,7 @@
|
||||
/area/ruin/powered)
|
||||
"k" = (
|
||||
/obj/structure/window/reinforced,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"l" = (
|
||||
/obj/structure/window/reinforced,
|
||||
@@ -112,7 +112,7 @@
|
||||
icon_state = "rwindow";
|
||||
dir = 1
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"q" = (
|
||||
/obj/machinery/light/small{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/simulated/floor/plating/airless,
|
||||
/area/ruin/unpowered)
|
||||
@@ -10,12 +10,12 @@
|
||||
/area/ruin/unpowered)
|
||||
"d" = (
|
||||
/obj/structure/lattice,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"e" = (
|
||||
/obj/structure/lattice,
|
||||
/obj/structure/lattice,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
|
||||
(1,1,1) = {"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/simulated/mineral,
|
||||
/area/ruin/unpowered)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/simulated/mineral,
|
||||
/area/ruin/unpowered)
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/obj/structure/lattice,
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"c" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/ruin/unpowered)
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/obj/structure/lattice,
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"c" = (
|
||||
/turf/simulated/wall,
|
||||
/area/ruin/unpowered)
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/turf/simulated/shuttle/wall{
|
||||
dir = 8;
|
||||
icon_state = "diagonalWall3"
|
||||
@@ -15,7 +15,7 @@
|
||||
},
|
||||
/area/ruin/powered)
|
||||
"d" = (
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/turf/simulated/shuttle/wall{
|
||||
dir = 2;
|
||||
icon_state = "diagonalWall3"
|
||||
@@ -198,7 +198,7 @@
|
||||
},
|
||||
/area/ruin/powered)
|
||||
"A" = (
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/turf/simulated/shuttle/wall{
|
||||
dir = 1;
|
||||
icon_state = "diagonalWall3"
|
||||
@@ -212,7 +212,7 @@
|
||||
},
|
||||
/area/ruin/powered)
|
||||
"C" = (
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/turf/simulated/shuttle/wall{
|
||||
dir = 4;
|
||||
icon_state = "diagonalWall3"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/simulated/mineral,
|
||||
/area/ruin/powered)
|
||||
@@ -73,8 +73,7 @@
|
||||
},
|
||||
/mob/living/simple_animal/hostile/syndicate{
|
||||
desc = "A weary looking syndicate operative.";
|
||||
environment_smash = 0;
|
||||
faction = "syndicate"
|
||||
environment_smash = 0
|
||||
},
|
||||
/turf/simulated/floor/plasteel,
|
||||
/area/ruin/powered)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/simulated/shuttle/wall{
|
||||
tag = "icon-swall_s6";
|
||||
@@ -168,7 +168,7 @@
|
||||
/area/ruin/powered)
|
||||
"D" = (
|
||||
/obj/structure/lattice,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"E" = (
|
||||
/obj/item/stack/rods,
|
||||
@@ -202,7 +202,7 @@
|
||||
/area/ruin/powered)
|
||||
"K" = (
|
||||
/obj/item/stack/sheet/metal,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"L" = (
|
||||
/obj/structure/mecha_wreckage/gygax,
|
||||
@@ -228,7 +228,7 @@
|
||||
/area/ruin/powered)
|
||||
"P" = (
|
||||
/obj/item/stack/rods,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"Q" = (
|
||||
/turf/simulated/shuttle/wall{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"aa" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"ab" = (
|
||||
/obj/structure/lattice,
|
||||
/obj/structure/cable{
|
||||
@@ -10,7 +10,7 @@
|
||||
icon_state = "2-4";
|
||||
tag = ""
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"ac" = (
|
||||
/obj/structure/lattice,
|
||||
@@ -20,7 +20,7 @@
|
||||
icon_state = "4-8";
|
||||
tag = ""
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"ad" = (
|
||||
/obj/structure/lattice,
|
||||
@@ -29,7 +29,7 @@
|
||||
d2 = 8;
|
||||
icon_state = "2-8"
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"ae" = (
|
||||
/obj/structure/lattice,
|
||||
@@ -38,7 +38,7 @@
|
||||
dir = 2;
|
||||
icon_state = "coil_red2"
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"af" = (
|
||||
/obj/structure/lattice,
|
||||
@@ -48,7 +48,7 @@
|
||||
icon_state = "1-8";
|
||||
tag = ""
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"ag" = (
|
||||
/turf/simulated/wall,
|
||||
@@ -65,7 +65,7 @@
|
||||
d2 = 2;
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"aj" = (
|
||||
/turf/unsimulated/floor/plating/airless,
|
||||
@@ -154,11 +154,11 @@
|
||||
/area/ruin/onehalf/drone_bay)
|
||||
"aw" = (
|
||||
/obj/structure/lattice,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"ax" = (
|
||||
/obj/structure/lattice,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/ruin/onehalf/hallway)
|
||||
"ay" = (
|
||||
/obj/structure/table_frame,
|
||||
@@ -224,7 +224,7 @@
|
||||
/area/ruin/onehalf/drone_bay)
|
||||
"aH" = (
|
||||
/obj/item/stack/rods,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/ruin/onehalf/hallway)
|
||||
"aI" = (
|
||||
/obj/effect/landmark/damageturf,
|
||||
@@ -805,7 +805,7 @@
|
||||
/area/ruin/onehalf/bridge)
|
||||
"bU" = (
|
||||
/obj/item/stack/sheet/metal,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"bV" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
@@ -914,7 +914,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/stack/rods,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/ruin/onehalf/hallway)
|
||||
"cn" = (
|
||||
/obj/structure/lattice,
|
||||
@@ -925,7 +925,7 @@
|
||||
tag = "icon-small";
|
||||
icon_state = "small"
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"co" = (
|
||||
/obj/structure/grille,
|
||||
@@ -1008,7 +1008,7 @@
|
||||
/area/ruin/onehalf/bridge)
|
||||
"cv" = (
|
||||
/obj/item/stack/rods,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"cw" = (
|
||||
/turf/unsimulated/floor/plating/airless,
|
||||
@@ -1016,7 +1016,7 @@
|
||||
"cx" = (
|
||||
/obj/structure/lattice,
|
||||
/obj/item/stack/sheet/plasteel,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"cy" = (
|
||||
/obj/structure/lattice,
|
||||
@@ -1024,7 +1024,7 @@
|
||||
tag = "icon-medium";
|
||||
icon_state = "medium"
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/ruin/onehalf/hallway)
|
||||
"cz" = (
|
||||
/obj/structure/grille/broken,
|
||||
@@ -1071,10 +1071,10 @@
|
||||
/area/ruin/onehalf/bridge)
|
||||
"cE" = (
|
||||
/obj/item/stack/tile/wood,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"cF" = (
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/ruin/onehalf/hallway)
|
||||
"cG" = (
|
||||
/obj/structure/lattice,
|
||||
@@ -1083,7 +1083,7 @@
|
||||
d2 = 8;
|
||||
icon_state = "2-8"
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/ruin/onehalf/hallway)
|
||||
"cH" = (
|
||||
/obj/structure/lattice,
|
||||
@@ -1097,7 +1097,7 @@
|
||||
icon_state = "pipe-b";
|
||||
dir = 8
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/ruin/onehalf/hallway)
|
||||
"cI" = (
|
||||
/obj/machinery/door/airlock/command/glass{
|
||||
@@ -1149,7 +1149,7 @@
|
||||
dir = 2;
|
||||
icon_state = "coil_red2"
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/ruin/onehalf/hallway)
|
||||
"cQ" = (
|
||||
/obj/machinery/light{
|
||||
@@ -1160,7 +1160,7 @@
|
||||
/area/ruin/onehalf/bridge)
|
||||
"cR" = (
|
||||
/obj/item/stack/sheet/plasteel,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"cS" = (
|
||||
/obj/structure/lattice,
|
||||
@@ -1169,7 +1169,7 @@
|
||||
d2 = 2;
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/ruin/onehalf/hallway)
|
||||
"cU" = (
|
||||
/obj/structure/grille,
|
||||
@@ -1221,7 +1221,7 @@
|
||||
d2 = 8;
|
||||
icon_state = "2-8"
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"db" = (
|
||||
/obj/structure/table,
|
||||
@@ -1256,7 +1256,7 @@
|
||||
d2 = 2;
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"dg" = (
|
||||
/obj/structure/girder/reinforced,
|
||||
@@ -1350,7 +1350,7 @@
|
||||
tag = "icon-medium";
|
||||
icon_state = "medium"
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"dp" = (
|
||||
/obj/structure/lattice,
|
||||
@@ -1366,7 +1366,7 @@
|
||||
icon_state = "1-4"
|
||||
},
|
||||
/obj/item/stack/rods,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"dq" = (
|
||||
/obj/structure/lattice,
|
||||
@@ -1382,7 +1382,7 @@
|
||||
icon_state = "1-8";
|
||||
tag = ""
|
||||
},
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
|
||||
(1,1,1) = {"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"aa" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"ab" = (
|
||||
/turf/simulated/mineral,
|
||||
/area/space/nearstation)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/obj/structure/lattice,
|
||||
/turf/space,
|
||||
/turf/template_noop,
|
||||
/area/space/nearstation)
|
||||
"c" = (
|
||||
/obj/structure/grille,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/simulated/mineral/random,
|
||||
/area/ruin/unpowered/no_grav/way_home)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"aa" = (
|
||||
/turf/space,
|
||||
/area/space)
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"ab" = (
|
||||
/turf/simulated/floor/plating/asteroid/airless,
|
||||
/area/ruin/unpowered)
|
||||
|
||||
@@ -23,7 +23,7 @@ z7 = empty space
|
||||
#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(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK)))
|
||||
DECLARE_LEVEL(MINING, SELFLOOPING, list(ORE_LEVEL, REACHABLE, STATION_CONTACT, HAS_WEATHER, AI_OK)))
|
||||
|
||||
#define USING_MAP_DATUM /datum/map/metastation
|
||||
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
/datum/stack
|
||||
var/list/stack = list()
|
||||
var/max_elements = 0
|
||||
|
||||
/datum/stack/New(list/elements,max)
|
||||
..()
|
||||
if(elements)
|
||||
stack = elements.Copy()
|
||||
if(max)
|
||||
max_elements = max
|
||||
|
||||
/datum/stack/proc/Pop()
|
||||
if(is_empty())
|
||||
return null
|
||||
. = stack[stack.len]
|
||||
stack.Cut(stack.len,0)
|
||||
|
||||
/datum/stack/proc/Push(element)
|
||||
if(max_elements && (stack.len+1 > max_elements))
|
||||
return null
|
||||
stack += element
|
||||
|
||||
/datum/stack/proc/Top()
|
||||
if(is_empty())
|
||||
return null
|
||||
. = stack[stack.len]
|
||||
|
||||
/datum/stack/proc/is_empty()
|
||||
. = stack.len ? 0 : 1
|
||||
|
||||
//Rotate entire stack left with the leftmost looping around to the right
|
||||
/datum/stack/proc/RotateLeft()
|
||||
if(is_empty())
|
||||
return 0
|
||||
. = stack[1]
|
||||
stack.Cut(1,2)
|
||||
Push(.)
|
||||
|
||||
//Rotate entire stack to the right with the rightmost looping around to the left
|
||||
/datum/stack/proc/RotateRight()
|
||||
if(is_empty())
|
||||
return 0
|
||||
. = stack[stack.len]
|
||||
stack.Cut(stack.len,0)
|
||||
stack.Insert(1,.)
|
||||
|
||||
|
||||
/datum/stack/proc/Copy()
|
||||
var/datum/stack/S=new()
|
||||
S.stack = stack.Copy()
|
||||
S.max_elements = max_elements
|
||||
return S
|
||||
|
||||
|
||||
/datum/stack/proc/Clear()
|
||||
stack.Cut()
|
||||
@@ -1,28 +1,28 @@
|
||||
|
||||
//////////////////////
|
||||
//Heap object
|
||||
//datum/heap object
|
||||
//////////////////////
|
||||
|
||||
/Heap
|
||||
/datum/heap
|
||||
var/list/L
|
||||
var/cmp
|
||||
|
||||
/Heap/New(compare)
|
||||
/datum/heap/New(compare)
|
||||
L = new()
|
||||
cmp = compare
|
||||
|
||||
/Heap/proc/IsEmpty()
|
||||
/datum/heap/proc/IsEmpty()
|
||||
return !L.len
|
||||
|
||||
//Insert and place at its position a new node in the heap
|
||||
/Heap/proc/Insert(atom/A)
|
||||
/datum/heap/proc/Insert(atom/A)
|
||||
|
||||
L.Add(A)
|
||||
Swim(L.len)
|
||||
|
||||
//removes and returns the first element of the heap
|
||||
//(i.e the max or the min dependant on the comparison function)
|
||||
/Heap/proc/Pop()
|
||||
/datum/heap/proc/Pop()
|
||||
if(!L.len)
|
||||
return 0
|
||||
. = L[1]
|
||||
@@ -33,7 +33,7 @@
|
||||
Sink(1)
|
||||
|
||||
//Get a node up to its right position in the heap
|
||||
/Heap/proc/Swim(var/index)
|
||||
/datum/heap/proc/Swim(var/index)
|
||||
var/parent = round(index * 0.5)
|
||||
|
||||
while(parent > 0 && (call(cmp)(L[index],L[parent]) > 0))
|
||||
@@ -42,7 +42,7 @@
|
||||
parent = round(index * 0.5)
|
||||
|
||||
//Get a node down to its right position in the heap
|
||||
/Heap/proc/Sink(var/index)
|
||||
/datum/heap/proc/Sink(var/index)
|
||||
var/g_child = GetGreaterChild(index)
|
||||
|
||||
while(g_child > 0 && (call(cmp)(L[index],L[g_child]) < 0))
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
//Returns the greater (relative to the comparison proc) of a node children
|
||||
//or 0 if there's no child
|
||||
/Heap/proc/GetGreaterChild(var/index)
|
||||
/datum/heap/proc/GetGreaterChild(var/index)
|
||||
if(index * 2 > L.len)
|
||||
return 0
|
||||
|
||||
@@ -65,11 +65,11 @@
|
||||
return index * 2
|
||||
|
||||
//Replaces a given node so it verify the heap condition
|
||||
/Heap/proc/ReSort(atom/A)
|
||||
/datum/heap/proc/ReSort(atom/A)
|
||||
var/index = L.Find(A)
|
||||
|
||||
Swim(index)
|
||||
Sink(index)
|
||||
|
||||
/Heap/proc/List()
|
||||
/datum/heap/proc/List()
|
||||
. = L.Copy()
|
||||
@@ -289,11 +289,14 @@ This is always put in the attack log.
|
||||
|
||||
var/user_str = key_name_log(user) + COORD(user)
|
||||
var/target_str
|
||||
var/target_info
|
||||
if(isatom(target))
|
||||
var/atom/AT = target
|
||||
target_str = key_name_log(AT) + COORD(AT)
|
||||
target_info = key_name_admin(target)
|
||||
else
|
||||
target_str = target
|
||||
target_info = target
|
||||
var/mob/MU = user
|
||||
var/mob/MT = target
|
||||
if(istype(MU))
|
||||
@@ -317,10 +320,13 @@ This is always put in the attack log.
|
||||
var/area/A = get_area(MT)
|
||||
if(A && A.hide_attacklogs)
|
||||
loglevel = ATKLOG_ALMOSTALL
|
||||
else
|
||||
loglevel = ATKLOG_ALL // Hitting an object. Not a mob
|
||||
if(isLivingSSD(target)) // Attacks on SSDs are shown to admins with any log level except ATKLOG_NONE. Overrides custom level
|
||||
loglevel = ATKLOG_FEW
|
||||
|
||||
msg_admin_attack("[key_name_admin(user)] vs [key_name_admin(target)]: [what_done]", loglevel)
|
||||
|
||||
msg_admin_attack("[key_name_admin(user)] vs [target_info]: [what_done]", loglevel)
|
||||
|
||||
/proc/do_mob(mob/user, mob/target, time = 30, uninterruptible = 0, progress = 1, list/extra_checks = list())
|
||||
if(!user || !target)
|
||||
@@ -579,7 +585,8 @@ GLOBAL_LIST_INIT(do_after_once_tracker, list())
|
||||
LogMouseMacro(".mouse", params)
|
||||
|
||||
/proc/update_all_mob_security_hud()
|
||||
for(var/mob/living/carbon/human/H in GLOB.mob_list)
|
||||
for(var/thing in GLOB.human_list)
|
||||
var/mob/living/carbon/human/H = thing
|
||||
H.sec_hud_set_security_status()
|
||||
|
||||
/proc/getviewsize(view)
|
||||
|
||||
@@ -533,7 +533,7 @@ proc/checkhtml(var/t)
|
||||
text = replacetext(text, "\[/grid\]", "</td></tr></table>")
|
||||
text = replacetext(text, "\[row\]", "</td><tr>")
|
||||
text = replacetext(text, "\[cell\]", "<td>")
|
||||
text = replacetext(text, "\[logo\]", "<img src = ntlogo.png>")
|
||||
text = replacetext(text, "\[logo\]", "​<img src = ntlogo.png>")
|
||||
text = replacetext(text, "\[time\]", "[station_time_timestamp()]") // TO DO
|
||||
if(!no_font)
|
||||
if(P)
|
||||
|
||||
@@ -1919,6 +1919,16 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
|
||||
|
||||
return pois
|
||||
|
||||
/*
|
||||
* Returns all player mobs in an assoc list with ckey as key and the mob as value
|
||||
*/
|
||||
/proc/get_assoc_mob_list_by_ckey()
|
||||
var/list/mob/mobs = list()
|
||||
for(var/i in GLOB.player_list)
|
||||
var/mob/M = i
|
||||
mobs[M.ckey] = M
|
||||
return mobs
|
||||
|
||||
/proc/flash_color(mob_or_client, flash_color="#960000", flash_time=20)
|
||||
var/client/C
|
||||
if(istype(mob_or_client, /mob))
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
user.do_attack_animation(M)
|
||||
. = M.attacked_by(src, user, def_zone)
|
||||
|
||||
add_attack_logs(user, M, "Attacked with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])", (M.ckey && force > 0 && damtype != STAMINA) ? null : ATKLOG_ALMOSTALL)
|
||||
add_attack_logs(user, M, "Attacked with [name] ([uppertext(user.a_intent)]) ([uppertext(damtype)])", (M.ckey && force > 0 && damtype != STAMINA) ? null : ATKLOG_ALMOSTALL)
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
|
||||
#define MIDDLE_CLICK 0
|
||||
#define ALT_CLICK 1
|
||||
#define CTRL_CLICK 2
|
||||
#define MAX_HARDSUIT_CLICK_MODE 2
|
||||
|
||||
/client
|
||||
var/hardsuit_click_mode = MIDDLE_CLICK
|
||||
|
||||
/client/verb/toggle_hardsuit_mode()
|
||||
set name = "Toggle Hardsuit Activation Mode"
|
||||
set desc = "Switch between hardsuit activation modes."
|
||||
set category = "OOC"
|
||||
|
||||
hardsuit_click_mode++
|
||||
if(hardsuit_click_mode > MAX_HARDSUIT_CLICK_MODE)
|
||||
hardsuit_click_mode = 0
|
||||
|
||||
switch(hardsuit_click_mode)
|
||||
if(MIDDLE_CLICK)
|
||||
to_chat(src, "Hardsuit activation mode set to middle-click.")
|
||||
if(ALT_CLICK)
|
||||
to_chat(src, "Hardsuit activation mode set to alt-click.")
|
||||
if(CTRL_CLICK)
|
||||
to_chat(src, "Hardsuit activation mode set to control-click.")
|
||||
else
|
||||
// should never get here, but just in case:
|
||||
log_runtime(EXCEPTION("Bad hardsuit click mode: [hardsuit_click_mode] - expected 0 to [MAX_HARDSUIT_CLICK_MODE]"), src)
|
||||
to_chat(src, "Somehow you bugged the system. Setting your hardsuit mode to middle-click.")
|
||||
hardsuit_click_mode = MIDDLE_CLICK
|
||||
|
||||
/mob/living/MiddleClickOn(atom/A)
|
||||
if(client && client.hardsuit_click_mode == MIDDLE_CLICK)
|
||||
if(HardsuitClickOn(A))
|
||||
return
|
||||
..()
|
||||
|
||||
/mob/living/AltClickOn(atom/A)
|
||||
if(client && client.hardsuit_click_mode == ALT_CLICK)
|
||||
if(HardsuitClickOn(A))
|
||||
return
|
||||
..()
|
||||
|
||||
/mob/living/CtrlClickOn(atom/A)
|
||||
if(client && client.hardsuit_click_mode == CTRL_CLICK)
|
||||
if(HardsuitClickOn(A))
|
||||
return
|
||||
..()
|
||||
|
||||
/mob/living/proc/can_use_rig()
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/can_use_rig()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/brain/can_use_rig()
|
||||
return istype(loc, /obj/item/mmi)
|
||||
|
||||
/mob/living/silicon/ai/can_use_rig()
|
||||
return istype(loc, /obj/item/aicard)
|
||||
|
||||
/mob/living/silicon/pai/can_use_rig()
|
||||
return loc == card
|
||||
|
||||
/mob/living/proc/HardsuitClickOn(var/atom/A, var/alert_ai = 0)
|
||||
if(!can_use_rig() || (next_move > world.time))
|
||||
return 0
|
||||
var/obj/item/rig/rig = get_rig()
|
||||
if(istype(rig) && !rig.offline && rig.selected_module)
|
||||
if(src != rig.wearer)
|
||||
if(rig.ai_can_move_suit(src, check_user_module = 1))
|
||||
message_admins("[key_name_admin(src)] is trying to force \the [key_name_admin(rig.wearer)] to use a hardsuit module.")
|
||||
else
|
||||
return 0
|
||||
rig.selected_module.engage(A, alert_ai)
|
||||
if(ismob(A)) // No instant mob attacking - though modules have their own cooldowns
|
||||
changeNext_move(CLICK_CD_MELEE)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
#undef MIDDLE_CLICK
|
||||
#undef ALT_CLICK
|
||||
#undef CTRL_CLICK
|
||||
#undef MAX_HARDSUIT_CLICK_MODE
|
||||
@@ -61,7 +61,6 @@
|
||||
var/usewhitelist = 0
|
||||
var/mods_are_mentors = 0
|
||||
var/load_jobs_from_txt = 0
|
||||
var/ToRban = 0
|
||||
var/automute_on = 0 //enables automuting/spam prevention
|
||||
var/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access.
|
||||
var/round_abandon_penalty_period = 30 MINUTES // Time from round start during which ghosting out is penalized
|
||||
@@ -578,9 +577,6 @@
|
||||
if("humans_need_surnames")
|
||||
humans_need_surnames = 1
|
||||
|
||||
if("tor_ban")
|
||||
ToRban = 1
|
||||
|
||||
if("automute_on")
|
||||
automute_on = 1
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
var/static/list/failure_strikes //How many times we suspect a subsystem type has crashed the MC, 3 strikes and you're out!
|
||||
|
||||
var/offline_implications = "None" // What are the implications of this SS being offlined?
|
||||
var/offline_implications = "None. No immediate action is needed." // What are the implications of this SS being offlined?
|
||||
|
||||
//Do not override
|
||||
///datum/controller/subsystem/New()
|
||||
|
||||
@@ -21,7 +21,8 @@ SUBSYSTEM_DEF(afk)
|
||||
|
||||
/datum/controller/subsystem/afk/fire()
|
||||
var/list/toRemove = list()
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
for(var/thing in GLOB.human_list)
|
||||
var/mob/living/carbon/human/H = thing
|
||||
if(!H?.ckey) // Useless non ckey creatures
|
||||
continue
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ SUBSYSTEM_DEF(garbage)
|
||||
wait = 2 SECONDS
|
||||
flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT
|
||||
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
|
||||
init_order = INIT_ORDER_GARBAGE
|
||||
init_order = INIT_ORDER_GARBAGE // Why does this have an init order if it has SS_NO_INIT?
|
||||
offline_implications = "Garbage collection is no longer functional, and objects will not be qdel'd. Immediate server restart recommended."
|
||||
|
||||
var/list/collection_timeout = list(2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level
|
||||
|
||||
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(mob_hunt)
|
||||
name = "Nano-Mob Hunter GO Server"
|
||||
init_order = INIT_ORDER_NANOMOB
|
||||
priority = FIRE_PRIORITY_NANOMOB // Low priority, no need for MC_TICK_CHECK due to extremely low performance impact.
|
||||
flags = SS_NO_INIT
|
||||
offline_implications = "Nano-Mob Hunter will no longer spawn mobs. No immediate action is needed."
|
||||
var/max_normal_spawns = 15 //change this to adjust the number of normal spawns that can exist at one time. trapped spawns (from traitors) don't count towards this
|
||||
var/list/normal_spawns = list()
|
||||
|
||||
@@ -3,6 +3,8 @@ PROCESSING_SUBSYSTEM_DEF(dcs)
|
||||
flags = SS_NO_INIT
|
||||
|
||||
var/list/elements_by_type = list()
|
||||
// Update this if you add in components which actually use this as a processor
|
||||
offline_implications = "This SS doesnt actually process anything yet. No immediate action is needed."
|
||||
|
||||
/datum/controller/subsystem/processing/dcs/Recover()
|
||||
comp_lookup = SSdcs.comp_lookup
|
||||
@@ -4,3 +4,4 @@ PROCESSING_SUBSYSTEM_DEF(fastprocess)
|
||||
name = "Fast Processing"
|
||||
wait = 2
|
||||
stat_tag = "FP"
|
||||
offline_implications = "Objects using the 'Fast Processing' processor will no longer process. Shuttle call recommended."
|
||||
|
||||
@@ -3,3 +3,4 @@ PROCESSING_SUBSYSTEM_DEF(obj)
|
||||
priority = FIRE_PRIORITY_OBJ
|
||||
flags = SS_NO_INIT
|
||||
wait = 20
|
||||
offline_implications = "Objects using the 'Objects' processor will no longer process. Shuttle call recommended."
|
||||
|
||||
@@ -9,6 +9,7 @@ SUBSYSTEM_DEF(processing)
|
||||
var/stat_tag = "P" //Used for logging
|
||||
var/list/processing = list()
|
||||
var/list/currentrun = list()
|
||||
offline_implications = "Objects using the default processor will no longer process. Shuttle call recommended."
|
||||
|
||||
/datum/controller/subsystem/processing/stat_entry()
|
||||
..("[stat_tag]:[processing.len]")
|
||||
|
||||
@@ -10,6 +10,7 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets
|
||||
ticket_name = "Mentor Ticket"
|
||||
span_class = "mentorhelp"
|
||||
close_rights = R_MENTOR | R_ADMIN
|
||||
offline_implications = "Mentor tickets will no longer be marked as stale. No immediate action is needed."
|
||||
|
||||
/datum/controller/subsystem/tickets/mentor_tickets/message_staff(var/msg)
|
||||
message_mentorTicket(msg)
|
||||
|
||||
@@ -20,6 +20,7 @@ SUBSYSTEM_DEF(tickets)
|
||||
init_order = INIT_ORDER_TICKETS
|
||||
wait = 300
|
||||
priority = FIRE_PRIORITY_TICKETS
|
||||
offline_implications = "Admin tickets will no longer be marked as stale. No immediate action is needed."
|
||||
|
||||
flags = SS_BACKGROUND
|
||||
|
||||
|
||||
+1
-2
@@ -131,6 +131,5 @@
|
||||
|
||||
/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=3)
|
||||
var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type,beam_sleep_time)
|
||||
spawn(0)
|
||||
newbeam.Start()
|
||||
INVOKE_ASYNC(newbeam, /datum/beam.proc/Start)
|
||||
return newbeam
|
||||
|
||||
@@ -395,8 +395,9 @@ GLOBAL_LIST_INIT(advance_cures, list(
|
||||
for(var/datum/disease/advance/AD in GLOB.active_diseases)
|
||||
AD.Refresh()
|
||||
|
||||
for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list))
|
||||
if(!is_station_level(H.z))
|
||||
for(var/thing in shuffle(GLOB.human_list))
|
||||
var/mob/living/carbon/human/H = thing
|
||||
if(H.stat == DEAD || !is_station_level(H.z))
|
||||
continue
|
||||
if(!H.HasDisease(D))
|
||||
H.ForceContractDisease(D)
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
|
||||
/datum/log_record/New(_log_type, _who, _what, _target, _where, _raw_time)
|
||||
log_type = _log_type
|
||||
|
||||
who = get_subject_text(_who)
|
||||
|
||||
who = get_subject_text(_who, _log_type)
|
||||
what = _what
|
||||
target = get_subject_text(_target)
|
||||
target = get_subject_text(_target, _log_type)
|
||||
if(!_where)
|
||||
_where = get_turf(_who)
|
||||
where = _where
|
||||
@@ -19,16 +19,31 @@
|
||||
_raw_time = world.time
|
||||
raw_time = _raw_time
|
||||
|
||||
/datum/log_record/proc/get_subject_text(subject)
|
||||
/datum/log_record/proc/get_subject_text(subject, log_type)
|
||||
if(ismob(subject) || isclient(subject) || istype(subject, /datum/mind))
|
||||
return key_name_admin(subject)
|
||||
if(isatom(subject))
|
||||
. = key_name_admin(subject)
|
||||
if(should_log_health(log_type) && isliving(subject))
|
||||
. += get_health_string(subject)
|
||||
else if(isatom(subject))
|
||||
var/atom/A = subject
|
||||
return A.name
|
||||
if(istype(subject, /datum))
|
||||
. = A.name
|
||||
else if(istype(subject, /datum))
|
||||
var/datum/D = subject
|
||||
return D.type
|
||||
return subject
|
||||
else
|
||||
. = subject
|
||||
|
||||
/datum/log_record/proc/get_health_string(var/mob/living/L)
|
||||
var/OX = L.getOxyLoss() > 50 ? "<b>[L.getOxyLoss()]</b>" : L.getOxyLoss()
|
||||
var/TX = L.getToxLoss() > 50 ? "<b>[L.getToxLoss()]</b>" : L.getToxLoss()
|
||||
var/BU = L.getFireLoss() > 50 ? "<b>[L.getFireLoss()]</b>" : L.getFireLoss()
|
||||
var/BR = L.getBruteLoss() > 50 ? "<b>[L.getBruteLoss()]</b>" : L.getBruteLoss()
|
||||
return " ([L.health]: <font color='deepskyblue'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font>)"
|
||||
|
||||
/datum/log_record/proc/should_log_health(log_type)
|
||||
if(log_type == ATTACK_LOG || log_type == DEFENSE_LOG)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/proc/compare_log_record(datum/log_record/A, datum/log_record/B)
|
||||
var/time_diff = A.raw_time - B.raw_time
|
||||
|
||||
@@ -4,13 +4,13 @@
|
||||
var/time_from = 0
|
||||
var/time_to = 4 HOURS // 4 Hours should be enough. INFINITY would screw the UI up
|
||||
var/list/selected_mobs = list() // The mobs in question
|
||||
var/list/selected_log_types = list() // The log types being searched for
|
||||
var/list/selected_log_types = ALL_LOGS // The log types being searched for
|
||||
|
||||
var/list/log_records = list() // Found and sorted records
|
||||
|
||||
/datum/log_viewer/proc/clear_all()
|
||||
selected_mobs.Cut()
|
||||
selected_log_types.Cut()
|
||||
selected_log_types = ALL_LOGS
|
||||
time_from = initial(time_from)
|
||||
time_to = initial(time_to)
|
||||
log_records.Cut()
|
||||
@@ -91,6 +91,14 @@
|
||||
return start
|
||||
return 0
|
||||
|
||||
/datum/log_viewer/proc/add_mobs(list/mob/mobs)
|
||||
if(!mobs?.len)
|
||||
return
|
||||
for(var/i in mobs)
|
||||
var/mob/M = i
|
||||
if(istype(M))
|
||||
selected_mobs |= M
|
||||
|
||||
/datum/log_viewer/proc/add_mob(mob/user, mob/M)
|
||||
if(!M || !user)
|
||||
return
|
||||
@@ -103,8 +111,8 @@
|
||||
var/trStyleTop = "border-top:2px solid; border-bottom:2px solid; padding-top: 5px; padding-bottom: 5px;"
|
||||
var/trStyle = "border-top:1px solid; border-bottom:1px solid; padding-top: 5px; padding-bottom: 5px;"
|
||||
var/dat
|
||||
dat += "<head><style>.adminticket{border:2px solid} td{border:1px solid grey;} th{border:1px solid grey;} span{float:left;width:150px;}</style></head>"
|
||||
dat += "<div style='height:15vh'>"
|
||||
dat += "<head><meta http-equiv='X-UA-Compatible' content='IE=edge'><style>.adminticket{border:2px solid} td{border:1px solid grey;} th{border:1px solid grey;} span{float:left;width:150px;}</style></head>"
|
||||
dat += "<div style='min-height:95px'>"
|
||||
dat += "<span>Time Search Range:</span> <a href='?src=[UID()];start_time=1'>[gameTimestamp(wtime = time_from)]</a>"
|
||||
dat += " To: <a href='?src=[UID()];end_time=1'>[gameTimestamp(wtime = time_to)]</a>"
|
||||
dat += "<BR>"
|
||||
@@ -115,8 +123,9 @@
|
||||
if(QDELETED(M))
|
||||
selected_mobs -= i
|
||||
continue
|
||||
dat += "<a href='?src=[UID()];remove_mob=\ref[M]'>[M.name]</a>"
|
||||
dat += "<a href='?src=[UID()];remove_mob=\ref[M]'>[get_display_name(M)]</a>"
|
||||
dat += "<a href='?src=[UID()];add_mob=1'>Add Mob</a>"
|
||||
dat += "<a href='?src=[UID()];add_mob_ckey=1'>Add Mob (by ckey)</a>"
|
||||
dat += "<a href='?src=[UID()];clear_mobs=1'>Clear All Mobs</a>"
|
||||
dat += "<BR>"
|
||||
|
||||
@@ -142,9 +151,9 @@
|
||||
// Search results
|
||||
var/tdStyleTime = "width:80px; text-align:center;"
|
||||
var/tdStyleType = "width:80px; text-align:center;"
|
||||
var/tdStyleWho = "width:300px; text-align:center;"
|
||||
var/tdStyleWho = "width:400px; text-align:center;"
|
||||
var/tdStyleWhere = "width:150px; text-align:center;"
|
||||
dat += "<div style='overflow-y: auto; max-height:76vh;'>"
|
||||
dat += "<div style='overflow-y: auto; max-height:calc(100vh - 145px);'>"
|
||||
dat += "<table style='width:100%; border: 1px solid;'>"
|
||||
dat += "<tr style='[trStyleTop]'><th style='[tdStyleTime]'>When</th><th style='[tdStyleType]'>Type</th><th style='[tdStyleWho]'>Who</th><th>What</th><th>Target</th><th style='[tdStyleWhere]'>Where</th></tr>"
|
||||
for(var/i in log_records)
|
||||
@@ -158,7 +167,7 @@
|
||||
dat += "</table>"
|
||||
dat += "</div>"
|
||||
|
||||
var/datum/browser/popup = new(user, "Log viewer", "Log viewer", 1400, 600)
|
||||
var/datum/browser/popup = new(user, "Log Viewer", "Log Viewer", 1500, 600)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
@@ -203,6 +212,11 @@
|
||||
var/datum/async_input/A = input_autocomplete_async(usr, "Please, select a mob: ", mobs)
|
||||
A.on_close(CALLBACK(src, .proc/add_mob, usr))
|
||||
return
|
||||
if(href_list["add_mob_ckey"])
|
||||
var/list/mobs = get_assoc_mob_list_by_ckey()
|
||||
var/datum/async_input/A = input_autocomplete_async(usr, "Please, select a ckey: ", mobs)
|
||||
A.on_close(CALLBACK(src, .proc/add_mob, usr))
|
||||
return
|
||||
if(href_list["remove_mob"])
|
||||
var/mob/M = locate(href_list["remove_mob"])
|
||||
if(M)
|
||||
@@ -233,3 +247,11 @@
|
||||
if(MISC_LOG)
|
||||
return "gray"
|
||||
return "slategray"
|
||||
|
||||
/datum/log_viewer/proc/get_display_name(mob/M)
|
||||
var/name = M.name
|
||||
if(M.name != M.real_name)
|
||||
name = "[name] ([M.real_name])"
|
||||
if(isobserver(M))
|
||||
name = "[name] (DEAD)"
|
||||
return name
|
||||
|
||||
+4
-3
@@ -1419,9 +1419,10 @@
|
||||
return A
|
||||
|
||||
/datum/mind/proc/announce_objectives()
|
||||
to_chat(current, "<span class='notice'>Your current objectives:</span>")
|
||||
for(var/line in splittext(gen_objective_text(), "<br>"))
|
||||
to_chat(current, line)
|
||||
if(current)
|
||||
to_chat(current, "<span class='notice'>Your current objectives:</span>")
|
||||
for(var/line in splittext(gen_objective_text(), "<br>"))
|
||||
to_chat(current, line)
|
||||
|
||||
/datum/mind/proc/find_syndicate_uplink()
|
||||
var/list/L = current.get_contents()
|
||||
|
||||
@@ -9,8 +9,9 @@
|
||||
var/admin_notes
|
||||
|
||||
/datum/map_template/shuttle/New()
|
||||
shuttle_id = "[port_id]_[suffix]"
|
||||
mappath = "[prefix][shuttle_id].dmm"
|
||||
if(port_id && suffix)
|
||||
shuttle_id = "[port_id]_[suffix]"
|
||||
mappath = "[prefix][shuttle_id].dmm"
|
||||
. = ..()
|
||||
|
||||
/datum/map_template/shuttle/emergency
|
||||
|
||||
@@ -633,7 +633,6 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY
|
||||
contains = list(/obj/machinery/power/emitter,
|
||||
/obj/machinery/power/emitter)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "emitter crate"
|
||||
access = ACCESS_CE
|
||||
containertype = /obj/structure/closet/crate/secure/engineering
|
||||
@@ -717,7 +716,7 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY
|
||||
name = "Supermatter Shard Crate"
|
||||
contains = list(/obj/machinery/power/supermatter_shard)
|
||||
cost = 50 //So cargo thinks twice before killing themselves with it
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/engineering
|
||||
containername = "supermatter shard crate"
|
||||
access = ACCESS_CE
|
||||
|
||||
@@ -728,7 +727,7 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY
|
||||
/obj/item/pipe/circulator,
|
||||
/obj/item/pipe/circulator)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containertype = /obj/structure/closet/crate/secure/engineering
|
||||
containername = "thermo-electric generator crate"
|
||||
access = ACCESS_CE
|
||||
announce_beacons = list("Engineering" = list("Chief Engineer's Desk", "Atmospherics"))
|
||||
@@ -1767,6 +1766,16 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY
|
||||
cost = 20
|
||||
containername = "polo supply crate"
|
||||
|
||||
/datum/supply_packs/misc/boxing //For non log spamming cargo brawls!
|
||||
name = "Boxing Supply Crate"
|
||||
// 4 boxing gloves
|
||||
contains = list(/obj/item/clothing/gloves/boxing/blue,
|
||||
/obj/item/clothing/gloves/boxing/green,
|
||||
/obj/item/clothing/gloves/boxing/yellow,
|
||||
/obj/item/clothing/gloves/boxing)
|
||||
cost = 15
|
||||
containername = "boxing supply crate"
|
||||
|
||||
///////////// Station Goals
|
||||
|
||||
/datum/supply_packs/misc/station_goal
|
||||
|
||||
+11
-11
@@ -29,15 +29,15 @@ Actual Adjacent procs :
|
||||
//////////////////////
|
||||
|
||||
//A* nodes variables
|
||||
/PathNode
|
||||
/datum/pathnode
|
||||
var/turf/source //turf associated with the PathNode
|
||||
var/PathNode/prevNode //link to the parent PathNode
|
||||
var/datum/pathnode/prevNode //link to the parent PathNode
|
||||
var/f //A* Node weight (f = g + h)
|
||||
var/g //A* movement cost variable
|
||||
var/h //A* heuristic variable
|
||||
var/nt //count the number of Nodes traversed
|
||||
|
||||
/PathNode/New(s,p,pg,ph,pnt)
|
||||
/datum/pathnode/New(s,p,pg,ph,pnt)
|
||||
source = s
|
||||
prevNode = p
|
||||
g = pg
|
||||
@@ -46,7 +46,7 @@ Actual Adjacent procs :
|
||||
source.PNode = src
|
||||
nt = pnt
|
||||
|
||||
/PathNode/proc/calc_f()
|
||||
/datum/pathnode/proc/calc_f()
|
||||
f = g + h
|
||||
|
||||
//////////////////////
|
||||
@@ -54,11 +54,11 @@ Actual Adjacent procs :
|
||||
//////////////////////
|
||||
|
||||
//the weighting function, used in the A* algorithm
|
||||
/proc/PathWeightCompare(PathNode/a, PathNode/b)
|
||||
/proc/PathWeightCompare(datum/pathnode/a, datum/pathnode/b)
|
||||
return a.f - b.f
|
||||
|
||||
//reversed so that the Heap is a MinHeap rather than a MaxHeap
|
||||
/proc/HeapPathWeightCompare(PathNode/a, PathNode/b)
|
||||
/proc/HeapPathWeightCompare(datum/pathnode/a, datum/pathnode/b)
|
||||
return b.f - a.f
|
||||
|
||||
//wrapper that returns an empty list if A* failed to find a path
|
||||
@@ -82,13 +82,13 @@ Actual Adjacent procs :
|
||||
return 0
|
||||
maxnodedepth = maxnodes //no need to consider path longer than maxnodes
|
||||
|
||||
var/Heap/open = new /Heap(/proc/HeapPathWeightCompare) //the open list
|
||||
var/datum/heap/open = new /datum/heap(/proc/HeapPathWeightCompare) //the open list
|
||||
var/list/closed = new() //the closed list
|
||||
var/list/path = null //the returned path, if any
|
||||
var/PathNode/cur //current processed turf
|
||||
var/datum/pathnode/cur //current processed turf
|
||||
|
||||
//initialization
|
||||
open.Insert(new /PathNode(start,null,0,call(start,dist)(end),0))
|
||||
open.Insert(new /datum/pathnode(start,null,0,call(start,dist)(end),0))
|
||||
|
||||
//then run the main loop
|
||||
while(!open.IsEmpty() && !path)
|
||||
@@ -125,7 +125,7 @@ Actual Adjacent procs :
|
||||
|
||||
var/newg = cur.g + call(cur.source,dist)(T)
|
||||
if(!T.PNode) //is not already in open list, so add it
|
||||
open.Insert(new /PathNode(T,cur,newg,call(T,dist)(end),cur.nt+1))
|
||||
open.Insert(new /datum/pathnode(T,cur,newg,call(T,dist)(end),cur.nt+1))
|
||||
else //is already in open list, check if it's a better way from the current turf
|
||||
if(newg < T.PNode.g)
|
||||
T.PNode.prevNode = cur
|
||||
@@ -137,7 +137,7 @@ Actual Adjacent procs :
|
||||
}
|
||||
|
||||
//cleaning after us
|
||||
for(var/PathNode/PN in open.L)
|
||||
for(var/datum/pathnode/PN in open.L)
|
||||
PN.source.PNode = null
|
||||
for(var/turf/T in closed)
|
||||
T.PNode = null
|
||||
|
||||
@@ -567,3 +567,6 @@
|
||||
|
||||
/atom/movable/proc/portal_destroyed(obj/effect/portal/P)
|
||||
return
|
||||
|
||||
/atom/movable/proc/decompile_act(obj/item/matter_decompiler/C, mob/user) // For drones to decompile mobs and objs. See drone for an example.
|
||||
return FALSE
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
intercepttext += "<BR>Note in the event of a quarantine breach or uncontrolled spread of the biohazard, the directive 7-10 may be upgraded to a directive 7-12.<BR>"
|
||||
intercepttext += "Message ends."
|
||||
if(2)
|
||||
var/nukecode = rand(10000, 99999)
|
||||
var/nukecode = "[rand(10000, 99999)]"
|
||||
for(var/obj/machinery/nuclearbomb/bomb in GLOB.machines)
|
||||
if(bomb && bomb.r_code)
|
||||
if(is_station_level(bomb.z))
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
var/cultist_name = "talisman"
|
||||
var/cultist_desc = "A basic talisman. It serves no purpose."
|
||||
var/invocation = "Naise meam!"
|
||||
info = "<center><img src='talisman.png'></center><br/><br/>"
|
||||
info = "<center>​<img src='talisman.png'></center><br/><br/>"
|
||||
var/uses = 1
|
||||
var/health_cost = 0 //The amount of health taken from the user when invoking the talisman
|
||||
|
||||
|
||||
@@ -291,7 +291,8 @@
|
||||
///////////////////////////////////
|
||||
/datum/game_mode/proc/get_living_heads()
|
||||
. = list()
|
||||
for(var/mob/living/carbon/human/player in GLOB.mob_list)
|
||||
for(var/thing in GLOB.human_list)
|
||||
var/mob/living/carbon/human/player = thing
|
||||
var/list/real_command_positions = GLOB.command_positions.Copy() - "Nanotrasen Representative"
|
||||
if(player.stat != DEAD && player.mind && (player.mind.assigned_role in real_command_positions))
|
||||
. |= player.mind
|
||||
@@ -312,7 +313,8 @@
|
||||
//////////////////////////////////////////////
|
||||
/datum/game_mode/proc/get_living_sec()
|
||||
. = list()
|
||||
for(var/mob/living/carbon/human/player in GLOB.mob_list)
|
||||
for(var/thing in GLOB.human_list)
|
||||
var/mob/living/carbon/human/player = thing
|
||||
if(player.stat != DEAD && player.mind && (player.mind.assigned_role in GLOB.security_positions))
|
||||
. |= player.mind
|
||||
|
||||
@@ -321,7 +323,8 @@
|
||||
////////////////////////////////////////
|
||||
/datum/game_mode/proc/get_all_sec()
|
||||
. = list()
|
||||
for(var/mob/living/carbon/human/player in GLOB.mob_list)
|
||||
for(var/thing in GLOB.human_list)
|
||||
var/mob/living/carbon/human/player = thing
|
||||
if(player.mind && (player.mind.assigned_role in GLOB.security_positions))
|
||||
. |= player.mind
|
||||
|
||||
|
||||
@@ -83,6 +83,36 @@
|
||||
else
|
||||
add_ranged_ability(user, enable_text)
|
||||
|
||||
/datum/action/innate/ai/choose_modules
|
||||
name = "Choose Modules"
|
||||
desc = "Spend your processing time to gain a variety of different abilities."
|
||||
button_icon_state = "choose_module"
|
||||
auto_use_uses = FALSE // This is an infinite ability.
|
||||
|
||||
/datum/action/innate/ai/choose_modules/Grant(mob/living/L)
|
||||
. = ..()
|
||||
owner_AI.malf_picker = new /datum/module_picker
|
||||
|
||||
/datum/action/innate/ai/choose_modules/Trigger()
|
||||
. = ..()
|
||||
owner_AI.malf_picker.use(owner_AI)
|
||||
|
||||
/datum/action/innate/ai/return_to_core
|
||||
name = "Return to Main Core"
|
||||
desc = "Leave the APC you are shunted to, and return to your core."
|
||||
icon_icon = 'icons/obj/power.dmi'
|
||||
button_icon_state = "apcemag"
|
||||
auto_use_uses = FALSE // Here just to prevent the "You have X uses remaining" from popping up.
|
||||
|
||||
/datum/action/innate/ai/return_to_core/Trigger()
|
||||
. = ..()
|
||||
var/obj/machinery/power/apc/apc = owner_AI.loc
|
||||
if(!istype(apc)) // This shouldn't happen but here for safety.
|
||||
to_chat(src, "<span class='notice'>You are already in your Main Core.</span>")
|
||||
return
|
||||
apc.malfvacate()
|
||||
qdel(src)
|
||||
|
||||
//The datum and interface for the malf unlock menu, which lets them choose actions to unlock.
|
||||
/datum/module_picker
|
||||
var/temp
|
||||
@@ -96,13 +126,7 @@
|
||||
if((AM.power_type && AM.power_type != /datum/action/innate/ai) || AM.upgrade)
|
||||
possible_modules += AM
|
||||
|
||||
/datum/module_picker/proc/remove_malf_verbs(mob/living/silicon/ai/AI) //Removes all malfunction-related abilities from the target AI.
|
||||
for(var/datum/AI_Module/AM in possible_modules)
|
||||
for(var/datum/action/A in AI.actions)
|
||||
if(istype(A, initial(AM.power_type)))
|
||||
qdel(A)
|
||||
|
||||
/datum/module_picker/proc/use(user as mob)
|
||||
/datum/module_picker/proc/use(mob/user)
|
||||
var/dat
|
||||
dat += {"<B>Select use of processing time: (currently #[processing_time] left.)</B><BR>
|
||||
<HR>
|
||||
|
||||
@@ -394,7 +394,7 @@
|
||||
to_chat(src, "<font color='blue'> You are feeling far too docile to do that.</font>")
|
||||
return
|
||||
|
||||
var content = ""
|
||||
var/content = ""
|
||||
|
||||
content += "<table>"
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
var/icon_stun = "revenant_stun"
|
||||
var/icon_drain = "revenant_draining"
|
||||
incorporeal_move = 3
|
||||
see_invisible = INVISIBILITY_REVENANT
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
health = INFINITY //Revenants don't use health, they use essence instead
|
||||
maxHealth = INFINITY
|
||||
|
||||
@@ -53,7 +53,6 @@ proc/issyndicate(mob/living/M as mob)
|
||||
for(var/datum/mind/synd_mind in syndicates)
|
||||
synd_mind.assigned_role = SPECIAL_ROLE_NUKEOPS //So they aren't chosen for other jobs.
|
||||
synd_mind.special_role = SPECIAL_ROLE_NUKEOPS
|
||||
synd_mind.offstation_role = TRUE
|
||||
return 1
|
||||
|
||||
|
||||
@@ -113,7 +112,7 @@ proc/issyndicate(mob/living/M as mob)
|
||||
if(spawnpos > synd_spawn.len)
|
||||
spawnpos = 2
|
||||
synd_mind.current.loc = synd_spawn[spawnpos]
|
||||
|
||||
synd_mind.offstation_role = TRUE
|
||||
forge_syndicate_objectives(synd_mind)
|
||||
create_syndicate(synd_mind)
|
||||
greet_syndicate(synd_mind)
|
||||
|
||||
@@ -357,7 +357,8 @@
|
||||
var/list/name_counts = list()
|
||||
var/list/names = list()
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.mob_list)
|
||||
for(var/thing in GLOB.human_list)
|
||||
var/mob/living/carbon/human/H = thing
|
||||
if(!trackable(H))
|
||||
continue
|
||||
|
||||
|
||||
@@ -385,7 +385,8 @@
|
||||
if(foecount == GLOB.score_arrested)
|
||||
GLOB.score_allarrested = 1
|
||||
|
||||
for(var/mob/living/carbon/human/player in GLOB.mob_living_list)
|
||||
for(var/thing in GLOB.human_list)
|
||||
var/mob/living/carbon/human/player = thing
|
||||
if(player.mind)
|
||||
var/role = player.mind.assigned_role
|
||||
if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director"))
|
||||
@@ -415,7 +416,8 @@
|
||||
for(var/datum/mind/M in SSticker.mode:revolutionaries)
|
||||
if(M.current && M.current.stat != DEAD)
|
||||
revcount++
|
||||
for(var/mob/living/carbon/human/player in GLOB.mob_living_list)
|
||||
for(var/thing in GLOB.human_list)
|
||||
var/mob/living/carbon/human/player = thing
|
||||
if(player.mind)
|
||||
var/role = player.mind.assigned_role
|
||||
if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director"))
|
||||
|
||||
@@ -41,7 +41,8 @@
|
||||
GLOB.score_deadaipenalty++
|
||||
GLOB.score_deadcrew++
|
||||
|
||||
for(var/mob/living/carbon/human/I in GLOB.mob_list)
|
||||
for(var/thing in GLOB.human_list)
|
||||
var/mob/living/carbon/human/I = thing
|
||||
if(I.stat == DEAD && is_station_level(I.z))
|
||||
GLOB.score_deadcrew++
|
||||
|
||||
@@ -60,7 +61,8 @@
|
||||
var/dmg_score = 0
|
||||
|
||||
if(SSshuttle.emergency.mode >= SHUTTLE_ENDGAME)
|
||||
for(var/mob/living/carbon/human/E in GLOB.mob_list)
|
||||
for(var/thing in GLOB.human_list)
|
||||
var/mob/living/carbon/human/E = thing
|
||||
cash_score = 0
|
||||
dmg_score = 0
|
||||
var/turf/location = get_turf(E.loc)
|
||||
|
||||
@@ -145,7 +145,7 @@
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/self/rejuvenate
|
||||
name = "Rejuvenate"
|
||||
desc= "Flush your system with spare blood to remove any incapacitating effects."
|
||||
desc= "Use reserve blood to enliven your body, removing any incapacitating effects."
|
||||
action_icon_state = "vampire_rejuvinate"
|
||||
charge_max = 200
|
||||
stat_allowed = 1
|
||||
@@ -158,7 +158,7 @@
|
||||
user.SetParalysis(0)
|
||||
user.SetSleeping(0)
|
||||
U.adjustStaminaLoss(-75)
|
||||
to_chat(user, "<span class='notice'>You flush your system with clean blood and remove any incapacitating effects.</span>")
|
||||
to_chat(user, "<span class='notice'>You instill your body with clean blood and remove any incapacitating effects.</span>")
|
||||
spawn(1)
|
||||
if(usr.mind.vampire.get_ability(/datum/vampire_passive/regen))
|
||||
for(var/i = 1 to 5)
|
||||
@@ -354,10 +354,10 @@
|
||||
var/datum/objective/protect/serve_objective = new
|
||||
serve_objective.owner = user.mind
|
||||
serve_objective.target = H.mind
|
||||
serve_objective.explanation_text = "You have been Enthralled by [user]. Follow [user.p_their()] every command."
|
||||
serve_objective.explanation_text = "You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command."
|
||||
H.mind.objectives += serve_objective
|
||||
|
||||
to_chat(H, "<span class='biggerdanger'>You have been Enthralled by [user]. Follow [user.p_their()] every command.</span>")
|
||||
to_chat(H, "<span class='biggerdanger'>You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command.</span>")
|
||||
to_chat(user, "<span class='warning'>You have successfully Enthralled [H]. <i>If [H.p_they()] refuse[H.p_s()] to do as you say just adminhelp.</i></span>")
|
||||
H.Stun(2)
|
||||
add_attack_logs(user, H, "Vampire-thralled")
|
||||
|
||||
@@ -868,8 +868,9 @@ GLOBAL_LIST_EMPTY(multiverse)
|
||||
possible = list()
|
||||
if(!link)
|
||||
return
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
if(md5(H.dna.uni_identity) in link.fingerprints)
|
||||
for(var/thing in GLOB.human_list)
|
||||
var/mob/living/carbon/human/H = thing
|
||||
if(H.stat != DEAD && (md5(H.dna.uni_identity) in link.fingerprints))
|
||||
possible |= H
|
||||
|
||||
/obj/item/voodoo/proc/GiveHint(mob/victim,force=0)
|
||||
|
||||
@@ -610,7 +610,7 @@
|
||||
var/entry_types = subtypesof(/datum/spellbook_entry) - /datum/spellbook_entry/item - /datum/spellbook_entry/summon - /datum/spellbook_entry/loadout
|
||||
for(var/T in entry_types)
|
||||
var/datum/spellbook_entry/E = new T
|
||||
if(GAMEMODE_IS_WIZARD && E.is_ragin_restricted)
|
||||
if(GAMEMODE_IS_RAGIN_MAGES && E.is_ragin_restricted)
|
||||
qdel(E)
|
||||
continue
|
||||
entries |= E
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
minimal_player_age = 21
|
||||
exp_requirements = 300
|
||||
exp_type = EXP_TYPE_CREW
|
||||
alt_titles = list("Android", "Robot")
|
||||
alt_titles = list("Robot")
|
||||
|
||||
/datum/job/cyborg/equip(mob/living/carbon/human/H)
|
||||
if(!H)
|
||||
|
||||
@@ -164,7 +164,7 @@
|
||||
data["selected_pod"] = "\ref[selected_pod]"
|
||||
var/list/temprecords[0]
|
||||
for(var/datum/dna2/record/R in records)
|
||||
var tempRealName = R.dna.real_name
|
||||
var/tempRealName = R.dna.real_name
|
||||
temprecords.Add(list(list("record" = "\ref[R]", "realname" = sanitize(tempRealName))))
|
||||
data["records"] = temprecords
|
||||
|
||||
|
||||
@@ -298,10 +298,6 @@
|
||||
else
|
||||
to_chat(usr, "<span class='danger'>Nano-Mob Hunter GO! game server is offline for extended maintenance. Contact your Central Command administrators for more info if desired.</span>")
|
||||
|
||||
if("ToggleATC")
|
||||
GLOB.atc.squelched = !GLOB.atc.squelched
|
||||
to_chat(usr, "<span class='notice'>ATC traffic is now: [GLOB.atc.squelched ? "Disabled" : "Enabled"].</span>")
|
||||
|
||||
SSnanoui.update_uis(src)
|
||||
return 1
|
||||
|
||||
@@ -395,8 +391,6 @@
|
||||
|
||||
data["shuttle"] = shuttle
|
||||
|
||||
data["atcSquelched"] = GLOB.atc.squelched
|
||||
|
||||
return data
|
||||
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
return
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/machinery/computer/crew/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state)
|
||||
/obj/machinery/computer/crew/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state)
|
||||
crew_monitor.tgui_interact(user, ui_key, ui, force_open)
|
||||
|
||||
/obj/machinery/computer/crew/interact(mob/user)
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
alerts_when_broken = TRUE
|
||||
|
||||
/obj/machinery/computer/syndicate_depot/selfdestruct/get_menu(mob/user)
|
||||
var menutext = {"<B>Syndicate Depot Fusion Reactor Control</B><HR>
|
||||
var/menutext = {"<B>Syndicate Depot Fusion Reactor Control</B><HR>
|
||||
<BR><BR><a href='?src=[UID()];primary=1'>Disable Containment Field</a>
|
||||
<BR>"}
|
||||
return menutext
|
||||
@@ -193,10 +193,6 @@
|
||||
/obj/machinery/computer/syndicate_depot/shieldcontrol/New()
|
||||
. = ..()
|
||||
perimeterarea = locate(/area/syndicate_depot/perimeter)
|
||||
if(istype(perimeterarea) && (GAMEMODE_IS_NUCLEAR || prob(20)))
|
||||
spawn(200)
|
||||
perimeterarea.perimeter_shields_up()
|
||||
depotarea.perimeter_shield_status = TRUE
|
||||
|
||||
/obj/machinery/computer/syndicate_depot/shieldcontrol/Destroy()
|
||||
if(istype(perimeterarea) && perimeterarea.shield_list.len)
|
||||
@@ -204,7 +200,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/syndicate_depot/shieldcontrol/get_menu(mob/user)
|
||||
var menutext = {"<B>Syndicate Depot Shield Grid Control</B><HR>
|
||||
var/menutext = {"<B>Syndicate Depot Shield Grid Control</B><HR>
|
||||
<BR>"}
|
||||
menutext += {"(SYNDI-LEADER) Whole-base Shield: [perimeterarea.shield_list.len ? "ON" : "OFF"] (<a href='?src=[UID()];primary=1'>[perimeterarea.shield_list.len ? "Disable" : "Enable"]</a>)<BR>"}
|
||||
menutext += {"(SYNDI-LEADER) Armory Shield: [depotarea.shield_list.len ? "ON" : "OFF"] (<a href='?src=[UID()];secondary=1'>[depotarea.shield_list.len ? "Disable" : "Enable"]</a>)<BR>"}
|
||||
|
||||
@@ -302,6 +302,7 @@
|
||||
// Eject dead people
|
||||
if(occupant.stat == DEAD)
|
||||
go_out()
|
||||
return
|
||||
|
||||
// Allow a gap between entering the pod and actually despawning.
|
||||
if(world.time - time_entered < time_till_despawn)
|
||||
|
||||
@@ -52,6 +52,19 @@ GLOBAL_LIST_EMPTY(tcomms_machines)
|
||||
. = ..()
|
||||
GLOB.tcomms_machines += src
|
||||
update_icon()
|
||||
if((!mapload) && (usr))
|
||||
// To the person who asks "Hey affected, why are you using this massive operator when you can use AREACOORD?" Well, ill tell you
|
||||
// get_area_name is fucking broken and uses a for(x in world) search
|
||||
// It doesnt even work, is expensive, and returns 0
|
||||
// Im not refactoring one thing which could risk breaking all admin location logs
|
||||
// Fight me
|
||||
log_action(usr, "constructed a new [src] at [src ? "[get_location_name(src, TRUE)] [COORD(src)]" : "nonexistent location"] [ADMIN_JMP(src)]", adminmsg = TRUE)
|
||||
// Add in component parts for the sake of deconstruction
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/stock_parts/manipulator(null)
|
||||
component_parts += new /obj/item/stock_parts/manipulator(null)
|
||||
component_parts += new /obj/item/stack/cable_coil(null, 1)
|
||||
component_parts += new /obj/item/stack/cable_coil(null, 1)
|
||||
|
||||
/**
|
||||
* Base Destructor
|
||||
@@ -60,6 +73,8 @@ GLOBAL_LIST_EMPTY(tcomms_machines)
|
||||
*/
|
||||
/obj/machinery/tcomms/Destroy()
|
||||
GLOB.tcomms_machines -= src
|
||||
if(usr)
|
||||
log_action(usr, "destroyed a [src] at [src ? "[get_location_name(src, TRUE)] [COORD(src)]" : "nonexistent location"] [ADMIN_JMP(src)]", adminmsg = TRUE)
|
||||
return ..()
|
||||
|
||||
/**
|
||||
@@ -462,3 +477,20 @@ GLOBAL_LIST_EMPTY(tcomms_machines)
|
||||
break
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* Screwdriver Act Handler
|
||||
*
|
||||
* Handles the screwdriver action for all tcomms machines, so they can be open and closed to be deconstructed
|
||||
*/
|
||||
/obj/machinery/tcomms/screwdriver_act(mob/user, obj/item/I)
|
||||
. = TRUE
|
||||
default_deconstruction_screwdriver(user, icon_state, icon_state, I)
|
||||
|
||||
/**
|
||||
* Crowbar Act Handler
|
||||
*
|
||||
* Handles the crowbar action for all tcomms machines, so they can be deconstructed
|
||||
*/
|
||||
/obj/machinery/tcomms/crowbar_act(mob/user, obj/item/I)
|
||||
. = TRUE
|
||||
default_deconstruction_crowbar(user, I)
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
. = ..()
|
||||
link_password = GenerateKey()
|
||||
reachable_zlevels |= loc.z
|
||||
component_parts += new /obj/item/circuitboard/tcomms/core(null)
|
||||
|
||||
/**
|
||||
* Destructor for the core.
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
*/
|
||||
/obj/machinery/tcomms/relay/Initialize(mapload)
|
||||
. = ..()
|
||||
component_parts += new /obj/item/circuitboard/tcomms/relay(null)
|
||||
if(mapload && autolink_id)
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
/obj/machinery/computer/teleporter/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state)
|
||||
var/data[0]
|
||||
data["powerstation"] = power_station
|
||||
if(power_station)
|
||||
if(power_station?.teleporter_hub)
|
||||
data["teleporterhub"] = power_station.teleporter_hub
|
||||
data["calibrated"] = power_station.teleporter_hub.calibrated
|
||||
data["accurate"] = power_station.teleporter_hub.accurate
|
||||
|
||||
@@ -1,280 +0,0 @@
|
||||
/sound/turntable/test
|
||||
file = 'sound/turntable/testloop1.ogg'
|
||||
falloff = 2
|
||||
repeat = 1
|
||||
|
||||
/mob/var/music = 0
|
||||
|
||||
/obj/machinery/party/turntable
|
||||
name = "turntable"
|
||||
desc = "A turntable used for parties and shit."
|
||||
icon = 'icons/effects/lasers2.dmi'
|
||||
icon_state = "turntable"
|
||||
var/playing = 0
|
||||
anchored = 1
|
||||
|
||||
/obj/machinery/party/mixer
|
||||
name = "mixer"
|
||||
desc = "A mixing board for mixing music"
|
||||
icon = 'icons/effects/lasers2.dmi'
|
||||
icon_state = "mixer"
|
||||
anchored = 1
|
||||
|
||||
|
||||
/obj/machinery/party/turntable/New()
|
||||
..()
|
||||
sleep(2)
|
||||
new /sound/turntable/test(src)
|
||||
return
|
||||
|
||||
/obj/machinery/party/turntable/attack_hand(mob/user as mob)
|
||||
|
||||
var/t = "<B>Turntable Interface</B><br><br>"
|
||||
//t += "<A href='?src=[UID()];on=1'>On</A><br>"
|
||||
t += "<A href='?src=[UID()];off=1'>Off</A><br><br>"
|
||||
t += "<A href='?src=[UID()];on1=Testloop1'>One</A><br>"
|
||||
t += "<A href='?src=[UID()];on2=Testloop2'>TestLoop2</A><br>"
|
||||
t += "<A href='?src=[UID()];on3=Testloop3'>TestLoop3</A><br>"
|
||||
|
||||
user << browse(t, "window=turntable;size=420x700")
|
||||
|
||||
|
||||
/obj/machinery/party/turntable/Topic(href, href_list)
|
||||
..()
|
||||
if( href_list["on1"] )
|
||||
if(src.playing == 0)
|
||||
// to_chat(world, "Should be working...")
|
||||
var/sound/S = sound('sound/turntable/testloop1.ogg')
|
||||
S.repeat = 1
|
||||
S.channel = 10
|
||||
S.falloff = 2
|
||||
S.wait = 1
|
||||
S.environment = 0
|
||||
//for(var/mob/M in world)
|
||||
// if(M.loc.loc == src.loc.loc && M.music == 0)
|
||||
// to_chat(world, "Found the song...")
|
||||
// M << S
|
||||
// M.music = 1
|
||||
var/area/A = src.loc.loc
|
||||
|
||||
for(var/obj/machinery/party/lasermachine/L in A)
|
||||
L.turnon()
|
||||
playing = 1
|
||||
while(playing == 1)
|
||||
for(var/mob/M in world)
|
||||
if((M.loc.loc in A) && M.music == 0)
|
||||
// to_chat(world, "Found the song...")
|
||||
M << S
|
||||
M.music = 1
|
||||
else if(!(M.loc.loc in A) && M.music == 1)
|
||||
var/sound/Soff = sound(null)
|
||||
Soff.channel = 10
|
||||
M << Soff
|
||||
M.music = 0
|
||||
sleep(10)
|
||||
return
|
||||
if( href_list["on2"] )
|
||||
if(src.playing == 0)
|
||||
// to_chat(world, "Should be working...")
|
||||
var/sound/S = sound('sound/turntable/testloop2.ogg')
|
||||
S.repeat = 1
|
||||
S.channel = 10
|
||||
S.falloff = 2
|
||||
S.wait = 1
|
||||
S.environment = 0
|
||||
//for(var/mob/M in world)
|
||||
// if(M.loc.loc == src.loc.loc && M.music == 0)
|
||||
// to_chat(world, "Found the song...")
|
||||
// M << S
|
||||
// M.music = 1
|
||||
var/area/A = src.loc.loc
|
||||
for(var/obj/machinery/party/lasermachine/L in A)
|
||||
L.turnon()
|
||||
playing = 1
|
||||
while(playing == 1)
|
||||
for(var/mob/M in world)
|
||||
if(M.loc.loc == src.loc.loc && M.music == 0)
|
||||
// to_chat(world, "Found the song...")
|
||||
M << S
|
||||
M.music = 1
|
||||
else if(M.loc.loc != src.loc.loc && M.music == 1)
|
||||
var/sound/Soff = sound(null)
|
||||
Soff.channel = 10
|
||||
M << Soff
|
||||
M.music = 0
|
||||
sleep(10)
|
||||
return
|
||||
if( href_list["on3"] )
|
||||
if(src.playing == 0)
|
||||
// to_chat(world, "Should be working...")
|
||||
var/sound/S = sound('sound/turntable/testloop3.ogg')
|
||||
S.repeat = 1
|
||||
S.channel = 10
|
||||
S.falloff = 2
|
||||
S.wait = 1
|
||||
S.environment = 0
|
||||
//for(var/mob/M in world)
|
||||
// if(M.loc.loc == src.loc.loc && M.music == 0)
|
||||
// to_chat(world, "Found the song...")
|
||||
// M << S
|
||||
// M.music = 1
|
||||
var/area/A = src.loc.loc
|
||||
for(var/obj/machinery/party/lasermachine/L in A)
|
||||
L.turnon()
|
||||
playing = 1
|
||||
while(playing == 1)
|
||||
for(var/mob/M in world)
|
||||
if(M.loc.loc == src.loc.loc && M.music == 0)
|
||||
// to_chat(world, "Found the song...")
|
||||
M << S
|
||||
M.music = 1
|
||||
else if(M.loc.loc != src.loc.loc && M.music == 1)
|
||||
var/sound/Soff = sound(null)
|
||||
Soff.channel = 10
|
||||
M << Soff
|
||||
M.music = 0
|
||||
sleep(10)
|
||||
return
|
||||
|
||||
|
||||
if( href_list["off"] )
|
||||
if(src.playing == 1)
|
||||
var/sound/S = sound(null)
|
||||
S.channel = 10
|
||||
S.wait = 1
|
||||
for(var/mob/M in world)
|
||||
M << S
|
||||
M.music = 0
|
||||
playing = 0
|
||||
var/area/A = src.loc.loc
|
||||
for(var/obj/machinery/party/lasermachine/L in A)
|
||||
L.turnoff()
|
||||
|
||||
|
||||
|
||||
/obj/machinery/party/lasermachine
|
||||
name = "laser machine"
|
||||
desc = "A laser machine that shoots lasers."
|
||||
icon = 'icons/effects/lasers2.dmi'
|
||||
icon_state = "lasermachine"
|
||||
anchored = 1
|
||||
var/mirrored = 0
|
||||
|
||||
/obj/effect/turntable_laser
|
||||
name = "laser"
|
||||
desc = "A laser..."
|
||||
icon = 'icons/effects/lasers2.dmi'
|
||||
icon_state = "laserred1"
|
||||
anchored = 1
|
||||
layer = 4
|
||||
|
||||
/obj/item/lasermachine/New()
|
||||
..()
|
||||
|
||||
/obj/machinery/party/lasermachine/proc/turnon()
|
||||
var/wall = 0
|
||||
var/cycle = 1
|
||||
var/area/A = get_area(src)
|
||||
var/X = 1
|
||||
var/Y = 0
|
||||
if(mirrored == 0)
|
||||
while(wall == 0)
|
||||
if(cycle == 1)
|
||||
var/obj/effect/turntable_laser/F = new(src)
|
||||
F.x = src.x+X
|
||||
F.y = src.y+Y
|
||||
F.z = src.z
|
||||
F.icon_state = "laserred1"
|
||||
var/area/AA = get_area(F)
|
||||
var/turf/T = get_turf(F)
|
||||
if(T.density == 1 || AA.name != A.name)
|
||||
qdel(F)
|
||||
return
|
||||
cycle++
|
||||
if(cycle > 3)
|
||||
cycle = 1
|
||||
X++
|
||||
if(cycle == 2)
|
||||
var/obj/effect/turntable_laser/F = new(src)
|
||||
F.x = src.x+X
|
||||
F.y = src.y+Y
|
||||
F.z = src.z
|
||||
F.icon_state = "laserred2"
|
||||
var/area/AA = get_area(F)
|
||||
var/turf/T = get_turf(F)
|
||||
if(T.density == 1 || AA.name != A.name)
|
||||
qdel(F)
|
||||
return
|
||||
cycle++
|
||||
if(cycle > 3)
|
||||
cycle = 1
|
||||
Y++
|
||||
if(cycle == 3)
|
||||
var/obj/effect/turntable_laser/F = new(src)
|
||||
F.x = src.x+X
|
||||
F.y = src.y+Y
|
||||
F.z = src.z
|
||||
F.icon_state = "laserred3"
|
||||
var/area/AA = get_area(F)
|
||||
var/turf/T = get_turf(F)
|
||||
if(T.density == 1 || AA.name != A.name)
|
||||
qdel(F)
|
||||
return
|
||||
cycle++
|
||||
if(cycle > 3)
|
||||
cycle = 1
|
||||
X++
|
||||
if(mirrored == 1)
|
||||
while(wall == 0)
|
||||
if(cycle == 1)
|
||||
var/obj/effect/turntable_laser/F = new(src)
|
||||
F.x = src.x+X
|
||||
F.y = src.y-Y
|
||||
F.z = src.z
|
||||
F.icon_state = "laserred1m"
|
||||
var/area/AA = get_area(F)
|
||||
var/turf/T = get_turf(F)
|
||||
if(T.density == 1 || AA.name != A.name)
|
||||
qdel(F)
|
||||
return
|
||||
cycle++
|
||||
if(cycle > 3)
|
||||
cycle = 1
|
||||
Y++
|
||||
if(cycle == 2)
|
||||
var/obj/effect/turntable_laser/F = new(src)
|
||||
F.x = src.x+X
|
||||
F.y = src.y-Y
|
||||
F.z = src.z
|
||||
F.icon_state = "laserred2m"
|
||||
var/area/AA = get_area(F)
|
||||
var/turf/T = get_turf(F)
|
||||
if(T.density == 1 || AA.name != A.name)
|
||||
qdel(F)
|
||||
return
|
||||
cycle++
|
||||
if(cycle > 3)
|
||||
cycle = 1
|
||||
X++
|
||||
if(cycle == 3)
|
||||
var/obj/effect/turntable_laser/F = new(src)
|
||||
F.x = src.x+X
|
||||
F.y = src.y-Y
|
||||
F.z = src.z
|
||||
F.icon_state = "laserred3m"
|
||||
var/area/AA = get_area(F)
|
||||
var/turf/T = get_turf(F)
|
||||
if(T.density == 1 || AA.name != A.name)
|
||||
qdel(F)
|
||||
return
|
||||
cycle++
|
||||
if(cycle > 3)
|
||||
cycle = 1
|
||||
X++
|
||||
|
||||
|
||||
|
||||
/obj/machinery/party/lasermachine/proc/turnoff()
|
||||
var/area/A = src.loc.loc
|
||||
for(var/obj/effect/turntable_laser/F in A)
|
||||
qdel(F)
|
||||
@@ -94,7 +94,7 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/drill/proc/drill_mob(mob/living/target, mob/user)
|
||||
target.visible_message("<span class='danger'>[chassis] is drilling [target] with [src]!</span>",
|
||||
"<span class='userdanger'>[chassis] is drilling you with [src]!</span>")
|
||||
add_attack_logs(user, target, "DRILLED with [src] (INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
|
||||
add_attack_logs(user, target, "DRILLED with [src] ([uppertext(user.a_intent)]) ([uppertext(damtype)])")
|
||||
if(target.stat == DEAD && target.getBruteLoss() >= 200)
|
||||
add_attack_logs(user, target, "gibbed")
|
||||
if(LAZYLEN(target.butcher_results))
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
target.visible_message("<span class='danger'>[chassis] squeezes [target].</span>", \
|
||||
"<span class='userdanger'>[chassis] squeezes [target].</span>",\
|
||||
"<span class='italics'>You hear something crack.</span>")
|
||||
add_attack_logs(chassis.occupant, M, "Squeezed with [src] (INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])")
|
||||
add_attack_logs(chassis.occupant, M, "Squeezed with [src] ([uppertext(chassis.occupant.a_intent)]) ([uppertext(damtype)])")
|
||||
start_cooldown()
|
||||
else
|
||||
step_away(M,chassis)
|
||||
|
||||
@@ -385,7 +385,7 @@
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
|
||||
name = "SGL-6 Grenade Launcher"
|
||||
name = "SGL-6 Flashbang Launcher"
|
||||
icon_state = "mecha_grenadelnchr"
|
||||
origin_tech = "combat=4;engineering=4"
|
||||
projectile = /obj/item/grenade/flashbang
|
||||
@@ -411,7 +411,7 @@
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve
|
||||
name = "SOB-3 Grenade Launcher"
|
||||
name = "SOB-3 Clusterbang Launcher"
|
||||
desc = "A weapon for combat exosuits. Launches primed clusterbangs. You monster."
|
||||
origin_tech = "combat=4;materials=4"
|
||||
projectiles = 3
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#define OCCUPANT_LOGGING occupant ? occupant : "empty mech"
|
||||
|
||||
/obj/mecha
|
||||
name = "Mecha"
|
||||
desc = "Exosuit"
|
||||
@@ -544,6 +546,7 @@
|
||||
|
||||
/obj/mecha/attack_alien(mob/living/user)
|
||||
log_message("Attack by alien. Attacker - [user].", TRUE)
|
||||
add_attack_logs(user, OCCUPANT_LOGGING, "Alien attacked mech [src]")
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 100, TRUE)
|
||||
attack_generic(user, 15, BRUTE, "melee", 0)
|
||||
|
||||
@@ -561,8 +564,8 @@
|
||||
if(user.obj_damage)
|
||||
animal_damage = user.obj_damage
|
||||
animal_damage = min(animal_damage, 20*user.environment_smash)
|
||||
user.create_attack_log("<font color='red'>attacked [name]</font>")
|
||||
add_attack_logs(user, src, "Attacked")
|
||||
if(animal_damage)
|
||||
add_attack_logs(user, OCCUPANT_LOGGING, "Animal attacked mech [src]")
|
||||
attack_generic(user, animal_damage, user.melee_damage_type, "melee", play_soundeffect)
|
||||
return TRUE
|
||||
|
||||
@@ -573,7 +576,7 @@
|
||||
. = ..()
|
||||
if(.)
|
||||
log_message("Attack by hulk. Attacker - [user].", 1)
|
||||
add_attack_logs(user, src, "Punched with hulk powers")
|
||||
add_attack_logs(user, OCCUPANT_LOGGING, "Hulk punched mech [src]")
|
||||
|
||||
/obj/mecha/blob_act(obj/structure/blob/B)
|
||||
log_message("Attack by blob. Attacker - [B].")
|
||||
@@ -584,10 +587,14 @@
|
||||
|
||||
/obj/mecha/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) //wrapper
|
||||
log_message("Hit by [AM].")
|
||||
if(isitem(AM))
|
||||
var/obj/item/I = AM
|
||||
add_attack_logs(I.thrownby, OCCUPANT_LOGGING, "threw [AM] at mech [src]")
|
||||
. = ..()
|
||||
|
||||
/obj/mecha/bullet_act(obj/item/projectile/Proj) //wrapper
|
||||
log_message("Hit by projectile. Type: [Proj.name]([Proj.flag]).")
|
||||
add_attack_logs(Proj.firer, OCCUPANT_LOGGING, "shot [Proj.name]([Proj.flag]) at mech [src]")
|
||||
..()
|
||||
|
||||
/obj/mecha/ex_act(severity, target)
|
||||
@@ -774,6 +781,8 @@
|
||||
to_chat(user, "<span class='notice'>You stop installing [M].</span>")
|
||||
|
||||
else
|
||||
if(W.force)
|
||||
add_attack_logs(user, OCCUPANT_LOGGING, "attacked mech '[src]' using [W]")
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -861,7 +870,7 @@
|
||||
return 0
|
||||
use_power(melee_energy_drain)
|
||||
if(M.damtype == BRUTE || M.damtype == BURN)
|
||||
add_attack_logs(M.occupant, src, "Mecha-attacked with [M] (INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
|
||||
add_attack_logs(M.occupant, src, "Mecha-attacked with [M] ([uppertext(M.occupant.a_intent)]) ([uppertext(M.damtype)])")
|
||||
. = ..()
|
||||
|
||||
/obj/mecha/emag_act(mob/user)
|
||||
@@ -1534,3 +1543,5 @@
|
||||
if(L.incapacitated())
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
#undef OCCUPANT_LOGGING
|
||||
|
||||
@@ -28,6 +28,12 @@
|
||||
icon_state = "remainsrobot"
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/decal/remains/robot/decompile_act(obj/item/matter_decompiler/C, mob/user)
|
||||
C.stored_comms["glass"] += 2
|
||||
C.stored_comms["metal"] += 3
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/effect/decal/remains/slime
|
||||
name = "You shouldn't see this"
|
||||
desc = "Noooooooooooooooooooooo"
|
||||
|
||||
@@ -49,6 +49,8 @@ would spawn and follow the beaker, even if it is carried or thrown.
|
||||
holder = atom
|
||||
|
||||
/datum/effect_system/proc/start()
|
||||
if(QDELETED(src))
|
||||
return
|
||||
for(var/i in 1 to number)
|
||||
if(total_effects > 20)
|
||||
return
|
||||
@@ -68,7 +70,8 @@ would spawn and follow the beaker, even if it is carried or thrown.
|
||||
for(var/j in 1 to steps_amt)
|
||||
sleep(5)
|
||||
step(E,direction)
|
||||
addtimer(CALLBACK(src, .proc/decrement_total_effect), 20)
|
||||
if(!QDELETED(src))
|
||||
addtimer(CALLBACK(src, .proc/decrement_total_effect), 20)
|
||||
|
||||
/datum/effect_system/proc/decrement_total_effect()
|
||||
total_effects--
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
|
||||
/obj/effect/manifest/proc/manifest()
|
||||
var/dat = "<B>Crew Manifest</B>:<BR>"
|
||||
for(var/mob/living/carbon/human/M in GLOB.mob_list)
|
||||
for(var/thing in GLOB.human_list)
|
||||
var/mob/living/carbon/human/M = thing
|
||||
dat += text(" <B>[]</B> - []<BR>", M.name, M.get_assignment())
|
||||
var/obj/item/paper/P = new /obj/item/paper( src.loc )
|
||||
P.info = dat
|
||||
|
||||
@@ -190,6 +190,16 @@
|
||||
to_chat(S, "<span class='biggerdanger'>You are a spider who is loyal to [S.master_commander], obey [S.master_commander]'s every order and assist [S.master_commander.p_them()] in completing [S.master_commander.p_their()] goals at any cost.</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/spider/spiderling/decompile_act(obj/item/matter_decompiler/C, mob/user)
|
||||
if(!istype(user, /mob/living/silicon/robot/drone))
|
||||
user.visible_message("<span class='notice'>[user] sucks [src] into its decompiler. There's a horrible crunching noise.</span>", \
|
||||
"<span class='warning'>It's a bit of a struggle, but you manage to suck [user] into your decompiler. It makes a series of visceral crunching noises.</span>")
|
||||
C.stored_comms["wood"] += 2
|
||||
C.stored_comms["glass"] += 2
|
||||
qdel(src)
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/obj/effect/decal/cleanable/spiderling_remains
|
||||
name = "spiderling remains"
|
||||
desc = "Green squishy mess."
|
||||
|
||||
@@ -506,7 +506,7 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect
|
||||
"<span class='userdanger'>You stab yourself in the eyes with [src]!</span>" \
|
||||
)
|
||||
|
||||
add_attack_logs(user, M, "Eye-stabbed with [src] (INTENT: [uppertext(user.a_intent)])")
|
||||
add_attack_logs(user, M, "Eye-stabbed with [src] ([uppertext(user.a_intent)])")
|
||||
|
||||
if(istype(H))
|
||||
var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes)
|
||||
|
||||
@@ -18,13 +18,6 @@
|
||||
name = "syndicate personal AI device"
|
||||
faction = list("syndicate")
|
||||
|
||||
/obj/item/paicard/relaymove(var/mob/user, var/direction)
|
||||
if(user.stat || user.stunned)
|
||||
return
|
||||
var/obj/item/rig/rig = get_rig()
|
||||
if(istype(rig))
|
||||
rig.forced_move(direction, user)
|
||||
|
||||
/obj/item/paicard/New()
|
||||
..()
|
||||
overlays += "pai-off"
|
||||
|
||||
@@ -226,7 +226,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
|
||||
channels[chan_name] |= FREQ_LISTENING
|
||||
. = 1
|
||||
else if(href_list["spec_freq"])
|
||||
var freq = href_list["spec_freq"]
|
||||
var/freq = href_list["spec_freq"]
|
||||
if(has_channel_access(usr, freq))
|
||||
set_frequency(text2num(freq))
|
||||
. = 1
|
||||
@@ -411,11 +411,16 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
|
||||
jobname = "Unknown"
|
||||
voicemask = TRUE
|
||||
|
||||
// Copy the message pieces so we can safely edit comms line without affecting the actual line
|
||||
var/list/message_pieces_copy = list()
|
||||
for(var/datum/multilingual_say_piece/S in message_pieces)
|
||||
message_pieces_copy += new /datum/multilingual_say_piece(S.speaking, S.message)
|
||||
|
||||
// Make us a message datum!
|
||||
var/datum/tcomms_message/tcm = new
|
||||
tcm.sender_name = displayname
|
||||
tcm.sender_job = jobname
|
||||
tcm.message_pieces = message_pieces
|
||||
tcm.message_pieces = message_pieces_copy
|
||||
tcm.source_level = position.z
|
||||
tcm.freq = connection.frequency
|
||||
tcm.vmask = voicemask
|
||||
|
||||
@@ -19,5 +19,5 @@
|
||||
/obj/item/sensor_device/attack_self(mob/user as mob)
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/item/sensor_device/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state)
|
||||
/obj/item/sensor_device/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state)
|
||||
crew_monitor.tgui_interact(user, ui_key, ui, force_open)
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
"<span class='userdanger'>[user] has prodded you with [src]!</span>")
|
||||
|
||||
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
|
||||
add_attack_logs(user, M, "Stunned with [src] (INTENT: [uppertext(user.a_intent)])")
|
||||
add_attack_logs(user, M, "Stunned with [src] ([uppertext(user.a_intent)])")
|
||||
|
||||
/obj/item/borg/overdrive
|
||||
name = "Overdrive"
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
GLOBAL_LIST_INIT(glass_recipes, list ( \
|
||||
new/datum/stack_recipe/window("directional window", /obj/structure/window/basic, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 0), \
|
||||
new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 0, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 0, on_floor = TRUE) \
|
||||
new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 10), \
|
||||
new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 20, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/glass
|
||||
|
||||
@@ -242,7 +242,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
|
||||
HS.amount++
|
||||
src.use(1)
|
||||
wetness = initial(wetness)
|
||||
break
|
||||
return
|
||||
//If it gets to here it means it did not find a suitable stack on the tile.
|
||||
var/obj/item/stack/sheet/leather/HS = new(src.loc)
|
||||
HS.amount = 1
|
||||
|
||||
@@ -218,10 +218,22 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
|
||||
|
||||
/obj/item/stack/sheet/mineral/plasma/welder_act(mob/user, obj/item/I)
|
||||
if(I.use_tool(src, user, volume = I.tool_volume))
|
||||
message_admins("Plasma sheets ignited by [key_name_admin(user)]([ADMIN_QUE(user,"?")]) ([ADMIN_FLW(user,"FLW")]) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
log_game("Plasma sheets ignited by [key_name(user)] in ([x],[y],[z])")
|
||||
investigate_log("was <font color='red'><b>ignited</b></font> by [key_name(user)]","atmos")
|
||||
fire_act()
|
||||
log_and_set_aflame(user, I)
|
||||
return TRUE
|
||||
|
||||
/obj/item/stack/sheet/mineral/plasma/attackby(obj/item/I, mob/living/user, params)
|
||||
if(is_hot(I))
|
||||
log_and_set_aflame(user, I)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/stack/sheet/mineral/plasma/proc/log_and_set_aflame(mob/user, obj/item/I)
|
||||
var/turf/T = get_turf(src)
|
||||
message_admins("Plasma sheets ignited by [key_name_admin(user)]([ADMIN_QUE(user, "?")]) ([ADMIN_FLW(user, "FLW")]) in ([COORD(T)] - [ADMIN_JMP(T)]")
|
||||
log_game("Plasma sheets ignited by [key_name(user)] in [COORD(T)]")
|
||||
investigate_log("was <font color='red'><b>ignited</b></font> by [key_name(user)]", "atmos")
|
||||
user.create_log(MISC_LOG, "Plasma sheets ignited using [I]", src)
|
||||
fire_act()
|
||||
|
||||
/obj/item/stack/sheet/mineral/plasma/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
|
||||
..()
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
desc = "This is rubbish."
|
||||
resistance_flags = FLAMMABLE
|
||||
|
||||
/obj/item/trash/decompile_act(obj/item/matter_decompiler/C, mob/user)
|
||||
C.stored_comms["metal"] += 2
|
||||
C.stored_comms["wood"] += 1
|
||||
C.stored_comms["glass"] += 1
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/item/trash/raisins
|
||||
name = "4no raisins"
|
||||
icon_state= "4no_raisins"
|
||||
|
||||
@@ -58,7 +58,7 @@ RSF
|
||||
if(!proximity) return
|
||||
if(!(istype(A, /obj/structure/table) || istype(A, /turf/simulated/floor)))
|
||||
return
|
||||
var spawn_location
|
||||
var/spawn_location
|
||||
var/turf/T = get_turf(A)
|
||||
if(istype(T) && !T.density)
|
||||
spawn_location = T
|
||||
|
||||
@@ -356,13 +356,13 @@
|
||||
|
||||
/obj/item/card/id/syndicate/attack_self(mob/user as mob)
|
||||
if(!src.registered_name)
|
||||
var t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name))
|
||||
var/t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name))
|
||||
if(!t)
|
||||
to_chat(user, "<span class='warning'>Invalid name.</span>")
|
||||
return
|
||||
src.registered_name = t
|
||||
|
||||
var u = sanitize(stripped_input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than maintenance.", "Agent Card Job Assignment", "Agent", MAX_MESSAGE_LEN))
|
||||
var/u = sanitize(stripped_input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than maintenance.", "Agent Card Job Assignment", "Agent", MAX_MESSAGE_LEN))
|
||||
if(!u)
|
||||
to_chat(user, "<span class='warning'>Invalid assignment.</span>")
|
||||
src.registered_name = ""
|
||||
|
||||
@@ -311,6 +311,11 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
pixel_y = rand(-10,10)
|
||||
transform = turn(transform,rand(0,360))
|
||||
|
||||
/obj/item/cigbutt/decompile_act(obj/item/matter_decompiler/C, mob/user)
|
||||
C.stored_comms["wood"] += 1
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/item/cigbutt/cigarbutt
|
||||
name = "cigar butt"
|
||||
desc = "A manky old cigar butt."
|
||||
|
||||
@@ -5,16 +5,22 @@
|
||||
icon_state = "lipstick"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/colour = "red"
|
||||
var/open = 0
|
||||
var/list/lipstick_colors = list(
|
||||
"purple" = "purple",
|
||||
"jade" = "#216F43",
|
||||
"lime" = "lime",
|
||||
"black" = "black",
|
||||
"green" = "green",
|
||||
"blue" = "blue",
|
||||
"white" = "white")
|
||||
var/open = FALSE
|
||||
var/static/list/lipstick_colors
|
||||
|
||||
/obj/item/lipstick/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!lipstick_colors)
|
||||
lipstick_colors = list(
|
||||
"black" = "#000000",
|
||||
"white" = "#FFFFFF",
|
||||
"red" = "#FF0000",
|
||||
"green" = "#00C000",
|
||||
"blue" = "#0000FF",
|
||||
"purple" = "#D55CD0",
|
||||
"jade" = "#216F43",
|
||||
"lime" = "#00FF00",
|
||||
)
|
||||
|
||||
/obj/item/lipstick/purple
|
||||
name = "purple lipstick"
|
||||
@@ -22,7 +28,7 @@
|
||||
|
||||
/obj/item/lipstick/jade
|
||||
name = "jade lipstick"
|
||||
colour = "#216F43"
|
||||
colour = "jade"
|
||||
|
||||
/obj/item/lipstick/lime
|
||||
name = "lime lipstick"
|
||||
@@ -47,40 +53,38 @@
|
||||
/obj/item/lipstick/random
|
||||
name = "lipstick"
|
||||
|
||||
/obj/item/lipstick/random/New()
|
||||
..()
|
||||
var/lscolor = pick(lipstick_colors)//A random color is picked from the var defined initially in a new var.
|
||||
colour = lipstick_colors[lscolor]//The color of the lipstick is pulled from the new variable (right hand side, HTML & Hex RGB)
|
||||
name = "[lscolor] lipstick"//The new variable is also used to match the name to the color of the lipstick. Kudos to Desolate & Lemon
|
||||
/obj/item/lipstick/random/Initialize(mapload)
|
||||
. = ..()
|
||||
var/lscolor = pick(lipstick_colors) // A random color is picked from the var defined initially in a new var.
|
||||
colour = lipstick_colors[lscolor] // The color of the lipstick is pulled from the new variable (right hand side, HTML & Hex RGB)
|
||||
name = "[lscolor] lipstick" // The new variable is also used to match the name to the color of the lipstick. Kudos to Desolate & Lemon
|
||||
|
||||
|
||||
/obj/item/lipstick/attack_self(mob/user as mob)
|
||||
overlays.Cut()
|
||||
/obj/item/lipstick/attack_self(mob/user)
|
||||
cut_overlays()
|
||||
to_chat(user, "<span class='notice'>You twist \the [src] [open ? "closed" : "open"].</span>")
|
||||
open = !open
|
||||
if(open)
|
||||
var/image/colored = image("icon"='icons/obj/items.dmi', "icon_state"="lipstick_uncap_color")
|
||||
colored.color = colour
|
||||
var/image/colored = mutable_appearance('icons/obj/items.dmi', "lipstick_uncap_color")
|
||||
colored.color = lipstick_colors[colour]
|
||||
icon_state = "lipstick_uncap"
|
||||
overlays += colored
|
||||
add_overlay(colored)
|
||||
else
|
||||
icon_state = "lipstick"
|
||||
|
||||
/obj/item/lipstick/attack(mob/M as mob, mob/user as mob)
|
||||
if(!open) return
|
||||
|
||||
if(!istype(M, /mob)) return
|
||||
/obj/item/lipstick/attack(mob/M, mob/user)
|
||||
if(!open || !istype(M))
|
||||
return
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.lip_style) //if they already have lipstick on
|
||||
if(H.lip_style) // If they already have lipstick on
|
||||
to_chat(user, "<span class='notice'>You need to wipe off the old lipstick first!</span>")
|
||||
return
|
||||
if(H == user)
|
||||
user.visible_message("<span class='notice'>[user] does [user.p_their()] lips with [src].</span>", \
|
||||
"<span class='notice'>You take a moment to apply [src]. Perfect!</span>")
|
||||
H.lip_style = "lipstick"
|
||||
H.lip_color = colour
|
||||
H.lip_color = lipstick_colors[colour]
|
||||
H.update_body()
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] begins to do [H]'s lips with \the [src].</span>", \
|
||||
@@ -89,7 +93,7 @@
|
||||
user.visible_message("<span class='notice'>[user] does [H]'s lips with \the [src].</span>", \
|
||||
"<span class='notice'>You apply \the [src].</span>")
|
||||
H.lip_style = "lipstick"
|
||||
H.lip_color = colour
|
||||
H.lip_color = lipstick_colors[colour]
|
||||
H.update_body()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Where are the lips on that?</span>")
|
||||
|
||||
@@ -488,7 +488,7 @@
|
||||
var/mob/living/carbon/human/holder = loc
|
||||
if(src == holder.l_hand || src == holder.r_hand) // Holding this in your hand will
|
||||
for(var/mob/living/carbon/human/H in range(5, loc))
|
||||
if(H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full))
|
||||
if(H.mind && H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full))
|
||||
H.mind.vampire.nullified = max(5, H.mind.vampire.nullified + 2)
|
||||
if(prob(10))
|
||||
to_chat(H, "<span class='userdanger'>Being in the presence of [holder]'s [src] is interfering with your powers!</span>")
|
||||
|
||||
@@ -244,12 +244,18 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/match/decompile_act(obj/item/matter_decompiler/C, mob/user)
|
||||
if(burnt)
|
||||
C.stored_comms["wood"] += 1
|
||||
qdel(src)
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/obj/item/proc/help_light_cig(mob/living/M)
|
||||
var/mask_item = M.get_item_by_slot(slot_wear_mask)
|
||||
if(istype(mask_item, /obj/item/clothing/mask/cigarette))
|
||||
return mask_item
|
||||
|
||||
|
||||
/obj/item/match/firebrand
|
||||
name = "firebrand"
|
||||
desc = "An unlit firebrand. It makes you wonder why it's not just called a stick."
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user