diff --git a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm
index b23f24b0e9..49646fbd71 100644
--- a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm
@@ -151,6 +151,7 @@
id_tag = "syndie_listeningpost_external";
req_access_txt = "150"
},
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/ruin/space/has_grav/listeningstation)
"aq" = (
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 1fc5ae5729..bf8c332cf0 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -13176,6 +13176,9 @@
dir = 8
},
/obj/effect/decal/cleanable/blood/old,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/security/courtroom)
"avX" = (
@@ -43673,10 +43676,6 @@
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
/area/maintenance/central/secondary)
-"bsm" = (
-/obj/machinery/status_display/evac,
-/turf/open/floor/plasteel,
-/area/engine/supermatter)
"bsn" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -62889,9 +62888,9 @@
pixel_x = 24
},
/obj/machinery/button/electrochromatic{
+ id = "!interrogation_room";
pixel_x = 38;
- pixel_y = -5;
- id = "!interrogation_room"
+ pixel_y = -5
},
/turf/open/floor/plasteel,
/area/security/warden)
@@ -84679,9 +84678,6 @@
},
/area/security/vacantoffice)
"fyr" = (
-/obj/machinery/light{
- dir = 4
- },
/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/closed/mineral/random/labormineral,
/area/space/nearstation)
@@ -84938,10 +84934,6 @@
/obj/structure/sign/warning/electricshock,
/turf/closed/wall/r_wall/rust,
/area/ai_monitored/turret_protected/ai_upload)
-"jPE" = (
-/obj/structure/cable,
-/turf/closed/mineral/random/labormineral,
-/area/space/nearstation)
"jQY" = (
/obj/structure/table/wood,
/obj/item/paper_bin,
@@ -119966,7 +119958,7 @@ ckw
cmw
xON
axa
-jPE
+aeu
aeu
aeU
dQe
@@ -121750,7 +121742,7 @@ clM
axW
cnk
coo
-ayn
+axU
aLH
aLx
aLz
@@ -122270,7 +122262,7 @@ aLF
aag
aag
aag
-bsm
+aLF
cuA
cuW
bYI
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index f8b44323a7..fbd4c1bf39 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -39225,7 +39225,7 @@
dir = 4
},
/obj/machinery/computer/station_alert,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
/turf/open/floor/plasteel/dark/corner{
@@ -39245,7 +39245,7 @@
dir = 4
},
/obj/structure/closet/secure_closet/atmospherics,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
/turf/open/floor/plasteel/dark/corner{
@@ -39262,10 +39262,10 @@
dir = 4
},
/obj/structure/closet/secure_closet/atmospherics,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
@@ -39278,9 +39278,6 @@
pixel_y = 24
},
/obj/machinery/computer/atmos_control,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
/turf/open/floor/plasteel/checker,
/area/engine/atmos)
"byW" = (
@@ -39294,7 +39291,7 @@
dir = 4
},
/obj/machinery/computer/atmos_control,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
/turf/open/floor/plasteel/checker,
@@ -39313,12 +39310,12 @@
pixel_x = -26
},
/obj/machinery/pipedispenser/disposal/transit_tube,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
/obj/effect/turf_decal/stripes/line{
dir = 6
},
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"byY" = (
@@ -39326,7 +39323,7 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
/turf/open/floor/plasteel,
@@ -39339,14 +39336,14 @@
dir = 8
},
/obj/machinery/pipedispenser,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/camera{
c_tag = "Atmospherics - Entrance";
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bza" = (
@@ -42605,7 +42602,7 @@
name = "Distribution Loop";
req_access_txt = "24"
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bFQ" = (
@@ -44666,19 +44663,19 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bKy" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
/turf/closed/wall,
/area/engine/atmos)
"bKz" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 10
},
/turf/closed/wall,
/area/engine/atmos)
"bKA" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
/turf/closed/wall,
/area/engine/atmos)
"bKB" = (
@@ -45401,7 +45398,7 @@
/area/engine/atmos)
"bMe" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
/turf/open/floor/plating,
/area/engine/atmos)
"bMf" = (
@@ -64903,10 +64900,8 @@
/obj/machinery/light_switch{
pixel_y = 28
},
-/obj/structure/closet/l3closet/scientist{
- pixel_x = -2
- },
/obj/effect/turf_decal/stripes/line,
+/obj/structure/closet/bombcloset,
/turf/open/floor/plasteel,
/area/science/mixing)
"cyA" = (
@@ -64937,7 +64932,6 @@
"cyD" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible,
/obj/effect/turf_decal/stripes/line,
-/obj/machinery/portable_atmospherics/canister,
/turf/open/floor/plasteel,
/area/science/mixing)
"cyE" = (
@@ -64949,7 +64943,6 @@
network = list("ss13","rd")
},
/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/machinery/portable_atmospherics/canister,
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/science/mixing)
@@ -64982,7 +64975,9 @@
dir = 4
},
/obj/machinery/portable_atmospherics/canister,
-/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
/turf/open/floor/plasteel,
/area/science/mixing)
"cyI" = (
@@ -64998,11 +64993,7 @@
/obj/machinery/light_switch{
pixel_y = 28
},
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/white,
/area/science/mixing)
"cyK" = (
/turf/closed/wall/r_wall,
@@ -65413,10 +65404,14 @@
/turf/open/floor/plasteel/white,
/area/science/mixing)
"czB" = (
-/obj/machinery/portable_atmospherics/pump,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/obj/machinery/light{
+ dir = 4
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ pixel_y = 2
+ },
+/obj/machinery/portable_atmospherics/pump,
/turf/open/floor/plasteel,
/area/science/mixing)
"czC" = (
@@ -66094,12 +66089,15 @@
/turf/open/floor/plasteel/white,
/area/science/mixing)
"cAG" = (
-/obj/structure/window/reinforced,
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/item/storage/firstaid/toxin,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 27
},
+/obj/machinery/camera{
+ c_tag = "Toxins - Mixing Area";
+ dir = 8;
+ network = list("ss13","rd")
+ },
+/obj/machinery/portable_atmospherics/scrubber,
/turf/open/floor/plasteel,
/area/science/mixing)
"cAH" = (
@@ -66814,10 +66812,10 @@
/turf/open/floor/plasteel/white,
/area/science/research)
"cCt" = (
-/obj/structure/closet/bombcloset,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/portable_atmospherics/canister,
/turf/open/floor/plasteel,
/area/science/mixing)
"cCu" = (
@@ -67974,19 +67972,14 @@
dir = 1;
pixel_y = 2
},
-/obj/machinery/light{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
/turf/open/floor/plasteel,
/area/science/mixing)
"cEz" = (
-/obj/structure/closet/wardrobe/grey,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
+/obj/machinery/portable_atmospherics/scrubber,
+/obj/item/storage/firstaid/toxin,
+/turf/open/floor/plasteel,
+/area/science/mixing)
"cEA" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -68371,18 +68364,7 @@
/turf/open/floor/plasteel/white,
/area/science/mixing)
"cFs" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/camera{
- c_tag = "Toxins - Mixing Area";
- dir = 8;
- network = list("ss13","rd")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/science/mixing)
"cFu" = (
@@ -68868,9 +68850,6 @@
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
/obj/machinery/portable_atmospherics/pump,
/turf/open/floor/plasteel,
/area/science/mixing)
@@ -70101,9 +70080,7 @@
/obj/structure/cable/yellow{
icon_state = "1-4"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"cIm" = (
@@ -79544,15 +79521,15 @@
},
/area/medical/medbay/aft)
"diP" = (
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
/obj/structure/sign/poster/contraband/random{
pixel_y = -32
},
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"diQ" = (
@@ -80266,9 +80243,7 @@
pixel_y = -24
},
/obj/structure/cable/yellow,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"dAh" = (
@@ -81343,6 +81318,13 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"gGH" = (
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"gGT" = (
/obj/effect/landmark/start/scientist,
/obj/structure/chair/office/light{
@@ -82261,6 +82243,15 @@
},
/turf/open/floor/plating,
/area/maintenance/aft)
+"pVL" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"pZb" = (
/obj/structure/cable/yellow{
icon_state = "2-4"
@@ -117137,16 +117128,16 @@ cvX
cwY
crR
cyJ
-czB
-cAG
+cBs
+cBs
cBB
cCC
cDp
+czB
+cAG
+cEz
cyK
-cyK
-cyK
-cyK
-cPe
+dxQ
dvY
cJY
cKM
@@ -117400,9 +117391,9 @@ cBC
cyK
cyK
cyK
-dvY
-dyc
-cub
+cyK
+cyK
+cyK
diP
dvY
cJZ
@@ -117658,9 +117649,9 @@ cCD
uun
rSL
dvY
-cEz
-dxQ
dyc
+gGH
+pVL
dvY
cKa
cKO
diff --git a/_maps/map_files/Snaxi/Snaxi.dmm b/_maps/map_files/Snaxi/Snaxi.dmm
index edd3cfd0fb..43e7915ca4 100644
--- a/_maps/map_files/Snaxi/Snaxi.dmm
+++ b/_maps/map_files/Snaxi/Snaxi.dmm
@@ -1,4 +1,309 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aaa" = (
+/obj/effect/landmark/event_spawn,
+/mob/living/simple_animal/hostile/retaliate/goat{
+ name = "Pete"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/kitchen)
+"aab" = (
+/obj/structure/curtain,
+/obj/machinery/shower{
+ pixel_y = 20
+ },
+/turf/open/floor/plasteel/white,
+/area/crew_quarters/dorms)
+"aac" = (
+/obj/machinery/shower{
+ pixel_y = 20
+ },
+/obj/structure/curtain,
+/turf/open/floor/plasteel/white,
+/area/crew_quarters/dorms)
+"aad" = (
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_x = 30
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/dorms)
+"aae" = (
+/obj/machinery/button/door{
+ id = "Bath1";
+ name = "Door Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 24;
+ pixel_y = -5;
+ specialfunctions = 4
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/structure/toilet/secret/low_loot{
+ pixel_y = 14
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/dorms)
+"aaf" = (
+/obj/machinery/light,
+/obj/structure/urinal{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/dorms)
+"aag" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/firedoor/border_only{
+ name = "south facing firelock"
+ },
+/mob/living/carbon/monkey/punpun,
+/turf/open/floor/plasteel/grimy,
+/area/crew_quarters/bar)
+"aah" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/glasses/meson{
+ pixel_y = 4
+ },
+/obj/item/cartridge/atmos,
+/obj/item/cartridge/engineering{
+ pixel_x = -3;
+ pixel_y = 2
+ },
+/obj/item/cartridge/engineering{
+ pixel_x = -3;
+ pixel_y = 2
+ },
+/obj/item/cartridge/engineering{
+ pixel_x = -3;
+ pixel_y = 2
+ },
+/obj/item/radio/intercom{
+ dir = 4;
+ name = "Station Intercom (General)";
+ pixel_x = 27
+ },
+/obj/machinery/keycard_auth{
+ pixel_y = -28
+ },
+/mob/living/simple_animal/parrot/Poly,
+/turf/open/floor/plasteel,
+/area/crew_quarters/heads/chief)
+"aai" = (
+/obj/effect/turf_decal/bot,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/mob/living/simple_animal/sloth/paperwork,
+/turf/open/floor/plasteel,
+/area/quartermaster/storage)
+"aaj" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/navbeacon{
+ codes_txt = "delivery;dir=8";
+ dir = 8;
+ freq = 1400;
+ location = "QM #1"
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/maintenance/starboard";
+ dir = 4;
+ name = "Starboard Maintenance APC";
+ pixel_x = 26
+ },
+/mob/living/simple_animal/bot/mulebot{
+ beacon_freq = 1400;
+ home_destination = "QM #1";
+ suffix = "#1"
+ },
+/turf/open/floor/pod/dark,
+/area/maintenance/starboard)
+"aak" = (
+/obj/effect/turf_decal/bot,
+/obj/machinery/navbeacon{
+ codes_txt = "delivery;dir=8";
+ dir = 8;
+ freq = 1400;
+ location = "QM #2"
+ },
+/obj/machinery/camera{
+ c_tag = "Cargo Garage";
+ dir = 8
+ },
+/mob/living/simple_animal/bot/mulebot{
+ home_destination = "QM #2";
+ suffix = "#2"
+ },
+/turf/open/floor/pod/dark,
+/area/maintenance/starboard)
+"aal" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/item/radio/intercom{
+ pixel_x = 28
+ },
+/obj/machinery/light_switch{
+ pixel_y = 26
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/camera{
+ c_tag = "Chief Medical Office";
+ dir = 8;
+ network = list("ss13","medbay");
+ pixel_y = -22
+ },
+/mob/living/simple_animal/pet/cat/Runtime,
+/turf/open/floor/plasteel/white,
+/area/crew_quarters/heads/cmo)
+"aam" = (
+/obj/structure/chair/comfy/brown{
+ color = "#596479";
+ dir = 1
+ },
+/mob/living/simple_animal/mouse/brown/Tom,
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
+"aan" = (
+/obj/machinery/camera{
+ c_tag = "Head of Security's Office";
+ dir = 8
+ },
+/obj/structure/bed/dogbed{
+ desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off.";
+ name = "pet bed"
+ },
+/obj/item/storage/secure/safe/HoS{
+ pixel_x = 35
+ },
+/mob/living/simple_animal/hostile/retaliate/bat/secbat{
+ desc = "An adorable fruit bat with a cute little hat, may or may not have a reputation for biting out eyeballs, or at least that's what the HoS'd tell you.";
+ name = "Colonel Chomps"
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/heads/hos)
+"aao" = (
+/obj/structure/closet/emcloset/anchored,
+/obj/structure/sign/directions/medical{
+ dir = 8;
+ icon_state = "direction_med";
+ pixel_y = 36
+ },
+/obj/structure/sign/directions/science{
+ dir = 8;
+ icon_state = "direction_sci";
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
+"aap" = (
+/obj/machinery/quantumpad{
+ map_pad_id = "5";
+ map_pad_link_id = "6"
+ },
+/obj/structure/sign/directions/evac{
+ pixel_y = 40
+ },
+/obj/structure/sign/directions/security{
+ pixel_y = 32
+ },
+/obj/structure/sign/directions/command{
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
+"aaq" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/obj/structure/sign/directions/supply{
+ pixel_x = 32;
+ pixel_y = -36
+ },
+/obj/structure/sign/directions/engineering{
+ dir = 4;
+ icon_state = "direction_eng";
+ pixel_x = 32;
+ pixel_y = -28
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
+"aar" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/sign/departments/botany,
+/turf/open/floor/plating,
+/area/hydroponics)
+"aas" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/sign/departments/engineering,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"aat" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/hallway/primary/fore";
+ dir = 1;
+ name = "Fore Primary Hallway APC";
+ pixel_y = 24
+ },
+/obj/structure/sign/directions/engineering{
+ dir = 4;
+ icon_state = "direction_eng";
+ pixel_x = 0;
+ pixel_y = 40
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
+"aau" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/sign/departments/custodian{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
+"aav" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/obj/machinery/disposal/bin,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
"aaw" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -11,10 +316,198 @@
},
/turf/open/floor/plasteel/white,
/area/science/misc_lab)
+"aax" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/sign/departments/cargo,
+/turf/open/floor/plating,
+/area/quartermaster/storage)
+"aay" = (
+/obj/structure/disposalpipe/junction/yjunction{
+ dir = 1
+ },
+/obj/structure/sign/departments/cargo{
+ pixel_x = -32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
+"aaz" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/obj/structure/sign/directions/engineering{
+ dir = 1;
+ icon_state = "direction_eng";
+ pixel_x = 32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
+"aaA" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/structure/sign/warning/pods{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 4
+ },
+/area/hallway/primary/port)
+"aaB" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/structure/sign/departments/chemistry{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"aaC" = (
+/obj/structure/sign/directions/medical{
+ dir = 8;
+ icon_state = "direction_med";
+ pixel_y = 36
+ },
+/obj/structure/sign/directions/science{
+ dir = 8;
+ icon_state = "direction_sci";
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"aaD" = (
+/obj/structure/sign/directions/engineering{
+ dir = 4;
+ icon_state = "direction_eng";
+ pixel_y = 36
+ },
+/obj/structure/sign/directions/supply{
+ dir = 4;
+ icon_state = "direction_supply";
+ pixel_x = 0;
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"aaE" = (
+/obj/structure/sign/directions/evac{
+ pixel_x = -32;
+ pixel_y = -24
+ },
+/obj/structure/sign/directions/security{
+ pixel_x = -32;
+ pixel_y = -32
+ },
+/obj/structure/sign/directions/command{
+ pixel_x = -32;
+ pixel_y = -40
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"aaF" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/obj/structure/sign/departments/science{
+ pixel_x = -32;
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"aaG" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/structure/sign/directions/medical{
+ dir = 8;
+ icon_state = "direction_med";
+ pixel_y = 40
+ },
+/obj/structure/sign/directions/science{
+ dir = 8;
+ icon_state = "direction_sci";
+ pixel_y = 32
+ },
+/obj/structure/sign/directions/security{
+ pixel_y = 24
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors)
"aaH" = (
/obj/machinery/smartfridge/chemistry/preloaded,
/turf/closed/wall,
/area/medical/chemistry)
+"aaI" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/structure/sign/directions/engineering{
+ dir = 4;
+ icon_state = "direction_eng";
+ pixel_y = 40
+ },
+/obj/structure/sign/directions/supply{
+ dir = 4;
+ icon_state = "direction_supply";
+ pixel_x = 0;
+ pixel_y = 32
+ },
+/obj/structure/sign/directions/evac{
+ pixel_y = 24
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors)
+"aaJ" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/sign/departments/evac,
+/turf/open/floor/plating,
+/area/hallway/secondary/exit/departure_lounge)
+"aaK" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/item/radio/intercom{
+ pixel_y = 25
+ },
+/obj/structure/sign/directions/evac{
+ dir = 4;
+ pixel_x = 0;
+ pixel_y = 40
+ },
+/turf/open/floor/plasteel/white/corner{
+ dir = 4
+ },
+/area/hallway/secondary/exit/departure_lounge)
+"aaL" = (
+/obj/structure/sign/departments/restroom{
+ pixel_x = 32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/grimy,
+/area/crew_quarters/fitness/recreation)
"aaM" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/machinery/atmospherics/components/binary/valve{
@@ -22,6 +515,24 @@
},
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
+"aaN" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/machinery/quantumpad{
+ map_pad_id = "1";
+ map_pad_link_id = "2"
+ },
+/obj/structure/sign/directions/medical{
+ dir = 8;
+ icon_state = "direction_med";
+ pixel_y = 36
+ },
+/obj/structure/sign/directions/science{
+ dir = 8;
+ icon_state = "direction_sci";
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel,
+/area/quartermaster/miningdock)
"aaO" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
@@ -36,13 +547,155 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
+"aaQ" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/machinery/computer/shuttle/snow_taxi,
+/obj/structure/sign/directions/supply{
+ dir = 4;
+ icon_state = "direction_supply";
+ pixel_x = 0;
+ pixel_y = 36
+ },
+/obj/structure/sign/directions/engineering{
+ dir = 4;
+ icon_state = "direction_eng";
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel,
+/area/quartermaster/miningdock)
+"aaR" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"aaS" = (
/turf/closed/wall/r_wall,
/area/medical/surgery)
+"aaT" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"aaU" = (
+/obj/structure/sign/departments/restroom{
+ pixel_x = 32
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
+"aaV" = (
+/obj/structure/sign/directions/evac{
+ dir = 1;
+ icon_state = "direction_evac";
+ pixel_y = 8
+ },
+/obj/structure/sign/directions/security{
+ dir = 8;
+ icon_state = "direction_sec";
+ pixel_x = 0;
+ pixel_y = 0
+ },
+/obj/structure/sign/directions/command{
+ dir = 8;
+ icon_state = "direction_bridge";
+ pixel_y = -8
+ },
+/turf/closed/wall/r_wall,
+/area/hallway/primary/central)
+"aaW" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/sign/departments/security,
+/turf/open/floor/plating,
+/area/hallway/primary/central)
+"aaX" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"aaY" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"aaZ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/sign/mining{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"aba" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/medical/surgery)
+"abb" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abc" = (
+/obj/structure/sign/directions/command{
+ pixel_x = 32;
+ pixel_y = -40
+ },
+/obj/structure/sign/directions/supply{
+ dir = 4;
+ icon_state = "direction_supply";
+ pixel_x = 32;
+ pixel_y = -24
+ },
+/obj/structure/sign/directions/science{
+ dir = 4;
+ pixel_x = 32;
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abd" = (
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"abe" = (
/obj/structure/table/wood,
/obj/machinery/computer/security/wooden_tv,
@@ -52,14 +705,308 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
+"abf" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abg" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abh" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/reagent_dispensers/watertank,
+/obj/item/radio/intercom{
+ pixel_y = -26
+ },
+/obj/structure/sign/departments/xenobio{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel/white,
+/area/science/misc_lab)
+"abi" = (
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abj" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/sign/departments/holy{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"abk" = (
/obj/machinery/light,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
+"abl" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/sign/departments/holy{
+ pixel_x = -32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abm" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/structure/sign/directions/evac{
+ dir = 8;
+ icon_state = "direction_evac";
+ pixel_x = 32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abn" = (
+/obj/structure/sign/poster/official/ian,
+/turf/closed/wall,
+/area/crew_quarters/heads/hop)
+"abo" = (
+/obj/effect/landmark/start/assistant,
+/obj/structure/sign/poster/official/build{
+ pixel_x = -32;
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/storage/primary)
+"abp" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/brown,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/filingcabinet,
+/turf/open/floor/plasteel,
+/area/quartermaster/storage)
+"abq" = (
+/obj/structure/toilet{
+ contents = newlist(/obj/item/toy/snappop/phoenix);
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 1;
+ light_color = "#ffc1c1"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/hallway/primary/port)
+"abr" = (
+/obj/structure/sink/kitchen{
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel/freezer,
+/area/hallway/primary/port)
"abs" = (
/obj/structure/table/optable,
/turf/open/floor/plasteel/freezer,
/area/medical/surgery)
+"abt" = (
+/obj/machinery/door/airlock{
+ name = "Unisex Restroom"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/hallway/primary/port)
+"abu" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/sign/departments/restroom{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"abv" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/machinery/camera{
+ c_tag = "Hydroponics North"
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/machinery/disposal/bin,
+/obj/structure/sign/poster/official/hydro_ad{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/hydroponics)
+"abw" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/structure/disposalpipe/segment,
+/obj/structure/sign/poster/official/high_class_martini{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
+"abx" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/table/wood,
+/obj/structure/sign/poster/official/soft_cap_pop_art{
+ pixel_x = -32
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"aby" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/computer/arcade/minesweeper{
+ dir = 8
+ },
+/obj/structure/sign/poster/official/nanomichi_ad{
+ pixel_x = 32
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"abz" = (
+/obj/structure/chair/sofa/right{
+ dir = 1
+ },
+/obj/structure/sign/poster/official/fruit_bowl{
+ pixel_y = -32
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/bar)
+"abA" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/structure/sign/poster/official/fashion{
+ pixel_y = -32
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
+"abB" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/sign/poster/official/report_crimes{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/fore)
+"abC" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/external{
+ req_one_access_txt = "13,8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
+"abD" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/external{
+ req_one_access_txt = "13,8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
+"abE" = (
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Medbay Cryogenics";
+ network = list("ss13","medbay")
+ },
+/obj/structure/sign/poster/official/help_others{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
+"abF" = (
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/closet/secure_closet/security/engine,
+/obj/item/radio/intercom{
+ pixel_y = -26
+ },
+/obj/machinery/camera{
+ c_tag = "Security Post - Cargo";
+ dir = 1
+ },
+/obj/structure/sign/poster/official/do_not_question{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel,
+/area/security/checkpoint/supply)
"abG" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
@@ -67,11 +1014,160 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel,
/area/engine/atmospherics_engine)
+"abH" = (
+/obj/structure/table,
+/obj/item/storage/firstaid/brute,
+/obj/item/storage/firstaid/brute{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/structure/sign/poster/official/medical_green_cross{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
+"abI" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/sign/poster/official/safety_eye_protection{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
+"abJ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/structure/sign/poster/official/walk{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"abK" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/sign/poster/official/build{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
+"abL" = (
+/obj/structure/table,
+/obj/item/mmi,
+/obj/item/mmi,
+/obj/item/mmi,
+/obj/structure/sign/poster/official/state_laws{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/white,
+/area/science/robotics/lab)
+"abM" = (
+/obj/structure/closet/secure_closet/security/med,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/camera{
+ c_tag = "Security Post - Medbay";
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/sign/poster/official/here_for_your_safety{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/security/checkpoint/medical)
+"abN" = (
+/obj/machinery/light,
+/obj/machinery/camera{
+ c_tag = "Escape Arm Southwest";
+ dir = 1
+ },
+/obj/structure/closet/crate/bin,
+/obj/structure/sign/directions/security{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/secondary/exit/departure_lounge)
+"abO" = (
+/obj/machinery/light,
+/obj/structure/closet/crate/bin,
+/obj/structure/sign/directions/command{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/secondary/exit/departure_lounge)
+"abP" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/structure/sign/poster/official/cohiba_robusto_ad{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/secondary/exit/departure_lounge)
"abQ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/landmark/event_spawn,
/turf/open/floor/wood,
/area/crew_quarters/theatre)
+"abR" = (
+/obj/structure/chair/stool,
+/obj/structure/sign/poster/official/foam_force_ad{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel/grimy,
+/area/crew_quarters/fitness/recreation)
+"abS" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/firedoor/border_only{
+ name = "south facing firelock"
+ },
+/obj/structure/sign/poster/official/no_erp{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel,
+/area/quartermaster/miningoffice)
+"abT" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/structure/disposalpipe/segment,
+/obj/structure/sign/directions/evac{
+ dir = 8;
+ icon_state = "direction_evac";
+ pixel_x = 32;
+ pixel_y = 40
+ },
+/obj/structure/sign/directions/engineering{
+ dir = 4;
+ icon_state = "direction_eng";
+ pixel_x = 32;
+ pixel_y = 24
+ },
+/obj/structure/sign/directions/medical{
+ dir = 4;
+ pixel_x = 32;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"abU" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -81,6 +1177,25 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
+"abV" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/structure/sign/poster/official/obey{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"abW" = (
+/obj/structure/tank_dispenser/oxygen,
+/obj/machinery/camera/motion{
+ c_tag = "Armory Motion Sensor North"
+ },
+/obj/structure/sign/poster/official/ion_rifle{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/ai_monitored/security/armory)
"abX" = (
/obj/machinery/airalarm{
pixel_y = 28
@@ -98,6 +1213,15 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
+"abY" = (
+/obj/machinery/computer/camera_advanced/xenobio{
+ dir = 1
+ },
+/obj/structure/sign/poster/official/anniversary_vintage_reprint{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/white,
+/area/science/xenobiology)
"abZ" = (
/obj/effect/landmark/start/medical_doctor,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -105,6 +1229,38 @@
},
/turf/open/floor/plasteel/freezer,
/area/medical/surgery)
+"aca" = (
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/camera{
+ c_tag = "Brig Evidence Storage"
+ },
+/obj/structure/sign/poster/official/space_cops{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/main)
+"acb" = (
+/obj/structure/sign/poster/official/science{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/white,
+/area/science/mixing)
+"acc" = (
+/obj/structure/sign/poster/contraband/lusty_xenomorph{
+ pixel_x = -32;
+ pixel_y = -32
+ },
+/turf/open/floor/plating,
+/area/maintenance/aft/secondary)
+"acd" = (
+/obj/structure/reagent_dispensers/watertank,
+/obj/structure/sign/poster/contraband/bountyhunters{
+ pixel_x = 32
+ },
+/turf/open/floor/plating,
+/area/maintenance/central)
"ace" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -114,6 +1270,19 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
+"acf" = (
+/obj/structure/chair/stool,
+/obj/structure/sign/poster/official/bless_this_spess{
+ pixel_x = -32
+ },
+/turf/open/floor/carpet,
+/area/chapel/main)
+"acg" = (
+/obj/structure/sign/poster/official/wtf_is_co2{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel,
+/area/science/storage)
"acj" = (
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
@@ -772,16 +1941,6 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
-"aon" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
"aoo" = (
/obj/structure/table/glass,
/obj/machinery/reagentgrinder{
@@ -915,9 +2074,6 @@
},
/turf/open/floor/plasteel/dark,
/area/tcommsat/computer)
-"arG" = (
-/turf/open/floor/plating,
-/area/medical/medbay/central)
"arH" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -2950,24 +4106,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/engine/engineering)
-"aOl" = (
-/obj/structure/closet/secure_closet/security/med,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Security Post - Medbay";
- dir = 1
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/medical)
"aOm" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
@@ -3023,7 +4161,7 @@
/area/engine/supermatter)
"aOP" = (
/obj/structure/table/wood,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/turf/open/floor/plasteel/dark,
/area/security/prison)
"aPw" = (
@@ -4937,13 +6075,6 @@
},
/turf/open/floor/carpet,
/area/hallway/primary/central)
-"bBB" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"bBH" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -6489,10 +7620,6 @@
/obj/machinery/holopad,
/turf/open/floor/carpet,
/area/hallway/secondary/exit/departure_lounge)
-"bQf" = (
-/obj/structure/closet/emcloset/anchored,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"bQg" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -7161,15 +8288,6 @@
/obj/structure/closet/crate/coffin,
/turf/open/floor/wood,
/area/chapel/office)
-"cbz" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/camera{
- c_tag = "Brig Evidence Storage"
- },
-/turf/open/floor/plasteel/dark,
-/area/security/main)
"cbL" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -8466,15 +9584,6 @@
},
/turf/open/floor/plasteel,
/area/storage/primary)
-"cGQ" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/machinery/light{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"cGZ" = (
/obj/machinery/light{
dir = 8
@@ -8829,18 +9938,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"cSv" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"cSC" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel/white,
@@ -9806,14 +10903,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"dvh" = (
-/obj/structure/table/reinforced,
-/mob/living/carbon/monkey/punpun,
-/obj/machinery/door/firedoor/border_only{
- name = "south facing firelock"
- },
-/turf/open/floor/plasteel/grimy,
-/area/crew_quarters/bar)
"dvs" = (
/obj/machinery/door/airlock/public/glass{
name = "Snow Airlock"
@@ -10028,19 +11117,6 @@
/obj/machinery/rnd/production/techfab/department/cargo,
/turf/open/floor/plasteel,
/area/quartermaster/storage)
-"dDf" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
"dDC" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -10876,15 +11952,6 @@
},
/turf/open/floor/plasteel,
/area/science/robotics/lab)
-"eeh" = (
-/obj/machinery/light,
-/obj/machinery/camera{
- c_tag = "Escape Arm Southwest";
- dir = 1
- },
-/obj/structure/closet/crate/bin,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit/departure_lounge)
"eex" = (
/obj/machinery/atmospherics/pipe/simple/general/visible,
/obj/machinery/meter,
@@ -11404,13 +12471,6 @@
dir = 8
},
/area/hallway/primary/fore)
-"evr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/door/firedoor/border_only{
- name = "south facing firelock"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningoffice)
"evI" = (
/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{
dir = 1
@@ -11633,10 +12693,6 @@
},
/turf/open/floor/plating,
/area/engine/storage)
-"eEa" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/dorms)
"eEy" = (
/obj/machinery/doorButtons/access_button{
idDoor = "virology_airlock_interior";
@@ -11671,15 +12727,6 @@
},
/turf/open/floor/plasteel/dark,
/area/teleporter)
-"eFy" = (
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/computer/arcade/minesweeper{
- dir = 8
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
"eFB" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/rag,
@@ -12087,19 +13134,6 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
-"eOK" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/hallway/primary/central)
"eOO" = (
/obj/structure/weightmachine/weightlifter,
/turf/open/floor/plasteel,
@@ -12380,13 +13414,6 @@
/obj/structure/table,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
-"eZn" = (
-/obj/structure/tank_dispenser/oxygen,
-/obj/machinery/camera/motion{
- c_tag = "Armory Motion Sensor North"
- },
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/security/armory)
"eZA" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -12857,14 +13884,6 @@
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
-"fnu" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/machinery/quantumpad{
- map_pad_id = "1";
- map_pad_link_id = "2"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
"fnx" = (
/obj/machinery/light{
dir = 1
@@ -12948,24 +13967,6 @@
},
/turf/open/floor/plasteel/white,
/area/science/robotics/lab)
-"fpW" = (
-/obj/effect/turf_decal/bot,
-/mob/living/simple_animal/bot/mulebot{
- home_destination = "QM #2";
- suffix = "#2"
- },
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=8";
- dir = 8;
- freq = 1400;
- location = "QM #2"
- },
-/obj/machinery/camera{
- c_tag = "Cargo Garage";
- dir = 8
- },
-/turf/open/floor/pod/dark,
-/area/maintenance/starboard)
"fqj" = (
/obj/machinery/field/generator,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -13098,11 +14099,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
/area/storage/eva)
-"fuy" = (
-/obj/machinery/light,
-/obj/structure/closet/crate/bin,
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit/departure_lounge)
"fuB" = (
/obj/machinery/camera{
c_tag = "Auxiliary Bridge North";
@@ -13699,13 +14695,6 @@
},
/turf/open/floor/plating,
/area/storage/atmos)
-"fNd" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"fNh" = (
/obj/structure/cable,
/turf/open/floor/plating/snowed/smoothed/icemoon,
@@ -15081,18 +16070,6 @@
/obj/machinery/power/port_gen/pacman,
/turf/open/floor/plating,
/area/engine/storage)
-"gEz" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
"gFb" = (
/obj/machinery/vending/wardrobe/law_wardrobe,
/obj/item/radio/intercom{
@@ -15277,19 +16254,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
-"gKB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/structure/reagent_dispensers/watertank,
-/obj/item/radio/intercom{
- pixel_y = -26
- },
-/turf/open/floor/plasteel/white,
-/area/science/misc_lab)
"gKR" = (
/obj/machinery/mineral/equipment_vendor,
/obj/structure/disposalpipe/segment{
@@ -15589,13 +16553,6 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
-"gRS" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/table/wood,
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
"gSh" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -16190,31 +17147,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
-"hnB" = (
-/obj/structure/chair{
- dir = 8
- },
-/obj/item/radio/intercom{
- pixel_x = 28
- },
-/obj/machinery/light_switch{
- pixel_y = 26
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/mob/living/simple_animal/pet/cat/Runtime,
-/obj/machinery/camera{
- c_tag = "Chief Medical Office";
- dir = 8;
- network = list("ss13","medbay");
- pixel_y = -22
- },
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/heads/cmo)
"hnO" = (
/obj/machinery/atmospherics/components/unary/cryo_cell,
/turf/open/floor/plasteel/white,
@@ -16876,12 +17808,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"hGM" = (
-/obj/structure/urinal{
- pixel_y = 32
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/dorms)
"hGU" = (
/obj/structure/closet/secure_closet/personal/cabinet{
pixel_x = -8
@@ -17876,14 +18802,6 @@
/obj/structure/closet/crate/coffin,
/turf/open/floor/wood,
/area/chapel/office)
-"ifQ" = (
-/mob/living/simple_animal/mouse/brown/Tom,
-/obj/structure/chair/comfy/brown{
- color = "#596479";
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/security/prison)
"ifT" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -19714,19 +20632,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"jiV" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/brute,
-/obj/item/storage/firstaid/brute{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
"jiY" = (
/obj/effect/turf_decal/tile/brown{
dir = 1
@@ -20465,10 +21370,6 @@
"jJu" = (
/turf/closed/wall/r_wall,
/area/medical/medbay/zone3)
-"jKb" = (
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel,
-/area/storage/primary)
"jKF" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -22194,19 +23095,6 @@
},
/turf/open/floor/engine,
/area/engine/atmospherics_engine)
-"kPj" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"kPn" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
@@ -24381,24 +25269,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"mkm" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/power/apc{
- areastring = "/area/hallway/primary/fore";
- dir = 1;
- name = "Fore Primary Hallway APC";
- pixel_y = 24
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
"mkr" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -24799,13 +25669,6 @@
/obj/machinery/telecomms/processor/preset_four,
/turf/open/floor/plasteel/dark/telecomms,
/area/tcommsat/server)
-"mzB" = (
-/obj/structure/table,
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/item/mmi,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
"mAk" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
@@ -25362,22 +26225,6 @@
},
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/dorms)
-"mQo" = (
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/machinery/camera{
- c_tag = "Hydroponics North"
- },
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/machinery/disposal/bin,
-/turf/open/floor/plasteel/dark,
-/area/hydroponics)
"mQC" = (
/obj/machinery/airalarm{
dir = 1;
@@ -26124,12 +26971,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/medical/genetics)
-"nmY" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"nnj" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -26162,14 +27003,6 @@
},
/turf/open/floor/plasteel,
/area/hydroponics)
-"noB" = (
-/obj/effect/turf_decal/bot,
-/mob/living/simple_animal/sloth/paperwork,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/storage)
"noQ" = (
/obj/effect/spawner/structure/window/plasma/reinforced,
/turf/open/floor/plating,
@@ -26788,34 +27621,6 @@
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"nGa" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/mob/living/simple_animal/bot/mulebot{
- beacon_freq = 1400;
- home_destination = "QM #1";
- suffix = "#1"
- },
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=8";
- dir = 8;
- freq = 1400;
- location = "QM #1"
- },
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/starboard";
- dir = 4;
- name = "Starboard Maintenance APC";
- pixel_x = 26
- },
-/turf/open/floor/pod/dark,
-/area/maintenance/starboard)
"nGd" = (
/obj/effect/turf_decal/delivery,
/obj/machinery/portable_atmospherics/canister/toxins,
@@ -26886,7 +27691,7 @@
"nIM" = (
/obj/structure/table/wood/poker,
/obj/item/toy/cards/deck,
-/obj/item/storage/pill_bottle/dice{
+/obj/item/storage/box/dice{
pixel_x = 8
},
/obj/structure/sign/poster/contraband/random{
@@ -27753,9 +28558,6 @@
},
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/engine/atmospherics_engine)
-"oiX" = (
-/turf/closed/wall,
-/area/crew_quarters/heads/hop)
"oje" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -28735,23 +29537,6 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload_foyer)
-"oLT" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/item/radio/intercom{
- pixel_y = 25
- },
-/turf/open/floor/plasteel/white/corner{
- dir = 4
- },
-/area/hallway/secondary/exit/departure_lounge)
"oME" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -29572,13 +30357,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"pkh" = (
-/mob/living/simple_animal/hostile/retaliate/goat{
- name = "Pete"
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/kitchen)
"pkJ" = (
/turf/open/floor/wood{
icon_state = "wood-broken6"
@@ -30303,20 +31081,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
-"pCj" = (
-/obj/structure/sink{
- dir = 8;
- pixel_x = -12;
- pixel_y = 2
- },
-/obj/structure/mirror{
- pixel_x = -28
- },
-/obj/structure/urinal{
- pixel_y = 32
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/dorms)
"pCo" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 9
@@ -30909,12 +31673,6 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
-"pUz" = (
-/obj/structure/disposalpipe/junction/yjunction{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
"pUP" = (
/obj/machinery/door/airlock/public/glass{
name = "Chapel"
@@ -31083,15 +31841,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"qbh" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
"qbr" = (
/obj/effect/turf_decal/tile/red{
dir = 4
@@ -31877,13 +32626,6 @@
},
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
-"qAq" = (
-/obj/machinery/quantumpad{
- map_pad_id = "5";
- map_pad_link_id = "6"
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"qAx" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -32343,7 +33085,7 @@
/area/bridge)
"qMN" = (
/obj/structure/table,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/fitness/recreation)
"qNB" = (
@@ -33777,35 +34519,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"rFQ" = (
-/obj/structure/table/reinforced,
-/mob/living/simple_animal/parrot/Poly,
-/obj/item/clothing/glasses/meson{
- pixel_y = 4
- },
-/obj/item/cartridge/atmos,
-/obj/item/cartridge/engineering{
- pixel_x = -3;
- pixel_y = 2
- },
-/obj/item/cartridge/engineering{
- pixel_x = -3;
- pixel_y = 2
- },
-/obj/item/cartridge/engineering{
- pixel_x = -3;
- pixel_y = 2
- },
-/obj/item/radio/intercom{
- dir = 4;
- name = "Station Intercom (General)";
- pixel_x = 27
- },
-/obj/machinery/keycard_auth{
- pixel_y = -28
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/heads/chief)
"rGc" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 6
@@ -34298,10 +35011,6 @@
},
/turf/open/floor/plasteel/dark,
/area/medical/morgue)
-"rYN" = (
-/obj/structure/chair/stool,
-/turf/open/floor/carpet,
-/area/chapel/main)
"rYQ" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 10
@@ -34519,16 +35228,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
-"seR" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"seZ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
@@ -34785,15 +35484,6 @@
/obj/machinery/computer/card,
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
-"soN" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port)
"spa" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -35302,16 +35992,6 @@
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/engine,
/area/engine/engineering)
-"sIn" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/airlock/external{
- req_one_access_txt = "13,8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
"sIT" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/pod/dark,
@@ -37160,18 +37840,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/carpet,
/area/hallway/secondary/exit/departure_lounge)
-"tJL" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"tKa" = (
/obj/machinery/door/airlock/security/glass{
id_tag = "innerbrig";
@@ -37430,24 +38098,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
-"tQd" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/closet/secure_closet/security/engine,
-/obj/item/radio/intercom{
- pixel_y = -26
- },
-/obj/machinery/camera{
- c_tag = "Security Post - Cargo";
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/security/checkpoint/supply)
"tQv" = (
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
@@ -37694,11 +38344,6 @@
},
/turf/open/floor/plasteel,
/area/science/robotics/mechbay)
-"tWx" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"tXn" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -38012,23 +38657,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
-"ugr" = (
-/obj/machinery/button/door{
- id = "Bath1";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 24;
- pixel_y = -5;
- specialfunctions = 4
- },
-/obj/machinery/shower{
- pixel_y = 20
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/dorms)
"uha" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -39813,16 +40441,6 @@
/obj/machinery/meter,
/turf/open/floor/engine,
/area/engine/engineering)
-"vlz" = (
-/obj/structure/urinal{
- pixel_y = 32
- },
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = 30
- },
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/dorms)
"vlC" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
@@ -42975,24 +43593,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
-"xdr" = (
-/obj/machinery/camera{
- c_tag = "Head of Security's Office";
- dir = 8
- },
-/obj/structure/bed/dogbed{
- desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off.";
- name = "pet bed"
- },
-/mob/living/simple_animal/hostile/retaliate/bat/secbat{
- desc = "An adorable fruit bat with a cute little hat, may or may not have a reputation for biting out eyeballs, or at least that's what the HoS'd tell you.";
- name = "Colonel Chomps"
- },
-/obj/item/storage/secure/safe/HoS{
- pixel_x = 35
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/heads/hos)
"xdD" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
dir = 4
@@ -43119,9 +43719,6 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
-"xhH" = (
-/turf/closed/wall/r_wall,
-/area/hallway/primary/central)
"xhV" = (
/obj/effect/turf_decal/bot_white,
/obj/structure/window/reinforced{
@@ -43201,20 +43798,6 @@
/obj/machinery/vending/snack/random,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
-"xlg" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer,
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Medbay Cryogenics";
- network = list("ss13","medbay")
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
"xlm" = (
/obj/machinery/vending/wardrobe/atmos_wardrobe,
/turf/open/floor/plasteel,
@@ -43318,11 +43901,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/bar)
-"xou" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/machinery/computer/shuttle/snow_taxi,
-/turf/open/floor/plasteel,
-/area/quartermaster/miningdock)
"xow" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/door/airlock/security/glass{
@@ -43496,18 +44074,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/visible,
/turf/open/floor/plating,
/area/maintenance/department/electrical)
-"xve" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"xvj" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -43681,10 +44247,6 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
-"xCr" = (
-/obj/effect/landmark/blobstart,
-/turf/open/floor/plating,
-/area/medical/medbay/central)
"xCC" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -44311,10 +44873,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
-"xXX" = (
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/maintenance/central)
"xYD" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/carpet,
@@ -44369,10 +44927,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"yae" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"ybp" = (
/obj/structure/chair{
dir = 8
@@ -58951,8 +59505,8 @@ ash
ash
nQr
ash
-ash
-ash
+tmO
+tmO
wje
ahC
nOK
@@ -59208,9 +59762,9 @@ rbW
aoR
apO
ash
-arG
-ash
-qbh
+abq
+tmO
+abu
auY
hEf
eGO
@@ -59465,8 +60019,8 @@ rRV
aoT
pWz
ash
-xCr
-ash
+abr
+abt
lxF
rbo
ioG
@@ -59719,11 +60273,11 @@ tUi
ash
tVS
anm
-jiV
-ash
-ash
+abH
ash
ash
+tmO
+tmO
dXR
hOA
irg
@@ -59983,7 +60537,7 @@ arI
syN
atr
rbo
-jwo
+aaF
azq
azq
azq
@@ -60222,7 +60776,7 @@ ash
cxX
sXJ
sXJ
-hnB
+aal
qhU
vCE
gIm
@@ -61282,7 +61836,7 @@ aPB
oqL
aLG
aNk
-aOl
+abM
aPA
avT
avT
@@ -62536,7 +63090,7 @@ vvH
vvH
fsA
gZX
-xlg
+abE
jUu
xGP
anm
@@ -63319,7 +63873,7 @@ mAx
ndm
rQN
aoX
-soN
+aaB
ojv
oTu
oTu
@@ -64602,7 +65156,7 @@ aoX
ali
yds
yds
-aon
+abI
aoX
rJw
tkr
@@ -64837,10 +65391,10 @@ avT
avT
xUL
rTG
-sIn
+abC
kxU
sdH
-sIn
+abD
kxU
pyw
nYZ
@@ -65118,7 +65672,7 @@ yds
yds
qWL
aoX
-gsM
+abJ
tkr
iPX
rQJ
@@ -65643,7 +66197,7 @@ ayA
sNK
xmo
rqW
-mzB
+abL
rQJ
szG
aHG
@@ -66390,7 +66944,7 @@ xUL
xUL
xUL
tmO
-fYx
+aaA
oDm
tmO
rhX
@@ -66660,7 +67214,7 @@ nrJ
iAR
rik
xWq
-aAL
+abK
gxi
wEP
wJH
@@ -67689,7 +68243,7 @@ xWq
xWq
xWq
tmO
-wje
+aaC
wje
tmO
ydp
@@ -68203,7 +68757,7 @@ xUL
xUL
xUL
tmO
-wje
+aaD
iPX
tmO
tmO
@@ -68461,7 +69015,7 @@ xUL
xUL
usE
buO
-wje
+aaE
cpC
tmO
ydp
@@ -71329,7 +71883,7 @@ avT
kfv
kfv
ilb
-ifQ
+aam
rlG
wSb
wav
@@ -72111,7 +72665,7 @@ wDk
pmK
dbB
nxv
-eZn
+abW
xBv
nQM
lZi
@@ -74684,7 +75238,7 @@ oJF
piv
nre
bWR
-xdr
+aan
uKb
fKC
rVN
@@ -75204,7 +75758,7 @@ cBD
bQj
gCG
sdN
-xXX
+acd
ubL
diH
uPJ
@@ -75454,7 +76008,7 @@ bDr
alG
fmt
cBD
-cbz
+aca
jae
bNS
pST
@@ -75719,7 +76273,7 @@ giT
bZF
xkT
bVR
-rYN
+acf
qOb
bSd
bXO
@@ -77234,7 +77788,7 @@ xZg
xZg
xZg
uBa
-eeh
+abN
grV
cTD
cTD
@@ -77244,7 +77798,7 @@ cTD
grV
lbp
knn
-eOK
+aaW
bBz
lbp
cBD
@@ -77464,7 +78018,7 @@ gky
ptY
cgH
ktw
-xZL
+aaG
lzB
avT
avT
@@ -77499,30 +78053,30 @@ vPQ
vPQ
vPQ
bwu
+aaR
+aaT
+aaX
+aaY
+abb
lhQ
-yae
-kPj
-bBB
-lhQ
-lhQ
-vPQ
-cGQ
-vPQ
-vPQ
+abV
+abf
+abb
+abb
bNn
vPQ
qQt
vPQ
bJF
bVX
-cGQ
+abj
hhz
vPQ
vPQ
vPQ
haj
pjn
-tNf
+abl
sAw
vPQ
mdG
@@ -78235,7 +78789,7 @@ cPI
kxP
vAs
ktw
-xZL
+aaI
lzB
avT
avT
@@ -78250,7 +78804,7 @@ wxT
bUP
fLK
rmN
-oLT
+aaK
ljL
uBa
uBa
@@ -78271,19 +78825,19 @@ fXU
ffm
jBl
fmw
-tWx
+abT
pBU
reS
+abc
lhQ
-lhQ
-ceA
-vun
-ceA
-ceA
-ceA
-seR
-ceA
-ceA
+abd
+abg
+abd
+abd
+abd
+abi
+abd
+abd
bmP
bQs
vun
@@ -78295,7 +78849,7 @@ ceA
vun
lhQ
lhQ
-ceA
+abm
bPc
ceA
bUL
@@ -78519,7 +79073,7 @@ piX
hJw
kop
uBa
-fuy
+abO
bwx
bwx
bwx
@@ -79033,7 +79587,7 @@ fWE
wbE
wbE
uBa
-rcH
+abP
bwx
iSo
bpM
@@ -80579,8 +81133,8 @@ tHU
bBL
guv
bpO
-bDR
-gfF
+aaL
+abR
bDR
jOl
bBL
@@ -80818,13 +81372,13 @@ iaO
dnm
hHC
dnm
-unA
+aaJ
unA
unA
unA
unA
dnm
-unA
+aaJ
dnm
unA
unA
@@ -80841,7 +81395,7 @@ bsx
bLT
bLT
bLT
-xhH
+aaV
rle
cSG
bCQ
@@ -81096,7 +81650,7 @@ vAs
vAs
vAs
bLT
-fnu
+aaN
bxR
mPM
ohK
@@ -81116,7 +81670,7 @@ bQC
gsK
wuB
pyI
-bXW
+acg
eqZ
wpN
vOV
@@ -81274,7 +81828,7 @@ dvs
mtP
naE
mtP
-mtP
+aaU
nOY
mtP
naE
@@ -81353,7 +81907,7 @@ vAs
vAs
vAs
bLT
-xou
+aaQ
jkL
fcJ
cqd
@@ -81526,7 +82080,7 @@ ydp
avT
avT
iHM
-iHM
+pgp
pgp
pgp
pgp
@@ -81781,11 +82335,11 @@ xUL
ydp
ydp
ydp
-avT
bmX
avT
pgp
-pCj
+aab
+dZV
dZV
gLk
pgp
@@ -81871,7 +82425,7 @@ bEi
bEi
lbp
bAs
-nmY
+aaZ
bCL
bDW
gpp
@@ -82040,9 +82594,9 @@ ydp
ydp
ydp
avT
-avT
pgp
-hGM
+aac
+gLk
gLk
gLk
pgp
@@ -82296,10 +82850,10 @@ ydp
ydp
ydp
ydp
-ydp
avT
pgp
-vlz
+aab
+aad
gLk
fBs
pgp
@@ -82390,11 +82944,11 @@ aGl
bEa
pHl
aaw
-gKB
+abh
qJV
fjU
fjU
-fjU
+acb
qJV
fuG
qJV
@@ -82554,7 +83108,7 @@ ydp
ydp
ydp
avT
-avT
+pgp
pgp
pgp
pgp
@@ -82813,7 +83367,7 @@ ydp
avT
ydp
pgp
-ugr
+aae
pBh
gLk
pgp
@@ -83072,7 +83626,7 @@ ydp
pgp
pgp
pgp
-eEa
+aaf
pgp
pgp
pgp
@@ -83345,8 +83899,8 @@ skZ
mSt
geO
cQv
-nGa
-fpW
+aaj
+aak
oyf
dzS
dSQ
@@ -83593,7 +84147,7 @@ mWy
pgp
uEG
dKn
-gEz
+abA
pax
sdq
iux
@@ -83677,13 +84231,13 @@ dFp
wTK
tDY
oXn
-cSg
+abY
tRe
egg
cbQ
iXG
bWf
-bVa
+acc
bVa
bWf
ftV
@@ -84178,7 +84732,7 @@ bvq
oCZ
lxV
dGP
-evr
+abS
lxV
hJE
cmC
@@ -84622,7 +85176,7 @@ iML
kFr
vuO
vaj
-rTv
+aau
mSt
dWt
fyr
@@ -85373,7 +85927,7 @@ xUL
xUL
xUL
kVO
-bQf
+aao
qgm
qgm
qgm
@@ -85390,7 +85944,7 @@ xJB
hyK
vVN
qeL
-oiX
+abn
trU
knI
oIb
@@ -85632,7 +86186,7 @@ xUL
qaO
gct
sGE
-tJL
+aaq
ixf
ixf
giv
@@ -86165,7 +86719,7 @@ iqZ
seG
tYT
qKA
-cSv
+aav
pJS
pJS
tQG
@@ -86415,7 +86969,7 @@ mKv
sAh
sAh
sAh
-urI
+aar
uEz
uEz
hrS
@@ -86658,7 +87212,7 @@ xUL
xUL
xUL
kVO
-qAq
+aap
acq
fJc
lfy
@@ -87179,7 +87733,7 @@ wAx
wuQ
vnM
wAx
-mQo
+abv
mbE
qss
sYv
@@ -87456,7 +88010,7 @@ mhq
bNF
wIA
hTO
-noB
+aai
wIA
kti
nrg
@@ -88462,7 +89016,7 @@ hAw
skK
vKa
gdg
-pkh
+aaa
loM
vKa
nsv
@@ -88483,7 +89037,7 @@ pJS
leq
qxT
wIA
-iCO
+abp
pJS
pJS
pJS
@@ -88987,12 +89541,12 @@ fTy
jvb
xZp
dVr
-gRS
+abx
msK
cKk
dNB
rmV
-dDf
+abB
gaf
pMD
shN
@@ -89245,7 +89799,7 @@ stW
iKV
hFj
oNv
-guV
+abz
cKk
meG
mcU
@@ -90278,7 +90832,7 @@ jHT
rkd
mcU
rNS
-vyf
+aax
vyf
hLQ
nsf
@@ -90295,7 +90849,7 @@ gwY
pdD
hMM
qKP
-tQd
+abF
jIt
avT
avT
@@ -90541,7 +91095,7 @@ vkk
qSi
vkk
vkk
-pUz
+aay
pqj
mcU
pqj
@@ -91034,7 +91588,7 @@ pCU
ixf
kcn
llu
-xve
+abw
gJP
eGi
mIe
@@ -91312,7 +91866,7 @@ uqy
yes
iqH
iqH
-iqH
+aaz
iqH
yes
iqH
@@ -92068,10 +92622,10 @@ gcY
xop
fbq
lFv
-dvh
+aag
gkl
eOt
-eFy
+aby
rYc
hbb
rkd
@@ -92331,7 +92885,7 @@ cKk
cKk
cKk
cKk
-mkm
+aat
lpl
xcA
srk
@@ -93875,7 +94429,7 @@ fPd
eYu
xOj
jKF
-jKb
+abo
wdR
sda
pAC
@@ -94900,7 +95454,7 @@ wTe
sPt
iBL
bnU
-fNd
+aas
bDg
fKE
bnU
@@ -96953,7 +97507,7 @@ ulr
jJb
xfH
puE
-rFQ
+aah
iiY
piR
tty
diff --git a/code/__DEFINES/_flags/_flags.dm b/code/__DEFINES/_flags/_flags.dm
index 3a31eebb19..0734feaa42 100644
--- a/code/__DEFINES/_flags/_flags.dm
+++ b/code/__DEFINES/_flags/_flags.dm
@@ -138,14 +138,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define MOBILITY_FLAGS_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_PICKUP | MOBILITY_USE | MOBILITY_UI | MOBILITY_STORAGE | MOBILITY_PULL | MOBILITY_RESIST)
#define MOBILITY_FLAGS_ANY_INTERACTION (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_UI | MOBILITY_STORAGE)
-// melee_attack_chain() attackchain_flags
-/// The attack is from a parry counterattack.
-#define ATTACKCHAIN_PARRY_COUNTERATTACK (1<<0)
-
-// UnarmedAttack() flags
-/// Attack is from a parry counterattack
-#define UNARMED_ATTACK_PARRY (1<<0)
-
/// If the thing can reflect light (lasers/energy)
#define RICOCHET_SHINY (1<<0)
/// If the thing can reflect matter (bullets/bomb shrapnel)
diff --git a/code/__DEFINES/_flags/return_values.dm b/code/__DEFINES/_flags/return_values.dm
new file mode 100644
index 0000000000..28606265b3
--- /dev/null
+++ b/code/__DEFINES/_flags/return_values.dm
@@ -0,0 +1,22 @@
+/////////// ATTACKCHAIN_FLAGS ////////////
+// melee_attack_chain(), attackby(), pre_attack(), afterattack(), and tool_act(), attack() and **anything that is called by ClickOn()** return values.
+// These are all passed down through the attack chain and are binary OR'd into each other!
+/// Stop the attack chain if still in melee_attack_chain()
+#define STOP_ATTACK_PROC_CHAIN (1<<0)
+/// This attack should discard last_action instead of flushing (storing) it). You should probably know what you're doing if you use this considering this is how clickdelay is enforced.
+#define DISCARD_LAST_ACTION (1<<1)
+/// There are a number of "safety nets" intended to default-handle clickdelay. Return this flag to bypass ALL of them. Be sure
+/// you know EXACTLY what you are doing!
+#define NO_AUTO_CLICKDELAY_HANDLING (1<<2)
+/// Only used with UnarmedAttack(). Interrupts unarmed attack from progressing.
+#define INTERRUPT_UNARMED_ATTACK (1<<3)
+/// Attack should not set next action even if the atom wants it to be an action
+#define ATTACK_IGNORE_ACTION (1<<4)
+/// Attack should not at all check last_action/attack_hand_speed even if the atom wants to
+#define ATTACK_IGNORE_CLICKDELAY (1<<5)
+/// This attack is from a parry counterattack
+#define ATTACK_IS_PARRY_COUNTERATTACK (1<<6)
+
+// obj/item/dropped()
+/// dropped() relocated this item, return FALSE for doUnEquip.
+#define ITEM_RELOCATED_BY_DROPPED "relocated_by_dropped"
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index 2dee6930c6..97f07acc05 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -74,6 +74,7 @@
#define ADMIN_PUNISHMENT_MAZING "Puzzle"
#define ADMIN_PUNISHMENT_PIE "Cream Pie"
#define ADMIN_PUNISHMENT_CUSTOM_PIE "Custom Cream Pie"
+#define ADMIN_PUNISHMENT_SHOES "Knot Shoes"
#define ADMIN_PUNISHMENT_CRACK ":B:oneless"
#define ADMIN_PUNISHMENT_BLEED ":B:loodless"
#define ADMIN_PUNISHMENT_SCARIFY "Scarify"
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index d4f0d94666..2877f0a880 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -108,7 +108,6 @@
#define CLICK_CD_RANGE 4
#define CLICK_CD_RAPID 2
#define CLICK_CD_CLICK_ABILITY 6
-#define CLICK_CD_BREAKOUT 100
#define CLICK_CD_HANDCUFFED 10
#define CLICK_CD_RESIST 20
#define CLICK_CD_GRABBING 10
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 0065e0298c..3aa5a07480 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -65,9 +65,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isslimeperson(A) (is_species(A, /datum/species/jelly/slime))
#define isluminescent(A) (is_species(A, /datum/species/jelly/luminescent))
#define iszombie(A) (is_species(A, /datum/species/zombie))
-#define ismoth(A) (is_species(A, /datum/species/insect))
#define ishumanbasic(A) (is_species(A, /datum/species/human))
-#define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid) )
+#define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid))
#define isdwarf(A) (is_species(A, /datum/species/dwarf))
#define isdullahan(A) (is_species(A, /datum/species/dullahan))
#define isangel(A) (is_species(A, /datum/species/angel))
@@ -80,8 +79,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isipcperson(A) (is_species(A, /datum/species/ipc))
#define issynthliz(A) (is_species(A, /datum/species/synthliz))
#define ismammal(A) (is_species(A, /datum/species/mammal))
-#define isavian(A) (is_species(A, /datum/species/avian))
-#define isaquatic(A) (is_species(A, /datum/species/aquatic))
#define isinsect(A) (is_species(A, /datum/species/insect))
#define isxenoperson(A) (is_species(A, /datum/species/xeno))
#define isstartjelly(A) (is_species(A, /datum/species/jelly/roundstartslime))
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index aaa63225d8..d294c69972 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -538,4 +538,9 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define LOOT_RESTRICTION_MIND_PILE 3 //limited to the current pile.
#define LOOT_RESTRICTION_CKEY_PILE 4 //Idem
+//stages of shoe tying-ness
+#define SHOES_UNTIED 0
+#define SHOES_TIED 1
+#define SHOES_KNOTTED 2
+
#define WANTED_FILE "wanted_message.json"
diff --git a/code/__DEFINES/misc/return_values.dm b/code/__DEFINES/misc/return_values.dm
deleted file mode 100644
index d55f603de9..0000000000
--- a/code/__DEFINES/misc/return_values.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-// obj/item/dropped
-/// dropped() relocated this item, return FALSE for doUnEquip.
-#define ITEM_RELOCATED_BY_DROPPED "relocated_by_dropped"
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index a6bd7a1c8e..7a188281d0 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -107,6 +107,7 @@
#define FIRE_PRIORITY_INSTRUMENTS 30
#define FIRE_PRIORITY_FIELDS 30
#define FIRE_PRIOTITY_SMOOTHING 35
+#define FIRE_PRIORITY_HUDS 40
#define FIRE_PRIORITY_NETWORKS 40
#define FIRE_PRIORITY_OBJ 40
#define FIRE_PRIORITY_ACID 40
diff --git a/code/__HELPERS/do_after.dm b/code/__HELPERS/do_after.dm
index 614c3d73c4..30d40f3867 100644
--- a/code/__HELPERS/do_after.dm
+++ b/code/__HELPERS/do_after.dm
@@ -167,6 +167,7 @@
var/target_loc = target.loc
LAZYADD(user.do_afters, target)
+ LAZYADD(target.targeted_by, user)
var/holding = user.get_active_held_item()
var/datum/progressbar/progbar
@@ -189,6 +190,10 @@
. = FALSE
break
+ if(!(target in user.do_afters))
+ . = FALSE
+ break
+
if(drifting && !user.inertia_dir)
drifting = 0
user_loc = user.loc
@@ -198,12 +203,14 @@
break
if(progress)
qdel(progbar)
+
if(!QDELETED(target))
LAZYREMOVE(user.do_afters, target)
+ LAZYREMOVE(target.targeted_by, user)
//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action
/mob/proc/break_do_after_checks(list/checked_health, check_clicks)
- if(check_clicks && next_move > world.time)
+ if(check_clicks && !CheckActionCooldown())
return FALSE
return TRUE
@@ -224,6 +231,7 @@
if(target)
LAZYADD(user.do_afters, target)
+ LAZYADD(target.targeted_by, user)
var/atom/Uloc = user.loc
@@ -288,6 +296,10 @@
if(!QDELETED(target))
LAZYREMOVE(user.do_afters, target)
+ if(!QDELETED(target))
+ LAZYREMOVE(user.do_afters, target)
+ LAZYREMOVE(target.targeted_by, user)
+
/mob/proc/do_after_coefficent() // This gets added to the delay on a do_after, default 1
. = 1
return
@@ -307,6 +319,7 @@
for(var/atom/target in targets)
originalloc[target] = target.loc
LAZYADD(user.do_afters, target)
+ LAZYADD(target.targeted_by, user)
var/holding = user.get_active_held_item()
var/datum/progressbar/progbar
@@ -341,3 +354,4 @@
var/atom/target = thing
if(!QDELETED(target))
LAZYREMOVE(user.do_afters, target)
+ LAZYREMOVE(target.targeted_by, user)
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index 7b40c96a6d..18aaf66659 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -19,10 +19,6 @@
A.move_camera_by_click()
/mob/living/silicon/ai/ClickOn(var/atom/A, params)
- if(world.time <= next_click)
- return
- next_click = world.time + 1
-
if(!can_interact_with(A))
return
@@ -74,16 +70,16 @@
CtrlClickOn(A)
return
- if(world.time <= next_move)
+ if(!CheckActionCooldown(immediate = TRUE))
return
if(aicamera.in_camera_mode)
aicamera.camera_mode_off()
- aicamera.captureimage(pixel_turf, usr)
+ INVOKE_ASYNC(aicamera, /obj/item/camera.proc/captureimage, pixel_turf, usr)
return
if(waypoint_mode)
- waypoint_mode = 0
- set_waypoint(A)
+ waypoint_mode = FALSE
+ INVOKE_ASYNC(src, .proc/set_waypoint, A)
return
A.attack_ai(src)
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 8a63339081..042ab3aaee 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -1,38 +1,3 @@
-/*
- Click code cleanup
- ~Sayu
-*/
-
-// 1 decisecond click delay (above and beyond mob/next_move)
-//This is mainly modified by click code, to modify click delays elsewhere, use next_move and changeNext_move()
-/mob/var/next_click = 0
-
-// THESE DO NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK
-/mob/var/next_move_adjust = 0 //Amount to adjust action/click delays by, + or -
-/mob/var/next_move_modifier = 1 //Value to multiply action/click delays by
-
-
-//Delays the mob's next click/action by num deciseconds
-// eg: 10-3 = 7 deciseconds of delay
-// eg: 10*0.5 = 5 deciseconds of delay
-// DOES NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK
-
-/mob/proc/timeToNextMove()
- return max(0, next_move - world.time)
-
-/mob/proc/changeNext_move(num)
- next_move = world.time + ((num+next_move_adjust)*next_move_modifier)
-
-/mob/living/changeNext_move(num)
- last_click_move = next_move
- var/mod = next_move_modifier
- var/adj = next_move_adjust
- for(var/i in status_effects)
- var/datum/status_effect/S = i
- mod *= S.nextmove_modifier()
- adj += S.nextmove_adjust()
- next_move = world.time + ((num + adj)*mod)
-
/*
Before anything else, defer these calls to a per-mobtype handler. This allows us to
remove istype() spaghetti code, but requires the addition of other handler procs to simplify it.
@@ -45,7 +10,7 @@
/atom/Click(location,control,params)
if(flags_1 & INITIALIZED_1)
SEND_SIGNAL(src, COMSIG_CLICK, location, control, params, usr)
- usr.ClickOn(src, params)
+ usr.CommonClickOn(src, params)
/atom/DblClick(location,control,params)
if(flags_1 & INITIALIZED_1)
@@ -55,6 +20,21 @@
if(flags_1 & INITIALIZED_1)
usr.MouseWheelOn(src, delta_x, delta_y, params)
+/**
+ * Common mob click code
+ */
+/mob/proc/CommonClickOn(atom/A, params)
+ SHOULD_NOT_SLEEP(TRUE)
+ if(mob_transforming)
+ return
+ if(SEND_SIGNAL(src, COMSIG_MOB_CLICKON, A, params) & COMSIG_MOB_CANCEL_CLICKON)
+ return
+ . = ClickOn(A, params)
+ if(!(. & DISCARD_LAST_ACTION))
+ FlushCurrentAction()
+ else
+ DiscardCurrentAction()
+
/*
Standard mob ClickOn()
Handles exceptions: Buildmode, middle click, modified clicks, mech actions
@@ -68,50 +48,34 @@
* item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent
* mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed
*/
-/mob/proc/ClickOn( atom/A, params )
- if(world.time <= next_click)
- return
- next_click = world.time + world.tick_lag
-
+/mob/proc/ClickOn(atom/A, params)
+ SHOULD_NOT_SLEEP(TRUE)
if(check_click_intercept(params,A))
return
- if(mob_transforming)
- return
-
- if(SEND_SIGNAL(src, COMSIG_MOB_CLICKON, A, params) & COMSIG_MOB_CANCEL_CLICKON)
- return
-
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["middle"])
- ShiftMiddleClickOn(A)
- return
+ return ShiftMiddleClickOn(A)
if(modifiers["shift"] && modifiers["ctrl"])
- CtrlShiftClickOn(A)
- return
+ return CtrlShiftClickOn(A)
if(modifiers["middle"])
- MiddleClickOn(A)
- return
+ return MiddleClickOn(A)
if(modifiers["shift"] && (client && client.show_popup_menus || modifiers["right"])) //CIT CHANGE - makes shift-click examine use right click instead of left click in combat mode
- ShiftClickOn(A)
- return
+ return ShiftClickOn(A)
if(modifiers["alt"]) // alt and alt-gr (rightalt)
- AltClickOn(A)
- return
+ return AltClickOn(A)
if(modifiers["ctrl"])
- CtrlClickOn(A)
- return
+ return CtrlClickOn(A)
if(modifiers["right"]) //CIT CHANGE - allows right clicking to perform actions
- RightClickOn(A,params) //CIT CHANGE - ditto
- return //CIT CHANGE - ditto
+ return RightClickOn(A, params) //CIT CHANGE - ditto
if(incapacitated(ignore_restraints = 1))
return
face_atom(A)
- if(next_move > world.time) // in the year 2000...
+ if(!CheckActionCooldown(immediate = TRUE))
return
if(!modifiers["catcher"] && A.IsObscured())
@@ -119,12 +83,12 @@
if(ismecha(loc))
var/obj/mecha/M = loc
- return M.click_action(A,src,params)
+ M.click_action(A,src,params)
+ return TRUE
if(restrained())
- changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow
- RestrainedClickOn(A)
- return
+ DelayNextAction(CLICK_CD_HANDCUFFED)
+ return RestrainedClickOn(A)
if(in_throw_mode)
throw_item(A)
@@ -141,12 +105,12 @@
//User itself, current loc, and user inventory
if(A in DirectAccess())
if(W)
- W.melee_attack_chain(src, A, params)
+ return W.melee_attack_chain(src, A, params)
else
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
- UnarmedAttack(A)
- return
+ . = UnarmedAttack(A, TRUE, a_intent)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
+ DelayNextAction(CLICK_CD_MELEE)
+ return
//Can't reach anything else in lockers or other weirdness
if(!loc.AllowClick())
@@ -155,16 +119,17 @@
//Standard reach turf to turf or reaching inside storage
if(CanReach(A,W))
if(W)
- W.melee_attack_chain(src, A, params)
+ return W.melee_attack_chain(src, A, params)
else
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
- UnarmedAttack(A, 1)
+ . = UnarmedAttack(A, TRUE, a_intent)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
+ DelayNextAction(CLICK_CD_MELEE)
+ return
else
if(W)
- W.ranged_attack_chain(src, A, params)
+ return W.ranged_attack_chain(src, A, params)
else
- RangedAttack(A,params)
+ return RangedAttack(A,params)
//Is the atom obscured by a PREVENT_CLICK_UNDER_1 object above it
/atom/proc/IsObscured()
@@ -270,8 +235,6 @@
in human click code to allow glove touches only at melee range.
*/
/mob/proc/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
/*
Ranged unarmed attack:
@@ -304,7 +267,6 @@
var/datum/antagonist/changeling/C = mind.has_antag_datum(/datum/antagonist/changeling)
if(C && C.chosen_sting)
C.chosen_sting.try_to_sting(src,A)
- next_click = world.time + 5
return
swap_hand()
@@ -337,24 +299,24 @@
*/
/mob/proc/CtrlClickOn(atom/A)
- A.CtrlClick(src)
- return
+ return A.CtrlClick(src)
/atom/proc/CtrlClick(mob/user)
SEND_SIGNAL(src, COMSIG_CLICK_CTRL, user)
var/mob/living/ML = user
if(istype(ML))
- ML.pulled(src)
+ INVOKE_ASYNC(ML, /mob/living.verb/pulled, src)
/mob/living/carbon/human/CtrlClick(mob/user)
if(ishuman(user) && Adjacent(user) && !user.incapacitated())
- if(world.time < user.next_move)
+ if(!user.CheckActionCooldown())
return FALSE
var/mob/living/carbon/human/H = user
H.dna.species.grab(H, src, H.mind.martial_art)
- H.changeNext_move(CLICK_CD_MELEE)
+ H.DelayNextAction(CLICK_CD_MELEE)
+ return TRUE
else
- ..()
+ return ..()
/*
Alt click
Unused except for AI
@@ -377,8 +339,8 @@
var/datum/antagonist/changeling/C = mind.has_antag_datum(/datum/antagonist/changeling)
if(C && C.chosen_sting)
C.chosen_sting.try_to_sting(src,A)
- next_click = world.time + 5
- return
+ DelayNextAction(CLICK_CD_RANGE)
+ return TRUE
..()
/atom/proc/AltClick(mob/user)
@@ -413,9 +375,11 @@
return
/mob/living/LaserEyes(atom/A, params)
- changeNext_move(CLICK_CD_RANGE)
+ if(!CheckActionCooldown(CLICK_CD_RANGE))
+ return
+ DelayNextAction()
- var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam( loc )
+ var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam(loc)
LE.icon = 'icons/effects/genetics.dmi'
LE.icon_state = "eyelasers"
playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1)
@@ -424,6 +388,7 @@
LE.def_zone = get_organ_target()
LE.preparePixelProjectile(A, src, params)
LE.fire()
+ return TRUE
// Simple helper to face what you clicked on, in case it should be needed in more than one place
/mob/proc/face_atom(atom/A, ismousemovement = FALSE)
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index 82288ee0d1..372fe46046 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -7,10 +7,6 @@
*/
/mob/living/silicon/robot/ClickOn(var/atom/A, var/params)
- if(world.time <= next_click)
- return
- next_click = world.time + 1
-
if(check_click_intercept(params,A))
return
@@ -19,25 +15,19 @@
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
- CtrlShiftClickOn(A)
- return
+ return CtrlShiftClickOn(A)
if(modifiers["shift"] && modifiers["middle"])
- ShiftMiddleClickOn(A)
- return
+ return ShiftMiddleClickOn(A)
if(modifiers["middle"])
- MiddleClickOn(A)
- return
+ return MiddleClickOn(A)
if(modifiers["shift"])
- ShiftClickOn(A)
- return
+ return ShiftClickOn(A)
if(modifiers["alt"]) // alt and alt-gr (rightalt)
- AltClickOn(A)
- return
+ return AltClickOn(A)
if(modifiers["ctrl"])
- CtrlClickOn(A)
- return
+ return CtrlClickOn(A)
- if(next_move >= world.time)
+ if(!CheckActionCooldown(immediate = TRUE))
return
face_atom(A) // change direction to face what you clicked on
@@ -50,7 +40,7 @@
*/
if(aicamera.in_camera_mode) //Cyborg picture taking
aicamera.camera_mode_off()
- aicamera.captureimage(A, usr)
+ INVOKE_ASYNC(aicamera, /obj/item/camera.proc/captureimage, A, usr)
return
var/obj/item/W = get_active_held_item()
@@ -58,13 +48,8 @@
if(!W && A.Adjacent(src) && (isobj(A) || ismob(A)))
var/atom/movable/C = A
if(C.can_buckle && C.has_buckled_mobs())
- if(C.buckled_mobs.len > 1)
- var/unbuckled = input(src, "Who do you wish to unbuckle?","Unbuckle Who?") as null|mob in C.buckled_mobs
- if(C.user_unbuckle_mob(unbuckled,src))
- return
- else
- if(C.user_unbuckle_mob(C.buckled_mobs[1],src))
- return
+ INVOKE_ASYNC(C, /atom/movable.proc/precise_user_unbuckle_mob, src)
+ return
if(!W && (get_dist(src,A) <= interaction_range))
A.attack_robot(src)
@@ -81,7 +66,9 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents)
if(A == loc || (A in loc) || (A in contents))
- W.melee_attack_chain(src, A, params)
+ . = W.melee_attack_chain(src, A, params)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
+ DelayNextAction(CLICK_CD_MELEE)
return
if(!isturf(loc))
@@ -90,11 +77,12 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc))
if(isturf(A) || isturf(A.loc))
if(A.Adjacent(src)) // see adjacent.dm
- W.melee_attack_chain(src, A, params)
+ . = W.melee_attack_chain(src, A, params)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
+ DelayNextAction(CLICK_CD_MELEE)
return
else
- W.afterattack(A, src, 0, params)
- return
+ return W.afterattack(A, src, 0, params)
//Middle click cycles through selected modules.
/mob/living/silicon/robot/MiddleClickOn(atom/A)
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 4b963c730d..467c67e0c3 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -168,6 +168,8 @@
//UI position overrides for 1:1 screen layout. (default is 7:5)
#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button
#define ui_overridden_resist "EAST-3:24,SOUTH+1:7"
+#define ui_clickdelay "CENTER,SOUTH+1:-31"
+#define ui_resistdelay "EAST-3:24,SOUTH+1:4"
#define ui_combat_toggle "EAST-4:22,SOUTH:5"
#define ui_boxcraft "EAST-4:22,SOUTH+1:6"
diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm
index 0ed3a9cf26..8a66374029 100644
--- a/code/_onclick/hud/action_button.dm
+++ b/code/_onclick/hud/action_button.dm
@@ -56,9 +56,6 @@
if(id && usr.client) //try to (un)remember position
usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = locked ? moved : null
return TRUE
- if(usr.next_click > world.time)
- return
- usr.next_click = world.time + 1
linked_action.Trigger()
return TRUE
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 11531a701e..64250f6dd0 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -22,7 +22,7 @@
if(alerts[category])
thealert = alerts[category]
if(thealert.override_alerts)
- return 0
+ return thealert
if(new_master && new_master != thealert.master)
WARNING("[src] threw alert [category] with new_master [new_master] while already having that alert with master [thealert.master]")
@@ -36,7 +36,7 @@
clear_alert(category)
return .()
else //no need to update
- return 0
+ return thealert
else
thealert = new type()
thealert.override_alerts = override
@@ -272,7 +272,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
var/mob/living/L = usr
if(!istype(L) || !L.can_resist())
return
- L.changeNext_move(CLICK_CD_RESIST)
+ L.MarkResistTime()
if(CHECK_MOBILITY(L, MOBILITY_MOVE))
return L.resist_fire() //I just want to start a flame in your hearrrrrrtttttt.
@@ -600,17 +600,32 @@ so as to remain in compliance with the most up-to-date laws."
var/mob/living/L = usr
if(!istype(L) || !L.can_resist())
return
- L.changeNext_move(CLICK_CD_RESIST)
- if(CHECK_MOBILITY(L, MOBILITY_MOVE) && (L.last_special <= world.time))
- return L.resist_restraints()
+ L.MarkResistTime()
+ return L.resist_restraints()
/obj/screen/alert/restrained/buckled/Click()
var/mob/living/L = usr
if(!istype(L) || !L.can_resist())
return
- L.changeNext_move(CLICK_CD_RESIST)
- if(L.last_special <= world.time)
- return L.resist_buckle()
+ L.MarkResistTime()
+ return L.resist_buckle()
+
+/obj/screen/alert/shoes/untied
+ name = "Untied Shoes"
+ desc = "Your shoes are untied! Click the alert or your shoes to tie them."
+ icon_state = "shoealert"
+
+/obj/screen/alert/shoes/knotted
+ name = "Knotted Shoes"
+ desc = "Someone tied your shoelaces together! Click the alert or your shoes to undo the knot."
+ icon_state = "shoealert"
+
+/obj/screen/alert/shoes/Click()
+ var/mob/living/carbon/C = usr
+ if(!istype(C) || !C.can_resist() || C != mob_viewer || !C.shoes)
+ return
+ C.MarkResistTime()
+ C.shoes.handle_tying(C)
// PRIVATE = only edit, use, or override these if you're editing the system as a whole
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 9380cf98aa..04141becf2 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -140,6 +140,17 @@
sprint_buffer.hud = src
static_inventory += sprint_buffer
+ // clickdelay
+ clickdelay = new
+ clickdelay.hud = src
+ clickdelay.screen_loc = ui_clickdelay
+ static_inventory += clickdelay
+
+ // resistdelay
+ resistdelay = new
+ resistdelay.hud = src
+ resistdelay.screen_loc = ui_resistdelay
+ static_inventory += resistdelay
using = new /obj/screen/drop()
using.icon = ui_style
diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm
index 94374c5cb6..9050bcb5f0 100755
--- a/code/_onclick/hud/parallax.dm
+++ b/code/_onclick/hud/parallax.dm
@@ -219,6 +219,7 @@
L.screen_loc = "CENTER-7:[round(L.offset_x,1)],CENTER-7:[round(L.offset_y,1)]"
/atom/movable/proc/update_parallax_contents()
+ set waitfor = FALSE
if(length(client_mobs_in_contents))
for(var/thing in client_mobs_in_contents)
var/mob/M = thing
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 0088dde15a..126cc18907 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -47,17 +47,7 @@
name = "swap hand"
/obj/screen/swap_hand/Click()
- // At this point in client Click() code we have passed the 1/10 sec check and little else
- // We don't even know if it's a middle click
- if(world.time <= usr.next_move)
- return 1
-
- if(usr.incapacitated())
- return 1
-
- if(ismob(usr))
- var/mob/M = usr
- M.swap_hand()
+ usr.swap_hand()
return 1
/obj/screen/craft
@@ -101,15 +91,9 @@
plane = HUD_PLANE
/obj/screen/inventory/Click(location, control, params)
- // At this point in client Click() code we have passed the 1/10 sec check and little else
- // We don't even know if it's a middle click
- if(world.time <= usr.next_move)
- return TRUE
-
- if(usr.incapacitated())
- return TRUE
- if(ismecha(usr.loc)) // stops inventory actions in a mech
- return TRUE
+ if(hud?.mymob && (hud.mymob != usr))
+ return
+ // just redirect clicks
if(hud?.mymob && slot_id)
var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id)
@@ -190,17 +174,10 @@
/obj/screen/inventory/hand/Click(location, control, params)
- // At this point in client Click() code we have passed the 1/10 sec check and little else
- // We don't even know if it's a middle click
- var/mob/user = hud?.mymob
- if(usr != user)
- return TRUE
- if(world.time <= user.next_move)
- return TRUE
- if(user.incapacitated())
- return TRUE
- if (ismecha(user.loc)) // stops inventory actions in a mech
- return TRUE
+ if(hud?.mymob && (hud.mymob != usr))
+ return
+ var/mob/user = hud.mymob
+ // just redirect clicks
if(user.active_hand_index == held_index)
var/obj/item/I = user.get_active_held_item()
diff --git a/code/_onclick/hud/screen_objects/clickdelay.dm b/code/_onclick/hud/screen_objects/clickdelay.dm
new file mode 100644
index 0000000000..e0ad039cdf
--- /dev/null
+++ b/code/_onclick/hud/screen_objects/clickdelay.dm
@@ -0,0 +1,58 @@
+/obj/screen/action_bar
+
+/obj/screen/action_bar/Destroy()
+ STOP_PROCESSING(SShuds, src)
+ return ..()
+
+/obj/screen/action_bar/proc/mark_dirty()
+ var/mob/living/L = hud?.mymob
+ if(L?.client && update_to_mob(L))
+ START_PROCESSING(SShuds, src)
+
+/obj/screen/action_bar/process()
+ var/mob/living/L = hud?.mymob
+ if(!L?.client || !update_to_mob(L))
+ return PROCESS_KILL
+
+/obj/screen/action_bar/proc/update_to_mob(mob/living/L)
+ return FALSE
+
+/datum/hud/var/obj/screen/action_bar/clickdelay/clickdelay
+
+/obj/screen/action_bar/clickdelay
+ name = "click delay"
+ icon = 'icons/effects/progessbar.dmi'
+ icon_state = "prog_bar_100"
+ layer = 20 // under hand buttons
+
+/obj/screen/action_bar/clickdelay/Initialize()
+ . = ..()
+ var/matrix/M = new
+ M.Scale(2, 1)
+ transform = M
+
+/obj/screen/action_bar/clickdelay/update_to_mob(mob/living/L)
+ var/estimated = L.EstimatedNextActionTime()
+ var/diff = estimated - L.last_action
+ var/left = estimated - world.time
+ if(left < 0 || diff < 0)
+ icon_state = "prog_bar_100"
+ return FALSE
+ icon_state = "prog_bar_[round(clamp(((diff - left)/diff) * 100, 0, 100), 5)]"
+ return TRUE
+
+/datum/hud/var/obj/screen/action_bar/resistdelay/resistdelay
+
+/obj/screen/action_bar/resistdelay
+ name = "resist delay"
+ icon = 'icons/effects/progessbar.dmi'
+ icon_state = "prog_bar_100"
+
+/obj/screen/action_bar/resistdelay/update_to_mob(mob/living/L)
+ var/diff = L.next_resist - L.last_resist
+ var/left = L.next_resist - world.time
+ if(left < 0 || diff < 0)
+ icon_state = "prog_bar_100"
+ return FALSE
+ icon_state = "prog_bar_[round(clamp(((diff - left)/diff) * 100, 0, 100), 5)]"
+ return TRUE
diff --git a/modular_citadel/code/_onclick/hud/sprint.dm b/code/_onclick/hud/screen_objects/sprint.dm
similarity index 100%
rename from modular_citadel/code/_onclick/hud/sprint.dm
rename to code/_onclick/hud/screen_objects/sprint.dm
diff --git a/modular_citadel/code/_onclick/hud/stamina.dm b/code/_onclick/hud/screen_objects/stamina.dm
similarity index 100%
rename from modular_citadel/code/_onclick/hud/stamina.dm
rename to code/_onclick/hud/screen_objects/stamina.dm
diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm
index 7e8bfe12ab..ce7bc96c96 100644
--- a/code/_onclick/hud/screen_objects/storage.dm
+++ b/code/_onclick/hud/screen_objects/storage.dm
@@ -9,12 +9,9 @@
/obj/screen/storage/Click(location, control, params)
if(!insertion_click)
return ..()
- if(world.time <= usr.next_move)
- return TRUE
- if(usr.incapacitated())
- return TRUE
- if (ismecha(usr.loc)) // stops inventory actions in a mech
- return TRUE
+ if(hud?.mymob && (hud.mymob != usr))
+ return
+ // just redirect clicks
if(master)
var/obj/item/I = usr.get_active_held_item()
if(I)
diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects/vore.dm
similarity index 100%
rename from modular_citadel/code/_onclick/hud/screen_objects.dm
rename to code/_onclick/hud/screen_objects/vore.dm
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 838741108d..a0e9382491 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -7,21 +7,22 @@
*and lastly
*afterattack. The return value does not matter.
*/
-/obj/item/proc/melee_attack_chain(mob/user, atom/target, params, flags, damage_multiplier = 1)
+/obj/item/proc/melee_attack_chain(mob/user, atom/target, params, attackchain_flags, damage_multiplier = 1)
if(isliving(user))
var/mob/living/L = user
- if(!CHECK_MOBILITY(L, MOBILITY_USE) && !(flags & ATTACKCHAIN_PARRY_COUNTERATTACK))
+ if(!CHECK_MOBILITY(L, MOBILITY_USE) && !(attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK))
to_chat(L, "You are unable to swing [src] right now!")
return
- if(tool_behaviour && target.tool_act(user, src, tool_behaviour))
+ . = attackchain_flags
+ if(tool_behaviour && ((. = target.tool_act(user, src, tool_behaviour)) & STOP_ATTACK_PROC_CHAIN))
return
- if(pre_attack(target, user, params))
+ if((. |= pre_attack(target, user, params, ., damage_multiplier)) & STOP_ATTACK_PROC_CHAIN)
return
- if(target.attackby(src, user, params, flags, damage_multiplier))
+ if((. |= target.attackby(src, user, params, ., damage_multiplier)) & STOP_ATTACK_PROC_CHAIN)
return
if(QDELETED(src) || QDELETED(target))
return
- afterattack(target, user, TRUE, params)
+ . |= afterattack(target, user, TRUE, params)
/// Like melee_attack_chain but for ranged.
/obj/item/proc/ranged_attack_chain(mob/user, atom/target, params)
@@ -30,7 +31,7 @@
if(!CHECK_MOBILITY(L, MOBILITY_USE))
to_chat(L, "You are unable to raise [src] right now!")
return
- afterattack(target, user, FALSE, params)
+ return afterattack(target, user, FALSE, params)
// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
/obj/item/proc/attack_self(mob/user)
@@ -38,28 +39,43 @@
return
interact(user)
-/obj/item/proc/pre_attack(atom/A, mob/living/user, params) //do stuff before attackby!
+/obj/item/proc/pre_attack(atom/A, mob/living/user, params, attackchain_flags, damage_multiplier) //do stuff before attackby!
if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_NO_ATTACK)
- return TRUE
- return FALSE //return TRUE to avoid calling attackby after this proc does stuff
+ return STOP_ATTACK_PROC_CHAIN
+ if(!(attackchain_flags & ATTACK_IGNORE_CLICKDELAY) && !CheckAttackCooldown(user, A))
+ return STOP_ATTACK_PROC_CHAIN
// No comment
/atom/proc/attackby(obj/item/W, mob/user, params)
if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, params) & COMPONENT_NO_AFTERATTACK)
- return TRUE
- return FALSE
+ return STOP_ATTACK_PROC_CHAIN
/obj/attackby(obj/item/I, mob/living/user, params)
- return ..() || ((obj_flags & CAN_BE_HIT) && I.attack_obj(src, user))
+ . = ..()
+ if(. & STOP_ATTACK_PROC_CHAIN)
+ return
+ if(obj_flags & CAN_BE_HIT)
+ . |= I.attack_obj(src, user)
/mob/living/attackby(obj/item/I, mob/living/user, params, attackchain_flags, damage_multiplier)
- if(..())
- return TRUE
- I.attack_delay_done = FALSE //Should be set TRUE in pre_attacked_by()
- . = I.attack(src, user, attackchain_flags, damage_multiplier)
- if(!I.attack_delay_done) //Otherwise, pre_attacked_by() should handle it.
- user.changeNext_move(I.click_delay)
+ . = ..()
+ if(. & STOP_ATTACK_PROC_CHAIN)
+ return
+ . |= I.attack(src, user, attackchain_flags, damage_multiplier)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING)) // SAFETY NET - unless the proc tells us we should not handle this, give them the basic melee cooldown!
+ I.ApplyAttackCooldown(user, src, attackchain_flags)
+/**
+ * Called when someone uses us to attack a mob in melee combat.
+ *
+ * This proc respects CheckAttackCooldown() default clickdelay handling.
+ *
+ * @params
+ * * mob/living/M - target
+ * * mob/living/user - attacker
+ * * attackchain_Flags - see [code/__DEFINES/_flags/return_values.dm]
+ * * damage_multiplier - what to multiply the damage by
+ */
/obj/item/proc/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) & COMPONENT_ITEM_NO_ATTACK)
return
@@ -88,6 +104,17 @@
if(weight)
user.adjustStaminaLossBuffered(weight)
+ // CIT SCREENSHAKE
+ if(force >= 15)
+ shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01))
+ if(M.client)
+ switch (M.client.prefs.damagescreenshake)
+ if (1)
+ shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
+ if (2)
+ if(!CHECK_MOBILITY(M, MOBILITY_MOVE))
+ shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
+
//the equivalent of the standard version of attack() but for object targets.
/obj/item/proc/attack_obj(obj/O, mob/living/user)
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ)
@@ -95,8 +122,7 @@
if(item_flags & NOBLUDGEON)
return
user.do_attack_animation(O)
- if(!O.attacked_by(src, user))
- user.changeNext_move(click_delay)
+ O.attacked_by(src, user)
var/weight = getweight(user, STAM_COST_ATTACK_OBJ_MULT)
if(weight)
user.adjustStaminaLossBuffered(weight)//CIT CHANGE - makes attacking things cause stamina loss
@@ -109,12 +135,9 @@
var/bad_trait
var/stamloss = user.getStaminaLoss()
- var/next_move_mult = 1
if(stamloss > STAMINA_NEAR_SOFTCRIT) //The more tired you are, the less damage you do.
var/penalty = (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*STAM_CRIT_ITEM_ATTACK_PENALTY
totitemdamage *= 1 - penalty
- next_move_mult += penalty*STAM_CRIT_ITEM_ATTACK_DELAY
- user.changeNext_move(I.click_delay*next_move_mult)
if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
bad_trait = SKILL_COMBAT_MODE //blacklist combat skills.
@@ -126,18 +149,18 @@
if(!(SKILL_TRAIN_ATTACK_OBJ in I.used_skills[skill]))
continue
user.mind.auto_gain_experience(skill, I.skill_gain)
-
+ if(!(attackchain_flags & NO_AUTO_CLICKDELAY_HANDLING))
+ I.ApplyAttackCooldown(user, src, attackchain_flags)
if(totitemdamage)
visible_message("[user] has hit [src] with [I]!", null, null, COMBAT_MESSAGE_RANGE)
//only witnesses close by and the victim see a hit message.
log_combat(user, src, "attacked", I)
take_damage(totitemdamage, I.damtype, "melee", 1)
- return TRUE
/mob/living/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
var/list/block_return = list()
var/totitemdamage = pre_attacked_by(I, user) * damage_multiplier
- if((user != src) && mob_run_block(I, totitemdamage, "the [I.name]", ((attackchain_flags & ATTACKCHAIN_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, null, block_return) & BLOCK_SUCCESS)
+ if((user != src) && mob_run_block(I, totitemdamage, "the [I.name]", ((attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK)? ATTACK_IS_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, null, block_return) & BLOCK_SUCCESS)
return FALSE
totitemdamage = block_calculate_resultant_damage(totitemdamage, block_return)
send_item_attack_message(I, user, null, totitemdamage)
@@ -155,8 +178,7 @@
/mob/living/simple_animal/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
if(I.force < force_threshold || I.damtype == STAMINA)
- playsound(loc, 'sound/weapons/tap.ogg', I.get_clamped_volume(), 1, -1)
- user.changeNext_move(I.click_delay) //pre_attacked_by not called
+ playsound(src, 'sound/weapons/tap.ogg', I.get_clamped_volume(), 1, -1)
else
return ..()
@@ -167,16 +189,12 @@
var/stamloss = user.getStaminaLoss()
var/stam_mobility_mult = 1
- var/next_move_mult = 1
if(stamloss > STAMINA_NEAR_SOFTCRIT) //The more tired you are, the less damage you do.
var/penalty = (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*STAM_CRIT_ITEM_ATTACK_PENALTY
stam_mobility_mult -= penalty
- next_move_mult += penalty*STAM_CRIT_ITEM_ATTACK_DELAY
if(stam_mobility_mult > LYING_DAMAGE_PENALTY && !CHECK_MOBILITY(user, MOBILITY_STAND)) //damage penalty for fighting prone, doesn't stack with the above.
stam_mobility_mult = LYING_DAMAGE_PENALTY
. *= stam_mobility_mult
- user.changeNext_move(I.click_delay*next_move_mult)
- I.attack_delay_done = TRUE
var/bad_trait
if(!(I.item_flags & NO_COMBAT_MODE_FORCE_MODIFIER))
@@ -197,8 +215,18 @@
var/datum/skill/S = GLOB.skill_datums[skill]
user.mind.auto_gain_experience(skill, I.skill_gain*S.item_skill_gain_multi)
-// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person.
-// Click parameters is the params string from byond Click() code, see that documentation.
+/**
+ * Called after attacking something if the melee attack chain isn't interrupted before.
+ * Also called when clicking on something with an item without being in melee range
+ *
+ * WARNING: This does not automatically check clickdelay if not in a melee attack! Be sure to account for this!
+ *
+ * @params
+ * * target - The thing we clicked
+ * * user - mob of person clicking
+ * * proximity_flag - are we in melee range/doing it in a melee attack
+ * * click_parameters - mouse control parameters, check BYOND ref.
+ */
/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters)
SEND_SIGNAL(user, COMSIG_MOB_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters)
diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm
index ed7384697c..8a1e745308 100644
--- a/code/_onclick/observer.dm
+++ b/code/_onclick/observer.dm
@@ -37,7 +37,7 @@
CtrlClickOn(A)
return
- if(world.time <= next_move)
+ if(!CheckActionCooldown())
return
// You are responsible for checking config.ghost_interaction when you override this function
// Not all of them require checking, see below
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 48b652b6f3..975c6e62d4 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -5,7 +5,7 @@
Otherwise pretty standard.
*/
-/mob/living/carbon/human/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
+/mob/living/carbon/human/UnarmedAttack(atom/A, proximity, intent = a_intent, attackchain_flags = NONE)
if(!has_active_hand()) //can't attack without a hand.
to_chat(src, "You look at your arm and sigh.")
@@ -16,33 +16,45 @@
to_chat(src, "The damage in your [check_arm.name] is preventing you from using it! Get it fixed, or at least splinted!")
return
+ . = attackchain_flags
// Special glove functions:
// If the gloves do anything, have them return 1 to stop
// normal attack_hand() here.
var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines
- if(proximity && istype(G) && G.Touch(A,1))
- return
-
- var/override = 0
+ if(proximity && istype(G))
+ . |= G.Touch(A, TRUE)
+ if(. & INTERRUPT_UNARMED_ATTACK)
+ return
for(var/datum/mutation/human/HM in dna.mutations)
- override += HM.on_attack_hand(A, proximity, intent, flags)
+ . |= HM.on_attack_hand(A, proximity, intent, .)
- if(override)
+ if(. & INTERRUPT_UNARMED_ATTACK)
return
SEND_SIGNAL(src, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, A)
- A.attack_hand(src, intent, flags)
+ return . | A.attack_hand(src, intent, .)
-//Return TRUE to cancel other attack hand effects that respect it.
-/atom/proc/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = FALSE
+/atom/proc/attack_hand(mob/user, act_intent = user.a_intent, attackchain_flags)
+ SHOULD_NOT_SLEEP(TRUE)
if(!(interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND))
add_fingerprint(user)
if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_NO_ATTACK_HAND)
- . = TRUE
+ return
+ . = attackchain_flags
+ if(attack_hand_speed && !(. & ATTACK_IGNORE_CLICKDELAY))
+ if(!user.CheckActionCooldown(attack_hand_speed))
+ return
if(interaction_flags_atom & INTERACT_ATOM_ATTACK_HAND)
. = _try_interact(user)
+ INVOKE_ASYNC(src, .proc/on_attack_hand, user, act_intent, .)
+ if(!(. & ATTACK_IGNORE_ACTION))
+ if(attack_hand_unwieldlyness)
+ user.DelayNextAction(attack_hand_unwieldlyness, considered_action = attack_hand_is_action)
+ else if(attack_hand_is_action)
+ user.DelayNextAction()
+
+/atom/proc/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
//Return a non FALSE value to cancel whatever called this from propagating, if it respects it.
/atom/proc/_try_interact(mob/user)
@@ -50,7 +62,6 @@
return interact(user)
if(can_interact(user))
return interact(user)
- return FALSE
/atom/proc/can_interact(mob/user)
if(!user.can_interact_with(src))
@@ -80,8 +91,7 @@
else
add_fingerprint(user)
if(interaction_flags_atom & INTERACT_ATOM_UI_INTERACT)
- return ui_interact(user)
- return FALSE
+ ui_interact(user)
/*
/mob/living/carbon/human/RestrainedClickOn(var/atom/A) ---carbons will handle this
@@ -95,13 +105,19 @@
. = ..()
if(gloves)
var/obj/item/clothing/gloves/G = gloves
- if(istype(G) && G.Touch(A,0)) // for magic gloves
+ . |= G.Touch(A, FALSE)
+ if(. & INTERRUPT_UNARMED_ATTACK)
+ return
+ if(istype(glasses))
+ . |= glasses.ranged_attack(src, A, mouseparams)
+ if(. & INTERRUPT_UNARMED_ATTACK)
return
- if (istype(glasses) && glasses.ranged_attack(src,A,mouseparams))
- return
for(var/datum/mutation/human/HM in dna.mutations)
- HM.on_ranged_attack(A, mouseparams)
+ . |= HM.on_ranged_attack(A, mouseparams)
+
+ if(. & INTERRUPT_UNARMED_ATTACK)
+ return
if(isturf(A) && get_dist(src,A) <= 1)
src.Move_Pulled(A)
@@ -123,7 +139,9 @@
Monkeys
*/
/mob/living/carbon/monkey/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
- A.attack_paw(src, intent, flags)
+ if(!CheckActionCooldown(CLICK_CD_MELEE))
+ return
+ return !isnull(A.attack_paw(src, intent, flags))
/atom/proc/attack_paw(mob/user)
if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_PAW, user) & COMPONENT_NO_ATTACK_HAND)
@@ -144,6 +162,8 @@
return
if(is_muzzled())
return
+ if(!CheckActionCooldown(CLICK_CD_MELEE))
+ return
var/mob/living/carbon/ML = A
if(istype(ML))
var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
@@ -163,6 +183,7 @@
ML.ForceContractDisease(D)
else
ML.visible_message("[src] has attempted to bite [ML]!")
+ DelayNextAction()
/*
Aliens
@@ -243,7 +264,7 @@
/mob/living/simple_animal/hostile/UnarmedAttack(atom/A, proximity, intent = a_intent, flags = NONE)
target = A
if(dextrous && !ismob(A))
- ..()
+ return ..()
else
AttackingTarget()
diff --git a/modular_citadel/code/_onclick/click.dm b/code/_onclick/right_click.dm
similarity index 60%
rename from modular_citadel/code/_onclick/click.dm
rename to code/_onclick/right_click.dm
index 004cc2fe80..4b2480eb8c 100644
--- a/modular_citadel/code/_onclick/click.dm
+++ b/code/_onclick/right_click.dm
@@ -5,7 +5,7 @@
face_atom(A)
- if(next_move > world.time) // in the year 2000...
+ if(!CheckActionCooldown())
return
if(!modifiers["catcher"] && A.IsObscured())
@@ -16,9 +16,8 @@
return M.click_action(A,src,params)
if(restrained())
- changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow
- RestrainedClickOn(A)
- return
+ DelayNextAction(CLICK_CD_HANDCUFFED)
+ return RestrainedClickOn(A)
if(in_throw_mode)
throw_item(A)//todo: make it plausible to lightly toss items via right-click
@@ -36,13 +35,14 @@
//User itself, current loc, and user inventory
if(A in DirectAccess())
if(W)
- W.rightclick_melee_attack_chain(src, A, params)
+ return W.rightclick_melee_attack_chain(src, A, params)
else
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
- if(!AltUnarmedAttack(A))
- UnarmedAttack(A)
- return
+ if(!AltUnarmedAttack(A, TRUE))
+ . = UnarmedAttack(A, TRUE, a_intent)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
+ DelayNextAction(CLICK_CD_MELEE)
+ return
+ return
//Can't reach anything else in lockers or other weirdness
if(!loc.AllowClick())
@@ -51,23 +51,25 @@
//Standard reach turf to turf or reaching inside storage
if(CanReach(A,W))
if(W)
- W.rightclick_melee_attack_chain(src, A, params)
+ return W.rightclick_melee_attack_chain(src, A, params)
else
- if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
- if(!AltUnarmedAttack(A,1))
- UnarmedAttack(A,1)
+ if(!AltUnarmedAttack(A, TRUE))
+ . = UnarmedAttack(A, TRUE, a_intent)
+ if(!(. & NO_AUTO_CLICKDELAY_HANDLING) && ismob(A))
+ DelayNextAction(CLICK_CD_MELEE)
+ return
+ return
else
if(W)
if(!W.altafterattack(A, src, FALSE, params))
- W.afterattack(A, src, FALSE, params)
+ return W.afterattack(A, src, FALSE, params)
else
- if(!AltRangedAttack(A,params))
- RangedAttack(A,params)
+ if(!AltRangedAttack(A, params))
+ return RangedAttack(A, params)
/mob/proc/AltUnarmedAttack(atom/A, proximity_flag)
if(ismob(A))
- changeNext_move(CLICK_CD_MELEE)
+ DelayNextAction(CLICK_CD_MELEE)
return FALSE
/mob/proc/AltRangedAttack(atom/A, params)
diff --git a/modular_citadel/code/_onclick/item_attack.dm b/code/_onclick/right_item_attack.dm
similarity index 82%
rename from modular_citadel/code/_onclick/item_attack.dm
rename to code/_onclick/right_item_attack.dm
index bba3b14e2e..4ac9c96c8e 100644
--- a/modular_citadel/code/_onclick/item_attack.dm
+++ b/code/_onclick/right_item_attack.dm
@@ -1,10 +1,9 @@
/obj/item/proc/rightclick_melee_attack_chain(mob/user, atom/target, params)
if(!alt_pre_attack(target, user, params)) //Hey, does this item have special behavior that should override all normal right-click functionality?
if(!target.altattackby(src, user, params)) //Does the target do anything special when we right-click on it?
- melee_attack_chain(user, target, params) //Ugh. Lame! I'm filing a legal complaint about the discrimination against the right mouse button!
+ . = melee_attack_chain(user, target, params) //Ugh. Lame! I'm filing a legal complaint about the discrimination against the right mouse button!
else
- altafterattack(target, user, TRUE, params)
- return
+ . = altafterattack(target, user, TRUE, params)
/obj/item/proc/alt_pre_attack(atom/A, mob/living/user, params)
return FALSE //return something other than false if you wanna override attacking completely
diff --git a/modular_citadel/code/_onclick/other_mobs.dm b/code/_onclick/right_other_mobs.dm
similarity index 93%
rename from modular_citadel/code/_onclick/other_mobs.dm
rename to code/_onclick/right_other_mobs.dm
index ec740f023b..2dc9fddeef 100644
--- a/modular_citadel/code/_onclick/other_mobs.dm
+++ b/code/_onclick/right_other_mobs.dm
@@ -3,15 +3,14 @@
to_chat(src, "You look at the state of the universe and sigh.") //lets face it, people rarely ever see this message in its intended condition.
return TRUE
- if(!A.alt_attack_hand(src))
- A.attack_hand(src)
- return TRUE
- return TRUE
+ return A.alt_attack_hand(src)
/mob/living/carbon/human/AltRangedAttack(atom/A, params)
if(isturf(A) || incapacitated()) // pretty annoying to wave your fist at floors and walls. And useless.
- return TRUE
- changeNext_move(CLICK_CD_RANGE)
+ return
+ if(!CheckActionCooldown(CLICK_CD_RANGE))
+ return
+ DelayNextAction()
var/list/target_viewers = fov_viewers(11, A) //doesn't check for blindness.
if(!(src in target_viewers)) //click catcher issuing calls for out of view objects.
return TRUE
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index f95ebf82b5..73d834dd64 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -123,7 +123,8 @@
. = ..()
if(!target || !user)
return
-
+ if(!user.CheckActionCooldown())
+ return
if(!focus)
focus_object(target)
return
@@ -145,7 +146,7 @@
else
apply_focus_overlay()
focus.throw_at(target, 10, 1,user)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(immediate = FALSE)
update_icon()
/proc/tkMaxRangeCheck(mob/user, atom/target)
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index ac2afa7cae..97addfa131 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -469,11 +469,10 @@ GLOBAL_LIST_EMPTY(the_station_areas)
else
return
- possible_options = "Custom"
var/away_name
var/datum/space_level/away_level
- var/answer = input("What kind ? ","Away/VR") as null|anything in possible_options
+ var/answer = input("What kind ? ","Away/VR") as null|anything in list(possible_options + "Custom")
switch(answer)
if(null)
return
diff --git a/code/controllers/subsystem/processing/huds.dm b/code/controllers/subsystem/processing/huds.dm
new file mode 100644
index 0000000000..aea23d2400
--- /dev/null
+++ b/code/controllers/subsystem/processing/huds.dm
@@ -0,0 +1,6 @@
+// Smooth HUD updates, but low priority
+PROCESSING_SUBSYSTEM_DEF(huds)
+ name = "HUD updates"
+ wait = 0.5
+ priority = FIRE_PRIORITY_HUDS
+ stat_tag = "HUDS"
diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm
index 13cf2add97..7cc5348a0a 100644
--- a/code/datums/brain_damage/special.dm
+++ b/code/datums/brain_damage/special.dm
@@ -103,8 +103,7 @@
. = ..()
QDEL_IN(src, 300)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/effect/hallucination/simple/bluespace_stream/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/effect/hallucination/simple/bluespace_stream/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user != seer || !linked_to)
return
var/slip_in_message = pick("slides sideways in an odd way, and disappears", "jumps into an unseen dimension",\
diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm
index f5da669c3a..129faabdb7 100644
--- a/code/datums/components/rotation.dm
+++ b/code/datums/components/rotation.dm
@@ -98,16 +98,16 @@
/datum/component/simple_rotation/proc/HandRot(datum/source, mob/user, rotation = default_rotation_direction)
if(can_be_rotated)
- if(!can_be_rotated.Invoke(user, default_rotation_direction))
+ if(!can_be_rotated.Invoke(user, rotation))
return
else
- if(!default_can_be_rotated(user, default_rotation_direction))
+ if(!default_can_be_rotated(user, rotation))
return
if(can_user_rotate)
- if(!can_user_rotate.Invoke(user, default_rotation_direction))
+ if(!can_user_rotate.Invoke(user, rotation))
return
else
- if(!default_can_user_rotate(user, default_rotation_direction))
+ if(!default_can_user_rotate(user, rotation))
return
BaseRot(user, rotation)
return TRUE
diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm
index f110d5e8ed..8bee4f3d1c 100644
--- a/code/datums/looping_sounds/_looping_sound.dm
+++ b/code/datums/looping_sounds/_looping_sound.dm
@@ -60,6 +60,7 @@
output_atoms -= remove_thing
if(init_timerid)
deltimer(init_timerid)
+ init_timerid = null
if(!timerid)
return
on_stop()
diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm
index a2078a82e4..787d6375a7 100644
--- a/code/datums/mood_events/generic_negative_events.dm
+++ b/code/datums/mood_events/generic_negative_events.dm
@@ -274,3 +274,13 @@
description = "I've produced better art than that from my ass.\n"
mood_change = -2
timeout = 1200
+
+/datum/mood_event/tripped
+ description = "I can't believe I fell for the oldest trick in the book!\n"
+ mood_change = -6
+ timeout = 2 MINUTES
+
+/datum/mood_event/untied
+ description = "I hate when my shoes come untied!\n"
+ mood_change = -3
+ timeout = 1 MINUTES
diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm
index 1b80c18407..5d363124d9 100644
--- a/code/datums/mutations/hulk.dm
+++ b/code/datums/mutations/hulk.dm
@@ -21,7 +21,11 @@
/datum/mutation/human/hulk/on_attack_hand(atom/target, proximity, act_intent, unarmed_attack_flags)
if(proximity && (act_intent == INTENT_HARM)) //no telekinetic hulk attack
- return target.attack_hulk(owner)
+ if(!owner.CheckActionCooldown(CLICK_CD_MELEE))
+ return INTERRUPT_UNARMED_ATTACK | NO_AUTO_CLICKDELAY_HANDLING
+ owner.DelayNextAction()
+ target.attack_hulk(owner)
+ return INTERRUPT_UNARMED_ATTACK | NO_AUTO_CLICKDELAY_HANDLING
/**
*Checks damage of a hulk's arm and applies bone wounds as necessary.
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 1d2c3e46ad..40a663f139 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -144,7 +144,6 @@
id = "tased"
alert_type = null
var/movespeed_mod = /datum/movespeed_modifier/status_effect/tased
- var/nextmove_modifier = 1
var/stamdmg_per_ds = 0 //a 20 duration would do 20 stamdmg, disablers do 24 or something
var/last_tick = 0 //fastprocess processing speed is a goddamn sham, don't trust it.
@@ -173,13 +172,9 @@
C.adjustStaminaLoss(max(0, stamdmg_per_ds * diff)) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing.
last_tick = world.time
-/datum/status_effect/electrode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y
- return nextmove_modifier
-
/datum/status_effect/electrode/no_combat_mode
id = "tased_strong"
movespeed_mod = /datum/movespeed_modifier/status_effect/tased/no_combat_mode
- nextmove_modifier = 2
blocks_combatmode = TRUE
stamdmg_per_ds = 1
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index dd5fef61d7..461ae9c65d 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -90,13 +90,12 @@
return
duration = world.time + original_duration
-//clickdelay/nextmove modifiers!
-/datum/status_effect/proc/nextmove_modifier()
+/**
+ * Multiplied to clickdelays
+ */
+/datum/status_effect/proc/action_cooldown_mod()
return 1
-/datum/status_effect/proc/nextmove_adjust()
- return 0
-
////////////////
// ALERT HOOK //
////////////////
diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm
index fc075201dc..045b1b257d 100644
--- a/code/datums/status_effects/wound_effects.dm
+++ b/code/datums/status_effects/wound_effects.dm
@@ -150,7 +150,7 @@
return 1
-/datum/status_effect/wound/blunt/nextmove_modifier()
+/datum/status_effect/wound/blunt/action_cooldown_mod()
var/mob/living/carbon/C = owner
if(C.get_active_hand() == linked_limb)
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index 95e02c5a94..87126ae28f 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -56,7 +56,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
if("Medical Doctor")
heirloom_type = /obj/item/healthanalyzer/advanced
if("Paramedic")
- heirloom_type = pick(/obj/item/clothing/neck/stethoscope, /obj/item/bodybag)
+ heirloom_type = /obj/item/lighter
if("Station Engineer")
heirloom_type = /obj/item/wirecutters/brass
if("Atmospheric Technician")
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 7623a88065..de9df3a23e 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -70,6 +70,9 @@
/// A luminescence-shifted value of the last color calculated for chatmessage overlays
var/chat_color_darkened
+ ///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy()
+ var/list/targeted_by
+
/atom/New(loc, ...)
//atom creation method that preloads variables at creation
if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
@@ -144,6 +147,11 @@
LAZYCLEARLIST(overlays)
LAZYCLEARLIST(priority_overlays)
+ for(var/i in targeted_by)
+ var/mob/M = i
+ LAZYREMOVE(M.do_afters, src)
+ targeted_by = null
+
QDEL_NULL(light)
return ..()
@@ -219,7 +227,7 @@
/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user)
if(does_attack_animation)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
log_combat(user, src, "punched", "hulk powers")
user.do_attack_animation(src, ATTACK_EFFECT_SMASH)
diff --git a/code/game/gamemodes/clown_ops/clown_ops.dm b/code/game/gamemodes/clown_ops/clown_ops.dm
index 11898701fa..108c67ad27 100644
--- a/code/game/gamemodes/clown_ops/clown_ops.dm
+++ b/code/game/gamemodes/clown_ops/clown_ops.dm
@@ -58,6 +58,7 @@
if(visualsOnly)
return
H.dna.add_mutation(SMILE)
+ H.faction |= "clown"
/datum/outfit/syndicate/clownop/leader
name = "Clown Operative Leader - Basic"
diff --git a/code/game/gamemodes/gangs/dominator.dm b/code/game/gamemodes/gangs/dominator.dm
index b4028dc0fd..a7e44ef325 100644
--- a/code/game/gamemodes/gangs/dominator.dm
+++ b/code/game/gamemodes/gangs/dominator.dm
@@ -149,7 +149,7 @@
add_fingerprint(user)
return ..()
-/obj/machinery/dominator/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/dominator/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(operating || (stat & BROKEN))
examine(user)
return
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index f6b0c8e24b..7b7fdbeaf9 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -94,6 +94,11 @@
targetitem = /obj/item/documents //Any set of secret documents. Doesn't have to be NT's
difficulty = 5
+/datum/objective_item/steal/blackbox
+ name = "the black box from the onboard blackbox recording device. Take care to wear the proper safety equipment when extracting the black box as the telecommunications array is likely to be under inhospitable conditions."
+ targetitem = /obj/item/blackbox //steal the forbidden ssblackbox
+ difficulty = 10
+
/datum/objective_item/steal/nuke_core
name = "the heavily radioactive plutonium core from the onboard self-destruct. Take care to wear the proper safety equipment when extracting the core!"
targetitem = /obj/item/nuke_core
diff --git a/code/game/gamemodes/sandbox/airlock_maker.dm b/code/game/gamemodes/sandbox/airlock_maker.dm
index ddb622ab08..3d8eb7f7fc 100644
--- a/code/game/gamemodes/sandbox/airlock_maker.dm
+++ b/code/game/gamemodes/sandbox/airlock_maker.dm
@@ -7,7 +7,7 @@
/obj/structure/door_assembly
var/datum/airlock_maker/maker = null
-/obj/structure/door_assembly/attack_hand()
+/obj/structure/door_assembly/on_attack_hand()
. = ..()
if(.)
return
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index 634ed2da48..6bac63dff0 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -107,10 +107,7 @@
stat |= BROKEN
update_icon()
-/obj/machinery/pdapainter/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/pdapainter/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!storedpda)
to_chat(user, "[src] is empty.")
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 6ef13ac36f..3faf6d5727 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -313,7 +313,7 @@ Class Procs:
if(user.a_intent != INTENT_HARM)
return attack_hand(user)
else
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
user.visible_message("[user.name] smashes against \the [src.name] with its paws.", null, null, COMBAT_MESSAGE_RANGE)
take_damage(4, BRUTE, "melee", 1)
diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm
index 31fdf675ca..4b5e4088d7 100644
--- a/code/game/machinery/airlock_control.dm
+++ b/code/game/machinery/airlock_control.dm
@@ -122,10 +122,7 @@
else
icon_state = "airlock_sensor_off"
-/obj/machinery/airlock_sensor/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/airlock_sensor/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
var/datum/signal/signal = new(list(
"tag" = master_tag,
"command" = "cycle"
diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm
index d13c167a22..28733a6b6c 100644
--- a/code/game/machinery/aug_manipulator.dm
+++ b/code/game/machinery/aug_manipulator.dm
@@ -100,10 +100,7 @@
stat |= BROKEN
update_icon()
-/obj/machinery/aug_manipulator/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/aug_manipulator/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
if(storedpart)
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index 4661e1bd8f..b5031b68a1 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -138,7 +138,7 @@
var/obj/item/assembly/control/A = device
A.id = "[idnum][id]"
-/obj/machinery/button/attack_hand(mob/user)
+/obj/machinery/button/on_attack_hand(mob/user)
. = ..()
if(.)
return
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 5a1547aae0..2795ba45a9 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -235,7 +235,7 @@
itemname = P.name
info = P.notehtml
to_chat(U, "You hold \the [itemname] up to the camera...")
- U.changeNext_move(CLICK_CD_MELEE)
+ U.DelayNextAction(CLICK_CD_MELEE)
for(var/mob/O in GLOB.player_list)
if(isAI(O))
var/mob/living/silicon/ai/AI = O
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index 01f73a3c75..effd70e9ab 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -79,10 +79,7 @@
charging = null
update_icon()
-/obj/machinery/cell_charger/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/cell_charger/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!charging)
return
diff --git a/code/game/machinery/computer/arcade/misc_arcade.dm b/code/game/machinery/computer/arcade/misc_arcade.dm
index 9b7d3d3f6f..24516740f9 100644
--- a/code/game/machinery/computer/arcade/misc_arcade.dm
+++ b/code/game/machinery/computer/arcade/misc_arcade.dm
@@ -8,7 +8,7 @@
icon_state = "arcade"
circuit = /obj/item/circuitboard/computer/arcade/amputation
-/obj/machinery/computer/arcade/amputation/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/computer/arcade/amputation/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!iscarbon(user))
return
var/mob/living/carbon/c_user = user
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 9f1390c69b..32dbfba989 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -103,10 +103,7 @@
return FALSE
return ..()
-/obj/machinery/computer/camera_advanced/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/computer/camera_advanced/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(current_user)
to_chat(user, "The console is already in use!")
return
diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm
index f91fd66fb5..677cbe1208 100644
--- a/code/game/machinery/defibrillator_mount.dm
+++ b/code/game/machinery/defibrillator_mount.dm
@@ -59,7 +59,7 @@
return defib.get_cell()
//defib interaction
-/obj/machinery/defibrillator_mount/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/defibrillator_mount/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!defib)
to_chat(user, "There's no defibrillator unit loaded!")
return
diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm
index 5bf16d4638..3cfd8fdfc4 100644
--- a/code/game/machinery/dish_drive.dm
+++ b/code/game/machinery/dish_drive.dm
@@ -31,7 +31,7 @@
if(user.Adjacent(src))
. += "Alt-click it to beam its contents to any nearby disposal bins."
-/obj/machinery/dish_drive/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/dish_drive/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!contents.len)
to_chat(user, "There's nothing in [src]!")
return
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index 95552d931b..e721e986d2 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -70,8 +70,6 @@
if(!locked)
open_machine()
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the door of [src]!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a metallic creaking from [src].")
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index a950cb7e7d..b5e752cc6b 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -763,10 +763,7 @@
/obj/machinery/door/airlock/attack_paw(mob/user)
return attack_hand(user)
-/obj/machinery/door/airlock/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/door/airlock/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!(issilicon(user) || IsAdminGhost(user)))
if(src.isElectrified())
if(src.shock(user, 100))
@@ -783,6 +780,8 @@
H.apply_damage(10, BRUTE, BODY_ZONE_HEAD)
else
visible_message("[user] headbutts the airlock. Good thing [user.p_theyre()] wearing a helmet.")
+ else
+ return ..()
/obj/machinery/door/airlock/attempt_wire_interaction(mob/user)
if(security_level)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 52623a9262..4248e1684f 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -140,10 +140,7 @@
do_animate("deny")
return
-/obj/machinery/door/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/door/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
return try_to_activate_door(user)
/obj/machinery/door/attack_tk(mob/user)
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 4855280b86..2d41575e70 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -24,6 +24,8 @@
armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 70)
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN
air_tight = TRUE
+ attack_hand_is_action = TRUE
+ attack_hand_speed = CLICK_CD_MELEE
var/emergency_close_timer = 0
var/nextstate = null
var/boltslocked = TRUE
@@ -80,7 +82,6 @@
return TRUE
return FALSE
-
/obj/machinery/door/firedoor/power_change()
if(powered(power_channel))
stat &= ~NOPOWER
@@ -88,11 +89,7 @@
else
stat |= NOPOWER
-/obj/machinery/door/firedoor/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
-
+/obj/machinery/door/firedoor/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!welded && !operating && !(stat & NOPOWER) && (!density || allow_hand_open(user)))
add_fingerprint(user)
if(density)
@@ -103,7 +100,6 @@
return TRUE
if(operating || !density)
return
- user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] bangs on \the [src].",
"You bang on \the [src].")
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 4c68d0b0b5..000b3dc7b5 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -141,7 +141,7 @@
if(user)
log_game("[user] reset a fire alarm at [COORD(src)]")
-/obj/machinery/firealarm/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/firealarm/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(buildstage != 2)
return ..()
add_fingerprint(user)
diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm
index fb41ac986d..da64699dd4 100644
--- a/code/game/machinery/gulag_teleporter.dm
+++ b/code/game/machinery/gulag_teleporter.dm
@@ -101,8 +101,6 @@ The console is located at computer/gulag_teleporter.dm
if(!locked)
open_machine()
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the door of [src]!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a metallic creaking from [src].")
diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm
index 8cb7ca1e8d..191967ac1a 100644
--- a/code/game/machinery/harvester.dm
+++ b/code/game/machinery/harvester.dm
@@ -50,7 +50,7 @@
harvesting = FALSE
warming_up = FALSE
-/obj/machinery/harvester/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/harvester/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(state_open)
close_machine()
else if(!harvesting)
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index f43114f7cb..25f4248d6d 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -78,7 +78,7 @@ GLOBAL_LIST_EMPTY(network_holopads)
new_disk.forceMove(src)
disk = new_disk
-/obj/machinery/holopad/tutorial/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/holopad/tutorial/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!istype(user))
return
if(user.incapacitated() || !is_operational())
diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm
index 5677a09f12..16b464ced6 100644
--- a/code/game/machinery/hypnochair.dm
+++ b/code/game/machinery/hypnochair.dm
@@ -178,8 +178,6 @@
icon_state += "_occupied"
/obj/machinery/hypnochair/container_resist(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the door of [src]!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(600)].)", \
"You hear a metallic creaking from [src].")
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 7cf21ed767..ba4d01cfe5 100644
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -26,10 +26,7 @@
on = TRUE
icon_state = "igniter1"
-/obj/machinery/igniter/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/igniter/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
use_power(50)
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 7bb08fdbc1..bf71786a05 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -158,10 +158,7 @@
attached.transfer_blood_to(beaker, amount)
update_icon()
-/obj/machinery/iv_drip/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/iv_drip/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(attached)
visible_message("[attached] is detached from [src]")
attached = null
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 1887ee46c0..2a60711a81 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -17,6 +17,7 @@
active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power
req_access = list(ACCESS_SEC_DOORS)
power_channel = EQUIP //drains power from the EQUIPMENT channel
+ speed_process = TRUE
var/base_icon_state = "standard"
var/scan_range = 7
@@ -53,7 +54,7 @@
var/last_fired = 0 //world.time the turret last fired
var/shot_delay = 15 //ticks until next shot (1.5 ?)
-
+ var/shot_stagger = 0 // sleep() shots to stagger attacks
var/check_records = 1 //checks if it can use the security records
var/criminals = 1 //checks if it can shoot people on arrest
@@ -436,6 +437,9 @@
else if(!always_up)
popDown() // no valid targets, close the cover
+/obj/machinery/porta_turret/proc/randomize_shot_stagger()
+ shot_stagger = rand(0, min(2 SECONDS, round(shot_delay/3, world.tick_lag)))
+
/obj/machinery/porta_turret/proc/tryToShootAt(list/atom/movable/targets)
while(targets.len > 0)
var/atom/movable/M = pick(targets)
@@ -443,7 +447,6 @@
if(target(M))
return 1
-
/obj/machinery/porta_turret/proc/popUp() //pops the turret up
if(!anchored)
return
@@ -525,11 +528,14 @@
if(target)
popUp() //pop the turret up if it's not already up.
setDir(get_dir(base, target))//even if you can't shoot, follow the target
- shootAt(target)
+ INVOKE_ASYNC(src, .proc/shootAt, target)
return 1
return
-/obj/machinery/porta_turret/proc/shootAt(atom/movable/target)
+/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
diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm
index bf70ee8a9d..7c2000175e 100644
--- a/code/game/machinery/porta_turret/portable_turret_construct.dm
+++ b/code/game/machinery/porta_turret/portable_turret_construct.dm
@@ -79,6 +79,9 @@
if(PTURRET_INTERNAL_ARMOUR_ON)
if(istype(I, /obj/item/gun/energy)) //the gun installation part
var/obj/item/gun/energy/E = I
+ if(!E.can_turret)
+ to_chat(user, "[src] can't be fit into turrets.")
+ return
if(!user.transferItemToLoc(E, src))
return
installed_gun = E
@@ -168,10 +171,7 @@
return ..()
-/obj/machinery/porta_turret_construct/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/porta_turret_construct/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
switch(build_step)
if(PTURRET_GUN_EQUIPPED)
build_step = PTURRET_INTERNAL_ARMOUR_ON
diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm
index 3899f07685..e0746bda78 100644
--- a/code/game/machinery/porta_turret/portable_turret_cover.dm
+++ b/code/game/machinery/porta_turret/portable_turret_cover.dm
@@ -31,10 +31,7 @@
return parent_turret.attack_ai(user)
-/obj/machinery/porta_turret_cover/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/porta_turret_cover/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
return parent_turret.attack_hand(user)
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 5d0d39e3a4..1d118023c9 100755
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -108,10 +108,7 @@
return ..()
-/obj/machinery/recharger/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/recharger/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
if(charging)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 7de414fd63..75772786fc 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -301,8 +301,6 @@
open_machine()
dump_contents()
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the doors of [src]!", \
"You start kicking against the doors... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a thump from [src].")
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index 8b9aa64c58..1b3f942c51 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -68,10 +68,7 @@ GLOBAL_VAR_INIT(singularity_counter, 0)
/obj/machinery/power/singularity_beacon/attack_ai(mob/user)
return
-/obj/machinery/power/singularity_beacon/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/power/singularity_beacon/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(anchored)
return active ? Deactivate(user) : Activate(user)
else
diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm
index 7f8872ca74..c6386241ee 100644
--- a/code/game/machinery/telecomms/machines/message_server.dm
+++ b/code/game/machinery/telecomms/machines/message_server.dm
@@ -5,16 +5,73 @@
require the message server.
*/
-// A decorational representation of SSblackbox, usually placed alongside the message server.
+// A decorational representation of SSblackbox, usually placed alongside the message server. Also contains a traitor theft item.
/obj/machinery/blackbox_recorder
icon = 'icons/obj/stationobjs.dmi'
icon_state = "blackbox"
- name = "Blackbox Recorder"
+ name = "blackbox recorder"
density = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70)
+ var/obj/item/stored
+
+/obj/machinery/blackbox_recorder/Initialize()
+ . = ..()
+ stored = new /obj/item/blackbox(src)
+
+/obj/machinery/blackbox_recorder/attack_hand(mob/living/user)
+ . = ..()
+ if(stored)
+ to_chat(user, "You start struggling to pry the [stored] from the [src]...")
+ if(!do_after(user, 30 SECONDS, TRUE, src))
+ to_chat(user, "Your fingers slip as you fail to pry the [stored] from the [src], clicking it right back into the slot!")
+ return
+ if(user.put_in_hands(stored))
+ stored.forceMove(user.drop_location())
+ stored = null
+ to_chat(user, "You successfully pry the [stored] from the [src], and send its overwhelming weight tumbling onto the ground! The tapes on the [src] stop spinning...")
+ update_icon()
+ return
+ else
+ to_chat(user, "It seems that the blackbox is missing...")
+ return
+
+/obj/machinery/blackbox_recorder/attackby(obj/item/I, mob/living/user, params)
+ . = ..()
+ if(istype(I, /obj/item/blackbox))
+ if(HAS_TRAIT(I, TRAIT_NODROP) || !user.transferItemToLoc(I, src))
+ to_chat(user, "[I] is stuck to your hand!")
+ return
+ user.visible_message("[user] clicks the [I] into the [src]!", \
+ "You press [I] into [src], and it clicks into place. The tapes on the [src] begin spinning again...")
+ playsound(src, 'sound/machines/click.ogg', 50, TRUE)
+ stored = I
+ update_icon()
+ return ..()
+ return ..()
+
+/obj/machinery/blackbox_recorder/Destroy()
+ if(stored)
+ stored.forceMove(loc)
+ new /obj/effect/decal/cleanable/oil(loc)
+ return ..()
+
+/obj/machinery/blackbox_recorder/update_icon()
+ . = ..()
+ if(!stored)
+ icon_state = "blackbox_b"
+ else
+ icon_state = "blackbox"
+
+/obj/item/blackbox
+ name = "the blackbox"
+ desc = "A strange relic, capable of recording data on extradimensional vertices. It lives inside the blackbox recorder for safe keeping."
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "blackcube"
+ w_class = WEIGHT_CLASS_BULKY
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
// The message server itself.
@@ -140,9 +197,9 @@
..()
if(href_list["photo"])
var/mob/M = usr
-
- M << browse_rsc(picture.picture_image, "pda_photo.png")
-
+
+ M << browse_rsc(picture.picture_image, "pda_photo.png")
+
var/dat = "
"
dat += "

"
dat += "
"
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 9e277b9d8e..3441ac7eaa 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -297,10 +297,7 @@ GLOBAL_LIST_INIT(dye_registry, list(
else
return ..()
-/obj/machinery/washing_machine/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/washing_machine/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(busy)
to_chat(user, "[src] is busy.")
return
diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm
index dcd86c9f24..12fdc2193b 100644
--- a/code/game/machinery/wishgranter.dm
+++ b/code/game/machinery/wishgranter.dm
@@ -10,7 +10,7 @@
var/charges = 1
var/insisting = 0
-/obj/machinery/wish_granter/attack_hand(mob/living/carbon/user)
+/obj/machinery/wish_granter/on_attack_hand(mob/living/carbon/user)
if(charges <= 0)
to_chat(user, "The Wish Granter lies silent.")
return
@@ -31,7 +31,7 @@
user.dna.add_mutation(XRAY)
user.dna.add_mutation(SPACEMUT)
user.dna.add_mutation(TK)
- user.next_move_modifier *= 0.5 //half the delay between attacks!
+ user.action_cooldown_mod *= 0.5
to_chat(user, "Things around you feel slower!")
charges--
insisting = FALSE
@@ -101,7 +101,7 @@
to_chat(user, "[killreward] materializes into your hands!")
else
to_chat(user, "[killreward] materializes onto the floor.")
- user.next_move_modifier *= 0.8 //20% less delay between attacks!
+ user.action_cooldown_mod *= 0.8
to_chat(user, "Things around you feel slightly slower!")
var/mob/living/simple_animal/hostile/venus_human_trap/killwish = new /mob/living/simple_animal/hostile/venus_human_trap(loc)
killwish.maxHealth = 1500
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index d2340a15ea..5b691607db 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -24,6 +24,8 @@
infra_luminosity = 15 //byond implementation is bugged.
force = 5
flags_1 = HEAR_1|BLOCK_FACE_ATOM_1
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
var/can_move = 0 //time of next allowed movement
var/mob/living/occupant = null
var/step_in = 10 //make a step in step_in/10 sec.
diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm
index dedbef1906..40336fb01e 100644
--- a/code/game/mecha/mecha_defense.dm
+++ b/code/game/mecha/mecha_defense.dm
@@ -54,11 +54,7 @@
. *= booster_damage_modifier
-/obj/mecha/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
- user.changeNext_move(CLICK_CD_MELEE) // Ugh. Ideally we shouldn't be setting cooldowns outside of click code.
+/obj/mecha/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
playsound(loc, 'sound/weapons/tap.ogg', 40, 1, -1)
user.visible_message("[user] hits [name]. Nothing happens", null, null, COMBAT_MESSAGE_RANGE)
@@ -255,7 +251,7 @@
return
else if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
if(obj_integrity < max_integrity)
if(W.use_tool(src, user, 0, volume=50, amount=1))
if (internal_damage & MECHA_INT_TANK_BREACH)
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index eabbdfad88..bdb748925c 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -9,7 +9,7 @@
var/buckle_prevents_pull = FALSE
//Interaction
-/atom/movable/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/atom/movable/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -145,3 +145,13 @@
var/mob/living/L = M.pulledby
L.set_pull_offsets(M, L.grab_state)
return M
+
+/atom/movable/proc/precise_user_unbuckle_mob(mob/user)
+ if(!buckled_mobs)
+ return
+ else if(length(buckled_mobs) == 1)
+ return user_unbuckle_mob(buckled_mobs[1], user)
+ else
+ var/unbuckled = input(user, "Who do you wish to unbuckle?","Unbuckle Who?") as null|mob in buckled_mobs
+ return user_unbuckle_mob(unbuckled, user)
+
diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm
index e4f1c854d0..8e2f39d0df 100644
--- a/code/game/objects/effects/contraband.dm
+++ b/code/game/objects/effects/contraband.dm
@@ -101,10 +101,7 @@
to_chat(user, "You carefully remove the poster from the wall.")
roll_and_drop(user.loc)
-/obj/structure/sign/poster/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/sign/poster/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(ruined)
return
visible_message("[user] rips [src] in a single, decisive motion!" )
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index 01f0b6f957..044c5c6e86 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -137,10 +137,7 @@
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
beauty = -150
-/obj/effect/decal/cleanable/vomit/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/effect/decal/cleanable/vomit/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(isflyperson(H))
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index 0cf95ea263..640675bea5 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -268,6 +268,8 @@
gender = PLURAL
max_integrity = 20
CanAtmosPass = ATMOS_PASS_DENSITY
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
/obj/structure/foamedmetal/Initialize()
. = ..()
@@ -284,11 +286,7 @@
/obj/structure/foamedmetal/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
playsound(src.loc, 'sound/weapons/tap.ogg', 100, 1)
-/obj/structure/foamedmetal/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
- user.changeNext_move(CLICK_CD_MELEE)
+/obj/structure/foamedmetal/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
to_chat(user, "You hit [src] but bounce off it!")
playsound(src.loc, 'sound/weapons/tap.ogg', 100, 1)
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index e363529c46..0b227be247 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -60,10 +60,7 @@
/obj/effect/portal/attack_tk(mob/user)
return
-/obj/effect/portal/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/effect/portal/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(get_turf(user) == get_turf(src))
teleport(user)
if(Adjacent(user))
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index 745b281d2a..4b04606401 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -120,6 +120,8 @@
var/poison_type = "toxin"
var/poison_per_bite = 5
var/list/faction = list("spiders")
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
/obj/structure/spider/spiderling/Destroy()
new/obj/item/reagent_containers/food/snacks/spiderling(get_turf(src))
@@ -153,10 +155,9 @@
else
..()
-/obj/structure/spider/spiderling/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/spider/spiderling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(user.a_intent != INTENT_HELP)
- user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
user.visible_message("[user] splats [src].", "You splat [src].", "You hear a splat...")
playsound(loc, 'sound/effects/snap.ogg', 25)
@@ -253,8 +254,6 @@
/obj/structure/spider/cocoon/container_resist(mob/living/user)
var/breakout_time = 600
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
to_chat(user, "You struggle against the tight bonds... (This will take about [DisplayTimeText(breakout_time)].)")
visible_message("You see something struggling and writhing in \the [src]!")
if(do_after(user,(breakout_time), target = src))
@@ -262,8 +261,6 @@
return
qdel(src)
-
-
/obj/structure/spider/cocoon/Destroy()
var/turf/T = get_turf(src)
src.visible_message("\The [src] splits open.")
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index d4c8b32a6b..b4c114eb6a 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -11,6 +11,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
name = "item"
icon = 'icons/obj/items_and_weapons.dmi'
blocks_emissive = EMISSIVE_BLOCK_GENERIC
+
+ attack_hand_speed = 0
+ attack_hand_is_action = FALSE
+ attack_hand_unwieldlyness = 0
///icon state name for inhand overlays
var/item_state = null
@@ -58,15 +62,6 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/// How long, in deciseconds, this staggers for, if null it will autocalculate from w_class and force. Unlike total mass this supports 0 and negatives.
var/stagger_force
- /**
- * Set FALSE and then checked at the end of on mob/living/attackby(), set TRUE on living/pre_attacked_by().
- * Should it be FALSE by the end of the item/attack(), that means the item overrode the standard attack behaviour
- * and the user still needs the delay applied. We can't be using return values since that'll stop afterattack() from being triggered.
- */
- var/attack_delay_done = FALSE
- ///next_move click/attack delay of this item.
- var/click_delay = CLICK_CD_MELEE
-
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
var/current_equipped_slot
pass_flags = PASSTABLE
@@ -313,10 +308,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
add_fingerprint(usr)
return ..()
-/obj/item/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/item/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!user)
return
if(anchored)
@@ -473,6 +465,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
usr.UnarmedAttack(src, TRUE)
if(usr.get_active_held_item() == src)
melee_attack_chain(usr, over)
+ usr.FlushCurrentAction()
return TRUE //returning TRUE as a "is this overridden?" flag
if(!Adjacent(usr) || !over.Adjacent(usr))
return // should stop you from dragging through windows
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index dbc66b1899..428efe4abe 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -71,8 +71,6 @@
if(user.incapacitated())
to_chat(user, "You can't get out while you're restrained like this!")
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
to_chat(user, "You claw at the fabric of [src], trying to tear it open...")
to_chat(loc, "Someone starts trying to break free of [src]!")
if(!do_after(user, 200, target = src))
diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm
index 3d444b7eca..a8ff7b9004 100644
--- a/code/game/objects/items/cardboard_cutouts.dm
+++ b/code/game/objects/items/cardboard_cutouts.dm
@@ -6,6 +6,8 @@
icon_state = "cutout_basic"
w_class = WEIGHT_CLASS_BULKY
resistance_flags = FLAMMABLE
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
/// Possible restyles for the cutout, add an entry in change_appearance() if you add to here
var/static/list/possible_appearances
/// If the cutout is pushed over and has to be righted
@@ -43,8 +45,7 @@
"Monkey" = image(icon = src.icon, icon_state = "cutout_monky"),
))
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/cardboard_cutout/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/cardboard_cutout/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.a_intent == INTENT_HELP || pushed_over)
return ..()
user.visible_message("[user] pushes over [src]!", "You push over [src]!")
@@ -81,7 +82,6 @@
else if(I.hitsound)
playsound(loc, I.hitsound, get_clamped_volume(), 1, -1)
- user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
if(I.force)
diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm
index 4dcaed2cf7..592f238cec 100644
--- a/code/game/objects/items/cosmetics.dm
+++ b/code/game/objects/items/cosmetics.dm
@@ -188,4 +188,4 @@
else
..()
else
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/courtroom.dm b/code/game/objects/items/courtroom.dm
index c0e81ed3d5..13b83c9425 100644
--- a/code/game/objects/items/courtroom.dm
+++ b/code/game/objects/items/courtroom.dm
@@ -32,6 +32,6 @@
if(istype(I, /obj/item/gavelhammer))
playsound(loc, 'sound/items/gavel.ogg', 100, 1)
user.visible_message("[user] strikes [src] with [I].")
- user.changeNext_move(CLICK_CD_MELEE)
+ return TRUE
else
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 620fbbf100..a366a2ef88 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -273,7 +273,9 @@
. = ..()
if(!proximity || !check_allowed_items(target))
return
+ draw_on(target, user, proximity, params)
+/obj/item/toy/crayon/proc/draw_on(atom/target, mob/user, proximity, params)
var/static/list/punctuation = list("!","?",".",",","/","+","-","=","%","#","&")
var/cost = 1
@@ -568,9 +570,9 @@
dye_color = DYE_RAINBOW
charges = -1
-/obj/item/toy/crayon/rainbow/afterattack(atom/target, mob/user, proximity, params)
+/obj/item/toy/crayon/rainbow/draw_on(atom/target, mob/user, proximity, params)
paint_color = rgb(rand(0,255), rand(0,255), rand(0,255))
- . = ..()
+ return ..()
/*
* Crayon Box
@@ -693,7 +695,7 @@
. += "It is empty."
. += "Alt-click [src] to [ is_capped ? "take the cap off" : "put the cap on"]."
-/obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user, proximity, params)
+/obj/item/toy/crayon/spraycan/draw_on(atom/target, mob/user, proximity, params)
if(!proximity)
return
@@ -766,7 +768,7 @@
desc = "A metallic container containing shiny synthesised paint."
charges = -1
-/obj/item/toy/crayon/spraycan/borg/afterattack(atom/target,mob/user,proximity, params)
+/obj/item/toy/crayon/spraycan/borg/draw_on(atom/target,mob/user,proximity, params)
var/diff = ..()
if(!iscyborg(user))
to_chat(user, "How did you get this?")
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index e15dc72838..767f8fc395 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -77,8 +77,7 @@
/obj/item/defibrillator/ui_action_click()
toggle_paddles()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/defibrillator/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/defibrillator/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user)
if(slot_flags == ITEM_SLOT_BACK)
if(user.get_item_by_slot(SLOT_BACK) == src)
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 57443de973..a45f26062b 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -132,8 +132,7 @@
/obj/effect/dummy/chameleon/attackby()
master.disrupt()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/effect/dummy/chameleon/attack_hand()
+/obj/effect/dummy/chameleon/on_attack_hand()
master.disrupt()
/obj/effect/dummy/chameleon/attack_animal()
diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm
index 41a12136ef..d8abccb336 100644
--- a/code/game/objects/items/devices/dogborg_sleeper.dm
+++ b/code/game/objects/items/devices/dogborg_sleeper.dm
@@ -116,8 +116,6 @@
if(!hound)
go_out(user)
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
if(user.a_intent == INTENT_HELP)
return
var/voracious = TRUE
diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm
index 03ca110ec8..9ef9d73705 100644
--- a/code/game/objects/items/devices/forcefieldprojector.dm
+++ b/code/game/objects/items/devices/forcefieldprojector.dm
@@ -43,7 +43,7 @@
user.visible_message("[user] projects a forcefield!","You project a forcefield.")
var/obj/structure/projected_forcefield/F = new(T, src)
current_fields += F
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
/obj/item/forcefield_projector/attack_self(mob/user)
if(LAZYLEN(current_fields))
diff --git a/code/game/objects/items/devices/polycircuit.dm b/code/game/objects/items/devices/polycircuit.dm
index a9f7cd46c8..0308f19b5f 100644
--- a/code/game/objects/items/devices/polycircuit.dm
+++ b/code/game/objects/items/devices/polycircuit.dm
@@ -11,7 +11,7 @@
/obj/item/stack/circuit_stack/attack_self(mob/user)// Prevents the crafting menu, and tells you how to use it.
to_chat(user, "You can't use [src] by itself, you'll have to try and remove one of these circuits by hand... carefully.")
-/obj/item/stack/circuit_stack/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/stack/circuit_stack/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
var/mob/living/carbon/human/H = user
if(!user.get_inactive_held_item() == src)
return ..()
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index ec59009794..c3127c246f 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -97,10 +97,7 @@ GLOBAL_LIST_EMPTY(power_sinks)
/obj/item/powersink/attack_ai()
return
-/obj/item/powersink/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/item/powersink/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
switch(mode)
if(DISCONNECTED)
..()
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index cdb8c09527..0cf7ceb55b 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -31,8 +31,7 @@
SSradio.remove_object(src, frequency)
. = ..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/electropack/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/electropack/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscarbon(user))
var/mob/living/carbon/C = user
if(src == C.back)
@@ -162,7 +161,7 @@
materials = list(/datum/material/iron = 5000, /datum/material/glass =2000)
category = list("hacked", "Misc")
-/obj/item/electropack/shockcollar/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/electropack/shockcollar/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.get_item_by_slot(SLOT_NECK))
to_chat(user, "The collar is fastened tight! You'll need help taking this off!")
return
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index ec19c0c05e..8657684ff4 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -86,10 +86,7 @@
/obj/item/radio/intercom/attack_ai(mob/user)
interact(user)
-/obj/item/radio/intercom/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/item/radio/intercom/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
interact(user)
/obj/item/radio/intercom/interact(mob/user)
diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm
index 46b9547e9d..f2a0ea5450 100644
--- a/code/game/objects/items/devices/reverse_bear_trap.dm
+++ b/code/game/objects/items/devices/reverse_bear_trap.dm
@@ -45,7 +45,7 @@
to_chat(loc, "*ding*")
addtimer(CALLBACK(src, .proc/snap), 2)
-/obj/item/reverse_bear_trap/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/reverse_bear_trap/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscarbon(user))
var/mob/living/carbon/C = user
if(C.get_item_by_slot(SLOT_HEAD) == src)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 2011943bfb..fae2833c8a 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -624,54 +624,13 @@ GENETICS SCANNER
if (user.stat || user.eye_blind)
return
- var/turf/location = user.loc
+ //Functionality moved down to proc/scan_turf()
+ var/turf/location = get_turf(user)
if(!istype(location))
return
-
- var/datum/gas_mixture/environment = location.return_air()
-
- var/pressure = environment.return_pressure()
- var/total_moles = environment.total_moles()
-
- to_chat(user, "Results:")
- if(abs(pressure - ONE_ATMOSPHERE) < 10)
- to_chat(user, "Pressure: [round(pressure, 0.01)] kPa")
- else
- to_chat(user, "Pressure: [round(pressure, 0.01)] kPa")
- if(total_moles)
-
- var/o2_concentration = environment.get_moles(/datum/gas/oxygen)/total_moles
- var/n2_concentration = environment.get_moles(/datum/gas/nitrogen)/total_moles
- var/co2_concentration = environment.get_moles(/datum/gas/carbon_dioxide)/total_moles
- var/plasma_concentration = environment.get_moles(/datum/gas/plasma)/total_moles
-
- if(abs(n2_concentration - N2STANDARD) < 20)
- to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)")
- else
- to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)")
-
- if(abs(o2_concentration - O2STANDARD) < 2)
- to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)")
- else
- to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)")
-
- if(co2_concentration > 0.01)
- to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)")
- else
- to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)")
-
- if(plasma_concentration > 0.005)
- to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)")
- else
- to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)")
-
- for(var/id in environment.get_gases())
- if(id in GLOB.hardcoded_gases)
- continue
- var/gas_concentration = environment.get_moles(id)/total_moles
- to_chat(user, "[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)")
- to_chat(user, "Temperature: [round(environment.return_temperature()-T0C, 0.01)] °C ([round(environment.return_temperature(), 0.01)] K)")
-
+
+ scan_turf(user, location)
+
/obj/item/analyzer/AltClick(mob/user) //Barometer output for measuring when the next storm happens
. = ..()
@@ -749,7 +708,7 @@ GENETICS SCANNER
var/total_moles = air_contents.total_moles()
var/pressure = air_contents.return_pressure()
- var/volume = air_contents.return_volume()
+ var/volume = air_contents.return_volume() //could just do mixture.volume... but safety, I guess?
var/temperature = air_contents.return_temperature()
var/cached_scan_results = air_contents.analyzer_results
@@ -776,6 +735,73 @@ GENETICS SCANNER
to_chat(user, "Power of the last fusion reaction: [fusion_power]\n This power indicates it was a [tier]-tier fusion reaction.")
return
+/obj/item/analyzer/proc/scan_turf(mob/user, turf/location)
+
+ var/datum/gas_mixture/environment = location.return_air()
+
+ var/pressure = environment.return_pressure()
+ var/total_moles = environment.total_moles()
+ var/cached_scan_results = environment.analyzer_results
+
+ to_chat(user, "Results:")
+ if(abs(pressure - ONE_ATMOSPHERE) < 10)
+ to_chat(user, "Pressure: [round(pressure, 0.01)] kPa")
+ else
+ to_chat(user, "Pressure: [round(pressure, 0.01)] kPa")
+ if(total_moles)
+
+ var/o2_concentration = environment.get_moles(/datum/gas/oxygen)/total_moles
+ var/n2_concentration = environment.get_moles(/datum/gas/nitrogen)/total_moles
+ var/co2_concentration = environment.get_moles(/datum/gas/carbon_dioxide)/total_moles
+ var/plasma_concentration = environment.get_moles(/datum/gas/plasma)/total_moles
+
+ if(abs(n2_concentration - N2STANDARD) < 20)
+ to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)")
+ else
+ to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)")
+
+ if(abs(o2_concentration - O2STANDARD) < 2)
+ to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)")
+ else
+ to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)")
+
+ if(co2_concentration > 0.01)
+ to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)")
+ else
+ to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)")
+
+ if(plasma_concentration > 0.005)
+ to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)")
+ else
+ to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)")
+
+ for(var/id in environment.get_gases())
+ if(id in GLOB.hardcoded_gases)
+ continue
+ var/gas_concentration = environment.get_moles(id)/total_moles
+ to_chat(user, "[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)")
+ to_chat(user, "Temperature: [round(environment.return_temperature()-T0C, 0.01)] °C ([round(environment.return_temperature(), 0.01)] K)")
+
+ if(cached_scan_results && cached_scan_results["fusion"]) //notify the user if a fusion reaction was detected
+ var/fusion_power = round(cached_scan_results["fusion"], 0.01)
+ var/tier = fusionpower2text(fusion_power)
+ to_chat(user, "Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.")
+ to_chat(user, "Power of the last fusion reaction: [fusion_power]\n This power indicates it was a [tier]-tier fusion reaction.")
+
+/obj/item/analyzer/ranged
+ desc = "A hand-held scanner which uses advanced spectroscopy and infrared readings to analyze gases as a distance. Alt-Click to use the built in barometer function."
+ name = "long-range analyzer"
+ icon = 'icons/obj/device.dmi'
+ icon_state = "ranged_analyzer"
+
+/obj/item/analyzer/ranged/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ . = ..()
+ if(target.tool_act(user, src, tool_behaviour))
+ return
+ // Tool act didn't scan it, so let's get it's turf.
+ var/turf/location = get_turf(target)
+ scan_turf(user, location)
+
//slime scanner
/obj/item/slime_scanner
@@ -966,4 +992,4 @@ GENETICS SCANNER
#undef SCANMODE_CHEMICAL
#undef SCANMODE_WOUND
#undef SCANNER_CONDENSED
-#undef SCANNER_VERBOSE
+#undef SCANNER_VERBOSE
\ No newline at end of file
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 5765ac71f1..cef06bfde8 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -54,8 +54,7 @@
mytape.ruin() //Fires destroy the tape
..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/taperecorder/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/taperecorder/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user)
if(mytape)
if(!user.is_holding(src))
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index ccf9dcd253..c791b7e323 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -79,7 +79,7 @@
if(attached_device)
attached_device.Crossed(AM)
-/obj/item/transfer_valve/attack_hand()//Triggers mousetraps
+/obj/item/transfer_valve/on_attack_hand()//Triggers mousetraps
. = ..()
if(.)
return
diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm
index 837f57ceb5..dbc4c297ca 100644
--- a/code/game/objects/items/eightball.dm
+++ b/code/game/objects/items/eightball.dm
@@ -229,4 +229,4 @@
else
votes[selected_answer] += 1
voted[user.ckey] = selected_answer
- . = TRUE
\ No newline at end of file
+ . = TRUE
diff --git a/code/game/objects/items/electrostaff.dm b/code/game/objects/items/electrostaff.dm
index 8d1fe4ebd1..9750994c87 100644
--- a/code/game/objects/items/electrostaff.dm
+++ b/code/game/objects/items/electrostaff.dm
@@ -15,6 +15,7 @@
attack_verb = list("struck", "beaten", "thwacked", "pulped")
total_mass = 5 //yeah this is a heavy thing, beating people with it while it's off is not going to do you any favors. (to curb stun-kill rampaging without it being on)
block_parry_data = /datum/block_parry_data/electrostaff
+ attack_speed = CLICK_CD_MELEE
var/obj/item/stock_parts/cell/cell = /obj/item/stock_parts/cell/high
var/on = FALSE
var/can_block_projectiles = FALSE //can't block guns
diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm
index 2d9d0b61c2..b1f51f608d 100644
--- a/code/game/objects/items/extinguisher.dm
+++ b/code/game/objects/items/extinguisher.dm
@@ -110,7 +110,7 @@
. += "The safety is [safety ? "on" : "off"]."
if(reagents.total_volume)
- . += "You can loose its screws to empty it."
+ . += "Alt-click to empty it."
/obj/item/extinguisher/proc/AttemptRefill(atom/target, mob/user)
if(istype(target, tanktype) && target.Adjacent(user))
@@ -230,7 +230,7 @@
repetition++
addtimer(CALLBACK(src, /obj/item/extinguisher/proc/move_chair, B, movementdirection, repetition), timer_seconds)
-/obj/item/extinguisher/screwdriver_act(mob/user, obj/item/tool)
+/obj/item/extinguisher/AltClick(mob/user)
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
EmptyExtinguisher(user)
@@ -244,7 +244,7 @@
var/turf/open/theturf = T
theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
- user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] by loosing the release valve's screws.")
+ user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] by using its release valve.")
//firebot assembly
/obj/item/extinguisher/attackby(obj/O, mob/user, params)
diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm
index f293e6579a..515f5715dd 100644
--- a/code/game/objects/items/flamethrower.dm
+++ b/code/game/objects/items/flamethrower.dm
@@ -131,6 +131,7 @@
/obj/item/flamethrower/analyzer_act(mob/living/user, obj/item/I)
if(ptank)
ptank.analyzer_act(user, I)
+ return TRUE
/obj/item/flamethrower/attack_self(mob/user)
diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm
index bd25169fe4..bf9fab5f04 100644
--- a/code/game/objects/items/grenades/flashbang.dm
+++ b/code/game/objects/items/grenades/flashbang.dm
@@ -124,9 +124,11 @@
/obj/item/grenade/primer/attack_self(mob/user)
. = ..()
if(active)
+ if(!user.CheckActionCooldown())
+ return
user.playsound_local(user, 'sound/misc/box_deploy.ogg', 50, TRUE)
rots++
- user.changeNext_move(CLICK_CD_RAPID)
+ user.DelayNextAction(CLICK_CD_RAPID)
/obj/item/grenade/primer/prime(mob/living/lanced_by)
shrapnel_radius = round(rots / rots_per_mag)
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index e3388b12eb..4c9ea06620 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -320,7 +320,7 @@
do_sparks(1, TRUE, src)
qdel(src)
-/obj/item/restraints/legcuffs/beartrap/energy/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/restraints/legcuffs/beartrap/energy/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
Crossed(user) //honk
. = ..()
diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm
index 3ea27c84bb..b3c1f79e94 100644
--- a/code/game/objects/items/implants/implantchair.dm
+++ b/code/game/objects/items/implants/implantchair.dm
@@ -121,8 +121,6 @@
update_icon()
/obj/machinery/implantchair/container_resist(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the door of [src]!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a metallic creaking from [src].")
@@ -191,4 +189,4 @@
brainwash(C, objective)
message_admins("[ADMIN_LOOKUPFLW(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.")
log_game("[key_name(user)] brainwashed [key_name(C)] with objective '[objective]'.")
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm
index 5e102a502e..679491aeb6 100644
--- a/code/game/objects/items/melee/energy.dm
+++ b/code/game/objects/items/melee/energy.dm
@@ -147,6 +147,12 @@
return NONE
return ..()
+/obj/item/melee/transforming/energy/sword/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time)
+ . = ..()
+ if(parry_efficiency >= 80) // perfect parry
+ block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_RETURN_TO_SENDER
+ . |= BLOCK_SHOULD_REDIRECT
+
/obj/item/melee/transforming/energy/sword/cyborg
sword_color = "red"
light_color = "#ff0000"
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 3b312fe047..01d2924a90 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -375,6 +375,7 @@
var/wait_desc = get_wait_description()
if(wait_desc)
to_chat(user, wait_desc)
+ return DISCARD_LAST_ACTION
/obj/item/melee/classic_baton/telescopic
name = "telescopic baton"
@@ -626,7 +627,7 @@
to_chat(user, "[target] doesn't seem to want to get on [src]!")
update_icon()
-/obj/item/melee/roastingstick/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/melee/roastingstick/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
..()
if (held_sausage)
user.put_in_hands(held_sausage)
diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm
index fbdb19bd1c..8c44a15cd4 100644
--- a/code/game/objects/items/melee/transforming.dm
+++ b/code/game/objects/items/melee/transforming.dm
@@ -84,4 +84,4 @@
/obj/item/melee/transforming/proc/clumsy_transform_effect(mob/living/user)
if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
to_chat(user, "You accidentally cut yourself with [src], like a doofus!")
- user.take_bodypart_damage(5,5)
\ No newline at end of file
+ user.take_bodypart_damage(5,5)
diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm
index 3a06c7d7fe..b420bfc002 100644
--- a/code/game/objects/items/mop.dm
+++ b/code/game/objects/items/mop.dm
@@ -58,7 +58,7 @@
if(T)
user.visible_message("[user] cleans \the [T] with [src].", "You clean \the [T] with [src].")
clean(T)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
user.do_attack_animation(T, used_item = src)
if(istype(L))
L.adjustStaminaLossBuffered(stamusage)
@@ -128,4 +128,4 @@
return ..()
/obj/item/mop/advanced/cyborg
- insertable = FALSE
\ No newline at end of file
+ insertable = FALSE
diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
index a60aa02ce1..c6b5a7e224 100644
--- a/code/game/objects/items/pet_carrier.dm
+++ b/code/game/objects/items/pet_carrier.dm
@@ -24,6 +24,7 @@
var/max_occupant_weight = MOB_SIZE_SMALL //This is calculated from the mob sizes of occupants
var/entrance_name = "door" //name of the entrance to the item
var/escape_time = 200 //how long it takes for mobs above small sizes to escape (for small sizes, its randomly 1.5 to 2x this)
+ var/alternate_escape_time = 0 //how long it takes for mobs to escape when the entrance is open
var/load_time = 30 //how long it takes for mobs to be loaded into the pet carrier
var/has_lock_sprites = TRUE //whether to load the lock overlays or not
var/allows_hostiles = FALSE //does the pet carrier allow hostile entities to be held within it?
@@ -106,8 +107,9 @@
if(user == target)
to_chat(user, "Why would you ever do that?")
return
- if(ishostile(target) && (!allows_hostiles || istype(target, /mob/living/simple_animal/hostile/carp/cayenne)) || target.move_resist < MOVE_FORCE_VERY_STRONG) //don't allow goliaths into pet carriers, but let cayenne in!
+ if((ishostile(target) && (!allows_hostiles || !istype(target, /mob/living/simple_animal/hostile/carp/cayenne))) || target.move_resist >= MOVE_FORCE_VERY_STRONG) //don't allow goliaths into pet carriers, but let cayenne in!
to_chat(user, "You have a feeling you shouldn't keep this as a pet.")
+ return
load_occupant(user, target)
/obj/item/pet_carrier/relaymove(mob/living/user, direction)
@@ -128,13 +130,18 @@
/obj/item/pet_carrier/container_resist(mob/living/user)
//don't do the whole resist timer thing if it's open!
if(open)
- loc.visible_message("[user] climbs out of [src]!", \
- "[user] jumps out of [src]!")
- remove_occupant(user)
- return
+ if(alternate_escape_time > 0)
+ loc.visible_message("The [src] begins to shake!")
+ if(do_after(user, alternate_escape_time, target = user))
+ loc.visible_message("[user] jumps out of [src]")
+ remove_occupant(user)
+ return
+ else //instant escape, different message
+ loc.visible_message("[user] climbs out of [src]!", \
+ "[user] jumps out of [src]!")
+ remove_occupant(user)
+ return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
if(user.mob_size <= MOB_SIZE_SMALL)
to_chat(user, "You begin to try escaping the [src] and start fumbling for the lock switch... (This will take some time.)")
to_chat(loc, "You see [user] attempting to unlock the [src]!")
@@ -147,7 +154,7 @@
update_icon()
else
loc.visible_message("[src] starts rattling as something pushes against the [entrance_name]!", null, null, null, user)
- to_chat(user, "You start pushing out of [src]... (This will take about 20 seconds.)")
+ to_chat(user, "You start pushing out of [src]... (This will take about [escape_time/10] seconds.)")
if(!do_after(user, escape_time, target = user) || open || !locked || !(user in occupants))
return
loc.visible_message("[user] shoves out of [src]!", null, null, null, user)
@@ -180,21 +187,22 @@
/obj/item/pet_carrier/proc/load_occupant(mob/living/user, mob/living/target)
if(pet_carrier_full(src))
to_chat(user, "[src] is already carrying too much!")
- return
+ return FALSE
user.visible_message("[user] starts loading [target] into [src].", \
"You start loading [target] into [src]...", null, null, target)
to_chat(target, "[user] starts loading you into [user.p_their()] [name]!")
if(!do_mob(user, target, load_time))
- return
+ return FALSE
if(target in occupants)
- return
+ return FALSE
if(pet_carrier_full(src)) //Run the checks again, just in case
to_chat(user, "[src] is already carrying too much!")
- return
+ return FALSE
user.visible_message("[user] loads [target] into [src]!", \
"You load [target] into [src].", null, null, target)
to_chat(target, "[user] loads you into [user.p_their()] [name]!")
add_occupant(target)
+ return TRUE
/obj/item/pet_carrier/proc/add_occupant(mob/living/occupant)
if(occupant in occupants || !istype(occupant))
@@ -230,7 +238,8 @@
allows_hostiles = TRUE //can fit hostile creatures, with the move resist restrictions in place, this means they still cannot take things like legions/goliaths/etc regardless
has_lock_sprites = FALSE //jar doesn't show the regular lock overlay
custom_materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 600)
- escape_time = 10 //half the time of a bluespace bodybag
+ escape_time = 200 //equal to the time of a bluespace bodybag
+ alternate_escape_time = 100
var/datum/gas_mixture/occupant_gas_supply
/obj/item/pet_carrier/bluespace/update_icon_state()
@@ -271,10 +280,15 @@
REMOVE_TRAIT(occupant, TRAIT_NOBREATH, "bluespace_container_no_breath")
REMOVE_TRAIT(occupant, TRAIT_RESISTHIGHPRESSURE, "bluespace_container_resist_high_pressure")
REMOVE_TRAIT(occupant, TRAIT_RESISTLOWPRESSURE, "bluespace_container_resist_low_pressure")
+ name = initial(name)
/obj/item/pet_carrier/bluespace/return_air()
if(!occupant_gas_supply)
occupant_gas_supply = new
return occupant_gas_supply
+/obj/item/pet_carrier/bluespace/load_occupant(mob/living/user, mob/living/target)
+ if(..())
+ name = "[initial(name)] ([target])"
+
#undef pet_carrier_full
diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm
index 52f4b3462e..2834b3b758 100644
--- a/code/game/objects/items/powerfist.dm
+++ b/code/game/objects/items/powerfist.dm
@@ -14,12 +14,11 @@
w_class = WEIGHT_CLASS_NORMAL
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 40)
resistance_flags = FIRE_PROOF
- click_delay = CLICK_CD_MELEE * 1.5
+ attack_speed = CLICK_CD_MELEE * 1.5
var/fisto_setting = 1
var/gasperfist = 3
var/obj/item/tank/internals/tank = null //Tank used for the gauntlet's piston-ram.
-
/obj/item/melee/powerfist/examine(mob/user)
. = ..()
if(!in_range(user, src))
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 9fbedb33cd..c50dc6e316 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -241,9 +241,9 @@
for(var/obj/item/mop/cyborg/M in R.module.modules)
R.module.remove_module(M, TRUE)
- var/obj/item/mop/advanced/cyborg/A = new /obj/item/mop/advanced/cyborg(R.module)
- R.module.basic_modules += A
- R.module.add_module(A, FALSE, TRUE)
+ var/obj/item/mop/advanced/cyborg/A = new /obj/item/mop/advanced/cyborg(R.module)
+ R.module.basic_modules += A
+ R.module.add_module(A, FALSE, TRUE)
/obj/item/borg/upgrade/amop/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm
index 7fd37053b1..ced0ee3160 100644
--- a/code/game/objects/items/shooting_range.dm
+++ b/code/game/objects/items/shooting_range.dm
@@ -31,10 +31,7 @@
to_chat(user, "You slice off [src]'s uneven chunks of aluminium and scorch marks.")
return TRUE
-/obj/item/target/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/item/target/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(pinnedLoc)
pinnedLoc.removeTarget(user)
diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm
index cf7373b700..67bc28b2ea 100644
--- a/code/game/objects/items/signs.dm
+++ b/code/game/objects/items/signs.dm
@@ -40,4 +40,3 @@
user.visible_message("[user] waves around \the \"[label]\" sign.")
else
user.visible_message("[user] waves around blank sign.")
- user.changeNext_move(CLICK_CD_MELEE)
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm
index c142db6530..3b4be37cee 100644
--- a/code/game/objects/items/stacks/bscrystal.dm
+++ b/code/game/objects/items/stacks/bscrystal.dm
@@ -74,8 +74,7 @@
/obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening
to_chat(user, "You cannot crush the polycrystal in-hand, try breaking one off.")
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/stack/sheet/bluespace_crystal/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/stack/sheet/bluespace_crystal/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.get_inactive_held_item() == src)
if(zero_amount())
return
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index cf70776a16..55ecf49dd8 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -359,7 +359,7 @@
return
. = ..()
-/obj/item/stack/medical/mesh/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/stack/medical/mesh/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!is_open & user.get_inactive_held_item() == src)
to_chat(user, "You need to open [src] first.")
return
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 0383c3f1ee..5f6341ea21 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -184,13 +184,13 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \
new /datum/stack_recipe("trash cart", /obj/structure/closet/crate/trashcart, 5, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("medical crate", /obj/structure/closet/crate/medical, 5, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("freezer crate", /obj/structure/closet/crate/freezer, 8, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("blood bag crate", /obj/structure/closet/crate/freezer/blood, 8, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("surplus limbs crate", /obj/structure/closet/crate/freezer/surplus_limbs, 8, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("blood bag crate", /obj/structure/closet/crate/freezer/blood/fake, 8, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("surplus limbs crate", /obj/structure/closet/crate/freezer/surplus_limbs/fake, 8, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("radiation containment crate", /obj/structure/closet/crate/radiation, 8, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("hydroponics crate", /obj/structure/closet/crate/hydroponics, 5, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("engineering crate", /obj/structure/closet/crate/engineering, 5, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("eletrical crate", /obj/structure/closet/crate/engineering/electrical, 5, time = 50, one_per_turf = 1, on_floor = 1), \
- new /datum/stack_recipe("RCD storage crate", /obj/structure/closet/crate/rcd, 5, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("RCD storage crate", /obj/structure/closet/crate/rcd/fake, 5, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("science crate", /obj/structure/closet/crate/science, 5, time = 50, one_per_turf = 1, on_floor = 1), \
)), \
new /datum/stack_recipe_list("airlock assemblies", list( \
@@ -247,6 +247,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 10),\
new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \
new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\
+ new/datum/stack_recipe("training bokken", /obj/item/melee/bokken, 10, time = 15),\
null, \
new/datum/stack_recipe("wooden chair", /obj/structure/chair/wood/, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("winged wooden chair", /obj/structure/chair/wood/wings, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 5c88951654..3e2bb675fa 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -233,7 +233,7 @@
return
T.PlaceOnTop(R.result_type, flags = CHANGETURF_INHERIT_AIR)
else
- O = new R.result_type(usr.drop_location())
+ O = new R.result_type(get_turf(usr))
if(O)
O.setDir(usr.dir)
log_craft("[O] crafted by [usr] at [loc_name(O.loc)]")
@@ -398,8 +398,7 @@
merge(AM)
. = ..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/stack/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/stack/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.get_inactive_held_item() == src)
if(zero_amount())
return
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 52e8e9193f..7e5dd7e2d8 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -83,7 +83,7 @@
new /obj/item/multitool(src)
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
new /obj/item/extinguisher/mini(src)
- new /obj/item/analyzer(src)
+ new /obj/item/analyzer/ranged(src)
//much roomier now that we've managed to remove two tools
/obj/item/storage/belt/utility/full/PopulateContents()
@@ -446,10 +446,11 @@
/obj/item/storage/belt/durathread
name = "durathread toolbelt"
- desc = "A toolbelt made out of durathread, it seems resistant enough to hold even big tools like an RCD, it also has higher capacity."
+ desc = "A toolbelt made out of durathread, it seems robust enough to hold bigger tools like RCDs or RPDs, with enough pouches to hold more gear than a normal belt."
icon_state = "webbing-durathread"
item_state = "webbing-durathread"
resistance_flags = FIRE_PROOF
+ rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //If normal belts get this, the upgraded version should too
/obj/item/storage/belt/durathread/ComponentInitialize()
. = ..()
@@ -469,7 +470,7 @@
/obj/item/t_scanner,
/obj/item/analyzer,
/obj/item/geiger_counter,
- /obj/item/extinguisher/mini,
+ /obj/item/extinguisher,
/obj/item/radio,
/obj/item/clothing/gloves,
/obj/item/holosign_creator,
@@ -490,7 +491,8 @@
desc = "A belt for holding grenades."
icon_state = "grenadebeltnew"
item_state = "security"
-
+ rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
+
/obj/item/storage/belt/grenade/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm
index 5d5f0eaa24..7532aacbfa 100644
--- a/code/game/objects/items/storage/book.dm
+++ b/code/game/objects/items/storage/book.dm
@@ -104,7 +104,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing)
return 1
-/obj/item/storage/book/bible/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE)
+/obj/item/storage/book/bible/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1, heal_mode = TRUE)
if (!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this!")
@@ -238,11 +238,10 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
var/ownername = H.real_name
desc += "The name [ownername] is written in blood inside the cover."
-/obj/item/storage/book/bible/syndicate/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE)
- if (user.a_intent == INTENT_HELP)
- return ..()
- else
- return ..(M,user,heal_mode = FALSE)
+/obj/item/storage/book/bible/syndicate/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1, heal_mode = TRUE)
+ if(user.a_intent != INTENT_HELP)
+ heal_mode = FALSE //args pass over
+ return ..() // to ..()
/obj/item/storage/book/bible/syndicate/add_blood_DNA(list/blood_dna)
return FALSE
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index 02ae867240..975621ead1 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -726,9 +726,9 @@ obj/item/storage/box/stingbangs
return (BRUTELOSS)
/obj/item/storage/box/hug/attack_self(mob/user)
- ..()
- user.changeNext_move(CLICK_CD_MELEE)
- playsound(loc, "rustle", 50, 1, -5)
+ . = ..()
+ user.DelayNextAction(CLICK_CD_MELEE)
+ playsound(src, "rustle", 50, 1, -5)
user.visible_message("[user] hugs \the [src].","You hug \the [src].")
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"hugbox", /datum/mood_event/hugbox)
@@ -1423,4 +1423,4 @@ obj/item/storage/box/stingbangs
/obj/item/storage/box/strange_seeds_5pack/PopulateContents()
for(var/i in 1 to 5)
- new /obj/item/seeds/random(src)
\ No newline at end of file
+ new /obj/item/seeds/random(src)
diff --git a/code/game/objects/items/storage/dakis.dm b/code/game/objects/items/storage/dakis.dm
index 1939593c8e..29f12df4c4 100644
--- a/code/game/objects/items/storage/dakis.dm
+++ b/code/game/objects/items/storage/dakis.dm
@@ -47,6 +47,6 @@
if(INTENT_HARM)
user.visible_message("[user] punches the [name]!")
playsound(src, 'sound/effects/shieldbash.ogg', 50, 1)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
////////////////////////////
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index 28f77b7676..cde6f5bd5a 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -168,13 +168,19 @@
. += "There's a coupon on the back of the pack! You can tear it off once it's empty."
/obj/item/storage/fancy/cigarettes/AltClick(mob/living/carbon/user)
+ . = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
- var/obj/item/clothing/mask/cigarette/W = locate(/obj/item/clothing/mask/cigarette) in contents
+ var/obj/item/lighter/L = locate() in contents
+ if(L)
+ SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, L, user)
+ user.put_in_hands(L)
+ to_chat(user, "You take \a [L] out of the pack.")
+ return TRUE
+ var/obj/item/clothing/mask/cigarette/W = locate() in contents
if(W && contents.len > 0)
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, user)
user.put_in_hands(W)
- contents -= W
to_chat(user, "You take \a [W] out of the pack.")
else
to_chat(user, "There are no [icon_type]s left in the pack.")
diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm
index 6061feb893..4e6a0b3463 100644
--- a/code/game/objects/items/storage/secure.dm
+++ b/code/game/objects/items/storage/secure.dm
@@ -205,10 +205,7 @@
new /obj/item/paper(src)
new /obj/item/pen(src)
-/obj/item/storage/secure/safe/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/item/storage/secure/safe/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
return attack_self(user)
/obj/item/storage/secure/safe/HoS
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index fa0c9ba693..1a84b85a1a 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -14,6 +14,7 @@
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("beaten")
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
+ attack_speed = CLICK_CD_MELEE
var/stamforce = 35
var/turned_on = FALSE
@@ -144,8 +145,9 @@
return ..()
/obj/item/melee/baton/alt_pre_attack(atom/A, mob/living/user, params)
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
. = common_baton_melee(A, user, TRUE) //return true (attackchain interrupt) if this also returns true. no harm-disarming.
- user.changeNext_move(CLICK_CD_MELEE)
//return TRUE to interrupt attack chain.
/obj/item/melee/baton/proc/common_baton_melee(mob/M, mob/living/user, disarming = FALSE)
@@ -156,6 +158,7 @@
if(IS_STAMCRIT(user)) //CIT CHANGE - makes it impossible to baton in stamina softcrit
to_chat(user, "You're too exhausted to use [src] properly.")
return TRUE
+ user.DelayNextAction()
if(ishuman(M))
var/mob/living/carbon/human/L = M
if(check_martial_counter(L, user))
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index 42e25273a2..2de5860794 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -123,6 +123,7 @@
/obj/item/tank/analyzer_act(mob/living/user, obj/item/I)
atmosanalyzer_scan(air_contents, user, src)
+ return TRUE
/obj/item/tank/deconstruct(disassembled = TRUE)
if(!disassembled)
diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm
index 0a7eefb786..16a91b6358 100644
--- a/code/game/objects/items/tanks/watertank.dm
+++ b/code/game/objects/items/tanks/watertank.dm
@@ -72,7 +72,7 @@
QDEL_NULL(noz)
return ..()
-/obj/item/watertank/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/watertank/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if (user.get_item_by_slot(user.getBackSlot()) == src)
toggle_mister(user)
else
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
index 569e86747e..6159ab7ba0 100644
--- a/code/game/objects/items/tools/crowbar.dm
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -93,6 +93,7 @@
/obj/item/crowbar/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
var/obj/item/wirecutters/power/cutjaws = new /obj/item/wirecutters/power(drop_location())
+ cutjaws.name = name
to_chat(user, "You attach the cutting jaws to [src].")
qdel(src)
user.put_in_active_hand(cutjaws)
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index ac5a02b9fc..53a578a45d 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -117,6 +117,7 @@
/obj/item/wirecutters/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
var/obj/item/crowbar/power/pryjaws = new /obj/item/crowbar/power(drop_location())
+ pryjaws.name = name
to_chat(user, "You attach the pry jaws to [src].")
qdel(src)
user.put_in_active_hand(pryjaws)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 029a02b9f9..dda7e543df 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -574,10 +574,7 @@
else
. = ..()
-/obj/item/toy/prize/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/item/toy/prize/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user)
attack_self(user)
@@ -811,9 +808,8 @@
cards += "Ace of Clubs"
cards += "Ace of Diamonds"
-//ATTACK HAND IGNORING PARENT RETURN VALUE
//ATTACK HAND NOT CALLING PARENT
-/obj/item/toy/cards/deck/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/toy/cards/deck/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
draw_card(user)
/obj/item/toy/cards/deck/proc/draw_card(mob/user)
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index cc9a8747fa..0ab1f1b4fd 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -249,6 +249,121 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
playsound(src, 'sound/weapons/bladeslice.ogg', 50, 1)
return(BRUTELOSS)
+/obj/item/melee/bokken // parrying stick
+ name = "bokken"
+ desc = "A space-Japanese training sword made of wood and shaped like a katana."
+ icon_state = "bokken"
+ item_state = "bokken"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
+ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
+ w_class = WEIGHT_CLASS_BULKY
+ force = 9
+ throwforce = 10
+ damtype = STAMINA
+ attack_verb = list("whacked", "smacked", "struck")
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
+ hitsound = 'sound/weapons/grenadelaunch.ogg' // no good wood thunk sounds
+ var/harm = FALSE // TRUE = brute, FALSE = stam
+ var/reinforced = FALSE
+ var/burnt = FALSE
+ var/burned_in // text you burned in (with a welder)
+ var/quick_parry = FALSE // false = default parry, true = really small parry window
+ item_flags = ITEM_CAN_PARRY
+ block_parry_data = /datum/block_parry_data/bokken
+ bare_wound_bonus = 0
+ wound_bonus = 0
+
+/datum/block_parry_data/bokken // fucked up parry data, emphasizing quicker, shorter parries
+ parry_stamina_cost = 8 // be wise about when you parry, though, else you won't be able to fight enough to make it count
+ parry_time_windup = 0
+ parry_time_active = 10 // small parry window
+ parry_time_spindown = 0
+ // parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK // bokken users can no longer strike while parrying
+ parry_time_perfect = 1.5
+ parry_time_perfect_leeway = 1
+ parry_imperfect_falloff_percent = 7.5
+ parry_efficiency_to_counterattack = 100
+ parry_efficiency_considered_successful = 65 // VERY generous
+ parry_efficiency_perfect = 120
+ parry_efficiency_perfect_override = list(
+ TEXT_ATTACK_TYPE_PROJECTILE = 30,
+ )
+ parry_failed_stagger_duration = 3 SECONDS
+ parry_data = list(PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5) // 7*2.5 = 17.5, 8*2.5 = 20, 9*2.5 = 22.5, 10*2.5 = 25
+
+/datum/block_parry_data/bokken/quick_parry // emphasizing REALLY SHORT PARRIES
+ parry_stamina_cost = 6 // still more costly than most parries, but less than a full bokken parry
+ parry_time_active = 5 // REALLY small parry window
+ parry_time_perfect = 2.5 // however...
+ parry_time_perfect_leeway = 2.5 // the entire time, the parry is perfect
+ parry_failed_stagger_duration = 1 SECONDS
+ parry_failed_clickcd_duration = 1 SECONDS // more forgiving punishments for missed parries
+ // still, don't fucking miss your parries or you're down stamina and staggered to shit
+
+/obj/item/melee/bokken/Initialize()
+ . = ..()
+ AddElement(/datum/element/sword_point)
+
+/obj/item/melee/bokken/attack_self(mob/user)
+ harm = !harm
+ if(harm)
+ force -= 2
+ damtype = BRUTE
+ attack_verb = list("bashed", "smashed", "attacked")
+ bare_wound_bonus = 15 // having your leg smacked by a wooden stick is probably not great for it if it's naked
+ wound_bonus = 0
+ else
+ force += 2
+ damtype = STAMINA
+ attack_verb = list("whacked", "smacked", "struck")
+ bare_wound_bonus = 0
+ wound_bonus = 0
+ to_chat(user, "[src] is now [harm ? "harmful" : "not quite as harmful"].")
+
+/obj/item/melee/bokken/AltClick(mob/user)
+ . = ..()
+ quick_parry = !quick_parry
+ if(quick_parry)
+ block_parry_data = /datum/block_parry_data/bokken/quick_parry
+ else
+ block_parry_data = /datum/block_parry_data/bokken
+ to_chat(user, "[src] is now [quick_parry ? "emphasizing shorter parries, forcing you to riposte or be staggered" : "emphasizing longer parries, with a shorter window to riposte but more forgiving parries"].")
+
+/obj/item/melee/bokken/attackby(obj/item/I, mob/living/user, params)
+ if(istype(I, /obj/item/pen))
+ var/new_name = stripped_input(user, "What do you wish to name [src]?", "New Name", "bokken", 30)
+ if(new_name)
+ name = new_name
+ if(I.tool_behaviour == TOOL_WELDER)
+ var/new_burn = stripped_input(user, "What do you wish to burn into [src]?", "Burnt Inscription","", 140)
+ if(new_burn)
+ burned_in = new_burn
+ if(!burnt)
+ icon_state += "_burnt"
+ item_state += "_burnt"
+ burnt = TRUE
+ update_icon()
+ update_icon_state()
+ if(istype(I, /obj/item/stack/rods))
+ var/obj/item/stack/rods/R = I
+ if(!reinforced)
+ if(R.use(1))
+ force++
+ reinforced = TRUE
+ to_chat(user, "You slide a metal rod into [src]\'s hilt. It feels a little heftier in your hands.")
+ else
+ to_chat(user, "[src] already has a weight slid into the hilt.")
+
+/obj/item/melee/bokken/examine(mob/user)
+ . = ..()
+ if(quick_parry)
+ . += " [src] is gripped in a way to emphasize quicker parries."
+ if(reinforced)
+ . += " There's a metal rod shoved into the base."
+ if(burnt)
+ . += " Burned into the \"blade\" is [burned_in]."
+
/obj/item/wirerod
name = "wired rod"
desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit."
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index 1203c5a1df..14017ffb2d 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -105,15 +105,19 @@
/obj/proc/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) //used by attack_alien, attack_animal, and attack_slime
if(SEND_SIGNAL(src, COMSIG_OBJ_ATTACK_GENERIC, user, damage_amount, damage_type, damage_flag, sound_effect, armor_penetration) & COMPONENT_STOP_GENERIC_ATTACK)
return FALSE
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
user.do_attack_animation(src)
- user.changeNext_move(CLICK_CD_MELEE)
- return take_damage(damage_amount, damage_type, damage_flag, sound_effect, get_dir(src, user), armor_penetration)
+ . = take_damage(damage_amount, damage_type, damage_flag, sound_effect, get_dir(src, user), armor_penetration)
+ user.DelayNextAction()
/obj/attack_alien(mob/living/carbon/alien/humanoid/user)
if(attack_generic(user, 60, BRUTE, "melee", 0))
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
/obj/attack_animal(mob/living/simple_animal/M)
+ if(!M.CheckActionCooldown(CLICK_CD_MELEE))
+ return
if(!M.melee_damage_upper && !M.obj_damage)
M.emote("custom", message = "[M.friendly_verb_continuous] [src].")
return 0
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index cce4955210..39f2d276a1 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -28,12 +28,10 @@
queue_smooth_neighbors(src)
return ..()
-/obj/structure/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
- if(.)
- return
if(structureclimber && structureclimber != user)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
user.do_attack_animation(src)
structureclimber.DefaultCombatKnockdown(40)
structureclimber.visible_message("[structureclimber] has been knocked off [src].", "You're knocked off [src]!", "You see [structureclimber] get knocked off [src].")
diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm
index a6cd8df746..ce11daec54 100644
--- a/code/game/objects/structures/aliens.dm
+++ b/code/game/objects/structures/aliens.dm
@@ -249,7 +249,7 @@
/obj/structure/alien/egg/attack_alien(mob/living/carbon/alien/user)
return attack_hand(user)
-/obj/structure/alien/egg/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/alien/egg/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -269,8 +269,7 @@
return
else
to_chat(user, "It feels slimy.")
- user.changeNext_move(CLICK_CD_MELEE)
-
+ user.DelayNextAction(CLICK_CD_MELEE)
/obj/structure/alien/egg/proc/Grow()
status = GROWN
diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm
index 7ea678cae4..905888c904 100644
--- a/code/game/objects/structures/barsigns.dm
+++ b/code/game/objects/structures/barsigns.dm
@@ -52,10 +52,7 @@
/obj/structure/sign/barsign/attack_ai(mob/user)
return attack_hand(user)
-/obj/structure/sign/barsign/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/sign/barsign/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!allowed(user))
to_chat(user, "Access denied.")
return
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index e45ddf650c..45cac650b8 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -311,10 +311,7 @@ LINEN BINS
/obj/structure/bedsheetbin/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/bedsheetbin/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/bedsheetbin/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.incapacitated())
return
if(amount >= 1)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 4b9251d8ec..043232e9e3 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -37,12 +37,13 @@
var/lock_in_use = FALSE //Someone is doing some stuff with the lock here, better not proceed further
var/eigen_teleport = FALSE //If the closet leads to Mr Tumnus.
var/obj/structure/closet/eigen_target //Where you go to.
-
+ var/should_populate_contents = TRUE
/obj/structure/closet/Initialize(mapload)
. = ..()
update_icon()
- PopulateContents()
+ if(should_populate_contents)
+ PopulateContents()
if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents
addtimer(CALLBACK(src, .proc/take_contents), 0)
if(secure)
@@ -458,10 +459,7 @@
return
container_resist(user)
-/obj/structure/closet/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/closet/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.lying && get_dist(src, user) > 0)
return
@@ -506,8 +504,6 @@
if(opened)
return
if(ismovable(loc))
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
var/atom/movable/AM = loc
AM.relay_container_resist(user, src)
return
@@ -516,8 +512,6 @@
return
//okay, so the closet is either welded or locked... resist!!!
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("[src] begins to shake violently!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear banging from [src].")
diff --git a/code/game/objects/structures/crates_lockers/closets/genpop.dm b/code/game/objects/structures/crates_lockers/closets/genpop.dm
index 04c2f37b0f..7be12a4819 100644
--- a/code/game/objects/structures/crates_lockers/closets/genpop.dm
+++ b/code/game/objects/structures/crates_lockers/closets/genpop.dm
@@ -91,7 +91,7 @@
locked = TRUE
return ..()
-/obj/structure/closet/secure_closet/genpop/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/closet/secure_closet/genpop/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.lying && get_dist(src, user) > 0)
return
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 99bce305f8..ee202f9504 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -41,10 +41,8 @@
if(manifest)
. += "manifest"
-/obj/structure/closet/crate/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/closet/crate/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
- if(.)
- return
if(manifest)
tear_manifest(user)
@@ -144,6 +142,9 @@
desc = "A freezer containing packs of blood."
icon_state = "surgery"
+/obj/structure/closet/crate/freezer/blood/fake
+ should_populate_contents = FALSE
+
/obj/structure/closet/crate/freezer/blood/PopulateContents()
. = ..()
new /obj/item/reagent_containers/blood(src)
@@ -164,6 +165,9 @@
name = "surplus prosthetic limbs"
desc = "A crate containing an assortment of cheap prosthetic limbs."
+/obj/structure/closet/crate/freezer/surplus_limbs/fake
+ should_populate_contents = FALSE
+
/obj/structure/closet/crate/freezer/surplus_limbs/PopulateContents()
. = ..()
new /obj/item/bodypart/l_arm/robot/surplus(src)
@@ -198,6 +202,9 @@
name = "\improper RCD crate"
icon_state = "engi_crate"
+/obj/structure/closet/crate/rcd/fake
+ should_populate_contents = FALSE
+
/obj/structure/closet/crate/rcd/PopulateContents()
..()
for(var/i in 1 to 4)
diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm
index d8c2f7f91c..3cee96e435 100644
--- a/code/game/objects/structures/crates_lockers/crates/large.dm
+++ b/code/game/objects/structures/crates_lockers/crates/large.dm
@@ -8,7 +8,7 @@
delivery_icon = "deliverybox"
integrity_failure = 0 //Makes the crate break when integrity reaches 0, instead of opening and becoming an invisible sprite.
-/obj/structure/closet/crate/large/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/closet/crate/large/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
if(manifest)
tear_manifest(user)
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 4db889b392..f0384ca96a 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -9,6 +9,8 @@
armor = list("melee" = 30, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100)
max_integrity = 200
integrity_failure = 0.25
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
var/obj/item/showpiece = null
var/alert = TRUE
var/open = FALSE
@@ -157,11 +159,7 @@
/obj/structure/displaycase/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/displaycase/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
- user.changeNext_move(CLICK_CD_MELEE)
+/obj/structure/displaycase/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if (showpiece && (broken || open))
to_chat(user, "You deactivate the hover field built into the case.")
log_combat(user, src, "deactivates the hover field of")
diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm
index 5afe97f669..f64397df09 100644
--- a/code/game/objects/structures/divine.dm
+++ b/code/game/objects/structures/divine.dm
@@ -7,7 +7,7 @@
density = FALSE
can_buckle = 1
-/obj/structure/sacrificealtar/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/sacrificealtar/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -30,7 +30,7 @@
var/time_between_uses = 1800
var/last_process = 0
-/obj/structure/healingfountain/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/healingfountain/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 9279bf1d73..7fdec9b3d9 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -19,7 +19,7 @@
new /obj/item/stack/sheet/mineral/wood(drop_location(), 10)
qdel(src)
-/obj/structure/dresser/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/dresser/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(. || !ishuman(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index a279070e69..84926ccfb0 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -69,10 +69,7 @@
return ..()
-/obj/structure/extinguisher_cabinet/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/extinguisher_cabinet/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscyborg(user) || isalien(user))
return
if(stored_extinguisher)
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index eaa6e574cd..b654f4f5c0 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -41,7 +41,7 @@
new /obj/structure/falsewall/brass(loc)
qdel(src)
-/obj/structure/falsewall/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/falsewall/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(opening)
return
. = ..()
@@ -180,7 +180,7 @@
radiate()
return ..()
-/obj/structure/falsewall/uranium/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/falsewall/uranium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
radiate()
. = ..()
diff --git a/code/game/objects/structures/femur_breaker.dm b/code/game/objects/structures/femur_breaker.dm
index 1fa21d119e..2ac56ec4fb 100644
--- a/code/game/objects/structures/femur_breaker.dm
+++ b/code/game/objects/structures/femur_breaker.dm
@@ -32,7 +32,7 @@
if (LAZYLEN(buckled_mobs))
. += "Someone appears to be strapped in. You can help them unbuckle, or activate the femur breaker."
-/obj/structure/femur_breaker/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/femur_breaker/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
// Currently being used
diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm
index 5803fb1306..f90161f587 100644
--- a/code/game/objects/structures/fence.dm
+++ b/code/game/objects/structures/fence.dm
@@ -120,7 +120,7 @@
open = TRUE
density = TRUE
-/obj/structure/fence/door/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/fence/door/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(can_open(user))
toggle(user)
diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm
index de88372b1e..412730910f 100644
--- a/code/game/objects/structures/fireaxe.dm
+++ b/code/game/objects/structures/fireaxe.dm
@@ -105,10 +105,7 @@
fireaxe = null
qdel(src)
-/obj/structure/fireaxecabinet/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/fireaxecabinet/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(open || broken)
if(fireaxe)
user.put_in_hands(fireaxe)
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 6d72bb58b2..b587e57c3a 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -65,7 +65,7 @@
var/gift_type = /obj/item/a_gift/anything
var/list/ckeys_that_took = list()
-/obj/structure/flora/tree/pine/xmas/presents/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/flora/tree/pine/xmas/presents/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm
index 1dcda6eb50..bd7ddb36d5 100644
--- a/code/game/objects/structures/fluff.dm
+++ b/code/game/objects/structures/fluff.dm
@@ -110,7 +110,7 @@
desc = "Space Jesus is my copilot."
icon_state = "driverseat"
-/obj/structure/fluff/bus/passable/seat/driver/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/fluff/bus/passable/seat/driver/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
playsound(src, 'sound/items/carhorn.ogg', 50, 1)
. = ..()
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 03bcdde57c..4d500837d9 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -186,10 +186,7 @@
else
new_spawn.mind.assigned_role = "Free Golem"
-/obj/effect/mob_spawn/human/golem/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/effect/mob_spawn/human/golem/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(isgolem(user) && can_transfer)
var/transfer_choice = alert("Transfer your soul to [src]? (Warning, your old body will die!)",,"Yes","No")
if(transfer_choice != "Yes" || QDELETED(src) || uses <= 0 || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERY, NO_TK))
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index efd1b486d0..36e4f825da 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -10,6 +10,8 @@
layer = BELOW_OBJ_LAYER
armor = list("melee" = 50, "bullet" = 70, "laser" = 70, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0)
max_integrity = 50
+ attack_hand_is_action = TRUE
+ attack_hand_speed = 8
integrity_failure = 0.4
var/rods_type = /obj/item/stack/rods
var/rods_amount = 2
@@ -99,11 +101,10 @@
..(user, 1)
return TRUE
-/obj/structure/grille/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/grille/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
- user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src, ATTACK_EFFECT_KICK)
user.visible_message("[user] hits [src].", null, null, COMBAT_MESSAGE_RANGE)
log_combat(user, src, "hit")
@@ -111,8 +112,9 @@
take_damage(rand(5,10), BRUTE, "melee", 1)
/obj/structure/grille/attack_alien(mob/living/user)
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
user.do_attack_animation(src)
- user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] mangles [src].", null, null, COMBAT_MESSAGE_RANGE)
if(!shock(user, 70))
take_damage(20, BRUTE, "melee", 1)
@@ -134,7 +136,7 @@
. = . || (mover.pass_flags & PASSGRILLE)
/obj/structure/grille/attackby(obj/item/W, mob/user, params)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
add_fingerprint(user)
if(istype(W, /obj/item/wirecutters))
if(!shock(user, 100))
diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm
index acec52a583..4773c07657 100644
--- a/code/game/objects/structures/guillotine.dm
+++ b/code/game/objects/structures/guillotine.dm
@@ -51,7 +51,7 @@
if (LAZYLEN(buckled_mobs))
. += "Someone appears to be strapped in. You can help them out, or you can harm them by activating the guillotine."
-/obj/structure/guillotine/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/guillotine/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
// Currently being used by something
diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm
index 1cab600fb1..e7ff9d4abf 100644
--- a/code/game/objects/structures/guncase.dm
+++ b/code/game/objects/structures/guncase.dm
@@ -53,10 +53,7 @@
else
return ..()
-/obj/structure/guncase/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/guncase/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscyborg(user) || isalien(user))
return
if(contents.len && open)
diff --git a/code/game/objects/structures/headpike.dm b/code/game/objects/structures/headpike.dm
index 7a67387a8e..6aed11701d 100644
--- a/code/game/objects/structures/headpike.dm
+++ b/code/game/objects/structures/headpike.dm
@@ -37,10 +37,7 @@
MA.pixel_y = 12
. += H
-/obj/structure/headpike/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/headpike/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
to_chat(user, "You take down [src].")
if(victim)
victim.forceMove(drop_location())
diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm
index 844c2ff8fd..dc5355e9d8 100644
--- a/code/game/objects/structures/holosign.dm
+++ b/code/game/objects/structures/holosign.dm
@@ -25,12 +25,12 @@
projector = null
return ..()
-/obj/structure/holosign/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/holosign/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
take_damage(5 , BRUTE, "melee", 1)
/obj/structure/holosign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
@@ -162,7 +162,7 @@
return TRUE //nice or benign diseases!
return TRUE
-/obj/structure/holosign/barrier/medical/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/holosign/barrier/medical/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(CanPass(user) && user.a_intent == INTENT_HELP)
force_allaccess = !force_allaccess
to_chat(user, "You [force_allaccess ? "deactivate" : "activate"] the biometric scanners.") //warning spans because you can make the station sick!
@@ -182,7 +182,7 @@
/obj/structure/holosign/barrier/cyborg/hacked/proc/cooldown()
shockcd = FALSE
-/obj/structure/holosign/barrier/cyborg/hacked/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/holosign/barrier/cyborg/hacked/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 72487ddc16..10a9f2afd4 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -91,10 +91,7 @@
else
return ..()
-/obj/structure/janitorialcart/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/janitorialcart/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
var/list/items = list()
if(mybag)
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index 5706f79192..a23dd3a21e 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -60,8 +60,7 @@
deconstruct(TRUE)
return TRUE
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/kitchenspike/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/kitchenspike/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(VIABLE_MOB_CHECK(user.pulling) && user.a_intent == INTENT_GRAB && !has_buckled_mobs())
var/mob/living/L = user.pulling
if(HAS_TRAIT(user, TRAIT_PACIFISM) && L.stat != DEAD)
diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm
index 6037183cc9..e844461952 100644
--- a/code/game/objects/structures/ladders.dm
+++ b/code/game/objects/structures/ladders.dm
@@ -122,10 +122,7 @@
return FALSE
return TRUE
-/obj/structure/ladder/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/ladder/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
use(user)
/obj/structure/ladder/attack_paw(mob/user)
diff --git a/code/game/objects/structures/life_candle.dm b/code/game/objects/structures/life_candle.dm
index 5dc0bcdab5..52986a44d7 100644
--- a/code/game/objects/structures/life_candle.dm
+++ b/code/game/objects/structures/life_candle.dm
@@ -24,10 +24,7 @@
var/respawn_time = 50
var/respawn_sound = 'sound/magic/staff_animation.ogg'
-/obj/structure/life_candle/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/life_candle/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!user.mind)
return
if(user.mind in linked_minds)
diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm
index 79489e4ae6..e8fbafa42b 100644
--- a/code/game/objects/structures/manned_turret.dm
+++ b/code/game/objects/structures/manned_turret.dm
@@ -198,10 +198,6 @@
/obj/item/gun_control/CanItemAutoclick()
return TRUE
-/obj/item/gun_control/attack_obj(obj/O, mob/living/user)
- user.changeNext_move(CLICK_CD_MELEE)
- O.attacked_by(src, user)
-
/obj/item/gun_control/attack(mob/living/M, mob/living/user)
M.lastattacker = user.real_name
M.lastattackerckey = user.ckey
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index cca41b4e11..b2f1de8750 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -50,10 +50,7 @@
/obj/structure/mineral_door/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/mineral_door/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/mineral_door/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
return TryToSwitchState(user)
/obj/structure/mineral_door/CanPass(atom/movable/mover, turf/target)
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index b1829054ce..237cfdbf0b 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -15,10 +15,7 @@
if(icon_state == "mirror_broke" && !broken)
obj_break(null, mapload)
-/obj/structure/mirror/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/mirror/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(broken || !Adjacent(user))
return
@@ -118,10 +115,7 @@
choosable_races += S.id
..()
-/obj/structure/mirror/magic/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/mirror/magic/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!ishuman(user))
return
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 9639ffae51..82ca59161c 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -22,7 +22,8 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
anchored = TRUE
max_integrity = 400
- var/obj/structure/tray/connected = null
+ var/obj/structure/tray/connected
+ var/starting_tray
var/locked = FALSE
dir = SOUTH
var/message_cooldown
@@ -30,6 +31,9 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
/obj/structure/bodycontainer/Initialize()
. = ..()
+ if(starting_tray)
+ connected = new starting_tray(src)
+ connected.connected = src
GLOB.bodycontainers += src
recursive_organ_check(src)
@@ -37,8 +41,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
GLOB.bodycontainers -= src
open()
if(connected)
- qdel(connected)
- connected = null
+ QDEL_NULL(connected)
return ..()
/obj/structure/bodycontainer/on_log(login)
@@ -58,10 +61,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
/obj/structure/bodycontainer/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/bodycontainer/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/bodycontainer/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(locked)
to_chat(user, "It's locked.")
return
@@ -106,8 +106,6 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
if(!locked)
open()
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message(null, \
"You lean on the back of [src] and start pushing the tray open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a metallic creaking from [src].")
@@ -150,15 +148,11 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
desc = "Used to keep bodies in until someone fetches them. Now includes a high-tech alert system."
icon_state = "morgue1"
dir = EAST
+ starting_tray = /obj/structure/tray/m_tray
var/beeper = TRUE
var/beep_cooldown = 50
var/next_beep = 0
-/obj/structure/bodycontainer/morgue/New()
- connected = new/obj/structure/tray/m_tray(src)
- connected.connected = src
- ..()
-
/obj/structure/bodycontainer/morgue/examine(mob/user)
. = ..()
. += "The speaker is [beeper ? "enabled" : "disabled"]. Alt-click to toggle it."
@@ -208,6 +202,7 @@ GLOBAL_LIST_EMPTY(crematoriums)
desc = "A human incinerator. Works well on barbecue nights."
icon_state = "crema1"
dir = SOUTH
+ starting_tray = /obj/structure/tray/c_tray
var/id = 1
/obj/structure/bodycontainer/crematorium/attack_robot(mob/user) //Borgs can't use crematoriums without help
@@ -218,17 +213,9 @@ GLOBAL_LIST_EMPTY(crematoriums)
GLOB.crematoriums.Remove(src)
return ..()
-/obj/structure/bodycontainer/crematorium/New()
- connected = new/obj/structure/tray/c_tray(src)
- connected.connected = src
-
- GLOB.crematoriums.Add(src)
- ..()
-
/obj/structure/bodycontainer/crematorium/Initialize()
. = ..()
- connected = new /obj/structure/tray/c_tray(src)
- connected.connected = src
+ GLOB.crematoriums.Add(src)
/obj/structure/bodycontainer/crematorium/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
id = "[idnum][id]"
@@ -330,10 +317,7 @@ GLOBAL_LIST_EMPTY(crematoriums)
/obj/structure/tray/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/tray/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/tray/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if (src.connected)
connected.close()
add_fingerprint(user)
diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm
index 3a415b84a9..1b3093e4e7 100644
--- a/code/game/objects/structures/spirit_board.dm
+++ b/code/game/objects/structures/spirit_board.dm
@@ -14,10 +14,7 @@
desc = "[initial(desc)] The planchette is sitting at \"[planchette]\"."
return ..()
-/obj/structure/spirit_board/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/spirit_board/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
spirit_board_pick_letter(user)
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 1d7ba1d993..f8b54d04b6 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -74,7 +74,7 @@
radiate()
..()
-/obj/structure/statue/uranium/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/statue/uranium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
radiate()
. = ..()
@@ -240,7 +240,7 @@
honk()
return ..()
-/obj/structure/statue/bananium/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/statue/bananium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
honk()
. = ..()
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 1b7eb25bb8..a553e63b0f 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -23,6 +23,8 @@
climbable = TRUE
obj_flags = CAN_BE_HIT|SHOVABLE_ONTO
pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.")
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
var/frame = /obj/structure/table_frame
var/framestack = /obj/item/stack/rods
var/buildstack = /obj/item/stack/sheet/metal
@@ -60,7 +62,7 @@
/obj/structure/table/attack_paw(mob/user)
return attack_hand(user)
-/obj/structure/table/attack_hand(mob/living/user)
+/obj/structure/table/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(Adjacent(user) && user.pulling)
if(isliving(user.pulling))
var/mob/living/pushed_mob = user.pulling
@@ -210,8 +212,10 @@
return
/obj/structure/table/alt_attack_hand(mob/user)
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
+ user.DelayNextAction()
if(user && Adjacent(user) && !user.incapacitated())
- user.changeNext_move(CLICK_CD_MELEE*0.5)
if(istype(user) && user.a_intent == INTENT_HARM)
user.visible_message("[user] slams [user.p_their()] palms down on [src].", "You slam your palms down on [src].")
playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, 1)
@@ -654,6 +658,8 @@
anchored = TRUE
pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.
max_integrity = 20
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
/obj/structure/rack/examine(mob/user)
. = ..()
@@ -695,13 +701,12 @@
/obj/structure/rack/attack_paw(mob/living/user)
attack_hand(user)
-/obj/structure/rack/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/rack/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
if(CHECK_MULTIPLE_BITFIELDS(user.mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) || user.get_num_legs() < 2)
return
- user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src, ATTACK_EFFECT_KICK)
user.visible_message("[user] kicks [src].", null, null, COMBAT_MESSAGE_RANGE)
take_damage(rand(4,8), BRUTE, "melee", 1)
diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm
index a08d5c95c1..c5f3a089f7 100644
--- a/code/game/objects/structures/target_stake.dm
+++ b/code/game/objects/structures/target_stake.dm
@@ -48,10 +48,7 @@
handle_density()
to_chat(user, "You slide the target into the stake.")
-/obj/structure/target_stake/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/target_stake/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(pinned_target)
removeTarget(user)
diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm
index 7f597857d9..3a5eb135f4 100644
--- a/code/game/objects/structures/transit_tubes/station.dm
+++ b/code/game/objects/structures/transit_tubes/station.dm
@@ -58,10 +58,7 @@
qdel(R)
-/obj/structure/transit_tube/station/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/transit_tube/station/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!pod_moving)
if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling))
if(open_status == STATION_TUBE_OPEN)
diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
index 36539ae1e4..cf68341b2c 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
@@ -69,8 +69,6 @@
empty_pod()
return
if(!moving)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
to_chat(user, "You start trying to escape from the pod...")
if(do_after(user, 600, target = src))
to_chat(user, "You manage to open the pod.")
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 3dacd49fc9..c52249686a 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -13,6 +13,8 @@
var/mob/living/swirlie = null //the mob being given a swirlie
var/buildstacktype = /obj/item/stack/sheet/metal //they're metal now, shut up
var/buildstackamount = 1
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
/obj/structure/toilet/Initialize()
. = ..()
@@ -26,18 +28,16 @@
AM.forceMove(loc)
return ..()
-/obj/structure/toilet/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/toilet/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
if(swirlie)
- user.changeNext_move(CLICK_CD_MELEE)
playsound(src.loc, "swing_hit", 25, 1)
swirlie.visible_message("[user] slams the toilet seat onto [swirlie]'s head!", "[user] slams the toilet seat onto your head!", "You hear reverberating porcelain.")
swirlie.adjustBruteLoss(5)
else if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling))
- user.changeNext_move(CLICK_CD_MELEE)
var/mob/living/GM = user.pulling
if(user.grab_state >= GRAB_AGGRESSIVE)
if(GM.loc != get_turf(src))
@@ -167,6 +167,8 @@
icon_state = "urinal"
density = FALSE
anchored = TRUE
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
var/exposed = 0 // can you currently put an item inside
var/obj/item/hiddenitem = null // what's in the urinal
@@ -174,17 +176,13 @@
..()
hiddenitem = new /obj/item/reagent_containers/food/urinalcake
-/obj/structure/urinal/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/urinal/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling))
var/mob/living/GM = user.pulling
if(user.grab_state >= GRAB_AGGRESSIVE)
if(GM.loc != get_turf(src))
to_chat(user, "[GM.name] needs to be on [src].")
return
- user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] slams [GM] into [src]!", "You slam [GM] into [src]!")
GM.adjustBruteLoss(8)
else
@@ -492,7 +490,7 @@
var/buildstacktype = /obj/item/stack/sheet/metal
var/buildstackamount = 1
-/obj/structure/sink/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/sink/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -707,8 +705,7 @@
icon_state = "puddle"
resistance_flags = UNACIDABLE
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/sink/puddle/attack_hand(mob/M)
+/obj/structure/sink/puddle/on_attack_hand(mob/M)
icon_state = "puddle-splash"
. = ..()
icon_state = "puddle"
@@ -784,10 +781,7 @@
return TRUE
-/obj/structure/curtain/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/curtain/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
playsound(loc, 'sound/effects/curtain.ogg', 50, 1)
toggle()
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 38655df39e..6aae4955f1 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -40,6 +40,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
rad_flags = RAD_PROTECT_CONTENTS
flags_ricochet = RICOCHET_HARD
ricochet_chance_mod = 0.4
+ attack_hand_speed = CLICK_CD_MELEE
+ attack_hand_is_action = TRUE
/// Electrochromatic status
var/electrochromatic_status = NOT_ELECTROCHROMATIC
@@ -157,7 +159,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
return 1
/obj/structure/window/attack_tk(mob/user)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
user.visible_message("Something knocks on [src].")
add_fingerprint(user)
playsound(src, 'sound/effects/Glassknock.ogg', 50, 1)
@@ -167,18 +169,15 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
return 1
. = ..()
-/obj/structure/window/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/window/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!can_be_reached(user))
return
- user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] knocks on [src].")
add_fingerprint(user)
playsound(src, 'sound/effects/Glassknock.ogg', 50, 1)
/obj/structure/window/attack_paw(mob/user)
+ user.DelayNextAction()
return attack_hand(user)
/obj/structure/window/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) //used by attack_alien, attack_animal, and attack_slime
@@ -836,13 +835,9 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
for (var/i in 1 to rand(1,4))
. += new /obj/item/paper/natural(location)
-/obj/structure/window/paperframe/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/window/paperframe/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
if(user.a_intent != INTENT_HARM)
- user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] knocks on [src].")
playsound(src, "pageturn", 50, 1)
else
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index bdca384bd0..758f824727 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -162,7 +162,7 @@
return 0
/turf/open/floor/crowbar_act(mob/living/user, obj/item/I)
- return intact ? pry_tile(I, user) : FALSE
+ return intact ? FORCE_BOOLEAN(pry_tile(I, user)) : FALSE
/turf/open/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
if(T.turf_type == type)
diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm
index 4f7aa9e492..4bca25f96c 100644
--- a/code/game/turfs/simulated/floor/light_floor.dm
+++ b/code/game/turfs/simulated/floor/light_floor.dm
@@ -52,10 +52,7 @@
set_light(0)
return ..()
-/turf/open/floor/light/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/turf/open/floor/light/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!can_modify_colour)
return
if(!on)
diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm
index 9a227d2594..8e0230a2b0 100644
--- a/code/game/turfs/simulated/floor/mineral_floor.dm
+++ b/code/game/turfs/simulated/floor/mineral_floor.dm
@@ -149,7 +149,7 @@
if(!.)
honk()
-/turf/open/floor/mineral/bananium/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/turf/open/floor/mineral/bananium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
.=..()
if(!.)
honk()
@@ -202,7 +202,7 @@
if(!.)
radiate()
-/turf/open/floor/mineral/uranium/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/turf/open/floor/mineral/uranium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
.=..()
if(!.)
radiate()
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index f26a4b827a..ac80bddd00 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -124,7 +124,7 @@
ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
else
playsound(src, 'sound/weapons/tap.ogg', 100, TRUE) //The attack sound is muffled by the foam itself
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
user.do_attack_animation(src)
if(prob(I.force * 20 - 25))
user.visible_message("[user] smashes through [src]!", \
diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm
index b050d8fb89..03045674e4 100644
--- a/code/game/turfs/simulated/floor/reinf_floor.dm
+++ b/code/game/turfs/simulated/floor/reinf_floor.dm
@@ -89,10 +89,7 @@
/turf/open/floor/engine/attack_paw(mob/user)
return attack_hand(user)
-/turf/open/floor/engine/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/turf/open/floor/engine/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
user.Move_Pulled(src)
//air filled floors; used in atmos pressure chambers
diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm
index c8afe628db..4466511acd 100644
--- a/code/game/turfs/simulated/wall/mineral_walls.dm
+++ b/code/game/turfs/simulated/wall/mineral_walls.dm
@@ -72,7 +72,7 @@
return
return
-/turf/closed/wall/mineral/uranium/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/turf/closed/wall/mineral/uranium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
radiate()
. = ..()
diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm
index a1d2c1757c..6b41f41763 100644
--- a/code/game/turfs/simulated/wall/reinf_walls.dm
+++ b/code/game/turfs/simulated/wall/reinf_walls.dm
@@ -36,7 +36,8 @@
new /obj/item/stack/sheet/metal(src, 2)
/turf/closed/wall/r_wall/attack_animal(mob/living/simple_animal/M)
- M.changeNext_move(CLICK_CD_MELEE)
+ if(!M.CheckActionCooldown())
+ return
M.do_attack_animation(src)
if(!M.environment_smash)
return
@@ -46,6 +47,7 @@
else
playsound(src, 'sound/effects/bang.ogg', 50, 1)
to_chat(M, "This wall is far too strong for you to destroy.")
+ M.DelayNextAction()
/turf/closed/wall/r_wall/try_destroy(obj/item/I, mob/user, turf/T)
if(istype(I, /obj/item/pickaxe/drill/jackhammer))
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 8661682424..0623f2b9d2 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -9,6 +9,8 @@
thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT
heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall
+ attack_hand_speed = 8
+ attack_hand_is_action = TRUE
baseturfs = /turf/open/floor/plating
@@ -113,12 +115,12 @@
return FALSE
/turf/closed/wall/attack_paw(mob/living/user)
- user.changeNext_move(CLICK_CD_MELEE)
return attack_hand(user)
-
/turf/closed/wall/attack_animal(mob/living/simple_animal/M)
- M.changeNext_move(CLICK_CD_MELEE)
+ if(!M.CheckActionCooldown(CLICK_CD_MELEE))
+ return
+ M.DelayNextAction()
M.do_attack_animation(src)
if((M.environment_smash & ENVIRONMENT_SMASH_WALLS) || (M.environment_smash & ENVIRONMENT_SMASH_RWALLS))
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
@@ -164,17 +166,14 @@
return
smasher.break_an_arm(arm)
-/turf/closed/wall/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
- user.changeNext_move(CLICK_CD_MELEE)
+/turf/closed/wall/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
to_chat(user, "You push the wall but nothing happens!")
playsound(src, 'sound/weapons/genhit.ogg', 25, 1)
add_fingerprint(user)
/turf/closed/wall/attackby(obj/item/W, mob/user, params)
- user.changeNext_move(CLICK_CD_MELEE)
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
if (!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this!")
return
@@ -183,6 +182,7 @@
if(!isturf(user.loc))
return //can't do this stuff whilst inside objects and such
+ user.DelayNextAction()
add_fingerprint(user)
var/turf/T = user.loc //get user's location for delay checks
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 02c12a9744..55d945535d 100755
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -122,10 +122,7 @@
requires_activation = FALSE
..()
-/turf/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/turf/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
user.Move_Pulled(src)
/turf/proc/multiz_turf_del(turf/T, dir)
diff --git a/code/modules/NTNet/relays.dm b/code/modules/NTNet/relays.dm
index 2101a72960..c64e2332cc 100644
--- a/code/modules/NTNet/relays.dm
+++ b/code/modules/NTNet/relays.dm
@@ -118,4 +118,4 @@
D.target = null
D.error = "Connection to quantum relay severed"
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index b3bea2201c..6f8e9e703f 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -22,37 +22,6 @@
show_air_status_to(target, usr)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Air Status") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/fix_next_move()
- set category = "Debug"
- set name = "Unfreeze Everyone"
- var/largest_move_time = 0
- var/largest_click_time = 0
- var/mob/largest_move_mob = null
- var/mob/largest_click_mob = null
- for(var/mob/M in world)
- if(!M.client)
- continue
- if(M.next_move >= largest_move_time)
- largest_move_mob = M
- if(M.next_move > world.time)
- largest_move_time = M.next_move - world.time
- else
- largest_move_time = 1
- if(M.next_click >= largest_click_time)
- largest_click_mob = M
- if(M.next_click > world.time)
- largest_click_time = M.next_click - world.time
- else
- largest_click_time = 0
- log_admin("DEBUG: [key_name(M)] next_move = [M.next_move] lastDblClick = [M.next_click] world.time = [world.time]")
- M.next_move = 1
- M.next_click = 0
- message_admins("[ADMIN_LOOKUPFLW(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [DisplayTimeText(largest_move_time)]!")
- message_admins("[ADMIN_LOOKUPFLW(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [DisplayTimeText(largest_click_time)]!")
- message_admins("world.time = [world.time]")
- SSblackbox.record_feedback("tally", "admin_verb", 1, "Unfreeze Everyone") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- return
-
/client/proc/radio_report()
set category = "Debug"
set name = "Radio report"
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index ed8f2e8f93..5997558c60 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -1280,13 +1280,13 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
ADMIN_PUNISHMENT_SUPPLYPOD,
ADMIN_PUNISHMENT_MAZING,
ADMIN_PUNISHMENT_ROD,
+ ADMIN_PUNISHMENT_SHOES,
ADMIN_PUNISHMENT_PICKLE,
ADMIN_PUNISHMENT_FRY,
ADMIN_PUNISHMENT_CRACK,
ADMIN_PUNISHMENT_BLEED,
ADMIN_PUNISHMENT_SCARIFY)
-
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list
if(QDELETED(target) || !punishment)
@@ -1441,6 +1441,17 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
if(ADMIN_PUNISHMENT_FRY)
target.fry()
+ if(ADMIN_PUNISHMENT_SHOES)
+ if(!iscarbon(target))
+ to_chat(usr,"This must be used on a carbon mob.")
+ return
+ var/mob/living/carbon/C = target
+ var/obj/item/clothing/shoes/sick_kicks = C.shoes
+ if(!sick_kicks?.can_be_tied)
+ to_chat(usr,"[C] does not have knottable shoes!")
+ return
+ sick_kicks.adjust_laces(SHOES_KNOTTED)
+
punish_log(target, punishment)
/**
diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm
index 9c9715ee43..6a981b36dc 100644
--- a/code/modules/antagonists/abductor/machinery/console.dm
+++ b/code/modules/antagonists/abductor/machinery/console.dm
@@ -24,10 +24,7 @@
var/obj/machinery/computer/camera_advanced/abductor/camera
var/list/datum/icon_snapshot/disguises = list()
-/obj/machinery/abductor/console/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/abductor/console/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) && !HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING))
to_chat(user, "You start mashing alien buttons at random!")
if(do_after(user,100, target = src))
diff --git a/code/modules/antagonists/abductor/machinery/dispenser.dm b/code/modules/antagonists/abductor/machinery/dispenser.dm
index ef423b6379..90dcf6626f 100644
--- a/code/modules/antagonists/abductor/machinery/dispenser.dm
+++ b/code/modules/antagonists/abductor/machinery/dispenser.dm
@@ -22,10 +22,7 @@
gland_colors[i] = random_color()
amounts[i] = rand(1,5)
-/obj/machinery/abductor/gland_dispenser/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/abductor/gland_dispenser/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!isabductor(user))
return
user.set_machine(src)
diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm
index b94912b635..bc58cf45f0 100644
--- a/code/modules/antagonists/abductor/machinery/experiment.dm
+++ b/code/modules/antagonists/abductor/machinery/experiment.dm
@@ -21,10 +21,7 @@
return
close_machine(target)
-/obj/machinery/abductor/experiment/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/abductor/experiment/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
experimentUI(user)
@@ -47,8 +44,6 @@
to_chat(user, "[src]'s door won't budge!")
/obj/machinery/abductor/experiment/container_resist(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the door of [src]!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a metallic creaking from [src].")
diff --git a/code/modules/antagonists/blob/blob/theblob.dm b/code/modules/antagonists/blob/blob/theblob.dm
index 6a73dc579b..ed85726a4a 100644
--- a/code/modules/antagonists/blob/blob/theblob.dm
+++ b/code/modules/antagonists/blob/blob/theblob.dm
@@ -225,7 +225,7 @@
/obj/structure/blob/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/analyzer))
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
to_chat(user, "The analyzer beeps once, then reports:
")
SEND_SOUND(user, sound('sound/machines/ping.ogg'))
if(overmind)
diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm
index b32237b7fb..536c07cd62 100644
--- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm
+++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm
@@ -217,7 +217,7 @@
return FALSE
return ..()
-/obj/structure/bloodsucker/vassalrack/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/bloodsucker/vassalrack/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
//. = ..() // Taken from sacrificial altar in divine.dm
//if(.)
// return
@@ -469,7 +469,7 @@
. += {"This is a magical candle which drains at the sanity of the fools who havent yet accepted your master, as long as it is active.\n
You can turn it on and off by clicking on it while you are next to it"} */
-/obj/structure/bloodsucker/candelabrum/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/bloodsucker/candelabrum/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
var/datum/antagonist/vassal/T = user.mind.has_antag_datum(ANTAG_DATUM_VASSAL)
if(AmBloodsucker(user) || istype(T))
toggle()
diff --git a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm
index fccef4fb0c..efdd312c6e 100644
--- a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm
+++ b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm
@@ -128,11 +128,9 @@
target.face_atom(L)
target.Stun(power_time)
to_chat(L, "[target] is fixed in place by your hypnotic gaze.")
- target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // target.changeNext_move(power_time) // check click.dm
- target.mob_transforming = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze.
+ target.DelayNextAction(power_time)
spawn(power_time)
if(istype(target) && success)
- target.mob_transforming = FALSE
if(istype(L) && target.stat == CONSCIOUS && (target in L.fov_view(10))) // They Woke Up! (Notice if within view)
to_chat(L, "[target] has snapped out of their trance.")
diff --git a/code/modules/antagonists/bloodsucker/powers/trespass.dm b/code/modules/antagonists/bloodsucker/powers/trespass.dm
index cad3eeb88b..56b72a562e 100644
--- a/code/modules/antagonists/bloodsucker/powers/trespass.dm
+++ b/code/modules/antagonists/bloodsucker/powers/trespass.dm
@@ -81,9 +81,7 @@
var/mist_delay = max(5, 20 - level_current * 2.5) // Level up and do this faster.
// Freeze Me
- user.next_move = world.time + mist_delay
user.Stun(mist_delay, ignore_canstun = TRUE)
- user.mob_transforming = TRUE
user.density = FALSE
var/invis_was = user.invisibility
user.invisibility = INVISIBILITY_MAXIMUM
@@ -96,7 +94,6 @@
// Move & Freeze
if(isturf(target_turf))
do_teleport(owner, target_turf, no_effects=TRUE, channel = TELEPORT_CHANNEL_QUANTUM) // in teleport.dm?
- user.next_move = world.time + mist_delay / 2
user.Stun(mist_delay / 2, ignore_canstun = TRUE)
// Wait...
@@ -104,9 +101,7 @@
// Un-Hide & Freeze
user.dir = get_dir(my_turf, target_turf)
- user.next_move = world.time + mist_delay / 2
user.Stun(mist_delay / 2, ignore_canstun = TRUE)
- user.mob_transforming = FALSE
user.density = 1
user.invisibility = invis_was
diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm
index c0979b6936..8e3a36740b 100644
--- a/code/modules/antagonists/changeling/powers/transform.dm
+++ b/code/modules/antagonists/changeling/powers/transform.dm
@@ -17,8 +17,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/glasses/changeling/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/glasses/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -33,8 +32,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/under/changeling/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/under/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -50,8 +48,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/suit/changeling/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/suit/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -65,8 +62,7 @@
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/head/changeling/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/head/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -81,8 +77,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/shoes/changeling/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/shoes/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -97,8 +92,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/gloves/changeling/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/gloves/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -113,8 +107,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/mask/changeling/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/mask/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
@@ -131,8 +124,7 @@
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/changeling/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/changeling/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(user, "You reabsorb [src] into your body.")
qdel(src)
diff --git a/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm b/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm
index 21d0035ef1..3ea4668df8 100644
--- a/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm
+++ b/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm
@@ -36,8 +36,7 @@
return
. = ..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/effect/clockwork/city_of_cogs_rift/attack_hand(atom/movable/AM)
+/obj/effect/clockwork/city_of_cogs_rift/on_attack_hand(atom/movable/AM)
beckon(AM)
/obj/effect/clockwork/city_of_cogs_rift/Bumped(atom/movable/AM)
diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
index 90c4bdf8de..4b5523d640 100644
--- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
+++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
@@ -27,8 +27,7 @@
/obj/effect/clockwork/sigil/attack_tk(mob/user)
return //you can't tk stomp sigils, but you can hit them with something
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/effect/clockwork/sigil/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/effect/clockwork/sigil/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscarbon(user) && !user.stat)
if(is_servant_of_ratvar(user) && user.a_intent != INTENT_HARM)
return ..()
diff --git a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm
index 9106015c0a..ca5efe1d37 100644
--- a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm
+++ b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm
@@ -63,8 +63,7 @@
user.forceMove(get_turf(linked_gateway))
..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/effect/clockwork/spatial_gateway/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/effect/clockwork/spatial_gateway/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!uses)
return FALSE
if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling))
diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
index d0d3bafe06..2daf5189e4 100644
--- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
@@ -57,8 +57,7 @@
to_chat(user, "[src] falls dark. It appears you weren't worthy.")
return ..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clockwork/slab/debug/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clockwork/slab/debug/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!is_servant_of_ratvar(user))
add_servant_of_ratvar(user)
return ..()
diff --git a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm
index 7578d41b15..19c29762bf 100644
--- a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm
+++ b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm
@@ -31,8 +31,7 @@
. = ..()
clockwork_desc = initial(clockwork_desc)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clockwork/construct_chassis/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clockwork/construct_chassis/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(w_class >= WEIGHT_CLASS_HUGE)
to_chat(user, "[src] is too cumbersome to carry! Drag it around instead!")
return
diff --git a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm
index faa5e025ca..2f6a018a4c 100644
--- a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm
+++ b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm
@@ -114,24 +114,27 @@
superheat_wall(A)
return
if(modifiers["middle"] || modifiers["ctrl"])
- issue_command(A)
+ INVOKE_ASYNC(src, .proc/issue_command, A)
return
if(GLOB.ark_of_the_clockwork_justiciar == A)
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar
- if(G.recalling)
- return
- if(!G.recalls_remaining)
- to_chat(src, "The Ark can no longer recall!")
- return
- if(alert(src, "Initiate mass recall?", "Mass Recall", "Yes", "No") != "Yes" || QDELETED(src) || QDELETED(G) || !G.obj_integrity)
- return
- G.initiate_mass_recall() //wHOOPS LOOKS LIKE A HULK GOT THROUGH
+ INVOKE_ASYNC(src, .proc/attempt_recall, G)
else if(istype(A, /obj/structure/destructible/clockwork/trap/trigger))
var/obj/structure/destructible/clockwork/trap/trigger/T = A
T.visible_message("[T] clunks as it's activated remotely.")
to_chat(src, "You activate [T].")
T.activate()
+/mob/camera/eminence/proc/attempt_recall(obj/structure/destructible/clockwork/massive/celestial_gateway/G)
+ if(G.recalling)
+ return
+ if(!G.recalls_remaining)
+ to_chat(src, "The Ark can no longer recall!")
+ return
+ if(alert(src, "Initiate mass recall?", "Mass Recall", "Yes", "No") != "Yes" || QDELETED(src) || QDELETED(G) || !G.obj_integrity)
+ return
+ G.initiate_mass_recall() //wHOOPS LOOKS LIKE A HULK GOT THROUGH
+
/mob/camera/eminence/ratvar_act()
name = "\improper Radiance"
real_name = "\improper Radiance"
diff --git a/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm b/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm
index 8c529d43a6..f87f96b240 100644
--- a/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm
@@ -41,7 +41,7 @@
affected += try_use_power(MIN_CLOCKCULT_POWER*4)
return affected
-/obj/structure/destructible/clockwork/powered/clockwork_obelisk/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/destructible/clockwork/powered/clockwork_obelisk/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/antagonists/clockcult/clock_structures/eminence_spire.dm b/code/modules/antagonists/clockcult/clock_structures/eminence_spire.dm
index 2c84a5b332..77a629145d 100644
--- a/code/modules/antagonists/clockcult/clock_structures/eminence_spire.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/eminence_spire.dm
@@ -11,7 +11,7 @@
var/selection_timer //Timer ID; this is canceled if the vote is canceled
var/kingmaking
-/obj/structure/destructible/clockwork/eminence_spire/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/destructible/clockwork/eminence_spire/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm
index 385b9a5431..44c7f78380 100644
--- a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm
@@ -58,7 +58,7 @@
. += "There are [time_remaining] second[time_remaining != 1 ? "s" : ""] remaining to vote."
. += "There are [voters.len]/[votes_needed] votes to activate the beacon!"
-/obj/structure/destructible/clockwork/heralds_beacon/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/destructible/clockwork/heralds_beacon/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm b/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm
index 24d0651444..40cadb53a2 100644
--- a/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm
@@ -30,7 +30,7 @@
toggle()
return TRUE
-/obj/structure/destructible/clockwork/powered/mania_motor/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/destructible/clockwork/powered/mania_motor/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/lever.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/lever.dm
index d4a02cc3e1..55347685f4 100644
--- a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/lever.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/lever.dm
@@ -6,7 +6,7 @@
max_integrity = 75
icon_state = "lever"
-/obj/structure/destructible/clockwork/trap/trigger/lever/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/destructible/clockwork/trap/trigger/lever/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/repeater.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/repeater.dm
index e7d4e18c43..7a528786e2 100644
--- a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/repeater.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/repeater.dm
@@ -6,7 +6,7 @@
max_integrity = 15 //Fragile!
icon_state = "repeater"
-/obj/structure/destructible/clockwork/trap/trigger/repeater/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/destructible/clockwork/trap/trigger/repeater/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 1b1c461dbc..35151953a0 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -258,7 +258,7 @@
/datum/action/innate/cult/spin2win/Activate()
cooldown = world.time + sword.spin_cooldown
- holder.changeNext_move(50)
+ holder.DelayNextAction(50)
holder.apply_status_effect(/datum/status_effect/sword_spin)
sword.spinning = TRUE
sword.block_chance = 100
diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm
index 6f340b9271..5803941f36 100644
--- a/code/modules/antagonists/cult/cult_structures.dm
+++ b/code/modules/antagonists/cult/cult_structures.dm
@@ -44,15 +44,16 @@
/obj/structure/destructible/cult/attack_animal(mob/living/simple_animal/M)
if(istype(M, /mob/living/simple_animal/hostile/construct/builder))
if(obj_integrity < max_integrity)
- M.changeNext_move(CLICK_CD_MELEE)
+ M.DelayNextAction(CLICK_CD_MELEE)
obj_integrity = min(max_integrity, obj_integrity + 5)
Beam(M, icon_state="sendbeam", time=4)
M.visible_message("[M] repairs \the [src].", \
"You repair [src], leaving [p_they()] at [round(obj_integrity * 100 / max_integrity)]% stability.")
+ return TRUE
else
to_chat(M, "You cannot repair [src], as [p_theyre()] undamaged!")
else
- ..()
+ return ..()
/obj/structure/destructible/cult/attackby(obj/I, mob/user, params)
if(istype(I, /obj/item/melee/cultblade/dagger) && iscultist(user))
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index 9b77e70a73..3ea160c5cc 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -67,7 +67,7 @@ Runes can either be invoked by one's self or with many different cultists. Each
to_chat(user, "You disrupt the magic of [src] with [I].")
qdel(src)
-/obj/effect/rune/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/effect/rune/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm
index 7d7031dad4..272b154828 100644
--- a/code/modules/antagonists/devil/true_devil/_true_devil.dm
+++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm
@@ -144,7 +144,7 @@
/mob/living/carbon/true_devil/resist_fire()
//They're immune to fire.
-/mob/living/carbon/true_devil/attack_hand(mob/living/carbon/human/M)
+/mob/living/carbon/true_devil/on_attack_hand(mob/living/carbon/human/M)
. = ..()
if(.)
switch(M.a_intent)
diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm
index e876beb5dc..6a05d07b38 100644
--- a/code/modules/antagonists/disease/disease_mob.dm
+++ b/code/modules/antagonists/disease/disease_mob.dm
@@ -291,16 +291,19 @@ the new instance inside the host to be updated to the template's stats.
/mob/camera/disease/ClickOn(var/atom/A, params)
if(freemove && ishuman(A))
- var/mob/living/carbon/human/H = A
- if(alert(src, "Select [H.name] as your initial host?", "Select Host", "Yes", "No") != "Yes")
- return
- if(!freemove)
- return
- if(QDELETED(H) || !force_infect(H))
- to_chat(src, "[H ? H.name : "Host"] cannot be infected.")
+ confirm_initial_infection(A)
else
..()
+/mob/camera/disease/proc/confirm_initial_infection(mob/living/carbon/human/H)
+ set waitfor = FALSE
+ if(alert(src, "Select [H.name] as your initial host?", "Select Host", "Yes", "No") != "Yes")
+ return
+ if(!freemove)
+ return
+ if(QDELETED(H) || !force_infect(H))
+ to_chat(src, "[H ? H.name : "Host"] cannot be infected.")
+
/mob/camera/disease/proc/adapt_cooldown()
to_chat(src, "You have altered your genetic structure. You will be unable to adapt again for [DisplayTimeText(adaptation_cooldown)].")
next_adaptation_time = world.time + adaptation_cooldown
diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm
index 2d84ed7c22..7a2f661fd9 100644
--- a/code/modules/antagonists/revenant/revenant_abilities.dm
+++ b/code/modules/antagonists/revenant/revenant_abilities.dm
@@ -17,6 +17,7 @@
//Harvest; activated ly clicking the target, will try to drain their essence.
/mob/living/simple_animal/revenant/proc/Harvest(mob/living/carbon/human/target)
+ set waitfor = FALSE
if(!castcheck(0))
return
if(draining)
diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm
index 9a8b9c8d59..b7503f4b22 100644
--- a/code/modules/antagonists/swarmer/swarmer.dm
+++ b/code/modules/antagonists/swarmer/swarmer.dm
@@ -36,7 +36,7 @@
if(A)
notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE)
-/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/effect/mob_spawn/swarmer/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -158,10 +158,11 @@
face_atom(A)
if(!isturf(loc))
return
- if(next_move > world.time)
+ if(!CheckActionCooldown())
return
if(!A.Adjacent(src))
return
+ DelayNextAction()
A.swarmer_act(src)
/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
@@ -497,7 +498,7 @@
if(resource_gain)
resources += resource_gain
do_attack_animation(target)
- changeNext_move(CLICK_CD_MELEE)
+ DelayNextAction(CLICK_CD_MELEE)
var/obj/effect/temp_visual/swarmer/integrate/I = new /obj/effect/temp_visual/swarmer/integrate(get_turf(target))
I.pixel_x = target.pixel_x
I.pixel_y = target.pixel_y
@@ -517,10 +518,9 @@
/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(atom/movable/target)
new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target))
do_attack_animation(target)
- changeNext_move(CLICK_CD_MELEE)
+ DelayNextAction(CLICK_CD_MELEE)
target.ex_act(EXPLODE_LIGHT)
-
/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(mob/living/target)
if(target == src)
return
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index 36c444f02d..1c814fa193 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -62,6 +62,7 @@
/obj/item/onetankbomb/analyzer_act(mob/living/user, obj/item/I)
bombtank.analyzer_act(user, I)
+ return TRUE
/obj/item/onetankbomb/attack_self(mob/user) //pressing the bomb accesses its assembly
bombassembly.attack_self(user, TRUE)
@@ -90,7 +91,7 @@
if(bombassembly)
bombassembly.on_found(finder)
-/obj/item/onetankbomb/attack_hand() //also for mousetraps
+/obj/item/onetankbomb/on_attack_hand() //also for mousetraps
. = ..()
if(.)
return
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index c960a7f039..bf56449a0c 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -87,7 +87,7 @@
if(a_right)
a_right.dropped(user)
-/obj/item/assembly_holder/attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess
+/obj/item/assembly_holder/on_attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess
. = ..()
if(.)
return
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 8cb6eb66fb..6e8e2846a2 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -125,7 +125,7 @@
return
refreshBeam()
-/obj/item/assembly/infra/attack_hand()
+/obj/item/assembly/infra/on_attack_hand()
. = ..()
refreshBeam()
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index 90d4662c15..2c005b971d 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -84,8 +84,7 @@
playsound(src, 'sound/weapons/handcuffs.ogg', 30, TRUE, -3)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/assembly/mousetrap/attack_hand(mob/living/carbon/human/user)
+/obj/item/assembly/mousetrap/on_attack_hand(mob/living/carbon/human/user)
if(armed)
if((HAS_TRAIT(user, TRAIT_DUMB) || HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
var/which_hand = BODY_ZONE_PRECISE_L_HAND
diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
index e230ae55bb..2b43319904 100644
--- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
+++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
@@ -198,24 +198,27 @@
//////////////////////////SPACEWIND/////////////////////////////
/turf/open/proc/consider_pressure_difference(turf/T, difference)
- SSair.high_pressure_delta[src] = TRUE
if(difference > pressure_difference)
pressure_direction = get_dir(src, T)
pressure_difference = difference
+ SSair.high_pressure_delta[src] = TRUE
/turf/open/proc/high_pressure_movements()
- var/atom/movable/M
- var/multiplier = 1
+ var/diff = pressure_difference
if(locate(/obj/structure/rack) in src)
- multiplier *= 0.1
+ diff *= 0.1
else if(locate(/obj/structure/table) in src)
- multiplier *= 0.2
- for(var/thing in src)
- M = thing
- if (!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired)
- M.experience_pressure_difference(pressure_difference * multiplier, pressure_direction, 0, pressure_specific_target)
+ diff *= 0.2
+ for(var/obj/M in src)
+ if(!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired)
+ M.experience_pressure_difference(diff, pressure_direction, 0, pressure_specific_target)
+ for(var/mob/M in src)
+ if(!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired)
+ M.experience_pressure_difference(diff, pressure_direction, 0, pressure_specific_target)
+ /*
if(pressure_difference > 100)
new /obj/effect/temp_visual/dir_setting/space_wind(src, pressure_direction, clamp(round(sqrt(pressure_difference) * 2), 10, 255))
+ */
/atom/movable/var/pressure_resistance = 10
/atom/movable/var/last_high_pressure_movement_air_cycle = 0
diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm
index dc7c106035..a8d9586fc4 100644
--- a/code/modules/atmospherics/machinery/components/components_base.dm
+++ b/code/modules/atmospherics/machinery/components/components_base.dm
@@ -170,3 +170,4 @@
/obj/machinery/atmospherics/components/analyzer_act(mob/living/user, obj/item/I)
atmosanalyzer_scan(airs, user, src)
+ return TRUE
\ No newline at end of file
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index ae80825694..0f849af0e3 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -276,8 +276,6 @@
return occupant
/obj/machinery/atmospherics/components/unary/cryo_cell/container_resist(mob/living/user)
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the glass of [src]!", \
"You struggle inside [src], kicking the release with your foot... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a thump from [src].")
diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm
index 4a6170c251..23fd2292ff 100644
--- a/code/modules/atmospherics/machinery/pipes/pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/pipes.dm
@@ -64,6 +64,7 @@
/obj/machinery/atmospherics/pipe/analyzer_act(mob/living/user, obj/item/I)
atmosanalyzer_scan(parent.air, user, src)
+ return TRUE
/obj/machinery/atmospherics/pipe/returnPipenet()
return parent
diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
index 445cc686f3..fa57e683c4 100644
--- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
@@ -145,6 +145,7 @@
/obj/machinery/portable_atmospherics/analyzer_act(mob/living/user, obj/item/I)
atmosanalyzer_scan(air_contents, user, src)
+ return TRUE
/obj/machinery/portable_atmospherics/attacked_by(obj/item/I, mob/user, attackchain_flags = NONE, damage_multiplier = 1)
if(I.force < 10 && !(stat & BROKEN))
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 03c0f5178a..3426208fae 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -53,8 +53,7 @@
to_chat(M, "\The [src] has been returned to base!")
STOP_PROCESSING(SSobj, src)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/ctf/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/ctf/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!is_ctf_target(user) && !anyonecanpickup)
to_chat(user, "Non players shouldn't be moving the flag!")
return
@@ -679,10 +678,7 @@
/obj/machinery/control_point/attackby(mob/user, params)
capture(user)
-/obj/machinery/control_point/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/control_point/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
capture(user)
/obj/machinery/control_point/proc/capture(mob/user)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 4b2f1e9962..e68c45a84c 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -594,8 +594,7 @@
assignedrole = "Space Bar Patron"
job_description = "Space Bar Patron"
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/effect/mob_spawn/human/alive/space_bar_patron/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/effect/mob_spawn/human/alive/space_bar_patron/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
var/despawn = alert("Return to cryosleep? (Warning, Your mob will be deleted!)",,"Yes","No")
if(despawn == "No" || !loc || !Adjacent(user))
return
diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm
index c77050c530..1c1f2a36e1 100644
--- a/code/modules/cargo/coupon.dm
+++ b/code/modules/cargo/coupon.dm
@@ -8,6 +8,7 @@
icon = 'icons/obj/card.dmi'
item_flags = NOBLUDGEON
w_class = WEIGHT_CLASS_TINY
+ attack_speed = CLICK_CD_RAPID
var/datum/supply_pack/discounted_pack
var/discount_pct_off = 0.05
var/obj/machinery/computer/cargo/inserted_console
@@ -34,6 +35,7 @@
if(discount_pct_off == COUPON_OMEN)
to_chat(user, "\The [O] validates the coupon as authentic, but refuses to accept it...")
O.say("Coupon fulfillment already in progress...")
+ user.DelayNextAction()
return
inserted_console = O
diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm
index 249faae33d..0f01dfd5d9 100644
--- a/code/modules/cargo/packs/organic.dm
+++ b/code/modules/cargo/packs/organic.dm
@@ -361,6 +361,7 @@
/obj/item/seeds/reishi,
/obj/item/seeds/banana,
/obj/item/seeds/eggplant/eggy,
+ /obj/item/seeds/poppy/lily/trumpet,
/obj/item/seeds/random,
/obj/item/seeds/random)
crate_name = "exotic seeds crate"
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 7f1ba86ff5..ae48fddfb4 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -30,6 +30,9 @@
var/move_delay = 0
var/area = null
+ /// Last time we Click()ed. No clicking twice in one tick!
+ var/last_click = 0
+
///////////////
//SOUND STUFF//
///////////////
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 1da69f197f..5c9b1eec2e 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -471,6 +471,11 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
//////////////
/client/Del()
+ if(!gc_destroyed)
+ Destroy()
+ return ..()
+
+/client/Destroy()
if(credits)
QDEL_LIST(credits)
log_access("Logout: [key_name(src)]")
@@ -504,9 +509,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
movingmob.client_mobs_in_contents -= mob
UNSETEMPTY(movingmob.client_mobs_in_contents)
Master.UpdateTickRate()
- return ..()
-
-/client/Destroy()
+ . = ..()
return QDEL_HINT_HARDDEL_NOW
/client/proc/set_client_age_from_db(connectiontopic)
@@ -771,6 +774,9 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
ip_intel = res.intel
/client/Click(atom/object, atom/location, control, params, ignore_spam = FALSE)
+ if(last_click > world.time - world.tick_lag)
+ return
+ last_click = world.time
var/ab = FALSE
var/list/L = params2list(params)
if (object && object == middragatom && L["left"])
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index d2553c4d7c..d540336b86 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -58,6 +58,10 @@
var/limb_integrity = 0
// How many zones (body parts, not precise) we have disabled so far, for naming purposes
var/zones_disabled
+ ///These are armor values that protect the wearer, taken from the clothing's armor datum. List updates on examine because it's currently only used to print armor ratings to chat in Topic().
+ var/list/armor_list = list()
+ ///These are armor values that protect the clothing, taken from its armor datum. List updates on examine because it's currently only used to print armor ratings to chat in Topic().
+ var/list/durability_list = list()
/obj/item/clothing/Initialize()
. = ..()
@@ -85,7 +89,7 @@
tastes = list("dust" = 1, "lint" = 1)
/obj/item/clothing/attack(mob/M, mob/user, def_zone)
- if(user.a_intent != INTENT_HARM && ismoth(M))
+ if(user.a_intent != INTENT_HARM && isinsect(M))
var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new
clothing_as_food.name = name
if(clothing_as_food.attack(M, user, def_zone))
@@ -115,7 +119,7 @@
// Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up
/obj/item/clothing/proc/repair(mob/user, params)
damaged_clothes = CLOTHING_PRISTINE
- update_clothes_damaged_state()
+ update_clothes_damaged_state(FALSE)
obj_integrity = max_integrity
name = initial(name) // remove "tattered" or "shredded" if there's a prefix
body_parts_covered = initial(body_parts_covered)
@@ -253,6 +257,87 @@
how_cool_are_your_threads += "Adding or removing items from [src] makes no noise.\n"
how_cool_are_your_threads += ""
. += how_cool_are_your_threads.Join()
+
+ if(LAZYLEN(armor_list))
+ armor_list.Cut()
+ if(armor.bio)
+ armor_list += list("TOXIN" = armor.bio)
+ if(armor.bomb)
+ armor_list += list("EXPLOSIVE" = armor.bomb)
+ if(armor.bullet)
+ armor_list += list("BULLET" = armor.bullet)
+ if(armor.energy)
+ armor_list += list("ENERGY" = armor.energy)
+ if(armor.laser)
+ armor_list += list("LASER" = armor.laser)
+ if(armor.magic)
+ armor_list += list("MAGIC" = armor.magic)
+ if(armor.melee)
+ armor_list += list("MELEE" = armor.melee)
+ if(armor.rad)
+ armor_list += list("RADIATION" = armor.rad)
+
+ if(LAZYLEN(durability_list))
+ durability_list.Cut()
+ if(armor.fire)
+ durability_list += list("FIRE" = armor.fire)
+ if(armor.acid)
+ durability_list += list("ACID" = armor.acid)
+
+ if(LAZYLEN(armor_list) || LAZYLEN(durability_list))
+ . += "It has a tag listing its protection classes."
+
+/obj/item/clothing/Topic(href, href_list)
+ . = ..()
+
+ if(href_list["list_armor"])
+ var/list/readout = list("PROTECTION CLASSES (I-X)")
+ if(LAZYLEN(armor_list))
+ readout += "\nARMOR"
+ for(var/dam_type in armor_list)
+ var/armor_amount = armor_list[dam_type]
+ readout += "\n[dam_type] [armor_to_protection_class(armor_amount)]" //e.g. BOMB IV
+ if(LAZYLEN(durability_list))
+ readout += "\nDURABILITY"
+ for(var/dam_type in durability_list)
+ var/durability_amount = durability_list[dam_type]
+ readout += "\n[dam_type] [armor_to_protection_class(durability_amount)]" //e.g. FIRE II
+ readout += ""
+
+ to_chat(usr, "[readout.Join()]")
+
+/**
+ * Rounds armor_value to nearest 10, divides it by 10 and then expresses it in roman numerals up to 10
+ *
+ * Rounds armor_value to nearest 10, divides it by 10
+ * and then expresses it in roman numerals up to 10
+ * Arguments:
+ * * armor_value - Number we're converting
+ */
+/obj/item/clothing/proc/armor_to_protection_class(armor_value)
+ armor_value = round(armor_value,10) / 10
+ switch (armor_value)
+ if (1)
+ . = "I"
+ if (2)
+ . = "II"
+ if (3)
+ . = "III"
+ if (4)
+ . = "IV"
+ if (5)
+ . = "V"
+ if (6)
+ . = "VI"
+ if (7)
+ . = "VII"
+ if (8)
+ . = "VIII"
+ if (9)
+ . = "IX"
+ if (10 to INFINITY)
+ . = "X"
+ return .
/obj/item/clothing/obj_break(damage_flag)
damaged_clothes = CLOTHING_DAMAGED
@@ -265,7 +350,6 @@
var/index = "[REF(initial(icon))]-[initial(icon_state)]"
var/static/list/damaged_clothes_icons = list()
if(damaging)
- damaged_clothes = 1
var/icon/damaged_clothes_icon = damaged_clothes_icons[index]
if(!damaged_clothes_icon)
damaged_clothes_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply damaged effect to the initial icon_state for each object
@@ -273,12 +357,10 @@
damaged_clothes_icon.Blend(icon('icons/effects/item_damage.dmi', "itemdamaged"), ICON_MULTIPLY) //adds damage effect and the remaining white areas become transparant
damaged_clothes_icon = fcopy_rsc(damaged_clothes_icon)
damaged_clothes_icons[index] = damaged_clothes_icon
- add_overlay(damaged_clothes_icon, 1)
+ add_overlay(damaged_clothes_icon, TRUE)
else
- damaged_clothes = 0
cut_overlay(damaged_clothes_icons[index], TRUE)
-
/*
SEE_SELF // can see self, no matter what
SEE_MOBS // can see all mobs, no matter what
diff --git a/code/modules/clothing/glasses/disablerglasses.dm b/code/modules/clothing/glasses/disablerglasses.dm
index a46e4c8339..51fb1cec87 100644
--- a/code/modules/clothing/glasses/disablerglasses.dm
+++ b/code/modules/clothing/glasses/disablerglasses.dm
@@ -4,7 +4,9 @@
var/beamtype = /obj/item/projectile/beam/disabler //change for adminbus
/obj/item/clothing/glasses/hud/security/sunglasses/disablers/ranged_attack(mob/living/carbon/human/user,atom/A, params)
- user.changeNext_move(CLICK_CD_RANGE)
+ if(!user.CheckActionCooldown(CLICK_CD_RANGE))
+ return
+ user.last_action = world.time
var/obj/item/projectile/beam/disabler/LE = new beamtype( loc )
playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1)
LE.firer = src
@@ -12,4 +14,4 @@
LE.preparePixelProjectile(A, src, params)
LE.fire()
return TRUE
- //shamelessly copied
\ No newline at end of file
+ //shamelessly copied
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index b06636ea2e..1c3ac0f340 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -45,8 +45,8 @@
REMOVE_TRAIT(user, secondary_trait, GLOVE_TRAIT)
if(ishuman(user))
var/mob/living/carbon/human/H = user
- H.dna.species.punchdamagehigh = initial(H.dna.species.punchdamagehigh)
- H.dna.species.punchdamagelow = initial(H.dna.species.punchdamagelow)
+ H.dna.species.punchdamagehigh -= enhancement
+ H.dna.species.punchdamagelow -= enhancement
return ..()
/obj/item/clothing/gloves/fingerless/pugilist/chaplain
@@ -105,11 +105,11 @@
return
var/mob/living/M = loc
- M.changeNext_move(CLICK_CD_RAPID)
+ M.SetNextAction(CLICK_CD_RAPID)
if(warcry)
M.say("[warcry]", ignore_spam = TRUE, forced = TRUE)
- return FALSE
+ return NO_AUTO_CLICKDELAY_HANDLING | ATTACK_IGNORE_ACTION
/obj/item/clothing/gloves/fingerless/pugilist/rapid/AltClick(mob/user)
var/input = stripped_input(user,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 7)
@@ -135,9 +135,9 @@
if(target.stat != CONSCIOUS) //Can't hug people who are dying/dead
return FALSE
else
- M.changeNext_move(CLICK_CD_RAPID)
+ M.SetNextAction(CLICK_CD_RAPID)
- return FALSE
+ return NO_AUTO_CLICKDELAY_HANDLING | ATTACK_IGNORE_ACTION
/obj/item/clothing/gloves/botanic_leather
name = "botanist's leather gloves"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 1d9c3dd325..3774ce575f 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -290,7 +290,7 @@
if(!target.IsUnconscious())
to_chat(target, "Your zealous conspirationism rapidly dissipates as the donned hat warps up into a ruined mess. All those theories starting to sound like nothing but a ridicolous fanfare.")
-/obj/item/clothing/head/foilhat/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/head/foilhat/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!warped && iscarbon(user))
var/mob/living/carbon/C = user
if(src == C.head)
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index c3934aa78c..51a526d089 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -219,7 +219,7 @@
lock = TRUE
return
-/obj/item/clothing/neck/petcollar/locked/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/neck/petcollar/locked/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user && user.get_item_by_slot(SLOT_NECK) && lock != FALSE)
to_chat(user, "The collar is locked! You'll need unlock the collar before you can take it off!")
return
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index d67aea11a1..c12702424b 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -20,6 +20,15 @@
var/last_blood_DNA = "" //same as last one
var/last_blood_color = ""
+ ///Whether these shoes have laces that can be tied/untied
+ var/can_be_tied = TRUE
+ ///Are we currently tied? Can either be SHOES_UNTIED, SHOES_TIED, or SHOES_KNOTTED
+ var/tied = SHOES_TIED
+ ///How long it takes to lace/unlace these shoes
+ var/lace_time = 5 SECONDS
+ ///any alerts we have active
+ var/obj/screen/alert/our_alert
+
/obj/item/clothing/shoes/ComponentInitialize()
. = ..()
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood)
@@ -43,6 +52,15 @@
playsound(user, 'sound/weapons/genhit2.ogg', 50, 1)
return(BRUTELOSS)
+/obj/item/clothing/shoes/examine(mob/user)
+ . = ..()
+
+ if(!ishuman(loc))
+ return ..()
+ if(tied == SHOES_UNTIED)
+ . += "The shoelaces are untied."
+ else if(tied == SHOES_KNOTTED)
+ . += "The shoelaces are all knotted together."
/obj/item/clothing/shoes/transfer_blood_dna(list/blood_dna, diseases)
..()
@@ -74,6 +92,9 @@
worn_y_dimension -= (offset * 2)
user.update_inv_shoes()
equipped_before_drop = TRUE
+ if(can_be_tied && tied == SHOES_UNTIED)
+ our_alert = user.throw_alert("shoealert", /obj/screen/alert/shoes/untied)
+ RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, .proc/check_trip, override=TRUE)
/obj/item/clothing/shoes/proc/restore_offsets(mob/user)
equipped_before_drop = FALSE
@@ -81,6 +102,8 @@
worn_y_dimension = world.icon_size
/obj/item/clothing/shoes/dropped(mob/user)
+ if(our_alert && (our_alert.mob_viewer == user))
+ user.clear_alert("shoealert")
if(offset && equipped_before_drop)
restore_offsets(user)
. = ..()
@@ -101,3 +124,167 @@
/obj/item/proc/negates_gravity()
return FALSE
+
+/**
+ * adjust_laces adjusts whether our shoes (assuming they can_be_tied) and tied, untied, or knotted
+ *
+ * In addition to setting the state, it will deal with getting rid of alerts if they exist, as well as registering and unregistering the stepping signals
+ *
+ * Arguments:
+ * *
+ * * state: SHOES_UNTIED, SHOES_TIED, or SHOES_KNOTTED, depending on what you want them to become
+ * * user: used to check to see if we're the ones unknotting our own laces
+ */
+/obj/item/clothing/shoes/proc/adjust_laces(state, mob/user)
+ if(!can_be_tied)
+ return
+
+ var/mob/living/carbon/human/our_guy
+ if(ishuman(loc))
+ our_guy = loc
+
+ tied = state
+ if(tied == SHOES_TIED)
+ if(our_guy)
+ our_guy.clear_alert("shoealert")
+ UnregisterSignal(src, COMSIG_SHOES_STEP_ACTION)
+ else
+ if(tied == SHOES_UNTIED && our_guy && user == our_guy)
+ our_alert = our_guy.throw_alert("shoealert", /obj/screen/alert/shoes/untied) // if we're the ones unknotting our own laces, of course we know they're untied
+ RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, .proc/check_trip, override=TRUE)
+
+/**
+ * handle_tying deals with all the actual tying/untying/knotting, inferring your intent from who you are in relation to the state of the laces
+ *
+ * If you're the wearer, you want them to move towards tied-ness (knotted -> untied -> tied). If you're not, you're pranking them, so you're moving towards knotted-ness (tied -> untied -> knotted)
+ *
+ * Arguments:
+ * *
+ * * user: who is the person interacting with the shoes?
+ */
+/obj/item/clothing/shoes/proc/handle_tying(mob/user)
+ ///our_guy here is the wearer, if one exists (and he must exist, or we don't care)
+ var/mob/living/carbon/human/our_guy = loc
+ if(!istype(our_guy))
+ return
+
+ if(!in_range(user, our_guy))
+ to_chat(user, "You aren't close enough to interact with [src]'s laces!")
+ return
+
+ if(user == loc && tied != SHOES_TIED) // if they're our own shoes, go tie-wards
+ if(INTERACTING_WITH(user, our_guy))
+ to_chat(user, "You're already interacting with [src]!")
+ return
+ user.visible_message("[user] begins [tied ? "unknotting" : "tying"] the laces of [user.p_their()] [src.name].", "You begin [tied ? "unknotting" : "tying"] the laces of your [src.name]...")
+
+ if(do_after(user, lace_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, .proc/still_shoed, our_guy)))
+ to_chat(user, "You [tied ? "unknot" : "tie"] the laces of your [src.name].")
+ if(tied == SHOES_UNTIED)
+ adjust_laces(SHOES_TIED, user)
+ else
+ adjust_laces(SHOES_UNTIED, user)
+
+ else // if they're someone else's shoes, go knot-wards
+ var/mob/living/L = user
+ if(istype(L) && (L.mobility_flags & MOBILITY_STAND))
+ to_chat(user, "You must be on the floor to interact with [src]!")
+ return
+ if(tied == SHOES_KNOTTED)
+ to_chat(user, "The laces on [loc]'s [src.name] are already a hopelessly tangled mess!")
+ return
+ if(INTERACTING_WITH(user, our_guy))
+ to_chat(user, "You're already interacting with [src]!")
+ return
+
+ var/mod_time = lace_time
+ to_chat(user, "You quietly set to work [tied ? "untying" : "knotting"] [loc]'s [src.name]...")
+ if(HAS_TRAIT(user, TRAIT_CLUMSY)) // based clowns trained their whole lives for this
+ mod_time *= 0.75
+
+ if(do_after(user, mod_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, .proc/still_shoed, our_guy)))
+ to_chat(user, "You [tied ? "untie" : "knot"] the laces on [loc]'s [src.name].")
+ if(tied == SHOES_UNTIED)
+ adjust_laces(SHOES_KNOTTED, user)
+ else
+ adjust_laces(SHOES_UNTIED, user)
+ else // if one of us moved
+ user.visible_message("[our_guy] stamps on [user]'s hand, mid-shoelace [tied ? "knotting" : "untying"]!", "Ow! [our_guy] stamps on your hand!", list(our_guy))
+ to_chat(our_guy, "You stamp on [user]'s hand! What the- [user.p_they()] [user.p_were()] [tied ? "knotting" : "untying"] your shoelaces!")
+ user.emote("scream")
+ if(istype(L))
+ var/obj/item/bodypart/ouchie = L.get_bodypart(pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
+ if(ouchie)
+ ouchie.receive_damage(brute = 10, stamina = 40)
+ L.Paralyze(10)
+
+///checking to make sure we're still on the person we're supposed to be, for lacing do_after's
+/obj/item/clothing/shoes/proc/still_shoed(mob/living/carbon/our_guy)
+ return (loc == our_guy)
+
+///check_trip runs on each step to see if we fall over as a result of our lace status. Knotted laces are a guaranteed trip, while untied shoes are just a chance to stumble
+/obj/item/clothing/shoes/proc/check_trip()
+ var/mob/living/carbon/human/our_guy = loc
+ if(!istype(our_guy)) // are they REALLY /our guy/?
+ return
+
+ if(tied == SHOES_KNOTTED)
+ our_guy.Paralyze(5)
+ our_guy.Knockdown(10)
+ our_guy.visible_message("[our_guy] trips on [our_guy.p_their()] knotted shoelaces and falls! What a klutz!", "You trip on your knotted shoelaces and fall over!")
+ SEND_SIGNAL(our_guy, COMSIG_ADD_MOOD_EVENT, "trip", /datum/mood_event/tripped) // well we realized they're knotted now!
+ our_alert = our_guy.throw_alert("shoealert", /obj/screen/alert/shoes/knotted)
+
+ else if(tied == SHOES_UNTIED)
+ var/wiser = TRUE // did we stumble and realize our laces are undone?
+ switch(rand(1, 1000))
+ if(1) // .1% chance to trip and fall over (note these are per step while our laces are undone)
+ our_guy.Paralyze(5)
+ our_guy.Knockdown(10)
+ SEND_SIGNAL(our_guy, COMSIG_ADD_MOOD_EVENT, "trip", /datum/mood_event/tripped) // well we realized they're knotted now!
+ our_guy.visible_message("[our_guy] trips on [our_guy.p_their()] untied shoelaces and falls! What a klutz!", "You trip on your untied shoelaces and fall over!")
+
+ if(2 to 5) // .4% chance to stumble and lurch forward
+ our_guy.throw_at(get_step(our_guy, our_guy.dir), 3, 2)
+ to_chat(our_guy, "You stumble on your untied shoelaces and lurch forward!")
+
+ if(6 to 13) // .7% chance to stumble and fling what we're holding
+ var/have_anything = FALSE
+ for(var/obj/item/I in our_guy.held_items)
+ have_anything = TRUE
+ our_guy.accident(I)
+ to_chat(our_guy, "You trip on your shoelaces a bit[have_anything ? ", flinging what you were holding" : ""]!")
+
+ if(14 to 25) // 1.3ish% chance to stumble and be a bit off balance (like being disarmed)
+ to_chat(our_guy, "You stumble a bit on your untied shoelaces!")
+ if(!our_guy.has_movespeed_modifier(/datum/movespeed_modifier/shove))
+ our_guy.add_movespeed_modifier(/datum/movespeed_modifier/shove)
+ addtimer(CALLBACK(our_guy, /mob/living/carbon/human/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH)
+
+ if(26 to 1000)
+ wiser = FALSE
+ if(wiser)
+ SEND_SIGNAL(our_guy, COMSIG_ADD_MOOD_EVENT, "untied", /datum/mood_event/untied) // well we realized they're untied now!
+ our_alert = our_guy.throw_alert("shoealert", /obj/screen/alert/shoes/untied)
+
+
+/obj/item/clothing/shoes/attack_hand(mob/living/carbon/human/user)
+ if(!istype(user))
+ return ..()
+ if(loc == user && tied != SHOES_TIED && (user.mobility_flags & MOBILITY_USE))
+ handle_tying(user)
+ return
+ ..()
+
+/obj/item/clothing/shoes/attack_self(mob/user)
+ . = ..()
+
+ if(INTERACTING_WITH(user, src))
+ to_chat(user, "You're already interacting with [src]!")
+ return
+
+ to_chat(user, "You begin [tied ? "untying" : "tying"] the laces on [src]...")
+
+ if(do_after(user, lace_time, needhand=TRUE, target=src,extra_checks=CALLBACK(src, .proc/still_shoed, user)))
+ to_chat(user, "You [tied ? "untie" : "tie"] the laces on [src].")
+ adjust_laces(tied ? SHOES_TIED : SHOES_UNTIED, user)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index b68bef6329..b0d760ebd9 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -17,6 +17,7 @@
resistance_flags = NONE
permeability_coefficient = 0.05 //Thick soles, and covers the ankle
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+ lace_time = 12 SECONDS
/obj/item/clothing/shoes/combat/sneakboots
name = "insidious sneakboots"
@@ -49,6 +50,7 @@
strip_delay = 50
equip_delay_other = 50
permeability_coefficient = 0.9
+ can_be_tied = FALSE
/obj/item/clothing/shoes/sandal/marisa
desc = "A pair of magic black shoes."
@@ -73,6 +75,7 @@
resistance_flags = NONE
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 75)
custom_price = PRICE_ABOVE_EXPENSIVE
+ can_be_tied = FALSE
/obj/item/clothing/shoes/galoshes/dry
name = "absorbent galoshes"
@@ -99,6 +102,7 @@
icon_state = "clown_shoes"
slowdown = SHOES_SLOWDOWN+1
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes/clown
+ lace_time = 20 SECONDS // how the hell do these laces even work??
/obj/item/clothing/shoes/clown_shoes/Initialize()
. = ..()
@@ -130,6 +134,7 @@
resistance_flags = NONE
permeability_coefficient = 0.05 //Thick soles, and covers the ankle
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+ lace_time = 12 SECONDS
/obj/item/clothing/shoes/jackboots/fast
slowdown = -1
@@ -144,6 +149,7 @@
heat_protection = FEET|LEGS
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+ lace_time = 8 SECONDS
/obj/item/clothing/shoes/winterboots/ice_boots
name = "ice hiking boots"
@@ -177,6 +183,7 @@
strip_delay = 40
equip_delay_other = 40
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+ lace_time = 8 SECONDS
/obj/item/clothing/shoes/workboots/mining
name = "mining boots"
@@ -196,6 +203,7 @@
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
+ lace_time = 10 SECONDS
/obj/item/clothing/shoes/cult/alt
name = "cultist boots"
@@ -226,12 +234,14 @@
strip_delay = 100
equip_delay_other = 100
permeability_coefficient = 0.9
+ can_be_tied = FALSE
/obj/item/clothing/shoes/griffin
name = "griffon boots"
desc = "A pair of costume boots fashioned after bird talons."
icon_state = "griffinboots"
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+ lace_time = 8 SECONDS
/obj/item/clothing/shoes/bhop
name = "jump boots"
@@ -284,6 +294,7 @@
desc = "A giant, clunky pair of shoes crudely made out of bronze. Why would anyone wear these?"
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_treads"
+ lace_time = 8 SECONDS
/obj/item/clothing/shoes/bronze/Initialize()
. = ..()
@@ -358,6 +369,7 @@
icon_state = "rus_shoes"
item_state = "rus_shoes"
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+ lace_time = 8 SECONDS
// kevin is into feet
/obj/item/clothing/shoes/wraps
@@ -365,6 +377,7 @@
desc = "Ankle coverings. These ones have a golden design."
icon_state = "gildedcuffs"
body_parts_covered = FALSE
+ can_be_tied = FALSE
/obj/item/clothing/shoes/wraps/silver
name = "silver leg wraps"
@@ -385,6 +398,7 @@
name = "cowboy boots"
desc = "A standard pair of brown cowboy boots."
icon_state = "cowboyboots"
+ can_be_tied = FALSE
/obj/item/clothing/shoes/cowboyboots/black
name = "black cowboy boots"
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index de1c7fe903..3f77a2befc 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -80,7 +80,7 @@
if(to_turf)
user.forceMove(to_turf)
user.SetStun(0)
- user.next_move = 1
+ user.SetNextAction(0, considered_action = FALSE, immediate = FALSE)
user.alpha = 255
user.update_atom_colour()
user.animate_movement = FORWARD_STEPS
@@ -124,8 +124,8 @@
for(var/obj/item/I in user.held_items)
ADD_TRAIT(I, TRAIT_NODROP, CHRONOSUIT_TRAIT)
user.animate_movement = NO_STEPS
- user.changeNext_move(8 + phase_in_ds)
- user.mob_transforming = 1
+ user.DelayNextAction(8 + phase_in_ds, considered_action = FALSE, immediate = FALSE)
+ user.mob_transforming = TRUE
user.anchored = TRUE
user.Stun(INFINITY)
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 0d1f1139f5..40797b97ed 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -107,11 +107,7 @@
/obj/item/clothing/suit/space/hardsuit/Initialize()
if(jetpack && ispath(jetpack))
jetpack = new jetpack(src)
- . = ..()
-
-/obj/item/clothing/suit/space/hardsuit/attack_self(mob/user)
- user.changeNext_move(CLICK_CD_MELEE)
- ..()
+ return ..()
/obj/item/clothing/suit/space/hardsuit/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/tank/jetpack/suit))
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 05abed603c..0b1121b22b 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -402,6 +402,30 @@
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
+/obj/item/clothing/suit/jacket/flannel
+ name = "black flannel jacket"
+ desc = "Comfy and supposedly flammable."
+ icon_state = "flannel"
+ item_state = "flannel"
+
+/obj/item/clothing/suit/jacket/flannel/red
+ name = "red flannel jacket"
+ desc = "Comfy and supposedly flammable."
+ icon_state = "flannel_red"
+ item_state = "flannel_red"
+
+/obj/item/clothing/suit/jacket/flannel/aqua
+ name = "aqua flannel jacket"
+ desc = "Comfy and supposedly flammable."
+ icon_state = "flannel_aqua"
+ item_state = "flannel_aqua"
+
+/obj/item/clothing/suit/jacket/flannel/brown
+ name = "brown flannel jacket"
+ desc = "Comfy and supposedly flammable."
+ icon_state = "flannel_brown"
+ item_state = "flannel_brown"
+
/obj/item/clothing/suit/jacket/leather
name = "leather jacket"
desc = "Pompadour not included."
@@ -760,6 +784,17 @@
desc = "A green winter coat hood."
icon_state = "winterhood_hydro"
+/obj/item/clothing/suit/hooded/wintercoat/bar
+ name = "bartender winter coat"
+ desc = "A fancy winter coat with a waistcoat and flamboyant bowtie stuck onto it. The zipper tab is actually the bowtie."
+ icon_state = "coatbar"
+ item_state = "coatbar"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/bar
+
+/obj/item/clothing/head/hooded/winterhood/bar
+ desc = "A fancy winter coat hood."
+ icon_state = "winterhood_bar"
+
/obj/item/clothing/suit/hooded/wintercoat/cosmic
name = "cosmic winter coat"
desc = "A starry winter coat that even glows softly."
diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm
index 3ee1990d14..70e85a9cfb 100644
--- a/code/modules/detectivework/scanner.dm
+++ b/code/modules/detectivework/scanner.dm
@@ -143,6 +143,8 @@
add_log("Blood:")
found_something = TRUE
for(var/B in blood)
+ if(B == "color")
+ continue
add_log("Type: [blood[B]] DNA: [B]")
//Fibers
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index cf2ac93360..89511a7b15 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -143,7 +143,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
if(L && (L.density || prob(10)))
L.ex_act(EXPLODE_HEAVY)
-obj/effect/immovablerod/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+obj/effect/immovablerod/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(ishuman(user))
var/mob/living/carbon/human/U = user
if(U.job in list("Research Director"))
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index ad786561f4..7cf11848e8 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -324,7 +324,7 @@
damage_dealt *= 4
if(I.damtype == BURN)
damage_dealt *= 4
-
+ user.DelayNextAction()
for(var/datum/spacevine_mutation/SM in mutations)
damage_dealt = SM.on_hit(src, user, I, damage_dealt) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
take_damage(damage_dealt, I.damtype, "melee", 1)
@@ -345,8 +345,7 @@
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_cross(src, AM)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/spacevine/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/spacevine/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_hit(src, user)
user_unbuckle_mob(user, user)
@@ -356,6 +355,7 @@
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_hit(src, user)
user_unbuckle_mob(user,user)
+ return ..()
/obj/structure/spacevine/attack_alien(mob/living/user)
eat(user)
diff --git a/code/modules/events/travelling_trader.dm b/code/modules/events/travelling_trader.dm
index b7afc3440e..08dae1b469 100644
--- a/code/modules/events/travelling_trader.dm
+++ b/code/modules/events/travelling_trader.dm
@@ -60,7 +60,7 @@
input_speech = replacetext(input_speech, "given_item", given_item.name)
return input_speech
-/mob/living/carbon/human/dummy/travelling_trader/attack_hand(mob/living/carbon/human/H)
+/mob/living/carbon/human/dummy/travelling_trader/on_attack_hand(mob/living/carbon/human/H)
if(active && last_speech + 3 < world.realtime) //can only talk once per 3 seconds, to avoid spam
last_speech = world.realtime
if(initial_speech)
@@ -282,6 +282,7 @@ mob/living/carbon/human/dummy/travelling_trader/animal_hunter/Initialize()
..()
/datum/outfit/artifact_dealer
+ name = "Artifact Dealer"
uniform = /obj/item/clothing/under/suit/black_really
shoes = /obj/item/clothing/shoes/combat
head = /obj/item/clothing/head/that
@@ -323,6 +324,7 @@ mob/living/carbon/human/dummy/travelling_trader/animal_hunter/Initialize()
reward.insert_organ(new_implant)
/datum/outfit/otherworldly_surgeon
+ name = "Otherworldly Surgeon"
uniform = /obj/item/clothing/under/pants/white
shoes = /obj/item/clothing/shoes/sneakers/white
gloves = /obj/item/clothing/gloves/color/latex
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 2e68c57abd..45ab6f6af1 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -23,7 +23,6 @@
gulp_size = max(round(reagents.total_volume / 5), 5)
/obj/item/reagent_containers/food/drinks/attack(mob/living/M, mob/user, def_zone)
-
if(!reagents || !reagents.total_volume)
to_chat(user, "[src] is empty!")
return 0
@@ -37,9 +36,6 @@
if(M == user)
user.visible_message("[user] swallows a gulp of [src].", "You swallow a gulp of [src].")
- if(HAS_TRAIT(M, TRAIT_VORACIOUS))
- M.changeNext_move(CLICK_CD_MELEE * 0.5) //chug! chug! chug!
-
else
M.visible_message("[user] attempts to feed the contents of [src] to [M].", "[user] attempts to feed the contents of [src] to [M].")
if(!do_mob(user, M))
@@ -56,6 +52,10 @@
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
return 1
+/obj/item/reagent_containers/food/drinks/CheckAttackCooldown(mob/user, atom/target)
+ var/fast = HAS_TRAIT(user, TRAIT_VORACIOUS) && (user == target)
+ return user.CheckActionCooldown(fast? CLICK_CD_RANGE : CLICK_CD_MELEE)
+
/obj/item/reagent_containers/food/drinks/afterattack(obj/target, mob/user , proximity)
. = ..()
if(!proximity)
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 45b64fbece..895699434a 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -129,8 +129,6 @@ All foods are distributed among various categories. Use common sense.
else if(fullness > (600 * (1 + M.overeatduration / 2000))) // The more you eat - the more you can eat
user.visible_message("[user] cannot force any more of \the [src] to go down [user.p_their()] throat!", "You cannot force any more of \the [src] to go down your throat!")
return 0
- if(HAS_TRAIT(M, TRAIT_VORACIOUS))
- M.changeNext_move(CLICK_CD_MELEE * 0.5) //nom nom nom
else
if(!isbrain(M)) //If you're feeding it to someone else.
if(fullness <= (600 * (1 + M.overeatduration / 1000)))
@@ -167,6 +165,10 @@ All foods are distributed among various categories. Use common sense.
return 0
+/obj/item/reagent_containers/food/snacks/CheckAttackCooldown(mob/user, atom/target)
+ var/fast = HAS_TRAIT(user, TRAIT_VORACIOUS) && (user == target)
+ return user.CheckActionCooldown(fast? CLICK_CD_RANGE : CLICK_CD_MELEE)
+
/obj/item/reagent_containers/food/snacks/examine(mob/user)
. = ..()
if(food_quality >= 70)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index f3c63c1ba2..fecc9467a1 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -130,7 +130,7 @@ God bless America.
/obj/machinery/deepfryer/attack_ai(mob/user)
return
-/obj/machinery/deepfryer/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/deepfryer/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(frying)
if(frying.loc == src)
to_chat(user, "You eject [frying] from [src].")
@@ -146,6 +146,8 @@ God bless America.
fry_loop.stop()
return
else if(user.pulling && user.a_intent == "grab" && iscarbon(user.pulling) && reagents.total_volume)
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
if(user.grab_state < GRAB_AGGRESSIVE)
to_chat(user, "You need a better grip to do that!")
return
@@ -155,5 +157,5 @@ God bless America.
C.apply_damage(min(30, reagents.total_volume), BURN, BODY_ZONE_HEAD)
reagents.remove_any((reagents.total_volume/2))
C.DefaultCombatKnockdown(60)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction()
return ..()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index 53da7326a2..e4148d849a 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -63,10 +63,7 @@
/obj/machinery/gibber/relaymove(mob/living/user)
go_out()
-/obj/machinery/gibber/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/gibber/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(stat & (NOPOWER|BROKEN))
return
if(operating)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill.dm b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
index a5a90b33e4..09e1d7b1c6 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/grill.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
@@ -107,7 +107,7 @@
/obj/machinery/grill/attack_ai(mob/user)
return
-/obj/machinery/grill/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/grill/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(grilled_item)
to_chat(user, "You take out [grilled_item] from [src].")
grilled_item.forceMove(drop_location())
diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
index 006c3fb6ad..a2603d07ab 100644
--- a/code/modules/food_and_drinks/pizzabox.dm
+++ b/code/modules/food_and_drinks/pizzabox.dm
@@ -106,8 +106,7 @@
START_PROCESSING(SSobj, src)
update_icon()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/pizzabox/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/pizzabox/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.get_inactive_held_item() != src)
return ..()
if(open)
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index 8d8049194b..c1a17b87a4 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -920,75 +920,75 @@
/datum/chemical_reaction/coldscales
name = "Cold Scales"
- id = /datum/reagent/consumable/ethanol/coldscales
- results = list(/datum/reagent/consumable/ethanol/coldscales = 3)
+ id = /datum/reagent/consumable/ethanol/species_drink/coldscales
+ results = list(/datum/reagent/consumable/ethanol/species_drink/coldscales = 3)
required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/toxin/slimejelly = 1, /datum/reagent/consumable/menthol = 1)
/datum/chemical_reaction/oil_drum
name = "Oil Drum"
- id = /datum/reagent/consumable/ethanol/oil_drum
- results = list(/datum/reagent/consumable/ethanol/oil_drum = 3)
+ id = /datum/reagent/consumable/ethanol/species_drink/oil_drum
+ results = list(/datum/reagent/consumable/ethanol/species_drink/oil_drum = 3)
required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/oil = 1, /datum/reagent/consumable/ethanol/champagne = 12)
/datum/chemical_reaction/nord_king
name = "Nord King"
- id = /datum/reagent/consumable/ethanol/nord_king
- results = list(/datum/reagent/consumable/ethanol/nord_king = 10)
+ id = /datum/reagent/consumable/ethanol/species_drink/nord_king
+ results = list(/datum/reagent/consumable/ethanol/species_drink/nord_king = 10)
required_reagents = list(/datum/reagent/consumable/ethanol = 5, /datum/reagent/consumable/honey = 1, /datum/reagent/consumable/ethanol/red_mead = 10)
/datum/chemical_reaction/velvet_kiss
name = "Velvet Kiss"
- id = /datum/reagent/consumable/ethanol/velvet_kiss
- results = list(/datum/reagent/consumable/ethanol/velvet_kiss = 15) //Limited races use this
+ id = /datum/reagent/consumable/ethanol/species_drink/velvet_kiss
+ results = list(/datum/reagent/consumable/ethanol/species_drink/velvet_kiss = 15) //Limited races use this
required_reagents = list(/datum/reagent/blood = 5, /datum/reagent/consumable/tea = 1, /datum/reagent/consumable/ethanol/wine = 10)
/datum/chemical_reaction/abduction_fruit
name = "Abduction Fruit"
- id = /datum/reagent/consumable/ethanol/abduction_fruit
- results = list(/datum/reagent/consumable/ethanol/abduction_fruit = 3)
+ id = /datum/reagent/consumable/ethanol/species_drink/abduction_fruit
+ results = list(/datum/reagent/consumable/ethanol/species_drink/abduction_fruit = 3)
required_reagents = list(/datum/reagent/consumable/limejuice = 10, /datum/reagent/consumable/strawberryjuice = 5, /datum/reagent/consumable/watermelonjuice = 10)
/datum/chemical_reaction/bug_zapper
name = "Bug Zapper"
- id = /datum/reagent/consumable/ethanol/bug_zapper
- results = list(/datum/reagent/consumable/ethanol/bug_zapper = 20) //Harder to make
+ id = /datum/reagent/consumable/ethanol/species_drink/bug_zapper
+ results = list(/datum/reagent/consumable/ethanol/species_drink/bug_zapper = 20) //Harder to make
required_reagents = list(/datum/reagent/consumable/lemonjuice = 10, /datum/reagent/teslium = 1, /datum/reagent/copper = 10)
/datum/chemical_reaction/mush_crush
name = "Mush Crush"
- id = /datum/reagent/consumable/ethanol/mush_crush
- results = list(/datum/reagent/consumable/ethanol/mush_crush = 10)
+ id = /datum/reagent/consumable/ethanol/species_drink/mush_crush
+ results = list(/datum/reagent/consumable/ethanol/species_drink/mush_crush = 10)
required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/ash = 5, /datum/reagent/toxin/coffeepowder = 10)
/datum/chemical_reaction/darkbrew
name = "Darkbrew"
- id = /datum/reagent/consumable/ethanol/darkbrew
- results = list(/datum/reagent/consumable/ethanol/darkbrew = 20)//Limited races use this
+ id = /datum/reagent/consumable/ethanol/species_drink/darkbrew
+ results = list(/datum/reagent/consumable/ethanol/species_drink/darkbrew = 20)//Limited races use this
required_reagents = list(/datum/reagent/liquid_dark_matter = 5, /datum/reagent/toxin/bungotoxin = 5, /datum/reagent/toxin/coffeepowder = 10)
/datum/chemical_reaction/hollow_bone
name = "Hollow Bone"
- id = /datum/reagent/consumable/ethanol/hollow_bone
- results = list(/datum/reagent/consumable/ethanol/hollow_bone = 10)
+ id = /datum/reagent/consumable/ethanol/species_drink/hollow_bone
+ results = list(/datum/reagent/consumable/ethanol/species_drink/hollow_bone = 10)
required_reagents = list(/datum/reagent/toxin/bonehurtingjuice = 5, /datum/reagent/consumable/milk = 10, /datum/reagent/consumable/coconutmilk = 10)
/datum/chemical_reaction/frisky_kitty
name = "Frisky Kitty"
- id = /datum/reagent/consumable/ethanol/frisky_kitty
- results = list(/datum/reagent/consumable/ethanol/frisky_kitty = 2)
+ id = /datum/reagent/consumable/ethanol/species_drink/frisky_kitty
+ results = list(/datum/reagent/consumable/ethanol/species_drink/frisky_kitty = 2)
required_reagents = list(/datum/reagent/consumable/catnip_tea = 1, /datum/reagent/consumable/milk = 1)
required_temp = 296 //Just above room temp (22.85'C)
/datum/chemical_reaction/jell_wyrm
name = "Jell Wyrm"
- id = /datum/reagent/consumable/ethanol/jell_wyrm
- results = list(/datum/reagent/consumable/ethanol/jell_wyrm = 2)
+ id = /datum/reagent/consumable/ethanol/species_drink/jell_wyrm
+ results = list(/datum/reagent/consumable/ethanol/species_drink/jell_wyrm = 2)
required_reagents = list(/datum/reagent/toxin/slimejelly = 1, /datum/reagent/toxin/carpotoxin = 1, /datum/reagent/carbondioxide = 5)
required_temp = 333 // (59.85'C)
/datum/chemical_reaction/laval_spit
name = "Laval Spit"
- id = /datum/reagent/consumable/ethanol/laval_spit
- results = list(/datum/reagent/consumable/ethanol/laval_spit = 20) //Limited use
+ id = /datum/reagent/consumable/ethanol/species_drink/laval_spit
+ results = list(/datum/reagent/consumable/ethanol/species_drink/laval_spit = 20) //Limited use
required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/consumable/ethanol/mauna_loa = 10, /datum/reagent/sulfur = 5)
required_temp = 900 // (626.85'C)
diff --git a/code/modules/holiday/halloween/bartholomew.dm b/code/modules/holiday/halloween/bartholomew.dm
index eb90a0c82d..c9a4a946a3 100644
--- a/code/modules/holiday/halloween/bartholomew.dm
+++ b/code/modules/holiday/halloween/bartholomew.dm
@@ -31,7 +31,7 @@
return
say("It doesn't seem like that's magical enough!")
-/obj/item/barthpot/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/barthpot/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!active)
say("Meow!")
return
diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm
index 01e71d1129..4561e0ae3e 100644
--- a/code/modules/holiday/halloween/jacqueen.dm
+++ b/code/modules/holiday/halloween/jacqueen.dm
@@ -76,7 +76,7 @@
health = 25
poof()
-/mob/living/simple_animal/jacq/attack_hand(mob/living/carbon/human/M)
+/mob/living/simple_animal/jacq/on_attack_hand(mob/living/carbon/human/M)
if(!active)
say("Hello there [gender_check(M)]!")
return ..()
@@ -406,14 +406,14 @@
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, GLUED_ITEM_TRAIT)
-/obj/item/clothing/suit/ghost_sheet/sticky/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/suit/ghost_sheet/sticky/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscarbon(user))
to_chat(user, "Boooooo~!")
return
else
..()
-/obj/item/clothing/suit/ghost_sheet/sticky/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/suit/ghost_sheet/sticky/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscarbon(user))
to_chat(user, "Boooooo~!")
return
diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm
index b6c89bcf0e..e4564ecb7e 100644
--- a/code/modules/holodeck/items.dm
+++ b/code/modules/holodeck/items.dm
@@ -105,10 +105,7 @@
if(user.transferItemToLoc(W, drop_location()))
visible_message(" [user] dunks [W] into \the [src]!")
-/obj/structure/holohoop/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/holohoop/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling))
var/mob/living/L = user.pulling
if(user.grab_state < GRAB_AGGRESSIVE)
@@ -164,7 +161,7 @@
/obj/machinery/readybutton/attackby(obj/item/W as obj, mob/user as mob, params)
to_chat(user, "The device is a solid button, there's nothing you can do with it!")
-/obj/machinery/readybutton/attack_hand(mob/user as mob)
+/obj/machinery/readybutton/on_attack_hand(mob/user as mob)
. = ..()
if(.)
return
diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm
index f686bee63a..169c9061d3 100644
--- a/code/modules/holodeck/turfs.dm
+++ b/code/modules/holodeck/turfs.dm
@@ -134,7 +134,7 @@
tiled_dirt = FALSE
baseturfs = /turf/open/floor/holofloor/snow
-/turf/open/floor/holofloor/snow/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/turf/open/floor/holofloor/snow/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm
index 70e204a14f..76e36a1725 100644
--- a/code/modules/hydroponics/fermenting_barrel.dm
+++ b/code/modules/hydroponics/fermenting_barrel.dm
@@ -56,7 +56,7 @@
else
return ..()
-/obj/structure/fermenting_barrel/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/fermenting_barrel/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
open = !open
if(open)
DISABLE_BITFIELD(reagents.reagents_holder_flags, DRAINABLE)
diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm
index 42674029fb..1f60afe655 100644
--- a/code/modules/hydroponics/grown/chili.dm
+++ b/code/modules/hydroponics/grown/chili.dm
@@ -80,10 +80,7 @@
foodtype = FRUIT
wine_power = 50
-/obj/item/reagent_containers/food/snacks/grown/ghost_chili/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/item/reagent_containers/food/snacks/grown/ghost_chili/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if( ismob(loc) )
held_mob = loc
START_PROCESSING(SSobj, src)
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index 164c27d105..ecbfa7584b 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -207,10 +207,7 @@
return ..()
-/obj/structure/bonfire/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/bonfire/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(burning)
to_chat(user, "You need to extinguish [src] before removing the logs!")
return
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index b673937c9c..06179d1087 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -888,10 +888,7 @@
return ..()
-/obj/machinery/hydroponics/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/hydroponics/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(issilicon(user)) //How does AI know what plant is?
return
if(harvest)
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index c3e0a7abcc..7c9f811c34 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -519,6 +519,7 @@
/obj/item/electronic_assembly/attack_self(mob/user)
+ set waitfor = FALSE
if(!check_interactivity(user))
return
if(opened)
@@ -611,7 +612,7 @@
return
..()
-/obj/item/electronic_assembly/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/electronic_assembly/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(anchored)
attack_self(user)
return
diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm
index 950525ab7f..96a732d08f 100644
--- a/code/modules/integrated_electronics/subtypes/weaponized.dm
+++ b/code/modules/integrated_electronics/subtypes/weaponized.dm
@@ -45,6 +45,9 @@
/obj/item/integrated_circuit/weaponized/weapon_firing/attackby(var/obj/O, var/mob/user)
if(istype(O, /obj/item/gun/energy))
var/obj/item/gun/gun = O
+ if(!gun.can_circuit)
+ to_chat(user, "[gun] does not fit into circuits.")
+ return
if(installed_gun)
to_chat(user, "There's already a weapon installed.")
return
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index e5d9672d4a..80ce2522ff 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -112,7 +112,7 @@
else
return ..()
-/obj/structure/bookcase/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/bookcase/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(. || !istype(user))
return
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index f65ea27216..f777246453 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -523,10 +523,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
else
return ..()
-/obj/machinery/libraryscanner/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/libraryscanner/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
usr.set_machine(src)
var/dat = "" //
if(cache)
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index d2da0f779e..8c9b0b53e1 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -149,8 +149,7 @@
if(100)
new /obj/item/clothing/head/bearpelt(src)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/closet/crate/secure/loot/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/closet/crate/secure/loot/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(locked)
to_chat(user, "The crate is locked with a Deca-code lock.")
var/input = input(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "") as text
diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm
index bf7a966f7d..006065d048 100644
--- a/code/modules/mining/aux_base.dm
+++ b/code/modules/mining/aux_base.dm
@@ -99,7 +99,6 @@ interface with the mining shuttle at the landing site if a mobile beacon is also
say("Shuttle interface failed.")
if(href_list["random"] && !possible_destinations)
- usr.changeNext_move(CLICK_CD_RAPID) //Anti-spam
var/list/all_mining_turfs = list()
for (var/z_level in SSmapping.levels_by_trait(ZTRAIT_MINING))
all_mining_turfs += Z_TURFS(z_level)
@@ -275,10 +274,7 @@ interface with the mining shuttle at the landing site if a mobile beacon is also
var/anti_spam_cd = 0 //The linking process might be a bit intensive, so this here to prevent over use.
var/console_range = 15 //Wifi range of the beacon to find the aux base console
-/obj/structure/mining_shuttle_beacon/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/mining_shuttle_beacon/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(anchored)
to_chat(user, "Landing zone already set.")
return
diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm
index d461523744..be0a41427f 100644
--- a/code/modules/mining/aux_base_camera.dm
+++ b/code/modules/mining/aux_base_camera.dm
@@ -187,7 +187,7 @@
if(LAZYLEN(S.rcd_vals(owner,B.RCD)))
rcd_target = S //If we don't break out of this loop we'll get the last placed thing
- owner.changeNext_move(CLICK_CD_RANGE)
+ owner.DelayNextAction(CLICK_CD_RANGE)
B.RCD.afterattack(rcd_target, owner, TRUE) //Activate the RCD and force it to work remotely!
playsound(target_turf, 'sound/items/deconstruct.ogg', 60, 1)
diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm
index ae2889e8a2..296513af8d 100644
--- a/code/modules/mining/equipment/marker_beacons.dm
+++ b/code/modules/mining/equipment/marker_beacons.dm
@@ -19,7 +19,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
singular_name = "marker beacon"
desc = "Prism-brand path illumination devices. Used by miners to mark paths and warn of danger."
icon = 'icons/obj/lighting.dmi'
- icon_state = "markerbronze"
+ icon_state = "marker"
merge_type = /obj/item/stack/marker_beacon
max_amount = 100
novariants = TRUE
@@ -103,7 +103,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
icon_state = "[initial(icon_state)][lowertext(picked_color)]-on"
set_light(light_range, light_power, GLOB.marker_beacon_colors[picked_color])
-/obj/structure/marker_beacon/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/marker_beacon/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm
index 133cb41c33..16dd893c3a 100644
--- a/code/modules/mining/equipment/resonator.dm
+++ b/code/modules/mining/equipment/resonator.dm
@@ -41,7 +41,7 @@
return
if(LAZYLEN(fields) < fieldlimit)
new /obj/effect/temp_visual/resonance(T, user, src, burst_time)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
/obj/item/resonator/pre_attack(atom/target, mob/user, params)
if(check_allowed_items(target, 1))
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index 2ca5f88ac8..c69e990033 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -167,10 +167,7 @@
qdel(src)
return TRUE
-/obj/item/gps/computer/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/item/gps/computer/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
attack_self(user)
//Bed
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index c0d63fab9c..4d0b7dff21 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -141,10 +141,7 @@ GLOBAL_LIST(labor_sheet_values)
icon_state = "console"
density = FALSE
-/obj/machinery/mineral/labor_points_checker/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/mineral/labor_points_checker/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
user.examinate(src)
/obj/machinery/mineral/labor_points_checker/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
index e39b833793..9710773309 100644
--- a/code/modules/mining/lavaland/ash_flora.dm
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -62,10 +62,7 @@
else
return ..()
-/obj/structure/flora/ash/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/flora/ash/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!harvested && !needs_sharp_harvest)
user.visible_message("[user] starts to harvest from [src].","You begin to harvest from [src].")
if(do_after(user, harvest_time, target = src))
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 8a7ae3ab39..e01438a905 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -667,6 +667,8 @@
var/bleed_stacks_per_hit = 3
total_mass = 2.75
total_mass_on = 5
+ attack_speed = 0
+ attack_unwieldlyness = CLICK_CD_MELEE * 0.5
/obj/item/melee/transforming/cleaving_saw/examine(mob/user)
. = ..()
@@ -685,8 +687,12 @@
return FALSE
. = ..()
if(.)
+ if(active)
+ attack_unwieldlyness = CLICK_CD_MELEE
+ else
+ attack_unwieldlyness = CLICK_CD_MELEE * 0.5
transform_cooldown = world.time + (CLICK_CD_MELEE * 0.5)
- user.changeNext_move(CLICK_CD_MELEE * 0.25)
+ user.SetNextAction(CLICK_CD_MELEE * 0.25, considered_action = FALSE, flush = TRUE)
/obj/item/melee/transforming/cleaving_saw/transform_messages(mob/living/user, supress_message_text)
if(!supress_message_text)
@@ -701,11 +707,6 @@
to_chat(user, "You accidentally cut yourself with [src], like a doofus!")
user.take_bodypart_damage(10)
-/obj/item/melee/transforming/cleaving_saw/melee_attack_chain(mob/user, atom/target, params)
- ..()
- if(!active)
- user.changeNext_move(CLICK_CD_MELEE * 0.5) //when closed, it attacks very rapidly
-
/obj/item/melee/transforming/cleaving_saw/nemesis_effects(mob/living/user, mob/living/target)
var/datum/status_effect/stacking/saw_bleed/B = target.has_status_effect(STATUS_EFFECT_SAWBLEED)
if(!B)
diff --git a/code/modules/mining/lavaland/ruins/gym.dm b/code/modules/mining/lavaland/ruins/gym.dm
index d454c3d118..c26631be74 100644
--- a/code/modules/mining/lavaland/ruins/gym.dm
+++ b/code/modules/mining/lavaland/ruins/gym.dm
@@ -8,7 +8,7 @@
var/list/hit_sounds = list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg',\
'sound/weapons/punch1.ogg', 'sound/weapons/punch2.ogg', 'sound/weapons/punch3.ogg', 'sound/weapons/punch4.ogg')
-/obj/structure/punching_bag/attack_hand(mob/user as mob)
+/obj/structure/punching_bag/on_attack_hand(mob/user as mob)
. = ..()
if(.)
return
@@ -29,7 +29,7 @@
/obj/structure/weightmachine/proc/AnimateMachine(mob/living/user)
return
-/obj/structure/weightmachine/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/weightmachine/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 6567793b80..143aba3fe4 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -79,8 +79,7 @@
no_destination_swap = 1
var/static/list/dumb_rev_heads = list()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/machinery/computer/shuttle/mining/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/computer/shuttle/mining/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(is_station_level(user.z) && user.mind && is_head_revolutionary(user) && !(user.mind in dumb_rev_heads))
to_chat(user, "You get a feeling that leaving the station might be a REALLY dumb idea...")
dumb_rev_heads += user.mind
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index fb37dcbca0..627d79d6ba 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -118,7 +118,7 @@
deathmessage = "blows apart!"
..()
-/mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M)
+/mob/living/simple_animal/hostile/mining_drone/on_attack_hand(mob/living/carbon/human/M)
. = ..()
if(.)
return
diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm
index f9d18fecc2..ae42ca4745 100644
--- a/code/modules/mining/satchel_ore_boxdm.dm
+++ b/code/modules/mining/satchel_ore_boxdm.dm
@@ -38,10 +38,7 @@
ui_interact(user)
. = ..()
-/obj/structure/ore_box/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/ore_box/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(Adjacent(user))
ui_interact(user)
diff --git a/code/modules/mob/clickdelay.dm b/code/modules/mob/clickdelay.dm
new file mode 100644
index 0000000000..b1df87303e
--- /dev/null
+++ b/code/modules/mob/clickdelay.dm
@@ -0,0 +1,200 @@
+/**
+ * CLICKDELAY HANDLING SYSTEM
+ * How this works is mobs can never do actions until their next_action is at or below world.time, but things can specify extra cooldown
+ * to check for either from the time of last_action or from the end of next_action.
+ *
+ * Clickdelay should always be checked via [CheckActionCooldown()], never manually!
+ */
+
+/mob
+ // CLICKDELAY AND RELATED
+ // Generic clickdelay - Hybrid time-since-last-attack and time-to-next-attack system.
+ // next_action is a hard cooldown, as Click()s will not pass unless it is passed.
+ // last_action is not a hard cooldown and different items can check for different delays.
+ /// Generic clickdelay variable. Marks down the last world.time we did something that should cause or impact generic clickdelay. This should be directly set or set using [DelayNextAction()]. This should only be checked using [CheckActionCooldown()].
+ var/last_action = 0
+ /**
+ * The difference between the above and this is this is set immediately before even the pre-attack begins to ensure clickdelay is respected.
+ * Then, it is flushed or discarded using [FlushLastAttack()] or [DiscardLastAttack()] respectively.
+ */
+
+ var/last_action_immediate = 0
+ /// Generic clickdelay variable. Next world.time we should be able to do something that respects generic clickdelay. This should be set using [DelayNextAction()] This should only be checked using [CheckActionCooldown()].
+ var/next_action = 0
+ /// Ditto
+ var/next_action_immediate = 0
+ /// Default clickdelay for an UnarmedAttack() that successfully passes. Respects action_cooldown_mod.
+ var/unarmed_attack_speed = CLICK_CD_MELEE
+ /// Simple modification variable multiplied to next action modifier on adjust and on checking time since last action using [CheckActionCooldown()].
+ /// This should only be manually modified using multipliers.
+ var/action_cooldown_mod = 1
+ /// Simple modification variable added to amount on adjust and on checking time since last action using [CheckActionCooldown()].
+ /// This should only be manually modified via addition.
+ var/action_cooldown_adjust = 0
+
+ // Resisting - While resisting will give generic clickdelay, it is also on its own resist delay system. However, resisting does not check generic movedelay.
+ // Resist cooldown should only be set at the start of a resist chain - whether this is clicking an alert button, pressing or hotkeying the resist button, or moving to resist out of a locker.
+ /*
+ * Special clickdelay variable for resisting. Last time we did a special action like resisting. This should only be set using [MarkResistTime()].
+ * Use [CheckResistCooldown()] to check cooldowns, this should only be used for the resist action bar visual.
+ */
+ var/last_resist = 0
+ /// How long we should wait before allowing another resist. This should only be manually modified using multipliers.
+ var/resist_cooldown = CLICK_CD_RESIST
+ /// Minimum world time for another resist. This should only be checked using [CheckResistCooldown()].
+ var/next_resist = 0
+
+/**
+ * Applies a delay to next_action before we can do our next action.
+ *
+ * @params
+ * * amount - Amount to delay by
+ * * ignore_mod - ignores next action adjust and mult
+ * * considered_action - Defaults to TRUE - If TRUE, sets last_action to world.time.
+ * * immediate - defaults to TRUE - if TRUE, writes to cached/last_attack_immediate instead of last_attack. This ensures it can't collide with any delay checks in the actual attack.
+ * * flush - defaults to FALSE - Use this while using this proc outside of clickcode to ensure everything is set properly. This should never be set to TRUE if this is called from clickcode.
+ */
+/mob/proc/DelayNextAction(amount = 0, ignore_mod = FALSE, considered_action = TRUE, immediate = TRUE, flush = FALSE)
+ if(immediate)
+ if(considered_action)
+ last_action_immediate = world.time
+ next_action_immediate = max(next_action, world.time + (ignore_mod? amount : (amount * GetActionCooldownMod() + GetActionCooldownAdjust())))
+ else
+ if(considered_action)
+ last_action = world.time
+ next_action = max(next_action, world.time + (ignore_mod? amount : (amount * GetActionCooldownMod() + GetActionCooldownAdjust())))
+ if(flush)
+ FlushCurrentAction()
+ else
+ hud_used?.clickdelay?.mark_dirty()
+
+/**
+ * Get estimated time of next attack.
+ */
+/mob/proc/EstimatedNextActionTime()
+ var/attack_speed = unarmed_attack_speed * GetActionCooldownMod() + GetActionCooldownAdjust()
+ var/obj/item/I = get_active_held_item()
+ if(I)
+ attack_speed = I.GetEstimatedAttackSpeed()
+ if(!I.clickdelay_mod_bypass)
+ attack_speed = attack_speed * GetActionCooldownMod() + GetActionCooldownAdjust()
+ return max(next_action, next_action_immediate, max(last_action, last_action_immediate) + attack_speed)
+
+/**
+ * Sets our next action to. The difference is DelayNextAction cannot reduce next_action under any circumstances while this can.
+ */
+/mob/proc/SetNextAction(amount = 0, ignore_mod = FALSE, considered_action = TRUE, immediate = TRUE, flush = FALSE)
+ if(immediate)
+ if(considered_action)
+ last_action_immediate = world.time
+ next_action_immediate = world.time + (ignore_mod? amount : (amount * GetActionCooldownMod() + GetActionCooldownAdjust()))
+ else
+ if(considered_action)
+ last_action = world.time
+ next_action = world.time + (ignore_mod? amount : (amount * GetActionCooldownMod() + GetActionCooldownAdjust()))
+ if(flush)
+ FlushCurrentAction()
+ else
+ hud_used?.clickdelay?.mark_dirty()
+
+/**
+ * Checks if we can do another action.
+ * Returns TRUE if we can and FALSE if we cannot.
+ *
+ * @params
+ * * cooldown - Time required since last action. Defaults to 0.5
+ * * from_next_action - Defaults to FALSE. Should we check from the tail end of next_action instead of last_action?
+ * * ignore_mod - Defaults to FALSE. Ignore all adjusts and multipliers. Do not use this unless you know what you are doing and have a good reason.
+ * * ignore_next_action - Defaults to FALSE. Ignore next_action and only care about cooldown param and everything else. Generally unused.
+ * * immediate - Defaults to FALSE. Checks last action using immediate, used on the head end of an attack. This is to prevent colliding attacks in case of sleep. Not that you should sleep() in an attack but.. y'know.
+ */
+/mob/proc/CheckActionCooldown(cooldown = 0.5, from_next_action = FALSE, ignore_mod = FALSE, ignore_next_action = FALSE, immediate = FALSE)
+ return (ignore_next_action || (world.time >= (immediate? next_action_immediate : next_action))) && \
+ (world.time >= ((from_next_action? (immediate? next_action_immediate : next_action) : (immediate? last_action_immediate : last_action)) + max(0, ignore_mod? cooldown : (cooldown * GetActionCooldownMod() + GetActionCooldownAdjust()))))
+
+/**
+ * Gets action_cooldown_mod.
+ */
+/mob/proc/GetActionCooldownMod()
+ return action_cooldown_mod
+
+/**
+ * Gets action_cooldown_adjust
+ */
+/mob/proc/GetActionCooldownAdjust()
+ return action_cooldown_adjust
+
+/**
+ * Flushes last_action and next_action
+ */
+/mob/proc/FlushCurrentAction()
+ last_action = last_action_immediate
+ next_action = next_action_immediate
+ hud_used?.clickdelay?.mark_dirty()
+
+/**
+ * Discards last_action and next_action
+ */
+/mob/proc/DiscardCurrentAction()
+ last_action_immediate = last_action
+ next_action_immediate = next_action
+ hud_used?.clickdelay?.mark_dirty()
+
+/**
+ * Checks if we can resist again.
+ */
+/mob/proc/CheckResistCooldown()
+ return (world.time >= next_resist)
+
+/**
+ * Mark the last resist as now.
+ *
+ * @params
+ * * extra_cooldown - Extra cooldown to apply to next_resist. Defaults to this mob's resist_cooldown.
+ * * override - Defaults to FALSE - if TRUE, extra_cooldown will replace the old next_resist even if the old is longer.
+ */
+/mob/proc/MarkResistTime(extra_cooldown = resist_cooldown, override = FALSE)
+ last_resist = world.time
+ next_resist = override? (world.time + extra_cooldown) : max(next_resist, world.time + extra_cooldown)
+ hud_used?.resistdelay?.mark_dirty()
+
+/atom
+ // Standard clickdelay variables
+ // These 3 are all handled at base of atom/attack_hand so uh.. yeah. Make sure that's called.
+ /// Amount of time to check for from a mob's last attack to allow an attack_hand().
+ var/attack_hand_speed = CLICK_CD_MELEE
+ /// Amount of time to hard stagger (no clicking at all) the mob post attack_hand(). Lower = better
+ var/attack_hand_unwieldlyness = 0
+ /// Should we set last action for attack hand? This implies that attack_hands to this atom should flush to clickdelay buffers instead of discarding.
+ var/attack_hand_is_action = FALSE
+
+/obj/item
+ // Standard clickdelay variables
+ /// Amount of time to check for from a mob's last attack, checked before an attack happens. Lower = faster attacks
+ var/attack_speed = CLICK_CD_MELEE
+ /// Amount of time to hard-stagger (no clicking at all) the mob when attacking. Lower = better
+ var/attack_unwieldlyness = 0
+ /// This item bypasses any click delay mods
+ var/clickdelay_mod_bypass = FALSE
+ /// This item checks clickdelay from a user's delayed next action variable rather than the last time they attacked.
+ var/clickdelay_from_next_action = FALSE
+ /// This item ignores next action delays.
+ var/clickdelay_ignores_next_action = FALSE
+
+/**
+ * Checks if a user's clickdelay is met for a standard attack, this is called before an attack happens.
+ */
+/obj/item/proc/CheckAttackCooldown(mob/user, atom/target)
+ return user.CheckActionCooldown(attack_speed, clickdelay_from_next_action, clickdelay_mod_bypass, clickdelay_ignores_next_action)
+
+/**
+ * Called after a successful attack to set a mob's clickdelay.
+ */
+/obj/item/proc/ApplyAttackCooldown(mob/user, atom/target, attackchain_flags)
+ user.DelayNextAction(attack_unwieldlyness, clickdelay_mod_bypass, !(attackchain_flags & ATTACK_IGNORE_ACTION))
+
+/**
+ * Get estimated time that a user has to not attack for to use us
+ */
+/obj/item/proc/GetEstimatedAttackSpeed()
+ return attack_speed
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 83cc09a624..caebb9cf10 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -5,13 +5,11 @@
/mob/proc/get_active_held_item()
return get_item_for_held_index(active_hand_index)
-
//Finds the opposite limb for the active one (eg: upper left arm will find the item in upper right arm)
//So we're treating each "pair" of limbs as a team, so "both" refers to them
/mob/proc/get_inactive_held_item()
return get_item_for_held_index(get_inactive_hand_index())
-
//Finds the opposite index for the active one (eg: upper left arm will find the item in upper right arm)
//So we're treating each "pair" of limbs as a team, so "both" refers to them
/mob/proc/get_inactive_hand_index()
@@ -24,12 +22,9 @@
other_hand = 0
return other_hand
-
/mob/proc/get_item_for_held_index(i)
if(i > 0 && i <= held_items.len)
return held_items[i]
- return FALSE
-
//Odd = left. Even = right
/mob/proc/held_index_to_dir(i)
@@ -37,17 +32,14 @@
return "r"
return "l"
-
//Check we have an organ for this hand slot (Dismemberment), Only relevant for humans
/mob/proc/has_hand_for_held_index(i)
return TRUE
-
//Check we have an organ for our active hand slot (Dismemberment),Only relevant for humans
/mob/proc/has_active_hand()
return has_hand_for_held_index(active_hand_index)
-
//Finds the first available (null) index OR all available (null) indexes in held_items based on a side.
//Lefts: 1, 3, 5, 7...
//Rights:2, 4, 6, 8...
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index 478599e2c0..56582386f1 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -28,20 +28,15 @@
to_chat(src, "The blood soaks through your bandage.")
-/mob/living/carbon/monkey/handle_blood()
- if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
- //Blood regeneration if there is some space
- if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio))
- blood_volume += 0.1 // regenerate blood VERY slowly
- if(blood_volume < (BLOOD_VOLUME_OKAY * blood_ratio))
- adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1))
-
// Takes care blood loss and regeneration
/mob/living/carbon/human/handle_blood()
if(NOBLOOD in dna.species.species_traits || bleedsuppress || (HAS_TRAIT(src, TRAIT_FAKEDEATH)))
return
+ if(HAS_TRAIT(src, TRAIT_NOMARROW)) //Bloodsuckers don't need to be here.
+ return
+
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood.
//Blood regeneration if there is some space
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
index d1258ce6e4..891243496a 100644
--- a/code/modules/mob/living/brain/MMI.dm
+++ b/code/modules/mob/living/brain/MMI.dm
@@ -39,7 +39,9 @@
laws.set_laws_config()
/obj/item/mmi/attackby(obj/item/O, mob/user, params)
- user.changeNext_move(CLICK_CD_MELEE)
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
+ user.DelayNextAction()
if(istype(O, /obj/item/organ/brain)) //Time to stick a brain in it --NEO
var/obj/item/organ/brain/newbrain = O
if(brain)
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index b6f8dd349b..a853416e6f 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -102,7 +102,7 @@
to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a brain.")
/obj/item/organ/brain/attackby(obj/item/O, mob/user, params)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
if(brainmob)
O.attack(brainmob, user) //Oh noooeeeee
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index 5b92bf3dea..5081fd8a14 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -45,7 +45,7 @@ In all, this is a lot like the monkey code. /N
return attack_alien(L)
-/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M)
+/mob/living/carbon/alien/on_attack_hand(mob/living/carbon/human/M)
. = ..()
if(.) //To allow surgery to return properly.
return
@@ -74,7 +74,6 @@ In all, this is a lot like the monkey code. /N
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
apply_damage(rand(1, 3), BRUTE, affecting)
-
/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M)
. = ..()
if(.)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 727a22f844..d0addbab21 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -57,8 +57,17 @@
/mob/living/carbon/alien/humanoid/Topic(href, href_list)
..()
- //strip panel
+ //strip panel & embeds
if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
+ if(href_list["embedded_object"])
+ var/obj/item/bodypart/L = locate(href_list["embedded_limb"]) in bodyparts
+ if(!L)
+ return
+ var/obj/item/I = locate(href_list["embedded_object"]) in L.embedded_objects
+ if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the alien anymore
+ return
+ SEND_SIGNAL(src, COMSIG_CARBON_EMBED_RIP, I, L)
+ return
if(href_list["pouches"])
visible_message("[usr] tries to empty [src]'s pouches.", \
"[usr] tries to empty [src]'s pouches.")
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
index 5ebf6210d0..8177360d4a 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
@@ -21,7 +21,7 @@
"[user] has [hitverb] [src]!", null, COMBAT_MESSAGE_RANGE)
return 1
-/mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M)
+/mob/living/carbon/alien/humanoid/on_attack_hand(mob/living/carbon/human/M)
. = ..()
if(.) //To allow surgery to return properly.
return
diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
index 7dabcf5abf..5832996a2c 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
@@ -1,6 +1,6 @@
-/mob/living/carbon/alien/larva/attack_hand(mob/living/carbon/human/M)
+/mob/living/carbon/alien/larva/on_attack_hand(mob/living/carbon/human/M)
. = ..()
if(. || M.a_intent == INTENT_HELP || M.a_intent == INTENT_GRAB)
return
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index c5a69553aa..ad8828572c 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -58,8 +58,7 @@
/obj/item/clothing/mask/facehugger/attack_alien(mob/user) //can be picked up by aliens
return attack_hand(user)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/clothing/mask/facehugger/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/mask/facehugger/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if((stat == CONSCIOUS && !sterile) && !isalien(user))
if(Leap(user))
return
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 33d6f09c5a..edb681e60f 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -311,14 +311,11 @@
return
if(restrained())
// too soon.
- if(last_special > world.time)
- return
var/buckle_cd = 600
if(handcuffed)
var/obj/item/restraints/O = src.get_item_by_slot(SLOT_HANDCUFFED)
buckle_cd = O.breakouttime
- changeNext_move(min(CLICK_CD_BREAKOUT, buckle_cd))
- last_special = world.time + min(CLICK_CD_BREAKOUT, buckle_cd)
+ MarkResistTime()
visible_message("[src] attempts to unbuckle [p_them()]self!", \
"You attempt to unbuckle yourself... (This will take around [round(buckle_cd/600,1)] minute\s, and you need to stay still.)")
if(do_after(src, buckle_cd, 0, target = src, required_mobility_flags = MOBILITY_RESIST))
@@ -332,39 +329,26 @@
buckled.user_unbuckle_mob(src,src)
/mob/living/carbon/resist_fire()
- if(last_special > world.time)
- return
fire_stacks -= 5
DefaultCombatKnockdown(60, TRUE, TRUE)
spin(32,2)
visible_message("[src] rolls on the floor, trying to put [p_them()]self out!", \
"You stop, drop, and roll!")
- last_special = world.time + 30
+ MarkResistTime(30)
sleep(30)
if(fire_stacks <= 0)
visible_message("[src] has successfully extinguished [p_them()]self!", \
"You extinguish yourself.")
ExtinguishMob()
-/mob/living/carbon/resist_restraints(ignore_delay = FALSE)
+/mob/living/carbon/resist_restraints()
var/obj/item/I = null
- var/type = 0
- if(!ignore_delay && (last_special > world.time))
- to_chat(src, "You don't have the energy to resist your restraints that fast!")
- return
if(handcuffed)
I = handcuffed
- type = 1
else if(legcuffed)
I = legcuffed
- type = 2
if(I)
- if(type == 1)
- changeNext_move(min(CLICK_CD_BREAKOUT, I.breakouttime))
- last_special = world.time + CLICK_CD_BREAKOUT
- if(type == 2)
- changeNext_move(min(CLICK_CD_RANGE, I.breakouttime))
- last_special = world.time + CLICK_CD_RANGE
+ MarkResistTime()
cuff_resist(I)
/mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0)
@@ -409,7 +393,7 @@
if (W)
W.layer = initial(W.layer)
W.plane = initial(W.plane)
- changeNext_move(0)
+ SetNextAction(0)
if (legcuffed)
var/obj/item/W = legcuffed
legcuffed = null
@@ -422,7 +406,7 @@
if (W)
W.layer = initial(W.layer)
W.plane = initial(W.plane)
- changeNext_move(0)
+ SetNextAction(0)
update_equipment_speed_mods() // In case cuffs ever change speed
/mob/living/carbon/proc/clear_cuffs(obj/item/I, cuff_break)
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 66a0b7869d..fe16beb0bc 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -69,7 +69,7 @@
var/totitemdamage = pre_attacked_by(I, user) * damage_multiplier
var/impacting_zone = (user == src)? check_zone(user.zone_selected) : ran_zone(user.zone_selected)
var/list/block_return = list()
- if((user != src) && (mob_run_block(I, totitemdamage, "the [I]", ((attackchain_flags & ATTACKCHAIN_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, impacting_zone, block_return) & BLOCK_SUCCESS))
+ if((user != src) && (mob_run_block(I, totitemdamage, "the [I]", ((attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, impacting_zone, block_return) & BLOCK_SUCCESS))
return FALSE
totitemdamage = block_calculate_resultant_damage(totitemdamage, block_return)
var/obj/item/bodypart/affecting = get_bodypart(impacting_zone)
@@ -105,8 +105,7 @@
/mob/living/carbon/attack_drone(mob/living/simple_animal/drone/user)
return //so we don't call the carbon's attack_hand().
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/mob/living/carbon/attack_hand(mob/living/carbon/human/user, act_intent, unarmed_attack_flags)
+/mob/living/carbon/on_attack_hand(mob/living/carbon/human/user, act_intent, unarmed_attack_flags)
. = ..()
if(.) //was the attack blocked?
return
@@ -146,7 +145,7 @@
if(M.a_intent == INTENT_HELP)
help_shake_act(M)
- return FALSE
+ return TRUE
. = ..()
if(.) //successful monkey bite.
@@ -155,7 +154,6 @@
ForceContractDisease(D)
return TRUE
-
/mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M)
. = ..()
if(!.)
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index a05480ee01..2ce59fb790 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -24,7 +24,7 @@
var/obj/item/head = null
var/obj/item/gloves = null //only used by humans
- var/obj/item/shoes = null //only used by humans.
+ var/obj/item/clothing/shoes/shoes = null //only used by humans.
var/obj/item/clothing/glasses/glasses = null //only used by humans.
var/obj/item/ears = null //only used by humans.
diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm
index 24eb5d7234..96517d5ea2 100644
--- a/code/modules/mob/living/carbon/human/dummy.dm
+++ b/code/modules/mob/living/carbon/human/dummy.dm
@@ -4,6 +4,10 @@
status_flags = GODMODE|CANPUSH
mouse_drag_pointer = MOUSE_INACTIVE_POINTER
var/in_use = FALSE
+ vore_flags = NO_VORE
+
+/mob/living/carbon/human/vore
+ vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 10192f9d21..65b2931e08 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -250,7 +250,7 @@
msg += "[t_He] look[p_s()] extremely disgusted.\n"
var/apparent_blood_volume = blood_volume
- if(skin_tone == "albino")
+ if(dna.species.use_skintones && skin_tone == "albino")
apparent_blood_volume -= 150 // enough to knock you down one tier
switch(apparent_blood_volume)
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 2802ac9e3b..145db1be1e 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -170,7 +170,11 @@
if(SLOT_SHOES in obscured)
dat += "| Shoes: | Obscured |
"
else
- dat += "| Shoes: | [(shoes && !(shoes.item_flags & ABSTRACT)) ? shoes : "Empty"] |
"
+ dat += "| Shoes: | [(shoes && !(shoes.item_flags & ABSTRACT)) ? shoes : "Empty"]"
+ if(shoes && shoes.can_be_tied && shoes.tied != SHOES_KNOTTED)
+ dat += " [shoes.tied ? "Untie shoes" : "Knot shoes"]"
+
+ dat += " |
"
if(SLOT_GLOVES in obscured)
dat += "| Gloves: | Obscured |
"
@@ -294,6 +298,12 @@
if (!strip_silence)
to_chat(src, "You feel your [pocket_side] pocket being fumbled with!")
+ if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY, null, FALSE))
+ // separate from first canusetopic
+ var/mob/living/user = usr
+ if(istype(user) && href_list["shoes"] && (user.mobility_flags & MOBILITY_USE)) // we need to be on the ground, so we'll be a bit looser
+ shoes.handle_tying(usr)
+
..() //CITADEL CHANGE - removes a tab from behind this ..() so that flavortext can actually be examined
@@ -390,7 +400,7 @@
// Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access
var/allowed_access = null
var/obj/item/clothing/glasses/G = H.glasses
- if (!(G.obj_flags |= EMAGGED))
+ if (!(G.obj_flags & EMAGGED))
if(H.wear_id)
var/list/access = H.wear_id.GetAccess()
if(ACCESS_SEC_DOORS in access)
@@ -735,8 +745,7 @@
/mob/living/carbon/human/resist_restraints()
if(wear_suit && wear_suit.breakouttime)
- changeNext_move(CLICK_CD_BREAKOUT)
- last_special = world.time + CLICK_CD_BREAKOUT
+ MarkResistTime()
cuff_resist(wear_suit)
else
..()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 6737176d09..1673c57a80 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -122,7 +122,7 @@
apply_damage(15, BRUTE, wound_bonus=10)
return 1
-/mob/living/carbon/human/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/mob/living/carbon/human/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.) //To allow surgery to return properly.
return
@@ -131,6 +131,9 @@
dna.species.spec_attack_hand(H, src, null, act_intent, unarmed_attack_flags)
/mob/living/carbon/human/attack_paw(mob/living/carbon/monkey/M)
+ if(!M.CheckActionCooldown(CLICK_CD_MELEE))
+ return
+ M.DelayNextAction()
var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
if(!affecting)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index aea4ee2ead..13456ed61c 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -102,7 +102,7 @@
"HUMAN_PARRY_MININUM_EFFICIENCY" = 0.9
)
-/mob/living/carbon/human/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, parry_efficiency, parry_time)
+/mob/living/carbon/human/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time)
var/datum/block_parry_data/D = return_block_parry_datum(block_parry_data)
if(!owner.Adjacent(attacker))
return ..()
@@ -110,7 +110,7 @@
return ..()
visible_message("[src] strikes back perfectly at [attacker], staggering them!")
if(D.parry_data["HUMAN_PARRY_PUNCH"])
- UnarmedAttack(attacker, TRUE, INTENT_HARM, UNARMED_ATTACK_PARRY)
+ UnarmedAttack(attacker, TRUE, INTENT_HARM, ATTACK_IS_PARRY_COUNTERATTACK | ATTACK_IGNORE_ACTION | ATTACK_IGNORE_CLICKDELAY | NO_AUTO_CLICKDELAY_HANDLING)
var/mob/living/L = attacker
if(istype(L))
L.Stagger(D.parry_data["HUMAN_PARRY_STAGGER"])
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index d703f6a4e2..22cb10026b 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -91,6 +91,7 @@
return " (as [get_id_name("Unknown")])"
/mob/living/carbon/human/proc/forcesay(list/append) //this proc is at the bottom of the file because quote fuckery makes notepad++ cri
+ set waitfor = FALSE // WINGET IS A SLEEP. DO. NOT. SLEEP.
if(stat == CONSCIOUS)
if(client)
var/temp = winget(client, "input", "text")
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 84d1f5a270..6e703fdbd7 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -105,6 +105,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/whitelisted = 0 //Is this species restricted to certain players?
var/whitelist = list() //List the ckeys that can use this species, if it's whitelisted.: list("John Doe", "poopface666", "SeeALiggerPullTheTrigger") Spaces & capitalization can be included or ignored entirely for each key as it checks for both.
var/icon_limbs //Overrides the icon used for the limbs of this species. Mainly for downstream, and also because hardcoded icons disgust me. Implemented and maintained as a favor in return for a downstream's implementation of synths.
+ var/species_type
+
+ var/tail_type //type of tail i.e. mam_tail
+ var/wagging_type //type of wagging i.e. waggingtail_lizard
/// Our default override for typing indicator state
var/typing_indicator_state
@@ -113,14 +117,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
// PROCS //
///////////
-
/datum/species/New()
if(!limbs_id) //if we havent set a limbs id to use, just use our own id
limbs_id = id
..()
-
/proc/generate_selectable_species(clear = FALSE)
if(clear)
GLOB.roundstart_races = list()
@@ -1061,7 +1063,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
H.adjustBruteLoss(1)
/datum/species/proc/spec_death(gibbed, mob/living/carbon/human/H)
- return
+ if(H)
+ stop_wagging_tail(H)
/datum/species/proc/auto_equip(mob/living/carbon/human/H)
// handles the equipping of species-specific gear
@@ -1284,9 +1287,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/check_weakness(obj/item, mob/living/attacker)
return FALSE
-////////
- //LIFE//
- ////////
+/////////////
+////LIFE////
+////////////
/datum/species/proc/handle_digestion(mob/living/carbon/human/H)
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
@@ -1445,7 +1448,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
target.grabbedby(user)
return 1
-/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style, unarmed_attack_flags = NONE)
+/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style, attackchain_flags = NONE)
if(!attacker_style && HAS_TRAIT(user, TRAIT_PACIFISM))
to_chat(user, "You don't want to harm [target]!")
return FALSE
@@ -1457,7 +1460,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
target_message = "[target] blocks your attack!")
return FALSE
- if(!(unarmed_attack_flags & UNARMED_ATTACK_PARRY))
+ if(!(attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK))
if(HAS_TRAIT(user, TRAIT_PUGILIST))//CITADEL CHANGE - makes punching cause staminaloss but funny martial artist types get a discount
user.adjustStaminaLossBuffered(1.5)
else
@@ -1499,7 +1502,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected))
var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases
- if(unarmed_attack_flags & UNARMED_ATTACK_PARRY)
+ if(attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK)
miss_chance = 0
else
if(user.dna.species.punchdamagelow)
@@ -1686,7 +1689,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/spec_hitby(atom/movable/AM, mob/living/carbon/human/H)
return
-/datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style, act_intent, unarmed_attack_flags)
+/datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style, act_intent, attackchain_flags)
if(!istype(M))
return
CHECK_DNA_AND_SPECIES(M)
@@ -1706,7 +1709,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
grab(M, H, attacker_style)
if("harm")
- harm(M, H, attacker_style, unarmed_attack_flags)
+ harm(M, H, attacker_style, attackchain_flags)
if("disarm")
disarm(M, H, attacker_style)
@@ -1716,7 +1719,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
// Allows you to put in item-specific reactions based on species
if(user != H)
var/list/block_return = list()
- if(H.mob_run_block(I, totitemdamage, "the [I.name]", ((attackchain_flags & ATTACKCHAIN_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, affecting.body_zone, block_return) & BLOCK_SUCCESS)
+ if(H.mob_run_block(I, totitemdamage, "the [I.name]", ((attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, affecting.body_zone, block_return) & BLOCK_SUCCESS)
return 0
totitemdamage = block_calculate_resultant_damage(totitemdamage, block_return)
if(H.check_martial_melee_block())
@@ -1820,6 +1823,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return TRUE
CHECK_DNA_AND_SPECIES(M)
CHECK_DNA_AND_SPECIES(H)
+ if(!M.CheckActionCooldown())
+ return
+ M.DelayNextAction(CLICK_CD_MELEE)
if(!istype(M)) //sanity check for drones.
return TRUE
@@ -2237,12 +2243,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/ExtinguishMob(mob/living/carbon/human/H)
return
-
////////////
//Stun//
////////////
/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount)
+ if(H)
+ stop_wagging_tail(H)
+
. = stunmod * H.physiology.stun_mod * amount
//////////////
@@ -2260,11 +2268,30 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
////////////////
/datum/species/proc/can_wag_tail(mob/living/carbon/human/H)
- return FALSE
+ if(!tail_type || !wagging_type)
+ return FALSE
+ else
+ return mutant_bodyparts[tail_type] || mutant_bodyparts[wagging_type]
/datum/species/proc/is_wagging_tail(mob/living/carbon/human/H)
- return FALSE
+ return mutant_bodyparts[wagging_type]
/datum/species/proc/start_wagging_tail(mob/living/carbon/human/H)
+ if(tail_type && wagging_type)
+ if(mutant_bodyparts[tail_type])
+ mutant_bodyparts[wagging_type] = mutant_bodyparts[tail_type]
+ mutant_bodyparts -= tail_type
+ if(tail_type == "tail_lizard") //special lizard thing
+ mutant_bodyparts["waggingspines"] = mutant_bodyparts["spines"]
+ mutant_bodyparts -= "spines"
+ H.update_body()
/datum/species/proc/stop_wagging_tail(mob/living/carbon/human/H)
+ if(tail_type && wagging_type)
+ if(mutant_bodyparts[wagging_type])
+ mutant_bodyparts[tail_type] = mutant_bodyparts[wagging_type]
+ mutant_bodyparts -= wagging_type
+ if(tail_type == "tail_lizard") //special lizard thing
+ mutant_bodyparts["spines"] = mutant_bodyparts["waggingspines"]
+ mutant_bodyparts -= "waggingspines"
+ H.update_body()
diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm
index 9036aa10ec..38e10e8662 100644
--- a/code/modules/mob/living/carbon/human/species_types/abductors.dm
+++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm
@@ -6,6 +6,7 @@
species_traits = list(NOBLOOD,NOEYES,NOGENITALS,NOAROUSAL,HAS_FLESH,HAS_BONE)
inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_CHUNKYFINGERS,TRAIT_NOHUNGER,TRAIT_NOBREATH)
mutanttongue = /obj/item/organ/tongue/abductor
+ species_type = "alien"
/datum/species/abductor/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm
index 94f64ceacb..c5b57b82ab 100644
--- a/code/modules/mob/living/carbon/human/species_types/android.dm
+++ b/code/modules/mob/living/carbon/human/species_types/android.dm
@@ -11,6 +11,7 @@
mutanttongue = /obj/item/organ/tongue/robot
species_language_holder = /datum/language_holder/synthetic
limbs_id = "synth"
+ species_type = "robotic"
/datum/species/android/on_species_gain(mob/living/carbon/C)
. = ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/angel.dm b/code/modules/mob/living/carbon/human/species_types/angel.dm
index 81c016ec96..2cf054c7b9 100644
--- a/code/modules/mob/living/carbon/human/species_types/angel.dm
+++ b/code/modules/mob/living/carbon/human/species_types/angel.dm
@@ -9,6 +9,7 @@
blacklisted = 1
limbs_id = "human"
skinned_type = /obj/item/stack/sheet/animalhide/human
+ species_type = "human" //they're a kind of human
var/datum/action/innate/flight/fly
diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
index fb52d10be4..2a955e28a4 100644
--- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
@@ -17,32 +17,6 @@
exotic_bloodtype = "BUG"
exotic_blood_color = BLOOD_COLOR_BUG
-/datum/species/insect/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- stop_wagging_tail(H)
-
-/datum/species/insect/spec_stun(mob/living/carbon/human/H,amount)
- if(H)
- stop_wagging_tail(H)
- . = ..()
-
-/datum/species/insect/can_wag_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["mam_tail"] || mutant_bodyparts["mam_waggingtail"]
-
-/datum/species/insect/is_wagging_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["mam_waggingtail"]
-
-/datum/species/insect/start_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["mam_tail"])
- mutant_bodyparts["mam_waggingtail"] = mutant_bodyparts["mam_tail"]
- mutant_bodyparts -= "mam_tail"
- H.update_body()
-
-/datum/species/insect/stop_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["mam_waggingtail"])
- mutant_bodyparts["mam_tail"] = mutant_bodyparts["mam_waggingtail"]
- mutant_bodyparts -= "mam_waggingtail"
- H.update_body()
-
-/datum/species/insect/qualifies_for_rank(rank, list/features)
- return TRUE
+ tail_type = "mam_tail"
+ wagging_type = "mam_waggingtail"
+ species_type = "insect"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species_types/corporate.dm b/code/modules/mob/living/carbon/human/species_types/corporate.dm
index e062e1cbf7..a2597ed286 100644
--- a/code/modules/mob/living/carbon/human/species_types/corporate.dm
+++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm
@@ -17,4 +17,5 @@
species_traits = list(NOBLOOD,EYECOLOR,NOGENITALS)
inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER)
sexes = 0
- gib_types = /obj/effect/gibspawner/robot
\ No newline at end of file
+ gib_types = /obj/effect/gibspawner/robot
+ species_type = "robotic"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
index 29341646a0..d8dfe63b35 100644
--- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -14,6 +14,7 @@
limbs_id = "human"
skinned_type = /obj/item/stack/sheet/animalhide/human
has_field_of_vision = FALSE //Too much of a trouble, their vision is already bound to their severed head.
+ species_type = "undead"
var/pumpkin = FALSE
var/obj/item/dullahan_relay/myhead
diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm
index 3c1d877543..a465e7c3a9 100644
--- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm
@@ -18,6 +18,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
mutant_organs = list(/obj/item/organ/dwarfgland) //Dwarven alcohol gland, literal gland warrior
mutantliver = /obj/item/organ/liver/dwarf //Dwarven super liver (Otherwise they r doomed)
species_language_holder = /datum/language_holder/dwarf
+ species_type = "human" //a kind of human
/mob/living/carbon/human/species/dwarf //species admin spawn path
race = /datum/species/dwarf //and the race the path is set to.
diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm
index 2f0595e2c0..b760fd0aee 100644
--- a/code/modules/mob/living/carbon/human/species_types/felinid.dm
+++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm
@@ -9,37 +9,9 @@
mutantears = /obj/item/organ/ears/cat
mutanttail = /obj/item/organ/tail/cat
-/datum/species/human/felinid/qualifies_for_rank(rank, list/features)
- return TRUE
-
-//Curiosity killed the cat's wagging tail.
-/datum/species/human/felinid/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- stop_wagging_tail(H)
-
-/datum/species/human/felinid/spec_stun(mob/living/carbon/human/H,amount)
- if(H)
- stop_wagging_tail(H)
- . = ..()
-
-
-/datum/species/human/felinid/can_wag_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["mam_tail"] || mutant_bodyparts["mam_waggingtail"]
-
-/datum/species/human/felinid/is_wagging_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["mam_waggingtail"]
-
-/datum/species/human/felinid/start_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["mam_tail"])
- mutant_bodyparts["mam_waggingtail"] = mutant_bodyparts["mam_tail"]
- mutant_bodyparts -= "mam_tail"
- H.update_body()
-
-/datum/species/human/felinid/stop_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["mam_waggingtail"])
- mutant_bodyparts["mam_tail"] = mutant_bodyparts["mam_waggingtail"]
- mutant_bodyparts -= "mam_waggingtail"
- H.update_body()
+ tail_type = "mam_tail"
+ wagging_type = "mam_waggingtail"
+ species_type = "furry"
/datum/species/human/felinid/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
if(ishuman(C))
diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
index ca5b683134..c56adaf1b0 100644
--- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
@@ -12,6 +12,7 @@
liked_food = GROSS
exotic_bloodtype = "BUG"
exotic_blood_color = BLOOD_COLOR_BUG
+ species_type = "insect"
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(istype(chem, /datum/reagent/toxin/pestkiller))
diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index f4713f3005..7706d4a9d5 100644
--- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -14,67 +14,6 @@
liked_food = MEAT | FRIED
disliked_food = TOXIC
-//Curiosity killed the cat's wagging tail.
-/datum/species/mammal/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- stop_wagging_tail(H)
-
-/datum/species/mammal/spec_stun(mob/living/carbon/human/H,amount)
- if(H)
- stop_wagging_tail(H)
- . = ..()
-
-/datum/species/mammal/can_wag_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["mam_tail"] || mutant_bodyparts["mam_waggingtail"]
-
-/datum/species/mammal/is_wagging_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["mam_waggingtail"]
-
-/datum/species/mammal/start_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["mam_tail"])
- mutant_bodyparts["mam_waggingtail"] = mutant_bodyparts["mam_tail"]
- mutant_bodyparts -= "mam_tail"
- H.update_body()
-
-/datum/species/mammal/stop_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["mam_waggingtail"])
- mutant_bodyparts["mam_tail"] = mutant_bodyparts["mam_waggingtail"]
- mutant_bodyparts -= "mam_waggingtail"
- H.update_body()
-
-
-/datum/species/mammal/qualifies_for_rank(rank, list/features)
- return TRUE
-
-
-//Alien//
-/datum/species/xeno
- // A cloning mistake, crossing human and xenomorph DNA
- name = "Xenomorph Hybrid"
- id = "xeno"
- say_mod = "hisses"
- default_color = "00FF00"
- icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
- species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAS_FLESH,HAS_BONE)
- mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade")
- attack_verb = "slash"
- attack_sound = 'sound/weapons/slash.ogg'
- miss_sound = 'sound/weapons/slashmiss.ogg'
- meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
- gib_types = list(/obj/effect/gibspawner/xeno/xenoperson, /obj/effect/gibspawner/xeno/xenoperson/bodypartless)
- skinned_type = /obj/item/stack/sheet/animalhide/xeno
- exotic_bloodtype = "X*"
- damage_overlay_type = "xeno"
- liked_food = MEAT
-
-//Praise the Omnissiah, A challange worthy of my skills - HS
-
-//EXOTIC//
-//These races will likely include lots of downsides and upsides. Keep them relatively balanced.//
-
-//misc
-/mob/living/carbon/human/dummy
- vore_flags = NO_VORE
-
-/mob/living/carbon/human/vore
- vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
+ tail_type = "mam_tail"
+ wagging_type = "mam_waggingtail"
+ species_type = "furry"
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 7100caf178..438eaf1eea 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -32,6 +32,8 @@
var/special_name_chance = 5
var/owner //dobby is a free golem
+ species_type = "golem"
+
/datum/species/golem/random_name(gender,unique,lastname)
var/golem_surname = pick(GLOB.golem_names)
// 3% chance that our golem has a human surname, because
diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm
index 40f65968bf..f175ddb921 100644
--- a/code/modules/mob/living/carbon/human/species_types/humans.dm
+++ b/code/modules/mob/living/carbon/human/species_types/humans.dm
@@ -10,8 +10,9 @@
disliked_food = GROSS | RAW
liked_food = JUNKFOOD | FRIED
-/datum/species/human/qualifies_for_rank(rank, list/features)
- return TRUE //Pure humans are always allowed in all roles.
+ tail_type = "tail_human"
+ wagging_type = "waggingtail_human"
+ species_type = "human"
/datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
@@ -21,21 +22,3 @@
if(H)
stop_wagging_tail(H)
. = ..()
-
-/datum/species/human/can_wag_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["tail_human"] || mutant_bodyparts["waggingtail_human"]
-
-/datum/species/human/is_wagging_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["waggingtail_human"]
-
-/datum/species/human/start_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["tail_human"])
- mutant_bodyparts["waggingtail_human"] = mutant_bodyparts["tail_human"]
- mutant_bodyparts -= "tail_human"
- H.update_body()
-
-/datum/species/human/stop_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["waggingtail_human"])
- mutant_bodyparts["tail_human"] = mutant_bodyparts["waggingtail_human"]
- mutant_bodyparts -= "waggingtail_human"
- H.update_body()
diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm
index 411defdcaf..3aef14c256 100644
--- a/code/modules/mob/living/carbon/human/species_types/ipc.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm
@@ -21,6 +21,7 @@
exotic_bloodtype = "HF"
exotic_blood_color = BLOOD_COLOR_OIL
+ species_type = "robotic"
var/datum/action/innate/monitor_change/screen
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index b18f5522dd..4498306b89 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -25,6 +25,10 @@
species_language_holder = /datum/language_holder/jelly
mutant_brain = /obj/item/organ/brain/jelly
+ tail_type = "mam_tail"
+ wagging_type = "mam_waggingtail"
+ species_type = "jelly"
+
/obj/item/organ/brain/jelly
name = "slime nucleus"
desc = "A slimey membranous mass from a slime person"
@@ -128,33 +132,6 @@
return
to_chat(H, "...but there is not enough of you to go around! You must attain more mass to heal!")
-/datum/species/jelly/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- stop_wagging_tail(H)
-
-/datum/species/jelly/spec_stun(mob/living/carbon/human/H,amount)
- if(H)
- stop_wagging_tail(H)
- . = ..()
-
-/datum/species/jelly/can_wag_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["mam_tail"] || mutant_bodyparts["mam_waggingtail"]
-
-/datum/species/jelly/is_wagging_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["mam_waggingtail"]
-
-/datum/species/jelly/start_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["mam_tail"])
- mutant_bodyparts["mam_waggingtail"] = mutant_bodyparts["mam_tail"]
- mutant_bodyparts -= "mam_tail"
- H.update_body()
-
-/datum/species/jelly/stop_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["mam_waggingtail"])
- mutant_bodyparts["mam_tail"] = mutant_bodyparts["mam_waggingtail"]
- mutant_bodyparts -= "mam_waggingtail"
- H.update_body()
-
////////////////////////////////////////////////////////SLIMEPEOPLE///////////////////////////////////////////////////////////////////
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index 960dd0c3d3..d768788e87 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -27,6 +27,10 @@
inert_mutation = FIREBREATH
species_language_holder = /datum/language_holder/lizard
+ tail_type = "tail_lizard"
+ wagging_type = "waggingtail_lizard"
+ species_type = "lizard"
+
/datum/species/lizard/random_name(gender,unique,lastname)
if(unique)
return random_unique_lizard_name(gender)
@@ -38,41 +42,6 @@
return randname
-/datum/species/lizard/qualifies_for_rank(rank, list/features)
- return TRUE
-
-//I wag in death
-/datum/species/lizard/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- stop_wagging_tail(H)
-
-/datum/species/lizard/spec_stun(mob/living/carbon/human/H,amount)
- if(H)
- stop_wagging_tail(H)
- . = ..()
-
-/datum/species/lizard/can_wag_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["tail_lizard"] || mutant_bodyparts["waggingtail_lizard"]
-
-/datum/species/lizard/is_wagging_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["waggingtail_lizard"]
-
-/datum/species/lizard/start_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["tail_lizard"])
- mutant_bodyparts["waggingtail_lizard"] = mutant_bodyparts["tail_lizard"]
- mutant_bodyparts["waggingspines"] = mutant_bodyparts["spines"]
- mutant_bodyparts -= "tail_lizard"
- mutant_bodyparts -= "spines"
- H.update_body()
-
-/datum/species/lizard/stop_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["waggingtail_lizard"])
- mutant_bodyparts["tail_lizard"] = mutant_bodyparts["waggingtail_lizard"]
- mutant_bodyparts["spines"] = mutant_bodyparts["waggingspines"]
- mutant_bodyparts -= "waggingtail_lizard"
- mutant_bodyparts -= "waggingspines"
- H.update_body()
-
/*
Lizard subspecies: ASHWALKERS
*/
diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
index ecb27a06b5..f91c3518a3 100644
--- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
@@ -21,6 +21,8 @@
burnmod = 1.25
heatmod = 1.5
+ species_type = "plant"
+
mutanteyes = /obj/item/organ/eyes/night_vision/mushroom
var/datum/martial_art/mushpunch/mush
species_language_holder = /datum/language_holder/mushroom
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index 2d9e2ccfc3..b61e29b685 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -22,6 +22,8 @@
liked_food = VEGETABLES
outfit_important_for_life = /datum/outfit/plasmaman
+ species_type = "skeleton"
+
/datum/species/plasmaman/spec_life(mob/living/carbon/human/H)
var/datum/gas_mixture/environment = H.loc.return_air()
var/atmos_sealed = FALSE
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index 758fdf71ee..f5a2f807e4 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -19,6 +19,8 @@
var/light_burnheal = -1
var/light_bruteheal = -1
+ species_type = "plant"
+
/datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
C.faction |= "plants"
@@ -71,29 +73,5 @@
light_burnheal = -0.2
light_toxheal = -0.7
-/datum/species/pod/pseudo_weak/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- stop_wagging_tail(H)
-
-/datum/species/pod/pseudo_weak/spec_stun(mob/living/carbon/human/H,amount)
- if(H)
- stop_wagging_tail(H)
- . = ..()
-
-/datum/species/pod/pseudo_weak/can_wag_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["mam_tail"] || mutant_bodyparts["mam_waggingtail"]
-
-/datum/species/pod/pseudo_weak/is_wagging_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["mam_waggingtail"]
-
-/datum/species/pod/pseudo_weak/start_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["mam_tail"])
- mutant_bodyparts["mam_waggingtail"] = mutant_bodyparts["mam_tail"]
- mutant_bodyparts -= "mam_tail"
- H.update_body()
-
-/datum/species/pod/pseudo_weak/stop_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["mam_waggingtail"])
- mutant_bodyparts["mam_tail"] = mutant_bodyparts["mam_waggingtail"]
- mutant_bodyparts -= "mam_waggingtail"
- H.update_body()
+ tail_type = "mam_tail"
+ wagging_type = "mam_waggingtail"
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 610bf37f9a..b9864bce16 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -15,6 +15,8 @@
dangerous_existence = 1
mutanteyes = /obj/item/organ/eyes/night_vision
+ species_type = "shadow"
+
/datum/species/shadow/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
C.AddElement(/datum/element/photosynthesis, 1, 1, 0, 0, 0, 0, SHADOW_SPECIES_LIGHT_THRESHOLD, SHADOW_SPECIES_LIGHT_THRESHOLD)
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index 86451875d2..51d81bd4d3 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -15,6 +15,8 @@
brutemod = 1.25
burnmod = 1.25
+ species_type = "skeleton" //they have their own category that's disassociated from undead, paired with plasmapeople
+
/datum/species/skeleton/New()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) //skeletons are stronger during the spooky season!
inherent_traits |= list(TRAIT_RESISTHEAT,TRAIT_RESISTCOLD)
diff --git a/code/modules/mob/living/carbon/human/species_types/synthliz.dm b/code/modules/mob/living/carbon/human/species_types/synthliz.dm
index 146fd37187..5ed806b302 100644
--- a/code/modules/mob/living/carbon/human/species_types/synthliz.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synthliz.dm
@@ -20,33 +20,6 @@
exotic_bloodtype = "S"
exotic_blood_color = BLOOD_COLOR_OIL
-/datum/species/synthliz/qualifies_for_rank(rank, list/features)
- return TRUE
-
-//I wag in death
-/datum/species/synthliz/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- stop_wagging_tail(H)
-
-/datum/species/synthliz/spec_stun(mob/living/carbon/human/H,amount)
- if(H)
- stop_wagging_tail(H)
- . = ..()
-
-/datum/species/synthliz/can_wag_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["mam_tail"] || mutant_bodyparts["mam_waggingtail"]
-
-/datum/species/synthliz/is_wagging_tail(mob/living/carbon/human/H)
- return mutant_bodyparts["mam_waggingtail"]
-
-/datum/species/synthliz/start_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["mam_tail"])
- mutant_bodyparts["mam_waggingtail"] = mutant_bodyparts["mam_tail"]
- mutant_bodyparts -= "mam_tail"
- H.update_body()
-
-/datum/species/synthliz/stop_wagging_tail(mob/living/carbon/human/H)
- if(mutant_bodyparts["mam_waggingtail"])
- mutant_bodyparts["mam_tail"] = mutant_bodyparts["mam_waggingtail"]
- mutant_bodyparts -= "mam_waggingtail"
- H.update_body()
+ tail_type = "mam_tail"
+ wagging_type = "mam_waggingtail"
+ species_type = "robotic"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm
index 85f1fbf386..a1a2a33c54 100644
--- a/code/modules/mob/living/carbon/human/species_types/synths.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synths.dm
@@ -17,6 +17,7 @@
var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off
var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged
species_language_holder = /datum/language_holder/synthetic
+ species_type = "robotic"
/datum/species/synth/military
name = "Military Synth"
@@ -43,7 +44,6 @@
return TRUE
return ..()
-
/datum/species/synth/proc/assume_disguise(datum/species/S, mob/living/carbon/human/H)
if(S && !istype(S, type))
name = S.name
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index 9341622dfa..723c4848fe 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -14,6 +14,7 @@
limbs_id = "human"
skinned_type = /obj/item/stack/sheet/animalhide/human
var/info_text = "You are a Vampire. You will slowly but constantly lose blood if outside of a coffin. If inside a coffin, you will slowly heal. You may gain more blood by grabbing a live victim and using your drain ability."
+ species_type = "undead"
/datum/species/vampire/check_roundstart_eligible()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
diff --git a/code/modules/mob/living/carbon/human/species_types/xeno.dm b/code/modules/mob/living/carbon/human/species_types/xeno.dm
new file mode 100644
index 0000000000..db34d1ae45
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species_types/xeno.dm
@@ -0,0 +1,19 @@
+/datum/species/xeno
+ // A cloning mistake, crossing human and xenomorph DNA
+ name = "Xenomorph Hybrid"
+ id = "xeno"
+ say_mod = "hisses"
+ default_color = "00FF00"
+ icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
+ species_traits = list(MUTCOLORS,EYECOLOR,LIPS,CAN_SCAR)
+ mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade")
+ attack_verb = "slash"
+ attack_sound = 'sound/weapons/slash.ogg'
+ miss_sound = 'sound/weapons/slashmiss.ogg'
+ meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
+ gib_types = list(/obj/effect/gibspawner/xeno/xenoperson, /obj/effect/gibspawner/xeno/xenoperson/bodypartless)
+ skinned_type = /obj/item/stack/sheet/animalhide/xeno
+ exotic_bloodtype = "X*"
+ damage_overlay_type = "xeno"
+ liked_food = MEAT
+ species_type = "alien"
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 1c745c0366..81a7f6e2e7 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -15,6 +15,7 @@
var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
disliked_food = NONE
liked_food = GROSS | MEAT | RAW
+ species_type = "undead"
/datum/species/zombie/notspaceproof
id = "notspaceproofzombie"
diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm
index 149ec5f0e3..13d234092c 100644
--- a/code/modules/mob/living/carbon/monkey/combat.dm
+++ b/code/modules/mob/living/carbon/monkey/combat.dm
@@ -90,8 +90,7 @@
else if(legcuffed)
I = legcuffed
if(I)
- changeNext_move(CLICK_CD_BREAKOUT)
- last_special = world.time + CLICK_CD_BREAKOUT
+ MarkResistTime()
cuff_resist(I)
/mob/living/carbon/monkey/proc/should_target(var/mob/living/L)
@@ -354,7 +353,7 @@
battle_screech()
a_intent = INTENT_HARM
-/mob/living/carbon/monkey/attack_hand(mob/living/L)
+/mob/living/carbon/monkey/on_attack_hand(mob/living/L)
if(L.a_intent == INTENT_HARM && prob(MONKEY_RETALIATE_HARM_PROB))
retaliate(L)
else if(L.a_intent == INTENT_DISARM && prob(MONKEY_RETALIATE_DISARM_PROB))
diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm
index 8f862af8fa..16b3c1a79e 100644
--- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm
@@ -42,7 +42,7 @@
adjustBruteLoss(15)
return TRUE
-/mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M)
+/mob/living/carbon/monkey/on_attack_hand(mob/living/carbon/human/M)
. = ..()
if(.) //To allow surgery to return properly.
return
diff --git a/code/modules/mob/living/clickdelay.dm b/code/modules/mob/living/clickdelay.dm
new file mode 100644
index 0000000000..dfdb9104bf
--- /dev/null
+++ b/code/modules/mob/living/clickdelay.dm
@@ -0,0 +1,4 @@
+/mob/living/GetActionCooldownMod()
+ . = ..()
+ for(var/datum/status_effect/S in status_effects)
+ . *= S.action_cooldown_mod()
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 7d0a701e8f..a5de3a2fdc 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -226,7 +226,7 @@
'sound/voice/catpeople/nyahehe.ogg'),
50, 1)
return
- else if(ismoth(C))
+ else if(isinsect(C))
playsound(C, 'sound/voice/moth/mothlaugh.ogg', 50, 1)
else if(ishumanbasic(C))
if(user.gender == FEMALE)
@@ -244,7 +244,7 @@
. = ..()
if(. && iscarbon(user)) //Citadel Edit because this is hilarious
var/mob/living/carbon/C = user
- if(ismoth(C))
+ if(isinsect(C))
playsound(C, 'sound/voice/moth/mothchitter.ogg', 50, 1)
/datum/emote/living/look
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index f7bb9cda90..0f55d5c408 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -273,7 +273,7 @@
return
stop_pulling()
- changeNext_move(CLICK_CD_GRABBING)
+ DelayNextAction(CLICK_CD_GRABBING)
if(AM.pulledby)
if(!supress_message)
@@ -690,7 +690,7 @@
..(pressure_difference, direction, pressure_resistance_prob_delta)
/mob/living/can_resist()
- return !((next_move > world.time) || !CHECK_MOBILITY(src, MOBILITY_RESIST))
+ return CheckResistCooldown() && CHECK_MOBILITY(src, MOBILITY_RESIST)
/// Resist verb for attempting to get out of whatever is restraining your motion. Gives you resist clickdelay if do_resist() returns true.
/mob/living/verb/resist()
@@ -701,10 +701,12 @@
return
if(do_resist())
- changeNext_move(CLICK_CD_RESIST)
+ MarkResistTime()
+ DelayNextAction(CLICK_CD_RESIST)
-/// The actual proc for resisting. Return TRUE to give clickdelay.
+/// The actual proc for resisting. Return TRUE to give CLICK_CD_RESIST clickdelay.
/mob/living/proc/do_resist()
+ set waitfor = FALSE // some of these sleep.
SEND_SIGNAL(src, COMSIG_LIVING_RESIST, src)
//resisting grabs (as if it helps anyone...)
// only works if you're not cuffed.
@@ -715,7 +717,7 @@
return old_gs? TRUE : FALSE
// unbuckling yourself. stops the chain if you try it.
- if(buckled && last_special <= world.time)
+ if(buckled)
log_combat(src, buckled, "resisted buckle")
return resist_buckle()
@@ -744,13 +746,12 @@
if(CHECK_MOBILITY(src, MOBILITY_USE) && resist_embedded()) //Citadel Change for embedded removal memes - requires being able to use items.
// DO NOT GIVE DEFAULT CLICKDELAY - This is a combat action.
- changeNext_move(CLICK_CD_MELEE)
+ DelayNextAction(CLICK_CD_MELEE)
return FALSE
- if(last_special <= world.time)
- resist_restraints() //trying to remove cuffs.
- // DO NOT GIVE CLICKDELAY - last_special handles this.
- return FALSE
+ resist_restraints() //trying to remove cuffs.
+ // DO NOT GIVE CLICKDELAY
+ return FALSE
/// Proc to resist a grab. moving_resist is TRUE if this began by someone attempting to move. Return FALSE if still grabbed/failed to break out. Use this instead of resist_grab() directly.
/mob/proc/attempt_resist_grab(moving_resist, forced, log = TRUE)
diff --git a/code/modules/mob/living/living_active_block.dm b/code/modules/mob/living/living_active_block.dm
index 4211b2cfd9..729e7d3d7a 100644
--- a/code/modules/mob/living/living_active_block.dm
+++ b/code/modules/mob/living/living_active_block.dm
@@ -10,8 +10,7 @@
REMOVE_TRAIT(src, TRAIT_SPRINT_LOCKED, ACTIVE_BLOCK_TRAIT)
remove_movespeed_modifier(/datum/movespeed_modifier/active_block)
var/datum/block_parry_data/data = I.get_block_parry_data()
- if(timeToNextMove() < data.block_end_click_cd_add)
- changeNext_move(data.block_end_click_cd_add)
+ DelayNextAction(data.block_end_click_cd_add)
return TRUE
/mob/living/proc/ACTIVE_BLOCK_START(obj/item/I)
@@ -97,7 +96,7 @@
return
// QOL: Attempt to toggle on combat mode if it isn't already
SEND_SIGNAL(src, COMSIG_ENABLE_COMBAT_MODE)
- if(!SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE))
+ if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
to_chat(src, "You must be in combat mode to actively block!")
return FALSE
var/datum/block_parry_data/data = I.get_block_parry_data()
diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm
index 8141603f64..4a9c4e6311 100644
--- a/code/modules/mob/living/living_active_parry.dm
+++ b/code/modules/mob/living/living_active_parry.dm
@@ -59,14 +59,14 @@
return FALSE
//QOL: Try to enable combat mode if it isn't already
SEND_SIGNAL(src, COMSIG_ENABLE_COMBAT_MODE)
- if(!SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE))
+ if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
to_chat(src, "You must be in combat mode to parry!")
return FALSE
data = return_block_parry_datum(data)
var/full_parry_duration = data.parry_time_windup + data.parry_time_active + data.parry_time_spindown
// no system in place to "fallback" if out of the 3 the top priority one can't parry due to constraints but something else can.
// can always implement it later, whatever.
- if((data.parry_respect_clickdelay && (next_move > world.time)) || ((parry_end_time_last + data.parry_cooldown) > world.time))
+ if((data.parry_respect_clickdelay && !CheckActionCooldown()) || ((parry_end_time_last + data.parry_cooldown) > world.time))
to_chat(src, "You are not ready to parry (again)!")
return
// Point of no return, make sure everything is set.
@@ -121,7 +121,7 @@
Stagger(data.parry_failed_stagger_duration)
effect_text += "staggering themselves"
if(data.parry_failed_clickcd_duration)
- changeNext_move(data.parry_failed_clickcd_duration)
+ DelayNextAction(data.parry_failed_clickcd_duration, flush = TRUE)
effect_text += "throwing themselves off balance"
handle_parry_ending_effects(data, effect_text)
parrying = NOT_PARRYING
@@ -160,17 +160,17 @@
/**
* Called when an attack is parried using this, whether or not the parry was successful.
*/
-/obj/item/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, parry_efficiency, parry_time)
+/obj/item/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time)
/**
* Called when an attack is parried innately, whether or not the parry was successful.
*/
-/mob/living/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, parry_efficiency, parry_time)
+/mob/living/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time)
/**
* Called when an attack is parried using this, whether or not the parry was successful.
*/
-/datum/martial_art/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, parry_efficiency, parry_time)
+/datum/martial_art/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time)
/**
* Called when an attack is parried and block_parra_data indicates to use a proc to handle counterattack.
@@ -256,7 +256,7 @@
var/datum/block_parry_data/data = get_parry_data()
if(data.parry_sounds)
playsound(src, pick(data.parry_sounds), 75)
- visible_message("[src] parries \the [attack_text][length(effect_text)? ", [english_list(effect_text)] [attacker]" : ""]!")
+ visible_message("[src] parries [attack_text][length(effect_text)? ", [english_list(effect_text)] [attacker]" : ""]!")
/// Run counterattack if any
/mob/living/proc/run_parry_countereffects(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list(), parry_efficiency)
@@ -277,7 +277,7 @@
if(data.parry_data[PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN])
switch(parrying)
if(ITEM_PARRY)
- active_parry_item.melee_attack_chain(src, attacker, null, ATTACKCHAIN_PARRY_COUNTERATTACK, data.parry_data[PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN])
+ active_parry_item.melee_attack_chain(src, attacker, null, ATTACK_IS_PARRY_COUNTERATTACK | ATTACK_IGNORE_CLICKDELAY | ATTACK_IGNORE_ACTION | NO_AUTO_CLICKDELAY_HANDLING, data.parry_data[PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN])
effect_text += "reflexively counterattacking with [active_parry_item]"
if(UNARMED_PARRY) // WARNING: If you are using these two, the attackchain parry counterattack flags and damage multipliers are unimplemented. Be careful with how you handle this.
UnarmedAttack(attacker)
diff --git a/code/modules/mob/living/living_blocking_parrying.dm b/code/modules/mob/living/living_blocking_parrying.dm
index 9f1ad1c27a..47dae8849d 100644
--- a/code/modules/mob/living/living_blocking_parrying.dm
+++ b/code/modules/mob/living/living_blocking_parrying.dm
@@ -126,6 +126,8 @@ GLOBAL_LIST_EMPTY(block_parry_data)
var/list/parry_imperfect_falloff_percent_override
/// Efficiency in percent on perfect parry.
var/parry_efficiency_perfect = 120
+ /// Override for attack types, list("[ATTACK_TYPE_DEFINE]" = perecntage) for perfect efficiency.
+ var/parry_efficiency_perfect_override
/// Parry effect data.
var/list/parry_data = list(
PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 1
@@ -180,7 +182,11 @@ GLOBAL_LIST_EMPTY(block_parry_data)
if(isnull(leeway))
leeway = parry_time_perfect_leeway
difference -= leeway
- . = parry_efficiency_perfect
+ var/perfect = attack_type_list_scan(parry_efficiency_perfect_override, attack_type)
+ if(isnull(perfect))
+ . = parry_efficiency_perfect
+ else
+ . = perfect
if(difference <= 0)
return
var/falloff = attack_type_list_scan(parry_imperfect_falloff_percent_override, attack_type)
@@ -276,6 +282,7 @@ GLOBAL_LIST_EMPTY(block_parry_data)
RENDER_VARIABLE_SIMPLE(parry_imperfect_falloff_percent, "Linear falloff in percent per decisecond for attacks parried outside of perfect window.")
RENDER_OVERRIDE_LIST(parry_imperfect_falloff_percent_override, "Override for the above for each attack type")
RENDER_VARIABLE_SIMPLE(parry_efficiency_perfect, "Efficiency in percentage a parry in the perfect window is considered.")
+ RENDER_OVERRIDE_LIST(parry_efficiency_perfect_override, "Override for the above for each attack type")
// parry_data
dat += ""
RENDER_VARIABLE_SIMPLE(parry_efficiency_considered_successful, "Minimum parry efficiency to be considered a successful parry.")
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index c69383924a..19adb7b787 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -77,6 +77,7 @@
final_percent = returnlist[BLOCK_RETURN_PROJECTILE_BLOCK_PERCENTAGE]
if(returned & BLOCK_SHOULD_REDIRECT)
handle_projectile_attack_redirection(P, returnlist[BLOCK_RETURN_REDIRECT_METHOD])
+ return BULLET_ACT_FORCE_PIERCE
if(returned & BLOCK_REDIRECTED)
return BULLET_ACT_FORCE_PIERCE
if(returned & BLOCK_SUCCESS)
@@ -216,8 +217,8 @@
//proc to upgrade a simple pull into a more aggressive grab.
/mob/living/proc/grippedby(mob/living/carbon/user, instant = FALSE)
if(user.grab_state < GRAB_KILL)
- user.changeNext_move(CLICK_CD_GRABBING)
- playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ user.DelayNextAction(CLICK_CD_GRABBING, flush = TRUE)
+ playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
if(user.grab_state) //only the first upgrade is instantaneous
var/old_grab_state = user.grab_state
@@ -271,10 +272,10 @@
user.set_pull_offsets(src, grab_state)
return 1
-/mob/living/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/mob/living/on_attack_hand(mob/user, act_intent = user.a_intent, attackchain_flags)
..() //Ignoring parent return value here.
SEND_SIGNAL(src, COMSIG_MOB_ATTACK_HAND, user)
- if((user != src) && act_intent != INTENT_HELP && (mob_run_block(user, 0, user.name, ATTACK_TYPE_UNARMED | ATTACK_TYPE_MELEE | ((unarmed_attack_flags & UNARMED_ATTACK_PARRY)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE), null, user, check_zone(user.zone_selected), null) & BLOCK_SUCCESS))
+ if((user != src) && act_intent != INTENT_HELP && (mob_run_block(user, 0, user.name, ATTACK_TYPE_UNARMED | ATTACK_TYPE_MELEE | ((attackchain_flags & ATTACK_IS_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE), null, user, check_zone(user.zone_selected), null) & BLOCK_SUCCESS))
log_combat(user, src, "attempted to touch")
visible_message("[user] attempted to touch [src]!",
"[user] attempted to touch you!", target = user,
@@ -324,6 +325,9 @@
/mob/living/attack_animal(mob/living/simple_animal/M)
M.face_atom(src)
+ if(!M.CheckActionCooldown(CLICK_CD_MELEE))
+ return
+ M.DelayNextAction()
if(M.melee_damage_upper == 0)
M.visible_message("\The [M] [M.friendly_verb_continuous] [src]!",
"You [M.friendly_verb_simple] [src]!", target = src,
@@ -339,7 +343,7 @@
return 0
damage = block_calculate_resultant_damage(damage, return_list)
if(M.attack_sound)
- playsound(loc, M.attack_sound, 50, 1, 1)
+ playsound(src, M.attack_sound, 50, 1, 1)
M.do_attack_animation(src)
visible_message("\The [M] [M.attack_verb_continuous] [src]!", \
"\The [M] [M.attack_verb_continuous] you!", null, COMBAT_MESSAGE_RANGE, null,
@@ -348,6 +352,9 @@
return damage
/mob/living/attack_paw(mob/living/carbon/monkey/M)
+ if(!M.CheckActionCooldown(CLICK_CD_MELEE))
+ return
+ M.DelayNextAction()
if (M.a_intent == INTENT_HARM)
if(HAS_TRAIT(M, TRAIT_PACIFISM))
to_chat(M, "You don't want to hurt anyone!")
@@ -369,6 +376,7 @@
visible_message("[M.name] has attempted to bite [src]!", \
"[M.name] has attempted to bite [src]!", null, COMBAT_MESSAGE_RANGE, null,
M, "You have attempted to bite [src]!")
+ return TRUE
return FALSE
/mob/living/attack_larva(mob/living/carbon/alien/larva/L)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index b037221e2c..5495d37297 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -53,7 +53,6 @@
var/hallucination = 0 //Directly affects how long a mob will hallucinate for
- var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out.
var/timeofdeath = 0
//Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects.
diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm
index dcb7ac66c9..64509d2deb 100644
--- a/code/modules/mob/living/silicon/pai/pai_defense.dm
+++ b/code/modules/mob/living/silicon/pai/pai_defense.dm
@@ -28,8 +28,7 @@
fold_in(force = 1)
DefaultCombatKnockdown(200)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/mob/living/silicon/pai/attack_hand(mob/living/carbon/human/user)
+/mob/living/silicon/pai/on_attack_hand(mob/living/carbon/human/user)
switch(user.a_intent)
if(INTENT_HELP)
visible_message("[user] gently pats [src] on the head, eliciting an off-putting buzzing from its holographic field.",
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index 0d8a0880a8..a063d090db 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -16,8 +16,6 @@
return item
return module_active
-
-
/mob/living/silicon/robot/proc/uneq_module(obj/item/O)
if(!O)
return 0
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 51cff93ceb..4fcd6d1dbd 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -289,7 +289,7 @@
/mob/living/silicon/robot/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src))
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
if (!getBruteLoss())
to_chat(user, "[src] is already in good condition!")
return
@@ -311,7 +311,7 @@
return
else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
if (getFireLoss() > 0 || getToxLoss() > 0)
if(src == user)
to_chat(user, "You start fixing yourself...")
diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm
index e337618e4b..746c4f469d 100644
--- a/code/modules/mob/living/silicon/robot/robot_defense.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defense.dm
@@ -62,8 +62,7 @@
return
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/mob/living/silicon/robot/attack_hand(mob/living/carbon/human/user)
+/mob/living/silicon/robot/on_attack_hand(mob/living/carbon/human/user)
add_fingerprint(user)
if(opened && !wiresexposed && cell && !issilicon(user))
cell.update_icon()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index badbcc4ed5..7c4125fbc6 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -361,8 +361,7 @@
"Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekmed"),
"Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinamed"),
"Eyebot" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "eyebotmed"),
- "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymed"),
- "Zoomba" = image(icon = 'icons/mob/robots.dmi', icon_state = "zoomba_med")
+ "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymed")
)
var/list/L = list("Medihound" = "medihound", "Medihound Dark" = "medihounddark", "Vale" = "valemed")
for(var/a in L)
@@ -378,8 +377,6 @@
switch(med_borg_icon)
if("Default")
cyborg_base_icon = "medical"
- if("Zoomba")
- cyborg_base_icon = "zoomba_med"
if("Droid")
cyborg_base_icon = "medical"
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
@@ -481,8 +478,7 @@
"Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "caneng"),
"Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinaeng"),
"Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "spidereng"),
- "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyeng"),
- "Zoomba" = image(icon = 'icons/mob/robots.dmi', icon_state = "zoomba_engi")
+ "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyeng")
)
var/list/L = list("Pup Dozer" = "pupdozer", "Vale" = "valeeng")
for(var/a in L)
@@ -498,8 +494,6 @@
switch(engi_borg_icon)
if("Default")
cyborg_base_icon = "engineer"
- if("Zoomba")
- cyborg_base_icon = "zoomba_engi"
if("Default - Treads")
cyborg_base_icon = "engi-tread"
special_light_key = "engineer"
@@ -580,8 +574,7 @@
"Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "cansec"),
"Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinasec"),
"Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "spidersec"),
- "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavysec"),
- "Zoomba" = image(icon = 'icons/mob/robots.dmi', icon_state = "zoomba_sec")
+ "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavysec")
)
var/list/L = list("K9" = "k9", "Vale" = "valesec", "K9 Dark" = "k9dark")
for(var/a in L)
@@ -597,8 +590,6 @@
switch(sec_borg_icon)
if("Default")
cyborg_base_icon = "sec"
- if("Zoomba")
- cyborg_base_icon = "zoomba_sec"
if("Default - Treads")
cyborg_base_icon = "sec-tread"
special_light_key = "sec"
@@ -836,8 +827,7 @@
"(Janitor) Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinajan"),
"(Janitor) Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekjan"),
"(Janitor) Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "canjan"),
- "(Janitor) Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyjan"),
- "Zoomba" = image(icon = 'icons/mob/robots.dmi', icon_state = "zoomba_jani")
+ "(Janitor) Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyjan")
)
var/list/L = list("(Service) DarkK9" = "k50", "(Service) Vale" = "valeserv", "(Service) ValeDark" = "valeservdark",
"(Janitor) Scrubpuppy" = "scrubpup")
@@ -852,8 +842,6 @@
service_icons = sortList(service_icons)
var/service_robot_icon = show_radial_menu(R, R , service_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE)
switch(service_robot_icon)
- if("Zoomba")
- cyborg_base_icon = "zoomba_jani"
if("(Service) Waitress")
cyborg_base_icon = "service_f"
special_light_key = "service"
@@ -956,8 +944,7 @@
"Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekmin"),
"Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinamin"),
"Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "canmin"),
- "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymin"),
- "Zoomba" = image(icon = 'icons/mob/robots.dmi', icon_state = "zoomba_miner")
+ "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymin")
)
var/list/L = list("Blade" = "blade", "Vale" = "valemine")
for(var/a in L)
@@ -1001,8 +988,6 @@
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
sleeper_overlay = "valeminesleeper"
dogborg = TRUE
- if("Zoomba")
- cyborg_base_icon = "zoomba_miner"
else
return FALSE
return ..()
diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm
index 0850f0f886..8be2183d3b 100644
--- a/code/modules/mob/living/silicon/silicon_defense.dm
+++ b/code/modules/mob/living/silicon/silicon_defense.dm
@@ -70,7 +70,7 @@
return TRUE
return FALSE
-/mob/living/silicon/attack_hand(mob/living/carbon/human/M)
+/mob/living/silicon/on_attack_hand(mob/living/carbon/human/M)
. = ..()
if(.) //the attack was blocked
return
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index 278bb37d0d..b003e066ef 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -1,6 +1,6 @@
-/mob/living/simple_animal/attack_hand(mob/living/carbon/human/M)
+/mob/living/simple_animal/on_attack_hand(mob/living/carbon/human/M)
. = ..()
if(.) //the attack was blocked
return
diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm
index eee42c214f..f79a2b5b3e 100644
--- a/code/modules/mob/living/simple_animal/astral.dm
+++ b/code/modules/mob/living/simple_animal/astral.dm
@@ -41,7 +41,11 @@
to_chat(src, "Your astral projection is interrupted and your mind is sent back to your body with a shock!")
/mob/living/simple_animal/astral/ClickOn(var/atom/A, var/params)
- ..()
+ . = ..()
+ attempt_possess(A)
+
+/mob/living/simple_animal/astral/proc/attempt_possess(atom/A)
+ set waitfor = FALSE
if(pseudo_death == FALSE)
if(isliving(A))
if(ishuman(A))
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 3ad19deeac..fe6792b5c2 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -290,7 +290,7 @@
return TRUE //Successful completion. Used to prevent child process() continuing if this one is ended early.
-/mob/living/simple_animal/bot/attack_hand(mob/living/carbon/human/H)
+/mob/living/simple_animal/bot/on_attack_hand(mob/living/carbon/human/H)
if(H.a_intent == INTENT_HELP)
interact(H)
else
@@ -335,7 +335,6 @@
user.visible_message("[user] uses [W] to pull [paicard] out of [bot_name]!","You pull [paicard] out of [bot_name] with [W].")
ejectpai(user)
else
- user.changeNext_move(CLICK_CD_MELEE)
if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM)
if(health >= maxHealth)
to_chat(user, "[src] does not need a repair!")
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 1f81e8db29..91462a6713 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -177,7 +177,7 @@ Auto Patrol[]"},
target = H
mode = BOT_HUNT
-/mob/living/simple_animal/bot/ed209/attack_hand(mob/living/carbon/human/H)
+/mob/living/simple_animal/bot/ed209/on_attack_hand(mob/living/carbon/human/H)
if(H.a_intent == INTENT_HARM)
retaliate(H)
return ..()
@@ -532,8 +532,10 @@ Auto Patrol[]"},
/mob/living/simple_animal/bot/ed209/RangedAttack(atom/A)
if(!on)
- return
+ return ..()
shootAt(A)
+ DelayNextAction()
+ return TRUE
/mob/living/simple_animal/bot/ed209/proc/stun_attack(mob/living/carbon/C)
playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1)
diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm
index 43f18d3890..0ee600ed1d 100644
--- a/code/modules/mob/living/simple_animal/bot/honkbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm
@@ -112,7 +112,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
target = H
mode = BOT_HUNT
-/mob/living/simple_animal/bot/honkbot/attack_hand(mob/living/carbon/human/H)
+/mob/living/simple_animal/bot/honkbot/on_attack_hand(mob/living/carbon/human/H)
if(H.a_intent == INTENT_HARM)
retaliate(H)
addtimer(CALLBACK(src, .proc/react_buzz), 5)
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index f998f58f02..fb5a889d89 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -604,7 +604,7 @@
/mob/living/simple_animal/bot/medbot/proc/get_healchem_toxin(mob/M)
return HAS_TRAIT(M, TRAIT_TOXINLOVER)? treatment_tox_toxlover : treatment_tox
-/mob/living/simple_animal/bot/medbot/attack_hand(mob/living/carbon/human/H)
+/mob/living/simple_animal/bot/medbot/on_attack_hand(mob/living/carbon/human/H)
if(H.a_intent == INTENT_DISARM && mode != BOT_TIPPED)
H.visible_message("[H] begins tipping over [src].", "You begin tipping over [src]...")
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index e14cb488ae..cf9698655b 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -284,7 +284,7 @@ Auto Patrol: []"},
/mob/living/simple_animal/bot/secbot/proc/special_retaliate_after_attack(mob/user) //allows special actions to take place after being attacked.
return
-/mob/living/simple_animal/bot/secbot/attack_hand(mob/living/carbon/human/H)
+/mob/living/simple_animal/bot/secbot/on_attack_hand(mob/living/carbon/human/H)
if((H.a_intent == INTENT_HARM) || (H.a_intent == INTENT_DISARM))
retaliate(H)
if(special_retaliate_after_attack(H))
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index d30fa1b49f..c21875d1db 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -283,7 +283,7 @@
if(!D.is_decorated)
D.decorate_donut()
-/mob/living/simple_animal/pet/cat/cak/attack_hand(mob/living/L)
+/mob/living/simple_animal/pet/cat/cak/on_attack_hand(mob/living/L)
. = ..()
if(.) //the attack was blocked
return
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 1f733a4d55..51e7ee6c03 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -166,7 +166,7 @@
if(stat == CONSCIOUS)
udder.generateMilk(milk_reagent)
-/mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M)
+/mob/living/simple_animal/cow/on_attack_hand(mob/living/carbon/M)
if(!stat && M.a_intent == INTENT_DISARM && icon_state != icon_dead)
M.visible_message("[M] tips over [src].",
"You tip over [src].")
diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
index d396434708..4e6923615d 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
@@ -86,8 +86,7 @@
/obj/guardian_bomb/attackby(mob/living/user)
detonate(user)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/guardian_bomb/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/guardian_bomb/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
detonate(user)
/obj/guardian_bomb/examine(mob/user)
diff --git a/code/modules/mob/living/simple_animal/guardian/types/standard.dm b/code/modules/mob/living/simple_animal/guardian/types/standard.dm
index 2285167df5..d7970daa29 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/standard.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/standard.dm
@@ -3,7 +3,7 @@
melee_damage_lower = 20
melee_damage_upper = 20
obj_damage = 80
- next_move_modifier = 0.5 //attacks 50% faster
+ action_cooldown_mod = 0.5 //attacks 50% faster
environment_smash = ENVIRONMENT_SMASH_WALLS
playstyle_string = "As a standard type you have no special abilities, but take half damage and have powerful attack capable of smashing through walls."
magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated."
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 30f469ec7f..da16ec581b 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -136,7 +136,7 @@ mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Seve
if(health < maxHealth)
heal_overall_damage(10) //Fast life regen, makes it hard for you to get eaten to death.
-/mob/living/simple_animal/hostile/bear/butter/attack_hand(mob/living/L) //Borrowed code from Cak, feeds people if they hit you. More nutriment but less vitamin to represent BUTTER.
+/mob/living/simple_animal/hostile/bear/butter/on_attack_hand(mob/living/L) //Borrowed code from Cak, feeds people if they hit you. More nutriment but less vitamin to represent BUTTER.
..()
if(L.a_intent == INTENT_HARM && L.reagents && !stat)
L.reagents.add_reagent(/datum/reagent/consumable/nutriment, 1)
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 945842d5ed..5ed3cd0cdd 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -523,9 +523,9 @@ mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with mega
if(ranged && ranged_cooldown <= world.time)
target = A
OpenFire(A)
- ..()
-
-
+ DelayNextAction()
+ . = ..()
+ return TRUE
////// AI Status ///////
/mob/living/simple_animal/hostile/proc/AICanContinue(var/list/possible_targets)
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
index a4edb21479..55046d6555 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
@@ -136,7 +136,7 @@
target = A
if(!isturf(loc))
return
- if(next_move > world.time)
+ if(!CheckActionCooldown())
return
if(hopping)
return
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
index 3ef4ef9be9..5c1229c130 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
@@ -70,7 +70,7 @@ Difficulty: Medium
/obj/item/melee/transforming/cleaving_saw/miner/attack(mob/living/target, mob/living/carbon/human/user)
target.add_stun_absorption("miner", 10, INFINITY)
- ..()
+ . = ..()
target.stun_absorption -= "miner"
/obj/item/projectile/kinetic/miner
@@ -86,8 +86,8 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
var/adjustment_amount = amount * 0.1
- if(world.time + adjustment_amount > next_move)
- changeNext_move(adjustment_amount) //attacking it interrupts it attacking, but only briefly
+ if(world.time + adjustment_amount > next_action)
+ DelayNextAction(adjustment_amount, considered_action = FALSE, flush = TRUE) //attacking it interrupts it attacking, but only briefly
. = ..()
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/death()
@@ -109,7 +109,7 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/AttackingTarget()
if(QDELETED(target))
return
- if(next_move > world.time || !Adjacent(target)) //some cheating
+ if(!CheckActionCooldown() || !Adjacent(target)) //some cheating
INVOKE_ASYNC(src, .proc/quick_attack_loop)
return
face_atom(target)
@@ -125,8 +125,8 @@ Difficulty: Medium
adjustHealth(-(L.maxHealth * 0.5))
L.gib()
return TRUE
- changeNext_move(CLICK_CD_MELEE)
- miner_saw.melee_attack_chain(src, target)
+ miner_saw.melee_attack_chain(src, target, null, ATTACK_IGNORE_CLICKDELAY)
+ FlushCurrentAction()
if(guidance)
adjustHealth(-2)
transform_weapon()
@@ -161,19 +161,19 @@ Difficulty: Medium
face_atom(target)
new /obj/effect/temp_visual/dir_setting/firing_effect(loc, dir)
Shoot(target)
- changeNext_move(CLICK_CD_RANGE)
+ DelayNextAction(CLICK_CD_RANGE, flush = TRUE)
//I'm still of the belief that this entire proc needs to be wiped from existence.
// do not take my touching of it to be endorsement of it. ~mso
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/quick_attack_loop()
- while(!QDELETED(target) && next_move <= world.time) //this is done this way because next_move can change to be sooner while we sleep.
+ while(!QDELETED(target) && !CheckActionCooldown()) //this is done this way because next_move can change to be sooner while we sleep.
stoplag(1)
- sleep((next_move - world.time) * 1.5) //but don't ask me what the fuck this is about
+ sleep((next_action - world.time) * 1.5) //but don't ask me what the fuck this is about
if(QDELETED(target))
return
- if(dashing || next_move > world.time || !Adjacent(target))
- if(dashing && next_move <= world.time)
- next_move = world.time + 1
+ if(dashing || !CheckActionCooldown() || !Adjacent(target))
+ if(dashing && next_action <= world.time)
+ SetNextAction(1, considered_action = FALSE, immediate = FALSE, flush = TRUE)
INVOKE_ASYNC(src, .proc/quick_attack_loop) //lets try that again.
return
AttackingTarget()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index aa4ff328b5..18abb019d3 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -385,10 +385,7 @@ Difficulty: Very Hard
if(isliving(speaker))
ActivationReaction(speaker, ACTIVATE_SPEECH)
-/obj/machinery/anomalous_crystal/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/anomalous_crystal/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
ActivationReaction(user, ACTIVATE_TOUCH)
/obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm
index c4f78b6e26..11cc0fe67e 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm
@@ -105,7 +105,7 @@ IGNORE_PROC_IF_NOT_TARGET(attack_slime)
/mob/living/simple_animal/hostile/asteroid/curseblob/attacked_by(obj/item/I, mob/living/L, attackchain_flags = NONE, damage_multiplier = 1)
if(L != set_target)
- L.changeNext_move(I.click_delay) //pre_attacked_by not called
+ I.ApplyAttackCooldown(L, src)
return
return ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
index 982b91c2c9..87ec79abcf 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
@@ -148,7 +148,7 @@ While using this makes the system rely on OnFire, it still gives options for tim
desc = "You're not quite sure how a signal can be menacing."
invisibility = 100
-/obj/structure/elite_tumor/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/elite_tumor/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(ishuman(user))
switch(activity)
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index 4c9afd3784..9101430ccc 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -170,7 +170,7 @@
Bruise()
..()
-/mob/living/simple_animal/hostile/mushroom/attack_hand(mob/living/carbon/human/M)
+/mob/living/simple_animal/hostile/mushroom/on_attack_hand(mob/living/carbon/human/M)
. = ..()
if(.) // the attack was blocked
return
diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
index 3620e3ee5f..e21e3e0693 100644
--- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm
+++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
@@ -86,7 +86,7 @@
.=..()
START_PROCESSING(SSprocessing, src)
-/obj/structure/spawner/nether/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/spawner/nether/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
user.visible_message("[user] is violently pulled into the link!", \
"Touching the portal, you are quickly pulled through into a world of unimaginable horror!")
contents.Add(user)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index 03aac4037a..dec2159dc0 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -37,6 +37,10 @@
var/banana_type = /obj/item/grown/bananapeel
var/attack_reagent
+/mob/living/simple_animal/hostile/retaliate/clown/Initialize(mapload)
+ . = ..()
+ faction |= "clown"
+
/mob/living/simple_animal/hostile/retaliate/clown/handle_temperature_damage()
if(bodytemperature < minbodytemp)
adjustBruteLoss(10)
@@ -47,7 +51,7 @@
else
clear_alert("temp")
-/mob/living/simple_animal/hostile/retaliate/clown/attack_hand(mob/living/carbon/human/M)
+/mob/living/simple_animal/hostile/retaliate/clown/on_attack_hand(mob/living/carbon/human/M)
..()
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE)
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index de8a6fb6a0..4fcb1ed5bf 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -271,7 +271,7 @@
* Attack responces
*/
//Humans, monkeys, aliens
-/mob/living/simple_animal/parrot/attack_hand(mob/living/carbon/M)
+/mob/living/simple_animal/parrot/on_attack_hand(mob/living/carbon/M)
..()
if(client)
return
diff --git a/code/modules/mob/living/simple_animal/pickle.dm b/code/modules/mob/living/simple_animal/pickle.dm
index c5469024e6..78c524fed9 100644
--- a/code/modules/mob/living/simple_animal/pickle.dm
+++ b/code/modules/mob/living/simple_animal/pickle.dm
@@ -20,12 +20,12 @@
laugher.emote("laugh")
/mob/living/simple_animal/pickle/death()
- ..()
if(original_body)
original_body.adjustOrganLoss(ORGAN_SLOT_BRAIN, 200) //to be fair, you have to have a very high iq to understand-
original_body.forceMove(get_turf(src))
if(mind)
mind.transfer_to(original_body)
+ ..()
/mob/living/simple_animal/pickle/wabbajack_act() //restore users name before its used on the new mob
if(original_body)
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index f7876b3516..1bdd988694 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -296,7 +296,7 @@
discipline_slime(user)
return ..()
-/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/M)
+/mob/living/simple_animal/slime/on_attack_hand(mob/living/carbon/human/M)
if(buckled)
M.do_attack_animation(src, ATTACK_EFFECT_DISARM)
if(buckled == M)
@@ -356,7 +356,7 @@
attacked += 10
if(prob(25))
user.do_attack_animation(src)
- user.changeNext_move(CLICK_CD_MELEE)
+ W.ApplyAttackCooldown(user, src)
to_chat(user, "[W] passes right through [src]!")
return
if(Discipline && prob(50)) // wow, buddy, why am I getting attacked??
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index b7546becd8..31bfb5621f 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -13,9 +13,7 @@
hud_used.show_hud(hud_used.hud_version)
hud_used.update_ui_style(ui_style2icon(client.prefs.UI_style))
- next_move = 1
-
- ..()
+ . = ..()
reset_perspective(loc)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 0eff65fda3..195c50e958 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -11,6 +11,10 @@
blocks_emissive = EMISSIVE_BLOCK_GENERIC
vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of mob in openspace.
+
+ attack_hand_is_action = TRUE
+ attack_hand_unwieldlyness = CLICK_CD_MELEE
+ attack_hand_speed = 0
/// What receives our keyboard input. src by default.
var/datum/focus
@@ -35,7 +39,6 @@
var/list/logging = list()
var/atom/machine = null
- var/next_move = null
var/create_area_cooldown
/// Whether or not the mob is currently being transformed into another mob or into another state of being. This will prevent it from moving or doing realistically anything.
/// Don't you DARE use this for a cheap way to ensure someone is stunned in your code.
diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm
index 4e4c1fcdce..4781cbd8bc 100644
--- a/code/modules/modular_computers/computers/item/laptop.dm
+++ b/code/modules/modular_computers/computers/item/laptop.dm
@@ -64,10 +64,7 @@
return
M.put_in_hand(src, H.held_index)
-/obj/item/modular_computer/laptop/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/item/modular_computer/laptop/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(screen_on && isturf(loc))
return attack_self(user)
diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm
index 89c6166a0d..7e384c3ddd 100644
--- a/code/modules/modular_computers/computers/machinery/modular_computer.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm
@@ -100,7 +100,6 @@
if(cpu)
return cpu.AltClick(user)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
// On-click handling. Turns on the computer if it's off and opens the GUI.
/obj/machinery/modular_computer/interact(mob/user)
if(cpu)
diff --git a/code/modules/movespeed/_movespeed_modifier.dm b/code/modules/movespeed/_movespeed_modifier.dm
index a338919c4b..3bc4463531 100644
--- a/code/modules/movespeed/_movespeed_modifier.dm
+++ b/code/modules/movespeed/_movespeed_modifier.dm
@@ -199,7 +199,13 @@ GLOBAL_LIST_EMPTY(movespeed_modification_cache)
else
continue
. += amt
+ var/old = cached_multiplicative_slowdown // CITAEDL EDIT - To make things a bit less jarring, when in situations where
+ // your delay decreases, "give" the delay back to the client
cached_multiplicative_slowdown = .
+ var/diff = old - cached_multiplicative_slowdown
+ if((diff > 0) && client)
+ if(client.move_delay > world.time + 1.5)
+ client.move_delay -= diff
/// Get the move speed modifiers list of the mob
/mob/proc/get_movespeed_modifiers()
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index dbe4c80579..a06b753402 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -67,6 +67,7 @@
to_chat(H, "Gained [DisplayEnergy(.)] of energy from [A].")
else
to_chat(H, "\The [A] has run dry of energy, you must find another source!")
+ . = INTERRUPT_UNARMED_ATTACK
else
. = FALSE //as to not cancel attack_hand()
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index b368589bc3..b8f2c95762 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -137,7 +137,7 @@
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
//before the records have been generated, so we do this inside the loop.
-/obj/structure/filingcabinet/security/attack_hand()
+/obj/structure/filingcabinet/security/on_attack_hand()
populate()
. = ..()
@@ -170,8 +170,7 @@
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
//before the records have been generated, so we do this inside the loop.
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/filingcabinet/medical/attack_hand()
+/obj/structure/filingcabinet/medical/on_attack_hand()
populate()
. = ..()
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 462d50eb45..01c25b57f1 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -297,6 +297,7 @@
var/datum/ui_state/default/paper_state/state = new
state.edit_mode = MODE_STAMPING // we are read only becausse the sheet is full
state.stamp_icon_state = P.icon_state
+ state.stamp_name = P.name
var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/simple/paper)
state.stamp_class = sheet.icon_class_name(P.icon_state)
diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm
index 770a6682e0..3937720f74 100644
--- a/code/modules/paperwork/paper_cutter.dm
+++ b/code/modules/paperwork/paper_cutter.dm
@@ -66,10 +66,7 @@
return
..()
-/obj/item/papercutter/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/item/papercutter/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
add_fingerprint(user)
if(!storedcutter)
to_chat(user, "The cutting blade is gone! You can't use [src] now.")
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index d1141c9f70..28cb5ffae9 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -11,6 +11,8 @@
throw_speed = 3
throw_range = 7
pressure_resistance = 8
+ attack_hand_speed = CLICK_CD_RAPID
+ attack_hand_is_action = TRUE
var/papertype = /obj/item/paper
var/total_paper = 30
var/list/papers = list()
@@ -60,11 +62,9 @@
/obj/item/paper_bin/attack_paw(mob/user)
return attack_hand(user)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/paper_bin/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/paper_bin/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.lying)
return
- user.changeNext_move(CLICK_CD_MELEE)
if(bin_pen)
var/obj/item/pen/P = bin_pen
P.add_fingerprint(user)
@@ -148,7 +148,7 @@
papertype = /obj/item/paper/natural
resistance_flags = FLAMMABLE
-/obj/item/paper_bin/bundlenatural/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/paper_bin/bundlenatural/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
..()
if(total_paper < 1)
qdel(src)
diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm
index 3e76fc874a..b925c67940 100644
--- a/code/modules/photography/camera/camera.dm
+++ b/code/modules/photography/camera/camera.dm
@@ -221,4 +221,4 @@
p.set_picture(picture, TRUE, TRUE)
if(CONFIG_GET(flag/picture_logging_camera))
- picture.log_to_file()
\ No newline at end of file
+ picture.log_to_file()
diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm
index 6f7bc643c8..d306c46815 100644
--- a/code/modules/photography/photos/frame.dm
+++ b/code/modules/photography/photos/frame.dm
@@ -21,8 +21,7 @@
to_chat(user, "\The [src] already contains a photo.")
..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/wallframe/picture/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/wallframe/picture/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.get_inactive_held_item() != src)
..()
return
@@ -141,10 +140,7 @@
..()
-/obj/structure/sign/picture_frame/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/structure/sign/picture_frame/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(framed)
framed.show(user)
diff --git a/code/modules/pool/pool_drain.dm b/code/modules/pool/pool_drain.dm
index 8deb9b1ffe..527c25b9f0 100644
--- a/code/modules/pool/pool_drain.dm
+++ b/code/modules/pool/pool_drain.dm
@@ -154,7 +154,7 @@
else
new /mob/living/simple_animal/hostile/shark/laser(loc)
-/obj/machinery/pool/filter/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/pool/filter/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
to_chat(user, "You search the filter.")
for(var/obj/O in contents)
O.forceMove(loc)
diff --git a/code/modules/pool/pool_main.dm b/code/modules/pool/pool_main.dm
index 30d1744b57..98189cc8a4 100644
--- a/code/modules/pool/pool_main.dm
+++ b/code/modules/pool/pool_main.dm
@@ -177,7 +177,7 @@
else
return ..()
-/turf/open/pool/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/turf/open/pool/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/pool/pool_structures.dm b/code/modules/pool/pool_structures.dm
index 6b71e95639..ec5d455958 100644
--- a/code/modules/pool/pool_structures.dm
+++ b/code/modules/pool/pool_structures.dm
@@ -11,7 +11,7 @@
layer = ABOVE_MOB_LAYER
dir = EAST
-/obj/structure/pool/ladder/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/pool/ladder/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
@@ -52,7 +52,7 @@
user.pixel_x = initial_px
user.pixel_y = initial_py
-/obj/structure/pool/Lboard/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/pool/Lboard/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscarbon(user))
var/mob/living/carbon/jumper = user
if(jumping)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 3f9ca4f1b7..1159f0a405 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -833,10 +833,7 @@
// attack with hand - remove cell (if cover open) or interact with the APC
-/obj/machinery/power/apc/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/power/apc/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(opened && (!issilicon(user)))
if(cell)
user.visible_message("[user] removes \the [cell] from [src]!","You remove \the [cell].")
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index c8b02669e8..6dcb08512c 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -564,10 +564,7 @@ By design, d1 is the smallest direction and d2 is the highest
icon_state = "[initial(item_state)][amount < 3 ? amount : ""]"
name = "cable [amount < 3 ? "piece" : "coil"]"
-/obj/item/stack/cable_coil/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/item/stack/cable_coil/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
var/obj/item/stack/cable_coil/new_cable = ..()
if(istype(new_cable))
new_cable.color = color
diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm
index 2bd4c04402..466030b83c 100644
--- a/code/modules/power/floodlight.dm
+++ b/code/modules/power/floodlight.dm
@@ -92,10 +92,7 @@
else
. = ..()
-/obj/machinery/power/floodlight/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/power/floodlight/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
var/current = setting
if(current == 1)
current = light_setting_list.len
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 76154907ae..30a7aa152b 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -80,7 +80,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
/obj/machinery/gravity_generator/part/get_status()
return main_part?.get_status()
-/obj/machinery/gravity_generator/part/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/gravity_generator/part/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
return main_part.attack_hand(user)
/obj/machinery/gravity_generator/part/set_broken()
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index f911a6a4e4..20f7ce099a 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -595,11 +595,9 @@
// attack with hand - remove tube/bulb
// if hands aren't protected and the light is on, burn the player
-/obj/machinery/light/attack_hand(mob/living/carbon/human/user)
+/obj/machinery/light/on_attack_hand(mob/living/carbon/human/user)
. = ..()
- if(.)
- return
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
add_fingerprint(user)
if(status == LIGHT_EMPTY)
@@ -812,11 +810,11 @@
return
/obj/item/light/attack(mob/living/M, mob/living/user, def_zone)
- ..()
+ . = ..()
shatter()
/obj/item/light/attack_obj(obj/O, mob/living/user)
- ..()
+ . = ..()
shatter()
/obj/item/light/proc/shatter()
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 4cc9cbe34f..256b13ee72 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -176,6 +176,7 @@
/obj/machinery/power/rad_collector/analyzer_act(mob/living/user, obj/item/I)
if(loaded_tank)
loaded_tank.analyzer_act(user, I)
+ return TRUE
/obj/machinery/power/rad_collector/examine(mob/user)
. = ..()
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 5ef66e26d9..dfb51df9cf 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -21,8 +21,7 @@
FG2.fields -= src
return ..()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/machinery/field/containment/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/field/containment/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(get_dist(src, user) > 1)
return FALSE
else
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 0d182e0a1b..50dae7d6bb 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -315,6 +315,9 @@
/obj/machinery/power/emitter/proc/integrate(obj/item/gun/energy/E,mob/user)
if(istype(E, /obj/item/gun/energy))
+ if(!E.can_emitter)
+ to_chat(user, "[E] cannot fit into emitters.")
+ return
if(!user.transferItemToLoc(E, src))
return
gun = E
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index e33116b02c..528a3abb8b 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -103,7 +103,6 @@
did_something = TRUE
if(did_something)
- user.changeNext_move(CLICK_CD_MELEE)
update_state()
update_icon()
return
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index beaf4bfc43..912fc0a72b 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -246,7 +246,6 @@
did_something = TRUE
if(did_something)
- user.changeNext_move(CLICK_CD_MELEE)
update_state()
update_icon()
return
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 96f8b4e996..cc3a19cf55 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -59,7 +59,7 @@
last_failed_movement = direct
return 0
-/obj/singularity/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/singularity/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
consume(user)
return TRUE
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 823ba75e43..8559b8ba45 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -571,7 +571,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
/obj/machinery/power/supermatter_crystal/attack_ai(mob/user)
return
-/obj/machinery/power/supermatter_crystal/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/power/supermatter_crystal/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm
index ee6a25d8e4..6a73d9a366 100644
--- a/code/modules/projectiles/ammunition/_ammunition.dm
+++ b/code/modules/projectiles/ammunition/_ammunition.dm
@@ -16,7 +16,8 @@
var/variance = 0 //Variance for inaccuracy fundamental to the casing
var/randomspread = 0 //Randomspread for automatics
var/delay = 0 //Delay for energy weapons
- var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown.
+ /// Override this to make the gun check for a different cooldown rather than CLICK_CD_RANGE, which is 4 deciseconds.
+ var/click_cooldown_override
var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the ammo is fired.
var/heavy_metal = TRUE
var/harmful = TRUE //pacifism check for boolet, set to FALSE if bullet is non-lethal
diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm
index 340cfc2e98..0ef4c680aa 100644
--- a/code/modules/projectiles/ammunition/_firing.dm
+++ b/code/modules/projectiles/ammunition/_firing.dm
@@ -16,10 +16,7 @@
AddComponent(/datum/component/pellet_cloud, projectile_type, pellets)
SEND_SIGNAL(src, COMSIG_PELLET_CLOUD_INIT, target, user, fired_from, randomspread, spread, zone_override, params, distro)
- if(click_cooldown_override)
- user.changeNext_move(click_cooldown_override)
- else
- user.changeNext_move(CLICK_CD_RANGE)
+ user.DelayNextAction(considered_action = TRUE, immediate = FALSE)
user.newtonian_move(get_dir(target, user))
update_icon()
return 1
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 679f80dcc1..c3248bab2f 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -17,6 +17,7 @@
force = 5
item_flags = NEEDS_PERMIT
attack_verb = list("struck", "hit", "bashed")
+ attack_speed = CLICK_CD_RANGE
var/fire_sound = "gunshot"
var/suppressed = null //whether or not a message is displayed when fired
@@ -28,6 +29,13 @@
trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers
var/sawn_desc = null //description change if weapon is sawn-off
var/sawn_off = FALSE
+
+ /// can we be put into a turret
+ var/can_turret = TRUE
+ /// can we be put in a circuit
+ var/can_circuit = TRUE
+ /// can we be put in an emitter
+ var/can_emitter = TRUE
/// Weapon is burst fire if this is above 1
var/burst_size = 1
@@ -166,6 +174,8 @@
/obj/item/gun/afterattack(atom/target, mob/living/user, flag, params)
. = ..()
+ if(!CheckAttackCooldown(user, target))
+ return
process_afterattack(target, user, flag, params)
/obj/item/gun/proc/process_afterattack(atom/target, mob/living/user, flag, params)
@@ -174,15 +184,12 @@
if(firing)
return
var/stamloss = user.getStaminaLoss()
- if(stamloss >= STAMINA_NEAR_SOFTCRIT) //The more tired you are, the less damage you do.
- var/penalty = (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*STAM_CRIT_GUN_DELAY
- user.changeNext_move(CLICK_CD_RANGE+(CLICK_CD_RANGE*penalty))
if(flag) //It's adjacent, is the user, or is on the user's person
if(target in user.contents) //can't shoot stuff inside us.
return
if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack
return
- if(target == user && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) //so we can't shoot ourselves (unless mouth selected)
+ if(target == user && user.zone_selected != BODY_ZONE_PRECISE_MOUTH && (user.a_intent != INTENT_DISARM)) //so we can't shoot ourselves (unless mouth selected or disarm intent)
return
if(iscarbon(target))
var/mob/living/carbon/C = target
@@ -219,6 +226,8 @@
to_chat(user, "You need both hands free to fire \the [src]!")
return
+ user.DelayNextAction()
+
//DUAL (or more!) WIELDING
var/bonus_spread = 0
var/loop_counter = 0
@@ -249,6 +258,17 @@
to_chat(user, " [src] is lethally chambered! You don't want to risk harming anyone...")
return FALSE
+/obj/item/gun/CheckAttackCooldown(mob/user, atom/target)
+ if((user.a_intent == INTENT_HARM) && user.Adjacent(target)) //melee
+ return user.CheckActionCooldown(CLICK_CD_MELEE)
+ return user.CheckActionCooldown(get_clickcd())
+
+/obj/item/gun/proc/get_clickcd()
+ return isnull(chambered?.click_cooldown_override)? CLICK_CD_RANGE : chambered.click_cooldown_override
+
+/obj/item/gun/GetEstimatedAttackSpeed()
+ return get_clickcd()
+
/obj/item/gun/proc/handle_pins(mob/living/user)
if(no_pin_required)
return TRUE
@@ -363,17 +383,14 @@
if(user.a_intent == INTENT_HARM) //Flogging
if(bayonet)
M.attackby(bayonet, user)
- attack_delay_done = TRUE
return
else
return ..()
- attack_delay_done = TRUE //we are firing the gun, not bashing people with its butt.
/obj/item/gun/attack_obj(obj/O, mob/user)
if(user.a_intent == INTENT_HARM)
if(bayonet)
- O.attackby(bayonet, user)
- return TRUE
+ return O.attackby(bayonet, user)
return ..()
/obj/item/gun/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index e5dc056011..fa8099a257 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -97,8 +97,7 @@
w_class += S.w_class //so pistols do not fit in pockets when suppressed
update_icon()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/gun/ballistic/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/gun/ballistic/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc == user)
if(suppressed && can_unsuppress)
var/obj/item/suppressor/S = suppressed
@@ -180,13 +179,11 @@
#undef BRAINS_BLOWN_THROW_SPEED
#undef BRAINS_BLOWN_THROW_RANGE
-
-
/obj/item/gun/ballistic/proc/sawoff(mob/user)
if(sawn_off)
to_chat(user, "\The [src] is already shortened!")
return
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
user.visible_message("[user] begins to shorten \the [src].", "You begin to shorten \the [src]...")
//if there's any live ammo inside the gun, makes it go off
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index 89e30e765b..b31fd2d1e0 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -327,8 +327,7 @@
. = ..()
update_icon()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/gun/ballistic/automatic/l6_saw/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/gun/ballistic/automatic/l6_saw/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(loc != user)
..()
return //let them pick it up
diff --git a/code/modules/projectiles/guns/ballistic/laser_gatling.dm b/code/modules/projectiles/guns/ballistic/laser_gatling.dm
index c2dd5bb42d..244bc5b124 100644
--- a/code/modules/projectiles/guns/ballistic/laser_gatling.dm
+++ b/code/modules/projectiles/guns/ballistic/laser_gatling.dm
@@ -29,8 +29,7 @@
/obj/item/minigunpack/process()
overheat = max(0, overheat - heat_diffusion)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/minigunpack/attack_hand(var/mob/living/carbon/user)
+/obj/item/minigunpack/on_attack_hand(var/mob/living/carbon/user)
if(src.loc == user)
if(!armed)
if(user.get_item_by_slot(SLOT_BACK) == src)
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index d700db817c..6c75ac2d4d 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -24,7 +24,7 @@
ammo_x_offset = 2
// Not enough guns have altfire systems like this yet for this to be a universal framework.
var/last_altfire = 0
- var/altfire_delay = 15
+ var/altfire_delay = CLICK_CD_RANGE
/obj/item/gun/energy/e_gun/advtaser/altafterattack(atom/target, mob/user, proximity_flag, params)
. = TRUE
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index bcb074023f..fd09aa7f9d 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -29,6 +29,8 @@
ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan)
cell_type = /obj/item/stock_parts/cell/beam_rifle
canMouseDown = TRUE
+ can_turret = FALSE
+ can_circuit = FALSE
//Cit changes: beam rifle stats.
slowdown = 1
item_flags = NO_MAT_REDEMPTION | SLOWS_WHILE_IN_HAND | NEEDS_PERMIT
@@ -418,10 +420,10 @@
var/wall_devastate = 0
var/aoe_structure_range = 0
var/aoe_structure_damage = 0
- var/aoe_fire_range = 0
- var/aoe_fire_chance = 0
- var/aoe_mob_range = 0
- var/aoe_mob_damage = 0
+ var/aoe_fire_range = 2
+ var/aoe_fire_chance = 100
+ var/aoe_mob_range = 2
+ var/aoe_mob_damage = 30
var/impact_structure_damage = 0
var/impact_direct_damage = 0
var/turf/cached
diff --git a/code/modules/projectiles/guns/misc/medbeam.dm b/code/modules/projectiles/guns/misc/medbeam.dm
index e841422893..6864dad33e 100644
--- a/code/modules/projectiles/guns/misc/medbeam.dm
+++ b/code/modules/projectiles/guns/misc/medbeam.dm
@@ -47,7 +47,7 @@
if(current_target)
LoseTarget()
- if(!isliving(target))
+ if(!isliving(target) || (user == target))
return
current_target = target
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index dbc4a4fedc..43384280d4 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -634,7 +634,7 @@
pixel_x = trajectory.return_px()
pixel_y = trajectory.return_py()
else if(T != loc)
- var/safety = CEILING(pixel_increment_amount / world.icon_size, 1) * 2 + 1
+ var/safety = CEILING(pixel_increment_amount / world.icon_size, 1) * 5 + 1
while(T != loc)
if(!--safety)
CRASH("[type] took too long (allowed: [CEILING(pixel_increment_amount/world.icon_size,1)*2] moves) to get to its location.")
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 385a82baa5..4034759c72 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -1962,12 +1962,12 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/M)
//Bugs should not drink Bug spray.
- if(ismoth(M) || isflyperson(M))
+ if(isinsect(M) || isflyperson(M))
M.adjustToxLoss(1,0)
return ..()
/datum/reagent/consumable/ethanol/bug_spray/on_mob_add(mob/living/carbon/M)
- if(ismoth(M) || isflyperson(M))
+ if(isinsect(M) || isflyperson(M))
M.emote("scream")
return ..()
@@ -2270,25 +2270,29 @@ All effects don't start immediately, but rather get worse over time; the rate is
////////////////////
//Race-Base-Drinks//
////////////////////
+/datum/reagent/consumable/ethanol/species_drink
+ var/species_required
+ var/disgust = 25
+ boozepwr = 50
-/datum/reagent/consumable/ethanol/coldscales
+/datum/reagent/consumable/ethanol/species_drink/on_mob_life(mob/living/carbon/C)
+ if(C.dna.species && C.dna.species.species_type == species_required) //species have a species_type variable that refers to one of the drinks
+ quality = RACE_DRINK
+ else
+ C.adjust_disgust(disgust)
+
+/datum/reagent/consumable/ethanol/species_drink/coldscales
name = "Coldscales"
color = "#5AEB52" //(90, 235, 82)
description = "A cold looking drink made for people with scales."
- boozepwr = 50 //strong!
taste_description = "dead flies"
glass_icon_state = "coldscales"
glass_name = "glass of Coldscales"
glass_desc = "A soft green drink that looks inviting!"
-/datum/reagent/consumable/ethanol/coldscales/on_mob_life(mob/living/carbon/M)
- if(islizard(M))
- quality = RACE_DRINK
- else
- M.adjust_disgust(25)
- return ..()
+ species_required = "lizard"
-/datum/reagent/consumable/ethanol/oil_drum
+/datum/reagent/consumable/ethanol/species_drink/oil_drum
name = "Oil Drum"
color = "#000000" //(0, 0, 0)
description = "Industrial grade oil mixed with some ethanol to make it a drink. Somehow not known to be toxic."
@@ -2298,31 +2302,20 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Drum of oil"
glass_desc = "A gray can of booze and oil..."
-/datum/reagent/consumable/ethanol/oil_drum/on_mob_life(mob/living/carbon/M)
- if(isipcperson(M) || issynthliz(M))
- quality = RACE_DRINK
- else
- M.adjust_disgust(25)
- return ..()
+ species_required = "robot"
-/datum/reagent/consumable/ethanol/nord_king
+/datum/reagent/consumable/ethanol/species_drink/nord_king
name = "Nord King"
color = "#EB1010" //(235, 16, 16)
description = "Strong mead mixed with more honey and ethanol. Beloved by its human patrons."
- boozepwr = 50 //strong!
taste_description = "honey and red wine"
glass_icon_state = "nord_king"
glass_name = "Keg of Nord King"
glass_desc = "A dripping keg of red mead."
-/datum/reagent/consumable/ethanol/nord_king/on_mob_life(mob/living/carbon/M)
- if(ishumanbasic(M) || isdwarf(M) || isangel(M)) //Humans and angel races are rare
- quality = RACE_DRINK
- else
- M.adjust_disgust(25)
- return ..()
+ species_required = "basic"
-/datum/reagent/consumable/ethanol/velvet_kiss
+/datum/reagent/consumable/ethanol/species_drink/velvet_kiss
name = "Velvet Kiss"
color = "#EB1010" //(235, 16, 16)
description = "A bloody drink mixed with wine."
@@ -2332,14 +2325,9 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of Velvet Kiss"
glass_desc = "Red and white drink for the upper classes or undead."
-/datum/reagent/consumable/ethanol/velvet_kiss/on_mob_life(mob/living/carbon/M)
- if(iszombie(M) || isvampire(M) || isdullahan(M)) //Rare races!
- quality = RACE_DRINK
- else
- M.adjust_disgust(25)
- return ..()
+ species_required = "undead"
-/datum/reagent/consumable/ethanol/abduction_fruit
+/datum/reagent/consumable/ethanol/species_drink/abduction_fruit
name = "Abduction Fruit"
color = "#DEFACD" //(222, 250, 205)
description = "Mixing of juices to make an alien taste."
@@ -2349,14 +2337,9 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of Abduction Fruit"
glass_desc = "Mixed fruits that were never meant to be mixed..."
-/datum/reagent/consumable/ethanol/abduction_fruit/on_mob_life(mob/living/carbon/M)
- if(isabductor(M) || isxenoperson(M))
- quality = RACE_DRINK
- else
- M.adjust_disgust(25)
- return ..()
+ species_required = "alien"
-/datum/reagent/consumable/ethanol/bug_zapper
+/datum/reagent/consumable/ethanol/species_drink/bug_zapper
name = "Bug Zapper"
color = "#F5882A" //(222, 250, 205)
description = "Copper and lemon juice. Hardly even a drink."
@@ -2366,14 +2349,9 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of Bug Zapper"
glass_desc = "An odd mix of copper, lemon juice and power meant for non-human consumption."
-/datum/reagent/consumable/ethanol/bug_zapper/on_mob_life(mob/living/carbon/M)
- if(isinsect(M) || isflyperson(M) || ismoth(M))
- quality = RACE_DRINK
- else
- M.adjust_disgust(25)
- return ..()
+ species_required = "bug"
-/datum/reagent/consumable/ethanol/mush_crush
+/datum/reagent/consumable/ethanol/species_drink/mush_crush
name = "Mush Crush"
color = "#F5882A" //(222, 250, 205)
description = "Soil in a glass."
@@ -2383,14 +2361,9 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of Mush Crush"
glass_desc = "Popular among people that want to grow their own food rather than drink the soil."
-/datum/reagent/consumable/ethanol/mush_crush/on_mob_life(mob/living/carbon/M)
- if(ispodperson(M) || ismush(M))
- quality = RACE_DRINK
- else
- M.adjust_disgust(25)
- return ..()
+ species_required = "plant"
-/datum/reagent/consumable/ethanol/darkbrew
+/datum/reagent/consumable/ethanol/species_drink/darkbrew
name = "Darkbrew"
color = "#000000" //(0, 0, 0)
description = "Contained dark matter mixed with coffee."
@@ -2400,31 +2373,21 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of Darkbrew"
glass_desc = "A pitch black drink that's commonly confused with a type of coffee."
-/datum/reagent/consumable/ethanol/darkbrew/on_mob_life(mob/living/carbon/M)
- if(isshadow(M))
- quality = RACE_DRINK
- else
- M.adjust_disgust(25)
- return ..()
+ species_required = "shadow"
-/datum/reagent/consumable/ethanol/hollow_bone
+/datum/reagent/consumable/ethanol/species_drink/hollow_bone
name = "Hollow Bone"
color = "#FCF7D4" //(252, 247, 212)
- description = "Shockingly none-harmful mix of toxins and milk."
+ description = "Shockingly non-harmful mix of toxins and milk."
boozepwr = 15
taste_description = "Milk and salt"
glass_icon_state = "hollow_bone"
glass_name = "skull of Hollow Bone"
- glass_desc = "Mixing of milk and bone hurting juice for enjoyment for rather skinny people."
+ glass_desc = "Mixing of milk and bone hurting juice for the enjoyment of rather skinny people."
-/datum/reagent/consumable/ethanol/hollow_bone/on_mob_life(mob/living/carbon/M)
- if(isplasmaman(M) || isskeleton(M))
- quality = RACE_DRINK
- else
- M.adjust_disgust(25)
- return ..()
+ species_required = "skeleton"
-/datum/reagent/consumable/ethanol/frisky_kitty
+/datum/reagent/consumable/ethanol/species_drink/frisky_kitty
name = "Frisky Kitty"
color = "#FCF7D4" //(252, 247, 212)
description = "Warm milk mixed with a catnip."
@@ -2434,14 +2397,9 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "cup of Drisky Kitty"
glass_desc = "Warm milk and some catnip."
-/datum/reagent/consumable/ethanol/frisky_kitty/on_mob_life(mob/living/carbon/M)
- if(ismammal(M) || iscatperson(M)) //well its not to bad for mammals
- quality = RACE_DRINK
- else
- M.adjust_disgust(25)
- return ..()
+ species_required = "furry"
-/datum/reagent/consumable/ethanol/jell_wyrm
+/datum/reagent/consumable/ethanol/species_drink/jell_wyrm
name = "Jell Wyrm"
color = "#FF6200" //(255, 98, 0)
description = "Horrible mix of Co2, toxins and heat. Meant for slime based life."
@@ -2451,15 +2409,9 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of Jell Wyrm"
glass_desc = "A bubbly drink that is rather inviting to those that don't know who it's meant for."
-/datum/reagent/consumable/ethanol/jell_wyrm/on_mob_life(mob/living/carbon/M)
- if(isjellyperson(M) || isstartjelly(M) || isslimeperson(M) || isluminescent(M))
- quality = RACE_DRINK
- else
- M.adjust_disgust(25)
- M.adjustToxLoss(1, 0) //Low tox due to being carp + jell toxins.
- return ..()
+ species_required = "jelly"
-/datum/reagent/consumable/ethanol/laval_spit //Yes Laval
+/datum/reagent/consumable/ethanol/species_drink/laval_spit //Yes Laval
name = "Laval Spit"
color = "#DE3009" //(222, 48, 9)
description = "Heat minerals and some mauna loa. Meant for rock based life."
@@ -2469,15 +2421,10 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of Laval Spit"
glass_desc = "Piping hot drink for those who can stomach the heat of lava."
-/datum/reagent/consumable/ethanol/laval_spit/on_mob_life(mob/living/carbon/M)
- if(isgolem(M))
- quality = RACE_DRINK
- else
- M.adjust_disgust(25)
- return ..()
+ species_required = "golem"
///////////////
-//Barrle Wine//
+//Barrel Wine//
///////////////
/datum/reagent/consumable/ethanol/fruit_wine
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index f1e45d0717..96f2c04598 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -467,7 +467,7 @@
/datum/reagent/drug/skooma/on_mob_metabolize(mob/living/L)
. = ..()
L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/skooma)
- L.next_move_modifier *= 2
+ L.action_cooldown_mod *= 2
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.physiology)
@@ -480,7 +480,7 @@
/datum/reagent/drug/skooma/on_mob_end_metabolize(mob/living/L)
. = ..()
L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/skooma)
- L.next_move_modifier *= 0.5
+ L.action_cooldown_mod *= 0.5
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.physiology)
@@ -542,13 +542,13 @@
/datum/reagent/syndicateadrenals/on_mob_metabolize(mob/living/M)
. = ..()
if(istype(M))
- M.next_move_modifier *= 0.5
+ M.action_cooldown_mod *= 0.5
to_chat(M, "You feel an intense surge of energy rushing through your veins.")
/datum/reagent/syndicateadrenals/on_mob_end_metabolize(mob/living/M)
. = ..()
if(istype(M))
- M.next_move_modifier *= 2
+ M.action_cooldown_mod *= 2
to_chat(M, "You feel as though the world around you is going faster.")
/datum/reagent/syndicateadrenals/overdose_start(mob/living/M)
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index fbdbb5f656..b71584982c 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -69,7 +69,8 @@
to_chat(user, "[src]'s transfer amount is now [amount_per_transfer_from_this] units.")
return
-/obj/item/reagent_containers/attack(mob/M, mob/user, def_zone)
+/obj/item/reagent_containers/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
+ . = ..()
if(user.a_intent == INTENT_HARM)
return ..()
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 37ea2ca70d..ec26182813 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -9,6 +9,11 @@
container_HP = 2
/obj/item/reagent_containers/glass/attack(mob/M, mob/user, obj/target)
+ // WARNING: This entire section is shitcode and prone to breaking at any time.
+ INVOKE_ASYNC(src, .proc/attempt_feed, M, user, target) // for example, the arguments in this proc are wrong
+ // but i don't have time to properly fix it right now.
+
+/obj/item/reagent_containers/glass/proc/attempt_feed(mob/M, mob/user, obj/target)
if(!canconsume(M, user))
return
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 9bce478e04..835ffe2d89 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -368,13 +368,17 @@
obj_flags |= EMAGGED
return TRUE
-/obj/item/hypospray/mkii/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/hypospray/mkii/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..() //Don't bother changing this or removing it from containers will break.
/obj/item/hypospray/mkii/attack(obj/item/I, mob/user, params)
return
/obj/item/hypospray/mkii/afterattack(atom/target, mob/user, proximity)
+ . = ..()
+ INVOKE_ASYNC(src, .proc/attempt_inject, target, user, proximity)
+
+/obj/item/hypospray/mkii/proc/attempt_inject(atom/target, mob/user, proximity)
if(!vial || !proximity || !isliving(target))
return
var/mob/living/L = target
diff --git a/code/modules/reagents/reagent_containers/maunamug.dm b/code/modules/reagents/reagent_containers/maunamug.dm
index 1600699226..3dfac8a631 100644
--- a/code/modules/reagents/reagent_containers/maunamug.dm
+++ b/code/modules/reagents/reagent_containers/maunamug.dm
@@ -88,7 +88,7 @@
user.visible_message("[user] inserts a power cell into [src].", "You insert the power cell into [src].")
update_icon()
-/obj/item/reagent_containers/glass/maunamug/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/reagent_containers/glass/maunamug/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
if(cell && open)
cell.update_icon()
user.put_in_hands(cell)
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index ec1e7823ed..3c23794e5a 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -28,22 +28,24 @@
/obj/item/reagent_containers/pill/get_w_volume() // DEFAULT_VOLUME_TINY at 25u, DEFAULT_VOLUME_SMALL at 50u
return DEFAULT_VOLUME_TINY/2 + reagents.total_volume / reagents.maximum_volume * DEFAULT_VOLUME_TINY
-/obj/item/reagent_containers/pill/attack(mob/M, mob/user, def_zone)
+/obj/item/reagent_containers/pill/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
+ INVOKE_ASYNC(src, .proc/attempt_feed, M, user)
+
+/obj/item/reagent_containers/pill/proc/attempt_feed(mob/living/M, mob/living/user)
if(!canconsume(M, user))
- return 0
+ return FALSE
if(M == user)
M.visible_message("[user] attempts to [apply_method] [src].")
if(self_delay)
if(!do_mob(user, M, self_delay))
- return 0
+ return FALSE
to_chat(M, "You [apply_method] [src].")
-
else
M.visible_message("[user] attempts to force [M] to [apply_method] [src].", \
"[user] attempts to force [M] to [apply_method] [src].")
if(!do_mob(user, M))
- return 0
+ return FALSE
M.visible_message("[user] forces [M] to [apply_method] [src].", \
"[user] forces [M] to [apply_method] [src].")
@@ -56,8 +58,7 @@
reagents.reaction(M, apply_type)
reagents.trans_to(M, reagents.total_volume)
qdel(src)
- return 1
-
+ return TRUE
/obj/item/reagent_containers/pill/afterattack(obj/target, mob/user , proximity)
. = ..()
@@ -77,6 +78,7 @@
"You dissolve [src] in [target].", vision_distance = 2)
reagents.trans_to(target, reagents.total_volume)
qdel(src)
+ return STOP_ATTACK_PROC_CHAIN
/obj/item/reagent_containers/pill/tox
name = "toxins pill"
diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm
index afa188e9f6..469a8ef907 100644
--- a/code/modules/reagents/reagent_containers/rags.dm
+++ b/code/modules/reagents/reagent_containers/rags.dm
@@ -55,11 +55,10 @@
if(do_after(user, action_speed, target = A))
user.visible_message("[user] finishes wiping off [A]!", "You finish wiping off [A].")
SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
- return
/obj/item/reagent_containers/rag/alt_pre_attack(mob/living/M, mob/living/user, params)
if(istype(M) && user.a_intent == INTENT_HELP)
- user.changeNext_move(CLICK_CD_MELEE)
+ user.DelayNextAction(CLICK_CD_MELEE)
if(M.on_fire)
user.visible_message("\The [user] uses \the [src] to pat out [M == user ? "[user.p_their()]" : "\the [M]'s"] flames!")
if(hitsound)
@@ -193,4 +192,4 @@
extinguish_efficiency = 5
action_speed = 15
damp_threshold = 0.8
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 50, "acid" = 50) //items don't provide armor to wearers unlike clothing yet.
\ No newline at end of file
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 50, "acid" = 50) //items don't provide armor to wearers unlike clothing yet.
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 7fea8250d9..9b25a80680 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -27,6 +27,8 @@
/obj/item/reagent_containers/spray/afterattack(atom/A, mob/user)
. = ..()
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics))
return
@@ -50,7 +52,7 @@
spray(A)
playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
- user.changeNext_move(CLICK_CD_RANGE*2)
+ user.last_action = world.time
user.newtonian_move(get_dir(A, user))
var/turf/T = get_turf(src)
if(reagents.has_reagent(/datum/reagent/toxin/acid))
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 4b73ebde4a..ca80d6472c 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -43,8 +43,7 @@
mode = !mode
update_icon()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/reagent_containers/syringe/attack_hand()
+/obj/item/reagent_containers/syringe/on_attack_hand()
. = ..()
update_icon()
@@ -54,8 +53,11 @@
/obj/item/reagent_containers/syringe/attackby(obj/item/I, mob/user, params)
return
-/obj/item/reagent_containers/syringe/afterattack(atom/target, mob/user , proximity)
+/obj/item/reagent_containers/syringe/afterattack(atom/target, mob/user, proximity)
. = ..()
+ INVOKE_ASYNC(src, .proc/attempt_inject, target, user, proximity)
+
+/obj/item/reagent_containers/syringe/proc/attempt_inject(atom/target, mob/user, proximity)
if(busy)
return
if(!proximity)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 0131e6d028..819012a61a 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -79,7 +79,7 @@
else
. += "There are no paper cups left."
-/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/reagent_dispensers/water_cooler/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index d8cb462c97..b81c3b88f8 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -174,10 +174,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
return ..()
// attack with hand, move pulled object onto conveyor
-/obj/machinery/conveyor/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
+/obj/machinery/conveyor/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
user.Move_Pulled(src)
// make the conveyor broken
diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm
index 551d6fa0e3..0a278602c1 100644
--- a/code/modules/research/designs/tool_designs.dm
+++ b/code/modules/research/designs/tool_designs.dm
@@ -91,6 +91,16 @@
build_path = /obj/item/construction/rld/mini
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO
+
+ /datum/design/ranged_analyzer
+ name = "Long-range Analyzer"
+ desc = "A new advanced atmospheric analyzer design, capable of performing scans at long range."
+ id = "ranged_analyzer"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 400, /datum/material/glass = 1000, /datum/material/uranium = 800, /datum/material/gold = 200, /datum/material/plastic = 200)
+ build_path = /obj/item/analyzer/ranged
+ category = list("Tool Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
/////////////////////////////////////////
//////////////Alien Tools////////////////
diff --git a/code/modules/research/nanites/nanite_chamber.dm b/code/modules/research/nanites/nanite_chamber.dm
index 4a980a0436..01513a0b41 100644
--- a/code/modules/research/nanites/nanite_chamber.dm
+++ b/code/modules/research/nanites/nanite_chamber.dm
@@ -150,8 +150,6 @@
return
if(busy)
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the door of [src]!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a metallic creaking from [src].")
diff --git a/code/modules/research/nanites/public_chamber.dm b/code/modules/research/nanites/public_chamber.dm
index 76392c66e9..b7a8db4080 100644
--- a/code/modules/research/nanites/public_chamber.dm
+++ b/code/modules/research/nanites/public_chamber.dm
@@ -130,8 +130,6 @@
return
if(busy)
return
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message("You see [user] kicking against the door of [src]!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear a metallic creaking from [src].")
diff --git a/code/modules/research/techweb/nodes/tools_nodes.dm b/code/modules/research/techweb/nodes/tools_nodes.dm
index b084979116..180cdb5778 100644
--- a/code/modules/research/techweb/nodes/tools_nodes.dm
+++ b/code/modules/research/techweb/nodes/tools_nodes.dm
@@ -44,7 +44,7 @@
id = "exp_tools"
display_name = "Experimental Tools"
description = "Highly advanced construction tools."
- design_ids = list("exwelder", "jawsoflife", "handdrill", "holosigncombifan")
+ design_ids = list("exwelder", "jawsoflife", "handdrill", "holosigncombifan", "ranged_analyzer")
prereq_ids = list("adv_engi")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm
index 996b84131f..1ac09652b5 100644
--- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm
@@ -57,7 +57,7 @@ Slimecrossing Armor
light_color = newcolor
set_light(5)
-/obj/structure/light_prism/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/light_prism/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
to_chat(user, "You dispel [src]")
qdel(src)
@@ -118,7 +118,7 @@ Slimecrossing Armor
..()
REMOVE_TRAIT(user, TRAIT_PACIFISM, "peaceflower_[REF(src)]")
-/obj/item/clothing/head/peaceflower/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/head/peaceflower/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscarbon(user))
var/mob/living/carbon/C = user
if(src == C.head)
diff --git a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
index 65530031c0..088683ccd2 100644
--- a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
+++ b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
@@ -73,7 +73,7 @@
create_reagents(20)
reagents.add_reagent(dispensedreagent, 20)
-/obj/structure/sink/oil_well/attack_hand(mob/M)
+/obj/structure/sink/oil_well/on_attack_hand(mob/M)
flick("puddle-oil-splash",src)
reagents.reaction(M, TOUCH, 20) //Covers target in 20u of oil.
to_chat(M, "You touch the pool of oil, only to get oil all over yourself. It would be wise to wash this off with water.")
diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
index e6f87eea13..fd2f4377e7 100644
--- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
+++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
@@ -87,8 +87,7 @@
else
return QDEL_HINT_LETMELIVE
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/necropolis_gate/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/necropolis_gate/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(locked || uses == 0)
to_chat(user, "It's [open ? "stuck open":"locked"].")
return
@@ -166,8 +165,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
else
return QDEL_HINT_LETMELIVE
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/structure/necropolis_gate/legion_gate/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/necropolis_gate/legion_gate/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!open && !changing_openness)
var/safety = alert(user, "You think this might be a bad idea...", "Knock on the door?", "Proceed", "Abort")
if(safety == "Abort" || !in_range(src, user) || !src || open || changing_openness || user.incapacitated())
diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
index 8a98a1939f..e87382cd6a 100644
--- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm
+++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
@@ -57,7 +57,7 @@
canvas rotting away and contents vanishing.")
qdel(src)
-/obj/structure/cursed_money/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/structure/cursed_money/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(.)
return
diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
index b74b32009f..d97eae5766 100644
--- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm
+++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
@@ -263,7 +263,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
/turf/closed/indestructible/hoteldoor/attack_tk(mob/user)
return //need to be close.
-/turf/closed/indestructible/hoteldoor/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/turf/closed/indestructible/hoteldoor/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
promptExit(user)
/turf/closed/indestructible/hoteldoor/attack_animal(mob/user)
diff --git a/code/modules/shuttle/custom_shuttle.dm b/code/modules/shuttle/custom_shuttle.dm
index 6ff15c628e..c71b6ba9a8 100644
--- a/code/modules/shuttle/custom_shuttle.dm
+++ b/code/modules/shuttle/custom_shuttle.dm
@@ -257,7 +257,7 @@
return
..()
-/obj/machinery/computer/camera_advanced/shuttle_docker/custom/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/computer/camera_advanced/shuttle_docker/custom/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!shuttleId)
to_chat(user, "You must link the console to a shuttle first.")
return
diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm
index 0cf348a95b..195e87720c 100644
--- a/code/modules/shuttle/navigation_computer.dm
+++ b/code/modules/shuttle/navigation_computer.dm
@@ -29,7 +29,7 @@
. = ..()
GLOB.navigation_computers -= src
-/obj/machinery/computer/camera_advanced/shuttle_docker/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/computer/camera_advanced/shuttle_docker/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(jammed)
to_chat(user, "The Syndicate is jamming the console!")
return
diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm
index 9af6d7fe9f..314d5e8b80 100644
--- a/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm
+++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm
@@ -61,7 +61,7 @@
if(user?.client)
user.client.images -= eyeobj.user_image
-/obj/machinery/computer/camera_advanced/shuttle_creator/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/machinery/computer/camera_advanced/shuttle_creator/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(!is_operational()) //you cant use broken machine you chumbis
return
if(current_user)
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index 21552f7e87..57502e2cd5 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -56,11 +56,6 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
to_chat(caller, "[caller.ranged_ability.name] has been disabled.")
caller.ranged_ability.remove_ranged_ability()
return TRUE //TRUE for failed, FALSE for passed.
- if(ranged_clickcd_override >= 0)
- ranged_ability_user.next_click = world.time + ranged_clickcd_override
- else
- ranged_ability_user.next_click = world.time + CLICK_CD_CLICK_ABILITY
- ranged_ability_user.face_atom(A)
return FALSE
/obj/effect/proc_holder/proc/add_ranged_ability(mob/living/user, msg, forced)
diff --git a/code/modules/spells/spell_types/spacetime_distortion.dm b/code/modules/spells/spell_types/spacetime_distortion.dm
index bec0f7871a..5797cbf8b7 100644
--- a/code/modules/spells/spell_types/spacetime_distortion.dm
+++ b/code/modules/spells/spell_types/spacetime_distortion.dm
@@ -110,8 +110,7 @@
else
walk_link(user)
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/effect/cross_action/spacetime_dist/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/effect/cross_action/spacetime_dist/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
walk_link(user)
/obj/effect/cross_action/spacetime_dist/attack_paw(mob/user)
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index 40fb066fe1..6d8ab9cc7f 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -279,5 +279,5 @@
H.add_movespeed_modifier(/datum/movespeed_modifier/dna_vault_speedup)
if(VAULT_QUICK)
to_chat(H, "Your arms move as fast as lightning.")
- H.next_move_modifier = 0.5
+ H.action_cooldown_mod = 0.5
power_lottery[H] = list()
diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm
index 2465b63800..f0f98a5fa5 100755
--- a/code/modules/surgery/organs/liver.dm
+++ b/code/modules/surgery/organs/liver.dm
@@ -73,8 +73,8 @@
/obj/item/organ/liver/proc/sizeMoveMod(value, mob/living/carbon/C)
if(cachedmoveCalc == value)
return
- C.next_move_modifier /= cachedmoveCalc
- C.next_move_modifier *= value
+ C.action_cooldown_mod /= cachedmoveCalc
+ C.action_cooldown_mod *= value
cachedmoveCalc = value
/obj/item/organ/liver/fly
diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm
index ccaa998cf7..5149259bb8 100644
--- a/code/modules/uplink/uplink_items/uplink_devices.dm
+++ b/code/modules/uplink/uplink_items/uplink_devices.dm
@@ -206,10 +206,10 @@
/datum/uplink_item/device_tools/stimpack
name = "Stimpack"
- desc = "Stimpacks, the tool of many great heroes, make you nearly immune to stuns and knockdowns for about \
+ desc = "Stimpacks, the tool of many great heroes. Makes you nearly immune to non-lethal weaponry for about \
5 minutes after injection."
item = /obj/item/reagent_containers/syringe/stimulants
- cost = 3
+ cost = 5
surplus = 90
/datum/uplink_item/device_tools/medkit
diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm
index fb30e66f97..4545fab2a7 100644
--- a/code/modules/vehicles/cars/car.dm
+++ b/code/modules/vehicles/cars/car.dm
@@ -57,7 +57,7 @@
return FALSE
return ..()
-/obj/vehicle/sealed/car/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/vehicle/sealed/car/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags)
. = ..()
if(!(car_traits & CAN_KIDNAP))
return
diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm
index 547eef7af2..8f9d553ec7 100644
--- a/code/modules/vehicles/pimpin_ride.dm
+++ b/code/modules/vehicles/pimpin_ride.dm
@@ -62,11 +62,8 @@
if(floorbuffer)
. += "cart_buffer"
-/obj/vehicle/ridden/janicart/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- . = ..()
- if(.)
- return
- else if(mybag)
+/obj/vehicle/ridden/janicart/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+ if(mybag)
mybag.forceMove(get_turf(user))
user.put_in_hands(mybag)
mybag = null
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index 2691906af4..7005a0b02f 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -14,6 +14,10 @@
/obj/item/clothing/head/beret/blue = 3,
/obj/item/clothing/glasses/monocle = 3,
/obj/item/clothing/suit/jacket = 4,
+ /obj/item/clothing/suit/jacket/flannel = 4,
+ /obj/item/clothing/suit/jacket/flannel/red = 4,
+ /obj/item/clothing/suit/jacket/flannel/aqua = 4,
+ /obj/item/clothing/suit/jacket/flannel/brown = 4,
/obj/item/clothing/suit/jacket/puffer/vest = 4,
/obj/item/clothing/suit/jacket/puffer = 4,
/obj/item/clothing/suit/hooded/cloak/david = 4,
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index 8552d52b04..26beccaac0 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -248,6 +248,7 @@
vend_reply = "Thank you for using the BarDrobe!"
products = list(/obj/item/clothing/head/that = 3,
/obj/item/radio/headset/headset_srv = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/bar = 3,
/obj/item/clothing/under/suit/sl = 3,
/obj/item/clothing/under/rank/civilian/bartender = 3,
/obj/item/clothing/under/rank/civilian/bartender/skirt = 2,
diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm
index 50cdc32bf6..a367abb098 100644
--- a/code/modules/vore/eating/belly_obj.dm
+++ b/code/modules/vore/eating/belly_obj.dm
@@ -542,8 +542,6 @@
if (!(R in contents))
return // User is not in this belly
- R.changeNext_move(CLICK_CD_BREAKOUT*0.5)
-
if(owner.stat) //If owner is stat (dead, KO) we can actually escape
to_chat(R,"You attempt to climb out of \the [lowertext(name)]. (This will take around [escapetime/10] seconds.)")
to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!")
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index 1c9bf029ea..9395cef952 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -349,7 +349,7 @@
if(incapacitated(ignore_restraints = TRUE))
to_chat(src, "You can't do that while incapacitated.")
return
- if(next_move > world.time)
+ if(!CheckActionCooldown())
to_chat(src, "You can't do that so fast, slow down.")
return
@@ -366,11 +366,10 @@
if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.vore_flags & LICKABLE)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE))
return
- changeNext_move(CLICK_CD_MELEE)
+ DelayNextAction(CLICK_CD_MELEE)
visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!")
-
/mob/living/proc/get_taste_message(allow_generic = TRUE, datum/species/mrace)
if(!vore_taste && !allow_generic)
return FALSE
diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm
index 2b02e0e26e..3a7cd4b03f 100644
--- a/code/modules/zombie/items.dm
+++ b/code/modules/zombie/items.dm
@@ -37,11 +37,11 @@
if(!proximity_flag)
return
else
- if(istype(target, /obj/)) //do far more damage to non mobs so we can get through airlocks
+ if(istype(target, /obj)) //do far more damage to non mobs so we can get through airlocks
var/obj/target_object = target
target_object.take_damage(force * 3, BRUTE, "melee", 0)
- else
- if(isliving(target) && ishuman(target))
+ else if(isliving(target))
+ if(ishuman(target))
try_to_zombie_infect(target)
else
check_feast(target, user)
diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm
index 3d045ba31e..2681f781a9 100644
--- a/code/modules/zombie/organs.dm
+++ b/code/modules/zombie/organs.dm
@@ -93,7 +93,8 @@
playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, 1)
owner.do_jitter_animation(living_transformation_time)
owner.Stun(living_transformation_time)
- to_chat(owner, "You are now a zombie!")
+ to_chat(owner, "You are now a zombie! You claw and bite, turning your fellow crewmembers into friends that help spread the plague.")
+ to_chat(owner, "You are a zombie. Please act like one. Letting the crew remove the tumor inside your brain is a dick move to whoever infected you. Please do not do it.")
/obj/item/organ/zombie_infection/nodamage
causes_damage = FALSE
diff --git a/html/changelog.html b/html/changelog.html
index 8f0f7a5952..3248f6d729 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,133 @@
-->
+
29 July 2020
+
DeltaFire15 updated:
+
+ - The 'Naked' outfit is no longer broken.
+
+
Ghommie updated:
+
+ - fixed cremator trays, paleness examination strings, chat message for stamping paper, looping sounds, load away missions/VR admin verb, access requirements for using the sechuds.
+ - Alt-Clicking a cigarette packet should pull the lighter out first if present, then cigarettes.
+
+
Hatterhat updated:
+
+ - Directional windows can now be rotated counterclockwise properly again.
+
+
NecromancerAnne, Sirich96 updated:
+
+ - Stunbaton sprites by Sirich96.
+ - New sprites for the stunsword.
+
+
necromanceranne updated:
+
+ - Adds some in-hands for the rapier sheath.
+
+
timothyteakettle updated:
+
+ - tail wagging should work in all cases now
+ - bluespace jars work as intended now
+ - aliens can remove embeds now
+ - bloodsuckers are not affected by bloodloss
+
+
zeroisthebiggay updated:
+
+ - Flannel jackets and bartender winter coat
+
+
+
28 July 2020
+
Cacogen updated:
+
+ - OSHA has more pull than anyone could have expected. All armor provided by Nanotrasen and the syndicate now have tags that accurately lists defenses and resistances of a piece of clothing.
+
+
CameronWoof updated:
+
+ - Exotic seed crates now contain a spaceman's trumpet seed packet.
+
+
EmeraldSundisk updated:
+
+ - Renovates Snow Taxi's northeast bathroom to have multiple non-urinal toilets and showers
+ - Adds signage/labeling to improve map readability
+ - Adds a bathroom to the northwest station
+ - Adds a filing cabinet to the cargo department
+ - Area designation adjustments to account for the above changes
+ - Adds a missing airlock cyclelink near medical
+
+
Ludox235 updated:
+
+ - Makes the flavour text that appears when you become a zombie tell you to act like one.
+
+
MrJWhit updated:
+
+ - Decluttered toxins and hid the yellow mix line in atmos, for metastation
+
+
SiliconMain updated:
+
+ - Paramedic heirloom is now a zippo
+ - Durathread belts now protect their contents from radiation, and can hold full sized extinguishers
+
+
Sishen1542 updated:
+
+
dapnee updated:
+
+ - added a fan to the listening outpost
+ - added two missing r-walls near the SM, removed random light and wire node below the engine, and fixed the missing cable in the courtroom on Kilo
+
+
kappa-sama updated:
+
+ - Stimpaks cost 5tc once more, up from 3tc.
+
+
silicons updated:
+
+ - polychromatic cloaks to loadout
+ - no more self healing with medibeam guns
+ - oh no, taser buff. alt fire delay dropped to 0.4 seconds.
+ - you can now shoot yourself by disarm-intenting yourself with a gun.
+
+
timothyteakettle updated:
+
+ - species code is now slightly less messy
+ - slight tweak to how material crafting works
+ - changed up pet carriers / bluespace jars a bit so you can't fit certain things inside them and also the text shown for resist times is accurate
+
+
zeroisthebiggay updated:
+
+ - Black Box theft objective
+
+
+
27 July 2020
+
Hatterhat updated:
+
+ - Training bokkens! Make 'em from wood, use 'em in-hand to toggle between harmful and not-so-harmful, practice your parrying with them!
+ - Marker beacons should have a sprite again.
+
+
silicons updated:
+
+ - clownops and clown mobs now share the same faction. HONK!
+
+
timothyteakettle updated:
+
+ - modern pickle technology now allows people who have been turned into pickles, to be retrieved through the medical course of dying
+
+
+
26 July 2020
+
DeltaFire15 updated:
+
+ - Organs now decay again.
+
+
Iatots updated:
+
+ - Licking wounds now may cause you to spit out a hairball once in a while!
+ - You can now craft a catgirl plushie with 3 of a new ingredient occasionally found in medbay!
+
+
dapnee updated:
+
+ - removed legacy public mining shuttle area and remade lounge
+
+
25 July 2020
CameronWoof updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index c433ea1a19..cd3f5c04bc 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -26518,3 +26518,89 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- bugfix: Aloe now has an icon.
timothyteakettle:
- bugfix: beepsky replaces the word THREAT_LEVEL with the actual threat level
+2020-07-26:
+ DeltaFire15:
+ - bugfix: Organs now decay again.
+ Iatots:
+ - tweak: Licking wounds now may cause you to spit out a hairball once in a while!
+ - rscadd: You can now craft a catgirl plushie with 3 of a new ingredient occasionally
+ found in medbay!
+ dapnee:
+ - tweak: removed legacy public mining shuttle area and remade lounge
+2020-07-27:
+ Hatterhat:
+ - rscadd: Training bokkens! Make 'em from wood, use 'em in-hand to toggle between
+ harmful and not-so-harmful, practice your parrying with them!
+ - bugfix: Marker beacons should have a sprite again.
+ silicons:
+ - rscadd: clownops and clown mobs now share the same faction. HONK!
+ timothyteakettle:
+ - bugfix: modern pickle technology now allows people who have been turned into pickles,
+ to be retrieved through the medical course of dying
+2020-07-28:
+ Cacogen:
+ - rscadd: OSHA has more pull than anyone could have expected. All armor provided
+ by Nanotrasen and the syndicate now have tags that accurately lists defenses
+ and resistances of a piece of clothing.
+ CameronWoof:
+ - tweak: Exotic seed crates now contain a spaceman's trumpet seed packet.
+ EmeraldSundisk:
+ - rscadd: Renovates Snow Taxi's northeast bathroom to have multiple non-urinal toilets
+ and showers
+ - rscadd: Adds signage/labeling to improve map readability
+ - rscadd: Adds a bathroom to the northwest station
+ - rscadd: Adds a filing cabinet to the cargo department
+ - tweak: Area designation adjustments to account for the above changes
+ - bugfix: Adds a missing airlock cyclelink near medical
+ Ludox235:
+ - tweak: Makes the flavour text that appears when you become a zombie tell you to
+ act like one.
+ MrJWhit:
+ - tweak: Decluttered toxins and hid the yellow mix line in atmos, for metastation
+ SiliconMain:
+ - tweak: Paramedic heirloom is now a zippo
+ - tweak: Durathread belts now protect their contents from radiation, and can hold
+ full sized extinguishers
+ Sishen1542:
+ - rscdel: removed zoomba
+ dapnee:
+ - tweak: added a fan to the listening outpost
+ - bugfix: added two missing r-walls near the SM, removed random light and wire node
+ below the engine, and fixed the missing cable in the courtroom on Kilo
+ kappa-sama:
+ - balance: Stimpaks cost 5tc once more, up from 3tc.
+ silicons:
+ - rscadd: polychromatic cloaks to loadout
+ - rscdel: no more self healing with medibeam guns
+ - balance: oh no, taser buff. alt fire delay dropped to 0.4 seconds.
+ - rscadd: you can now shoot yourself by disarm-intenting yourself with a gun.
+ timothyteakettle:
+ - tweak: species code is now slightly less messy
+ - bugfix: slight tweak to how material crafting works
+ - bugfix: changed up pet carriers / bluespace jars a bit so you can't fit certain
+ things inside them and also the text shown for resist times is accurate
+ zeroisthebiggay:
+ - rscadd: Black Box theft objective
+2020-07-29:
+ DeltaFire15:
+ - bugfix: The 'Naked' outfit is no longer broken.
+ Ghommie:
+ - bugfix: fixed cremator trays, paleness examination strings, chat message for stamping
+ paper, looping sounds, load away missions/VR admin verb, access requirements
+ for using the sechuds.
+ - tweak: Alt-Clicking a cigarette packet should pull the lighter out first if present,
+ then cigarettes.
+ Hatterhat:
+ - bugfix: Directional windows can now be rotated counterclockwise properly again.
+ NecromancerAnne, Sirich96:
+ - rscadd: Stunbaton sprites by Sirich96.
+ - rscadd: New sprites for the stunsword.
+ necromanceranne:
+ - rscadd: Adds some in-hands for the rapier sheath.
+ timothyteakettle:
+ - bugfix: tail wagging should work in all cases now
+ - bugfix: bluespace jars work as intended now
+ - bugfix: aliens can remove embeds now
+ - bugfix: bloodsuckers are not affected by bloodloss
+ zeroisthebiggay:
+ - rscadd: Flannel jackets and bartender winter coat
diff --git a/html/changelogs/AutoChangeLog-pr-12734.yml b/html/changelogs/AutoChangeLog-pr-12734.yml
new file mode 100644
index 0000000000..952ee721e0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12734.yml
@@ -0,0 +1,6 @@
+author: "Ryll-Ryll ported by silicons"
+delete-after: True
+changes:
+ - rscadd: "Shoelaces are now a thing. You can untie them by laying down next to someone."
+ - tweak: "shoes now have lace delays and some can't be laced at all"
+ - refactor: "do after now tracks who's interacting with who, meaning some actions now break when the target moves away."
diff --git a/html/changelogs/AutoChangeLog-pr-12834.yml b/html/changelogs/AutoChangeLog-pr-12834.yml
new file mode 100644
index 0000000000..c58a6b14ea
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12834.yml
@@ -0,0 +1,10 @@
+author: "silicons"
+delete-after: True
+changes:
+ - refactor: "clickdelay has been refactored into an experimental hybrid system. Check code/modules/mob/clickdelay.dm for more information."
+ - balance: "Resisting no longer checks clickdelay, but is standardized to a 2 second per resist system for most forms of resisting. It still sets clickdelay, though."
+ - rscadd: "Meters have been added for estimating time until next attack/resist. Won't be that useful due to our clickdelay currently being very short, though. They're visible from your hand and resist HUD elements.
+experimental: Most attacks and forms of attacking (minus unarmed because it's too much of a pain to refactor how hugs/gloves of the north star works) now check for time-since-last-attack rather than making it so you can't attack for said time. This means you can very quickly switch to a gun from a melee weapon, whereas in the old system a melee weapon would put you on lockout for 0.8 seconds, in the new system all the gun cares about is that you did not attack for at least 0.4 seconds."
+ - code_imp: "All clickdelay setting/reading are now procs, so it should be trivial to implement another system where drawing/switching to a weapon requires you to have it out for x seconds before using it. I am not personally doing it at this point in time though because it will likely just annoy everyone with no real gain unless we do something like putting a 0.8 second switch-to cooldown for guns (which I did not, yet)"
+ - refactor: "attack_hand has been refactored to on_attack_hand
+remove: sexchems no longer impact click delay"
diff --git a/html/changelogs/AutoChangeLog-pr-12872.yml b/html/changelogs/AutoChangeLog-pr-12872.yml
deleted file mode 100644
index 4519ff257f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12872.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Iatots"
-delete-after: True
-changes:
- - tweak: "Licking wounds now may cause you to spit out a hairball once in a while!"
- - rscadd: "You can now craft a catgirl plushie with 3 of a new ingredient occasionally found in medbay!"
diff --git a/html/changelogs/AutoChangeLog-pr-12877.yml b/html/changelogs/AutoChangeLog-pr-12877.yml
deleted file mode 100644
index 13ec2726c6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12877.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "dapnee"
-delete-after: True
-changes:
- - tweak: "removed legacy public mining shuttle area and remade lounge"
diff --git a/html/changelogs/AutoChangeLog-pr-12883.yml b/html/changelogs/AutoChangeLog-pr-12883.yml
new file mode 100644
index 0000000000..53aa8c6b4e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12883.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - rscadd: "beam rifles now go into emitters properly"
diff --git a/html/changelogs/AutoChangeLog-pr-12909.yml b/html/changelogs/AutoChangeLog-pr-12909.yml
deleted file mode 100644
index 85bb092ac8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12909.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - bugfix: "Organs now decay again."
diff --git a/html/changelogs/AutoChangeLog-pr-12922.yml b/html/changelogs/AutoChangeLog-pr-12922.yml
new file mode 100644
index 0000000000..ff2fac660f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12922.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - tweak: "beepskys hats now follow the laws of gravity and move up/down when he bobs up and down"
diff --git a/html/changelogs/AutoChangeLog-pr-12924.yml b/html/changelogs/AutoChangeLog-pr-12924.yml
new file mode 100644
index 0000000000..e106d42bef
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12924.yml
@@ -0,0 +1,4 @@
+author: "SiliconMain"
+delete-after: True
+changes:
+ - rscadd: "Ported the long range atmos analyzer from sk*rat, credit to NotRanged"
diff --git a/html/changelogs/AutoChangeLog-pr-12928.yml b/html/changelogs/AutoChangeLog-pr-12928.yml
new file mode 100644
index 0000000000..442b685b25
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12928.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - balance: "any mob can now parry if they have the right item"
diff --git a/html/changelogs/AutoChangeLog-pr-12929.yml b/html/changelogs/AutoChangeLog-pr-12929.yml
new file mode 100644
index 0000000000..bc238805a5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12929.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - balance: "anything can now block with the right items"
diff --git a/html/changelogs/AutoChangeLog-pr-12930.yml b/html/changelogs/AutoChangeLog-pr-12930.yml
new file mode 100644
index 0000000000..d3df829756
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12930.yml
@@ -0,0 +1,5 @@
+author: "silicons"
+delete-after: True
+changes:
+ - rscadd: "turrets now automatically stagger their shots. Happy parrying/blocking."
+ - bugfix: "turrets now speed_process, they were shooting slower than they should be"
diff --git a/html/changelogs/AutoChangeLog-pr-12932.yml b/html/changelogs/AutoChangeLog-pr-12932.yml
new file mode 100644
index 0000000000..62af146dcc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12932.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - rscadd: "energy sword perfect parries now reflect projectiles back at their shooters."
diff --git a/html/changelogs/AutoChangeLog-pr-12944.yml b/html/changelogs/AutoChangeLog-pr-12944.yml
new file mode 100644
index 0000000000..b055145583
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12944.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - bugfix: "some crafted crates won't contain items now, and thus have stopped breaking the laws of physics"
diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi
index 00cffd9006..ae8e6221c6 100644
Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ
diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi
index fd3016ac89..52ef75020c 100644
Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index a2a8fcede6..a6e75123bb 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi
index c361563da3..ecc6e2dd2c 100644
Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ
diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi
index 9d97ae36b5..7a690bb29f 100644
Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ
diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi
index beac56725a..81b12c60f9 100644
Binary files a/icons/mob/inhands/equipment/belt_lefthand.dmi and b/icons/mob/inhands/equipment/belt_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/belt_righthand.dmi b/icons/mob/inhands/equipment/belt_righthand.dmi
index da31cc9710..42ed3a30c6 100644
Binary files a/icons/mob/inhands/equipment/belt_righthand.dmi and b/icons/mob/inhands/equipment/belt_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi
index 1e48d57ac7..0ca36ad43d 100644
Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi
index 5a5ee6f3db..59d7bbce69 100644
Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index 2bb8af7c61..082bfb3c3e 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index 60fe2f9839..30c23601a5 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/secbot_accessories.dmi b/icons/mob/secbot_accessories.dmi
index b6c7bad6fa..944aac44f3 100644
Binary files a/icons/mob/secbot_accessories.dmi and b/icons/mob/secbot_accessories.dmi differ
diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi
index 7e09d425fb..1c22a0ad1b 100644
Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index b982d450e4..90f1fba315 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index fed81adfcc..258eb0dc35 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index c27e03bb2a..5a9e1e54b6 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index cf7a87d28b..57105cc089 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi
index 675005da91..c3ca67eeae 100644
Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index 67c1a59c51..16efcf262e 100644
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index 5356214438..4fa2a51fac 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -53,7 +53,6 @@
if(last_checked_size != B.cached_size)
H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy, multiplicative_slowdown = moveCalc)
- sizeMoveMod(moveCalc)
if (B.size == "huge")
if(prob(1))
@@ -70,16 +69,8 @@
log_reagent("FERMICHEM: [owner]'s breasts has reduced to an acceptable size. ID: [owner.key]")
to_chat(owner, "Your expansive chest has become a more managable size, liberating your movements.")
owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy)
- sizeMoveMod(1)
return ..()
-/datum/status_effect/chem/breast_enlarger/proc/sizeMoveMod(var/value)
- if(cachedmoveCalc == value)
- return
- owner.next_move_modifier /= cachedmoveCalc
- owner.next_move_modifier *= value
- cachedmoveCalc = value
-
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/datum/status_effect/chem/penis_enlarger
diff --git a/modular_citadel/code/game/objects/cit_screenshake.dm b/modular_citadel/code/game/objects/cit_screenshake.dm
index 188b8a48f9..222de37f82 100644
--- a/modular_citadel/code/game/objects/cit_screenshake.dm
+++ b/modular_citadel/code/game/objects/cit_screenshake.dm
@@ -45,18 +45,6 @@
. = ..()
shake_camera(user, (pressureSetting * 0.75 + 1), (pressureSetting * 0.75))
-/obj/item/attack(mob/living/M, mob/living/user)
- . = ..()
- if(force >= 15)
- shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01))
- if(M.client)
- switch (M.client.prefs.damagescreenshake)
- if (1)
- shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
- if (2)
- if(!CHECK_MOBILITY(M, MOBILITY_MOVE))
- shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
-
/obj/item/attack_obj(obj/O, mob/living/user)
. = ..()
if(force >= 20)
diff --git a/modular_citadel/code/modules/client/loadout/neck.dm b/modular_citadel/code/modules/client/loadout/neck.dm
index 320a83b87d..0f69296406 100644
--- a/modular_citadel/code/modules/client/loadout/neck.dm
+++ b/modular_citadel/code/modules/client/loadout/neck.dm
@@ -92,3 +92,8 @@
name = "Headphones"
category = SLOT_NECK
path = /obj/item/clothing/ears/headphones
+
+/datum/gear/polycloak
+ name = "Polychromatic Cloak"
+ category = SLOT_NECK
+ path = /obj/item/clothing/neck/cloak/polychromic
diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm
index fecf2a4dce..57c5772f48 100644
--- a/modular_citadel/code/modules/client/loadout/suit.dm
+++ b/modular_citadel/code/modules/client/loadout/suit.dm
@@ -24,6 +24,26 @@
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/jacket
+/datum/gear/jacketflannelblack // all of these are reskins of bomber jackets but with the vibe to make you look like a true lumberjack
+ name = "Black flannel jacket"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/jacket/flannel
+
+/datum/gear/jacketflannelred
+ name = "Red flannel jacket"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/jacket/flannel/red
+
+/datum/gear/jacketflannelaqua
+ name = "Aqua flannel jacket"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/jacket/flannel/aqua
+
+/datum/gear/jacketflannelbrown
+ name = "Brown flannel jacket"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/jacket/flannel/brown
+
/datum/gear/jacketleather
name = "Leather jacket"
category = SLOT_WEAR_SUIT
@@ -127,6 +147,12 @@
path = /obj/item/clothing/suit/hooded/wintercoat/hydro
restricted_roles = list("Head of Personnel", "Botanist") // Reserve it to Botanists and their boss, the Head of Personnel
+/datum/gear/coat/bar
+ name = "Bar winter coat"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/hooded/wintercoat/bar
+ restricted_roles = list("Bartender") // Reserve it to Bartenders and not the Head of Personnel because he doesnt deserve to look as fancy as them
+
/datum/gear/coat/cargo
name = "Cargo winter coat"
category = SLOT_WEAR_SUIT
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
index 8ef302e904..f3059a480a 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
@@ -112,7 +112,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
M.visible_message("[M] suddenly shudders, and splits into two identical twins!")
SM.copy_languages(M, LANGUAGE_MIND)
playerClone = TRUE
- M.next_move_modifier = 1
+ M.action_cooldown_mod = 1
M.adjust_nutrition(-500)
//Damage the clone
@@ -154,7 +154,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
M.adjust_nutrition(M.nutrition/5)
if(50)
to_chat(M, "The synthetic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.")
- M.next_move_modifier += 4//If this makes you fast then please fix it, it should make you slow!!
+ M.action_cooldown_mod += 4//If this makes you fast then please fix it, it should make you slow!!
//candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies
if(51 to 79)
M.adjust_nutrition(M.nutrition/2)
@@ -164,7 +164,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
M.set_nutrition(20000) //https://www.youtube.com/watch?v=Bj_YLenOlZI
if(86)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done.
M.set_nutrition(15)//YOU BEST BE EATTING AFTER THIS YOU CUTIE
- M.next_move_modifier -= 4
+ M.action_cooldown_mod -= 4
to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.")
//clone
@@ -195,14 +195,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
if (playerClone == TRUE)//If the player made a clone with it, then thats all they get.
playerClone = FALSE
return
- if (M.next_move_modifier == 4 && !M.has_status_effect(/datum/status_effect/chem/SGDF))//checks if they're ingested over 20u of the stuff, but fell short of the required 30u to make a clone.
+ if (M.action_cooldown_mod == 4 && !M.has_status_effect(/datum/status_effect/chem/SGDF))//checks if they're ingested over 20u of the stuff, but fell short of the required 30u to make a clone.
to_chat(M, "You feel the cells begin to merge with your body, unable to reach nucleation, they instead merge with your body, healing any wounds.")
M.adjustCloneLoss(-10, 0) //I don't want to make Rezadone obsolete.
M.adjustBruteLoss(-25, 0)// Note that this takes a long time to apply and makes you fat and useless when it's in you, I don't think this small burst of healing will be useful considering how long it takes to get there.
M.adjustFireLoss(-25, 0)
M.blood_volume += 250
M.heal_bodypart_damage(1,1)
- M.next_move_modifier = 1
+ M.action_cooldown_mod = 1
if (M.nutrition < 1500)
M.adjust_nutrition(250)
else if (unitCheck == TRUE && !M.has_status_effect(/datum/status_effect/chem/SGDF))// If they're ingested a little bit (10u minimum), then give them a little healing.
@@ -211,7 +211,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
M.adjustBruteLoss(-10, 0)
M.adjustFireLoss(-10, 0)
M.blood_volume += 100
- M.next_move_modifier = 1
+ M.action_cooldown_mod = 1
if (M.nutrition < 1500)
M.adjust_nutrition(500)
@@ -325,7 +325,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
M.adjust_nutrition(M.nutrition/5)
if(50)
to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.")
- M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!!
+ M.action_cooldown_mod = 4//If this makes you fast then please fix it, it should make you slow!!
if(51 to 73)
M.adjust_nutrition(M.nutrition/2)
if(74)
@@ -339,7 +339,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
if (!M.reagents.has_reagent(/datum/reagent/medicine/pen_acid))//Counterplay is pent.)
message_admins("(non-infectious) SDZF: Zombie spawned at [M] [COORD(M)]!")
M.set_nutrition(startHunger - 500) //YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE
- M.next_move_modifier = 1
+ M.action_cooldown_mod = 1
to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.")
M.visible_message("[M] suddenly shudders, and splits into a funky smelling copy of themselves!")
M.emote("scream")
diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm
index d3c566ce70..ab4d49c56f 100644
--- a/modular_citadel/code/modules/reagents/objects/clothes.dm
+++ b/modular_citadel/code/modules/reagents/objects/clothes.dm
@@ -9,7 +9,7 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
//item_flags = NODROP //Tips their hat!
-/obj/item/clothing/head/hattip/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/clothing/head/hattip/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(iscarbon(user))
var/mob/living/carbon/C = user
if(is_ninja(C))
diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm
index 27b8961835..f4316b3c58 100644
--- a/modular_citadel/code/modules/reagents/objects/items.dm
+++ b/modular_citadel/code/modules/reagents/objects/items.dm
@@ -9,7 +9,7 @@
w_class = WEIGHT_CLASS_TINY
//A little janky with pockets
-/obj/item/fermichem/pHbooklet/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
+/obj/item/fermichem/pHbooklet/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(user.get_held_index_of_item(src))//Does this check pockets too..?
if(numberOfPages == 50)
icon_state = "pHbookletOpen"
diff --git a/tgstation.dme b/tgstation.dme
index 7188cce401..8a7149a1ba 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -124,6 +124,7 @@
#include "code\__DEFINES\_flags\do_after.dm"
#include "code\__DEFINES\_flags\item_flags.dm"
#include "code\__DEFINES\_flags\obj_flags.dm"
+#include "code\__DEFINES\_flags\return_values.dm"
#include "code\__DEFINES\_flags\shields.dm"
#include "code\__DEFINES\admin\keybindings.dm"
#include "code\__DEFINES\chemistry\reactions.dm"
@@ -135,7 +136,6 @@
#include "code\__DEFINES\dcs\signals.dm"
#include "code\__DEFINES\mapping\maploader.dm"
#include "code\__DEFINES\material\worth.dm"
-#include "code\__DEFINES\misc\return_values.dm"
#include "code\__DEFINES\mobs\slowdowns.dm"
#include "code\__DEFINES\research\stock_parts.dm"
#include "code\__DEFINES\skills\defines.dm"
@@ -220,6 +220,9 @@
#include "code\_onclick\observer.dm"
#include "code\_onclick\other_mobs.dm"
#include "code\_onclick\overmind.dm"
+#include "code\_onclick\right_click.dm"
+#include "code\_onclick\right_item_attack.dm"
+#include "code\_onclick\right_other_mobs.dm"
#include "code\_onclick\telekinesis.dm"
#include "code\_onclick\hud\_defines.dm"
#include "code\_onclick\hud\action_button.dm"
@@ -252,7 +255,11 @@
#include "code\_onclick\hud\robot.dm"
#include "code\_onclick\hud\screen_objects.dm"
#include "code\_onclick\hud\swarmer.dm"
+#include "code\_onclick\hud\screen_objects\clickdelay.dm"
+#include "code\_onclick\hud\screen_objects\sprint.dm"
+#include "code\_onclick\hud\screen_objects\stamina.dm"
#include "code\_onclick\hud\screen_objects\storage.dm"
+#include "code\_onclick\hud\screen_objects\vore.dm"
#include "code\controllers\admin.dm"
#include "code\controllers\configuration_citadel.dm"
#include "code\controllers\controller.dm"
@@ -339,6 +346,7 @@
#include "code\controllers\subsystem\processing\circuit.dm"
#include "code\controllers\subsystem\processing\fastprocess.dm"
#include "code\controllers\subsystem\processing\fields.dm"
+#include "code\controllers\subsystem\processing\huds.dm"
#include "code\controllers\subsystem\processing\instruments.dm"
#include "code\controllers\subsystem\processing\nanites.dm"
#include "code\controllers\subsystem\processing\networks.dm"
@@ -2320,6 +2328,7 @@
#include "code\modules\mining\lavaland\ash_flora.dm"
#include "code\modules\mining\lavaland\necropolis_chests.dm"
#include "code\modules\mining\lavaland\ruins\gym.dm"
+#include "code\modules\mob\clickdelay.dm"
#include "code\modules\mob\death.dm"
#include "code\modules\mob\emote.dm"
#include "code\modules\mob\inventory.dm"
@@ -2372,6 +2381,7 @@
#include "code\modules\mob\dead\observer\say.dm"
#include "code\modules\mob\living\blood.dm"
#include "code\modules\mob\living\bloodcrawl.dm"
+#include "code\modules\mob\living\clickdelay.dm"
#include "code\modules\mob\living\damage_procs.dm"
#include "code\modules\mob\living\death.dm"
#include "code\modules\mob\living\emote.dm"
@@ -2494,6 +2504,7 @@
#include "code\modules\mob\living\carbon\human\species_types\synthliz.dm"
#include "code\modules\mob\living\carbon\human\species_types\synths.dm"
#include "code\modules\mob\living\carbon\human\species_types\vampire.dm"
+#include "code\modules\mob\living\carbon\human\species_types\xeno.dm"
#include "code\modules\mob\living\carbon\human\species_types\zombies.dm"
#include "code\modules\mob\living\carbon\monkey\combat.dm"
#include "code\modules\mob\living\carbon\monkey\death.dm"
@@ -3438,12 +3449,6 @@
#include "interface\menu.dm"
#include "interface\stylesheet.dm"
#include "interface\skin.dmf"
-#include "modular_citadel\code\_onclick\click.dm"
-#include "modular_citadel\code\_onclick\item_attack.dm"
-#include "modular_citadel\code\_onclick\other_mobs.dm"
-#include "modular_citadel\code\_onclick\hud\screen_objects.dm"
-#include "modular_citadel\code\_onclick\hud\sprint.dm"
-#include "modular_citadel\code\_onclick\hud\stamina.dm"
#include "modular_citadel\code\datums\components\souldeath.dm"
#include "modular_citadel\code\datums\status_effects\chems.dm"
#include "modular_citadel\code\game\objects\cit_screenshake.dm"