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 00000000000..ed650f783bc Binary files /dev/null and b/icons/mob/npc/hivebot_boss.dmi differ diff --git a/icons/mob/npc/hivebot_stickbug.dmi b/icons/mob/npc/hivebot_stickbug.dmi new file mode 100644 index 00000000000..12ac52e94b5 Binary files /dev/null and b/icons/mob/npc/hivebot_stickbug.dmi differ diff --git a/icons/turf/flooring/circuit.dmi b/icons/turf/flooring/circuit.dmi index 3617171b977..e73449a87b3 100644 Binary files a/icons/turf/flooring/circuit.dmi and b/icons/turf/flooring/circuit.dmi differ