@@ -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{
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -151,6 +151,7 @@
|
||||
id_tag = "syndie_listeningpost_external";
|
||||
req_access_txt = "150"
|
||||
},
|
||||
/obj/structure/fans/tiny,
|
||||
/turf/open/floor/plating,
|
||||
/area/ruin/space/has_grav/listeningstation)
|
||||
"aq" = (
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
@@ -13347,7 +13351,6 @@
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/structure/sink{
|
||||
dir = 1;
|
||||
pixel_y = 25
|
||||
},
|
||||
/obj/machinery/button/door{
|
||||
@@ -14233,7 +14236,6 @@
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/structure/sink{
|
||||
dir = 1;
|
||||
pixel_y = 25
|
||||
},
|
||||
/obj/machinery/button/door{
|
||||
@@ -21718,7 +21720,6 @@
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/structure/sink{
|
||||
dir = 1;
|
||||
pixel_y = 25
|
||||
},
|
||||
/obj/machinery/button/door{
|
||||
@@ -30891,7 +30892,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{
|
||||
@@ -53437,6 +53438,7 @@
|
||||
"dfh" = (
|
||||
/obj/machinery/power/apc{
|
||||
areastring = "/area/science/circuit";
|
||||
dir = 4;
|
||||
name = "Circuitry Lab APC";
|
||||
pixel_x = 30
|
||||
},
|
||||
@@ -53681,9 +53683,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
|
||||
@@ -53736,7 +53735,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,
|
||||
@@ -54365,7 +54364,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,
|
||||
@@ -54387,6 +54386,7 @@
|
||||
/obj/structure/chair/office/dark{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/landmark/start/atmospheric_technician,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"fMp" = (
|
||||
@@ -54522,19 +54522,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,
|
||||
@@ -54691,7 +54678,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,
|
||||
@@ -54776,7 +54763,6 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/sink{
|
||||
dir = 1;
|
||||
pixel_y = 25
|
||||
},
|
||||
/obj/structure/mirror{
|
||||
@@ -54928,7 +54914,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,
|
||||
@@ -57075,6 +57061,7 @@
|
||||
dir = 4;
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/clothing/head/hardhat/cakehat,
|
||||
/turf/open/floor/wood,
|
||||
/area/crew_quarters/bar)
|
||||
"oby" = (
|
||||
@@ -57198,7 +57185,6 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/sink{
|
||||
dir = 1;
|
||||
pixel_y = 25
|
||||
},
|
||||
/obj/structure/mirror{
|
||||
@@ -57290,7 +57276,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{
|
||||
@@ -57847,7 +57833,6 @@
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/structure/sink{
|
||||
dir = 1;
|
||||
pixel_y = 25
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
@@ -57910,7 +57895,6 @@
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/structure/sink{
|
||||
dir = 1;
|
||||
pixel_y = 25
|
||||
},
|
||||
/obj/machinery/light/small{
|
||||
@@ -58131,7 +58115,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
|
||||
@@ -58414,7 +58398,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{
|
||||
@@ -58671,9 +58655,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"
|
||||
@@ -58790,7 +58771,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{
|
||||
@@ -59013,7 +58994,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
|
||||
@@ -59426,7 +59407,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,
|
||||
@@ -60525,7 +60506,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{
|
||||
@@ -60673,7 +60654,6 @@
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/structure/sink{
|
||||
dir = 1;
|
||||
pixel_y = 25
|
||||
},
|
||||
/obj/machinery/button/door{
|
||||
@@ -66759,11 +66739,11 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
ghq
|
||||
xLX
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
ghq
|
||||
xLX
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -67010,9 +66990,9 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
ghq
|
||||
xLX
|
||||
aaa
|
||||
ghq
|
||||
xLX
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -67024,9 +67004,9 @@ gXs
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
ghq
|
||||
xLX
|
||||
aaa
|
||||
ghq
|
||||
xLX
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -76575,7 +76555,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -76832,7 +76812,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -77089,7 +77069,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -77346,7 +77326,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -77603,7 +77583,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -77860,7 +77840,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -78117,7 +78097,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aoV
|
||||
bZm
|
||||
@@ -78374,13 +78354,13 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aoV
|
||||
bVz
|
||||
aaf
|
||||
aaf
|
||||
sQX
|
||||
aoV
|
||||
aaa
|
||||
aaS
|
||||
aaf
|
||||
@@ -78631,7 +78611,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
bVz
|
||||
@@ -78888,7 +78868,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
gJi
|
||||
aaa
|
||||
aaf
|
||||
bVz
|
||||
@@ -79145,7 +79125,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
gJi
|
||||
aaa
|
||||
aaf
|
||||
bVz
|
||||
@@ -84195,7 +84175,7 @@ aaa
|
||||
aaa
|
||||
gXs
|
||||
gXs
|
||||
dVU
|
||||
aaH
|
||||
abc
|
||||
abu
|
||||
abu
|
||||
|
||||
@@ -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
|
||||
@@ -127072,6 +127111,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 +127356,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 +127844,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 +127925,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{
|
||||
@@ -181500,10 +181592,10 @@ cCl
|
||||
cWD
|
||||
cAz
|
||||
dac
|
||||
cxy
|
||||
aav
|
||||
aaz
|
||||
aaH
|
||||
yfK
|
||||
tqP
|
||||
ePP
|
||||
pQQ
|
||||
aaV
|
||||
aaN
|
||||
aaN
|
||||
|
||||
@@ -13176,6 +13176,9 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/decal/cleanable/blood/old,
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/security/courtroom)
|
||||
"avX" = (
|
||||
@@ -30472,6 +30475,7 @@
|
||||
/obj/machinery/light{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/airalarm/directional/north,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/science/research)
|
||||
"aXx" = (
|
||||
@@ -43673,10 +43677,6 @@
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/area/maintenance/central/secondary)
|
||||
"bsm" = (
|
||||
/obj/machinery/status_display/evac,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/supermatter)
|
||||
"bsn" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
@@ -57346,9 +57346,7 @@
|
||||
name = "landing marker";
|
||||
picked_color = "Burgundy"
|
||||
},
|
||||
/turf/open/floor/plating/airless{
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/hallway/secondary/entry)
|
||||
"bOe" = (
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{
|
||||
@@ -58566,9 +58564,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plating/airless{
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/hallway/secondary/entry)
|
||||
"bQb" = (
|
||||
/obj/structure/flora/rock,
|
||||
@@ -58931,7 +58927,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/power/apc{
|
||||
areastring = "/area/janitor";
|
||||
areastring = "/area/vacant_room/commissary";
|
||||
dir = 4;
|
||||
name = "Vacant Commissary APC";
|
||||
pixel_x = 27;
|
||||
@@ -61286,9 +61282,7 @@
|
||||
name = "landing marker";
|
||||
picked_color = "Burgundy"
|
||||
},
|
||||
/turf/open/floor/plating/airless{
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/hallway/secondary/entry)
|
||||
"bUk" = (
|
||||
/obj/effect/turf_decal/tile/red,
|
||||
@@ -61568,9 +61562,7 @@
|
||||
/turf/closed/wall,
|
||||
/area/engine/atmos)
|
||||
"bUN" = (
|
||||
/turf/open/floor/plating/airless{
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/hallway/secondary/entry)
|
||||
"bUP" = (
|
||||
/obj/machinery/door/airlock/external{
|
||||
@@ -62889,9 +62881,9 @@
|
||||
pixel_x = 24
|
||||
},
|
||||
/obj/machinery/button/electrochromatic{
|
||||
id = "!interrogation_room";
|
||||
pixel_x = 38;
|
||||
pixel_y = -5;
|
||||
id = "!interrogation_room"
|
||||
pixel_y = -5
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/security/warden)
|
||||
@@ -67995,9 +67987,7 @@
|
||||
name = "landing marker";
|
||||
picked_color = "Burgundy"
|
||||
},
|
||||
/turf/open/floor/plating/airless{
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/hallway/secondary/entry)
|
||||
"ceV" = (
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
@@ -68022,18 +68012,14 @@
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plating/airless{
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/hallway/secondary/entry)
|
||||
"ceX" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plating/airless{
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/hallway/secondary/entry)
|
||||
"ceY" = (
|
||||
/obj/machinery/airalarm{
|
||||
@@ -68881,9 +68867,7 @@
|
||||
/area/engine/engineering)
|
||||
"cgI" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plating/airless{
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/hallway/secondary/entry)
|
||||
"cgJ" = (
|
||||
/obj/machinery/door/poddoor/preopen,
|
||||
@@ -80507,9 +80491,7 @@
|
||||
/area/maintenance/fore)
|
||||
"cDp" = (
|
||||
/obj/structure/lattice/catwalk,
|
||||
/turf/open/floor/plating/airless{
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/hallway/secondary/entry)
|
||||
"cDq" = (
|
||||
/obj/machinery/door/airlock/maintenance{
|
||||
@@ -80897,9 +80879,6 @@
|
||||
pixel_x = 4;
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/item/storage/pill_bottle/dice{
|
||||
pixel_x = -4
|
||||
},
|
||||
/obj/item/pen/red{
|
||||
pixel_x = 4;
|
||||
pixel_y = 4
|
||||
@@ -84679,9 +84658,6 @@
|
||||
},
|
||||
/area/security/vacantoffice)
|
||||
"fyr" = (
|
||||
/obj/machinery/light{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/decal/cleanable/cobweb/cobweb2,
|
||||
/turf/closed/mineral/random/labormineral,
|
||||
/area/space/nearstation)
|
||||
@@ -84924,9 +84900,7 @@
|
||||
"jAT" = (
|
||||
/obj/structure/lattice/catwalk,
|
||||
/obj/machinery/light,
|
||||
/turf/open/floor/plating/airless{
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/hallway/secondary/entry)
|
||||
"jHJ" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/general/visible{
|
||||
@@ -84938,10 +84912,6 @@
|
||||
/obj/structure/sign/warning/electricshock,
|
||||
/turf/closed/wall/r_wall/rust,
|
||||
/area/ai_monitored/turret_protected/ai_upload)
|
||||
"jPE" = (
|
||||
/obj/structure/cable,
|
||||
/turf/closed/mineral/random/labormineral,
|
||||
/area/space/nearstation)
|
||||
"jQY" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/paper_bin,
|
||||
@@ -85378,9 +85348,7 @@
|
||||
"rNm" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/lattice/catwalk,
|
||||
/turf/open/floor/plating/airless{
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/hallway/secondary/entry)
|
||||
"swG" = (
|
||||
/obj/item/reagent_containers/food/drinks/drinkingglass{
|
||||
@@ -119966,7 +119934,7 @@ ckw
|
||||
cmw
|
||||
xON
|
||||
axa
|
||||
jPE
|
||||
aeu
|
||||
aeu
|
||||
aeU
|
||||
dQe
|
||||
@@ -121750,7 +121718,7 @@ clM
|
||||
axW
|
||||
cnk
|
||||
coo
|
||||
ayn
|
||||
axU
|
||||
aLH
|
||||
aLx
|
||||
aLz
|
||||
@@ -122270,7 +122238,7 @@ aLF
|
||||
aag
|
||||
aag
|
||||
aag
|
||||
bsm
|
||||
aLF
|
||||
cuA
|
||||
cuW
|
||||
bYI
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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" = (
|
||||
@@ -55664,11 +55582,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 +57656,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 +57819,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 +57922,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,
|
||||
@@ -59532,14 +59444,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"
|
||||
@@ -60667,10 +60578,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 +61007,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 +61521,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 +61933,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 +75758,8 @@ aaa
|
||||
bGI
|
||||
bNs
|
||||
cfN
|
||||
cqW
|
||||
cqW
|
||||
cfN
|
||||
cfN
|
||||
cfN
|
||||
cfN
|
||||
bZY
|
||||
@@ -76379,7 +76271,7 @@ aaa
|
||||
aaa
|
||||
bGI
|
||||
bNs
|
||||
cqW
|
||||
cfN
|
||||
bOw
|
||||
cfN
|
||||
bOw
|
||||
@@ -80477,7 +80369,7 @@ aaa
|
||||
aht
|
||||
aqG
|
||||
bGE
|
||||
bKf
|
||||
cqW
|
||||
bKf
|
||||
bMw
|
||||
bNy
|
||||
@@ -80734,8 +80626,8 @@ aht
|
||||
aht
|
||||
aqG
|
||||
bGE
|
||||
bKf
|
||||
bKf
|
||||
izF
|
||||
ros
|
||||
bMx
|
||||
bNz
|
||||
bHM
|
||||
@@ -80991,7 +80883,7 @@ aaa
|
||||
aaa
|
||||
aqG
|
||||
bGE
|
||||
wDe
|
||||
bGE
|
||||
bHM
|
||||
bHM
|
||||
bNA
|
||||
@@ -97884,8 +97776,8 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
lcZ
|
||||
aoA
|
||||
apq
|
||||
apW
|
||||
apV
|
||||
apU
|
||||
aqQ
|
||||
arX
|
||||
@@ -98398,8 +98290,8 @@ aiT
|
||||
aiS
|
||||
aaa
|
||||
lcZ
|
||||
aoC
|
||||
aps
|
||||
apU
|
||||
apV
|
||||
apW
|
||||
aqS
|
||||
arZ
|
||||
@@ -107723,7 +107615,7 @@ aht
|
||||
bwm
|
||||
ikB
|
||||
iVJ
|
||||
izF
|
||||
lWy
|
||||
typ
|
||||
bwm
|
||||
aht
|
||||
@@ -108233,7 +108125,7 @@ bwm
|
||||
svN
|
||||
bIQ
|
||||
uek
|
||||
izF
|
||||
lWy
|
||||
bwm
|
||||
qnT
|
||||
lJr
|
||||
@@ -108488,9 +108380,9 @@ dMO
|
||||
lWy
|
||||
rxQ
|
||||
lWy
|
||||
ros
|
||||
izF
|
||||
izF
|
||||
bIQ
|
||||
lWy
|
||||
lWy
|
||||
mES
|
||||
lWy
|
||||
lWy
|
||||
@@ -108747,7 +108639,7 @@ bwm
|
||||
nzD
|
||||
uoj
|
||||
bwm
|
||||
izF
|
||||
lWy
|
||||
bwm
|
||||
dMI
|
||||
lWy
|
||||
@@ -109001,7 +108893,7 @@ bkF
|
||||
bwm
|
||||
bwm
|
||||
bwm
|
||||
ros
|
||||
bIQ
|
||||
bwm
|
||||
bwm
|
||||
bwm
|
||||
@@ -109258,8 +109150,8 @@ bkF
|
||||
qIO
|
||||
jXA
|
||||
bwm
|
||||
ros
|
||||
vpz
|
||||
bIQ
|
||||
hXt
|
||||
bwm
|
||||
aht
|
||||
bwm
|
||||
|
||||
+1285
-731
File diff suppressed because it is too large
Load Diff
+3391
-3518
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||
|
||||
@@ -138,14 +138,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
|
||||
#define MOBILITY_FLAGS_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_PICKUP | MOBILITY_USE | MOBILITY_UI | MOBILITY_STORAGE | MOBILITY_PULL | MOBILITY_RESIST)
|
||||
#define MOBILITY_FLAGS_ANY_INTERACTION (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_UI | MOBILITY_STORAGE)
|
||||
|
||||
// melee_attack_chain() attackchain_flags
|
||||
/// The attack is from a parry counterattack.
|
||||
#define ATTACKCHAIN_PARRY_COUNTERATTACK (1<<0)
|
||||
|
||||
// UnarmedAttack() flags
|
||||
/// Attack is from a parry counterattack
|
||||
#define UNARMED_ATTACK_PARRY (1<<0)
|
||||
|
||||
/// If the thing can reflect light (lasers/energy)
|
||||
#define RICOCHET_SHINY (1<<0)
|
||||
/// If the thing can reflect matter (bullets/bomb shrapnel)
|
||||
|
||||
@@ -52,4 +52,4 @@
|
||||
#define ORGAN_VITAL (1<<4) //Currently only the brain
|
||||
#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances
|
||||
#define ORGAN_NO_DISMEMBERMENT (1<<6) //Immune to disembowelment.
|
||||
#define ORGAN_EDIBLE (1<<5) //is a snack? :D
|
||||
#define ORGAN_EDIBLE (1<<7) //is a snack? :D
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/////////// ATTACKCHAIN_FLAGS ////////////
|
||||
// melee_attack_chain(), attackby(), pre_attack(), afterattack(), and tool_act(), attack() and **anything that is called by ClickOn()** return values.
|
||||
// These are all passed down through the attack chain and are binary OR'd into each other!
|
||||
/// Stop the attack chain if still in melee_attack_chain()
|
||||
#define STOP_ATTACK_PROC_CHAIN (1<<0)
|
||||
/// This attack should discard last_action instead of flushing (storing) it). You should probably know what you're doing if you use this considering this is how clickdelay is enforced.
|
||||
#define DISCARD_LAST_ACTION (1<<1)
|
||||
/// There are a number of "safety nets" intended to default-handle clickdelay. Return this flag to bypass ALL of them. Be sure
|
||||
/// you know EXACTLY what you are doing!
|
||||
#define NO_AUTO_CLICKDELAY_HANDLING (1<<2)
|
||||
/// Only used with UnarmedAttack(). Interrupts unarmed attack from progressing.
|
||||
#define INTERRUPT_UNARMED_ATTACK (1<<3)
|
||||
/// Attack should not set next action even if the atom wants it to be an action
|
||||
#define ATTACK_IGNORE_ACTION (1<<4)
|
||||
/// Attack should not at all check last_action/attack_hand_speed even if the atom wants to
|
||||
#define ATTACK_IGNORE_CLICKDELAY (1<<5)
|
||||
/// This attack is from a parry counterattack
|
||||
#define ATTACK_IS_PARRY_COUNTERATTACK (1<<6)
|
||||
|
||||
// obj/item/dropped()
|
||||
/// dropped() relocated this item, return FALSE for doUnEquip.
|
||||
#define ITEM_RELOCATED_BY_DROPPED "relocated_by_dropped"
|
||||
@@ -74,11 +74,13 @@
|
||||
#define ADMIN_PUNISHMENT_MAZING "Puzzle"
|
||||
#define ADMIN_PUNISHMENT_PIE "Cream Pie"
|
||||
#define ADMIN_PUNISHMENT_CUSTOM_PIE "Custom Cream Pie"
|
||||
#define ADMIN_PUNISHMENT_SHOES "Knot Shoes"
|
||||
#define ADMIN_PUNISHMENT_CRACK ":B:oneless"
|
||||
#define ADMIN_PUNISHMENT_BLEED ":B:loodless"
|
||||
#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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -108,7 +108,6 @@
|
||||
#define CLICK_CD_RANGE 4
|
||||
#define CLICK_CD_RAPID 2
|
||||
#define CLICK_CD_CLICK_ABILITY 6
|
||||
#define CLICK_CD_BREAKOUT 100
|
||||
#define CLICK_CD_HANDCUFFED 10
|
||||
#define CLICK_CD_RESIST 20
|
||||
#define CLICK_CD_GRABBING 10
|
||||
@@ -155,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)))
|
||||
@@ -209,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.
|
||||
@@ -281,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
|
||||
|
||||
|
||||
@@ -356,8 +356,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 +452,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
|
||||
|
||||
@@ -65,9 +65,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
|
||||
#define isslimeperson(A) (is_species(A, /datum/species/jelly/slime))
|
||||
#define isluminescent(A) (is_species(A, /datum/species/jelly/luminescent))
|
||||
#define iszombie(A) (is_species(A, /datum/species/zombie))
|
||||
#define ismoth(A) (is_species(A, /datum/species/insect))
|
||||
#define ishumanbasic(A) (is_species(A, /datum/species/human))
|
||||
#define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid) )
|
||||
#define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid))
|
||||
#define isdwarf(A) (is_species(A, /datum/species/dwarf))
|
||||
#define isdullahan(A) (is_species(A, /datum/species/dullahan))
|
||||
#define isangel(A) (is_species(A, /datum/species/angel))
|
||||
@@ -80,8 +79,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
|
||||
#define isipcperson(A) (is_species(A, /datum/species/ipc))
|
||||
#define issynthliz(A) (is_species(A, /datum/species/synthliz))
|
||||
#define ismammal(A) (is_species(A, /datum/species/mammal))
|
||||
#define isavian(A) (is_species(A, /datum/species/avian))
|
||||
#define isaquatic(A) (is_species(A, /datum/species/aquatic))
|
||||
#define isinsect(A) (is_species(A, /datum/species/insect))
|
||||
#define isxenoperson(A) (is_species(A, /datum/species/xeno))
|
||||
#define isstartjelly(A) (is_species(A, /datum/species/jelly/roundstartslime))
|
||||
@@ -202,14 +199,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))
|
||||
|
||||
@@ -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"
|
||||
@@ -434,6 +434,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.
|
||||
@@ -535,4 +538,9 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
|
||||
#define LOOT_RESTRICTION_MIND_PILE 3 //limited to the current pile.
|
||||
#define LOOT_RESTRICTION_CKEY_PILE 4 //Idem
|
||||
|
||||
//stages of shoe tying-ness
|
||||
#define SHOES_UNTIED 0
|
||||
#define SHOES_TIED 1
|
||||
#define SHOES_KNOTTED 2
|
||||
|
||||
#define WANTED_FILE "wanted_message.json"
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
// obj/item/dropped
|
||||
/// dropped() relocated this item, return FALSE for doUnEquip.
|
||||
#define ITEM_RELOCATED_BY_DROPPED "relocated_by_dropped"
|
||||
@@ -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"
|
||||
|
||||
@@ -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 //
|
||||
/////////////
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -107,6 +107,7 @@
|
||||
#define FIRE_PRIORITY_INSTRUMENTS 30
|
||||
#define FIRE_PRIORITY_FIELDS 30
|
||||
#define FIRE_PRIOTITY_SMOOTHING 35
|
||||
#define FIRE_PRIORITY_HUDS 40
|
||||
#define FIRE_PRIORITY_NETWORKS 40
|
||||
#define FIRE_PRIORITY_OBJ 40
|
||||
#define FIRE_PRIORITY_ACID 40
|
||||
|
||||
+95
-19
@@ -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)
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
var/target_loc = target.loc
|
||||
|
||||
LAZYADD(user.do_afters, target)
|
||||
LAZYADD(target.targeted_by, user)
|
||||
|
||||
var/holding = user.get_active_held_item()
|
||||
var/datum/progressbar/progbar
|
||||
@@ -189,6 +190,10 @@
|
||||
. = FALSE
|
||||
break
|
||||
|
||||
if(!(target in user.do_afters))
|
||||
. = FALSE
|
||||
break
|
||||
|
||||
if(drifting && !user.inertia_dir)
|
||||
drifting = 0
|
||||
user_loc = user.loc
|
||||
@@ -198,12 +203,14 @@
|
||||
break
|
||||
if(progress)
|
||||
qdel(progbar)
|
||||
|
||||
if(!QDELETED(target))
|
||||
LAZYREMOVE(user.do_afters, target)
|
||||
LAZYREMOVE(target.targeted_by, user)
|
||||
|
||||
//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action
|
||||
/mob/proc/break_do_after_checks(list/checked_health, check_clicks)
|
||||
if(check_clicks && next_move > world.time)
|
||||
if(check_clicks && !CheckActionCooldown())
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -224,6 +231,7 @@
|
||||
|
||||
if(target)
|
||||
LAZYADD(user.do_afters, target)
|
||||
LAZYADD(target.targeted_by, user)
|
||||
|
||||
var/atom/Uloc = user.loc
|
||||
|
||||
@@ -288,6 +296,10 @@
|
||||
if(!QDELETED(target))
|
||||
LAZYREMOVE(user.do_afters, target)
|
||||
|
||||
if(!QDELETED(target))
|
||||
LAZYREMOVE(user.do_afters, target)
|
||||
LAZYREMOVE(target.targeted_by, user)
|
||||
|
||||
/mob/proc/do_after_coefficent() // This gets added to the delay on a do_after, default 1
|
||||
. = 1
|
||||
return
|
||||
@@ -307,6 +319,7 @@
|
||||
for(var/atom/target in targets)
|
||||
originalloc[target] = target.loc
|
||||
LAZYADD(user.do_afters, target)
|
||||
LAZYADD(target.targeted_by, user)
|
||||
|
||||
var/holding = user.get_active_held_item()
|
||||
var/datum/progressbar/progbar
|
||||
@@ -341,3 +354,4 @@
|
||||
var/atom/target = thing
|
||||
if(!QDELETED(target))
|
||||
LAZYREMOVE(user.do_afters, target)
|
||||
LAZYREMOVE(target.targeted_by, user)
|
||||
|
||||
@@ -145,9 +145,9 @@
|
||||
continue
|
||||
if(!S.ckeys_allowed)
|
||||
snowflake_ipc_antenna_list[S.name] = mspath
|
||||
var/color1 = random_short_color()
|
||||
var/color2 = random_short_color()
|
||||
var/color3 = random_short_color()
|
||||
var/color1 = random_color()
|
||||
var/color2 = random_color()
|
||||
var/color3 = random_color()
|
||||
|
||||
var/body_model = MALE
|
||||
switch(intended_gender)
|
||||
|
||||
@@ -51,40 +51,111 @@
|
||||
return default
|
||||
return default
|
||||
|
||||
/proc/sanitize_hexcolor(color, desired_format=3, include_crunch=0, default)
|
||||
#define RGB_FORMAT_INVALID 0
|
||||
#define RGB_FORMAT_SHORT 1
|
||||
#define RGB_FORMAT_LONG 2
|
||||
|
||||
/**
|
||||
* Sanitizes a hexadecimal color. Always outputs lowercase.
|
||||
*
|
||||
* @params
|
||||
* * color - input color, 3 or 6 characters without the #.
|
||||
* * desired_format - 3 or 6 characters without the potential #. can only put in 3 or 6 here.
|
||||
* * include_crunch - do we put a # at the start
|
||||
* * default - default color. must be 3 or 6 characters with or without #.
|
||||
* * default_replacement - what we replace broken letters with.
|
||||
*/
|
||||
/proc/sanitize_hexcolor(color, desired_format = 3, include_crunch = 0, default = rgb(218, 72, 255), default_replacement = "f")
|
||||
if(!istext(default) || (length(default) < 3))
|
||||
CRASH("Default should be a text string of RGB format, with or without the crunch, 3 or 6 characters. Default was instead [default]")
|
||||
if(!istext(default_replacement) || (length(default_replacement) != 1))
|
||||
CRASH("Invalid default_replacement: [default_replacement]")
|
||||
default_replacement = lowertext(default_replacement)
|
||||
switch(text2ascii(default_replacement))
|
||||
if(48 to 57)
|
||||
if(97 to 102)
|
||||
if(65 to 70)
|
||||
else // yeah yeah i know 3 empty if's..
|
||||
CRASH("Invalid default_replacement: [default_replacement]")
|
||||
var/crunch = include_crunch ? "#" : ""
|
||||
if(!istext(color))
|
||||
color = ""
|
||||
color = default
|
||||
|
||||
var/start = 1 + (text2ascii(color, 1) == 35)
|
||||
var/len = length(color)
|
||||
var/char = ""
|
||||
// RRGGBB -> RGB but awful
|
||||
var/convert_to_shorthand = desired_format == 3 && length_char(color) > 3
|
||||
// get rid of crunch
|
||||
if(len && color[1] == "#")
|
||||
if(len >= 2)
|
||||
color = copytext(color, 2)
|
||||
else
|
||||
color = ""
|
||||
len = length(color)
|
||||
|
||||
. = ""
|
||||
var/i = start
|
||||
while(i <= len)
|
||||
switch(desired_format)
|
||||
if(3)
|
||||
desired_format = RGB_FORMAT_SHORT
|
||||
if(6)
|
||||
desired_format = RGB_FORMAT_LONG
|
||||
else
|
||||
CRASH("Invalid desired_format: [desired_format]. Must be 3 or 6.")
|
||||
var/current_format = RGB_FORMAT_INVALID
|
||||
switch(length(color))
|
||||
if(3)
|
||||
current_format = RGB_FORMAT_SHORT
|
||||
if(6)
|
||||
current_format = RGB_FORMAT_LONG
|
||||
else
|
||||
current_format = RGB_FORMAT_INVALID
|
||||
|
||||
if(current_format == RGB_FORMAT_INVALID) // nah
|
||||
color = default // process default
|
||||
if(color[1] == "#") // we checked default was at least 3 chars long earlier
|
||||
color = copytext(color, 2)
|
||||
len = length(color)
|
||||
switch(len)
|
||||
if(3)
|
||||
current_format = RGB_FORMAT_SHORT
|
||||
if(6)
|
||||
current_format = RGB_FORMAT_LONG
|
||||
else
|
||||
CRASH("Default was not 3 or 6 RGB hexadecimal characters: [default]")
|
||||
|
||||
var/sanitized = ""
|
||||
var/char = ""
|
||||
// first, sanitize hex
|
||||
for(var/i in 1 to len)
|
||||
char = color[i]
|
||||
switch(text2ascii(char))
|
||||
if(48 to 57) //numbers 0 to 9
|
||||
. += char
|
||||
if(97 to 102) //letters a to f
|
||||
. += char
|
||||
if(65 to 70) //letters A to F
|
||||
. += lowertext(char)
|
||||
if(48 to 57) // 0 to 9
|
||||
sanitized += char
|
||||
if(97 to 102) // a to f
|
||||
sanitized += char
|
||||
if(65 to 70) // A to F (capitalized!)
|
||||
sanitized += lowertext(char)
|
||||
else
|
||||
break
|
||||
i += length(char)
|
||||
if(convert_to_shorthand && i <= len) //skip next one
|
||||
i += length(color[i])
|
||||
sanitized += default_replacement
|
||||
// do we need to convert?
|
||||
if(desired_format == current_format)
|
||||
return crunch + sanitized // no
|
||||
// yes
|
||||
if((desired_format == RGB_FORMAT_SHORT) && (current_format == RGB_FORMAT_LONG)) // downconvert
|
||||
var/temp = ""
|
||||
// we could do some math but we're lazy and in practice floor()ing this.
|
||||
for(var/i in 1 to 6 step 2)
|
||||
temp += sanitized[i]
|
||||
sanitized = temp
|
||||
else if((desired_format == RGB_FORMAT_LONG) && (current_format == RGB_FORMAT_SHORT)) // upconvert
|
||||
var/temp = ""
|
||||
for(var/i in 1 to 3)
|
||||
temp += sanitized[i]
|
||||
temp += sanitized[i]
|
||||
sanitized = temp
|
||||
else
|
||||
CRASH("Invalid desired_format and current_format pair: [desired_format], [current_format]. Could not determine which way to convert.")
|
||||
return crunch + sanitized
|
||||
|
||||
if(length_char(.) != desired_format)
|
||||
if(default)
|
||||
return default
|
||||
return crunch + repeat_string(desired_format, "0")
|
||||
|
||||
return crunch + .
|
||||
#undef RGB_FORMAT_INVALID
|
||||
#undef RGB_FORMAT_SHORT
|
||||
#undef RGB_FORMAT_LONG
|
||||
|
||||
/proc/sanitize_ooccolor(color)
|
||||
if(length(color) != length_char(color))
|
||||
|
||||
+17
-1
@@ -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
|
||||
@@ -811,4 +827,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
|
||||
))
|
||||
+4
-8
@@ -19,10 +19,6 @@
|
||||
A.move_camera_by_click()
|
||||
|
||||
/mob/living/silicon/ai/ClickOn(var/atom/A, params)
|
||||
if(world.time <= next_click)
|
||||
return
|
||||
next_click = world.time + 1
|
||||
|
||||
if(!can_interact_with(A))
|
||||
return
|
||||
|
||||
@@ -74,16 +70,16 @@
|
||||
CtrlClickOn(A)
|
||||
return
|
||||
|
||||
if(world.time <= next_move)
|
||||
if(!CheckActionCooldown(immediate = TRUE))
|
||||
return
|
||||
|
||||
if(aicamera.in_camera_mode)
|
||||
aicamera.camera_mode_off()
|
||||
aicamera.captureimage(pixel_turf, usr)
|
||||
INVOKE_ASYNC(aicamera, /obj/item/camera.proc/captureimage, pixel_turf, usr)
|
||||
return
|
||||
if(waypoint_mode)
|
||||
waypoint_mode = 0
|
||||
set_waypoint(A)
|
||||
waypoint_mode = FALSE
|
||||
INVOKE_ASYNC(src, .proc/set_waypoint, A)
|
||||
return
|
||||
|
||||
A.attack_ai(src)
|
||||
|
||||
+55
-90
@@ -1,38 +1,3 @@
|
||||
/*
|
||||
Click code cleanup
|
||||
~Sayu
|
||||
*/
|
||||
|
||||
// 1 decisecond click delay (above and beyond mob/next_move)
|
||||
//This is mainly modified by click code, to modify click delays elsewhere, use next_move and changeNext_move()
|
||||
/mob/var/next_click = 0
|
||||
|
||||
// THESE DO NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK
|
||||
/mob/var/next_move_adjust = 0 //Amount to adjust action/click delays by, + or -
|
||||
/mob/var/next_move_modifier = 1 //Value to multiply action/click delays by
|
||||
|
||||
|
||||
//Delays the mob's next click/action by num deciseconds
|
||||
// eg: 10-3 = 7 deciseconds of delay
|
||||
// eg: 10*0.5 = 5 deciseconds of delay
|
||||
// DOES NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK
|
||||
|
||||
/mob/proc/timeToNextMove()
|
||||
return max(0, next_move - world.time)
|
||||
|
||||
/mob/proc/changeNext_move(num)
|
||||
next_move = world.time + ((num+next_move_adjust)*next_move_modifier)
|
||||
|
||||
/mob/living/changeNext_move(num)
|
||||
last_click_move = next_move
|
||||
var/mod = next_move_modifier
|
||||
var/adj = next_move_adjust
|
||||
for(var/i in status_effects)
|
||||
var/datum/status_effect/S = i
|
||||
mod *= S.nextmove_modifier()
|
||||
adj += S.nextmove_adjust()
|
||||
next_move = world.time + ((num + adj)*mod)
|
||||
|
||||
/*
|
||||
Before anything else, defer these calls to a per-mobtype handler. This allows us to
|
||||
remove istype() spaghetti code, but requires the addition of other handler procs to simplify it.
|
||||
@@ -45,7 +10,7 @@
|
||||
/atom/Click(location,control,params)
|
||||
if(flags_1 & INITIALIZED_1)
|
||||
SEND_SIGNAL(src, COMSIG_CLICK, location, control, params, usr)
|
||||
usr.ClickOn(src, params)
|
||||
usr.CommonClickOn(src, params)
|
||||
|
||||
/atom/DblClick(location,control,params)
|
||||
if(flags_1 & INITIALIZED_1)
|
||||
@@ -55,6 +20,21 @@
|
||||
if(flags_1 & INITIALIZED_1)
|
||||
usr.MouseWheelOn(src, delta_x, delta_y, params)
|
||||
|
||||
/**
|
||||
* Common mob click code
|
||||
*/
|
||||
/mob/proc/CommonClickOn(atom/A, params)
|
||||
SHOULD_NOT_SLEEP(TRUE)
|
||||
if(mob_transforming)
|
||||
return
|
||||
if(SEND_SIGNAL(src, COMSIG_MOB_CLICKON, A, params) & COMSIG_MOB_CANCEL_CLICKON)
|
||||
return
|
||||
. = ClickOn(A, params)
|
||||
if(!(. & DISCARD_LAST_ACTION))
|
||||
FlushCurrentAction()
|
||||
else
|
||||
DiscardCurrentAction()
|
||||
|
||||
/*
|
||||
Standard mob ClickOn()
|
||||
Handles exceptions: Buildmode, middle click, modified clicks, mech actions
|
||||
@@ -68,50 +48,34 @@
|
||||
* item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent
|
||||
* mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed
|
||||
*/
|
||||
/mob/proc/ClickOn( atom/A, params )
|
||||
if(world.time <= next_click)
|
||||
return
|
||||
next_click = world.time + world.tick_lag
|
||||
|
||||
/mob/proc/ClickOn(atom/A, params)
|
||||
SHOULD_NOT_SLEEP(TRUE)
|
||||
if(check_click_intercept(params,A))
|
||||
return
|
||||
|
||||
if(mob_transforming)
|
||||
return
|
||||
|
||||
if(SEND_SIGNAL(src, COMSIG_MOB_CLICKON, A, params) & COMSIG_MOB_CANCEL_CLICKON)
|
||||
return
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["shift"] && modifiers["middle"])
|
||||
ShiftMiddleClickOn(A)
|
||||
return
|
||||
return ShiftMiddleClickOn(A)
|
||||
if(modifiers["shift"] && modifiers["ctrl"])
|
||||
CtrlShiftClickOn(A)
|
||||
return
|
||||
return CtrlShiftClickOn(A)
|
||||
if(modifiers["middle"])
|
||||
MiddleClickOn(A)
|
||||
return
|
||||
return MiddleClickOn(A)
|
||||
if(modifiers["shift"] && (client && client.show_popup_menus || modifiers["right"])) //CIT CHANGE - makes shift-click examine use right click instead of left click in combat mode
|
||||
ShiftClickOn(A)
|
||||
return
|
||||
return ShiftClickOn(A)
|
||||
if(modifiers["alt"]) // alt and alt-gr (rightalt)
|
||||
AltClickOn(A)
|
||||
return
|
||||
return AltClickOn(A)
|
||||
if(modifiers["ctrl"])
|
||||
CtrlClickOn(A)
|
||||
return
|
||||
return CtrlClickOn(A)
|
||||
|
||||
if(modifiers["right"]) //CIT CHANGE - allows right clicking to perform actions
|
||||
RightClickOn(A,params) //CIT CHANGE - ditto
|
||||
return //CIT CHANGE - ditto
|
||||
return RightClickOn(A, params) //CIT CHANGE - ditto
|
||||
|
||||
if(incapacitated(ignore_restraints = 1))
|
||||
return
|
||||
|
||||
face_atom(A)
|
||||
|
||||
if(next_move > world.time) // in the year 2000...
|
||||
if(!CheckActionCooldown(immediate = TRUE))
|
||||
return
|
||||
|
||||
if(!modifiers["catcher"] && A.IsObscured())
|
||||
@@ -119,12 +83,12 @@
|
||||
|
||||
if(ismecha(loc))
|
||||
var/obj/mecha/M = loc
|
||||
return M.click_action(A,src,params)
|
||||
M.click_action(A,src,params)
|
||||
return TRUE
|
||||
|
||||
if(restrained())
|
||||
changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow
|
||||
RestrainedClickOn(A)
|
||||
return
|
||||
DelayNextAction(CLICK_CD_HANDCUFFED)
|
||||
return RestrainedClickOn(A)
|
||||
|
||||
if(in_throw_mode)
|
||||
throw_item(A)
|
||||
@@ -141,12 +105,12 @@
|
||||
//User itself, current loc, and user inventory
|
||||
if(A in DirectAccess())
|
||||
if(W)
|
||||
W.melee_attack_chain(src, A, params)
|
||||
return W.melee_attack_chain(src, A, params)
|
||||
else
|
||||
if(ismob(A))
|
||||
changeNext_move(CLICK_CD_MELEE)
|
||||
UnarmedAttack(A)
|
||||
return
|
||||
. = UnarmedAttack(A, TRUE, a_intent)
|
||||
if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
|
||||
DelayNextAction(CLICK_CD_MELEE)
|
||||
return
|
||||
|
||||
//Can't reach anything else in lockers or other weirdness
|
||||
if(!loc.AllowClick())
|
||||
@@ -155,16 +119,17 @@
|
||||
//Standard reach turf to turf or reaching inside storage
|
||||
if(CanReach(A,W))
|
||||
if(W)
|
||||
W.melee_attack_chain(src, A, params)
|
||||
return W.melee_attack_chain(src, A, params)
|
||||
else
|
||||
if(ismob(A))
|
||||
changeNext_move(CLICK_CD_MELEE)
|
||||
UnarmedAttack(A, 1)
|
||||
. = UnarmedAttack(A, TRUE, a_intent)
|
||||
if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
|
||||
DelayNextAction(CLICK_CD_MELEE)
|
||||
return
|
||||
else
|
||||
if(W)
|
||||
W.ranged_attack_chain(src, A, params)
|
||||
return W.ranged_attack_chain(src, A, params)
|
||||
else
|
||||
RangedAttack(A,params)
|
||||
return RangedAttack(A,params)
|
||||
|
||||
//Is the atom obscured by a PREVENT_CLICK_UNDER_1 object above it
|
||||
/atom/proc/IsObscured()
|
||||
@@ -270,8 +235,6 @@
|
||||
in human click code to allow glove touches only at melee range.
|
||||
*/
|
||||
/mob/proc/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
|
||||
if(ismob(A))
|
||||
changeNext_move(CLICK_CD_MELEE)
|
||||
|
||||
/*
|
||||
Ranged unarmed attack:
|
||||
@@ -304,7 +267,6 @@
|
||||
var/datum/antagonist/changeling/C = mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
if(C && C.chosen_sting)
|
||||
C.chosen_sting.try_to_sting(src,A)
|
||||
next_click = world.time + 5
|
||||
return
|
||||
swap_hand()
|
||||
|
||||
@@ -337,24 +299,24 @@
|
||||
*/
|
||||
|
||||
/mob/proc/CtrlClickOn(atom/A)
|
||||
A.CtrlClick(src)
|
||||
return
|
||||
return A.CtrlClick(src)
|
||||
|
||||
/atom/proc/CtrlClick(mob/user)
|
||||
SEND_SIGNAL(src, COMSIG_CLICK_CTRL, user)
|
||||
var/mob/living/ML = user
|
||||
if(istype(ML))
|
||||
ML.pulled(src)
|
||||
INVOKE_ASYNC(ML, /mob/living.verb/pulled, src)
|
||||
|
||||
/mob/living/carbon/human/CtrlClick(mob/user)
|
||||
if(ishuman(user) && Adjacent(user) && !user.incapacitated())
|
||||
if(world.time < user.next_move)
|
||||
if(!user.CheckActionCooldown())
|
||||
return FALSE
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.dna.species.grab(H, src, H.mind.martial_art)
|
||||
H.changeNext_move(CLICK_CD_MELEE)
|
||||
H.DelayNextAction(CLICK_CD_MELEE)
|
||||
return TRUE
|
||||
else
|
||||
..()
|
||||
return ..()
|
||||
/*
|
||||
Alt click
|
||||
Unused except for AI
|
||||
@@ -377,8 +339,8 @@
|
||||
var/datum/antagonist/changeling/C = mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
if(C && C.chosen_sting)
|
||||
C.chosen_sting.try_to_sting(src,A)
|
||||
next_click = world.time + 5
|
||||
return
|
||||
DelayNextAction(CLICK_CD_RANGE)
|
||||
return TRUE
|
||||
..()
|
||||
|
||||
/atom/proc/AltClick(mob/user)
|
||||
@@ -413,9 +375,11 @@
|
||||
return
|
||||
|
||||
/mob/living/LaserEyes(atom/A, params)
|
||||
changeNext_move(CLICK_CD_RANGE)
|
||||
if(!CheckActionCooldown(CLICK_CD_RANGE))
|
||||
return
|
||||
DelayNextAction()
|
||||
|
||||
var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam( loc )
|
||||
var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam(loc)
|
||||
LE.icon = 'icons/effects/genetics.dmi'
|
||||
LE.icon_state = "eyelasers"
|
||||
playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1)
|
||||
@@ -424,6 +388,7 @@
|
||||
LE.def_zone = get_organ_target()
|
||||
LE.preparePixelProjectile(A, src, params)
|
||||
LE.fire()
|
||||
return TRUE
|
||||
|
||||
// Simple helper to face what you clicked on, in case it should be needed in more than one place
|
||||
/mob/proc/face_atom(atom/A, ismousemovement = FALSE)
|
||||
|
||||
+17
-29
@@ -7,10 +7,6 @@
|
||||
*/
|
||||
|
||||
/mob/living/silicon/robot/ClickOn(var/atom/A, var/params)
|
||||
if(world.time <= next_click)
|
||||
return
|
||||
next_click = world.time + 1
|
||||
|
||||
if(check_click_intercept(params,A))
|
||||
return
|
||||
|
||||
@@ -19,25 +15,19 @@
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["shift"] && modifiers["ctrl"])
|
||||
CtrlShiftClickOn(A)
|
||||
return
|
||||
return CtrlShiftClickOn(A)
|
||||
if(modifiers["shift"] && modifiers["middle"])
|
||||
ShiftMiddleClickOn(A)
|
||||
return
|
||||
return ShiftMiddleClickOn(A)
|
||||
if(modifiers["middle"])
|
||||
MiddleClickOn(A)
|
||||
return
|
||||
return MiddleClickOn(A)
|
||||
if(modifiers["shift"])
|
||||
ShiftClickOn(A)
|
||||
return
|
||||
return ShiftClickOn(A)
|
||||
if(modifiers["alt"]) // alt and alt-gr (rightalt)
|
||||
AltClickOn(A)
|
||||
return
|
||||
return AltClickOn(A)
|
||||
if(modifiers["ctrl"])
|
||||
CtrlClickOn(A)
|
||||
return
|
||||
return CtrlClickOn(A)
|
||||
|
||||
if(next_move >= world.time)
|
||||
if(!CheckActionCooldown(immediate = TRUE))
|
||||
return
|
||||
|
||||
face_atom(A) // change direction to face what you clicked on
|
||||
@@ -50,7 +40,7 @@
|
||||
*/
|
||||
if(aicamera.in_camera_mode) //Cyborg picture taking
|
||||
aicamera.camera_mode_off()
|
||||
aicamera.captureimage(A, usr)
|
||||
INVOKE_ASYNC(aicamera, /obj/item/camera.proc/captureimage, A, usr)
|
||||
return
|
||||
|
||||
var/obj/item/W = get_active_held_item()
|
||||
@@ -58,13 +48,8 @@
|
||||
if(!W && A.Adjacent(src) && (isobj(A) || ismob(A)))
|
||||
var/atom/movable/C = A
|
||||
if(C.can_buckle && C.has_buckled_mobs())
|
||||
if(C.buckled_mobs.len > 1)
|
||||
var/unbuckled = input(src, "Who do you wish to unbuckle?","Unbuckle Who?") as null|mob in C.buckled_mobs
|
||||
if(C.user_unbuckle_mob(unbuckled,src))
|
||||
return
|
||||
else
|
||||
if(C.user_unbuckle_mob(C.buckled_mobs[1],src))
|
||||
return
|
||||
INVOKE_ASYNC(C, /atom/movable.proc/precise_user_unbuckle_mob, src)
|
||||
return
|
||||
|
||||
if(!W && (get_dist(src,A) <= interaction_range))
|
||||
A.attack_robot(src)
|
||||
@@ -81,7 +66,9 @@
|
||||
|
||||
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents)
|
||||
if(A == loc || (A in loc) || (A in contents))
|
||||
W.melee_attack_chain(src, A, params)
|
||||
. = W.melee_attack_chain(src, A, params)
|
||||
if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
|
||||
DelayNextAction(CLICK_CD_MELEE)
|
||||
return
|
||||
|
||||
if(!isturf(loc))
|
||||
@@ -90,11 +77,12 @@
|
||||
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc))
|
||||
if(isturf(A) || isturf(A.loc))
|
||||
if(A.Adjacent(src)) // see adjacent.dm
|
||||
W.melee_attack_chain(src, A, params)
|
||||
. = W.melee_attack_chain(src, A, params)
|
||||
if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
|
||||
DelayNextAction(CLICK_CD_MELEE)
|
||||
return
|
||||
else
|
||||
W.afterattack(A, src, 0, params)
|
||||
return
|
||||
return W.afterattack(A, src, 0, params)
|
||||
|
||||
//Middle click cycles through selected modules.
|
||||
/mob/living/silicon/robot/MiddleClickOn(atom/A)
|
||||
|
||||
@@ -168,6 +168,8 @@
|
||||
//UI position overrides for 1:1 screen layout. (default is 7:5)
|
||||
#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button
|
||||
#define ui_overridden_resist "EAST-3:24,SOUTH+1:7"
|
||||
#define ui_clickdelay "CENTER,SOUTH+1:-31"
|
||||
#define ui_resistdelay "EAST-3:24,SOUTH+1:4"
|
||||
#define ui_combat_toggle "EAST-4:22,SOUTH:5"
|
||||
|
||||
#define ui_boxcraft "EAST-4:22,SOUTH+1:6"
|
||||
|
||||
@@ -56,9 +56,6 @@
|
||||
if(id && usr.client) //try to (un)remember position
|
||||
usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = locked ? moved : null
|
||||
return TRUE
|
||||
if(usr.next_click > world.time)
|
||||
return
|
||||
usr.next_click = world.time + 1
|
||||
linked_action.Trigger()
|
||||
return TRUE
|
||||
|
||||
|
||||
+24
-11
@@ -22,7 +22,7 @@
|
||||
if(alerts[category])
|
||||
thealert = alerts[category]
|
||||
if(thealert.override_alerts)
|
||||
return 0
|
||||
return thealert
|
||||
if(new_master && new_master != thealert.master)
|
||||
WARNING("[src] threw alert [category] with new_master [new_master] while already having that alert with master [thealert.master]")
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
clear_alert(category)
|
||||
return .()
|
||||
else //no need to update
|
||||
return 0
|
||||
return thealert
|
||||
else
|
||||
thealert = new type()
|
||||
thealert.override_alerts = override
|
||||
@@ -272,7 +272,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
|
||||
var/mob/living/L = usr
|
||||
if(!istype(L) || !L.can_resist())
|
||||
return
|
||||
L.changeNext_move(CLICK_CD_RESIST)
|
||||
L.MarkResistTime()
|
||||
if(CHECK_MOBILITY(L, MOBILITY_MOVE))
|
||||
return L.resist_fire() //I just want to start a flame in your hearrrrrrtttttt.
|
||||
|
||||
@@ -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)
|
||||
@@ -600,17 +598,32 @@ so as to remain in compliance with the most up-to-date laws."
|
||||
var/mob/living/L = usr
|
||||
if(!istype(L) || !L.can_resist())
|
||||
return
|
||||
L.changeNext_move(CLICK_CD_RESIST)
|
||||
if(CHECK_MOBILITY(L, MOBILITY_MOVE) && (L.last_special <= world.time))
|
||||
return L.resist_restraints()
|
||||
L.MarkResistTime()
|
||||
return L.resist_restraints()
|
||||
|
||||
/obj/screen/alert/restrained/buckled/Click()
|
||||
var/mob/living/L = usr
|
||||
if(!istype(L) || !L.can_resist())
|
||||
return
|
||||
L.changeNext_move(CLICK_CD_RESIST)
|
||||
if(L.last_special <= world.time)
|
||||
return L.resist_buckle()
|
||||
L.MarkResistTime()
|
||||
return L.resist_buckle()
|
||||
|
||||
/obj/screen/alert/shoes/untied
|
||||
name = "Untied Shoes"
|
||||
desc = "Your shoes are untied! Click the alert or your shoes to tie them."
|
||||
icon_state = "shoealert"
|
||||
|
||||
/obj/screen/alert/shoes/knotted
|
||||
name = "Knotted Shoes"
|
||||
desc = "Someone tied your shoelaces together! Click the alert or your shoes to undo the knot."
|
||||
icon_state = "shoealert"
|
||||
|
||||
/obj/screen/alert/shoes/Click()
|
||||
var/mob/living/carbon/C = usr
|
||||
if(!istype(C) || !C.can_resist() || C != mob_viewer || !C.shoes)
|
||||
return
|
||||
C.MarkResistTime()
|
||||
C.shoes.handle_tying(C)
|
||||
|
||||
// PRIVATE = only edit, use, or override these if you're editing the system as a whole
|
||||
|
||||
|
||||
@@ -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()
|
||||
@@ -140,6 +140,17 @@
|
||||
sprint_buffer.hud = src
|
||||
static_inventory += sprint_buffer
|
||||
|
||||
// clickdelay
|
||||
clickdelay = new
|
||||
clickdelay.hud = src
|
||||
clickdelay.screen_loc = ui_clickdelay
|
||||
static_inventory += clickdelay
|
||||
|
||||
// resistdelay
|
||||
resistdelay = new
|
||||
resistdelay.hud = src
|
||||
resistdelay.screen_loc = ui_resistdelay
|
||||
static_inventory += resistdelay
|
||||
|
||||
using = new /obj/screen/drop()
|
||||
using.icon = ui_style
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
deltimer(C.parallax_animate_timer)
|
||||
var/datum/callback/CB = CALLBACK(src, .proc/update_parallax_motionblur, C, animatedir, new_parallax_movedir, newtransform)
|
||||
if(skip_windups)
|
||||
CB.Invoke()
|
||||
CB.InvokeAsync()
|
||||
else
|
||||
C.parallax_animate_timer = addtimer(CB, min(shortesttimer, PARALLAX_LOOP_TIME), TIMER_CLIENT_TIME|TIMER_STOPPABLE)
|
||||
|
||||
@@ -219,6 +219,7 @@
|
||||
L.screen_loc = "CENTER-7:[round(L.offset_x,1)],CENTER-7:[round(L.offset_y,1)]"
|
||||
|
||||
/atom/movable/proc/update_parallax_contents()
|
||||
set waitfor = FALSE
|
||||
if(length(client_mobs_in_contents))
|
||||
for(var/thing in client_mobs_in_contents)
|
||||
var/mob/M = thing
|
||||
|
||||
@@ -47,17 +47,7 @@
|
||||
name = "swap hand"
|
||||
|
||||
/obj/screen/swap_hand/Click()
|
||||
// At this point in client Click() code we have passed the 1/10 sec check and little else
|
||||
// We don't even know if it's a middle click
|
||||
if(world.time <= usr.next_move)
|
||||
return 1
|
||||
|
||||
if(usr.incapacitated())
|
||||
return 1
|
||||
|
||||
if(ismob(usr))
|
||||
var/mob/M = usr
|
||||
M.swap_hand()
|
||||
usr.swap_hand()
|
||||
return 1
|
||||
|
||||
/obj/screen/craft
|
||||
@@ -101,15 +91,9 @@
|
||||
plane = HUD_PLANE
|
||||
|
||||
/obj/screen/inventory/Click(location, control, params)
|
||||
// At this point in client Click() code we have passed the 1/10 sec check and little else
|
||||
// We don't even know if it's a middle click
|
||||
if(world.time <= usr.next_move)
|
||||
return TRUE
|
||||
|
||||
if(usr.incapacitated())
|
||||
return TRUE
|
||||
if(ismecha(usr.loc)) // stops inventory actions in a mech
|
||||
return TRUE
|
||||
if(hud?.mymob && (hud.mymob != usr))
|
||||
return
|
||||
// just redirect clicks
|
||||
|
||||
if(hud?.mymob && slot_id)
|
||||
var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id)
|
||||
@@ -190,17 +174,10 @@
|
||||
|
||||
|
||||
/obj/screen/inventory/hand/Click(location, control, params)
|
||||
// At this point in client Click() code we have passed the 1/10 sec check and little else
|
||||
// We don't even know if it's a middle click
|
||||
var/mob/user = hud?.mymob
|
||||
if(usr != user)
|
||||
return TRUE
|
||||
if(world.time <= user.next_move)
|
||||
return TRUE
|
||||
if(user.incapacitated())
|
||||
return TRUE
|
||||
if (ismecha(user.loc)) // stops inventory actions in a mech
|
||||
return TRUE
|
||||
if(hud?.mymob && (hud.mymob != usr))
|
||||
return
|
||||
var/mob/user = hud.mymob
|
||||
// just redirect clicks
|
||||
|
||||
if(user.active_hand_index == held_index)
|
||||
var/obj/item/I = user.get_active_held_item()
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
/obj/screen/action_bar
|
||||
|
||||
/obj/screen/action_bar/Destroy()
|
||||
STOP_PROCESSING(SShuds, src)
|
||||
return ..()
|
||||
|
||||
/obj/screen/action_bar/proc/mark_dirty()
|
||||
var/mob/living/L = hud?.mymob
|
||||
if(L?.client && update_to_mob(L))
|
||||
START_PROCESSING(SShuds, src)
|
||||
|
||||
/obj/screen/action_bar/process()
|
||||
var/mob/living/L = hud?.mymob
|
||||
if(!L?.client || !update_to_mob(L))
|
||||
return PROCESS_KILL
|
||||
|
||||
/obj/screen/action_bar/proc/update_to_mob(mob/living/L)
|
||||
return FALSE
|
||||
|
||||
/datum/hud/var/obj/screen/action_bar/clickdelay/clickdelay
|
||||
|
||||
/obj/screen/action_bar/clickdelay
|
||||
name = "click delay"
|
||||
icon = 'icons/effects/progessbar.dmi'
|
||||
icon_state = "prog_bar_100"
|
||||
layer = 20 // under hand buttons
|
||||
|
||||
/obj/screen/action_bar/clickdelay/Initialize()
|
||||
. = ..()
|
||||
var/matrix/M = new
|
||||
M.Scale(2, 1)
|
||||
transform = M
|
||||
|
||||
/obj/screen/action_bar/clickdelay/update_to_mob(mob/living/L)
|
||||
var/estimated = L.EstimatedNextActionTime()
|
||||
var/diff = estimated - L.last_action
|
||||
var/left = estimated - world.time
|
||||
if(left < 0 || diff < 0)
|
||||
icon_state = "prog_bar_100"
|
||||
return FALSE
|
||||
icon_state = "prog_bar_[round(clamp(((diff - left)/diff) * 100, 0, 100), 5)]"
|
||||
return TRUE
|
||||
|
||||
/datum/hud/var/obj/screen/action_bar/resistdelay/resistdelay
|
||||
|
||||
/obj/screen/action_bar/resistdelay
|
||||
name = "resist delay"
|
||||
icon = 'icons/effects/progessbar.dmi'
|
||||
icon_state = "prog_bar_100"
|
||||
|
||||
/obj/screen/action_bar/resistdelay/update_to_mob(mob/living/L)
|
||||
var/diff = L.next_resist - L.last_resist
|
||||
var/left = L.next_resist - world.time
|
||||
if(left < 0 || diff < 0)
|
||||
icon_state = "prog_bar_100"
|
||||
return FALSE
|
||||
icon_state = "prog_bar_[round(clamp(((diff - left)/diff) * 100, 0, 100), 5)]"
|
||||
return TRUE
|
||||
@@ -9,12 +9,9 @@
|
||||
/obj/screen/storage/Click(location, control, params)
|
||||
if(!insertion_click)
|
||||
return ..()
|
||||
if(world.time <= usr.next_move)
|
||||
return TRUE
|
||||
if(usr.incapacitated())
|
||||
return TRUE
|
||||
if (ismecha(usr.loc)) // stops inventory actions in a mech
|
||||
return TRUE
|
||||
if(hud?.mymob && (hud.mymob != usr))
|
||||
return
|
||||
// just redirect clicks
|
||||
if(master)
|
||||
var/obj/item/I = usr.get_active_held_item()
|
||||
if(I)
|
||||
|
||||
@@ -7,21 +7,22 @@
|
||||
*and lastly
|
||||
*afterattack. The return value does not matter.
|
||||
*/
|
||||
/obj/item/proc/melee_attack_chain(mob/user, atom/target, params, flags, damage_multiplier = 1)
|
||||
/obj/item/proc/melee_attack_chain(mob/user, atom/target, params, attackchain_flags, damage_multiplier = 1)
|
||||
if(isliving(user))
|
||||
var/mob/living/L = user
|
||||
if(!CHECK_MOBILITY(L, MOBILITY_USE) && !(flags & ATTACKCHAIN_PARRY_COUNTERATTACK))
|
||||
if(!CHECK_MOBILITY(L, MOBILITY_USE) && !(attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK))
|
||||
to_chat(L, "<span class='warning'>You are unable to swing [src] right now!</span>")
|
||||
return
|
||||
if(tool_behaviour && target.tool_act(user, src, tool_behaviour))
|
||||
. = attackchain_flags
|
||||
if(tool_behaviour && ((. = target.tool_act(user, src, tool_behaviour)) & STOP_ATTACK_PROC_CHAIN))
|
||||
return
|
||||
if(pre_attack(target, user, params))
|
||||
if((. |= pre_attack(target, user, params, ., damage_multiplier)) & STOP_ATTACK_PROC_CHAIN)
|
||||
return
|
||||
if(target.attackby(src, user, params, flags, damage_multiplier))
|
||||
if((. |= target.attackby(src, user, params, ., damage_multiplier)) & STOP_ATTACK_PROC_CHAIN)
|
||||
return
|
||||
if(QDELETED(src) || QDELETED(target))
|
||||
return
|
||||
afterattack(target, user, TRUE, params)
|
||||
. |= afterattack(target, user, TRUE, params)
|
||||
|
||||
/// Like melee_attack_chain but for ranged.
|
||||
/obj/item/proc/ranged_attack_chain(mob/user, atom/target, params)
|
||||
@@ -30,7 +31,7 @@
|
||||
if(!CHECK_MOBILITY(L, MOBILITY_USE))
|
||||
to_chat(L, "<span class='warning'>You are unable to raise [src] right now!</span>")
|
||||
return
|
||||
afterattack(target, user, FALSE, params)
|
||||
return afterattack(target, user, FALSE, params)
|
||||
|
||||
// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
|
||||
/obj/item/proc/attack_self(mob/user)
|
||||
@@ -38,28 +39,43 @@
|
||||
return
|
||||
interact(user)
|
||||
|
||||
/obj/item/proc/pre_attack(atom/A, mob/living/user, params) //do stuff before attackby!
|
||||
/obj/item/proc/pre_attack(atom/A, mob/living/user, params, attackchain_flags, damage_multiplier) //do stuff before attackby!
|
||||
if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_NO_ATTACK)
|
||||
return TRUE
|
||||
return FALSE //return TRUE to avoid calling attackby after this proc does stuff
|
||||
return STOP_ATTACK_PROC_CHAIN
|
||||
if(!(attackchain_flags & ATTACK_IGNORE_CLICKDELAY) && !CheckAttackCooldown(user, A))
|
||||
return STOP_ATTACK_PROC_CHAIN
|
||||
|
||||
// No comment
|
||||
/atom/proc/attackby(obj/item/W, mob/user, params)
|
||||
if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, params) & COMPONENT_NO_AFTERATTACK)
|
||||
return TRUE
|
||||
return FALSE
|
||||
return STOP_ATTACK_PROC_CHAIN
|
||||
|
||||
/obj/attackby(obj/item/I, mob/living/user, params)
|
||||
return ..() || ((obj_flags & CAN_BE_HIT) && I.attack_obj(src, user))
|
||||
. = ..()
|
||||
if(. & STOP_ATTACK_PROC_CHAIN)
|
||||
return
|
||||
if(obj_flags & CAN_BE_HIT)
|
||||
. |= I.attack_obj(src, user)
|
||||
|
||||
/mob/living/attackby(obj/item/I, mob/living/user, params, attackchain_flags, damage_multiplier)
|
||||
if(..())
|
||||
return TRUE
|
||||
I.attack_delay_done = FALSE //Should be set TRUE in pre_attacked_by()
|
||||
. = I.attack(src, user, attackchain_flags, damage_multiplier)
|
||||
if(!I.attack_delay_done) //Otherwise, pre_attacked_by() should handle it.
|
||||
user.changeNext_move(I.click_delay)
|
||||
. = ..()
|
||||
if(. & STOP_ATTACK_PROC_CHAIN)
|
||||
return
|
||||
. |= I.attack(src, user, attackchain_flags, damage_multiplier)
|
||||
if(!(. & NO_AUTO_CLICKDELAY_HANDLING)) // SAFETY NET - unless the proc tells us we should not handle this, give them the basic melee cooldown!
|
||||
I.ApplyAttackCooldown(user, src, attackchain_flags)
|
||||
|
||||
/**
|
||||
* 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
|
||||
* * attackchain_Flags - see [code/__DEFINES/_flags/return_values.dm]
|
||||
* * damage_multiplier - what to multiply the damage by
|
||||
*/
|
||||
/obj/item/proc/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
|
||||
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) & COMPONENT_ITEM_NO_ATTACK)
|
||||
return
|
||||
@@ -88,6 +104,17 @@
|
||||
if(weight)
|
||||
user.adjustStaminaLossBuffered(weight)
|
||||
|
||||
// CIT SCREENSHAKE
|
||||
if(force >= 15)
|
||||
shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01))
|
||||
if(M.client)
|
||||
switch (M.client.prefs.damagescreenshake)
|
||||
if (1)
|
||||
shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
|
||||
if (2)
|
||||
if(!CHECK_MOBILITY(M, MOBILITY_MOVE))
|
||||
shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
|
||||
|
||||
//the equivalent of the standard version of attack() but for object targets.
|
||||
/obj/item/proc/attack_obj(obj/O, mob/living/user)
|
||||
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ)
|
||||
@@ -95,8 +122,7 @@
|
||||
if(item_flags & NOBLUDGEON)
|
||||
return
|
||||
user.do_attack_animation(O)
|
||||
if(!O.attacked_by(src, user))
|
||||
user.changeNext_move(click_delay)
|
||||
O.attacked_by(src, user)
|
||||
var/weight = getweight(user, STAM_COST_ATTACK_OBJ_MULT)
|
||||
if(weight)
|
||||
user.adjustStaminaLossBuffered(weight)//CIT CHANGE - makes attacking things cause stamina loss
|
||||
@@ -109,12 +135,9 @@
|
||||
var/bad_trait
|
||||
|
||||
var/stamloss = user.getStaminaLoss()
|
||||
var/next_move_mult = 1
|
||||
if(stamloss > STAMINA_NEAR_SOFTCRIT) //The more tired you are, the less damage you do.
|
||||
var/penalty = (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*STAM_CRIT_ITEM_ATTACK_PENALTY
|
||||
totitemdamage *= 1 - penalty
|
||||
next_move_mult += penalty*STAM_CRIT_ITEM_ATTACK_DELAY
|
||||
user.changeNext_move(I.click_delay*next_move_mult)
|
||||
|
||||
if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
|
||||
bad_trait = SKILL_COMBAT_MODE //blacklist combat skills.
|
||||
@@ -126,18 +149,18 @@
|
||||
if(!(SKILL_TRAIN_ATTACK_OBJ in I.used_skills[skill]))
|
||||
continue
|
||||
user.mind.auto_gain_experience(skill, I.skill_gain)
|
||||
|
||||
if(!(attackchain_flags & NO_AUTO_CLICKDELAY_HANDLING))
|
||||
I.ApplyAttackCooldown(user, src, attackchain_flags)
|
||||
if(totitemdamage)
|
||||
visible_message("<span class='danger'>[user] has hit [src] with [I]!</span>", null, null, COMBAT_MESSAGE_RANGE)
|
||||
//only witnesses close by and the victim see a hit message.
|
||||
log_combat(user, src, "attacked", I)
|
||||
take_damage(totitemdamage, I.damtype, "melee", 1)
|
||||
return TRUE
|
||||
|
||||
/mob/living/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
|
||||
var/list/block_return = list()
|
||||
var/totitemdamage = pre_attacked_by(I, user) * damage_multiplier
|
||||
if((user != src) && mob_run_block(I, totitemdamage, "the [I.name]", ((attackchain_flags & ATTACKCHAIN_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, null, block_return) & BLOCK_SUCCESS)
|
||||
if((user != src) && mob_run_block(I, totitemdamage, "the [I.name]", ((attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK)? ATTACK_IS_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, null, block_return) & BLOCK_SUCCESS)
|
||||
return FALSE
|
||||
totitemdamage = block_calculate_resultant_damage(totitemdamage, block_return)
|
||||
send_item_attack_message(I, user, null, totitemdamage)
|
||||
@@ -155,8 +178,7 @@
|
||||
|
||||
/mob/living/simple_animal/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
|
||||
if(I.force < force_threshold || I.damtype == STAMINA)
|
||||
playsound(loc, 'sound/weapons/tap.ogg', I.get_clamped_volume(), 1, -1)
|
||||
user.changeNext_move(I.click_delay) //pre_attacked_by not called
|
||||
playsound(src, 'sound/weapons/tap.ogg', I.get_clamped_volume(), 1, -1)
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -167,25 +189,21 @@
|
||||
|
||||
var/stamloss = user.getStaminaLoss()
|
||||
var/stam_mobility_mult = 1
|
||||
var/next_move_mult = 1
|
||||
if(stamloss > STAMINA_NEAR_SOFTCRIT) //The more tired you are, the less damage you do.
|
||||
var/penalty = (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*STAM_CRIT_ITEM_ATTACK_PENALTY
|
||||
stam_mobility_mult -= penalty
|
||||
next_move_mult += penalty*STAM_CRIT_ITEM_ATTACK_DELAY
|
||||
if(stam_mobility_mult > LYING_DAMAGE_PENALTY && !CHECK_MOBILITY(user, MOBILITY_STAND)) //damage penalty for fighting prone, doesn't stack with the above.
|
||||
stam_mobility_mult = LYING_DAMAGE_PENALTY
|
||||
. *= stam_mobility_mult
|
||||
user.changeNext_move(I.click_delay*next_move_mult)
|
||||
I.attack_delay_done = TRUE
|
||||
|
||||
var/bad_trait
|
||||
if(!(I.item_flags & NO_COMBAT_MODE_FORCE_MODIFIER))
|
||||
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
|
||||
@@ -197,8 +215,18 @@
|
||||
var/datum/skill/S = GLOB.skill_datums[skill]
|
||||
user.mind.auto_gain_experience(skill, I.skill_gain*S.item_skill_gain_multi)
|
||||
|
||||
// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person.
|
||||
// Click parameters is the params string from byond Click() code, see that documentation.
|
||||
/**
|
||||
* Called after attacking something if the melee attack chain isn't interrupted before.
|
||||
* 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
|
||||
* * proximity_flag - are we in melee range/doing it in a melee attack
|
||||
* * click_parameters - mouse control parameters, check BYOND ref.
|
||||
*/
|
||||
/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters)
|
||||
SEND_SIGNAL(user, COMSIG_MOB_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters)
|
||||
@@ -210,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.
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
CtrlClickOn(A)
|
||||
return
|
||||
|
||||
if(world.time <= next_move)
|
||||
if(!CheckActionCooldown())
|
||||
return
|
||||
// You are responsible for checking config.ghost_interaction when you override this function
|
||||
// Not all of them require checking, see below
|
||||
|
||||
+42
-21
@@ -5,7 +5,7 @@
|
||||
Otherwise pretty standard.
|
||||
*/
|
||||
|
||||
/mob/living/carbon/human/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
|
||||
/mob/living/carbon/human/UnarmedAttack(atom/A, proximity, intent = a_intent, attackchain_flags = NONE)
|
||||
|
||||
if(!has_active_hand()) //can't attack without a hand.
|
||||
to_chat(src, "<span class='notice'>You look at your arm and sigh.</span>")
|
||||
@@ -16,33 +16,45 @@
|
||||
to_chat(src, "<span class='warning'>The damage in your [check_arm.name] is preventing you from using it! Get it fixed, or at least splinted!</span>")
|
||||
return
|
||||
|
||||
. = attackchain_flags
|
||||
// Special glove functions:
|
||||
// If the gloves do anything, have them return 1 to stop
|
||||
// normal attack_hand() here.
|
||||
var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines
|
||||
if(proximity && istype(G) && G.Touch(A,1))
|
||||
return
|
||||
|
||||
var/override = 0
|
||||
if(proximity && istype(G))
|
||||
. |= G.Touch(A, TRUE)
|
||||
if(. & INTERRUPT_UNARMED_ATTACK)
|
||||
return
|
||||
|
||||
for(var/datum/mutation/human/HM in dna.mutations)
|
||||
override += HM.on_attack_hand(A, proximity, intent, flags)
|
||||
. |= HM.on_attack_hand(A, proximity, intent, .)
|
||||
|
||||
if(override)
|
||||
if(. & INTERRUPT_UNARMED_ATTACK)
|
||||
return
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, A)
|
||||
A.attack_hand(src, intent, flags)
|
||||
return . | A.attack_hand(src, intent, .)
|
||||
|
||||
//Return TRUE to cancel other attack hand effects that respect it.
|
||||
/atom/proc/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
. = FALSE
|
||||
/atom/proc/attack_hand(mob/user, act_intent = user.a_intent, attackchain_flags)
|
||||
SHOULD_NOT_SLEEP(TRUE)
|
||||
if(!(interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND))
|
||||
add_fingerprint(user)
|
||||
if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_NO_ATTACK_HAND)
|
||||
. = TRUE
|
||||
return
|
||||
. = attackchain_flags
|
||||
if(attack_hand_speed && !(. & ATTACK_IGNORE_CLICKDELAY))
|
||||
if(!user.CheckActionCooldown(attack_hand_speed))
|
||||
return
|
||||
if(interaction_flags_atom & INTERACT_ATOM_ATTACK_HAND)
|
||||
. = _try_interact(user)
|
||||
INVOKE_ASYNC(src, .proc/on_attack_hand, user, act_intent, .)
|
||||
if(!(. & ATTACK_IGNORE_ACTION))
|
||||
if(attack_hand_unwieldlyness)
|
||||
user.DelayNextAction(attack_hand_unwieldlyness, considered_action = attack_hand_is_action)
|
||||
else if(attack_hand_is_action)
|
||||
user.DelayNextAction()
|
||||
|
||||
/atom/proc/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
|
||||
//Return a non FALSE value to cancel whatever called this from propagating, if it respects it.
|
||||
/atom/proc/_try_interact(mob/user)
|
||||
@@ -50,7 +62,6 @@
|
||||
return interact(user)
|
||||
if(can_interact(user))
|
||||
return interact(user)
|
||||
return FALSE
|
||||
|
||||
/atom/proc/can_interact(mob/user)
|
||||
if(!user.can_interact_with(src))
|
||||
@@ -80,8 +91,7 @@
|
||||
else
|
||||
add_fingerprint(user)
|
||||
if(interaction_flags_atom & INTERACT_ATOM_UI_INTERACT)
|
||||
return ui_interact(user)
|
||||
return FALSE
|
||||
ui_interact(user)
|
||||
|
||||
/*
|
||||
/mob/living/carbon/human/RestrainedClickOn(var/atom/A) ---carbons will handle this
|
||||
@@ -95,13 +105,19 @@
|
||||
. = ..()
|
||||
if(gloves)
|
||||
var/obj/item/clothing/gloves/G = gloves
|
||||
if(istype(G) && G.Touch(A,0)) // for magic gloves
|
||||
. |= G.Touch(A, FALSE)
|
||||
if(. & INTERRUPT_UNARMED_ATTACK)
|
||||
return
|
||||
if(istype(glasses))
|
||||
. |= glasses.ranged_attack(src, A, mouseparams)
|
||||
if(. & INTERRUPT_UNARMED_ATTACK)
|
||||
return
|
||||
if (istype(glasses) && glasses.ranged_attack(src,A,mouseparams))
|
||||
return
|
||||
|
||||
for(var/datum/mutation/human/HM in dna.mutations)
|
||||
HM.on_ranged_attack(A, mouseparams)
|
||||
. |= HM.on_ranged_attack(A, mouseparams)
|
||||
|
||||
if(. & INTERRUPT_UNARMED_ATTACK)
|
||||
return
|
||||
|
||||
if(isturf(A) && get_dist(src,A) <= 1)
|
||||
src.Move_Pulled(A)
|
||||
@@ -123,7 +139,9 @@
|
||||
Monkeys
|
||||
*/
|
||||
/mob/living/carbon/monkey/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
|
||||
A.attack_paw(src, intent, flags)
|
||||
if(!CheckActionCooldown(CLICK_CD_MELEE))
|
||||
return
|
||||
return !isnull(A.attack_paw(src, intent, flags))
|
||||
|
||||
/atom/proc/attack_paw(mob/user)
|
||||
if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_PAW, user) & COMPONENT_NO_ATTACK_HAND)
|
||||
@@ -144,6 +162,8 @@
|
||||
return
|
||||
if(is_muzzled())
|
||||
return
|
||||
if(!CheckActionCooldown(CLICK_CD_MELEE))
|
||||
return
|
||||
var/mob/living/carbon/ML = A
|
||||
if(istype(ML))
|
||||
var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
|
||||
@@ -163,6 +183,7 @@
|
||||
ML.ForceContractDisease(D)
|
||||
else
|
||||
ML.visible_message("<span class='danger'>[src] has attempted to bite [ML]!</span>")
|
||||
DelayNextAction()
|
||||
|
||||
/*
|
||||
Aliens
|
||||
@@ -243,7 +264,7 @@
|
||||
/mob/living/simple_animal/hostile/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
|
||||
target = A
|
||||
if(dextrous && !ismob(A))
|
||||
..()
|
||||
return ..()
|
||||
else
|
||||
AttackingTarget()
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
face_atom(A)
|
||||
|
||||
if(next_move > world.time) // in the year 2000...
|
||||
if(!CheckActionCooldown())
|
||||
return
|
||||
|
||||
if(!modifiers["catcher"] && A.IsObscured())
|
||||
@@ -16,9 +16,8 @@
|
||||
return M.click_action(A,src,params)
|
||||
|
||||
if(restrained())
|
||||
changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow
|
||||
RestrainedClickOn(A)
|
||||
return
|
||||
DelayNextAction(CLICK_CD_HANDCUFFED)
|
||||
return RestrainedClickOn(A)
|
||||
|
||||
if(in_throw_mode)
|
||||
throw_item(A)//todo: make it plausible to lightly toss items via right-click
|
||||
@@ -36,13 +35,14 @@
|
||||
//User itself, current loc, and user inventory
|
||||
if(A in DirectAccess())
|
||||
if(W)
|
||||
W.rightclick_melee_attack_chain(src, A, params)
|
||||
return W.rightclick_melee_attack_chain(src, A, params)
|
||||
else
|
||||
if(ismob(A))
|
||||
changeNext_move(CLICK_CD_MELEE)
|
||||
if(!AltUnarmedAttack(A))
|
||||
UnarmedAttack(A)
|
||||
return
|
||||
if(!AltUnarmedAttack(A, TRUE))
|
||||
. = UnarmedAttack(A, TRUE, a_intent)
|
||||
if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
|
||||
DelayNextAction(CLICK_CD_MELEE)
|
||||
return
|
||||
return
|
||||
|
||||
//Can't reach anything else in lockers or other weirdness
|
||||
if(!loc.AllowClick())
|
||||
@@ -51,23 +51,25 @@
|
||||
//Standard reach turf to turf or reaching inside storage
|
||||
if(CanReach(A,W))
|
||||
if(W)
|
||||
W.rightclick_melee_attack_chain(src, A, params)
|
||||
return W.rightclick_melee_attack_chain(src, A, params)
|
||||
else
|
||||
if(ismob(A))
|
||||
changeNext_move(CLICK_CD_MELEE)
|
||||
if(!AltUnarmedAttack(A,1))
|
||||
UnarmedAttack(A,1)
|
||||
if(!AltUnarmedAttack(A, TRUE))
|
||||
. = UnarmedAttack(A, TRUE, a_intent)
|
||||
if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
|
||||
DelayNextAction(CLICK_CD_MELEE)
|
||||
return
|
||||
return
|
||||
else
|
||||
if(W)
|
||||
if(!W.altafterattack(A, src, FALSE, params))
|
||||
W.afterattack(A, src, FALSE, params)
|
||||
return W.afterattack(A, src, FALSE, params)
|
||||
else
|
||||
if(!AltRangedAttack(A,params))
|
||||
RangedAttack(A,params)
|
||||
if(!AltRangedAttack(A, params))
|
||||
return RangedAttack(A, params)
|
||||
|
||||
/mob/proc/AltUnarmedAttack(atom/A, proximity_flag)
|
||||
if(ismob(A))
|
||||
changeNext_move(CLICK_CD_MELEE)
|
||||
DelayNextAction(CLICK_CD_MELEE)
|
||||
return FALSE
|
||||
|
||||
/mob/proc/AltRangedAttack(atom/A, params)
|
||||
@@ -1,10 +1,9 @@
|
||||
/obj/item/proc/rightclick_melee_attack_chain(mob/user, atom/target, params)
|
||||
if(!alt_pre_attack(target, user, params)) //Hey, does this item have special behavior that should override all normal right-click functionality?
|
||||
if(!target.altattackby(src, user, params)) //Does the target do anything special when we right-click on it?
|
||||
melee_attack_chain(user, target, params) //Ugh. Lame! I'm filing a legal complaint about the discrimination against the right mouse button!
|
||||
. = melee_attack_chain(user, target, params) //Ugh. Lame! I'm filing a legal complaint about the discrimination against the right mouse button!
|
||||
else
|
||||
altafterattack(target, user, TRUE, params)
|
||||
return
|
||||
. = altafterattack(target, user, TRUE, params)
|
||||
|
||||
/obj/item/proc/alt_pre_attack(atom/A, mob/living/user, params)
|
||||
return FALSE //return something other than false if you wanna override attacking completely
|
||||
@@ -3,15 +3,14 @@
|
||||
to_chat(src, "<span class='notice'>You look at the state of the universe and sigh.</span>") //lets face it, people rarely ever see this message in its intended condition.
|
||||
return TRUE
|
||||
|
||||
if(!A.alt_attack_hand(src))
|
||||
A.attack_hand(src)
|
||||
return TRUE
|
||||
return TRUE
|
||||
return A.alt_attack_hand(src)
|
||||
|
||||
/mob/living/carbon/human/AltRangedAttack(atom/A, params)
|
||||
if(isturf(A) || incapacitated()) // pretty annoying to wave your fist at floors and walls. And useless.
|
||||
return TRUE
|
||||
changeNext_move(CLICK_CD_RANGE)
|
||||
return
|
||||
if(!CheckActionCooldown(CLICK_CD_RANGE))
|
||||
return
|
||||
DelayNextAction()
|
||||
var/list/target_viewers = fov_viewers(11, A) //doesn't check for blindness.
|
||||
if(!(src in target_viewers)) //click catcher issuing calls for out of view objects.
|
||||
return TRUE
|
||||
@@ -123,7 +123,8 @@
|
||||
. = ..()
|
||||
if(!target || !user)
|
||||
return
|
||||
|
||||
if(!user.CheckActionCooldown(CLICK_CD_MELEE))
|
||||
return
|
||||
if(!focus)
|
||||
focus_object(target)
|
||||
return
|
||||
@@ -145,7 +146,7 @@
|
||||
else
|
||||
apply_focus_overlay()
|
||||
focus.throw_at(target, 10, 1,user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.DelayNextAction(considered_action = TRUE, flush = TRUE)
|
||||
update_icon()
|
||||
|
||||
/proc/tkMaxRangeCheck(mob/user, atom/target)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -469,11 +469,10 @@ GLOBAL_LIST_EMPTY(the_station_areas)
|
||||
else
|
||||
return
|
||||
|
||||
possible_options = "Custom"
|
||||
var/away_name
|
||||
var/datum/space_level/away_level
|
||||
|
||||
var/answer = input("What kind ? ","Away/VR") as null|anything in possible_options
|
||||
var/answer = input("What kind ? ","Away/VR") as null|anything in list(possible_options + "Custom")
|
||||
switch(answer)
|
||||
if(null)
|
||||
return
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
// Smooth HUD updates, but low priority
|
||||
PROCESSING_SUBSYSTEM_DEF(huds)
|
||||
name = "HUD updates"
|
||||
wait = 0.5
|
||||
priority = FIRE_PRIORITY_HUDS
|
||||
stat_tag = "HUDS"
|
||||
@@ -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))
|
||||
|
||||
@@ -0,0 +1,221 @@
|
||||
//similar to dog_fashion, but for beepsky, who has far more refined fashion tastes
|
||||
/datum/beepsky_fashion
|
||||
var/name //not setting the name and desc makes them go to the default
|
||||
var/desc
|
||||
|
||||
var/icon_file = 'icons/mob/secbot_accessories.dmi' //we sell secbots and secbot accessories
|
||||
var/obj_icon_state
|
||||
var/obj_alpha
|
||||
var/obj_color
|
||||
|
||||
var/list/stun_sounds //sound that replaces the stun attack when set
|
||||
var/ignore_sound = FALSE //whether to ignore sounds entirely or not
|
||||
|
||||
//emotes (don't set them if you want the default value)
|
||||
var/death_emote //what is said when beepsky dies
|
||||
var/capture_one //what is said when cuffing someone
|
||||
var/capture_two //what is said when cuffing someone, directly to the person being cuffed
|
||||
var/infraction //the level of threat detected
|
||||
var/taunt // beepsky pointing at a criminal
|
||||
var/attack_one //text when attacking criminal
|
||||
var/attack_two //text when attacking criminal, but directly to the criminal
|
||||
var/patrol_emote //engaging patrol text
|
||||
var/patrol_fail_emote //failing to engage patrol text
|
||||
var/list/arrest_texts //first is for not-cuffing, second is for cuffing
|
||||
var/arrest_emote //text stating that you're cuffing some criminal C with a threat of level X in location Y
|
||||
|
||||
//for reference, the following words are replaced when processed before speech:
|
||||
//LOCATION = the location passed, if any (this is only used by arrest_emote)
|
||||
//CRIMINAL = the name of the criminal (this is used by everything but patrol_emote and infraction)
|
||||
//BOT = the name of the bot (this can be used on any of the emotes)
|
||||
//THREAT_LEVEL = the level of the threat detected (can be used on arrest_emote and infraction)
|
||||
|
||||
/datum/beepsky_fashion/proc/get_overlay(var/dir)
|
||||
if(icon_file && obj_icon_state)
|
||||
var/image/beepsky_overlay = image(icon_file, obj_icon_state, dir = dir)
|
||||
beepsky_overlay.alpha = obj_alpha
|
||||
beepsky_overlay.color = obj_color
|
||||
return beepsky_overlay
|
||||
|
||||
/datum/beepsky_fashion/proc/stun_attack(mob/living/carbon/C) //fired when beepsky does a stun attack with the fashion worn, for sounds/overlays/etc
|
||||
return
|
||||
|
||||
//actual fashions from here on out
|
||||
/datum/beepsky_fashion/wizard
|
||||
obj_icon_state = "wizard"
|
||||
name = "Archmage Beepsky"
|
||||
desc = "A secbot stolen from the wizard federation."
|
||||
death_emote = "BOT casts EI NATH on themselves!"
|
||||
capture_one = "BOT is casting cable ties on CRIMINAL!"
|
||||
capture_two = "BOT is casting cable ties on you!"
|
||||
infraction = "Magical disturbance of magnitude THREAT_LEVEL detected!"
|
||||
taunt = "BOT points his staff towards CRIMINAL!"
|
||||
attack_one = "BOT casts magic missile on CRIMINAL!"
|
||||
attack_two = "BOT casts magic missile on you!"
|
||||
patrol_emote = "Beginning search for magical disturbances."
|
||||
patrol_fail_emote = "Failure to find magical disturbances. Recallibrating."
|
||||
arrest_emote = "ARREST_TYPE level THREAT_LEVEL magical practitioner CRIMINAL in LOCATION."
|
||||
stun_sounds = list('sound/magic/lightningbolt.ogg',
|
||||
'sound/magic/fireball.ogg',
|
||||
'sound/weapons/zapbang.ogg',
|
||||
'sound/magic/knock.ogg',
|
||||
'sound/magic/fleshtostone.ogg',
|
||||
'sound/effects/magic.ogg',
|
||||
'sound/magic/disintegrate.ogg')
|
||||
|
||||
/datum/beepsky_fashion/cowboy
|
||||
obj_icon_state = "cowboy"
|
||||
name = "Sheriff Beepsky"
|
||||
desc = "The sheriff of this here station."
|
||||
capture_one = "BOT is tying CRIMINAL up!"
|
||||
capture_two = "BOT is tying you up!"
|
||||
infraction = "Outlaws with a bounty of THREAT_LEVEL000 space dollars detected!"
|
||||
taunt = "BOT aims his revolver towards CRIMINAL!"
|
||||
attack_one = "BOT unloads his revolver onto CRIMINAL!"
|
||||
attack_two = "BOT unloads his revolver onto you!"
|
||||
patrol_emote = "Engaging bounty hunting protocols."
|
||||
patrol_fail_emote = "Unable to find any bounties due to error. Rebooting."
|
||||
arrest_emote = "ARREST_TYPE outlaw CRIMINAL with a bounty of THREAT_LEVEL000 in LOCATION."
|
||||
stun_sounds = list('sound/weapons/Gunshot.ogg',
|
||||
'sound/weapons/Gunshot2.ogg',
|
||||
'sound/weapons/Gunshot3.ogg',
|
||||
'sound/weapons/Gunshot4.ogg')
|
||||
|
||||
/datum/beepsky_fashion/chef
|
||||
obj_icon_state = "chef"
|
||||
name = "Chef Beepsky"
|
||||
desc = "Cooking up the finest foods the station has ever seen."
|
||||
death_emote = "Mamma-mia!"
|
||||
infraction = "Grade THREAT_LEVEL prosciutto detected!"
|
||||
taunt = "BOT glares at CRIMINAL."
|
||||
attack_one = "BOT CQCs CRIMINAL!"
|
||||
attack_two = "BOT CQCs you!"
|
||||
patrol_emote = "Beginning search for the bad prosciutto."
|
||||
patrol_fail_emote = "All prosciutto is stale. Rebooting."
|
||||
arrest_texts = list("Frying", "Grilling") //any good secoff knows the difference
|
||||
arrest_emote = "ARREST_TYPE grade THREAT_LEVEL prosciutto CRIMINAL in LOCATION."
|
||||
stun_sounds = list('sound/weapons/cqchit1.ogg',
|
||||
'sound/weapons/cqchit2.ogg')
|
||||
|
||||
/datum/beepsky_fashion/cat
|
||||
obj_icon_state = "cat"
|
||||
name = "OwOfficer Bweepskwee"
|
||||
desc = "A beepsky unit with cat ears. Catgirl science has gone too far."
|
||||
death_emote = "Nya!"
|
||||
capture_one = "BOT is tying CRIMINAL up!!"
|
||||
capture_two = "BOT is tying you up!"
|
||||
infraction = "Wevel THREAT_LEVEL infwactwion awert!!!"
|
||||
taunt = "BOT points at CRIMINAL and nyas!"
|
||||
attack_one = "BOT shoves CRIMINAL onto a table!"
|
||||
attack_two = "BOT shoves you onto a table!"
|
||||
patrol_emote = "Enwgagwing patwol mwodies.."
|
||||
patrol_fail_emote = "Unawbwle two stwawt patwollies. Nya."
|
||||
arrest_texts = list("Dwetwaining", "Awwesting")
|
||||
arrest_emote = "ARREST_TYPE wevel THREAT_LEVEL scwumbwag CRIMINAL in LOCATION. Nya."
|
||||
ignore_sound = TRUE //we instead make the stunned person fire the nya emote
|
||||
|
||||
/datum/beepsky_fashion/cat/stun_attack(var/mob/living/carbon/C) //makes a fake table under you on hit, makes cat people nya when hit
|
||||
if(iscatperson(C))
|
||||
C.emote("nya")
|
||||
var/turf/target_turf = get_turf(C)
|
||||
if(target_turf) //slams you on a fake table
|
||||
playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, 1)
|
||||
var/obj/effect/overlay_holder = new(target_turf)
|
||||
overlay_holder.name = "Catboy Table"
|
||||
overlay_holder.desc = "Where bad catboys go."
|
||||
var/image/table_overlay = image('icons/obj/smooth_structures/table.dmi', "table")
|
||||
overlay_holder.add_overlay(table_overlay)
|
||||
QDEL_IN(overlay_holder, 10)
|
||||
|
||||
/datum/beepsky_fashion/cake //nothing else. it's just beepsky. with a cake on his head.
|
||||
obj_icon_state = "cake"
|
||||
name = "Cakesky"
|
||||
desc = "It's a secbot, wearing a cake on his head!"
|
||||
|
||||
/datum/beepsky_fashion/captain
|
||||
obj_icon_state = "captain"
|
||||
name = "Captainsky"
|
||||
desc = "The real captain of this station."
|
||||
capture_one = "BOT is lecturing CRIMINAL on why he is the captain!"
|
||||
capture_two = "BOT is lecturing you on why he is the captain!"
|
||||
infraction = "Level THREAT_LEVEL greytider detected."
|
||||
attack_one = "BOT beats CRIMINAL with the chain of command!"
|
||||
attack_two = "BOT beats you with the chain of command!"
|
||||
patrol_emote = "Uselessness protocols engaged."
|
||||
patrol_fail_emote = "Unit has been found as useless. Rebooting."
|
||||
arrest_texts = list("Demoting", "Firing")
|
||||
arrest_emote = "ARREST_TYPE level THREAT_LEVEL lesser crewmember CRIMINAL in LOCATION."
|
||||
stun_sounds = list('sound/weapons/chainhit.ogg')
|
||||
|
||||
/datum/beepsky_fashion/king
|
||||
obj_icon_state = "king"
|
||||
name = "King Beepsky"
|
||||
desc = "He who has ascended to bare the right of king, sits atop the throne."
|
||||
capture_one = "BOT is calling the guards onto CRIMINAL!"
|
||||
capture_two = "BOT is calling the guards onto you!"
|
||||
infraction = "Treason of level THREAT_LEVEL detected!"
|
||||
attack_one = "BOT strikes CRIMINAL with his kingly authority!"
|
||||
attack_two = "BOT strikes you with his kingly authority!"
|
||||
patrol_emote = "Searching for peasants to beat up."
|
||||
patrol_fail_emote = "Peasants are using dark magic. Recallibrating."
|
||||
arrest_texts = list("Knighting", "Executing")
|
||||
arrest_emote = "ARREST_TYPE level THREAT_LEVEL peasant CRIMINAL in LOCATION."
|
||||
stun_sounds = list('sound/weapons/punch1.ogg',
|
||||
'sound/weapons/punch2.ogg',
|
||||
'sound/weapons/punch3.ogg',
|
||||
'sound/weapons/punch4.ogg')
|
||||
|
||||
/datum/beepsky_fashion/pirate
|
||||
obj_icon_state = "pirate"
|
||||
name = "Beepsbeard the Pirate"
|
||||
desc = "Sailor of the seven seas, all sea-faring bots fear the one known as Beepsbeard."
|
||||
capture_one = "BOT is making CRIMINAL walk the plank!"
|
||||
capture_two = "BOT is making you walk the plank!"
|
||||
infraction = "Enemy vessel spotted with threat level THREAT_LEVEL!"
|
||||
attack_one = "BOT strikes CRIMINAL with his cutlass!"
|
||||
attack_two = "BOT strikes you with his cutlass!"
|
||||
patrol_emote = "Searching for enemy vessels to board."
|
||||
patrol_fail_emote = "No way to engage enemy vessels. Rebooting."
|
||||
arrest_texts = list("Boarding", "Sinking")
|
||||
arrest_emote = "ARREST_TYPE level THREAT_LEVEL vessel CRIMINAL in LOCATION."
|
||||
stun_sounds = list('sound/weapons/bladeslice.ogg')
|
||||
|
||||
/datum/beepsky_fashion/engineer
|
||||
obj_icon_state = "engineer"
|
||||
name = "Chief Engineer Beepsky"
|
||||
desc = "He fixes criminals with a wrench to the face."
|
||||
capture_one = "BOT is tying CRIMINAL up!"
|
||||
capture_two = "BOT is tying you up!"
|
||||
infraction = "Structural integrity issue spotted with threat level THREAT_LEVEL"
|
||||
attack_one = "BOT strikes CRIMINAL with his wrench!"
|
||||
attack_two = "BOT strikes you with his wrench!"
|
||||
arrest_texts = list("Fixing", "Repairing")
|
||||
arrest_emote = "ARREST_TYPE level THREAT_LEVEL structural issue in LOCATION"
|
||||
stun_sounds = list('sound/weapons/genhit.ogg')
|
||||
|
||||
/datum/beepsky_fashion/tophat
|
||||
obj_icon_state = "tophat"
|
||||
name = "Fancy Beepsky"
|
||||
desc = "It's a secbot, wearing a top hat! How fancy."
|
||||
|
||||
/datum/beepsky_fashion/fedora
|
||||
obj_icon_state = "fedora"
|
||||
name = "Fedorasky"
|
||||
desc = "It's a secbot, wearing a fedora!"
|
||||
|
||||
/datum/beepsky_fashion/sombrero
|
||||
obj_icon_state = "sombrero"
|
||||
name = "Sombrerosky"
|
||||
desc = "A secbot wearing a sombrero. Truly, a hombre to all."
|
||||
|
||||
/datum/beepsky_fashion/santa
|
||||
obj_icon_state = "santa"
|
||||
name = "Saint Beepsky"
|
||||
desc = "Have you been a level 7 infraction this holiday season?"
|
||||
capture_one = "BOT is tying CRIMINAL up with fairy lights!"
|
||||
capture_two = "BOT is tying you up with fairy lights!"
|
||||
infraction = "Level THREAT_LEVEL threat to holiday cheer spotted!"
|
||||
attack_one = "BOT crushes CRIMINAL with their holiday spirit!"
|
||||
attack_two = "BOT crushes you with their holiday spirit!"
|
||||
arrest_emote = "ARREST_TYPE level THREAT_LEVEL threat to holiday cheer in LOCATION"
|
||||
|
||||
@@ -103,8 +103,7 @@
|
||||
. = ..()
|
||||
QDEL_IN(src, 300)
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/effect/hallucination/simple/bluespace_stream/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
/obj/effect/hallucination/simple/bluespace_stream/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
if(user != seer || !linked_to)
|
||||
return
|
||||
var/slip_in_message = pick("slides sideways in an odd way, and disappears", "jumps into an unseen dimension",\
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -324,6 +324,13 @@
|
||||
result = /obj/item/toy/sword/cx
|
||||
subcategory = CAT_MISCELLANEOUS
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/catgirlplushie
|
||||
name = "Catgirl Plushie"
|
||||
reqs = list(/obj/item/toy/plush/hairball = 3)
|
||||
result = /obj/item/toy/plush/catgirl
|
||||
subcategory = CAT_MISCELLANEOUS
|
||||
category = CAT_MISC
|
||||
|
||||
////////////
|
||||
//Unsorted//
|
||||
|
||||
@@ -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////////////////
|
||||
////////////////////////////////////////
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -98,16 +98,16 @@
|
||||
|
||||
/datum/component/simple_rotation/proc/HandRot(datum/source, mob/user, rotation = default_rotation_direction)
|
||||
if(can_be_rotated)
|
||||
if(!can_be_rotated.Invoke(user, default_rotation_direction))
|
||||
if(!can_be_rotated.Invoke(user, rotation))
|
||||
return
|
||||
else
|
||||
if(!default_can_be_rotated(user, default_rotation_direction))
|
||||
if(!default_can_be_rotated(user, rotation))
|
||||
return
|
||||
if(can_user_rotate)
|
||||
if(!can_user_rotate.Invoke(user, default_rotation_direction))
|
||||
if(!can_user_rotate.Invoke(user, rotation))
|
||||
return
|
||||
else
|
||||
if(!default_can_user_rotate(user, default_rotation_direction))
|
||||
if(!default_can_user_rotate(user, rotation))
|
||||
return
|
||||
BaseRot(user, rotation)
|
||||
return TRUE
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
+6
-6
@@ -131,9 +131,9 @@
|
||||
L[DNA_FACIAL_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.facial_hair_color)
|
||||
L[DNA_SKIN_TONE_BLOCK] = construct_block(GLOB.skin_tones.Find(H.skin_tone), GLOB.skin_tones.len)
|
||||
L[DNA_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.eye_color)
|
||||
L[DNA_COLOR_ONE_BLOCK] = sanitize_hexcolor(features["mcolor"])
|
||||
L[DNA_COLOR_TWO_BLOCK] = sanitize_hexcolor(features["mcolor2"])
|
||||
L[DNA_COLOR_THREE_BLOCK] = sanitize_hexcolor(features["mcolor3"])
|
||||
L[DNA_COLOR_ONE_BLOCK] = sanitize_hexcolor(features["mcolor"], 6)
|
||||
L[DNA_COLOR_TWO_BLOCK] = sanitize_hexcolor(features["mcolor2"], 6)
|
||||
L[DNA_COLOR_THREE_BLOCK] = sanitize_hexcolor(features["mcolor3"], 6)
|
||||
if(!GLOB.mam_tails_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list)
|
||||
L[DNA_MUTANTTAIL_BLOCK] = construct_block(GLOB.mam_tails_list.Find(features["mam_tail"]), GLOB.mam_tails_list.len)
|
||||
@@ -239,11 +239,11 @@
|
||||
if(DNA_HAIR_STYLE_BLOCK)
|
||||
setblock(uni_identity, blocknumber, construct_block(GLOB.hair_styles_list.Find(H.hair_style), GLOB.hair_styles_list.len))
|
||||
if(DNA_COLOR_ONE_BLOCK)
|
||||
sanitize_hexcolor(features["mcolor"])
|
||||
sanitize_hexcolor(features["mcolor"], 6)
|
||||
if(DNA_COLOR_TWO_BLOCK)
|
||||
sanitize_hexcolor(features["mcolor2"])
|
||||
sanitize_hexcolor(features["mcolor2"], 6)
|
||||
if(DNA_COLOR_THREE_BLOCK)
|
||||
sanitize_hexcolor(features["mcolor3"])
|
||||
sanitize_hexcolor(features["mcolor3"], 6)
|
||||
if(DNA_MUTANTTAIL_BLOCK)
|
||||
construct_block(GLOB.mam_tails_list.Find(features["mam_tail"]), GLOB.mam_tails_list.len)
|
||||
if(DNA_MUTANTEAR_BLOCK)
|
||||
|
||||
@@ -38,7 +38,6 @@
|
||||
corgI.color = obj_color
|
||||
return corgI
|
||||
|
||||
|
||||
/datum/dog_fashion/head
|
||||
icon_file = 'icons/mob/corgi_head.dmi'
|
||||
|
||||
@@ -53,7 +52,6 @@
|
||||
name = "Sous chef REAL_NAME"
|
||||
desc = "Your food will be taste-tested. All of it."
|
||||
|
||||
|
||||
/datum/dog_fashion/head/captain
|
||||
name = "Captain REAL_NAME"
|
||||
desc = "Probably better than the last captain."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -60,6 +60,7 @@
|
||||
output_atoms -= remove_thing
|
||||
if(init_timerid)
|
||||
deltimer(init_timerid)
|
||||
init_timerid = null
|
||||
if(!timerid)
|
||||
return
|
||||
on_stop()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -274,3 +274,13 @@
|
||||
description = "<span class='warning'>I've produced better art than that from my ass.</span>\n"
|
||||
mood_change = -2
|
||||
timeout = 1200
|
||||
|
||||
/datum/mood_event/tripped
|
||||
description = "<span class='boldwarning'>I can't believe I fell for the oldest trick in the book!</span>\n"
|
||||
mood_change = -6
|
||||
timeout = 2 MINUTES
|
||||
|
||||
/datum/mood_event/untied
|
||||
description = "<span class='boldwarning'>I hate when my shoes come untied!</span>\n"
|
||||
mood_change = -3
|
||||
timeout = 1 MINUTES
|
||||
|
||||
@@ -196,3 +196,7 @@
|
||||
description = "<span class='nicegreen'>That work of art was so great it made me believe in the goodness of humanity. Says a lot in a place like this.</span>\n"
|
||||
mood_change = 4
|
||||
timeout = 4 MINUTES
|
||||
|
||||
/datum/mood_event/cleared_stomach
|
||||
description = "<span class='nicegreen'>Feels nice to get that out of the way!</span>\n"
|
||||
mood_change = 3
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -21,7 +21,29 @@
|
||||
|
||||
/datum/mutation/human/hulk/on_attack_hand(atom/target, proximity, act_intent, unarmed_attack_flags)
|
||||
if(proximity && (act_intent == INTENT_HARM)) //no telekinetic hulk attack
|
||||
return target.attack_hulk(owner)
|
||||
if(!owner.CheckActionCooldown(CLICK_CD_MELEE))
|
||||
return INTERRUPT_UNARMED_ATTACK | NO_AUTO_CLICKDELAY_HANDLING
|
||||
owner.DelayNextAction()
|
||||
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)
|
||||
|
||||
@@ -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."
|
||||
@@ -144,7 +159,6 @@
|
||||
id = "tased"
|
||||
alert_type = null
|
||||
var/movespeed_mod = /datum/movespeed_modifier/status_effect/tased
|
||||
var/nextmove_modifier = 1
|
||||
var/stamdmg_per_ds = 0 //a 20 duration would do 20 stamdmg, disablers do 24 or something
|
||||
var/last_tick = 0 //fastprocess processing speed is a goddamn sham, don't trust it.
|
||||
|
||||
@@ -173,13 +187,9 @@
|
||||
C.adjustStaminaLoss(max(0, stamdmg_per_ds * diff)) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing.
|
||||
last_tick = world.time
|
||||
|
||||
/datum/status_effect/electrode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y
|
||||
return nextmove_modifier
|
||||
|
||||
/datum/status_effect/electrode/no_combat_mode
|
||||
id = "tased_strong"
|
||||
movespeed_mod = /datum/movespeed_modifier/status_effect/tased/no_combat_mode
|
||||
nextmove_modifier = 2
|
||||
blocks_combatmode = TRUE
|
||||
stamdmg_per_ds = 1
|
||||
|
||||
@@ -438,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)
|
||||
@@ -552,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)
|
||||
|
||||
@@ -90,13 +90,12 @@
|
||||
return
|
||||
duration = world.time + original_duration
|
||||
|
||||
//clickdelay/nextmove modifiers!
|
||||
/datum/status_effect/proc/nextmove_modifier()
|
||||
/**
|
||||
* Multiplied to clickdelays
|
||||
*/
|
||||
/datum/status_effect/proc/action_cooldown_mod()
|
||||
return 1
|
||||
|
||||
/datum/status_effect/proc/nextmove_adjust()
|
||||
return 0
|
||||
|
||||
////////////////
|
||||
// ALERT HOOK //
|
||||
////////////////
|
||||
|
||||
@@ -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/nextmove_modifier()
|
||||
/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"
|
||||
|
||||
@@ -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,9 +54,9 @@ 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 = pick(/obj/item/clothing/neck/stethoscope, /obj/item/bodybag)
|
||||
heirloom_type = /obj/item/lighter
|
||||
if("Station Engineer")
|
||||
heirloom_type = /obj/item/wirecutters/brass
|
||||
if("Atmospheric Technician")
|
||||
@@ -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))
|
||||
|
||||
@@ -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]"
|
||||
@@ -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
@@ -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."
|
||||
|
||||
+42
-69
@@ -1,14 +1,14 @@
|
||||
|
||||
|
||||
|
||||
// TODO: well, a lot really, but specifically I want to add potential fusing of clothing/equipment on the affected area, and limb infections, though those may go in body part code
|
||||
/datum/wound/burn
|
||||
a_or_from = "from"
|
||||
wound_type = WOUND_LIST_BURN
|
||||
wound_type = WOUND_BURN
|
||||
processes = TRUE
|
||||
sound_effect = 'sound/effects/sizzle1.ogg'
|
||||
sound_effect = 'sound/effects/wounds/sizzle1.ogg'
|
||||
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE)
|
||||
|
||||
treatable_by = list(/obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) // sterilizer and alcohol will require reagent treatments, coming soon
|
||||
treatable_by = list(/obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) // sterilizer and alcohol will require reagent treatments, coming soon
|
||||
|
||||
// Flesh damage vars
|
||||
/// How much damage to our flesh we currently have. Once both this and infestation reach 0, the wound is considered healed
|
||||
@@ -27,8 +27,6 @@
|
||||
/// Once we reach infestation beyond WOUND_INFESTATION_SEPSIS, we get this many warnings before the limb is completely paralyzed (you'd have to ignore a really bad burn for a really long time for this to happen)
|
||||
var/strikes_to_lose_limb = 3
|
||||
|
||||
/// The current bandage we have for this wound (maybe move bandages to the limb?)
|
||||
var/obj/item/stack/current_bandage
|
||||
|
||||
/datum/wound/burn/handle_process()
|
||||
. = ..()
|
||||
@@ -47,15 +45,11 @@
|
||||
sanitization += 0.3
|
||||
flesh_healing += 0.5
|
||||
|
||||
if(current_bandage)
|
||||
current_bandage.absorption_capacity -= WOUND_BURN_SANITIZATION_RATE
|
||||
if(current_bandage.absorption_capacity <= 0)
|
||||
victim.visible_message("<span class='danger'>Pus soaks through \the [current_bandage] on [victim]'s [limb.name].</span>", "<span class='warning'>Pus soaks through \the [current_bandage] on your [limb.name].</span>", vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
QDEL_NULL(current_bandage)
|
||||
treat_priority = TRUE
|
||||
if(limb.current_gauze)
|
||||
limb.seep_gauze(WOUND_BURN_SANITIZATION_RATE)
|
||||
|
||||
if(flesh_healing > 0)
|
||||
var/bandage_factor = (current_bandage ? current_bandage.splint_factor : 1)
|
||||
var/bandage_factor = (limb.current_gauze ? limb.current_gauze.splint_factor : 1)
|
||||
flesh_damage = max(0, flesh_damage - 1)
|
||||
flesh_healing = max(0, flesh_healing - bandage_factor) // good bandages multiply the length of flesh healing
|
||||
|
||||
@@ -67,7 +61,7 @@
|
||||
|
||||
// sanitization is checked after the clearing check but before the rest, because we freeze the effects of infection while we have sanitization
|
||||
if(sanitization > 0)
|
||||
var/bandage_factor = (current_bandage ? current_bandage.splint_factor : 1)
|
||||
var/bandage_factor = (limb.current_gauze ? limb.current_gauze.splint_factor : 1)
|
||||
infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE)
|
||||
sanitization = max(0, sanitization - (WOUND_BURN_SANITIZATION_RATE * bandage_factor))
|
||||
return
|
||||
@@ -122,10 +116,10 @@
|
||||
if(strikes_to_lose_limb <= 0)
|
||||
return "<span class='deadsay'><B>[victim.p_their(TRUE)] [limb.name] is completely dead and unrecognizable as organic.</B></span>"
|
||||
|
||||
var/condition = ""
|
||||
if(current_bandage)
|
||||
var/list/condition = list("[victim.p_their(TRUE)] [limb.name] [examine_desc]")
|
||||
if(limb.current_gauze)
|
||||
var/bandage_condition
|
||||
switch(current_bandage.absorption_capacity)
|
||||
switch(limb.current_gauze.absorption_capacity)
|
||||
if(0 to 1.25)
|
||||
bandage_condition = "nearly ruined "
|
||||
if(1.25 to 2.75)
|
||||
@@ -135,7 +129,7 @@
|
||||
if(4 to INFINITY)
|
||||
bandage_condition = "clean "
|
||||
|
||||
condition += " underneath a dressing of [bandage_condition] [current_bandage.name]"
|
||||
condition += " underneath a dressing of [bandage_condition] [limb.current_gauze.name]"
|
||||
else
|
||||
switch(infestation)
|
||||
if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE)
|
||||
@@ -149,7 +143,7 @@
|
||||
else
|
||||
condition += "!"
|
||||
|
||||
return "<B>[victim.p_their(TRUE)] [limb.name] [examine_desc][condition]</B>"
|
||||
return "<B>[condition.Join()]</B>"
|
||||
|
||||
/datum/wound/burn/get_scanner_description(mob/user)
|
||||
if(strikes_to_lose_limb == 0)
|
||||
@@ -186,7 +180,7 @@
|
||||
/// if someone is using ointment on our burns
|
||||
/datum/wound/burn/proc/ointment(obj/item/stack/medical/ointment/I, mob/user)
|
||||
user.visible_message("<span class='notice'>[user] begins applying [I] to [victim]'s [limb.name]...</span>", "<span class='notice'>You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]...</span>")
|
||||
if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target = victim))
|
||||
if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
return
|
||||
|
||||
limb.heal_damage(I.heal_brute, I.heal_burn)
|
||||
@@ -200,36 +194,6 @@
|
||||
else
|
||||
try_treating(I, user)
|
||||
|
||||
/// for use in the burn dressing surgery since we don't want to make them do another do_after obviously
|
||||
/datum/wound/burn/proc/force_bandage(obj/item/stack/medical/gauze/I, mob/user)
|
||||
QDEL_NULL(current_bandage)
|
||||
current_bandage = new I.type(limb)
|
||||
current_bandage.amount = 1
|
||||
treat_priority = FALSE
|
||||
sanitization += I.sanitization
|
||||
I.use(1)
|
||||
|
||||
/// if someone is wrapping gauze on our burns
|
||||
/datum/wound/burn/proc/bandage(obj/item/stack/medical/gauze/I, mob/user)
|
||||
if(current_bandage)
|
||||
if(current_bandage.absorption_capacity > I.absorption_capacity + 1)
|
||||
to_chat(user, "<span class='warning'>The [current_bandage] on [victim]'s [limb.name] is still in better condition than your [I.name]!</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] begins to redress the burns on [victim]'s [limb.name] with [I]...</span>", "<span class='warning'>You begin redressing the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] begins to dress the burns on [victim]'s [limb.name] with [I]...</span>", "<span class='notice'>You begin dressing the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
|
||||
|
||||
if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
return
|
||||
|
||||
user.visible_message("<span class='green'>[user] applies [I] to [victim].</span>", "<span class='green'>You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.name].</span>")
|
||||
QDEL_NULL(current_bandage)
|
||||
current_bandage = new I.type(limb)
|
||||
current_bandage.amount = 1
|
||||
treat_priority = FALSE
|
||||
sanitization += I.sanitization
|
||||
I.use(1)
|
||||
|
||||
/// if someone is using mesh on our burns
|
||||
/datum/wound/burn/proc/mesh(obj/item/stack/medical/mesh/I, mob/user)
|
||||
user.visible_message("<span class='notice'>[user] begins wrapping [victim]'s [limb.name] with [I]...</span>", "<span class='notice'>You begin wrapping [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
|
||||
@@ -249,7 +213,7 @@
|
||||
|
||||
/// Paramedic UV penlights
|
||||
/datum/wound/burn/proc/uv(obj/item/flashlight/pen/paramedic/I, mob/user)
|
||||
if(I.uv_cooldown > world.time)
|
||||
if(!COOLDOWN_FINISHED(I, uv_cooldown))
|
||||
to_chat(user, "<span class='notice'>[I] is still recharging!</span>")
|
||||
return
|
||||
if(infestation <= 0 || infestation < sanitization)
|
||||
@@ -258,20 +222,29 @@
|
||||
|
||||
user.visible_message("<span class='notice'>[user] flashes the burns on [victim]'s [limb] with [I].</span>", "<span class='notice'>You flash the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I].</span>", vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
sanitization += I.uv_power
|
||||
I.uv_cooldown = world.time + I.uv_cooldown_length
|
||||
COOLDOWN_START(I, uv_cooldown, I.uv_cooldown_length)
|
||||
|
||||
/datum/wound/burn/treat(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/stack/medical/gauze))
|
||||
bandage(I, user)
|
||||
else if(istype(I, /obj/item/stack/medical/ointment))
|
||||
if(istype(I, /obj/item/stack/medical/ointment))
|
||||
ointment(I, user)
|
||||
else if(istype(I, /obj/item/stack/medical/mesh))
|
||||
mesh(I, user)
|
||||
else if(istype(I, /obj/item/flashlight/pen/paramedic))
|
||||
uv(I, user)
|
||||
|
||||
/// basic support for instabitaluri/synthflesh healing flesh damage, more chem support in the future
|
||||
/datum/wound/burn/proc/regenerate_flesh(amount)
|
||||
// people complained about burns not healing on stasis beds, so in addition to checking if it's cured, they also get the special ability to very slowly heal on stasis beds if they have the healing effects stored
|
||||
/datum/wound/burn/on_stasis()
|
||||
. = ..()
|
||||
if(flesh_healing > 0)
|
||||
flesh_damage = max(0, flesh_damage - 0.2)
|
||||
if((flesh_damage <= 0) && (infestation <= 1))
|
||||
to_chat(victim, "<span class='green'>The burns on your [limb.name] have cleared up!</span>")
|
||||
qdel(src)
|
||||
return
|
||||
if(sanitization > 0)
|
||||
infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE * 0.2)
|
||||
|
||||
/datum/wound/burn/on_synthflesh(amount)
|
||||
flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard
|
||||
|
||||
// we don't even care about first degree burns, straight to second
|
||||
@@ -282,12 +255,12 @@
|
||||
examine_desc = "is badly burned and breaking out in blisters"
|
||||
occur_text = "breaks out with violent red burns"
|
||||
severity = WOUND_SEVERITY_MODERATE
|
||||
damage_mulitplier_penalty = 1.1
|
||||
threshold_minimum = 40
|
||||
damage_mulitplier_penalty = 1.05
|
||||
threshold_minimum = 50
|
||||
threshold_penalty = 30 // burns cause significant decrease in limb integrity compared to other wounds
|
||||
status_effect_type = /datum/status_effect/wound/burn/moderate
|
||||
flesh_damage = 5
|
||||
scarring_descriptions = list("small amoeba-shaped skinmarks", "a faded streak of depressed skin")
|
||||
scar_keyword = "burnmoderate"
|
||||
|
||||
/datum/wound/burn/severe
|
||||
name = "Third Degree Burns"
|
||||
@@ -296,14 +269,14 @@
|
||||
examine_desc = "appears seriously charred, with aggressive red splotches"
|
||||
occur_text = "chars rapidly, exposing ruined tissue and spreading angry red burns"
|
||||
severity = WOUND_SEVERITY_SEVERE
|
||||
damage_mulitplier_penalty = 1.2
|
||||
threshold_minimum = 80
|
||||
damage_mulitplier_penalty = 1.1
|
||||
threshold_minimum = 90
|
||||
threshold_penalty = 40
|
||||
status_effect_type = /datum/status_effect/wound/burn/severe
|
||||
treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh)
|
||||
treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh)
|
||||
infestation_rate = 0.05 // appx 13 minutes to reach sepsis without any treatment
|
||||
flesh_damage = 12.5
|
||||
scarring_descriptions = list("a large, jagged patch of faded skin", "random spots of shiny, smooth skin", "spots of taut, leathery skin")
|
||||
scar_keyword = "burnsevere"
|
||||
|
||||
/datum/wound/burn/critical
|
||||
name = "Catastrophic Burns"
|
||||
@@ -312,12 +285,12 @@
|
||||
examine_desc = "is a ruined mess of blanched bone, melted fat, and charred tissue"
|
||||
occur_text = "vaporizes as flesh, bone, and fat melt together in a horrifying mess"
|
||||
severity = WOUND_SEVERITY_CRITICAL
|
||||
damage_mulitplier_penalty = 1.3
|
||||
sound_effect = 'sound/effects/sizzle2.ogg'
|
||||
threshold_minimum = 140
|
||||
damage_mulitplier_penalty = 1.15
|
||||
sound_effect = 'sound/effects/wounds/sizzle2.ogg'
|
||||
threshold_minimum = 150
|
||||
threshold_penalty = 80
|
||||
status_effect_type = /datum/status_effect/wound/burn/critical
|
||||
treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh)
|
||||
treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh)
|
||||
infestation_rate = 0.15 // appx 4.33 minutes to reach sepsis without any treatment
|
||||
flesh_damage = 20
|
||||
scarring_descriptions = list("massive, disfiguring keloid scars", "several long streaks of badly discolored and malformed skin", "unmistakeable splotches of dead tissue from serious burns")
|
||||
scar_keyword = "burncritical"
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
/datum/wound/loss
|
||||
name = "Dismembered"
|
||||
desc = "oof ouch!!"
|
||||
|
||||
sound_effect = 'sound/effects/dismember.ogg'
|
||||
severity = WOUND_SEVERITY_LOSS
|
||||
threshold_minimum = 180
|
||||
status_effect_type = null
|
||||
scar_keyword = "dismember"
|
||||
wound_flags = null
|
||||
|
||||
/// Our special proc for our special dismembering, the wounding type only matters for what text we have
|
||||
/datum/wound/loss/proc/apply_dismember(obj/item/bodypart/dismembered_part, wounding_type=WOUND_SLASH)
|
||||
if(!istype(dismembered_part) || !dismembered_part.owner || !(dismembered_part.body_zone in viable_zones) || isalien(dismembered_part.owner) || !dismembered_part.can_dismember())
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
already_scarred = TRUE // so we don't scar a limb we don't have. If I add different levels of amputation desc, do it here
|
||||
|
||||
switch(wounding_type)
|
||||
if(WOUND_BLUNT)
|
||||
occur_text = "is shattered through the last bone holding it together, severing it completely!"
|
||||
if(WOUND_SLASH)
|
||||
occur_text = "is slashed through the last tissue holding it together, severing it completely!"
|
||||
if(WOUND_PIERCE)
|
||||
occur_text = "is pierced through the last tissue holding it together, severing it completely!"
|
||||
if(WOUND_BURN)
|
||||
occur_text = "is completely incinerated, falling to dust!"
|
||||
|
||||
victim = dismembered_part.owner
|
||||
|
||||
var/msg = "<span class='bolddanger'>[victim]'s [dismembered_part.name] [occur_text]!</span>"
|
||||
|
||||
victim.visible_message(msg, "<span class='userdanger'>Your [dismembered_part.name] [occur_text]!</span>")
|
||||
|
||||
limb = dismembered_part
|
||||
severity = WOUND_SEVERITY_LOSS
|
||||
second_wind()
|
||||
log_wound(victim, src)
|
||||
dismembered_part.dismember(wounding_type == WOUND_BURN ? BURN : BRUTE)
|
||||
qdel(src)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user