Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into proc-define-shit
This commit is contained in:
Vendored
+38
@@ -7,6 +7,44 @@
|
||||
"name": "Launch DreamSeeker",
|
||||
"preLaunchTask": "Build All",
|
||||
"dmb": "${workspaceFolder}/${command:CurrentDMB}"
|
||||
},
|
||||
{
|
||||
"type": "byond",
|
||||
"request": "launch",
|
||||
"name": "Launch DreamDaemon",
|
||||
"preLaunchTask": "Build All",
|
||||
"dmb": "${workspaceFolder}/${command:CurrentDMB}",
|
||||
"dreamDaemon": true
|
||||
},
|
||||
{
|
||||
"type": "byond",
|
||||
"request": "launch",
|
||||
"name": "Launch DreamSeeker (TESTING)",
|
||||
"preLaunchTask": "Build All (TESTING)",
|
||||
"dmb": "${workspaceFolder}/${command:CurrentDMB}"
|
||||
},
|
||||
{
|
||||
"type": "byond",
|
||||
"request": "launch",
|
||||
"name": "Launch DreamDaemon (TESTING)",
|
||||
"preLaunchTask": "Build All (TESTING)",
|
||||
"dmb": "${workspaceFolder}/${command:CurrentDMB}",
|
||||
"dreamDaemon": true
|
||||
},
|
||||
{
|
||||
"type": "byond",
|
||||
"request": "launch",
|
||||
"name": "Launch DreamSeeker (LOWMEMORYMODE)",
|
||||
"preLaunchTask": "Build All (LOWMEMORYMODE)",
|
||||
"dmb": "${workspaceFolder}/${command:CurrentDMB}"
|
||||
},
|
||||
{
|
||||
"type": "byond",
|
||||
"request": "launch",
|
||||
"name": "Launch DreamDaemon (LOWMEMORYMODE)",
|
||||
"preLaunchTask": "Build All (LOWMEMORYMODE)",
|
||||
"dmb": "${workspaceFolder}/${command:CurrentDMB}",
|
||||
"dreamDaemon": true
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Vendored
+50
@@ -24,6 +24,56 @@
|
||||
"dependsOn": "dm: reparse",
|
||||
"label": "Build All"
|
||||
},
|
||||
{
|
||||
"type": "process",
|
||||
"command": "tools/build/build",
|
||||
"windows": {
|
||||
"command": ".\\tools\\build\\build.bat"
|
||||
},
|
||||
"options": {
|
||||
"env": {
|
||||
"DM_EXE": "${config:dreammaker.byondPath}"
|
||||
}
|
||||
},
|
||||
"problemMatcher": [
|
||||
"$dreammaker",
|
||||
"$tsc",
|
||||
"$eslint-stylish"
|
||||
],
|
||||
"group": {
|
||||
"kind": "build"
|
||||
},
|
||||
"dependsOn": "dm: reparse",
|
||||
"args": [
|
||||
"-DTESTING"
|
||||
],
|
||||
"label": "Build All (TESTING)"
|
||||
},
|
||||
{
|
||||
"type": "process",
|
||||
"command": "tools/build/build",
|
||||
"windows": {
|
||||
"command": ".\\tools\\build\\build.bat"
|
||||
},
|
||||
"options": {
|
||||
"env": {
|
||||
"DM_EXE": "${config:dreammaker.byondPath}"
|
||||
}
|
||||
},
|
||||
"problemMatcher": [
|
||||
"$dreammaker",
|
||||
"$tsc",
|
||||
"$eslint-stylish"
|
||||
],
|
||||
"group": {
|
||||
"kind": "build"
|
||||
},
|
||||
"dependsOn": "dm: reparse",
|
||||
"args": [
|
||||
"-DLOWMEMORYMODE"
|
||||
],
|
||||
"label": "Build All (LOWMEMORYMODE)"
|
||||
},
|
||||
{
|
||||
"type": "dreammaker",
|
||||
"dme": "tgstation.dme",
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
"b" = (
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors)
|
||||
"c" = (
|
||||
/obj/structure/table/wood,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"d" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/lighter,
|
||||
@@ -21,11 +25,11 @@
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"f" = (
|
||||
/obj/machinery/plantgenes/seedvault{
|
||||
pixel_y = 6
|
||||
/obj/structure/sink{
|
||||
dir = 4;
|
||||
pixel_x = 11
|
||||
},
|
||||
/obj/structure/table/wood,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/turf/open/floor/grass,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"g" = (
|
||||
/obj/structure/table/wood,
|
||||
@@ -61,7 +65,7 @@
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"l" = (
|
||||
/obj/machinery/door/airlock,
|
||||
/obj/machinery/door/airlock/titanium/glass,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"m" = (
|
||||
@@ -73,7 +77,8 @@
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"n" = (
|
||||
/obj/machinery/smartfridge,
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/gps,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"o" = (
|
||||
@@ -93,8 +98,9 @@
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"p" = (
|
||||
/obj/machinery/hydroponics/constructable,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/obj/structure/grille,
|
||||
/obj/machinery/smartfridge,
|
||||
/turf/open/floor/circuit/green,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"q" = (
|
||||
/obj/item/hatchet,
|
||||
@@ -113,24 +119,15 @@
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"s" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/gun/energy/floragun,
|
||||
/obj/item/gun/energy/floragun,
|
||||
/obj/item/gun/energy/floragun,
|
||||
/obj/item/gun/energy/floragun,
|
||||
/obj/item/storage/box/disks_plantgene,
|
||||
/obj/item/seeds/bee_balm/honey_balm,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"t" = (
|
||||
/obj/effect/mob_spawn/human/seed_vault,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/turf/open/floor/grass,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"u" = (
|
||||
/obj/structure/sink{
|
||||
dir = 8;
|
||||
pixel_x = -12;
|
||||
pixel_y = 2
|
||||
},
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/turf/open/floor/grass,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"v" = (
|
||||
/obj/machinery/vending/hydronutrients,
|
||||
@@ -152,10 +149,8 @@
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"y" = (
|
||||
/obj/structure/sink{
|
||||
dir = 4;
|
||||
pixel_x = 11
|
||||
},
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/pickaxe,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"z" = (
|
||||
@@ -165,6 +160,10 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"A" = (
|
||||
/obj/structure/table/glass,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"B" = (
|
||||
/obj/structure/disposalpipe/trunk,
|
||||
/obj/machinery/disposal/bin,
|
||||
@@ -183,27 +182,25 @@
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"F" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/obj/structure/grille,
|
||||
/obj/structure/window/shuttle,
|
||||
/turf/open/floor/circuit/green,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"G" = (
|
||||
/obj/structure/closet/crate/hydroponics,
|
||||
/obj/item/clothing/under/rank/civilian/hydroponics,
|
||||
/obj/item/clothing/under/rank/civilian/hydroponics,
|
||||
/obj/item/clothing/under/rank/civilian/hydroponics,
|
||||
/obj/item/clothing/under/rank/civilian/hydroponics,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/turf/closed/wall/mineral/titanium/interior,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"H" = (
|
||||
/obj/machinery/chem_master/condimaster,
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/gun/energy/floragun,
|
||||
/obj/item/gun/energy/floragun,
|
||||
/obj/item/gun/energy/floragun,
|
||||
/obj/item/gun/energy/floragun,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"I" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/reagent_containers/glass/bucket,
|
||||
/obj/item/reagent_containers/glass/bucket,
|
||||
/obj/item/reagent_containers/glass/bucket,
|
||||
/obj/item/reagent_containers/glass/bucket,
|
||||
/obj/item/watertank,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"J" = (
|
||||
@@ -211,6 +208,13 @@
|
||||
/obj/structure/table/wood,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"K" = (
|
||||
/obj/machinery/light{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/flora/ausbushes/ywflowers,
|
||||
/turf/open/floor/grass,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"L" = (
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 5
|
||||
@@ -224,8 +228,10 @@
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors)
|
||||
"N" = (
|
||||
/obj/machinery/plantgenes/seedvault{
|
||||
pixel_y = 6
|
||||
},
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/storage/box/disks_plantgene,
|
||||
/obj/machinery/light{
|
||||
dir = 1
|
||||
},
|
||||
@@ -238,38 +244,59 @@
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"P" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/storage/box/disks_plantgene,
|
||||
/obj/machinery/light,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"Q" = (
|
||||
/obj/machinery/hydroponics/constructable,
|
||||
/turf/open/floor/grass,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"R" = (
|
||||
/obj/structure/sink{
|
||||
dir = 8;
|
||||
pixel_x = -12;
|
||||
pixel_y = 2
|
||||
},
|
||||
/turf/open/floor/grass,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"S" = (
|
||||
/turf/closed/wall/mineral/titanium/interior,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"T" = (
|
||||
/obj/structure/closet/crate/hydroponics,
|
||||
/obj/item/clothing/under/rank/civilian/hydroponics,
|
||||
/obj/item/clothing/under/rank/civilian/hydroponics,
|
||||
/obj/item/clothing/under/rank/civilian/hydroponics,
|
||||
/obj/item/clothing/under/rank/civilian/hydroponics,
|
||||
/obj/machinery/light,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"U" = (
|
||||
/obj/machinery/light,
|
||||
/obj/structure/flora/ausbushes/ppflowers,
|
||||
/turf/open/floor/grass,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"V" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/reagent_containers/glass/bucket,
|
||||
/obj/item/reagent_containers/glass/bucket,
|
||||
/obj/item/reagent_containers/glass/bucket,
|
||||
/obj/item/reagent_containers/glass/bucket,
|
||||
/obj/machinery/light,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"X" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/construction/plumbing,
|
||||
/obj/machinery/light{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"Q" = (
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"R" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"S" = (
|
||||
/obj/machinery/light{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"U" = (
|
||||
/obj/machinery/light,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"V" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"X" = (
|
||||
/obj/machinery/hydroponics/constructable,
|
||||
/obj/machinery/light,
|
||||
"Y" = (
|
||||
/obj/machinery/chem_master,
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/lavaland/powered/seedvault)
|
||||
"Z" = (
|
||||
@@ -288,12 +315,12 @@ a
|
||||
a
|
||||
a
|
||||
a
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
S
|
||||
S
|
||||
S
|
||||
S
|
||||
S
|
||||
S
|
||||
a
|
||||
a
|
||||
a
|
||||
@@ -309,14 +336,14 @@ a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
Q
|
||||
S
|
||||
S
|
||||
t
|
||||
t
|
||||
t
|
||||
t
|
||||
Q
|
||||
a
|
||||
S
|
||||
S
|
||||
a
|
||||
a
|
||||
a
|
||||
@@ -329,41 +356,41 @@ b
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
Q
|
||||
Q
|
||||
O
|
||||
h
|
||||
h
|
||||
S
|
||||
S
|
||||
S
|
||||
S
|
||||
K
|
||||
u
|
||||
u
|
||||
U
|
||||
Q
|
||||
Q
|
||||
S
|
||||
S
|
||||
S
|
||||
S
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
a
|
||||
b
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
b
|
||||
a
|
||||
a
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
S
|
||||
S
|
||||
w
|
||||
v
|
||||
S
|
||||
F
|
||||
l
|
||||
l
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
a
|
||||
a
|
||||
F
|
||||
S
|
||||
w
|
||||
v
|
||||
S
|
||||
S
|
||||
a
|
||||
a
|
||||
a
|
||||
@@ -371,241 +398,241 @@ a
|
||||
(5,1,1) = {"
|
||||
a
|
||||
a
|
||||
Q
|
||||
Q
|
||||
k
|
||||
Q
|
||||
n
|
||||
S
|
||||
S
|
||||
u
|
||||
u
|
||||
u
|
||||
R
|
||||
u
|
||||
h
|
||||
h
|
||||
u
|
||||
R
|
||||
Z
|
||||
Q
|
||||
a
|
||||
a
|
||||
a
|
||||
u
|
||||
u
|
||||
u
|
||||
S
|
||||
S
|
||||
a
|
||||
a
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
a
|
||||
a
|
||||
S
|
||||
C
|
||||
u
|
||||
Q
|
||||
d
|
||||
h
|
||||
u
|
||||
Q
|
||||
o
|
||||
u
|
||||
h
|
||||
h
|
||||
h
|
||||
h
|
||||
h
|
||||
h
|
||||
G
|
||||
u
|
||||
Q
|
||||
a
|
||||
a
|
||||
a
|
||||
u
|
||||
Q
|
||||
u
|
||||
Z
|
||||
S
|
||||
a
|
||||
a
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
a
|
||||
a
|
||||
Q
|
||||
S
|
||||
N
|
||||
h
|
||||
u
|
||||
Q
|
||||
P
|
||||
h
|
||||
p
|
||||
h
|
||||
h
|
||||
p
|
||||
h
|
||||
X
|
||||
u
|
||||
Q
|
||||
a
|
||||
a
|
||||
a
|
||||
u
|
||||
h
|
||||
h
|
||||
u
|
||||
Q
|
||||
u
|
||||
Q
|
||||
u
|
||||
V
|
||||
S
|
||||
a
|
||||
a
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
b
|
||||
a
|
||||
S
|
||||
g
|
||||
u
|
||||
Q
|
||||
e
|
||||
h
|
||||
l
|
||||
h
|
||||
h
|
||||
v
|
||||
u
|
||||
Q
|
||||
u
|
||||
h
|
||||
h
|
||||
u
|
||||
Q
|
||||
u
|
||||
Q
|
||||
u
|
||||
B
|
||||
F
|
||||
F
|
||||
V
|
||||
G
|
||||
L
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
b
|
||||
a
|
||||
Q
|
||||
S
|
||||
e
|
||||
u
|
||||
u
|
||||
u
|
||||
f
|
||||
h
|
||||
Q
|
||||
p
|
||||
h
|
||||
n
|
||||
u
|
||||
h
|
||||
h
|
||||
C
|
||||
h
|
||||
k
|
||||
Q
|
||||
u
|
||||
f
|
||||
u
|
||||
u
|
||||
u
|
||||
r
|
||||
S
|
||||
M
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(10,1,1) = {"
|
||||
a
|
||||
a
|
||||
Q
|
||||
g
|
||||
h
|
||||
Q
|
||||
S
|
||||
S
|
||||
F
|
||||
l
|
||||
p
|
||||
h
|
||||
w
|
||||
h
|
||||
h
|
||||
S
|
||||
D
|
||||
h
|
||||
h
|
||||
o
|
||||
S
|
||||
p
|
||||
Q
|
||||
l
|
||||
F
|
||||
S
|
||||
S
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
a
|
||||
a
|
||||
Q
|
||||
S
|
||||
k
|
||||
h
|
||||
h
|
||||
Q
|
||||
q
|
||||
e
|
||||
S
|
||||
O
|
||||
h
|
||||
x
|
||||
h
|
||||
T
|
||||
S
|
||||
H
|
||||
h
|
||||
h
|
||||
E
|
||||
h
|
||||
H
|
||||
Q
|
||||
a
|
||||
a
|
||||
a
|
||||
S
|
||||
a
|
||||
a
|
||||
"}
|
||||
(12,1,1) = {"
|
||||
b
|
||||
a
|
||||
Q
|
||||
O
|
||||
S
|
||||
k
|
||||
h
|
||||
h
|
||||
Q
|
||||
P
|
||||
S
|
||||
I
|
||||
h
|
||||
h
|
||||
h
|
||||
h
|
||||
h
|
||||
h
|
||||
J
|
||||
S
|
||||
X
|
||||
Q
|
||||
a
|
||||
a
|
||||
a
|
||||
h
|
||||
h
|
||||
A
|
||||
S
|
||||
a
|
||||
a
|
||||
"}
|
||||
(13,1,1) = {"
|
||||
a
|
||||
a
|
||||
Q
|
||||
i
|
||||
h
|
||||
Q
|
||||
r
|
||||
S
|
||||
k
|
||||
h
|
||||
h
|
||||
p
|
||||
p
|
||||
d
|
||||
S
|
||||
c
|
||||
h
|
||||
h
|
||||
I
|
||||
Q
|
||||
a
|
||||
a
|
||||
a
|
||||
n
|
||||
S
|
||||
x
|
||||
h
|
||||
h
|
||||
Y
|
||||
S
|
||||
a
|
||||
a
|
||||
"}
|
||||
(14,1,1) = {"
|
||||
a
|
||||
a
|
||||
Q
|
||||
Q
|
||||
S
|
||||
S
|
||||
i
|
||||
i
|
||||
Q
|
||||
s
|
||||
S
|
||||
y
|
||||
q
|
||||
h
|
||||
h
|
||||
y
|
||||
S
|
||||
J
|
||||
Q
|
||||
a
|
||||
a
|
||||
a
|
||||
A
|
||||
h
|
||||
h
|
||||
S
|
||||
S
|
||||
a
|
||||
a
|
||||
"}
|
||||
(15,1,1) = {"
|
||||
a
|
||||
a
|
||||
b
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
a
|
||||
S
|
||||
S
|
||||
S
|
||||
S
|
||||
S
|
||||
S
|
||||
z
|
||||
z
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
Q
|
||||
a
|
||||
a
|
||||
S
|
||||
S
|
||||
S
|
||||
S
|
||||
S
|
||||
S
|
||||
a
|
||||
a
|
||||
a
|
||||
@@ -613,21 +640,21 @@ a
|
||||
(16,1,1) = {"
|
||||
b
|
||||
a
|
||||
b
|
||||
a
|
||||
j
|
||||
Q
|
||||
S
|
||||
j
|
||||
Q
|
||||
S
|
||||
j
|
||||
Q
|
||||
S
|
||||
h
|
||||
h
|
||||
Q
|
||||
S
|
||||
j
|
||||
Q
|
||||
S
|
||||
j
|
||||
S
|
||||
j
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
@@ -641,10 +668,10 @@ a
|
||||
a
|
||||
a
|
||||
a
|
||||
Q
|
||||
S
|
||||
m
|
||||
m
|
||||
Q
|
||||
S
|
||||
b
|
||||
b
|
||||
b
|
||||
@@ -683,7 +710,7 @@ a
|
||||
a
|
||||
b
|
||||
b
|
||||
a
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
/turf/open/floor/engine,
|
||||
/area/ruin/powered)
|
||||
"I" = (
|
||||
/obj/item/aiModule/toyAI,
|
||||
/obj/item/ai_module/toyAI,
|
||||
/turf/open/floor/engine,
|
||||
/area/ruin/powered)
|
||||
"J" = (
|
||||
|
||||
@@ -21695,7 +21695,7 @@
|
||||
/area/command/meeting_room)
|
||||
"bbj" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/reset,
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
@@ -21981,7 +21981,7 @@
|
||||
/area/command/meeting_room)
|
||||
"bce" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/supplied/quarantine,
|
||||
/obj/item/ai_module/supplied/quarantine,
|
||||
/obj/machinery/camera/motion{
|
||||
c_tag = "AI Upload Chamber - West";
|
||||
dir = 4;
|
||||
@@ -21998,7 +21998,7 @@
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"bcg" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/supplied/freeform,
|
||||
/obj/item/ai_module/supplied/freeform,
|
||||
/obj/structure/sign/plaques/kiddie{
|
||||
pixel_x = 32
|
||||
},
|
||||
@@ -22674,8 +22674,8 @@
|
||||
/area/maintenance/port)
|
||||
"beb" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/core/full/asimov,
|
||||
/obj/item/aiModule/core/freeformcore,
|
||||
/obj/item/ai_module/core/full/asimov,
|
||||
/obj/item/ai_module/core/freeformcore,
|
||||
/obj/machinery/door/window{
|
||||
base_state = "right";
|
||||
dir = 4;
|
||||
@@ -22692,7 +22692,7 @@
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/aiModule/core/full/custom,
|
||||
/obj/item/ai_module/core/full/custom,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"bec" = (
|
||||
@@ -22734,14 +22734,14 @@
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"beg" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/supplied/oxygen,
|
||||
/obj/item/aiModule/zeroth/oneHuman,
|
||||
/obj/item/ai_module/supplied/oxygen,
|
||||
/obj/item/ai_module/zeroth/oneHuman,
|
||||
/obj/machinery/door/window{
|
||||
dir = 8;
|
||||
name = "High-Risk Modules";
|
||||
req_access_txt = "20"
|
||||
},
|
||||
/obj/item/aiModule/reset/purge,
|
||||
/obj/item/ai_module/reset/purge,
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/effect/spawner/lootdrop/aimodule_harmful,
|
||||
/obj/structure/window/reinforced{
|
||||
@@ -22750,7 +22750,7 @@
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/aiModule/supplied/protectStation,
|
||||
/obj/item/ai_module/supplied/protectStation,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"beh" = (
|
||||
@@ -34141,7 +34141,7 @@
|
||||
"bEX" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aicard,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/reset,
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
|
||||
@@ -23661,14 +23661,14 @@
|
||||
dir = 4;
|
||||
light_color = "#e8eaff"
|
||||
},
|
||||
/obj/item/aiModule/reset/purge{
|
||||
/obj/item/ai_module/reset/purge{
|
||||
pixel_y = 6
|
||||
},
|
||||
/obj/item/aiModule/reset{
|
||||
/obj/item/ai_module/reset{
|
||||
pixel_x = -2;
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/item/aiModule/core/full/custom{
|
||||
/obj/item/ai_module/core/full/custom{
|
||||
pixel_x = -4
|
||||
},
|
||||
/obj/machinery/status_display{
|
||||
@@ -24172,7 +24172,7 @@
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/aiModule/core/full/asimov{
|
||||
/obj/item/ai_module/core/full/asimov{
|
||||
pixel_x = 2;
|
||||
pixel_y = 10
|
||||
},
|
||||
@@ -24183,11 +24183,11 @@
|
||||
/obj/effect/spawner/lootdrop/aimodule_harmless{
|
||||
pixel_y = 6
|
||||
},
|
||||
/obj/item/aiModule/core/freeformcore{
|
||||
/obj/item/ai_module/core/freeformcore{
|
||||
pixel_x = -1;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/item/aiModule/supplied/freeform{
|
||||
/obj/item/ai_module/supplied/freeform{
|
||||
pixel_x = -2
|
||||
},
|
||||
/obj/structure/cable{
|
||||
@@ -38060,22 +38060,22 @@
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/aiModule/supplied/oxygen{
|
||||
/obj/item/ai_module/supplied/oxygen{
|
||||
pixel_x = 2;
|
||||
pixel_y = 10
|
||||
},
|
||||
/obj/item/aiModule/supplied/quarantine{
|
||||
/obj/item/ai_module/supplied/quarantine{
|
||||
pixel_x = 1;
|
||||
pixel_y = 8
|
||||
},
|
||||
/obj/item/aiModule/zeroth/oneHuman{
|
||||
/obj/item/ai_module/zeroth/oneHuman{
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/effect/spawner/lootdrop/aimodule_harmful{
|
||||
pixel_x = -1;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/item/aiModule/supplied/protectStation{
|
||||
/obj/item/ai_module/supplied/protectStation{
|
||||
pixel_x = -2
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
|
||||
@@ -29754,7 +29754,7 @@
|
||||
lootcount = 2;
|
||||
lootdoubles = 0
|
||||
},
|
||||
/obj/item/aiModule/supplied/oxygen{
|
||||
/obj/item/ai_module/supplied/oxygen{
|
||||
pixel_x = -3;
|
||||
pixel_y = -3
|
||||
},
|
||||
@@ -30359,12 +30359,12 @@
|
||||
req_access_txt = "20"
|
||||
},
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/item/aiModule/core/freeformcore{
|
||||
/obj/item/ai_module/core/freeformcore{
|
||||
pixel_x = 3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/aiModule/core/full/custom,
|
||||
/obj/item/aiModule/core/full/asimov{
|
||||
/obj/item/ai_module/core/full/custom,
|
||||
/obj/item/ai_module/core/full/asimov{
|
||||
pixel_x = -3;
|
||||
pixel_y = -3
|
||||
},
|
||||
@@ -30464,12 +30464,12 @@
|
||||
req_access_txt = "20"
|
||||
},
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/item/aiModule/supplied/protectStation{
|
||||
/obj/item/ai_module/supplied/protectStation{
|
||||
pixel_x = 3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/aiModule/zeroth/oneHuman,
|
||||
/obj/item/aiModule/reset/purge{
|
||||
/obj/item/ai_module/zeroth/oneHuman,
|
||||
/obj/item/ai_module/reset/purge{
|
||||
pixel_x = -3;
|
||||
pixel_y = -3
|
||||
},
|
||||
@@ -31513,7 +31513,7 @@
|
||||
/area/security/brig)
|
||||
"ckn" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/reset,
|
||||
/obj/item/radio/intercom{
|
||||
name = "Station Intercom";
|
||||
pixel_x = -26
|
||||
@@ -31586,7 +31586,7 @@
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"ckt" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/aiModule/supplied/quarantine,
|
||||
/obj/item/ai_module/supplied/quarantine,
|
||||
/obj/item/radio/intercom{
|
||||
broadcasting = 1;
|
||||
frequency = 1447;
|
||||
@@ -32125,7 +32125,7 @@
|
||||
/area/security/range)
|
||||
"clM" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/aiModule/supplied/freeform,
|
||||
/obj/item/ai_module/supplied/freeform,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
@@ -72976,7 +72976,7 @@
|
||||
/area/service/theater)
|
||||
"eNu" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/reset,
|
||||
/obj/item/assembly/flash/handheld,
|
||||
/obj/item/assembly/flash/handheld,
|
||||
/obj/effect/turf_decal/bot,
|
||||
|
||||
@@ -254,8 +254,8 @@
|
||||
/area/edina)
|
||||
"aaT" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/core/full/asimov,
|
||||
/obj/item/aiModule/core/freeformcore,
|
||||
/obj/item/ai_module/core/full/asimov,
|
||||
/obj/item/ai_module/core/freeformcore,
|
||||
/obj/machinery/door/window{
|
||||
base_state = "right";
|
||||
dir = 4;
|
||||
@@ -272,7 +272,7 @@
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/aiModule/core/full/custom,
|
||||
/obj/item/ai_module/core/full/custom,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"aaU" = (
|
||||
@@ -280,7 +280,7 @@
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"aaV" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/supplied/quarantine,
|
||||
/obj/item/ai_module/supplied/quarantine,
|
||||
/obj/machinery/camera/motion,
|
||||
/obj/machinery/light{
|
||||
dir = 1;
|
||||
@@ -296,7 +296,7 @@
|
||||
/area/edina/street/secondary/command)
|
||||
"aaX" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/reset,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"aaY" = (
|
||||
@@ -659,16 +659,16 @@
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/aiModule/supplied/oxygen,
|
||||
/obj/item/aiModule/zeroth/oneHuman,
|
||||
/obj/item/aiModule/reset/purge,
|
||||
/obj/item/ai_module/supplied/oxygen,
|
||||
/obj/item/ai_module/zeroth/oneHuman,
|
||||
/obj/item/ai_module/reset/purge,
|
||||
/obj/effect/spawner/lootdrop/aimodule_harmful,
|
||||
/obj/item/aiModule/supplied/protectStation,
|
||||
/obj/item/ai_module/supplied/protectStation,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"abS" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/supplied/freeform,
|
||||
/obj/item/ai_module/supplied/freeform,
|
||||
/obj/machinery/camera/motion{
|
||||
c_tag = "MiniSat Foyer";
|
||||
dir = 1;
|
||||
|
||||
@@ -41120,12 +41120,12 @@
|
||||
name = "Core Modules";
|
||||
req_access_txt = "20"
|
||||
},
|
||||
/obj/item/aiModule/core/freeformcore{
|
||||
/obj/item/ai_module/core/freeformcore{
|
||||
pixel_x = 3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/aiModule/core/full/custom,
|
||||
/obj/item/aiModule/core/full/asimov{
|
||||
/obj/item/ai_module/core/full/custom,
|
||||
/obj/item/ai_module/core/full/asimov{
|
||||
pixel_x = -3;
|
||||
pixel_y = -3
|
||||
},
|
||||
@@ -43936,12 +43936,12 @@
|
||||
name = "Core Modules";
|
||||
req_access_txt = "20"
|
||||
},
|
||||
/obj/item/aiModule/supplied/protectStation{
|
||||
/obj/item/ai_module/supplied/protectStation{
|
||||
pixel_x = 3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/aiModule/zeroth/oneHuman,
|
||||
/obj/item/aiModule/reset/purge{
|
||||
/obj/item/ai_module/zeroth/oneHuman,
|
||||
/obj/item/ai_module/reset/purge{
|
||||
pixel_x = -3;
|
||||
pixel_y = -3
|
||||
},
|
||||
@@ -47627,7 +47627,7 @@
|
||||
/area/commons/fitness/recreation)
|
||||
"byM" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/reset,
|
||||
/obj/effect/decal/cleanable/cobweb/cobweb2,
|
||||
/obj/machinery/flasher{
|
||||
id = "AI";
|
||||
@@ -47680,7 +47680,7 @@
|
||||
lootcount = 2;
|
||||
lootdoubles = 0
|
||||
},
|
||||
/obj/item/aiModule/supplied/oxygen{
|
||||
/obj/item/ai_module/supplied/oxygen{
|
||||
pixel_x = -3;
|
||||
pixel_y = -3
|
||||
},
|
||||
@@ -47852,7 +47852,7 @@
|
||||
/area/commons/toilet/restrooms)
|
||||
"bzb" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/supplied/freeform,
|
||||
/obj/item/ai_module/supplied/freeform,
|
||||
/turf/open/floor/circuit/green{
|
||||
luminosity = 2
|
||||
},
|
||||
@@ -48043,7 +48043,7 @@
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"bzr" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/supplied/quarantine,
|
||||
/obj/item/ai_module/supplied/quarantine,
|
||||
/obj/machinery/flasher{
|
||||
id = "AI";
|
||||
name = "Meatbag Pacifier";
|
||||
@@ -50899,7 +50899,7 @@
|
||||
dir = 1
|
||||
},
|
||||
/obj/item/aicard,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/reset,
|
||||
/obj/item/assembly/flash/handheld,
|
||||
/obj/item/assembly/flash/handheld,
|
||||
/obj/machinery/airalarm{
|
||||
|
||||
@@ -23822,9 +23822,9 @@
|
||||
dir = 1;
|
||||
pixel_y = 1
|
||||
},
|
||||
/obj/item/aiModule/core/full/asimov,
|
||||
/obj/item/aiModule/core/full/custom,
|
||||
/obj/item/aiModule/core/freeformcore,
|
||||
/obj/item/ai_module/core/full/asimov,
|
||||
/obj/item/ai_module/core/full/custom,
|
||||
/obj/item/ai_module/core/freeformcore,
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/machinery/door/window{
|
||||
dir = 4;
|
||||
@@ -23873,10 +23873,10 @@
|
||||
dir = 1;
|
||||
pixel_y = 1
|
||||
},
|
||||
/obj/item/aiModule/reset/purge,
|
||||
/obj/item/aiModule/zeroth/oneHuman,
|
||||
/obj/item/aiModule/supplied/protectStation,
|
||||
/obj/item/aiModule/supplied/oxygen,
|
||||
/obj/item/ai_module/reset/purge,
|
||||
/obj/item/ai_module/zeroth/oneHuman,
|
||||
/obj/item/ai_module/supplied/protectStation,
|
||||
/obj/item/ai_module/supplied/oxygen,
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/machinery/door/window/westright{
|
||||
name = "Reserve Modules";
|
||||
@@ -24118,7 +24118,7 @@
|
||||
},
|
||||
/obj/structure/table,
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/item/aiModule/supplied/freeform,
|
||||
/obj/item/ai_module/supplied/freeform,
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 1;
|
||||
pixel_y = 1
|
||||
@@ -24851,8 +24851,8 @@
|
||||
},
|
||||
/obj/structure/table,
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/item/aiModule/supplied/quarantine,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/supplied/quarantine,
|
||||
/obj/item/ai_module/reset,
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 1;
|
||||
pixel_y = 1
|
||||
@@ -66357,7 +66357,7 @@
|
||||
},
|
||||
/obj/structure/table,
|
||||
/obj/item/aicard,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/reset,
|
||||
/turf/open/floor/plating,
|
||||
/area/engineering/storage/tech)
|
||||
"iSm" = (
|
||||
|
||||
@@ -10652,9 +10652,9 @@
|
||||
/area/security/prison/cells)
|
||||
"aMG" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/core/full/asimov,
|
||||
/obj/item/ai_module/core/full/asimov,
|
||||
/obj/effect/spawner/lootdrop/aimodule_harmless,
|
||||
/obj/item/aiModule/core/freeformcore,
|
||||
/obj/item/ai_module/core/freeformcore,
|
||||
/obj/machinery/door/window{
|
||||
base_state = "right";
|
||||
dir = 4;
|
||||
@@ -10664,7 +10664,7 @@
|
||||
},
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/effect/spawner/lootdrop/aimodule_neutral,
|
||||
/obj/item/aiModule/core/full/custom,
|
||||
/obj/item/ai_module/core/full/custom,
|
||||
/obj/machinery/flasher{
|
||||
id = "AI";
|
||||
pixel_y = 24
|
||||
@@ -10687,10 +10687,10 @@
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/effect/spawner/lootdrop/aimodule_harmful,
|
||||
/obj/item/aiModule/supplied/oxygen,
|
||||
/obj/item/aiModule/supplied/protectStation,
|
||||
/obj/item/aiModule/zeroth/oneHuman,
|
||||
/obj/item/aiModule/reset/purge,
|
||||
/obj/item/ai_module/supplied/oxygen,
|
||||
/obj/item/ai_module/supplied/protectStation,
|
||||
/obj/item/ai_module/zeroth/oneHuman,
|
||||
/obj/item/ai_module/reset/purge,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"aMJ" = (
|
||||
@@ -11036,7 +11036,7 @@
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/item/aiModule/supplied/quarantine,
|
||||
/obj/item/ai_module/supplied/quarantine,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"aPu" = (
|
||||
@@ -11068,7 +11068,7 @@
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/item/aiModule/supplied/freeform,
|
||||
/obj/item/ai_module/supplied/freeform,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"aPy" = (
|
||||
@@ -11136,7 +11136,7 @@
|
||||
/area/maintenance/starboard/fore)
|
||||
"aQz" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/reset,
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
@@ -60295,7 +60295,7 @@
|
||||
"kbk" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aicard,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/reset,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/engineering/storage/tech)
|
||||
"kbS" = (
|
||||
|
||||
@@ -2402,7 +2402,7 @@
|
||||
lootcount = 2;
|
||||
lootdoubles = 0
|
||||
},
|
||||
/obj/item/aiModule/supplied/oxygen{
|
||||
/obj/item/ai_module/supplied/oxygen{
|
||||
pixel_x = -3;
|
||||
pixel_y = -3
|
||||
},
|
||||
@@ -2794,12 +2794,12 @@
|
||||
req_access_txt = "20"
|
||||
},
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/item/aiModule/core/freeformcore{
|
||||
/obj/item/ai_module/core/freeformcore{
|
||||
pixel_x = 3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/aiModule/core/full/custom,
|
||||
/obj/item/aiModule/core/full/asimov{
|
||||
/obj/item/ai_module/core/full/custom,
|
||||
/obj/item/ai_module/core/full/asimov{
|
||||
pixel_x = -3;
|
||||
pixel_y = -3
|
||||
},
|
||||
@@ -2827,12 +2827,12 @@
|
||||
req_access_txt = "20"
|
||||
},
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/item/aiModule/supplied/protectStation{
|
||||
/obj/item/ai_module/supplied/protectStation{
|
||||
pixel_x = 3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/aiModule/zeroth/oneHuman,
|
||||
/obj/item/aiModule/reset/purge{
|
||||
/obj/item/ai_module/zeroth/oneHuman,
|
||||
/obj/item/ai_module/reset/purge{
|
||||
pixel_x = -3;
|
||||
pixel_y = -3
|
||||
},
|
||||
@@ -3698,7 +3698,7 @@
|
||||
/area/command/bridge)
|
||||
"agX" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/aiModule/reset{
|
||||
/obj/item/ai_module/reset{
|
||||
pixel_x = 3;
|
||||
pixel_y = 3
|
||||
},
|
||||
@@ -3709,7 +3709,7 @@
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/aiModule/supplied/freeform,
|
||||
/obj/item/ai_module/supplied/freeform,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/command/nuke_storage)
|
||||
"agY" = (
|
||||
@@ -3766,7 +3766,7 @@
|
||||
/area/ai_monitored/command/nuke_storage)
|
||||
"ahd" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/aiModule/supplied/quarantine,
|
||||
/obj/item/ai_module/supplied/quarantine,
|
||||
/obj/item/radio/intercom{
|
||||
broadcasting = 1;
|
||||
frequency = 1447;
|
||||
|
||||
@@ -11360,13 +11360,13 @@
|
||||
/area/command/bridge)
|
||||
"aCG" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/supplied/quarantine,
|
||||
/obj/item/ai_module/supplied/quarantine,
|
||||
/obj/machinery/camera/motion{
|
||||
c_tag = "AI Upload Port";
|
||||
dir = 4;
|
||||
network = list("aiupload")
|
||||
},
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/reset,
|
||||
/obj/machinery/flasher{
|
||||
id = "brigentry";
|
||||
pixel_x = -28
|
||||
@@ -11417,7 +11417,7 @@
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"aCM" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/supplied/freeform,
|
||||
/obj/item/ai_module/supplied/freeform,
|
||||
/obj/machinery/camera/motion{
|
||||
c_tag = "AI Upload Starboard";
|
||||
dir = 8;
|
||||
@@ -12278,9 +12278,9 @@
|
||||
/area/command/bridge)
|
||||
"aED" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/core/full/asimov,
|
||||
/obj/item/ai_module/core/full/asimov,
|
||||
/obj/effect/spawner/lootdrop/aimodule_harmless,
|
||||
/obj/item/aiModule/core/freeformcore,
|
||||
/obj/item/ai_module/core/freeformcore,
|
||||
/obj/machinery/door/window{
|
||||
base_state = "right";
|
||||
dir = 4;
|
||||
@@ -12289,7 +12289,7 @@
|
||||
req_access_txt = "20"
|
||||
},
|
||||
/obj/effect/spawner/lootdrop/aimodule_neutral,
|
||||
/obj/item/aiModule/core/full/custom,
|
||||
/obj/item/ai_module/core/full/custom,
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 1;
|
||||
pixel_y = 1
|
||||
@@ -12336,16 +12336,16 @@
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"aEI" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/supplied/oxygen,
|
||||
/obj/item/aiModule/zeroth/oneHuman,
|
||||
/obj/item/ai_module/supplied/oxygen,
|
||||
/obj/item/ai_module/zeroth/oneHuman,
|
||||
/obj/machinery/door/window{
|
||||
dir = 8;
|
||||
name = "High-Risk Modules";
|
||||
req_access_txt = "20"
|
||||
},
|
||||
/obj/item/aiModule/reset/purge,
|
||||
/obj/item/ai_module/reset/purge,
|
||||
/obj/effect/spawner/lootdrop/aimodule_harmful,
|
||||
/obj/item/aiModule/supplied/protectStation,
|
||||
/obj/item/ai_module/supplied/protectStation,
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 1;
|
||||
pixel_y = 1
|
||||
@@ -40417,7 +40417,7 @@
|
||||
pixel_x = -26
|
||||
},
|
||||
/obj/item/aicard,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/reset,
|
||||
/obj/item/assembly/flash/handheld,
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
dir = 1
|
||||
|
||||
@@ -21154,9 +21154,9 @@
|
||||
/area/security/courtroom)
|
||||
"grZ" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/core/full/custom,
|
||||
/obj/item/aiModule/core/freeformcore,
|
||||
/obj/item/aiModule/core/full/asimov,
|
||||
/obj/item/ai_module/core/full/custom,
|
||||
/obj/item/ai_module/core/freeformcore,
|
||||
/obj/item/ai_module/core/full/asimov,
|
||||
/obj/effect/spawner/lootdrop/aimodule_harmless,
|
||||
/obj/effect/spawner/lootdrop/aimodule_neutral,
|
||||
/obj/machinery/camera/motion{
|
||||
@@ -32087,10 +32087,10 @@
|
||||
req_access_txt = "20"
|
||||
},
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/reset/purge,
|
||||
/obj/item/aiModule/zeroth/oneHuman,
|
||||
/obj/item/aiModule/supplied/protectStation,
|
||||
/obj/item/aiModule/supplied/oxygen,
|
||||
/obj/item/ai_module/reset/purge,
|
||||
/obj/item/ai_module/zeroth/oneHuman,
|
||||
/obj/item/ai_module/supplied/protectStation,
|
||||
/obj/item/ai_module/supplied/oxygen,
|
||||
/obj/effect/spawner/lootdrop/aimodule_harmful,
|
||||
/turf/open/floor/circuit,
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
@@ -37565,7 +37565,7 @@
|
||||
"qUF" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aicard,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/ai_module/reset,
|
||||
/obj/item/assembly/flash/handheld,
|
||||
/obj/item/assembly/flash/handheld,
|
||||
/obj/item/clothing/gloves/color/yellow,
|
||||
@@ -43656,9 +43656,9 @@
|
||||
/area/service/hydroponics)
|
||||
"uVD" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/aiModule/reset,
|
||||
/obj/item/aiModule/supplied/quarantine,
|
||||
/obj/item/aiModule/supplied/freeform,
|
||||
/obj/item/ai_module/reset,
|
||||
/obj/item/ai_module/supplied/quarantine,
|
||||
/obj/item/ai_module/supplied/freeform,
|
||||
/turf/open/floor/circuit,
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"uWb" = (
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
||||
#define FORCE_MAP "_maps/syndicatestation.json"
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"map_name": "Syndicate Station",
|
||||
"map_path": "map_files/SyndicateStation",
|
||||
"map_file": "SyndicateBoxStation.dmm",
|
||||
"shuttles": {
|
||||
"cargo": "cargo_box",
|
||||
"ferry": "ferry_fancy",
|
||||
"whiteship": "whiteship_box",
|
||||
"emergency": "emergency_box"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
//The button used for dragging (only sent for unrelated mouse up/down messages during a drag)
|
||||
#define DRAG "drag"
|
||||
@@ -75,6 +75,9 @@ GLOBAL_LIST_EMPTY(living_heart_cache) //A list of all living hearts in existance
|
||||
#define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic))
|
||||
#define IS_HERETIC_MONSTER(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic_monster))
|
||||
|
||||
/// Checks if the given mob is a malf ai.
|
||||
#define IS_MALF_AI(mob) (isAI(mob) && mob?.mind?.has_antag_datum(/datum/antagonist/traitor))
|
||||
|
||||
#define PATH_SIDE "Side"
|
||||
|
||||
#define PATH_ASH "Ash"
|
||||
|
||||
@@ -123,6 +123,8 @@
|
||||
#define COLOR_THEME_OPERATIVE "#B8221F"
|
||||
#define COLOR_THEME_GLASS "#75A4C4"
|
||||
#define COLOR_THEME_CLOCKWORK "#CFBA47"
|
||||
#define COLOR_THEME_TRASENKNOX "#3ce375"
|
||||
#define COLOR_THEME_DETECTIVE "#c7b08b"
|
||||
|
||||
///Colors for eigenstates
|
||||
#define COLOR_PERIWINKLEE "#9999FF"
|
||||
@@ -188,10 +190,42 @@
|
||||
#define CIRCUIT_COLOR_ENGINEERING "#F8D700"
|
||||
#define CIRCUIT_COLOR_SUPPLY "#C47749"
|
||||
|
||||
/// Colors for pride week
|
||||
/// === LGBT Colors Start ===
|
||||
/// Black and white colors will not be covered for the flags that do have them. We'll just use COLOR_WHITE and COLOR_BLACK.
|
||||
/// Colors for pride
|
||||
#define COLOR_PRIDE_RED "#FF6666"
|
||||
#define COLOR_PRIDE_ORANGE "#FC9F3C"
|
||||
#define COLOR_PRIDE_YELLOW "#EAFF51"
|
||||
#define COLOR_PRIDE_GREEN "#41FC66"
|
||||
#define COLOR_PRIDE_BLUE "#42FFF2"
|
||||
#define COLOR_PRIDE_PURPLE "#5D5DFC"
|
||||
|
||||
/// Colors for transgender flag
|
||||
#define COLOR_TRANS_BLUE "#5ACFFA"
|
||||
#define COLOR_TRANS_PINK "#F5ABB9"
|
||||
|
||||
/// Colors for lesbian flag
|
||||
#define COLOR_LESBIAN_ORANGERED "#D62900"
|
||||
#define COLOR_LESBIAN_SANDYBROWN "#FF9B55"
|
||||
#define COLOR_LESBIAN_PALEVIOLETRED "#D462A5"
|
||||
#define COLOR_LESBIAN_DARKMAGENTA "#A50062"
|
||||
|
||||
/// Colors for bisexual flag
|
||||
#define COLOR_BISEXUAL_MEDIUMVIOLETRED "#D70071"
|
||||
#define COLOR_BISEXUAL_DARKORCHID "#9C4E97"
|
||||
#define COLOR_BISEXUAL_DARKBLUE "#0035A9"
|
||||
|
||||
/// Colors for intersex flag
|
||||
#define COLOR_INTERSEX_GOLD "#FFD900"
|
||||
#define COLOR_INTERSEX_DARKMAGENTA "#7A00AB"
|
||||
|
||||
/// Colors for asexual flag
|
||||
#define COLOR_ACE_DARKGRAY "#A4A5A4"
|
||||
#define COLOR_ACE_PURPLE "#810081"
|
||||
|
||||
/// Colors for pansexual flag
|
||||
#define COLOR_PAN_DEEPPINK "#FF1B8D"
|
||||
#define COLOR_PAN_GOLD "#FFD900"
|
||||
#define COLOR_PAN_DODGERBLUE "#1BB3FF"
|
||||
|
||||
/// === LGBT Colors End ===
|
||||
|
||||
@@ -196,18 +196,6 @@
|
||||
#define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area)
|
||||
#define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area)
|
||||
|
||||
#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user)
|
||||
#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob), return flags also used by other signals.
|
||||
#define COMPONENT_ALLOW_EXAMINATE 1
|
||||
#define COMPONENT_DENY_EXAMINATE 2 //Higher priority compared to the above one
|
||||
|
||||
#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob)
|
||||
#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob)
|
||||
#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob)
|
||||
#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //from base of atom/MouseDrop(): (/atom/over, /mob/user)
|
||||
#define COMPONENT_NO_MOUSEDROP 1
|
||||
#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user)
|
||||
|
||||
// /area signals
|
||||
#define COMSIG_AREA_ENTERED "area_entered" //from base of area/Entered(): (atom/movable/M)
|
||||
#define COMSIG_AREA_EXITED "area_exited" //from base of area/Exited(): (atom/movable/M)
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
/// From base of /datum/action/cooldown/proc/PreActivate(), sent to the action owner: (datum/action/cooldown/activated)
|
||||
#define COMSIG_MOB_ABILITY_STARTED "mob_ability_base_started"
|
||||
/// Return to block the ability from starting / activating
|
||||
#define COMPONENT_BLOCK_ABILITY_START (1<<0)
|
||||
/// From base of /datum/action/cooldown/proc/PreActivate(), sent to the action owner: (datum/action/cooldown/finished)
|
||||
#define COMSIG_MOB_ABILITY_FINISHED "mob_ability_base_finished"
|
||||
@@ -0,0 +1,2 @@
|
||||
///from base of atom/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
|
||||
#define COMSIG_ATOM_HITBY "atom_hitby"
|
||||
@@ -0,0 +1,25 @@
|
||||
// mouse signals. Format:
|
||||
// When the signal is called: (signal arguments)
|
||||
// All signals send the source datum of the signal as the first argument
|
||||
|
||||
///from base of client/Click(): (atom/target, atom/location, control, params, mob/user)
|
||||
#define COMSIG_CLIENT_CLICK "atom_client_click"
|
||||
///from base of atom/Click(): (atom/location, control, params, mob/user)
|
||||
#define COMSIG_CLICK "atom_click"
|
||||
///from base of atom/ShiftClick(): (/mob)
|
||||
#define COMSIG_CLICK_SHIFT "shift_click"
|
||||
/// Allows the user to examinate regardless of client.eye.
|
||||
#define COMPONENT_ALLOW_EXAMINATE (1<<0)
|
||||
/// Higher priority compared to the above one
|
||||
#define COMPONENT_DENY_EXAMINATE (1<<1)
|
||||
///from base of atom/CtrlClickOn(): (/mob)
|
||||
#define COMSIG_CLICK_CTRL "ctrl_click"
|
||||
///from base of atom/AltClick(): (/mob)
|
||||
#define COMSIG_CLICK_ALT "alt_click"
|
||||
///from base of atom/CtrlShiftClick(/mob)
|
||||
#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click"
|
||||
///from base of atom/MouseDrop(): (/atom/over, /mob/user)
|
||||
#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto"
|
||||
#define COMPONENT_NO_MOUSEDROP (1<<0)
|
||||
///from base of atom/MouseDrop_T: (/atom/from, /mob/user)
|
||||
#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user)
|
||||
@@ -0,0 +1,2 @@
|
||||
/// a person somewhere has thrown something : (mob/living/carbon/carbon_thrower, target)
|
||||
#define COMSIG_GLOB_CARBON_THROW_THING "!throw_thing"
|
||||
@@ -0,0 +1,2 @@
|
||||
/// from mob/proc/dropItemToGround()
|
||||
#define COMSIG_MOB_DROPPING_ITEM "mob_dropping_item"
|
||||
+230
-4
@@ -1,9 +1,235 @@
|
||||
//HUD styles. Index order defines how they are cycled in F12.
|
||||
#define HUD_STYLE_STANDARD 1 //Standard hud
|
||||
#define HUD_STYLE_REDUCED 2 //Reduced hud (just hands and intent switcher)
|
||||
#define HUD_STYLE_NOHUD 3 //No hud (for screenshots)
|
||||
/// Standard hud
|
||||
#define HUD_STYLE_STANDARD 1
|
||||
/// Reduced hud (just hands and intent switcher)
|
||||
#define HUD_STYLE_REDUCED 2
|
||||
/// No hud (for screenshots)
|
||||
#define HUD_STYLE_NOHUD 3
|
||||
|
||||
#define HUD_VERSIONS 3 //Used in show_hud(); Please ensure this is the same as the maximum index.
|
||||
/// Used in show_hud(); Please ensure this is the same as the maximum index.
|
||||
#define HUD_VERSIONS 3
|
||||
|
||||
// Consider these images/atoms as part of the UI/HUD (apart of the appearance_flags)
|
||||
/// Used for progress bars and chat messages
|
||||
#define APPEARANCE_UI_IGNORE_ALPHA (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA|PIXEL_SCALE)
|
||||
/// Used for HUD objects
|
||||
#define APPEARANCE_UI (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|PIXEL_SCALE)
|
||||
|
||||
/*
|
||||
These defines specificy screen locations. For more information, see the byond documentation on the screen_loc var.
|
||||
|
||||
The short version:
|
||||
|
||||
Everything is encoded as strings because apparently that's how Byond rolls.
|
||||
|
||||
"1,1" is the bottom left square of the user's screen. This aligns perfectly with the turf grid.
|
||||
"1:2,3:4" is the square (1,3) with pixel offsets (+2, +4); slightly right and slightly above the turf grid.
|
||||
Pixel offsets are used so you don't perfectly hide the turf under them, that would be crappy.
|
||||
|
||||
In addition, the keywords NORTH, SOUTH, EAST, WEST and CENTER can be used to represent their respective
|
||||
screen borders. NORTH-1, for example, is the row just below the upper edge. Useful if you want your
|
||||
UI to scale with screen size.
|
||||
|
||||
The size of the user's screen is defined by client.view (indirectly by world.view), in our case "15x15".
|
||||
Therefore, the top right corner (except during admin shenanigans) is at "15,15"
|
||||
*/
|
||||
|
||||
/proc/ui_hand_position(i) //values based on old hand ui positions (CENTER:-/+16,SOUTH:5)
|
||||
var/x_off = -(!(i % 2))
|
||||
var/y_off = round((i-1) / 2)
|
||||
return"CENTER+[x_off]:16,SOUTH+[y_off]:5"
|
||||
|
||||
/proc/ui_equip_position(mob/M)
|
||||
var/y_off = round((M.held_items.len-1) / 2) //values based on old equip ui position (CENTER: +/-16,SOUTH+1:5)
|
||||
return "CENTER:-16,SOUTH+[y_off+1]:5"
|
||||
|
||||
/proc/ui_swaphand_position(mob/M, which = 1) //values based on old swaphand ui positions (CENTER: +/-16,SOUTH+1:5)
|
||||
var/x_off = which == 1 ? -1 : 0
|
||||
var/y_off = round((M.held_items.len-1) / 2)
|
||||
return "CENTER+[x_off]:16,SOUTH+[y_off+1]:5"
|
||||
|
||||
//Lower left, persistent menu
|
||||
#define ui_inventory "WEST:6,SOUTH:5"
|
||||
|
||||
//Middle left indicators
|
||||
#define ui_lingchemdisplay "WEST,CENTER-1:15"
|
||||
#define ui_lingstingdisplay "WEST:6,CENTER-3:11"
|
||||
|
||||
#define ui_devilsouldisplay "WEST:6,CENTER-1:15"
|
||||
|
||||
//Lower center, persistent menu
|
||||
#define ui_sstore1 "CENTER-5:10,SOUTH:5"
|
||||
#define ui_id "CENTER-4:12,SOUTH:5"
|
||||
#define ui_belt "CENTER-3:14,SOUTH:5"
|
||||
#define ui_back "CENTER-2:14,SOUTH:5"
|
||||
#define ui_storage1 "CENTER+1:18,SOUTH:5"
|
||||
#define ui_storage2 "CENTER+2:20,SOUTH:5"
|
||||
#define ui_combo "CENTER+4:24,SOUTH+1:7" // combo meter for martial arts
|
||||
|
||||
//Lower right, persistent menu
|
||||
#define ui_drop_throw "EAST-1:28,SOUTH+1:7"
|
||||
#define ui_pull_resist "EAST-2:26,SOUTH+1:7"
|
||||
#define ui_movi "EAST-2:26,SOUTH:5"
|
||||
#define ui_sprintbufferloc "EAST-2:26,SOUTH:18"
|
||||
#define ui_acti "EAST-3:24,SOUTH:5"
|
||||
#define ui_zonesel "EAST-1:28,SOUTH:5"
|
||||
#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12)
|
||||
#define ui_crafting "EAST-5:20,SOUTH:5"//CIT CHANGE - moves this over one tile to accommodate for combat mode toggle
|
||||
#define ui_building "EAST-5:20,SOUTH:21"//CIT CHANGE - ditto
|
||||
#define ui_language_menu "EAST-5:4,SOUTH:21"//CIT CHANGE - ditto
|
||||
#define ui_voremode "EAST-5:20,SOUTH:5"
|
||||
|
||||
//Upper-middle right (alerts)
|
||||
#define ui_alert1 "EAST-1:28,CENTER+5:27"
|
||||
#define ui_alert2 "EAST-1:28,CENTER+4:25"
|
||||
#define ui_alert3 "EAST-1:28,CENTER+3:23"
|
||||
#define ui_alert4 "EAST-1:28,CENTER+2:21"
|
||||
#define ui_alert5 "EAST-1:28,CENTER+1:19"
|
||||
|
||||
//Upper left (action buttons)
|
||||
#define ui_action_palette "WEST+0:23,NORTH-1:5"
|
||||
#define ui_action_palette_offset(north_offset) ("WEST+0:23,NORTH-[1+north_offset]:5")
|
||||
|
||||
#define ui_palette_scroll "WEST+1:8,NORTH-6:28"
|
||||
#define ui_palette_scroll_offset(north_offset) ("WEST+1:8,NORTH-[6+north_offset]:28")
|
||||
|
||||
//Middle right (status indicators)
|
||||
#define ui_healthdoll "EAST-1:28,CENTER-2:13"
|
||||
#define ui_health "EAST-1:28,CENTER-1:15"
|
||||
#define ui_internal "EAST-1:28,CENTER+1:19"//CIT CHANGE - moves internal icon up a little bit to accommodate for the stamina meter
|
||||
#define ui_mood "EAST-1:28,CENTER-3:10"
|
||||
// #define ui_spacesuit "EAST-1:28,CENTER-4:10"
|
||||
|
||||
//Pop-up inventory
|
||||
#define ui_shoes "WEST+1:8,SOUTH:5"
|
||||
#define ui_iclothing "WEST:6,SOUTH+1:7"
|
||||
#define ui_oclothing "WEST+1:8,SOUTH+1:7"
|
||||
#define ui_gloves "WEST+2:10,SOUTH+1:7"
|
||||
#define ui_glasses "WEST:6,SOUTH+3:11"
|
||||
#define ui_mask "WEST+1:8,SOUTH+2:9"
|
||||
#define ui_ears "WEST+2:10,SOUTH+2:9"
|
||||
#define ui_neck "WEST:6,SOUTH+2:9"
|
||||
#define ui_head "WEST+1:8,SOUTH+3:11"
|
||||
|
||||
//Generic living
|
||||
#define ui_living_pull "EAST-1:28,CENTER-2:15"
|
||||
#define ui_living_health "EAST-1:28,CENTER:15"
|
||||
#define ui_living_healthdoll "EAST-1:28,CENTER-1:15"
|
||||
|
||||
//Monkeys
|
||||
#define ui_monkey_head "CENTER-5:13,SOUTH:5"
|
||||
#define ui_monkey_mask "CENTER-4:14,SOUTH:5"
|
||||
#define ui_monkey_neck "CENTER-3:15,SOUTH:5"
|
||||
#define ui_monkey_back "CENTER-2:16,SOUTH:5"
|
||||
|
||||
//Drones
|
||||
#define ui_drone_drop "CENTER+1:18,SOUTH:5"
|
||||
#define ui_drone_pull "CENTER+2:2,SOUTH:5"
|
||||
#define ui_drone_storage "CENTER-2:14,SOUTH:5"
|
||||
#define ui_drone_head "CENTER-3:14,SOUTH:5"
|
||||
|
||||
//Cyborgs
|
||||
#define ui_borg_health "EAST-1:28,CENTER-1:15"
|
||||
#define ui_borg_pull "EAST-2:26,SOUTH+1:7"
|
||||
#define ui_borg_radio "EAST-1:28,SOUTH+1:7"
|
||||
#define ui_borg_intents "EAST-2:26,SOUTH:5"
|
||||
#define ui_borg_lamp "CENTER-3:16, SOUTH:5"
|
||||
#define ui_borg_tablet "CENTER-4:16, SOUTH:5"
|
||||
#define ui_inv1 "CENTER-2:16,SOUTH:5"
|
||||
#define ui_inv2 "CENTER-1 :16,SOUTH:5"
|
||||
#define ui_inv3 "CENTER :16,SOUTH:5"
|
||||
#define ui_borg_module "CENTER+1:16,SOUTH:5"
|
||||
#define ui_borg_store "CENTER+2:16,SOUTH:5"
|
||||
#define ui_borg_camera "CENTER+3:21,SOUTH:5"
|
||||
#define ui_borg_alerts "CENTER+4:21,SOUTH:5"
|
||||
#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5"
|
||||
#define ui_borg_pda_send "CENTER+5:21,SOUTH:5" // To the right of the alert panel
|
||||
#define ui_borg_pda_log "CENTER+6:21,SOUTH:5"
|
||||
#define ui_borg_sensor "CENTER-6:16, SOUTH:5" //LEGACY
|
||||
#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" //LEGACY
|
||||
|
||||
//Aliens
|
||||
#define ui_alien_health "EAST,CENTER-1:15"
|
||||
#define ui_alienplasmadisplay "EAST,CENTER-2:15"
|
||||
#define ui_alien_queen_finder "EAST,CENTER-3:15"
|
||||
#define ui_alien_storage_r "CENTER+1:18,SOUTH:5"
|
||||
#define ui_alien_language_menu "EAST-3:26,SOUTH:5"
|
||||
|
||||
//Constructs
|
||||
#define ui_construct_pull "EAST,CENTER-2:15"
|
||||
#define ui_construct_health "EAST,CENTER:15"
|
||||
|
||||
//AI
|
||||
#define ui_ai_core "BOTTOM:6,RIGHT-4"
|
||||
#define ui_ai_shuttle "BOTTOM:6,RIGHT-3"
|
||||
#define ui_ai_announcement "BOTTOM:6,RIGHT-2"
|
||||
#define ui_ai_state_laws "BOTTOM:6,RIGHT-1"
|
||||
#define ui_ai_pda_log "BOTTOM:6,RIGHT"
|
||||
#define ui_ai_pda_send "BOTTOM+1:6,RIGHT"
|
||||
#define ui_ai_language_menu "BOTTOM+1:8,RIGHT-2:30"
|
||||
|
||||
#define ui_ai_crew_monitor "BOTTOM:6,CENTER-1"
|
||||
#define ui_ai_crew_manifest "BOTTOM:6,CENTER"
|
||||
#define ui_ai_alerts "BOTTOM:6,CENTER+1"
|
||||
|
||||
#define ui_ai_view_images "BOTTOM:6,LEFT+4"
|
||||
#define ui_ai_camera_list "BOTTOM:6,LEFT+3"
|
||||
#define ui_ai_track_with_camera "BOTTOM:6,LEFT+2"
|
||||
#define ui_ai_camera_light "BOTTOM:6,LEFT+1"
|
||||
#define ui_ai_sensor "BOTTOM:6,LEFT"
|
||||
#define ui_ai_multicam "BOTTOM+1:6,LEFT+1"
|
||||
#define ui_ai_add_multicam "BOTTOM+1:6,LEFT"
|
||||
#define ui_ai_take_picture "BOTTOM+2:6,LEFT"
|
||||
|
||||
|
||||
// pAI
|
||||
// #define ui_pai_software "SOUTH:6,WEST"
|
||||
// #define ui_pai_shell "SOUTH:6,WEST+1"
|
||||
// #define ui_pai_chassis "SOUTH:6,WEST+2"
|
||||
// #define ui_pai_rest "SOUTH:6,WEST+3"
|
||||
// #define ui_pai_light "SOUTH:6,WEST+4"
|
||||
// #define ui_pai_newscaster "SOUTH:6,WEST+5"
|
||||
// #define ui_pai_host_monitor "SOUTH:6,WEST+6"
|
||||
// #define ui_pai_crew_manifest "SOUTH:6,WEST+7"
|
||||
// #define ui_pai_state_laws "SOUTH:6,WEST+8"
|
||||
// #define ui_pai_pda_send "SOUTH:6,WEST+9"
|
||||
// #define ui_pai_pda_log "SOUTH:6,WEST+10"
|
||||
// #define ui_pai_take_picture "SOUTH:6,WEST+12"
|
||||
// #define ui_pai_view_images "SOUTH:6,WEST+13"
|
||||
|
||||
//Ghosts
|
||||
#define ui_ghost_jumptomob "SOUTH:6,CENTER-3:24"
|
||||
#define ui_ghost_orbit "SOUTH:6,CENTER-2:24"
|
||||
#define ui_ghost_reenter_corpse "SOUTH:6,CENTER-1:24"
|
||||
#define ui_ghost_teleport "SOUTH:6,CENTER:24"
|
||||
#define ui_ghost_pai "SOUTH: 6, CENTER+1:24"
|
||||
#define ui_ghost_mafia "SOUTH: 6, CENTER+2:24"
|
||||
#define ui_ghost_spawners "SOUTH: 6, CENTER+1:24" // LEGACY. SAME LOC AS PAI
|
||||
|
||||
//UI position overrides for 1:1 screen layout. (default is 7:5)
|
||||
#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button
|
||||
#define ui_overridden_resist "EAST-3:24,SOUTH+1:7"
|
||||
#define ui_clickdelay "CENTER,SOUTH+1:-31"
|
||||
#define ui_resistdelay "EAST-3:24,SOUTH+1:4"
|
||||
#define ui_combat_toggle "EAST-4:22,SOUTH:5"
|
||||
|
||||
#define ui_boxcraft "EAST-4:22,SOUTH+1:6"
|
||||
#define ui_boxarea "EAST-4:6,SOUTH+1:6"
|
||||
#define ui_boxlang "EAST-5:22,SOUTH+1:6"
|
||||
#define ui_boxvore "EAST-5:22,SOUTH+1:6"
|
||||
|
||||
#define ui_wanted_lvl "NORTH,11"
|
||||
|
||||
// Defines relating to action button positions
|
||||
|
||||
/// Whatever the base action datum thinks is best
|
||||
#define SCRN_OBJ_DEFAULT "default"
|
||||
/// Floating somewhere on the hud, not in any predefined place
|
||||
#define SCRN_OBJ_FLOATING "floating"
|
||||
/// In the list of buttons stored at the top of the screen
|
||||
#define SCRN_OBJ_IN_LIST "list"
|
||||
/// In the collapseable palette
|
||||
#define SCRN_OBJ_IN_PALETTE "palette"
|
||||
|
||||
/// The filter name for the hover outline
|
||||
#define HOVER_OUTLINE_FILTER "hover_outline"
|
||||
|
||||
+22
-21
@@ -1,25 +1,26 @@
|
||||
//Investigate logging defines
|
||||
#define INVESTIGATE_ATMOS "atmos"
|
||||
#define INVESTIGATE_BOTANY "botany"
|
||||
#define INVESTIGATE_CARGO "cargo"
|
||||
#define INVESTIGATE_EXPERIMENTOR "experimentor"
|
||||
#define INVESTIGATE_GRAVITY "gravity"
|
||||
#define INVESTIGATE_RECORDS "records"
|
||||
#define INVESTIGATE_SINGULO "singulo"
|
||||
#define INVESTIGATE_SUPERMATTER "supermatter"
|
||||
#define INVESTIGATE_TELESCI "telesci"
|
||||
#define INVESTIGATE_WIRES "wires"
|
||||
#define INVESTIGATE_PORTAL "portals"
|
||||
#define INVESTIGATE_RESEARCH "research"
|
||||
#define INVESTIGATE_HALLUCINATIONS "hallucinations"
|
||||
#define INVESTIGATE_RADIATION "radiation"
|
||||
#define INVESTIGATE_EXONET "exonet"
|
||||
#define INVESTIGATE_NANITES "nanites"
|
||||
#define INVESTIGATE_CIRCUIT "circuit"
|
||||
#define INVESTIGATE_FERMICHEM "fermichem"
|
||||
#define INVESTIGATE_RCD "rcd"
|
||||
#define INVESTIGATE_CRYOGENICS "cryogenics"
|
||||
#define INVESTIGATE_GHOST "ghost"
|
||||
#define INVESTIGATE_ATMOS "atmos"
|
||||
#define INVESTIGATE_BOTANY "botany"
|
||||
#define INVESTIGATE_CARGO "cargo"
|
||||
#define INVESTIGATE_CIRCUIT "circuit"
|
||||
#define INVESTIGATE_CRYOGENICS "cryogenics"
|
||||
#define INVESTIGATE_DEATHS "deaths"
|
||||
#define INVESTIGATE_EXONET "exonet"
|
||||
#define INVESTIGATE_EXPERIMENTOR "experimentor"
|
||||
#define INVESTIGATE_FERMICHEM "fermichem"
|
||||
#define INVESTIGATE_GHOST "ghost"
|
||||
#define INVESTIGATE_GRAVITY "gravity"
|
||||
#define INVESTIGATE_HALLUCINATIONS "hallucinations"
|
||||
#define INVESTIGATE_NANITES "nanites"
|
||||
#define INVESTIGATE_PORTAL "portals"
|
||||
#define INVESTIGATE_RADIATION "radiation"
|
||||
#define INVESTIGATE_RCD "rcd"
|
||||
#define INVESTIGATE_RECORDS "records"
|
||||
#define INVESTIGATE_RESEARCH "research"
|
||||
#define INVESTIGATE_SINGULO "singulo"
|
||||
#define INVESTIGATE_SUPERMATTER "supermatter"
|
||||
#define INVESTIGATE_TELESCI "telesci"
|
||||
#define INVESTIGATE_WIRES "wires"
|
||||
|
||||
// Logging types for log_message()
|
||||
#define LOG_ATTACK (1 << 0)
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
|
||||
#define CEILING(x, y) ( -round(-(x) / (y)) * (y) )
|
||||
|
||||
#define ROUND_UP(x) ( -round(-(x)))
|
||||
|
||||
// round() acts like floor(x, 1) by default but can't handle other values
|
||||
#define FLOOR(x, y) ( round((x) / (y)) * (y) )
|
||||
|
||||
|
||||
@@ -304,10 +304,6 @@ GLOBAL_LIST_INIT(pda_reskins, list(
|
||||
|
||||
*/
|
||||
|
||||
// Consider these images/atoms as part of the UI/HUD
|
||||
#define APPEARANCE_UI_IGNORE_ALPHA (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA|PIXEL_SCALE)
|
||||
#define APPEARANCE_UI (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|PIXEL_SCALE)
|
||||
|
||||
//Just space
|
||||
#define SPACE_ICON_STATE "[((x + y) ^ ~(x * y) + z) % 25]"
|
||||
|
||||
@@ -525,7 +521,8 @@ GLOBAL_LIST_INIT(pda_reskins, list(
|
||||
#define VARSET_TO_LIST(L, V) if(L) L[#V] = V
|
||||
#define VARSET_TO_LIST_IF(L, V, C...) if(L && (C)) L[#V] = V
|
||||
|
||||
#define PREF_SAVELOAD_COOLDOWN 5
|
||||
#define PREF_LOAD_COOLDOWN 5
|
||||
#define PREF_SAVE_COOLDOWN 2 SECONDS
|
||||
|
||||
#define VOMIT_TOXIC 1
|
||||
#define VOMIT_PURPLE 2
|
||||
@@ -536,9 +533,6 @@ GLOBAL_LIST_INIT(pda_reskins, list(
|
||||
#define FALL_NO_MESSAGE (1<<1) //Used to suppress the "[A] falls through [old_turf]" messages where it'd make little sense at all, like going downstairs.
|
||||
#define FALL_STOP_INTERCEPTING (1<<2) //Used in situations where halting the whole "intercept" loop would be better, like supermatter dusting (and thus deleting) the atom.
|
||||
|
||||
//Misc text define. Does 4 spaces. Used as a makeshift tabulator.
|
||||
#define FOURSPACES " "
|
||||
|
||||
#define CRYOMOBS 'icons/obj/cryo_mobs.dmi'
|
||||
|
||||
#define CUSTOM_HOLOFORM_DELAY 10 SECONDS //prevents spamming to make lag. it's pretty expensive to do this.
|
||||
|
||||
+47
-2
@@ -1,5 +1,50 @@
|
||||
/// Does 4 spaces. Used as a makeshift tabulator.
|
||||
#define FOURSPACES " "
|
||||
|
||||
/// Standard maptext
|
||||
/// Prepares a text to be used for maptext. Use this so it doesn't look hideous.
|
||||
#define MAPTEXT(text) {"<span class='maptext'>[##text]</span>"}
|
||||
|
||||
/// Macro from Lummox used to get height from a MeasureText proc
|
||||
#define WXH_TO_HEIGHT(x) text2num(copytext(x, findtextEx(x, "x") + 1))
|
||||
/**
|
||||
* Pixel-perfect scaled fonts for use in the MAP element as defined in skin.dmf
|
||||
*
|
||||
* Four sizes to choose from, use the sizes as mentioned below.
|
||||
* Between the variations and a step there should be an option that fits your use case.
|
||||
* BYOND uses pt sizing, different than px used in TGUI. Using px will make it look blurry due to poor antialiasing.
|
||||
*
|
||||
* Default sizes are prefilled in the macro for ease of use and a consistent visual look.
|
||||
* To use a step other than the default in the macro, specify it in a span style.
|
||||
* For example: MAPTEXT_PIXELLARI("<span style='font-size: 24pt'>Some large maptext here</span>")
|
||||
*/
|
||||
/// Large size (ie: context tooltips) - Size options: 12pt 24pt.
|
||||
#define MAPTEXT_PIXELLARI(text) {"<span style='font-family: \"Pixellari\"; font-size: 12pt; -dm-text-outline: 1px black'>[##text]</span>"}
|
||||
|
||||
/// Standard size (ie: normal runechat) - Size options: 6pt 12pt 18pt.
|
||||
#define MAPTEXT_GRAND9K(text) {"<span style='font-family: \"Grand9K Pixel\"; font-size: 6pt; -dm-text-outline: 1px black'>[##text]</span>"}
|
||||
|
||||
/// Small size. (ie: context subtooltips, spell delays) - Size options: 12pt 24pt.
|
||||
#define MAPTEXT_TINY_UNICODE(text) {"<span style='font-family: \"TinyUnicode\"; font-size: 12pt; line-height: 0.75; -dm-text-outline: 1px black'>[##text]</span>"}
|
||||
|
||||
/// Smallest size. (ie: whisper runechat) - Size options: 6pt 12pt 18pt.
|
||||
#define MAPTEXT_SPESSFONT(text) {"<span style='font-family: \"Spess Font\"; font-size: 6pt; line-height: 1.4; -dm-text-outline: 1px black'>[##text]</span>"}
|
||||
|
||||
/**
|
||||
* Prepares a text to be used for maptext, using a variable size font.
|
||||
*
|
||||
* More flexible but doesn't scale pixel perfect to BYOND icon resolutions.
|
||||
* (May be blurry.) Can use any size in pt or px.
|
||||
*
|
||||
* You MUST Specify the size when using the macro
|
||||
* For example: MAPTEXT_VCR_OSD_MONO("<span style='font-size: 24pt'>Some large maptext here</span>")
|
||||
*/
|
||||
/// Prepares a text to be used for maptext, using a variable size font.
|
||||
/// Variable size font. More flexible but doesn't scale pixel perfect to BYOND icon resolutions. (May be blurry.) Can use any size in pt or px.
|
||||
#define MAPTEXT_VCR_OSD_MONO(text) {"<span style='font-family: \"VCR OSD Mono\"'>[##text]</span>"}
|
||||
|
||||
/// Macro from Lummox used to get height from a MeasureText proc.
|
||||
/// resolves the MeasureText() return value once, then resolves the height, then sets return_var to that.
|
||||
#define WXH_TO_HEIGHT(measurement, return_var) \
|
||||
do { \
|
||||
var/_measurement = measurement; \
|
||||
return_var = text2num(copytext(_measurement, findtextEx(_measurement, "x") + 1)); \
|
||||
} while(FALSE);
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#define VV_NULL "NULL"
|
||||
#define VV_RESTORE_DEFAULT "Restore to Default"
|
||||
#define VV_MARKED_DATUM "Marked Datum"
|
||||
#define VV_TAGGED_DATUM "Tagged Datum"
|
||||
#define VV_BITFIELD "Bitfield"
|
||||
#define VV_TEXT_LOCATE "Custom Reference Locate"
|
||||
#define VV_PROCCALL_RETVAL "Return Value of Proccall"
|
||||
@@ -73,6 +74,7 @@
|
||||
#define VV_HK_EXPOSE "expose"
|
||||
#define VV_HK_CALLPROC "proc_call"
|
||||
#define VV_HK_MARK "mark"
|
||||
#define VV_HK_TAG "tag"
|
||||
#define VV_HK_ADDCOMPONENT "addcomponent"
|
||||
#define VV_HK_MODIFY_TRAITS "modtraits"
|
||||
#define VV_HK_VIEW_REFERENCES "viewreferences"
|
||||
|
||||
@@ -495,10 +495,10 @@
|
||||
return sortTim(L, order >= 0 ? GLOBAL_PROC_REF(cmp_records_asc) : GLOBAL_PROC_REF(cmp_records_dsc))
|
||||
|
||||
//any value in a list
|
||||
/proc/sortList(list/L, cmp=GLOBAL_PROC_REF(cmp_text_asc))
|
||||
/proc/sort_list(list/L, cmp=GLOBAL_PROC_REF(cmp_text_asc))
|
||||
return sortTim(L.Copy(), cmp)
|
||||
|
||||
//uses sortList() but uses the var's name specifically. This should probably be using mergeAtom() instead
|
||||
//uses sort_list() but uses the var's name specifically. This should probably be using mergeAtom() instead
|
||||
/proc/sortNames(list/L, order=1)
|
||||
return sortTim(L.Copy(), order >= 0 ? GLOBAL_PROC_REF(cmp_name_asc) : GLOBAL_PROC_REF(cmp_name_dsc))
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams.
|
||||
if(!start || !end)
|
||||
return 0
|
||||
return FALSE
|
||||
var/dy
|
||||
var/dx
|
||||
dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y)
|
||||
|
||||
@@ -4,6 +4,13 @@
|
||||
/proc/cmp_numeric_asc(a,b)
|
||||
return a - b
|
||||
|
||||
// please don't ask
|
||||
/proc/cmp_numeric_text_desc(a, b)
|
||||
return text2num(b) - text2num(a)
|
||||
|
||||
/proc/cmp_numeric_text_asc(a, b)
|
||||
return text2num(a) - text2num(b)
|
||||
|
||||
/proc/cmp_text_asc(a,b)
|
||||
return sorttext(b,a)
|
||||
|
||||
|
||||
@@ -45,12 +45,12 @@
|
||||
var/time_to_wait = GLOB.fileaccess_timer - world.time
|
||||
if(time_to_wait > 0)
|
||||
to_chat(src, "<font color='red'>Error: file_spam_check(): Spam. Please wait [DisplayTimeText(time_to_wait)].</font>")
|
||||
return 1
|
||||
return TRUE
|
||||
var/delay = FTPDELAY
|
||||
if(holder)
|
||||
delay *= ADMIN_FTPDELAY_MODIFIER
|
||||
GLOB.fileaccess_timer = world.time + delay
|
||||
return 0
|
||||
return FALSE
|
||||
#undef FTPDELAY
|
||||
#undef ADMIN_FTPDELAY_MODIFIER
|
||||
|
||||
|
||||
@@ -97,8 +97,8 @@
|
||||
if(C == must_be_alone)
|
||||
continue
|
||||
if(our_area == get_area(C))
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
//We used to use linear regression to approximate the answer, but Mloc realized this was actually faster.
|
||||
//And lo and behold, it is, and it's more accurate to boot.
|
||||
@@ -310,14 +310,14 @@
|
||||
var/turf/T
|
||||
if(X1==X2)
|
||||
if(Y1==Y2)
|
||||
return 1 //Light cannot be blocked on same tile
|
||||
return TRUE //Light cannot be blocked on same tile
|
||||
else
|
||||
var/s = SIGN(Y2-Y1)
|
||||
Y1+=s
|
||||
while(Y1!=Y2)
|
||||
T=locate(X1,Y1,Z)
|
||||
if(T.opacity)
|
||||
return 0
|
||||
return FALSE
|
||||
Y1+=s
|
||||
else
|
||||
var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1))
|
||||
@@ -333,8 +333,8 @@
|
||||
X1+=signX //Line exits tile horizontally
|
||||
T=locate(X1,Y1,Z)
|
||||
if(T.opacity)
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
#undef SIGNV
|
||||
|
||||
|
||||
@@ -343,13 +343,13 @@
|
||||
var/turf/Bturf = get_turf(B)
|
||||
|
||||
if(!Aturf || !Bturf)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(inLineOfSight(Aturf.x,Aturf.y, Bturf.x,Bturf.y,Aturf.z))
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
else
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
|
||||
/proc/get_cardinal_step_away(atom/start, atom/finish) //returns the position of a step from start away from finish, in one of the cardinal directions
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
//(i.e the max or the min dependant on the comparison function)
|
||||
/datum/heap/proc/pop()
|
||||
if(!length(L))
|
||||
return 0
|
||||
return FALSE
|
||||
. = L[1]
|
||||
|
||||
L[1] = L[length(L)]
|
||||
@@ -60,7 +60,7 @@
|
||||
//or 0 if there's no child
|
||||
/datum/heap/proc/get_greater_child(index)
|
||||
if(index * 2 > length(L))
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(index * 2 + 1 > length(L))
|
||||
return index * 2
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
/proc/calculate_adjacencies(atom/A)
|
||||
if(!A.loc)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/adjacencies = 0
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
if(ismovable(A))
|
||||
AM = A
|
||||
if(AM.can_be_unanchored && !AM.anchored)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
for(var/direction in GLOB.cardinals)
|
||||
AM = find_type_in_direction(A, direction)
|
||||
@@ -374,7 +374,7 @@
|
||||
if(N_SOUTH|N_EAST|N_SOUTHEAST)
|
||||
return SOUTHEAST
|
||||
else
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
//SSicon_smooth
|
||||
/proc/queue_smooth_neighbors(atom/A)
|
||||
|
||||
@@ -992,7 +992,7 @@ world
|
||||
letter = lowertext(letter)
|
||||
|
||||
var/image/text_image = new(loc = A)
|
||||
text_image.maptext = MAPTEXT("<font size = 4>[letter]</font>")
|
||||
text_image.maptext = MAPTEXT("<span style='font-size: 24pt'>[letter]</span>")
|
||||
text_image.pixel_x = 7
|
||||
text_image.pixel_y = 5
|
||||
qdel(atom_icon)
|
||||
@@ -1027,15 +1027,15 @@ GLOBAL_LIST_EMPTY(friendly_animal_types)
|
||||
//Returns the same icon specifed in the argument, but with the pixel drawn
|
||||
/proc/DrawPixel(icon/I,colour,drawX,drawY)
|
||||
if(!I)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/Iwidth = I.Width()
|
||||
var/Iheight = I.Height()
|
||||
|
||||
if(drawX > Iwidth || drawX <= 0)
|
||||
return 0
|
||||
return FALSE
|
||||
if(drawY > Iheight || drawY <= 0)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
I.DrawBox(colour,drawX, drawY)
|
||||
return I
|
||||
@@ -1048,7 +1048,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types)
|
||||
if(J) //Only set the icon if it succeeded, the icon without the pixel is 1000x better than a black square.
|
||||
icon = J
|
||||
return J
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
//For creating consistent icons for human looking simple animals
|
||||
/proc/get_flat_human_icon(icon_id, datum/job/J, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override = null, no_anim = FALSE)
|
||||
|
||||
@@ -39,6 +39,21 @@
|
||||
/datum/proc/p_es(temp_gender)
|
||||
. = "es"
|
||||
|
||||
/datum/proc/plural_s(pluralize)
|
||||
switch(copytext_char(pluralize, -2))
|
||||
if ("ss")
|
||||
return "es"
|
||||
if ("sh")
|
||||
return "es"
|
||||
if ("ch")
|
||||
return "es"
|
||||
else
|
||||
switch(copytext_char(pluralize, -1))
|
||||
if("s", "x", "z")
|
||||
return "es"
|
||||
else
|
||||
return "s"
|
||||
|
||||
//like clients, which do have gender.
|
||||
/client/p_they(capitalized, temp_gender)
|
||||
if(!temp_gender)
|
||||
|
||||
@@ -668,7 +668,7 @@
|
||||
SSticker.show_roundend_report(owner.client)
|
||||
|
||||
/datum/action/report/IsAvailable()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/datum/action/report/Topic(href,href_list)
|
||||
if(usr != owner)
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
/// Takes a screen loc string in the format
|
||||
/// "+-left-offset:+-pixel,+-bottom-offset:+-pixel"
|
||||
/// Where the :pixel is optional, and returns
|
||||
/// A list in the format (x_offset, y_offset)
|
||||
/// We require context to get info out of screen locs that contain relative info, so NORTH, SOUTH, etc
|
||||
/proc/screen_loc_to_offset(screen_loc, view)
|
||||
if(!screen_loc)
|
||||
return list(64, 64)
|
||||
var/list/view_size = view_to_pixels(view)
|
||||
var/x = 0
|
||||
var/y = 0
|
||||
// Time to parse for directional relative offsets
|
||||
if(findtext(screen_loc, "EAST")) // If you're starting from the east, we start from the east too
|
||||
x += view_size[1]
|
||||
if(findtext(screen_loc, "WEST")) // HHHHHHHHHHHHHHHHHHHHHH WEST is technically a 1 tile offset from the start. Shoot me please
|
||||
x += world.icon_size
|
||||
if(findtext(screen_loc, "NORTH"))
|
||||
y += view_size[2]
|
||||
if(findtext(screen_loc, "SOUTH"))
|
||||
y += world.icon_size
|
||||
// Cut out everything we just parsed
|
||||
screen_loc = cut_relative_direction(screen_loc)
|
||||
|
||||
var/list/x_and_y = splittext(screen_loc, ",")
|
||||
var/list/x_pack = splittext(x_and_y[1], ":")
|
||||
var/list/y_pack = splittext(x_and_y[2], ":")
|
||||
x += text2num(x_pack[1]) * world.icon_size
|
||||
y += text2num(y_pack[1]) * world.icon_size
|
||||
|
||||
if(length(x_pack) > 1)
|
||||
x += text2num(x_pack[2])
|
||||
if(length(y_pack) > 1)
|
||||
y += text2num(y_pack[2])
|
||||
return list(x, y)
|
||||
|
||||
/// Takes a list in the form (x_offset, y_offset)
|
||||
/// And converts it to a screen loc string
|
||||
/// Accepts an optional view string/size to force the screen_loc around, so it can't go out of scope
|
||||
/proc/offset_to_screen_loc(x_offset, y_offset, view = null)
|
||||
if(view)
|
||||
var/list/view_bounds = view_to_pixels(view)
|
||||
x_offset = clamp(x_offset, world.icon_size, view_bounds[1])
|
||||
y_offset = clamp(y_offset, world.icon_size, view_bounds[2])
|
||||
|
||||
// Round with no argument is floor, so we get the non pixel offset here
|
||||
var/x = round(x_offset / world.icon_size)
|
||||
var/pixel_x = x_offset % world.icon_size
|
||||
var/y = round(y_offset / world.icon_size)
|
||||
var/pixel_y = y_offset % world.icon_size
|
||||
|
||||
var/list/generated_loc = list()
|
||||
generated_loc += "[x]"
|
||||
if(pixel_x)
|
||||
generated_loc += ":[pixel_x]"
|
||||
generated_loc += ",[y]"
|
||||
if(pixel_y)
|
||||
generated_loc += ":[pixel_y]"
|
||||
return jointext(generated_loc, "")
|
||||
|
||||
/**
|
||||
* Returns a valid location to place a screen object without overflowing the viewport
|
||||
*
|
||||
* * target: The target location as a purely number based screen_loc string "+-left-offset:+-pixel,+-bottom-offset:+-pixel"
|
||||
* * target_offset: The amount we want to offset the target location by. We explictly don't care about direction here, we will try all 4
|
||||
* * view: The view variable of the client we're doing this for. We use this to get the size of the screen
|
||||
*
|
||||
* Returns a screen loc representing the valid location
|
||||
**/
|
||||
/proc/get_valid_screen_location(target_loc, target_offset, view)
|
||||
var/list/offsets = screen_loc_to_offset(target_loc)
|
||||
var/base_x = offsets[1]
|
||||
var/base_y = offsets[2]
|
||||
|
||||
var/list/view_size = view_to_pixels(view)
|
||||
|
||||
// Bias to the right, down, left, and then finally up
|
||||
if(base_x + target_offset < view_size[1])
|
||||
return offset_to_screen_loc(base_x + target_offset, base_y, view)
|
||||
if(base_y - target_offset > world.icon_size)
|
||||
return offset_to_screen_loc(base_x, base_y - target_offset, view)
|
||||
if(base_x - target_offset > world.icon_size)
|
||||
return offset_to_screen_loc(base_x - target_offset, base_y, view)
|
||||
if(base_y + target_offset < view_size[2])
|
||||
return offset_to_screen_loc(base_x, base_y + target_offset, view)
|
||||
stack_trace("You passed in a scren location {[target_loc]} and offset {[target_offset]} that can't be fit in the viewport Width {[view_size[1]]}, Height {[view_size[2]]}. what did you do lad")
|
||||
return null // The fuck did you do lad
|
||||
|
||||
/// Takes a screen_loc string and cut out any directions like NORTH or SOUTH
|
||||
/proc/cut_relative_direction(fragment)
|
||||
var/static/regex/regex = regex(@"([A-Z])\w+", "g")
|
||||
return regex.Replace(fragment, "")
|
||||
@@ -138,7 +138,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new())
|
||||
|
||||
var/runHi = lo + 1
|
||||
if(runHi >= hi)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
var/last = fetchElement(L,lo)
|
||||
var/current = fetchElement(L,runHi++)
|
||||
|
||||
+15
-7
@@ -228,15 +228,15 @@
|
||||
/proc/text_in_list(haystack, list/needle_list, start=1, end=0)
|
||||
for(var/needle in needle_list)
|
||||
if(findtext(haystack, needle, start, end))
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
//Like above, but case sensitive
|
||||
/proc/text_in_list_case(haystack, list/needle_list, start=1, end=0)
|
||||
for(var/needle in needle_list)
|
||||
if(findtextEx(haystack, needle, start, end))
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
//Adds 'char' ahead of 'text' until there are 'count' characters total
|
||||
/proc/add_leading(text, count, char = " ")
|
||||
@@ -301,7 +301,7 @@
|
||||
else if(b == replace) //if B is the replacement char
|
||||
newtext = copytext(newtext, 1, newtext_it) + a + copytext(newtext, newtext_it + length(newtext[newtext_it]))
|
||||
else //The lists disagree, Uh-oh!
|
||||
return 0
|
||||
return FALSE
|
||||
text_it += length(a)
|
||||
comp_it += length(b)
|
||||
newtext_it += length(newtext[newtext_it])
|
||||
@@ -311,7 +311,7 @@
|
||||
//This proc returns the number of chars of the string that is the character
|
||||
//This is used for detective work to determine fingerprint completion.
|
||||
if(!text || !character)
|
||||
return 0
|
||||
return FALSE
|
||||
var/count = 0
|
||||
var/lentext = length(text)
|
||||
var/a = ""
|
||||
@@ -403,7 +403,7 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
|
||||
. = findtextEx(haystack, char, start, end)
|
||||
if(.)
|
||||
return
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/proc/parsemarkdown_basic_step1(t, limited=FALSE)
|
||||
if(length(t) <= 0)
|
||||
@@ -828,3 +828,11 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
|
||||
if(prob(15))
|
||||
corrupted_text += pick(corruption_options)
|
||||
return corrupted_text
|
||||
|
||||
/proc/format_text(text)
|
||||
return replacetext(replacetext(text,"\proper ",""),"\improper ","")
|
||||
|
||||
/// Removes all non-alphanumerics from the text, keep in mind this can lead to id conflicts
|
||||
/proc/sanitize_css_class_name(name)
|
||||
var/static/regex/regex = new(@"[^a-zA-Z0-9]","g")
|
||||
return replacetext(name, regex, "")
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month
|
||||
var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day
|
||||
if(month == MM && day == DD)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
//returns timestamp in a sql and a not-quite-compliant ISO 8601 friendly format
|
||||
/proc/SQLtime(timevar)
|
||||
@@ -41,7 +41,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0)
|
||||
if(28 to INFINITY)
|
||||
return 5
|
||||
else
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
//Takes a value of time in deciseconds.
|
||||
//Returns a text value of that number in hours, minutes, or seconds.
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
/proc/dir2angle(D)
|
||||
switch(D)
|
||||
if(NORTH)
|
||||
return 0
|
||||
return FALSE
|
||||
if(SOUTH)
|
||||
return 180
|
||||
if(EAST)
|
||||
@@ -301,7 +301,7 @@
|
||||
/proc/unix2date(timestamp, seperator = "-")
|
||||
|
||||
if(timestamp < 0)
|
||||
return 0 //Do not accept negative values
|
||||
return FALSE //Do not accept negative values
|
||||
|
||||
var/year = 1970 //Unix Epoc begins 1970-01-01
|
||||
var/dayInSeconds = 86400 //60secs*60mins*24hours
|
||||
@@ -363,7 +363,7 @@
|
||||
var/list/covered_parts = list()
|
||||
|
||||
if(!bpc)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(bpc & FULL_BODY)
|
||||
covered_parts |= list(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM,BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_L_LEG,BODY_ZONE_R_LEG)
|
||||
@@ -557,7 +557,7 @@
|
||||
//assumes format #RRGGBB #rrggbb
|
||||
/proc/color_hex2num(A)
|
||||
if(!A || length(A) != length_char(A))
|
||||
return 0
|
||||
return FALSE
|
||||
var/R = hex2num(copytext(A, 2, 4))
|
||||
var/G = hex2num(copytext(A, 4, 6))
|
||||
var/B = hex2num(copytext(A, 6, 0))
|
||||
@@ -689,5 +689,11 @@
|
||||
return 'modular_citadel/icons/ui/screen_operative.dmi'
|
||||
if('icons/mob/screen_clockwork.dmi')
|
||||
return 'modular_citadel/icons/ui/screen_clockwork.dmi'
|
||||
if('icons/mob/screen_glass.dmi')
|
||||
return 'modular_citadel/icons/ui/screen_glass.dmi'
|
||||
if('icons/mob/screen_trasenknox.dmi')
|
||||
return 'modular_citadel/icons/ui/screen_trasenknox.dmi'
|
||||
if('icons/mob/screen_detective.dmi')
|
||||
return 'modular_citadel/icons/ui/screen_detective.dmi'
|
||||
else
|
||||
return 'modular_citadel/icons/ui/screen_midnight.dmi'
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
/proc/get_fancy_list_of_datum_types()
|
||||
var/static/list/pre_generated_list
|
||||
if (!pre_generated_list) //init
|
||||
pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom)))
|
||||
pre_generated_list = make_types_fancy(sort_list(typesof(/datum) - typesof(/atom)))
|
||||
return pre_generated_list
|
||||
|
||||
|
||||
|
||||
+31
-34
@@ -394,7 +394,7 @@ Turf and target are separate in case you want to teleport some distance from a t
|
||||
/proc/get_edge_target_turf(atom/A, direction)
|
||||
var/turf/target = locate(A.x, A.y, A.z)
|
||||
if(!A || !target)
|
||||
return 0
|
||||
return FALSE
|
||||
//since NORTHEAST == NORTH|EAST, etc, doing it this way allows for diagonal mass drivers in the future
|
||||
//and isn't really any more complicated
|
||||
|
||||
@@ -512,35 +512,35 @@ Turf and target are separate in case you want to teleport some distance from a t
|
||||
current = get_step_towards(current, target_turf)
|
||||
while(current != target_turf)
|
||||
if(steps > length)
|
||||
return 0
|
||||
return FALSE
|
||||
if(current.opacity)
|
||||
return 0
|
||||
return FALSE
|
||||
for(var/thing in current)
|
||||
var/atom/A = thing
|
||||
if(A.opacity)
|
||||
return 0
|
||||
return FALSE
|
||||
current = get_step_towards(current, target_turf)
|
||||
steps++
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/proc/is_blocked_turf(turf/T, exclude_mobs)
|
||||
if(T.density)
|
||||
return 1
|
||||
return TRUE
|
||||
for(var/i in T)
|
||||
var/atom/A = i
|
||||
if(A.density && (!exclude_mobs || !ismob(A)))
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/proc/is_anchored_dense_turf(turf/T) //like the older version of the above, fails only if also anchored
|
||||
if(T.density)
|
||||
return 1
|
||||
return TRUE
|
||||
for(var/i in T)
|
||||
var/atom/movable/A = i
|
||||
if(A.density && A.anchored)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/proc/get_step_towards2(atom/ref , atom/trg)
|
||||
var/base_dir = get_dir(ref, get_step_towards(ref,trg))
|
||||
@@ -577,9 +577,9 @@ Turf and target are separate in case you want to teleport some distance from a t
|
||||
//Returns: 1 if found, 0 if not.
|
||||
/proc/hasvar(datum/A, varname)
|
||||
if(A.vars.Find(lowertext(varname)))
|
||||
return 1
|
||||
return TRUE
|
||||
else
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/proc/get_cardinal_dir(atom/A, atom/B)
|
||||
var/dx = abs(B.x - A.x)
|
||||
@@ -700,7 +700,7 @@ Turf and target are separate in case you want to teleport some distance from a t
|
||||
//of course mathematically this is just adding world.icon_size on again
|
||||
/proc/getPixelDistance(atom/A, atom/B, centered = TRUE)
|
||||
if(!istype(A)||!istype(B))
|
||||
return 0
|
||||
return FALSE
|
||||
. = bounds_dist(A, B) + sqrt((((A.pixel_x+B.pixel_x)**2) + ((A.pixel_y+B.pixel_y)**2)))
|
||||
if(centered)
|
||||
. += world.icon_size
|
||||
@@ -741,31 +741,28 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list(
|
||||
//Direction works sometimes
|
||||
if(is_type_in_typecache(O, GLOB.WALLITEMS_INVERSE))
|
||||
if(O.dir == turn(dir, 180))
|
||||
return 1
|
||||
return TRUE
|
||||
else if(O.dir == dir)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
//Some stuff doesn't use dir properly, so we need to check pixel instead
|
||||
//That's exactly what get_turf_pixel() does
|
||||
if(get_turf_pixel(O) == locdir)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
if(is_type_in_typecache(O, GLOB.WALLITEMS_EXTERNAL) && check_external)
|
||||
if(is_type_in_typecache(O, GLOB.WALLITEMS_INVERSE))
|
||||
if(O.dir == turn(dir, 180))
|
||||
return 1
|
||||
return TRUE
|
||||
else if(O.dir == dir)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
//Some stuff is placed directly on the wallturf (signs)
|
||||
for(var/obj/O in locdir)
|
||||
if(is_type_in_typecache(O, GLOB.WALLITEMS) && check_external != 2)
|
||||
if(O.pixel_x == 0 && O.pixel_y == 0)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/format_text(text)
|
||||
return replacetext(replacetext(text,"\proper ",""),"\improper ","")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/proc/check_target_facings(mob/living/initator, mob/living/target)
|
||||
/*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head.
|
||||
@@ -838,25 +835,25 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list(
|
||||
/proc/IsValidSrc(datum/D)
|
||||
if(istype(D))
|
||||
return !QDELETED(D)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
//Compare A's dir, the clockwise dir of A and the anticlockwise dir of A
|
||||
//To the opposite dir of the dir returned by get_dir(B,A)
|
||||
//If one of them is a match, then A is facing B
|
||||
/proc/is_A_facing_B(atom/A,atom/B)
|
||||
if(!istype(A) || !istype(B))
|
||||
return 0
|
||||
return FALSE
|
||||
if(isliving(A))
|
||||
var/mob/living/LA = A
|
||||
if(LA.lying)
|
||||
return 0
|
||||
return FALSE
|
||||
var/goal_dir = get_dir(A,B)
|
||||
var/clockwise_A_dir = turn(A.dir, -45)
|
||||
var/anticlockwise_A_dir = turn(A.dir, 45)
|
||||
|
||||
if(A.dir == goal_dir || clockwise_A_dir == goal_dir || anticlockwise_A_dir == goal_dir)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/*
|
||||
@@ -1049,10 +1046,10 @@ B --><-- A
|
||||
|
||||
/atom/proc/contains(var/atom/A)
|
||||
if(!A)
|
||||
return 0
|
||||
return FALSE
|
||||
for(var/atom/location = A.loc, location, location = location.loc)
|
||||
if(location == src)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/proc/flick_overlay_static(O, atom/A, duration)
|
||||
set waitfor = 0
|
||||
@@ -1152,7 +1149,7 @@ GLOBAL_REAL_VAR(list/stack_trace_storage)
|
||||
/proc/stoplag(initial_delay)
|
||||
if (!Master || !(Master.current_runlevel & RUNLEVELS_DEFAULT))
|
||||
sleep(world.tick_lag)
|
||||
return 1
|
||||
return TRUE
|
||||
if (!initial_delay)
|
||||
initial_delay = world.tick_lag
|
||||
. = 0
|
||||
@@ -1568,11 +1565,11 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
|
||||
|
||||
/proc/num2sign(numeric)
|
||||
if(numeric > 0)
|
||||
return 1
|
||||
return TRUE
|
||||
else if(numeric < 0)
|
||||
return -1
|
||||
else
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
// Converts browser keycodes to BYOND keycodes.
|
||||
/proc/browser_keycode_to_byond(keycode)
|
||||
|
||||
+11
-7
@@ -1,15 +1,19 @@
|
||||
/proc/getviewsize(view)
|
||||
var/viewX
|
||||
var/viewY
|
||||
if(isnum(view))
|
||||
var/totalviewrange = (view < 0 ? -1 : 1) + 2 * view
|
||||
viewX = totalviewrange
|
||||
viewY = totalviewrange
|
||||
return list(totalviewrange, totalviewrange)
|
||||
else
|
||||
var/list/viewrangelist = splittext(view,"x")
|
||||
viewX = text2num(viewrangelist[1])
|
||||
viewY = text2num(viewrangelist[2])
|
||||
return list(viewX, viewY)
|
||||
return list(text2num(viewrangelist[1]), text2num(viewrangelist[2]))
|
||||
|
||||
/// Takes a string or num view, and converts it to pixel width/height in a list(pixel_width, pixel_height)
|
||||
/proc/view_to_pixels(view)
|
||||
if(!view)
|
||||
return list(0, 0)
|
||||
var/list/view_info = getviewsize(view)
|
||||
view_info[1] *= world.icon_size
|
||||
view_info[2] *= world.icon_size
|
||||
return view_info
|
||||
|
||||
/proc/in_view_range(mob/user, atom/A)
|
||||
var/list/view_range = getviewsize(user.client.view)
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
#define RUN_YELL(_T, _P, _D) \
|
||||
returned = max(_P - max(_T.get_yelling_resistance(_P), 0) - 1, 0); \
|
||||
processed[_T] = returned;
|
||||
// _T.maptext = "[returned]";
|
||||
// _T.maptext = MAPTEXT(returned);
|
||||
|
||||
var/list/turf/edges_next
|
||||
var/list/turf/powers_next
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
to check that the mob is not inside of something
|
||||
*/
|
||||
/atom/proc/Adjacent(atom/neighbor) // basic inheritance, unused
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
// Not a sane use of the function and (for now) indicative of an error elsewhere
|
||||
/area/Adjacent(var/atom/neighbor)
|
||||
@@ -57,9 +57,9 @@
|
||||
if(!src.ClickCross(get_dir(src,T1), border_only = 1, target_atom = target, mover = mover))
|
||||
continue // could not enter src
|
||||
|
||||
return 1 // we don't care about our own density
|
||||
return TRUE // we don't care about our own density
|
||||
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/*
|
||||
Adjacency (to anything else):
|
||||
@@ -78,11 +78,11 @@
|
||||
// This is necessary for storage items not on your person.
|
||||
/obj/item/Adjacent(var/atom/neighbor, var/recurse = 1)
|
||||
if(neighbor == loc)
|
||||
return 1
|
||||
return TRUE
|
||||
if(isitem(loc))
|
||||
if(recurse > 0)
|
||||
return loc.Adjacent(neighbor,recurse - 1)
|
||||
return 0
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/*
|
||||
@@ -99,7 +99,7 @@
|
||||
|
||||
if( O.flags_1&ON_BORDER_1) // windows are on border, check them first
|
||||
if( O.dir & target_dir || O.dir & (O.dir-1) ) // full tile windows are just diagonals mechanically
|
||||
return 0 //O.dir&(O.dir-1) is false for any cardinal direction, but true for diagonal ones
|
||||
return FALSE //O.dir&(O.dir-1) is false for any cardinal direction, but true for diagonal ones
|
||||
else if( !border_only ) // dense, not on border, cannot pass over
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
+13
-2
@@ -58,7 +58,10 @@
|
||||
if(modifiers["shift"] && modifiers["ctrl"])
|
||||
return CtrlShiftClickOn(A)
|
||||
if(modifiers["middle"])
|
||||
return MiddleClickOn(A)
|
||||
if(modifiers["ctrl"])
|
||||
return CtrlMiddleClickOn(A)
|
||||
else
|
||||
return MiddleClickOn(A)
|
||||
if(modifiers["shift"] && (client && client.show_popup_menus || modifiers["right"])) //CIT CHANGE - makes shift-click examine use right click instead of left click in combat mode
|
||||
return ShiftClickOn(A)
|
||||
if(modifiers["alt"]) // alt and alt-gr (rightalt)
|
||||
@@ -86,7 +89,7 @@
|
||||
DelayNextAction(CLICK_CD_HANDCUFFED)
|
||||
return RestrainedClickOn(A)
|
||||
|
||||
if(in_throw_mode)
|
||||
if(throw_mode)
|
||||
throw_item(A)
|
||||
return
|
||||
|
||||
@@ -356,6 +359,14 @@
|
||||
return TRUE
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/proc/CtrlMiddleClickOn(atom/A)
|
||||
if(check_rights_for(client, R_ADMIN))
|
||||
client.toggle_tag_datum(A)
|
||||
else
|
||||
A.CtrlClick(src)
|
||||
return
|
||||
|
||||
/*
|
||||
Alt click
|
||||
Used as an alternate way to interact with things.
|
||||
|
||||
@@ -92,11 +92,11 @@
|
||||
. = 1
|
||||
|
||||
//Please don't roast me too hard
|
||||
/client/MouseMove(object,location,control,params)
|
||||
/client/MouseMove(object, location, control, params)
|
||||
mouseParams = params
|
||||
mouseLocation = location
|
||||
mouseObject = object
|
||||
mouseControlObject = control
|
||||
mouse_location_ref = WEAKREF(location)
|
||||
mouse_object_ref = WEAKREF(object)
|
||||
mouse_control_object = control
|
||||
if(mob)
|
||||
SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOUSEMOVE, object, location, control, params)
|
||||
// god forgive me for i have sinned - used for autoparry. currently at 5 objects.
|
||||
@@ -107,15 +107,16 @@
|
||||
|
||||
/client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params)
|
||||
mouseParams = params
|
||||
mouseLocation = over_location
|
||||
mouseObject = over_object
|
||||
mouseControlObject = over_control
|
||||
if(selected_target[1] && over_object && over_object.IsAutoclickable())
|
||||
mouse_location_ref = WEAKREF(over_location)
|
||||
mouse_object_ref = WEAKREF(over_object)
|
||||
mouse_control_object = over_control
|
||||
if(selected_target[1] && over_object?.IsAutoclickable())
|
||||
selected_target[1] = over_object
|
||||
selected_target[2] = params
|
||||
if(active_mousedown_item)
|
||||
active_mousedown_item.onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
|
||||
SEND_SIGNAL(src, COMSIG_CLIENT_MOUSEDRAG, src_object, over_object, src_location, over_location, src_control, over_control, params)
|
||||
return ..()
|
||||
|
||||
/obj/item/proc/onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
|
||||
return
|
||||
|
||||
@@ -1,192 +0,0 @@
|
||||
/*
|
||||
These defines specificy screen locations. For more information, see the byond documentation on the screen_loc var.
|
||||
|
||||
The short version:
|
||||
|
||||
Everything is encoded as strings because apparently that's how Byond rolls.
|
||||
|
||||
"1,1" is the bottom left square of the user's screen. This aligns perfectly with the turf grid.
|
||||
"1:2,3:4" is the square (1,3) with pixel offsets (+2, +4); slightly right and slightly above the turf grid.
|
||||
Pixel offsets are used so you don't perfectly hide the turf under them, that would be crappy.
|
||||
|
||||
In addition, the keywords NORTH, SOUTH, EAST, WEST and CENTER can be used to represent their respective
|
||||
screen borders. NORTH-1, for example, is the row just below the upper edge. Useful if you want your
|
||||
UI to scale with screen size.
|
||||
|
||||
The size of the user's screen is defined by client.view (indirectly by world.view), in our case "15x15".
|
||||
Therefore, the top right corner (except during admin shenanigans) is at "15,15"
|
||||
*/
|
||||
|
||||
/proc/ui_hand_position(i) //values based on old hand ui positions (CENTER:-/+16,SOUTH:5)
|
||||
var/x_off = -(!(i % 2))
|
||||
var/y_off = round((i-1) / 2)
|
||||
return"CENTER+[x_off]:16,SOUTH+[y_off]:5"
|
||||
|
||||
/proc/ui_equip_position(mob/M)
|
||||
var/y_off = round((M.held_items.len-1) / 2) //values based on old equip ui position (CENTER: +/-16,SOUTH+1:5)
|
||||
return "CENTER:-16,SOUTH+[y_off+1]:5"
|
||||
|
||||
/proc/ui_swaphand_position(mob/M, which = 1) //values based on old swaphand ui positions (CENTER: +/-16,SOUTH+1:5)
|
||||
var/x_off = which == 1 ? -1 : 0
|
||||
var/y_off = round((M.held_items.len-1) / 2)
|
||||
return "CENTER+[x_off]:16,SOUTH+[y_off+1]:5"
|
||||
|
||||
//Lower left, persistent menu
|
||||
#define ui_inventory "WEST:6,SOUTH:5"
|
||||
|
||||
//Middle left indicators
|
||||
#define ui_lingchemdisplay "WEST,CENTER-1:15"
|
||||
#define ui_lingstingdisplay "WEST:6,CENTER-3:11"
|
||||
|
||||
#define ui_devilsouldisplay "WEST:6,CENTER-1:15"
|
||||
|
||||
//Lower center, persistent menu
|
||||
#define ui_sstore1 "CENTER-5:10,SOUTH:5"
|
||||
#define ui_id "CENTER-4:12,SOUTH:5"
|
||||
#define ui_belt "CENTER-3:14,SOUTH:5"
|
||||
#define ui_back "CENTER-2:14,SOUTH:5"
|
||||
#define ui_storage1 "CENTER+1:18,SOUTH:5"
|
||||
#define ui_storage2 "CENTER+2:20,SOUTH:5"
|
||||
#define ui_combo "CENTER+4:24,SOUTH+1:7" // combo meter for martial arts
|
||||
|
||||
//Lower right, persistent menu
|
||||
#define ui_drop_throw "EAST-1:28,SOUTH+1:7"
|
||||
#define ui_pull_resist "EAST-2:26,SOUTH+1:7"
|
||||
#define ui_movi "EAST-2:26,SOUTH:5"
|
||||
#define ui_sprintbufferloc "EAST-2:26,SOUTH:18"
|
||||
#define ui_acti "EAST-3:24,SOUTH:5"
|
||||
#define ui_zonesel "EAST-1:28,SOUTH:5"
|
||||
#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12)
|
||||
#define ui_crafting "EAST-5:20,SOUTH:5"//CIT CHANGE - moves this over one tile to accommodate for combat mode toggle
|
||||
#define ui_building "EAST-5:20,SOUTH:21"//CIT CHANGE - ditto
|
||||
#define ui_language_menu "EAST-5:4,SOUTH:21"//CIT CHANGE - ditto
|
||||
#define ui_voremode "EAST-5:20,SOUTH:5"
|
||||
|
||||
//Upper-middle right (alerts)
|
||||
#define ui_alert1 "EAST-1:28,CENTER+5:27"
|
||||
#define ui_alert2 "EAST-1:28,CENTER+4:25"
|
||||
#define ui_alert3 "EAST-1:28,CENTER+3:23"
|
||||
#define ui_alert4 "EAST-1:28,CENTER+2:21"
|
||||
#define ui_alert5 "EAST-1:28,CENTER+1:19"
|
||||
|
||||
//Middle right (status indicators)
|
||||
#define ui_healthdoll "EAST-1:28,CENTER-2:13"
|
||||
#define ui_health "EAST-1:28,CENTER-1:15"
|
||||
#define ui_internal "EAST-1:28,CENTER+1:19"//CIT CHANGE - moves internal icon up a little bit to accommodate for the stamina meter
|
||||
#define ui_mood "EAST-1:28,CENTER-3:10"
|
||||
// #define ui_spacesuit "EAST-1:28,CENTER-4:10"
|
||||
|
||||
//Pop-up inventory
|
||||
#define ui_shoes "WEST+1:8,SOUTH:5"
|
||||
#define ui_iclothing "WEST:6,SOUTH+1:7"
|
||||
#define ui_oclothing "WEST+1:8,SOUTH+1:7"
|
||||
#define ui_gloves "WEST+2:10,SOUTH+1:7"
|
||||
#define ui_glasses "WEST:6,SOUTH+3:11"
|
||||
#define ui_mask "WEST+1:8,SOUTH+2:9"
|
||||
#define ui_ears "WEST+2:10,SOUTH+2:9"
|
||||
#define ui_neck "WEST:6,SOUTH+2:9"
|
||||
#define ui_head "WEST+1:8,SOUTH+3:11"
|
||||
|
||||
//Generic living
|
||||
#define ui_living_pull "EAST-1:28,CENTER-2:15"
|
||||
#define ui_living_health "EAST-1:28,CENTER:15"
|
||||
#define ui_living_healthdoll "EAST-1:28,CENTER-1:15"
|
||||
|
||||
//Monkeys
|
||||
#define ui_monkey_head "CENTER-5:13,SOUTH:5"
|
||||
#define ui_monkey_mask "CENTER-4:14,SOUTH:5"
|
||||
#define ui_monkey_neck "CENTER-3:15,SOUTH:5"
|
||||
#define ui_monkey_back "CENTER-2:16,SOUTH:5"
|
||||
|
||||
//Drones
|
||||
#define ui_drone_drop "CENTER+1:18,SOUTH:5"
|
||||
#define ui_drone_pull "CENTER+2:2,SOUTH:5"
|
||||
#define ui_drone_storage "CENTER-2:14,SOUTH:5"
|
||||
#define ui_drone_head "CENTER-3:14,SOUTH:5"
|
||||
|
||||
//Cyborgs
|
||||
#define ui_borg_health "EAST-1:28,CENTER-1:15"
|
||||
#define ui_borg_pull "EAST-2:26,SOUTH+1:7"
|
||||
#define ui_borg_radio "EAST-1:28,SOUTH+1:7"
|
||||
#define ui_borg_intents "EAST-2:26,SOUTH:5"
|
||||
#define ui_borg_lamp "CENTER-3:16, SOUTH:5"
|
||||
#define ui_borg_tablet "CENTER-4:16, SOUTH:5"
|
||||
#define ui_inv1 "CENTER-2:16,SOUTH:5"
|
||||
#define ui_inv2 "CENTER-1 :16,SOUTH:5"
|
||||
#define ui_inv3 "CENTER :16,SOUTH:5"
|
||||
#define ui_borg_module "CENTER+1:16,SOUTH:5"
|
||||
#define ui_borg_store "CENTER+2:16,SOUTH:5"
|
||||
#define ui_borg_camera "CENTER+3:21,SOUTH:5"
|
||||
#define ui_borg_alerts "CENTER+4:21,SOUTH:5"
|
||||
#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5"
|
||||
#define ui_borg_sensor "CENTER-6:16, SOUTH:5" //LEGACY
|
||||
#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" //LEGACY
|
||||
|
||||
//Aliens
|
||||
#define ui_alien_health "EAST,CENTER-1:15"
|
||||
#define ui_alienplasmadisplay "EAST,CENTER-2:15"
|
||||
#define ui_alien_queen_finder "EAST,CENTER-3:15"
|
||||
#define ui_alien_storage_r "CENTER+1:18,SOUTH:5"
|
||||
#define ui_alien_language_menu "EAST-3:26,SOUTH:5"
|
||||
|
||||
//Constructs
|
||||
#define ui_construct_pull "EAST,CENTER-2:15"
|
||||
#define ui_construct_health "EAST,CENTER:15"
|
||||
|
||||
// AI
|
||||
#define ui_ai_core "SOUTH:6,WEST"
|
||||
#define ui_ai_camera_list "SOUTH:6,WEST+1"
|
||||
#define ui_ai_track_with_camera "SOUTH:6,WEST+2"
|
||||
#define ui_ai_camera_light "SOUTH:6,WEST+3"
|
||||
#define ui_ai_crew_monitor "SOUTH:6,WEST+4"
|
||||
#define ui_ai_crew_manifest "SOUTH:6,WEST+5"
|
||||
#define ui_ai_alerts "SOUTH:6,WEST+6"
|
||||
#define ui_ai_announcement "SOUTH:6,WEST+7"
|
||||
#define ui_ai_shuttle "SOUTH:6,WEST+8"
|
||||
#define ui_ai_state_laws "SOUTH:6,WEST+9"
|
||||
#define ui_ai_pda_send "SOUTH:6,WEST+10"
|
||||
#define ui_ai_pda_log "SOUTH:6,WEST+11"
|
||||
#define ui_ai_take_picture "SOUTH:6,WEST+12"
|
||||
#define ui_ai_view_images "SOUTH:6,WEST+13"
|
||||
#define ui_ai_sensor "SOUTH:6,WEST+14"
|
||||
#define ui_ai_multicam "SOUTH+1:6,WEST+13"
|
||||
#define ui_ai_add_multicam "SOUTH+1:6,WEST+14"
|
||||
|
||||
|
||||
// pAI
|
||||
// #define ui_pai_software "SOUTH:6,WEST"
|
||||
// #define ui_pai_shell "SOUTH:6,WEST+1"
|
||||
// #define ui_pai_chassis "SOUTH:6,WEST+2"
|
||||
// #define ui_pai_rest "SOUTH:6,WEST+3"
|
||||
// #define ui_pai_light "SOUTH:6,WEST+4"
|
||||
// #define ui_pai_newscaster "SOUTH:6,WEST+5"
|
||||
// #define ui_pai_host_monitor "SOUTH:6,WEST+6"
|
||||
// #define ui_pai_crew_manifest "SOUTH:6,WEST+7"
|
||||
// #define ui_pai_state_laws "SOUTH:6,WEST+8"
|
||||
// #define ui_pai_pda_send "SOUTH:6,WEST+9"
|
||||
// #define ui_pai_pda_log "SOUTH:6,WEST+10"
|
||||
// #define ui_pai_take_picture "SOUTH:6,WEST+12"
|
||||
// #define ui_pai_view_images "SOUTH:6,WEST+13"
|
||||
|
||||
//Ghosts
|
||||
#define ui_ghost_jumptomob "SOUTH:6,CENTER-3:24"
|
||||
#define ui_ghost_orbit "SOUTH:6,CENTER-2:24"
|
||||
#define ui_ghost_reenter_corpse "SOUTH:6,CENTER-1:24"
|
||||
#define ui_ghost_teleport "SOUTH:6,CENTER:24"
|
||||
#define ui_ghost_pai "SOUTH: 6, CENTER+1:24"
|
||||
#define ui_ghost_mafia "SOUTH: 6, CENTER+2:24"
|
||||
#define ui_ghost_spawners "SOUTH: 6, CENTER+1:24" // LEGACY. SAME LOC AS PAI
|
||||
|
||||
//UI position overrides for 1:1 screen layout. (default is 7:5)
|
||||
#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button
|
||||
#define ui_overridden_resist "EAST-3:24,SOUTH+1:7"
|
||||
#define ui_clickdelay "CENTER,SOUTH+1:-31"
|
||||
#define ui_resistdelay "EAST-3:24,SOUTH+1:4"
|
||||
#define ui_combat_toggle "EAST-4:22,SOUTH:5"
|
||||
|
||||
#define ui_boxcraft "EAST-4:22,SOUTH+1:6"
|
||||
#define ui_boxarea "EAST-4:6,SOUTH+1:6"
|
||||
#define ui_boxlang "EAST-5:22,SOUTH+1:6"
|
||||
#define ui_boxvore "EAST-5:22,SOUTH+1:6"
|
||||
|
||||
#define ui_wanted_lvl "NORTH,11"
|
||||
+334
-177
@@ -2,186 +2,156 @@
|
||||
|
||||
/atom/movable/screen/movable/action_button
|
||||
var/datum/action/linked_action
|
||||
var/datum/hud/our_hud
|
||||
var/actiontooltipstyle = ""
|
||||
screen_loc = null
|
||||
|
||||
var/button_icon_state
|
||||
var/appearance_cache
|
||||
|
||||
/// Where we are currently placed on the hud. SCRN_OBJ_DEFAULT asks the linked action what it thinks
|
||||
var/location = SCRN_OBJ_DEFAULT
|
||||
/// A unique bitflag, combined with the name of our linked action this lets us persistently remember any user changes to our position
|
||||
var/id
|
||||
var/ordered = TRUE //If the button gets placed into the default bar
|
||||
/// A weakref of the last thing we hovered over
|
||||
/// God I hate how dragging works
|
||||
var/datum/weakref/last_hovored_ref
|
||||
|
||||
/atom/movable/screen/movable/action_button/Destroy()
|
||||
if(our_hud)
|
||||
var/mob/viewer = our_hud.mymob
|
||||
our_hud.hide_action(src)
|
||||
viewer?.client?.screen -= src
|
||||
linked_action.viewers -= our_hud
|
||||
viewer.update_action_buttons()
|
||||
our_hud = null
|
||||
linked_action = null
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/movable/action_button/proc/can_use(mob/user)
|
||||
if (linked_action)
|
||||
return linked_action.owner == user
|
||||
if(linked_action.viewers[user.hud_used])
|
||||
return TRUE
|
||||
return FALSE
|
||||
else if (isobserver(user))
|
||||
var/mob/dead/observer/O = user
|
||||
return !O.observetarget
|
||||
else
|
||||
return TRUE
|
||||
|
||||
/atom/movable/screen/movable/action_button/MouseDrop(over_object)
|
||||
if(!can_use(usr))
|
||||
return
|
||||
if((istype(over_object, /atom/movable/screen/movable/action_button) && !istype(over_object, /atom/movable/screen/movable/action_button/hide_toggle)))
|
||||
if(locked)
|
||||
to_chat(usr, "<span class='warning'>Action button \"[name]\" is locked, unlock it first.</span>")
|
||||
return
|
||||
var/atom/movable/screen/movable/action_button/B = over_object
|
||||
var/list/actions = usr.actions
|
||||
actions.Swap(actions.Find(src.linked_action), actions.Find(B.linked_action))
|
||||
moved = FALSE
|
||||
ordered = TRUE
|
||||
B.moved = FALSE
|
||||
B.ordered = TRUE
|
||||
usr.update_action_buttons()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/movable/action_button/Click(location,control,params)
|
||||
if (!can_use(usr))
|
||||
return
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["shift"])
|
||||
if(locked)
|
||||
to_chat(usr, "<span class='warning'>Action button \"[name]\" is locked, unlock it first.</span>")
|
||||
return TRUE
|
||||
moved = 0
|
||||
usr.update_action_buttons() //redraw buttons that are no longer considered "moved"
|
||||
return TRUE
|
||||
if(modifiers["ctrl"])
|
||||
locked = !locked
|
||||
to_chat(usr, "<span class='notice'>Action button \"[name]\" [locked ? "" : "un"]locked.</span>")
|
||||
if(id && usr.client) //try to (un)remember position
|
||||
usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = locked ? moved : null
|
||||
var/datum/hud/our_hud = usr.hud_used
|
||||
our_hud.position_action(src, SCRN_OBJ_DEFAULT)
|
||||
return TRUE
|
||||
linked_action.Trigger()
|
||||
return TRUE
|
||||
|
||||
//Hide/Show Action Buttons ... Button
|
||||
/atom/movable/screen/movable/action_button/hide_toggle
|
||||
name = "Hide Buttons"
|
||||
desc = "Shift-click any button to reset its position, and Control-click it to lock it in place. Alt-click this button to reset all buttons to their default positions."
|
||||
icon = 'icons/mob/actions.dmi'
|
||||
icon_state = "bg_default"
|
||||
var/hidden = 0
|
||||
var/hide_icon = 'icons/mob/actions.dmi'
|
||||
var/hide_state = "hide"
|
||||
var/show_state = "show"
|
||||
var/mutable_appearance/hide_appearance
|
||||
var/mutable_appearance/show_appearance
|
||||
|
||||
/atom/movable/screen/movable/action_button/hide_toggle/Initialize(mapload)
|
||||
// Entered and Exited won't fire while you're dragging something, because you're still "holding" it
|
||||
// Very much byond logic, but I want nice behavior, so we fake it with drag
|
||||
/atom/movable/screen/movable/action_button/MouseDrag(atom/over_object, src_location, over_location, src_control, over_control, params)
|
||||
. = ..()
|
||||
var/static/list/icon_cache = list()
|
||||
if(!can_use(usr))
|
||||
return
|
||||
if(IS_WEAKREF_OF(over_object, last_hovored_ref))
|
||||
return
|
||||
var/atom/old_object
|
||||
if(last_hovored_ref)
|
||||
old_object = last_hovored_ref?.resolve()
|
||||
else // If there's no current ref, we assume it was us. We also treat this as our "first go" location
|
||||
old_object = src
|
||||
var/datum/hud/our_hud = usr.hud_used
|
||||
our_hud?.generate_landings(src)
|
||||
|
||||
var/cache_key = "[hide_icon][hide_state]"
|
||||
hide_appearance = icon_cache[cache_key]
|
||||
if(!hide_appearance)
|
||||
hide_appearance = icon_cache[cache_key] = mutable_appearance(hide_icon, hide_state)
|
||||
if(old_object)
|
||||
old_object.MouseExited(over_location, over_control, params)
|
||||
|
||||
cache_key = "[hide_icon][show_state]"
|
||||
show_appearance = icon_cache[cache_key]
|
||||
if(!show_appearance)
|
||||
show_appearance = icon_cache[cache_key] = mutable_appearance(hide_icon, show_state)
|
||||
last_hovored_ref = WEAKREF(over_object)
|
||||
over_object.MouseEntered(over_location, over_control, params)
|
||||
|
||||
/atom/movable/screen/movable/action_button/hide_toggle/Click(location,control,params)
|
||||
if (!can_use(usr))
|
||||
/atom/movable/screen/movable/action_button/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
if(!QDELETED(src))
|
||||
openToolTip(usr, src, params, title = name, content = desc, theme = actiontooltipstyle)
|
||||
|
||||
/atom/movable/screen/movable/action_button/MouseExited(location, control, params)
|
||||
closeToolTip(usr)
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/movable/action_button/MouseDrop(over_object)
|
||||
last_hovored_ref = null
|
||||
if(!can_use(usr))
|
||||
return
|
||||
var/datum/hud/our_hud = usr.hud_used
|
||||
if(over_object == src)
|
||||
our_hud.hide_landings()
|
||||
return
|
||||
if(istype(over_object, /atom/movable/screen/action_landing))
|
||||
var/atom/movable/screen/action_landing/reserve = over_object
|
||||
reserve.hit_by(src)
|
||||
our_hud.hide_landings()
|
||||
save_position()
|
||||
return
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["shift"])
|
||||
if(locked)
|
||||
to_chat(usr, "<span class='warning'>Action button \"[name]\" is locked, unlock it first.</span>")
|
||||
return TRUE
|
||||
moved = FALSE
|
||||
usr.update_action_buttons(TRUE)
|
||||
return TRUE
|
||||
if(modifiers["ctrl"])
|
||||
locked = !locked
|
||||
to_chat(usr, "<span class='notice'>Action button \"[name]\" [locked ? "" : "un"]locked.</span>")
|
||||
if(id && usr.client) //try to (un)remember position
|
||||
usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = locked ? moved : null
|
||||
return TRUE
|
||||
if(modifiers["alt"])
|
||||
for(var/V in usr.actions)
|
||||
var/datum/action/A = V
|
||||
var/atom/movable/screen/movable/action_button/B = A.button
|
||||
B.moved = FALSE
|
||||
if(B.id && usr.client)
|
||||
usr.client.prefs.action_buttons_screen_locs["[B.name]_[B.id]"] = null
|
||||
B.locked = usr.client.prefs.buttons_locked
|
||||
locked = usr.client.prefs.buttons_locked
|
||||
moved = FALSE
|
||||
if(id && usr.client)
|
||||
usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = null
|
||||
usr.update_action_buttons(TRUE)
|
||||
to_chat(usr, "<span class='notice'>Action button positions have been reset.</span>")
|
||||
return TRUE
|
||||
usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden
|
||||
|
||||
hidden = usr.hud_used.action_buttons_hidden
|
||||
if(hidden)
|
||||
name = "Show Buttons"
|
||||
else
|
||||
name = "Hide Buttons"
|
||||
update_icon()
|
||||
usr.update_action_buttons()
|
||||
|
||||
/atom/movable/screen/movable/action_button/hide_toggle/AltClick(mob/user)
|
||||
for(var/V in user.actions)
|
||||
var/datum/action/A = V
|
||||
var/atom/movable/screen/movable/action_button/B = A.button
|
||||
B.moved = FALSE
|
||||
if(moved)
|
||||
moved = FALSE
|
||||
user.update_action_buttons(TRUE)
|
||||
to_chat(user, "<span class='notice'>Action button positions have been reset.</span>")
|
||||
return TRUE
|
||||
|
||||
|
||||
/atom/movable/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(datum/hud/owner_hud)
|
||||
var/settings = owner_hud.get_action_buttons_icons()
|
||||
icon = settings["bg_icon"]
|
||||
icon_state = settings["bg_state"]
|
||||
hide_icon = settings["toggle_icon"]
|
||||
hide_state = settings["toggle_hide"]
|
||||
show_state = settings["toggle_show"]
|
||||
update_icon()
|
||||
|
||||
/atom/movable/screen/movable/action_button/hide_toggle/update_overlays()
|
||||
our_hud.hide_landings()
|
||||
if(istype(over_object, /atom/movable/screen/button_palette) || istype(over_object, /atom/movable/screen/palette_scroll))
|
||||
our_hud.position_action(src, SCRN_OBJ_IN_PALETTE)
|
||||
save_position()
|
||||
return
|
||||
if(istype(over_object, /atom/movable/screen/movable/action_button))
|
||||
var/atom/movable/screen/movable/action_button/button = over_object
|
||||
our_hud.position_action_relative(src, button)
|
||||
save_position()
|
||||
return
|
||||
. = ..()
|
||||
if(hidden)
|
||||
. += show_appearance
|
||||
else
|
||||
. += hide_appearance
|
||||
our_hud.position_action(src, screen_loc)
|
||||
save_position()
|
||||
|
||||
/atom/movable/screen/movable/action_button/proc/save_position()
|
||||
var/mob/user = our_hud.mymob
|
||||
if(!user?.client)
|
||||
return
|
||||
var/position_info = ""
|
||||
switch(location)
|
||||
if(SCRN_OBJ_FLOATING)
|
||||
position_info = screen_loc
|
||||
if(SCRN_OBJ_IN_LIST)
|
||||
position_info = SCRN_OBJ_IN_LIST
|
||||
if(SCRN_OBJ_IN_PALETTE)
|
||||
position_info = SCRN_OBJ_IN_PALETTE
|
||||
|
||||
/atom/movable/screen/movable/action_button/MouseEntered(location,control,params)
|
||||
if(!QDELETED(src))
|
||||
openToolTip(usr,src,params,title = name,content = desc,theme = actiontooltipstyle)
|
||||
user.client.prefs.action_buttons_screen_locs["[name]_[id]"] = position_info
|
||||
user.client.prefs.queue_save_pref(1 SECONDS, TRUE)
|
||||
|
||||
/atom/movable/screen/movable/action_button/proc/load_position()
|
||||
var/mob/user = our_hud.mymob
|
||||
if(!user)
|
||||
return
|
||||
var/position_info = user.client?.prefs?.action_buttons_screen_locs["[name]_[id]"] || SCRN_OBJ_DEFAULT
|
||||
user.hud_used.position_action(src, position_info)
|
||||
|
||||
/atom/movable/screen/movable/action_button/MouseExited()
|
||||
closeToolTip(usr)
|
||||
/atom/movable/screen/movable/action_button/proc/dump_save()
|
||||
var/mob/user = our_hud.mymob
|
||||
if(!user?.client)
|
||||
return
|
||||
user.client.prefs.action_buttons_screen_locs -= "[name]_[id]"
|
||||
user.client.prefs.queue_save_pref(1 SECONDS, TRUE)
|
||||
|
||||
/datum/hud/proc/get_action_buttons_icons()
|
||||
. = list()
|
||||
.["bg_icon"] = ui_style
|
||||
.["bg_state"] = "template"
|
||||
|
||||
//TODO : Make these fit theme
|
||||
.["toggle_icon"] = 'icons/mob/actions.dmi'
|
||||
.["toggle_hide"] = "hide"
|
||||
.["toggle_show"] = "show"
|
||||
|
||||
//see human and alien hud for specific implementations.
|
||||
|
||||
/mob/proc/update_action_buttons_icon(status_only = FALSE)
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon(status_only)
|
||||
A.UpdateButtons(status_only)
|
||||
|
||||
//This is the proc used to update all the action buttons.
|
||||
/mob/proc/update_action_buttons(reload_screen)
|
||||
@@ -191,56 +161,243 @@
|
||||
if(hud_used.hud_shown != HUD_STYLE_STANDARD)
|
||||
return
|
||||
|
||||
var/button_number = 0
|
||||
var/list/cview = getviewsize(client.view)
|
||||
var/supportedcolumns = cview[1]-2
|
||||
for(var/datum/action/action as anything in actions)
|
||||
var/atom/movable/screen/movable/action_button/button = action.viewers[hud_used]
|
||||
action.UpdateButtons()
|
||||
if(reload_screen)
|
||||
client.screen += button
|
||||
|
||||
if(hud_used.action_buttons_hidden)
|
||||
for(var/datum/action/A in actions)
|
||||
A.button.screen_loc = null
|
||||
if(reload_screen)
|
||||
client.screen += A.button
|
||||
else
|
||||
for(var/datum/action/A in actions)
|
||||
A.UpdateButtonIcon()
|
||||
var/atom/movable/screen/movable/action_button/B = A.button
|
||||
if(B.ordered)
|
||||
button_number++
|
||||
if(B.moved)
|
||||
B.screen_loc = B.moved
|
||||
else
|
||||
B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number, supportedcolumns)
|
||||
if(reload_screen)
|
||||
client.screen += B
|
||||
|
||||
if(!button_number)
|
||||
hud_used.hide_actions_toggle.screen_loc = null
|
||||
return
|
||||
|
||||
if(!hud_used.hide_actions_toggle.moved)
|
||||
hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1, supportedcolumns)
|
||||
else
|
||||
hud_used.hide_actions_toggle.screen_loc = hud_used.hide_actions_toggle.moved
|
||||
if(reload_screen)
|
||||
client.screen += hud_used.hide_actions_toggle
|
||||
hud_used.update_our_owner()
|
||||
// This holds the logic for the palette buttons
|
||||
hud_used.palette_actions.refresh_actions()
|
||||
|
||||
/datum/hud/proc/ButtonNumberToScreenCoords(number, supportedcolumns) // TODO : Make this zero-indexed for readabilty
|
||||
var/row = round((number - 1)/supportedcolumns)
|
||||
var/col = ((number - 1)%(supportedcolumns)) + 1
|
||||
/atom/movable/screen/button_palette
|
||||
desc = "<b>Drag</b> buttons to move them<br><b>Shift-click</b> any button to reset it<br><b>Alt-click</b> this to reset all buttons"
|
||||
icon = 'icons/hud/64x16_actions.dmi'
|
||||
icon_state = "screen_gen_palette"
|
||||
screen_loc = ui_action_palette
|
||||
var/datum/hud/our_hud
|
||||
var/expanded = FALSE
|
||||
/// Id of any currently running timers that set our color matrix
|
||||
var/color_timer_id
|
||||
|
||||
var/coord_col = "+[col-1]"
|
||||
var/coord_col_offset = 2 + 2 * col
|
||||
/atom/movable/screen/button_palette/Destroy()
|
||||
if(our_hud)
|
||||
our_hud.mymob?.client?.screen -= src
|
||||
our_hud.toggle_palette = null
|
||||
our_hud = null
|
||||
return ..()
|
||||
|
||||
var/coord_row = "[row ? -row : "+0"]"
|
||||
/atom/movable/screen/button_palette/Initialize(mapload)
|
||||
. = ..()
|
||||
update_appearance()
|
||||
|
||||
return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-6"
|
||||
/atom/movable/screen/button_palette/proc/set_hud(datum/hud/our_hud)
|
||||
src.our_hud = our_hud
|
||||
refresh_owner()
|
||||
|
||||
/datum/hud/proc/SetButtonCoords(atom/movable/screen/button,number, supportedcolumns)
|
||||
var/row = round((number-1)/supportedcolumns)
|
||||
var/col = ((number - 1)%(supportedcolumns)) + 1
|
||||
var/x_offset = 32*(col-1) + 4 + 2*col
|
||||
var/y_offset = -32*(row+1) + 26
|
||||
/atom/movable/screen/button_palette/update_name(updates)
|
||||
. = ..()
|
||||
if(expanded)
|
||||
name = "Hide Buttons"
|
||||
else
|
||||
name = "Show Buttons"
|
||||
|
||||
var/matrix/M = matrix()
|
||||
M.Translate(x_offset,y_offset)
|
||||
button.transform = M
|
||||
/atom/movable/screen/button_palette/proc/refresh_owner()
|
||||
var/mob/viewer = our_hud.mymob
|
||||
if(viewer.client)
|
||||
viewer.client.screen |= src
|
||||
|
||||
var/list/settings = our_hud.get_action_buttons_icons()
|
||||
var/ui_icon = "[settings["bg_icon"]]"
|
||||
var/list/ui_segments = splittext(ui_icon, ".")
|
||||
var/list/ui_paths = splittext(ui_segments[1], "/")
|
||||
var/ui_name = ui_paths[length(ui_paths)]
|
||||
|
||||
icon_state = "[ui_name]_palette"
|
||||
|
||||
/atom/movable/screen/button_palette/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
if(QDELETED(src))
|
||||
return
|
||||
show_tooltip(params)
|
||||
|
||||
/atom/movable/screen/button_palette/MouseExited()
|
||||
closeToolTip(usr)
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/button_palette/proc/show_tooltip(params)
|
||||
openToolTip(usr, src, params, title = name, content = desc)
|
||||
|
||||
GLOBAL_LIST_INIT(palette_added_matrix, list(0.4,0.5,0.2,0, 0,1.4,0,0, 0,0.4,0.6,0, 0,0,0,1, 0,0,0,0))
|
||||
GLOBAL_LIST_INIT(palette_removed_matrix, list(1.4,0,0,0, 0.7,0.4,0,0, 0.4,0,0.6,0, 0,0,0,1, 0,0,0,0))
|
||||
|
||||
/atom/movable/screen/button_palette/proc/play_item_added()
|
||||
color_for_now(GLOB.palette_added_matrix)
|
||||
|
||||
/atom/movable/screen/button_palette/proc/play_item_removed()
|
||||
color_for_now(GLOB.palette_removed_matrix)
|
||||
|
||||
/atom/movable/screen/button_palette/proc/color_for_now(list/color)
|
||||
if(color_timer_id)
|
||||
return
|
||||
add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) //We unfortunately cannot animate matrix colors. Curse you lummy it would be ~~non~~trivial to interpolate between the two valuessssssssss
|
||||
color_timer_id = addtimer(CALLBACK(src, .proc/remove_color, color), 2 SECONDS)
|
||||
|
||||
/atom/movable/screen/button_palette/proc/remove_color(list/to_remove)
|
||||
color_timer_id = null
|
||||
remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, to_remove)
|
||||
|
||||
/atom/movable/screen/button_palette/proc/can_use(mob/user)
|
||||
if (isobserver(user))
|
||||
var/mob/dead/observer/O = user
|
||||
return !O.observetarget
|
||||
return TRUE
|
||||
|
||||
/atom/movable/screen/button_palette/Click(location, control, params)
|
||||
if(!can_use(usr))
|
||||
return
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
|
||||
if(LAZYACCESS(modifiers, ALT_CLICK))
|
||||
for(var/datum/action/action as anything in usr.actions) // Reset action positions to default
|
||||
for(var/datum/hud/hud as anything in action.viewers)
|
||||
var/atom/movable/screen/movable/action_button/button = action.viewers[hud]
|
||||
hud.position_action(button, SCRN_OBJ_DEFAULT)
|
||||
to_chat(usr, span_notice("Action button positions have been reset."))
|
||||
return TRUE
|
||||
|
||||
set_expanded(!expanded)
|
||||
|
||||
/atom/movable/screen/button_palette/proc/clicked_while_open(datum/source, atom/target, atom/location, control, params, mob/user)
|
||||
if(istype(target, /atom/movable/screen/movable/action_button) || istype(target, /atom/movable/screen/palette_scroll) || target == src) // If you're clicking on an action button, or us, you can live
|
||||
return
|
||||
set_expanded(FALSE)
|
||||
if(source)
|
||||
UnregisterSignal(source, COMSIG_CLIENT_CLICK)
|
||||
|
||||
/atom/movable/screen/button_palette/proc/set_expanded(new_expanded)
|
||||
var/datum/action_group/our_group = our_hud.palette_actions
|
||||
if(!length(our_group.actions)) //Looks dumb, trust me lad
|
||||
new_expanded = FALSE
|
||||
if(expanded == new_expanded)
|
||||
return
|
||||
|
||||
expanded = new_expanded
|
||||
our_group.refresh_actions()
|
||||
update_appearance()
|
||||
|
||||
if(!usr.client)
|
||||
return
|
||||
|
||||
if(expanded)
|
||||
RegisterSignal(usr.client, COMSIG_CLIENT_CLICK, .proc/clicked_while_open)
|
||||
else
|
||||
UnregisterSignal(usr.client, COMSIG_CLIENT_CLICK)
|
||||
|
||||
closeToolTip(usr) //Our tooltips are now invalid, can't seem to update them in one frame, so here, just close them
|
||||
|
||||
/atom/movable/screen/palette_scroll
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
screen_loc = ui_palette_scroll
|
||||
/// How should we move the palette's actions?
|
||||
/// Positive scrolls down the list, negative scrolls back
|
||||
var/scroll_direction = 0
|
||||
var/datum/hud/our_hud
|
||||
|
||||
/atom/movable/screen/palette_scroll/proc/can_use(mob/user)
|
||||
if (isobserver(user))
|
||||
var/mob/dead/observer/O = user
|
||||
return !O.observetarget
|
||||
return TRUE
|
||||
|
||||
/atom/movable/screen/palette_scroll/proc/set_hud(datum/hud/our_hud)
|
||||
src.our_hud = our_hud
|
||||
refresh_owner()
|
||||
|
||||
/atom/movable/screen/palette_scroll/proc/refresh_owner()
|
||||
var/mob/viewer = our_hud.mymob
|
||||
if(viewer.client)
|
||||
viewer.client.screen |= src
|
||||
|
||||
var/list/settings = our_hud.get_action_buttons_icons()
|
||||
icon = settings["bg_icon"]
|
||||
|
||||
/atom/movable/screen/palette_scroll/Click(location, control, params)
|
||||
if(!can_use(usr))
|
||||
return
|
||||
our_hud.palette_actions.scroll(scroll_direction)
|
||||
|
||||
/atom/movable/screen/palette_scroll/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
if(QDELETED(src))
|
||||
return
|
||||
openToolTip(usr, src, params, title = name, content = desc)
|
||||
|
||||
/atom/movable/screen/palette_scroll/MouseExited()
|
||||
closeToolTip(usr)
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/palette_scroll/down
|
||||
name = "Scroll Down"
|
||||
desc = "<b>Click</b> on this to scroll the actions above down"
|
||||
icon_state = "scroll_down"
|
||||
scroll_direction = 1
|
||||
|
||||
/atom/movable/screen/palette_scroll/down/Destroy()
|
||||
if(our_hud)
|
||||
our_hud.mymob?.client?.screen -= src
|
||||
our_hud.palette_down = null
|
||||
our_hud = null
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/palette_scroll/up
|
||||
name = "Scroll Up"
|
||||
desc = "<b>Click</b> on this to scroll the actions above up"
|
||||
icon_state = "scroll_up"
|
||||
scroll_direction = -1
|
||||
|
||||
/atom/movable/screen/palette_scroll/up/Destroy()
|
||||
if(our_hud)
|
||||
our_hud.mymob?.client?.screen -= src
|
||||
our_hud.palette_up = null
|
||||
our_hud = null
|
||||
return ..()
|
||||
|
||||
/// Exists so you have a place to put your buttons when you move them around
|
||||
/atom/movable/screen/action_landing
|
||||
name = "Button Space"
|
||||
desc = "<b>Drag and drop</b> a button into this spot<br>to add it to the group"
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
icon_state = "reserved"
|
||||
// We want our whole 32x32 space to be clickable, so dropping's forgiving
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE
|
||||
var/datum/action_group/owner
|
||||
|
||||
/atom/movable/screen/action_landing/Destroy()
|
||||
if(owner)
|
||||
owner.landing = null
|
||||
owner?.owner?.mymob?.client?.screen -= src
|
||||
owner.refresh_actions()
|
||||
owner = null
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/action_landing/proc/set_owner(datum/action_group/owner)
|
||||
src.owner = owner
|
||||
refresh_owner()
|
||||
|
||||
/atom/movable/screen/action_landing/proc/refresh_owner()
|
||||
var/datum/hud/our_hud = owner.owner
|
||||
var/mob/viewer = our_hud.mymob
|
||||
if(viewer.client)
|
||||
viewer.client.screen |= src
|
||||
|
||||
var/list/settings = our_hud.get_action_buttons_icons()
|
||||
icon = settings["bg_icon"]
|
||||
|
||||
/// Reacts to having a button dropped on it
|
||||
/atom/movable/screen/action_landing/proc/hit_by(atom/movable/screen/movable/action_button/button)
|
||||
var/datum/hud/our_hud = owner.owner
|
||||
our_hud.position_action(button, owner.location)
|
||||
|
||||
@@ -194,7 +194,7 @@
|
||||
|
||||
// Language menu
|
||||
using = new /atom/movable/screen/language_menu
|
||||
using.screen_loc = ui_borg_language_menu
|
||||
using.screen_loc = ui_ai_language_menu
|
||||
using.hud = src
|
||||
static_inventory += using
|
||||
|
||||
|
||||
@@ -75,9 +75,9 @@
|
||||
/mob/proc/clear_alert(category, clear_override = FALSE)
|
||||
var/atom/movable/screen/alert/alert = alerts[category]
|
||||
if(!alert)
|
||||
return 0
|
||||
return FALSE
|
||||
if(alert.override_alerts && !clear_override)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
alerts -= category
|
||||
if(client && hud_used)
|
||||
@@ -784,7 +784,7 @@ so as to remain in compliance with the most up-to-date laws."
|
||||
if(!hud_shown)
|
||||
for(var/i = 1, i <= alerts.len, i++)
|
||||
screenmob.client.screen -= alerts[alerts[i]]
|
||||
return 1
|
||||
return TRUE
|
||||
for(var/i = 1, i <= alerts.len, i++)
|
||||
var/atom/movable/screen/alert/alert = alerts[alerts[i]]
|
||||
if(alert.icon_state == "template")
|
||||
@@ -807,7 +807,7 @@ so as to remain in compliance with the most up-to-date laws."
|
||||
if(!viewmob)
|
||||
for(var/M in mymob.observers)
|
||||
reorganize_alerts(M)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/atom/movable/screen/alert/Click(location, control, params)
|
||||
if(!usr || !usr.client)
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
icon = I
|
||||
parent = P
|
||||
icon_state = credited
|
||||
maptext = MAPTEXT(credited)
|
||||
maptext = MAPTEXT_PIXELLARI(credited)
|
||||
maptext_x = world.icon_size + 8
|
||||
maptext_y = (world.icon_size / 2) - 4
|
||||
maptext_width = world.icon_size * 3
|
||||
|
||||
+341
-11
@@ -11,7 +11,10 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
"Plasmafire" = 'icons/mob/screen_plasmafire.dmi',
|
||||
"Slimecore" = 'icons/mob/screen_slimecore.dmi',
|
||||
"Operative" = 'icons/mob/screen_operative.dmi',
|
||||
"Clockwork" = 'icons/mob/screen_clockwork.dmi'
|
||||
"Glass" = 'icons/mob/screen_glass.dmi',
|
||||
"Clockwork" = 'icons/mob/screen_clockwork.dmi',
|
||||
"Trasen-Knox" = 'icons/mob/screen_trasenknox.dmi',
|
||||
"Detective" = 'icons/mob/screen_detective.dmi',
|
||||
))
|
||||
|
||||
/proc/ui_style2icon(ui_style)
|
||||
@@ -73,8 +76,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
|
||||
// We don't actually do proccalls really yet, so let's grab at prefs
|
||||
|
||||
var/atom/movable/screen/movable/action_button/hide_toggle/hide_actions_toggle
|
||||
var/action_buttons_hidden = FALSE
|
||||
var/atom/movable/screen/button_palette/toggle_palette
|
||||
var/atom/movable/screen/palette_scroll/down/palette_down
|
||||
var/atom/movable/screen/palette_scroll/up/palette_up
|
||||
|
||||
var/datum/action_group/palette/palette_actions
|
||||
var/datum/action_group/listed/listed_actions
|
||||
var/list/floating_actions
|
||||
|
||||
var/atom/movable/screen/healths
|
||||
var/atom/movable/screen/healthdoll
|
||||
@@ -91,10 +99,12 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
// will fall back to the default if any of these are null
|
||||
ui_style = ui_style2icon(owner.client && owner.client.prefs && owner.client.prefs.UI_style)
|
||||
|
||||
hide_actions_toggle = new
|
||||
hide_actions_toggle.InitialiseIcon(src)
|
||||
if(mymob.client)
|
||||
hide_actions_toggle.locked = mymob.client.prefs.buttons_locked
|
||||
toggle_palette = new()
|
||||
toggle_palette.set_hud(src)
|
||||
palette_down = new()
|
||||
palette_down.set_hud(src)
|
||||
palette_up = new()
|
||||
palette_up.set_hud(src)
|
||||
|
||||
hand_slots = list()
|
||||
|
||||
@@ -110,7 +120,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
if(mymob.hud_used == src)
|
||||
mymob.hud_used = null
|
||||
|
||||
QDEL_NULL(hide_actions_toggle)
|
||||
QDEL_NULL(toggle_palette)
|
||||
QDEL_NULL(palette_down)
|
||||
QDEL_NULL(palette_up)
|
||||
QDEL_NULL(palette_actions)
|
||||
QDEL_NULL(listed_actions)
|
||||
QDEL_LIST(floating_actions)
|
||||
|
||||
QDEL_NULL(module_store_icon)
|
||||
QDEL_LIST(static_inventory)
|
||||
|
||||
@@ -148,10 +164,14 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
/mob/proc/create_mob_hud()
|
||||
if(!client || hud_used)
|
||||
return
|
||||
hud_used = new hud_type(src)
|
||||
set_hud_used(new hud_type(src))
|
||||
update_sight()
|
||||
SEND_SIGNAL(src, COMSIG_MOB_HUD_CREATED)
|
||||
|
||||
/mob/proc/set_hud_used(datum/hud/new_hud)
|
||||
hud_used = new_hud
|
||||
new_hud.build_action_groups()
|
||||
|
||||
//Version denotes which style should be displayed. blank or 0 means "next version"
|
||||
/datum/hud/proc/show_hud(version = 0, mob/viewmob)
|
||||
if(!ismob(mymob))
|
||||
@@ -160,6 +180,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
if(!screenmob.client)
|
||||
return FALSE
|
||||
|
||||
// This code is the absolute fucking worst, I want it to go die in a fire
|
||||
// Seriously, why
|
||||
screenmob.client.screen = list()
|
||||
screenmob.client.update_clickcatcher()
|
||||
|
||||
@@ -181,7 +203,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
if(infodisplay.len)
|
||||
screenmob.client.screen += infodisplay
|
||||
|
||||
screenmob.client.screen += hide_actions_toggle
|
||||
screenmob.client.screen += toggle_palette
|
||||
|
||||
if(action_intent)
|
||||
action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position
|
||||
@@ -272,7 +294,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
|
||||
ui_style = new_ui_style
|
||||
build_hand_slots()
|
||||
hide_actions_toggle.InitialiseIcon(src)
|
||||
|
||||
//Triggered when F12 is pressed (Unless someone changed something in the DMF)
|
||||
/mob/verb/button_pressed_F12()
|
||||
@@ -320,3 +341,312 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
|
||||
/datum/hud/proc/update_locked_slots()
|
||||
return
|
||||
|
||||
/datum/hud/proc/position_action(atom/movable/screen/movable/action_button/button, position)
|
||||
// This is kinda a hack, I'm sorry.
|
||||
// Basically, FLOATING is never a valid position to pass into this proc. It exists as a generic marker for manually positioned buttons
|
||||
// Not as a position to target
|
||||
if(position == SCRN_OBJ_FLOATING)
|
||||
return
|
||||
if(button.location != SCRN_OBJ_DEFAULT)
|
||||
hide_action(button)
|
||||
switch(position)
|
||||
if(SCRN_OBJ_DEFAULT) // Reset to the default
|
||||
button.dump_save() // Nuke any existing saves
|
||||
position_action(button, button.linked_action.default_button_position)
|
||||
return
|
||||
if(SCRN_OBJ_IN_LIST)
|
||||
listed_actions.insert_action(button)
|
||||
if(SCRN_OBJ_IN_PALETTE)
|
||||
palette_actions.insert_action(button)
|
||||
else // If we don't have it as a define, this is a screen_loc, and we should be floating
|
||||
floating_actions += button
|
||||
button.screen_loc = position
|
||||
position = SCRN_OBJ_FLOATING
|
||||
|
||||
button.location = position
|
||||
|
||||
/datum/hud/proc/position_action_relative(atom/movable/screen/movable/action_button/button, atom/movable/screen/movable/action_button/relative_to)
|
||||
if(button.location != SCRN_OBJ_DEFAULT)
|
||||
hide_action(button)
|
||||
switch(relative_to.location)
|
||||
if(SCRN_OBJ_IN_LIST)
|
||||
listed_actions.insert_action(button, listed_actions.index_of(relative_to))
|
||||
if(SCRN_OBJ_IN_PALETTE)
|
||||
palette_actions.insert_action(button, palette_actions.index_of(relative_to))
|
||||
if(SCRN_OBJ_FLOATING) // If we don't have it as a define, this is a screen_loc, and we should be floating
|
||||
floating_actions += button
|
||||
var/client/our_client = mymob.client
|
||||
if(!our_client)
|
||||
position_action(button, button.linked_action.default_button_position)
|
||||
return
|
||||
button.screen_loc = get_valid_screen_location(relative_to.screen_loc, world.icon_size, our_client.view_size.getView()) // Asks for a location adjacent to our button that won't overflow the map
|
||||
|
||||
button.location = relative_to.location
|
||||
|
||||
/// Removes the passed in action from its current position on the screen
|
||||
/datum/hud/proc/hide_action(atom/movable/screen/movable/action_button/button)
|
||||
switch(button.location)
|
||||
if(SCRN_OBJ_DEFAULT) // Invalid
|
||||
CRASH("We just tried to hide an action buttion that somehow has the default position as its location, you done fucked up")
|
||||
if(SCRN_OBJ_FLOATING)
|
||||
floating_actions -= button
|
||||
if(SCRN_OBJ_IN_LIST)
|
||||
listed_actions.remove_action(button)
|
||||
if(SCRN_OBJ_IN_PALETTE)
|
||||
palette_actions.remove_action(button)
|
||||
button.screen_loc = null
|
||||
|
||||
/// Generates visual landings for all groups that the button is not a memeber of
|
||||
/datum/hud/proc/generate_landings(atom/movable/screen/movable/action_button/button)
|
||||
listed_actions.generate_landing()
|
||||
palette_actions.generate_landing()
|
||||
|
||||
/// Clears all currently visible landings
|
||||
/datum/hud/proc/hide_landings()
|
||||
listed_actions.clear_landing()
|
||||
palette_actions.clear_landing()
|
||||
|
||||
// Updates any existing "owned" visuals, ensures they continue to be visible
|
||||
/datum/hud/proc/update_our_owner()
|
||||
toggle_palette.refresh_owner()
|
||||
palette_down.refresh_owner()
|
||||
palette_up.refresh_owner()
|
||||
listed_actions.update_landing()
|
||||
palette_actions.update_landing()
|
||||
|
||||
/// Ensures all of our buttons are properly within the bounds of our client's view, moves them if they're not
|
||||
/datum/hud/proc/view_audit_buttons()
|
||||
var/our_view = mymob?.client?.view
|
||||
if(!our_view)
|
||||
return
|
||||
listed_actions.check_against_view()
|
||||
palette_actions.check_against_view()
|
||||
for(var/atom/movable/screen/movable/action_button/floating_button as anything in floating_actions)
|
||||
var/list/current_offsets = screen_loc_to_offset(floating_button.screen_loc)
|
||||
// We set the view arg here, so the output will be properly hemm'd in by our new view
|
||||
floating_button.screen_loc = offset_to_screen_loc(current_offsets[1], current_offsets[2], view = our_view)
|
||||
|
||||
/// Generates and fills new action groups with our mob's current actions
|
||||
/datum/hud/proc/build_action_groups()
|
||||
listed_actions = new(src)
|
||||
palette_actions = new(src)
|
||||
floating_actions = list()
|
||||
for(var/datum/action/action as anything in mymob.actions)
|
||||
var/atom/movable/screen/movable/action_button/button = action.viewers[src]
|
||||
if(!button)
|
||||
action.ShowTo(mymob)
|
||||
button = action.viewers[src]
|
||||
else
|
||||
position_action(button, button.location)
|
||||
|
||||
/datum/action_group
|
||||
/// The hud we're owned by
|
||||
var/datum/hud/owner
|
||||
/// The actions we're managing
|
||||
var/list/atom/movable/screen/movable/action_button/actions
|
||||
/// The initial vertical offset of our action buttons
|
||||
var/north_offset = 0
|
||||
/// The pixel vertical offset of our action buttons
|
||||
var/pixel_north_offset = 0
|
||||
/// Max amount of buttons we can have per row
|
||||
/// Indexes at 1
|
||||
var/column_max = 0
|
||||
/// How far "ahead" of the first row we start. Lets us "scroll" our rows
|
||||
/// Indexes at 1
|
||||
var/row_offset = 0
|
||||
/// How many rows of actions we can have at max before we just stop hiding
|
||||
/// Indexes at 1
|
||||
var/max_rows = INFINITY
|
||||
/// The screen location we go by
|
||||
var/location
|
||||
/// Our landing screen object
|
||||
var/atom/movable/screen/action_landing/landing
|
||||
|
||||
/datum/action_group/New(datum/hud/owner)
|
||||
..()
|
||||
actions = list()
|
||||
src.owner = owner
|
||||
|
||||
/datum/action_group/Destroy()
|
||||
owner = null
|
||||
QDEL_NULL(landing)
|
||||
QDEL_LIST(actions)
|
||||
return ..()
|
||||
|
||||
/datum/action_group/proc/insert_action(atom/movable/screen/action, index)
|
||||
if(action in actions)
|
||||
if(actions[index] == action)
|
||||
return
|
||||
actions -= action // Don't dupe, come on
|
||||
if(!index)
|
||||
index = length(actions) + 1
|
||||
index = min(length(actions) + 1, index)
|
||||
actions.Insert(index, action)
|
||||
refresh_actions()
|
||||
|
||||
/datum/action_group/proc/remove_action(atom/movable/screen/action)
|
||||
actions -= action
|
||||
refresh_actions()
|
||||
|
||||
/datum/action_group/proc/refresh_actions()
|
||||
|
||||
// We don't use size() here because landings are not canon
|
||||
var/total_rows = ROUND_UP(length(actions) / column_max)
|
||||
total_rows -= max_rows // Lets get the amount of rows we're off from our max
|
||||
row_offset = clamp(row_offset, 0, total_rows) // You're not allowed to offset so far that we have a row of blank space
|
||||
|
||||
var/button_number = 0
|
||||
for(var/atom/movable/screen/button as anything in actions)
|
||||
var/postion = ButtonNumberToScreenCoords(button_number )
|
||||
button.screen_loc = postion
|
||||
button_number++
|
||||
|
||||
if(landing)
|
||||
var/postion = ButtonNumberToScreenCoords(button_number, landing = TRUE) // Need a good way to count buttons off screen, but allow this to display in the right place if it's being placed with no concern for dropdown
|
||||
landing.screen_loc = postion
|
||||
button_number++
|
||||
|
||||
/// Accepts a number represeting our position in the group, indexes at 0 to make the math nicer
|
||||
/datum/action_group/proc/ButtonNumberToScreenCoords(number, landing = FALSE)
|
||||
var/row = round(number / column_max)
|
||||
row -= row_offset // If you're less then 0, you don't get to render, this lets us "scroll" rows ya feel?
|
||||
if(row < 0)
|
||||
return null
|
||||
|
||||
// Could use >= here, but I think it's worth noting that the two start at different places, since row is based on number here
|
||||
if(row > max_rows - 1)
|
||||
if(!landing) // If you're not a landing, go away please. thx
|
||||
return null
|
||||
// We always want to render landings, even if their action button can't be displayed.
|
||||
// So we set a row equal to the max amount of rows + 1. Willing to overrun that max slightly to properly display the landing spot
|
||||
row = max_rows // Remembering that max_rows indexes at 1, and row indexes at 0
|
||||
|
||||
// We're going to need to set our column to match the first item in the last row, so let's set number properly now
|
||||
number = row * column_max
|
||||
|
||||
var/visual_row = row + north_offset
|
||||
var/coord_row = visual_row ? "-[visual_row]" : "+0"
|
||||
|
||||
var/visual_column = number % column_max
|
||||
var/coord_col = "+[visual_column]"
|
||||
var/coord_col_offset = 4 + 2 * (visual_column + 1)
|
||||
return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-[pixel_north_offset]"
|
||||
|
||||
/datum/action_group/proc/check_against_view()
|
||||
var/owner_view = owner?.mymob?.client?.view
|
||||
if(!owner_view)
|
||||
return
|
||||
// Unlikey as it is, we may have been changed. Want to start from our target position and fail down
|
||||
column_max = initial(column_max)
|
||||
// Convert our viewer's view var into a workable offset
|
||||
var/list/view_size = view_to_pixels(owner_view)
|
||||
|
||||
// We're primarially concerned about width here, if someone makes us 1x2000 I wish them a swift and watery death
|
||||
var/furthest_screen_loc = ButtonNumberToScreenCoords(column_max - 1)
|
||||
var/list/offsets = screen_loc_to_offset(furthest_screen_loc, owner_view)
|
||||
if(offsets[1] > world.icon_size && offsets[1] < view_size[1] && offsets[2] > world.icon_size && offsets[2] < view_size[2]) // We're all good
|
||||
return
|
||||
|
||||
for(column_max in column_max - 1 to 1 step -1) // Yes I could do this by unwrapping ButtonNumberToScreenCoords, but I don't feel like it
|
||||
var/tested_screen_loc = ButtonNumberToScreenCoords(column_max)
|
||||
offsets = screen_loc_to_offset(tested_screen_loc, owner_view)
|
||||
// We've found a valid max length, pack it in
|
||||
if(offsets[1] > world.icon_size && offsets[1] < view_size[1] && offsets[2] > world.icon_size && offsets[2] < view_size[2])
|
||||
break
|
||||
// Use our newly resized column max
|
||||
refresh_actions()
|
||||
|
||||
/// Returns the amount of objects we're storing at the moment
|
||||
/datum/action_group/proc/size()
|
||||
var/amount = length(actions)
|
||||
if(landing)
|
||||
amount += 1
|
||||
return amount
|
||||
|
||||
/datum/action_group/proc/index_of(atom/movable/screen/get_location)
|
||||
return actions.Find(get_location)
|
||||
|
||||
/// Generates a landing object that can be dropped on to join this group
|
||||
/datum/action_group/proc/generate_landing()
|
||||
if(landing)
|
||||
return
|
||||
landing = new()
|
||||
landing.set_owner(src)
|
||||
refresh_actions()
|
||||
|
||||
/// Clears any landing objects we may currently have
|
||||
/datum/action_group/proc/clear_landing()
|
||||
QDEL_NULL(landing)
|
||||
|
||||
/datum/action_group/proc/update_landing()
|
||||
if(!landing)
|
||||
return
|
||||
landing.refresh_owner()
|
||||
|
||||
/datum/action_group/proc/scroll(amount)
|
||||
row_offset += amount
|
||||
refresh_actions()
|
||||
|
||||
/datum/action_group/palette
|
||||
north_offset = 2
|
||||
column_max = 3
|
||||
max_rows = 3
|
||||
location = SCRN_OBJ_IN_PALETTE
|
||||
|
||||
/datum/action_group/palette/insert_action(atom/movable/screen/action, index)
|
||||
. = ..()
|
||||
var/atom/movable/screen/button_palette/palette = owner.toggle_palette
|
||||
palette.play_item_added()
|
||||
|
||||
/datum/action_group/palette/remove_action(atom/movable/screen/action)
|
||||
. = ..()
|
||||
var/atom/movable/screen/button_palette/palette = owner.toggle_palette
|
||||
palette.play_item_removed()
|
||||
if(!length(actions))
|
||||
palette.set_expanded(FALSE)
|
||||
|
||||
/datum/action_group/palette/refresh_actions()
|
||||
var/atom/movable/screen/button_palette/palette = owner.toggle_palette
|
||||
var/atom/movable/screen/palette_scroll/scroll_down = owner.palette_down
|
||||
var/atom/movable/screen/palette_scroll/scroll_up = owner.palette_up
|
||||
|
||||
var/actions_above = round((owner.listed_actions.size() - 1) / owner.listed_actions.column_max)
|
||||
north_offset = initial(north_offset) + actions_above
|
||||
|
||||
palette.screen_loc = ui_action_palette_offset(actions_above)
|
||||
var/action_count = length(owner?.mymob?.actions)
|
||||
var/our_row_count = round((length(actions) - 1) / column_max)
|
||||
if(!action_count)
|
||||
palette.screen_loc = null
|
||||
|
||||
if(palette.expanded && action_count && our_row_count >= max_rows)
|
||||
scroll_down.screen_loc = ui_palette_scroll_offset(actions_above)
|
||||
scroll_up.screen_loc = ui_palette_scroll_offset(actions_above)
|
||||
else
|
||||
scroll_down.screen_loc = null
|
||||
scroll_up.screen_loc = null
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/action_group/palette/ButtonNumberToScreenCoords(number, landing)
|
||||
var/atom/movable/screen/button_palette/palette = owner.toggle_palette
|
||||
if(palette.expanded)
|
||||
return ..()
|
||||
|
||||
if(!landing)
|
||||
return null
|
||||
|
||||
// We only render the landing in this case, so we force it to be the second item displayed (Second rather then first since it looks nicer)
|
||||
// Remember the number var indexes at 0
|
||||
return ..(1 + (row_offset * column_max), landing)
|
||||
|
||||
|
||||
/datum/action_group/listed
|
||||
pixel_north_offset = 6
|
||||
column_max = 10
|
||||
location = SCRN_OBJ_IN_LIST
|
||||
|
||||
/datum/action_group/listed/refresh_actions()
|
||||
. = ..()
|
||||
owner?.palette_actions.refresh_actions() // We effect them, so we gotta refresh em
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
/atom/movable/screen/human/equip/Click()
|
||||
if(ismecha(usr.loc)) // stops inventory actions in a mech
|
||||
return 1
|
||||
return TRUE
|
||||
var/mob/living/carbon/human/H = usr
|
||||
H.quick_equip()
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
/atom/movable/screen/devil/soul_counter/proc/update_counter(souls = 0)
|
||||
invisibility = 0
|
||||
maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#FF0000'>[souls]</font></div>"
|
||||
maptext = MAPTEXT("<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#FF0000'>[souls]</font></div>")
|
||||
switch(souls)
|
||||
if(0,null)
|
||||
icon_state = "Devil-1"
|
||||
@@ -103,7 +103,7 @@
|
||||
..()
|
||||
var/valuecolor = "#ff2525"
|
||||
if(owner.stat == DEAD)
|
||||
maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='[valuecolor]'>ERR-0F</font></div>"
|
||||
maptext = MAPTEXT("<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='[valuecolor]'>ERR-0F</font></div>")
|
||||
icon_state = "coolant-3-1"
|
||||
return
|
||||
var/coolant_efficiency
|
||||
@@ -123,7 +123,7 @@
|
||||
valuecolor = "#dd8109"
|
||||
else if(coolant > BLOOD_VOLUME_SURVIVE * owner.blood_ratio)
|
||||
valuecolor = "#e7520d"
|
||||
maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='[valuecolor]'>[round((coolant / (BLOOD_VOLUME_NORMAL * owner.blood_ratio)) * 100, 1)]</font></div>"
|
||||
maptext = MAPTEXT("<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='[valuecolor]'>[round((coolant / (BLOOD_VOLUME_NORMAL * owner.blood_ratio)) * 100, 1)]</font></div>")
|
||||
|
||||
var/efficiency_suffix
|
||||
var/state_suffix
|
||||
@@ -324,11 +324,11 @@
|
||||
using.hud = src
|
||||
hotkeybuttons += using
|
||||
|
||||
using = new /atom/movable/screen/rest()
|
||||
using.icon = ui_style
|
||||
using.screen_loc = ui_pull_resist
|
||||
using.hud = src
|
||||
static_inventory += using
|
||||
rest_icon = new /atom/movable/screen/rest()
|
||||
rest_icon.icon = ui_style
|
||||
rest_icon.screen_loc = ui_pull_resist
|
||||
rest_icon.hud = src
|
||||
static_inventory += rest_icon
|
||||
//END OF CIT CHANGES
|
||||
|
||||
using = new /atom/movable/screen/human/toggle()
|
||||
|
||||
@@ -9,9 +9,8 @@
|
||||
//Not tied to the grid, places it's center where the cursor is
|
||||
|
||||
/atom/movable/screen/movable
|
||||
mouse_drag_pointer = 'icons/effects/mouse_pointers/screen_drag.dmi'
|
||||
var/snap2grid = FALSE
|
||||
var/moved = FALSE
|
||||
var/locked = FALSE
|
||||
var/x_off = -16
|
||||
var/y_off = -16
|
||||
|
||||
@@ -21,35 +20,29 @@
|
||||
/atom/movable/screen/movable/snap
|
||||
snap2grid = TRUE
|
||||
|
||||
|
||||
/atom/movable/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params)
|
||||
if(locked) //no! I am locked! begone!
|
||||
var/position = mouse_params_to_position(params)
|
||||
if(!position)
|
||||
return
|
||||
var/list/PM = params2list(params)
|
||||
|
||||
screen_loc = position
|
||||
|
||||
/// Takes mouse parmas as input, returns a string representing the appropriate mouse position
|
||||
/atom/movable/screen/movable/proc/mouse_params_to_position(params)
|
||||
var/list/modifiers = params2list(params)
|
||||
|
||||
//No screen-loc information? abort.
|
||||
if(!PM || !PM["screen-loc"])
|
||||
if(!LAZYACCESS(modifiers, SCREEN_LOC))
|
||||
return
|
||||
|
||||
//Split screen-loc up into X+Pixel_X and Y+Pixel_Y
|
||||
var/list/screen_loc_params = splittext(PM["screen-loc"], ",")
|
||||
|
||||
//Split X+Pixel_X up into list(X, Pixel_X)
|
||||
var/list/screen_loc_X = splittext(screen_loc_params[1],":")
|
||||
|
||||
//Split Y+Pixel_Y up into list(Y, Pixel_Y)
|
||||
var/list/screen_loc_Y = splittext(screen_loc_params[2],":")
|
||||
|
||||
var/client/our_client = usr.client
|
||||
var/list/offset = screen_loc_to_offset(LAZYACCESS(modifiers, SCREEN_LOC))
|
||||
if(snap2grid) //Discard Pixel Values
|
||||
screen_loc = "[screen_loc_X[1]],[screen_loc_Y[1]]"
|
||||
|
||||
offset[1] = FLOOR(offset[1], world.icon_size) // drops any pixel offset
|
||||
offset[2] = FLOOR(offset[2], world.icon_size) // drops any pixel offset
|
||||
else //Normalise Pixel Values (So the object drops at the center of the mouse, not 16 pixels off)
|
||||
var/pix_X = text2num(screen_loc_X[2]) + x_off
|
||||
var/pix_Y = text2num(screen_loc_Y[2]) + y_off
|
||||
screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]"
|
||||
|
||||
moved = screen_loc
|
||||
|
||||
offset[1] += x_off
|
||||
offset[2] += y_off
|
||||
return offset_to_screen_loc(offset[1], offset[2], our_client?.view)
|
||||
|
||||
//Debug procs
|
||||
/client/proc/test_movable_UI()
|
||||
@@ -59,7 +52,7 @@
|
||||
var/atom/movable/screen/movable/M = new()
|
||||
M.name = "Movable UI Object"
|
||||
M.icon_state = "block"
|
||||
M.maptext = "Movable"
|
||||
M.maptext = MAPTEXT("Movable")
|
||||
M.maptext_width = 64
|
||||
|
||||
var/screen_l = input(usr,"Where on the screen? (Formatted as 'X,Y' e.g: '1,1' for bottom left)","Spawn Movable UI Object") as text
|
||||
@@ -78,7 +71,7 @@
|
||||
var/atom/movable/screen/movable/snap/S = new()
|
||||
S.name = "Snap UI Object"
|
||||
S.icon_state = "block"
|
||||
S.maptext = "Snap"
|
||||
S.maptext = MAPTEXT("Snap")
|
||||
S.maptext_width = 64
|
||||
|
||||
var/screen_l = input(usr,"Where on the screen? (Formatted as 'X,Y' e.g: '1,1' for bottom left)","Spawn Snap UI Object") as text
|
||||
|
||||
@@ -5,6 +5,12 @@
|
||||
///Whether the menu is currently on the client's screen or not
|
||||
var/menu_hud_status = TRUE
|
||||
|
||||
/datum/hud/new_player/New(mob/dead/new_player/owner)
|
||||
. = ..()
|
||||
if(!owner.age_verify())
|
||||
return
|
||||
populate_buttons(owner)
|
||||
|
||||
/datum/hud/new_player/proc/populate_buttons(mob/dead/new_player/owner)
|
||||
var/list/buttons = subtypesof(/atom/movable/screen/lobby)
|
||||
for(var/button_type in buttons)
|
||||
|
||||
@@ -261,7 +261,7 @@ GLOBAL_LIST_EMPTY(radial_menus)
|
||||
//Blank
|
||||
menu_holder = image(icon='icons/effects/effects.dmi',loc=anchor,icon_state="nothing",layer = ABOVE_HUD_LAYER)
|
||||
menu_holder.plane = ABOVE_HUD_PLANE
|
||||
menu_holder.appearance_flags |= KEEP_APART|NO_CLIENT_COLOR|RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM
|
||||
menu_holder.appearance_flags |= APPEARANCE_UI_IGNORE_ALPHA | KEEP_APART
|
||||
menu_holder.vis_contents += elements + close_button
|
||||
current_user.images += menu_holder
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
/atom/movable/screen/robot/Click()
|
||||
if(isobserver(usr))
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/atom/movable/screen/robot/module/Click()
|
||||
if(..())
|
||||
@@ -15,7 +15,7 @@
|
||||
var/mob/living/silicon/robot/R = usr
|
||||
if(R.module.type != /obj/item/robot_module)
|
||||
R.hud_used.toggle_show_robot_modules()
|
||||
return 1
|
||||
return TRUE
|
||||
R.pick_module()
|
||||
|
||||
/atom/movable/screen/robot/module1
|
||||
|
||||
@@ -62,12 +62,12 @@
|
||||
// At this point in client Click() code we have passed the 1/10 sec check and little else
|
||||
// We don't even know if it's a middle click
|
||||
if(usr.incapacitated())
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
if(ismob(usr))
|
||||
var/mob/M = usr
|
||||
M.swap_hand()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
// /atom/movable/screen/skills
|
||||
// name = "skills"
|
||||
@@ -154,9 +154,8 @@
|
||||
if(!icon_empty)
|
||||
icon_empty = icon_state
|
||||
|
||||
if(!hud?.mymob || !slot_id || !icon_full)
|
||||
return ..()
|
||||
icon_state = hud.mymob.get_item_by_slot(slot_id) ? icon_full : icon_empty
|
||||
if(hud?.mymob && slot_id && icon_full)
|
||||
icon_state = hud.mymob.get_item_by_slot(slot_id) ? icon_full : icon_empty
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/inventory/proc/add_overlays()
|
||||
@@ -207,7 +206,7 @@
|
||||
. += blocked_overlay
|
||||
|
||||
if(held_index == hud.mymob.active_hand_index)
|
||||
. += "hand_active"
|
||||
. += (held_index % 2) ? "lhandactive" : "rhandactive"
|
||||
|
||||
|
||||
/atom/movable/screen/inventory/hand/Click(location, control, params)
|
||||
@@ -411,6 +410,7 @@
|
||||
name = "rest"
|
||||
icon = 'icons/mob/screen_midnight.dmi'
|
||||
icon_state = "act_rest"
|
||||
base_icon_state = "act_rest"
|
||||
plane = HUD_PLANE
|
||||
|
||||
/atom/movable/screen/rest/Click()
|
||||
@@ -422,10 +422,7 @@
|
||||
var/mob/living/user = hud?.mymob
|
||||
if(!istype(user))
|
||||
return ..()
|
||||
if(!user.resting)
|
||||
icon_state = "act_rest"
|
||||
else
|
||||
icon_state = "act_rest0"
|
||||
icon_state = "[base_icon_state][user.resting ? 0 : null]"
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/throw_catch
|
||||
@@ -455,7 +452,7 @@
|
||||
var/icon_y = text2num(LAZYACCESS(modifiers, "icon-y"))
|
||||
var/choice = get_zone_at(icon_x, icon_y)
|
||||
if (!choice)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
return set_selected_zone(choice, usr)
|
||||
|
||||
|
||||
@@ -17,4 +17,4 @@
|
||||
SIGNAL_HANDLER
|
||||
if(!hud || !hud.mymob.client.view_size) //Might not have been initialized by now
|
||||
return
|
||||
maptext_width = getviewsize(hud.mymob.client.view_size.getView())[1] * world.icon_size
|
||||
maptext_width = view_to_pixels(hud.mymob.client.view_size.getView())[1]
|
||||
|
||||
@@ -236,7 +236,7 @@
|
||||
attack_message_local = "You [message_verb] yourself[message_hit_area] with [I]"
|
||||
visible_message("<span class='danger'>[attack_message]</span>",\
|
||||
"<span class='userdanger'>[attack_message_local]</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/// How much stamina this takes to swing this is not for realism purposes hecc off.
|
||||
/obj/item/proc/getweight(mob/living/user, multiplier = 1, trait = SKILL_STAMINA_COST)
|
||||
|
||||
@@ -24,7 +24,10 @@
|
||||
CtrlShiftClickOn(A)
|
||||
return
|
||||
if(modifiers["middle"])
|
||||
MiddleClickOn(A)
|
||||
if(modifiers["ctrl"])
|
||||
CtrlMiddleClickOn(A)
|
||||
else
|
||||
MiddleClickOn(A)
|
||||
return
|
||||
if(modifiers["shift"])
|
||||
ShiftClickOn(A)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
. = attackchain_flags
|
||||
// Special glove functions:
|
||||
// If the gloves do anything, have them return 1 to stop
|
||||
// If the gloves do anything, have them return TRUE to stop
|
||||
// normal attack_hand() here.
|
||||
var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines
|
||||
if(proximity && istype(G))
|
||||
@@ -99,7 +99,7 @@
|
||||
*/
|
||||
|
||||
/mob/living/carbon/RestrainedClickOn(atom/A)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/human/RangedAttack(atom/A, mouseparams)
|
||||
. = ..()
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
DelayNextAction(CLICK_CD_HANDCUFFED)
|
||||
return RestrainedClickOn(A)
|
||||
|
||||
if(in_throw_mode)
|
||||
if(throw_mode)
|
||||
throw_item(A)//todo: make it plausible to lightly toss items via right-click
|
||||
return
|
||||
|
||||
|
||||
@@ -24,13 +24,13 @@
|
||||
|
||||
/datum/atom_hud/data/human/medical/basic/proc/check_sensors(mob/living/carbon/human/H)
|
||||
if(!istype(H))
|
||||
return 0
|
||||
return FALSE
|
||||
var/obj/item/clothing/under/U = H.w_uniform
|
||||
if(!istype(U))
|
||||
return 0
|
||||
return FALSE
|
||||
if(U.sensor_mode <= SENSOR_VITALS)
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/atom_hud/data/human/medical/basic/add_to_single_hud(mob/M, mob/living/carbon/H)
|
||||
if(check_sensors(H))
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
* @code
|
||||
/hook/foo/proc/bar()
|
||||
if(1)
|
||||
return 1 //Sucessful
|
||||
return TRUE //Sucessful
|
||||
else
|
||||
return 0 //Error, or runtime.
|
||||
return FALSE //Error, or runtime.
|
||||
* @endcode
|
||||
* All hooks must return nonzero on success, as runtimes will force return null.
|
||||
*/
|
||||
|
||||
@@ -129,7 +129,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
|
||||
/proc/Recreate_MC()
|
||||
. = -1 //so if we runtime, things know we failed
|
||||
if (world.time < Master.restart_timeout)
|
||||
return 0
|
||||
return FALSE
|
||||
if (world.time < Master.restart_clear)
|
||||
Master.restart_count *= 0.5
|
||||
|
||||
@@ -142,7 +142,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
|
||||
new/datum/controller/master()
|
||||
catch
|
||||
return -1
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/controller/master/Recover()
|
||||
|
||||
@@ -48,7 +48,7 @@ SUBSYSTEM_DEF(activity)
|
||||
|
||||
/datum/controller/subsystem/activity/proc/get_average_threat()
|
||||
if(!length(threat_history))
|
||||
return 0
|
||||
return FALSE
|
||||
var/total_weight = 0
|
||||
var/total_amt = 0
|
||||
for(var/i in 1 to threat_history.len-1)
|
||||
|
||||
@@ -69,15 +69,15 @@ SUBSYSTEM_DEF(augury)
|
||||
SSaugury.watchers += owner
|
||||
to_chat(owner, "<span class='notice'>You are now auto-following debris.</span>")
|
||||
active = TRUE
|
||||
UpdateButtonIcon()
|
||||
UpdateButtons()
|
||||
|
||||
/datum/action/innate/augury/Deactivate()
|
||||
SSaugury.watchers -= owner
|
||||
to_chat(owner, "<span class='notice'>You are no longer auto-following debris.</span>")
|
||||
active = FALSE
|
||||
UpdateButtonIcon()
|
||||
UpdateButtons()
|
||||
|
||||
/datum/action/innate/augury/UpdateButtonIcon(status_only = FALSE, force)
|
||||
/datum/action/innate/augury/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force)
|
||||
..()
|
||||
if(active)
|
||||
button.icon_state = "template_active"
|
||||
|
||||
@@ -55,6 +55,6 @@ PROCESSING_SUBSYSTEM_DEF(dcs)
|
||||
fullid += "[key]"
|
||||
|
||||
if(length(named_arguments))
|
||||
named_arguments = sortList(named_arguments)
|
||||
named_arguments = sort_list(named_arguments)
|
||||
fullid += named_arguments
|
||||
return list2params(fullid)
|
||||
|
||||
@@ -47,7 +47,7 @@ SUBSYSTEM_DEF(job)
|
||||
var/list/all_jobs = subtypesof(/datum/job)
|
||||
if(!all_jobs.len)
|
||||
to_chat(world, "<span class='boldannounce'>Error setting up jobs, no job datums found</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
for(var/J in all_jobs)
|
||||
var/datum/job/job = new J()
|
||||
@@ -65,7 +65,7 @@ SUBSYSTEM_DEF(job)
|
||||
name_occupations[job.title] = job
|
||||
type_occupations[J] = job
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/controller/subsystem/job/proc/GetJob(rank)
|
||||
@@ -199,8 +199,8 @@ SUBSYSTEM_DEF(job)
|
||||
continue
|
||||
var/mob/dead/new_player/candidate = pick(candidates)
|
||||
if(AssignRole(candidate, command_position))
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
//This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level
|
||||
@@ -222,7 +222,7 @@ SUBSYSTEM_DEF(job)
|
||||
var/ai_selected = 0
|
||||
var/datum/job/job = GetJob("AI")
|
||||
if(!job)
|
||||
return 0
|
||||
return FALSE
|
||||
for(var/i = job.total_positions, i > 0, i--)
|
||||
for(var/level in level_order)
|
||||
var/list/candidates = list()
|
||||
@@ -233,8 +233,8 @@ SUBSYSTEM_DEF(job)
|
||||
ai_selected++
|
||||
break
|
||||
if(ai_selected)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/** Proc DivideOccupations
|
||||
@@ -599,8 +599,8 @@ SUBSYSTEM_DEF(job)
|
||||
if(hpc || epc)
|
||||
var/relevent_cap = max(hpc, epc)
|
||||
if((initial_players_to_assign - unassigned.len) >= relevent_cap)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/controller/subsystem/job/proc/RejectPlayer(mob/dead/new_player/player)
|
||||
if(player.mind && player.mind.special_role)
|
||||
|
||||
@@ -423,7 +423,7 @@ GLOBAL_LIST_EMPTY(the_station_areas)
|
||||
banned += generateMapList("[global.config.directory]/iceruinblacklist.txt")
|
||||
banned += generateMapList("[global.config.directory]/stationruinblacklist.txt")
|
||||
|
||||
for(var/item in sortList(subtypesof(/datum/map_template/ruin), GLOBAL_PROC_REF(cmp_ruincost_priority)))
|
||||
for(var/item in sort_list(subtypesof(/datum/map_template/ruin), GLOBAL_PROC_REF(cmp_ruincost_priority)))
|
||||
var/datum/map_template/ruin/ruin_type = item
|
||||
// screen out the abstract subtypes
|
||||
if(!initial(ruin_type.id))
|
||||
|
||||
@@ -36,7 +36,7 @@ SUBSYSTEM_DEF(pathfinder)
|
||||
flow[t] = M
|
||||
return free
|
||||
else
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/datum/flowcache/proc/toolong(l)
|
||||
log_game("Pathfinder route took longer than 150 ticks, src bot [flow[flow[l]]]")
|
||||
|
||||
@@ -22,7 +22,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
|
||||
|
||||
/datum/controller/subsystem/processing/quirks/proc/SetupQuirks()
|
||||
// Sort by Positive, Negative, Neutral; and then by name
|
||||
var/list/quirk_list = sortList(subtypesof(/datum/quirk), GLOBAL_PROC_REF(cmp_quirk_asc))
|
||||
var/list/quirk_list = sort_list(subtypesof(/datum/quirk), GLOBAL_PROC_REF(cmp_quirk_asc))
|
||||
|
||||
for(var/V in quirk_list)
|
||||
var/datum/quirk/T = V
|
||||
|
||||
@@ -25,7 +25,7 @@ SUBSYSTEM_DEF(radio)
|
||||
if(frequency)
|
||||
frequency.remove_listener(device)
|
||||
// let's don't delete frequencies in case a non-listener keeps a reference
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/datum/controller/subsystem/radio/proc/return_frequency(new_frequency as num)
|
||||
var/f_text = num2text(new_frequency)
|
||||
|
||||
@@ -358,7 +358,7 @@ SUBSYSTEM_DEF(research)
|
||||
/datum/controller/subsystem/research/proc/calculate_server_coefficient() //Diminishing returns.
|
||||
var/amt = servers.len
|
||||
if(!amt)
|
||||
return 0
|
||||
return FALSE
|
||||
var/coeff = 100
|
||||
coeff = sqrt(coeff / amt)
|
||||
return coeff
|
||||
|
||||
@@ -294,7 +294,7 @@ SUBSYSTEM_DEF(shuttle)
|
||||
log_shuttle("[key_name(user)] has recalled the shuttle.")
|
||||
message_admins("[ADMIN_LOOKUPFLW(user)] has recalled the shuttle.")
|
||||
deadchat_broadcast(" has recalled the shuttle from [span_name("[get_area_name(user, TRUE)]")].", span_name("[user.real_name]"), user, message_type=DEADCHAT_ANNOUNCEMENT)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/datum/controller/subsystem/shuttle/proc/canRecall()
|
||||
if(!emergency || emergency.mode != SHUTTLE_CALL || emergencyNoRecall || SSticker.mode.name == "meteor")
|
||||
@@ -400,7 +400,7 @@ SUBSYSTEM_DEF(shuttle)
|
||||
/datum/controller/subsystem/shuttle/proc/toggleShuttle(shuttleId, dockHome, dockAway, timed)
|
||||
var/obj/docking_port/mobile/M = getShuttle(shuttleId)
|
||||
if(!M)
|
||||
return 1
|
||||
return TRUE
|
||||
var/obj/docking_port/stationary/dockedAt = M.get_docked()
|
||||
var/destination = dockHome
|
||||
if(dockedAt && dockedAt.id == dockHome)
|
||||
@@ -411,7 +411,7 @@ SUBSYSTEM_DEF(shuttle)
|
||||
else
|
||||
if(M.initiate_docking(getDock(destination)) != DOCKING_SUCCESS)
|
||||
return 2
|
||||
return 0 //dock successful
|
||||
return FALSE //dock successful
|
||||
|
||||
|
||||
/datum/controller/subsystem/shuttle/proc/moveShuttle(shuttleId, dockId, timed)
|
||||
@@ -419,14 +419,14 @@ SUBSYSTEM_DEF(shuttle)
|
||||
var/obj/docking_port/stationary/D = getDock(dockId)
|
||||
|
||||
if(!M)
|
||||
return 1
|
||||
return TRUE
|
||||
if(timed)
|
||||
if(M.request(D))
|
||||
return 2
|
||||
else
|
||||
if(M.initiate_docking(D) != DOCKING_SUCCESS)
|
||||
return 2
|
||||
return 0 //dock successful
|
||||
return FALSE //dock successful
|
||||
|
||||
/datum/controller/subsystem/shuttle/proc/request_transit_dock(obj/docking_port/mobile/M)
|
||||
if(!istype(M))
|
||||
@@ -825,7 +825,7 @@ SUBSYSTEM_DEF(shuttle)
|
||||
|
||||
templates[S.port_id]["templates"] += list(L)
|
||||
|
||||
data["templates_tabs"] = sortList(data["templates_tabs"])
|
||||
data["templates_tabs"] = sort_list(data["templates_tabs"])
|
||||
|
||||
data["existing_shuttle"] = null
|
||||
|
||||
|
||||
@@ -41,37 +41,61 @@ SUBSYSTEM_DEF(throwing)
|
||||
currentrun = null
|
||||
|
||||
/datum/thrownthing
|
||||
///Defines the atom that has been thrown (Objects and Mobs, mostly.)
|
||||
var/atom/movable/thrownthing
|
||||
var/atom/target
|
||||
///Weakref to the original intended target of the throw, to prevent hardDels
|
||||
var/datum/weakref/initial_target
|
||||
///The turf that the target was on, if it's not a turf itself.
|
||||
var/turf/target_turf
|
||||
///If the target happens to be a carbon and that carbon has a body zone aimed at, this is carried on here.
|
||||
var/target_zone
|
||||
///The initial direction of the thrower of the thrownthing for building the trajectory of the throw.
|
||||
var/init_dir
|
||||
///The maximum number of turfs that the thrownthing will travel to reach it's target.
|
||||
var/maxrange
|
||||
///The speed of the projectile thrownthing being thrown.
|
||||
var/speed
|
||||
///If a mob is the one who has thrown the object, then it's moved here.
|
||||
var/mob/thrower
|
||||
///A variable that helps in describing objects thrown at an angle, if it should be moved diagonally first or last.
|
||||
var/diagonals_first
|
||||
var/dist_travelled = 0
|
||||
var/start_time
|
||||
var/dist_x
|
||||
var/dist_y
|
||||
var/dx
|
||||
var/dy
|
||||
var/force = MOVE_FORCE_DEFAULT
|
||||
var/gentle = FALSE
|
||||
///Set to TRUE if the throw is exclusively diagonal (45 Degree angle throws for example)
|
||||
var/pure_diagonal
|
||||
///Tracks how far a thrownthing has traveled mid-throw for the purposes of maxrange
|
||||
var/dist_travelled = 0
|
||||
///The start_time obtained via world.time for the purposes of tiles moved/tick.
|
||||
var/start_time
|
||||
///Distance to travel in the X axis/direction.
|
||||
var/dist_x
|
||||
///Distance to travel in the y axis/direction.
|
||||
var/dist_y
|
||||
///The Horizontal direction we're traveling (EAST or WEST)
|
||||
var/dx
|
||||
///The VERTICAL direction we're traveling (NORTH or SOUTH)
|
||||
var/dy
|
||||
///The movement force provided to a given object in transit. More info on these in move_force.dm
|
||||
var/force = MOVE_FORCE_DEFAULT
|
||||
///If the throw is gentle, then the thrownthing is harmless on impact.
|
||||
var/gentle = FALSE
|
||||
///How many tiles that need to be moved in order to travel to the target.
|
||||
var/diagonal_error
|
||||
///If a thrown thing has a callback, it can be invoked here within thrownthing.
|
||||
var/datum/callback/callback
|
||||
///Mainly exists for things that would freeze a thrown object in place, like a timestop'd tile. Or a Tractor Beam.
|
||||
var/paused = FALSE
|
||||
///How long an object has been paused for, to be added to the travel time.
|
||||
var/delayed_time = 0
|
||||
///The last world.time value stored when the thrownthing was moving.
|
||||
var/last_move = 0
|
||||
|
||||
|
||||
/datum/thrownthing/New(thrownthing, target, target_turf, init_dir, maxrange, speed, thrower, diagonals_first, force, gentle, callback, target_zone)
|
||||
/datum/thrownthing/New(thrownthing, target, init_dir, maxrange, speed, thrower, diagonals_first, force, gentle, callback, target_zone)
|
||||
. = ..()
|
||||
src.thrownthing = thrownthing
|
||||
RegisterSignal(thrownthing, COMSIG_PARENT_QDELETING, PROC_REF(on_thrownthing_qdel))
|
||||
src.target = target
|
||||
src.target_turf = target_turf
|
||||
src.target_turf = get_turf(target)
|
||||
if(target_turf != target)
|
||||
src.initial_target = WEAKREF(target)
|
||||
src.init_dir = init_dir
|
||||
src.maxrange = maxrange
|
||||
src.speed = speed
|
||||
@@ -90,8 +114,8 @@ SUBSYSTEM_DEF(throwing)
|
||||
SSthrowing.currentrun -= thrownthing
|
||||
thrownthing.throwing = null
|
||||
thrownthing = null
|
||||
target = null
|
||||
thrower = null
|
||||
initial_target = null
|
||||
if(callback)
|
||||
QDEL_NULL(callback) //It stores a reference to the thrownthing, its source. Let's clean that.
|
||||
return ..()
|
||||
@@ -114,9 +138,17 @@ SUBSYSTEM_DEF(throwing)
|
||||
delayed_time += world.time - last_move
|
||||
return
|
||||
|
||||
if (dist_travelled && hitcheck()) //to catch sneaky things moving on our tile while we slept
|
||||
finalize()
|
||||
return
|
||||
var/atom/movable/actual_target = initial_target?.resolve()
|
||||
|
||||
if(dist_travelled) //to catch sneaky things moving on our tile while we slept
|
||||
for(var/atom/movable/obstacle as anything in get_turf(thrownthing))
|
||||
if (obstacle == thrownthing || (obstacle == thrower && !ismob(thrownthing)))
|
||||
continue
|
||||
if(obstacle.pass_flags_self & LETPASSTHROW)
|
||||
continue
|
||||
if (obstacle == actual_target || (obstacle.density && !(obstacle.flags_1 & ON_BORDER_1)))
|
||||
finalize(TRUE, obstacle)
|
||||
return
|
||||
|
||||
var/atom/step
|
||||
|
||||
@@ -143,14 +175,17 @@ SUBSYSTEM_DEF(throwing)
|
||||
finalize()
|
||||
return
|
||||
|
||||
AM.Move(step, get_dir(AM, step), DELAY_TO_GLIDE_SIZE(1 / speed))
|
||||
|
||||
if (!AM.throwing) // we hit something during our move
|
||||
finalize(hit = TRUE)
|
||||
if(!AM.Move(step, get_dir(AM, step), DELAY_TO_GLIDE_SIZE(1 / speed))) // we hit something during our move...
|
||||
if(AM.throwing) // ...but finalize() wasn't called on Bump() because of a higher level definition that doesn't always call parent.
|
||||
finalize()
|
||||
return
|
||||
|
||||
dist_travelled++
|
||||
|
||||
if(actual_target && !(actual_target.pass_flags_self & LETPASSTHROW) && actual_target.loc == AM.loc) // we crossed a movable with no density (e.g. a mouse or APC) we intend to hit anyway.
|
||||
finalize(TRUE, actual_target)
|
||||
return
|
||||
|
||||
if (dist_travelled > MAX_THROWING_DIST)
|
||||
finalize()
|
||||
return
|
||||
@@ -162,11 +197,10 @@ SUBSYSTEM_DEF(throwing)
|
||||
return
|
||||
thrownthing.throwing = null
|
||||
if (!hit)
|
||||
for (var/thing in get_turf(thrownthing)) //looking for our target on the turf we land on.
|
||||
var/atom/A = thing
|
||||
if (A == target)
|
||||
for (var/atom/movable/obstacle as anything in get_turf(thrownthing)) //looking for our target on the turf we land on.
|
||||
if (obstacle == target)
|
||||
hit = TRUE
|
||||
thrownthing.throw_impact(A, src)
|
||||
thrownthing.throw_impact(obstacle, src)
|
||||
if(QDELETED(thrownthing)) //throw_impact can delete things, such as glasses smashing
|
||||
return //deletion should already be handled by on_thrownthing_qdel()
|
||||
break
|
||||
@@ -192,15 +226,3 @@ SUBSYSTEM_DEF(throwing)
|
||||
T.zFall(thrownthing)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/datum/thrownthing/proc/hit_atom(atom/A)
|
||||
finalize(hit=TRUE, target=A)
|
||||
|
||||
/datum/thrownthing/proc/hitcheck()
|
||||
for (var/thing in get_turf(thrownthing))
|
||||
var/atom/movable/AM = thing
|
||||
if (AM == thrownthing || (AM == thrower && !ismob(thrownthing)))
|
||||
continue
|
||||
if (AM.density && !(AM.pass_flags_self & LETPASSTHROW) && !(AM.flags_1 & ON_BORDER_1))
|
||||
finalize(hit=TRUE, target=AM)
|
||||
return TRUE
|
||||
|
||||
@@ -245,7 +245,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
mode = null
|
||||
SSjob.ResetOccupations()
|
||||
emergency_swap++
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
CHECK_TICK
|
||||
//Configure mode and assign player to special mode stuff
|
||||
@@ -264,7 +264,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
to_chat(world, "<B>Error setting up [GLOB.master_mode].</B> Reverting to pre-game lobby.")
|
||||
SSjob.ResetOccupations()
|
||||
emergency_swap++
|
||||
return 0
|
||||
return FALSE
|
||||
else
|
||||
message_admins("<span class='notice'>DEBUG: Bypassing prestart checks...</span>")
|
||||
|
||||
@@ -273,7 +273,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
var/list/modes = new
|
||||
for (var/datum/game_mode/M in runnable_modes)
|
||||
modes += M.name
|
||||
modes = sortList(modes)
|
||||
modes = sort_list(modes)
|
||||
to_chat(world, "<b>The gamemode is: secret!\nPossibilities:</B> [english_list(modes)]")
|
||||
else
|
||||
mode.announce()*/
|
||||
|
||||
@@ -100,7 +100,7 @@ SUBSYSTEM_DEF(traumas)
|
||||
/obj/item/clothing/suit/space/hardsuit/ert/engi, /obj/item/clothing/suit/space/hardsuit/ert/med,
|
||||
/obj/item/clothing/suit/space/hardsuit/deathsquad, /obj/item/clothing/head/helmet/space/hardsuit/deathsquad,
|
||||
/obj/machinery/door/airlock/centcom)),
|
||||
"robots" = typecacheof(list(/obj/machinery/computer/upload, /obj/item/aiModule/, /obj/machinery/recharge_station,
|
||||
"robots" = typecacheof(list(/obj/machinery/computer/upload, /obj/item/ai_module/, /obj/machinery/recharge_station,
|
||||
/obj/item/aicard, /obj/item/deactivated_swarmer, /obj/effect/mob_spawn/swarmer)),
|
||||
|
||||
"doctors" = typecacheof(list(/obj/item/clothing/under/rank/medical/doctor, /obj/item/clothing/under/rank/medical/chemist,
|
||||
@@ -170,7 +170,7 @@ SUBSYSTEM_DEF(traumas)
|
||||
/obj/item/gun/ballistic/automatic/shotgun/bulldog, /obj/item/gun/ballistic/automatic/c20r, /obj/item/gun/ballistic/automatic/m90, /obj/item/gun/ballistic/automatic/l6_saw, /obj/item/storage/belt/grenade/full, /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate, /obj/item/gun/energy/kinetic_accelerator/crossbow,
|
||||
/obj/item/melee/transforming/energy/sword/saber, /obj/item/dualsaber, /obj/item/melee/powerfist, /obj/item/storage/box/syndie_kit, /obj/item/grenade/spawnergrenade/manhacks, /obj/item/grenade/chem_grenade/bioterrorfoam, /obj/item/reagent_containers/spray/chemsprayer/bioterror, /obj/item/ammo_box/magazine/m10mm,
|
||||
/obj/item/ammo_box/magazine/pistolm9mm, /obj/item/ammo_box/a357, /obj/item/ammo_box/magazine/m12g, /obj/item/ammo_box/magazine/mm712x82, /obj/item/antag_spawner/nuke_ops, /obj/vehicle/sealed/mecha/combat/gygax/dark, /obj/vehicle/sealed/mecha/combat/marauder/mauler, /obj/item/soap/syndie, /obj/item/gun/syringe/syndicate, /obj/item/cartridge/virus/syndicate,
|
||||
/obj/item/cartridge/virus/frame, /obj/item/chameleon, /obj/item/storage/box/syndie_kit/cutouts, /obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/card/emag, /obj/item/storage/toolbox/syndicate, /obj/item/storage/book/bible/syndicate, /obj/item/encryptionkey/binary, /obj/item/encryptionkey/syndicate, /obj/item/aiModule/syndicate,
|
||||
/obj/item/cartridge/virus/frame, /obj/item/chameleon, /obj/item/storage/box/syndie_kit/cutouts, /obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/card/emag, /obj/item/storage/toolbox/syndicate, /obj/item/storage/book/bible/syndicate, /obj/item/encryptionkey/binary, /obj/item/encryptionkey/syndicate, /obj/item/ai_module/syndicate,
|
||||
/obj/item/clothing/shoes/magboots/syndie, /obj/item/powersink, /obj/item/sbeacondrop, /obj/item/sbeacondrop/bomb, /obj/item/syndicatedetonator, /obj/item/shield/energy, /obj/item/assault_pod, /obj/item/slimepotion/slime/sentience/nuclear, /obj/item/stack/telecrystal, /obj/item/jammer, /obj/item/codespeak_manual/unlimited,
|
||||
/obj/item/toy/cards/deck/syndicate, /obj/item/storage/secure/briefcase/syndie, /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/toy/syndicateballoon, /obj/item/clothing/gloves/fingerless/pugilist/rapid, /obj/item/paper/fluff/ruins/thederelict/syndie_mission, /obj/item/organ/cyberimp/eyes/hud/security/syndicate, /obj/item/clothing/head/HoS/syndicate,
|
||||
/obj/machinery/computer/pod/old/syndicate, /obj/machinery/vending/medical/syndicate_access, /obj/item/mmi/syndie, /obj/item/target/syndicate, /obj/machinery/vending/cigarette/syndicate, /obj/item/robot_module/syndicate, /obj/item/clothing/mask/gas/syndicate, /obj/machinery/power/singularity_beacon/syndicate, /obj/item/clothing/head/syndicatefake,
|
||||
|
||||
@@ -373,7 +373,7 @@ SUBSYSTEM_DEF(vote)
|
||||
/datum/controller/subsystem/vote/proc/submit_vote(vote, score = 0)
|
||||
if(mode)
|
||||
if(CONFIG_GET(flag/no_dead_vote) && usr.stat == DEAD && !usr.client.holder)
|
||||
return 0
|
||||
return FALSE
|
||||
if(vote && ISINRANGE(vote, 1, choices.len))
|
||||
switch(vote_system)
|
||||
if(PLURALITY_VOTING)
|
||||
@@ -415,7 +415,7 @@ SUBSYSTEM_DEF(vote)
|
||||
voted[usr.ckey] = list()
|
||||
voted[usr.ckey][choices[vote]] = score
|
||||
saved -= usr.ckey
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key, display = display_votes, votesystem = PLURALITY_VOTING, forced = FALSE,vote_time = -1)//CIT CHANGE - adds display argument to votes to allow for obfuscated votes
|
||||
vote_system = votesystem
|
||||
@@ -424,7 +424,7 @@ SUBSYSTEM_DEF(vote)
|
||||
var/next_allowed_time = (started_time + CONFIG_GET(number/vote_delay))
|
||||
if(mode)
|
||||
to_chat(usr, "<span class='warning'>There is already a vote in progress! please wait for it to finish.</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/admin = FALSE
|
||||
var/ckey = ckey(initiator_key)
|
||||
@@ -433,7 +433,7 @@ SUBSYSTEM_DEF(vote)
|
||||
|
||||
if(next_allowed_time > world.time && !admin)
|
||||
to_chat(usr, "<span class='warning'>A vote was initiated recently, you must wait [DisplayTimeText(next_allowed_time-world.time)] before a new vote can be started!</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
SEND_SOUND(world, sound('sound/misc/notice2.ogg'))
|
||||
reset()
|
||||
@@ -464,7 +464,7 @@ SUBSYSTEM_DEF(vote)
|
||||
if("custom")
|
||||
question = stripped_input(usr,"What is the vote for?")
|
||||
if(!question)
|
||||
return 0
|
||||
return FALSE
|
||||
var/system_string = input(usr,"Which voting type?",GLOB.vote_type_names[1]) in GLOB.vote_type_names
|
||||
vote_system = GLOB.vote_type_names[system_string]
|
||||
for(var/i=1,i<=10,i++)
|
||||
@@ -488,7 +488,7 @@ SUBSYSTEM_DEF(vote)
|
||||
toggles ^= choices[chosen]
|
||||
display_votes = toggles
|
||||
else
|
||||
return 0
|
||||
return FALSE
|
||||
mode = vote_type
|
||||
initiator = initiator_key ? initiator_key : "the Server" // austation -- Crew autotransfer vote
|
||||
started_time = world.time
|
||||
@@ -521,8 +521,8 @@ SUBSYSTEM_DEF(vote)
|
||||
popup.set_window_options("can_close=0")
|
||||
popup.set_content(SSvote.interface(C))
|
||||
popup.open(0)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/controller/subsystem/vote/proc/interface(client/C)
|
||||
if(!C)
|
||||
@@ -736,7 +736,7 @@ SUBSYSTEM_DEF(vote)
|
||||
Remove(owner)
|
||||
|
||||
/datum/action/vote/IsAvailable(silent = FALSE)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/datum/action/vote/proc/remove_from_client()
|
||||
if(!owner)
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
)
|
||||
if(!Q.Execute(async = TRUE))
|
||||
qdel(Q)
|
||||
return 0
|
||||
return FALSE
|
||||
var/result = 0
|
||||
if(Q.NextRow())
|
||||
result = text2num(Q.item[1])
|
||||
|
||||
+241
-123
@@ -11,11 +11,10 @@
|
||||
var/check_flags = 0
|
||||
var/required_mobility_flags = MOBILITY_USE
|
||||
var/processing = FALSE
|
||||
var/atom/movable/screen/movable/action_button/button = null
|
||||
var/buttontooltipstyle = ""
|
||||
var/transparent_when_unavailable = TRUE
|
||||
var/use_target_appearance = FALSE
|
||||
var/list/target_appearance_matrix //if set, will be used to transform the target button appearance as an arglist.
|
||||
/// Where any buttons we create should be by default. Accepts screen_loc and location defines
|
||||
var/default_button_position = SCRN_OBJ_IN_LIST
|
||||
|
||||
var/button_icon = 'icons/mob/actions/backgrounds.dmi' //This is the file for the BACKGROUND icon
|
||||
var/background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND //And this is the state for the background icon
|
||||
@@ -28,12 +27,6 @@
|
||||
|
||||
/datum/action/New(Target)
|
||||
link_to(Target)
|
||||
button = new
|
||||
button.linked_action = src
|
||||
button.name = name
|
||||
button.actiontooltipstyle = buttontooltipstyle
|
||||
if(desc)
|
||||
button.desc = desc
|
||||
|
||||
/datum/action/proc/link_to(Target)
|
||||
target = Target
|
||||
@@ -43,51 +36,42 @@
|
||||
if(owner)
|
||||
Remove(owner)
|
||||
target = null
|
||||
QDEL_NULL(button)
|
||||
QDEL_LIST_ASSOC_VAL(viewers) // Qdel the buttons in the viewers list **NOT THE HUDS**
|
||||
return ..()
|
||||
|
||||
/datum/action/proc/Grant(mob/M)
|
||||
if(M)
|
||||
if(owner)
|
||||
if(owner == M)
|
||||
return
|
||||
Remove(owner)
|
||||
owner = M
|
||||
|
||||
//button id generation
|
||||
var/counter = 0
|
||||
var/bitfield = 0
|
||||
for(var/datum/action/A in M.actions)
|
||||
if(A.name == name && A.button.id)
|
||||
counter += 1
|
||||
bitfield |= A.button.id
|
||||
bitfield = ~bitfield
|
||||
var/bitflag = 1
|
||||
for(var/i in 1 to (counter + 1))
|
||||
if(bitfield & bitflag)
|
||||
button.id = bitflag
|
||||
break
|
||||
bitflag *= 2
|
||||
|
||||
M.actions += src
|
||||
if(M.client)
|
||||
M.client.screen += button
|
||||
button.locked = M.client.prefs.buttons_locked || button.id ? M.client.prefs.action_buttons_screen_locs["[name]_[button.id]"] : FALSE //even if it's not defaultly locked we should remember we locked it before
|
||||
button.moved = button.id ? M.client.prefs.action_buttons_screen_locs["[name]_[button.id]"] : FALSE
|
||||
M.update_action_buttons()
|
||||
else
|
||||
if(!M)
|
||||
Remove(owner)
|
||||
return
|
||||
if(owner)
|
||||
if(owner == M)
|
||||
return
|
||||
Remove(owner)
|
||||
owner = M
|
||||
RegisterSignal(owner, COMSIG_PARENT_QDELETING, .proc/clear_ref, override = TRUE)
|
||||
|
||||
GiveAction(M)
|
||||
|
||||
/datum/action/proc/clear_ref(datum/ref)
|
||||
SIGNAL_HANDLER
|
||||
if(ref == owner)
|
||||
Remove(owner)
|
||||
if(ref == target)
|
||||
qdel(src)
|
||||
|
||||
/datum/action/proc/Remove(mob/M)
|
||||
if(M)
|
||||
if(M.client)
|
||||
M.client.screen -= button
|
||||
M.actions -= src
|
||||
M.update_action_buttons()
|
||||
owner = null
|
||||
button.moved = FALSE //so the button appears in its normal position when given to another owner.
|
||||
button.locked = FALSE
|
||||
button.id = null
|
||||
for(var/datum/hud/hud in viewers)
|
||||
if(!hud.mymob)
|
||||
continue
|
||||
HideFrom(hud.mymob)
|
||||
LAZYREMOVE(M.actions, src) // We aren't always properly inserted into the viewers list, gotta make sure that action's cleared
|
||||
viewers = list()
|
||||
|
||||
if(owner)
|
||||
UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
|
||||
if(target == owner)
|
||||
RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/clear_ref)
|
||||
owner = null
|
||||
|
||||
/datum/action/proc/Trigger()
|
||||
if(!IsAvailable())
|
||||
@@ -125,15 +109,15 @@
|
||||
/datum/action/proc/UpdateButtons(status_only, force)
|
||||
for(var/datum/hud/hud in viewers)
|
||||
var/atom/movable/screen/movable/button = viewers[hud]
|
||||
UpdateButtonIcon(button, status_only, force)
|
||||
UpdateButton(button, status_only, force)
|
||||
|
||||
/datum/action/proc/UpdateButtonIcon(status_only = FALSE, force = FALSE)
|
||||
/datum/action/proc/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE)
|
||||
if(!button)
|
||||
return
|
||||
if(!status_only)
|
||||
button.name = name
|
||||
button.desc = desc
|
||||
if(owner && owner.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND)
|
||||
if(owner?.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND)
|
||||
var/list/settings = owner.hud_used.get_action_buttons_icons()
|
||||
if(button.icon != settings["bg_icon"])
|
||||
button.icon = settings["bg_icon"]
|
||||
@@ -145,25 +129,13 @@
|
||||
if(button.icon_state != background_icon_state)
|
||||
button.icon_state = background_icon_state
|
||||
|
||||
if(!use_target_appearance)
|
||||
ApplyIcon(button, force)
|
||||
|
||||
else if(target && button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid.
|
||||
var/mutable_appearance/M = new(target)
|
||||
M.layer = FLOAT_LAYER
|
||||
M.plane = FLOAT_PLANE
|
||||
if(target_appearance_matrix)
|
||||
var/list/L = target_appearance_matrix
|
||||
M.transform = matrix(L[1], L[2], L[3], L[4], L[5], L[6])
|
||||
button.cut_overlays()
|
||||
button.add_overlay(M)
|
||||
button.appearance_cache = target.appearance
|
||||
ApplyIcon(button, force)
|
||||
|
||||
if(!IsAvailable(TRUE))
|
||||
button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0)
|
||||
else
|
||||
button.color = rgb(255,255,255,255)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/datum/action/proc/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force = FALSE)
|
||||
if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force))
|
||||
@@ -179,25 +151,82 @@
|
||||
|
||||
/datum/action/ghost/Trigger()
|
||||
if(!..())
|
||||
return 0
|
||||
return FALSE
|
||||
var/mob/M = target
|
||||
M.ghostize(can_reenter_corpse = TRUE, voluntary = TRUE)
|
||||
|
||||
/datum/action/proc/OnUpdatedIcon()
|
||||
addtimer(CALLBACK(src, PROC_REF(UpdateButtonIcon)), 1) //Hopefully runs after new icon overlays have been compiled.
|
||||
SIGNAL_HANDLER
|
||||
UpdateButtons(force = TRUE)
|
||||
|
||||
//Give our action button to the player
|
||||
/datum/action/proc/GiveAction(mob/viewer)
|
||||
var/datum/hud/our_hud = viewer.hud_used
|
||||
if(viewers[our_hud]) // Already have a copy of us? go away
|
||||
return
|
||||
|
||||
LAZYOR(viewer.actions, src) // Move this in
|
||||
ShowTo(viewer)
|
||||
|
||||
//Adds our action button to the screen of a player
|
||||
/datum/action/proc/ShowTo(mob/viewer)
|
||||
var/datum/hud/our_hud = viewer.hud_used
|
||||
if(!our_hud || viewers[our_hud]) // There's no point in this if you have no hud in the first place
|
||||
return
|
||||
|
||||
var/atom/movable/screen/movable/action_button/button = CreateButton()
|
||||
SetId(button, viewer)
|
||||
|
||||
button.our_hud = our_hud
|
||||
viewers[our_hud] = button
|
||||
if(viewer.client)
|
||||
viewer.client.screen += button
|
||||
|
||||
button.load_position(viewer)
|
||||
viewer.update_action_buttons()
|
||||
|
||||
//Removes our action button from the screen of a player
|
||||
/datum/action/proc/HideFrom(mob/viewer)
|
||||
var/datum/hud/our_hud = viewer.hud_used
|
||||
var/atom/movable/screen/movable/action_button/button = viewers[our_hud]
|
||||
LAZYREMOVE(viewer.actions, src)
|
||||
if(button)
|
||||
qdel(button)
|
||||
|
||||
/datum/action/proc/CreateButton()
|
||||
var/atom/movable/screen/movable/action_button/button = new()
|
||||
button.linked_action = src
|
||||
button.actiontooltipstyle = buttontooltipstyle
|
||||
if(desc)
|
||||
button.desc = desc
|
||||
return button
|
||||
|
||||
/datum/action/proc/SetId(atom/movable/screen/movable/action_button/our_button, mob/owner)
|
||||
//button id generation
|
||||
var/bitfield = 0
|
||||
for(var/datum/action/action in owner.actions)
|
||||
if(action == src) // This could be us, which is dumb
|
||||
continue
|
||||
var/atom/movable/screen/movable/action_button/button = action.viewers[owner.hud_used]
|
||||
if(action.name == name && button.id)
|
||||
bitfield |= button.id
|
||||
|
||||
bitfield = ~bitfield // Flip our possible ids, so we can check if we've found a unique one
|
||||
for(var/i in 0 to 23) // We get 24 possible bitflags in dm
|
||||
var/bitflag = 1 << i // Shift us over one
|
||||
if(bitfield & bitflag)
|
||||
our_button.id = bitflag
|
||||
return
|
||||
|
||||
//Presets for item actions
|
||||
/datum/action/item_action
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_LYING|AB_CHECK_CONSCIOUS
|
||||
button_icon_state = null
|
||||
use_target_appearance = TRUE
|
||||
// If you want to override the normal icon being the item
|
||||
// then change this to an icon state
|
||||
|
||||
/datum/action/item_action/New(Target)
|
||||
..()
|
||||
if(button_icon_state)
|
||||
use_target_appearance = FALSE
|
||||
var/obj/item/I = target
|
||||
LAZYINITLIST(I.actions)
|
||||
I.actions += src
|
||||
@@ -208,17 +237,41 @@
|
||||
UNSETEMPTY(I.actions)
|
||||
return ..()
|
||||
|
||||
/datum/action/item_action/Trigger()
|
||||
if(!..())
|
||||
return 0
|
||||
/datum/action/item_action/Trigger(trigger_flags)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
if(target)
|
||||
var/obj/item/I = target
|
||||
I.ui_action_click(owner, src)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/datum/action/item_action/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force)
|
||||
var/obj/item/item_target = target
|
||||
if(button_icon && button_icon_state)
|
||||
// If set, use the custom icon that we set instead
|
||||
// of the item appearence
|
||||
..()
|
||||
else if((target && current_button.appearance_cache != item_target.appearance) || force) //replace with /ref comparison if this is not valid.
|
||||
var/old_layer = item_target.layer
|
||||
var/old_plane = item_target.plane
|
||||
item_target.layer = FLOAT_LAYER //AAAH
|
||||
item_target.plane = FLOAT_PLANE //^ what that guy said
|
||||
current_button.filters = null
|
||||
current_button.cut_overlays()
|
||||
current_button.add_overlay(item_target)
|
||||
item_target.layer = old_layer
|
||||
item_target.plane = old_plane
|
||||
current_button.appearance_cache = item_target.appearance
|
||||
|
||||
/datum/action/item_action/toggle_light
|
||||
name = "Toggle Light"
|
||||
|
||||
/datum/action/item_action/toggle_light/pda/Trigger(trigger_flags)
|
||||
if(istype(target, /obj/item/pda))
|
||||
var/obj/item/pda/P = target
|
||||
return P.toggle_light(owner)
|
||||
|
||||
/datum/action/item_action/toggle_hood
|
||||
name = "Toggle Hood"
|
||||
|
||||
@@ -258,12 +311,14 @@
|
||||
/datum/action/item_action/set_internals
|
||||
name = "Set Internals"
|
||||
|
||||
/datum/action/item_action/set_internals/UpdateButtonIcon(status_only = FALSE, force)
|
||||
if(..()) //button available
|
||||
if(iscarbon(owner))
|
||||
var/mob/living/carbon/C = owner
|
||||
if(target == C.internal)
|
||||
button.icon_state = "template_active"
|
||||
/datum/action/item_action/set_internals/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force)
|
||||
if(!..()) // no button available
|
||||
return
|
||||
if(!iscarbon(owner))
|
||||
return
|
||||
var/mob/living/carbon/C = owner
|
||||
if(target == C.internal)
|
||||
button.icon_state = "template_active"
|
||||
|
||||
/datum/action/item_action/pick_color
|
||||
name = "Choose A Color"
|
||||
@@ -309,9 +364,9 @@
|
||||
|
||||
/datum/action/item_action/toggle_unfriendly_fire/Trigger()
|
||||
if(..())
|
||||
UpdateButtonIcon()
|
||||
UpdateButtons()
|
||||
|
||||
/datum/action/item_action/toggle_unfriendly_fire/UpdateButtonIcon(status_only = FALSE, force)
|
||||
/datum/action/item_action/toggle_unfriendly_fire/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force)
|
||||
if(istype(target, /obj/item/hierophant_club))
|
||||
var/obj/item/hierophant_club/H = target
|
||||
if(H.friendly_fire_check)
|
||||
@@ -332,7 +387,7 @@
|
||||
if(istype(target, /obj/item/hierophant_club))
|
||||
var/obj/item/hierophant_club/H = target
|
||||
if(H.teleporting)
|
||||
return 0
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/action/item_action/clock
|
||||
@@ -342,7 +397,7 @@
|
||||
|
||||
/datum/action/item_action/clock/IsAvailable(silent = FALSE)
|
||||
if(!is_servant_of_ratvar(owner))
|
||||
return 0
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/action/item_action/clock/toggle_visor
|
||||
@@ -351,11 +406,11 @@
|
||||
|
||||
/datum/action/item_action/clock/toggle_visor/IsAvailable(silent = FALSE)
|
||||
if(!is_servant_of_ratvar(owner))
|
||||
return 0
|
||||
return FALSE
|
||||
if(istype(target, /obj/item/clothing/glasses/judicial_visor))
|
||||
var/obj/item/clothing/glasses/judicial_visor/V = target
|
||||
if(V.recharging)
|
||||
return 0
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/action/item_action/clock/hierophant
|
||||
@@ -366,7 +421,6 @@
|
||||
/datum/action/item_action/clock/quickbind
|
||||
name = "Quickbind"
|
||||
desc = "If you're seeing this, file a bug report."
|
||||
use_target_appearance = FALSE
|
||||
var/scripture_index = 0 //the index of the scripture we're associated with
|
||||
|
||||
/datum/action/item_action/toggle_helmet_flashlight
|
||||
@@ -380,7 +434,6 @@
|
||||
/datum/action/item_action/toggle/New(Target)
|
||||
..()
|
||||
name = "Toggle [target.name]"
|
||||
button.name = name
|
||||
|
||||
/datum/action/item_action/halt
|
||||
name = "HALT!"
|
||||
@@ -409,7 +462,6 @@
|
||||
/datum/action/item_action/adjust/New(Target)
|
||||
..()
|
||||
name = "Adjust [target.name]"
|
||||
button.name = name
|
||||
|
||||
/datum/action/item_action/switch_hud
|
||||
name = "Switch HUD"
|
||||
@@ -432,7 +484,7 @@
|
||||
/datum/action/item_action/jetpack_stabilization/IsAvailable(silent = FALSE)
|
||||
var/obj/item/tank/jetpack/J = target
|
||||
if(!istype(J) || !J.on)
|
||||
return 0
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/action/item_action/hands_free
|
||||
@@ -464,7 +516,7 @@
|
||||
else
|
||||
owner.research_scanner--
|
||||
to_chat(owner, "<span class='notice'>[target] research scanner has been [active ? "activated" : "deactivated"].</span>")
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/datum/action/item_action/toggle_research_scanner/Remove(mob/M)
|
||||
if(owner && active)
|
||||
@@ -489,18 +541,16 @@
|
||||
/datum/action/item_action/organ_action/IsAvailable(silent = FALSE)
|
||||
var/obj/item/organ/I = target
|
||||
if(!I.owner)
|
||||
return 0
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/action/item_action/organ_action/toggle/New(Target)
|
||||
..()
|
||||
name = "Toggle [target.name]"
|
||||
button.name = name
|
||||
|
||||
/datum/action/item_action/organ_action/use/New(Target)
|
||||
..()
|
||||
name = "Use [target.name]"
|
||||
button.name = name
|
||||
|
||||
/datum/action/item_action/cult_dagger
|
||||
name = "Draw Blood Rune"
|
||||
@@ -509,14 +559,13 @@
|
||||
button_icon_state = "draw"
|
||||
buttontooltipstyle = "cult"
|
||||
background_icon_state = "bg_demon"
|
||||
default_button_position = "6:157,4:-2"
|
||||
|
||||
/datum/action/item_action/cult_dagger/Grant(mob/M)
|
||||
if(iscultist(M))
|
||||
..()
|
||||
button.screen_loc = "6:157,4:-2"
|
||||
button.moved = "6:157,4:-2"
|
||||
else
|
||||
if(!iscultist(M))
|
||||
Remove(owner)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/datum/action/item_action/cult_dagger/Trigger()
|
||||
for(var/obj/item/H in owner.held_items) //In case we were already holding another dagger
|
||||
@@ -643,7 +692,6 @@
|
||||
icon_icon = S.action_icon
|
||||
button_icon_state = S.action_icon_state
|
||||
background_icon_state = S.action_background_icon_state
|
||||
button.name = name
|
||||
|
||||
/datum/action/spell_action/Destroy()
|
||||
var/obj/effect/proc_holder/S = target
|
||||
@@ -693,12 +741,12 @@
|
||||
|
||||
/datum/action/innate/Trigger()
|
||||
if(!..())
|
||||
return 0
|
||||
return FALSE
|
||||
if(!active)
|
||||
Activate()
|
||||
else
|
||||
Deactivate()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/datum/action/innate/proc/Activate()
|
||||
return
|
||||
@@ -711,44 +759,114 @@
|
||||
/datum/action/cooldown
|
||||
check_flags = 0
|
||||
transparent_when_unavailable = FALSE
|
||||
// The default cooldown applied when StartCooldown() is called
|
||||
var/cooldown_time = 0
|
||||
// The actual next time this ability can be used
|
||||
var/next_use_time = 0
|
||||
// Whether or not you want the cooldown for the ability to display in text form
|
||||
var/text_cooldown = TRUE
|
||||
// Setting for intercepting clicks before activating the ability
|
||||
var/click_to_activate = FALSE
|
||||
// Shares cooldowns with other cooldown abilities of the same value, not active if null
|
||||
var/shared_cooldown
|
||||
|
||||
/datum/action/cooldown/New()
|
||||
..()
|
||||
/datum/action/cooldown/CreateButton()
|
||||
var/atom/movable/screen/movable/action_button/button = ..()
|
||||
button.maptext = ""
|
||||
button.maptext_x = 8
|
||||
button.maptext_y = 0
|
||||
button.maptext_width = 24
|
||||
button.maptext_height = 12
|
||||
return button
|
||||
|
||||
/datum/action/cooldown/IsAvailable(silent = FALSE)
|
||||
return next_use_time <= world.time
|
||||
/datum/action/cooldown/IsAvailable()
|
||||
return ..() && (next_use_time <= world.time)
|
||||
|
||||
/datum/action/cooldown/proc/StartCooldown()
|
||||
next_use_time = world.time + cooldown_time
|
||||
button.maptext = "<b>[round(cooldown_time/10, 0.1)]</b>"
|
||||
UpdateButtonIcon()
|
||||
/// Starts a cooldown time to be shared with similar abilities, will use default cooldown time if an override is not specified
|
||||
/datum/action/cooldown/proc/StartCooldown(override_cooldown_time)
|
||||
if(shared_cooldown)
|
||||
for(var/datum/action/cooldown/shared_ability in owner.actions - src)
|
||||
if(shared_cooldown == shared_ability.shared_cooldown)
|
||||
if(isnum(override_cooldown_time))
|
||||
shared_ability.StartCooldownSelf(override_cooldown_time)
|
||||
else
|
||||
shared_ability.StartCooldownSelf(cooldown_time)
|
||||
StartCooldownSelf(override_cooldown_time)
|
||||
|
||||
/// Starts a cooldown time for this ability only, will use default cooldown time if an override is not specified
|
||||
/datum/action/cooldown/proc/StartCooldownSelf(override_cooldown_time)
|
||||
if(isnum(override_cooldown_time))
|
||||
next_use_time = world.time + override_cooldown_time
|
||||
else
|
||||
next_use_time = world.time + cooldown_time
|
||||
UpdateButtons()
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
|
||||
/datum/action/cooldown/process()
|
||||
/datum/action/cooldown/Trigger(trigger_flags, atom/target)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(!owner)
|
||||
return FALSE
|
||||
if(click_to_activate)
|
||||
if(target)
|
||||
// For automatic / mob handling
|
||||
return InterceptClickOn(owner, null, target)
|
||||
if(owner.click_intercept == src)
|
||||
owner.click_intercept = null
|
||||
else
|
||||
owner.click_intercept = src
|
||||
for(var/datum/action/cooldown/ability in owner.actions)
|
||||
ability.UpdateButtons()
|
||||
return TRUE
|
||||
return PreActivate(owner)
|
||||
|
||||
/// Intercepts client owner clicks to activate the ability
|
||||
/datum/action/cooldown/proc/InterceptClickOn(mob/living/caller, params, atom/target)
|
||||
if(!IsAvailable())
|
||||
return FALSE
|
||||
if(!target)
|
||||
return FALSE
|
||||
PreActivate(target)
|
||||
caller.click_intercept = null
|
||||
return TRUE
|
||||
|
||||
/// For signal calling
|
||||
/datum/action/cooldown/proc/PreActivate(atom/target)
|
||||
if(SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_STARTED, src) & COMPONENT_BLOCK_ABILITY_START)
|
||||
return
|
||||
. = Activate(target)
|
||||
SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_FINISHED, src)
|
||||
|
||||
/// To be implemented by subtypes
|
||||
/datum/action/cooldown/proc/Activate(atom/target)
|
||||
return
|
||||
|
||||
/datum/action/cooldown/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE)
|
||||
. = ..()
|
||||
if(!button)
|
||||
return
|
||||
var/time_left = max(next_use_time - world.time, 0)
|
||||
if(text_cooldown)
|
||||
button.maptext = MAPTEXT("<b>[round(time_left/10, 0.1)]</b>")
|
||||
if(!owner || time_left == 0)
|
||||
button.maptext = ""
|
||||
if(IsAvailable() && owner.click_intercept == src)
|
||||
button.color = COLOR_GREEN
|
||||
|
||||
/datum/action/cooldown/process()
|
||||
var/time_left = max(next_use_time - world.time, 0)
|
||||
if(!owner || time_left == 0)
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
var/timeleft = max(next_use_time - world.time, 0)
|
||||
if(timeleft == 0)
|
||||
button.maptext = ""
|
||||
UpdateButtonIcon()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
else
|
||||
button.maptext = "<b>[round(timeleft/10, 0.1)]</b>"
|
||||
UpdateButtons()
|
||||
|
||||
/datum/action/cooldown/Grant(mob/M)
|
||||
..()
|
||||
if(owner)
|
||||
UpdateButtonIcon()
|
||||
if(next_use_time > world.time)
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
if(!owner)
|
||||
return
|
||||
UpdateButtons()
|
||||
if(next_use_time > world.time)
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
|
||||
//surf_ss13
|
||||
/datum/action/item_action/bhop
|
||||
@@ -841,7 +959,7 @@
|
||||
target.plane = old_plane
|
||||
current_button.appearance_cache = target.appearance
|
||||
|
||||
/proc/get_action_of_type(mob/M, var/action_type)
|
||||
/proc/get_action_of_type(mob/M, action_type)
|
||||
if(!M.actions || !ispath(action_type, /datum/action))
|
||||
return
|
||||
for(var/datum/action/A in M.actions)
|
||||
|
||||
@@ -225,7 +225,7 @@
|
||||
name = "Hide"
|
||||
desc = "Hide yourself from your owner's sight."
|
||||
button_icon_state = "hide"
|
||||
UpdateButtonIcon()
|
||||
UpdateButtons()
|
||||
|
||||
/datum/action/innate/imaginary_hide/Activate()
|
||||
var/mob/camera/imaginary_friend/I = owner
|
||||
|
||||
@@ -130,7 +130,9 @@
|
||||
var/tgt_color = extra_classes.Find("italics") ? target.chat_color_darkened : target.chat_color
|
||||
|
||||
var/complete_text = "<span class='center maptext [extra_classes.Join(" ")]' style='color: [tgt_color]'>[owner.say_emphasis(text)]</span>"
|
||||
var/mheight = WXH_TO_HEIGHT(owned_by.MeasureText(complete_text, null, CHAT_MESSAGE_WIDTH))
|
||||
|
||||
var/mheight
|
||||
WXH_TO_HEIGHT(owned_by.MeasureText(complete_text, null, CHAT_MESSAGE_WIDTH), mheight)
|
||||
approx_lines = max(1, mheight / CHAT_MESSAGE_APPROX_LHEIGHT)
|
||||
|
||||
// Translate any existing messages upwards, apply exponential decay factors to timers
|
||||
|
||||
@@ -1,17 +1,13 @@
|
||||
/datum/component/personal_crafting/Initialize()
|
||||
if(ismob(parent))
|
||||
RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, PROC_REF(create_mob_button))
|
||||
RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, PROC_REF(create_mob_button))
|
||||
|
||||
/datum/component/personal_crafting/proc/create_mob_button(mob/user, client/CL)
|
||||
/datum/component/personal_crafting/proc/create_mob_button(mob/user)
|
||||
var/datum/hud/H = user.hud_used
|
||||
for(var/huds in H.static_inventory)
|
||||
if(istype(huds, /atom/movable/screen/craft))
|
||||
return
|
||||
//We don't want to be stacking multiple crafting huds on relogs
|
||||
var/atom/movable/screen/craft/C = new()
|
||||
C.icon = H.ui_style
|
||||
H.static_inventory += C
|
||||
CL.screen += C
|
||||
user.client.screen += C
|
||||
RegisterSignal(C, COMSIG_CLICK, PROC_REF(component_ui_interact))
|
||||
|
||||
/datum/component/personal_crafting
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
return
|
||||
if(LAZYACCESS(modifiers, ALT_CLICK))
|
||||
return
|
||||
if(source.mob.in_throw_mode)
|
||||
if(source.mob.throw_mode)
|
||||
return
|
||||
if(!isturf(source.mob.loc)) //No firing inside lockers and stuff.
|
||||
return
|
||||
|
||||
@@ -328,9 +328,9 @@
|
||||
/// For spawning mineral sheets at a specific location. Used by machines to output sheets.
|
||||
/datum/component/material_container/proc/retrieve_sheets(sheet_amt, var/datum/material/M, target = null)
|
||||
if(!M.sheet_type)
|
||||
return 0 //Add greyscale sheet handling here later
|
||||
return FALSE //Add greyscale sheet handling here later
|
||||
if(sheet_amt <= 0)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(!target)
|
||||
target = get_turf(parent)
|
||||
|
||||
@@ -268,7 +268,7 @@
|
||||
else
|
||||
if(the_event.timeout)
|
||||
addtimer(CALLBACK(src, PROC_REF(clear_event), null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE)
|
||||
return 0 //Don't have to update the event.
|
||||
return FALSE //Don't have to update the event.
|
||||
the_event = new type(src, param)//This causes a runtime for some reason, was this me? No - there's an event floating around missing a definition.
|
||||
|
||||
mood_events[category] = the_event
|
||||
@@ -280,7 +280,7 @@
|
||||
/datum/component/mood/proc/clear_event(datum/source, category)
|
||||
var/datum/mood_event/event = mood_events[category]
|
||||
if(!event)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
mood_events -= category
|
||||
qdel(event)
|
||||
|
||||
@@ -392,3 +392,12 @@
|
||||
if(rider in AM.buckled_mobs)
|
||||
AM.unbuckle_mob(rider)
|
||||
. = ..()
|
||||
|
||||
/obj/item/riding_offhand/on_thrown(mob/living/carbon/user, atom/target)
|
||||
if(rider == user)
|
||||
return //Piggyback user.
|
||||
user.unbuckle_mob(rider)
|
||||
if(HAS_TRAIT(user, TRAIT_PACIFISM))
|
||||
to_chat(user, span_notice("You gently let go of [rider]."))
|
||||
return
|
||||
return rider
|
||||
|
||||
@@ -43,9 +43,9 @@
|
||||
/datum/component/spawner/proc/try_spawn_mob()
|
||||
var/atom/P = parent
|
||||
if(spawned_mobs.len >= max_mobs)
|
||||
return 0
|
||||
return FALSE
|
||||
if(spawn_delay > world.time)
|
||||
return 0
|
||||
return FALSE
|
||||
spawn_delay = world.time + spawn_time
|
||||
var/chosen_mob_type = pick(mob_types)
|
||||
var/mob/living/simple_animal/L = new chosen_mob_type(P.loc)
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
if(!istype(I) || QDELETED(I)) //We're specialized stack storage, just ignore non stacks.
|
||||
continue
|
||||
if(!.[I.merge_type])
|
||||
.[I.merge_type] = new /datum/numbered_display(I, I.amount)
|
||||
.[I.merge_type] = new /datum/numbered_display(I, I.amount, src)
|
||||
else
|
||||
var/datum/numbered_display/ND = .[I.merge_type]
|
||||
ND.number += I.amount
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user