diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm
index 8c61e4ae817..157eaf3cd50 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm
@@ -21,7 +21,7 @@
/turf/simulated/floor/engine/cult,
/area/ruin/powered/fountain_hall)
"g" = (
-/mob/living/simple_animal/butterfly,
+/mob/living/basic/butterfly,
/turf/simulated/floor/engine/cult,
/area/ruin/powered/fountain_hall)
"h" = (
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_nt.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_nt.dmm
index dd4974cdeed..55818f95163 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_nt.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_nt.dmm
@@ -2710,7 +2710,7 @@
/obj/structure/railing,
/obj/effect/decal/cleanable/dirt,
/obj/structure/bed/dogbed/brad,
-/mob/living/simple_animal/cockroach/brad,
+/mob/living/basic/cockroach/brad,
/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/lava/mapping_lava,
/area/lavaland/surface/outdoors/outpost/catwalk)
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm
index 631dfa60e31..c5e6135b77e 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm
@@ -31,7 +31,7 @@
/turf/simulated/floor/plasteel,
/area/ruin/space/unpowered)
"et" = (
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/turf/simulated/floor/plasteel,
/area/ruin/space/unpowered)
"ez" = (
@@ -296,7 +296,7 @@
/turf/template_noop,
/area/template_noop)
"VL" = (
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel,
/area/ruin/space/unpowered)
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/moonoutpost19.dmm b/_maps/map_files/RandomRuins/SpaceRuins/moonoutpost19.dmm
index 7fd9fc9f35a..7277cfc6a9f 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/moonoutpost19.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/moonoutpost19.dmm
@@ -10929,7 +10929,7 @@
},
/area/ruin/space/moonbase19)
"Sp" = (
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/turf/simulated/floor/plating,
/area/ruin/space/moonbase19)
"Sq" = (
@@ -12574,7 +12574,7 @@
/area/ruin/space/moonbase19)
"ZK" = (
/obj/machinery/light/small,
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/turf/simulated/floor/plating,
/area/ruin/space/moonbase19)
"ZL" = (
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/syndiecakesfactory.dmm b/_maps/map_files/RandomRuins/SpaceRuins/syndiecakesfactory.dmm
index 4ce36fd5684..e9985212a92 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/syndiecakesfactory.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/syndiecakesfactory.dmm
@@ -875,7 +875,7 @@
icon_state = "1-2"
},
/obj/structure/bed/dogbed,
-/mob/living/simple_animal/bunny/syndi,
+/mob/living/basic/bunny/syndi,
/turf/simulated/floor/engine,
/area/ruin/space/syndicakefactory)
"Ho" = (
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/unathi_skiff.dmm b/_maps/map_files/RandomRuins/SpaceRuins/unathi_skiff.dmm
index b60a1441348..656a7f78516 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/unathi_skiff.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/unathi_skiff.dmm
@@ -221,7 +221,7 @@
/turf/simulated/floor/plasteel/airless,
/area/ruin/space/unathi_breacher/engineering)
"ri" = (
-/mob/living/simple_animal/lizard{
+/mob/living/basic/lizard{
name = "Lil' Fella"
},
/obj/structure/cable{
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm b/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm
index db8daf0aed2..bb99edfcd92 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm
@@ -4815,7 +4815,7 @@
},
/area/ruin/space/derelict/hallway/primary)
"mZ" = (
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "bar"
},
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/wreckedcargoship.dmm b/_maps/map_files/RandomRuins/SpaceRuins/wreckedcargoship.dmm
index e7919193839..c581443c2a9 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/wreckedcargoship.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/wreckedcargoship.dmm
@@ -623,7 +623,7 @@
/area/ruin/space/wreck_cargoship)
"yG" = (
/obj/effect/decal/cleanable/dirt,
-/mob/living/simple_animal/hostile/retaliate/poison/snake{
+/mob/living/basic/snake{
name = "Rattlesnake Hardie";
desc = "A relatively menacing looking snake. Despite their intimidating look, they have cute collar attached to their neck. You can't help but think that name sounds familiar from somewhere."
},
diff --git a/_maps/map_files/shuttles/emergency_jungle.dmm b/_maps/map_files/shuttles/emergency_jungle.dmm
index f27d81b7ad0..fb69b98dc65 100644
--- a/_maps/map_files/shuttles/emergency_jungle.dmm
+++ b/_maps/map_files/shuttles/emergency_jungle.dmm
@@ -264,7 +264,7 @@
/area/shuttle/escape)
"bn" = (
/obj/structure/flora/junglebush,
-/mob/living/simple_animal/hostile/retaliate/poison/snake,
+/mob/living/basic/snake,
/turf/simulated/floor/grass,
/area/shuttle/escape)
"bo" = (
@@ -546,7 +546,7 @@
pixel_x = 28
},
/obj/structure/flora/junglebush,
-/mob/living/simple_animal/hostile/retaliate/poison/snake,
+/mob/living/basic/snake,
/turf/simulated/floor/grass,
/area/shuttle/escape)
"cu" = (
@@ -739,12 +739,12 @@
/area/shuttle/escape)
"xd" = (
/obj/structure/flora/junglebush,
-/mob/living/simple_animal/hostile/retaliate/poison/snake,
+/mob/living/basic/snake,
/obj/machinery/light/small,
/turf/simulated/floor/grass,
/area/shuttle/escape)
"Av" = (
-/mob/living/simple_animal/bunny,
+/mob/living/basic/bunny,
/turf/simulated/floor/grass,
/area/shuttle/escape)
"BA" = (
@@ -799,7 +799,7 @@
/obj/structure/chair/sofa/bamboo{
dir = 8
},
-/mob/living/simple_animal/bunny,
+/mob/living/basic/bunny,
/turf/simulated/floor/grass,
/area/shuttle/escape)
"LW" = (
@@ -843,7 +843,7 @@
/area/shuttle/escape)
"SO" = (
/obj/structure/flora/grass/jungle,
-/mob/living/simple_animal/hostile/retaliate/poison/snake,
+/mob/living/basic/snake,
/turf/simulated/floor/grass,
/area/shuttle/escape)
"TY" = (
diff --git a/_maps/map_files/stations/boxstation.dmm b/_maps/map_files/stations/boxstation.dmm
index a6b8958bf14..e0306dbfd9d 100644
--- a/_maps/map_files/stations/boxstation.dmm
+++ b/_maps/map_files/stations/boxstation.dmm
@@ -2538,7 +2538,7 @@
/area/station/command/office/hos)
"akL" = (
/obj/structure/flora/rock/jungle,
-/mob/living/simple_animal/lizard{
+/mob/living/basic/lizard{
name = "Greentext"
},
/turf/simulated/floor/grass,
@@ -46980,7 +46980,7 @@
/turf/simulated/floor/wood,
/area/station/maintenance/aft)
"dvv" = (
-/mob/living/simple_animal/pet/sloth/paperwork,
+/mob/living/basic/pet/sloth/paperwork,
/turf/simulated/floor/carpet,
/area/station/legal/lawoffice)
"dvD" = (
@@ -63294,7 +63294,7 @@
/turf/simulated/floor/plating,
/area/station/maintenance/fpmaint2)
"lpS" = (
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/turf/simulated/floor/plating,
/area/station/maintenance/asmaint2)
"lqc" = (
@@ -87490,7 +87490,7 @@
/turf/simulated/floor/wood,
/area/station/command/office/ntrep)
"xtZ" = (
-/mob/living/simple_animal/pet/penguin/baby,
+/mob/living/basic/pet/penguin/baby,
/turf/simulated/floor/carpet,
/area/station/maintenance/asmaint)
"xuw" = (
@@ -88416,7 +88416,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/mob/living/simple_animal/lizard/wags_his_tail,
+/mob/living/basic/lizard/wags_his_tail,
/turf/simulated/floor/plasteel,
/area/station/service/janitor)
"xPE" = (
diff --git a/_maps/map_files/stations/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm
index 6e5e7932093..513b0a3f8df 100644
--- a/_maps/map_files/stations/cerestation.dmm
+++ b/_maps/map_files/stations/cerestation.dmm
@@ -23075,7 +23075,7 @@
},
/area/station/security/permabrig)
"drC" = (
-/mob/living/simple_animal/hostile/retaliate/poison/snake{
+/mob/living/basic/snake{
name = "Sssylvester"
},
/turf/simulated/floor/plasteel{
@@ -24008,7 +24008,7 @@
},
/area/station/medical/virology)
"dzO" = (
-/mob/living/simple_animal/pet/sloth/paperwork,
+/mob/living/basic/pet/sloth/paperwork,
/obj/structure/bed/dogbed{
name = "Paperwork's bed"
},
@@ -24620,7 +24620,7 @@
},
/area/station/command/office/rd)
"dGz" = (
-/mob/living/simple_animal/butterfly,
+/mob/living/basic/butterfly,
/turf/simulated/floor/grass/jungle,
/area/station/hallway/secondary/garden)
"dGH" = (
@@ -36807,7 +36807,7 @@
/area/station/engineering/atmos)
"gtD" = (
/obj/structure/bed/dogbed,
-/mob/living/simple_animal/pet/penguin/baby,
+/mob/living/basic/pet/penguin/baby,
/obj/effect/mapping_helpers/turfs/damage,
/turf/simulated/floor/wood,
/area/station/maintenance/starboard)
@@ -50940,7 +50940,7 @@
dir = 4
},
/obj/machinery/hologram/holopad,
-/mob/living/simple_animal/lizard/wags_his_tail,
+/mob/living/basic/lizard/wags_his_tail,
/turf/simulated/floor/plasteel,
/area/station/service/janitor)
"jso" = (
@@ -103621,7 +103621,7 @@
},
/area/station/maintenance/port2)
"uGG" = (
-/mob/living/simple_animal/lizard,
+/mob/living/basic/lizard,
/turf/simulated/floor/plating/asteroid/ancient,
/area/station/maintenance/fore2)
"uGM" = (
@@ -105002,7 +105002,7 @@
/turf/simulated/floor/plasteel/white,
/area/station/science/misc_lab)
"uWB" = (
-/mob/living/simple_animal/bunny{
+/mob/living/basic/bunny{
desc = "It's Spaghetti, the official bnuy of Atmospherics. Appropriately named after the jumbled mess of piping.";
name = "Spaghetti"
},
@@ -108124,7 +108124,7 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden,
/obj/effect/decal/cleanable/dirt,
-/mob/living/simple_animal/lizard{
+/mob/living/basic/lizard{
name = "Greentext"
},
/turf/simulated/floor/plasteel,
diff --git a/_maps/map_files/stations/deltastation.dmm b/_maps/map_files/stations/deltastation.dmm
index df1be429c0c..87788c92ce0 100644
--- a/_maps/map_files/stations/deltastation.dmm
+++ b/_maps/map_files/stations/deltastation.dmm
@@ -5499,7 +5499,7 @@
/turf/simulated/floor/plasteel,
/area/station/maintenance/disposal)
"azk" = (
-/mob/living/simple_animal/lizard/wags_his_tail,
+/mob/living/basic/lizard/wags_his_tail,
/turf/simulated/floor/plasteel,
/area/station/service/janitor)
"azl" = (
@@ -27685,7 +27685,7 @@
/turf/simulated/floor/plasteel/grimy,
/area/station/legal/lawoffice)
"ccv" = (
-/mob/living/simple_animal/pet/sloth/paperwork,
+/mob/living/basic/pet/sloth/paperwork,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
},
diff --git a/_maps/map_files/stations/emeraldstation.dmm b/_maps/map_files/stations/emeraldstation.dmm
index 303dbeb9a4d..6f45bc86a31 100644
--- a/_maps/map_files/stations/emeraldstation.dmm
+++ b/_maps/map_files/stations/emeraldstation.dmm
@@ -3624,7 +3624,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/mob/living/simple_animal/lizard/wags_his_tail,
+/mob/living/basic/lizard/wags_his_tail,
/turf/simulated/floor/plasteel,
/area/station/service/janitor)
"aNu" = (
@@ -37624,7 +37624,7 @@
/turf/simulated/floor/plasteel,
/area/station/maintenance/starboard)
"hxa" = (
-/mob/living/simple_animal/lizard{
+/mob/living/basic/lizard{
name = "Greentext"
},
/obj/machinery/atmospherics/unary/vent_scrubber/on{
@@ -45709,7 +45709,7 @@
},
/area/station/turret_protected/ai)
"jbt" = (
-/mob/living/simple_animal/pet/sloth/paperwork,
+/mob/living/basic/pet/sloth/paperwork,
/obj/structure/bed/dogbed,
/obj/item/radio/intercom{
name = "south bump";
@@ -46420,7 +46420,7 @@
/turf/simulated/floor/wood,
/area/station/maintenance/dorms/starboard)
"jjT" = (
-/mob/living/simple_animal/bunny,
+/mob/living/basic/bunny,
/obj/structure/railing{
dir = 6
},
@@ -55305,7 +55305,7 @@
/obj/machinery/atmospherics/binary/valve{
dir = 4
},
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/random/blood/maybe,
/obj/machinery/light/small,
@@ -69058,7 +69058,7 @@
/area/station/aisat/hall)
"nMY" = (
/obj/effect/decal/cleanable/dirt,
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/turf/simulated/floor/plating,
/area/station/maintenance/apmaint2)
"nNc" = (
@@ -77334,7 +77334,7 @@
desc = "A sink used for washing one's hands and face. It looks rusty and home-made";
name = "old sink"
},
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/obj/effect/spawner/random/maintenance,
/turf/simulated/floor/plating,
/area/station/maintenance/asmaint)
@@ -82840,7 +82840,7 @@
/obj/effect/turf_decal{
dir = 8
},
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/obj/machinery/atmospherics/pipe/simple/hidden/cyan,
/turf/simulated/floor/plasteel,
/area/station/maintenance/apmaint2)
@@ -91273,7 +91273,7 @@
/turf/simulated/floor/grass,
/area/station/public/park)
"sfv" = (
-/mob/living/simple_animal/bunny,
+/mob/living/basic/bunny,
/obj/structure/flora/ausbushes/brflowers,
/obj/machinery/status_display{
name = "cargo display";
@@ -93190,7 +93190,7 @@
/area/station/engineering/atmos)
"szh" = (
/obj/effect/decal/cleanable/dirt,
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/turf/simulated/floor/plating,
/area/station/maintenance/starboard)
"szl" = (
@@ -96210,7 +96210,7 @@
},
/area/station/security/storage)
"teq" = (
-/mob/living/simple_animal/lizard{
+/mob/living/basic/lizard{
name = "Valid"
},
/obj/machinery/atmospherics/unary/vent_scrubber/on{
@@ -113234,7 +113234,7 @@
},
/area/station/science/genetics)
"wxT" = (
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 8
@@ -113293,7 +113293,7 @@
/area/station/engineering/hardsuitstorage)
"wyS" = (
/obj/effect/decal/cleanable/dirt,
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/turf/simulated/floor/plating,
/area/station/maintenance/asmaint)
"wyU" = (
@@ -119636,7 +119636,7 @@
"xPt" = (
/obj/effect/spawner/random/blood/maybe,
/obj/effect/decal/cleanable/dirt,
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/turf/simulated/floor/plasteel{
icon_state = "red"
},
diff --git a/_maps/map_files/stations/metastation.dmm b/_maps/map_files/stations/metastation.dmm
index 23f583b9a87..1842a9450ab 100644
--- a/_maps/map_files/stations/metastation.dmm
+++ b/_maps/map_files/stations/metastation.dmm
@@ -33124,7 +33124,7 @@
},
/area/station/hallway/supply/port)
"dre" = (
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/turf/simulated/floor/plating,
/area/station/maintenance/theatre)
"drL" = (
@@ -53571,7 +53571,7 @@
},
/area/station/command/office/cmo)
"kKp" = (
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/turf/simulated/floor/plating,
/area/station/supply/warehouse)
"kLd" = (
@@ -56395,7 +56395,7 @@
},
/area/station/hallway/primary/aft/south)
"lIe" = (
-/mob/living/simple_animal/cockroach,
+/mob/living/basic/cockroach,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 5
},
@@ -76007,7 +76007,7 @@
},
/area/station/engineering/equipmentstorage)
"sMM" = (
-/mob/living/simple_animal/pet/sloth/paperwork,
+/mob/living/basic/pet/sloth/paperwork,
/turf/simulated/floor/carpet,
/area/station/legal/lawoffice)
"sMZ" = (
@@ -88908,7 +88908,7 @@
/area/shuttle/arrival/station)
"xBG" = (
/obj/effect/spawner/random/dirt/often,
-/mob/living/simple_animal/lizard/wags_his_tail,
+/mob/living/basic/lizard/wags_his_tail,
/turf/simulated/floor/plasteel,
/area/station/service/janitor)
"xBX" = (
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm
index e0762fccde5..9c8db806551 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm
@@ -23,3 +23,9 @@
if(controller.blackboard[BB_BASIC_MOB_STOP_FLEEING] || QDELETED(flee_from))
return FALSE
return TRUE
+
+/// Try to escape from your current target, without performing any other actions.
+/// Reads from some fleeing-specific targeting keys rather than the current mob target.
+/datum/ai_planning_subtree/flee_target/from_flee_key
+ target_key = BB_BASIC_MOB_FLEE_TARGET
+ hiding_place_key = BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION
diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm
index b91ac32b1ed..c5c97033116 100644
--- a/code/datums/diseases/anxiety.dm
+++ b/code/datums/diseases/anxiety.dm
@@ -38,13 +38,13 @@
affected_mob.visible_message("[affected_mob] coughs up butterflies!", \
"You cough up butterflies!")
for(var/i in 1 to 2)
- var/mob/living/simple_animal/butterfly/B = new(affected_mob.loc)
- addtimer(CALLBACK(B, TYPE_PROC_REF(/mob/living/simple_animal/butterfly, decompose)), rand(5, 25) SECONDS)
+ var/mob/living/basic/butterfly/B = new(affected_mob.loc)
+ addtimer(CALLBACK(B, TYPE_PROC_REF(/mob/living/basic/butterfly, decompose)), rand(5, 25) SECONDS)
/**
* Made so severe anxiety does not overload the SSmob while keeping it's effect
*/
-/mob/living/simple_animal/butterfly/proc/decompose()
+/mob/living/basic/butterfly/proc/decompose()
visible_message("[src] decomposes due to being outside of its original habitat for too long!",
"You decompose for being too long out of your habitat!")
melt()
diff --git a/code/datums/keybindings/emote_keybinds.dm b/code/datums/keybindings/emote_keybinds.dm
index 8f2ebf8f099..bde88ae0da9 100644
--- a/code/datums/keybindings/emote_keybinds.dm
+++ b/code/datums/keybindings/emote_keybinds.dm
@@ -683,6 +683,10 @@
/datum/keybinding/emote/simple_animal/pet/cat/can_use(client/C, mob/M)
return iscat(M) && ..()
+/datum/keybinding/emote/simple_animal/lizard/whicker
+ linked_emote = /datum/emote/lizard/whicker
+ name = "Whicker (Lizard)"
+
/datum/keybinding/custom
category = KB_CATEGORY_EMOTE_CUSTOM
var/default_emote_text = "Insert custom me emote text."
diff --git a/code/datums/spell_targeting/matter_eater_targeting.dm b/code/datums/spell_targeting/matter_eater_targeting.dm
index 74868a289ce..a44d3b152b6 100644
--- a/code/datums/spell_targeting/matter_eater_targeting.dm
+++ b/code/datums/spell_targeting/matter_eater_targeting.dm
@@ -16,7 +16,7 @@
/mob/living/simple_animal/slime,
/mob/living/simple_animal/chick,
/mob/living/simple_animal/chicken,
- /mob/living/simple_animal/lizard,
+ /mob/living/basic/lizard,
/mob/living/basic/cow,
/mob/living/simple_animal/spiderbot
)
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 115044e016b..0d5f225e486 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -355,7 +355,7 @@
return
owner.visible_message("[owner]'s soul is absorbed into the rod, relieving the previous snake of its duty.")
- var/mob/living/simple_animal/hostile/retaliate/poison/snake/healSnake = new(owner.loc)
+ var/mob/living/basic/snake/healSnake = new(owner.loc)
var/list/chems = list("bicaridine", "perfluorodecalin", "kelotane")
healSnake.poison_type = pick(chems)
healSnake.name = "Asclepius's Snake"
diff --git a/code/game/objects/items/weapons/melee/melee_misc.dm b/code/game/objects/items/weapons/melee/melee_misc.dm
index 517fbabafff..b81fb4d0977 100644
--- a/code/game/objects/items/weapons/melee/melee_misc.dm
+++ b/code/game/objects/items/weapons/melee/melee_misc.dm
@@ -55,8 +55,8 @@
. = ..()
strong_against = typecacheof(list(
/mob/living/simple_animal/hostile/poison/bees/,
- /mob/living/simple_animal/butterfly,
- /mob/living/simple_animal/cockroach,
+ /mob/living/basic/butterfly,
+ /mob/living/basic/cockroach,
/obj/item/queen_bee))
strong_against -= /mob/living/simple_animal/hostile/poison/bees/syndi // Syndi-bees have special anti-flyswatter tech installed
diff --git a/code/game/objects/structures/crates_lockers/crittercrate.dm b/code/game/objects/structures/crates_lockers/crittercrate.dm
index 6b4511a0b0d..8c330c5b57f 100644
--- a/code/game/objects/structures/crates_lockers/crittercrate.dm
+++ b/code/game/objects/structures/crates_lockers/crittercrate.dm
@@ -57,7 +57,7 @@
/mob/living/simple_animal/pet/cat,
/mob/living/simple_animal/pet/dog/pug,
/mob/living/simple_animal/pet/dog/fox,
- /mob/living/simple_animal/bunny)
+ /mob/living/basic/bunny)
/obj/structure/closet/critter/corgi
name = "corgi crate"
@@ -108,7 +108,7 @@
/obj/structure/closet/critter/butterfly
name = "butterfly crate"
- content_mob = /mob/living/simple_animal/butterfly
+ content_mob = /mob/living/basic/butterfly
/obj/structure/closet/critter/nian_caterpillar
name = "nian caterpillar crate"
@@ -120,7 +120,7 @@
/obj/structure/closet/critter/bunny
name = "bunny crate"
- content_mob = /mob/living/simple_animal/bunny
+ content_mob = /mob/living/basic/bunny
/obj/structure/closet/critter/gorilla
name = "gorilla crate"
diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm
index e0067923b7a..7ddea7436b6 100644
--- a/code/modules/events/infestation.dm
+++ b/code/modules/events/infestation.dm
@@ -57,7 +57,7 @@
max_number = 12
vermstring = "mice"
if(VERM_LIZARDS)
- spawn_types = list(/mob/living/simple_animal/lizard)
+ spawn_types = list(/mob/living/basic/lizard)
max_number = 6
vermstring = "lizards"
if(VERM_SPIDERS)
diff --git a/code/modules/mob/living/basic/basic_emotes.dm b/code/modules/mob/living/basic/basic_emotes.dm
new file mode 100644
index 00000000000..adf4bab9211
--- /dev/null
+++ b/code/modules/mob/living/basic/basic_emotes.dm
@@ -0,0 +1,8 @@
+/datum/emote/lizard
+ mob_type_allowed_typecache = /mob/living/basic/lizard
+ mob_type_blacklist_typecache = list()
+
+/datum/emote/lizard/whicker
+ key = "tongue"
+ message = "sticks its tongue out contentedly!"
+ emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE
diff --git a/code/modules/mob/living/basic/basic_mob.dm b/code/modules/mob/living/basic/basic_mob.dm
index 37a0859c706..2376cdba275 100644
--- a/code/modules/mob/living/basic/basic_mob.dm
+++ b/code/modules/mob/living/basic/basic_mob.dm
@@ -175,6 +175,9 @@ RESTRICT_TYPE(/mob/living/basic)
apply_temperature_requirements()
if(step_type)
AddComponent(/datum/component/footstep, step_type)
+ if(can_hide)
+ var/datum/action/innate/hide/hide = new()
+ hide.Grant(src)
if(is_ranged)
AddComponent(/datum/component/ranged_attacks, projectile_type = projectile_type, projectile_sound = projectile_sound, burst_shots = ranged_burst_count, burst_intervals = ranged_burst_interval)
diff --git a/code/modules/mob/living/basic/friendly/basic_pet.dm b/code/modules/mob/living/basic/friendly/basic_pet.dm
new file mode 100644
index 00000000000..524d318a10a
--- /dev/null
+++ b/code/modules/mob/living/basic/friendly/basic_pet.dm
@@ -0,0 +1,17 @@
+/mob/living/basic/pet
+ icon = 'icons/mob/pets.dmi'
+ mob_size = MOB_SIZE_SMALL
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
+ blood_volume = BLOOD_VOLUME_NORMAL
+ speed = 0 // same speed as a person.
+ hud_type = /datum/hud/corgi
+
+/mob/living/basic/pet/item_interaction(mob/living/user, obj/item/O, list/modifiers)
+ if(!istype(O, /obj/item/newspaper))
+ return ..()
+ var/obj/item/newspaper/paper = O
+ if(stat != CONSCIOUS || !paper.rolled)
+ return ..()
+ user.visible_message("[user] baps [name] on the nose with the rolled up [O].")
+ INVOKE_ASYNC(src, PROC_REF(spin), 7 DECISECONDS, 1)
+ return ITEM_INTERACT_COMPLETE
diff --git a/code/modules/mob/living/basic/friendly/bunny.dm b/code/modules/mob/living/basic/friendly/bunny.dm
new file mode 100644
index 00000000000..5a23ad03502
--- /dev/null
+++ b/code/modules/mob/living/basic/friendly/bunny.dm
@@ -0,0 +1,64 @@
+/mob/living/basic/bunny
+ name = "bunny"
+ real_name = "bunny"
+ desc = "Awww a cute bunny."
+ icon_state = "m_bunny"
+ icon_living = "m_bunny"
+ icon_dead = "bunny_dead"
+ icon_resting = "bunny_stretch"
+ faction = list("neutral", "jungle")
+ see_in_dark = 6
+ maxHealth = 10
+ health = 10
+ ai_controller = /datum/ai_controller/basic_controller/bunny
+ butcher_results = list(/obj/item/food/meat = 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"
+ density = FALSE
+ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST
+ mob_size = MOB_SIZE_TINY
+ atmos_requirements = list("min_oxy" = 16, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
+ minimum_survivable_temperature = 223 // Below -50 Degrees Celcius
+ maximum_survivable_temperature = 323 // Above 50 Degrees Celcius
+ can_hide = TRUE
+ holder_type = /obj/item/holder/bunny
+ gold_core_spawnable = FRIENDLY_SPAWN
+ ventcrawler = VENTCRAWLER_ALWAYS
+
+/mob/living/basic/bunny/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/wears_collar)
+ AddElement(/datum/element/ai_retaliate)
+
+/mob/living/basic/bunny/attack_hand(mob/living/carbon/human/M)
+ if(M.a_intent == INTENT_HELP)
+ get_scooped(M, TRUE)
+ return ..()
+
+/mob/living/basic/bunny/syndi // for the syndicake factory bunny so its not being shot
+ faction = list("syndicate")
+ gold_core_spawnable = NO_SPAWN
+
+/datum/ai_controller/basic_controller/bunny
+ blackboard = list(
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ )
+ ai_traits = AI_FLAG_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/rabbit,
+ /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee,
+ /datum/ai_planning_subtree/flee_target,
+ )
+
+/datum/ai_planning_subtree/random_speech/rabbit
+ speech_chance = 10
+ speak = list("Mrrp.", "CHIRP!", "Mrrp?") // rabbits make some weird noises dude i don't know what to tell you
+ emote_hear = list("hops.", "thumps.")
+ emote_see = list("hops around.", "bounces up and down.", "flips their ears up")
diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/basic/friendly/butterfly.dm
similarity index 54%
rename from code/modules/mob/living/simple_animal/friendly/butterfly.dm
rename to code/modules/mob/living/basic/friendly/butterfly.dm
index ef4598656df..0f7b4913401 100644
--- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm
+++ b/code/modules/mob/living/basic/friendly/butterfly.dm
@@ -1,18 +1,20 @@
-/mob/living/simple_animal/butterfly
+/mob/living/basic/butterfly
name = "butterfly"
desc = "A colorful butterfly, how'd it get up here?"
icon_state = "butterfly"
icon_living = "butterfly"
icon_dead = "butterfly_dead"
- emote_see = list("flutters")
faction = list("neutral", "jungle")
- response_help = "shoos"
- response_disarm = "brushes aside"
- response_harm = "squashes"
+ response_help_continuous = "shoos"
+ response_help_simple = "shoo"
+ response_disarm_continuous = "brushes aside"
+ response_disarm_simple = "brush aside"
+ response_harm_continuous = "squashes"
+ response_harm_simple = "squash"
+ ai_controller = /datum/ai_controller/basic_controller/butterfly
maxHealth = 2
health = 2
harm_intent_damage = 1
- friendly = "nudges"
density = FALSE
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = VENTCRAWLER_ALWAYS
@@ -22,9 +24,10 @@
gold_core_spawnable = FRIENDLY_SPAWN
initial_traits = list(TRAIT_FLYING, TRAIT_EDIBLE_BUG)
-/mob/living/simple_animal/butterfly/Initialize(mapload)
+/mob/living/basic/butterfly/Initialize(mapload)
. = ..()
color = rgb(rand(0, 255), rand(0, 255), rand(0, 255))
-/mob/living/simple_animal/butterfly/npc_safe(mob/user)
- return TRUE
+/datum/ai_controller/basic_controller/butterfly
+ ai_movement = /datum/ai_movement/basic_avoidance
+ idle_behavior = /datum/idle_behavior/idle_random_walk
diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/basic/friendly/cockroach.dm
similarity index 50%
rename from code/modules/mob/living/simple_animal/friendly/cockroach.dm
rename to code/modules/mob/living/basic/friendly/cockroach.dm
index f38bf75d4ab..fde2a467c9a 100644
--- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm
+++ b/code/modules/mob/living/basic/friendly/cockroach.dm
@@ -1,30 +1,33 @@
-/mob/living/simple_animal/cockroach
+/mob/living/basic/cockroach
name = "cockroach"
desc = "This station is just crawling with bugs."
icon_state = "cockroach"
icon_dead = "cockroach"
health = 1
maxHealth = 1
- turns_per_move = 5
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 270
- maxbodytemp = INFINITY
+ minimum_survivable_temperature = 270
+ maximum_survivable_temperature = INFINITY
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_biotypes = MOB_ORGANIC | MOB_BUG
mob_size = MOB_SIZE_TINY
- response_disarm = "shoos"
- response_harm = "splats"
+ ai_controller = /datum/ai_controller/basic_controller/cockroach
+ response_disarm_continuous = "shoos"
+ response_disarm_simple = "shoo"
+ response_harm_continuous = "splats"
+ response_harm_simple = "splat"
density = FALSE
ventcrawler = VENTCRAWLER_ALWAYS
gold_core_spawnable = FRIENDLY_SPAWN
- var/squish_chance = 50
loot = list(/obj/effect/decal/cleanable/insectguts)
- del_on_death = TRUE
+ basic_mob_flags = DEL_ON_DEATH
+ /// Chance to get squished
+ var/squish_chance = 50
-/mob/living/simple_animal/cockroach/can_die()
- return ..() && !SSticker.cinematic //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes.
+/mob/living/basic/cockroach/can_die()
+ return ..() && !SSticker.cinematic // If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes.
-/mob/living/simple_animal/cockroach/Initialize(mapload) //Lizards are a great way to deal with cockroaches
+/mob/living/basic/cockroach/Initialize(mapload) // Lizards are a great way to deal with cockroaches
. = ..()
ADD_TRAIT(src, TRAIT_EDIBLE_BUG, "edible_bug")
var/static/list/loc_connections = list(
@@ -32,7 +35,7 @@
)
AddElement(/datum/element/connect_loc, loc_connections)
-/mob/living/simple_animal/cockroach/proc/on_atom_entered(datum/source, atom/movable/entered)
+/mob/living/basic/cockroach/proc/on_atom_entered(datum/source, atom/movable/entered)
if(isliving(entered))
var/mob/living/A = entered
if(A.mob_size > MOB_SIZE_SMALL)
@@ -45,14 +48,28 @@
visible_message("As \the [entered] moved over \the [name], it was crushed.")
death()
-/mob/living/simple_animal/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach.
+/mob/living/basic/cockroach/ex_act() // Explosions are a terrible way to handle a cockroach.
return
-//mining pet
-/mob/living/simple_animal/cockroach/brad
+// mining pet
+/mob/living/basic/cockroach/brad
name = "Brad"
desc = "Lavaland's most resilient cockroach. Seeing this little guy walk through the wastes almost makes you wish for nuclear winter."
- response_help = "carefully pets"
+ response_help_continuous = "carefully pets"
+ response_help_simple = "carefully pet"
weather_immunities = list("ash")
- unique_pet = TRUE
gold_core_spawnable = NO_SPAWN
+
+/datum/ai_controller/basic_controller/cockroach
+ blackboard = list(
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ )
+ ai_traits = AI_FLAG_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/find_and_hunt_target/roach,
+ )
+
+/datum/ai_planning_subtree/find_and_hunt_target/roach
+ hunt_targets = list(/obj/effect/decal/cleanable/ants)
diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/basic/friendly/lizard.dm
similarity index 54%
rename from code/modules/mob/living/simple_animal/friendly/lizard.dm
rename to code/modules/mob/living/basic/friendly/lizard.dm
index bfb512190db..419246bc537 100644
--- a/code/modules/mob/living/simple_animal/friendly/lizard.dm
+++ b/code/modules/mob/living/basic/friendly/lizard.dm
@@ -1,4 +1,4 @@
-/mob/living/simple_animal/lizard
+/mob/living/basic/lizard
name = "lizard"
desc = "A cute tiny lizard."
icon = 'icons/mob/critter.dmi'
@@ -6,14 +6,20 @@
icon_living = "lizard"
icon_dead = "lizard-dead"
speak_emote = list("hisses")
- health = 5
- maxHealth = 5
- attacktext = "bites"
+ health = 10
+ maxHealth = 10
+ attack_verb_continuous = "bites"
+ attack_verb_simple = "bite"
+ attack_sound = 'sound/effects/bite.ogg'
melee_damage_lower = 1
melee_damage_upper = 2
- response_help = "pets"
- response_disarm = "shoos"
- response_harm = "stomps on"
+ ai_controller = /datum/ai_controller/basic_controller/lizard
+ response_help_continuous = "pets"
+ response_help_simple = "pet"
+ response_disarm_continuous = "shoos"
+ response_disarm_simple = "shoo"
+ response_harm_continuous = "stomps on"
+ response_harm_simple = "stomp on"
faction = list("neutral", "jungle")
ventcrawler = VENTCRAWLER_ALWAYS
density = FALSE
@@ -24,41 +30,39 @@
butcher_results = list(/obj/item/food/meat = 1)
mob_biotypes = MOB_ORGANIC | MOB_BEAST | MOB_REPTILE
gold_core_spawnable = FRIENDLY_SPAWN
- var/eating_sound = 'sound/weapons/bite.ogg'
+ /// List of stuff that we want to eat
+ var/static/list/edibles = list(
+ /mob/living/basic/butterfly,
+ /mob/living/basic/cockroach,
+ /obj/structure/spider/spiderling
+ )
/// Lizards start with a tail
var/has_tail = TRUE
-/mob/living/simple_animal/lizard/Initialize(mapload)
+/mob/living/basic/lizard/Initialize(mapload)
. = ..()
AddElement(/datum/element/wears_collar)
+ AddElement(/datum/element/basic_eating, heal_amt_ = 5, food_types_ = edibles)
+ ai_controller.set_blackboard_key(BB_BASIC_FOODS, typecacheof(edibles))
-/mob/living/simple_animal/lizard/handle_automated_action()
- if(stat == CONSCIOUS && !buckled)
- if(prob(1))
- custom_emote(EMOTE_VISIBLE, pick("sticks out its tongue.", "wags its tail.", "lies down."))
+/datum/ai_controller/basic_controller/lizard
+ blackboard = list(
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ )
+ ai_traits = AI_FLAG_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/find_food,
+ /datum/ai_planning_subtree/random_speech/lizard,
+ )
- if(!isturf(loc))
- return
- var/list/lizard_view = view(1, src)
- for(var/mob/living/M in lizard_view)
- if(M.stat == CONSCIOUS && Adjacent(M) && HAS_TRAIT(M, TRAIT_EDIBLE_BUG))
- custom_emote(EMOTE_VISIBLE, "eats \the [M]!")
- playsound(loc, eating_sound, 20, 1)
- M.death()
- break
- for(var/obj/structure/spider/spiderling/spider in lizard_view)
- if(Adjacent(spider) && HAS_TRAIT(spider, TRAIT_EDIBLE_BUG))
- if(prob(90)) // Slippery things aren't they?
- visible_message("The spiderling skitters away from the [src]!")
- spider.random_skitter()
- return
- else
- custom_emote(EMOTE_VISIBLE, "eats \the [spider]!")
- playsound(loc, eating_sound, 20, 1)
- qdel(spider)
- break
+/datum/ai_planning_subtree/random_speech/lizard // all of these have to be three words long or i'm killing you. you're dead.
+ speech_chance = 3
+ emote_hear = list("stamps around some.", "hisses a bit.")
+ emote_see = list("blehs the tongue.", "tilts the head.", "does a spin.")
-/mob/living/simple_animal/lizard/verb/lose_tail()
+/mob/living/basic/lizard/verb/lose_tail()
set name = "Lose tail"
set desc = "Allows you to lose your tail and escape a sticky situation. Takes 5 minutes for your tail to grow back."
set category = "Animal"
@@ -76,11 +80,11 @@
has_tail = FALSE
addtimer(CALLBACK(src, PROC_REF(new_tail)), 5 MINUTES)
-/mob/living/simple_animal/lizard/proc/new_tail()
+/mob/living/basic/lizard/proc/new_tail()
has_tail = TRUE
to_chat(src, "You regrow your tail!")
-/mob/living/simple_animal/lizard/decompile_act(obj/item/matter_decompiler/C, mob/user)
+/mob/living/basic/lizard/decompile_act(obj/item/matter_decompiler/C, mob/user)
if(!isdrone(user))
user.visible_message("[user] sucks [src] into its decompiler. There's a horrible crunching noise.", \
"It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.")
@@ -91,12 +95,11 @@
return TRUE
return ..()
-/mob/living/simple_animal/lizard/wags_his_tail
+/mob/living/basic/lizard/wags_his_tail
name = "Wags-His-Tail"
real_name = "Wags-His-Tail"
- unique_pet = TRUE
gold_core_spawnable = NO_SPAWN
-/mob/living/simple_animal/lizard/wags_his_tail/update_desc()
+/mob/living/basic/lizard/wags_his_tail/update_desc()
. = ..()
desc = "The official mascot of Janitalia."
diff --git a/code/modules/mob/living/basic/friendly/penguin.dm b/code/modules/mob/living/basic/friendly/penguin.dm
new file mode 100644
index 00000000000..bb491007dcf
--- /dev/null
+++ b/code/modules/mob/living/basic/friendly/penguin.dm
@@ -0,0 +1,90 @@
+// Penguins
+
+/mob/living/basic/pet/penguin
+ name = "penguin"
+ real_name = "penguin"
+ response_help_continuous = "pets"
+ response_help_simple = "pet"
+ response_disarm_continuous = "bops"
+ response_disarm_simple = "bop"
+ response_harm_continuous = "kicks"
+ response_harm_simple = "kick"
+ speak_emote = list("squawks", "gakkers")
+ faction = list("penguin")
+ ai_controller = /datum/ai_controller/basic_controller/penguin
+ see_in_dark = 5
+ icon = 'icons/mob/penguins.dmi'
+ step_type = FOOTSTEP_MOB_BAREFOOT
+
+/mob/living/basic/pet/penguin/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/wears_collar)
+ AddElement(/datum/element/waddling)
+
+/mob/living/basic/pet/penguin/emperor
+ name = "Emperor penguin"
+ desc = "Emperor of all he surveys."
+ icon_state = "penguin"
+ icon_living = "penguin"
+ icon_dead = "penguin_dead"
+ butcher_results = list()
+ gold_core_spawnable = FRIENDLY_SPAWN
+
+/mob/living/basic/pet/penguin/eldrich
+ name = "Albino penguin"
+ desc = "Found in the depths of mountains."
+ response_help_continuous = "taps"
+ response_help_simple = "tap"
+ response_disarm_continuous = "pokes"
+ response_disarm_simple = "poke"
+ response_harm_continuous = "flails at"
+ response_harm_simple = "flail at"
+ icon_state = "penguin_elder"
+ icon_living = "penguin_elder"
+ icon_dead = "penguin_dead"
+ faction = list("penguin", "cult")
+
+/mob/living/basic/pet/penguin/emperor/shamebrero
+ name = "Shamebrero penguin"
+ desc = "Shameful of all he surveys."
+ icon_state = "penguin_shamebrero"
+ icon_living = "penguin_shamebrero"
+ gold_core_spawnable = NO_SPAWN
+
+/mob/living/basic/pet/penguin/baby
+ name = "Penguin chick"
+ desc = "Can't fly and can barely waddles, but the prince of all chicks."
+ icon_state = "penguin_baby"
+ icon_living = "penguin_baby"
+ icon_dead = "penguin_baby_dead"
+ density = FALSE
+ pass_flags = PASSMOB
+
+/datum/ai_controller/basic_controller/penguin
+ blackboard = list(
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ )
+ ai_traits = AI_FLAG_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/find_nearest_thing_which_attacked_me_to_flee,
+ /datum/ai_planning_subtree/flee_target,
+ /datum/ai_planning_subtree/random_speech/penguin,
+ )
+
+/datum/ai_planning_subtree/random_speech/penguin
+ speech_chance = 5
+ speak = list("Gah Gah!", "NOOT NOOT!", "NOOT!", "Noot", "noot", "Prah!", "Grah!")
+ emote_hear = list("squawks", "gakkers")
+ emote_see = list("shakes its beak.", "flaps it's wings.", "preens itself.")
+
+/datum/ai_controller/basic_controller/penguin/eldrich
+ planning_subtrees = list(
+ /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee,
+ /datum/ai_planning_subtree/flee_target,
+ /datum/ai_planning_subtree/random_speech/penguin/eldrich,
+ )
+
+/datum/ai_planning_subtree/random_speech/penguin/eldrich
+ speak = list("Gah Gah!", "Tekeli-li! Tekeli-li!", "Tekeli-li!", "Teke", "li")
diff --git a/code/modules/mob/living/basic/friendly/sloth.dm b/code/modules/mob/living/basic/friendly/sloth.dm
new file mode 100644
index 00000000000..39210d199d3
--- /dev/null
+++ b/code/modules/mob/living/basic/friendly/sloth.dm
@@ -0,0 +1,55 @@
+/mob/living/basic/pet/sloth
+ name = "sloth"
+ desc = "An adorable, sleepy creature."
+ icon_state = "sloth"
+ icon_living = "sloth"
+ icon_dead = "sloth_dead"
+ gender = MALE
+ speak_emote = list("yawns")
+ faction = list("neutral", "jungle")
+ butcher_results = list(/obj/item/food/meat = 3)
+ 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"
+ ai_controller = /datum/ai_controller/basic_controller/sloth
+ gold_core_spawnable = FRIENDLY_SPAWN
+ melee_damage_upper = 5
+ health = 50
+ maxHealth = 50
+ speed = 2
+ step_type = FOOTSTEP_MOB_CLAW
+
+/mob/living/basic/pet/sloth/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/wears_collar)
+ AddElement(/datum/element/ai_retaliate)
+
+//IAA Sloth
+/mob/living/basic/pet/sloth/paperwork
+ name = "Paperwork"
+ desc = "Internal Affairs' pet sloth. About as useful as the rest of the agents."
+ gold_core_spawnable = NO_SPAWN
+
+/datum/ai_controller/basic_controller/sloth
+ blackboard = list(
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ )
+ ai_traits = AI_FLAG_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/target_retaliate/to_flee,
+ /datum/ai_planning_subtree/flee_target/from_flee_key,
+ /datum/ai_planning_subtree/random_speech/sloth,
+ )
+
+/datum/ai_planning_subtree/random_speech/sloth
+ speech_chance = 1
+ speak = list("Ahhhh")
+ emote_hear = list("snores.", "yawns.")
+ emote_see = list("dozes off.", "looks around sleepily.")
diff --git a/code/modules/mob/living/basic/friendly/snake.dm b/code/modules/mob/living/basic/friendly/snake.dm
new file mode 100644
index 00000000000..869c3d1b7a9
--- /dev/null
+++ b/code/modules/mob/living/basic/friendly/snake.dm
@@ -0,0 +1,72 @@
+/mob/living/basic/snake
+ name = "snake"
+ desc = "A slithery snake. These legless reptiles are the bane of mice and adventurers alike."
+ icon_state = "snake"
+ icon_living = "snake"
+ icon_dead = "snake_dead"
+ speak_emote = list("hisses")
+ health = 20
+ maxHealth = 20
+ attack_verb_continuous = "bites"
+ attack_verb_simple = "bite"
+ attack_sound = 'sound/effects/bite.ogg'
+ melee_damage_lower = 5
+ melee_damage_upper = 6
+ response_help_continuous = "pets"
+ response_help_simple = "pet"
+ response_disarm_continuous = "shoos"
+ response_disarm_simple = "shoo"
+ response_harm_continuous = "steps on"
+ response_harm_simple = "step on"
+ faction = list("hostile", "jungle")
+ ventcrawler = VENTCRAWLER_ALWAYS
+ density = FALSE
+ pass_flags = PASSTABLE | PASSMOB
+ mob_biotypes = MOB_ORGANIC | MOB_BEAST | MOB_REPTILE
+ mob_size = MOB_SIZE_SMALL
+ gold_core_spawnable = FRIENDLY_SPAWN
+
+ ai_controller = /datum/ai_controller/basic_controller/snake
+ /// How much poison?
+ var/poison_per_bite = 0
+ /// What poison
+ var/poison_type = "toxin"
+ /// List of stuff (mice) that we want to eat
+ var/static/list/edibles = list(
+ /mob/living/simple_animal/mouse,
+ )
+
+/mob/living/basic/snake/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/ai_retaliate)
+ AddElement(/datum/element/basic_eating, heal_amt_ = 2, food_types_ = edibles)
+ ai_controller.set_blackboard_key(BB_BASIC_FOODS, typecacheof(edibles))
+
+/mob/living/basic/snake/melee_attack(atom/target, list/modifiers, ignore_cooldown)
+ . = ..()
+ if(. && isliving(target))
+ var/mob/living/L = target
+ if(L.reagents && poison_per_bite > 0)
+ L.reagents.add_reagent(poison_type, poison_per_bite)
+
+/// 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/not_friends,
+ )
+ ai_traits = AI_FLAG_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/target_retaliate,
+ /datum/ai_planning_subtree/basic_melee_attack_subtree,
+ /datum/ai_planning_subtree/find_food,
+ /datum/ai_planning_subtree/random_speech/snake,
+ )
+
+/datum/ai_planning_subtree/random_speech/snake
+ speech_chance = 5
+ speak = list("hsssss", "sssSSsssss...", "hiisssss")
+ sound = list('sound/creatures/snake_hissing1.ogg', 'sound/creatures/snake_hissing2.ogg')
+ emote_hear = list("hisses.")
+ emote_see = list("slithers around.", "glances.", "stares.")
diff --git a/code/modules/mob/living/carbon/human/species/tajaran.dm b/code/modules/mob/living/carbon/human/species/tajaran.dm
index a2a95c8b926..003d4f2131e 100644
--- a/code/modules/mob/living/carbon/human/species/tajaran.dm
+++ b/code/modules/mob/living/carbon/human/species/tajaran.dm
@@ -44,7 +44,7 @@
unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
)
- allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/chick, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/hostile/poison/bees)
+ allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/chick, /mob/living/basic/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/hostile/poison/bees)
suicide_messages = list(
"is attempting to bite their tongue off!",
diff --git a/code/modules/mob/living/carbon/human/species/unathi.dm b/code/modules/mob/living/carbon/human/species/unathi.dm
index 7a9620aaaad..a86247eb1ad 100644
--- a/code/modules/mob/living/carbon/human/species/unathi.dm
+++ b/code/modules/mob/living/carbon/human/species/unathi.dm
@@ -48,8 +48,8 @@
"eyes" = /obj/item/organ/internal/eyes/unathi //3 darksight.
)
- allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken,
- /mob/living/simple_animal/crab, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/hostile/poison/bees)
+ allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/basic/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken,
+ /mob/living/simple_animal/crab, /mob/living/basic/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/hostile/poison/bees)
suicide_messages = list(
"is attempting to bite their tongue off!",
diff --git a/code/modules/mob/living/carbon/human/species/vulpkanin.dm b/code/modules/mob/living/carbon/human/species/vulpkanin.dm
index a6ba75e80e5..5238db6d9e7 100644
--- a/code/modules/mob/living/carbon/human/species/vulpkanin.dm
+++ b/code/modules/mob/living/carbon/human/species/vulpkanin.dm
@@ -38,8 +38,8 @@
unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
)
- allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken,
- /mob/living/simple_animal/crab, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/hostile/poison/bees)
+ allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/basic/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken,
+ /mob/living/simple_animal/crab, /mob/living/basic/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/hostile/poison/bees)
suicide_messages = list(
"is attempting to bite their tongue off!",
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 3da93373ced..f14de53f175 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -136,3 +136,8 @@
/// The toggle for if this creature should ignore the rolls for generic organs upon dissection
var/ignore_generic_organs = FALSE
+
+ /// Can this mob hide?
+ var/can_hide = FALSE
+ /// Allows a mob to pass unbolted doors while hidden
+ var/pass_door_while_hidden = FALSE
diff --git a/code/modules/mob/living/simple_animal/friendly/bunny.dm b/code/modules/mob/living/simple_animal/friendly/bunny.dm
deleted file mode 100644
index ff96383f425..00000000000
--- a/code/modules/mob/living/simple_animal/friendly/bunny.dm
+++ /dev/null
@@ -1,42 +0,0 @@
-/mob/living/simple_animal/bunny
- name = "bunny"
- real_name = "bunny"
- desc = "Awww a cute bunny."
- icon_state = "m_bunny"
- icon_living = "m_bunny"
- icon_dead = "bunny_dead"
- icon_resting = "bunny_stretch"
- emote_see = list("thumps", "sniffs at something", "hops around", "flips their ears up")
- faction = list("neutral", "jungle")
- turns_per_move = 5
- see_in_dark = 6
- maxHealth = 10
- health = 10
- butcher_results = list(/obj/item/food/meat = 1)
- response_help = "pets"
- response_disarm = "gently pushes aside"
- response_harm = "kicks"
- density = FALSE
- pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
- mob_biotypes = MOB_ORGANIC | MOB_BEAST
- mob_size = MOB_SIZE_TINY
- atmos_requirements = list("min_oxy" = 16, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 223 //Below -50 Degrees Celcius
- maxbodytemp = 323 //Above 50 Degrees Celcius
- can_hide = TRUE
- holder_type = /obj/item/holder/bunny
- gold_core_spawnable = FRIENDLY_SPAWN
- ventcrawler = VENTCRAWLER_ALWAYS
-
-/mob/living/simple_animal/bunny/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/wears_collar)
-
-/mob/living/simple_animal/bunny/attack_hand(mob/living/carbon/human/M)
- if(M.a_intent == INTENT_HELP)
- get_scooped(M, TRUE)
- ..()
-
-/mob/living/simple_animal/bunny/syndi // for the syndicake factory bunny so its not being shot
- faction = list("syndicate")
- gold_core_spawnable = NO_SPAWN
diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm
deleted file mode 100644
index 3fb7a6dfe8d..00000000000
--- a/code/modules/mob/living/simple_animal/friendly/penguin.dm
+++ /dev/null
@@ -1,65 +0,0 @@
-//Penguins
-
-/mob/living/simple_animal/pet/penguin
- name = "penguin"
- real_name = "penguin"
- response_help = "pets"
- response_disarm = "bops"
- response_harm = "kicks"
- speak = list("Gah Gah!", "NOOT NOOT!", "NOOT!", "Noot", "noot", "Prah!", "Grah!")
- speak_emote = list("squawks", "gakkers")
- emote_hear = list("squawk!", "gakkers!", "noots.","NOOTS!")
- emote_see = list("shakes its beak.", "flaps it's wings.","preens itself.")
- faction = list("penguin")
- see_in_dark = 5
- speak_chance = 1
- turns_per_move = 10
- icon = 'icons/mob/penguins.dmi'
- footstep_type = FOOTSTEP_MOB_BAREFOOT
-
-/mob/living/simple_animal/pet/penguin/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/wears_collar)
- AddElement(/datum/element/waddling)
-
-/mob/living/simple_animal/pet/penguin/emperor
- name = "Emperor penguin"
- desc = "Emperor of all he surveys."
- icon_state = "penguin"
- icon_living = "penguin"
- icon_dead = "penguin_dead"
- butcher_results = list()
- gold_core_spawnable = FRIENDLY_SPAWN
-
-/mob/living/simple_animal/pet/penguin/eldrich
- name = "Albino penguin"
- desc = "Found in the depths of mountains."
- response_help = "taps"
- response_disarm = "pokes"
- response_harm = "flails at"
- icon_state = "penguin_elder"
- icon_living = "penguin_elder"
- icon_dead = "penguin_dead"
- speak = list("Gah Gah!", "Tekeli-li! Tekeli-li!", "Tekeli-li!", "Teke", "li")
- speak_emote = list("gibbers", "gakkers")
- emote_hear = list("whistles!", "gakkers!")
- emote_see = list("shakes its beak.", "flaps it's wings.","preens itself.")
- faction = list("penguin", "cult")
-
-/mob/living/simple_animal/pet/penguin/emperor/shamebrero
- name = "Shamebrero penguin"
- desc = "Shameful of all he surveys."
- icon_state = "penguin_shamebrero"
- icon_living = "penguin_shamebrero"
- gold_core_spawnable = NO_SPAWN
- unique_pet = TRUE
-
-/mob/living/simple_animal/pet/penguin/baby
- speak = list("gah", "noot noot", "noot!", "noot", "squeee!", "noo!")
- name = "Penguin chick"
- desc = "Can't fly and can barely waddles, but the prince of all chicks."
- icon_state = "penguin_baby"
- icon_living = "penguin_baby"
- icon_dead = "penguin_baby_dead"
- density = FALSE
- pass_flags = PASSMOB
diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/simple_animal/friendly/sloth.dm
deleted file mode 100644
index 6046082fc87..00000000000
--- a/code/modules/mob/living/simple_animal/friendly/sloth.dm
+++ /dev/null
@@ -1,34 +0,0 @@
-/mob/living/simple_animal/pet/sloth
- name = "sloth"
- desc = "An adorable, sleepy creature."
- icon_state = "sloth"
- icon_living = "sloth"
- icon_dead = "sloth_dead"
- gender = MALE
- speak = list("Ahhhh")
- speak_emote = list("yawns")
- emote_hear = list("snores.","yawns.")
- emote_see = list("dozes off.", "looks around sleepily.")
- faction = list("neutral", "jungle")
- speak_chance = 1
- turns_per_move = 5
- butcher_results = list(/obj/item/food/meat = 3)
- response_help = "pets"
- response_disarm = "gently pushes aside"
- response_harm = "kicks"
- gold_core_spawnable = FRIENDLY_SPAWN
- health = 50
- maxHealth = 50
- speed = 2
- footstep_type = FOOTSTEP_MOB_CLAW
-
-/mob/living/simple_animal/pet/sloth/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/wears_collar)
-
-//IAA Sloth
-/mob/living/simple_animal/pet/sloth/paperwork
- name = "Paperwork"
- desc = "Internal Affairs' pet sloth. About as useful as the rest of the agents."
- unique_pet = TRUE
- gold_core_spawnable = NO_SPAWN
diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm
deleted file mode 100644
index 61b53ac184f..00000000000
--- a/code/modules/mob/living/simple_animal/friendly/snake.dm
+++ /dev/null
@@ -1,59 +0,0 @@
-/mob/living/simple_animal/hostile/retaliate/poison
- var/poison_per_bite = 0
- var/poison_type = "toxin"
-
-/mob/living/simple_animal/hostile/retaliate/poison/AttackingTarget()
- . = ..()
- if(. && isliving(target))
- var/mob/living/L = target
- if(L.reagents && !poison_per_bite == 0)
- L.reagents.add_reagent(poison_type, poison_per_bite)
-
-/mob/living/simple_animal/hostile/retaliate/poison/snake
- name = "snake"
- desc = "A slithery snake. These legless reptiles are the bane of mice and adventurers alike."
- icon_state = "snake"
- icon_living = "snake"
- icon_dead = "snake_dead"
- speak_emote = list("hisses")
- attacktext = "bites"
- melee_damage_lower = 5
- melee_damage_upper = 6
- response_help = "pets"
- response_disarm = "shoos"
- response_harm = "steps on"
- faction = list("hostile", "jungle")
- ventcrawler = VENTCRAWLER_ALWAYS
- density = FALSE
- pass_flags = PASSTABLE | PASSMOB
- mob_biotypes = MOB_ORGANIC | MOB_BEAST | MOB_REPTILE
- mob_size = MOB_SIZE_SMALL
- gold_core_spawnable = FRIENDLY_SPAWN
- obj_damage = 0
- environment_smash = ENVIRONMENT_SMASH_NONE
-
-
-/mob/living/simple_animal/hostile/retaliate/poison/snake/ListTargets(atom/the_target)
- . = oview(vision_range, targets_from) //get list of things in vision range
- var/list/living_mobs = list()
- var/list/mice = list()
- for(var/HM in .)
- //Yum a tasty mouse
- if(ismouse(HM))
- mice += HM
- if(isliving(HM))
- living_mobs += HM
-
- // if no tasty mice to chase, lets chase any living mob enemies in our vision range
- if(length(mice) == 0)
- //Filter living mobs (in range mobs) by those we consider enemies (retaliate behaviour)
- return living_mobs & enemies
- return mice
-
-/mob/living/simple_animal/hostile/retaliate/poison/snake/AttackingTarget()
- if(ismouse(target))
- visible_message("[name] consumes [target] in a single gulp!", "You consume [target] in a single gulp!")
- QDEL_NULL(target)
- adjustHealth(-2)
- else
- return ..()
diff --git a/code/modules/mob/living/simple_animal/hide_action.dm b/code/modules/mob/living/simple_animal/hide_action.dm
index b2de59d53fb..71c1e2ce630 100644
--- a/code/modules/mob/living/simple_animal/hide_action.dm
+++ b/code/modules/mob/living/simple_animal/hide_action.dm
@@ -7,19 +7,20 @@
button_icon_state = "mouse_gray_sleep"
/datum/action/innate/hide/Activate()
- var/mob/living/simple_animal/simplemob = owner
+ if(istype(owner, /mob/living))
+ var/mob/living/hiding_mob = owner
- if(owner.layer != layer_to_change_to)
- owner.layer = layer_to_change_to
- owner.visible_message("[owner] scurries to the ground!", "You are now hiding.")
- if(istype(simplemob) && simplemob.pass_door_while_hidden || isdrone(simplemob))
- simplemob.pass_flags |= PASSDOOR
- return
+ if(owner.layer != layer_to_change_to)
+ owner.layer = layer_to_change_to
+ owner.visible_message("[owner] scurries to the ground!", "You are now hiding.")
+ if(istype(hiding_mob) && hiding_mob.pass_door_while_hidden || isdrone(hiding_mob))
+ hiding_mob.pass_flags |= PASSDOOR
+ return
- simplemob.layer = layer_to_change_from
- owner.visible_message("[owner] slowly peeks up from the ground...", "You have stopped hiding.")
- if(istype(simplemob) && simplemob.pass_door_while_hidden || isdrone(simplemob))
- simplemob.pass_flags &= ~PASSDOOR
+ hiding_mob.layer = layer_to_change_from
+ owner.visible_message("[owner] slowly peeks up from the ground...", "You have stopped hiding.")
+ if(istype(hiding_mob) && hiding_mob.pass_door_while_hidden || isdrone(hiding_mob))
+ hiding_mob.pass_flags &= ~PASSDOOR
/datum/action/innate/hide/alien_larva_hide
desc = "Allows to hide beneath tables or certain items. Toggled on or off."
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index d0d02ad62c8..3ce3ca105c0 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -82,9 +82,6 @@
/// Higher speed is slower, negative speed is faster
var/speed = 1
- var/can_hide = FALSE
- /// Allows a mob to pass unbolted doors while hidden
- var/pass_door_while_hidden = FALSE
/// If the mob can be renamed
var/unique_pet = FALSE
diff --git a/code/modules/projectiles/projectile/magic_projectiles.dm b/code/modules/projectiles/projectile/magic_projectiles.dm
index bbb9117d219..d3b31286f50 100644
--- a/code/modules/projectiles/projectile/magic_projectiles.dm
+++ b/code/modules/projectiles/projectile/magic_projectiles.dm
@@ -211,14 +211,14 @@ GLOBAL_LIST_INIT(wabbajack_docile_animals, list(
"mouse" = /mob/living/simple_animal/mouse,
"chicken" = /mob/living/simple_animal/chicken,
"cow" = /mob/living/basic/cow,
- "lizard" = /mob/living/simple_animal/lizard,
+ "lizard" = /mob/living/basic/lizard,
"fox" = /mob/living/simple_animal/pet/dog/fox,
"chick" = /mob/living/simple_animal/chick,
"pug" = /mob/living/simple_animal/pet/dog/pug,
"turkey" = /mob/living/simple_animal/turkey,
"seal" = /mob/living/simple_animal/seal,
- "bunny" = /mob/living/simple_animal/bunny,
- "penguin" = /mob/living/simple_animal/pet/penguin/emperor,
+ "bunny" = /mob/living/basic/bunny,
+ "penguin" = /mob/living/basic/pet/penguin/emperor,
))
/proc/wabbajack(mob/living/M, force_borg = FALSE, force_animal = FALSE)
diff --git a/code/modules/research/strange_objects.dm b/code/modules/research/strange_objects.dm
index c9ebfc1b5f0..2215dec165f 100644
--- a/code/modules/research/strange_objects.dm
+++ b/code/modules/research/strange_objects.dm
@@ -51,9 +51,9 @@
/mob/living/simple_animal/pet/dog/fox,
/mob/living/simple_animal/mouse,
/mob/living/simple_animal/pet/dog/pug,
- /mob/living/simple_animal/lizard,
+ /mob/living/basic/lizard,
/mob/living/simple_animal/diona,
- /mob/living/simple_animal/butterfly,
+ /mob/living/basic/butterfly,
/mob/living/carbon/human/monkey,
)
@@ -125,12 +125,12 @@
var/list/valid_animals = list(
/mob/living/simple_animal/parrot,
- /mob/living/simple_animal/butterfly,
+ /mob/living/basic/butterfly,
/mob/living/simple_animal/pet/cat,
/mob/living/simple_animal/pet/dog/corgi,
/mob/living/simple_animal/crab,
/mob/living/simple_animal/pet/dog/fox,
- /mob/living/simple_animal/lizard,
+ /mob/living/basic/lizard,
/mob/living/simple_animal/mouse,
/mob/living/simple_animal/pet/dog/pug,
/mob/living/basic/bear/black,
diff --git a/paradise.dme b/paradise.dme
index ad8654c4737..2f7905363e8 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -2409,7 +2409,16 @@
#include "code\modules\mob\living\login.dm"
#include "code\modules\mob\living\stat_states.dm"
#include "code\modules\mob\living\taste.dm"
+#include "code\modules\mob\living\basic\basic_emotes.dm"
#include "code\modules\mob\living\basic\basic_mob.dm"
+#include "code\modules\mob\living\basic\friendly\basic_pet.dm"
+#include "code\modules\mob\living\basic\friendly\bunny.dm"
+#include "code\modules\mob\living\basic\friendly\butterfly.dm"
+#include "code\modules\mob\living\basic\friendly\cockroach.dm"
+#include "code\modules\mob\living\basic\friendly\lizard.dm"
+#include "code\modules\mob\living\basic\friendly\penguin.dm"
+#include "code\modules\mob\living\basic\friendly\sloth.dm"
+#include "code\modules\mob\living\basic\friendly\snake.dm"
#include "code\modules\mob\living\basic\posessed_object.dm"
#include "code\modules\mob\living\basic\farm_animals\cow.dm"
#include "code\modules\mob\living\basic\farm_animals\deer.dm"
@@ -2614,10 +2623,7 @@
#include "code\modules\mob\living\simple_animal\bot\mulebot.dm"
#include "code\modules\mob\living\simple_animal\bot\secbot.dm"
#include "code\modules\mob\living\simple_animal\bot\syndicate_bots.dm"
-#include "code\modules\mob\living\simple_animal\friendly\bunny.dm"
-#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm"
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
-#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm"
#include "code\modules\mob\living\simple_animal\friendly\corgi_stripping.dm"
#include "code\modules\mob\living\simple_animal\friendly\crab.dm"
#include "code\modules\mob\living\simple_animal\friendly\diona_nymph.dm"
@@ -2625,13 +2631,9 @@
#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm"
#include "code\modules\mob\living\simple_animal\friendly\fox.dm"
#include "code\modules\mob\living\simple_animal\friendly\friendly_emote.dm"
-#include "code\modules\mob\living\simple_animal\friendly\lizard.dm"
#include "code\modules\mob\living\simple_animal\friendly\mouse.dm"
#include "code\modules\mob\living\simple_animal\friendly\nian_caterpillar.dm"
-#include "code\modules\mob\living\simple_animal\friendly\penguin.dm"
#include "code\modules\mob\living\simple_animal\friendly\pet.dm"
-#include "code\modules\mob\living\simple_animal\friendly\sloth.dm"
-#include "code\modules\mob\living\simple_animal\friendly\snake.dm"
#include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm"
#include "code\modules\mob\living\simple_animal\hostile\alien_types.dm"
#include "code\modules\mob\living\simple_animal\hostile\angel_statue.dm"
diff --git a/sound/creatures/snake_hissing1.ogg b/sound/creatures/snake_hissing1.ogg
new file mode 100644
index 00000000000..17af4fb62e7
Binary files /dev/null and b/sound/creatures/snake_hissing1.ogg differ
diff --git a/sound/creatures/snake_hissing2.ogg b/sound/creatures/snake_hissing2.ogg
new file mode 100644
index 00000000000..5d91f66323c
Binary files /dev/null and b/sound/creatures/snake_hissing2.ogg differ
diff --git a/tools/UpdatePaths/Scripts/29815_batched_friendly_mob_basic.txt b/tools/UpdatePaths/Scripts/29815_batched_friendly_mob_basic.txt
new file mode 100644
index 00000000000..8131f4e7759
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/29815_batched_friendly_mob_basic.txt
@@ -0,0 +1,7 @@
+/mob/living/simple_animal/lizard/@SUBTYPES : /mob/living/basic/lizard/@SUBTYPES{@OLD}
+/mob/living/simple_animal/butterfly/@SUBTYPES : /mob/living/basic/butterfly/@SUBTYPES{@OLD}
+/mob/living/simple_animal/cockroach/@SUBTYPES : /mob/living/basic/cockroach/@SUBTYPES{@OLD}
+/mob/living/simple_animal/hostile/retaliate/poison/snake/@SUBTYPES : /mob/living/basic/snake/@SUBTYPES{@OLD}
+/mob/living/simple_animal/bunny/@SUBTYPES : /mob/living/basic/bunny/@SUBTYPES{@OLD}
+/mob/living/simple_animal/pet/penguin/@SUBTYPES : /mob/living/basic//pet/penguin/@SUBTYPES{@OLD}
+/mob/living/simple_animal/pet/sloth/@SUBTYPES : /mob/living/basic//pet/sloth/@SUBTYPES{@OLD}