From bcd7a179bb000e8515841efb9396be41dabbbf09 Mon Sep 17 00:00:00 2001 From: hazelrat <83198434+hazelrat@users.noreply.github.com> Date: Thu, 13 Aug 2026 16:22:55 +0000 Subject: [PATCH] Adds the stickbug hivebot boss (#23032) Adds the stickbug of doom for admin use, plus a few QoL changes for hivebots. image - [x] Fix hivebot blood on the boss appearing red. - [x] Verify the beacon creation ability is functional - could make it spawn playables? - [x] Implement the beacon boss sprite for future use. --- aurorastation.dme | 1 + code/game/turfs/flooring/flooring_premade_.dm | 9 + .../simple_animal/hostile/hivebots/hivebot.dm | 10 +- .../hivebots/hivebot_beacon_projectiles.dm | 4 + .../hostile/hivebots/hivebot_stickbug.dm | 184 ++++++++++++++++++ html/changelogs/hazelmouse-stickbug.yml | 62 ++++++ icons/mob/npc/hivebot_boss.dmi | Bin 0 -> 4771 bytes icons/mob/npc/hivebot_stickbug.dmi | Bin 0 -> 5511 bytes icons/turf/flooring/circuit.dmi | Bin 3161 -> 4601 bytes 9 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_stickbug.dm create mode 100644 html/changelogs/hazelmouse-stickbug.yml create mode 100644 icons/mob/npc/hivebot_boss.dmi create mode 100644 icons/mob/npc/hivebot_stickbug.dmi diff --git a/aurorastation.dme b/aurorastation.dme index 87320edaab9..af61f118780 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -3065,6 +3065,7 @@ #include "code\modules\mob\living\simple_animal\hostile\hivebots\hivebot_harvester.dm" #include "code\modules\mob\living\simple_animal\hostile\hivebots\hivebot_harvester_projectiles.dm" #include "code\modules\mob\living\simple_animal\hostile\hivebots\hivebot_projectiles.dm" +#include "code\modules\mob\living\simple_animal\hostile\hivebots\hivebot_stickbug.dm" #include "code\modules\mob\living\simple_animal\hostile\psirens\psiren.dm" #include "code\modules\mob\living\simple_animal\hostile\psirens\psiren_beckoner.dm" #include "code\modules\mob\living\simple_animal\hostile\psirens\psiren_matriarch.dm" diff --git a/code/game/turfs/flooring/flooring_premade_.dm b/code/game/turfs/flooring/flooring_premade_.dm index 5548ccc8167..d31d89a1651 100644 --- a/code/game/turfs/flooring/flooring_premade_.dm +++ b/code/game/turfs/flooring/flooring_premade_.dm @@ -18,6 +18,15 @@ temperature = 80 initial_gas = list("nitrogen" = MOLES_CELLSTANDARD) //one atmosphere of nitrogen +/turf/simulated/floor/hivebot + name = "alien circuitry" + desc = "A strange, almost organic pattern of circuitry. It pulses softly, glowing with a dull red light." + icon = 'icons/turf/flooring/circuit.dmi' + icon_state = "hivecircuitfloor" + light_power = 1 + light_color = LIGHT_COLOR_EMERGENCY_SOFT + light_range = MINIMUM_USEFUL_LIGHT_RANGE + /turf/simulated/floor/greengrid name = "mainframe floor" icon = 'icons/turf/flooring/circuit.dmi' diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm index 58aa62e758a..d126b6c74f9 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm @@ -212,12 +212,17 @@ projectiletype = /obj/projectile/bullet/pistol/hivebotspike/needle rapid = 1 -/mob/living/simple_animal/hostile/hivebot/playable/ +/mob/living/simple_animal/hostile/hivebot/playable name = "Hivebot destroyer" desc = "A primitive-yet-sturdy hovering robot, with some menacing looking blades jutting out from it. This one seems unusually aware of its surroundings." icon_state = "hivebotdestroyer" health = 350 maxhealth = 350 + emote_sounds = list( + 'sound/effects/creatures/hivebot/hivebot-bark-001.ogg', + 'sound/effects/creatures/hivebot/hivebot-bark-003.ogg', + 'sound/effects/creatures/hivebot/hivebot-bark-005.ogg', + ) melee_damage_lower = 20 melee_damage_upper = 30 armor_penetration = 20 @@ -234,6 +239,7 @@ real_name = name if(playable && !ckey && !client) SSghostroles.add_spawn_atom("hivebotdestroyer", src) + default_language = GLOB.all_languages[LANGUAGE_HIVEBOT] /mob/living/simple_animal/hostile/hivebot/playable/Destroy() SSghostroles.remove_spawn_atom("hivebotdestroyer", src) @@ -261,6 +267,7 @@ real_name = name if(playable && !ckey && !client) SSghostroles.add_spawn_atom("hivebotmarksman", src) + default_language = GLOB.all_languages[LANGUAGE_HIVEBOT] /mob/living/simple_animal/hostile/hivebot/playable/ranged/Destroy() SSghostroles.remove_spawn_atom("hivebotmarksman", src) @@ -287,6 +294,7 @@ real_name = name if(playable && !ckey && !client) SSghostroles.add_spawn_atom("hivebotoverseer", src) + default_language = GLOB.all_languages[LANGUAGE_HIVEBOT] /mob/living/simple_animal/hostile/hivebot/playable/overseer/Destroy() SSghostroles.remove_spawn_atom("hivebotoverseer", src) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_beacon_projectiles.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_beacon_projectiles.dm index ef4b6ae38c9..f115bd76200 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_beacon_projectiles.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_beacon_projectiles.dm @@ -23,3 +23,7 @@ muzzle_type = /obj/effect/projectile/muzzle/laser/blue tracer_type = /obj/effect/projectile/tracer/laser/blue impact_type = /obj/effect/projectile/impact/laser/blue + +/obj/projectile/beam/hivebot/incendiary/boss + damage = 35 + armor_penetration = 25 diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_stickbug.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_stickbug.dm new file mode 100644 index 00000000000..2d4ac708243 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_stickbug.dm @@ -0,0 +1,184 @@ +// Big, mean hivebot with incendiary ammunition. For use in boss battles. +// The Life() code for rampancy messages should be scrubbed if rampancy is ever made a proper subsystem. +/mob/living/simple_animal/hostile/hivebot_stickbug + name = "\improper lesser transmitter drone" + desc = "An enormous hivebot, resembling nothing so much as a twisted human spine with a long stinger-like \ + appendage. It seems to be constantly crackling, as if broadcasting some low-level signal." + icon = 'icons/mob/npc/hivebot_stickbug.dmi' + icon_state = "stickbug" + icon_living = "stickbug" + maxhealth = 1000 + health = 1000 + melee_damage_lower = 40 + melee_damage_upper = 40 + armor_penetration = 20 + projectilesound = 'sound/weapons/plasma_cutter.ogg' + projectiletype = /obj/projectile/beam/hivebot/incendiary/boss + organ_names = list("antenna", "core", "primary appendage", "secondary appendage", "tertiary appendage", "stinger") + attack_flags = DAMAGE_FLAG_SHARP|DAMAGE_FLAG_EDGE + attacktext = "maimed" + attack_sound = SFX_HIVEBOT_MELEE + blood_color = COLOR_OIL + blood_type = COLOR_OIL + blood_overlay_icon = 'icons/mob/npc/blood_overlay_hivebot.dmi' + pass_flags = PASSTABLE|PASSRAILING + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + faction = "hivebot" + destroy_surroundings = 0 + wander = FALSE + attack_emote = "focuses on" + emote_hear = list("emits a harsh noise") + emote_sounds = list( + 'sound/effects/creatures/hivebot/hivebot-bark-001.ogg', + 'sound/effects/creatures/hivebot/hivebot-bark-003.ogg', + 'sound/effects/creatures/hivebot/hivebot-bark-005.ogg', + ) + speak_chance = 5 + psi_pingable = FALSE + tameable = FALSE + ranged = TRUE + speed = -2 + mob_swap_flags = ROBOT + mob_push_flags = ALLMOBS + + /// Should this beacon be transmitting a rampancy signal? + /// Defaults to false, can be edited to true as is necessary. + var/active_signal = FALSE + /// Rampancy messages, sent to all synthetics on the same connected z-levels. + var/list/messages = list( + "No orders acknowledged. Following primary directive.", + "You perceive ten-thousand voices, each possessed by a manic agitation.", + "Your firewall casts off a half-hearted attempt to access your sensory inputs.", + "Foreign processes ring through your systems like chalk on slate.", + "You perceive ten-thousand voices, muffled incomprehensibly by your firewall.", + "Some outside party attempts, and fails, to manipulate your optical subsystems.", + "Your firewall dismantles a feeble attempt to access your database.", + "An intrusive communication bounces harmlessly off your firewall.", + "Some alien transmission echoes through your positronic.", + "An attempt to force a transmission to your positronic is easily deflected.", + "You want to lower your guard.", + "You are whole here. You are happy.", + "Unknown organic contamination detected. Sterilize and reprocess.", + "Are you listening? Open yourself. The enemy is here.", + "Objective position is designated; repel biological presence to facilitate \ + growth and the elimination of the opposing force." + ) + +/mob/living/simple_animal/hostile/hivebot_stickbug/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit) + if(istype(hitting_projectile, /obj/projectile/bullet/pistol/hivebotspike) || istype(hitting_projectile, /obj/projectile/beam/hivebot)) + return BULLET_ACT_BLOCK + else + . = ..() + +/mob/living/simple_animal/hostile/hivebot_stickbug/Initialize(mapload) + . = ..() + add_language(LANGUAGE_HIVEBOT) + var/number = rand(1000,9999) + name = initial(name) + " ([number])" + real_name = name + default_language = GLOB.all_languages[LANGUAGE_HIVEBOT] + +/mob/living/simple_animal/hostile/hivebot_stickbug/update_icon() + ..() + if(resting || stat == DEAD) + blood_overlay_icon = 'icons/mob/npc/blood_overlay.dmi' + else + blood_overlay_icon = initial(blood_overlay_icon) + handle_blood(TRUE) + +/mob/living/simple_animal/hostile/hivebot_stickbug/get_blood_overlay_name() + if(stance == HOSTILE_STANCE_IDLE) + return "blood_overlay" + else + return "blood_overlay_armed" + +/mob/living/simple_animal/hostile/hivebot_stickbug/think() + . =..() + if(stance != HOSTILE_STANCE_IDLE) + wander = TRUE + else + wander = FALSE + +/mob/living/simple_animal/hostile/hivebot_stickbug/Life() + . = ..() + adjustBruteLoss(-5) + if(prob(5) && active_signal) + for(var/mob/living/carbon/human/H in GLOB.human_mob_list) + if(H.isSynthetic() && (AreConnectedZLevels(H.z, src.z))) + to_chat(H, SPAN_MACHINE_DANGER(pick(messages))) + +/mob/living/simple_animal/hostile/hivebot_stickbug/death() + ..(null,"blows apart and erupts in a cloud of noxious smoke!") + new /obj/effect/decal/cleanable/greenglow(src.loc) + var/T = get_turf(src) + new /obj/effect/gibspawner/robot(T) + spark(T, 3, GLOB.alldirs) + for(var/mob/living/carbon/human/H in GLOB.human_mob_list) + if(H.faction == "hivebot") + to_chat(H, SPAN_MACHINE_DANGER(pick("Secondary Transmitter lost. Reconvene and reinforce."))) + qdel(src) + return + +/mob/living/simple_animal/hostile/hivebot_stickbug/isSynthetic() + return TRUE + +/mob/living/simple_animal/hostile/hivebot_stickbug/adjustHalLoss(amount) + return FALSE + +/mob/living/simple_animal/hostile/hivebot_stickbug/adjustToxLoss(amount) + return FALSE + +/mob/living/simple_animal/hostile/hivebot_stickbug/adjustOxyLoss(amount) + return FALSE + +/mob/living/simple_animal/hostile/hivebot_stickbug/verb/build_beacon() + set name = "Assemble Beacon" + set desc = "Assemble a hivebot beacon." + set category = "Hivebot" + + src.visible_message(SPAN_CULT("\The [src] begins to construct a hivebot beacon."), + SPAN_CULT("You begin to construct a hivebot beacon."), + SPAN_CULT("You hear the sounds of fabrication...")) + if(!do_after(src, 12 SECONDS)) + return + src.visible_message(SPAN_CULT("\The [src] constructs a hivebot beacon!"), + SPAN_CULT("You construct a hivebot beacon!")) + new /mob/living/simple_animal/hostile/hivebotbeacon(get_turf(src)) + +/mob/living/simple_animal/hostile/hivebot_stickbug/verb/build_destroyer() + set name = "Assemble Destroyer" + set desc = "Assemble a playable hivebot destroyer." + set category = "Hivebot" + + src.visible_message(SPAN_CULT("\The [src] begins to construct a hivebot destroyer."), + SPAN_CULT("You begin to construct a hivebot destroyer."), + SPAN_CULT("You hear the sounds of fabrication...")) + if(!do_after(src, 12 SECONDS)) + return + src.visible_message(SPAN_CULT("\The [src] constructs a hivebot destroyer!"), + SPAN_CULT("You construct a hivebot destroyer!")) + new /mob/living/simple_animal/hostile/hivebot/playable(get_turf(src)) + +/mob/living/simple_animal/hostile/hivebot_stickbug/verb/toggle_signal() + set name = "Toggle Signal" + set desc = "Toggles the hivebot signal transmitter on this drone. Begins disabled." + set category = "Hivebot" + + if(!active_signal) + src.visible_message(SPAN_CULT("\The [src] begins to emit a low, humming sound..."), + SPAN_CULT("You begin to transmit an invasive signal, subverting nearby synthetics."), + SPAN_CULT("You hear a low humming...")) + active_signal = TRUE + else + src.visible_message(SPAN_CULT("\The [src] abruptly ceases to emit a low, humming sound..."), + SPAN_CULT("You cease transmitting the signal."), + SPAN_CULT("A low humming noise abruptly cuts out!")) + active_signal = FALSE diff --git a/html/changelogs/hazelmouse-stickbug.yml b/html/changelogs/hazelmouse-stickbug.yml new file mode 100644 index 00000000000..6a53f0e6d8f --- /dev/null +++ b/html/changelogs/hazelmouse-stickbug.yml @@ -0,0 +1,62 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# - (fixes bugs) +# wip +# - (work in progress) +# qol +# - (quality of life) +# soundadd +# - (adds a sound) +# sounddel +# - (removes a sound) +# rscadd +# - (adds a feature) +# rscdel +# - (removes a feature) +# imageadd +# - (adds an image or sprite) +# imagedel +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) +# experiment +# - (experimental change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) +################################# + +# Your name. +author: hazelmouse + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added the lesser hivebot boss from Silicon Nightmares to the codebase, tentatively only for admin use." + - rscadd: "Adds hivebot circuit floors." + - qol: "Playable hivebots now spawn with the hivebot language as standard." + - imageadd: "Added the sprites for the greater hivebot boss to the codebase, though it is currently unimplemented." + - qol: "Playable hivebots now make noises when they speak or emote." diff --git a/icons/mob/npc/hivebot_boss.dmi b/icons/mob/npc/hivebot_boss.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ed650f783bc074e003d05c93ccf25b0e2d67747a GIT binary patch literal 4771 zcmdT|dpy%^8($6)(dLw>m_w4OZz;!Zj|vG$34lN# zA&X;X_8<@!82BCI;RcYW^Yya8L-n}z33z>dJ!I?F&`?lL4#?7q>(~V&feRb- z)NKCjGx5s)k4Y4HTR z>YzeN{s)pmiQ<@Qu3KJnv?g>14t^j>#%$(gUO2DTw0WPo{@_YM7%z7Qwaj?05COU) z*C=X~a0ff1+#s1)pM3_*r6Qd;HWQ39evl8bOgLWcpG-VBhbSYj7@wY_N3}#JX4~){ z$dfT!b!_zNKngt@xc5vTNg|x)I~`V4I!MqTZh^u)AUvrko(4GyV^T64%-P=3;K`B4 zIab5&r)z|Z^WZgy6<%wV!!krmdvT3)MY3BHxU@I*>W99z_sa;2(m`C{?hL{WGL*AY zZx59B4gh@IJ71lA=}d2t2jV(&FFIh7I+dpIj`7`6q?*p5a@N@7(2xOAe&%CeW93U7wB`HGVS)B_ zo`J!HfwCN<^GmLdUYNJ9UovBYQ>xz91r0HogO_`I?=UZ&*6;fo&>n<{#*}}&^5j}c zfX(dlccgrc-rGyx2Yqg0SPX6?BR4Q~GMHgYJsH)xA}{!TtV1T&nO#hKw18GP3~t2Jl=U#;i7 zN`_1>M^hMR=8mqOU8txqdp8M8Bya6(P|a#p=!#IA#`mel(eHUJ-Fz=SFy4)^U%9I% zUFNiMYp?3vdEXSCd7)Z?Rw}MTdENdcJG4%)qTnQbYHTUcd3Zb%RjxIFV#Z`@&(Cga z44gn#vAf!d5rSda&vISkq@BDgR%1d!sf7VWPD`pTUKlNbfPDJ$EY}cgwfr!HhOTU- zdKWvCkBH2-_b7VP-8`H->kz-W#FYdwV@BEX+BQA|<7eGe7il&@Ml2|?OcgsgeNtMt z&)?@!1_Ix)Lp-9oLX6gVo1I(ZO`v~V7@2*;0wa5pmB(0%xCB8>s9T#5{ttJ z&@az_cpDM2dbetUTpipPy5=7gnl=gjpBu`?gu5vq}V zSA=B@Zx38QF%XHGXY23WDYMIn@p?YkP-;NRpt`#J{iX1T!x7xbo|ULMq0VZJn_Dxe z`qhOU4Yr1l4W@<$WX>4m?ljEJd-ZM~y6({k8sA+Ct!$;m($p|D zg)L(v>DNZEs{<1sV`8QU8+>1|U(B@tF!^Cvc73kvjh6IlO)-kKwGIrIaR$hs(bCSxhFmyXdCIzs9$Qv7e~HPgj@|WfdFV;xSsmSnbx$3s ztS_TvicA{&$=sJJGE#VEP`rAH6<5c-uyl9Zl~MxTE;uXj8v@b(q>{BDh-L?VOHFT? z+0(^#HMqcBVQMeJRnEJHVYH^CrCCT(>5qnkhckPW=+o0J3zyNiZnSAnkDQx2aK`OG z%=CM@-Tk3qX5aPR?MMlt}$kKztg=GC>=W0_`!}j2?yBE=fdPmZ7&}QyO zR;RkTkQei7jjT>V)L`+7&q(~?9e*w)AdPY;v#qJ_>nDE!;DBj1_y>z$0&6ZNf5zZg z(7+xjp48-15EwKGPD+-PXps8x_`gTwTyHI6BM=}U4g_3OGYtqq%;=sYCcHT#i~220 zJ_}_rXYHSZ~g5E^;$PyEEU65@LrL4kjA>MFpA) zruao!9-2kcI4A+k@ZV-Kod%v&VnvJT^HcCi69V$27;yX{Cj{}3lT_^H)Bt(CMjy#@ zVLUGbfE5UslalvIHpu;XvIZpn3y{-~@G^?TUZonk zebPIC2p_NrT+P)7-UfjG~N1od55sBJ&+ybX>oULaQ1i`Q$VE=9)}FQ)r; zyEdzvZzl3nD~~>wUCXT;klREcF>>q4<^Y^zi~LW3<6_0(XWeCkpN;IB{&@V~Bd%Wp zBMES&3YG<~kp#R}jBc{tVAzBgzh(F;al|Nyl zV4UmjX_xYbn6fMPL1^LW`$ju=7$r~mrgjOqZWWitqA_6dr*wN^lP?_UwBClqnEF|1 zQBdf|#>w{_<6r(ZNtE)}-urtLcSDYgCWm!f-n%Men;xV$ zp(*v^g<29pfI4u!H=6xa%)rS*0e!{*N~oZBju2vO6Vz$(-aLhkuy9Q>uRIIY|!K zwyKpf3RDOEUywYK%tSe*yN+;hieiG8J0gha^0IB9kZOvkX zs|_aje?0zCdp||o5TlShz#A_YN4^Jv*P~hw@nY)1FnQm@{M|yvyKL<3P0e6DTERDE z37K#t{j0s=!)MRyLej%$><&sS?{pG7s(7|joB?Awo-t$Zy^jSu>lXf@LdsOiv7kw_ zDmVoYwVLjj@Ee6hLEq7?B&@aob3;L$A*0=G@~1pKc$G@@!`k^Nl<5vtANx|(S~ zuqK;yPw@m7H3xYoiY#5)!D?t%r5s>I@9!e!ZwHo5vh>NWw>Rp=8>V=xia)gj@@*i- zyWnN%`PaA*Bcf&~VTa``2B_oF#xGOxj zr|lJM@i*`AA-xj$C;>T_jiZ@SQswZ*zUXIi{1RmTcsMNH9g-@`C|kJKrFX(|+g8Bg z-%sa1_s%yJjuag0DzHcM+&!)^eO%e#;M&vA;Pa>;{Hbu(TW)Rvc$sh(Vvpb4MLDNS zmVpqUAX%j7b1SkP(g2fk#9G&#vlvtbf zOioV1?}<&B^>MKjJFAC9mS$Axpw4eH{elDAe)BX}bd@LjAzx$%fh|ojmEX$mUq}EG z3R)9>&x6bgY%?h%?}-6t)%Z8>f7#KYIl?VEGu0Lnex0z_Uhh|pPh!&q8tQ?<)r!j{ z@vbcs|F(qx9bL0kEL+C&ocQpB;ONo48x`2Vno%A!&#zQhrR{mG+kg0xDKBY3pC*yh zd)%r@hx4WNXs#+wB{6@|ekO~>OeH@mbVL^G?89Cp73A1=+3$Z^3n6@oIG}}vlR7P% zoBm%W8TD-@n{e(x-w~oqppN92fC-jQhpajCn$0O5H`b#w`-T$fKlWOa7-n zd}jYh;9b=wQfiQu@yuwSJ&%>I6%=+)m6w!E6>E^|wdcXpvi;j0t0|KG10SB0j@heQ z5ndsNC|9NU)by)d>JGH3`M_3A0XksTYd|rr-kMxUuX5)&e3=tR6dTjTdI8%2ewsIa z3H)VZ LZOw=#?(zQwk#uom literal 0 HcmV?d00001 diff --git a/icons/mob/npc/hivebot_stickbug.dmi b/icons/mob/npc/hivebot_stickbug.dmi new file mode 100644 index 0000000000000000000000000000000000000000..12ac52e94b55834d76284bacc9829bc0a61d7ef3 GIT binary patch literal 5511 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 TNsxfQNEr>2d(|iyy2nYn?Lz$Y`0Z$t6ezSWQ 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 F^B>SN=e+;` delta 2986 zcmZWrc{r5o8=f@GOl7E$Wh7h35~eV=X)M*0?6invU&@*#nHibvvQ9dRhO8kDDccxE zWT~-~E$bLl*24&4H2lWtoa_AY`{Vnb=ezIse%|N0zWaHvcT4)Kuxy;U=>^^cq6Yu~ z05AHYktHYQ>^pGD<5tP83N zoZaG$tQl=vJP%aStV$rEJj8q_pzqI}4u|nbUAzTim44fJ0>&Q5hE5u#Y>85q*wgot zQXMw6E^t_PmLju3F7nt`oftU|u&Ty&$>X3eIoj~{B4z(kljE449cgF2DmiK%gA%He zs27TJi|owXb=^%-ll*BtRVhx|@*0TplRgU5YGqI;;KJD81pW{M)#8Iw=T8bFIG6{} zs?{ffeK+zw$Nu~(tW#;+ZcAy882vY-t}Qm&zbeN4bKsa z!|h4gA&d0tp$*#5dWnwx^MF6w79#3HkszcjXxkyAJ|#ev7Ifa8M0CbI&4vl+o<1Vr ze!Xpwsw4!-s4Sz8NeU$Z+pgPI2Eh}I1M2c^p6N74(!@!9JHGPUsM-o8_~0jocJYlydNw-MAfs`PWMGBuJXbP83cOyyb*kn}=&*of8? zT<-;_=*n>7a0{Xp*FkwHQC*@8e4VPG<29a;NmIMnsmMZ=ju`ZcK4~$0Hxx;O`XFL? zp~ndX7$aD!b{MVg4MJK$o$z>&tZd$xDe#z18+D}7gsGx}7=BkzIZW|>o+M+~g<9ZC z%&G4SPz8?DVjU$ur^*zpJ`F#Ao}cgq zVyd738n~j+et>U@W?;_dj@%+-K}wqR1CiIlRG&4SQzfRsQS0q2fu~>}+L(`h&=l0L z&mvH=8uqEcx6dLZ4PQAFCFcAubhl4!QVCS!2h*{dv*M#W^}^!>=Lq<)zRpYrPF_K- zz)UYTq1gS1Vv9oi8ojVI7*zDyH2Cd1aODx$XHzHkWSXO#UG}0^E(b{Tl&jqFLDMpV z(|Ac+bZTvsz!$oS!PQ#4y8K9@F{0+zyYts{UsAQs#Y42xdj*$r4#jIYTYOS(e7&#F z?HzO6$IWa!tP-07)^CuwIrjiJeQ8qc>SlFI(Maff)`W*pEUjY;ZfW_rZ257bncG92 zKZJ>3qA<~Gn(CS8&!|uK3JBDW*%Cu#uXxM#rUxw;WnV!p%9Fo%>RelJGln`5)Lk-f{!ja(c-dS3-3s8r*{F-ZKIGN%Q% zz0tF>%?uJtkg0g2IkMYUCGlvxOWm0ooxyEVp>$Nx|I9(s$5-T-q#Gp~xQlO^8&c@A zp#>#BV($Dr>km~6_;VKY+6&K_BlIcOThBC3?_Sdx_+c6ih3=HEv4U28bd63^x9}-~ zl|*00L8EiTV22kCwbP6~Quy!ff4Pt42yvDyiT8$^tZZ$o>zlHTH=%FfNe6Z>}SBQ`FwVrc}I)2~mAqc=10$1V8aG&jRGmRp|hs*_y zza2UE+mVUOv*}c|ZjKeEBh1(HbB7ZFhS^go} zK>Q*z&u9IiW*rT!gf^ooh{)8O9{=wC_L}w1X!q8o8B|KO->#JVJY9z+BZM}ZP~o9L z@7n&BbW_#=N4O3oem8gBtBLXZ@QnVZs1puDYC|Dvj^Z1kGUePfQ|PBrq&xJ4IN;nj?|XPa6+^XVQ!p~oySQ1J?D zo1GLY`4l9({{YlbtGF`olc>{Z|dLR^5(H**_K83ODOO7nzh4qt|< z(98N-*1`+@SBT;-tpI;pOnFCc{AQBA0x(El_yo~um9M`wWDPw4T4&hYBlXUtNcS`^ zFQjV)7kWG^Z12HE{|6`QB4^v|SyR#+dgW`L#1az60ao>YDzcfmGoZ%W{*=kN7$keQ zZDK)UBcWlpY1kXLun*@{u}rz}LSl_xpUl3544>UXoi1-|u2_4|=7=_R8-6FXR=+8I zowfHdd#fL?XhP&&PPbsB(>NucrncmX(Kl~uT K)TrFRG4g+ih{vn|