Merge branch 'master' into overhaul-event-mob-selection

This commit is contained in:
mochi
2020-08-12 01:22:52 +02:00
253 changed files with 944 additions and 6418 deletions
-1
View File
@@ -2,7 +2,6 @@
[![Build Status](https://travis-ci.org/ParadiseSS13/Paradise.svg?branch=master)](https://travis-ci.org/ParadiseSS13/Paradise)
[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/paradisess13/paradise.svg)](http://isitmaintained.com/project/paradisess13/paradise "Average time to resolve an issue")
[![Percentage of issues still open](http://isitmaintained.com/badge/open/paradisess13/paradise.svg)](http://isitmaintained.com/project/paradisess13/paradise "Percentage of issues still open")
[![Krihelimeter](http://www.krihelinator.xyz/badge/paradisess13/paradise)](http://www.krihelinator.xyz)
![Render Nanomaps](https://github.com/ParadiseSS13/Paradise/workflows/Render%20Nanomaps/badge.svg)
[![forthebadge](http://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](http://forthebadge.com)
+1 -1
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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
-56
View File
@@ -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()
+9 -2
View File
@@ -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)
+1 -1
View File
@@ -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\]", "&ZeroWidthSpace;<img src = ntlogo.png>")
text = replacetext(text, "\[time\]", "[station_time_timestamp()]") // TO DO
if(!no_font)
if(P)
+10
View File
@@ -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))
+1 -1
View File
@@ -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)
-84
View File
@@ -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
-4
View File
@@ -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
+1 -1
View File
@@ -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()
+2 -1
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
+3 -2
View File
@@ -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)
+24 -9
View File
@@ -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
+30 -8
View File
@@ -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
View File
@@ -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()
+3 -2
View File
@@ -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
+12 -3
View File
@@ -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
View File
@@ -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
+3
View File
@@ -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
+1 -1
View File
@@ -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))
+1 -1
View File
@@ -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>&ZeroWidthSpace;<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
+6 -3
View File
@@ -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
+1 -2
View File
@@ -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)
+2 -1
View File
@@ -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
+4 -2
View File
@@ -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"))
+4 -2
View File
@@ -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")
+3 -2
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+2 -6
View File
@@ -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>"}
+1
View File
@@ -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)
+32
View File
@@ -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)
+1
View File
@@ -34,6 +34,7 @@
. = ..()
link_password = GenerateKey()
reachable_zlevels |= loc.z
component_parts += new /obj/item/circuitboard/tcomms/core(null)
/**
* Destructor for the core.
+1
View File
@@ -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
+1 -1
View File
@@ -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
-280
View File
@@ -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)
+2 -2
View File
@@ -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
+15 -4
View File
@@ -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--
+2 -1
View File
@@ -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
+10
View File
@@ -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."
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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)
..()
+7
View File
@@ -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"
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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 = ""
+5
View File
@@ -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."
+32 -28
View File
@@ -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>")
+7 -1
View File
@@ -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