Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -5103,7 +5103,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
|
||||
@@ -30888,7 +30888,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{
|
||||
@@ -53679,9 +53679,6 @@
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/crew_quarters/toilet)
|
||||
"dVU" = (
|
||||
/turf/open/floor/plating,
|
||||
/area/space/nearstation)
|
||||
"dXq" = (
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
|
||||
dir = 4
|
||||
@@ -53734,7 +53731,7 @@
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 6
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/space/nearstation)
|
||||
"egt" = (
|
||||
/obj/effect/turf_decal/tile/bar,
|
||||
@@ -54363,7 +54360,7 @@
|
||||
"fIs" = (
|
||||
/obj/structure/grille,
|
||||
/obj/structure/lattice,
|
||||
/turf/open/floor/plating,
|
||||
/turf/open/space/basic,
|
||||
/area/space/nearstation)
|
||||
"fJY" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
@@ -54521,19 +54518,6 @@
|
||||
},
|
||||
/turf/open/floor/carpet,
|
||||
/area/crew_quarters/cryopod)
|
||||
"ghq" = (
|
||||
/obj/structure/lattice/catwalk,
|
||||
/obj/item/stack/marker_beacon{
|
||||
anchored = 1;
|
||||
icon_state = "markerburgundy-on";
|
||||
light_color = "#FA644B";
|
||||
light_power = 3;
|
||||
light_range = 3;
|
||||
name = "Docking Beacon";
|
||||
picked_color = "Burgundy"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/space/nearstation)
|
||||
"ghD" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -54690,7 +54674,7 @@
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 9
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/space/nearstation)
|
||||
"gJi" = (
|
||||
/obj/structure/lattice/catwalk,
|
||||
@@ -54926,7 +54910,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,
|
||||
@@ -57288,7 +57272,7 @@
|
||||
/area/crew_quarters/theatre)
|
||||
"oyN" = (
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/turf/open/floor/plating,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/space/nearstation)
|
||||
"oyX" = (
|
||||
/obj/machinery/atmospherics/components/binary/pump/on{
|
||||
@@ -58127,7 +58111,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
|
||||
@@ -58410,7 +58394,7 @@
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/space/nearstation)
|
||||
"slk" = (
|
||||
/obj/machinery/door/airlock/maintenance{
|
||||
@@ -58667,9 +58651,6 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/engine/engine_smes)
|
||||
"sQX" = (
|
||||
/turf/open/floor/plating,
|
||||
/area/space)
|
||||
"sRH" = (
|
||||
/obj/machinery/autolathe/secure{
|
||||
name = "public autolathe"
|
||||
@@ -58786,7 +58767,7 @@
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 5
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/space/nearstation)
|
||||
"trb" = (
|
||||
/obj/machinery/light{
|
||||
@@ -59009,7 +58990,7 @@
|
||||
/area/hallway/primary/central)
|
||||
"uaw" = (
|
||||
/obj/machinery/power/apc{
|
||||
areastring = "/area/storage/art";
|
||||
areastring = "/area/maintenance/bar";
|
||||
dir = 1;
|
||||
name = "Maint bar";
|
||||
pixel_y = 24
|
||||
@@ -59422,7 +59403,7 @@
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/space/nearstation)
|
||||
"vbi" = (
|
||||
/obj/structure/table,
|
||||
@@ -60521,7 +60502,7 @@
|
||||
name = "Docking Beacon";
|
||||
picked_color = "Burgundy"
|
||||
},
|
||||
/turf/open/space/basic,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/space/nearstation)
|
||||
"xOx" = (
|
||||
/obj/structure/chair/comfy/brown{
|
||||
@@ -66754,11 +66735,11 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
ghq
|
||||
xLX
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
ghq
|
||||
xLX
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -67005,9 +66986,9 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
ghq
|
||||
xLX
|
||||
aaa
|
||||
ghq
|
||||
xLX
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -67019,9 +67000,9 @@ gXs
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
ghq
|
||||
xLX
|
||||
aaa
|
||||
ghq
|
||||
xLX
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -76570,7 +76551,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -76827,7 +76808,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -77084,7 +77065,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -77341,7 +77322,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -77598,7 +77579,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -77855,7 +77836,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -78112,7 +78093,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aoV
|
||||
bZm
|
||||
@@ -78369,13 +78350,13 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aoV
|
||||
bVz
|
||||
aaf
|
||||
aaf
|
||||
sQX
|
||||
aoV
|
||||
aaa
|
||||
aaS
|
||||
aaf
|
||||
@@ -78626,7 +78607,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
bVz
|
||||
@@ -78883,7 +78864,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
gJi
|
||||
aaa
|
||||
aaf
|
||||
bVz
|
||||
@@ -79140,7 +79121,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aag
|
||||
gJi
|
||||
aaa
|
||||
aaf
|
||||
bVz
|
||||
@@ -84190,7 +84171,7 @@ aaa
|
||||
aaa
|
||||
gXs
|
||||
gXs
|
||||
dVU
|
||||
aaH
|
||||
abc
|
||||
abu
|
||||
abu
|
||||
|
||||
@@ -32681,6 +32681,10 @@
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/light{
|
||||
dir = 1;
|
||||
light_color = "#cee5d2"
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/aisat/foyer)
|
||||
"blC" = (
|
||||
@@ -36118,13 +36122,9 @@
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/aisat_interior)
|
||||
"bsf" = (
|
||||
/obj/machinery/light,
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/aisat/foyer)
|
||||
"bsg" = (
|
||||
@@ -37682,16 +37682,10 @@
|
||||
/turf/closed/wall,
|
||||
/area/aisat)
|
||||
"bvu" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/radio/off{
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/item/screwdriver{
|
||||
pixel_y = 10
|
||||
},
|
||||
/obj/machinery/announcement_system,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/tcommsat/computer)
|
||||
"bvv" = (
|
||||
@@ -40188,12 +40182,15 @@
|
||||
/area/tcommsat/computer)
|
||||
"bAW" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/folder/blue,
|
||||
/obj/machinery/status_display/evac{
|
||||
pixel_y = 31
|
||||
},
|
||||
/obj/item/folder/blue,
|
||||
/obj/item/pen,
|
||||
/obj/item/radio/off{
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/item/screwdriver{
|
||||
pixel_y = 10
|
||||
},
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/tcommsat/computer)
|
||||
"bAX" = (
|
||||
@@ -42716,9 +42713,12 @@
|
||||
/turf/open/floor/carpet,
|
||||
/area/crew_quarters/theatre)
|
||||
"bGh" = (
|
||||
/obj/machinery/announcement_system,
|
||||
/turf/open/floor/plasteel/grimy,
|
||||
/area/tcommsat/computer)
|
||||
/obj/effect/turf_decal/tile/blue,
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/aisat/foyer)
|
||||
"bGj" = (
|
||||
/obj/machinery/vending/cola/random,
|
||||
/obj/machinery/newscaster{
|
||||
@@ -81595,6 +81595,10 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hallway/primary/port)
|
||||
"jQK" = (
|
||||
/obj/structure/lattice,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/aisat)
|
||||
"jRo" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/machinery/newscaster{
|
||||
@@ -81912,6 +81916,16 @@
|
||||
/obj/machinery/door/firedoor,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hallway/primary/port)
|
||||
"nix" = (
|
||||
/obj/machinery/light/small{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue,
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/aisat/foyer)
|
||||
"njd" = (
|
||||
/obj/machinery/atmospherics/components/binary/pump{
|
||||
dir = 8;
|
||||
@@ -82580,6 +82594,13 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/starboard)
|
||||
"txh" = (
|
||||
/obj/machinery/door/airlock/hatch{
|
||||
name = "Telecomms Control Room";
|
||||
req_one_access_txt = "19; 61"
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/tcommsat/computer)
|
||||
"txj" = (
|
||||
/obj/structure/chair/office/light{
|
||||
dir = 1
|
||||
@@ -136361,9 +136382,9 @@ bnw
|
||||
bpJ
|
||||
brW
|
||||
aRy
|
||||
bvt
|
||||
aaa
|
||||
aTU
|
||||
aRy
|
||||
aRy
|
||||
jQK
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -136617,9 +136638,9 @@ blC
|
||||
bnx
|
||||
bpK
|
||||
bsf
|
||||
aRy
|
||||
aRy
|
||||
aRy
|
||||
bGh
|
||||
nix
|
||||
bGh
|
||||
aRy
|
||||
aRy
|
||||
aRy
|
||||
@@ -136876,7 +136897,7 @@ bpL
|
||||
brY
|
||||
btL
|
||||
btL
|
||||
btL
|
||||
txh
|
||||
btL
|
||||
btL
|
||||
bCD
|
||||
@@ -137133,7 +137154,7 @@ bpM
|
||||
brZ
|
||||
btL
|
||||
bvu
|
||||
bGh
|
||||
bxq
|
||||
bzn
|
||||
bAU
|
||||
bCD
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -80,6 +80,7 @@
|
||||
#define ADMIN_PUNISHMENT_SCARIFY "Scarify"
|
||||
#define ADMIN_PUNISHMENT_PICKLE "Pickle-ify"
|
||||
#define ADMIN_PUNISHMENT_FRY "Fry"
|
||||
#define ADMIN_PUNISHMENT_PERFORATE ":B:erforate"
|
||||
|
||||
#define AHELP_ACTIVE 1
|
||||
#define AHELP_CLOSED 2
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ GLOBAL_VAR_INIT(script_scripture_unlocked, FALSE) //If script scripture is avail
|
||||
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"
|
||||
|
||||
@@ -154,9 +154,10 @@
|
||||
#define SHOVE_KNOCKDOWN_HUMAN 30
|
||||
#define SHOVE_KNOCKDOWN_TABLE 30
|
||||
#define SHOVE_KNOCKDOWN_COLLATERAL 10
|
||||
//for the shove slowdown, see __DEFINES/movespeed_modification.dm
|
||||
#define SHOVE_SLOWDOWN_LENGTH 30
|
||||
#define SHOVE_SLOWDOWN_STRENGTH 0.85 //multiplier
|
||||
/// how long they're staggered for
|
||||
#define SHOVE_STAGGER_DURATION 35
|
||||
/// how long they're off balance for
|
||||
#define SHOVE_OFFBALANCE_DURATION 30
|
||||
//Shove disarming item list
|
||||
GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
|
||||
/obj/item/gun)))
|
||||
@@ -208,9 +209,9 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
|
||||
#define GUN_AIMING_TIME (2 SECONDS)
|
||||
|
||||
//Object/Item sharpness
|
||||
#define IS_BLUNT 0
|
||||
#define IS_SHARP 1
|
||||
#define IS_SHARP_ACCURATE 2
|
||||
#define SHARP_NONE 0
|
||||
#define SHARP_EDGED 1
|
||||
#define SHARP_POINTY 2
|
||||
|
||||
//His Grace.
|
||||
#define HIS_GRACE_SATIATED 0 //He hungers not. If bloodthirst is set to this, His Grace is asleep.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -199,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 NOCATEGORY list("NOCATEGORY")
|
||||
#define NOSUBCATEGORY list("NOSUBCATEGORY")
|
||||
|
||||
|
||||
//backpack
|
||||
#define CATEGORY_BACKPACK "In backpack"
|
||||
#define SUBCATEGORY_BACKPACK_GENERAL "General" //basically anything that there's not enough of to have its own subcategory
|
||||
#define SUBCATEGORY_BACKPACK_TOYS "Toys"
|
||||
//neck
|
||||
#define CATEGORY_NECK "Neck"
|
||||
#define SUBCATEGORY_NECK_GENERAL "General"
|
||||
#define SUBCATEGORY_NECK_TIE "Ties"
|
||||
#define SUBCATEGORY_NECK_SCARVES "Scarves"
|
||||
|
||||
//mask
|
||||
#define CATEGORY_MASK "Mask"
|
||||
|
||||
//hands
|
||||
#define CATEGORY_HANDS "Hands"
|
||||
|
||||
//uniform
|
||||
#define CATEGORY_UNIFORM "Uniform" //there's so many types of uniform it's best to have lots of categories
|
||||
#define SUBCATEGORY_UNIFORM_GENERAL "General"
|
||||
#define SUBCATEGORY_UNIFORM_JOBS "Jobs"
|
||||
#define SUBCATEGORY_UNIFORM_SUITS "Suits"
|
||||
#define SUBCATEGORY_UNIFORM_SKIRTS "Skirts"
|
||||
#define SUBCATEGORY_UNIFORM_DRESSES "Dresses"
|
||||
#define SUBCATEGORY_UNIFORM_SWEATERS "Sweaters"
|
||||
#define SUBCATEGORY_UNIFORM_PANTS "Pants"
|
||||
#define SUBCATEGORY_UNIFORM_SHORTS "Shorts"
|
||||
|
||||
//suit
|
||||
#define CATEGORY_SUIT "Suit"
|
||||
#define SUBCATEGORY_SUIT_GENERAL "General"
|
||||
#define SUBCATEGORY_SUIT_COATS "Coats"
|
||||
#define SUBCATEGORY_SUIT_JACKETS "Jackets"
|
||||
#define SUBCATEGORY_SUIT_JOBS "Jobs"
|
||||
|
||||
//head
|
||||
#define CATEGORY_HEAD "Head"
|
||||
#define SUBCATEGORY_HEAD_GENERAL "General"
|
||||
#define SUBCATEGORY_HEAD_JOBS "Jobs"
|
||||
|
||||
//shoes
|
||||
#define CATEGORY_SHOES "Shoes"
|
||||
|
||||
//gloves
|
||||
#define CATEGORY_GLOVES "Gloves"
|
||||
|
||||
//glasses
|
||||
#define CATEGORY_GLASSES "Glasses"
|
||||
|
||||
//donator items
|
||||
#define 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.
|
||||
|
||||
@@ -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
|
||||
|
||||
+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)
|
||||
|
||||
+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(
|
||||
CATEGORY_BACKPACK = list(SUBCATEGORY_BACKPACK_GENERAL, SUBCATEGORY_BACKPACK_TOYS),
|
||||
CATEGORY_NECK = list(SUBCATEGORY_NECK_GENERAL, SUBCATEGORY_NECK_TIE, SUBCATEGORY_NECK_SCARVES),
|
||||
CATEGORY_MASK = NOSUBCATEGORY,
|
||||
CATEGORY_HANDS = NOSUBCATEGORY,
|
||||
CATEGORY_UNIFORM = list(SUBCATEGORY_UNIFORM_GENERAL, SUBCATEGORY_UNIFORM_JOBS, SUBCATEGORY_UNIFORM_SUITS, SUBCATEGORY_UNIFORM_SKIRTS, SUBCATEGORY_UNIFORM_DRESSES, SUBCATEGORY_UNIFORM_SWEATERS, SUBCATEGORY_UNIFORM_PANTS, SUBCATEGORY_UNIFORM_SHORTS),
|
||||
CATEGORY_SUIT = list(SUBCATEGORY_SUIT_GENERAL, SUBCATEGORY_SUIT_COATS, SUBCATEGORY_SUIT_JACKETS, SUBCATEGORY_SUIT_JOBS),
|
||||
CATEGORY_HEAD = list(SUBCATEGORY_HEAD_GENERAL, SUBCATEGORY_HEAD_JOBS),
|
||||
CATEGORY_SHOES = NOSUBCATEGORY,
|
||||
CATEGORY_GLOVES = NOSUBCATEGORY,
|
||||
CATEGORY_GLASSES = NOSUBCATEGORY,
|
||||
CATEGORY_DONATOR = NOSUBCATEGORY
|
||||
))
|
||||
@@ -238,25 +238,24 @@
|
||||
else
|
||||
return clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100
|
||||
|
||||
/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area, current_force)
|
||||
/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area, obj/item/bodypart/hit_bodypart)
|
||||
var/message_verb = "attacked"
|
||||
if(I.attack_verb && I.attack_verb.len)
|
||||
if(length(I.attack_verb))
|
||||
message_verb = "[pick(I.attack_verb)]"
|
||||
if(current_force < I.force * FEEBLE_ATTACK_MSG_THRESHOLD)
|
||||
message_verb = "[pick("feebly", "limply", "saplessly")] [message_verb]"
|
||||
else if(!I.force)
|
||||
return
|
||||
var/message_hit_area = ""
|
||||
if(hit_area)
|
||||
message_hit_area = " in the [hit_area]"
|
||||
var/attack_message = "[src] has been [message_verb][message_hit_area] with [I]."
|
||||
var/attack_message = "[src] is [message_verb][message_hit_area] with [I]!"
|
||||
var/attack_message_local = "You're [message_verb][message_hit_area] with [I]!"
|
||||
if(user in viewers(src, null))
|
||||
attack_message = "[user] has [message_verb] [src][message_hit_area] with [I]!"
|
||||
attack_message = "[user] [message_verb] [src][message_hit_area] with [I]!"
|
||||
attack_message_local = "[user] [message_verb] you[message_hit_area] with [I]!"
|
||||
if(user == src)
|
||||
attack_message_local = "You [message_verb] yourself[message_hit_area] with [I]"
|
||||
visible_message("<span class='danger'>[attack_message]</span>",\
|
||||
"<span class='userdanger'>[attack_message]</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
if(hit_area == BODY_ZONE_HEAD)
|
||||
if(prob(2))
|
||||
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
|
||||
"<span class='userdanger'>[attack_message_local]</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
return 1
|
||||
|
||||
/// How much stamina this takes to swing this is not for realism purposes hecc off.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -27,6 +27,24 @@
|
||||
target.attack_hulk(owner)
|
||||
return INTERRUPT_UNARMED_ATTACK | NO_AUTO_CLICKDELAY_HANDLING
|
||||
|
||||
/**
|
||||
*Checks damage of a hulk's arm and applies bone wounds as necessary.
|
||||
*
|
||||
*Called by specific atoms being attacked, such as walls. If an atom
|
||||
*does not call this proc, than punching that atom will not cause
|
||||
*arm breaking (even if the atom deals recoil damage to hulks).
|
||||
*Arguments:
|
||||
*arg1 is the arm to evaluate damage of and possibly break.
|
||||
*/
|
||||
/datum/mutation/human/hulk/proc/break_an_arm(obj/item/bodypart/arm)
|
||||
switch(arm.brute_dam)
|
||||
if(45 to 50)
|
||||
arm.force_wound_upwards(/datum/wound/blunt/critical)
|
||||
if(41 to 45)
|
||||
arm.force_wound_upwards(/datum/wound/blunt/severe)
|
||||
if(35 to 41)
|
||||
arm.force_wound_upwards(/datum/wound/blunt/moderate)
|
||||
|
||||
/datum/mutation/human/hulk/on_life()
|
||||
if(owner.health < 0)
|
||||
on_losing(owner)
|
||||
|
||||
@@ -97,6 +97,21 @@
|
||||
duration = set_duration
|
||||
return ..()
|
||||
|
||||
/datum/status_effect/off_balance
|
||||
id = "offbalance"
|
||||
alert_type = null
|
||||
|
||||
/datum/status_effect/off_balance/on_creation(mob/living/new_owner, set_duration)
|
||||
if(isnum(set_duration))
|
||||
duration = set_duration
|
||||
return ..()
|
||||
|
||||
/datum/status_effect/off_balance/on_remove()
|
||||
var/active_item = owner.get_active_held_item()
|
||||
if(is_type_in_typecache(active_item, GLOB.shove_disarming_types))
|
||||
owner.visible_message("<span class='warning'>[owner.name] regains their grip on \the [active_item]!</span>", "<span class='warning'>You regain your grip on \the [active_item]</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
return ..()
|
||||
|
||||
/obj/screen/alert/status_effect/asleep
|
||||
name = "Asleep"
|
||||
desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are."
|
||||
@@ -433,7 +448,7 @@
|
||||
var/still_bleeding = FALSE
|
||||
for(var/thing in throat.wounds)
|
||||
var/datum/wound/W = thing
|
||||
if(W.wound_type == WOUND_LIST_CUT && W.severity > WOUND_SEVERITY_MODERATE)
|
||||
if(W.wound_type == WOUND_SLASH && W.severity > WOUND_SEVERITY_MODERATE)
|
||||
still_bleeding = TRUE
|
||||
break
|
||||
if(!still_bleeding)
|
||||
@@ -547,8 +562,8 @@
|
||||
owner.DefaultCombatKnockdown(15, TRUE, FALSE, 15)
|
||||
if(iscarbon(owner))
|
||||
var/mob/living/carbon/C = owner
|
||||
C.silent = max(2, C.silent)
|
||||
C.stuttering = max(5, C.stuttering)
|
||||
C.silent = max(5, C.silent) //Increased, now lasts until five seconds after it ends, instead of 2
|
||||
C.stuttering = max(10, C.stuttering) //Increased, now lasts for five seconds after the mute ends, instead of 3
|
||||
if(!old_health)
|
||||
old_health = owner.health
|
||||
if(!old_oxyloss)
|
||||
|
||||
@@ -117,8 +117,7 @@
|
||||
|
||||
/datum/status_effect/wound/on_creation(mob/living/new_owner, incoming_wound)
|
||||
. = ..()
|
||||
var/datum/wound/W = incoming_wound
|
||||
linked_wound = W
|
||||
linked_wound = incoming_wound
|
||||
linked_limb = linked_wound.limb
|
||||
|
||||
/datum/status_effect/wound/on_remove()
|
||||
@@ -140,9 +139,9 @@
|
||||
|
||||
|
||||
// bones
|
||||
/datum/status_effect/wound/bone
|
||||
/datum/status_effect/wound/blunt
|
||||
|
||||
/datum/status_effect/wound/bone/interact_speed_modifier()
|
||||
/datum/status_effect/wound/blunt/interact_speed_modifier()
|
||||
var/mob/living/carbon/C = owner
|
||||
|
||||
if(C.get_active_hand() == linked_limb)
|
||||
@@ -151,7 +150,7 @@
|
||||
|
||||
return 1
|
||||
|
||||
/datum/status_effect/wound/bone/action_cooldown_mod()
|
||||
/datum/status_effect/wound/blunt/action_cooldown_mod()
|
||||
var/mob/living/carbon/C = owner
|
||||
|
||||
if(C.get_active_hand() == linked_limb)
|
||||
@@ -159,24 +158,34 @@
|
||||
|
||||
return 1
|
||||
|
||||
/datum/status_effect/wound/bone/moderate
|
||||
/datum/status_effect/wound/blunt/moderate
|
||||
id = "disjoint"
|
||||
/datum/status_effect/wound/bone/severe
|
||||
/datum/status_effect/wound/blunt/severe
|
||||
id = "hairline"
|
||||
|
||||
/datum/status_effect/wound/bone/critical
|
||||
/datum/status_effect/wound/blunt/critical
|
||||
id = "compound"
|
||||
|
||||
// cuts
|
||||
/datum/status_effect/wound/cut/moderate
|
||||
/datum/status_effect/wound/slash/moderate
|
||||
id = "abrasion"
|
||||
|
||||
/datum/status_effect/wound/cut/severe
|
||||
/datum/status_effect/wound/slash/severe
|
||||
id = "laceration"
|
||||
|
||||
/datum/status_effect/wound/cut/critical
|
||||
/datum/status_effect/wound/slash/critical
|
||||
id = "avulsion"
|
||||
|
||||
// pierce
|
||||
/datum/status_effect/wound/pierce/moderate
|
||||
id = "breakage"
|
||||
|
||||
/datum/status_effect/wound/pierce/severe
|
||||
id = "puncture"
|
||||
|
||||
/datum/status_effect/wound/pierce/critical
|
||||
id = "rupture"
|
||||
|
||||
// burns
|
||||
/datum/status_effect/wound/burn/moderate
|
||||
id = "seconddeg"
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
if(NOBLOOD in H.dna.species.species_traits) //can't lose blood if your species doesn't have any
|
||||
return
|
||||
else
|
||||
quirk_holder.blood_volume -= 0.275
|
||||
quirk_holder.blood_volume -= 0.2
|
||||
|
||||
/datum/quirk/depression
|
||||
name = "Depression"
|
||||
@@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
|
||||
if("Botanist")
|
||||
heirloom_type = pick(/obj/item/cultivator, /obj/item/reagent_containers/glass/bucket, /obj/item/storage/bag/plants, /obj/item/toy/plush/beeplushie)
|
||||
if("Medical Doctor")
|
||||
heirloom_type = /obj/item/healthanalyzer/advanced
|
||||
heirloom_type = /obj/item/healthanalyzer
|
||||
if("Paramedic")
|
||||
heirloom_type = /obj/item/lighter
|
||||
if("Station Engineer")
|
||||
@@ -337,10 +337,8 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
|
||||
dumb_thing = FALSE //only once per life
|
||||
if(prob(1))
|
||||
new/obj/item/reagent_containers/food/snacks/pastatomato(get_turf(H)) //now that's what I call spaghetti code
|
||||
|
||||
// small chance to make eye contact with inanimate objects/mindless mobs because of nerves
|
||||
|
||||
|
||||
|
||||
/datum/quirk/social_anxiety/proc/looks_at_floor(datum/source, atom/A)
|
||||
var/mob/living/mind_check = A
|
||||
if(prob(85) || (istype(mind_check) && mind_check.mind))
|
||||
|
||||
@@ -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)
|
||||
@@ -0,0 +1,170 @@
|
||||
/*
|
||||
Pierce
|
||||
*/
|
||||
|
||||
/datum/wound/pierce
|
||||
sound_effect = 'sound/weapons/slice.ogg'
|
||||
processes = TRUE
|
||||
wound_type = WOUND_PIERCE
|
||||
treatable_by = list(/obj/item/stack/medical/suture)
|
||||
treatable_tool = TOOL_CAUTERY
|
||||
base_treat_time = 3 SECONDS
|
||||
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE)
|
||||
|
||||
/// How much blood we start losing when this wound is first applied
|
||||
var/initial_flow
|
||||
/// If gauzed, what percent of the internal bleeding actually clots of the total absorption rate
|
||||
var/gauzed_clot_rate
|
||||
|
||||
/// When hit on this bodypart, we have this chance of losing some blood + the incoming damage
|
||||
var/internal_bleeding_chance
|
||||
/// If we let off blood when hit, the max blood lost is this * the incoming damage
|
||||
var/internal_bleeding_coefficient
|
||||
|
||||
/datum/wound/pierce/wound_injury(datum/wound/old_wound)
|
||||
blood_flow = initial_flow
|
||||
|
||||
/datum/wound/pierce/receive_damage(wounding_type, wounding_dmg, wound_bonus)
|
||||
if(victim.stat == DEAD || wounding_dmg < 5)
|
||||
return
|
||||
if(victim.blood_volume && prob(internal_bleeding_chance + wounding_dmg))
|
||||
if(limb.current_gauze && limb.current_gauze.splint_factor)
|
||||
wounding_dmg *= (1 - limb.current_gauze.splint_factor)
|
||||
var/blood_bled = rand(1, wounding_dmg * internal_bleeding_coefficient) // 12 brute toolbox can cause up to 15/18/21 bloodloss on mod/sev/crit
|
||||
switch(blood_bled)
|
||||
if(1 to 6)
|
||||
victim.bleed(blood_bled, TRUE)
|
||||
if(7 to 13)
|
||||
victim.visible_message("<span class='smalldanger'>Blood droplets fly from the hole in [victim]'s [limb.name].</span>", "<span class='danger'>You cough up a bit of blood from the blow to your [limb.name].</span>", vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
victim.bleed(blood_bled, TRUE)
|
||||
if(14 to 19)
|
||||
victim.visible_message("<span class='smalldanger'>A small stream of blood spurts from the hole in [victim]'s [limb.name]!</span>", "<span class='danger'>You spit out a string of blood from the blow to your [limb.name]!</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'>A spray of blood streams from the gash in [victim]'s [limb.name]!</span>", "<span class='danger'><b>You choke up on a spray of blood from the blow to your [limb.name]!</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))
|
||||
|
||||
/datum/wound/pierce/handle_process()
|
||||
blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)
|
||||
|
||||
if(victim.bodytemperature < (BODYTEMP_NORMAL - 10))
|
||||
blood_flow -= 0.2
|
||||
if(prob(5))
|
||||
to_chat(victim, "<span class='notice'>You feel the [lowertext(name)] in your [limb.name] firming up from the cold!</span>")
|
||||
|
||||
if(victim.reagents?.has_reagent(/datum/reagent/toxin/heparin))
|
||||
blood_flow += 0.5 // old herapin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first
|
||||
|
||||
if(limb.current_gauze)
|
||||
blood_flow -= limb.current_gauze.absorption_rate * gauzed_clot_rate
|
||||
limb.current_gauze.absorption_capacity -= limb.current_gauze.absorption_rate
|
||||
|
||||
if(blood_flow <= 0)
|
||||
qdel(src)
|
||||
|
||||
/datum/wound/pierce/on_stasis()
|
||||
. = ..()
|
||||
if(blood_flow <= 0)
|
||||
qdel(src)
|
||||
|
||||
/datum/wound/pierce/treat(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/stack/medical/suture))
|
||||
suture(I, user)
|
||||
else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature() > 300)
|
||||
tool_cauterize(I, user)
|
||||
|
||||
/datum/wound/pierce/on_xadone(power)
|
||||
. = ..()
|
||||
blood_flow -= 0.03 * power // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort
|
||||
|
||||
/datum/wound/pierce/on_synthflesh(power)
|
||||
. = ..()
|
||||
blood_flow -= 0.05 * power // 20u * 0.05 = -1 blood flow, less than with slashes but still good considering smaller bleed rates
|
||||
|
||||
/// If someone is using a suture to close this cut
|
||||
/datum/wound/pierce/proc/suture(obj/item/stack/medical/suture/I, mob/user)
|
||||
var/self_penalty_mult = (user == victim ? 1.4 : 1)
|
||||
user.visible_message("<span class='notice'>[user] begins stitching [victim]'s [limb.name] with [I]...</span>", "<span class='notice'>You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
|
||||
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
return
|
||||
user.visible_message("<span class='green'>[user] stitches up some of the bleeding on [victim].</span>", "<span class='green'>You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"].</span>")
|
||||
var/blood_sutured = I.stop_bleeding / self_penalty_mult * 0.5
|
||||
blood_flow -= blood_sutured
|
||||
limb.heal_damage(I.heal_brute, I.heal_burn)
|
||||
|
||||
if(blood_flow > 0)
|
||||
try_treating(I, user)
|
||||
else
|
||||
to_chat(user, "<span class='green'>You successfully close the hole in [user == victim ? "your" : "[victim]'s"] [limb.name].</span>")
|
||||
|
||||
/// If someone is using either a cautery tool or something with heat to cauterize this pierce
|
||||
/datum/wound/pierce/proc/tool_cauterize(obj/item/I, mob/user)
|
||||
var/self_penalty_mult = (user == victim ? 1.5 : 1)
|
||||
user.visible_message("<span class='danger'>[user] begins cauterizing [victim]'s [limb.name] with [I]...</span>", "<span class='danger'>You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
|
||||
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
return
|
||||
|
||||
user.visible_message("<span class='green'>[user] cauterizes some of the bleeding on [victim].</span>", "<span class='green'>You cauterize some of the bleeding on [victim].</span>")
|
||||
limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND)
|
||||
if(prob(30))
|
||||
victim.emote("scream")
|
||||
var/blood_cauterized = (0.6 / self_penalty_mult) * 0.5
|
||||
blood_flow -= blood_cauterized
|
||||
|
||||
if(blood_flow > 0)
|
||||
try_treating(I, user)
|
||||
|
||||
/datum/wound/pierce/moderate
|
||||
name = "Minor Breakage"
|
||||
desc = "Patient's skin has been broken open, causing severe bruising and minor internal bleeding in affected area."
|
||||
treat_text = "Treat affected site with bandaging or exposure to extreme cold. In dire cases, brief exposure to vacuum may suffice." // space is cold in ss13, so it's like an ice pack!
|
||||
examine_desc = "has a small, circular hole, gently bleeding"
|
||||
occur_text = "spurts out a thin stream of blood"
|
||||
sound_effect = 'sound/effects/wounds/pierce1.ogg'
|
||||
severity = WOUND_SEVERITY_MODERATE
|
||||
initial_flow = 1.5
|
||||
gauzed_clot_rate = 0.8
|
||||
internal_bleeding_chance = 30
|
||||
internal_bleeding_coefficient = 1.25
|
||||
threshold_minimum = 40
|
||||
threshold_penalty = 15
|
||||
status_effect_type = /datum/status_effect/wound/pierce/moderate
|
||||
scar_keyword = "piercemoderate"
|
||||
|
||||
/datum/wound/pierce/severe
|
||||
name = "Open Puncture"
|
||||
desc = "Patient's internal tissue is penetrated, causing sizeable internal bleeding and reduced limb stability."
|
||||
treat_text = "Repair punctures in skin by suture or cautery, extreme cold may also work."
|
||||
examine_desc = "is pierced clear through, with bits of tissue obscuring the open hole"
|
||||
occur_text = "looses a violent spray of blood, revealing a pierced wound"
|
||||
sound_effect = 'sound/effects/wounds/pierce2.ogg'
|
||||
severity = WOUND_SEVERITY_SEVERE
|
||||
initial_flow = 2.25
|
||||
gauzed_clot_rate = 0.6
|
||||
internal_bleeding_chance = 60
|
||||
internal_bleeding_coefficient = 1.5
|
||||
threshold_minimum = 60
|
||||
threshold_penalty = 25
|
||||
status_effect_type = /datum/status_effect/wound/pierce/severe
|
||||
scar_keyword = "piercesevere"
|
||||
|
||||
/datum/wound/pierce/critical
|
||||
name = "Ruptured Cavity"
|
||||
desc = "Patient's internal tissue and circulatory system is shredded, causing significant internal bleeding and damage to internal organs."
|
||||
treat_text = "Surgical repair of puncture wound, followed by supervised resanguination."
|
||||
examine_desc = "is ripped clear through, barely held together by exposed bone"
|
||||
occur_text = "blasts apart, sending chunks of viscera flying in all directions"
|
||||
sound_effect = 'sound/effects/wounds/pierce3.ogg'
|
||||
severity = WOUND_SEVERITY_CRITICAL
|
||||
initial_flow = 3
|
||||
gauzed_clot_rate = 0.4
|
||||
internal_bleeding_chance = 80
|
||||
internal_bleeding_coefficient = 1.75
|
||||
threshold_minimum = 110
|
||||
threshold_penalty = 40
|
||||
status_effect_type = /datum/status_effect/wound/pierce/critical
|
||||
scar_keyword = "piercecritical"
|
||||
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH)
|
||||
@@ -1,17 +1,16 @@
|
||||
|
||||
/*
|
||||
Cuts
|
||||
*/
|
||||
|
||||
/datum/wound/brute/cut
|
||||
/datum/wound/slash
|
||||
sound_effect = 'sound/weapons/slice.ogg'
|
||||
processes = TRUE
|
||||
wound_type = WOUND_LIST_CUT
|
||||
treatable_by = list(/obj/item/stack/medical/suture, /obj/item/stack/medical/gauze)
|
||||
wound_type = WOUND_SLASH
|
||||
treatable_by = list(/obj/item/stack/medical/suture)
|
||||
treatable_by_grabbed = list(/obj/item/gun/energy/laser)
|
||||
treatable_tool = TOOL_CAUTERY
|
||||
treat_priority = TRUE
|
||||
base_treat_time = 3 SECONDS
|
||||
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE)
|
||||
|
||||
/// How much blood we start losing when this wound is first applied
|
||||
var/initial_flow
|
||||
@@ -27,75 +26,82 @@
|
||||
var/max_per_type
|
||||
/// The maximum flow we've had so far
|
||||
var/highest_flow
|
||||
/// How much flow we've already cauterized
|
||||
var/cauterized
|
||||
/// How much flow we've already sutured
|
||||
var/sutured
|
||||
|
||||
/// The current bandage we have for this wound (maybe move bandages to the limb?)
|
||||
var/obj/item/stack/current_bandage
|
||||
/// A bad system I'm using to track the worst scar we earned (since we can demote, we want the biggest our wound has been, not what it was when it was cured (probably moderate))
|
||||
var/datum/scar/highest_scar
|
||||
|
||||
/datum/wound/brute/cut/wound_injury(datum/wound/brute/cut/old_wound = null)
|
||||
/datum/wound/slash/wound_injury(datum/wound/slash/old_wound = null)
|
||||
blood_flow = initial_flow
|
||||
if(old_wound)
|
||||
blood_flow = max(old_wound.blood_flow, initial_flow)
|
||||
if(old_wound.severity > severity && old_wound.highest_scar)
|
||||
highest_scar = old_wound.highest_scar
|
||||
old_wound.highest_scar = null
|
||||
if(old_wound.current_bandage)
|
||||
current_bandage = old_wound.current_bandage
|
||||
old_wound.current_bandage = null
|
||||
|
||||
if(!highest_scar)
|
||||
highest_scar = new
|
||||
highest_scar.generate(limb, src, add_to_scars=FALSE)
|
||||
|
||||
/datum/wound/brute/cut/remove_wound(ignore_limb, replaced)
|
||||
/datum/wound/slash/remove_wound(ignore_limb, replaced)
|
||||
if(!replaced && highest_scar)
|
||||
already_scarred = TRUE
|
||||
highest_scar.lazy_attach(limb)
|
||||
return ..()
|
||||
|
||||
/datum/wound/brute/cut/get_examine_description(mob/user)
|
||||
if(!current_bandage)
|
||||
/datum/wound/slash/get_examine_description(mob/user)
|
||||
if(!limb.current_gauze)
|
||||
return ..()
|
||||
|
||||
var/bandage_condition = ""
|
||||
var/list/msg = list("The cuts on [victim.p_their()] [limb.name] are wrapped with")
|
||||
// how much life we have left in these bandages
|
||||
switch(current_bandage.absorption_capacity)
|
||||
switch(limb.current_gauze.absorption_capacity)
|
||||
if(0 to 1.25)
|
||||
bandage_condition = "nearly ruined "
|
||||
msg += "nearly ruined "
|
||||
if(1.25 to 2.75)
|
||||
bandage_condition = "badly worn "
|
||||
msg += "badly worn "
|
||||
if(2.75 to 4)
|
||||
bandage_condition = "slightly bloodied "
|
||||
msg += "slightly bloodied "
|
||||
if(4 to INFINITY)
|
||||
bandage_condition = "clean "
|
||||
return "<B>The cuts on [victim.p_their()] [limb.name] are wrapped with [bandage_condition] [current_bandage.name]!</B>"
|
||||
msg += "clean "
|
||||
msg += "[limb.current_gauze.name]!"
|
||||
|
||||
/datum/wound/brute/cut/receive_damage(wounding_type, wounding_dmg, wound_bonus)
|
||||
if(victim.stat != DEAD && wounding_type == WOUND_SHARP) // can't stab dead bodies to make it bleed faster this way
|
||||
return "<B>[msg.Join()]</B>"
|
||||
|
||||
/datum/wound/slash/receive_damage(wounding_type, wounding_dmg, wound_bonus)
|
||||
if(victim.stat != DEAD && wounding_type == WOUND_SLASH) // can't stab dead bodies to make it bleed faster this way
|
||||
blood_flow += 0.05 * wounding_dmg
|
||||
|
||||
/datum/wound/brute/cut/handle_process()
|
||||
blood_flow = min(blood_flow, WOUND_CUT_MAX_BLOODFLOW)
|
||||
/datum/wound/slash/drag_bleed_amount()
|
||||
// say we have 3 severe cuts with 3 blood flow each, pretty reasonable
|
||||
// compare with being at 100 brute damage before, where you bled (brute/100 * 2), = 2 blood per tile
|
||||
var/bleed_amt = min(blood_flow * 0.1, 1) // 3 * 3 * 0.1 = 0.9 blood total, less than before! the share here is .3 blood of course.
|
||||
|
||||
if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/toxin/heparin))
|
||||
if(limb.current_gauze) // gauze stops all bleeding from dragging on this limb, but wears the gauze out quicker
|
||||
limb.seep_gauze(bleed_amt * 0.33)
|
||||
return
|
||||
|
||||
return bleed_amt
|
||||
|
||||
/datum/wound/slash/handle_process()
|
||||
if(victim.stat == DEAD)
|
||||
blood_flow -= max(clot_rate, WOUND_SLASH_DEAD_CLOT_MIN)
|
||||
if(blood_flow < minimum_flow)
|
||||
if(demotes_to)
|
||||
replace_wound(demotes_to)
|
||||
return
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)
|
||||
|
||||
if(victim.reagents?.has_reagent(/datum/reagent/toxin/heparin))
|
||||
blood_flow += 0.5 // old herapin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first
|
||||
else if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/medicine/coagulant))
|
||||
blood_flow -= 0.25
|
||||
|
||||
if(current_bandage)
|
||||
if(limb.current_gauze)
|
||||
if(clot_rate > 0)
|
||||
blood_flow -= clot_rate
|
||||
blood_flow -= current_bandage.absorption_rate
|
||||
current_bandage.absorption_capacity -= current_bandage.absorption_rate
|
||||
if(current_bandage.absorption_capacity < 0)
|
||||
victim.visible_message("<span class='danger'>Blood soaks through \the [current_bandage] on [victim]'s [limb.name].</span>", "<span class='warning'>Blood soaks through \the [current_bandage] on your [limb.name].</span>", vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
QDEL_NULL(current_bandage)
|
||||
treat_priority = TRUE
|
||||
blood_flow -= limb.current_gauze.absorption_rate
|
||||
limb.seep_gauze(limb.current_gauze.absorption_rate)
|
||||
else
|
||||
blood_flow -= clot_rate
|
||||
|
||||
@@ -109,41 +115,57 @@
|
||||
to_chat(victim, "<span class='green'>The cut on your [limb.name] has stopped bleeding!</span>")
|
||||
qdel(src)
|
||||
|
||||
|
||||
/datum/wound/slash/on_stasis()
|
||||
if(blood_flow >= minimum_flow)
|
||||
return
|
||||
if(demotes_to)
|
||||
replace_wound(demotes_to)
|
||||
return
|
||||
qdel(src)
|
||||
|
||||
/* BEWARE, THE BELOW NONSENSE IS MADNESS. bones.dm looks more like what I have in mind and is sufficiently clean, don't pay attention to this messiness */
|
||||
|
||||
/datum/wound/brute/cut/check_grab_treatments(obj/item/I, mob/user)
|
||||
/datum/wound/slash/check_grab_treatments(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/gun/energy/laser))
|
||||
return TRUE
|
||||
|
||||
/datum/wound/brute/cut/treat(obj/item/I, mob/user)
|
||||
/datum/wound/slash/treat(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/gun/energy/laser))
|
||||
las_cauterize(I, user)
|
||||
else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature() > 300)
|
||||
tool_cauterize(I, user)
|
||||
else if(istype(I, /obj/item/stack/medical/gauze))
|
||||
bandage(I, user)
|
||||
else if(istype(I, /obj/item/stack/medical/suture))
|
||||
suture(I, user)
|
||||
|
||||
/datum/wound/brute/cut/try_handling(mob/living/carbon/human/user)
|
||||
/datum/wound/slash/try_handling(mob/living/carbon/human/user)
|
||||
if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB)
|
||||
return FALSE
|
||||
|
||||
if(!iscatperson(user))
|
||||
return FALSE
|
||||
|
||||
if(!(user.client?.prefs.vore_flags & LICKABLE))
|
||||
return FALSE
|
||||
|
||||
lick_wounds(user)
|
||||
return TRUE
|
||||
|
||||
/// if a felinid is licking this cut to reduce bleeding
|
||||
/datum/wound/brute/cut/proc/lick_wounds(mob/living/carbon/human/user)
|
||||
/datum/wound/slash/proc/lick_wounds(mob/living/carbon/human/user)
|
||||
if(INTERACTING_WITH(user, victim))
|
||||
to_chat(user, "<span class='warning'>You're already interacting with [victim]!</span>")
|
||||
return
|
||||
|
||||
if(user.is_mouth_covered())
|
||||
to_chat(user, "<span class='warning'>Your mouth is covered, you can't lick [victim]'s wounds!</span>")
|
||||
return
|
||||
|
||||
if(!user.getorganslot(ORGAN_SLOT_TONGUE))
|
||||
to_chat(user, "<span class='warning'>You can't lick wounds without a tongue!</span>") // f in chat
|
||||
return
|
||||
|
||||
// transmission is one way patient -> felinid since google said cat saliva is antiseptic or whatever, and also because felinids are already risking getting beaten for this even without people suspecting they're spreading a deathvirus
|
||||
for(var/datum/disease/D in victim.diseases)
|
||||
user.ForceContractDisease(D)
|
||||
|
||||
user.visible_message("<span class='notice'>[user] begins licking the wounds on [victim]'s [limb.name].</span>", "<span class='notice'>You begin licking the wounds on [victim]'s [limb.name]...</span>", ignored_mobs=victim)
|
||||
to_chat(victim, "<span class='notice'>[user] begins to lick the wounds on your [limb.name].</span")
|
||||
if(!do_after(user, base_treat_time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
@@ -163,12 +185,16 @@
|
||||
else if(demotes_to)
|
||||
to_chat(user, "<span class='green'>You successfully lower the severity of [victim]'s cuts.</span>")
|
||||
|
||||
/datum/wound/brute/cut/on_xadone(power)
|
||||
/datum/wound/slash/on_xadone(power)
|
||||
. = ..()
|
||||
blood_flow -= 0.03 * power // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort
|
||||
|
||||
/datum/wound/slash/on_synthflesh(power)
|
||||
. = ..()
|
||||
blood_flow -= 0.075 * power // 20u * 0.075 = -1.5 blood flow, pretty good for how little effort it is
|
||||
|
||||
/// If someone's putting a laser gun up to our cut to cauterize it
|
||||
/datum/wound/brute/cut/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user)
|
||||
/datum/wound/slash/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user)
|
||||
var/self_penalty_mult = (user == victim ? 1.25 : 1)
|
||||
user.visible_message("<span class='warning'>[user] begins aiming [lasgun] directly at [victim]'s [limb.name]...</span>", "<span class='userdanger'>You begin aiming [lasgun] directly at [user == victim ? "your" : "[victim]'s"] [limb.name]...</span>")
|
||||
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
@@ -180,11 +206,10 @@
|
||||
return
|
||||
victim.emote("scream")
|
||||
blood_flow -= damage / (5 * self_penalty_mult) // 20 / 5 = 4 bloodflow removed, p good
|
||||
cauterized += damage / (5 * self_penalty_mult)
|
||||
victim.visible_message("<span class='warning'>The cuts on [victim]'s [limb.name] scar over!</span>")
|
||||
|
||||
/// If someone is using either a cautery tool or something with heat to cauterize this cut
|
||||
/datum/wound/brute/cut/proc/tool_cauterize(obj/item/I, mob/user)
|
||||
/datum/wound/slash/proc/tool_cauterize(obj/item/I, mob/user)
|
||||
var/self_penalty_mult = (user == victim ? 1.5 : 1)
|
||||
user.visible_message("<span class='danger'>[user] begins cauterizing [victim]'s [limb.name] with [I]...</span>", "<span class='danger'>You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
|
||||
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
@@ -196,7 +221,6 @@
|
||||
victim.emote("scream")
|
||||
var/blood_cauterized = (0.6 / self_penalty_mult)
|
||||
blood_flow -= blood_cauterized
|
||||
cauterized += blood_cauterized
|
||||
|
||||
if(blood_flow > minimum_flow)
|
||||
try_treating(I, user)
|
||||
@@ -204,15 +228,15 @@
|
||||
to_chat(user, "<span class='green'>You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.</span>")
|
||||
|
||||
/// If someone is using a suture to close this cut
|
||||
/datum/wound/brute/cut/proc/suture(obj/item/stack/medical/suture/I, mob/user)
|
||||
/datum/wound/slash/proc/suture(obj/item/stack/medical/suture/I, mob/user)
|
||||
var/self_penalty_mult = (user == victim ? 1.4 : 1)
|
||||
user.visible_message("<span class='notice'>[user] begins stitching [victim]'s [limb.name] with [I]...</span>", "<span class='notice'>You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
|
||||
|
||||
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
return
|
||||
user.visible_message("<span class='green'>[user] stitches up some of the bleeding on [victim].</span>", "<span class='green'>You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"].</span>")
|
||||
var/blood_sutured = I.stop_bleeding / self_penalty_mult
|
||||
blood_flow -= blood_sutured
|
||||
sutured += blood_sutured
|
||||
limb.heal_damage(I.heal_brute, I.heal_burn)
|
||||
|
||||
if(blood_flow > minimum_flow)
|
||||
@@ -220,95 +244,57 @@
|
||||
else if(demotes_to)
|
||||
to_chat(user, "<span class='green'>You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.</span>")
|
||||
|
||||
/// If someone is using gauze on this cut
|
||||
/datum/wound/brute/cut/proc/bandage(obj/item/stack/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
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] begins rewrapping the cuts on [victim]'s [limb.name] with [I]...</span>", "<span class='warning'>You begin rewrapping the cuts on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] begins wrapping the cuts on [victim]'s [limb.name] with [I]...</span>", "<span class='warning'>You begin wrapping the cuts on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
|
||||
if(!do_after(user, base_treat_time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
return
|
||||
|
||||
user.visible_message("<span class='green'>[user] applies [I] to [victim]'s [limb.name].</span>", "<span class='green'>You bandage some of the bleeding on [user == victim ? "yourself" : "[victim]"].</span>")
|
||||
QDEL_NULL(current_bandage)
|
||||
current_bandage = new I.type(limb)
|
||||
current_bandage.amount = 1
|
||||
treat_priority = FALSE
|
||||
I.use(1)
|
||||
|
||||
|
||||
/datum/wound/brute/cut/moderate
|
||||
/datum/wound/slash/moderate
|
||||
name = "Rough Abrasion"
|
||||
desc = "Patient's skin has been badly scraped, generating moderate blood loss."
|
||||
treat_text = "Application of clean bandages or first-aid grade sutures, followed by food and rest."
|
||||
examine_desc = "has an open cut"
|
||||
occur_text = "is cut open, slowly leaking blood"
|
||||
sound_effect = 'sound/effects/blood1.ogg'
|
||||
sound_effect = 'sound/effects/wounds/blood1.ogg'
|
||||
severity = WOUND_SEVERITY_MODERATE
|
||||
initial_flow = 2
|
||||
minimum_flow = 0.5
|
||||
initial_flow = 1.5
|
||||
minimum_flow = 0.375
|
||||
max_per_type = 3
|
||||
clot_rate = 0.15
|
||||
threshold_minimum = 20
|
||||
clot_rate = 0.12
|
||||
threshold_minimum = 30
|
||||
threshold_penalty = 10
|
||||
status_effect_type = /datum/status_effect/wound/cut/moderate
|
||||
scarring_descriptions = list("light, faded lines", "minor cut marks", "a small faded slit", "a series of small scars")
|
||||
status_effect_type = /datum/status_effect/wound/slash/moderate
|
||||
scar_keyword = "slashmoderate"
|
||||
|
||||
/datum/wound/brute/cut/severe
|
||||
/datum/wound/slash/severe
|
||||
name = "Open Laceration"
|
||||
desc = "Patient's skin is ripped clean open, allowing significant blood loss."
|
||||
treat_text = "Speedy application of first-aid grade sutures and clean bandages, followed by vitals monitoring to ensure recovery."
|
||||
examine_desc = "has a severe cut"
|
||||
occur_text = "is ripped open, veins spurting blood"
|
||||
sound_effect = 'sound/effects/blood2.ogg'
|
||||
sound_effect = 'sound/effects/wounds/blood2.ogg'
|
||||
severity = WOUND_SEVERITY_SEVERE
|
||||
initial_flow = 3.25
|
||||
minimum_flow = 2.75
|
||||
initial_flow = 2.4375
|
||||
minimum_flow = 2.0625
|
||||
clot_rate = 0.07
|
||||
max_per_type = 4
|
||||
threshold_minimum = 50
|
||||
threshold_minimum = 60
|
||||
threshold_penalty = 25
|
||||
demotes_to = /datum/wound/brute/cut/moderate
|
||||
status_effect_type = /datum/status_effect/wound/cut/severe
|
||||
scarring_descriptions = list("a twisted line of faded gashes", "a gnarled sickle-shaped slice scar", "a long-faded puncture wound")
|
||||
demotes_to = /datum/wound/slash/moderate
|
||||
status_effect_type = /datum/status_effect/wound/slash/severe
|
||||
scar_keyword = "slashsevere"
|
||||
|
||||
/datum/wound/brute/cut/critical
|
||||
/datum/wound/slash/critical
|
||||
name = "Weeping Avulsion"
|
||||
desc = "Patient's skin is completely torn open, along with significant loss of tissue. Extreme blood loss will lead to quick death without intervention."
|
||||
treat_text = "Immediate bandaging and either suturing or cauterization, followed by supervised resanguination."
|
||||
examine_desc = "is spurting blood at an alarming rate"
|
||||
examine_desc = "is carved down to the bone, spraying blood wildly"
|
||||
occur_text = "is torn open, spraying blood wildly"
|
||||
sound_effect = 'sound/effects/blood3.ogg'
|
||||
sound_effect = 'sound/effects/wounds/blood3.ogg'
|
||||
severity = WOUND_SEVERITY_CRITICAL
|
||||
initial_flow = 4.25
|
||||
minimum_flow = 4
|
||||
initial_flow = 3.1875
|
||||
minimum_flow = 3
|
||||
clot_rate = -0.05 // critical cuts actively get worse instead of better
|
||||
max_per_type = 5
|
||||
threshold_minimum = 80
|
||||
threshold_minimum = 90
|
||||
threshold_penalty = 40
|
||||
demotes_to = /datum/wound/brute/cut/severe
|
||||
status_effect_type = /datum/status_effect/wound/cut/critical
|
||||
scarring_descriptions = list("a winding path of very badly healed scar tissue", "a series of peaks and valleys along a gruesome line of cut scar tissue", "a grotesque snake of indentations and stitching scars")
|
||||
|
||||
// TODO: see about moving dismemberment over to this, i'll have to add judging dismembering power/wound potential wrt item size i guess
|
||||
/datum/wound/brute/cut/loss
|
||||
name = "Dismembered"
|
||||
desc = "oof ouch!!"
|
||||
occur_text = "is violently dismembered!"
|
||||
sound_effect = 'sound/effects/dismember.ogg'
|
||||
viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
|
||||
severity = WOUND_SEVERITY_LOSS
|
||||
threshold_minimum = 180
|
||||
status_effect_type = null
|
||||
|
||||
/datum/wound/brute/cut/loss/apply_wound(obj/item/bodypart/L, silent, datum/wound/brute/cut/old_wound, smited = FALSE)
|
||||
if(!L.dismemberable)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
L.dismember()
|
||||
qdel(src)
|
||||
demotes_to = /datum/wound/slash/severe
|
||||
status_effect_type = /datum/status_effect/wound/slash/critical
|
||||
scar_keyword = "slashcritical"
|
||||
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH)
|
||||
@@ -213,6 +213,9 @@ Credit where due:
|
||||
var/list/slots = list("In your left pocket" = SLOT_L_STORE, "In your right pocket" = SLOT_R_STORE, "In your backpack" = SLOT_IN_BACKPACK)
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
var/obj/item/clockwork/replica_fabricator/F = new
|
||||
if(H.equip_to_slot_or_del(F, SLOT_IN_BACKPACK))
|
||||
to_chat(H, "<span class='brass'>You have been equipped with a replica fabricator, an advanced tool that can convert objects like doors, tables or even coats into clockwork equivalents.</span>")
|
||||
slot = H.equip_in_one_of_slots(S, slots)
|
||||
if(slot == "In your backpack")
|
||||
slot = "In your [H.back.name]"
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
hitsound = null
|
||||
attack_verb_on = list("slipped")
|
||||
clumsy_check = FALSE
|
||||
sharpness = IS_BLUNT
|
||||
sharpness = SHARP_NONE
|
||||
sword_color = "yellow"
|
||||
heat = 0
|
||||
light_color = "#ffff00"
|
||||
|
||||
@@ -1112,7 +1112,6 @@
|
||||
detonated = 1
|
||||
charge = null
|
||||
for(var/mob/living/carbon/human/H in orange(2,src))
|
||||
H.Unconscious(160)
|
||||
H.adjust_fire_stacks(20)
|
||||
H.IgniteMob() //Guaranteed knockout and ignition for nearby people
|
||||
H.apply_damage(40, BRUTE, BODY_ZONE_CHEST)
|
||||
|
||||
@@ -342,7 +342,8 @@
|
||||
L.visible_message("<span class='warning'>[src] closes on [L], crushing [L.p_them()]!</span>", "<span class='userdanger'>[src] closes on you and crushes you!</span>")
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
for(var/datum/wound/W in C.all_wounds)
|
||||
for(var/i in C.all_wounds) // should probably replace with signal
|
||||
var/datum/wound/W = i
|
||||
W.crush(DOOR_CRUSH_DAMAGE)
|
||||
if(isalien(L)) //For xenos
|
||||
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans.
|
||||
|
||||
@@ -533,16 +533,16 @@
|
||||
return
|
||||
|
||||
/obj/machinery/porta_turret/proc/shootAt(atom/movable/target, stagger_enabled = FALSE)
|
||||
if(stagger_enabled)
|
||||
randomize_shot_stagger()
|
||||
sleep(shot_stagger)
|
||||
if(!raised) //the turret has to be raised in order to fire - makes sense, right?
|
||||
return
|
||||
|
||||
if(!(obj_flags & EMAGGED)) //if it hasn't been emagged, cooldown before shooting again
|
||||
if(last_fired + shot_delay > world.time)
|
||||
return
|
||||
last_fired = world.time
|
||||
if(last_fired + shot_delay > world.time)
|
||||
return
|
||||
last_fired = world.time
|
||||
|
||||
if(stagger_enabled)
|
||||
randomize_shot_stagger()
|
||||
sleep(shot_stagger)
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/U = get_turf(target)
|
||||
|
||||
@@ -103,12 +103,12 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
|
||||
mouse_drag_pointer = MOUSE_ACTIVE_POINTER //the icon to indicate this object is being dragged
|
||||
|
||||
var/list/embedding = NONE
|
||||
var/list/embedding
|
||||
|
||||
var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES
|
||||
var/heat = 0
|
||||
///All items with sharpness of IS_SHARP or higher will automatically get the butchering component.
|
||||
var/sharpness = IS_BLUNT
|
||||
///All items with sharpness of SHARP_EDGED or higher will automatically get the butchering component.
|
||||
var/sharpness = SHARP_NONE
|
||||
|
||||
var/tool_behaviour = NONE
|
||||
var/toolspeed = 1
|
||||
@@ -206,7 +206,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
if(GLOB.rpg_loot_items)
|
||||
AddComponent(/datum/component/fantasy)
|
||||
|
||||
if(sharpness) //give sharp objects butchering functionality, for consistency
|
||||
if(sharpness && force > 5) //give sharp objects butchering functionality, for consistency
|
||||
AddComponent(/datum/component/butchering, 80 * toolspeed)
|
||||
|
||||
/obj/item/proc/check_allowed_items(atom/target, not_inside, target_self)
|
||||
@@ -1090,7 +1090,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
|
||||
|
||||
/obj/item/proc/updateEmbedding()
|
||||
if(!islist(embedding) || !LAZYLEN(embedding))
|
||||
if(!LAZYLEN(embedding))
|
||||
return
|
||||
|
||||
AddElement(/datum/element/embed,\
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
custom_materials = list(/datum/material/iron=13000)
|
||||
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
|
||||
hitsound = "swing_hit"
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
actions_types = list(/datum/action/item_action/startchainsaw)
|
||||
tool_behaviour = TOOL_SAW
|
||||
toolspeed = 0.5
|
||||
@@ -71,10 +71,6 @@
|
||||
/obj/item/chainsaw/update_icon_state()
|
||||
icon_state = "chainsaw_[on ? "on" : "off"]"
|
||||
|
||||
/obj/item/chainsaw/get_dismemberment_chance()
|
||||
if(wielded)
|
||||
. = ..()
|
||||
|
||||
/obj/item/chainsaw/doomslayer
|
||||
name = "THE GREAT COMMUNICATOR"
|
||||
desc = "<span class='warning'>VRRRRRRR!!!</span>"
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
to_chat(user, "<span class='warning'>You lack the grace to wield this!</span>")
|
||||
return COMPONENT_TWOHANDED_BLOCK_WIELD
|
||||
wielded = TRUE
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
w_class = w_class_on
|
||||
total_mass = total_mass_on
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
|
||||
@@ -13,11 +13,12 @@
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
max_integrity = 200
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
|
||||
resistance_flags = FIRE_PROOF
|
||||
wound_bonus = -20
|
||||
wound_bonus = -15
|
||||
bare_wound_bonus = 20
|
||||
var/wielded = FALSE // track wielded status on item
|
||||
|
||||
/obj/item/fireaxe/Initialize()
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
ADD_TRAIT(user, granted_trait, BOOK_TRAIT)
|
||||
|
||||
/obj/item/book/granter/trait/rifleman
|
||||
name = "\proper the Neo-Russian Rifleman\'s Primer"
|
||||
name = "The Neo-Russian Rifleman\'s Primer"
|
||||
desc = "A book with stains of vodka and...blood? The back is hard to read, but says something about bolt-actions. Or pump-actions. Both, maybe."
|
||||
oneuse = FALSE
|
||||
granted_trait = TRAIT_FAST_PUMP
|
||||
|
||||
@@ -352,7 +352,7 @@
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT
|
||||
block_chance = 30
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
@@ -452,7 +452,7 @@
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
armour_penetration = 35
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
attack_verb = list("chopped", "sliced", "cut", "reaped")
|
||||
|
||||
/obj/item/nullrod/scythe/Initialize()
|
||||
@@ -575,7 +575,7 @@
|
||||
righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
item_flags = ABSTRACT
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
|
||||
hitsound = 'sound/weapons/chainsawhit.ogg'
|
||||
total_mass = TOTAL_MASS_HAND_REPLACEMENT
|
||||
@@ -594,7 +594,7 @@
|
||||
name = "clown dagger"
|
||||
desc = "Used for absolutely hilarious sacrifices."
|
||||
hitsound = 'sound/items/bikehorn.ogg'
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
/obj/item/nullrod/pride_hammer
|
||||
@@ -645,7 +645,7 @@
|
||||
throw_speed = 4
|
||||
throw_range = 7
|
||||
throwforce = 30
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
attack_verb = list("enlightened", "redpilled")
|
||||
|
||||
/obj/item/nullrod/armblade
|
||||
@@ -657,7 +657,7 @@
|
||||
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
||||
item_flags = ABSTRACT
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
wound_bonus = -20
|
||||
bare_wound_bonus = 25
|
||||
total_mass = TOTAL_MASS_HAND_REPLACEMENT
|
||||
@@ -699,7 +699,7 @@
|
||||
force = 15
|
||||
block_chance = 40
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
sharpness = IS_BLUNT
|
||||
sharpness = SHARP_NONE
|
||||
hitsound = "swing_hit"
|
||||
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
@@ -754,7 +754,7 @@
|
||||
name = "arrhythmic knife"
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
desc = "They say fear is the true mind killer, but stabbing them in the head works too. Honour compels you to not sheathe it once drawn."
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
slot_flags = null
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
@@ -782,7 +782,7 @@
|
||||
desc = "Holding this makes you look absolutely devilish."
|
||||
attack_verb = list("poked", "impaled", "pierced", "jabbed")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
|
||||
/obj/item/nullrod/egyptian
|
||||
name = "egyptian staff"
|
||||
|
||||
@@ -38,6 +38,23 @@
|
||||
if(!uses)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/implant/warp
|
||||
name = "warp implant"
|
||||
desc = "Saves your position somewhere, and then warps you back to it after five seconds."
|
||||
icon_state = "warp"
|
||||
uses = 15
|
||||
|
||||
/obj/item/implant/warp/activate()
|
||||
. = ..()
|
||||
uses--
|
||||
imp_in.do_adrenaline(150, TRUE, 0, 0, TRUE, list(/datum/reagent/fermi/eigenstate = 1.2), "<span class='boldnotice'>You feel an internal prick as as the bluespace starts ramping up!</span>")
|
||||
to_chat(imp_in, "<span class='notice'>You feel an internal prick as as the bluespace starts ramping up!</span>")
|
||||
if(!uses)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/implanter/warp
|
||||
name = "implanter (warp)"
|
||||
imp_type = /obj/item/implant/warp
|
||||
|
||||
/obj/item/implant/emp
|
||||
name = "emp implant"
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
name = "fork"
|
||||
desc = "Pointy."
|
||||
icon_state = "fork"
|
||||
force = 5
|
||||
force = 4
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throwforce = 0
|
||||
throw_speed = 3
|
||||
@@ -28,6 +28,7 @@
|
||||
attack_verb = list("attacked", "stabbed", "poked")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
|
||||
sharpness = SHARP_POINTY
|
||||
var/datum/reagent/forkload //used to eat omelette
|
||||
|
||||
/obj/item/kitchen/fork/suicide_act(mob/living/carbon/user)
|
||||
@@ -61,7 +62,7 @@
|
||||
throw_speed = 4
|
||||
throw_range = 6
|
||||
embedding = list("pain_mult" = 2, "embed_chance" = 100, "fall_chance" = 0, "embed_chance_turf_mod" = 15)
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
|
||||
/obj/item/kitchen/knife
|
||||
name = "kitchen knife"
|
||||
@@ -76,7 +77,7 @@
|
||||
throw_range = 6
|
||||
custom_materials = list(/datum/material/iron=12000)
|
||||
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
sharpness = IS_SHARP_ACCURATE
|
||||
sharpness = SHARP_POINTY
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
var/bayonet = FALSE //Can this be attached to a gun?
|
||||
wound_bonus = -5
|
||||
|
||||
@@ -54,5 +54,5 @@
|
||||
var/obj/item/tank/T = W
|
||||
blow(T, user)
|
||||
return
|
||||
if (W.get_sharpness() || W.get_temperature() || is_pointed(W))
|
||||
if (W.get_sharpness() || W.get_temperature())
|
||||
burst()
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
attack_verb_off = list("tapped", "poked")
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
embedding = list("embed_chance" = 75, "impact_pain_mult" = 10)
|
||||
armour_penetration = 35
|
||||
item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY
|
||||
@@ -180,7 +180,7 @@
|
||||
sword_color = null //stops icon from breaking when turned on.
|
||||
hitcost = 75 //Costs more than a standard cyborg esword
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
light_color = "#40ceff"
|
||||
tool_behaviour = TOOL_SAW
|
||||
toolspeed = 0.7
|
||||
@@ -255,7 +255,7 @@
|
||||
throw_range = 1
|
||||
w_class = WEIGHT_CLASS_BULKY//So you can't hide it in your pocket or some such.
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
|
||||
//Most of the other special functions are handled in their own files. aka special snowflake code so kewl
|
||||
/obj/item/melee/transforming/energy/blade/Initialize()
|
||||
@@ -291,7 +291,7 @@
|
||||
attack_verb_off = list("tapped", "poked")
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
embedding = list("embedded_pain_multiplier" = 6, "embed_chance" = 20, "embedded_fall_chance" = 60)
|
||||
armour_penetration = 10
|
||||
block_chance = 35
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
throwforce = 10
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "impaled", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
total_mass = TOTAL_MASS_HAND_REPLACEMENT
|
||||
|
||||
/obj/item/melee/synthetic_arm_blade/Initialize()
|
||||
@@ -64,7 +64,7 @@
|
||||
throwforce = 15
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
armour_penetration = 75
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
attack_verb = list("slashed", "cut")
|
||||
hitsound = 'sound/weapons/rapierhit.ogg'
|
||||
custom_materials = list(/datum/material/iron = 1000)
|
||||
@@ -168,7 +168,7 @@
|
||||
flags_1 = CONDUCT_1
|
||||
obj_flags = UNIQUE_RENAME
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
sharpness = IS_SHARP_ACCURATE //It cant be sharpend cook -_-
|
||||
sharpness = SHARP_POINTY //It cant be sharpend cook -_-
|
||||
attack_verb = list("stabs", "punctures", "pierces", "pokes")
|
||||
hitsound = 'sound/weapons/rapierhit.ogg'
|
||||
total_mass = 0.4
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/obj/item/melee/transforming
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
var/active = FALSE
|
||||
var/force_on = 30 //force when active
|
||||
var/faction_bonus_force = 0 //Bonus force dealt against certain factions
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
attack_verb = list("attacked", "impaled", "pierced")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
max_integrity = 200
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
I.force = clamp(I.force + increment, 0, max)
|
||||
|
||||
user.visible_message("<span class='notice'>[user] sharpens [I] with [src]!</span>", "<span class='notice'>You sharpen [I], making it much more deadly than before.</span>")
|
||||
I.sharpness = IS_SHARP_ACCURATE
|
||||
I.sharpness = SHARP_POINTY
|
||||
I.throwforce = clamp(I.throwforce + increment, 0, max)
|
||||
I.name = "[prefix] [I.name]"
|
||||
name = "worn out [name]"
|
||||
|
||||
@@ -106,8 +106,8 @@
|
||||
var/disarming = (target_downed && (shield_flags & SHIELD_BASH_GROUND_SLAM_DISARM)) || (shield_flags & SHIELD_BASH_ALWAYS_DISARM) || (wallhit && (shield_flags & SHIELD_BASH_WALL_DISARM))
|
||||
var/knockdown = !target_downed && ((shield_flags & SHIELD_BASH_ALWAYS_KNOCKDOWN) || (wallhit && (shield_flags & SHIELD_BASH_WALL_KNOCKDOWN)))
|
||||
if(shieldbash_stagger_duration || knockdown)
|
||||
target.visible_message("<span class='warning'>[target] is knocked [knockdown? "to the floor" : "off balanace"]!</span>",
|
||||
"<span class='userdanger'>You are knocked [knockdown? "to the floor" : "off balanace"]!</span>")
|
||||
target.visible_message("<span class='warning'>[target] is knocked [knockdown? "to the floor" : "off balance"]!</span>",
|
||||
"<span class='userdanger'>You are knocked [knockdown? "to the floor" : "off balance"]!</span>")
|
||||
if(knockdown)
|
||||
target.KnockToFloor(disarming)
|
||||
else if(disarming)
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
icon_state = "large"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
item_flags = DROPDEL
|
||||
sharpness = TRUE
|
||||
sharpness = SHARP_EDGED
|
||||
|
||||
/obj/item/shrapnel/stingball // stingbang grenades
|
||||
name = "stingball"
|
||||
embedding = list(embed_chance=90, fall_chance=3, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.7, pain_mult=5, jostle_pain_mult=6, rip_time=15, embed_chance_turf_mod=-100)
|
||||
icon_state = "tiny"
|
||||
sharpness = FALSE
|
||||
sharpness = SHARP_NONE
|
||||
|
||||
/obj/item/shrapnel/bullet // bullets
|
||||
name = "bullet"
|
||||
@@ -30,23 +30,24 @@
|
||||
|
||||
/obj/item/projectile/bullet/shrapnel
|
||||
name = "flying shrapnel shard"
|
||||
damage = 8
|
||||
range = 10
|
||||
damage = 14
|
||||
range = 20
|
||||
armour_penetration = -30
|
||||
dismemberment = 5
|
||||
ricochets_max = 2
|
||||
ricochet_chance = 40
|
||||
ricochet_chance = 70
|
||||
shrapnel_type = /obj/item/shrapnel
|
||||
ricochet_incidence_leeway = 60
|
||||
sharpness = TRUE
|
||||
wound_bonus = 30
|
||||
sharpness = SHARP_EDGED
|
||||
wound_bonus = 40
|
||||
|
||||
/obj/item/projectile/bullet/shrapnel/mega
|
||||
name = "flying shrapnel hunk"
|
||||
range = 25
|
||||
dismemberment = 10
|
||||
ricochets_max = 4
|
||||
ricochet_chance = 90
|
||||
range = 45
|
||||
dismemberment = 15
|
||||
ricochets_max = 6
|
||||
ricochet_chance = 130
|
||||
ricochet_incidence_leeway = 0
|
||||
ricochet_decay_chance = 0.9
|
||||
|
||||
/obj/item/projectile/bullet/pellet/stingball
|
||||
@@ -71,10 +72,10 @@
|
||||
name = "breakbang pellet"
|
||||
damage = 10
|
||||
wound_bonus = 40
|
||||
sharpness = FALSE
|
||||
sharpness = SHARP_NONE
|
||||
|
||||
/obj/item/projectile/bullet/pellet/stingball/shred
|
||||
name = "shredbang pellet"
|
||||
damage = 10
|
||||
wound_bonus = 30
|
||||
sharpness = TRUE
|
||||
sharpness = SHARP_EDGED
|
||||
|
||||
@@ -15,14 +15,14 @@
|
||||
custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075)
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
max_integrity = 200
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
|
||||
var/obj/item/grenade/explosive = null
|
||||
var/war_cry = "AAAAARGH!!!"
|
||||
var/icon_prefix = "spearglass"
|
||||
var/wielded = FALSE // track wielded status on item
|
||||
wound_bonus = -25
|
||||
wound_bonus = -15
|
||||
bare_wound_bonus = 15
|
||||
|
||||
/obj/item/spear/Initialize()
|
||||
@@ -179,7 +179,7 @@
|
||||
custom_materials = null
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
icon_prefix = "bone_spear"
|
||||
|
||||
/obj/item/spear/bonespear/ComponentInitialize()
|
||||
|
||||
@@ -28,8 +28,7 @@
|
||||
|
||||
/obj/item/stack/medical/attack(mob/living/M, mob/user)
|
||||
. = ..()
|
||||
try_heal(M, user)
|
||||
|
||||
INVOKE_ASYNC(src, .proc/try_heal, M, user)
|
||||
|
||||
/obj/item/stack/medical/proc/try_heal(mob/living/M, mob/user, silent = FALSE)
|
||||
if(!M.can_inject(user, TRUE))
|
||||
@@ -132,11 +131,34 @@
|
||||
// gauze is only relevant for wounds, which are handled in the wounds themselves
|
||||
/obj/item/stack/medical/gauze/try_heal(mob/living/M, mob/user, silent)
|
||||
var/obj/item/bodypart/limb = M.get_bodypart(check_zone(user.zone_selected))
|
||||
if(limb)
|
||||
if(limb.brute_dam > 40)
|
||||
to_chat(user, "<span class='warning'>The bleeding on [user==M ? "your" : "[M]'s"] [limb.name] is from bruising, and cannot be treated with [src]!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There's no bleeding on [user==M ? "your" : "[M]'s"] [limb.name]</span>")
|
||||
if(!limb)
|
||||
to_chat(user, "<span class='notice'>There's nothing there to bandage!</span>")
|
||||
return
|
||||
if(!LAZYLEN(limb.wounds))
|
||||
to_chat(user, "<span class='notice'>There's no wounds that require bandaging on [user==M ? "your" : "[M]'s"] [limb.name]!</span>") // good problem to have imo
|
||||
return
|
||||
|
||||
var/gauzeable_wound = FALSE
|
||||
for(var/i in limb.wounds)
|
||||
var/datum/wound/woundies = i
|
||||
if(woundies.wound_flags & ACCEPTS_GAUZE)
|
||||
gauzeable_wound = TRUE
|
||||
break
|
||||
if(!gauzeable_wound)
|
||||
to_chat(user, "<span class='notice'>There's no wounds that require bandaging on [user==M ? "your" : "[M]'s"] [limb.name]!</span>") // good problem to have imo
|
||||
return
|
||||
|
||||
if(limb.current_gauze && (limb.current_gauze.absorption_capacity * 0.8 > absorption_capacity)) // ignore if our new wrap is < 20% better than the current one, so someone doesn't bandage it 5 times in a row
|
||||
to_chat(user, "<span class='warning'>The bandage currently on [user==M ? "your" : "[M]'s"] [limb.name] is still in good condition!</span>")
|
||||
return
|
||||
|
||||
user.visible_message("<span class='warning'>[user] begins wrapping the wounds on [M]'s [limb.name] with [src]...</span>", "<span class='warning'>You begin wrapping the wounds on [user == M ? "your" : "[M]'s"] [limb.name] with [src]...</span>")
|
||||
|
||||
if(!do_after(user, (user == M ? self_delay : other_delay), target=M))
|
||||
return
|
||||
|
||||
user.visible_message("<span class='green'>[user] applies [src] to [M]'s [limb.name].</span>", "<span class='green'>You bandage the wounds on [user == M ? "yourself" : "[M]'s"] [limb.name].</span>")
|
||||
limb.apply_gauze(src)
|
||||
|
||||
/obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, params)
|
||||
if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness())
|
||||
@@ -378,9 +400,9 @@
|
||||
C.emote("scream")
|
||||
for(var/i in C.bodyparts)
|
||||
var/obj/item/bodypart/bone = i
|
||||
var/datum/wound/brute/bone/severe/oof_ouch = new
|
||||
var/datum/wound/blunt/severe/oof_ouch = new
|
||||
oof_ouch.apply_wound(bone)
|
||||
var/datum/wound/brute/bone/critical/oof_OUCH = new
|
||||
var/datum/wound/blunt/critical/oof_OUCH = new
|
||||
oof_OUCH.apply_wound(bone)
|
||||
|
||||
for(var/i in C.bodyparts)
|
||||
|
||||
@@ -289,7 +289,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
|
||||
resistance_flags = ACID_PROOF
|
||||
armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100)
|
||||
max_integrity = 40
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
var/icon_prefix
|
||||
embedding = list("embed_chance" = 65)
|
||||
|
||||
|
||||
@@ -19,8 +19,9 @@
|
||||
return TRUE
|
||||
|
||||
/obj/item/storage/contents_explosion(severity, target)
|
||||
var/in_storage = istype(loc, /obj/item/storage)? (max(0, severity - 1)) : (severity)
|
||||
for(var/atom/A in contents)
|
||||
A.ex_act(severity, target)
|
||||
A.ex_act(in_storage, target)
|
||||
CHECK_TICK
|
||||
|
||||
//Cyberboss says: "USE THIS TO FILL IT, NOT INITIALIZE OR NEW"
|
||||
|
||||
@@ -20,7 +20,8 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
|
||||
var/has_latches = TRUE
|
||||
var/can_rubberify = TRUE
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //very protecc too
|
||||
wound_bonus = 5
|
||||
wound_bonus = -10
|
||||
bare_wound_bonus = 5
|
||||
|
||||
/obj/item/storage/toolbox/greyscale
|
||||
icon_state = "toolbox_default"
|
||||
|
||||
@@ -169,6 +169,14 @@
|
||||
O.imp = new /obj/item/implant/freedom(O)
|
||||
O.update_icon()
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_warp
|
||||
name = "boxed warp implant (with injector)"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_warp/PopulateContents()
|
||||
var/obj/item/implanter/O = new(src)
|
||||
O.imp = new /obj/item/implant/warp(O)
|
||||
O.update_icon()
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_microbomb
|
||||
name = "Microbomb Implant (with injector)"
|
||||
|
||||
@@ -401,7 +409,7 @@
|
||||
/obj/item/storage/box/syndie_kit/revolver
|
||||
|
||||
/obj/item/storage/box/syndie_kit/revolver/PopulateContents()
|
||||
new /obj/item/gun/ballistic/revolver(src)
|
||||
new /obj/item/gun/ballistic/revolver/syndicate(src)
|
||||
new /obj/item/ammo_box/a357(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/pistol
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
toolspeed = 1
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
|
||||
|
||||
wound_bonus = -10
|
||||
bare_wound_bonus = 5
|
||||
|
||||
/obj/item/crowbar/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
|
||||
|
||||
@@ -31,6 +31,9 @@
|
||||
"yellow" = rgb(255, 165, 0)
|
||||
)
|
||||
|
||||
wound_bonus = -10
|
||||
bare_wound_bonus = 5
|
||||
|
||||
/obj/item/screwdriver/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return(BRUTELOSS)
|
||||
|
||||
@@ -33,6 +33,8 @@
|
||||
heat = 3800
|
||||
tool_behaviour = TOOL_WELDER
|
||||
toolspeed = 1
|
||||
wound_bonus = 0
|
||||
bare_wound_bonus = 5
|
||||
|
||||
/obj/item/weldingtool/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
toolspeed = 1
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
|
||||
|
||||
wound_bonus = -10
|
||||
bare_wound_bonus = 5
|
||||
|
||||
/obj/item/wrench/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
|
||||
|
||||
@@ -447,7 +447,7 @@
|
||||
block_parry_data = null
|
||||
attack_verb = list("attacked", "struck", "hit")
|
||||
total_mass_on = TOTAL_MASS_TOY_SWORD
|
||||
sharpness = IS_BLUNT
|
||||
sharpness = SHARP_NONE
|
||||
|
||||
/obj/item/dualsaber/toy/ComponentInitialize()
|
||||
AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=0, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg')
|
||||
@@ -466,7 +466,7 @@
|
||||
attack_verb = list("attacked", "struck", "hit")
|
||||
total_mass_on = TOTAL_MASS_TOY_SWORD
|
||||
slowdown_wielded = 0
|
||||
sharpness = IS_BLUNT
|
||||
sharpness = SHARP_NONE
|
||||
|
||||
/obj/item/dualsaber/hypereutactic/toy/ComponentInitialize()
|
||||
AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=0, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg')
|
||||
@@ -1230,7 +1230,7 @@
|
||||
name = "steampunk watch"
|
||||
desc = "A stylish steampunk watch made out of thousands of tiny cogwheels."
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "dread_ipad"
|
||||
icon_state = "clockwork_slab"
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/cooldown = 0
|
||||
|
||||
@@ -65,7 +65,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
block_chance = 50
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
max_integrity = 200
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
|
||||
resistance_flags = FIRE_PROOF
|
||||
@@ -231,7 +231,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
block_chance = 50
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
max_integrity = 200
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
|
||||
resistance_flags = FIRE_PROOF
|
||||
@@ -375,6 +375,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
custom_materials = list(/datum/material/iron=1150, /datum/material/glass=75)
|
||||
attack_verb = list("hit", "bludgeoned", "whacked", "bonked")
|
||||
wound_bonus = -10
|
||||
|
||||
/obj/item/wirerod/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/shard))
|
||||
@@ -412,13 +413,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
|
||||
force = 2
|
||||
throwforce = 20 //This is never used on mobs since this has a 100% embed chance.
|
||||
throwforce = 10 //This is never used on mobs since this has a 100% embed chance.
|
||||
throw_speed = 4
|
||||
embedding = list("pain_mult" = 4, "embed_chance" = 100, "fall_chance" = 0, "embed_chance_turf_mod" = 15)
|
||||
armour_penetration = 40
|
||||
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
custom_materials = list(/datum/material/iron=500, /datum/material/glass=500)
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
@@ -431,7 +432,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
/obj/item/throwing_star/toy
|
||||
name = "toy throwing star"
|
||||
desc = "An aerodynamic disc strapped with adhesive for sticking to people, good for playing pranks and getting yourself killed by security."
|
||||
sharpness = IS_BLUNT
|
||||
sharpness = SHARP_NONE
|
||||
force = 0
|
||||
throwforce = 0
|
||||
embedding = list("pain_mult" = 0, "jostle_pain_mult" = 0, "embed_chance" = 100, "fall_chance" = 0)
|
||||
@@ -468,7 +469,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
icon_state = extended_icon_state
|
||||
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
else
|
||||
force = initial(force)
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
@@ -476,7 +477,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
icon_state = retracted_icon_state
|
||||
attack_verb = list("stubbed", "poked")
|
||||
hitsound = 'sound/weapons/genhit.ogg'
|
||||
sharpness = IS_BLUNT
|
||||
sharpness = SHARP_NONE
|
||||
|
||||
/obj/item/switchblade/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is slitting [user.p_their()] own throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
@@ -577,7 +578,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
throwforce = 0
|
||||
throw_range = 0
|
||||
throw_speed = 0
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
|
||||
hitsound = 'sound/weapons/chainsawhit.ogg'
|
||||
total_mass = TOTAL_MASS_HAND_REPLACEMENT
|
||||
@@ -706,6 +707,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
obj_flags = UNIQUE_RENAME
|
||||
var/chaplain_spawnable = TRUE
|
||||
total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
|
||||
wound_bonus = -5
|
||||
|
||||
/obj/item/melee/baseball_bat/chaplain/Initialize()
|
||||
. = ..()
|
||||
@@ -975,7 +977,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
block_chance = 40
|
||||
throwforce = 20
|
||||
throw_speed = 4
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
attack_verb = list("cut", "sliced", "diced")
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
|
||||
@@ -127,18 +127,45 @@
|
||||
dismantle_wall(1)
|
||||
return
|
||||
|
||||
/turf/closed/wall/attack_hulk(mob/user, does_attack_animation = 0)
|
||||
..(user, 1)
|
||||
/turf/closed/wall/attack_hulk(mob/living/carbon/user)
|
||||
..()
|
||||
var/obj/item/bodypart/arm = user.hand_bodyparts[user.active_hand_index]
|
||||
if(!arm)
|
||||
return
|
||||
if(arm.disabled)
|
||||
return
|
||||
if(prob(hardness))
|
||||
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
|
||||
playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE)
|
||||
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
|
||||
hulk_recoil(arm, user)
|
||||
dismantle_wall(1)
|
||||
|
||||
else
|
||||
playsound(src, 'sound/effects/bang.ogg', 50, 1)
|
||||
playsound(src, 'sound/effects/bang.ogg', 50, TRUE)
|
||||
add_dent(WALL_DENT_HIT)
|
||||
to_chat(user, text("<span class='notice'>You punch the wall.</span>"))
|
||||
user.visible_message("<span class='danger'>[user] smashes \the [src]!</span>", \
|
||||
"<span class='danger'>You smash \the [src]!</span>", \
|
||||
"<span class='hear'>You hear a booming smash!</span>")
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
*Deals damage back to the hulk's arm.
|
||||
*
|
||||
*When a hulk manages to break a wall using their hulk smash, this deals back damage to the arm used.
|
||||
*This is in its own proc just to be easily overridden by other wall types. Default allows for three
|
||||
*smashed walls per arm. Also, we use CANT_WOUND here because wounds are random. Wounds are applied
|
||||
*by hulk code based on arm damage and checked when we call break_an_arm().
|
||||
*Arguments:
|
||||
**arg1 is the arm to deal damage to.
|
||||
**arg2 is the hulk
|
||||
*/
|
||||
/turf/closed/wall/proc/hulk_recoil(obj/item/bodypart/arm, mob/living/carbon/human/hulkman, var/damage = 20)
|
||||
arm.receive_damage(brute = damage, blocked = 0, wound_bonus = CANT_WOUND)
|
||||
var/datum/mutation/human/hulk/smasher = locate(/datum/mutation/human/hulk) in hulkman.dna.mutations
|
||||
if(!smasher || !damage) //sanity check but also snow and wood walls deal no recoil damage, so no arm breaky
|
||||
return
|
||||
smasher.break_an_arm(arm)
|
||||
|
||||
/turf/closed/wall/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
to_chat(user, "<span class='notice'>You push the wall but nothing happens!</span>")
|
||||
playsound(src, 'sound/weapons/genhit.ogg', 25, 1)
|
||||
|
||||
@@ -1283,9 +1283,9 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
ADMIN_PUNISHMENT_SHOES,
|
||||
ADMIN_PUNISHMENT_PICKLE,
|
||||
ADMIN_PUNISHMENT_FRY,
|
||||
ADMIN_PUNISHMENT_CRACK,
|
||||
ADMIN_PUNISHMENT_BLEED,
|
||||
ADMIN_PUNISHMENT_SCARIFY)
|
||||
ADMIN_PUNISHMENT_CRACK,
|
||||
ADMIN_PUNISHMENT_BLEED,
|
||||
ADMIN_PUNISHMENT_SCARIFY)
|
||||
|
||||
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list
|
||||
|
||||
@@ -1368,28 +1368,74 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/C = target
|
||||
for(var/obj/item/bodypart/squish_part in C.bodyparts)
|
||||
var/type_wound = pick(list(/datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/moderate))
|
||||
for(var/i in C.bodyparts)
|
||||
var/obj/item/bodypart/squish_part = i
|
||||
var/type_wound = pick(list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate))
|
||||
squish_part.force_wound_upwards(type_wound, smited=TRUE)
|
||||
if(ADMIN_PUNISHMENT_BLEED)
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/C = target
|
||||
for(var/obj/item/bodypart/slice_part in C.bodyparts)
|
||||
var/type_wound = pick(list(/datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate))
|
||||
for(var/i in C.bodyparts)
|
||||
var/obj/item/bodypart/slice_part = i
|
||||
var/type_wound = pick(list(/datum/wound/slash/severe, /datum/wound/slash/moderate))
|
||||
slice_part.force_wound_upwards(type_wound, smited=TRUE)
|
||||
type_wound = pick(list(/datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate))
|
||||
type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate))
|
||||
slice_part.force_wound_upwards(type_wound, smited=TRUE)
|
||||
type_wound = pick(list(/datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe))
|
||||
type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe))
|
||||
slice_part.force_wound_upwards(type_wound, smited=TRUE)
|
||||
if(ADMIN_PUNISHMENT_SCARIFY)
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/C = target
|
||||
C.generate_fake_scars(rand(1, 4))
|
||||
to_chat(C, "<span class='warning'>You feel your body grow jaded and torn...</span>")
|
||||
var/mob/living/carbon/dude = target
|
||||
dude.generate_fake_scars(rand(1, 4))
|
||||
to_chat(dude, "<span class='warning'>You feel your body grow jaded and torn...</span>")
|
||||
if(ADMIN_PUNISHMENT_PERFORATE)
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
|
||||
var/list/how_fucked_is_this_dude = list("A little", "A lot", "So fucking much", "FUCK THIS DUDE")
|
||||
var/hatred = input("How much do you hate this guy?") in how_fucked_is_this_dude
|
||||
var/repetitions
|
||||
var/shots_per_limb_per_rep = 2
|
||||
var/damage
|
||||
switch(hatred)
|
||||
if("A little")
|
||||
repetitions = 1
|
||||
damage = 5
|
||||
if("A lot")
|
||||
repetitions = 2
|
||||
|
||||
damage = 8
|
||||
if("So fucking much")
|
||||
repetitions = 3
|
||||
damage = 10
|
||||
if("FUCK THIS DUDE")
|
||||
repetitions = 4
|
||||
damage = 10
|
||||
|
||||
var/mob/living/carbon/dude = target
|
||||
var/list/open_adj_turfs = get_adjacent_open_turfs(dude)
|
||||
var/list/wound_bonuses = list(15, 70, 110, 250)
|
||||
|
||||
var/delay_per_shot = 1
|
||||
var/delay_counter = 1
|
||||
|
||||
dude.Immobilize(5 SECONDS)
|
||||
for(var/wound_bonus_rep in 1 to repetitions)
|
||||
for(var/i in dude.bodyparts)
|
||||
var/obj/item/bodypart/slice_part = i
|
||||
var/shots_this_limb = 0
|
||||
for(var/t in shuffle(open_adj_turfs))
|
||||
var/turf/iter_turf = t
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/firing_squad, dude, iter_turf, slice_part.body_zone, wound_bonuses[wound_bonus_rep], damage), delay_counter)
|
||||
delay_counter += delay_per_shot
|
||||
shots_this_limb++
|
||||
if(shots_this_limb > shots_per_limb_per_rep)
|
||||
break
|
||||
if(ADMIN_PUNISHMENT_PICKLE)
|
||||
target.turn_into_pickle()
|
||||
if(ADMIN_PUNISHMENT_FRY)
|
||||
@@ -1408,6 +1454,31 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
|
||||
punish_log(target, punishment)
|
||||
|
||||
/**
|
||||
* firing_squad is a proc for the :B:erforate smite to shoot each individual bullet at them, so that we can add actual delays without sleep() nonsense
|
||||
*
|
||||
* Hilariously, if you drag someone away mid smite, the bullets will still chase after them from the original spot, possibly hitting other people. Too funny to fix imo
|
||||
*
|
||||
* Arguments:
|
||||
* * target- guy we're shooting obviously
|
||||
* * source_turf- where the bullet begins, preferably on a turf next to the target
|
||||
* * body_zone- which bodypart we're aiming for, if there is one there
|
||||
* * wound_bonus- the wounding power we're assigning to the bullet, since we don't care about the base one
|
||||
* * damage- the damage we're assigning to the bullet, since we don't care about the base one
|
||||
*/
|
||||
/proc/firing_squad(mob/living/carbon/target, turf/source_turf, body_zone, wound_bonus, damage)
|
||||
if(!target.get_bodypart(body_zone))
|
||||
return
|
||||
playsound(target, 'sound/weapons/shot.ogg', 100)
|
||||
var/obj/item/projectile/bullet/smite/divine_wrath = new(source_turf)
|
||||
divine_wrath.damage = damage
|
||||
divine_wrath.wound_bonus = wound_bonus
|
||||
divine_wrath.original = target
|
||||
divine_wrath.def_zone = body_zone
|
||||
divine_wrath.spread = 0
|
||||
divine_wrath.preparePixelProjectile(target, source_turf)
|
||||
divine_wrath.fire()
|
||||
|
||||
/client/proc/punish_log(var/whom, var/punishment)
|
||||
var/msg = "[key_name_admin(usr)] punished [key_name_admin(whom)] with [punishment]."
|
||||
message_admins(msg)
|
||||
|
||||
@@ -270,13 +270,15 @@
|
||||
|
||||
/datum/antagonist/bloodsucker/AmFinalDeath()
|
||||
return owner && owner.AmFinalDeath()
|
||||
/datum/antagonist/changeling/AmFinalDeath()
|
||||
return owner && owner.AmFinalDeath()
|
||||
|
||||
/datum/mind/proc/AmFinalDeath()
|
||||
return !current || QDELETED(current) || !isliving(current) || isbrain(current) || !get_turf(current) // NOTE: "isliving()" is not the same as STAT == CONSCIOUS. This is to make sure you're not a BORG (aka silicon)
|
||||
|
||||
/datum/antagonist/bloodsucker/proc/FinalDeath()
|
||||
//Dont bother if we are already supposed to be dead
|
||||
if(FinalDeath)
|
||||
return
|
||||
FinalDeath = TRUE //We are now supposed to die. Lets not spam it.
|
||||
if(!iscarbon(owner.current)) //Check for non carbons.
|
||||
owner.current.gib()
|
||||
return
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
var/level_bloodcost
|
||||
var/passive_blood_drain = -0.1 //The amount of blood we loose each bloodsucker life() tick
|
||||
var/notice_healing //Var to see if you are healing for preventing spam of the chat message inform the user of such
|
||||
var/FinalDeath //Have we reached final death? Used to prevent spam.
|
||||
// LISTS
|
||||
var/static/list/defaultTraits = list (TRAIT_STABLEHEART, TRAIT_NOBREATH, TRAIT_SLEEPIMMUNE, TRAIT_NOCRITDAMAGE, TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_NIGHT_VISION, \
|
||||
TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_AGEUSIA, TRAIT_COLDBLOODED, TRAIT_NONATURALHEAL, TRAIT_NOMARROW, TRAIT_NOPULSE, TRAIT_VIRUSIMMUNE, TRAIT_NODECAP, TRAIT_NOGUT)
|
||||
@@ -683,6 +684,8 @@
|
||||
owner.current.hud_used.sunlight_display.invisibility = INVISIBILITY_ABSTRACT
|
||||
|
||||
/datum/antagonist/bloodsucker/proc/update_hud(updateRank=FALSE)
|
||||
if(FinalDeath)
|
||||
return
|
||||
// No Hud? Get out.
|
||||
if(!owner.current.hud_used)
|
||||
return
|
||||
|
||||
@@ -361,9 +361,9 @@
|
||||
torture_time -= I.force / 4
|
||||
torture_dmg_brute += I.force / 4
|
||||
//torture_dmg_burn += I.
|
||||
if(I.sharpness == IS_SHARP)
|
||||
if(I.sharpness == SHARP_EDGED)
|
||||
torture_time -= 1
|
||||
else if(I.sharpness == IS_SHARP_ACCURATE)
|
||||
else if(I.sharpness == SHARP_POINTY)
|
||||
torture_time -= 2
|
||||
if(istype(I, /obj/item/weldingtool))
|
||||
var/obj/item/weldingtool/welder = I
|
||||
|
||||
@@ -164,7 +164,7 @@
|
||||
armour_penetration = 20
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
wound_bonus = -60
|
||||
bare_wound_bonus = 20
|
||||
var/can_drop = FALSE
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
C.regenerate_limbs(1)
|
||||
C.regenerate_organs()
|
||||
for(var/i in C.all_wounds)
|
||||
var/datum/wound/W = i
|
||||
W.remove_wound()
|
||||
var/datum/wound/iter_wound = i
|
||||
iter_wound.remove_wound()
|
||||
if(!user.getorganslot(ORGAN_SLOT_BRAIN))
|
||||
var/obj/item/organ/brain/B
|
||||
if(C.has_dna() && C.dna.species.mutant_brain)
|
||||
|
||||
@@ -405,3 +405,49 @@
|
||||
animation_number = initial(animation_number)
|
||||
sigil_active = FALSE
|
||||
animate(src, alpha = initial(alpha), time = 10, flags = ANIMATION_END_NOW)
|
||||
|
||||
/obj/effect/clockwork/sigil/rite
|
||||
name = "radiant sigil"
|
||||
desc = "A glowing sigil glowing with barely-contained power."
|
||||
clockwork_desc = "A sigil that will allow you to perform certain rites on it, provided you have access to sufficient power and materials."
|
||||
icon_state = "sigiltransmission" //am big lazy - recolored transmission sigil
|
||||
sigil_name = "Sigil of Rites"
|
||||
alpha = 255
|
||||
var/performing_rite = FALSE
|
||||
color = "#ffe63a"
|
||||
light_color = "#ffe63a"
|
||||
light_range = 1
|
||||
light_power = 2
|
||||
|
||||
/obj/effect/clockwork/sigil/rite/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(!is_servant_of_ratvar(user))
|
||||
return
|
||||
if(!GLOB.all_clockwork_rites.len) //Did we already generate the list?
|
||||
generate_all_rites()
|
||||
if(performing_rite)
|
||||
to_chat(user, "<span class='warning'>Someone is already performing a rite here!")
|
||||
return
|
||||
var/list/possible_rites = list()
|
||||
for(var/datum/clockwork_rite/R in GLOB.all_clockwork_rites)
|
||||
possible_rites[R] = R
|
||||
var/input_key = input(user, "Choose a rite", "Choosing a rite") as null|anything in possible_rites
|
||||
if(!input_key)
|
||||
return
|
||||
var/datum/clockwork_rite/CR = possible_rites[input_key]
|
||||
if(!CR)
|
||||
return
|
||||
var/choice = alert(user, "What to do with this rite?", "What to do?", "Cast", "Show Info", "Cancel")
|
||||
switch(choice)
|
||||
if("Cast")
|
||||
CR.try_cast(src, user)
|
||||
if("Show Info")
|
||||
var/infotext = CR.build_info()
|
||||
to_chat(user, infotext)
|
||||
|
||||
/obj/effect/clockwork/sigil/rite/proc/generate_all_rites() //The first time someone uses a sigil of rites, all the rites are actually generated. No need to have a bunch of random datums laying around all the time.
|
||||
for(var/V in subtypesof(/datum/clockwork_rite))
|
||||
var/datum/clockwork_rite/R = new V
|
||||
GLOB.all_clockwork_rites += R
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
//This file is for clock rites, mainly used by the Sigil of Rites in clock_sigils.dm
|
||||
//The rites themselves are in this file to prevent bloating the other file too much, aswell as for easier access
|
||||
|
||||
#define INFINITE -1
|
||||
|
||||
//The base clockwork rite. This should never be visible
|
||||
/datum/clockwork_rite
|
||||
var/name = "Rite of THE frog" //The name of the rite
|
||||
var/desc = "This rite is used to summon the legendary frog whose-name-shall-not-be-spoken, ender of many worlds." //What does this rite do? Shown to cultists if they choose 'Show Info' after selecting the rite.
|
||||
var/list/required_ingredients = list(/obj/item/clockwork) //What does this rite require?
|
||||
var/power_cost = 0 //How much power does this rite cost.. or does it even add power?
|
||||
var/requires_human = FALSE //Does the rite require a ../carbon/human on the rune?
|
||||
var/must_be_servant = TRUE //If the above is true, does the human need to be a servant?
|
||||
var/target_can_be_invoker = TRUE //Does this rite work if the invoker is also the target?
|
||||
var/cast_time = 0 //How long does the rite take to cast?
|
||||
var/limit = INFINITE //How often can this rite be used per round? Set this to INFINITE for unlimited, 0 for disallowed, anything above 0 for a limit
|
||||
var/times_used = 0 //How often has the rite already been used this shift?
|
||||
var/rite_cast_sound = 'sound/items/bikehorn.ogg' //The sound played when successfully casting the rite. If it honks, the one adding the rite forgot to set one (or was just lazy).
|
||||
|
||||
/datum/clockwork_rite/proc/try_cast(var/obj/effect/clockwork/sigil/rite/R, var/mob/living/invoker) //Performs a ton of checks to see if the invoker can cast the rite
|
||||
if(!istype(R))
|
||||
return FALSE
|
||||
if(!R || !R.loc)
|
||||
return FALSE
|
||||
var/turf/T = R.loc
|
||||
if(!T) //Uh oh something is fucky
|
||||
return FALSE
|
||||
|
||||
if(limit != INFINITE && times_used >= limit) //Is the limit on casts exceeded?
|
||||
to_chat(invoker, "<span class='brass'>There are no more uses left for this rite!</span>")
|
||||
return FALSE
|
||||
|
||||
var/mob/living/carbon/human/H //This is only used if requires_human is TRUE
|
||||
if(requires_human) //In case this requires a target
|
||||
for(var/mob/living/carbon/human/possible_H in T)
|
||||
if((!must_be_servant || is_servant_of_ratvar(possible_H)) && (target_can_be_invoker || invoker != possible_H))
|
||||
H = possible_H
|
||||
break
|
||||
if(!H)
|
||||
to_chat(invoker, "<span class='brass'>There is no target for the rite on the sigil!</span>")
|
||||
return FALSE
|
||||
|
||||
if(required_ingredients.len) //In case this requires materials
|
||||
var/is_missing_materials = FALSE
|
||||
for(var/I in required_ingredients)
|
||||
var/obj/item/Material = locate(I) in T
|
||||
if(!Material)
|
||||
is_missing_materials = TRUE
|
||||
break
|
||||
if(is_missing_materials)
|
||||
var/still_required_string = ""
|
||||
for(var/i = 1 to required_ingredients.len)
|
||||
var/obj/O = required_ingredients[i]
|
||||
if(i != 1)
|
||||
still_required_string += ", "
|
||||
still_required_string += "a [initial(O.name)]"
|
||||
to_chat(invoker, "<span class='brass'>There are still materials missing for this rite. You require [still_required_string].</span>")
|
||||
return FALSE
|
||||
|
||||
if(power_cost) //If this costs power
|
||||
if(!get_clockwork_power(power_cost))
|
||||
to_chat(invoker, "<span class='brass'>There is not enough power for this rite!</span>")
|
||||
return FALSE
|
||||
R.performing_rite = TRUE
|
||||
if(!do_after(invoker, cast_time, target = R))
|
||||
to_chat(invoker, "<span class='warning'>Your rite is disrupted.</span>")
|
||||
R.performing_rite = FALSE
|
||||
return FALSE
|
||||
. = cast(invoker, T, H)
|
||||
if(!.)
|
||||
to_chat(invoker, "<span class='warning'> You fail casting [name]</span>")
|
||||
post_cast(FALSE)
|
||||
else
|
||||
to_chat(invoker, "<span class='warning'>You successfully cast [name]</span>")
|
||||
post_cast(TRUE)
|
||||
R.performing_rite = FALSE
|
||||
return
|
||||
|
||||
/datum/clockwork_rite/proc/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) //Casts the rite and uses up ingredients. Doublechecks some things to prevent bypassing some restrictions via funky timing or badminnery.
|
||||
if(!T || !invoker)
|
||||
return FALSE
|
||||
if(requires_human && !target)
|
||||
return FALSE
|
||||
if(power_cost && !get_clockwork_power(power_cost))
|
||||
return FALSE
|
||||
adjust_clockwork_power(-power_cost)
|
||||
if(limit != INFINITE && times_used >= limit)
|
||||
return FALSE
|
||||
if(required_ingredients.len)
|
||||
var/is_missing_materials = FALSE
|
||||
for(var/I in required_ingredients)
|
||||
var/obj/item/Material = locate(I) in T
|
||||
if(!Material)
|
||||
is_missing_materials = TRUE
|
||||
break
|
||||
qdel(Material)
|
||||
if(is_missing_materials)
|
||||
return FALSE
|
||||
playsound(T, rite_cast_sound, 50, 2)
|
||||
return TRUE
|
||||
|
||||
/datum/clockwork_rite/proc/post_cast(var/cast_succeeded)
|
||||
if(cast_succeeded)
|
||||
times_used++
|
||||
return TRUE
|
||||
|
||||
/datum/clockwork_rite/proc/build_info() //Constructs the info text of a given rite, based on the vars of the rite
|
||||
. = ""
|
||||
. += "<span class='brass'>This is the <b>[name]</b>.\n"
|
||||
. += "[desc]\n"
|
||||
. += "It requires: "
|
||||
if(required_ingredients.len)
|
||||
var/material_string = ""
|
||||
for(var/i = 1 to required_ingredients.len)
|
||||
var/obj/O = required_ingredients[i]
|
||||
if(i != 1)
|
||||
material_string += ", "
|
||||
material_string += "a [initial(O.name)]"
|
||||
. += "[material_string].\n"
|
||||
else
|
||||
. += "</span><span class='inathneq_small'><b>no</b><span class='brass'> materials.\n"
|
||||
. += "It [power_cost >= 0 ? "costs" : "generates"]<span class='inathneq_small'><b> [power_cost ? "[power_cost]" : "no"] </b><span class='brass'>power.\n"
|
||||
. += "It requires <span class='inathneq_small'><b>[requires_human ? " a human" : " no"]</b><span class='brass'> target.\n"
|
||||
if(requires_human)
|
||||
. += "The target <span class='inathneq_small'><b>[must_be_servant ? "cannot be" : "can be"] </b><span class='brass'> a nonservant.\n"
|
||||
. += "The target <span class='inathneq_small'><b>[target_can_be_invoker ? "can be" : "cannot be"]</b><span class='brass'> the invoker.\n"
|
||||
. += "It requires <span class='inathneq_small'><b>[cast_time/10]</b><span class='brass'> seconds to cast.\n"
|
||||
. += "It has been used <span class='inathneq_small'><b>[times_used]</b><span class='brass'> time[times_used != 1 ? "s" : ""], out of <span class='inathneq_small'><b>[limit != INFINITE ? "[limit]" : "infinite"]</b><span class='brass'> available uses.</span>"
|
||||
|
||||
//Adds a organ or cybernetic implant to a servant without the need for surgery. Cannot be used with brains for.. reasons.
|
||||
/datum/clockwork_rite/advancement
|
||||
name = "Rite of Advancement"
|
||||
desc = "This rite is used to augment a servant with organs or cybernetic implants. The organ of choice, aswell as the servant and the required ingredients must be placed on the sigil for this rite to take place."
|
||||
required_ingredients = list(/obj/item/assembly/prox_sensor, /obj/item/stock_parts/cell)
|
||||
power_cost = 500
|
||||
requires_human = TRUE
|
||||
cast_time = 40
|
||||
rite_cast_sound = 'sound/magic/blind.ogg'
|
||||
|
||||
/datum/clockwork_rite/advancement/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target)
|
||||
var/obj/item/organ/O = locate(/obj/item/organ) in T
|
||||
if(!O)
|
||||
return FALSE
|
||||
if(istype(O, /obj/item/organ/brain)) //NOPE
|
||||
return FALSE
|
||||
. = ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
O.Insert(target)
|
||||
new /obj/effect/temp_visual/ratvar/sigil/transgression(T)
|
||||
|
||||
//Heals all wounds (not damage) on the target, causing toxloss proportional to amount of wounds healed. 10 damage per wound.
|
||||
/datum/clockwork_rite/treat_wounds
|
||||
name = "Rite of Woundmending"
|
||||
desc = "This rite is used to heal wounds of the servant on the rune. It causes toxins damage proportional to the amount of wounds healed. This can be lethal if performed on an critically injured target."
|
||||
required_ingredients = list(/obj/item/stock_parts/cell, /obj/item/healthanalyzer, /obj/item/reagent_containers/food/drinks/bottle/holyoil)
|
||||
power_cost = 300
|
||||
requires_human = TRUE
|
||||
must_be_servant = FALSE
|
||||
target_can_be_invoker = FALSE
|
||||
cast_time = 80
|
||||
rite_cast_sound = 'sound/magic/staff_healing.ogg'
|
||||
|
||||
/datum/clockwork_rite/treat_wounds/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target)
|
||||
if(!target)
|
||||
return FALSE
|
||||
if(!target.all_wounds.len)
|
||||
to_chat(invoker, "<span class='inathneq_small'>This one does not require mending.</span>")
|
||||
return FALSE
|
||||
.= ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
target.adjustToxLoss(10 * target.all_wounds.len)
|
||||
QDEL_LIST(target.all_wounds)
|
||||
to_chat(target, "<span class='warning'>You feel your wounds heal, but are overcome with deep nausea.</span>")
|
||||
new /obj/effect/temp_visual/ratvar/sigil/vitality(T)
|
||||
|
||||
//Summons a brass claw implant on the sigil, which can extend a claw that benefits from repeatedly attacking a single target. Can only be cast a limited amount of times.
|
||||
/datum/clockwork_rite/summon_claw
|
||||
name = "Rite of the Claw"
|
||||
desc = "Summons a special arm implant that, when added to a servant's limb, will allow them to extend and retract a claw at will. Don't leave any implants you want to keep on this rune when casting the rite."
|
||||
required_ingredients = list(/obj/item/stock_parts/cell, /obj/item/organ/cyberimp, /obj/item/assembly/flash)
|
||||
power_cost = 1000
|
||||
cast_time = 60
|
||||
limit = 4
|
||||
rite_cast_sound = 'sound/magic/clockwork/fellowship_armory.ogg'
|
||||
|
||||
/datum/clockwork_rite/summon_claw/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
var/obj/item/organ/cyberimp/arm/clockwork/claw/CL = new /obj/item/organ/cyberimp/arm/clockwork/claw(T)
|
||||
CL.visible_message("<span class='warning'>[CL] materialises out of thin air!")
|
||||
new /obj/effect/temp_visual/ratvar/sigil/transmission(T,2)
|
||||
|
||||
#undef INFINITE
|
||||
@@ -0,0 +1,32 @@
|
||||
//This file is for snowflakey clock augmentations and clock-themed cybernetic implants.
|
||||
|
||||
//The base clockie arm implant, which only clock cultist can use unless it is emagged. THIS SHOULD NEVER ACTUALLY EXIST
|
||||
/obj/item/organ/cyberimp/arm/clockwork
|
||||
name = "clock-themed arm-mounted implant"
|
||||
var/clockwork_desc = "According to Ratvar, this really shouldn't exist. Tell Him about this immediately."
|
||||
syndicate_implant = TRUE
|
||||
icon_state = "clock_arm_implant"
|
||||
|
||||
/obj/item/organ/cyberimp/arm/clockwork/ui_action_click()
|
||||
if(is_servant_of_ratvar(owner) || (obj_flags & EMAGGED)) //If you somehow manage to steal a clockie's implant AND have an emag AND manage to get it implanted for yourself, good on ya!
|
||||
return ..()
|
||||
to_chat(owner, "<span class='warning'>The implant refuses to activate..</span>")
|
||||
|
||||
/obj/item/organ/cyberimp/arm/clockwork/examine(mob/user)
|
||||
if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc)
|
||||
desc = clockwork_desc
|
||||
. = ..()
|
||||
desc = initial(desc)
|
||||
|
||||
/obj/item/organ/cyberimp/arm/clockwork/emag_act()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(usr, "<span class='notice'>You emag [src], hoping it'll achieve something..</span>")
|
||||
|
||||
//Brass claw implant. Holds the brass claw from brass_claw.dm and can extend / retract it at will.
|
||||
/obj/item/organ/cyberimp/arm/clockwork/claw
|
||||
name = "brass claw implant"
|
||||
desc = "Yikes, the claw attached to this looks pretty darn sharp."
|
||||
clockwork_desc = "This implant, when added to a servant's arm, allows them to extend and retract a claw at will, though this is mildly painful to do. It will refuse to work for any non-servants."
|
||||
contents = newlist(/obj/item/clockwork/brass_claw)
|
||||
@@ -0,0 +1,51 @@
|
||||
//Brass claw, an armblade-like weapon used by a clock implant. Stealthy if retracted, very obvious if active.
|
||||
//Bit weaker than an armblade strength-wise but gains combo on consecutive attacks against the same target, which causes bonus damage
|
||||
|
||||
/obj/item/clockwork/brass_claw
|
||||
name = "brass claw"
|
||||
desc = "A very sharp claw made out of brass."
|
||||
clockwork_desc = "A incredibly sharp claw made out of brass. It is quite effective at crippling enemies, though very obvious when extended.\nGains combo on consecutive attacks against a target, causing bonus damage."
|
||||
icon_state = "brass_claw" //Codersprite moment
|
||||
item_state = "brass_claw"
|
||||
lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
force = 15 //Doesn't generate vitality like the spear does / has somewhat less damage, but quite good at wounding and gets through armor pretty well. Also gains 2 bonus damage per consecutive attack on the same target
|
||||
throwforce = 0 //haha yes lets be safe about this
|
||||
throw_range = 0
|
||||
throw_speed = 0
|
||||
armour_penetration = 20
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
sharpness = SHARP_EDGED
|
||||
wound_bonus = 5
|
||||
bare_wound_bonus = 15
|
||||
total_mass = TOTAL_MASS_HAND_REPLACEMENT
|
||||
var/mob/living/last_attacked
|
||||
var/combo = 0
|
||||
var/damage_per_combo = 2
|
||||
var/maximum_combo_damage = 18 //33 damage on max stacks. Usually the target will already be dead by then but if they somehow aren't, better to have this capped
|
||||
|
||||
/obj/item/clockwork/brass_claw/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/butchering, 60, 80)
|
||||
|
||||
/obj/item/clockwork/brass_claw/examine(mob/user)
|
||||
if(is_servant_of_ratvar(user))
|
||||
clockwork_desc += "\n<span class='brass'>It has </span><span class='inathneq_small'><b>[combo]</span></b><span class='brass'> combo stacks built up against the current target, causing </span><span class='inathneq_small'><b>[min(maximum_combo_damage, combo * damage_per_combo)]</span></b><span class='brass'> bonus damage.</span>"
|
||||
. = ..()
|
||||
clockwork_desc = initial(clockwork_desc)
|
||||
|
||||
/obj/item/clockwork/brass_claw/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
. = ..()
|
||||
if(QDELETED(target) || target.anti_magic_check(chargecost = 0) || is_servant_of_ratvar(target))
|
||||
return
|
||||
if(target != last_attacked) //Loses all combat on switching targets
|
||||
last_attacked = target
|
||||
combo = 0
|
||||
else
|
||||
if(!iscultist(target)) //Hostile cultists being hit stacks up combo far faster than usual
|
||||
combo++
|
||||
else
|
||||
combo += 3
|
||||
target.adjustBruteLoss(min(maximum_combo_damage, combo * damage_per_combo))
|
||||
@@ -8,10 +8,12 @@
|
||||
force = 15 //Extra damage is dealt to targets in attack()
|
||||
throwforce = 25
|
||||
armour_penetration = 10
|
||||
sharpness = IS_SHARP_ACCURATE
|
||||
sharpness = SHARP_POINTY
|
||||
attack_verb = list("stabbed", "poked", "slashed")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
block_parry_data = /datum/block_parry_data/ratvarian_spear
|
||||
item_flags = ITEM_CAN_PARRY
|
||||
var/bonus_burn = 5
|
||||
|
||||
/obj/item/clockwork/weapon/ratvarian_spear/ratvar_act()
|
||||
@@ -43,7 +45,7 @@
|
||||
else if(iscultist(target) || isconstruct(target))
|
||||
to_chat(target, "<span class='userdanger'>Your body flares with agony at [src]'s presence!</span>")
|
||||
bonus_damage *= 3 //total 30 damage on cultists, 50 with ratvar
|
||||
GLOB.clockwork_vitality += target.adjustFireLoss(bonus_damage) //adds the damage done to existing vitality
|
||||
GLOB.clockwork_vitality += max(0, target.adjustFireLoss(bonus_damage)) //adds the damage done to existing vitality
|
||||
|
||||
/obj/item/clockwork/weapon/ratvarian_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
||||
var/turf/T = get_turf(hit_atom)
|
||||
@@ -80,3 +82,15 @@
|
||||
new /obj/effect/temp_visual/ratvar/spearbreak(T)
|
||||
action.weapon_reset(RATVARIAN_WEAPON_COOLDOWN)
|
||||
|
||||
//A very short, very effective parry that counts on you predicting when the enemy will attack.
|
||||
/datum/block_parry_data/ratvarian_spear
|
||||
parry_time_windup = 0 //Very good for predicting
|
||||
parry_time_active = 3 //Very short
|
||||
parry_time_spindown = 1
|
||||
parry_time_perfect = 2
|
||||
parry_efficiency_perfect = 110 //Very low leeway for counterattacks...
|
||||
parry_efficiency_considered_successful = 0.8
|
||||
parry_efficiency_to_counterattack = 1
|
||||
parry_cooldown = 15 //But also very low cooldown..
|
||||
parry_failed_stagger_duration = 2 SECONDS //And relatively small penalties for failing.
|
||||
parry_failed_clickcd_duration = 1 SECONDS
|
||||
|
||||
@@ -143,6 +143,8 @@
|
||||
movement_type = FLYING
|
||||
AIStatus = AI_OFF //this has to be manually set so that the guardian doesn't start bashing the host, how annoying -_-
|
||||
loot = list(/obj/item/clockwork/component/geis_capacitor/fallen_armor)
|
||||
max_shield_health = 0
|
||||
shield_health = 0
|
||||
var/true_name = "Meme Master 69" //Required to call forth the guardian
|
||||
var/global/list/possible_true_names = list("Servant", "Warden", "Serf", "Page", "Usher", "Knave", "Vassal", "Escort")
|
||||
var/mob/living/host //The mob that the guardian is living inside of
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
desc = "Charges your slab with divine energy, allowing you to overwhelm a target with Ratvar's light."
|
||||
invocations = list("Divinity, show them your light!")
|
||||
whispered = TRUE
|
||||
channel_time = 10 // I think making kindle channel a third of the time less is a good make up for the fact that it silences people for such a little amount of time.
|
||||
channel_time = 15 // I think making kindle channel a third of the time less is a good make up for the fact that it silences people for such a little amount of time.
|
||||
power_cost = 125
|
||||
usage_tip = "The light can be used from up to two tiles away. Damage taken will GREATLY REDUCE the stun's duration."
|
||||
tier = SCRIPTURE_DRIVER
|
||||
|
||||
@@ -81,6 +81,25 @@
|
||||
return /obj/effect/clockwork/sigil/vitality/neutered
|
||||
return ..()
|
||||
|
||||
//Sigil of Rites: Creates a sigil that allows to perform certain rites on it. More information on these can be found in clock_rites.dm, they usually require power, materials and sometimes a target.
|
||||
/datum/clockwork_scripture/create_object/sigil_of_rites
|
||||
descname = "Sigil, Access to rites"
|
||||
name = "Sigil of Rites"
|
||||
desc = "Places a sigil that, when interacted with, will allow for a variety of rites to be performed on the sigil. These usually require power cells, clockwork power, and some other components."
|
||||
invocations = list("Engine, allow us..", ".. to be blessed with your rites.")
|
||||
channel_time = 80
|
||||
power_cost = 1400
|
||||
invokers_required = 2
|
||||
multiple_invokers_used = TRUE
|
||||
whispered = TRUE
|
||||
object_path = /obj/effect/clockwork/sigil/rite
|
||||
creator_message = "<span class='brass'>A sigil of Rites appears beneath you. It will allow you to perform certain rites, given sufficient materials and power.</span>"
|
||||
usage_tip = "It may be useful to coordinate to acquire needed materials quickly."
|
||||
tier = SCRIPTURE_SCRIPT
|
||||
one_per_tile = TRUE
|
||||
primary_component = HIEROPHANT_ANSIBLE
|
||||
sort_priority = 4
|
||||
|
||||
//Judicial Visor: Creates a judicial visor, which can smite an area.
|
||||
/datum/clockwork_scripture/create_object/judicial_visor
|
||||
descname = "Delayed Area Knockdown Glasses"
|
||||
@@ -96,7 +115,7 @@
|
||||
tier = SCRIPTURE_SCRIPT
|
||||
space_allowed = TRUE
|
||||
primary_component = BELLIGERENT_EYE
|
||||
sort_priority = 4
|
||||
sort_priority = 5
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Creates a Judicial Visor, which can smite an area, applying Belligerent and briefly stunning."
|
||||
|
||||
@@ -115,7 +134,7 @@
|
||||
tier = SCRIPTURE_SCRIPT
|
||||
space_allowed = TRUE
|
||||
primary_component = VANGUARD_COGWHEEL
|
||||
sort_priority = 6
|
||||
sort_priority = 7
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Creates a Ratvarian shield, which can absorb energy from attacks for use in powerful bashes."
|
||||
|
||||
@@ -131,7 +150,7 @@
|
||||
usage_tip = "Throwing the spear at a mob will do massive damage and knock them down, but break the spear. You will need to wait for 30 seconds before resummoning it."
|
||||
tier = SCRIPTURE_SCRIPT
|
||||
primary_component = VANGUARD_COGWHEEL
|
||||
sort_priority = 7
|
||||
sort_priority = 8
|
||||
important = TRUE
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Permanently binds clockwork armor and a Ratvarian spear to you."
|
||||
@@ -229,7 +248,7 @@
|
||||
usage_tip = "This is a very effective way to rapidly reinforce a base after an attack."
|
||||
tier = SCRIPTURE_SCRIPT
|
||||
primary_component = VANGUARD_COGWHEEL
|
||||
sort_priority = 8
|
||||
sort_priority = 9
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Repairs nearby structures and constructs. Servants wearing clockwork armor will also be healed.<br><b>Maximum 10 chants.</b>"
|
||||
var/heal_attempts = 4
|
||||
@@ -342,7 +361,7 @@
|
||||
usage_tip = "Though it requires you to stand still, this scripture can do massive damage."
|
||||
tier = SCRIPTURE_SCRIPT
|
||||
primary_component = BELLIGERENT_EYE
|
||||
sort_priority = 5
|
||||
sort_priority = 6
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Allows you to fire energy rays at target locations.<br><b>Maximum 5 chants.</b>"
|
||||
var/static/list/nzcrentr_insults = list("You're not very good at aiming.", "You hunt badly.", "What a waste of energy.", "Almost funny to watch.",
|
||||
@@ -391,7 +410,7 @@
|
||||
usage_tip = "It may be useful to end channelling early if the burning becomes too much to handle.."
|
||||
tier = SCRIPTURE_SCRIPT
|
||||
primary_component = GEIS_CAPACITOR
|
||||
sort_priority = 10
|
||||
sort_priority = 11
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Quickly drains power in an area around the invoker, causing burns proportional to the amount of energy drained.<br><b>Maximum of 20 chants.</b>"
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
force = 30 // whoever balanced this got beat in the head by a bible too many times good lord
|
||||
throwforce = 10
|
||||
@@ -114,7 +114,7 @@
|
||||
armour_penetration = 45
|
||||
throw_speed = 1
|
||||
throw_range = 3
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
light_color = "#ff0000"
|
||||
attack_verb = list("cleaved", "slashed", "torn", "hacked", "ripped", "diced", "carved")
|
||||
icon_state = "cultbastard"
|
||||
@@ -708,7 +708,7 @@
|
||||
armour_penetration = 30
|
||||
block_chance = 30
|
||||
attack_verb = list("attacked", "impaled", "stabbed", "torn", "gored")
|
||||
sharpness = IS_SHARP
|
||||
sharpness = SHARP_EDGED
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
var/datum/action/innate/cult/spear/spear_act
|
||||
var/wielded = FALSE // track wielded status on item
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
melee_damage_upper = 22.5
|
||||
wound_bonus = -10
|
||||
bare_wound_bonus = 0
|
||||
sharpness = TRUE
|
||||
sharpness = SHARP_EDGED
|
||||
see_in_dark = 8
|
||||
blood_volume = 0 //No bleeding on getting shot, for skeddadles
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
|
||||
@@ -259,7 +259,7 @@
|
||||
to_chat(target, "<span class='userdanger'>You suddenly feel very hot</span>")
|
||||
target.adjust_bodytemperature(50)
|
||||
GiveHint(target)
|
||||
else if(is_pointed(I))
|
||||
else if(I.get_sharpness() == SHARP_POINTY)
|
||||
to_chat(target, "<span class='userdanger'>You feel a stabbing pain in [parse_zone(user.zone_selected)]!</span>")
|
||||
target.DefaultCombatKnockdown(40)
|
||||
GiveHint(target)
|
||||
|
||||
@@ -81,3 +81,9 @@
|
||||
desc = "Contains one hellgun, an old pattern of laser gun infamous for its ability to horribly disfigure targets with burns. Technically violates the Space Geneva Convention when used on humanoids."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/gun/energy/laser/hellgun)
|
||||
|
||||
/datum/supply_pack/goody/medipen_twopak
|
||||
name = "Medipen Two-Pak"
|
||||
desc = "Contains one standard epinephrine medipen and one standard emergency first-aid kit medipen. For when you want to prepare for the worst."
|
||||
cost = 500
|
||||
contains = list(/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/hypospray/medipen/ekit)
|
||||
|
||||
@@ -218,3 +218,18 @@
|
||||
/obj/item/storage/box/beakers)
|
||||
crate_name = "virus containment unit crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/plasma
|
||||
|
||||
/datum/supply_pack/medical/medipen_variety
|
||||
name = "Medipen Variety-Pak"
|
||||
desc = "Contains eight different medipens in three different varieties, to assist in quickly treating seriously injured patients."
|
||||
cost = 2000
|
||||
contains = list(/obj/item/reagent_containers/hypospray/medipen/,
|
||||
/obj/item/reagent_containers/hypospray/medipen/,
|
||||
/obj/item/reagent_containers/hypospray/medipen/ekit,
|
||||
/obj/item/reagent_containers/hypospray/medipen/ekit,
|
||||
/obj/item/reagent_containers/hypospray/medipen/ekit,
|
||||
/obj/item/reagent_containers/hypospray/medipen/blood_loss,
|
||||
/obj/item/reagent_containers/hypospray/medipen/blood_loss,
|
||||
/obj/item/reagent_containers/hypospray/medipen/blood_loss)
|
||||
|
||||
crate_name = "medipen crate"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user