diff --git a/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
index 4db15d98c706..09f79c998481 100644
--- a/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
+++ b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
@@ -864,7 +864,7 @@
/turf/open/floor/carpet,
/area/ruin/space/has_grav/derelictsulaco)
"BQ" = (
-/mob/living/basic/pet/cat{
+/mob/living/simple_animal/pet/cat{
name = "Jonesy";
desc = "Old and grumpy cat- wait, how the hell is he still alive?!"
},
diff --git a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm
index 0c2f329a071f..616aa0f45d64 100644
--- a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm
+++ b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm
@@ -245,7 +245,7 @@
/obj/structure/bed/dogbed{
name = "kitty bed"
},
-/mob/living/basic/pet/cat/space,
+/mob/living/simple_animal/pet/cat/space,
/turf/open/floor/carpet,
/area/ruin/space/has_grav/powered/cat_man)
"aS" = (
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
index c60ea4eac94f..b97079f7dcff 100644
--- a/_maps/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -5,58 +5,88 @@
"ac" = (
/turf/closed/mineral/random/labormineral,
/area/awaymission/moonoutpost19/main)
+"ad" = (
+/obj/machinery/light/small/broken/directional/west,
+/obj/machinery/camera/directional/west{
+ c_tag = "Xenobiology";
+ network = list("mo19","mo19r")
+ },
+/turf/open/floor/iron/white/side{
+ dir = 6;
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
"ae" = (
/turf/closed/indestructible/rock,
/area/awaymission/moonoutpost19/main)
-"an" = (
-/obj/structure/sign/warning/secure_area/directional/north,
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
+"aj" = (
+/obj/structure/table/reinforced,
+/obj/structure/alien/weeds,
+/obj/machinery/computer/security/telescreen{
+ desc = "Used for watching the contents of the xenobiology containment pen.";
+ dir = 8;
+ name = "xenobiology monitor";
+ network = list("mo19x")
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"at" = (
-/turf/closed/wall/r_wall,
-/area/awaymission/moonoutpost19/syndicate)
-"aD" = (
+/area/awaymission/moonoutpost19/research)
+"ap" = (
+/obj/machinery/light/small/directional/south,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
+/area/awaymission/moonoutpost19/arrivals)
+"at" = (
+/turf/closed/wall/r_wall,
/area/awaymission/moonoutpost19/syndicate)
-"aL" = (
-/obj/structure/reagent_dispensers/wall/peppertank/directional/west,
-/obj/effect/turf_decal/tile/red/half/contrasted{
- dir = 8
+"aw" = (
+/obj/machinery/vending/medical{
+ req_access = list("away_maintenance")
},
-/turf/open/floor/iron{
+/turf/open/floor/iron/white/side{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"aT" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+"aG" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ dir = 8;
+ icon_state = "ltrails_1"
},
-/turf/open/floor/iron{
+/turf/open/misc/asteroid{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/syndicate)
+/area/awaymission/moonoutpost19/main)
+"aM" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/item/trash/candy,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
"aU" = (
/turf/closed/wall,
/area/awaymission/moonoutpost19/syndicate)
-"aX" = (
-/obj/structure/alien/weeds/node,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+"aY" = (
+/obj/structure/table,
+/obj/item/stack/sheet/mineral/plasma,
+/obj/machinery/light/small/broken/directional/north,
+/obj/machinery/airalarm/directional/north{
+ req_access = null
},
-/area/awaymission/moonoutpost19/hive)
+/obj/effect/mapping_helpers/airalarm/unlocked,
+/obj/structure/alien/weeds,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
"bb" = (
/obj/effect/turf_decal/tile/purple{
dir = 8
@@ -73,63 +103,48 @@
/turf/closed/mineral/random/high_chance,
/area/awaymission/moonoutpost19/hive)
"bn" = (
-/obj/structure/cable,
-/turf/open/floor/plating{
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"bF" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{
- desc = "A one meter section of pipe. This one has been applied with an acid-proof coating.";
- dir = 4;
- name = "Acid-Proof Pipe"
- },
-/obj/item/stack/rods,
-/obj/item/stack/cable_coil{
- amount = 5
- },
-/obj/item/shard{
- icon_state = "small"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/iron{
+/area/awaymission/moonoutpost19/syndicate)
+"by" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"bK" = (
-/obj/machinery/light/small/directional/west,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/area/awaymission/moonoutpost19/arrivals)
+"bz" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ dir = 8;
+ icon_state = "ltrails_1"
},
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"bR" = (
-/obj/structure/noticeboard/directional/south,
-/obj/machinery/light/small/broken/directional/south,
-/obj/item/paper/fluff/awaymissions/moonoutpost19/research/evacuation,
-/obj/machinery/camera/directional/south{
- c_tag = "Research Division";
- network = list("mo19","mo19r")
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 8
+"bE" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"bW" = (
-/obj/machinery/newscaster/directional/south,
-/turf/open/floor/iron/cafeteria{
- dir = 5
+"bH" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
},
-/area/awaymission/moonoutpost19/research)
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
"bX" = (
/obj/machinery/conveyor{
id = "awaysyndie"
@@ -143,59 +158,40 @@
temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"ck" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/turf_decal/stripes/asteroid/corner,
-/obj/effect/turf_decal/stripes/asteroid/corner{
- dir = 8
+"cd" = (
+/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/remains/xeno{
+ desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated."
},
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/main)
-"cn" = (
-/obj/structure/sign/warning/biohazard/directional/north,
-/obj/structure/alien/weeds/node,
-/obj/effect/turf_decal/stripes/corner{
+/area/awaymission/moonoutpost19/arrivals)
+"ce" = (
+/obj/machinery/space_heater,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"cr" = (
-/obj/structure/grille,
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+"cn" = (
+/obj/structure/chair/stool/directional/west,
+/turf/open/floor/carpet{
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"cM" = (
-/obj/structure/chair{
- dir = 1
+"cH" = (
+/obj/machinery/door/airlock{
+ name = "Unit 1"
},
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
+/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"cP" = (
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- dir = 8;
- icon_state = "ltrails_1"
- },
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/main)
"cS" = (
/obj/machinery/airalarm/directional/east{
pixel_x = 23;
@@ -211,151 +207,66 @@
temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"cV" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/loading_area,
-/obj/structure/alien/weeds,
-/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/syndicate)
-"cY" = (
-/obj/structure/table/wood,
-/obj/item/pen,
-/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal_2,
-/obj/structure/sign/poster/contraband/c20r/directional/south,
-/turf/open/floor/wood{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/syndicate)
-"cZ" = (
-/obj/structure/closet/secure_closet{
- icon_state = "sec";
- name = "security officer's locker";
- req_access = list("away_maintenance")
- },
-/obj/item/clothing/suit/armor/vest,
-/obj/item/reagent_containers/spray/pepper,
-/obj/item/grenade/flashbang,
-/obj/item/storage/belt/security,
-/obj/item/reagent_containers/cup/glass/bottle/beer{
- pixel_x = -3;
- pixel_y = -2
- },
-/obj/machinery/airalarm/directional/north{
- req_access = null
+"cX" = (
+/obj/structure/table,
+/obj/machinery/recharger{
+ pixel_y = 4
},
-/obj/effect/mapping_helpers/airalarm/unlocked,
/obj/effect/turf_decal/tile/red/half/contrasted{
- dir = 1
+ dir = 4
},
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"da" = (
-/obj/machinery/airalarm/directional/east{
- pixel_x = 23;
- req_access = list("syndicate")
- },
-/turf/open/floor/wood{
- heat_capacity = 1e+006
+"dd" = (
+/obj/structure/closet/l3closet/scientist,
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/structure/alien/weeds,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/area/awaymission/moonoutpost19/syndicate)
-"db" = (
-/obj/machinery/shower/directional/north,
-/turf/open/floor/iron/freezer{
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
+/area/awaymission/moonoutpost19/research)
"df" = (
/obj/machinery/mineral/stacking_unit_console,
/turf/closed/wall,
/area/awaymission/moonoutpost19/syndicate)
-"dh" = (
-/obj/structure/alien/weeds,
-/obj/structure/alien/egg/burst,
-/obj/effect/decal/cleanable/blood,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/hive)
-"dn" = (
-/obj/structure/grille,
-/obj/machinery/door/poddoor/preopen{
- desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating.";
- id = "Awaylab";
- name = "Acid-Proof Containment Chamber Blast Door"
- },
-/obj/item/stack/cable_coil/cut,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"do" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/turf_decal/stripes/asteroid/line{
- dir = 8
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+"dk" = (
+/obj/machinery/light/small/directional/west,
+/obj/structure/table,
+/obj/item/storage/box,
+/obj/machinery/airalarm/directional/west{
+ req_access = null
},
-/area/awaymission/moonoutpost19/main)
-"ds" = (
-/obj/structure/closet/crate/bin,
-/obj/item/trash/syndi_cakes,
-/obj/item/trash/sosjerky,
+/obj/effect/mapping_helpers/airalarm/unlocked,
/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"dA" = (
-/turf/closed/mineral/random,
-/area/awaymission/moonoutpost19/main)
-"dE" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/door/firedoor/closed,
+/area/awaymission/moonoutpost19/arrivals)
+"dr" = (
+/obj/machinery/firealarm/directional/south,
/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"dI" = (
-/obj/machinery/door/airlock{
- name = "Kitchen Cold Room"
- },
-/obj/effect/mapping_helpers/airlock/access/all/away/maintenance,
-/turf/open/floor/iron/showroomfloor{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"dO" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/turf_decal/stripes/asteroid/line{
- dir = 9
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
+"dA" = (
+/turf/closed/mineral/random,
/area/awaymission/moonoutpost19/main)
-"dQ" = (
-/obj/effect/turf_decal/tile/red{
- dir = 8
+"dT" = (
+/obj/structure/table,
+/obj/item/book/manual/wiki/barman_recipes{
+ pixel_y = 5
},
-/turf/open/floor/iron/dark{
- heat_capacity = 1e+006
+/obj/item/reagent_containers/cup/glass/shaker,
+/turf/open/floor/iron/cafeteria{
+ dir = 5
},
-/area/awaymission/moonoutpost19/syndicate)
+/area/awaymission/moonoutpost19/arrivals)
"dZ" = (
/turf/closed/wall/r_wall/rust,
/area/awaymission/moonoutpost19/research)
@@ -403,26 +314,14 @@
/obj/structure/cable,
/turf/open/floor/iron/white,
/area/awaymission/moonoutpost19/research)
-"ej" = (
-/obj/item/stack/ore/iron{
- pixel_x = -7;
- pixel_y = -4
- },
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/main)
"ek" = (
-/obj/structure/closet/crate/bin,
-/obj/machinery/light/small/directional/west,
-/obj/item/trash/cheesie,
-/obj/item/trash/can,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/machinery/door/airlock/public/glass{
+ name = "Break Room"
+ },
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
+/area/awaymission/moonoutpost19/syndicate)
"el" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
@@ -475,33 +374,23 @@
/turf/open/floor/iron/dark,
/area/awaymission/moonoutpost19/research)
"eu" = (
-/obj/machinery/mineral/processing_unit{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+/obj/machinery/door/firedoor,
+/obj/effect/mapping_helpers/airlock/locked,
+/obj/machinery/door/airlock/command{
+ density = 0;
+ icon_state = "open";
+ name = "Research Director's Office";
+ opacity = 0
},
-/area/awaymission/moonoutpost19/syndicate)
-"ew" = (
-/obj/structure/chair{
- dir = 1
+/obj/effect/mapping_helpers/atom_injector/obj_flag{
+ inject_flags = 1;
+ target_type = /obj/machinery/door/airlock
},
-/turf/open/floor/iron{
- heat_capacity = 1e+006
+/obj/effect/mapping_helpers/airlock/access/all/away/maintenance,
+/turf/open/floor/iron/cafeteria{
+ dir = 5
},
/area/awaymission/moonoutpost19/research)
-"ex" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
"ez" = (
/obj/structure/table,
/obj/item/clothing/glasses/hud/health,
@@ -512,15 +401,6 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"eA" = (
-/obj/structure/table,
-/obj/machinery/reagentgrinder,
-/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
"eB" = (
/obj/structure/alien/weeds/node,
/turf/open/floor/engine,
@@ -541,27 +421,53 @@
"eJ" = (
/turf/closed/wall/rust,
/area/awaymission/moonoutpost19/research)
-"eL" = (
-/obj/structure/sign/warning/electric_shock,
-/turf/closed/wall/r_wall,
-/area/awaymission/moonoutpost19/research)
-"eP" = (
-/obj/machinery/door/airlock/external/ruin,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+"eK" = (
+/obj/machinery/door/poddoor{
+ id = "AwayRD";
+ layer = 2.9;
+ name = "Privacy Shutter"
+ },
+/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
+/area/awaymission/moonoutpost19/research)
+"eL" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/egg/burst,
+/obj/effect/decal/cleanable/blood/gibs,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/hive)
"eQ" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood,
/turf/open/floor/engine,
/area/awaymission/moonoutpost19/research)
-"fe" = (
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/door/airlock{
- id_tag = "awaydorm3";
- name = "Dorm 3"
+"eR" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/turf/open/floor/iron{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"eV" = (
+/obj/machinery/airalarm/directional/east{
+ pixel_x = 23;
+ req_access = list("syndicate")
+ },
+/turf/open/floor/wood{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"fa" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
/turf/open/floor/iron{
heat_capacity = 1e+006
@@ -592,19 +498,35 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"fn" = (
-/obj/machinery/power/shieldwallgen/unlocked,
-/obj/structure/cable,
-/turf/open/floor/plating{
+"fo" = (
+/obj/structure/noticeboard/directional/north,
+/obj/item/paper/fluff/awaymissions/moonoutpost19/food_specials,
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/iron{
+ dir = 8;
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
+/area/awaymission/moonoutpost19/arrivals)
"fp" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
/obj/item/clothing/mask/facehugger/impregnated,
/turf/open/floor/engine,
/area/awaymission/moonoutpost19/research)
+"fu" = (
+/obj/structure/closet/crate,
+/obj/item/storage/bag/ore,
+/obj/structure/alien/weeds,
+/obj/item/mining_scanner,
+/obj/item/shovel,
+/obj/item/pickaxe,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/syndicate)
"fy" = (
/obj/item/storage/secure/safe/directional/east,
/obj/effect/decal/cleanable/blood/splatter,
@@ -650,14 +572,6 @@
/obj/structure/cable,
/turf/open/floor/iron/white,
/area/awaymission/moonoutpost19/research)
-"fD" = (
-/obj/effect/turf_decal/sand/plating,
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/main)
"fE" = (
/obj/machinery/door/poddoor/preopen{
desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating.";
@@ -726,24 +640,13 @@
},
/turf/open/floor/engine,
/area/awaymission/moonoutpost19/research)
-"fM" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/syndicate)
"fO" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/red/half/contrasted{
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/red/anticorner/contrasted{
dir = 4
},
-/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+/turf/open/floor/iron/dark{
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
"fS" = (
@@ -752,6 +655,42 @@
dir = 5
},
/area/awaymission/moonoutpost19/research)
+"fT" = (
+/obj/structure/bed{
+ dir = 4
+ },
+/obj/item/bedsheet/syndie{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"fU" = (
+/obj/effect/mapping_helpers/airlock/locked,
+/obj/machinery/door/airlock{
+ id_tag = "awaydorm3";
+ name = "Dorm 3"
+ },
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"fV" = (
+/obj/machinery/light/small/directional/south,
+/obj/machinery/computer/security/telescreen/entertainment/directional/south,
+/obj/machinery/camera/directional/south{
+ c_tag = "Arrivals North";
+ network = list("mo19")
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/iron/white/corner{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
"fW" = (
/obj/structure/table,
/obj/item/radio/off,
@@ -760,6 +699,12 @@
dir = 5
},
/area/awaymission/moonoutpost19/research)
+"fY" = (
+/obj/machinery/newscaster/directional/east,
+/turf/open/floor/carpet{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
"fZ" = (
/obj/structure/closet/emcloset,
/obj/machinery/light/small/directional/south,
@@ -770,24 +715,6 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"ga" = (
-/obj/item/storage/box/lights/mixed,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"gb" = (
-/obj/structure/toilet{
- dir = 1
- },
-/turf/open/floor/iron/freezer{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
"gc" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood,
@@ -797,16 +724,19 @@
},
/turf/open/floor/engine,
/area/awaymission/moonoutpost19/research)
-"gh" = (
-/obj/machinery/vending/coffee,
-/turf/open/floor/iron/dark,
-/area/awaymission/moonoutpost19/arrivals)
-"gm" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/freezer{
+"gd" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ dir = 6;
+ icon_state = "ltrails_1"
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
+/area/awaymission/moonoutpost19/research)
"gq" = (
/obj/machinery/door/airlock/medical{
name = "Research Division"
@@ -838,6 +768,16 @@
/obj/structure/alien/weeds,
/turf/open/floor/engine,
/area/awaymission/moonoutpost19/research)
+"gw" = (
+/obj/item/storage/box/lights/mixed,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
"gA" = (
/obj/effect/decal/cleanable/oil,
/obj/structure/cable,
@@ -873,6 +813,16 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
+"gG" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/iron{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/arrivals)
"gI" = (
/obj/structure/table,
/obj/item/surgical_drapes,
@@ -891,12 +841,6 @@
/obj/structure/alien/weeds,
/turf/open/floor/iron/white,
/area/awaymission/moonoutpost19/research)
-"gL" = (
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/wood{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
"gM" = (
/obj/structure/disposalpipe/segment{
desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating.";
@@ -905,6 +849,21 @@
/obj/structure/alien/weeds,
/turf/open/floor/engine,
/area/awaymission/moonoutpost19/research)
+"gO" = (
+/obj/machinery/light/small/directional/south,
+/obj/structure/closet/toolcloset,
+/obj/item/clothing/gloves/color/yellow,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
+"gS" = (
+/obj/item/cigbutt,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
"gU" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/purple{
@@ -968,12 +927,6 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"hj" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/white{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
"hn" = (
/obj/effect/turf_decal/tile/blue{
dir = 8
@@ -990,47 +943,40 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"hs" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/cell_charger,
-/obj/item/stock_parts/cell/high,
-/obj/item/radio/off,
-/turf/open/floor/plating{
+"hp" = (
+/obj/structure/cable,
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"hy" = (
-/obj/machinery/door/airlock/maintenance,
-/obj/effect/mapping_helpers/airlock/access/all/away/maintenance,
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- dir = 8;
- icon_state = "ltrails_1"
+"hs" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/egg/burst,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/obj/structure/cable,
-/turf/open/floor/plating{
+/area/awaymission/moonoutpost19/hive)
+"ht" = (
+/obj/effect/turf_decal/tile/red/anticorner/contrasted{
+ dir = 1
+ },
+/turf/open/floor/iron/dark{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
+/area/awaymission/moonoutpost19/syndicate)
"hB" = (
/turf/open/floor/iron/cafeteria{
dir = 5
},
/area/awaymission/moonoutpost19/research)
-"hF" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor,
-/obj/item/reagent_containers/condiment/peppermill{
- pixel_x = 3
- },
-/obj/item/reagent_containers/condiment/saltshaker{
- pixel_x = -3
- },
-/obj/machinery/door/poddoor/shutters{
- id = "awaykitchen";
- name = "Serving Hatch"
+"hC" = (
+/obj/machinery/light/small/directional/east,
+/obj/structure/chair/wood,
+/obj/machinery/airalarm/directional/east{
+ req_access = null
},
+/obj/effect/mapping_helpers/airalarm/unlocked,
/turf/open/floor/carpet{
heat_capacity = 1e+006
},
@@ -1041,37 +987,10 @@
"hJ" = (
/turf/closed/wall,
/area/awaymission/moonoutpost19/arrivals)
-"hN" = (
-/obj/structure/sign/poster/contraband/syndicate_recruitment/directional/north,
-/obj/effect/turf_decal/loading_area{
- dir = 8
- },
-/obj/structure/alien/weeds,
-/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/syndicate)
-"hQ" = (
-/obj/machinery/light/small/directional/east,
-/obj/effect/decal/cleanable/generic,
-/obj/effect/turf_decal/tile/neutral,
-/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/arrivals)
-"hT" = (
-/obj/machinery/light/directional/east,
-/obj/machinery/processor,
-/obj/machinery/airalarm/directional/east{
- req_access = null
- },
-/obj/effect/mapping_helpers/airalarm/unlocked,
-/turf/open/floor/iron/cafeteria{
- dir = 5
+"hW" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/freezer{
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
"hX" = (
@@ -1136,6 +1055,14 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
+"ij" = (
+/obj/structure/sink/directional/south,
+/obj/machinery/light/small/directional/west,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/freezer{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
"im" = (
/obj/structure/bed{
dir = 4
@@ -1153,16 +1080,11 @@
/turf/open/floor/plating,
/area/awaymission/moonoutpost19/arrivals)
"iq" = (
-/obj/item/stack/ore/iron,
-/obj/item/stack/ore/iron{
- pixel_x = -7;
- pixel_y = -4
- },
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+/obj/item/cigbutt,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/main)
+/area/awaymission/moonoutpost19/research)
"ir" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -1182,11 +1104,23 @@
},
/area/awaymission/moonoutpost19/research)
"it" = (
-/obj/machinery/newscaster/directional/east,
-/turf/open/floor/carpet{
- heat_capacity = 1e+006
+/obj/structure/bed{
+ dir = 4
},
-/area/awaymission/moonoutpost19/arrivals)
+/obj/item/bedsheet/syndie{
+ dir = 4
+ },
+/obj/machinery/button/door/directional/north{
+ id = "awaydorm4";
+ name = "Door Bolt Control";
+ normaldoorcontrol = 1;
+ specialfunctions = 4
+ },
+/turf/open/floor/wood{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/syndicate)
"iv" = (
/obj/machinery/door/airlock/external/ruin,
/obj/effect/decal/cleanable/dirt,
@@ -1227,32 +1161,6 @@
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"iD" = (
-/obj/structure/chair/comfy/black{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"iF" = (
-/obj/structure/closet/crate,
-/obj/item/stack/sheet/iron{
- amount = 12
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/alien/weeds,
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/turf/open/floor/iron{
- dir = 1;
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/syndicate)
"iH" = (
/obj/machinery/computer/security/telescreen/entertainment/directional/south,
/obj/machinery/light/small/broken/directional/south,
@@ -1286,20 +1194,34 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"iR" = (
-/obj/machinery/light/directional/west,
-/turf/open/floor/iron/dark{
+"iN" = (
+/obj/machinery/door/airlock/external/ruin,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"iT" = (
-/obj/structure/closet/l3closet/scientist,
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/alien/weeds,
+/area/awaymission/moonoutpost19/arrivals)
+"iP" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = -2;
+ pixel_y = -1
+ },
+/obj/item/clothing/gloves/color/yellow,
+/obj/item/multitool,
/obj/effect/turf_decal/stripes/line{
- dir = 8
+ dir = 9
},
-/turf/open/floor/iron{
+/obj/structure/cable,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"iR" = (
+/obj/structure/chair/stool/directional/south,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
@@ -1310,14 +1232,19 @@
},
/area/awaymission/moonoutpost19/arrivals)
"iW" = (
-/obj/structure/table,
-/obj/machinery/cell_charger,
-/obj/item/stock_parts/cell/high,
-/obj/effect/turf_decal/tile/blue/half/contrasted,
-/turf/open/floor/iron{
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ dir = 5;
+ icon_state = "ltrails_1"
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
+/area/awaymission/moonoutpost19/research)
"iX" = (
/turf/open/floor/iron/cafeteria{
dir = 5
@@ -1330,18 +1257,18 @@
dir = 5
},
/area/awaymission/moonoutpost19/arrivals)
-"je" = (
-/obj/effect/mapping_helpers/burnt_floor,
+"jb" = (
+/obj/structure/chair/comfy/black{
+ dir = 8
+ },
/turf/open/floor/iron{
- dir = 8;
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"jh" = (
-/obj/machinery/light/small/directional/south,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
+"je" = (
+/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/iron{
+ dir = 8;
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
@@ -1370,11 +1297,6 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"jt" = (
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
"jv" = (
/obj/structure/extinguisher_cabinet/directional/north,
/obj/effect/mapping_helpers/burnt_floor,
@@ -1410,6 +1332,15 @@
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
+"jC" = (
+/obj/structure/sign/warning/vacuum/directional/west{
+ desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'";
+ name = "\improper HOSTILE ATMOSPHERE AHEAD"
+ },
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
"jE" = (
/obj/structure/chair{
dir = 8
@@ -1420,29 +1351,33 @@
},
/area/awaymission/moonoutpost19/arrivals)
"jF" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/alien/weeds,
-/obj/effect/turf_decal/tile/red/half/contrasted{
- dir = 4
- },
-/turf/open/floor/iron{
+/obj/machinery/light/small/directional/east,
+/turf/open/misc/asteroid{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/syndicate)
+/area/awaymission/moonoutpost19/arrivals)
+"jG" = (
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
"jH" = (
-/obj/machinery/light/small/broken/directional/east,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/red/half/contrasted{
- dir = 4
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating.";
+ dir = 4;
+ name = "Acid-Proof disposal pipe"
+ },
+/obj/structure/alien/weeds,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
+/area/awaymission/moonoutpost19/research)
"jM" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk,
@@ -1450,18 +1385,54 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
+"jP" = (
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/syndicate)
"jR" = (
/obj/machinery/vending/dinnerware,
/turf/open/floor/iron/cafeteria{
dir = 5
},
/area/awaymission/moonoutpost19/arrivals)
-"jS" = (
-/obj/effect/turf_decal/tile/red/anticorner/contrasted,
-/turf/open/floor/iron/dark{
+"jU" = (
+/obj/machinery/door/airlock/external/ruin,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
+/area/awaymission/moonoutpost19/arrivals)
+"jW" = (
+/obj/structure/closet/secure_closet{
+ icon_state = "sec";
+ name = "security officer's locker";
+ req_access = list("away_maintenance")
+ },
+/obj/item/clothing/suit/armor/vest,
+/obj/item/reagent_containers/spray/pepper,
+/obj/item/grenade/flashbang,
+/obj/item/storage/belt/security,
+/obj/item/reagent_containers/cup/glass/bottle/beer{
+ pixel_x = -3;
+ pixel_y = -2
+ },
+/obj/machinery/airalarm/directional/north{
+ req_access = null
+ },
+/obj/effect/mapping_helpers/airalarm/unlocked,
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 1
+ },
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
"jY" = (
/obj/machinery/light/small/directional/north,
/obj/machinery/airalarm/directional/north{
@@ -1476,22 +1447,6 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"jZ" = (
-/obj/effect/decal/cleanable/xenoblood,
-/obj/effect/decal/remains/xeno{
- desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated."
- },
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"kc" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
"kd" = (
/obj/structure/cable,
/obj/effect/mapping_helpers/broken_floor,
@@ -1512,6 +1467,19 @@
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
+"kj" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/effect/mapping_helpers/airlock/access/all/away/maintenance,
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ dir = 8;
+ icon_state = "ltrails_1"
+ },
+/obj/structure/cable,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
"kl" = (
/obj/machinery/door/airlock/maintenance,
/turf/open/floor/plating{
@@ -1519,27 +1487,30 @@
},
/area/awaymission/moonoutpost19/arrivals)
"km" = (
-/obj/structure/sink/directional/south,
-/obj/machinery/light/small/directional/west,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/freezer{
+/obj/machinery/door/airlock/maintenance,
+/obj/effect/mapping_helpers/airlock/access/all/away/maintenance,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"kn" = (
+/area/awaymission/moonoutpost19/arrivals)
+"ko" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/cafeteria{
+ dir = 5
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"kp" = (
+/obj/machinery/light/small/broken/directional/east,
/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 4
+ },
/turf/open/floor/iron{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"ko" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/cafeteria{
- dir = 5
- },
-/area/awaymission/moonoutpost19/arrivals)
"kq" = (
/obj/structure/table,
/obj/item/book/manual/chef_recipes{
@@ -1557,6 +1528,18 @@
dir = 5
},
/area/awaymission/moonoutpost19/arrivals)
+"ks" = (
+/obj/machinery/power/smes{
+ charge = 1.5e+006;
+ input_level = 10000;
+ inputting = 0;
+ output_level = 15000
+ },
+/obj/structure/cable,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
"kB" = (
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/iron{
@@ -1572,6 +1555,30 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/arrivals)
+"kD" = (
+/obj/machinery/shower/directional/south,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/freezer{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"kI" = (
+/obj/structure/chair/wood{
+ dir = 8
+ },
+/turf/open/floor/carpet{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"kJ" = (
+/obj/item/shard{
+ icon_state = "small"
+ },
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/main)
"kM" = (
/obj/structure/closet/crate/bin,
/obj/item/plate,
@@ -1580,12 +1587,6 @@
dir = 5
},
/area/awaymission/moonoutpost19/arrivals)
-"kQ" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
"kR" = (
/obj/item/stack/rods,
/obj/item/shard,
@@ -1594,23 +1595,47 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/main)
+"kS" = (
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/wood{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
"kT" = (
-/obj/structure/table,
-/obj/item/storage/medkit/fire,
-/obj/machinery/firealarm/directional/east,
-/turf/open/floor/iron/white/side{
- dir = 8;
+/obj/machinery/computer/monitor,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/structure/cable,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
+/area/awaymission/moonoutpost19/syndicate)
+"kU" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
"kV" = (
-/obj/machinery/light/small/directional/east,
-/obj/structure/chair/wood,
-/obj/machinery/airalarm/directional/east{
- req_access = null
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/turf_decal/stripes/asteroid/corner,
+/obj/effect/turf_decal/stripes/asteroid/corner{
+ dir = 8
},
-/obj/effect/mapping_helpers/airalarm/unlocked,
-/turf/open/floor/carpet{
+/turf/open/floor/plating{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/main)
+"kY" = (
+/obj/structure/chair/stool/directional/south,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
@@ -1630,37 +1655,40 @@
"ld" = (
/turf/closed/wall/mineral/titanium,
/area/awaymission/moonoutpost19/arrivals)
-"le" = (
-/turf/open/floor/iron/freezer{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
"ln" = (
/turf/open/floor/carpet{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"lx" = (
-/obj/machinery/power/terminal{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+"lq" = (
+/obj/structure/closet/crate/bin,
+/obj/item/trash/syndi_cakes,
+/obj/item/trash/sosjerky,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
+/area/awaymission/moonoutpost19/syndicate)
+"lt" = (
/obj/structure/cable,
+/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"lz" = (
-/obj/machinery/door/firedoor/closed,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
+/area/awaymission/moonoutpost19/research)
+"lw" = (
+/obj/machinery/light/small/directional/north,
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
+"lz" = (
+/obj/structure/cable,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
"lD" = (
/obj/machinery/power/shuttle_engine/heater{
dir = 4
@@ -1671,26 +1699,11 @@
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"lG" = (
-/obj/structure/closet/crate,
-/obj/item/storage/bag/ore,
-/obj/structure/alien/weeds,
-/obj/item/mining_scanner,
-/obj/item/shovel,
-/obj/item/pickaxe,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/syndicate)
"lN" = (
-/obj/machinery/door/firedoor,
+/obj/structure/table,
+/obj/machinery/reagentgrinder,
+/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/iron{
heat_capacity = 1e+006
},
@@ -1714,14 +1727,6 @@
/obj/item/clothing/suit/hooded/chaplain_hoodie,
/turf/open/floor/iron/dark,
/area/awaymission/moonoutpost19/arrivals)
-"lU" = (
-/obj/effect/decal/cleanable/xenoblood,
-/obj/effect/decal/cleanable/xenoblood/xgibs,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
"lW" = (
/obj/structure/table,
/obj/item/storage/lockbox,
@@ -1761,27 +1766,55 @@
/obj/structure/closet/emcloset,
/turf/open/floor/mineral/titanium/blue,
/area/awaymission/moonoutpost19/arrivals)
+"mg" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"mj" = (
+/obj/machinery/power/apc/worn_out,
+/obj/effect/mapping_helpers/apc/full_charge,
+/obj/effect/mapping_helpers/apc/unlocked,
+/obj/effect/mapping_helpers/apc/cell_10k,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/purple,
+/turf/open/floor/iron/white{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
"ml" = (
/obj/structure/table,
/obj/item/storage/backpack/satchel/leather/withwallet,
/turf/open/floor/iron/dark,
/area/awaymission/moonoutpost19/arrivals)
-"mm" = (
-/obj/structure/table,
-/obj/item/cigbutt,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
"mn" = (
-/obj/structure/closet/l3closet,
+/obj/effect/mapping_helpers/airlock/locked,
+/obj/machinery/door/airlock/external/ruin{
+ density = 0;
+ icon_state = "open";
+ opacity = 0
+ },
+/obj/effect/mapping_helpers/atom_injector/obj_flag{
+ inject_flags = 1;
+ target_type = /obj/machinery/door/airlock
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"mo" = (
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/white/side{
- dir = 1;
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
+/area/awaymission/moonoutpost19/arrivals)
"mp" = (
/obj/structure/table,
/obj/item/storage/box/donkpockets,
@@ -1824,6 +1857,15 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
+"mz" = (
+/obj/structure/cable,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/arrivals)
"mD" = (
/obj/machinery/light/small/directional/west,
/obj/structure/chair/comfy/beige,
@@ -1860,21 +1902,6 @@
},
/turf/open/floor/mineral/titanium/yellow,
/area/awaymission/moonoutpost19/arrivals)
-"mJ" = (
-/obj/structure/closet/secure_closet/freezer{
- locked = 0;
- name = "meat fridge";
- req_access = list("away_maintenance")
- },
-/obj/item/food/meat/slab/monkey,
-/obj/item/food/meat/slab/monkey,
-/obj/item/food/meat/slab/monkey,
-/obj/item/food/meat/slab/monkey,
-/turf/open/floor/iron/showroomfloor{
- heat_capacity = 1e+006;
- temperature = 273.15
- },
-/area/awaymission/moonoutpost19/arrivals)
"mK" = (
/obj/machinery/door/airlock/titanium{
name = "Shuttle Airlock"
@@ -1892,6 +1919,20 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/hive)
+"mO" = (
+/obj/structure/extinguisher_cabinet/directional/west,
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ icon_state = "ltrails_2"
+ },
+/obj/structure/alien/weeds,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/iron/white{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
"mT" = (
/obj/machinery/light/small/directional/east,
/obj/machinery/airalarm/directional/east{
@@ -1921,20 +1962,60 @@
/turf/open/floor/mineral/titanium/yellow,
/area/awaymission/moonoutpost19/arrivals)
"mX" = (
-/turf/open/floor/plating{
+/obj/structure/table/reinforced,
+/obj/structure/alien/weeds,
+/obj/item/paper_bin{
+ pixel_x = 1;
+ pixel_y = 9
+ },
+/obj/item/pen,
+/obj/item/radio/off,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
+/area/awaymission/moonoutpost19/research)
"mY" = (
/obj/machinery/light/small/directional/east,
/obj/structure/window/reinforced/spawner/directional/south,
/turf/open/floor/mineral/titanium/yellow,
/area/awaymission/moonoutpost19/arrivals)
+"na" = (
+/obj/machinery/door/firedoor,
+/obj/effect/mapping_helpers/airlock/locked,
+/obj/machinery/door/airlock/research{
+ density = 0;
+ icon_state = "open";
+ name = "Xenobiology Lab";
+ opacity = 0
+ },
+/obj/effect/mapping_helpers/atom_injector/obj_flag{
+ inject_flags = 1;
+ target_type = /obj/machinery/door/airlock
+ },
+/obj/effect/mapping_helpers/airlock/access/all/away/maintenance,
+/obj/structure/cable,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
"nd" = (
/obj/machinery/vending/cigarette,
/obj/structure/sign/poster/contraband/smoke/directional/north,
/turf/open/floor/iron/dark,
/area/awaymission/moonoutpost19/syndicate)
+"ne" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/east,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
"nf" = (
/obj/structure/filingcabinet,
/turf/open/floor/mineral/titanium/blue,
@@ -1960,28 +2041,26 @@
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"nj" = (
-/obj/structure/chair{
- dir = 4
- },
-/obj/machinery/newscaster{
- pixel_x = -30
- },
-/obj/effect/turf_decal/tile/red/half/contrasted{
+"nm" = (
+/obj/effect/turf_decal/tile/red/anticorner/contrasted{
dir = 8
},
/turf/open/floor/iron{
- heat_capacity = 1e+006
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
-/area/awaymission/moonoutpost19/research)
-"no" = (
-/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/blood/gibs,
+/area/awaymission/moonoutpost19/syndicate)
+"nn" = (
+/obj/item/flashlight/lantern{
+ icon_state = "lantern-on"
+ },
+/obj/effect/decal/cleanable/blood/splatter,
/turf/open/misc/asteroid{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/hive)
+/area/awaymission/moonoutpost19/main)
"nq" = (
/obj/effect/decal/cleanable/blood/tracks{
desc = "Your instincts say you shouldn't be following these.";
@@ -1999,14 +2078,6 @@
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"nr" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Break Room"
- },
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
"ns" = (
/obj/structure/grille/broken,
/obj/item/stack/rods,
@@ -2026,6 +2097,11 @@
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
+"nv" = (
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
"nx" = (
/obj/machinery/light/small/directional/north,
/obj/structure/window/reinforced/spawner/directional/east{
@@ -2044,17 +2120,28 @@
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"nA" = (
-/obj/machinery/airalarm/directional/north{
- req_access = list("syndicate")
+"nz" = (
+/obj/structure/disposalpipe/segment{
+ desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating.";
+ dir = 4;
+ name = "Acid-Proof disposal pipe"
},
-/obj/effect/mapping_helpers/airalarm/unlocked,
-/obj/effect/mapping_helpers/burnt_floor,
+/obj/machinery/door/poddoor/preopen{
+ desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating.";
+ id = "Awaylab";
+ name = "Acid-Proof Containment Chamber Blast Door"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
+"nA" = (
+/obj/machinery/light/directional/west,
+/obj/structure/chair/stool/directional/south,
/turf/open/floor/iron{
- dir = 8;
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
"nB" = (
@@ -2063,6 +2150,20 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
+"nG" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/firedoor,
+/obj/item/reagent_containers/cup/rag{
+ pixel_y = 5
+ },
+/obj/machinery/door/poddoor/shutters{
+ id = "awaykitchen";
+ name = "Serving Hatch"
+ },
+/turf/open/floor/carpet{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
"nH" = (
/obj/structure/bed{
dir = 4
@@ -2137,25 +2238,6 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"nQ" = (
-/obj/structure/dresser,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/button/door/directional/north{
- id = "awaydorm5";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- specialfunctions = 4
- },
-/turf/open/floor/wood{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"nR" = (
-/obj/structure/chair/office,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
"nS" = (
/obj/structure/table,
/obj/item/toy/cards/deck,
@@ -2167,234 +2249,132 @@
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"nV" = (
-/obj/effect/decal/cleanable/oil,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
+"nT" = (
+/obj/structure/table,
+/obj/item/scalpel{
+ pixel_y = 12
},
-/area/awaymission/moonoutpost19/research)
-"nX" = (
-/obj/structure/chair/comfy/black{
- dir = 8
- },
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/iron{
- dir = 8;
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/arrivals)
-"od" = (
-/obj/machinery/mineral/processing_unit_console,
-/turf/closed/wall,
-/area/awaymission/moonoutpost19/syndicate)
-"oi" = (
-/obj/structure/closet/crate,
-/obj/item/stack/sheet/glass{
- amount = 10
+/obj/item/circular_saw,
+/obj/item/razor{
+ pixel_y = 5
},
/obj/structure/alien/weeds,
-/obj/effect/turf_decal/bot{
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/turf/open/floor/iron{
- dir = 1;
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/syndicate)
-"om" = (
-/obj/machinery/light/small/directional/north,
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/turf_decal/stripes/asteroid/line{
- dir = 6
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/arrivals)
-"os" = (
-/obj/structure/table,
-/obj/item/book/manual/wiki/barman_recipes{
- pixel_y = 5
- },
-/obj/item/reagent_containers/cup/glass/shaker,
-/turf/open/floor/iron/cafeteria{
- dir = 5
- },
-/area/awaymission/moonoutpost19/arrivals)
-"oV" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating{
+/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"oZ" = (
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- icon_state = "ltrails_1"
+"nW" = (
+/obj/structure/alien/weeds,
+/obj/structure/bed/nest,
+/obj/effect/decal/cleanable/blood/gibs,
+/obj/item/clothing/mask/facehugger/impregnated,
+/obj/item/gun/ballistic/automatic/pistol,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/obj/effect/turf_decal/tile/neutral{
+/area/awaymission/moonoutpost19/hive)
+"nX" = (
+/obj/structure/chair/comfy/black{
dir = 8
},
+/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/iron{
+ dir = 8;
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"pb" = (
-/obj/machinery/shower/directional/west,
-/obj/item/bikehorn/rubberducky,
-/turf/open/floor/iron/freezer{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"ph" = (
-/obj/structure/table,
-/obj/item/storage/toolbox/mechanical{
- pixel_x = -2;
- pixel_y = -1
- },
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/multitool,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+"oi" = (
+/obj/structure/sink/kitchen/directional/south{
+ desc = "A sink used for washing one's hands and face. It looks rusty and home-made";
+ name = "old sink"
},
-/obj/structure/cable,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
+/turf/open/floor/iron/showroomfloor{
+ heat_capacity = 1e+006;
+ temperature = 273.15
},
-/area/awaymission/moonoutpost19/syndicate)
-"pp" = (
-/obj/structure/table,
-/obj/machinery/microwave{
- pixel_x = -3;
- pixel_y = 6
+/area/awaymission/moonoutpost19/arrivals)
+"os" = (
+/obj/structure/sign/departments/science/directional/north,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/purple/anticorner/contrasted{
+ dir = 1
},
-/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/iron{
- dir = 8;
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"ps" = (
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "Awaylab";
- name = "Containment Chamber Blast Doors";
- pixel_x = 4;
- pixel_y = -2;
- req_access = list("away_maintenance")
- },
-/obj/machinery/button/ignition{
- id = "awayxenobio";
- pixel_x = 4;
- pixel_y = 8
+"ox" = (
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/dark{
+ heat_capacity = 1e+006
},
-/obj/structure/alien/weeds,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/area/awaymission/moonoutpost19/syndicate)
+"oT" = (
+/obj/structure/dresser,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/button/door/directional/north{
+ id = "awaydorm5";
+ name = "Door Bolt Control";
+ normaldoorcontrol = 1;
+ specialfunctions = 4
},
-/turf/open/floor/iron{
+/turf/open/floor/wood{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"pz" = (
-/obj/effect/turf_decal/tile/red/half/contrasted{
- dir = 4
+/area/awaymission/moonoutpost19/syndicate)
+"oZ" = (
+/obj/structure/disposalpipe/segment,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
},
+/area/awaymission/moonoutpost19/arrivals)
+"pa" = (
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"pD" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/turf_decal/stripes/asteroid/line{
- dir = 5
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/main)
-"pI" = (
-/obj/structure/rack,
+"pp" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
- dir = 6
+ dir = 8
},
-/turf/open/floor/plating{
+/turf/open/floor/iron{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"pO" = (
-/mob/living/basic/construct/proteon/hostile,
-/turf/open/space,
-/area/space)
-"pP" = (
-/obj/structure/alien/weeds,
-/obj/structure/alien/resin/wall,
-/obj/structure/alien/resin/wall,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/hive)
-"pS" = (
-/obj/structure/chair/stool/directional/west,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"qk" = (
-/obj/structure/sign/warning/vacuum{
- desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'";
- name = "\improper HOSTILE ATMOSPHERE AHEAD"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
+"pD" = (
+/obj/structure/closet/secure_closet/freezer{
+ locked = 0;
+ name = "refrigerator";
+ req_access = list("away_maintenance")
},
-/area/awaymission/moonoutpost19/arrivals)
-"ql" = (
-/obj/structure/alien/weeds/node,
-/obj/effect/decal/cleanable/blood,
-/turf/open/misc/asteroid{
+/obj/item/reagent_containers/condiment/milk,
+/obj/item/reagent_containers/condiment/milk,
+/obj/item/reagent_containers/condiment/milk,
+/obj/item/storage/fancy/egg_box,
+/turf/open/floor/iron/showroomfloor{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/hive)
-"qm" = (
-/obj/structure/sink/directional/south,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/iron/freezer{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"qo" = (
-/obj/structure/table,
-/turf/open/floor/iron/white/corner{
- dir = 1;
- heat_capacity = 1e+006
+ temperature = 273.15
},
-/area/awaymission/moonoutpost19/research)
-"qp" = (
-/turf/open/floor/iron/dark{
+/area/awaymission/moonoutpost19/arrivals)
+"pI" = (
+/obj/structure/chair/stool/directional/south,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"qw" = (
+"pK" = (
/obj/structure/window/reinforced/spawner/directional/north,
/obj/structure/table,
/obj/item/radio/off{
@@ -2409,323 +2389,351 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"qM" = (
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
+"pM" = (
+/obj/machinery/light/broken/directional/south,
+/obj/structure/alien/weeds,
+/obj/machinery/camera/directional/south{
+ c_tag = "Xenobiology Containment South";
+ network = list("mo19x")
},
-/area/awaymission/moonoutpost19/arrivals)
-"qT" = (
-/obj/machinery/light/small/directional/west,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+/turf/open/floor/engine,
+/area/awaymission/moonoutpost19/research)
+"pO" = (
+/mob/living/basic/construct/proteon/hostile,
+/turf/open/space,
+/area/space)
+"pT" = (
+/obj/structure/closet/secure_closet/personal/cabinet{
+ locked = 0;
+ req_access = list("syndicate")
},
-/area/awaymission/moonoutpost19/arrivals)
-"qX" = (
-/obj/structure/alien/weeds,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+/obj/item/stack/spacecash/c50,
+/turf/open/floor/wood{
+ heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/main)
-"qY" = (
-/obj/structure/closet/crate/bin,
-/turf/open/floor/iron/cafeteria{
- dir = 5
+/area/awaymission/moonoutpost19/syndicate)
+"qd" = (
+/obj/structure/reagent_dispensers/wall/peppertank/directional/west,
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"rc" = (
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/plating{
+"qf" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark{
heat_capacity = 1e+006
},
+/area/awaymission/moonoutpost19/syndicate)
+"qi" = (
+/obj/machinery/light/small/directional/east,
+/obj/effect/decal/cleanable/generic,
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
/area/awaymission/moonoutpost19/arrivals)
-"rd" = (
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- dir = 5;
- icon_state = "ltrails_1"
+"qk" = (
+/obj/machinery/door/airlock{
+ name = "Unisex Restrooms"
},
-/turf/open/floor/carpet{
+/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"rf" = (
-/obj/effect/decal/cleanable/dirt,
+/area/awaymission/moonoutpost19/syndicate)
+"qr" = (
/obj/effect/turf_decal/tile/red/half/contrasted,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"qw" = (
+/obj/structure/sign/warning/secure_area/directional/north,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
/turf/open/floor/iron{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"rg" = (
-/obj/structure/extinguisher_cabinet/directional/north,
+"qy" = (
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron{
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"rm" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/generic,
+/area/awaymission/moonoutpost19/syndicate)
+"qG" = (
+/obj/machinery/portable_atmospherics/scrubber,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"rp" = (
-/obj/structure/chair/wood,
-/obj/machinery/airalarm/directional/west{
- pixel_x = -23;
- req_access = list("syndicate")
- },
+"qM" = (
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/wood{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/syndicate)
-"rq" = (
-/obj/machinery/power/shuttle_engine/propulsion/burst/right{
- dir = 4
- },
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/arrivals)
-"rN" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/iron/dark{
- heat_capacity = 1e+006
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/area/awaymission/moonoutpost19/syndicate)
-"rP" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating{
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"rU" = (
-/obj/effect/turf_decal/tile/red/half/contrasted{
- dir = 8
+"qR" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
+/obj/structure/cable,
/turf/open/floor/iron{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"rZ" = (
-/obj/structure/table,
-/obj/item/kitchen/rollingpin,
-/obj/item/knife/kitchen,
-/turf/open/floor/iron/cafeteria{
- dir = 5
- },
-/area/awaymission/moonoutpost19/arrivals)
-"sb" = (
+"qV" = (
/obj/structure/alien/weeds,
+/obj/structure/bed/nest,
+/obj/effect/decal/cleanable/blood/gibs,
/obj/effect/decal/cleanable/blood,
+/obj/item/clothing/mask/facehugger/impregnated,
+/obj/item/clothing/under/syndicate,
+/obj/item/clothing/glasses/night,
/turf/open/misc/asteroid{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/hive)
-"sc" = (
-/obj/machinery/firealarm/directional/south,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"si" = (
-/obj/machinery/light/small/directional/east,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/sign/poster/contraband/hacking_guide/directional/east,
-/turf/open/floor/plating{
+"qW" = (
+/obj/structure/cable,
+/turf/open/floor/iron/dark{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"sj" = (
-/obj/structure/rack,
-/obj/item/clothing/suit/space/syndicate/orange,
-/obj/item/clothing/mask/gas,
-/obj/item/pickaxe/drill,
-/obj/item/clothing/head/helmet/space/syndicate/orange,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
+"rd" = (
+/obj/structure/sign/warning/electric_shock,
+/turf/closed/wall/r_wall,
+/area/awaymission/moonoutpost19/research)
+"re" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/turf_decal/stripes/asteroid/line{
+ dir = 8
},
/turf/open/floor/plating{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
-/area/awaymission/moonoutpost19/syndicate)
-"sk" = (
-/obj/item/cigbutt,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/turf/open/floor/iron{
+/area/awaymission/moonoutpost19/main)
+"rh" = (
+/obj/machinery/button/door/directional/west{
+ id = "awaydorm1";
+ name = "Door Bolt Control";
+ normaldoorcontrol = 1;
+ specialfunctions = 4
+ },
+/turf/open/floor/carpet{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"sn" = (
-/obj/machinery/power/apc/worn_out,
-/obj/effect/mapping_helpers/apc/full_charge,
-/obj/effect/mapping_helpers/apc/unlocked,
-/obj/effect/mapping_helpers/apc/cell_10k,
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/red/half/contrasted,
-/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+"rl" = (
+/obj/machinery/light/directional/east,
+/obj/machinery/processor,
+/obj/machinery/airalarm/directional/east{
+ req_access = null
},
-/area/awaymission/moonoutpost19/syndicate)
-"st" = (
-/obj/effect/turf_decal/tile/red,
-/turf/open/floor/iron/dark{
- heat_capacity = 1e+006
+/obj/effect/mapping_helpers/airalarm/unlocked,
+/turf/open/floor/iron/cafeteria{
+ dir = 5
},
-/area/awaymission/moonoutpost19/syndicate)
-"sC" = (
+/area/awaymission/moonoutpost19/arrivals)
+"rm" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/iron/dark{
+/obj/effect/turf_decal/tile/blue/half/contrasted,
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"sG" = (
-/obj/machinery/door/poddoor/preopen{
- desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating.";
- id = "Awaybiohazard";
- name = "Acid-Proof Biohazard Containment Door"
+/area/awaymission/moonoutpost19/arrivals)
+"rq" = (
+/obj/machinery/power/shuttle_engine/propulsion/burst/right{
+ dir = 4
},
-/obj/machinery/door/poddoor{
- desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating.";
- id = "Awaybiohazard";
- layer = 2.9;
- name = "Acid-Proof Biohazard Containment Door"
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/obj/effect/spawner/structure/window/reinforced,
+/area/awaymission/moonoutpost19/arrivals)
+"rx" = (
+/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"sI" = (
-/obj/effect/turf_decal/stripes/line{
+"rC" = (
+/obj/structure/chair{
dir = 1
},
-/turf/open/floor/iron/white{
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"rE" = (
+/obj/item/stack/rods,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"sQ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+"rW" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor{
+ desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating.";
+ id = "Awaybiohazard";
+ layer = 2.9;
+ name = "Acid-Proof Biohazard Containment Door"
},
+/obj/effect/turf_decal/delivery,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"sS" = (
+/area/awaymission/moonoutpost19/research)
+"sa" = (
/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/loading_area,
+/obj/structure/alien/weeds,
/turf/open/floor/iron{
- heat_capacity = 1e+006
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
-/area/awaymission/moonoutpost19/arrivals)
-"te" = (
-/obj/structure/alien/weeds/node,
+/area/awaymission/moonoutpost19/syndicate)
+"sg" = (
+/obj/structure/rack,
+/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
- dir = 8
+ dir = 6
},
-/turf/open/floor/iron{
+/turf/open/floor/plating{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"ti" = (
-/obj/structure/table,
-/obj/item/storage/medkit/regular,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/airalarm/directional/east{
- req_access = null
+"sp" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Security Post"
},
-/obj/effect/mapping_helpers/airalarm/unlocked,
-/turf/open/floor/iron/white/side{
- dir = 8;
+/obj/effect/mapping_helpers/airlock/access/all/away/maintenance,
+/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"tj" = (
-/obj/machinery/door/window{
- dir = 1;
- name = "Gateway Access";
- req_access = list("syndicate")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
+"ss" = (
+/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
-/turf/open/floor/iron{
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"to" = (
-/obj/machinery/airalarm/directional/north{
- req_access = null
+"sA" = (
+/obj/structure/alien/weeds/node,
+/obj/effect/decal/cleanable/blood,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/obj/effect/mapping_helpers/airalarm/unlocked,
-/turf/open/floor/iron{
+/area/awaymission/moonoutpost19/hive)
+"sG" = (
+/obj/structure/grille,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"sI" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/egg,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/hive)
+"sN" = (
+/obj/machinery/shower/directional/west,
+/obj/item/bikehorn/rubberducky,
+/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"tq" = (
-/obj/structure/table/reinforced,
-/obj/item/paper_bin{
- pixel_x = 1;
- pixel_y = 9
+"sO" = (
+/obj/structure/grille/broken,
+/obj/item/stack/rods,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"sT" = (
+/obj/machinery/firealarm/directional/north,
+/obj/structure/table,
+/obj/item/storage/box/beakers{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/storage/box/syringes,
+/obj/structure/alien/weeds,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
+/area/awaymission/moonoutpost19/research)
+"sU" = (
+/obj/structure/chair,
/turf/open/floor/iron/cafeteria{
dir = 5
},
/area/awaymission/moonoutpost19/research)
-"tE" = (
-/obj/machinery/door/poddoor/preopen{
- desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating.";
- id = "Awaylab";
- name = "Acid-Proof Containment Chamber Blast Door"
+"tj" = (
+/obj/structure/sink/directional/west,
+/obj/structure/mirror/directional/east{
+ icon_state = "mirror_broke"
},
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/turf/open/floor/plating{
+/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"tQ" = (
-/obj/structure/chair{
- dir = 1
- },
+/area/awaymission/moonoutpost19/arrivals)
+"tJ" = (
+/obj/item/cigbutt,
/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"tT" = (
-/obj/structure/grille,
-/turf/open/floor/plating{
+/area/awaymission/moonoutpost19/syndicate)
+"tP" = (
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/iron{
+ dir = 8;
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"tQ" = (
+/obj/structure/closet/emcloset,
+/obj/structure/window/reinforced/spawner/directional/west,
+/obj/effect/turf_decal/tile/red/half/contrasted,
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
+/area/awaymission/moonoutpost19/syndicate)
"tX" = (
/obj/structure/chair{
dir = 8
@@ -2733,116 +2741,70 @@
/obj/effect/landmark/awaystart,
/turf/open/floor/mineral/titanium/blue,
/area/awaymission/moonoutpost19/arrivals)
-"ud" = (
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- icon_state = "ltrails_1"
+"tZ" = (
+/obj/item/radio/off,
+/obj/item/screwdriver{
+ pixel_y = 10
},
-/obj/effect/turf_decal/tile/purple{
- dir = 8
+/obj/structure/sign/poster/official/safety_report/directional/north,
+/obj/effect/turf_decal/tile/red/anticorner/contrasted{
+ dir = 4
},
-/turf/open/floor/iron/white{
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
"ue" = (
-/obj/machinery/door/airlock/external/ruin,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"uk" = (
-/obj/structure/table,
-/obj/item/retractor,
-/obj/item/hemostat,
/obj/structure/alien/weeds,
-/turf/open/floor/iron/white,
-/area/awaymission/moonoutpost19/research)
-"uu" = (
-/obj/structure/table,
-/obj/item/paper/fluff/awaymissions/moonoutpost19/log/ivan,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
+/obj/effect/decal/cleanable/blood,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/research)
-"uv" = (
-/obj/effect/turf_decal/tile/purple/anticorner/contrasted{
- dir = 4
+/area/awaymission/moonoutpost19/hive)
+"ul" = (
+/obj/item/kirbyplants{
+ desc = "A plastic potted plant.";
+ pixel_y = 3
},
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
/turf/open/floor/iron{
- heat_capacity = 1e+006
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"ux" = (
-/obj/structure/table,
-/obj/item/clothing/gloves/latex,
-/obj/item/clothing/mask/surgical,
-/obj/item/clothing/suit/apron/surgical,
-/obj/structure/alien/weeds,
-/turf/open/floor/iron/white/side{
- dir = 1;
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"uz" = (
-/obj/machinery/vending/medical{
- req_access = list("away_maintenance")
- },
-/turf/open/floor/iron/white/side{
- heat_capacity = 1e+006
+"um" = (
+/obj/machinery/door/airlock/engineering{
+ name = "Power Maintenance"
},
-/area/awaymission/moonoutpost19/research)
-"uA" = (
-/turf/open/floor/wood{
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/obj/structure/cable,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"uH" = (
+"us" = (
+/obj/structure/alien/weeds,
+/obj/structure/bed/nest,
+/obj/effect/decal/cleanable/blood/gibs,
+/obj/item/tank/internals/oxygen,
+/obj/item/clothing/suit/space/syndicate/orange,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/head/helmet/space/syndicate/orange,
+/obj/item/clothing/mask/facehugger/impregnated,
/turf/open/misc/asteroid{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/main)
-"uK" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Security Post"
+/area/awaymission/moonoutpost19/hive)
+"ux" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock{
+ name = "Kitchen"
},
/obj/effect/mapping_helpers/airlock/access/all/away/maintenance,
-/turf/open/floor/iron/white{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"uM" = (
-/obj/structure/table,
-/obj/machinery/recharger{
- pixel_y = 4
- },
-/obj/effect/turf_decal/tile/red/half/contrasted{
- dir = 4
- },
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"uN" = (
-/obj/structure/grille/broken,
-/obj/item/stack/rods,
-/obj/item/shard,
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- dir = 8;
- icon_state = "ltrails_2"
- },
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
+/turf/open/floor/iron/dark,
/area/awaymission/moonoutpost19/arrivals)
"uO" = (
/obj/machinery/airalarm/directional/east{
@@ -2856,60 +2818,63 @@
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"uT" = (
-/obj/machinery/door/firedoor,
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/door/airlock/research{
- density = 0;
- icon_state = "open";
- name = "Xenobiology Lab";
- opacity = 0
+"uR" = (
+/obj/structure/chair{
+ dir = 4
},
-/obj/effect/mapping_helpers/atom_injector/obj_flag{
- inject_flags = 1;
- target_type = /obj/machinery/door/airlock
+/obj/machinery/newscaster{
+ pixel_x = -30
+ },
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 8
},
-/obj/effect/mapping_helpers/airlock/access/all/away/maintenance,
-/obj/structure/cable,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"uU" = (
-/obj/machinery/computer/monitor{
- dir = 1
- },
-/obj/structure/cable,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
+"uX" = (
+/obj/structure/table,
+/obj/machinery/microwave{
+ pixel_x = -3;
+ pixel_y = 6
},
-/area/awaymission/moonoutpost19/research)
-"uY" = (
-/obj/item/cigbutt,
+/obj/machinery/light/small/directional/east,
/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"vb" = (
-/obj/structure/grille/broken,
-/obj/item/stack/rods,
-/obj/item/stack/rods,
-/obj/item/shard,
-/obj/structure/alien/weeds,
+/area/awaymission/moonoutpost19/syndicate)
+"vc" = (
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/turf_decal/stripes/asteroid/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/asteroid/line{
+ dir = 8
+ },
/turf/open/floor/plating{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/main)
+"vg" = (
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 4
},
-/area/awaymission/moonoutpost19/syndicate)
-"vl" = (
-/obj/structure/chair/stool/directional/west,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
+/area/awaymission/moonoutpost19/research)
+"vn" = (
+/obj/structure/alien/weeds,
+/obj/effect/decal/cleanable/blood/gibs,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/hive)
"vt" = (
/obj/structure/sign/warning/vacuum{
desc = "A beacon used by a teleporter.";
@@ -2920,63 +2885,118 @@
/obj/effect/landmark/awaystart,
/turf/open/floor/mineral/titanium/yellow,
/area/awaymission/moonoutpost19/arrivals)
-"vC" = (
-/obj/structure/rack,
-/obj/item/pai_card{
- pixel_x = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+"vH" = (
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
},
-/turf/open/floor/iron/white{
+/area/awaymission/moonoutpost19/arrivals)
+"vJ" = (
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"vE" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating.";
- dir = 4;
- name = "Acid-Proof disposal pipe"
- },
+"vM" = (
/obj/structure/alien/weeds,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/obj/structure/alien/resin/wall,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/main)
+"vW" = (
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/iron/dark{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"vZ" = (
+/obj/structure/closet/secure_closet/personal/cabinet{
+ locked = 0;
+ req_access = list("away_maintenance")
+ },
+/obj/item/clothing/under/misc/assistantformal,
+/turf/open/floor/carpet{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"wa" = (
+/obj/structure/chair/wood,
+/obj/machinery/airalarm/directional/west{
+ pixel_x = -23;
+ req_access = list("syndicate")
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"wc" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/red/half/contrasted,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
+/area/awaymission/moonoutpost19/syndicate)
+"wf" = (
+/obj/machinery/airalarm/directional/north{
+ req_access = null
+ },
+/obj/effect/mapping_helpers/airalarm/unlocked,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"vT" = (
-/obj/effect/decal/cleanable/generic,
+/area/awaymission/moonoutpost19/arrivals)
+"wh" = (
+/obj/structure/table,
+/obj/item/storage/medkit/regular,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/airalarm/directional/east{
+ req_access = null
+ },
+/obj/effect/mapping_helpers/airalarm/unlocked,
+/turf/open/floor/iron/white/side{
+ dir = 8;
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
+"wj" = (
+/obj/effect/turf_decal/tile/purple/anticorner/contrasted{
+ dir = 4
+ },
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"vV" = (
-/obj/structure/cable,
+"wm" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/red/half/contrasted,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"wl" = (
+/area/awaymission/moonoutpost19/syndicate)
+"wv" = (
/obj/machinery/door/firedoor/closed,
-/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"wu" = (
-/obj/machinery/airalarm/directional/north{
- pixel_y = 23;
- req_access = list("syndicate")
+"ww" = (
+/obj/structure/rack,
+/obj/item/pai_card{
+ pixel_x = 4
},
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
+/area/awaymission/moonoutpost19/research)
"wy" = (
/obj/structure/alien/weeds,
/mob/living/basic/alien,
@@ -2985,68 +3005,119 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/hive)
-"wB" = (
-/obj/effect/decal/cleanable/cobweb,
-/obj/structure/cable,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
+"wz" = (
+/obj/structure/sign/warning/vacuum/directional/south{
+ desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'";
+ name = "\improper HOSTILE ATMOSPHERE AHEAD"
},
-/area/awaymission/moonoutpost19/research)
-"wE" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/door/firedoor/closed,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
},
-/area/awaymission/moonoutpost19/arrivals)
-"wF" = (
-/obj/structure/chair/comfy/black,
/turf/open/floor/plating{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
-/area/awaymission/moonoutpost19/arrivals)
-"wZ" = (
-/obj/structure/extinguisher_cabinet/directional/west,
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- icon_state = "ltrails_2"
+/area/awaymission/moonoutpost19/syndicate)
+"wB" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/resin/wall,
+/obj/structure/alien/resin/wall,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
+/area/awaymission/moonoutpost19/hive)
+"wH" = (
/obj/structure/alien/weeds,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/turf/open/floor/iron/white{
+/area/awaymission/moonoutpost19/main)
+"wI" = (
+/obj/machinery/portable_atmospherics/scrubber,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"xh" = (
-/obj/effect/turf_decal/stripes/corner,
+/area/awaymission/moonoutpost19/syndicate)
+"wS" = (
+/obj/structure/table,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/cell/high,
+/obj/effect/turf_decal/tile/blue/half/contrasted,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
+"wU" = (
+/obj/structure/bed{
+ dir = 4
+ },
+/obj/item/bedsheet{
+ dir = 4
+ },
+/turf/open/floor/carpet{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
"xj" = (
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"xt" = (
-/obj/structure/urinal/directional/north,
-/turf/open/floor/iron/freezer{
+"xk" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"xu" = (
-/obj/item/storage/bag/ore,
+"xl" = (
+/obj/structure/alien/weeds,
/turf/open/misc/asteroid{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/main)
+/area/awaymission/moonoutpost19/hive)
+"xs" = (
+/obj/machinery/mineral/processing_unit{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"xt" = (
+/obj/machinery/light/small/directional/west,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/sign/poster/contraband/space_cube/directional/west,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
"xz" = (
-/obj/machinery/door/firedoor/closed,
+/obj/structure/closet,
+/obj/item/storage/box/lights/mixed,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"xB" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/public/glass{
+ name = "Diner"
+ },
/turf/open/floor/iron{
heat_capacity = 1e+006
},
@@ -3061,25 +3132,6 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/hive)
-"xK" = (
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/iron{
- dir = 8;
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/syndicate)
-"xN" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/alien/weeds,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
"xP" = (
/obj/structure/alien/weeds/node,
/mob/living/basic/alien/drone{
@@ -3094,215 +3146,227 @@
/obj/effect/landmark/awaystart,
/turf/open/floor/mineral/titanium/yellow,
/area/awaymission/moonoutpost19/arrivals)
-"xW" = (
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/door/airlock/external/ruin{
- density = 0;
- icon_state = "open";
- opacity = 0
- },
-/obj/effect/mapping_helpers/atom_injector/obj_flag{
- inject_flags = 1;
- target_type = /obj/machinery/door/airlock
+"xV" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 8
},
-/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plating{
+/turf/open/floor/iron{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"xZ" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor{
- desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating.";
- id = "Awaybiohazard";
- layer = 2.9;
- name = "Acid-Proof Biohazard Containment Door"
+"ya" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ icon_state = "ltrails_1"
},
-/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/iron{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"yb" = (
+/obj/effect/decal/cleanable/oil,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"ye" = (
+/turf/open/floor/iron/freezer{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"yg" = (
+/obj/structure/closet/crate/freezer,
+/obj/structure/alien/weeds,
+/obj/item/clothing/mask/facehugger/impregnated,
+/obj/item/xenos_claw,
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"ya" = (
-/obj/item/stack/rods,
+"yh" = (
+/obj/structure/table,
+/obj/item/book/manual/wiki/detective,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"yk" = (
/obj/structure/cable,
-/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"yg" = (
-/obj/structure/tank_dispenser/oxygen{
- oxygentanks = 9
+"yp" = (
+/obj/structure/sign/warning/vacuum{
+ desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'";
+ name = "\improper HOSTILE ATMOSPHERE AHEAD"
},
-/obj/machinery/light/small/broken/directional/north,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"yy" = (
+/obj/machinery/portable_atmospherics/canister/air,
/obj/effect/turf_decal/stripes/line{
- dir = 9
+ dir = 5
},
/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"yh" = (
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- dir = 8;
- icon_state = "ltrails_1"
+"yH" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
},
-/obj/structure/cable,
-/turf/open/floor/plating{
+/turf/open/floor/iron/dark{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"yi" = (
-/obj/item/shard{
- icon_state = "small"
- },
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+/area/awaymission/moonoutpost19/syndicate)
+"yJ" = (
+/obj/structure/table,
+/obj/item/book/manual/wiki/security_space_law,
+/obj/machinery/computer/security/telescreen/entertainment/directional/west,
+/obj/effect/turf_decal/tile/red/anticorner/contrasted{
+ dir = 8
},
-/area/awaymission/moonoutpost19/main)
-"yl" = (
-/obj/item/flashlight/lantern{
- icon_state = "lantern-on"
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
-/obj/effect/decal/cleanable/blood/splatter,
-/turf/open/misc/asteroid{
+/area/awaymission/moonoutpost19/research)
+"yM" = (
+/obj/structure/cable,
+/turf/open/floor/iron{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/main)
-"yp" = (
-/obj/effect/decal/cleanable/dirt,
+/area/awaymission/moonoutpost19/syndicate)
+"yO" = (
+/obj/effect/decal/cleanable/cobweb,
/obj/structure/cable,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
+"yQ" = (
+/obj/machinery/airalarm/directional/north{
+ pixel_y = 23;
+ req_access = list("syndicate")
},
+/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"ys" = (
-/obj/structure/alien/weeds/node,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/main)
-"yX" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/area/awaymission/moonoutpost19/syndicate)
+"yU" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ dir = 8;
+ icon_state = "ltrails_2"
},
-/turf/open/floor/iron{
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"yZ" = (
-/obj/structure/table,
-/obj/item/scalpel{
- pixel_y = 12
- },
-/obj/item/circular_saw,
-/obj/item/razor{
- pixel_y = 5
+"zm" = (
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
-/obj/structure/alien/weeds,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/area/awaymission/moonoutpost19/arrivals)
+"zt" = (
+/obj/structure/sign/warning/vacuum/directional/north{
+ desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'";
+ name = "\improper HOSTILE ATMOSPHERE AHEAD"
},
-/turf/open/floor/iron/white{
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"za" = (
+/area/awaymission/moonoutpost19/arrivals)
+"zu" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/power/port_gen/pacman/super{
+ name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator"
+ },
+/obj/effect/turf_decal/stripes/line,
/obj/structure/cable,
-/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"zd" = (
-/obj/item/stack/ore/iron{
- pixel_x = -3;
- pixel_y = 9
+/area/awaymission/moonoutpost19/syndicate)
+"zw" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/turf_decal/stripes/asteroid/line{
+ dir = 5
},
-/turf/open/misc/asteroid{
+/turf/open/floor/plating{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/main)
-"zk" = (
-/obj/structure/table,
-/obj/item/storage/toolbox/mechanical{
- pixel_x = -2;
- pixel_y = -1
+"zy" = (
+/obj/structure/closet/crate,
+/obj/item/storage/box/lights/mixed,
+/obj/item/poster/random_contraband,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
},
-/obj/item/multitool,
-/obj/effect/turf_decal/tile/blue/half/contrasted,
+/area/awaymission/moonoutpost19/research)
+"zz" = (
+/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"zp" = (
-/obj/structure/alien/weeds,
-/obj/effect/turf_decal/tile/red/anticorner/contrasted,
-/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/syndicate)
-"zs" = (
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/closet/secure_closet{
- icon_state = "science";
- name = "scientist's locker";
- req_access = list("away_maintenance")
- },
-/obj/item/clothing/suit/toggle/labcoat,
-/obj/item/tank/internals/oxygen,
-/obj/item/clothing/mask/gas,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron{
+"zC" = (
+/obj/structure/sink/directional/south,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"zt" = (
-/turf/open/floor/iron/white/corner{
- dir = 8;
+"zI" = (
+/obj/machinery/light/small/directional/east,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/noticeboard/directional/east,
+/obj/item/paper/fluff/awaymissions/moonoutpost19/welcome,
+/obj/machinery/camera/directional/east{
+ c_tag = "Arrivals South";
+ network = list("mo19")
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"zy" = (
-/obj/structure/alien/weeds,
-/obj/structure/bed/nest,
-/obj/effect/decal/cleanable/blood/gibs,
-/obj/effect/decal/cleanable/blood,
-/obj/item/clothing/mask/facehugger/impregnated,
-/obj/item/clothing/under/syndicate,
-/obj/item/clothing/glasses/night,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/hive)
"zM" = (
-/obj/machinery/computer/monitor,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
+/obj/structure/table/reinforced,
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/shutters{
+ id = "awaykitchen";
+ name = "Serving Hatch"
},
-/obj/structure/cable,
-/turf/open/floor/plating{
+/turf/open/floor/carpet{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
+/area/awaymission/moonoutpost19/arrivals)
"zN" = (
/obj/machinery/mineral/stacking_machine{
dir = 1;
@@ -3318,101 +3382,113 @@
temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"zP" = (
+"zO" = (
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/structure/closet/l3closet/scientist,
/obj/structure/alien/weeds,
-/obj/effect/turf_decal/tile/purple{
+/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/iron/white{
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"zS" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/button/door/directional/west{
- id = "awaykitchen";
- name = "Kitchen Shutters Control"
- },
-/turf/open/floor/iron/cafeteria{
- dir = 5
+"zP" = (
+/obj/item/cigbutt,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"zV" = (
-/obj/structure/alien/weeds,
-/obj/structure/alien/resin/wall,
+"zQ" = (
+/obj/item/storage/bag/ore,
/turf/open/misc/asteroid{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/main)
-"Ac" = (
-/obj/machinery/power/port_gen/pacman{
- name = "P.A.C.M.A.N.-type portable generator"
+"zR" = (
+/obj/machinery/airalarm/directional/west{
+ req_access = null
},
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable,
+/obj/effect/mapping_helpers/airalarm/unlocked,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron/freezer{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"zV" = (
+/obj/structure/table,
+/obj/item/paper/fluff/awaymissions/moonoutpost19/log/ivan,
+/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"Ai" = (
-/obj/structure/table/reinforced,
+/area/awaymission/moonoutpost19/research)
+"Ab" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/turf_decal/stripes/asteroid/line{
+ dir = 6
+ },
+/turf/open/floor/plating{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/main)
+"Ac" = (
/obj/structure/alien/weeds,
-/obj/item/paper_bin{
- pixel_x = 1;
- pixel_y = 9
+/obj/structure/bed/nest,
+/obj/effect/decal/cleanable/blood/gibs,
+/obj/item/clothing/mask/facehugger/impregnated,
+/obj/item/clothing/under/rank/security/officer,
+/obj/item/clothing/suit/armor/vest,
+/obj/item/melee/baton/security/loaded,
+/obj/item/clothing/head/helmet,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/obj/item/pen,
-/obj/item/radio/off,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/area/awaymission/moonoutpost19/hive)
+"Af" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/button/door/directional/west{
+ id = "awaykitchen";
+ name = "Kitchen Shutters Control"
},
-/turf/open/floor/iron{
- heat_capacity = 1e+006
+/turf/open/floor/iron/cafeteria{
+ dir = 5
},
-/area/awaymission/moonoutpost19/research)
-"Aq" = (
-/obj/structure/chair{
- dir = 1
+/area/awaymission/moonoutpost19/arrivals)
+"Ah" = (
+/obj/machinery/door/firedoor,
+/obj/structure/extinguisher_cabinet/directional/south,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/obj/machinery/light/small/directional/east,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
+/area/awaymission/moonoutpost19/research)
"At" = (
-/obj/structure/sign/departments/science/directional/north,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/purple/anticorner/contrasted{
+/obj/machinery/power/terminal{
dir = 1
},
-/turf/open/floor/iron{
- heat_capacity = 1e+006
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/area/awaymission/moonoutpost19/arrivals)
-"Au" = (
-/obj/machinery/portable_atmospherics/canister/air,
+/obj/structure/cable,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
+/area/awaymission/moonoutpost19/syndicate)
"Av" = (
-/obj/structure/closet/secure_closet{
- icon_state = "rd";
- name = "research director's locker";
- req_access = list("away_maintenance")
- },
-/obj/item/storage/backpack/satchel/science,
-/obj/item/clothing/gloves/latex,
-/turf/open/floor/iron/cafeteria{
- dir = 5
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ dir = 8;
+ icon_state = "ltrails_1"
},
-/area/awaymission/moonoutpost19/research)
-"AA" = (
-/obj/machinery/light/small/directional/south,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron/white{
+/obj/structure/cable,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
@@ -3422,99 +3498,44 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"AF" = (
+"AL" = (
+/obj/effect/turf_decal/tile/red/half/contrasted,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"AX" = (
/turf/open/floor/iron/white/side{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"AK" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"AN" = (
-/obj/structure/chair/stool/directional/south,
-/obj/effect/mapping_helpers/broken_floor,
+"Ba" = (
/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"AQ" = (
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- dir = 8;
- icon_state = "ltrails_2"
+"Bb" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 4
},
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating{
+/turf/open/floor/iron{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
-/area/awaymission/moonoutpost19/arrivals)
-"AS" = (
-/obj/machinery/door/airlock{
- name = "Unisex Restrooms"
- },
-/turf/open/floor/iron/freezer{
- heat_capacity = 1e+006
- },
/area/awaymission/moonoutpost19/syndicate)
-"AT" = (
-/obj/machinery/light/directional/west,
-/obj/structure/chair/stool/directional/south,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"AX" = (
-/obj/effect/turf_decal/tile/red/half/contrasted,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"Ba" = (
-/obj/structure/alien/weeds/node,
-/obj/structure/alien/resin/wall,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/main)
-"Bh" = (
-/obj/item/pickaxe/drill,
-/turf/open/misc/asteroid{
+"Bc" = (
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/main)
-"Bj" = (
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"Bm" = (
-/obj/machinery/vending/cigarette,
-/obj/structure/sign/poster/contraband/smoke/directional/south,
-/turf/open/floor/iron/dark,
-/area/awaymission/moonoutpost19/arrivals)
-"Br" = (
-/obj/machinery/light/broken/directional/east,
-/obj/machinery/airalarm/directional/east{
- req_access = null
- },
-/obj/effect/mapping_helpers/airalarm/unlocked,
-/obj/effect/turf_decal/tile/purple,
-/turf/open/floor/iron/white{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"BB" = (
+"Be" = (
/obj/machinery/light/small/directional/east,
/obj/effect/decal/remains/human{
desc = "They look like human remains. The skeleton is sitting upright with its legs tucked in and hands still holding onto its arms."
@@ -3525,22 +3546,22 @@
temperature = 273.15
},
/area/awaymission/moonoutpost19/arrivals)
-"BR" = (
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"BT" = (
-/obj/structure/toilet{
- dir = 4
+"Bm" = (
+/obj/machinery/vending/cigarette,
+/obj/structure/sign/poster/contraband/smoke/directional/south,
+/turf/open/floor/iron/dark,
+/area/awaymission/moonoutpost19/arrivals)
+"Bn" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ dir = 5;
+ icon_state = "ltrails_1"
},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/iron/freezer{
+/turf/open/floor/carpet{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"BX" = (
+"Bp" = (
/obj/structure/closet/crate/bin,
/obj/item/trash/candy,
/obj/item/trash/can,
@@ -3551,116 +3572,149 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"BZ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/item/trash/candy,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"Cb" = (
-/obj/structure/closet/crate,
-/obj/item/storage/box/lights/mixed,
-/obj/item/poster/random_contraband,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"Cf" = (
-/obj/machinery/power/smes{
- input_level = 10000;
- inputting = 0;
- output_level = 15000
- },
-/obj/structure/cable,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"Ch" = (
+"Bw" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 4
- },
/turf/open/floor/iron{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
-/area/awaymission/moonoutpost19/arrivals)
-"Ci" = (
-/obj/machinery/door/airlock/maintenance,
-/obj/structure/cable,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
+/area/awaymission/moonoutpost19/syndicate)
+"Bx" = (
+/obj/item/stack/rods,
+/obj/item/shard{
+ icon_state = "small"
+ },
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ dir = 8;
+ icon_state = "ltrails_1"
+ },
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 4
},
-/area/awaymission/moonoutpost19/research)
-"Cp" = (
-/obj/structure/closet/l3closet,
-/obj/effect/turf_decal/tile/red/half/contrasted,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"Ct" = (
-/obj/structure/alien/weeds,
-/turf/open/floor/iron/white/side{
+/area/awaymission/moonoutpost19/research)
+"BA" = (
+/obj/machinery/light/small/directional/south,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"CC" = (
-/obj/structure/closet/secure_closet/personal/cabinet{
+"BC" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/window/spawner/directional/north,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"BE" = (
+/obj/structure/closet/secure_closet/freezer{
locked = 0;
+ name = "meat fridge";
req_access = list("away_maintenance")
},
-/obj/item/clothing/under/misc/assistantformal,
-/turf/open/floor/carpet{
+/obj/item/food/meat/slab/monkey,
+/obj/item/food/meat/slab/monkey,
+/obj/item/food/meat/slab/monkey,
+/obj/item/food/meat/slab/monkey,
+/turf/open/floor/iron/showroomfloor{
+ heat_capacity = 1e+006;
+ temperature = 273.15
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"BR" = (
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
+/area/awaymission/moonoutpost19/research)
+"Cc" = (
+/obj/machinery/light/small/directional/south,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
/area/awaymission/moonoutpost19/arrivals)
-"CN" = (
-/obj/machinery/portable_atmospherics/canister/air,
+"Cd" = (
+/obj/machinery/door/airlock{
+ id_tag = "awaydorm1";
+ name = "Dorm 1"
+ },
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"Cf" = (
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/structure/table,
+/obj/item/storage/medkit/regular,
+/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
- dir = 5
+ dir = 10
},
-/turf/open/floor/plating{
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"CP" = (
-/obj/machinery/firealarm/directional/east,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/camera/directional/east{
- c_tag = "Bar";
- network = list("mo19")
+"Ci" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/structure/cable,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
},
-/obj/effect/turf_decal/tile/bar/opposingcorners,
+/area/awaymission/moonoutpost19/research)
+"Cp" = (
+/obj/machinery/door/firedoor/closed,
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"CR" = (
-/obj/item/cigbutt,
+"Cv" = (
+/obj/machinery/power/port_gen/pacman{
+ name = "P.A.C.M.A.N.-type portable generator"
+ },
+/obj/structure/cable,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"CS" = (
-/obj/machinery/door/airlock{
- name = "Unisex Showers"
+"Cw" = (
+/obj/machinery/light/small/directional/west,
+/obj/machinery/computer/security{
+ desc = "Used to access the various cameras on the outpost.";
+ dir = 4;
+ network = list("mo19r","mo19")
},
-/turf/open/floor/iron/freezer{
+/obj/machinery/button/door/directional/west{
+ id = "Awaybiohazard";
+ name = "Biohazard Shutter Control"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/admin/general,
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"CT" = (
-/obj/effect/decal/cleanable/oil,
+/area/awaymission/moonoutpost19/research)
+"CF" = (
+/obj/structure/grille,
+/obj/machinery/door/poddoor/preopen{
+ desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating.";
+ id = "Awaylab";
+ name = "Acid-Proof Containment Chamber Blast Door"
+ },
+/obj/item/stack/cable_coil/cut,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"Dc" = (
+/area/awaymission/moonoutpost19/research)
+"CK" = (
/obj/item/stack/rods,
/obj/item/shard{
icon_state = "small"
@@ -3669,256 +3723,259 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"Dh" = (
-/obj/structure/closet/secure_closet/personal/cabinet{
- locked = 0;
+"CL" = (
+/obj/structure/table/reinforced,
+/obj/machinery/button/door{
+ id = "Awaylab";
+ name = "Containment Chamber Blast Doors";
+ pixel_x = 4;
+ pixel_y = -2;
req_access = list("away_maintenance")
},
-/obj/item/clothing/under/suit/burgundy,
-/turf/open/floor/carpet{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"Di" = (
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/iron/dark{
- heat_capacity = 1e+006
+/obj/machinery/button/ignition{
+ id = "awayxenobio";
+ pixel_x = 4;
+ pixel_y = 8
},
-/area/awaymission/moonoutpost19/syndicate)
-"Dk" = (
/obj/structure/alien/weeds,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/area/awaymission/moonoutpost19/hive)
-"Ds" = (
-/obj/structure/noticeboard/directional/north,
-/obj/item/paper/fluff/awaymissions/moonoutpost19/food_specials,
-/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/iron{
- dir = 8;
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"DA" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Diner"
+/area/awaymission/moonoutpost19/research)
+"CR" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
},
-/turf/open/floor/iron{
+/turf/open/floor/iron/white/corner{
+ dir = 1;
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"DJ" = (
-/obj/machinery/light/small/directional/north,
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/turf_decal/stripes/asteroid/line{
- dir = 10
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/arrivals)
-"DO" = (
-/obj/item/cigbutt,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
+"CU" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/iron/dark{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"DP" = (
-/obj/structure/sign/warning/vacuum/directional/south{
- desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'";
- name = "\improper HOSTILE ATMOSPHERE AHEAD"
- },
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/syndicate)
-"DX" = (
-/obj/machinery/light/small/directional/south,
+"Di" = (
+/obj/effect/decal/cleanable/generic,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Eb" = (
-/obj/structure/disposaloutlet,
-/obj/structure/disposalpipe/trunk{
- dir = 1
+"Dn" = (
+/obj/structure/sign/warning/secure_area/directional/east,
+/obj/structure/alien/weeds,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/purple,
+/turf/open/floor/iron/white{
+ heat_capacity = 1e+006
},
-/obj/effect/turf_decal/sand/plating,
-/turf/open/floor/plating{
+/area/awaymission/moonoutpost19/research)
+"Dt" = (
+/obj/item/pickaxe/drill,
+/turf/open/misc/asteroid{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/main)
-"Ek" = (
-/obj/machinery/light/small/directional/north,
-/obj/effect/turf_decal/sand/plating,
-/turf/open/floor/plating{
+"Dw" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ dir = 6;
+ icon_state = "ltrails_1"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
-/area/awaymission/moonoutpost19/syndicate)
-"El" = (
-/obj/structure/table,
-/obj/item/stack/sheet/mineral/plasma,
-/obj/machinery/light/small/broken/directional/north,
-/obj/machinery/airalarm/directional/north{
- req_access = null
+/area/awaymission/moonoutpost19/arrivals)
+"DE" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/white{
+ heat_capacity = 1e+006
},
-/obj/effect/mapping_helpers/airalarm/unlocked,
-/obj/structure/alien/weeds,
-/turf/open/floor/iron{
+/area/awaymission/moonoutpost19/research)
+"DG" = (
+/obj/machinery/door/poddoor/preopen{
+ desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating.";
+ id = "Awaybiohazard";
+ name = "Acid-Proof Biohazard Containment Door"
+ },
+/obj/machinery/door/poddoor{
+ desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating.";
+ id = "Awaybiohazard";
+ layer = 2.9;
+ name = "Acid-Proof Biohazard Containment Door"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"Eo" = (
+"DJ" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
+/turf/open/floor/wood{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/syndicate)
-"Eq" = (
-/obj/machinery/door/firedoor,
+"DK" = (
/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/door/airlock/command{
+/obj/machinery/door/airlock/public/glass{
density = 0;
icon_state = "open";
- name = "Research Director's Office";
- opacity = 0
+ name = "Dormitories"
},
/obj/effect/mapping_helpers/atom_injector/obj_flag{
inject_flags = 1;
target_type = /obj/machinery/door/airlock
},
-/obj/effect/mapping_helpers/airlock/access/all/away/maintenance,
+/obj/item/stack/rods,
+/obj/item/shard{
+ icon_state = "small"
+ },
+/turf/open/floor/iron{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"DX" = (
+/obj/structure/closet/secure_closet{
+ icon_state = "rd";
+ name = "research director's locker";
+ req_access = list("away_maintenance")
+ },
+/obj/item/storage/backpack/satchel/science,
+/obj/item/clothing/gloves/latex,
/turf/open/floor/iron/cafeteria{
dir = 5
},
/area/awaymission/moonoutpost19/research)
-"Er" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/structure/chair/office/light{
+"Em" = (
+/obj/machinery/light/small/directional/east,
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/structure/cable,
-/turf/open/floor/iron/white,
-/area/awaymission/moonoutpost19/research)
-"EB" = (
-/turf/open/floor/iron{
+/obj/structure/sign/poster/contraband/hacking_guide/directional/east,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"EG" = (
-/obj/machinery/light/small/directional/south,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+/area/awaymission/moonoutpost19/syndicate)
+"En" = (
+/obj/structure/tank_dispenser/oxygen{
+ oxygentanks = 9
},
-/area/awaymission/moonoutpost19/research)
-"ES" = (
-/obj/machinery/mineral/unloading_machine{
- dir = 1;
- icon_state = "unloader-corner";
- input_dir = 4;
- output_dir = 8
+/obj/machinery/light/small/broken/directional/north,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
},
-/obj/structure/alien/weeds,
/turf/open/floor/plating{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"ET" = (
-/obj/structure/table/reinforced,
-/obj/structure/alien/weeds,
-/obj/machinery/computer/security/telescreen{
- desc = "Used for watching the contents of the xenobiology containment pen.";
- dir = 8;
- name = "xenobiology monitor";
- network = list("mo19x")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+"Er" = (
+/obj/structure/table,
+/obj/item/storage/box/donkpockets,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
+/area/awaymission/moonoutpost19/syndicate)
+"Et" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"EU" = (
-/obj/structure/sign/warning/secure_area/directional/east,
+"Ew" = (
+/obj/machinery/computer/operating{
+ dir = 8
+ },
/obj/structure/alien/weeds,
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/purple,
-/turf/open/floor/iron/white{
+/turf/open/floor/iron/white/side{
+ dir = 1;
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"Fc" = (
+"Ez" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
+/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Fj" = (
-/obj/machinery/light/small/directional/east,
-/turf/open/floor/wood{
+"EF" = (
+/obj/machinery/light/small/directional/north,
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"Fq" = (
-/obj/machinery/firealarm/directional/east,
-/obj/effect/mapping_helpers/broken_floor,
+"EH" = (
+/obj/machinery/door/firedoor/closed,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
/turf/open/floor/iron{
- dir = 8;
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"ET" = (
+/obj/item/stack/rods,
+/obj/item/shard{
+ icon_state = "small"
+ },
+/turf/open/misc/asteroid{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/main)
+"EU" = (
+/obj/machinery/door/airlock{
+ name = "Unisex Restrooms"
+ },
+/turf/open/floor/iron/freezer{
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Fu" = (
-/obj/effect/turf_decal/tile/red/half/contrasted,
-/turf/open/floor/iron{
+"Fa" = (
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/wood{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/syndicate)
-"Fv" = (
-/obj/structure/alien/weeds/node,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+"Fc" = (
+/obj/structure/alien/weeds,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
},
/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"FA" = (
-/obj/machinery/door/airlock{
- name = "Unit 1"
- },
-/turf/open/floor/iron/freezer{
- heat_capacity = 1e+006
+"Fx" = (
+/obj/machinery/light/small/directional/north,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
"FJ" = (
@@ -3929,14 +3986,26 @@
},
/area/awaymission/moonoutpost19/arrivals)
"FK" = (
-/obj/effect/turf_decal/tile/red/anticorner/contrasted{
+/obj/structure/toilet{
dir = 1
},
-/turf/open/floor/iron/dark{
+/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"FP" = (
+/area/awaymission/moonoutpost19/research)
+"FM" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ icon_state = "ltrails_1"
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/iron/white{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
+"FR" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/sand/plating,
/obj/effect/turf_decal/stripes/asteroid/corner{
@@ -3951,39 +4020,25 @@
temperature = 251
},
/area/awaymission/moonoutpost19/main)
-"FQ" = (
-/obj/machinery/light/small/broken/directional/east,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"FT" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
+"FW" = (
+/obj/machinery/power/shieldwallgen/unlocked,
/obj/structure/cable,
-/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/syndicate)
-"FV" = (
-/obj/structure/closet,
-/obj/item/storage/box/lights/mixed,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"FX" = (
-/obj/machinery/door/firedoor/closed,
-/obj/structure/cable,
+/area/awaymission/moonoutpost19/research)
+"FZ" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
+/area/awaymission/moonoutpost19/syndicate)
+"Ga" = (
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/main)
"Gh" = (
/obj/structure/table,
/obj/item/storage/fancy/cigarettes/dromedaryco,
@@ -3994,75 +4049,67 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Gj" = (
-/obj/structure/grille/broken,
-/obj/item/stack/rods,
-/obj/item/stack/rods,
-/obj/item/shard{
- icon_state = "medium"
- },
-/turf/open/floor/plating{
+"Gi" = (
+/obj/machinery/shower/directional/north,
+/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
+/area/awaymission/moonoutpost19/arrivals)
"Gk" = (
-/obj/structure/closet/emcloset,
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/effect/turf_decal/tile/red/half/contrasted,
-/turf/open/floor/iron{
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"Go" = (
-/obj/structure/chair/wood{
- dir = 8
+"Gv" = (
+/obj/machinery/door/airlock{
+ name = "Kitchen Cold Room"
},
-/turf/open/floor/carpet{
+/obj/effect/mapping_helpers/airlock/access/all/away/maintenance,
+/turf/open/floor/iron/showroomfloor{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
"Gw" = (
-/obj/structure/filingcabinet/chestdrawer,
-/obj/machinery/light/small/broken/directional/north,
-/obj/machinery/airalarm/directional/north{
- req_access = null
- },
-/obj/effect/mapping_helpers/airalarm/unlocked,
-/obj/item/paper/fluff/awaymissions/moonoutpost19/log/gerald,
-/turf/open/floor/iron/cafeteria{
- dir = 5
- },
-/area/awaymission/moonoutpost19/research)
-"Gx" = (
-/obj/machinery/door/firedoor,
-/obj/structure/extinguisher_cabinet/directional/south,
-/obj/effect/turf_decal/stripes/line{
+/obj/structure/chair/comfy/black{
dir = 4
},
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"GG" = (
-/obj/structure/closet/crate/freezer,
-/obj/structure/alien/weeds,
-/obj/item/clothing/mask/facehugger/impregnated,
-/obj/item/xenos_claw,
+/area/awaymission/moonoutpost19/arrivals)
+"Gy" = (
+/obj/machinery/mineral/processing_unit_console,
+/turf/closed/wall,
+/area/awaymission/moonoutpost19/syndicate)
+"GE" = (
+/obj/effect/mapping_helpers/airlock/locked,
+/obj/machinery/door/airlock{
+ density = 0;
+ icon_state = "open";
+ id_tag = "awaydorm4";
+ name = "Dorm 1";
+ opacity = 0
+ },
+/obj/effect/mapping_helpers/atom_injector/obj_flag{
+ inject_flags = 1;
+ target_type = /obj/machinery/door/airlock
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"GS" = (
+/obj/machinery/light/small/broken/directional/east,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"GJ" = (
-/obj/structure/sign/poster/official/nanotrasen_logo/directional/south,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/iron/white/corner{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"GS" = (
+"GV" = (
/obj/item/stack/rods,
/obj/structure/grille/broken,
/obj/item/stack/rods,
@@ -4074,73 +4121,83 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/arrivals)
-"GX" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/spawner/structure/window/reinforced,
+"Hd" = (
+/obj/structure/sink/directional/east,
+/turf/open/floor/iron/white,
+/area/awaymission/moonoutpost19/research)
+"Hh" = (
+/obj/structure/cable,
+/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"Hb" = (
-/obj/machinery/door/airlock/engineering{
- name = "Power Maintenance"
- },
-/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
-/obj/structure/cable,
+/area/awaymission/moonoutpost19/research)
+"Hl" = (
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"Hf" = (
-/turf/open/floor/iron/showroomfloor{
- heat_capacity = 1e+006;
- temperature = 273.15
- },
/area/awaymission/moonoutpost19/arrivals)
-"Hl" = (
-/turf/open/floor/plating{
+"Hr" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/door/firedoor/closed,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Ho" = (
-/obj/machinery/light/small/directional/south,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+"Hu" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = -2;
+ pixel_y = -1
+ },
+/obj/item/multitool,
+/obj/effect/turf_decal/tile/blue/half/contrasted,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Hz" = (
+"Hy" = (
+/obj/machinery/light/directional/east,
+/obj/machinery/airalarm/directional/east{
+ pixel_x = 23;
+ req_access = list("syndicate")
+ },
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/wood{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"HB" = (
-/obj/structure/closet/secure_closet{
- locked = 0;
- name = "kitchen Cabinet";
- req_access = list("away_maintenance")
+"HA" = (
+/turf/open/floor/iron/dark{
+ heat_capacity = 1e+006
},
-/obj/item/reagent_containers/condiment/flour,
-/obj/item/reagent_containers/condiment/flour,
-/obj/item/reagent_containers/condiment/sugar,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/showroomfloor{
- heat_capacity = 1e+006;
- temperature = 273.15
+/area/awaymission/moonoutpost19/syndicate)
+"HG" = (
+/obj/structure/chair/office,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"HD" = (
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/stripes/line{
+/area/awaymission/moonoutpost19/research)
+"HI" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
+/obj/structure/chair/office/light{
dir = 4
},
/obj/structure/cable,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
+/turf/open/floor/iron/white,
/area/awaymission/moonoutpost19/research)
+"HK" = (
+/obj/structure/table,
+/obj/item/storage/box/donkpockets{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/turf/open/floor/iron/cafeteria{
+ dir = 5
+ },
+/area/awaymission/moonoutpost19/arrivals)
"HQ" = (
/obj/effect/decal/cleanable/robot_debris,
/obj/effect/decal/cleanable/oil,
@@ -4161,198 +4218,114 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"HU" = (
-/obj/machinery/door/airlock{
- name = "Unisex Restrooms"
- },
-/turf/open/floor/iron/freezer{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
"HW" = (
-/obj/item/stack/rods,
-/obj/item/shard{
- icon_state = "small"
- },
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/main)
-"HZ" = (
-/obj/structure/chair/office/light{
- dir = 1;
- pixel_y = 3
- },
-/turf/open/floor/iron/cafeteria{
- dir = 5
- },
-/area/awaymission/moonoutpost19/research)
-"Id" = (
-/obj/machinery/portable_atmospherics/scrubber,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"Ik" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = 1;
- pixel_y = 9
- },
+/obj/structure/table/wood,
/obj/item/pen,
-/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"Ip" = (
-/obj/item/soap/nanotrasen,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/iron/freezer{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"Iy" = (
-/obj/structure/closet/secure_closet/personal/cabinet{
- locked = 0;
- req_access = list("syndicate")
- },
-/obj/item/stack/spacecash/c50,
+/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal_2,
+/obj/structure/sign/poster/contraband/c20r/directional/south,
/turf/open/floor/wood{
- heat_capacity = 1e+006
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/syndicate)
-"Iz" = (
-/obj/machinery/power/apc/worn_out,
-/obj/effect/mapping_helpers/apc/full_charge,
-/obj/effect/mapping_helpers/apc/unlocked,
-/obj/effect/mapping_helpers/apc/cell_10k,
-/obj/structure/cable,
+"Ib" = (
+/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"IF" = (
-/obj/structure/alien/weeds,
-/obj/structure/alien/egg,
+"Im" = (
+/obj/structure/alien/weeds/node,
/turf/open/misc/asteroid{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/hive)
-"IK" = (
-/obj/machinery/power/port_gen/pacman/super{
- name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator"
- },
-/obj/structure/cable,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"IN" = (
-/obj/structure/alien/weeds,
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/purple,
-/turf/open/floor/iron/white{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"IQ" = (
-/obj/machinery/door/airlock/external/ruin,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+/area/awaymission/moonoutpost19/main)
+"Ip" = (
+/obj/structure/filingcabinet,
+/obj/item/paper/fluff/awaymissions/moonoutpost19/log/kenneth,
+/obj/effect/turf_decal/tile/red/anticorner/contrasted{
dir = 1
},
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"IR" = (
-/obj/machinery/atmospherics/components/unary/portables_connector{
- dir = 4
- },
-/obj/machinery/portable_atmospherics/canister,
-/obj/structure/alien/weeds,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"IW" = (
+"Is" = (
/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/door/airlock/public/glass{
+/obj/machinery/door/airlock/external/ruin{
density = 0;
icon_state = "open";
- name = "Dormitories"
+ opacity = 0
},
/obj/effect/mapping_helpers/atom_injector/obj_flag{
inject_flags = 1;
target_type = /obj/machinery/door/airlock
},
-/obj/item/stack/rods,
-/obj/item/shard{
- icon_state = "small"
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
},
-/turf/open/floor/iron{
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"IZ" = (
-/obj/structure/table/wood,
-/obj/item/lighter,
-/obj/machinery/newscaster/directional/east,
-/turf/open/floor/carpet{
+"Iw" = (
+/obj/machinery/shower/directional/south,
+/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Jb" = (
-/obj/structure/cable,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
+"Ix" = (
+/obj/structure/alien/weeds/node,
+/obj/structure/alien/resin/wall,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/research)
-"Jc" = (
-/obj/machinery/power/apc/worn_out,
-/obj/effect/mapping_helpers/apc/full_charge,
-/obj/effect/mapping_helpers/apc/unlocked,
-/obj/effect/mapping_helpers/apc/cell_10k,
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/purple,
-/turf/open/floor/iron/white{
- heat_capacity = 1e+006
+/area/awaymission/moonoutpost19/hive)
+"IL" = (
+/obj/item/stack/ore/iron{
+ pixel_x = 7;
+ pixel_y = -6
},
-/area/awaymission/moonoutpost19/research)
-"Jj" = (
-/obj/machinery/light/small/directional/north,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/main)
+"IP" = (
+/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
/turf/open/floor/iron{
- heat_capacity = 1e+006
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"Jm" = (
-/obj/structure/closet/emcloset,
-/obj/structure/window/spawner/directional/south,
+"IW" = (
+/obj/effect/decal/cleanable/oil,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"Jo" = (
-/obj/machinery/conveyor_switch/oneway{
- id = "awaysyndie";
- layer = 3.1;
- name = "mining conveyor"
+/area/awaymission/moonoutpost19/research)
+"Ja" = (
+/obj/structure/alien/weeds/node,
+/obj/structure/alien/resin/wall,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/obj/effect/turf_decal/stripes/line{
+/area/awaymission/moonoutpost19/main)
+"Jc" = (
+/obj/machinery/light/small/directional/west,
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/turf/open/floor/iron{
@@ -4360,96 +4333,103 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
-/area/awaymission/moonoutpost19/syndicate)
-"Jq" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
+/area/awaymission/moonoutpost19/arrivals)
+"Jm" = (
+/obj/structure/closet/emcloset,
+/obj/structure/window/spawner/directional/south,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"Jt" = (
-/obj/machinery/firealarm/directional/east,
-/obj/structure/alien/weeds,
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/purple,
-/turf/open/floor/iron/white{
+/area/awaymission/moonoutpost19/arrivals)
+"Jq" = (
+/turf/open/floor/wood{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"JD" = (
-/obj/item/cigbutt,
-/turf/open/floor/plating{
+/area/awaymission/moonoutpost19/syndicate)
+"Jt" = (
+/obj/structure/table,
+/obj/item/plate,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"JF" = (
+"JD" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 4
+ },
/turf/open/floor/iron{
- heat_capacity = 1e+006
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"JE" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
},
-/area/awaymission/moonoutpost19/syndicate)
-"JH" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/red,
/turf/open/floor/iron/dark{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"JS" = (
-/obj/structure/grille/broken,
-/obj/item/stack/rods,
-/obj/item/stack/rods,
-/obj/item/shard,
+"JH" = (
+/obj/machinery/light/small/directional/north,
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/turf_decal/stripes/asteroid/line{
+ dir = 6
+ },
/turf/open/floor/plating{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"JJ" = (
+/obj/structure/noticeboard/directional/south,
+/obj/machinery/light/small/broken/directional/south,
+/obj/item/paper/fluff/awaymissions/moonoutpost19/research/evacuation,
+/obj/machinery/camera/directional/south{
+ c_tag = "Research Division";
+ network = list("mo19","mo19r")
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"Kk" = (
-/obj/structure/chair/stool/directional/south,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
+"JL" = (
+/turf/open/floor/iron/white/corner{
+ dir = 8;
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
"Km" = (
-/obj/item/newspaper,
-/obj/structure/cable,
-/turf/open/floor/plating{
+/obj/structure/table,
+/turf/open/floor/iron/white/side{
+ dir = 8;
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"Kn" = (
-/obj/structure/chair{
- dir = 8
+"Ko" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
},
-/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
"Kp" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/iron{
+/obj/item/trash/candy,
+/turf/open/misc/asteroid{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
- },
-/area/awaymission/moonoutpost19/arrivals)
-"Kq" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/obj/machinery/airalarm/directional/north{
- pixel_y = 23;
- req_access = list("syndicate")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/syndicate)
+/area/awaymission/moonoutpost19/main)
"Ku" = (
/obj/structure/alien/weeds/node,
/mob/living/basic/alien,
@@ -4458,185 +4438,219 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/hive)
-"Kw" = (
-/obj/structure/chair,
-/turf/open/floor/iron/cafeteria{
- dir = 5
- },
-/area/awaymission/moonoutpost19/research)
-"Kz" = (
-/obj/structure/closet/secure_closet{
- icon_state = "science";
- locked = 0;
- name = "scientist's locker";
- req_access = list("away_maintenance")
- },
-/obj/item/clothing/suit/toggle/labcoat,
+"KF" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"KK" = (
-/obj/structure/table,
-/turf/open/floor/iron/white/side{
- dir = 8;
+/area/awaymission/moonoutpost19/syndicate)
+"KJ" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"KN" = (
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/door/airlock{
- density = 0;
- icon_state = "open";
- id_tag = "awaydorm4";
- name = "Dorm 1";
- opacity = 0
- },
-/obj/effect/mapping_helpers/atom_injector/obj_flag{
- inject_flags = 1;
- target_type = /obj/machinery/door/airlock
+/area/awaymission/moonoutpost19/syndicate)
+"KO" = (
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 8
},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/wood{
+/turf/open/floor/iron{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"KW" = (
-/obj/machinery/washing_machine,
-/obj/effect/turf_decal/tile/blue/opposingcorners{
- dir = 1
+"Lb" = (
+/obj/structure/closet/emcloset,
+/obj/effect/turf_decal/tile/blue/half/contrasted,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
-/turf/open/floor/iron/cafeteria{
+/area/awaymission/moonoutpost19/arrivals)
+"Ld" = (
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
-/area/awaymission/moonoutpost19/arrivals)
-"KZ" = (
-/obj/machinery/door/airlock{
- id_tag = "awaydorm5";
- name = "Dorm 2"
+/area/awaymission/moonoutpost19/syndicate)
+"Lo" = (
+/obj/structure/chair{
+ dir = 1
},
-/turf/open/floor/wood{
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"Ld" = (
-/obj/structure/table/reinforced,
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/machinery/button/door{
- id = "Awaybiohazard";
- name = "Biohazard Shutter Control";
- pixel_y = 8;
- req_access = list("away_maintenance")
+/area/awaymission/moonoutpost19/research)
+"Lp" = (
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
},
-/obj/machinery/button/door{
- id = "AwayRD";
- name = "Privacy Shutter Control";
- pixel_y = -2;
- req_access = list("away_maintenance")
+/area/awaymission/moonoutpost19/syndicate)
+"LI" = (
+/obj/machinery/atmospherics/components/unary/portables_connector{
+ dir = 4
},
-/turf/open/floor/iron/cafeteria{
- dir = 5
+/obj/machinery/portable_atmospherics/canister,
+/obj/structure/alien/weeds,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"Lh" = (
-/obj/structure/window/reinforced/spawner/directional/north,
+"LJ" = (
+/obj/structure/table/wood,
+/obj/item/lighter,
+/obj/machinery/newscaster/directional/east,
+/turf/open/floor/carpet{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"LQ" = (
/obj/structure/table,
-/obj/item/storage/medkit/regular,
+/obj/machinery/computer/security/telescreen/entertainment/directional/east,
+/obj/item/plate,
+/obj/item/cigbutt,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"LY" = (
+/obj/structure/table,
+/obj/machinery/microwave{
+ pixel_x = -3;
+ pixel_y = 6
+ },
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/iron{
+ dir = 8;
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"Mb" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
+/obj/structure/cable,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
},
+/area/awaymission/moonoutpost19/research)
+"Me" = (
+/obj/effect/mapping_helpers/airlock/locked,
+/obj/machinery/door/airlock/highsecurity{
+ name = "Gateway"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/obj/structure/cable,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"Lq" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/turf_decal/stripes/asteroid/line{
- dir = 4
+"Mg" = (
+/obj/structure/closet/secure_closet/personal/cabinet{
+ locked = 0;
+ req_access = list("away_maintenance")
},
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+/obj/item/clothing/under/suit/burgundy,
+/turf/open/floor/carpet{
+ heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/main)
-"Lr" = (
-/obj/effect/turf_decal/tile/red/anticorner/contrasted{
- dir = 8
+/area/awaymission/moonoutpost19/arrivals)
+"Mm" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
},
+/area/awaymission/moonoutpost19/research)
+"Mp" = (
+/obj/structure/closet/crate/bin,
+/obj/machinery/light/small/directional/west,
+/obj/item/trash/cheesie,
+/obj/item/trash/can,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"Ms" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark{
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"Lv" = (
-/obj/structure/alien/weeds,
-/obj/structure/alien/egg/burst,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+"Mt" = (
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/area/awaymission/moonoutpost19/hive)
-"LF" = (
-/obj/machinery/space_heater,
-/obj/machinery/light/small/directional/north,
-/obj/structure/sign/poster/official/build/directional/north,
/obj/structure/cable,
-/turf/open/floor/plating{
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"LG" = (
-/obj/structure/sink/directional/west,
-/obj/structure/mirror/directional/east{
- icon_state = "mirror_broke"
+"Mw" = (
+/obj/machinery/gateway/away{
+ calibrated = 0
},
-/turf/open/floor/iron/freezer{
+/obj/structure/cable,
+/turf/open/floor/iron/dark{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"LI" = (
-/obj/machinery/airalarm/directional/west{
- req_access = null
+/area/awaymission/moonoutpost19/syndicate)
+"Mx" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/red/anticorner/contrasted{
+ dir = 8
},
-/obj/effect/mapping_helpers/airalarm/unlocked,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/iron/freezer{
+/turf/open/floor/iron/dark{
heat_capacity = 1e+006
},
+/area/awaymission/moonoutpost19/syndicate)
+"MI" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
/area/awaymission/moonoutpost19/arrivals)
-"LM" = (
-/obj/structure/sign/warning/vacuum/directional/west{
- desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'";
- name = "\improper HOSTILE ATMOSPHERE AHEAD"
+"MJ" = (
+/obj/structure/table,
+/obj/item/trash/raisins,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
+/area/awaymission/moonoutpost19/arrivals)
+"MM" = (
+/obj/structure/grille,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"LR" = (
-/obj/effect/turf_decal/tile/red/half/contrasted{
- dir = 4
+"MN" = (
+/obj/structure/sign/poster/official/nanotrasen_logo/directional/south,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
},
-/turf/open/floor/iron{
+/turf/open/floor/iron/white/corner{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"MZ" = (
+/obj/structure/alien/weeds,
+/obj/structure/bed/nest,
+/turf/open/misc/asteroid{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/syndicate)
-"LY" = (
-/obj/structure/disposalpipe/segment,
+/area/awaymission/moonoutpost19/hive)
+"Na" = (
/obj/effect/turf_decal/sand/plating,
/obj/effect/turf_decal/stripes/asteroid/line{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/asteroid/line{
- dir = 8
+ dir = 9
},
/turf/open/floor/plating{
heat_capacity = 1e+006;
@@ -4644,149 +4658,184 @@
temperature = 251
},
/area/awaymission/moonoutpost19/main)
-"LZ" = (
-/obj/machinery/light/small/directional/west,
+"Nc" = (
/obj/structure/table,
-/obj/item/storage/box,
-/obj/machinery/airalarm/directional/west{
- req_access = null
- },
-/obj/effect/mapping_helpers/airalarm/unlocked,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
+/obj/item/clothing/gloves/latex,
+/obj/item/clothing/mask/surgical,
+/obj/item/clothing/suit/apron/surgical,
+/obj/structure/alien/weeds,
+/turf/open/floor/iron/white/side{
+ dir = 1;
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"Me" = (
+/area/awaymission/moonoutpost19/research)
+"Ne" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/cell/high,
/obj/item/radio/off,
-/obj/item/screwdriver{
- pixel_y = 10
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
},
-/obj/structure/sign/poster/official/safety_report/directional/north,
-/obj/effect/turf_decal/tile/red/anticorner/contrasted{
+/area/awaymission/moonoutpost19/research)
+"Nh" = (
+/obj/machinery/door/window{
+ dir = 1;
+ name = "Gateway Access";
+ req_access = list("syndicate")
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"Ni" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 4
},
/turf/open/floor/iron{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"Nk" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/iron/dark{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"Mj" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/closet/l3closet/scientist,
-/obj/structure/alien/weeds,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/area/awaymission/moonoutpost19/syndicate)
+"Nl" = (
+/turf/open/floor/iron/showroomfloor{
+ heat_capacity = 1e+006;
+ temperature = 273.15
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"Nr" = (
+/obj/machinery/door/poddoor/preopen{
+ desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating.";
+ id = "Awaylab";
+ name = "Acid-Proof Containment Chamber Blast Door"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
},
-/turf/open/floor/iron{
+/area/awaymission/moonoutpost19/research)
+"Nt" = (
+/obj/structure/closet/crate/bin,
+/obj/item/clothing/gloves/latex,
+/obj/item/trash/chips,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/small/broken/directional/north,
+/turf/open/floor/iron/white/side{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"Mn" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
+"NE" = (
+/obj/effect/turf_decal/tile/red/anticorner/contrasted,
/turf/open/floor/iron/dark{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"Mt" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/red/anticorner/contrasted{
- dir = 4
+"NH" = (
+/obj/structure/closet/secure_closet/personal/cabinet{
+ req_access = list("syndicate")
},
-/turf/open/floor/iron/dark{
- heat_capacity = 1e+006
+/obj/item/ammo_box/magazine/m9mm,
+/obj/item/ammo_box/magazine/m9mm,
+/obj/item/suppressor,
+/turf/open/floor/wood{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/syndicate)
-"Mz" = (
-/obj/structure/table,
-/obj/item/storage/box/donkpockets,
+"NJ" = (
+/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/xenoblood/xgibs,
/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"MA" = (
-/obj/structure/chair/stool/directional/west,
-/obj/machinery/computer/security/telescreen/entertainment/directional/north,
-/turf/open/floor/carpet{
- heat_capacity = 1e+006
- },
/area/awaymission/moonoutpost19/arrivals)
-"MC" = (
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- dir = 5;
- icon_state = "ltrails_1"
+"NM" = (
+/obj/machinery/light/small/directional/north,
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/turf_decal/stripes/asteroid/line{
+ dir = 10
},
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
+/turf/open/floor/plating{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
-/turf/open/floor/iron/white{
+/area/awaymission/moonoutpost19/arrivals)
+"NQ" = (
+/obj/structure/extinguisher_cabinet/directional/north,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"NW" = (
+/obj/structure/table,
+/obj/item/storage/box/gloves,
+/turf/open/floor/iron/white/corner{
+ dir = 8;
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"MI" = (
-/obj/effect/spawner/structure/window/reinforced,
+"Oa" = (
+/obj/structure/grille/broken,
+/obj/item/stack/rods,
+/obj/item/stack/rods,
+/obj/item/shard,
+/obj/structure/alien/weeds,
/turf/open/floor/plating{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/arrivals)
-"ML" = (
-/obj/structure/bed{
- dir = 4
- },
-/obj/item/bedsheet/syndie{
+/area/awaymission/moonoutpost19/syndicate)
+"Od" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/alien/weeds,
+/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 4
},
-/obj/machinery/button/door/directional/north{
- id = "awaydorm4";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- specialfunctions = 4
- },
-/turf/open/floor/wood{
+/turf/open/floor/iron{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"MN" = (
-/obj/machinery/vending/cola,
-/turf/open/floor/iron/dark,
-/area/awaymission/moonoutpost19/arrivals)
-"MP" = (
-/obj/structure/filingcabinet,
-/obj/item/paper/fluff/awaymissions/moonoutpost19/log/kenneth,
-/obj/effect/turf_decal/tile/red/anticorner/contrasted{
+"Oe" = (
+/obj/structure/chair{
dir = 1
},
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"MW" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"Nf" = (
-/obj/item/trash/candy,
+/area/awaymission/moonoutpost19/arrivals)
+"Og" = (
+/obj/structure/alien/weeds/node,
/turf/open/misc/asteroid{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/main)
-"Nl" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w{
- dir = 4
- },
-/obj/structure/cable,
-/turf/open/floor/iron/white,
-/area/awaymission/moonoutpost19/research)
-"Nw" = (
-/obj/structure/sign/warning/biohazard/directional/east,
+/area/awaymission/moonoutpost19/hive)
+"Oi" = (
+/obj/machinery/firealarm/directional/east,
/obj/structure/alien/weeds,
/obj/structure/cable,
/obj/effect/turf_decal/tile/purple,
@@ -4794,129 +4843,214 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"NK" = (
-/obj/machinery/atmospherics/components/binary/pump{
+"Om" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced/spawner/directional/west,
+/obj/machinery/button/door{
+ id = "Awaybiohazard";
+ name = "Biohazard Shutter Control";
+ pixel_y = 8;
+ req_access = list("away_maintenance")
+ },
+/obj/machinery/button/door{
+ id = "AwayRD";
+ name = "Privacy Shutter Control";
+ pixel_y = -2;
+ req_access = list("away_maintenance")
+ },
+/turf/open/floor/iron/cafeteria{
+ dir = 5
+ },
+/area/awaymission/moonoutpost19/research)
+"Oo" = (
+/obj/machinery/power/terminal{
dir = 4
},
-/turf/open/floor/iron/white/side{
- dir = 4;
+/obj/machinery/airalarm/directional/north{
+ req_access = null
+ },
+/obj/effect/mapping_helpers/airalarm/unlocked,
+/obj/structure/cable,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"NQ" = (
+"Op" = (
+/obj/structure/toilet{
+ dir = 1
+ },
+/turf/open/floor/iron/freezer{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"Or" = (
/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/purple/half/contrasted{
+ dir = 1
+ },
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"NV" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/window/spawner/directional/north,
-/turf/open/floor/plating{
+/area/awaymission/moonoutpost19/arrivals)
+"Ox" = (
+/obj/structure/urinal/directional/north,
+/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Oh" = (
+"Oy" = (
+/obj/structure/chair/stool/directional/west,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark{
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"Oj" = (
-/obj/effect/decal/cleanable/blood/splatter,
+"OA" = (
+/obj/structure/closet/crate,
+/obj/item/stack/sheet/glass{
+ amount = 10
+ },
+/obj/structure/alien/weeds,
+/obj/effect/turf_decal/bot{
+ dir = 1
+ },
/turf/open/floor/iron{
- heat_capacity = 1e+006
+ dir = 1;
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
-/area/awaymission/moonoutpost19/research)
-"Ok" = (
+/area/awaymission/moonoutpost19/syndicate)
+"OF" = (
+/obj/structure/window/reinforced/spawner/directional/north,
/obj/structure/table,
-/obj/item/book/manual/wiki/security_space_law,
-/obj/machinery/computer/security/telescreen/entertainment/directional/west,
-/obj/effect/turf_decal/tile/red/anticorner/contrasted{
- dir = 8
+/obj/item/paper_bin{
+ pixel_x = 1;
+ pixel_y = 9
+ },
+/obj/item/pen,
+/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
},
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"On" = (
+/area/awaymission/moonoutpost19/syndicate)
+"OL" = (
+/obj/machinery/washing_machine,
+/obj/effect/turf_decal/tile/blue/opposingcorners{
+ dir = 1
+ },
+/turf/open/floor/iron/cafeteria{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"ON" = (
/obj/machinery/shower/directional/west,
/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Oq" = (
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- dir = 6;
- icon_state = "ltrails_1"
- },
-/obj/effect/turf_decal/tile/purple{
+"OO" = (
+/obj/structure/sign/poster/contraband/syndicate_recruitment/directional/north,
+/obj/effect/turf_decal/loading_area{
dir = 8
},
-/turf/open/floor/iron/white{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"Oy" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/structure/alien/weeds,
/turf/open/floor/iron{
- heat_capacity = 1e+006
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"OC" = (
-/obj/item/kirbyplants{
- desc = "A plastic potted plant.";
- pixel_y = 3
- },
-/obj/effect/turf_decal/tile/neutral/half/contrasted,
+"OQ" = (
+/obj/machinery/door/firedoor/closed,
+/obj/structure/cable,
/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"OV" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/turf_decal/stripes/asteroid/line,
+/turf/open/floor/plating{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
+/area/awaymission/moonoutpost19/main)
+"OZ" = (
+/obj/structure/chair/stool/directional/west,
+/obj/machinery/computer/security/telescreen/entertainment/directional/north,
+/turf/open/floor/carpet{
+ heat_capacity = 1e+006
+ },
/area/awaymission/moonoutpost19/arrivals)
-"OL" = (
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- dir = 8;
- icon_state = "ltrails_1"
+"Pe" = (
+/obj/structure/rack,
+/obj/item/clothing/suit/space/syndicate/orange,
+/obj/item/clothing/mask/gas,
+/obj/item/pickaxe/drill,
+/obj/item/clothing/head/helmet/space/syndicate/orange,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron{
+/turf/open/floor/plating{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
-/area/awaymission/moonoutpost19/arrivals)
-"ON" = (
-/obj/structure/table,
-/obj/item/plate,
+/area/awaymission/moonoutpost19/syndicate)
+"Ph" = (
+/obj/structure/chair/stool/directional/west,
/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"OX" = (
-/obj/structure/chair/stool/directional/south,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
+/area/awaymission/moonoutpost19/syndicate)
+"Pi" = (
+/obj/structure/table,
+/obj/item/computer_disk/ordnance,
+/obj/item/computer_disk/ordnance,
+/obj/machinery/firealarm/directional/north,
+/turf/open/floor/iron/cafeteria{
+ dir = 5
},
/area/awaymission/moonoutpost19/research)
-"Pq" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+"Pj" = (
+/obj/structure/closet/secure_closet{
+ icon_state = "science";
+ locked = 0;
+ name = "scientist's locker";
+ req_access = list("away_maintenance")
},
+/obj/item/clothing/suit/toggle/labcoat,
/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
+"Pk" = (
+/obj/item/stack/ore/iron,
+/obj/item/stack/ore/iron{
+ pixel_x = -7;
+ pixel_y = -4
+ },
+/turf/open/misc/asteroid{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/syndicate)
+/area/awaymission/moonoutpost19/main)
+"Pr" = (
+/obj/structure/table,
+/obj/item/retractor,
+/obj/item/hemostat,
+/obj/structure/alien/weeds,
+/turf/open/floor/iron/white,
+/area/awaymission/moonoutpost19/research)
"Pv" = (
/obj/structure/alien/weeds,
/mob/living/basic/alien/sentinel,
@@ -4925,153 +5059,216 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/hive)
-"PJ" = (
-/obj/machinery/light/directional/east,
-/turf/open/floor/iron/dark{
+"PA" = (
+/obj/structure/sign/warning/biohazard/directional/east,
+/obj/structure/alien/weeds,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/purple,
+/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"PQ" = (
-/obj/structure/grille/broken,
-/obj/item/stack/rods,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating{
+/area/awaymission/moonoutpost19/research)
+"PB" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ dir = 8;
+ icon_state = "ltrails_1"
+ },
+/obj/item/mining_scanner,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/main)
+"PC" = (
+/obj/structure/sign/warning/biohazard/directional/north,
+/obj/structure/alien/weeds/node,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/iron{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
-/area/awaymission/moonoutpost19/arrivals)
-"Qa" = (
-/obj/machinery/door/poddoor{
- id = "AwayRD";
- layer = 2.9;
- name = "Privacy Shutter"
+/area/awaymission/moonoutpost19/syndicate)
+"PD" = (
+/turf/open/floor/iron/white{
+ heat_capacity = 1e+006
},
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating{
+/area/awaymission/moonoutpost19/research)
+"PE" = (
+/obj/structure/table,
+/obj/item/paper_bin{
+ pixel_x = 1;
+ pixel_y = 9
+ },
+/obj/item/pen,
+/obj/effect/turf_decal/tile/red/anticorner/contrasted,
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"Qe" = (
-/obj/machinery/light/directional/east,
-/obj/machinery/airalarm/directional/east{
- pixel_x = 23;
- req_access = list("syndicate")
+"PJ" = (
+/obj/machinery/door/airlock{
+ name = "Unit 2"
},
+/turf/open/floor/iron/freezer{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"PL" = (
+/obj/structure/closet/l3closet,
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron{
+/turf/open/floor/iron/white/side{
+ dir = 1;
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"Qh" = (
-/obj/machinery/button/door/directional/west{
- id = "awaydorm1";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- specialfunctions = 4
+/area/awaymission/moonoutpost19/research)
+"PN" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/obj/machinery/airalarm/directional/north{
+ pixel_y = 23;
+ req_access = list("syndicate")
},
-/turf/open/floor/carpet{
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
+/area/awaymission/moonoutpost19/syndicate)
+"PR" = (
+/obj/effect/decal/cleanable/generic,
+/obj/effect/decal/remains/human{
+ desc = "They look like human remains. The skeleton is curled up in fetal position with the hands placed near the throat."
+ },
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/iron{
+ dir = 8;
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
/area/awaymission/moonoutpost19/arrivals)
-"Qj" = (
-/obj/machinery/light/small/directional/east,
-/turf/open/misc/asteroid{
+"PV" = (
+/obj/machinery/space_heater,
+/obj/machinery/light/small/directional/north,
+/obj/structure/sign/poster/official/build/directional/north,
+/obj/structure/cable,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
+"PZ" = (
+/obj/structure/chair/comfy/black,
+/turf/open/floor/plating{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/arrivals)
-"Qk" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/blue/half/contrasted,
+"Qa" = (
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Qq" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating{
+"Qg" = (
+/obj/structure/sink/directional/west,
+/obj/structure/urinal/directional/north,
+/obj/structure/mirror/directional/east,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
+"Qh" = (
+/obj/structure/chair/office/light{
+ dir = 1;
+ pixel_y = 3
+ },
+/turf/open/floor/iron/cafeteria{
+ dir = 5
+ },
+/area/awaymission/moonoutpost19/research)
+"Qu" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/iron/white,
+/area/awaymission/moonoutpost19/research)
"Qx" = (
/obj/effect/landmark/awaystart,
/turf/open/floor/mineral/titanium/blue,
/area/awaymission/moonoutpost19/arrivals)
-"Qy" = (
-/obj/machinery/door/airlock{
- id_tag = "awaydorm1";
- name = "Dorm 1"
- },
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
"Qz" = (
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- dir = 6;
- icon_state = "ltrails_1"
+/obj/machinery/mineral/unloading_machine{
+ dir = 1;
+ icon_state = "unloader-corner";
+ input_dir = 4;
+ output_dir = 8
},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron{
+/obj/structure/alien/weeds,
+/turf/open/floor/plating{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
-/area/awaymission/moonoutpost19/arrivals)
+/area/awaymission/moonoutpost19/syndicate)
"QA" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor,
-/obj/item/reagent_containers/cup/rag{
- pixel_y = 5
- },
-/obj/machinery/door/poddoor/shutters{
- id = "awaykitchen";
- name = "Serving Hatch"
+/obj/machinery/light/broken/directional/east,
+/obj/machinery/airalarm/directional/east{
+ req_access = null
},
-/turf/open/floor/carpet{
+/obj/effect/mapping_helpers/airalarm/unlocked,
+/obj/effect/turf_decal/tile/purple,
+/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
+/area/awaymission/moonoutpost19/research)
"QC" = (
-/obj/structure/table/reinforced,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/shutters{
- id = "awaykitchen";
- name = "Serving Hatch"
- },
-/turf/open/floor/carpet{
- heat_capacity = 1e+006
+/obj/machinery/power/port_gen/pacman{
+ name = "P.A.C.M.A.N.-type portable generator"
},
-/area/awaymission/moonoutpost19/arrivals)
-"QJ" = (
+/obj/effect/turf_decal/stripes/line,
/obj/structure/cable,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"QO" = (
-/obj/effect/decal/cleanable/generic,
-/obj/effect/decal/remains/human{
- desc = "They look like human remains. The skeleton is curled up in fetal position with the hands placed near the throat."
+/area/awaymission/moonoutpost19/syndicate)
+"QO" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/egg/burst,
+/obj/effect/decal/cleanable/blood,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/hive)
+"QP" = (
+/obj/structure/grille/broken,
+/obj/item/stack/rods,
+/obj/item/shard,
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ dir = 8;
+ icon_state = "ltrails_2"
},
/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/iron{
- dir = 8;
+/turf/open/floor/plating{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"QP" = (
-/obj/effect/decal/cleanable/dirt,
+"QU" = (
+/obj/structure/alien/weeds,
+/obj/effect/turf_decal/tile/red/anticorner/contrasted,
/turf/open/floor/iron{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
-/area/awaymission/moonoutpost19/arrivals)
+/area/awaymission/moonoutpost19/syndicate)
"QW" = (
/obj/structure/table,
/obj/item/folder/red,
@@ -5080,6 +5277,16 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
+"QY" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/iron{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
+/area/awaymission/moonoutpost19/syndicate)
"QZ" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -5090,39 +5297,46 @@
temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"Ra" = (
-/obj/structure/disposalpipe/segment{
- desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating.";
- dir = 4;
- name = "Acid-Proof disposal pipe"
- },
-/obj/machinery/door/poddoor/preopen{
- desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating.";
- id = "Awaylab";
- name = "Acid-Proof Containment Chamber Blast Door"
- },
-/obj/effect/spawner/structure/window/reinforced,
+"Rc" = (
+/obj/machinery/power/apc/worn_out,
+/obj/effect/mapping_helpers/apc/full_charge,
+/obj/effect/mapping_helpers/apc/unlocked,
+/obj/effect/mapping_helpers/apc/cell_10k,
/obj/structure/cable,
-/turf/open/floor/plating{
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"Re" = (
-/obj/structure/alien/weeds,
-/obj/structure/bed/nest,
-/obj/effect/decal/cleanable/blood/gibs,
-/obj/item/clothing/mask/facehugger/impregnated,
-/obj/item/gun/ballistic/automatic/pistol,
-/turf/open/misc/asteroid{
+/area/awaymission/moonoutpost19/arrivals)
+"Rd" = (
+/obj/structure/closet/secure_closet{
+ locked = 0;
+ name = "kitchen Cabinet";
+ req_access = list("away_maintenance")
+ },
+/obj/item/reagent_containers/condiment/flour,
+/obj/item/reagent_containers/condiment/flour,
+/obj/item/reagent_containers/condiment/sugar,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/showroomfloor{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ temperature = 273.15
},
-/area/awaymission/moonoutpost19/hive)
-"Rk" = (
-/obj/structure/table/optable,
+/area/awaymission/moonoutpost19/arrivals)
+"Re" = (
+/obj/structure/table,
+/obj/item/kitchen/rollingpin,
+/obj/item/knife/kitchen,
+/turf/open/floor/iron/cafeteria{
+ dir = 5
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"Rh" = (
+/obj/effect/decal/cleanable/dirt,
/obj/structure/alien/weeds,
-/turf/open/floor/iron/white/side{
- dir = 1;
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
@@ -5132,100 +5346,74 @@
},
/turf/open/floor/iron/dark,
/area/awaymission/moonoutpost19/arrivals)
-"Rn" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/syndicate)
-"Rr" = (
-/obj/machinery/space_heater,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"Rv" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+"Rp" = (
+/obj/structure/chair{
+ dir = 8
},
+/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"RH" = (
+/area/awaymission/moonoutpost19/arrivals)
+"Rs" = (
+/obj/structure/window/reinforced/spawner/directional/north,
/obj/structure/table,
-/obj/machinery/microwave{
- pixel_x = -3;
- pixel_y = 6
+/obj/machinery/recharger{
+ pixel_y = 4
},
-/obj/machinery/light/small/directional/east,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/syndicate)
-"RK" = (
+"RI" = (
/obj/structure/closet/secure_closet/personal/cabinet{
- req_access = list("syndicate")
- },
-/obj/item/ammo_box/magazine/m9mm,
-/obj/item/ammo_box/magazine/m9mm,
-/obj/item/suppressor,
-/turf/open/floor/wood{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ locked = 0;
+ req_access = list("away_maintenance")
},
-/area/awaymission/moonoutpost19/syndicate)
-"RZ" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating{
+/obj/item/clothing/under/suit/navy,
+/turf/open/floor/carpet{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"Sb" = (
+/area/awaymission/moonoutpost19/arrivals)
+"RP" = (
+/obj/structure/closet/crate,
+/obj/item/stack/sheet/iron{
+ amount = 12
+ },
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/red/half/contrasted{
- dir = 8
+/obj/structure/alien/weeds,
+/obj/effect/turf_decal/bot{
+ dir = 1
},
/turf/open/floor/iron{
+ dir = 1;
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"Sc" = (
-/obj/structure/table,
-/obj/item/book/manual/wiki/detective,
-/obj/effect/decal/cleanable/dirt,
+"RQ" = (
+/obj/structure/closet/l3closet,
+/obj/effect/turf_decal/tile/red/half/contrasted,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"Sj" = (
-/obj/machinery/door/airlock{
- name = "Private Restroom"
- },
-/turf/open/floor/iron/freezer{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
+/area/awaymission/moonoutpost19/syndicate)
"So" = (
+/obj/machinery/light/small/directional/south,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/purple/half/contrasted{
- dir = 1
- },
+/obj/structure/cable,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
+"Ss" = (
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/syndicate)
"Sw" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
@@ -5249,107 +5437,42 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Sy" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/red/anticorner/contrasted{
- dir = 8
- },
-/turf/open/floor/iron/dark{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"SC" = (
-/obj/structure/table,
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/structure/alien/weeds,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/iron/white{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"SF" = (
-/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/syndicate)
-"SJ" = (
-/obj/structure/table,
-/obj/machinery/cell_charger,
+"SD" = (
+/obj/item/soap/nanotrasen,
/obj/machinery/light/small/directional/west,
-/obj/item/stock_parts/cell/high,
-/obj/item/paper/fluff/awaymissions/moonoutpost19/engineering,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable,
-/turf/open/floor/plating{
+/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
+/area/awaymission/moonoutpost19/arrivals)
"SK" = (
-/obj/structure/sign/warning/vacuum/directional/north{
- desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'";
- name = "\improper HOSTILE ATMOSPHERE AHEAD"
+/obj/structure/closet/crate{
+ desc = "It's a storage unit for kitchen clothes and equipment.";
+ name = "Kitchen Crate"
},
-/turf/open/floor/plating{
- heat_capacity = 1e+006
+/obj/item/storage/box/mousetraps,
+/obj/item/clothing/under/suit/waiter,
+/turf/open/floor/iron/showroomfloor{
+ heat_capacity = 1e+006;
+ temperature = 273.15
},
/area/awaymission/moonoutpost19/arrivals)
-"SL" = (
-/obj/machinery/power/port_gen/pacman{
- name = "P.A.C.M.A.N.-type portable generator"
+"SM" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/turf_decal/stripes/asteroid/line{
+ dir = 4
},
-/obj/structure/cable,
/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"SP" = (
-/obj/machinery/light/broken/directional/south,
-/obj/structure/alien/weeds,
-/obj/machinery/camera/directional/south{
- c_tag = "Xenobiology Containment South";
- network = list("mo19x")
- },
-/turf/open/floor/engine,
-/area/awaymission/moonoutpost19/research)
-"SR" = (
-/obj/structure/alien/weeds,
-/obj/structure/bed/nest,
-/obj/effect/decal/cleanable/blood/gibs,
-/obj/item/clothing/mask/facehugger/impregnated,
-/obj/item/clothing/under/rank/security/officer,
-/obj/item/clothing/suit/armor/vest,
-/obj/item/melee/baton/security/loaded,
-/obj/item/clothing/head/helmet,
-/turf/open/misc/asteroid{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/hive)
-"SW" = (
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
-/area/awaymission/moonoutpost19/arrivals)
-"SY" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
+/area/awaymission/moonoutpost19/main)
+"Tb" = (
+/obj/machinery/door/airlock/external/ruin,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
},
-/area/awaymission/moonoutpost19/research)
-"Tg" = (
-/obj/structure/table,
-/obj/item/trash/raisins,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
@@ -5361,17 +5484,18 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"Tn" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock{
- name = "Kitchen"
+"Tl" = (
+/obj/item/stack/ore/iron{
+ pixel_x = -7;
+ pixel_y = -4
},
-/obj/effect/mapping_helpers/airlock/access/all/away/maintenance,
-/turf/open/floor/iron/dark,
-/area/awaymission/moonoutpost19/arrivals)
-"Ts" = (
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/main)
+"Tp" = (
/obj/machinery/power/smes{
- charge = 1.5e+006;
input_level = 10000;
inputting = 0;
output_level = 15000
@@ -5380,49 +5504,57 @@
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"Tx" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"TE" = (
-/obj/machinery/computer/operating{
- dir = 8
- },
-/obj/structure/alien/weeds,
-/turf/open/floor/iron/white/side{
- dir = 1;
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"TH" = (
-/obj/structure/cable,
+/area/awaymission/moonoutpost19/syndicate)
+"Tq" = (
+/obj/machinery/firealarm/directional/east,
/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating{
+/turf/open/floor/iron{
+ dir = 8;
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"TL" = (
-/obj/effect/mapping_helpers/broken_floor,
+"Tt" = (
+/obj/machinery/vending/coffee,
+/turf/open/floor/iron/dark,
+/area/awaymission/moonoutpost19/arrivals)
+"Ty" = (
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/syndicate)
-"TR" = (
+"TG" = (
+/obj/structure/table/reinforced,
+/obj/item/paper_bin{
+ pixel_x = 1;
+ pixel_y = 9
+ },
+/turf/open/floor/iron/cafeteria{
+ dir = 5
+ },
+/area/awaymission/moonoutpost19/research)
+"TK" = (
+/obj/structure/toilet{
+ dir = 4
+ },
/obj/machinery/light/small/directional/north,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron{
+/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
+"TL" = (
+/turf/open/floor/iron{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/syndicate)
+"TX" = (
+/obj/machinery/vending/cola,
+/turf/open/floor/iron/dark,
+/area/awaymission/moonoutpost19/arrivals)
"Ud" = (
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron{
@@ -5432,14 +5564,14 @@
},
/area/awaymission/moonoutpost19/arrivals)
"Uf" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/turf_decal/stripes/asteroid/line,
+/obj/machinery/computer/monitor{
+ dir = 1
+ },
+/obj/structure/cable,
/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/main)
+/area/awaymission/moonoutpost19/research)
"Uh" = (
/obj/item/stack/rods,
/obj/item/shard{
@@ -5455,6 +5587,15 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/main)
+"Un" = (
+/obj/structure/grille/broken,
+/obj/item/stack/rods,
+/obj/item/stack/rods,
+/obj/item/shard,
+/turf/open/floor/plating{
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
"Us" = (
/obj/machinery/door/airlock/external/ruin,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -5471,247 +5612,241 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Uu" = (
-/obj/machinery/gateway/away{
- calibrated = 0
+"Uz" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 4
},
-/obj/structure/cable,
-/turf/open/floor/iron/dark{
+/turf/open/floor/iron/white/side{
+ dir = 4;
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"Uz" = (
-/obj/structure/bed{
- dir = 4
+/area/awaymission/moonoutpost19/research)
+"UC" = (
+/obj/structure/closet/crate/bin,
+/turf/open/floor/iron/cafeteria{
+ dir = 5
},
-/obj/item/bedsheet{
- dir = 4
+/area/awaymission/moonoutpost19/research)
+"UH" = (
+/obj/machinery/power/port_gen/pacman/super{
+ name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator"
},
-/turf/open/floor/carpet{
+/obj/structure/cable,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"UA" = (
-/obj/structure/table,
-/obj/machinery/computer/security/telescreen/entertainment/directional/east,
-/obj/item/plate,
-/obj/item/cigbutt,
+/area/awaymission/moonoutpost19/research)
+"US" = (
+/obj/machinery/light/small/directional/south,
/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
+/area/awaymission/moonoutpost19/arrivals)
+"UU" = (
+/obj/machinery/airalarm/directional/north{
+ req_access = list("syndicate")
+ },
+/obj/effect/mapping_helpers/airalarm/unlocked,
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/iron{
+ dir = 8;
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
+ },
/area/awaymission/moonoutpost19/syndicate)
-"UM" = (
+"UW" = (
/obj/machinery/door/airlock{
- name = "Unit 2"
+ id_tag = "awaydorm5";
+ name = "Dorm 2"
},
-/turf/open/floor/iron/freezer{
+/turf/open/floor/wood{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"UX" = (
-/obj/machinery/door/airlock/maintenance,
-/obj/effect/mapping_helpers/airlock/access/all/away/maintenance,
+/area/awaymission/moonoutpost19/syndicate)
+"UY" = (
+/obj/item/newspaper,
+/obj/structure/cable,
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"Vb" = (
-/obj/machinery/light/small/directional/west,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/sign/poster/contraband/space_cube/directional/west,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"Vh" = (
+/area/awaymission/moonoutpost19/research)
+"UZ" = (
/obj/structure/alien/weeds,
-/obj/structure/bed/nest,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/hive)
-"Vi" = (
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/purple,
+/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"Vr" = (
-/obj/structure/cable,
+/area/awaymission/moonoutpost19/research)
+"Vj" = (
+/obj/structure/chair,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Vu" = (
-/obj/structure/toilet{
- dir = 1
+"Vn" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/turf/open/floor/iron/freezer{
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"VC" = (
-/obj/effect/spawner/structure/window/reinforced,
+"Vo" = (
+/obj/structure/grille/broken,
+/obj/item/stack/rods,
+/obj/item/stack/rods,
+/obj/item/shard{
+ icon_state = "medium"
+ },
/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"VI" = (
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/door/airlock/highsecurity{
- name = "Gateway"
+/area/awaymission/moonoutpost19/research)
+"Vq" = (
+/obj/item/stack/ore/iron{
+ pixel_x = -3;
+ pixel_y = 9
},
-/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/main)
+"Vr" = (
/obj/structure/cable,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"VK" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/turf_decal/stripes/asteroid/line{
- dir = 6
- },
-/turf/open/floor/plating{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+/area/awaymission/moonoutpost19/arrivals)
+"Vt" = (
+/obj/structure/toilet{
+ dir = 4
},
-/area/awaymission/moonoutpost19/main)
-"VQ" = (
-/obj/machinery/light/small/directional/west,
-/obj/machinery/computer/security{
- desc = "Used to access the various cameras on the outpost.";
- dir = 4;
- network = list("mo19r","mo19")
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/iron/freezer{
+ heat_capacity = 1e+006
},
-/obj/machinery/button/door/directional/west{
- id = "Awaybiohazard";
- name = "Biohazard Shutter Control"
+/area/awaymission/moonoutpost19/arrivals)
+"Vy" = (
+/obj/structure/table,
+/obj/item/storage/medkit/fire,
+/obj/machinery/firealarm/directional/east,
+/turf/open/floor/iron/white/side{
+ dir = 8;
+ heat_capacity = 1e+006
},
-/obj/effect/mapping_helpers/airlock/access/all/admin/general,
-/obj/effect/turf_decal/tile/red/half/contrasted{
+/area/awaymission/moonoutpost19/research)
+"VD" = (
+/obj/structure/alien/weeds,
+/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/structure/cable,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"VR" = (
-/obj/machinery/shower/directional/south,
+"VF" = (
+/obj/machinery/light/small/directional/south,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/research)
+"VS" = (
+/obj/machinery/light/small/directional/north,
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/freezer{
+/obj/structure/cable,
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"VU" = (
-/obj/structure/sink/kitchen/directional/south{
- desc = "A sink used for washing one's hands and face. It looks rusty and home-made";
- name = "old sink"
- },
-/turf/open/floor/iron/showroomfloor{
+"VT" = (
+/obj/machinery/power/apc/worn_out,
+/obj/effect/mapping_helpers/apc/full_charge,
+/obj/effect/mapping_helpers/apc/unlocked,
+/obj/effect/mapping_helpers/apc/cell_10k,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/red/half/contrasted,
+/turf/open/floor/iron{
heat_capacity = 1e+006;
- temperature = 273.15
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
-/area/awaymission/moonoutpost19/arrivals)
+/area/awaymission/moonoutpost19/syndicate)
"Wd" = (
-/obj/structure/table,
-/obj/item/storage/box/gloves,
-/turf/open/floor/iron/white/corner{
- dir = 8;
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"Wj" = (
-/obj/machinery/light/small/directional/south,
-/obj/structure/closet/toolcloset,
-/obj/item/clothing/gloves/color/yellow,
-/turf/open/floor/plating{
+"Wp" = (
+/obj/machinery/light/directional/east,
+/turf/open/floor/iron/dark{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
+/area/awaymission/moonoutpost19/syndicate)
"Wq" = (
-/obj/structure/closet/secure_closet/freezer{
- locked = 0;
- name = "refrigerator";
- req_access = list("away_maintenance")
- },
-/obj/item/reagent_containers/condiment/milk,
-/obj/item/reagent_containers/condiment/milk,
-/obj/item/reagent_containers/condiment/milk,
-/obj/item/storage/fancy/egg_box,
-/turf/open/floor/iron/showroomfloor{
- heat_capacity = 1e+006;
- temperature = 273.15
- },
-/area/awaymission/moonoutpost19/arrivals)
-"Wt" = (
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- dir = 8;
- icon_state = "ltrails_2"
+/obj/machinery/conveyor_switch/oneway{
+ id = "awaysyndie";
+ layer = 3.1;
+ name = "mining conveyor"
},
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/area/awaymission/moonoutpost19/main)
-"WB" = (
-/obj/structure/cable,
/turf/open/floor/iron{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"WH" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/table,
-/obj/machinery/recharger{
- pixel_y = 4
+"Ws" = (
+/obj/machinery/newscaster/directional/south,
+/turf/open/floor/iron/cafeteria{
+ dir = 5
},
+/area/awaymission/moonoutpost19/research)
+"Wt" = (
+/obj/machinery/firealarm/directional/east,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
+/obj/machinery/camera/directional/east{
+ c_tag = "Bar";
+ network = list("mo19")
},
-/area/awaymission/moonoutpost19/syndicate)
-"WI" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/tile/blue/half/contrasted,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"WK" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/iron/white/corner{
- dir = 1;
+"WE" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"WN" = (
-/obj/structure/table,
-/obj/item/computer_disk/ordnance,
-/obj/item/computer_disk/ordnance,
-/obj/machinery/firealarm/directional/north,
-/turf/open/floor/iron/cafeteria{
- dir = 5
- },
/area/awaymission/moonoutpost19/research)
-"WO" = (
-/obj/machinery/light/small/directional/north,
+"WH" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
+/obj/machinery/door/firedoor/closed,
/turf/open/floor/iron{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
- temperature = 251
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/arrivals)
+"WM" = (
+/obj/machinery/door/airlock{
+ name = "Unisex Showers"
+ },
+/turf/open/floor/iron/freezer{
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
"WP" = (
@@ -5727,75 +5862,73 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/hive)
-"WR" = (
-/obj/machinery/light/small/broken/directional/west,
-/obj/machinery/camera/directional/west{
- c_tag = "Xenobiology";
- network = list("mo19","mo19r")
+"WW" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ desc = "Your instincts say you shouldn't be following these.";
+ dir = 8;
+ icon_state = "ltrails_2"
},
-/turf/open/floor/iron/white/side{
- dir = 6;
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
+ },
+/area/awaymission/moonoutpost19/main)
+"WX" = (
+/obj/machinery/door/airlock{
+ name = "Private Restroom"
+ },
+/turf/open/floor/iron/freezer{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"Xm" = (
-/obj/structure/chair/comfy/black{
- dir = 8
+"Xq" = (
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/structure/closet/secure_closet{
+ icon_state = "science";
+ name = "scientist's locker";
+ req_access = list("away_maintenance")
},
+/obj/item/clothing/suit/toggle/labcoat,
+/obj/item/tank/internals/oxygen,
+/obj/item/clothing/mask/gas,
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"Xo" = (
-/obj/structure/chair,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
+/area/awaymission/moonoutpost19/research)
+"Xv" = (
+/obj/machinery/space_heater,
+/obj/effect/decal/cleanable/generic,
+/obj/structure/window/spawner/directional/south,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"Xq" = (
-/obj/structure/alien/weeds,
+"Xz" = (
+/obj/structure/table,
+/turf/open/floor/iron/white/corner{
+ dir = 1;
+ heat_capacity = 1e+006
+ },
+/area/awaymission/moonoutpost19/research)
+"XG" = (
+/obj/structure/alien/weeds/node,
/obj/effect/turf_decal/stripes/line{
- dir = 8
+ dir = 1
},
-/obj/structure/cable,
-/turf/open/floor/iron{
+/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"Xv" = (
+"XH" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/red/half/contrasted,
-/turf/open/floor/iron{
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"Xx" = (
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- dir = 8;
- icon_state = "ltrails_1"
- },
-/obj/item/mining_scanner,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/main)
-"XB" = (
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/door/airlock/external/ruin{
- density = 0;
- icon_state = "open";
- opacity = 0
- },
-/obj/effect/mapping_helpers/atom_injector/obj_flag{
- inject_flags = 1;
- target_type = /obj/machinery/door/airlock
- },
-/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+/area/awaymission/moonoutpost19/research)
+"XJ" = (
+/obj/structure/disposaloutlet,
+/obj/structure/disposalpipe/trunk{
dir = 1
},
/obj/effect/turf_decal/sand/plating,
@@ -5804,181 +5937,112 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
-/area/awaymission/moonoutpost19/syndicate)
-"XF" = (
-/obj/machinery/firealarm/directional/north,
+/area/awaymission/moonoutpost19/main)
+"XX" = (
/obj/structure/table,
-/obj/item/storage/box/beakers{
- pixel_x = 2;
- pixel_y = 2
- },
-/obj/item/storage/box/syringes,
+/obj/item/mmi,
+/obj/item/mmi,
+/obj/item/mmi,
/obj/structure/alien/weeds,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/area/awaymission/moonoutpost19/research)
-"XG" = (
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating{
+/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"XP" = (
-/obj/structure/alien/weeds/node,
-/obj/structure/alien/resin/wall,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/hive)
-"XQ" = (
-/obj/structure/bed{
- dir = 4
- },
-/obj/item/bedsheet/syndie{
- dir = 4
- },
+"XZ" = (
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/wood{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
-"XT" = (
-/obj/structure/chair/stool/directional/west,
-/turf/open/floor/carpet{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"Yf" = (
-/obj/structure/alien/weeds,
-/obj/structure/alien/resin/wall,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/hive)
-"Yg" = (
-/obj/item/stack/ore/iron{
- pixel_x = 7;
- pixel_y = -6
- },
-/turf/open/misc/asteroid{
+/turf/open/floor/iron{
heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/main)
-"Yi" = (
-/obj/structure/sink/directional/west,
-/obj/structure/urinal/directional/north,
-/obj/structure/mirror/directional/east,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/freezer{
- heat_capacity = 1e+006
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
+ temperature = 251
},
/area/awaymission/moonoutpost19/arrivals)
-"Yj" = (
-/obj/machinery/light/small/directional/south,
-/obj/machinery/computer/security/telescreen/entertainment/directional/south,
-/obj/machinery/camera/directional/south{
- c_tag = "Arrivals North";
- network = list("mo19")
- },
-/obj/effect/turf_decal/tile/blue{
+"Yk" = (
+/obj/structure/alien/weeds/node,
+/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/iron/white/corner{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"Yu" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/red/half/contrasted{
- dir = 4
- },
/turf/open/floor/iron{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
/area/awaymission/moonoutpost19/syndicate)
-"Yz" = (
-/obj/item/stack/rods,
-/obj/item/shard{
- icon_state = "small"
- },
-/obj/effect/decal/cleanable/blood/tracks{
- desc = "Your instincts say you shouldn't be following these.";
- dir = 8;
- icon_state = "ltrails_1"
- },
-/obj/effect/turf_decal/tile/red/half/contrasted{
- dir = 4
+"Yt" = (
+/obj/structure/table,
+/obj/machinery/cell_charger,
+/obj/machinery/light/small/directional/west,
+/obj/item/stock_parts/cell/high,
+/obj/item/paper/fluff/awaymissions/moonoutpost19/engineering,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/turf/open/floor/iron{
+/obj/structure/cable,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/research)
-"YA" = (
+/area/awaymission/moonoutpost19/syndicate)
+"Yx" = (
+/obj/structure/table/optable,
/obj/structure/alien/weeds,
-/obj/structure/alien/egg/burst,
-/obj/effect/decal/cleanable/blood/gibs,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/hive)
-"YB" = (
-/obj/machinery/portable_atmospherics/scrubber,
-/turf/open/floor/plating{
+/turf/open/floor/iron/white/side{
+ dir = 1;
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"YC" = (
+"YE" = (
+/obj/item/cigbutt,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
+/obj/structure/cable,
/turf/open/floor/iron{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
-"YD" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = 1;
- pixel_y = 9
- },
-/obj/item/pen,
-/obj/effect/turf_decal/tile/red/anticorner/contrasted,
-/turf/open/floor/iron{
+"YH" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/generic,
+/turf/open/floor/plating{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
-"YH" = (
-/obj/structure/toilet{
- dir = 4
+"YM" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/firedoor,
+/obj/item/reagent_containers/condiment/peppermill{
+ pixel_x = 3
},
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/iron/freezer{
+/obj/item/reagent_containers/condiment/saltshaker{
+ pixel_x = -3
+ },
+/obj/machinery/door/poddoor/shutters{
+ id = "awaykitchen";
+ name = "Serving Hatch"
+ },
+/turf/open/floor/carpet{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
"YW" = (
-/obj/machinery/space_heater,
-/obj/effect/decal/cleanable/generic,
-/obj/structure/window/spawner/directional/south,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
+/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{
+ desc = "A one meter section of pipe. This one has been applied with an acid-proof coating.";
+ dir = 4;
+ name = "Acid-Proof Pipe"
},
-/area/awaymission/moonoutpost19/arrivals)
-"YZ" = (
-/obj/structure/cable,
-/turf/open/floor/iron/dark{
+/obj/item/stack/rods,
+/obj/item/stack/cable_coil{
+ amount = 5
+ },
+/obj/item/shard{
+ icon_state = "small"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/iron{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/syndicate)
-"Za" = (
-/obj/structure/sink/directional/east,
-/turf/open/floor/iron/white,
/area/awaymission/moonoutpost19/research)
"Zf" = (
/obj/effect/turf_decal/sand/plating,
@@ -5991,73 +6055,45 @@
temperature = 251
},
/area/awaymission/moonoutpost19/main)
-"Zo" = (
-/obj/machinery/light/small/directional/east,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/noticeboard/directional/east,
-/obj/item/paper/fluff/awaymissions/moonoutpost19/welcome,
-/obj/machinery/camera/directional/east{
- c_tag = "Arrivals South";
- network = list("mo19")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"Zr" = (
-/obj/machinery/power/terminal{
- dir = 4
+"Zp" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/resin/wall,
+/turf/open/misc/asteroid{
+ heat_capacity = 1e+006;
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
+/area/awaymission/moonoutpost19/hive)
+"Zx" = (
+/obj/structure/filingcabinet/chestdrawer,
+/obj/machinery/light/small/broken/directional/north,
/obj/machinery/airalarm/directional/north{
req_access = null
},
/obj/effect/mapping_helpers/airalarm/unlocked,
-/obj/structure/cable,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/research)
-"Zv" = (
-/turf/open/floor/iron/white{
- heat_capacity = 1e+006
+/obj/item/paper/fluff/awaymissions/moonoutpost19/log/gerald,
+/turf/open/floor/iron/cafeteria{
+ dir = 5
},
/area/awaymission/moonoutpost19/research)
-"Zy" = (
-/obj/machinery/shower/directional/south,
-/turf/open/floor/iron/freezer{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"Zz" = (
-/obj/machinery/light/small/directional/south,
-/obj/effect/turf_decal/tile/bar/opposingcorners,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/arrivals)
-"ZE" = (
-/obj/structure/closet/secure_closet/personal/cabinet{
- locked = 0;
- req_access = list("away_maintenance")
+"ZB" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
},
-/obj/item/clothing/under/suit/navy,
-/turf/open/floor/carpet{
+/turf/open/floor/iron/dark{
heat_capacity = 1e+006
},
-/area/awaymission/moonoutpost19/arrivals)
-"ZK" = (
-/obj/effect/decal/cleanable/dirt,
+/area/awaymission/moonoutpost19/syndicate)
+"ZH" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/iron{
heat_capacity = 1e+006;
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251";
temperature = 251
},
-/area/awaymission/moonoutpost19/arrivals)
+/area/awaymission/moonoutpost19/syndicate)
"ZO" = (
/mob/living/basic/lizard{
name = "Newt"
@@ -6067,61 +6103,25 @@
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/main)
-"ZP" = (
-/obj/structure/alien/weeds,
-/obj/structure/bed/nest,
-/obj/effect/decal/cleanable/blood/gibs,
-/obj/item/tank/internals/oxygen,
-/obj/item/clothing/suit/space/syndicate/orange,
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/head/helmet/space/syndicate/orange,
-/obj/item/clothing/mask/facehugger/impregnated,
-/turf/open/misc/asteroid{
- heat_capacity = 1e+006;
- initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
- },
-/area/awaymission/moonoutpost19/hive)
-"ZQ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/power/port_gen/pacman/super{
- name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable,
-/turf/open/floor/plating{
- heat_capacity = 1e+006
- },
-/area/awaymission/moonoutpost19/syndicate)
"ZS" = (
-/obj/structure/closet/crate/bin,
-/obj/item/clothing/gloves/latex,
-/obj/item/trash/chips,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/small/broken/directional/north,
+/obj/structure/alien/weeds,
/turf/open/floor/iron/white/side{
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/research)
"ZT" = (
-/obj/structure/closet/crate{
- desc = "It's a storage unit for kitchen clothes and equipment.";
- name = "Kitchen Crate"
- },
-/obj/item/storage/box/mousetraps,
-/obj/item/clothing/under/suit/waiter,
-/turf/open/floor/iron/showroomfloor{
+/obj/machinery/light/small/directional/west,
+/turf/open/misc/asteroid{
heat_capacity = 1e+006;
- temperature = 273.15
+ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
/area/awaymission/moonoutpost19/arrivals)
"ZW" = (
/obj/structure/table,
-/obj/item/storage/box/donkpockets{
- pixel_x = 3;
- pixel_y = 3
- },
-/turf/open/floor/iron/cafeteria{
- dir = 5
+/obj/item/cigbutt,
+/obj/effect/turf_decal/tile/bar/opposingcorners,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
@@ -13835,7 +13835,265 @@ aa
aa
aa
"}
-(31,1,1) = {"
+(31,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+pO
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(32,1,1) = {"
+aa
aa
aa
aa
@@ -13923,7 +14181,6 @@ aa
aa
aa
aa
-pO
aa
aa
aa
@@ -14092,7 +14349,7 @@ aa
aa
aa
"}
-(32,1,1) = {"
+(33,1,1) = {"
aa
aa
aa
@@ -14349,7 +14606,7 @@ aa
aa
aa
"}
-(33,1,1) = {"
+(34,1,1) = {"
aa
aa
aa
@@ -14443,6 +14700,7 @@ aa
aa
aa
aa
+pO
aa
aa
aa
@@ -14453,6 +14711,7 @@ aa
aa
aa
aa
+pO
aa
aa
aa
@@ -14603,10 +14862,10 @@ aa
aa
aa
aa
+"}
+(35,1,1) = {"
aa
aa
-"}
-(34,1,1) = {"
aa
aa
aa
@@ -14700,7 +14959,6 @@ aa
aa
aa
aa
-pO
aa
aa
aa
@@ -14711,7 +14969,6 @@ aa
aa
aa
aa
-pO
aa
aa
aa
@@ -14863,7 +15120,7 @@ aa
aa
aa
"}
-(35,1,1) = {"
+(36,1,1) = {"
aa
aa
aa
@@ -15120,7 +15377,7 @@ aa
aa
aa
"}
-(36,1,1) = {"
+(37,1,1) = {"
aa
aa
aa
@@ -15377,7 +15634,7 @@ aa
aa
aa
"}
-(37,1,1) = {"
+(38,1,1) = {"
aa
aa
aa
@@ -15634,7 +15891,7 @@ aa
aa
aa
"}
-(38,1,1) = {"
+(39,1,1) = {"
aa
aa
aa
@@ -15891,7 +16148,7 @@ aa
aa
aa
"}
-(39,1,1) = {"
+(40,1,1) = {"
aa
aa
aa
@@ -16148,7 +16405,7 @@ aa
aa
aa
"}
-(40,1,1) = {"
+(41,1,1) = {"
aa
aa
aa
@@ -16405,7 +16662,7 @@ aa
aa
aa
"}
-(41,1,1) = {"
+(42,1,1) = {"
aa
aa
aa
@@ -16662,8 +16919,7 @@ aa
aa
aa
"}
-(42,1,1) = {"
-aa
+(43,1,1) = {"
aa
aa
aa
@@ -16754,6 +17010,7 @@ aa
aa
aa
aa
+pO
aa
aa
aa
@@ -16919,8 +17176,7 @@ aa
aa
aa
"}
-(43,1,1) = {"
-aa
+(44,1,1) = {"
aa
aa
aa
@@ -17010,7 +17266,6 @@ aa
aa
aa
aa
-pO
aa
aa
aa
@@ -17024,11 +17279,13 @@ aa
aa
aa
aa
+pO
aa
aa
aa
aa
aa
+pO
aa
aa
aa
@@ -17176,7 +17433,9 @@ aa
aa
aa
"}
-(44,1,1) = {"
+(45,1,1) = {"
+aa
+aa
aa
aa
aa
@@ -17279,13 +17538,11 @@ aa
aa
aa
aa
-pO
aa
aa
aa
aa
aa
-pO
aa
aa
aa
@@ -17433,7 +17690,7 @@ aa
aa
aa
"}
-(45,1,1) = {"
+(46,1,1) = {"
aa
aa
aa
@@ -17690,7 +17947,7 @@ aa
aa
aa
"}
-(46,1,1) = {"
+(47,1,1) = {"
aa
aa
aa
@@ -17947,8 +18204,7 @@ aa
aa
aa
"}
-(47,1,1) = {"
-aa
+(48,1,1) = {"
aa
aa
aa
@@ -18025,6 +18281,7 @@ aa
aa
aa
aa
+pO
aa
aa
aa
@@ -18204,7 +18461,8 @@ aa
aa
aa
"}
-(48,1,1) = {"
+(49,1,1) = {"
+aa
aa
aa
aa
@@ -18281,7 +18539,6 @@ aa
aa
aa
aa
-pO
aa
aa
aa
@@ -18461,7 +18718,7 @@ aa
aa
aa
"}
-(49,1,1) = {"
+(50,1,1) = {"
aa
aa
aa
@@ -18550,6 +18807,7 @@ aa
aa
aa
aa
+pO
aa
aa
aa
@@ -18563,6 +18821,7 @@ aa
aa
aa
aa
+pO
aa
aa
aa
@@ -18715,10 +18974,10 @@ aa
aa
aa
aa
+"}
+(51,1,1) = {"
aa
aa
-"}
-(50,1,1) = {"
aa
aa
aa
@@ -18807,7 +19066,6 @@ aa
aa
aa
aa
-pO
aa
aa
aa
@@ -18821,7 +19079,6 @@ aa
aa
aa
aa
-pO
aa
aa
aa
@@ -18975,7 +19232,7 @@ aa
aa
aa
"}
-(51,1,1) = {"
+(52,1,1) = {"
aa
aa
aa
@@ -19232,7 +19489,7 @@ aa
aa
aa
"}
-(52,1,1) = {"
+(53,1,1) = {"
aa
aa
aa
@@ -19489,7 +19746,7 @@ aa
aa
aa
"}
-(53,1,1) = {"
+(54,1,1) = {"
aa
aa
aa
@@ -19746,8 +20003,7 @@ aa
aa
aa
"}
-(54,1,1) = {"
-aa
+(55,1,1) = {"
aa
aa
aa
@@ -19820,6 +20076,7 @@ aa
aa
aa
aa
+pO
aa
aa
aa
@@ -20003,7 +20260,7 @@ aa
aa
aa
"}
-(55,1,1) = {"
+(56,1,1) = {"
aa
aa
aa
@@ -20076,7 +20333,6 @@ aa
aa
aa
aa
-pO
aa
aa
aa
@@ -20113,6 +20369,7 @@ aa
aa
aa
aa
+pO
aa
aa
aa
@@ -20260,7 +20517,8 @@ aa
aa
aa
"}
-(56,1,1) = {"
+(57,1,1) = {"
+aa
aa
aa
aa
@@ -20369,7 +20627,6 @@ aa
aa
aa
aa
-pO
aa
aa
aa
@@ -20517,7 +20774,7 @@ aa
aa
aa
"}
-(57,1,1) = {"
+(58,1,1) = {"
aa
aa
aa
@@ -20774,7 +21031,7 @@ aa
aa
aa
"}
-(58,1,1) = {"
+(59,1,1) = {"
aa
aa
aa
@@ -21031,7 +21288,7 @@ aa
aa
aa
"}
-(59,1,1) = {"
+(60,1,1) = {"
aa
aa
aa
@@ -21288,8 +21545,7 @@ aa
aa
aa
"}
-(60,1,1) = {"
-aa
+(61,1,1) = {"
aa
aa
aa
@@ -21357,6 +21613,7 @@ aa
aa
aa
aa
+pO
aa
aa
aa
@@ -21545,8 +21802,7 @@ aa
aa
aa
"}
-(61,1,1) = {"
-aa
+(62,1,1) = {"
aa
aa
aa
@@ -21801,8 +22057,10 @@ aa
aa
aa
aa
+aa
"}
-(62,1,1) = {"
+(63,1,1) = {"
+aa
aa
aa
aa
@@ -21869,7 +22127,6 @@ aa
aa
aa
aa
-pO
aa
aa
aa
@@ -22059,7 +22316,7 @@ aa
aa
aa
"}
-(63,1,1) = {"
+(64,1,1) = {"
aa
aa
aa
@@ -22316,7 +22573,7 @@ aa
aa
aa
"}
-(64,1,1) = {"
+(65,1,1) = {"
aa
aa
aa
@@ -22573,7 +22830,7 @@ aa
aa
aa
"}
-(65,1,1) = {"
+(66,1,1) = {"
aa
aa
aa
@@ -22830,7 +23087,7 @@ aa
aa
aa
"}
-(66,1,1) = {"
+(67,1,1) = {"
aa
aa
aa
@@ -23087,7 +23344,7 @@ aa
aa
aa
"}
-(67,1,1) = {"
+(68,1,1) = {"
aa
aa
aa
@@ -23344,119 +23601,7 @@ aa
aa
aa
"}
-(68,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+(69,1,1) = {"
aa
aa
aa
@@ -23534,6 +23679,118 @@ aa
aa
aa
aa
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
aa
aa
aa
@@ -23601,7 +23858,7 @@ aa
aa
aa
"}
-(69,1,1) = {"
+(70,1,1) = {"
aa
aa
aa
@@ -23858,7 +24115,7 @@ aa
aa
aa
"}
-(70,1,1) = {"
+(71,1,1) = {"
aa
aa
aa
@@ -24115,7 +24372,7 @@ aa
aa
aa
"}
-(71,1,1) = {"
+(72,1,1) = {"
aa
aa
aa
@@ -24372,7 +24629,7 @@ aa
aa
aa
"}
-(72,1,1) = {"
+(73,1,1) = {"
aa
aa
aa
@@ -24629,7 +24886,7 @@ aa
aa
aa
"}
-(73,1,1) = {"
+(74,1,1) = {"
aa
aa
aa
@@ -24886,7 +25143,7 @@ aa
aa
aa
"}
-(74,1,1) = {"
+(75,1,1) = {"
aa
aa
aa
@@ -25143,7 +25400,7 @@ aa
aa
aa
"}
-(75,1,1) = {"
+(76,1,1) = {"
aa
aa
aa
@@ -25228,104 +25485,104 @@ ae
ae
ae
ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ae
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+Zp
+Zp
+Zp
+Zp
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ae
ae
ae
@@ -25400,7 +25657,7 @@ aa
aa
aa
"}
-(76,1,1) = {"
+(77,1,1) = {"
aa
aa
aa
@@ -25490,271 +25747,14 @@ ac
ac
ac
ac
-ac
-ac
-Yf
-Yf
-Yf
-Yf
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(77,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ae
-ae
-ae
-ae
-ae
-ae
-ae
-ac
-ac
-ac
-ac
-ac
-Yf
-Yf
-Yf
-IF
-Lv
-Yf
-Yf
-Yf
+Zp
+Zp
+Zp
+sI
+hs
+Zp
+Zp
+Zp
ac
ac
ac
@@ -26004,15 +26004,15 @@ ac
ac
ac
ac
-Yf
-Dk
-Lv
-Lv
-Dk
-IF
-Dk
-Yf
-Yf
+Zp
+xl
+hs
+hs
+xl
+sI
+xl
+Zp
+Zp
ac
ac
ac
@@ -26260,16 +26260,16 @@ ac
ac
ac
ac
-Yf
-Yf
-IF
-Dk
-Dk
-IF
+Zp
+Zp
+sI
+xl
+xl
+sI
xH
-Dk
-Lv
-Yf
+xl
+hs
+Zp
ac
ac
ac
@@ -26517,16 +26517,16 @@ ac
ac
ac
ac
-Yf
-Dk
-Dk
-XP
-Vh
-Dk
-Dk
-XP
-Dk
-Yf
+Zp
+xl
+xl
+Ix
+MZ
+xl
+xl
+Ix
+xl
+Zp
ac
ac
ac
@@ -26774,16 +26774,16 @@ ac
ac
ac
ac
-Yf
-Dk
-Dk
-Vh
-Dk
+Zp
+xl
+xl
+MZ
+xl
WP
-no
-zy
-sb
-Yf
+vn
+qV
+ue
+Zp
ac
ac
ac
@@ -27031,16 +27031,16 @@ ac
ac
ac
ac
-Yf
-Lv
+Zp
+hs
Pv
-Dk
-Dk
-Dk
-sb
-no
-Dk
-Yf
+xl
+xl
+xl
+ue
+vn
+xl
+Zp
ac
ac
ac
@@ -27288,16 +27288,16 @@ ac
ac
ac
ac
-Yf
-Vh
-no
-Dk
-Dk
-aX
-Dk
+Zp
+MZ
+vn
+xl
+xl
+Og
+xl
Pv
-Lv
-Yf
+hs
+Zp
ac
ac
ac
@@ -27545,16 +27545,16 @@ ac
ac
ac
ac
-Yf
-Re
-ql
-Dk
-Dk
-Dk
-Dk
-Lv
-Dk
-Yf
+Zp
+nW
+sA
+xl
+xl
+xl
+xl
+hs
+xl
+Zp
ac
ac
ac
@@ -27593,20 +27593,20 @@ dA
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -27802,16 +27802,16 @@ ac
ac
ac
ac
-Yf
-Dk
-no
-Yf
-Dk
-Dk
-Dk
-XP
-Lv
-Yf
+Zp
+xl
+vn
+Zp
+xl
+xl
+xl
+Ix
+hs
+Zp
ac
ac
ac
@@ -27846,28 +27846,28 @@ dA
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -28059,16 +28059,16 @@ ac
ac
ac
ac
-Yf
-Yf
-Dk
-Dk
-Dk
-Dk
-Dk
-Dk
-Dk
-Yf
+Zp
+Zp
+xl
+xl
+xl
+xl
+xl
+xl
+xl
+Zp
ac
ac
ac
@@ -28081,10 +28081,10 @@ ac
ac
ac
ac
-Yf
-Yf
-Yf
-Yf
+Zp
+Zp
+Zp
+Zp
ac
ac
ac
@@ -28101,32 +28101,32 @@ dA
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -28317,15 +28317,15 @@ ac
ac
ac
ac
-Yf
-Lv
-Dk
-Dk
-Dk
-Dk
-Dk
-Dk
-Yf
+Zp
+hs
+xl
+xl
+xl
+xl
+xl
+xl
+Zp
ac
ac
ac
@@ -28337,12 +28337,12 @@ ac
ac
ac
ac
-Yf
-Yf
-ZP
-Vh
-Yf
-Yf
+Zp
+Zp
+us
+MZ
+Zp
+Zp
ac
ac
ac
@@ -28356,36 +28356,36 @@ dA
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -28574,15 +28574,15 @@ ac
ac
ac
ac
-Yf
-Yf
-Dk
-Dk
-aX
-Dk
-Dk
-Yf
-Yf
+Zp
+Zp
+xl
+xl
+Og
+xl
+xl
+Zp
+Zp
ac
ac
ac
@@ -28593,13 +28593,13 @@ ac
ac
ac
ac
-Yf
-Yf
-Lv
-no
+Zp
+Zp
+hs
+vn
mN
-Dk
-Yf
+xl
+Zp
ac
ac
ac
@@ -28611,40 +28611,40 @@ dA
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -28832,13 +28832,13 @@ ac
ac
ac
ac
-Yf
-Yf
-Dk
-Dk
-Dk
-Yf
-Yf
+Zp
+Zp
+xl
+xl
+xl
+Zp
+Zp
ac
ac
ac
@@ -28850,13 +28850,13 @@ ac
ac
ac
ac
-Yf
-Vh
-Dk
-aX
-Dk
-Lv
-Yf
+Zp
+MZ
+xl
+Og
+xl
+hs
+Zp
ac
ac
ac
@@ -28866,43 +28866,43 @@ dA
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -29090,11 +29090,11 @@ ac
ac
ac
ac
-Yf
-Yf
-Yf
-Yf
-Yf
+Zp
+Zp
+Zp
+Zp
+Zp
ac
ac
ac
@@ -29105,15 +29105,15 @@ ac
ac
ac
ac
-Yf
-Yf
-Yf
-Dk
-Dk
-Dk
-Vh
-Yf
-Yf
+Zp
+Zp
+Zp
+xl
+xl
+xl
+MZ
+Zp
+Zp
ac
ac
ac
@@ -29121,47 +29121,47 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -29347,10 +29347,10 @@ ac
ac
ac
ac
-Yf
-aX
-aX
-Yf
+Zp
+Og
+Og
+Zp
ac
ac
ac
@@ -29361,15 +29361,15 @@ ac
ac
ac
ac
-Yf
-Yf
-Dk
+Zp
+Zp
+xl
wy
-Dk
-Lv
-Yf
-Yf
-Yf
+xl
+hs
+Zp
+Zp
+Zp
ac
ac
ac
@@ -29377,49 +29377,49 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -29604,27 +29604,27 @@ ac
ac
ac
ac
-Yf
-Dk
-Dk
-Yf
-Yf
+Zp
+xl
+xl
+Zp
+Zp
ac
-Yf
-Yf
-Yf
-Yf
-Yf
-Yf
-Yf
-Yf
-Yf
-Dk
-Dk
-Yf
-Yf
-Yf
-Yf
+Zp
+Zp
+Zp
+Zp
+Zp
+Zp
+Zp
+Zp
+Zp
+xl
+xl
+Zp
+Zp
+Zp
+Zp
ac
ac
ac
@@ -29633,51 +29633,51 @@ dA
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -29861,24 +29861,24 @@ ac
ac
ac
ac
-Yf
-Dk
-Dk
-Dk
-Yf
-Yf
-Yf
-Dk
-Dk
-Dk
-Dk
-Dk
-Dk
-Yf
-Yf
-Dk
-Yf
-Yf
+Zp
+xl
+xl
+xl
+Zp
+Zp
+Zp
+xl
+xl
+xl
+xl
+xl
+xl
+Zp
+Zp
+xl
+Zp
+Zp
ac
ac
ac
@@ -29889,53 +29889,53 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -30118,23 +30118,23 @@ ac
ac
ac
ac
-Yf
-Yf
-Dk
-Dk
-Dk
-Yf
-Dk
-Dk
-Dk
-Dk
-Dk
-Dk
-aX
-Dk
-Dk
-Dk
-Yf
+Zp
+Zp
+xl
+xl
+xl
+Zp
+xl
+xl
+xl
+xl
+xl
+xl
+Og
+xl
+xl
+xl
+Zp
ac
ac
ac
@@ -30145,55 +30145,55 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -30369,29 +30369,29 @@ ae
ae
ae
ac
-Yf
-Yf
-Yf
-Yf
+Zp
+Zp
+Zp
+Zp
ac
ac
ac
-Yf
-Yf
-Dk
-aX
-Dk
-Dk
-Dk
-Yf
-Yf
-Yf
-Yf
-Dk
-Dk
-Dk
-Yf
-Yf
+Zp
+Zp
+xl
+Og
+xl
+xl
+xl
+Zp
+Zp
+Zp
+Zp
+xl
+xl
+xl
+Zp
+Zp
ac
ac
ac
@@ -30402,56 +30402,56 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -30625,29 +30625,29 @@ ae
ae
ae
ae
-Yf
-Yf
-Lv
-Vh
-Yf
-Yf
-Yf
-Yf
-Yf
-Yf
-Dk
-Dk
-Dk
-Dk
-Yf
-Yf
+Zp
+Zp
+hs
+MZ
+Zp
+Zp
+Zp
+Zp
+Zp
+Zp
+xl
+xl
+xl
+xl
+Zp
+Zp
bl
bl
-Yf
-Yf
-Dk
-Dk
-Yf
+Zp
+Zp
+xl
+xl
+Zp
ac
ac
ac
@@ -30658,58 +30658,58 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -30882,29 +30882,29 @@ ae
ae
ae
ae
-Yf
-Lv
-Dk
+Zp
+hs
+xl
wy
-Dk
-Yf
-Yf
-Dk
-Dk
-Dk
-Dk
-Dk
-Dk
-Yf
-Yf
+xl
+Zp
+Zp
+xl
+xl
+xl
+xl
+xl
+xl
+Zp
+Zp
bl
bl
bl
-Yf
-Dk
-Dk
-Dk
-Yf
+Zp
+xl
+xl
+xl
+Zp
ac
ac
ac
@@ -30914,59 +30914,59 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -31139,92 +31139,92 @@ ae
ae
ae
ae
-Yf
-Lv
-Dk
-Lv
-aX
-Dk
-Dk
-Dk
-Yf
-Yf
-Dk
-Yf
-Yf
-Yf
+Zp
+hs
+xl
+hs
+Og
+xl
+xl
+xl
+Zp
+Zp
+xl
+Zp
+Zp
+Zp
bl
bl
bl
bl
-Yf
-Dk
-Dk
-Yf
-Yf
-ac
-ac
-ac
-ac
-ac
-ac
-dA
-dA
-dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Zp
+xl
+xl
+Zp
+Zp
+ac
+ac
+ac
+ac
+ac
+ac
+dA
+dA
+dA
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
lc
io
io
io
lc
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -31396,70 +31396,70 @@ ae
ae
ae
ae
-Yf
-Yf
-Yf
-Vh
-Vh
-Yf
-Yf
-Yf
-Yf
-Yf
-Dk
-Yf
+Zp
+Zp
+Zp
+MZ
+MZ
+Zp
+Zp
+Zp
+Zp
+Zp
+xl
+Zp
bl
bl
bl
bl
bl
bl
-Yf
-Dk
-Dk
-Yf
-ac
-ac
-ac
-ac
-ac
-ac
-dA
-dA
-dA
-dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Zp
+xl
+xl
+Zp
+ac
+ac
+ac
+ac
+ac
+ac
+dA
+dA
+dA
+dA
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
lc
lc
mp
@@ -31467,21 +31467,21 @@ mG
mV
lc
lc
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -31655,68 +31655,68 @@ ae
ae
ac
ac
-Yf
-Yf
-Yf
-Yf
+Zp
+Zp
+Zp
+Zp
ac
ac
ac
-Yf
+Zp
xH
-Yf
-Yf
+Zp
+Zp
bl
bl
bl
bl
bl
-Yf
-Dk
+Zp
+xl
xP
-Yf
-Yf
-Yf
-ac
-ac
-ac
-dA
-dA
-dA
-zV
-qX
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Zp
+Zp
+Zp
+ac
+ac
+ac
+dA
+dA
+dA
+vM
+wH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ld
lW
mb
@@ -31724,21 +31724,21 @@ mc
mb
nf
ld
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -31919,50 +31919,50 @@ ac
ac
ac
ac
-Yf
-Dk
-Dk
-Yf
+Zp
+xl
+xl
+Zp
bl
bl
bl
bl
bl
-Yf
-Dk
-Dk
-Dk
-Dk
-Yf
-Yf
-Yf
-ac
-dA
-dA
-zV
-zV
-qX
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Zp
+xl
+xl
+xl
+xl
+Zp
+Zp
+Zp
+ac
+dA
+dA
+vM
+vM
+wH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
eI
eJ
eJ
@@ -31972,8 +31972,8 @@ eI
eI
eJ
eI
-uH
-uH
+Ga
+Ga
ld
lX
mq
@@ -31981,22 +31981,22 @@ mr
mW
lX
ld
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -32174,42 +32174,42 @@ ac
ac
ac
ac
-Yf
-Yf
-Yf
-Dk
-Dk
-Yf
-Yf
+Zp
+Zp
+Zp
+xl
+xl
+Zp
+Zp
bl
bl
bl
bl
-Yf
-Yf
-Dk
-Dk
-Dk
-Dk
-Dk
-Yf
-Yf
-zV
-zV
-Ba
-qX
-qX
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Zp
+Zp
+xl
+xl
+xl
+xl
+xl
+Zp
+Zp
+vM
+vM
+Ja
+wH
+wH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
eI
eI
eI
@@ -32217,20 +32217,20 @@ eJ
eI
eJ
eJ
-uH
-uH
-uH
+Ga
+Ga
+Ga
eJ
-Cb
-bn
-bn
-Jq
-bn
+zy
+yk
+yk
+Mb
+yk
gA
-za
+lt
eI
-uH
-uH
+Ga
+Ga
ld
ld
ld
@@ -32238,22 +32238,22 @@ mH
ld
ld
ld
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -32430,64 +32430,64 @@ ac
ac
ac
ac
-Yf
-Yf
-YA
-Dk
-Dk
-aX
-Lv
-Yf
+Zp
+Zp
+eL
+xl
+xl
+Og
+hs
+Zp
bl
bl
bl
-Yf
-Yf
-Dk
-Dk
-Yf
-Yf
-Dk
-Dk
-Dk
-Yf
-ys
-qX
-qX
-qX
-qX
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Zp
+Zp
+xl
+xl
+Zp
+Zp
+xl
+xl
+xl
+Zp
+Im
+wH
+wH
+wH
+wH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
eI
-SL
+Cv
BR
-YB
-YB
-hs
+qG
+qG
+Ne
eJ
eI
eJ
eI
eI
-Bj
-Jb
+rx
+Hh
ea
ea
dZ
dZ
-bn
+yk
eJ
-uH
-uH
+Ga
+Ga
ld
lZ
mr
@@ -32495,22 +32495,22 @@ mr
mr
lZ
ld
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -32687,64 +32687,64 @@ ac
ac
ac
ac
-Yf
-SR
-dh
+Zp
+Ac
+QO
wy
-Dk
-Lv
-Vh
-Yf
+xl
+hs
+MZ
+Zp
bl
bl
bl
-Yf
-Dk
-Dk
-Yf
-Yf
-Yf
-Yf
-Dk
-aX
-Yf
-ys
-qX
-qX
-qX
-qX
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Zp
+xl
+xl
+Zp
+Zp
+Zp
+Zp
+xl
+Og
+Zp
+Im
+wH
+wH
+wH
+wH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
eJ
-IK
-rm
-CR
-OX
-uu
+UH
+YH
+iq
+iR
+zV
eI
-wB
-bn
-nV
-za
-bn
-Jq
+yO
+yk
+IW
+lt
+yk
+Mb
dZ
-qm
-Vu
+zC
+FK
dZ
Ci
eJ
hI
-uH
+Ga
ld
ma
mc
@@ -32752,23 +32752,23 @@ mr
mc
ng
ld
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -32944,64 +32944,64 @@ ac
ac
ac
ac
-Yf
-Vh
-no
-Dk
-Vh
-Vh
-Yf
-Yf
+Zp
+MZ
+vn
+xl
+MZ
+MZ
+Zp
+Zp
bl
bl
bl
-Yf
-Dk
-Yf
-Yf
-ac
-ac
-Yf
-Yf
-Yf
-Yf
-zV
-Ba
-qX
-qX
-qX
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Zp
+xl
+Zp
+Zp
+ac
+ac
+Zp
+Zp
+Zp
+Zp
+vM
+Ja
+wH
+wH
+wH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
eJ
-LF
+PV
BR
-RZ
-RZ
-Wj
+XH
+XH
+gO
eI
-bn
+yk
ea
ea
dZ
dZ
ea
ea
-Sj
+WX
dZ
ea
-Jj
-BX
+VS
+Bp
hI
-uH
+Ga
io
mb
Qx
@@ -33009,23 +33009,23 @@ xS
Qx
mb
io
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -33201,21 +33201,21 @@ ac
ac
ac
ac
-Yf
-Yf
-Yf
-Dk
-Yf
-Yf
-Yf
+Zp
+Zp
+Zp
+xl
+Zp
+Zp
+Zp
bl
bl
bl
bl
-Yf
-Dk
-Yf
-Yf
+Zp
+xl
+Zp
+Zp
ac
ac
ac
@@ -33223,31 +33223,31 @@ ac
ac
dA
dA
-zV
-qX
-qX
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+vM
+wH
+wH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
eJ
-Zr
+Oo
BR
BR
-XG
-Au
+Wd
+Mm
eI
-bn
+yk
ea
-Av
+DX
hB
hB
hB
@@ -33257,8 +33257,8 @@ ea
jq
Vr
hg
-rP
-uH
+by
+Ga
ld
mc
tX
@@ -33266,23 +33266,23 @@ vt
tX
mc
ld
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -33460,19 +33460,19 @@ ac
ac
ac
ac
-Yf
-Dk
-Yf
+Zp
+xl
+Zp
bl
bl
bl
bl
bl
bl
-Yf
-Dk
-Dk
-Yf
+Zp
+xl
+xl
+Zp
ac
ac
ac
@@ -33480,42 +33480,42 @@ ac
ac
dA
dA
-zV
-qX
-qX
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+vM
+wH
+wH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
eI
-Ts
-za
-bn
+ks
+lt
+yk
gA
-uU
+Uf
eJ
-Jq
+Mb
ea
-WN
+Pi
hB
fS
hX
-Ld
+Om
hB
dZ
gC
Vr
hh
-rP
-uH
+by
+Ga
ld
md
Qx
@@ -33523,23 +33523,23 @@ xS
Qx
nh
ld
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -33717,41 +33717,41 @@ ac
ac
ac
ac
-Yf
-Dk
-Yf
+Zp
+xl
+Zp
bl
bl
bl
bl
bl
bl
-Yf
-Yf
-aX
-Yf
+Zp
+Zp
+Og
+Zp
ac
ac
ac
ac
dA
dA
-zV
-zV
-qX
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+vM
+vM
+wH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
eJ
eI
eJ
@@ -33759,20 +33759,20 @@ Ci
eJ
eJ
eI
-bn
+yk
ea
-Gw
+Zx
hB
-Kw
-tq
-HZ
+sU
+TG
+Qh
iH
ea
gD
Ut
hg
-rP
-uH
+by
+Ga
io
mc
mc
@@ -33780,23 +33780,23 @@ mr
mc
mc
io
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -33974,9 +33974,9 @@ ac
ac
ac
ac
-Yf
-aX
-Yf
+Zp
+Og
+Zp
bl
bl
bl
@@ -33984,50 +33984,50 @@ bl
bl
bl
bl
-Yf
-Dk
-Yf
+Zp
+xl
+Zp
ac
ac
ac
ac
dA
dA
-zV
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+vM
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
eI
-bn
-bn
+yk
+yk
gA
-bn
-bn
-ya
-Jq
+yk
+yk
+rE
+Mb
dZ
-qY
+UC
fS
hB
hZ
fS
-bW
+Ws
ea
gE
Ut
-Yj
+fV
hI
lc
ld
@@ -34038,22 +34038,22 @@ mb
me
ld
lc
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -34231,9 +34231,9 @@ ac
ac
ac
ac
-Yf
-Dk
-Yf
+Zp
+xl
+Zp
bl
bl
bl
@@ -34241,33 +34241,33 @@ bl
bl
bl
bl
-Yf
-Dk
-Yf
+Zp
+xl
+Zp
ac
ac
ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
eI
-Km
+UY
ea
ea
ea
@@ -34275,9 +34275,9 @@ dZ
dZ
ea
ea
-Qa
-Eq
-Qa
+eK
+eu
+eK
ia
hB
fW
@@ -34285,7 +34285,7 @@ ea
gF
Vr
hg
-rP
+by
ld
lD
lD
@@ -34295,22 +34295,22 @@ mY
lD
lD
ld
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -34488,53 +34488,53 @@ ac
ac
ac
ac
-Yf
-Dk
-Yf
+Zp
+xl
+Zp
bl
bl
bl
bl
bl
bl
-Yf
-Yf
-Dk
-Yf
+Zp
+Zp
+xl
+Zp
ac
ac
ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
eI
-za
+lt
ea
-MP
-aL
-nj
-VQ
-Ok
-oV
+Ip
+qd
+uR
+Cw
+yJ
+WE
Ti
bb
-Qa
+eK
ib
ir
iK
@@ -34542,7 +34542,7 @@ dZ
gC
Ut
hh
-rP
+by
lc
rq
jy
@@ -34552,23 +34552,23 @@ ld
rq
jy
lc
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -34745,87 +34745,87 @@ ac
ac
ac
ac
-Yf
-Dk
-Yf
+Zp
+xl
+Zp
bl
bl
bl
bl
bl
-Yf
-Yf
-Dk
-Dk
-Yf
+Zp
+Zp
+xl
+xl
+Zp
ac
ac
ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
eJ
-yh
+Av
dZ
-cZ
-EB
-Oj
-nR
+jW
+nv
+vJ
+HG
QW
-oV
+WE
Ti
bb
-Qa
-vC
+eK
+ww
is
-AA
+BA
ea
jv
Ut
hh
-rP
-uH
-uH
-uH
-rP
+by
+Ga
+Ga
+Ga
+by
iv
-rP
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+by
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -35001,88 +35001,88 @@ ac
ac
ac
ac
-Yf
-Yf
-Dk
-Yf
-Yf
-Yf
-Yf
-Yf
-Yf
-Yf
-Dk
-Dk
-Yf
-Yf
+Zp
+Zp
+xl
+Zp
+Zp
+Zp
+Zp
+Zp
+Zp
+Zp
+xl
+xl
+Zp
+Zp
ac
ac
ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dZ
dZ
ea
ea
-bn
+yk
ea
-Me
-pz
-Yz
-uM
-YD
-oV
+tZ
+vg
+Bx
+cX
+PE
+WE
Ti
bb
-Qa
+eK
ff
fy
iM
ea
jw
-sk
+YE
hg
hI
-uH
-uH
-uH
-qk
-kc
-rP
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+yp
+xk
+by
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -35257,54 +35257,54 @@ ac
ac
ac
ac
-Yf
-Yf
-Dk
-Dk
-Lv
-Yf
-Yf
-Dk
-Dk
+Zp
+Zp
+xl
+xl
+hs
+Zp
+Zp
+xl
+xl
Ku
-Dk
-Dk
-Yf
-Yf
+xl
+xl
+Zp
+Zp
ac
ac
ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
ed
et
ea
-hy
+kj
ea
-oV
-uK
-JS
-oV
-oV
-oV
+WE
+sp
+Un
+WE
+WE
+WE
Ti
-bR
+JJ
eI
ea
dZ
@@ -35312,34 +35312,34 @@ dZ
ea
hJ
jY
-GJ
+MN
hI
hI
-rP
-rP
-rP
-ue
-rP
-rP
-rP
+by
+by
+by
+iN
+by
+by
+by
hI
hI
hI
hI
-DJ
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+NM
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -35514,89 +35514,89 @@ ac
ac
ac
ac
-Yf
-Vh
+Zp
+MZ
xH
-Dk
-Dk
-Dk
-Dk
-Dk
-Yf
-Yf
-Yf
-Yf
-Yf
-ac
-ac
-ac
-ac
-ac
-dA
-dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-sG
-NQ
-EB
-AF
-MC
-wZ
-zP
-ud
-Oq
+xl
+xl
+xl
+xl
+xl
+Zp
+Zp
+Zp
+Zp
+Zp
+ac
+ac
+ac
+ac
+ac
+dA
+dA
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+DG
+pa
+nv
+AX
+iW
+mO
+Fc
+FM
+gd
bb
bb
bb
fk
-Zv
-xZ
+PD
+rW
ea
fz
ee
eI
-At
+os
gU
-zt
+JL
hn
-WK
-Tx
-Tx
-Tx
-jt
-Tx
-Tx
-Fc
-eP
-rc
-LM
-IQ
-Uf
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+CR
+fa
+fa
+fa
+Qa
+fa
+fa
+qM
+jU
+jG
+jC
+Tb
+OV
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -35770,16 +35770,16 @@ ac
ac
ac
ac
-Yf
-Yf
-Lv
-Dk
-aX
-Dk
-Lv
-Yf
-Yf
-Yf
+Zp
+Zp
+hs
+xl
+Og
+xl
+hs
+Zp
+Zp
+Zp
ac
ac
ac
@@ -35791,70 +35791,70 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-sG
-ew
-FQ
-Ct
-EU
-IN
-Nw
-Jt
-Jc
-Br
-Zv
-Zv
-Zv
-hj
-xZ
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+DG
+Lo
+GS
+ZS
+Dn
+UZ
+PA
+Oi
+mj
+QA
+PD
+PD
+PD
+DE
+rW
ie
-Zv
-Zv
+PD
+PD
gq
-So
+Or
Vr
-sS
-jt
+mo
+Qa
FJ
-xh
-sQ
+zz
+kU
ih
-Zo
-sQ
-sQ
-sQ
-eP
-kc
+zI
+kU
+kU
+kU
+jU
+xk
Hl
-IQ
-Uf
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Tb
+OV
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -36027,14 +36027,14 @@ ac
ac
ac
ac
-Yf
-Lv
-Dk
-Dk
-Vh
-Vh
-Yf
-Yf
+Zp
+hs
+xl
+xl
+MZ
+MZ
+Zp
+Zp
ac
ac
ac
@@ -36048,70 +36048,70 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-EG
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+VF
ea
ea
dZ
ea
ea
-uT
+na
dZ
ea
dZ
dZ
-Kz
-zs
+Pj
+Xq
eg
eg
-xZ
+rW
ea
fA
fZ
eI
-uv
-yp
-sS
+wj
+Ko
+mo
ho
jE
Gh
-rP
-rP
+by
+by
hI
-rP
-rP
-rP
+by
+by
+by
hI
nB
nL
hI
-om
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+JH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -36284,13 +36284,13 @@ ac
ac
ac
ac
-pP
-Yf
-Yf
-Yf
-Yf
-Yf
-Yf
+wB
+Zp
+Zp
+Zp
+Zp
+Zp
+Zp
ac
ac
ac
@@ -36305,33 +36305,33 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
-eA
-SY
-EB
-yZ
-uk
+lN
+Et
+nv
+nT
+Pr
dZ
ea
-oV
-Gj
+WE
+Vo
eh
eI
dZ
@@ -36340,35 +36340,35 @@ ea
ea
hI
gU
-DX
+ap
hJ
hJ
hJ
-rP
-uH
-qT
-uH
-uH
-uH
+by
+Ga
+ZT
+Ga
+Ga
+Ga
hI
hI
hI
hI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -36562,70 +36562,70 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
-El
-SY
-EB
-Fv
+aY
+Et
+nv
+XG
fk
-Rk
+Yx
ea
-uz
-Dc
-Zv
-Zv
-mn
+aw
+CK
+PD
+PD
+PL
dZ
-uH
-uH
+Ga
+Ga
hJ
-FX
-wE
+OQ
+WH
hI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -36819,70 +36819,70 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dZ
-XF
-vV
-NQ
-sI
+sT
+hp
+pa
+bE
fk
-TE
+Ew
dZ
-ZS
-Zv
-Zv
-Zv
+Nt
+PD
+PD
+PD
fm
dZ
-uH
-uH
-rP
+Ga
+Ga
+by
kg
kB
MI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -37076,70 +37076,70 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dZ
dZ
ea
ea
-GG
-vV
-NQ
-SC
+yg
+hp
+pa
+XX
gI
-ux
+Nc
ea
-AF
+AX
HQ
-Zv
-hj
+PD
+DE
ez
ea
-uH
-uH
-rP
+Ga
+Ga
+by
kd
kC
-GS
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+GV
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -37333,70 +37333,70 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
-IR
-IR
+LI
+LI
eI
-lN
-HD
-Gx
+Vn
+Mt
+Ah
eJ
eI
eJ
ea
-Wd
-kT
-ti
-KK
-qo
+NW
+Vy
+wh
+Km
+Xz
ea
-uH
-uH
-rP
-ZK
-QO
-PQ
-HW
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+by
+IP
+PR
+sO
+ET
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -37590,28 +37590,28 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dZ
-NK
-NK
-WR
+Uz
+Uz
+ad
fk
fB
fk
-Za
+Hd
gJ
gW
ea
@@ -37621,39 +37621,39 @@ ea
ea
dZ
ea
-uH
-Ho
+Ga
+Cc
hI
-WO
-QP
+Fx
+XZ
hI
mU
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -37847,24 +37847,24 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dZ
ei
-Nl
-Er
+Qu
+HI
fl
fC
fk
@@ -37872,45 +37872,45 @@ fk
fk
gX
dZ
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
jA
kg
-QP
-rP
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-Qj
-uH
+XZ
+by
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+jF
+Ga
Uh
kR
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -38104,70 +38104,70 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
-Xq
-ET
-ps
-iT
-bF
-Mj
-vE
-Ai
-xN
+VD
+aj
+CL
+dd
+YW
+zO
+jH
+mX
+Rh
dZ
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
kR
-cr
-TH
+sG
+mz
kB
-rP
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+by
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hI
MI
-uN
+QP
MI
MI
MI
MI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -38362,69 +38362,69 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dZ
-fn
-tE
-tE
-tE
+FW
+Nr
+Nr
+Nr
fE
-dn
-Ra
-tE
-fn
+CF
+nz
+Nr
+FW
ea
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
MI
kd
Sw
-rP
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+by
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hI
-KW
-AQ
+OL
+yU
nM
nS
nX
MI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -38619,41 +38619,41 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
ea
-eL
+rd
eq
eq
fF
gc
gu
-eL
+rd
ea
ea
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hJ
hI
hI
-dE
-xz
+Hr
+wv
hJ
hJ
hJ
@@ -38664,24 +38664,24 @@ hI
hJ
hJ
nx
-OL
-QP
+bz
+XZ
kB
kC
MI
MI
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ZO
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -38861,34 +38861,34 @@ ac
ac
ac
aU
-km
-gb
+ij
+Op
aU
bX
bX
-eu
+xs
bX
bX
zN
-cV
+sa
aU
ac
ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
el
er
@@ -38900,45 +38900,45 @@ gv
gM
ha
ea
-uH
-uH
-uH
-uH
-uH
-Ho
+Ga
+Ga
+Ga
+Ga
+Ga
+Cc
hJ
-iD
-SW
+Gw
+zm
Vr
-sS
-lz
-bK
-yX
-yX
-yX
+mo
+EH
+Jc
+gG
+gG
+gG
iw
-oZ
+ya
ni
nq
Sw
-Qz
-QP
-QP
-QP
-wF
+Dw
+XZ
+XZ
+XZ
+PZ
MI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -39118,34 +39118,34 @@ ac
aU
aU
aU
-AS
+qk
aU
aU
-ES
-VC
-od
-VC
-VC
+Qz
+Gk
+Gy
+Gk
+Gk
df
-Rv
+ZH
aU
aU
aU
aU
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
em
eB
@@ -39157,45 +39157,45 @@ en
eB
eq
ea
-uH
-uH
-uH
-uH
-uH
-uH
-rP
-Sc
-sS
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+by
+yh
+mo
Ut
-jt
-wl
-Ch
-Kp
+Qa
+Cp
+JD
+eR
Ud
mx
ix
kB
-Fq
+Tq
Ud
uO
mx
nN
-Kp
-hQ
-OC
+eR
+qi
+ul
MI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -39374,35 +39374,35 @@ ac
ac
aU
bd
-Vb
-Vi
-ds
+xt
+FZ
+lq
aU
-hN
-aT
-Pq
-Jo
-te
-Pq
+OO
+QY
+pp
+Wq
+Yk
+pp
QZ
aU
-yg
-DP
+En
+wz
aU
-Ek
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+EF
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
en
en
@@ -39414,19 +39414,19 @@ eq
en
eq
ea
-uH
-uH
-uH
-uH
-uH
-uH
-rP
-Xm
-sS
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+by
+jb
+mo
Vr
hI
hI
-Qy
+Cd
hJ
hI
hI
@@ -39436,23 +39436,23 @@ hJ
kl
hI
hJ
-fe
+fU
hJ
hI
hI
hJ
mU
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -39631,35 +39631,35 @@ ac
ac
aU
nd
-DO
-Vi
-Oy
-nr
-kn
-SF
-kn
-xK
-xK
-kn
-kn
-xW
-Rn
+tJ
+FZ
+bn
+ek
+Bw
TL
-XB
-fD
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Bw
+tP
+tP
+Bw
+Bw
+mn
+Ty
+Ld
+Is
+Bc
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ec
eo
eq
@@ -39669,47 +39669,47 @@ fJ
eq
eq
en
-SP
+pM
ec
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hJ
je
-jt
+Qa
Vr
hJ
-Qh
+rh
ln
-Uz
+wU
hJ
my
-rd
+Bn
im
hJ
-kc
+xk
hJ
nH
nP
-Dh
+Mg
hI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -39888,35 +39888,35 @@ ac
ac
aU
aU
-wu
-vl
-pS
-kQ
-jF
-LR
-Yu
+yQ
+Oy
+Ph
+Lp
+Od
+jP
+Bb
cS
-xK
-Yu
-xK
+tP
+Bb
+tP
aU
-sj
-pI
+Pe
+sg
aU
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
ep
eq
@@ -39928,45 +39928,45 @@ eq
eQ
hc
ea
-uH
-uH
+Ga
+Ga
hI
hI
hJ
hJ
hJ
-MN
-sS
+TX
+mo
Vr
hI
-ZE
-kV
-IZ
+RI
+hC
+LJ
hJ
-Go
+kI
mT
-CC
+vZ
hJ
lP
hI
nI
ln
-it
+fY
hJ
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -40145,35 +40145,35 @@ ac
ac
ac
aU
-RH
-UA
-Mz
+uX
+LQ
+Er
aU
-kQ
-IW
-vb
+Lp
+DK
+Oa
aU
-iF
-oi
-lG
+RP
+OA
+fu
aU
aU
aU
aU
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
eq
eF
@@ -40185,16 +40185,16 @@ eq
en
eq
ea
-uH
-uH
+Ga
+Ga
hI
-BT
+Vt
hJ
-YH
+TK
hJ
-gh
-sS
-jh
+Tt
+mo
+So
hI
hJ
hJ
@@ -40210,20 +40210,20 @@ hJ
hJ
hJ
hJ
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -40406,9 +40406,9 @@ at
at
at
at
-Sb
-rU
-Lr
+xV
+KO
+nm
aU
aU
aU
@@ -40419,18 +40419,18 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
er
em
@@ -40442,45 +40442,45 @@ en
eB
eq
ea
-uH
-uH
+Ga
+Ga
hJ
-UM
+PJ
hI
-FA
+cH
hJ
hI
-Iz
+Rc
Ut
-vT
+Di
kl
lP
-kc
+xk
Hl
Hl
Hl
-CT
-BZ
+yb
+aM
ns
hJ
-kc
+xk
Hl
hI
Zf
-uH
-uH
-uH
-dO
-do
+Ga
+Ga
+Ga
+Na
+re
Zf
-yi
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+kJ
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -40654,40 +40654,40 @@ ac
ac
ac
at
-FK
-sC
-iR
-dQ
-Sy
-qw
-AT
-AX
-at
+ht
+Nk
+ox
+ZB
+Mx
+pK
nA
-kn
-rf
+qr
+at
+UU
+Bw
+wc
aU
-ML
-rp
-cY
+it
+wa
+HW
aU
ac
ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
el
eH
@@ -40699,45 +40699,45 @@ eH
eq
eq
ea
-uH
-uH
+Ga
+Ga
hI
-xt
-LI
-le
-gm
-HU
-sS
-jt
-sc
+Ox
+zR
+ye
+hW
+EU
+mo
+Qa
+dr
hJ
hJ
Hl
-NV
+BC
Jm
AE
-YW
-JD
-tT
-UX
+Xv
+zP
+MM
+km
Hl
jM
-GX
-ck
-LY
-LY
-LY
-FP
-Eb
-Uf
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+oZ
+kV
+vc
+vc
+vc
+FR
+XJ
+OV
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -40911,40 +40911,40 @@ ac
ac
ac
at
-rN
-MW
-MW
-MW
-dQ
-Ik
-aD
-Xv
+yH
+qf
+qf
+qf
+ZB
+OF
+KJ
+wm
at
-cn
-kn
-Fu
-KN
-Hz
-Fj
-RK
+PC
+Bw
+AL
+GE
+DJ
+Fa
+NH
aU
ac
ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ea
ea
ea
@@ -40956,20 +40956,20 @@ ea
ea
ea
ea
-uH
-uH
+Ga
+Ga
hI
-Yi
-LG
-le
-le
+Qg
+tj
+ye
+ye
hJ
-to
-jt
-sS
-WI
+wf
+Qa
+mo
+Lb
hJ
-CT
+yb
hI
hJ
hI
@@ -40978,23 +40978,23 @@ Us
hI
hI
nJ
-FV
+xz
hJ
-VK
-uH
-uH
-uH
-pD
-Lq
-VK
-uH
-Nf
-uH
-uH
-uH
-uH
-uH
-uH
+Ab
+Ga
+Ga
+Ga
+zw
+SM
+Ab
+Ga
+Kp
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -41168,18 +41168,18 @@ ac
ac
ac
at
-qp
-MW
-Uu
-Mn
-YZ
-tj
-Eo
-Eo
-VI
-FT
-WB
-sn
+HA
+qf
+Mw
+Ms
+qW
+Nh
+KF
+KF
+Me
+qR
+yM
+VT
aU
aU
aU
@@ -41191,67 +41191,67 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hI
hI
hI
-CS
+WM
hJ
hI
-rg
-jt
-jt
-zk
+NQ
+Qa
+Qa
+Hu
hI
-kc
+xk
hI
-uH
-uH
+Ga
+Ga
hI
-SK
+zt
lP
hI
hJ
hJ
hJ
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -41425,22 +41425,22 @@ ac
ac
ac
at
-Di
-MW
-MW
-Oh
-JH
-Lh
-JF
-Gk
+JE
+qf
+qf
+qy
+CU
+Cf
+Ss
+tQ
at
-an
-fM
-rf
-KZ
-uA
-gL
-XQ
+qw
+mg
+wc
+UW
+Jq
+kS
+fT
aU
ac
ac
@@ -41448,67 +41448,67 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hI
-Zy
-Ip
-gm
-db
+Iw
+SD
+hW
+Gi
hI
-TR
-sS
-sS
-iW
+lw
+mo
+mo
+wS
hJ
lP
hI
-uH
-uH
+Ga
+Ga
hI
-ue
+iN
hI
hI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -41682,22 +41682,22 @@ ac
ac
ac
at
-Mt
-Di
-PJ
-st
-jS
-WH
-Qe
-Cp
-at
-jH
fO
-zp
+JE
+Wp
+vW
+NE
+Rs
+Hy
+RQ
+at
+kp
+Ni
+QU
aU
-nQ
-da
-Iy
+oT
+eV
+pT
aU
ac
ac
@@ -41705,67 +41705,67 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hI
-VR
-le
-le
-db
+kD
+ye
+ye
+Gi
hI
-Ds
-sS
-jt
-Qk
+fo
+mo
+Qa
+rm
hJ
Hl
hJ
-uH
-uH
-pD
-Lq
+Ga
+Ga
+zw
+SM
nu
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -41949,7 +41949,7 @@ at
at
at
at
-Hb
+um
at
at
aU
@@ -41962,66 +41962,66 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hI
hI
-On
-pb
+ON
+sN
hI
hI
-Qq
-DA
-DA
-Qq
+vH
+xB
+xB
+vH
hJ
kl
hJ
hJ
hJ
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -42204,10 +42204,10 @@ ac
ac
ac
at
-ph
-SJ
-QJ
-ga
+iP
+Yt
+lz
+gw
at
ac
ac
@@ -42218,67 +42218,67 @@ ac
ac
ac
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hI
hJ
hJ
hJ
-ek
-qM
-qM
-qM
-Xo
-LZ
-qM
-Kk
+Mp
+Ib
+Ib
+Ib
+Vj
+dk
+Ib
+kY
Rm
hJ
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -42461,10 +42461,10 @@ ac
ac
ac
at
-zM
-AN
-mX
-Ac
+kT
+pI
+Ba
+QC
at
ac
ac
@@ -42475,67 +42475,67 @@ ac
ac
ac
ac
-uH
+Ga
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-rP
-ON
-tQ
-YC
-qM
-qM
-qM
-uY
-Kn
-YC
-Kk
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+by
+Jt
+rC
+Ez
+Ib
+Ib
+Ib
+gS
+Rp
+Ez
+kY
Rm
hI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -42718,10 +42718,10 @@ ac
ac
ac
at
-Cf
-lx
-ex
-ZQ
+Tp
+At
+ss
+zu
at
ac
ac
@@ -42731,68 +42731,68 @@ ac
ac
ac
ac
-uH
-uH
+Ga
+Ga
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-rP
-mm
-cM
-YC
-qM
-qM
-lU
-qM
-qM
-qM
-YC
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+by
+ZW
+Oe
+Ez
+Ib
+Ib
+NJ
+Ib
+Ib
+Ib
+Ez
Bm
hI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -42975,10 +42975,10 @@ ac
ac
ac
at
-Kq
-AK
+PN
+bH
xj
-Ac
+QC
at
ac
ac
@@ -42988,68 +42988,68 @@ ac
ac
ac
ac
-uH
+Ga
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-rP
-Tg
-Aq
-qM
-uY
-qM
-jZ
-qM
-CP
-qM
-Zz
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+by
+MJ
+ne
+Ib
+gS
+Ib
+cd
+Ib
+Wt
+Ib
+US
hI
hJ
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -43232,10 +43232,10 @@ ac
ac
ac
at
-CN
-si
-Rr
-Id
+yy
+Em
+ce
+wI
at
ac
ac
@@ -43244,69 +43244,69 @@ ac
ac
ac
ac
-uH
-uH
+Ga
+Ga
ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-Ho
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Cc
hJ
hJ
hI
-MA
-XT
-XT
-XT
-XT
+OZ
+cn
+cn
+cn
+cn
hJ
-Tn
+ux
hJ
hJ
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -43500,69 +43500,69 @@ ac
ac
ac
ac
-uH
-uH
+Ga
+Ga
ac
ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hJ
hJ
-hF
-QC
-QA
-QC
-QC
+YM
+zM
+nG
+zM
+zM
hJ
lR
lR
hJ
hJ
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -43756,8 +43756,8 @@ ac
ac
ac
ac
-uH
-uH
+Ga
+Ga
ac
ac
ac
@@ -43765,29 +43765,29 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hJ
iU
iX
@@ -43795,31 +43795,31 @@ iX
ko
iX
iX
-zS
+Af
lR
lS
mD
-rP
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+by
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -44012,8 +44012,8 @@ ac
ac
ac
ac
-uH
-uH
+Ga
+Ga
ac
ac
ac
@@ -44022,60 +44022,60 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hI
-pp
+LY
jn
-os
-rZ
+dT
+Re
iX
iX
iX
lS
lR
mE
-rP
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+by
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -44269,7 +44269,7 @@ ac
ac
ac
ac
-uH
+Ga
ac
ac
ac
@@ -44280,32 +44280,32 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hI
-pp
+LY
iX
-ZW
+HK
kq
ko
iX
@@ -44313,26 +44313,26 @@ iX
lR
lR
mF
-rP
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+by
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -44525,8 +44525,8 @@ ac
ac
ac
ac
-uH
-uH
+Ga
+Ga
ac
ac
ac
@@ -44537,28 +44537,28 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hJ
iX
iX
@@ -44572,23 +44572,23 @@ ml
hI
hI
mU
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -44777,14 +44777,14 @@ ac
ac
ac
ac
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ac
ac
ac
@@ -44795,57 +44795,57 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hI
iY
jo
jR
-hT
+rl
kM
hJ
-dI
+Gv
hJ
hJ
hI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -45037,11 +45037,11 @@ ac
ac
ac
ac
-uH
-uH
+Ga
+Ga
ac
ac
-uH
+Ga
ac
ac
ac
@@ -45053,54 +45053,54 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hJ
hJ
hI
-rP
+by
hJ
hJ
hJ
-Hf
-Hf
-HB
+Nl
+Nl
+Rd
hJ
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -45293,12 +45293,12 @@ ac
ac
ac
ac
-uH
-uH
+Ga
+Ga
ac
ac
ac
-uH
+Ga
ac
ac
ac
@@ -45310,53 +45310,53 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hI
-VU
-Hf
-mJ
+oi
+Nl
+BE
hJ
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -45540,7 +45540,7 @@ ac
ac
ac
ac
-uH
+Ga
ac
ac
ac
@@ -45548,14 +45548,14 @@ ac
ac
ac
ac
-uH
-uH
-uH
+Ga
+Ga
+Ga
ac
ac
ac
ac
-uH
+Ga
ac
ac
ac
@@ -45568,52 +45568,52 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hI
-ZT
-BB
-Wq
+SK
+Be
+pD
hI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
ac
@@ -45796,23 +45796,23 @@ ac
ac
ac
ac
-Yg
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+IL
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ac
ac
ac
ac
-uH
-uH
+Ga
+Ga
ac
ac
ac
@@ -45825,50 +45825,50 @@ ac
ac
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
hJ
hJ
hJ
hI
hI
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -46059,7 +46059,7 @@ ac
ac
ac
ac
-uH
+Ga
ac
ac
ac
@@ -46068,8 +46068,8 @@ ac
ac
ac
ac
-uH
-cP
+Ga
+aG
ac
ac
ac
@@ -46083,47 +46083,47 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -46316,7 +46316,7 @@ ac
ac
ac
ac
-uH
+Ga
ac
ac
ac
@@ -46325,8 +46325,8 @@ ac
ac
ac
ac
-uH
-Wt
+Ga
+WW
ac
ac
ac
@@ -46341,44 +46341,44 @@ dA
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -46573,7 +46573,7 @@ ac
ac
ac
ac
-uH
+Ga
ac
ac
ac
@@ -46582,9 +46582,9 @@ ac
ac
ac
ac
-uH
-uH
-uH
+Ga
+Ga
+Ga
ac
ac
ac
@@ -46599,41 +46599,41 @@ ac
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -46830,7 +46830,7 @@ ac
ac
ac
ac
-uH
+Ga
ac
ac
ac
@@ -46839,10 +46839,10 @@ ac
ac
ac
ac
-uH
-uH
-uH
-ej
+Ga
+Ga
+Ga
+Tl
ac
ac
ac
@@ -46857,38 +46857,38 @@ dA
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -47095,12 +47095,12 @@ ac
ac
ac
ac
-uH
-uH
-cP
-uH
-uH
-uH
+Ga
+Ga
+aG
+Ga
+Ga
+Ga
ac
ac
ac
@@ -47117,33 +47117,33 @@ dA
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -47352,12 +47352,12 @@ ac
ac
ac
ac
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
ac
ac
ac
@@ -47380,20 +47380,20 @@ dA
dA
dA
dA
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
-uH
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
+Ga
dA
dA
dA
@@ -47609,12 +47609,12 @@ ac
ac
ac
ac
-iq
-uH
-Xx
-uH
-uH
-uH
+Pk
+Ga
+PB
+Ga
+Ga
+Ga
ac
ac
ac
@@ -47867,11 +47867,11 @@ ac
ac
ac
ac
-zd
-yl
-xu
-uH
-uH
+Vq
+nn
+zQ
+Ga
+Ga
ac
ac
ac
@@ -48125,8 +48125,8 @@ ac
ac
ac
ac
-uH
-Bh
+Ga
+Dt
ac
ac
ac
diff --git a/_maps/map_files/Blueshift/Blueshift.dmm b/_maps/map_files/Blueshift/Blueshift.dmm
index 12b531c0946a..46d06ee1cc52 100644
--- a/_maps/map_files/Blueshift/Blueshift.dmm
+++ b/_maps/map_files/Blueshift/Blueshift.dmm
@@ -19684,7 +19684,7 @@
"dLv" = (
/obj/structure/bed/dogbed/runtime,
/obj/item/toy/cattoy,
-/mob/living/basic/pet/cat/runtime,
+/mob/living/simple_animal/pet/cat/runtime,
/obj/machinery/requests_console/directional/east{
department = "Chief Medical Officer's Desk";
name = "Chief Medical Officer's Requests Console"
@@ -29444,7 +29444,7 @@
/area/station/engineering/storage_shared)
"fGV" = (
/obj/effect/decal/cleanable/dirt,
-/mob/living/basic/pet/cat,
+/mob/living/simple_animal/pet/cat,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
@@ -83884,7 +83884,7 @@
/turf/open/floor/plating,
/area/station/maintenance/department/medical/central)
"qoz" = (
-/mob/living/basic/pet/cat/space{
+/mob/living/simple_animal/pet/cat/space{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index ee1a649d9306..4dc4436a69d4 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -67232,7 +67232,7 @@
/area/station/engineering/atmos)
"vOV" = (
/obj/structure/bed/dogbed/runtime,
-/mob/living/basic/pet/cat/runtime,
+/mob/living/simple_animal/pet/cat/runtime,
/turf/open/floor/carpet/blue,
/area/station/command/heads_quarters/cmo)
"vOX" = (
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index a124b0ea9867..60b9837a39bd 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -72835,7 +72835,7 @@
dir = 1
},
/obj/item/radio/intercom/directional/south,
-/mob/living/basic/pet/cat/runtime,
+/mob/living/simple_animal/pet/cat/runtime,
/turf/open/floor/iron,
/area/station/command/heads_quarters/cmo)
"rlC" = (
@@ -77854,7 +77854,7 @@
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
"sxb" = (
-/mob/living/basic/pet/cat{
+/mob/living/simple_animal/pet/cat{
name = "Kattail"
},
/obj/structure/cable,
diff --git a/_maps/map_files/Graveyard/Graveyard.dmm b/_maps/map_files/Graveyard/Graveyard.dmm
index 4f804b125dbc..3ddc9961a7bf 100644
--- a/_maps/map_files/Graveyard/Graveyard.dmm
+++ b/_maps/map_files/Graveyard/Graveyard.dmm
@@ -11451,7 +11451,7 @@
/area/station/security/prison/safe)
"evF" = (
/obj/structure/bed/dogbed/runtime,
-/mob/living/basic/pet/cat/runtime,
+/mob/living/simple_animal/pet/cat/runtime,
/obj/item/toy/cattoy,
/obj/machinery/requests_console/auto_name/directional/west,
/obj/effect/mapping_helpers/requests_console/announcement,
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index 39f0f14c61c3..61d3e619a032 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -70250,7 +70250,7 @@
/obj/structure/bed/dogbed/runtime,
/obj/item/toy/cattoy,
/obj/machinery/newscaster/directional/north,
-/mob/living/basic/pet/cat/runtime,
+/mob/living/simple_animal/pet/cat/runtime,
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/cmo)
"wwo" = (
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index f194f875ca48..032d351918d4 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -7925,7 +7925,7 @@
/obj/machinery/airalarm/directional/west,
/obj/structure/bed/dogbed/runtime,
/obj/item/toy/cattoy,
-/mob/living/basic/pet/cat/runtime,
+/mob/living/simple_animal/pet/cat/runtime,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
},
@@ -48556,7 +48556,7 @@
"pjN" = (
/obj/effect/turf_decal/trimline/hot_pink/filled/line,
/obj/structure/cable,
-/mob/living/basic/pet/cat{
+/mob/living/simple_animal/pet/cat{
name = "Pawtton";
desc = "Given as a sign of friendship by The Fleet, with love"
},
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 4ce25a5c1357..c80a32c608dc 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -26285,7 +26285,7 @@
},
/obj/structure/bed/dogbed/runtime,
/obj/item/toy/cattoy,
-/mob/living/basic/pet/cat/runtime,
+/mob/living/simple_animal/pet/cat/runtime,
/turf/open/floor/iron/white,
/area/station/command/heads_quarters/cmo)
"jgt" = (
diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm
index e672383e6a96..db3ee091534d 100644
--- a/_maps/map_files/NorthStar/north_star.dmm
+++ b/_maps/map_files/NorthStar/north_star.dmm
@@ -17862,7 +17862,7 @@
dir = 4
},
/obj/structure/bed/dogbed/runtime,
-/mob/living/basic/pet/cat/runtime,
+/mob/living/simple_animal/pet/cat/runtime,
/turf/open/floor/carpet/royalblue,
/area/station/command/heads_quarters/cmo)
"eHD" = (
diff --git a/_maps/map_files/Ouroboros/Ouroboros.dmm b/_maps/map_files/Ouroboros/Ouroboros.dmm
index 3fefeeb1eac5..b7dc992ac0dc 100644
--- a/_maps/map_files/Ouroboros/Ouroboros.dmm
+++ b/_maps/map_files/Ouroboros/Ouroboros.dmm
@@ -5772,7 +5772,7 @@
/turf/open/floor/iron/dark/smooth_large,
/area/station/security/brig/entrance)
"bJn" = (
-/mob/living/basic/pet/cat,
+/mob/living/simple_animal/pet/cat,
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
"bJq" = (
@@ -21098,7 +21098,7 @@
/turf/open/floor/engine,
/area/station/security/corrections_officer)
"gnC" = (
-/mob/living/basic/pet/cat,
+/mob/living/simple_animal/pet/cat,
/turf/open/floor/plating,
/area/station/service/salon)
"gnX" = (
@@ -77778,7 +77778,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
-/mob/living/basic/pet/cat/jerry,
+/mob/living/simple_animal/pet/cat/jerry,
/turf/open/floor/iron/dark,
/area/station/security/prison)
"wSK" = (
@@ -79718,7 +79718,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/mob/living/basic/pet/cat/runtime,
+/mob/living/simple_animal/pet/cat/runtime,
/obj/structure/cable,
/turf/open/floor/wood,
/area/station/command/heads_quarters/cmo)
diff --git a/_maps/map_files/Theseus/Theseus.dmm b/_maps/map_files/Theseus/Theseus.dmm
index 136ca40ee1a0..0899b3b76496 100644
--- a/_maps/map_files/Theseus/Theseus.dmm
+++ b/_maps/map_files/Theseus/Theseus.dmm
@@ -41275,7 +41275,7 @@
/obj/machinery/light/directional/south,
/obj/structure/window/reinforced/spawner/directional/west,
/obj/structure/bed/dogbed/runtime,
-/mob/living/basic/pet/cat/runtime,
+/mob/living/simple_animal/pet/cat/runtime,
/obj/machinery/firealarm/directional/south,
/obj/machinery/light_switch/directional/south{
pixel_x = -8
diff --git a/_maps/map_files/Voidraptor/VoidRaptor.dmm b/_maps/map_files/Voidraptor/VoidRaptor.dmm
index d1edfa49ee0c..90f843728e58 100644
--- a/_maps/map_files/Voidraptor/VoidRaptor.dmm
+++ b/_maps/map_files/Voidraptor/VoidRaptor.dmm
@@ -11895,7 +11895,7 @@
/area/station/ai_monitored/turret_protected/ai_upload)
"dzp" = (
/obj/structure/window/spawner/directional/south,
-/mob/living/basic/pet/cat/cak,
+/mob/living/simple_animal/pet/cat/cak,
/turf/open/floor/iron/textured_large,
/area/station/maintenance/starboard/greater)
"dzx" = (
@@ -12569,7 +12569,7 @@
anchored = 1;
name = "Jerry's bed"
},
-/mob/living/basic/pet/cat/jerry,
+/mob/living/simple_animal/pet/cat/jerry,
/turf/open/floor/wood,
/area/station/security/prison/garden)
"dIf" = (
@@ -71293,7 +71293,7 @@
/area/station/engineering/atmos)
"tLD" = (
/obj/structure/bed/dogbed/runtime,
-/mob/living/basic/pet/cat/runtime{
+/mob/living/simple_animal/pet/cat/runtime{
icon_dead = "original_dead";
icon_living = "original";
icon_state = "original"
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index 62db22ba8381..801cb6ab3862 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -21547,7 +21547,7 @@
/turf/open/floor/iron/dark/herringbone,
/area/centcom/central_command_areas/evacuation)
"grU" = (
-/mob/living/basic/pet/cat/kitten{
+/mob/living/simple_animal/pet/cat/kitten{
name = "Kbity :3";
desc = "D'aaawwww. Fortune's best friend"
},
@@ -26690,7 +26690,7 @@
/turf/open/floor/iron/dark,
/area/centcom/central_command_areas/medical)
"twW" = (
-/mob/living/basic/pet/cat/cak{
+/mob/living/simple_animal/pet/cat/cak{
name = "Truffle";
desc = "She is a cat made out of cake. How the hell did this thing end up alive, much less here?!"
},
diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm
index f3a8124b26c5..75b0feadf229 100644
--- a/_maps/map_files/tramstation/tramstation.dmm
+++ b/_maps/map_files/tramstation/tramstation.dmm
@@ -5840,7 +5840,7 @@
/obj/structure/bed/dogbed/runtime,
/obj/machinery/light/directional/north,
/obj/structure/sign/clock/directional/north,
-/mob/living/basic/pet/cat/runtime,
+/mob/living/simple_animal/pet/cat/runtime,
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/cmo)
"aOF" = (
@@ -36423,7 +36423,7 @@
desc = "A comfy-looking cat bed. You can even strap your pet in, in case the gravity turns off.";
name = "cat bed"
},
-/mob/living/basic/pet/cat/jerry,
+/mob/living/simple_animal/pet/cat/jerry,
/turf/open/floor/iron,
/area/station/maintenance/tram/mid)
"kxX" = (
diff --git a/_maps/shuttles/emergency_hugcage.dmm b/_maps/shuttles/emergency_hugcage.dmm
index cd1d97b043e8..307c1d2477b0 100644
--- a/_maps/shuttles/emergency_hugcage.dmm
+++ b/_maps/shuttles/emergency_hugcage.dmm
@@ -280,7 +280,7 @@
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"Hf" = (
-/mob/living/basic/pet/cat/kitten,
+/mob/living/simple_animal/pet/cat/kitten,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"IH" = (
diff --git a/_maps/virtual_domains/pipedream.dmm b/_maps/virtual_domains/pipedream.dmm
index eaaf1af712c2..9bc3b3a9b40c 100644
--- a/_maps/virtual_domains/pipedream.dmm
+++ b/_maps/virtual_domains/pipedream.dmm
@@ -1644,7 +1644,7 @@
/turf/open/floor/plating,
/area/virtual_domain/powered)
"Ym" = (
-/mob/living/basic/pet/cat/space,
+/mob/living/simple_animal/pet/cat/space,
/obj/structure/bed/dogbed{
name = "cat bed"
},
diff --git a/code/__DEFINES/ai/ai.dm b/code/__DEFINES/ai/ai.dm
index d58dda3dbbac..8bcb27351573 100644
--- a/code/__DEFINES/ai/ai.dm
+++ b/code/__DEFINES/ai/ai.dm
@@ -25,16 +25,6 @@
///Flags for ai_behavior new()
#define AI_CONTROLLER_INCOMPATIBLE (1<<0)
-//Return flags for ai_behavior/perform()
-///Update this behavior's cooldown
-#define AI_BEHAVIOR_DELAY (1<<0)
-///Finish the behavior successfully
-#define AI_BEHAVIOR_SUCCEEDED (1<<1)
-///Finish the behavior unsuccessfully
-#define AI_BEHAVIOR_FAILED (1<<1)
-
-#define AI_BEHAVIOR_INSTANT (NONE)
-
///Does this task require movement from the AI before it can be performed?
#define AI_BEHAVIOR_REQUIRE_MOVEMENT (1<<0)
///Does this require the current_movement_target to be adjacent and in reach?
diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm
index ee38e759a3bd..6807990c1b6d 100644
--- a/code/__DEFINES/ai/ai_blackboard.dm
+++ b/code/__DEFINES/ai/ai_blackboard.dm
@@ -114,18 +114,6 @@
///list of foods this mob likes
#define BB_BASIC_FOODS "BB_basic_foods"
-///key holding any food we've found
-#define BB_TARGET_FOOD "BB_TARGET_FOOD"
-
-///key holding emotes we play after eating
-#define BB_EAT_EMOTES "BB_eat_emotes"
-
-///key holding the next time we eat
-#define BB_NEXT_FOOD_EAT "BB_next_food_eat"
-
-///key holding our eating cooldown
-#define BB_EAT_FOOD_COOLDOWN "BB_eat_food_cooldown"
-
/// Blackboard key for a held item
#define BB_SIMPLE_CARRY_ITEM "BB_SIMPLE_CARRY_ITEM"
diff --git a/code/__DEFINES/ai/bot_keys.dm b/code/__DEFINES/ai/bot_keys.dm
index 3c9a8551f501..5cf2e4263d42 100644
--- a/code/__DEFINES/ai/bot_keys.dm
+++ b/code/__DEFINES/ai/bot_keys.dm
@@ -35,10 +35,6 @@
#define BB_NEAR_DEATH_SPEECH "near_death_speech"
///in crit patient we must alert medbay about
#define BB_PATIENT_IN_CRIT "patient_in_crit"
-///how much time interval before we clear list
-#define BB_UNREACHABLE_LIST_COOLDOWN "unreachable_list_cooldown"
-///can we clear the list now
-#define BB_CLEAR_LIST_READY "clear_list_ready"
// cleanbots
///key that holds the foaming ability
diff --git a/code/__DEFINES/ai/monkey.dm b/code/__DEFINES/ai/monkey.dm
index 0e8c44e40fa8..fc4af74d9f08 100644
--- a/code/__DEFINES/ai/monkey.dm
+++ b/code/__DEFINES/ai/monkey.dm
@@ -15,4 +15,3 @@
#define BB_MONKEY_TARGET_MONKEYS "BB_monkey_target_monkeys"
#define BB_MONKEY_DISPOSING "BB_monkey_disposing"
#define BB_MONKEY_RECRUIT_COOLDOWN "BB_monkey_recruit_cooldown"
-#define BB_RESISTING "BB_resisting"
diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm
index 421a73085c83..f403d7cec39c 100644
--- a/code/__DEFINES/ai/monsters.dm
+++ b/code/__DEFINES/ai/monsters.dm
@@ -122,10 +122,6 @@
#define BB_MINEBOT_DUMP_ABILITY "minebot_dump_ability"
/// key that stores our target turf
#define BB_TARGET_MINERAL_TURF "target_mineral_turf"
-///key that holds our missile ability
-#define BB_MINEBOT_MISSILE_ABILITY "minebot_missile_ability"
-///key that holds our landmine ability
-#define BB_MINEBOT_LANDMINE_ABILITY "minebot_landmine_ability"
/// key that stores list of the turfs we ignore
#define BB_BLACKLIST_MINERAL_TURFS "blacklist_mineral_turfs"
/// key that stores the previous blocked wall
@@ -134,20 +130,6 @@
#define BB_AUTOMATED_MINING "automated_mining"
/// key that stores the nearest dead human
#define BB_NEARBY_DEAD_MINER "nearby_dead_miner"
-///key that holds the drone we defend
-#define BB_DRONE_DEFEND "defend_drone"
-///key that holds the minimum distance before we flee
-#define BB_MINIMUM_SHOOTING_DISTANCE "minimum_shooting_distance"
-///key that holds the miner we must befriend
-#define BB_MINER_FRIEND "miner_friend"
-///key that holds the missile target
-#define BB_MINEBOT_MISSILE_TARGET "minebot_missile_target"
-///should we auto protect?
-#define BB_MINEBOT_AUTO_DEFEND "minebot_auto_defend"
-///should we repair drones?
-#define BB_MINEBOT_REPAIR_DRONE "minebot_repair_drone"
-///should we plant mines?
-#define BB_MINEBOT_PLANT_MINES "minebot_plant_mines"
//seedling keys
/// the water can we will pick up
@@ -235,31 +217,3 @@
#define BB_WIZARD_BLINK_SPELL "BB_wizard_blink_spell"
/// Key for the next time we can cast a spell
#define BB_WIZARD_SPELL_COOLDOWN "BB_wizard_spell_cooldown"
-
-//cat AI keys
-/// key that holds the target we will battle over our turf
-#define BB_TRESSPASSER_TARGET "tresspasser_target"
-/// key that holds angry meows
-#define BB_HOSTILE_MEOWS "hostile_meows"
-/// key that holds the mouse target
-#define BB_MOUSE_TARGET "mouse_target"
-/// key that holds our dinner target
-#define BB_CAT_FOOD_TARGET "cat_food_target"
-/// key that holds the food we must deliver
-#define BB_FOOD_TO_DELIVER "food_to_deliver"
-/// key that holds things we can hunt
-#define BB_HUNTABLE_PREY "huntable_prey"
-/// key that holds target kitten to feed
-#define BB_KITTEN_TO_FEED "kitten_to_feed"
-/// key that holds our hungry meows
-#define BB_HUNGRY_MEOW "hungry_meows"
-/// key that holds maximum distance food is to us so we can pursue it
-#define BB_MAX_DISTANCE_TO_FOOD "max_distance_to_food"
-/// key that holds the stove we must turn off
-#define BB_STOVE_TARGET "stove_target"
-/// key that holds the donut we will decorate
-#define BB_DONUT_TARGET "donut_target"
-/// key that holds our home...
-#define BB_CAT_HOME "cat_home"
-/// key that holds the human we will beg
-#define BB_HUMAN_BEG_TARGET "human_beg_target"
diff --git a/code/__DEFINES/ai/pet_commands.dm b/code/__DEFINES/ai/pet_commands.dm
index 7404cb9acda8..1e692b9f805a 100644
--- a/code/__DEFINES/ai/pet_commands.dm
+++ b/code/__DEFINES/ai/pet_commands.dm
@@ -7,6 +7,3 @@
#define BB_PET_TARGETING_STRATEGY "BB_pet_targeting"
/// Typecache of weakrefs to mobs this mob is friends with, will follow their instructions and won't attack them
#define BB_FRIENDS_LIST "BB_friends_list"
-
-///mothroach next meal key!
-#define BB_MOTHROACH_NEXT_EAT "mothroach_next_eat"
diff --git a/code/__DEFINES/ai/pets.dm b/code/__DEFINES/ai/pets.dm
index f6527463075d..e41c9ac0c3ff 100644
--- a/code/__DEFINES/ai/pets.dm
+++ b/code/__DEFINES/ai/pets.dm
@@ -50,7 +50,4 @@
#define BB_HOARD_LOCATION_RANGE "hoard_location_range"
/// key that holds items we arent interested in hoarding
#define BB_IGNORE_ITEMS "ignore_items"
-///the name of our trick
-#define BB_TRICK_NAME "trick_name"
-///the sequence of our trick
-#define BB_TRICK_SEQUENCE "trick_sequence"
+
diff --git a/code/__DEFINES/basic_mobs.dm b/code/__DEFINES/basic_mobs.dm
index 02b528d12626..c7275f7c423e 100644
--- a/code/__DEFINES/basic_mobs.dm
+++ b/code/__DEFINES/basic_mobs.dm
@@ -12,8 +12,6 @@
#define FLAMMABLE_MOB (1<<3)
/// Mob never takes damage from unarmed attacks
#define IMMUNE_TO_FISTS (1<<4)
-/// Disables the function of attacking random body zones
-#define PRECISE_ATTACK_ZONES (1<<6)
/// Temporary trait applied when an attack forecast animation has completed
#define TRAIT_BASIC_ATTACK_FORECAST "trait_basic_attack_forecast"
@@ -22,9 +20,6 @@
/// Above this speed we stop gliding because it looks silly
#define END_GLIDE_SPEED 10
-///hunger cooldown for basic mobs
-#define EAT_FOOD_COOLDOWN 45 SECONDS
-
///mook attack status flags
#define MOOK_ATTACK_NEUTRAL 0
#define MOOK_ATTACK_WARMUP 1
@@ -33,6 +28,3 @@
///keeps track of how many gutlunches are born
GLOBAL_VAR_INIT(gutlunch_count, 0)
-
-///Pet customization settings saved for every client
-GLOBAL_LIST_EMPTY(customized_pets)
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index ba46fc210693..d6de977fecb6 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -275,8 +275,6 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define TOTAL_BODYPART_COUNT 6
-GLOBAL_LIST_INIT(all_body_zones, list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
-GLOBAL_LIST_INIT(limb_zones, list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
GLOBAL_LIST_INIT(arm_zones, list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
#define BODY_ZONE_PRECISE_EYES "eyes"
diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm
index 5641b4affce3..a40436e77365 100644
--- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm
+++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm
@@ -50,16 +50,6 @@
#define COMPONENT_BLOCK_TOOL_ATTACK (1<<0)
///for any rightclick tool behaviors: (mob/living/user, obj/item/I)
#define COMSIG_ATOM_SECONDARY_TOOL_ACT(tooltype) "tool_secondary_act_[tooltype]"
-
-/// Sent from [atom/proc/ranged_item_interaction], when this atom is left-clicked on by a mob with an item while not adjacent
-#define COMSIG_ATOM_RANGED_ITEM_INTERACTION "atom_ranged_item_interaction"
-/// Sent from [atom/proc/ranged_item_interaction], when this atom is right-clicked on by a mob with an item while not adjacent
-#define COMSIG_ATOM_RANGED_ITEM_INTERACTION_SECONDARY "atom_ranged_item_interaction_secondary"
-/// Sent from [atom/proc/ranged_item_interaction], when a mob is using this item while left-clicking on by an atom while not adjacent
-#define COMSIG_RANGED_ITEM_INTERACTING_WITH_ATOM "ranged_item_interacting_with_atom"
-/// Sent from [atom/proc/ranged_item_interaction], when a mob is using this item while right-clicking on by an atom while not adjacent
-#define COMSIG_RANGED_ITEM_INTERACTING_WITH_ATOM_SECONDARY "ranged_item_interacting_with_atom_secondary"
-
// We have the same returns here as COMSIG_ATOM_TOOL_ACT
// #define COMPONENT_BLOCK_TOOL_ATTACK (1<<0)
#define COMSIG_ATOM_DOOR_OPEN "atom_door_open"
diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm
index 8f8a194c78ca..c067427b88ad 100644
--- a/code/__DEFINES/dcs/signals/signals_fish.dm
+++ b/code/__DEFINES/dcs/signals/signals_fish.dm
@@ -9,8 +9,6 @@
#define COMSIG_FISH_LIFE "fish_life"
///From /datum/fish_trait/eat_fish: (predator)
#define COMSIG_FISH_EATEN_BY_OTHER_FISH "fish_eaten_by_other_fish"
-///From /obj/item/fish/generate_reagents_to_add, which returns a holder when the fish is eaten or composted for example: (list/reagents)
-#define COMSIG_GENERATE_REAGENTS_TO_ADD "generate_reagents_to_add"
///From /obj/item/fish/feed: (fed_reagents, fed_reagent_type)
#define COMSIG_FISH_FED "fish_on_fed"
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
index 5cac1d350b77..4fdb0479fe34 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
@@ -145,12 +145,7 @@
#define COMSIG_LIVING_WALL_EXITED "living_wall_exited"
///From base of mob/living/ZImpactDamage() (mob/living, levels, turf/t)
#define COMSIG_LIVING_Z_IMPACT "living_z_impact"
- /// Just for the signal return, does not run normal living handing of z fall damage for mobs
- #define ZIMPACT_CANCEL_DAMAGE (1<<0)
- /// Do not show default z-impact message
- #define ZIMPACT_NO_MESSAGE (1<<1)
- /// Do not do the spin animation when landing
- #define ZIMPACT_NO_SPIN (1<<2)
+ #define NO_Z_IMPACT_DAMAGE (1<<0)
/// From mob/living/try_speak(): (message, ignore_spam, forced)
#define COMSIG_LIVING_TRY_SPEECH "living_vocal_speech"
@@ -220,10 +215,6 @@
/// From /datum/ai/behavior/climb_tree/perform() : (mob/living/basic/living_pawn)
#define COMSIG_LIVING_CLIMB_TREE "living_climb_tree"
-///from /mob/living/proc/check_block(): (atom/hit_by, damage, attack_text, attack_type, armour_penetration, damage_type)
-#define COMSIG_LIVING_CHECK_BLOCK "living_check_block"
- #define SUCCESSFUL_BLOCK (1<<0)
-
/// Sent on a mob from /datum/component/mob_chain when component is attached with it as the "front" : (mob/living/basic/tail)
#define COMSIG_MOB_GAINED_CHAIN_TAIL "living_gained_chain_tail"
/// Sent on a mob from /datum/component/mob_chain when component is detached from it as the "front" : (mob/living/basic/tail)
diff --git a/code/__DEFINES/fish.dm b/code/__DEFINES/fish.dm
index 4360c16aacbb..89b7963d91d5 100644
--- a/code/__DEFINES/fish.dm
+++ b/code/__DEFINES/fish.dm
@@ -97,11 +97,8 @@
///Fish size thresholds for w_class.
#define FISH_SIZE_TINY_MAX 30
#define FISH_SIZE_SMALL_MAX 50
-#define FISH_SIZE_NORMAL_MAX 80
-#define FISH_SIZE_BULKY_MAX 120
-///size threshold for requiring two-handed carry
-#define FISH_SIZE_TWO_HANDS_REQUIRED 135
-#define FISH_SIZE_HUGE_MAX 165
+#define FISH_SIZE_NORMAL_MAX 90
+#define FISH_SIZE_BULKY_MAX 130
///The coefficient for maximum weight/size divergence relative to the averages.
#define MAX_FISH_DEVIATION_COEFF 2.5
@@ -111,19 +108,6 @@
///The number of fillets is multiplied by the fish' size and divided by this.
#define FISH_FILLET_NUMBER_SIZE_DIVISOR 30
-///The slowdown of the fish when carried begins at this value
-#define FISH_WEIGHT_SLOWDOWN 2100
-///The value of the slowdown equals to the weight divided by this (and then at the power of a sub-1 exponent)
-#define FISH_WEIGHT_SLOWDOWN_DIVISOR 500
-///The sub-one exponent that results in the final slowdown of the fish item
-#define FISH_WEIGHT_SLOWDOWN_EXPONENT 0.54
-///Used to calculate the force of the fish by comparing (1 + log(weight/this_define)) and the w_class of the item.
-#define FISH_WEIGHT_FORCE_DIVISOR 250
-///The multiplier used in the FISH_WEIGHT_BITE_DIVISOR define
-#define FISH_WEIGHT_GRIND_TO_BITE_MULT 0.4
-///Used to calculate how many bites a fish can take and therefore the amount of reagents it has.
-#define FISH_WEIGHT_BITE_DIVISOR (FISH_GRIND_RESULTS_WEIGHT_DIVISOR * FISH_WEIGHT_GRIND_TO_BITE_MULT)
-
///The breeding timeout for newly instantiated fish is multiplied by this.
#define NEW_FISH_BREEDING_TIMEOUT_MULT 2
///The last feeding timestamp of newly instantiated fish is multiplied by this: ergo, they spawn 50% hungry.
@@ -145,70 +129,8 @@
#define AQUARIUM_FLUID_SALTWATER "Saltwater"
#define AQUARIUM_FLUID_SULPHWATEVER "Sulfuric Water"
#define AQUARIUM_FLUID_AIR "Air"
-#define AQUARIUM_FLUID_ANADROMOUS "Anadromous"
-#define AQUARIUM_FLUID_ANY_WATER "Any Fluid"
+#define AQUARIUM_FLUID_ANADROMOUS "Adaptive to both Freshwater and Saltwater"
+#define AQUARIUM_FLUID_ANY_WATER "Adaptive to all kind of water"
///Fluff. The name of the aquarium company shown in the fish catalog
#define AQUARIUM_COMPANY "Aquatech Ltd."
-
-/// how long between electrogenesis zaps
-#define ELECTROGENESIS_DURATION 40 SECONDS
-
-/// a random range the electrogenesis cooldown varies by
-#define ELECTROGENESIS_VARIANCE (rand(-10 SECONDS, 10 SECONDS))
-
-#define FISH_BEAUTY_DISGUSTING -500
-#define FISH_BEAUTY_UGLY -300
-#define FISH_BEAUTY_BAD -200
-#define FISH_BEAUTY_NULL 0
-#define FISH_BEAUTY_GENERIC 250
-#define FISH_BEAUTY_GOOD 450
-#define FISH_BEAUTY_GREAT 600
-#define FISH_BEAUTY_EXCELLENT 700
-
-//Fish breeding stops if fish count exceeds this.
-#define AQUARIUM_MAX_BREEDING_POPULATION 20
-
-//Minigame defines
-/// The height of the minigame slider. Not in pixels, but minigame units.
-#define FISHING_MINIGAME_AREA 1000
-
-///The fish needs to be cooked for at least this long so that it can be safely eaten
-#define FISH_SAFE_COOKING_DURATION 30 SECONDS
-
-///Defines for fish properties from the collect_fish_properties proc
-#define FISH_PROPERTIES_FAV_BAIT "fav_bait"
-#define FISH_PROPERTIES_BAD_BAIT "bad_bait"
-#define FISH_PROPERTIES_TRAITS "fish_traits"
-#define FISH_PROPERTIES_BEAUTY_SCORE "beauty_score"
-#define FISH_PROPERTIES_EVOLUTIONS "evolutions"
-
-///Define for favorite and disliked baits that aren't just item typepaths.
-#define FISH_BAIT_TYPE "Type"
-#define FISH_BAIT_FOODTYPE "Foodtype"
-#define FISH_BAIT_REAGENT "Reagent"
-#define FISH_BAIT_VALUE "Value"
-#define FISH_BAIT_AMOUNT "Amount"
-
-///We multiply the weight of fish inside the loot table by this value if we are goofy enough to fish without a bait.
-#define FISH_WEIGHT_MULT_WITHOUT_BAIT 0.15
-
-/**
- * A macro to ensure the wikimedia filenames of fish icons are unique, especially since there're a couple fish that have
- * quite ambiguous names/icon_states like "checkered" or "pike"
- */
-#define FISH_AUTOWIKI_FILENAME(fish) SANITIZE_FILENAME("[initial(fish.icon_state)]_wiki_fish")
-
-///The list keys for the autowiki for fish sources
-#define FISH_SOURCE_AUTOWIKI_NAME "name"
-#define FISH_SOURCE_AUTOWIKI_ICON "icon"
-#define FISH_SOURCE_AUTOWIKI_WEIGHT "weight"
-#define FISH_SOURCE_AUTOWIKI_WEIGHT_SUFFIX "weight_suffix"
-#define FISH_SOURCE_AUTOWIKI_NOTES "notes"
-
-///Special value for the name key that always comes first when the data is sorted, regardless of weight.
-#define FISH_SOURCE_AUTOWIKI_DUD "Nothing"
-///Special value for the name key that always comes last
-#define FISH_SOURCE_AUTOWIKI_OTHER "Other Stuff"
-///The filename for the icon for "other stuff" which we don't articulate about on the autowiki
-#define FISH_SOURCE_AUTOWIKI_QUESTIONMARK "questionmark"
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index e6d8a8bd744b..c9b4aa597b57 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -187,8 +187,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define FLOATING (1<<3)
/// When moving, will Cross() everything, but won't stop or Bump() anything.
#define PHASING (1<<4)
-/// The mob is walking on the ceiling. Or is generally just, upside down.
-#define UPSIDE_DOWN (1<<5)
//Fire and Acid stuff, for resistance_flags
#define LAVA_PROOF (1<<0)
diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm
index 51187b4d9bce..74d5699a45a0 100644
--- a/code/__DEFINES/food.dm
+++ b/code/__DEFINES/food.dm
@@ -100,21 +100,12 @@ DEFINE_BITFIELD(foodtypes, list(
#define FOOD_IN_CONTAINER (1<<0)
/// Finger food can be eaten while walking / running around
#define FOOD_FINGER_FOOD (1<<1)
-/// Examining this edible won't show infos on food types, bites and remote tasting etc.
-#define FOOD_NO_EXAMINE (1<<2)
-/// This food item doesn't track bitecounts, use responsibly.
-#define FOOD_NO_BITECOUNT (1<<3)
DEFINE_BITFIELD(food_flags, list(
"FOOD_FINGER_FOOD" = FOOD_FINGER_FOOD,
"FOOD_IN_CONTAINER" = FOOD_IN_CONTAINER,
- "FOOD_NO_EXAMINE" = FOOD_NO_EXAMINE,
- "FOOD_NO_BITECOUNT" = FOOD_NO_BITECOUNT,
))
-///Define for return value of the after_eat callback that will call OnConsume if it hasn't already.
-#define FOOD_AFTER_EAT_CONSUME_ANYWAY 2
-
#define STOP_SERVING_BREAKFAST (15 MINUTES)
#define FOOD_MEAT_NORMAL 5
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 5ced17323b3c..a9b1b0f8d41b 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -151,7 +151,7 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list(
#define ismining(A) (istype(A, /mob/living/simple_animal/hostile/asteroid) || istype(A, /mob/living/basic/mining))
-//Simple + Basic animals
+//Simple animals
#define isanimal(A) (istype(A, /mob/living/simple_animal))
#define isrevenant(A) (istype(A, /mob/living/basic/revenant))
@@ -166,7 +166,7 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list(
#define isdrone(A) (istype(A, /mob/living/basic/drone))
-#define iscat(A) (istype(A, /mob/living/basic/pet/cat))
+#define iscat(A) (istype(A, /mob/living/simple_animal/pet/cat))
#define isdog(A) (istype(A, /mob/living/basic/pet/dog))
diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm
index cd2d85b7c13d..f00075a020c4 100644
--- a/code/__DEFINES/sound.dm
+++ b/code/__DEFINES/sound.dm
@@ -185,5 +185,3 @@ GLOBAL_LIST_INIT(announcer_keys, list(
#define SFX_CRUNCHY_BUSH_WHACK "crunchy_bush_whack"
#define SFX_TREE_CHOP "tree_chop"
#define SFX_ROCK_TAP "rock_tap"
-#define SFX_CAT_MEOW "cat_meow"
-#define SFX_CAT_PURR "cat_purr"
diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm
index 6891bb053d92..76031d5a3830 100644
--- a/code/__DEFINES/tools.dm
+++ b/code/__DEFINES/tools.dm
@@ -34,13 +34,3 @@
/// When [TOOL_ACT_TOOLTYPE_SUCCESS] or [TOOL_ACT_SIGNAL_BLOCKING] are set
#define TOOL_ACT_MELEE_CHAIN_BLOCKING (TOOL_ACT_TOOLTYPE_SUCCESS | TOOL_ACT_SIGNAL_BLOCKING)
-/// Return when an item interaction is successful.
-/// This cancels the rest of the chain entirely and indicates success.
-#define ITEM_INTERACT_SUCCESS (1<<0) // Same as TRUE, as most tool (legacy) tool acts return TRUE on success
-/// Return to prevent the rest of the attack chain from being executed / preventing the item user from thwacking the target.
-/// Similar to [ITEM_INTERACT_SUCCESS], but does not necessarily indicate success.
-#define ITEM_INTERACT_BLOCKING (1<<1)
- /// Only for people who get confused by the naming scheme
- #define ITEM_INTERACT_FAILURE ITEM_INTERACT_BLOCKING
-/// Return to skip the rest of the interaction chain, going straight to attack.
-#define ITEM_INTERACT_SKIP_TO_ATTACK (1<<2)
diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index 180c9e7e191b..e7240f0c392b 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -236,8 +236,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/* #define TRAIT_NO_STAGGER "no_stagger" */
/// Getting hit by thrown movables won't push you away
/* #define TRAIT_NO_THROW_HITPUSH "no_throw_hitpush" */
-/// This mob likes to eat fish. Raw, uncut fish.
-#define TRAIT_FISH_EATER "fish_eater"
///Added to mob or mind, changes the icons of the fish shown in the minigame UI depending on the possible reward.
#define TRAIT_REVEAL_FISH "reveal_fish"
///This trait gets you a list of fishes that can be caught when examining a fishing spot.
@@ -251,7 +249,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// This trait lets you evaluate someone's fitness level against your own
/* #define TRAIT_EXAMINE_FITNESS "reveal_power_level" */
/// These mobs have particularly hygienic tongues
-#define TRAIT_WOUND_LICKER "wound_licker"
+/* #define TRAIT_WOUND_LICKER "wound_licker" */
/// Mobs with this trait are allowed to use silicon emotes
/* #define TRAIT_SILICON_EMOTES_ALLOWED "silicon_emotes_allowed" */
@@ -766,8 +764,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_FOOD_GRILLED "food_grilled"
/// If this item's been fried
#define TRAIT_FOOD_FRIED "food_fried"
-/// If this item's been bbq grilled
-#define TRAIT_FOOD_BBQ_GRILLED "food_bbq_grilled"
/// This is a silver slime created item
#define TRAIT_FOOD_SILVER "food_silver"
/// If this item's been made by a chef instead of being map-spawned or admin-spawned or such
@@ -818,8 +814,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_HAUNTED "haunted"
/// An item that, if it has contents, will ignore its contents when scanning for contraband.
/* #define TRAIT_CONTRABAND_BLOCKER "contraband_blocker" */
-/// For edible items that cannot be composted inside hydro trays
-#define TRAIT_UNCOMPOSTABLE "uncompostable"
//quirk traits
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
@@ -857,10 +851,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_THROWINGARM "throwing_arm"
#define TRAIT_SETTLER "settler"
/* #define TRAIT_STRONG_STOMACH "strong_stomach" */
-#define TRAIT_VEGETARIAN "trait_vegetarian"
/// This mob always lands on their feet when they fall, for better or for worse.
-#define TRAIT_CATLIKE_GRACE "catlike_grace"
+/* #define TRAIT_CATLIKE_GRACE "catlike_grace" */
///if the atom has a sticker attached to it
#define TRAIT_STICKERED "stickered"
@@ -987,7 +980,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_FISH_AMPHIBIOUS "fish_amphibious"
///Trait needed for the lubefish evolution
#define TRAIT_FISH_FED_LUBE "fish_fed_lube"
-#define TRAIT_FISH_WELL_COOKED "fish_well_cooked"
#define TRAIT_FISH_NO_HUNGER "fish_no_hunger"
///It comes from a fish case. Relevant for bounties so far.
/* #define TRAIT_FISH_FROM_CASE "fish_from_case" */
@@ -1203,7 +1195,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Trait given to mobs that we do not want to mindswap
#define TRAIT_NO_MINDSWAP "no_mindswap"
///trait given to food that can be baked by /datum/component/bakeable
-#define TRAIT_BAKEABLE "bakeable"
+/* #define TRAIT_BAKEABLE "bakeable" */
/// Trait given to foam darts that have an insert in them
/* #define TRAIT_DART_HAS_INSERT "dart_has_insert" */
@@ -1217,12 +1209,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
///Trait granted by janitor skillchip, allows communication with cleanbots
#define TRAIT_CLEANBOT_WHISPERER "cleanbot_whisperer"
-///Trait granted by the miner skillchip, allows communication with minebots
-#define TRAIT_ROCK_STONER "rock_stoner"
-
-///Trait given by the regenerative shield component
-#define TRAIT_REGEN_SHIELD "regen_shield"
-
///Trait granted by the miner skillchip, allows communication with minebots
/* #define TRAIT_ROCK_STONER "rock_stoner" */
@@ -1296,17 +1282,4 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Trait applied to objects and mobs that can attack a boulder and break it down. (See /obj/item/boulder/manual_process())
#define TRAIT_BOULDER_BREAKER "boulder_breaker"
-/**
- *
- * This trait is used in some interactions very high in the interaction chain to allow
- * certain atoms to be skipped by said interactions if the user is in combat mode.
- *
- * Its primarily use case is for stuff like storage and tables, to allow things like emags to be bagged
- * (because in some contexts you might want to be emagging a bag, and in others you might want to be storing it.)
- *
- * This is only checked by certain items explicitly so you can't just add the trait and expect it to work.
- * (This may be changed later but I chose to do it this way to avoid messing up interactions which require combat mode)
- */
-#define TRAIT_COMBAT_MODE_SKIP_INTERACTION "combat_mode_skip_interaction"
-
// END TRAIT DEFINES
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index 3fed2d9ac3f5..5eb92dd15cf3 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -318,7 +318,7 @@
RETURN_TYPE(/list)
. = list()
for(var/atom/atom_checked as anything in atoms)
- if(atom_checked && typecache[atom_checked.type]) // monkestation edit
+ if (typecache[atom_checked.type])
. += atom_checked
///return a new list with atoms that are not in the typecache list
@@ -326,14 +326,14 @@
RETURN_TYPE(/list)
. = list()
for(var/atom/atom_checked as anything in atoms)
- if(atom_checked && !typecache[atom_checked.type]) // monkestation edit
+ if(!typecache[atom_checked.type])
. += atom_checked
///similar to typecache_filter_list and typecache_filter_list_reverse but it supports an inclusion list and and exclusion list
/proc/typecache_filter_multi_list_exclusion(list/atoms, list/typecache_include, list/typecache_exclude)
. = list()
for(var/atom/atom_checked as anything in atoms)
- if(atom_checked && typecache_include[atom_checked.type] && !typecache_exclude[atom_checked.type]) // monkestation edit
+ if(typecache_include[atom_checked.type] && !typecache_exclude[atom_checked.type])
. += atom_checked
/**
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index f979087b0f84..359ec78a4678 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -58,7 +58,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_WEATHER_IMMUNE" = TRAIT_WEATHER_IMMUNE,
/* "TRAIT_BOULDER_BREAKER" = TRAIT_BOULDER_BREAKER, */
/* "TRAIT_CHASM_STOPPER" = TRAIT_CHASM_STOPPER, */
- "TRAIT_COMBAT_MODE_SKIP_INTERACTION" = TRAIT_COMBAT_MODE_SKIP_INTERACTION,
/* "TRAIT_HAS_LABEL" = TRAIT_HAS_LABEL, */
/* "TRAIT_IMMERSED" = TRAIT_IMMERSED, */
/* "TRAIT_INNER_DARKNESS" = TRAIT_INNER_DARKNESS, */
@@ -189,7 +188,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_CLUMSY" = TRAIT_CLUMSY,
"TRAIT_COAGULATING" = TRAIT_COAGULATING,
"TRAIT_COLDBLOODED" = TRAIT_COLDBLOODED,
- "TRAIT_COLD_BLOODED" = TRAIT_COLD_BLOODED,
"TRAIT_CONVERSION_FLASHED" = TRAIT_CONVERSION_FLASHED,
"TRAIT_CORPSELOCKED" = TRAIT_CORPSELOCKED,
"TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION,
@@ -234,7 +232,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_FEARLESS" = TRAIT_FEARLESS,
"TRAIT_FEEBLE" = TRAIT_FEEBLE,
"TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER,
- "TRAIT_FISH_EATER" = TRAIT_FISH_EATER,
"TRAIT_FINGERPRINT_PASSTHROUGH" = TRAIT_FINGERPRINT_PASSTHROUGH,
"TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS,
"TRAIT_FLESH_DESIRE" = TRAIT_FLESH_DESIRE,
@@ -433,7 +430,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_REVIVES_BY_HEALING" = TRAIT_REVIVES_BY_HEALING,
"TRAIT_RIFT_FAILURE" = TRAIT_RIFT_FAILURE,
"TRAIT_ROBOT_CAN_BLEED" = TRAIT_ROBOT_CAN_BLEED,
- "TRAIT_ROCK_STONER" = TRAIT_ROCK_STONER,
"TRAIT_ROD_SUPLEX" = TRAIT_ROD_SUPLEX,
"TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO,
"TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD,
@@ -506,7 +502,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_USED_DNA_VAULT" = TRAIT_USED_DNA_VAULT,
"TRAIT_USES_SKINTONES" = TRAIT_USES_SKINTONES,
"TRAIT_VATGROWN" = TRAIT_VATGROWN,
- "TRAIT_VEGETARIAN" = TRAIT_VEGETARIAN,
"TRAIT_VAULTING" = TRAIT_VAULTING,
"TRAIT_VENTCRAWLER_ALWAYS" = TRAIT_VENTCRAWLER_ALWAYS,
"TRAIT_VENTCRAWLER_NUDE" = TRAIT_VENTCRAWLER_NUDE,
@@ -521,10 +516,10 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_WINE_TASTER" = TRAIT_WINE_TASTER,
"TRAIT_WING_BUFFET" = TRAIT_WING_BUFFET,
"TRAIT_WING_BUFFET_TIRED" = TRAIT_WING_BUFFET_TIRED,
- "TRAIT_WOUND_LICKER" = TRAIT_WOUND_LICKER,
"TRAIT_XENO_HOST" = TRAIT_XENO_HOST,
"TRAIT_XENO_IMMUNE" = TRAIT_XENO_IMMUNE,
"TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION,
+ "TRAIT_COLD_BLOODED" = TRAIT_COLD_BLOODED,
"TRAIT_ZOMBIE_CONSUMED" = TRAIT_ZOMBIE_CONSUMED,
/* "TRAIT_ADAMANTINE_EXTRACT_ARMOR" = TRAIT_ADAMANTINE_EXTRACT_ARMOR, */
/* "TRAIT_ALWAYS_WANTED" = TRAIT_ALWAYS_WANTED, */
@@ -538,7 +533,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
/* "TRAIT_BOT_PATH_HUD" = TRAIT_BOT_PATH_HUD, */
/* "TRAIT_BOXING_READY" = TRAIT_BOXING_READY, */
/* "TRAIT_BRAWLING_KNOCKDOWN_BLOCKED" = TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, */
- "TRAIT_CATLIKE_GRACE" = TRAIT_CATLIKE_GRACE,
+ /* "TRAIT_CATLIKE_GRACE" = TRAIT_CATLIKE_GRACE, */
/* "TRAIT_DETECTIVES_TASTE" = TRAIT_DETECTIVES_TASTE, */
/* "TRAIT_DISCO_DANCER" = TRAIT_DISCO_DANCER, */
/* "TRAIT_DISPLAY_JOB_IN_BINARY" = TRAIT_DISPLAY_JOB_IN_BINARY, */
@@ -588,7 +583,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
/* "TRAIT_PERCEIVED_AS_CLOWN" = TRAIT_PERCEIVED_AS_CLOWN, */
/* "TRAIT_PROFOUND_FISHER" = TRAIT_PROFOUND_FISHER, */
/* "TRAIT_RECENTLY_BLOCKED_MAGIC" = TRAIT_RECENTLY_BLOCKED_MAGIC, */
- "TRAIT_REGEN_SHIELD" = TRAIT_REGEN_SHIELD,
+ /* "TRAIT_REGEN_SHIELD" = TRAIT_REGEN_SHIELD, */
/* "TRAIT_REMOTE_TASTING" = TRAIT_REMOTE_TASTING, */
/* "TRAIT_ROCK_EATER" = TRAIT_ROCK_EATER, */
/* "TRAIT_ROCK_METAMORPHIC" = TRAIT_ROCK_METAMORPHIC, */
@@ -615,7 +610,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
/* "TRAIT_TOSS_GUN_HARD" = TRAIT_TOSS_GUN_HARD, */
/* "TRAIT_UNHUSKABLE" = TRAIT_UNHUSKABLE, */
/* "TRAIT_USER_SCOPED" = TRAIT_USER_SCOPED, */
- "TRAIT_WOUND_LICKER" = TRAIT_WOUND_LICKER,
+ /* "TRAIT_WOUND_LICKER" = TRAIT_WOUND_LICKER, */
/* "TRAIT_XRAY_HEARING" = TRAIT_XRAY_HEARING, */
),
/obj/item = list(
@@ -629,7 +624,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT,
"TRAIT_FEATHERED" = TRAIT_FEATHERED,
"TRAIT_FISHING_BAIT" = TRAIT_FISHING_BAIT,
- "TRAIT_FOOD_BBQ_GRILLED" = TRAIT_FOOD_BBQ_GRILLED,
"TRAIT_FOOD_GRILLED" = TRAIT_FOOD_GRILLED,
"TRAIT_GIFT_ITEM" = TRAIT_GIFT_ITEM,
"TRAIT_GOOD_QUALITY_BAIT" = TRAIT_GOOD_QUALITY_BAIT,
@@ -655,10 +649,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_TRASH_ITEM" = TRAIT_TRASH_ITEM,
"TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE,
"TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE,
- "TRAIT_UNCOMPOSTABLE" = TRAIT_UNCOMPOSTABLE,
"TRAIT_WIELDED" = TRAIT_WIELDED,
/* "TRAIT_BAIT_UNCONSUMABLE" = TRAIT_BAIT_UNCONSUMABLE, */
- "TRAIT_BAKEABLE" = TRAIT_BAKEABLE,
+ /* "TRAIT_BAKEABLE" = TRAIT_BAKEABLE, */
/* "TRAIT_BYPASS_RANGED_ARMOR" = TRAIT_BYPASS_RANGED_ARMOR, */
/* "TRAIT_CONTRABAND_BLOCKER" = TRAIT_CONTRABAND_BLOCKER, */
/* "TRAIT_GERM_SENSITIVE" = TRAIT_GERM_SENSITIVE, */
@@ -696,7 +689,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_FISH_SELF_REPRODUCE" = TRAIT_FISH_SELF_REPRODUCE,
"TRAIT_FISH_TOXIN_IMMUNE" = TRAIT_FISH_TOXIN_IMMUNE,
"TRAIT_RESIST_EMULSIFY" = TRAIT_RESIST_EMULSIFY,
- "TRAIT_FISH_WELL_COOKED" = TRAIT_FISH_WELL_COOKED,
"TRAIT_YUCKY_FISH" = TRAIT_YUCKY_FISH,
/* "TRAIT_FISH_ELECTROGENESIS" = TRAIT_FISH_ELECTROGENESIS, */
/* "TRAIT_FISH_FROM_CASE" = TRAIT_FISH_FROM_CASE, */
diff --git a/code/datums/ai/_ai_behavior.dm b/code/datums/ai/_ai_behavior.dm
index eb8f7370dc29..233b57b15772 100644
--- a/code/datums/ai/_ai_behavior.dm
+++ b/code/datums/ai/_ai_behavior.dm
@@ -19,8 +19,8 @@
return TRUE
///Called by the AI controller when this action is performed
-///Returns a set of flags defined in [code/__DEFINES/ai/ai.dm]
/datum/ai_behavior/proc/perform(seconds_per_tick, datum/ai_controller/controller, ...)
+ controller.behavior_cooldowns[src] = world.time + get_cooldown(controller)
return
///Called when the action is finished. This needs the same args as perform besides the default ones
diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm
index f831dbe367e9..48b0f1a9db46 100644
--- a/code/datums/ai/_ai_controller.dm
+++ b/code/datums/ai/_ai_controller.dm
@@ -277,32 +277,6 @@ multiple modular subtrees with behaviors
return FALSE
return TRUE
-///Can this pawn interact with objects?
-/datum/ai_controller/proc/ai_can_interact()
- SHOULD_CALL_PARENT(TRUE)
- return !QDELETED(pawn)
-
-///Interact with objects
-/datum/ai_controller/proc/ai_interact(target, combat_mode, list/modifiers)
- if(!ai_can_interact())
- return FALSE
-
- var/atom/final_target = isdatum(target) ? target : blackboard[target] //incase we got a blackboard key instead
-
- if(QDELETED(final_target))
- return FALSE
- var/params = list2params(modifiers)
- var/mob/living/living_pawn = pawn
- if(isnull(combat_mode))
- living_pawn.ClickOn(final_target, params)
- return TRUE
-
- var/old_combat_mode = living_pawn.combat_mode
- living_pawn.set_combat_mode(combat_mode)
- living_pawn.ClickOn(final_target, params)
- living_pawn.set_combat_mode(old_combat_mode)
- return TRUE
-
///Runs any actions that are currently running
/datum/ai_controller/process(seconds_per_tick)
if(!able_to_run())
@@ -384,13 +358,14 @@ multiple modular subtrees with behaviors
break
SEND_SIGNAL(src, COMSIG_AI_CONTROLLER_PICKED_BEHAVIORS, current_behaviors, planned_behaviors)
- if(LAZYLEN(current_behaviors))
- for(var/datum/ai_behavior/forgotten_behavior as anything in current_behaviors - planned_behaviors)
- var/list/arguments = list(src, FALSE)
- var/list/stored_arguments = behavior_args[type]
- if(stored_arguments)
- arguments += stored_arguments
- forgotten_behavior.finish_action(arglist(arguments))
+ for(var/datum/ai_behavior/current_behavior as anything in current_behaviors)
+ if(LAZYACCESS(planned_behaviors, current_behavior))
+ continue
+ var/list/arguments = list(src, FALSE)
+ var/list/stored_arguments = behavior_args[type]
+ if(stored_arguments)
+ arguments += stored_arguments
+ current_behavior.finish_action(arglist(arguments))
///This proc handles changing ai status, and starts/stops processing if required.
/datum/ai_controller/proc/set_ai_status(new_ai_status)
@@ -416,7 +391,7 @@ multiple modular subtrees with behaviors
paused_until = world.time + time
/datum/ai_controller/proc/modify_cooldown(datum/ai_behavior/behavior, new_cooldown)
- behavior_cooldowns[behavior] = new_cooldown
+ behavior_cooldowns[behavior.type] = new_cooldown
///Call this to add a behavior to the stack.
/datum/ai_controller/proc/queue_behavior(behavior_type, ...)
@@ -446,23 +421,13 @@ multiple modular subtrees with behaviors
var/list/stored_arguments = behavior_args[behavior.type]
if(stored_arguments)
arguments += stored_arguments
-
- var/process_flags = behavior.perform(arglist(arguments))
- if(process_flags & AI_BEHAVIOR_DELAY)
- behavior_cooldowns[behavior] = world.time + behavior.get_cooldown(src)
- if(process_flags & AI_BEHAVIOR_FAILED)
- arguments[1] = src
- arguments[2] = FALSE
- behavior.finish_action(arglist(arguments))
- else if (process_flags & AI_BEHAVIOR_SUCCEEDED)
- arguments[1] = src
- arguments[2] = TRUE
- behavior.finish_action(arglist(arguments))
+ behavior.perform(arglist(arguments))
/datum/ai_controller/proc/CancelActions()
if(!LAZYLEN(current_behaviors))
return
- for(var/datum/ai_behavior/current_behavior as anything in current_behaviors)
+ for(var/i in current_behaviors)
+ var/datum/ai_behavior/current_behavior = i
var/list/arguments = list(src, FALSE)
var/list/stored_arguments = behavior_args[current_behavior.type]
if(stored_arguments)
diff --git a/code/datums/ai/_item_behaviors.dm b/code/datums/ai/_item_behaviors.dm
index c9f3441fdd68..6cfb539f7a0b 100644
--- a/code/datums/ai/_item_behaviors.dm
+++ b/code/datums/ai/_item_behaviors.dm
@@ -2,14 +2,14 @@
/datum/ai_behavior/item_escape_grasp
/datum/ai_behavior/item_escape_grasp/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
var/obj/item/item_pawn = controller.pawn
var/mob/item_holder = item_pawn.loc
if(!istype(item_holder))
- //We're no longer being held. abort abort!!
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE) //We're no longer being held. abort abort!!
item_pawn.visible_message(span_warning("[item_pawn] slips out of the hands of [item_holder]!"))
item_holder.dropItemToGround(item_pawn, TRUE)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
///This behavior is for obj/items, it is used to move closer to a target and throw themselves towards them.
@@ -30,6 +30,7 @@
set_movement_target(controller, target)
/datum/ai_behavior/item_move_close_and_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, throw_count_key)
+ . = ..()
var/obj/item/item_pawn = controller.pawn
var/atom/throw_target = controller.blackboard[target_key]
@@ -38,8 +39,7 @@
playsound(item_pawn.loc, attack_sound, 100, TRUE)
controller.add_blackboard_key(throw_count_key, 1)
if(controller.blackboard[throw_count_key] >= max_attempts)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY
+ finish_action(controller, TRUE, target_key, throw_count_key)
/datum/ai_behavior/item_move_close_and_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, throw_count_key)
. = ..()
diff --git a/code/datums/ai/babies/babies_behaviors.dm b/code/datums/ai/babies/babies_behaviors.dm
index aa8a15a03e40..e58d99a3ed63 100644
--- a/code/datums/ai/babies/babies_behaviors.dm
+++ b/code/datums/ai/babies/babies_behaviors.dm
@@ -8,6 +8,7 @@
var/max_children = 3
/datum/ai_behavior/find_partner/perform(seconds_per_tick, datum/ai_controller/controller, target_key, partner_types_key, child_types_key)
+ . = ..()
max_children = controller.blackboard[BB_MAX_CHILDREN] || max_children
var/mob/pawn_mob = controller.pawn
var/list/partner_types = controller.blackboard[partner_types_key]
@@ -17,10 +18,12 @@
var/children = 0
for(var/mob/living/other in oview(range, pawn_mob))
if(!pawn_mob.faction_check_atom(other))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
if(children >= max_children)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
if(other.stat != CONSCIOUS) //Check if it's conscious FIRST.
continue
@@ -37,9 +40,10 @@
if(other.gender != living_pawn.gender && !(other.flags_1 & HOLOGRAM_1)) //Better safe than sorry ;_;
controller.set_blackboard_key(target_key, other)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
+
+ finish_action(controller, FALSE)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
/**
* Reproduce.
@@ -55,12 +59,23 @@
set_movement_target(controller, target)
/datum/ai_behavior/make_babies/perform(seconds_per_tick, datum/ai_controller/controller, target_key, child_types_key)
+ . = ..()
var/mob/target = controller.blackboard[target_key]
if(QDELETED(target) || target.stat != CONSCIOUS)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- controller.ai_interact(target = target, combat_mode = FALSE)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, FALSE, target_key)
+ return
+ var/mob/living/basic/living_pawn = controller.pawn
+ //living_pawn.set_combat_mode(FALSE)
+ living_pawn.istate &= ~ISTATE_HARM
+ living_pawn.melee_attack(target)
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/make_babies/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
controller.clear_blackboard_key(target_key)
+ if(!succeeded)
+ return
+ var/mob/living/living_pawn = controller.pawn
+ if(QDELETED(living_pawn)) // pawn can be null at this point
+ return
+ living_pawn.istate = initial(living_pawn.istate)
diff --git a/code/datums/ai/basic_mobs/base_basic_controller.dm b/code/datums/ai/basic_mobs/base_basic_controller.dm
index 0dd57cace378..cd025b28bcb2 100644
--- a/code/datums/ai/basic_mobs/base_basic_controller.dm
+++ b/code/datums/ai/basic_mobs/base_basic_controller.dm
@@ -29,8 +29,3 @@
/datum/ai_controller/basic_controller/proc/update_speed(mob/living/basic/basic_mob)
SIGNAL_HANDLER
movement_delay = basic_mob.cached_multiplicative_slowdown
-
-/datum/ai_controller/basic_controller/proc/on_mob_eat()
- SIGNAL_HANDLER
- var/food_cooldown = blackboard[BB_EAT_FOOD_COOLDOWN] || EAT_FOOD_COOLDOWN
- set_blackboard_key(BB_NEXT_FOOD_EAT, world.time + food_cooldown)
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm
index c8b2f55731e3..6c264e32de71 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm
@@ -21,25 +21,30 @@
if (isliving(controller.pawn))
var/mob/living/pawn = controller.pawn
if (world.time < pawn.next_move)
- return AI_BEHAVIOR_INSTANT
+ return
+ . = ..()
var/mob/living/basic/basic_mob = controller.pawn
//targeting strategy will kill the action if not real anymore
var/atom/target = controller.blackboard[target_key]
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
if(!targeting_strategy.can_attack(basic_mob, target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
var/hiding_target = targeting_strategy.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something!
controller.set_blackboard_key(hiding_location_key, hiding_target)
- var/atom/final_target = hiding_target || target
- controller.ai_interact(target = final_target, combat_mode = TRUE)
+ if(melee_attacks || !ismob(target))
+ if(hiding_target) //Slap it!
+ basic_mob.melee_attack(hiding_target)
+ else
+ basic_mob.melee_attack(target)
+
if(terminate_after_action)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/basic_melee_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key)
. = ..()
@@ -76,21 +81,22 @@
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
if(!targeting_strategy.can_attack(basic_mob, target, chase_range))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
var/atom/hiding_target = targeting_strategy.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something!
var/atom/final_target = hiding_target ? hiding_target : target
if(!can_see(basic_mob, final_target, required_distance))
- return AI_BEHAVIOR_INSTANT
+ return
if(avoid_friendly_fire && check_friendly_in_path(basic_mob, target, targeting_strategy))
adjust_position(basic_mob, target)
- return AI_BEHAVIOR_DELAY
+ return ..()
controller.set_blackboard_key(hiding_location_key, hiding_target)
basic_mob.RangedAttack(final_target)
- return AI_BEHAVIOR_DELAY //only start the cooldown when the shot is shot
+ return ..() //only start the cooldown when the shot is shot
/datum/ai_behavior/basic_ranged_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key)
. = ..()
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/befriend_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/befriend_target.dm
index 865b028e156c..e1fd8bed640d 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/befriend_target.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/befriend_target.dm
@@ -2,17 +2,19 @@
/datum/ai_behavior/befriend_target
/datum/ai_behavior/befriend_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, befriend_message)
+ . = ..()
var/mob/living/living_pawn = controller.pawn
var/mob/living/living_target = controller.blackboard[target_key]
if(QDELETED(living_target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
living_pawn.befriend(living_target)
var/befriend_text = controller.blackboard[befriend_message]
if(befriend_text)
to_chat(living_target, span_nicegreen("[living_pawn] [befriend_text]"))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/befriend_target/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/climb_tree.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/climb_tree.dm
index 4b0bdda2330b..c8c18072a4aa 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/climb_tree.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/climb_tree.dm
@@ -14,7 +14,7 @@
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH
/datum/ai_behavior/climb_tree/setup(datum/ai_controller/controller, target_key)
-
+ . = ..()
var/atom/target = controller.blackboard[target_key]
if(QDELETED(target))
return FALSE
@@ -22,12 +22,13 @@
set_movement_target(controller, target)
/datum/ai_behavior/climb_tree/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/obj/structure/flora/target_tree = controller.blackboard[target_key]
var/mob/living/basic/living_pawn = controller.pawn
if(QDELETED(living_pawn)) // pawn can be null at this point
return
SEND_SIGNAL(living_pawn, COMSIG_LIVING_CLIMB_TREE, target_tree)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/climb_tree/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/find_parent.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/find_parent.dm
index 0adc0c5cfc7a..c012a9f43162 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/find_parent.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/find_parent.dm
@@ -3,13 +3,16 @@
var/look_range = 7
/datum/ai_behavior/find_mom/perform(seconds_per_tick, datum/ai_controller/controller, mom_key, ignore_mom_key, found_mom)
+ . = ..()
+
var/mob/living_pawn = controller.pawn
var/list/mom_types = controller.blackboard[mom_key]
var/list/all_moms = list()
var/list/ignore_types = controller.blackboard[ignore_mom_key]
if(!length(mom_types))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
for(var/mob/mother in oview(look_range, living_pawn))
if(!is_type_in_list(mother, mom_types))
@@ -23,5 +26,6 @@
controller.set_blackboard_key(found_mom, mom)
if(isbasicmob(mom))
controller.set_blackboard_key(BB_FRIENDS_LIST, mom.ai_controller.blackboard[BB_FRIENDS_LIST])
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, TRUE)
+ return
+ finish_action(controller, FALSE)
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/interact_with_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/interact_with_target.dm
deleted file mode 100644
index e3b202c5e164..000000000000
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/interact_with_target.dm
+++ /dev/null
@@ -1,29 +0,0 @@
-///behavior for general interactions with any targets
-/datum/ai_behavior/interact_with_target
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH
- ///should we be clearing the target after the fact?
- var/clear_target = TRUE
- ///should our combat mode be off during interaction?
- var/combat_mode = TRUE
-
-/datum/ai_behavior/interact_with_target/setup(datum/ai_controller/controller, target_key)
- . = ..()
- var/atom/target = controller.blackboard[target_key]
- if(QDELETED(target))
- return FALSE
- set_movement_target(controller, target)
-
-/datum/ai_behavior/interact_with_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
- var/atom/target = controller.blackboard[target_key]
- if(QDELETED(target) || !pre_interact(controller, target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- controller.ai_interact(target, combat_mode)
- return AI_BEHAVIOR_SUCCEEDED | AI_BEHAVIOR_DELAY
-
-/datum/ai_behavior/interact_with_target/finish_action(datum/ai_controller/controller, succeeded, target_key)
- . = ..()
- if(clear_target || !succeeded)
- controller.clear_blackboard_key(target_key)
-
-/datum/ai_behavior/interact_with_target/proc/pre_interact(datum/ai_controller/controller, target)
- return TRUE
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/pick_up_item.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/pick_up_item.dm
index 1b65eaa507c9..e81c9f957515 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/pick_up_item.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/pick_up_item.dm
@@ -11,13 +11,16 @@
return isitem(target) && isturf(target.loc) && !target.anchored
/datum/ai_behavior/pick_up_item/perform(seconds_per_tick, datum/ai_controller/controller, target_key, storage_key)
+ . = ..()
var/obj/item/target = controller.blackboard[target_key]
if(QDELETED(target) || !isturf(target.loc)) // Someone picked it up or it got deleted
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
if(!controller.pawn.Adjacent(target)) // It teleported
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
pickup_item(controller, target, storage_key)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/pick_up_item/finish_action(datum/ai_controller/controller, success, target_key, storage_key)
. = ..()
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/pull_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/pull_target.dm
deleted file mode 100644
index 900b122dcb3f..000000000000
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/pull_target.dm
+++ /dev/null
@@ -1,22 +0,0 @@
-/datum/ai_behavior/pull_target
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_REQUIRE_REACH
-
-/datum/ai_behavior/pull_target/setup(datum/ai_controller/controller, target_key)
- . = ..()
- var/atom/target = controller.blackboard[target_key]
- if(QDELETED(target))
- return FALSE
- set_movement_target(controller, target)
-
-/datum/ai_behavior/pull_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
- var/atom/movable/target = controller.blackboard[target_key]
- if(QDELETED(target) || target.anchored || target.pulledby)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- var/mob/living/our_mob = controller.pawn
- our_mob.start_pulling(target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
-
-/datum/ai_behavior/pull_target/finish_action(datum/ai_controller/controller, succeeded, target_key)
- . = ..()
- if(!succeeded)
- controller.clear_blackboard_key(target_key)
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm
index 3529cc2d150c..23b3a69c4d38 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm
@@ -18,55 +18,32 @@
return ..()
/datum/ai_behavior/run_away_from_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key)
+ . = ..()
if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
- return AI_BEHAVIOR_DELAY
+ finish_action(controller, succeeded = FALSE, target_key = target_key, hiding_location_key = hiding_location_key)
+ return
var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key]
if (QDELETED(target) || !can_see(controller.pawn, target, run_distance))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, succeeded = TRUE, target_key = target_key, hiding_location_key = hiding_location_key)
+ return
if (get_dist(controller.pawn, controller.current_movement_target) > required_distance)
- return AI_BEHAVIOR_DELAY // Still heading over
+ return // Still heading over
if (plot_path_away_from(controller, target))
- return AI_BEHAVIOR_DELAY
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ return
+ finish_action(controller, succeeded = FALSE, target_key = target_key, hiding_location_key = hiding_location_key)
/datum/ai_behavior/run_away_from_target/proc/plot_path_away_from(datum/ai_controller/controller, atom/target)
var/turf/target_destination = get_turf(controller.pawn)
- var/static/list/offset_angles = list(45, 90, 135, 180, 225, 270)
- for(var/angle in offset_angles)
- var/turf/test_turf = get_furthest_turf(controller.pawn, angle, target)
- if(isnull(test_turf))
- continue
- var/distance_from_target = get_dist(target, test_turf)
- if(distance_from_target <= get_dist(target, target_destination))
- continue
- target_destination = test_turf
- if(distance_from_target == run_distance) //we already got the max running distance
+ for (var/i in 1 to run_distance)
+ var/turf/test_destination = get_ranged_target_turf_direct(controller.pawn, target, range = i, offset = 180)
+ if (test_destination.is_blocked_turf(exclude_mobs = TRUE, source_atom = controller.pawn, ignore_atoms = GLOB.airlocks))
break
+ target_destination = test_destination
if (target_destination == get_turf(controller.pawn))
return FALSE
set_movement_target(controller, target_destination)
return TRUE
-/datum/ai_behavior/run_away_from_target/proc/get_furthest_turf(atom/source, angle, atom/target)
- var/turf/return_turf
- var/list/airlocks = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock)
- for(var/i in 1 to run_distance)
- var/turf/test_destination = get_ranged_target_turf_direct(source, target, range = i, offset = angle)
- if(test_destination.is_blocked_turf(source_atom = source, ignore_atoms = airlocks))
- break
- return_turf = test_destination
- return return_turf
+
/datum/ai_behavior/run_away_from_target/finish_action(datum/ai_controller/controller, succeeded, target_key, hiding_location_key)
. = ..()
- if (clear_failed_targets)
- controller.clear_blackboard_key(target_key)
-
-/datum/ai_behavior/run_away_from_target/run_and_shoot
- clear_failed_targets = FALSE
-
-/datum/ai_behavior/run_away_from_target/run_and_shoot/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key)
- var/atom/target = controller.blackboard[target_key]
- if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- var/mob/living/living_pawn = controller.pawn
- living_pawn.RangedAttack(target)
- return ..()
+ controller.clear_blackboard_key(target_key)
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/set_travel_destination.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/set_travel_destination.dm
index 6bf6dbb7fdbc..207df4424577 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/set_travel_destination.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/set_travel_destination.dm
@@ -1,10 +1,13 @@
/datum/ai_behavior/set_travel_destination
/datum/ai_behavior/set_travel_destination/perform(seconds_per_tick, datum/ai_controller/controller, target_key, location_key)
+ . = ..()
var/atom/target = controller.blackboard[target_key]
if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
controller.set_blackboard_key(location_key, target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+
+ finish_action(controller, TRUE, target_key)
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/step_towards_turf.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/step_towards_turf.dm
index 0c6211f49d5f..70a557ccc436 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/step_towards_turf.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/step_towards_turf.dm
@@ -49,7 +49,8 @@
// We actually only wanted the movement so if we've arrived we're done
/datum/ai_behavior/step_towards_turf/perform(seconds_per_tick, datum/ai_controller/controller, area_key, turf_key)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ . = ..()
+ finish_action(controller, succeeded = TRUE)
/**
* # Step towards turf in area
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/stop_and_stare.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/stop_and_stare.dm
index 066ccb9b787d..377420021a5c 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/stop_and_stare.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/stop_and_stare.dm
@@ -4,23 +4,26 @@
/datum/ai_behavior/stop_and_stare/setup(datum/ai_controller/controller, target_key)
. = ..()
- var/atom/movable/target = controller.blackboard[target_key]
+ var/datum/weakref/weak_target = controller.blackboard[target_key]
+ var/atom/movable/target = weak_target?.resolve()
return ismovable(target) && isturf(target.loc) && ismob(controller.pawn)
/datum/ai_behavior/stop_and_stare/get_cooldown(datum/ai_controller/cooldown_for)
return cooldown_for.blackboard[BB_STATIONARY_COOLDOWN]
/datum/ai_behavior/stop_and_stare/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
- var/atom/movable/target = controller.blackboard[target_key]
+ . = ..()
+ var/datum/weakref/weak_target = controller.blackboard[target_key]
+ var/atom/movable/target = weak_target?.resolve()
if(!ismovable(target) || !isturf(target.loc)) // just to make sure that nothing funky happened between setup and perform
- return AI_BEHAVIOR_DELAY
+ return
var/mob/pawn_mob = controller.pawn
var/turf/pawn_turf = get_turf(pawn_mob)
+
pawn_mob.face_atom(target)
pawn_mob.balloon_alert_to_viewers("stops and stares...")
set_movement_target(controller, pawn_turf, /datum/ai_movement/complete_stop)
if(controller.blackboard[BB_STATIONARY_MOVE_TO_TARGET])
addtimer(CALLBACK(src, PROC_REF(set_movement_target), controller, target, initial(controller.ai_movement)), (controller.blackboard[BB_STATIONARY_SECONDS] + 1 SECONDS))
- return AI_BEHAVIOR_DELAY
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm
index be1c6e932a13..a39200d0cc16 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm
@@ -8,13 +8,12 @@
var/datum/action/cooldown/ability = controller.blackboard[ability_key]
var/mob/living/target = controller.blackboard[target_key]
if(QDELETED(ability) || QDELETED(target))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, ability_key, target_key)
+ return
var/mob/pawn = controller.pawn
pawn.face_atom(target)
var/result = ability.Trigger(target = target)
- if(result)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, result, ability_key, target_key)
/datum/ai_behavior/targeted_mob_ability/finish_action(datum/ai_controller/controller, succeeded, ability_key, target_key)
. = ..()
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm
index 799b66095b78..8ad59ba2bf15 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm
@@ -28,7 +28,8 @@ GLOBAL_LIST_INIT(target_interested_atoms, typecacheof(list(/mob, /obj/machinery/
var/atom/current_target = controller.blackboard[target_key]
if (targeting_strategy.can_attack(living_mob, current_target, vision_range))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE)
+ return
var/aggro_range = controller.blackboard[aggro_range_key] || vision_range
@@ -45,7 +46,8 @@ GLOBAL_LIST_INIT(target_interested_atoms, typecacheof(list(/mob, /obj/machinery/
if(!potential_targets.len)
failed_to_find_anyone(controller, target_key, targeting_strategy_key, hiding_location_key)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE)
+ return
var/list/filtered_targets = list()
@@ -58,7 +60,8 @@ GLOBAL_LIST_INIT(target_interested_atoms, typecacheof(list(/mob, /obj/machinery/
if(!filtered_targets.len)
failed_to_find_anyone(controller, target_key, targeting_strategy_key, hiding_location_key)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE)
+ return
var/atom/target = pick_final_target(controller, filtered_targets)
controller.set_blackboard_key(target_key, target)
@@ -68,7 +71,7 @@ GLOBAL_LIST_INIT(target_interested_atoms, typecacheof(list(/mob, /obj/machinery/
if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially.
controller.set_blackboard_key(hiding_location_key, potential_hiding_location)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, succeeded = TRUE)
/datum/ai_behavior/find_potential_targets/proc/failed_to_find_anyone(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
var/aggro_range = controller.blackboard[aggro_range_key] || vision_range
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/tipped_reaction.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/tipped_reaction.dm
index c734d961b5ef..643bb9ced5ad 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/tipped_reaction.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/tipped_reaction.dm
@@ -3,6 +3,8 @@
/datum/ai_behavior/tipped_reaction
/datum/ai_behavior/tipped_reaction/perform(seconds_per_tick, datum/ai_controller/controller, tipper_key, reacting_key)
+ . = ..()
+
var/mob/living/carbon/tipper = controller.blackboard[tipper_key]
// visible part of the visible message
@@ -26,7 +28,7 @@
seen_message = "[controller.pawn] seems resigned to its fate."
self_message = "You resign yourself to your fate."
controller.pawn.visible_message(span_notice("[seen_message]"), span_notice("[self_message]"))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, tipper_key, reacting_key)
/datum/ai_behavior/tipped_reaction/finish_action(datum/ai_controller/controller, succeeded, tipper_key, reacting_key)
. = ..()
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm
index 98cb4d1ce648..55f6ef4c4c00 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm
@@ -8,8 +8,6 @@
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
/// If true we will get rid of our target on completion
var/clear_target = FALSE
- ///should we use a different movement type?
- var/new_movement_type
/datum/ai_behavior/travel_towards/setup(datum/ai_controller/controller, target_key)
. = ..()
@@ -19,7 +17,8 @@
set_movement_target(controller, target)
/datum/ai_behavior/travel_towards/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ . = ..()
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/travel_towards/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
@@ -45,4 +44,5 @@
set_movement_target(controller, target_atom)
/datum/ai_behavior/travel_towards_atom/perform(seconds_per_tick, datum/ai_controller/controller, atom/target_atom)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ . = ..()
+ finish_action(controller, TRUE)
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/unbuckle_mob.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/unbuckle_mob.dm
index 34e651f8e528..655b335d3b63 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/unbuckle_mob.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/unbuckle_mob.dm
@@ -1,11 +1,14 @@
/datum/ai_behavior/unbuckle_mob
/datum/ai_behavior/unbuckle_mob/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
+
var/mob/living/living_pawn = controller.pawn
var/atom/movable/buckled_to = living_pawn.buckled
if(isnull(buckled_to))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
buckled_to.unbuckle_mob(living_pawn)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/ventcrawling.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/ventcrawling.dm
index aca89d832814..889b474ad038 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/ventcrawling.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/ventcrawling.dm
@@ -17,23 +17,26 @@
return istype(target) && isliving(controller.pawn) // only mobs can vent crawl in the current framework
/datum/ai_behavior/crawl_through_vents/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/obj/machinery/atmospherics/components/unary/vent_pump/entry_vent = controller.blackboard[target_key] || controller.blackboard[BB_ENTRY_VENT_TARGET]
var/mob/living/cached_pawn = controller.pawn
if(HAS_TRAIT(cached_pawn, TRAIT_MOVE_VENTCRAWLING) || !controller.blackboard[BB_CURRENTLY_TARGETING_VENT] || !is_vent_valid(entry_vent))
- return AI_BEHAVIOR_DELAY
+ return
if(!cached_pawn.can_enter_vent(entry_vent, provide_feedback = FALSE)) // we're an AI we scoff at feedback
- // "never enter a hole you can't get out of"
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key) // "never enter a hole you can't get out of"
+ return
var/vent_we_exit_out_of = calculate_exit_vent(controller, target_key)
if(isnull(vent_we_exit_out_of)) // don't get into the vents if we can't get out of them, that's SILLY.
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
controller.set_blackboard_key(BB_CURRENTLY_TARGETING_VENT, FALSE) // must be done here because we have a do_after sleep in handle_ventcrawl unfortunately and double dipping could lead to erroneous suicide pill calls.
cached_pawn.handle_ventcrawl(entry_vent)
if(!HAS_TRAIT(cached_pawn, TRAIT_MOVE_VENTCRAWLING)) //something failed and we ARE NOT IN THE VENT even though the earlier check said we were good to go! odd.
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
controller.set_blackboard_key(BB_EXIT_VENT_TARGET, vent_we_exit_out_of)
@@ -47,8 +50,7 @@
var/upper_vent_time_limit = controller.blackboard[BB_UPPER_VENT_TIME_LIMIT] // the most amount of time we spend in the vents
addtimer(CALLBACK(src, PROC_REF(exit_the_vents), controller), rand(lower_vent_time_limit, upper_vent_time_limit))
- controller.set_blackboard_key(BB_GIVE_UP_ON_VENT_PATHING_TIMER_ID, addtimer(CALLBACK(src, PROC_REF(delayed_suicide_pill), controller, target_key), controller.blackboard[BB_TIME_TO_GIVE_UP_ON_VENT_PATHING], TIMER_STOPPABLE))
- return AI_BEHAVIOR_DELAY
+ controller.set_blackboard_key(BB_GIVE_UP_ON_VENT_PATHING_TIMER_ID, addtimer(CALLBACK(src, PROC_REF(suicide_pill), controller), controller.blackboard[BB_TIME_TO_GIVE_UP_ON_VENT_PATHING], TIMER_STOPPABLE))
/// Figure out an exit vent that we should head towards. If we don't have one, default to the entry vent. If they're all kaput, we die.
/datum/ai_behavior/crawl_through_vents/proc/calculate_exit_vent(datum/ai_controller/controller, target_key)
@@ -81,8 +83,8 @@
var/mob/living/living_pawn = controller.pawn
if(!HAS_TRAIT(living_pawn, TRAIT_MOVE_VENTCRAWLING) && isturf(get_turf(living_pawn))) // we're out of the vents, so no need to do an exit
- // assume that we got yeeted out somehow and return this so we can halt the suicide pill timer.
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key) // assume that we got yeeted out somehow and call this so we can halt the suicide pill timer.
+ return
living_pawn.forceMove(exit_vent)
if(!living_pawn.can_enter_vent(exit_vent, provide_feedback = FALSE))
@@ -90,7 +92,8 @@
emergency_vent = calculate_exit_vent(controller)
if(isnull(emergency_vent))
// it's joever. we cooked too hard.
- return suicide_pill(controller) | AI_BEHAVIOR_DELAY
+ suicide_pill(controller, target_key)
+ return
controller.set_blackboard_key(BB_EXIT_VENT_TARGET, emergency_vent) // assign and go again
addtimer(CALLBACK(src, PROC_REF(exit_the_vents), controller), (rand(controller.blackboard[BB_LOWER_VENT_TIME_LIMIT], controller.blackboard[BB_UPPER_VENT_TIME_LIMIT]) / 2)) // we're in danger mode, so scurry out at half the time it would normally take.
@@ -99,34 +102,32 @@
living_pawn.handle_ventcrawl(exit_vent)
if(HAS_TRAIT(living_pawn, TRAIT_MOVE_VENTCRAWLING)) // how'd we fail? what the fuck
stack_trace("We failed to exit the vents, even though we should have been fine? This is very weird.")
- return suicide_pill(controller) | AI_BEHAVIOR_DELAY // all of the prior checks say we should have definitely made it through, but we didn't. dammit.
+ suicide_pill() // all of the prior checks say we should have definitely made it through, but we didn't. dammit.
+ return
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED // we did it! we went into the vents and out of the vents. poggers.
+ finish_action(controller, TRUE, target_key) // we did it! we went into the vents and out of the vents. poggers.
/// Incredibly stripped down version of the overarching `can_enter_vent` proc on `/mob, just meant for rapid rechecking of a vent. Will be TRUE if not blocked, FALSE otherwise.
/datum/ai_behavior/crawl_through_vents/proc/is_vent_valid(obj/machinery/atmospherics/components/unary/vent_pump/checkable)
return !QDELETED(checkable) && !checkable.welded
-/// Wraps a delayed defeat, so we gotta handle the return value properly ya feel?
-/datum/ai_behavior/crawl_through_vents/proc/delayed_suicide_pill(datum/ai_controller/controller, target_key)
- if(suicide_pill(controller) & AI_BEHAVIOR_FAILED)
- finish_action(controller, FALSE, target_key)
-
/// Aw fuck, we may have been bested somehow. Regardless of what we do, we can't exit through a vent! Let's end our misery and prevent useless endless calculations.
-/datum/ai_behavior/crawl_through_vents/proc/suicide_pill(datum/ai_controller/controller)
+/datum/ai_behavior/crawl_through_vents/proc/suicide_pill(datum/ai_controller/controller, target_key)
var/mob/living/living_pawn = controller.pawn
if(istype(living_pawn))
+ finish_action(controller, FALSE, target_key)
+
if(isnull(living_pawn.client)) // only call death if we don't have a client because maybe their natural intelligence can pick up where our AI calculations have failed
living_pawn.death(TRUE) // call gibbed as true because we are never coming back it is so fucking joever
- return AI_BEHAVIOR_FAILED
+ return
if(QDELETED(living_pawn)) // we got deleted by some other means, just presume the action is a wash and get outta here
- return NONE
+ return
qdel(living_pawn) // failover, we really should've been caught in the istype() but lets just bow out of existing at this point
- return NONE
+
/datum/ai_behavior/crawl_through_vents/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/write_on_paper.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/write_on_paper.dm
index 51826676e9e8..f5dba58416d2 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/write_on_paper.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/write_on_paper.dm
@@ -1,6 +1,7 @@
/datum/ai_behavior/write_on_paper
/datum/ai_behavior/write_on_paper/perform(seconds_per_tick, datum/ai_controller/controller, found_paper, list_of_writings)
+ . = ..()
var/mob/living/wizard = controller.pawn
var/list/writing_list = controller.blackboard[list_of_writings]
var/obj/item/paper/target = controller.blackboard[found_paper]
@@ -8,7 +9,7 @@
target.add_raw_text(pick(writing_list))
target.update_appearance()
wizard.dropItemToGround(target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, found_paper)
/datum/ai_behavior/write_on_paper/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm
index 2558fadcc0af..411690043546 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm
@@ -27,6 +27,7 @@
/datum/ai_behavior/basic_melee_attack/opportunistic/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
var/atom/movable/atom_pawn = controller.pawn
if(!atom_pawn.CanReach(controller.blackboard[target_key]))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key) // Don't clear target
+ return FALSE
. = ..()
- return . | AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key) // Try doing something else
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm b/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm
index bc8efdeb4ff5..7059bec93fe2 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm
@@ -27,11 +27,13 @@
var/can_attack_dense_objects = FALSE
/datum/ai_behavior/attack_obstructions/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/mob/living/basic/basic_mob = controller.pawn
var/atom/target = controller.blackboard[target_key]
if (QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE)
+ return
var/turf/next_step = get_step_towards(basic_mob, target)
var/dir_to_next_step = get_dir(basic_mob, next_step)
@@ -46,8 +48,8 @@
for (var/direction in dirs_to_move)
if (attack_in_direction(controller, basic_mob, direction))
- return AI_BEHAVIOR_DELAY
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ return
+ finish_action(controller, succeeded = TRUE)
/datum/ai_behavior/attack_obstructions/proc/attack_in_direction(datum/ai_controller/controller, mob/living/basic/basic_mob, direction)
var/turf/next_step = get_step(basic_mob, direction)
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/call_reinforcements.dm b/code/datums/ai/basic_mobs/basic_subtrees/call_reinforcements.dm
index 44d7cb4fe480..59ff88b4879b 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/call_reinforcements.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/call_reinforcements.dm
@@ -36,6 +36,8 @@
var/reinforcements_range = 15
/datum/ai_behavior/call_reinforcements/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
+
var/mob/pawn_mob = controller.pawn
for(var/mob/other_mob in oview(reinforcements_range, pawn_mob))
if(pawn_mob.faction_check_atom(other_mob) && !isnull(other_mob.ai_controller))
@@ -44,6 +46,5 @@
other_mob.ai_controller.set_blackboard_key(BB_BASIC_MOB_REINFORCEMENT_TARGET, pawn_mob)
controller.set_blackboard_key(BB_BASIC_MOB_REINFORCEMENTS_COOLDOWN, world.time + REINFORCEMENTS_COOLDOWN)
- return AI_BEHAVIOR_DELAY
#undef REINFORCEMENTS_COOLDOWN
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/capricious_retaliate.dm b/code/datums/ai/basic_mobs/basic_subtrees/capricious_retaliate.dm
index a4fc49facc00..4d5319bca86e 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/capricious_retaliate.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/capricious_retaliate.dm
@@ -14,25 +14,29 @@
action_cooldown = 1 SECONDS
/datum/ai_behavior/capricious_retaliate/perform(seconds_per_tick, datum/ai_controller/controller, targeting_strategy_key, ignore_faction)
+ . = ..()
var/atom/pawn = controller.pawn
if (controller.blackboard_key_exists(BB_BASIC_MOB_RETALIATE_LIST))
var/deaggro_chance = controller.blackboard[BB_RANDOM_DEAGGRO_CHANCE] || 10
if (!SPT_PROB(deaggro_chance, seconds_per_tick))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, ignore_faction) // "true" here means "don't clear our ignoring factions status"
+ return
pawn.visible_message(span_notice("[pawn] calms down.")) // We can blackboard key this if anyone else actually wants to customise it
controller.clear_blackboard_key(BB_BASIC_MOB_RETALIATE_LIST)
+ finish_action(controller, FALSE, ignore_faction)
controller.CancelActions() // Otherwise they will try and get one last kick in
- return AI_BEHAVIOR_DELAY
+ return
var/aggro_chance = controller.blackboard[BB_RANDOM_AGGRO_CHANCE] || 0.5
if (!SPT_PROB(aggro_chance, seconds_per_tick))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, ignore_faction)
+ return
var/aggro_range = controller.blackboard[BB_AGGRO_RANGE] || 9
var/list/potential_targets = hearers(aggro_range, get_turf(pawn)) - pawn
if (!length(potential_targets))
- failed_targeting(pawn)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ failed_targeting(controller, pawn, ignore_faction)
+ return
var/datum/targeting_strategy/target_helper = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
@@ -45,15 +49,16 @@
final_target = test_target
if (isnull(final_target))
- failed_targeting(pawn)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ failed_targeting(controller, pawn, ignore_faction)
+ return
controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, final_target)
pawn.visible_message(span_warning("[pawn] glares grumpily at [final_target]!"))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, ignore_faction)
/// Called if we try but fail to target something
-/datum/ai_behavior/capricious_retaliate/proc/failed_targeting(atom/pawn)
+/datum/ai_behavior/capricious_retaliate/proc/failed_targeting(datum/ai_controller/controller, atom/pawn, ignore_faction)
+ finish_action(controller, FALSE, ignore_faction)
pawn.visible_message(span_notice("[pawn] grumbles.")) // We're pissed off but with no outlet to vent our frustration upon
/datum/ai_behavior/capricious_retaliate/finish_action(datum/ai_controller/controller, succeeded, ignore_faction)
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm b/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm
index feca98690930..b02ec8eaa85a 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm
@@ -1,39 +1,10 @@
/// similar to finding a target but looks for food types in the // the what?
/datum/ai_planning_subtree/find_food
- ///behavior we use to find the food
- var/datum/ai_behavior/finding_behavior = /datum/ai_behavior/find_and_set/in_list
- ///key of foods list
- var/food_list_key = BB_BASIC_FOODS
- ///key where we store our food
- var/found_food_key = BB_TARGET_FOOD
- ///key holding any emotes we play after eating food
- var/emotes_blackboard_list = BB_EAT_EMOTES
/datum/ai_planning_subtree/find_food/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- var/list/foods_list = controller.blackboard[food_list_key]
- if(!length(foods_list))
- CRASH("the types of food has not been supplied in the [food_list_key] key!")
- if(controller.blackboard[BB_NEXT_FOOD_EAT] > world.time)
- return
- if(!controller.blackboard_key_exists(found_food_key))
- controller.queue_behavior(finding_behavior, found_food_key, foods_list)
- return
- controller.queue_behavior(/datum/ai_behavior/interact_with_target/eat_food, found_food_key, emotes_blackboard_list)
- return SUBTREE_RETURN_FINISH_PLANNING
-
-/datum/ai_behavior/interact_with_target/eat_food
- ///default list of actions we take after eating
- var/list/food_actions = list(
- "eats up happily!",
- "chomps with glee!",
- )
-
-/datum/ai_behavior/interact_with_target/eat_food/perform(seconds_per_tick, datum/ai_controller/controller, target_key, emotes_blackboard_list)
. = ..()
- if(. & AI_BEHAVIOR_FAILED)
- return
- var/list/emotes_to_pick = controller.blackboard[emotes_blackboard_list] || food_actions
- if(!length(emotes_to_pick))
+ if(controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET))
+ // Busy with something
return
- var/mob/living/living_pawn = controller.pawn
- living_pawn.manual_emote(pick(emotes_to_pick))
+
+ controller.queue_behavior(/datum/ai_behavior/find_and_set/in_list, BB_BASIC_MOB_CURRENT_TARGET, controller.blackboard[BB_BASIC_FOODS])
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm b/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm
index fc1bbc6f28cf..991f9962f2c7 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm
@@ -63,7 +63,8 @@
return FALSE
/datum/ai_behavior/step_away/perform(seconds_per_tick, datum/ai_controller/controller)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ . = ..()
+ finish_action(controller, succeeded = TRUE)
/datum/ai_behavior/step_away/finish_action(datum/ai_controller/controller, succeeded)
. = ..()
@@ -85,8 +86,8 @@
/datum/ai_behavior/pursue_to_range/perform(seconds_per_tick, datum/ai_controller/controller, target_key, range)
var/atom/current_target = controller.blackboard[target_key]
if (!QDELETED(current_target) && get_dist(controller.pawn, current_target) > range)
- return AI_BEHAVIOR_INSTANT
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
+ return
+ finish_action(controller, succeeded = TRUE)
///instead of taking a single step, we cover the entire distance
/datum/ai_behavior/cover_minimum_distance
@@ -114,4 +115,5 @@
set_movement_target(controller, target = chosen_turf)
/datum/ai_behavior/cover_minimum_distance/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ . = ..()
+ finish_action(controller, succeeded = TRUE)
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/mine_walls.dm b/code/datums/ai/basic_mobs/basic_subtrees/mine_walls.dm
index 12875f9a3f34..3c03702b6994 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/mine_walls.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/mine_walls.dm
@@ -21,15 +21,19 @@
set_movement_target(controller, target)
/datum/ai_behavior/mine_wall/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/mob/living/basic/living_pawn = controller.pawn
var/turf/closed/mineral/target = controller.blackboard[target_key]
var/is_gibtonite_turf = istype(target, /turf/closed/mineral/gibtonite)
- if(!controller.ai_interact(target = target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ if(QDELETED(target))
+ finish_action(controller, FALSE, target_key)
+ return
+ living_pawn.melee_attack(target)
if(is_gibtonite_turf)
living_pawn.manual_emote("sighs...") //accept whats about to happen to us
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
+ return
/datum/ai_behavior/mine_wall/finish_action(datum/ai_controller/controller, success, target_key)
. = ..()
@@ -38,15 +42,17 @@
/datum/ai_behavior/find_mineral_wall
/datum/ai_behavior/find_mineral_wall/perform(seconds_per_tick, datum/ai_controller/controller, found_wall_key)
+ . = ..()
var/mob/living_pawn = controller.pawn
for(var/turf/closed/mineral/potential_wall in oview(9, living_pawn))
if(!check_if_mineable(controller, potential_wall)) //check if its surrounded by walls
continue
controller.set_blackboard_key(found_wall_key, potential_wall) //closest wall first!
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
+ return
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
/datum/ai_behavior/find_mineral_wall/proc/check_if_mineable(datum/ai_controller/controller, turf/target_wall)
var/mob/living/source = controller.pawn
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/move_to_cardinal.dm b/code/datums/ai/basic_mobs/basic_subtrees/move_to_cardinal.dm
index bcf5c8290251..c98878e0fd71 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/move_to_cardinal.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/move_to_cardinal.dm
@@ -51,17 +51,19 @@
/datum/ai_behavior/move_to_cardinal/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
var/atom/target = controller.blackboard[target_key]
if (QDELETED(target))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller = controller, succeeded = FALSE, target_key = target_key)
+ return
if (!(get_dir(controller.pawn, target) in GLOB.cardinals))
target_nearest_cardinal(controller, target)
- return AI_BEHAVIOR_INSTANT
+ return
var/distance_to_target = get_dist(controller.pawn, target)
if (distance_to_target < minimum_distance)
target_nearest_cardinal(controller, target)
- return AI_BEHAVIOR_INSTANT
+ return
if (distance_to_target > maximum_distance)
- return AI_BEHAVIOR_INSTANT
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
+ return
+ finish_action(controller = controller, succeeded = TRUE, target_key = target_key)
+ return
/datum/ai_behavior/move_to_cardinal/finish_action(datum/ai_controller/controller, succeeded, target_key)
if (!succeeded)
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm b/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm
index 43a3d400bc58..95a125eea5ce 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm
@@ -26,13 +26,16 @@
return !QDELETED(target)
/datum/ai_behavior/ranged_skirmish/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, max_range, min_range)
+ . = ..()
var/atom/target = controller.blackboard[target_key]
if (QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE)
+ return
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
if(!targeting_strategy.can_attack(controller.pawn, target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE)
+ return
var/hiding_target = targeting_strategy.find_hidden_mobs(controller.pawn, target)
controller.set_blackboard_key(hiding_location_key, hiding_target)
@@ -41,7 +44,9 @@
var/distance = get_dist(controller.pawn, target)
if (distance > max_range || distance < min_range)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE)
+ return
- controller.ai_interact(target = target, combat_mode = TRUE)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ var/mob/living/basic/gunman = controller.pawn
+ gunman.RangedAttack(target)
+ finish_action(controller, succeeded = TRUE)
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/run_emote.dm b/code/datums/ai/basic_mobs/basic_subtrees/run_emote.dm
index c0c0da96584a..6f2f5cdc2035 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/run_emote.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/run_emote.dm
@@ -15,7 +15,8 @@
/datum/ai_behavior/run_emote/perform(seconds_per_tick, datum/ai_controller/controller, emote_key)
var/mob/living/living_pawn = controller.pawn
if (!isliving(living_pawn))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
var/list/emote_list = controller.blackboard[emote_key]
var/emote
@@ -25,7 +26,8 @@
emote = emote_list
if(isnull(emote))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
living_pawn.emote(emote)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/sleep_with_no_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/sleep_with_no_target.dm
index 5d9841a52473..93499cf673c4 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/sleep_with_no_target.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/sleep_with_no_target.dm
@@ -16,9 +16,7 @@
/datum/ai_behavior/sleep_after_targetless_time/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
var/atom/target = controller.blackboard[target_key]
- if(QDELETED(target))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = QDELETED(target), seconds_per_tick = seconds_per_tick)
/datum/ai_behavior/sleep_after_targetless_time/finish_action(datum/ai_controller/controller, succeeded, seconds_per_tick)
. = ..()
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm
index f481e747dec8..a04bce1fcd63 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm
@@ -203,12 +203,6 @@
emote_hear = list("rawrs.","grumbles.","grawls.", "stomps!")
emote_see = list("stares ferociously.")
-/datum/ai_planning_subtree/random_speech/cats
- speech_chance = 10
- sound = list(SFX_CAT_MEOW)
- emote_hear = list("meows.")
- emote_see = list("meows.")
-
/datum/ai_planning_subtree/random_speech/blackboard //literal tower of babel, subtree form
speech_chance = 1
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm b/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm
index d327b1047cf5..55ec73876131 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm
@@ -39,7 +39,6 @@
var/mob/living/living_mob = controller.pawn
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
if(!targeting_strategy)
- . = AI_BEHAVIOR_DELAY
CRASH("No target datum was supplied in the blackboard for [controller.pawn]")
var/list/shitlist = controller.blackboard[shitlist_key]
@@ -49,7 +48,8 @@
controller.set_blackboard_key(BB_TEMPORARILY_IGNORE_FACTION, TRUE)
if (!QDELETED(existing_target) && (locate(existing_target) in shitlist) && targeting_strategy.can_attack(living_mob, existing_target, vision_range))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, succeeded = TRUE, check_faction = check_faction)
+ return
var/list/enemies_list = list()
for(var/mob/living/potential_target as anything in shitlist)
@@ -59,7 +59,8 @@
if(!length(enemies_list))
controller.clear_blackboard_key(target_key)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE, check_faction = check_faction)
+ return
var/atom/new_target = pick_final_target(controller, enemies_list)
controller.set_blackboard_key(target_key, new_target)
@@ -69,7 +70,7 @@
if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially.
controller.set_blackboard_key(hiding_location_key, potential_hiding_location)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, succeeded = TRUE, check_faction = check_faction)
/// Returns the desired final target from the filtered list of enemies
/datum/ai_behavior/target_from_retaliate_list/proc/pick_final_target(datum/ai_controller/controller, list/enemies_list)
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/teleport_away_from_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/teleport_away_from_target.dm
index 25f0e4a42496..dadba992e9f1 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/teleport_away_from_target.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/teleport_away_from_target.dm
@@ -34,7 +34,7 @@
/datum/ai_behavior/find_furthest_turf_from_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, set_key, range)
var/mob/living/living_target = controller.blackboard[target_key]
if(QDELETED(living_target))
- return AI_BEHAVIOR_INSTANT
+ return
var/distance = 0
var/turf/chosen_turf
@@ -49,7 +49,8 @@
break //we have already found the max distance
if(isnull(chosen_turf))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
controller.set_blackboard_key(set_key, chosen_turf)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm b/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm
index 410c611ae43a..5ceef67bedb2 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm
@@ -27,7 +27,7 @@
/datum/ai_behavior/use_mob_ability/perform(seconds_per_tick, datum/ai_controller/controller, ability_key)
var/datum/action/cooldown/using_action = controller.blackboard[ability_key]
if (QDELETED(using_action))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
- if(using_action.Trigger())
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, ability_key)
+ return
+ var/result = using_action.Trigger()
+ finish_action(controller, result, ability_key)
diff --git a/code/datums/ai/basic_mobs/pet_commands/fetch.dm b/code/datums/ai/basic_mobs/pet_commands/fetch.dm
index 2eb65ccb3b94..ce018b55f7ec 100644
--- a/code/datums/ai/basic_mobs/pet_commands/fetch.dm
+++ b/code/datums/ai/basic_mobs/pet_commands/fetch.dm
@@ -14,16 +14,20 @@
set_movement_target(controller, fetch_thing)
/datum/ai_behavior/fetch_seek/perform(seconds_per_tick, datum/ai_controller/controller, target_key, delivery_key)
+ . = ..()
var/obj/item/fetch_thing = controller.blackboard[target_key]
// It stopped existing
if (QDELETED(fetch_thing))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key, delivery_key)
+ return
var/mob/living/living_pawn = controller.pawn
// We can't pick this up
if (fetch_thing.anchored || !isturf(fetch_thing.loc) || !living_pawn.CanReach(fetch_thing))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, FALSE, target_key, delivery_key)
+ return
+
+ finish_action(controller, TRUE, target_key, delivery_key)
/datum/ai_behavior/fetch_seek/finish_action(datum/ai_controller/controller, success, target_key, delivery_key)
. = ..()
@@ -50,13 +54,14 @@
set_movement_target(controller, return_target)
/datum/ai_behavior/deliver_fetched_item/perform(seconds_per_tick, datum/ai_controller/controller, delivery_key, storage_key)
+ . = ..()
var/mob/living/return_target = controller.blackboard[delivery_key]
if(QDELETED(return_target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, delivery_key)
+ return
- if(!deliver_item(controller, return_target, storage_key))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ deliver_item(controller, return_target, storage_key)
+ finish_action(controller, TRUE, delivery_key)
/datum/ai_behavior/deliver_fetched_item/finish_action(datum/ai_controller/controller, success, delivery_key)
. = ..()
@@ -64,13 +69,13 @@
controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND)
/// Actually deliver the fetched item to the target, if we still have it
-/// Returns TRUE if we succeeded, FALSE if we failed
/datum/ai_behavior/deliver_fetched_item/proc/deliver_item(datum/ai_controller/controller, return_target, storage_key)
var/mob/pawn = controller.pawn
var/obj/item/carried_item = controller.blackboard[storage_key]
if(QDELETED(carried_item) || carried_item.loc != pawn)
pawn.visible_message(span_notice("[pawn] looks around as if [pawn.p_they()] [pawn.p_have()] lost something."))
- return FALSE
+ finish_action(controller, FALSE)
+ return
pawn.visible_message(span_notice("[pawn] delivers [carried_item] to [return_target]."))
carried_item.forceMove(get_turf(return_target))
@@ -95,26 +100,22 @@
set_movement_target(controller, snack)
/datum/ai_behavior/eat_fetched_snack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, delivery_key)
+ . = ..()
var/obj/item/snack = controller.blackboard[target_key]
- var/is_living_loc = isliving(snack.loc)
- if(QDELETED(snack) || (!isturf(snack.loc) && !is_living_loc))
- // Where did it go?
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ if(QDELETED(snack) || !isturf(snack.loc) || ishuman(snack.loc))
+ finish_action(controller, FALSE) // Where did it go?
var/mob/living/basic/basic_pawn = controller.pawn
- if(is_living_loc)
- if(SPT_PROB(10, seconds_per_tick))
- basic_pawn.manual_emote("Stares at [snack.loc]'s [snack.name] intently.")
- return AI_BEHAVIOR_DELAY
-
- if(!basic_pawn.Adjacent(snack))
- return AI_BEHAVIOR_DELAY
+ if(!in_range(basic_pawn, snack))
+ return
- controller.ai_interact(target = snack) // snack attack!
+ if(isturf(snack.loc))
+ basic_pawn.melee_attack(snack) // snack attack!
+ else if(iscarbon(snack.loc) && SPT_PROB(10, seconds_per_tick))
+ basic_pawn.manual_emote("Stares at [snack.loc]'s [snack.name] intently.")
if(QDELETED(snack)) // we ate it!
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY
+ finish_action(controller, TRUE, target_key, delivery_key)
/datum/ai_behavior/eat_fetched_snack/finish_action(datum/ai_controller/controller, succeeded, target_key, delivery_key)
. = ..()
@@ -139,6 +140,7 @@
return
/datum/ai_behavior/forget_failed_fetches/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
COOLDOWN_START(src, reset_ignore_cooldown, cooldown_duration)
controller.clear_blackboard_key(BB_FETCH_IGNORE_LIST)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
diff --git a/code/datums/ai/basic_mobs/pet_commands/pet_follow_friend.dm b/code/datums/ai/basic_mobs/pet_commands/pet_follow_friend.dm
index 38a6939c9018..397021818aa8 100644
--- a/code/datums/ai/basic_mobs/pet_commands/pet_follow_friend.dm
+++ b/code/datums/ai/basic_mobs/pet_commands/pet_follow_friend.dm
@@ -10,7 +10,8 @@
set_movement_target(controller, target)
/datum/ai_behavior/pet_follow_friend/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/atom/target = controller.blackboard[target_key]
if (QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- return AI_BEHAVIOR_DELAY
+ finish_action(controller, FALSE, target_key)
+ return
diff --git a/code/datums/ai/basic_mobs/pet_commands/pet_use_targeted_ability.dm b/code/datums/ai/basic_mobs/pet_commands/pet_use_targeted_ability.dm
index 3c8c06b00996..c7153b0c12f7 100644
--- a/code/datums/ai/basic_mobs/pet_commands/pet_use_targeted_ability.dm
+++ b/code/datums/ai/basic_mobs/pet_commands/pet_use_targeted_ability.dm
@@ -13,11 +13,11 @@
var/datum/action/cooldown/mob_cooldown/ability = controller.blackboard[ability_key]
var/mob/living/target = controller.blackboard[target_key]
if (QDELETED(ability) || QDELETED(target))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, ability_key, target_key)
+ return
var/mob/pawn = controller.pawn
if(QDELETED(pawn) || ability.InterceptClickOn(pawn, null, target))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_INSTANT
+ finish_action(controller, TRUE, ability_key, target_key)
/datum/ai_behavior/pet_use_ability/finish_action(datum/ai_controller/controller, succeeded, ability_key, target_key)
. = ..()
diff --git a/code/datums/ai/basic_mobs/pet_commands/play_dead.dm b/code/datums/ai/basic_mobs/pet_commands/play_dead.dm
index 7d0c532bd835..3aed57fb35c2 100644
--- a/code/datums/ai/basic_mobs/pet_commands/play_dead.dm
+++ b/code/datums/ai/basic_mobs/pet_commands/play_dead.dm
@@ -11,9 +11,9 @@
basic_pawn.look_dead()
/datum/ai_behavior/play_dead/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
if(SPT_PROB(10, seconds_per_tick))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY
+ finish_action(controller, TRUE)
/datum/ai_behavior/play_dead/finish_action(datum/ai_controller/controller, succeeded)
. = ..()
diff --git a/code/datums/ai/dog/dog_behaviors.dm b/code/datums/ai/dog/dog_behaviors.dm
index 884161c2f82f..d0c55a347cff 100644
--- a/code/datums/ai/dog/dog_behaviors.dm
+++ b/code/datums/ai/dog/dog_behaviors.dm
@@ -11,21 +11,23 @@
controller.behavior_cooldowns[src] = world.time + get_cooldown(controller)
var/mob/living/living_pawn = controller.pawn
if(!(isturf(living_pawn.loc) || HAS_TRAIT(living_pawn, TRAIT_AI_BAGATTACK))) // Void puppies can attack from inside bags
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key, targeting_strategy_key, hiding_location_key)
+ return
// Unfortunately going to repeat this check in parent call but what can you do
var/atom/target = controller.blackboard[target_key]
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
if (!targeting_strategy.can_attack(living_pawn, target))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key, targeting_strategy_key, hiding_location_key)
+ return
if (!in_range(living_pawn, target))
growl_at(living_pawn, target, seconds_per_tick)
- return AI_BEHAVIOR_INSTANT
+ return
if(!controller.blackboard[BB_DOG_HARASS_HARM])
paw_harmlessly(living_pawn, target, seconds_per_tick)
- return AI_BEHAVIOR_INSTANT
+ return
// Give Ian some teeth
var/old_melee_lower = living_pawn.melee_damage_lower
@@ -37,7 +39,6 @@
living_pawn.melee_damage_lower = old_melee_lower
living_pawn.melee_damage_upper = old_melee_upper
- return AI_BEHAVIOR_DELAY
/// Swat at someone we don't like but won't hurt
/datum/ai_behavior/basic_melee_attack/dog/proc/paw_harmlessly(mob/living/living_pawn, atom/target, seconds_per_tick)
diff --git a/code/datums/ai/dog/dog_subtrees.dm b/code/datums/ai/dog/dog_subtrees.dm
index 74c075adad3a..62f63da54bdd 100644
--- a/code/datums/ai/dog/dog_subtrees.dm
+++ b/code/datums/ai/dog/dog_subtrees.dm
@@ -35,4 +35,5 @@
controller.clear_blackboard_key(target_key)
/datum/ai_behavior/find_hated_dog_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ . = ..()
+ finish_action(controller, TRUE)
diff --git a/code/datums/ai/generic/find_and_set.dm b/code/datums/ai/generic/find_and_set.dm
index c7534510b6af..b0d34f68c224 100644
--- a/code/datums/ai/generic/find_and_set.dm
+++ b/code/datums/ai/generic/find_and_set.dm
@@ -7,15 +7,16 @@
action_cooldown = 2 SECONDS
/datum/ai_behavior/find_and_set/perform(seconds_per_tick, datum/ai_controller/controller, set_key, locate_path, search_range)
+ . = ..()
if (controller.blackboard_key_exists(set_key))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- if(QDELETED(controller.pawn))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
+ return
var/find_this_thing = search_tactic(controller, locate_path, search_range)
- if(isnull(find_this_thing))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- controller.set_blackboard_key(set_key, find_this_thing)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ if(find_this_thing)
+ controller.set_blackboard_key(set_key, find_this_thing)
+ finish_action(controller, TRUE)
+ else
+ finish_action(controller, FALSE)
/datum/ai_behavior/find_and_set/proc/search_tactic(datum/ai_controller/controller, locate_path, search_range)
return locate(locate_path) in oview(search_range, controller.pawn)
@@ -38,17 +39,19 @@
/datum/ai_behavior/find_and_set/edible/search_tactic(datum/ai_controller/controller, locate_path, search_range)
var/mob/living/living_pawn = controller.pawn
+ var/list/food_candidates = list()
+ for(var/held_candidate as anything in living_pawn.held_items)
+ if(!held_candidate || !IsEdible(held_candidate))
+ continue
+ food_candidates += held_candidate
- for(var/atom/held_candidate as anything in living_pawn.held_items)
- if(IsEdible(held_candidate))
- return held_candidate
-
- for(var/atom/local_candidate as anything in oview(search_range, controller.pawn))
- if(IsEdible(local_candidate) && istype(local_candidate, locate_path))
- return local_candidate
-
- return null
-
+ var/list/local_results = locate(locate_path) in oview(search_range, controller.pawn)
+ for(var/local_candidate in local_results)
+ if(!IsEdible(local_candidate))
+ continue
+ food_candidates += local_candidate
+ if(food_candidates.len)
+ return pick(food_candidates)
/**
* Variant of find and set that only checks in hands, search range should be excluded for this
@@ -59,21 +62,18 @@
var/mob/living/living_pawn = controller.pawn
return locate(locate_path) in living_pawn.held_items
-/datum/ai_behavior/find_and_set/in_hands/given_list
-
-/datum/ai_behavior/find_and_set/in_hands/given_list/search_tactic(datum/ai_controller/controller, locate_paths)
- var/list/found = typecache_filter_list(controller.pawn, locate_paths)
- if(length(found))
- return pick(found)
-
/**
* Variant of find and set that takes a list of things to find.
*/
/datum/ai_behavior/find_and_set/in_list
/datum/ai_behavior/find_and_set/in_list/search_tactic(datum/ai_controller/controller, locate_paths, search_range)
- var/list/found = typecache_filter_list(oview(search_range, controller.pawn), locate_paths)
- if(length(found))
+ var/list/found = list()
+ for(var/locate_path in locate_paths)
+ var/single_locate = ..(controller, locate_path, search_range)
+ if(single_locate)
+ found += single_locate
+ if(found.len)
return pick(found)
/// Like find_and_set/in_list, but we return the turf location of the item instead of the item itself.
@@ -175,25 +175,3 @@
var/mob/living/living_pawn = controller.pawn
var/potential_friend = living_pawn.faction.Find(REF(friend)) ? friend : null
return potential_friend
-
-
-/datum/ai_behavior/find_and_set/in_list/turf_types
-
-/datum/ai_behavior/find_and_set/in_list/turf_types/search_tactic(datum/ai_controller/controller, locate_paths, search_range)
- var/list/found = RANGE_TURFS(search_range, controller.pawn)
- shuffle_inplace(found)
- for(var/turf/possible_turf as anything in found)
- if(!is_type_in_typecache(possible_turf, locate_paths))
- continue
- if(can_see(controller.pawn, possible_turf, search_range))
- return possible_turf
- return null
-
-/datum/ai_behavior/find_and_set/in_list/closest_turf
-
-/datum/ai_behavior/find_and_set/in_list/closest_turf/search_tactic(datum/ai_controller/controller, locate_paths, search_range)
- var/list/found = RANGE_TURFS(search_range, controller.pawn)
- for(var/turf/possible_turf as anything in found)
- if(!is_type_in_typecache(possible_turf, locate_paths) || !can_see(controller.pawn, possible_turf, search_range))
- found -= possible_turf
- return (length(found)) ? get_closest_atom(/turf, found, controller.pawn) : null
diff --git a/code/datums/ai/generic/generic_behaviors.dm b/code/datums/ai/generic/generic_behaviors.dm
index 251f1df4ffec..9a4cba2da6c5 100644
--- a/code/datums/ai/generic/generic_behaviors.dm
+++ b/code/datums/ai/generic/generic_behaviors.dm
@@ -1,25 +1,27 @@
/datum/ai_behavior/resist/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
var/mob/living/living_pawn = controller.pawn
- living_pawn.ai_controller.set_blackboard_key(BB_RESISTING, TRUE)
living_pawn.execute_resist()
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/battle_screech
///List of possible screeches the behavior has
var/list/screeches
/datum/ai_behavior/battle_screech/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
var/mob/living/living_pawn = controller.pawn
INVOKE_ASYNC(living_pawn, TYPE_PROC_REF(/mob, emote), pick(screeches))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
///Moves to target then finishes
/datum/ai_behavior/move_to_target
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
/datum/ai_behavior/move_to_target/perform(seconds_per_tick, datum/ai_controller/controller)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ . = ..()
+ finish_action(controller, TRUE)
/datum/ai_behavior/break_spine
@@ -39,10 +41,12 @@
var/mob/living/big_guy = controller.pawn //he was molded by the darkness
if(QDELETED(batman) || get_dist(batman, big_guy) >= give_up_distance)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
if(batman.stat != CONSCIOUS)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
+ return
big_guy.start_pulling(batman)
big_guy.face_atom(batman)
@@ -58,7 +62,7 @@
else
batman.adjustBruteLoss(150)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/break_spine/finish_action(datum/ai_controller/controller, succeeded, target_key)
if(succeeded)
@@ -75,12 +79,14 @@
/datum/ai_behavior/use_in_hand/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
var/mob/living/pawn = controller.pawn
var/obj/item/held = pawn.get_active_held_item()
if(!held)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
pawn.activate_hand()
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/// Use the currently held item, or unarmed, on a weakref to an object in the world
/datum/ai_behavior/use_on_object
@@ -95,18 +101,21 @@
set_movement_target(controller, target)
/datum/ai_behavior/use_on_object/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/mob/living/pawn = controller.pawn
var/obj/item/held_item = pawn.get_item_by_slot(pawn.get_active_hand())
var/atom/target = controller.blackboard[target_key]
if(QDELETED(target) || !pawn.CanReach(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
+ pawn.set_combat_mode(FALSE)
if(held_item)
held_item.melee_attack_chain(pawn, target)
else
- controller.ai_interact(target = target, combat_mode = FALSE)
+ pawn.UnarmedAttack(target, TRUE)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/give
required_distance = 1
@@ -118,34 +127,37 @@
set_movement_target(controller, controller.blackboard[target_key])
/datum/ai_behavior/give/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/mob/living/pawn = controller.pawn
var/obj/item/held_item = pawn.get_active_held_item()
var/atom/target = controller.blackboard[target_key]
if(!held_item) //if held_item is null, we pretend that action was succesful
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
+ return
if(!target || !pawn.CanReach(target) || !isliving(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
var/mob/living/living_target = target
- var/perform_flags = try_to_give_item(controller, living_target, held_item)
- if(perform_flags & AI_BEHAVIOR_FAILED)
- return perform_flags
+
+ if(!try_to_give_item(controller, living_target, held_item))
+ return
controller.PauseAi(1.5 SECONDS)
living_target.visible_message(
span_info("[pawn] starts trying to give [held_item] to [living_target]!"),
span_warning("[pawn] tries to give you [held_item]!")
)
if(!do_after(pawn, 1 SECONDS, living_target))
- return AI_BEHAVIOR_DELAY | perform_flags
+ return
- perform_flags |= try_to_give_item(controller, living_target, held_item, actually_give = TRUE)
- return AI_BEHAVIOR_DELAY | perform_flags
+ try_to_give_item(controller, living_target, held_item, actually_give = TRUE)
/datum/ai_behavior/give/proc/try_to_give_item(datum/ai_controller/controller, mob/living/target, obj/item/held_item, actually_give)
if(QDELETED(held_item) || QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return FALSE
var/has_left_pocket = target.can_equip(held_item, ITEM_SLOT_LPOCKET)
var/has_right_pocket = target.can_equip(held_item, ITEM_SLOT_RPOCKET)
@@ -157,16 +169,17 @@
break
if(!has_left_pocket && !has_right_pocket && !has_valid_hand)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return FALSE
if(!actually_give)
- return AI_BEHAVIOR_DELAY
+ return TRUE
if(!has_valid_hand || prob(50))
target.equip_to_slot_if_possible(held_item, (!has_left_pocket ? ITEM_SLOT_RPOCKET : (prob(50) ? ITEM_SLOT_LPOCKET : ITEM_SLOT_RPOCKET)))
else
target.put_in_hands(held_item)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/consume
@@ -179,20 +192,21 @@
set_movement_target(controller, controller.blackboard[target_key])
/datum/ai_behavior/consume/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hunger_timer_key)
+ . = ..()
var/mob/living/living_pawn = controller.pawn
var/obj/item/target = controller.blackboard[target_key]
if(QDELETED(target))
- return AI_BEHAVIOR_DELAY
+ return
if(!(target in living_pawn.held_items))
if(!living_pawn.get_empty_held_indexes() || !living_pawn.put_in_hands(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target, hunger_timer_key)
+ return
target.melee_attack_chain(living_pawn, living_pawn)
if(QDELETED(target) || prob(10)) // Even if we don't finish it all we can randomly decide to be done
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY
+ finish_action(controller, TRUE, null, hunger_timer_key)
/datum/ai_behavior/consume/finish_action(datum/ai_controller/controller, succeeded, target_key, hunger_timer_key)
. = ..()
@@ -205,34 +219,37 @@
/datum/ai_behavior/drop_item
/datum/ai_behavior/drop_item/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
var/mob/living/living_pawn = controller.pawn
var/obj/item/best_held = GetBestWeapon(controller, null, living_pawn.held_items)
for(var/obj/item/held as anything in living_pawn.held_items)
if(!held || held == best_held)
continue
living_pawn.dropItemToGround(held)
- return AI_BEHAVIOR_DELAY
/// This behavior involves attacking a target.
/datum/ai_behavior/attack
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM | AI_BEHAVIOR_REQUIRE_REACH
+ behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM
+ required_distance = 1
/datum/ai_behavior/attack/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
var/mob/living/living_pawn = controller.pawn
if(!istype(living_pawn) || !isturf(living_pawn.loc))
- return AI_BEHAVIOR_DELAY
+ return
var/atom/movable/attack_target = controller.blackboard[BB_ATTACK_TARGET]
if(!attack_target || !can_see(living_pawn, attack_target, length = controller.blackboard[BB_VISION_RANGE]))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
var/mob/living/living_target = attack_target
if(istype(living_target) && (living_target.stat == DEAD))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
+ return
set_movement_target(controller, living_target)
attack(controller, living_target)
- return AI_BEHAVIOR_DELAY
/datum/ai_behavior/attack/finish_action(datum/ai_controller/controller, succeeded)
. = ..()
@@ -251,20 +268,22 @@
required_distance = 1
/datum/ai_behavior/follow/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
var/mob/living/living_pawn = controller.pawn
if(!istype(living_pawn) || !isturf(living_pawn.loc))
- return AI_BEHAVIOR_DELAY
+ return
var/atom/movable/follow_target = controller.blackboard[BB_FOLLOW_TARGET]
if(!follow_target || get_dist(living_pawn, follow_target) > controller.blackboard[BB_VISION_RANGE])
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
var/mob/living/living_target = follow_target
if(istype(living_target) && (living_target.stat == DEAD))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
+ return
set_movement_target(controller, living_target)
- return AI_BEHAVIOR_DELAY
/datum/ai_behavior/follow/finish_action(datum/ai_controller/controller, succeeded)
. = ..()
@@ -272,14 +291,12 @@
/datum/ai_behavior/perform_emote
-/datum/ai_behavior/perform_emote/perform(seconds_per_tick, datum/ai_controller/controller, emote, speech_sound)
+/datum/ai_behavior/perform_emote/perform(seconds_per_tick, datum/ai_controller/controller, emote)
var/mob/living/living_pawn = controller.pawn
if(!istype(living_pawn))
- return AI_BEHAVIOR_INSTANT
+ return
living_pawn.manual_emote(emote)
- if(speech_sound) // Only audible emotes will pass in a sound
- playsound(living_pawn, speech_sound, 80, vary = TRUE, pressure_affected =TRUE, ignore_walls = FALSE)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/perform_speech
@@ -288,20 +305,21 @@
var/mob/living/living_pawn = controller.pawn
if(!istype(living_pawn))
- return AI_BEHAVIOR_INSTANT
+ return
living_pawn.say(speech, forced = "AI Controller")
if(speech_sound)
playsound(living_pawn, speech_sound, 80, vary = TRUE)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/perform_speech_radio
/datum/ai_behavior/perform_speech_radio/perform(seconds_per_tick, datum/ai_controller/controller, speech, obj/item/radio/speech_radio, list/try_channels = list(RADIO_CHANNEL_COMMON))
var/mob/living/living_pawn = controller.pawn
if(!istype(living_pawn) || !istype(speech_radio) || QDELETED(speech_radio) || !length(try_channels))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
speech_radio.talk_into(living_pawn, speech, pick(try_channels))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
//song behaviors
@@ -319,20 +337,24 @@
song.ParseSong(song_lines)
song.repeat = 10
song.volume = song.max_volume - 10
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/play_instrument
/datum/ai_behavior/play_instrument/perform(seconds_per_tick, datum/ai_controller/controller, song_instrument_key)
+ . = ..()
+
var/obj/item/instrument/song_instrument = controller.blackboard[song_instrument_key]
var/datum/song/song = song_instrument.song
song.start_playing(controller.pawn)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/find_nearby
/datum/ai_behavior/find_nearby/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
+
var/list/possible_targets = list()
for(var/atom/thing in view(2, controller.pawn))
if(!thing.mouse_opacity)
@@ -341,6 +363,6 @@
continue
possible_targets += thing
if(!possible_targets.len)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
controller.set_blackboard_key(target_key, pick(possible_targets))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
diff --git a/code/datums/ai/hunting_behavior/hunting_behaviors.dm b/code/datums/ai/hunting_behavior/hunting_behaviors.dm
index 0ab14ff0d320..9bd8c60f28a4 100644
--- a/code/datums/ai/hunting_behavior/hunting_behaviors.dm
+++ b/code/datums/ai/hunting_behavior/hunting_behaviors.dm
@@ -50,20 +50,22 @@
/// Finds a specific atom type to hunt.
/datum/ai_behavior/find_hunt_target
- ///is this only meant to search for turf types?
- var/search_turf_types = FALSE
/datum/ai_behavior/find_hunt_target/perform(seconds_per_tick, datum/ai_controller/controller, hunting_target_key, types_to_hunt, hunt_range)
+ . = ..()
+
var/mob/living/living_mob = controller.pawn
- var/list/interesting_objects = search_turf_types ? RANGE_TURFS(hunt_range, living_mob) : oview(hunt_range, living_mob)
- for(var/atom/possible_dinner as anything in typecache_filter_list(interesting_objects, types_to_hunt))
- if(!valid_dinner(living_mob, possible_dinner, hunt_range, controller, seconds_per_tick))
+
+ for(var/atom/possible_dinner as anything in typecache_filter_list(range(hunt_range, living_mob), types_to_hunt))
+ if(!valid_dinner(living_mob, possible_dinner, hunt_range))
continue
controller.set_blackboard_key(hunting_target_key, possible_dinner)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, TRUE)
+ return
+
+ finish_action(controller, FALSE)
-/datum/ai_behavior/find_hunt_target/proc/valid_dinner(mob/living/source, atom/dinner, radius, datum/ai_controller/controller, seconds_per_tick)
+/datum/ai_behavior/find_hunt_target/proc/valid_dinner(mob/living/source, atom/dinner, radius)
if(isliving(dinner))
var/mob/living/living_target = dinner
if(living_target.stat == DEAD) //bitch is dead
@@ -71,12 +73,9 @@
return can_see(source, dinner, radius)
-/datum/ai_behavior/find_hunt_target/search_turf_types
- search_turf_types = TRUE
-
/// Hunts down a specific atom type.
/datum/ai_behavior/hunt_target
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH
+ behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
/// How long do we have to wait after a successful hunt?
var/hunt_cooldown = 5 SECONDS
/// Do we reset the target after attacking something, so we can check for status changes.
@@ -91,13 +90,15 @@
set_movement_target(controller, hunt_target)
/datum/ai_behavior/hunt_target/perform(seconds_per_tick, datum/ai_controller/controller, hunting_target_key, hunting_cooldown_key)
+ . = ..()
var/mob/living/hunter = controller.pawn
var/atom/hunted = controller.blackboard[hunting_target_key]
if(QDELETED(hunted))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- target_caught(hunter, hunted)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, FALSE, hunting_target_key)
+ else
+ target_caught(hunter, hunted)
+ finish_action(controller, TRUE, hunting_target_key, hunting_cooldown_key)
/datum/ai_behavior/hunt_target/proc/target_caught(mob/living/hunter, atom/hunted)
if(isliving(hunted)) // Are we hunting a living mob?
@@ -122,23 +123,25 @@
if(always_reset_target && hunting_target_key)
controller.clear_blackboard_key(hunting_target_key)
-/datum/ai_behavior/hunt_target/interact_with_target
- ///what combat mode should we use to interact with
- var/behavior_combat_mode = TRUE
+/datum/ai_behavior/hunt_target/unarmed_attack_target
+ ///do we toggle combat mode before interacting with the object?
+ var/switch_combat_mode = FALSE
-/datum/ai_behavior/hunt_target/interact_with_target/target_caught(mob/living/hunter, obj/structure/cable/hunted)
- var/datum/ai_controller/controller = hunter.ai_controller
- controller.ai_interact(target = hunted, combat_mode = behavior_combat_mode)
+/datum/ai_behavior/hunt_target/unarmed_attack_target/target_caught(mob/living/hunter, obj/structure/cable/hunted)
+ hunter.UnarmedAttack(hunted, TRUE)
-/datum/ai_behavior/hunt_target/interact_with_target/combat_mode_off
- behavior_combat_mode = FALSE
+/datum/ai_behavior/hunt_target/unarmed_attack_target/finish_action(datum/ai_controller/controller, succeeded, hunting_target_key, hunting_cooldown_key)
+ . = ..()
+ if(!switch_combat_mode)
+ return
+ var/mob/living/living_pawn = controller.pawn
+ living_pawn.istate = initial(living_pawn.istate)
-/datum/ai_behavior/hunt_target/interact_with_target/reset_target
- always_reset_target = TRUE
+/datum/ai_behavior/hunt_target/unarmed_attack_target/switch_combat_mode
+ switch_combat_mode = TRUE
-/datum/ai_behavior/hunt_target/interact_with_target/reset_target_combat_mode_off
+/datum/ai_behavior/hunt_target/unarmed_attack_target/reset_target
always_reset_target = TRUE
- behavior_combat_mode = FALSE
/datum/ai_behavior/hunt_target/use_ability_on_target
always_reset_target = TRUE
@@ -148,26 +151,10 @@
/datum/ai_behavior/hunt_target/use_ability_on_target/perform(seconds_per_tick, datum/ai_controller/controller, hunting_target_key, hunting_cooldown_key)
var/datum/action/cooldown/ability = controller.blackboard[ability_key]
if(!ability?.IsAvailable())
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, hunting_target_key)
return ..()
/datum/ai_behavior/hunt_target/use_ability_on_target/target_caught(mob/living/hunter, atom/hunted)
var/datum/action/cooldown/ability = hunter.ai_controller.blackboard[ability_key]
ability.InterceptClickOn(hunter, null, hunted)
-
-/datum/ai_behavior/hunt_target/latch_onto
-
-/datum/ai_behavior/hunt_target/latch_onto/setup(datum/ai_controller/controller, hunting_target_key, hunting_cooldown_key)
- . = ..()
- var/mob/living/living_pawn = controller.pawn
- if(living_pawn.buckled)
- return FALSE
-
-/datum/ai_behavior/hunt_target/latch_onto/target_caught(mob/living/hunter, obj/hunted)
- if(hunter.buckled)
- return FALSE
- if(!hunted.buckle_mob(hunter, force = TRUE))
- return FALSE
- hunted.visible_message(span_notice("[hunted] has been latched onto by [hunter]!"))
- return TRUE
diff --git a/code/datums/ai/hunting_behavior/hunting_corpses.dm b/code/datums/ai/hunting_behavior/hunting_corpses.dm
index 5062a8aaf929..e720e4da947a 100644
--- a/code/datums/ai/hunting_behavior/hunting_corpses.dm
+++ b/code/datums/ai/hunting_behavior/hunting_corpses.dm
@@ -1,18 +1,17 @@
-/datum/ai_planning_subtree/find_and_hunt_target/look_for_light_fixtures
- target_key = BB_LOW_PRIORITY_HUNTING_TARGET
- finding_behavior = /datum/ai_behavior/find_hunt_target/light_fixtures
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/light_fixtures
- hunt_targets = list(/obj/machinery/light)
- hunt_range = 7
+/// Find and attack corpses
+/datum/ai_planning_subtree/find_and_hunt_target/corpses
+ finding_behavior = /datum/ai_behavior/find_hunt_target/corpses
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target
+ hunt_targets = list(/mob/living)
-/datum/ai_behavior/hunt_target/interact_with_target/light_fixtures
- hunt_cooldown = 10 SECONDS
- always_reset_target = TRUE
+/// Find nearby dead mobs
+/datum/ai_behavior/find_hunt_target/corpses
-/datum/ai_behavior/find_hunt_target/light_fixtures
-
-/datum/ai_behavior/find_hunt_target/light_fixtures/valid_dinner(mob/living/source, obj/machinery/light/dinner, radius)
- if(dinner.status == LIGHT_BROKEN) //light is already broken
+/datum/ai_behavior/find_hunt_target/corpses/valid_dinner(mob/living/source, mob/living/dinner, radius)
+ if (!isliving(dinner) || dinner.stat != DEAD)
return FALSE
-
return can_see(source, dinner, radius)
+
+/// Find and attack specifically human corpses
+/datum/ai_planning_subtree/find_and_hunt_target/corpses/human
+ hunt_targets = list(/mob/living/carbon/human)
diff --git a/code/datums/ai/hunting_behavior/hunting_mouse.dm b/code/datums/ai/hunting_behavior/hunting_mouse.dm
index f97ebf27ddf6..d0e7161fd2de 100644
--- a/code/datums/ai/hunting_behavior/hunting_mouse.dm
+++ b/code/datums/ai/hunting_behavior/hunting_mouse.dm
@@ -1,13 +1,13 @@
// Mouse subtree to hunt down delicious cheese.
/datum/ai_planning_subtree/find_and_hunt_target/look_for_cheese
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/mouse
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/mouse
hunt_targets = list(/obj/item/food/cheese)
hunt_range = 1
// Mouse subtree to hunt down ... delicious cabling?
/datum/ai_planning_subtree/find_and_hunt_target/look_for_cables
target_key = BB_LOW_PRIORITY_HUNTING_TARGET
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/mouse
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/mouse
finding_behavior = /datum/ai_behavior/find_hunt_target/mouse_cable
hunt_targets = list(/obj/structure/cable)
hunt_range = 0 // Only look below us
@@ -28,5 +28,5 @@
return below_the_cable.underfloor_accessibility >= UNDERFLOOR_INTERACTABLE
// Our hunts have a decent cooldown.
-/datum/ai_behavior/hunt_target/interact_with_target/mouse
+/datum/ai_behavior/hunt_target/unarmed_attack_target/mouse
hunt_cooldown = 20 SECONDS
diff --git a/code/datums/ai/monkey/monkey_behaviors.dm b/code/datums/ai/monkey/monkey_behaviors.dm
index 55464ed06cd1..77aa49dd6c55 100644
--- a/code/datums/ai/monkey/monkey_behaviors.dm
+++ b/code/datums/ai/monkey/monkey_behaviors.dm
@@ -12,51 +12,55 @@
controller.clear_blackboard_key(BB_MONKEY_PICKUPTARGET)
-/// Equips an item on the monkey
-/// Returns TRUE if it works out, FALSE otherwise
/datum/ai_behavior/monkey_equip/proc/equip_item(datum/ai_controller/controller)
var/mob/living/living_pawn = controller.pawn
var/obj/item/target = controller.blackboard[BB_MONKEY_PICKUPTARGET]
var/best_force = controller.blackboard[BB_MONKEY_BEST_FORCE_FOUND]
+
if(!isturf(living_pawn.loc))
- return FALSE
+ finish_action(controller, FALSE)
+ return
if(!target)
- return FALSE
+ finish_action(controller, FALSE)
+ return
if(target.anchored) //Can't pick it up, so stop trying.
- return FALSE
+ finish_action(controller, FALSE)
+ return
// Strong weapon
else if(target.force > best_force)
living_pawn.drop_all_held_items()
living_pawn.put_in_hands(target)
controller.set_blackboard_key(BB_MONKEY_BEST_FORCE_FOUND, target.force)
- return TRUE
+ finish_action(controller, TRUE)
+ return
else if(target.slot_flags) //Clothing == top priority
living_pawn.dropItemToGround(target, TRUE)
living_pawn.update_icons()
if(!living_pawn.equip_to_appropriate_slot(target))
- return FALSE //Already wearing something, in the future this should probably replace the current item but the code didn't actually do that, and I dont want to support it right now.
- return TRUE
+ finish_action(controller, FALSE)
+ return //Already wearing something, in the future this should probably replace the current item but the code didn't actually do that, and I dont want to support it right now.
+ finish_action(controller, TRUE)
+ return
// EVERYTHING ELSE
else if(living_pawn.get_empty_held_indexes())
living_pawn.put_in_hands(target)
- return TRUE
+ finish_action(controller, TRUE)
+ return
- return FALSE
+ finish_action(controller, FALSE)
/datum/ai_behavior/monkey_equip/ground
required_distance = 0
/datum/ai_behavior/monkey_equip/ground/perform(seconds_per_tick, datum/ai_controller/controller)
. = ..()
- if(equip_item(controller))
- return . | AI_BEHAVIOR_SUCCEEDED
- return . | AI_BEHAVIOR_FAILED
+ equip_item(controller)
/datum/ai_behavior/monkey_equip/pickpocket
@@ -106,10 +110,13 @@
/datum/ai_behavior/monkey_flee
/datum/ai_behavior/monkey_flee/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
+
var/mob/living/living_pawn = controller.pawn
- if(living_pawn.health >= MONKEY_FLEE_HEALTH) //we're back in bussiness
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ if(living_pawn.health >= MONKEY_FLEE_HEALTH)
+ finish_action(controller, TRUE) //we're back in bussiness
+ return
var/mob/living/target = null
@@ -121,8 +128,8 @@
if(target)
SSmove_manager.move_away(living_pawn, target, max_dist=MONKEY_ENEMY_VISION, delay=5)
- return AI_BEHAVIOR_DELAY
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ else
+ finish_action(controller, TRUE)
/datum/ai_behavior/monkey_attack_mob
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM //performs to increase frustration
@@ -132,28 +139,28 @@
set_movement_target(controller, controller.blackboard[target_key])
/datum/ai_behavior/monkey_attack_mob/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
+
var/mob/living/target = controller.blackboard[target_key]
var/mob/living/living_pawn = controller.pawn
- if(!target || target.stat != CONSCIOUS) //Target == owned
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
-
- if(!isturf(target.loc) || IS_DEAD_OR_INCAP(living_pawn)) // Check if they're a valid target
- return AI_BEHAVIOR_DELAY
- // check if target has a weapon
- var/obj/item/W
- for(var/obj/item/I in target.held_items)
- if(!(I.item_flags & ABSTRACT))
- W = I
- break
+ if(!target || target.stat != CONSCIOUS)
+ finish_action(controller, TRUE) //Target == owned
+ return
- // if the target has a weapon, chance to disarm them
- var/perform_flags = NONE
- if(W && SPT_PROB(MONKEY_ATTACK_DISARM_PROB, seconds_per_tick))
- perform_flags = monkey_attack(controller, target, seconds_per_tick, TRUE)
- else
- perform_flags = monkey_attack(controller, target, seconds_per_tick, FALSE)
- return AI_BEHAVIOR_DELAY | perform_flags
+ if(isturf(target.loc) && !IS_DEAD_OR_INCAP(living_pawn)) // Check if they're a valid target
+ // check if target has a weapon
+ var/obj/item/W
+ for(var/obj/item/I in target.held_items)
+ if(!(I.item_flags & ABSTRACT))
+ W = I
+ break
+
+ // if the target has a weapon, chance to disarm them
+ if(W && SPT_PROB(MONKEY_ATTACK_DISARM_PROB, seconds_per_tick))
+ monkey_attack(controller, target, seconds_per_tick, TRUE)
+ else
+ monkey_attack(controller, target, seconds_per_tick, FALSE)
/datum/ai_behavior/monkey_attack_mob/finish_action(datum/ai_controller/controller, succeeded, target_key)
@@ -169,7 +176,7 @@
var/mob/living/living_pawn = controller.pawn
if(living_pawn.next_move > world.time)
- return NONE
+ return
living_pawn.changeNext_move(CLICK_CD_MELEE) //We play fair
@@ -189,7 +196,7 @@
else
if(disarm)
living_pawn.istate |= ISTATE_SECONDARY
- controller.ai_interact(target = target, modifiers = disarm ? list(RIGHT_CLICK = TRUE) : null) //Fake a right click if we're disarmin
+ living_pawn.UnarmedAttack(target, null) //Fake a right click if we're disarmin
living_pawn.istate &= ~ISTATE_SECONDARY
controller.set_blackboard_key(BB_MONKEY_GUN_WORKED, TRUE) // We reset their memory of the gun being 'broken' if they accomplish some other attack
else if(weapon)
@@ -211,7 +218,7 @@
// no de-aggro
if(controller.blackboard[BB_MONKEY_AGGRESSIVE] && !(HAS_TRAIT(target, TRAIT_MONKEYFRIEND)))
- return NONE
+ return
// we've queued up a monkey attack on a mob which isn't already an enemy, so give them 1 threat to start
// note they might immediately reduce threat and drop from the list.
@@ -235,8 +242,7 @@
controller.remove_thing_from_blackboard_key(BB_MONKEY_ENEMIES, target)
living_pawn.set_combat_mode(FALSE)
if(controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] == target)
- return AI_BEHAVIOR_SUCCEEDED
- return NONE
+ finish_action(controller, TRUE)
/datum/ai_behavior/disposal_mob
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM //performs to increase frustration
@@ -252,8 +258,10 @@
controller.clear_blackboard_key(disposal_target_key) //No target disposal
/datum/ai_behavior/disposal_mob/perform(seconds_per_tick, datum/ai_controller/controller, attack_target_key, disposal_target_key)
+ . = ..()
+
if(controller.blackboard[BB_MONKEY_DISPOSING]) //We are disposing, don't do ANYTHING!!!!
- return AI_BEHAVIOR_DELAY
+ return
var/mob/living/target = controller.blackboard[attack_target_key]
var/mob/living/living_pawn = controller.pawn
@@ -261,24 +269,25 @@
set_movement_target(controller, target)
if(!target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
if(target.pulledby != living_pawn && !HAS_AI_CONTROLLER_TYPE(target.pulledby, /datum/ai_controller/monkey)) //Dont steal from my fellow monkeys.
if(living_pawn.Adjacent(target) && isturf(target.loc))
target.grabbedby(living_pawn)
- return AI_BEHAVIOR_DELAY //Do the rest next turn
+ return //Do the rest next turn
var/obj/machinery/disposal/disposal = controller.blackboard[disposal_target_key]
set_movement_target(controller, disposal)
if(!disposal)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
if(living_pawn.Adjacent(disposal))
INVOKE_ASYNC(src, PROC_REF(try_disposal_mob), controller, attack_target_key, disposal_target_key) //put him in!
- return AI_BEHAVIOR_DELAY
- //This means we might be getting pissed!
- return AI_BEHAVIOR_DELAY
+ else //This means we might be getting pissed!
+ return
/datum/ai_behavior/disposal_mob/proc/try_disposal_mob(datum/ai_controller/controller, attack_target_key, disposal_target_key)
var/mob/living/living_pawn = controller.pawn
@@ -293,6 +302,8 @@
/datum/ai_behavior/recruit_monkeys/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
+
controller.set_blackboard_key(BB_MONKEY_RECRUIT_COOLDOWN, world.time + MONKEY_RECRUIT_COOLDOWN)
var/mob/living/living_pawn = controller.pawn
@@ -306,7 +317,7 @@
// Other monkeys now also hate the guy we're currently targeting
nearby_monkey.ai_controller.add_blackboard_key_assoc(BB_MONKEY_ENEMIES, controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET], MONKEY_RECRUIT_HATED_AMOUNT)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/monkey_set_combat_target/perform(seconds_per_tick, datum/ai_controller/controller, set_key, enemies_key)
var/list/enemies = controller.blackboard[enemies_key]
@@ -323,7 +334,8 @@
valids[possible_enemy] = CEILING(100 / (get_dist(controller.pawn, possible_enemy) || 1), 1)
if(!length(valids))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
controller.set_blackboard_key(set_key, pick_weight(valids))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
diff --git a/code/datums/ai/objects/mod.dm b/code/datums/ai/objects/mod.dm
index e8e7d4bd6ac8..84f5678addbf 100644
--- a/code/datums/ai/objects/mod.dm
+++ b/code/datums/ai/objects/mod.dm
@@ -35,11 +35,12 @@
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT|AI_BEHAVIOR_MOVE_AND_PERFORM
/datum/ai_behavior/mod_attach/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
if(!controller.pawn.Adjacent(controller.blackboard[BB_MOD_TARGET]))
- return AI_BEHAVIOR_DELAY
+ return
var/obj/item/implant/mod/implant = controller.blackboard[BB_MOD_IMPLANT]
implant.module.attach(controller.blackboard[BB_MOD_TARGET])
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/mod_attach/finish_action(datum/ai_controller/controller, succeeded)
. = ..()
diff --git a/code/datums/ai/objects/vending_machines/vending_machine_behaviors.dm b/code/datums/ai/objects/vending_machines/vending_machine_behaviors.dm
index d6310bfc9f3b..b4e5609531c1 100644
--- a/code/datums/ai/objects/vending_machines/vending_machine_behaviors.dm
+++ b/code/datums/ai/objects/vending_machines/vending_machine_behaviors.dm
@@ -10,15 +10,15 @@
set_movement_target(controller, controller.blackboard[target_key])
/datum/ai_behavior/vendor_crush/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
if(controller.blackboard[BB_VENDING_BUSY_TILTING])
- return AI_BEHAVIOR_DELAY
+ return
controller.ai_movement.stop_moving_towards(controller)
controller.set_blackboard_key(BB_VENDING_BUSY_TILTING, TRUE)
var/turf/target_turf = get_turf(controller.blackboard[BB_VENDING_CURRENT_TARGET])
new /obj/effect/temp_visual/telegraphing/vending_machine_tilt(target_turf)
addtimer(CALLBACK(src, PROC_REF(tiltonmob), controller, target_turf), time_to_tilt)
- return AI_BEHAVIOR_DELAY
/datum/ai_behavior/vendor_crush/proc/tiltonmob(datum/ai_controller/controller, turf/target_turf)
var/obj/machinery/vending/vendor_pawn = controller.pawn
@@ -40,9 +40,10 @@
var/succes_tilt_cooldown = 5 SECONDS
/datum/ai_behavior/vendor_rise_up/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
var/obj/machinery/vending/vendor_pawn = controller.pawn
vendor_pawn.visible_message(span_warning("[vendor_pawn] untilts itself!"))
if(controller.blackboard[BB_VENDING_LAST_HIT_SUCCESFUL])
controller.set_blackboard_key(BB_VENDING_TILT_COOLDOWN, world.time + succes_tilt_cooldown)
vendor_pawn.untilt()
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
diff --git a/code/datums/ai/robot_customer/robot_customer_behaviors.dm b/code/datums/ai/robot_customer/robot_customer_behaviors.dm
index 2c658a3d497d..735b795e6066 100644
--- a/code/datums/ai/robot_customer/robot_customer_behaviors.dm
+++ b/code/datums/ai/robot_customer/robot_customer_behaviors.dm
@@ -2,6 +2,7 @@
action_cooldown = 8 SECONDS
/datum/ai_behavior/find_seat/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
var/mob/living/basic/robot_customer/customer_pawn = controller.pawn
var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO]
var/datum/venue/attending_venue = controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE]
@@ -27,20 +28,22 @@
customer_pawn.say(pick(customer_data.found_seat_lines))
controller.set_blackboard_key(BB_CUSTOMER_MY_SEAT, found_seat)
attending_venue.linked_seats[found_seat] = customer_pawn
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
+ return
// SPT_PROB 1.5 is about a 60% chance that the tourist will have vocalised at least once every minute.
if(!controller.blackboard[BB_CUSTOMER_SAID_CANT_FIND_SEAT_LINE] || SPT_PROB(1.5, seconds_per_tick))
customer_pawn.say(pick(customer_data.cant_find_seat_lines))
controller.set_blackboard_key(BB_CUSTOMER_SAID_CANT_FIND_SEAT_LINE, TRUE)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
/datum/ai_behavior/order_food
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
required_distance = 0
/datum/ai_behavior/order_food/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
var/mob/living/basic/robot_customer/customer_pawn = controller.pawn
var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO]
var/obj/structure/holosign/robot_seat/seat_marker = controller.blackboard[BB_CUSTOMER_MY_SEAT]
@@ -52,15 +55,18 @@
var/datum/venue/attending_venue = controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE]
controller.set_blackboard_key(BB_CUSTOMER_CURRENT_ORDER, attending_venue.order_food(customer_pawn, customer_data))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+
+ finish_action(controller, TRUE)
/datum/ai_behavior/wait_for_food
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM
required_distance = 0
/datum/ai_behavior/wait_for_food/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
if(controller.blackboard[BB_CUSTOMER_EATING])
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
+ return
controller.add_blackboard_key(BB_CUSTOMER_PATIENCE, seconds_per_tick * -1 SECONDS) // Convert seconds_per_tick to a SECONDS equivalent.
if(controller.blackboard[BB_CUSTOMER_PATIENCE] < 0 || controller.blackboard[BB_CUSTOMER_LEAVING]) // Check if we're leaving because sometthing mightve forced us to
@@ -89,7 +95,6 @@
customer.eat_order(I, attending_venue)
break
- return AI_BEHAVIOR_DELAY
/datum/ai_behavior/wait_for_food/finish_action(datum/ai_controller/controller, succeeded)
. = ..()
@@ -117,5 +122,6 @@
set_movement_target(controller, attending_venue.restaurant_portal)
/datum/ai_behavior/leave_venue/perform(seconds_per_tick, datum/ai_controller/controller, venue_key)
+ . = ..()
qdel(controller.pawn) //save the world, my final message, goodbye.
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
diff --git a/code/datums/components/bakeable.dm b/code/datums/components/bakeable.dm
index 1ddd3ce19ce3..3a654b4e4696 100644
--- a/code/datums/components/bakeable.dm
+++ b/code/datums/components/bakeable.dm
@@ -14,10 +14,7 @@
/// REF() to the mind which placed us in an oven
var/who_baked_us
- /// Reagents that should be added to the result
- var/list/added_reagents
-
-/datum/component/bakeable/Initialize(bake_result, required_bake_time, positive_result, use_large_steam_sprit, list/added_reagents)
+/datum/component/bakeable/Initialize(bake_result, required_bake_time, positive_result, use_large_steam_sprite)
. = ..()
if(!isitem(parent)) //Only items support baking at the moment
return COMPONENT_INCOMPATIBLE
@@ -25,9 +22,6 @@
src.bake_result = bake_result
src.required_bake_time = required_bake_time
src.positive_result = positive_result
- src.added_reagents = added_reagents
- if(positive_result)
- ADD_TRAIT(parent, TRAIT_BAKEABLE, REF(src))
// Inherit the new values passed to the component
/datum/component/bakeable/InheritComponent(datum/component/bakeable/new_comp, original, bake_result, required_bake_time, positive_result, use_large_steam_sprite)
@@ -47,7 +41,6 @@
/datum/component/bakeable/UnregisterFromParent()
UnregisterSignal(parent, list(COMSIG_ITEM_OVEN_PLACED_IN, COMSIG_ITEM_OVEN_PROCESS, COMSIG_ATOM_EXAMINE))
- REMOVE_TRAIT(parent, TRAIT_BAKEABLE, REF(src))
/// Signal proc for [COMSIG_ITEM_OVEN_PLACED_IN] when baking starts (parent enters an oven)
/datum/component/bakeable/proc/on_baking_start(datum/source, atom/used_oven, mob/baker)
@@ -74,11 +67,6 @@
var/atom/original_object = parent
var/obj/item/plate/oven_tray/used_tray = original_object.loc
var/atom/baked_result = new bake_result(used_tray)
- if(baked_result.reagents && positive_result) //make space and tranfer reagents if it has any & the resulting item isn't bad food or other bad baking result
- baked_result.reagents.clear_reagents()
- original_object.reagents.trans_to(baked_result, original_object.reagents.total_volume)
- if(added_reagents) // Add any new reagents that should be added
- baked_result.reagents.add_reagent_list(added_reagents)
if(who_baked_us)
ADD_TRAIT(baked_result, TRAIT_FOOD_CHEF_MADE, who_baked_us)
@@ -91,16 +79,10 @@
used_tray.AddToPlate(baked_result)
if(positive_result)
- used_oven.visible_message(
- span_notice("You smell something great coming from [used_oven]."),
- blind_message = span_notice("You smell something great..."),
- )
- BLACKBOX_LOG_FOOD_MADE(baked_result.type)
+ used_oven.visible_message(span_notice("You smell something great coming from [used_oven]."), blind_message = span_notice("You smell something great..."))
+ BLACKBOX_LOG_FOOD_MADE(baked_result)
else
- used_oven.visible_message(
- span_warning("You smell a burnt smell coming from [used_oven]."),
- blind_message = span_warning("You smell a burnt smell..."),
- )
+ used_oven.visible_message(span_warning("You smell a burnt smell coming from [used_oven]."), blind_message = span_warning("You smell a burnt smell..."))
SEND_SIGNAL(parent, COMSIG_ITEM_BAKED, baked_result)
qdel(parent)
@@ -122,4 +104,4 @@
else if(current_bake_time <= required_bake_time)
examine_list += span_notice("[parent] seems to be almost finished baking!")
else
- examine_list += span_danger("[parent] should probably not be put in the oven.")
+ examine_list += span_danger("[parent] should probably not be baked for much longer!")
diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm
index f8e3e2b7131b..3d8a8f36f8f4 100644
--- a/code/datums/components/food/edible.dm
+++ b/code/datums/components/food/edible.dm
@@ -88,9 +88,9 @@ Behavior that's still missing from this component that original food items had t
RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine))
RegisterSignals(parent, COMSIG_ATOM_ATTACK_ANIMAL, PROC_REF(UseByAnimal))
RegisterSignal(parent, COMSIG_ATOM_CHECKPARTS, PROC_REF(OnCraft))
- RegisterSignal(parent, COMSIG_OOZE_EAT_ATOM, PROC_REF(on_ooze_eat))
- RegisterSignal(parent, COMSIG_FOOD_INGREDIENT_ADDED, PROC_REF(edible_ingredient_added))
RegisterSignal(parent, COMSIG_ATOM_CREATEDBY_PROCESSING, PROC_REF(OnProcessed))
+ RegisterSignal(parent, COMSIG_FOOD_INGREDIENT_ADDED, PROC_REF(edible_ingredient_added))
+ RegisterSignal(parent, COMSIG_OOZE_EAT_ATOM, PROC_REF(on_ooze_eat))
RegisterSignal(parent, COMSIG_TRY_EAT_TRAIT, PROC_REF(try_eat_trait))
RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND_SECONDARY, PROC_REF(show_radial_recipes)) //Monkestation edit: CHEWIN COOKING
@@ -304,7 +304,7 @@ Behavior that's still missing from this component that original food items had t
this_food.reagents.maximum_volume = ROUND_UP(this_food.reagents.maximum_volume) // Just because I like whole numbers for this.
- BLACKBOX_LOG_FOOD_MADE(parent.type)
+ BLACKBOX_LOG_FOOD_MADE(this_food)
///Makes sure the thing hasn't been destroyed or fully eaten to prevent eating phantom edibles
/datum/component/edible/proc/IsFoodGone(atom/owner, mob/living/feeder)
@@ -449,7 +449,7 @@ Behavior that's still missing from this component that original food items had t
var/atom/owner = parent
- if(!owner.reagents)
+ if(!owner?.reagents)
stack_trace("[eater] failed to bite [owner], because [owner] had no reagents.")
return FALSE
if(eater.satiety > -200)
@@ -461,8 +461,7 @@ Behavior that's still missing from this component that original food items had t
if(sig_return & DESTROY_FOOD)
qdel(owner)
return
- var/fraction = 0.3
- fraction = min(bite_consumption / owner.reagents.total_volume, 1)
+ var/fraction = min(bite_consumption / owner.reagents.total_volume, 1)
owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, methods = INGEST)
bitecount++
var/desired_mask = (total_bites / bitecount)
@@ -478,7 +477,8 @@ Behavior that's still missing from this component that original food items had t
On_Consume(eater, feeder)
//Invoke our after eat callback if it is valid
- after_eat?.Invoke(eater, feeder, bitecount)
+ if(after_eat)
+ after_eat.Invoke(eater, feeder, bitecount)
//Invoke the eater's stomach's after_eat callback if valid
if(iscarbon(eater))
diff --git a/code/datums/components/mob_access.dm b/code/datums/components/mob_access.dm
deleted file mode 100644
index 04ef6ac9d59e..000000000000
--- a/code/datums/components/mob_access.dm
+++ /dev/null
@@ -1,29 +0,0 @@
-///element given to mobs that have levels of access
-/datum/element/mob_access
- element_flags = ELEMENT_BESPOKE
- argument_hash_start_idx = 2
- /// What can this mob access?
- var/list/my_access
-
-/datum/element/mob_access/Attach(datum/target, list/accesses)
- . = ..()
- if(!isliving(target))
- return ELEMENT_INCOMPATIBLE
- for(var/access_path in accesses)
- if(!ispath(access_path))
- continue
- var/datum/id_trim/job/trim = SSid_access.trim_singletons_by_path[access_path]
- if(isnull(trim))
- continue
- my_access += trim.access
-
- RegisterSignal(target, COMSIG_MOB_TRIED_ACCESS, PROC_REF(attempt_access))
-
-/datum/element/mob_access/proc/attempt_access(datum/source, obj/door_attempt)
- SIGNAL_HANDLER
-
- return (door_attempt.check_access_list(my_access)) ? ACCESS_ALLOWED : ACCESS_DISALLOWED
-
-/datum/element/mob_access/Detach(datum/source, ...)
- UnregisterSignal(source, COMSIG_MOB_TRIED_ACCESS)
- return ..()
diff --git a/code/datums/components/pet_commands/pet_commands_basic.dm b/code/datums/components/pet_commands/pet_commands_basic.dm
index 6ddd95fc39c1..e752571149b5 100644
--- a/code/datums/components/pet_commands/pet_commands_basic.dm
+++ b/code/datums/components/pet_commands/pet_commands_basic.dm
@@ -230,8 +230,6 @@
set_command_target(parent, victim)
/datum/pet_command/protect_owner/proc/set_attacking_target(atom/source, mob/living/attacker)
- SIGNAL_HANDLER
-
var/mob/living/basic/owner = weak_parent.resolve()
if(isnull(owner))
return
diff --git a/code/datums/components/regenerative_shield.dm b/code/datums/components/regenerative_shield.dm
deleted file mode 100644
index 114dbd7acfbe..000000000000
--- a/code/datums/components/regenerative_shield.dm
+++ /dev/null
@@ -1,91 +0,0 @@
-#define SHIELD_FILTER "shield filter"
-
-/// gives the mobs a regenerative shield, it will tank hits for them and then need to recharge for a bit
-/datum/component/regenerative_shield
- ///number of hits we can tank
- var/number_of_hits = 15
- ///the limit of the damage we can tank
- var/damage_threshold
- ///the overlay of the shield
- var/list/shield_overlays = list()
- ///how long before the shield can regenerate
- var/regeneration_time
-
-/datum/component/regenerative_shield/Initialize(number_of_hits = 15, damage_threshold = 50, regeneration_time = 2 MINUTES, list/shield_overlays)
- if(!isliving(parent))
- return COMPONENT_INCOMPATIBLE
- src.number_of_hits = number_of_hits
- src.damage_threshold = damage_threshold
- src.regeneration_time = regeneration_time
-
- var/atom/movable/living_parent = parent
- for(var/type_path as anything in shield_overlays)
- if(!ispath(type_path))
- continue
- var/obj/effect/overlay/new_effect = new type_path()
- living_parent.vis_contents += new_effect
- apply_filter_effects(new_effect)
- src.shield_overlays += new_effect
-
-/datum/component/regenerative_shield/RegisterWithParent()
- . = ..()
- ADD_TRAIT(parent, TRAIT_REGEN_SHIELD, REF(src))
- RegisterSignal(parent, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(block_attack))
-
-/datum/component/regenerative_shield/UnregisterFromParent()
- var/atom/movable/living_parent = parent
- for(var/obj/effect/overlay as anything in shield_overlays)
- living_parent.vis_contents -= overlay
- QDEL_LIST(shield_overlays)
- UnregisterSignal(parent, COMSIG_LIVING_CHECK_BLOCK)
- REMOVE_TRAIT(parent, TRAIT_REGEN_SHIELD, REF(src))
- return ..()
-
-/datum/component/regenerative_shield/proc/block_attack(
- mob/living/source,
- atom/hitby,
- damage,
- attack_text,
- attack_type,
- armour_penetration,
- damage_type,
- attack_flag,
-)
- SIGNAL_HANDLER
-
- if(damage <= 0 ||damage_type == STAMINA)
- return NONE
-
- if(damage >= damage_threshold || number_of_hits <= 0)
- return NONE
-
- playsound(get_turf(parent), 'sound/items/tap.ogg', 20)
- new /obj/effect/temp_visual/guardian/phase/out(get_turf(parent))
- number_of_hits = max(0, number_of_hits - 1)
- if(number_of_hits <= 0)
- disable_shield()
- return SUCCESSFUL_BLOCK
-
-/datum/component/regenerative_shield/proc/disable_shield()
- addtimer(CALLBACK(src, PROC_REF(enable_shield)), regeneration_time)
- for(var/obj/effect/my_effect as anything in shield_overlays)
- animate(my_effect, alpha = 0, time = 3 SECONDS)
- my_effect.remove_filter(SHIELD_FILTER)
- playsound(parent, 'sound/vehicles/mecha/mech_shield_drop.ogg', 20)
-
-/datum/component/regenerative_shield/proc/enable_shield()
- number_of_hits = initial(number_of_hits)
- for(var/obj/effect/my_effect as anything in shield_overlays)
- animate(my_effect, alpha = 255, time = 3 SECONDS)
- addtimer(CALLBACK(src, PROC_REF(apply_filter_effects), my_effect), 5 SECONDS)
- playsound(parent, 'sound/vehicles/mecha/mech_shield_raise.ogg', 20)
-
-/datum/component/regenerative_shield/proc/apply_filter_effects(obj/effect/new_effect)
- if(isnull(new_effect))
- return
- new_effect.add_filter(SHIELD_FILTER, 1, list("type" = "outline", "color" = "#b6e6f3", "alpha" = 0, "size" = 1))
- var/filter = new_effect.get_filter(SHIELD_FILTER)
- animate(filter, alpha = 200, time = 0.5 SECONDS, loop = -1)
- animate(alpha = 0, time = 0.5 SECONDS)
-
-#undef SHIELD_FILTER
diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm
index 4b3d0bdbb5d7..7a6703d86195 100644
--- a/code/datums/elements/_element.dm
+++ b/code/datums/elements/_element.dm
@@ -10,20 +10,14 @@
/**
* The index of the first attach argument to consider for duplicate elements
*
- * All arguments from this index onwards (1 based, until `argument_hash_end_idx` is reached, if set)
- * are hashed into the key to determine if this is a new unique element or one already exists
+ * All arguments from this index onwards (1 based) are hashed into the key to determine
+ * if this is a new unique element or one already exists
*
* Is only used when flags contains [ELEMENT_BESPOKE]
*
* This is infinity so you must explicitly set this
*/
var/argument_hash_start_idx = INFINITY
- /**
- * The index of the last attach argument to consider for duplicate elements
- * Only used when `element_flags` contains [ELEMENT_BESPOKE].
- * If not set, it'll copy every argument from `argument_hash_start_idx` onwards as normal
- */
- var/argument_hash_end_idx = 0
/// Activates the functionality defined by the element on the given target datum
/datum/element/proc/Attach(datum/target)
diff --git a/code/datums/elements/attack_zone_randomiser.dm b/code/datums/elements/attack_zone_randomiser.dm
deleted file mode 100644
index 35275e11a9bb..000000000000
--- a/code/datums/elements/attack_zone_randomiser.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-/// Pick a random attack zone before you attack something
-/datum/element/attack_zone_randomiser
- element_flags = ELEMENT_BESPOKE
- argument_hash_start_idx = 2
- /// List of attack zones you can select, should be a subset of GLOB.all_body_zones
- var/list/valid_attack_zones
-
-/datum/element/attack_zone_randomiser/Attach(datum/target, list/valid_attack_zones = GLOB.all_body_zones)
- . = ..()
- if (!isliving(target))
- return ELEMENT_INCOMPATIBLE
- RegisterSignals(target, list(COMSIG_HOSTILE_PRE_ATTACKINGTARGET, COMSIG_LIVING_UNARMED_ATTACK), PROC_REF(randomise))
- src.valid_attack_zones = valid_attack_zones
-
-/datum/element/attack_zone_randomiser/Detach(datum/source)
- UnregisterSignal(source, list (COMSIG_HOSTILE_PRE_ATTACKINGTARGET, COMSIG_LIVING_UNARMED_ATTACK))
- return ..()
-
-/// If we're attacking a carbon, pick a random defence zone
-/datum/element/attack_zone_randomiser/proc/randomise(mob/living/source, atom/target)
- SIGNAL_HANDLER
- if (!iscarbon(target))
- return
- var/mob/living/living_target = target
- var/list/blacklist_zones = GLOB.all_body_zones - valid_attack_zones
- var/new_zone = living_target.get_random_valid_zone(blacklisted_parts = blacklist_zones, bypass_warning = TRUE)
- if (isnull(new_zone))
- new_zone = BODY_ZONE_CHEST
- var/atom/movable/screen/zone_sel/zone_selector = source.hud_used?.zone_select
- if (isnull(zone_selector))
- source.zone_selected = new_zone
- else
- zone_selector.set_selected_zone(new_zone, source, should_log = FALSE)
diff --git a/code/datums/elements/basic_eating.dm b/code/datums/elements/basic_eating.dm
index f082428934d5..b8c990b1bf9d 100644
--- a/code/datums/elements/basic_eating.dm
+++ b/code/datums/elements/basic_eating.dm
@@ -73,7 +73,6 @@
finish_eating(eater, target)
/datum/element/basic_eating/proc/finish_eating(mob/living/eater, atom/target)
- set waitfor = FALSE
if(drinking)
////playsound(eater.loc,'sound/items/drink.ogg', rand(10,50), TRUE) // monkestation edit original
playsound(eater.loc,get_drink_sound(eater), rand(10,50), TRUE) // monkestation edit: synthesized drink sounds
@@ -81,9 +80,8 @@
playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
SEND_SIGNAL(eater, COMSIG_LIVING_ATE, target)
SEND_SIGNAL(eater, COMSIG_EMOTION_STORE, null, EMOTION_HAPPY, "I ate [target], I really like [target].")
- var/atom/final_target = target
- if(isstack(target)) //if stack, only consume 1
- var/obj/item/stack/food_stack = target
- final_target = food_stack.split_stack(eater, 1)
- eater.log_message("has eaten [target]!", LOG_ATTACK)
- qdel(final_target)
+ if (isstack(target))
+ var/obj/item/stack/stack = target
+ stack.use(1)
+ return
+ qdel(target)
diff --git a/code/datums/elements/consumable_mob.dm b/code/datums/elements/consumable_mob.dm
deleted file mode 100644
index fafdb8cbcab2..000000000000
--- a/code/datums/elements/consumable_mob.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * element for mobs that can be consumed!
- */
-/datum/element/consumable_mob
- element_flags = ELEMENT_BESPOKE
- argument_hash_start_idx = 2
- ///reagents to give our consumer
- var/list/reagents_list
-
-/datum/element/consumable_mob/Attach(datum/target, list/reagents_list)
- . = ..()
- if(!isliving(target))
- return ELEMENT_INCOMPATIBLE
- if(isnull((reagents_list)))
- stack_trace("No valid reagents list provided!")
-
- src.reagents_list = reagents_list
- RegisterSignal(target, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_consume))
-
-/datum/element/consumable_mob/Detach(datum/target)
- . = ..()
- UnregisterSignal(target, COMSIG_ATOM_ATTACK_HAND)
-
-/datum/element/consumable_mob/proc/on_consume(atom/movable/source, mob/living/consumer)
- SIGNAL_HANDLER
- if(!consumer.combat_mode || !consumer.reagents || HAS_TRAIT(consumer, TRAIT_PACIFISM))
- return
- for(var/reagent_type in reagents_list)
- if(isnull(reagents_list[reagent_type]))
- return
- consumer.reagents.add_reagent(reagent_type, reagents_list[reagent_type])
-
diff --git a/code/datums/elements/food/fried_item.dm b/code/datums/elements/food/fried_item.dm
index dfb20c1e68fe..0db91b893785 100644
--- a/code/datums/elements/food/fried_item.dm
+++ b/code/datums/elements/food/fried_item.dm
@@ -17,27 +17,28 @@
var/atom/this_food = target
switch(fry_time)
- if(0 to 15 SECONDS)
+ if(0 to 15)
this_food.add_atom_colour(fried_colors[1], FIXED_COLOUR_PRIORITY)
this_food.name = "lightly-fried [this_food.name]"
this_food.desc += " It's been lightly fried in a deep fryer."
- if(15 SECONDS to 50 SECONDS)
+ if(15 to 50)
this_food.add_atom_colour(fried_colors[2], FIXED_COLOUR_PRIORITY)
this_food.name = "fried [this_food.name]"
this_food.desc += " It's been fried, increasing its tastiness value by [rand(1, 75)]%."
- if(50 SECONDS to 85 SECONDS)
+ if(50 to 85)
this_food.add_atom_colour(fried_colors[3], FIXED_COLOUR_PRIORITY)
this_food.name = "deep-fried [this_food.name]"
this_food.desc += " Deep-fried to perfection."
- if(85 SECONDS to INFINITY)
+ if(85 to INFINITY)
this_food.add_atom_colour(fried_colors[4], FIXED_COLOUR_PRIORITY)
this_food.name = "\proper the physical manifestation of the very concept of fried foods"
this_food.desc = "A heavily-fried... something. Who can tell anymore?"
ADD_TRAIT(this_food, TRAIT_FOOD_FRIED, ELEMENT_TRAIT(type))
+ SEND_SIGNAL(this_food, COMSIG_ITEM_FRIED, fry_time)
// Already edible items will inherent these parameters
// Otherwise, we will become edible.
this_food.AddComponent( \
@@ -47,7 +48,6 @@
junkiness = 10, \
foodtypes = FRIED, \
)
- SEND_SIGNAL(this_food, COMSIG_ITEM_FRIED, fry_time)
/datum/element/fried_item/Detach(atom/source, ...)
for(var/color in fried_colors)
diff --git a/code/datums/elements/food/grilled_item.dm b/code/datums/elements/food/grilled_item.dm
index 785fc19f4a5a..f657b969f062 100644
--- a/code/datums/elements/food/grilled_item.dm
+++ b/code/datums/elements/food/grilled_item.dm
@@ -30,12 +30,9 @@
if(grill_time > 30)
this_food.AddComponent(/datum/component/edible, foodtypes = FRIED)
- ADD_TRAIT(this_food, TRAIT_FOOD_BBQ_GRILLED, ELEMENT_TRAIT(type))
-
/datum/element/grilled_item/Detach(atom/source, ...)
source.name = initial(source.name)
source.desc = initial(source.desc)
REMOVE_TRAIT(source, TRAIT_FOOD_GRILLED, ELEMENT_TRAIT(type))
qdel(source.GetComponent(/datum/component/edible)) // Don't care if it was initially edible
- REMOVE_TRAIT(src, TRAIT_FOOD_BBQ_GRILLED, ELEMENT_TRAIT(type))
return ..()
diff --git a/code/datums/elements/pet_bonus.dm b/code/datums/elements/pet_bonus.dm
index 973cc6b913b6..7c69927691bc 100644
--- a/code/datums/elements/pet_bonus.dm
+++ b/code/datums/elements/pet_bonus.dm
@@ -8,8 +8,6 @@
element_flags = ELEMENT_BESPOKE
argument_hash_start_idx = 2
- ///string key of the emote to do when pet.
- var/emote_name
///optional cute message to send when you pet your pet!
var/emote_message
///actual moodlet given, defaults to the pet animal one
@@ -21,7 +19,6 @@
return ELEMENT_INCOMPATIBLE
src.emote_message = emote_message
- src.emote_name = emote_name
src.moodlet = moodlet
RegisterSignal(target, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand))
@@ -39,6 +36,4 @@
SEND_SIGNAL(pet, COMSIG_ANIMAL_PET, petter, modifiers)
if(emote_message && prob(33))
pet.manual_emote(emote_message)
- if(emote_name)
- INVOKE_ASYNC(pet, TYPE_PROC_REF(/mob, emote), emote_name)
petter.add_mood_event("petting_bonus", moodlet, pet)
diff --git a/code/datums/elements/pet_collar.dm b/code/datums/elements/pet_collar.dm
deleted file mode 100644
index f98767629e7e..000000000000
--- a/code/datums/elements/pet_collar.dm
+++ /dev/null
@@ -1,95 +0,0 @@
-/datum/element/wears_collar
- element_flags = ELEMENT_BESPOKE
- argument_hash_start_idx = 2
- ///our icon's pathfile
- var/collar_icon
- ///our collar's icon state
- var/collar_icon_state
- ///iconstate of our collar while resting
- var/collar_resting_icon_state
-
-/datum/element/wears_collar/Attach(datum/target, collar_icon = 'icons/mob/simple/pets.dmi', collar_resting_icon_state = FALSE, collar_icon_state)
- . = ..()
-
- if(!isliving(target))
- return ELEMENT_INCOMPATIBLE
-
- src.collar_icon = collar_icon
- src.collar_icon_state = collar_icon_state
- src.collar_resting_icon_state = collar_resting_icon_state
-
- RegisterSignal(target, COMSIG_ATOM_ATTACKBY, PROC_REF(attach_collar))
- RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_overlays_updated))
- RegisterSignal(target, COMSIG_ATOM_EXITED, PROC_REF(on_content_exit))
- RegisterSignal(target, COMSIG_ATOM_ENTERED, PROC_REF(on_content_enter))
- RegisterSignal(target, COMSIG_LIVING_RESTING, PROC_REF(on_rest))
- RegisterSignal(target, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change))
-
-/datum/element/wears_collar/Detach(datum/target)
- . = ..()
- UnregisterSignal(target, list(
- COMSIG_ATOM_ATTACKBY,
- COMSIG_ATOM_UPDATE_OVERLAYS,
- COMSIG_ATOM_EXITED,
- COMSIG_ATOM_ENTERED,
- COMSIG_LIVING_RESTING,
- COMSIG_MOB_STATCHANGE,
- ))
-
-/datum/element/wears_collar/proc/on_stat_change(mob/living/source)
- SIGNAL_HANDLER
-
- if(collar_icon_state)
- source.update_icon(UPDATE_OVERLAYS)
-
-/datum/element/wears_collar/proc/on_content_exit(mob/living/source, atom/moved)
- SIGNAL_HANDLER
-
- if(!istype(moved, /obj/item/clothing/neck/petcollar))
- return
- source.fully_replace_character_name(null, source::name)
- if(collar_icon_state)
- source.update_appearance()
-
-/datum/element/wears_collar/proc/on_content_enter(mob/living/source, obj/item/clothing/neck/petcollar/new_collar)
- SIGNAL_HANDLER
-
- if(!istype(new_collar) || !new_collar.tagname)
- return
-
- source.fully_replace_character_name(null, "\proper [new_collar.tagname]")
- if(collar_icon_state)
- source.update_appearance()
-
-/datum/element/wears_collar/proc/attach_collar(atom/source, atom/movable/attacking_item, atom/user, params)
- SIGNAL_HANDLER
-
- if(!istype(attacking_item, /obj/item/clothing/neck/petcollar))
- return NONE
- if(locate(/obj/item/clothing/neck/petcollar) in source)
- user.balloon_alert(source, "already wearing a collar!")
- return NONE
- attacking_item.forceMove(source)
- return COMPONENT_NO_AFTERATTACK
-
-/datum/element/wears_collar/proc/on_overlays_updated(mob/living/source, list/overlays)
- SIGNAL_HANDLER
-
- if(!locate(/obj/item/clothing/neck/petcollar) in source)
- return
-
- var/icon_tag = ""
-
- if(source.stat == DEAD || HAS_TRAIT(source, TRAIT_FAKEDEATH))
- icon_tag = "_dead"
- else if(collar_resting_icon_state && source.resting)
- icon_tag = "_rest"
-
- overlays += mutable_appearance(collar_icon, "[collar_icon_state][icon_tag]collar")
- overlays += mutable_appearance(collar_icon, "[collar_icon_state][icon_tag]tag")
-
-
-/datum/element/wears_collar/proc/on_rest(atom/movable/source)
- SIGNAL_HANDLER
-
- source.update_icon(UPDATE_OVERLAYS)
diff --git a/code/datums/memory/_memory.dm b/code/datums/memory/_memory.dm
index 439b4c88f579..1a61258a877d 100644
--- a/code/datums/memory/_memory.dm
+++ b/code/datums/memory/_memory.dm
@@ -275,8 +275,8 @@
/mob/living/basic/stickman,
/mob/living/basic/stickman/dog,
/mob/living/simple_animal/hostile/megafauna/dragon/lesser,
- /mob/living/basic/pet/cat,
- /mob/living/basic/pet/cat/cak,
+ /mob/living/simple_animal/pet/cat,
+ /mob/living/simple_animal/pet/cat/cak,
/obj/item/food/sausage/american,
/obj/item/skub,
)
diff --git a/code/datums/quirks/neutral_quirks/vegetarian.dm b/code/datums/quirks/neutral_quirks/vegetarian.dm
index 0568e2f1e229..0ade72acafe5 100644
--- a/code/datums/quirks/neutral_quirks/vegetarian.dm
+++ b/code/datums/quirks/neutral_quirks/vegetarian.dm
@@ -7,4 +7,17 @@
lose_text = span_notice("You feel like eating meat isn't that bad.")
medical_record_text = "Patient reports a vegetarian diet."
mail_goodies = list(/obj/effect/spawner/random/food_or_drink/salad)
- mob_trait = TRAIT_VEGETARIAN
+
+/datum/quirk/vegetarian/add(client/client_source)
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.liked_foodtypes &= ~MEAT
+ tongue.disliked_foodtypes |= MEAT
+
+/datum/quirk/vegetarian/remove()
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.liked_foodtypes = initial(tongue.liked_foodtypes)
+ tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes)
diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm
index c1320be4b9ed..953db9da6305 100644
--- a/code/datums/wounds/_wounds.dm
+++ b/code/datums/wounds/_wounds.dm
@@ -514,8 +514,8 @@
/datum/wound/proc/check_grab_treatments(obj/item/I, mob/user)
return FALSE
-/// Like try_treating() but for unhanded interactions, used by joint dislocations for manual bodypart chiropractice for example. Ignores thick material checks since you can pop an arm into place through a thick suit unlike using sutures
-/datum/wound/proc/try_handling(mob/living/user)
+/// Like try_treating() but for unhanded interactions from humans, used by joint dislocations for manual bodypart chiropractice for example. Ignores thick material checks since you can pop an arm into place through a thick suit unlike using sutures
+/datum/wound/proc/try_handling(mob/living/carbon/human/user)
return FALSE
/// Someone is using something that might be used for treating the wound on this limb
diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm
index 9c899cf142fb..f0cd695cd513 100644
--- a/code/datums/wounds/bones.dm
+++ b/code/datums/wounds/bones.dm
@@ -361,10 +361,8 @@
victim.visible_message(span_danger("[victim]'s dislocated [limb.plaintext_zone] pops back into place!"), span_userdanger("Your dislocated [limb.plaintext_zone] pops back into place! Ow!"))
remove_wound()
-/datum/wound/blunt/bone/moderate/try_handling(mob/living/user)
- if(user.usable_hands <= 0 || user.pulling != victim)
- return FALSE
- if(!isnull(user.hud_used?.zone_select) && user.zone_selected != limb.body_zone)
+/datum/wound/blunt/bone/moderate/try_handling(mob/living/carbon/human/user)
+ if(user.pulling != victim || user.zone_selected != limb.body_zone)
return FALSE
if(user.grab_state == GRAB_PASSIVE)
diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm
index 1587b136f263..ea2145c2db21 100644
--- a/code/datums/wounds/slash.dm
+++ b/code/datums/wounds/slash.dm
@@ -196,25 +196,19 @@
else if(istype(I, /obj/item/stack/medical/suture))
return suture(I, user)
-/datum/wound/slash/flesh/try_handling(mob/living/user)
- if(user.pulling != victim || !HAS_TRAIT(user, TRAIT_WOUND_LICKER) || !victim.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE))
+/datum/wound/slash/flesh/try_handling(mob/living/carbon/human/user)
+ if(user.pulling != victim || user.zone_selected != limb.body_zone || !victim.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE))
return FALSE
- if(!isnull(user.hud_used?.zone_select) && user.zone_selected != limb.body_zone)
- return FALSE
-
if(DOING_INTERACTION_WITH_TARGET(user, victim))
to_chat(user, span_warning("You're already interacting with [victim]!"))
return
- if(iscarbon(user))
- var/mob/living/carbon/carbon_user = user
- if(carbon_user.is_mouth_covered())
- to_chat(user, span_warning("Your mouth is covered, you can't lick [victim]'s wounds!"))
- return
- if(!carbon_user.get_organ_slot(ORGAN_SLOT_TONGUE))
- to_chat(user, span_warning("You can't lick wounds without a tongue!")) // f in chat
- return
-
- lick_wounds(user)
+ if(user.is_mouth_covered())
+ to_chat(user, span_warning("Your mouth is covered, you can't lick [victim]'s wounds!"))
+ return
+ if(!user.get_organ_slot(ORGAN_SLOT_TONGUE))
+ to_chat(user, span_warning("You can't lick wounds without a tongue!")) // f in chat
+ return
+
return TRUE
/// if a felinid is licking this cut to reduce bleeding
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index c4b60d31ae37..552827a98acf 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -108,14 +108,6 @@
/// Will not automatically apply to the turf below you, you need to apply /datum/element/block_explosives in conjunction with this
var/explosion_block = 0
- // Access levels, used in modules\jobs\access.dm
- /// List of accesses needed to use this object: The user must possess all accesses in this list in order to use the object.
- /// Example: If req_access = list(ACCESS_ENGINE, ACCESS_CE)- then the user must have both ACCESS_ENGINE and ACCESS_CE in order to use the object.
- var/list/req_access
- /// List of accesses needed to use this object: The user must possess at least one access in this list in order to use the object.
- /// Example: If req_one_access = list(ACCESS_ENGINE, ACCESS_CE)- then the user must have either ACCESS_ENGINE or ACCESS_CE in order to use the object.
- var/list/req_one_access
-
///can we grab this object?
var/cant_grab = FALSE
@@ -321,15 +313,18 @@
overlays.Insert(1, emissive_block)
return overlays
-/atom/movable/proc/onZImpact(turf/impacted_turf, levels, impact_flags = NONE)
+/atom/movable/proc/onZImpact(turf/impacted_turf, levels, message = TRUE)
SHOULD_CALL_PARENT(TRUE)
- if(!(impact_flags & ZIMPACT_NO_MESSAGE))
- visible_message(
- span_danger("[src] crashes into [impacted_turf]!"),
- span_userdanger("You crash into [impacted_turf]!"),
- )
- if(!(impact_flags & ZIMPACT_NO_SPIN))
- INVOKE_ASYNC(src, PROC_REF(SpinAnimation), 5, 2)
+ if(message)
+ visible_message(span_danger("[src] crashes into [impacted_turf]!"))
+ var/atom/highest = impacted_turf
+ for(var/atom/hurt_atom as anything in impacted_turf.contents)
+ if(!hurt_atom.density)
+ continue
+ if(isobj(hurt_atom) || ismob(hurt_atom))
+ if(hurt_atom.layer > highest.layer)
+ highest = hurt_atom
+ INVOKE_ASYNC(src, PROC_REF(SpinAnimation), 5, 2)
SEND_SIGNAL(src, COMSIG_ATOM_ON_Z_IMPACT, impacted_turf, levels)
return TRUE
diff --git a/code/game/machinery/computer/orders/order_items/mining/order_toys.dm b/code/game/machinery/computer/orders/order_items/mining/order_toys.dm
index 05b87d7d4d6d..cd1dbf5c6748 100644
--- a/code/game/machinery/computer/orders/order_items/mining/order_toys.dm
+++ b/code/game/machinery/computer/orders/order_items/mining/order_toys.dm
@@ -21,14 +21,6 @@
item_path = /obj/item/mine_bot_upgrade/health
cost_per_order = 400
-/datum/orderable_item/toys_drones/drone_shield
- item_path = /obj/item/mine_bot_upgrade/regnerative_shield
- cost_per_order = 500
-
-/datum/orderable_item/toys_drones/drone_shield
- item_path = /obj/item/minebot_remote_control
- cost_per_order = 500
-
/datum/orderable_item/toys_drones/drone_pka
item_path = /obj/item/borg/upgrade/modkit/cooldown/minebot
cost_per_order = 600
diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm
index 235986cbd0dd..b078b5c76edf 100644
--- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm
+++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm
@@ -78,7 +78,7 @@
"oh, let me guess, you're a big fan of those japanese tourist bots",
)
input_obj_or_mob = list(
- /mob/living/basic/pet/cat,
+ /mob/living/simple_animal/pet/cat,
)
output_organs = list(
/obj/item/organ/internal/ears/cat,
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index 900a96e77231..ee310f410d7f 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -154,6 +154,17 @@
else
H.visible_message(span_notice("[H] stares at the light."), span_warning("You stare at the light..."))
+ //cats!
+ for(var/mob/living/simple_animal/pet/cat/C in view(1,targloc))
+ if(prob(effectchance * diode.rating))
+ if(C.resting)
+ C.set_resting(FALSE, instant = TRUE)
+ C.visible_message(span_notice("[C] pounces on the light!"),span_warning("LIGHT!"))
+ C.Move(targloc)
+ C.Immobilize(1 SECONDS)
+ else
+ C.visible_message(span_notice("[C] looks uninterested in your games."),span_warning("You spot [user] shining [src] at you. How insulting!"))
+
//laser pointer image
icon_state = "pointer_[pointer_icon_state]"
var/image/I = image('icons/obj/weapons/guns/projectiles.dmi',targloc,pointer_icon_state,10)
diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm
index 05c0c79af084..7f60ff93e7d7 100644
--- a/code/game/objects/items/food/meatdish.dm
+++ b/code/game/objects/items/food/meatdish.dm
@@ -67,20 +67,14 @@
/obj/item/food/fishmeat/gunner_jellyfish
name = "filleted gunner jellyfish"
- desc = "A gunner jellyfish with the stingers removed. Mildly hallucinogenic when raw."
+ desc = "A gunner jellyfish with the stingers removed. Mildly hallucinogenic."
icon = 'icons/obj/food/lizard.dmi'
icon_state = "jellyfish_fillet"
food_reagents = list(
- /datum/reagent/consumable/nutriment/protein = 4, //The halluginogen comes from the fish trait.
+ /datum/reagent/consumable/nutriment/protein = 4,
+ /datum/reagent/toxin/mindbreaker = 2,
)
-///Premade gunner jellyfish fillets from supply orders. Contains the halluginogen that'd be normally from the fish trait.
-/obj/item/food/fishmeat/gunner_jellyfish/supply
-
-/obj/item/food/fishmeat/gunner_jellyfish/supply/Initialize(mapload)
- food_reagents[/datum/reagent/toxin/mindbreaker] = 2
- return ..()
-
/obj/item/food/fishmeat/armorfish
name = "cleaned armorfish"
desc = "An armorfish with its guts and shell removed, ready for use in cooking."
diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm
index 3cc92acf7c24..616673f72a93 100644
--- a/code/game/objects/items/grenades/spawnergrenade.dm
+++ b/code/game/objects/items/grenades/spawnergrenade.dm
@@ -75,11 +75,11 @@
/obj/item/grenade/spawnergrenade/cat
name = "Catnade"
desc = "You can hear faint meowing and the sounds of claws on metal coming from within."
- spawner_type = list(/mob/living/basic/pet/cat/feral, /mob/living/basic/pet/cat/feraltabby)
+ spawner_type = list(/mob/living/simple_animal/hostile/feral, /mob/living/simple_animal/hostile/feraltabby)
deliveryamt = 5
/obj/item/grenade/spawnergrenade/cat/syndicate
name = "Syndicatnade"
desc = "You can hear aggressive meowing and the sounds of sharpened claws on metal coming from within."
- spawner_type = /mob/living/basic/pet/cat/syndicat
+ spawner_type = /mob/living/simple_animal/hostile/syndicat
deliveryamt = 3
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 3370a2bc4d9f..32bb9ef266a4 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -317,7 +317,6 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \
new/datum/stack_recipe("wooden stairs frame", /obj/structure/stairs_frame/wood, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \
new/datum/stack_recipe("wooden fence", /obj/structure/railing/wooden_fence, 2, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \
- new/datum/stack_recipe("cat house", /obj/structure/cat_house, 5, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \
new/datum/stack_recipe("coffin", /obj/structure/closet/crate/coffin, 5, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \
new/datum/stack_recipe("book case", /obj/structure/bookcase, 4, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \
new/datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), \
diff --git a/code/game/objects/items/storage/boxes/food_boxes.dm b/code/game/objects/items/storage/boxes/food_boxes.dm
index b64d2b18f332..c3dab8f89dde 100644
--- a/code/game/objects/items/storage/boxes/food_boxes.dm
+++ b/code/game/objects/items/storage/boxes/food_boxes.dm
@@ -294,7 +294,7 @@
new /obj/item/food/fishmeat/armorfish(src)
new /obj/item/food/fishmeat/carp(src)
new /obj/item/food/fishmeat/moonfish(src)
- new /obj/item/food/fishmeat/gunner_jellyfish/supply(src)
+ new /obj/item/food/fishmeat/gunner_jellyfish(src)
/obj/item/storage/box/ingredients/salads
theme_name = "salads"
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index c6ec28673641..09669efc0acd 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -30,6 +30,14 @@
///If set to true, we can reskin this item as much as we want.
var/infinite_reskin = FALSE
+ // Access levels, used in modules\jobs\access.dm
+ /// List of accesses needed to use this object: The user must possess all accesses in this list in order to use the object.
+ /// Example: If req_access = list(ACCESS_ENGINE, ACCESS_CE)- then the user must have both ACCESS_ENGINE and ACCESS_CE in order to use the object.
+ var/list/req_access
+ /// List of accesses needed to use this object: The user must possess at least one access in this list in order to use the object.
+ /// Example: If req_one_access = list(ACCESS_ENGINE, ACCESS_CE)- then the user must have either ACCESS_ENGINE or ACCESS_CE in order to use the object.
+ var/list/req_one_access
+
/// Custom fire overlay icon, will just use the default overlay if this is null
var/custom_fire_overlay
/// Particles this obj uses when burning, if any
diff --git a/code/game/objects/structures/cat_house.dm b/code/game/objects/structures/cat_house.dm
deleted file mode 100644
index bfaa464ff6d0..000000000000
--- a/code/game/objects/structures/cat_house.dm
+++ /dev/null
@@ -1,46 +0,0 @@
-/obj/structure/cat_house
- name = "cat house"
- desc = "Cozy home for cats."
- icon = 'icons/mob/simple/pets.dmi'
- icon_state = "cat_house"
- density = TRUE
- anchored = TRUE
- ///cat residing in this house
- var/mob/living/resident_cat
-
-/obj/structure/cat_house/Initialize(mapload)
- . = ..()
- RegisterSignal(src, COMSIG_ATOM_ATTACK_BASIC_MOB, PROC_REF(enter_home))
-
-/obj/structure/cat_house/proc/enter_home(datum/source, mob/living/attacker)
- SIGNAL_HANDLER
-
- if(isnull(resident_cat) && istype(attacker, /mob/living/basic/pet/cat))
- attacker.forceMove(src)
- return
- if(resident_cat == attacker)
- attacker.forceMove(drop_location())
-
-/obj/structure/cat_house/Entered(atom/movable/mover)
- . = ..()
- if(!istype(mover, /mob/living/basic/pet/cat))
- return
- resident_cat = mover
- update_appearance(UPDATE_OVERLAYS)
-
-/obj/structure/cat_house/Exited(atom/movable/mover)
- . = ..()
- if(mover != resident_cat)
- return
- resident_cat = null
- update_appearance(UPDATE_OVERLAYS)
-
-/obj/structure/cat_house/update_overlays()
- . = ..()
- if(isnull(resident_cat))
- return
- var/image/cat_icon = image(icon = resident_cat.icon, icon_state = resident_cat.icon_state, layer = LOW_ITEM_LAYER)
- cat_icon.transform = cat_icon.transform.Scale(0.7, 0.7)
- cat_icon.pixel_x = 0
- cat_icon.pixel_y = -9
- . += cat_icon
diff --git a/code/game/sound.dm b/code/game/sound.dm
index eda822432f5d..e34add121d5d 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -536,7 +536,6 @@ GLOBAL_LIST_EMPTY(cached_mixer_channels)
soundin = pick('sound/effects/treechop1.ogg', 'sound/effects/treechop2.ogg', 'sound/effects/treechop3.ogg')
if(SFX_ROCK_TAP)
soundin = pick('sound/effects/rocktap1.ogg', 'sound/effects/rocktap2.ogg', 'sound/effects/rocktap3.ogg')
-
// monkestation start: more sound effects
if(SFX_BUTTON_CLICK)
soundin = 'monkestation/sound/effects/hl2/button-click.ogg'
@@ -545,5 +544,4 @@ GLOBAL_LIST_EMPTY(cached_mixer_channels)
if(SFX_LIGHTSWITCH)
soundin = 'monkestation/sound/effects/hl2/lightswitch.ogg'
// monkestation end
-
return soundin
diff --git a/code/game/turfs/baseturfs.dm b/code/game/turfs/baseturfs.dm
index 4ba935411cf8..72c2829514dc 100644
--- a/code/game/turfs/baseturfs.dm
+++ b/code/game/turfs/baseturfs.dm
@@ -20,16 +20,6 @@
return ChangeTurf(baseturfs, baseturfs, flags) // The bottom baseturf will never go away
-/// Places a turf at the top of the stack
-/turf/proc/place_on_top(turf/added_layer, flags)
- var/list/turf/new_baseturfs = list()
-
- new_baseturfs.Add(baseturfs)
- if(isopenturf(src))
- new_baseturfs.Add(type)
-
- return ChangeTurf(added_layer, new_baseturfs, flags)
-
// Take the input as baseturfs and put it underneath the current baseturfs
// If fake_turf_type is provided and new_baseturfs is not the baseturfs list will be created identical to the turf type's
// If both or just new_baseturfs is provided they will be inserted below the existing baseturfs
diff --git a/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm b/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm
index 164fe3fe181b..b8a8f39fbc37 100644
--- a/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm
+++ b/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm
@@ -14,9 +14,8 @@
possible_shapes = list(
/mob/living/basic/carp,
/mob/living/basic/mouse,
- /mob/living/basic/pet/cat,
/mob/living/basic/pet/dog/corgi,
/mob/living/basic/pet/fox,
/mob/living/simple_animal/bot/secbot,
- /mob/living/basic/pet/cat,
+ /mob/living/simple_animal/pet/cat,
)
diff --git a/code/modules/antagonists/traitor/objectives/kill_pet.dm b/code/modules/antagonists/traitor/objectives/kill_pet.dm
index 21bf06eb3868..01ab042f11b0 100644
--- a/code/modules/antagonists/traitor/objectives/kill_pet.dm
+++ b/code/modules/antagonists/traitor/objectives/kill_pet.dm
@@ -23,7 +23,7 @@
/mob/living/basic/pet/dog/corgi/puppy/ian
),
JOB_CAPTAIN = /mob/living/basic/pet/fox/renault,
- JOB_CHIEF_MEDICAL_OFFICER = /mob/living/basic/pet/cat/runtime,
+ JOB_CHIEF_MEDICAL_OFFICER = /mob/living/simple_animal/pet/cat/runtime,
JOB_CHIEF_ENGINEER = /mob/living/basic/parrot/poly,
JOB_QUARTERMASTER = list(
/mob/living/basic/gorilla/cargorilla,
diff --git a/code/modules/cargo/packs/livestock.dm b/code/modules/cargo/packs/livestock.dm
index 60e83bd18c73..af6924a53b32 100644
--- a/code/modules/cargo/packs/livestock.dm
+++ b/code/modules/cargo/packs/livestock.dm
@@ -32,22 +32,18 @@
name = "Cat Crate"
desc = "The cat goes meow! Comes with a collar and a nice cat toy! Cheeseburger not included."//i can't believe im making this reference
cost = CARGO_CRATE_VALUE * 10 //Cats are worth as much as corgis.
- contains = list(
- /mob/living/basic/pet/cat,
- /obj/item/clothing/neck/petcollar,
- /obj/item/toy/cattoy,
- )
+ contains = list(/mob/living/simple_animal/pet/cat,
+ /obj/item/clothing/neck/petcollar,
+ /obj/item/toy/cattoy,
+ )
crate_name = "cat crate"
/datum/supply_pack/critter/cat/generate()
. = ..()
- if(!prob(50))
- return
- var/mob/living/basic/pet/cat/delete_cat = locate() in .
- if(isnull(delete_cat))
- return
- qdel(delete_cat)
- new /mob/living/basic/pet/cat/_proc(.)
+ if(prob(50))
+ var/mob/living/simple_animal/pet/cat/C = locate() in .
+ qdel(C)
+ new /mob/living/simple_animal/pet/cat/_proc(.)
/datum/supply_pack/critter/chick
name = "Chicken Crate"
diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm
index 0aa4f258ed24..86a84c19428d 100644
--- a/code/modules/experisci/experiment/experiments.dm
+++ b/code/modules/experisci/experiment/experiments.dm
@@ -45,7 +45,7 @@
/mob/living/basic/cow,
/mob/living/basic/pet/dog/corgi,
/mob/living/basic/snake,
- /mob/living/basic/pet/cat,
+ /mob/living/simple_animal/pet/cat,
)
/datum/experiment/scanning/random/cytology/medium/one
diff --git a/code/modules/explorer_drone/loot.dm b/code/modules/explorer_drone/loot.dm
index 4de165c0616e..de7f94a3f8d4 100644
--- a/code/modules/explorer_drone/loot.dm
+++ b/code/modules/explorer_drone/loot.dm
@@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index())
/mob/living/basic/pet/dog/corgi,
/mob/living/basic/pet/dog/pug,
/mob/living/basic/pet/penguin/baby,
- /mob/living/basic/pet/cat/space,
+ /mob/living/simple_animal/pet/cat/space,
)
/datum/adventure_loot_generator/pet/generate()
diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm
index 99d9878dbea0..e6a2aa8a9d0a 100644
--- a/code/modules/fishing/fish/_fish.dm
+++ b/code/modules/fishing/fish/_fish.dm
@@ -435,6 +435,10 @@
if(health <= 0)
set_status(FISH_DEAD)
+
+//Fish breeding stops if fish count exceeds this.
+#define AQUARIUM_MAX_BREEDING_POPULATION 20
+
/obj/item/fish/proc/ready_to_reproduce(being_targeted = FALSE)
var/obj/structure/aquarium/aquarium = loc
if(!istype(aquarium))
diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm
index 0dcb967a62d2..01d69da2229a 100644
--- a/code/modules/fishing/fishing_minigame.dm
+++ b/code/modules/fishing/fishing_minigame.dm
@@ -5,6 +5,8 @@
// UI minigame phase
#define MINIGAME_PHASE 3
+/// The height of the minigame slider. Not in pixels, but minigame units.
+#define FISHING_MINIGAME_AREA 1000
/// Any lower than this, and the target position of the fish is considered null
#define FISH_TARGET_MIN_DISTANCE 6
/// The friction applied to fish jumps, so that it decelerates over time
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
index c05446d35218..e78efd293ffc 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
@@ -222,7 +222,7 @@
/datum/reagent/blood = 50,
/datum/reagent/medicine/strange_reagent = 5
)
- result = /mob/living/basic/pet/cat/breadcat
+ result = /mob/living/simple_animal/pet/cat/breadcat
category = CAT_BREAD
/datum/crafting_recipe/food/frenchtoast
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
index dfd1b3482bad..b70b3b9114c1 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
@@ -226,7 +226,7 @@
/datum/reagent/consumable/sprinkles = 5,
/datum/reagent/teslium = 1 //To shock the whole thing into life
)
- result = /mob/living/basic/pet/cat/cak
+ result = /mob/living/simple_animal/pet/cat/cak
category = CAT_CAKE //Cat! Haha, get it? CAT? GET IT? We get it - Love Felines
/datum/crafting_recipe/food/fruitcake
diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm
index 93504f374346..08e07ae7c943 100644
--- a/code/modules/holodeck/holo_effect.dm
+++ b/code/modules/holodeck/holo_effect.dm
@@ -94,8 +94,8 @@
/mob/living/basic/pet/dog/pug,
)
mobtype += pick(
- /mob/living/basic/pet/cat,
- /mob/living/basic/pet/cat/kitten,
+ /mob/living/simple_animal/pet/cat,
+ /mob/living/simple_animal/pet/cat/kitten,
)
/obj/effect/holodeck_effect/mobspawner/bee
diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm
index 8b64338093b6..db7fff237cdd 100644
--- a/code/modules/jobs/job_types/shaft_miner.dm
+++ b/code/modules/jobs/job_types/shaft_miner.dm
@@ -35,7 +35,6 @@
id_trim = /datum/id_trim/job/shaft_miner
uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland
- skillchips = list(/obj/item/skillchip/job/miner)
backpack_contents = list(
/obj/item/flashlight/seclite = 1,
/obj/item/knife/combat/survival = 1,
diff --git a/code/modules/library/skill_learning/job_skillchips/miner.dm b/code/modules/library/skill_learning/job_skillchips/miner.dm
deleted file mode 100644
index 2970e5b6085f..000000000000
--- a/code/modules/library/skill_learning/job_skillchips/miner.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/obj/item/skillchip/job/miner
- name = "TUNN3L_R4T skillchip"
- desc = "Gain control of minebots."
- auto_traits = list(TRAIT_ROCK_STONER)
- skill_name = "Battlebot enthusiast"
- skill_description = "Lead minebots into war."
- activate_message = span_notice("A newfound obsession with battlebots fosters within you.")
- deactivate_message = span_notice("You finally get over your battlebots phase, now go get a job.")
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 318311ee7c43..720908d3be1c 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -163,24 +163,3 @@
#undef BEYBLADE_DIZZINESS_DURATION
#undef BEYBLADE_CONFUSION_INCREMENT
#undef BEYBLADE_CONFUSION_LIMIT
-
-/datum/emote/jump
- key = "jump"
- key_third_person = "jumps"
- message = "jumps!"
- // Allows ghosts to jump
- mob_type_ignore_stat_typecache = list(/mob/dead/observer)
-
-/datum/emote/jump/proc/jump_animation(mob/user)
- var/original_transform = user.transform
- animate(user, transform = user.transform.Translate(0, 4), time = 0.1 SECONDS, flags = ANIMATION_PARALLEL)
- animate(transform = original_transform, time = 0.1 SECONDS)
-
-/datum/emote/jump/get_sound(mob/user)
- return 'sound/items/thudswoosh.ogg'
-
-// Avoids playing sounds if we're a ghost
-/datum/emote/jump/should_play_sound(mob/user, intentional)
- if(isliving(user))
- return ..()
- return FALSE
diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm
index 3879de5cebe8..dbed737bdf4b 100644
--- a/code/modules/mob/living/basic/basic.dm
+++ b/code/modules/mob/living/basic/basic.dm
@@ -91,23 +91,18 @@
///This damage is taken when atmos doesn't fit all the requirements above. Set to 0 to avoid adding the atmos_requirements element.
var/unsuitable_atmos_damage = 1
- ///Minimal body temperature without receiving damage
- var/minimum_survivable_temperature = NPC_DEFAULT_MIN_TEMP
- ///Maximal body temperature without receiving damage
- var/maximum_survivable_temperature = NPC_DEFAULT_MAX_TEMP
- ///This damage is taken when the body temp is too cold. Set both this and unsuitable_heat_damage to 0 to avoid adding the body_temp_sensitive element.
- var/unsuitable_cold_damage = 1
- ///This damage is taken when the body temp is too hot. Set both this and unsuitable_cold_damage to 0 to avoid adding the body_temp_sensitive element.
- var/unsuitable_heat_damage = 1
-
- bodytemp_cold_damage_limit = NPC_DEFAULT_MIN_TEMP
- bodytemp_heat_damage_limit = NPC_DEFAULT_MAX_TEMP
-
//MONKESTATION EDIT START
/// List of weather immunity traits that are then added on Initialize(), see traits.dm.
var/list/weather_immunities
//MONKESTATION EDIT END
+ bodytemp_cold_damage_limit = NPC_DEFAULT_MIN_TEMP
+ bodytemp_heat_damage_limit = NPC_DEFAULT_MAX_TEMP
+ ///This damage is taken when the body temp is too cold. Set both this and unsuitable_heat_damage to 0 to avoid adding the basic_body_temp_sensitive element.
+ var/unsuitable_cold_damage = 1
+ ///This damage is taken when the body temp is too hot. Set both this and unsuitable_cold_damage to 0 to avoid adding the basic_body_temp_sensitive element.
+ var/unsuitable_heat_damage = 1
+
/mob/living/basic/Initialize(mapload)
. = ..()
@@ -133,7 +128,6 @@
speak_emote = string_list(speak_emote)
apply_atmos_requirements()
- apply_target_randomisation()
/// Ensures this mob can take atmospheric damage if it's supposed to
/mob/living/basic/proc/apply_atmos_requirements()
@@ -174,11 +168,6 @@
if(!.)
clear_alert(ALERT_TEMPERATURE)
-/mob/living/basic/proc/apply_target_randomisation()
- if (basic_mob_flags & PRECISE_ATTACK_ZONES)
- return
- AddElement(/datum/element/attack_zone_randomiser)
-
/mob/living/basic/Life(seconds_per_tick = SSMOBS_DT, times_fired)
. = ..()
if(staminaloss > 0)
@@ -248,20 +237,14 @@
. += span_deadsay("Upon closer examination, [p_they()] appear[p_s()] to be [HAS_MIND_TRAIT(user, TRAIT_NAIVE) ? "asleep" : "dead"].")
/mob/living/basic/proc/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE)
- if(!early_melee_attack(target, modifiers, ignore_cooldown))
- return FALSE
- var/result = target.attack_basic_mob(src, modifiers)
- SEND_SIGNAL(src, COMSIG_HOSTILE_POST_ATTACKINGTARGET, target, result)
- return result
-
-/mob/living/basic/proc/early_melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE)
face_atom(target)
- if(!ignore_cooldown)
+ if (!ignore_cooldown)
changeNext_move(melee_attack_cooldown)
if(SEND_SIGNAL(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, target, Adjacent(target), modifiers) & COMPONENT_HOSTILE_NO_ATTACK)
return FALSE //but more importantly return before attack_animal called
- return TRUE
-
+ var/result = target.attack_basic_mob(src, modifiers)
+ SEND_SIGNAL(src, COMSIG_HOSTILE_POST_ATTACKINGTARGET, target, result)
+ return result
/mob/living/basic/resolve_unarmed_attack(atom/attack_target, list/modifiers)
//monkestation edit
diff --git a/code/modules/mob/living/basic/bots/bot_ai.dm b/code/modules/mob/living/basic/bots/bot_ai.dm
index d98f6e813407..d07d4e13f71d 100644
--- a/code/modules/mob/living/basic/bots/bot_ai.dm
+++ b/code/modules/mob/living/basic/bots/bot_ai.dm
@@ -99,13 +99,11 @@
action_cooldown = 45 SECONDS
/datum/ai_behavior/manage_unreachable_list/perform(seconds_per_tick, datum/ai_controller/controller, list_key)
+ . = ..()
if(!isnull(controller.blackboard[list_key]))
controller.clear_blackboard_key(list_key)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
-/datum/ai_behavior/manage_unreachable_list/finish_action(datum/ai_controller/controller, succeeded)
- . = ..()
- controller.set_blackboard_key(BB_CLEAR_LIST_READY, controller.blackboard[BB_UNREACHABLE_LIST_COOLDOWN] + world.time)
/datum/ai_planning_subtree/find_patrol_beacon
@@ -128,6 +126,7 @@
/datum/ai_behavior/find_first_beacon_target
/datum/ai_behavior/find_first_beacon_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/closest_distance = INFINITY
var/mob/living/basic/bot/bot_pawn = controller.pawn
var/atom/final_target
@@ -142,9 +141,10 @@
final_target = beacon
if(isnull(final_target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
controller.set_blackboard_key(BB_BEACON_TARGET, final_target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/find_next_beacon_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
@@ -152,7 +152,8 @@
var/atom/final_target
var/obj/machinery/navbeacon/prev_beacon = controller.blackboard[BB_PREVIOUS_BEACON_TARGET]
if(QDELETED(prev_beacon))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
for(var/obj/machinery/navbeacon/beacon as anything in GLOB.navbeacons["[bot_pawn.z]"])
if(beacon.location == prev_beacon.codes[NAVBEACON_PATROL_NEXT])
@@ -161,10 +162,10 @@
if(isnull(final_target))
controller.clear_blackboard_key(BB_PREVIOUS_BEACON_TARGET)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
controller.set_blackboard_key(BB_BEACON_TARGET, final_target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/travel_towards/beacon
@@ -226,11 +227,14 @@
/datum/ai_behavior/salute_authority
/datum/ai_behavior/salute_authority/perform(seconds_per_tick, datum/ai_controller/controller, target_key, salute_keys)
+ . = ..()
if(!controller.blackboard_key_exists(target_key))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
var/list/salute_list = controller.blackboard[salute_keys]
if(!length(salute_list))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
var/mob/living/basic/bot/bot_pawn = controller.pawn
//special interaction if we are wearing a fedora
var/obj/item/our_hat = (locate(/obj/item/clothing/head) in bot_pawn)
@@ -238,7 +242,8 @@
salute_list += "tips [our_hat] at "
bot_pawn.manual_emote(pick(salute_list) + " [controller.blackboard[target_key]]")
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
+ return
/datum/ai_behavior/salute_authority/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
diff --git a/code/modules/mob/living/basic/bots/cleanbot/cleanbot_ai.dm b/code/modules/mob/living/basic/bots/cleanbot/cleanbot_ai.dm
index 638312973794..2f16f88799db 100644
--- a/code/modules/mob/living/basic/bots/cleanbot/cleanbot_ai.dm
+++ b/code/modules/mob/living/basic/bots/cleanbot/cleanbot_ai.dm
@@ -115,14 +115,14 @@
set_movement_target(controller, target)
/datum/ai_behavior/execute_clean/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/mob/living/basic/living_pawn = controller.pawn
var/atom/target = controller.blackboard[target_key]
-
if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
-
+ finish_action(controller, FALSE, target_key)
+ return
living_pawn.UnarmedAttack(target, proximity_flag = TRUE)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/execute_clean/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key)
. = ..()
diff --git a/code/modules/mob/living/basic/bots/hygienebot/hygienebot_ai.dm b/code/modules/mob/living/basic/bots/hygienebot/hygienebot_ai.dm
index a913df74c6bb..2d2bc27079fd 100644
--- a/code/modules/mob/living/basic/bots/hygienebot/hygienebot_ai.dm
+++ b/code/modules/mob/living/basic/bots/hygienebot/hygienebot_ai.dm
@@ -79,10 +79,11 @@
break
if(isnull(found_target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE)
+ return
controller.set_blackboard_key(target_key, found_target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, succeeded = TRUE)
@@ -110,15 +111,17 @@
var/mob/living/carbon/human/unclean_target = controller.blackboard[target_key]
var/mob/living/basic/living_pawn = controller.pawn
if(QDELETED(unclean_target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
if(living_pawn.loc == get_turf(unclean_target))
living_pawn.melee_attack(unclean_target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
+ return
var/frustration_count = controller.blackboard[BB_WASH_FRUSTRATION]
controller.set_blackboard_key(BB_WASH_FRUSTRATION, frustration_count + 1)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
/datum/ai_behavior/wash_target/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
diff --git a/code/modules/mob/living/basic/bots/medbot/medbot_ai.dm b/code/modules/mob/living/basic/bots/medbot/medbot_ai.dm
index 868ebe2a0f45..100366e0b12c 100644
--- a/code/modules/mob/living/basic/bots/medbot/medbot_ai.dm
+++ b/code/modules/mob/living/basic/bots/medbot/medbot_ai.dm
@@ -48,6 +48,7 @@
action_cooldown = 2 SECONDS
/datum/ai_behavior/find_suitable_patient/perform(seconds_per_tick, datum/ai_controller/basic_controller/bot/controller, target_key, threshold, heal_type, mode_flags, access_flags)
+ . = ..()
search_range = (mode_flags & MEDBOT_STATIONARY_MODE) ? 1 : initial(search_range)
var/list/ignore_keys = controller.blackboard[BB_TEMPORARY_IGNORE_LIST]
for(var/mob/living/carbon/human/treatable_target in oview(search_range, controller.pawn))
@@ -65,10 +66,7 @@
controller.set_blackboard_key(BB_PATIENT_TARGET, treatable_target)
break
- if(controller.blackboard_key_exists(BB_PATIENT_TARGET))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- else
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, controller.blackboard_key_exists(BB_PATIENT_TARGET))
/datum/ai_behavior/find_suitable_patient/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
@@ -88,18 +86,21 @@
set_movement_target(controller, target)
/datum/ai_behavior/tend_to_patient/perform(seconds_per_tick, datum/ai_controller/basic_controller/bot/controller, target_key, threshold, damage_type_healer, access_flags)
+ . = ..()
var/mob/living/carbon/human/patient = controller.blackboard[target_key]
if(QDELETED(patient) || patient.stat == DEAD)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
if(check_if_healed(patient, threshold, damage_type_healer, access_flags))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key, healed_target = TRUE)
+ return
var/mob/living/basic/bot/bot_pawn = controller.pawn
if(patient.stat >= HARD_CRIT && prob(5))
var/datum/action/cooldown/bot_announcement/announcement = controller.blackboard[BB_ANNOUNCE_ABILITY]
announcement?.announce(pick(controller.blackboard[BB_NEAR_DEATH_SPEECH]))
bot_pawn.melee_attack(patient)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
// only clear the target if they get healed
/datum/ai_behavior/tend_to_patient/finish_action(datum/ai_controller/controller, succeeded, target_key, healed_target = FALSE)
@@ -158,10 +159,11 @@
speech_to_pick_from += MEDIBOT_VOICED_CHICKEN
if(!length(speech_to_pick_from))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
announcement.announce(pick(speech_to_pick_from))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_planning_subtree/find_and_hunt_target/patients_in_crit
target_key = BB_PATIENT_IN_CRIT
@@ -188,15 +190,18 @@
behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
/datum/ai_behavior/announce_patient/perform(seconds_per_tick, datum/ai_controller/basic_controller/bot/controller, target_key)
+ . = ..()
var/mob/living/living_target = controller.blackboard[target_key]
if(QDELETED(living_target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
var/datum/action/cooldown/bot_announcement/announcement = controller.blackboard[BB_ANNOUNCE_ABILITY]
if(QDELETED(announcement))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
var/text_to_announce = "Medical emergency! [living_target] is in critical condition at [get_area(living_target)]!"
announcement.announce(text_to_announce, controller.blackboard[BB_RADIO_CHANNEL])
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/announce_patient/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
diff --git a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm
index 97a8e69473c8..9d2a9760470b 100644
--- a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm
+++ b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm
@@ -23,12 +23,13 @@
set_movement_target(controller, target)
/datum/ai_behavior/enter_exit_hive/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/obj/structure/beebox/current_home = controller.blackboard[target_key]
var/mob/living/bee_pawn = controller.pawn
var/datum/callback/callback = CALLBACK(bee_pawn, TYPE_PROC_REF(/mob/living/basic/bee, handle_habitation), current_home)
callback.Invoke()
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/inhabit_hive
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH
@@ -41,15 +42,17 @@
set_movement_target(controller, target)
/datum/ai_behavior/inhabit_hive/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/obj/structure/beebox/potential_home = controller.blackboard[target_key]
var/mob/living/bee_pawn = controller.pawn
if(!potential_home.habitable(bee_pawn)) //the house become full before we get to it
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
var/datum/callback/callback = CALLBACK(bee_pawn, TYPE_PROC_REF(/mob/living/basic/bee, handle_habitation), potential_home)
callback.Invoke()
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/inhabit_hive/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
diff --git a/code/modules/mob/living/basic/farm_animals/cow/cow_ai.dm b/code/modules/mob/living/basic/farm_animals/cow/cow_ai.dm
index cedc39f64f3f..e1e611a28c2a 100644
--- a/code/modules/mob/living/basic/farm_animals/cow/cow_ai.dm
+++ b/code/modules/mob/living/basic/farm_animals/cow/cow_ai.dm
@@ -1,6 +1,6 @@
/datum/ai_controller/basic_controller/cow
blackboard = list(
- BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
BB_BASIC_MOB_TIP_REACTING = FALSE,
BB_BASIC_MOB_TIPPER = null,
)
@@ -11,5 +11,7 @@
planning_subtrees = list(
/datum/ai_planning_subtree/tip_reaction,
/datum/ai_planning_subtree/find_food,
+ //attacking the food will eat it
+ /datum/ai_planning_subtree/basic_melee_attack_subtree,
/datum/ai_planning_subtree/random_speech/cow,
)
diff --git a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm
index 6aed3751fbde..ef0467871e50 100644
--- a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm
+++ b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm
@@ -34,7 +34,6 @@
ai_controller = /datum/ai_controller/basic_controller/gorilla
faction = list(FACTION_MONKEY, FACTION_JUNGLE)
butcher_results = list(/obj/item/food/meat/slab/gorilla = 4, /obj/effect/gibspawner/generic/animal = 1)
- max_grab = GRAB_KILL
/// How likely our meaty fist is to stun someone
var/paralyze_chance = 20
/// A counter for when we can scream again
diff --git a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_ai.dm b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_ai.dm
index de55865b5fad..28a727fdb1bc 100644
--- a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_ai.dm
+++ b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_ai.dm
@@ -1,7 +1,7 @@
/// Pretty basic, just click people to death. Also hunt and eat bananas.
/datum/ai_controller/basic_controller/gorilla
blackboard = list(
- BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
BB_EMOTE_KEY = "ooga",
BB_EMOTE_CHANCE = 40,
@@ -13,10 +13,10 @@
planning_subtrees = list(
/datum/ai_planning_subtree/run_emote,
+ /datum/ai_planning_subtree/find_food,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/attack_obstacle_in_path/gorilla,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
- /datum/ai_planning_subtree/find_food,
)
/datum/ai_planning_subtree/attack_obstacle_in_path/gorilla
diff --git a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_ai.dm b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_ai.dm
index 8a900b0308a9..20bcd8a69a13 100644
--- a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_ai.dm
+++ b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_ai.dm
@@ -48,11 +48,13 @@
/datum/ai_behavior/find_valid_teleport_location
/datum/ai_behavior/find_valid_teleport_location/perform(seconds_per_tick, datum/ai_controller/controller, hunting_target_key, types_to_hunt, hunt_range)
+ . = ..()
var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
var/list/possible_turfs = list()
if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
for(var/turf/open/potential_turf in oview(hunt_range, target)) //we check for turfs around the target
if(potential_turf.is_blocked_turf())
@@ -62,10 +64,11 @@
possible_turfs += potential_turf
if(!length(possible_turfs))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
controller.set_blackboard_key(hunting_target_key, pick(possible_turfs))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/hunt_target/use_ability_on_target/demon_teleport
hunt_cooldown = 2 SECONDS
diff --git a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm
index b2923e71bb9b..725dcc09b5ec 100644
--- a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm
+++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm
@@ -21,7 +21,7 @@
/datum/ai_planning_subtree/find_and_hunt_target/corpses/ice_whelp
target_key = BB_TARGET_CANNIBAL
finding_behavior = /datum/ai_behavior/find_hunt_target/corpses/dragon_corpse
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/dragon_cannibalise
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/dragon_cannibalise
hunt_targets = list(/mob/living/basic/mining/ice_whelp)
hunt_range = 10
@@ -32,13 +32,14 @@
return FALSE
return ..()
-/datum/ai_behavior/hunt_target/interact_with_target/dragon_cannibalise
+/datum/ai_behavior/hunt_target/unarmed_attack_target/dragon_cannibalise
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
-/datum/ai_behavior/hunt_target/interact_with_target/dragon_cannibalise/perform(seconds_per_tick, datum/ai_controller/controller, target_key, attack_key)
+/datum/ai_behavior/hunt_target/unarmed_attack_target/dragon_cannibalise/perform(seconds_per_tick, datum/ai_controller/controller, target_key, attack_key)
var/mob/living/target = controller.blackboard[target_key]
if(QDELETED(target) || target.stat != DEAD || target.pulledby) //we were too slow
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
return ..()
/datum/ai_behavior/cannibalize/finish_action(datum/ai_controller/controller, succeeded, target_key)
@@ -66,20 +67,30 @@
set_movement_target(controller, target)
/datum/ai_behavior/sculpt_statue/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
- if(!controller.ai_interact(target = target_key, combat_mode = FALSE))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ . = ..()
+
+ var/atom/target = controller.blackboard[target_key]
+ var/mob/living/basic/living_pawn = controller.pawn
+
+ if(QDELETED(target))
+ finish_action(controller, FALSE, target_key)
+ return
+
+ living_pawn.melee_attack(target)
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/sculpt_statue/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
controller.clear_blackboard_key(target_key)
+
//subtree to use our attacks on the victim
/datum/ai_planning_subtree/targeted_mob_ability/ice_whelp
ability_key = BB_WHELP_STRAIGHTLINE_FIRE
use_ability_behaviour = /datum/ai_behavior/targeted_mob_ability/ice_whelp
finish_planning = FALSE
+
/datum/ai_behavior/targeted_mob_ability/ice_whelp
///key that stores how enraged we are
var/enraged_key = BB_WHELP_ENRAGED
@@ -112,6 +123,8 @@
/datum/ai_behavior/set_target_tree
/datum/ai_behavior/set_target_tree/perform(seconds_per_tick, datum/ai_controller/controller, tree_key)
+ . = ..()
+
var/mob/living_pawn = controller.pawn
var/list/possible_trees = list()
@@ -121,10 +134,11 @@
possible_trees += possible_tree
if(!length(possible_trees))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
controller.set_blackboard_key(tree_key, pick(possible_trees))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/targeted_mob_ability/and_clear_target/burn_trees
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm
index 7d1b40fc5ec2..fa2a86787d86 100644
--- a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm
+++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm
@@ -19,7 +19,7 @@
/datum/ai_planning_subtree/find_and_hunt_target/destroy_surveillance
target_key = BB_SURVEILLANCE_TARGET
finding_behavior = /datum/ai_behavior/find_hunt_target/find_active_surveillance
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target
hunt_targets = list(/obj/machinery/camera, /obj/machinery/light)
hunt_range = 7
diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm b/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm
index d97f0e659c6c..c527317863be 100644
--- a/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm
+++ b/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm
@@ -19,7 +19,7 @@
/datum/ai_planning_subtree/find_and_hunt_target/watering_can
target_key = BB_WATERCAN_TARGET
finding_behavior = /datum/ai_behavior/find_hunt_target
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target
hunt_targets = list(/obj/item/reagent_containers/cup/watering_can)
hunt_range = 7
@@ -32,7 +32,7 @@
/datum/ai_planning_subtree/find_and_hunt_target/treat_hydroplants
target_key = BB_HYDROPLANT_TARGET
finding_behavior = /datum/ai_behavior/find_and_set/treatable_hydro
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/treat_hydroplant
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/treat_hydroplant
hunt_targets = list(/obj/machinery/growing/tray)
hunt_range = 7
@@ -62,11 +62,11 @@
if(possible_trays.len)
return pick(possible_trays)
-/datum/ai_behavior/hunt_target/interact_with_target/treat_hydroplant
+/datum/ai_behavior/hunt_target/unarmed_attack_target/treat_hydroplant
hunt_cooldown = 2 SECONDS
always_reset_target = TRUE
-/datum/ai_behavior/hunt_target/interact_with_target/treat_hydroplant/target_caught(mob/living/living_pawn, atom/movable/hydro_target)
+/datum/ai_behavior/hunt_target/unarmed_attack_target/treat_hydroplant/target_caught(mob/living/living_pawn, atom/movable/hydro_target)
var/datum/component/plant_growing/growing = hydro_target.GetComponent(/datum/component/plant_growing)
if(!growing)
return
@@ -135,7 +135,7 @@
/datum/ai_planning_subtree/find_and_hunt_target/fill_watercan
target_key = BB_LOW_PRIORITY_HUNTING_TARGET
finding_behavior = /datum/ai_behavior/find_hunt_target/suitable_dispenser
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/water_source
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/water_source
hunt_targets = list(/obj/structure/sink, /obj/structure/reagent_dispensers)
hunt_range = 7
@@ -158,7 +158,7 @@
return can_see(source, water_source, radius)
-/datum/ai_behavior/hunt_target/interact_with_target/water_source
+/datum/ai_behavior/hunt_target/unarmed_attack_target/water_source
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
hunt_cooldown = 5 SECONDS
diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_ai.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_ai.dm
index 79dae52242a4..3e0558f89af0 100644
--- a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_ai.dm
+++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_ai.dm
@@ -43,5 +43,6 @@
/datum/ai_behavior/targeted_mob_ability/brimbeam/perform(seconds_per_tick, datum/ai_controller/controller, ability_key, target_key)
var/mob/living/target = controller.blackboard[target_key]
if (QDELETED(target) || !(get_dir(controller.pawn, target) in GLOB.cardinals) || get_dist(controller.pawn, target) > max_target_distance)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE, ability_key = ability_key, target_key = target_key)
+ return
return ..()
diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm
index 23022ed18013..030448e7d309 100644
--- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm
+++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm
@@ -42,7 +42,7 @@
///consume food!
/datum/ai_planning_subtree/find_and_hunt_target/hunt_ores
target_key = BB_ORE_TARGET
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/hunt_ores
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/hunt_ores
finding_behavior = /datum/ai_behavior/find_hunt_target/hunt_ores
hunt_targets = list(/obj/item/stack/ore)
hunt_chance = 75
@@ -65,7 +65,7 @@
return can_see(source, target, radius)
-/datum/ai_behavior/hunt_target/interact_with_target/hunt_ores
+/datum/ai_behavior/hunt_target/unarmed_attack_target/hunt_ores
always_reset_target = TRUE
///find our child's egg and pull it!
diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm
index 80c8d8d280a6..7509544cfa73 100644
--- a/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm
+++ b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm
@@ -3,7 +3,7 @@
/datum/ai_controller/basic_controller/goliath
blackboard = list(
- BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
)
@@ -37,7 +37,8 @@
if (isliving(target) && !target.has_status_effect(/datum/status_effect/incapacitating/stun/goliath_tentacled))
var/datum/action/cooldown/using_action = controller.blackboard[BB_GOLIATH_TENTACLES]
if (using_action?.IsAvailable())
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE)
+ return
return ..()
/datum/ai_planning_subtree/targeted_mob_ability/goliath_tentacles
@@ -67,18 +68,20 @@
var/scan_range = 3
/datum/ai_behavior/goliath_find_diggable_turf/perform(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
var/turf/target_turf = controller.blackboard[target_key]
if (is_valid_turf(target_turf))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE)
+ return
var/mob/living/pawn = controller.pawn
var/list/nearby_turfs = RANGE_TURFS(scan_range, pawn)
var/turf/check_turf = pick(nearby_turfs) // This isn't an efficient search algorithm but we don't need it to be
if (!is_valid_turf(check_turf))
- // Otherwise they won't perform idle wanderin
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE) // Otherwise they won't perform idle wanderin
+ return
controller.set_blackboard_key(target_key, check_turf)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, succeeded = TRUE)
/// Return true if this is a turf we can dig
/datum/ai_behavior/goliath_find_diggable_turf/proc/is_valid_turf(turf/check_turf)
@@ -110,12 +113,13 @@
set_movement_target(controller, target_turf)
/datum/ai_behavior/goliath_dig/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/turf/target_turf = controller.blackboard[target_key]
var/mob/living/basic/basic_mob = controller.pawn
if(!basic_mob.CanReach(target_turf))
- return AI_BEHAVIOR_DELAY
+ return
basic_mob.melee_attack(target_turf)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, succeeded = TRUE)
/datum/ai_behavior/goliath_dig/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
diff --git a/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_ai.dm b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_ai.dm
index 6bc4ec7d46b7..faf7a58b65fa 100644
--- a/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_ai.dm
+++ b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_ai.dm
@@ -44,9 +44,11 @@
continue
living_pawn.befriend(potential_friend)
to_chat(potential_friend, span_nicegreen("[living_pawn] looks at you with endearing eyes!"))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
+ return
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
@@ -74,7 +76,7 @@
///consume food!
/datum/ai_planning_subtree/find_and_hunt_target/food_trough
target_key = BB_TROUGH_TARGET
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/food_trough
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/food_trough
finding_behavior = /datum/ai_behavior/find_hunt_target/food_trough
hunt_targets = list(/obj/structure/ore_container/gutlunch_trough)
hunt_chance = 75
@@ -97,9 +99,9 @@
return can_see(source, target, radius)
-/datum/ai_behavior/hunt_target/interact_with_target/food_trough
+/datum/ai_behavior/hunt_target/unarmed_attack_target/food_trough
always_reset_target = TRUE
- behavior_combat_mode = FALSE
+ switch_combat_mode = TRUE
/datum/pet_command/mine_walls
command_name = "Mine"
diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm
index c8e294f3e064..b80d5d6b9f79 100644
--- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm
+++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm
@@ -47,8 +47,8 @@
if (!is_vulnerable)
controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, FALSE)
if (!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
- // We don't want to clear our target
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller = controller, succeeded = TRUE, target_key = target_key) // We don't want to clear our target
+ return
return ..()
/datum/ai_planning_subtree/flee_target/lobster
@@ -72,7 +72,8 @@
if (!HAS_TRAIT(target, trait))
continue
controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE)
+ return
var/mob/living/us = controller.pawn
if (us.pulling == target)
@@ -131,12 +132,14 @@
set_movement_target(controller, current_target)
/datum/ai_behavior/grab_fingers/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
+
var/atom/current_target = controller.blackboard[target_key]
if (QDELETED(current_target))
- return AI_BEHAVIOR_DELAY
+ return
var/mob/living/living_pawn = controller.pawn
living_pawn.start_pulling(current_target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, succeeded = TRUE)
/// How far we'll try to go before eating an arm
#define FLEE_TO_RANGE 9
@@ -156,18 +159,14 @@
if (QDELETED(current_target))
set_movement_target(controller, get_turf(controller.pawn))
return
- var/perform_flags = target_step_away(controller, current_target, target_key)
- if (perform_flags & AI_BEHAVIOR_SUCCEEDED)
- finish_action(controller, TRUE, target_key)
- else if(perform_flags & AI_BEHAVIOR_FAILED)
- finish_action(controller, FALSE, target_key)
+ target_step_away(controller, current_target, target_key)
/// Find the next step to take away from the current target
/datum/ai_behavior/hoard_fingers/proc/target_step_away(datum/ai_controller/controller, atom/current_target, target_key)
var/turf/next_step = get_step_away(controller.pawn, current_target)
if (!isnull(next_step) && !next_step.is_blocked_turf(exclude_mobs = TRUE))
set_movement_target(controller, next_step)
- return NONE
+ return
var/list/all_dirs = GLOB.alldirs.Copy()
all_dirs -= get_dir(controller.pawn, next_step)
all_dirs -= get_dir(controller.pawn, current_target)
@@ -176,37 +175,37 @@
next_step = get_step(controller.pawn, dir)
if (!isnull(next_step) && !next_step.is_blocked_turf(exclude_mobs = TRUE))
set_movement_target(controller, next_step)
- return NONE
- return AI_BEHAVIOR_FAILED
+ return
+ finish_action(controller, succeeded = FALSE, target_key = target_key)
+ return
/datum/ai_behavior/hoard_fingers/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/current_patience = controller.blackboard[patience_key] + 1
if (current_patience >= MAX_LOBSTROSITY_PATIENCE)
- if(eat_fingers(controller, target_key))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ eat_fingers(controller, target_key)
+ return
controller.set_blackboard_key(patience_key, current_patience)
var/mob/living/living_pawn = controller.pawn
if (isnull(living_pawn.pulling))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE, target_key = target_key)
+ return
var/atom/current_target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
if (QDELETED(current_target) || !can_see(controller.pawn, current_target, FLEE_TO_RANGE))
- if(eat_fingers(controller, target_key))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- if(target_step_away(controller, current_target, target_key))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ eat_fingers(controller, target_key)
+ return
+ target_step_away(controller, current_target, target_key)
/// Finally consume those delicious digits
/datum/ai_behavior/hoard_fingers/proc/eat_fingers(datum/ai_controller/controller, target_key)
var/mob/living/basic/living_pawn = controller.pawn
var/atom/fingers = controller.blackboard[target_key]
if (QDELETED(fingers) || living_pawn.pulling != fingers)
- return AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE, target_key = target_key)
+ return
living_pawn.melee_attack(fingers)
- return AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, succeeded = TRUE, target_key = target_key)
/datum/ai_behavior/hoard_fingers/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
diff --git a/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm
index 45db86b1714a..cfc359bd54fc 100644
--- a/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm
+++ b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm
@@ -138,9 +138,3 @@
base_pixel_y = -16
base_pixel_x = -16
duration = 1 SECONDS
-
-/obj/effect/temp_visual/mook_dust/small
-
-/obj/effect/temp_visual/mook_dust/small/Initialize(mapload)
- . = ..()
- transform = transform.Scale(0.5)
diff --git a/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm b/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm
index e600df1b195d..504166930614 100644
--- a/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm
+++ b/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm
@@ -70,7 +70,7 @@ GLOBAL_LIST_INIT(mook_commands, list(
///deposit ores into the stand!
/datum/ai_planning_subtree/find_and_hunt_target/material_stand
target_key = BB_MATERIAL_STAND_TARGET
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/material_stand
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/material_stand
finding_behavior = /datum/ai_behavior/find_hunt_target
hunt_targets = list(/obj/structure/ore_container/material_stand)
hunt_range = 9
@@ -81,14 +81,14 @@ GLOBAL_LIST_INIT(mook_commands, list(
return
return ..()
-/datum/ai_behavior/hunt_target/interact_with_target/material_stand
+/datum/ai_behavior/hunt_target/unarmed_attack_target/material_stand
required_distance = 0
always_reset_target = TRUE
- behavior_combat_mode = FALSE
+ switch_combat_mode = TRUE
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
///try to face the counter when depositing ores
-/datum/ai_behavior/hunt_target/interact_with_target/material_stand/setup(datum/ai_controller/controller, hunting_target_key, hunting_cooldown_key)
+/datum/ai_behavior/hunt_target/unarmed_attack_target/material_stand/setup(datum/ai_controller/controller, hunting_target_key, hunting_cooldown_key)
. = ..()
var/atom/hunt_target = controller.blackboard[hunting_target_key]
if (QDELETED(hunt_target))
@@ -117,13 +117,15 @@ GLOBAL_LIST_INIT(mook_commands, list(
/datum/ai_behavior/find_village
/datum/ai_behavior/find_village/perform(seconds_per_tick, datum/ai_controller/controller, village_key)
+ . = ..()
var/obj/effect/landmark/home_marker = locate(/obj/effect/landmark/mook_village) in GLOB.landmarks_list
if(isnull(home_marker))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
controller.set_blackboard_key(village_key, home_marker)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
///explore the lands away from the village to look for ore
/datum/ai_planning_subtree/wander_away_from_village
@@ -188,7 +190,8 @@ GLOBAL_LIST_INIT(mook_commands, list(
return return_turf
/datum/ai_behavior/wander/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ . = ..()
+ finish_action(controller, TRUE)
/datum/ai_planning_subtree/mine_walls/mook
find_wall_behavior = /datum/ai_behavior/find_mineral_wall/mook
@@ -297,7 +300,7 @@ GLOBAL_LIST_INIT(mook_commands, list(
///find injured miner mooks after they come home from a long day of work
/datum/ai_planning_subtree/find_and_hunt_target/injured_mooks
target_key = BB_INJURED_MOOK
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/injured_mooks
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/injured_mooks
finding_behavior = /datum/ai_behavior/find_hunt_target/injured_mooks
hunt_targets = list(/mob/living/basic/mining/mook/worker)
hunt_range = 9
@@ -313,9 +316,9 @@ GLOBAL_LIST_INIT(mook_commands, list(
/datum/ai_behavior/find_hunt_target/injured_mooks/valid_dinner(mob/living/source, mob/living/injured_mook)
return (injured_mook.health < injured_mook.maxHealth)
-/datum/ai_behavior/hunt_target/interact_with_target/injured_mooks
+/datum/ai_behavior/hunt_target/unarmed_attack_target/injured_mooks
-/datum/ai_behavior/hunt_target/interact_with_target/injured_mooks
+/datum/ai_behavior/hunt_target/unarmed_attack_target/injured_mooks
always_reset_target = TRUE
hunt_cooldown = 10 SECONDS
@@ -364,20 +367,23 @@ GLOBAL_LIST_INIT(mook_commands, list(
action_cooldown = 5 SECONDS
/datum/ai_behavior/issue_commands/perform(seconds_per_tick, datum/ai_controller/controller, target_key, command_path)
+ . = ..()
var/mob/living/basic/living_pawn = controller.pawn
var/atom/target = controller.blackboard[target_key]
if(isnull(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
var/datum/pet_command/to_command = locate(command_path) in GLOB.mook_commands
if(isnull(to_command))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
var/issue_command = pick(to_command.speech_commands)
living_pawn.say(issue_command, forced = "controller")
living_pawn._pointed(target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
///find an ore, only pick it up when a mook brings it close to us
@@ -405,7 +411,7 @@ GLOBAL_LIST_INIT(mook_commands, list(
/datum/ai_planning_subtree/find_and_hunt_target/bonfire
target_key = BB_MOOK_BONFIRE_TARGET
finding_behavior = /datum/ai_behavior/find_hunt_target/bonfire
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/bonfire
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/bonfire
hunt_targets = list(/obj/structure/bonfire)
hunt_range = 9
@@ -418,5 +424,5 @@ GLOBAL_LIST_INIT(mook_commands, list(
return can_see(source, fire, radius)
-/datum/ai_behavior/hunt_target/interact_with_target/bonfire
+/datum/ai_behavior/hunt_target/unarmed_attack_target/bonfire
always_reset_target = TRUE
diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm
index c0eec3fc5b41..b5de01f103fa 100644
--- a/code/modules/mob/living/basic/minebots/minebot.dm
+++ b/code/modules/mob/living/basic/minebots/minebot.dm
@@ -26,18 +26,13 @@
light_outer_range = 6
light_on = FALSE
ai_controller = /datum/ai_controller/basic_controller/minebot
+ ///the access card we use to access mining
+ var/obj/item/card/id/access_card
///the gun we use to kill
var/obj/item/gun/energy/recharge/kinetic_accelerator/minebot/stored_gun
- ///our normal overlay
- var/mutable_appearance/neutral_overlay
- ///our combat mode overlay
- var/mutable_appearance/combat_overlay
- ///our current color, if any
- var/selected_color
///the commands our owner can give us
- var/static/list/pet_commands = list(
+ var/list/pet_commands = list(
/datum/pet_command/idle/minebot,
- /datum/pet_command/protect_owner/minebot,
/datum/pet_command/minebot_ability/light,
/datum/pet_command/minebot_ability/dump,
/datum/pet_command/automate_mining,
@@ -45,30 +40,20 @@
/datum/pet_command/follow,
/datum/pet_command/point_targeting/attack/minebot,
)
- ///possible colors the bot can have
- var/static/list/possible_colors= list(
- "Default" = null, //default color state
- "Blue" = "#70d5e7",
- "Red" = "#ee7fb9",
- "Green" = "#5fea94",
- )
/mob/living/basic/mining_drone/Initialize(mapload)
. = ..()
- neutral_overlay = mutable_appearance(icon = 'icons/mob/silicon/aibots.dmi', icon_state = "mining_drone_grey")
- combat_overlay = mutable_appearance(icon = 'icons/mob/silicon/aibots.dmi', icon_state = "mining_drone_offense_grey")
- AddComponent(/datum/component/obeys_commands, pet_commands)
+
var/static/list/death_drops = list(/obj/effect/decal/cleanable/robot_debris/old)
AddElement(/datum/element/death_drops, death_drops)
add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE), INNATE_TRAIT)
AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE)
-
- var/static/list/innate_actions = list(
- /datum/action/cooldown/mob_cooldown/missile_launcher = BB_MINEBOT_MISSILE_ABILITY,
- /datum/action/cooldown/mob_cooldown/drop_landmine = BB_MINEBOT_LANDMINE_ABILITY,
- /datum/action/cooldown/mob_cooldown/minedrone/toggle_light = BB_MINEBOT_LIGHT_ABILITY,
- /datum/action/cooldown/mob_cooldown/minedrone/toggle_meson_vision = null,
- /datum/action/cooldown/mob_cooldown/minedrone/dump_ore = BB_MINEBOT_DUMP_ABILITY,
+ AddComponent(\
+ /datum/component/tameable,\
+ food_types = list(/obj/item/stack/ore),\
+ tame_chance = 100,\
+ bonus_tame_chance = 5,\
+ after_tame = CALLBACK(src, PROC_REF(activate_bot)),\
)
var/datum/action/cooldown/mob_cooldown/minedrone/toggle_light/toggle_light_action = new(src)
@@ -80,20 +65,19 @@
ai_controller.set_blackboard_key(BB_MINEBOT_LIGHT_ABILITY, toggle_light_action)
ai_controller.set_blackboard_key(BB_MINEBOT_DUMP_ABILITY, dump_ore_action)
- grant_actions_by_list(innate_actions)
stored_gun = new(src)
var/obj/item/implant/radio/mining/comms = new(src)
comms.implant(src)
- var/static/list/accesses = list(
- /datum/id_trim/job/shaft_miner,
- )
- AddElement(/datum/element/mob_access, accesses)
- RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack))
+ access_card = new /obj/item/card/id/advanced/gold(src)
+ SSid_access.apply_trim_to_card(access_card, /datum/id_trim/job/shaft_miner)
+
+ RegisterSignal(src, COMSIG_MOB_TRIED_ACCESS, PROC_REF(attempt_access))
/mob/living/basic/mining_drone/set_combat_mode(new_mode, silent = TRUE)
. = ..()
- icon_state = combat_mode ? "mining_drone_offense" : "mining_drone"
- balloon_alert(src, "now [combat_mode ? "attacking" : "collecting"]")
+ icon_state = (istate & ISTATE_HARM) ? "mining_drone_offense" : "mining_drone"
+ balloon_alert(src, "now [(istate & ISTATE_HARM) ? "attacking" : "collecting"]")
+
/mob/living/basic/mining_drone/examine(mob/user)
. = ..()
if(health < maxHealth)
@@ -101,15 +85,20 @@
. += span_warning("[p_They()] look slightly dented.")
else
. += span_boldwarning("[p_They()] look severely dented!")
+
if(isnull(stored_gun) || !stored_gun.max_mod_capacity)
return
+
. += "[stored_gun.get_remaining_mod_capacity()]% mod capacity remaining."
+
for(var/obj/item/borg/upgrade/modkit/modkit as anything in stored_gun.modkits)
. += span_notice("There is \a [modkit] installed, using [modkit.cost]% capacity.")
+
+
/mob/living/basic/mining_drone/welder_act(mob/living/user, obj/item/welder)
- if(user.combat_mode)
+ if(user.istate & ISTATE_HARM)
return FALSE
- if(combat_mode)
+ if(istate & ISTATE_HARM)
user.balloon_alert(user, "can't repair in attack mode!")
return TRUE
if(maxHealth == health)
@@ -119,133 +108,66 @@
adjustBruteLoss(-15)
user.balloon_alert(user, "successfully repaired!")
return TRUE
+
/mob/living/basic/mining_drone/attackby(obj/item/item_used, mob/user, params)
if(item_used.tool_behaviour == TOOL_CROWBAR || istype(item_used, /obj/item/borg/upgrade/modkit))
item_used.melee_attack_chain(user, stored_gun, params)
return
- return ..()
-/mob/living/basic/mining_drone/attack_hand(mob/living/carbon/human/user, list/modifiers)
- if(!user.combat_mode)
- ui_interact(user)
- return
return ..()
-/mob/living/basic/mining_drone/ui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "MineBot", name)
- ui.open()
-
-/mob/living/basic/mining_drone/ui_data(mob/user)
- var/list/data = list()
- data["auto_defend"] = ai_controller.blackboard[BB_MINEBOT_AUTO_DEFEND]
- data["repair_node_drone"] = ai_controller.blackboard[BB_MINEBOT_REPAIR_DRONE]
- data["plant_mines"] = ai_controller.blackboard[BB_MINEBOT_PLANT_MINES]
- data["bot_maintain_distance"] = ai_controller.blackboard[BB_MINIMUM_SHOOTING_DISTANCE]
- data["bot_name"] = name
- data["bot_mode"] = combat_mode
- data["bot_health"] = health
- data["bot_maxhealth"] = maxHealth
- data["bot_color"] = ""
- var/color_value = neutral_overlay.color
- for(var/index in possible_colors)
- if(possible_colors[index] == color_value)
- data["bot_color"] = index
- break
- return data
-
-/mob/living/basic/mining_drone/ui_static_data(mob/user)
- var/list/data = list()
- data["bot_icon"] = icon2base64(getFlatIcon(src))
- data["possible_colors"] = list()
- for(var/color in possible_colors)
- data["possible_colors"] += list(list(
- "color_name" = color,
- "color_value" = possible_colors[color],
- ))
- return data
-
-/mob/living/basic/mining_drone/ui_act(action, params, datum/tgui/ui)
+/mob/living/basic/mining_drone/attack_hand(mob/living/carbon/human/user, list/modifiers)
. = ..()
- switch(action)
- if("change_min_distance")
- var/new_distance = clamp(params["distance"], 0, 5)
- ai_controller.set_blackboard_key(BB_MINIMUM_SHOOTING_DISTANCE, new_distance)
- if("toggle_defend")
- var/new_toggle = !ai_controller.blackboard[BB_MINEBOT_AUTO_DEFEND]
- ai_controller.set_blackboard_key(BB_MINEBOT_AUTO_DEFEND, new_toggle)
- if("toggle_repair")
- var/new_defend = !ai_controller.blackboard[BB_MINEBOT_REPAIR_DRONE]
- ai_controller.set_blackboard_key(BB_MINEBOT_REPAIR_DRONE, new_defend)
- if("toggle_mines")
- var/new_mines = !ai_controller.blackboard[BB_MINEBOT_PLANT_MINES]
- ai_controller.set_blackboard_key(BB_MINEBOT_PLANT_MINES, new_mines)
- if("set_name")
- var/input_name = sanitize_name(params["chosen_name"], allow_numbers = TRUE)
- name = (input_name ? input_name : initial(name))
- if("toggle_mode")
- set_combat_mode(!combat_mode)
- if("set_color")
- change_color(params["chosen_color"])
- update_static_data(ui.user, ui)
- return TRUE
-
-/mob/living/basic/mining_drone/proc/change_color(new_color)
- selected_color = new_color
- if(!isnull(selected_color))
- neutral_overlay.color = selected_color
- combat_overlay.color = selected_color
- update_appearance()
-/mob/living/basic/mining_drone/AltClick(mob/living/user)
- . = ..()
- if(user.combat_mode)
+ if(. ||( user.istate & ISTATE_HARM))
return
- set_combat_mode(!combat_mode)
- balloon_alert(user, "now [combat_mode ? "attacking wildlife" : "collecting loose ore"]")
+ set_combat_mode(!(istate & ISTATE_HARM))
+ balloon_alert(user, "now [(istate & ISTATE_HARM) ? "attacking wildlife" : "collecting loose ore"]")
/mob/living/basic/mining_drone/RangedAttack(atom/target)
- if(!combat_mode)
+ if(!(istate & ISTATE_HARM))
return
stored_gun.afterattack(target, src)
+
/mob/living/basic/mining_drone/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers)
. = ..()
- if(!. || !proximity_flag || combat_mode)
+ if(!. || !proximity_flag || (istate & ISTATE_HARM))
return
+
if(istype(attack_target, /obj/item/stack/ore))
var/obj/item/target_ore = attack_target
target_ore.forceMove(src)
+
/mob/living/basic/mining_drone/proc/drop_ore()
to_chat(src, span_notice("You dump your stored ore."))
for(var/obj/item/stack/ore/dropped_item in contents)
dropped_item.forceMove(get_turf(src))
+/mob/living/basic/mining_drone/proc/attempt_access(mob/drone, obj/door_attempt)
+ SIGNAL_HANDLER
+
+ if(door_attempt.check_access(access_card))
+ return ACCESS_ALLOWED
+ return ACCESS_DISALLOWED
+
+/mob/living/basic/mining_drone/proc/activate_bot()
+ AddComponent(/datum/component/obeys_commands, pet_commands)
+
/mob/living/basic/mining_drone/death(gibbed)
drop_ore()
if(isnull(stored_gun))
return ..()
+
for(var/obj/item/borg/upgrade/modkit/modkit as anything in stored_gun.modkits)
modkit.uninstall(stored_gun)
+
return ..()
/mob/living/basic/mining_drone/Destroy()
QDEL_NULL(stored_gun)
+ QDEL_NULL(access_card)
return ..()
-/mob/living/basic/mining_drone/proc/pre_attack(datum/source, atom/target)
- SIGNAL_HANDLER
-
- if(!istype(target, /mob/living/basic/node_drone))
- return NONE
- INVOKE_ASYNC(src, PROC_REF(repair_node_drone), target)
- return COMPONENT_HOSTILE_NO_ATTACK
-
-/mob/living/basic/mining_drone/proc/repair_node_drone(mob/living/my_target)
- do_sparks(5, FALSE, source = my_target)
- if(!do_after(src, 6 SECONDS, my_target))
- return
- my_target.heal_overall_damage(brute = 50)
diff --git a/code/modules/mob/living/basic/minebots/minebot_abilities.dm b/code/modules/mob/living/basic/minebots/minebot_abilities.dm
index f6c46fc28628..4f119fd9b66a 100644
--- a/code/modules/mob/living/basic/minebots/minebot_abilities.dm
+++ b/code/modules/mob/living/basic/minebots/minebot_abilities.dm
@@ -49,137 +49,3 @@
to_chat(owner, span_notice("You toggle your meson vision [(owner.sight & SEE_TURFS) ? "on" : "off"]."))
-/obj/effect/temp_visual/shadow_telegraph
- name = "shadow"
- icon = 'icons/effects/effects.dmi'
- icon_state = "shadow_telegraph"
- duration = 1.5 SECONDS
-
-/datum/action/cooldown/mob_cooldown/missile_launcher
- name = "Launch Missile"
- button_icon = 'icons/obj/weapons/guns/projectiles.dmi'
- button_icon_state = "84mm-heap"
- background_icon_state = "bg_default"
- overlay_icon_state = "bg_default_border"
- desc = "Launch a missile towards the target!"
- cooldown_time = 10 SECONDS
- shared_cooldown = NONE
- melee_cooldown_time = 0 SECONDS
- ///how long before we launch said missile
- var/wind_up_timer = 1 SECONDS
-
-/datum/action/cooldown/mob_cooldown/missile_launcher/IsAvailable(feedback = TRUE)
- if(is_mining_level(owner.z))
- return TRUE
- if(feedback)
- owner.balloon_alert(owner, "cant be used here!")
- return FALSE
-
-/datum/action/cooldown/mob_cooldown/missile_launcher/Activate(atom/target)
- var/turf/target_turf = get_turf(target)
- if(isnull(target_turf) || !can_see(owner, target_turf, 7))
- return FALSE
- owner.Shake(duration = wind_up_timer)
- addtimer(CALLBACK(src, PROC_REF(launch_missile), target_turf), wind_up_timer)
- StartCooldown()
- return TRUE
-
-/datum/action/cooldown/mob_cooldown/missile_launcher/proc/launch_missile(turf/target_turf)
- new /obj/effect/temp_visual/mook_dust(get_turf(owner))
- var/obj/effect/temp_visual/rising_rocket/new_rocket = new(get_turf(owner))
- addtimer(CALLBACK(src, PROC_REF(drop_missile), target_turf), new_rocket.duration)
-
-/datum/action/cooldown/mob_cooldown/missile_launcher/proc/drop_missile(turf/target_turf)
- new /obj/effect/temp_visual/falling_rocket(target_turf)
- var/obj/effect/temp_visual/falling_shadow = new /obj/effect/temp_visual/shadow_telegraph(target_turf)
- animate(falling_shadow, transform = matrix().Scale(0.1, 0.1), time = falling_shadow.duration)
-
-/datum/action/cooldown/mob_cooldown/drop_landmine
- name = "Landmine"
- desc = "Drop a landmine!"
- button_icon = 'icons/obj/weapons/grenade.dmi'
- button_icon_state = "landmine"
- background_icon_state = "bg_default"
- overlay_icon_state = "bg_default_border"
- cooldown_time = 10 SECONDS
- shared_cooldown = NONE
- melee_cooldown_time = 0 SECONDS
- click_to_activate = FALSE
-
-/datum/action/cooldown/mob_cooldown/drop_landmine/IsAvailable(feedback = TRUE)
- if(is_mining_level(owner.z))
- return TRUE
- if(feedback)
- owner.balloon_alert(owner, "cant be used here!")
- return FALSE
-
-/datum/action/cooldown/mob_cooldown/drop_landmine/Activate(atom/target)
- var/turf/my_turf = get_turf(owner)
- if(isgroundlessturf(my_turf))
- return FALSE
- var/obj/effect/mine/minebot/my_mine = new(my_turf)
- my_mine.ignore_list = owner.faction.Copy()
- playsound(my_turf, 'sound/weapons/armbomb.ogg', 20)
- StartCooldown()
- return TRUE
-
-/obj/effect/temp_visual/rising_rocket
- name = "Missile"
- icon = 'icons/obj/weapons/guns/projectiles.dmi'
- icon_state = "84mm-heap"
- layer = ABOVE_ALL_MOB_LAYER
- duration = 2 SECONDS
-
-/obj/effect/temp_visual/rising_rocket/Initialize(mapload)
- . = ..()
- playsound(src, 'sound/weapons/minebot_rocket.ogg', 100, FALSE)
- animate(src, pixel_y = base_pixel_y + 500, time = duration, easing = EASE_IN)
-
-/obj/effect/temp_visual/falling_rocket
- name = "Missile"
- icon = 'icons/obj/weapons/guns/projectiles.dmi'
- icon_state = "84mm-heap"
- layer = ABOVE_ALL_MOB_LAYER
- duration = 0.7 SECONDS
- pixel_y = 60
- ///the radius of our explosion
- var/explosion_radius = 2
- ///damage of our explosion
- var/explosion_damage = 100
-
-/obj/effect/temp_visual/falling_rocket/Initialize(mapload)
- . = ..()
- transform = transform.Turn(180)
- addtimer(CALLBACK(src, PROC_REF(create_explosion)), duration)
- animate(src, pixel_y = 0, time = duration)
-
-/obj/effect/temp_visual/falling_rocket/proc/create_explosion()
- playsound(src, 'sound/weapons/minebot_rocket.ogg', 100, FALSE)
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(1, holder = src)
- smoke.start()
- for(var/mob/living/living_target in oview(explosion_radius, src))
- if(living_target.incorporeal_move)
- continue
- living_target.apply_damage(explosion_damage)
-
-/obj/effect/mine/minebot
- name = "Landmine"
- ///we dont detonate if any of these people step on us
- var/list/ignore_list = list()
- ///the damage we apply to whoever steps on us
- var/damage_to_apply = 50
-
-/obj/effect/mine/minebot/mineEffect(mob/living/victim)
- if(!istype(victim))
- return
- var/datum/effect_system/fluid_spread/smoke/smoke = new
- smoke.set_up(0, holder = src)
- smoke.start()
- playsound(src, 'sound/effects/explosion3.ogg', 100)
- victim.apply_damage(damage_to_apply)
-
-/obj/effect/mine/minebot/can_trigger(atom/movable/on_who)
- if(REF(on_who) in ignore_list)
- return FALSE
- return ..()
diff --git a/code/modules/mob/living/basic/minebots/minebot_ai.dm b/code/modules/mob/living/basic/minebots/minebot_ai.dm
index 4b38526be9b9..91b8500300ac 100644
--- a/code/modules/mob/living/basic/minebots/minebot_ai.dm
+++ b/code/modules/mob/living/basic/minebots/minebot_ai.dm
@@ -2,11 +2,6 @@
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
- BB_BASIC_MOB_FLEE_DISTANCE = 3,
- BB_MINIMUM_SHOOTING_DISTANCE = 3,
- BB_MINEBOT_PLANT_MINES = TRUE,
- BB_MINEBOT_REPAIR_DRONE = TRUE,
- BB_MINEBOT_AUTO_DEFEND = TRUE,
BB_BLACKLIST_MINERAL_TURFS = list(/turf/closed/mineral/gibtonite),
BB_AUTOMATED_MINING = FALSE,
)
@@ -15,89 +10,12 @@
idle_behavior = /datum/idle_behavior/idle_random_walk
planning_subtrees = list(
/datum/ai_planning_subtree/simple_find_target,
- /datum/ai_planning_subtree/launch_missiles,
/datum/ai_planning_subtree/pet_planning,
- /datum/ai_planning_subtree/befriend_miners,
- /datum/ai_planning_subtree/defend_node,
- /datum/ai_planning_subtree/minebot_maintain_distance,
/datum/ai_planning_subtree/basic_ranged_attack_subtree/minebot,
/datum/ai_planning_subtree/find_and_hunt_target/hunt_ores/minebot,
/datum/ai_planning_subtree/minebot_mining,
/datum/ai_planning_subtree/locate_dead_humans,
)
- ai_traits = PAUSE_DURING_DO_AFTER
-
-/datum/ai_planning_subtree/launch_missiles
-
-/datum/ai_planning_subtree/launch_missiles/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- var/datum/action/cooldown/missile_ability = controller.blackboard[BB_MINEBOT_MISSILE_ABILITY]
- if(!missile_ability?.IsAvailable())
- return
- if(!controller.blackboard_key_exists(BB_MINEBOT_MISSILE_TARGET))
- controller.queue_behavior(/datum/ai_behavior/find_and_set/clear_bombing_zone, BB_MINEBOT_MISSILE_TARGET, /obj/effect/temp_visual/minebot_target, 7)
- return
- controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/and_clear_target, BB_MINEBOT_MISSILE_ABILITY, BB_MINEBOT_MISSILE_TARGET)
- return SUBTREE_RETURN_FINISH_PLANNING
-
-/datum/ai_behavior/find_and_set/clear_bombing_zone
-
-/datum/ai_behavior/find_and_set/clear_bombing_zone/search_tactic(datum/ai_controller/controller, locate_path, search_range)
- for(var/obj/effect/temp_visual/minebot_target/target in oview(search_range, controller.pawn))
- if(isclosedturf(get_turf(target)))
- continue
- return target
- return null
-
-/datum/ai_planning_subtree/befriend_miners/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- if(!controller.blackboard_key_exists(BB_MINER_FRIEND))
- controller.queue_behavior(/datum/ai_behavior/find_and_set/miner_to_befriend, BB_MINER_FRIEND)
- return
- controller.queue_behavior(/datum/ai_behavior/befriend_target, BB_MINER_FRIEND)
-
-/datum/ai_behavior/find_and_set/miner_to_befriend
-
-/datum/ai_behavior/find_and_set/miner_to_befriend/search_tactic(datum/ai_controller/controller, locate_path, search_range)
- for(var/mob/living/carbon/human/target in oview(search_range, controller.pawn))
- if(HAS_TRAIT(target, TRAIT_ROCK_STONER))
- return target
- return null
-
-/datum/ai_planning_subtree/defend_node/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- var/mob/living/target = controller.blackboard[BB_DRONE_DEFEND]
- if(QDELETED(target))
- controller.queue_behavior(/datum/ai_behavior/find_and_set, BB_DRONE_DEFEND, /mob/living/basic/node_drone)
- return
- var/mob/living/living_pawn = controller.pawn
- if(!living_pawn.faction.Find(REF(target)))
- controller.queue_behavior(/datum/ai_behavior/befriend_target, BB_DRONE_DEFEND)
- return
- if(target.health < (target.maxHealth * 0.75) && controller.blackboard[BB_MINEBOT_REPAIR_DRONE])
- controller.queue_behavior(/datum/ai_behavior/repair_drone, BB_DRONE_DEFEND)
- return SUBTREE_RETURN_FINISH_PLANNING
-
-/datum/ai_behavior/repair_drone
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_REQUIRE_REACH
-
-/datum/ai_behavior/repair_drone/setup(datum/ai_controller/controller, target_key)
- . = ..()
- var/turf/target = controller.blackboard[target_key]
- if(isnull(target))
- return FALSE
- set_movement_target(controller, target)
-
-/datum/ai_behavior/repair_drone/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
- var/atom/target = controller.blackboard[target_key]
- if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- var/mob/living/living_pawn = controller.pawn
- living_pawn.say("REPAIRING [target]!")
- controller.ai_interact(target = target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
-
-/datum/ai_behavior/repair_drone/finish_action(datum/ai_controller/controller, success, target_key)
- . = ..()
- if(!success)
- controller.clear_blackboard_key(target_key)
///find dead humans and report their location on the radio
/datum/ai_planning_subtree/locate_dead_humans/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
@@ -110,24 +28,26 @@
for(var/mob/living/carbon/human/target in oview(search_range, controller.pawn))
if(target.stat >= UNCONSCIOUS && target.mind)
return target
- return null
/datum/ai_behavior/send_sos_message
behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
action_cooldown = 2 MINUTES
/datum/ai_behavior/send_sos_message/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/mob/living/carbon/target = controller.blackboard[target_key]
var/mob/living/living_pawn = controller.pawn
if(QDELETED(target) || is_station_level(target.z))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
var/turf/target_turf = get_turf(target)
var/obj/item/implant/radio/radio_implant = locate(/obj/item/implant/radio) in living_pawn.contents
if(!radio_implant)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
var/message = "ALERT, [target] in need of help at coordinates: [target_turf.x], [target_turf.y], [target_turf.z]!"
radio_implant.radio.talk_into(living_pawn, message, RADIO_CHANNEL_SUPPLY)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/send_sos_message/finish_action(datum/ai_controller/controller, success, target_key)
. = ..()
@@ -138,49 +58,9 @@
operational_datums = null
ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/minebot
-/datum/ai_planning_subtree/basic_ranged_attack_subtree/minebot/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
- if(QDELETED(target))
- return
- var/mob/living/living_pawn = controller.pawn
- if(!living_pawn.combat_mode) //we are not on attack mode
- return
- controller.queue_behavior(ranged_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
- return SUBTREE_RETURN_FINISH_PLANNING
-
-/datum/ai_planning_subtree/minebot_maintain_distance/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
- if(QDELETED(target))
- return
- var/mob/living/living_pawn = controller.pawn
- if(get_dist(living_pawn, target) <= controller.blackboard[BB_MINIMUM_SHOOTING_DISTANCE])
- controller.queue_behavior(/datum/ai_behavior/run_away_from_target/run_and_shoot/minebot, BB_BASIC_MOB_CURRENT_TARGET)
- return SUBTREE_RETURN_FINISH_PLANNING
-
-/datum/ai_behavior/run_away_from_target/run_and_shoot/minebot
-
-/datum/ai_behavior/run_away_from_target/run_and_shoot/minebot/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key)
- if(!controller.blackboard[BB_MINEBOT_PLANT_MINES])
- return ..()
- var/datum/action/cooldown/mine_ability = controller.blackboard[BB_MINEBOT_LANDMINE_ABILITY]
- mine_ability?.Trigger()
- return ..()
-
/datum/ai_behavior/basic_ranged_attack/minebot
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
+ behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
avoid_friendly_fire = TRUE
- ///if our target is closer than this distance, finish action
- var/minimum_distance = 3
-
-/datum/ai_behavior/basic_ranged_attack/minebot/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
- . = ..()
- minimum_distance = controller.blackboard[BB_MINIMUM_SHOOTING_DISTANCE] ? controller.blackboard[BB_MINIMUM_SHOOTING_DISTANCE] : initial(minimum_distance)
- var/atom/target = controller.blackboard[target_key]
- if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- var/mob/living/living_pawn = controller.pawn
- if(get_dist(living_pawn, target) <= minimum_distance)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
/datum/ai_planning_subtree/basic_ranged_attack_subtree/minebot/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
var/mob/living/living_pawn = controller.pawn
@@ -220,20 +100,24 @@
set_movement_target(controller, target)
/datum/ai_behavior/minebot_mine_turf/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/mob/living/basic/living_pawn = controller.pawn
var/turf/target = controller.blackboard[target_key]
if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
if(check_obstacles_in_path(controller, target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
if(!(living_pawn.istate & ISTATE_HARM))
living_pawn.set_combat_mode(TRUE)
living_pawn.RangedAttack(target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
+ return
/datum/ai_behavior/minebot_mine_turf/proc/check_obstacles_in_path(datum/ai_controller/controller, turf/target)
var/mob/living/source = controller.pawn
@@ -250,7 +134,7 @@
///store ores in our body
/datum/ai_planning_subtree/find_and_hunt_target/hunt_ores/minebot
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/consume_ores/minebot
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores/minebot
hunt_chance = 100
/datum/ai_planning_subtree/find_and_hunt_target/hunt_ores/minebot/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
@@ -262,10 +146,10 @@
return ..()
-/datum/ai_behavior/hunt_target/interact_with_target/consume_ores/minebot
+/datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores/minebot
hunt_cooldown = 2 SECONDS
-/datum/ai_behavior/hunt_target/interact_with_target/consume_ores/minebot/target_caught(mob/living/hunter, obj/item/stack/ore/hunted)
+/datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores/minebot/target_caught(mob/living/hunter, obj/item/stack/ore/hunted)
if(hunter.istate & ISTATE_HARM)
hunter.set_combat_mode(FALSE)
return ..()
@@ -332,17 +216,3 @@
/datum/pet_command/idle/minebot/execute_action(datum/ai_controller/controller)
controller.set_blackboard_key(BB_AUTOMATED_MINING, FALSE)
return ..()
-
-/datum/pet_command/protect_owner/minebot
-
-/datum/pet_command/protect_owner/minebot/set_command_target(mob/living/parent, atom/target)
- if(!parent.ai_controller.blackboard[BB_MINEBOT_AUTO_DEFEND])
- return
- if(!parent.ai_controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET) && !QDELETED(target)) //we are already dealing with something,
- parent.ai_controller.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, target)
-
-/datum/pet_command/protect_owner/minebot/execute_action(datum/ai_controller/controller)
- if(controller.blackboard[BB_MINEBOT_AUTO_DEFEND])
- var/mob/living/living_pawn = controller.pawn
- living_pawn.set_combat_mode(TRUE)
- controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND)
diff --git a/code/modules/mob/living/basic/minebots/minebot_remote_control.dm b/code/modules/mob/living/basic/minebots/minebot_remote_control.dm
deleted file mode 100644
index aa790ae5c51a..000000000000
--- a/code/modules/mob/living/basic/minebots/minebot_remote_control.dm
+++ /dev/null
@@ -1,182 +0,0 @@
-#define BOMB_COOLDOWN 20 SECONDS
-/obj/item/minebot_remote_control
- name = "Remote Control"
- desc = "Requesting stratagem!"
- icon = 'icons/obj/mining.dmi'
- icon_state = "minebot_bomb_control"
- item_flags = NOBLUDGEON
- ///are we currently primed to drop a bomb?
- var/primed = FALSE
- ///our last user
- var/datum/weakref/last_user
- ///cooldown till we can drop the next bomb
- COOLDOWN_DECLARE(bomb_timer)
-
-/obj/item/minebot_remote_control/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
- . = ..()
- clear_priming()
-
-/obj/item/minebot_remote_control/proc/clear_priming()
- var/mob/living/living_user = last_user?.resolve()
- last_user = null
- primed = FALSE
- if(isnull(living_user))
- return
- living_user.client?.mouse_override_icon = initial(living_user.client?.mouse_override_icon)
- living_user.update_mouse_pointer()
-
-/obj/item/minebot_remote_control/attack_self(mob/user)
- . = ..()
- if(.)
- return .
-
- if(!COOLDOWN_FINISHED(src, bomb_timer))
- balloon_alert(user, "on cooldown!")
- return TRUE
-
- prime_bomb(user)
- return TRUE
-
-/obj/item/minebot_remote_control/proc/prime_bomb(mob/user)
- primed = TRUE
- last_user = WEAKREF(user)
- user.client?.mouse_override_icon = 'icons/effects/mouse_pointers/weapon_pointer.dmi'
- user.update_mouse_pointer()
-
-/**
- * Called when this item is being used to interact with an atom,
- * IE, a mob is clicking on an atom with this item.
- *
- * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code.
- * Return NONE to allow default interaction / tool handling.
- */
-/obj/item/proc/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
- return NONE
-
-/**
- * Called when this item is being used to interact with an atom WITH RIGHT CLICK,
- * IE, a mob is right clicking on an atom with this item.
- *
- * Default behavior has it run the same code as left click.
- *
- * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code.
- * Return NONE to allow default interaction / tool handling.
- */
-/obj/item/proc/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers)
- return interact_with_atom(interacting_with, user, modifiers)
-
-/**
- * ## Ranged item interaction
- *
- * Handles non-combat ranged interactions of a tool on this atom,
- * such as shooting a gun in the direction of someone*,
- * having a scanner you can point at someone to scan them at any distance,
- * or pointing a laser pointer at something.
- *
- * *While this intuitively sounds combat related, it is not,
- * because a "combat use" of a gun is gun-butting.
- */
-/atom/proc/base_ranged_item_interaction(mob/living/user, obj/item/tool, list/modifiers)
- SHOULD_CALL_PARENT(TRUE)
- PROTECTED_PROC(TRUE)
-
- var/is_right_clicking = LAZYACCESS(modifiers, RIGHT_CLICK)
- var/is_left_clicking = !is_right_clicking
- var/early_sig_return = NONE
- if(is_left_clicking)
- // See [base_item_interaction] for defails on why this is using `||` (TL;DR it's short circuiting)
- early_sig_return = SEND_SIGNAL(src, COMSIG_ATOM_RANGED_ITEM_INTERACTION, user, tool, modifiers) \
- || SEND_SIGNAL(tool, COMSIG_RANGED_ITEM_INTERACTING_WITH_ATOM, user, src, modifiers)
- else
- // See above
- early_sig_return = SEND_SIGNAL(src, COMSIG_ATOM_RANGED_ITEM_INTERACTION_SECONDARY, user, tool, modifiers) \
- || SEND_SIGNAL(tool, COMSIG_RANGED_ITEM_INTERACTING_WITH_ATOM_SECONDARY, user, src, modifiers)
- if(early_sig_return)
- return early_sig_return
-
- var/self_interaction = is_left_clicking \
- ? ranged_item_interaction(user, tool, modifiers) \
- : ranged_item_interaction_secondary(user, tool, modifiers)
- if(self_interaction)
- return self_interaction
-
- var/interact_return = is_left_clicking \
- ? tool.ranged_interact_with_atom(src, user, modifiers) \
- : tool.ranged_interact_with_atom_secondary(src, user, modifiers)
- if(interact_return)
- return interact_return
-
- return NONE
-
-/**
- * Called when this atom has an item used on it from a distance.
- * IE, a mob is clicking on this atom with an item and is not adjacent.
- *
- * Does NOT include Telekinesis users, they are considered adjacent generally.
- *
- * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code.
- */
-/atom/proc/ranged_item_interaction(mob/living/user, obj/item/tool, list/modifiers)
- return NONE
-
-/**
- * Called when this atom has an item used on it from a distance WITH RIGHT CLICK,
- * IE, a mob is right clicking on this atom with an item and is not adjacent.
- *
- * Default behavior has it run the same code as left click.
- *
- * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code.
- */
-/atom/proc/ranged_item_interaction_secondary(mob/living/user, obj/item/tool, list/modifiers)
- return ranged_item_interaction(user, tool, modifiers)
-
-/**
- * Called when this item is being used to interact with an atom from a distance,
- * IE, a mob is clicking on an atom with this item and is not adjacent.
- *
- * Does NOT include Telekinesis users, they are considered adjacent generally
- * (so long as this item is adjacent to the atom).
- *
- * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code.
- */
-/obj/item/proc/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
- return NONE
-
-/**
- * Called when this item is being used to interact with an atom from a distance WITH RIGHT CLICK,
- * IE, a mob is right clicking on an atom with this item and is not adjacent.
- *
- * Default behavior has it run the same code as left click.
- */
-/obj/item/proc/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers)
- return ranged_interact_with_atom(interacting_with, user, modifiers)
-
-/// Back to Minebot after shitcoding all over this file.
-/obj/item/minebot_remote_control/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
- if(HAS_TRAIT(interacting_with, TRAIT_COMBAT_MODE_SKIP_INTERACTION))
- return NONE
- return ranged_interact_with_atom(interacting_with, user, modifiers)
-
-/obj/item/minebot_remote_control/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
- if(!primed)
- user.balloon_alert(user, "not primed!")
- return ITEM_INTERACT_BLOCKING
- var/turf/target_turf = get_turf(interacting_with)
- if(isnull(target_turf) || isclosedturf(target_turf) || isgroundlessturf(target_turf))
- user.balloon_alert(user, "invalid target!")
- return ITEM_INTERACT_BLOCKING
- playsound(src, 'sound/machines/beep.ogg', 30)
- clear_priming()
- new /obj/effect/temp_visual/minebot_target(target_turf)
- COOLDOWN_START(src, bomb_timer, BOMB_COOLDOWN)
- return ITEM_INTERACT_SUCCESS
-
-/obj/effect/temp_visual/minebot_target
- name = "Rocket Target"
- icon = 'icons/mob/actions/actions_items.dmi'
- icon_state = "sniper_zoom"
- layer = BELOW_MOB_LAYER
- plane = GAME_PLANE
- duration = 5 SECONDS
-
-#undef BOMB_COOLDOWN
diff --git a/code/modules/mob/living/basic/minebots/minebot_upgrades.dm b/code/modules/mob/living/basic/minebots/minebot_upgrades.dm
index c3b33cd15a79..6f5d43af1afc 100644
--- a/code/modules/mob/living/basic/minebots/minebot_upgrades.dm
+++ b/code/modules/mob/living/basic/minebots/minebot_upgrades.dm
@@ -3,7 +3,6 @@
desc = "A minebot upgrade."
icon_state = "door_electronics"
icon = 'icons/obj/assemblies/module.dmi'
- item_flags = NOBLUDGEON
/obj/item/mine_bot_upgrade/afterattack(mob/living/basic/mining_drone/minebot, mob/user, proximity)
. = ..()
@@ -59,34 +58,3 @@
minebot.melee_damage_lower = initial(minebot.melee_damage_lower) + base_damage_add
minebot.melee_damage_upper = initial(minebot.melee_damage_upper) + base_damage_add
minebot.stored_gun?.recharge_time += base_cooldown_add
-
-/obj/item/mine_bot_upgrade/regnerative_shield
- name = "regenerative shield"
- desc = "Allows your minebot to tank many hits before going down!"
-
-/obj/item/mine_bot_upgrade/regnerative_shield/upgrade_bot(mob/living/basic/mining_drone/minebot, mob/user)
- if(HAS_TRAIT(minebot, TRAIT_REGEN_SHIELD))
- user.balloon_alert(minebot, "already has it!")
- return
- var/static/list/shield_layers = list(
- /obj/effect/overlay/minebot_top_shield,
- /obj/effect/overlay/minebot_bottom_shield
- )
- minebot.AddComponent(/datum/component/regenerative_shield, shield_overlays = shield_layers)
- qdel(src)
-
-/obj/effect/overlay/minebot_top_shield
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- anchored = TRUE
- vis_flags = VIS_INHERIT_DIR
- icon = 'icons/mob/silicon/aibots.dmi'
- icon_state = "minebot_shield_top_layer"
- layer = ABOVE_ALL_MOB_LAYER
-
-/obj/effect/overlay/minebot_bottom_shield
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- anchored = TRUE
- vis_flags = VIS_INHERIT_DIR
- icon = 'icons/mob/silicon/aibots.dmi'
- icon_state = "minebot_shield_bottom_layer"
- layer = BELOW_MOB_LAYER
diff --git a/code/modules/mob/living/basic/pets/cat/bread_cat_ai.dm b/code/modules/mob/living/basic/pets/cat/bread_cat_ai.dm
deleted file mode 100644
index 655a6431fc2a..000000000000
--- a/code/modules/mob/living/basic/pets/cat/bread_cat_ai.dm
+++ /dev/null
@@ -1,62 +0,0 @@
-/datum/ai_controller/basic_controller/cat/bread
- planning_subtrees = list(
- /datum/ai_planning_subtree/find_and_hunt_target/turn_off_stove,
- /datum/ai_planning_subtree/find_and_hunt_target/hunt_mice,
- /datum/ai_planning_subtree/find_and_hunt_target/find_cat_food,
- /datum/ai_planning_subtree/haul_food_to_young,
- /datum/ai_planning_subtree/random_speech/cats,
- )
-
-/datum/ai_planning_subtree/find_and_hunt_target/turn_off_stove
- target_key = BB_STOVE_TARGET
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/stove_target
- finding_behavior = /datum/ai_behavior/find_hunt_target/stove
- hunt_targets = list(/obj/machinery/oven/range)
- hunt_range = 9
-
-/datum/ai_behavior/find_hunt_target/stove
-
-/datum/ai_behavior/find_hunt_target/stove/valid_dinner(mob/living/source, obj/machinery/oven/range/stove, radius)
- if(!length(stove.used_tray?.contents) || stove.open)
- return FALSE
- //something in there is still baking...
- for(var/atom/baking in stove.used_tray)
- if(HAS_TRAIT(baking, TRAIT_BAKEABLE))
- return FALSE
- return TRUE
-
-/datum/ai_behavior/hunt_target/interact_with_target/stove_target
- always_reset_target = TRUE
-
-/datum/ai_behavior/hunt_target/interact_with_target/stove_target/target_caught(mob/living/hunter, obj/machinery/oven/range/stove)
- if(stove.open)
- return
- return ..()
-
-/datum/ai_controller/basic_controller/cat/cake
- planning_subtrees = list(
- /datum/ai_planning_subtree/find_and_hunt_target/turn_off_stove,
- /datum/ai_planning_subtree/find_and_hunt_target/decorate_donuts,
- /datum/ai_planning_subtree/find_and_hunt_target/hunt_mice,
- /datum/ai_planning_subtree/find_and_hunt_target/find_cat_food,
- /datum/ai_planning_subtree/haul_food_to_young,
- /datum/ai_planning_subtree/random_speech/cats,
- )
-
-/datum/ai_planning_subtree/find_and_hunt_target/decorate_donuts
- target_key = BB_DONUT_TARGET
- hunting_behavior = /datum/ai_behavior/hunt_target/decorate_donuts
- finding_behavior = /datum/ai_behavior/find_hunt_target/decorate_donuts
- hunt_targets = list(/obj/item/food/donut)
- hunt_range = 9
-
-/datum/ai_behavior/find_hunt_target/decorate_donuts/valid_dinner(mob/living/source, obj/item/food/donut/target, radius)
- if(!target.is_decorated)
- return FALSE
- return can_see(source, target, radius)
-
-/datum/ai_behavior/hunt_target/decorate_donuts
- always_reset_target = TRUE
-
-/datum/ai_behavior/hunt_target/decorate_donuts/target_caught(mob/living/hunter, atom/target)
- hunter.spin(spintime = 4, speed = 1)
diff --git a/code/modules/mob/living/basic/pets/cat/cat.dm b/code/modules/mob/living/basic/pets/cat/cat.dm
deleted file mode 100644
index e041d29389bf..000000000000
--- a/code/modules/mob/living/basic/pets/cat/cat.dm
+++ /dev/null
@@ -1,240 +0,0 @@
-/mob/living/basic/pet/cat
- name = "cat"
- desc = "Kitty!!"
- icon = 'icons/mob/simple/pets.dmi'
- icon_state = "cat2"
- icon_living = "cat2"
- icon_dead = "cat2_dead"
- speak_emote = list("purrs", "meows")
- pass_flags = PASSTABLE
- mob_size = MOB_SIZE_SMALL
- mob_biotypes = MOB_ORGANIC|MOB_BEAST
- bodytemp_cold_damage_limit = 200
- bodytemp_heat_damage_limit = 400
- unsuitable_atmos_damage = 0.5
- butcher_results = list(/obj/item/food/meat/slab = 1, /obj/item/organ/internal/ears/cat = 1, /obj/item/organ/external/tail/cat = 1, /obj/item/stack/sheet/animalhide/cat = 1)
- response_help_continuous = "pets"
- response_help_simple = "pet"
- response_disarm_continuous = "gently pushes aside"
- response_disarm_simple = "gently push aside"
- response_harm_continuous = "kicks"
- response_harm_simple = "kick"
- mobility_flags = MOBILITY_FLAGS_REST_CAPABLE_DEFAULT
- gold_core_spawnable = FRIENDLY_SPAWN
- can_be_held = TRUE
- ai_controller = /datum/ai_controller/basic_controller/cat
- faction = list(FACTION_CAT)
- held_state = "cat2"
- attack_verb_continuous = "claws"
- attack_verb_simple = "claw"
- attack_sound = 'sound/items/slash.ogg'
- attack_vis_effect = ATTACK_EFFECT_CLAW
- ///icon of the collar we can wear
- var/collar_icon_state = "cat"
- ///can this cat breed?
- var/can_breed = TRUE
- ///can hold items?
- var/can_hold_item = TRUE
- ///can this cat interact with stoves?
- var/can_interact_with_stove = FALSE
- ///list of items we can carry
- var/static/list/huntable_items = list(
- /obj/item/fish,
- /obj/item/food/deadmouse,
- /obj/item/food/fishmeat,
- )
- ///list of pet commands we follow
- var/static/list/pet_commands = list(
- /datum/pet_command/idle,
- /datum/pet_command/free,
- /datum/pet_command/follow,
- )
-
- ///item we are currently holding
- var/obj/item/held_food
- ///mutable appearance for held item
- var/mutable_appearance/held_item_overlay
-
-/datum/emote/cat
- mob_type_allowed_typecache = /mob/living/basic/pet/cat
- mob_type_blacklist_typecache = list()
-
-/datum/emote/cat/meow
- key = "meow"
- key_third_person = "meows"
- message = "meows!"
- emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE
- vary = TRUE
- sound = SFX_CAT_MEOW
-
-/datum/emote/cat/purr
- key = "purr"
- key_third_person = "purrs"
- message = "purrs."
- emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE
- vary = TRUE
- sound = SFX_CAT_PURR
-
-/mob/living/basic/pet/cat/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/obeys_commands, pet_commands)
- AddElement(/datum/element/wears_collar, collar_icon_state = collar_icon_state, collar_resting_icon_state = TRUE)
- AddElement(/datum/element/ai_retaliate)
- AddElement(/datum/element/pet_bonus, "purr", /datum/mood_event/pet_animal)
- AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_CLAW)
- add_cell_sample()
- add_verb(src, /mob/living/proc/toggle_resting)
- add_traits(list(TRAIT_CATLIKE_GRACE, TRAIT_VENTCRAWLER_ALWAYS, TRAIT_WOUND_LICKER), INNATE_TRAIT)
- ai_controller.override_blackboard_key(BB_HUNTABLE_PREY, typecacheof(huntable_items))
- if(can_breed)
- add_breeding_component()
-
-/mob/living/basic/pet/cat/proc/add_cell_sample()
- AddElement(/datum/element/swabable, CELL_LINE_TABLE_CAT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
-
-/mob/living/basic/pet/cat/early_melee_attack(atom/target, list/modifiers, ignore_cooldown)
- . = ..()
- if(!.)
- return FALSE
-
- if(istype(target, /obj/machinery/oven/range) && can_interact_with_stove)
- target.attack_hand(src)
- return FALSE
-
- if(!can_hold_item)
- return TRUE
-
- if(!is_type_in_list(target, huntable_items) || held_food)
- return TRUE
- var/atom/movable/movable_target = target
- movable_target.forceMove(src)
- return FALSE
-
-/mob/living/basic/pet/cat/Exited(atom/movable/gone, direction)
- . = ..()
- if(gone != held_food)
- return
- held_food = null
- update_appearance(UPDATE_OVERLAYS)
-
-/mob/living/basic/pet/cat/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
- if(is_type_in_list(arrived, huntable_items))
- held_food = arrived
- update_appearance(UPDATE_OVERLAYS)
- return ..()
-
-/mob/living/basic/pet/cat/update_overlays()
- . = ..()
- if(stat == DEAD || resting || !held_food)
- return
- if(istype(held_food, /obj/item/fish))
- held_item_overlay = mutable_appearance(icon, "cat_fish_overlay")
- if(istype(held_food, /obj/item/food/deadmouse))
- held_item_overlay = mutable_appearance(icon, "cat_mouse_overlay")
- . += held_item_overlay
-
-/mob/living/basic/pet/cat/update_resting()
- . = ..()
- if(stat == DEAD)
- return
- update_appearance(UPDATE_ICON_STATE)
-
-/mob/living/basic/pet/cat/update_icon_state()
- . = ..()
- if (resting)
- icon_state = "[icon_living]_rest"
- return
- icon_state = "[icon_living]"
-
-/mob/living/basic/pet/cat/proc/add_breeding_component()
- AddComponent(\
- /datum/component/breed,\
- can_breed_with = typecacheof(list(/mob/living/basic/pet/cat)),\
- baby_path = /mob/living/basic/pet/cat/kitten,\
- )
-
-/mob/living/basic/pet/cat/space
- name = "space cat"
- desc = "They're a cat... in space!"
- icon_state = "spacecat"
- icon_living = "spacecat"
- icon_dead = "spacecat_dead"
- unsuitable_atmos_damage = 0
- minimum_survivable_temperature = TCMB
- maximum_survivable_temperature = T0C + 40
- held_state = "spacecat"
- faction = list(FACTION_CAT)
-
-/mob/living/basic/pet/cat/breadcat
- name = "bread cat"
- desc = "They're a cat... with a bread!"
- icon_state = "breadcat"
- icon_living = "breadcat"
- icon_dead = "breadcat_dead"
- ai_controller = /datum/ai_controller/basic_controller/cat/bread
- held_state = "breadcat"
- faction = list(FACTION_CAT)
- can_interact_with_stove = TRUE
- butcher_results = list(
- /obj/item/food/meat/slab = 2,
- /obj/item/organ/internal/ears/cat = 1,
- /obj/item/organ/external/tail/cat = 1,
- /obj/item/food/breadslice/plain = 1
- )
- collar_icon_state = null
-
-/mob/living/basic/pet/cat/breadcat/add_cell_sample()
- return
-
-/mob/living/basic/pet/cat/original
- name = "Batsy"
- desc = "The product of alien DNA and bored geneticists."
- gender = FEMALE
- icon_state = "original"
- icon_living = "original"
- icon_dead = "original_dead"
- unique_pet = TRUE
- held_state = "original"
- faction = list(FACTION_CAT)
-
-/mob/living/basic/pet/cat/original/add_cell_sample()
- return
-
-/mob/living/basic/pet/cat/kitten
- name = "kitten"
- desc = "D'aaawwww."
- icon_state = "kitten"
- icon_living = "kitten"
- icon_dead = "kitten_dead"
- density = FALSE
- pass_flags = PASSMOB
- mob_size = MOB_SIZE_SMALL
- can_breed = FALSE
- ai_controller = /datum/ai_controller/basic_controller/cat/kitten
- can_hold_item = FALSE
- collar_icon_state = "kitten"
- faction = list(FACTION_CAT)
-
-/mob/living/basic/pet/cat/kitten/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/basic_eating, food_types = huntable_items)
-
-/mob/living/basic/pet/cat/_proc
- name = "Proc"
- gender = MALE
- gold_core_spawnable = NO_SPAWN
- unique_pet = TRUE
- faction = list(FACTION_CAT)
-
-/mob/living/basic/pet/cat/jerry //Holy shit we left jerry on donut ~ Arcane ~Fikou
- name = "Jerry"
- desc = "Tom is VERY amused."
- gender = MALE
- faction = list(FACTION_CAT)
-
-/mob/living/basic/pet/cat/tabby
- icon_state = "cat"
- icon_living = "cat"
- icon_dead = "cat_dead"
- held_state = "cat"
- faction = list(FACTION_CAT)
diff --git a/code/modules/mob/living/basic/pets/cat/cat_ai.dm b/code/modules/mob/living/basic/pets/cat/cat_ai.dm
deleted file mode 100644
index 55321e1362e4..000000000000
--- a/code/modules/mob/living/basic/pets/cat/cat_ai.dm
+++ /dev/null
@@ -1,288 +0,0 @@
-/datum/ai_controller/basic_controller/cat
- blackboard = list(
- BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
- BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
- BB_HOSTILE_MEOWS = list("Mawwww", "Mrewwww", "mhhhhng..."),
- BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/pet/cat),
- BB_BABIES_CHILD_TYPES = list(/mob/living/basic/pet/cat/kitten),
- BB_HUNTABLE_PREY = list(),
- )
-
- ai_movement = /datum/ai_movement/basic_avoidance
- idle_behavior = /datum/idle_behavior/idle_random_walk
- planning_subtrees = list(
- /datum/ai_planning_subtree/pet_planning,
- /datum/ai_planning_subtree/reside_in_home,
- /datum/ai_planning_subtree/flee_target/from_flee_key/cat_struggle,
- /datum/ai_planning_subtree/find_and_hunt_target/hunt_mice,
- /datum/ai_planning_subtree/find_and_hunt_target/find_cat_food,
- /datum/ai_planning_subtree/simple_find_target,
- /datum/ai_planning_subtree/haul_food_to_young,
- /datum/ai_planning_subtree/territorial_struggle,
- /datum/ai_planning_subtree/make_babies,
- /datum/ai_planning_subtree/random_speech/cats,
- )
-
-/datum/ai_planning_subtree/reside_in_home
- ///chance we enter our home
- var/reside_chance = 5
- ///chance we leave our home
- var/leave_home_chance = 15
-
-/datum/ai_planning_subtree/reside_in_home/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- var/mob/living/living_pawn = controller.pawn
-
- if(controller.blackboard_key_exists(BB_CAT_HOME))
- controller.queue_behavior(/datum/ai_behavior/enter_cat_home, BB_CAT_HOME)
- return
-
- if(istype(living_pawn.loc, /obj/structure/cat_house))
- if(SPT_PROB(leave_home_chance, seconds_per_tick))
- controller.set_blackboard_key(BB_CAT_HOME, living_pawn.loc)
- return SUBTREE_RETURN_FINISH_PLANNING
-
- if(SPT_PROB(reside_chance, seconds_per_tick))
- controller.queue_behavior(/datum/ai_behavior/find_and_set/valid_home, BB_CAT_HOME, /obj/structure/cat_house)
-
-/datum/ai_behavior/find_and_set/valid_home/search_tactic(datum/ai_controller/controller, locate_path, search_range)
- for(var/obj/structure/cat_house/home in oview(search_range, controller.pawn))
- if(home.resident_cat)
- continue
- return home
-
- return null
-
-/datum/ai_behavior/enter_cat_home
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_REQUIRE_REACH
-
-/datum/ai_behavior/enter_cat_home/setup(datum/ai_controller/controller, target_key)
- . = ..()
- var/atom/target = controller.blackboard[target_key]
- if(QDELETED(target))
- return FALSE
- set_movement_target(controller, target)
-
-/datum/ai_behavior/enter_cat_home/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
- var/obj/structure/cat_house/home = controller.blackboard[target_key]
- var/mob/living/basic/living_pawn = controller.pawn
- if(living_pawn == home.resident_cat || isnull(home.resident_cat))
- controller.ai_interact(target = home)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
-
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
-
-/datum/ai_behavior/enter_cat_home/finish_action(datum/ai_controller/controller, success, target_key)
- . = ..()
- controller.clear_blackboard_key(target_key)
-
-/datum/ai_planning_subtree/flee_target/from_flee_key/cat_struggle
- flee_behaviour = /datum/ai_behavior/run_away_from_target/cat_struggle
-
-/datum/ai_behavior/run_away_from_target/cat_struggle
- clear_failed_targets = TRUE
-
-/datum/ai_planning_subtree/territorial_struggle
- ///chance we become hostile to another cat
- var/hostility_chance = 5
-
-/datum/ai_planning_subtree/territorial_struggle/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- var/mob/living/living_pawn = controller.pawn
- if(living_pawn.gender != MALE || !SPT_PROB(hostility_chance, seconds_per_tick))
- return
- if(controller.blackboard_key_exists(BB_TRESSPASSER_TARGET))
- controller.queue_behavior(/datum/ai_behavior/territorial_struggle, BB_TRESSPASSER_TARGET, BB_HOSTILE_MEOWS)
- return SUBTREE_RETURN_FINISH_PLANNING
-
- controller.queue_behavior(/datum/ai_behavior/find_and_set/cat_tresspasser, BB_TRESSPASSER_TARGET, /mob/living/basic/pet/cat)
-
-/datum/ai_behavior/find_and_set/cat_tresspasser/search_tactic(datum/ai_controller/controller, locate_path, search_range)
- var/list/ignore_types = controller.blackboard[BB_BABIES_CHILD_TYPES]
- for(var/mob/living/basic/pet/cat/potential_enemy in oview(search_range, controller.pawn))
- if(potential_enemy.gender != MALE)
- continue
- if(is_type_in_list(potential_enemy, ignore_types))
- continue
- var/datum/ai_controller/basic_controller/enemy_controller = potential_enemy.ai_controller
- if(isnull(enemy_controller))
- continue
- //theyre already engaged in a battle, leave them alone!
- if(enemy_controller.blackboard_key_exists(BB_TRESSPASSER_TARGET))
- continue
- //u choose me and i choose u
- enemy_controller.set_blackboard_key(BB_TRESSPASSER_TARGET, controller.pawn)
- return potential_enemy
- return null
-
-/datum/ai_behavior/territorial_struggle
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_REQUIRE_REACH
- action_cooldown = 5 SECONDS
- ///chance the battle ends!
- var/end_battle_chance = 25
-
-/datum/ai_behavior/territorial_struggle/setup(datum/ai_controller/controller, target_key)
- . = ..()
- var/mob/living/living_pawn = controller.pawn
- var/mob/living/target = controller.blackboard[target_key]
- if(QDELETED(target))
- return FALSE
- if(target.ai_controller?.blackboard[target_key] != living_pawn)
- return FALSE
- set_movement_target(controller, target)
-
-/datum/ai_behavior/territorial_struggle/perform(seconds_per_tick, datum/ai_controller/controller, target_key, cries_key)
- . = ..()
- var/mob/living/target = controller.blackboard[target_key]
-
- if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
-
- var/mob/living/living_pawn = controller.pawn
- var/list/threaten_list = controller.blackboard[cries_key]
- if(length(threaten_list))
- living_pawn.say(pick(threaten_list), forced = "ai_controller")
-
- if(!prob(end_battle_chance))
- return
-
- //50 50 chance we lose
- var/datum/ai_controller/loser_controller = prob(50) ? controller : target.ai_controller
-
- loser_controller.set_blackboard_key(BB_BASIC_MOB_FLEE_TARGET, target)
- target.ai_controller.clear_blackboard_key(BB_TRESSPASSER_TARGET)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
-
-/datum/ai_behavior/territorial_struggle/finish_action(datum/ai_controller/controller, success, target_key)
- . = ..()
- controller.clear_blackboard_key(target_key)
-
-/datum/ai_planning_subtree/find_and_hunt_target/hunt_mice
- target_key = BB_MOUSE_TARGET
- hunting_behavior = /datum/ai_behavior/play_with_mouse
- finding_behavior = /datum/ai_behavior/find_hunt_target/hunt_mice
- hunt_targets = list(/mob/living/basic/mouse)
- hunt_chance = 75
- hunt_range = 9
-
-/datum/ai_planning_subtree/find_and_hunt_target/hunt_mice/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- var/mob/living/living_pawn = controller.pawn
- var/list/items_we_carry = typecache_filter_list(living_pawn, controller.blackboard[BB_HUNTABLE_PREY])
- if(length(items_we_carry))
- return
- return ..()
-
-
-/datum/ai_behavior/find_hunt_target/hunt_mice/valid_dinner(mob/living/source, mob/living/mouse, radius)
- if(mouse.stat == DEAD || mouse.mind)
- return FALSE
- return can_see(source, mouse, radius)
-
-//play as in kill
-/datum/ai_behavior/play_with_mouse
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_REQUIRE_REACH
- action_cooldown = 10 SECONDS
- ///chance we hunt the mouse!
- var/consume_chance = 70
-
-/datum/ai_behavior/play_with_mouse/setup(datum/ai_controller/controller, target_key)
- . = ..()
- var/mob/living/target = controller.blackboard[target_key]
- if(QDELETED(target))
- return FALSE
- set_movement_target(controller, target)
-
-/datum/ai_behavior/play_with_mouse/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
- var/mob/living/basic/mouse/target = controller.blackboard[target_key]
-
- if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
-
- consume_chance = istype(target, /mob/living/basic/mouse/brown/tom) ? 5 : initial(consume_chance)
- if(prob(consume_chance))
- target.splat()
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
-
-/datum/ai_behavior/play_with_mouse/finish_action(datum/ai_controller/controller, success, target_key)
- . = ..()
- var/mob/living/living_pawn = controller.pawn
- var/atom/target = controller.blackboard[target_key]
- controller.clear_blackboard_key(target_key)
- if(isnull(target) || QDELETED(living_pawn))
- return
- var/manual_emote = "attempts to hunt [target]..."
- var/end_result = success ? "and succeeds!" : "but fails!"
- manual_emote += end_result
- living_pawn.manual_emote(manual_emote)
-
-/datum/ai_planning_subtree/find_and_hunt_target/find_cat_food
- target_key = BB_CAT_FOOD_TARGET
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/find_cat_food
- finding_behavior = /datum/ai_behavior/find_hunt_target/find_cat_food
- hunt_targets = list(/obj/item/fish, /obj/item/food/deadmouse, /obj/item/food/fishmeat)
- hunt_chance = 75
- hunt_range = 9
-
-/datum/ai_behavior/hunt_target/interact_with_target/find_cat_food
- always_reset_target = TRUE
-
-/datum/ai_behavior/find_hunt_target/find_cat_food/valid_dinner(mob/living/source, atom/dinner, radius)
- //this food is already near a kitten, let the kitten eat it
- var/mob/living/nearby_kitten = locate(/mob/living/basic/pet/cat/kitten) in oview(2, dinner)
- if(nearby_kitten && nearby_kitten != source)
- return FALSE
- return can_see(source, dinner, radius)
-
-/datum/ai_planning_subtree/haul_food_to_young/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- if(!controller.blackboard_key_exists(BB_FOOD_TO_DELIVER))
- controller.queue_behavior(/datum/ai_behavior/find_and_set/in_hands/given_list, BB_FOOD_TO_DELIVER, controller.blackboard[BB_HUNTABLE_PREY])
- return
- if(!controller.blackboard_key_exists(BB_KITTEN_TO_FEED))
- controller.queue_behavior(/datum/ai_behavior/find_and_set/valid_kitten, BB_KITTEN_TO_FEED, /mob/living/basic/pet/cat/kitten)
- return
-
- controller.queue_behavior(/datum/ai_behavior/deliver_food_to_kitten, BB_KITTEN_TO_FEED, BB_FOOD_TO_DELIVER)
-
-/datum/ai_behavior/find_and_set/valid_kitten
-
-/datum/ai_behavior/find_and_set/valid_kitten/search_tactic(datum/ai_controller/controller, locate_path, search_range)
- var/mob/living/kitten = locate(locate_path) in oview(search_range, controller.pawn)
- //kitten already has food near it, go feed another hungry kitten
-
- if(isnull(kitten))
- return null
-
- var/list/nearby_food = typecache_filter_list(oview(2, kitten), controller.blackboard[BB_HUNTABLE_PREY])
- if(kitten.stat != DEAD && !length(nearby_food))
- return kitten
- return null
-
-/datum/ai_behavior/deliver_food_to_kitten
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_REQUIRE_REACH
- action_cooldown = 5 SECONDS
-
-/datum/ai_behavior/deliver_food_to_kitten/setup(datum/ai_controller/controller, target_key, food_key)
- . = ..()
- var/mob/living/target = controller.blackboard[target_key]
- if(QDELETED(target))
- return FALSE
- set_movement_target(controller, target)
-
-/datum/ai_behavior/deliver_food_to_kitten/perform(seconds_per_tick, datum/ai_controller/controller, target_key, food_key)
- var/mob/living/target = controller.blackboard[target_key]
-
- if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
-
- var/mob/living/living_pawn = controller.pawn
- var/atom/movable/food = controller.blackboard[food_key]
-
- if(isnull(food) || !(food in living_pawn))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
-
- food.forceMove(get_turf(living_pawn))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
-
-/datum/ai_behavior/deliver_food_to_kitten/finish_action(datum/ai_controller/controller, success, target_key, food_key)
- . = ..()
- controller.clear_blackboard_key(target_key)
- controller.clear_blackboard_key(food_key)
diff --git a/code/modules/mob/living/basic/pets/cat/keeki.dm b/code/modules/mob/living/basic/pets/cat/keeki.dm
deleted file mode 100644
index 4c18d22b02a7..000000000000
--- a/code/modules/mob/living/basic/pets/cat/keeki.dm
+++ /dev/null
@@ -1,62 +0,0 @@
-/mob/living/basic/pet/cat/cak
- name = "Keeki"
- desc = "She is a cat made out of cake."
- icon_state = "cak"
- icon_living = "cak"
- icon_dead = "cak_dead"
- health = 50
- maxHealth = 50
- gender = FEMALE
- butcher_results = list(
- /obj/item/organ/internal/brain = 1,
- /obj/item/organ/internal/heart = 1,
- /obj/item/food/cakeslice/birthday = 3,
- /obj/item/food/meat/slab = 2
- )
- response_harm_continuous = "takes a bite out of"
- response_harm_simple = "take a bite out of"
- ai_controller = /datum/ai_controller/basic_controller/cat/cake
- attacked_sound = 'sound/items/eatfood.ogg'
- death_message = "loses her false life and collapses!"
- death_sound = SFX_BODYFALL
- held_state = "cak"
- can_interact_with_stove = TRUE
-
-/mob/living/basic/pet/cat/cak/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/regenerator,\
- regeneration_delay = 1 SECONDS,\
- brute_per_second = 5,\
- outline_colour = COLOR_PINK,\
- )
- var/static/list/on_consume = list(
- /datum/reagent/consumable/nutriment = 0.4,
- /datum/reagent/consumable/nutriment/vitamin = 0.4,
- )
- AddElement(/datum/element/consumable_mob, reagents_list = on_consume)
-
-/mob/living/basic/pet/cat/cak/add_cell_sample()
- return
-
-/mob/living/basic/pet/cat/cak/CheckParts(list/parts)
- . = ..()
- var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents
- if(isnull(candidate?.brainmob?.mind))
- return
- var/datum/mind/candidate_mind = candidate.brainmob.mind
- candidate_mind.transfer_to(src)
- candidate_mind.grab_ghost()
- to_chat(src, "[span_boldbig("You are a cak!")] You're a harmless cat/cake hybrid that everyone loves. People can take bites out of you if they're hungry, but you regenerate health \
- so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \
- free cake to the station!")
- var/default_name = initial(name)
- var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "You are the [name]. Would you like to change your name to something else?", "Name change", default_name, MAX_NAME_LEN)), cap_after_symbols = FALSE)
- if(new_name)
- to_chat(src, span_notice("Your name is now [new_name]!"))
- name = new_name
-
-/mob/living/basic/pet/cat/cak/spin(spintime, speed)
- . = ..()
- for(var/obj/item/food/donut/target in oview(1, src))
- if(!target.is_decorated)
- target.decorate_donut()
diff --git a/code/modules/mob/living/basic/pets/cat/kitten_ai.dm b/code/modules/mob/living/basic/pets/cat/kitten_ai.dm
deleted file mode 100644
index cdb7ac542e1a..000000000000
--- a/code/modules/mob/living/basic/pets/cat/kitten_ai.dm
+++ /dev/null
@@ -1,67 +0,0 @@
-
-/datum/ai_controller/basic_controller/cat/kitten
- blackboard = list(
- BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
- BB_HUNGRY_MEOW = list("mrrp...", "mraw..."),
- BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
- BB_MAX_DISTANCE_TO_FOOD = 2,
- )
-
- planning_subtrees = list(
- /datum/ai_planning_subtree/pet_planning,
- /datum/ai_planning_subtree/target_retaliate,
- /datum/ai_planning_subtree/flee_target,
- /datum/ai_planning_subtree/beg_human,
- /datum/ai_planning_subtree/find_and_hunt_target/find_cat_food/kitten,
- /datum/ai_planning_subtree/random_speech/cats,
- )
-
-//if the food is too far away, point at it or meow. if its near us then go eat it
-
-/datum/ai_planning_subtree/find_and_hunt_target/find_cat_food/kitten
-
-
-/datum/ai_planning_subtree/find_and_hunt_target/find_cat_food/kitten/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
- var/atom/target = controller.blackboard[BB_CAT_FOOD_TARGET]
- if(target && get_dist(target, controller.pawn) > controller.blackboard[BB_MAX_DISTANCE_TO_FOOD])
- controller.queue_behavior(/datum/ai_behavior/beacon_for_food, BB_CAT_FOOD_TARGET, BB_HUNGRY_MEOW)
- return
- return ..()
-
-/datum/ai_behavior/beacon_for_food
- action_cooldown = 5 SECONDS
-
-/datum/ai_behavior/beacon_for_food/perform(seconds_per_tick, datum/ai_controller/controller, target_key, meows_key)
- var/atom/target = controller.blackboard[target_key]
- if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- var/mob/living/living_pawn = controller.pawn
- var/list/meowing_list = controller.blackboard[meows_key]
- if(length(meowing_list))
- living_pawn.say(pick(meowing_list), forced = "ai_controller")
- living_pawn._pointed(target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
-
-/datum/ai_behavior/beacon_for_food/finish_action(datum/ai_controller/controller, success, target_key)
- . = ..()
- controller.clear_blackboard_key(target_key)
-
-/datum/ai_planning_subtree/beg_human
-
-/datum/ai_planning_subtree/beg_human/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
-
- if(controller.blackboard_key_exists(BB_HUMAN_BEG_TARGET))
- controller.queue_behavior(/datum/ai_behavior/beacon_for_food, BB_HUMAN_BEG_TARGET, BB_HUNGRY_MEOW)
- return
-
- controller.queue_behavior(/datum/ai_behavior/find_and_set/human_beg, BB_HUMAN_BEG_TARGET, /mob/living/carbon/human)
-
-/datum/ai_behavior/find_and_set/human_beg/search_tactic(datum/ai_controller/controller, locate_path, search_range)
- var/list/locate_items = controller.blackboard[BB_HUNTABLE_PREY]
- for(var/mob/living/carbon/human/human_target in oview(search_range, controller.pawn))
- if(human_target.stat != CONSCIOUS || isnull(human_target.mind))
- continue
- for (var/obj/item/held_item in human_target.held_items)
- if (is_type_in_typecache(held_item, locate_items))
- return human_target
- return null
diff --git a/code/modules/mob/living/basic/pets/cat/runtime.dm b/code/modules/mob/living/basic/pets/cat/runtime.dm
deleted file mode 100644
index 098fdd9beea1..000000000000
--- a/code/modules/mob/living/basic/pets/cat/runtime.dm
+++ /dev/null
@@ -1,100 +0,0 @@
-#define RUNTIME_SAVE_DATA "data/npc_saves/Runtime.sav"
-#define RUNTIME_JSON_DATA "data/npc_saves/Runtime.json"
-#define MAX_CAT_DEPLOY 50
-
-/mob/living/basic/pet/cat/runtime
- name = "Runtime"
- desc = "GCAT"
- icon_state = "cat"
- icon_living = "cat"
- icon_dead = "cat_dead"
- gender = FEMALE
- gold_core_spawnable = NO_SPAWN
- unique_pet = TRUE
- ///the family we will bring in when a round starts
- var/list/family = null
- ///saved list of kids
- var/list/children = null
- /// have we deployed the cats?
- var/cats_deployed = FALSE
- /// have we saved memory?
- var/memory_saved = FALSE
- ///callback we use to register our family
- var/datum/callback/register_family
-
-/mob/living/basic/pet/cat/runtime/Initialize(mapload)
- . = ..()
- REGISTER_REQUIRED_MAP_ITEM(1, 1)
- register_family = CALLBACK(src, PROC_REF(Write_Memory))
- SSticker.OnRoundend(register_family)
- if(mapload)
- read_memory()
- deploy_the_cats()
-
- if(!prob(5))
- return
- icon_state = "original"
- icon_living = "original"
- icon_dead = "original_dead"
- update_appearance()
-
-
-/mob/living/basic/pet/cat/runtime/add_breeding_component()
- AddComponent(\
- /datum/component/breed,\
- can_breed_with = typecacheof(list(/mob/living/basic/pet/cat)),\
- baby_path = /mob/living/basic/pet/cat/kitten,\
- post_birth = CALLBACK(src, PROC_REF(after_birth)),\
- )
-
-/mob/living/basic/pet/cat/runtime/proc/after_birth(mob/living/baby)
- if(isnull(baby))
- return
- LAZYADD(children, baby)
-
-/mob/living/basic/pet/cat/runtime/proc/read_memory()
- if(fexists(RUNTIME_SAVE_DATA))
- var/savefile/save_data = new(RUNTIME_SAVE_DATA)
- save_data["family"] >> family
- fdel(RUNTIME_SAVE_DATA)
- return
- var/json_file = file(RUNTIME_JSON_DATA)
- if(!fexists(json_file))
- return
- var/list/json_list = json_decode(file2text(json_file))
- family = json_list["family"]
-
-/mob/living/basic/pet/cat/runtime/Destroy()
- LAZYREMOVE(SSticker.round_end_events, register_family)
- register_family = null
- return ..()
-
-/mob/living/basic/pet/cat/runtime/Write_Memory(dead, gibbed)
- . = ..()
- if(!.)
- return
- var/json_file = file(RUNTIME_JSON_DATA)
- var/list/file_data = list()
- if(!dead)
- for(var/mob/living/basic/pet/cat/kitten/kitten in children)
- if(kitten.stat == DEAD)
- continue
- if(kitten.type in family)
- family[kitten.type] += 1
- continue
- family[kitten.type] = 1
- file_data["family"] = family
- fdel(json_file)
- WRITE_FILE(json_file, json_encode(file_data, JSON_PRETTY_PRINT))
-
-/mob/living/basic/pet/cat/runtime/proc/deploy_the_cats()
- cats_deployed = TRUE
- for(var/cat_type in family)
- if(isnull(family[cat_type]))
- return
- for(var/index in 1 to min(family[cat_type], MAX_CAT_DEPLOY))
- new cat_type(loc)
-
-#undef RUNTIME_SAVE_DATA
-#undef RUNTIME_JSON_DATA
-#undef MAX_CAT_DEPLOY
diff --git a/code/modules/mob/living/basic/pets/dog/_dog.dm b/code/modules/mob/living/basic/pets/dog/_dog.dm
index 4d4ae0e7fcae..f82caad827e7 100644
--- a/code/modules/mob/living/basic/pets/dog/_dog.dm
+++ b/code/modules/mob/living/basic/pets/dog/_dog.dm
@@ -44,13 +44,9 @@
/datum/pet_command/point_targeting/fetch,
/datum/pet_command/play_dead,
)
-///icon state of the collar we can wear
- var/collar_icon_state
/mob/living/basic/pet/dog/Initialize(mapload)
. = ..()
- AddElement(/datum/element/wears_collar, collar_icon_state = collar_icon_state)
- ADD_TRAIT(src, TRAIT_WOUND_LICKER, INNATE_TRAIT)
AddElement(/datum/element/pet_bonus, "woofs happily!")
AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW)
AddElement(/datum/element/unfriend_attacker, untamed_reaction = "%SOURCE% fixes %TARGET% with a look of betrayal.")
diff --git a/code/modules/mob/living/basic/pets/dog/strippable_items.dm b/code/modules/mob/living/basic/pets/dog/strippable_items.dm
index c92948e2b6ff..2799ca38b978 100644
--- a/code/modules/mob/living/basic/pets/dog/strippable_items.dm
+++ b/code/modules/mob/living/basic/pets/dog/strippable_items.dm
@@ -38,11 +38,11 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
key = STRIPPABLE_ITEM_PET_COLLAR
/datum/strippable_item/pet_collar/get_item(atom/source)
- var/mob/living/basic/pet_source = source
+ var/mob/living/basic/pet/pet_source = source
if(!istype(pet_source))
return
- return (locate(/obj/item/clothing/neck/petcollar) in source)
+ return pet_source.collar
/datum/strippable_item/pet_collar/try_equip(atom/source, obj/item/equipping, mob/user)
. = ..()
@@ -56,10 +56,18 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
return TRUE
/datum/strippable_item/pet_collar/finish_equip(atom/source, obj/item/equipping, mob/user)
- user.transferItemToLoc(equipping, source)
+ var/mob/living/basic/pet/pet_source = source
+ if(!istype(pet_source))
+ return
+
+ pet_source.add_collar(equipping, user)
/datum/strippable_item/pet_collar/finish_unequip(atom/source, mob/user)
- var/obj/item/clothing/neck/petcollar/collar = locate() in source
+ var/mob/living/basic/pet/pet_source = source
+ if(!istype(pet_source))
+ return
+
+ var/obj/collar = pet_source.remove_collar(user.drop_location())
user.put_in_hands(collar)
/datum/strippable_item/corgi_back
diff --git a/code/modules/mob/living/basic/pets/fox.dm b/code/modules/mob/living/basic/pets/fox.dm
index ff98d2b587f6..7d74a6a36e41 100644
--- a/code/modules/mob/living/basic/pets/fox.dm
+++ b/code/modules/mob/living/basic/pets/fox.dm
@@ -28,18 +28,9 @@
attack_sound = 'sound/weapons/bite.ogg'
attack_vis_effect = ATTACK_EFFECT_BITE
ai_controller = /datum/ai_controller/basic_controller/fox
- ///list of our pet commands we follow
- var/static/list/pet_commands = list(
- /datum/pet_command/idle,
- /datum/pet_command/free,
- /datum/pet_command/follow,
- /datum/pet_command/point_targeting/attack,
- )
/mob/living/basic/pet/fox/Initialize(mapload)
. = ..()
- AddElement(/datum/element/wears_collar)
- AddComponent(/datum/component/obeys_commands, pet_commands)
AddElement(/datum/element/pet_bonus, "pants and yaps happily!")
AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_CLAW)
AddElement(/datum/element/tiny_mob_hunter, MOB_SIZE_SMALL)
@@ -49,14 +40,12 @@
blackboard = list(
BB_ALWAYS_IGNORE_FACTION = TRUE,
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/of_size/ours_or_smaller,
- BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
)
ai_movement = /datum/ai_movement/basic_avoidance
idle_behavior = /datum/idle_behavior/idle_random_walk
planning_subtrees = list(
- /datum/ai_planning_subtree/pet_planning,
/datum/ai_planning_subtree/target_retaliate/to_flee,
/datum/ai_planning_subtree/flee_target/from_flee_key,
/datum/ai_planning_subtree/simple_find_target/not_while_observed,
diff --git a/code/modules/mob/living/basic/pets/parrot/_parrot.dm b/code/modules/mob/living/basic/pets/parrot/_parrot.dm
index c50388ea9726..0e4914439824 100644
--- a/code/modules/mob/living/basic/pets/parrot/_parrot.dm
+++ b/code/modules/mob/living/basic/pets/parrot/_parrot.dm
@@ -76,12 +76,6 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
var/static/list/edibles = list(
/obj/item/food/cracker,
)
- ///list of commands we follow
- var/static/list/pet_commands = list(
- /datum/pet_command/idle,
- /datum/pet_command/free,
- /datum/pet_command/follow,
- )
/// Tracks the times when we send a phrase through either being pet or attack to ensure it's not abused to flood
COOLDOWN_DECLARE(forced_speech_cooldown)
@@ -97,8 +91,14 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
AddElement(/datum/element/strippable, GLOB.strippable_parrot_items)
AddElement(/datum/element/simple_flying)
AddComponent(/datum/component/listen_and_repeat, desired_phrases = get_static_list_of_phrases(), blackboard_key = BB_PARROT_REPEAT_STRING)
- AddComponent(/datum/component/tameable, food_types = edibles, tame_chance = 100, bonus_tame_chance = 0)
- AddComponent(/datum/component/obeys_commands, pet_commands)
+ AddComponent(\
+ /datum/component/tameable,\
+ food_types = edibles,\
+ tame_chance = 100,\
+ bonus_tame_chance = 0,\
+ after_tame = CALLBACK(src, PROC_REF(tamed)),\
+ )
+
RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attacking))
RegisterSignal(src, COMSIG_MOB_CLICKON, PROC_REF(on_click))
RegisterSignal(src, COMSIG_ATOM_ATTACKBY_SECONDARY, PROC_REF(on_attacked)) // this means we could have a peaceful interaction, like getting a cracker
diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/_parrot_controller.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/_parrot_controller.dm
index 139cb8199228..987e50774c3f 100644
--- a/code/modules/mob/living/basic/pets/parrot/parrot_ai/_parrot_controller.dm
+++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/_parrot_controller.dm
@@ -1,7 +1,6 @@
/datum/ai_controller/basic_controller/parrot
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
- BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
BB_HOARD_LOCATION_RANGE = 9,
)
@@ -10,12 +9,11 @@
idle_behavior = /datum/idle_behavior/idle_random_walk/parrot
planning_subtrees = list(
- /datum/ai_planning_subtree/parrot_as_in_repeat, // always get a witty oneliner in when you can
- /datum/ai_planning_subtree/pet_planning,
/datum/ai_planning_subtree/target_retaliate,
/datum/ai_planning_subtree/perch_on_target,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
/datum/ai_planning_subtree/hoard_items,
+ /datum/ai_planning_subtree/parrot_as_in_repeat, // always get a witty oneliner in when you can
)
/datum/idle_behavior/idle_random_walk/parrot
diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_perching.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_perching.dm
index b5b34e30cad5..ccc3ef92f6ea 100644
--- a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_perching.dm
+++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_perching.dm
@@ -47,21 +47,25 @@
set_movement_target(controller, target)
/datum/ai_behavior/perch_on_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
var/atom/target = controller.blackboard[target_key]
if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
var/mob/living/basic/parrot/living_pawn = controller.pawn
if(!ishuman(target))
living_pawn.start_perching(target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
+ return
if(!check_human_conditions(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
living_pawn.start_perching(target)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/perch_on_target/proc/check_human_conditions(mob/living/living_human)
if(living_human.stat == DEAD || LAZYLEN(living_human.buckled_mobs) >= living_human.max_buckled_mobs)
diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm
index 493d67cbca8c..d1488a60b3bb 100644
--- a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm
+++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm
@@ -45,6 +45,6 @@
speaking_pawn.say(modified_speech, forced = "AI Controller")
if(speech_sound)
playsound(speaking_pawn, speech_sound, 80, vary = TRUE)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
#undef HAS_CHANNEL_PREFIX
diff --git a/code/modules/mob/living/basic/pets/penguin.dm b/code/modules/mob/living/basic/pets/penguin.dm
index b9b394573bd4..671c2cf30c13 100644
--- a/code/modules/mob/living/basic/pets/penguin.dm
+++ b/code/modules/mob/living/basic/pets/penguin.dm
@@ -20,7 +20,6 @@
/mob/living/basic/pet/penguin/Initialize(mapload)
. = ..()
- AddElement(/datum/element/wears_collar)
AddElement(/datum/element/ai_retaliate)
AddElement(/datum/element/ai_flee_while_injured)
AddElement(/datum/element/pet_bonus, "honks happily!")
diff --git a/code/modules/mob/living/basic/pets/pet.dm b/code/modules/mob/living/basic/pets/pet.dm
index 071cdfc146ba..6940513250f8 100644
--- a/code/modules/mob/living/basic/pets/pet.dm
+++ b/code/modules/mob/living/basic/pets/pet.dm
@@ -3,9 +3,132 @@
mob_size = MOB_SIZE_SMALL
mob_biotypes = MOB_ORGANIC|MOB_BEAST
blood_volume = BLOOD_VOLUME_NORMAL
+
/// if the mob is protected from being renamed by collars.
var/unique_pet = FALSE
+ /// If the mob has collar sprites, this is the base of the icon states.
+ var/collar_icon_state = null
+ /// We have a seperate _rest collar icon state when the pet is resting.
+ var/has_collar_resting_icon_state = FALSE
+
+ /// Our collar
+ var/obj/item/clothing/neck/petcollar/collar
+
+/mob/living/basic/pet/Initialize(mapload)
+ . = ..()
+
+ /// Can set the collar var beforehand to start the pet with a collar.
+ if(collar)
+ collar = new(src)
+
+ update_icon(UPDATE_OVERLAYS)
+
+/mob/living/basic/pet/Destroy()
+ . = ..()
+
+ QDEL_NULL(collar)
+
+/mob/living/basic/pet/attackby(obj/item/thing, mob/user, params)
+ if(istype(thing, /obj/item/clothing/neck/petcollar) && !collar)
+ add_collar(thing, user)
+ return TRUE
+
+ if(istype(thing, /obj/item/newspaper) && !stat)
+ user.visible_message(span_notice("[user] baps [name] on the nose with the rolled up [thing]."))
+ dance_rotate(src)
+ return TRUE
+
+ return ..()
+
+/mob/living/basic/pet/update_overlays()
+ . = ..()
+
+ if(!collar || !collar_icon_state)
+ return
+
+ // Determine which status tag to add to the middle of the icon state.
+ var/dead_tag = (stat == DEAD || HAS_TRAIT(src, TRAIT_FAKEDEATH)) ? "_dead" : null
+ var/rest_tag = has_collar_resting_icon_state && resting ? "_rest" : null
+ var/stat_tag = dead_tag || rest_tag || ""
+
+ . += mutable_appearance(icon, "[collar_icon_state][stat_tag]collar")
+ . += mutable_appearance(icon, "[collar_icon_state][stat_tag]tag")
+
+/mob/living/basic/pet/gib(no_brain, no_organs, no_bodyparts, safe_gib = TRUE)
+ remove_collar(drop_location(), update_visuals = FALSE)
+ return ..()
+
+/mob/living/basic/pet/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE)
+ . = ..()
+ if(!.)
+ return
+
+ update_icon(UPDATE_OVERLAYS)
/mob/living/basic/pet/death(gibbed)
. = ..()
add_memory_in_range(src, 7, /datum/memory/pet_died, deuteragonist = src) //Protagonist is the person memorizing it
+
+/mob/living/basic/pet/handle_atom_del(atom/deleting_atom)
+ . = ..()
+
+ if(deleting_atom != collar)
+ return
+
+ collar = null
+
+ if(QDELETED(src))
+ return
+
+ update_icon(UPDATE_OVERLAYS)
+
+/mob/living/basic/pet/update_stat()
+ . = ..()
+
+ update_icon(UPDATE_OVERLAYS)
+
+/mob/living/basic/pet/set_resting(new_resting, silent, instant)
+ . = ..()
+
+ if(!has_collar_resting_icon_state)
+ return
+
+ update_icon(UPDATE_OVERLAYS)
+
+/**
+ * Add a collar to the pet.
+ *
+ * Arguments:
+ * * new_collar - the collar.
+ * * user - the user that did it.
+ */
+/mob/living/basic/pet/proc/add_collar(obj/item/clothing/neck/petcollar/new_collar, mob/user)
+ if(QDELETED(new_collar) || collar)
+ return
+ if(!user.transferItemToLoc(new_collar, src))
+ return
+
+ collar = new_collar
+ if(collar_icon_state)
+ update_icon(UPDATE_OVERLAYS)
+
+ to_chat(user, span_notice("You put [new_collar] around [src]'s neck."))
+ if(new_collar.tagname && !unique_pet)
+ fully_replace_character_name(null, "\proper [new_collar.tagname]")
+
+/**
+ * Remove the collar from the pet.
+ */
+/mob/living/basic/pet/proc/remove_collar(atom/new_loc, update_visuals = TRUE)
+ if(!collar)
+ return
+
+ var/obj/old_collar = collar
+
+ collar.forceMove(new_loc)
+ collar = null
+
+ if(collar_icon_state && update_visuals)
+ update_icon(UPDATE_OVERLAYS)
+
+ return old_collar
diff --git a/code/modules/mob/living/basic/ruin_defender/skeleton.dm b/code/modules/mob/living/basic/ruin_defender/skeleton.dm
index dc51de3a14e8..c8de723b9513 100644
--- a/code/modules/mob/living/basic/ruin_defender/skeleton.dm
+++ b/code/modules/mob/living/basic/ruin_defender/skeleton.dm
@@ -161,7 +161,7 @@
/// Skeletons mostly just beat people to death, but they'll also find and drink milk.
/datum/ai_controller/basic_controller/skeleton
blackboard = list(
- BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
BB_EMOTE_KEY = "rattles",
BB_EMOTE_CHANCE = 20,
diff --git a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm
index 4aa18760120e..8e33d13dc79c 100644
--- a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm
+++ b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm
@@ -128,11 +128,6 @@
brute_per_second = 5,\
outline_colour = COLOR_YELLOW,\
)
- var/static/list/on_consume = list(
- /datum/reagent/consumable/nutriment = 1,
- /datum/reagent/consumable/nutriment/vitamin = 0.1,
- )
- AddElement(/datum/element/consumable_mob, reagents_list = on_consume)
/mob/living/basic/bear/butter/attack_hand(mob/living/user, list/modifiers) //Borrowed code from Cak, feeds people if they hit you. More nutriment but less vitamin to represent BUTTER.
. = ..()
diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm
index 71017bd2207a..9e767bab3af1 100644
--- a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm
+++ b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm
@@ -21,7 +21,8 @@
if (QDELETED(using_action))
return ..()
if (!controller.blackboard[BB_MAGICARP_SPELL_SPECIAL_TARGETING] && using_action.IsAvailable())
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE)
+ return
return ..()
/**
diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_migration.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_migration.dm
index 9458877af7fe..27fdb25ee22b 100644
--- a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_migration.dm
+++ b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_migration.dm
@@ -47,8 +47,10 @@
blackboard_points -= migration_point
if(get_dist(controller.pawn, migration_point) > CARP_DESTINATION_SEARCH_RANGE)
controller.set_blackboard_key(target_key, migration_point)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = TRUE)
+ return
+
+ finish_action(controller, succeeded = FALSE)
#undef CARP_DESTINATION_SEARCH_RANGE
#undef CARP_PORTAL_SEARCH_RANGE
diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm
index 84b96ae3ce40..fc6997896b0d 100644
--- a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm
+++ b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm
@@ -52,19 +52,21 @@
return controller.blackboard[ability_key] && controller.blackboard[target_key]
/datum/ai_behavior/make_carp_rift/perform(seconds_per_tick, datum/ai_controller/controller, ability_key, target_key)
+ . = ..()
var/datum/action/cooldown/mob_cooldown/lesser_carp_rift/ability = controller.blackboard[ability_key]
var/atom/target = controller.blackboard[target_key]
if (!validate_target(controller, target, ability))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, ability_key, target_key)
+ return
var/turf/target_destination = find_target_turf(controller, target, ability)
if (!target_destination)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, ability_key, target_key)
+ return
- if(ability.InterceptClickOn(controller.pawn, null, target_destination))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ var/result = ability.InterceptClickOn(controller.pawn, null, target_destination)
+ finish_action(controller, result, ability_key, target_key)
/// Return true if your target is valid for the action
/datum/ai_behavior/make_carp_rift/proc/validate_target(datum/ai_controller/controller, atom/target, datum/action/cooldown/mob_cooldown/lesser_carp_rift/ability)
diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm
index 5554a9962ab2..0befb20987c0 100644
--- a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm
+++ b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm
@@ -10,7 +10,7 @@
/datum/ai_controller/basic_controller/carp
blackboard = list(
BB_BASIC_MOB_STOP_FLEEING = TRUE,
- BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
)
@@ -21,12 +21,12 @@
/datum/ai_planning_subtree/simple_find_nearest_target_to_flee,
/datum/ai_planning_subtree/make_carp_rift/panic_teleport,
/datum/ai_planning_subtree/flee_target,
+ /datum/ai_planning_subtree/find_food,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/attack_obstacle_in_path/carp,
/datum/ai_planning_subtree/shortcut_to_target_through_carp_rift,
/datum/ai_planning_subtree/make_carp_rift/aggressive_teleport,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
- /datum/ai_planning_subtree/find_food,
/datum/ai_planning_subtree/carp_migration,
)
@@ -63,6 +63,7 @@
/datum/ai_planning_subtree/simple_find_nearest_target_to_flee,
/datum/ai_planning_subtree/make_carp_rift/panic_teleport,
/datum/ai_planning_subtree/flee_target,
+ /datum/ai_planning_subtree/find_food,
/datum/ai_planning_subtree/find_nearest_magicarp_spell_target,
/datum/ai_planning_subtree/targeted_mob_ability/magicarp,
/datum/ai_planning_subtree/simple_find_target,
@@ -70,7 +71,6 @@
/datum/ai_planning_subtree/shortcut_to_target_through_carp_rift,
/datum/ai_planning_subtree/make_carp_rift/aggressive_teleport,
/datum/ai_planning_subtree/basic_melee_attack_subtree/magicarp,
- /datum/ai_planning_subtree/find_food,
/datum/ai_planning_subtree/carp_migration,
)
@@ -90,10 +90,10 @@
/datum/ai_planning_subtree/simple_find_nearest_target_to_flee,
/datum/ai_planning_subtree/make_carp_rift/panic_teleport,
/datum/ai_planning_subtree/flee_target,
+ /datum/ai_planning_subtree/find_food,
/datum/ai_planning_subtree/attack_obstacle_in_path/carp,
/datum/ai_planning_subtree/shortcut_to_target_through_carp_rift,
/datum/ai_planning_subtree/make_carp_rift/aggressive_teleport,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
- /datum/ai_planning_subtree/find_food,
/datum/ai_planning_subtree/carp_migration,
)
diff --git a/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm b/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm
index 2bd6da45542e..134883c08864 100644
--- a/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm
+++ b/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm
@@ -147,7 +147,7 @@
/// We do our own special thing on death, which is to spawn a kitten.
/mob/living/basic/demon/slaughter/laughter/proc/on_death()
SIGNAL_HANDLER
- var/mob/living/basic/pet/cat/kitten/kitty = new(drop_location())
+ var/mob/living/simple_animal/pet/cat/kitten/kitty = new(drop_location())
kitty.name = "Laughter"
/mob/living/basic/demon/slaughter/laughter/ex_act(severity)
diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm
index 5051f8153714..57ea39c94dd5 100644
--- a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm
+++ b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm
@@ -1,11 +1,14 @@
/datum/ai_behavior/find_the_blind
/datum/ai_behavior/find_the_blind/perform(seconds_per_tick, datum/ai_controller/controller, blind_key, threshold_key)
+ . = ..()
+
var/mob/living_pawn = controller.pawn
var/list/blind_list = list()
var/eye_damage_threshold = controller.blackboard[threshold_key]
if(!eye_damage_threshold)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
for(var/mob/living/carbon/blind in oview(9, living_pawn))
var/obj/item/organ/internal/eyes/eyes = blind.get_organ_slot(ORGAN_SLOT_EYES)
if(isnull(eyes))
@@ -15,10 +18,11 @@
blind_list += blind
if(!length(blind_list))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
controller.set_blackboard_key(blind_key, pick(blind_list))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/heal_eye_damage
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH
@@ -31,16 +35,19 @@
set_movement_target(controller, target)
/datum/ai_behavior/heal_eye_damage/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
+
var/mob/living/carbon/target = controller.blackboard[target_key]
var/mob/living/living_pawn = controller.pawn
if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
var/obj/item/organ/internal/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES)
var/datum/callback/callback = CALLBACK(living_pawn, TYPE_PROC_REF(/mob/living/basic/eyeball, heal_eye_damage), target, eyes)
callback.Invoke()
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/heal_eye_damage/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
@@ -70,19 +77,18 @@
var/mob/living/target = controller.blackboard[target_key]
if(QDELETED(ability) || QDELETED(target))
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, ability_key, target_key)
+ return
var/direction_to_compare = get_dir(target, controller.pawn)
var/target_direction = target.dir
if(direction_to_compare != target_direction)
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, ability_key, target_key)
+ return
var/result = ability.InterceptClickOn(controller.pawn, null, target)
- if(result == TRUE)
- return AI_BEHAVIOR_INSTANT
- else
- return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
+ finish_action(controller, result, ability_key, target_key)
-/datum/ai_behavior/hunt_target/interact_with_target/carrot
+/datum/ai_behavior/hunt_target/unarmed_attack_target/carrot
hunt_cooldown = 2 SECONDS
always_reset_target = TRUE
diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm
index 17b260d03ed7..29ea1dfc352e 100644
--- a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm
+++ b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm
@@ -47,6 +47,6 @@
/datum/ai_planning_subtree/find_and_hunt_target/carrot
target_key = BB_LOW_PRIORITY_HUNTING_TARGET
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/carrot
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/carrot
hunt_targets = list(/obj/item/food/grown/carrot)
hunt_range = 6
diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm
index 7db7a8913fa3..28cffa4ed8e3 100644
--- a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm
+++ b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm
@@ -30,16 +30,19 @@
/datum/ai_behavior/relay_message/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
+
var/mob/living/target = controller.blackboard[target_key]
var/mob/living/living_pawn = controller.pawn
if(QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
var/message_relayed = ""
for(var/i in 1 to length_of_message)
message_relayed += prob(50) ? "1" : "0"
living_pawn.say(message_relayed, forced = "AI Controller")
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
/datum/ai_behavior/relay_message/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
diff --git a/code/modules/mob/living/basic/space_fauna/mushroom.dm b/code/modules/mob/living/basic/space_fauna/mushroom.dm
index 4abc95521242..ed6741bd082c 100644
--- a/code/modules/mob/living/basic/space_fauna/mushroom.dm
+++ b/code/modules/mob/living/basic/space_fauna/mushroom.dm
@@ -78,10 +78,15 @@
/datum/ai_planning_subtree/find_and_hunt_target/mushroom_food
target_key = BB_LOW_PRIORITY_HUNTING_TARGET
- hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/reset_target
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/mushroom_food
hunt_targets = list(/obj/item/food/grown/mushroom)
hunt_range = 6
+
+/datum/ai_behavior/hunt_target/unarmed_attack_target/mushroom_food
+ hunt_cooldown = 15 SECONDS
+ always_reset_target = TRUE
+
/mob/living/basic/mushroom/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers)
. = ..()
if(!.)
diff --git a/code/modules/mob/living/basic/space_fauna/snake/snake.dm b/code/modules/mob/living/basic/space_fauna/snake/snake.dm
index 1999850ee51d..135402a5b441 100644
--- a/code/modules/mob/living/basic/space_fauna/snake/snake.dm
+++ b/code/modules/mob/living/basic/space_fauna/snake/snake.dm
@@ -71,7 +71,7 @@
/// Snakes are primarily concerned with getting those tasty, tasty mice, but aren't afraid to strike back at those who attack them
/datum/ai_controller/basic_controller/snake
blackboard = list(
- BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends/allow_items,
)
ai_traits = STOP_MOVING_WHEN_PULLED
@@ -80,7 +80,7 @@
planning_subtrees = list(
/datum/ai_planning_subtree/target_retaliate,
- /datum/ai_planning_subtree/basic_melee_attack_subtree,
/datum/ai_planning_subtree/find_food,
+ /datum/ai_planning_subtree/basic_melee_attack_subtree,
/datum/ai_planning_subtree/random_speech/snake,
)
diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_ai.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_ai.dm
index 852859b42845..25fcb3b7a4cf 100644
--- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_ai.dm
+++ b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_ai.dm
@@ -44,13 +44,11 @@
/datum/ai_controller/basic_controller/giant_spider/pest
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/of_size/ours_or_smaller, // Hunt mobs our size
- BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic/of_size/larger, // Run away from mobs bigger than we are
)
idle_behavior = /datum/idle_behavior/idle_random_walk
planning_subtrees = list(
- /datum/ai_planning_subtree/pet_planning,
/datum/ai_planning_subtree/target_retaliate/to_flee,
/datum/ai_planning_subtree/flee_target/from_flee_key,
/datum/ai_planning_subtree/simple_find_target,
@@ -79,14 +77,15 @@
var/mob/living/spider = controller.pawn
var/atom/current_target = controller.blackboard[target_key]
if (current_target && !(locate(/obj/structure/spider/stickyweb) in current_target))
- // Already got a target
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE) // Already got a target
+ return
controller.clear_blackboard_key(target_key)
var/turf/our_turf = get_turf(spider)
if (is_valid_web_turf(our_turf))
controller.set_blackboard_key(target_key, our_turf)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, succeeded = TRUE)
+ return
var/list/turfs_by_range = list()
for (var/i in 1 to scan_range)
@@ -102,10 +101,11 @@
final_turfs = turfs_by_range[turf_list]
break
if (!length(final_turfs))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = FALSE)
+ return
controller.set_blackboard_key(target_key, pick(final_turfs))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, succeeded = TRUE)
/datum/ai_behavior/find_unwebbed_turf/proc/is_valid_web_turf(turf/target_turf, mob/living/spider)
if (locate(/obj/structure/spider/stickyweb) in target_turf)
@@ -145,10 +145,9 @@
return ..()
/datum/ai_behavior/spin_web/perform(seconds_per_tick, datum/ai_controller/controller, action_key, target_key)
+ . = ..()
var/datum/action/cooldown/web_action = controller.blackboard[action_key]
- if(web_action?.Trigger())
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, succeeded = web_action?.Trigger(), action_key = action_key, target_key = target_key)
/datum/ai_behavior/spin_web/finish_action(datum/ai_controller/controller, succeeded, action_key, target_key)
controller.clear_blackboard_key(target_key)
diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider.dm b/code/modules/mob/living/basic/space_fauna/spider/spider.dm
index b4c0cb59547f..e1dc77aad00a 100644
--- a/code/modules/mob/living/basic/space_fauna/spider/spider.dm
+++ b/code/modules/mob/living/basic/space_fauna/spider/spider.dm
@@ -167,17 +167,10 @@
response_harm_simple = "splat"
ai_controller = /datum/ai_controller/basic_controller/giant_spider/pest
apply_spider_antag = FALSE
-///list of pet commands we follow
- var/static/list/pet_commands = list(
- /datum/pet_command/idle,
- /datum/pet_command/free,
- /datum/pet_command/follow,
- )
/mob/living/basic/spider/maintenance/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT)
AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web)
AddElement(/datum/element/ai_retaliate)
- AddComponent(/datum/component/obeys_commands, pet_commands)
AddElement(/datum/element/tiny_mob_hunter)
diff --git a/code/modules/mob/living/basic/trader/trader_ai.dm b/code/modules/mob/living/basic/trader/trader_ai.dm
index 83a298a22935..5f447ab3229a 100644
--- a/code/modules/mob/living/basic/trader/trader_ai.dm
+++ b/code/modules/mob/living/basic/trader/trader_ai.dm
@@ -61,16 +61,19 @@
return !QDELETED(target)
/datum/ai_behavior/setup_shop/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
+
//We lost track of our costumer or our ability, abort
if(!controller.blackboard_key_exists(target_key) || !controller.blackboard_key_exists(BB_SETUP_SHOP))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE, target_key)
+ return
var/datum/action/setup_shop/shop = controller.blackboard[BB_SETUP_SHOP]
shop.Trigger()
controller.clear_blackboard_key(BB_FIRST_CUSTOMER)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE, target_key)
/datum/idle_behavior/idle_random_walk/not_while_on_target/trader
target_key = BB_SHOP_SPOT
diff --git a/code/modules/mob/living/basic/vermin/lizard.dm b/code/modules/mob/living/basic/vermin/lizard.dm
index c3a3ac908171..350fca5c0046 100644
--- a/code/modules/mob/living/basic/vermin/lizard.dm
+++ b/code/modules/mob/living/basic/vermin/lizard.dm
@@ -50,7 +50,7 @@
/datum/ai_controller/basic_controller/lizard
blackboard = list(
- BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
)
ai_traits = STOP_MOVING_WHEN_PULLED
@@ -58,6 +58,7 @@
idle_behavior = /datum/idle_behavior/idle_random_walk
planning_subtrees = list(
/datum/ai_planning_subtree/find_food,
+ /datum/ai_planning_subtree/basic_melee_attack_subtree,
/datum/ai_planning_subtree/random_speech/lizard,
)
diff --git a/code/modules/mob/living/basic/vermin/mothroach/mothroach.dm b/code/modules/mob/living/basic/vermin/mothroach.dm
similarity index 81%
rename from code/modules/mob/living/basic/vermin/mothroach/mothroach.dm
rename to code/modules/mob/living/basic/vermin/mothroach.dm
index b805765aff2e..15f82d38f852 100644
--- a/code/modules/mob/living/basic/vermin/mothroach/mothroach.dm
+++ b/code/modules/mob/living/basic/vermin/mothroach.dm
@@ -33,20 +33,9 @@
faction = list(FACTION_NEUTRAL)
ai_controller = /datum/ai_controller/basic_controller/mothroach
- ///list of pet commands we follow
- var/static/list/pet_commands = list(
- /datum/pet_command/idle,
- /datum/pet_command/free,
- /datum/pet_command/follow,
- )
/mob/living/basic/mothroach/Initialize(mapload)
. = ..()
- var/static/list/food_types = list(/obj/item/clothing)
- AddElement(/datum/element/basic_eating, food_types = food_types)
- AddComponent(/datum/component/obeys_commands, pet_commands)
- ai_controller.set_blackboard_key(BB_BASIC_FOODS, typecacheof(food_types))
- AddElement(/datum/element/ai_retaliate)
AddElement(/datum/element/pet_bonus, "squeaks happily!")
add_verb(src, /mob/living/proc/toggle_resting)
ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT)
@@ -74,3 +63,13 @@
return
else
playsound(loc, 'sound/voice/moth/scream_moth.ogg', 50, TRUE)
+
+/datum/ai_controller/basic_controller/mothroach
+ blackboard = list()
+
+ ai_traits = STOP_MOVING_WHEN_PULLED
+ ai_movement = /datum/ai_movement/basic_avoidance
+ idle_behavior = /datum/idle_behavior/idle_random_walk
+ planning_subtrees = list(
+ /datum/ai_planning_subtree/random_speech/mothroach,
+ )
diff --git a/code/modules/mob/living/basic/vermin/mothroach/mothroach_ai.dm b/code/modules/mob/living/basic/vermin/mothroach/mothroach_ai.dm
deleted file mode 100644
index c9e8558ec5c4..000000000000
--- a/code/modules/mob/living/basic/vermin/mothroach/mothroach_ai.dm
+++ /dev/null
@@ -1,30 +0,0 @@
-/datum/ai_controller/basic_controller/mothroach
- blackboard = list(
- BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
- BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
- BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
- BB_EAT_FOOD_COOLDOWN = 1 MINUTES,
- )
-
- ai_traits = STOP_MOVING_WHEN_PULLED
- ai_movement = /datum/ai_movement/basic_avoidance
- idle_behavior = /datum/idle_behavior/idle_random_walk
- planning_subtrees = list(
- /datum/ai_planning_subtree/pet_planning,
- /datum/ai_planning_subtree/find_food/mothroach,
- /datum/ai_planning_subtree/target_retaliate/to_flee,
- /datum/ai_planning_subtree/flee_target/from_flee_key,
- /datum/ai_planning_subtree/random_speech/mothroach,
- )
-
-/datum/ai_planning_subtree/find_food/mothroach
- finding_behavior = /datum/ai_behavior/find_and_set/in_list/mothroach_food
-
-/datum/ai_behavior/find_and_set/in_list/mothroach_food
-
-/datum/ai_behavior/find_and_set/in_list/mothroach_food/search_tactic(datum/ai_controller/controller, locate_paths, search_range)
- var/list/found = typecache_filter_list(oview(search_range, controller.pawn), locate_paths)
- var/mob/living/living_pawn = controller.pawn
- found -= living_pawn.loc
- if(length(found))
- return pick(found)
diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm
index 01371c16e9b4..758d8586dd71 100644
--- a/code/modules/mob/living/basic/vermin/mouse.dm
+++ b/code/modules/mob/living/basic/vermin/mouse.dm
@@ -40,12 +40,6 @@
var/contributes_to_ratcap = TRUE
/// Probability that, if we successfully bite a shocked cable, that we will die to it.
var/cable_zap_prob = 85
- ///list of pet commands we follow
- var/static/list/pet_commands = list(
- /datum/pet_command/idle,
- /datum/pet_command/free,
- /datum/pet_command/follow,
- )
var/chooses_bodycolor = TRUE
@@ -74,7 +68,6 @@
var/static/list/loc_connections = list(
COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
- AddComponent(/datum/component/obeys_commands, pet_commands)
AddElement(/datum/element/connect_loc, loc_connections)
make_tameable()
AddComponent(/datum/component/swarming, 16, 16) //max_x, max_y
@@ -422,10 +415,9 @@
/// The mouse AI controller
/datum/ai_controller/basic_controller/mouse
blackboard = list( // Always cowardly
- BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, // Use this to find people to run away from
BB_CURRENT_HUNTING_TARGET = null, // cheese
BB_LOW_PRIORITY_HUNTING_TARGET = null, // cable
- BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, // Use this to find people to run away from
BB_BASIC_MOB_FLEE_DISTANCE = 3,
)
@@ -433,7 +425,6 @@
ai_movement = /datum/ai_movement/basic_avoidance
idle_behavior = /datum/idle_behavior/idle_random_walk
planning_subtrees = list(
- /datum/ai_planning_subtree/pet_planning,
// Top priority is to look for and execute hunts for cheese even if someone is looking at us
/datum/ai_planning_subtree/find_and_hunt_target/look_for_cheese,
// Next priority is see if anyone is looking at us
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 34e753fedb22..8be5d9a8d0b6 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -222,13 +222,6 @@
return FALSE
-/mob/living/carbon/attack_animal(mob/living/simple_animal/user, list/modifiers)
- if (!user.combat_mode)
- for (var/datum/wound/wounds as anything in all_wounds)
- if (wounds.try_handling(user))
- return TRUE
-
- return ..()
/mob/living/carbon/attack_paw(mob/living/carbon/human/user, list/modifiers)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index e9d11edfd973..b8e08a82a286 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -66,6 +66,17 @@
return ..()
+/mob/living/carbon/human/ZImpactDamage(turf/T, levels)
+ if(stat != CONSCIOUS || levels > 1) // you're not The One
+ return ..()
+ var/obj/item/organ/external/wings/gliders = get_organ_by_type(/obj/item/organ/external/wings)
+ if(HAS_TRAIT(src, TRAIT_FREERUNNING) || gliders?.can_soften_fall()) // the power of parkour or wings allows falling short distances unscathed
+ visible_message(span_danger("[src] makes a hard landing on [T] but remains unharmed from the fall."), \
+ span_userdanger("You brace for the fall. You make a hard landing on [T] but remain unharmed."))
+ Knockdown(levels * 40)
+ return
+ return ..()
+
/mob/living/carbon/human/prepare_data_huds()
//Update med hud images...
..()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index e1489b00f981..7eddf9ddce70 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -50,74 +50,20 @@
QDEL_LIST(surgeries)
return ..()
-/mob/living/onZImpact(turf/impacted_turf, levels, impact_flags = NONE)
- if(!isgroundlessturf(impacted_turf))
- impact_flags |= ZImpactDamage(impacted_turf, levels)
-
+/mob/living/onZImpact(turf/T, levels, message = TRUE)
+ if(!isgroundlessturf(T))
+ ZImpactDamage(T, levels)
+ message = FALSE
return ..()
-/**
- * Called when this mob is receiving damage from falling
- *
- * * impacted_turf - the turf we are falling onto
- * * levels - the number of levels we are falling
- */
-/mob/living/proc/ZImpactDamage(turf/impacted_turf, levels)
- . = SEND_SIGNAL(src, COMSIG_LIVING_Z_IMPACT, levels, impacted_turf)
- if(. & ZIMPACT_CANCEL_DAMAGE)
- return .
-
- // If you are incapped, you probably can't brace yourself
- var/can_help_themselves = !incapacitated(IGNORE_RESTRAINTS)
- if(levels <= 1 && can_help_themselves)
- var/obj/item/organ/external/wings/gliders = get_organ_by_type(/obj/item/organ/external/wings)
- if(HAS_TRAIT(src, TRAIT_FREERUNNING) || gliders?.can_soften_fall()) // the power of parkour or wings allows falling short distances unscathed
- visible_message(
- span_notice("[src] makes a hard landing on [impacted_turf] but remains unharmed from the fall."),
- span_notice("You brace for the fall. You make a hard landing on [impacted_turf], but remain unharmed."),
- )
- Knockdown(levels * 4 SECONDS)
- return . | ZIMPACT_NO_MESSAGE
-
- var/incoming_damage = (levels * 5) ** 1.5
- // Smaller mobs with catlike grace can ignore damage (EG: cats)
- var/small_surface_area = mob_size <= MOB_SIZE_SMALL
- var/skip_knockdown = FALSE
- if(HAS_TRAIT(src, TRAIT_CATLIKE_GRACE) && (small_surface_area || usable_legs >= 2) && body_position == STANDING_UP && can_help_themselves)
- . |= ZIMPACT_NO_MESSAGE|ZIMPACT_NO_SPIN
- skip_knockdown = TRUE
- if(small_surface_area)
- visible_message(
- span_notice("[src] makes a hard landing on [impacted_turf], but lands safely on [p_their()] feet!"),
- span_notice("You make a hard landing on [impacted_turf], but land safely on your feet!"),
- )
- new /obj/effect/temp_visual/mook_dust/small(impacted_turf)
- return .
-
- incoming_damage *= 1.66
- add_movespeed_modifier(/datum/movespeed_modifier/landed_on_feet)
- addtimer(CALLBACK(src, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/landed_on_feet), levels * 2 SECONDS)
- visible_message(
- span_danger("[src] makes a hard landing on [impacted_turf], landing on [p_their()] feet painfully!"),
- span_userdanger("You make a hard landing on [impacted_turf], and instinctively land on your feet - painfully!"),
- )
- new /obj/effect/temp_visual/mook_dust(impacted_turf)
-
- if(body_position == STANDING_UP)
- var/damage_for_each_leg = round(incoming_damage / 2)
- apply_damage(damage_for_each_leg, BRUTE, BODY_ZONE_L_LEG, wound_bonus = -2.5 * levels)
- apply_damage(damage_for_each_leg, BRUTE, BODY_ZONE_R_LEG, wound_bonus = -2.5 * levels)
- else
- apply_damage(incoming_damage, BRUTE, spread_damage = TRUE)
-
- if(!skip_knockdown)
- Knockdown(levels * 5 SECONDS)
- return .
-
-/// Modifier for mobs landing on their feet after a fall
-/datum/movespeed_modifier/landed_on_feet
- movetypes = GROUND|UPSIDE_DOWN
- multiplicative_slowdown = CRAWLING_ADD_SLOWDOWN / 2
+/mob/living/proc/ZImpactDamage(turf/T, levels)
+ SEND_SIGNAL(T, COMSIG_TURF_MOB_FALL, src)
+ if(SEND_SIGNAL(src, COMSIG_LIVING_Z_IMPACT, levels, T) & NO_Z_IMPACT_DAMAGE)
+ return
+ visible_message(span_danger("[src] crashes into [T] with a sickening noise!"), \
+ span_userdanger("You crash into [T] with a sickening noise!"))
+ adjustBruteLoss((levels * 5) ** 1.5)
+ Knockdown(levels * 50)
//Generic Bump(). Override MobBump() and ObjBump() instead of this.
/mob/living/Bump(atom/A)
@@ -1554,10 +1500,11 @@
/mob/living/basic/stickman,
/mob/living/basic/stickman/dog,
/mob/living/simple_animal/hostile/megafauna/dragon/lesser,
- /mob/living/basic/pet/cat,
- /mob/living/basic/pet/cat/cak,
+ /mob/living/simple_animal/pet/cat,
+ /mob/living/simple_animal/pet/cat/cak,
)
new_mob = new picked_animal(loc)
+
if(WABBAJACK_HUMAN)
var/mob/living/carbon/human/new_human = new(loc)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index ff081577b34f..499910828f3d 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -200,9 +200,6 @@
/// icon_state for holding mobs.
var/held_state = ""
- ///If combat mode is on or not
- var/combat_mode = FALSE
-
/// Is this mob allowed to be buckled/unbuckled to/from things?
var/can_buckle_to = TRUE
diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm
index f6f5927224a5..5f465f93ed58 100644
--- a/code/modules/mob/living/silicon/robot/robot_defines.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defines.dm
@@ -103,6 +103,7 @@
///Random serial number generated for each cyborg upon its initialization
var/ident = 0
var/locked = TRUE
+ var/list/req_access = list(ACCESS_ROBOTICS)
///Whether the robot has no charge left.
var/low_power_mode = FALSE
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index 816bb54760d4..79f92f190c59 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -16,7 +16,7 @@
health = 25
maxHealth = 25
- req_one_access = list(ACCESS_ROBOTICS, ACCESS_CONSTRUCTION)
+ maints_access_required = list(ACCESS_ROBOTICS, ACCESS_CONSTRUCTION)
radio_key = /obj/item/encryptionkey/headset_eng
radio_channel = RADIO_CHANNEL_ENGINEERING
bot_type = FLOOR_BOT
@@ -140,10 +140,9 @@
return data
// Actions received from TGUI
-/mob/living/simple_animal/bot/floorbot/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+/mob/living/simple_animal/bot/floorbot/ui_act(action, params)
. = ..()
- var/mob/user = ui.user
- if(!(bot_cover_flags & BOT_COVER_LOCKED) || issilicon(user) || isAdminGhostAI(user))
+ if(. || (bot_cover_flags & BOT_COVER_LOCKED && !usr.has_unlimited_silicon_privilege))
return
switch(action)
@@ -161,8 +160,8 @@
if(tilestack)
tilestack.forceMove(drop_location())
if("line_mode")
- var/setdir = tgui_input_list(user, "Select construction direction", "Direction", list("north", "east", "south", "west", "disable"))
- if(isnull(setdir) || QDELETED(ui) || ui.status != UI_INTERACTIVE)
+ var/setdir = tgui_input_list(usr, "Select construction direction", "Direction", list("north", "east", "south", "west", "disable"))
+ if(isnull(setdir))
return
switch(setdir)
if("north")
@@ -219,54 +218,52 @@
target = scan(tiles_scanned)
- if (!target)
- if(bot_mode_flags & BOT_MODE_AUTOPATROL)
- switch(mode)
- if(BOT_IDLE, BOT_START_PATROL)
- start_patrol()
- if(BOT_PATROL)
- bot_patrol()
- return
+ if(!target && bot_mode_flags & BOT_MODE_AUTOPATROL)
+ switch(mode)
+ if(BOT_IDLE, BOT_START_PATROL)
+ start_patrol()
+ if(BOT_PATROL)
+ bot_patrol()
+
+ if(target)
+ if(loc == target || loc == get_turf(target))
+ if(check_bot(target)) //Target is not defined at the parent
+ if(prob(50)) //50% chance to still try to repair so we dont end up with 2 floorbots failing to fix the last breach
+ target = null
+ path = list()
+ return
+ if(isturf(target) && !(bot_cover_flags & BOT_COVER_EMAGGED))
+ repair(target)
+ else if(bot_cover_flags & BOT_COVER_EMAGGED && isfloorturf(target))
+ var/turf/open/floor/F = target
+ toggle_magnet()
+ mode = BOT_REPAIRING
+ if(isplatingturf(F))
+ F.attempt_lattice_replacement()
+ else
+ F.ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
+ audible_message(span_danger("[src] makes an excited booping sound."))
+ addtimer(CALLBACK(src, PROC_REF(go_idle)), 0.5 SECONDS)
+ path = list()
+ return
+ if(!length(path))
+ if(!isturf(target))
+ var/turf/TL = get_turf(target)
+ path = get_path_to(src, TL, max_distance=30, access=access_card.GetAccess(), simulated_only = FALSE)
+ else
+ path = get_path_to(src, target, max_distance=30, access=access_card.GetAccess(), simulated_only = FALSE)
- if(loc == target || loc == get_turf(target))
- if(check_bot(target)) //Target is not defined at the parent
- if(prob(50)) //50% chance to still try to repair so we dont end up with 2 floorbots failing to fix the last breach
+ if(!bot_move(target))
+ add_to_ignore(target)
target = null
- path = list()
+ mode = BOT_IDLE
return
- if(isturf(target) && !(bot_cover_flags & BOT_COVER_EMAGGED))
- repair(target)
- else if(bot_cover_flags & BOT_COVER_EMAGGED && isfloorturf(target))
- var/turf/open/floor/floor = target
- toggle_magnet()
- mode = BOT_REPAIRING
- if(isplatingturf(floor))
- floor.attempt_lattice_replacement()
- else
- floor.ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
- audible_message(span_danger("[src] makes an excited booping sound."))
- addtimer(CALLBACK(src, PROC_REF(go_idle)), 0.5 SECONDS)
- path = list()
- return
-
- if(!length(path))
- if(!isturf(target))
- var/turf/TL = get_turf(target)
- path = get_path_to(src, TL, max_distance=30, access=access_card.GetAccess(), simulated_only = FALSE)
- else
- path = get_path_to(src, target, max_distance=30, access=access_card.GetAccess(), simulated_only = FALSE)
-
- if(!bot_move(target))
- add_to_ignore(target)
+ else if( !bot_move(target) )
target = null
mode = BOT_IDLE
- else if(!bot_move(target))
- target = null
- mode = BOT_IDLE
+ return
/mob/living/simple_animal/bot/floorbot/proc/go_idle()
- if (QDELETED(src))
- return
toggle_magnet(FALSE)
mode = BOT_IDLE
target = null
@@ -281,7 +278,7 @@
//Floorbots, having several functions, need sort out special conditions here.
/mob/living/simple_animal/bot/floorbot/process_scan(scan_target)
var/result
- var/turf/open/floor/floor
+ var/turf/open/floor/F
move_resist = initial(move_resist)
switch(process_type)
if(HULL_BREACH) //The most common job, patching breaches in the station's hull.
@@ -293,21 +290,21 @@
result = scan_target
move_resist = INFINITY
if(PLACE_TILE)
- floor = scan_target
- if(isplatingturf(floor)) //The floor must not already have a tile.
- result = floor
+ F = scan_target
+ if(isplatingturf(F)) //The floor must not already have a tile.
+ result = F
if(REPLACE_TILE)
- floor = scan_target
- if(isfloorturf(floor) && !isplatingturf(floor)) //The floor must already have a tile.
- result = floor
+ F = scan_target
+ if(isfloorturf(F) && !isplatingturf(F)) //The floor must already have a tile.
+ result = F
if(FIX_TILE) //Selects only damaged floors.
- floor = scan_target
- if(istype(floor) && (floor.broken || floor.burnt))
- result = floor
+ F = scan_target
+ if(istype(F) && (F.broken || F.burnt))
+ result = F
if(TILE_EMAG) //Emag mode! Rip up the floor and cause breaches to space!
- floor = scan_target
- if(!isplatingturf(floor))
- result = floor
+ F = scan_target
+ if(!isplatingturf(F))
+ result = F
else //If no special processing is needed, simply return the result.
result = scan_target
return result
@@ -316,7 +313,7 @@
if(check_bot_working(target_turf))
add_to_ignore(target_turf)
target = null
- playsound(src, 'sound/creatures/whistlereset.ogg', 50, TRUE)
+ playsound(src, 'sound/effects/whistlereset.ogg', 50, TRUE)
return
if(isspaceturf(target_turf))
//Must be a hull breach or in line mode to continue.
@@ -329,69 +326,57 @@
toggle_magnet()
visible_message(span_notice("[targetdirection ? "[src] begins installing a bridge plating." : "[src] begins to repair the hole."] "))
mode = BOT_REPAIRING
- if(!do_after(src, 5 SECONDS, target = target_turf) && mode == BOT_REPAIRING)
- go_idle()
- return
-
- if(!autotile)
- target_turf.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
- go_idle()
- return
-
- if(replacetiles && tilestack)
- target_turf.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) //make sure a hull is actually below the floor tile
- tilestack.place_tile(target_turf, src)
- if(!tilestack)
- speak("Requesting refill of custom floor tiles to continue replacing.")
- else
- target_turf.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) //make sure a hull is actually below the floor tile
- target_turf.place_on_top(/turf/open/floor/iron, flags = CHANGETURF_INHERIT_AIR)
- go_idle()
- return
-
- var/turf/open/floor/floor = target_turf
- var/was_replacing = replacetiles
-
- if(floor.broken || floor.burnt || isplatingturf(floor))
- toggle_magnet()
- mode = BOT_REPAIRING
- visible_message(span_notice("[src] begins [(floor.broken || floor.burnt) ? "repairing the floor" : "placing a floor tile"]."))
- if(!do_after(src, 5 SECONDS, target = floor) && mode == BOT_REPAIRING)
- go_idle()
- return
- else if(replacetiles && tilestack && floor.type != tilestack.turf_type)
- toggle_magnet()
- mode = BOT_REPAIRING
- visible_message(span_notice("[src] begins replacing the floor tiles."))
- if(do_after(src, 5 SECONDS, target = target_turf) && mode == BOT_REPAIRING && tilestack)
- go_idle()
- return
+ if(do_after(src, 50, target = target_turf) && mode == BOT_REPAIRING)
+ if(autotile) //Build the floor and include a tile.
+ if(replacetiles && tilestack)
+ target_turf.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) //make sure a hull is actually below the floor tile
+ tilestack.place_tile(target_turf, src)
+ if(!tilestack)
+ speak("Requesting refill of custom floor tiles to continue replacing.")
+ else
+ target_turf.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) //make sure a hull is actually below the floor tile
+ target_turf.PlaceOnTop(/turf/open/floor/iron, flags = CHANGETURF_INHERIT_AIR)
+ else //Build a hull plating without a floor tile.
+ target_turf.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
- var/area/is_this_maints = get_area(floor)
- if(was_replacing && tilestack) //turn the tile into plating (if needed), then replace it
- floor = floor.make_plating(TRUE) || floor
- tilestack.place_tile(floor, src)
- if(!tilestack)
- speak("Requesting refill of custom floor tiles to continue replacing.")
- go_idle()
- return
+ else
+ var/turf/open/floor/F = target_turf
+ var/success = FALSE
+ var/was_replacing = replacetiles
- if(floor.broken || floor.burnt) //repair the tile and reset it to be undamaged (rather than replacing it)
- floor.broken = FALSE
- floor.burnt = FALSE
- floor.update_appearance()
- go_idle()
- return
+ if(F.broken || F.burnt || isplatingturf(F))
+ toggle_magnet()
+ mode = BOT_REPAIRING
+ visible_message(span_notice("[src] begins [(F.broken || F.burnt) ? "repairing the floor" : "placing a floor tile"]."))
+ if(do_after(src, 50, target = F) && mode == BOT_REPAIRING)
+ success = TRUE
- if(istype(is_this_maints, /area/station/maintenance)) //place catwalk if it's plating and we're in maints
- floor.place_on_top(/turf/open/floor/catwalk_floor, flags = CHANGETURF_INHERIT_AIR)
+ else if(replacetiles && tilestack && F.type != tilestack.turf_type)
+ toggle_magnet()
+ mode = BOT_REPAIRING
+ visible_message(span_notice("[src] begins replacing the floor tiles."))
+ if(do_after(src, 50, target = target_turf) && mode == BOT_REPAIRING && tilestack)
+ success = TRUE
+
+ if(success)
+ var/area/is_this_maints = get_area(F)
+ if(was_replacing && tilestack) //turn the tile into plating (if needed), then replace it
+ F = F.make_plating(TRUE) || F
+ tilestack.place_tile(F, src)
+ if(!tilestack)
+ speak("Requesting refill of custom floor tiles to continue replacing.")
+ else if(F.broken || F.burnt) //repair the tile and reset it to be undamaged (rather than replacing it)
+ F.broken = FALSE
+ F.burnt = FALSE
+ F.update_appearance()
+ else if(istype(is_this_maints, /area/station/maintenance)) //place catwalk if it's plating and we're in maints
+ F.PlaceOnTop(/turf/open/floor/catwalk_floor, flags = CHANGETURF_INHERIT_AIR)
+ else //place normal tile if it's plating anywhere else
+ F = F.make_plating(TRUE) || F
+ F.PlaceOnTop(/turf/open/floor/iron, flags = CHANGETURF_INHERIT_AIR)
+
+ if(!QDELETED(src))
go_idle()
- return
-
- //place normal tile if it's plating anywhere else
- floor = floor.make_plating(TRUE) || floor
- floor.place_on_top(/turf/open/floor/iron, flags = CHANGETURF_INHERIT_AIR)
- go_idle()
/mob/living/simple_animal/bot/floorbot/update_icon_state()
. = ..()
@@ -411,23 +396,13 @@
new /obj/item/stack/tile/iron/base(Tsec, 1)
return ..()
-/mob/living/simple_animal/bot/floorbot/UnarmedAttack(atom/target, proximity_flag, list/modifiers)
- if(!can_unarmed_attack())
+/mob/living/simple_animal/bot/floorbot/UnarmedAttack(atom/A, proximity_flag)
+ if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED))
return
-
- if (!isturf(target))
- return ..()
-
- if(!(bot_cover_flags & BOT_COVER_EMAGGED) || !isfloorturf(target))
- repair(target)
- return
-
- var/turf/open/floor/floor = target
- if(isplatingturf(floor))
- floor.attempt_lattice_replacement()
+ if(isturf(A))
+ repair(A)
else
- floor.ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
- audible_message(span_danger("[src] makes an excited booping sound."))
+ ..()
/**
* Checks a given turf to see if another floorbot is there, working as well.
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
new file mode 100644
index 000000000000..d40f8513b8f8
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -0,0 +1,331 @@
+//Cat
+/mob/living/simple_animal/pet/cat
+ name = "cat"
+ desc = "Kitty!!"
+ icon = 'icons/mob/simple/pets.dmi'
+ icon_state = "cat2"
+ icon_living = "cat2"
+ icon_dead = "cat2_dead"
+ speak = list("Meow!", "Esp!", "Purr!", "HSSSSS")
+ speak_emote = list("purrs", "meows")
+ emote_hear = list("meows.", "mews.")
+ emote_see = list("shakes their head.", "shivers.")
+ speak_chance = 1
+ turns_per_move = 5
+ pass_flags = PASSTABLE
+ mob_size = MOB_SIZE_SMALL
+ mob_biotypes = MOB_ORGANIC|MOB_BEAST
+ bodytemp_cold_damage_limit = 200
+ bodytemp_heat_damage_limit = 400
+ unsuitable_atmos_damage = 0.5
+ animal_species = /mob/living/simple_animal/pet/cat
+ childtype = list(/mob/living/simple_animal/pet/cat/kitten = 1)
+ butcher_results = list(/obj/item/food/meat/slab = 1, /obj/item/organ/internal/ears/cat = 1, /obj/item/organ/external/tail/cat = 1, /obj/item/stack/sheet/animalhide/cat = 1)
+ response_help_continuous = "pets"
+ response_help_simple = "pet"
+ response_disarm_continuous = "gently pushes aside"
+ response_disarm_simple = "gently push aside"
+ response_harm_continuous = "kicks"
+ response_harm_simple = "kick"
+ mobility_flags = MOBILITY_FLAGS_REST_CAPABLE_DEFAULT
+ var/mob/living/basic/mouse/movement_target
+ gold_core_spawnable = FRIENDLY_SPAWN
+ collar_icon_state = "cat"
+ has_collar_resting_icon_state = TRUE
+ can_be_held = TRUE
+ held_state = "cat2"
+ attack_verb_continuous = "claws"
+ attack_verb_simple = "claw"
+ attack_sound = 'sound/weapons/slash.ogg'
+ attack_vis_effect = ATTACK_EFFECT_CLAW
+
+ footstep_type = FOOTSTEP_MOB_CLAW
+
+/mob/living/simple_animal/pet/cat/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/pet_bonus, "purrs!")
+ add_verb(src, /mob/living/proc/toggle_resting)
+ add_cell_sample()
+ ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT)
+
+/mob/living/simple_animal/pet/cat/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CAT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
+
+
+/mob/living/simple_animal/pet/cat/space
+ name = "space cat"
+ desc = "They're a cat... in space!"
+ icon_state = "spacecat"
+ icon_living = "spacecat"
+ icon_dead = "spacecat_dead"
+ unsuitable_atmos_damage = 0
+ bodytemp_cold_damage_limit = TCMB
+ bodytemp_heat_damage_limit = T0C + 40
+ held_state = "spacecat"
+
+/mob/living/simple_animal/pet/cat/breadcat
+ name = "bread cat"
+ desc = "They're a cat... with a bread!"
+ icon_state = "breadcat"
+ icon_living = "breadcat"
+ icon_dead = "breadcat_dead"
+ collar_icon_state = null
+ held_state = "breadcat"
+ butcher_results = list(/obj/item/food/meat/slab = 2, /obj/item/organ/internal/ears/cat = 1, /obj/item/organ/external/tail/cat = 1, /obj/item/food/breadslice/plain = 1)
+
+/mob/living/simple_animal/pet/cat/breadcat/add_cell_sample()
+ return
+
+/mob/living/simple_animal/pet/cat/original
+ name = "Batsy"
+ desc = "The product of alien DNA and bored geneticists."
+ gender = FEMALE
+ icon_state = "original"
+ icon_living = "original"
+ icon_dead = "original_dead"
+ collar_icon_state = null
+ unique_pet = TRUE
+ held_state = "original"
+
+/mob/living/simple_animal/pet/cat/original/add_cell_sample()
+ return
+
+/mob/living/simple_animal/pet/cat/kitten
+ name = "kitten"
+ desc = "D'aaawwww."
+ icon_state = "kitten"
+ icon_living = "kitten"
+ icon_dead = "kitten_dead"
+ density = FALSE
+ pass_flags = PASSMOB
+ mob_size = MOB_SIZE_SMALL
+ collar_icon_state = "kitten"
+
+//RUNTIME IS ALIVE! SQUEEEEEEEE~
+/mob/living/simple_animal/pet/cat/runtime
+ name = "Runtime"
+ desc = "GCAT"
+ icon_state = "cat"
+ icon_living = "cat"
+ icon_dead = "cat_dead"
+ gender = FEMALE
+ gold_core_spawnable = NO_SPAWN
+ unique_pet = TRUE
+ var/list/family = list()//var restored from savefile, has count of each child type
+ var/list/children = list()//Actual mob instances of children
+ var/static/cats_deployed = 0
+ var/memory_saved = FALSE
+ held_state = "cat"
+
+/mob/living/simple_animal/pet/cat/runtime/Initialize(mapload)
+ REGISTER_REQUIRED_MAP_ITEM(1, 1)
+ if(prob(5))
+ icon_state = "original"
+ icon_living = "original"
+ icon_dead = "original_dead"
+ Read_Memory()
+ . = ..()
+
+/mob/living/simple_animal/pet/cat/runtime/Life(seconds_per_tick = SSMOBS_DT, times_fired)
+ if(!cats_deployed && SSticker.current_state >= GAME_STATE_SETTING_UP)
+ Deploy_The_Cats()
+ if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
+ Write_Memory()
+ memory_saved = TRUE
+ ..()
+
+/mob/living/simple_animal/pet/cat/runtime/make_babies()
+ var/mob/baby = ..()
+ if(baby)
+ children += baby
+ return baby
+
+/mob/living/simple_animal/pet/cat/runtime/death()
+ if(!memory_saved)
+ Write_Memory(TRUE)
+ ..()
+
+/mob/living/simple_animal/pet/cat/runtime/proc/Read_Memory()
+ if(fexists("data/npc_saves/Runtime.sav")) //legacy compatability to convert old format to new
+ var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
+ S["family"] >> family
+ fdel("data/npc_saves/Runtime.sav")
+ else
+ var/json_file = file("data/npc_saves/Runtime.json")
+ if(!fexists(json_file))
+ return
+ var/list/json = json_decode(file2text(json_file))
+ family = json["family"]
+ if(isnull(family))
+ family = list()
+
+/mob/living/simple_animal/pet/cat/runtime/Write_Memory(dead, gibbed)
+ . = ..()
+ if(!.)
+ return
+ var/json_file = file("data/npc_saves/Runtime.json")
+ var/list/file_data = list()
+ family = list()
+ if(!dead)
+ for(var/mob/living/simple_animal/pet/cat/kitten/C in children)
+ if(istype(C,type) || C.stat || !C.z || (C.flags_1 & HOLOGRAM_1))
+ continue
+ if(C.type in family)
+ family[C.type] += 1
+ else
+ family[C.type] = 1
+ file_data["family"] = family
+ fdel(json_file)
+ WRITE_FILE(json_file, json_encode(file_data))
+
+/mob/living/simple_animal/pet/cat/runtime/proc/Deploy_The_Cats()
+ cats_deployed = 1
+ for(var/cat_type in family)
+ if(family[cat_type] > 0)
+ for(var/i in 1 to min(family[cat_type],100)) //Limits to about 500 cats, you wouldn't think this would be needed (BUT IT IS)
+ new cat_type(loc)
+
+/mob/living/simple_animal/pet/cat/_proc
+ name = "Proc"
+ gender = MALE
+ gold_core_spawnable = NO_SPAWN
+ unique_pet = TRUE
+
+
+/mob/living/simple_animal/pet/cat/update_resting()
+ . = ..()
+ if(stat == DEAD)
+ return
+ if (resting)
+ icon_state = "[icon_living]_rest"
+ else
+ icon_state = "[icon_living]"
+
+
+/mob/living/simple_animal/pet/cat/Life(seconds_per_tick = SSMOBS_DT, times_fired)
+ if(!stat && !buckled && !client)
+ if(SPT_PROB(0.5, seconds_per_tick))
+ manual_emote(pick("stretches out for a belly rub.", "wags [p_their()] tail.", "lies down."))
+ set_resting(TRUE)
+ else if(SPT_PROB(0.5, seconds_per_tick))
+ manual_emote(pick("sits down.", "crouches on [p_their()] hind legs.", "looks alert."))
+ set_resting(TRUE)
+ icon_state = "[icon_living]_sit"
+ cut_overlays() // No collar support in sitting state
+ else if(SPT_PROB(0.5, seconds_per_tick))
+ if (resting)
+ manual_emote(pick("gets up and meows.", "walks around.", "stops resting."))
+ set_resting(FALSE)
+ else
+ manual_emote(pick("grooms [p_their()] fur.", "twitches [p_their()] whiskers.", "shakes out [p_their()] coat."))
+
+ //MICE! RATS! OH MY!
+ if((src.loc) && isturf(src.loc))
+ if(!stat && !buckled)
+ //Targeting anything in the rat faction nearby
+ for(var/mob/living/M in view(1,src))
+ if(!M.stat && Adjacent(M))
+ if (FACTION_RAT in M.faction)
+ //Jerry can never catch Tom snowflaking
+ if(istype(M, /mob/living/basic/mouse/brown/tom) && inept_hunter)
+ if(COOLDOWN_FINISHED(src, emote_cooldown))
+ visible_message(span_warning("[src] chases [M] around, to no avail!"))
+ step(M, pick(GLOB.cardinals))
+ COOLDOWN_START(src, emote_cooldown, 1 MINUTES)
+ break
+ //Mouse splatting
+ if(ismouse(M))
+ manual_emote("splats \the [M]!")
+ var/mob/living/basic/mouse/snack = M
+ snack.splat()
+ movement_target = null
+ stop_automated_movement = 0
+ break
+ for(var/obj/item/toy/cattoy/T in view(1,src))
+ if (T.cooldown < (world.time - 400))
+ manual_emote("bats \the [T] around with \his paw!")
+ T.cooldown = world.time
+
+ ..()
+
+ make_babies()
+
+ if(!stat && !resting && !buckled)
+ turns_since_scan++
+ if(turns_since_scan > 5)
+ SSmove_manager.stop_looping(src)
+ turns_since_scan = 0
+ if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) ))
+ movement_target = null
+ stop_automated_movement = 0
+ if( !movement_target || !(movement_target.loc in oview(src, 3)) )
+ movement_target = null
+ stop_automated_movement = 0
+ //Targeting mice and mobs in the rat faction
+ for(var/mob/living/target in oview(src,3))
+ if(isturf(target.loc) && !target.stat)
+ if(FACTION_RAT in target.faction)
+ movement_target = target
+ break
+ if(movement_target)
+ stop_automated_movement = 1
+ SSmove_manager.move_to(src, movement_target, 0, 3)
+
+/mob/living/simple_animal/pet/cat/jerry //Holy shit we left jerry on donut ~ Arcane ~Fikou
+ name = "Jerry"
+ desc = "Tom is VERY amused."
+ inept_hunter = TRUE
+ gender = MALE
+
+/mob/living/simple_animal/pet/cat/cak //I told you I'd do it, Remie
+ name = "Keeki"
+ desc = "She is a cat made out of cake."
+ icon_state = "cak"
+ icon_living = "cak"
+ icon_dead = "cak_dead"
+ health = 50
+ maxHealth = 50
+ gender = FEMALE
+ harm_intent_damage = 10
+ butcher_results = list(/obj/item/organ/internal/brain = 1, /obj/item/organ/internal/heart = 1, /obj/item/food/cakeslice/birthday = 3, \
+ /obj/item/food/meat/slab = 2)
+ response_harm_continuous = "takes a bite out of"
+ response_harm_simple = "take a bite out of"
+ attacked_sound = 'sound/items/eatfood.ogg'
+ death_message = "loses her false life and collapses!"
+ death_sound = SFX_BODYFALL
+ held_state = "cak"
+
+/mob/living/simple_animal/pet/cat/cak/add_cell_sample()
+ return
+
+/mob/living/simple_animal/pet/cat/cak/CheckParts(list/parts)
+ ..()
+ var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents
+ if(!candidate || !candidate.brainmob || !candidate.brainmob.mind)
+ return
+ candidate.brainmob.mind.transfer_to(src)
+ to_chat(src, "[span_boldbig("You are a cak!")] You're a harmless cat/cake hybrid that everyone loves. People can take bites out of you if they're hungry, but you regenerate health \
+ so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \
+ free cake to the station!")
+ var/default_name = "Keeki"
+ var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "You are the [name]. Would you like to change your name to something else?", "Name change", default_name, MAX_NAME_LEN)), cap_after_symbols = FALSE)
+ if(new_name)
+ to_chat(src, span_notice("Your name is now [new_name]!"))
+ name = new_name
+
+/mob/living/simple_animal/pet/cat/cak/Life(seconds_per_tick = SSMOBS_DT, times_fired)
+ ..()
+ if(stat)
+ return
+ if(health < maxHealth)
+ adjustBruteLoss(-4 * seconds_per_tick) //Fast life regen
+ for(var/obj/item/food/donut/D in range(1, src)) //Frosts nearby donuts!
+ if(!D.is_decorated)
+ D.decorate_donut()
+
+/mob/living/simple_animal/pet/cat/cak/attack_hand(mob/living/user, list/modifiers)
+ ..()
+ if((user.istate & ISTATE_HARM) && user.reagents && !stat)
+ user.reagents.add_reagent(/datum/reagent/consumable/nutriment, 0.4)
+ user.reagents.add_reagent(/datum/reagent/consumable/nutriment/vitamin, 0.4)
diff --git a/code/modules/mob/living/basic/pets/cat/feral.dm b/code/modules/mob/living/simple_animal/hostile/feral.dm
similarity index 74%
rename from code/modules/mob/living/basic/pets/cat/feral.dm
rename to code/modules/mob/living/simple_animal/hostile/feral.dm
index 5bc5250ace78..307e31892fbe 100644
--- a/code/modules/mob/living/basic/pets/cat/feral.dm
+++ b/code/modules/mob/living/simple_animal/hostile/feral.dm
@@ -1,22 +1,27 @@
-/mob/living/basic/pet/cat/feral
+/mob/living/simple_animal/hostile/feral
name = "feral cat"
desc = "Kitty!! Wait, no no DON'T BITE-"
health = 30
maxHealth = 30
melee_damage_lower = 7
melee_damage_upper = 15
- ai_controller = /datum/ai_controller/basic_controller/simple_hostile
icon = 'icons/mob/simple/pets.dmi'
icon_state = "cat2"
icon_living = "cat2"
icon_dead = "cat2_dead"
held_state = "cat2"
+ speak = list("Meow!", "Esp!", "Purr!", "HSSSSS")
speak_emote = list("purrs", "meows")
+ emote_hear = list("meows.", "mews.")
+ emote_see = list("shakes their head.", "shivers.")
+ speak_chance = 1
+ turns_per_move = 5
mob_size = MOB_SIZE_SMALL
mob_biotypes = MOB_ORGANIC|MOB_BEAST
bodytemp_cold_damage_limit = 200
bodytemp_heat_damage_limit = 400
unsuitable_atmos_damage = 0.5
+ animal_species = /mob/living/simple_animal/pet/cat
butcher_results = list(/obj/item/food/meat/slab = 1, /obj/item/organ/internal/ears/cat = 1, /obj/item/organ/external/tail/cat = 1, /obj/item/stack/sheet/animalhide/cat = 1)
response_help_continuous = "pets"
response_help_simple = "pet"
@@ -29,26 +34,33 @@
attack_verb_simple = "claw"
attack_sound = 'sound/weapons/slash.ogg'
attack_vis_effect = ATTACK_EFFECT_CLAW
+ footstep_type = FOOTSTEP_MOB_CLAW
-/mob/living/basic/pet/cat/feraltabby
+/mob/living/simple_animal/hostile/feraltabby
name = "feral cat"
desc = "Kitty!! Wait, no no DON'T BITE-"
health = 45
maxHealth = 45
- melee_damage_lower = 12
+ melee_damage_lower = 10
melee_damage_upper = 20
- ai_controller = /datum/ai_controller/basic_controller/simple_hostile
icon = 'icons/mob/simple/pets.dmi'
icon_state = "cat"
icon_living = "cat"
icon_dead = "cat_dead"
held_state = "cat"
+ speak = list("Meow!", "Esp!", "Purr!", "HSSSSS")
speak_emote = list("purrs", "meows")
+ emote_hear = list("meows.", "mews.")
+ emote_see = list("shakes their head.", "shivers.")
+ speak_chance = 1
+ turns_per_move = 5
mob_size = MOB_SIZE_SMALL
mob_biotypes = MOB_ORGANIC|MOB_BEAST
bodytemp_cold_damage_limit = 200
bodytemp_heat_damage_limit = 400
unsuitable_atmos_damage = 0.5
+ animal_species = /mob/living/simple_animal/pet/cat
+ childtype = list(/mob/living/simple_animal/pet/cat/kitten = 1)
butcher_results = list(/obj/item/food/meat/slab = 1, /obj/item/organ/internal/ears/cat = 1, /obj/item/organ/external/tail/cat = 1, /obj/item/stack/sheet/animalhide/cat = 1)
response_help_continuous = "pets"
response_help_simple = "pet"
@@ -61,4 +73,4 @@
attack_verb_simple = "claw"
attack_sound = 'sound/weapons/slash.ogg'
attack_vis_effect = ATTACK_EFFECT_CLAW
-
+ footstep_type = FOOTSTEP_MOB_CLAW
diff --git a/code/modules/mob/living/basic/pets/cat/syndicat.dm b/code/modules/mob/living/simple_animal/hostile/syndicat.dm
similarity index 73%
rename from code/modules/mob/living/basic/pets/cat/syndicat.dm
rename to code/modules/mob/living/simple_animal/hostile/syndicat.dm
index af1ef1731e90..0f02bc3cd091 100644
--- a/code/modules/mob/living/basic/pets/cat/syndicat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicat.dm
@@ -1,4 +1,4 @@
-/mob/living/basic/pet/cat/syndicat
+/mob/living/simple_animal/hostile/syndicat
name = "Syndie Cat"
desc = "OH GOD! RUN!! IT CAN SMELL THE DISK!"
icon = 'icons/mob/simple/pets.dmi'
@@ -6,12 +6,19 @@
icon_living = "syndicat"
icon_dead = "syndicat_dead"
held_state = "syndicat"
+ speak = list("Meow!", "Esp!", "Purr!", "HSSSSS")
speak_emote = list("purrs", "meows")
+ emote_hear = list("meows.", "mews.")
+ emote_see = list("shakes their head.", "shivers.")
+ speak_chance = 1
+ turns_per_move = 5
mob_size = MOB_SIZE_SMALL
mob_biotypes = MOB_ORGANIC|MOB_BEAST
bodytemp_cold_damage_limit = TCMB
bodytemp_heat_damage_limit = T0C + 40
unsuitable_atmos_damage = 0
+ animal_species = /mob/living/simple_animal/pet/cat
+ childtype = list(/mob/living/simple_animal/pet/cat/kitten = 1)
butcher_results = list(/obj/item/food/meat/slab = 1, /obj/item/organ/internal/ears/cat = 1, /obj/item/organ/external/tail/cat = 1, /obj/item/stack/sheet/animalhide/cat = 1)
response_help_continuous = "pets"
response_help_simple = "pet"
@@ -19,19 +26,19 @@
response_disarm_simple = "gently push aside"
response_harm_continuous = "kicks"
response_harm_simple = "kick"
- health = 90
- maxHealth = 90
- melee_damage_lower = 27
+ health = 80
+ maxHealth = 80
+ melee_damage_lower = 20
melee_damage_upper = 35
- ai_controller = /datum/ai_controller/basic_controller/simple_hostile
faction = list(FACTION_CAT, ROLE_SYNDICATE)
can_be_held = TRUE
attack_verb_continuous = "claws"
attack_verb_simple = "claw"
attack_sound = 'sound/weapons/slash.ogg'
attack_vis_effect = ATTACK_EFFECT_CLAW
+ footstep_type = FOOTSTEP_MOB_CLAW
-/mob/living/basic/pet/cat/syndicat/Initialize(mapload)
+/mob/living/simple_animal/hostile/syndicat/Initialize(mapload)
. = ..()
var/obj/item/implant/toinstall = list(/obj/item/implant/weapons_auth, /obj/item/implant/explosive)
for(var/obj/item/implant/original_implants as anything in toinstall)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 8928812559b5..a518870258e1 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -375,7 +375,7 @@
return FALSE //Verbs do not appear for players.
//Good mobs!
- if(ispath(MP, /mob/living/basic/pet/cat))
+ if(ispath(MP, /mob/living/simple_animal/pet/cat))
return TRUE
if(ispath(MP, /mob/living/basic/pet/dog/corgi))
return TRUE
diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm
index 351a61f471b0..b39c9b0fe0e2 100644
--- a/code/modules/mod/modules/modules_general.dm
+++ b/code/modules/mod/modules/modules_general.dm
@@ -408,16 +408,12 @@
UnregisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT)
/obj/item/mod/module/longfall/proc/z_impact_react(datum/source, levels, turf/fell_on)
- SIGNAL_HANDLER
- if(!drain_power(use_power_cost * levels))
- return NONE
+ if(!drain_power(use_power_cost*levels))
+ return
new /obj/effect/temp_visual/mook_dust(fell_on)
mod.wearer.Stun(levels * 1 SECONDS)
- mod.wearer.visible_message(
- span_notice("[mod.wearer] lands on [fell_on] safely."),
- span_notice("[src] protects you from the damage!"),
- )
- return ZIMPACT_CANCEL_DAMAGE|ZIMPACT_NO_MESSAGE|ZIMPACT_NO_SPIN
+ to_chat(mod.wearer, span_notice("[src] protects you from the damage!"))
+ return NO_Z_IMPACT_DAMAGE
///Thermal Regulator - Regulates the wearer's core temperature.
/obj/item/mod/module/thermal_regulator
diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm
index 6300465fa125..e9cf7793d8fd 100644
--- a/code/modules/religion/burdened/psyker.dm
+++ b/code/modules/religion/burdened/psyker.dm
@@ -308,7 +308,7 @@
else
times_dry_fired = 0
var/turf/target_turf = get_offset_target_turf(get_ranged_target_turf(owner, owner.dir, 7), dx = rand(-1, 1), dy = rand(-1, 1))
- held_gun.process_fire(target_turf, owner, TRUE, null, pick(GLOB.all_body_zones))
+ held_gun.process_fire(target_turf, owner, TRUE, null, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
held_gun.semicd = FALSE
/datum/action/cooldown/spell/charged/psychic_booster
diff --git a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm
index 242be29523f8..97ce1219d682 100644
--- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm
+++ b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm
@@ -109,7 +109,7 @@
/datum/reagent/consumable/milk/chocolate_milk = -1)
virus_suspectibility = 1.5
- resulting_atoms = list(/mob/living/basic/pet/cat = 1) //The basic cat mobs are all male, so you mightt need a gender swap potion if you want to fill the fortress with kittens.
+ resulting_atoms = list(/mob/living/simple_animal/pet/cat = 1) //The basic cat mobs are all male, so you mightt need a gender swap potion if you want to fill the fortress with kittens.
/datum/micro_organism/cell_line/corgi
desc = "Canid cells"
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index a6d92ffd83d1..3e174c313786 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -466,7 +466,7 @@
/mob/living/carbon/proc/regenerate_limbs(list/excluded_zones = list())
SEND_SIGNAL(src, COMSIG_CARBON_REGENERATE_LIMBS, excluded_zones)
- var/list/zone_list = GLOB.all_body_zones.Copy()
+ var/list/zone_list = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)
var/list/dismembered_by_copy = body_zone_dismembered_by?.Copy()
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index 51377a7e1e0a..cae2bbe3e953 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -82,7 +82,7 @@
/mob/living/carbon/proc/get_missing_limbs()
RETURN_TYPE(/list)
- var/list/full = GLOB.all_body_zones.Copy()
+ var/list/full = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)
for(var/zone in full)
if(get_bodypart(zone))
full -= zone
@@ -99,7 +99,7 @@
return list()
/mob/living/carbon/get_disabled_limbs()
- var/list/full = GLOB.all_body_zones.Copy()
+ var/list/full = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)
var/list/disabled = list()
for(var/zone in full)
var/obj/item/bodypart/affecting = get_bodypart(zone)
diff --git a/code/modules/unit_tests/required_map_items.dm b/code/modules/unit_tests/required_map_items.dm
index 10c753f3d8bc..2f498667b16c 100644
--- a/code/modules/unit_tests/required_map_items.dm
+++ b/code/modules/unit_tests/required_map_items.dm
@@ -20,7 +20,7 @@
expected_types += /obj/machinery/computer/communications
expected_types += /mob/living/carbon/human/species/monkey/punpun
expected_types += /mob/living/basic/pet/dog/corgi/ian
- expected_types += /mob/living/basic/pet/cat/runtime
+ expected_types += /mob/living/simple_animal/pet/cat/runtime
expected_types += /mob/living/basic/parrot/poly
// monkestation start
expected_types += /obj/item/radio/radio_mic
diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm
index 966cad2f08cf..af5b1dc6c2f2 100644
--- a/code/modules/uplink/uplink_items/dangerous.dm
+++ b/code/modules/uplink/uplink_items/dangerous.dm
@@ -100,6 +100,13 @@
surplus = 50
purchasable_from = ~UPLINK_CLOWN_OPS
+/datum/uplink_item/dangerous/cat
+ name = "Feral cat grenade"
+ desc = "This grenade is filled with 5 feral cats in stasis. Upon activation, the feral cats are awoken and unleashed unto unlucky bystanders. WARNING: The cats are not trained to discern friend from foe!"
+ cost = 5
+ item = /obj/item/grenade/spawnergrenade/cat
+ surplus = 30
+
/datum/uplink_item/dangerous/rebarxbowsyndie
name = "Syndicate Rebar Crossbow"
desc = "A much more proffessional version of the engineer's bootleg rebar crossbow. 3 shot mag, quicker loading, and better ammo. Owners manual included."
diff --git a/code/modules/uplink/uplink_items/explosive.dm b/code/modules/uplink/uplink_items/explosive.dm
index 9a8d2281cae0..095b2e4cea65 100644
--- a/code/modules/uplink/uplink_items/explosive.dm
+++ b/code/modules/uplink/uplink_items/explosive.dm
@@ -48,13 +48,6 @@
cost = 6
restricted = TRUE
-/datum/uplink_item/explosive/cat
- name = "Feral cat grenade"
- desc = "This grenade is filled with 5 feral cats in stasis. Upon activation, the feral cats are awoken and unleashed unto unlucky bystanders. WARNING: The cats are not trained to discern friend from foe!"
- cost = 5
- item = /obj/item/grenade/spawnergrenade/cat
- surplus = 30
-
/datum/uplink_item/explosives/emp
name = "EMP Grenades and Implanter Kit"
desc = "A box that contains five EMP grenades and an EMP implant with three uses. Useful to disrupt communications, \
diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm
index da50bb181e0e..640685892bbf 100644
--- a/code/modules/uplink/uplink_items/nukeops.dm
+++ b/code/modules/uplink/uplink_items/nukeops.dm
@@ -521,11 +521,11 @@
surplus = 35
purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS
-/datum/uplink_item/explosives/syndicat
+/datum/uplink_item/dangerous/syndicat
name = "Syndie cat grenade"
desc = "This grenade is filled with 3 trained angry cats in special syndicate modsuits. Upon activation, the Syndicate cats are awoken and unleashed unto unlucky bystanders."
item = /obj/item/grenade/spawnergrenade/cat/syndicate
- cost = 5
+ cost = 20
surplus = 50
purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 2febe7bd77b8..b09c78887836 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -1356,10 +1356,6 @@
SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[name]", "[R.name]"))
vend_ready = TRUE
-///A proc meant to perform custom behavior on newly dispensed items.
-/obj/machinery/vending/proc/on_dispense(obj/item/vended_item)
- return
-
/obj/machinery/vending/process(seconds_per_tick)
if(machine_stat & (BROKEN|NOPOWER))
return PROCESS_KILL
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index f4b2b2a294d6..f1c8838ef3de 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -1,7 +1,3 @@
-GLOBAL_VAR_INIT(roaches_deployed, FALSE)
-#define MOTHROACH_START_CHANCE 5
-#define MAX_MOTHROACH_AMOUNT 3
-
/obj/item/vending_refill/wardrobe
icon_state = "refill_clothes"
@@ -12,29 +8,6 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE)
panel_type = "panel19"
light_mask = "wardrobe-light-mask"
-/obj/machinery/vending/wardrobe/Initialize(mapload)
- . = ..()
- if(!mapload)
- return
- if(GLOB.roaches_deployed || !is_station_level(z) || !prob(MOTHROACH_START_CHANCE))
- return
- for(var/count in 1 to rand(1, MAX_MOTHROACH_AMOUNT))
- new /mob/living/basic/mothroach(src)
- GLOB.roaches_deployed = TRUE
-
-
-/obj/machinery/vending/wardrobe/on_dispense(obj/item/clothing/food)
- if(!istype(food))
- return
- for(var/mob/living/basic/mothroach/roach in contents)
- food.take_damage(food.get_integrity() * 0.5)
-
-/obj/machinery/vending/wardrobe/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
- . = ..()
- for(var/mob/living/basic/mothroach/roach in contents)
- roach.ai_controller.set_blackboard_key(BB_BASIC_MOB_FLEE_TARGET, src) //scatter away!
- roach.forceMove(drop_location())
-
/obj/machinery/vending/wardrobe/sec_wardrobe
name = "\improper SecDrobe"
desc = "A vending machine for security and security-related clothing!"
@@ -660,6 +633,3 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE)
/obj/item/vending_refill/wardrobe/cent_wardrobe
machine_name = "CentDrobe"
light_color = LIGHT_COLOR_ELECTRIC_GREEN
-
-#undef MOTHROACH_START_CHANCE
-#undef MAX_MOTHROACH_AMOUNT
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 8a2a4f57ef28..fccb6f812af5 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/silicon/aibots.dmi b/icons/mob/silicon/aibots.dmi
index b3472cafd49e..82c98560520e 100644
Binary files a/icons/mob/silicon/aibots.dmi and b/icons/mob/silicon/aibots.dmi differ
diff --git a/icons/mob/simple/pets.dmi b/icons/mob/simple/pets.dmi
index e174d9944b69..73594f2f7243 100644
Binary files a/icons/mob/simple/pets.dmi and b/icons/mob/simple/pets.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index c53744d3b489..b801e6e7112d 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/monkestation/code/game/machinery/prize_vendor.dm b/monkestation/code/game/machinery/prize_vendor.dm
index 5dfd6f860aea..bee4c1113541 100644
--- a/monkestation/code/game/machinery/prize_vendor.dm
+++ b/monkestation/code/game/machinery/prize_vendor.dm
@@ -145,7 +145,7 @@
desc = "Friend dispenser."
dispense_list_override = list(/mob/living/basic/parrot = 3,
/mob/living/basic/sloth = 3,
- /mob/living/basic/pet/cat = 3,
+ /mob/living/simple_animal/pet/cat = 3,
/mob/living/basic/pet/fox = 3,
/mob/living/simple_animal/pet/gondola = 1,
/mob/living/basic/pet/penguin/emperor = 2,
diff --git a/monkestation/code/game/objects/effects/anomalies/anomalies_lifebringer.dm b/monkestation/code/game/objects/effects/anomalies/anomalies_lifebringer.dm
index 98c1214b4edf..5f1d506dcc06 100644
--- a/monkestation/code/game/objects/effects/anomalies/anomalies_lifebringer.dm
+++ b/monkestation/code/game/objects/effects/anomalies/anomalies_lifebringer.dm
@@ -39,7 +39,7 @@
if(active)
if(catsplosion)
- new /mob/living/basic/pet/cat(src.loc)
+ new /mob/living/simple_animal/pet/cat(src.loc)
active = FALSE
var/turf/open/tile = get_turf(src)
if(istype(tile))
diff --git a/monkestation/code/game/objects/items/choice_beacon.dm b/monkestation/code/game/objects/items/choice_beacon.dm
index 51ce3d6d07a5..e205fb74ded6 100644
--- a/monkestation/code/game/objects/items/choice_beacon.dm
+++ b/monkestation/code/game/objects/items/choice_beacon.dm
@@ -31,8 +31,8 @@
/mob/living/basic/crab,
/mob/living/basic/pet/penguin/baby,
/mob/living/basic/pet/fox,
- /mob/living/basic/pet/cat,
- /mob/living/basic/pet/cat/kitten,
+ /mob/living/simple_animal/pet/cat,
+ /mob/living/simple_animal/pet/cat/kitten,
/mob/living/basic/pet/dog/corgi,
/mob/living/basic/pet/dog/pug,
/mob/living/basic/pet/dog/bullterrier,
diff --git a/monkestation/code/game/objects/items/storage/crate.dm b/monkestation/code/game/objects/items/storage/crate.dm
index 7b9f330101b8..f65fabce10ae 100644
--- a/monkestation/code/game/objects/items/storage/crate.dm
+++ b/monkestation/code/game/objects/items/storage/crate.dm
@@ -96,7 +96,7 @@
new /obj/item/clothing/head/costume/kitty(src)
new /obj/item/clothing/under/costume/schoolgirl(src)
new /obj/item/clothing/neck/petcollar(src)
- new /mob/living/basic/pet/cat(src)
+ new /mob/living/simple_animal/pet/cat(src)
new /obj/item/toy/cattoy(src)
new /obj/item/slimepotion/slime/sentience(src)
if(59,60,61)
diff --git a/monkestation/code/modules/mob/living/basic/pets/cat.dm b/monkestation/code/modules/mob/living/basic/pets/cat.dm
index 99fc68d0255e..44fb0356e29b 100644
--- a/monkestation/code/modules/mob/living/basic/pets/cat.dm
+++ b/monkestation/code/modules/mob/living/basic/pets/cat.dm
@@ -1,9 +1,9 @@
-/mob/living/basic/pet/cat
+/mob/living/simple_animal/pet/cat
//. = ..()
worn_slot_flags = ITEM_SLOT_HEAD
head_icon = 'monkestation/icons/mob/pets_held.dmi'
-/mob/living/basic/hostile/syndicat
+/mob/living/simple_animal/hostile/syndicat
//. = ..()
worn_slot_flags = ITEM_SLOT_HEAD
head_icon = 'monkestation/icons/mob/pets_held.dmi'
diff --git a/monkestation/code/modules/ranching/chickens/ai/gary/gary_behaviours.dm b/monkestation/code/modules/ranching/chickens/ai/gary/gary_behaviours.dm
index 33a04c835f22..6148a75ac503 100644
--- a/monkestation/code/modules/ranching/chickens/ai/gary/gary_behaviours.dm
+++ b/monkestation/code/modules/ranching/chickens/ai/gary/gary_behaviours.dm
@@ -63,7 +63,8 @@
finish_action(controller, TRUE)
/datum/ai_behavior/setup_hideout/perform(seconds_per_tick, datum/ai_controller/controller, ...)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ . = ..()
+ finish_action(controller, TRUE)
/datum/ai_behavior/setup_hideout/finish_action(datum/ai_controller/controller, succeeded, ...)
. = ..()
@@ -82,7 +83,8 @@
set_movement_target(controller, controller.blackboard[BB_GARY_BARTER_ITEM])
/datum/ai_behavior/gary_retrieve_item/perform(seconds_per_tick, datum/ai_controller/controller, ...)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ . = ..()
+ finish_action(controller, TRUE)
/datum/ai_behavior/gary_retrieve_item/finish_action(datum/ai_controller/controller, succeeded, ...)
. = ..()
@@ -116,10 +118,12 @@
var/atom/target = ref.resolve()
if(!held_item) //if held_item is null, we pretend that action was succesful
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
+ return
if(!target || !pawn.CanReach(target) || !isliving(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return
var/mob/living/living_target = target
@@ -137,7 +141,8 @@
/datum/ai_behavior/gary_give_item/proc/try_to_give_item(datum/ai_controller/controller, mob/living/target, obj/item/held_item, actually_give)
if(QDELETED(held_item) || QDELETED(target))
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return FALSE
var/has_left_pocket = target.can_equip(held_item, ITEM_SLOT_LPOCKET)
var/has_right_pocket = target.can_equip(held_item, ITEM_SLOT_RPOCKET)
@@ -153,7 +158,8 @@
if(!has_left_pocket && !has_right_pocket && !has_valid_hand)
held_item.forceMove(get_turf(target))
SEND_SIGNAL(held_item, COMSIG_ITEM_GARY_LOOTED, pawn)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
+ finish_action(controller, FALSE)
+ return FALSE
if(!actually_give)
return TRUE
@@ -163,7 +169,7 @@
else
target.put_in_hands(held_item)
SEND_SIGNAL(held_item, COMSIG_ITEM_GARY_LOOTED, pawn)
- return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
+ finish_action(controller, TRUE)
/datum/ai_behavior/gary_give_item/finish_action(datum/ai_controller/controller, succeeded, ...)
. = ..()
diff --git a/sound/creatures/cat/oranges_meow1.ogg b/sound/creatures/cat/oranges_meow1.ogg
deleted file mode 100644
index 34e58d52a30b..000000000000
Binary files a/sound/creatures/cat/oranges_meow1.ogg and /dev/null differ
diff --git a/sound/creatures/whistlereset.ogg b/sound/creatures/whistlereset.ogg
deleted file mode 100644
index 6974b4d17217..000000000000
Binary files a/sound/creatures/whistlereset.ogg and /dev/null differ
diff --git a/sound/items/slash.ogg b/sound/items/slash.ogg
deleted file mode 100644
index 466a63da929d..000000000000
Binary files a/sound/items/slash.ogg and /dev/null differ
diff --git a/sound/items/tap.ogg b/sound/items/tap.ogg
deleted file mode 100644
index f20cc0b0fa07..000000000000
Binary files a/sound/items/tap.ogg and /dev/null differ
diff --git a/sound/items/thudswoosh.ogg b/sound/items/thudswoosh.ogg
deleted file mode 100644
index 52aa058ec463..000000000000
Binary files a/sound/items/thudswoosh.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/critdestr.ogg b/sound/vehicles/mecha/critdestr.ogg
deleted file mode 100644
index 2fb282834d35..000000000000
Binary files a/sound/vehicles/mecha/critdestr.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/hydraulic.ogg b/sound/vehicles/mecha/hydraulic.ogg
deleted file mode 100644
index eaff261983a7..000000000000
Binary files a/sound/vehicles/mecha/hydraulic.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/imag_enh.ogg b/sound/vehicles/mecha/imag_enh.ogg
deleted file mode 100644
index 0f87d52bd3f8..000000000000
Binary files a/sound/vehicles/mecha/imag_enh.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_blade_attack.ogg b/sound/vehicles/mecha/mech_blade_attack.ogg
deleted file mode 100644
index d44156e4b8e3..000000000000
Binary files a/sound/vehicles/mecha/mech_blade_attack.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_blade_break_wall.ogg b/sound/vehicles/mecha/mech_blade_break_wall.ogg
deleted file mode 100644
index 71982fba35b5..000000000000
Binary files a/sound/vehicles/mecha/mech_blade_break_wall.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_blade_safty.ogg b/sound/vehicles/mecha/mech_blade_safty.ogg
deleted file mode 100644
index c15b52f6f8de..000000000000
Binary files a/sound/vehicles/mecha/mech_blade_safty.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_charge_attack.ogg b/sound/vehicles/mecha/mech_charge_attack.ogg
deleted file mode 100644
index f45c1bbe2c9a..000000000000
Binary files a/sound/vehicles/mecha/mech_charge_attack.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_shield_deflect.ogg b/sound/vehicles/mecha/mech_shield_deflect.ogg
deleted file mode 100644
index 96d3c927f58e..000000000000
Binary files a/sound/vehicles/mecha/mech_shield_deflect.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_shield_drop.ogg b/sound/vehicles/mecha/mech_shield_drop.ogg
deleted file mode 100644
index 6b9f6156adba..000000000000
Binary files a/sound/vehicles/mecha/mech_shield_drop.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_shield_raise.ogg b/sound/vehicles/mecha/mech_shield_raise.ogg
deleted file mode 100644
index 35cf4a57f2f1..000000000000
Binary files a/sound/vehicles/mecha/mech_shield_raise.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_stealth_attack.ogg b/sound/vehicles/mecha/mech_stealth_attack.ogg
deleted file mode 100644
index ebd083ed2f46..000000000000
Binary files a/sound/vehicles/mecha/mech_stealth_attack.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_stealth_effect.ogg b/sound/vehicles/mecha/mech_stealth_effect.ogg
deleted file mode 100644
index bd4e1d2e441e..000000000000
Binary files a/sound/vehicles/mecha/mech_stealth_effect.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mech_stealth_pre_attack.ogg b/sound/vehicles/mecha/mech_stealth_pre_attack.ogg
deleted file mode 100644
index ff7bef9a5485..000000000000
Binary files a/sound/vehicles/mecha/mech_stealth_pre_attack.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mechmove01.ogg b/sound/vehicles/mecha/mechmove01.ogg
deleted file mode 100644
index ec11a380ed8e..000000000000
Binary files a/sound/vehicles/mecha/mechmove01.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mechmove03.ogg b/sound/vehicles/mecha/mechmove03.ogg
deleted file mode 100644
index 941d3693d0fd..000000000000
Binary files a/sound/vehicles/mecha/mechmove03.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mechmove04.ogg b/sound/vehicles/mecha/mechmove04.ogg
deleted file mode 100644
index 1971acec0c6d..000000000000
Binary files a/sound/vehicles/mecha/mechmove04.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mechstep.ogg b/sound/vehicles/mecha/mechstep.ogg
deleted file mode 100644
index e03cf82589eb..000000000000
Binary files a/sound/vehicles/mecha/mechstep.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/mechturn.ogg b/sound/vehicles/mecha/mechturn.ogg
deleted file mode 100644
index ee6f3571215f..000000000000
Binary files a/sound/vehicles/mecha/mechturn.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/nominal.ogg b/sound/vehicles/mecha/nominal.ogg
deleted file mode 100644
index ba335dfa75eb..000000000000
Binary files a/sound/vehicles/mecha/nominal.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/powerloader_step.ogg b/sound/vehicles/mecha/powerloader_step.ogg
deleted file mode 100644
index abf45b99b89e..000000000000
Binary files a/sound/vehicles/mecha/powerloader_step.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/powerloader_turn2.ogg b/sound/vehicles/mecha/powerloader_turn2.ogg
deleted file mode 100644
index 0830a32af1a5..000000000000
Binary files a/sound/vehicles/mecha/powerloader_turn2.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/skyfall_power_up.ogg b/sound/vehicles/mecha/skyfall_power_up.ogg
deleted file mode 100644
index aee762197def..000000000000
Binary files a/sound/vehicles/mecha/skyfall_power_up.ogg and /dev/null differ
diff --git a/sound/vehicles/mecha/weapdestr.ogg b/sound/vehicles/mecha/weapdestr.ogg
deleted file mode 100644
index 5a0550b62a0e..000000000000
Binary files a/sound/vehicles/mecha/weapdestr.ogg and /dev/null differ
diff --git a/sound/weapons/minebot_rocket.ogg b/sound/weapons/minebot_rocket.ogg
deleted file mode 100644
index 6dcf0c2a0252..000000000000
Binary files a/sound/weapons/minebot_rocket.ogg and /dev/null differ
diff --git a/tgstation.dme b/tgstation.dme
index bfd55dd55f49..e67837b7393a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -953,10 +953,8 @@
#include "code\datums\ai\basic_mobs\basic_ai_behaviors\befriend_target.dm"
#include "code\datums\ai\basic_mobs\basic_ai_behaviors\climb_tree.dm"
#include "code\datums\ai\basic_mobs\basic_ai_behaviors\find_parent.dm"
-#include "code\datums\ai\basic_mobs\basic_ai_behaviors\interact_with_target.dm"
#include "code\datums\ai\basic_mobs\basic_ai_behaviors\nearest_targeting.dm"
#include "code\datums\ai\basic_mobs\basic_ai_behaviors\pick_up_item.dm"
-#include "code\datums\ai\basic_mobs\basic_ai_behaviors\pull_target.dm"
#include "code\datums\ai\basic_mobs\basic_ai_behaviors\run_away_from_target.dm"
#include "code\datums\ai\basic_mobs\basic_ai_behaviors\set_travel_destination.dm"
#include "code\datums\ai\basic_mobs\basic_ai_behaviors\step_towards_turf.dm"
@@ -1196,7 +1194,6 @@
#include "code\datums\components\mind_linker.dm"
#include "code\datums\components\mirage_border.dm"
#include "code\datums\components\mirv.dm"
-#include "code\datums\components\mob_access.dm"
#include "code\datums\components\mob_chain.dm"
#include "code\datums\components\mob_harvest.dm"
#include "code\datums\components\multiple_lives.dm"
@@ -1224,7 +1221,6 @@
#include "code\datums\components\recharging_attacks.dm"
#include "code\datums\components\redirect_attack_hand_from_turf.dm"
#include "code\datums\components\reflection.dm"
-#include "code\datums\components\regenerative_shield.dm"
#include "code\datums\components\regenerator.dm"
#include "code\datums\components\religious_tool.dm"
#include "code\datums\components\remote_materials.dm"
@@ -1378,7 +1374,6 @@
#include "code\datums\elements\atmos_requirements.dm"
#include "code\datums\elements\atmos_sensitive.dm"
#include "code\datums\elements\attack_equip.dm"
-#include "code\datums\elements\attack_zone_randomiser.dm"
#include "code\datums\elements\backblast.dm"
#include "code\datums\elements\bane.dm"
#include "code\datums\elements\basic_eating.dm"
@@ -1397,7 +1392,6 @@
#include "code\datums\elements\cliff_walker.dm"
#include "code\datums\elements\climbable.dm"
#include "code\datums\elements\connect_loc.dm"
-#include "code\datums\elements\consumable_mob.dm"
#include "code\datums\elements\content_barfer.dm"
#include "code\datums\elements\corrupted_organ.dm"
#include "code\datums\elements\crackable.dm"
@@ -1461,7 +1455,6 @@
#include "code\datums\elements\organ_set_bonus.dm"
#include "code\datums\elements\permanent_fire_overlay.dm"
#include "code\datums\elements\pet_bonus.dm"
-#include "code\datums\elements\pet_collar.dm"
#include "code\datums\elements\plant_backfire.dm"
#include "code\datums\elements\point_of_interest.dm"
#include "code\datums\elements\prevent_attacking_of_types.dm"
@@ -2505,7 +2498,6 @@
#include "code\game\objects\structures\billboard.dm"
#include "code\game\objects\structures\bonfire.dm"
#include "code\game\objects\structures\broken_flooring.dm"
-#include "code\game\objects\structures\cat_house.dm"
#include "code\game\objects\structures\chess.dm"
#include "code\game\objects\structures\containers.dm"
#include "code\game\objects\structures\deployable_turret.dm"
@@ -4206,7 +4198,6 @@
#include "code\modules\library\skill_learning\job_skillchips\_job.dm"
#include "code\modules\library\skill_learning\job_skillchips\chef.dm"
#include "code\modules\library\skill_learning\job_skillchips\janitor.dm"
-#include "code\modules\library\skill_learning\job_skillchips\miner.dm"
#include "code\modules\library\skill_learning\job_skillchips\psychologist.dm"
#include "code\modules\library\skill_learning\job_skillchips\research_director.dm"
#include "code\modules\library\skill_learning\job_skillchips\roboticist.dm"
@@ -4563,20 +4554,11 @@
#include "code\modules\mob\living\basic\minebots\minebot.dm"
#include "code\modules\mob\living\basic\minebots\minebot_abilities.dm"
#include "code\modules\mob\living\basic\minebots\minebot_ai.dm"
-#include "code\modules\mob\living\basic\minebots\minebot_remote_control.dm"
#include "code\modules\mob\living\basic\minebots\minebot_upgrades.dm"
#include "code\modules\mob\living\basic\pets\fox.dm"
#include "code\modules\mob\living\basic\pets\penguin.dm"
#include "code\modules\mob\living\basic\pets\pet.dm"
#include "code\modules\mob\living\basic\pets\sloth.dm"
-#include "code\modules\mob\living\basic\pets\cat\bread_cat_ai.dm"
-#include "code\modules\mob\living\basic\pets\cat\cat.dm"
-#include "code\modules\mob\living\basic\pets\cat\cat_ai.dm"
-#include "code\modules\mob\living\basic\pets\cat\feral.dm"
-#include "code\modules\mob\living\basic\pets\cat\keeki.dm"
-#include "code\modules\mob\living\basic\pets\cat\kitten_ai.dm"
-#include "code\modules\mob\living\basic\pets\cat\runtime.dm"
-#include "code\modules\mob\living\basic\pets\cat\syndicat.dm"
#include "code\modules\mob\living\basic\pets\dog\_dog.dm"
#include "code\modules\mob\living\basic\pets\dog\corgi.dm"
#include "code\modules\mob\living\basic\pets\dog\dog_subtypes.dm"
@@ -4688,10 +4670,9 @@
#include "code\modules\mob\living\basic\vermin\crab.dm"
#include "code\modules\mob\living\basic\vermin\frog.dm"
#include "code\modules\mob\living\basic\vermin\lizard.dm"
+#include "code\modules\mob\living\basic\vermin\mothroach.dm"
#include "code\modules\mob\living\basic\vermin\mouse.dm"
#include "code\modules\mob\living\basic\vermin\space_bat.dm"
-#include "code\modules\mob\living\basic\vermin\mothroach\mothroach.dm"
-#include "code\modules\mob\living\basic\vermin\mothroach\mothroach_ai.dm"
#include "code\modules\mob\living\brain\brain.dm"
#include "code\modules\mob\living\brain\brain_cybernetic.dm"
#include "code\modules\mob\living\brain\brain_item.dm"
@@ -4845,14 +4826,17 @@
#include "code\modules\mob\living\simple_animal\bot\secbot.dm"
#include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm"
#include "code\modules\mob\living\simple_animal\bot\vibebot.dm"
+#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
#include "code\modules\mob\living\simple_animal\friendly\gondola.dm"
#include "code\modules\mob\living\simple_animal\friendly\pet.dm"
#include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm"
+#include "code\modules\mob\living\simple_animal\hostile\feral.dm"
#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
#include "code\modules\mob\living\simple_animal\hostile\illusion.dm"
#include "code\modules\mob\living\simple_animal\hostile\mimic.dm"
#include "code\modules\mob\living\simple_animal\hostile\ooze.dm"
#include "code\modules\mob\living\simple_animal\hostile\pirate.dm"
+#include "code\modules\mob\living\simple_animal\hostile\syndicat.dm"
#include "code\modules\mob\living\simple_animal\hostile\vatbeast.dm"
#include "code\modules\mob\living\simple_animal\hostile\zombie.dm"
#include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm"
diff --git a/tools/UpdatePaths/Scripts/79800_basic_cats.txt b/tools/UpdatePaths/Scripts/79800_basic_cats.txt
deleted file mode 100644
index 7a990f790865..000000000000
--- a/tools/UpdatePaths/Scripts/79800_basic_cats.txt
+++ /dev/null
@@ -1 +0,0 @@
-/mob/living/simple_animal/pet/cat/@SUBTYPES : /mob/living/basic/pet/cat/@SUBTYPES{@OLD}
\ No newline at end of file