From b06e940341ec3d548da7f69b726bf0eebceb0c36 Mon Sep 17 00:00:00 2001 From: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com> Date: Tue, 18 Jul 2023 22:03:00 +0300 Subject: [PATCH] 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: --- _maps/RandomZLevels/SnowCabin.dmm | 4 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 4 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- _maps/map_files/NorthStar/north_star.dmm | 4 +- _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, 310 insertions(+), 78 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 abca59e2741..ba9ff6699ca 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -23541,7 +23541,7 @@ pixel_x = -6; pixel_y = -3 }, -/mob/living/simple_animal/pet/penguin/baby, +/mob/living/basic/pet/penguin/baby/permanent, /turf/open/misc/asteroid/snow/standard_air, /area/station/science/research) "hyY" = ( @@ -35315,7 +35315,7 @@ /area/station/command/bridge) "lkP" = ( /obj/structure/flora/grass/green/style_random, -/mob/living/simple_animal/pet/penguin/emperor{ +/mob/living/basic/pet/penguin/emperor{ name = "Club" }, /turf/open/misc/asteroid/snow/standard_air, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index f1e24677530..ef101087774 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -60289,7 +60289,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "vHl" = ( -/mob/living/simple_animal/pet/penguin/baby{ +/mob/living/basic/pet/penguin/baby/permanent{ dir = 8 }, /turf/open/floor/grass, diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 43f3ad23dc0..d5f0b9e78c7 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -23567,7 +23567,7 @@ /turf/open/floor/iron/white/herringbone, /area/station/medical/patients_rooms) "gdd" = ( -/mob/living/simple_animal/pet/penguin/emperor{ +/mob/living/basic/pet/penguin/emperor{ desc = "Spaghetti."; name = "Spaghetti" }, @@ -55498,7 +55498,7 @@ /turf/open/floor/iron/white, /area/station/science/lobby) "onY" = ( -/mob/living/simple_animal/pet/penguin/baby{ +/mob/living/basic/pet/penguin/baby/permanent{ dir = 8 }, /turf/open/floor/fake_snow{ 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 2368a452680..4a59a09fbc4 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -270,10 +270,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 f3c4364e770..ba315093987 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -766,6 +766,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" @@ -780,6 +781,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" @@ -4053,6 +4055,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" @@ -4276,7 +4279,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