From 49f61b14a9244a22f69d71d2ee51811e760c028f Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 18 Jul 2023 23:00:04 +0200 Subject: [PATCH] [MIRROR] make the pinguen a basic animal [MDB IGNORE] (#22568) * makes the pinguin a basic animal (#76790) ## About The Pull Request the penguin now is a basic animal and also now he can go and layed penguin eggs to make penguin babys also the baby have a new behavier he will now go and looked for his mom and when he found his mom he will went to her and be happy when he close to his mom or if he mom is died he will went to her body and he will be sad and also i putted this behavier in the baby chicken. also now the pinguen mom will go and looked for her eggs and when she find a egg she will putted it in the middile of her legs and walked with it ![penguin with a eggs](https://github.com/tgstation/tgstation/assets/138636438/e5f3d741-edc0-438f-b1b3-9e4ed2280532) ## Why It's Good For The Game the pinguen now is a advance ai ## Changelog the pinguen now have a more advance :cl: refactor: the penguin is a basic animal add: the penguin now layed eggs add: the penguin and the chicken babys will go look for adult penguin or chicken and be happy when he is near the adult /:cl: * make the pinguen a basic animal --------- Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com> --- _maps/RandomZLevels/SnowCabin.dmm | 4 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 66 +-- _maps/map_files/MetaStation/MetaStation.dmm | 400 +++++++++--------- _maps/map_files/NorthStar/north_star.dmm | 50 +-- _maps/shuttles/emergency_hugcage.dmm | 2 +- code/__DEFINES/ai.dm | 8 + code/_globalvars/phobias.dm | 4 +- .../basic_ai_behaviors/find_parent.dm | 28 ++ .../basic_mobs/basic_subtrees/find_parent.dm | 25 ++ .../basic_subtrees/speech_subtree.dm | 5 + code/game/objects/items/food/egg.dm | 4 + code/modules/explorer_drone/loot.dm | 7 +- code/modules/holodeck/holo_effect.dm | 6 +- .../basic/farm_animals/chicken/chick.dm | 15 + code/modules/mob/living/basic/pets/penguin.dm | 199 +++++++++ .../living/simple_animal/friendly/penguin.dm | 59 --- .../unit_tests/simple_animal_freeze.dm | 4 - icons/mob/simple/penguins.dmi | Bin 1721 -> 1828 bytes tgstation.dme | 4 +- tools/UpdatePaths/Scripts/76783_penguins.txt | 4 + 20 files changed, 563 insertions(+), 331 deletions(-) create mode 100644 code/datums/ai/basic_mobs/basic_ai_behaviors/find_parent.dm create mode 100644 code/datums/ai/basic_mobs/basic_subtrees/find_parent.dm create mode 100644 code/modules/mob/living/basic/pets/penguin.dm delete mode 100644 code/modules/mob/living/simple_animal/friendly/penguin.dm create mode 100644 tools/UpdatePaths/Scripts/76783_penguins.txt diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index 7f30781d18b..35c50499eab 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -2548,7 +2548,7 @@ /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) "jp" = ( -/mob/living/simple_animal/pet/penguin/baby, +/mob/living/basic/pet/penguin/baby/permanent, /turf/open/misc/ice/smooth, /area/awaymission/cabin/snowforest) "jq" = ( @@ -3561,7 +3561,7 @@ /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) "rH" = ( -/mob/living/simple_animal/pet/penguin/emperor, +/mob/living/basic/pet/penguin/emperor, /turf/open/misc/ice/smooth, /area/awaymission/cabin/snowforest) "so" = ( diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index e3a8fd63541..7e6cc7500c7 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -4302,6 +4302,21 @@ /obj/effect/mapping_helpers/airlock/access/all/science/robotics, /turf/open/floor/iron/white, /area/station/science/robotics/lab) +"bsN" = ( +/obj/structure/table, +/obj/item/storage/pill_bottle/mutadone{ + pixel_x = 11; + pixel_y = 7 + }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = 2 + }, +/obj/item/radio/headset/headset_medsci{ + pixel_x = -7; + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "bta" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -6434,6 +6449,14 @@ }, /turf/open/floor/glass/reinforced, /area/station/medical/treatment_center) +"bYO" = ( +/obj/item/toy/snowball{ + pixel_x = -6; + pixel_y = -3 + }, +/mob/living/basic/pet/penguin/baby/permanent, +/turf/open/misc/asteroid/snow/standard_air, +/area/station/science/research) "bYS" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21546,6 +21569,13 @@ /obj/effect/mapping_helpers/mail_sorting/supply/disposals, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"gPJ" = ( +/obj/structure/flora/grass/green/style_random, +/mob/living/basic/pet/penguin/emperor{ + name = "Club" + }, +/turf/open/misc/asteroid/snow/standard_air, +/area/station/science/research) "gPR" = ( /obj/effect/turf_decal/trimline/green/filled/warning, /obj/machinery/duct, @@ -23521,14 +23551,6 @@ "hyV" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/testlab) -"hyW" = ( -/obj/item/toy/snowball{ - pixel_x = -6; - pixel_y = -3 - }, -/mob/living/simple_animal/pet/penguin/baby, -/turf/open/misc/asteroid/snow/standard_air, -/area/station/science/research) "hyY" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -35298,13 +35320,6 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) -"lkP" = ( -/obj/structure/flora/grass/green/style_random, -/mob/living/simple_animal/pet/penguin/emperor{ - name = "Club" - }, -/turf/open/misc/asteroid/snow/standard_air, -/area/station/science/research) "lkS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/food/pie_smudge, @@ -66722,21 +66737,6 @@ /obj/structure/sign/warning/biohazard/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"vqV" = ( -/obj/structure/table, -/obj/item/storage/pill_bottle/mutadone{ - pixel_x = 11; - pixel_y = 7 - }, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = 2 - }, -/obj/item/radio/headset/headset_medsci{ - pixel_x = -7; - pixel_y = 6 - }, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "vqX" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 @@ -254073,7 +254073,7 @@ vvE tJG oHK goq -hyW +bYO kdJ usP wLl @@ -254331,7 +254331,7 @@ meg oHK pnq xsD -lkP +gPJ pvU wLl jUX @@ -256382,7 +256382,7 @@ tgB kKv fhb vAP -vqV +bsN sca gpj oQn diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index c6ac3972bd7..1deecacbeda 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -4988,6 +4988,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/garden) +"bSj" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "bSm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6306,14 +6312,6 @@ /obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"cuY" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/obj/effect/spawner/random/armory/disablers, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "cuZ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -7077,6 +7075,17 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet, /area/station/commons/dorms) +"cKN" = ( +/obj/structure/table/wood, +/obj/structure/cable, +/obj/item/storage/backpack/satchel/leather/withwallet{ + pixel_y = 4; + pixel_x = -1 + }, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "cLa" = ( /obj/structure/weightmachine, /obj/effect/turf_decal/tile/dark_red/half/contrasted, @@ -7866,14 +7875,6 @@ "daC" = ( /turf/open/floor/wood, /area/station/service/lawoffice) -"daO" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/spawner/random/armory/shotgun, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "daT" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/iron, @@ -8930,6 +8931,12 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) +"duy" = ( +/mob/living/basic/pet/penguin/baby/permanent{ + dir = 8 + }, +/turf/open/floor/grass, +/area/station/science/research) "duI" = ( /turf/closed/wall, /area/station/command/bridge) @@ -10128,6 +10135,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"dRX" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/effect/spawner/random/armory/riot_shield, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "dRY" = ( /obj/structure/chair/office, /obj/effect/landmark/start/hangover, @@ -14117,6 +14130,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/holding_cell) +"fnO" = ( +/obj/structure/rack, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/spawner/random/armory/e_gun, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "foP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14533,6 +14555,14 @@ }, /turf/open/floor/wood, /area/station/commons/dorms) +"fys" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/effect/spawner/random/armory/disablers, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "fyz" = ( /obj/structure/plasticflaps, /obj/machinery/conveyor{ @@ -18330,6 +18360,15 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"gTs" = ( +/obj/structure/rack, +/obj/machinery/light/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/effect/spawner/random/armory/riot_helmet, +/obj/effect/spawner/random/armory/bulletproof_helmet, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "gTt" = ( /turf/open/floor/carpet, /area/station/command/heads_quarters/hos) @@ -20048,15 +20087,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) -"hxF" = ( -/obj/structure/rack, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/spawner/random/armory/e_gun, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "hxV" = ( /obj/structure/chair, /obj/effect/turf_decal/stripes/line{ @@ -20291,12 +20321,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"hBR" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/obj/effect/spawner/random/armory/riot_shield, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "hBY" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -24866,6 +24890,14 @@ /obj/item/shard, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"jcc" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/spawner/random/armory/laser_gun, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "jcd" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31999,6 +32031,16 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) +"lFo" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/vending/cigarette, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "lFq" = ( /obj/structure/sign/warning/biohazard, /turf/closed/wall/r_wall, @@ -35751,18 +35793,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"mWD" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Head of Personnel's Office" - }, -/obj/structure/table/wood, -/obj/machinery/light/directional/south, -/obj/item/papercutter{ - pixel_x = -4 - }, -/obj/item/paper/fluff/ids_for_dummies, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "mWE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37730,6 +37760,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"nEf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/computer/order_console/cook{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "nEC" = ( /turf/open/floor/carpet, /area/station/command/bridge) @@ -37742,16 +37782,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"nEL" = ( -/obj/structure/table/wood, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "nEZ" = ( /obj/machinery/plate_press, /obj/effect/turf_decal/bot, @@ -37839,17 +37869,6 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/wood, /area/station/commons/lounge) -"nHn" = ( -/obj/structure/table/wood, -/obj/structure/cable, -/obj/item/storage/backpack/satchel/leather/withwallet{ - pixel_y = 4; - pixel_x = -1 - }, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "nHB" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40324,16 +40343,6 @@ /obj/item/radio/intercom/chapel/directional/west, /turf/open/floor/iron/dark, /area/station/service/chapel/office) -"oCg" = ( -/obj/machinery/light/directional/south, -/obj/machinery/computer/security/telescreen/minisat{ - dir = 1; - pixel_y = -29 - }, -/obj/structure/bed/dogbed/renault, -/mob/living/basic/pet/fox/renault, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) "oCw" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/neutral, @@ -40697,12 +40706,6 @@ "oIa" = ( /turf/closed/wall, /area/station/commons/vacant_room/commissary) -"oIb" = ( -/obj/machinery/modular_computer/preset/id{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "oId" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, @@ -44314,6 +44317,38 @@ }, /turf/open/floor/plating, /area/station/maintenance/central) +"qaN" = ( +/obj/structure/table/wood, +/obj/machinery/button/ticket_machine{ + pixel_x = 32 + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = 6; + pixel_y = -34 + }, +/obj/machinery/button/door/directional/south{ + id = "hop"; + name = "Privacy Shutters Control"; + pixel_x = -6; + req_access = list("hop") + }, +/obj/item/paper_bin/carbon{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stamp/head/hop{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/machinery/button/door/directional/south{ + id = "hopqueue"; + name = "Queue Shutters Control"; + pixel_x = -6; + pixel_y = -34; + req_access = list("hop") + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "qaP" = ( /obj/effect/turf_decal/plaque{ icon_state = "L3" @@ -45921,16 +45956,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"qGb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/computer/order_console/cook{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) "qGc" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -48743,16 +48768,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"rHj" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/burnt_floor, -/obj/machinery/vending/cigarette, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) "rHk" = ( /obj/structure/table/glass, /obj/item/folder/blue{ @@ -48891,6 +48906,18 @@ /obj/effect/mapping_helpers/airlock/access/all/service/theatre, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) +"rJr" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Head of Personnel's Office" + }, +/obj/structure/table/wood, +/obj/machinery/light/directional/south, +/obj/item/papercutter{ + pixel_x = -4 + }, +/obj/item/paper/fluff/ids_for_dummies, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "rJz" = ( /obj/machinery/light/small/directional/east, /obj/structure/cable, @@ -49358,14 +49385,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) -"rRf" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/obj/effect/spawner/random/armory/barrier_grenades, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "rRm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -51447,14 +51466,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"sDw" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/spawner/random/armory/laser_gun, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "sDC" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52946,12 +52957,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) -"tdS" = ( -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) "tdW" = ( /turf/closed/wall/r_wall, /area/station/security/execution/education) @@ -55237,6 +55242,14 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/command/bridge) +"tTP" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/effect/spawner/random/armory/barrier_grenades, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "tTT" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -56860,15 +56873,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/engineering/main) -"uwg" = ( -/obj/structure/rack, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/obj/effect/spawner/random/armory/riot_helmet, -/obj/effect/spawner/random/armory/bulletproof_helmet, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "uwh" = ( /obj/structure/chair/comfy{ dir = 1 @@ -57278,6 +57282,12 @@ }, /turf/open/floor/engine, /area/station/science/explab) +"uEn" = ( +/obj/machinery/light/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) "uEo" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -59487,6 +59497,16 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) +"vsU" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "vth" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -59585,6 +59605,16 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"vuN" = ( +/obj/machinery/light/directional/south, +/obj/machinery/computer/security/telescreen/minisat{ + dir = 1; + pixel_y = -29 + }, +/obj/structure/bed/dogbed/renault, +/mob/living/basic/pet/fox/renault, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) "vuP" = ( /obj/item/target/syndicate, /obj/structure/training_machine, @@ -60264,12 +60294,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"vHl" = ( -/mob/living/simple_animal/pet/penguin/baby{ - dir = 8 - }, -/turf/open/floor/grass, -/area/station/science/research) "vHs" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ @@ -62585,19 +62609,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"wya" = ( -/obj/structure/rack, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/obj/effect/spawner/random/armory/riot_armor, -/obj/effect/spawner/random/armory/bulletproof_armor, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "wyn" = ( /obj/machinery/hydroponics/soil, /obj/item/shovel/spade, @@ -63879,6 +63890,14 @@ /obj/effect/turf_decal/tile/purple/half/contrasted, /turf/open/floor/iron/white, /area/station/science/lobby) +"wXu" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/spawner/random/armory/shotgun, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "wXF" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/lesser) @@ -63948,38 +63967,6 @@ "wYB" = ( /turf/closed/wall, /area/station/hallway/secondary/service) -"wYG" = ( -/obj/structure/table/wood, -/obj/machinery/button/ticket_machine{ - pixel_x = 32 - }, -/obj/machinery/light_switch/directional/south{ - pixel_x = 6; - pixel_y = -34 - }, -/obj/machinery/button/door/directional/south{ - id = "hop"; - name = "Privacy Shutters Control"; - pixel_x = -6; - req_access = list("hop") - }, -/obj/item/paper_bin/carbon{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/stamp/head/hop{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/machinery/button/door/directional/south{ - id = "hopqueue"; - name = "Queue Shutters Control"; - pixel_x = -6; - pixel_y = -34; - req_access = list("hop") - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "wZe" = ( /obj/machinery/door/airlock/public/glass{ name = "Chapel Office" @@ -64023,6 +64010,19 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"wZO" = ( +/obj/structure/rack, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/effect/spawner/random/armory/riot_armor, +/obj/effect/spawner/random/armory/bulletproof_armor, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "wZU" = ( /obj/structure/chair/office{ dir = 4 @@ -90709,7 +90709,7 @@ oIa pJR oXT sRT -nEL +vsU gaU flu jbd @@ -90969,7 +90969,7 @@ kfA rWH oOE aVd -nHn +cKN mig wMx cMQ @@ -91483,7 +91483,7 @@ pJR pJR iiE rGj -mWD +rJr pJR oUB qRI @@ -91997,7 +91997,7 @@ pJR sGc mIl fJp -oIb +bSj mig wMx qRI @@ -92511,7 +92511,7 @@ pJR lJn psy htG -wYG +qaN pJR uwC ndS @@ -93498,7 +93498,7 @@ dxe wTO xxZ anl -uwg +gTs apJ lDe qGQ @@ -93755,7 +93755,7 @@ wrb uQK dPL aeq -wya +wZO apJ lDe qGQ @@ -94012,7 +94012,7 @@ aeq aeq aeq aeq -hBR +dRX riY aeq qid @@ -94266,8 +94266,8 @@ aaa aeq xCo dAr -rRf -cuY +tTP +fys tgy agc apM @@ -95037,10 +95037,10 @@ aaa aaa aeq wzF -sDw +jcc eew -hxF -daO +fnO +wXu kaC anl vDh @@ -97910,7 +97910,7 @@ jxv sqJ gPA lZM -oCg +vuN syo lSz vQe @@ -105140,7 +105140,7 @@ nTU kjO wXF tAQ -vHl +duy vkq hQY xGD @@ -105887,8 +105887,8 @@ glP deX rJk ofe -qGb -tdS +nEf +uEn aBM unL lPy @@ -106401,7 +106401,7 @@ ggM gIS xNG gYV -rHj +lFo qpn tHk unL diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 42160241d83..ed84e4c856c 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -2549,6 +2549,13 @@ }, /turf/open/floor/pod, /area/station/maintenance/floor4/port/fore) +"aGj" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/stripes/white/line, +/obj/machinery/bci_implanter, +/turf/open/floor/iron/dark, +/area/station/science/circuits) "aGm" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -20899,13 +20906,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"fum" = ( -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/stripes/white/line, -/obj/machinery/bci_implanter, -/turf/open/floor/iron/dark, -/area/station/science/circuits) "fuq" = ( /obj/structure/closet/wardrobe/grey, /obj/effect/decal/cleanable/cobweb, @@ -23566,13 +23566,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/white/herringbone, /area/station/medical/patients_rooms) -"gdd" = ( -/mob/living/simple_animal/pet/penguin/emperor{ - desc = "Spaghetti."; - name = "Spaghetti" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "gdg" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -55497,14 +55490,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) -"onY" = ( -/mob/living/simple_animal/pet/penguin/baby{ - dir = 8 - }, -/turf/open/floor/fake_snow{ - icon_state = "snow6" - }, -/area/station/hallway/floor2/fore) "ool" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66563,6 +66548,13 @@ /obj/machinery/computer/records/medical, /turf/open/floor/iron/dark/textured, /area/station/medical/paramedic) +"rme" = ( +/mob/living/basic/pet/penguin/emperor{ + desc = "Spaghetti."; + name = "Spaghetti" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "rmm" = ( /obj/structure/table, /obj/machinery/camera/autoname/directional/north, @@ -72032,6 +72024,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/floor2/starboard/aft) +"sQd" = ( +/mob/living/basic/pet/penguin/baby/permanent{ + dir = 8 + }, +/turf/open/floor/fake_snow{ + icon_state = "snow6" + }, +/area/station/hallway/floor2/fore) "sQj" = ( /obj/structure/table, /obj/item/gun/energy/laser/practice{ @@ -132877,7 +132877,7 @@ wMy xFJ ams fbt -gdd +rme lBo pyS gdg @@ -176577,7 +176577,7 @@ vNO vNO ocU wwu -onY +sQd eNM skU aiR @@ -181190,7 +181190,7 @@ dfD uea ctI xuv -fum +aGj hKm qTK ifA diff --git a/_maps/shuttles/emergency_hugcage.dmm b/_maps/shuttles/emergency_hugcage.dmm index 596b9158149..80211ed6092 100644 --- a/_maps/shuttles/emergency_hugcage.dmm +++ b/_maps/shuttles/emergency_hugcage.dmm @@ -111,7 +111,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "hH" = ( -/mob/living/simple_animal/pet/penguin/baby, +/mob/living/basic/pet/penguin/baby/permanent, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "iI" = ( diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm index 8da69d6945c..bf8e525a623 100644 --- a/code/__DEFINES/ai.dm +++ b/code/__DEFINES/ai.dm @@ -284,6 +284,14 @@ ///Current partner target #define BB_BABIES_TARGET "BB_babies_target" +///Finding adult mob +///key holds the adult we found +#define BB_FOUND_MOM "BB_found_mom" +///list of types of mobs we will look for +#define BB_FIND_MOM_TYPES "BB_find_mom_types" +///list of types of mobs we must ignore +#define BB_IGNORE_MOM_TYPES "BB_ignore_mom_types" + // Bileworm AI keys #define BB_BILEWORM_SPEW_BILE "BB_bileworm_spew_bile" diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index acb67ee6437..3338494714c 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -59,13 +59,13 @@ GLOBAL_LIST_INIT(phobia_mobs, list( "birds" = typecacheof(list( /mob/living/basic/chick, /mob/living/basic/chicken, + /mob/living/basic/pet/penguin, /mob/living/simple_animal/parrot, - /mob/living/simple_animal/pet/penguin, )), "conspiracies" = typecacheof(list( /mob/living/simple_animal/bot/secbot, /mob/living/simple_animal/drone, - /mob/living/simple_animal/pet/penguin, + /mob/living/basic/pet/penguin, )), "doctors" = typecacheof(list(/mob/living/simple_animal/bot/medbot)), "insects" = typecacheof(list( 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 new file mode 100644 index 00000000000..9e4ccef4936 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/find_parent.dm @@ -0,0 +1,28 @@ +/datum/ai_behavior/find_mom + ///range to look for the mom + 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)) + finish_action(controller, FALSE) + return + + for(var/mob/mother in oview(look_range, living_pawn)) + if(!is_type_in_list(mother, mom_types)) + continue + if(is_type_in_list(mother, ignore_types)) //so the not permanent baby and the permanent baby subtype dont followed each other + continue + all_moms += mother + + if(length(all_moms)) + controller.set_blackboard_key(found_mom, pick(all_moms)) + finish_action(controller, TRUE) + return + finish_action(controller, FALSE) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/find_parent.dm b/code/datums/ai/basic_mobs/basic_subtrees/find_parent.dm new file mode 100644 index 00000000000..2c65dfbb6a9 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/find_parent.dm @@ -0,0 +1,25 @@ +/datum/ai_planning_subtree/look_for_adult + ///how far we must be from the mom + var/minimum_distance = 1 + +/datum/ai_planning_subtree/look_for_adult/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/target = controller.blackboard[BB_FOUND_MOM] + var/mob/baby = controller.pawn + + if(QDELETED(target)) + controller.queue_behavior(/datum/ai_behavior/find_mom, BB_FIND_MOM_TYPES, BB_IGNORE_MOM_TYPES, BB_FOUND_MOM) + return + + if(get_dist(target, baby) > minimum_distance) + controller.queue_behavior(/datum/ai_behavior/travel_towards, BB_FOUND_MOM) + return SUBTREE_RETURN_FINISH_PLANNING + + if(!SPT_PROB(15, seconds_per_tick)) + return + + if(target.stat == DEAD) + controller.queue_behavior(/datum/ai_behavior/perform_emote, "cries for their parent!") + else + controller.queue_behavior(/datum/ai_behavior/perform_emote, "dances around their parent!") + + return SUBTREE_RETURN_FINISH_PLANNING 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 b9a63466d1f..6052a1d7aa2 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm @@ -175,3 +175,8 @@ emote_hear = list("howls.", "barks.", "screams.") emote_see = list("shakes their head.", "shivers.") speak = list("Ack-Ack", "Ack-Ack-Ack-Ackawoooo", "Geckers", "Awoo", "Tchoff") + +/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") diff --git a/code/game/objects/items/food/egg.dm b/code/game/objects/items/food/egg.dm index a93ba6e3cd1..fe4cb1fd8dd 100644 --- a/code/game/objects/items/food/egg.dm +++ b/code/game/objects/items/food/egg.dm @@ -162,6 +162,10 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) icon_state = "egg-yellow" inhand_icon_state = "egg-yellow" +/obj/item/food/egg/penguin_egg + icon = 'icons/mob/simple/penguins.dmi' + icon_state = "penguin_egg" + /obj/item/food/egg/fertile name = "fertile-looking egg" desc = "An egg! It looks fertilized.\nQuite how you can tell this just by looking at it is a mystery." diff --git a/code/modules/explorer_drone/loot.dm b/code/modules/explorer_drone/loot.dm index ccb7d433d9a..78b224c852e 100644 --- a/code/modules/explorer_drone/loot.dm +++ b/code/modules/explorer_drone/loot.dm @@ -95,7 +95,12 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) /datum/adventure_loot_generator/pet id = "pets" var/carrier_type = /obj/item/pet_carrier/biopod - var/list/possible_pets = list(/mob/living/simple_animal/pet/cat/space,/mob/living/basic/pet/dog/corgi,/mob/living/simple_animal/pet/penguin/baby,/mob/living/basic/pet/dog/pug) + var/list/possible_pets = list( + /mob/living/basic/pet/dog/corgi, + /mob/living/basic/pet/dog/pug, + /mob/living/basic/pet/penguin/baby, + /mob/living/simple_animal/pet/cat/space, + ) /datum/adventure_loot_generator/pet/generate() var/obj/item/pet_carrier/carrier = new carrier_type() diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm index 4660636e94d..a3992a9fcef 100644 --- a/code/modules/holodeck/holo_effect.dm +++ b/code/modules/holodeck/holo_effect.dm @@ -104,15 +104,15 @@ mobtype = /mob/living/simple_animal/holodeck_monkey /obj/effect/holodeck_effect/mobspawner/penguin - mobtype = /mob/living/simple_animal/pet/penguin/emperor + mobtype = /mob/living/basic/pet/penguin/emperor/neuter /obj/effect/holodeck_effect/mobspawner/penguin/Initialize(mapload) if(prob(1)) - mobtype = /mob/living/simple_animal/pet/penguin/emperor/shamebrero + mobtype = /mob/living/basic/pet/penguin/emperor/shamebrero/neuter return ..() /obj/effect/holodeck_effect/mobspawner/penguin_baby - mobtype = /mob/living/simple_animal/pet/penguin/baby + mobtype = /mob/living/basic/pet/penguin/baby/permanent /obj/effect/holodeck_effect/mobspawner/crab/jon mobtype = /mob/living/simple_animal/crab/jon diff --git a/code/modules/mob/living/basic/farm_animals/chicken/chick.dm b/code/modules/mob/living/basic/farm_animals/chicken/chick.dm index 339b2c5e7f5..311b311e8fd 100644 --- a/code/modules/mob/living/basic/farm_animals/chicken/chick.dm +++ b/code/modules/mob/living/basic/farm_animals/chicken/chick.dm @@ -28,6 +28,7 @@ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY gold_core_spawnable = FRIENDLY_SPAWN + ai_controller = /datum/ai_controller/basic_controller/chick /// What we grow into. var/grow_as = /mob/living/basic/chicken @@ -62,3 +63,17 @@ /// Variant of chick that just spawns in the holodeck so you can pet it. Doesn't grow up. /mob/living/basic/chick/permanent grow_as = null + +/datum/ai_controller/basic_controller/chick + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_FIND_MOM_TYPES = list(/mob/living/basic/chicken), + ) + + 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/look_for_adult, + ) diff --git a/code/modules/mob/living/basic/pets/penguin.dm b/code/modules/mob/living/basic/pets/penguin.dm new file mode 100644 index 00000000000..35abc784e37 --- /dev/null +++ b/code/modules/mob/living/basic/pets/penguin.dm @@ -0,0 +1,199 @@ +/mob/living/basic/pet/penguin + + icon = 'icons/mob/simple/penguins.dmi' + gender = FEMALE + + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "bops" + response_disarm_simple = "bop" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + + faction = list(FACTION_NEUTRAL) + ai_controller = /datum/ai_controller/basic_controller/penguin + ///it can lay an egg? + var/can_lay_eggs = TRUE + ///the egg it carries + var/obj/carried_egg + + +/mob/living/basic/pet/penguin/Initialize(mapload) + . = ..() + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/ai_flee_while_injured) + AddElement(/datum/element/pet_bonus, "honks happily!") + AddElement(/datum/element/waddling) + if(!can_lay_eggs) + return + AddComponent(\ + /datum/component/egg_layer,\ + /obj/item/food/egg/penguin_egg,\ + list(/obj/item/food/fishmeat),\ + lay_messages = EGG_LAYING_MESSAGES,\ + eggs_left = 0,\ + eggs_added_from_eating = 1,\ + max_eggs_held = 1,\ + egg_laid_callback = CALLBACK(src, PROC_REF(lay_penguin_egg)),\ + ) + +/mob/living/basic/pet/penguin/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + . = ..() + if(!.) + return + + if(!proximity_flag) + return + if(!istype(attack_target, /obj/item/food/egg/penguin_egg)) + return + + remove_egg() //to check if we already have a egg + var/obj/item/egg_target = attack_target + egg_target.forceMove(src) + carried_egg = attack_target + add_overlay("penguin_egg_overlay") + RegisterSignal(egg_target, COMSIG_QDELETING, PROC_REF(on_hatch_egg)) + +/mob/living/basic/pet/penguin/death(gibbed) + . = ..() + remove_egg() + +/mob/living/basic/pet/penguin/proc/lay_penguin_egg(obj/item/penguin_egg) + if(prob(35)) + penguin_egg.AddComponent(\ + /datum/component/fertile_egg,\ + embryo_type = /mob/living/basic/pet/penguin/baby,\ + minimum_growth_rate = 1,\ + maximum_growth_rate = 2,\ + total_growth_required = 400,\ + current_growth = 0,\ + location_allowlist = typecacheof(list(/turf, /mob/living/basic/pet/penguin)),\ + ) + +/mob/living/basic/pet/penguin/proc/on_hatch_egg() + SIGNAL_HANDLER + remove_egg() + +/mob/living/basic/pet/penguin/proc/remove_egg() + if(isnull(carried_egg)) + return + carried_egg.forceMove(get_turf(src)) + UnregisterSignal(carried_egg, COMSIG_QDELETING) + carried_egg = null + cut_overlay("penguin_egg_overlay") + +/datum/ai_controller/basic_controller/penguin + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + ) + + 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/find_nearest_thing_which_attacked_me_to_flee, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/find_and_hunt_target/penguin_egg, + /datum/ai_planning_subtree/random_speech/penguin, + ) + +/datum/ai_planning_subtree/find_and_hunt_target/penguin_egg + target_key = BB_LOW_PRIORITY_HUNTING_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/penguin_egg + finding_behavior = /datum/ai_behavior/find_hunt_target/penguin_egg + hunt_targets = list(/obj/item/food/egg/penguin_egg) + hunt_range = 7 + +/datum/ai_behavior/find_hunt_target/penguin_egg/valid_dinner(mob/living/source, atom/dinner, radius) + return can_see(source, dinner, radius) && !(dinner in source.contents) +/datum/ai_behavior/hunt_target/penguin_egg + hunt_cooldown = 15 SECONDS + always_reset_target = TRUE + +/datum/ai_behavior/hunt_target/penguin_egg/target_caught(mob/living/basic/hunter, obj/item/food/egg/target) + hunter.UnarmedAttack(target, TRUE) + +/mob/living/basic/pet/penguin/emperor + name = "emperor penguin" + real_name = "penguin" + desc = "Emperor of all she surveys." + icon_state = "penguin" + icon_living = "penguin" + icon_dead = "penguin_dead" + gold_core_spawnable = FRIENDLY_SPAWN + +/mob/living/basic/pet/penguin/emperor/neuter + can_lay_eggs = FALSE + +/mob/living/basic/pet/penguin/emperor/shamebrero + name = "shamebrero penguin" + icon_state = "penguin_shamebrero" + icon_living = "penguin_shamebrero" + gold_core_spawnable = NO_SPAWN + unique_pet = TRUE + +/mob/living/basic/pet/penguin/emperor/shamebrero/neuter + can_lay_eggs = FALSE + +/mob/living/basic/pet/penguin/baby + name = "penguin chick" + real_name = "penguin" + desc = "Can't fly and barely waddles, yet the prince of all chicks." + icon_state = "penguin_baby" + icon_living = "penguin_baby" + icon_dead = "penguin_baby_dead" + density = FALSE + pass_flags = PASSMOB + mob_size = MOB_SIZE_SMALL + butcher_results = list(/obj/item/organ/internal/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 1) + ai_controller = /datum/ai_controller/basic_controller/penguin/baby + can_lay_eggs = FALSE + ///will it grow up? + var/can_grow_up = TRUE + + +/mob/living/basic/pet/penguin/baby/Initialize(mapload) + . = ..() + if(!can_grow_up) + return + var/list/weight_mobtypes = list( + /mob/living/basic/pet/penguin/emperor = 5, + /mob/living/basic/pet/penguin/emperor/shamebrero = 1, + ) + var/grown_type = pick_weight(weight_mobtypes) + AddComponent(\ + /datum/component/growth_and_differentiation,\ + growth_time = null,\ + growth_path = grown_type,\ + growth_probability = 100,\ + lower_growth_value = 0.5,\ + upper_growth_value = 1,\ + signals_to_kill_on = list(COMSIG_MOB_CLIENT_LOGIN),\ + optional_checks = CALLBACK(src, PROC_REF(ready_to_grow)),\ + ) + +/mob/living/basic/pet/penguin/baby/proc/ready_to_grow() + return (stat == CONSCIOUS) + +/datum/ai_controller/basic_controller/penguin/baby + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_FIND_MOM_TYPES = list(/mob/living/basic/pet/penguin), + BB_IGNORE_MOM_TYPES = list(/mob/living/basic/pet/penguin/baby), + ) + + 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/find_nearest_thing_which_attacked_me_to_flee, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/look_for_adult, + ) + +/mob/living/basic/pet/penguin/baby/permanent + can_grow_up = FALSE + + 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 151731e4849..00000000000 --- a/code/modules/mob/living/simple_animal/friendly/penguin.dm +++ /dev/null @@ -1,59 +0,0 @@ -//Penguins - -/mob/living/simple_animal/pet/penguin - gender = MALE - 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 = 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 his beak.", "flaps his wings.","preens himself.") - faction = list(FACTION_PENGUIN) - minbodytemp = 0 - speak_chance = 1 - turns_per_move = 10 - icon = 'icons/mob/simple/penguins.dmi' - butcher_results = list(/obj/item/organ/internal/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 3) - - footstep_type = FOOTSTEP_MOB_BAREFOOT - -/mob/living/simple_animal/pet/penguin/Initialize(mapload) - . = ..() - AddElement(/datum/element/pet_bonus, "honks happily!") - AddElement(/datum/element/waddling) - -/mob/living/simple_animal/pet/penguin/emperor - name = "Emperor penguin" - real_name = "penguin" - desc = "Emperor of all he surveys." - icon_state = "penguin" - icon_living = "penguin" - icon_dead = "penguin_dead" - gold_core_spawnable = FRIENDLY_SPAWN - butcher_results = list(/obj/item/organ/internal/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 3) - -/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" - real_name = "penguin" - desc = "Can't fly and barely waddles, yet the prince of all chicks." - icon_state = "penguin_baby" - icon_living = "penguin_baby" - icon_dead = "penguin_baby_dead" - density = FALSE - pass_flags = PASSMOB - mob_size = MOB_SIZE_SMALL - butcher_results = list(/obj/item/organ/internal/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 1) - diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index 9a598747708..9c41816a413 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -271,10 +271,6 @@ /mob/living/simple_animal/pet/cat/space, /mob/living/simple_animal/pet/gondola, /mob/living/simple_animal/pet/gondola/gondolapod, - /mob/living/simple_animal/pet/penguin, - /mob/living/simple_animal/pet/penguin/baby, - /mob/living/simple_animal/pet/penguin/emperor, - /mob/living/simple_animal/pet/penguin/emperor/shamebrero, /mob/living/simple_animal/revenant, /mob/living/simple_animal/robot_customer, /mob/living/simple_animal/shade, diff --git a/icons/mob/simple/penguins.dmi b/icons/mob/simple/penguins.dmi index c7417f89b4a222138066ff88c4ed9ad560134be3..23f20619a7aebe2f55735e3d7dfdd50d8ca94af2 100644 GIT binary patch delta 1720 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 KMNUMnLSTYA-XSvp diff --git a/tgstation.dme b/tgstation.dme index 1739305e770..700476529ac 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -848,6 +848,7 @@ #include "code\datums\ai\bane\bane_subtrees.dm" #include "code\datums\ai\basic_mobs\base_basic_controller.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\basic_attacking.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\find_parent.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\nearest_targetting.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\pick_up_item.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\run_away_from_target.dm" @@ -862,6 +863,7 @@ #include "code\datums\ai\basic_mobs\basic_subtrees\attack_obstacle_in_path.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\find_food.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\find_paper_and_write.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\find_parent.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\flee_target.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\opportunistic_ventcrawler.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\simple_attack_target.dm" @@ -4125,6 +4127,7 @@ #include "code\modules\mob\living\basic\lavaland\goliath\tentacle.dm" #include "code\modules\mob\living\basic\pets\dog.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\ruin_defender\stickman.dm" #include "code\modules\mob\living\basic\space_fauna\ant.dm" @@ -4347,7 +4350,6 @@ #include "code\modules\mob\living\simple_animal\friendly\crab.dm" #include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" #include "code\modules\mob\living\simple_animal\friendly\gondola.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\robot_customer.dm" #include "code\modules\mob\living\simple_animal\friendly\sloth.dm" diff --git a/tools/UpdatePaths/Scripts/76783_penguins.txt b/tools/UpdatePaths/Scripts/76783_penguins.txt new file mode 100644 index 00000000000..d810967c352 --- /dev/null +++ b/tools/UpdatePaths/Scripts/76783_penguins.txt @@ -0,0 +1,4 @@ +/mob/living/simple_animal/pet/penguin : /mob/living/basic/pet/penguin{@OLD} +/mob/living/simple_animal/pet/penguin/emperor : /mob/living/basic/pet/penguin/emperor{@OLD} +/mob/living/simple_animal/pet/penguin/emperor/shamebrero : /mob/living/basic/pet/penguin/emperor/shamebrero{@OLD} +/mob/living/simple_animal/pet/penguin/baby : /mob/living/basic/pet/penguin/baby/permanent{@OLD} \ No newline at end of file