Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Timothy Teakettle
2020-08-16 16:17:29 +01:00
1012 changed files with 35492 additions and 16072 deletions
@@ -18,9 +18,7 @@
/obj/item/mining_scanner,
/obj/item/flashlight/lantern,
/obj/item/card/id/mining,
/obj/item/gps/mining{
tracking = 0
},
/obj/item/gps/mining,
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
"d" = (
@@ -34,9 +32,7 @@
/obj/item/mining_scanner,
/obj/item/flashlight/lantern,
/obj/item/card/id/mining,
/obj/item/gps/mining{
tracking = 0
},
/obj/item/gps/mining,
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
"e" = (
@@ -156,9 +152,7 @@
"x" = (
/obj/structure/table/wood,
/obj/machinery/reagentgrinder,
/obj/item/gps/mining{
tracking = 0
},
/obj/item/gps/mining,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
"z" = (
@@ -227,7 +227,7 @@
/area/ruin/unpowered/xenonest)
"ba" = (
/obj/structure/stone_tile/slab,
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bb" = (
/obj/structure/stone_tile/cracked{
@@ -241,7 +241,7 @@
dir = 8
},
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bc" = (
/obj/structure/stone_tile/block,
@@ -251,7 +251,7 @@
/obj/structure/stone_tile{
dir = 4
},
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bd" = (
/obj/structure/stone_tile/block,
@@ -262,7 +262,7 @@
dir = 1
},
/obj/effect/decal/cleanable/blood/xeno,
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"be" = (
/obj/structure/stone_tile/block,
@@ -272,7 +272,7 @@
/obj/structure/stone_tile{
dir = 1
},
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bf" = (
/obj/structure/stone_tile,
@@ -286,7 +286,7 @@
dir = 4
},
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bg" = (
/obj/structure/alien/weeds,
@@ -303,7 +303,7 @@
/obj/structure/stone_tile{
dir = 8
},
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bi" = (
/obj/structure/alien/weeds,
@@ -336,11 +336,11 @@
dir = 1
},
/obj/structure/stone_tile,
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bm" = (
/obj/structure/stone_tile/slab/cracked,
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bn" = (
/obj/structure/stone_tile/block{
@@ -352,7 +352,7 @@
/obj/structure/stone_tile{
dir = 4
},
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bo" = (
/obj/structure/stone_tile/surrounding_tile{
@@ -383,7 +383,7 @@
dir = 1
},
/obj/effect/decal/cleanable/blood/xeno,
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bs" = (
/obj/structure/stone_tile/block{
@@ -416,7 +416,7 @@
dir = 1
},
/obj/structure/stone_tile/cracked,
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bw" = (
/obj/structure/stone_tile/cracked{
@@ -430,7 +430,7 @@
dir = 8
},
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bx" = (
/obj/structure/stone_tile/block{
@@ -441,7 +441,7 @@
dir = 8
},
/obj/effect/decal/cleanable/blood/xeno,
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"by" = (
/obj/structure/stone_tile/block{
@@ -451,7 +451,7 @@
/obj/structure/stone_tile/cracked{
dir = 8
},
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bz" = (
/obj/structure/stone_tile/block/cracked{
@@ -461,7 +461,7 @@
/obj/structure/stone_tile{
dir = 8
},
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bA" = (
/obj/structure/stone_tile/cracked{
@@ -475,7 +475,7 @@
},
/obj/structure/stone_tile,
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss/air,
/turf/open/indestructible/boss,
/area/ruin/unpowered/xenonest)
"bB" = (
/obj/structure/alien/weeds,
@@ -90,11 +90,11 @@
/obj/structure/stone_tile/surrounding_tile{
dir = 8
},
/turf/open/indestructible/necropolis,
/turf/open/indestructible/necropolis/air,
/area/lavaland/surface/outdoors)
"l" = (
/obj/structure/stone_tile/block/cracked,
/turf/open/indestructible/necropolis,
/turf/open/indestructible/necropolis/air,
/area/lavaland/surface/outdoors)
"m" = (
/obj/structure/stone_tile/surrounding_tile/cracked,
@@ -105,7 +105,7 @@
/obj/structure/stone_tile/surrounding_tile{
dir = 8
},
/turf/open/indestructible/necropolis,
/turf/open/indestructible/necropolis/air,
/area/lavaland/surface/outdoors)
"n" = (
/obj/structure/stone_tile/block/cracked{
@@ -136,14 +136,14 @@
},
/obj/structure/table/bronze,
/obj/item/disk/design_disk/adv/knight_gear,
/turf/open/indestructible/necropolis,
/turf/open/indestructible/necropolis/air,
/area/lavaland/surface/outdoors)
"q" = (
/obj/structure/table/bronze,
/obj/item/stack/sheet/mineral/runite{
amount = 5
},
/turf/open/indestructible/necropolis,
/turf/open/indestructible/necropolis/air,
/area/lavaland/surface/outdoors)
"r" = (
/obj/structure/stone_tile/block{
@@ -153,7 +153,7 @@
/obj/item/stack/sheet/mineral/runite{
amount = 5
},
/turf/open/indestructible/necropolis,
/turf/open/indestructible/necropolis/air,
/area/lavaland/surface/outdoors)
"s" = (
/obj/structure/stone_tile/block{
@@ -186,13 +186,13 @@
/obj/structure/stone_tile/surrounding_tile{
dir = 1
},
/turf/open/indestructible/necropolis,
/turf/open/indestructible/necropolis/air,
/area/lavaland/surface/outdoors)
"v" = (
/obj/structure/stone_tile/block{
dir = 1
},
/turf/open/indestructible/necropolis,
/turf/open/indestructible/necropolis/air,
/area/lavaland/surface/outdoors)
"w" = (
/obj/structure/stone_tile/surrounding_tile/cracked{
@@ -205,7 +205,7 @@
/obj/structure/stone_tile/surrounding_tile{
dir = 4
},
/turf/open/indestructible/necropolis,
/turf/open/indestructible/necropolis/air,
/area/lavaland/surface/outdoors)
"x" = (
/obj/structure/stone_tile/block{
+2 -2
View File
@@ -3,7 +3,7 @@
/turf/template_noop,
/area/template_noop)
"b" = (
/turf/open/floor/plating/asteroid,
/turf/open/floor/plating/asteroid/airless,
/area/ruin/powered)
"c" = (
/turf/closed/mineral/random/high_chance,
@@ -135,7 +135,7 @@
/area/ruin/powered)
"F" = (
/obj/structure/closet/crate/trashcart,
/turf/open/floor/plating/asteroid,
/turf/open/floor/plating/asteroid/airless,
/area/ruin/powered)
"G" = (
/obj/structure/chair/sofa/right,
@@ -3,7 +3,7 @@
/turf/template_noop,
/area/template_noop)
"b" = (
/turf/open/floor/plating/asteroid,
/turf/open/floor/plating/asteroid/airless,
/area/ruin/powered)
"c" = (
/turf/closed/mineral/random/high_chance,
@@ -176,8 +176,8 @@
/obj/structure/table,
/obj/effect/decal/cleanable/dirt,
/obj/item/autosurgeon{
name = "rusted autosurgeon";
desc = "A device that automatically inserts an implant or organ into the user without the hassle of extensive surgery. It has a slot to insert an organ of implant. But this rusted version looks like it could only manage one implant....";
name = "rusted autosurgeon";
uses = 1
},
/turf/open/floor/plasteel,
@@ -205,7 +205,7 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer1{
dir = 4
},
/turf/open/floor/plating/asteroid,
/turf/open/floor/plating/asteroid/airless,
/area/ruin/powered)
"K" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
+8 -14
View File
@@ -5,9 +5,6 @@
"ab" = (
/turf/closed/mineral/random/low_chance,
/area/ruin/unpowered)
"ac" = (
/turf/open/floor/plating/asteroid,
/area/ruin/unpowered)
"ad" = (
/obj/machinery/hydroponics/soil,
/turf/open/floor/plating/asteroid,
@@ -327,9 +324,6 @@
/obj/item/flashlight/lamp/bananalamp,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"bt" = (
/turf/closed/mineral/random/low_chance/earth_like,
/area/ruin/unpowered)
"bC" = (
/obj/item/pickaxe/titanium,
/turf/open/floor/plating/asteroid,
@@ -396,7 +390,7 @@ aa
aa
aa
aa
ac
aA
aO
aA
aA
@@ -2648,7 +2642,7 @@ aa
aa
aa
aa
ac
aA
aa
aa
aa
@@ -2699,9 +2693,9 @@ aa
aa
aa
aa
ac
aA
ab
ac
aA
aa
aa
"}
@@ -2855,9 +2849,9 @@ aa
aa
aa
aa
ac
aA
ab
ac
aA
aa
aa
"}
@@ -2907,7 +2901,7 @@ aa
aa
aa
aa
ac
aA
aa
aa
aa
@@ -2959,7 +2953,7 @@ aa
aa
aa
aa
bt
ab
aa
aa
aa
@@ -80,7 +80,7 @@
/obj/item/shard{
icon_state = "medium"
},
/turf/open/floor/plating/airless{
/turf/open/floor/plating{
icon_state = "platingdmg2"
},
/area/ruin/space/has_grav)
+3 -1
View File
@@ -232,7 +232,9 @@
/area/awaymission/vr/murderdome)
"H" = (
/obj/machinery/telecomms/allinone,
/turf/open/indestructible,
/turf/open/indestructible{
initial_gas_mix = "TEMP=2.7"
},
/area/awaymission/vr/murderdome)
"R" = (
/obj/effect/spawner/structure/window/reinforced/indestructable,
+160 -143
View File
@@ -4879,6 +4879,10 @@
dir = 4
},
/obj/machinery/holopad,
/obj/machinery/door/poddoor/shutters/preopen{
id = "hopqueue";
name = "HoP Queue Shutters"
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aiW" = (
@@ -5103,7 +5107,7 @@
/area/security/main)
"ajv" = (
/obj/machinery/computer/med_data{
dir = 3
dir = 4
},
/obj/structure/sign/poster/official/medical_green_cross{
pixel_x = -32
@@ -6467,6 +6471,12 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"alX" = (
/obj/structure/disposalpipe/segment{
dir = 6
},
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"alY" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -8069,6 +8079,13 @@
},
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"apI" = (
/obj/structure/disposalpipe/segment{
dir = 6
},
/obj/structure/closet/secure_closet/medical1,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"apJ" = (
/turf/closed/wall,
/area/construction/mining/aux_base)
@@ -9381,6 +9398,13 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/construction/mining/aux_base)
"asG" = (
/obj/structure/disposalpipe/trunk{
dir = 1
},
/obj/machinery/disposal/bin,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"asH" = (
/obj/structure/closet/toolcloset,
/obj/effect/turf_decal/tile/yellow{
@@ -9424,6 +9448,35 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
"asL" = (
/obj/machinery/light{
dir = 8
},
/obj/machinery/firealarm{
dir = 4;
pixel_x = -24
},
/obj/item/reagent_containers/spray/cleaner,
/obj/item/crowbar,
/obj/item/clothing/neck/stethoscope,
/obj/item/storage/box/gloves{
pixel_x = 3;
pixel_y = 4
},
/obj/item/storage/box/masks,
/obj/structure/table,
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
"asM" = (
/obj/structure/table,
/obj/item/crowbar,
/obj/item/clothing/neck/stethoscope,
/obj/item/reagent_containers/spray/cleaner,
/obj/structure/sign/warning/nosmoking{
pixel_y = 30
},
/turf/open/floor/plasteel/dark,
/area/medical/sleeper)
"asN" = (
/obj/machinery/airalarm{
dir = 4;
@@ -9453,12 +9506,66 @@
/obj/structure/closet/firecloset,
/turf/open/floor/plating,
/area/maintenance/fore)
"asT" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/turf/open/floor/plasteel,
/area/medical/medbay/central)
"asU" = (
/obj/structure/sign/warning/nosmoking{
pixel_y = 30
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
/obj/machinery/door/airlock/medical/glass{
id_tag = "MedbayFoyer";
name = "Medbay";
req_access_txt = "5"
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"asV" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/turf/open/floor/plasteel,
/area/medical/medbay/central)
"asW" = (
/obj/machinery/light/small{
dir = 8
},
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
"asX" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/machinery/door/airlock/medical/glass{
id_tag = "MedbayFoyer";
name = "Medbay";
req_access_txt = "5"
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"asY" = (
/obj/structure/sign/warning/nosmoking{
pixel_y = 30
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"ata" = (
/turf/open/floor/wood,
/area/lawoffice)
@@ -24467,12 +24574,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
/area/engine/gravity_generator)
"bgP" = (
/obj/structure/disposalpipe/segment{
dir = 6
},
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"bgQ" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
@@ -28210,12 +28311,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bpy" = (
/obj/structure/disposalpipe/segment{
dir = 6
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bpz" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
@@ -28704,13 +28799,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"bqM" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
/area/medical/medbay/central)
"bqN" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
@@ -28743,22 +28831,6 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bqR" = (
/obj/structure/table,
/obj/item/crowbar,
/obj/item/clothing/neck/stethoscope,
/obj/item/reagent_containers/spray/cleaner,
/obj/structure/sign/warning/nosmoking{
pixel_y = 30
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bqS" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -29261,13 +29333,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/crew_quarters/heads/hop)
"brV" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plating,
/area/medical/medbay/central)
"brW" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -29275,18 +29340,6 @@
/obj/machinery/vending/cart,
/turf/open/floor/plasteel,
/area/crew_quarters/heads/hop)
"brX" = (
/obj/structure/table,
/obj/item/storage/box/masks,
/obj/item/storage/box/gloves{
pixel_x = 3;
pixel_y = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"brY" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -30888,7 +30941,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/plating,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"bvH" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -31211,23 +31264,10 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/medical/medbay/central)
"bwy" = (
/obj/structure/disposalpipe/segment{
dir = 5
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bwz" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bwA" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk{
dir = 8
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bwB" = (
/obj/structure/chair,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
@@ -32967,17 +33007,6 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
"bAp" = (
/obj/structure/closet/secure_closet/medical1,
/obj/machinery/light{
dir = 8
},
/obj/machinery/firealarm{
dir = 4;
pixel_x = -24
},
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
"bAq" = (
/obj/machinery/sleeper{
dir = 8
@@ -53679,9 +53708,6 @@
},
/turf/open/floor/mineral/titanium/blue,
/area/crew_quarters/toilet)
"dVU" = (
/turf/open/floor/plating,
/area/space/nearstation)
"dXq" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -53734,7 +53760,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 6
},
/turf/open/floor/plating,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"egt" = (
/obj/effect/turf_decal/tile/bar,
@@ -54363,7 +54389,7 @@
"fIs" = (
/obj/structure/grille,
/obj/structure/lattice,
/turf/open/floor/plating,
/turf/open/space/basic,
/area/space/nearstation)
"fJY" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -54521,19 +54547,6 @@
},
/turf/open/floor/carpet,
/area/crew_quarters/cryopod)
"ghq" = (
/obj/structure/lattice/catwalk,
/obj/item/stack/marker_beacon{
anchored = 1;
icon_state = "markerburgundy-on";
light_color = "#FA644B";
light_power = 3;
light_range = 3;
name = "Docking Beacon";
picked_color = "Burgundy"
},
/turf/open/floor/plating,
/area/space/nearstation)
"ghD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
@@ -54690,7 +54703,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 9
},
/turf/open/floor/plating,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"gJi" = (
/obj/structure/lattice/catwalk,
@@ -54926,7 +54939,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 10
},
/turf/open/floor/plating,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"hxn" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -56010,6 +56023,10 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/theatre)
"kEm" = (
/mob/living/simple_animal/opossum/poppy,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"kEY" = (
/obj/effect/landmark/stationroom/box/engine,
/turf/open/space/basic,
@@ -56572,7 +56589,6 @@
},
/area/maintenance/bar)
"mqZ" = (
/obj/structure/reagent_dispensers/keg/aphro/strong,
/obj/item/reagent_containers/glass/beaker,
/turf/open/floor/plating,
/area/maintenance/bar)
@@ -57288,7 +57304,7 @@
/area/crew_quarters/theatre)
"oyN" = (
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"oyX" = (
/obj/machinery/atmospherics/components/binary/pump/on{
@@ -58127,7 +58143,7 @@
dir = 5
},
/obj/machinery/camera{
c_tag = "Bar Backroom"
c_tag = "Gravity Generator - Fore"
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -58138,6 +58154,10 @@
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/plating,
/area/maintenance/fore)
"rtU" = (
/mob/living/simple_animal/opossum,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"ruo" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -58410,7 +58430,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/turf/open/floor/plating,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"slk" = (
/obj/machinery/door/airlock/maintenance{
@@ -58667,9 +58687,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
/area/engine/engine_smes)
"sQX" = (
/turf/open/floor/plating,
/area/space)
"sRH" = (
/obj/machinery/autolathe/secure{
name = "public autolathe"
@@ -58786,7 +58803,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 5
},
/turf/open/floor/plating,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"trb" = (
/obj/machinery/light{
@@ -59009,7 +59026,7 @@
/area/hallway/primary/central)
"uaw" = (
/obj/machinery/power/apc{
areastring = "/area/storage/art";
areastring = "/area/maintenance/bar";
dir = 1;
name = "Maint bar";
pixel_y = 24
@@ -59422,7 +59439,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/turf/open/floor/plating,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"vbi" = (
/obj/structure/table,
@@ -60521,7 +60538,7 @@
name = "Docking Beacon";
picked_color = "Burgundy"
},
/turf/open/space/basic,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"xOx" = (
/obj/structure/chair/comfy/brown{
@@ -66754,11 +66771,11 @@ aaa
aaa
aaa
aaa
ghq
xLX
aaa
aaa
aaa
ghq
xLX
aaa
aaa
aaa
@@ -67005,9 +67022,9 @@ aaa
aaa
aaa
aaa
ghq
xLX
aaa
ghq
xLX
aaa
aaa
aaa
@@ -67019,9 +67036,9 @@ gXs
aaa
aaa
aaa
ghq
xLX
aaa
ghq
xLX
aaa
aaa
aaa
@@ -76570,7 +76587,7 @@ aaa
aaa
aaa
aaa
aag
aaa
aaa
aaa
aaa
@@ -76827,7 +76844,7 @@ aaa
aaa
aaa
aaa
aag
aaa
aaa
aaa
aaa
@@ -77084,7 +77101,7 @@ aaa
aaa
aaa
aaa
aag
aaa
aaa
aaa
aaa
@@ -77341,7 +77358,7 @@ aaa
aaa
aaa
aaa
aag
aaa
aaa
aaa
aaa
@@ -77598,7 +77615,7 @@ aaa
aaa
aaa
aaa
aag
aaa
aaa
aaa
aaa
@@ -77855,7 +77872,7 @@ aaa
aaa
aaa
aaa
aag
aaa
aaa
aaa
aaa
@@ -78112,7 +78129,7 @@ aaa
aaa
aaa
aaa
aag
aaa
aaa
aoV
bZm
@@ -78369,13 +78386,13 @@ aaa
aaa
aaa
aaa
aag
aaa
aaa
aoV
bVz
aaf
aaf
sQX
aoV
aaa
aaS
aaf
@@ -78626,7 +78643,7 @@ aaa
aaa
aaa
aaa
aag
aaa
aaa
aag
bVz
@@ -78883,7 +78900,7 @@ aaa
aaa
aaa
aaa
aag
gJi
aaa
aaf
bVz
@@ -79140,7 +79157,7 @@ aaa
aaa
aaa
aaa
aag
gJi
aaa
aaf
bVz
@@ -84190,7 +84207,7 @@ aaa
aaa
gXs
gXs
dVU
aaH
abc
abu
abu
@@ -85325,7 +85342,7 @@ bVI
bTA
xgk
bHE
bHE
kEm
bHE
bHE
bHE
@@ -92231,7 +92248,7 @@ btJ
buV
bws
bqH
aJq
asY
aJq
byW
bCv
@@ -94282,8 +94299,8 @@ bfF
bfF
bfF
bfF
bqM
brV
asT
asV
bof
bwv
bvj
@@ -94539,8 +94556,8 @@ bmF
bob
bnB
bfF
bqR
brX
asU
asX
bof
bwx
bvj
@@ -95047,7 +95064,7 @@ aYV
bfF
bhc
bip
bgP
alX
bjL
bkL
bmT
@@ -95313,7 +95330,7 @@ bpF
bqS
brY
bwz
bwy
asG
bvj
bza
bxb
@@ -95569,10 +95586,10 @@ bpt
bfF
bqV
bEe
bhh
bBL
bwA
bvj
bAl
asM
bAl
bvh
bzS
@@ -96087,7 +96104,7 @@ bvh
ajv
bxN
bze
bAp
asL
bvh
bCG
bBd
@@ -98135,7 +98152,7 @@ bjX
blp
bmO
bhi
bpy
apI
bwz
brg
btZ
@@ -104270,7 +104287,7 @@ anf
anf
alP
alP
anf
rtU
alP
alP
alP
+3 -3
View File
@@ -242,13 +242,13 @@
pixel_x = 22
},
/obj/structure/rack,
/obj/item/gun/energy{
/obj/item/gun/energy/e_gun{
pixel_y = -6
},
/obj/item/gun/energy{
/obj/item/gun/energy/e_gun{
pixel_y = -3
},
/obj/item/gun/energy,
/obj/item/gun/energy/e_gun,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
"aaI" = (
+135 -33
View File
@@ -288,6 +288,15 @@
dir = 4
},
/obj/item/toy/poolnoodle/red,
/obj/machinery/power/apc{
areastring = "/area/crew_quarters/fitness/pool";
dir = 1;
name = "Pool APC";
pixel_y = 24
},
/obj/structure/cable/white{
icon_state = "0-4"
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness/pool)
"aaH" = (
@@ -492,8 +501,8 @@
dir = 4
},
/turf/open/floor/plasteel/yellowsiding/corner{
icon_state = "yellowcornersiding";
dir = 8
dir = 8;
icon_state = "yellowcornersiding"
},
/area/crew_quarters/fitness/pool)
"aba" = (
@@ -510,8 +519,8 @@
dir = 8
},
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 4
dir = 4;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"abb" = (
@@ -604,8 +613,8 @@
dir = 4
},
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 8
dir = 8;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"abn" = (
@@ -619,8 +628,8 @@
dir = 8
},
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 4
dir = 4;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"abo" = (
@@ -704,8 +713,8 @@
name = "pool camera"
},
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 4
dir = 4;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"abv" = (
@@ -724,8 +733,8 @@
dir = 4
},
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 8
dir = 8;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"aby" = (
@@ -765,8 +774,8 @@
dir = 8
},
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 4
dir = 4;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"abC" = (
@@ -904,8 +913,8 @@
pixel_x = -23
},
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 4
dir = 4;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"abP" = (
@@ -972,8 +981,8 @@
pixel_x = -26
},
/turf/open/floor/plasteel/yellowsiding/corner{
icon_state = "yellowcornersiding";
dir = 4
dir = 4;
icon_state = "yellowcornersiding"
},
/area/crew_quarters/fitness/pool)
"abW" = (
@@ -982,8 +991,8 @@
dir = 8
},
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 1
dir = 1;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"abX" = (
@@ -995,8 +1004,8 @@
dir = 4
},
/turf/open/floor/plasteel/yellowsiding/corner{
icon_state = "yellowcornersiding";
dir = 1
dir = 1;
icon_state = "yellowcornersiding"
},
/area/crew_quarters/fitness/pool)
"abY" = (
@@ -31108,6 +31117,11 @@
/obj/effect/turf_decal/tile/green{
dir = 8
},
/obj/machinery/power/apc{
areastring = "/area/hydroponics";
name = "Hydroponics APC";
pixel_y = -24
},
/turf/open/floor/plasteel,
/area/hydroponics)
"beS" = (
@@ -64485,8 +64499,8 @@
/area/library)
"cel" = (
/obj/structure/chair/sofa/right{
icon_state = "sofaend_right";
dir = 8
dir = 8;
icon_state = "sofaend_right"
},
/obj/structure/sign/painting/library{
pixel_x = 32
@@ -92830,6 +92844,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/structure/cable/white{
icon_state = "1-2"
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
"dad" = (
@@ -101794,6 +101811,13 @@
/obj/effect/turf_decal/tile/purple{
dir = 4
},
/obj/structure/cable/white,
/obj/machinery/power/apc{
areastring = "/area/science/misc_lab";
dir = 4;
name = "Science Lounge APC";
pixel_x = 26
},
/turf/open/floor/plasteel/white,
/area/science/misc_lab)
"dqi" = (
@@ -113343,6 +113367,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/machinery/light/small,
/turf/open/floor/plasteel/dark/telecomms,
/area/science/server)
"dKg" = (
@@ -125579,6 +125604,20 @@
},
/turf/open/floor/plasteel/dark,
/area/science/mixing)
"ePP" = (
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/machinery/door/airlock/public/glass{
name = "Pool"
},
/obj/structure/cable/white{
icon_state = "1-2"
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/pool)
"eTv" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -125974,7 +126013,6 @@
/turf/open/floor/plating,
/area/chapel/office)
"ijB" = (
/obj/structure/reagent_dispensers/keg/aphro/strong,
/obj/item/reagent_containers/glass/beaker,
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
@@ -126346,6 +126384,13 @@
},
/turf/open/space,
/area/engine/atmos)
"kqo" = (
/obj/structure/cable/white{
icon_state = "4-8"
},
/mob/living/simple_animal/opossum,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"ktK" = (
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -127004,6 +127049,10 @@
dir = 1
},
/area/science/circuit)
"pok" = (
/mob/living/simple_animal/opossum/poppy,
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/theatre/abandoned)
"poI" = (
/obj/structure/bed,
/obj/item/tank/internals/anesthetic,
@@ -127072,6 +127121,25 @@
},
/turf/open/floor/plasteel,
/area/science/research/abandoned)
"pQQ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/structure/cable/white{
icon_state = "1-8"
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness/pool)
"pWb" = (
/obj/structure/table/wood/fancy,
/obj/structure/window/reinforced{
@@ -127298,6 +127366,24 @@
},
/turf/open/floor/plasteel,
/area/science/circuit)
"tqP" = (
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/structure/cable/white{
icon_state = "1-2"
},
/turf/open/floor/plasteel{
heat_capacity = 1e+006
},
/area/crew_quarters/fitness/recreation)
"twt" = (
/obj/machinery/vr_sleeper,
/obj/effect/turf_decal/tile/neutral{
@@ -127768,8 +127854,8 @@
/area/science/mixing)
"xER" = (
/obj/structure/chair/sofa/left{
icon_state = "sofaend_left";
dir = 8
dir = 8;
icon_state = "sofaend_left"
},
/turf/open/floor/wood,
/area/library)
@@ -127849,6 +127935,22 @@
/obj/structure/fans/tiny/invisible,
/turf/open/space/basic,
/area/space)
"yfK" = (
/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
},
/obj/structure/cable/white{
icon_state = "1-2"
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
"yiv" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
@@ -163936,7 +164038,7 @@ aof
aky
aky
aky
arD
kqo
asZ
aui
avF
@@ -178695,7 +178797,7 @@ dCX
dEj
dFq
dGJ
dGJ
pok
dJy
dGJ
dGJ
@@ -181500,10 +181602,10 @@ cCl
cWD
cAz
dac
cxy
aav
aaz
aaH
yfK
tqP
ePP
pQQ
aaV
aaN
aaN
+7 -1
View File
@@ -78498,6 +78498,7 @@
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/mob/living/simple_animal/opossum/poppy,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
@@ -84902,6 +84903,11 @@
/obj/machinery/light,
/turf/open/floor/plating/airless,
/area/hallway/secondary/entry)
"jGN" = (
/obj/effect/decal/cleanable/dirt,
/mob/living/simple_animal/opossum,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"jHJ" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 9
@@ -125028,7 +125034,7 @@ bAP
bCf
bhQ
bhQ
bAM
jGN
bGH
bOc
bHZ
+11 -3
View File
@@ -44383,7 +44383,6 @@
/turf/open/floor/plasteel/white,
/area/hallway/primary/aft)
"bFB" = (
/obj/structure/reagent_dispensers/keg/aphro/strong,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/wood{
icon_state = "wood-broken5"
@@ -80286,6 +80285,11 @@
},
/turf/open/space/basic,
/area/engine/engineering)
"eCO" = (
/obj/effect/decal/cleanable/dirt,
/mob/living/simple_animal/opossum/poppy,
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/aft)
"eDP" = (
/obj/effect/turf_decal/trimline/blue/filled/corner{
dir = 8
@@ -82039,6 +82043,10 @@
},
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
"vDO" = (
/mob/living/simple_animal/opossum,
/turf/open/floor/plating,
/area/maintenance/fore)
"vDW" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -107579,7 +107587,7 @@ aaA
abY
ayy
acw
acw
vDO
acw
acw
aeG
@@ -135198,7 +135206,7 @@ bPp
ccJ
clR
bQh
clN
eCO
bPp
bQh
bYx
+768
View File
@@ -0,0 +1,768 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/indestructible/riveted,
/area/mafia)
"b" = (
/turf/closed/indestructible{
desc = "A wall with alien alloy plating.";
icon = 'icons/turf/walls/abductor_wall.dmi';
icon_state = "abductor";
name = "alien wall";
smooth = 5
},
/area/mafia)
"g" = (
/obj/mafia_game_board,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/mafia)
"h" = (
/obj/structure/grille/indestructable,
/turf/open/floor/plating,
/area/mafia)
"i" = (
/turf/open/floor/fakespace,
/area/mafia)
"j" = (
/turf/closed/indestructible/abductor{
icon_state = "alien22"
},
/area/mafia)
"k" = (
/obj/mafia_game_board,
/turf/open/floor/plating,
/area/mafia)
"l" = (
/obj/structure/closet/abductor,
/turf/open/floor/plating/abductor,
/area/mafia)
"m" = (
/obj/effect/landmark/mafia,
/obj/structure/bed/abductor,
/turf/open/floor/plating/abductor,
/area/mafia)
"n" = (
/obj/effect/landmark/mafia,
/obj/structure/bed/abductor,
/turf/open/floor/plating/abductor2,
/area/mafia)
"o" = (
/obj/structure/closet/abductor,
/turf/open/floor/plating/abductor2,
/area/mafia)
"p" = (
/obj/machinery/door/poddoor/preopen{
desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream.";
id = "mafia";
max_integrity = 99999;
name = "Station Night Shutters"
},
/turf/closed/indestructible/fakeglass,
/area/mafia)
"q" = (
/turf/open/floor/plating/abductor,
/area/mafia)
"r" = (
/turf/open/floor/plating/abductor2,
/area/mafia)
"t" = (
/turf/open/floor/light/colour_cycle/dancefloor_a,
/area/mafia)
"u" = (
/obj/effect/baseturf_helper/asteroid,
/obj/effect/landmark/mafia/town_center,
/turf/open/floor/light/colour_cycle/dancefloor_b,
/area/mafia)
"v" = (
/obj/mafia_game_board,
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/mafia)
"x" = (
/obj/machinery/door/poddoor/preopen{
desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream.";
id = "mafia";
max_integrity = 99999;
name = "Station Night Shutters"
},
/obj/effect/spawner/structure/window/plastitanium,
/turf/open/floor/plating/abductor2,
/area/mafia)
"z" = (
/obj/structure/grille/indestructable,
/turf/open/floor/fakespace,
/area/mafia)
"B" = (
/turf/closed/indestructible/abductor{
icon_state = "alien2"
},
/area/mafia)
"D" = (
/turf/closed/indestructible/abductor{
icon_state = "alien15"
},
/area/mafia)
"E" = (
/turf/closed/indestructible/abductor{
icon_state = "alien7"
},
/area/mafia)
"F" = (
/turf/closed/indestructible/abductor{
icon_state = "alien12"
},
/area/mafia)
"G" = (
/turf/closed/indestructible/abductor{
icon_state = "alien17"
},
/area/mafia)
"H" = (
/turf/open/space/basic,
/area/mafia)
"I" = (
/turf/closed/indestructible/abductor{
icon_state = "alien24"
},
/area/mafia)
"J" = (
/turf/closed/indestructible/abductor{
icon_state = "alien18"
},
/area/mafia)
"K" = (
/turf/closed/indestructible/abductor{
icon_state = "alien11"
},
/area/mafia)
"L" = (
/turf/closed/indestructible/abductor{
icon_state = "alien14"
},
/area/mafia)
"M" = (
/turf/closed/indestructible/abductor{
icon_state = "alien4"
},
/area/mafia)
"N" = (
/turf/closed/indestructible/abductor{
icon_state = "alien21"
},
/area/mafia)
"P" = (
/turf/closed/indestructible/abductor,
/area/mafia)
"Q" = (
/turf/closed/indestructible/abductor{
icon_state = "alien5"
},
/area/mafia)
"S" = (
/turf/closed/indestructible/abductor{
icon_state = "alien3"
},
/area/mafia)
"U" = (
/turf/closed/indestructible/abductor{
icon_state = "alien23"
},
/area/mafia)
"V" = (
/turf/closed/indestructible/abductor{
icon_state = "alien13"
},
/area/mafia)
"W" = (
/turf/closed/indestructible/abductor{
icon_state = "alien20"
},
/area/mafia)
"Y" = (
/turf/closed/indestructible/abductor{
icon_state = "alien8"
},
/area/mafia)
"Z" = (
/turf/closed/indestructible/abductor{
icon_state = "alien10"
},
/area/mafia)
(1,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
a
"}
(3,1,1) = {"
a
b
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
b
a
"}
(4,1,1) = {"
a
b
i
i
g
z
i
i
i
i
i
i
i
i
i
H
i
z
k
i
i
b
a
"}
(5,1,1) = {"
a
b
i
i
z
i
i
i
W
L
F
F
F
Z
P
i
i
i
h
i
i
b
a
"}
(6,1,1) = {"
a
b
i
i
i
W
L
Z
G
l
q
b
r
o
E
L
Z
P
i
i
i
b
a
"}
(7,1,1) = {"
a
b
i
i
i
N
o
r
p
m
q
x
r
n
x
q
l
B
i
i
i
b
a
"}
(8,1,1) = {"
a
b
i
i
i
U
n
r
b
b
q
b
r
b
b
q
m
M
i
i
i
b
a
"}
(9,1,1) = {"
a
b
i
i
W
G
x
r
r
x
q
x
r
x
q
q
x
E
P
i
i
b
a
"}
(10,1,1) = {"
a
b
i
i
N
l
x
b
x
x
x
x
x
x
x
b
x
o
B
i
i
b
a
"}
(11,1,1) = {"
a
b
i
i
j
m
q
q
q
x
t
t
t
x
r
r
r
n
S
i
i
b
a
"}
(12,1,1) = {"
a
b
i
i
j
b
x
b
x
x
t
u
t
x
x
b
x
b
S
i
i
b
a
"}
(13,1,1) = {"
a
b
i
i
j
n
r
r
r
x
t
t
t
x
q
q
q
m
S
i
i
b
a
"}
(14,1,1) = {"
a
b
i
i
U
o
x
b
x
x
x
x
x
x
x
b
x
l
M
i
i
b
a
"}
(15,1,1) = {"
a
b
i
i
I
J
x
q
q
x
r
x
q
x
r
r
x
Y
Q
i
i
b
a
"}
(16,1,1) = {"
a
b
i
i
i
N
m
q
b
b
r
b
q
b
b
r
n
B
i
i
i
b
a
"}
(17,1,1) = {"
a
b
i
i
i
U
l
q
x
n
r
x
q
m
x
r
o
M
i
i
i
b
a
"}
(18,1,1) = {"
a
b
i
i
i
I
D
K
J
o
r
b
q
l
Y
D
K
Q
i
i
i
b
a
"}
(19,1,1) = {"
a
b
i
i
z
i
i
i
I
D
V
V
V
K
Q
i
i
i
z
i
i
b
a
"}
(20,1,1) = {"
a
b
i
i
k
z
i
i
i
i
i
i
i
i
i
i
i
z
v
i
i
b
a
"}
(21,1,1) = {"
a
b
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
b
a
"}
(22,1,1) = {"
a
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
a
"}
(23,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
+675
View File
@@ -0,0 +1,675 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/indestructible/riveted,
/area/mafia)
"c" = (
/turf/closed/wall/rust,
/area/mafia)
"d" = (
/turf/open/floor/plating,
/area/mafia)
"e" = (
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/mafia)
"f" = (
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/mafia)
"g" = (
/obj/mafia_game_board,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/mafia)
"h" = (
/obj/structure/grille/indestructable,
/turf/open/floor/plating,
/area/mafia)
"i" = (
/turf/open/floor/plating{
icon_state = "platingdmg1"
},
/area/mafia)
"j" = (
/obj/machinery/door/airlock/maintenance_hatch{
max_integrity = 99999;
name = "Maintenance"
},
/obj/effect/mapping_helpers/airlock/locked,
/turf/open/floor/plating,
/area/mafia)
"k" = (
/obj/mafia_game_board,
/turf/open/floor/plating,
/area/mafia)
"l" = (
/obj/structure/closet/cabinet{
anchored = 1
},
/turf/open/floor/plasteel/dark,
/area/mafia)
"m" = (
/obj/effect/landmark/mafia,
/turf/open/floor/plasteel/dark,
/area/mafia)
"n" = (
/obj/effect/landmark/mafia,
/turf/open/floor/plasteel,
/area/mafia)
"o" = (
/obj/structure/closet/cabinet{
anchored = 1
},
/turf/open/floor/plasteel,
/area/mafia)
"p" = (
/obj/machinery/door/poddoor/preopen{
desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream.";
id = "mafia";
max_integrity = 99999;
name = "Station Night Shutters"
},
/turf/closed/indestructible/fakeglass,
/area/mafia)
"q" = (
/turf/open/floor/plasteel/dark,
/area/mafia)
"r" = (
/turf/open/floor/plasteel,
/area/mafia)
"s" = (
/turf/open/floor/fakespace,
/area/mafia)
"t" = (
/turf/open/floor/plasteel/solarpanel,
/area/mafia)
"u" = (
/obj/effect/baseturf_helper/asteroid,
/obj/effect/landmark/mafia/town_center,
/turf/open/floor/plasteel/solarpanel,
/area/mafia)
"v" = (
/obj/mafia_game_board,
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/mafia)
(1,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(3,1,1) = {"
a
a
a
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
a
a
a
"}
(4,1,1) = {"
a
a
a
c
g
h
d
d
d
d
d
e
d
d
d
d
d
h
k
c
a
a
a
"}
(5,1,1) = {"
a
a
a
c
h
d
d
e
a
a
j
a
j
a
a
d
d
i
h
c
a
a
a
"}
(6,1,1) = {"
a
a
a
c
i
a
a
j
a
l
q
a
r
o
a
j
a
a
d
c
a
a
a
"}
(7,1,1) = {"
a
a
c
c
d
a
o
r
p
m
q
p
r
n
p
q
l
a
d
c
c
a
a
"}
(8,1,1) = {"
a
a
c
d
d
a
n
r
a
a
q
a
r
a
a
q
m
a
d
d
c
a
a
"}
(9,1,1) = {"
a
a
c
d
a
a
p
r
r
p
q
p
r
p
q
q
p
a
a
d
c
a
a
"}
(10,1,1) = {"
a
a
c
d
a
l
p
a
p
p
p
p
p
p
p
a
p
o
a
d
c
a
a
"}
(11,1,1) = {"
a
a
c
d
j
m
q
q
q
p
s
t
s
p
r
r
r
n
j
e
c
a
a
"}
(12,1,1) = {"
a
a
c
e
a
a
p
a
p
p
t
u
t
p
p
a
p
a
a
d
c
a
a
"}
(13,1,1) = {"
a
a
c
d
j
n
r
r
r
p
s
t
s
p
q
q
q
m
j
d
c
a
a
"}
(14,1,1) = {"
a
a
c
d
a
o
p
a
p
p
p
p
p
p
p
a
p
l
a
i
c
a
a
"}
(15,1,1) = {"
a
a
c
d
a
a
p
q
q
p
r
p
q
p
r
r
p
a
a
d
c
a
a
"}
(16,1,1) = {"
a
a
c
f
d
a
m
q
a
a
r
a
q
a
a
r
n
a
d
d
c
a
a
"}
(17,1,1) = {"
a
a
c
c
d
a
l
q
p
n
r
p
q
m
p
r
o
a
d
c
c
a
a
"}
(18,1,1) = {"
a
a
a
c
d
a
a
j
a
o
r
a
q
l
a
j
a
a
d
c
a
a
a
"}
(19,1,1) = {"
a
a
a
c
h
i
d
d
a
a
j
a
j
a
a
d
e
d
h
c
a
a
a
"}
(20,1,1) = {"
a
a
a
c
k
h
d
d
e
d
d
d
d
d
d
d
d
h
v
c
a
a
a
"}
(21,1,1) = {"
a
a
a
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
a
a
a
"}
(22,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(23,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
+724
View File
@@ -0,0 +1,724 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/indestructible/riveted,
/area/mafia)
"b" = (
/turf/closed/wall/mineral/iron,
/area/mafia)
"c" = (
/turf/closed/wall/rust,
/area/mafia)
"d" = (
/turf/open/floor/plating,
/area/mafia)
"e" = (
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/mafia)
"f" = (
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/mafia)
"g" = (
/obj/mafia_game_board,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/mafia)
"h" = (
/obj/structure/grille/indestructable,
/turf/open/floor/plating,
/area/mafia)
"i" = (
/turf/open/floor/plating{
icon_state = "platingdmg1"
},
/area/mafia)
"j" = (
/turf/closed/indestructible/fakedoor,
/area/mafia)
"k" = (
/obj/mafia_game_board,
/turf/open/floor/plating,
/area/mafia)
"l" = (
/obj/structure/closet/crate/coffin,
/turf/open/floor/carpet/red,
/area/mafia)
"m" = (
/obj/effect/landmark/mafia,
/turf/open/floor/carpet/red,
/area/mafia)
"n" = (
/obj/effect/landmark/mafia,
/turf/open/floor/plasteel/chapel{
dir = 1
},
/area/mafia)
"o" = (
/obj/structure/closet/crate/coffin,
/turf/open/floor/plasteel/chapel{
dir = 4
},
/area/mafia)
"p" = (
/obj/machinery/door/poddoor/preopen{
desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream.";
id = "mafia";
max_integrity = 99999;
name = "Station Night Shutters"
},
/obj/effect/spawner/structure/window/plastitanium,
/turf/open/space/basic,
/area/mafia)
"q" = (
/turf/open/floor/carpet/red,
/area/mafia)
"r" = (
/turf/open/floor/plasteel/chapel{
dir = 8
},
/area/mafia)
"t" = (
/turf/open/floor/carpet/royalblack,
/area/mafia)
"u" = (
/obj/effect/baseturf_helper/asteroid,
/obj/effect/landmark/mafia/town_center,
/turf/open/floor/carpet/royalblack,
/area/mafia)
"v" = (
/obj/mafia_game_board,
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/mafia)
"D" = (
/obj/effect/landmark/mafia,
/turf/open/floor/plasteel/chapel{
dir = 4
},
/area/mafia)
"E" = (
/turf/open/floor/plasteel/chapel{
dir = 4
},
/area/mafia)
"H" = (
/obj/structure/closet/cabinet{
anchored = 1
},
/turf/open/floor/carpet/red,
/area/mafia)
"J" = (
/obj/structure/closet/crate/coffin,
/turf/open/floor/plasteel/chapel{
dir = 1
},
/area/mafia)
"M" = (
/obj/effect/landmark/mafia,
/turf/open/floor/plasteel/chapel{
dir = 8
},
/area/mafia)
"N" = (
/obj/effect/landmark/mafia,
/turf/open/floor/plasteel/chapel,
/area/mafia)
"O" = (
/turf/open/floor/plasteel/chapel,
/area/mafia)
"P" = (
/obj/structure/closet/crate/coffin,
/turf/open/floor/plasteel/chapel,
/area/mafia)
"Q" = (
/obj/structure/closet/crate/coffin,
/turf/open/floor/plasteel/chapel{
dir = 8
},
/area/mafia)
"X" = (
/turf/open/floor/plasteel/chapel{
dir = 1
},
/area/mafia)
(1,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
a
"}
(3,1,1) = {"
a
b
b
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
b
b
a
"}
(4,1,1) = {"
a
b
b
c
g
h
d
d
d
d
d
e
d
d
d
d
d
h
k
c
b
b
a
"}
(5,1,1) = {"
a
b
b
c
h
d
d
e
b
b
j
b
j
b
b
d
d
i
h
c
b
b
a
"}
(6,1,1) = {"
a
b
b
c
i
b
b
j
b
l
q
b
X
Q
b
j
b
b
d
c
b
b
a
"}
(7,1,1) = {"
a
b
c
c
d
b
J
r
p
m
q
p
E
N
p
q
l
b
d
c
c
b
a
"}
(8,1,1) = {"
a
b
c
d
d
b
D
O
b
b
q
b
r
b
b
q
m
b
d
d
c
b
a
"}
(9,1,1) = {"
a
b
c
d
b
b
p
X
r
p
q
p
O
p
q
q
p
b
b
d
c
b
a
"}
(10,1,1) = {"
a
b
c
d
b
l
p
b
p
p
p
p
p
p
p
b
p
Q
b
d
c
b
a
"}
(11,1,1) = {"
a
b
c
d
j
m
q
q
q
p
t
t
t
p
X
r
E
N
j
e
c
b
a
"}
(12,1,1) = {"
a
b
c
e
b
b
p
b
p
p
t
u
t
p
p
b
p
b
b
d
c
b
a
"}
(13,1,1) = {"
a
b
c
d
j
n
r
E
O
p
t
t
t
p
q
q
q
m
j
d
c
b
a
"}
(14,1,1) = {"
a
b
c
d
b
o
p
b
p
p
p
p
p
p
p
b
p
l
b
i
c
b
a
"}
(15,1,1) = {"
a
b
c
d
b
b
p
q
q
p
X
p
q
p
E
O
p
b
b
d
c
b
a
"}
(16,1,1) = {"
a
b
c
f
d
b
m
q
b
b
E
b
q
b
b
X
M
b
d
d
c
b
a
"}
(17,1,1) = {"
a
b
c
c
d
b
l
q
p
n
r
p
q
m
p
E
P
b
d
c
c
b
a
"}
(18,1,1) = {"
a
b
b
c
d
b
b
j
b
o
O
b
q
H
b
j
b
b
d
c
b
b
a
"}
(19,1,1) = {"
a
b
b
c
h
i
d
d
b
b
j
b
j
b
b
d
e
d
h
c
b
b
a
"}
(20,1,1) = {"
a
b
b
c
k
h
d
d
e
d
d
d
d
d
d
d
d
h
v
c
b
b
a
"}
(21,1,1) = {"
a
b
b
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
b
b
a
"}
(22,1,1) = {"
a
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
a
"}
(23,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
+976
View File
@@ -0,0 +1,976 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/indestructible/riveted,
/area/mafia)
"c" = (
/turf/closed/wall/rust,
/area/mafia)
"d" = (
/turf/open/floor/plating,
/area/mafia)
"e" = (
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/mafia)
"f" = (
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/mafia)
"g" = (
/obj/mafia_game_board,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/mafia)
"h" = (
/obj/structure/grille/indestructable,
/turf/open/floor/plating,
/area/mafia)
"i" = (
/turf/open/floor/plating{
icon_state = "platingdmg1"
},
/area/mafia)
"j" = (
/obj/machinery/door/airlock/external{
max_integrity = 99999;
name = "Maintenance"
},
/obj/effect/mapping_helpers/airlock/locked,
/turf/open/floor/plating,
/area/mafia)
"k" = (
/obj/mafia_game_board,
/turf/open/floor/plating,
/area/mafia)
"l" = (
/obj/structure/closet{
desc = "It's a storage unit. For mining stuff. Y'know.";
icon_state = "mining";
name = "miner equipment locker"
},
/obj/item/clothing/under/rank/cargo/miner/lavaland,
/turf/open/floor/grass/fakebasalt,
/area/mafia)
"m" = (
/obj/effect/landmark/mafia,
/turf/open/floor/grass/fakebasalt,
/area/mafia)
"n" = (
/obj/effect/landmark/mafia,
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 9
},
/obj/effect/turf_decal/trimline/brown/filled/corner,
/turf/open/floor/plasteel,
/area/mafia)
"o" = (
/obj/effect/turf_decal/trimline/brown/filled/end{
icon_state = "trimline_end_fill";
dir = 4
},
/obj/structure/closet{
desc = "It's a storage unit. For mining stuff. Y'know.";
icon_state = "mining";
name = "miner equipment locker"
},
/obj/item/clothing/under/rank/cargo/miner/lavaland,
/turf/open/floor/plasteel,
/area/mafia)
"p" = (
/obj/machinery/door/poddoor/preopen{
desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream.";
id = "mafia";
max_integrity = 99999;
name = "Station Night Shutters"
},
/turf/closed/indestructible/fakeglass,
/area/mafia)
"q" = (
/turf/open/floor/grass/fakebasalt,
/area/mafia)
"r" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 9
},
/obj/structure/closet{
desc = "It's a storage unit. For mining stuff. Y'know.";
icon_state = "mining";
name = "miner equipment locker"
},
/obj/item/clothing/under/rank/cargo/miner/lavaland,
/turf/open/floor/plasteel,
/area/mafia)
"s" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 9
},
/turf/open/floor/plasteel,
/area/mafia)
"t" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/mafia)
"u" = (
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red,
/turf/open/floor/plasteel/dark,
/area/mafia)
"v" = (
/obj/mafia_game_board,
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/mafia)
"w" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 1
},
/obj/effect/turf_decal/trimline/brown/filled/corner,
/turf/open/floor/plasteel,
/area/mafia)
"x" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 1
},
/obj/effect/turf_decal/trimline/brown/filled/line,
/turf/open/floor/plasteel,
/area/mafia)
"y" = (
/obj/effect/turf_decal/trimline/brown/filled/end{
icon_state = "trimline_end_fill";
dir = 4
},
/turf/open/floor/plasteel,
/area/mafia)
"z" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 5
},
/obj/structure/closet{
desc = "It's a storage unit. For mining stuff. Y'know.";
icon_state = "mining";
name = "miner equipment locker"
},
/obj/item/clothing/under/rank/cargo/miner/lavaland,
/turf/open/floor/plasteel,
/area/mafia)
"A" = (
/obj/effect/landmark/mafia,
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 6
},
/turf/open/floor/plasteel,
/area/mafia)
"B" = (
/obj/effect/turf_decal/trimline/brown/filled/end{
icon_state = "trimline_end_fill";
dir = 1
},
/turf/open/floor/plasteel,
/area/mafia)
"C" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 4
},
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 8
},
/turf/open/floor/plasteel,
/area/mafia)
"D" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 10
},
/obj/effect/turf_decal/trimline/brown/filled/corner{
icon_state = "trimline_corner_fill";
dir = 4
},
/turf/open/floor/plasteel,
/area/mafia)
"E" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 1
},
/obj/effect/turf_decal/trimline/brown/filled/corner{
icon_state = "trimline_corner_fill";
dir = 8
},
/turf/open/floor/plasteel,
/area/mafia)
"F" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 5
},
/turf/open/floor/plasteel,
/area/mafia)
"G" = (
/obj/effect/landmark/mafia,
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 10
},
/turf/open/floor/plasteel,
/area/mafia)
"H" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 10
},
/obj/structure/closet{
desc = "It's a storage unit. For mining stuff. Y'know.";
icon_state = "mining";
name = "miner equipment locker"
},
/obj/item/clothing/under/rank/cargo/miner/lavaland,
/turf/open/floor/plasteel,
/area/mafia)
"I" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 6
},
/obj/structure/closet{
desc = "It's a storage unit. For mining stuff. Y'know.";
icon_state = "mining";
name = "miner equipment locker"
},
/obj/item/clothing/under/rank/cargo/miner/lavaland,
/turf/open/floor/plasteel,
/area/mafia)
"J" = (
/obj/effect/landmark/mafia,
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 6
},
/obj/effect/turf_decal/trimline/brown/filled/corner{
icon_state = "trimline_corner_fill";
dir = 1
},
/turf/open/floor/plasteel,
/area/mafia)
"K" = (
/obj/effect/turf_decal/trimline/brown/filled/end{
icon_state = "trimline_end_fill";
dir = 8
},
/obj/structure/closet{
desc = "It's a storage unit. For mining stuff. Y'know.";
icon_state = "mining";
name = "miner equipment locker"
},
/obj/item/clothing/under/rank/cargo/miner/lavaland,
/turf/open/floor/plasteel,
/area/mafia)
"L" = (
/obj/effect/landmark/mafia,
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 5
},
/turf/open/floor/plasteel,
/area/mafia)
"M" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 10
},
/turf/open/floor/plasteel,
/area/mafia)
"N" = (
/obj/effect/turf_decal/trimline/brown/filled/line,
/obj/effect/turf_decal/trimline/brown/filled/corner{
icon_state = "trimline_corner_fill";
dir = 4
},
/turf/open/floor/plasteel,
/area/mafia)
"O" = (
/obj/effect/turf_decal/trimline/brown/filled/corner{
icon_state = "trimline_corner_fill";
dir = 8
},
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 5
},
/turf/open/floor/plasteel,
/area/mafia)
"P" = (
/obj/effect/turf_decal/trimline/brown/filled/end,
/turf/open/floor/plasteel,
/area/mafia)
"Q" = (
/obj/effect/landmark/mafia,
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 9
},
/turf/open/floor/plasteel,
/area/mafia)
"R" = (
/obj/effect/baseturf_helper/asteroid,
/obj/effect/landmark/mafia/town_center,
/obj/effect/turf_decal/tile/red,
/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/dark,
/area/mafia)
"S" = (
/obj/effect/turf_decal/trimline/brown/filled/end{
icon_state = "trimline_end_fill";
dir = 8
},
/turf/open/floor/plasteel,
/area/mafia)
"T" = (
/obj/effect/turf_decal/trimline/brown/filled/line,
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 1
},
/turf/open/floor/plasteel,
/area/mafia)
"U" = (
/obj/effect/turf_decal/trimline/brown/filled/line,
/obj/effect/turf_decal/trimline/brown/filled/corner{
icon_state = "trimline_corner_fill";
dir = 1
},
/turf/open/floor/plasteel,
/area/mafia)
"V" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
icon_state = "trimline_fill";
dir = 6
},
/turf/open/floor/plasteel,
/area/mafia)
"W" = (
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red{
dir = 1
},
/turf/open/floor/plasteel/dark,
/area/mafia)
"X" = (
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/mafia)
"Y" = (
/turf/closed/indestructible{
icon = 'icons/turf/walls/reinforced_wall.dmi';
icon_state = "r_wall";
name = "reinforced wall"
},
/area/mafia)
(1,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
a
"}
(3,1,1) = {"
a
Y
Y
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
Y
Y
a
"}
(4,1,1) = {"
a
Y
Y
c
g
h
d
d
d
d
d
e
d
d
d
d
d
h
k
c
Y
Y
a
"}
(5,1,1) = {"
a
Y
Y
c
h
d
d
e
Y
Y
j
Y
j
Y
Y
d
d
i
h
c
Y
Y
a
"}
(6,1,1) = {"
a
Y
Y
c
i
Y
Y
j
Y
l
q
Y
s
H
Y
j
Y
Y
d
c
Y
Y
a
"}
(7,1,1) = {"
a
Y
c
c
d
Y
r
M
p
m
q
p
w
A
p
q
l
Y
d
c
c
Y
a
"}
(8,1,1) = {"
a
Y
c
d
d
Y
L
N
Y
Y
q
Y
x
Y
Y
q
m
Y
d
d
c
Y
a
"}
(9,1,1) = {"
a
Y
c
d
Y
Y
p
O
P
p
q
p
y
p
q
q
p
Y
Y
d
c
Y
a
"}
(10,1,1) = {"
a
Y
c
d
Y
l
p
Y
p
p
p
p
p
p
p
Y
p
K
Y
d
c
Y
a
"}
(11,1,1) = {"
a
Y
c
d
j
m
q
q
q
p
q
u
q
p
B
C
C
J
j
e
c
Y
a
"}
(12,1,1) = {"
a
Y
c
e
Y
Y
p
Y
p
p
t
R
X
p
p
Y
p
Y
Y
d
c
Y
a
"}
(13,1,1) = {"
a
Y
c
d
j
n
C
C
P
p
q
W
q
p
q
q
q
m
j
d
c
Y
a
"}
(14,1,1) = {"
a
Y
c
d
Y
o
p
Y
p
p
p
p
p
p
p
Y
p
l
Y
i
c
Y
a
"}
(15,1,1) = {"
a
Y
c
d
Y
Y
p
q
q
p
S
p
q
p
B
D
p
Y
Y
d
c
Y
a
"}
(16,1,1) = {"
a
Y
c
f
d
Y
m
q
Y
Y
T
Y
q
Y
Y
E
G
Y
d
d
c
Y
a
"}
(17,1,1) = {"
a
Y
c
c
d
Y
l
q
p
Q
U
p
q
m
p
F
I
Y
d
c
c
Y
a
"}
(18,1,1) = {"
a
Y
Y
c
d
Y
Y
j
Y
z
V
Y
q
l
Y
j
Y
Y
d
c
Y
Y
a
"}
(19,1,1) = {"
a
Y
Y
c
h
i
d
d
Y
Y
j
Y
j
Y
Y
d
e
d
h
c
Y
Y
a
"}
(20,1,1) = {"
a
Y
Y
c
k
h
d
d
e
d
d
d
d
d
d
d
d
h
v
c
Y
Y
a
"}
(21,1,1) = {"
a
Y
Y
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
Y
Y
a
"}
(22,1,1) = {"
a
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
Y
a
"}
(23,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
+658
View File
@@ -0,0 +1,658 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/indestructible/riveted,
/area/mafia)
"b" = (
/turf/open/indestructible/reebe_void,
/area/mafia)
"c" = (
/turf/open/indestructible/reebe_void/spawning/lattices,
/area/mafia)
"d" = (
/obj/mafia_game_board,
/turf/open/indestructible/reebe_void/spawning/lattices,
/area/mafia)
"e" = (
/turf/closed/wall/clockwork,
/area/mafia)
"f" = (
/turf/open/floor/clockwork/reebe,
/area/mafia)
"g" = (
/obj/effect/landmark/mafia,
/turf/open/floor/clockwork/reebe,
/area/mafia)
"h" = (
/obj/structure/window/reinforced/clockwork/fulltile,
/obj/structure/grille/ratvar,
/obj/machinery/door/poddoor/preopen{
desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream.";
id = "mafia";
max_integrity = 99999;
name = "Station Night Shutters"
},
/turf/open/floor/clockwork/reebe,
/area/mafia)
"i" = (
/obj/structure/bed,
/obj/item/bedsheet/orange,
/turf/open/floor/clockwork/reebe,
/area/mafia)
"j" = (
/obj/structure/chair/brass{
dir = 4
},
/turf/open/floor/clockwork/reebe,
/area/mafia)
"k" = (
/obj/structure/chair/brass,
/turf/open/floor/clockwork/reebe,
/area/mafia)
"l" = (
/obj/structure/chair/brass{
dir = 8
},
/turf/open/floor/clockwork/reebe,
/area/mafia)
"m" = (
/obj/effect/baseturf_helper/asteroid,
/obj/effect/landmark/mafia/town_center,
/obj/structure/chair/brass,
/turf/open/floor/clockwork/reebe,
/area/mafia)
"n" = (
/obj/structure/chair/brass{
icon_state = "brass_chair";
dir = 1
},
/turf/open/floor/clockwork/reebe,
/area/mafia)
"o" = (
/obj/item/toy/plush/plushvar,
/turf/open/floor/clockwork/reebe,
/area/mafia)
"p" = (
/obj/structure/window/reinforced/clockwork/fulltile,
/obj/structure/grille/ratvar,
/turf/open/floor/clockwork/reebe,
/area/mafia)
"q" = (
/obj/item/toy/plush/plushvar,
/turf/open/indestructible/reebe_void/spawning/lattices,
/area/mafia)
(1,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
a
"}
(3,1,1) = {"
a
b
b
c
c
c
b
b
b
b
b
b
b
b
b
b
b
c
c
c
b
b
a
"}
(4,1,1) = {"
a
b
b
c
d
c
b
b
b
b
b
b
b
b
b
b
b
q
d
c
b
b
a
"}
(5,1,1) = {"
a
b
b
c
c
c
c
b
e
e
p
e
p
e
e
b
b
c
c
c
b
b
a
"}
(6,1,1) = {"
a
b
b
b
b
p
p
e
e
i
f
e
f
i
e
e
p
p
c
b
b
b
a
"}
(7,1,1) = {"
a
b
b
b
b
p
i
f
h
g
f
h
f
g
h
f
i
p
b
b
b
b
a
"}
(8,1,1) = {"
a
b
b
b
b
e
g
f
e
e
f
e
f
e
e
f
g
e
b
b
b
b
a
"}
(9,1,1) = {"
a
b
b
b
e
e
h
f
j
h
j
h
j
h
j
f
h
e
e
b
b
b
a
"}
(10,1,1) = {"
a
b
b
b
e
i
h
e
h
h
h
h
h
h
h
e
h
i
e
b
b
b
a
"}
(11,1,1) = {"
a
b
b
b
p
g
f
f
k
h
f
f
o
h
n
f
f
g
p
b
b
b
a
"}
(12,1,1) = {"
a
b
b
b
e
e
h
e
h
h
f
m
f
h
h
e
h
e
e
b
b
b
a
"}
(13,1,1) = {"
a
b
b
b
p
g
f
f
k
h
f
f
f
h
n
f
f
g
p
b
b
b
a
"}
(14,1,1) = {"
a
b
b
b
e
i
h
e
h
h
h
h
h
h
h
e
h
i
e
b
b
b
a
"}
(15,1,1) = {"
a
b
b
b
e
e
h
f
l
h
l
h
l
h
l
f
h
e
e
b
b
b
a
"}
(16,1,1) = {"
a
b
b
b
b
e
g
f
e
e
f
e
f
e
e
f
g
e
b
b
b
b
a
"}
(17,1,1) = {"
a
b
b
b
b
p
i
f
h
g
f
h
f
g
h
f
i
p
b
b
b
b
a
"}
(18,1,1) = {"
a
b
b
b
b
p
p
e
e
f
i
e
i
f
e
e
p
p
c
b
b
b
a
"}
(19,1,1) = {"
a
b
b
c
c
c
c
b
e
e
p
e
p
e
e
b
b
c
c
c
b
b
a
"}
(20,1,1) = {"
a
b
b
c
d
c
b
b
b
b
b
b
b
b
b
b
b
c
d
c
b
b
a
"}
(21,1,1) = {"
a
b
b
c
c
c
b
b
b
b
b
b
b
b
b
b
b
c
c
c
b
b
a
"}
(22,1,1) = {"
a
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
a
"}
(23,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
+755
View File
@@ -0,0 +1,755 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/indestructible/riveted,
/area/mafia)
"d" = (
/turf/open/floor/plating,
/area/mafia)
"e" = (
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/mafia)
"f" = (
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/mafia)
"g" = (
/obj/mafia_game_board,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/mafia)
"h" = (
/obj/structure/grille/indestructable,
/turf/open/floor/plating,
/area/mafia)
"i" = (
/turf/open/floor/plating{
icon_state = "platingdmg1"
},
/area/mafia)
"j" = (
/obj/machinery/door/airlock/maintenance_hatch{
max_integrity = 99999;
name = "Maintenance"
},
/obj/effect/mapping_helpers/airlock/locked,
/turf/open/floor/plating,
/area/mafia)
"k" = (
/obj/mafia_game_board,
/turf/open/floor/plating,
/area/mafia)
"l" = (
/obj/item/bedsheet/brown,
/obj/structure/bed,
/turf/open/floor/holofloor/wood,
/area/mafia)
"m" = (
/obj/effect/landmark/mafia,
/turf/open/floor/holofloor/wood,
/area/mafia)
"n" = (
/obj/item/bedsheet/green,
/obj/structure/bed,
/turf/open/floor/holofloor/wood,
/area/mafia)
"o" = (
/obj/item/bedsheet/blue,
/obj/structure/bed,
/turf/open/floor/holofloor/wood,
/area/mafia)
"p" = (
/obj/machinery/door/poddoor/preopen{
desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream.";
id = "mafia";
max_integrity = 99999;
name = "Station Night Shutters"
},
/turf/closed/indestructible/fakeglass,
/area/mafia)
"q" = (
/turf/open/floor/plasteel/dark,
/area/mafia)
"r" = (
/turf/open/floor/plasteel,
/area/mafia)
"s" = (
/turf/closed/wall/ice,
/area/mafia)
"t" = (
/turf/open/floor/holofloor/snow,
/area/mafia)
"u" = (
/obj/structure/statue/plasma/scientist{
anchored = 1
},
/turf/open/floor/holofloor/snow,
/area/mafia)
"v" = (
/obj/effect/baseturf_helper/asteroid,
/obj/effect/landmark/mafia/town_center,
/turf/open/floor/holofloor/snow,
/area/mafia)
"w" = (
/turf/open/lava/plasma,
/area/mafia)
"x" = (
/obj/machinery/door/airlock/external{
max_integrity = 9999;
opacity = 0
},
/obj/machinery/door/poddoor/preopen{
desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream.";
id = "mafia";
max_integrity = 99999;
name = "Station Night Shutters"
},
/obj/effect/mapping_helpers/airlock/locked,
/turf/open/floor/plasteel/dark,
/area/mafia)
"y" = (
/obj/effect/landmark/mafia,
/turf/open/floor/holofloor/snow,
/area/mafia)
"z" = (
/obj/structure/lattice/catwalk,
/turf/open/lava/plasma,
/area/mafia)
"A" = (
/obj/machinery/door/airlock/external{
max_integrity = 9999
},
/obj/machinery/door/poddoor/preopen{
desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream.";
id = "mafia";
max_integrity = 99999;
name = "Station Night Shutters"
},
/obj/effect/mapping_helpers/airlock/locked,
/turf/open/floor/plasteel,
/area/mafia)
"B" = (
/obj/effect/landmark/mafia,
/obj/structure/lattice/catwalk,
/turf/open/lava/plasma,
/area/mafia)
"C" = (
/obj/mafia_game_board,
/turf/open/floor/holofloor/snow,
/area/mafia)
"D" = (
/obj/structure/closet/crate/science,
/obj/item/clothing/suit/hooded/wintercoat,
/obj/item/clothing/shoes/winterboots,
/turf/open/floor/holofloor/snow,
/area/mafia)
"E" = (
/obj/structure/lattice/catwalk,
/obj/structure/closet/crate/critter,
/obj/item/clothing/suit/hooded/wintercoat/miner,
/obj/item/clothing/shoes/winterboots,
/turf/open/lava/plasma,
/area/mafia)
"F" = (
/turf/open/floor/holofloor/wood,
/area/mafia)
"G" = (
/obj/item/bedsheet/orange,
/obj/structure/bed,
/turf/open/floor/holofloor/wood,
/area/mafia)
"H" = (
/obj/item/bedsheet/black,
/obj/structure/bed,
/turf/open/floor/holofloor/wood,
/area/mafia)
"I" = (
/obj/item/bedsheet/red,
/obj/structure/bed,
/turf/open/floor/holofloor/wood,
/area/mafia)
"J" = (
/turf/open/floor/plating/snowed/smoothed,
/area/mafia)
"K" = (
/turf/closed/indestructible/rock/snow,
/area/mafia)
(1,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
s
K
K
K
K
K
K
K
K
K
K
a
"}
(3,1,1) = {"
a
a
a
s
s
s
s
s
s
s
s
s
w
w
t
w
w
w
w
w
w
K
a
"}
(4,1,1) = {"
a
a
a
s
g
h
d
d
d
d
d
s
t
w
w
w
w
w
C
w
w
K
a
"}
(5,1,1) = {"
a
a
a
s
h
d
d
e
s
s
j
s
p
p
p
w
w
w
w
w
w
K
a
"}
(6,1,1) = {"
a
a
a
s
i
s
s
j
s
H
F
s
t
D
p
p
p
p
w
w
w
K
a
"}
(7,1,1) = {"
a
a
s
s
d
s
o
F
p
m
q
p
t
y
p
z
E
p
w
t
w
K
a
"}
(8,1,1) = {"
a
a
s
d
d
s
m
r
s
s
q
s
t
p
p
z
B
p
w
w
w
K
a
"}
(9,1,1) = {"
a
a
s
d
s
s
p
r
r
p
q
p
t
p
z
z
p
p
p
w
w
K
a
"}
(10,1,1) = {"
a
a
s
d
s
l
p
s
p
p
p
p
p
p
p
p
p
D
p
w
w
K
a
"}
(11,1,1) = {"
a
a
s
d
j
m
F
q
q
x
J
t
t
p
t
t
t
y
p
w
t
K
a
"}
(12,1,1) = {"
a
a
s
e
s
a
p
s
p
p
u
v
t
p
p
p
p
p
p
w
w
K
a
"}
(13,1,1) = {"
a
a
s
d
j
m
F
r
r
A
J
t
t
p
t
t
t
y
p
w
w
K
a
"}
(14,1,1) = {"
a
a
s
d
s
n
p
s
p
p
p
p
p
p
p
p
p
D
p
w
w
K
a
"}
(15,1,1) = {"
a
a
s
d
s
s
p
q
q
p
r
p
t
p
z
z
p
p
p
w
w
K
a
"}
(16,1,1) = {"
a
a
s
f
d
s
m
q
s
s
r
s
t
p
p
z
B
p
w
w
w
K
a
"}
(17,1,1) = {"
a
a
s
s
d
s
G
F
p
m
r
p
t
y
p
z
E
p
w
w
w
K
a
"}
(18,1,1) = {"
a
a
a
s
d
s
s
j
s
I
F
s
t
D
p
p
p
p
w
t
w
K
a
"}
(19,1,1) = {"
a
a
a
s
h
i
d
d
s
s
j
s
p
p
p
t
w
w
w
w
w
K
a
"}
(20,1,1) = {"
a
a
a
s
k
h
d
d
e
d
d
s
t
w
w
w
w
w
C
w
w
K
a
"}
(21,1,1) = {"
a
a
a
s
s
s
s
s
s
s
s
s
w
w
w
w
w
w
w
w
w
K
a
"}
(22,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
s
K
K
K
K
K
K
K
K
K
K
a
"}
(23,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
+690
View File
@@ -0,0 +1,690 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/indestructible/riveted,
/area/mafia)
"b" = (
/obj/structure/closet/cabinet{
anchored = 1
},
/obj/item/reagent_containers/food/snacks/sashimi,
/turf/open/floor/carpet/black,
/area/mafia)
"c" = (
/turf/closed/wall/rust,
/area/mafia)
"d" = (
/turf/open/floor/plating,
/area/mafia)
"e" = (
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/mafia)
"f" = (
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/mafia)
"g" = (
/obj/mafia_game_board,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/mafia)
"h" = (
/obj/structure/grille/indestructable,
/turf/open/floor/plating,
/area/mafia)
"i" = (
/turf/open/floor/plating{
icon_state = "platingdmg1"
},
/area/mafia)
"j" = (
/turf/closed/wall/mineral/wood{
desc = "A door that goes nowhere. How kafkaesque.";
icon = 'icons/obj/doors/mineral_doors.dmi';
icon_state = "paperframe";
name = "Door"
},
/area/mafia)
"k" = (
/obj/mafia_game_board,
/turf/open/floor/plating,
/area/mafia)
"m" = (
/obj/effect/landmark/mafia,
/turf/open/floor/wood,
/area/mafia)
"n" = (
/obj/effect/landmark/mafia,
/turf/open/floor/carpet/black,
/area/mafia)
"o" = (
/obj/structure/closet/cabinet{
anchored = 1
},
/obj/item/reagent_containers/food/snacks/sashimi,
/turf/open/floor/wood,
/area/mafia)
"p" = (
/obj/machinery/door/poddoor/preopen{
desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream.";
id = "mafia";
max_integrity = 99999;
name = "Station Night Shutters"
},
/turf/closed/indestructible/fakeglass{
icon = 'icons/obj/smooth_structures/paperframes.dmi';
icon_state = "paper"
},
/area/mafia)
"q" = (
/turf/open/floor/wood,
/area/mafia)
"r" = (
/turf/open/floor/carpet/black,
/area/mafia)
"t" = (
/turf/open/floor/plating/beach/sand,
/area/mafia)
"u" = (
/obj/effect/baseturf_helper/asteroid,
/obj/effect/landmark/mafia/town_center,
/turf/open/floor/plating/beach/sand,
/area/mafia)
"v" = (
/obj/mafia_game_board,
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/mafia)
"B" = (
/obj/structure/showcase{
density = 0;
desc = "Welp, only one way to recover your honour.";
icon = 'icons/obj/items_and_weapons.dmi';
icon_state = "katana";
name = "seppuku katana"
},
/turf/open/floor/plating/beach/sand,
/area/mafia)
"S" = (
/turf/closed/wall/mineral/wood,
/area/mafia)
(1,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
a
"}
(3,1,1) = {"
a
S
S
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
S
S
a
"}
(4,1,1) = {"
a
S
S
c
g
h
d
d
d
d
d
e
d
d
d
d
d
h
k
c
S
S
a
"}
(5,1,1) = {"
a
S
S
c
h
d
d
e
S
S
j
S
j
S
S
d
d
i
h
c
S
S
a
"}
(6,1,1) = {"
a
S
S
c
i
S
S
j
S
o
q
S
r
b
S
j
S
S
d
c
S
S
a
"}
(7,1,1) = {"
a
S
c
c
d
S
b
r
p
m
q
p
r
n
p
q
o
S
d
c
c
S
a
"}
(8,1,1) = {"
a
S
c
d
d
S
n
r
S
S
q
S
r
S
S
q
m
S
d
d
c
S
a
"}
(9,1,1) = {"
a
S
c
d
S
S
p
r
r
p
q
p
r
p
q
q
p
S
S
d
c
S
a
"}
(10,1,1) = {"
a
S
c
d
S
o
p
S
p
p
p
p
p
p
p
S
p
b
S
d
c
S
a
"}
(11,1,1) = {"
a
S
c
d
j
m
q
q
q
p
t
t
t
p
r
r
r
n
j
e
c
S
a
"}
(12,1,1) = {"
a
S
c
e
S
S
p
S
p
p
t
u
B
p
p
S
p
S
S
d
c
S
a
"}
(13,1,1) = {"
a
S
c
d
j
n
r
r
r
p
t
t
t
p
q
q
q
m
j
d
c
S
a
"}
(14,1,1) = {"
a
S
c
d
S
b
p
S
p
p
p
p
p
p
p
S
p
o
S
i
c
S
a
"}
(15,1,1) = {"
a
S
c
d
S
S
p
q
q
p
r
p
q
p
r
r
p
S
S
d
c
S
a
"}
(16,1,1) = {"
a
S
c
f
d
S
m
q
S
S
r
S
q
S
S
r
n
S
d
d
c
S
a
"}
(17,1,1) = {"
a
S
c
c
d
S
o
q
p
n
r
p
q
m
p
r
b
S
d
c
c
S
a
"}
(18,1,1) = {"
a
S
S
c
d
S
S
j
S
b
r
S
q
o
S
j
S
S
d
c
S
S
a
"}
(19,1,1) = {"
a
S
S
c
h
i
d
d
S
S
j
S
j
S
S
d
e
d
h
c
S
S
a
"}
(20,1,1) = {"
a
S
S
c
k
h
d
d
e
d
d
d
d
d
d
d
d
h
v
c
S
S
a
"}
(21,1,1) = {"
a
S
S
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
S
S
a
"}
(22,1,1) = {"
a
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
S
a
"}
(23,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
+869
View File
@@ -0,0 +1,869 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/indestructible/riveted,
/area/mafia)
"b" = (
/obj/structure/closet/syndicate{
desc = "A storage closet for syndicate conflict resolution operatives.";
name = "red closet"
},
/obj/item/clothing/under/syndicate/tacticool,
/obj/item/clothing/under/syndicate/tacticool/skirt,
/turf/open/floor/mineral/plastitanium,
/area/mafia)
"c" = (
/turf/closed/wall/rust,
/area/mafia)
"d" = (
/turf/open/floor/plating,
/area/mafia)
"e" = (
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/mafia)
"f" = (
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/mafia)
"g" = (
/obj/mafia_game_board,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/mafia)
"h" = (
/obj/structure/grille/indestructable,
/turf/open/floor/plating,
/area/mafia)
"i" = (
/turf/open/floor/plating{
icon_state = "platingdmg1"
},
/area/mafia)
"j" = (
/obj/machinery/door/airlock/maintenance_hatch{
max_integrity = 99999;
name = "Maintenance"
},
/obj/effect/mapping_helpers/airlock/locked,
/turf/open/floor/plating,
/area/mafia)
"k" = (
/obj/mafia_game_board,
/turf/open/floor/plating,
/area/mafia)
"l" = (
/obj/structure/closet/syndicate{
desc = "A storage closet for syndicate conflict resolution operatives.";
name = "red closet"
},
/obj/item/clothing/under/syndicate/tacticool,
/obj/item/clothing/under/syndicate/tacticool/skirt,
/obj/effect/turf_decal/tile/red,
/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/dark,
/area/mafia)
"m" = (
/obj/structure/closet/syndicate{
desc = "A storage closet for syndicate conflict resolution operatives.";
name = "red closet"
},
/obj/item/clothing/under/syndicate/tacticool,
/obj/item/clothing/under/syndicate/tacticool/skirt,
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/mafia)
"n" = (
/obj/effect/landmark/mafia,
/turf/open/floor/mineral/plastitanium,
/area/mafia)
"o" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red{
dir = 1
},
/turf/open/floor/plasteel/dark,
/area/mafia)
"p" = (
/obj/machinery/door/poddoor/preopen{
desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream.";
id = "mafia";
max_integrity = 99999;
name = "Station Night Shutters"
},
/obj/effect/spawner/structure/window/plastitanium,
/turf/open/space/basic,
/area/mafia)
"q" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/structure/chair/office{
dir = 1;
name = "tactical swivel chair"
},
/turf/open/floor/plasteel/dark,
/area/mafia)
"r" = (
/turf/open/floor/mineral/plastitanium,
/area/mafia)
"s" = (
/turf/open/floor/mineral/plastitanium/red,
/area/mafia)
"t" = (
/turf/open/floor/circuit/red,
/area/mafia)
"u" = (
/obj/effect/baseturf_helper/asteroid,
/obj/effect/landmark/mafia/town_center,
/obj/structure/chair,
/turf/open/floor/circuit/red,
/area/mafia)
"v" = (
/obj/mafia_game_board,
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/mafia)
"w" = (
/turf/closed/indestructible/syndicate,
/area/mafia)
"x" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/structure/chair/office{
dir = 4;
name = "tactical swivel chair"
},
/turf/open/floor/plasteel/dark,
/area/mafia)
"y" = (
/obj/structure/chair/office{
dir = 2;
name = "tactical swivel chair"
},
/turf/open/floor/mineral/plastitanium,
/area/mafia)
"z" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/structure/chair/office{
dir = 2;
name = "tactical swivel chair"
},
/turf/open/floor/plasteel/dark,
/area/mafia)
"A" = (
/obj/structure/chair/office{
dir = 8;
name = "tactical swivel chair"
},
/turf/open/floor/mineral/plastitanium,
/area/mafia)
"B" = (
/obj/structure/chair/office{
dir = 4;
name = "tactical swivel chair"
},
/turf/open/floor/mineral/plastitanium,
/area/mafia)
"C" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/structure/chair/office{
dir = 8;
name = "tactical swivel chair"
},
/turf/open/floor/plasteel/dark,
/area/mafia)
"E" = (
/obj/structure/chair/office{
dir = 1;
name = "tactical swivel chair"
},
/turf/open/floor/mineral/plastitanium,
/area/mafia)
"F" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/structure/closet/syndicate{
desc = "A storage closet for syndicate conflict resolution operatives.";
name = "red closet"
},
/obj/item/clothing/under/syndicate/tacticool,
/obj/item/clothing/under/syndicate/tacticool/skirt,
/turf/open/floor/plasteel/dark,
/area/mafia)
"G" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/item/clothing/under/syndicate/tacticool,
/obj/structure/closet/syndicate{
desc = "A storage closet for syndicate conflict resolution operatives.";
name = "red closet"
},
/obj/item/clothing/under/syndicate/tacticool/skirt,
/turf/open/floor/plasteel/dark,
/area/mafia)
"H" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/landmark/mafia,
/turf/open/floor/plasteel/dark,
/area/mafia)
(1,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
a
"}
(3,1,1) = {"
a
w
w
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
w
w
a
"}
(4,1,1) = {"
a
w
w
c
g
h
d
d
d
d
d
e
d
d
d
d
d
h
k
c
w
w
a
"}
(5,1,1) = {"
a
w
w
c
h
d
d
e
w
w
j
w
j
w
w
d
d
i
h
c
w
w
a
"}
(6,1,1) = {"
a
w
w
c
i
w
w
j
w
b
r
w
o
F
w
j
w
w
d
c
w
w
a
"}
(7,1,1) = {"
a
w
c
c
d
w
l
o
p
n
r
p
o
H
p
r
b
w
d
c
c
w
a
"}
(8,1,1) = {"
a
w
c
d
d
w
H
o
w
w
r
w
o
w
w
r
n
w
d
d
c
w
a
"}
(9,1,1) = {"
a
w
c
d
w
w
p
o
x
p
B
p
x
p
B
r
p
w
w
d
c
w
a
"}
(10,1,1) = {"
a
w
c
d
w
b
p
w
p
p
p
p
p
p
p
w
p
m
w
d
c
w
a
"}
(11,1,1) = {"
a
w
c
d
j
n
r
r
y
p
s
t
s
p
q
o
o
H
j
e
c
w
a
"}
(12,1,1) = {"
a
w
c
e
w
w
p
w
p
p
t
u
t
p
p
w
p
w
w
d
c
w
a
"}
(13,1,1) = {"
a
w
c
d
j
H
o
o
z
p
s
t
s
p
E
r
r
n
j
d
c
w
a
"}
(14,1,1) = {"
a
w
c
d
w
l
p
w
p
p
p
p
p
p
p
w
p
b
w
i
c
w
a
"}
(15,1,1) = {"
a
w
c
d
w
w
p
r
A
p
C
p
A
p
C
o
p
w
w
d
c
w
a
"}
(16,1,1) = {"
a
w
c
f
d
w
n
r
w
w
o
w
r
w
w
o
H
w
d
d
c
w
a
"}
(17,1,1) = {"
a
w
c
c
d
w
b
r
p
H
o
p
r
n
p
o
G
w
d
c
c
w
a
"}
(18,1,1) = {"
a
w
w
c
d
w
w
j
w
F
o
w
r
b
w
j
w
w
d
c
w
w
a
"}
(19,1,1) = {"
a
w
w
c
h
i
d
d
w
w
j
w
j
w
w
d
e
d
h
c
w
w
a
"}
(20,1,1) = {"
a
w
w
c
k
h
d
d
e
d
d
d
d
d
d
d
d
h
v
c
w
w
a
"}
(21,1,1) = {"
a
w
w
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
w
w
a
"}
(22,1,1) = {"
a
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
w
a
"}
(23,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
+58 -26
View File
@@ -10324,6 +10324,7 @@
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"atd" = (
/mob/living/simple_animal/opossum,
/turf/open/floor/plating{
icon_state = "panelscorched"
},
@@ -32681,6 +32682,10 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/machinery/light{
dir = 1;
light_color = "#cee5d2"
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/foyer)
"blC" = (
@@ -36118,13 +36123,9 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"bsf" = (
/obj/machinery/light,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/foyer)
"bsg" = (
@@ -37682,16 +37683,10 @@
/turf/closed/wall,
/area/aisat)
"bvu" = (
/obj/structure/table/wood,
/obj/machinery/light/small{
dir = 8
},
/obj/item/radio/off{
pixel_y = 4
},
/obj/item/screwdriver{
pixel_y = 10
},
/obj/machinery/announcement_system,
/turf/open/floor/plasteel/grimy,
/area/tcommsat/computer)
"bvv" = (
@@ -40188,12 +40183,15 @@
/area/tcommsat/computer)
"bAW" = (
/obj/structure/table/wood,
/obj/item/folder/blue,
/obj/machinery/status_display/evac{
pixel_y = 31
},
/obj/item/folder/blue,
/obj/item/pen,
/obj/item/radio/off{
pixel_y = 4
},
/obj/item/screwdriver{
pixel_y = 10
},
/turf/open/floor/plasteel/grimy,
/area/tcommsat/computer)
"bAX" = (
@@ -42716,9 +42714,12 @@
/turf/open/floor/carpet,
/area/crew_quarters/theatre)
"bGh" = (
/obj/machinery/announcement_system,
/turf/open/floor/plasteel/grimy,
/area/tcommsat/computer)
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/foyer)
"bGj" = (
/obj/machinery/vending/cola/random,
/obj/machinery/newscaster{
@@ -81595,6 +81596,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"jQK" = (
/obj/structure/lattice,
/turf/closed/wall/r_wall,
/area/aisat)
"jRo" = (
/obj/structure/table/wood,
/obj/machinery/newscaster{
@@ -81912,6 +81917,16 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"nix" = (
/obj/machinery/light/small{
dir = 8
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/foyer)
"njd" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
@@ -82135,6 +82150,16 @@
/obj/structure/grille,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"pbc" = (
/obj/structure/light_construct/small{
dir = 4
},
/obj/machinery/computer/security/telescreen/entertainment{
pixel_x = 30
},
/mob/living/simple_animal/opossum/poppy,
/turf/open/floor/wood,
/area/maintenance/port/aft)
"pbF" = (
/obj/machinery/portable_atmospherics/canister,
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
@@ -82580,6 +82605,13 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard)
"txh" = (
/obj/machinery/door/airlock/hatch{
name = "Telecomms Control Room";
req_one_access_txt = "19; 61"
},
/turf/open/floor/plasteel/dark,
/area/tcommsat/computer)
"txj" = (
/obj/structure/chair/office/light{
dir = 1
@@ -100154,7 +100186,7 @@ csT
dux
cxQ
ckS
cmi
pbc
cnk
ckP
cmi
@@ -136361,9 +136393,9 @@ bnw
bpJ
brW
aRy
bvt
aaa
aTU
aRy
aRy
jQK
aaa
aaa
aaa
@@ -136617,9 +136649,9 @@ blC
bnx
bpK
bsf
aRy
aRy
aRy
bGh
nix
bGh
aRy
aRy
aRy
@@ -136876,7 +136908,7 @@ bpL
brY
btL
btL
btL
txh
btL
btL
bCD
@@ -137133,7 +137165,7 @@ bpM
brZ
btL
bvu
bGh
bxq
bzn
bAU
bCD
+16 -2
View File
@@ -41988,6 +41988,16 @@
},
/turf/open/floor/plasteel,
/area/hydroponics)
"saI" = (
/obj/structure/cable/white{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/mob/living/simple_animal/opossum,
/turf/open/floor/plating,
/area/maintenance/starboard)
"scn" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -45205,6 +45215,10 @@
/obj/effect/landmark/carpspawn,
/turf/open/space,
/area/space/station_ruins)
"uXV" = (
/mob/living/simple_animal/opossum/poppy,
/turf/open/floor/wood,
/area/maintenance/port/aft)
"ver" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 10
@@ -79446,7 +79460,7 @@ aFM
aOH
aOT
aPV
aRm
uXV
aSI
aRC
aKm
@@ -92526,7 +92540,7 @@ aSD
aRz
aRz
aRz
sGY
saI
aRz
sIb
bsD
+107 -198
View File
@@ -334,8 +334,8 @@
/area/crew_quarters/fitness/pool)
"aaM" = (
/turf/open/floor/plasteel/yellowsiding/corner{
icon_state = "yellowcornersiding";
dir = 8
dir = 8;
icon_state = "yellowcornersiding"
},
/area/crew_quarters/fitness/pool)
"aaN" = (
@@ -354,8 +354,8 @@
/area/crew_quarters/fitness/pool)
"aaP" = (
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 8
dir = 8;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"aaQ" = (
@@ -433,8 +433,8 @@
/area/crew_quarters/fitness/pool)
"aaW" = (
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 1
dir = 1;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"aaX" = (
@@ -550,8 +550,8 @@
"abm" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 4
dir = 4;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"abn" = (
@@ -580,8 +580,8 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 4
dir = 4;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"abr" = (
@@ -595,8 +595,8 @@
"abt" = (
/obj/structure/pool/Rboard,
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 8
dir = 8;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"abu" = (
@@ -659,8 +659,8 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/yellowsiding/corner{
icon_state = "yellowcornersiding";
dir = 4
dir = 4;
icon_state = "yellowcornersiding"
},
/area/crew_quarters/fitness/pool)
"abB" = (
@@ -670,21 +670,21 @@
pixel_y = -27
},
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 1
dir = 1;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"abC" = (
/obj/machinery/light,
/turf/open/floor/plasteel/yellowsiding{
icon_state = "yellowsiding";
dir = 1
dir = 1;
icon_state = "yellowsiding"
},
/area/crew_quarters/fitness/pool)
"abD" = (
/turf/open/floor/plasteel/yellowsiding/corner{
icon_state = "yellowcornersiding";
dir = 1
dir = 1;
icon_state = "yellowcornersiding"
},
/area/crew_quarters/fitness/pool)
"abE" = (
@@ -6313,27 +6313,7 @@
"aoz" = (
/turf/closed/wall,
/area/maintenance/fore)
"aoA" = (
/obj/machinery/gateway{
dir = 9
},
/obj/effect/turf_decal/bot_white/right,
/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
},
/turf/open/floor/plasteel/dark,
/area/gateway)
"aoB" = (
/obj/machinery/gateway{
dir = 1
},
/obj/machinery/light{
dir = 1
},
@@ -6350,23 +6330,6 @@
},
/turf/open/floor/plasteel/dark,
/area/gateway)
"aoC" = (
/obj/machinery/gateway{
dir = 5
},
/obj/effect/turf_decal/bot_white/left,
/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
},
/turf/open/floor/plasteel/dark,
/area/gateway)
"aoH" = (
/obj/structure/lattice,
/obj/structure/grille,
@@ -6692,44 +6655,10 @@
},
/turf/open/space,
/area/space/nearstation)
"apq" = (
/obj/machinery/gateway{
dir = 8
},
/obj/effect/turf_decal/bot_white,
/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
},
/turf/open/floor/plasteel/dark,
/area/gateway)
"apr" = (
/obj/machinery/gateway/centerstation,
/turf/open/floor/plasteel/dark,
/area/gateway)
"aps" = (
/obj/machinery/gateway{
dir = 4
},
/obj/effect/turf_decal/bot_white,
/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
},
/turf/open/floor/plasteel/dark,
/area/gateway)
"apt" = (
/obj/structure/chair{
dir = 4
@@ -6916,9 +6845,6 @@
/turf/closed/wall/r_wall,
/area/ai_monitored/nuke_storage)
"apU" = (
/obj/machinery/gateway{
dir = 10
},
/obj/effect/turf_decal/bot_white/left,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -6933,7 +6859,6 @@
/turf/open/floor/plasteel/dark,
/area/gateway)
"apV" = (
/obj/machinery/gateway,
/obj/effect/turf_decal/bot_white,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -6948,9 +6873,6 @@
/turf/open/floor/plasteel/dark,
/area/gateway)
"apW" = (
/obj/machinery/gateway{
dir = 6
},
/obj/effect/turf_decal/bot_white/right,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -7876,32 +7798,7 @@
/turf/open/floor/plasteel,
/area/gateway)
"arY" = (
/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/flashlight,
/obj/item/flashlight,
/obj/item/flashlight,
/obj/item/flashlight,
/obj/item/flashlight,
/obj/machinery/computer/gateway_control,
/turf/open/floor/plasteel,
/area/gateway)
"arZ" = (
@@ -8904,6 +8801,32 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
},
/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/flashlight,
/obj/item/flashlight,
/obj/item/flashlight,
/obj/item/flashlight,
/obj/item/flashlight,
/turf/open/floor/plasteel,
/area/gateway)
"auh" = (
@@ -39042,7 +38965,6 @@
/area/chapel/dock)
"bKe" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/structure/closet/emcloset,
/turf/open/floor/plasteel/white{
heat_capacity = 1e+006
},
@@ -40077,12 +39999,6 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
},
/obj/machinery/light/small{
dir = 4
},
/obj/structure/chair{
dir = 1
},
/turf/open/floor/plasteel/white{
heat_capacity = 1e+006
},
@@ -47273,7 +47189,7 @@
"ceT" = (
/obj/effect/turf_decal/stripes/line,
/obj/structure/closet/emcloset,
/turf/open/floor/plating/airless,
/turf/open/floor/plating,
/area/engine/engineering)
"ceU" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
@@ -50404,9 +50320,11 @@
/turf/open/floor/plasteel,
/area/crew_quarters/heads/chief)
"cqW" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/closed/mineral,
/area/chapel/asteroid/monastery)
/obj/structure/chair,
/turf/open/floor/plasteel/white{
heat_capacity = 1e+006
},
/area/chapel/dock)
"cqX" = (
/obj/structure/disposalpipe/segment,
/obj/structure/lattice,
@@ -52993,7 +52911,7 @@
/turf/open/floor/plasteel/dark,
/area/security/main)
"cCT" = (
/obj/machinery/rnd/production/protolathe/department/cargo,
/obj/machinery/rnd/production/techfab/department/cargo,
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"cCU" = (
@@ -54128,6 +54046,20 @@
},
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
"fgS" = (
/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/opossum/poppy,
/turf/open/floor/plasteel/dark,
/area/maintenance/department/engine)
"fhM" = (
/obj/item/storage/secure/safe{
pixel_x = -22
@@ -55664,11 +55596,11 @@
/turf/open/floor/plating,
/area/crew_quarters/dorms)
"izF" = (
/turf/open/floor/plating{
initial_gas_mix = "o2=0.01;n2=0.01";
luminosity = 2
/obj/structure/closet/emcloset,
/turf/open/floor/plasteel/white{
heat_capacity = 1e+006
},
/area/maintenance/department/science)
/area/chapel/dock)
"iAx" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -57738,10 +57670,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
/turf/open/floor/plating{
initial_gas_mix = "o2=0.01;n2=0.01";
luminosity = 2
},
/turf/open/floor/plating,
/area/maintenance/department/science)
"nAs" = (
/obj/machinery/door/airlock/engineering/glass{
@@ -57904,7 +57833,7 @@
/obj/structure/disposalpipe/trunk{
dir = 8
},
/turf/open/floor/plating,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"nOY" = (
/obj/effect/turf_decal/stripes/line{
@@ -58007,10 +57936,7 @@
/obj/structure/table,
/obj/item/paper_bin,
/obj/item/pen,
/turf/open/floor/plating{
initial_gas_mix = "o2=0.01;n2=0.01";
luminosity = 2
},
/turf/open/floor/plating,
/area/maintenance/department/science)
"odM" = (
/obj/effect/landmark/barthpot,
@@ -58733,6 +58659,10 @@
"pyw" = (
/turf/open/space/basic,
/area/hallway/secondary/entry)
"pzF" = (
/mob/living/simple_animal/opossum,
/turf/open/floor/wood,
/area/maintenance/department/crew_quarters/dorms)
"pBD" = (
/obj/structure/cable{
icon_state = "0-8"
@@ -59532,14 +59462,13 @@
/turf/open/floor/plating/airless,
/area/space/nearstation)
"ros" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
/obj/machinery/light/small{
dir = 4
},
/turf/open/floor/plating{
initial_gas_mix = "o2=0.01;n2=0.01";
luminosity = 2
/turf/open/floor/plasteel/white{
heat_capacity = 1e+006
},
/area/maintenance/department/science)
/area/chapel/dock)
"rrb" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -60138,7 +60067,6 @@
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"tap" = (
/obj/structure/reagent_dispensers/keg/aphro,
/turf/open/floor/wood,
/area/maintenance/department/crew_quarters/dorms)
"taA" = (
@@ -60667,10 +60595,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
/turf/open/floor/plating{
initial_gas_mix = "o2=0.01;n2=0.01";
luminosity = 2
},
/turf/open/floor/plating,
/area/maintenance/department/science)
"uos" = (
/obj/machinery/computer/camera_advanced/base_construction,
@@ -61099,13 +61024,6 @@
/obj/structure/lattice,
/turf/open/space/basic,
/area/space/nearstation)
"vpz" = (
/obj/structure/girder,
/turf/open/floor/plating{
initial_gas_mix = "o2=0.01;n2=0.01";
luminosity = 2
},
/area/maintenance/department/science)
"vsk" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -61620,12 +61538,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/bar)
"wDe" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plasteel/white{
heat_capacity = 1e+006
},
/area/chapel/dock)
"wDl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/stripes/corner,
@@ -62038,10 +61950,7 @@
/area/maintenance/department/science)
"xsO" = (
/obj/item/ectoplasm,
/turf/open/floor/plating{
initial_gas_mix = "o2=0.01;n2=0.01";
luminosity = 2
},
/turf/open/floor/plating,
/area/maintenance/department/science)
"xuv" = (
/obj/item/broken_bottle,
@@ -75866,8 +75775,8 @@ aaa
bGI
bNs
cfN
cqW
cqW
cfN
cfN
cfN
cfN
bZY
@@ -76379,7 +76288,7 @@ aaa
aaa
bGI
bNs
cqW
cfN
bOw
cfN
bOw
@@ -80477,7 +80386,7 @@ aaa
aht
aqG
bGE
bKf
cqW
bKf
bMw
bNy
@@ -80734,8 +80643,8 @@ aht
aht
aqG
bGE
bKf
bKf
izF
ros
bMx
bNz
bHM
@@ -80991,7 +80900,7 @@ aaa
aaa
aqG
bGE
wDe
bGE
bHM
bHM
bNA
@@ -83563,7 +83472,7 @@ bHP
bJb
bJb
bJb
bJb
fgS
bJb
bJb
bPp
@@ -97884,8 +97793,8 @@ aaa
aaa
aaa
lcZ
aoA
apq
apW
apV
apU
aqQ
arX
@@ -98398,8 +98307,8 @@ aiT
aiS
aaa
lcZ
aoC
aps
apU
apV
apW
aqS
arZ
@@ -99932,7 +99841,7 @@ akh
alc
alR
amF
alb
pzF
alb
anm
ajv
@@ -107723,7 +107632,7 @@ aht
bwm
ikB
iVJ
izF
lWy
typ
bwm
aht
@@ -108233,7 +108142,7 @@ bwm
svN
bIQ
uek
izF
lWy
bwm
qnT
lJr
@@ -108488,9 +108397,9 @@ dMO
lWy
rxQ
lWy
ros
izF
izF
bIQ
lWy
lWy
mES
lWy
lWy
@@ -108747,7 +108656,7 @@ bwm
nzD
uoj
bwm
izF
lWy
bwm
dMI
lWy
@@ -109001,7 +108910,7 @@ bkF
bwm
bwm
bwm
ros
bIQ
bwm
bwm
bwm
@@ -109258,8 +109167,8 @@ bkF
qIO
jXA
bwm
ros
vpz
bIQ
hXt
bwm
aht
bwm
+10 -2
View File
@@ -18912,6 +18912,10 @@
},
/turf/open/floor/plasteel,
/area/storage/primary)
"ihL" = (
/mob/living/simple_animal/opossum,
/turf/open/floor/plating,
/area/maintenance/aft/secondary)
"ihX" = (
/obj/structure/cable{
icon_state = "0-2"
@@ -24053,6 +24057,10 @@
"luo" = (
/turf/open/floor/plasteel/white,
/area/science/misc_lab)
"lwl" = (
/mob/living/simple_animal/opossum/poppy,
/turf/open/floor/plating,
/area/engine/engineering)
"lwH" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -83466,7 +83474,7 @@ tRe
tRe
tRe
bWf
bVa
ihL
kXG
sqx
owj
@@ -98024,7 +98032,7 @@ xUL
xUL
dKF
ijZ
ijZ
lwl
bnU
oJa
cNE
+5 -1
View File
@@ -17249,6 +17249,10 @@
},
/turf/open/floor/mineral/titanium,
/area/centcom/evac)
"Qc" = (
/obj/effect/landmark/mafia_game_area,
/turf/open/space/basic,
/area/space)
"Qe" = (
/turf/open/ai_visible,
/area/ai_multicam_room)
@@ -58911,7 +58915,7 @@ aa
aa
aa
aa
aa
Qc
aa
aa
aa
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -2690,7 +2690,7 @@
/obj/structure/rack,
/obj/item/storage/box/zipties,
/obj/item/assembly/flash/handheld,
/obj/item/melee/classic_baton/telescopic,
/obj/item/melee/classic_baton,
/obj/machinery/light/small/built{
dir = 8
},
+4
View File
@@ -144,6 +144,10 @@
#define WINGCOLOR 26
#define CAN_SCAR 27 // If this species can be scarred (fleshy)
/// Used for determining which wounds are applicable to this species.
#define HAS_FLESH 28 /// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD)
#define HAS_BONE 29 /// if we have bones (can suffer bone wounds)
//organ slots
#define ORGAN_SLOT_BRAIN "brain"
#define ORGAN_SLOT_APPENDIX "appendix"
+1
View File
@@ -80,6 +80,7 @@
#define ADMIN_PUNISHMENT_SCARIFY "Scarify"
#define ADMIN_PUNISHMENT_PICKLE "Pickle-ify"
#define ADMIN_PUNISHMENT_FRY "Fry"
#define ADMIN_PUNISHMENT_PERFORATE ":B:erforate"
#define AHELP_ACTIVE 1
#define AHELP_CLOSED 2
+1
View File
@@ -98,6 +98,7 @@
#define NO_APHRO (1<<9)
#define NO_ASS_SLAP (1<<10)
#define BIMBOFICATION (1<<11)
#define NO_AUTO_WAG (1<<12)
#define TOGGLES_CITADEL 0
+16 -9
View File
@@ -8,6 +8,7 @@
GLOBAL_VAR_INIT(clockwork_construction_value, 0) //The total value of all structures built by the clockwork cult
GLOBAL_VAR_INIT(clockwork_vitality, 0) //How much Vitality is stored, total
GLOBAL_VAR_INIT(clockwork_power, 0) //How many watts of power are globally available to the clockwork cult
GLOBAL_LIST_EMPTY(active_daemons) //A list of all active tinkerer's daemons
GLOBAL_VAR_INIT(neovgre_exists, 0) //Does neovgre exist?
GLOBAL_LIST_EMPTY(all_clockwork_objects) //All clockwork items, structures, and effects in existence
@@ -19,21 +20,23 @@ GLOBAL_VAR_INIT(ark_of_the_clockwork_justiciar, FALSE) //The Ark on the Reebe z-
GLOBAL_VAR_INIT(clockwork_gateway_activated, FALSE) //if a gateway to the celestial derelict has ever been successfully activated
GLOBAL_VAR_INIT(script_scripture_unlocked, FALSE) //If script scripture is available, through converting at least one crewmember
GLOBAL_VAR_INIT(application_scripture_unlocked, FALSE) //If script scripture is available
GLOBAL_VAR_INIT(application_scripture_unlocked, FALSE) //If application scripture is available
GLOBAL_VAR_INIT(judgement_scripture_unlocked, FALSE) //If judgement scripture is available
GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not used to track existing scripture
GLOBAL_LIST_EMPTY(all_clockwork_rites) //a list containing all clockwork rites. Filled the first time any cultist interacts with a sigil of rites.
//Scripture tiers and requirements; peripherals should never be used
#define SCRIPTURE_PERIPHERAL "Peripheral"
#define SCRIPTURE_DRIVER "Driver"
#define SCRIPTURE_SCRIPT "Script"
#define SCRIPTURE_APPLICATION "Application"
#define SCRIPTURE_JUDGEMENT "Judgement"
//Various costs related to power.
#define MAX_CLOCKWORK_POWER 80000 //The max power in W that the cult can stockpile
#define SCRIPT_UNLOCK_THRESHOLD 35000 //Scripts will unlock if the total power reaches this amount
#define APPLICATION_UNLOCK_THRESHOLD 50000 //Applications will unlock if the total powre reaches this amount
#define ABSCOND_ABDUCTION_COST 95
#define APPLICATION_UNLOCK_THRESHOLD 50000 //Applications will unlock if the total power reaches this amount
#define JUDGEMENT_UNLOCK_THRESHOLD 80000 //might as well have this unlock at a power amount like the other scriptures, Judgement unlocks at this amount.
//clockcult power defines
#define MIN_CLOCKCULT_POWER 25 //the minimum amount of power clockcult machines will handle gracefully
@@ -59,11 +62,11 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
//Ark defines
#define GATEWAY_SUMMON_RATE 1 //the time amount the Gateway to the Celestial Derelict gets each process tick; defaults to 1 per tick
#define GATEWAY_REEBE_FOUND 240 //when progress is at or above this, the gateway finds reebe and begins drawing power
#define GATEWAY_REEBE_FOUND 120 //when progress is at or above this, the gateway finds reebe and begins drawing power
#define GATEWAY_RATVAR_COMING 480 //when progress is at or above this, ratvar has entered and is coming through the gateway
#define GATEWAY_RATVAR_COMING 240 //when progress is at or above this, ratvar has entered and is coming through the gateway
#define GATEWAY_RATVAR_ARRIVAL 600 //when progress is at or above this, game over ratvar's here everybody go home
#define GATEWAY_RATVAR_ARRIVAL 300 //when progress is at or above this, game over ratvar's here everybody go home
//Objective text define
#define CLOCKCULT_OBJECTIVE "Construct the Ark of the Clockwork Justicar and free Ratvar."
@@ -81,7 +84,7 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
#define CLOCKWORK_ARMOR_COOLDOWN 1800 //The cooldown period between summoning suits of clockwork armor
#define RATVARIAN_SPEAR_COOLDOWN 300 //The cooldown period between summoning another Ratvarian spear
#define RATVARIAN_WEAPON_COOLDOWN 300 //The cooldown period between summoning another Ratvarian spear
#define MARAUDER_SCRIPTURE_SCALING_THRESHOLD 600 //The amount of deciseconds that must pass before marauder scripture will not gain a recital penalty
@@ -89,4 +92,8 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
#define MARAUDER_SCRIPTURE_SCALING_MAX 300 //The maximum extra time applied to the marauder scripture
#define ARK_SCREAM_COOLDOWN 600 //This much time has to pass between instances of the Ark taking damage before it will "scream" again
#define GUARDIAN_EMERGE_THRESHOLD 65 //guardian cannot emerge unless host is at this% or less health
#define ARK_SCREAM_COOLDOWN 300 //This much time has to pass between instances of the Ark taking damage before it will "scream" again
#define PRISM_DELAY_DURATION 1200 //how long prolonging prisms delay the shuttle for; defaults to 2 minutes
+8 -7
View File
@@ -154,9 +154,10 @@
#define SHOVE_KNOCKDOWN_HUMAN 30
#define SHOVE_KNOCKDOWN_TABLE 30
#define SHOVE_KNOCKDOWN_COLLATERAL 10
//for the shove slowdown, see __DEFINES/movespeed_modification.dm
#define SHOVE_SLOWDOWN_LENGTH 30
#define SHOVE_SLOWDOWN_STRENGTH 0.85 //multiplier
/// how long they're staggered for
#define SHOVE_STAGGER_DURATION 35
/// how long they're off balance for
#define SHOVE_OFFBALANCE_DURATION 30
//Shove disarming item list
GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
/obj/item/gun)))
@@ -208,9 +209,9 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define GUN_AIMING_TIME (2 SECONDS)
//Object/Item sharpness
#define IS_BLUNT 0
#define IS_SHARP 1
#define IS_SHARP_ACCURATE 2
#define SHARP_NONE 0
#define SHARP_EDGED 1
#define SHARP_POINTY 2
//His Grace.
#define HIS_GRACE_SATIATED 0 //He hungers not. If bloodthirst is set to this, His Grace is asleep.
@@ -280,7 +281,7 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
/// changeNext_move penalty multiplier of the above.
#define STAM_CRIT_ITEM_ATTACK_DELAY 1.75
/// Damage penalty when fighting prone.
#define LYING_DAMAGE_PENALTY 0.5
#define LYING_DAMAGE_PENALTY 0.7
/// Added delay when firing guns stam-softcritted. Summed with a hardset CLICK_CD_RANGE delay, similar to STAM_CRIT_DAMAGE_DELAY otherwise.
#define STAM_CRIT_GUN_DELAY 2.75
+7 -2
View File
@@ -209,6 +209,8 @@
#define COMSIG_MOB_SWAP_HANDS "mob_swap_hands" //from base of mob/swap_hand(): (obj/item)
#define COMPONENT_BLOCK_SWAP 1
#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge"
// /client signals
#define COMSIG_MOB_CLIENT_LOGIN "mob_client_login" //sent when a mob/login() finishes: (client)
#define COMSIG_MOB_CLIENT_LOGOUT "mob_client_logout" //sent when a mob/logout() starts: (client)
@@ -356,8 +358,8 @@
#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user)
// /obj/item/projectile signals (sent to the firer)
#define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit" ///from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle, hit_limb)
#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" ///from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle, hit_limb)
#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/item/projectile/proc/fire(): (obj/item/projectile, atom/original_target)
#define COMSIG_PROJECTILE_FIRE "projectile_fire" ///from the base of /obj/item/projectile/proc/fire(): ()
#define COMSIG_PROJECTILE_RANGE_OUT "projectile_range_out" // sent to targets during the process_hit proc of projectiles
@@ -452,6 +454,9 @@
#define COMPONENT_TWOHANDED_BLOCK_WIELD 1
#define COMSIG_TWOHANDED_UNWIELD "twohanded_unwield" //from base of datum/component/two_handed/proc/unwield(mob/living/carbon/user): (/mob/user)
// /datum/component/squeak signals
#define COMSIG_CROSS_SQUEAKED "cross_squeaked" // sent when a squeak component squeaks from crossing something, to delay anything else crossing that might squeak to prevent ear hurt.
// /datum/action signals
#define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action)
#define COMPONENT_ACTION_BLOCK_TRIGGER 1
+35
View File
@@ -0,0 +1,35 @@
/// Module is compatible with Security Cyborg models
#define BORG_MODULE_SECURITY (1<<0)
/// Module is compatible with Miner Cyborg models
#define BORG_MODULE_MINER (1<<1)
/// Module is compatible with Janitor Cyborg models
#define BORG_MODULE_JANITOR (1<<2)
/// Module is compatible with Medical Cyborg models
#define BORG_MODULE_MEDICAL (1<<3)
/// Module is compatible with Engineering Cyborg models
#define BORG_MODULE_ENGINEERING (1<<4)
/// Module is compatible with Ripley Exosuit models
#define EXOSUIT_MODULE_RIPLEY (1<<0)
/// Module is compatible with Odyseeus Exosuit models
#define EXOSUIT_MODULE_ODYSSEUS (1<<1)
/// Module is compatible with Clarke Exosuit models. Rebranded to firefighter because tg nerfed it to this.
#define EXOSUIT_MODULE_FIREFIGHTER (1<<2)
// #define EXOSUIT_MODULE_CLARKE (1<<2)
/// Module is compatible with Gygax Exosuit models
#define EXOSUIT_MODULE_GYGAX (1<<3)
/// Module is compatible with Durand Exosuit models
#define EXOSUIT_MODULE_DURAND (1<<4)
/// Module is compatible with H.O.N.K Exosuit models
#define EXOSUIT_MODULE_HONK (1<<5)
/// Module is compatible with Phazon Exosuit models
#define EXOSUIT_MODULE_PHAZON (1<<6)
/// Module is compatable with N models
#define EXOSUIT_MODULE_GYGAX_MED (1<<7)
/// Module is compatible with "Working" Exosuit models - Ripley and Clarke
#define EXOSUIT_MODULE_WORKING EXOSUIT_MODULE_RIPLEY | EXOSUIT_MODULE_FIREFIGHTER // | EXOSUIT_MODULE_CLARKE
/// Module is compatible with "Combat" Exosuit models - Gygax, H.O.N.K, Durand and Phazon
#define EXOSUIT_MODULE_COMBAT EXOSUIT_MODULE_GYGAX | EXOSUIT_MODULE_HONK | EXOSUIT_MODULE_DURAND | EXOSUIT_MODULE_PHAZON
/// Module is compatible with "Medical" Exosuit modelsm - Odysseus
#define EXOSUIT_MODULE_MEDICAL EXOSUIT_MODULE_ODYSSEUS | EXOSUIT_MODULE_GYGAX_MED
+1 -8
View File
@@ -74,6 +74,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define ismush(A) (is_species(A, /datum/species/mush))
#define isshadow(A) (is_species(A, /datum/species/shadow))
#define isskeleton(A) (is_species(A, /datum/species/skeleton))
#define isethereal(A) (is_species(A, /datum/species/ethereal))
// Citadel specific species
#define isipcperson(A) (is_species(A, /datum/species/ipc))
@@ -199,14 +200,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isclothing(A) (istype(A, /obj/item/clothing))
GLOBAL_LIST_INIT(pointed_types, typecacheof(list(
/obj/item/pen,
/obj/item/screwdriver,
/obj/item/reagent_containers/syringe,
/obj/item/kitchen/fork)))
#define is_pointed(W) (is_type_in_typecache(W, GLOB.pointed_types))
#define isbodypart(A) (istype(A, /obj/item/bodypart))
#define isprojectile(A) (istype(A, /obj/item/projectile))
+2
View File
@@ -131,6 +131,8 @@
#define LIGHTING_LAYER 15
#define LIGHTING_RENDER_TARGET "LIGHT_PLANE"
#define RAD_TEXT_LAYER 15.1
#define ABOVE_LIGHTING_PLANE 16
#define ABOVE_LIGHTING_LAYER 16
#define ABOVE_LIGHTING_RENDER_TARGET "ABOVE_LIGHTING_PLANE"
+56
View File
@@ -0,0 +1,56 @@
//defines for loadout categories
//no category defines
#define LOADOUT_CATEGORY_NONE "ERROR"
#define LOADOUT_SUBCATEGORY_NONE "Miscellaneous"
#define LOADOUT_SUBCATEGORIES_NONE list("Miscellaneous")
//backpack
#define LOADOUT_CATEGORY_BACKPACK "In backpack"
#define LOADOUT_SUBCATEGORY_BACKPACK_GENERAL "General" //basically anything that there's not enough of to have its own subcategory
#define LOADOUT_SUBCATEGORY_BACKPACK_TOYS "Toys"
//neck
#define LOADOUT_CATEGORY_NECK "Neck"
#define LOADOUT_SUBCATEGORY_NECK_GENERAL "General"
#define LOADOUT_SUBCATEGORY_NECK_TIE "Ties"
#define LOADOUT_SUBCATEGORY_NECK_SCARVES "Scarves"
//mask
#define LOADOUT_CATEGORY_MASK "Mask"
//hands
#define LOADOUT_CATEGORY_HANDS "Hands"
//uniform
#define LOADOUT_CATEGORY_UNIFORM "Uniform" //there's so many types of uniform it's best to have lots of categories
#define LOADOUT_SUBCATEGORY_UNIFORM_GENERAL "General"
#define LOADOUT_SUBCATEGORY_UNIFORM_JOBS "Jobs"
#define LOADOUT_SUBCATEGORY_UNIFORM_SUITS "Suits"
#define LOADOUT_SUBCATEGORY_UNIFORM_SKIRTS "Skirts"
#define LOADOUT_SUBCATEGORY_UNIFORM_DRESSES "Dresses"
#define LOADOUT_SUBCATEGORY_UNIFORM_SWEATERS "Sweaters"
#define LOADOUT_SUBCATEGORY_UNIFORM_PANTS "Pants"
#define LOADOUT_SUBCATEGORY_UNIFORM_SHORTS "Shorts"
//suit
#define LOADOUT_CATEGORY_SUIT "Suit"
#define LOADOUT_SUBCATEGORY_SUIT_GENERAL "General"
#define LOADOUT_SUBCATEGORY_SUIT_COATS "Coats"
#define LOADOUT_SUBCATEGORY_SUIT_JACKETS "Jackets"
#define LOADOUT_SUBCATEGORY_SUIT_JOBS "Jobs"
//head
#define LOADOUT_CATEGORY_HEAD "Head"
#define LOADOUT_SUBCATEGORY_HEAD_GENERAL "General"
#define LOADOUT_SUBCATEGORY_HEAD_JOBS "Jobs"
//shoes
#define LOADOUT_CATEGORY_SHOES "Shoes"
//gloves
#define LOADOUT_CATEGORY_GLOVES "Gloves"
//glasses
#define LOADOUT_CATEGORY_GLASSES "Glasses"
//donator items
#define LOADOUT_CATEGORY_DONATOR "Donator"
+8 -4
View File
@@ -341,10 +341,11 @@ 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_MISS_STATION 1
#define NUKE_SYNDICATE_BASE 2
#define STATION_DESTROYED_NUKE 3
#define STATION_EVACUATED 4
#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 BLOB_WIN 8
#define BLOB_NUKE 9
#define BLOB_DESTROYED 10
@@ -434,6 +435,9 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define ION_FILE "ion_laws.json"
#define REDPILL_FILE "redpill.json"
#define PIRATE_NAMES_FILE "pirates.json"
#define FLESH_SCAR_FILE "wounds/flesh_scar_desc.json"
#define BONE_SCAR_FILE "wounds/bone_scar_desc.json"
#define SCAR_LOC_FILE "wounds/scar_loc.json"
//Fullscreen overlay resolution in tiles.
+10
View File
@@ -176,6 +176,15 @@
#define DISGUST_LEVEL_VERYGROSS 50
#define DISGUST_LEVEL_GROSS 25
//Charge levels for Ethereals
#define ETHEREAL_CHARGE_NONE 0
#define ETHEREAL_CHARGE_LOWPOWER 20
#define ETHEREAL_CHARGE_NORMAL 50
#define ETHEREAL_CHARGE_ALMOSTFULL 75
#define ETHEREAL_CHARGE_FULL 100
#define ETHEREAL_CHARGE_OVERLOAD 125
#define ETHEREAL_CHARGE_DANGEROUS 150
//Slime evolution threshold. Controls how fast slimes can split/grow
#define SLIME_EVOLUTION_THRESHOLD 10
@@ -284,6 +293,7 @@
#define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you
#define HUNGER_FACTOR 0.1 //factor at which mob nutrition decreases
#define ETHEREAL_CHARGE_FACTOR 0.08 //factor at which ethereal's charge decreases
#define REAGENTS_METABOLISM 0.4 //How many units of reagent are consumed per tick, by default.
#define REAGENTS_EFFECT_MULTIPLIER (REAGENTS_METABOLISM / 0.4) // By defining the effect multiplier this way, it'll exactly adjust all effects according to how they originally were with the 0.4 metabolism
-1
View File
@@ -63,7 +63,6 @@
#define MOVESPEED_ID_TASED_STATUS "TASED"
#define MOVESPEED_ID_ELECTROSTAFF "ELECTROSTAFF"
#define MOVESPEED_ID_SHOVE "SHOVE"
#define MOVESPEED_ID_FAT "FAT"
#define MOVESPEED_ID_COLD "COLD"
#define MOVESPEED_ID_HUNGRY "HUNGRY"
-1
View File
@@ -8,6 +8,5 @@
GLOBAL_LIST_INIT(blacklisted_pool_reagents, list(
/datum/reagent/toxin/plasma, /datum/reagent/oxygen, /datum/reagent/nitrous_oxide, /datum/reagent/nitrogen, //gases
/datum/reagent/fermi, //blanket fermichem ban sorry. this also covers mkultra, genital enlargers, etc etc.
/datum/reagent/drug/aphrodisiac, /datum/reagent/drug/anaphrodisiac, /datum/reagent/drug/aphrodisiacplus, /datum/reagent/drug/anaphrodisiacplus, //literally asking for prefbreaks
/datum/reagent/consumable/femcum, /datum/reagent/consumable/semen //NO.
))
+3
View File
@@ -111,6 +111,9 @@
#define STATUS_EFFECT_LIMP /datum/status_effect/limp //For when you have a busted leg (or two!) and want additional slowdown when walking on that leg
/// shoves inflict this to indicate the next shove while this is in effect should disarm guns
#define STATUS_EFFECT_OFF_BALANCE /datum/status_effect/off_balance
/////////////
// NEUTRAL //
/////////////
+1 -1
View File
@@ -19,7 +19,7 @@
/// Size of EACH left/right border icon for volumetric boxes
#define VOLUMETRIC_STORAGE_BOX_BORDER_SIZE 1
/// Minimum pixels an item must have in volumetric scaled storage UI
#define MINIMUM_PIXELS_PER_ITEM 8
#define MINIMUM_PIXELS_PER_ITEM 16
/// Maximum number of objects that will be allowed to be displayed using the volumetric display system. Arbitrary number to prevent server lockups.
#define MAXIMUM_VOLUMETRIC_ITEMS 256
/// How much padding to give between items
+28 -4
View File
@@ -1,4 +1,28 @@
#define UI_INTERACTIVE 2 // Green/Interactive
#define UI_UPDATE 1 // Orange/Updates Only
#define UI_DISABLED 0 // Red/Disabled
#define UI_CLOSE -1 // Closed
/// Green eye; fully interactive
#define UI_INTERACTIVE 2
/// Orange eye; updates but is not interactive
#define UI_UPDATE 1
/// Red eye; disabled, does not update
#define UI_DISABLED 0
/// UI Should close
#define UI_CLOSE -1
/// Maximum number of windows that can be suspended/reused
#define TGUI_WINDOW_SOFT_LIMIT 5
/// Maximum number of open windows
#define TGUI_WINDOW_HARD_LIMIT 9
/// Maximum ping timeout allowed to detect zombie windows
#define TGUI_PING_TIMEOUT 4 SECONDS
/// Window does not exist
#define TGUI_WINDOW_CLOSED 0
/// Window was just opened, but is still not ready to be sent data
#define TGUI_WINDOW_LOADING 1
/// Window is free and ready to receive data
#define TGUI_WINDOW_READY 2
/// Get a window id based on the provided pool index
#define TGUI_WINDOW_ID(index) "tgui-window-[index]"
/// Get a pool index of the provided window id
#define TGUI_WINDOW_INDEX(window_id) text2num(copytext(window_id, 13))
+2 -1
View File
@@ -178,6 +178,7 @@
#define TRAIT_FREERUNNING "freerunning"
#define TRAIT_SKITTISH "skittish"
#define TRAIT_POOR_AIM "poor_aim"
#define TRAIT_INSANE_AIM "insane_aim" //they don't miss. they never miss. it was all part of their immaculate plan.
#define TRAIT_PROSOPAGNOSIA "prosopagnosia"
#define TRAIT_DRUNK_HEALING "drunk_healing"
#define TRAIT_TAGGER "tagger"
@@ -202,7 +203,7 @@
#define TRAIT_NO_ALCOHOL "alcohol_intolerance"
#define TRAIT_MUTATION_STASIS "mutation_stasis" //Prevents processed genetics mutations from processing.
#define TRAIT_FAST_PUMP "fast_pump"
#define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good....
#define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good...
// 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)
+95 -19
View File
@@ -1,4 +1,13 @@
#define WOUND_DAMAGE_EXPONENT 1.4
#define WOUND_DAMAGE_EXPONENT 1.225
/// an attack must do this much damage after armor in order to roll for being a wound (incremental pressure damage need not apply)
#define WOUND_MINIMUM_DAMAGE 5
/// an attack must do this much damage after armor in order to be eliigible to dismember a suitably mushed bodypart
#define DISMEMBER_MINIMUM_DAMAGE 10
/// any damage dealt over this is ignored for damage rolls unless the target has the frail quirk (35^1.4=145)
#define WOUND_MAX_CONSIDERED_DAMAGE 35
#define WOUND_SEVERITY_TRIVIAL 0 // for jokey/meme wounds like stubbed toe, no standard messages/sounds or second winds
#define WOUND_SEVERITY_MODERATE 1
@@ -6,38 +15,105 @@
#define WOUND_SEVERITY_CRITICAL 3
#define WOUND_SEVERITY_LOSS 4 // theoretical total limb loss, like dismemberment for cuts
#define WOUND_BRUTE 0
#define WOUND_SHARP 1
#define WOUND_BURN 2
/// any brute weapon/attack that doesn't have sharpness. rolls for blunt bone wounds
#define WOUND_BLUNT 1
/// any brute weapon/attack with sharpness = SHARP_EDGED. rolls for slash wounds
#define WOUND_SLASH 2
/// any brute weapon/attack with sharpness = SHARP_POINTY. rolls for piercing wounds
#define WOUND_PIERCE 3
/// any concentrated burn attack (lasers really). rolls for burning wounds
#define WOUND_BURN 4
// How much determination reagent to add each time someone gains a new wound in [/datum/wound/proc/second_wind()]
#define WOUND_DETERMINATION_MODERATE 1
#define WOUND_DETERMINATION_SEVERE 2.5
#define WOUND_DETERMINATION_CRITICAL 5
#define WOUND_DETERMINATION_LOSS 7.5
/// the max amount of determination you can have
#define WOUND_DETERMINATION_MAX 10
// set wound_bonus on an item or attack to this to disable checking wounding for the attack
/// set wound_bonus on an item or attack to this to disable checking wounding for the attack
#define CANT_WOUND -100
// list in order of highest severity to lowest
#define WOUND_LIST_BONE list(/datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/moderate)
#define WOUND_LIST_CUT list(/datum/wound/brute/cut/loss, /datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate)
#define WOUND_LIST_BURN list(/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate)
GLOBAL_LIST_INIT(global_wound_types, list(WOUND_BLUNT = list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate),
WOUND_SLASH = list(/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate),
WOUND_PIERCE = list(/datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate),
WOUND_BURN = list(/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate)
))
GLOBAL_LIST_INIT(global_all_wound_types, list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate,
/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate,
/datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate,
/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate))
// Thresholds for infection for burn wounds, once infestation hits each threshold, things get steadily worse
#define WOUND_INFECTION_MODERATE 4 // below this has no ill effects from infection
#define WOUND_INFECTION_SEVERE 8 // then below here, you ooze some pus and suffer minor tox damage, but nothing serious
#define WOUND_INFECTION_CRITICAL 12 // then below here, your limb occasionally locks up from damage and infection and briefly becomes disabled. Things are getting really bad
#define WOUND_INFECTION_SEPTIC 20 // below here, your skin is almost entirely falling off and your limb locks up more frequently. You are within a stone's throw of septic paralysis and losing the limb
/// below this has no ill effects from infection
#define WOUND_INFECTION_MODERATE 4
/// then below here, you ooze some pus and suffer minor tox damage, but nothing serious
#define WOUND_INFECTION_SEVERE 8
/// then below here, your limb occasionally locks up from damage and infection and briefly becomes disabled. Things are getting really bad
#define WOUND_INFECTION_CRITICAL 12
/// below here, your skin is almost entirely falling off and your limb locks up more frequently. You are within a stone's throw of septic paralysis and losing the limb
#define WOUND_INFECTION_SEPTIC 20
// above WOUND_INFECTION_SEPTIC, your limb is completely putrid and you start rolling to lose the entire limb by way of paralyzation. After 3 failed rolls (~4-5% each probably), the limb is paralyzed
#define WOUND_BURN_SANITIZATION_RATE 0.15 // how quickly sanitization removes infestation and decays per tick
#define WOUND_CUT_MAX_BLOODFLOW 8 // how much blood you can lose per tick per cut max. 8 is a LOT of blood for one cut so don't worry about hitting it easily
#define WOUND_BONE_HEAD_TIME_VARIANCE 20 // if we suffer a bone wound to the head that creates brain traumas, the timer for the trauma cycle is +/- by this percent (0-100)
/// how quickly sanitization removes infestation and decays per tick
#define WOUND_BURN_SANITIZATION_RATE 0.15
/// how much blood you can lose per tick per slash max. 8 is a LOT of blood for one cut so don't worry about hitting it easily
#define WOUND_SLASH_MAX_BLOODFLOW 8
/// dead people don't bleed, but they can clot! this is the minimum amount of clotting per tick on dead people, so even critical cuts will slowly clot in dead people
#define WOUND_SLASH_DEAD_CLOT_MIN 0.05
/// if we suffer a bone wound to the head that creates brain traumas, the timer for the trauma cycle is +/- by this percent (0-100)
#define WOUND_BONE_HEAD_TIME_VARIANCE 20
// The following are for persistent scar save formats
#define SCAR_SAVE_ZONE 1 // The body_zone we're applying to on granting
#define SCAR_SAVE_DESC 2 // The description we're loading
#define SCAR_SAVE_PRECISE_LOCATION 3 // The precise location we're loading
#define SCAR_SAVE_SEVERITY 4 // The severity the scar had
/// The version number of the scar we're saving
#define SCAR_SAVE_VERS 1
/// The body_zone we're applying to on granting
#define SCAR_SAVE_ZONE 2
/// The description we're loading
#define SCAR_SAVE_DESC 3
/// The precise location we're loading
#define SCAR_SAVE_PRECISE_LOCATION 4
/// The severity the scar had
#define SCAR_SAVE_SEVERITY 5
///how many fields there are above (NOT INCLUDING THIS OBVIOUSLY)
#define SCAR_SAVE_LENGTH 5
// increment this number when you update the persistent scarring format in a way that invalidates previous saved scars (new fields, reordering, etc)
/// saved scars with a version lower than this will be discarded
#define SCAR_CURRENT_VERSION 1
// With the wounds pt. 2 update, general dismemberment now requires 2 things for a limb to be dismemberable (bone only creatures just need the second):
// 1. Skin is mangled: A critical slash or pierce wound on that limb
// 2. Bone is mangled: At least a severe bone wound on that limb
// see [/obj/item/bodypart/proc/get_mangled_state] for more information
#define BODYPART_MANGLED_NONE 0
#define BODYPART_MANGLED_BONE 1
#define BODYPART_MANGLED_FLESH 2
#define BODYPART_MANGLED_BOTH 3
// What kind of biology we have, and what wounds we can suffer, mostly relies on the HAS_FLESH and HAS_BONE species traits on human species
/// golems and androids, cannot suffer any wounds
#define BIO_INORGANIC 0
/// skeletons and plasmemes, can only suffer bone wounds, only needs mangled bone to be able to dismember
#define BIO_JUST_BONE 1
/// nothing right now, maybe slimepeople in the future, can only suffer slashing, piercing, and burn wounds
#define BIO_JUST_FLESH 2
/// standard humanoids, can suffer all wounds, needs mangled bone and flesh to dismember
#define BIO_FLESH_BONE 3
/// If this wound requires having the HAS_FLESH flag for humanoids
#define FLESH_WOUND (1<<0)
/// If this wound requires having the HAS_BONE flag for humanaoids
#define BONE_WOUND (1<<1)
/// If having this wound counts as mangled flesh for dismemberment
#define MANGLES_FLESH (1<<2)
/// If having this wound counts as mangled bone for dismemberment
#define MANGLES_BONE (1<<3)
/// If this wound marks the limb as being allowed to have gauze applied
#define ACCEPTS_GAUZE (1<<4)
+12 -3
View File
@@ -201,9 +201,18 @@
WRITE_LOG(log, "Starting up round ID [GLOB.round_id].\n-------------------------")
/* ui logging */
/proc/log_tgui(text)
WRITE_LOG(GLOB.tgui_log, text)
/proc/log_tgui(user_or_client, text)
var/entry = ""
if(!user_or_client)
entry += "no user"
else if(istype(user_or_client, /mob))
var/mob/user = user_or_client
entry += "[user.ckey] (as [user])"
else if(istype(user_or_client, /client))
var/client/client = user_or_client
entry += "[client.ckey]"
entry += ":\n[text]"
WRITE_LOG(GLOB.tgui_log, entry)
/* Close open log handles. This should be called as late as possible, and no logging should hapen after. */
/proc/shutdown_logging()
+9 -6
View File
@@ -85,9 +85,6 @@ GLOBAL_VAR_INIT(cmp_field, "name")
/proc/cmp_advdisease_resistance_asc(datum/disease/advance/A, datum/disease/advance/B)
return A.totalResistance() - B.totalResistance()
/proc/cmp_job_display_asc(datum/job/A, datum/job/B)
return A.display_order - B.display_order
/proc/cmp_uplink_items_dsc(datum/uplink_item/A, datum/uplink_item/B)
return sorttext(initial(B.name), initial(A.name))
@@ -97,9 +94,6 @@ GLOBAL_VAR_INIT(cmp_field, "name")
/proc/cmp_numbered_displays_name_dsc(datum/numbered_display/A, datum/numbered_display/B)
return sorttext(B.sample_object.name, A.sample_object.name)
/proc/cmp_reagents_asc(datum/reagent/a, datum/reagent/b)
return sorttext(initial(b.name),initial(a.name))
/proc/cmp_quirk_asc(datum/quirk/A, datum/quirk/B)
var/a_sign = num2sign(initial(A.value) * -1)
var/b_sign = num2sign(initial(B.value) * -1)
@@ -133,3 +127,12 @@ GLOBAL_VAR_INIT(cmp_field, "name")
return A.required_temp - B.required_temp //return coldest
else
return B.required_temp - A.required_temp //return hottest
/proc/cmp_job_display_asc(datum/job/A, datum/job/B)
return A.display_order - B.display_order
/proc/cmp_reagents_asc(datum/reagent/a, datum/reagent/b)
return sorttext(initial(b.name),initial(a.name))
/proc/cmp_typepaths_asc(A, B)
return sorttext("[B]","[A]")
+7
View File
@@ -264,6 +264,13 @@
if(!findname(.))
break
/proc/random_unique_ethereal_name(attempts_to_find_unique_name=10)
for(var/i in 1 to attempts_to_find_unique_name)
. = capitalize(ethereal_name())
if(!findname(.))
break
/proc/random_unique_moth_name(attempts_to_find_unique_name=10)
for(var/i in 1 to attempts_to_find_unique_name)
. = capitalize(pick(GLOB.moth_first)) + " " + capitalize(pick(GLOB.moth_last))
+6
View File
@@ -4,6 +4,12 @@
else
return "[pick(GLOB.lizard_names_female)]-[pick(GLOB.lizard_names_female)]"
/proc/ethereal_name()
var/tempname = "[pick(GLOB.ethereal_names)] [random_capital_letter()]"
if(prob(65))
tempname += random_capital_letter()
return tempname
/proc/plasmaman_name()
return "[pick(GLOB.plasmaman_names)] \Roman[rand(1,99)]"
+21 -1
View File
@@ -113,6 +113,22 @@
else
return trim(html_encode(name), max_length)
/**
* stripped_multiline_input but reflects to the user instead if it's too big and returns null.
*/
/proc/stripped_multiline_input_or_reflect(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN, no_trim=FALSE)
var/name = input(user, message, title, default) as message|null
if(isnull(name)) // Return null if canceled.
return null
if(length(name) > max_length)
to_chat(user, name)
to_chat(user, "<span class='danger'>^^^----- The preceeding message has been DISCARDED for being over the maximum length of [max_length]. It has NOT been sent! -----^^^</span>")
return null
if(no_trim)
return copytext(html_encode(name), 1, max_length)
else
return trim(html_encode(name), max_length)
#define NO_CHARS_DETECTED 0
#define SPACES_DETECTED 1
#define SYMBOLS_DETECTED 2
@@ -760,6 +776,10 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
else
return "[number]\th"
/proc/random_capital_letter()
return uppertext(pick(GLOB.alphabet))
/proc/unintelligize(message)
var/regex/word_boundaries = regex(@"\b[\S]+\b", "g")
var/prefix = message[1]
@@ -811,4 +831,4 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
corrupted_text += pick(corruption_options)
if(prob(15))
corrupted_text += pick(corruption_options)
return corrupted_text
return corrupted_text
@@ -0,0 +1,13 @@
GLOBAL_LIST_INIT(loadout_categories, list(
LOADOUT_CATEGORY_BACKPACK = list(LOADOUT_SUBCATEGORY_BACKPACK_GENERAL, LOADOUT_SUBCATEGORY_BACKPACK_TOYS),
LOADOUT_CATEGORY_NECK = list(LOADOUT_SUBCATEGORY_NECK_GENERAL, LOADOUT_SUBCATEGORY_NECK_TIE, LOADOUT_SUBCATEGORY_NECK_SCARVES),
LOADOUT_CATEGORY_MASK = LOADOUT_SUBCATEGORIES_NONE,
LOADOUT_CATEGORY_HANDS = LOADOUT_SUBCATEGORIES_NONE,
LOADOUT_CATEGORY_UNIFORM = list(LOADOUT_SUBCATEGORY_UNIFORM_GENERAL, LOADOUT_SUBCATEGORY_UNIFORM_JOBS, LOADOUT_SUBCATEGORY_UNIFORM_SUITS, LOADOUT_SUBCATEGORY_UNIFORM_SKIRTS, LOADOUT_SUBCATEGORY_UNIFORM_DRESSES, LOADOUT_SUBCATEGORY_UNIFORM_SWEATERS, LOADOUT_SUBCATEGORY_UNIFORM_PANTS, LOADOUT_SUBCATEGORY_UNIFORM_SHORTS),
LOADOUT_CATEGORY_SUIT = list(LOADOUT_SUBCATEGORY_SUIT_GENERAL, LOADOUT_SUBCATEGORY_SUIT_COATS, LOADOUT_SUBCATEGORY_SUIT_JACKETS, LOADOUT_SUBCATEGORY_SUIT_JOBS),
LOADOUT_CATEGORY_HEAD = list(LOADOUT_SUBCATEGORY_HEAD_GENERAL, LOADOUT_SUBCATEGORY_HEAD_JOBS),
LOADOUT_CATEGORY_SHOES = LOADOUT_SUBCATEGORIES_NONE,
LOADOUT_CATEGORY_GLOVES = LOADOUT_SUBCATEGORIES_NONE,
LOADOUT_CATEGORY_GLASSES = LOADOUT_SUBCATEGORIES_NONE,
LOADOUT_CATEGORY_DONATOR = LOADOUT_SUBCATEGORIES_NONE
))
+1
View File
@@ -17,6 +17,7 @@ GLOBAL_LIST_INIT(golem_names, world.file2list("strings/names/golem.txt"))
GLOBAL_LIST_INIT(moth_first, world.file2list("strings/names/moth_first.txt"))
GLOBAL_LIST_INIT(moth_last, world.file2list("strings/names/moth_last.txt"))
GLOBAL_LIST_INIT(plasmaman_names, world.file2list("strings/names/plasmaman.txt"))
GLOBAL_LIST_INIT(ethereal_names, world.file2list("strings/names/ethereal.txt"))
GLOBAL_LIST_INIT(posibrain_names, world.file2list("strings/names/posibrain.txt"))
GLOBAL_LIST_INIT(nightmare_names, world.file2list("strings/names/nightmare.txt"))
GLOBAL_LIST_INIT(megacarp_first_names, world.file2list("strings/names/megacarp1.txt"))
+10 -2
View File
@@ -447,8 +447,6 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
var/time_name
if(G.seconds_until_activation)
time_name = "until the Ark activates"
else if(G.grace_period)
time_name = "of grace period remaining"
else if(G.progress_in_seconds)
time_name = "until the Ark finishes summoning"
if(time_info)
@@ -495,6 +493,16 @@ Recharging stations are available in robotics, the dormitory bathrooms, and the
desc = "Unit's power cell is running low. Recharging stations are available in robotics, the dormitory bathrooms, and the AI satellite."
icon_state = "lowcell"
/obj/screen/alert/etherealcharge
name = "Low Blood Charge"
desc = "Your blood's electric charge is running low, find a source of charge for your blood. Use a recharging station found in robotics or the dormitory bathrooms, or eat some Ethereal-friendly food."
icon_state = "etherealcharge"
/obj/screen/alert/ethereal_overcharge
name = "Blood Overcharge"
desc = "Your blood's electric charge is becoming dangerously high, find an outlet for your energy. Use Grab Intent on an APC to channel your energy into it."
icon_state = "ethereal_overcharge"
//Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg
/obj/screen/alert/hacked
name = "Hacked"
+45
View File
@@ -0,0 +1,45 @@
/datum/hud/marauder
var/obj/screen/hosthealth
var/obj/screen/blockchance
var/obj/screen/counterchance
/datum/hud/marauder/New(mob/living/simple_animal/hostile/clockwork/marauder/guardian/owner)
..()
var/obj/screen/using
healths = new /obj/screen/healths/clock()
infodisplay += healths
hosthealth = new /obj/screen/healths/clock()
hosthealth.screen_loc = ui_internal
infodisplay += hosthealth
using = new /obj/screen/marauder/emerge()
using.screen_loc = ui_zonesel
static_inventory += using
/datum/hud/marauder/Destroy()
blockchance = null
counterchance = null
hosthealth = null
return ..()
/mob/living/simple_animal/hostile/clockwork/marauder/guardian/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud/marauder(src, ui_style2icon(client.prefs.UI_style))
/obj/screen/marauder
icon = 'icons/mob/clockwork_mobs.dmi'
/obj/screen/marauder/emerge
icon_state = "clockguard_emerge"
name = "Emerge/Return"
desc = "Emerge or Return."
/obj/screen/marauder/emerge/Click()
if(istype(usr, /mob/living/simple_animal/hostile/clockwork/marauder/guardian))
var/mob/living/simple_animal/hostile/clockwork/marauder/guardian/G = usr
if(G.is_in_host())
G.try_emerge()
else
G.return_to_host()
+14 -15
View File
@@ -67,9 +67,9 @@
/**
* Called when someone uses us to attack a mob in melee combat.
*
*
* This proc respects CheckAttackCooldown() default clickdelay handling.
*
*
* @params
* * mob/living/M - target
* * mob/living/user - attacker
@@ -201,9 +201,9 @@
if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
bad_trait = SKILL_COMBAT_MODE //blacklist combat skills.
if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE))
. *= 0.5
. *= 0.8
else if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
. *= 1.5
. *= 1.2
if(!user.mind || !I.used_skills)
return
@@ -220,7 +220,7 @@
* Also called when clicking on something with an item without being in melee range
*
* WARNING: This does not automatically check clickdelay if not in a melee attack! Be sure to account for this!
*
*
* @params
* * target - The thing we clicked
* * user - mob of person clicking
@@ -238,25 +238,24 @@
else
return clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100
/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area, current_force)
/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area, obj/item/bodypart/hit_bodypart)
var/message_verb = "attacked"
if(I.attack_verb && I.attack_verb.len)
if(length(I.attack_verb))
message_verb = "[pick(I.attack_verb)]"
if(current_force < I.force * FEEBLE_ATTACK_MSG_THRESHOLD)
message_verb = "[pick("feebly", "limply", "saplessly")] [message_verb]"
else if(!I.force)
return
var/message_hit_area = ""
if(hit_area)
message_hit_area = " in the [hit_area]"
var/attack_message = "[src] has been [message_verb][message_hit_area] with [I]."
var/attack_message = "[src] is [message_verb][message_hit_area] with [I]!"
var/attack_message_local = "You're [message_verb][message_hit_area] with [I]!"
if(user in viewers(src, null))
attack_message = "[user] has [message_verb] [src][message_hit_area] with [I]!"
attack_message = "[user] [message_verb] [src][message_hit_area] with [I]!"
attack_message_local = "[user] [message_verb] you[message_hit_area] with [I]!"
if(user == src)
attack_message_local = "You [message_verb] yourself[message_hit_area] with [I]"
visible_message("<span class='danger'>[attack_message]</span>",\
"<span class='userdanger'>[attack_message]</span>", null, COMBAT_MESSAGE_RANGE)
if(hit_area == BODY_ZONE_HEAD)
if(prob(2))
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
"<span class='userdanger'>[attack_message_local]</span>", null, COMBAT_MESSAGE_RANGE)
return 1
/// How much stamina this takes to swing this is not for realism purposes hecc off.
@@ -470,3 +470,5 @@
/datum/config_entry/flag/minimaps_enabled
config_entry_value = TRUE
/datum/config_entry/string/centcom_ban_db // URL for the CentCom Galactic Ban DB API
+4 -4
View File
@@ -674,7 +674,7 @@ SUBSYSTEM_DEF(job)
return
for(var/i in the_mob.client.prefs.chosen_gear)
var/datum/gear/G = i
G = GLOB.loadout_items[slot_to_string(initial(G.category))][initial(G.name)]
G = GLOB.loadout_items[initial(G.category)][initial(G.subcategory)][initial(G.name)]
if(!G)
continue
var/permitted = TRUE
@@ -682,14 +682,14 @@ SUBSYSTEM_DEF(job)
permitted = FALSE
if(G.donoritem && !G.donator_ckey_check(the_mob.client.ckey))
permitted = FALSE
if(!equipbackpackstuff && G.category == SLOT_IN_BACKPACK)//snowflake check since plopping stuff in the backpack doesnt work for pre-job equip loadout stuffs
if(!equipbackpackstuff && G.slot == SLOT_IN_BACKPACK)//snowflake check since plopping stuff in the backpack doesnt work for pre-job equip loadout stuffs
permitted = FALSE
if(equipbackpackstuff && G.category != SLOT_IN_BACKPACK)//ditto
if(equipbackpackstuff && G.slot != SLOT_IN_BACKPACK)//ditto
permitted = FALSE
if(!permitted)
continue
var/obj/item/I = new G.path
if(!M.equip_to_slot_if_possible(I, G.category, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // If the job's dresscode compliant, try to put it in its slot, first
if(!M.equip_to_slot_if_possible(I, G.slot, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // If the job's dresscode compliant, try to put it in its slot, first
if(iscarbon(M))
var/mob/living/carbon/C = M
var/obj/item/storage/backpack/B = C.back
+2 -2
View File
@@ -561,8 +561,8 @@ SUBSYSTEM_DEF(persistence)
ending_human.client.prefs.scars_list["[ending_human.client.prefs.scars_index]"] = ""
else
for(var/k in ending_human.all_wounds)
var/datum/wound/W = k
W.remove_wound() // so we can get the scars for open wounds
var/datum/wound/iter_wound = k
iter_wound.remove_wound() // so we can get the scars for open wounds
if(!ending_human.client)
return
ending_human.client.prefs.scars_list["[ending_human.client.prefs.scars_index]"] = ending_human.format_scars()
@@ -50,20 +50,17 @@ PROCESSING_SUBSYSTEM_DEF(circuit)
/obj/item/electronic_assembly/simple,
/obj/item/electronic_assembly/hook,
/obj/item/electronic_assembly/pda,
/obj/item/electronic_assembly/dildo,
/obj/item/electronic_assembly/small/default,
/obj/item/electronic_assembly/small/cylinder,
/obj/item/electronic_assembly/small/scanner,
/obj/item/electronic_assembly/small/hook,
/obj/item/electronic_assembly/small/box,
/obj/item/electronic_assembly/small/dildo,
/obj/item/electronic_assembly/medium/default,
/obj/item/electronic_assembly/medium/box,
/obj/item/electronic_assembly/medium/clam,
/obj/item/electronic_assembly/medium/medical,
/obj/item/electronic_assembly/medium/gun,
/obj/item/electronic_assembly/medium/radio,
/obj/item/electronic_assembly/medium/dildo,
/obj/item/electronic_assembly/large/default,
/obj/item/electronic_assembly/large/scope,
/obj/item/electronic_assembly/large/terminal,
+7 -5
View File
@@ -775,12 +775,14 @@ SUBSYSTEM_DEF(shuttle)
preview_shuttle = null
/datum/controller/subsystem/shuttle/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.admin_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "ShuttleManipulator", name, 800, 600, master_ui, state)
ui.open()
/datum/controller/subsystem/shuttle/ui_state(mob/user)
return GLOB.admin_state
/datum/controller/subsystem/shuttle/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "ShuttleManipulator")
ui.open()
/datum/controller/subsystem/shuttle/ui_data(mob/user)
var/list/data = list()
+330 -16
View File
@@ -1,3 +1,12 @@
/**
* tgui subsystem
*
* Contains all tgui state and subsystem code.
*
* Copyright (c) 2020 Aleksej Komarov
* SPDX-License-Identifier: MIT
*/
SUBSYSTEM_DEF(tgui)
name = "tgui"
wait = 9
@@ -5,33 +14,338 @@ SUBSYSTEM_DEF(tgui)
priority = FIRE_PRIORITY_TGUI
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
var/list/currentrun = list()
var/list/open_uis = list() // A list of open UIs, grouped by src_object and ui_key.
var/list/processing_uis = list() // A list of processing UIs, ungrouped.
var/basehtml // The HTML base used for all UIs.
/// A list of UIs scheduled to process
var/list/current_run = list()
/// A list of open UIs
var/list/open_uis = list()
/// A list of open UIs, grouped by src_object.
var/list/open_uis_by_src = list()
/// The HTML base used for all UIs.
var/basehtml
/datum/controller/subsystem/tgui/PreInit()
basehtml = file2text('tgui/packages/tgui/public/tgui.html')
basehtml = file2text('tgui/packages/tgui/public/tgui.html')
/datum/controller/subsystem/tgui/Shutdown()
close_all_uis()
/datum/controller/subsystem/tgui/stat_entry()
..("P:[processing_uis.len]")
..("P:[open_uis.len]")
/datum/controller/subsystem/tgui/fire(resumed = 0)
if (!resumed)
src.currentrun = processing_uis.Copy()
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
while(currentrun.len)
var/datum/tgui/ui = currentrun[currentrun.len]
currentrun.len--
if(!resumed)
src.current_run = open_uis.Copy()
// Cache for sanic speed (lists are references anyways)
var/list/current_run = src.current_run
while(current_run.len)
var/datum/tgui/ui = current_run[current_run.len]
current_run.len--
// TODO: Move user/src_object check to process()
if(ui && ui.user && ui.src_object)
ui.process()
else
processing_uis.Remove(ui)
if (MC_TICK_CHECK)
open_uis.Remove(ui)
if(MC_TICK_CHECK)
return
/**
* public
*
* Requests a usable tgui window from the pool.
* Returns null if pool was exhausted.
*
* required user mob
* return datum/tgui
*/
/datum/controller/subsystem/tgui/proc/request_pooled_window(mob/user)
if(!user.client)
return null
var/list/windows = user.client.tgui_windows
var/window_id
var/datum/tgui_window/window
var/window_found = FALSE
// Find a usable window
for(var/i in 1 to TGUI_WINDOW_HARD_LIMIT)
window_id = TGUI_WINDOW_ID(i)
window = windows[window_id]
// As we are looping, create missing window datums
if(!window)
window = new(user.client, window_id, pooled = TRUE)
// Skip windows with acquired locks
if(window.locked)
continue
if(window.status == TGUI_WINDOW_READY)
return window
if(window.status == TGUI_WINDOW_CLOSED)
window.status = TGUI_WINDOW_LOADING
window_found = TRUE
break
if(!window_found)
log_tgui(user, "Error: Pool exhausted")
return null
return window
/**
* public
*
* Force closes all tgui windows.
*
* required user mob
*/
/datum/controller/subsystem/tgui/proc/force_close_all_windows(mob/user)
log_tgui(user, "force_close_all_windows")
if(user.client)
user.client.tgui_windows = list()
for(var/i in 1 to TGUI_WINDOW_HARD_LIMIT)
var/window_id = TGUI_WINDOW_ID(i)
user << browse(null, "window=[window_id]")
/**
* public
*
* Force closes the tgui window by window_id.
*
* required user mob
* required window_id string
*/
/datum/controller/subsystem/tgui/proc/force_close_window(mob/user, window_id)
log_tgui(user, "force_close_window")
// Close all tgui datums based on window_id.
for(var/datum/tgui/ui in user.tgui_open_uis)
if(ui.window && ui.window.id == window_id)
ui.close(can_be_suspended = FALSE)
// Unset machine just to be sure.
user.unset_machine()
// Close window directly just to be sure.
user << browse(null, "window=[window_id]")
/**
* public
*
* Try to find an instance of a UI, and push an update to it.
*
* required user mob The mob who opened/is using the UI.
* required src_object datum The object/datum which owns the UI.
* optional ui datum/tgui The UI to be updated, if it exists.
* optional force_open bool If the UI should be re-opened instead of updated.
*
* return datum/tgui The found UI.
*/
/datum/controller/subsystem/tgui/proc/try_update_ui(
mob/user,
datum/src_object,
datum/tgui/ui)
// Look up a UI if it wasn't passed
if(isnull(ui))
ui = get_open_ui(user, src_object)
// Couldn't find a UI.
if(isnull(ui))
return null
ui.process_status()
// UI ended up with the closed status
// or is actively trying to close itself.
// FIXME: Doesn't actually fix the paper bug.
if(ui.status <= UI_CLOSE)
ui.close()
return null
ui.send_update()
return ui
/**
* public
*
* Get a open UI given a user and src_object.
*
* required user mob The mob who opened/is using the UI.
* required src_object datum The object/datum which owns the UI.
*
* return datum/tgui The found UI.
*/
/datum/controller/subsystem/tgui/proc/get_open_ui(mob/user, datum/src_object)
var/key = "[REF(src_object)]"
// No UIs opened for this src_object
if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list))
return null
for(var/datum/tgui/ui in open_uis_by_src[key])
// Make sure we have the right user
if(ui.user == user)
return ui
return null
/**
* public
*
* Update all UIs attached to src_object.
*
* required src_object datum The object/datum which owns the UIs.
*
* return int The number of UIs updated.
*/
/datum/controller/subsystem/tgui/proc/update_uis(datum/src_object)
var/count = 0
var/key = "[REF(src_object)]"
// No UIs opened for this src_object
if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list))
return count
for(var/datum/tgui/ui in open_uis_by_src[key])
// Check if UI is valid.
if(ui && ui.src_object && ui.user && ui.src_object.ui_host(ui.user))
ui.process(force = 1)
count++
return count
/**
* public
*
* Close all UIs attached to src_object.
*
* required src_object datum The object/datum which owns the UIs.
*
* return int The number of UIs closed.
*/
/datum/controller/subsystem/tgui/proc/close_uis(datum/src_object)
var/count = 0
var/key = "[REF(src_object)]"
// No UIs opened for this src_object
if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list))
return count
for(var/datum/tgui/ui in open_uis_by_src[key])
// Check if UI is valid.
if(ui && ui.src_object && ui.user && ui.src_object.ui_host(ui.user))
ui.close()
count++
return count
/**
* public
*
* Close all UIs regardless of their attachment to src_object.
*
* return int The number of UIs closed.
*/
/datum/controller/subsystem/tgui/proc/close_all_uis()
var/count = 0
for(var/key in open_uis_by_src)
for(var/datum/tgui/ui in open_uis_by_src[key])
// Check if UI is valid.
if(ui && ui.src_object && ui.user && ui.src_object.ui_host(ui.user))
ui.close()
count++
return count
/**
* public
*
* Update all UIs belonging to a user.
*
* required user mob The mob who opened/is using the UI.
* optional src_object datum If provided, only update UIs belonging this src_object.
*
* return int The number of UIs updated.
*/
/datum/controller/subsystem/tgui/proc/update_user_uis(mob/user, datum/src_object)
var/count = 0
if(length(user?.tgui_open_uis) == 0)
return count
for(var/datum/tgui/ui in user.tgui_open_uis)
if(isnull(src_object) || ui.src_object == src_object)
ui.process(force = 1)
count++
return count
/**
* public
*
* Close all UIs belonging to a user.
*
* required user mob The mob who opened/is using the UI.
* optional src_object datum If provided, only close UIs belonging this src_object.
*
* return int The number of UIs closed.
*/
/datum/controller/subsystem/tgui/proc/close_user_uis(mob/user, datum/src_object)
var/count = 0
if(length(user?.tgui_open_uis) == 0)
return count
for(var/datum/tgui/ui in user.tgui_open_uis)
if(isnull(src_object) || ui.src_object == src_object)
ui.close()
count++
return count
/**
* private
*
* Add a UI to the list of open UIs.
*
* required ui datum/tgui The UI to be added.
*/
/datum/controller/subsystem/tgui/proc/on_open(datum/tgui/ui)
var/key = "[REF(ui.src_object)]"
if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list))
open_uis_by_src[key] = list()
ui.user.tgui_open_uis |= ui
var/list/uis = open_uis_by_src[key]
uis |= ui
open_uis |= ui
/**
* private
*
* Remove a UI from the list of open UIs.
*
* required ui datum/tgui The UI to be removed.
*
* return bool If the UI was removed or not.
*/
/datum/controller/subsystem/tgui/proc/on_close(datum/tgui/ui)
var/key = "[REF(ui.src_object)]"
if(isnull(open_uis_by_src[key]) || !istype(open_uis_by_src[key], /list))
return FALSE
// Remove it from the list of processing UIs.
open_uis.Remove(ui)
// If the user exists, remove it from them too.
if(ui.user)
ui.user.tgui_open_uis.Remove(ui)
var/list/uis = open_uis_by_src[key]
uis.Remove(ui)
if(length(uis) == 0)
open_uis_by_src.Remove(key)
return TRUE
/**
* private
*
* Handle client logout, by closing all their UIs.
*
* required user mob The mob which logged out.
*
* return int The number of UIs closed.
*/
/datum/controller/subsystem/tgui/proc/on_logout(mob/user)
close_user_uis(user)
/**
* private
*
* Handle clients switching mobs, by transferring their UIs.
*
* required user source The client's original mob.
* required user target The client's new mob.
*
* return bool If the UIs were transferred.
*/
/datum/controller/subsystem/tgui/proc/on_transfer(mob/source, mob/target)
// The old mob had no open UIs.
if(length(source?.tgui_open_uis) == 0)
return FALSE
if(isnull(target.tgui_open_uis) || !istype(target.tgui_open_uis, /list))
target.tgui_open_uis = list()
// Transfer all the UIs.
for(var/datum/tgui/ui in source.tgui_open_uis)
// Inform the UIs of their new owner.
ui.user = target
target.tgui_open_uis.Add(ui)
// Clear the old list.
source.tgui_open_uis.Cut()
return TRUE
+2 -1
View File
@@ -711,7 +711,8 @@ SUBSYSTEM_DEF(ticker)
'sound/roundend/yeehaw.ogg',
'sound/roundend/disappointed.ogg',
'sound/roundend/gondolabridge.ogg',
'sound/roundend/haveabeautifultime.ogg'\
'sound/roundend/haveabeautifultime.ogg',
'sound/roundend/CitadelStationHasSeenBetterDays.ogg'\
)
SEND_SOUND(world, sound(round_end_sound))
+17 -10
View File
@@ -431,25 +431,31 @@
if(!owner)
owner = M
/datum/ai_laws/proc/get_law_list(include_zeroth = 0, show_numbers = 1)
/**
* Generates a list of all laws on this datum, including rendered HTML tags if required
*
* Arguments:
* * include_zeroth - Operator that controls if law 0 or law 666 is returned in the set
* * show_numbers - Operator that controls if law numbers are prepended to the returned laws
* * render_html - Operator controlling if HTML tags are rendered on the returned laws
*/
/datum/ai_laws/proc/get_law_list(include_zeroth = FALSE, show_numbers = TRUE, render_html = TRUE)
var/list/data = list()
if (include_zeroth && devillaws && devillaws.len)
for(var/i in devillaws)
data += "[show_numbers ? "666:" : ""] <font color='#cc5500'>[i]</font>"
if (include_zeroth && devillaws)
for(var/law in devillaws)
data += "[show_numbers ? "666:" : ""] [render_html ? "<font color='#cc5500'>[law]</font>" : law]"
if (include_zeroth && zeroth)
data += "[show_numbers ? "0:" : ""] <font color='#ff0000'><b>[zeroth]</b></font>"
data += "[show_numbers ? "0:" : ""] [render_html ? "<font color='#ff0000'><b>[zeroth]</b></font>" : zeroth]"
for(var/law in hacked)
if (length(law) > 0)
var/num = ionnum()
data += "[show_numbers ? "[num]:" : ""] <font color='#660000'>[law]</font>"
data += "[show_numbers ? "[ionnum()]:" : ""] [render_html ? "<font color='#660000'>[law]</font>" : law]"
for(var/law in ion)
if (length(law) > 0)
var/num = ionnum()
data += "[show_numbers ? "[num]:" : ""] <font color='#547DFE'>[law]</font>"
data += "[show_numbers ? "[ionnum()]:" : ""] [render_html ? "<font color='#547DFE'>[law]</font>" : law]"
var/number = 1
for(var/law in inherent)
@@ -459,6 +465,7 @@
for(var/law in supplied)
if (length(law) > 0)
data += "[show_numbers ? "[number]:" : ""] <font color='#990099'>[law]</font>"
data += "[show_numbers ? "[number]:" : ""] [render_html ? "<font color='#990099'>[law]</font>" : law]"
number++
return data
+1 -1
View File
@@ -67,7 +67,7 @@
H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD, wound_bonus=CANT_WOUND) // easy tiger, we'll get to that in a sec
var/obj/item/bodypart/slit_throat = H.get_bodypart(BODY_ZONE_HEAD)
if(slit_throat)
var/datum/wound/brute/cut/critical/screaming_through_a_slit_throat = new
var/datum/wound/slash/critical/screaming_through_a_slit_throat = new
screaming_through_a_slit_throat.apply_wound(slit_throat)
H.apply_status_effect(/datum/status_effect/neck_slice)
+11 -13
View File
@@ -203,9 +203,9 @@
Set var amt to the value current cycle req is pointing to, its amount of type we need to delete
Get var/surroundings list of things accessable to crafting by get_environment()
Check the type of the current cycle req
If its reagent then do a while loop, inside it try to locate() reagent containers, inside such containers try to locate needed reagent, if there isnt remove thing from surroundings
If its reagent then do a while loop, inside it try to locate() reagent containers, inside such containers try to locate needed reagent, if there isn't remove thing from surroundings
If there is enough reagent in the search result then delete the needed amount, create the same type of reagent with the same data var and put it into deletion list
If there isnt enough take all of that reagent from the container, put into deletion list, substract the amt var by the volume of reagent, remove the container from surroundings list and keep searching
If there isn't enough take all of that reagent from the container, put into deletion list, substract the amt var by the volume of reagent, remove the container from surroundings list and keep searching
While doing above stuff check deletion list if it already has such reagnet, if yes merge instead of adding second one
If its stack check if it has enough amount
If yes create new stack with the needed amount and put in into deletion list, substract taken amount from the stack
@@ -216,7 +216,7 @@
Then do a loop over parts var of the recipe
Do similar stuff to what we have done above, but now in deletion list, until the parts conditions are satisfied keep taking from the deletion list and putting it into parts list for return
After its done loop over deletion list and delete all the shit that wasnt taken by parts loop
After its done loop over deletion list and delete all the shit that wasn't taken by parts loop
del_reqs return the list of parts resulting object will receive as argument of CheckParts proc, on the atom level it will add them all to the contents, on all other levels it calls ..() and does whatever is needed afterwards but from contents list already
*/
@@ -323,9 +323,12 @@
if(user == parent)
ui_interact(user)
/datum/component/personal_crafting/ui_state(mob/user)
return GLOB.not_incapacitated_turf_state
//For the UI related things we're going to assume the user is a mob rather than typesetting it to an atom as the UI isn't generated if the parent is an atom
/datum/component/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.not_incapacitated_turf_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
/datum/component/personal_crafting/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
cur_category = categories[1]
if(islist(categories[cur_category]))
@@ -333,7 +336,7 @@
cur_subcategory = subcats[1]
else
cur_subcategory = CAT_NONE
ui = new(user, src, ui_key, "PersonalCrafting", "Crafting Menu", 700, 800, master_ui, state)
ui = new(user, src, "PersonalCrafting")
ui.open()
/datum/component/personal_crafting/ui_data(mob/user)
@@ -413,13 +416,8 @@
display_compact = !display_compact
. = TRUE
if("set_category")
if(!isnull(params["category"]))
cur_category = params["category"]
if(!isnull(params["subcategory"]))
if(params["subcategory"] == "0")
cur_subcategory = ""
else
cur_subcategory = params["subcategory"]
cur_category = params["category"]
cur_subcategory = params["subcategory"] || ""
. = TRUE
/datum/component/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R)
@@ -263,6 +263,14 @@
time = 30
category = CAT_CLOTHING
/datum/crafting_recipe/durathread_reinforcement_kit
name = "Durathread Reinforcement Kit"
result = /obj/item/armorkit
reqs = list(/obj/item/stack/sheet/durathread = 4)
tools = list(/obj/item/stack/sheet/mineral/titanium, TOOL_WIRECUTTER) // tough needle for a tough fabric
time = 40
category = CAT_CLOTHING
/datum/crafting_recipe/durathread_duffelbag
name = "Durathread Dufflebag"
result = /obj/item/storage/backpack/duffelbag/durathread
@@ -126,7 +126,7 @@
/datum/crafting_recipe/brute_pack
name = "Suture Pack"
result = /obj/item/stack/medical/suture/one
result = /obj/item/stack/medical/suture/five
time = 1
reqs = list(/obj/item/stack/medical/gauze = 1,
/datum/reagent/medicine/styptic_powder = 10)
@@ -135,7 +135,7 @@
/datum/crafting_recipe/burn_pack
name = "Regenerative Mesh"
result = /obj/item/stack/medical/mesh/one
result = /obj/item/stack/medical/mesh/five
time = 1
reqs = list(/obj/item/stack/medical/gauze = 1,
/datum/reagent/medicine/silver_sulfadiazine = 10)
+19 -12
View File
@@ -29,7 +29,6 @@
*/
/datum/component/embedded
dupe_mode = COMPONENT_DUPE_ALLOWED
var/obj/item/bodypart/limb
@@ -139,30 +138,36 @@
limb.embedded_objects |= weapon // on the inside... on the inside...
weapon.forceMove(victim)
RegisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING), .proc/byeItemCarbon)
var/damage = 0
if(harmful)
victim.visible_message("<span class='danger'>[weapon] embeds itself in [victim]'s [limb.name]!</span>",ignored_mobs=victim)
to_chat(victim, "<span class='userdanger'>[weapon] embeds itself in your [limb.name]!</span>")
victim.throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
playsound(victim,'sound/weapons/bladeslice.ogg', 40)
weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody!
var/damage = weapon.w_class * impact_pain_mult
limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus=-30, sharpness = TRUE)
damage = weapon.w_class * impact_pain_mult
SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded)
else
victim.visible_message("<span class='danger'>[weapon] sticks itself to [victim]'s [limb.name]!</span>",ignored_mobs=victim)
to_chat(victim, "<span class='userdanger'>[weapon] sticks itself to your [limb.name]!</span>")
if(damage > 0)
var/armor = victim.run_armor_check(limb.body_zone, "melee", "Your armor has protected your [limb.name].", "Your armor has softened a hit to your [limb.name].",weapon.armour_penetration)
limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, blocked=armor, sharpness = weapon.get_sharpness())
/// Called every time a carbon with a harmful embed moves, rolling a chance for the item to cause pain. The chance is halved if the carbon is crawling or walking.
/datum/component/embedded/proc/jostleCheck()
var/mob/living/carbon/victim = parent
var/chance = jostle_chance
var/damage = weapon.w_class * pain_mult
var/pain_chance_current = jostle_chance
if(victim.m_intent == MOVE_INTENT_WALK || !(victim.mobility_flags & MOBILITY_STAND))
chance *= 0.5
pain_chance_current *= 0.5
if(harmful && prob(chance))
var/damage = weapon.w_class * jostle_pain_mult
if(pain_stam_pct && IS_STAMCRIT(victim)) //if it's a less-lethal embed, give them a break if they're already stamcritted
pain_chance_current *= 0.2
damage *= 0.5
if(harmful && prob(pain_chance_current))
limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND)
to_chat(victim, "<span class='userdanger'>[weapon] embedded in your [limb.name] jostles and stings!</span>")
@@ -199,7 +204,7 @@
if(harmful)
var/damage = weapon.w_class * remove_pain_mult
limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, sharpness=TRUE) //It hurts to rip it out, get surgery you dingus.
limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND) //It hurts to rip it out, get surgery you dingus.
victim.emote("scream")
victim.visible_message("<span class='notice'>[victim] successfully rips [weapon] out of [victim.p_their()] [limb.name]!</span>", "<span class='notice'>You successfully remove [weapon] from your [limb.name].</span>")
else
@@ -279,11 +284,13 @@
limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND)
to_chat(victim, "<span class='userdanger'>[weapon] embedded in your [limb.name] hurts!</span>")
if(prob(fall_chance))
var/fall_chance_current = fall_chance
if(victim.mobility_flags & ~MOBILITY_STAND)
fall_chance_current *= 0.2
if(prob(fall_chance_current))
fallOutCarbon()
////////////////////////////////////////
//////////////TURF PROCS////////////////
////////////////////////////////////////
+4 -8
View File
@@ -80,19 +80,15 @@ GLOBAL_LIST_EMPTY(GPS_list)
to_chat(user, "<span class='notice'>[parent] is now tracking, and visible to other GPS devices.</span>")
tracking = TRUE
/datum/component/gps/item/ui_interact(mob/user, ui_key = "gps", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state.
/datum/component/gps/item/ui_interact(mob/user, datum/tgui/ui)
if(emped)
to_chat(user, "<span class='hear'>[parent] fizzles weakly.</span>")
return
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
// Variable window height, depending on how many GPS units there are
// to show, clamped to relatively safe range.
var/gps_window_height = clamp(325 + GLOB.GPS_list.len * 14, 325, 700)
ui = new(user, src, ui_key, "Gps", "Global Positioning System", 470, gps_window_height, master_ui, state) //width, height
ui = new(user, src, "Gps")
ui.open()
ui.set_autoupdate(state = updating)
ui.set_autoupdate(updating)
/datum/component/gps/item/ui_data(mob/user)
var/list/data = list()
+91
View File
@@ -0,0 +1,91 @@
/**
* KILLER QUEEN
*
* Simple contact bomb component
* Blows up the first person to touch it.
*/
/datum/component/killerqueen
can_transfer = TRUE
/// strength of explosion on the touch-er. 0 to disable. usually only used if the normal explosion is disabled (this is the default).
var/ex_strength = EXPLODE_HEAVY
/// callback to invoke with (parent, victim) before standard detonation - useful for losing a reference to this component or implementing custom behavior. return FALSE to prevent explosion.
var/datum/callback/pre_explode
/// callback to invoke with (parent) when deleting without an explosion
var/datum/callback/failure
/// did we explode
var/exploded = FALSE
/// examine message
var/examine_message
/// light explosion radius
var/light = 0
/// heavy explosion radius
var/heavy = 0
/// dev explosion radius
var/dev = 0
/// flame explosion radius
var/flame = 0
/// only triggered by living mobs
var/living_only = TRUE
/datum/component/killerqueen/Initialize(ex_strength = EXPLODE_HEAVY, datum/callback/pre_explode, datum/callback/failure, examine_message, light = 0, heavy = 0, dev = 0, flame = 0, living_only = TRUE)
. = ..()
if(. & COMPONENT_INCOMPATIBLE)
return
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
src.ex_strength = ex_strength
src.pre_explode = pre_explode
src.failure = failure
src.examine_message = examine_message
src.light = light
src.heavy = heavy
src.dev = dev
src.flame = flame
src.living_only = living_only
/datum/component/killerqueen/Destroy()
if(!exploded)
failure?.Invoke(parent)
return ..()
/datum/component/killerqueen/RegisterWithParent()
. = ..()
RegisterSignal(parent, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_ATTACK_ANIMAL), .proc/touch_detonate)
RegisterSignal(parent, COMSIG_MOVABLE_BUMP, .proc/bump_detonate)
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/attackby_detonate)
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine)
/datum/component/killerqueen/UnregisterFromParent()
. = ..()
UnregisterSignal(parent, list(COMSIG_ATOM_ATTACK_ANIMAL, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW,
COMSIG_MOVABLE_BUMP, COMSIG_PARENT_ATTACKBY, COMSIG_PARENT_EXAMINE))
/datum/component/killerqueen/proc/attackby_detonate(datum/source, obj/item/I, mob/user)
detonate(user)
/datum/component/killerqueen/proc/bump_detonate(datum/source, atom/A)
detonate(A)
/datum/component/killerqueen/proc/touch_detonate(datum/source, mob/user)
detonate(user)
/datum/component/killerqueen/proc/on_examine(datum/source, mob/examiner, list/examine_return)
if(examine_message)
examine_return += examine_message
/datum/component/killerqueen/proc/detonate(atom/victim)
if(!isliving(victim) && living_only)
return
if(pre_explode && !pre_explode.Invoke(parent, victim))
return
if(ex_strength)
victim.ex_act(ex_strength)
if(light || heavy || dev || flame)
explosion(parent, dev, heavy, light, flame_range = flame)
else
var/turf/T = get_turf(parent)
playsound(T, 'sound/effects/explosion2.ogg', 200, 1)
new /obj/effect/temp_visual/explosion(T)
exploded = TRUE
qdel(src)
+20
View File
@@ -307,6 +307,10 @@
/datum/component/mood/proc/HandleNutrition(mob/living/L)
if(isethereal(L))
HandleCharge(L)
if(HAS_TRAIT(L, TRAIT_NOHUNGER))
return FALSE //no mood events for nutrition
switch(L.nutrition)
if(NUTRITION_LEVEL_FULL to INFINITY)
add_event(null, "nutrition", /datum/mood_event/fat)
@@ -321,6 +325,22 @@
if(0 to NUTRITION_LEVEL_STARVING)
add_event(null, "nutrition", /datum/mood_event/starving)
/datum/component/mood/proc/HandleCharge(mob/living/carbon/human/H)
var/datum/species/ethereal/E = H.dna.species
switch(E.get_charge(H))
if(ETHEREAL_CHARGE_NONE to ETHEREAL_CHARGE_LOWPOWER)
add_event(null, "charge", /datum/mood_event/decharged)
if(ETHEREAL_CHARGE_LOWPOWER to ETHEREAL_CHARGE_NORMAL)
add_event(null, "charge", /datum/mood_event/lowpower)
if(ETHEREAL_CHARGE_NORMAL to ETHEREAL_CHARGE_ALMOSTFULL)
clear_event(null, "charge")
if(ETHEREAL_CHARGE_ALMOSTFULL to ETHEREAL_CHARGE_FULL)
add_event(null, "charge", /datum/mood_event/charged)
if(ETHEREAL_CHARGE_FULL to ETHEREAL_CHARGE_OVERLOAD)
add_event(null, "charge", /datum/mood_event/overcharged)
if(ETHEREAL_CHARGE_OVERLOAD to ETHEREAL_CHARGE_DANGEROUS)
add_event(null, "charge", /datum/mood_event/supercharged)
/datum/component/mood/proc/update_beauty(area/A)
if(A.outdoors) //if we're outside, we don't care.
clear_event(null, "area_beauty")
+47 -8
View File
@@ -1,3 +1,8 @@
// the following defines are used for [/datum/component/pellet_cloud/var/list/wound_info_by_part] to store the damage, wound_bonus, and bw_bonus for each bodypart hit
#define CLOUD_POSITION_DAMAGE 1
#define CLOUD_POSITION_W_BONUS 2
#define CLOUD_POSITION_BW_BONUS 3
/*
* This component is used when you want to create a bunch of shrapnel or projectiles (say, shrapnel from a fragmentation grenade, or buckshot from a shotgun) from a central point,
* without necessarily printing a separate message for every single impact. This component should be instantiated right when you need it (like the moment of firing), then activated
@@ -29,7 +34,10 @@
var/list/pellets = list()
/// An associated list with the atom hit as the key and how many pellets they've eaten for the value, for printing aggregate messages
var/list/targets_hit = list()
/// For grenades, any /mob/living's the grenade is moved onto, see [/datum/component/pellet_cloud/proc/handle_martyrs()]
/// Another associated list for hit bodyparts on carbons so we can track how much wounding potential we have for each bodypart
var/list/wound_info_by_part = list()
/// For grenades, any /mob/living's the grenade is moved onto, see [/datum/component/pellet_cloud/proc/handle_martyrs]
var/list/bodies
/// For grenades, tracking people who die covering a grenade for achievement purposes, see [/datum/component/pellet_cloud/proc/handle_martyrs()]
var/list/purple_hearts
@@ -64,6 +72,7 @@
/datum/component/pellet_cloud/Destroy(force, silent)
purple_hearts = null
pellets = null
wound_info_by_part = null
targets_hit = null
bodies = null
return ..()
@@ -187,10 +196,26 @@
break
///One of our pellets hit something, record what it was and check if we're done (terminated == num_pellets)
/datum/component/pellet_cloud/proc/pellet_hit(obj/item/projectile/P, atom/movable/firer, atom/target, Angle)
/datum/component/pellet_cloud/proc/pellet_hit(obj/item/projectile/P, atom/movable/firer, atom/target, Angle, hit_zone)
pellets -= P
terminated++
hits++
var/obj/item/bodypart/hit_part
if(iscarbon(target) && hit_zone)
var/mob/living/carbon/hit_carbon = target
hit_part = hit_carbon.get_bodypart(hit_zone)
if(hit_part)
target = hit_part
if(P.wound_bonus != CANT_WOUND) // handle wounding
// unfortunately, due to how pellet clouds handle finalizing only after every pellet is accounted for, that also means there might be a short delay in dealing wounds if one pellet goes wide
// while buckshot may reach a target or miss it all in one tick, we also have to account for possible ricochets that may take a bit longer to hit the target
if(isnull(wound_info_by_part[hit_part]))
wound_info_by_part[hit_part] = list(0, 0, 0)
wound_info_by_part[hit_part][CLOUD_POSITION_DAMAGE] += P.damage // these account for decay
wound_info_by_part[hit_part][CLOUD_POSITION_W_BONUS] += P.wound_bonus
wound_info_by_part[hit_part][CLOUD_POSITION_BW_BONUS] += P.bare_wound_bonus
P.wound_bonus = CANT_WOUND // actual wounding will be handled aggregate
targets_hit[target]++
if(targets_hit[target] == 1)
RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/on_target_qdel, override=TRUE)
@@ -231,13 +256,23 @@
for(var/atom/target in targets_hit)
var/num_hits = targets_hit[target]
UnregisterSignal(target, COMSIG_PARENT_QDELETING)
if(num_hits > 1)
target.visible_message("<span class='danger'>[target] is hit by [num_hits] [proj_name]s!</span>", null, null, COMBAT_MESSAGE_RANGE, target)
to_chat(target, "<span class='userdanger'>You're hit by [num_hits] [proj_name]s!</span>")
else
target.visible_message("<span class='danger'>[target] is hit by a [proj_name]!</span>", null, null, COMBAT_MESSAGE_RANGE, target)
to_chat(target, "<span class='userdanger'>You're hit by a [proj_name]!</span>")
var/obj/item/bodypart/hit_part
if(isbodypart(target))
hit_part = target
target = hit_part.owner
var/damage_dealt = wound_info_by_part[hit_part][CLOUD_POSITION_DAMAGE]
var/w_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_W_BONUS]
var/bw_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_BW_BONUS]
var/wound_type = (initial(P.damage_type) == BRUTE) ? WOUND_BLUNT : WOUND_BURN // sharpness is handled in the wound rolling
wound_info_by_part[hit_part] = null
hit_part.painless_wound_roll(wound_type, damage_dealt, w_bonus, bw_bonus, initial(P.sharpness))
if(num_hits > 1)
target.visible_message("<span class='danger'>[target] is hit by [num_hits] [proj_name]s[hit_part ? " in the [hit_part.name]" : ""]!</span>", null, null, COMBAT_MESSAGE_RANGE, target)
to_chat(target, "<span class='userdanger'>You're hit by [num_hits] [proj_name]s[hit_part ? " in the [hit_part.name]" : ""]!</span>")
else
target.visible_message("<span class='danger'>[target] is hit by a [proj_name][hit_part ? " in the [hit_part.name]" : ""]!</span>", null, null, COMBAT_MESSAGE_RANGE, target)
to_chat(target, "<span class='userdanger'>You're hit by a [proj_name][hit_part ? " in the [hit_part.name]" : ""]!</span>")
UnregisterSignal(parent, COMSIG_PARENT_PREQDELETED)
if(queued_delete)
qdel(parent)
@@ -281,3 +316,7 @@
targets_hit -= target
bodies -= target
purple_hearts -= target
#undef CLOUD_POSITION_DAMAGE
#undef CLOUD_POSITION_W_BONUS
#undef CLOUD_POSITION_BW_BONUS
+15
View File
@@ -29,10 +29,18 @@
if(strength > RAD_MINIMUM_CONTAMINATION)
SSradiation.warn(src)
//Let's make er glow
//This relies on parent not being a turf or something. IF YOU CHANGE THAT, CHANGE THIS
var/atom/movable/master = parent
master.add_filter("rad_glow", 2, list("type" = "outline", "color" = "#39ff1430", "size" = 2))
addtimer(CALLBACK(src, .proc/glow_loop, master), rand(1,19))//Things should look uneven
START_PROCESSING(SSradiation, src)
/datum/component/radioactive/Destroy()
STOP_PROCESSING(SSradiation, src)
var/atom/movable/master = parent
master.remove_filter("rad_glow")
return ..()
/datum/component/radioactive/process()
@@ -46,6 +54,13 @@
if(strength <= RAD_BACKGROUND_RADIATION)
return PROCESS_KILL
/datum/component/radioactive/proc/glow_loop(atom/movable/master)
var/filter = master.get_filter("rad_glow")
if(filter)
animate(filter, alpha = 110, time = 15, loop = -1)
animate(alpha = 40, time = 25)
/datum/component/radioactive/InheritComponent(datum/component/C, i_am_original, _strength, _source, _half_life, _can_contaminate)
if(!i_am_original)
return
+24 -3
View File
@@ -11,6 +11,13 @@
// This is to stop squeak spam from inhand usage
var/last_use = 0
var/use_delay = 20
// squeak cooldowns
var/last_squeak = 0
var/squeak_delay = 5
/// chance we'll be stopped from squeaking by cooldown when something crossing us squeaks
var/cross_squeak_delay_chance = 33 // about 3 things can squeak at a time
/datum/component/squeak/Initialize(custom_sounds, volume_override, chance_override, step_delay_override, use_delay_override)
if(!isatom(parent))
@@ -19,6 +26,7 @@
if(ismovable(parent))
RegisterSignal(parent, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_IMPACT), .proc/play_squeak)
RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED, COMSIG_ITEM_WEARERCROSSED), .proc/play_squeak_crossed)
RegisterSignal(parent, COMSIG_CROSS_SQUEAKED, .proc/delay_squeak)
RegisterSignal(parent, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react)
if(isitem(parent))
RegisterSignal(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_HIT_REACT), .proc/play_squeak)
@@ -39,20 +47,28 @@
use_delay = use_delay_override
/datum/component/squeak/proc/play_squeak()
do_play_squeak()
/datum/component/squeak/proc/do_play_squeak(bypass_cooldown = FALSE)
if(!bypass_cooldown && ((last_squeak + squeak_delay) >= world.time))
return FALSE
if(prob(squeak_chance))
if(!override_squeak_sounds)
playsound(parent, pickweight(default_squeak_sounds), volume, 1, -1)
else
playsound(parent, pickweight(override_squeak_sounds), volume, 1, -1)
last_squeak = world.time
return TRUE
return FALSE
/datum/component/squeak/proc/step_squeak()
if(steps > step_delay)
play_squeak()
do_play_squeak(TRUE)
steps = 0
else
steps++
/datum/component/squeak/proc/play_squeak_crossed(atom/movable/AM)
/datum/component/squeak/proc/play_squeak_crossed(datum/source, atom/movable/AM)
if(isitem(AM))
var/obj/item/I = AM
if(I.item_flags & ABSTRACT)
@@ -63,13 +79,18 @@
return
var/atom/current_parent = parent
if(isturf(current_parent.loc))
play_squeak()
if(do_play_squeak())
SEND_SIGNAL(AM, COMSIG_CROSS_SQUEAKED)
/datum/component/squeak/proc/use_squeak()
if(last_use + use_delay < world.time)
last_use = world.time
play_squeak()
/datum/component/squeak/proc/delay_squeak()
if(prob(cross_squeak_delay_chance))
last_squeak = world.time
/datum/component/squeak/proc/on_equip(datum/source, mob/equipper, slot)
RegisterSignal(equipper, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react, TRUE)
+2
View File
@@ -105,6 +105,8 @@
/// Triggered on attack self of the item containing the component
/datum/component/two_handed/proc/on_attack_self(datum/source, mob/user)
if(!user.is_holding(parent))
return //give no quarter to telekinesis powergaemrs (telekinetic wielding will desync the offhand and result in all sorts of bugs so no until someone codes it properly)
if(wielded)
unwield(user)
else
+25 -10
View File
@@ -102,6 +102,15 @@ GLOBAL_LIST_EMPTY(uplinks)
return //no hitting everyone/everything just to try to slot tcs in!
if(istype(I, /obj/item/stack/telecrystal))
LoadTC(user, I)
if(active)
if(I.GetComponent(/datum/component/uplink))
var/datum/component/uplink/hidden_uplink = I.GetComponent(/datum/component/uplink)
var/amt = hidden_uplink.telecrystals
hidden_uplink.telecrystals -= amt
src.telecrystals += amt
to_chat(user, "<span class='notice'>You connect the [I] to your uplink, siphoning [amt] telecrystals before quickly undoing the connection.")
else
return
for(var/category in uplink_items)
for(var/item in uplink_items[category])
var/datum/uplink_item/UI = uplink_items[category][item]
@@ -134,23 +143,19 @@ GLOBAL_LIST_EMPTY(uplinks)
// an unlocked uplink blocks also opening the PDA or headset menu
return COMPONENT_NO_INTERACT
/datum/component/uplink/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.inventory_state)
/datum/component/uplink/ui_state(mob/user)
return GLOB.inventory_state
/datum/component/uplink/ui_interact(mob/user, datum/tgui/ui)
active = TRUE
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, ui_key, "Uplink", name, 620, 580, master_ui, state)
ui = new(user, src, "Uplink", name)
// This UI is only ever opened by one person,
// and never is updated outside of user input.
ui.set_autoupdate(FALSE)
ui.open()
/datum/component/uplink/ui_host(mob/user)
if(istype(parent, /obj/item/implant)) //implants are like organs, not really located inside mobs codewise.
var/obj/item/implant/I = parent
return I.imp_in
return ..()
/datum/component/uplink/ui_data(mob/user)
if(!user.mind)
return
@@ -178,8 +183,18 @@ GLOBAL_LIST_EMPTY(uplinks)
is_inaccessible = FALSE
if(is_inaccessible)
continue
/*
if(I.restricted_species) //catpeople specfic gloves.
if(ishuman(user))
var/is_inaccessible = TRUE
var/mob/living/carbon/human/H = user
for(var/F in I.restricted_species)
if(F == H.dna.species.id || debug)
is_inaccessible = FALSE
break
if(is_inaccessible)
continue
*/
cat["items"] += list(list(
"name" = I.name,
"cost" = I.cost,
+42 -6
View File
@@ -1,13 +1,13 @@
//TODO: someone please get rid of this shit
/datum/datacore
var/medical[] = list()
var/list/medical = list()
var/medicalPrintCount = 0
var/general[] = list()
var/security[] = list()
var/list/general = list()
var/list/security = list()
var/securityPrintCount = 0
var/securityCrimeCounter = 0
//This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
var/locked[] = list()
///This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
var/list/locked = list()
/datum/data
var/name = "data"
@@ -91,6 +91,42 @@
if(foundrecord)
foundrecord.fields["rank"] = assignment
/datum/datacore/proc/get_manifest_tg() //copypasted from tg, renamed to avoid namespace conflicts
var/list/manifest_out = list()
var/list/departments = list(
"Command" = GLOB.command_positions,
"Security" = GLOB.security_positions,
"Engineering" = GLOB.engineering_positions,
"Medical" = GLOB.medical_positions,
"Science" = GLOB.science_positions,
"Supply" = GLOB.supply_positions,
"Service" = GLOB.civilian_positions,
"Silicon" = GLOB.nonhuman_positions
)
for(var/datum/data/record/t in GLOB.data_core.general)
var/name = t.fields["name"]
var/rank = t.fields["rank"]
var/has_department = FALSE
for(var/department in departments)
var/list/jobs = departments[department]
if(rank in jobs)
if(!manifest_out[department])
manifest_out[department] = list()
manifest_out[department] += list(list(
"name" = name,
"rank" = rank
))
has_department = TRUE
break
if(!has_department)
if(!manifest_out["Misc"])
manifest_out["Misc"] = list()
manifest_out["Misc"] += list(list(
"name" = name,
"rank" = rank
))
return manifest_out
/datum/datacore/proc/get_manifest(monochrome, OOC)
var/list/heads = list()
var/list/sec = list()
+2
View File
@@ -50,6 +50,7 @@
destination.dna.skin_tone_override = skin_tone_override
destination.dna.features = features.Copy()
destination.set_species(species.type, icon_update=0)
destination.dna.species.say_mod = species.say_mod
destination.dna.real_name = real_name
destination.dna.nameless = nameless
destination.dna.custom_species = custom_species
@@ -74,6 +75,7 @@
new_dna.skin_tone_override = skin_tone_override
new_dna.features = features.Copy()
new_dna.species = new species.type
new_dna.species.say_mod = species.say_mod
new_dna.real_name = real_name
new_dna.nameless = nameless
new_dna.custom_species = custom_species
+20 -36
View File
@@ -2,7 +2,7 @@
The presence of this element allows an item (or a projectile carrying an item) to embed itself in a human or turf when it is thrown into a target (whether by hand, gun, or explosive wave) with either
at least 4 throwspeed (EMBED_THROWSPEED_THRESHOLD) or ignore_throwspeed_threshold set to TRUE. Items meant to be used as shrapnel for projectiles should have ignore_throwspeed_threshold set to true.
Whether we're dealing with a direct /obj/item (throwing a knife at someone) or an /obj/projectile with a shrapnel_type, how we handle things plays out the same, with one extra step separating them.
Whether we're dealing with a direct /obj/item (throwing a knife at someone) or an /obj/item/projectile with a shrapnel_type, how we handle things plays out the same, with one extra step separating them.
Items simply make their COMSIG_MOVABLE_IMPACT or COMSIG_MOVABLE_IMPACT_ZONE check (against a closed turf or a carbon, respectively), while projectiles check on COMSIG_PROJECTILE_SELF_ON_HIT.
Upon a projectile hitting a valid target, it spawns whatever type of payload it has defined, then has that try to embed itself in the target on its own.
@@ -37,10 +37,10 @@
if(!isitem(target) && !isprojectile(target))
return ELEMENT_INCOMPATIBLE
RegisterSignal(target, COMSIG_ELEMENT_ATTACH, .proc/severancePackage)
if(isitem(target))
RegisterSignal(target, COMSIG_MOVABLE_IMPACT_ZONE, .proc/checkEmbedMob)
RegisterSignal(target, COMSIG_MOVABLE_IMPACT, .proc/checkEmbedOther)
RegisterSignal(target, COMSIG_ELEMENT_ATTACH, .proc/severancePackage)
RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/examined)
RegisterSignal(target, COMSIG_EMBED_TRY_FORCE, .proc/tryForceEmbed)
RegisterSignal(target, COMSIG_ITEM_DISABLE_EMBED, .proc/detachFromWeapon)
@@ -68,7 +68,7 @@
if(isitem(target))
UnregisterSignal(target, list(COMSIG_MOVABLE_IMPACT_ZONE, COMSIG_ELEMENT_ATTACH, COMSIG_MOVABLE_IMPACT, COMSIG_PARENT_EXAMINE, COMSIG_EMBED_TRY_FORCE, COMSIG_ITEM_DISABLE_EMBED))
else
UnregisterSignal(target, list(COMSIG_PROJECTILE_SELF_ON_HIT))
UnregisterSignal(target, list(COMSIG_PROJECTILE_SELF_ON_HIT, COMSIG_ELEMENT_ATTACH))
/// Checking to see if we're gonna embed into a human
@@ -79,13 +79,13 @@
var/actual_chance = embed_chance
if(!weapon.isEmbedHarmless()) // all the armor in the world won't save you from a kick me sign
var/armor = max(victim.run_armor_check(hit_zone, "bullet", silent=TRUE), victim.run_armor_check(hit_zone, "bomb", silent=TRUE)) // we'll be nice and take the better of bullet and bomb armor
var/armor = max(victim.run_armor_check(hit_zone, "bullet", silent=TRUE), victim.run_armor_check(hit_zone, "bomb", silent=TRUE)) * 0.5 // we'll be nice and take the better of bullet and bomb armor, halved
if(armor) // we only care about armor penetration if there's actually armor to penetrate
var/pen_mod = -armor + weapon.armour_penetration // even a little bit of armor can make a big difference for shrapnel with large negative armor pen
actual_chance += pen_mod // doing the armor pen as a separate calc just in case this ever gets expanded on
if(actual_chance <= 0)
victim.visible_message("<span class='danger'>[weapon] bounces off [victim]'s armor!</span>", "<span class='notice'>[weapon] bounces off your armor!</span>", vision_distance = COMBAT_MESSAGE_RANGE)
victim.visible_message("<span class='danger'>[weapon] bounces off [victim]'s armor, unable to embed!</span>", "<span class='notice'>[weapon] bounces off your armor, unable to embed!</span>", vision_distance = COMBAT_MESSAGE_RANGE)
return
var/roll_embed = prob(actual_chance)
@@ -147,7 +147,7 @@
return TRUE
///A different embed element has been attached, so we'll detach and let them handle things
/datum/element/embed/proc/severancePackage(obj/item/weapon, datum/element/E)
/datum/element/embed/proc/severancePackage(obj/weapon, datum/element/E)
if(istype(E, /datum/element/embed))
Detach(weapon)
@@ -169,46 +169,35 @@
* it to call tryForceEmbed() on its own embed element (it's out of our hands here, our projectile is done), where it will run through all the checks it needs to.
*/
/datum/element/embed/proc/checkEmbedProjectile(obj/item/projectile/P, atom/movable/firer, atom/hit, angle, hit_zone)
if(!iscarbon(hit) && !isclosedturf(hit))
if(!iscarbon(hit))
Detach(P)
return // we don't care
var/obj/item/payload = new payload_type(get_turf(hit))
var/did_embed
if(iscarbon(hit))
var/mob/living/carbon/C = hit
var/obj/item/bodypart/limb
limb = C.get_bodypart(hit_zone)
if(!limb)
limb = C.get_bodypart()
did_embed = payload.tryEmbed(limb)
else
did_embed = payload.tryEmbed(hit)
if(istype(payload, /obj/item/shrapnel/bullet))
payload.name = P.name
payload.embedding = P.embedding
payload.updateEmbedding()
var/mob/living/carbon/C = hit
var/obj/item/bodypart/limb = C.get_bodypart(hit_zone)
if(!limb)
limb = C.get_bodypart()
if(!did_embed)
payload.failedEmbed()
payload.tryEmbed(limb)
Detach(P)
/**
* tryForceEmbed() is called here when we fire COMSIG_EMBED_TRY_FORCE from [/obj/item/proc/tryEmbed]. Mostly, this means we're a piece of shrapnel from a projectile that just impacted something, and we're trying to embed in it.
*
* The reason for this extra mucking about is avoiding having to do an extra hitby(), and annoying the target by impacting them once with the projectile, then again with the shrapnel (which likely represents said bullet), and possibly
* AGAIN if we actually embed. This way, we save on at least one message. Runs the standard embed checks on the mob/turf.
*
* Arguments:
* * I- what we're trying to embed, obviously
* * target- what we're trying to shish-kabob, either a bodypart, a carbon, or a closed turf
* * I- the item we're trying to insert into the target
* * target- what we're trying to shish-kabob, either a bodypart or a carbon
* * hit_zone- if our target is a carbon, try to hit them in this zone, if we don't have one, pick a random one. If our target is a bodypart, we already know where we're hitting.
* * forced- if we want this to succeed 100%
*/
/datum/element/embed/proc/tryForceEmbed(obj/item/I, atom/target, hit_zone, forced=FALSE)
var/obj/item/bodypart/limb
var/mob/living/carbon/C
var/turf/closed/T
if(!forced && !prob(embed_chance))
return
if(iscarbon(target))
C = target
if(!hit_zone)
@@ -218,10 +207,5 @@
limb = target
hit_zone = limb.body_zone
C = limb.owner
else if(isclosedturf(target))
T = target
if(C)
return checkEmbedMob(I, C, hit_zone, forced=TRUE)
else if(T)
return checkEmbedOther(I, T, forced=TRUE)
checkEmbedMob(I, C, hit_zone, forced=TRUE)
return TRUE
+1 -1
View File
@@ -60,7 +60,7 @@
if(L.stat == DEAD)
continue
if(light_nutrition_gain)
L.adjust_nutrition(light_amount * light_nutrition_gain * attached_atoms[AM], NUTRITION_LEVEL_FULL)
L.adjust_nutrition(light_amount * light_nutrition_gain * attached_atoms[AM], NUTRITION_LEVEL_WELL_FED)
if(light_amount > bonus_lum || light_amount < malus_lum)
var/mult = ((light_amount > bonus_lum) ? 1 : -1) * attached_atoms[AM]
if(light_bruteheal)
+6 -8
View File
@@ -196,14 +196,12 @@ GLOBAL_LIST_EMPTY(explosions)
//------- EX_ACT AND TURF FIRES -------
if(T == epicenter) // Ensures explosives detonating from bags trigger other explosives in that bag
var/list/items = list()
for(var/I in T)
var/atom/A = I
if (!(A.flags_1 & PREVENT_CONTENTS_EXPLOSION_1)) //The atom/contents_explosion() proc returns null if the contents ex_acting has been handled by the atom, and TRUE if it hasn't.
items += A.GetAllContents()
for(var/O in items)
var/atom/A = O
if((T == epicenter) && !QDELETED(explosion_source) && ismovable(explosion_source) && (get_turf(explosion_source) == T)) // Ensures explosives detonating from bags trigger other explosives in that bag
var/list/atoms = list()
for(var/atom/A in explosion_source.loc) // the ismovableatom check 2 lines above makes sure we don't nuke an /area
atoms += A
for(var/i in atoms)
var/atom/A = i
if(!QDELETED(A))
A.ex_act(dist)
+119 -5
View File
@@ -32,20 +32,29 @@
var/datum/action/innate/end_holocall/hangup //hangup action
var/call_start_time
var/head_call = FALSE //calls from a head of staff autoconnect, if the receiving pad is not secure.
//creates a holocall made by `caller` from `calling_pad` to `callees`
/datum/holocall/New(mob/living/caller, obj/machinery/holopad/calling_pad, list/callees)
/datum/holocall/New(mob/living/caller, obj/machinery/holopad/calling_pad, list/callees, elevated_access = FALSE)
call_start_time = world.time
user = caller
calling_pad.outgoing_call = src
calling_holopad = calling_pad
head_call = elevated_access
dialed_holopads = list()
for(var/I in callees)
var/obj/machinery/holopad/H = I
if(!QDELETED(H) && H.is_operational())
dialed_holopads += H
H.say("Incoming call.")
if(head_call)
if(H.secure)
calling_pad.say("Auto-connection refused, falling back to call mode.")
H.say("Incoming call.")
else
H.say("Incoming connection.")
else
H.say("Incoming call.")
LAZYADD(H.holo_calls, src)
if(!dialed_holopads.len)
@@ -79,6 +88,7 @@
dialed_holopads.Cut()
if(calling_holopad)
calling_holopad.calling = FALSE
calling_holopad.outgoing_call = null
calling_holopad.SetLightsAndPower()
calling_holopad = null
@@ -145,6 +155,7 @@
if(!Check())
return
calling_holopad.calling = FALSE
hologram = H.activate_holo(user)
hologram.HC = src
@@ -160,6 +171,8 @@
hangup = new(eye, src)
hangup.Grant(user)
playsound(H, 'sound/machines/ping.ogg', 100)
H.say("Connection established.")
//Checks the validity of a holocall and qdels itself if it's not. Returns TRUE if valid, FALSE otherwise
/datum/holocall/proc/Check()
@@ -178,7 +191,6 @@
. = world.time < (call_start_time + HOLOPAD_MAX_DIAL_TIME)
if(!.)
calling_holopad.say("No answer received.")
calling_holopad.temp = ""
if(!.)
testing("Holocall Check fail")
@@ -241,10 +253,10 @@
record.caller_image = holodiskOriginal.record.caller_image
record.entries = holodiskOriginal.record.entries.Copy()
record.language = holodiskOriginal.record.language
to_chat(user, "You copy the record from [holodiskOriginal] to [src] by connecting the ports!")
to_chat(user, "<span class='notice'>You copy the record from [holodiskOriginal] to [src] by connecting the ports!</span>")
name = holodiskOriginal.name
else
to_chat(user, "[holodiskOriginal] has no record on it!")
to_chat(user, "<span class='warning'>[holodiskOriginal] has no record on it!</span>")
..()
/obj/item/disk/holodisk/proc/build_record()
@@ -331,6 +343,21 @@
DELAY 20"}
/datum/preset_holoimage/engineer
outfit_type = /datum/outfit/job/engineer
/datum/preset_holoimage/engineer/rig
outfit_type = /datum/outfit/job/engineer/gloved/rig
/datum/preset_holoimage/engineer/ce
outfit_type = /datum/outfit/job/ce
/datum/preset_holoimage/engineer/ce/rig
outfit_type = /datum/outfit/job/engineer/gloved/rig
/datum/preset_holoimage/engineer/atmos
outfit_type = /datum/outfit/job/atmos
/datum/preset_holoimage/engineer/atmos/rig
outfit_type = /datum/outfit/job/engineer/gloved/rig
/datum/preset_holoimage/researcher
@@ -350,3 +377,90 @@
/datum/preset_holoimage/clown
outfit_type = /datum/outfit/job/clown
/obj/item/disk/holodisk/donutstation/whiteship
name = "Blackbox Print-out #DS024"
desc = "A holodisk containing the last viable recording of DS024's blackbox."
preset_image_type = /datum/preset_holoimage/engineer/ce
preset_record_text = {"
NAME Geysr Shorthalt
SAY Engine renovations complete and the ships been loaded. We all ready?
DELAY 25
PRESET /datum/preset_holoimage/engineer
NAME Jacob Ullman
SAY Lets blow this popsicle stand of a station.
DELAY 20
PRESET /datum/preset_holoimage/engineer/atmos
NAME Lindsey Cuffler
SAY Uh, sir? Shouldn't we call for a secondary shuttle? The bluespace drive on this thing made an awfully weird noise when we jumped here..
DELAY 30
PRESET /datum/preset_holoimage/engineer/ce
NAME Geysr Shorthalt
SAY Pah! Ship techie at the dock said to give it a good few kicks if it started acting up, let me just..
DELAY 25
SOUND punch
SOUND sparks
DELAY 10
SOUND punch
SOUND sparks
DELAY 10
SOUND punch
SOUND sparks
SOUND warpspeed
DELAY 15
PRESET /datum/preset_holoimage/engineer/atmos
NAME Lindsey Cuffler
SAY Uhh.. is it supposed to be doing that??
DELAY 15
PRESET /datum/preset_holoimage/engineer/ce
NAME Geysr Shorthalt
SAY See? Working as intended. Now, are we all ready?
DELAY 10
PRESET /datum/preset_holoimage/engineer
NAME Jacob Ullman
SAY Is it supposed to be glowing like that?
DELAY 20
SOUND explosion
"}
/obj/item/disk/holodisk/ruin/snowengieruin
name = "Blackbox Print-out #EB412"
desc = "A holodisk containing the last moments of EB412. There's a bloody fingerprint on it."
preset_image_type = /datum/preset_holoimage/engineer
preset_record_text = {"
NAME Dave Tundrale
SAY Maria, how's Build?
DELAY 10
NAME Maria Dell
PRESET /datum/preset_holoimage/engineer/atmos
SAY It's fine, don't worry. I've got Plastic on it. And frankly, i'm kinda busy with, the, uhhm, incinerator.
DELAY 30
NAME Dave Tundrale
PRESET /datum/preset_holoimage/engineer
SAY Aight, wonderful. The science mans been kinda shit though. No RCDs-
DELAY 20
NAME Maria Dell
PRESET /datum/preset_holoimage/engineer/atmos
SAY Enough about your RCDs. They're not even that important, just bui-
DELAY 15
SOUND explosion
DELAY 10
SAY Oh, shit!
DELAY 10
PRESET /datum/preset_holoimage/engineer/atmos/rig
LANGUAGE /datum/language/narsie
NAME Unknown
SAY RISE, MY LORD!!
DELAY 10
LANGUAGE /datum/language/common
NAME Plastic
PRESET /datum/preset_holoimage/engineer/rig
SAY Fuck, fuck, fuck!
DELAY 20
SAY It's loose! CALL THE FUCKING SHUTT-
DELAY 10
PRESET /datum/preset_holoimage/corgi
NAME Blackbox Automated Message
SAY Connection lost. Dumping audio logs to disk.
DELAY 50"}
+74
View File
@@ -0,0 +1,74 @@
/datum/http_request
var/id
var/in_progress = FALSE
var/method
var/body
var/headers
var/url
var/_raw_response
/datum/http_request/proc/prepare(method, url, body = "", list/headers)
if (!length(headers))
headers = ""
else
headers = json_encode(headers)
src.method = method
src.url = url
src.body = body
src.headers = headers
/datum/http_request/proc/execute_blocking()
_raw_response = rustg_http_request_blocking(method, url, body, headers)
/datum/http_request/proc/begin_async()
if (in_progress)
CRASH("Attempted to re-use a request object.")
id = rustg_http_request_async(method, url, body, headers)
if (isnull(text2num(id)))
stack_trace("Proc error: [id]")
_raw_response = "Proc error: [id]"
else
in_progress = TRUE
/datum/http_request/proc/is_complete()
if (isnull(id))
return TRUE
if (!in_progress)
return TRUE
var/r = rustg_http_check_request(id)
if (r == RUSTG_JOB_NO_RESULTS_YET)
return FALSE
else
_raw_response = r
in_progress = FALSE
return TRUE
/datum/http_request/proc/into_response()
var/datum/http_response/R = new()
try
var/list/L = json_decode(_raw_response)
R.status_code = L["status_code"]
R.headers = L["headers"]
R.body = L["body"]
catch
R.errored = TRUE
R.error = _raw_response
return R
/datum/http_response
var/status_code
var/body
var/list/headers
var/errored = FALSE
var/error
+3 -3
View File
@@ -44,11 +44,11 @@
//Here we roll for our damage to be added into the damage var in the various attack procs. This is changed depending on whether we are in combat mode, lying down, or if our target is in combat mode.
var/damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh)
if(SEND_SIGNAL(D, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
damage *= 1.5
damage *= 1.2
if(!CHECK_MOBILITY(A, MOBILITY_STAND))
damage *= 0.5
damage *= 0.7
if(SEND_SIGNAL(A, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
damage *= 0.25
damage *= 0.8
return damage
/datum/martial_art/proc/teach(mob/living/carbon/human/H, make_temporary = FALSE)
+21
View File
@@ -19,6 +19,27 @@
description = "<span class='boldwarning'>I'm starving!</span>\n"
mood_change = -15
//charge
/datum/mood_event/supercharged
description = "<span class='boldwarning'>I can't possibly keep all this power inside, I need to release some quick!</span>\n"
mood_change = -10
/datum/mood_event/overcharged
description = "<span class='warning'>I feel dangerously overcharged, perhaps I should release some power.</span>\n"
mood_change = -4
/datum/mood_event/charged
description = "<span class='nicegreen'>I feel the power in my veins!</span>\n"
mood_change = 6
/datum/mood_event/lowpower
description = "<span class='warning'>My power is running low, I should go charge up somewhere.</span>\n"
mood_change = -6
/datum/mood_event/decharged
description = "<span class='boldwarning'>I'm in desperate need of some electricity!</span>\n"
mood_change = -10
//Disgust
/datum/mood_event/gross
description = "<span class='warning'>I saw something gross.</span>\n"
+1 -1
View File
@@ -410,7 +410,7 @@
throw_speed = 4
embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 100, "embedded_fall_chance" = 0)
w_class = WEIGHT_CLASS_SMALL
sharpness = IS_SHARP
sharpness = SHARP_POINTY
var/mob/living/carbon/human/fired_by
/// if we missed our target
var/missed = TRUE
+18
View File
@@ -27,6 +27,24 @@
target.attack_hulk(owner)
return INTERRUPT_UNARMED_ATTACK | NO_AUTO_CLICKDELAY_HANDLING
/**
*Checks damage of a hulk's arm and applies bone wounds as necessary.
*
*Called by specific atoms being attacked, such as walls. If an atom
*does not call this proc, than punching that atom will not cause
*arm breaking (even if the atom deals recoil damage to hulks).
*Arguments:
*arg1 is the arm to evaluate damage of and possibly break.
*/
/datum/mutation/human/hulk/proc/break_an_arm(obj/item/bodypart/arm)
switch(arm.brute_dam)
if(45 to 50)
arm.force_wound_upwards(/datum/wound/blunt/critical)
if(41 to 45)
arm.force_wound_upwards(/datum/wound/blunt/severe)
if(35 to 41)
arm.force_wound_upwards(/datum/wound/blunt/moderate)
/datum/mutation/human/hulk/on_life()
if(owner.health < 0)
on_losing(owner)
-1
View File
@@ -105,7 +105,6 @@
// modify the ignored_things list in __HELPERS/radiation.dm instead
var/static/list/blacklisted = typecacheof(list(
/turf,
/mob,
/obj/structure/cable,
/obj/machinery/atmospherics,
/obj/item/ammo_casing,
+7 -4
View File
@@ -14,11 +14,14 @@
mind.skill_holder.ui_interact(src)
/datum/skill_holder/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.always_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
/datum/skill_holder/ui_state(mob/user)
return GLOB.always_state
/datum/skill_holder/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, ui_key, "SkillPanel", "[owner.name]'s Skills", 620, 580, master_ui, state)
ui.set_autoupdate(FALSE) // This UI is only ever opened by one person, and never is updated outside of user input.
ui = new(user, src, "SkillPanel", "[owner.name]'s Skills")
ui.set_autoupdate(FALSE)
ui.open()
else if(need_static_data_update)
update_static_data(user)
+15 -8
View File
@@ -6,10 +6,13 @@
qdel(src)
owner = new_owner
/datum/spawners_menu/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.observer_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
/datum/spawners_menu/ui_state(mob/user)
return GLOB.observer_state
/datum/spawners_menu/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, ui_key, "SpawnersMenu", "Spawners Menu", 700, 600, master_ui, state)
ui = new(user, src, "SpawnersMenu")
ui.open()
/datum/spawners_menu/ui_data(mob/user)
@@ -42,11 +45,15 @@
if(..())
return
var/spawner_ref = pick(GLOB.mob_spawners[params["name"]])
var/obj/effect/mob_spawn/MS = locate(spawner_ref) in GLOB.poi_list
if(!MS)
var/group_name = params["name"]
if(!group_name || !(group_name in GLOB.mob_spawners))
return
var/list/spawnerlist = GLOB.mob_spawners[group_name]
if(!spawnerlist.len)
return
var/obj/effect/mob_spawn/MS = pick(spawnerlist)
if(!istype(MS) || !(MS in GLOB.poi_list))
return
switch(action)
if("jump")
if(MS)
@@ -55,4 +62,4 @@
if("spawn")
if(MS)
MS.attack_ghost(owner)
. = TRUE
. = TRUE
+18 -3
View File
@@ -97,6 +97,21 @@
duration = set_duration
return ..()
/datum/status_effect/off_balance
id = "offbalance"
alert_type = null
/datum/status_effect/off_balance/on_creation(mob/living/new_owner, set_duration)
if(isnum(set_duration))
duration = set_duration
return ..()
/datum/status_effect/off_balance/on_remove()
var/active_item = owner.get_active_held_item()
if(is_type_in_typecache(active_item, GLOB.shove_disarming_types))
owner.visible_message("<span class='warning'>[owner.name] regains their grip on \the [active_item]!</span>", "<span class='warning'>You regain your grip on \the [active_item]</span>", null, COMBAT_MESSAGE_RANGE)
return ..()
/obj/screen/alert/status_effect/asleep
name = "Asleep"
desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are."
@@ -433,7 +448,7 @@
var/still_bleeding = FALSE
for(var/thing in throat.wounds)
var/datum/wound/W = thing
if(W.wound_type == WOUND_LIST_CUT && W.severity > WOUND_SEVERITY_MODERATE)
if(W.wound_type == WOUND_SLASH && W.severity > WOUND_SEVERITY_MODERATE)
still_bleeding = TRUE
break
if(!still_bleeding)
@@ -547,8 +562,8 @@
owner.DefaultCombatKnockdown(15, TRUE, FALSE, 15)
if(iscarbon(owner))
var/mob/living/carbon/C = owner
C.silent = max(2, C.silent)
C.stuttering = max(5, C.stuttering)
C.silent = max(5, C.silent) //Increased, now lasts until five seconds after it ends, instead of 2
C.stuttering = max(10, C.stuttering) //Increased, now lasts for five seconds after the mute ends, instead of 3
if(!old_health)
old_health = owner.health
if(!old_oxyloss)
+20 -11
View File
@@ -117,8 +117,7 @@
/datum/status_effect/wound/on_creation(mob/living/new_owner, incoming_wound)
. = ..()
var/datum/wound/W = incoming_wound
linked_wound = W
linked_wound = incoming_wound
linked_limb = linked_wound.limb
/datum/status_effect/wound/on_remove()
@@ -140,9 +139,9 @@
// bones
/datum/status_effect/wound/bone
/datum/status_effect/wound/blunt
/datum/status_effect/wound/bone/interact_speed_modifier()
/datum/status_effect/wound/blunt/interact_speed_modifier()
var/mob/living/carbon/C = owner
if(C.get_active_hand() == linked_limb)
@@ -151,7 +150,7 @@
return 1
/datum/status_effect/wound/bone/action_cooldown_mod()
/datum/status_effect/wound/blunt/action_cooldown_mod()
var/mob/living/carbon/C = owner
if(C.get_active_hand() == linked_limb)
@@ -159,24 +158,34 @@
return 1
/datum/status_effect/wound/bone/moderate
/datum/status_effect/wound/blunt/moderate
id = "disjoint"
/datum/status_effect/wound/bone/severe
/datum/status_effect/wound/blunt/severe
id = "hairline"
/datum/status_effect/wound/bone/critical
/datum/status_effect/wound/blunt/critical
id = "compound"
// cuts
/datum/status_effect/wound/cut/moderate
/datum/status_effect/wound/slash/moderate
id = "abrasion"
/datum/status_effect/wound/cut/severe
/datum/status_effect/wound/slash/severe
id = "laceration"
/datum/status_effect/wound/cut/critical
/datum/status_effect/wound/slash/critical
id = "avulsion"
// pierce
/datum/status_effect/wound/pierce/moderate
id = "breakage"
/datum/status_effect/wound/pierce/severe
id = "puncture"
/datum/status_effect/wound/pierce/critical
id = "rupture"
// burns
/datum/status_effect/wound/burn/moderate
id = "seconddeg"
+3 -5
View File
@@ -14,7 +14,7 @@
if(NOBLOOD in H.dna.species.species_traits) //can't lose blood if your species doesn't have any
return
else
quirk_holder.blood_volume -= 0.275
quirk_holder.blood_volume -= 0.2
/datum/quirk/depression
name = "Depression"
@@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
if("Botanist")
heirloom_type = pick(/obj/item/cultivator, /obj/item/reagent_containers/glass/bucket, /obj/item/storage/bag/plants, /obj/item/toy/plush/beeplushie)
if("Medical Doctor")
heirloom_type = /obj/item/healthanalyzer/advanced
heirloom_type = /obj/item/healthanalyzer
if("Paramedic")
heirloom_type = /obj/item/lighter
if("Station Engineer")
@@ -337,10 +337,8 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
dumb_thing = FALSE //only once per life
if(prob(1))
new/obj/item/reagent_containers/food/snacks/pastatomato(get_turf(H)) //now that's what I call spaghetti code
// small chance to make eye contact with inanimate objects/mindless mobs because of nerves
/datum/quirk/social_anxiety/proc/looks_at_floor(datum/source, atom/A)
var/mob/living/mind_check = A
if(prob(85) || (istype(mind_check) && mind_check.mind))
+14 -5
View File
@@ -97,6 +97,12 @@
/datum/wires/proc/get_wire(color)
return colors[color]
/datum/wires/proc/get_color_of_wire(wire_type)
for(var/color in colors)
var/other_type = colors[color]
if(wire_type == other_type)
return color
/datum/wires/proc/get_attached(color)
if(assemblies[color])
return assemblies[color]
@@ -117,7 +123,7 @@
return TRUE
/datum/wires/proc/is_dud(wire)
return findtext(wire, WIRE_DUD_PREFIX)
return findtext(wire, WIRE_DUD_PREFIX, 1, length(WIRE_DUD_PREFIX) + 1)
/datum/wires/proc/is_dud_color(color)
return is_dud(get_wire(color))
@@ -197,6 +203,7 @@
S.forceMove(holder.drop_location())
return S
/// Called from [/atom/proc/emp_act]
/datum/wires/proc/emp_pulse()
var/list/possible_wires = shuffle(wires)
var/remaining_pulses = MAXIMUM_EMP_WIRES
@@ -239,11 +246,13 @@
return ..()
return UI_CLOSE
/datum/wires/ui_interact(mob/user, ui_key = "wires", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
/datum/wires/ui_state(mob/user)
return GLOB.physical_state
/datum/wires/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if (!ui)
ui = new(user, src, ui_key, "Wires", "[holder.name] Wires", 350, 150 + wires.len * 30, master_ui, state)
ui = new(user, src, "Wires", "[holder.name] Wires")
ui.open()
/datum/wires/ui_data(mob/user)
+10 -21
View File
@@ -53,11 +53,10 @@
/datum/wires/airlock/interactable(mob/user)
var/obj/machinery/door/airlock/A = holder
if(!A.panel_open)
return FALSE
if(!A.hasSiliconAccessInArea(user) && A.isElectrified() && A.shock(user, 100))
return FALSE
return TRUE
if(A.panel_open)
return TRUE
/datum/wires/airlock/get_status()
var/obj/machinery/door/airlock/A = holder
@@ -115,10 +114,7 @@
A.aiControlDisabled = -1
if(WIRE_SHOCK) // Pulse to shock the door for 10 ticks.
if(!A.secondsElectrified)
A.set_electrified(30)
if(usr)
LAZYADD(A.shockedby, text("\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(usr)]"))
log_combat(usr, A, "electrified")
A.set_electrified(30, usr)
if(WIRE_SAFETY)
A.safe = !A.safe
if(!A.density)
@@ -135,21 +131,17 @@
if(WIRE_POWER1, WIRE_POWER2) // Cut to loose power, repair all to gain power.
if(mend && !is_cut(WIRE_POWER1) && !is_cut(WIRE_POWER2))
A.regainMainPower()
if(usr)
A.shock(usr, 50)
else
A.loseMainPower()
if(usr)
A.shock(usr, 50)
if(isliving(usr))
A.shock(usr, 50)
if(WIRE_BACKUP1, WIRE_BACKUP2) // Cut to loose backup power, repair all to gain backup power.
if(mend && !is_cut(WIRE_BACKUP1) && !is_cut(WIRE_BACKUP2))
A.regainBackupPower()
if(usr)
A.shock(usr, 50)
else
A.loseBackupPower()
if(usr)
A.shock(usr, 50)
if(isliving(usr))
A.shock(usr, 50)
if(WIRE_BOLTS) // Cut to drop bolts, mend does nothing.
if(!mend)
A.bolt()
@@ -170,10 +162,7 @@
A.set_electrified(0)
else
if(A.secondsElectrified != -1)
A.set_electrified(-1)
if(usr)
LAZYADD(A.shockedby, text("\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(usr)]"))
log_combat(usr, A, "electrified")
A.set_electrified(-1, usr)
if(WIRE_SAFETY) // Cut to disable safeties, mend to re-enable.
A.safe = mend
if(WIRE_TIMING) // Cut to disable auto-close, mend to re-enable.
@@ -184,5 +173,5 @@
A.lights = mend
A.update_icon()
if(WIRE_ZAP1, WIRE_ZAP2) // Ouch.
if(usr)
A.shock(usr, 50)
if(isliving(usr))
A.shock(usr, 50)
+28 -10
View File
@@ -53,8 +53,12 @@
if(victim)
LAZYADD(victim.all_scars, src)
description = pick(W.scarring_descriptions)
precise_location = pick(limb.specific_locations)
if(victim && victim.get_biological_state() == BIO_JUST_BONE)
description = pick(strings(BONE_SCAR_FILE, W.scar_keyword)) || "general disfigurement"
else
description = pick(strings(FLESH_SCAR_FILE, W.scar_keyword)) || "general disfigurement"
precise_location = pick(strings(SCAR_LOC_FILE, limb.body_zone))
switch(W.severity)
if(WOUND_SEVERITY_MODERATE)
visibility = 2
@@ -62,6 +66,9 @@
visibility = 3
if(WOUND_SEVERITY_CRITICAL)
visibility = 5
if(WOUND_SEVERITY_LOSS)
visibility = 7
precise_location = "amputation"
/// Used when we finalize a scar from a healing cut
/datum/scar/proc/lazy_attach(obj/item/bodypart/BP, datum/wound/W)
@@ -71,10 +78,11 @@
LAZYADD(victim.all_scars, src)
/// Used to "load" a persistent scar
/datum/scar/proc/load(obj/item/bodypart/BP, description, specific_location, severity=WOUND_SEVERITY_SEVERE)
if(!(BP.body_zone in applicable_zones))
/datum/scar/proc/load(obj/item/bodypart/BP, version, description, specific_location, severity=WOUND_SEVERITY_SEVERE)
if(!(BP.body_zone in applicable_zones) || !BP.is_organic_limb())
qdel(src)
return
limb = BP
src.severity = severity
LAZYADD(limb.scars, src)
@@ -90,6 +98,8 @@
visibility = 3
if(WOUND_SEVERITY_CRITICAL)
visibility = 5
if(WOUND_SEVERITY_LOSS)
visibility = 7
return TRUE
/// What will show up in examine_more() if this scar is visible
@@ -102,9 +112,12 @@
if(WOUND_SEVERITY_MODERATE)
msg = "<span class='tinynotice'>[msg]</span>"
if(WOUND_SEVERITY_SEVERE)
msg = "<span class='smallnotice'>[msg]</span>"
msg = "<span class='smallnoticeital'>[msg]</span>"
if(WOUND_SEVERITY_CRITICAL)
msg = "<span class='smallnotice'><b>[msg]</b></span>"
msg = "<span class='smallnoticeital'><b>[msg]</b></span>"
if(WOUND_SEVERITY_LOSS)
msg = "[victim.p_their(TRUE)] [limb.name] [description]." // different format
msg = "<span class='notice'><i><b>[msg]</b></i></span>"
return "\t[msg]"
/// Whether a scar can currently be seen by the viewer
@@ -117,12 +130,12 @@
if(!ishuman(victim) || isobserver(viewer) || victim == viewer)
return TRUE
var/mob/living/carbon/human/H = victim
var/mob/living/carbon/human/human_victim = victim
if(istype(limb, /obj/item/bodypart/head))
if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE)))
if((human_victim.wear_mask && (human_victim.wear_mask.flags_inv & HIDEFACE)) || (human_victim.head && (human_victim.head.flags_inv & HIDEFACE)))
return FALSE
else if(limb.scars_covered_by_clothes)
var/num_covers = LAZYLEN(H.clothingonpart(limb))
var/num_covers = LAZYLEN(human_victim.clothingonpart(limb))
if(num_covers + get_dist(viewer, victim) >= visibility)
return FALSE
@@ -131,4 +144,9 @@
/// Used to format a scar to safe in preferences for persistent scars
/datum/scar/proc/format()
if(!fake)
return "[limb.body_zone]|[description]|[precise_location]|[severity]"
return "[SCAR_CURRENT_VERSION]|[limb.body_zone]|[description]|[precise_location]|[severity]"
/// Used to format a scar to safe in preferences for persistent scars
/datum/scar/proc/format_amputated(body_zone)
description = pick(list("is several skintone shades paler than the rest of the body", "is a gruesome patchwork of artificial flesh", "has a large series of attachment scars at the articulation points"))
return "[SCAR_CURRENT_VERSION]|[body_zone]|[description]|amputated|[WOUND_SEVERITY_LOSS]"
+30 -21
View File
@@ -33,15 +33,13 @@
/// Either WOUND_SEVERITY_TRIVIAL (meme wounds like stubbed toe), WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, or WOUND_SEVERITY_CRITICAL (or maybe WOUND_SEVERITY_LOSS)
var/severity = WOUND_SEVERITY_MODERATE
/// The list of wounds it belongs in, WOUND_LIST_BONE, WOUND_LIST_CUT, or WOUND_LIST_BURN
/// The list of wounds it belongs in, WOUND_LIST_BLUNT, WOUND_LIST_SLASH, or WOUND_LIST_BURN
var/wound_type
/// What body zones can we affect
var/list/viable_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
/// Who owns the body part that we're wounding
var/mob/living/carbon/victim = null
/// If we only work on organics (everything right now)
var/organic_only = TRUE
/// The bodypart we're parented to
var/obj/item/bodypart/limb = null
@@ -51,8 +49,6 @@
var/list/treatable_by_grabbed
/// Tools with the specified tool flag will also be able to try directly treating this wound
var/treatable_tool
/// Set to TRUE if we don't give a shit about the patient's comfort and are allowed to just use any random sharp thing on this wound. Will require an aggressive grab or more to perform
var/treatable_sharp
/// How long it will take to treat this wound with a standard effective tool, assuming it doesn't need surgery
var/base_treat_time = 5 SECONDS
@@ -65,17 +61,13 @@
/// How much we're contributing to this limb's bleed_rate
var/blood_flow
/// The minimum we need to roll on [/obj/item/bodypart/proc/check_wounding()] to begin suffering this wound, see check_wounding_mods() for more
/// The minimum we need to roll on [/obj/item/bodypart/proc/check_wounding] to begin suffering this wound, see check_wounding_mods() for more
var/threshold_minimum
/// How much having this wound will add to all future check_wounding() rolls on this limb, to allow progression to worse injuries with repeated damage
var/threshold_penalty
/// If we need to process each life tick
var/processes = FALSE
/// If TRUE and an item that can treat multiple different types of coexisting wounds (gauze can be used to splint broken bones, staunch bleeding, and cover burns), we get first dibs if we come up first for it, then become nonpriority.
/// Otherwise, if no untreated wound claims the item, we cycle through the non priority wounds and pick a random one who can use that item.
var/treat_priority = FALSE
/// If having this wound makes currently makes the parent bodypart unusable
var/disabling
@@ -89,12 +81,15 @@
var/cryo_progress
/// What kind of scars this wound will create description wise once healed
var/list/scarring_descriptions = list("general disfigurement")
var/scar_keyword = "generic"
/// If we've already tried scarring while removing (since remove_wound calls qdel, and qdel calls remove wound, .....) TODO: make this cleaner
var/already_scarred = FALSE
/// If we forced this wound through badmin smite, we won't count it towards the round totals
var/from_smite
/// What flags apply to this wound
var/wound_flags = (FLESH_WOUND | BONE_WOUND | ACCEPTS_GAUZE)
/datum/wound/Destroy()
if(attached_surgery)
QDEL_NULL(attached_surgery)
@@ -115,13 +110,13 @@
* * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented)
*/
/datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE)
if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || isalien(L.owner))
if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || isalien(L.owner) || !L.is_organic_limb())
qdel(src)
return
if(ishuman(L.owner))
var/mob/living/carbon/human/H = L.owner
if(organic_only && ((NOBLOOD in H.dna.species.species_traits) || !L.is_organic_limb()))
if(((wound_flags & BONE_WOUND) && !(HAS_BONE in H.dna.species.species_traits)) || ((wound_flags & FLESH_WOUND) && !(HAS_FLESH in H.dna.species.species_traits)))
qdel(src)
return
@@ -161,7 +156,7 @@
victim.visible_message(msg, "<span class='userdanger'>Your [limb.name] [occur_text]!</span>", vision_distance = vis_dist)
if(sound_effect)
playsound(L.owner, sound_effect, 60 + 20 * severity, TRUE)
playsound(L.owner, sound_effect, 70 + 20 * severity, TRUE)
if(!demoted)
wound_injury(old_wound)
@@ -181,7 +176,7 @@
SEND_SIGNAL(victim, COMSIG_CARBON_LOSE_WOUND, src, limb)
if(limb && !ignore_limb)
LAZYREMOVE(limb.wounds, src)
limb.update_wounds()
limb.update_wounds(replaced)
/**
* replace_wound() is used when you want to replace the current wound with a new wound, presumably of the same category, just of a different severity (either up or down counts)
@@ -189,7 +184,7 @@
* This proc actually instantiates the new wound based off the specific type path passed, then returns the new instantiated wound datum.
*
* Arguments:
* * new_type- The TYPE PATH of the wound you want to replace this, like /datum/wound/brute/cut/severe
* * new_type- The TYPE PATH of the wound you want to replace this, like /datum/wound/slash/severe
* * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented)
*/
/datum/wound/proc/replace_wound(new_type, smited = FALSE)
@@ -206,7 +201,6 @@
/// Additional beneficial effects when the wound is gained, in case you want to give a temporary boost to allow the victim to try an escape or last stand
/datum/wound/proc/second_wind()
switch(severity)
if(WOUND_SEVERITY_MODERATE)
victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_MODERATE)
@@ -214,11 +208,13 @@
victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_SEVERE)
if(WOUND_SEVERITY_CRITICAL)
victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_CRITICAL)
if(WOUND_SEVERITY_LOSS)
victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_LOSS)
/**
* try_treating() is an intercept run from [/mob/living/carbon/attackby()] right after surgeries but before anything else. Return TRUE here if the item is something that is relevant to treatment to take over the interaction.
* try_treating() is an intercept run from [/mob/living/carbon/proc/attackby] right after surgeries but before anything else. Return TRUE here if the item is something that is relevant to treatment to take over the interaction.
*
* This proc leads into [/datum/wound/proc/treat()] and probably shouldn't be added onto in children types. You can specify what items or tools you want to be intercepted
* This proc leads into [/datum/wound/proc/treat] and probably shouldn't be added onto in children types. You can specify what items or tools you want to be intercepted
* with var/list/treatable_by and var/treatable_tool, then if an item fulfills one of those requirements and our wound claims it first, it goes over to treat() and treat_self().
*
* Arguments:
@@ -258,7 +254,7 @@
treat(I, user)
return TRUE
/// Return TRUE if we have an item that can only be used while aggro grabbed (unhanded aggro grab treatments go in [/datum/wound/proc/try_handling()]). Treatment is still is handled in [/datum/wound/proc/treat()]
/// Return TRUE if we have an item that can only be used while aggro grabbed (unhanded aggro grab treatments go in [/datum/wound/proc/try_handling]). Treatment is still is handled in [/datum/wound/proc/treat]
/datum/wound/proc/check_grab_treatments(obj/item/I, mob/user)
return FALSE
@@ -288,10 +284,22 @@
if(cryo_progress > 33 * severity)
qdel(src)
/// When synthflesh is applied to the victim, we call this. No sense in setting up an entire chem reaction system for wounds when we only care for a few chems. Probably will change in the future
/datum/wound/proc/on_synthflesh(power)
return
/// Called when the patient is undergoing stasis, so that having fully treated a wound doesn't make you sit there helplessly until you think to unbuckle them
/datum/wound/proc/on_stasis()
return
/// Called when we're crushed in an airlock or firedoor, for one of the improvised joint dislocation fixes
/datum/wound/proc/crush()
return
/// Used when we're being dragged while bleeding, the value we return is how much bloodloss this wound causes from being dragged. Since it's a proc, you can let bandages soak some of the blood
/datum/wound/proc/drag_bleed_amount()
return
/**
* get_examine_description() is used in carbon/examine and human/examine to show the status of this wound. Useful if you need to show some status like the wound being splinted or bandaged.
*
@@ -301,7 +309,8 @@
* * mob/user: The user examining the wound's owner, if that matters
*/
/datum/wound/proc/get_examine_description(mob/user)
return "<B>[victim.p_their(TRUE)] [limb.name] [examine_desc]!</B>"
. = "[victim.p_their(TRUE)] [limb.name] [examine_desc]"
. = severity <= WOUND_SEVERITY_MODERATE ? "[.]." : "<B>[.]!</B>"
/datum/wound/proc/get_scanner_description(mob/user)
return "Type: [name]\nSeverity: [severity_text()]\nDescription: [desc]\nRecommended Treatment: [treat_text]"
+82 -115
View File
@@ -1,4 +1,3 @@
/*
Bones
*/
@@ -7,12 +6,10 @@
/*
Base definition
*/
/datum/wound/brute/bone
sound_effect = 'sound/effects/crack1.ogg'
wound_type = WOUND_LIST_BONE
/// The item we're currently splinted with, if there is one
var/obj/item/stack/splinted
/datum/wound/blunt
sound_effect = 'sound/effects/wounds/crack1.ogg'
wound_type = WOUND_BLUNT
wound_flags = (BONE_WOUND | ACCEPTS_GAUZE)
/// Have we been taped?
var/taped
@@ -31,12 +28,12 @@
/// How long do we wait +/- 20% for the next trauma?
var/trauma_cycle_cooldown
/// If this is a chest wound and this is set, we have this chance to cough up blood when hit in the chest
var/chance_internal_bleeding = 0
var/internal_bleeding_chance = 0
/*
Overwriting of base procs
*/
/datum/wound/brute/bone/wound_injury(datum/wound/old_wound = null)
/datum/wound/blunt/wound_injury(datum/wound/old_wound = null)
if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group)
processes = TRUE
active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND)
@@ -53,14 +50,14 @@
update_inefficiencies()
/datum/wound/brute/bone/remove_wound(ignore_limb, replaced)
/datum/wound/blunt/remove_wound(ignore_limb, replaced)
limp_slowdown = 0
QDEL_NULL(active_trauma)
if(victim)
UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK)
return ..()
/datum/wound/brute/bone/handle_process()
/datum/wound/blunt/handle_process()
. = ..()
if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group && world.time > next_trauma_cycle)
if(active_trauma)
@@ -86,7 +83,7 @@
remove_wound()
/// If we're a human who's punching something with a broken arm, we might hurt ourselves doing so
/datum/wound/brute/bone/proc/attack_with_hurt_hand(mob/M, atom/target, proximity)
/datum/wound/blunt/proc/attack_with_hurt_hand(mob/M, atom/target, proximity)
if(victim.get_active_hand() != limb || victim.a_intent == INTENT_HELP || !ismob(target) || severity <= WOUND_SEVERITY_MODERATE)
return
@@ -104,61 +101,54 @@
limb.receive_damage(brute=rand(3,7))
return COMPONENT_NO_ATTACK_HAND
/datum/wound/brute/bone/receive_damage(wounding_type, wounding_dmg, wound_bonus)
if(!victim)
/datum/wound/blunt/receive_damage(wounding_type, wounding_dmg, wound_bonus)
if(!victim || wounding_dmg < WOUND_MINIMUM_DAMAGE)
return
if(ishuman(victim))
var/mob/living/carbon/human/human_victim = victim
if(NOBLOOD in human_victim.dna?.species.species_traits)
return
if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume && prob(chance_internal_bleeding + wounding_dmg))
if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume && prob(internal_bleeding_chance + wounding_dmg))
var/blood_bled = rand(1, wounding_dmg * (severity == WOUND_SEVERITY_CRITICAL ? 2 : 1.5)) // 12 brute toolbox can cause up to 18/24 bleeding with a severe/critical chest wound
switch(blood_bled)
if(1 to 6)
victim.bleed(blood_bled, TRUE)
if(7 to 13)
victim.visible_message("<span class='danger'>[victim] coughs up a bit of blood from the blow to [victim.p_their()] chest.</span>", "<span class='danger'>You cough up a bit of blood from the blow to your chest.</span>")
victim.visible_message("<span class='smalldanger'>[victim] coughs up a bit of blood from the blow to [victim.p_their()] chest.</span>", "<span class='danger'>You cough up a bit of blood from the blow to your chest.</span>", vision_distance=COMBAT_MESSAGE_RANGE)
victim.bleed(blood_bled, TRUE)
if(14 to 19)
victim.visible_message("<span class='danger'>[victim] spits out a string of blood from the blow to [victim.p_their()] chest!</span>", "<span class='danger'>You spit out a string of blood from the blow to your chest!</span>")
victim.visible_message("<span class='smalldanger'>[victim] spits out a string of blood from the blow to [victim.p_their()] chest!</span>", "<span class='danger'>You spit out a string of blood from the blow to your chest!</span>", vision_distance=COMBAT_MESSAGE_RANGE)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir)
victim.bleed(blood_bled)
if(20 to INFINITY)
victim.visible_message("<span class='danger'>[victim] chokes up a spray of blood from the blow to [victim.p_their()] chest!</span>", "<span class='danger'><b>You choke up on a spray of blood from the blow to your chest!</b></span>")
victim.visible_message("<span class='danger'>[victim] chokes up a spray of blood from the blow to [victim.p_their()] chest!</span>", "<span class='danger'><b>You choke up on a spray of blood from the blow to your chest!</b></span>", vision_distance=COMBAT_MESSAGE_RANGE)
victim.bleed(blood_bled)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir)
victim.add_splatter_floor(get_step(victim.loc, victim.dir))
if(!(wounding_type in list(WOUND_SHARP, WOUND_BURN)) || !splinted || wound_bonus == CANT_WOUND)
return
splinted.take_damage(wounding_dmg, damage_type = (wounding_type == WOUND_SHARP ? BRUTE : BURN), sound_effect = FALSE)
if(QDELETED(splinted))
var/destroyed_verb = (wounding_type == WOUND_SHARP ? "torn" : "burned")
victim.visible_message("<span class='danger'>The splint securing [victim]'s [limb.name] is [destroyed_verb] away!</span>", "<span class='danger'><b>The splint securing your [limb.name] is [destroyed_verb] away!</b></span>", vision_distance=COMBAT_MESSAGE_RANGE)
splinted = null
treat_priority = TRUE
update_inefficiencies()
/datum/wound/brute/bone/get_examine_description(mob/user)
if(!splinted && !gelled && !taped)
/datum/wound/blunt/get_examine_description(mob/user)
if(!limb.current_gauze && !gelled && !taped)
return ..()
var/msg = ""
if(!splinted)
msg = "<B>[victim.p_their(TRUE)] [limb.name] [examine_desc]"
var/list/msg = list()
if(!limb.current_gauze)
msg += "[victim.p_their(TRUE)] [limb.name] [examine_desc]"
else
var/splint_condition = ""
var/sling_condition = ""
// how much life we have left in these bandages
switch(splinted.obj_integrity / splinted.max_integrity * 100)
switch(limb.current_gauze.obj_integrity / limb.current_gauze.max_integrity * 100)
if(0 to 25)
splint_condition = "just barely "
sling_condition = "just barely "
if(25 to 50)
splint_condition = "loosely "
sling_condition = "loosely "
if(50 to 75)
splint_condition = "mostly "
sling_condition = "mostly "
if(75 to INFINITY)
splint_condition = "tightly "
sling_condition = "tightly "
msg = "<B>[victim.p_their(TRUE)] [limb.name] is [splint_condition] fastened in a splint of [splinted.name]</B>"
msg += "[victim.p_their(TRUE)] [limb.name] is [sling_condition] fastened in a sling of [limb.current_gauze.name]"
if(taped)
msg += ", <span class='notice'>and appears to be reforming itself under some surgical tape!</span>"
@@ -166,58 +156,35 @@
msg += ", <span class='notice'>with fizzing flecks of blue bone gel sparking off the bone!</span>"
else
msg += "!"
return "[msg]</B>"
return "<B>[msg.Join()]</B>"
/*
New common procs for /datum/wound/brute/bone/
New common procs for /datum/wound/blunt/
*/
/datum/wound/brute/bone/proc/update_inefficiencies()
/datum/wound/blunt/proc/update_inefficiencies()
if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
if(splinted)
limp_slowdown = initial(limp_slowdown) * splinted.splint_factor
if(limb.current_gauze)
limp_slowdown = initial(limp_slowdown) * limb.current_gauze.splint_factor
else
limp_slowdown = initial(limp_slowdown)
victim.apply_status_effect(STATUS_EFFECT_LIMP)
else if(limb.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
if(splinted)
interaction_efficiency_penalty = 1 + ((interaction_efficiency_penalty - 1) * splinted.splint_factor)
if(limb.current_gauze)
interaction_efficiency_penalty = 1 + ((interaction_efficiency_penalty - 1) * limb.current_gauze.splint_factor)
else
interaction_efficiency_penalty = interaction_efficiency_penalty
if(initial(disabling) && splinted)
disabling = FALSE
else if(initial(disabling))
disabling = TRUE
if(initial(disabling))
disabling = !limb.current_gauze
limb.update_wounds()
/*
BEWARE OF REDUNDANCY AHEAD THAT I MUST PARE DOWN
*/
/datum/wound/brute/bone/proc/splint(obj/item/stack/I, mob/user)
if(splinted && splinted.splint_factor >= I.splint_factor)
to_chat(user, "<span class='warning'>The splint already on [user == victim ? "your" : "[victim]'s"] [limb.name] is better than you can do with [I].</span>")
return
user.visible_message("<span class='danger'>[user] begins splinting [victim]'s [limb.name] with [I].</span>", "<span class='warning'>You begin splinting [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists)))
return
user.visible_message("<span class='green'>[user] finishes splinting [victim]'s [limb.name]!</span>", "<span class='green'>You finish splinting [user == victim ? "your" : "[victim]'s"] [limb.name]!</span>")
treat_priority = FALSE
splinted = new I.type(limb)
splinted.amount = 1
I.use(1)
update_inefficiencies()
/*
Moderate (Joint Dislocation)
*/
/datum/wound/brute/bone/moderate
/datum/wound/blunt/moderate
name = "Joint Dislocation"
desc = "Patient's bone has been unset from socket, causing pain and reduced motor function."
treat_text = "Recommended application of bonesetter to affected limb, though manual relocation by applying an aggressive grab to the patient and helpfully interacting with afflicted limb may suffice."
@@ -226,19 +193,20 @@
severity = WOUND_SEVERITY_MODERATE
viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
interaction_efficiency_penalty = 1.5
limp_slowdown = 3
threshold_minimum = 35
limp_slowdown = 1.5
threshold_minimum = 45
threshold_penalty = 15
treatable_tool = TOOL_BONESET
status_effect_type = /datum/status_effect/wound/bone/moderate
scarring_descriptions = list("light discoloring", "a slight blue tint")
wound_flags = (BONE_WOUND)
status_effect_type = /datum/status_effect/wound/blunt/moderate
scar_keyword = "bluntmoderate"
/datum/wound/brute/bone/moderate/crush()
/datum/wound/blunt/moderate/crush()
if(prob(33))
victim.visible_message("<span class='danger'>[victim]'s dislocated [limb.name] pops back into place!</span>", "<span class='userdanger'>Your dislocated [limb.name] pops back into place! Ow!</span>")
remove_wound()
/datum/wound/brute/bone/moderate/try_handling(mob/living/carbon/human/user)
/datum/wound/blunt/moderate/try_handling(mob/living/carbon/human/user)
if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB)
return FALSE
@@ -256,7 +224,7 @@
return TRUE
/// If someone is snapping our dislocated joint back into place by hand with an aggro grab and help intent
/datum/wound/brute/bone/moderate/proc/chiropractice(mob/living/carbon/human/user)
/datum/wound/blunt/moderate/proc/chiropractice(mob/living/carbon/human/user)
var/time = base_treat_time
if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
@@ -275,7 +243,7 @@
chiropractice(user)
/// If someone is snapping our dislocated joint into a fracture by hand with an aggro grab and harm or disarm intent
/datum/wound/brute/bone/moderate/proc/malpractice(mob/living/carbon/human/user)
/datum/wound/blunt/moderate/proc/malpractice(mob/living/carbon/human/user)
var/time = base_treat_time
if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
@@ -293,7 +261,7 @@
malpractice(user)
/datum/wound/brute/bone/moderate/treat(obj/item/I, mob/user)
/datum/wound/blunt/moderate/treat(obj/item/I, mob/user)
if(victim == user)
victim.visible_message("<span class='danger'>[user] begins resetting [victim.p_their()] [limb.name] with [I].</span>", "<span class='warning'>You begin resetting your [limb.name] with [I]...</span>")
else
@@ -317,56 +285,57 @@
Severe (Hairline Fracture)
*/
/datum/wound/brute/bone/severe
/datum/wound/blunt/severe
name = "Hairline Fracture"
desc = "Patient's bone has suffered a crack in the foundation, causing serious pain and reduced limb functionality."
treat_text = "Recommended light surgical application of bone gel, though splinting will prevent worsening situation."
examine_desc = "appears bruised and grotesquely swollen"
treat_text = "Recommended light surgical application of bone gel, though a sling of medical gauze will prevent worsening situation."
examine_desc = "appears grotesquely swollen, its attachment weakened"
occur_text = "sprays chips of bone and develops a nasty looking bruise"
severity = WOUND_SEVERITY_SEVERE
interaction_efficiency_penalty = 2
limp_slowdown = 6
threshold_minimum = 60
limp_slowdown = 4
threshold_minimum = 70
threshold_penalty = 30
treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/gauze, /obj/item/stack/medical/bone_gel)
status_effect_type = /datum/status_effect/wound/bone/severe
treat_priority = TRUE
scarring_descriptions = list("a faded, fist-sized bruise", "a vaguely triangular peel scar")
treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel)
status_effect_type = /datum/status_effect/wound/blunt/severe
scar_keyword = "bluntsevere"
brain_trauma_group = BRAIN_TRAUMA_MILD
trauma_cycle_cooldown = 1.5 MINUTES
chance_internal_bleeding = 40
internal_bleeding_chance = 40
wound_flags = (BONE_WOUND | ACCEPTS_GAUZE | MANGLES_BONE)
/datum/wound/brute/bone/critical
/datum/wound/blunt/critical
name = "Compound Fracture"
desc = "Patient's bones have suffered multiple gruesome fractures, causing significant pain and near uselessness of limb."
treat_text = "Immediate binding of affected limb, followed by surgical intervention ASAP."
examine_desc = "has a cracked bone sticking out of it"
examine_desc = "is mangled and pulped, seemingly held together by tissue alone"
occur_text = "cracks apart, exposing broken bones to open air"
severity = WOUND_SEVERITY_CRITICAL
interaction_efficiency_penalty = 4
limp_slowdown = 9
sound_effect = 'sound/effects/crack2.ogg'
threshold_minimum = 115
limp_slowdown = 6
sound_effect = 'sound/effects/wounds/crack2.ogg'
threshold_minimum = 125
threshold_penalty = 50
disabling = TRUE
treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/gauze, /obj/item/stack/medical/bone_gel)
status_effect_type = /datum/status_effect/wound/bone/critical
treat_priority = TRUE
scarring_descriptions = list("a section of janky skin lines and badly healed scars", "a large patch of uneven skin tone", "a cluster of calluses")
treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel)
status_effect_type = /datum/status_effect/wound/blunt/critical
scar_keyword = "bluntcritical"
brain_trauma_group = BRAIN_TRAUMA_SEVERE
trauma_cycle_cooldown = 2.5 MINUTES
chance_internal_bleeding = 60
internal_bleeding_chance = 60
wound_flags = (BONE_WOUND | ACCEPTS_GAUZE | MANGLES_BONE)
// doesn't make much sense for "a" bone to stick out of your head
/datum/wound/brute/bone/critical/apply_wound(obj/item/bodypart/L, silent, datum/wound/old_wound, smited)
/datum/wound/blunt/critical/apply_wound(obj/item/bodypart/L, silent, datum/wound/old_wound, smited)
if(L.body_zone == BODY_ZONE_HEAD)
occur_text = "splits open, exposing a bare, cracked skull through the flesh and blood"
examine_desc = "has an unsettling indent, with bits of skull poking out"
. = ..()
/// if someone is using bone gel on our wound
/datum/wound/brute/bone/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user)
/datum/wound/blunt/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user)
if(gelled)
to_chat(user, "<span class='warning'>[user == victim ? "Your" : "[victim]'s"] [limb.name] is already coated with bone gel!</span>")
return
@@ -385,12 +354,12 @@
var/painkiller_bonus = 0
if(victim.drunkenness)
painkiller_bonus += 5
if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/medicine/morphine))
if(victim.reagents?.has_reagent(/datum/reagent/medicine/morphine))
painkiller_bonus += 10
if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/determination))
if(victim.reagents?.has_reagent(/datum/reagent/determination))
painkiller_bonus += 5
if(prob(25 + (20 * (severity - 2)) - painkiller_bonus)) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by painkillers
if(prob(25 + (20 * severity - 2) - painkiller_bonus)) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by painkillers
victim.visible_message("<span class='danger'>[victim] fails to finish applying [I] to [victim.p_their()] [limb.name], passing out from the pain!</span>", "<span class='notice'>You black out from the pain of applying [I] to your [limb.name] before you can finish!</span>")
victim.AdjustUnconscious(5 SECONDS)
return
@@ -401,7 +370,7 @@
gelled = TRUE
/// if someone is using surgical tape on our wound
/datum/wound/brute/bone/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user)
/datum/wound/blunt/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user)
if(!gelled)
to_chat(user, "<span class='warning'>[user == victim ? "Your" : "[victim]'s"] [limb.name] must be coated with bone gel to perform this emergency operation!</span>")
return
@@ -426,15 +395,13 @@
taped = TRUE
processes = TRUE
/datum/wound/brute/bone/treat(obj/item/I, mob/user)
/datum/wound/blunt/treat(obj/item/I, mob/user)
if(istype(I, /obj/item/stack/medical/bone_gel))
gel(I, user)
else if(istype(I, /obj/item/stack/sticky_tape/surgical))
tape(I, user)
else if(istype(I, /obj/item/stack/medical/gauze))
splint(I, user)
/datum/wound/brute/bone/get_scanner_description(mob/user)
/datum/wound/blunt/get_scanner_description(mob/user)
. = ..()
. += "<div class='ml-3'>"
@@ -444,7 +411,7 @@
else if(!taped)
. += "<span class='notice'>Continue Alternative Treatment: Apply surgical tape directly to injured limb to begin bone regeneration. Note, this is both excruciatingly painful and slow.</span>\n"
else
. += "<span class='notice'>Note: Bone regeneration in effect. Bone is [round((regen_points_current*100)/regen_points_needed,0.1)]% regenerated.</span>\n"
. += "<span class='notice'>Note: Bone regeneration in effect. Bone is [round(regen_points_current*100/regen_points_needed)]% regenerated.</span>\n"
if(limb.body_zone == BODY_ZONE_HEAD)
. += "Cranial Trauma Detected: Patient will suffer random bouts of [severity == WOUND_SEVERITY_SEVERE ? "mild" : "severe"] brain traumas until bone is repaired."

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