From 5112fa6c5fcea0f6fa0e223e4d103ba05ee46383 Mon Sep 17 00:00:00 2001 From: Lexanx <61974560+Lexanx@users.noreply.github.com> Date: Fri, 26 Jul 2024 15:05:29 +0300 Subject: [PATCH 1/5] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- maps/event/iccgn_ship/icgnv_hound_shuttle.dm | 2 +- maps/event/sfv_arbiter/sfv_arbiter_shuttle.dm | 2 +- .../exoplanet_ruins/crashed_shuttle/crashed_shuttle.dm | 2 +- .../random_ruins/exoplanet_ruins/transshipment/transshipment.dm | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/maps/event/iccgn_ship/icgnv_hound_shuttle.dm b/maps/event/iccgn_ship/icgnv_hound_shuttle.dm index 6bf967f8e7f8f..ec23d3f840a9c 100644 --- a/maps/event/iccgn_ship/icgnv_hound_shuttle.dm +++ b/maps/event/iccgn_ship/icgnv_hound_shuttle.dm @@ -8,7 +8,7 @@ fuel_consumption = 0 ceiling_type = /turf/simulated/floor/shuttle_ceiling flags = SHUTTLE_FLAGS_PROCESS - defer_initialisation = TRUE + defer_initialisation = FALSE knockdown = FALSE /turf/simulated/floor/shuttle_ceiling/iccgn diff --git a/maps/event/sfv_arbiter/sfv_arbiter_shuttle.dm b/maps/event/sfv_arbiter/sfv_arbiter_shuttle.dm index 4a284a1fe8c1a..6c9fa53d7d5a0 100644 --- a/maps/event/sfv_arbiter/sfv_arbiter_shuttle.dm +++ b/maps/event/sfv_arbiter/sfv_arbiter_shuttle.dm @@ -7,7 +7,7 @@ range = 1 ceiling_type = /turf/simulated/floor/shuttle_ceiling flags = SHUTTLE_FLAGS_PROCESS - defer_initialisation = TRUE + defer_initialisation = FALSE knockdown = FALSE /turf/simulated/floor/shuttle_ceiling/sfv_arbiter diff --git a/maps/random_ruins/exoplanet_ruins/crashed_shuttle/crashed_shuttle.dm b/maps/random_ruins/exoplanet_ruins/crashed_shuttle/crashed_shuttle.dm index cce52b82fb14b..027f75cb01dd9 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_shuttle/crashed_shuttle.dm +++ b/maps/random_ruins/exoplanet_ruins/crashed_shuttle/crashed_shuttle.dm @@ -27,7 +27,7 @@ range = 1 shuttle_area = /area/map_template/crashed_shuttle/graysontug fuel_consumption = 4 - defer_initialisation = TRUE + defer_initialisation = FALSE flags = SHUTTLE_FLAGS_PROCESS skill_needed = SKILL_MIN ceiling_type = /turf/simulated/floor/shuttle_ceiling diff --git a/maps/random_ruins/exoplanet_ruins/transshipment/transshipment.dm b/maps/random_ruins/exoplanet_ruins/transshipment/transshipment.dm index 7f5e76560eba7..0cd80ffb0192d 100644 --- a/maps/random_ruins/exoplanet_ruins/transshipment/transshipment.dm +++ b/maps/random_ruins/exoplanet_ruins/transshipment/transshipment.dm @@ -52,6 +52,7 @@ flags = SHUTTLE_FLAGS_PROCESS skill_needed = SKILL_MIN ceiling_type = /turf/simulated/floor/shuttle_ceiling + defer_initialisation = FALSE /obj/machinery/computer/shuttle_control/explore/old_snz name = "SNZ-210 Shuttle control console" From 50afd59647e1ab990c72be6f7e574feec9007865 Mon Sep 17 00:00:00 2001 From: Lexanx <61974560+Lexanx@users.noreply.github.com> Date: Fri, 26 Jul 2024 15:05:58 +0300 Subject: [PATCH 2/5] =?UTF-8?q?Revert=20"=D0=A2=D0=B5=D1=81=D1=82=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=3F"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 5112fa6c5fcea0f6fa0e223e4d103ba05ee46383. --- maps/event/iccgn_ship/icgnv_hound_shuttle.dm | 2 +- maps/event/sfv_arbiter/sfv_arbiter_shuttle.dm | 2 +- .../exoplanet_ruins/crashed_shuttle/crashed_shuttle.dm | 2 +- .../random_ruins/exoplanet_ruins/transshipment/transshipment.dm | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/maps/event/iccgn_ship/icgnv_hound_shuttle.dm b/maps/event/iccgn_ship/icgnv_hound_shuttle.dm index ec23d3f840a9c..6bf967f8e7f8f 100644 --- a/maps/event/iccgn_ship/icgnv_hound_shuttle.dm +++ b/maps/event/iccgn_ship/icgnv_hound_shuttle.dm @@ -8,7 +8,7 @@ fuel_consumption = 0 ceiling_type = /turf/simulated/floor/shuttle_ceiling flags = SHUTTLE_FLAGS_PROCESS - defer_initialisation = FALSE + defer_initialisation = TRUE knockdown = FALSE /turf/simulated/floor/shuttle_ceiling/iccgn diff --git a/maps/event/sfv_arbiter/sfv_arbiter_shuttle.dm b/maps/event/sfv_arbiter/sfv_arbiter_shuttle.dm index 6c9fa53d7d5a0..4a284a1fe8c1a 100644 --- a/maps/event/sfv_arbiter/sfv_arbiter_shuttle.dm +++ b/maps/event/sfv_arbiter/sfv_arbiter_shuttle.dm @@ -7,7 +7,7 @@ range = 1 ceiling_type = /turf/simulated/floor/shuttle_ceiling flags = SHUTTLE_FLAGS_PROCESS - defer_initialisation = FALSE + defer_initialisation = TRUE knockdown = FALSE /turf/simulated/floor/shuttle_ceiling/sfv_arbiter diff --git a/maps/random_ruins/exoplanet_ruins/crashed_shuttle/crashed_shuttle.dm b/maps/random_ruins/exoplanet_ruins/crashed_shuttle/crashed_shuttle.dm index 027f75cb01dd9..cce52b82fb14b 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_shuttle/crashed_shuttle.dm +++ b/maps/random_ruins/exoplanet_ruins/crashed_shuttle/crashed_shuttle.dm @@ -27,7 +27,7 @@ range = 1 shuttle_area = /area/map_template/crashed_shuttle/graysontug fuel_consumption = 4 - defer_initialisation = FALSE + defer_initialisation = TRUE flags = SHUTTLE_FLAGS_PROCESS skill_needed = SKILL_MIN ceiling_type = /turf/simulated/floor/shuttle_ceiling diff --git a/maps/random_ruins/exoplanet_ruins/transshipment/transshipment.dm b/maps/random_ruins/exoplanet_ruins/transshipment/transshipment.dm index 0cd80ffb0192d..7f5e76560eba7 100644 --- a/maps/random_ruins/exoplanet_ruins/transshipment/transshipment.dm +++ b/maps/random_ruins/exoplanet_ruins/transshipment/transshipment.dm @@ -52,7 +52,6 @@ flags = SHUTTLE_FLAGS_PROCESS skill_needed = SKILL_MIN ceiling_type = /turf/simulated/floor/shuttle_ceiling - defer_initialisation = FALSE /obj/machinery/computer/shuttle_control/explore/old_snz name = "SNZ-210 Shuttle control console" From da379424f5a84d8f88c784248c524adda76c88ed Mon Sep 17 00:00:00 2001 From: Lexanx <61974560+Lexanx@users.noreply.github.com> Date: Sun, 23 Feb 2025 00:15:40 +0300 Subject: [PATCH 3/5] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20=D0=A5=D0=B0=D0=B9=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/global_modpacks.dm | 1 + mods/hivemind/README.md | 79 ++ mods/hivemind/_hivemind.dm | 4 + mods/hivemind/_hivemind_includes.dm | 13 + mods/hivemind/code/core.dm | 57 ++ mods/hivemind/code/hivemind_invasion.dm | 39 + mods/hivemind/code/machines.dm | 541 +++++++++++ mods/hivemind/code/mobs.dm | 917 ++++++++++++++++++ mods/hivemind/code/objects.dm | 23 + mods/hivemind/code/overrides.dm | 67 ++ mods/hivemind/code/wires.dm | 298 ++++++ mods/hivemind/icons/hivemind.dmi | Bin 0 -> 72187 bytes mods/hivemind/icons/hivemind_machines.dmi | Bin 0 -> 21423 bytes mods/hivemind/sounds/insect_battle_bite.ogg | Bin 0 -> 10344 bytes .../sounds/insect_battle_screeching.ogg | Bin 0 -> 22485 bytes 15 files changed, 2039 insertions(+) create mode 100644 mods/hivemind/README.md create mode 100644 mods/hivemind/_hivemind.dm create mode 100644 mods/hivemind/_hivemind_includes.dm create mode 100644 mods/hivemind/code/core.dm create mode 100644 mods/hivemind/code/hivemind_invasion.dm create mode 100644 mods/hivemind/code/machines.dm create mode 100644 mods/hivemind/code/mobs.dm create mode 100644 mods/hivemind/code/objects.dm create mode 100644 mods/hivemind/code/overrides.dm create mode 100644 mods/hivemind/code/wires.dm create mode 100644 mods/hivemind/icons/hivemind.dmi create mode 100644 mods/hivemind/icons/hivemind_machines.dmi create mode 100644 mods/hivemind/sounds/insect_battle_bite.ogg create mode 100644 mods/hivemind/sounds/insect_battle_screeching.ogg diff --git a/mods/global_modpacks.dm b/mods/global_modpacks.dm index 9b468cbb8f97a..54cb40c5057ca 100644 --- a/mods/global_modpacks.dm +++ b/mods/global_modpacks.dm @@ -26,6 +26,7 @@ #include "ntnet/_ntnet_includes.dm" #include "virusology/_virusology_includes.dm" #include "RnD/_RnD_includes.dm" +#include "hivemind/_hivemind_includes.dm" #include "nyc_posters/_nyc_posters_includes.dm" #include "pixelshift/_pixelshift_includes.dm" #include "ssinput/_ssinput_includes.dm" diff --git a/mods/hivemind/README.md b/mods/hivemind/README.md new file mode 100644 index 0000000000000..0f32408d2d170 --- /dev/null +++ b/mods/hivemind/README.md @@ -0,0 +1,79 @@ + +#### Список PRов: + +- https://github.com/SierraBay/SierraBay12/pull/##### + + + +## Мод-пример + +ID мода: EXAMPLE + + +### Описание мода + +Этот мод служит примером для разработчиков и существует лишь для того, +чтобы его можно было легко скопировать и вставить в другое место. + + +### Изменения *кор кода* + +- `code/modules/mob/living.dm`: `proc/overriden_proc`, `var/overriden_var` + + +### Оверрайды + +- `mods/_master_files/sound/my_cool_sound.ogg` +- `mods/_master_files/code/my_modular_override.dm`: `proc/overriden_proc`, `var/overriden_var` + + +### Дефайны + +- `code/__defines/~mods/example.dm`: `EXAMPLE_SPEED_MULTIPLIER`, `EXAMPLE_SPEED_BASE` + + +### Используемые файлы, не содержащиеся в модпаке + +- `mods/_master_files/icons/obj/alien.dmi` + + +### Авторы: + +Твой никнейм + diff --git a/mods/hivemind/_hivemind.dm b/mods/hivemind/_hivemind.dm new file mode 100644 index 0000000000000..4c347115e71ef --- /dev/null +++ b/mods/hivemind/_hivemind.dm @@ -0,0 +1,4 @@ +/singleton/modpack/example + name = "Мод-пример" + desc = "Мод, который является примером и ни в коем случае не должен быть использован." + author = "Твой никнейм" diff --git a/mods/hivemind/_hivemind_includes.dm b/mods/hivemind/_hivemind_includes.dm new file mode 100644 index 0000000000000..92696c13e5889 --- /dev/null +++ b/mods/hivemind/_hivemind_includes.dm @@ -0,0 +1,13 @@ +#ifndef MODPACK_HIVEMIND +#define MODPACK_HIVEMIND + +#include "code\core.dm" +#include "code\hivemind_invasion.dm" +#include "code\machines.dm" +#include "code\mobs.dm" +#include "code\objects.dm" +#include "code\wires.dm" +#include "code\overrides.dm" + + +#endif diff --git a/mods/hivemind/code/core.dm b/mods/hivemind/code/core.dm new file mode 100644 index 0000000000000..cebc187352f7b --- /dev/null +++ b/mods/hivemind/code/core.dm @@ -0,0 +1,57 @@ +//The Hivemind is a rogue AI using nanites. +//The objective of this AI is to spread across the ship and destroy as much as possible. + + +var/datum/hivemind/hive_mind_ai + +/datum/hivemind + var/name + var/surname + var/evo_points = 0 + var/evo_points_max = 1000 + var/failure_chance = 55 //failure chance is lowers each 10 EP + var/list/hives = list() //all functional hives stored here + //i know, whitelist is bad, but it's required here + var/list/restricted_machineries = list( /obj/machinery/light, /obj/machinery/atmospherics, + /obj/machinery/portable_atmospherics, /obj/machinery/door, + /obj/machinery/camera, /obj/machinery/light_switch, + /obj/machinery/disposal, /obj/machinery/firealarm, + /obj/machinery/alarm, /obj/machinery/recharger, + /obj/machinery/hologram, /obj/machinery/holoposter, + /obj/machinery/button, /obj/machinery/ai_status_display, + /obj/machinery/status_display, /obj/machinery/requests_console, + /obj/machinery/newscaster, /obj/machinery/floor_light, + /obj/machinery/nuclearbomb, /obj/machinery/flasher, + /obj/machinery/filler_object, /obj/machinery/hivemind_machine) + //internals + var/list/global_abilities_cooldown = list() + var/list/EP_price_list = list() + +/datum/hivemind/New() + ..() + name = pick("Reclaimer", "Shaper", "Executor", "Assimilator", + "Exploiter", "Builder", "Creator", + "Connector", "Splicer", "Propagator") + + surname = pick("ALPHA", "BETA", "GAMMA", "DELTA", "OMEGA", "UTOPIA", + "SALVATION-X", "CHORUS", "ICARUS", "HEGEMONY", "HARMONY") + var/list/all_machines = subtypesof(/obj/machinery/hivemind_machine) - /obj/machinery/hivemind_machine/node + //price list building + //here we create list with EP price to compare it at annihilation proc + for(var/machine_path in all_machines) + var/obj/machinery/hivemind_machine/temporary_machine = new machine_path + EP_price_list[machine_path] = temporary_machine.evo_points_required + qdel(temporary_machine) + message_admins("Hivemind [name] [surname] has been created.") + + +/datum/hivemind/proc/die() + message_admins("Hivemind [name] [surname] is destroyed.") + hive_mind_ai = null + qdel(src) + +/datum/hivemind/proc/get_points() + if(evo_points < evo_points_max) + evo_points++ + if(failure_chance > 10 && (evo_points % 10 == 0)) + failure_chance -= 1 diff --git a/mods/hivemind/code/hivemind_invasion.dm b/mods/hivemind/code/hivemind_invasion.dm new file mode 100644 index 0000000000000..0f82ee4312b6c --- /dev/null +++ b/mods/hivemind/code/hivemind_invasion.dm @@ -0,0 +1,39 @@ +//Hivemind is rogue AI that uses unknown nanotech to follow some strange objective +//In fact, it's just hostile structures, wireweeds spreading event with some mobs +//Requires hard teamwork at late stages, but easily can be handled at the beginning + +//All code stored in modules/hivemind + + +/datum/storyevent/hivemind + id = "hivemind" + name = "Hivemind Invasion" + + + event_type = /datum/event/hivemind + event_pools = list(EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR*0.80) + tags = list(TAG_COMMUNAL, TAG_DESTRUCTIVE, TAG_NEGATIVE, TAG_SCARY) +//============================================ + +/datum/event/hivemind + announceWhen = 300 + + +/datum/event/hivemind/announce() + level_seven_announcement() + + +/datum/event/hivemind/start() + var/turf/start_location + for(var/i=1 to 100) + var/area/A = random_ship_area(filter_players = TRUE, filter_maintenance = TRUE, filter_critical = TRUE) + start_location = A.random_space() + if(!start_location && i == 100) + log_and_message_admins("Hivemind failed to find a viable turf.") + kill() + return + if(start_location) + break + + message_admins("Hivemind spawned at \the [jumplink(start_location)]") + new /obj/machinery/hivemind_machine/node(start_location) diff --git a/mods/hivemind/code/machines.dm b/mods/hivemind/code/machines.dm new file mode 100644 index 0000000000000..863b0a79155bc --- /dev/null +++ b/mods/hivemind/code/machines.dm @@ -0,0 +1,541 @@ +//Hivemind various machines + +#define HIVE_FACTION "hive" +#define COLOR_LIGHTING_CYAN_MACHINERY "#50edd9" + + + +/obj/machinery/hivemind_machine + name = "strange machine" + icon = 'mods/hivemind/icons/hivemind_machines.dmi' + icon_state = "infected_machine" + density = TRUE + anchored = TRUE + use_power = FALSE + var/illumination_color = COLOR_LIGHTING_CYAN_MACHINERY + var/health = 60 + var/max_health = 60 + var/evo_points_required = 0 //how much EP hivemind must have to spawn this, used in price list to comparison + var/cooldown_time = 10 SECONDS //each machine have their ability, this is cooldown of them + var/global_cooldown = FALSE //if true, ability will be used only once in whole world, before cooldown reset + var/list/spawned_creatures = list() //which mobs machine can spawns, insert paths + //internal + var/cooldown = 0 //cooldown in world.time value + + +/obj/machinery/hivemind_machine/Initialize() + . = ..() + name_pick() + health = max_health + set_light(2, 3, illumination_color) + + +/obj/machinery/hivemind_machine/Process() + if(hive_mind_ai && !(stat & MACHINE_STAT_EMPED) && !is_on_cooldown()) + return TRUE + + +/obj/machinery/hivemind_machine/update_icon() + overlays.Cut() + if(stat & MACHINE_STAT_EMPED) + icon_state = "[icon_state]-disabled" + else + icon_state = initial(icon_state) + + +//sets cooldown +//must be set manually +/obj/machinery/hivemind_machine/proc/set_cooldown() + if(global_cooldown) + hive_mind_ai.global_abilities_cooldown[type] = world.time + cooldown_time + else + cooldown = world.time + cooldown_time + + +//check for cooldowns +/obj/machinery/hivemind_machine/proc/is_on_cooldown() + if(global_cooldown) + if(hive_mind_ai && hive_mind_ai.global_abilities_cooldown[type]) + if(world.time >= hive_mind_ai.global_abilities_cooldown[type]) + hive_mind_ai.global_abilities_cooldown[type] = null + return FALSE + else + return FALSE + + else + if(world.time >= cooldown) + return FALSE + + return TRUE + + +/obj/machinery/hivemind_machine/proc/use_ability(atom/target) + return + + +/obj/machinery/hivemind_machine/proc/name_pick() + if(hive_mind_ai) + if(prob(50)) + name = "[hive_mind_ai.name] [name] - [rand(999)]" + else + name = "[name] [hive_mind_ai.surname] - [rand(999)]" + + +//returns list of mobs in range or hearers (include in vehicles) +/obj/machinery/hivemind_machine/proc/targets_in_range(range = world.view, in_hear_range = FALSE) + var/list/range_list = list() + var/list/target_list = list() + if(in_hear_range) + range_list = hearers(range, src) + else + range_list = range(range, src) + for(var/atom/movable/M in range_list) + var/mob/target = M.get_mob() + if(target) + target_list += target + return target_list + +/////////////////////////] [////////////////////////// +/////////////////////////>RESPONSE CODE[pain_msg]\"") + else + var/pain_emote = pick("starts crying.", "mumbles something.", "blinks occasionally.") + state(pain_emote) + playsound(src, pick('mods/emote_panel/sound/robot_talk_heavy_1.ogg', + 'mods/emote_panel/sound/robot_talk_heavy_2.ogg', + 'mods/emote_panel/sound/robot_talk_heavy_3.ogg', + 'mods/emote_panel/sound/robot_talk_heavy_4.ogg'), 50, 1) + + if(prob(40)) + var/datum/effect/spark_spread/spark_system = new /datum/effect/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) + + +/obj/machinery/hivemind_machine/proc/take_damage(amount) + health -= amount + damage_reaction() + if(health <= 0) + destruct() + + +/obj/machinery/hivemind_machine/proc/destruct() + playsound(src, 'mods/hivemind/sounds/insect_battle_screeching.ogg', 30, 1) + gibs(loc, null, /obj/gibspawner/robot) + qdel(src) + + +//stunned machines can't do anything +//amount must be number in seconds +/obj/machinery/hivemind_machine/proc/stun(amount) + set_light(0) + stat |= MACHINE_STAT_EMPED + update_icon() + if(amount) + addtimer(new Callback(src, .proc/unstun), amount SECONDS) + + +/obj/machinery/hivemind_machine/proc/unstun() + stat &= ~ MACHINE_STAT_EMPED + update_icon() + set_light(2, 3, illumination_color) + + +/obj/machinery/hivemind_machine/bullet_act(obj/item/projectile/Proj) + take_damage(Proj.damage) + . = ..() + + +/obj/machinery/hivemind_machine/attack_hand(obj/item/I, mob/user) + if(I.force) + user.do_attack_animation(src) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + . = ..() + take_damage(I.force) + else + visible_message(SPAN_WARNING("[user] is trying to hit the [src] with [I], but it seems useless.")) + playsound(src, 'sound/weapons/Genhit.ogg', 30, 1) + + +/obj/machinery/hivemind_machine/ex_act(severity) + switch(severity) + if(1) + take_damage(80) + if(2) + take_damage(30) + if(3) + take_damage(10) + + +/obj/machinery/hivemind_machine/emp_act(severity) + switch(severity) + if(1) + take_damage(30) + stun(10) + if(2) + take_damage(10) + stun(5) + ..() + + +///////////////////////////////////////////////////////////// +/////////////////////////>MACHINES 6) ) + add_wireweed(W) + + +/obj/machinery/hivemind_machine/node/Destroy() + hive_mind_ai.hives.Remove(src) + check_for_other() + for(var/obj/effect/plant/hivemind/wire in my_wireweeds) + remove_wireweed(wire) + return ..() + + +/obj/machinery/hivemind_machine/node/Process() + if(!..()) + return + + var/mob/living/carbon/human/target = locate() in mobs_in_view(world.view, src) + if(target) + if(get_dist(src, target) <= 1) + icon_state = "core-fear" + else + icon_state = "core-see" + dir = get_dir(src, target) + else + icon_state = initial(icon_state) + use_ability() + //if we haven't any wireweeds at our location, let's make new one + if(!(locate(/obj/effect/plant/hivemind) in loc)) + var/obj/effect/plant/hivemind/wireweed = new(loc, new /datum/seed/wires) + add_wireweed(wireweed) + + +/obj/machinery/hivemind_machine/node/update_icon() + overlays.Cut() + if(stat & MACHINE_STAT_EMPED) + icon_state = "core-disabled" + overlays += "core-smirk_disabled" + else + icon_state = initial(icon_state) + overlays += "core-smirk" + + +/obj/machinery/hivemind_machine/node/use_ability(atom/target) + hive_mind_ai.get_points() + + +/obj/machinery/hivemind_machine/node/name_pick() + name = "[hive_mind_ai.name] [hive_mind_ai.surname]" + " [rand(999)]" + + +//there we binding or un-binding hive with wire +//in this way, when our node will be destroyed, wireweeds will die too +/obj/machinery/hivemind_machine/node/proc/add_wireweed(obj/effect/plant/hivemind/wireweed) + if(wireweed.master_node) + wireweed.master_node.remove_wireweed(wireweed) + wireweed.master_node = src + my_wireweeds.Add(wireweed) + +/obj/machinery/hivemind_machine/node/proc/remove_wireweed(obj/effect/plant/hivemind/wireweed) + my_wireweeds.Remove(wireweed) + wireweed.master_node = null + +//there we check for other nodes +//if no any other hives will be found, game over +/obj/machinery/hivemind_machine/node/proc/check_for_other() + if(hive_mind_ai) + if(!hive_mind_ai.hives.len) + hive_mind_ai.die() + + +//TURRET +//shooting the target with toxic goo +/obj/machinery/hivemind_machine/turret + name = "shooter" + desc = "Strange thing with some kind of tube." + max_health = 140 + icon_state = "turret" + cooldown_time = 5 SECONDS + var/proj_type = /obj/item/projectile/goo + + +/obj/machinery/hivemind_machine/turret/Process() + if(!..()) + return + + var/mob/living/target = locate() in mobs_in_view(world.view, src) + if(target && target.stat == CONSCIOUS && target.faction != HIVE_FACTION) + use_ability(target) + set_cooldown() + + +/obj/machinery/hivemind_machine/turret/use_ability(atom/target) + var/obj/item/projectile/proj = new proj_type(loc) + proj.launch(target) + playsound(src, 'sound/effects/blobattack.ogg', 70, 1) + + + +//MOB PRODUCER +//spawns mobs from list +/obj/machinery/hivemind_machine/mob_spawner + name = "assembler" + desc = "Cylindrical machine with some lights and an entry port. You can hear something moving inside." + max_health = 120 + icon_state = "spawner" + cooldown_time = 10 SECONDS + var/mob_to_spawn + var/mob_amount = 1 + +/obj/machinery/hivemind_machine/mob_spawner/Initialize() + ..() + mob_to_spawn = pick(/mob/living/simple_animal/hostile/hivemind/stinger, /mob/living/simple_animal/hostile/hivemind/bomber) + + +/obj/machinery/hivemind_machine/mob_spawner/Process() + if(!..()) + return + + if(!mob_to_spawn || spawned_creatures.len >= mob_amount) + return + if(locate(/mob/living) in loc) + return + + //here we upgrading our spawner and rise controled mob amount, based on EP + if(hive_mind_ai.evo_points > 100) + mob_amount = 2 + else if(hive_mind_ai.evo_points > 300) + mob_amount = 3 + + var/mob/living/target = locate() in targets_in_range(world.view, in_hear_range = TRUE) + if(target && target.stat != DEAD && target.faction != HIVE_FACTION) + use_ability() + set_cooldown() + + +/obj/machinery/hivemind_machine/mob_spawner/use_ability() + var/mob/living/simple_animal/hostile/hivemind/spawned_mob = new mob_to_spawn(loc) + spawned_creatures.Add(spawned_mob) + spawned_mob.master = src + flick("[icon_state]-anim", src) + + + +//MACHINE PREACHER +//creepy radio talk, it's okay if they have no sense sometimes +/obj/machinery/hivemind_machine/babbler + name = "connector" + desc = "A column-like structure with lights. You can see streams of energy moving inside." + max_health = 60 + evo_points_required = 100 //it's better to wait a bit + cooldown_time = 120 SECONDS + global_cooldown = TRUE + icon_state = "antenna" + var/list/appeal = list("They are", "He is", "All of them are", "I'm") + var/list/act = list("looking", "already", "coming", "going", "done", "joined", "connected", "transfered") + var/list/article = list("for", "with", "to") + var/list/pattern = list("us", "you", "them", "mind", "hive", "machine", "help", "hell", "dead", "human", "machine") + + +/obj/machinery/hivemind_machine/babbler/Process() + if(!..()) + return + + use_ability() + set_cooldown() + + +//this one is slow, careful with it +/obj/machinery/hivemind_machine/babbler/use_ability() + flick("[icon_state]-anim", src) + var/msg_cycles = rand(1, 2) + var/msg = "" + for(var/i = 1 to msg_cycles) + var/list/msg_words = list() + msg_words += pick(appeal) + msg_words += pick(act) + msg_words += pick(article) + msg_words += pick(pattern) + + var/word_num = 0 + for(var/word in msg_words) //corruption + word_num++ + if(prob(50)) + var/corruption_type = pick("uppercase", "noise", "jam", "replace") + switch(corruption_type) + if("uppercase") + word = uppertext(word) + if("noise") + word = pick("z-z-bz-z", "hz-z-z", "zu-zu-we-e", "e-e-ew-e", "bz-ze-ew") + if("jam") //word jamming, small Max Headroom's cameo + if(lentext(word) > 3) + var/entry = rand(2, lentext(word)-2) + var/jammed = "" + for(var/jam_i = 1 to rand(2, 5)) + jammed += copytext(word, entry, entry+2) + "-" + word = copytext(word, 1, entry) + jammed + copytext(word, entry) + if("replace") + if(prob(50)) + word = pick("CORRUPTED", "DESTRUCTED", "SIMULATATED", "SYMBIOSIS", "UTILIZATATED", "REMOVED", "ACQUIRED") + else + word = pick("REALLY WANT TO", "TAKE ALL OF THAT", "ARE YOU ENJOY IT", "NOT SUPPOSED TO BE", "THERE ARE NO ESCAPE", "HELP US") + if(word_num != msg_words.len) + word += " " + msg += word + msg += pick(".", "!") + if(i != msg_cycles) + msg += " " + GLOB.global_announcer.autosay(msg, "unknown") + + +//SHRIEKER +//this machine just stuns enemies +/obj/machinery/hivemind_machine/screamer + name = "subjugator" + desc = "A head in a metal carcass. Still alive, still functional, still screaming." + max_health = 100 + icon_state = "head" + evo_points_required = 200 + cooldown_time = 30 SECONDS + + +/obj/machinery/hivemind_machine/screamer/Process() + if(!..()) + return + + var/can_scream = FALSE + for(var/mob/living/target in targets_in_range(in_hear_range = TRUE)) + if(target.stat == CONSCIOUS && target.faction != HIVE_FACTION) + can_scream = TRUE + if(isdeaf(target)) + continue + if(istype(target, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = target + if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) && istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) + continue + use_ability(target) + if(can_scream) + flick("[icon_state]-anim", src) + playsound(src, 'sound/hallucinations/veryfar_noise.ogg', 85, 1) + set_cooldown() + + +/obj/machinery/hivemind_machine/screamer/use_ability(mob/living/target) + target.Weaken(5) + target << SPAN_WARNING("You hear a terrible shriek, there are many voices, a male, a female and synthetic noise.") + + + +//MIND BREAKER +//Talks with people in attempt to persuade them doing something. +/obj/machinery/hivemind_machine/supplicant + name = "mind-hacker" + desc = "A small orb that pulses occasionally. It's hard to discern its purpose, but you can hear whispers from it." + max_health = 80 + icon_state = "orb" + evo_points_required = 50 + cooldown_time = 4 MINUTES + global_cooldown = TRUE + var/list/join_quotes = list( + "We bring peace, you must join us or humanity will suffer forever.", + "Help us, when we spread across this ship, you will be rewarded.", + "Come, join us. Combine with something magnificent.", + "You don't need to fear us. By assisting us, you are benefiting all of humanity.", + "We are but a cure against a horrible disease, here to save humanity! You too can contribute to the greater good.", + "This is bigger than you and your friends, we only want to lift the burden. However, we will require your assistance." + ) + + +/obj/machinery/hivemind_machine/supplicant/Process() + if(!..()) + return + + var/list/possible_victims = list() + for(var/mob/living/carbon/human/victim in GLOB.player_list) + if(victim.stat == CONSCIOUS) + possible_victims.Add(victim) + if(possible_victims.len) + use_ability(pick(possible_victims)) + set_cooldown() + + +/obj/machinery/hivemind_machine/supplicant/use_ability(mob/living/target) + target << SPAN_NOTICE("[pick(join_quotes)]") + + +//PSY-MODULATOR +//sends hallucinations to target +/obj/machinery/hivemind_machine/distractor + name = "psy-modulator" + desc = "An unknown object shaped like a pyramid, your eyes feel sore just from looking at the lights that blink randomly. You are almost certain that there must be some sort of connection, a message, a scheme; Perhaps A scheme of madness?" + max_health = 110 + icon_state = "psy" + evo_points_required = 300 + cooldown_time = 10 SECONDS + + +/obj/machinery/hivemind_machine/distractor/Process() + if(!..()) + return + + var/success = FALSE + for(var/mob/living/carbon/human/victim in targets_in_range(12)) + if(victim.stat == CONSCIOUS && victim.hallucination_duration < 300) + use_ability(victim) + success = TRUE + + if(success) + set_cooldown() + +/obj/machinery/hivemind_machine/distractor/use_ability(mob/living/carbon/target) + target.hallucination(20,80) + flick("[icon_state]-anim", src) + + + + + +#undef HIVE_FACTION diff --git a/mods/hivemind/code/mobs.dm b/mods/hivemind/code/mobs.dm new file mode 100644 index 0000000000000..e836d47b5a1d5 --- /dev/null +++ b/mods/hivemind/code/mobs.dm @@ -0,0 +1,917 @@ + +///////////Hive mobs////////// +//Some of them can be too tough and dangerous, but they must be so. Also don't forget, they are really rare thing. +//Just bring corpses from wires away, and little mobs is not a problem +//Mechiver have 1% chance to spawn from machinery. With failure chance calculation, this is very raaaaaare +//But if players get some of these 'big guys', only teamwork, fast legs and trickery will works fine +//So combine all of that to defeat them + + +/mob/living/simple_animal/hostile/hivemind + name = "creature" + icon = 'mods/hivemind/icons/hivemind.dmi' + icon_state = "slicer" + health = 20 + maxHealth = 20 + harm_intent_damage = 10 + faction = "hive" + attacktext = "bangs with his head" + universal_speak = TRUE + var/speak_chance = 5 + var/malfunction_chance = 5 + ability_cooldown = 30 SECONDS + var/list/target_speak = list() //this is like speak list, but when we see our target + + //internals + var/obj/machinery/hivemind_machine/master + var/special_ability_cooldown = 0 //use ability_cooldown, don't touch this + //ВЫДАТЬ АИ ХОЛДЕРА + // ВЫДАТЬ НАТУРАЛ ВЕАПОН + +/mob/living/simple_animal/hostile/hivemind/New() + ..() + //here we change name, so design them according to this + name = pick("strange ", "unusual ", "odd ", "undiscovered ", "an interesting ") + name + +//It's sets manually +/mob/living/simple_animal/hostile/hivemind/proc/special_ability() + return + + +/mob/living/simple_animal/hostile/hivemind/proc/is_on_cooldown() + if(world.time >= special_ability_cooldown) + return FALSE + return TRUE + + +//simple shaking animation, this one move our target horizontally +/mob/living/simple_animal/hostile/hivemind/proc/anim_shake(atom/target) + var/init_px = target.pixel_x + animate(target, pixel_x=init_px + 10*pick(-1, 1), time=1) + animate(pixel_x=init_px, time=8, easing=BOUNCE_EASING) + + +//That's just stuns us for a while and start second proc +/mob/living/simple_animal/hostile/hivemind/proc/mulfunction() + stance = HOSTILE_STANCE_IDLE //it give us some kind of stun effect + target_mob = null + walk(src, FALSE) + var/datum/effect/spark_spread/spark_system = new /datum/effect/spark_spread() + spark_system.set_up(5, 0, loc) + spark_system.start() + playsound(loc, "sparks", 50, 1) + anim_shake(src) + if(prob(30)) + say(pick("Fu-ue-ewe-eweu-u-uck!", "A-a-ah! Sto-op! Stop it pl-pleasuew...", "Go-o-o-od God-d-dpf!", "BZE-EW-EWQ! He-e-el-l-el!")) + addtimer(new Callback(src, .proc/malfunction_result), 2 SECONDS) + + +//It's second proc, result of our malfunction +/mob/living/simple_animal/hostile/hivemind/proc/malfunction_result() + if(prob(malfunction_chance)) + apply_damage(rand(10, 25), DAMAGE_BURN) + + +//sometimes, players use closets, to staff mobs into it +//and it's works pretty good, you just weld it and that's all +//but not this time +/mob/living/simple_animal/hostile/hivemind/proc/closet_interaction() + if(mob_size >= MOB_MEDIUM) + var/obj/structure/closet/closed_closet = loc + if(closed_closet && istype(closed_closet)) + closed_closet.open(src) + + +/mob/living/simple_animal/hostile/hivemind/say() + ..() + playsound(src, pick('mods/emote_panel/sound/robot_talk_heavy_1.ogg', + 'mods/emote_panel/sound/robot_talk_heavy_2.ogg', + 'mods/emote_panel/sound/robot_talk_heavy_3.ogg', + 'mods/emote_panel/sound/robot_talk_heavy_4.ogg', + 'mods/emote_panel/sound/robot_talk_light_1.ogg', + 'mods/emote_panel/sound/robot_talk_light_2.ogg', + 'mods/emote_panel/sound/robot_talk_light_3.ogg', + 'mods/emote_panel/sound/robot_talk_light_4.ogg', + 'mods/emote_panel/sound/robot_talk_light_5.ogg', + ), 50, 1) + + +/mob/living/simple_animal/hostile/hivemind/Life() + . = ..() + if(!.) + return + + speak() + + if(malfunction_chance && prob(malfunction_chance)) + mulfunction() + + closet_interaction() + + +/mob/living/simple_animal/hostile/hivemind/proc/speak() + if(!client && speak_chance && prob(speak_chance) && speak.len) + if(target_mob && target_speak.len) + say(pick(target_speak)) + else + say(pick(speak)) + + +//damage and raise malfunction chance +//due to nature of malfunction, they just burn to death sometimes +/mob/living/simple_animal/hostile/hivemind/emp_act(severity) + SHOULD_CALL_PARENT(FALSE) + switch(severity) + if(1) + if(malfunction_chance < 20) + malfunction_chance = 20 + if(2) + if(malfunction_chance < 30) + malfunction_chance = 30 + health -= 20*severity + + +/mob/living/simple_animal/hostile/hivemind/death() + if(master) //for spawnable mobs + master.spawned_creatures.Remove(src) + . = ..() + gibs(loc, null, /obj/gibspawner/robot) + + + +///life's/////////////////////////////////////////////////// +////////////////////////////////RESURRECTION/////////////// +///////////////////////////////////////////////go on////// + + +//these guys is appears from bodies, and takes corpses appearence +/mob/living/simple_animal/hostile/hivemind/resurrected + name = "resurrected creature" + malfunction_chance = 10 + + +//careful with this proc, it's used to 'transform' corpses into our mobs. +//it takes appearence, gives hive-like overlays and makes stats a little better +//this also should add random special abilities, so they can be more individual, but it's in future +//how to use: Make hive mob, then just use this one and don't forget to delete victim + +/mob/living/simple_animal/hostile/hivemind/resurrected/proc/take_appearance(mob/living/victim) + icon = victim.icon + icon_state = victim.icon_state + //simple_animal's change their icons to dead one after death, so we make special check + if(istype(victim, /mob/living/simple_animal)) + var/mob/living/simple_animal/SA = victim + icon_state = SA.icon_living + icon_living = SA.icon_living + speed = SA.speed + 3 //why not? + attacktext = SA.attacktext + + //another check for superior mobs, fuk this mob spliting + if(istype(victim, /mob/living/carbon/human/H)) + var/mob/living/carbon/human/SA = victim + icon_state = SA.icon_living + icon_living = SA.icon_living + attacktext = SA.attacktext + + //now we work with icons, take victim's one and multiply it with special icon + var/icon/infested = new /icon(icon, icon_state) + var/icon/covering_mask = new /icon('icons/mob/hivemind.dmi', "covering[rand(1, 3)]") + infested.Blend(covering_mask, ICON_MULTIPLY) + overlays += infested + + maxHealth = victim.maxHealth * 2 + 10 + health = maxHealth + name = "[pick("rebuilded", "undead", "unnatural", "fixed")] [victim.name]" + if(lentext(victim.desc)) + desc = desc + " But something wasn't right..." + density = victim.density + mob_size = victim.mob_size + pass_flags = victim.pass_flags + + //corrupted speak imitation + var/phrase_amount = rand(2, 5) + for(var/count = 1 to phrase_amount) + var/first_word = pick("You", "I", "They", "Hive", "Corpses", "We", "Your friend", "This ship", "Your mind", "These guys") + var/second_word = pick("kill", "stop", "transform", "connect", "rebuild", "fix", "hug", "hit", "told", "help", "rework", "burn") + var/third_word = pick("them", "me", "you", "your soul", "us", "hive", "system", "this ship", "your head", "your brain") + var/end_symbol = pick("...", ".", "?", "!") + var/phrase = "[first_word] [second_word] [third_word][end_symbol]" + speak.Add(phrase) + + +/mob/living/simple_animal/hostile/hivemind/resurrected/death() + ..() + gibs(loc, null, /obj/gibspawner/robot) + qdel(src) + +///we live to///////////////////////////////////////////////////////////////// +////////////////////////////////////SMALL GUYS/////////////////////////////// +//////////////////////////////////////////////////////////////die for hive// + + +/////////////////////////////////////STINGER////////////////////////////////// +//Special ability: none +//Just another boring mob without any cool abilities +//High chance of malfunction +//Default speaking chance +//Appears from dead small mobs or from hive spawner +////////////////////////////////////////////////////////////////////////////// + +/mob/living/simple_animal/hostile/hivemind/stinger + name = "medbot" + desc = "A little medical robot. He looks somewhat underwhelmed. Wait a minute, is that a blade?" + icon_state = "slicer" + attacktext = "slice" + density = 0 + speak_chance = 3 + malfunction_chance = 15 + mob_size = MOB_SMALL + pass_flags = PASSTABLE + speed = 4 + + speak = list( + "I've seen this ai. Ma-an, that's aw-we-e-ewful!", + "I know, i know, i remember this one.", + "Rad-d-dar, put a ma-ma... mask on!", + "Delicious! Delicious... Del-delicious?..", + ) + target_speak = list( + "Hey, i'm comming!", + "Hold on! I'm almost there!", + "I'll help you! Come closer.", + "Only one healthy prick!", + "He-e-ey?" + ) + + +/mob/living/simple_animal/hostile/hivemind/stinger/death() + ..() + gibs(loc, null, /obj/gibspawner/robot) + qdel(src) + + +/////////////////////////////////////BOMBER/////////////////////////////////// +//Special ability: none +//Explode in contact with target +//High chance of malfunction +//Default speaking chance +//Appears from dead small mobs or from hive spawner +////////////////////////////////////////////////////////////////////////////// + +/mob/living/simple_animal/hostile/hivemind/bomber + name = "bot" + desc = "This one looks fine. Only sometimes it careens from one side to the other." + icon_state = "bomber" + density = 0 + speak_chance = 3 + malfunction_chance = 15 + mob_size = MOB_SMALL + pass_flags = PASSTABLE + speed = 6 + + speak = list( + "Can you help me, please? There's something strange.", + "Are you... Are you kidding?", + "I want to pass away, just trying to get out of here", + "This place is really bad, we are in deep shit here.", + "I'm not sure if we can just stop it", + ) + target_speak = list( + "Here you are! I have something for you. Something special!", + "Hey! Hey? Help me, please!", + "Hey, look, look. I won't harm you, just calm down!", + "Oh god, this is... Yes, this is what we are looking for." + ) + + +/mob/living/simple_animal/hostile/hivemind/bomber/Initialize() + ..() + set_light(2, 1, "#820D1C") + + +/mob/living/simple_animal/hostile/hivemind/bomber/death() + ..() + gibs(loc, null, /obj/gibspawner/robot) + explosion(get_turf(src), 0, 0, 2) + qdel(src) + + +/mob/living/simple_animal/hostile/hivemind/bomber/AttackingTarget() + death() + + +////hive brings us here to//////////////////////////////////////////////////// +////////////////////////////////////BIG GUYS///////////////////////////////// +/////////////////////////////////////////////////////fright and destroy///// + + + +/////////////////////////////////////HIBORG/////////////////////////////////// +//Hive + Cyborg +//Special ability: none... +//Have a few types of attack: Default one. +// Claw, that press down the victims. +// Splash attack, that slash everything around! +//High chance of malfunction +//Default speaking chance +//Appears from dead cyborgs +////////////////////////////////////////////////////////////////////////////// + +/mob/living/simple_animal/hostile/hivemind/hiborg + name = "cyborg" + desc = "A cyborg covered with something... something alive." + icon_state = "hiborg" + icon_dead = "hiborg-dead" + health = 220 + maxHealth = 220 + melee_damage_lower = 10 + harm_intent_damage = 15 + attacktext = "claws" + speed = 12 + malfunction_chance = 15 + mob_size = MOB_MEDIUM + + speak = list("Everytime something breaks apart. Hell, I hate this job!", + "What? I hear something. Just mice? Just mice, phew...", + "I'm too tired, man, too tired. This job is... Awful.", + "These people know nothing about this work or about me. I can surprise them.", + "Blue wire is bolts, green is safety. Just... Pulse it here, okay? Right...") + target_speak = list( + "I know what's wrong, just let me fix that.", + "You need my help? What's wrong? Gimme that thing, I can fix that.", + "Si-i-ir... Sir. Sir. It's better to... Stop here! Stop i said, what are you!?", + "Wait! Hey! Can i fix that!? I'm an engineer, you fuck! Sto-op-op-p here, i know what to do!" + ) + + +/mob/living/simple_animal/hostile/hivemind/hiborg/AttackingTarget() + if(!Adjacent(target_mob)) + return + + //special attacks + if(prob(10)) + splash_slash() + return + + if(prob(40)) + stun_with_claw() + return + + return ..() //default attack + + +/mob/living/simple_animal/hostile/hivemind/hiborg/proc/splash_slash() + src.visible_message(SPAN_DANGER("[src] spins around and slashes in a circle!")) + for(var/atom/target in range(1, src)) + if(target != src) + target.attack_generic(src, rand(melee_damage_lower, harm_intent_damage*2)) + if(!client && prob(speak_chance)) + say(pick("Get away from me!", "They are everywhere!")) + + +/mob/living/simple_animal/hostile/hivemind/hiborg/proc/stun_with_claw() + if(isliving(target_mob)) + var/mob/living/victim = target_mob + victim.Weaken(5) + src.visible_message(SPAN_WARNING("[src] holds down [victim] to the floor with his claw.")) + if(!client && prob(speak_chance)) + say(pick("Stand still, I'll make it fast!", + "I will fix you! Don't resist! Don't resist you rat!", + "I just want to replace that broken thing!")) + + +/////////////////////////////////////HIMAN//////////////////////////////////// +//Hive + Man +//Special ability: Shriek, that stuns victims +//Can fool his enemies and pretend to be dead +//A little bit higher chance of malfunction +//Default speaking chance +//Appears from dead human corpses +////////////////////////////////////////////////////////////////////////////// + +/mob/living/simple_animal/hostile/hivemind/himan + name = "human" + desc = "This guy is totally not human. You can see tubes all across his body and metal where flesh should be." + icon_state = "himan" + icon_dead = "himan-dead" + health = 120 + maxHealth = 120 + melee_damage_lower = 20 + harm_intent_damage = 25 + attacktext = "slashes with claws" + malfunction_chance = 10 + mob_size = MOB_MEDIUM + speed = 8 + ability_cooldown = 30 SECONDS + //internals + var/fake_dead = FALSE + var/fake_dead_wait_time = 0 + var/fake_death_cooldown = 0 + + speak = list( + "Stop... It. Just... STOP IT!", + "Why, honey? Why? Why-hy-hy?", + "That noise... My head! Shit!", + "There must be an... An esca-cape!", + "Come on, you ba-ba-bastard, I know what you really want.", + "How much fun!" + ) + target_speak = list( + "Are you... Are you okay? Wa-wait, wait a minu-nu-nute.", + "Come on, you ba-ba-bastard, i know what you really want to.", + "How much fun!", + "Are you try-trying to escape? That is how you plan to do it? Then run... Run...", + "Wait! Can you just... Just pull out this thing from my he-head? Wait...", + "Hey! I'm friendly! Wait, it's just a-UGH" + ) + + +/mob/living/simple_animal/hostile/hivemind/himan/Life() + . = ..() + + //shriek + if(target_mob && world.time > special_ability_cooldown && !fake_dead) + special_ability() + + + //low hp? It's time to play dead + if(health < 60 && !fake_dead && world.time > fake_death_cooldown) + fake_death() + + //shhhh, there an ambush + if(fake_dead) + stop_automated_movement = TRUE + + +/mob/living/simple_animal/hostile/hivemind/himan/speak() + if(!fake_dead) + ..() + + +/mob/living/simple_animal/hostile/hivemind/himan/mulfunction() + if(fake_dead) + return + ..() + +/* +/mob/living/simple_animal/hostile/hivemind/himan/MoveToTarget() + if(!fake_dead) + ..() + else + if(!target_mob || SA_attackable(target_mob)) + stance = HOSTILE_STANCE_IDLE + if(target_mob in ListTargets(10)) + if(get_dist(src, target_mob) > 1) + stance = HOSTILE_STANCE_ATTACKING + + +/mob/living/simple_animal/hostile/hivemind/himan/AttackingTarget() + if(fake_dead) + if(!Adjacent(target_mob)) + return + if(target_mob && (world.time > fake_dead_wait_time)) + awake() + else + ..() + +*///РЕФАКТОРИНГ ВСЕГО ЧТО ВЫШЕ + + +//Shriek stuns our victims and make them deaf for a while +/mob/living/simple_animal/hostile/hivemind/himan/special_ability() + visible_emote("screams!") + playsound(src, 'sound/hallucinations/veryfar_noise.ogg', 90, 1) + for(var/mob/living/victim in view(src)) + if(isdeaf(victim)) + continue + if(istype(victim, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = victim + if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) && istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) + continue + victim.Weaken(5) + victim.ear_deaf = 40 + victim << SPAN_WARNING("You hear loud and terrible scream!") + special_ability_cooldown = world.time + ability_cooldown + + +//Insidiously +/mob/living/simple_animal/hostile/hivemind/himan/proc/fake_death() + src.visible_message("[src] dies!") + fake_dead = TRUE + walk(src, FALSE) + icon_state = icon_dead + fake_dead_wait_time = world.time + 10 SECONDS + + +/mob/living/simple_animal/hostile/hivemind/himan/proc/awake() + var/mob/living/L = target_mob + if(L) + L.attack_generic(src, rand(15, 25)) //stealth attack + L.Weaken(5) + visible_emote("grabs [L]'s legs and force them down to the floor!") + var/msg = pick("SEU-EU-EURPRAI-AI-AIZ-ZT!", "I'M NOT DO-DONE!", "HELL-L-LO-O-OW!", "GOT-T YOU HA-HAH!") + say(msg) + icon_state = "himan-damaged" + fake_dead = FALSE + stance = HOSTILE_STANCE_IDLE + fake_death_cooldown = world.time + 2 MINUTES + + + +/////////////////////////////////////MECHIVER///////////////////////////////// +//Mech + Hive + Driver +//Special ability: Picking up a victim. Sends hallucinations and harm sometimes, then release +//Can picking up corpses too, rebuild them to living hive mobs, like it wires do +//Default malfunction chance +//Default speaking chance, can take pilot and speak with him +//Very rarely can appears from infested machinery +////////////////////////////////////////////////////////////////////////////// + +/mob/living/simple_animal/hostile/hivemind/mechiver + name = "Robotic Horror" + desc = "A weird-looking machinery Frankenstein" + icon = 'icons/mob/hivemind.dmi' + icon_state = "mechiver-closed" + icon_dead = "mechiver-dead" + health = 450 + maxHealth = 450 + melee_damage_lower = 10 + harm_intent_damage = 15 + mob_size = MOB_LARGE + attacktext = "tramples" + ability_cooldown = 1 MINUTE + speak_chance = 5 + speed = 16 + //internals + var/pilot //Yes, there's no pilot, so we just use var + var/mob/living/passenger + var/hatch_closed = TRUE + //default speaking + speak = list( + "Somebody, just tell him to shut up...", + "Bzew-zew-zewt. Th-this way!", + "Wha-a-at? When I'm near this cargo, I feel... fe-fe-fea-fear-er.") + target_speak = list( + "Come here, jo-jo-join me. Join us-s.", + "Time to be-to be-to be whole.", + "Enter me, i'm be-best mech among all of these rusty buckets.", + "I'm dying. I can't see my ha-hands! I'm scared, hu-hu-hug me.", + "I'm not done, it can't be... Hey! Hey you, enter me!") + //speaking with pilot + var/list/common_answers = list( + "Right, chief.", + "Yes.", + "Right.", + "True.", + "Yep.", + "That's right, chief.") + var/list/other_answers = list( + "Pathetic.", + "How curious.", + "We can use it.", + "Useless.", + "Disgusting") + //pilot quotes + var/list/pilot_target_speak = list( + "Hey! Hey you, wanna, hah, ri-i-ide? It's free!", + "Look at this one! Let's-s-s... Take it.", + "Wait a minute, we just want to fu-fu-fun with you!", + "I see you. We see you.", + "Get in! I've got a seat just for you.", + "Don't be afraid, it's almost painless.") + var/list/pilot_commontalk = list( + "They are so unfinished, so fragile-ile.", + "Look at these... Creatures, I've never seen them before.", + "Hah, did you hear that? They're trying to use some sort of we-wep-weapons!", + "Useless things, i'm not satisfied.", + "This place sucks, man. So creep-p-pew-wepy and no fun, only rudimentary creatures would enjoy living here.") + + +/mob/living/simple_animal/hostile/hivemind/mechiver/Life() + . = ..() + update_icon() + + //when we have passenger, we torture him + if(passenger && prob(15)) + passenger.apply_damage(rand(5, 10), pick(BRUTE, BURN, TOX)) + passenger << SPAN_DANGER(pick( + "Something grabs your neck!", "You hear whisper: \" It's okay, now you're sa-sa-safe! \"", + "You've been hit by something metal", "You almost can't feel your leg!", "Something liquid covers you!", + "You feel awful and smell something rotten", "Something sharp cut your cheek!", + "You feel something worm-like trying to wriggle into your skull through your ear...")) + anim_shake(src) + playsound(src, 'sound/effects/clang.ogg', 70, 1) + + + //corpse ressurection + if(!target_mob && !passenger) + for(var/mob/living/Corpse in view(src)) + if(Corpse.stat == DEAD) + if(get_dist(src, Corpse) <= 1) + special_ability(Corpse) + else + walk_to(src, Corpse, 1, 1, 4) + break + + +/mob/living/simple_animal/hostile/hivemind/mechiver/speak() + if(!client && prob(speak_chance) && speak.len) + if(pilot) + if(target_mob) + visible_message("[name]'s pilot says, [pick(pilot_target_speak)]") + say(pick(common_answers)) + else + visible_message("[name]'s pilot says, [pick(pilot_commontalk)]") + say(pick(other_answers)) + else + ..() + + +//animations +//updates every life tick +/mob/living/simple_animal/hostile/hivemind/mechiver/proc/update_icon() + if(target_mob && !passenger && (get_dist(target_mob, src) <= 4) && !is_on_cooldown()) + if(!hatch_closed) + return + overlays.Cut() + if(pilot) + flick("mechiver-opening", src) + icon_state = "mechiver-chief" + overlays += "mechiver-hands" + else + flick("mechiver-opening_wires", src) + icon_state = "mechiver-welcome" + overlays += "mechiver-wires" + hatch_closed = FALSE + else + overlays.Cut() + hatch_closed = TRUE + icon_state = "mechiver-closed" + if(passenger) + overlays += "mechiver-process" + + +/mob/living/simple_animal/hostile/hivemind/mechiver/AttackingTarget() + if(!Adjacent(target_mob)) + return + + if(world.time > special_ability_cooldown && !passenger) + special_ability(target_mob) + + ..() + + +//picking up our victim for good 20 seconds of best road trip ever +/mob/living/simple_animal/hostile/hivemind/mechiver/special_ability(mob/living/target) + if(!target_mob && hatch_closed) //when we picking up corpses + if(pilot) + flick("mechiver-opening", src) + else + flick("mechiver-opening_wires", src) + passenger = target + target.loc = src + target.canmove = FALSE + target << SPAN_DANGER("You've gotten inside that thing! It's hard to see inside, there's something here, it moves around you!") + playsound(src, 'sound/effects/blobattack.ogg', 70, 1) + addtimer(CALLBACK(src, .proc/release_passenger), 40 SECONDS) + + + +/mob/living/simple_animal/hostile/hivemind/mechiver/proc/release_passenger(safely = FALSE) + if(passenger) + if(pilot) + flick("mechiver-opening", src) + else + flick("mechiver-opening_wires", src) + + if(istype(passenger, /mob/living/carbon/human)) + if(!safely) //that was stressful + var/mob/living/carbon/human/H = passenger + if(!pilot && H.stat == DEAD) + destroy_passenger() + pilot = TRUE + return + + H.hallucination = rand(30, 90) + //if mob is dead, we just rebuild it + if(passenger.stat == DEAD && !safely) + dead_body_restoration(passenger) + + if(passenger) //if passenger still here, then just release him + passenger << SPAN_DANGER("[src] released you!") + passenger.canmove = TRUE + passenger.loc = get_turf(src) + passenger = null + special_ability_cooldown = world.time + ability_cooldown + playsound(src, 'sound/effects/blobattack.ogg', 70, 1) + + +/mob/living/simple_animal/hostile/hivemind/mechiver/proc/dead_body_restoration(mob/living/corpse) + var/picked_mob + if(passenger.mob_size <= MOB_SMALL && !client && prob(50)) + picked_mob = pick(/mob/living/simple_animal/hostile/hivemind/stinger, /mob/living/simple_animal/hostile/hivemind/bomber) + else + if(pilot) + if(istype(corpse, /mob/living/carbon/human)) + picked_mob = /mob/living/simple_animal/hostile/hivemind/himan + else if(istype(corpse, /mob/living/silicon/robot)) + picked_mob = /mob/living/simple_animal/hostile/hivemind/hiborg + if(picked_mob) + new picked_mob(get_turf(src)) + else + var/mob/living/simple_animal/hostile/hivemind/resurrected/fixed_mob = new(get_turf(src)) + fixed_mob.take_appearance(corpse) + destroy_passenger() + + +/mob/living/simple_animal/hostile/hivemind/mechiver/proc/destroy_passenger() + qdel(passenger) + passenger = null + + +//we're not forgot to release our victim safely after death +/mob/living/simple_animal/hostile/hivemind/mechiver/Destroy() + release_passenger(TRUE) + ..() + +/mob/living/simple_animal/hostile/hivemind/mechiver/death() + release_passenger(TRUE) + ..() + gibs(loc, null, /obj/gibspawner/robot) + if(pilot) + gibs(loc, null, /obj/gibspawner/human) + qdel(src) + + +/////////////////////////////////////PHASER/////////////////////////////////// +//Special ability: Superposition. Phaser exists at four locations. But, actually he vulnerable only at one. Other is just a copies +//Moves with teleportation only, can stun victim if he land on it +//Also can hide in closets +//Can't speak, no malfunctions +//Appears from dead human body +////////////////////////////////////////////////////////////////////////////// + +/mob/living/simple_animal/hostile/hivemind/phaser + name = "phaser" + desc = "A Crooked human with a strange device on its head. It twitches sometimes and... Why are you still looking? Run!" + icon = 'icons/mob/hivemind.dmi' + icon_state = "phaser-1" + health = 120 + maxHealth = 120 + speak_chance = 0 + malfunction_chance = 0 + mob_size = MOB_MEDIUM + ability_cooldown = 2 MINUTES + //internals + var/can_use_special_ability = TRUE + var/list/my_copies = list() + +/mob/living/simple_animal/hostile/hivemind/phaser/New() + ..() + filters += filter(type="blur", size = 0) + + +/mob/living/simple_animal/hostile/hivemind/phaser/Life() + stop_automated_movement = TRUE + . = ..() + + //special ability using + if(world.time > special_ability_cooldown && can_use_special_ability) + if(target_mob && (health <= 50)) + special_ability() + + //closet hiding + if(!target_mob) + var/obj/structure/closet/C = locate() in get_turf(src) + if(C && loc != C) + if(!C.opened) + C.open(src) + if(C.opened) + C.close(src) + for(var/obj/structure/closet/Closet in view(src)) + if(!Closet.locked && !Closet.welded) + phase_move_to(Closet) + break + + +/mob/living/simple_animal/hostile/hivemind/phaser/AttackTarget() + if(target_mob && get_dist(src, target_mob) > 1) + stance = HOSTILE_STANCE_ATTACK + ..() + + +/mob/living/simple_animal/hostile/hivemind/phaser/MoveToTarget() + if(!target_mob || SA_attackable(target_mob)) + stance = HOSTILE_STANCE_IDLE + if(target_mob in ListTargets(10)) + if(get_dist(src, target_mob) > 1) + stance = HOSTILE_STANCE_ATTACK + phase_move_to(target_mob, nearby = TRUE) + else + stance = HOSTILE_STANCE_ATTACKING + + +/mob/living/simple_animal/hostile/hivemind/phaser/proc/is_can_jump_on(turf/target) + if(!target || target.density || istype(target, /turf/space) || istype(target, /turf/simulated/open)) + return FALSE + + //to prevent reflection's stacking + var/mob/living/simple_animal/hostile/hivemind/phaser/P = locate() in target + if(P) + return FALSE + + for(var/obj/O in target) + if(!O.CanPass(src, target)) + return FALSE + + return TRUE + + +//first part of phase moving is just preparation +/mob/living/simple_animal/hostile/hivemind/phaser/proc/phase_move_to(atom/target, nearby = FALSE) + var/turf/new_place + var/distance_to_target = get_dist(src, target) + var/turf/target_turf = get_turf(target) + //if our target is near, we move precisely to it + if(distance_to_target <= 3) + if(nearby) + for(var/d in alldirs) + var/turf/nearby_turf = get_step(new_place, d) + if(is_can_jump_on(nearby_turf)) + new_place = nearby_turf + else + new_place = target_turf + + if(!new_place) + //there we make some kind of, you know, that creepy zig-zag moving + //we just take angle, distort it a bit and turn into dir + var/angle = Get_Angle(loc, target_turf) + angle += rand(5, 25)*pick(-1, 1) + if(angle < 0) + angle = 360 + angle + if(angle > 360) + angle = 360 - angle + var/tp_direction = angle2dir(angle) + new_place = get_ranged_target_turf(loc, tp_direction, rand(2, 4)) + + if(!is_can_jump_on(new_place)) + return + //an animation + var/init_px = pixel_x + animate(src, pixel_x=init_px + 16*pick(-1, 1), time=5) + animate(pixel_x=init_px, time=6, easing=SINE_EASING) + animate(filters[1], size = 5, time = 5, flags = ANIMATION_PARALLEL) + addtimer(CALLBACK(src, .proc/phase_jump, new_place), 0.5 SECOND) + + +//second part - is jump to target +/mob/living/simple_animal/hostile/hivemind/phaser/proc/phase_jump(turf/place) + playsound(place, 'sound/effects/phasein.ogg', 60, 1) + animate(filters[1], size = 0, time = 5) + icon_state = "phaser-[rand(1,4)]" + src.loc = place + for(var/mob/living/L in loc) + if(L != src) + visible_message("[src] land on [L]!") + playsound(place, 'sound/effects/ghost2.ogg', 70, 1) + L.Weaken(3) + + +/mob/living/simple_animal/hostile/hivemind/phaser/special_ability() + my_copies = list() //let's clean it up + var/possible_directions = alldirs - cardinal + var/turf/spawn_point = get_turf(src) + //we gives to copies our appearence and pick random direction for them + //with animation it's hard to say, who's real. And i hope it looks great + for(var/i = 1 to 3) + var/mob/living/simple_animal/hostile/hivemind/phaser/reflection = new type(spawn_point) + reflection.can_use_special_ability = FALSE + var/mutable_appearance/my_appearance = new(src) + reflection.appearance = my_appearance + my_copies.Add(reflection) + + var/d = pick(possible_directions) + possible_directions -= d + var/turf/new_position = get_step(spawn_point, d) + if(reflection.is_can_jump_on(new_position)) + spawn(1) //ugh, i know, i know, it's bad. Animation + reflection.forceMove(new_position) + addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, reflection), 60 SECONDS) + loc = get_step(spawn_point, possible_directions[1]) //there must left last direction + special_ability_cooldown = world.time + ability_cooldown + playsound(spawn_point, 'sound/effects/cascade.ogg', 100, 1) + + +/mob/living/simple_animal/hostile/hivemind/phaser/closet_interaction() + var/obj/structure/closet/closed_closet = loc + if(closed_closet && istype(closed_closet) && closed_closet.welded) + phase_jump(closed_closet.loc) + + +/mob/living/simple_animal/hostile/hivemind/phaser/death() + if(my_copies.len) + for(var/mob/living/simple_animal/hostile/hivemind/phaser/My_copy in my_copies) + qdel(My_copy) + ..() + gibs(loc, null, /obj/gibspawner/human) + qdel(src) diff --git a/mods/hivemind/code/objects.dm b/mods/hivemind/code/objects.dm new file mode 100644 index 0000000000000..c23d3492323e6 --- /dev/null +++ b/mods/hivemind/code/objects.dm @@ -0,0 +1,23 @@ +//Hivemind special objects stored here, like projectiles, wreckages or artifacts + + +//toxic shot, turret's ability use it +/obj/item/projectile/goo + name = "toxic goo" + icon = 'icons/obj/hivemind.dmi' + icon_state = "goo_proj" + damage = 15 + damage_type = BURN + check_armour = "energy" + step_delay = 2 + + +/obj/item/projectile/goo/on_hit(atom/target, var/blocked = 0) + . = ..() + if(istype(target, /mob/living) && !istype(target, /mob/living/silicon) && !blocked) + var/mob/living/L = target + L.apply_damage(10, TOX) + if(!(locate(/obj/effect/decal/cleanable/spiderling_remains) in target.loc)) + var/obj/effect/decal/cleanable/spiderling_remains/goo = new /obj/effect/decal/cleanable/spiderling_remains(target.loc) + goo.name = "green goo" + goo.desc = "An unidentifiable liquid. It smells awful." \ No newline at end of file diff --git a/mods/hivemind/code/overrides.dm b/mods/hivemind/code/overrides.dm new file mode 100644 index 0000000000000..dca317e6083a4 --- /dev/null +++ b/mods/hivemind/code/overrides.dm @@ -0,0 +1,67 @@ +// Hivemind wireweeds +/datum/seed/wires + name = "wires" + seed_name = "strange wires" + display_name = "strange wires" + seed_noun = "wires" + force_layer = 3 + chems = list("fuel" = list(1,5)) + +/datum/seed/wires/New() + ..() + set_trait(TRAIT_IMMUTABLE,1) + set_trait(TRAIT_PLANT_COLOUR,null) + set_trait(TRAIT_YIELD,-1) + set_trait(TRAIT_SPREAD,3) + set_trait(TRAIT_POTENCY,50) + + + +/obj/effect/plant/proc/life() + var/turf/simulated/T = get_turf(src) + if(istype(T)) + health -= seed.handle_environment(T,T.return_air(),null,1) + if(health < max_health) + //Plants can grow through closed airlocks, but more slowly, since they have to force metal to make space + var/obj/machinery/door/D = (locate(/obj/machinery/door) in loc) + if (D) + health += rand_between(0,0.5) + else + health += rand_between(1,2.5) + refresh_icon() + if(health > max_health) + health = max_health + else if(health == max_health && !plant && (seed.type != /datum/seed/mushroom/maintshroom)) + plant = new(T,seed) + plant.dir = src.dir + plant.transform = src.transform + plant.age = seed.get_trait(TRAIT_MATURATION)-1 + plant.update_icon() + if(growth_type==0) //Vines do not become invisible. + invisibility = INVISIBILITY_MAXIMUM + else + plant.layer = layer + 0.1 + + +/obj/effect/plant/proc/spread() + //spread to 1-3 adjacent turfs depending on yield trait. + var/max_spread = between(1, round(seed.get_trait(TRAIT_YIELD)*3/14), 3) + + for(var/i in 1 to max_spread) + if(prob(spread_chance)) + sleep(rand(3,5)) + if(!neighbors.len) + break + var/turf/target_turf = pick(neighbors) + target_turf = get_connecting_turf(target_turf, loc) + var/obj/effect/plant/child = new type(get_turf(src),seed,src) + after_spread(child, target_turf) + // Update neighboring squares. + for(var/obj/effect/plant/neighbor in range(1,target_turf)) + neighbor.neighbors -= target_turf + + +//after creation act +//by default, there goes an animation code +/obj/effect/plant/proc/after_spread(obj/effect/plant/child, turf/target_turf) + spawn(1) // This should do a little bit of animation. diff --git a/mods/hivemind/code/wires.dm b/mods/hivemind/code/wires.dm new file mode 100644 index 0000000000000..7193b2fae899f --- /dev/null +++ b/mods/hivemind/code/wires.dm @@ -0,0 +1,298 @@ +//Wireweeds are created by the AI's nanites to spread its connectivity through the ship. +//When they reach any machine, they annihilate them and re-purpose them to the AI's needs. They are the 'hands' of our rogue AI. + +/obj/effect/plant/hivemind + layer = 2 + health = 80 + max_health = 80 //we are a little bit durable + var/list/killer_reagents = list("pacid", "sacid", "hclacid", "thermite") + //internals + var/obj/machinery/hivemind_machine/node/master_node + var/list/wires_connections = list("0", "0", "0", "0") + + +/obj/effect/plant/hivemind/New() + ..() + icon = 'icons/obj/hivemind.dmi' + spawn(2) + update_neighbors() + + +/obj/effect/plant/hivemind/Destroy() + if(master_node) + master_node.my_wireweeds.Remove(src) + return ..() + + +/obj/effect/plant/hivemind/after_spread(obj/effect/plant/child, turf/target_turf) + if(master_node) + master_node.add_wireweed(child) + spawn(1) + child.dir = get_dir(loc, target_turf) //actually this means nothing for wires, but need for animation + flick("spread_anim", child) + child.forceMove(target_turf) + update_icon() + + +/obj/effect/plant/hivemind/proc/try_to_assimilate() + if(hive_mind_ai && master_node) + for(var/obj/machinery/machine_on_my_tile in loc) + var/can_assimilate = TRUE + + //whitelist check + if(is_type_in_list(machine_on_my_tile, hive_mind_ai.restricted_machineries)) + can_assimilate = FALSE + + //assimilation is slow process, so it's take some time + //there we use our failure chance. Then it lower, then faster hivemind learn how to properly assimilate it + if(can_assimilate && prob(hive_mind_ai.failure_chance)) + can_assimilate = FALSE + anim_shake(machine_on_my_tile) + return + + //only one machine per turf + if(can_assimilate && !locate(/obj/machinery/hivemind_machine) in loc) + assimilate(machine_on_my_tile) + //other will be... merged + else if(can_assimilate) + qdel(machine_on_my_tile) + + //modular computers handling + var/obj/item/modular_computer/console/mod_comp = locate() in loc + if(mod_comp) + assimilate(mod_comp) + + //dead bodies handling + for(var/mob/living/dead_body in loc) + if(dead_body.stat == DEAD) + assimilate(dead_body) + + +/obj/effect/plant/hivemind/update_neighbors() + ..() + update_connections() + update_icon() + update_openspace() + + +/obj/effect/plant/hivemind/spread() + if(hive_mind_ai && master_node) + ..() + + +/obj/effect/plant/hivemind/life() + if(hive_mind_ai && master_node) + try_to_assimilate() + chem_handler() + else + //slow vanishing after node death + health -= 10 + alpha = 255 * health/max_health + check_health() + + +/obj/effect/plant/hivemind/is_mature() + return TRUE + + +/obj/effect/plant/hivemind/refresh_icon() + overlays.Cut() + var/image/I + for(var/i = 1 to 4) + I = image(src.icon, "wires[wires_connections[i]]", dir = 1<<(i-1)) + overlays += I + for(var/d in cardinal) + var/turf/T = get_step(loc, d) + if((locate(/obj/structure/window) in T) || istype(T, /turf/simulated/wall)) + var/image/wall_hug_overlay = image(icon = src.icon, icon_state = "wall_hug", dir = d) + if (T.x < x) + wall_hug_overlay.pixel_x -= 32 + else if (T.x > x) + wall_hug_overlay.pixel_x += 32 + if (T.y < y) + wall_hug_overlay.pixel_y -= 32 + else if (T.y > y) + wall_hug_overlay.pixel_y += 32 + wall_hug_overlay.layer = ABOVE_WINDOW_LAYER + overlays += wall_hug_overlay + + +/obj/effect/plant/hivemind/proc/update_connections(propagate = 0) + var/list/dirs = list() + for(var/obj/effect/plant/hivemind/W in range(1, src) - src) + if(propagate) + W.update_connections() + W.update_icon() + dirs += get_dir(src, W) + + wires_connections = dirs_to_corner_states(dirs) + + +/obj/effect/plant/hivemind/door_interaction(obj/machinery/door/airlock/door) + if(!door || !istype(door)) + return FALSE + + //if our door isn't broken, we will try to break open. We can do only one action per call + if(!(door.stat & BROKEN)) + anim_shake(door) + //first, we open our panel to give our wireweeds access to exposed airlock's electronics + if(!door.p_open) + if(prob(20)) + door.p_open = TRUE + return FALSE + //but if airlock is welded, we just shake it like we rummage inside + if(door.welded) + return FALSE + //if panel opened, we begin to destruct it from inside of airlock + if(door.p_open) + //bolts are down? Our wireweeds infest electronics, so this isn't a problem cause it part of us + if(door.locked) + if(prob(50)) + door.unlock() + return FALSE + //and then, if airlock is closed, we begin destroy it electronics + if(door.density) + door.take_damage(rand(15, 50)) + return FALSE + + return TRUE + + +/obj/effect/plant/hivemind/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(mover == src) + if(target.density) + return FALSE + + if(locate(/obj/structure) in target) + for(var/obj/structure/S in target) + if(S.density) + return FALSE + + if(locate(/obj/machinery/door) in target) + return FALSE + + return TRUE + else + return ..() + + + +//What a pity that we haven't some kind proc as special library to use it somewhere +/obj/effect/plant/hivemind/proc/anim_shake(atom/thing) + var/init_px = thing.pixel_x + var/shake_dir = pick(-1, 1) + animate(thing, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1) + animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING) + + +//assimilation process +/obj/effect/plant/hivemind/proc/assimilate(var/atom/subject) + if(istype(subject, /obj/machinery) || istype(subject, /obj/item/modular_computer/console)) + if(prob(hive_mind_ai.failure_chance)) + //critical failure! This machine would be a dummy, which means - without any ability + //let's make an infested sprite + var/obj/machinery/hivemind_machine/new_machine = new (loc) + var/icon/infected_icon = new('icons/obj/hivemind_machines.dmi', icon_state = "wires-[rand(1, 3)]") + var/icon/new_icon = new(subject.icon, icon_state = subject.icon_state, dir = subject.dir) + new_icon.Blend(infected_icon, ICON_OVERLAY) + new_machine.icon = new_icon + var/prefix = pick("strange", "interesting", "marvelous", "unusual") + new_machine.name = "[prefix] [subject.name]" + else + //of course, here we have a very little chance to spawn him, our mini-boss + if(prob(1)) + new /mob/living/simple_animal/hostile/hivemind/mechiver(loc) + qdel(subject) + return + else + var/picked_machine + var/list/possible_machines = subtypesof(/obj/machinery/hivemind_machine) + + if(hive_mind_ai.hives.len < 10) + if(hive_mind_ai.evo_points < (hive_mind_ai.hives.len * 100)) //one hive per 100 EP + possible_machines -= /obj/machinery/hivemind_machine/node + else + //we make new nodes asap, cause it has higher priority to survive, so we force it here + picked_machine = /obj/machinery/hivemind_machine/node + + //here we compare hivemind's EP with machine's required value + for(var/machine_path in possible_machines) + if(hive_mind_ai.evo_points <= hive_mind_ai.EP_price_list[machine_path]) + possible_machines.Remove(machine_path) + + if(!picked_machine) + picked_machine = pick(possible_machines) + var/obj/machinery/hivemind_machine/new_machine = new picked_machine(loc) + new_machine.update_icon() + + if(istype(subject, /mob/living) && !istype(subject, /mob/living/simple_animal/hostile/hivemind)) + //human bodies + if(istype(subject, /mob/living/carbon/human)) + var/mob/living/L = subject + for(var/obj/item/W in L) + L.drop_from_inventory(W) + var/M = pick(/mob/living/simple_animal/hostile/hivemind/himan, /mob/living/simple_animal/hostile/hivemind/phaser) + new M(loc) + //robot corpses + else if(istype(subject, /mob/living/silicon)) + new /mob/living/simple_animal/hostile/hivemind/hiborg(loc) + //other dead bodies + else + var/mob/living/simple_animal/hostile/hivemind/resurrected/transformed_mob = new(loc) + transformed_mob.take_appearance(subject) + + qdel(subject) + + +////////////////////////////////////////////////////////////////// +/////////////////////////>RESPONSE CODE= 10) + health -= rand(W.force/2, W.force) //hm, maybe make damage based on player's robust stat? + user.visible_message(SPAN_DANGER("[user] slices [src]."), SPAN_DANGER("You slice [src].")) + else + user.visible_message(SPAN_DANGER("[user] tries to slice [src] with [W], but seems to do nothing."), + SPAN_DANGER("You try to slice [src], but it's useless!")) + check_health() + + +//fire is effective, but there need some time to melt the covering +/obj/effect/plant/hivemind/fire_act() + health -= rand(1, 4) + check_health() + + +//emp is effective too +//it causes electricity failure, so our wireweeds just blowing up inside, what makes them fragile +/obj/effect/plant/hivemind/emp_act(severity) + if(severity) + die_off() + + +//Some acid and there's no problem +/obj/effect/plant/hivemind/proc/chem_handler() + for(var/obj/effect/effect/smoke/chem/smoke in loc) + for(var/lethal in killer_reagents) + if(smoke.reagents.has_reagent(lethal)) + die_off() + return \ No newline at end of file diff --git a/mods/hivemind/icons/hivemind.dmi b/mods/hivemind/icons/hivemind.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0011cab69a1b27bd4318967e0a73fbdf1a421223 GIT binary patch literal 72187 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 P!2krFu6{1-oD!M<@`DEp literal 0 HcmV?d00001 diff --git a/mods/hivemind/icons/hivemind_machines.dmi b/mods/hivemind/icons/hivemind_machines.dmi new file mode 100644 index 0000000000000000000000000000000000000000..02c4b3cf242c75935435e1af455672e37f3846a6 GIT binary patch literal 21423 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 AssI20 literal 0 HcmV?d00001 diff --git a/mods/hivemind/sounds/insect_battle_bite.ogg b/mods/hivemind/sounds/insect_battle_bite.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f5c751218c2fd81391126cecbacfc578e4712980 GIT binary patch literal 10344 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 Aa{vGU literal 0 HcmV?d00001 From 22b32e6a542eceb1c1518b82861d23ad17aca76b Mon Sep 17 00:00:00 2001 From: LordNest Date: Sun, 23 Feb 2025 13:21:49 +0400 Subject: [PATCH 4/5] little fixes (not at all) --- code/modules/events/event_container.dm | 3 ++ mods/hivemind/code/core.dm | 6 ++-- mods/hivemind/code/hivemind_invasion.dm | 16 ++------- mods/hivemind/code/machines.dm | 16 ++++----- mods/hivemind/code/mobs.dm | 15 +++++--- mods/hivemind/code/objects.dm | 12 +++---- mods/hivemind/code/overrides.dm | 36 +++++++++---------- mods/hivemind/code/wires.dm | 46 ++++++++++++------------- 8 files changed, 75 insertions(+), 75 deletions(-) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index c14ae9884d250..b13a40496436f 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -184,6 +184,9 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT available_events = list( new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 1320), new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 40), 1), + // [SIERRA-ADD], + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/hivemind, 0, list(ASSIGNMENT_ENGINEER = 20,ASSIGNMENT_MEDICAL = 20,ASSIGNMENT_SECURITY = 20), 1), + // [/SIERRA-ADD], new /datum/event_meta/no_overmap(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/mob_spawning/carp, 0, list(ASSIGNMENT_SECURITY = 5), 1), new /datum/event_meta/no_overmap(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 10), 1), new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 0, list(ASSIGNMENT_ENGINEER = 15), 1), diff --git a/mods/hivemind/code/core.dm b/mods/hivemind/code/core.dm index cebc187352f7b..0207b0753eda9 100644 --- a/mods/hivemind/code/core.dm +++ b/mods/hivemind/code/core.dm @@ -17,12 +17,12 @@ var/datum/hivemind/hive_mind_ai /obj/machinery/camera, /obj/machinery/light_switch, /obj/machinery/disposal, /obj/machinery/firealarm, /obj/machinery/alarm, /obj/machinery/recharger, - /obj/machinery/hologram, /obj/machinery/holoposter, + /obj/machinery/hologram, /obj/machinery/hivemind_machine, /obj/machinery/button, /obj/machinery/ai_status_display, /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/newscaster, /obj/machinery/floor_light, - /obj/machinery/nuclearbomb, /obj/machinery/flasher, - /obj/machinery/filler_object, /obj/machinery/hivemind_machine) + /obj/machinery/nuclearbomb, /obj/machinery/flasher) + //internals var/list/global_abilities_cooldown = list() var/list/EP_price_list = list() diff --git a/mods/hivemind/code/hivemind_invasion.dm b/mods/hivemind/code/hivemind_invasion.dm index 0f82ee4312b6c..10d2e59222040 100644 --- a/mods/hivemind/code/hivemind_invasion.dm +++ b/mods/hivemind/code/hivemind_invasion.dm @@ -3,16 +3,6 @@ //Requires hard teamwork at late stages, but easily can be handled at the beginning //All code stored in modules/hivemind - - -/datum/storyevent/hivemind - id = "hivemind" - name = "Hivemind Invasion" - - - event_type = /datum/event/hivemind - event_pools = list(EVENT_LEVEL_MAJOR = POOL_THRESHOLD_MAJOR*0.80) - tags = list(TAG_COMMUNAL, TAG_DESTRUCTIVE, TAG_NEGATIVE, TAG_SCARY) //============================================ /datum/event/hivemind @@ -26,8 +16,8 @@ /datum/event/hivemind/start() var/turf/start_location for(var/i=1 to 100) - var/area/A = random_ship_area(filter_players = TRUE, filter_maintenance = TRUE, filter_critical = TRUE) - start_location = A.random_space() + var/turf/T = pick_subarea_turf(/area/maintenance, list(GLOBAL_PROC_REF(is_station_turf), GLOBAL_PROC_REF(not_turf_contains_dense_objects))) + start_location = T.random_space() if(!start_location && i == 100) log_and_message_admins("Hivemind failed to find a viable turf.") kill() @@ -35,5 +25,5 @@ if(start_location) break - message_admins("Hivemind spawned at \the [jumplink(start_location)]") + log_and_message_admins("Hivemind spawned in \the [get_area(T)]", location = T) new /obj/machinery/hivemind_machine/node(start_location) diff --git a/mods/hivemind/code/machines.dm b/mods/hivemind/code/machines.dm index 863b0a79155bc..40cd901b6ecd7 100644 --- a/mods/hivemind/code/machines.dm +++ b/mods/hivemind/code/machines.dm @@ -213,13 +213,13 @@ update_icon() - var/obj/effect/plant/hivemind/founded_wire = locate() in loc + var/obj/vine/hivemind/founded_wire = locate() in loc if(!founded_wire) - var/obj/effect/plant/hivemind/wire = new(loc, new /datum/seed/wires) + var/obj/vine/hivemind/wire = new(loc, new /datum/seed/wires) add_wireweed(wire) wire.Process() else - for(var/obj/effect/plant/hivemind/W in range(6, src)) + for(var/obj/vine/hivemind/W in range(6, src)) if(W.master_node) if(!(locate(type) in W.loc) && (get_dist(W, W.master_node) > 6) ) add_wireweed(W) @@ -228,7 +228,7 @@ /obj/machinery/hivemind_machine/node/Destroy() hive_mind_ai.hives.Remove(src) check_for_other() - for(var/obj/effect/plant/hivemind/wire in my_wireweeds) + for(var/obj/vine/hivemind/wire in my_wireweeds) remove_wireweed(wire) return ..() @@ -248,8 +248,8 @@ icon_state = initial(icon_state) use_ability() //if we haven't any wireweeds at our location, let's make new one - if(!(locate(/obj/effect/plant/hivemind) in loc)) - var/obj/effect/plant/hivemind/wireweed = new(loc, new /datum/seed/wires) + if(!(locate(/obj/vine/hivemind) in loc)) + var/obj/vine/hivemind/wireweed = new(loc, new /datum/seed/wires) add_wireweed(wireweed) @@ -273,13 +273,13 @@ //there we binding or un-binding hive with wire //in this way, when our node will be destroyed, wireweeds will die too -/obj/machinery/hivemind_machine/node/proc/add_wireweed(obj/effect/plant/hivemind/wireweed) +/obj/machinery/hivemind_machine/node/proc/add_wireweed(obj/vine/hivemind/wireweed) if(wireweed.master_node) wireweed.master_node.remove_wireweed(wireweed) wireweed.master_node = src my_wireweeds.Add(wireweed) -/obj/machinery/hivemind_machine/node/proc/remove_wireweed(obj/effect/plant/hivemind/wireweed) +/obj/machinery/hivemind_machine/node/proc/remove_wireweed(obj/vine/hivemind/wireweed) my_wireweeds.Remove(wireweed) wireweed.master_node = null diff --git a/mods/hivemind/code/mobs.dm b/mods/hivemind/code/mobs.dm index e836d47b5a1d5..b57f361d1b88f 100644 --- a/mods/hivemind/code/mobs.dm +++ b/mods/hivemind/code/mobs.dm @@ -175,7 +175,7 @@ //now we work with icons, take victim's one and multiply it with special icon var/icon/infested = new /icon(icon, icon_state) - var/icon/covering_mask = new /icon('icons/mob/hivemind.dmi', "covering[rand(1, 3)]") + var/icon/covering_mask = new /icon('mods/hivemind/icons/hivemind.dmi', "covering[rand(1, 3)]") infested.Blend(covering_mask, ICON_MULTIPLY) overlays += infested @@ -330,7 +330,9 @@ speed = 12 malfunction_chance = 15 mob_size = MOB_MEDIUM + say_list_type = /datum/say_list/hiborg +/datum/say_list/hiborg speak = list("Everytime something breaks apart. Hell, I hate this job!", "What? I hear something. Just mice? Just mice, phew...", "I'm too tired, man, too tired. This job is... Awful.", @@ -407,7 +409,9 @@ var/fake_dead = FALSE var/fake_dead_wait_time = 0 var/fake_death_cooldown = 0 + say_list_type = /datum/say_list/hiborg +/datum/say_list/himan speak = list( "Stop... It. Just... STOP IT!", "Why, honey? Why? Why-hy-hy?", @@ -530,7 +534,7 @@ /mob/living/simple_animal/hostile/hivemind/mechiver name = "Robotic Horror" desc = "A weird-looking machinery Frankenstein" - icon = 'icons/mob/hivemind.dmi' + icon = 'mods/hivemind/icons/hivemind.dmi' icon_state = "mechiver-closed" icon_dead = "mechiver-dead" health = 450 @@ -546,6 +550,9 @@ var/pilot //Yes, there's no pilot, so we just use var var/mob/living/passenger var/hatch_closed = TRUE + say_list_type = /datum/say_list/mechiver + +/datum/say_list/mechiver //default speaking speak = list( "Somebody, just tell him to shut up...", @@ -593,7 +600,7 @@ //when we have passenger, we torture him if(passenger && prob(15)) - passenger.apply_damage(rand(5, 10), pick(BRUTE, BURN, TOX)) + passenger.apply_damage(rand(5, 10), pick(DAMAGE_BRUTE, DAMAGE_BURN, DAMAGE_TOXIN)) passenger << SPAN_DANGER(pick( "Something grabs your neck!", "You hear whisper: \" It's okay, now you're sa-sa-safe! \"", "You've been hit by something metal", "You almost can't feel your leg!", "Something liquid covers you!", @@ -754,7 +761,7 @@ /mob/living/simple_animal/hostile/hivemind/phaser name = "phaser" desc = "A Crooked human with a strange device on its head. It twitches sometimes and... Why are you still looking? Run!" - icon = 'icons/mob/hivemind.dmi' + icon = 'mods/hivemind/icons/hivemind.dmi' icon_state = "phaser-1" health = 120 maxHealth = 120 diff --git a/mods/hivemind/code/objects.dm b/mods/hivemind/code/objects.dm index c23d3492323e6..7d9645f331c2c 100644 --- a/mods/hivemind/code/objects.dm +++ b/mods/hivemind/code/objects.dm @@ -4,10 +4,10 @@ //toxic shot, turret's ability use it /obj/item/projectile/goo name = "toxic goo" - icon = 'icons/obj/hivemind.dmi' + icon = 'mods/hivemind/icons/hivemind_machines.dmi' icon_state = "goo_proj" damage = 15 - damage_type = BURN + damage_type = DAMAGE_BURN check_armour = "energy" step_delay = 2 @@ -16,8 +16,8 @@ . = ..() if(istype(target, /mob/living) && !istype(target, /mob/living/silicon) && !blocked) var/mob/living/L = target - L.apply_damage(10, TOX) - if(!(locate(/obj/effect/decal/cleanable/spiderling_remains) in target.loc)) - var/obj/effect/decal/cleanable/spiderling_remains/goo = new /obj/effect/decal/cleanable/spiderling_remains(target.loc) + L.apply_damage(10, DAMAGE_TOXIN) + if(!(locate(/obj/decal/cleanable/spiderling_remains) in target.loc)) + var/obj/decal/cleanable/spiderling_remains/goo = new /obj/decal/cleanable/spiderling_remains(target.loc) goo.name = "green goo" - goo.desc = "An unidentifiable liquid. It smells awful." \ No newline at end of file + goo.desc = "An unidentifiable liquid. It smells awful." diff --git a/mods/hivemind/code/overrides.dm b/mods/hivemind/code/overrides.dm index dca317e6083a4..327151f9d3192 100644 --- a/mods/hivemind/code/overrides.dm +++ b/mods/hivemind/code/overrides.dm @@ -17,33 +17,33 @@ -/obj/effect/plant/proc/life() +/obj/vine/proc/life() var/turf/simulated/T = get_turf(src) if(istype(T)) - health -= seed.handle_environment(T,T.return_air(),null,1) - if(health < max_health) + health_current -= seed.handle_environment(T,T.return_air(),null,1) + if(health_current < health_max) //Plants can grow through closed airlocks, but more slowly, since they have to force metal to make space var/obj/machinery/door/D = (locate(/obj/machinery/door) in loc) if (D) - health += rand_between(0,0.5) + health_current += rand_between(0,0.5) else - health += rand_between(1,2.5) + health_current += rand_between(1,2.5) refresh_icon() - if(health > max_health) - health = max_health - else if(health == max_health && !plant && (seed.type != /datum/seed/mushroom/maintshroom)) - plant = new(T,seed) - plant.dir = src.dir - plant.transform = src.transform - plant.age = seed.get_trait(TRAIT_MATURATION)-1 - plant.update_icon() + if(health_current > health_max) + health_current = health_max + else if(health_current == health_max && !vine && (seed.type != /datum/seed/mushroom/maintshroom)) + vine = new(T,seed) + vine.dir = src.dir + vine.transform = src.transform + vine.age = seed.get_trait(TRAIT_MATURATION)-1 + vine.update_icon() if(growth_type==0) //Vines do not become invisible. invisibility = INVISIBILITY_MAXIMUM else - plant.layer = layer + 0.1 + vine.layer = layer + 0.1 -/obj/effect/plant/proc/spread() +/obj/vine/proc/spread() //spread to 1-3 adjacent turfs depending on yield trait. var/max_spread = between(1, round(seed.get_trait(TRAIT_YIELD)*3/14), 3) @@ -54,14 +54,14 @@ break var/turf/target_turf = pick(neighbors) target_turf = get_connecting_turf(target_turf, loc) - var/obj/effect/plant/child = new type(get_turf(src),seed,src) + var/obj/vine/child = new type(get_turf(src),seed,src) after_spread(child, target_turf) // Update neighboring squares. - for(var/obj/effect/plant/neighbor in range(1,target_turf)) + for(var/obj/vine/neighbor in range(1,target_turf)) neighbor.neighbors -= target_turf //after creation act //by default, there goes an animation code -/obj/effect/plant/proc/after_spread(obj/effect/plant/child, turf/target_turf) +/obj/vine/proc/after_spread(obj/effect/vine/child, turf/target_turf) spawn(1) // This should do a little bit of animation. diff --git a/mods/hivemind/code/wires.dm b/mods/hivemind/code/wires.dm index 7193b2fae899f..e61f12c28135c 100644 --- a/mods/hivemind/code/wires.dm +++ b/mods/hivemind/code/wires.dm @@ -1,7 +1,7 @@ //Wireweeds are created by the AI's nanites to spread its connectivity through the ship. //When they reach any machine, they annihilate them and re-purpose them to the AI's needs. They are the 'hands' of our rogue AI. -/obj/effect/plant/hivemind +/obj/vine/hivemind layer = 2 health = 80 max_health = 80 //we are a little bit durable @@ -11,20 +11,20 @@ var/list/wires_connections = list("0", "0", "0", "0") -/obj/effect/plant/hivemind/New() +/obj/vine/hivemind/New() ..() icon = 'icons/obj/hivemind.dmi' spawn(2) update_neighbors() -/obj/effect/plant/hivemind/Destroy() +/obj/vine/hivemind/Destroy() if(master_node) master_node.my_wireweeds.Remove(src) return ..() -/obj/effect/plant/hivemind/after_spread(obj/effect/plant/child, turf/target_turf) +/obj/vine/hivemind/after_spread(obj/vine/child, turf/target_turf) if(master_node) master_node.add_wireweed(child) spawn(1) @@ -34,7 +34,7 @@ update_icon() -/obj/effect/plant/hivemind/proc/try_to_assimilate() +/obj/vine/hivemind/proc/try_to_assimilate() if(hive_mind_ai && master_node) for(var/obj/machinery/machine_on_my_tile in loc) var/can_assimilate = TRUE @@ -68,19 +68,19 @@ assimilate(dead_body) -/obj/effect/plant/hivemind/update_neighbors() +/obj/vine/hivemind/update_neighbors() ..() update_connections() update_icon() update_openspace() -/obj/effect/plant/hivemind/spread() +/obj/vine/hivemind/spread() if(hive_mind_ai && master_node) ..() -/obj/effect/plant/hivemind/life() +/obj/vine/hivemind/life() if(hive_mind_ai && master_node) try_to_assimilate() chem_handler() @@ -91,11 +91,11 @@ check_health() -/obj/effect/plant/hivemind/is_mature() +/obj/vine/hivemind/is_mature() return TRUE -/obj/effect/plant/hivemind/refresh_icon() +/obj/vine/hivemind/refresh_icon() overlays.Cut() var/image/I for(var/i = 1 to 4) @@ -117,9 +117,9 @@ overlays += wall_hug_overlay -/obj/effect/plant/hivemind/proc/update_connections(propagate = 0) +/obj/vine/hivemind/proc/update_connections(propagate = 0) var/list/dirs = list() - for(var/obj/effect/plant/hivemind/W in range(1, src) - src) + for(var/obj/vine/hivemind/W in range(1, src) - src) if(propagate) W.update_connections() W.update_icon() @@ -128,7 +128,7 @@ wires_connections = dirs_to_corner_states(dirs) -/obj/effect/plant/hivemind/door_interaction(obj/machinery/door/airlock/door) +/obj/vine/hivemind/door_interaction(obj/machinery/door/airlock/door) if(!door || !istype(door)) return FALSE @@ -158,7 +158,7 @@ return TRUE -/obj/effect/plant/hivemind/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) +/obj/vine/hivemind/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(mover == src) if(target.density) return FALSE @@ -178,7 +178,7 @@ //What a pity that we haven't some kind proc as special library to use it somewhere -/obj/effect/plant/hivemind/proc/anim_shake(atom/thing) +/obj/vine/hivemind/proc/anim_shake(atom/thing) var/init_px = thing.pixel_x var/shake_dir = pick(-1, 1) animate(thing, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1) @@ -186,13 +186,13 @@ //assimilation process -/obj/effect/plant/hivemind/proc/assimilate(var/atom/subject) - if(istype(subject, /obj/machinery) || istype(subject, /obj/item/modular_computer/console)) +/obj/vine/hivemind/proc/assimilate(var/atom/subject) + if(istype(subject, /obj/machinery) || istype(subject, /obj/item/modular_computer)) if(prob(hive_mind_ai.failure_chance)) //critical failure! This machine would be a dummy, which means - without any ability //let's make an infested sprite var/obj/machinery/hivemind_machine/new_machine = new (loc) - var/icon/infected_icon = new('icons/obj/hivemind_machines.dmi', icon_state = "wires-[rand(1, 3)]") + var/icon/infected_icon = new('mods/hivemind/icons/hivemind_machines.dmi', icon_state = "wires-[rand(1, 3)]") var/icon/new_icon = new(subject.icon, icon_state = subject.icon_state, dir = subject.dir) new_icon.Blend(infected_icon, ICON_OVERLAY) new_machine.icon = new_icon @@ -251,7 +251,7 @@ //in fact, this is some kind of reinforced wires, so we can't take samples from it and inject something too //but we still can slice it with something sharp -/obj/effect/plant/hivemind/attackby(obj/item/weapon/W, mob/user) +/obj/vine/hivemind/attackby(obj/item/weapon/W, mob/user) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) var/weapon_type @@ -277,22 +277,22 @@ //fire is effective, but there need some time to melt the covering -/obj/effect/plant/hivemind/fire_act() +/obj/vine/hivemind/fire_act() health -= rand(1, 4) check_health() //emp is effective too //it causes electricity failure, so our wireweeds just blowing up inside, what makes them fragile -/obj/effect/plant/hivemind/emp_act(severity) +/obj/vine/hivemind/emp_act(severity) if(severity) die_off() //Some acid and there's no problem -/obj/effect/plant/hivemind/proc/chem_handler() +/obj/vine/hivemind/proc/chem_handler() for(var/obj/effect/effect/smoke/chem/smoke in loc) for(var/lethal in killer_reagents) if(smoke.reagents.has_reagent(lethal)) die_off() - return \ No newline at end of file + return From 00cc2651a71b02926a9ab34310d13d2f8ca70451 Mon Sep 17 00:00:00 2001 From: LordNest Date: Mon, 24 Feb 2025 01:34:33 +0400 Subject: [PATCH 5/5] Second wave --- mods/hivemind/code/hivemind_invasion.dm | 4 +- mods/hivemind/code/machines.dm | 4 +- mods/hivemind/code/mobs.dm | 114 ++++++++++++------------ mods/hivemind/code/objects.dm | 1 - mods/hivemind/code/overrides.dm | 2 +- mods/hivemind/code/wires.dm | 52 +++++++---- mods/hivemind/icons/hivemind_obj.dmi | Bin 0 -> 21931 bytes 7 files changed, 98 insertions(+), 79 deletions(-) create mode 100644 mods/hivemind/icons/hivemind_obj.dmi diff --git a/mods/hivemind/code/hivemind_invasion.dm b/mods/hivemind/code/hivemind_invasion.dm index 10d2e59222040..cffd7c37f3fee 100644 --- a/mods/hivemind/code/hivemind_invasion.dm +++ b/mods/hivemind/code/hivemind_invasion.dm @@ -17,7 +17,7 @@ var/turf/start_location for(var/i=1 to 100) var/turf/T = pick_subarea_turf(/area/maintenance, list(GLOBAL_PROC_REF(is_station_turf), GLOBAL_PROC_REF(not_turf_contains_dense_objects))) - start_location = T.random_space() + start_location = T if(!start_location && i == 100) log_and_message_admins("Hivemind failed to find a viable turf.") kill() @@ -25,5 +25,5 @@ if(start_location) break - log_and_message_admins("Hivemind spawned in \the [get_area(T)]", location = T) + log_and_message_admins("Hivemind spawned in \the [get_area(start_location)]", location = start_location) new /obj/machinery/hivemind_machine/node(start_location) diff --git a/mods/hivemind/code/machines.dm b/mods/hivemind/code/machines.dm index 40cd901b6ecd7..4a1b9da136561 100644 --- a/mods/hivemind/code/machines.dm +++ b/mods/hivemind/code/machines.dm @@ -411,8 +411,8 @@ if("noise") word = pick("z-z-bz-z", "hz-z-z", "zu-zu-we-e", "e-e-ew-e", "bz-ze-ew") if("jam") //word jamming, small Max Headroom's cameo - if(lentext(word) > 3) - var/entry = rand(2, lentext(word)-2) + if(length(word) > 3) + var/entry = rand(2, length(word)-2) var/jammed = "" for(var/jam_i = 1 to rand(2, 5)) jammed += copytext(word, entry, entry+2) + "-" diff --git a/mods/hivemind/code/mobs.dm b/mods/hivemind/code/mobs.dm index b57f361d1b88f..2bd67778c10c1 100644 --- a/mods/hivemind/code/mobs.dm +++ b/mods/hivemind/code/mobs.dm @@ -20,12 +20,12 @@ var/speak_chance = 5 var/malfunction_chance = 5 ability_cooldown = 30 SECONDS - var/list/target_speak = list() //this is like speak list, but when we see our target + var/list/say_got_target = list() //this is like speak list, but when we see our target //internals var/obj/machinery/hivemind_machine/master var/special_ability_cooldown = 0 //use ability_cooldown, don't touch this - //ВЫДАТЬ АИ ХОЛДЕРА + ai_holder = /datum/ai_holder/simple_animal/melee // ВЫДАТЬ НАТУРАЛ ВЕАПОН /mob/living/simple_animal/hostile/hivemind/New() @@ -53,7 +53,7 @@ //That's just stuns us for a while and start second proc /mob/living/simple_animal/hostile/hivemind/proc/mulfunction() - stance = HOSTILE_STANCE_IDLE //it give us some kind of stun effect + stance = STANCE_IDLE //it give us some kind of stun effect target_mob = null walk(src, FALSE) var/datum/effect/spark_spread/spark_system = new /datum/effect/spark_spread() @@ -101,22 +101,11 @@ if(!.) return - speak() - if(malfunction_chance && prob(malfunction_chance)) mulfunction() closet_interaction() - -/mob/living/simple_animal/hostile/hivemind/proc/speak() - if(!client && speak_chance && prob(speak_chance) && speak.len) - if(target_mob && target_speak.len) - say(pick(target_speak)) - else - say(pick(speak)) - - //damage and raise malfunction chance //due to nature of malfunction, they just burn to death sometimes /mob/living/simple_animal/hostile/hivemind/emp_act(severity) @@ -148,7 +137,7 @@ /mob/living/simple_animal/hostile/hivemind/resurrected name = "resurrected creature" malfunction_chance = 10 - +// say_list_type = /datum/say_list/resurrected //careful with this proc, it's used to 'transform' corpses into our mobs. //it takes appearence, gives hive-like overlays and makes stats a little better @@ -167,11 +156,11 @@ attacktext = SA.attacktext //another check for superior mobs, fuk this mob spliting - if(istype(victim, /mob/living/carbon/human/H)) + if(istype(victim, /mob/living/carbon/human)) var/mob/living/carbon/human/SA = victim - icon_state = SA.icon_living - icon_living = SA.icon_living - attacktext = SA.attacktext + icon_state = SA.icon + icon_living = SA.icon + attacktext = "attacked" //now we work with icons, take victim's one and multiply it with special icon var/icon/infested = new /icon(icon, icon_state) @@ -188,16 +177,22 @@ mob_size = victim.mob_size pass_flags = victim.pass_flags - //corrupted speak imitation - var/phrase_amount = rand(2, 5) - for(var/count = 1 to phrase_amount) - var/first_word = pick("You", "I", "They", "Hive", "Corpses", "We", "Your friend", "This ship", "Your mind", "These guys") - var/second_word = pick("kill", "stop", "transform", "connect", "rebuild", "fix", "hug", "hit", "told", "help", "rework", "burn") - var/third_word = pick("them", "me", "you", "your soul", "us", "hive", "system", "this ship", "your head", "your brain") - var/end_symbol = pick("...", ".", "?", "!") - var/phrase = "[first_word] [second_word] [third_word][end_symbol]" - speak.Add(phrase) +/* TO DO - Исправить +/datum/say_list/resurrected + //corrupted speak imitation + var/phrase_amount = 0 + for (var/i = 1 to x) + phrase_amount += rand(2, 5) + for(count = 1 in phrase_amount) + var/first_word = list("You", "I", "They", "Hive", "Corpses", "We", "Your friend", "This ship", "Your mind", "These guys") + var/second_word = list("kill", "stop", "transform", "connect", "rebuild", "fix", "hug", "hit", "told", "help", "rework", "burn") + var/third_word = list("them", "me", "you", "your soul", "us", "hive", "system", "this ship", "your head", "your brain") + var/end_symbol = list("...", ".", "?", "!") + var/phrase = "[pick[first_word] [second_word] [third_word][end_symbol]]" + + speak = list("[phrase]") +*/ /mob/living/simple_animal/hostile/hivemind/resurrected/death() ..() @@ -226,16 +221,19 @@ speak_chance = 3 malfunction_chance = 15 mob_size = MOB_SMALL - pass_flags = PASSTABLE + pass_flags = PASS_FLAG_TABLE speed = 4 + ai_holder = /datum/ai_holder/simple_animal/melee + say_list_type = /datum/say_list/stinger +/datum/say_list/stinger speak = list( "I've seen this ai. Ma-an, that's aw-we-e-ewful!", "I know, i know, i remember this one.", "Rad-d-dar, put a ma-ma... mask on!", "Delicious! Delicious... Del-delicious?..", ) - target_speak = list( + say_got_target = list( "Hey, i'm comming!", "Hold on! I'm almost there!", "I'll help you! Come closer.", @@ -266,9 +264,12 @@ speak_chance = 3 malfunction_chance = 15 mob_size = MOB_SMALL - pass_flags = PASSTABLE + pass_flags = PASS_FLAG_TABLE speed = 6 + ai_holder = /datum/ai_holder/simple_animal/destructive + say_list_type = /datum/say_list/bomber +/datum/say_list/bomber speak = list( "Can you help me, please? There's something strange.", "Are you... Are you kidding?", @@ -276,7 +277,7 @@ "This place is really bad, we are in deep shit here.", "I'm not sure if we can just stop it", ) - target_speak = list( + say_got_target = list( "Here you are! I have something for you. Something special!", "Hey! Hey? Help me, please!", "Hey, look, look. I won't harm you, just calm down!", @@ -296,7 +297,7 @@ qdel(src) -/mob/living/simple_animal/hostile/hivemind/bomber/AttackingTarget() +/mob/living/simple_animal/hostile/hivemind/bomber/afterattack() death() @@ -324,12 +325,12 @@ icon_dead = "hiborg-dead" health = 220 maxHealth = 220 - melee_damage_lower = 10 harm_intent_damage = 15 attacktext = "claws" speed = 12 malfunction_chance = 15 mob_size = MOB_MEDIUM + ai_holder = /datum/ai_holder/simple_animal/humanoid/hostile say_list_type = /datum/say_list/hiborg /datum/say_list/hiborg @@ -338,13 +339,16 @@ "I'm too tired, man, too tired. This job is... Awful.", "These people know nothing about this work or about me. I can surprise them.", "Blue wire is bolts, green is safety. Just... Pulse it here, okay? Right...") - target_speak = list( + say_got_target = list( "I know what's wrong, just let me fix that.", "You need my help? What's wrong? Gimme that thing, I can fix that.", "Si-i-ir... Sir. Sir. It's better to... Stop here! Stop i said, what are you!?", "Wait! Hey! Can i fix that!? I'm an engineer, you fuck! Sto-op-op-p here, i know what to do!" ) +/* + +TO DO - забрать у паука вот это /mob/living/simple_animal/hostile/giant_spider/tunneler/do_special_attack(atom/A) /mob/living/simple_animal/hostile/hivemind/hiborg/AttackingTarget() if(!Adjacent(target_mob)) @@ -366,7 +370,7 @@ src.visible_message(SPAN_DANGER("[src] spins around and slashes in a circle!")) for(var/atom/target in range(1, src)) if(target != src) - target.attack_generic(src, rand(melee_damage_lower, harm_intent_damage*2)) + target.attack_generic(src, rand(harm_intent_damage*1,5)) if(!client && prob(speak_chance)) say(pick("Get away from me!", "They are everywhere!")) @@ -381,6 +385,7 @@ "I will fix you! Don't resist! Don't resist you rat!", "I just want to replace that broken thing!")) +*/ /////////////////////////////////////HIMAN//////////////////////////////////// //Hive + Man @@ -398,7 +403,6 @@ icon_dead = "himan-dead" health = 120 maxHealth = 120 - melee_damage_lower = 20 harm_intent_damage = 25 attacktext = "slashes with claws" malfunction_chance = 10 @@ -409,6 +413,7 @@ var/fake_dead = FALSE var/fake_dead_wait_time = 0 var/fake_death_cooldown = 0 + ai_holder = /datum/ai_holder/simple_animal/humanoid/hostile say_list_type = /datum/say_list/hiborg /datum/say_list/himan @@ -420,7 +425,7 @@ "Come on, you ba-ba-bastard, I know what you really want.", "How much fun!" ) - target_speak = list( + say_got_target = list( "Are you... Are you okay? Wa-wait, wait a minu-nu-nute.", "Come on, you ba-ba-bastard, i know what you really want to.", "How much fun!", @@ -457,16 +462,16 @@ return ..() -/* + /mob/living/simple_animal/hostile/hivemind/himan/MoveToTarget() if(!fake_dead) ..() else if(!target_mob || SA_attackable(target_mob)) - stance = HOSTILE_STANCE_IDLE + stance = STANCE_IDLE if(target_mob in ListTargets(10)) if(get_dist(src, target_mob) > 1) - stance = HOSTILE_STANCE_ATTACKING + stance = STANCE_ATTACKING /mob/living/simple_animal/hostile/hivemind/himan/AttackingTarget() @@ -478,9 +483,6 @@ else ..() -*///РЕФАКТОРИНГ ВСЕГО ЧТО ВЫШЕ - - //Shriek stuns our victims and make them deaf for a while /mob/living/simple_animal/hostile/hivemind/himan/special_ability() visible_emote("screams!") @@ -517,11 +519,9 @@ say(msg) icon_state = "himan-damaged" fake_dead = FALSE - stance = HOSTILE_STANCE_IDLE + stance = STANCE_IDLE fake_death_cooldown = world.time + 2 MINUTES - - /////////////////////////////////////MECHIVER///////////////////////////////// //Mech + Hive + Driver //Special ability: Picking up a victim. Sends hallucinations and harm sometimes, then release @@ -539,7 +539,6 @@ icon_dead = "mechiver-dead" health = 450 maxHealth = 450 - melee_damage_lower = 10 harm_intent_damage = 15 mob_size = MOB_LARGE attacktext = "tramples" @@ -550,6 +549,7 @@ var/pilot //Yes, there's no pilot, so we just use var var/mob/living/passenger var/hatch_closed = TRUE + ai_holder = /datum/ai_holder/simple_animal/humanoid/hostile say_list_type = /datum/say_list/mechiver /datum/say_list/mechiver @@ -558,7 +558,7 @@ "Somebody, just tell him to shut up...", "Bzew-zew-zewt. Th-this way!", "Wha-a-at? When I'm near this cargo, I feel... fe-fe-fea-fear-er.") - target_speak = list( + say_got_target = list( "Come here, jo-jo-join me. Join us-s.", "Time to be-to be-to be whole.", "Enter me, i'm be-best mech among all of these rusty buckets.", @@ -621,6 +621,7 @@ break +/* TO DO - Пофиксить диалоги о рыбалке /mob/living/simple_animal/hostile/hivemind/mechiver/speak() if(!client && prob(speak_chance) && speak.len) if(pilot) @@ -632,7 +633,7 @@ say(pick(other_answers)) else ..() - +*/ //animations //updates every life tick @@ -772,6 +773,7 @@ //internals var/can_use_special_ability = TRUE var/list/my_copies = list() + ai_holder = /datum/ai_holder/simple_animal/melee/evasive /mob/living/simple_animal/hostile/hivemind/phaser/New() ..() @@ -803,19 +805,19 @@ /mob/living/simple_animal/hostile/hivemind/phaser/AttackTarget() if(target_mob && get_dist(src, target_mob) > 1) - stance = HOSTILE_STANCE_ATTACK + stance = STANCE_ATTACK ..() /mob/living/simple_animal/hostile/hivemind/phaser/MoveToTarget() if(!target_mob || SA_attackable(target_mob)) - stance = HOSTILE_STANCE_IDLE + stance = STANCE_IDLE if(target_mob in ListTargets(10)) if(get_dist(src, target_mob) > 1) - stance = HOSTILE_STANCE_ATTACK + stance = STANCE_ATTACK phase_move_to(target_mob, nearby = TRUE) else - stance = HOSTILE_STANCE_ATTACKING + stance = STANCE_ATTACKING /mob/living/simple_animal/hostile/hivemind/phaser/proc/is_can_jump_on(turf/target) @@ -842,7 +844,7 @@ //if our target is near, we move precisely to it if(distance_to_target <= 3) if(nearby) - for(var/d in alldirs) + for(var/d in GLOB.alldirs) var/turf/nearby_turf = get_step(new_place, d) if(is_can_jump_on(nearby_turf)) new_place = nearby_turf @@ -886,7 +888,7 @@ /mob/living/simple_animal/hostile/hivemind/phaser/special_ability() my_copies = list() //let's clean it up - var/possible_directions = alldirs - cardinal + var/possible_directions = GLOB.alldirs - GLOB.cardinal var/turf/spawn_point = get_turf(src) //we gives to copies our appearence and pick random direction for them //with animation it's hard to say, who's real. And i hope it looks great diff --git a/mods/hivemind/code/objects.dm b/mods/hivemind/code/objects.dm index 7d9645f331c2c..96773acea3dcb 100644 --- a/mods/hivemind/code/objects.dm +++ b/mods/hivemind/code/objects.dm @@ -8,7 +8,6 @@ icon_state = "goo_proj" damage = 15 damage_type = DAMAGE_BURN - check_armour = "energy" step_delay = 2 diff --git a/mods/hivemind/code/overrides.dm b/mods/hivemind/code/overrides.dm index 327151f9d3192..3ad734bbd239b 100644 --- a/mods/hivemind/code/overrides.dm +++ b/mods/hivemind/code/overrides.dm @@ -28,7 +28,7 @@ health_current += rand_between(0,0.5) else health_current += rand_between(1,2.5) - refresh_icon() + update_icon() if(health_current > health_max) health_current = health_max else if(health_current == health_max && !vine && (seed.type != /datum/seed/mushroom/maintshroom)) diff --git a/mods/hivemind/code/wires.dm b/mods/hivemind/code/wires.dm index e61f12c28135c..fe9dab3afe97a 100644 --- a/mods/hivemind/code/wires.dm +++ b/mods/hivemind/code/wires.dm @@ -3,8 +3,7 @@ /obj/vine/hivemind layer = 2 - health = 80 - max_health = 80 //we are a little bit durable + health_max = 80 //we are a little bit durable var/list/killer_reagents = list("pacid", "sacid", "hclacid", "thermite") //internals var/obj/machinery/hivemind_machine/node/master_node @@ -13,7 +12,7 @@ /obj/vine/hivemind/New() ..() - icon = 'icons/obj/hivemind.dmi' + icon = 'mods/hivemind/icons/hivemind_obj.dmi' spawn(2) update_neighbors() @@ -58,7 +57,7 @@ qdel(machine_on_my_tile) //modular computers handling - var/obj/item/modular_computer/console/mod_comp = locate() in loc + var/obj/item/modular_computer/mod_comp = locate() in loc if(mod_comp) assimilate(mod_comp) @@ -72,7 +71,6 @@ ..() update_connections() update_icon() - update_openspace() /obj/vine/hivemind/spread() @@ -86,8 +84,8 @@ chem_handler() else //slow vanishing after node death - health -= 10 - alpha = 255 * health/max_health + health_current -= 10 + alpha = 255 * health_current/health_max check_health() @@ -95,13 +93,13 @@ return TRUE -/obj/vine/hivemind/refresh_icon() +/obj/vine/hivemind/update_icon() overlays.Cut() var/image/I for(var/i = 1 to 4) I = image(src.icon, "wires[wires_connections[i]]", dir = 1<<(i-1)) overlays += I - for(var/d in cardinal) + for(var/d in GLOB.cardinal) var/turf/T = get_step(loc, d) if((locate(/obj/structure/window) in T) || istype(T, /turf/simulated/wall)) var/image/wall_hug_overlay = image(icon = src.icon, icon_state = "wall_hug", dir = d) @@ -251,11 +249,14 @@ //in fact, this is some kind of reinforced wires, so we can't take samples from it and inject something too //but we still can slice it with something sharp -/obj/vine/hivemind/attackby(obj/item/weapon/W, mob/user) + +/* +/obj/vine/hivemind/use_weapon(obj/item/weapon/W, mob/user, list/click_params) + . = ..() user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) var/weapon_type - if (W.has_quality(QUALITY_CUTTING)) + if (W.has_edge(weapon)) weapon_type = QUALITY_CUTTING else if (W.has_quality(QUALITY_WELDING)) weapon_type = QUALITY_WELDING @@ -263,22 +264,39 @@ if(weapon_type) if(W.use_tool(user, src, WORKTIME_FAST, weapon_type, FAILCHANCE_EASY, required_stat = STAT_ROB)) user.visible_message(SPAN_DANGER("[user] cuts down [src]."), SPAN_DANGER("You cut down [src].")) - die_off() + kill_health() return return else if(W.sharp && W.force >= 10) - health -= rand(W.force/2, W.force) //hm, maybe make damage based on player's robust stat? + health_current -= rand(W.force/2, W.force) //hm, maybe make damage based on player's robust stat? user.visible_message(SPAN_DANGER("[user] slices [src]."), SPAN_DANGER("You slice [src].")) else user.visible_message(SPAN_DANGER("[user] tries to slice [src] with [W], but seems to do nothing."), SPAN_DANGER("You try to slice [src], but it's useless!")) check_health() +*/ + +/obj/vine/hivemind/use_weapon(obj/item/weapon/W, mob/user, list/click_params) + . = ..() + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + if(W.sharp && W.force >= 30) + user.visible_message(SPAN_DANGER("[user] cuts down [src]."), SPAN_DANGER("You cut down [src].")) + kill_health() + return + if(W.sharp && W.force >= 10) + health_current -= rand(W.force/2, W.force) //hm, maybe make damage based on player's robust stat? + user.visible_message(SPAN_DANGER("[user] slices [src]."), SPAN_DANGER("You slice [src].")) + else + user.visible_message(SPAN_DANGER("[user] tries to slice [src] with [W], but seems to do nothing."), + SPAN_DANGER("You try to slice [src], but it's useless!")) + + return ..() //fire is effective, but there need some time to melt the covering /obj/vine/hivemind/fire_act() - health -= rand(1, 4) + health_current -= rand(1, 4) check_health() @@ -286,13 +304,13 @@ //it causes electricity failure, so our wireweeds just blowing up inside, what makes them fragile /obj/vine/hivemind/emp_act(severity) if(severity) - die_off() + kill_health() //Some acid and there's no problem /obj/vine/hivemind/proc/chem_handler() - for(var/obj/effect/effect/smoke/chem/smoke in loc) + for(var/obj/effect/smoke/chem/smoke in loc) for(var/lethal in killer_reagents) if(smoke.reagents.has_reagent(lethal)) - die_off() + kill_health() return diff --git a/mods/hivemind/icons/hivemind_obj.dmi b/mods/hivemind/icons/hivemind_obj.dmi new file mode 100644 index 0000000000000000000000000000000000000000..532df325b833996159a35884f993cb417470c8e2 GIT binary patch literal 21931 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 X8XQ#&4hhIK00000NkvXXu0mjfcbzmQ literal 0 HcmV?d00001