Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into proc-define-shit

This commit is contained in:
SandPoot
2024-03-08 19:10:22 -03:00
810 changed files with 140372 additions and 5523 deletions
+38
View File
@@ -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
}
]
}
+50
View File
@@ -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
+1 -1
View File
@@ -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" = (
+11 -11
View File
@@ -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"
},
+10 -10
View File
@@ -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,
+11 -11
View File
@@ -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,
+10 -10
View File
@@ -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;
+11 -11
View File
@@ -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{
+11 -11
View File
@@ -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" = (
+11 -11
View File
@@ -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" = (
+10 -10
View File
@@ -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;
+11 -11
View File
@@ -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
+11 -11
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
#define FORCE_MAP "_maps/syndicatestation.json"
+11
View File
@@ -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"
}
}
+2
View File
@@ -0,0 +1,2 @@
//The button used for dragging (only sent for unrelated mouse up/down messages during a drag)
#define DRAG "drag"
+3
View File
@@ -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"
+35 -1
View File
@@ -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 ===
-12
View File
@@ -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
View File
@@ -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
View File
@@ -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)
+2
View File
@@ -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) )
+2 -8
View File
@@ -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 "&nbsp;&nbsp;&nbsp;&nbsp;"
#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
View File
@@ -1,5 +1,50 @@
/// Does 4 spaces. Used as a makeshift tabulator.
#define FOURSPACES "&nbsp;&nbsp;&nbsp;&nbsp;"
/// 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);
+2
View File
@@ -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"
+2 -2
View File
@@ -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))
+1 -1
View File
@@ -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)
+7
View File
@@ -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)
+2 -2
View File
@@ -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
+9 -9
View File
@@ -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
+2 -2
View File
@@ -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
+3 -3
View File
@@ -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)
+5 -5
View File
@@ -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)
+15
View File
@@ -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)
+1 -1
View File
@@ -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)
+91
View File
@@ -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, "")
+1 -1
View File
@@ -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
View File
@@ -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, "")
+2 -2
View File
@@ -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.
+10 -4
View File
@@ -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'
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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
+8 -8
View File
@@ -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
View File
@@ -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.
+9 -8
View File
@@ -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
-192
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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
+4 -4
View File
@@ -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)
+1 -1
View File
@@ -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
View File
@@ -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
+9 -9
View File
@@ -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()
+19 -26
View File
@@ -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
+6
View File
@@ -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)
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
+8 -11
View File
@@ -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)
+1 -1
View File
@@ -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]
+1 -1
View File
@@ -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)
+4 -1
View File
@@ -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)
+2 -2
View File
@@ -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)
. = ..()
+1 -1
View File
@@ -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
+4 -4
View File
@@ -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))
+2 -2
View File
@@ -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.
*/
+2 -2
View File
@@ -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()
+1 -1
View File
@@ -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)
+3 -3
View File
@@ -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"
+1 -1
View File
@@ -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)
+9 -9
View File
@@ -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)
+1 -1
View File
@@ -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))
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+6 -6
View File
@@ -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
+58 -36
View File
@@ -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
+3 -3
View File
@@ -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()*/
+2 -2
View File
@@ -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,
+9 -9
View File
@@ -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)
+1 -1
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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
+3 -1
View File
@@ -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
+3 -7
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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)
+9
View File
@@ -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
+2 -2
View File
@@ -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