Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into upstream-merge-26492

This commit is contained in:
LetterJay
2017-05-17 09:58:53 -05:00
808 changed files with 31788 additions and 17401 deletions
+2
View File
@@ -210,6 +210,8 @@ This prevents nesting levels from getting deeper then they need to be.
* Do not divide when you can easily convert it to a multiplication. (ie `4/2` should be done as `4*0.5`)
* Do not use the shorthand sql insert format (where no column names are specified) because it unnecessarily breaks all queries on minor column changes and prevents using these tables for tracking outside related info such as in a connected site/forum.
#### Enforced not enforced
The following different coding styles are not only not enforced, but it is generally frowned upon to change them over from one to the other for little reason:
+2 -2
View File
@@ -1,3 +1,3 @@
[Note]: # (Please enter the commit hash and active testmerge numbers from the "Show Server Revision" verb if you can. If you believe the issue to be caused by a testmerge, please report it in its relative PR thread. State what the issue is from a "whats wrong" prospective. Issue reports should clearly allow maintainers to understand whats wrong and how to test/reproduce if that is not obvious. Avoid ambiguity. Start your issue report below both of these lines (or remove them))
[Note]: # (State what the issue is from a "whats wrong" perspective. Issue reports should clearly allow maintainers to understand whats wrong and how to test/reproduce if that is not obvious. Avoid ambiguity. Please enter the commit hash from the "Show Server Revision" verb if you can. Remove these notes before submitting your report.)
[Admins]: # (If you are reporting a bug that occured AFTER you used varedit/admin buttons to alter an object out of normal operating conditions, please verify that you can re-create the bug without the varedit usage/admin buttons before reporting the issue.)
[GameAdmins]: # (If you are reporting a bug that occurred AFTER you used varedit/admin buttons to alter an object out of normal operating conditions, please verify that you can re-create the bug without the varedit usage/admin buttons before reporting the issue.)
+10
View File
@@ -1,3 +1,13 @@
21 April 2017, by Jordie0608
Modified table 'player', adding the column 'accountjoindate', removing the column 'id' and making the column 'ckey' the primary key.
ALTER TABLE `feedback`.`player` DROP COLUMN `id`, ADD COLUMN `accountjoindate` DATE NULL AFTER `lastadminrank`, DROP PRIMARY KEY, ADD PRIMARY KEY (`ckey`), DROP INDEX `ckey`;
Remember to add a prefix to the table name if you use them.
----------------------------------------------------
10 March 2017, by Jordie0608
Modified table 'death', adding the columns 'toxloss', 'cloneloss', and 'staminaloss' and table 'legacy_population', adding the columns 'server_ip' and 'server_port'.
+2 -3
View File
@@ -261,15 +261,14 @@ DROP TABLE IF EXISTS `player`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `player` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ckey` varchar(32) NOT NULL,
`firstseen` datetime NOT NULL,
`lastseen` datetime NOT NULL,
`ip` int(10) unsigned NOT NULL,
`computerid` varchar(32) NOT NULL,
`lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`),
`accountjoindate` DATE DEFAULT NULL,
PRIMARY KEY (`ckey`),
KEY `idx_player_cid_ckey` (`computerid`,`ckey`),
KEY `idx_player_ip_ckey` (`ip`,`ckey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+2 -3
View File
@@ -261,15 +261,14 @@ DROP TABLE IF EXISTS `SS13_player`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `SS13_player` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ckey` varchar(32) NOT NULL,
`firstseen` datetime NOT NULL,
`lastseen` datetime NOT NULL,
`ip` int(10) unsigned NOT NULL,
`computerid` varchar(32) NOT NULL,
`lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`),
`accountjoindate` DATE DEFAULT NULL,
PRIMARY KEY (`ckey`),
KEY `idx_player_cid_ckey` (`computerid`,`ckey`),
KEY `idx_player_ip_ckey` (`ip`,`ckey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-1
View File
@@ -1 +0,0 @@
Ignore this
@@ -148,10 +148,8 @@
/area/ruin/powered/golem_ship)
"u" = (
/obj/structure/table/wood,
/obj/item/weapon/bedsheet/rd{
desc = "Majestic.";
/obj/item/weapon/bedsheet/rd/royal_cape{
layer = 3;
name = "Royal Cape of the Liberator";
pixel_x = 5;
pixel_y = 9
},
@@ -84,6 +84,7 @@
/area/ruin/powered)
"p" = (
/obj/structure/rack,
/obj/item/weapon/storage/bag/plants/portaseeder,
/obj/item/weapon/storage/bag/ore,
/obj/item/weapon/storage/firstaid/regular,
/turf/open/floor/plating/asteroid/basalt,
@@ -9,19 +9,89 @@
/turf/closed/wall/r_wall,
/area/ruin/powered)
"d" = (
/obj/structure/shuttle/engine/propulsion{
icon_state = "propulsion";
dir = 8
/obj/structure/table/wood,
/obj/item/weapon/lighter,
/obj/item/weapon/lighter,
/obj/item/weapon/storage/fancy/rollingpapers,
/obj/item/weapon/storage/fancy/rollingpapers,
/obj/item/weapon/storage/fancy/rollingpapers,
/obj/item/weapon/storage/fancy/rollingpapers,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/turf/closed/mineral/volcanic/lava_land_surface,
/area/lavaland/surface/outdoors)
/area/ruin/powered)
"e" = (
/obj/machinery/smartfridge,
/obj/structure/table/wood,
/obj/item/weapon/storage/box/disks_plantgene,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"f" = (
/obj/machinery/plantgenes/seedvault,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"g" = (
/obj/structure/table/wood,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"h" = (
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"i" = (
/obj/structure/closet/crate/hydroponics,
/obj/structure/beebox,
/obj/item/weapon/melee/flyswatter,
/obj/item/honey_frame,
/obj/item/honey_frame,
/obj/item/honey_frame,
/obj/item/queen_bee/bought,
/obj/item/clothing/head/beekeeper_head,
/obj/item/clothing/suit/beekeeper_suit,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"j" = (
/obj/structure/shuttle/engine/propulsion{
icon_state = "propulsion";
dir = 8
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"k" = (
/obj/structure/closet/crate,
/obj/effect/spawner/lootdrop/seed_vault,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"l" = (
/obj/machinery/door/airlock,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"m" = (
/obj/structure/shuttle/engine/propulsion{
icon_state = "propulsion";
dir = 8
},
/turf/open/space/basic,
/area/lavaland/surface/outdoors)
"n" = (
/obj/machinery/smartfridge,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"o" = (
/obj/structure/closet/crate/hydroponics,
/obj/item/weapon/cultivator,
/obj/item/weapon/cultivator,
@@ -39,34 +109,22 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"g" = (
"p" = (
/obj/machinery/hydroponics/constructable,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"h" = (
/obj/structure/closet/crate,
/obj/effect/spawner/lootdrop/seed_vault,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"i" = (
/obj/machinery/plantgenes/seedvault,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"j" = (
"q" = (
/obj/item/weapon/hatchet,
/obj/item/weapon/storage/bag/plants,
/obj/item/weapon/reagent_containers/glass/bucket,
/obj/structure/table/wood,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"k" = (
"r" = (
/obj/structure/table/wood,
/obj/item/weapon/storage/bag/plants,
/obj/item/weapon/storage/bag/plants,
@@ -76,7 +134,7 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"l" = (
"s" = (
/obj/structure/table/wood,
/obj/item/weapon/gun/energy/floragun,
/obj/item/weapon/gun/energy/floragun,
@@ -87,25 +145,13 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"m" = (
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"n" = (
/obj/structure/shuttle/engine/propulsion{
icon_state = "propulsion";
dir = 8
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"o" = (
"t" = (
/obj/effect/mob_spawn/human/seed_vault,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"p" = (
"u" = (
/obj/structure/sink{
icon_state = "sink";
dir = 8;
@@ -116,19 +162,19 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"q" = (
"v" = (
/obj/machinery/vending/hydronutrients,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"r" = (
"w" = (
/obj/machinery/vending/hydroseeds,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"s" = (
"x" = (
/obj/machinery/reagentgrinder{
pixel_y = 5
},
@@ -141,7 +187,7 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"t" = (
"y" = (
/obj/structure/sink{
dir = 4;
icon_state = "sink";
@@ -152,57 +198,51 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"u" = (
/obj/machinery/door/airlock,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"v" = (
"z" = (
/obj/machinery/door/airlock/external,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"w" = (
"A" = (
/obj/machinery/door/airlock/external,
/obj/structure/fans/tiny,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"x" = (
"B" = (
/obj/structure/disposalpipe/trunk,
/obj/machinery/disposal/bin,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"y" = (
"C" = (
/obj/machinery/seed_extractor,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"z" = (
"D" = (
/obj/machinery/biogenerator,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"A" = (
/obj/machinery/chem_dispenser/mutagen,
"E" = (
/obj/machinery/chem_dispenser/mutagensaltpeter,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"B" = (
"F" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"C" = (
"G" = (
/obj/structure/closet/crate/hydroponics,
/obj/item/clothing/under/rank/hydroponics,
/obj/item/clothing/under/rank/hydroponics,
@@ -212,13 +252,13 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"D" = (
"H" = (
/obj/machinery/chem_master/condimaster,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"E" = (
"I" = (
/obj/structure/table/wood,
/obj/item/weapon/reagent_containers/glass/bucket,
/obj/item/weapon/reagent_containers/glass/bucket,
@@ -228,25 +268,25 @@
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"F" = (
"J" = (
/obj/item/weapon/storage/toolbox/syndicate,
/obj/structure/table/wood,
/turf/open/floor/plasteel/freezer{
baseturf = /turf/open/floor/plating/lava/smooth
},
/area/ruin/powered)
"G" = (
"K" = (
/obj/structure/disposalpipe/segment,
/turf/closed/wall/r_wall,
/area/ruin/powered)
"H" = (
"L" = (
/obj/structure/disposalpipe/segment{
dir = 1;
icon_state = "pipe-c"
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"I" = (
"M" = (
/obj/structure/disposalpipe/trunk{
dir = 8
},
@@ -284,10 +324,10 @@ a
a
a
c
o
o
o
o
t
t
t
t
c
a
a
@@ -299,17 +339,17 @@ b
"}
(3,1,1) = {"
b
b
a
a
a
a
a
c
c
m
m
m
m
h
h
h
h
c
c
a
@@ -321,16 +361,16 @@ b
"}
(4,1,1) = {"
b
b
a
a
a
c
c
c
c
u
u
c
c
l
l
c
c
c
@@ -344,18 +384,18 @@ a
(5,1,1) = {"
a
a
a
a
a
c
e
m
p
m
m
p
m
p
c
k
c
n
h
u
h
h
u
h
u
c
a
a
@@ -366,18 +406,18 @@ a
(6,1,1) = {"
a
a
a
a
a
c
f
m
m
m
m
m
m
C
d
h
c
o
h
h
h
h
h
h
G
c
a
a
@@ -388,18 +428,18 @@ a
(7,1,1) = {"
a
a
a
a
a
c
g
m
g
m
m
g
m
g
e
h
c
p
h
p
h
h
p
h
p
c
a
a
@@ -408,44 +448,44 @@ a
a
"}
(8,1,1) = {"
a
a
a
a
b
a
c
e
h
l
h
h
v
h
h
m
q
m
m
x
B
B
G
H
F
F
K
L
a
a
a
a
"}
(9,1,1) = {"
a
a
a
a
b
a
c
i
m
e
m
m
y
m
m
f
h
c
I
p
h
n
h
h
C
h
k
c
M
a
a
a
@@ -454,18 +494,18 @@ a
(10,1,1) = {"
a
a
a
a
a
c
g
m
r
m
m
z
m
g
h
c
p
h
w
h
h
D
h
p
c
b
a
@@ -476,18 +516,18 @@ a
(11,1,1) = {"
a
a
a
a
a
c
j
m
s
m
m
A
m
D
h
h
c
q
h
x
h
h
E
h
H
c
a
a
@@ -496,20 +536,20 @@ a
a
"}
(12,1,1) = {"
a
a
a
a
b
a
c
g
m
m
m
m
m
m
g
h
h
c
p
h
h
h
h
h
h
p
c
a
a
@@ -520,18 +560,18 @@ a
(13,1,1) = {"
a
a
a
a
a
c
k
m
m
g
g
m
m
E
i
h
c
r
h
h
p
p
h
h
I
c
a
a
@@ -542,18 +582,18 @@ a
(14,1,1) = {"
a
a
a
a
a
c
l
m
t
m
m
t
m
F
c
i
c
s
h
y
h
h
y
h
J
c
a
a
@@ -564,15 +604,15 @@ a
(15,1,1) = {"
a
a
a
a
a
b
c
c
c
c
v
v
c
c
z
z
c
c
c
@@ -584,21 +624,21 @@ a
a
"}
(16,1,1) = {"
a
a
b
a
a
d
b
j
c
n
j
c
m
m
j
c
n
h
h
c
n
j
c
j
a
a
a
@@ -611,12 +651,12 @@ a
a
a
a
b
a
b
a
a
c
w
w
A
A
c
b
b
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1361,7 +1361,7 @@
"aAi" = (/obj/structure/table/wood,/obj/item/weapon/folder,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/library)
"aAj" = (/obj/machinery/power/apc{dir = 8;name = "Library APC";pixel_x = -25},/obj/structure/cable{icon_state = "0-4";d2 = 4},/turf/open/floor/wood,/area/library)
"aAk" = (/obj/structure/cable{d1 = 2;d2 = 8;icon_state = "2-8"},/turf/open/floor/wood,/area/library)
"aAl" = (/obj/effect/landmark/start{name = "Librarian"},/turf/open/floor/wood,/area/library)
"aAl" = (/obj/effect/landmark/start{name = "Curator"},/turf/open/floor/wood,/area/library)
"aAm" = (/obj/machinery/light/small{dir = 4},/turf/open/floor/wood,/area/library)
"aAn" = (/obj/machinery/light/small/built{tag = "icon-bulb1 (WEST)";icon_state = "bulb1";dir = 8},/obj/machinery/airalarm{frequency = 1439;locked = 0;pixel_y = 23},/turf/open/floor/wood,/area/crew_quarters/cafeteria{name = "Cafe"})
"aAo" = (/turf/open/floor/wood,/area/crew_quarters/cafeteria{name = "Cafe"})
@@ -1393,7 +1393,7 @@
"aAO" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/maintenance/fore)
"aAP" = (/obj/structure/chair/stool,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/maintenance/fore)
"aAQ" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/open/floor/noslip,/area/construction/hallway{name = "Secure Workstations Hallway"})
"aAR" = (/obj/structure/closet/cabinet,/obj/item/toy/figure/assistant,/obj/item/toy/figure/atmos,/obj/item/toy/figure/bartender,/obj/item/toy/figure/borg,/obj/item/toy/figure/botanist,/obj/item/toy/figure/captain,/obj/item/toy/figure/cargotech,/obj/item/toy/figure/ce,/obj/item/toy/figure/chaplain,/obj/item/toy/figure/chef,/obj/item/toy/figure/chemist,/obj/item/toy/figure/clown,/obj/item/toy/figure/cmo,/obj/item/toy/figure/detective,/obj/item/toy/figure/dsquad,/obj/item/toy/figure/engineer,/obj/item/toy/figure/geneticist,/obj/item/toy/figure/hop,/obj/item/toy/figure/hos,/obj/item/toy/figure/ian,/obj/item/toy/figure/janitor,/obj/item/toy/figure/lawyer,/obj/item/toy/figure/librarian,/obj/item/toy/figure/md,/obj/item/toy/figure/mime,/obj/item/toy/figure/miner,/obj/item/toy/figure/ninja,/obj/item/toy/figure/qm,/obj/item/toy/figure/rd,/obj/item/toy/figure/roboticist,/obj/item/toy/figure/scientist,/obj/item/toy/figure/secofficer,/obj/item/toy/figure/syndie,/obj/item/toy/figure/virologist,/obj/item/toy/figure/warden,/obj/item/toy/figure/wizard,/obj/item/toy/minimeteor,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/library)
"aAR" = (/obj/structure/closet/cabinet,/obj/item/toy/figure/assistant,/obj/item/toy/figure/atmos,/obj/item/toy/figure/bartender,/obj/item/toy/figure/borg,/obj/item/toy/figure/botanist,/obj/item/toy/figure/captain,/obj/item/toy/figure/cargotech,/obj/item/toy/figure/ce,/obj/item/toy/figure/chaplain,/obj/item/toy/figure/chef,/obj/item/toy/figure/chemist,/obj/item/toy/figure/clown,/obj/item/toy/figure/cmo,/obj/item/toy/figure/detective,/obj/item/toy/figure/dsquad,/obj/item/toy/figure/engineer,/obj/item/toy/figure/geneticist,/obj/item/toy/figure/hop,/obj/item/toy/figure/hos,/obj/item/toy/figure/ian,/obj/item/toy/figure/janitor,/obj/item/toy/figure/lawyer,/obj/item/toy/figure/curator,/obj/item/toy/figure/md,/obj/item/toy/figure/mime,/obj/item/toy/figure/miner,/obj/item/toy/figure/ninja,/obj/item/toy/figure/qm,/obj/item/toy/figure/rd,/obj/item/toy/figure/roboticist,/obj/item/toy/figure/scientist,/obj/item/toy/figure/secofficer,/obj/item/toy/figure/syndie,/obj/item/toy/figure/virologist,/obj/item/toy/figure/warden,/obj/item/toy/figure/wizard,/obj/item/toy/minimeteor,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/library)
"aAS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/library)
"aAT" = (/obj/item/device/radio/intercom{dir = 4;name = "Station Intercom (General)";pixel_x = 0;pixel_y = -27},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/library)
"aAU" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8;initialize_directions = 11},/turf/open/floor/wood{baseturf = /turf/open/floor/plating/asteroid},/area/library)
+56 -42
View File
@@ -142,15 +142,15 @@
/area/solar/auxstarboard)
"aap" = (
/obj/docking_port/stationary/random{
id = "pod_asteroid1";
name = "asteroid"
id = "pod_lavaland1";
name = "lavaland"
},
/turf/open/space,
/area/space)
"aaq" = (
/obj/docking_port/stationary/random{
id = "pod_asteroid2";
name = "asteroid"
id = "pod_lavaland2";
name = "lavaland"
},
/turf/open/space,
/area/space)
@@ -203,7 +203,7 @@
},
/obj/machinery/computer/shuttle/pod{
pixel_x = -32;
possible_destinations = "pod_asteroid1";
possible_destinations = "pod_lavaland1";
shuttleId = "pod1"
},
/obj/effect/turf_decal/stripes/line{
@@ -226,7 +226,7 @@
},
/obj/machinery/computer/shuttle/pod{
pixel_x = -32;
possible_destinations = "pod_asteroid2";
possible_destinations = "pod_lavaland2";
shuttleId = "pod2"
},
/obj/effect/turf_decal/stripes/line{
@@ -10753,7 +10753,7 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/loadingarea{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
baseturf = /turf/open/space;
dir = 8
},
/area/quartermaster/storage)
@@ -11240,7 +11240,7 @@
/area/quartermaster/storage)
"awJ" = (
/turf/open/floor/plasteel/loadingarea{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
baseturf = /turf/open/space;
dir = 8
},
/area/quartermaster/storage)
@@ -25977,7 +25977,7 @@
},
/obj/machinery/computer/shuttle/pod{
pixel_y = -32;
possible_destinations = "pod_asteroid3";
possible_destinations = "pod_lavaland3";
shuttleId = "pod3"
},
/obj/effect/turf_decal/stripes/line{
@@ -25996,8 +25996,8 @@
"aXK" = (
/obj/docking_port/stationary/random{
dir = 4;
id = "pod_asteroid4";
name = "asteroid"
id = "pod_lavaland4";
name = "lavaland"
},
/turf/open/space,
/area/space)
@@ -31236,7 +31236,7 @@
icon_state = "1-4"
},
/turf/open/floor/plasteel/loadingarea{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
baseturf = /turf/open/space;
dir = 8
},
/area/quartermaster/miningdock{
@@ -34793,7 +34793,6 @@
dir = 4
},
/turf/open/floor/plasteel{
desc = "";
icon_state = "L14"
},
/area/hallway/primary/central)
@@ -44697,9 +44696,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
/turf/open/floor/plating{
icon_state = "plating_warn_side"
},
/turf/open/floor/plating,
/area/maintenance/starboard)
"bGN" = (
/obj/effect/decal/cleanable/dirt,
@@ -52478,7 +52475,7 @@
name = "Queue Shutters"
},
/turf/open/floor/plasteel/loadingarea{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
baseturf = /turf/open/space;
dir = 8
},
/area/hallway/primary/central)
@@ -62920,7 +62917,7 @@
"cpl" = (
/obj/structure/table/wood,
/obj/item/weapon/clipboard,
/obj/item/toy/figure/librarian,
/obj/item/toy/figure/curator,
/obj/machinery/airalarm{
dir = 8;
icon_state = "alarm0";
@@ -63738,7 +63735,7 @@
/area/library)
"cqF" = (
/obj/machinery/door/morgue{
name = "Librarian's Study";
name = "Curator's Study";
req_access_txt = "37"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -64358,10 +64355,12 @@
/turf/open/floor/plasteel/black,
/area/library)
"crP" = (
/obj/structure/dresser,
/obj/machinery/computer/security/telescreen/entertainment{
pixel_x = -32
},
/obj/structure/closet/crate,
/obj/item/clothing/shoes/workboots/mining,
/obj/item/clothing/under/rank/curator/treasure_hunter,
/obj/item/clothing/suit/curator,
/obj/item/clothing/head/curator,
/obj/item/weapon/storage/backpack/satchel/explorer,
/turf/open/floor/plasteel/black,
/area/library)
"crQ" = (
@@ -67500,7 +67499,7 @@
desc = "This looks awfully familiar...";
icon_state = "curator"
},
/obj/item/clothing/under/rank/librarian/curator,
/obj/item/clothing/under/rank/curator/treasure_hunter,
/turf/open/floor/carpet,
/area/crew_quarters/sleep)
"cxC" = (
@@ -70988,7 +70987,6 @@
"cDW" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel{
desc = "";
icon_state = "L13";
name = "floor"
},
@@ -79514,8 +79512,13 @@
name = "Medbay Central"
})
"cUf" = (
/obj/machinery/smartfridge/chemistry,
/turf/closed/wall,
/obj/structure/grille,
/obj/machinery/door/poddoor/shutters/preopen{
id = "chemisttop";
name = "Chemisty Lobby Shutters"
},
/obj/structure/window/reinforced/fulltile,
/turf/open/floor/plating,
/area/medical/medbay{
name = "Medbay Central"
})
@@ -79538,14 +79541,9 @@
name = "Medbay Central"
})
"cUh" = (
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/poddoor/shutters/preopen{
id = "chemisttop";
name = "Chemisty Lobby Shutters"
},
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/obj/machinery/smartfridge/chemistry,
/turf/closed/wall,
/area/medical/medbay{
name = "Medbay Central"
})
@@ -82191,6 +82189,7 @@
/obj/item/weapon/grenade/chem_grenade,
/obj/item/weapon/grenade/chem_grenade,
/obj/item/weapon/grenade/chem_grenade,
/obj/item/weapon/screwdriver,
/turf/open/floor/plasteel/whiteyellow/corner{
icon_state = "whiteyellowcorner";
dir = 8
@@ -96355,7 +96354,6 @@
},
/area/medical/morgue)
"dAn" = (
/turf/open/floor/plating,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
icon_state = "manifold";
@@ -104162,7 +104160,7 @@
name = "emergency shower"
},
/turf/open/floor/plasteel/whiteblue/side{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
baseturf = /turf/open/space;
dir = 4
},
/area/shuttle/escape)
@@ -105518,7 +105516,7 @@
/area/library/abandoned_library)
"dSu" = (
/obj/structure/table/wood,
/obj/item/clothing/under/rank/librarian,
/obj/item/clothing/under/rank/curator,
/obj/effect/spawner/lootdrop/maintenance{
lootcount = 2;
name = "2maintenance loot spawner"
@@ -108178,7 +108176,7 @@
/area/maintenance/fpmaint2/aft_port_maintenance)
"dXu" = (
/obj/structure/table/wood/fancy,
/obj/item/weapon/spellbook/oneuse/smoke,
/obj/item/weapon/spellbook/oneuse/smoke/lesser,
/obj/item/weapon/nullrod,
/obj/item/organ/heart,
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,
@@ -112313,6 +112311,22 @@
},
/turf/open/floor/plasteel/neutral,
/area/atmos)
"ehO" = (
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
/area/library)
"ehP" = (
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
/area/library)
"ehQ" = (
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
/area/library)
"ehR" = (
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
/area/library)
(1,1,1) = {"
aaa
@@ -143546,7 +143560,7 @@ cbA
cdn
ceS
cgp
chQ
ehO
cjl
ckP
cjl
@@ -143803,7 +143817,7 @@ cbB
cdo
ceS
cgq
chQ
ehO
cjl
ckP
cjl
@@ -144317,7 +144331,7 @@ bWi
cdq
ceS
cgp
chQ
ehO
cjm
ckP
cmk
@@ -144574,7 +144588,7 @@ cbC
cdr
ceT
cgp
chQ
ehO
cjn
ckP
cmk
+38 -26
View File
@@ -1910,8 +1910,8 @@
/area/shuttle/pod_3)
"adG" = (
/obj/docking_port/stationary/random{
id = "pod_asteroid2";
name = "asteroid"
id = "pod_lavaland2";
name = "lavaland"
},
/turf/open/space,
/area/space)
@@ -1927,7 +1927,7 @@
},
/obj/machinery/computer/shuttle/pod{
pixel_x = -32;
possible_destinations = "pod_asteroid2";
possible_destinations = "pod_lavaland2";
shuttleId = "pod2"
},
/turf/open/floor/mineral/titanium/blue,
@@ -23696,7 +23696,7 @@
},
/obj/machinery/computer/shuttle/pod{
pixel_y = -32;
possible_destinations = "pod_asteroid3";
possible_destinations = "pod_lavaland3";
shuttleId = "pod3"
},
/turf/open/floor/mineral/titanium/blue,
@@ -27963,7 +27963,6 @@
dir = 4
},
/turf/open/floor/plasteel{
desc = "";
icon_state = "L13";
name = "floor"
},
@@ -28813,7 +28812,6 @@
icon_state = "4-8"
},
/turf/open/floor/plasteel{
desc = "";
icon_state = "L14"
},
/area/hallway/primary/central)
@@ -34140,8 +34138,8 @@
"bii" = (
/obj/docking_port/stationary/random{
dir = 4;
id = "pod_asteroid3";
name = "asteroid"
id = "pod_lavaland3";
name = "lavaland"
},
/turf/open/space,
/area/space)
@@ -45372,12 +45370,12 @@
name = "Port Maintenance"
})
"bBr" = (
/obj/structure/table/wood,
/obj/machinery/airalarm{
dir = 4;
pixel_x = -23;
pixel_y = 0
},
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
/area/library)
"bBs" = (
@@ -47035,7 +47033,6 @@
name = "\improper Auxiliary Restrooms"
})
"bEw" = (
/obj/structure/table/wood,
/obj/machinery/computer/security/telescreen/entertainment{
pixel_x = -32;
pixel_y = 0
@@ -47044,6 +47041,7 @@
dir = 4;
network = list("SS13")
},
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
/area/library)
"bEx" = (
@@ -53664,6 +53662,12 @@
pixel_x = 30;
pixel_y = 0
},
/obj/structure/closet/crate,
/obj/item/clothing/shoes/workboots/mining,
/obj/item/clothing/under/rank/curator/treasure_hunter,
/obj/item/clothing/suit/curator,
/obj/item/clothing/head/curator,
/obj/item/weapon/storage/backpack/satchel/explorer,
/turf/open/floor/engine/cult,
/area/library)
"bPY" = (
@@ -82483,7 +82487,7 @@
/area/chapel/office)
"cMa" = (
/obj/structure/table/wood,
/obj/item/weapon/spellbook/oneuse/smoke{
/obj/item/weapon/spellbook/oneuse/smoke/lesser{
name = "mysterious old book of "
},
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater{
@@ -86084,8 +86088,8 @@
/area/toxins/xenobiology)
"cSP" = (
/obj/docking_port/stationary/random{
id = "pod_asteroid1";
name = "asteroid"
id = "pod_lavaland1";
name = "lavaland"
},
/turf/open/space,
/area/space)
@@ -86175,7 +86179,7 @@
},
/obj/machinery/computer/shuttle/pod{
pixel_x = -32;
possible_destinations = "pod_asteroid1";
possible_destinations = "pod_lavaland1";
shuttleId = "pod1"
},
/turf/open/floor/mineral/titanium/blue,
@@ -86368,7 +86372,7 @@
},
/obj/machinery/computer/shuttle/pod{
pixel_y = -32;
possible_destinations = "pod_asteroid4";
possible_destinations = "pod_lavaland4";
shuttleId = "pod4"
},
/turf/open/floor/mineral/titanium/blue,
@@ -87162,8 +87166,8 @@
"cUL" = (
/obj/docking_port/stationary/random{
dir = 4;
id = "pod_asteroid4";
name = "asteroid"
id = "pod_lavaland4";
name = "lavaland"
},
/turf/open/space,
/area/space)
@@ -95333,6 +95337,14 @@
icon_state = "xenomaint";
name = "Xeno Maintenance"
})
"dmD" = (
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
/area/library)
"dmE" = (
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
/area/library)
(1,1,1) = {"
aaa
@@ -114481,7 +114493,7 @@ bwa
bxU
bzD
bBr
bCT
bSx
bEw
bzE
bHR
@@ -114737,9 +114749,9 @@ bue
bwb
bxV
bzE
bBs
bCU
bBs
dmD
bzE
dmD
bzE
bHR
bJz
@@ -128192,7 +128204,7 @@ cRi
cRi
daP
cLE
cRi
dlV
aaa
aaa
aaf
@@ -128448,7 +128460,7 @@ daF
daJ
cRi
bvT
dlV
cRi
cRi
cRi
cRi
@@ -128705,7 +128717,7 @@ cSn
cSn
cRi
dmq
dlV
cRi
cZv
cZv
cRi
@@ -129733,7 +129745,7 @@ cSn
daN
cRi
dmr
dlV
cRi
cZv
dbw
cRi
@@ -129990,7 +130002,7 @@ daI
daM
cRi
cTA
dlV
cRi
cRi
cRi
cRi
+71 -17
View File
@@ -513,7 +513,7 @@
/obj/structure/cable{
d1 = 1;
d2 = 4;
icon_state = "1-4";
icon_state = "1-4"
},
/obj/structure/cable{
d1 = 1;
@@ -1040,7 +1040,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/brown{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
dir = 1;
dir = 1
},
/area/mine/living_quarters)
"cg" = (
@@ -1074,7 +1074,7 @@
/obj/structure/cable{
d1 = 1;
d2 = 4;
icon_state = "1-4";
icon_state = "1-4"
},
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
@@ -1497,10 +1497,21 @@
/area/mine/living_quarters)
"dd" = (
/obj/structure/table,
/obj/item/weapon/reagent_containers/food/drinks/beer,
/obj/item/weapon/reagent_containers/food/drinks/beer{
pixel_x = 7;
pixel_y = 5
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
/obj/item/weapon/reagent_containers/food/drinks/beer{
pixel_x = -1;
pixel_y = 9
},
/obj/item/weapon/reagent_containers/food/drinks/beer{
pixel_x = -8;
pixel_y = 0
},
/turf/open/floor/plasteel/bar{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
@@ -1772,6 +1783,9 @@
pixel_x = -5;
pixel_y = 30
},
/obj/machinery/shower{
dir = 8
},
/turf/open/floor/plasteel/purple/corner{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
@@ -2192,7 +2206,7 @@
},
/turf/open/floor/plasteel/vault{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
dir = 8;
dir = 8
},
/area/mine/maintenance)
"ez" = (
@@ -2214,13 +2228,13 @@
/obj/machinery/iv_drip,
/turf/open/floor/plasteel/whiteblue/side{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
dir = 1;
dir = 1
},
/area/mine/living_quarters)
"eB" = (
/turf/open/floor/plasteel/whiteblue/side{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
dir = 1;
dir = 1
},
/area/mine/living_quarters)
"eC" = (
@@ -2231,7 +2245,7 @@
},
/turf/open/floor/plasteel/whiteblue/side{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
dir = 5;
dir = 5
},
/area/mine/living_quarters)
"eD" = (
@@ -2398,7 +2412,7 @@
/obj/item/weapon/storage/firstaid/regular,
/turf/open/floor/plasteel/whiteblue/side{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
dir = 4;
dir = 4
},
/area/mine/living_quarters)
"eU" = (
@@ -2512,6 +2526,7 @@
dir = 2;
network = list("MINE")
},
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/plasteel/brown{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
dir = 5
@@ -2520,7 +2535,7 @@
"fe" = (
/turf/open/floor/plasteel/brown/corner{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
dir = 1;
dir = 1
},
/area/mine/production)
"ff" = (
@@ -2578,7 +2593,7 @@
},
/turf/open/floor/plasteel/brown{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
dir = 1;
dir = 1
},
/area/mine/living_quarters)
"fm" = (
@@ -2600,7 +2615,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/brown{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
dir = 1;
dir = 1
},
/area/mine/living_quarters)
"fp" = (
@@ -2674,7 +2689,7 @@
/obj/structure/cable{
d1 = 1;
d2 = 4;
icon_state = "1-4";
icon_state = "1-4"
},
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
@@ -2712,6 +2727,10 @@
/obj/machinery/light/small{
dir = 1
},
/obj/structure/extinguisher_cabinet{
pixel_x = -5;
pixel_y = 30
},
/turf/open/floor/plasteel/purple/corner{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
dir = 4
@@ -2794,6 +2813,41 @@
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/turf/closed/indestructible/riveted,
/area/space)
"fQ" = (
/obj/machinery/shower{
dir = 8
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel/white,
/area/mine/laborcamp)
"fR" = (
/obj/structure/sink/kitchen{
dir = 4;
icon_state = "sink_alt";
pixel_x = -13;
tag = "icon-sink_alt (EAST)"
},
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/mine/laborcamp)
"fS" = (
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/plasteel/purple/corner{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/mine/production)
"fT" = (
/obj/structure/sink{
dir = 4;
icon_state = "sink";
pixel_x = 11;
tag = "icon-sink (EAST)"
},
/turf/open/floor/plasteel/bar{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/mine/living_quarters)
(1,1,1) = {"
aa
@@ -8919,7 +8973,7 @@ aA
at
at
at
at
fR
at
au
fH
@@ -9175,7 +9229,7 @@ an
an
at
at
at
fQ
at
dr
an
@@ -14594,8 +14648,8 @@ fj
ee
cT
cZ
dg
dk
fT
ee
al
al
@@ -18433,7 +18487,7 @@ af
ab
ab
dx
dC
fS
dK
bI
bS
+368 -70
View File
@@ -7303,7 +7303,6 @@
icon_state = "1-2"
},
/turf/open/floor/plasteel{
desc = "";
icon_state = "L14"
},
/area/hallway/primary/central{
@@ -9155,7 +9154,7 @@
},
/obj/effect/landmark/start/shaft_miner,
/turf/open/floor/plasteel/loadingarea{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
baseturf = /turf/open/space;
dir = 8
},
/area/quartermaster/miningdock)
@@ -16523,6 +16522,9 @@
/obj/machinery/status_display{
pixel_x = -32
},
/obj/machinery/light{
dir = 8
},
/turf/open/floor/mineral/plastitanium/brig,
/area/shuttle/escape)
"aAb" = (
@@ -16558,6 +16560,9 @@
"aAf" = (
/obj/structure/table/reinforced,
/obj/item/weapon/storage/fancy/donut_box,
/obj/machinery/light{
dir = 4
},
/turf/open/floor/plasteel/vault{
dir = 8
},
@@ -24133,6 +24138,9 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
/obj/machinery/light{
dir = 8
},
/turf/open/floor/plasteel,
/area/shuttle/escape)
"aME" = (
@@ -24187,6 +24195,9 @@
/obj/machinery/status_display{
pixel_x = 32
},
/obj/machinery/light{
dir = 4
},
/turf/open/floor/plasteel/whiteblue/side{
dir = 5
},
@@ -25964,7 +25975,6 @@
icon_state = "4-8"
},
/turf/open/floor/plasteel{
desc = "";
icon_state = "L13";
name = "floor"
},
@@ -30548,7 +30558,7 @@
/area/maintenance/starboard)
"aXL" = (
/obj/machinery/door/morgue{
name = "Librarian's Study";
name = "Curator's Study";
req_access_txt = "37"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -41920,6 +41930,294 @@
/area/ruin/unpowered{
name = "Asteroid"
})
"bvO" = (
/obj/machinery/light{
dir = 1
},
/turf/open/floor/plasteel/neutral/side{
dir = 1
},
/area/shuttle/escape)
"bvP" = (
/obj/structure/chair{
dir = 8
},
/obj/effect/turf_decal/bot,
/obj/machinery/light/small{
dir = 4
},
/turf/open/floor/plasteel,
/area/shuttle/escape)
"bvQ" = (
/obj/structure/chair{
dir = 4
},
/obj/effect/turf_decal/bot,
/obj/machinery/light/small{
dir = 8
},
/turf/open/floor/plasteel,
/area/shuttle/escape)
"bvR" = (
/obj/machinery/light,
/turf/open/floor/plasteel/neutral/side,
/area/shuttle/escape)
"bvS" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bvT" = (
/obj/structure/grille,
/obj/structure/window/shuttle,
/turf/open/floor/plating,
/area/shuttle/transport)
"bvU" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bvV" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bvW" = (
/obj/machinery/door/airlock/external,
/turf/open/floor/pod/dark,
/area/shuttle/transport)
"bvX" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bvY" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bvZ" = (
/obj/structure/grille,
/obj/structure/window/shuttle,
/turf/open/floor/plating,
/area/shuttle/transport)
"bwa" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bwb" = (
/obj/structure/shuttle/engine/propulsion{
dir = 8;
icon_state = "propulsion_l"
},
/turf/open/floor/plating/airless,
/area/shuttle/transport)
"bwc" = (
/obj/structure/shuttle/engine/heater{
icon_state = "heater";
dir = 8
},
/obj/structure/window/reinforced,
/turf/open/floor/plating/airless,
/area/shuttle/transport)
"bwd" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bwe" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bwf" = (
/obj/structure/chair,
/turf/open/floor/pod/dark,
/area/shuttle/transport)
"bwg" = (
/obj/structure/chair,
/turf/open/floor/pod/dark,
/area/shuttle/transport)
"bwh" = (
/obj/machinery/light{
dir = 1
},
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwi" = (
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwj" = (
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwk" = (
/obj/structure/chair,
/turf/open/floor/pod/dark,
/area/shuttle/transport)
"bwl" = (
/obj/structure/chair,
/turf/open/floor/pod/dark,
/area/shuttle/transport)
"bwm" = (
/obj/structure/grille,
/obj/structure/window/shuttle,
/turf/open/floor/plating,
/area/shuttle/transport)
"bwn" = (
/obj/structure/shuttle/engine/propulsion{
dir = 8;
icon_state = "propulsion_l"
},
/turf/open/floor/plating/airless,
/area/shuttle/transport)
"bwo" = (
/obj/structure/shuttle/engine/heater{
icon_state = "heater";
dir = 8
},
/obj/structure/window/reinforced{
dir = 4;
pixel_x = 0
},
/turf/open/floor/plating/airless,
/area/shuttle/transport)
"bwp" = (
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwq" = (
/obj/machinery/light/small,
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwr" = (
/obj/machinery/door/airlock/titanium,
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bws" = (
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwt" = (
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwu" = (
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwv" = (
/obj/machinery/computer/shuttle/ferry/request,
/turf/open/floor/pod/dark,
/area/shuttle/transport)
"bww" = (
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwx" = (
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwy" = (
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwz" = (
/obj/machinery/door/airlock/titanium,
/obj/docking_port/mobile{
dir = 8;
dwidth = 2;
height = 13;
id = "ferry";
name = "ferry shuttle";
port_angle = 0;
preferred_direction = 4;
roundstart_move = "ferry_away";
width = 5
},
/obj/docking_port/stationary{
dir = 8;
dwidth = 2;
height = 13;
id = "ferry_home";
name = "port bay 2";
turf_type = /turf/open/space;
width = 5
},
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwA" = (
/obj/structure/shuttle/engine/propulsion{
dir = 8;
icon_state = "propulsion_l"
},
/turf/open/floor/plating/airless,
/area/shuttle/transport)
"bwB" = (
/obj/structure/shuttle/engine/heater{
icon_state = "heater";
dir = 8
},
/obj/structure/window/reinforced{
dir = 1;
pixel_y = 1
},
/turf/open/floor/plating/airless,
/area/shuttle/transport)
"bwC" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bwD" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bwE" = (
/obj/structure/chair{
dir = 1
},
/turf/open/floor/pod/dark,
/area/shuttle/transport)
"bwF" = (
/obj/structure/chair{
dir = 1
},
/turf/open/floor/pod/dark,
/area/shuttle/transport)
"bwG" = (
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwH" = (
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwI" = (
/obj/machinery/light,
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwJ" = (
/obj/structure/chair{
dir = 1
},
/turf/open/floor/pod/dark,
/area/shuttle/transport)
"bwK" = (
/obj/structure/chair{
dir = 1
},
/turf/open/floor/pod/dark,
/area/shuttle/transport)
"bwL" = (
/obj/structure/grille,
/obj/structure/window/shuttle,
/turf/open/floor/plating,
/area/shuttle/transport)
"bwM" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bwN" = (
/obj/structure/grille,
/obj/structure/window/shuttle,
/turf/open/floor/plating,
/area/shuttle/transport)
"bwO" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bwP" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bwQ" = (
/obj/machinery/door/airlock/external,
/turf/open/floor/pod/light,
/area/shuttle/transport)
"bwR" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bwS" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
"bwT" = (
/obj/structure/grille,
/obj/structure/window/shuttle,
/turf/open/floor/plating,
/area/shuttle/transport)
"bwU" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/transport)
(1,1,1) = {"
aaa
@@ -72622,11 +72920,11 @@ aHl
aIi
aJs
aKz
buW
buX
aMR
buZ
buZ
buW
bva
bvb
aQL
aRI
aSS
@@ -72883,7 +73181,7 @@ aLP
aMS
aMS
aOC
buW
bvc
aQM
aRJ
aST
@@ -73911,7 +74209,7 @@ aLT
aMW
aMW
aOD
buW
bve
aQQ
aRN
aSX
@@ -74164,11 +74462,11 @@ aHr
aIo
aJw
aKE
buW
buY
aMX
aMX
aMX
buW
bvf
aQR
aRO
aSY
@@ -77290,7 +77588,7 @@ aaa
aaa
aaa
aaa
aaa
bwn
aaa
aaa
aaa
@@ -77546,9 +77844,9 @@ aaa
aaa
aaa
aaa
aaa
aaa
aaa
bwb
bwo
bwA
aaa
aaa
aaa
@@ -77803,9 +78101,9 @@ aaa
aaa
aaa
aaa
aaa
aaa
aaa
bwc
bwp
bwB
aaa
aaa
aaa
@@ -78060,9 +78358,9 @@ aaa
aaa
aaa
aaa
aaa
aaa
aaa
bwd
bwq
bwC
aaa
aaa
aaa
@@ -78316,11 +78614,11 @@ aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
bvS
bwe
bwr
bwD
bwM
aaa
aaa
aaa
@@ -78573,11 +78871,11 @@ aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
bvT
bwf
bws
bwE
bwN
aaa
aaa
aaa
@@ -78830,11 +79128,11 @@ aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
bvU
bwg
bwt
bwF
bwO
aaa
aaa
aaa
@@ -79087,11 +79385,11 @@ aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
bvV
bwh
bwu
bwG
bwP
aaa
aaa
aaa
@@ -79344,11 +79642,11 @@ aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
bvW
bwi
bwv
bwH
bwQ
aaa
aaa
aaa
@@ -79601,11 +79899,11 @@ aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
bvX
bwj
bww
bwI
bwR
aaa
aaa
aaa
@@ -79858,11 +80156,11 @@ aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
bvY
bwk
bwx
bwJ
bwS
aaa
aaa
aaa
@@ -80115,11 +80413,11 @@ aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
bvZ
bwl
bwy
bwK
bwT
aaa
aaa
aaa
@@ -80372,11 +80670,11 @@ aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
bwa
bwm
bwz
bwL
bwU
aaa
aaa
aaa
@@ -94203,7 +94501,7 @@ aAb
axY
aDl
aEi
aEi
bvP
aEi
aEi
aEi
@@ -94715,13 +95013,13 @@ axY
aAc
axY
aCp
aDl
bvO
aEk
aEj
aGd
aEl
aEk
aJf
bvR
aKn
aLz
axY
@@ -95231,7 +95529,7 @@ aAd
aCq
aDl
aEm
aEm
bvQ
aEm
aEm
aEm
@@ -15105,7 +15105,7 @@
/area/maintenance/apmaint)
"aEl" = (
/obj/structure/closet/coffin,
/obj/item/toy/figure/librarian,
/obj/item/toy/figure/curator,
/turf/open/floor/plating,
/area/maintenance/apmaint)
"aEm" = (
@@ -32850,10 +32850,6 @@
/turf/open/floor/plasteel/white,
/area/toxins/xenobiology)
"bnU" = (
/obj/machinery/door/airlock/research{
name = "Kill Room Access";
req_access_txt = "55"
},
/obj/structure/disposalpipe/segment{
dir = 4
},
+1 -1
View File
@@ -18,5 +18,5 @@
access += GLOB.access_crematorium
minimal_access += GLOB.access_crematorium
MAP_REMOVE_JOB(librarian)
MAP_REMOVE_JOB(curator)
MAP_REMOVE_JOB(lawyer)
+27 -28
View File
@@ -2501,7 +2501,7 @@
"afq" = (
/obj/machinery/computer/shuttle/pod{
pixel_y = -32;
possible_destinations = "pod_asteroid3";
possible_destinations = "pod_lavaland3";
shuttleId = "pod3"
},
/obj/structure/chair{
@@ -7787,8 +7787,8 @@
"aqG" = (
/obj/docking_port/stationary/random{
dir = 4;
id = "pod_asteroid3";
name = "asteroid"
id = "pod_lavaland3";
name = "lavaland"
},
/turf/open/space,
/area/space)
@@ -12384,7 +12384,7 @@
dir = 5
},
/turf/open/floor/plating,
/area/maintenance/fpmaint)
/area/gateway)
"aBj" = (
/obj/structure/rack{
dir = 8;
@@ -17330,7 +17330,6 @@
/area/hallway/primary/central)
"aMf" = (
/turf/open/floor/plasteel{
desc = "";
icon_state = "L13";
name = "floor"
},
@@ -17836,7 +17835,6 @@
/area/hallway/primary/central)
"aNB" = (
/turf/open/floor/plasteel{
desc = "";
icon_state = "L14"
},
/area/hallway/primary/central)
@@ -19015,6 +19013,12 @@
/turf/open/floor/wood,
/area/library)
"aQr" = (
/obj/structure/closet/crate,
/obj/item/clothing/shoes/workboots/mining,
/obj/item/clothing/under/rank/curator/treasure_hunter,
/obj/item/clothing/suit/curator,
/obj/item/clothing/head/curator,
/obj/item/weapon/storage/backpack/satchel/explorer,
/obj/machinery/light/small,
/turf/open/floor/engine/cult,
/area/library)
@@ -19510,7 +19514,7 @@
/turf/open/floor/wood,
/area/library)
"aRO" = (
/obj/structure/bookcase/random/nonfiction,
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
/area/library)
"aRP" = (
@@ -22141,7 +22145,7 @@
"aYa" = (
/obj/machinery/power/apc{
dir = 8;
name = "Locker Room Maintenance APC";
name = "Aft Port Maintenance APC";
pixel_x = -27;
pixel_y = 2
},
@@ -25154,7 +25158,7 @@
icon_state = "1-8"
},
/turf/open/floor/plating,
/area/maintenance/port)
/area/quartermaster/storage)
"bfl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
@@ -27640,11 +27644,6 @@
/area/bridge/meeting_room)
"bkY" = (
/obj/effect/landmark/blobstart,
/obj/structure/cable{
d1 = 1;
d2 = 8;
icon_state = "1-8"
},
/obj/structure/cable{
d1 = 4;
d2 = 8;
@@ -53823,8 +53822,8 @@
"cpe" = (
/obj/docking_port/stationary/random{
dir = 8;
id = "pod_asteroid2";
name = "asteroid"
id = "pod_lavaland2";
name = "lavaland"
},
/turf/open/space,
/area/space)
@@ -54079,7 +54078,7 @@
/obj/machinery/computer/shuttle/pod{
pixel_x = 0;
pixel_y = -32;
possible_destinations = "pod_asteroid2";
possible_destinations = "pod_lavaland2";
shuttleId = "pod2"
},
/obj/structure/chair{
@@ -57394,8 +57393,8 @@
"cwV" = (
/obj/docking_port/stationary/random{
dir = 8;
id = "pod_asteroid1";
name = "asteroid"
id = "pod_lavaland1";
name = "lavaland"
},
/turf/open/space,
/area/space)
@@ -57508,7 +57507,7 @@
/obj/machinery/computer/shuttle/pod{
pixel_x = 0;
pixel_y = -32;
possible_destinations = "pod_asteroid1";
possible_destinations = "pod_lavaland1";
shuttleId = "pod1"
},
/obj/structure/chair{
@@ -58424,7 +58423,7 @@
"czL" = (
/obj/machinery/computer/shuttle/pod{
pixel_y = -32;
possible_destinations = "pod_asteroid4";
possible_destinations = "pod_lavaland4";
shuttleId = "pod4"
},
/obj/structure/chair{
@@ -58455,8 +58454,8 @@
"czN" = (
/obj/docking_port/stationary/random{
dir = 4;
id = "pod_asteroid4";
name = "asteroid"
id = "pod_lavaland4";
name = "lavaland"
},
/turf/open/space,
/area/space)
@@ -59563,7 +59562,7 @@
},
/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/port)
/area/security/detectives_office)
"cCo" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -88787,7 +88786,7 @@ bda
bca
bgJ
aZP
bjD
bjB
bkY
bmo
bnP
@@ -99635,7 +99634,7 @@ bVu
bVu
bVu
bVu
apQ
bVu
bVu
csw
csw
@@ -106507,7 +106506,7 @@ aIt
aPd
aIt
aRO
aIt
aRO
aUC
aVP
aXu
@@ -106764,7 +106763,7 @@ aNV
aPd
aIt
aRO
aIt
aRO
aIt
aVQ
aXu
+25 -11
View File
@@ -20,7 +20,7 @@
/turf/closed/indestructible/riveted,
/area/space)
"af" = (
/turf/open/floor/holofloor/snow/cold,
/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"ag" = (
/obj/structure/window/reinforced{
@@ -141,7 +141,7 @@
/area/space)
"ax" = (
/obj/structure/flora/bush,
/turf/open/floor/holofloor/snow/cold,
/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"ay" = (
/obj/item/toy/snowball{
@@ -155,7 +155,7 @@
/obj/item/toy/snowball{
pixel_x = -4
},
/turf/open/floor/holofloor/snow/cold,
/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"az" = (
/turf/open/floor/holofloor{
@@ -216,7 +216,7 @@
/area/holodeck/rec_center/court)
"aI" = (
/obj/structure/flora/grass/brown,
/turf/open/floor/holofloor/snow/cold,
/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"aJ" = (
/obj/structure/table,
@@ -268,7 +268,7 @@
/obj/structure/statue/snow/snowman{
anchored = 1
},
/turf/open/floor/holofloor/snow/cold,
/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"aP" = (
/obj/structure/chair/wood/normal{
@@ -282,7 +282,7 @@
/area/holodeck/rec_center/lounge)
"aQ" = (
/obj/structure/chair/wood/wings,
/turf/open/floor/holofloor/snow/cold,
/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"aR" = (
/obj/structure/window/reinforced/tinted{
@@ -303,11 +303,11 @@
/area/holodeck/rec_center/lounge)
"aT" = (
/obj/structure/flora/tree/pine,
/turf/open/floor/holofloor/snow/cold,
/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"aU" = (
/obj/structure/chair/wood,
/turf/open/floor/holofloor/snow/cold,
/turf/open/floor/holofloor/snow,
/area/holodeck/rec_center/winterwonderland)
"aV" = (
/obj/structure/table/wood,
@@ -5586,7 +5586,7 @@
/area/centcom/ferry)
"ot" = (
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/item/clothing/under/rank/librarian/curator,
/obj/item/clothing/under/rank/curator/treasure_hunter,
/obj/item/clothing/under/skirt/black,
/obj/item/clothing/under/shorts/black,
/obj/item/clothing/under/pants/track,
@@ -14883,6 +14883,20 @@
/obj/machinery/computer/emergency_shuttle,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"Me" = (
/obj/machinery/light{
icon_state = "tube1";
dir = 8
},
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"Mf" = (
/obj/machinery/light{
icon_state = "tube1";
dir = 4
},
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
(1,1,1) = {"
aa
@@ -64444,7 +64458,7 @@ Fa
Fh
Fh
Fh
Fh
Me
Fh
Fh
Fa
@@ -65729,7 +65743,7 @@ Fa
Md
Fp
FC
Fh
Mf
Fh
Fh
Fa
+1
View File
@@ -1,6 +1,7 @@
# Configuration for the minibot.py bot starts here
server = "irc.rizon.net"
port = 6667
nudge_port = 45678
channels = ["#asdfgbus", "#botbus"]
defaultchannel = "#asdfgbus"
+1 -1
View File
@@ -73,7 +73,7 @@ def setup_irc_socket():
def setup_nudge_socket():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 45678)) # localhost:45678
s.bind(("", nudge_port)) # localhost:nudge_port
s.listen(5)
logger.info("Nudge socket up and listening")
return s
+2 -1
View File
@@ -1,4 +1,5 @@
#!/usr/bin/env python3
from config import *
import sys
import pickle
import socket
@@ -16,7 +17,7 @@ def pack():
def nudge(data):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", 45678))
s.connect(("localhost", nudge_port))
s.send(data)
s.close()
+4
View File
@@ -13,6 +13,10 @@
#define MC_AVERAGE_FAST(average, current) (0.7 * (average) + 0.3 * (current))
#define MC_AVERAGE(average, current) (0.8 * (average) + 0.2 * (current))
#define MC_AVERAGE_SLOW(average, current) (0.9 * (average) + 0.1 * (current))
#define MC_AVG_FAST_UP_SLOW_DOWN(average, current) (average > current ? MC_AVERAGE_SLOW(average, current) : MC_AVERAGE_FAST(average, current))
#define MC_AVG_SLOW_UP_FAST_DOWN(average, current) (average < current ? MC_AVERAGE_SLOW(average, current) : MC_AVERAGE_FAST(average, current))
#define NEW_SS_GLOBAL(varname) if(varname != src){if(istype(varname)){Recover();qdel(varname);}varname = src;}
#define START_PROCESSING(Processor, Datum) if (!Datum.isprocessing) {Datum.isprocessing = 1;Processor.processing += Datum}
+4
View File
@@ -0,0 +1,4 @@
#define ANTAG_DATUM_CULT /datum/antagonist/cult
#define ANTAG_DATUM_CULT_MASTER /datum/antagonist/cult/master
#define ANTAG_DATUM_CLOCKCULT /datum/antagonist/clockcult
#define ANTAG_DATUM_CLOCKCULT_SILENT /datum/antagonist/clockcult/silent
+7 -7
View File
@@ -37,15 +37,15 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
#define JUDGEMENT_CV_REQ 300
//general component/cooldown things
#define SLAB_PRODUCTION_TIME 900 //how long(deciseconds) slabs require to produce a single component; defaults to 1 minute 30 seconds
#define SLAB_PRODUCTION_TIME 450 //how long(deciseconds) slabs require to produce a single component; defaults to 45 seconds
#define SLAB_SERVANT_SLOWDOWN 300 //how much each servant above 5 slows down slab-based generation; defaults to 30 seconds per sevant
#define SLAB_SERVANT_SLOWDOWN 150 //how much each servant above 5 slows down slab-based generation; defaults to 15 seconds per sevant
#define SLAB_SLOWDOWN_MAXIMUM 2700 //maximum slowdown from additional servants; defaults to 4 minutes 30 seconds
#define SLAB_SLOWDOWN_MAXIMUM 1350 //maximum slowdown from additional servants; defaults to 2 minutes 15 seconds
#define CACHE_PRODUCTION_TIME 600 //how long(deciseconds) caches require to produce a component; defaults to 1 minute
#define CACHE_PRODUCTION_TIME 300 //how long(deciseconds) caches require to produce a component; defaults to 30 seconds
#define ACTIVE_CACHE_SLOWDOWN 100 //how many additional deciseconds caches take to produce a component for each linked cache; defaults to 10 seconds
#define ACTIVE_CACHE_SLOWDOWN 50 //how many additional deciseconds caches take to produce a component for each linked cache; defaults to 5 seconds
#define LOWER_PROB_PER_COMPONENT 10 //how much each component in the cache reduces the weight of getting another of that component type
@@ -87,9 +87,9 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
#define GATEWAY_RATVAR_ARRIVAL 300 //when progress is at or above this, game over ratvar's here everybody go home
#define ARK_SUMMON_COST 3 //how many of each component an Ark costs to summon
#define ARK_SUMMON_COST 5 //how many of each component an Ark costs to summon
#define ARK_CONSUME_COST 7 //how many of each component an Ark needs to consume to activate
#define ARK_CONSUME_COST 15 //how many of each component an Ark needs to consume to activate
//Objective text define
#define CLOCKCULT_OBJECTIVE "Construct the Ark of the Clockwork Justicar and free Ratvar."
+1 -1
View File
@@ -32,7 +32,7 @@
#define BOTANIST (1<<2)
#define COOK (1<<3)
#define JANITOR (1<<4)
#define LIBRARIAN (1<<5)
#define CURATOR (1<<5)
#define QUARTERMASTER (1<<6)
#define CARGOTECH (1<<7)
#define MINER (1<<8)
+5
View File
@@ -1,2 +1,7 @@
#define NO_STUTTER 1
#define TONGUELESS_SPEECH 2
#define LANGUAGE_HIDE_ICON_IF_UNDERSTOOD 4
#define LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD 8
#define LANGUAGE_KNOWN "language_known"
#define LANGUAGE_SHADOWED "language_shadowed"
+12 -5
View File
@@ -16,10 +16,10 @@
#define LIGHTING_BASE_MATRIX \
list \
( \
LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \
LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \
LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \
LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \
1, 1, 1, 0, \
1, 1, 1, 0, \
1, 1, 1, 0, \
1, 1, 1, 0, \
0, 0, 0, 1 \
) \
@@ -78,4 +78,11 @@
#define DYNAMIC_LIGHTING_ENABLED 1 //dynamic lighting enabled
#define DYNAMIC_LIGHTING_FORCED 2 //dynamic lighting enabled even if the area doesn't require power
#define DYNAMIC_LIGHTING_IFSTARLIGHT 3 //dynamic lighting enabled only if starlight is.
#define IS_DYNAMIC_LIGHTING(A) A.dynamic_lighting
#define IS_DYNAMIC_LIGHTING(A) A.dynamic_lighting
//code assumes higher numbers override lower numbers.
#define LIGHTING_NO_UPDATE 0
#define LIGHTING_VIS_UPDATE 1
#define LIGHTING_CHECK_UPDATE 2
#define LIGHTING_FORCE_UPDATE 3
+1
View File
@@ -23,6 +23,7 @@
#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
#define BIOGENERATOR 32 //Uses biomass
#define LIMBGROWER 64 //Uses synthetic flesh
#define SMELTER 128 //uses various minerals
//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
//Modular computer/NTNet defines
+3
View File
@@ -0,0 +1,3 @@
#define CHECKBOX_NONE 0
#define CHECKBOX_GROUP 1
#define CHECKBOX_TOGGLE 2
+15
View File
@@ -201,6 +201,21 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
#define BLOOD_STATE_XENO "xeno"
#define BLOOD_STATE_OIL "oil"
#define BLOOD_STATE_NOT_BLOODY "no blood whatsoever"
//suit sensors: sensor_mode defines
#define SENSOR_OFF 0
#define SENSOR_LIVING 1
#define SENSOR_VITALS 2
#define SENSOR_COORDS 3
//suit sensors: has_sensor defines
#define BROKEN_SENSORS -1
#define NO_SENSORS 0
#define HAS_SENSORS 1
#define LOCKED_SENSORS 2
//Turf wet states
#define TURF_DRY 0
#define TURF_WET_WATER 1
+5
View File
@@ -31,5 +31,10 @@
/////////////
#define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark
#define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run
#define STATUS_EFFECT_MANIAMOTOR /datum/status_effect/maniamotor //disrupts, damages, and confuses the affected as long as they're in range of the motor
#define MAX_MANIA_SEVERITY 100 //how high the mania severity can go
#define MANIA_DAMAGE_TO_CONVERT 90 //how much damage is required before it'll convert affected targets
#define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath.
+1
View File
@@ -46,6 +46,7 @@
#define INIT_ORDER_TICKER 13
#define INIT_ORDER_MAPPING 12
#define INIT_ORDER_ATOMS 11
#define INIT_ORDER_LANGUAGE 10
#define INIT_ORDER_MACHINES 9
#define INIT_ORDER_SHUTTLE 3
#define INIT_ORDER_TIMER 1
-18
View File
@@ -1,18 +0,0 @@
diff a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm (rejected hunks)
@@ -26,4 +26,13 @@
#define INITIALIZE_HINT_NORMAL 0 //Nothing happens
#define INITIALIZE_HINT_LATELOAD 1 //Call LateInitialize
-#define INITIALIZE_HINT_QDEL 2 //Call qdel on the atom
\ No newline at end of file
+#define INITIALIZE_HINT_QDEL 2 //Call qdel on the atom
+
+//type and all subtypes should always call Initialize in New()
+#define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){\
+ ..();\
+ if(!initialized) {\
+ args[1] = TRUE;\
+ SSatoms.InitAtom(src, args);\
+ }\
+}
\ No newline at end of file
+1
View File
@@ -457,6 +457,7 @@
#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null)
#define LAZYLEN(L) length(L)
#define LAZYCLEARLIST(L) if(L) L.Cut()
#define SANITIZE_LIST(L) ( islist(L) ? L : list() )
/* Definining a counter as a series of key -> numeric value entries
+17 -20
View File
@@ -20,13 +20,13 @@
/proc/log_admin(text)
GLOB.admin_log.Add(text)
if (config.log_admin)
GLOB.diary << "\[[time_stamp()]]ADMIN: [text]"
GLOB.world_game_log << "\[[time_stamp()]]ADMIN: [text]"
//Items using this proc are stripped from public logs - use with caution
/proc/log_admin_private(text)
GLOB.admin_log.Add(text)
if (config.log_admin)
GLOB.diary << "\[[time_stamp()]]ADMINPRIVATE: [text]"
GLOB.world_game_log << "\[[time_stamp()]]ADMINPRIVATE: [text]"
/proc/log_adminsay(text)
if (config.log_adminchat)
@@ -38,67 +38,64 @@
/proc/log_game(text)
if (config.log_game)
GLOB.diary << "\[[time_stamp()]]GAME: [text]"
GLOB.world_game_log << "\[[time_stamp()]]GAME: [text]"
/proc/log_vote(text)
if (config.log_vote)
GLOB.diary << "\[[time_stamp()]]VOTE: [text]"
GLOB.world_game_log << "\[[time_stamp()]]VOTE: [text]"
/proc/log_access(text)
if (config.log_access)
GLOB.diary << "\[[time_stamp()]]ACCESS: [text]"
GLOB.world_game_log << "\[[time_stamp()]]ACCESS: [text]"
/proc/log_say(text)
if (config.log_say)
GLOB.diary << "\[[time_stamp()]]SAY: [text]"
GLOB.world_game_log << "\[[time_stamp()]]SAY: [text]"
/proc/log_prayer(text)
if (config.log_prayer)
GLOB.diary << "\[[time_stamp()]]PRAY: [text]"
GLOB.world_game_log << "\[[time_stamp()]]PRAY: [text]"
/proc/log_law(text)
if (config.log_law)
GLOB.diary << "\[[time_stamp()]]LAW: [text]"
GLOB.world_game_log << "\[[time_stamp()]]LAW: [text]"
/proc/log_ooc(text)
if (config.log_ooc)
GLOB.diary << "\[[time_stamp()]]OOC: [text]"
GLOB.world_game_log << "\[[time_stamp()]]OOC: [text]"
/proc/log_whisper(text)
if (config.log_whisper)
GLOB.diary << "\[[time_stamp()]]WHISPER: [text]"
GLOB.world_game_log << "\[[time_stamp()]]WHISPER: [text]"
/proc/log_emote(text)
if (config.log_emote)
GLOB.diary << "\[[time_stamp()]]EMOTE: [text]"
GLOB.world_game_log << "\[[time_stamp()]]EMOTE: [text]"
/proc/log_attack(text)
if (config.log_attack)
GLOB.diaryofmeanpeople << "\[[time_stamp()]]ATTACK: [text]"
GLOB.world_attack_log << "\[[time_stamp()]]ATTACK: [text]"
/proc/log_pda(text)
if (config.log_pda)
GLOB.diary << "\[[time_stamp()]]PDA: [text]"
GLOB.world_game_log << "\[[time_stamp()]]PDA: [text]"
/proc/log_comment(text)
if (config.log_pda)
//reusing the PDA option because I really don't think news comments are worth a config option
GLOB.diary << "\[[time_stamp()]]COMMENT: [text]"
GLOB.world_game_log << "\[[time_stamp()]]COMMENT: [text]"
/proc/log_chat(text)
if (config.log_pda)
GLOB.diary << "\[[time_stamp()]]CHAT: [text]"
GLOB.world_game_log << "\[[time_stamp()]]CHAT: [text]"
/proc/log_sql(text)
if(config.sql_enabled)
GLOB.diary << "\[[time_stamp()]]SQL: [text]"
GLOB.world_game_log << "\[[time_stamp()]]SQL: [text]"
//This replaces world.log so it displays both in DD and the file
/proc/log_world(text)
if(config && config.log_runtimes)
world.log = GLOB.runtime_diary
world.log << text
world.log = null
GLOB.world_runtime_log << text
world.log << text
// Helper procs for building detailed log lines
-37
View File
@@ -1,37 +0,0 @@
#define YOUNG 4
/client/proc/join_date_check(y,m,d)
var/datum/DBQuery/query_datediff = SSdbcore.NewQuery("SELECT DATEDIFF(Now(),'[y]-[m]-[d]')")
if(!query_datediff.Execute())
return FALSE
if(query_datediff.NextRow())
var/diff = text2num(query_datediff.item[1])
if(config.use_account_age_for_jobs)
player_age = max(0,diff) //So job code soesn't freak out if they are time traveling.
if(diff < YOUNG)
var/msg = "(IP: [address], ID: [computer_id]) is a new BYOND account made on [y]-[m]-[d]."
if(diff < 0)
msg += " They are also apparently from the future."
message_admins("[key_name_admin(src)] [msg]")
return TRUE
#undef YOUNG
/client/proc/findJoinDate()
var/http[] = world.Export("http://byond.com/members/[src.ckey]?format=text")
if(!http)
log_world("Failed to connect to byond age check for [src.ckey]")
return FALSE
var/F = file2text(http["CONTENT"])
if(F)
var/regex/R = regex("joined = \"(\\d{4})-(\\d{2})-(\\d{2})\"")
if(!R.Find(F))
CRASH("Age check regex failed")
var/y = R.group[1]
var/m = R.group[2]
var/d = R.group[3]
return join_date_check(y,m,d)
+97 -32
View File
@@ -6,6 +6,7 @@
)
#define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL))
#define CULT_POLL_WAIT 2400
/proc/get_area(atom/A)
if (!istype(A))
@@ -313,10 +314,10 @@
// Will return a list of active candidates. It increases the buffer 5 times until it finds a candidate which is active within the buffer.
/proc/get_candidates(be_special_type, afk_bracket = config.inactivity_period, jobbanType)
/proc/get_candidates(be_special_type, afk_bracket = config.inactivity_period, jobbanType)
var/list/candidates = list()
// Keep looping until we find a non-afk candidate within the time bracket (we limit the bracket to 10 minutes (6000))
while(!candidates.len && afk_bracket < config.afk_period)
while(!candidates.len && afk_bracket < config.afk_period)
for(var/mob/dead/observer/G in GLOB.player_list)
if(G.client != null)
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
@@ -414,68 +415,83 @@
return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y)
/proc/showCandidatePollWindow(mob/dead/observer/G, poll_time, Question, list/candidates, ignore_category, time_passed, flashwindow = TRUE)
/proc/showCandidatePollWindow(mob/M, poll_time, Question, list/candidates, ignore_category, time_passed, flashwindow = TRUE)
set waitfor = 0
G << 'sound/misc/notice2.ogg' //Alerting them to their consideration
M << 'sound/misc/notice2.ogg' //Alerting them to their consideration
if(flashwindow)
window_flash(G.client)
switch(ignore_category ? askuser(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No","Never for this round", StealFocus=0, Timeout=poll_time) : askuser(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No", StealFocus=0, Timeout=poll_time))
window_flash(M.client)
switch(ignore_category ? askuser(M,Question,"Please answer in [poll_time/10] seconds!","Yes","No","Never for this round", StealFocus=0, Timeout=poll_time) : askuser(M,Question,"Please answer in [poll_time/10] seconds!","Yes","No", StealFocus=0, Timeout=poll_time))
if(1)
to_chat(G, "<span class='notice'>Choice registered: Yes.</span>")
to_chat(M, "<span class='notice'>Choice registered: Yes.</span>")
if((world.time-time_passed)>poll_time)
to_chat(G, "<span class='danger'>Sorry, you were too late for the consideration!</span>")
G << 'sound/machines/buzz-sigh.ogg'
to_chat(M, "<span class='danger'>Sorry, you answered too late to be considered!</span>")
M << 'sound/machines/buzz-sigh.ogg'
candidates -= M
else
candidates += G
candidates += M
if(2)
to_chat(G, "<span class='danger'>Choice registered: No.</span>")
to_chat(M, "<span class='danger'>Choice registered: No.</span>")
candidates -= M
if(3)
var/list/L = GLOB.poll_ignore[ignore_category]
if(!L)
GLOB.poll_ignore[ignore_category] = list()
GLOB.poll_ignore[ignore_category] += G.ckey
to_chat(G, "<span class='danger'>Choice registered: Never for this round.</span>")
GLOB.poll_ignore[ignore_category] += M.ckey
to_chat(M, "<span class='danger'>Choice registered: Never for this round.</span>")
candidates -= M
else
candidates -= M
/proc/pollCandidates(var/Question, var/jobbanType, var/datum/game_mode/gametypeCheck, var/be_special_flag = 0, var/poll_time = 300, var/ignore_category = null, flashwindow = TRUE)
var/list/mob/dead/observer/candidates = list()
/proc/pollGhostCandidates(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE)
var/list/candidates = list()
for(var/mob/dead/observer/G in GLOB.player_list)
candidates += G
pollCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category, flashwindow, candidates)
return candidates
/proc/pollCandidates(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE, list/group = null)
var/time_passed = world.time
if (!Question)
Question = "Would you like to be a special role?"
for(var/mob/dead/observer/G in GLOB.player_list)
if(!G.key || !G.client || (ignore_category && GLOB.poll_ignore[ignore_category] && G.ckey in GLOB.poll_ignore[ignore_category]))
for(var/m in group)
var/mob/M = m
if(!M.key || !M.client || (ignore_category && GLOB.poll_ignore[ignore_category] && M.ckey in GLOB.poll_ignore[ignore_category]))
continue
if(be_special_flag)
if(!(G.client.prefs) || !(be_special_flag in G.client.prefs.be_special))
if(!(M.client.prefs) || !(be_special_flag in M.client.prefs.be_special))
continue
if (gametypeCheck)
if(!gametypeCheck.age_check(G.client))
if(gametypeCheck)
if(!gametypeCheck.age_check(M.client))
continue
if (jobbanType)
if(jobban_isbanned(G, jobbanType) || jobban_isbanned(G, "Syndicate"))
if(jobbanType)
if(jobban_isbanned(M, jobbanType) || jobban_isbanned(M, "Syndicate"))
continue
showCandidatePollWindow(G, poll_time, Question, candidates, ignore_category, time_passed, flashwindow)
showCandidatePollWindow(M, poll_time, Question, group, ignore_category, time_passed, flashwindow)
sleep(poll_time)
//Check all our candidates, to make sure they didn't log off during the wait period.
for(var/mob/dead/observer/G in candidates)
if(!G.key || !G.client)
candidates.Remove(G)
//Check all our candidates, to make sure they didn't log off or get deleted during the wait period.
for(var/mob/M in group)
if(!M.key || !M.client)
group -= M
listclearnulls(candidates)
listclearnulls(group)
return candidates
return group
/proc/pollCandidatesForMob(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, mob/M, ignore_category = null)
var/list/L = pollCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category)
var/list/L = pollGhostCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category)
if(!M || QDELETED(M) || !M.loc)
return list()
return L
/proc/pollCandidatesForMobs(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, list/mobs, ignore_category = null)
var/list/L = pollCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category)
var/list/L = pollGhostCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category)
var/i=1
for(var/v in mobs)
var/atom/A = v
@@ -485,6 +501,55 @@
++i
return L
/proc/pollCultists(var/mob/living/Nominee) // Cult Master Poll
if(world.time < CULT_POLL_WAIT)
to_chat(Nominee, "It would be premature to select a leader while everyone is still settling in, try again in [round((CULT_POLL_WAIT-world.time)/10)] seconds.")
return
for(var/datum/mind/B in SSticker.mode.cult)
if(B.current)
B.current.verbs -= /mob/living/proc/cult_master
if(!B.current.incapacitated())
B.current << 'sound/hallucinations/im_here1.ogg'
to_chat(B.current, "<span class='cultlarge'>Acolyte [Nominee] has asserted that they are worthy of leading the cult. A vote will be called shortly.</span>")
sleep(250)
var/list/asked_cultists = list()
for(var/datum/mind/B in SSticker.mode.cult)
if(B.current && B.current != Nominee && !B.current.incapacitated())
B.current << 'sound/magic/exit_blood.ogg'
asked_cultists += B.current
var/list/yes_voters = pollCandidates("[Nominee] seeks to lead your cult, do you support [Nominee.p_them()]?", poll_time = 1200, group = asked_cultists)
sleep(300)
if(QDELETED(Nominee) || Nominee.incapacitated())
for(var/datum/mind/B in SSticker.mode.cult)
if(B.current)
B.current.verbs += /mob/living/proc/cult_master
if(!B.current.incapacitated())
to_chat(B.current,"<span class='cultlarge'>[Nominee] has died in the process of attempting to win the cult's support!")
return FALSE
if(!Nominee.mind)
for(var/datum/mind/B in SSticker.mode.cult)
if(B.current)
B.current.verbs += /mob/living/proc/cult_master
if(!B.current.incapacitated())
to_chat(B.current,"<span class='cultlarge'>[Nominee] has gone insane and catatonic in the process of attempting to win the cult's support!")
return FALSE
if(LAZYLEN(yes_voters) <= LAZYLEN(asked_cultists) * 0.5)
for(var/datum/mind/B in SSticker.mode.cult)
if(B.current)
B.current.verbs += /mob/living/proc/cult_master
if(!B.current.incapacitated())
to_chat(B.current, "<span class='cultlarge'>[Nominee] could not win the cult's support and shall continue to serve as an acolyte.")
return FALSE
SSticker.mode.remove_cultist(Nominee.mind, FALSE)
Nominee.mind.add_antag_datum(ANTAG_DATUM_CULT_MASTER)
GLOB.cult_mastered = TRUE
for(var/datum/mind/B in SSticker.mode.cult)
if(!B.current.incapacitated())
to_chat(B.current,"<span class='cultlarge'>[Nominee] has won the cult's support and is now their master. Follow [Nominee.p_their()] orders to the best of your ability!")
return TRUE
/proc/poll_helper(var/mob/living/M)
/proc/makeBody(mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character
if(!G_found || !G_found.key)
return
@@ -513,7 +578,7 @@
winset(C, "mainwindow", "flash=5")
/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank)
if(SSticker.current_state != GAME_STATE_PLAYING || !character)
if(!SSticker.IsRoundInProgress() || !character)
return
var/area/A = get_area(character)
var/message = "<span class='game deadsay'><span class='name'>\
-1
View File
@@ -24,7 +24,6 @@
//doesn't have an object argument because this is "Stacking" with the animate call above
//3 billion% intentional
//Dumps the matrix data in format a-f
/matrix/proc/tolist()
. = list()
+1 -1
View File
@@ -24,4 +24,4 @@ GLOBAL_LIST_EMPTY(whitelisted_species_list)
/proc/log_mentor(text)
GLOB.mentor_log.Add(text)
GLOB.diary << "\[[time_stamp()]]MENTOR: [text]"
GLOB.world_game_log << "\[[time_stamp()]]MENTOR: [text]"
+1
View File
@@ -1342,6 +1342,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
//This prevents RCEs from badmins
//kevinz000 if you touch this I will hunt you down
GLOBAL_VAR_INIT(valid_HTTPSGet, FALSE)
GLOBAL_PROTECT(valid_HTTPSGet)
/proc/HTTPSGet(url)
if(findtext(url, "\""))
GLOB.valid_HTTPSGet = FALSE
+9
View File
@@ -3,3 +3,12 @@ GLOBAL_VAR_INIT(secret_force_mode, "secret") // if this is anything but "secret"
GLOBAL_VAR_INIT(wavesecret, 0) // meteor mode, delays wave progression, terrible name
GLOBAL_DATUM(start_state, /datum/station_state) // Used in round-end report
// Cult, needs to be global so admin cultists are functional
GLOBAL_VAR_INIT(blood_target, null) // Cult Master's target or Construct's Master
GLOBAL_DATUM(blood_target_image, /image)
GLOBAL_DATUM(sac_mind, /datum/mind)
GLOBAL_VAR_INIT(sac_image, null)
GLOBAL_VAR_INIT(cult_mastered, FALSE)
GLOBAL_VAR_INIT(reckoning_complete, FALSE)
GLOBAL_VAR_INIT(sac_complete, FALSE)
@@ -104,5 +104,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/weapon/storage/secure/briefcase = 3,
/obj/item/weapon/storage/toolbox/artistic = 2,
/obj/item/toy/eightball = 1,
/obj/item/weapon/storage/daki = 3,
"" = 3
))
+5 -2
View File
@@ -11,6 +11,7 @@ GLOBAL_LIST_EMPTY(stealthminID) //reference list with IDs that store ckeys,
GLOBAL_LIST_EMPTY(player_list) //all mobs **with clients attached**. Excludes /mob/dead/new_player
GLOBAL_LIST_EMPTY(mob_list) //all mobs, including clientless
GLOBAL_LIST_EMPTY(mob_directory) //mob_id -> mob
GLOBAL_LIST_EMPTY(living_mob_list) //all alive mobs, including clientless. Excludes /mob/dead/new_player
GLOBAL_LIST_EMPTY(dead_mob_list) //all dead mobs, including clientless. Excludes /mob/dead/new_player
GLOBAL_LIST_EMPTY(joined_player_list) //all clients that have joined the game at round-start or as a latejoin.
@@ -18,5 +19,7 @@ GLOBAL_LIST_EMPTY(silicon_mobs) //all silicon mobs
GLOBAL_LIST_EMPTY(ai_list)
GLOBAL_LIST_EMPTY(pai_list)
GLOBAL_LIST_EMPTY(available_ai_shells)
GLOBAL_LIST_EMPTY(language_datums)
GLOBAL_LIST_EMPTY(simple_animals)
GLOBAL_LIST_EMPTY(simple_animals)
GLOBAL_LIST_EMPTY(language_datum_instances)
GLOBAL_LIST_EMPTY(all_languages)
+19 -19
View File
@@ -1,23 +1,23 @@
GLOBAL_LIST_INIT(ai_names, world.file2list("config/names/ai.txt"))
GLOBAL_LIST_INIT(wizard_first, world.file2list("config/names/wizardfirst.txt"))
GLOBAL_LIST_INIT(wizard_second, world.file2list("config/names/wizardsecond.txt"))
GLOBAL_LIST_INIT(ninja_titles, world.file2list("config/names/ninjatitle.txt"))
GLOBAL_LIST_INIT(ninja_names, world.file2list("config/names/ninjaname.txt"))
GLOBAL_LIST_INIT(commando_names, world.file2list("config/names/death_commando.txt"))
GLOBAL_LIST_INIT(first_names_male, world.file2list("config/names/first_male.txt"))
GLOBAL_LIST_INIT(first_names_female, world.file2list("config/names/first_female.txt"))
GLOBAL_LIST_INIT(last_names, world.file2list("config/names/last.txt"))
GLOBAL_LIST_INIT(lizard_names_male, world.file2list("config/names/lizard_male.txt"))
GLOBAL_LIST_INIT(lizard_names_female, world.file2list("config/names/lizard_female.txt"))
GLOBAL_LIST_INIT(clown_names, world.file2list("config/names/clown.txt"))
GLOBAL_LIST_INIT(mime_names, world.file2list("config/names/mime.txt"))
GLOBAL_LIST_INIT(carp_names, world.file2list("config/names/carp.txt"))
GLOBAL_LIST_INIT(golem_names, world.file2list("config/names/golem.txt"))
GLOBAL_LIST_INIT(plasmaman_names, world.file2list("config/names/plasmaman.txt"))
GLOBAL_LIST_INIT(posibrain_names, list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO","RR","CHRI","CDB","HG","XSI","ORNG","GUN","KOR","MET","FRE","XIS","SLI","PKP","HOG","RZH","GOOF","MRPR","JJR","FIRC","INC","PHL","BGB","ANTR","MIW","WJ","JRD","CHOC","ANCL","JLLO","JNLG","KOS","TKRG","XAL","STLP","CBOS","DUNC","FXMC","DRSD","COI"))
GLOBAL_LIST_INIT(ai_names, world.file2list("strings/names/ai.txt"))
GLOBAL_LIST_INIT(wizard_first, world.file2list("strings/names/wizardfirst.txt"))
GLOBAL_LIST_INIT(wizard_second, world.file2list("strings/names/wizardsecond.txt"))
GLOBAL_LIST_INIT(ninja_titles, world.file2list("strings/names/ninjatitle.txt"))
GLOBAL_LIST_INIT(ninja_names, world.file2list("strings/names/ninjaname.txt"))
GLOBAL_LIST_INIT(commando_names, world.file2list("strings/names/death_commando.txt"))
GLOBAL_LIST_INIT(first_names_male, world.file2list("strings/names/first_male.txt"))
GLOBAL_LIST_INIT(first_names_female, world.file2list("strings/names/first_female.txt"))
GLOBAL_LIST_INIT(last_names, world.file2list("strings/names/last.txt"))
GLOBAL_LIST_INIT(lizard_names_male, world.file2list("strings/names/lizard_male.txt"))
GLOBAL_LIST_INIT(lizard_names_female, world.file2list("strings/names/lizard_female.txt"))
GLOBAL_LIST_INIT(clown_names, world.file2list("strings/names/clown.txt"))
GLOBAL_LIST_INIT(mime_names, world.file2list("strings/names/mime.txt"))
GLOBAL_LIST_INIT(carp_names, world.file2list("strings/names/carp.txt"))
GLOBAL_LIST_INIT(golem_names, world.file2list("strings/names/golem.txt"))
GLOBAL_LIST_INIT(plasmaman_names, world.file2list("strings/names/plasmaman.txt"))
GLOBAL_LIST_INIT(posibrain_names, world.file2list("strings/names/posibrain.txt"))
GLOBAL_LIST_INIT(verbs, world.file2list("config/names/verbs.txt"))
GLOBAL_LIST_INIT(adjectives, world.file2list("config/names/adjectives.txt"))
GLOBAL_LIST_INIT(verbs, world.file2list("strings/names/verbs.txt"))
GLOBAL_LIST_INIT(adjectives, world.file2list("strings/names/adjectives.txt"))
//loaded on startup because of "
//would include in rsc if ' was used
+1
View File
@@ -29,6 +29,7 @@ GLOBAL_LIST_EMPTY(zombie_infection_list) // A list of all zombie_infection org
GLOBAL_LIST_EMPTY(meteor_list) // List of all meteors.
GLOBAL_LIST_EMPTY(active_jammers) // List of active radio jammers
GLOBAL_LIST_EMPTY(ladders)
GLOBAL_LIST_EMPTY(trophy_cases)
GLOBAL_LIST_EMPTY(wire_color_directory)
GLOBAL_LIST_EMPTY(wire_name_directory)
+1
View File
@@ -5,5 +5,6 @@
#define POLL_IGNORE_POSSESSED_BLADE "possessed_blade"
#define POLL_IGNORE_ALIEN_LARVA "alien_larva"
#define POLL_IGNORE_CLOCKWORK_MARAUDER "clockwork_marauder"
#define POLL_IGNORE_SYNDICATE "syndicate"
GLOBAL_LIST_EMPTY(poll_ignore)
+33 -27
View File
@@ -1,28 +1,34 @@
GLOBAL_VAR(diary)
GLOBAL_PROTECT(diary)
GLOBAL_VAR(runtime_diary)
GLOBAL_PROTECT(runtime_diary)
GLOBAL_VAR(diaryofmeanpeople)
GLOBAL_PROTECT(diaryofmeanpeople)
GLOBAL_VAR(href_logfile)
GLOBAL_PROTECT(href_logfile)
GLOBAL_LIST_EMPTY(bombers)
GLOBAL_PROTECT(bombers)
GLOBAL_LIST_EMPTY(admin_log)
GLOBAL_PROTECT(admin_log)
GLOBAL_LIST_EMPTY(lastsignalers) //keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]"
GLOBAL_PROTECT(lastsignalers)
GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
GLOBAL_PROTECT(lawchanges)
GLOBAL_LIST_EMPTY(combatlog)
GLOBAL_PROTECT(combatlog)
GLOBAL_LIST_EMPTY(IClog)
GLOBAL_PROTECT(IClog)
GLOBAL_LIST_EMPTY(OOClog)
GLOBAL_PROTECT(OOClog)
GLOBAL_LIST_EMPTY(adminlog)
GLOBAL_PROTECT(adminlog)
GLOBAL_VAR(log_directory)
GLOBAL_PROTECT(log_directory)
GLOBAL_VAR(world_game_log)
GLOBAL_PROTECT(world_game_log)
GLOBAL_VAR(world_runtime_log)
GLOBAL_PROTECT(world_runtime_log)
GLOBAL_VAR(world_attack_log)
GLOBAL_PROTECT(world_attack_log)
GLOBAL_VAR(world_href_log)
GLOBAL_PROTECT(world_href_log)
GLOBAL_VAR(round_id)
GLOBAL_PROTECT(round_id)
GLOBAL_VAR(config_error_log)
GLOBAL_PROTECT(config_error_log)
GLOBAL_LIST_EMPTY(bombers)
GLOBAL_PROTECT(bombers)
GLOBAL_LIST_EMPTY(admin_log)
GLOBAL_PROTECT(admin_log)
GLOBAL_LIST_EMPTY(lastsignalers) //keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]"
GLOBAL_PROTECT(lastsignalers)
GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
GLOBAL_PROTECT(lawchanges)
GLOBAL_LIST_EMPTY(combatlog)
GLOBAL_PROTECT(combatlog)
GLOBAL_LIST_EMPTY(IClog)
GLOBAL_PROTECT(IClog)
GLOBAL_LIST_EMPTY(OOClog)
GLOBAL_PROTECT(OOClog)
GLOBAL_LIST_EMPTY(adminlog)
GLOBAL_PROTECT(adminlog)
GLOBAL_LIST_EMPTY(active_turfs_startlist)
+80 -47
View File
@@ -107,64 +107,112 @@
var/obj/item/W = get_active_held_item()
if(W == A)
W.attack_self(src)
update_inv_hands()
return
// operate three levels deep here (item in backpack in src; item in box in backpack in src, not any deeper)
if(A.ClickAccessible(src, depth=INVENTORY_DEPTH))
// No adjacency needed
//These are always reachable.
//User itself, current loc, and user inventory
if(DirectAccess(A))
if(W)
melee_item_attack_chain(src, W, A, params)
melee_item_attack_chain(src,W,A,params)
else
if(ismob(A))
changeNext_move(CLICK_CD_MELEE)
UnarmedAttack(A)
return
if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that
//Can't reach anything else in lockers or other weirdness
if(!loc.AllowClick())
return
// Allows you to click on a box's contents, if that box is on the ground, but no deeper than that
if(isturf(A) || isturf(A.loc) || (A.loc && isturf(A.loc.loc)))
if(Adjacent(A) || (W && CheckReach(src, A, W.reach))) //Adjacent or reaching attacks
if(W)
melee_item_attack_chain(src, W, A, params)
else
if(ismob(A))
changeNext_move(CLICK_CD_MELEE)
UnarmedAttack(A, 1)
return
else // non-adjacent click
if(W)
W.afterattack(A,src,0,params) // 0: not Adjacent
else
RangedAttack(A, params)
//Standard reach turf to turf or reaching inside storage
if(CanReach(A,W))
if(W)
melee_item_attack_chain(src,W,A,params)
else
if(ismob(A))
changeNext_move(CLICK_CD_MELEE)
UnarmedAttack(A,1)
else
if(W)
W.afterattack(A,src,0,params)
else
RangedAttack(A,params)
/atom/movable/proc/CanReach(atom/target,obj/item/tool,view_only = FALSE)
if(isturf(target) || isturf(target.loc) || DirectAccess(target)) //Directly accessible atoms
if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks
return TRUE
else
//Things inside storage insde another storage
//Eg Contents of a box in a backpack
var/atom/outer_storage = get_atom_on_turf(target)
if(outer_storage == target) //whatever that is we don't want infinite loop.
return FALSE
if(outer_storage && CanReach(outer_storage,tool) && outer_storage.CanReachStorage(target,src,view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH))
return TRUE
return FALSE
//Can [target] in this container be reached by [user], can't be more than [depth] levels deep
/atom/proc/CanReachStorage(atom/target,user,depth)
return FALSE
/obj/item/weapon/storage/CanReachStorage(atom/target,user,depth)
while(target && depth > 0)
target = target.loc
depth--
if(target == src)
return TRUE
return FALSE
/atom/movable/proc/DirectAccess(atom/target)
if(target == src)
return TRUE
if(target == loc)
return TRUE
/mob/DirectAccess(atom/target)
if(..())
return TRUE
if(target in contents) //This could probably use moving down and restricting to inventory only
return TRUE
return FALSE
/mob/living/DirectAccess(atom/target)
if(..()) //Lightweight checks first
return TRUE
if(target in GetAllContents())
return TRUE
/atom/proc/AllowClick()
return FALSE
/turf/AllowClick()
return TRUE
/proc/CheckReach(atom/movable/here, atom/movable/there, reach)
/proc/CheckToolReach(atom/movable/here, atom/movable/there, reach)
if(!here || !there)
return
switch(reach)
if(0)
return here.loc == there.loc
return FALSE
if(1)
return here.Adjacent(there)
return FALSE //here.Adjacent(there)
if(2 to INFINITY)
var/obj/dummy = new(get_turf(here)) //We'll try to move this every tick, failing if we can't
var/obj/dummy = new(get_turf(here))
dummy.pass_flags |= PASSTABLE
dummy.invisibility = INVISIBILITY_ABSTRACT
for(var/i in 1 to reach) //Limit it to that many tries
var/turf/T = get_step(dummy, get_dir(dummy, there))
if(dummy.loc == there.loc)
if(dummy.CanReach(there))
qdel(dummy)
return 1
if(there.density && dummy in range(1, there)) //For windows and suchlike
qdel(dummy)
return 1
return TRUE
if(!dummy.Move(T)) //we're blocked!
qdel(dummy)
return
qdel(dummy)
// Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click)
/mob/proc/DblClickOn(atom/A, params)
@@ -304,21 +352,6 @@
/atom/proc/CtrlShiftClick(mob/user)
return
/*
Helper to check can the mob click/access an item.
Used by mob inventory and storage items.
*/
/atom/proc/ClickAccessible(mob/user, depth=1)
if(src == user.loc || (src in user.contents))
return TRUE
if(loc && depth > 1)
return loc.ClickAccessible(user, depth-1)
/turf/ClickAccessible(mob/user, depth=1)
return
/*
Misc helpers
+11 -6
View File
@@ -21,7 +21,7 @@
#define ui_inventory "WEST:6,SOUTH:5"
//Middle left indicators
#define ui_lingchemdisplay "WEST:6,CENTER-1:15"
#define ui_lingchemdisplay "WEST,CENTER-1:15"
#define ui_lingstingdisplay "WEST:6,CENTER-3:11"
#define ui_crafting "12:-10,1:5"
#define ui_building "12:-10,1:21"
@@ -104,12 +104,17 @@
#define ui_health "EAST-1:28,CENTER-1:15"
#define ui_internal "EAST-1:28,CENTER:17"
//borgs and aliens
#define ui_alien_nightvision "EAST-1:28,CENTER:17"
//borgs
#define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator.
#define ui_alien_health "EAST-1:28,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator.
#define ui_alienplasmadisplay "EAST-1:28,CENTER-2:15"
#define ui_alien_queen_finder "EAST-1:28,CENTER-3:15"
//aliens
#define ui_alien_health "EAST,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator.
#define ui_alienplasmadisplay "EAST,CENTER-2:15"
#define ui_alien_queen_finder "EAST,CENTER-3:15"
//constructs
#define ui_construct_pull "EAST,CENTER-2:15"
#define ui_construct_health "EAST,CENTER:15" //same as borgs and humans
// AI
+99
View File
@@ -42,6 +42,7 @@
thealert.override_alerts = override
if(override)
thealert.timeout = null
thealert.mob_viewer = src
if(new_master)
var/old_layer = new_master.layer
@@ -96,6 +97,7 @@
var/severity = 0
var/alerttooltipstyle = ""
var/override_alerts = FALSE //If it is overriding other alerts of the same type
var/mob/mob_viewer //the mob viewing this alert
/obj/screen/alert/MouseEntered(location,control,params)
@@ -256,6 +258,102 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
icon_state = "blobbernaut_nofactory"
alerttooltipstyle = "blob"
// BLOODCULT
/obj/screen/alert/bloodsense
name = "Blood Sense"
desc = "Allows you to sense blood that is manipulated by dark magicks."
icon_state = "cult_sense"
alerttooltipstyle = "cult"
var/static/image/narnar
var/angle = 0
var/mob/living/simple_animal/hostile/construct/Cviewer = null
/obj/screen/alert/bloodsense/Initialize()
. = ..()
if(!narnar)
narnar = new('icons/mob/screen_alert.dmi', "mini_nar")
START_PROCESSING(SSprocessing, src)
/obj/screen/alert/bloodsense/Destroy()
Cviewer = null
STOP_PROCESSING(SSprocessing, src)
return ..()
/obj/screen/alert/bloodsense/process()
var/atom/blood_target
if(GLOB.blood_target)
if(!get_turf(GLOB.blood_target))
GLOB.blood_target = null
else
blood_target = GLOB.blood_target
if(Cviewer)
if(Cviewer.seeking && Cviewer.master)
blood_target = Cviewer.master
if(!blood_target && !GLOB.sac_complete)
if(icon_state == "runed_sense0")
return
animate(src, transform = null, time = 1, loop = 0)
angle = 0
cut_overlays()
icon_state = "runed_sense0"
desc = "Nar-Sie demands that [GLOB.sac_mind] be sacrificed before the summoning ritual can begin."
add_overlay(GLOB.sac_image)
return
if(!blood_target && GLOB.sac_complete)
if(icon_state == "runed_sense1")
return
animate(src, transform = null, time = 1, loop = 0)
angle = 0
cut_overlays()
icon_state = "runed_sense1"
desc = "The sacrifice is complete, prepare to summon Nar-Sie!"
add_overlay(narnar)
return
if(!blood_target)
return
var/turf/P = get_turf(blood_target)
var/turf/Q = get_turf(mob_viewer)
var/area/A = get_area(P)
if(P.z != Q.z) //The target is on a different Z level, we cannot sense that far.
return
desc = "You are currently tracking [blood_target] in [A.name]."
var/target_angle = Get_Angle(Q, P)
var/target_dist = get_dist(P, Q)
cut_overlays()
switch(target_dist)
if(0 to 1)
icon_state = "runed_sense2"
if(2 to 8)
icon_state = "arrow8"
if(9 to 15)
icon_state = "arrow7"
if(16 to 22)
icon_state = "arrow6"
if(23 to 29)
icon_state = "arrow5"
if(30 to 36)
icon_state = "arrow4"
if(37 to 43)
icon_state = "arrow3"
if(44 to 50)
icon_state = "arrow2"
if(51 to 57)
icon_state = "arrow1"
if(58 to 64)
icon_state = "arrow0"
if(65 to 400)
icon_state = "arrow"
var/difference = target_angle - angle
angle = target_angle
if(!difference)
return
var/matrix/final = matrix(transform)
final.Turn(difference)
animate(src, transform = final, time = 5, loop = 0)
// CLOCKCULT
/obj/screen/alert/clockwork
alerttooltipstyle = "clockcult"
@@ -393,6 +491,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
textlist += "<br>"
else
textlist += "Seconds until Ratvar's arrival: <b>[G.get_arrival_text(TRUE)]</b><br>"
break
if(unconverted_ais_exist)
if(unconverted_ais_exist > 1)
textlist += "<b>[unconverted_ais_exist] unconverted AIs exist!</b><br>"
+18
View File
@@ -0,0 +1,18 @@
/datum/hud/construct
ui_style_icon = 'icons/mob/screen_construct.dmi'
/datum/hud/construct/New(mob/owner)
..()
pull_icon = new /obj/screen/pull()
pull_icon.icon = ui_style_icon
pull_icon.update_icon(mymob)
pull_icon.screen_loc = ui_pull_resist
static_inventory += pull_icon
healths = new /obj/screen/healths/construct()
infodisplay += healths
/mob/living/simple_animal/hostile/construct/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud/construct(src)
+4
View File
@@ -68,6 +68,10 @@
using.screen_loc = ui_ghost_pai
static_inventory += using
using = new /obj/screen/language_menu
using.icon = ui_style
static_inventory += using
/datum/hud/ghost/show_hud(version = 0, mob/viewmob)
..()
if(!mymob.client.prefs.ghost_hud)
+3 -1
View File
@@ -208,7 +208,6 @@
mymob.reload_fullscreen()
update_parallax_pref(screenmob)
/datum/hud/human/show_hud(version = 0,mob/viewmob)
..()
hidden_inventory_update(viewmob)
@@ -266,3 +265,6 @@
E.screen_loc = ui_equip_position(mymob)
if(mymob.hud_used)
show_hud(HUD_STYLE_STANDARD,mymob)
/datum/hud/proc/update_locked_slots()
return
+12 -14
View File
@@ -124,7 +124,6 @@
inv_box.icon = ui_style
inv_box.slot_id = slot_w_uniform
inv_box.icon_state = "uniform"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_iclothing
toggleable_inventory += inv_box
@@ -133,7 +132,6 @@
inv_box.icon = ui_style
inv_box.slot_id = slot_wear_suit
inv_box.icon_state = "suit"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_oclothing
toggleable_inventory += inv_box
@@ -155,7 +153,6 @@
inv_box.name = "id"
inv_box.icon = ui_style
inv_box.icon_state = "id"
// inv_box.icon_full = "template_small"
inv_box.screen_loc = ui_id
inv_box.slot_id = slot_wear_id
static_inventory += inv_box
@@ -164,7 +161,6 @@
inv_box.name = "mask"
inv_box.icon = ui_style
inv_box.icon_state = "mask"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_mask
inv_box.slot_id = slot_wear_mask
toggleable_inventory += inv_box
@@ -173,7 +169,6 @@
inv_box.name = "neck"
inv_box.icon = ui_style
inv_box.icon_state = "neck"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_neck
inv_box.slot_id = slot_neck
toggleable_inventory += inv_box
@@ -182,7 +177,6 @@
inv_box.name = "back"
inv_box.icon = ui_style
inv_box.icon_state = "back"
// inv_box.icon_full = "template_small"
inv_box.screen_loc = ui_back
inv_box.slot_id = slot_back
static_inventory += inv_box
@@ -191,7 +185,6 @@
inv_box.name = "storage1"
inv_box.icon = ui_style
inv_box.icon_state = "pocket"
// inv_box.icon_full = "template_small"
inv_box.screen_loc = ui_storage1
inv_box.slot_id = slot_l_store
static_inventory += inv_box
@@ -200,7 +193,6 @@
inv_box.name = "storage2"
inv_box.icon = ui_style
inv_box.icon_state = "pocket"
// inv_box.icon_full = "template_small"
inv_box.screen_loc = ui_storage2
inv_box.slot_id = slot_r_store
static_inventory += inv_box
@@ -209,7 +201,6 @@
inv_box.name = "suit storage"
inv_box.icon = ui_style
inv_box.icon_state = "suit_storage"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_sstore1
inv_box.slot_id = slot_s_store
static_inventory += inv_box
@@ -233,7 +224,6 @@
inv_box.name = "gloves"
inv_box.icon = ui_style
inv_box.icon_state = "gloves"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_gloves
inv_box.slot_id = slot_gloves
toggleable_inventory += inv_box
@@ -242,7 +232,6 @@
inv_box.name = "eyes"
inv_box.icon = ui_style
inv_box.icon_state = "glasses"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_glasses
inv_box.slot_id = slot_glasses
toggleable_inventory += inv_box
@@ -251,7 +240,6 @@
inv_box.name = "ears"
inv_box.icon = ui_style
inv_box.icon_state = "ears"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_ears
inv_box.slot_id = slot_ears
toggleable_inventory += inv_box
@@ -260,7 +248,6 @@
inv_box.name = "head"
inv_box.icon = ui_style
inv_box.icon_state = "head"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_head
inv_box.slot_id = slot_head
toggleable_inventory += inv_box
@@ -269,7 +256,6 @@
inv_box.name = "shoes"
inv_box.icon = ui_style
inv_box.icon_state = "shoes"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_shoes
inv_box.slot_id = slot_shoes
toggleable_inventory += inv_box
@@ -327,6 +313,18 @@
inv_slots[inv.slot_id] = inv
inv.update_icon()
/datum/hud/human/update_locked_slots()
if(!mymob)
return
var/mob/living/carbon/human/H = mymob
var/datum/species/S = H.dna.species
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
if(inv.slot_id in S.no_equip)
inv.alpha = 128
else
inv.alpha = initial(inv.alpha)
/datum/hud/human/hidden_inventory_update(mob/viewer)
if(!mymob)
return
+9 -4
View File
@@ -91,10 +91,9 @@
screen_loc = ui_language_menu
/obj/screen/language_menu/Click()
var/mob/living/L = usr
if(!istype(L))
return
L.open_language_menu(usr)
var/mob/M = usr
var/datum/language_holder/H = M.get_language_holder()
H.open_language_menu(usr)
/obj/screen/inventory
var/slot_id // The indentifier for the slot. It has nothing to do with ID cards.
@@ -532,6 +531,12 @@
screen_loc = ui_health
mouse_opacity = 0
/obj/screen/healths/construct
icon = 'icons/mob/screen_construct.dmi'
icon_state = "artificer_health0"
screen_loc = ui_construct_health
mouse_opacity = 0
/obj/screen/healthdoll
name = "health doll"
screen_loc = ui_healthdoll
+3 -3
View File
@@ -117,7 +117,7 @@ GLOBAL_VAR_INIT(dlooc_allowed, 1)
prefs.chat_toggles ^= CHAT_LOOC
prefs.save_preferences()
src << "You will [(prefs.chat_toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel."
feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
SSblackbox.add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/togglelooc()
set category = "Server"
@@ -126,7 +126,7 @@ GLOBAL_VAR_INIT(dlooc_allowed, 1)
toggle_looc()
log_admin("[key_name(usr)] toggled LOOC.")
message_admins("[key_name_admin(usr)] toggled LOOC.")
feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
SSblackbox.add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/proc/toggle_looc(toggle = null)
if(toggle != null) //if we're specifically en/disabling ooc
@@ -146,7 +146,7 @@ GLOBAL_VAR_INIT(dlooc_allowed, 1)
log_admin("[key_name(usr)] toggled Dead LOOC.")
message_admins("[key_name_admin(usr)] toggled Dead LOOC.")
feedback_add_details("admin_verb","TDLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
SSblackbox.add_details("admin_verb","TDLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/mob/living/carbon/proc/has_penis()
+2 -1
View File
@@ -16,7 +16,8 @@
/obj/item/organ/genital/Initialize()
. = ..()
reagents = create_reagents(fluid_max_volume)
if(!reagents)
create_reagents(fluid_max_volume)
update()
/obj/item/organ/genital/Destroy()
+2 -2
View File
@@ -45,9 +45,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick)
switch(controller)
if("Master")
Recreate_MC()
feedback_add_details("admin_verb","Restart Master Controller")
SSblackbox.add_details("admin_verb","Restart Master Controller")
if("Failsafe")
new /datum/controller/failsafe()
feedback_add_details("admin_verb","Restart Failsafe Controller")
SSblackbox.add_details("admin_verb","Restart Failsafe Controller")
message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
+29 -36
View File
@@ -43,10 +43,8 @@
var/log_attack = 0 // log attack messages
var/log_adminchat = 0 // log admin chat messages
var/log_pda = 0 // log pda messages
var/log_hrefs = 0 // log all links clicked in-game. Could be used for debugging and tracking down exploits
var/log_twitter = 0 // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases.
var/log_world_topic = 0 // log all world.Topic() calls
var/log_runtimes = FALSE // log runtimes into a file
var/sql_enabled = 0 // for sql switching
var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour
var/allow_vote_restart = 0 // allow votes to restart
@@ -66,9 +64,9 @@
var/respawn = 1
var/guest_jobban = 1
var/usewhitelist = 0
var/inactivity_period = 3000 //time in ds until a player is considered inactive
var/afk_period = 6000 //time in ds until a player is considered afk and kickable
var/kick_inactive = FALSE //force disconnect for inactive players
var/inactivity_period = 3000 //time in ds until a player is considered inactive
var/afk_period = 6000 //time in ds until a player is considered afk and kickable
var/kick_inactive = FALSE //force disconnect for inactive players
var/load_jobs_from_txt = 0
var/automute_on = 0 //enables automuting/spam prevention
var/minimal_access_threshold = 0 //If the number of players is larger than this threshold, minimal access will be turned on.
@@ -129,6 +127,7 @@
var/forbid_peaceborg = 0
var/panic_bunker = 0 // prevents new people it hasn't seen before from connecting
var/notify_new_player_age = 0 // how long do we notify admins of a new player
var/notify_new_player_account_age = 0 // how long do we notify admins of a new byond account
var/irc_first_connection_alert = 0 // do we notify the irc channel when somebody is connecting for the first time?
var/traitor_scaling_coeff = 6 //how much does the amount of players get divided by to determine traitors
@@ -269,7 +268,7 @@
if(M.config_tag)
if(!(M.config_tag in modes)) // ensure each mode is added only once
GLOB.diary << "Adding game mode [M.name] ([M.config_tag]) to configuration."
GLOB.config_error_log << "Adding game mode [M.name] ([M.config_tag]) to configuration."
modes += M.config_tag
mode_names[M.config_tag] = M.name
probabilities[M.config_tag] = M.probability
@@ -291,7 +290,7 @@
GLOB.abandon_allowed = respawn
/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist
var/list/Lines = world.file2list(filename)
var/list/Lines = world.file2list(filename)
for(var/t in Lines)
if(!t)
@@ -358,8 +357,6 @@
log_adminchat = 1
if("log_pda")
log_pda = 1
if("log_hrefs")
log_hrefs = 1
if("log_twitter")
log_twitter = 1
if("log_world_topic")
@@ -410,12 +407,12 @@
usewhitelist = TRUE
if("allow_metadata")
allow_Metadata = 1
if("inactivity_period")
inactivity_period = text2num(value) * 10 //documented as seconds in config.txt
if("afk_period")
afk_period = text2num(value) * 10 // ^^^
if("inactivity_period")
inactivity_period = text2num(value) * 10 //documented as seconds in config.txt
if("afk_period")
afk_period = text2num(value) * 10 // ^^^
if("kick_inactive")
kick_inactive = TRUE
kick_inactive = TRUE
if("load_jobs_from_txt")
load_jobs_from_txt = 1
if("forbid_singulo_possession")
@@ -476,6 +473,8 @@
panic_bunker = 1
if("notify_new_player_age")
notify_new_player_age = text2num(value)
if("notify_new_player_account_age")
notify_new_player_account_age = text2num(value)
if("irc_first_connection_alert")
irc_first_connection_alert = 1
if("check_randomizer")
@@ -493,12 +492,6 @@
ipintel_save_bad = text2num(value)
if("aggressive_changelog")
aggressive_changelog = 1
if("log_runtimes")
log_runtimes = TRUE
var/newlog = file("data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log")
if(GLOB.runtime_diary != newlog)
world.log << "Now logging runtimes to data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log"
GLOB.runtime_diary = newlog
if("autoconvert_notes")
autoconvert_notes = 1
if("allow_webclient")
@@ -542,7 +535,7 @@
if("error_msg_delay")
error_msg_delay = text2num(value)
else
GLOB.diary << "Unknown setting in configuration: '[name]'"
GLOB.config_error_log << "Unknown setting in configuration: '[name]'"
else if(type == "game_options")
switch(name)
@@ -605,13 +598,13 @@
if(mode_name in modes)
continuous[mode_name] = 1
else
GLOB.diary << "Unknown continuous configuration definition: [mode_name]."
GLOB.config_error_log << "Unknown continuous configuration definition: [mode_name]."
if("midround_antag")
var/mode_name = lowertext(value)
if(mode_name in modes)
midround_antag[mode_name] = 1
else
GLOB.diary << "Unknown midround antagonist configuration definition: [mode_name]."
GLOB.config_error_log << "Unknown midround antagonist configuration definition: [mode_name]."
if("midround_antag_time_check")
midround_antag_time_check = text2num(value)
if("midround_antag_life_check")
@@ -627,9 +620,9 @@
if(mode_name in modes)
min_pop[mode_name] = text2num(mode_value)
else
GLOB.diary << "Unknown minimum population configuration definition: [mode_name]."
GLOB.config_error_log << "Unknown minimum population configuration definition: [mode_name]."
else
GLOB.diary << "Incorrect minimum population configuration definition: [mode_name] [mode_value]."
GLOB.config_error_log << "Incorrect minimum population configuration definition: [mode_name] [mode_value]."
if("max_pop")
var/pop_pos = findtext(value, " ")
var/mode_name = null
@@ -641,9 +634,9 @@
if(mode_name in modes)
max_pop[mode_name] = text2num(mode_value)
else
GLOB.diary << "Unknown maximum population configuration definition: [mode_name]."
GLOB.config_error_log << "Unknown maximum population configuration definition: [mode_name]."
else
GLOB.diary << "Incorrect maximum population configuration definition: [mode_name] [mode_value]."
GLOB.config_error_log << "Incorrect maximum population configuration definition: [mode_name] [mode_value]."
if("shuttle_refuel_delay")
shuttle_refuel_delay = text2num(value)
if("show_game_type_odds")
@@ -671,9 +664,9 @@
if(prob_name in modes)
probabilities[prob_name] = text2num(prob_value)
else
GLOB.diary << "Unknown game mode probability configuration definition: [prob_name]."
GLOB.config_error_log << "Unknown game mode probability configuration definition: [prob_name]."
else
GLOB.diary << "Incorrect probability configuration definition: [prob_name] [prob_value]."
GLOB.config_error_log << "Incorrect probability configuration definition: [prob_name] [prob_value]."
if("protect_roles_from_antagonist")
protect_roles_from_antagonist = 1
@@ -720,7 +713,7 @@
// Value is in the form "LAWID,NUMBER"
var/list/L = splittext(value, ",")
if(L.len != 2)
GLOB.diary << "Invalid LAW_WEIGHT: " + t
GLOB.config_error_log << "Invalid LAW_WEIGHT: " + t
continue
var/lawid = L[1]
var/weight = text2num(L[2])
@@ -776,8 +769,8 @@
mentors_mobname_only = 1
if ("mentor_legacy_system")
mentor_legacy_system = 1
else
GLOB.diary << "Unknown setting in configuration: '[name]'"
// else
// GLOB.config_error_log << "Adding game mode [M.name] ([M.config_tag]) to configuration."
fps = round(fps)
if(fps <= 0)
@@ -785,7 +778,7 @@
/datum/configuration/proc/loadmaplist(filename)
var/list/Lines = world.file2list(filename)
var/list/Lines = world.file2list(filename)
var/datum/map_config/currentmap = null
for(var/t in Lines)
@@ -831,11 +824,11 @@
maplist[currentmap.map_name] = currentmap
currentmap = null
else
GLOB.diary << "Unknown command in map vote config: '[command]'"
GLOB.config_error_log << "Unknown command in map vote config: '[command]'"
/datum/configuration/proc/loadsql(filename)
var/list/Lines = world.file2list(filename)
var/list/Lines = world.file2list(filename)
for(var/t in Lines)
if(!t)
continue
@@ -875,7 +868,7 @@
if("feedback_tableprefix")
global.sqlfdbktableprefix = value
else
GLOB.diary << "Unknown setting in configuration: '[name]'"
GLOB.config_error_log << "Unknown setting in configuration: '[name]'"
/datum/configuration/proc/pick_mode(mode_name)
// I wish I didn't have to instance the game modes in order to look up
+6
View File
@@ -52,6 +52,12 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars)
/datum/controller/global_vars/Initialize()
gvars_datum_init_order = list()
gvars_datum_protected_varlist = list("gvars_datum_protected_varlist")
//See https://github.com/tgstation/tgstation/issues/26954
for(var/I in typesof(/datum/controller/global_vars/proc))
var/CLEANBOT_RETURNS = "[I]"
pass(CLEANBOT_RETURNS)
for(var/I in vars - gvars_datum_in_built_vars)
var/start_tick = world.time
call(src, "InitGlobal[I]")()
+18 -13
View File
@@ -48,7 +48,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
var/initializations_finished_with_no_players_logged_in //I wonder what this could be?
// Has round started? (So we know what subsystems to run)
var/round_started = 0
var/local_round_started = FALSE //Don't read this var, use SSticker.HasRoundStarted() instead
// The type of the last subsystem to be process()'d.
var/last_type_processed
@@ -189,7 +189,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
// Notify the MC that the round has started.
/datum/controller/master/proc/RoundStart()
round_started = 1
local_round_started = TRUE
var/timer = world.time
for (var/datum/controller/subsystem/SS in subsystems)
if (SS.flags & SS_FIRE_IN_LOBBY || SS.flags & SS_TICKER)
@@ -222,7 +222,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
// local vars rock
// Schedule the first run of the Subsystems.
round_started = world.has_round_started()
local_round_started = world.has_round_started()
//all this shit is here so that flag edits can be refreshed by restarting the MC. (and for speed)
var/list/tickersubsystems = list()
var/list/normalsubsystems = list()
@@ -245,7 +245,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
lobbysubsystems += SS
timer += world.tick_lag * rand(1, 5)
SS.next_fire = timer
else if (round_started)
else if (local_round_started)
timer += world.tick_lag * rand(1, 5)
SS.next_fire = timer
normalsubsystems += SS
@@ -280,7 +280,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
// because sleeps are processed in the order received, so longer sleeps are more likely to run first
if (world.tick_usage > TICK_LIMIT_MC)
sleep_delta += 2
GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.5)
GLOB.CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING * 0.5
sleep(world.tick_lag * (processing + sleep_delta))
continue
@@ -296,7 +296,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
if (!Failsafe || (Failsafe.processing_interval > 0 && (Failsafe.lasttick+(Failsafe.processing_interval*5)) < world.time))
new/datum/controller/failsafe() // (re)Start the failsafe.
if (!queue_head || !(iteration % 3))
if (round_started)
if (local_round_started)
subsystems_to_check = normalsubsystems
else
subsystems_to_check = lobbysubsystems
@@ -421,26 +421,31 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
else
tick_precentage = tick_remaining
GLOB.CURRENT_TICKLIMIT = world.tick_usage + tick_precentage
tick_precentage = max(tick_precentage*0.5, tick_precentage-queue_node.tick_overrun)
GLOB.CURRENT_TICKLIMIT = round(world.tick_usage + tick_precentage)
if (!(queue_node_flags & SS_TICKER))
ran_non_ticker = TRUE
ran = TRUE
tick_usage = world.tick_usage
queue_node_paused = (queue_node.state == SS_PAUSED || queue_node.state == SS_PAUSING)
last_type_processed = queue_node
queue_node.state = SS_RUNNING
tick_usage = world.tick_usage
var/state = queue_node.ignite(queue_node_paused)
tick_usage = world.tick_usage - tick_usage
if (state == SS_RUNNING)
state = SS_IDLE
current_tick_budget -= queue_node_priority
tick_usage = world.tick_usage - tick_usage
if (tick_usage < 0)
tick_usage = 0
queue_node.tick_overrun = max(0, MC_AVG_FAST_UP_SLOW_DOWN(queue_node.tick_overrun, tick_usage-tick_precentage))
queue_node.state = state
if (state == SS_PAUSED)
@@ -467,13 +472,13 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
queue_node.times_fired++
if (queue_node_flags & SS_TICKER)
queue_node.next_fire = world.time + (world.tick_lag * queue_node.wait)
queue_node.next_fire = world.time + (world.tick_lag * (queue_node.wait + (queue_node.tick_overrun/100)))
else if (queue_node_flags & SS_POST_FIRE_TIMING)
queue_node.next_fire = world.time + queue_node.wait
queue_node.next_fire = world.time + queue_node.wait + (world.tick_lag * (queue_node.tick_overrun/100))
else if (queue_node_flags & SS_KEEP_TIMING)
queue_node.next_fire += queue_node.wait
else
queue_node.next_fire = queue_node.queued_time + queue_node.wait
queue_node.next_fire = queue_node.queued_time + queue_node.wait + (world.tick_lag * (queue_node.tick_overrun/100))
queue_node.queued_time = 0
+2 -1
View File
@@ -17,6 +17,7 @@
var/next_fire = 0 //scheduled world.time for next fire()
var/cost = 0 //average time to execute
var/tick_usage = 0 //average tick usage
var/tick_overrun = 0 //average tick overrun
var/state = SS_IDLE //tracks the current state of the ss, running, paused, etc.
var/paused_ticks = 0 //ticks this ss is taking to run right now.
var/paused_tick_usage //total tick_usage of all of our runs while pausing this run
@@ -168,7 +169,7 @@
if(can_fire && !(SS_NO_FIRE in flags))
msg = "[round(cost,1)]ms|[round(tick_usage,1)]%|[round(ticks,0.1)]\t[msg]"
msg = "[round(cost,1)]ms|[round(tick_usage,1)]%([round(tick_overrun,1)]%)|[round(ticks,0.1)]\t[msg]"
else
msg = "OFFLINE\t[msg]"
-9
View File
@@ -1,9 +0,0 @@
diff a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm (rejected hunks)
@@ -12,6 +12,7 @@ SUBSYSTEM_DEF(atoms)
var/old_initialized
var/list/late_loaders
+ var/list/created_atoms
var/list/BadInitializeCalls = list()
@@ -1,9 +1,7 @@
GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new)
//the feedback datum; stores all feedback
/datum/feedback
var/list/messages = list()
var/list/messages_admin = list()
SUBSYSTEM_DEF(blackbox)
name = "Blackbox"
wait = 6000
flags = SS_NO_TICK_CHECK
var/list/msg_common = list()
var/list/msg_science = list()
@@ -15,21 +13,48 @@ GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new)
var/list/msg_syndicate = list()
var/list/msg_service = list()
var/list/msg_cargo = list()
var/list/msg_other = list()
var/list/datum/feedback_variable/feedback = new()
var/list/feedback = list() //list of datum/feedback_variable
/datum/feedback/proc/find_feedback_datum(variable)
for (var/datum/feedback_variable/FV in feedback)
if (FV.get_variable() == variable)
return FV
var/datum/feedback_variable/FV = new(variable)
feedback += FV
return FV
//poll population
/datum/controller/subsystem/blackbox/fire()
if(!SSdbcore.Connect())
return
var/playercount = 0
for(var/mob/M in GLOB.player_list)
if(M.client)
playercount += 1
var/admincount = GLOB.admins.len
var/datum/DBQuery/query_record_playercount = SSdbcore.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port) VALUES ([playercount], [admincount], '[SQLtime()]', INET_ATON('[world.internet_address]'), '[world.port]')")
query_record_playercount.Execute()
/datum/feedback/proc/get_round_feedback()
return feedback
/datum/controller/subsystem/blackbox/Recover()
msg_common = SSblackbox.msg_common
msg_science = SSblackbox.msg_science
msg_command = SSblackbox.msg_command
msg_medical = SSblackbox.msg_medical
msg_engineering = SSblackbox.msg_engineering
msg_security = SSblackbox.msg_security
msg_deathsquad = SSblackbox.msg_deathsquad
msg_syndicate = SSblackbox.msg_syndicate
msg_service = SSblackbox.msg_service
msg_cargo = SSblackbox.msg_cargo
msg_other = SSblackbox.msg_other
/datum/feedback/proc/round_end_data_gathering()
feedback = SSblackbox.feedback
//no touchie
/datum/controller/subsystem/blackbox/can_vv_get(var_name)
if(var_name == "feedback")
return FALSE
return ..()
/datum/controller/subsystem/blackbox/vv_edit_var(var_name, var_value)
return FALSE
/datum/controller/subsystem/blackbox/Shutdown()
var/pda_msg_amt = 0
var/rc_msg_amt = 0
@@ -39,41 +64,26 @@ GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new)
if (MS.rc_msgs.len > rc_msg_amt)
rc_msg_amt = MS.rc_msgs.len
feedback_set_details("radio_usage","")
set_details("radio_usage","")
feedback_add_details("radio_usage","COM-[msg_common.len]")
feedback_add_details("radio_usage","SCI-[msg_science.len]")
feedback_add_details("radio_usage","HEA-[msg_command.len]")
feedback_add_details("radio_usage","MED-[msg_medical.len]")
feedback_add_details("radio_usage","ENG-[msg_engineering.len]")
feedback_add_details("radio_usage","SEC-[msg_security.len]")
feedback_add_details("radio_usage","DTH-[msg_deathsquad.len]")
feedback_add_details("radio_usage","SYN-[msg_syndicate.len]")
feedback_add_details("radio_usage","SRV-[msg_service.len]")
feedback_add_details("radio_usage","CAR-[msg_cargo.len]")
feedback_add_details("radio_usage","OTH-[messages.len]")
feedback_add_details("radio_usage","PDA-[pda_msg_amt]")
feedback_add_details("radio_usage","RC-[rc_msg_amt]")
add_details("radio_usage","COM-[msg_common.len]")
add_details("radio_usage","SCI-[msg_science.len]")
add_details("radio_usage","HEA-[msg_command.len]")
add_details("radio_usage","MED-[msg_medical.len]")
add_details("radio_usage","ENG-[msg_engineering.len]")
add_details("radio_usage","SEC-[msg_security.len]")
add_details("radio_usage","DTH-[msg_deathsquad.len]")
add_details("radio_usage","SYN-[msg_syndicate.len]")
add_details("radio_usage","SRV-[msg_service.len]")
add_details("radio_usage","CAR-[msg_cargo.len]")
add_details("radio_usage","OTH-[msg_other.len]")
add_details("radio_usage","PDA-[pda_msg_amt]")
add_details("radio_usage","RC-[rc_msg_amt]")
feedback_set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set.
set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set.
//This proc is only to be called at round end.
/datum/feedback/proc/save_all_data_to_sql()
if (!feedback) return
round_end_data_gathering() //round_end time logging and some other data processing
if (!SSdbcore.Connect()) return
var/round_id
var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]")
if(!query_feedback_max_id.Execute())
if (!SSdbcore.Connect())
return
while (query_feedback_max_id.NextRow())
round_id = query_feedback_max_id.item[1]
if (!isnum(round_id))
round_id = text2num(round_id)
round_id++
var/sqlrowlist = ""
@@ -81,7 +91,7 @@ GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new)
if (sqlrowlist != "")
sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error
sqlrowlist += "(null, Now(), [round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")"
sqlrowlist += "(null, Now(), [GLOB.round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")"
if (sqlrowlist == "")
return
@@ -89,69 +99,99 @@ GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new)
var/datum/DBQuery/query_feedback_save = SSdbcore.NewQuery("INSERT DELAYED IGNORE INTO [format_table_name("feedback")] VALUES " + sqlrowlist)
query_feedback_save.Execute()
/datum/controller/subsystem/blackbox/proc/LogBroadcast(blackbox_msg, freq)
switch(freq)
if(1459)
msg_common += blackbox_msg
if(1351)
msg_science += blackbox_msg
if(1353)
msg_command += blackbox_msg
if(1355)
msg_medical += blackbox_msg
if(1357)
msg_engineering += blackbox_msg
if(1359)
msg_security += blackbox_msg
if(1441)
msg_deathsquad += blackbox_msg
if(1213)
msg_syndicate += blackbox_msg
if(1349)
msg_service += blackbox_msg
if(1347)
msg_cargo += blackbox_msg
else
msg_other += blackbox_msg
/proc/feedback_set(variable,value)
if(!GLOB.blackbox)
return
/datum/controller/subsystem/blackbox/proc/find_feedback_datum(variable)
for(var/datum/feedback_variable/FV in feedback)
if(FV.get_variable() == variable)
return FV
var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
if(!FV)
return
var/datum/feedback_variable/FV = new(variable)
feedback += FV
return FV
/datum/controller/subsystem/blackbox/proc/set_val(variable, value)
var/datum/feedback_variable/FV = find_feedback_datum(variable)
FV.set_value(value)
/proc/feedback_inc(variable,value)
if(!GLOB.blackbox)
return
var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
if(!FV)
return
/datum/controller/subsystem/blackbox/proc/inc(variable, value)
var/datum/feedback_variable/FV = find_feedback_datum(variable)
FV.inc(value)
/proc/feedback_dec(variable,value)
if(!GLOB.blackbox)
return
var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
if(!FV)
return
/datum/controller/subsystem/blackbox/proc/dec(variable,value)
var/datum/feedback_variable/FV = find_feedback_datum(variable)
FV.dec(value)
/proc/feedback_set_details(variable,details)
if(!GLOB.blackbox)
return
var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
if(!FV)
return
/datum/controller/subsystem/blackbox/proc/set_details(variable,details)
var/datum/feedback_variable/FV = find_feedback_datum(variable)
FV.set_details(details)
/proc/feedback_add_details(variable,details)
if(!GLOB.blackbox)
return
var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
if(!FV)
return
/datum/controller/subsystem/blackbox/proc/add_details(variable,details)
var/datum/feedback_variable/FV = find_feedback_datum(variable)
FV.add_details(details)
/datum/controller/subsystem/blackbox/proc/ReportDeath(mob/living/L)
if(!SSdbcore.Connect())
return
if(!L || !L.key || !L.mind)
return
var/turf/T = get_turf(L)
var/area/placeofdeath = get_area(T.loc)
var/sqlname = sanitizeSQL(L.real_name)
var/sqlkey = sanitizeSQL(L.ckey)
var/sqljob = sanitizeSQL(L.mind.assigned_role)
var/sqlspecial = sanitizeSQL(L.mind.special_role)
var/sqlpod = sanitizeSQL(placeofdeath.name)
var/laname
var/lakey
if(L.lastattacker && ismob(L.lastattacker))
var/mob/LA = L.lastattacker
laname = sanitizeSQL(LA.real_name)
lakey = sanitizeSQL(LA.key)
var/sqlgender = sanitizeSQL(L.gender)
var/sqlbrute = sanitizeSQL(L.getBruteLoss())
var/sqlfire = sanitizeSQL(L.getFireLoss())
var/sqlbrain = sanitizeSQL(L.getBrainLoss())
var/sqloxy = sanitizeSQL(L.getOxyLoss())
var/sqltox = sanitizeSQL(L.getStaminaLoss())
var/sqlclone = sanitizeSQL(L.getStaminaLoss())
var/sqlstamina = sanitizeSQL(L.getStaminaLoss())
var/coord = sanitizeSQL("[L.x], [L.y], [L.z]")
var/map = sanitizeSQL(SSmapping.config.map_name)
var/datum/DBQuery/query_report_death = SSdbcore.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, coord, mapname, server_ip, server_port) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[SQLtime()]', '[laname]', '[lakey]', '[sqlgender]', [sqlbrute], [sqlfire], [sqlbrain], [sqloxy], [sqltox], [sqlclone], [sqlstamina], '[coord]', '[map]', INET_ATON('[world.internet_address]'), '[world.port]')")
query_report_death.Execute()
//feedback variable datum, for storing all kinds of data
/datum/feedback_variable
var/variable
var/value
var/details
/datum/feedback_variable/New(var/param_variable,var/param_value = 0)
/datum/feedback_variable/New(param_variable, param_value = 0)
variable = param_variable
value = param_value
@@ -204,50 +244,3 @@ GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new)
/datum/feedback_variable/proc/get_parsed()
return list(variable,value,details)
//sql reporting procs
/proc/sql_poll_population()
if(!config.sql_enabled)
return
if(!SSdbcore.Connect())
return
var/playercount = 0
for(var/mob/M in GLOB.player_list)
if(M.client)
playercount += 1
var/admincount = GLOB.admins.len
var/datum/DBQuery/query_record_playercount = SSdbcore.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port) VALUES ([playercount], [admincount], '[SQLtime()]', INET_ATON('[world.internet_address]'), '[world.port]')")
query_record_playercount.Execute()
/proc/sql_report_death(mob/living/L)
if(!config.sql_enabled)
return
if(!SSdbcore.Connect())
return
if(!L || !L.key || !L.mind)
return
var/turf/T = get_turf(L)
var/area/placeofdeath = get_area(T.loc)
var/sqlname = sanitizeSQL(L.real_name)
var/sqlkey = sanitizeSQL(L.ckey)
var/sqljob = sanitizeSQL(L.mind.assigned_role)
var/sqlspecial = sanitizeSQL(L.mind.special_role)
var/sqlpod = sanitizeSQL(placeofdeath.name)
var/laname
var/lakey
if(L.lastattacker && ismob(L.lastattacker))
var/mob/LA = L.lastattacker
laname = sanitizeSQL(LA.real_name)
lakey = sanitizeSQL(LA.key)
var/sqlgender = sanitizeSQL(L.gender)
var/sqlbrute = sanitizeSQL(L.getBruteLoss())
var/sqlfire = sanitizeSQL(L.getFireLoss())
var/sqlbrain = sanitizeSQL(L.getBrainLoss())
var/sqloxy = sanitizeSQL(L.getOxyLoss())
var/sqltox = sanitizeSQL(L.getStaminaLoss())
var/sqlclone = sanitizeSQL(L.getStaminaLoss())
var/sqlstamina = sanitizeSQL(L.getStaminaLoss())
var/coord = sanitizeSQL("[L.x], [L.y], [L.z]")
var/map = sanitizeSQL(SSmapping.config.map_name)
var/datum/DBQuery/query_report_death = SSdbcore.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, coord, mapname, server_ip, server_port) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[SQLtime()]', '[laname]', '[lakey]', '[sqlgender]', [sqlbrute], [sqlfire], [sqlbrain], [sqloxy], [sqltox], [sqlclone], [sqlstamina], '[coord]', '[map]', INET_ATON('[world.internet_address]'), '[world.port]')")
query_report_death.Execute()
+2 -2
View File
@@ -308,7 +308,6 @@ SUBSYSTEM_DEF(job)
Debug("DO non-human failed, Player: [player], Job:[job.title]")
continue
// If the player wants that job on this level, then try give it to him.
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
@@ -319,6 +318,7 @@ SUBSYSTEM_DEF(job)
unassigned -= player
break
// Hand out random jobs to the people who didn't get any in the last check
// Also makes sure that they got their preference correct
for(var/mob/dead/new_player/player in unassigned)
@@ -483,7 +483,7 @@ SUBSYSTEM_DEF(job)
else level4++ //not selected
tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-"
feedback_add_details("job_preferences",tmp_str)
SSblackbox.add_details("job_preferences",tmp_str)
/datum/controller/subsystem/job/proc/PopcapReached()
if(config.hard_popcap || config.extreme_popcap)
+18
View File
@@ -0,0 +1,18 @@
SUBSYSTEM_DEF(language)
name = "Language"
init_order = INIT_ORDER_LANGUAGE
flags = SS_NO_FIRE
/datum/controller/subsystem/language/Initialize(timeofday)
for(var/L in subtypesof(/datum/language))
var/datum/language/language = L
if(!initial(language.key))
continue
GLOB.all_languages += language
var/datum/language/instance = new language
GLOB.language_datum_instances[language] = instance
return ..()
+2 -10
View File
@@ -36,18 +36,10 @@ SUBSYSTEM_DEF(lighting)
for (i in 1 to GLOB.lighting_update_lights.len)
var/datum/light_source/L = GLOB.lighting_update_lights[i]
if (L.check() || QDELETED(L) || L.force_update)
L.remove_lum()
if (!QDELETED(L))
L.apply_lum()
L.update_corners()
else if (L.vis_update) //We smartly update only tiles that became (in) visible to use.
L.smart_vis_update()
L.needs_update = LIGHTING_NO_UPDATE
L.vis_update = FALSE
L.force_update = FALSE
L.needs_update = FALSE
if(init_tick_checks)
CHECK_TICK
else if (MC_TICK_CHECK)
+1 -1
View File
@@ -119,7 +119,7 @@ SUBSYSTEM_DEF(mapping)
INIT_ANNOUNCE("Loading [config.map_name]...")
TryLoadZ(config.GetFullMapPath(), FailedZs, ZLEVEL_STATION)
INIT_ANNOUNCE("Loaded station in [(REALTIMEOFDAY - start_time)/10]s!")
feedback_add_details("map_name", config.map_name)
SSblackbox.add_details("map_name", config.map_name)
if(config.minetype != "lavaland")
INIT_ANNOUNCE("WARNING: A map without lavaland set as it's minetype was loaded! This is being ignored! Update the maploader code!")
+1 -1
View File
@@ -150,7 +150,7 @@ SUBSYSTEM_DEF(pai)
if(!(ROLE_PAI in G.client.prefs.be_special))
continue
//G << 'sound/misc/server-ready.ogg' //Alerting them to their consideration
to_chat(G, "<span class='ghostalert'>Someone is requesting a pAI personality! Use the pAI button to submit yourself as one.</span>")
to_chat(G, "<span class='ghostalert'>[user] is requesting a pAI personality! Use the pAI button to submit yourself as one.</span>")
addtimer(CALLBACK(src, .proc/spam_again), spam_delay)
var/list/available = list()
for(var/datum/paiCandidate/c in SSpai.candidates)
+69 -8
View File
@@ -9,12 +9,15 @@ SUBSYSTEM_DEF(persistence)
var/list/obj/structure/chisel_message/chisel_messages = list()
var/list/saved_messages = list()
var/savefile/chisel_messages_sav
var/savefile/trophy_sav
var/list/saved_trophies = list()
/datum/controller/subsystem/persistence/Initialize()
LoadSatchels()
LoadPoly()
LoadChiselMessages()
LoadTrophies()
..()
/datum/controller/subsystem/persistence/proc/LoadSatchels()
@@ -71,14 +74,14 @@ SUBSYSTEM_DEF(persistence)
break //Who's been duping the bird?!
/datum/controller/subsystem/persistence/proc/LoadChiselMessages()
chisel_messages_sav = new /savefile("data/npc_saves/ChiselMessages.sav")
var/savefile/chisel_messages_sav = new /savefile("data/npc_saves/ChiselMessages.sav")
var/saved_json
chisel_messages_sav[SSmapping.config.map_name] >> saved_json
if(!saved_json)
return
var/saved_messages = json_decode(saved_json)
var/list/saved_messages = json_decode(saved_json)
for(var/item in saved_messages)
if(!islist(item))
@@ -100,15 +103,57 @@ SUBSYSTEM_DEF(persistence)
var/obj/structure/chisel_message/M = new(T)
M.unpack(item)
if(!M.loc)
M.persists = FALSE
qdel(M)
if(!QDELETED(M))
M.unpack(item)
log_world("Loaded [saved_messages.len] engraved messages on map [SSmapping.config.map_name]")
/datum/controller/subsystem/persistence/proc/LoadTrophies()
trophy_sav = new /savefile("data/npc_saves/TrophyItems.sav")
var/saved_json
trophy_sav >> saved_json
if(!saved_json)
return
var/decoded_json = json_decode(saved_json)
if(!islist(decoded_json))
return
saved_trophies = decoded_json
SetUpTrophies(saved_trophies.Copy())
/datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items)
for(var/A in GLOB.trophy_cases)
var/obj/structure/displaycase/trophy/T = A
T.added_roundstart = TRUE
var/trophy_data = pick_n_take(trophy_items)
if(!islist(trophy_data))
continue
var/list/chosen_trophy = trophy_data
if(!chosen_trophy || isemptylist(chosen_trophy)) //Malformed
continue
var/path = text2path(chosen_trophy["path"]) //If the item no longer exist, this returns null
if(!path)
continue
T.showpiece = new /obj/item/showpiece_dummy(T, path)
T.trophy_message = chosen_trophy["message"]
T.placer_key = chosen_trophy["placer_key"]
T.update_icon()
/datum/controller/subsystem/persistence/proc/CollectData()
CollectChiselMessages()
CollectSecretSatchels()
CollectTrophies()
/datum/controller/subsystem/persistence/proc/CollectSecretSatchels()
for(var/A in new_secret_satchels)
@@ -129,10 +174,26 @@ SUBSYSTEM_DEF(persistence)
secret_satchels[SSmapping.config.map_name] << old_secret_satchels
/datum/controller/subsystem/persistence/proc/CollectChiselMessages()
var/savefile/chisel_messages_sav = new /savefile("data/npc_saves/ChiselMessages.sav")
for(var/obj/structure/chisel_message/M in chisel_messages)
saved_messages += list(M.pack())
log_world("Saved [saved_messages.len] engraved messages on map [SSmapping.config.map_name]")
chisel_messages_sav[SSmapping.config.map_name] << json_encode(saved_messages)
/datum/controller/subsystem/persistence/proc/SaveChiselMessage(obj/structure/chisel_message/M)
saved_messages += list(M.pack()) // dm eats one list.
saved_messages += list(M.pack()) // dm eats one list
/datum/controller/subsystem/persistence/proc/CollectTrophies()
trophy_sav << json_encode(saved_trophies)
/datum/controller/subsystem/persistence/proc/SaveTrophy(obj/structure/displaycase/trophy/T)
if(!T.added_roundstart && T.showpiece)
var/list/data = list()
data["path"] = T.showpiece.type
data["message"] = T.trophy_message
data["placer_key"] = T.placer_key
saved_trophies += list(data)
+15 -1
View File
@@ -3,14 +3,20 @@
SUBSYSTEM_DEF(ping)
name = "Ping"
wait = 6
flags = SS_NO_INIT|SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY
flags = SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY
priority = 10
var/list/currentrun
/datum/controller/subsystem/ping/Initialize()
if (config.hub)
world.visibility = 1
..()
/datum/controller/subsystem/ping/fire(resumed = FALSE)
if (!resumed)
src.currentrun = GLOB.clients.Copy()
var/round_started = Master.round_started
var/list/currentrun = src.currentrun
while (length(currentrun))
var/client/C = currentrun[currentrun.len]
@@ -19,7 +25,15 @@ SUBSYSTEM_DEF(ping)
if (MC_TICK_CHECK)
return
continue
if(round_started && C.is_afk(INACTIVITY_KICK))
if(!istype(C.mob, /mob/dead))
log_access("AFK: [key_name(C)]")
to_chat(C, "<span class='danger'>You have been inactive for more than 10 minutes and have been disconnected.</span>")
qdel(C)
winset(C, null, "command=.update_ping+[world.time+world.tick_lag*world.tick_usage/100]")
if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check
return
@@ -5,7 +5,7 @@ PROCESSING_SUBSYSTEM_DEF(flightpacks)
stat_tag = "FM"
flags = SS_NO_INIT|SS_TICKER|SS_KEEP_TIMING
var/flightsuit_processing = FLIGHTSUIT_PROCESSING_FULL
var/flightsuit_processing = FLIGHTSUIT_PROCESSING_NONE
/datum/controller/subsystem/processing/flightpacks/Initialize()
sync_flightsuit_processing()
+24 -8
View File
@@ -1,17 +1,28 @@
#define PING_BUFFER_TIME 25
SUBSYSTEM_DEF(server_maint)
name = "Server Tasks"
wait = 6000
flags = SS_NO_TICK_CHECK
wait = 6
flags = SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY
priority = 10
var/list/currentrun
/datum/controller/subsystem/server_maint/Initialize(timeofday)
if (config.hub)
world.visibility = 1
..()
/datum/controller/subsystem/server_maint/fire()
//handle kicking inactive players
if(config.kick_inactive)
for(var/client/C in GLOB.clients)
/datum/controller/subsystem/server_maint/fire(resumed = FALSE)
if(!resumed)
src.currentrun = GLOB.clients.Copy()
var/list/currentrun = src.currentrun
var/round_started = SSticker.HasRoundStarted()
for(var/I in currentrun)
var/client/C = I
//handle kicking inactive players
if(round_started && config.kick_inactive)
if(C.is_afk(config.afk_period))
var/cmob = C.mob
if(!(istype(cmob, /mob/dead/observer) || (istype(cmob, /mob/dead) && C.holder)))
@@ -19,5 +30,10 @@ SUBSYSTEM_DEF(server_maint)
to_chat(C, "<span class='danger'>You have been inactive for more than [config.afk_period / 600] minutes and have been disconnected.</span>")
qdel(C)
if(config.sql_enabled)
sql_poll_population()
if (!(!C || world.time - C.connection_time < PING_BUFFER_TIME || C.inactivity >= (wait-1)))
winset(C, null, "command=.update_ping+[world.time+world.tick_lag*world.tick_usage/100]")
if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check
return
#undef PING_BUFFER_TIME
+9 -8
View File
@@ -243,7 +243,7 @@ SUBSYSTEM_DEF(ticker)
send2irc("Server", "Round of [hide_mode ? "secret":"[mode.name]"] has started[allmins.len ? ".":" with no active admins online!"]")
/datum/controller/subsystem/ticker/proc/OnRoundstart(datum/callback/cb)
if(current_state < GAME_STATE_PLAYING)
if(!HasRoundStarted())
LAZYADD(round_start_events, cb)
else
cb.InvokeAsync()
@@ -625,8 +625,8 @@ SUBSYSTEM_DEF(ticker)
if(selected_tip)
m = selected_tip
else
var/list/randomtips = world.file2list("config/tips.txt")
var/list/memetips = world.file2list("config/sillytips.txt")
var/list/randomtips = world.file2list("strings/tips.txt")
var/list/memetips = world.file2list("strings/sillytips.txt")
if(randomtips.len && prob(95))
m = pick(randomtips)
else if(memetips.len)
@@ -672,15 +672,16 @@ SUBSYSTEM_DEF(ticker)
return
INVOKE_ASYNC(SSmapping, /datum/controller/subsystem/mapping/.proc/maprotate)
/datum/controller/subsystem/ticker/proc/HasRoundStarted()
return current_state >= GAME_STATE_PLAYING
/datum/controller/subsystem/ticker/proc/IsRoundInProgress()
return current_state == GAME_STATE_PLAYING
/proc/send_gamemode_vote()
SSticker.modevoted = TRUE
SSvote.initiate_vote("roundtype","server")
/world/proc/has_round_started()
if (SSticker && SSticker.current_state >= GAME_STATE_PLAYING)
return TRUE
return FALSE
/datum/controller/subsystem/ticker/Recover()
current_state = SSticker.current_state
force_ending = SSticker.force_ending
+1 -1
View File
@@ -124,7 +124,7 @@ SUBSYSTEM_DEF(vote)
if("gamemode")
if(GLOB.master_mode != .)
world.save_mode(.)
if(SSticker && SSticker.mode)
if(SSticker.HasRoundStarted())
restart = 1
else
GLOB.master_mode = .
+4 -3
View File
@@ -482,6 +482,7 @@
/datum/action/language_menu/Trigger()
if(!..())
return FALSE
if(isliving(owner))
var/mob/living/L = owner
L.open_language_menu(usr)
if(ismob(owner))
var/mob/M = owner
var/datum/language_holder/H = M.get_language_holder()
H.open_language_menu(usr)
+46 -71
View File
@@ -1,87 +1,62 @@
//The Datum, Antagonist. Handles various antag things via a datum.
/datum/antagonist
var/mob/living/owner //who's our owner and accordingly an antagonist
var/some_flufftext = "yer an antag larry"
var/prevented_antag_datum_type //the type of antag datum that this datum can't coexist with; should probably be a list
var/silent_update = FALSE //if we suppress messages during on_gain, apply_innate_effects, remove_innate_effects, and on_remove
var/name = "Antagonist"
/datum/antagonist/New()
if(!prevented_antag_datum_type)
prevented_antag_datum_type = type
var/datum/mind/owner //Mind that owns this datum
var/silent = FALSE //Silent will prevent the gain/lose texts to show
var/can_coexist_with_others = TRUE //Whether or not the person will be able to have more than one datum
var/list/typecache_datum_blacklist = list() //List of datums this type can't coexist with
/datum/antagonist/New(datum/mind/new_owner)
typecache_datum_blacklist = typecacheof(typecache_datum_blacklist)
if(new_owner)
owner = new_owner
/datum/antagonist/Destroy()
if(owner)
LAZYREMOVE(owner.antag_datums, src)
owner = null
return ..()
/datum/antagonist/proc/can_be_owned(mob/living/new_body)
return new_body && !new_body.has_antag_datum(prevented_antag_datum_type, TRUE)
/datum/antagonist/proc/can_be_owned(datum/mind/new_owner)
. = TRUE
if(owner.has_antag_datum(type))
return FALSE
for(var/i in owner.antag_datums)
var/datum/antagonist/A = i
if(is_type_in_typecache(src, A.typecache_datum_blacklist))
return FALSE
/datum/antagonist/proc/give_to_body(mob/living/new_body) //tries to give an antag datum to a mob. cancels out if it can't be owned by the new body
if(new_body && can_be_owned(new_body))
new_body.antag_datums += src
owner = new_body
on_gain()
. = src //return the datum if successful
else
qdel(src)
. = FALSE
/datum/antagonist/proc/on_body_transfer(mob/living/old_body, mob/living/new_body)
remove_innate_effects(old_body)
apply_innate_effects(new_body)
/datum/antagonist/proc/on_gain() //on initial gain of antag datum, do this. should only be called once per datum
apply_innate_effects()
if(!silent_update && some_flufftext)
to_chat(owner, some_flufftext)
//This handles the application of antag huds/special abilities
/datum/antagonist/proc/apply_innate_effects(mob/living/mob_override)
return
/datum/antagonist/proc/apply_innate_effects() //applies innate effects to the owner, may be called multiple times due to mind transferral, but should only be called once per mob
//antag huds would go here if antag huds were less completely unworkable as-is
//This handles the removal of antag huds/special abilities
/datum/antagonist/proc/remove_innate_effects(mob/living/mob_override)
return
/datum/antagonist/proc/remove_innate_effects() //removes innate effects from the owner, may be called multiple times due to mind transferral, but should only be called once per mob
//also antag huds but see above antag huds a shit
//Proc called when the datum is given to a mind.
/datum/antagonist/proc/on_gain()
if(owner && owner.current)
if(!silent)
greet()
apply_innate_effects()
/datum/antagonist/proc/on_remove() //totally removes the antag datum from the owner; can only be called once per owner
/datum/antagonist/proc/on_removal()
remove_innate_effects()
owner.antag_datums -= src
if(owner)
LAZYREMOVE(owner.antag_datums, src)
if(!silent && owner.current)
farewell()
qdel(src)
/datum/antagonist/proc/transfer_to_new_body(mob/living/new_body)
remove_innate_effects()
if(!islist(new_body.antag_datums))
new_body.antag_datums = list()
new_body.antag_datums += src
owner.antag_datums -= src
owner = new_body
apply_innate_effects()
/datum/antagonist/proc/greet()
return
//mob var and helper procs/Destroy override
/mob/living
var/list/antag_datums
/mob/living/Destroy() //TODO: merge this with the living/Destroy() in code\modules\mob\living\living.dm (currently line 29)
if(islist(antag_datums))
for(var/i in antag_datums)
qdel(i)
antag_datums = null
return ..()
/mob/living/proc/can_have_antag_datum(datum_type) //if we can have this specific antagonist datum; neccessary, but requires creating a new antag datum each time.
var/datum/antagonist/D = new datum_type()
. = D.can_be_owned(src) //we can't exactly cache the results, either, because conditions might change. avoid use? TODO: better proc
qdel(D)
/mob/living/proc/gain_antag_datum(datum_type) //tries to give a mob a specific antagonist datum; returns the datum if successful.
if(!islist(antag_datums))
antag_datums = list()
var/datum/antagonist/D = new datum_type()
. = D.give_to_body(src)
/mob/living/proc/has_antag_datum(type, check_subtypes) //checks this mob for if it has the antagonist datum. can either check specific type or subtypes
if(!islist(antag_datums))
return FALSE
for(var/i in antag_datums)
var/datum/antagonist/D = i
if(check_subtypes)
if(istype(D, type))
return D //if it finds the datum, will return it so you can mess with it
else
if(D.type == type)
return D
return FALSE
/datum/antagonist/proc/farewell()
return
+87 -91
View File
@@ -1,79 +1,75 @@
//CLOCKCULT PROOF OF CONCEPT
/datum/antagonist/clockcultist
prevented_antag_datum_type = /datum/antagonist/clockcultist
some_flufftext = null
/datum/antagonist/clockcult
var/datum/action/innate/hierophant/hierophant_network = new()
/datum/antagonist/clockcultist/silent
silent_update = TRUE
/datum/antagonist/clockcult/silent
silent = TRUE
/datum/antagonist/clockcultist/Destroy()
/datum/antagonist/clockcult/Destroy()
qdel(hierophant_network)
..()
return ..()
/datum/antagonist/clockcultist/can_be_owned(mob/living/new_body)
/datum/antagonist/clockcult/can_be_owned(datum/mind/new_owner)
. = ..()
if(.)
. = is_eligible_servant(new_body)
if(iscyborg(new_owner.current))
var/mob/living/silicon/robot/R = new_owner.current
if(R.deployed)
var/mob/living/silicon/ai/AI = R.mainframe
R.undeploy()
to_chat(AI, "<span class='userdanger'>Anomaly Detected. Returned to core!</span>") //The AI needs to be in its core to properly be converted
. = is_eligible_servant(new_owner.current)
if(!silent && new_owner.current)
if(issilicon(new_owner.current))
to_chat(new_owner.current, "<span class='heavy_brass'>You are unable to compute this truth. Your vision glows a brilliant yellow, and all at once it comes to you. Ratvar, the \
Clockwork Justiciar, lies in exile, derelict and forgotten in an unseen realm.</span>")
else
to_chat(new_owner.current, "<span class='heavy_brass'>[iscarbon(new_owner.current) ? "Your mind is racing! Your body feels incredibly light! ":""]Your world glows a brilliant \
yellow! All at once it comes to you. Ratvar, the Clockwork Justiciar, lies in exile, derelict and forgotten in an unseen realm.</span>")
if(!.)
new_owner.current.visible_message("<span class='boldwarning'>[new_owner.current] seems to resist an unseen force!</span>")
to_chat(new_owner.current, "<span class='userdanger'>And yet, you somehow push it all away.</span>")
/datum/antagonist/clockcultist/give_to_body(mob/living/new_body)
if(iscyborg(new_body))
var/mob/living/silicon/robot/R = new_body
if(R.deployed)
var/mob/living/silicon/ai/AI = R.mainframe
R.undeploy()
var/converted = add_servant_of_ratvar(AI, silent_update)
to_chat(AI, "<span class='userdanger'>Anomaly Detected. Returned to core!</span>") //The AI needs to be in its core to properly be converted
return converted
if(!silent_update)
if(issilicon(new_body))
to_chat(new_body, "<span class='heavy_brass'>You are unable to compute this truth. Your vision glows a brilliant yellow, and all at once it comes to you. Ratvar, the Clockwork Justiciar, \
lies in exile, derelict and forgotten in an unseen realm.</span>")
else
to_chat(new_body, "<span class='heavy_brass'>[iscarbon(new_body) ? "Your mind is racing! Your body feels incredibly light! ":""]Your world glows a brilliant yellow! All at once it comes to you. \
Ratvar, the Clockwork Justiciar, lies in exile, derelict and forgotten in an unseen realm.</span>")
. = ..()
if(!silent_update && new_body)
if(.)
new_body.visible_message("<span class='heavy_brass'>[new_body]'s eyes glow a blazing yellow!</span>")
to_chat(new_body, "<span class='heavy_brass'>Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork Justiciar above all else. \
Perform his every whim without hesitation.</span>")
else
new_body.visible_message("<span class='boldwarning'>[new_body] seems to resist an unseen force!</span>")
to_chat(new_body, "<span class='userdanger'>And yet, you somehow push it all away.</span>")
/datum/antagonist/clockcult/greet()
if(!owner.current || silent)
return
owner.current.visible_message("<span class='heavy_brass'>[owner.current]'s eyes glow a blazing yellow!</span>")
to_chat(owner.current, "<span class='heavy_brass'>Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork \
Justiciar above all else. Perform his every whim without hesitation.</span>")
/datum/antagonist/clockcultist/on_gain()
if(SSticker && SSticker.mode && owner.mind)
SSticker.mode.servants_of_ratvar += owner.mind
SSticker.mode.update_servant_icons_added(owner.mind)
if(jobban_isbanned(owner, ROLE_SERVANT_OF_RATVAR))
INVOKE_ASYNC(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner, ROLE_SERVANT_OF_RATVAR, ROLE_SERVANT_OF_RATVAR)
if(owner.mind)
owner.mind.special_role = "Servant of Ratvar"
owner.log_message("<font color=#BE8700>Has been converted to the cult of Ratvar!</font>", INDIVIDUAL_ATTACK_LOG)
if(issilicon(owner))
var/mob/living/silicon/S = owner
if(iscyborg(S) && !silent_update)
to_chat(S, "<span class='boldwarning'>You have been desynced from your master AI.\n\
In addition, your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.</span>")
if(isAI(S))
to_chat(S, "<span class='boldwarning'>You are able to use your cameras to listen in on conversations.</span>")
to_chat(S, "<span class='heavy_brass'>You can communicate with other servants by using the Hierophant Network action button in the upper left.</span>")
else if(isbrain(owner) || isclockmob(owner))
to_chat(owner, "<span class='nezbere'>You can communicate with other servants by using the Hierophant Network action button in the upper left.</span>")
/datum/antagonist/clockcult/on_gain()
var/mob/living/current = owner.current
SSticker.mode.servants_of_ratvar += owner
SSticker.mode.update_servant_icons_added(owner)
if(jobban_isbanned(current, ROLE_SERVANT_OF_RATVAR))
addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, current, ROLE_SERVANT_OF_RATVAR, ROLE_SERVANT_OF_RATVAR), 0)
owner.special_role = "Servant of Ratvar"
owner.current.log_message("<font color=#BE8700>Has been converted to the cult of Ratvar!</font>", INDIVIDUAL_ATTACK_LOG)
if(issilicon(current))
if(iscyborg(current) && !silent)
to_chat(current, "<span class='boldwarning'>You have been desynced from your master AI.</span>")
to_chat(current, "<span class='boldwarning'>In addition, your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.</span>")
if(isAI(current))
to_chat(current, "<span class='boldwarning'>You are able to use your cameras to listen in on conversations.</span>")
to_chat(current, "<span class='heavy_brass'>You can communicate with other servants by using the Hierophant Network action button in the upper left.</span>")
else if(isbrain(current) || isclockmob(current))
to_chat(current, "<span class='nezbere'>You can communicate with other servants by using the Hierophant Network action button in the upper left.</span>")
..()
if(istype(SSticker.mode, /datum/game_mode/clockwork_cult))
var/datum/game_mode/clockwork_cult/C = SSticker.mode
C.present_tasks(owner) //Memorize the objectives
/datum/antagonist/clockcultist/apply_innate_effects()
GLOB.all_clockwork_mobs += owner
owner.faction |= "ratvar"
owner.grant_language(/datum/language/ratvar)
owner.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons
if(issilicon(owner))
var/mob/living/silicon/S = owner
/datum/antagonist/clockcult/apply_innate_effects(mob/living/mob_override)
. = ..()
var/mob/living/current = owner.current
if(istype(mob_override))
current = mob_override
GLOB.all_clockwork_mobs += current
current.faction |= "ratvar"
current.grant_language(/datum/language/ratvar)
current.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons
if(issilicon(current))
var/mob/living/silicon/S = current
if(iscyborg(S))
var/mob/living/silicon/robot/R = S
if(!R.shell)
@@ -106,31 +102,33 @@
hierophant_network.title = "Silicon"
hierophant_network.span_for_name = "nezbere"
hierophant_network.span_for_message = "brass"
else if(isbrain(owner))
hierophant_network.Grant(owner)
else if(isbrain(current))
hierophant_network.Grant(current)
hierophant_network.title = "Vessel"
hierophant_network.span_for_name = "nezbere"
hierophant_network.span_for_message = "alloy"
else if(isclockmob(owner))
hierophant_network.Grant(owner)
else if(isclockmob(current))
hierophant_network.Grant(current)
hierophant_network.title = "Construct"
hierophant_network.span_for_name = "nezbere"
hierophant_network.span_for_message = "brass"
owner.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump)
current.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump)
if(!GLOB.clockwork_gateway_activated)
owner.throw_alert("scripturereq", /obj/screen/alert/clockwork/scripture_reqs)
..()
current.throw_alert("scripturereq", /obj/screen/alert/clockwork/scripture_reqs)
/datum/antagonist/clockcultist/remove_innate_effects()
GLOB.all_clockwork_mobs -= owner
owner.faction -= "ratvar"
owner.remove_language(/datum/language/ratvar)
owner.clear_alert("clockinfo")
owner.clear_alert("scripturereq")
for(var/datum/action/innate/function_call/F in owner.actions) //Removes any bound Ratvarian spears
/datum/antagonist/clockcult/remove_innate_effects(mob/living/mob_override)
var/mob/living/current = owner.current
if(istype(mob_override))
current = mob_override
GLOB.all_clockwork_mobs -= current
current.faction -= "ratvar"
current.remove_language(/datum/language/ratvar)
current.clear_alert("clockinfo")
current.clear_alert("scripturereq")
for(var/datum/action/innate/function_call/F in owner.current.actions) //Removes any bound Ratvarian spears
qdel(F)
if(issilicon(owner))
var/mob/living/silicon/S = owner
if(issilicon(current))
var/mob/living/silicon/S = current
if(isAI(S))
var/mob/living/silicon/ai/A = S
A.can_be_carded = initial(A.can_be_carded)
@@ -139,7 +137,7 @@
S.make_laws()
S.update_icons()
S.show_laws()
var/mob/living/temp_owner = owner
var/mob/living/temp_owner = current
..()
if(iscyborg(temp_owner))
var/mob/living/silicon/robot/R = temp_owner
@@ -147,17 +145,15 @@
if(temp_owner)
temp_owner.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them, we need to update buttons
/datum/antagonist/clockcultist/on_remove()
if(!silent_update)
owner.visible_message("<span class='big'>[owner] seems to have remembered their true allegiance!</span>", \
/datum/antagonist/clockcult/on_removal()
SSticker.mode.servants_of_ratvar -= owner
SSticker.mode.update_servant_icons_removed(owner)
if(!silent)
owner.current.visible_message("<span class='big'>[owner] seems to have remembered their true allegiance!</span>", \
"<span class='userdanger'>A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.</span>")
if(SSticker && SSticker.mode && owner.mind)
SSticker.mode.servants_of_ratvar -= owner.mind
SSticker.mode.update_servant_icons_removed(owner.mind)
if(owner.mind)
owner.mind.wipe_memory()
owner.mind.special_role = null
owner.log_message("<font color=#BE8700>Has renounced the cult of Ratvar!</font>", INDIVIDUAL_ATTACK_LOG)
if(iscyborg(owner))
to_chat(owner, "<span class='warning'>Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking.</span>")
..()
owner.current.log_message("<font color=#BE8700>Has renounced the cult of Ratvar!</font>", INDIVIDUAL_ATTACK_LOG)
owner.wipe_memory()
owner.special_role = null
if(iscyborg(owner.current))
to_chat(owner.current, "<span class='warning'>Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking.</span>")
. = ..()
+139 -41
View File
@@ -1,50 +1,148 @@
/datum/antagonist/cultist
prevented_antag_datum_type = /datum/antagonist/cultist
some_flufftext = null
var/datum/action/innate/cultcomm/communion = new()
/datum/antagonist/cult
var/datum/action/innate/cultcomm/communion = new
/datum/antagonist/cultist/Destroy()
qdel(communion)
/datum/antagonist/cult/Destroy()
QDEL_NULL(communion)
return ..()
/datum/antagonist/cultist/can_be_owned(mob/living/new_body)
/datum/antagonist/cult/proc/add_objectives()
var/list/target_candidates = list()
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(player.mind && !player.mind.has_antag_datum(ANTAG_DATUM_CULT) && !is_convertable_to_cult(player) && (player != owner) && player.stat != DEAD)
target_candidates += player.mind
if(target_candidates.len == 0)
message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.")
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(player.mind && !player.mind.has_antag_datum(ANTAG_DATUM_CULT) && (player != owner) && player.stat != DEAD)
target_candidates += player.mind
listclearnulls(target_candidates)
if(LAZYLEN(target_candidates))
GLOB.sac_mind = pick(target_candidates)
if(!GLOB.sac_mind)
message_admins("Cult Sacrifice: ERROR - Null target chosen!")
else
var/datum/job/sacjob = SSjob.GetJob(GLOB.sac_mind.assigned_role)
var/datum/preferences/sacface = GLOB.sac_mind.current.client.prefs
var/icon/reshape = get_flat_human_icon(null, sacjob, sacface)
reshape.Shift(SOUTH, 4)
reshape.Shift(EAST, 1)
reshape.Crop(7,4,26,31)
reshape.Crop(-5,-3,26,30)
GLOB.sac_image = reshape
else
message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!")
GLOB.sac_complete = TRUE
SSticker.mode.cult_objectives += "sacrifice"
SSticker.mode.cult_objectives += "eldergod"
/datum/antagonist/cult/proc/cult_memorization(datum/mind/cult_mind)
var/mob/living/current = cult_mind.current
for(var/obj_count = 1,obj_count <= SSticker.mode.cult_objectives.len,obj_count++)
var/explanation
switch(SSticker.mode.cult_objectives[obj_count])
if("sacrifice")
if(GLOB.sac_mind)
explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role] via invoking a Sacrifice rune with them on it and three acolytes around it."
else
explanation = "The veil has already been weakened here, proceed to the final objective."
if("eldergod")
explanation = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie' with nine acolytes on it. You must do this after sacrificing your target."
if(!silent)
to_chat(current, "<B>Objective #[obj_count]</B>: [explanation]")
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
/datum/antagonist/cult/can_be_owned(datum/mind/new_owner)
. = ..()
if(.)
. = is_convertable_to_cult(new_body)
. = is_convertable_to_cult(new_owner.current)
/datum/antagonist/cultist/on_gain()
if(SSticker && SSticker.mode && owner.mind)
SSticker.mode.cult += owner.mind
SSticker.mode.update_cult_icons_added(owner.mind)
if(istype(SSticker.mode, /datum/game_mode/cult))
var/datum/game_mode/cult/C = SSticker.mode
C.memorize_cult_objectives(owner.mind)
if(jobban_isbanned(owner, ROLE_CULTIST))
INVOKE_ASYNC(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner, ROLE_CULTIST, ROLE_CULTIST)
if(owner.mind)
owner.mind.special_role = "Cultist"
owner.log_message("<font color=#960000>Has been converted to the cult of Nar'Sie!</font>", INDIVIDUAL_ATTACK_LOG)
..()
/datum/antagonist/cult/on_gain()
. = ..()
var/mob/living/current = owner.current
if(!LAZYLEN(SSticker.mode.cult_objectives))
add_objectives()
SSticker.mode.cult += owner // Only add after they've been given objectives
cult_memorization(owner)
if(jobban_isbanned(current, ROLE_CULTIST))
addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, current, ROLE_CULTIST, ROLE_CULTIST), 0)
SSticker.mode.update_cult_icons_added(owner)
current.log_message("<font color=#960000>Has been converted to the cult of Nar'Sie!</font>", INDIVIDUAL_ATTACK_LOG)
if(GLOB.blood_target && GLOB.blood_target_image && current.client)
current.client.images += GLOB.blood_target_image
/datum/antagonist/cultist/apply_innate_effects()
owner.faction |= "cult"
owner.verbs += /mob/living/proc/cult_help
communion.Grant(owner)
..()
/datum/antagonist/cult/apply_innate_effects(mob/living/mob_override)
. = ..()
var/mob/living/current = owner.current
if(mob_override)
current = mob_override
current.faction |= "cult"
current.verbs += /mob/living/proc/cult_help
if(!GLOB.cult_mastered)
current.verbs += /mob/living/proc/cult_master
communion.Grant(current)
current.throw_alert("bloodsense", /obj/screen/alert/bloodsense)
/datum/antagonist/cultist/remove_innate_effects()
owner.faction -= "cult"
owner.verbs -= /mob/living/proc/cult_help
..()
/datum/antagonist/cult/remove_innate_effects(mob/living/mob_override)
. = ..()
var/mob/living/current = owner.current
if(mob_override)
current = mob_override
current.faction -= "cult"
current.verbs -= /mob/living/proc/cult_help
communion.Remove(current)
owner.current.verbs -= /mob/living/proc/cult_master
for(var/datum/action/innate/cultmast/H in owner.current.actions)
qdel(H)
current.clear_alert("bloodsense")
/datum/antagonist/cultist/on_remove()
if(owner.mind)
owner.mind.wipe_memory()
if(SSticker && SSticker.mode)
SSticker.mode.cult -= owner.mind
SSticker.mode.update_cult_icons_removed(owner.mind)
to_chat(owner, "<span class='userdanger'>An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant.</span>")
owner.log_message("<font color=#960000>Has renounced the cult of Nar'Sie!</font>", INDIVIDUAL_ATTACK_LOG)
if(!silent_update)
owner.visible_message("<span class='big'>[owner] looks like [owner.p_they()] just reverted to their old faith!</span>")
..()
/datum/antagonist/cult/on_removal()
owner.wipe_memory()
SSticker.mode.cult -= owner
SSticker.mode.update_cult_icons_removed(owner)
if(!silent)
to_chat(owner.current, "<span class='userdanger'>An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.</span>")
owner.current.log_message("<font color=#960000>Has renounced the cult of Nar'Sie!</font>", INDIVIDUAL_ATTACK_LOG)
owner.current.visible_message("<span class='big'>[owner.current] looks like [owner.current.p_they()] just reverted to their old faith!</span>")
if(GLOB.blood_target && GLOB.blood_target_image && owner.current.client)
owner.current.client.images -= GLOB.blood_target_image
. = ..()
/datum/antagonist/cult/master
var/datum/action/innate/cultmast/finalreck/reckoning = new
var/datum/action/innate/cultmast/cultmark/bloodmark = new
/datum/antagonist/cult/master/Destroy()
QDEL_NULL(reckoning)
QDEL_NULL(bloodmark)
return ..()
/datum/antagonist/cult/master/on_gain()
. = ..()
var/mob/living/current = owner.current
SSticker.mode.set_antag_hud(current, "cultmaster")
/datum/antagonist/cult/master/greet()
to_chat(owner.current, "<span class='cultlarge'>You are the cult's Master</span>. As the cult's Master, you have a unique title and loud voice when communicating, are capable of marking \
targets, such as a location or a noncultist, to direct the cult to them, and, finally, you are capable of summoning the entire living cult to your location <b><i>once</i></b>.")
to_chat(owner.current, "Use these abilities to direct the cult to victory at any cost.")
/datum/antagonist/cult/master/apply_innate_effects(mob/living/mob_override)
. = ..()
var/mob/living/current = owner.current
if(mob_override)
current = mob_override
if(!GLOB.reckoning_complete)
reckoning.Grant(current)
bloodmark.Grant(current)
current.update_action_buttons_icon()
current.apply_status_effect(/datum/status_effect/cult_master)
/datum/antagonist/cult/master/remove_innate_effects(mob/living/mob_override)
. = ..()
var/mob/living/current = owner.current
if(mob_override)
current = mob_override
reckoning.Remove(current)
bloodmark.Remove(current)
current.update_action_buttons_icon()
current.remove_status_effect(/datum/status_effect/cult_master)
+13 -15
View File
@@ -27,7 +27,7 @@
. += "---"
.["Call Proc"] = "?_src_=vars;proc_call=\ref[src]"
.["Mark Object"] = "?_src_=vars;mark_object=\ref[src]"
.["Delete"] = "?_src_=vars;delete=\ref[src]"
.["Delete"] = "?_src_=vars;delete=\ref[src]"
/datum/proc/on_reagent_change()
@@ -94,7 +94,6 @@
CLONE:<font size='1'><a href='?_src_=vars;mobToDamage=[refid];adjustDamage=clone'>[M.getCloneLoss()]</a>
BRAIN:<font size='1'><a href='?_src_=vars;mobToDamage=[refid];adjustDamage=brain'>[M.getBrainLoss()]</a>
STAMINA:<font size='1'><a href='?_src_=vars;mobToDamage=[refid];adjustDamage=stamina'>[M.getStaminaLoss()]</a>
AROUSAL:<font size='1'><a href='?_src_=vars;mobToDamage=[refid];adjustDamage=arousal'>[M.getArousalLoss()]</a>
</font>
"}
else
@@ -447,7 +446,7 @@
var/list/L = value
var/list/items = list()
if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? 50 : 150)))
if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? 50 : 150)))
for (var/i in 1 to L.len)
var/key = L[i]
var/val
@@ -527,16 +526,16 @@
if(T)
callproc_datum(T)
else if(href_list["delete"])
if(!check_rights(R_DEBUG, 0))
return
var/datum/D = locate(href_list["delete"])
if(!D)
to_chat(usr, "Unable to locate item!")
admin_delete(D)
href_list["datumrefresh"] = href_list["delete"]
else if(href_list["delete"])
if(!check_rights(R_DEBUG, 0))
return
var/datum/D = locate(href_list["delete"])
if(!D)
to_chat(usr, "Unable to locate item!")
admin_delete(D)
href_list["datumrefresh"] = href_list["delete"]
else if(href_list["regenerateicons"])
if(!check_rights(0))
return
@@ -1166,8 +1165,6 @@
L.adjustCloneLoss(amount)
if("stamina")
L.adjustStaminaLoss(amount)
if("arousal")
L.adjustArousalLoss(amount)
else
to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]")
return
@@ -1178,3 +1175,4 @@
message_admins(msg)
admin_ticket_log(L, msg)
href_list["datumrefresh"] = href_list["mobToDamage"]
-4
View File
@@ -35,10 +35,6 @@
var/msg = select_message_type(user)
if(params && message_param)
msg = select_param(user, params)
if(findtext(msg, "their"))
msg = replacetext(msg, "their", user.p_their())
if(findtext(msg, "them"))
msg = replacetext(msg, "them", user.p_them())
if(findtext(msg, "%s"))
msg = replacetext(msg, "%s", user.p_s())
+6 -4
View File
@@ -25,7 +25,7 @@
for(var/line in testmerge)
if(line)
log_world("Test merge active of PR #[line]")
feedback_add_details("testmerged_prs","[line]")
SSblackbox.add_details("testmerged_prs","[line]")
log_world("Based off master commit [parentcommit]")
else
log_world(parentcommit)
@@ -75,10 +75,12 @@
if(GLOB.revdata.parentcommit)
to_chat(src, "<b>Server revision compiled on:</b> [GLOB.revdata.date]")
var/prefix = ""
if(GLOB.revdata.testmerge.len)
to_chat(src, GLOB.revdata.GetTestMergeInfo())
to_chat(src, "Based off master commit:")
to_chat(src, "<a href='[config.githuburl]/commit/[GLOB.revdata.parentcommit]'>[GLOB.revdata.parentcommit]</a>")
prefix = "Based off master commit: "
var/pc = GLOB.revdata.parentcommit
to_chat(src, "[prefix]<a href='[config.githuburl]/commit/[pc]'>[copytext(pc, 1, min(length(pc), 7))]</a>")
else
to_chat(src, "Revision unknown")
to_chat(src, "<b>Current Infomational Settings:</b>")
@@ -89,7 +91,7 @@
to_chat(src, "Enforce Continuous Rounds: [config.continuous.len] of [config.modes.len] roundtypes")
to_chat(src, "Allow Midround Antagonists: [config.midround_antag.len] of [config.modes.len] roundtypes")
if(config.show_game_type_odds)
if(SSticker.current_state == GAME_STATE_PLAYING)
if(SSticker.IsRoundInProgress())
var/prob_sum = 0
var/current_odds_differ = FALSE
var/list/probs = list()
+160
View File
@@ -0,0 +1,160 @@
#define HOLOPAD_MAX_DIAL_TIME 200
/mob/camera/aiEye/remote/holo/setLoc()
. = ..()
var/obj/machinery/holopad/H = origin
H.move_hologram(eye_user, loc)
//this datum manages it's own references
/datum/holocall
var/mob/living/user //the one that called
var/obj/machinery/holopad/calling_holopad //the one that sent the call
var/obj/machinery/holopad/connected_holopad //the one that answered the call (may be null)
var/list/dialed_holopads //all things called, will be cleared out to just connected_holopad once answered
var/mob/camera/aiEye/remote/holo/eye //user's eye, once connected
var/obj/effect/overlay/holo_pad_hologram/hologram //user's hologram, once connected
var/call_start_time
//creates a holocall made by `caller` from `calling_pad` to `callees`
/datum/holocall/New(mob/living/caller, obj/machinery/holopad/calling_pad, list/callees)
call_start_time = world.time
user = caller
calling_pad.outgoing_call = src
calling_holopad = calling_pad
dialed_holopads = list()
for(var/I in callees)
var/obj/machinery/holopad/H = I
if(!QDELETED(H) && H.is_operational())
dialed_holopads += H
LAZYADD(H.holo_calls, src)
if(!dialed_holopads.len)
calling_pad.say("Connection failure.")
qdel(src)
return
testing("Holocall started")
//cleans up ALL references :)
/datum/holocall/Destroy()
QDEL_NULL(eye)
user.reset_perspective()
user = null
hologram.HC = null
hologram = null
calling_holopad.outgoing_call = null
for(var/I in dialed_holopads)
var/obj/machinery/holopad/H = I
LAZYREMOVE(H.holo_calls, src)
dialed_holopads.Cut()
if(calling_holopad)
calling_holopad.SetLightsAndPower()
calling_holopad = null
if(connected_holopad)
connected_holopad.SetLightsAndPower()
connected_holopad = null
testing("Holocall destroyed")
return ..()
//Gracefully disconnects a holopad `H` from a call. Pads not in the call are ignored. Notifies participants of the disconnection
/datum/holocall/proc/Disconnect(obj/machinery/holopad/H)
testing("Holocall disconnect")
if(H == connected_holopad)
calling_holopad.say("[usr] disconnected.")
else if(H == calling_holopad && connected_holopad)
connected_holopad.say("[usr] disconnected.")
ConnectionFailure(H, TRUE)
//Forcefully disconnects a holopad `H` from a call. Pads not in the call are ignored.
/datum/holocall/proc/ConnectionFailure(obj/machinery/holopad/H, graceful = FALSE)
testing("Holocall connection failure: graceful [graceful]")
if(H == connected_holopad || H == calling_holopad)
if(!graceful)
calling_holopad.say("Connection failure.")
qdel(src)
return
LAZYREMOVE(H.holo_calls, src)
dialed_holopads -= H
if(!dialed_holopads.len)
if(graceful)
calling_holopad.say("Call rejected.")
testing("No recipients, terminating")
qdel(src)
//Answers a call made to a holopad `H` which cannot be the calling holopad. Pads not in the call are ignored
/datum/holocall/proc/Answer(obj/machinery/holopad/H)
testing("Holocall answer")
if(H == calling_holopad)
CRASH("How cute, a holopad tried to answer itself.")
if(!(H in dialed_holopads))
return
if(connected_holopad)
CRASH("Multi-connection holocall")
for(var/I in dialed_holopads)
if(I == H)
continue
Disconnect(I)
for(var/I in H.holo_calls)
var/datum/holocall/HC = I
if(HC != src)
HC.Disconnect(H)
connected_holopad = H
if(!Check())
return
hologram = H.activate_holo(user)
hologram.HC = src
//eyeobj code is horrid, this is the best copypasta I could make
eye = new
eye.origin = H
eye.eye_initialized = TRUE
eye.eye_user = user
eye.name = "Camera Eye ([user.name])"
user.remote_control = eye
user.reset_perspective(eye)
eye.setLoc(H.loc)
//Checks the validity of a holocall and qdels itself if it's not. Returns TRUE if valid, FALSE otherwise
/datum/holocall/proc/Check()
for(var/I in dialed_holopads)
var/obj/machinery/holopad/H = I
if(!H.is_operational())
ConnectionFailure(H)
if(QDELETED(src))
return FALSE
. = !QDELETED(user) && !user.incapacitated() && !QDELETED(calling_holopad) && calling_holopad.is_operational() && user.loc == calling_holopad.loc
if(.)
if(connected_holopad)
. = !QDELETED(connected_holopad) && connected_holopad.is_operational()
else
. = world.time < (call_start_time + HOLOPAD_MAX_DIAL_TIME)
if(!.)
calling_holopad.say("No answer recieved.")
calling_holopad.temp = ""
if(!.)
testing("Holocall Check fail")
qdel(src)
+10 -8
View File
@@ -136,7 +136,7 @@
return FALSE
//For spawning mineral sheets; internal use only
/datum/material_container/proc/retrieve(sheet_amt, datum/material/M)
/datum/material_container/proc/retrieve(sheet_amt, datum/material/M, target = null)
if(!M.sheet_type)
return 0
if(sheet_amt > 0)
@@ -149,26 +149,28 @@
use_amount_type(sheet_amt * MINERAL_MATERIAL_AMOUNT, M.id)
sheet_amt -= MAX_STACK_SIZE
if(round((sheet_amt * MINERAL_MATERIAL_AMOUNT) / MINERAL_MATERIAL_AMOUNT))
new M.sheet_type(get_turf(owner), sheet_amt)
var/obj/item/stack/sheet/s = new M.sheet_type(get_turf(owner), sheet_amt)
if(target)
s.forceMove(target)
count += sheet_amt
use_amount_type(sheet_amt * MINERAL_MATERIAL_AMOUNT, M.id)
return count
return 0
/datum/material_container/proc/retrieve_sheets(sheet_amt, id)
/datum/material_container/proc/retrieve_sheets(sheet_amt, id, target = null)
if(materials[id])
return retrieve(sheet_amt, materials[id])
return retrieve(sheet_amt, materials[id], target)
return 0
/datum/material_container/proc/retrieve_amount(amt, id)
return retrieve_sheets(amount2sheet(amt), id)
/datum/material_container/proc/retrieve_amount(amt, id, target)
return retrieve_sheets(amount2sheet(amt), id, target)
/datum/material_container/proc/retrieve_all()
/datum/material_container/proc/retrieve_all(target = null)
var/result = 0
var/datum/material/M
for(var/MAT in materials)
M = materials[MAT]
result += retrieve_sheets(amount2sheet(M.amount), MAT)
result += retrieve_sheets(amount2sheet(M.amount), MAT, target)
return result
/datum/material_container/proc/has_space(amt = 0)
+73 -29
View File
@@ -44,9 +44,7 @@
var/datum/job/assigned_job
var/list/datum/objective/objectives = list()
var/list/datum/objective/special_verbs = list()
var/list/cult_words = list()
var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button.
var/datum/faction/faction //associated faction
@@ -54,6 +52,7 @@
var/linglink
var/miming = 0 // Mime's vow of silence
var/list/antag_datums
var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state
var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD
var/datum/gang/gang_datum //Which gang this mind belongs to, if any
@@ -64,19 +63,36 @@
var/mob/living/enslaved_to //If this mind's master is another mob (i.e. adamantine golems)
var/datum/language_holder/language_holder
/datum/mind/New(var/key)
src.key = key
soulOwner = src
/datum/mind/Destroy()
SSticker.minds -= src
if(islist(antag_datums))
for(var/i in antag_datums)
qdel(i)
antag_datums = null
return ..()
/datum/mind/proc/get_language_holder()
if(!language_holder)
var/datum/language_holder/L = current.get_language_holder(shadow=FALSE)
language_holder = L.copy(src)
return language_holder
/datum/mind/proc/transfer_to(mob/new_character, var/force_key_move = 0)
if(current) // remove ourself from our old body's mind variable
current.mind = null
SStgui.on_transfer(current, new_character)
if(!language_holder)
var/datum/language_holder/mob_holder = new_character.get_language_holder(shadow = FALSE)
language_holder = mob_holder.copy(src)
if(key)
if(new_character.key != key) //if we're transfering into a body with a key associated which is not ours
new_character.ghostize(1) //we'll need to ghostize so that key isn't mobless.
@@ -86,13 +102,13 @@
if(new_character.mind) //disassociate any mind currently in our new body's mind variable
new_character.mind.current = null
if(istype(current) && islist(current.antag_datums)) //wow apparently current isn't always living good fucking job SOMEONE
for(var/i in current.antag_datums)
var/datum/antagonist/D = i
D.transfer_to_new_body(new_character)
var/datum/atom_hud/antag/hud_to_transfer = antag_hud//we need this because leave_hud() will clear this list
var/mob/living/old_current = current
current = new_character //associate ourself with our new body
new_character.mind = src //and associate our new body with ourself
for(var/a in antag_datums) //Makes sure all antag datums effects are applied in the new body
var/datum/antagonist/A = a
A.on_body_transfer(old_current, current)
if(iscarbon(new_character))
var/mob/living/carbon/C = new_character
C.last_mind = src
@@ -108,6 +124,41 @@
/datum/mind/proc/wipe_memory()
memory = null
// Datum antag mind procs
/datum/mind/proc/add_antag_datum(datum_type)
if(!datum_type)
return
var/datum/antagonist/A = new datum_type(src)
if(!A.can_be_owned(src))
qdel(A)
return
LAZYADD(antag_datums, A)
A.on_gain()
return A
/datum/mind/proc/remove_antag_datum(datum_type)
if(!datum_type)
return
var/datum/antagonist/A = has_antag_datum(datum_type)
if(A)
A.on_removal()
return TRUE
/datum/mind/proc/remove_all_antag_datums() //For the Lazy amongst us.
for(var/a in antag_datums)
var/datum/antagonist/A = a
A.on_removal()
/datum/mind/proc/has_antag_datum(datum_type, check_subtypes = TRUE)
if(!datum_type)
return
. = FALSE
for(var/a in antag_datums)
var/datum/antagonist/A = a
if(check_subtypes && istype(A, datum_type))
return A
else if(A.type == datum_type)
return A
/*
Removes antag type's references from a mind.
@@ -234,7 +285,7 @@
creator.faction |= current.faction
if(creator.mind.special_role)
message_admins("[key_name_admin(current)](<A HREF='?_src_=holder;adminmoreinfo=\ref[current]'>?</A>) has been created by [key_name_admin(creator)](<A HREF='?_src_=holder;adminmoreinfo=\ref[creator]'>?</A>), an antagonist.")
message_admins("[ADMIN_LOOKUPFLW(current)] has been created by [ADMIN_LOOKUPFLW(creator)], an antagonist.")
to_chat(current, "<span class='userdanger'>Despite your creators current allegiances, your true master remains [creator.real_name]. If their loyalities change, so do yours. This will never change unless your creator's body is destroyed.</span>")
/datum/mind/proc/show_memory(mob/recipient, window=1)
@@ -255,7 +306,7 @@
to_chat(recipient, "<i>[output]</i>")
/datum/mind/proc/edit_memory()
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
alert("Not before round-start!", "Alert")
return
@@ -1143,7 +1194,7 @@
log_admin("[key_name_admin(usr)] has made [current] unable to ascend as a devil.")
return
if(!ishuman(current) && !iscyborg(current))
to_chat(usr, "<span class='warning'>This only works on humans and cyborgs!</span>")
to_chat(usr, "<span class='warning'>This only works on humans and cyborgs!</span>")
return
SSticker.mode.devils += src
special_role = "devil"
@@ -1192,17 +1243,17 @@
log_admin("[key_name(usr)] turned [current] into abductor.")
SSticker.mode.update_abductor_icons_added(src)
if("equip")
if(!ishuman(current))
to_chat(usr, "<span class='warning'>This only works on humans!</span>")
return
var/mob/living/carbon/human/H = current
if(!ishuman(current))
to_chat(usr, "<span class='warning'>This only works on humans!</span>")
return
var/mob/living/carbon/human/H = current
var/gear = alert("Agent or Scientist Gear","Gear","Agent","Scientist")
if(gear)
if(gear=="Agent")
H.equipOutfit(/datum/outfit/abductor/agent)
H.equipOutfit(/datum/outfit/abductor/agent)
else
H.equipOutfit(/datum/outfit/abductor/scientist)
H.equipOutfit(/datum/outfit/abductor/scientist)
else if (href_list["monkey"])
var/mob/living/L = current
@@ -1399,15 +1450,8 @@
special_role = "Cultist"
to_chat(current, "<font color=\"purple\"><b><i>You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie.</b></i></font>")
to_chat(current, "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>")
var/datum/game_mode/cult/cult = SSticker.mode
if (istype(cult))
cult.memorize_cult_objectives(src)
else
var/explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it."
to_chat(current, "<B>Objective #1</B>: [explanation]")
memory += "<B>Objective #1</B>: [explanation]<BR>"
var/datum/antagonist/cult/C
C.cult_memorization(src)
var/mob/living/carbon/human/H = current
if (!SSticker.mode.equip_cultist(current))
to_chat(H, "Spawning an amulet from your Master failed.")
@@ -1471,8 +1515,8 @@
H.set_species(/datum/species/abductor)
var/datum/species/abductor/S = H.dna.species
if(role == "Scientist")
S.scientist = TRUE
if(role == "Scientist")
S.scientist = TRUE
S.team = team
var/list/obj/effect/landmark/abductor/agent_landmarks = new
@@ -1491,8 +1535,8 @@
if("Agent")
L = agent_landmarks[team]
if("Scientist")
L = scientist_landmarks[team]
H.forceMove(L.loc)
L = scientist_landmarks[team]
H.forceMove(L.loc)
/datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S)
spell_list += S
+1
View File
@@ -42,6 +42,7 @@
However, all the inhabitants seem to do is grow drugs and guns."
suffix = "lavaland_surface_seed_vault.dmm"
cost = 10
allow_duplicates = FALSE
/datum/map_template/ruin/lavaland/ash_walker
name = "Ash Walker Nest"
+7
View File
@@ -43,6 +43,13 @@
name = "Asteroid 5"
description = "Oh my god, another giant rock!"
/datum/map_template/ruin/space/deep_storage
id = "deep-storage"
suffix = "deepstorage.dmm"
name = "Survivalist Bunker"
description = "Assume the best, prepare for the worst. Generally, you should do so by digging a three man heavily fortified bunker into a giant unused asteroid. \
Then make it self sufficient, mask any evidence of construction, hook it covertly into the telecommunications network and hope for the best."
/datum/map_template/ruin/space/bigderelict1
id = "bigderelict1"
suffix = "bigderelict1.dmm"
+1 -1
View File
@@ -72,7 +72,7 @@
/datum/map_template/shuttle/emergency/meteor
suffix = "meteor"
name = "An Asteroid With Engines Strapped To It"
name = "Asteroid With Engines Strapped To It"
description = "A hollowed out asteroid with engines strapped to it. Due to its size and difficulty in steering it, this shuttle may damage the docking area."
admin_notes = "This shuttle will likely crush escape, killing anyone there."
credit_cost = -5000
+36
View File
@@ -13,6 +13,7 @@
/datum/status_effect/shadow_mend/on_apply()
owner.visible_message("<span class='notice'>Violet light wraps around [owner]'s body!</span>", "<span class='notice'>Violet light wraps around your body!</span>")
playsound(owner, 'sound/magic/Teleport_app.ogg', 50, 1)
return ..()
/datum/status_effect/shadow_mend/tick()
owner.adjustBruteLoss(-15)
@@ -72,9 +73,12 @@
add_logs(owner, null, "gained Vanguard stun immunity")
owner.add_stun_absorption("vanguard", 200, 1, "'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!", " radiating with a soft yellow light!")
owner.visible_message("<span class='warning'>[owner] begins to faintly glow!</span>", "<span class='brass'>You will absorb all stuns for the next twenty seconds.</span>")
owner.SetStunned(0, FALSE)
owner.SetWeakened(0)
progbar = new(owner, duration, owner)
progbar.bar.color = list("#FAE48C", "#FAE48C", "#FAE48C", rgb(0,0,0))
progbar.update(duration - world.time)
return ..()
/datum/status_effect/vanguard_shield/tick()
progbar.update(duration - world.time)
@@ -127,6 +131,7 @@
animate(owner, color = oldcolor, time = 150, easing = EASE_IN)
addtimer(CALLBACK(owner, /atom/proc/update_atom_colour), 150)
playsound(owner, 'sound/magic/Ethereal_Enter.ogg', 50, 1)
return ..()
/datum/status_effect/inathneqs_endowment/on_remove()
add_logs(owner, null, "lost Inath-neq's invulnerability")
@@ -178,6 +183,7 @@
/datum/status_effect/his_grace/on_apply()
add_logs(owner, null, "gained His Grace's stun immunity")
owner.add_stun_absorption("hisgrace", INFINITY, 3, null, "His Grace protects you from the stun!")
return ..()
/datum/status_effect/his_grace/tick()
bloodlust = 0
@@ -211,6 +217,7 @@
/datum/status_effect/wish_granters_gift/on_apply()
to_chat(owner, "<span class='notice'>Death is not your end! The Wish Granter's energy suffuses you, and you begin to rise...</span>")
return ..()
/datum/status_effect/wish_granters_gift/on_remove()
owner.revive(full_heal = 1, admin_revive = 1)
@@ -221,3 +228,32 @@
name = "Wish Granter's Immortality"
desc = "You are being resurrected!"
icon_state = "wish_granter"
/datum/status_effect/cult_master
id = "The Cult Master"
duration = -1
tick_interval = 100
alert_type = null
var/alive = TRUE
/datum/status_effect/cult_master/proc/deathrattle()
var/area/A = get_area(owner)
for(var/datum/mind/B in SSticker.mode.cult)
if(isliving(B.current))
var/mob/living/M = B.current
M << 'sound/hallucinations/veryfar_noise.ogg'
to_chat(M, "<span class='cultlarge'>The Cult's Master, [owner], has fallen in the [A]!")
/datum/status_effect/cult_master/tick()
if(owner.stat != DEAD && !alive)
alive = TRUE
return
if(owner.stat == DEAD && alive)
alive = FALSE
deathrattle()
/datum/status_effect/cult_master/on_remove()
deathrattle()
. = ..()
+133
View File
@@ -29,3 +29,136 @@
owner.adjustBruteLoss(0.1)
owner.adjustFireLoss(0.1)
owner.adjustToxLoss(0.2, TRUE, TRUE)
/datum/status_effect/belligerent
id = "belligerent"
duration = 70
tick_interval = 0 //tick as fast as possible
status_type = STATUS_EFFECT_REPLACE
alert_type = /obj/screen/alert/status_effect/belligerent
var/leg_damage_on_toggle = 2 //damage on initial application and when the owner tries to toggle to run
var/cultist_damage_on_toggle = 10 //damage on initial application and when the owner tries to toggle to run, but to cultists
/obj/screen/alert/status_effect/belligerent
name = "Belligerent"
desc = "<b><font color=#880020>Kneel, her-eti'c.</font></b>"
icon_state = "belligerent"
alerttooltipstyle = "clockcult"
/datum/status_effect/belligerent/on_apply()
return do_movement_toggle(TRUE)
/datum/status_effect/belligerent/tick()
if(!do_movement_toggle())
qdel(src)
/datum/status_effect/belligerent/proc/do_movement_toggle(force_damage)
var/number_legs = owner.get_num_legs()
if(iscarbon(owner) && !is_servant_of_ratvar(owner) && !owner.null_rod_check() && number_legs)
if(force_damage || owner.m_intent != MOVE_INTENT_WALK)
if(GLOB.ratvar_awakens)
owner.Weaken(1)
if(iscultist(owner))
owner.apply_damage(cultist_damage_on_toggle * 0.5, BURN, "l_leg")
owner.apply_damage(cultist_damage_on_toggle * 0.5, BURN, "r_leg")
else
owner.apply_damage(leg_damage_on_toggle * 0.5, BURN, "l_leg")
owner.apply_damage(leg_damage_on_toggle * 0.5, BURN, "r_leg")
if(owner.m_intent != MOVE_INTENT_WALK)
if(!iscultist(owner))
to_chat(owner, "<span class='warning'>Your leg[number_legs > 1 ? "s shiver":" shivers"] with pain!</span>")
else //Cultists take extra burn damage
to_chat(owner, "<span class='warning'>Your leg[number_legs > 1 ? "s burn":" burns"] with pain!</span>")
owner.toggle_move_intent()
return TRUE
return FALSE
/datum/status_effect/belligerent/on_remove()
if(owner.m_intent == MOVE_INTENT_WALK)
owner.toggle_move_intent()
/datum/status_effect/maniamotor
id = "maniamotor"
duration = -1
tick_interval = 10
status_type = STATUS_EFFECT_MULTIPLE
alert_type = null
var/obj/structure/destructible/clockwork/powered/mania_motor/motor
var/severity = 0 //goes up to a maximum of MAX_MANIA_SEVERITY
var/warned_turnoff = FALSE //if we've warned that the motor is off
var/warned_outofsight = FALSE //if we've warned that the target is out of sight of the motor
var/static/list/mania_messages = list("Go nuts.", "Take a crack at crazy.", "Make a bid for insanity.", "Get kooky.", "Move towards mania.", "Become bewildered.", "Wax wild.", \
"Go round the bend.", "Land in lunacy.", "Try dementia.", "Strive to get a screw loose.", "Advance forward.", "Approach the transmitter.", "Touch the antennae.", \
"Move towards the mania motor.", "Come closer.", "Get over here already!", "Keep your eyes on the motor.")
var/static/list/flee_messages = list("Oh, NOW you flee.", "Get back here!", "If you were smarter, you'd come back.", "Only fools run.", "You'll be back.")
var/static/list/turnoff_messages = list("Why would they turn it-", "What are these idi-", "Fools, fools, all of-", "Are they trying to c-", "All this effort just f-")
var/static/list/powerloss_messages = list("\"Oh, the id**ts di***t s***e en**** pow**...\"", "\"D*dn't **ey mak* an **te***c*i*n le**?\"", "\"The** f**ls for**t t* make a ***** *f-\"", \
"\"No, *O, you **re so cl***-\"", "You hear a yell of frustration, cut off by static.")
/datum/status_effect/maniamotor/Destroy()
motor = null
return ..()
/datum/status_effect/maniamotor/tick()
var/is_servant = is_servant_of_ratvar(owner)
var/span_part = severity > 50 ? "" : "_small" //let's save like one check
if(QDELETED(motor))
if(!is_servant)
to_chat(owner, "<span class='sevtug[span_part]'>You feel a frustrated voice quietly fade from your mind...</span>")
qdel(src)
return
if(!motor.active) //it being off makes it fall off much faster
if(!is_servant && !warned_turnoff)
if(motor.total_accessable_power() > motor.mania_cost)
to_chat(owner, "<span class='sevtug[span_part]'>\"[text2ratvar(pick(turnoff_messages))]\"</span>")
else
to_chat(owner, "<span class='sevtug[span_part]'>[text2ratvar(pick(powerloss_messages))]</span>")
warned_turnoff = TRUE
severity = max(severity - 2, 0)
if(!severity)
qdel(src)
return
else
if(prob(severity * 2))
warned_turnoff = FALSE
if(!(owner in viewers(7, motor))) //not being in range makes it fall off slightly faster
if(!is_servant && !warned_outofsight)
to_chat(owner, "<span class='sevtug[span_part]'>\"[text2ratvar(pick(flee_messages))]\"</span>")
warned_outofsight = TRUE
severity = max(severity - 1, 0)
if(!severity)
qdel(src)
return
else if(prob(severity * 2))
warned_outofsight = FALSE
if(is_servant) //heals servants of braindamage, hallucination, druggy, dizziness, and confusion
if(owner.hallucination)
owner.hallucination = 0
if(owner.druggy)
owner.adjust_drugginess(-owner.druggy)
if(owner.dizziness)
owner.dizziness = 0
if(owner.confused)
owner.confused = 0
severity = 0
else if(!owner.null_rod_check() && owner.stat != DEAD && severity)
var/static/hum = get_sfx('sound/effects/screech.ogg') //same sound for every proc call
if(owner.getToxLoss() > MANIA_DAMAGE_TO_CONVERT)
if(is_eligible_servant(owner))
to_chat(owner, "<span class='sevtug[span_part]'>\"[text2ratvar("You are mine and his, now.")]\"</span>")
add_servant_of_ratvar(owner)
owner.Paralyse(5)
else
if(prob(severity * 0.15))
to_chat(owner, "<span class='sevtug[span_part]'>\"[text2ratvar(pick(mania_messages))]\"</span>")
owner.playsound_local(get_turf(motor), hum, severity, 1)
owner.adjust_drugginess(Clamp(max(severity * 0.075, 1), 0, max(0, 50 - owner.druggy))) //7.5% of severity per second, minimum 1
if(owner.hallucination < 50)
owner.hallucination = min(owner.hallucination + max(severity * 0.075, 1), 50) //7.5% of severity per second, minimum 1
if(owner.dizziness < 50)
owner.dizziness = min(owner.dizziness + round(severity * 0.05, 1), 50) //5% of severity per second above 10 severity
if(owner.confused < 25)
owner.confused = min(owner.confused + round(severity * 0.025, 1), 25) //2.5% of severity per second above 20 severity
owner.adjustToxLoss(severity * 0.02, TRUE, TRUE) //2% of severity per second
severity--
+1
View File
@@ -16,6 +16,7 @@
cube = icon('icons/effects/freeze.dmi', "ice_cube")
owner.add_overlay(cube)
owner.update_canmove()
return ..()
/datum/status_effect/freon/tick()
owner.update_canmove()
+18 -5
View File
@@ -8,7 +8,9 @@
var/tick_interval = 10 //How many deciseconds between ticks, approximately. Leave at 10 for every second.
var/mob/living/owner //The mob affected by the status effect.
var/status_type = STATUS_EFFECT_UNIQUE //How many of the effect can be on one mob, and what happens when you try to add another
var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted
var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description
var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists
/datum/status_effect/New(mob/living/new_owner)
if(new_owner)
@@ -21,23 +23,24 @@
STOP_PROCESSING(SSfastprocess, src)
if(owner)
owner.clear_alert(id)
on_remove()
LAZYREMOVE(owner.status_effects, src)
on_remove()
owner = null
return ..()
/datum/status_effect/proc/start_ticking()
if(!src)
return
if(!owner)
if(!owner || !on_apply())
qdel(src)
return
on_apply()
if(duration != -1)
duration = world.time + initial(duration)
tick_interval = world.time + initial(tick_interval)
if(alert_type)
var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type)
A.attached_effect = src //so the alert can reference us, if it needs to
linked_alert = A //so we can reference the alert, if we need to
START_PROCESSING(SSfastprocess, src)
/datum/status_effect/process()
@@ -51,9 +54,11 @@
qdel(src)
/datum/status_effect/proc/on_apply() //Called whenever the buff is applied.
return TRUE
/datum/status_effect/proc/tick() //Called every tick.
/datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed.
/datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself
/datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed; do note that at the point this is called, it is out of the owner's status_effects but owner is not yet null
/datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself or when a status effect with on_remove_on_mob_delete = FALSE has its mob deleted
owner.clear_alert(id)
LAZYREMOVE(owner.status_effects, src)
owner = null
@@ -101,3 +106,11 @@
for(var/datum/status_effect/S in status_effects)
if(initial(S1.id) == S.id)
return S
/mob/living/proc/has_status_effect_list(effect) //returns a list of effects with matching IDs that the mod owns; use for effects there can be multiple of
. = list()
if(status_effects)
var/datum/status_effect/S1 = effect
for(var/datum/status_effect/S in status_effects)
if(initial(S1.id) == S.id)
. += S
+3 -4
View File
@@ -96,16 +96,15 @@
/area/holodeck/rec_center/kobayashi
name = "Holodeck - Kobayashi Maru"
/area/holodeck/rec_center/winterwonderland
name = "Holodeck - Winter Wonderland"
// Bad programs
/area/holodeck/rec_center/burn
name = "Holodeck - Atmospheric Burn Test"
restricted = 1
/area/holodeck/rec_center/winterwonderland
name = "Holodeck - Winter Wonderland"
restricted = 1
/area/holodeck/rec_center/wildlife
name = "Holodeck - Wildlife Simulation"
restricted = 1
+2 -1
View File
@@ -43,7 +43,7 @@
if(SSatoms.InitAtom(src, args))
//we were deleted
return
var/list/created = SSatoms.created_atoms
if(created)
created += src
@@ -274,6 +274,7 @@
return
/atom/proc/ex_act(severity, target)
set waitfor = FALSE
contents_explosion(severity, target)
/atom/proc/blob_act(obj/structure/blob/B)
+52 -27
View File
@@ -13,9 +13,9 @@
var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported
var/throw_range = 7
var/mob/pulledby = null
var/list/languages
var/list/initial_languages = list(/datum/language/common)
var/only_speaks_language = null
var/initial_language_holder = /datum/language_holder
var/datum/language_holder/language_holder
var/datum/language_menu/language_menu = null
var/verb_say = "says"
var/verb_ask = "asks"
var/verb_exclaim = "exclaims"
@@ -44,10 +44,6 @@
return FALSE
return ..()
/atom/movable/Initialize(mapload)
. = ..()
for(var/L in initial_languages)
grant_language(L)
/atom/movable/Move(atom/newloc, direct = 0)
if(!loc || !newloc) return 0
@@ -120,7 +116,7 @@
if(flags & CLEAN_ON_MOVE)
clean_on_move()
var/datum/proximity_monitor/proximity_monitor = src.proximity_monitor
if(proximity_monitor)
proximity_monitor.HandleMove()
@@ -177,6 +173,7 @@
STOP_PROCESSING(SSinbounds, src)
QDEL_NULL(proximity_monitor)
QDEL_NULL(language_holder)
. = ..()
if(loc)
@@ -576,44 +573,70 @@
/* Language procs */
/atom/movable/proc/get_language_holder(shadow=TRUE)
if(language_holder)
return language_holder
else
language_holder = new initial_language_holder(src)
return language_holder
/atom/movable/proc/grant_language(datum/language/dt)
LAZYINITLIST(languages)
languages[dt] = TRUE
var/datum/language_holder/H = get_language_holder()
H.grant_language(dt)
/atom/movable/proc/grant_all_languages(omnitongue=FALSE)
for(var/la in subtypesof(/datum/language))
grant_language(la)
if(omnitongue)
SET_SECONDARY_FLAG(src, OMNITONGUE)
var/datum/language_holder/H = get_language_holder()
H.grant_all_languages(omnitongue)
/atom/movable/proc/get_random_understood_language()
var/list/possible = list()
for(var/dt in languages)
possible += dt
. = safepick(possible)
var/datum/language_holder/H = get_language_holder()
. = H.get_random_understood_language()
/atom/movable/proc/remove_language(datum/language/dt)
LAZYREMOVE(languages, dt)
var/datum/language_holder/H = get_language_holder()
H.remove_language(dt)
/atom/movable/proc/remove_all_languages()
LAZYCLEARLIST(languages)
var/datum/language_holder/H = get_language_holder()
H.remove_all_languages()
/atom/movable/proc/has_language(datum/language/dt)
. = is_type_in_typecache(dt, languages)
var/datum/language_holder/H = get_language_holder()
. = H.has_language(dt)
// Whether an AM can speak in a language or not, independent of whether
// it KNOWS the language
/atom/movable/proc/could_speak_in_language(datum/language/dt)
. = TRUE
/atom/movable/proc/can_speak_in_language(datum/language/dt)
. = has_language(dt)
if(only_speaks_language && !HAS_SECONDARY_FLAG(src, OMNITONGUE))
. = . && ispath(only_speaks_language, dt)
var/datum/language_holder/H = get_language_holder()
if(!H.has_language(dt))
return FALSE
else if(H.omnitongue || could_speak_in_language(dt))
return TRUE
else
return FALSE
/atom/movable/proc/get_default_language()
// if no language is specified, and we want to say() something, which
// language do we use?
var/datum/language_holder/H = get_language_holder()
if(H.selected_default_language)
if(H.has_language(H.selected_default_language))
return H.selected_default_language
else
H.selected_default_language = null
var/datum/language/chosen_langtype
var/highest_priority
for(var/lt in languages)
for(var/lt in H.languages)
var/datum/language/langtype = lt
if(!can_speak_in_language(langtype))
continue
@@ -622,8 +645,10 @@
if(!highest_priority || (pri > highest_priority))
chosen_langtype = langtype
highest_priority = pri
H.selected_default_language = .
. = chosen_langtype
/* End language procs */
/atom/movable/proc/ConveyorMove(movedir)
set waitfor = FALSE
if(!anchored && has_gravity())
+1 -1
View File
@@ -24,7 +24,7 @@
if(!istype(H)) return 0
var/obj/item/clothing/under/U = H.w_uniform
if(!istype(U)) return 0
if(U.sensor_mode <= 2) return 0
if(U.sensor_mode <= SENSOR_VITALS) return 0
return 1
/datum/atom_hud/data/human/medical/basic/add_to_single_hud(mob/M, mob/living/carbon/H)
+2 -1
View File
@@ -155,7 +155,8 @@
if(!(check_usability(user)))
return
var/list/nuke_candidates = pollCandidatesForMob("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, src)
to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>")
var/list/nuke_candidates = pollCandidatesForMob("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE, src)
if(nuke_candidates.len)
if(!(check_usability(user)))
return
+3 -3
View File
@@ -20,7 +20,7 @@
if(round_converted) //So badmin blobs later don't step on the dead natural blobs metaphorical toes
..()
if(blobwincount <= GLOB.blobs_legit.len)
feedback_set_details("round_end_result","win - blob took over")
SSblackbox.set_details("round_end_result","win - blob took over")
to_chat(world, "<FONT size = 3><B>The blob has taken over the station!</B></FONT>")
to_chat(world, "<B>The entire station was eaten by the Blob!</B>")
log_game("Blob mode completed with a blob victory.")
@@ -28,7 +28,7 @@
SSticker.news_report = BLOB_WIN
else if(station_was_nuked)
feedback_set_details("round_end_result","halfwin - nuke")
SSblackbox.set_details("round_end_result","halfwin - nuke")
to_chat(world, "<FONT size = 3><B>Partial Win: The station has been destroyed!</B></FONT>")
to_chat(world, "<B>Directive 7-12 has been successfully carried out, preventing the Blob from spreading.</B>")
log_game("Blob mode completed with a tie (station destroyed).")
@@ -36,7 +36,7 @@
SSticker.news_report = BLOB_NUKE
else if(!GLOB.blob_cores.len)
feedback_set_details("round_end_result","loss - blob eliminated")
SSblackbox.set_details("round_end_result","loss - blob eliminated")
to_chat(world, "<FONT size = 3><B>The staff has won!</B></FONT>")
to_chat(world, "<B>The alien organism has been eradicated from the station!</B>")
log_game("Blob mode completed with a crew victory.")

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