From 1d256b5506b15460d4d752d7526d1824936a92f1 Mon Sep 17 00:00:00 2001 From: san7890 Date: Wed, 16 Nov 2022 00:40:39 -0700 Subject: [PATCH] Refactors Rabbits to be a Basic Mob (#71205) ## About The Pull Request Back in #64175, I reworked rabbits such that their base behavior was just a cute fluffy snuggle monster, and not have the "easter" variant be the default. Now that we're transitioning everything from simple_animal to basic, I figured now was the time to shift that over too. Pretty much everything should be the same as it was before, I even took some time to add behavior to some elements to allow it to work (let me know if I should handle it a different way) but rabbits as a simple_animal and rabbits as a basic mob should now not be very distinguishable (beyond the fact that they only speak via subtrees). I also got rid of the single-letter icon_states in the DMI and accomodated the code to fix because I finally got irritated enough to do something about that. ## Why It's Good For The Game Although I didn't really have any pressing urge to add more complex AI behavior to rabbits than just pretty much re-implementing what they had as a simple_animal, this is an excellent first-step to allowing much more extensible behaviors to these fuzzy creatures. Also, it takes three more mobs off "the frozen list". Whoopie! ## Changelog :cl: fix: Dead Black Space Rabbits should now properly have a sprite. /:cl: The UpdatePaths is useless for the maps we have on our repository (holodecks use a spawner code-side), but I'm going to be nice to downstreams who need it. --- .../basic_subtrees/speech_subtree.dm | 22 ++++ .../elements/basic_body_temp_sensitive.dm | 12 +- .../awaymissions/mission_code/Cabin.dm | 2 +- code/modules/clothing/head/tophat.dm | 2 +- code/modules/events/holiday/easter.dm | 4 +- code/modules/holodeck/holo_effect.dm | 2 +- .../mob/living/basic/farm_animals/rabbit.dm | 111 ++++++++++++++++++ .../living/simple_animal/friendly/rabbit.dm | 87 -------------- .../unit_tests/simple_animal_freeze.dm | 3 - icons/mob/simple/rabbit.dmi | Bin 3428 -> 9802 bytes tgstation.dme | 2 +- .../Scripts/71205_simple_rabbit_to_basic.txt | 3 + 12 files changed, 150 insertions(+), 100 deletions(-) create mode 100644 code/modules/mob/living/basic/farm_animals/rabbit.dm delete mode 100644 code/modules/mob/living/simple_animal/friendly/rabbit.dm create mode 100644 tools/UpdatePaths/Scripts/71205_simple_rabbit_to_basic.txt 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 ba1be6b784a..c0aaacfce3e 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm @@ -54,6 +54,28 @@ emote_hear = list("bleats.") emote_see = list("shakes her head.", "stares into the distance.") +/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.") + emote_see = list("hops around.", "bounces up and down.") + +/// For the easter subvariant of rabbits, these ones actually speak catchphrases. +/datum/ai_planning_subtree/random_speech/rabbit/easter + speak = list( + "Hop into Easter!", + "Come get your eggs!", + "Prizes for everyone!", + ) + +/// These ones have a space mask on, so their catchphrases are muffled. +/datum/ai_planning_subtree/random_speech/rabbit/easter/space + speak = list( + "Hmph mmph mmmph!", + "Mmphe mmphe mmphe!", + "Hmm mmm mmm!", + ) + /datum/ai_planning_subtree/random_speech/cow speech_chance = 1 speak = list("moo?","moo","MOOOOOO") diff --git a/code/datums/elements/basic_body_temp_sensitive.dm b/code/datums/elements/basic_body_temp_sensitive.dm index 9781a2adb18..36755252de0 100644 --- a/code/datums/elements/basic_body_temp_sensitive.dm +++ b/code/datums/elements/basic_body_temp_sensitive.dm @@ -19,14 +19,18 @@ if(!isbasicmob(target)) return ELEMENT_INCOMPATIBLE - if(min_body_temp) + if(isnum(min_body_temp)) src.min_body_temp = min_body_temp - if(max_body_temp) + + if(isnum(max_body_temp)) src.max_body_temp = max_body_temp - if(cold_damage) + + if(isnum(cold_damage)) src.cold_damage = cold_damage - if(heat_damage) + + if(isnum(heat_damage)) src.heat_damage = heat_damage + RegisterSignal(target, COMSIG_LIVING_LIFE, PROC_REF(on_life)) /datum/element/basic_body_temp_sensitive/Detach(datum/source) diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm index 02e251849b9..f2c55228fcf 100644 --- a/code/modules/awaymissions/mission_code/Cabin.dm +++ b/code/modules/awaymissions/mission_code/Cabin.dm @@ -159,7 +159,7 @@ spawnableAtoms = list(/obj/structure/flora/bush/snow/style_random = 1) /datum/map_generator_module/snow/bunnies - spawnableAtoms = list(/mob/living/simple_animal/rabbit = 0.5) + spawnableAtoms = list(/mob/living/basic/rabbit = 0.5) /datum/map_generator_module/snow/rand_ice_rocks spawnableAtoms = list(/obj/structure/flora/rock/icy/style_random = 5, /obj/structure/flora/rock/pile/icy/style_random = 5) diff --git a/code/modules/clothing/head/tophat.dm b/code/modules/clothing/head/tophat.dm index affb5ffc98b..f34e41a93b7 100644 --- a/code/modules/clothing/head/tophat.dm +++ b/code/modules/clothing/head/tophat.dm @@ -34,7 +34,7 @@ barry.say(pick("BUZZ BUZZ", "PULLING A RABBIT OUT OF A HAT IS A TIRED TROPE", "I DIDN'T ASK TO BEE HERE"), forced = "bee hat") else magician.visible_message(span_notice("[magician] taps [src] with [hitby_wand], then reaches in and pulls out a bunny! Cute!"), span_notice("You tap [src] with your [hitby_wand.name] and pull out a cute bunny!")) - var/mob/living/simple_animal/rabbit/bunbun = new(get_turf(magician)) + var/mob/living/basic/rabbit/bunbun = new(get_turf(magician)) bunbun.mob_try_pickup(magician, instant=TRUE) #undef RABBIT_CD_TIME diff --git a/code/modules/events/holiday/easter.dm b/code/modules/events/holiday/easter.dm index 448c0c3306c..01cdd004797 100644 --- a/code/modules/events/holiday/easter.dm +++ b/code/modules/events/holiday/easter.dm @@ -30,9 +30,9 @@ if(R.name != "blobspawn") if(prob(35)) if(isspaceturf(R.loc)) - new /mob/living/simple_animal/rabbit/easter/space(R.loc) + new /mob/living/basic/rabbit/easter/space(R.loc) else - new /mob/living/simple_animal/rabbit/easter(R.loc) + new /mob/living/basic/rabbit/easter(R.loc) //Easter Baskets /obj/item/storage/basket/easter diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm index 258aeba52d5..f8deccea4f3 100644 --- a/code/modules/holodeck/holo_effect.dm +++ b/code/modules/holodeck/holo_effect.dm @@ -85,7 +85,7 @@ /mob/living/simple_animal/butterfly, /mob/living/simple_animal/chick/holo, /mob/living/simple_animal/pet/fox, - /mob/living/simple_animal/rabbit, + /mob/living/basic/rabbit, ) mobtype += pick( /mob/living/simple_animal/pet/dog/corgi, diff --git a/code/modules/mob/living/basic/farm_animals/rabbit.dm b/code/modules/mob/living/basic/farm_animals/rabbit.dm new file mode 100644 index 00000000000..78095d6f585 --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/rabbit.dm @@ -0,0 +1,111 @@ +/** + * ## Rabbit + * + * A creature that hops around with small tails and long ears. + * + * This contains the code for both your standard rabbit as well as the subtypes commonly found during Easter. + * + */ +/mob/living/basic/rabbit + name = "rabbit" + desc = "The hippiest hop around." + icon = 'icons/mob/simple/rabbit.dmi' + icon_state = "rabbit_white" + icon_living = "rabbit_white" + icon_dead = "rabbit_white_dead" + gender = PLURAL + mob_biotypes = MOB_ORGANIC | MOB_BEAST + health = 15 + maxHealth = 15 + density = FALSE + gold_core_spawnable = FRIENDLY_SPAWN + speak_emote = list("sniffles", "twitches") + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + attack_sound = 'sound/weapons/punch1.ogg' + attack_vis_effect = ATTACK_EFFECT_KICK + response_harm_continuous = "kicks" + response_harm_simple = "kick" + attack_verb_continuous = "kicks" + attack_verb_simple = "kick" + butcher_results = list(/obj/item/food/meat/slab = 1) + ai_controller = /datum/ai_controller/basic_controller/rabbit + /// passed to animal_varity as the prefix icon. + var/icon_prefix = "rabbit" + +/mob/living/basic/rabbit/Initialize(mapload) + . = ..() + AddElement(/datum/element/pet_bonus, "hops around happily!") + AddElement(/datum/element/animal_variety, icon_prefix, pick("brown", "black", "white"), TRUE) + if(prob(20)) // bunny + name = "bunny" + +/datum/ai_controller/basic_controller/rabbit + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list(/datum/ai_planning_subtree/random_speech/rabbit) + +/// The easter subtype of rabbits, will lay eggs and say Eastery catchphrases. +/mob/living/basic/rabbit/easter + icon_state = "easter_rabbit_white" + icon_living = "easter_rabbit_white" + icon_dead = "easter_rabbit_white_dead" + icon_prefix = "easter_rabbit" + ai_controller = /datum/ai_controller/basic_controller/rabbit/easter + ///passed to the egg_layer component as how many eggs it starts out as able to lay. + var/initial_egg_amount = 10 + ///passed to the egg_layer component as how many eggs it's allowed to hold at most. + var/max_eggs_held = 8 + +/mob/living/basic/rabbit/easter/Initialize(mapload) + . = ..() + //passed to the egg_layer component as how many eggs it gets when it eats something. + var/eggs_added_from_eating = rand(1, 4) + var/list/feed_messages = list("[p_they()] nibbles happily.", "[p_they()] noms happily.") + AddComponent(/datum/component/egg_layer,\ + /obj/item/surprise_egg,\ + list(/obj/item/food/grown/carrot),\ + feed_messages,\ + list("hides an egg.","scampers around suspiciously.","begins making a huge racket.","begins shuffling."),\ + initial_egg_amount,\ + eggs_added_from_eating,\ + max_eggs_held,\ + ) + +/datum/ai_controller/basic_controller/rabbit/easter + planning_subtrees = list(/datum/ai_planning_subtree/random_speech/rabbit/easter) + +/// Same deal as the standard easter subtype, but these ones are able to brave the cold of space with their handy gas mask. +/mob/living/basic/rabbit/easter/space + icon_state = "space_rabbit_white" + icon_living = "space_rabbit_white" + icon_dead = "space_rabbit_white_dead" + icon_prefix = "space_rabbit" + ai_controller = /datum/ai_controller/basic_controller/rabbit/easter/space + // Minimum Allowable Body Temp, zero because we are meant to survive in space and we have a fucking RABBIT SPACE MASK. + var/minimum_survivable_temperature = 0 + // Maximum Allowable Body Temp, 1500 because we might overheat and die in said RABBIT SPACE MASK. + var/maximum_survivable_temperature = 1500 + +/mob/living/basic/rabbit/easter/space/Initialize(mapload) + . = ..() + // string_assoc_list returns a cached list, which we then use as a static list to pass into the below AddElement + var/list/habitable_atmos = string_assoc_list(list( + "min_oxy" = 0, + "max_oxy" = 0, + "min_plas" = 0, + "max_plas" = 0, + "min_co2" = 0, + "max_co2" = 0, + "min_n2" = 0, + "max_n2" = 0, + )) + AddElement(/datum/element/atmos_requirements, atmos_requirements = habitable_atmos, unsuitable_atmos_damage = 0) + // heat_damage is 0.5 here to account for low health on the rabbit. + AddElement(/datum/element/basic_body_temp_sensitive, min_body_temp = minimum_survivable_temperature, max_body_temp = maximum_survivable_temperature, cold_damage = 0, heat_damage = 0.5) + +/datum/ai_controller/basic_controller/rabbit/easter/space + planning_subtrees = list(/datum/ai_planning_subtree/random_speech/rabbit/easter/space) diff --git a/code/modules/mob/living/simple_animal/friendly/rabbit.dm b/code/modules/mob/living/simple_animal/friendly/rabbit.dm deleted file mode 100644 index 7ece0ea7c5c..00000000000 --- a/code/modules/mob/living/simple_animal/friendly/rabbit.dm +++ /dev/null @@ -1,87 +0,0 @@ -/** - * ## Rabbit - * - * A creature that hops around with small tails and long ears. - * - * This contains the code for both your standard rabbit as well as the subtypes commonly found during Easter. - * - */ -/mob/living/simple_animal/rabbit - name = "\improper rabbit" - desc = "The hippiest hop around." - gender = PLURAL - mob_biotypes = MOB_ORGANIC|MOB_BEAST - health = 15 - maxHealth = 15 - icon = 'icons/mob/simple/rabbit.dmi' - icon_state = "rabbit_white" - icon_living = "rabbit_white" - icon_dead = "rabbit_white_dead" - speak_emote = list("sniffles","twitches") - emote_hear = list("hops.") - emote_see = list("hops around","bounces up and down") - butcher_results = list(/obj/item/food/meat/slab = 1) - can_be_held = TRUE - density = FALSE - speak_chance = 2 - turns_per_move = 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" - attack_verb_continuous = "kicks" - attack_verb_simple = "kick" - pass_flags = PASSTABLE | PASSMOB - mob_size = MOB_SIZE_SMALL - gold_core_spawnable = FRIENDLY_SPAWN - //passed to animal_varity as the prefix icon. - var/icon_prefix = "rabbit" - -/mob/living/simple_animal/rabbit/Initialize(mapload) - . = ..() - AddElement(/datum/element/pet_bonus, "hops around happily!") - AddElement(/datum/element/animal_variety, icon_prefix, pick("brown","black","white"), TRUE) - -/mob/living/simple_animal/rabbit/easter - icon_state = "e_rabbit_white" - icon_living = "e_rabbit_white" - icon_dead = "e_rabbit_white_dead" - icon_prefix = "e_rabbit" - speak = list( - "Hop into Easter!", - "Come get your eggs!", - "Prizes for everyone!", - ) - icon_prefix = "e_rabbit" - ///passed to the egg_layer component as how many eggs it starts out as able to lay. - var/initial_egg_amount = 10 - ///passed to the egg_layer component as how many eggs it's allowed to hold at most. - var/max_eggs_held = 8 - -/mob/living/simple_animal/rabbit/easter/space - icon_state = "s_rabbit_white" - icon_living = "s_rabbit_white" - icon_dead = "s_rabbit_white_dead" - icon_prefix = "s_rabbit" - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = 1500 - unsuitable_atmos_damage = 0 - -/mob/living/simple_animal/rabbit/easter/Initialize(mapload) - . = ..() - //passed to the egg_layer component as how many eggs it gets when it eats something. - var/eggs_added_from_eating = rand(1, 4) - var/list/feed_messages = list("[p_they()] nibbles happily.", "[p_they()] noms happily.") - AddElement(/datum/element/animal_variety, icon_prefix, pick("brown","black","white"), TRUE) - AddComponent(/datum/component/egg_layer,\ - /obj/item/surprise_egg,\ - list(/obj/item/food/grown/carrot),\ - feed_messages,\ - list("hides an egg.","scampers around suspiciously.","begins making a huge racket.","begins shuffling."),\ - initial_egg_amount,\ - eggs_added_from_eating,\ - max_eggs_held,\ - ) diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index d06ba6bf89d..90aff229a33 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -379,9 +379,6 @@ /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/rabbit, - /mob/living/simple_animal/rabbit/easter, - /mob/living/simple_animal/rabbit/easter/space, /mob/living/simple_animal/revenant, /mob/living/simple_animal/robot_customer, /mob/living/simple_animal/shade, diff --git a/icons/mob/simple/rabbit.dmi b/icons/mob/simple/rabbit.dmi index bc9652bbb016fb47359f89cf306d3adeccffc8e9..b6fa545871d10cc477a8230c57735e54b7a2909e 100644 GIT binary patch literal 9802 zcmb`NcTiLRzo#hzq4y#!G^t8Jiqud90qN3Ix^$#V?p%BYvUy|W;o#=!;Oc^f<(r+8T0<5tL?ORfZY>{Id2inT5X|9C-A?ylkNGNtt{(dGd`9 zAtydNBlZOQ%)`>;(XnSi!bPt{T+~@<$6UXp;I~A5V*gYSHO6rbC|l8Y>W;u6(xMIV zs2Pm)yqN|G?}-|kX3L|}$) zM<0;E43T%2-@w7<&lq)6CgH=0VWE1L8qw8_*Ryh&%|U@v#Jk$M?vwyg2ZT`&P_g-# z0JyygC5Wx=&wg-HgIlYeFQNl3;&W~7j6~`dCTo2=%RkTNCSRXvU4)ovAAAqEH!6FP zO?9W6w78Oq4RBzm6dJxvL7B%Up>&5AKt_p86#n?XvlMf$tG!IWTxV9ia*sg4xq9{k zmlI@VF{@I8mS5W&si4DD059g+rat<8llm4hbsg(%VEpXaDoCaLK7RF28LPK*aH}Xg zXu30E^e49z0sOl%m3U7m_W9tWT)jA>`_FzZ9a+S5W}Hgm7TF=RNo~SrXtZV(=(Ps~iCv>Pm{X(}B@L$UPfvE%gV zHRC~~M-s2*V?8r8zre^eD&H}S&gPBHQj^z{^U&q#pXNVtfw*}g7V_yOQ$GjF_{Fyb zIxiN_gV;#71HEBWKgyk@eYP($SPPs|7IUQ4Uy?~{G=}Z2*M*5sko13ev>xG7>JQ@= zIBbN^wA(@d{?gRsc(&|5NK-rFV&@_wwtz&i&F@>&rd$e^Fa;8MT|dKy)y8w!VP2N@ zt&FXW8KON#e~5*gq{mr1zoJKF3x`{oQ6RTeup96PFh6`2`5ZF9vdTT2S#2!YPFe9< zVJkMn>gw%CkX+(?4Ohb@%;3j0@O;VRpSZrvpnLlnY1wjd9+xs;VIic5sqnznwO zzepg!_c!%=0+}grB94wBj)i4>d_Vfmj!Rb&qI(d>?_?S1$WV$7iXg! zQ;egtyjG5TNb%Hv*nWze9vFnT*1+?iBd?#$m}~1Od~8v0FZ7(GNmR*1Sk#eQF zkr$Wp?Y$p~H8rHi{%V1=y7mo|=SGwYx$z;k!Si1dYX<5ZM#Q5GanvC5#B*&JPNL7= zb7+2!!8-SY!NjPXw@>Ku*Z{whmcsv=(D_TNSN#x52-lIE$NST@=jef?W7%*T&p;Wa z&>n@bgD`8?F+EW%wEV+_EIM}9+F}cR6Hi}$R_(zPc>@W-p%)OfNHUxcq_PEtkdjCh zwufQgs=2UqXLwJQxpBNBeMq#w43NfA4&kQM7V^&HKU(y)+TL$H5F9ef-90C67_v1^ zsiwT+Cvu0KTl+UT7*9blx*iIHam%pBd&R~OxvC^rt3-$t<4G2@q1NvWOsd(Ft4fYt zihr@=WAsGV`Fxs2?b zEI#S^D#|aCy((PR_;^uB`K&qWK4c!3h?+4LpJ4fl7l-9N>PUxBZ-sqm2iq4M8~Qd+ zW1jk&kSSMaLN>3cKl4)K%MB#s<@YRUqfX3V&4A4nyT6X%A zaykfjXJe?EDkI$k8biUuI>kdjUp$ZO-QXh%jgNMF zz9CcK)cW0DNm3XKRv@DUj&2dB8peIbD>WQMCq|g>AcSQ*n)~_SakZDb!tyx}4h6y7 zGjsEUhHv@{r;=qZSsbGTF;&II{Ro1iWl?q`ahy%DJchVV$JS zpkkMx7!R#L?oLA15~I(;<-vrKm*nH4?IN567s1QcQ)(xSTxnv_Vbh(4My79KlUp8Z zD!BK?WZMN-6RnS?+ad%eXg~HveJ-mAVqoil!^NlP=C=P6y0o;-BMZgF#ZQ!DT69W) zGv|#1wsK!*W&x985`v)2_V6N z)PwDsb5d$YBLAyznC)f@Dpu5a{HEI4m~4R>WlFk(tLtdM{4afqv)(nz!wyeZ2ugf+ zQZ^R@P9;t-53L42clyVV?J%<}&5T()VRagM;Or47cI;DE{UxB~;!E?d)f00D)o2(! z%njJoQ6Ssj_=NNw?ib8z7G3e>52g0x;MgxAlv=BW&{b;>SiFCC(@3plUWHH$$U$gK z?Jwd;0tI<9U-k4R{UIC!d_QVy5di`_63q3r|KTFr_`L_<@Go^k?ksb-9!FOvy;s12 zYQhWuP#Nis(VwL(j%mgjZP0u1r`VBak_M9!8B4JEVM+v)djM(=$vj+!9hWWL~ z{RlPf?K=L_)NRuE*cmN8M7?NPG+@p6){RZc<|3${+ulVSzp06u!uWfMc z>Oq`B`gSGG2hKv*&#;sRdJo*Se-9Y?$|z)LKw1d;raWB5frv0%g8JXb%4~%)q#WQ! zxA+N7{it&hT0gAj&PI5@?T}(m9-?30$Cm#VJT<{u-0KIj`1L!K) z%P=L!-{9&pWEzwUc3i%aWvEt`RI6SN*B`_(PBT@Alb11)`c8OUo<+gFVXu;N$Eh2p zmaJmARV(7z@suR^AFtDKb99PR>!rAU4antM-z2ZpvorB?aVqSWZ(h9w4-@C6p(+;_ zv%?-$B;AE+#^vBQ!{n_$$qOWwJ9+{)Y#JTX5ttvfBX6!T>ONqakzlT$ zHNSFIPJb8#i_06WbLufo$(hy5yK0*5^4=7kgZdXq+eh^UKw#`4fl`f zyO=nsQn0-DC75hZRfNWPvD(%*im@~!|0H>L2|BT{z<;?TWX$F)ru#K$S>a6dP8&(( zAOj6W*H~lcXD}uzM5h9}GiBt6Fa!L7N)tIp_0rp*mVuMPlcH3H33?7dI3)Uw-qpfE zc>p{_56T4KD>tPQRD!hV@N9ESulxB)ONj4NuGnM>AgAE@{trTp6QtGK1H9tU?`D8M ziIr=}6IGUpeQ}U$Gvs^N?m*w|_|4)=@p553nXx)m=cVAuz>m-;+1i0q zWDDGIsvXxxK5j*f)ts?W4kbIBci`TH?6T7GdU0a;=0S_nXI?oK(^EzN;rEL_$ET|< zE{wlE8wqRdt+3kpp|pF&PC2$+^6ySJtSmRPpOd96h_tk3Uk*X@7VmTAlp=LcUC zeR)lul`{8hw6*$X7CMRfh$5hJh&cD|br_X?enTx!VCw&{r79Fa7){P~WT2FfltGv) z-&xSRWnbQfXYgutA}-}C_06WFZ+UC5{ORwUk@ZJg4Gc6@OFO+ zHeT9D)^XjQ7kT%UxTBdq^kraeso7*5-A%2g#1DD7pC`JIIvY$eg`efD*7JmdX6bEQ zQbB~C1Vwa`N>uNZsD{1-Cr%NwbKvWO#Uf`2b`EBj<@EpwzL{1Jm?P~CvTYY9n9M0B zj>~C1qEE?e6r}i+v@7BnUStZ1;yyNBJ{C<3%Q84IKr*fQw}d4%oUxN2?Z)%KmD>tq zFZ-PQ|4zO1I(JTUvFYKzKW|lY{Oedk99+jT;v6dj>3Y10iyhL%0Mmf{;iq(Nr_yJC}=z%GS5YLPqth?wVgxk1Hko&}y# z3@k5OP{G~+sG8%0^Rm-U8+!jSvE_OC6D>bY)9^q>CjYd#ByYOyPp69weme>4*bcYp zR+VyNbIkLE?Wy%AKDw!}7P4uD!2uiu`h4a*)>HY3S<7Re_R>aJ<+)|(<=oty{_EEj z7mAXqX|VhVUs?p|HlQiBopDereb2 zyc0vwkop$~(kJNFv*1{veV#OeB840f`AZwWGRB!k^Ui@&3Y%(Y?V$0it)y5-$A#ZR zJkr*^#KZdwW~v%gE|1`9Z2oS~DHww|k6gd3iNx8IuW#$lq<7 z{|M$$KF5rpqKZLog=-1BNu+Wn5LkOYo!S1G?WqJ)YDO@4@;vkUh*+h}c?)%A8?#1~ zw10HtSKYk49K&Dtod$W-c#(U`=QVwVDKvy)>RW7e_13kPd-?;fug~PhFM>|lhfa>Y z-F~x<7Xemmz~WY|J$X8)ob3T1#`j#rdsSq6O}r$$6v&#Gm$rh1be`EP8@dh0^Te;@ z(1y^gk+&0@zup&IV-(+SVLCC>Ri~TxR+2Rr$;cKsxpRhgjx~cE`@=L=GYl3!mp2Pb zB=b=Y-%8nd=q6GXqB;pdNrPSsr?fh21h-H->Lb)~9k2~=y%N(SuXuX!NNwk*nfnJQ z+5hO3-}Di7!Xp3Sl}_@FTiY*BP$AFeeqArT3^fTv6XOz&pZ3t~okB2tMp6fss$hAWdw{@@LjeO@Y{MyMdT+Mui+pdIA#M)ztf!PqCQ#rEgg_Ih2V z-sGfLflKEluR5O$XD6^h40YOAkul0ZPvRL(VG&pRVDRr|*@(h0Esj2v+a@ZW5d#>q?A5HZ3UvuQbvWt8H*r1nbVLITW@Yx&B zPP^5eeU{ekU-VGT+ zp)`N^F@pG?Xl@^we4E{~zbBTVOWv3a+KwH?B&-wM+Up>0^Z!Fnn4~If8C?V<;HSCT zwg_QX_6_;#wxUw>Ed35E%b=Rfj0!;wa??ru3q{R?02DY1vOC~wNpSg4F3p{{6LS zO=d!t%}>@>TCnG9&3ttzj3YHUV{oS%;Z7NzSM4dT2roR*W^~buC6!1!Q68?f1V$v1 zUph%rBJYqh4UL9xH1@7c5QiggxxeXzOY! z7gd2UM~^}-II9TQq*#M*?<8b>c1SSA5&xrXuMe8klJZVQA)9v_PUAu41ZHS;XW$01 z3T5mYt~4i)%Q~bo;jE(u#l_hKy1#J!&MmJtN8J-#;{`bmZ5jyB7OUVKhTFjn5DgTs zhduhEqHWf5HFIcUJMg+$B;4c!9sz`TspvRtbyYnPIUeU@dfS5UZ~xR`fjV_s~-5iTMg-(5SdehKTfBMqy5AmU=* z$uiNOViIZ}zxNj{ZtP!=BB8y@bP=W^YOSO)IU0E3JD7NGz47rH)d3IM&Nw07RAC~2 zO7J8`!T$Q=0qbZzitT&rxuQYv`cl~msPzd7L2kHnY~x!3$Bo zTJQU0$3_`^SUXMR(AwelO>BGq&8UHECkj3%G*$i`xw|>hBUxg9d)Cm7J;H|bs3koW zBNxLcU~m(>SUCf}klev=j}I)53b|bQyfxbTBHgaeXE%wX3q&z2P zcEFJfUQzjN{=!t)E}><0LcQU#rKRN*oSo`}45!~*J#;yjsgTWTAe{*ZbYc#B9SsJw z&gN1?^wc{}L{N?JQQZ2_I7JwSpdFpqy3DZEm?v<6DqhU|nn)KZb|JGm1@0PxhIBug zP6n3h9XQ{#FBa@Vxo20QlM$o{SGgmegZ>M|omJ!85XjSUAd7-!KGQ2)O1*rW*r5td z-E&2EXP8b!O6fjo#6#HQ%4dy|s=!*^fyB4}9O< z*b}4%6>N{nJ@fMNa{Te>g}>15Y~8@~1t*3b)fwn4If7|@KNlh4&bIeylc@(ilhKGKDOvuy1rB|_q+Doi&3Sxna_9* zQDB*GO=3B28~oXE(?jin1|e(<G_Hr;j4c9`%+&<&RH8sGb0nKvhO*u*p9q^=Xptz(zWE z_eWuquUL+)^()WF3FXljY6P%SJ@i{;JIZI_Eqs6$&$6~#3eEIU-EZEXqdnM(R%K06 zN67Y>s{DY?;Z^6CZAeU zu2eXggtEm{;kW@a4l=$WwJGX*2IcB7O%CJ?Utnsj3Ws)<%~)aYfmXy;D>=r9v81LT z1cyMMFD~Lo7f9cABGK|=@R-S~9>9NZ0`^~w&SK8wD~E3E`@2pib(x&3H}93YU^ca- z1jxf_^l%stJusFrunli#=rT&%x%wl^$L;eF^s8$*4^<+@z`(8(kNLMsk(&X_k_g{@ z@zisoS=EPPbW)gE=^y2Ku2Q2+Zf)6+AQCWm*>4se6b^m!Hh0cpz zxw6h?^sih08hJVO_2a0(8A#K;JeG7+d*DqyZEBgV%#D{e4XxG`MZ*v=0$BRpR z(@qznZpVO{ENjGC^&5xKiM!aCHe#bJboPzs3})!LW^{s_+yY4d3A2EAtMU5~d^rxnx z=s2dP2I8D*dC;qPwM8b4tniQXNYN-lha75qN!fArbt5sjc0v8mF@=JQnA=fbwW$+k zfaohz8qv;3Meb8;if0y6D~lTXzwbt|RxUC-ogPoJ>wOFPnNtQ!BP;D*S~T(ur|^_N zQ|ZjRCZ8%z-1QqCiLG;4kjhE28VGRR>8!A~A4hN*hL6LNsng4bho8za44b!2s&b@N zH|>Uedh!Y()1;8D_qn8e@wSITgFxEa`@tugoTw`BxtQ3)hbfa7Qc}`#>yx_c1GoY3 zbEB@2IcI>p)D^?!=_=A0=ZKw5E~d)ioU;7W{S!YvyLsdHA^C6M@5wTa-z%GzQhUAm z^Dkl56FRRYr#gpX>w4W7l-t_3^6!Kgx$0_3$+6>u+b@H&bYRw0=6(nseP!jyVC|sV zvg@id$+8(_u5jz$3+X}(AIA?B&v*6=1E_y8&>@k^&BodI{=l`rjGsod)Q^gU@e(UH z`uIzZ@2Y)pOOqtxrk>Q!arJ7;LPR#~a83~ljT`&$D7*9Ep4HXXYN$e^%?MqUjI=4M z113@|K(v%kQ?el}l!tK=6Jd+Ql&)y}s%RM=N4r|+j*rZ4ZgP;Uk#Z7JT#XK{VLyFA zS}k`Au%qR&8cBvjQW4`xXWq$NUQWP94x0t19Lp^GsC2b!=k`K}Pv(0d8>KmXd+Fd6g_BVUIT^^%mhl zK|$rPlm2YX-2J9OF4xVnHy8FMvG4j69IL2Zhvg{DQuC z7r?qb_|C3^hz2+Zc{sP~TBj!Ny7=ifntGf!HZ~g9Y!duO@^RF)Q2#^mlD(qHD1}5L zC?oC4;bAo+1A`D+fMGiXK!ig=1r)^JVrjXBIX%Y@8XDa8N~uYJlP(-DCI;s9FGgp- zG_naKQa#Ie5d_!9!!6XZ6F%1GBns=vi;Jn_{71M^)e!yMi}h1+BsK|ODyF)ujBkQQ zh(sT_{cAPCnM?Vxad|~WyOplf09D>?ca-rOA$=6tC10gq{Gv)^x7`h+%rSpE&ehE_ z3A{l+QVkSWP@#^9h%mc*+b4v!nfmy6$jPmb$^SItc@VxZOE0Lz)${$kR-t(FzCD?Wpyi?0fW)qd8u8wTfYfvy)}*!< zFCl!#klP0scB~NIyJN-xD#aqy?G$W<(9eY77}DIG$nW{vch2>pAW5RSVy+PHB^g8& zsX1_ulA9-AhOMV|#S3}7(V}rXS&TS5B|fNIogB!Bx=&YI^+t|&!%sSzG*{?^|D-Qn zk`DAlg&iq2>mdGjl>*epbA-Lmj>isM^Oq-)>FXl^;0N>qMh z<0$T$hxTuR+;Paoh#j|ZN(hOUg2?iZep!%}QJbZc~6N6ypZYvg2?S0kcd zq;m$odHBjeelHz5L z)AiyjMoH-|wB?3${iV>iqIB~>*e*d(ur+u1zrOz2#gY*9(TA-gFF=N*{*2hRj7MN} zYD0Z4xFp!)OxN+MprM=rwA@I3gtxGE&jz?k+%iySW1i7=o8qG5G1JDb(>=Z3-_bW^ z$(uRHnXJBp(1p5umFd#DSQoBc&P`lM)ZTDF$j7Fjb>`5+YSTBPoH29s+@R!O;-@_o zyF|IV?Aqsl`>D5&{EC5FrrJhF$5)8+ey)AP??&p~GBxk>Xu-=4d@Fdqlo?qHa1 zxJ9C0QP1MuZ@O<*WB*lL4f)(n@(gzJ#VNHOq@l&(Cr@SCVcuksv|<*e-7M8|9Zw4W zyD|gUE*QBWrbnDd4n@7+RSoR!?q3e*M9`D5a>;&VlUT=KFHWuYBTEcsjO;^5smxfjGhJb9GYq4U5)ra1xyeCK@M`<~}~C(#yZ%Fla>mxF_Y-`osg$ClLJ zm4}Pns{P6tWQ#AhRt_d@ZEcOMt+u*nHkxO82M3*ul<9r5b8~ZUrm99pMx*27XvDel z+FC1ZId4O;k6*rAGgQ>j(163?Yy)&U-Nweo!oosTRTT<_QbR%z

swWmm<5W<$Y2 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 diff --git a/tgstation.dme b/tgstation.dme index 50e2f1882d4..14c62c5e0f0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3531,6 +3531,7 @@ #include "code\modules\mob\living\basic\basic_defense.dm" #include "code\modules\mob\living\basic\health_adjustment.dm" #include "code\modules\mob\living\basic\farm_animals\pig.dm" +#include "code\modules\mob\living\basic\farm_animals\rabbit.dm" #include "code\modules\mob\living\basic\farm_animals\sheep.dm" #include "code\modules\mob\living\basic\farm_animals\cow\_cow.dm" #include "code\modules\mob\living\basic\farm_animals\cow\cow_ai.dm" @@ -3721,7 +3722,6 @@ #include "code\modules\mob\living\simple_animal\friendly\lizard.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\rabbit.dm" #include "code\modules\mob\living\simple_animal\friendly\robot_customer.dm" #include "code\modules\mob\living\simple_animal\friendly\sloth.dm" #include "code\modules\mob\living\simple_animal\friendly\snake.dm" diff --git a/tools/UpdatePaths/Scripts/71205_simple_rabbit_to_basic.txt b/tools/UpdatePaths/Scripts/71205_simple_rabbit_to_basic.txt new file mode 100644 index 00000000000..81ae7fc8f36 --- /dev/null +++ b/tools/UpdatePaths/Scripts/71205_simple_rabbit_to_basic.txt @@ -0,0 +1,3 @@ +# transforms simple rabbit animals to the new basic animal subtype + +/mob/living/simple_animal/rabbit/@SUBTYPES : /mob/living/basic/rabbit/@SUBTYPES{@OLD}