From 7c008bbc1b1b612725792d23b536ecd1d13f7e24 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 22 Oct 2024 18:17:27 +1100 Subject: [PATCH] Adding various trained birds to Pyrelight. --- code/controllers/subsystems/throwing.dm | 6 +- code/game/atoms_movable.dm | 2 +- code/game/objects/items/__item.dm | 2 +- code/modules/mob_holder/_holder.dm | 15 +++-- mods/pyrelight/_pyrelight.dme | 6 ++ mods/pyrelight/icons/mobs/crow.dmi | Bin 0 -> 2780 bytes mods/pyrelight/icons/mobs/hawk.dmi | Bin 0 -> 6247 bytes mods/pyrelight/icons/mobs/pigeon.dmi | Bin 0 -> 3090 bytes mods/pyrelight/icons/structures/aviary.dmi | Bin 0 -> 718 bytes mods/pyrelight/icons/structures/hutch.dmi | Bin 0 -> 641 bytes mods/pyrelight/mobs/birds/_bird.dm | 38 +++++++++++ mods/pyrelight/mobs/birds/crow.dm | 9 +++ mods/pyrelight/mobs/birds/hawk.dm | 16 +++++ mods/pyrelight/mobs/birds/pigeon.dm | 9 +++ mods/pyrelight/structures/aviary.dm | 73 +++++++++++++++++++++ 15 files changed, 165 insertions(+), 11 deletions(-) create mode 100644 mods/pyrelight/icons/mobs/crow.dmi create mode 100644 mods/pyrelight/icons/mobs/hawk.dmi create mode 100644 mods/pyrelight/icons/mobs/pigeon.dmi create mode 100644 mods/pyrelight/icons/structures/aviary.dmi create mode 100644 mods/pyrelight/icons/structures/hutch.dmi create mode 100644 mods/pyrelight/mobs/birds/_bird.dm create mode 100644 mods/pyrelight/mobs/birds/crow.dm create mode 100644 mods/pyrelight/mobs/birds/hawk.dm create mode 100644 mods/pyrelight/mobs/birds/pigeon.dm create mode 100644 mods/pyrelight/structures/aviary.dm diff --git a/code/controllers/subsystems/throwing.dm b/code/controllers/subsystems/throwing.dm index 4dc2001e17e..0849837efd8 100644 --- a/code/controllers/subsystems/throwing.dm +++ b/code/controllers/subsystems/throwing.dm @@ -33,7 +33,7 @@ SUBSYSTEM_DEF(throwing) continue if (QDELETED(TT)) if(!QDELETED(AM)) - AM.end_throw() + AM.end_throw(TT) processing -= AM if (MC_TICK_CHECK) return @@ -103,7 +103,7 @@ SUBSYSTEM_DEF(throwing) /datum/thrownthing/Destroy() SSthrowing.processing -= thrownthing - thrownthing.end_throw() + thrownthing.end_throw(src) thrownthing = null target = null thrower = null @@ -192,7 +192,7 @@ SUBSYSTEM_DEF(throwing) if(!QDELETED(thrownthing)) thrownthing.fall() - thrownthing.end_throw() + thrownthing.end_throw(src) qdel(src) /datum/thrownthing/proc/hit_atom(atom/A) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index d2be93779da..11366d63dc9 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -563,7 +563,7 @@ appearance_flags &= ~remove_flags return old_appearance != appearance_flags -/atom/movable/proc/end_throw() +/atom/movable/proc/end_throw(datum/thrownthing/TT) throwing = null /atom/movable/proc/reset_movement_delay() diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 9b3eba8970b..1320fd5f0ec 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -468,7 +468,7 @@ return TRUE return ..() -/obj/item/end_throw() +/obj/item/end_throw(datum/thrownthing/TT) . = ..() squash_item() diff --git a/code/modules/mob_holder/_holder.dm b/code/modules/mob_holder/_holder.dm index a462eff5ba0..a16a23e5fe3 100644 --- a/code/modules/mob_holder/_holder.dm +++ b/code/modules/mob_holder/_holder.dm @@ -46,7 +46,8 @@ icon = initial(icon) /obj/item/holder/Exited(atom/movable/am, atom/new_loc) - am.vis_flags = initial(am.vis_flags) + if(!(locate(/mob) in contents)) + am.vis_flags = initial(am.vis_flags) . = ..() /obj/item/holder/proc/destroy_all() @@ -72,15 +73,15 @@ update_state() /obj/item/holder/dropped() - ..() + . = ..() update_state(1) /obj/item/holder/throw_impact(atom/hit_atom, datum/thrownthing/TT) - ..() + . = ..() update_state(1) /obj/item/holder/proc/update_state(var/delay) - set waitfor = 0 + set waitfor = FALSE for(var/mob/M in contents) unregister_all_movement(last_holder, M) @@ -97,11 +98,13 @@ mob_container.dropInto(loc) M.reset_view() qdel(src) - else if(last_holder != loc) + return + + if(last_holder != loc) for(var/mob/M in contents) register_all_movement(loc, M) update_icon() - last_holder = loc + last_holder = loc /obj/item/holder/onDropInto(var/atom/movable/AM) if(ismob(loc)) // Bypass our holding mob and drop directly to its loc diff --git a/mods/pyrelight/_pyrelight.dme b/mods/pyrelight/_pyrelight.dme index 8310c9ab456..caa6a547399 100644 --- a/mods/pyrelight/_pyrelight.dme +++ b/mods/pyrelight/_pyrelight.dme @@ -12,6 +12,10 @@ #include "datum\factions.dm" #include "datum\locations.dm" #include "datum\religions.dm" +#include "mobs\birds\_bird.dm" +#include "mobs\birds\crow.dm" +#include "mobs\birds\hawk.dm" +#include "mobs\birds\pigeon.dm" #include "plants\_plants.dm" #include "plants\_plot.dm" #include "plants\_subsystem.dm" @@ -20,6 +24,8 @@ #include "plants\plants_fruit_template.dm" #include "plants\fruit_subtypes\nightweave.dm" #include "plants\plant_subtypes\nightweave.dm" +#include "structures\aviary.dm" +#include "undead\_undead.dm" #include "undead\undead.dm" #include "undead\undead_skeleton.dm" #include "undead\undead_zombie.dm" diff --git a/mods/pyrelight/icons/mobs/crow.dmi b/mods/pyrelight/icons/mobs/crow.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0159a677fd1374e4ff67c0799902a44f7f24928d GIT binary patch literal 2780 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 literal 0 HcmV?d00001 diff --git a/mods/pyrelight/icons/structures/aviary.dmi b/mods/pyrelight/icons/structures/aviary.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8ba4c4443f9a168feb46f5251e69d23ee0fc278b GIT binary patch literal 718 zcmV;<0x|uGP)D@x2wg|Jao>89l87ZvL!=j0cslBOlUATKl~IzTAP|O$GY1$E-xc}*0X#rxJ;0LH z`(I_d!7)zRRa3Q3Q(N1Kpy98N?jIyd-K-wzJJwEJqlplv4l#nC914Ql+@+}teu5F5 zmjqzOsFRP7(8vNCW)c8_Op~L}+ zP>s|{gzt>HwdW87YCFX*Nuag0c1+Y*^T9v7Ip+oyD5_vBf{_Kf5E>e~D^j^Cc$Uex zOpPgmcK{evgSao<+SBAYaSG-jJQO$wRbWbb`6Xb2Qg{%a+lx?=WH=FujKZD-S`SAK z2f?*@;}kb)+jY3w0OSL^z=fLML-B!KxU1a|a=Q?Hev3gN9*0ndKRW359Z01j+O=D@x2wg|Jao>89l87ZvL!=j0cslBOlUATKRLgRNAP`iO+*i@NGVFbM?0rQ(AY{w` z|CKPnx+aR`l*%D31*Ow8GhHJ^5zsUP#c?VU0LBfB6YEn1(((xg!IBDXI~w4EBnb>g za3X0!OSB?lN+;P6sv2!bGD)D^uyJa)3MKUh5GE!ZTZKw##kfivRZ1t!m8}Ebw*<{a zJE}QiOQ^I!4+e@D`0`yNZm3{{avns&c_A=24yUr&6tbhC#s$AUA z%OSx~)gKb5$|xu*GYT@Jkc$_&_)k#XGI7&q;(y&qcdJP%4iwy-bew^^laBU3Zna|t bNGp5-Pa|u&o;?pe00000NkvXXu0mjfl6Mo| literal 0 HcmV?d00001 diff --git a/mods/pyrelight/mobs/birds/_bird.dm b/mods/pyrelight/mobs/birds/_bird.dm new file mode 100644 index 00000000000..1363d3b9de8 --- /dev/null +++ b/mods/pyrelight/mobs/birds/_bird.dm @@ -0,0 +1,38 @@ +/mob/living/simple_animal/trained_bird + mob_size = MOB_SIZE_SMALL + abstract_type = /mob/living/simple_animal/trained_bird + holder_type = /obj/item/holder/bird + +/mob/living/simple_animal/trained_bird/proc/handle_holder_interaction(mob/user) + return FALSE + +/mob/living/simple_animal/trained_bird/proc/process_target(mob/thrower, atom/target) + visible_message("\The [src] follows [thrower]'s directions and attacks [target]!") + return FALSE + +/mob/living/simple_animal/trained_bird/proc/process_handler_failure(mob/thrower, atom/target) + visible_message("\The [src] ignores [target] in favour of attacking [thrower]!") + return FALSE + +/obj/item/holder/bird + w_class = MOB_SIZE_SMALL + +/obj/item/holder/bird/attack_self(mob/user) + var/mob/living/simple_animal/trained_bird/bird = locate() in contents + if(bird?.handle_holder_interaction(user)) + return TRUE + return ..() + +/obj/item/holder/bird/end_throw(datum/thrownthing/TT) + var/mob/living/simple_animal/trained_bird/bird = locate() in contents + . = ..() + if(!TT.thrower || !bird || QDELETED(src) || bird.loc != src) + return + bird.dropInto(loc) + qdel(src) // This will happen shortly regardless, but might as well skip the 1ds delay. + bird.visible_message("\The [bird] was thrown by \the [TT.thrower] at \the [TT.target].") + if(bird.ai) + if(bird.ai.is_friend(TT.thrower)) + bird.process_target(TT.thrower, TT.target) + else + bird.process_handler_failure(TT.thrower, TT.target) diff --git a/mods/pyrelight/mobs/birds/crow.dm b/mods/pyrelight/mobs/birds/crow.dm new file mode 100644 index 00000000000..ca3d3068563 --- /dev/null +++ b/mods/pyrelight/mobs/birds/crow.dm @@ -0,0 +1,9 @@ +/datum/mob_controller/passive/crow + emote_speech = list("Caw.","Caw!","Caw...") + emote_hear = list("croaks", "caws") + emote_see = list("preens its feathers", "hops around") + +/mob/living/simple_animal/trained_bird/crow + name = "crow" + icon = 'mods/pyrelight/icons/mobs/crow.dmi' + ai = /datum/mob_controller/passive/crow diff --git a/mods/pyrelight/mobs/birds/hawk.dm b/mods/pyrelight/mobs/birds/hawk.dm new file mode 100644 index 00000000000..4564b51eedd --- /dev/null +++ b/mods/pyrelight/mobs/birds/hawk.dm @@ -0,0 +1,16 @@ +/mob/living/simple_animal/trained_bird/hawk + name = "hawk" + icon = 'mods/pyrelight/icons/mobs/hawk.dmi' + ai = /datum/mob_controller/passive/hunter/hawk + +/datum/mob_controller/passive/hunter/hawk + emote_speech = list("Skree!","SKREE!","Skree!?") + emote_hear = list("screeches", "screams") + emote_see = list("preens its feathers", "flicks its wings", "looks sharply around") + +// Throw bird at target/afterattack on holder: + // Pass husbandry check + // Item: retrieves + // Mob: attacks + // Fail husbandry check + // Attacks you (for a short time, like goats) diff --git a/mods/pyrelight/mobs/birds/pigeon.dm b/mods/pyrelight/mobs/birds/pigeon.dm new file mode 100644 index 00000000000..ff8a2f1cbe8 --- /dev/null +++ b/mods/pyrelight/mobs/birds/pigeon.dm @@ -0,0 +1,9 @@ +/mob/living/simple_animal/trained_bird/pigeon + name = "pigeon" + icon = 'mods/pyrelight/icons/mobs/pigeon.dmi' + ai = /datum/mob_controller/passive/pigeon + +/datum/mob_controller/passive/pigeon + emote_speech = list("Oo-ooo.","Oo-ooo?","Oo-ooo...") + emote_hear = list("coos") + emote_see = list("preens its feathers", "puffs out its neck", "ruffles its wings") diff --git a/mods/pyrelight/structures/aviary.dm b/mods/pyrelight/structures/aviary.dm new file mode 100644 index 00000000000..504d1ac1f7c --- /dev/null +++ b/mods/pyrelight/structures/aviary.dm @@ -0,0 +1,73 @@ +/datum/storage/aviary + can_hold = list(/obj/item/holder/bird) + max_w_class = MOB_SIZE_SMALL + storage_slots = 10 + +/datum/storage/aviary/open(mob/user) + . = ..() + var/atom/aviary = holder + if(istype(aviary)) + aviary.queue_icon_update() + +/datum/storage/aviary/close(mob/user) + . = ..() + var/atom/aviary = holder + if(istype(aviary)) + aviary.queue_icon_update() + +/obj/structure/aviary + name = "aviary" + desc = "A hutch for containing birds like hawks or crows." + icon = 'mods/pyrelight/icons/structures/aviary.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/organic/wood + storage = /datum/storage/aviary + var/decl/material/door_material = /decl/material/solid/organic/plantmatter/grass/dry + var/initial_animal_type + var/initial_animal_count + +/obj/structure/aviary/Initialize(ml, _mat, _reinf_mat) + . = ..() + + if(ispath(door_material)) + door_material = GET_DECL(door_material) + + if(initial_animal_type && initial_animal_count) + for(var/i = 1 to initial_animal_count) + var/obj/item/holder/bird/bird_item = new(src) + var/bird_type = islist(initial_animal_type) ? pick(initial_animal_type) : initial_animal_type + bird_item.sync(new bird_type(bird_item)) + else + update_icon() + +/obj/structure/aviary/on_update_icon() + . = ..() + if(door_material) + add_overlay(overlay_image(icon, "[icon_state]-doors-[storage?.opened ? "open" : "closed"]", door_material.color, RESET_COLOR)) + +// Mapped subtypes. +/obj/structure/aviary/crow + initial_animal_type = /mob/living/simple_animal/trained_bird/crow + initial_animal_count = 5 + +/obj/structure/aviary/pigeon + initial_animal_type = /mob/living/simple_animal/trained_bird/pigeon + initial_animal_count = 5 + +/obj/structure/aviary/hawk + initial_animal_type = /mob/living/simple_animal/trained_bird/hawk + initial_animal_count = 5 + +// Rabbits are a kind of bird, right? +/obj/structure/aviary/rabbit + name = "rabbit hutch" + icon = 'mods/pyrelight/icons/structures/hutch.dmi' + desc = "A hutch for containing rabbits." + +/obj/structure/aviary/rabbit/mapped + initial_animal_type = list( + /mob/living/simple_animal/passive/rabbit, + /mob/living/simple_animal/passive/rabbit/black, + /mob/living/simple_animal/passive/rabbit/brown + ) + initial_animal_count = 5