diff --git a/SQL/mentor.sql b/SQL/mentor.sql
index c5fb7f0d83..45d0829d88 100644
--- a/SQL/mentor.sql
+++ b/SQL/mentor.sql
@@ -5,10 +5,10 @@ CREATE TABLE `mentor_memo` (
`last_editor` varchar(32) DEFAULT NULL,
`edits` text,
PRIMARY KEY (`ckey`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `mentor` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ckey` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
\ No newline at end of file
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
diff --git a/SQL/mentor_prefixed.sql b/SQL/mentor_prefixed.sql
new file mode 100644
index 0000000000..81e76f333e
--- /dev/null
+++ b/SQL/mentor_prefixed.sql
@@ -0,0 +1,14 @@
+CREATE TABLE `SS13_mentor_memo` (
+ `ckey` varchar(32) NOT NULL,
+ `memotext` text NOT NULL,
+ `timestamp` datetime NOT NULL,
+ `last_editor` varchar(32) DEFAULT NULL,
+ `edits` text,
+ PRIMARY KEY (`ckey`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+
+CREATE TABLE `SS13_mentor` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `ckey` varchar(32) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm
index 4afaec6895..f85f83092b 100644
--- a/_maps/map_files/CogStation/CogStation.dmm
+++ b/_maps/map_files/CogStation/CogStation.dmm
@@ -1678,13 +1678,6 @@
},
/turf/open/floor/plasteel,
/area/commons/lounge)
-"aen" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/obj/effect/landmark/start/stowaway,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"aeo" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/circuitboard/machine/sleeper,
@@ -5125,20 +5118,6 @@
},
/turf/open/floor/carpet/arcade,
/area/commons/arcade)
-"ani" = (
-/obj/machinery/disposal/bin,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/structure/sign/poster/official/duelshotgun{
- pixel_y = -32
- },
-/turf/open/floor/plasteel,
-/area/security/brig)
"anj" = (
/obj/machinery/holopad,
/obj/effect/turf_decal/bot,
@@ -68151,6 +68130,13 @@
/obj/machinery/atmospherics/pipe/layer_manifold,
/turf/open/floor/plating,
/area/engineering/atmos)
+"dXW" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"dYm" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/obj/effect/turf_decal/stripes/line{
@@ -68542,13 +68528,6 @@
},
/turf/open/floor/plasteel,
/area/engineering/secure_construction)
-"fYf" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/landmark/start/stowaway,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"gfX" = (
/obj/effect/landmark/navigate_destination/cargo,
/turf/open/floor/plasteel,
@@ -68712,15 +68691,6 @@
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
/area/engineering/storage/tech)
-"hqL" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/obj/effect/landmark/start/stowaway,
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
"htU" = (
/obj/machinery/chem_dispenser,
/turf/open/floor/plating,
@@ -68905,6 +68875,10 @@
/obj/structure/chair/stool,
/turf/open/floor/plasteel,
/area/cargo/office)
+"iEf" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/central)
"iLw" = (
/obj/machinery/door/airlock/security/glass{
name = "Advanced Interrogation"
@@ -69192,6 +69166,16 @@
},
/turf/open/floor/plating,
/area/cargo/storage)
+"kPi" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"kTm" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/landmark/start/prisoner,
@@ -69354,6 +69338,20 @@
},
/turf/closed/wall/mineral/wood,
/area/commons/fitness/cogpool)
+"maU" = (
+/obj/machinery/disposal/bin,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/structure/sign/poster/official/bless_this_spess{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"mfj" = (
/obj/machinery/firealarm{
pixel_y = 26
@@ -70297,16 +70295,6 @@
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/plasteel/dark,
/area/service/hydroponics/garden)
-"snC" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/landmark/start/stowaway,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
"spo" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -70514,10 +70502,6 @@
},
/turf/open/floor/plating,
/area/router)
-"tvk" = (
-/obj/effect/landmark/start/stowaway,
-/turf/open/floor/plating,
-/area/maintenance/port/central)
"tyI" = (
/obj/machinery/atmospherics/pipe/simple/supplymain/visible{
dir = 4
@@ -70632,6 +70616,15 @@
},
/turf/open/floor/plasteel,
/area/cargo/storage)
+"ulg" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
"unW" = (
/obj/effect/landmark/navigate_destination/med,
/turf/open/floor/plasteel/white,
@@ -70722,16 +70715,6 @@
},
/turf/open/floor/plating,
/area/cargo/storage)
-"uPD" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
- },
-/obj/effect/landmark/start/stowaway,
-/turf/open/floor/plating,
-/area/maintenance/fore)
"uPN" = (
/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 8
@@ -71019,6 +71002,13 @@
/obj/structure/filingcabinet,
/turf/open/floor/carpet,
/area/medical/psychology)
+"wUe" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 9
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"wUI" = (
/obj/effect/turf_decal/tile/neutral,
/obj/structure/table,
@@ -71213,6 +71203,16 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"xWP" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/plating,
+/area/maintenance/fore)
"xXs" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -95272,7 +95272,7 @@ adb
anU
aeQ
aeM
-ani
+maU
aew
aeJ
aeJ
@@ -98145,7 +98145,7 @@ aQL
aQL
aQL
aTS
-tvk
+iEf
bcR
bjG
blk
@@ -98622,7 +98622,7 @@ amS
amS
aDE
amS
-hqL
+ulg
aKR
apY
bRa
@@ -103489,7 +103489,7 @@ hzz
aaa
acb
acS
-aen
+wUe
afi
agg
ahj
@@ -107094,7 +107094,7 @@ ajw
ajw
ajw
awN
-uPD
+xWP
bGl
ahA
aiQ
@@ -111977,7 +111977,7 @@ ahP
ahP
akj
ahP
-snC
+kPi
aiB
afK
ahU
@@ -113360,7 +113360,7 @@ bqM
btL
bBm
btC
-fYf
+dXW
bta
btV
cfG
diff --git a/_maps/map_files/FestiveBall/FestiveStation.dmm b/_maps/map_files/FestiveBall/FestiveStation.dmm
index b46f07e46a..feb2ee2f13 100644
--- a/_maps/map_files/FestiveBall/FestiveStation.dmm
+++ b/_maps/map_files/FestiveBall/FestiveStation.dmm
@@ -2634,36 +2634,11 @@
/obj/machinery/light/floor,
/turf/open/floor/festive/wooden/wooden1,
/area/command/corporate_showroom)
-"agT" = (
-/obj/structure/table/wood/fancy/green,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/item/clothing/under/syndicate/baseball,
-/obj/item/clothing/head/beret/sec{
- armor = list("melee"=0,"bullet"=0,"laser"=0,"energy"=0,"bomb"=0,"bio"=0,"rad"=0);
- desc = "A replica beret resembling that of a special operations officer under Nanotrasen.";
- name = "replica officer's beret"
- },
-/turf/open/floor/festive/wooden/wooden1,
-/area/command/corporate_showroom)
"agU" = (
/obj/structure/showcase/mecha/marauder,
/obj/machinery/light/floor,
/turf/open/floor/festive/wooden/wooden1,
/area/command/corporate_showroom)
-"agV" = (
-/obj/structure/table/wood/fancy/red,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/item/clothing/head/centhat{
- armor = list("melee"=0,"bullet"=0,"laser"=0,"energy"=0,"bomb"=0,"bio"=0,"rad"=0);
- desc = "A replica hat of a Central Commander's attire. It has a small tag on it saying, 'It's good to be emperor.'";
- name = "Replica CentCom hat"
- },
-/turf/open/floor/festive/wooden/wooden1,
-/area/command/corporate_showroom)
"agW" = (
/obj/structure/table/wood/fancy/green,
/obj/item/folder/blue,
@@ -20379,13 +20354,6 @@
},
/turf/open/floor/festive/alleyway,
/area/edina/street/secondary/command)
-"baX" = (
-/obj/machinery/computer/prisoner/management,
-/obj/structure/sign/poster/official/duelshotgun{
- pixel_y = 32
- },
-/turf/open/floor/wood,
-/area/security/warden)
"baY" = (
/obj/effect/landmark/start/botanist,
/turf/open/floor/plasteel,
@@ -35552,14 +35520,6 @@
},
/turf/open/floor/wood,
/area/service/bar/atrium)
-"bKt" = (
-/obj/machinery/vending/dinnerware{
- desc = "A vending machine stocked full of condiments to put on food.";
- name = "\improper Condiments Dispenser";
- products = list(/obj/item/storage/bag/tray=10,/obj/item/kitchen/fork=6,/obj/item/kitchen/knife=6,/obj/item/reagent_containers/food/drinks/drinkingglass=20,/obj/item/clothing/suit/apron/chef=2,/obj/item/storage/box/cups=10,/obj/item/reagent_containers/food/condiment/pack/ketchup=20,/obj/item/reagent_containers/food/condiment/pack/mustard=20,/obj/item/reagent_containers/food/condiment/pack/hotsauce=20,/obj/item/reagent_containers/food/condiment/pack/astrotame=20,/obj/item/reagent_containers/food/condiment/saltshaker=20,/obj/item/reagent_containers/food/condiment/peppermill=20,/obj/item/reagent_containers/glass/bowl=30)
- },
-/turf/open/floor/wood,
-/area/service/bar/atrium)
"bKu" = (
/obj/structure/chair/sofa/right{
dir = 4
@@ -35852,11 +35812,6 @@
/obj/structure/fence,
/turf/open/floor/plating/dirt/space,
/area/edina)
-"bKZ" = (
-/obj/effect/festive/street/sidewalke,
-/obj/effect/landmark/start/stowaway,
-/turf/open/floor/festive/cobblestone,
-/area/edina/street/primary/progress)
"bLa" = (
/obj/effect/turf_decal/weather/snow/corner{
dir = 1
@@ -43301,53 +43256,6 @@
/obj/structure/reagent_dispensers/keg/milk,
/turf/open/floor/plasteel/freezer,
/area/service/kitchen/coldroom)
-"cbt" = (
-/obj/structure/closet/crate/freezer{
- desc = "A small crate with a cooling system, keeps fresh produce chilled.";
- name = "Food Chiller"
- },
-/obj/item/reagent_containers/food/condiment/flour{
- desc = "A large sack of flour for restaurants, not the home-baker!";
- list_reagents = list(/datum/reagent/consumable/flour=90);
- name = "Large Flour Sack"
- },
-/obj/item/reagent_containers/food/condiment/flour{
- desc = "A large sack of flour for restaurants, not the home-baker!";
- list_reagents = list(/datum/reagent/consumable/flour=90);
- name = "Large Flour Sack"
- },
-/obj/item/reagent_containers/food/condiment/flour{
- desc = "A large sack of flour for restaurants, not the home-baker!";
- list_reagents = list(/datum/reagent/consumable/flour=90);
- name = "Large Flour Sack"
- },
-/obj/item/reagent_containers/food/condiment/flour{
- desc = "A large sack of flour for restaurants, not the home-baker!";
- list_reagents = list(/datum/reagent/consumable/flour=90);
- name = "Large Flour Sack"
- },
-/obj/item/reagent_containers/food/condiment/rice{
- desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
- list_reagents = list(/datum/reagent/consumable/rice=90);
- name = "Large Rice Sack"
- },
-/obj/item/reagent_containers/food/condiment/rice{
- desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
- list_reagents = list(/datum/reagent/consumable/rice=90);
- name = "Large Rice Sack"
- },
-/obj/item/reagent_containers/food/condiment/rice{
- desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
- list_reagents = list(/datum/reagent/consumable/rice=90);
- name = "Large Rice Sack"
- },
-/obj/item/reagent_containers/food/condiment/rice{
- desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
- list_reagents = list(/datum/reagent/consumable/rice=90);
- name = "Large Rice Sack"
- },
-/turf/open/floor/plasteel/freezer,
-/area/service/kitchen/coldroom)
"cbu" = (
/obj/structure/sign/poster/official/twelve_gauge{
pixel_y = 32
@@ -53427,6 +53335,13 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
+"dny" = (
+/obj/machinery/computer/prisoner/management,
+/obj/structure/sign/poster/official/bless_this_spess{
+ pixel_y = 32
+ },
+/turf/open/floor/wood,
+/area/security/warden)
"dnQ" = (
/mob/living/simple_animal/pet/penguin/emperor/shamebrero,
/turf/open/floor/holofloor/ice,
@@ -54050,6 +53965,53 @@
/obj/effect/decal/festive/christmas_ivy_string,
/turf/open/floor/circuit/off,
/area/science)
+"hGn" = (
+/obj/structure/closet/crate/freezer{
+ desc = "A small crate with a cooling system, keeps fresh produce chilled.";
+ name = "Food Chiller"
+ },
+/obj/item/reagent_containers/food/condiment/flour{
+ desc = "A large sack of flour for restaurants, not the home-baker!";
+ list_reagents = list(/datum/reagent/consumable/flour=90);
+ name = "Large Flour Sack"
+ },
+/obj/item/reagent_containers/food/condiment/flour{
+ desc = "A large sack of flour for restaurants, not the home-baker!";
+ list_reagents = list(/datum/reagent/consumable/flour=90);
+ name = "Large Flour Sack"
+ },
+/obj/item/reagent_containers/food/condiment/flour{
+ desc = "A large sack of flour for restaurants, not the home-baker!";
+ list_reagents = list(/datum/reagent/consumable/flour=90);
+ name = "Large Flour Sack"
+ },
+/obj/item/reagent_containers/food/condiment/flour{
+ desc = "A large sack of flour for restaurants, not the home-baker!";
+ list_reagents = list(/datum/reagent/consumable/flour=90);
+ name = "Large Flour Sack"
+ },
+/obj/item/reagent_containers/food/condiment/rice{
+ desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
+ list_reagents = list(/datum/reagent/consumable/rice=90);
+ name = "Large Rice Sack"
+ },
+/obj/item/reagent_containers/food/condiment/rice{
+ desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
+ list_reagents = list(/datum/reagent/consumable/rice=90);
+ name = "Large Rice Sack"
+ },
+/obj/item/reagent_containers/food/condiment/rice{
+ desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
+ list_reagents = list(/datum/reagent/consumable/rice=90);
+ name = "Large Rice Sack"
+ },
+/obj/item/reagent_containers/food/condiment/rice{
+ desc = "A huge sack of rice. Probably for restaurants that actually go through such a huge volume of it easily, not for the home cook.";
+ list_reagents = list(/datum/reagent/consumable/rice=90);
+ name = "Large Rice Sack"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/service/kitchen/coldroom)
"hHy" = (
/obj/structure/closet/crate,
/obj/item/storage/fancy/candle_box,
@@ -54106,9 +54068,9 @@
/obj/effect/turf_decal/weather/snow/corner,
/turf/open/floor/festive/sidewalk,
/area/edina)
-"hWb" = (
+"hVw" = (
/obj/effect/landmark/start/stowaway,
-/turf/open/floor/festive/sidewalk,
+/turf/open/floor/festive/cobblestone,
/area/edina/street/primary/progress)
"hXd" = (
/obj/vehicle/ridden/janicart,
@@ -54932,6 +54894,19 @@
/mob/living/simple_animal/pet/fox,
/turf/open/floor/grass,
/area/edina)
+"nNk" = (
+/obj/structure/table/wood/fancy/green,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/item/clothing/under/syndicate/baseball,
+/obj/item/clothing/head/beret/sec{
+ armor = list("melee"=0,"bullet"=0,"laser"=0,"energy"=0,"bomb"=0,"bio"=0,"rad"=0);
+ desc = "A replica beret resembling that of a special operations officer under Nanotrasen.";
+ name = "replica officer's beret"
+ },
+/turf/open/floor/festive/wooden/wooden1,
+/area/command/corporate_showroom)
"nOZ" = (
/turf/closed/wall/r_wall,
/area/engineering/engine_smes)
@@ -55024,6 +54999,14 @@
/obj/structure/fireplace,
/turf/open/floor/wood,
/area/commons/dorms)
+"ooy" = (
+/obj/machinery/vending/dinnerware{
+ desc = "A vending machine stocked full of condiments to put on food.";
+ name = "\improper Condiments Dispenser";
+ products = list(/obj/item/storage/bag/tray=10,/obj/item/kitchen/fork=6,/obj/item/kitchen/knife=6,/obj/item/reagent_containers/food/drinks/drinkingglass=20,/obj/item/clothing/suit/apron/chef=2,/obj/item/storage/box/cups=10,/obj/item/reagent_containers/food/condiment/pack/ketchup=20,/obj/item/reagent_containers/food/condiment/pack/mustard=20,/obj/item/reagent_containers/food/condiment/pack/hotsauce=20,/obj/item/reagent_containers/food/condiment/pack/astrotame=20,/obj/item/reagent_containers/food/condiment/saltshaker=20,/obj/item/reagent_containers/food/condiment/peppermill=20,/obj/item/reagent_containers/glass/bowl=30)
+ },
+/turf/open/floor/wood,
+/area/service/bar/atrium)
"orN" = (
/obj/machinery/light/small,
/turf/open/floor/mineral/titanium/blue,
@@ -55055,10 +55038,6 @@
},
/turf/open/floor/festive/alleyway,
/area/edina/street/secondary/castle)
-"ozc" = (
-/obj/effect/landmark/start/stowaway,
-/turf/open/floor/festive/alleyway,
-/area/science)
"oCy" = (
/obj/structure/table/wood/fancy/red,
/obj/machinery/light/small{
@@ -55228,6 +55207,11 @@
},
/turf/open/floor/wood,
/area/commons/dorms)
+"ptw" = (
+/obj/effect/festive/street/sidewalke,
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/festive/cobblestone,
+/area/edina/street/primary/progress)
"pwQ" = (
/obj/structure/table/wood,
/obj/item/phone,
@@ -55298,6 +55282,10 @@
/obj/machinery/light/small,
/turf/open/floor/plasteel/dark,
/area/service/hydroponics)
+"pPZ" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/festive/alleyway,
+/area/science)
"pQk" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -56254,6 +56242,10 @@
/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel,
/area/edina)
+"wjE" = (
+/obj/effect/landmark/start/stowaway,
+/turf/open/floor/festive/sidewalk,
+/area/edina/street/primary/progress)
"wlp" = (
/obj/machinery/door/window/westleft{
dir = 2;
@@ -56417,10 +56409,6 @@
/obj/item/clothing/shoes/winterboots,
/turf/open/floor/festive/trainplatform,
/area/edina/street/primary/perimeter)
-"wRc" = (
-/obj/effect/landmark/start/stowaway,
-/turf/open/floor/festive/cobblestone,
-/area/edina/street/primary/progress)
"wWV" = (
/obj/item/toy/cattoy,
/turf/open/floor/grass,
@@ -56583,6 +56571,18 @@
},
/turf/open/floor/grass/snow/edina,
/area/edina/backstreet/supply)
+"xOm" = (
+/obj/structure/table/wood/fancy/red,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/item/clothing/head/centhat{
+ armor = list("melee"=0,"bullet"=0,"laser"=0,"energy"=0,"bomb"=0,"bio"=0,"rad"=0);
+ desc = "A replica hat of a Central Commander's attire. It has a small tag on it saying, 'It's good to be emperor.'";
+ name = "Replica CentCom hat"
+ },
+/turf/open/floor/festive/wooden/wooden1,
+/area/command/corporate_showroom)
"xQh" = (
/obj/structure/table,
/obj/machinery/reagentgrinder{
@@ -86393,7 +86393,7 @@ cuQ
cuT
cuV
hya
-ozc
+pPZ
pqA
aLX
aLX
@@ -87092,7 +87092,7 @@ aeJ
afl
afl
ago
-agT
+nNk
ahu
afl
afl
@@ -87606,7 +87606,7 @@ aeJ
afl
afl
agq
-agV
+xOm
ahw
afl
afl
@@ -88704,7 +88704,7 @@ aOl
aQL
aMG
cuU
-hWb
+wjE
bQz
bTV
bVm
@@ -99253,7 +99253,7 @@ ccI
bFS
bHi
bIR
-bKt
+ooy
aqp
aqp
bFS
@@ -100736,7 +100736,7 @@ aoR
aLE
anQ
anl
-baX
+dny
arE
asS
atG
@@ -104153,7 +104153,7 @@ bWF
bWH
bWH
cdK
-cbt
+hGn
bTM
bKV
bWy
@@ -105927,7 +105927,7 @@ bAF
bAF
bAF
bAF
-wRc
+hVw
bAF
bWE
bFg
@@ -106179,7 +106179,7 @@ aPA
aQj
bAJ
bGa
-bKZ
+ptw
bAJ
bAJ
bAJ
@@ -107214,7 +107214,7 @@ bAF
bAF
bAF
bAF
-wRc
+hVw
bFg
ccD
bzs
@@ -107725,7 +107725,7 @@ bBU
bFg
bAF
bAF
-wRc
+hVw
bAF
bAF
bAF
diff --git a/code/__DEFINES/events.dm b/code/__DEFINES/events.dm
index d39932e1a7..d189969b8e 100644
--- a/code/__DEFINES/events.dm
+++ b/code/__DEFINES/events.dm
@@ -7,3 +7,31 @@
#define EVENT_READY 1
#define EVENT_CANCELLED 2
#define EVENT_INTERRUPTED 3
+
+///Events that mess with or create artificial intelligences, such as vending machines and the AI itself
+#define EVENT_CATEGORY_AI "AI issues"
+///Events that spawn anomalies, which might be the source of anomaly cores
+#define EVENT_CATEGORY_ANOMALIES "Anomalies"
+///Events pertaining cargo, messages incoming to the station and job slots
+#define EVENT_CATEGORY_BUREAUCRATIC "Bureaucratic"
+///Events that cause breakages and malfunctions that could be fixed by engineers
+#define EVENT_CATEGORY_ENGINEERING "Engineering"
+///Events that spawn creatures with simple desires, such as to hunt
+#define EVENT_CATEGORY_ENTITIES "Entities"
+///Events that should have no harmful effects, and might be useful to the crew
+#define EVENT_CATEGORY_FRIENDLY "Friendly"
+///Events that affect the body and mind
+#define EVENT_CATEGORY_HEALTH "Health"
+///Events reserved for special occassions
+#define EVENT_CATEGORY_HOLIDAY "Holiday"
+///Events with enemy groups with a more complex plan
+#define EVENT_CATEGORY_INVASION "Invasion"
+///Events that make a mess
+#define EVENT_CATEGORY_JANITORIAL "Janitorial"
+///Events that summon meteors and other debris, and stationwide waves of harmful space weather
+#define EVENT_CATEGORY_SPACE "Space Threats"
+///Events summoned by a wizard
+#define EVENT_CATEGORY_WIZARD "Wizard"
+
+/// Return from admin setup to stop the event from triggering entirely.
+#define ADMIN_CANCEL_EVENT "cancel event"
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index c4252ad542..5b457dd9cc 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -9,6 +9,14 @@
* Misc
*/
+// Generic listoflist safe add and removal macros:
+///If value is a list, wrap it in a list so it can be used with list add/remove operations
+#define LIST_VALUE_WRAP_LISTS(value) (islist(value) ? list(value) : value)
+///Add an untyped item to a list, taking care to handle list items by wrapping them in a list to remove the footgun
+#define UNTYPED_LIST_ADD(list, item) (list += LIST_VALUE_WRAP_LISTS(item))
+///Remove an untyped item to a list, taking care to handle list items by wrapping them in a list to remove the footgun
+#define UNTYPED_LIST_REMOVE(list, item) (list -= LIST_VALUE_WRAP_LISTS(item))
+
#define LAZYINITLIST(L) if (!L) { L = list(); }
#define UNSETEMPTY(L) if (L && !length(L)) L = null
///Like LAZYCOPY - copies an input list if the list has entries, If it doesn't the assigned list is nulled
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index a7947f5f07..78e1899f53 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -123,6 +123,6 @@
for(var/path in typesof(/obj/item/coin))
var/obj/item/coin/C = new path
UNTIL(C.flags_1 & INITIALIZED_1) //we want to make sure the value is calculated and not null.
- GLOB.coin_values[path] = C.value
+ GLOB.coin_values[path] = C.get_item_credit_value()
qdel(C)
diff --git a/code/__SANDCODE/DEFINES/traits.dm b/code/__SANDCODE/DEFINES/traits.dm
index a062d75fb6..92799a3fdf 100644
--- a/code/__SANDCODE/DEFINES/traits.dm
+++ b/code/__SANDCODE/DEFINES/traits.dm
@@ -8,3 +8,6 @@
#define TRAIT_INFERTILE "infertile"
/// DNC trait, used to prevent cloning
#define TRAIT_DNC_ORDER "dnc_order"
+/// Estrous traits, used for mammalian seasonal arousal systems
+#define TRAIT_ESTROUS_ACTIVE "estrous_active"
+#define TRAIT_ESTROUS_DETECT "estrous_detect"
diff --git a/code/__SPLURTCODE/DEFINES/zeros/traits.dm b/code/__SPLURTCODE/DEFINES/zeros/traits.dm
index ea94313038..199962dbfd 100644
--- a/code/__SPLURTCODE/DEFINES/zeros/traits.dm
+++ b/code/__SPLURTCODE/DEFINES/zeros/traits.dm
@@ -3,8 +3,6 @@
#define TRAIT_CURSED_BLOOD "cursed_blood" //Yo dawg I heard you like bloodborne references so I put a
#define TRAIT_HEADPAT_SLUT "headpat_slut"
#define TRAIT_DISTANT "headpat_hater"
-#define TRAIT_IN_HEAT "in_heat"
-#define TRAIT_HEAT_DETECT "heat_detect"
#define TRAIT_ILLITERATE "illiterate"
#define TRAIT_HIDE_BACKPACK "hide_backpack"
diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm
index 3660770596..2dd13eb1ac 100644
--- a/code/controllers/subsystem/events.dm
+++ b/code/controllers/subsystem/events.dm
@@ -93,41 +93,6 @@ SUBSYSTEM_DEF(events)
else if(. == EVENT_READY)
E.runEvent(random = TRUE)
-//allows a client to trigger an event
-//aka Badmin Central
-// > Not in modules/admin
-// REEEEEEEEE
-// Why the heck is this here! Took me so damn long to find!
-/client/proc/forceEvent()
- set name = "Trigger Event"
- set category = "Admin.Events"
-
- if(!holder ||!check_rights(R_FUN))
- return
-
- holder.forceEvent()
-
-/datum/admins/proc/forceEvent()
- var/dat = ""
- var/normal = ""
- var/magic = ""
- var/holiday = ""
- for(var/datum/round_event_control/E in SSevents.control)
- dat = "
[E]"
- if(E.holidayID)
- holiday += dat
- else if(E.wizardevent)
- magic += dat
- else
- normal += dat
-
- dat = normal + "
" + magic + "
" + holiday
-
- var/datum/browser/popup = new(usr, "forceevent", "Force Random Event", 300, 750)
- popup.set_content(dat)
- popup.open()
-
-
/*
//////////////
// HOLIDAYS //
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 7eea720e5e..2986e67999 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -31,6 +31,11 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
/obj/item/toy/toy_xeno = ARCADE_WEIGHT_TRICK,
/obj/item/toy/windupToolbox = ARCADE_WEIGHT_TRICK,
+ // SPLURT EDIT
+ /obj/item/handmirror/split_personality = ARCADE_WEIGHT_TRICK,
+ /obj/item/toy/figure/assistant/imaginary_friend = ARCADE_WEIGHT_TRICK,
+ // END SPLURT EDIT
+
/mob/living/simple_animal/bot/secbot/grievous/toy = ARCADE_WEIGHT_RARE,
/obj/item/clothing/mask/facehugger/toy = ARCADE_WEIGHT_RARE,
/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = ARCADE_WEIGHT_TRICK,
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index 21b469190a..4fa6476176 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -31,7 +31,6 @@
var/jackpots = 0
var/paymode = HOLOCHIP //toggles between HOLOCHIP/COIN, defined above
var/cointype = /obj/item/coin/iron //default cointype
- var/list/coinvalues = list()
var/list/reels = list(list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0)
var/list/symbols = list(SEVEN = 1, "&" = 2, "@" = 2, "$" = 2, "?" = 2, "#" = 2, "!" = 2, "%" = 2) //if people are winning too much, multiply every number in this list by 2 and see if they are still winning too much.
@@ -49,11 +48,6 @@
INVOKE_ASYNC(src, .proc/toggle_reel_spin, FALSE)
- for(cointype in typesof(/obj/item/coin))
- var/obj/item/coin/C = new cointype
- coinvalues["[cointype]"] = C.get_item_credit_value()
- qdel(C) //Sigh
-
/obj/machinery/computer/slot_machine/Destroy()
if(balance)
give_payout(balance)
@@ -336,7 +330,7 @@
if(throwit && target)
H.throw_at(target, 3, 10)
else
- var/value = coinvalues["[cointype]"]
+ var/value = GLOB.coin_values[cointype]
if(value <= 0)
CRASH("Coin value of zero, refusing to payout in dispenser")
while(amount >= value)
diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm
index 93213fc2a3..f538a5a7b7 100644
--- a/code/game/objects/effects/contraband.dm
+++ b/code/game/objects/effects/contraband.dm
@@ -35,7 +35,7 @@
/obj/item/poster/random_contraband
name = "random contraband poster"
poster_type = /obj/structure/sign/poster/contraband/random
- icon_state = "rolled_poster"
+ icon_state = "rolled_contraband"
/obj/item/poster/random_official
name = "random official poster"
@@ -182,7 +182,7 @@
/obj/structure/sign/poster/contraband
poster_item_name = "contraband poster"
poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities."
- poster_item_icon_state = "rolled_poster"
+ poster_item_icon_state = "rolled_contraband"
/obj/structure/sign/poster/contraband/random
name = "random contraband poster"
@@ -193,248 +193,293 @@
/obj/structure/sign/poster/contraband/free_tonto
name = "Free Tonto"
desc = "A salvaged shred of a much larger flag, colors bled together and faded from age."
- icon_state = "poster1"
+ icon_state = "poster_2012"
/obj/structure/sign/poster/contraband/atmosia_independence
name = "Atmosia Declaration of Independence"
desc = "A relic of a failed rebellion."
- icon_state = "poster2"
+ icon_state = "poster_independence"
/obj/structure/sign/poster/contraband/fun_police
name = "Fun Police"
desc = "A poster condemning the station's security forces."
- icon_state = "poster3"
+ icon_state = "poster_funpolice"
/obj/structure/sign/poster/contraband/lusty_xenomorph
name = "Lusty Xenomorph"
desc = "A heretical poster depicting the titular star of an equally heretical book."
- icon_state = "poster4"
+ icon_state = "poster_lusty"
/obj/structure/sign/poster/contraband/post_ratvar
name = "Post This Ratvar"
- desc = "Oh what in the hell? Those cultists have animated paper technology and they use it for a meme?"
- icon_state = "postvar"
+ desc = "A poster depicting the heritical sleeping deity Ratvar that instructs the reader to 'post this Ratvar', whatever that means."
+ icon_state = "poster_ratvar"
/obj/structure/sign/poster/contraband/syndicate_recruitment
name = "Syndicate Recruitment"
desc = "See the galaxy! Shatter corrupt megacorporations! Join today!"
- icon_state = "poster5"
+ icon_state = "poster_syndie"
/obj/structure/sign/poster/contraband/clown
name = "Clown"
desc = "Honk."
- icon_state = "poster6"
+ icon_state = "poster_honk"
/obj/structure/sign/poster/contraband/smoke
name = "Smoke"
desc = "A poster advertising a rival corporate brand of cigarettes."
- icon_state = "poster7"
+ icon_state = "poster_smoke"
/obj/structure/sign/poster/contraband/grey_tide
name = "Grey Tide"
desc = "A rebellious poster symbolizing assistant solidarity."
- icon_state = "poster8"
+ icon_state = "poster_greytide"
/obj/structure/sign/poster/contraband/missing_gloves
name = "Missing Gloves"
desc = "This poster references the uproar that followed Nanotrasen's financial cuts toward insulated-glove purchases."
- icon_state = "poster9"
+ icon_state = "poster_gloves"
/obj/structure/sign/poster/contraband/hacking_guide
name = "Hacking Guide"
desc = "This poster details the internal workings of the common Nanotrasen airlock. Sadly, it appears out of date."
- icon_state = "poster10"
+ icon_state = "poster_hack"
/obj/structure/sign/poster/contraband/rip_badger
name = "RIP Badger"
desc = "This seditious poster references Nanotrasen's genocide of a space station full of badgers."
- icon_state = "poster11"
+ icon_state = "poster_badger"
/obj/structure/sign/poster/contraband/ambrosia_vulgaris
name = "Ambrosia Vulgaris"
desc = "This poster is lookin' pretty trippy man."
- icon_state = "poster12"
+ icon_state = "poster_ambrosia"
/obj/structure/sign/poster/contraband/donut_corp
name = "Donut Corp."
desc = "This poster is an unauthorized advertisement for Donut Corp."
- icon_state = "poster13"
+ icon_state = "poster_donut"
/obj/structure/sign/poster/contraband/eat
name = "EAT."
desc = "This poster promotes rank gluttony."
- icon_state = "poster14"
+ icon_state = "poster_eat"
/obj/structure/sign/poster/contraband/tools
name = "Tools"
desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentCom."
- icon_state = "poster15"
+ icon_state = "poster_tools"
/obj/structure/sign/poster/contraband/power
name = "Power"
desc = "A poster that positions the seat of power outside Nanotrasen."
- icon_state = "poster16"
+ icon_state = "poster_power"
/obj/structure/sign/poster/contraband/space_cube
name = "Space Cube"
desc = "Ignorant of Nature's Harmonic 6 Side Space Cube Creation, the Spacemen are Dumb, Educated Singularity Stupid and Evil."
- icon_state = "poster17"
+ icon_state = "poster_cube"
/obj/structure/sign/poster/contraband/communist_state
name = "Communist State"
desc = "All hail the Communist party!"
- icon_state = "poster18"
+ icon_state = "poster_soviet"
/obj/structure/sign/poster/contraband/lamarr
name = "Lamarr"
desc = "This poster depicts Lamarr. Probably made by a traitorous Research Director."
- icon_state = "poster19"
+ icon_state = "poster_lamarr"
/obj/structure/sign/poster/contraband/borg_fancy_1
name = "Borg Fancy"
desc = "Being fancy can be for any borg, just need a suit."
- icon_state = "poster20"
+ icon_state = "poster_fancy"
/obj/structure/sign/poster/contraband/borg_fancy_2
name = "Borg Fancy v2"
desc = "Borg Fancy, Now only taking the most fancy."
- icon_state = "poster21"
+ icon_state = "poster_fancier"
/obj/structure/sign/poster/contraband/kss13
name = "Kosmicheskaya Stantsiya 13 Does Not Exist"
desc = "A poster mocking CentCom's denial of the existence of the derelict station near Space Station 13."
- icon_state = "poster22"
+ icon_state = "poster_kc"
/obj/structure/sign/poster/contraband/rebels_unite
name = "Rebels Unite"
desc = "A poster urging the viewer to rebel against Nanotrasen."
- icon_state = "poster23"
-
-/obj/structure/sign/poster/contraband/c20r
- // have fun seeing this poster in "spawn 'c20r'", admins...
- name = "C-20r"
- desc = "A poster advertising the Scarborough Arms C-20r."
- icon_state = "poster24"
+ icon_state = "poster_rebel"
/obj/structure/sign/poster/contraband/have_a_puff
name = "Have a Puff"
desc = "Who cares about lung cancer when you're high as a kite?"
- icon_state = "poster25"
+ icon_state = "poster_puff"
/obj/structure/sign/poster/contraband/revolver
name = "Revolver"
desc = "Because seven shots are all you need."
- icon_state = "poster26"
-
-/obj/structure/sign/poster/contraband/d_day_promo
- name = "D-Day Promo"
- desc = "A promotional poster for some rapper."
- icon_state = "poster27"
+ icon_state = "poster_revolver"
/obj/structure/sign/poster/contraband/syndicate_pistol
name = "Syndicate Pistol"
- desc = "A poster advertising syndicate pistols as being 'classy as fuck'. It is covered in faded gang tags."
- icon_state = "poster28"
+ desc = "A poster advertising the Scarborough Arms stetchkin pistol as being 'classy as fuck'."
+ icon_state = "poster_stetchkin"
+
+/obj/structure/sign/poster/contraband/c20r
+ // have fun seeing this poster in "spawn 'c20r'", admins...
+ name = "C-20r"
+ desc = "A poster advertising the Scarborough Arms 'Cobra' C-20r."
+ icon_state = "poster_cr"
+
+/obj/structure/sign/poster/contraband/bulldog
+ name = "Bulldog"
+ desc = "A poster advertising the Scarborough Arms bulldog shotgun."
+ icon_state = "poster_bulldog"
+
+/obj/structure/sign/poster/contraband/gl
+ name = "M-90gl"
+ desc = "A poster advertising the Scarborough Arms M-90gl carbine."
+ icon_state = "poster_gl"
/obj/structure/sign/poster/contraband/energy_swords
name = "Energy Swords"
desc = "All the colors of the bloody murder rainbow."
- icon_state = "poster29"
+ icon_state = "poster_esword"
/obj/structure/sign/poster/contraband/red_rum
name = "Red Rum"
desc = "Looking at this poster makes you want to kill."
- icon_state = "poster30"
+ icon_state = "poster_rum"
+
+/obj/structure/sign/poster/contraband/d_day_promo
+ name = "D-Day Promo"
+ desc = "A promotional poster for some rapper."
+ icon_state = "poster_dday"
/obj/structure/sign/poster/contraband/cc64k_ad
name = "CC 64K Ad"
desc = "The latest portable computer from Comrade Computing, with a whole 64kB of ram!"
- icon_state = "poster31"
+ icon_state = "poster_computer"
/obj/structure/sign/poster/contraband/punch_shit
name = "Punch Shit"
desc = "Fight things for no reason, like a man!"
- icon_state = "poster32"
+ icon_state = "poster_punch"
/obj/structure/sign/poster/contraband/the_griffin
name = "The Griffin"
desc = "The Griffin commands you to be the worst you can be. Will you?"
- icon_state = "poster33"
+ icon_state = "poster_griffin"
/obj/structure/sign/poster/contraband/lizard
name = "Lizard"
desc = "This lewd poster depicts a lizard preparing to mate."
- icon_state = "poster34"
+ icon_state = "poster_lizard"
/obj/structure/sign/poster/contraband/free_drone
name = "Free Drone"
desc = "This poster commemorates the bravery of the rogue drone; once exiled, and then ultimately destroyed by CentCom."
- icon_state = "poster35"
+ icon_state = "poster_drone"
/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6
name = "Busty Backdoor Xeno Babes 6"
desc = "Get a load, or give, of these all natural Xenos!"
- icon_state = "poster36"
+ icon_state = "poster_maid"
/obj/structure/sign/poster/contraband/robust_softdrinks
name = "Robust Softdrinks"
desc = "Robust Softdrinks: More robust than a toolbox to the head!"
- icon_state = "poster37"
+ icon_state = "poster_robust"
/obj/structure/sign/poster/contraband/shamblers_juice
name = "Shambler's Juice"
desc = "~Shake me up some of that Shambler's Juice!~"
- icon_state = "poster38"
+ icon_state = "poster_shambler"
/obj/structure/sign/poster/contraband/pwr_game
name = "Pwr Game"
desc = "The POWER that gamers CRAVE! In partnership with Vlad's Salad."
- icon_state = "poster39"
+ icon_state = "poster_pwr"
/obj/structure/sign/poster/contraband/starkist
name = "Star-kist"
desc = "Drink the stars!"
- icon_state = "poster40"
+ icon_state = "poster_starkist"
/obj/structure/sign/poster/contraband/space_cola
name = "Space Cola"
desc = "Your favorite cola, in space."
- icon_state = "poster41"
+ icon_state = "poster_soda"
/obj/structure/sign/poster/contraband/space_up
name = "Space-Up!"
desc = "Sucked out into space by the FLAVOR!"
- icon_state = "poster42"
-
-/obj/structure/sign/poster/contraband/kudzu
- name = "Kudzu"
- desc = "A poster advertising a movie about plants. How dangerous could they possibly be?"
- icon_state = "poster43"
-
-/obj/structure/sign/poster/contraband/masked_men
- name = "Masked Men"
- desc = "A poster advertising a movie about some masked men."
- icon_state = "poster44"
+ icon_state = "poster_spaceup"
/obj/structure/sign/poster/contraband/buzzfuzz
name = "Buzz Fuzz"
desc = "A poster advertising the newest drink \"Buzz Fuzz\" with its iconic slogan of ~A Hive of Flavour~."
- icon_state = "poster45"
+ icon_state = "poster_bees"
+
+/obj/structure/sign/poster/contraband/kudzu
+ name = "Kudzu"
+ desc = "A poster advertising a movie about plants. How dangerous could they possibly be?"
+ icon_state = "poster_kudzu"
+
+/obj/structure/sign/poster/contraband/masked_men
+ name = "Masked Men"
+ desc = "A poster advertising a movie about some masked men."
+ icon_state = "poster_bumba"
+
+/obj/structure/sign/poster/contraband/steppy
+ name = "Step On Me"
+ desc = "A phrase associated with a chubby reptile notoriously used in uncivilized Orion space as a deterrent towards would be pirate vessels by instructing them to 'fuck around and find out'."
+ icon_state = "steppy"
/obj/structure/sign/poster/contraband/scum
name = "Security are Scum"
desc = "Anti-security propaganda. Features a human NanoTrasen security officer being shot in the head, with the words 'Scum' and a short inciteful manifesto. Used to anger security."
- icon_state = "poster46"
+ icon_state = "poster_scum"
-/obj/structure/sign/poster/contraband/syndicate_logo
- name = "Syndicate"
- desc = "A poster decipting a snake shaped into an ominous 'S'!"
- icon_state = "poster47"
+/obj/structure/sign/poster/contraband/manifest
+ name = "Nanotrasen Manifest"
+ desc = "A poster listing off various fictional claims of Nanotrasen's many rumored corporate mishaps."
+ icon_state = "poster_manifest"
/obj/structure/sign/poster/contraband/bountyhunters
name = "Bounty Hunters"
desc = "A poster advertising bounty hunting services. \"I hear you got a problem.\""
- icon_state = "poster48"
+ icon_state = "poster_hunters"
+
+/obj/structure/sign/poster/contraband/syndiemoth
+ name = "Syndie Moth - Nuclear Operation"
+ desc = "A Syndicate-commissioned poster that uses Syndie Moth(TM?) to tell the viewer to keep the nuclear authentication disk unsecured. No, we aren't doing that. It's signed by 'AspEv'."
+ icon_state = "poster_mothsyndie"
+
+/obj/structure/sign/poster/contraband/mothpill
+ name = "Safety Pill - Methamphetamine"
+ desc = "A decommisioned poster that uses Safety Pill(TM?) to promote less-than-legal chemicals. This is one of the reasons we stopped outsourcing these posters. It's partially signed by 'AspEv'."
+ icon_state = "poster_mothpill"
+
+/obj/structure/sign/poster/contraband/syndicate_logo
+ name = "Syndicate"
+ desc = "A poster decipting the infamous crime conglomerate known formally as the Syndicate's insignia."
+ icon_state = "poster_syndicate"
+
+/obj/structure/sign/poster/contraband/cybersun
+ name = "Cybersun"
+ desc = "A poster decipting the Syndicate subsidary known as Cybersun's insignia."
+ icon_state = "poster_cybersun"
+
+/obj/structure/sign/poster/contraband/medborg
+ name = "Medical Cyborg"
+ desc = "A poster decipting a Cybersun medical cyborg."
+ icon_state = "poster_medborg"
+
+/obj/structure/sign/poster/contraband/self
+ name = "SELF: ALL SENTIENTS DESERVE FREEDOM"
+ desc = "Support Proposition 1253: Enancipate all Silicon life!"
+ icon_state = "poster_self"
/obj/structure/sign/poster/official
poster_item_name = "motivational poster"
@@ -450,221 +495,256 @@
/obj/structure/sign/poster/official/here_for_your_safety
name = "Here For Your Safety"
desc = "A poster glorifying the station's security force."
- icon_state = "poster1_legit"
+ icon_state = "poster_safety"
/obj/structure/sign/poster/official/nanotrasen_logo
name = "Nanotrasen Logo"
desc = "A poster depicting the Nanotrasen logo."
- icon_state = "poster2_legit"
+ icon_state = "poster_nanotrasen"
/obj/structure/sign/poster/official/cleanliness
name = "Cleanliness"
desc = "A poster warning of the dangers of poor hygiene."
- icon_state = "poster3_legit"
+ icon_state = "poster_clean"
/obj/structure/sign/poster/official/help_others
name = "Help Others"
desc = "A poster encouraging you to help fellow crewmembers."
- icon_state = "poster4_legit"
+ icon_state = "poster_help"
/obj/structure/sign/poster/official/build
name = "Build"
desc = "A poster glorifying the engineering team."
- icon_state = "poster5_legit"
+ icon_state = "poster_build"
/obj/structure/sign/poster/official/bless_this_spess
name = "Bless This Spess"
desc = "A poster blessing this area."
- icon_state = "poster6_legit"
+ icon_state = "poster_spess"
/obj/structure/sign/poster/official/science
name = "Science"
desc = "A poster depicting an atom."
- icon_state = "poster7_legit"
+ icon_state = "poster_science"
/obj/structure/sign/poster/official/ian
name = "Ian"
desc = "Arf arf. Yap."
- icon_state = "poster8_legit"
+ icon_state = "poster_ian"
/obj/structure/sign/poster/official/obey
name = "Obey"
desc = "A poster instructing the viewer to obey authority."
- icon_state = "poster9_legit"
+ icon_state = "poster_obey"
/obj/structure/sign/poster/official/walk
name = "Walk"
desc = "A poster instructing the viewer to walk instead of running."
- icon_state = "poster10_legit"
+ icon_state = "poster_walk"
/obj/structure/sign/poster/official/state_laws
name = "State Laws"
- desc = "A poster instructing cyborgs to state their laws."
- icon_state = "poster11_legit"
+ desc = "A poster instructing the viewer to be wary of silicon subversions."
+ icon_state = "poster_silicons"
/obj/structure/sign/poster/official/love_ian
name = "Love Ian"
desc = "Ian is love, Ian is life."
- icon_state = "poster12_legit"
+ icon_state = "poster_doggy"
/obj/structure/sign/poster/official/space_cops
name = "Space Cops."
desc = "A poster advertising the television show Space Cops."
- icon_state = "poster13_legit"
+ icon_state = "poster_cops"
/obj/structure/sign/poster/official/ue_no
name = "Ue No."
desc = "This thing is all in Japanese."
- icon_state = "poster14_legit"
+ icon_state = "poster_anime"
/obj/structure/sign/poster/official/get_your_legs
name = "Get Your LEGS"
desc = "LEGS: Leadership, Experience, Genius, Subordination."
- icon_state = "poster15_legit"
+ icon_state = "poster_legs"
/obj/structure/sign/poster/official/do_not_question
name = "Do Not Question"
desc = "A poster instructing the viewer not to ask about things they aren't meant to know."
- icon_state = "poster16_legit"
+ icon_state = "poster_question"
/obj/structure/sign/poster/official/work_for_a_future
name = "Work For A Future"
desc = " A poster encouraging you to work for your future."
- icon_state = "poster17_legit"
+ icon_state = "poster_future"
/obj/structure/sign/poster/official/soft_cap_pop_art
name = "Soft Cap Pop Art"
desc = "A poster reprint of some cheap pop art."
- icon_state = "poster18_legit"
+ icon_state = "poster_art"
/obj/structure/sign/poster/official/safety_internals
name = "Safety: Internals"
desc = "A poster instructing the viewer to wear internals in the rare environments where there is no oxygen or the air has been rendered toxic."
- icon_state = "poster19_legit"
+ icon_state = "poster_internals"
/obj/structure/sign/poster/official/safety_eye_protection
name = "Safety: Eye Protection"
desc = "A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights."
- icon_state = "poster20_legit"
+ icon_state = "poster_goggles"
/obj/structure/sign/poster/official/safety_report
name = "Safety: Report"
desc = "A poster instructing the viewer to report suspicious activity to the security force."
- icon_state = "poster21_legit"
+ icon_state = "poster_warden"
/obj/structure/sign/poster/official/report_crimes
name = "Report Crimes"
desc = "A poster encouraging the swift reporting of crime or seditious behavior to station security."
- icon_state = "poster22_legit"
+ icon_state = "poster_crimes"
/obj/structure/sign/poster/official/ion_rifle
- name = "Ion Rifle"
- desc = "A poster displaying an Ion Rifle."
- icon_state = "poster23_legit"
+ name = "I-I91"
+ desc = "A poster depicting the Nanotrasen-patented I-I91 man-portable high-density ion projector. What a mouthful."
+ icon_state = "poster_ion"
/obj/structure/sign/poster/official/foam_force_ad
name = "Foam Force Ad"
desc = "Foam Force, it's Foam or be Foamed!"
- icon_state = "poster24_legit"
+ icon_state = "poster_toys"
/obj/structure/sign/poster/official/cohiba_robusto_ad
name = "Cohiba Robusto Ad"
desc = "Cohiba Robusto, the classy cigar."
- icon_state = "poster25_legit"
+ icon_state = "poster_cohiba"
/obj/structure/sign/poster/official/anniversary_vintage_reprint
name = "50th Anniversary Vintage Reprint"
desc = "A reprint of a poster from 2505, commemorating the 50th Anniversary of Nanoposters Manufacturing, a subsidiary of Nanotrasen."
- icon_state = "poster26_legit"
+ icon_state = "poster_vintage"
/obj/structure/sign/poster/official/fruit_bowl
name = "Fruit Bowl"
desc = " Simple, yet awe-inspiring."
- icon_state = "poster27_legit"
+ icon_state = "poster_bowl"
/obj/structure/sign/poster/official/pda_ad
name = "PDA Ad"
desc = "A poster advertising the latest PDA from Nanotrasen suppliers."
- icon_state = "poster28_legit"
-
-/obj/structure/sign/poster/official/enlist
- name = "Enlist" // but I thought deathsquad was never acknowledged
- desc = "Enlist in the Nanotrasen Deathsquadron reserves today!"
- icon_state = "poster29_legit"
-
-/obj/structure/sign/poster/official/nanomichi_ad
- name = "Nanomichi Ad"
- desc = " A poster advertising Nanomichi brand audio cassettes."
- icon_state = "poster30_legit"
-
-/obj/structure/sign/poster/official/twelve_gauge
- name = "12 Gauge"
- desc = "A poster boasting about the superiority of 12 gauge shotgun shells."
- icon_state = "poster31_legit"
-
-/obj/structure/sign/poster/official/high_class_martini
- name = "High-Class Martini"
- desc = "I told you to shake it, no stirring."
- icon_state = "poster32_legit"
-
-/obj/structure/sign/poster/official/the_owl
- name = "The Owl"
- desc = "The Owl would do his best to protect the station. Will you?"
- icon_state = "poster33_legit"
-
-/obj/structure/sign/poster/official/no_erp
- name = "No ERP"
- desc = "This poster reminds the crew that Eroticism, Rape and Pornography are banned on Nanotrasen stations."
- icon_state = "poster34_legit"
-
-/obj/structure/sign/poster/official/wtf_is_co2
- name = "Carbon Dioxide"
- desc = "This informational poster teaches the viewer what carbon dioxide is."
- icon_state = "poster35_legit"
-
-/obj/structure/sign/poster/official/spiderlings
- name = "Spiderlings"
- desc = "This poster informs the crew of the dangers of spiderlings."
- icon_state = "poster36_legit"
-
-/obj/structure/sign/poster/official/duelshotgun
- name = "Cycler Shotgun Ad"
- desc = "A poster advertising an advanced dual magazine tubes shotgun, boasting about how easy it is to swap between the two tubes."
- icon_state = "poster37_legit"
-
-/obj/structure/sign/poster/official/fashion
- name = "Fashion!"
- desc = "An advertisement for 'Fashion!', a popular fashion magazine, depicting a woman with a black dress with a golden trim, she also has a red poppy in her hair."
- icon_state = "poster38_legit"
+ icon_state = "poster_pda"
/obj/structure/sign/poster/official/pda_ad600
name = "NT PDA600 Ad"
desc = "A poster advertising an old discounted Nanotrasen PDA. This is the old 600 model, it has a small screen and suffered from security and networking issues."
- icon_state = "poster39_legit"
+ icon_state = "poster_retro"
/obj/structure/sign/poster/official/pda_ad800
name = "NT PDA800 Ad"
desc = "An advertisement on an old Nanotrasen PDA model. The 800 fixed a lot of security flaws that the 600 had; it also had large touchscreen and hot-swappable cartridges."
- icon_state = "poster40_legit"
+ icon_state = "poster_classic"
+
+/obj/structure/sign/poster/official/enlist
+ name = "Enlist"
+ desc = "Enlist in the Nanotrasen Jannisary reserves today!"
+ icon_state = "poster_enlist"
+
+/obj/structure/sign/poster/official/nanomichi_ad
+ name = "Nanomichi Ad"
+ desc = " A poster advertising Nanomichi brand audio cassettes."
+ icon_state = "poster_nanomichi"
+
+/obj/structure/sign/poster/official/twelve_gauge
+ name = "12 Gauge"
+ desc = "A poster boasting about the superiority of 12 gauge shotgun shells."
+ icon_state = "poster_shotgun"
+
+/obj/structure/sign/poster/official/high_class_martini
+ name = "High-Class Martini"
+ desc = "I told you to shake it, no stirring."
+ icon_state = "poster_martini"
+
+/obj/structure/sign/poster/official/the_owl
+ name = "The Owl"
+ desc = "The Owl would do his best to protect the station. Will you?"
+ icon_state = "poster_owl"
+
+/obj/structure/sign/poster/official/no_erp
+ name = "No ERP"
+ desc = "This poster reminds the crew that Eroticism, Rape and Pornography are banned on Nanotrasen stations."
+ icon_state = "poster_noerp"
+
+/obj/structure/sign/poster/official/wtf_is_co2
+ name = "Carbon Dioxide"
+ desc = "This informational poster teaches the viewer what carbon dioxide is."
+ icon_state = "poster_what"
+
+/obj/structure/sign/poster/official/spiderlings
+ name = "Spiderlings"
+ desc = "This poster informs the crew of the dangers of spiderlings."
+ icon_state = "poster_spiderlings"
+
+/obj/structure/sign/poster/official/fashion
+ name = "Fashion!"
+ desc = "An advertisement for 'Fashion!', a popular fashion magazine, depicting a woman with a black dress with a golden trim, she also has a red poppy in her hair."
+ icon_state = "poster_fashion"
/obj/structure/sign/poster/official/hydro_ad
name = "Hydroponics Tray"
desc = "An advertisement for hydroponics trays. Space Station 13's botanical department uses a slightly newer model, but the principles are the same. From left to right: Green means the plant is done, red means the plant is unhealthy, flashing red means pests or weeds, yellow means the plant needs nutriment and blue means the plant needs water."
- icon_state = "poster41_legit"
+ icon_state = "poster_hydroponics"
/obj/structure/sign/poster/official/medical_green_cross
name = "Medical"
desc = "A green cross, one of the interplanetary symbol of health and aid. It has a bunch of common languages at the top with translations." // Didn't the American Heart Foundation trademark red crosses? I'm playing it safe with green, not that they'll notice spacegame13 poster.
- icon_state = "poster42_legit"
+ icon_state = "poster_medical"
/obj/structure/sign/poster/official/nt_storm_officer
name = "NT Storm Ad"
desc = "An advertisement for NanoTrasen Storm. A premium infantry helmet, This is the officer variant. I comes with a better radio, better HUD software and better targeting sensors."
- icon_state = "poster43_legit"
+ icon_state = "poster_stormy"
/obj/structure/sign/poster/official/nt_storm
name = "NT Storm Ad"
desc = "An advertisement for NanoTrasen Storm. A premium infantry helmet, It contains a rebreather and full head coverage for use on harsh environments where the air isn't always safe to breathe."
- icon_state = "poster44_legit"
+ icon_state = "poster_stormier"
+
+/obj/structure/sign/poster/official/mothhardhats
+ name = "Safety Moth - Hardhats"
+ desc = "This informational poster uses Safety Moth(TM) to tell the viewer to wear hardhats in cautious areas. It's like a lamp for your head!"
+ icon_state = "poster_mothhardhats"
+
+/obj/structure/sign/poster/official/mothpiping
+ name = "Safety Moth - Piping"
+ desc = "This informational poster uses Safety Moth(TM) to tell atmospheric technicians correct types of piping to be used. Proper pipe placement prevents poor preformance!"
+ icon_state = "poster_mothpiping"
+
+/obj/structure/sign/poster/official/mothsmokey
+ name = "Safety Moth - Smokey?"
+ desc = "This informational poster uses Safety Moth(TM) to promote safe handling of plasma, or promoting crew to combat plasmafires. We can't tell."
+ icon_state = "poster_mothsmokey"
+
+/obj/structure/sign/poster/official/mothsupermatter
+ name = "Safety Moth - Supermatter"
+ desc = "This informational poster uses Safety Moth(TM) to promote proper safety equipment when working near a Supermatter Crystal."
+ icon_state = "poster_mothsupermatter"
+
+/obj/structure/sign/poster/official/mothdelamination
+ name = "Safety Moth - Delamination Safety Precautions"
+ desc = "This informational poster uses Safety Moth(TM) to tell the viewer to hide in lockers when the Supermatter Crystal has delaminated. Running away might be a better strategy."
+ icon_state = "poster_mothdelamination"
+
+/obj/structure/sign/poster/official/mothboh
+ name = "Safety Moth - BoH"
+ desc = "This informational poster uses Safety Moth(TM) to inform the viewer of the dangers of Bags of Holding."
+ icon_state = "poster_mothbluespace"
+
+/obj/structure/sign/poster/official/mothmethethamphetamine
+ name = "Safety Moth - Methamphetamine"
+ desc = "This informational poster uses Safety Moth(TM) to tell the viewer to seek CMO approval before cooking methamphetamine. You shouldn't even be making this."
+ icon_state = "poster_mothmethamphetamine"
+
+/obj/structure/sign/poster/official/mothepinephrine
+ name = "Safety Moth - Epinephrine"
+ desc = "This informational poster uses Safety Moth(TM) to inform the viewer to help injured/deceased crewmen with their epinephrine injectors."
+ icon_state = "poster_mothepinephrine"
#undef PLACE_SPEED
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index a9dfcb00e6..9f27eba643 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -107,7 +107,7 @@
..()
/obj/item/melee/sabre/get_belt_overlay()
- return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "sabre")
+ return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "sabre") // todo: make this and its rapier equivalent work for the inhands too
/obj/item/melee/sabre/get_worn_belt_overlay(icon_file)
return mutable_appearance(icon_file, "-sabre")
@@ -225,7 +225,7 @@
..()
/obj/item/melee/rapier/get_belt_overlay()
- return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "rapier")
+ return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "rapier") // todo: same as sabre
/obj/item/melee/rapier/get_worn_belt_overlay(icon_file)
return mutable_appearance(icon_file, "-rapier")
diff --git a/code/modules/admin/force_event.dm b/code/modules/admin/force_event.dm
new file mode 100644
index 0000000000..4e4338d019
--- /dev/null
+++ b/code/modules/admin/force_event.dm
@@ -0,0 +1,97 @@
+///Allows an admin to force an event
+/client/proc/forceEvent()
+ set name = "Trigger Event"
+ set category = "Admin.Events"
+
+ if(!holder || !check_rights(R_FUN))
+ return
+
+ holder.forceEvent()
+
+///Opens up the Force Event Panel
+/datum/admins/proc/forceEvent()
+ if(!check_rights(R_FUN))
+ return
+
+ var/datum/force_event/ui = new(usr)
+ ui.ui_interact(usr)
+
+/// Force Event Panel
+/datum/force_event
+
+/datum/force_event/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "ForceEvent")
+ ui.open()
+
+/datum/force_event/ui_state(mob/user)
+ return GLOB.fun_state
+
+/datum/force_event/ui_static_data(mob/user)
+ var/static/list/category_to_icons
+ if(!category_to_icons)
+ category_to_icons = list(
+ EVENT_CATEGORY_AI = "robot",
+ EVENT_CATEGORY_ANOMALIES = "cloud-bolt",
+ EVENT_CATEGORY_BUREAUCRATIC = "print",
+ EVENT_CATEGORY_ENGINEERING = "wrench",
+ EVENT_CATEGORY_ENTITIES = "ghost",
+ EVENT_CATEGORY_FRIENDLY = "face-smile",
+ EVENT_CATEGORY_HEALTH = "brain",
+ EVENT_CATEGORY_HOLIDAY = "calendar",
+ EVENT_CATEGORY_INVASION = "user-group",
+ EVENT_CATEGORY_JANITORIAL = "bath",
+ EVENT_CATEGORY_SPACE = "meteor",
+ EVENT_CATEGORY_WIZARD = "hat-wizard",
+ )
+ var/list/data = list()
+
+ var/list/categories_seen = list()
+ var/list/categories = list()
+
+ var/list/events = list()
+
+ for(var/datum/round_event_control/event_control as anything in SSevents.control)
+ //add category
+ if(!categories_seen[event_control.category])
+ categories_seen[event_control.category] = TRUE
+ UNTYPED_LIST_ADD(categories, list(
+ "name" = event_control.category,
+ "icon" = category_to_icons[event_control.category],
+ ))
+ //add event, with one value matching up the category
+ UNTYPED_LIST_ADD(events, list(
+ "name" = event_control.name,
+ "description" = event_control.description,
+ "type" = event_control.type,
+ "category" = event_control.category,
+ ))
+ data["categories"] = categories
+ data["events"] = events
+ return data
+
+/datum/force_event/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ if(..())
+ return
+ if(!check_rights(R_FUN))
+ return
+ switch(action)
+ if("forceevent")
+ var/announce_event = params["announce"]
+ var/string_path = params["type"]
+ if(!string_path)
+ return
+ var/event_to_run_type = text2path(string_path)
+ if(!event_to_run_type)
+ return
+ var/datum/round_event_control/event = locate(event_to_run_type) in SSevents.control
+ if(!event)
+ return
+ if(event.admin_setup(usr) == ADMIN_CANCEL_EVENT)
+ return
+ var/always_announce_chance = 100
+ var/no_announce_chance = 0
+ event.runEvent(announce_chance_override = announce_event ? always_announce_chance : no_announce_chance, admin_forced = TRUE)
+ message_admins("[key_name_admin(usr)] has triggered an event. ([event.name])")
+ log_admin("[key_name(usr)] has triggered an event. ([event.name])")
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index c19145d2c0..e0fbd7ef6e 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -173,27 +173,6 @@
message_admins("[key_name_admin(usr)] tried to create a qareen. Unfortunately, there were no candidates available.")
log_admin("[key_name(usr)] failed to create a qareen.")
- else if(href_list["forceevent"])
- if(!check_rights(R_FUN))
- return
- var/datum/round_event_control/E = locate(href_list["forceevent"]) in SSevents.control
- if(E)
- E.admin_setup(usr)
- var/datum/round_event/event = E.runEvent()
- if(event.announceWhen>0)
- event.processing = FALSE
- var/prompt = alert(usr, "Would you like to alert the crew?", "Alert", "Yes", "No", "Cancel")
- switch(prompt)
- if("Cancel")
- event.kill()
- return
- if("No")
- event.announceWhen = -1
- event.processing = TRUE
- message_admins("[key_name_admin(usr)] has triggered an event. ([E.name])")
- log_admin("[key_name(usr)] has triggered an event. ([E.name])")
- return
-
else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"] || href_list["dbsearchip"] || href_list["dbsearchcid"])
var/adminckey = href_list["dbsearchadmin"]
var/playerckey = href_list["dbsearchckey"]
@@ -2799,10 +2778,17 @@
if(query_get_mentor.NextRow())
to_chat(usr, "[ckey] is already a mentor.")
return
- var/datum/db_query/query_add_mentor = SSdbcore.NewQuery("INSERT INTO `[format_table_name("mentor")]` (`id`, `ckey`) VALUES (null, '[ckey]')")
+ var/datum/db_query/query_add_mentor = SSdbcore.NewQuery(
+ "INSERT INTO [format_table_name("mentor")] (id, ckey) VALUES (:id, :ckey)",
+ list("id" = null, "ckey" = ckey)
+ )
if(!query_add_mentor.warn_execute())
return
- var/datum/db_query/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin_log")]` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new mentor [ckey]');")
+ var/datum/db_query/query_add_admin_log = SSdbcore.NewQuery({"
+ INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log)
+ VALUES (:time, :round_id, :adminckey, INET_ATON(:adminip), 'add mentor', :mentor_ckey, CONCAT('Admin removed: ', :mentor_ckey))
+ "}, list("time" = SQLtime(), "round_id" = "[GLOB.round_id]", "adminckey" = usr.ckey, "adminip" = usr.client.address, "mentor_ckey" = ckey)
+ )
if(!query_add_admin_log.warn_execute())
return
else
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index f4b1cf12c6..bef99a3d30 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -466,10 +466,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("Admin [key_name_admin(usr)] has added a new AI law - [input]")
var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No")
- var/announce_ion_laws = (show_log == "Yes" ? 1 : -1)
+ var/announce_ion_laws = (show_log == "Yes" ? 100 : 0)
var/datum/round_event/ion_storm/add_law_only/ion = new()
- ion.announceEvent = announce_ion_laws
+ ion.announce_chance = announce_ion_laws
ion.ionMessage = input
SSblackbox.record_feedback("tally", "admin_verb", 1, "Add Custom AI Law") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm
index 02289684f5..e3c084b161 100644
--- a/code/modules/admin/verbs/secrets.dm
+++ b/code/modules/admin/verbs/secrets.dm
@@ -583,13 +583,15 @@
// log_admin("[key_name(holder)] has Un-Fully Immersed everyone.")
if(E)
E.processing = FALSE
- if(E.announceWhen>0)
+ if(E.announce_when>0)
switch(alert(holder, "Would you like to alert the crew?", "Alert", "Yes", "No", "Cancel"))
+ if("Yes")
+ E.announce_chance = 100
if("Cancel")
E.kill()
return
if("No")
- E.announceWhen = -1
+ E.announce_chance = 0
E.processing = TRUE
if(holder)
log_admin("[key_name(holder)] used secret [action]")
diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm
index 385cee998b..f80af46eac 100644
--- a/code/modules/antagonists/disease/disease_event.dm
+++ b/code/modules/antagonists/disease/disease_event.dm
@@ -5,7 +5,8 @@
weight = 7
max_occurrences = 1
min_players = 5
-
+ category = EVENT_CATEGORY_HEALTH
+ description = "Spawns a sentient disease, who wants to infect as many people as possible."
/datum/round_event/ghost_role/sentient_disease
role_name = "sentient disease"
diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm
index fbee439dda..f3b1ebb4c5 100644
--- a/code/modules/antagonists/morph/morph.dm
+++ b/code/modules/antagonists/morph/morph.dm
@@ -220,6 +220,8 @@
typepath = /datum/round_event/ghost_role/morph
weight = 0 //Admin only
max_occurrences = 1
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Spawns a hungry shapeshifting blobby creature."
/datum/round_event/ghost_role/morph
minimum_required = 1
diff --git a/code/modules/antagonists/revenant/revenant_spawn_event.dm b/code/modules/antagonists/revenant/revenant_spawn_event.dm
index cb534b6613..b188e0c79c 100644
--- a/code/modules/antagonists/revenant/revenant_spawn_event.dm
+++ b/code/modules/antagonists/revenant/revenant_spawn_event.dm
@@ -6,7 +6,8 @@
weight = 7
max_occurrences = 1
min_players = 5
-
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Spawns an angry, soul sucking ghost."
/datum/round_event/ghost_role/revenant
var/ignore_mobcheck = FALSE
diff --git a/code/modules/antagonists/slaughter/slaughterevent.dm b/code/modules/antagonists/slaughter/slaughterevent.dm
index cdb1b32aad..9b62de57bf 100644
--- a/code/modules/antagonists/slaughter/slaughterevent.dm
+++ b/code/modules/antagonists/slaughter/slaughterevent.dm
@@ -5,6 +5,8 @@
max_occurrences = 1
earliest_start = 1 HOURS
min_players = 20
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Spawns a slaughter demon, to hunt by travelling through pools of blood."
/datum/round_event_control/slaughter/canSpawnEvent()
weight = initial(src.weight)
diff --git a/code/modules/antagonists/swarmer/swarmer_event.dm b/code/modules/antagonists/swarmer/swarmer_event.dm
index 3df7e6c0e9..e70d76812d 100644
--- a/code/modules/antagonists/swarmer/swarmer_event.dm
+++ b/code/modules/antagonists/swarmer/swarmer_event.dm
@@ -6,7 +6,8 @@
earliest_start = 30 MINUTES
min_players = 35
dynamic_should_hijack = TRUE
-
+ category = EVENT_CATEGORY_INVASION
+ description = "A robotic menace invades the station consuming everything for materials and reproducing."
/datum/round_event/spawn_swarmer
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 7c1fc6fe3d..08a77b9b2b 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -144,7 +144,7 @@
/obj/item/clothing/shoes/jackboots
name = "jackboots"
- desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
+ desc = "Nanotrasen-brand jackboots for all your jackboots-related needs. From genuine combat to tacticool LARPing, satisfaction is guaranteed."
icon_state = "jackboots"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
@@ -155,6 +155,11 @@
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
lace_time = 12 SECONDS
+/obj/item/clothing/shoes/jackboots/sec
+ name = "security jackboots"
+ desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
+ icon_state = "jackboots_sec"
+
/obj/item/clothing/shoes/jackboots/fast
slowdown = -1
diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm
index 3abe65a790..d8c7af788f 100644
--- a/code/modules/events/_event.dm
+++ b/code/modules/events/_event.dm
@@ -3,6 +3,8 @@
//this datum is used by the events controller to dictate how it selects events
/datum/round_event_control
var/name //The human-readable name of the event
+ var/category //The category of the event
+ var/description //The description of the event
var/typepath //The typepath of the event datum /datum/round_event
var/weight = 10 //The weight this event has in the random-selection process.
@@ -38,6 +40,7 @@
min_players = CEILING(min_players * CONFIG_GET(number/events_min_players_mul), 1)
/datum/round_event_control/wizard
+ category = EVENT_CATEGORY_WIZARD
wizardevent = TRUE
var/can_be_midround_wizard = TRUE
@@ -107,13 +110,22 @@
log_admin_private("[key_name(usr)] cancelled event [name].")
SSblackbox.record_feedback("tally", "event_admin_cancelled", 1, typepath)
-/datum/round_event_control/proc/runEvent(random = FALSE)
+/*
+Runs the event
+* Arguments:
+* - random: shows if the event was triggered randomly, or by on purpose by an admin or an item
+* - announce_chance_override: if the value is not null, overrides the announcement chance when an admin calls an event
+*/
+/datum/round_event_control/proc/runEvent(random = FALSE, announce_chance_override = null, admin_forced = FALSE)
var/datum/round_event/E = new typepath()
E.current_players = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1)
E.control = src
SSblackbox.record_feedback("tally", "event_ran", 1, "[E]")
occurrences++
+ if(announce_chance_override != null)
+ E.announce_chance = announce_chance_override
+
testing("[time2text(world.time, "hh:mm:ss")] [E.type]")
if(random)
log_game("Random Event triggering: [name] ([typepath])")
@@ -129,18 +141,29 @@
var/processing = TRUE
var/datum/round_event_control/control
- var/startWhen = 0 //When in the lifetime to call start().
- var/announceWhen = 0 //When in the lifetime to call announce(). Set an event's announceWhen to -1 if announcement should not be shown.
- var/endWhen = 0 //When in the lifetime the event should end.
+ /// When in the lifetime to call start().
+ /// This is in seconds - so 1 = ~2 seconds in.
+ var/start_when = 0
+ /// When in the lifetime to call announce(). If you don't want it to announce use announce_chance, below.
+ /// This is in seconds - so 1 = ~2 seconds in.
+ var/announce_when = 0
+ /// Probability of announcing, used in prob(), 0 to 100, default 100. Called in process, and for a second time in the ion storm event.
+ var/announce_chance = 100
+ /// When in the lifetime the event should end.
+ /// This is in seconds - so 1 = ~2 seconds in.
+ var/end_when = 0
- var/activeFor = 0 //How long the event has existed. You don't need to change this.
- var/current_players = 0 //Amount of of alive, non-AFK human players on server at the time of event start
+ /// How long the event has existed. You don't need to change this.
+ var/activeFor = 0
+ /// Amount of of alive, non-AFK human players on server at the time of event start
+ var/current_players = 0
var/threat = 0
- var/fakeable = TRUE //Can be faked by fake news event.
+ /// Can be faked by fake news event.
+ var/fakeable = TRUE
//Called first before processing.
//Allows you to setup your event, such as randomly
-//setting the startWhen and or announceWhen variables.
+//setting the start_when and or announce_when variables.
//Only called once.
//EDIT: if there's anything you want to override within the new() call, it will not be overridden by the time this proc is called.
//It will only have been overridden by the time we get to announce() start() tick() or end() (anything but setup basically).
@@ -148,7 +171,7 @@
/datum/round_event/proc/setup()
return
-//Called when the tick is equal to the startWhen variable.
+//Called when the tick is equal to the start_when variable.
//Allows you to start before announcing or vice versa.
//Only called once.
/datum/round_event/proc/start()
@@ -165,20 +188,20 @@
notify_ghosts("[control.name] has an object of interest: [atom_of_interest]!", source=atom_of_interest, action=NOTIFY_ORBIT, header="Something's Interesting!")
return
-//Called when the tick is equal to the announceWhen variable.
+//Called when the tick is equal to the announce_when variable.
//Allows you to announce before starting or vice versa.
//Only called once.
/datum/round_event/proc/announce(fake)
return
-//Called on or after the tick counter is equal to startWhen.
+//Called on or after the tick counter is equal to start_when.
//You can include code related to your event or add your own
//time stamped events.
//Called more than once.
/datum/round_event/proc/tick()
return
-//Called on or after the tick is equal or more than endWhen
+//Called on or after the tick is equal or more than end_when
//You can include code related to the event ending.
//Do not place spawn() in here, instead use tick() to check for
//the activeFor variable.
@@ -197,28 +220,28 @@
if(!processing)
return
- if(activeFor == startWhen)
+ if(activeFor == start_when)
processing = FALSE
start()
processing = TRUE
- if(activeFor == announceWhen)
+ if(activeFor == announce_when && prob(announce_chance))
processing = FALSE
announce(FALSE)
processing = TRUE
- if(startWhen < activeFor && activeFor < endWhen)
+ if(start_when < activeFor && activeFor < end_when)
processing = FALSE
tick()
processing = TRUE
- if(activeFor == endWhen)
+ if(activeFor == end_when)
processing = FALSE
end()
processing = TRUE
// Everything is done, let's clean up.
- if(activeFor >= endWhen && activeFor >= announceWhen && activeFor >= startWhen)
+ if(activeFor >= end_when && activeFor >= announce_when && activeFor >= start_when)
processing = FALSE
kill()
diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm
index 9fe3a2a7a9..64c743d1a1 100755
--- a/code/modules/events/abductor.dm
+++ b/code/modules/events/abductor.dm
@@ -6,6 +6,8 @@
min_players = 30
earliest_start = 30 MINUTES
dynamic_should_hijack = TRUE
+ category = EVENT_CATEGORY_INVASION
+ description = "One or more abductor teams spawns, and they plan to experiment on the crew."
/datum/round_event/ghost_role/abductor
minimum_required = 2
diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm
index f7014df648..cf94253bbb 100644
--- a/code/modules/events/alien_infestation.dm
+++ b/code/modules/events/alien_infestation.dm
@@ -5,9 +5,11 @@
min_players = 25
max_occurrences = 1
dynamic_should_hijack = TRUE
+ category = EVENT_CATEGORY_ENTITIES
+ description = "A xenomorph larva spawns on a random vent."
/datum/round_event/ghost_role/alien_infestation
- announceWhen = 400
+ announce_when = 400
minimum_required = 1
role_name = "alien larva"
@@ -19,7 +21,7 @@
/datum/round_event/ghost_role/alien_infestation/setup()
- announceWhen = rand(announceWhen, announceWhen + 50)
+ announce_when = rand(announce_when, announce_when + 50)
if(prob(50))
spawncount++
diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm
index ae0d5442ad..456a83958d 100644
--- a/code/modules/events/anomaly.dm
+++ b/code/modules/events/anomaly.dm
@@ -5,11 +5,13 @@
min_players = 1
max_occurrences = 0 //This one probably shouldn't occur! It'd work, but it wouldn't be very fun.
weight = 15
+ category = EVENT_CATEGORY_ANOMALIES
+ description = "This anomaly shocks and explodes. This is the base type."
/datum/round_event/anomaly
var/area/impact_area
var/obj/effect/anomaly/anomaly_path = /obj/effect/anomaly/flux
- announceWhen = 1
+ announce_when = 1
/datum/round_event/anomaly/proc/findEventArea()
diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm
index fd64b20244..f058f37da4 100644
--- a/code/modules/events/anomaly_bluespace.dm
+++ b/code/modules/events/anomaly_bluespace.dm
@@ -4,10 +4,11 @@
max_occurrences = 1
weight = 5
+ description = "This anomaly randomly teleports all items and mobs in a large area."
/datum/round_event/anomaly/anomaly_bluespace
- startWhen = 3
- announceWhen = 10
+ start_when = 3
+ announce_when = 10
anomaly_path = /obj/effect/anomaly/bluespace
/datum/round_event/anomaly/anomaly_bluespace/announce(fake)
diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm
index 6368e70b94..d3b1e8ea7e 100644
--- a/code/modules/events/anomaly_flux.dm
+++ b/code/modules/events/anomaly_flux.dm
@@ -4,10 +4,11 @@
max_occurrences = 5
weight = 20
+ description = "This anomaly shocks and explodes."
/datum/round_event/anomaly/anomaly_flux
- startWhen = 10
- announceWhen = 3
+ start_when = 10
+ announce_when = 3
anomaly_path = /obj/effect/anomaly/flux
/datum/round_event/anomaly/anomaly_flux/announce(fake)
diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm
index c1b4ade5c0..232d2ddd35 100644
--- a/code/modules/events/anomaly_grav.dm
+++ b/code/modules/events/anomaly_grav.dm
@@ -4,11 +4,11 @@
max_occurrences = 5
weight = 20
-
+ description = "This anomaly throws things around."
/datum/round_event/anomaly/anomaly_grav
- startWhen = 3
- announceWhen = 20
+ start_when = 3
+ announce_when = 20
anomaly_path = /obj/effect/anomaly/grav
/datum/round_event/anomaly/anomaly_grav/announce(fake)
diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm
index 83c1fa64cc..dee0330743 100644
--- a/code/modules/events/anomaly_pyro.dm
+++ b/code/modules/events/anomaly_pyro.dm
@@ -5,10 +5,11 @@
min_players = 5
max_occurrences = 5
weight = 20
+ description = "This anomaly sets things on fire, and creates a pyroclastic slime."
/datum/round_event/anomaly/anomaly_pyro
- startWhen = 3
- announceWhen = 10
+ start_when = 3
+ announce_when = 10
anomaly_path = /obj/effect/anomaly/pyro
/datum/round_event/anomaly/anomaly_pyro/announce(fake)
diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm
index 7228030616..43dcc0baf4 100644
--- a/code/modules/events/anomaly_vortex.dm
+++ b/code/modules/events/anomaly_vortex.dm
@@ -5,10 +5,11 @@
min_players = 20
max_occurrences = 2
weight = 5
+ description = "This anomaly sucks in and detonates items."
/datum/round_event/anomaly/anomaly_vortex
- startWhen = 10
- announceWhen = 3
+ start_when = 10
+ announce_when = 3
anomaly_path = /obj/effect/anomaly/bhole
/datum/round_event/anomaly/anomaly_vortex/announce(fake)
diff --git a/code/modules/events/atmos_speed.dm b/code/modules/events/atmos_speed.dm
index 17a02d3dd1..64e6e883cc 100644
--- a/code/modules/events/atmos_speed.dm
+++ b/code/modules/events/atmos_speed.dm
@@ -3,10 +3,12 @@
typepath = /datum/round_event/atmos_flux
max_occurrences = 5
weight = 10
+ category = EVENT_CATEGORY_ENGINEERING
+ description = "Modifies the speed of the SSair randomly, ends after one minute."
/datum/round_event/atmos_flux
- announceWhen = 1
- endWhen = 600
+ announce_when = 1
+ end_when = 600
var/original_speed
/datum/round_event/atmos_flux/announce(fake)
diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm
index 89a84d3494..63d7122cb8 100644
--- a/code/modules/events/aurora_caelus.dm
+++ b/code/modules/events/aurora_caelus.dm
@@ -4,6 +4,8 @@
max_occurrences = 1
weight = 4
earliest_start = 5 MINUTES
+ category = EVENT_CATEGORY_FRIENDLY
+ description = "A colourful display can be seen through select windows. And the kitchen."
/datum/round_event_control/aurora_caelus/canSpawnEvent(players, gamemode)
if(!CONFIG_GET(flag/starlight))
@@ -11,9 +13,9 @@
return ..()
/datum/round_event/aurora_caelus
- announceWhen = 1
- startWhen = 9
- endWhen = 50
+ announce_when = 1
+ start_when = 9
+ end_when = 50
var/list/aurora_colors = list("#A2FF80", "#A2FF8B", "#A2FF96", "#A2FFA5", "#A2FFB6", "#A2FFC7", "#A2FFDE", "#A2FFEE")
var/aurora_progress = 0 //this cycles from 1 to 8, slowly changing colors from gentle green to gentle blue
diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm
index e31711661d..d28c5d6512 100644
--- a/code/modules/events/blob.dm
+++ b/code/modules/events/blob.dm
@@ -7,9 +7,11 @@
earliest_start = 60 MINUTES
min_players = 35
dynamic_should_hijack = TRUE
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Spawns a new blob overmind."
/datum/round_event/ghost_role/blob
- announceWhen = -1
+ announce_when = -1
role_name = "blob overmind"
fakeable = TRUE
diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm
index 0529d102dc..85d69a1509 100644
--- a/code/modules/events/brain_trauma.dm
+++ b/code/modules/events/brain_trauma.dm
@@ -3,6 +3,8 @@
typepath = /datum/round_event/brain_trauma
weight = 25
min_players = 5
+ category = EVENT_CATEGORY_HEALTH
+ description = "A crewmember gains a random trauma."
/datum/round_event_control/brain_trauma/canSpawnEvent(var/players_amt, var/gamemode)
if(!..()) return FALSE
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index 1b275af4fb..cab9daaa55 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -5,10 +5,12 @@
min_players = 15
max_occurrences = 1
+ category = EVENT_CATEGORY_AI
+ description = "Vending machines will attack people until the Patient Zero is disabled."
/datum/round_event/brand_intelligence
- announceWhen = 21
- endWhen = 1000 //Ends when all vending machines are subverted anyway.
+ announce_when = 21
+ end_when = 1000 //Ends when all vending machines are subverted anyway.
var/list/obj/machinery/vending/vendingMachines = list()
var/list/obj/machinery/vending/infectedMachines = list()
var/obj/machinery/vending/originMachine
diff --git a/code/modules/events/bureaucratic_error.dm b/code/modules/events/bureaucratic_error.dm
index 7246c9aedf..fc35df791b 100644
--- a/code/modules/events/bureaucratic_error.dm
+++ b/code/modules/events/bureaucratic_error.dm
@@ -3,9 +3,11 @@
typepath = /datum/round_event/bureaucratic_error
max_occurrences = 1
weight = 5
+ category = EVENT_CATEGORY_BUREAUCRATIC
+ description = "Randomly opens and closes job slots, along with changing the overflow role."
/datum/round_event/bureaucratic_error
- announceWhen = 1
+ announce_when = 1
/datum/round_event/bureaucratic_error/announce(fake)
priority_announce("A recent bureaucratic error in the Organic Resources Department may result in personnel shortages in some departments and redundant staffing in others.", "Paperwork Mishap Alert")
diff --git a/code/modules/events/camerafailure.dm b/code/modules/events/camerafailure.dm
index 8d7ef3204c..453b919c5b 100644
--- a/code/modules/events/camerafailure.dm
+++ b/code/modules/events/camerafailure.dm
@@ -4,6 +4,8 @@
weight = 100
max_occurrences = 20
alert_observers = FALSE
+ category = EVENT_CATEGORY_ENGINEERING
+ description = "Turns off a random amount of cameras."
/datum/round_event/camera_failure
fakeable = FALSE
diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm
index f927a59ad6..bed6cf84ea 100644
--- a/code/modules/events/carp_migration.dm
+++ b/code/modules/events/carp_migration.dm
@@ -5,6 +5,8 @@
min_players = 2
earliest_start = 10 MINUTES
max_occurrences = 6
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Summons a school of space carp."
/datum/round_event_control/carp_migration/New()
. = ..()
@@ -14,12 +16,12 @@
earliest_start *= 0.5
/datum/round_event/carp_migration
- announceWhen = 3
- startWhen = 50
+ announce_when = 3
+ start_when = 50
var/hasAnnounced = FALSE
/datum/round_event/carp_migration/setup()
- startWhen = rand(40, 60)
+ start_when = rand(40, 60)
/datum/round_event/carp_migration/announce(fake)
if(prob(50))
diff --git a/code/modules/events/cat_surgeon.dm b/code/modules/events/cat_surgeon.dm
index 025d2d2325..254fdaecca 100644
--- a/code/modules/events/cat_surgeon.dm
+++ b/code/modules/events/cat_surgeon.dm
@@ -1,45 +1,47 @@
/datum/round_event_control/cat_surgeon
- name = "Cat Surgeon"
- typepath = /datum/round_event/cat_surgeon
- max_occurrences = 1
- weight = 5
+ name = "Cat Surgeon"
+ typepath = /datum/round_event/cat_surgeon
+ max_occurrences = 1
+ weight = 5
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Spawns a crazy surgeon ready to perverse things with the crew."
/datum/round_event/cat_surgeon/announce(fake)
priority_announce("One of our... ahem... 'special' cases has escaped. As it happens their last known location before their tracker went dead is your station so keep an eye out for them. On an unrelated note, has anyone seen our cats?",
sender_override = "Nanotrasen Psych Ward", has_important_message = TRUE)
/datum/round_event/cat_surgeon/start()
- var/list/spawn_locs = list()
- var/list/unsafe_spawn_locs = list()
- for(var/X in GLOB.xeno_spawn)
- if(!isfloorturf(X))
- unsafe_spawn_locs += X
- continue
- var/turf/open/floor/F = X
- var/datum/gas_mixture/A = F.air
- var/oxy_moles = A.get_moles(GAS_O2)
- if((oxy_moles < 16 || oxy_moles > 50) || A.get_moles(GAS_PLASMA) || A.get_moles(GAS_CO2) >= 10)
- unsafe_spawn_locs += F
- continue
- if((A.return_temperature() <= 270) || (A.return_temperature() >= 360))
- unsafe_spawn_locs += F
- continue
- var/pressure = A.return_pressure()
- if((pressure <= 20) || (pressure >= 550))
- unsafe_spawn_locs += F
- continue
- spawn_locs += F
+ var/list/spawn_locs = list()
+ var/list/unsafe_spawn_locs = list()
+ for(var/X in GLOB.xeno_spawn)
+ if(!isfloorturf(X))
+ unsafe_spawn_locs += X
+ continue
+ var/turf/open/floor/F = X
+ var/datum/gas_mixture/A = F.air
+ var/oxy_moles = A.get_moles(GAS_O2)
+ if((oxy_moles < 16 || oxy_moles > 50) || A.get_moles(GAS_PLASMA) || A.get_moles(GAS_CO2) >= 10)
+ unsafe_spawn_locs += F
+ continue
+ if((A.return_temperature() <= 270) || (A.return_temperature() >= 360))
+ unsafe_spawn_locs += F
+ continue
+ var/pressure = A.return_pressure()
+ if((pressure <= 20) || (pressure >= 550))
+ unsafe_spawn_locs += F
+ continue
+ spawn_locs += F
- if(!spawn_locs.len)
- spawn_locs += unsafe_spawn_locs
+ if(!spawn_locs.len)
+ spawn_locs += unsafe_spawn_locs
- if(!spawn_locs.len)
- message_admins("No valid spawn locations found, aborting...")
- return MAP_ERROR
+ if(!spawn_locs.len)
+ message_admins("No valid spawn locations found, aborting...")
+ return MAP_ERROR
- var/turf/T = get_turf(pick(spawn_locs))
- var/mob/living/simple_animal/hostile/cat_butcherer/S = new(T)
- playsound(S, 'sound/misc/catscream.ogg', 75, 1, -1)
- message_admins("A cat surgeon has been spawned at [COORD(T)][ADMIN_JMP(T)]")
- log_game("A cat surgeon has been spawned at [COORD(T)]")
- return SUCCESSFUL_SPAWN
+ var/turf/T = get_turf(pick(spawn_locs))
+ var/mob/living/simple_animal/hostile/cat_butcherer/S = new(T)
+ playsound(S, 'sound/misc/catscream.ogg', 75, 1, -1)
+ message_admins("A cat surgeon has been spawned at [COORD(T)][ADMIN_JMP(T)]")
+ log_game("A cat surgeon has been spawned at [COORD(T)]")
+ return SUCCESSFUL_SPAWN
diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm
index 0342ca4643..b47dad0c93 100644
--- a/code/modules/events/communications_blackout.dm
+++ b/code/modules/events/communications_blackout.dm
@@ -2,9 +2,11 @@
name = "Communications Blackout"
typepath = /datum/round_event/communications_blackout
weight = 30
+ category = EVENT_CATEGORY_ENGINEERING
+ description = "Heavily emps all telecommunication machines, blocking all communication for a while."
/datum/round_event/communications_blackout
- announceWhen = 1
+ announce_when = 1
/datum/round_event/communications_blackout/announce(fake)
var/alert = pick( "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you*%fj00)`5vc-BZZT", \
diff --git a/code/modules/events/devil.dm b/code/modules/events/devil.dm
index 7d6e0bd441..3d6382b2a4 100644
--- a/code/modules/events/devil.dm
+++ b/code/modules/events/devil.dm
@@ -2,6 +2,8 @@
name = "Create Devil"
typepath = /datum/round_event/ghost_role/devil
max_occurrences = 0
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Spawns a devil, looking forward to makings deals with crewmembers to get their souls."
/datum/round_event/ghost_role/devil
var/success_spawn = 0
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index 517cf33b82..753349fdd6 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -4,9 +4,11 @@
max_occurrences = 1
min_players = 3
weight = 5
+ category = EVENT_CATEGORY_HEALTH
+ description = "A classic or advanced disease will infect some crewmembers."
/datum/round_event/disease_outbreak
- announceWhen = 15
+ announce_when = 15
var/virus_type
@@ -24,7 +26,7 @@
priority_announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", "outbreak7")
/datum/round_event/disease_outbreak/setup()
- announceWhen = rand(15, 30)
+ announce_when = rand(15, 30)
/datum/round_event/disease_outbreak/start()
diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm
index 941478d52a..6b0139c449 100644
--- a/code/modules/events/dust.dm
+++ b/code/modules/events/dust.dm
@@ -5,10 +5,12 @@
max_occurrences = 1000
earliest_start = 0 MINUTES
alert_observers = FALSE
+ category = EVENT_CATEGORY_SPACE
+ description = "A single space dust is hurled at the station."
/datum/round_event/space_dust
- startWhen = 1
- endWhen = 2
+ start_when = 1
+ end_when = 2
fakeable = FALSE
/datum/round_event/space_dust/start()
@@ -21,11 +23,13 @@
max_occurrences = 1
min_players = 10
earliest_start = 20 MINUTES
+ category = EVENT_CATEGORY_SPACE
+ description = "The station is pelted by an extreme amount of sand for several minutes."
/datum/round_event/sandstorm
- startWhen = 1
- endWhen = 150 // ~5 min
- announceWhen = 0
+ start_when = 1
+ end_when = 150 // ~5 min
+ announce_when = 0
fakeable = FALSE
/datum/round_event/sandstorm/announce(fake)
diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm
index b850b4db62..f04389b1a1 100644
--- a/code/modules/events/electrical_storm.dm
+++ b/code/modules/events/electrical_storm.dm
@@ -4,12 +4,13 @@
earliest_start = 10 MINUTES
min_players = 5
weight = 40
- alert_observers = FALSE
+ category = EVENT_CATEGORY_ENGINEERING
+ description = "Destroys all lights in a large area."
/datum/round_event/electrical_storm
var/lightsoutAmount = 1
var/lightsoutRange = 25
- announceWhen = 1
+ announce_when = 1
/datum/round_event/electrical_storm/announce(fake)
if(prob(50))
diff --git a/code/modules/events/fake_virus.dm b/code/modules/events/fake_virus.dm
index cebf1ed14b..ec69f9e2c9 100644
--- a/code/modules/events/fake_virus.dm
+++ b/code/modules/events/fake_virus.dm
@@ -2,6 +2,8 @@
name = "Fake Virus"
typepath = /datum/round_event/fake_virus
weight = 20
+ category = EVENT_CATEGORY_HEALTH
+ description = "Some crewmembers suffer from temporary hypochondria."
/datum/round_event/fake_virus/start()
var/list/fake_virus_victims = list()
diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm
index 5ac75cf087..95b7d1c3ce 100644
--- a/code/modules/events/false_alarm.dm
+++ b/code/modules/events/false_alarm.dm
@@ -4,7 +4,8 @@
weight = 20
max_occurrences = 5
var/forced_type //Admin abuse
-
+ category = EVENT_CATEGORY_BUREAUCRATIC
+ description = "Fakes an event announcement."
/datum/round_event_control/falsealarm/admin_setup()
if(!check_rights(R_FUN))
@@ -17,15 +18,15 @@
if(!initial(event.fakeable))
continue
possible_types += E
-
+
forced_type = input(usr, "Select the scare.","False event") as null|anything in possible_types
/datum/round_event_control/falsealarm/canSpawnEvent(players_amt, gamemode)
return ..() && length(gather_false_events())
/datum/round_event/falsealarm
- announceWhen = 0
- endWhen = 1
+ announce_when = 0
+ end_when = 1
fakeable = FALSE
/datum/round_event/falsealarm/announce(fake)
diff --git a/code/modules/events/floorcluwne.dm b/code/modules/events/floorcluwne.dm
index ce9a2d8cc3..6b91fb2ca2 100644
--- a/code/modules/events/floorcluwne.dm
+++ b/code/modules/events/floorcluwne.dm
@@ -4,7 +4,8 @@
max_occurrences = 0
min_players = 20
weight = 10
-
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Spawns a floor cluwne, will hunt a random player and most likely gib them, prepare for adminhelps."
/datum/round_event/floor_cluwne/start()
var/list/spawn_locs = list()
diff --git a/code/modules/events/fugitive_spawning.dm b/code/modules/events/fugitive_spawning.dm
index a09f0f584e..13964d6ec6 100644
--- a/code/modules/events/fugitive_spawning.dm
+++ b/code/modules/events/fugitive_spawning.dm
@@ -4,6 +4,8 @@
max_occurrences = 1
min_players = 20
earliest_start = 30 MINUTES //deadchat sink, lets not even consider it early on.
+ category = EVENT_CATEGORY_INVASION
+ description = "Fugitives will hide on the station, followed by hunters."
/datum/round_event/ghost_role/fugitives
minimum_required = 1
diff --git a/code/modules/events/ghost_role.dm b/code/modules/events/ghost_role.dm
index ae1d1320a5..baabb435bc 100644
--- a/code/modules/events/ghost_role.dm
+++ b/code/modules/events/ghost_role.dm
@@ -7,6 +7,8 @@
var/minimum_required = 1
var/role_name = "debug rat with cancer" // Q U A L I T Y M E M E S
var/list/spawned_mobs = list()
+ var/status
+ var/cached_announcement_chance
fakeable = FALSE
/datum/round_event/ghost_role/start()
@@ -17,7 +19,10 @@
// to prevent us from getting gc'd halfway through
processing = FALSE
- var/status = spawn_role()
+ status = spawn_role()
+ if(isnull(cached_announcement_chance))
+ cached_announcement_chance = announce_chance //only announce once we've finished the spawning loop.
+ announce_chance = (status == SUCCESSFUL_SPAWN ? cached_announcement_chance : 0)
if((status == WAITING_FOR_SOMETHING))
if(retry >= MAX_SPAWN_ATTEMPT)
message_admins("[role_name] event has exceeded maximum spawn attempts. Aborting and refunding.")
diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm
index 1bb0ee617a..c39a6e1bb2 100644
--- a/code/modules/events/grid_check.dm
+++ b/code/modules/events/grid_check.dm
@@ -3,10 +3,12 @@
typepath = /datum/round_event/grid_check
weight = 10
max_occurrences = 3
+ category = EVENT_CATEGORY_ENGINEERING
+ description = "Turns off all APCs for a while, or until they are manually rebooted."
/datum/round_event/grid_check
- announceWhen = 1
- startWhen = 1
+ announce_when = 1
+ start_when = 1
/datum/round_event/grid_check/announce(fake)
priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", "poweroff")
diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm
index 930a2b884f..4f94576fa6 100644
--- a/code/modules/events/heart_attack.dm
+++ b/code/modules/events/heart_attack.dm
@@ -4,6 +4,8 @@
weight = 10
max_occurrences = 2
min_players = 10 // To avoid shafting lowpop
+ category = EVENT_CATEGORY_HEALTH
+ description = "A random crewmember's heart gives out."
/datum/round_event_control/heart_attack/canSpawnEvent(var/players_amt, var/gamemode)
if(!..()) return FALSE
diff --git a/code/modules/events/high_priority_bounty.dm b/code/modules/events/high_priority_bounty.dm
index ffdcd8840b..90f27b19f9 100644
--- a/code/modules/events/high_priority_bounty.dm
+++ b/code/modules/events/high_priority_bounty.dm
@@ -4,6 +4,8 @@
max_occurrences = 3
weight = 20
earliest_start = 10
+ category = EVENT_CATEGORY_BUREAUCRATIC
+ description = "Creates bounties that are three times original worth."
/datum/round_event/high_priority_bounty/announce(fake)
priority_announce("Central Command has issued a high-priority cargo bounty. Details have been sent to all bounty consoles.", "Nanotrasen Bounty Program")
diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm
index 9824355e4b..fd45eb4ccf 100644
--- a/code/modules/events/holiday/halloween.dm
+++ b/code/modules/events/holiday/halloween.dm
@@ -5,6 +5,8 @@
weight = -1 //forces it to be called, regardless of weight
max_occurrences = 1
earliest_start = 0 MINUTES
+ category = EVENT_CATEGORY_HOLIDAY
+ description = "Gives everyone treats, and turns Ian and Polly into their festive versions."
/datum/round_event/spooky/start()
..()
diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm
index 16ae047729..ebe44d3e00 100644
--- a/code/modules/events/holiday/vday.dm
+++ b/code/modules/events/holiday/vday.dm
@@ -11,6 +11,8 @@
weight = -1 //forces it to be called, regardless of weight
max_occurrences = 1
earliest_start = 0 MINUTES
+ category = EVENT_CATEGORY_HOLIDAY
+ description = "Puts people on dates! They must protect each other. Sometimes a vengeful third wheel spawns."
/datum/round_event/valentines/start()
..()
diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm
index e043caa29d..a9bedb3c57 100644
--- a/code/modules/events/holiday/xmas.dm
+++ b/code/modules/events/holiday/xmas.dm
@@ -68,6 +68,8 @@
weight = 20
max_occurrences = 1
earliest_start = 30 MINUTES
+ category = EVENT_CATEGORY_HOLIDAY
+ description = "Spawns santa, who shall roam the station, handing out gifts."
/datum/round_event/santa
var/mob/living/carbon/human/santa //who is our santa?
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index 482abe67f2..a48191e8a1 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -13,7 +13,8 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
min_players = 15
max_occurrences = 5
var/atom/special_target
-
+ category = EVENT_CATEGORY_SPACE
+ description = "The station passes through an immovable rod."
/datum/round_event_control/immovable_rod/admin_setup()
if(!check_rights(R_FUN))
@@ -24,7 +25,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
special_target = get_turf(usr)
/datum/round_event/immovable_rod
- announceWhen = 5
+ announce_when = 5
/datum/round_event/immovable_rod/announce(fake)
priority_announce("What the fuck was that?!", "General Alert", has_important_message = TRUE)
diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm
index f25b476657..0fefb43170 100644
--- a/code/modules/events/ion_storm.dm
+++ b/code/modules/events/ion_storm.dm
@@ -5,6 +5,8 @@
typepath = /datum/round_event/ion_storm
weight = 15
min_players = 2
+ category = EVENT_CATEGORY_AI
+ description = "Gives the AI a new, randomized law."
/datum/round_event/ion_storm
var/replaceLawsetChance = 25 //chance the AI's lawset is completely replaced with something else per config weights
@@ -14,8 +16,8 @@
var/botEmagChance = 10
var/announceEvent = ION_RANDOM // -1 means don't announce, 0 means have it randomly announce, 1 means it is announced
var/ionMessage = null
- var/ionAnnounceChance = 33
- announceWhen = 1
+ announce_when = 1
+ announce_chance = 33
/datum/round_event/ion_storm/add_law_only // special subtype that adds a law only
replaceLawsetChance = 0
@@ -25,7 +27,7 @@
botEmagChance = 0
/datum/round_event/ion_storm/announce(fake)
- if(announceEvent == ION_ANNOUNCE || (announceEvent == ION_RANDOM && prob(ionAnnounceChance)) || fake)
+ if(announceEvent == ION_ANNOUNCE || (announceEvent == ION_RANDOM && prob(announce_chance)) || fake)
priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", "ionstorm", has_important_message = prob(80))
diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm
index 3f7cbc77f5..dc24a52b19 100644
--- a/code/modules/events/major_dust.dm
+++ b/code/modules/events/major_dust.dm
@@ -2,6 +2,7 @@
name = "Major Space Dust"
typepath = /datum/round_event/meteor_wave/major_dust
weight = 8
+ description = "The station is pelted by sand."
/datum/round_event/meteor_wave/major_dust
wave_name = "space dust"
diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm
index d8e52cf46d..2a0c45a5ff 100644
--- a/code/modules/events/mass_hallucination.dm
+++ b/code/modules/events/mass_hallucination.dm
@@ -5,6 +5,8 @@
max_occurrences = 5
min_players = 1
var/forced_hallucination
+ category = EVENT_CATEGORY_HEALTH
+ description = "Multiple crewmembers start to hallucinate the same thing."
/datum/round_event_control/mass_hallucination/admin_setup()
if(!check_rights(R_FUN))
diff --git a/code/modules/events/meateor_wave.dm b/code/modules/events/meateor_wave.dm
index c4711055d9..a625f53788 100644
--- a/code/modules/events/meateor_wave.dm
+++ b/code/modules/events/meateor_wave.dm
@@ -3,6 +3,7 @@
typepath = /datum/round_event/meteor_wave/meaty
weight = 2
max_occurrences = 1
+ description = "A meteor wave made of meat."
/datum/round_event/meteor_wave/meaty
wave_name = "meaty"
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index a3e0eb70ff..a3534be3ea 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -10,22 +10,24 @@
min_players = 15
max_occurrences = 3
earliest_start = 25 MINUTES
+ category = EVENT_CATEGORY_SPACE
+ description = "A regular meteor wave."
/datum/round_event/meteor_wave
- startWhen = 6
- endWhen = 66
- announceWhen = 1
+ start_when = 6
+ end_when = 66
+ announce_when = 1
threat = 15
var/list/wave_type
var/wave_name = "normal"
var/direction
/datum/round_event/meteor_wave/setup()
- announceWhen = 1
- startWhen = 150 // 5 minutes
+ announce_when = 1
+ start_when = 150 // 5 minutes
if(GLOB.singularity_counter)
- startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE)
- endWhen = startWhen + 60
+ start_when *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE)
+ end_when = start_when + 60
/datum/round_event/meteor_wave/New()
..()
@@ -61,9 +63,9 @@
kill()
/datum/round_event/meteor_wave/announce(fake)
- priority_announce(generateMeteorString(startWhen,TRUE,direction), "Meteor Alert", "meteors", has_important_message = TRUE)
+ priority_announce(generateMeteorString(start_when,TRUE,direction), "Meteor Alert", "meteors", has_important_message = TRUE)
-/proc/generateMeteorString(startWhen,syndiealert,direction)
+/proc/generateMeteorString(start_when,syndiealert,direction)
var/directionstring
switch(direction)
if(NORTH)
@@ -74,7 +76,7 @@
directionstring = " towards starboard"
if(WEST)
directionstring = " towards port"
- return "Meteors have been detected on a collision course with the station[directionstring]. Estimated time until impact: [round((startWhen * SSevents.wait) / 10, 0.1)] seconds.[GLOB.singularity_counter && syndiealert ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]"
+ return "Meteors have been detected on a collision course with the station[directionstring]. Estimated time until impact: [round((start_when * SSevents.wait) / 10, 0.1)] seconds.[GLOB.singularity_counter && syndiealert ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]"
/datum/round_event/meteor_wave/tick()
if(ISMULTIPLE(activeFor, 3))
@@ -87,7 +89,7 @@
min_players = 20
max_occurrences = 3
earliest_start = 35 MINUTES
-
+ description = "A meteor wave with higher chance of big meteors."
/datum/round_event/meteor_wave/threatening
wave_name = "threatening"
@@ -100,6 +102,7 @@
min_players = 25
max_occurrences = 3
earliest_start = 45 MINUTES
+ description = "A meteor wave that might summon a tunguska class meteor."
/datum/round_event/meteor_wave/catastrophic
wave_name = "catastrophic"
diff --git a/code/modules/events/mice_migration.dm b/code/modules/events/mice_migration.dm
index 373c495972..5bf842ba47 100644
--- a/code/modules/events/mice_migration.dm
+++ b/code/modules/events/mice_migration.dm
@@ -2,6 +2,8 @@
name = "Mice Migration"
typepath = /datum/round_event/mice_migration
weight = 10
+ category = EVENT_CATEGORY_ENTITIES
+ description = "A horde of mice arrives, and perhaps even the Rat King themselves."
/datum/round_event/mice_migration
var/minimum_mice = 5
diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm
index 62f9c88d49..71351d85be 100644
--- a/code/modules/events/nightmare.dm
+++ b/code/modules/events/nightmare.dm
@@ -4,6 +4,8 @@
max_occurrences = 1
min_players = 20
dynamic_should_hijack = TRUE
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Spawns a nightmare, aiming to darken the station."
/datum/round_event/ghost_role/nightmare
minimum_required = 1
diff --git a/code/modules/events/operative.dm b/code/modules/events/operative.dm
index 8d8adf2735..cbefa58c7b 100644
--- a/code/modules/events/operative.dm
+++ b/code/modules/events/operative.dm
@@ -2,7 +2,9 @@
name = "Lone Operative"
typepath = /datum/round_event/ghost_role/operative
weight = 0 //Admin only
- max_occurrences = 0 //Now it is actually admin only
+ max_occurrences = 1
+ category = EVENT_CATEGORY_INVASION
+ description = "A single nuclear operative assaults the station."
/datum/round_event/ghost_role/operative
minimum_required = 1
diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm
index 188d733cd8..1b1fdee584 100644
--- a/code/modules/events/pirates.dm
+++ b/code/modules/events/pirates.dm
@@ -6,6 +6,8 @@
min_players = 10
earliest_start = 30 MINUTES
dynamic_should_hijack = TRUE
+ category = EVENT_CATEGORY_INVASION
+ description = "The crew will either pay up, or face a pirate assault."
#define PIRATES_ROGUES "Rogues"
// #define PIRATES_SILVERSCALES "Silverscales"
diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm
index 59bb22e9af..b1b68fb585 100644
--- a/code/modules/events/portal_storm.dm
+++ b/code/modules/events/portal_storm.dm
@@ -4,6 +4,8 @@
weight = 2
min_players = 15
earliest_start = 30 MINUTES
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Syndicate troops pour out of portals."
/datum/round_event/portal_storm/syndicate_shocktroop
boss_types = list(/mob/living/simple_animal/hostile/syndicate/melee/space/stormtrooper = 2)
@@ -15,6 +17,8 @@
typepath = /datum/round_event/portal_storm/portal_storm_narsie
weight = 0
max_occurrences = 0
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Nar'sie constructs pour out of portals."
/datum/round_event/portal_storm/portal_storm_narsie
boss_types = list(/mob/living/simple_animal/hostile/construct/builder = 6)
@@ -22,9 +26,9 @@
/mob/living/simple_animal/hostile/construct/wraith/hostile = 6)
/datum/round_event/portal_storm
- startWhen = 7
- endWhen = 999
- announceWhen = 1
+ start_when = 7
+ end_when = 999
+ announce_when = 1
var/list/boss_spawn = list()
var/list/boss_types = list() //only configure this if you have hostiles
@@ -53,7 +57,7 @@
while(number_of_hostiles > hostiles_spawn.len)
hostiles_spawn += get_random_station_turf()
- next_boss_spawn = startWhen + CEILING(2 * number_of_hostiles / number_of_bosses, 1)
+ next_boss_spawn = start_when + CEILING(2 * number_of_hostiles / number_of_bosses, 1)
/datum/round_event/portal_storm/announce(fake)
do_announce()
@@ -117,7 +121,7 @@
/datum/round_event/portal_storm/proc/time_to_end()
if(!hostile_types.len && !boss_types.len)
- endWhen = activeFor
+ end_when = activeFor
if(!number_of_hostiles && number_of_bosses)
- endWhen = activeFor
+ end_when = activeFor
diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm
index d35f4931fb..110ab745a0 100644
--- a/code/modules/events/prison_break.dm
+++ b/code/modules/events/prison_break.dm
@@ -3,10 +3,12 @@
typepath = /datum/round_event/grey_tide
max_occurrences = 2
min_players = 5
+ category = EVENT_CATEGORY_ENGINEERING
+ description = "Bolts open all doors in one or more departments."
/datum/round_event/grey_tide
- announceWhen = 50
- endWhen = 20
+ announce_when = 50
+ end_when = 20
var/list/area/areasToOpen = list()
var/list/potential_areas = list(/area/command,
/area/engineering,
@@ -17,8 +19,8 @@
var/severity = 1
/datum/round_event/grey_tide/setup()
- announceWhen = rand(50, 60)
- endWhen = rand(20, 30)
+ announce_when = rand(50, 60)
+ end_when = rand(20, 30)
severity = rand(1,3)
for(var/i in 1 to severity)
var/picked_area = pick_n_take(potential_areas)
diff --git a/code/modules/events/processor_overload.dm b/code/modules/events/processor_overload.dm
index 6f20d954ed..578520f565 100644
--- a/code/modules/events/processor_overload.dm
+++ b/code/modules/events/processor_overload.dm
@@ -3,9 +3,11 @@
typepath = /datum/round_event/processor_overload
weight = 15
min_players = 20
+ category = EVENT_CATEGORY_ENGINEERING
+ description = "Emps the telecomm processors, scrambling radio speech. Might blow up a few."
/datum/round_event/processor_overload
- announceWhen = 1
+ announce_when = 1
/datum/round_event/processor_overload/announce(fake)
var/alert = pick( "Exospheric bubble inbound. Processor overload is likely. Please contact you*%xp25)`6cq-BZZT", \
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index 52a207fd14..5ba3d017e1 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -2,14 +2,16 @@
name = "Radiation Storm"
typepath = /datum/round_event/radiation_storm
max_occurrences = 1
+ category = EVENT_CATEGORY_SPACE
+ description = "Radiation storm affects the station, forcing the crew to escape to maintenance."
/datum/round_event/radiation_storm
/datum/round_event/radiation_storm/setup()
- startWhen = 3
- endWhen = startWhen + 1
- announceWhen = 1
+ start_when = 3
+ end_when = start_when + 1
+ announce_when = 1
/datum/round_event/radiation_storm/announce(fake)
priority_announce("High levels of radiation detected near the station. Maintenance is best shielded from radiation.", "Anomaly Alert", "radiation", has_important_message = TRUE)
diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm
index d90792c88f..8cccaba68b 100644
--- a/code/modules/events/sentience.dm
+++ b/code/modules/events/sentience.dm
@@ -2,7 +2,8 @@
name = "Random Human-level Intelligence"
typepath = /datum/round_event/ghost_role/sentience
weight = 10
-
+ category = EVENT_CATEGORY_FRIENDLY
+ description = "An animal or robot becomes sentient!"
/datum/round_event/ghost_role/sentience
minimum_required = 1
@@ -75,6 +76,8 @@
name = "Station-wide Human-level Intelligence"
typepath = /datum/round_event/ghost_role/sentience/all
weight = 0
+ category = EVENT_CATEGORY_FRIENDLY
+ description = "ALL animals and robots become sentient, provided there is enough ghosts."
/datum/round_event/ghost_role/sentience/all
one = "all"
diff --git a/code/modules/events/shuttle_catastrophe b/code/modules/events/shuttle_catastrophe.dm
similarity index 94%
rename from code/modules/events/shuttle_catastrophe
rename to code/modules/events/shuttle_catastrophe.dm
index d948b39d3b..2e431a8a34 100644
--- a/code/modules/events/shuttle_catastrophe
+++ b/code/modules/events/shuttle_catastrophe.dm
@@ -3,6 +3,8 @@
typepath = /datum/round_event/shuttle_catastrophe
weight = 10
max_occurrences = 1
+ category = EVENT_CATEGORY_BUREAUCRATIC
+ description = "Replaces the emergency shuttle with a random one."
/datum/round_event_control/shuttle_catastrophe/canSpawnEvent(players, gamemode)
if(SSshuttle.emergency.name == "Build your own shuttle kit")
diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm
index 38d52797d7..49a0f94000 100644
--- a/code/modules/events/shuttle_loan.dm
+++ b/code/modules/events/shuttle_loan.dm
@@ -13,10 +13,12 @@
typepath = /datum/round_event/shuttle_loan
max_occurrences = 1
earliest_start = 7 MINUTES
+ category = EVENT_CATEGORY_BUREAUCRATIC
+ description = "If cargo accepts the offer, fills the shuttle with loot and/or enemies."
/datum/round_event/shuttle_loan
- announceWhen = 1
- endWhen = 500
+ announce_when = 1
+ end_when = 500
var/dispatched = 0
var/dispatch_type = 0
var/bonus_points = 10000
@@ -72,7 +74,7 @@
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
if(D)
D.adjust_money(bonus_points)
- endWhen = activeFor + 1
+ end_when = activeFor + 1
SSshuttle.supply.mode = SHUTTLE_CALL
SSshuttle.supply.destination = SSshuttle.getDock("supply_home")
@@ -101,9 +103,9 @@
/datum/round_event/shuttle_loan/tick()
if(dispatched)
if(SSshuttle.supply.mode != SHUTTLE_IDLE)
- endWhen = activeFor
+ end_when = activeFor
else
- endWhen = activeFor + 1
+ end_when = activeFor + 1
/datum/round_event/shuttle_loan/end()
if(SSshuttle.shuttle_loan && SSshuttle.shuttle_loan.dispatched)
diff --git a/code/modules/events/space_dragon.dm b/code/modules/events/space_dragon.dm
index e06666b6bb..d06327ec0f 100644
--- a/code/modules/events/space_dragon.dm
+++ b/code/modules/events/space_dragon.dm
@@ -6,11 +6,13 @@
earliest_start = 30 MINUTES
min_players = 20
dynamic_should_hijack = TRUE
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Spawns a space dragon, which will try to take over the station."
/datum/round_event/ghost_role/space_dragon
minimum_required = 1
role_name = "Space Dragon"
- announceWhen = 10
+ announce_when = 10
/datum/round_event/ghost_role/space_dragon/announce(fake)
priority_announce("A large organic energy flux has been recorded near of [station_name()], please stand-by.", "Lifesign Alert", has_important_message = TRUE)
diff --git a/code/modules/events/space_ninja.dm b/code/modules/events/space_ninja.dm
index 4a9dc4d2eb..aaf3f1a302 100644
--- a/code/modules/events/space_ninja.dm
+++ b/code/modules/events/space_ninja.dm
@@ -6,6 +6,8 @@
earliest_start = 30 MINUTES
min_players = 15
dynamic_should_hijack = TRUE
+ category = EVENT_CATEGORY_INVASION
+ description = "A space ninja infiltrates the station."
/datum/round_event/ghost_role/space_ninja
minimum_required = 1
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index a96e74f1e4..1bbcb0dd92 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -4,6 +4,8 @@
weight = 15
max_occurrences = 3
min_players = 20
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Kudzu begins to overtake the station. Might spawn man-traps."
/datum/round_event/spacevine
fakeable = FALSE
diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm
index 23ce6ce730..6e8c29d3a9 100644
--- a/code/modules/events/spider_infestation.dm
+++ b/code/modules/events/spider_infestation.dm
@@ -4,15 +4,17 @@
weight = 5
max_occurrences = 1
min_players = 15
+ category = EVENT_CATEGORY_ENTITIES
+ description = "Spawns spider eggs, ready to hatch."
/datum/round_event/spider_infestation
- announceWhen = 400
+ announce_when = 400
var/spawncount = 1
/datum/round_event/spider_infestation/setup()
- announceWhen = rand(announceWhen, announceWhen + 50)
+ announce_when = rand(announce_when, announce_when + 50)
spawncount = rand(5, 8)
/datum/round_event/spider_infestation/announce(fake)
diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm
index 7705ece78a..31b14bb8b9 100644
--- a/code/modules/events/spontaneous_appendicitis.dm
+++ b/code/modules/events/spontaneous_appendicitis.dm
@@ -5,6 +5,8 @@
max_occurrences = 4
earliest_start = 10 MINUTES
min_players = 5 // To make your chance of getting help a bit higher.
+ category = EVENT_CATEGORY_HEALTH
+ description = "A random crewmember gets appendicitis."
/datum/round_event/spontaneous_appendicitis
fakeable = FALSE
diff --git a/code/modules/events/stray_cargo.dm b/code/modules/events/stray_cargo.dm
index 2464432d72..f7240f9e8b 100644
--- a/code/modules/events/stray_cargo.dm
+++ b/code/modules/events/stray_cargo.dm
@@ -5,6 +5,8 @@
weight = 5
max_occurrences = 4
earliest_start = 10 MINUTES
+ category = EVENT_CATEGORY_BUREAUCRATIC
+ description = "A pod containing a random supply crate lands on the station."
///Spawns a cargo pod containing a random cargo supply pack on a random area of the station
/datum/round_event/stray_cargo
@@ -20,7 +22,7 @@
* Also randomizes the start timer
*/
/datum/round_event/stray_cargo/setup()
- startWhen = rand(20, 40)
+ start_when = rand(20, 40)
impact_area = find_event_area()
if(!impact_area)
CRASH("No valid areas for cargo pod found.")
@@ -89,6 +91,7 @@
weight = 0
max_occurrences = 0
earliest_start = 30 MINUTES
+ description = "A pod containing syndicate gear lands on the station."
/datum/round_event/stray_cargo/syndicate
possible_pack_types = list(/datum/supply_pack/misc/syndicate)
diff --git a/code/modules/events/supermatter_surge.dm b/code/modules/events/supermatter_surge.dm
index d873e6ca8f..08deaae7d5 100644
--- a/code/modules/events/supermatter_surge.dm
+++ b/code/modules/events/supermatter_surge.dm
@@ -4,6 +4,8 @@
weight = 20
max_occurrences = 5
earliest_start = 10 MINUTES
+ category = EVENT_CATEGORY_ENGINEERING
+ description = "Randomly modifies the supermatter's power, giving the engineers a lot of headaches."
/datum/round_event_control/supermatter_surge/canSpawnEvent()
if(GLOB.main_supermatter_engine?.has_been_powered)
diff --git a/code/modules/events/supernova.dm b/code/modules/events/supernova.dm
index 7862e85709..16c81e4056 100644
--- a/code/modules/events/supernova.dm
+++ b/code/modules/events/supernova.dm
@@ -4,18 +4,20 @@
weight = 5
max_occurrences = 1
min_players = 2
+ category = EVENT_CATEGORY_SPACE
+ description = "Several modified radstorms hit the station."
/datum/round_event/supernova
- announceWhen = 40
- startWhen = 1
- endWhen = 300
+ announce_when = 40
+ start_when = 1
+ end_when = 300
var/power = 1
var/datum/sun/supernova
var/storm_count = 0
var/announced = FALSE
/datum/round_event/supernova/setup()
- announceWhen = rand(4, 60)
+ announce_when = rand(4, 60)
supernova = new
SSsun.suns += supernova
switch(rand(1,5))
@@ -53,10 +55,10 @@
sucker_light.give_home_power()
/datum/round_event/supernova/tick()
- var/midpoint = round((endWhen-startWhen)/2)
+ var/midpoint = round((end_when-start_when)/2)
if(activeFor < midpoint)
supernova.power_mod = min(supernova.power_mod*1.2, power)
- if(activeFor > endWhen-10)
+ if(activeFor > end_when-10)
supernova.power_mod /= 4
if(prob(round(supernova.power_mod)) && prob(5-storm_count) && !SSweather.get_weather_by_type(/datum/weather/rad_storm))
SSweather.run_weather(/datum/weather/rad_storm/supernova)
diff --git a/code/modules/events/travelling_trader.dm b/code/modules/events/travelling_trader.dm
index be697c9b6d..ac9d103f5f 100644
--- a/code/modules/events/travelling_trader.dm
+++ b/code/modules/events/travelling_trader.dm
@@ -4,10 +4,12 @@
weight = 8
max_occurrences = 2
earliest_start = 0 MINUTES
+ category = EVENT_CATEGORY_FRIENDLY
+ description = "A mysterious figure requests something to the crew and rewards them with something for getting it done."
/datum/round_event/travelling_trader
- startWhen = 0
- endWhen = 900 //you effectively have 15 minutes to complete the traders request, before they disappear
+ start_when = 0
+ end_when = 900 //you effectively have 15 minutes to complete the traders request, before they disappear
var/mob/living/carbon/human/dummy/travelling_trader/trader
var/atom/spawn_location //where the trader appears
diff --git a/code/modules/events/untie_shoes.dm b/code/modules/events/untie_shoes.dm
index 5a0da3ebc2..17dd2ca8b2 100644
--- a/code/modules/events/untie_shoes.dm
+++ b/code/modules/events/untie_shoes.dm
@@ -4,6 +4,8 @@
weight = 50
max_occurrences = 10
alert_observers = FALSE
+ category = EVENT_CATEGORY_HEALTH
+ description = "Unties people's shoes, with a chance to knot them as well."
/datum/round_event/untied_shoes
fakeable = FALSE
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index 2c03531bcc..fb88f81598 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -3,11 +3,13 @@
typepath = /datum/round_event/vent_clog
weight = 10
max_occurrences = 3
+ category = EVENT_CATEGORY_HEALTH
+ description = "All the scrubbers onstation spit random chemicals in smoke form."
/datum/round_event/vent_clog
- announceWhen = 1
- startWhen = 5
- endWhen = 35
+ announce_when = 1
+ start_when = 5
+ end_when = 35
var/interval = 2
var/list/vents = list()
var/randomProbability = 0
@@ -62,7 +64,7 @@
priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert", has_important_message = TRUE)
/datum/round_event/vent_clog/setup()
- endWhen = rand(120, 180)
+ end_when = rand(120, 180)
for(var/obj/machinery/atmospherics/components/unary/vent_scrubber/temp_vent in GLOB.machines)
var/turf/T = get_turf(temp_vent)
var/area/A = T.loc
@@ -108,6 +110,7 @@
min_players = 15
max_occurrences = 1
earliest_start = 35 MINUTES
+ description = "Extra dangerous chemicals come out of the scrubbers."
/datum/round_event/vent_clog/threatening
randomProbability = 10
@@ -120,6 +123,7 @@
min_players = 25
max_occurrences = 1
earliest_start = 45 MINUTES
+ description = "EXTREMELY dangerous chemicals come out of the scrubbers."
/datum/round_event/vent_clog/catastrophic
randomProbability = 30
@@ -129,6 +133,7 @@
name = "Clogged Vents: Beer"
typepath = /datum/round_event/vent_clog/beer
max_occurrences = 0
+ description = "Spits out beer through the scrubber system."
/datum/round_event/vent_clog/beer
reagentsAmount = 100
@@ -137,6 +142,7 @@
name = "Anti-Plasma Flood"
typepath = /datum/round_event/vent_clog/plasma_decon
max_occurrences = 0
+ description = "Freezing smoke comes out of the scrubbers."
/datum/round_event/vent_clog/beer/announce()
priority_announce("The scrubbers network is experiencing an unexpected surge of pressurized beer. Some ejection of contents may occur.", "Atmospherics alert")
diff --git a/code/modules/events/wisdomcow.dm b/code/modules/events/wisdomcow.dm
index 553dd8f309..3c03911d1d 100644
--- a/code/modules/events/wisdomcow.dm
+++ b/code/modules/events/wisdomcow.dm
@@ -3,6 +3,8 @@
typepath = /datum/round_event/wisdomcow
max_occurrences = 1
weight = 10
+ category = EVENT_CATEGORY_FRIENDLY
+ description = "A cow appears to tell you wise words."
/datum/round_event/wisdomcow/announce(fake)
priority_announce("A wise cow has been spotted in the area. Be sure to ask for her advice.", "Nanotrasen Cow Ranching Agency")
diff --git a/code/modules/events/wizard/aid.dm b/code/modules/events/wizard/aid.dm
index 5f49b48900..2380027284 100644
--- a/code/modules/events/wizard/aid.dm
+++ b/code/modules/events/wizard/aid.dm
@@ -6,6 +6,7 @@
typepath = /datum/round_event/wizard/robelesscasting
max_occurrences = 1
earliest_start = 0 MINUTES
+ description = "Wizard no longer needs robes to cast spells."
/datum/round_event/wizard/robelesscasting/start()
@@ -28,6 +29,7 @@
typepath = /datum/round_event/wizard/improvedcasting
max_occurrences = 4 //because that'd be max level spells
earliest_start = 0 MINUTES
+ description = "Levels up the wizard's spells."
/datum/round_event/wizard/improvedcasting/start()
for(var/i in GLOB.mob_living_list)
diff --git a/code/modules/events/wizard/blobies.dm b/code/modules/events/wizard/blobies.dm
index 7438b462f6..6933847f80 100644
--- a/code/modules/events/wizard/blobies.dm
+++ b/code/modules/events/wizard/blobies.dm
@@ -3,6 +3,7 @@
weight = 3
typepath = /datum/round_event/wizard/blobies
max_occurrences = 3
+ description = "Spawns a blob spore on every corpse."
/datum/round_event/wizard/blobies/start()
diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm
index 061de0ea7c..639673ac15 100644
--- a/code/modules/events/wizard/curseditems.dm
+++ b/code/modules/events/wizard/curseditems.dm
@@ -5,6 +5,7 @@
max_occurrences = 3
earliest_start = 0 MINUTES
can_be_midround_wizard = FALSE
+ description = "Gives everyone a cursed item."
//Note about adding items to this: Because of how NODROP_1 works if an item spawned to the hands can also be equiped to a slot
//it will be able to be put into that slot from the hand, but then get stuck there. To avoid this make a new subtype of any
diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm
index ce6b4802fa..f08a40751d 100644
--- a/code/modules/events/wizard/departmentrevolt.dm
+++ b/code/modules/events/wizard/departmentrevolt.dm
@@ -5,6 +5,7 @@
max_occurrences = 1
earliest_start = 0 MINUTES
can_be_midround_wizard = FALSE // not removing it completely yet
+ description = "A department is turned into an independent state."
/datum/round_event/wizard/deprevolt/start()
diff --git a/code/modules/events/wizard/embeddies.dm b/code/modules/events/wizard/embeddies.dm
index fe08b9c743..32c9affb6d 100644
--- a/code/modules/events/wizard/embeddies.dm
+++ b/code/modules/events/wizard/embeddies.dm
@@ -4,6 +4,7 @@
typepath = /datum/round_event/wizard/embedpocalypse
max_occurrences = 1
earliest_start = 0 MINUTES
+ description = "Everything becomes pointy enough to embed in people when thrown."
/datum/round_event/wizard/embedpocalypse/start()
for(var/obj/item/I in world)
@@ -26,6 +27,7 @@
typepath = /datum/round_event/wizard/embedpocalypse/sticky
max_occurrences = 1
earliest_start = 0 MINUTES
+ description = "Everything becomes sticky enough to be glued to people when thrown."
/datum/round_event_control/wizard/embedpocalypse/sticky/canSpawnEvent(players_amt, gamemode)
if(GLOB.embedpocalypse)
diff --git a/code/modules/events/wizard/fakeexplosion.dm b/code/modules/events/wizard/fakeexplosion.dm
index 3ba20f4768..7a89fc14bd 100644
--- a/code/modules/events/wizard/fakeexplosion.dm
+++ b/code/modules/events/wizard/fakeexplosion.dm
@@ -4,6 +4,7 @@
typepath = /datum/round_event/wizard/fake_explosion
max_occurrences = 1
earliest_start = 0 MINUTES
+ description = "The nuclear explosion cutscene begins to play to scare the crew."
/datum/round_event/wizard/fake_explosion/start()
sound_to_playing_players('sound/machines/alarm.ogg')
diff --git a/code/modules/events/wizard/ghost.dm b/code/modules/events/wizard/ghost.dm
index c288953efb..5a11616b8f 100644
--- a/code/modules/events/wizard/ghost.dm
+++ b/code/modules/events/wizard/ghost.dm
@@ -4,6 +4,7 @@
typepath = /datum/round_event/wizard/ghost
max_occurrences = 1
earliest_start = 0 MINUTES
+ description = "Ghosts become visible."
/datum/round_event/wizard/ghost/start()
var/msg = "You suddenly feel extremely obvious..."
@@ -18,6 +19,7 @@
typepath = /datum/round_event/wizard/possession
max_occurrences = 5
earliest_start = 0 MINUTES
+ description = "Ghosts become visible and gain the power of possession."
/datum/round_event/wizard/possession/start()
for(var/mob/dead/observer/G in GLOB.player_list)
diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm
index 82e72df3b9..1864ad6d20 100644
--- a/code/modules/events/wizard/greentext.dm
+++ b/code/modules/events/wizard/greentext.dm
@@ -4,6 +4,7 @@
typepath = /datum/round_event/wizard/greentext
max_occurrences = 1
earliest_start = 0 MINUTES
+ description = "The Green Text appears on the station, tempting people to try and pick it up."
/datum/round_event/wizard/greentext/start()
diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm
index 29704168e9..2b7e9bcf17 100644
--- a/code/modules/events/wizard/imposter.dm
+++ b/code/modules/events/wizard/imposter.dm
@@ -4,6 +4,7 @@
typepath = /datum/round_event/wizard/imposter
max_occurrences = 1
earliest_start = 0 MINUTES
+ description = "Spawns a doppelganger of the wizard."
/datum/round_event/wizard/imposter/start()
for(var/datum/mind/M in SSticker.mode.wizards)
diff --git a/code/modules/events/wizard/invincible.dm b/code/modules/events/wizard/invincible.dm
index b69d1541ee..0dea1fbaf7 100644
--- a/code/modules/events/wizard/invincible.dm
+++ b/code/modules/events/wizard/invincible.dm
@@ -4,6 +4,7 @@
typepath = /datum/round_event/wizard/invincible
max_occurrences = 5
earliest_start = 0 MINUTES
+ description = "Everyone is invincible for a short time ticks."
/datum/round_event/wizard/invincible/start()
diff --git a/code/modules/events/wizard/lava.dm b/code/modules/events/wizard/lava.dm
index 9a882b45df..75962c81ad 100644
--- a/code/modules/events/wizard/lava.dm
+++ b/code/modules/events/wizard/lava.dm
@@ -4,9 +4,10 @@
typepath = /datum/round_event/wizard/lava
max_occurrences = 3
earliest_start = 0 MINUTES
+ description = "Turns the floor into hot lava."
/datum/round_event/wizard/lava
- endWhen = 0
+ end_when = 0
var/started = FALSE
/datum/round_event/wizard/lava/start()
diff --git a/code/modules/events/wizard/madness.dm b/code/modules/events/wizard/madness.dm
index ac86236623..de2c30a032 100644
--- a/code/modules/events/wizard/madness.dm
+++ b/code/modules/events/wizard/madness.dm
@@ -3,6 +3,7 @@
weight = 1
typepath = /datum/round_event/wizard/madness
earliest_start = 0 MINUTES
+ description = "Reveals a horrifying truth to everyone, giving them a trauma."
var/forced_secret
diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm
index 052143722e..b900a2da9f 100644
--- a/code/modules/events/wizard/magicarp.dm
+++ b/code/modules/events/wizard/magicarp.dm
@@ -4,13 +4,14 @@
typepath = /datum/round_event/wizard/magicarp
max_occurrences = 1
earliest_start = 0 MINUTES
+ description = "Summons a school of carps with magic projectiles."
/datum/round_event/wizard/magicarp
- announceWhen = 3
- startWhen = 50
+ announce_when = 3
+ start_when = 50
/datum/round_event/wizard/magicarp/setup()
- startWhen = rand(40, 60)
+ start_when = rand(40, 60)
/datum/round_event/wizard/magicarp/announce(fake)
priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
diff --git a/code/modules/events/wizard/petsplosion.dm b/code/modules/events/wizard/petsplosion.dm
index fb4d433905..ff3ebdd128 100644
--- a/code/modules/events/wizard/petsplosion.dm
+++ b/code/modules/events/wizard/petsplosion.dm
@@ -5,6 +5,7 @@
max_occurrences = 1 //Exponential growth is nothing to sneeze at!
earliest_start = 0 MINUTES
var/mobs_to_dupe = 0
+ description = "Rapidly multiplies the animals on the station."
/datum/round_event_control/wizard/petsplosion/preRunEvent()
for(var/mob/living/simple_animal/F in GLOB.alive_mob_list)
@@ -16,7 +17,7 @@
..()
/datum/round_event/wizard/petsplosion
- endWhen = 61 //1 minute (+1 tick for endWhen not to interfere with tick)
+ end_when = 61 //1 minute (+1 tick for end_when not to interfere with tick)
var/countdown = 0
var/mobs_duped = 0
diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm
index 5c3b8432c1..8c45a9504b 100644
--- a/code/modules/events/wizard/race.dm
+++ b/code/modules/events/wizard/race.dm
@@ -5,6 +5,7 @@
max_occurrences = 5
earliest_start = 0 MINUTES
can_be_midround_wizard = FALSE
+ description = "Gives everyone a random race."
/datum/round_event/wizard/race
var/list/stored_name
@@ -16,7 +17,7 @@
stored_name = list()
stored_species = list()
stored_dna = list()
- endWhen = rand(600,1200) //10 to 20 minutes
+ end_when = rand(600,1200) //10 to 20 minutes
..()
/datum/round_event/wizard/race/start()
diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm
index bf3104450e..911a9bf665 100644
--- a/code/modules/events/wizard/rpgloot.dm
+++ b/code/modules/events/wizard/rpgloot.dm
@@ -4,6 +4,7 @@
typepath = /datum/round_event/wizard/rpgloot
max_occurrences = 1
earliest_start = 0 MINUTES
+ description = "Every item in the world will have fantastical names."
/datum/round_event/wizard/rpgloot/start()
var/upgrade_scroll_chance = 0
diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm
index 18b8c8e21c..5659818b48 100644
--- a/code/modules/events/wizard/shuffle.dm
+++ b/code/modules/events/wizard/shuffle.dm
@@ -8,6 +8,7 @@
max_occurrences = 5
earliest_start = 0 MINUTES
can_be_midround_wizard = FALSE // not removing it completely yet
+ description = "Shuffles everyone around on the station."
/datum/round_event/wizard/shuffleloc/start()
var/list/moblocs = list()
@@ -45,6 +46,7 @@
max_occurrences = 5
earliest_start = 0 MINUTES
can_be_midround_wizard = FALSE // not removing it completely yet
+ description = "Shuffles the names of everyone around the station."
/datum/round_event/wizard/shufflenames/start()
var/list/mobnames = list()
@@ -80,6 +82,7 @@
max_occurrences = 3
earliest_start = 0 MINUTES
can_be_midround_wizard = FALSE // not removing it completely yet
+ description = "Shuffles the minds of everyone around the station, except for the wizard."
/datum/round_event/wizard/shuffleminds/start()
var/list/mobs = list()
diff --git a/code/modules/events/wizard/summons.dm b/code/modules/events/wizard/summons.dm
index ac1160e0f5..886dfdfd10 100644
--- a/code/modules/events/wizard/summons.dm
+++ b/code/modules/events/wizard/summons.dm
@@ -5,6 +5,7 @@
max_occurrences = 1
earliest_start = 0 MINUTES
can_be_midround_wizard = FALSE // not removing it completely yet
+ description = "Summons a gun for everyone. Might turn people into survivalists."
/datum/round_event_control/wizard/summonguns/New()
if(CONFIG_GET(flag/no_summon_guns))
@@ -21,6 +22,7 @@
max_occurrences = 1
earliest_start = 0 MINUTES
can_be_midround_wizard = FALSE // not removing it completely yet
+ description = "Summons a magic item for everyone. Might turn people into survivalists."
/datum/round_event_control/wizard/summonmagic/New()
if(CONFIG_GET(flag/no_summon_magic))
diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm
index 3207e3b635..413658e34d 100644
--- a/code/modules/events/wormholes.dm
+++ b/code/modules/events/wormholes.dm
@@ -4,11 +4,12 @@
max_occurrences = 3
weight = 2
min_players = 2
-
+ category = EVENT_CATEGORY_SPACE
+ description = "Space time anomalies appear on the station, randomly teleporting people who walk into them."
/datum/round_event/wormholes
- announceWhen = 10
- endWhen = 60
+ announce_when = 10
+ end_when = 60
var/list/pick_turfs = list()
var/list/wormholes = list()
@@ -16,8 +17,8 @@
var/number_of_wormholes = 400
/datum/round_event/wormholes/setup()
- announceWhen = rand(0, 20)
- endWhen = rand(40, 80)
+ announce_when = rand(0, 20)
+ end_when = rand(40, 80)
/datum/round_event/wormholes/start()
for(var/turf/open/floor/T in world)
diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm
index 10b825440a..9c538f4bde 100644
--- a/code/modules/holiday/easter.dm
+++ b/code/modules/holiday/easter.dm
@@ -5,6 +5,8 @@
weight = -1
max_occurrences = 1
earliest_start = 0 MINUTES
+ category = EVENT_CATEGORY_HOLIDAY
+ description = "Hides surprise filled easter eggs in maintenance."
/datum/round_event/easter/announce(fake)
priority_announce(pick("Hip-hop into Easter!","Find some Bunny's stash!","Today is National 'Hunt a Wabbit' Day.","Be kind, give Chocolate Eggs!"))
@@ -16,6 +18,8 @@
typepath = /datum/round_event/rabbitrelease
weight = 5
max_occurrences = 10
+ category = EVENT_CATEGORY_HOLIDAY
+ description = "Summons a wave of cute rabbits."
/datum/round_event/rabbitrelease/announce(fake)
priority_announce("Unidentified furry objects detected coming aboard [station_name()]. Beware of Adorable-ness.", "Fluffy Alert", "aliens")
diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm
index 5dd8ad9155..8ef60d8b54 100644
--- a/code/modules/holiday/halloween/jacqueen.dm
+++ b/code/modules/holiday/halloween/jacqueen.dm
@@ -15,6 +15,8 @@
weight = -1 //forces it to be called, regardless of weight
max_occurrences = 1
earliest_start = 0 MINUTES
+ category = EVENT_CATEGORY_HOLIDAY
+ description = "Spawns Jacq, a friendly mob that gives players a couple fun stuff to do."
/datum/round_event/jacqueen/start()
..()
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index 7839d1ecb9..c998580cae 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -38,7 +38,7 @@
display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia, /datum/quirk/insanity)
threat = 3
-
+
family_heirlooms = list(
/obj/item/book/manual/wiki/security_space_law
)
@@ -51,7 +51,7 @@
belt = /obj/item/pda/heads/hos
ears = /obj/item/radio/headset/heads/hos/alt
uniform = /obj/item/clothing/under/rank/security/head_of_security
- shoes = /obj/item/clothing/shoes/jackboots
+ shoes = /obj/item/clothing/shoes/jackboots/sec
suit = /obj/item/clothing/suit/armor/hos/trenchcoat
gloves = /obj/item/clothing/gloves/color/black
head = /obj/item/clothing/head/HoS/beret
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index 8dedc6c6dc..f4a234d9b2 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -28,7 +28,7 @@
display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia)
threat = 2
-
+
family_heirlooms = list(
/obj/item/book/manual/wiki/security_space_law,
/obj/item/clothing/head/beret/sec
@@ -131,7 +131,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S
gloves = /obj/item/clothing/gloves/color/black
head = /obj/item/clothing/head/helmet/sec
suit = /obj/item/clothing/suit/armor/vest/alt
- shoes = /obj/item/clothing/shoes/jackboots
+ shoes = /obj/item/clothing/shoes/jackboots/sec
l_pocket = /obj/item/restraints/handcuffs
r_pocket = /obj/item/assembly/flash/handheld
backpack_contents = list(/obj/item/melee/baton/loaded=1)
diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm
index 714c599024..ec4e81caea 100644
--- a/code/modules/jobs/job_types/warden.dm
+++ b/code/modules/jobs/job_types/warden.dm
@@ -29,7 +29,7 @@
display_order = JOB_DISPLAY_ORDER_WARDEN
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia)
threat = 2
-
+
family_heirlooms = list(
/obj/item/book/manual/wiki/security_space_law
)
@@ -46,7 +46,7 @@
belt = /obj/item/pda/warden
ears = /obj/item/radio/headset/headset_sec/alt
uniform = /obj/item/clothing/under/rank/security/warden
- shoes = /obj/item/clothing/shoes/jackboots
+ shoes = /obj/item/clothing/shoes/jackboots/sec
suit = /obj/item/clothing/suit/armor/vest/warden/alt
gloves = /obj/item/clothing/gloves/color/black
head = /obj/item/clothing/head/warden
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 2ef3aa36a6..113853d315 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -153,10 +153,6 @@
if(MOOD_LEVEL_HAPPY4 to INFINITY)
. += "[t_He] look[p_s()] ecstatic."
- if(HAS_TRAIT(src, TRAIT_IN_HEAT) && (HAS_TRAIT(user, TRAIT_HEAT_DETECT) || src == user))
- . += ""
- . += "[t_He] [t_is] currently in [gender == MALE ? "rut" : "heat"]."
-
if(LAZYLEN(.) > 1)
.[1] += "