Merge remote-tracking branch 'citadel/master' into eldritch_affairs

This commit is contained in:
kevinz000
2020-03-27 21:32:40 -07:00
917 changed files with 182662 additions and 22716 deletions
@@ -14,7 +14,7 @@
/area/lavaland/surface/outdoors)
"e" = (
/obj/item/clothing/shoes/workboots/mining,
/obj/item/clothing/under/rank/miner/lavaland,
/obj/item/clothing/under/rank/cargo/miner/lavaland,
/obj/effect/decal/remains/human,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
@@ -188,10 +188,10 @@
/area/ruin/powered/seedvault)
"G" = (
/obj/structure/closet/crate/hydroponics,
/obj/item/clothing/under/rank/hydroponics,
/obj/item/clothing/under/rank/hydroponics,
/obj/item/clothing/under/rank/hydroponics,
/obj/item/clothing/under/rank/hydroponics,
/obj/item/clothing/under/rank/civilian/hydroponics,
/obj/item/clothing/under/rank/civilian/hydroponics,
/obj/item/clothing/under/rank/civilian/hydroponics,
/obj/item/clothing/under/rank/civilian/hydroponics,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
"H" = (
+1 -1
View File
@@ -324,7 +324,7 @@
dir = 1
},
/obj/structure/rack,
/obj/item/clothing/under/soviet,
/obj/item/clothing/under/costume/soviet,
/obj/item/clothing/head/ushanka,
/turf/open/floor/plasteel/cafeteria,
/area/ruin/space/djstation)
+1 -1
View File
@@ -219,7 +219,7 @@
/obj/structure/closet{
name = "Official Clothing"
},
/obj/item/clothing/under/rank/centcom_commander,
/obj/item/clothing/under/rank/centcom/commander,
/obj/item/clothing/head/centhat,
/obj/item/clothing/gloves/combat,
/obj/item/clothing/suit/armor/vest,
+2 -2
View File
@@ -2098,7 +2098,7 @@
/area/awaymission/BMPship/Aft)
"gj" = (
/obj/structure/closet,
/obj/item/clothing/under/overalls,
/obj/item/clothing/under/misc/overalls,
/turf/open/floor/plasteel,
/area/awaymission/BMPship/Aft)
"gk" = (
@@ -2269,7 +2269,7 @@
/area/awaymission/BMPship/Aft)
"gP" = (
/obj/structure/closet,
/obj/item/clothing/under/lawyer/bluesuit,
/obj/item/clothing/under/rank/civilian/lawyer/bluesuit,
/obj/item/clothing/suit/apron,
/turf/open/floor/plasteel,
/area/awaymission/BMPship/Aft)
+2 -2
View File
@@ -64,7 +64,7 @@
/obj/structure/chair{
dir = 4
},
/obj/item/clothing/under/polychromic/shirt,
/obj/item/clothing/under/misc/poly_shirt,
/obj/item/clothing/neck/tie/black,
/obj/item/clothing/shoes/laceup,
/obj/item/storage/wallet/random,
@@ -89,7 +89,7 @@
/obj/structure/chair{
dir = 8
},
/obj/item/clothing/under/polychromic/skirt,
/obj/item/clothing/under/dress/skirt/polychromic,
/obj/item/clothing/shoes/laceup,
/obj/item/clothing/gloves/color/white,
/obj/item/clothing/glasses/regular,
+1 -1
View File
@@ -573,7 +573,7 @@
"bU" = (
/obj/effect/decal/cleanable/blood,
/obj/structure/chair,
/obj/item/clothing/under/rank/centcom_officer,
/obj/item/clothing/under/rank/centcom/officer,
/obj/item/restraints/handcuffs,
/obj/effect/decal/remains/human,
/turf/open/floor/plating/airless,
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -2754,12 +2754,12 @@
"hT" = (
/obj/structure/closet,
/obj/item/storage/belt/soulstone,
/obj/item/clothing/under/schoolgirl,
/obj/item/clothing/under/costume/schoolgirl,
/turf/open/floor/plasteel,
/area/awaymission/academy/academyaft)
"hU" = (
/obj/structure/closet,
/obj/item/clothing/under/skirt/black,
/obj/item/clothing/under/dress/skirt,
/obj/item/clothing/glasses/regular,
/turf/open/floor/plasteel,
/area/awaymission/academy/academyaft)
@@ -2772,7 +2772,7 @@
"hW" = (
/obj/structure/closet,
/obj/item/lipstick/random,
/obj/item/clothing/under/schoolgirl,
/obj/item/clothing/under/costume/schoolgirl,
/turf/open/floor/plasteel,
/area/awaymission/academy/academyaft)
"hX" = (
+1 -1
View File
@@ -2524,7 +2524,7 @@
/area/awaymission/snowdin/post)
"fF" = (
/obj/structure/closet,
/obj/item/clothing/under/assistantformal,
/obj/item/clothing/under/misc/assistantformal,
/obj/item/clothing/suit/hooded/wintercoat,
/obj/item/clothing/shoes/winterboots,
/obj/effect/turf_decal/bot,
+1 -1
View File
@@ -2252,7 +2252,7 @@
/area/awaymission/centcomAway/hangar)
"mQ" = (
/obj/structure/safe/floor,
/obj/item/clothing/under/rank/centcom_officer,
/obj/item/clothing/under/rank/centcom/officer,
/obj/item/clothing/suit/det_suit,
/obj/item/gun/ballistic/revolver/mateba,
/turf/open/indestructible,
+1 -1
View File
@@ -580,7 +580,7 @@
/area/awaymission/caves/BMP_asteroid/level_four)
"bH" = (
/obj/effect/decal/remains/human,
/obj/item/clothing/under/patriotsuit,
/obj/item/clothing/under/misc/patriotsuit,
/turf/open/floor/plating/asteroid/basalt/lava{
initial_gas_mix = "n2=23;o2=14"
},
+6 -6
View File
@@ -174,7 +174,7 @@
/obj/structure/bed/nest,
/obj/effect/decal/cleanable/blood/gibs,
/obj/item/clothing/mask/facehugger/impregnated,
/obj/item/clothing/under/rank/security,
/obj/item/clothing/under/rank/security/officer,
/obj/item/clothing/suit/armor/vest,
/obj/item/melee/baton/loaded,
/obj/item/clothing/head/helmet,
@@ -5718,7 +5718,7 @@
name = "personal closet";
req_access_txt = "201"
},
/obj/item/clothing/under/suit_jacket/navy,
/obj/item/clothing/under/suit/navy,
/turf/open/floor/carpet{
heat_capacity = 1e+006
},
@@ -6008,7 +6008,7 @@
name = "Kitchen Crate"
},
/obj/item/storage/box/mousetraps,
/obj/item/clothing/under/waiter,
/obj/item/clothing/under/suit/waiter,
/turf/open/floor/plasteel/showroomfloor{
heat_capacity = 1e+006;
temperature = 273.15
@@ -6655,7 +6655,7 @@
name = "personal closet";
req_access_txt = "201"
},
/obj/item/clothing/under/assistantformal,
/obj/item/clothing/under/misc/assistantformal,
/turf/open/floor/carpet{
heat_capacity = 1e+006
},
@@ -6823,7 +6823,7 @@
/obj/structure/table,
/obj/structure/bedsheetbin,
/obj/item/clothing/neck/tie/black,
/obj/item/clothing/under/lawyer/blacksuit,
/obj/item/clothing/under/suit/black,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
@@ -7068,7 +7068,7 @@
name = "personal closet";
req_access_txt = "201"
},
/obj/item/clothing/under/suit_jacket/burgundy,
/obj/item/clothing/under/suit/burgundy,
/turf/open/floor/carpet{
heat_capacity = 1e+006
},
+4 -4
View File
@@ -3214,7 +3214,7 @@
id_job = "Geneticist";
oxy_damage = 55;
suit = /obj/item/clothing/suit/toggle/labcoat/genetics;
uniform = /obj/item/clothing/under/rank/geneticist;
uniform = /obj/item/clothing/under/rank/medical/geneticist;
name = "Geneticist"
},
/obj/effect/decal/cleanable/blood,
@@ -4322,7 +4322,7 @@
id_job = "Geneticist";
oxy_damage = 55;
suit = /obj/item/clothing/suit/toggle/labcoat/genetics;
uniform = /obj/item/clothing/under/rank/geneticist;
uniform = /obj/item/clothing/under/rank/medical/geneticist;
name = "Geneticist"
},
/obj/effect/decal/cleanable/blood,
@@ -5173,7 +5173,7 @@
id_job = "Geneticist";
oxy_damage = 55;
suit = /obj/item/clothing/suit/toggle/labcoat/genetics;
uniform = /obj/item/clothing/under/rank/geneticist;
uniform = /obj/item/clothing/under/rank/medical/geneticist;
name = "Geneticist"
},
/obj/effect/decal/cleanable/blood,
@@ -6047,7 +6047,7 @@
id_job = "Geneticist";
oxy_damage = 55;
suit = /obj/item/clothing/suit/toggle/labcoat/genetics;
uniform = /obj/item/clothing/under/rank/geneticist;
uniform = /obj/item/clothing/under/rank/medical/geneticist;
name = "Geneticist"
},
/turf/open/floor/mineral/titanium/blue,
+6 -6
View File
@@ -312,7 +312,7 @@
name = "personal closet";
req_access_txt = "201"
},
/obj/item/clothing/under/pj/blue,
/obj/item/clothing/under/misc/pj/blue,
/turf/open/floor/carpet{
heat_capacity = 1e+006
},
@@ -362,7 +362,7 @@
name = "personal closet";
req_access_txt = "201"
},
/obj/item/clothing/under/suit_jacket/female,
/obj/item/clothing/under/suit/black/skirt,
/turf/open/floor/carpet{
heat_capacity = 1e+006
},
@@ -2135,7 +2135,7 @@
},
/area/awaymission/undergroundoutpost45/caves)
"ev" = (
/obj/item/clothing/under/pj/red,
/obj/item/clothing/under/misc/pj/red,
/obj/structure/closet/secure_closet{
desc = "It's a secure locker for personnel. The first card swiped gains control.";
icon_state = "cabinet";
@@ -3130,7 +3130,7 @@
name = "Kitchen Crate"
},
/obj/item/storage/box/mousetraps,
/obj/item/clothing/under/waiter,
/obj/item/clothing/under/suit/waiter,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/showroomfloor{
heat_capacity = 1e+006
@@ -5263,7 +5263,7 @@
},
/area/awaymission/undergroundoutpost45/gateway)
"km" = (
/obj/item/clothing/under/suit_jacket/navy,
/obj/item/clothing/under/suit/navy,
/obj/structure/closet/secure_closet{
desc = "It's a secure locker for personnel. The first card swiped gains control.";
icon_state = "cabinet";
@@ -9706,7 +9706,7 @@
name = "personal closet";
req_access_txt = "201"
},
/obj/item/clothing/under/pj/red,
/obj/item/clothing/under/misc/pj/red,
/turf/open/floor/carpet{
heat_capacity = 1e+006
},
+1
View File
@@ -11,6 +11,7 @@
#include "map_files\OmegaStation\OmegaStation.dmm"
#include "map_files\PubbyStation\PubbyStation.dmm"
#include "map_files\BoxStation\BoxStation.dmm"
#include "map_files\LambdaStation\lambda.dmm"
#ifdef TRAVISBUILDING
#include "templates.dm"
+1
View File
@@ -0,0 +1 @@
#define FORCE_MAP "_maps/lambdastation.json"
+11
View File
@@ -0,0 +1,11 @@
{
"map_name": "Lambda Station",
"map_path": "map_files/LambdaStation",
"map_file": "lambda.dmm",
"shuttles": {
"cargo": "cargo_box",
"ferry": "ferry_fancy",
"whiteship": "whiteship_meta",
"emergency": "emergency_meta"
}
}
File diff suppressed because it is too large Load Diff
+44 -30
View File
@@ -4154,7 +4154,7 @@
},
/obj/item/wirerod,
/obj/item/wrench,
/obj/item/clothing/under/waiter,
/obj/item/clothing/under/suit/waiter,
/obj/item/clothing/accessory/waistcoat,
/obj/structure/sign/poster/contraband/random{
pixel_x = -32
@@ -39822,7 +39822,7 @@
/obj/structure/closet/secure_closet/hos,
/obj/item/clothing/head/HoS/beret,
/obj/item/clothing/suit/armor/hos/trenchcoat,
/obj/item/clothing/under/rank/head_of_security/grey,
/obj/item/clothing/under/rank/security/head_of_security/grey,
/obj/effect/turf_decal/stripes/line{
dir = 9
},
@@ -50312,7 +50312,7 @@
/obj/item/clothing/suit/det_suit{
icon_state = "curator"
},
/obj/item/clothing/under/rank/det{
/obj/item/clothing/under/rank/security/detective{
icon_state = "curator"
},
/obj/effect/turf_decal/tile/neutral{
@@ -62632,7 +62632,7 @@
/area/security/warden)
"cbF" = (
/obj/structure/closet/secure_closet/warden,
/obj/item/clothing/under/rank/warden/grey,
/obj/item/clothing/under/rank/security/warden/grey,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
@@ -74042,7 +74042,7 @@
/area/maintenance/starboard)
"cuG" = (
/obj/structure/table,
/obj/item/clothing/under/rank/security,
/obj/item/clothing/under/rank/security/officer,
/obj/item/restraints/handcuffs,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small,
@@ -78636,7 +78636,7 @@
pixel_x = 26;
pixel_y = 26
},
/obj/item/clothing/under/kilt,
/obj/item/clothing/under/costume/kilt,
/obj/item/clothing/head/beret,
/obj/machinery/airalarm{
pixel_y = 23
@@ -78674,7 +78674,7 @@
/obj/item/clothing/head/fedora{
icon_state = "detective"
},
/obj/item/clothing/under/geisha,
/obj/item/clothing/under/costume/geisha,
/obj/item/clothing/head/fedora{
icon_state = "curator"
},
@@ -78682,7 +78682,7 @@
desc = "This looks awfully familiar...";
icon_state = "curator"
},
/obj/item/clothing/under/rank/curator/treasure_hunter,
/obj/item/clothing/under/rank/civilian/curator/treasure_hunter,
/obj/machinery/airalarm{
pixel_y = 23
},
@@ -81143,7 +81143,7 @@
icon_state = "1-2"
},
/obj/item/folder/blue,
/obj/item/clothing/under/rank/centcom_commander{
/obj/item/clothing/under/rank/centcom/commander{
desc = "A replica of a jumpsuit worn by the highest ranking commanders under Nanotrasen's central command.";
name = "Replica CentCom officer's jumpsuit"
},
@@ -88556,7 +88556,7 @@
/area/crew_quarters/fitness/recreation)
"cTg" = (
/obj/structure/table,
/obj/item/clothing/under/sl_suit{
/obj/item/clothing/under/suit/sl{
name = "referee suit"
},
/obj/effect/turf_decal/tile/neutral{
@@ -89705,7 +89705,7 @@
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/item/clothing/suit/jacket/letterman_nanotrasen,
/obj/item/clothing/suit/toggle/lawyer,
/obj/item/clothing/under/maid,
/obj/item/clothing/under/costume/maid,
/obj/item/clothing/head/kitty,
/obj/machinery/airalarm{
dir = 1;
@@ -89733,7 +89733,7 @@
/obj/item/clothing/head/fedora{
icon_state = "detective"
},
/obj/item/clothing/under/lawyer/female,
/obj/item/clothing/under/rank/civilian/lawyer/female,
/obj/machinery/airalarm{
dir = 1;
pixel_y = -22
@@ -89757,7 +89757,7 @@
pixel_y = -32
},
/obj/item/clothing/head/fedora,
/obj/item/clothing/under/redeveninggown,
/obj/item/clothing/under/dress/redeveninggown,
/obj/item/clothing/head/rabbitears,
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/dorms)
@@ -90569,7 +90569,6 @@
pixel_y = 3
},
/obj/item/storage/box/syringes,
/obj/item/gun/syringe,
/obj/machinery/status_display/evac{
pixel_x = -32
},
@@ -90581,6 +90580,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/item/gun/syringe/dart,
/turf/open/floor/plasteel,
/area/medical/storage)
"cWv" = (
@@ -92803,7 +92803,7 @@
/area/crew_quarters/fitness/recreation)
"dae" = (
/obj/structure/table,
/obj/item/clothing/under/suit_jacket/really_black,
/obj/item/clothing/under/suit/black_really,
/obj/item/cane,
/obj/item/clothing/head/bowler{
pixel_y = 5
@@ -98184,7 +98184,7 @@
/obj/effect/decal/cleanable/dirt,
/obj/structure/table/wood,
/obj/item/clothing/suit/toggle/owlwings,
/obj/item/clothing/under/owl,
/obj/item/clothing/under/costume/owl,
/obj/item/clothing/mask/gas/owl_mask,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
@@ -99195,7 +99195,7 @@
/obj/structure/table/reinforced,
/obj/machinery/light/small,
/obj/structure/bedsheetbin,
/obj/item/gun/syringe,
/obj/item/gun/syringe/dart,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -106576,11 +106576,11 @@
/obj/item/clothing/mask/muzzle,
/obj/item/clothing/glasses/sunglasses/blindfold,
/obj/item/clothing/ears/earmuffs,
/obj/item/gun/syringe,
/obj/item/clothing/glasses/eyepatch,
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/item/gun/syringe/dart,
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"dyE" = (
@@ -110502,7 +110502,7 @@
/area/medical/medbay/central)
"dFk" = (
/obj/structure/table/wood,
/obj/item/clothing/under/maid,
/obj/item/clothing/under/costume/maid,
/obj/item/clothing/head/kitty,
/obj/effect/decal/cleanable/cobweb,
/obj/effect/decal/cleanable/dirt,
@@ -111362,7 +111362,7 @@
/area/maintenance/department/medical/morgue)
"dGw" = (
/obj/structure/closet/secure_closet/CMO,
/obj/item/clothing/under/rank/nursesuit,
/obj/item/clothing/under/rank/medical/doctor/nurse,
/obj/item/clothing/head/nursehat,
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -113664,7 +113664,7 @@
/area/crew_quarters/theatre/abandoned)
"dKr" = (
/obj/structure/table/wood,
/obj/item/clothing/under/geisha,
/obj/item/clothing/under/costume/geisha,
/obj/item/clothing/shoes/sandal,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -121170,7 +121170,7 @@
/area/library/abandoned)
"dYm" = (
/obj/structure/table/wood,
/obj/item/clothing/under/rank/curator,
/obj/item/clothing/under/rank/civilian/curator,
/obj/effect/spawner/lootdrop/maintenance{
lootcount = 2;
name = "2maintenance loot spawner"
@@ -125929,12 +125929,12 @@
dir = 8
},
/obj/structure/table,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"gbV" = (
@@ -126052,7 +126052,7 @@
/area/science/circuit)
"gVS" = (
/obj/item/clothing/head/kitty,
/obj/item/clothing/under/maid,
/obj/item/clothing/under/costume/maid,
/obj/item/clothing/mask/muzzle,
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
@@ -126360,6 +126360,20 @@
},
/turf/open/floor/plasteel/dark,
/area/science/mixing)
"jwo" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/mob/living/simple_animal/pet/bumbles,
/turf/open/floor/plasteel,
/area/hydroponics)
"jBE" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
@@ -160698,7 +160712,7 @@ bjt
bli
bnk
boB
bnj
jwo
bnj
bnh
bvB
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+46 -38
View File
@@ -4556,7 +4556,7 @@
/area/crew_quarters/fitness/recreation)
"aiR" = (
/obj/structure/table,
/obj/item/clothing/under/sl_suit{
/obj/item/clothing/under/suit/sl{
desc = "Whoever wears this makes the rules.";
name = "referee suit"
},
@@ -6918,8 +6918,8 @@
/area/maintenance/port)
"ana" = (
/obj/structure/rack,
/obj/item/clothing/under/rank/mailman,
/obj/item/clothing/under/rank/vice{
/obj/item/clothing/under/misc/mailman,
/obj/item/clothing/under/misc/vice_officer{
pixel_x = 4;
pixel_y = -3
},
@@ -7555,7 +7555,7 @@
c_tag = "Brig - Infirmary";
dir = 1
},
/obj/item/clothing/under/rank/medical/purple{
/obj/item/clothing/under/rank/medical/doctor/purple{
pixel_y = -4
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
@@ -8886,7 +8886,7 @@
/obj/structure/chair,
/obj/item/restraints/handcuffs,
/obj/effect/decal/remains/human,
/obj/item/clothing/under/soviet,
/obj/item/clothing/under/costume/soviet,
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/plating,
/area/maintenance/port/fore)
@@ -9965,7 +9965,7 @@
/obj/machinery/airalarm{
pixel_y = 23
},
/obj/item/clothing/under/assistantformal,
/obj/item/clothing/under/misc/assistantformal,
/turf/open/floor/wood,
/area/crew_quarters/dorms)
"asV" = (
@@ -10042,7 +10042,7 @@
/obj/machinery/airalarm{
pixel_y = 23
},
/obj/item/clothing/under/suit_jacket/burgundy,
/obj/item/clothing/under/suit/burgundy,
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"atc" = (
@@ -11693,7 +11693,7 @@
/obj/machinery/airalarm{
pixel_y = 23
},
/obj/item/clothing/under/suit_jacket/tan,
/obj/item/clothing/under/suit/tan,
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"awE" = (
@@ -13402,11 +13402,11 @@
/area/crew_quarters/dorms)
"aAe" = (
/obj/structure/table,
/obj/item/clothing/under/suit_jacket/female{
/obj/item/clothing/under/suit/black/skirt{
pixel_x = 3;
pixel_y = 1
},
/obj/item/clothing/under/suit_jacket/really_black{
/obj/item/clothing/under/suit/black_really{
pixel_x = -2
},
/obj/machinery/light/small{
@@ -13418,9 +13418,9 @@
},
/obj/item/clothing/accessory/waistcoat,
/obj/item/clothing/suit/toggle/lawyer/black,
/obj/item/clothing/under/suit_jacket/red,
/obj/item/clothing/under/suit/red,
/obj/item/clothing/neck/tie/black,
/obj/item/clothing/under/lawyer/blacksuit,
/obj/item/clothing/under/suit/black,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
@@ -14755,7 +14755,7 @@
/obj/machinery/airalarm{
pixel_y = 23
},
/obj/item/clothing/under/suit_jacket/navy,
/obj/item/clothing/under/suit/navy,
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"aCM" = (
@@ -16789,7 +16789,7 @@
/area/crew_quarters/dorms)
"aGP" = (
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/item/clothing/under/assistantformal,
/obj/item/clothing/under/misc/assistantformal,
/turf/open/floor/wood,
/area/crew_quarters/dorms)
"aGQ" = (
@@ -23603,7 +23603,7 @@
/area/maintenance/starboard/fore)
"aUX" = (
/obj/structure/closet/secure_closet/personal,
/obj/item/clothing/under/assistantformal,
/obj/item/clothing/under/misc/assistantformal,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/obj/item/clothing/suit/hooded/wintercoat,
/obj/item/clothing/shoes/winterboots,
@@ -26182,7 +26182,7 @@
/area/ai_monitored/turret_protected/ai)
"aZU" = (
/obj/structure/closet/secure_closet/personal,
/obj/item/clothing/under/assistantformal,
/obj/item/clothing/under/misc/assistantformal,
/obj/item/clothing/suit/hooded/wintercoat,
/obj/item/clothing/shoes/winterboots,
/obj/effect/turf_decal/tile/neutral{
@@ -26345,7 +26345,7 @@
/area/maintenance/port/fore)
"bah" = (
/obj/structure/closet/secure_closet/personal,
/obj/item/clothing/under/assistantformal,
/obj/item/clothing/under/misc/assistantformal,
/obj/structure/sign/map/right{
desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown).";
icon_state = "map-right-MS";
@@ -27278,7 +27278,7 @@
/obj/machinery/light/small{
dir = 1
},
/obj/item/clothing/under/assistantformal,
/obj/item/clothing/under/misc/assistantformal,
/obj/structure/sign/map/left{
desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown).";
icon_state = "map-left-MS";
@@ -29748,21 +29748,21 @@
name = "formal uniform crate";
req_access_txt = "3"
},
/obj/item/clothing/under/rank/security/navyblue,
/obj/item/clothing/under/rank/security/navyblue,
/obj/item/clothing/under/rank/security/navyblue,
/obj/item/clothing/under/rank/security/navyblue,
/obj/item/clothing/under/rank/security/navyblue,
/obj/item/clothing/under/rank/security/navyblue,
/obj/item/clothing/under/rank/security/officer/formal,
/obj/item/clothing/under/rank/security/officer/formal,
/obj/item/clothing/under/rank/security/officer/formal,
/obj/item/clothing/under/rank/security/officer/formal,
/obj/item/clothing/under/rank/security/officer/formal,
/obj/item/clothing/under/rank/security/officer/formal,
/obj/item/clothing/suit/armor/navyblue,
/obj/item/clothing/suit/armor/navyblue,
/obj/item/clothing/suit/armor/navyblue,
/obj/item/clothing/suit/armor/navyblue,
/obj/item/clothing/suit/armor/navyblue,
/obj/item/clothing/suit/armor/navyblue,
/obj/item/clothing/under/rank/warden/navyblue,
/obj/item/clothing/under/rank/security/warden/formal,
/obj/item/clothing/suit/armor/vest/warden/navyblue,
/obj/item/clothing/under/rank/head_of_security/navyblue,
/obj/item/clothing/under/rank/security/head_of_security/formal,
/obj/item/clothing/suit/armor/hos/navyblue,
/obj/item/clothing/head/beret/sec/navyofficer,
/obj/item/clothing/head/beret/sec/navyofficer,
@@ -46039,7 +46039,7 @@
},
/obj/structure/table/wood,
/obj/item/clothing/shoes/laceup,
/obj/item/clothing/under/suit_jacket/really_black,
/obj/item/clothing/under/suit/black_really,
/obj/item/clothing/glasses/sunglasses,
/obj/machinery/camera{
c_tag = "Corporate Showroom"
@@ -47330,7 +47330,7 @@
/obj/machinery/newscaster{
pixel_x = -30
},
/obj/item/clothing/under/suit_jacket/red,
/obj/item/clothing/under/suit/red,
/obj/effect/decal/cleanable/cobweb,
/obj/item/book/codex_gigas,
/turf/open/floor/engine/cult,
@@ -54133,7 +54133,6 @@
/obj/item/clothing/glasses/hud/health,
/obj/item/clothing/glasses/hud/health,
/obj/item/clothing/glasses/hud/health,
/obj/item/gun/syringe,
/obj/structure/window/reinforced{
dir = 1
},
@@ -54146,6 +54145,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/item/gun/syringe/dart,
/turf/open/floor/plasteel/white,
/area/medical/storage)
"cds" = (
@@ -59207,13 +59207,13 @@
},
/obj/item/clothing/suit/straight_jacket,
/obj/item/clothing/mask/muzzle,
/obj/item/gun/syringe,
/obj/item/clothing/glasses/eyepatch,
/obj/item/clothing/glasses/sunglasses/blindfold,
/obj/item/clothing/ears/earmuffs,
/obj/item/storage/belt/medical{
pixel_y = 2
},
/obj/item/gun/syringe/dart,
/turf/open/floor/plasteel/white/side,
/area/medical/surgery)
"cnu" = (
@@ -61843,7 +61843,7 @@
"csa" = (
/obj/structure/table,
/obj/item/restraints/handcuffs/cable/white,
/obj/item/gun/syringe,
/obj/item/gun/syringe/dart,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"csb" = (
@@ -72433,12 +72433,12 @@
pixel_x = -26
},
/obj/structure/table/wood,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
/turf/open/floor/plasteel/grimy,
/area/chapel/office)
"cLW" = (
@@ -82724,6 +82724,14 @@
/obj/structure/grille,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"soe" = (
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
dir = 4
},
/mob/living/simple_animal/pet/bumbles,
/turf/open/floor/plasteel,
/area/hydroponics)
"soh" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -117831,7 +117839,7 @@ bSV
bUk
bVv
bWQ
bWQ
soe
bWQ
caL
ccv
File diff suppressed because it is too large Load Diff
@@ -12660,7 +12660,7 @@
/area/maintenance/port/fore)
"avQ" = (
/obj/structure/table,
/obj/item/clothing/under/rank/security,
/obj/item/clothing/under/rank/security/officer,
/obj/item/restraints/handcuffs,
/obj/structure/cable/white,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -13692,7 +13692,7 @@
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/item/clothing/suit/jacket/letterman_nanotrasen,
/obj/item/clothing/suit/toggle/lawyer,
/obj/item/clothing/under/maid,
/obj/item/clothing/under/costume/maid,
/obj/machinery/light/small{
dir = 1
},
@@ -13716,7 +13716,7 @@
/obj/item/clothing/head/fedora{
icon_state = "detective"
},
/obj/item/clothing/under/geisha,
/obj/item/clothing/under/costume/geisha,
/obj/machinery/light/small{
dir = 1
},
@@ -17365,7 +17365,7 @@
/obj/item/clothing/head/fedora{
icon_state = "detective"
},
/obj/item/clothing/under/lawyer/female,
/obj/item/clothing/under/rank/civilian/lawyer/female,
/obj/machinery/light/small,
/turf/open/floor/wood,
/area/crew_quarters/dorms)
@@ -17387,7 +17387,7 @@
},
/obj/item/clothing/suit/toggle/lawyer/black,
/obj/item/clothing/head/fedora,
/obj/item/clothing/under/blacktango,
/obj/item/clothing/under/dress/blacktango,
/obj/machinery/light/small,
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/dorms)
@@ -27696,12 +27696,12 @@
pixel_y = 3
},
/obj/item/storage/box/syringes,
/obj/item/gun/syringe,
/obj/item/reagent_containers/hypospray/CMO,
/obj/item/storage/belt/medical,
/obj/item/storage/belt/medical,
/obj/item/clothing/neck/stethoscope,
/obj/item/clothing/neck/stethoscope,
/obj/item/gun/syringe/dart,
/turf/open/floor/plasteel,
/area/medical/medbay/zone3)
"aXR" = (
+23 -22
View File
@@ -18191,7 +18191,7 @@
/obj/structure/chair/wood/normal{
dir = 8
},
/obj/item/clothing/under/janimaid,
/obj/item/clothing/under/rank/civilian/janitor/maid,
/turf/open/floor/wood{
icon_state = "wood-broken"
},
@@ -20830,7 +20830,7 @@
/area/janitor)
"aXP" = (
/obj/structure/table,
/obj/item/clothing/under/maid,
/obj/item/clothing/under/costume/maid,
/obj/item/key/janitor,
/obj/item/grenade/clusterbuster/cleaner,
/obj/item/grenade/chem_grenade/cleaner,
@@ -22504,14 +22504,6 @@
/obj/effect/turf_decal/tile/green,
/turf/open/floor/plasteel,
/area/hydroponics)
"bbe" = (
/obj/structure/chair/stool,
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
dir = 8
},
/turf/open/floor/plasteel,
/area/hydroponics)
"bbg" = (
/obj/effect/landmark/start/cook,
/obj/machinery/atmospherics/components/unary/vent_pump/on,
@@ -22599,9 +22591,9 @@
"bbt" = (
/obj/structure/disposalpipe/segment,
/obj/structure/table/wood,
/obj/item/clothing/under/sundress,
/obj/item/clothing/under/waiter,
/obj/item/clothing/under/blacktango,
/obj/item/clothing/under/dress/sundress,
/obj/item/clothing/under/suit/waiter,
/obj/item/clothing/under/dress/blacktango,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/bar)
"bbu" = (
@@ -22661,7 +22653,7 @@
pixel_x = 6;
pixel_y = -5
},
/obj/item/clothing/under/rank/mailman,
/obj/item/clothing/under/misc/mailman,
/obj/item/clothing/head/mailman,
/turf/open/floor/plasteel,
/area/quartermaster/office)
@@ -35727,7 +35719,7 @@
icon_state = "2-4"
},
/obj/structure/closet,
/obj/item/clothing/under/rank/nursesuit,
/obj/item/clothing/under/rank/medical/doctor/nurse,
/obj/item/clothing/head/nursehat,
/obj/effect/decal/cleanable/cobweb,
/obj/machinery/airalarm{
@@ -39520,7 +39512,6 @@
"bMK" = (
/obj/item/soap/nanotrasen,
/obj/item/clothing/neck/stethoscope,
/obj/item/gun/syringe,
/obj/structure/table/glass,
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -39529,6 +39520,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/item/gun/syringe/dart,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bMM" = (
@@ -51429,10 +51421,10 @@
/turf/open/floor/carpet,
/area/chapel/main/monastery)
"cwz" = (
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
/obj/item/clothing/under/misc/burial,
/obj/structure/table/wood,
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
@@ -55848,7 +55840,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"klV" = (
/obj/item/clothing/under/rank/clown/sexy,
/obj/item/clothing/under/rank/civilian/clown/sexy,
/turf/open/floor/plasteel/dark,
/area/maintenance/department/crew_quarters/dorms)
"kmd" = (
@@ -59851,6 +59843,15 @@
},
/turf/open/floor/plating,
/area/science/xenobiology)
"ttS" = (
/obj/structure/chair/stool,
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
dir = 8
},
/mob/living/simple_animal/pet/bumbles,
/turf/open/floor/plasteel,
/area/hydroponics)
"tue" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -90071,7 +90072,7 @@ aRN
aXZ
aYQ
aXS
bbe
ttS
bcd
bdo
ben
+11 -11
View File
@@ -1711,14 +1711,14 @@
/obj/structure/table,
/obj/item/paper,
/obj/item/pen,
/obj/item/clothing/under/schoolgirl,
/obj/item/clothing/under/costume/schoolgirl,
/turf/open/floor/holofloor,
/area/holodeck/rec_center/school)
"eD" = (
/obj/structure/table,
/obj/item/paper,
/obj/item/pen,
/obj/item/clothing/under/schoolgirl/green,
/obj/item/clothing/under/costume/schoolgirl/green,
/turf/open/floor/holofloor,
/area/holodeck/rec_center/school)
"eE" = (
@@ -1832,14 +1832,14 @@
/obj/structure/table,
/obj/item/paper,
/obj/item/pen,
/obj/item/clothing/under/schoolgirl/orange,
/obj/item/clothing/under/costume/schoolgirl/orange,
/turf/open/floor/holofloor,
/area/holodeck/rec_center/school)
"eU" = (
/obj/structure/table,
/obj/item/paper,
/obj/item/pen,
/obj/item/clothing/under/schoolgirl/red,
/obj/item/clothing/under/costume/schoolgirl/red,
/turf/open/floor/holofloor,
/area/holodeck/rec_center/school)
"eV" = (
@@ -1934,7 +1934,7 @@
/obj/structure/table,
/obj/item/paper,
/obj/item/pen,
/obj/item/clothing/under/schoolgirl,
/obj/item/clothing/under/costume/schoolgirl,
/obj/item/toy/katana,
/turf/open/floor/holofloor,
/area/holodeck/rec_center/school)
@@ -6839,8 +6839,8 @@
/area/centcom/ferry)
"pN" = (
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/item/clothing/under/rank/curator/treasure_hunter,
/obj/item/clothing/under/skirt/black,
/obj/item/clothing/under/rank/civilian/curator/treasure_hunter,
/obj/item/clothing/under/dress/skirt,
/obj/item/clothing/under/shorts/black,
/obj/item/clothing/under/pants/track,
/obj/item/clothing/accessory/armband/deputy,
@@ -17017,11 +17017,11 @@
/turf/open/floor/plasteel/white,
/area/centcom/holding)
"OU" = (
/obj/item/clothing/under/jabroni,
/obj/item/clothing/under/geisha,
/obj/item/clothing/under/kilt,
/obj/item/clothing/under/costume/jabroni,
/obj/item/clothing/under/costume/geisha,
/obj/item/clothing/under/costume/kilt,
/obj/structure/closet,
/obj/item/clothing/under/roman,
/obj/item/clothing/under/costume/roman,
/turf/open/indestructible/hotelwood,
/area/centcom/holding)
"OV" = (
+278
View File
@@ -0,0 +1,278 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/template_noop)
"b" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/arrival)
"c" = (
/obj/structure/shuttle/engine/propulsion/right{
dir = 1
},
/turf/open/floor/plating,
/area/shuttle/arrival)
"d" = (
/obj/structure/shuttle/engine/propulsion/left{
dir = 1
},
/turf/open/floor/plating,
/area/shuttle/arrival)
"e" = (
/obj/docking_port/mobile/arrivals{
dir = 2;
dwidth = 4;
height = 12;
name = "cog arrivals shuttle";
width = 9
},
/turf/template_noop,
/area/template_noop)
"f" = (
/turf/closed/wall/mineral/titanium/nosmooth,
/area/shuttle/arrival)
"g" = (
/obj/structure/shuttle/engine/heater{
dir = 1
},
/obj/structure/window/reinforced/spawner,
/turf/open/floor/plating,
/area/shuttle/arrival)
"h" = (
/obj/structure/shuttle/engine/heater{
dir = 1
},
/turf/closed/wall/mineral/titanium/nosmooth,
/area/shuttle/arrival)
"i" = (
/obj/machinery/sleeper,
/obj/machinery/light{
dir = 8;
light_color = "#e8eaff"
},
/turf/open/floor/mineral/titanium/white,
/area/shuttle/arrival)
"j" = (
/obj/structure/closet/emcloset/anchored,
/turf/open/floor/mineral/titanium/white,
/area/shuttle/arrival)
"k" = (
/obj/structure/table/reinforced,
/obj/item/radio,
/obj/item/storage/toolbox/emergency,
/turf/open/floor/mineral/titanium/white,
/area/shuttle/arrival)
"l" = (
/obj/machinery/sleeper,
/obj/machinery/light{
dir = 4
},
/turf/open/floor/mineral/titanium/white,
/area/shuttle/arrival)
"m" = (
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/arrival)
"n" = (
/obj/structure/window/shuttle,
/obj/structure/grille,
/turf/open/floor/plating,
/area/shuttle/arrival)
"o" = (
/obj/structure/chair/comfy/shuttle,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/arrival)
"p" = (
/obj/structure/chair/comfy/shuttle,
/obj/machinery/light{
dir = 8;
light_color = "#e8eaff"
},
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/arrival)
"q" = (
/obj/structure/chair/comfy/shuttle,
/obj/machinery/light{
dir = 4
},
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/arrival)
"r" = (
/obj/machinery/door/airlock/external{
name = "Arrival Shuttle Airlock"
},
/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/arrival)
"s" = (
/obj/structure/table/reinforced,
/obj/item/storage/firstaid/regular,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/arrival)
"t" = (
/obj/structure/table/reinforced,
/obj/item/storage/toolbox/emergency,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/arrival)
"u" = (
/obj/structure/table/reinforced,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/arrival)
"v" = (
/obj/structure/table/reinforced,
/obj/item/radio,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/arrival)
"w" = (
/obj/machinery/computer{
dir = 1;
name = "Shuttle computer"
},
/obj/machinery/light{
dir = 8;
light_color = "#e8eaff"
},
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/arrival)
"x" = (
/obj/machinery/computer{
dir = 1;
name = "Shuttle computer"
},
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/arrival)
"y" = (
/obj/machinery/computer{
dir = 1;
name = "Shuttle computer"
},
/obj/machinery/light{
dir = 4
},
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/arrival)
(1,1,1) = {"
a
c
h
b
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
b
f
b
b
n
b
b
r
b
b
b
a
"}
(3,1,1) = {"
c
g
i
m
o
o
p
m
s
u
b
b
"}
(4,1,1) = {"
d
g
j
m
o
o
o
m
o
o
w
n
"}
(5,1,1) = {"
e
f
k
m
m
m
m
m
m
m
x
n
"}
(6,1,1) = {"
c
g
j
m
o
o
o
m
o
o
y
n
"}
(7,1,1) = {"
d
g
l
m
o
o
q
m
t
v
b
b
"}
(8,1,1) = {"
b
f
b
b
n
b
b
r
b
b
b
a
"}
(9,1,1) = {"
a
d
h
b
a
a
a
a
a
a
a
a
"}
+546
View File
@@ -0,0 +1,546 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/template_noop)
"b" = (
/obj/structure/shuttle/engine/propulsion{
dir = 4
},
/turf/open/floor/plating,
/area/shuttle/escape)
"c" = (
/obj/structure/shuttle/engine/heater{
dir = 8
},
/obj/structure/window/reinforced{
dir = 1
},
/turf/open/floor/plating,
/area/shuttle/escape)
"d" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/escape)
"e" = (
/obj/machinery/light{
dir = 1
},
/obj/structure/chair/comfy/shuttle{
dir = 4
},
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"f" = (
/obj/machinery/status_display/evac,
/turf/closed/wall/mineral/titanium,
/area/shuttle/escape)
"g" = (
/obj/machinery/door/airlock/titanium{
name = "Emergency Shuttle Airlock"
},
/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/escape)
"h" = (
/obj/structure/table/reinforced,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"i" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"j" = (
/obj/structure/table/reinforced,
/obj/item/storage/toolbox/emergency,
/obj/structure/window/reinforced{
dir = 1
},
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
"k" = (
/obj/structure/chair/comfy/brown{
dir = 4
},
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
"l" = (
/obj/machinery/vending/wallmed,
/turf/closed/wall/mineral/titanium,
/area/shuttle/escape)
"m" = (
/obj/effect/spawner/structure/window/shuttle,
/turf/open/floor/plating,
/area/shuttle/escape)
"n" = (
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
"o" = (
/obj/machinery/door/airlock/titanium{
name = "Emergency Shuttle Airlock"
},
/obj/structure/fans/tiny,
/obj/docking_port/mobile/emergency{
dheight = 0;
dir = 2;
dwidth = 9;
name = "NES Classic";
width = 22
},
/turf/open/floor/plating,
/area/shuttle/escape)
"p" = (
/obj/structure/shuttle/engine/heater{
dir = 8
},
/obj/structure/window/reinforced{
dir = 4
},
/turf/open/floor/plating,
/area/shuttle/escape)
"q" = (
/obj/machinery/sleeper,
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
"r" = (
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"s" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
},
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"t" = (
/obj/structure/table/reinforced,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"u" = (
/obj/structure/chair/comfy/brown{
dir = 4
},
/obj/machinery/light/small{
dir = 1
},
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
"v" = (
/obj/structure/window/reinforced{
dir = 4
},
/obj/structure/window/reinforced{
dir = 1
},
/obj/structure/table/reinforced,
/obj/item/radio,
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
"w" = (
/obj/machinery/door/airlock/public/glass{
name = "Emergency Shuttle Infirmary"
},
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
"x" = (
/obj/machinery/door/airlock/public/glass{
name = "Emergency Shuttle Cockpit";
req_access_txt = "19"
},
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
"y" = (
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
"z" = (
/obj/machinery/computer/emergency_shuttle{
dir = 8
},
/obj/structure/window/reinforced{
dir = 4
},
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
"A" = (
/obj/structure/chair/comfy/brown{
dir = 4
},
/obj/machinery/light/small,
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
"B" = (
/obj/structure/table/reinforced,
/obj/structure/window/reinforced{
dir = 4
},
/obj/structure/window/reinforced,
/obj/item/storage/firstaid/regular,
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
"C" = (
/obj/structure/table/reinforced,
/obj/item/storage/firstaid/regular,
/obj/structure/window/reinforced,
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
"D" = (
/obj/machinery/light,
/obj/structure/chair/comfy/shuttle{
dir = 4
},
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"H" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
},
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
"J" = (
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
"K" = (
/obj/machinery/door/airlock/public/glass{
name = "Emergency Shuttle Brig";
req_access_txt = "2"
},
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
"P" = (
/obj/structure/table/optable,
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
"Q" = (
/obj/machinery/light,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"R" = (
/obj/machinery/light/small,
/obj/structure/table,
/obj/item/storage/backpack/duffelbag/med/surgery,
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape)
"T" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
},
/obj/machinery/light/small{
dir = 1
},
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
"V" = (
/obj/machinery/light{
dir = 1
},
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"W" = (
/obj/structure/shuttle/engine/propulsion{
dir = 4
},
/obj/structure/window/reinforced{
dir = 1
},
/turf/open/floor/plating,
/area/shuttle/escape)
"X" = (
/obj/structure/shuttle/engine/propulsion{
dir = 4
},
/obj/structure/window/reinforced,
/turf/open/floor/plating,
/area/shuttle/escape)
"Y" = (
/obj/structure/shuttle/engine/heater{
dir = 8
},
/obj/structure/window/reinforced,
/turf/open/floor/plating,
/area/shuttle/escape)
(1,1,1) = {"
a
d
b
b
b
d
b
b
b
d
a
"}
(2,1,1) = {"
W
d
p
p
p
d
p
p
p
d
X
"}
(3,1,1) = {"
c
d
q
n
P
d
H
H
H
d
Y
"}
(4,1,1) = {"
d
l
q
n
R
d
T
J
H
d
d
"}
(5,1,1) = {"
d
d
d
w
f
d
f
K
d
d
d
"}
(6,1,1) = {"
d
t
t
r
s
s
s
r
s
s
d
"}
(7,1,1) = {"
g
r
r
r
s
s
s
r
s
s
m
"}
(8,1,1) = {"
m
r
r
Q
d
m
d
V
s
s
m
"}
(9,1,1) = {"
g
r
r
r
r
r
r
r
s
s
m
"}
(10,1,1) = {"
m
r
r
s
s
s
s
r
r
r
m
"}
(11,1,1) = {"
d
d
r
s
s
s
s
r
r
d
d
"}
(12,1,1) = {"
m
h
r
r
r
r
r
r
r
h
m
"}
(13,1,1) = {"
d
e
s
s
s
r
s
s
s
D
d
"}
(14,1,1) = {"
m
s
s
s
s
r
s
s
s
s
m
"}
(15,1,1) = {"
o
r
r
r
r
r
s
s
s
s
m
"}
(16,1,1) = {"
m
r
r
s
s
r
s
s
s
s
m
"}
(17,1,1) = {"
g
r
r
r
i
r
i
r
r
r
d
"}
(18,1,1) = {"
d
d
d
m
d
x
f
m
d
d
d
"}
(19,1,1) = {"
a
a
m
j
k
y
k
C
m
a
a
"}
(20,1,1) = {"
a
a
d
d
u
k
A
d
d
a
a
"}
(21,1,1) = {"
a
a
a
m
v
z
B
m
a
a
a
"}
(22,1,1) = {"
a
a
a
d
m
m
m
d
a
a
a
"}
+1 -1
View File
@@ -520,7 +520,7 @@
/obj/structure/window/reinforced,
/obj/structure/table,
/obj/item/storage/bag/tray,
/obj/item/clothing/under/waiter,
/obj/item/clothing/under/suit/waiter,
/turf/open/floor/plasteel/cafeteria,
/area/shuttle/escape)
"bg" = (
+349
View File
@@ -0,0 +1,349 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/labor)
"b" = (
/obj/structure/shuttle/engine/propulsion{
icon_state = "propulsion";
dir = 1
},
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/plating/airless,
/area/shuttle/labor)
"c" = (
/obj/structure/shuttle/engine/heater{
icon_state = "heater";
dir = 1
},
/obj/structure/window/reinforced,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/plating/airless,
/area/shuttle/labor)
"d" = (
/obj/structure/closet/crate/internals,
/obj/item/clothing/suit/hazardvest{
desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
name = "emergency lifejacket"
},
/obj/item/clothing/suit/hazardvest{
desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
name = "emergency lifejacket"
},
/obj/item/clothing/suit/hazardvest{
desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
name = "emergency lifejacket"
},
/obj/item/clothing/suit/hazardvest{
desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
name = "emergency lifejacket"
},
/obj/item/clothing/suit/hazardvest{
desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
name = "emergency lifejacket"
},
/obj/item/tank/internals/emergency_oxygen/double{
pixel_x = 3
},
/obj/item/tank/internals/emergency_oxygen/double{
pixel_x = 3
},
/obj/item/tank/internals/emergency_oxygen/double{
pixel_x = 3
},
/obj/item/tank/internals/emergency_oxygen/double{
pixel_x = 3
},
/obj/item/tank/internals/emergency_oxygen/double{
pixel_x = 3
},
/obj/item/clothing/mask/breath{
pixel_x = -3;
pixel_y = -3
},
/obj/item/clothing/mask/breath{
pixel_x = -3;
pixel_y = -3
},
/obj/item/clothing/mask/breath{
pixel_x = -3;
pixel_y = -3
},
/obj/item/clothing/mask/breath{
pixel_x = -3;
pixel_y = -3
},
/obj/item/clothing/mask/breath{
pixel_x = -3;
pixel_y = -3
},
/obj/item/clothing/head/hardhat/orange{
name = "protective hat";
pixel_y = 9
},
/obj/item/clothing/head/hardhat/orange{
name = "protective hat";
pixel_y = 9
},
/obj/item/clothing/head/hardhat/orange{
name = "protective hat";
pixel_y = 9
},
/obj/item/clothing/head/hardhat/orange{
name = "protective hat";
pixel_y = 9
},
/obj/item/clothing/head/hardhat/orange{
name = "protective hat";
pixel_y = 9
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/shuttle/labor)
"e" = (
/turf/open/floor/plasteel,
/area/shuttle/labor)
"f" = (
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 1
},
/turf/open/floor/plasteel,
/area/shuttle/labor)
"g" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/obj/machinery/door/airlock/shuttle{
id_tag = "prisonshuttle";
name = "Labor Shuttle Airlock"
},
/turf/open/floor/plating,
/area/shuttle/labor)
"h" = (
/obj/structure/grille,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
/obj/structure/window/shuttle,
/turf/open/floor/plating,
/area/shuttle/labor)
"i" = (
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 1
},
/turf/open/floor/plasteel,
/area/shuttle/labor)
"j" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red{
dir = 1
},
/turf/open/floor/plasteel,
/area/shuttle/labor)
"k" = (
/obj/machinery/flasher{
id = "gulagshuttleflasher";
pixel_x = 25
},
/obj/structure/chair/comfy/shuttle{
dir = 8
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/shuttle/labor)
"l" = (
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 1
},
/turf/open/floor/plasteel,
/area/shuttle/labor)
"m" = (
/obj/machinery/light,
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/shuttle/labor)
"n" = (
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/shuttle/labor)
"o" = (
/obj/machinery/mineral/labor_claim_console{
machinedir = 2;
pixel_x = 30
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/shuttle/labor)
"p" = (
/turf/open/floor/plasteel/grimy,
/area/shuttle/labor)
"q" = (
/obj/machinery/light{
dir = 1;
light_color = "#c1caff"
},
/obj/machinery/button/flasher{
dir = 1;
id = "gulagshuttleflasher";
name = "Flash Control";
pixel_y = 26;
req_access_txt = "1"
},
/turf/open/floor/plasteel/grimy,
/area/shuttle/labor)
"r" = (
/obj/docking_port/mobile{
dir = 8;
dwidth = 2;
height = 5;
id = "laborcamp";
name = "labor camp shuttle";
port_direction = 4;
width = 9
},
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/obj/machinery/door/airlock/shuttle{
name = "Labor Shuttle Airlock";
req_access_txt = "2"
},
/turf/open/floor/plating,
/area/shuttle/labor)
"s" = (
/obj/machinery/computer/shuttle/labor{
dir = 4
},
/obj/structure/reagent_dispensers/peppertank{
pixel_x = -31
},
/turf/open/floor/plasteel/grimy,
/area/shuttle/labor)
"t" = (
/obj/structure/chair/office/dark,
/turf/open/floor/plasteel/grimy,
/area/shuttle/labor)
"u" = (
/obj/structure/table/reinforced,
/obj/item/folder/red,
/obj/item/restraints/handcuffs,
/turf/open/floor/plasteel/grimy,
/area/shuttle/labor)
"v" = (
/obj/structure/window/shuttle,
/turf/open/floor/plating/airless,
/area/shuttle/labor)
"w" = (
/obj/machinery/door/airlock/shuttle{
name = "Labor Shuttle Airlock";
req_access_txt = "2"
},
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/plasteel,
/area/shuttle/labor)
"x" = (
/obj/machinery/mineral/stacking_machine/laborstacker{
input_dir = 2;
output_dir = 1
},
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/plasteel,
/area/shuttle/labor)
"y" = (
/obj/machinery/mineral/stacking_unit_console{
machinedir = 2;
pixel_x = 30;
pixel_y = -32
},
/turf/open/floor/plasteel/grimy,
/area/shuttle/labor)
(1,1,1) = {"
a
a
a
h
a
a
h
a
a
"}
(2,1,1) = {"
b
a
d
j
l
w
p
s
v
"}
(3,1,1) = {"
b
c
f
e
m
n
q
t
v
"}
(4,1,1) = {"
b
a
i
k
o
x
y
u
v
"}
(5,1,1) = {"
a
a
g
a
a
a
r
a
a
"}
+2 -2
View File
@@ -82,7 +82,7 @@
},
/obj/item/clothing/head/collectable/pirate,
/obj/item/clothing/suit/pirate,
/obj/item/clothing/under/pirate,
/obj/item/clothing/under/costume/pirate,
/obj/item/clothing/shoes/jackboots,
/obj/item/clothing/head/bandana,
/turf/open/floor/plasteel/dark/side{
@@ -387,7 +387,7 @@
},
/obj/item/clothing/head/collectable/pirate,
/obj/item/clothing/suit/pirate,
/obj/item/clothing/under/pirate,
/obj/item/clothing/under/costume/pirate,
/obj/item/clothing/shoes/jackboots,
/obj/item/clothing/head/bandana,
/obj/effect/turf_decal/tile/red{
+428
View File
@@ -0,0 +1,428 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/obj/structure/shuttle/engine/propulsion/left{
dir = 8
},
/turf/open/floor/plating,
/area/shuttle/abandoned)
"b" = (
/obj/structure/shuttle/engine/heater{
dir = 8
},
/turf/closed/wall/mineral/titanium/nosmooth,
/area/shuttle/abandoned)
"c" = (
/turf/closed/wall/mineral/titanium/interior,
/area/shuttle/abandoned)
"d" = (
/turf/template_noop,
/area/template_noop)
"e" = (
/obj/structure/shuttle/engine/propulsion/burst{
dir = 8
},
/turf/open/floor/plating,
/area/shuttle/abandoned)
"f" = (
/obj/structure/shuttle/engine/heater{
dir = 8
},
/turf/closed/wall/mineral/titanium/interior,
/area/shuttle/abandoned)
"g" = (
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/shuttle/abandoned)
"h" = (
/obj/machinery/door/airlock/external,
/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/shuttle/abandoned)
"i" = (
/obj/machinery/suit_storage_unit/security,
/obj/machinery/light/small{
brightness = 3;
dir = 8
},
/obj/machinery/airalarm/all_access{
pixel_y = 24
},
/turf/open/floor/plasteel/dark,
/area/shuttle/abandoned)
"j" = (
/turf/closed/wall/mineral/titanium,
/area/shuttle/abandoned)
"k" = (
/obj/machinery/door/airlock/external,
/obj/structure/fans/tiny,
/turf/open/floor/plasteel/dark,
/area/shuttle/abandoned)
"l" = (
/obj/structure/shuttle/engine/propulsion/right{
dir = 8
},
/turf/open/floor/plating,
/area/shuttle/abandoned)
"m" = (
/obj/structure/bed,
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"n" = (
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"o" = (
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"p" = (
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 1
},
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"q" = (
/obj/structure/table/reinforced,
/obj/structure/window/reinforced/spawner/east,
/obj/machinery/recharger,
/turf/open/floor/plasteel/dark,
/area/shuttle/abandoned)
"r" = (
/obj/structure/filingcabinet,
/turf/open/floor/plasteel/grimy,
/area/shuttle/abandoned)
"s" = (
/turf/open/floor/plasteel/grimy,
/area/shuttle/abandoned)
"t" = (
/turf/closed/wall/mineral/titanium/nosmooth,
/area/shuttle/abandoned)
"u" = (
/obj/machinery/door/airlock/security,
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"v" = (
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"w" = (
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"x" = (
/obj/machinery/door/firedoor/border_only/closed{
icon_state = "door_closed";
dir = 4
},
/obj/machinery/door/window/eastright,
/turf/open/floor/plasteel/dark,
/area/shuttle/abandoned)
"y" = (
/obj/structure/table/reinforced,
/obj/item/paper_bin,
/obj/item/pen,
/turf/open/floor/plasteel/grimy,
/area/shuttle/abandoned)
"z" = (
/obj/structure/window/shuttle,
/turf/open/floor/plating,
/area/shuttle/abandoned)
"A" = (
/obj/machinery/door/window/eastright,
/obj/structure/toilet{
contents = newlist(/obj/item/toy/snappop/phoenix);
dir = 4
},
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"B" = (
/obj/machinery/light{
dir = 4;
light_color = "#c1caff"
},
/obj/machinery/flasher{
id = "cogws";
pixel_x = 24
},
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"C" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/structure/closet/crate/secure/weapon,
/obj/item/gun/energy/laser/carbine,
/obj/machinery/button/flasher{
id = "cogws";
pixel_x = -24;
pixel_y = 8
},
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"D" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/structure/closet/crate/secure/weapon,
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/item/gun/energy/e_gun/stun,
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"E" = (
/obj/machinery/light{
dir = 8;
light_color = "#e8eaff"
},
/obj/machinery/airalarm/all_access{
dir = 4;
pixel_x = -24
},
/turf/open/floor/plasteel/grimy,
/area/shuttle/abandoned)
"F" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
},
/turf/open/floor/plasteel/grimy,
/area/shuttle/abandoned)
"G" = (
/obj/machinery/computer/shuttle/white_ship{
dir = 8
},
/turf/open/floor/plasteel/grimy,
/area/shuttle/abandoned)
"H" = (
/obj/item/clothing/glasses/sunglasses/blindfold,
/obj/machinery/airalarm/all_access{
dir = 8;
pixel_x = 24
},
/turf/open/floor/plasteel,
/area/shuttle/abandoned)
"I" = (
/obj/structure/table/reinforced,
/obj/item/clothing/glasses/sunglasses,
/turf/open/floor/plasteel/grimy,
/area/shuttle/abandoned)
"J" = (
/obj/structure/curtain,
/obj/machinery/shower{
name = "shower";
pixel_y = 12
},
/obj/item/soap/nanotrasen,
/turf/open/floor/plasteel/white,
/area/shuttle/abandoned)
"K" = (
/obj/structure/mirror{
pixel_y = 32
},
/obj/structure/sink{
pixel_y = 28
},
/turf/open/floor/plasteel/white,
/area/shuttle/abandoned)
"L" = (
/obj/machinery/door/airlock/shuttle,
/turf/open/floor/plasteel/white,
/area/shuttle/abandoned)
"M" = (
/obj/structure/toilet{
dir = 8
},
/obj/machinery/light/small{
brightness = 3;
dir = 8
},
/obj/machinery/airalarm/all_access{
dir = 1;
pixel_y = -24
},
/turf/open/floor/plasteel/white,
/area/shuttle/abandoned)
"N" = (
/obj/machinery/door/airlock/external,
/obj/structure/fans/tiny,
/obj/docking_port/mobile{
dir = 2;
dwidth = 7;
height = 9;
id = "whiteship";
movement_force = list("KNOCKDOWN" = 0, "THROW" = 0);
name = "Prisoner Transport";
port_direction = 8;
preferred_direction = 4;
width = 13
},
/turf/open/floor/plasteel/dark,
/area/shuttle/abandoned)
(1,1,1) = {"
a
e
l
g
c
g
a
e
l
"}
(2,1,1) = {"
b
f
f
t
A
t
f
f
b
"}
(3,1,1) = {"
c
g
m
n
n
n
m
g
c
"}
(4,1,1) = {"
d
c
m
n
n
n
m
c
d
"}
(5,1,1) = {"
d
h
n
n
B
H
n
h
d
"}
(6,1,1) = {"
d
g
c
u
c
g
c
g
d
"}
(7,1,1) = {"
c
c
o
v
C
c
J
c
c
"}
(8,1,1) = {"
c
i
p
w
D
c
K
M
c
"}
(9,1,1) = {"
c
g
q
x
c
g
L
g
c
"}
(10,1,1) = {"
d
j
r
s
E
s
s
j
d
"}
(11,1,1) = {"
d
N
s
s
F
s
s
k
d
"}
(12,1,1) = {"
d
j
j
y
G
I
j
j
d
"}
(13,1,1) = {"
d
d
j
z
z
z
j
d
d
"}
+2 -2
View File
@@ -909,11 +909,11 @@
dir = 1
},
/obj/item/storage/wallet/random,
/obj/item/clothing/under/rank/centcom_officer{
/obj/item/clothing/under/rank/centcom/officer{
desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
name = "\improper dusty old CentCom jumpsuit"
},
/obj/item/clothing/under/rank/centcom_commander{
/obj/item/clothing/under/rank/centcom/commander{
desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
name = "\improper dusty old CentCom jumpsuit"
},
+65 -31
View File
@@ -2,32 +2,57 @@
#define CHECK_DNA_AND_SPECIES(C) if((!(C.dna)) || (!(C.dna.species))) return
//Defines copying names of mutations in all cases, make sure to change this if you change mutation's name
#define HULK "Hulk"
#define XRAY "X Ray Vision"
#define COLDRES "Cold Resistance"
#define TK "Telekinesis"
#define NERVOUS "Nervousness"
#define EPILEPSY "Epilepsy"
#define MUTATE "Unstable DNA"
#define COUGH "Cough"
#define DWARFISM "Dwarfism"
#define CLOWNMUT "Clumsiness"
#define TOURETTES "Tourettes Syndrome"
#define DEAFMUT "Deafness"
#define BLINDMUT "Blindness"
#define RACEMUT "Monkified"
#define BADSIGHT "Near Sightness"
#define LASEREYES "Laser Eyes"
#define CHAMELEON "Chameleon"
#define WACKY "Wacky"
#define MUT_MUTE "Mute"
#define SMILE "Smile"
#define STONER "Stoner"
#define UNINTELLIGIBLE "Unintelligible"
#define SWEDISH "Swedish"
#define CHAV "Chav"
#define ELVIS "Elvis"
//Defines copying names of mutations in all cases, make sure to change this if you change mutation's type
#define HULK /datum/mutation/human/hulk
#define XRAY /datum/mutation/human/thermal/x_ray
#define SPACEMUT /datum/mutation/human/space_adaptation
#define TK /datum/mutation/human/telekinesis
#define NERVOUS /datum/mutation/human/nervousness
#define EPILEPSY /datum/mutation/human/epilepsy
#define MUTATE /datum/mutation/human/bad_dna
#define COUGH /datum/mutation/human/cough
#define DWARFISM /datum/mutation/human/dwarfism
#define GIGANTISM /datum/mutation/human/gigantism
#define CLOWNMUT /datum/mutation/human/clumsy
#define TOURETTES /datum/mutation/human/tourettes
#define DEAFMUT /datum/mutation/human/deaf
#define BLINDMUT /datum/mutation/human/blind
#define RACEMUT /datum/mutation/human/race
#define BADSIGHT /datum/mutation/human/nearsight
#define LASEREYES /datum/mutation/human/laser_eyes
#define CHAMELEON /datum/mutation/human/chameleon
#define WACKY /datum/mutation/human/wacky
#define MUT_MUTE /datum/mutation/human/mute
#define SMILE /datum/mutation/human/smile
#define STONER /datum/mutation/human/stoner
#define UNINTELLIGIBLE /datum/mutation/human/unintelligible
#define SWEDISH /datum/mutation/human/swedish
#define CHAV /datum/mutation/human/chav
#define ELVIS /datum/mutation/human/elvis
#define RADIOACTIVE /datum/mutation/human/radioactive
#define GLOWY /datum/mutation/human/glow
#define ANTIGLOWY /datum/mutation/human/glow/anti
#define TELEPATHY /datum/mutation/human/telepathy
#define FIREBREATH /datum/mutation/human/firebreath
#define VOID /datum/mutation/human/void
#define TONGUESPIKE /datum/mutation/human/tongue_spike
#define TONGUESPIKECHEM /datum/mutation/human/tongue_spike/chem
#define STRONG /datum/mutation/human/strong
#define STIMMED /datum/mutation/human/stimmed
#define FIRESWEAT /datum/mutation/human/fire
#define THERMAL /datum/mutation/human/thermal
#define ANTENNA /datum/mutation/human/antenna
#define PARANOIA /datum/mutation/human/paranoia
#define MINDREAD /datum/mutation/human/mindreader
#define INSULATED /datum/mutation/human/insulated
#define SHOCKTOUCH /datum/mutation/human/shock
#define OLFACTION /datum/mutation/human/olfaction
#define ACIDFLESH /datum/mutation/human/acidflesh
#define BADBLINK /datum/mutation/human/badblink
#define SPASTIC /datum/mutation/human/spastic
#define GELADIKINESIS /datum/mutation/human/geladikinesis
#define CRYOKINESIS /datum/mutation/human/cryokinesis
#define SPIDER_WEB /datum/mutation/human/webbing
#define UI_CHANGED "ui changed"
#define UE_CHANGED "ue changed"
@@ -39,10 +64,12 @@
//Types of usual mutations
#define POSITIVE 1
#define NEGATIVE 2
#define MINOR_NEGATIVE 3
#define MINOR_NEGATIVE 4
//Mutations that cant be taken from genetics and are not in SE
#define NON_SCANNABLE -1
//Mutation classes. Normal being on them, extra being additional mutations with instability and other being stuff you dont want people to fuck with like wizard mutate
#define MUT_NORMAL 1
#define MUT_EXTRA 2
#define MUT_OTHER 3
//DNA - Because fuck you and your magic numbers being all over the codebase.
#define DNA_BLOCK_SIZE 3
@@ -63,7 +90,8 @@
#define DNA_MUTANTMARKING_BLOCK 13
#define DNA_TAUR_BLOCK 14
#define DNA_STRUC_ENZYMES_BLOCKS 18
#define DNA_SEQUENCE_LENGTH 4
#define DNA_MUTATION_BLOCKS 8
#define DNA_UNIQUE_ENZYMES_LEN 32
//Transformation proc stuff
@@ -141,7 +169,13 @@
#define STANDARD_ORGAN_HEALING (1/(15 MINUTES / (2 SECONDS)))
#define STANDARD_ORGAN_DECAY (1/(15 MINUTES / (2 SECONDS))) //designed to fail organs when left to decay for ~15 minutes. 2 SECOND is SSmobs tickrate.
//used for the can_chromosome var on mutations
#define CHROMOSOME_NEVER 0
#define CHROMOSOME_NONE 1
#define CHROMOSOME_USED 2
#define G_MALE 1
#define G_FEMALE 2
#define G_PLURAL 3
#define G_NEUTER 4
#define G_NEUTER 4
+6 -2
View File
@@ -1,3 +1,6 @@
#define TRAITOR_HUMAN /datum/traitor_class/human/freeform
#define TRAITOR_AI /datum/traitor_class/ai
#define NUKE_RESULT_FLUKE 0
#define NUKE_RESULT_NUKE_WIN 1
#define NUKE_RESULT_CREW_WIN 2
@@ -74,6 +77,7 @@
#define MARTIALART_HUNTER "hunter-fu"
//Blob
/// blob gets a free reroll every X time
#define BLOB_REROLL_TIME 2400
#define BLOB_REROLL_TIME 2400 // blob gets a free reroll every X time
#define BLOB_SPREAD_COST 4
#define BLOB_ATTACK_REFUND 2 //blob refunds this much if it attacks and doesn't spread
#define BLOB_REFLECTOR_COST 15
+19 -37
View File
@@ -2,18 +2,6 @@
//Be sure to update the min/max of these if you do change them.
//Measurements are in imperial units. Inches, feet, yards, miles. Tsp, tbsp, cups, quarts, gallons, etc
//HUD stuff
#define ui_arousal "EAST-1:28,CENTER-4:8"//Below the health doll
#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button
#define ui_overridden_resist "EAST-3:24,SOUTH+1:7"
#define ui_combat_toggle "EAST-4:22,SOUTH:5"
//1:1 HUD layout stuff
#define ui_boxcraft "EAST-4:22,SOUTH+1:6"
#define ui_boxarea "EAST-4:6,SOUTH+1:6"
#define ui_boxlang "EAST-5:22,SOUTH+1:6"
#define ui_boxvore "EAST-5:22,SOUTH+1:6"
//Filters
#define CIT_FILTER_STAMINACRIT filter(type="drop_shadow", x=0, y=0, size=-3, color="#04080F")
@@ -35,44 +23,50 @@
#define MASTURBATE_LINKED_ORGAN (1<<6) //used to pass our mission to the linked organ
#define CAN_CLIMAX_WITH (1<<7)
#define GENITAL_CAN_AROUSE (1<<8)
#define GENITAL_UNDIES_HIDDEN (1<<9)
#define UPDATE_OWNER_APPEARANCE (1<<10)
#define COCK_SIZE_MIN 1
#define COCK_SIZE_MAX 20
#define DEF_VAGINA_SHAPE "Human"
#define COCK_SIZE_DEF 6
#define COCK_DIAMETER_RATIO_MAX 0.42
#define COCK_DIAMETER_RATIO_DEF 0.25
#define COCK_DIAMETER_RATIO_MIN 0.15
#define KNOT_GIRTH_RATIO_MAX 3
#define KNOT_GIRTH_RATIO_DEF 2.1
#define KNOT_GIRTH_RATIO_MIN 1.25
#define DEF_COCK_SHAPE "Human"
#define BALLS_VOLUME_BASE 25
#define BALLS_VOLUME_MULT 1
#define DEF_BALLS_SHAPE "Single"
#define BALLS_SIZE_MIN 1
#define BALLS_SIZE_DEF 2
#define BALLS_SIZE_MAX 3
#define BALLS_SACK_SIZE_MIN 1
#define BALLS_SACK_SIZE_DEF 8
#define BALLS_SACK_SIZE_MAX 40
#define CUM_RATE 2 // holy shit what a really shitty define name - relates to units per arbitrary measure of time?
#define CUM_RATE_MULT 1
#define CUM_EFFICIENCY 1 //amount of nutrition required per life()
#define EGG_GIRTH_MIN 1//inches
#define EGG_GIRTH_DEF 6
#define EGG_GIRTH_MAX 16
#define BREASTS_VOLUME_BASE 50 //base volume for the reagents in the breasts, multiplied by the size then multiplier. 50u for A cups, 850u for HH cups.
#define BREASTS_VOLUME_MULT 1 //global multiplier for breast volume.
#define BREASTS_SIZE_DEF "c" //lowercase cause those sprite accessory don't use uppercased letters.
#define DEF_BREASTS_SHAPE "Pair"
#define MILK_RATE 5
#define MILK_RATE_MULT 1
#define MILK_EFFICIENCY 1
//visibility toggles defines to avoid errors typos code errors.
#define GEN_VISIBLE_ALWAYS "Always visible"
#define GEN_VISIBLE_NO_CLOTHES "Hidden by clothes"
#define GEN_VISIBLE_NO_UNDIES "Hidden by underwear"
#define GEN_VISIBLE_NEVER "Always hidden"
//Individual logging define
#define INDIVIDUAL_LOOC_LOG "LOOC log"
@@ -83,8 +77,6 @@
//Citadel istypes
#define isgenital(A) (istype(A, /obj/item/organ/genital))
#define isborer(A) (istype(A, /mob/living/simple_animal/borer))
#define CITADEL_MENTOR_OOC_COLOUR "#224724"
//xenobio console upgrade stuff
@@ -92,14 +84,6 @@
#define XENOBIO_UPGRADE_SLIMEBASIC 2
#define XENOBIO_UPGRADE_SLIMEADV 4
//stamina stuff
#define STAMINA_SOFTCRIT 100 //softcrit for stamina damage. prevents standing up, prevents performing actions that cost stamina, etc, but doesn't force a rest or stop movement
#define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit
#define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations
#define STAMINA_CRIT_TRADITIONAL -40 //ditto, but for STAMINA_CRIT
#define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob
//Citadel toggles because bitflag memes
#define MEDIHOUND_SLEEPER (1<<0)
#define EATING_NOISES (1<<1)
@@ -117,8 +101,6 @@
#define TOGGLES_CITADEL (EATING_NOISES|DIGESTION_NOISES|BREAST_ENLARGEMENT|PENIS_ENLARGEMENT)
//component stuff
#define COMSIG_COMBAT_TOGGLED "combatmode_toggled" //called by combat mode toggle on all equipped items. args: (mob/user, combatmode)
#define COMSIG_VORE_TOGGLED "voremode_toggled" // totally not copypasta
//belly sound pref things
+50
View File
@@ -29,12 +29,60 @@
#define EFFECT_DROWSY "drowsy"
#define EFFECT_JITTER "jitter"
// /mob/living/combat_flags
#define CAN_TOGGLE_COMBAT_MODE(mob) FORCE_BOOLEAN((mob.stat == CONSCIOUS) && !(mob.combat_flags & COMBAT_FLAG_HARD_STAMCRIT))
/// Default combat flags for those affected by ((stamina combat))
#define COMBAT_FLAGS_DEFAULT NONE
/// Default combat flags for everyone else (so literally everyone but humans)
#define COMBAT_FLAGS_STAMSYSTEM_EXEMPT (COMBAT_FLAG_SPRINT_ACTIVE | COMBAT_FLAG_COMBAT_ACTIVE | COMBAT_FLAG_SPRINT_TOGGLED | COMBAT_FLAG_COMBAT_TOGGLED)
/// Default combat flags for those only affected by sprint (so just silicons)
#define COMBAT_FLAGS_STAMEXEMPT_YESSPRINT (COMBAT_FLAG_COMBAT_ACTIVE | COMBAT_FLAG_COMBAT_TOGGLED)
/// The user wants combat mode on
#define COMBAT_FLAG_COMBAT_TOGGLED (1<<0)
/// The user wants sprint mode on
#define COMBAT_FLAG_SPRINT_TOGGLED (1<<1)
/// Combat mode is currently active
#define COMBAT_FLAG_COMBAT_ACTIVE (1<<2)
/// Sprint is currently active
#define COMBAT_FLAG_SPRINT_ACTIVE (1<<3)
/// Currently attempting to crawl under someone
#define COMBAT_FLAG_ATTEMPTING_CRAWL (1<<4)
/// Currently stamcritted
#define COMBAT_FLAG_HARD_STAMCRIT (1<<5)
/// Currently attempting to resist up from the ground
#define COMBAT_FLAG_RESISTING_REST (1<<6)
/// Intentionally resting
#define COMBAT_FLAG_INTENTIONALLY_RESTING (1<<7)
/// Currently stamcritted but not as violently
#define COMBAT_FLAG_SOFT_STAMCRIT (1<<8)
// Helpers for getting someone's stamcrit state. Cast to living.
#define NOT_STAMCRIT 0
#define SOFT_STAMCRIT 1
#define HARD_STAMCRIT 2
// Stamcrit check helpers
#define IS_STAMCRIT(mob) (CHECK_STAMCRIT(mob) != NOT_STAMCRIT)
#define CHECK_STAMCRIT(mob) ((mob.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)? HARD_STAMCRIT : ((mob.combat_flags & COMBAT_FLAG_SOFT_STAMCRIT)? SOFT_STAMCRIT : NOT_STAMCRIT))
//stamina stuff
#define STAMINA_SOFTCRIT 100 //softcrit for stamina damage. prevents standing up, prevents performing actions that cost stamina, etc, but doesn't force a rest or stop movement
#define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit
#define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations
#define STAMINA_CRIT_TRADITIONAL -40 //ditto, but for STAMINA_CRIT
#define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob
//Bitflags defining which status effects could be or are inflicted on a mob
// This is a bit out of date/inaccurate in light of all the new status effects and is probably pending rework.
#define CANSTUN (1<<0)
#define CANKNOCKDOWN (1<<1)
#define CANUNCONSCIOUS (1<<2)
#define CANPUSH (1<<3)
#define GODMODE (1<<4)
#define CANSTAGGER (1<<5)
//Health Defines
#define HEALTH_THRESHOLD_CRIT 0
@@ -203,3 +251,5 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting.
#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default.
#define BULLET_ACT_TURF "TURF" //It hit us but it should hit something on the same turf too. Usually used for turfs.
+41
View File
@@ -0,0 +1,41 @@
/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type.
/// `parent` must not be modified if this is to be returned.
/// This will be noted in the runtime logs
#define COMPONENT_INCOMPATIBLE 1
/// Returned in PostTransfer to prevent transfer, similar to `COMPONENT_INCOMPATIBLE`
#define COMPONENT_NOTRANSFER 2
/// Return value to cancel attaching
#define ELEMENT_INCOMPATIBLE 1
// /datum/element flags
/// Causes the detach proc to be called when the host object is being deleted
#define ELEMENT_DETACH (1 << 0)
/**
* Only elements created with the same arguments given after `id_arg_index` share an element instance
* The arguments are the same when the text and number values are the same and all other values have the same ref
*/
#define ELEMENT_BESPOKE (1 << 1)
// How multiple components of the exact same type are handled in the same datum
/// old component is deleted (default)
#define COMPONENT_DUPE_HIGHLANDER 0
/// duplicates allowed
#define COMPONENT_DUPE_ALLOWED 1
/// new component is deleted
#define COMPONENT_DUPE_UNIQUE 2
/// old component is given the initialization args of the new
#define COMPONENT_DUPE_UNIQUE_PASSARGS 4
/// each component of the same type is consulted as to whether the duplicate should be allowed
#define COMPONENT_DUPE_SELECTIVE 5
//Redirection component init flags
#define REDIRECT_TRANSFER_WITH_TURF 1
//Arch
#define ARCH_PROB "probability" //Probability for each item
#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount
//Ouch my toes!
#define CALTROP_BYPASS_SHOES 1
#define CALTROP_IGNORE_WALKERS 2
+16
View File
@@ -0,0 +1,16 @@
/// Used to trigger signals and call procs registered for that signal
/// The datum hosting the signal is automaticaly added as the first argument
/// Returns a bitfield gathered from all registered procs
/// Arguments given here are packaged in a list and given to _SendSignal
#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) )
#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) )
/// A wrapper for _AddElement that allows us to pretend we're using normal named arguments
#define AddElement(arguments...) _AddElement(list(##arguments))
/// A wrapper for _RemoveElement that allows us to pretend we're using normal named arguments
#define RemoveElement(arguments...) _RemoveElement(list(##arguments))
/// A wrapper for _AddComponent that allows us to pretend we're using normal named arguments
#define AddComponent(arguments...) _AddComponent(list(##arguments))
@@ -1,28 +1,3 @@
#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) )
#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) )
#define COMPONENT_INCOMPATIBLE 1
#define COMPONENT_NOTRANSFER 2
#define ELEMENT_INCOMPATIBLE 1 // Return value to cancel attaching
// /datum/element flags
/// Causes the detach proc to be called when the host object is being deleted
#define ELEMENT_DETACH (1 << 0)
/**
* Only elements created with the same arguments given after `id_arg_index` share an element instance
* The arguments are the same when the text and number values are the same and all other values have the same ref
*/
#define ELEMENT_BESPOKE (1 << 1)
// How multiple components of the exact same type are handled in the same datum
#define COMPONENT_DUPE_HIGHLANDER 0 //old component is deleted (default)
#define COMPONENT_DUPE_ALLOWED 1 //duplicates allowed
#define COMPONENT_DUPE_UNIQUE 2 //new component is deleted
#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 //old component is given the initialization args of the new
// All signals. Format:
// When the signal is called: (signal arguments)
// All signals send the source datum of the signal as the first argument
@@ -200,6 +175,7 @@
#define SPEECH_LANGUAGE 5
// #define SPEECH_IGNORE_SPAM 6
// #define SPEECH_FORCED 7
#define COMSIG_MOB_ANTAG_ON_GAIN "mob_antag_on_gain" //from base of /datum/antagonist/on_gain(): (antag_datum)
// /mob/living signals
#define COMSIG_LIVING_REGENERATE_LIMBS "living_regenerate_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs)
@@ -210,7 +186,10 @@
#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: ()
#define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive)
#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client)
#define COMSIG_MOB_CLIENT_MOVE "comsig_mob_client_move" //sent when client/Move() finishes with no early returns: (client, direction, n, oldloc)
#define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override)
#define COMSIG_LIVING_COMBAT_ENABLED "combatmode_enabled" //from base of mob/living/enable_combat_mode() (was_forced)
#define COMSIG_LIVING_COMBAT_DISABLED "combatmode_disabled" //from base of mob/living/disable_combat_mode() (was_forced)
//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS!
#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore)
@@ -220,10 +199,12 @@
#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //from base of mob/living/Unconscious() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //from base of mob/living/Sleeping() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_DAZE "living_daze" //from base of mob/living/Daze() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_STAGGER "living_stagger" //from base of mob/living/Stagger() (amount, update, ignore)
#define COMPONENT_NO_STUN 1 //For all of them
// /mob/living/carbon signals
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity))
#define COMSIG_CARBON_IDENTITY_TRANSFERRED_TO "carbon_id_transferred_to" //from datum/dna/transfer_identity(): (datum/dna, transfer_SE)
// /mob/living/simple_animal/hostile signals
#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget"
@@ -289,6 +270,9 @@
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target)
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker)
#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted)
#define COMSIG_HUMAN_PREFS_COPIED_TO "human_prefs_copied_to" //from datum/preferences/copy_to(): (datum/preferences, icon_updates, roundstart_checks)
#define COMSIG_HUMAN_HARDSET_DNA "human_hardset_dna" //from mob/living/carbon/human/hardset_dna(): (ui, list/mutation_index, newreal_name, newblood_type, datum/species, newfeatures)
#define COMSIG_HUMAN_ON_RANDOMIZE "humman_on_randomize" //from base of proc/randomize_human()
// /datum/species signals
#define COMSIG_SPECIES_GAIN "species_gain" //from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species)
@@ -355,19 +339,6 @@
#define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action)
#define COMPONENT_ACTION_BLOCK_TRIGGER 1
/*******Non-Signal Component Related Defines*******/
//Redirection component init flags
#define REDIRECT_TRANSFER_WITH_TURF 1
//Arch
#define ARCH_PROB "probability" //Probability for each item
#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount
//Ouch my toes!
#define CALTROP_BYPASS_SHOES 1
#define CALTROP_IGNORE_WALKERS 2
//Xenobio hotkeys
#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" //from slime CtrlClickOn(): (/mob)
#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" //from slime AltClickOn(): (/mob)
+1
View File
@@ -6,6 +6,7 @@
#define NO_ASSASSIN (1<<0)
#define WAROPS_ALWAYS_ALLOWED (1<<1)
#define USE_PREF_WEIGHTS (1<<2)
#define FORCE_IF_WON (1<<3)
#define ONLY_RULESET (1<<0)
#define HIGHLANDER_RULESET (1<<1)
+7 -2
View File
@@ -30,7 +30,7 @@
#define FLOOR(x, y) ( round((x) / (y)) * (y) )
// Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive
#define WRAP(val, min, max) ( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) )
#define WRAP(val, min, max) CLAMP(( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) ),min,max-1)
// Real modulus that handles decimals
#define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) )
@@ -201,4 +201,9 @@
#define RULE_OF_THREE(a, b, x) ((a*x)/b)
// )
#define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y))
#define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y))
#define LOGISTIC_FUNCTION(L,k,x,x_0) (L/(1+(NUM_E**(-k*(x-x_0)))))
/// Make sure something is a boolean TRUE/FALSE 1/0 value, since things like bitfield & bitflag doesn't always give 1s and 0s.
#define FORCE_BOOLEAN(x) ((x)? TRUE : FALSE)
+4 -5
View File
@@ -345,11 +345,10 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define COLOUR_PRIORITY_AMOUNT 4 //how many priority levels there are.
//Endgame Results
#define NUKE_NEAR_MISS 1
#define NUKE_MISS_STATION 2
#define NUKE_SYNDICATE_BASE 3
#define STATION_DESTROYED_NUKE 4
#define STATION_EVACUATED 5
#define NUKE_MISS_STATION 1
#define NUKE_SYNDICATE_BASE 2
#define STATION_DESTROYED_NUKE 3
#define STATION_EVACUATED 4
#define BLOB_WIN 8
#define BLOB_NUKE 9
#define BLOB_DESTROYED 10
+2 -1
View File
@@ -289,4 +289,5 @@
#define HUMAN_FIRE_STACK_ICON_NUM 3
#define PULL_PRONE_SLOWDOWN 0.6
#define HUMAN_CARRY_SLOWDOWN 0
#define FIREMAN_CARRY_SLOWDOWN 0
#define PIGGYBACK_CARRY_SLOWDOWN 1
+2 -1
View File
@@ -81,7 +81,8 @@
//Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam
#define MAX_MESSAGE_LEN 2048 //Citadel edit: What's the WORST that could happen?
#define MAX_FAVOR_LEN 4096 //double the maximum message length.
#define MAX_FLAVOR_LEN 4096 //double the maximum message length.
#define MAX_TASTE_LEN 40 //lick... vore... ew...
#define MAX_NAME_LEN 42
#define MAX_BROADCAST_LEN 512
#define MAX_CHARTER_LEN 80
+4
View File
@@ -53,6 +53,9 @@
#define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep
/// Blocks sprint
#define STATUS_EFFECT_STAGGERED /datum/status_effect/staggered
#define STATUS_EFFECT_TASED_WEAK /datum/status_effect/electrode //not as crippling, just slows down
#define STATUS_EFFECT_TASED /datum/status_effect/electrode/no_combat_mode //the affected has been tased, preventing fine muscle control
@@ -118,3 +121,4 @@
#define STATUS_EFFECT_RAINBOWPROTECTION /datum/status_effect/rainbow_protection //Invulnerable and pacifistic
#define STATUS_EFFECT_SLIMESKIN /datum/status_effect/slimeskin //Increased armor
#define STATUS_EFFECT_DNA_MELT /datum/status_effect/dna_melt //usually does something horrible to you when you hit 100 genetic instability
+18
View File
@@ -83,6 +83,7 @@
#define TRAIT_DISFIGURED "disfigured"
#define TRAIT_XENO_HOST "xeno_host" //Tracks whether we're gonna be a baby alien's mummy.
#define TRAIT_STUNIMMUNE "stun_immunity"
#define TRAIT_TASED_RESISTANCE "tased_resistance" //prevents you from suffering most of the effects of being tased
#define TRAIT_SLEEPIMMUNE "sleep_immunity"
#define TRAIT_PUSHIMMUNE "push_immunity"
#define TRAIT_SHOCKIMMUNE "shock_immunity"
@@ -130,6 +131,8 @@
#define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech"
#define TRAIT_SOOTHED_THROAT "soothed-throat"
#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism"
#define TRAIT_QUICK_CARRY "quick-carry"
#define TRAIT_QUICKER_CARRY "quicker-carry"
#define TRAIT_STRONG_GRABBER "strong_grabber"
#define TRAIT_CALCIUM_HEALER "calcium_healer"
#define TRAIT_MAGIC_CHOKE "magic_choke"
@@ -143,6 +146,7 @@
#define TRAIT_NOMARROW "nomarrow" // You don't make blood, with chemicals or nanites.
#define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat.
#define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events"
#define TRAIT_NO_MIDROUND_ANTAG "no-midround-antag" //can't be turned into an antag by random events
// mobility flag traits
// IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it)
@@ -158,6 +162,15 @@
#define TRAIT_SWIMMING "swimming" //only applied by /datum/element/swimming, for checking
/**
* COMBAT MODE/SPRINT MODE TRAITS
*/
/// Prevents combat mode from being active.
#define TRAIT_COMBAT_MODE_LOCKED "combatmode_locked"
/// Prevents sprinting from being active.
#define TRAIT_SPRINT_LOCKED "sprint_locked"
//non-mob traits
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
@@ -194,6 +207,8 @@
#define TRAIT_AUTO_CATCH_ITEM "auto_catch_item"
#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman.
#define TRAIT_FREESPRINT "free_sprinting"
#define TRAIT_XRAY_VISION "xray_vision"
#define TRAIT_THERMAL_VISION "thermal_vision"
#define TRAIT_NO_TELEPORT "no-teleport" //you just can't
#define TRAIT_NO_INTERNALS "no-internals"
#define TRAIT_NO_ALCOHOL "alcohol_intolerance"
@@ -219,10 +234,13 @@
#define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention
#define GHOSTROLE_TRAIT "ghostrole"
#define APHRO_TRAIT "aphro"
#define BLOODSUCKER_TRAIT "bloodsucker"
#define CLOTHING_TRAIT "clothing" //used for quirky carrygloves
// unique trait sources, still defines
#define STATUE_MUTE "statue"
#define CLONING_POD_TRAIT "cloning-pod"
#define VIRTUAL_REALITY_TRAIT "vr_trait"
#define CHANGELING_DRAIN "drain"
#define CHANGELING_HIVEMIND_MUTE "ling_mute"
#define ABYSSAL_GAZE_BLIND "abyssal_gaze"
+12
View File
@@ -5,6 +5,11 @@
#define MAJORITY_JUDGEMENT_VOTING 4
#define INSTANT_RUNOFF_VOTING 5
#define SHOW_RESULTS (1<<0)
#define SHOW_VOTES (1<<1)
#define SHOW_WINNER (1<<2)
#define SHOW_ABSTENTION (1<<3)
GLOBAL_LIST_INIT(vote_score_options,list("Bad","Poor","Acceptable","Good","Great"))
GLOBAL_LIST_INIT(vote_type_names,list(\
@@ -15,3 +20,10 @@ GLOBAL_LIST_INIT(vote_type_names,list(\
"Raw Score (returns results from 0 to 1, winner is 1)" = SCORE_VOTING,\
"Majority Judgement (single-winner score voting)" = MAJORITY_JUDGEMENT_VOTING,\
))
GLOBAL_LIST_INIT(display_vote_settings, list(\
"Results" = SHOW_RESULTS,
"Ongoing Votes" = SHOW_VOTES,
"Winner" = SHOW_WINNER,
"Abstainers" = SHOW_ABSTENTION
))
+4 -50
View File
@@ -58,15 +58,13 @@ GLOBAL_LIST_EMPTY(ipc_antennas_list)
//Genitals and Arousal Lists
GLOBAL_LIST_EMPTY(genitals_list)
GLOBAL_LIST_EMPTY(cock_shapes_list)
GLOBAL_LIST_EMPTY(gentlemans_organ_names)
GLOBAL_LIST_EMPTY(balls_shapes_list)
GLOBAL_LIST_EMPTY(breasts_size_list)
GLOBAL_LIST_EMPTY(breasts_shapes_list)
GLOBAL_LIST_EMPTY(vagina_shapes_list)
GLOBAL_LIST_INIT(cum_into_containers_list, list(/obj/item/reagent_containers/food/snacks/pie)) //Yer fuggin snowflake name list jfc
GLOBAL_LIST_INIT(dick_nouns, list("dick","cock","member","shaft"))
GLOBAL_LIST_INIT(cum_id_list,"semen")
GLOBAL_LIST_INIT(milk_id_list,"milk")
//longcat memes.
GLOBAL_LIST_INIT(dick_nouns, list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "One eyed trouser trout", "Ding dong", "ankle spanker", "Pork sword", "engine cranker", "Harry hot dog", "Davy Crockett", "Kidney cracker", "Heat seeking moisture missile", "Giggle stick", "love whistle", "Tube steak", "Uncle Dick", "Purple helmet warrior"))
GLOBAL_LIST_INIT(genitals_visibility_toggles, list(GEN_VISIBLE_ALWAYS, GEN_VISIBLE_NO_CLOTHES, GEN_VISIBLE_NO_UNDIES, GEN_VISIBLE_NEVER))
GLOBAL_LIST_INIT(dildo_shapes, list(
"Human" = "human",
@@ -107,38 +105,6 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
if(!src.holder) return
message_admins("[key_name_admin(usr)] manually reloaded mentors")
//Flavor Text
/mob/proc/set_flavor()
set name = "Set Flavor Text"
set desc = "Sets an extended description of your character's features."
set category = "IC"
var/new_flavor = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", flavor_text, MAX_FAVOR_LEN, TRUE)
if(!isnull(new_flavor))
flavor_text = html_decode(new_flavor)
to_chat(src, "Your flavor text has been updated.")
//Flavor Text
/mob/proc/set_flavor_2()
set name = "Set Temporary Flavor Text"
set desc = "Sets a description of your character's current appearance. Use this for emotions, poses etc."
set category = "IC"
var/new_flavor = stripped_multiline_input(usr, "Set the temporary flavor text in your 'examine' verb. This should be used only for things pertaining to the current round!", "Short-Term Flavor Text", flavor_text_2, MAX_FAVOR_LEN, TRUE)
if(!isnull(new_flavor))
flavor_text_2 = html_decode(new_flavor)
to_chat(src, "Your temporary flavor text has been updated.")
/mob/proc/print_flavor_text(flavor,temp = FALSE)
if(!flavor)
return
// We are decoding and then encoding to not only get correct amount of characters, but also to prevent partial escaping characters being shown.
var/msg = html_decode(replacetext(flavor, "\n", " "))
if(length_char(msg) <= 40)
return "<span class='notice'>[html_encode(msg)]</span>"
else
return "<span class='notice'>[html_encode(copytext_char(msg, 1, 37))]... <a href='?src=[REF(src)];flavor[temp ? "2" : ""]_more=1'>More...</span></a>"
//LOOC toggles
/client/verb/listen_looc()
set name = "Show/Hide LOOC"
@@ -171,18 +137,6 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
return TRUE
return FALSE
/mob/living/carbon/proc/has_ovipositor()
var/obj/item/organ/genital/G = getorganslot(ORGAN_SLOT_PENIS)
if(G && istype(G, /obj/item/organ/genital/ovipositor))
return TRUE
return FALSE
/mob/living/carbon/human/proc/has_eggsack()
var/obj/item/organ/genital/G = getorganslot(ORGAN_SLOT_TESTICLES)
if(G && istype(G, /obj/item/organ/genital/eggsack))
return TRUE
return FALSE
/mob/living/carbon/proc/is_groin_exposed(list/L)
if(!L)
L = get_equipped_items()
+12
View File
@@ -0,0 +1,12 @@
//////////////////////////////////////////////////////////
//A bunch of helpers to make genetics less of a headache//
//////////////////////////////////////////////////////////
#define GET_INITIALIZED_MUTATION(A) GLOB.all_mutations[A]
#define GET_GENE_STRING(A, B) (B.mutation_index[A])
#define GET_SEQUENCE(A) (GLOB.full_sequences[A])
#define GET_MUTATION_STABILIZER(A) ((A.stabilizer_coeff < 0) ? 1 : A.stabilizer_coeff)
#define GET_MUTATION_SYNCHRONIZER(A) ((A.synchronizer_coeff < 0) ? 1 : A.synchronizer_coeff)
#define GET_MUTATION_POWER(A) ((A.power_coeff < 0) ? 1 : A.power_coeff)
#define GET_MUTATION_ENERGY(A) ((A.energy_coeff < 0) ? 1 : A.energy_coeff)
+1 -1
View File
@@ -425,7 +425,7 @@
candidates -= M
/proc/pollGhostCandidates(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE)
var/datum/element/ghost_role_eligibility/eligibility = SSdcs.GetElement(/datum/element/ghost_role_eligibility)
var/datum/element/ghost_role_eligibility/eligibility = SSdcs.GetElement(list(/datum/element/ghost_role_eligibility))
var/list/candidates = eligibility.get_all_ghost_role_eligible()
return pollCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category, flashwindow, candidates)
-6
View File
@@ -54,12 +54,6 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list)
GLOB.breasts_size_list = list ("a", "b", "c", "d", "e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ",
"cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret",
"baloney pony", "schlanger", "Mutton dagger", "old blind bob","Hanging Johnny", "fishing rod", "Tally whacker", "polly rocket",
"One eyed trouser trout", "Ding dong", "ankle spanker", "Pork sword", "engine cranker", "Harry hot dog", "Davy Crockett",
"Kidney cracker", "Heat seeking moisture missile", "Giggle stick", "love whistle", "Tube steak", "Uncle Dick", "Purple helmet warrior")
for(var/gpath in subtypesof(/obj/item/organ/genital))
var/obj/item/organ/genital/G = gpath
+10 -26
View File
@@ -181,50 +181,34 @@
"genitals_use_skintone" = FALSE,
"has_cock" = FALSE,
"cock_shape" = pick(GLOB.cock_shapes_list),
"cock_length" = 6,
"cock_length" = COCK_SIZE_DEF,
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"has_sheath" = FALSE,
"sheath_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"has_balls" = FALSE,
"balls_internal" = FALSE,
"balls_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"balls_amount" = 2,
"balls_sack_size" = BALLS_SACK_SIZE_DEF,
"balls_size" = BALLS_SIZE_DEF,
"balls_shape" = "Single",
"balls_shape" = DEF_BALLS_SHAPE,
"balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT,
"balls_efficiency" = CUM_EFFICIENCY,
"has_ovi" = FALSE,
"ovi_shape" = "knotted",
"ovi_length" = 6,
"ovi_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"has_eggsack" = FALSE,
"eggsack_internal" = TRUE,
"eggsack_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"eggsack_size" = BALLS_SACK_SIZE_DEF,
"eggsack_egg_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"eggsack_egg_size" = EGG_GIRTH_DEF,
"has_breasts" = FALSE,
"breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"breasts_size" = pick(GLOB.breasts_size_list),
"breasts_shape" = "Pair",
"breasts_size" = pick(CONFIG_GET(keyed_list/breasts_cups_prefs)),
"breasts_shape" = DEF_BREASTS_SHAPE,
"breasts_producing" = FALSE,
"has_vag" = FALSE,
"vag_shape" = pick(GLOB.vagina_shapes_list),
"vag_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"vag_clits" = 1,
"vag_clit_diam" = 0.25,
"vag_clit_len" = 0.25,
"has_womb" = FALSE,
"womb_cum_rate" = CUM_RATE,
"womb_cum_mult" = CUM_RATE_MULT,
"womb_efficiency" = CUM_EFFICIENCY,
"balls_visibility" = GEN_VISIBLE_NO_UNDIES,
"breasts_visibility"= GEN_VISIBLE_NO_UNDIES,
"cock_visibility" = GEN_VISIBLE_NO_UNDIES,
"vag_visibility" = GEN_VISIBLE_NO_UNDIES,
"ipc_screen" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None",
"ipc_antenna" = "None",
"flavor_text" = "",
"meat_type" = "Mammalian"
"meat_type" = "Mammalian",
"body_model" = MALE
))
/proc/random_hair_style(gender)
+4 -2
View File
@@ -1426,7 +1426,9 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/proc/get_random_drink()
var/list/blocked = list(/obj/item/reagent_containers/food/drinks/soda_cans,
/obj/item/reagent_containers/food/drinks/bottle
/obj/item/reagent_containers/food/drinks/bottle,
/obj/item/reagent_containers/food/drinks/flask/russian,
/obj/item/reagent_containers/food/drinks/flask/steel
)
return pick(subtypesof(/obj/item/reagent_containers/food/drinks) - blocked)
@@ -1562,4 +1564,4 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
channels_to_use += channel
if(channels_to_use.len)
world.TgsChatBroadcast()
world.TgsChatBroadcast()
+11
View File
@@ -238,5 +238,16 @@ GLOBAL_LIST_INIT(bitfields, list(
"MOBILITY_PULL" = MOBILITY_PULL,
"MOBILITY_HOLD" = MOBILITY_HOLD,
"MOBILITY_RESIST" = MOBILITY_RESIST
),
"combat_flags" = list(
"COMBAT_FLAG_COMBAT_TOGGLED" = COMBAT_FLAG_COMBAT_TOGGLED,
"COMBAT_FLAG_SPRINT_TOGGLED" = COMBAT_FLAG_SPRINT_TOGGLED,
"COMBAT_FLAG_COMBAT_ACTIVE" = COMBAT_FLAG_COMBAT_ACTIVE,
"COMBAT_FLAG_SPRINT_ACTIVE" = COMBAT_FLAG_SPRINT_ACTIVE,
"COMBAT_FLAG_ATTEMPTING_CRAWL" = COMBAT_FLAG_ATTEMPTING_CRAWL,
"COMBAT_FLAG_HARD_STAMCRIT" = COMBAT_FLAG_HARD_STAMCRIT,
"COMBAT_FLAG_SOFT_STAMCRIT" = COMBAT_FLAG_SOFT_STAMCRIT,
"COMBAT_FLAG_INTENTIONALLY_RESTING" = COMBAT_FLAG_INTENTIONALLY_RESTING,
"COMBAT_FLAG_RESISTING_REST" = COMBAT_FLAG_RESISTING_REST
)
))
+5 -2
View File
@@ -21,8 +21,11 @@ GLOBAL_LIST(op_se_blocks)
GLOBAL_VAR(NULLED_SE)
GLOBAL_VAR(NULLED_UI)
GLOBAL_LIST_EMPTY(global_mutations) // list of hidden mutation things
GLOBAL_LIST_EMPTY(all_mutations)
GLOBAL_LIST_EMPTY(full_sequences)
GLOBAL_LIST_EMPTY(bad_mutations)
GLOBAL_LIST_EMPTY(good_mutations)
GLOBAL_LIST_EMPTY(not_good_mutations)
GLOBAL_LIST_EMPTY(not_good_mutations)
GLOBAL_LIST_EMPTY(mutation_recipes)
+1 -1
View File
@@ -36,7 +36,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/clothing/head/welding = 1,
/obj/item/clothing/mask/gas = 15,
/obj/item/clothing/suit/hazardvest = 1,
/obj/item/clothing/under/rank/vice = 1,
/obj/item/clothing/under/misc/vice_officer = 1,
/obj/item/clothing/suit/hooded/flashsuit = 2,
/obj/item/clothing/accessory/medal/greytide = 1,
/obj/item/assembly/prox_sensor = 4,
+2 -2
View File
@@ -152,10 +152,10 @@
else
if(ismob(A))
changeNext_move(CLICK_CD_MELEE)
UnarmedAttack(A,1)
UnarmedAttack(A, 1)
else
if(W)
W.afterattack(A,src,0,params)
W.ranged_attack_chain(src, A, params)
else
RangedAttack(A,params)
+11
View File
@@ -163,3 +163,14 @@
#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24"
#define ui_ghost_teleport "SOUTH:6,CENTER+1:24"
#define ui_ghost_pai "SOUTH: 6, CENTER+2:24"
//UI position overrides for 1:1 screen layout. (default is 7:5)
#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button
#define ui_overridden_resist "EAST-3:24,SOUTH+1:7"
#define ui_combat_toggle "EAST-4:22,SOUTH:5"
#define ui_boxcraft "EAST-4:22,SOUTH+1:6"
#define ui_boxarea "EAST-4:6,SOUTH+1:6"
#define ui_boxlang "EAST-5:22,SOUTH+1:6"
#define ui_boxvore "EAST-5:22,SOUTH+1:6"
+1 -1
View File
@@ -128,7 +128,7 @@
//CITADEL CHANGES - sprint button
using = new /obj/screen/sprintbutton
using.icon = tg_ui_icon_to_cit_ui(ui_style)
using.icon_state = (owner.sprinting ? "act_sprint_on" : "act_sprint")
using.icon_state = ((owner.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) ? "act_sprint_on" : "act_sprint")
using.screen_loc = ui_movi
using.hud = src
static_inventory += using
+50 -16
View File
@@ -8,12 +8,15 @@
*afterattack. The return value does not matter.
*/
/obj/item/proc/melee_attack_chain(mob/user, atom/target, params)
if(item_flags & NO_ATTACK_CHAIN_SOFT_STAMCRIT)
if(isliving(user))
var/mob/living/L = user
if(L.getStaminaLoss() >= STAMINA_SOFTCRIT)
if(isliving(user))
var/mob/living/L = user
if(item_flags & NO_ATTACK_CHAIN_SOFT_STAMCRIT)
if(IS_STAMCRIT(L))
to_chat(L, "<span class='warning'>You are too exhausted to swing [src]!</span>")
return
if(!CHECK_MOBILITY(L, MOBILITY_USE))
to_chat(L, "<span class='warning'>You are unable to swing [src] right now!</span>")
return
if(tool_behaviour && target.tool_act(user, src, tool_behaviour))
return
if(pre_attack(target, user, params))
@@ -24,6 +27,15 @@
return
afterattack(target, user, TRUE, params)
/// Like melee_attack_chain but for ranged.
/obj/item/proc/ranged_attack_chain(mob/user, atom/target, params)
if(isliving(user))
var/mob/living/L = user
if(!CHECK_MOBILITY(L, MOBILITY_USE))
to_chat(L, "<span class='warning'>You are unable to raise [src] right now!</span>")
return
afterattack(target, user, FALSE, params)
// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
/obj/item/proc/attack_self(mob/user)
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) & COMPONENT_NO_INTERACT)
@@ -50,7 +62,6 @@
user.changeNext_move(CLICK_CD_MELEE)
return I.attack(src, user)
/obj/item/proc/attack(mob/living/M, mob/living/user)
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) & COMPONENT_ITEM_NO_ATTACK)
return
@@ -58,7 +69,7 @@
if(item_flags & NOBLUDGEON)
return
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit
if(IS_STAMCRIT(user)) // CIT CHANGE - makes it impossible to attack in stamina softcrit
to_chat(user, "<span class='warning'>You're too exhausted.</span>") // CIT CHANGE - ditto
return // CIT CHANGE - ditto
@@ -88,7 +99,7 @@
return
if(item_flags & NOBLUDGEON)
return
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) // CIT CHANGE - makes it impossible to attack in stamina softcrit
if(IS_STAMCRIT(user)) // CIT CHANGE - makes it impossible to attack in stamina softcrit
to_chat(user, "<span class='warning'>You're too exhausted.</span>") // CIT CHANGE - ditto
return // CIT CHANGE - ditto
user.adjustStaminaLossBuffered(getweight()*1.2)//CIT CHANGE - makes attacking things cause stamina loss
@@ -109,27 +120,22 @@
/mob/living/attacked_by(obj/item/I, mob/living/user)
//CIT CHANGES START HERE - combatmode and resting checks
var/totitemdamage = I.force
if(iscarbon(user))
var/mob/living/carbon/tempcarb = user
if(!tempcarb.combatmode)
totitemdamage *= 0.5
if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
totitemdamage *= 0.5
if(!CHECK_MOBILITY(user, MOBILITY_STAND))
totitemdamage *= 0.5
//CIT CHANGES END HERE
if(user != src && check_shields(I, totitemdamage, "the [I.name]", MELEE_ATTACK, I.armour_penetration))
return FALSE
send_item_attack_message(I, user)
I.do_stagger_action(src, user)
if(I.force)
apply_damage(totitemdamage, I.damtype) //CIT CHANGE - replaces I.force with totitemdamage
if(I.damtype == BRUTE && !HAS_TRAIT(src, TRAIT_NOMARROW))
if(prob(33))
I.add_mob_blood(src)
var/turf/location = get_turf(src)
if(iscarbon(src))
var/mob/living/carbon/C = src
C.bleed(totitemdamage)
else
add_splatter_floor(location)
add_splatter_floor(location)
if(totitemdamage >= 10 && get_dist(user, src) <= 1) //people with TK won't get smeared with blood
user.add_mob_blood(src)
return TRUE //successful attack
@@ -172,5 +178,33 @@
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
return 1
/// How much stamina this takes to swing this is not for realism purposes hecc off.
/obj/item/proc/getweight()
return total_mass || w_class * 1.25
/// How long this staggers for. 0 and negatives supported.
/obj/item/proc/melee_stagger_duration()
if(!isnull(stagger_force))
return stagger_force
/// totally not an untested, arbitrary equation.
return clamp((1.5 + (w_class/7.5)) * (force / 2), 0, 10 SECONDS)
/obj/item/proc/do_stagger_action(mob/living/target, mob/living/user)
if(!CHECK_BITFIELD(target.status_flags, CANSTAGGER))
return FALSE
if(target.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
target.do_staggered_animation()
var/duration = melee_stagger_duration()
if(!duration) //0
return FALSE
else if(duration > 0)
target.Stagger(duration)
else //negative
target.AdjustStaggered(duration)
return TRUE
/mob/proc/do_staggered_animation()
set waitfor = FALSE
animate(src, pixel_x = -2, pixel_y = -2, time = 1, flags = ANIMATION_RELATIVE | ANIMATION_PARALLEL)
animate(pixel_x = 4, pixel_y = 4, time = 1, flags = ANIMATION_RELATIVE)
animate(pixel_x = -2, pixel_y = -2, time = 0.5, flags = ANIMATION_RELATIVE)
+2 -2
View File
@@ -20,7 +20,7 @@
var/override = 0
for(var/datum/mutation/human/HM in dna.mutations)
override += HM.on_attack_hand(src, A, proximity)
override += HM.on_attack_hand(A, proximity)
if(override)
return
@@ -95,7 +95,7 @@
return
for(var/datum/mutation/human/HM in dna.mutations)
HM.on_ranged_attack(src, A, mouseparams)
HM.on_ranged_attack(A, mouseparams)
if(isturf(A) && get_dist(src,A) <= 1)
src.Move_Pulled(A)
@@ -371,19 +371,18 @@
for(var/T in storyteller_cache)
var/datum/dynamic_storyteller/S = T
var/config_tag = initial(S.config_tag)
var/final_weight = initial(S.weight)
if(probabilities[config_tag]<=0)
var/probability = (config_tag in probabilities) ? probabilities[config_tag] : initial(S.weight)
if(probability <= 0)
continue
final_weight = probabilities[config_tag]
if(SSpersistence.saved_storytellers.len == 3 && repeated_mode_adjust.len == 3)
if(SSpersistence.saved_storytellers.len == repeated_mode_adjust.len)
var/name = initial(S.name)
var/recent_round = min(SSpersistence.saved_storytellers.Find(name),3)
var/adjustment = 0
while(recent_round)
adjustment += repeated_mode_adjust[recent_round]
recent_round = SSpersistence.saved_modes.Find(name,recent_round+1,0)
final_weight *= ((100-adjustment)/100)
runnable_storytellers[S] = final_weight
probability *= ((100-adjustment)/100)
runnable_storytellers[S] = probability
return runnable_storytellers
@@ -396,6 +396,10 @@
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_NUM
/datum/config_entry/keyed_list/job_threat
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_NUM
/datum/config_entry/number/monkeycap
config_entry_value = 64
min_val = 0
@@ -423,3 +427,21 @@
config_entry_value = 3
/datum/config_entry/flag/suicide_allowed
/datum/config_entry/keyed_list/breasts_cups_prefs
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_FLAG
config_entry_value = list("a", "b", "c", "d", "e") //keep these lowercase
/datum/config_entry/number/penis_min_inches_prefs
config_entry_value = 1
min_val = 0
/datum/config_entry/number/penis_max_inches_prefs
config_entry_value = 20
min_val = 0
/datum/config_entry/keyed_list/safe_visibility_toggles
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_FLAG
config_entry_value = list(GEN_VISIBLE_NO_CLOTHES, GEN_VISIBLE_NO_UNDIES, GEN_VISIBLE_NEVER) //refer to cit_helpers for all toggles.
@@ -82,17 +82,23 @@
config_entry_value = 600
min_val = 0
/datum/config_entry/number/vote_autotransfer_initial //length of time before the first autotransfer vote is called (deciseconds, default 2 hours)
/// Length of time before the first autotransfer vote is called (deciseconds, default 2 hours)
/// Set to 0 to disable the subsystem altogether.
/datum/config_entry/number/vote_autotransfer_initial
config_entry_value = 72000
min_val = 0
/datum/config_entry/number/vote_autotransfer_interval //length of time to wait before subsequent autotransfer votes (deciseconds, default 30 minutes)
///length of time to wait before subsequent autotransfer votes (deciseconds, default 30 minutes)
/datum/config_entry/number/vote_autotransfer_interval
config_entry_value = 18000
min_val = 0
/datum/config_entry/number/vote_autotransfer_maximum // maximum extensions until the round autoends
/// maximum extensions until the round autoends.
/// Set to 0 to force automatic crew transfer after the 'vote_autotransfer_initial' elapsed.
/// Set to -1 to disable the maximum extensions cap.
/datum/config_entry/number/vote_autotransfer_maximum
config_entry_value = 4
min_val = 0
min_val = -1
/datum/config_entry/flag/default_no_vote // vote does not default to nochange/norestart
@@ -459,3 +465,6 @@
/datum/config_entry/number/max_bunker_days
config_entry_value = 7
min_val = 1
/datum/config_entry/flag/minimaps_enabled
config_entry_value = TRUE
+3 -5
View File
@@ -257,8 +257,7 @@ SUBSYSTEM_DEF(air)
T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY)
#endif
T.excited = TRUE
active_turfs |= T
SSair_turfs.currentrun |= T
active_turfs[T] = SSair_turfs.currentrun[T] = TRUE
if(blockchanges && T.excited_group)
T.excited_group.garbage_collect()
add_to_react_queue(T)
@@ -274,10 +273,9 @@ SUBSYSTEM_DEF(air)
/datum/controller/subsystem/air/proc/add_to_react_queue(turf/open/T)
if(istype(T) && T.air)
turf_react_queue |= T
turf_react_queue[T] = TRUE
if(currentpart == SSAIR_REACTQUEUE)
currentrun |= T
return
currentrun[T] = TRUE
/datum/controller/subsystem/air/proc/remove_from_react_queue(turf/open/T)
turf_react_queue -= T
+13 -10
View File
@@ -16,7 +16,7 @@ SUBSYSTEM_DEF(atoms)
/datum/controller/subsystem/atoms/Initialize(timeofday)
GLOB.fire_overlay.appearance_flags = RESET_COLOR
setupGenetics() //to set the mutations' place in structural enzymes, so monkey.initialize() knows where to put the monkey mutation.
setupGenetics() //to set the mutations' sequence.
initialized = INITIALIZATION_INNEW_MAPLOAD
InitializeAtoms()
return ..()
@@ -108,16 +108,19 @@ SUBSYSTEM_DEF(atoms)
BadInitializeCalls = SSatoms.BadInitializeCalls
/datum/controller/subsystem/atoms/proc/setupGenetics()
var/list/avnums = new /list(DNA_STRUC_ENZYMES_BLOCKS)
for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++)
avnums[i] = i
CHECK_TICK
for(var/A in subtypesof(/datum/mutation/human))
var/datum/mutation/human/B = new A()
if(B.dna_block == NON_SCANNABLE)
var/list/mutations = subtypesof(/datum/mutation/human)
shuffle_inplace(mutations)
for(var/A in subtypesof(/datum/generecipe))
var/datum/generecipe/GR = A
GLOB.mutation_recipes[initial(GR.required)] = initial(GR.result)
for(var/i in 1 to LAZYLEN(mutations))
var/path = mutations[i] //byond gets pissy when we do it in one line
var/datum/mutation/human/B = new path ()
B.alias = "Mutation #[i]"
GLOB.all_mutations[B.type] = B
GLOB.full_sequences[B.type] = generate_gene_sequence(B.blocks)
if(B.locked)
continue
B.dna_block = pick_n_take(avnums)
if(B.quality == POSITIVE)
GLOB.good_mutations |= B
else if(B.quality == NEGATIVE)
+21 -8
View File
@@ -1,3 +1,5 @@
#define NO_MAXVOTES_CAP -1
SUBSYSTEM_DEF(autotransfer)
name = "Autotransfer Vote"
flags = SS_KEEP_TIMING | SS_BACKGROUND
@@ -7,21 +9,32 @@ SUBSYSTEM_DEF(autotransfer)
var/targettime
var/voteinterval
var/maxvotes
var/curvotes
var/curvotes = 0
/datum/controller/subsystem/autotransfer/Initialize(timeofday)
var/init_vote = CONFIG_GET(number/vote_autotransfer_initial)
if(!init_vote) //Autotransfer voting disabled.
can_fire = FALSE
return ..()
starttime = world.time
targettime = starttime + CONFIG_GET(number/vote_autotransfer_initial)
targettime = starttime + init_vote
voteinterval = CONFIG_GET(number/vote_autotransfer_interval)
maxvotes = CONFIG_GET(number/vote_autotransfer_maximum)
curvotes = 0
return ..()
/datum/controller/subsystem/autotransfer/Recover()
starttime = SSautotransfer.starttime
voteinterval = SSautotransfer.voteinterval
curvotes = SSautotransfer.curvotes
/datum/controller/subsystem/autotransfer/fire()
if(maxvotes > curvotes)
if(world.time > targettime)
SSvote.initiate_vote("transfer",null) //TODO figure out how to not use null as the user
targettime = targettime + voteinterval
curvotes += 1
if(world.time < targettime)
return
if(maxvotes == NO_MAXVOTES_CAP || maxvotes > curvotes)
SSvote.initiate_vote("transfer","server")
targettime = targettime + voteinterval
curvotes++
else
SSshuttle.autoEnd()
#undef NO_MAXVOTES_CAP
+38 -12
View File
@@ -1,27 +1,53 @@
PROCESSING_SUBSYSTEM_DEF(dcs)
name = "Datum Component System"
flags = SS_NO_INIT
var/list/elements_by_type = list()
/datum/controller/subsystem/processing/dcs/Recover()
comp_lookup = SSdcs.comp_lookup
/datum/controller/subsystem/processing/dcs/proc/GetElement(datum/element/eletype, ...)
/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments)
var/datum/element/eletype = arguments[1]
var/element_id = eletype
if(!ispath(eletype, /datum/element))
CRASH("Attempted to instantiate [eletype] as a /datum/element")
if(initial(eletype.element_flags) & ELEMENT_BESPOKE)
var/list/fullid = list("[eletype]")
for(var/i in initial(eletype.id_arg_index) to length(args))
var/argument = args[i]
if(istext(argument) || isnum(argument))
fullid += "[argument]"
else
fullid += "[REF(argument)]"
element_id = fullid.Join("&")
element_id = GetIdFromArguments(arguments)
. = elements_by_type[element_id]
if(.)
return
if(!ispath(eletype, /datum/element))
CRASH("Attempted to instantiate [eletype] as a /datum/element")
. = elements_by_type[element_id] = new eletype
. = elements_by_type[element_id] = new eletype
/****
* Generates an id for bespoke elements when given the argument list
* Generating the id here is a bit complex because we need to support named arguments
* Named arguments can appear in any order and we need them to appear after ordered arguments
* We assume that no one will pass in a named argument with a value of null
**/
/datum/controller/subsystem/processing/dcs/proc/GetIdFromArguments(list/arguments)
var/datum/element/eletype = arguments[1]
var/list/fullid = list("[eletype]")
var/list/named_arguments = list()
for(var/i in initial(eletype.id_arg_index) to length(arguments))
var/key = arguments[i]
var/value
if(istext(key))
value = arguments[key]
if(!(istext(key) || isnum(key)))
key = REF(key)
key = "[key]" // Key is stringified so numbers dont break things
if(!isnull(value))
if(!(istext(value) || isnum(value)))
value = REF(value)
named_arguments["[key]"] = value
else
fullid += "[key]"
if(length(named_arguments))
named_arguments = sortList(named_arguments)
fullid += named_arguments
return list2params(fullid)
+2 -1
View File
@@ -66,6 +66,7 @@ SUBSYSTEM_DEF(job)
/datum/controller/subsystem/job/proc/GetJob(rank)
RETURN_TYPE(/datum/job)
if(!occupations.len)
SetupOccupations()
return name_occupations[rank]
@@ -738,4 +739,4 @@ SUBSYSTEM_DEF(job)
. |= player.mind
/datum/controller/subsystem/job/proc/JobDebug(message)
log_job_debug(message)
log_job_debug(message)
+1 -1
View File
@@ -103,7 +103,7 @@ SUBSYSTEM_DEF(jukeboxes)
for(var/mob/M in GLOB.player_list)
if(!M.client)
continue
if(!(M.client.prefs.toggles & SOUND_INSTRUMENTS))
if(!(M.client.prefs.toggles & SOUND_INSTRUMENTS) || !M.can_hear())
M.stop_sound_channel(jukeinfo[2])
continue
+20
View File
@@ -0,0 +1,20 @@
SUBSYSTEM_DEF(minimaps)
name = "Minimaps"
flags = SS_NO_FIRE
var/list/station_minimaps
var/datum/minimap_group/station_minimap
/datum/controller/subsystem/minimaps/Initialize()
if(!CONFIG_GET(flag/minimaps_enabled))
to_chat(world, "<span class='boldwarning'>Minimaps disabled! Skipping init.</span>")
return ..()
build_minimaps()
return ..()
/datum/controller/subsystem/minimaps/proc/build_minimaps()
station_minimaps = list()
for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION))
var/datum/space_level/SL = SSmapping.get_level(z)
var/name = (SL.name == initial(SL.name))? "[z] - Station" : "[z] - [SL.name]"
station_minimaps += new /datum/minimap(z, name = name)
station_minimap = new(station_minimaps, "Station")
@@ -37,11 +37,11 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
if(job?.blacklisted_quirks)
cut = filter_quirks(my_quirks, job.blacklisted_quirks)
for(var/V in my_quirks)
var/datum/quirk/Q = quirks[V]
if(Q)
if(V in quirks)
var/datum/quirk/Q = quirks[V]
user.add_quirk(Q, spawn_effects)
else
stack_trace("Invalid quirk \"[V]\" in client [cli.ckey] preferences")
log_admin("Invalid quirk \"[V]\" in client [cli.ckey] preferences")
cli.prefs.all_quirks -= V
badquirk = TRUE
if(badquirk)
@@ -85,7 +85,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
our_quirks -= i
cut += i
pointscut += quirk_points_by_name(i)
if (pointscut >= 0) //with how it works, it needs to be above zero, not below, as points for positive is positive, and negative is negative, we only want it to break if it's above zero, ie. we cut more positive than negative
if (pointscut >= 0)
break
/* //Code to automatically reduce positive quirks until balance is even.
var/points_used = total_points(our_quirks)
@@ -102,7 +102,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
*/
//Nah, let's null all non-neutrals out.
if (pointscut != 0)// only if the pointscutting didn't work.
if (pointscut < 0)// only if the pointscutting didn't work.
if(cut.len)
for(var/i in our_quirks)
if(quirk_points_by_name(i) != 0)
@@ -0,0 +1,3 @@
PROCESSING_SUBSYSTEM_DEF(status_effects)
wait = 1
flags = SS_TICKER
+7 -7
View File
@@ -479,15 +479,15 @@ SUBSYSTEM_DEF(ticker)
var/vote_type = CONFIG_GET(string/map_vote_type)
switch(vote_type)
if("PLURALITY")
SSvote.initiate_vote("map","server",hideresults=TRUE)
SSvote.initiate_vote("map","server", display = SHOW_RESULTS)
if("APPROVAL")
SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = APPROVAL_VOTING)
SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = APPROVAL_VOTING)
if("IRV")
SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = INSTANT_RUNOFF_VOTING)
SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = INSTANT_RUNOFF_VOTING)
if("SCORE")
SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = MAJORITY_JUDGEMENT_VOTING)
SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = MAJORITY_JUDGEMENT_VOTING)
else
SSvote.initiate_vote("map","server",hideresults=TRUE)
SSvote.initiate_vote("map","server", display = SHOW_RESULTS)
// fallback
/datum/controller/subsystem/ticker/proc/HasRoundStarted()
@@ -503,9 +503,9 @@ SUBSYSTEM_DEF(ticker)
SSticker.modevoted = TRUE
var/dynamic = CONFIG_GET(flag/dynamic_voting)
if(dynamic)
SSvote.initiate_vote("dynamic","server",hideresults=TRUE,votesystem=SCORE_VOTING,forced=TRUE,vote_time = 20 MINUTES)
SSvote.initiate_vote("dynamic", "server", display = NONE, votesystem = SCORE_VOTING, forced = TRUE,vote_time = 20 MINUTES)
else
SSvote.initiate_vote("roundtype","server",hideresults=TRUE,votesystem=PLURALITY_VOTING,forced=TRUE, \
SSvote.initiate_vote("roundtype", "server", display = NONE, votesystem = PLURALITY_VOTING, forced=TRUE, \
vote_time = (CONFIG_GET(flag/modetier_voting) ? 1 MINUTES : 20 MINUTES))
/datum/controller/subsystem/ticker/Recover()
+22 -22
View File
@@ -69,12 +69,12 @@ SUBSYSTEM_DEF(traumas)
"spiders" = typecacheof(list(/obj/structure/spider)),
"security" = typecacheof(list(/obj/item/clothing/under/rank/security, /obj/item/clothing/under/rank/warden,
/obj/item/clothing/under/rank/head_of_security, /obj/item/clothing/under/rank/det,
"security" = typecacheof(list(/obj/item/clothing/under/rank/security/officer, /obj/item/clothing/under/rank/security/warden,
/obj/item/clothing/under/rank/security/head_of_security, /obj/item/clothing/under/rank/security/detective,
/obj/item/melee/baton, /obj/item/gun/energy/taser, /obj/item/restraints/handcuffs,
/obj/machinery/door/airlock/security, /obj/effect/hallucination/simple/securitron)),
"clowns" = typecacheof(list(/obj/item/clothing/under/rank/clown, /obj/item/clothing/shoes/clown_shoes,
"clowns" = typecacheof(list(/obj/item/clothing/under/rank/civilian/clown, /obj/item/clothing/shoes/clown_shoes,
/obj/item/clothing/mask/gas/clown_hat, /obj/item/instrument/bikehorn,
/obj/item/pda/clown, /obj/item/grown/bananapeel)),
@@ -87,15 +87,15 @@ SUBSYSTEM_DEF(traumas)
"skeletons" = typecacheof(list(/obj/item/organ/tongue/bone, /obj/item/clothing/suit/armor/bone, /obj/item/stack/sheet/bone,
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton,
/obj/effect/decal/remains/human)),
"conspiracies" = typecacheof(list(/obj/item/clothing/under/rank/captain, /obj/item/clothing/under/rank/head_of_security,
/obj/item/clothing/under/rank/chief_engineer, /obj/item/clothing/under/rank/chief_medical_officer,
/obj/item/clothing/under/rank/head_of_personnel, /obj/item/clothing/under/rank/research_director,
/obj/item/clothing/under/rank/head_of_security/grey, /obj/item/clothing/under/rank/head_of_security/alt,
/obj/item/clothing/under/rank/research_director/alt, /obj/item/clothing/under/rank/research_director/turtleneck,
/obj/item/clothing/under/captainparade, /obj/item/clothing/under/hosparademale, /obj/item/clothing/under/hosparadefem,
"conspiracies" = typecacheof(list(/obj/item/clothing/under/rank/captain, /obj/item/clothing/under/rank/security/head_of_security,
/obj/item/clothing/under/rank/engineering/chief_engineer, /obj/item/clothing/under/rank/medical/chief_medical_officer,
/obj/item/clothing/under/rank/civilian/head_of_personnel, /obj/item/clothing/under/rank/rnd/research_director,
/obj/item/clothing/under/rank/security/head_of_security/grey, /obj/item/clothing/under/rank/security/head_of_security/alt,
/obj/item/clothing/under/rank/rnd/research_director/alt, /obj/item/clothing/under/rank/rnd/research_director/turtleneck,
/obj/item/clothing/under/rank/captain/parade, /obj/item/clothing/under/rank/security/head_of_security/parade, /obj/item/clothing/under/rank/security/head_of_security/parade/female,
/obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/abductor/baton,
/obj/item/storage/belt/military/abductor, /obj/item/gun/energy/alien, /obj/item/abductor/silencer,
/obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom_officer,
/obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom/officer,
/obj/item/clothing/suit/space/hardsuit/ert, /obj/item/clothing/suit/space/hardsuit/ert/sec,
/obj/item/clothing/suit/space/hardsuit/ert/engi, /obj/item/clothing/suit/space/hardsuit/ert/med,
/obj/item/clothing/suit/space/hardsuit/deathsquad, /obj/item/clothing/head/helmet/space/hardsuit/deathsquad,
@@ -103,8 +103,8 @@ SUBSYSTEM_DEF(traumas)
"robots" = typecacheof(list(/obj/machinery/computer/upload, /obj/item/aiModule/, /obj/machinery/recharge_station,
/obj/item/aicard, /obj/item/deactivated_swarmer, /obj/effect/mob_spawn/swarmer)),
"doctors" = typecacheof(list(/obj/item/clothing/under/rank/medical, /obj/item/clothing/under/rank/chemist,
/obj/item/clothing/under/rank/nursesuit, /obj/item/clothing/under/rank/chief_medical_officer,
"doctors" = typecacheof(list(/obj/item/clothing/under/rank/medical/doctor, /obj/item/clothing/under/rank/medical/chemist,
/obj/item/clothing/under/rank/medical/doctor/nurse, /obj/item/clothing/under/rank/medical/chief_medical_officer,
/obj/item/reagent_containers/syringe, /obj/item/reagent_containers/pill/, /obj/item/reagent_containers/hypospray,
/obj/item/storage/firstaid, /obj/item/storage/pill_bottle, /obj/item/healthanalyzer,
/obj/structure/sign/departments/medbay, /obj/machinery/door/airlock/medical, /obj/machinery/sleeper,
@@ -112,10 +112,10 @@ SUBSYSTEM_DEF(traumas)
/obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw,
/obj/item/clothing/suit/bio_suit/plaguedoctorsuit, /obj/item/clothing/head/plaguedoctorhat, /obj/item/clothing/mask/gas/plaguedoctor)),
"authority" = typecacheof(list(/obj/item/clothing/under/rank/captain, /obj/item/clothing/under/rank/head_of_personnel,
/obj/item/clothing/under/rank/head_of_security, /obj/item/clothing/under/rank/research_director,
/obj/item/clothing/under/rank/chief_medical_officer, /obj/item/clothing/under/rank/chief_engineer,
/obj/item/clothing/under/rank/centcom_officer, /obj/item/clothing/under/rank/centcom_commander,
"authority" = typecacheof(list(/obj/item/clothing/under/rank/captain, /obj/item/clothing/under/rank/civilian/head_of_personnel,
/obj/item/clothing/under/rank/security/head_of_security, /obj/item/clothing/under/rank/rnd/research_director,
/obj/item/clothing/under/rank/medical/chief_medical_officer, /obj/item/clothing/under/rank/engineering/chief_engineer,
/obj/item/clothing/under/rank/centcom/officer, /obj/item/clothing/under/rank/centcom/commander,
/obj/item/melee/classic_baton/telescopic, /obj/item/card/id/silver, /obj/item/card/id/gold,
/obj/item/card/id/captains_spare, /obj/item/card/id/centcom, /obj/machinery/door/airlock/command)),
@@ -131,7 +131,7 @@ SUBSYSTEM_DEF(traumas)
/obj/item/clothing/suit/wizrobe, /obj/item/clothing/head/wizard, /obj/item/spellbook, /obj/item/staff,
/obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/hardsuit/wizard,
/obj/item/gun/magic/staff, /obj/item/gun/magic/wand,
/obj/item/nullrod, /obj/item/clothing/under/rank/chaplain)),
/obj/item/nullrod, /obj/item/clothing/under/rank/civilian/chaplain)),
"aliens" = typecacheof(list(/obj/item/clothing/mask/facehugger, /obj/item/organ/body_egg/alien_embryo,
/obj/structure/alien, /obj/item/toy/toy_xeno,
@@ -145,21 +145,21 @@ SUBSYSTEM_DEF(traumas)
"birds" = typecacheof(list(/obj/item/clothing/mask/gas/plaguedoctor, /obj/item/reagent_containers/food/snacks/cracker,
/obj/item/clothing/suit/chickensuit, /obj/item/clothing/head/chicken,
/obj/item/clothing/suit/toggle/owlwings, /obj/item/clothing/under/owl, /obj/item/clothing/mask/gas/owl_mask,
/obj/item/clothing/under/griffin, /obj/item/clothing/shoes/griffin, /obj/item/clothing/head/griffin,
/obj/item/clothing/suit/toggle/owlwings, /obj/item/clothing/under/costume/owl, /obj/item/clothing/mask/gas/owl_mask,
/obj/item/clothing/under/costume/griffin, /obj/item/clothing/shoes/griffin, /obj/item/clothing/head/griffin,
/obj/item/clothing/head/helmet/space/freedom, /obj/item/clothing/suit/space/freedom)),
"anime" = typecacheof(list(/obj/item/clothing/under/schoolgirl, /obj/item/katana, /obj/item/reagent_containers/food/snacks/sashimi, /obj/item/reagent_containers/food/snacks/chawanmushi,
"anime" = typecacheof(list(/obj/item/clothing/under/costume/schoolgirl, /obj/item/katana, /obj/item/reagent_containers/food/snacks/sashimi, /obj/item/reagent_containers/food/snacks/chawanmushi,
/obj/item/reagent_containers/food/drinks/bottle/sake, /obj/item/throwing_star, /obj/item/clothing/head/kitty/genuine, /obj/item/clothing/suit/space/space_ninja,
/obj/item/clothing/mask/gas/space_ninja, /obj/item/clothing/shoes/space_ninja, /obj/item/clothing/gloves/space_ninja, /obj/item/twohanded/vibro_weapon,
/obj/item/nullrod/scythe/vibro, /obj/item/energy_katana, /obj/item/toy/katana, /obj/item/nullrod/claymore/katana, /obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe)),
"mimes" = typecacheof(list(/obj/item/pda/mime, /obj/item/clothing/under/rank/mime, /obj/item/clothing/mask/gas/mime,
"mimes" = typecacheof(list(/obj/item/pda/mime, /obj/item/clothing/under/rank/civilian/mime, /obj/item/clothing/mask/gas/mime,
/obj/item/clothing/head/frenchberet, /obj/item/clothing/suit/suspenders, /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing,
/obj/item/storage/backpack/mime, /obj/item/reagent_containers/food/snacks/grown/banana/mime,
/obj/item/grown/bananapeel/mimanapeel, /obj/item/cartridge/virus/mime, /obj/item/clothing/shoes/sneakers/mime,
/obj/item/bedsheet/mime, /obj/item/reagent_containers/food/snacks/burger/mime, /obj/item/clothing/head/beret, /obj/item/clothing/mask/gas/sexymime,
/obj/item/clothing/under/sexymime, /obj/item/toy/figure/mime, /obj/item/toy/crayon/mime, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced, /obj/mecha/combat/reticence)),
/obj/item/clothing/under/rank/civilian/mime/sexy, /obj/item/toy/figure/mime, /obj/item/toy/crayon/mime, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced, /obj/mecha/combat/reticence)),
"cats" = typecacheof(list(/obj/item/organ/ears/cat, /obj/item/organ/tail/cat, /obj/item/laser_pointer, /obj/item/toy/cattoy, /obj/item/clothing/head/kitty,
/obj/item/clothing/head/collectable/kitty, /obj/item/melee/chainofcommand/tailwhip/kitty, /obj/item/stack/sheet/animalhide/cat)),
+36 -31
View File
@@ -23,7 +23,7 @@ SUBSYSTEM_DEF(vote)
var/list/generated_actions = list()
var/next_pop = 0
var/obfuscated = FALSE//CIT CHANGE - adds obfuscated/admin-only votes
var/display_votes = SHOW_RESULTS|SHOW_VOTES|SHOW_WINNER|SHOW_ABSTENTION //CIT CHANGE - adds obfuscated/admin-only votes
var/list/stored_gamemode_votes = list() //Basically the last voted gamemode is stored here for end-of-round use.
@@ -59,7 +59,7 @@ SUBSYSTEM_DEF(vote)
voted.Cut()
voting.Cut()
scores.Cut()
obfuscated = FALSE //CIT CHANGE - obfuscated votes
display_votes = initial(display_votes) //CIT CHANGE - obfuscated votes
remove_action_buttons()
/datum/controller/subsystem/vote/proc/get_result()
@@ -89,20 +89,6 @@ SUBSYSTEM_DEF(vote)
choices[GLOB.master_mode] += non_voters.len
if(choices[GLOB.master_mode] >= greatest_votes)
greatest_votes = choices[GLOB.master_mode]
else if(mode == "transfer") // austation begin -- Crew autotransfer vote
var/factor = 1
switch(world.time / (1 MINUTES))
if(0 to 60)
factor = 0.5
if(61 to 120)
factor = 0.8
if(121 to 240)
factor = 1
if(241 to 300)
factor = 1.2
else
factor = 1.4
choices["Initiate Crew Transfer"] += round(non_voters.len * factor) // austation end
//get all options with that many votes and return them in a list
. = list()
if(greatest_votes)
@@ -264,7 +250,7 @@ SUBSYSTEM_DEF(vote)
if(winners.len > 0)
if(was_roundtype_vote)
stored_gamemode_votes = list()
if(!obfuscated)
if(display_votes & SHOW_RESULTS)
if(vote_system == SCHULZE_VOTING)
text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!"
if(vote_system == MAJORITY_JUDGEMENT_VOTING)
@@ -275,15 +261,15 @@ SUBSYSTEM_DEF(vote)
votes = 0
if(was_roundtype_vote)
stored_gamemode_votes[choices[i]] = votes
text += "\n<b>[choices[i]]:</b> [obfuscated ? "???" : votes]" //CIT CHANGE - adds obfuscated votes
text += "\n<b>[choices[i]]:</b> [display_votes & SHOW_RESULTS ? votes : "???"]" //CIT CHANGE - adds obfuscated votes
if(mode != "custom")
if(winners.len > 1 && !obfuscated) //CIT CHANGE - adds obfuscated votes
if(winners.len > 1 && display_votes & SHOW_WINNER) //CIT CHANGE - adds obfuscated votes
text = "\n<b>Vote Tied Between:</b>"
for(var/option in winners)
text += "\n\t[option]"
. = pick(winners)
text += "\n<b>Vote Result: [obfuscated ? "???" : .]</b>" //CIT CHANGE - adds obfuscated votes
else
text += "\n<b>Vote Result: [display_votes & SHOW_WINNER ? . : "???"]</b>" //CIT CHANGE - adds obfuscated votes
if(display_votes & SHOW_ABSTENTION)
text += "\n<b>Did not vote:</b> [GLOB.clients.len-voted.len]"
else if(vote_system == SCORE_VOTING)
for(var/score_name in scores)
@@ -292,7 +278,7 @@ SUBSYSTEM_DEF(vote)
score = 0
if(was_roundtype_vote)
stored_gamemode_votes[score_name] = score
text = "\n<b>[score_name]:</b> [obfuscated ? "???" : score]"
text = "\n<b>[score_name]:</b> [display_votes & SHOW_RESULTS ? score : "???"]"
. = 1
else
text += "<b>Vote Result: Inconclusive - No Votes!</b>"
@@ -309,7 +295,7 @@ SUBSYSTEM_DEF(vote)
if(islist(myvote))
for(var/j=1,j<=myvote.len,j++)
SSblackbox.record_feedback("nested tally","voting",1,list(vote_title_text,"[j]\th",choices[myvote[j]]))
if(obfuscated) //CIT CHANGE - adds obfuscated votes. this messages admins with the vote's true results
if(!(display_votes & SHOW_RESULTS)) //CIT CHANGE - adds obfuscated votes. this messages admins with the vote's true results
var/admintext = "Obfuscated results"
if(vote_system != SCORE_VOTING)
if(vote_system == SCHULZE_VOTING)
@@ -341,7 +327,7 @@ SUBSYSTEM_DEF(vote)
if(CONFIG_GET(flag/modetier_voting))
reset()
started_time = 0
initiate_vote("mode tiers","server",hideresults=FALSE,votesystem=SCORE_VOTING,forced=TRUE, vote_time = 30 MINUTES)
initiate_vote("mode tiers","server", votesystem=SCORE_VOTING, forced=TRUE, vote_time = 30 MINUTES)
to_chat(world,"<b>The vote will end right as the round starts.</b>")
return .
if("restart")
@@ -368,11 +354,15 @@ SUBSYSTEM_DEF(vote)
return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.")
GLOB.master_mode = "dynamic"
var/list/runnable_storytellers = config.get_runnable_storytellers()
var/datum/dynamic_storyteller/picked
for(var/T in runnable_storytellers)
var/datum/dynamic_storyteller/S = T
runnable_storytellers[S] *= stored_gamemode_votes[initial(S.name)]
var/datum/dynamic_storyteller/S = pickweightAllowZero(runnable_storytellers)
GLOB.dynamic_storyteller_type = S
if(stored_gamemode_votes[initial(S.name)] == 1 && CHECK_BITFIELD(initial(S.flags), FORCE_IF_WON))
picked = S
runnable_storytellers[S] *= round(stored_gamemode_votes[initial(S.name)]*100000,1)
if(!picked)
picked = pickweightAllowZero(runnable_storytellers)
GLOB.dynamic_storyteller_type = picked
if("map")
var/datum/map_config/VM = config.maplist[.]
message_admins("The map has been voted for and will change to: [VM.map_name]")
@@ -446,7 +436,7 @@ SUBSYSTEM_DEF(vote)
saved -= usr.ckey
return 0
/datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key, hideresults, votesystem = PLURALITY_VOTING, forced = FALSE,vote_time = -1)//CIT CHANGE - adds hideresults argument to votes to allow for obfuscated votes
/datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key, display = display_votes, votesystem = PLURALITY_VOTING, forced = FALSE,vote_time = -1)//CIT CHANGE - adds display argument to votes to allow for obfuscated votes
vote_system = votesystem
if(!mode)
if(started_time)
@@ -457,7 +447,7 @@ SUBSYSTEM_DEF(vote)
var/admin = FALSE
var/ckey = ckey(initiator_key)
if(GLOB.admin_datums[ckey])
if(GLOB.admin_datums[ckey] || initiator_key == "server")
admin = TRUE
if(next_allowed_time > world.time && !admin)
@@ -466,7 +456,7 @@ SUBSYSTEM_DEF(vote)
SEND_SOUND(world, sound('sound/misc/notice2.ogg'))
reset()
obfuscated = hideresults //CIT CHANGE - adds obfuscated votes
display_votes = display //CIT CHANGE - adds obfuscated votes
switch(vote_type)
if("restart")
choices.Add("Restart Round","Continue Playing")
@@ -517,6 +507,21 @@ SUBSYSTEM_DEF(vote)
if(!option || mode || !usr.client)
break
choices.Add(option)
var/keep_going = TRUE
var/toggles = SHOW_RESULTS|SHOW_VOTES|SHOW_WINNER
while(keep_going)
var/list/choices = list()
for(var/A in GLOB.display_vote_settings)
var/toggletext
var/bitflag = GLOB.display_vote_settings[A]
toggletext = "[toggles & bitflag ? "Show" : "Hide"] [A]"
choices[toggletext] = bitflag
var/chosen = input(usr, "Toggle vote display settings. Cancel to finalize.", toggles) as null|anything in choices
if(!chosen)
keep_going = FALSE
else
toggles ^= choices[chosen]
display_votes = toggles
else
return 0
mode = vote_type
@@ -587,7 +592,7 @@ SUBSYSTEM_DEF(vote)
ivotedforthis = ((C.ckey in voted) && (i in voted[C.ckey]))
if(!votes)
votes = 0
. += "<li>[ivotedforthis ? "<b>" : ""]<a href='?src=[REF(src)];vote=[i]'>[choices[i]]</a> ([obfuscated ? (admin ? "??? ([votes])" : "???") : votes] votes)[ivotedforthis ? "</b>" : ""]</li>" // CIT CHANGE - adds obfuscated votes
. += "<li>[ivotedforthis ? "<b>" : ""]<a href='?src=[REF(src)];vote=[i]'>[choices[i]]</a> ([display_votes & SHOW_VOTES ? votes : (admin ? "??? ([votes])" : "???")] votes)[ivotedforthis ? "</b>" : ""]</li>" // CIT CHANGE - adds obfuscated votes
if(choice_descs.len >= i)
. += "<li>[choice_descs[i]]</li>"
. += "</ul><hr>"
+2 -1
View File
@@ -676,7 +676,8 @@
//Preset for general and toggled actions
/datum/action/innate
check_flags = 0
check_flags = NONE
required_mobility_flags = NONE
var/active = 0
/datum/action/innate/Trigger()
+19 -12
View File
@@ -9,8 +9,8 @@
var/max_distance = 0
var/sleep_time = 3
var/finished = 0
var/target_oldloc = null
var/origin_oldloc = null
var/turf/target_oldloc
var/turf/origin_oldloc
var/static_beam = 0
var/beam_type = /obj/effect/ebeam //must be subtype
var/timing_id = null
@@ -23,13 +23,13 @@
target_oldloc = get_turf(target)
sleep_time = beam_sleep_time
if(origin_oldloc == origin && target_oldloc == target)
static_beam = 1
static_beam = TRUE
max_distance = maxdistance
base_icon = new(beam_icon,beam_icon_state)
icon = beam_icon
icon_state = beam_icon_state
beam_type = btype
if(time < INFINITY)
if(time < INFINITY)
addtimer(CALLBACK(src,.proc/End), time)
/datum/beam/proc/Start()
@@ -42,10 +42,14 @@
return
recalculating = TRUE
timing_id = null
if(origin && target && get_dist(origin,target)<max_distance && origin.z == target.z)
var/origin_turf = get_turf(origin)
var/target_turf = get_turf(target)
if(!static_beam && (origin_turf != origin_oldloc || target_turf != target_oldloc))
var/turf/origin_turf
if(origin)
origin_turf = get_turf(origin)
var/turf/target_turf
if(target)
target_turf = get_turf(target)
if(origin_turf && target_turf && (get_dist(origin_turf, target_turf) < max_distance) && (origin_turf.z == target_turf.z))
if(!static_beam && ((origin_turf != origin_oldloc) || (target_turf != target_oldloc)))
origin_oldloc = origin_turf //so we don't keep checking against their initial positions, leading to endless Reset()+Draw() calls
target_oldloc = target_turf
Reset()
@@ -83,24 +87,27 @@
elements.Cut()
/datum/beam/Destroy()
finished = TRUE
Reset()
target = null
origin = null
return ..()
/datum/beam/proc/Draw()
var/Angle = round(Get_Angle(origin,target))
if(!origin_oldloc || !target_oldloc)
return
var/Angle = round(Get_Angle(origin_oldloc,target_oldloc))
var/matrix/rot_matrix = matrix()
rot_matrix.Turn(Angle)
//Translation vector for origin and target
var/DX = (32*target.x+target.pixel_x)-(32*origin.x+origin.pixel_x)
var/DY = (32*target.y+target.pixel_y)-(32*origin.y+origin.pixel_y)
var/DX = (32*target_oldloc.x+target_oldloc.pixel_x)-(32*origin_oldloc.x+origin_oldloc.pixel_x)
var/DY = (32*target_oldloc.y+target_oldloc.pixel_y)-(32*origin_oldloc.y+origin_oldloc.pixel_y)
var/N = 0
var/length = round(sqrt((DX)**2+(DY)**2)) //hypotenuse of the triangle formed by target and origin's displacement
for(N in 0 to length-1 step 32)//-1 as we want < not <=, but we want the speed of X in Y to Z and step X
if(QDELETED(src) || finished)
if(finished)
break
var/obj/effect/ebeam/X = new beam_type(origin_oldloc)
X.owner = src
+2 -2
View File
@@ -47,9 +47,9 @@
/datum/brain_trauma/special/imaginary_friend/proc/get_ghost()
set waitfor = FALSE
var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend, POLL_IGNORE_IMAGINARYFRIEND)
var/list/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend, POLL_IGNORE_IMAGINARYFRIEND)
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
var/mob/C = pick(candidates)
C.transfer_ckey(friend, FALSE)
friend_initialized = TRUE
else
+11 -14
View File
@@ -20,6 +20,7 @@
..()
make_backseats()
get_ghost()
RegisterSignal(M, COMSIG_MOB_DEATH, .proc/revert_to_normal)
/datum/brain_trauma/severe/split_personality/proc/make_backseats()
stranger_backseat = new(owner, src)
@@ -27,9 +28,9 @@
/datum/brain_trauma/severe/split_personality/proc/get_ghost()
set waitfor = FALSE
var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat, POLL_IGNORE_SPLITPERSONALITY)
var/list/mob/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat, POLL_IGNORE_SPLITPERSONALITY)
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
var/mob/C = pick(candidates)
C.transfer_ckey(stranger_backseat, FALSE)
log_game("[key_name(stranger_backseat)] became [key_name(owner)]'s split personality.")
message_admins("[ADMIN_LOOKUPFLW(stranger_backseat)] became [ADMIN_LOOKUPFLW(owner)]'s split personality.")
@@ -37,23 +38,23 @@
qdel(src)
/datum/brain_trauma/severe/split_personality/on_life()
if(owner.stat == DEAD)
if(current_controller != OWNER)
switch_personalities()
qdel(src)
else if(prob(3))
if(prob(3))
switch_personalities()
..()
/datum/brain_trauma/severe/split_personality/on_lose()
if(current_controller != OWNER) //it would be funny to cure a guy only to be left with the other personality, but it seems too cruel
switch_personalities()
switch_personalities(TRUE)
QDEL_NULL(stranger_backseat)
QDEL_NULL(owner_backseat)
UnregisterSignal(owner, COMSIG_MOB_DEATH)
..()
/datum/brain_trauma/severe/split_personality/proc/switch_personalities()
if(QDELETED(owner) || owner.stat == DEAD || QDELETED(stranger_backseat) || QDELETED(owner_backseat))
/datum/brain_trauma/severe/split_personality/proc/revert_to_normal()
qdel(src)
/datum/brain_trauma/severe/split_personality/proc/switch_personalities(forced = FALSE)
if(QDELETED(owner) || (owner.stat == DEAD && !forced) || QDELETED(stranger_backseat) || QDELETED(owner_backseat))
return
var/mob/living/split_personality/current_backseat
@@ -126,10 +127,6 @@
if(QDELETED(body))
qdel(src) //in case trauma deletion doesn't already do it
if((body.stat == DEAD && trauma.owner_backseat == src))
trauma.switch_personalities()
qdel(trauma)
//if one of the two ghosts, the other one stays permanently
if(!body.client && trauma.initialized)
trauma.switch_personalities()
+2 -128
View File
@@ -4,132 +4,6 @@
Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening.
### In the code
See [this thread](https://tgstation13.org/phpBB/viewtopic.php?f=5&t=22674) for an introduction to the system as a whole.
#### Slippery things
At the time of this writing, every object that is slippery overrides atom/Crossed does some checks, then slips the mob. Instead of all those Crossed overrides they could add a slippery component to all these objects. And have the checks in one proc that is run by the Crossed event
#### Powercells
A lot of objects have powercells. The `get_cell()` proc was added to give generic access to the cell var if it had one. This is just a specific use case of `GetComponent()`
#### Radios
The radio object as it is should not exist, given that more things use the _concept_ of radios rather than the object itself. The actual function of the radio can exist in a component which all the things that use it (Request consoles, actual radios, the SM shard) can add to themselves.
#### Standos
Stands have a lot of procs which mimic mob procs. Rather than inserting hooks for all these procs in overrides, the same can be accomplished with signals
## API
### Defines
1. `COMPONENT_INCOMPATIBLE` Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. `parent` must not be modified if this is to be returned. This will be noted in the runtime logs
### Vars
1. `/datum/var/list/datum_components` (private)
* Lazy associated list of type -> component/list of components.
1. `/datum/var/list/comp_lookup` (private)
* Lazy associated list of signal -> registree/list of registrees
1. `/datum/var/list/signal_procs` (private)
* Associated lazy list of signals -> `/datum/callback`s that will be run when the parent datum receives that signal
1. `/datum/var/signal_enabled` (protected, boolean)
* If the datum is signal enabled. If not, it will not react to signals
* `FALSE` by default, set to `TRUE` when a signal is registered
1. `/datum/component/var/dupe_mode` (protected, enum)
* How duplicate component types are handled when added to the datum.
* `COMPONENT_DUPE_HIGHLANDER` (default): Old component will be deleted, new component will first have `/datum/component/proc/InheritComponent(datum/component/old, FALSE)` on it
* `COMPONENT_DUPE_ALLOWED`: The components will be treated as separate, `GetComponent()` will return the first added
* `COMPONENT_DUPE_UNIQUE`: New component will be deleted, old component will first have `/datum/component/proc/InheritComponent(datum/component/new, TRUE)` on it
* `COMPONENT_DUPE_UNIQUE_PASSARGS`: New component will never exist and instead its initialization arguments will be passed on to the old component.
1. `/datum/component/var/dupe_type` (protected, type)
* Definition of a duplicate component type
* `null` means exact match on `type` (default)
* Any other type means that and all subtypes
1. `/datum/component/var/datum/parent` (protected, read-only)
* The datum this component belongs to
* Never `null` in child procs
1. `report_signal_origin` (protected, boolean)
* If `TRUE`, will invoke the callback when signalled with the signal type as the first argument.
* `FALSE` by default.
### Procs
1. `/datum/proc/GetComponent(component_type(type)) -> datum/component?` (public, final)
* Returns a reference to a component of component_type if it exists in the datum, null otherwise
1. `/datum/proc/GetComponents(component_type(type)) -> list` (public, final)
* Returns a list of references to all components of component_type that exist in the datum
1. `/datum/proc/GetExactComponent(component_type(type)) -> datum/component?` (public, final)
* Returns a reference to a component whose type MATCHES component_type if that component exists in the datum, null otherwise
1. `GET_COMPONENT(varname, component_type)` OR `GET_COMPONENT_FROM(varname, component_type, src)`
* Shorthand for `var/component_type/varname = src.GetComponent(component_type)`
1. `SEND_SIGNAL(target, sigtype, ...)` (public, final)
* Use to send signals to target datum
* Extra arguments are to be specified in the signal definition
* Returns a bitflag with signal specific information assembled from all activated components
* Arguments are packaged in a list and handed off to _SendSignal()
1. `/datum/proc/AddComponent(component_type(type), ...) -> datum/component` (public, final)
* Creates an instance of `component_type` in the datum and passes `...` to its `Initialize()` call
* Sends the `COMSIG_COMPONENT_ADDED` signal to the datum
* All components a datum owns are deleted with the datum
* Returns the component that was created. Or the old component in a dupe situation where `COMPONENT_DUPE_UNIQUE` was set
* If this tries to add an component to an incompatible type, the component will be deleted and the result will be `null`. This is very unperformant, try not to do it
* Properly handles duplicate situations based on the `dupe_mode` var
1. `/datum/proc/LoadComponent(component_type(type), ...) -> datum/component` (public, final)
* Equivalent to calling `GetComponent(component_type)` where, if the result would be `null`, returns `AddComponent(component_type, ...)` instead
1. `/datum/proc/ComponentActivated(datum/component/C)` (abstract, async)
* Called on a component's `parent` after a signal received causes it to activate. `src` is the parameter
* Will only be called if a component's callback returns `TRUE`
1. `/datum/proc/TakeComponent(datum/component/C)` (public, final)
* Properly transfers ownership of a component from one datum to another
* Signals `COMSIG_COMPONENT_REMOVING` on the parent
* Called on the datum you want to own the component with another datum's component
1. `/datum/proc/_SendSignal(signal, list/arguments)` (private, final)
* Handles most of the actual signaling procedure
* Will runtime if used on datums with an empty component list
1. `/datum/proc/RegisterSignal(datum/target, signal(string/list of strings), proc_ref(type), override(boolean))` (protected, final)
* If signal is a list it will be as if RegisterSignal was called for each of the entries with the same following arguments
* Makes the datum listen for the specified `signal` on it's `parent` datum.
* When that signal is received `proc_ref` will be called on the component, along with associated arguments
* Example proc ref: `.proc/OnEvent`
* If a previous registration is overwritten by the call, a runtime occurs. Setting `override` to TRUE prevents this
* These callbacks run asyncronously
* Returning `TRUE` from these callbacks will trigger a `TRUE` return from the `SendSignal()` that initiated it
1. `/datum/component/New(datum/parent, ...)` (private, final)
* Runs internal setup for the component
* Extra arguments are passed to `Initialize()`
1. `/datum/component/Initialize(...)` (abstract, no-sleep)
* Called by `New()` with the same argments excluding `parent`
* Component does not exist in `parent`'s `datum_components` list yet, although `parent` is set and may be used
* Signals will not be received while this function is running
* Component may be deleted after this function completes without being attached
* Do not call `qdel(src)` from this function
1. `/datum/component/Destroy(force(bool), silent(bool))` (virtual, no-sleep)
* Sends the `COMSIG_COMPONENT_REMOVING` signal to the parent datum if the `parent` isn't being qdeleted
* Properly removes the component from `parent` and cleans up references
* Setting `force` makes it not check for and remove the component from the parent
* Setting `silent` deletes the component without sending a `COMSIG_COMPONENT_REMOVING` signal
1. `/datum/component/proc/InheritComponent(datum/component/C, i_am_original(boolean))` (abstract, no-sleep)
* Called on a component when a component of the same type was added to the same parent
* See `/datum/component/var/dupe_mode`
* `C`'s type will always be the same of the called component
1. `/datum/component/proc/AfterComponentActivated()` (abstract, async)
* Called on a component that was activated after it's `parent`'s `ComponentActivated()` is called
1. `/datum/component/proc/OnTransfer(datum/new_parent)` (abstract, no-sleep)
* Called before `new_parent` is assigned to `parent` in `TakeComponent()`
* Allows the component to react to ownership transfers
1. `/datum/component/proc/_RemoveFromParent()` (private, final)
* Clears `parent` and removes the component from it's component list
1. `/datum/component/proc/_JoinParent` (private, final)
* Tries to add the component to it's `parent`s `datum_components` list
1. `/datum/component/proc/RegisterWithParent` (abstract, no-sleep)
* Used to register the signals that should be on the `parent` object
* Use this if you plan on the component transfering between parents
1. `/datum/component/proc/UnregisterFromParent` (abstract, no-sleep)
* Counterpart to `RegisterWithParent()`
* Used to unregister the signals that should only be on the `parent` object
### See/Define signals and their arguments in __DEFINES\components.dm
### See/Define signals and their arguments in [__DEFINES\components.dm](..\..\__DEFINES\components.dm)
+228 -36
View File
@@ -1,21 +1,71 @@
/**
* # Component
*
* The component datum
*
* A component should be a single standalone unit
* of functionality, that works by receiving signals from it's parent
* object to provide some single functionality (i.e a slippery component)
* that makes the object it's attached to cause people to slip over.
* Useful when you want shared behaviour independent of type inheritance
*/
/datum/component
/// Defines how duplicate existing components are handled when added to a datum
/// See `COMPONENT_DUPE_*` definitions for available options
var/dupe_mode = COMPONENT_DUPE_HIGHLANDER
/// The type to check for duplication
/// `null` means exact match on `type` (default)
/// Any other type means that and all subtypes
var/dupe_type
/// The datum this components belongs to
var/datum/parent
//only set to true if you are able to properly transfer this component
//At a minimum RegisterWithParent and UnregisterFromParent should be used
//Make sure you also implement PostTransfer for any post transfer handling
/// Only set to true if you are able to properly transfer this component
/// At a minimum RegisterWithParent and UnregisterFromParent should be used
/// Make sure you also implement PostTransfer for any post transfer handling
var/can_transfer = FALSE
/datum/component/New(datum/P, ...)
parent = P
var/list/arguments = args.Copy(2)
/**
* Create a new component.
* Additional arguments are passed to `Initialize()`
*
* Arguments:
* * datum/P the parent datum this component reacts to signals from
*/
/datum/component/New(list/raw_args)
parent = raw_args[1]
var/list/arguments = raw_args.Copy(2)
if(Initialize(arglist(arguments)) == COMPONENT_INCOMPATIBLE)
qdel(src, TRUE, TRUE)
CRASH("Incompatible [type] assigned to a [P.type]! args: [json_encode(arguments)]")
CRASH("Incompatible [type] assigned to a [parent.type]! args: [json_encode(arguments)]")
_JoinParent(P)
_JoinParent(parent)
/**
* Called during component creation with the same arguments as in new excluding parent.
* Do not call `qdel(src)` from this function, `return COMPONENT_INCOMPATIBLE` instead
*/
/datum/component/proc/Initialize(...)
return
/**
* Properly removes the component from `parent` and cleans up references
* Setting `force` makes it not check for and remove the component from the parent
* Setting `silent` deletes the component without sending a `COMSIG_COMPONENT_REMOVING` signal
*/
/datum/component/Destroy(force=FALSE, silent=FALSE)
if(!force && parent)
_RemoveFromParent()
if(!silent)
SEND_SIGNAL(parent, COMSIG_COMPONENT_REMOVING, src)
parent = null
return ..()
/**
* Internal proc to handle behaviour of components when joining a parent
*/
/datum/component/proc/_JoinParent()
var/datum/P = parent
//lazy init the parent's dc list
@@ -51,21 +101,9 @@
RegisterWithParent()
// If you want/expect to be moving the component around between parents, use this to register on the parent for signals
/datum/component/proc/RegisterWithParent()
SEND_SIGNAL(src, COMSIG_COMPONENT_REGISTER_PARENT) //CITADEL EDIT
/datum/component/proc/Initialize(...)
return
/datum/component/Destroy(force=FALSE, silent=FALSE)
if(!force && parent)
_RemoveFromParent()
if(!silent)
SEND_SIGNAL(parent, COMSIG_COMPONENT_REMOVING, src)
parent = null
return ..()
/**
* Internal proc to handle behaviour when being removed from a parent
*/
/datum/component/proc/_RemoveFromParent()
var/datum/P = parent
var/list/dc = P.datum_components
@@ -84,9 +122,38 @@
UnregisterFromParent()
/datum/component/proc/UnregisterFromParent()
SEND_SIGNAL(src, COMSIG_COMPONENT_UNREGISTER_PARENT) //CITADEL EDIT
/**
* Register the component with the parent object
*
* Use this proc to register with your parent object
* Overridable proc that's called when added to a new parent
*/
/datum/component/proc/RegisterWithParent()
return
/**
* Unregister from our parent object
*
* Use this proc to unregister from your parent object
* Overridable proc that's called when removed from a parent
* *
*/
/datum/component/proc/UnregisterFromParent()
return
/**
* Register to listen for a signal from the passed in target
*
* This sets up a listening relationship such that when the target object emits a signal
* the source datum this proc is called upon, will recieve a callback to the given proctype
* Return values from procs registered must be a bitfield
*
* Arguments:
* * datum/target The target to listen for signals from
* * sig_type_or_types Either a string signal name, or a list of signal names (strings)
* * proctype The proc to call back when the signal is emitted
* * override If a previous registration exists you must explicitly set this
*/
/datum/proc/RegisterSignal(datum/target, sig_type_or_types, proctype, override = FALSE)
if(QDELETED(src) || QDELETED(target))
return
@@ -119,6 +186,16 @@
signal_enabled = TRUE
/**
* Stop listening to a given signal from target
*
* Breaks the relationship between target and source datum, removing the callback when the signal fires
* Doesn't care if a registration exists or not
*
* Arguments:
* * datum/target Datum to stop listening to signals from
* * sig_typeor_types Signal string key or list of signal keys to stop listening to specifically
*/
/datum/proc/UnregisterSignal(datum/target, sig_type_or_types)
var/list/lookup = target.comp_lookup
if(!signal_procs || !signal_procs[target] || !lookup)
@@ -126,6 +203,8 @@
if(!islist(sig_type_or_types))
sig_type_or_types = list(sig_type_or_types)
for(var/sig in sig_type_or_types)
if(!signal_procs[target][sig])
continue
switch(length(lookup[sig]))
if(2)
lookup[sig] = (lookup[sig]-src)[1]
@@ -148,15 +227,47 @@
if(!signal_procs[target].len)
signal_procs -= target
/**
* Called on a component when a component of the same type was added to the same parent
* See `/datum/component/var/dupe_mode`
* `C`'s type will always be the same of the called component
*/
/datum/component/proc/InheritComponent(datum/component/C, i_am_original)
return
/**
* Called on a component when a component of the same type was added to the same parent with COMPONENT_DUPE_SELECTIVE
* See `/datum/component/var/dupe_mode`
* `C`'s type will always be the same of the called component
* return TRUE if you are absorbing the component, otherwise FALSE if you are fine having it exist as a duplicate component
*/
/datum/component/proc/CheckDupeComponent(datum/component/C, ...)
return
/**
* Callback Just before this component is transferred
*
* Use this to do any special cleanup you might need to do before being deregged from an object
*
*/
/datum/component/proc/PreTransfer()
return
/**
* Callback Just after a component is transferred
*
* Use this to do any special setup you need to do after being moved to a new object
* Do not call `qdel(src)` from this function, `return COMPONENT_INCOMPATIBLE` instead
*
*/
/datum/component/proc/PostTransfer()
return COMPONENT_INCOMPATIBLE //Do not support transfer by default as you must properly support it
/**
* Internal proc to create a list of our type and all parent types
*/
/datum/component/proc/_GetInverseTypeList(our_type = type)
//we can do this one simple trick
var/current_type = parent_type
@@ -166,6 +277,11 @@
current_type = type2parent(current_type)
. += current_type
/**
* Internal proc to handle most all of the signaling procedure
* Will runtime if used on datums with an empty component list
* Use the `SEND_SIGNAL` define instead
*/
/datum/proc/_SendSignal(sigtype, list/arguments)
var/target = comp_lookup[sigtype]
if(!length(target))
@@ -183,9 +299,16 @@
. |= CallAsync(C, proctype, arguments)
// The type arg is casted so initial works, you shouldn't be passing a real instance into this
/**
* Return any component assigned to this datum of the given type
* This will throw an error if it's possible to have more than one component of that type on the parent
*
* Arguments:
* * datum/component/c_type The typepath of the component you want to get a reference to
*/
/datum/proc/GetComponent(datum/component/c_type)
RETURN_TYPE(c_type)
if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED)
if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED || initial(c_type.dupe_mode) == COMPONENT_DUPE_SELECTIVE)
stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]")
var/list/dc = datum_components
if(!dc)
@@ -194,7 +317,18 @@
if(length(.))
return .[1]
/datum/proc/GetExactComponent(c_type)
// The type arg is casted so initial works, you shouldn't be passing a real instance into this
/**
* Return any component assigned to this datum of the exact given type
* This will throw an error if it's possible to have more than one component of that type on the parent
*
* Arguments:
* * datum/component/c_type The typepath of the component you want to get a reference to
*/
/datum/proc/GetExactComponent(datum/component/c_type)
RETURN_TYPE(c_type)
if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED || initial(c_type.dupe_mode) == COMPONENT_DUPE_SELECTIVE)
stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]")
var/list/dc = datum_components
if(!dc)
return null
@@ -206,6 +340,12 @@
return C
return null
/**
* Get all components of a given type that are attached to this datum
*
* Arguments:
* * c_type The component type path
*/
/datum/proc/GetComponents(c_type)
var/list/dc = datum_components
if(!dc)
@@ -214,7 +354,15 @@
if(!length(.))
return list(.)
/datum/proc/AddComponent(new_type, ...)
/**
* Creates an instance of `new_type` in the datum and attaches to it as parent
* Sends the `COMSIG_COMPONENT_ADDED` signal to the datum
* Returns the component that was created. Or the old component in a dupe situation where `COMPONENT_DUPE_UNIQUE` was set
* If this tries to add an component to an incompatible type, the component will be deleted and the result will be `null`. This is very unperformant, try not to do it
* Properly handles duplicate situations based on the `dupe_mode` var
*/
/datum/proc/_AddComponent(list/raw_args)
var/new_type = raw_args[1]
var/datum/component/nt = new_type
var/dm = initial(nt.dupe_mode)
var/dt = initial(nt.dupe_type)
@@ -229,7 +377,7 @@
new_comp = nt
nt = new_comp.type
args[1] = src
raw_args[1] = src
if(dm != COMPONENT_DUPE_ALLOWED)
if(!dt)
@@ -240,37 +388,62 @@
switch(dm)
if(COMPONENT_DUPE_UNIQUE)
if(!new_comp)
new_comp = new nt(arglist(args))
new_comp = new nt(raw_args)
if(!QDELETED(new_comp))
old_comp.InheritComponent(new_comp, TRUE)
QDEL_NULL(new_comp)
if(COMPONENT_DUPE_HIGHLANDER)
if(!new_comp)
new_comp = new nt(arglist(args))
new_comp = new nt(raw_args)
if(!QDELETED(new_comp))
new_comp.InheritComponent(old_comp, FALSE)
QDEL_NULL(old_comp)
if(COMPONENT_DUPE_UNIQUE_PASSARGS)
if(!new_comp)
var/list/arguments = args.Copy(2)
old_comp.InheritComponent(null, TRUE, arguments)
var/list/arguments = raw_args.Copy(2)
arguments.Insert(1, null, TRUE)
old_comp.InheritComponent(arglist(arguments))
else
old_comp.InheritComponent(new_comp, TRUE)
if(COMPONENT_DUPE_SELECTIVE)
var/list/arguments = raw_args.Copy()
arguments[1] = new_comp
var/make_new_component = TRUE
for(var/i in GetComponents(new_type))
var/datum/component/C = i
if(C.CheckDupeComponent(arglist(arguments)))
make_new_component = FALSE
QDEL_NULL(new_comp)
break
if(!new_comp && make_new_component)
new_comp = new nt(raw_args)
else if(!new_comp)
new_comp = new nt(arglist(args)) // There's a valid dupe mode but there's no old component, act like normal
new_comp = new nt(raw_args) // There's a valid dupe mode but there's no old component, act like normal
else if(!new_comp)
new_comp = new nt(arglist(args)) // Dupes are allowed, act like normal
new_comp = new nt(raw_args) // Dupes are allowed, act like normal
if(!old_comp && !QDELETED(new_comp)) // Nothing related to duplicate components happened and the new component is healthy
SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp)
return new_comp
return old_comp
/**
* Get existing component of type, or create it and return a reference to it
*
* Use this if the item needs to exist at the time of this call, but may not have been created before now
*
* Arguments:
* * component_type The typepath of the component to create or return
* * ... additional arguments to be passed when creating the component if it does not exist
*/
/datum/proc/LoadComponent(component_type, ...)
. = GetComponent(component_type)
if(!.)
return AddComponent(arglist(args))
return _AddComponent(args)
/**
* Removes the component from parent, ends up with a null parent
*/
/datum/component/proc/RemoveComponent()
if(!parent)
return
@@ -280,6 +453,14 @@
parent = null
SEND_SIGNAL(old_parent, COMSIG_COMPONENT_REMOVING, src)
/**
* Transfer this component to another parent
*
* Component is taken from source datum
*
* Arguments:
* * datum/component/target Target datum to transfer to
*/
/datum/proc/TakeComponent(datum/component/target)
if(!target || target.parent == src)
return
@@ -296,6 +477,14 @@
if(target == AddComponent(target))
target._JoinParent()
/**
* Transfer all components to target
*
* All components from source datum are taken
*
* Arguments:
* * /datum/target the target to move the components to
*/
/datum/proc/TransferComponents(datum/target)
var/list/dc = datum_components
if(!dc)
@@ -310,5 +499,8 @@
if(C.can_transfer)
target.TakeComponent(comps)
/**
* Return the object that is the host of any UI's that this component has
*/
/datum/component/ui_host()
return parent
+2
View File
@@ -8,6 +8,8 @@
var/obj/screen/craft/C = new()
C.icon = H.ui_style
H.static_inventory += C
if(!CL.prefs.widescreenpref)
C.screen_loc = ui_boxcraft
CL.screen += C
RegisterSignal(C, COMSIG_CLICK, .proc/component_ui_interact)
@@ -8,7 +8,7 @@
/datum/crafting_recipe/mummy/body
name = "Mummification Bandages (Body)"
result = /obj/item/clothing/under/mummy
result = /obj/item/clothing/under/costume/mummy
reqs = list(/obj/item/stack/sheet/cloth = 5)
/datum/crafting_recipe/lizardhat
@@ -107,7 +107,7 @@
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/diagnostic_singlasses_removal
/datum/crafting_recipe/diagnostic_sunglasses_removal
name = "Diagnostic HUDsunglasses removal"
result = /obj/item/clothing/glasses/sunglasses
time = 20
@@ -126,6 +126,85 @@
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
*/
// Eyepatch Glasses
/datum/crafting_recipe/secpatch
name = "Security Eyepatch HUD"
result = /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch
time = 20
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
parts = list(/obj/item/clothing/glasses/hud/security/sunglasses = 1,
/obj/item/clothing/glasses/eyepatch = 1)
reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses = 1,
/obj/item/clothing/glasses/eyepatch = 1)
category = CAT_CLOTHING
/datum/crafting_recipe/secpatch_removal
name = "Security HUDpatch Removal"
result = /obj/item/clothing/glasses/eyepatch
time = 20
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses/eyepatch = 1)
category = CAT_CLOTHING
/datum/crafting_recipe/medpatch
name = "Medical Eyepatch HUD"
result = /obj/item/clothing/glasses/hud/health/eyepatch
time = 20
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
parts = list(/obj/item/clothing/glasses/hud/health = 1,
/obj/item/clothing/glasses/eyepatch = 1)
reqs = list(/obj/item/clothing/glasses/hud/health = 1,
/obj/item/clothing/glasses/eyepatch = 1)
category = CAT_CLOTHING
/datum/crafting_recipe/medpatch_removal
name = "Medical HUDpatch Removal"
result = /obj/item/clothing/glasses/eyepatch
time = 20
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/health/eyepatch = 1)
category = CAT_CLOTHING
/datum/crafting_recipe/diagpatch
name = "Diagnostic Eyepatch HUD"
result = /obj/item/clothing/glasses/hud/diagnostic/eyepatch
time = 20
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
parts = list(/obj/item/clothing/glasses/hud/diagnostic = 1,
/obj/item/clothing/glasses/eyepatch = 1)
reqs = list(/obj/item/clothing/glasses/hud/diagnostic = 1,
/obj/item/clothing/glasses/eyepatch = 1)
category = CAT_CLOTHING
/datum/crafting_recipe/diagpatch_removal
name = "Diagnostic HUDpatch Removal"
result = /obj/item/clothing/glasses/eyepatch
time = 20
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/diagnostic/eyepatch = 1)
category = CAT_CLOTHING
/datum/crafting_recipe/mesonpatch
name = "Meson Scanner Eyepatch"
result = /obj/item/clothing/glasses/meson/eyepatch
time = 20
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
parts = list(/obj/item/clothing/glasses/meson = 1,
/obj/item/clothing/glasses/eyepatch = 1)
reqs = list(/obj/item/clothing/glasses/meson = 1,
/obj/item/clothing/glasses/eyepatch = 1)
category = CAT_CLOTHING
/datum/crafting_recipe/mesonpatch_removal
name = "Meson Scanner patch Removal"
result = /obj/item/clothing/glasses/eyepatch
time = 20
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/meson/eyepatch = 1)
category = CAT_CLOTHING
/datum/crafting_recipe/ghostsheet
name = "Ghost Sheet"
result = /obj/item/clothing/suit/ghost_sheet
@@ -278,7 +278,7 @@
result = /obj/item/banner/command/mundane
time = 40
reqs = list(/obj/item/stack/rods = 2,
/obj/item/clothing/under/captainparade = 1)
/obj/item/clothing/under/rank/captain/parade = 1)
category = CAT_MISC
/datum/crafting_recipe/engineering_banner
@@ -286,7 +286,7 @@
result = /obj/item/banner/engineering/mundane
time = 40
reqs = list(/obj/item/stack/rods = 2,
/obj/item/clothing/under/rank/engineer = 1)
/obj/item/clothing/under/rank/engineering/engineer = 1)
category = CAT_MISC
/datum/crafting_recipe/cargo_banner
@@ -294,7 +294,7 @@
result = /obj/item/banner/cargo/mundane
time = 40
reqs = list(/obj/item/stack/rods = 2,
/obj/item/clothing/under/rank/cargotech = 1)
/obj/item/clothing/under/rank/cargo/tech = 1)
category = CAT_MISC
/datum/crafting_recipe/science_banner
@@ -302,7 +302,7 @@
result = /obj/item/banner/science/mundane
time = 40
reqs = list(/obj/item/stack/rods = 2,
/obj/item/clothing/under/rank/scientist = 1)
/obj/item/clothing/under/rank/rnd/scientist = 1)
category = CAT_MISC
/datum/crafting_recipe/medical_banner
@@ -310,7 +310,7 @@
result = /obj/item/banner/medical/mundane
time = 40
reqs = list(/obj/item/stack/rods = 2,
/obj/item/clothing/under/rank/medical = 1)
/obj/item/clothing/under/rank/medical/doctor = 1)
category = CAT_MISC
/datum/crafting_recipe/security_banner
@@ -318,7 +318,7 @@
result = /obj/item/banner/security/mundane
time = 40
reqs = list(/obj/item/stack/rods = 2,
/obj/item/clothing/under/rank/security = 1)
/obj/item/clothing/under/rank/security/officer = 1)
category = CAT_MISC
/datum/crafting_recipe/bloodsucker/vassalrack
@@ -278,7 +278,7 @@
/datum/crafting_recipe/arrow
name = "Arrow"
result = /obj/item/ammo_casing/caseless/arrow
result = /obj/item/ammo_casing/caseless/arrow/wood
time = 30
reqs = list(/obj/item/stack/sheet/mineral/wood = 1,
/obj/item/stack/sheet/silk = 1,
@@ -293,17 +293,17 @@
always_availible = FALSE
reqs = list(/obj/item/stack/sheet/bone = 1,
/obj/item/stack/sheet/sinew = 1,
/obj/item/ammo_casing/caseless/arrow/ashen = 1)
/obj/item/ammo_casing/caseless/arrow/ash = 1)
category = CAT_WEAPONRY
subcategory = CAT_AMMO
/datum/crafting_recipe/ashen_arrow
name = "Fire Hardened Arrow"
result = /obj/item/ammo_casing/caseless/arrow/ashen
result = /obj/item/ammo_casing/caseless/arrow/ash
tools = list(TOOL_WELDER)
time = 30
always_availible = FALSE
reqs = list(/obj/item/ammo_casing/caseless/arrow = 1)
reqs = list(/obj/item/ammo_casing/caseless/arrow/wood = 1)
category = CAT_WEAPONRY
subcategory = CAT_AMMO
+7 -10
View File
@@ -30,26 +30,23 @@
return ..()
/datum/component/fantasy/RegisterWithParent()
. = ..()
var/obj/item/master = parent
originalName = master.name
modify()
/datum/component/fantasy/UnregisterFromParent()
. = ..()
unmodify()
/datum/component/fantasy/InheritComponent(datum/component/fantasy/newComp, original, list/arguments)
/datum/component/fantasy/InheritComponent(datum/component/fantasy/newComp, original, quality, list/affixes, canFail, announce)
unmodify()
if(newComp)
quality += newComp.quality
canFail = newComp.canFail
announce = newComp.announce
src.quality += newComp.quality
src.canFail = newComp.canFail
src.announce = newComp.announce
else
arguments.len = 5 // This is done to replicate what happens when an arglist smaller than the necessary arguments is given
quality += arguments[1]
canFail = arguments[4] || canFail
announce = arguments[5] || announce
src.quality += quality
src.canFail = canFail || src.canFail
src.announce = announce || src.announce
modify()
/datum/component/fantasy/proc/randomQuality()
+2 -2
View File
@@ -101,11 +101,11 @@
host_mob = null
return ..()
/datum/component/nanites/InheritComponent(datum/component/nanites/new_nanites, i_am_original, list/arguments)
/datum/component/nanites/InheritComponent(datum/component/nanites/new_nanites, i_am_original, amount, cloud)
if(new_nanites)
adjust_nanites(null, new_nanites.nanite_volume)
else
adjust_nanites(null, arguments[1]) //just add to the nanite volume
adjust_nanites(null, amount) //just add to the nanite volume
/datum/component/nanites/process()
adjust_nanites(null, regen_rate)
+3 -3
View File
@@ -41,9 +41,9 @@
orbiters = null
return ..()
/datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, list/arguments)
if(arguments)
begin_orbit(arglist(arguments))
/datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, atom/movable/orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation)
if(!newcomp)
begin_orbit(arglist(args.Copy(3)))
return
// The following only happens on component transfers
orbiters += newcomp.orbiters
+1 -1
View File
@@ -2,7 +2,7 @@
/datum/component/wearertargeting/phantomthief
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
signals = list(COMSIG_COMBAT_TOGGLED)
signals = list(COMSIG_LIVING_COMBAT_ENABLED)
proctype = .proc/handlefilterstuff
var/filter_x
var/filter_y
+2 -2
View File
@@ -47,7 +47,7 @@
if(strength <= RAD_BACKGROUND_RADIATION)
return PROCESS_KILL
/datum/component/radioactive/InheritComponent(datum/component/C, i_am_original, list/arguments)
/datum/component/radioactive/InheritComponent(datum/component/C, i_am_original, _strength, _source, _half_life, _can_contaminate)
if(!i_am_original)
return
if(!hl3_release_date) // Permanently radioactive things don't get to grow stronger
@@ -56,7 +56,7 @@
var/datum/component/radioactive/other = C
strength = max(strength, other.strength)
else
strength = max(strength, arguments[1])
strength = max(strength, _strength)
/datum/component/radioactive/proc/rad_examine(datum/source, mob/user, list/examine_list)
var/atom/master = parent
+15 -5
View File
@@ -53,11 +53,21 @@ handles linking back and forth.
/datum/component/remote_materials/proc/_MakeLocal()
silo = null
mat_container = parent.AddComponent(/datum/component/material_container,
list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace, /datum/material/plastic),
local_size,
FALSE,
/obj/item/stack)
var/static/list/allowed_mats = list(
/datum/material/iron,
/datum/material/glass,
/datum/material/silver,
/datum/material/gold,
/datum/material/diamond,
/datum/material/plasma,
/datum/material/uranium,
/datum/material/bananium,
/datum/material/titanium,
/datum/material/bluespace,
/datum/material/plastic,
)
mat_container = parent.AddComponent(/datum/component/material_container, allowed_mats, local_size, allowed_types=/obj/item/stack)
/datum/component/remote_materials/proc/set_local_size(size)
local_size = size
+13 -5
View File
@@ -191,20 +191,28 @@
///////Yes, I said humans. No, this won't end well...//////////
/datum/component/riding/human
var/fireman_carrying = FALSE
/datum/component/riding/human/Initialize()
. = ..()
RegisterSignal(parent, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_host_unarmed_melee)
/datum/component/riding/human/vehicle_mob_unbuckle(datum/source, mob/living/M, force = FALSE)
var/mob/living/carbon/human/H = parent
H.remove_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING)
. = ..()
var/mob/living/carbon/human/H = parent
if(!length(H.buckled_mobs))
H.remove_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING)
if(!fireman_carrying)
M.Daze(25)
REMOVE_TRAIT(M, TRAIT_MOBILITY_NOUSE, src)
/datum/component/riding/human/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE)
. = ..()
var/mob/living/carbon/human/H = parent
H.add_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING, multiplicative_slowdown = HUMAN_CARRY_SLOWDOWN)
if(length(H.buckled_mobs))
H.add_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING, multiplicative_slowdown = fireman_carrying? FIREMAN_CARRY_SLOWDOWN : PIGGYBACK_CARRY_SLOWDOWN)
if(fireman_carrying)
ADD_TRAIT(M, TRAIT_MOBILITY_NOUSE, src)
/datum/component/riding/human/proc/on_host_unarmed_melee(atom/target)
var/mob/living/carbon/human/H = parent
@@ -236,11 +244,11 @@
else
return list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(-6, 4), TEXT_WEST = list( 6, 4))
/datum/component/riding/human/force_dismount(mob/living/user)
var/atom/movable/AM = parent
AM.unbuckle_mob(user)
user.DefaultCombatKnockdown(60)
user.Daze(50)
user.visible_message("<span class='warning'>[AM] pushes [user] off of [AM.p_them()]!</span>")
/datum/component/riding/cyborg
@@ -341,7 +349,7 @@
var/mob/living/parent
var/selfdeleting = FALSE
/obj/item/riding_offhand/dropped()
/obj/item/riding_offhand/dropped(mob/user)
selfdeleting = TRUE
. = ..()
+4 -4
View File
@@ -15,13 +15,13 @@
src.allow_death = allow_death
check_in_bounds() // Just in case something is being created outside of station/centcom
/datum/component/stationloving/InheritComponent(datum/component/stationloving/newc, original, list/arguments)
/datum/component/stationloving/InheritComponent(datum/component/stationloving/newc, original, inform_admins, allow_death)
if (original)
if (istype(newc))
if (newc)
inform_admins = newc.inform_admins
allow_death = newc.allow_death
else if (LAZYLEN(arguments))
inform_admins = arguments[1]
else
inform_admins = inform_admins
/datum/component/stationloving/proc/relocate()
var/targetturf = find_safe_turf()
+2 -2
View File
@@ -43,13 +43,13 @@
master.cut_overlay(overlay)
return ..()
/datum/component/thermite/InheritComponent(datum/component/thermite/newC, i_am_original, list/arguments)
/datum/component/thermite/InheritComponent(datum/component/thermite/newC, i_am_original, _amount)
if(!i_am_original)
return
if(newC)
amount += newC.amount
else
amount += arguments[1]
amount += _amount
/datum/component/thermite/proc/thermite_melt(mob/user)
var/turf/master = parent
+6 -2
View File
@@ -28,7 +28,7 @@ GLOBAL_LIST_EMPTY(uplinks)
var/compact_mode = FALSE
var/debug = FALSE
/datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20, datum/ui_state/_checkstate)
/datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20, datum/ui_state/_checkstate, datum/traitor_class/traitor_class)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
@@ -47,7 +47,11 @@ GLOBAL_LIST_EMPTY(uplinks)
RegisterSignal(parent, COMSIG_PEN_ROTATED, .proc/pen_rotation)
GLOB.uplinks += src
uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted)
var/list/filters = list()
if(istype(traitor_class))
filters = traitor_class.uplink_filters
starting_tc = traitor_class.TC
uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted, filters)
if(_owner)
owner = _owner
+3 -1
View File
@@ -58,6 +58,7 @@
RegisterSignal(current_mind, COMSIG_PRE_MIND_TRANSFER, .proc/pre_player_transfer)
if(mastermind?.current)
mastermind.current.audiovisual_redirect = M
ADD_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG, VIRTUAL_REALITY_TRAIT)
/datum/component/virtual_reality/UnregisterFromParent()
. = ..()
@@ -69,6 +70,7 @@
current_mind = null
if(mastermind?.current)
mastermind.current.audiovisual_redirect = null
REMOVE_TRAIT(parent, TRAIT_NO_MIDROUND_ANTAG, VIRTUAL_REALITY_TRAIT)
/**
* Called when attempting to connect a mob to a virtual reality mob.
@@ -235,7 +237,7 @@
qdel(src)
/**
* Used for recursive virtual realities shenanigeans and should be called only through the above proc.
* Used for recursive virtual realities shenanigeans and should be called by the above proc.
*/
/datum/component/virtual_reality/proc/vr_in_a_vr(mob/player, deathcheck = FALSE, lethal_cleanup = FALSE)
var/mob/M = parent

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