diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 01c719abfff1..06f5397735cc 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -181,7 +181,7 @@
/obj/item/projectile/bullet/meteorshot/New()
..()
- SpinAnimation()
+ SpinAnimation(5)
/obj/item/projectile/bullet/mime
damage = 40
diff --git a/modular_ss220/antagonists/_antagonists.dme b/modular_ss220/antagonists/_antagonists.dme
index 63f489b41169..2431f16efa90 100644
--- a/modular_ss220/antagonists/_antagonists.dme
+++ b/modular_ss220/antagonists/_antagonists.dme
@@ -55,12 +55,3 @@
#include "code/vox_raider/objects/packs/vox_shop_pack_raider.dm"
#include "code/vox_raider/objects/packs/vox_shop_pack_dart.dm"
#include "code/vox_raider/objects/packs/vox_shop_pack_spike.dm"
-// BEGIN_INTERNALS
-// END_INTERNALS
-// BEGIN_FILE_DIR
-#define FILE_DIR .
-// END_FILE_DIR
-// BEGIN_PREFERENCES
-// END_PREFERENCES
-// BEGIN_INCLUDE
-// END_INCLUDE
diff --git a/modular_ss220/antagonists/code/guns/biogun.dm b/modular_ss220/antagonists/code/guns/biogun.dm
index e69de29bb2d1..7b4d42977752 100644
--- a/modular_ss220/antagonists/code/guns/biogun.dm
+++ b/modular_ss220/antagonists/code/guns/biogun.dm
@@ -0,0 +1,141 @@
+/obj/item/gun/throw/biogun
+ name = "biogun"
+ desc = "Метатель живых био-ядер."
+ icon = 'modular_ss220/antagonists/icons/guns/vox_guns.dmi'
+ lefthand_file = 'modular_ss220/antagonists/icons/guns/inhands/guns_lefthand.dmi'
+ righthand_file = 'modular_ss220/antagonists/icons/guns/inhands/guns_righthand.dmi'
+ icon_state = "biogun"
+ item_state = "spike_long"
+ var/inhand_charge_sections = 3
+ w_class = WEIGHT_CLASS_HUGE
+ max_capacity = 3
+ valid_projectile_type = /obj/item/biocore
+
+/obj/item/gun/throw/biogun/process_chamber()
+ . = ..()
+ update_icon()
+
+/obj/item/gun/throw/biogun/update_icon_state()
+ . = ..()
+ var/inhand_ratio = CEILING((length(loaded_projectiles) / max_capacity) * inhand_charge_sections, 1)
+ var/new_item_state = "[initial(item_state)][inhand_ratio]"
+ item_state = new_item_state
+
+/obj/item/gun/throw/biogun/update_overlays()
+ . = ..()
+ var/num = length(loaded_projectiles)
+ if(num)
+ num = min(num, max_capacity)
+ . += "[icon_state]_charge[num]"
+
+/obj/item/gun/throw/biogun/notify_ammo_count()
+ var/amount = get_ammocount()
+ if(get_ammocount() >= 1)
+ return "[src] заряжен [amount]/[max_capacity]."
+ return "[src] разряжен."
+
+// ============== Существа ==============
+
+/mob/living/simple_animal/hostile/viscerator/vox
+ name = "vox viscerator"
+ icon = 'modular_ss220/antagonists/icons/objects/critter.dmi'
+ faction = list("Vox")
+ mob_biotypes = MOB_ROBOTIC
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = -1, CLONE = -1, STAMINA = 0, OXY = 0)
+ can_be_on_fire = FALSE
+ fire_damage = 1
+ unsuitable_atmos_damage = 0
+ mob_size = MOB_SIZE_TINY
+ flying = FALSE
+ melee_damage_lower = 10
+ melee_damage_upper = 15
+
+/mob/living/simple_animal/hostile/viscerator/vox/Process_Spacemove(movement_dir)
+ return TRUE
+
+/mob/living/simple_animal/hostile/viscerator/vox/stamina
+ name = "stakikamka"
+ desc = "Небольшое биомеханическое проворное существо на высоких ножках, мешающее и изматывающее тех, кому оно не понравилось."
+ icon_state = "stamina"
+ icon_living = "stamina"
+ obj_damage = 0
+ speed = 0.25
+ melee_damage_type = STAMINA
+ melee_damage_lower = 5
+ melee_damage_upper = 20
+ attacktext = "утомляет"
+
+/mob/living/simple_animal/hostile/viscerator/vox/stamina/death(gibbed)
+ if(prob(30))
+ xgibs(loc)
+ . = ..()
+
+/mob/living/simple_animal/hostile/viscerator/vox/acid
+ name = "acikikid"
+ desc = "Небольшое биомеханическое крабоподобное существо из пасти которого стекает кислота, которую тот наматывает на свои маленькие острые клешни."
+ icon_state = "acid"
+ icon_living = "acid"
+ health = 50
+ maxHealth = 50
+ obj_damage = 20
+ melee_damage_type = BURN
+ melee_damage_lower = 10
+ melee_damage_upper = 30
+ attacktext = "выжигает"
+ mob_size = MOB_SIZE_SMALL
+
+/mob/living/simple_animal/hostile/viscerator/vox/acid/death(gibbed)
+ xgibs(loc)
+ . = ..()
+
+/mob/living/simple_animal/hostile/viscerator/vox/kusaka
+ name = "kusakika"
+ desc = "Маленькое биомеханическое существо с острыми клыкам с половину его тела."
+ icon_state = "kusaka"
+ icon_living = "kusaka"
+ speed = 0.5
+ obj_damage = 0
+ melee_damage_lower = 5
+ melee_damage_upper = 10
+ armour_penetration_flat = 30
+ attacktext = "кусает"
+
+/mob/living/simple_animal/hostile/viscerator/vox/kusaka/death(gibbed)
+ if(prob(20))
+ robogibs(loc)
+ . = ..()
+
+/mob/living/simple_animal/hostile/viscerator/vox/taran
+ name = "tarakikan"
+ desc = "Весомое пластинчатое биомеханическое существо."
+ icon_state = "taran"
+ icon_living = "taran"
+ speed = 2
+ health = 100
+ maxHealth = 100
+ obj_damage = 50
+ melee_damage_lower = 10
+ melee_damage_upper = 20
+ armour_penetration_flat = 20
+ attacktext = "таранит"
+ mob_size = MOB_SIZE_HUMAN
+
+/mob/living/simple_animal/hostile/viscerator/vox/taran/death(gibbed)
+ robogibs(loc)
+ . = ..()
+
+/mob/living/simple_animal/hostile/viscerator/vox/tox
+ name = "toxikikic"
+ desc = "Маленькое биомеханическое иглоподобное существо."
+ icon_state = "tox"
+ icon_living = "tox"
+ melee_damage_type = TOX
+ melee_damage_lower = 5
+ melee_damage_upper = 15
+ armour_penetration_flat = 80
+ attacktext = "вонзается"
+
+/mob/living/simple_animal/hostile/viscerator/vox/tox/death(gibbed)
+ xgibs(loc)
+ . = ..()
diff --git a/modular_ss220/antagonists/code/guns/biogun_ammo.dm b/modular_ss220/antagonists/code/guns/biogun_ammo.dm
index e69de29bb2d1..96893afff0bc 100644
--- a/modular_ss220/antagonists/code/guns/biogun_ammo.dm
+++ b/modular_ss220/antagonists/code/guns/biogun_ammo.dm
@@ -0,0 +1,92 @@
+/obj/item/biocore
+ name = "biocore"
+ desc = "Острое биоядро с живым организмом внутри. Оно пульсирует и ответно реагирует толчками на каждые взаимодействия."
+ icon = 'modular_ss220/antagonists/icons/guns/vox_guns.dmi'
+ icon_state = "biocore"
+ item_state = "cottoncandy_purple"
+
+ var/mob/living/mob_spawner_type = /mob/living/simple_animal/hostile/creature
+ var/spawn_amount = 1 // сколько в одном ядре
+ var/is_spin = TRUE
+
+ // Дополнительные эффекты при втыкании в гуманоида
+ var/stun = 0
+ var/weaken = 5 SECONDS
+ var/knockdown = 2 SECONDS
+ var/paralyze = 0
+ var/irradiate = 0
+ var/stutter = 5 SECONDS
+ var/slur = 0
+ var/eyeblur = 0
+ var/drowsy = 0
+ var/stamina = 30
+ var/jitter = 10 SECONDS
+ throwforce = 20
+ w_class = WEIGHT_CLASS_NORMAL
+
+
+/obj/item/biocore/Initialize(mapload)
+ . = ..()
+
+/obj/item/biocore/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
+ playsound(loc,'sound/weapons/bolathrow.ogg', 50, TRUE)
+ if(is_spin)
+ SpinAnimation()
+ if(!..())
+ return
+
+/obj/item/biocore/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+ . = ..()
+ spawn_mobs()
+ hurt_impact(hit_atom)
+
+/obj/item/biocore/AltClick(mob/user)
+ . = ..()
+ spawn_mobs()
+
+/obj/item/biocore/proc/spawn_mobs()
+ var/turf/T = get_turf(src)
+ for(var/i in 1 to spawn_amount)
+ var/atom/movable/x = new mob_spawner_type(T)
+ x.admin_spawned = admin_spawned
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(x, pick(NORTH,SOUTH,EAST,WEST))
+ do_sparks(5, TRUE, T)
+ qdel(src)
+
+/obj/item/biocore/proc/hurt_impact(atom/hit_atom)
+ if(isliving(hit_atom))
+ var/mob/living/L = hit_atom
+ L.apply_effects(stun, weaken, knockdown, paralyze, irradiate, slur, stutter, eyeblur, drowsy, 0, stamina, jitter)
+
+// ============== Ядра ==============
+/obj/item/biocore/viscerator
+ name = "biocore (viscerator)"
+ spawn_amount = 3
+ mob_spawner_type = /mob/living/simple_animal/hostile/viscerator/vox
+
+/obj/item/biocore/stamina
+ name = "biocore (stakikamka)"
+ spawn_amount = 3
+ mob_spawner_type = /mob/living/simple_animal/hostile/viscerator/vox/stamina
+
+/obj/item/biocore/acid
+ name = "biocore (acikikid)"
+ spawn_amount = 1
+ mob_spawner_type = /mob/living/simple_animal/hostile/viscerator/vox/acid
+
+/obj/item/biocore/kusaka
+ name = "biocore (kusakika)"
+ spawn_amount = 4
+ mob_spawner_type = /mob/living/simple_animal/hostile/viscerator/vox/kusaka
+
+/obj/item/biocore/taran
+ name = "biocore (tarakikan)"
+ spawn_amount = 1
+ mob_spawner_type = /mob/living/simple_animal/hostile/viscerator/vox/taran
+
+/obj/item/biocore/tox
+ name = "biocore (toxikikic)"
+ spawn_amount = 3
+ mob_spawner_type = /mob/living/simple_animal/hostile/viscerator/vox/tox
diff --git a/modular_ss220/antagonists/code/guns/dartgun.dm b/modular_ss220/antagonists/code/guns/dartgun.dm
index 9b0cbfb70659..9f369cac88c2 100644
--- a/modular_ss220/antagonists/code/guns/dartgun.dm
+++ b/modular_ss220/antagonists/code/guns/dartgun.dm
@@ -14,6 +14,10 @@
var/pixel_y_overlay_div = 5 // сколько у нас делений для спрайта оверлея ("Позиций")
var/pixel_y_overlay_offset = 2 // на сколько пикселей смещаем оверлей при полном делении
+/obj/item/gun/syringe/dart_gun/Destroy()
+ qdel(cartridge_loaded)
+ . = ..()
+
/obj/item/gun/syringe/dart_gun/update_overlays()
. = ..()
if(cartridge_loaded)
diff --git a/modular_ss220/antagonists/code/guns/spikegun.dm b/modular_ss220/antagonists/code/guns/spikegun.dm
index 8fda920238a3..fbca29f41684 100644
--- a/modular_ss220/antagonists/code/guns/spikegun.dm
+++ b/modular_ss220/antagonists/code/guns/spikegun.dm
@@ -40,7 +40,7 @@
/obj/item/gun/energy/spike/update_icon_state()
. = ..()
var/inhand_ratio = CEILING((cell.charge / cell.maxcharge) * inhand_charge_sections, 1)
- var/new_item_state = "[initial(item_state)]_[inhand_ratio]"
+ var/new_item_state = "[initial(item_state)][inhand_ratio]"
item_state = new_item_state
@@ -49,7 +49,7 @@
name = "\improper Vox spike longgun"
desc = "Оружие причудливой формы с яркими пурпурными энергетическими светочами. Рукоять предназначена для когтистой руки. Выстреливает длинными энергетическими самовосстановимыми кристаллами с увеличенной проникающей способностью."
icon_state = "spike_long"
- item_state = "spikelong"
+ item_state = "spike_long"
charge_sections = 6
inhand_charge_sections = 6
selfcharge = TRUE
@@ -59,7 +59,7 @@
/obj/item/gun/energy/spike/long/process()
if(selfcharge)
if(charge_tick < charge_delay)
- return
+ return ..()
playsound(src, 'modular_ss220/antagonists/sound/guns/m79_reload.ogg', 25, 1)
. = ..()
@@ -70,7 +70,7 @@
name = "\improper Vox spike biogun"
desc = "Оружие причудливой формы с шипами-трубками для нанизывания на руку. Рукоять предназначена для когтистой руки и имеет заостренные полые шипы. Выстреливает большими энергетическими заостренными кристаллами, выматывающие цель."
icon_state = "spike_bio"
- item_state = "spikebio"
+ item_state = "spike_bio"
w_class = WEIGHT_CLASS_HUGE
charge_sections = 4
inhand_charge_sections = 4
@@ -84,12 +84,12 @@
/obj/item/gun/energy/spike/bio/process()
if(selfcharge)
if(charge_tick < charge_delay)
- return
+ return ..()
if(!ishuman(loc))
- return
+ return ..()
var/mob/living/carbon/human/user = loc
if(user.nutrition <= NUTRITION_LEVEL_HYPOGLYCEMIA)
- return
+ return ..()
user.adjust_nutrition(-nutrition_cost)
if(!isvox(user))
user.adjustBruteLoss(brute_cost)
diff --git a/modular_ss220/antagonists/code/vox_raider/objects/packs/vox_shop_pack_bio.dm b/modular_ss220/antagonists/code/vox_raider/objects/packs/vox_shop_pack_bio.dm
index d7fee211f4a4..d5db49fbec9f 100644
--- a/modular_ss220/antagonists/code/vox_raider/objects/packs/vox_shop_pack_bio.dm
+++ b/modular_ss220/antagonists/code/vox_raider/objects/packs/vox_shop_pack_bio.dm
@@ -3,5 +3,53 @@
category = VOX_PACK_BIO
// ============== GUNS ==============
+/datum/vox_pack/bio/gun
+ name = "Биомёт"
+ desc = "Компактный метатель биоядер-снарядов. Вмещает в себя 3 острых биоядра одновременно, выстреливая их поочереди, вонзая в плоть цели, а после вылупляя, выпуская биомеханическую тварь для последующей помощи Воксам."
+ reference = "B_G"
+ cost = 0
+ contains = list(/obj/item/gun/throw/biogun)
// ============== AMMO ==============
+
+/datum/vox_pack/bio/core
+ name = "Биоядро (Потрошитель х3)"
+ desc = "Переписанная машина синдиката на служении Воксам."
+ reference = "B_B_VISC"
+ cost = 0
+ contains = list(/obj/item/biocore/viscerator)
+
+/datum/vox_pack/bio/core/
+ name = "Биоядро (Стакикамка х3)"
+ desc = "Биомеханизм изматывающий своих жертв."
+ reference = "B_B_STAM"
+ cost = 0
+ contains = list(/obj/item/biocore/stamina)
+
+/datum/vox_pack/bio/core/
+ name = "Биоядро (Асикикид х1)"
+ desc = "Кислотный жгущий биомеханизм."
+ reference = "B_B_ACID"
+ cost = 0
+ contains = list(/obj/item/biocore/acid)
+
+/datum/vox_pack/bio/core/
+ name = "Биоядро (Кусакика х4)"
+ desc = "Кусачий маленький биомеханизм."
+ reference = "B_B_KUS"
+ cost = 0
+ contains = list(/obj/item/biocore/kusaka)
+
+/datum/vox_pack/bio/core/
+ name = "Биоядро (Таракикан х1)"
+ desc = "Броневой биомеханизм, приспособленный для вышибания дверей."
+ reference = "B_B_TAT"
+ cost = 0
+ contains = list(/obj/item/biocore/taran)
+
+/datum/vox_pack/bio/core/
+ name = "Биоядро (Токсикикик х3)"
+ desc = "Иглоподобный биомеханизм для впрыскивания токсин."
+ reference = "B_B_TOX"
+ cost = 0
+ contains = list(/obj/item/biocore/tox)
diff --git a/modular_ss220/antagonists/code/vox_raider/objects/vox_shop.dm b/modular_ss220/antagonists/code/vox_raider/objects/vox_shop.dm
index b619db5b371b..ed77ed84505a 100644
--- a/modular_ss220/antagonists/code/vox_raider/objects/vox_shop.dm
+++ b/modular_ss220/antagonists/code/vox_raider/objects/vox_shop.dm
@@ -102,7 +102,7 @@
// Размещаем по емкостям
if(length(objs_for_contain) > 2)
- var/container_type = is_heavy ? /obj/structure/closet/crate : /obj/item/storage/box
+ var/container_type = is_heavy ? /obj/structure/closet/crate/trashcart : /obj/item/storage/box
var/obj/container = new container_type(get_turf(src))
for(var/obj/obj in objs_for_contain)
obj.forceMove(container)
diff --git a/modular_ss220/antagonists/code/vox_raider/objects/vox_trade.dm b/modular_ss220/antagonists/code/vox_raider/objects/vox_trade.dm
index 8abef64b91b8..f83b11c11cee 100644
--- a/modular_ss220/antagonists/code/vox_raider/objects/vox_trade.dm
+++ b/modular_ss220/antagonists/code/vox_raider/objects/vox_trade.dm
@@ -185,7 +185,6 @@
return
angry_count = 0
- atom_say(span_notice("Вами довольны. Производится пересчет ценностей."))
INVOKE_ASYNC(src, PROC_REF(make_cash), user, items_list)
/obj/machinery/vox_trader/proc/make_cash(mob/user, list/items_list)
diff --git a/modular_ss220/antagonists/icons/guns/vox_guns.dmi b/modular_ss220/antagonists/icons/guns/vox_guns.dmi
index 70de4109e8e2..78cd6d492c6e 100644
Binary files a/modular_ss220/antagonists/icons/guns/vox_guns.dmi and b/modular_ss220/antagonists/icons/guns/vox_guns.dmi differ
diff --git a/modular_ss220/antagonists/icons/objects/critter.dmi b/modular_ss220/antagonists/icons/objects/critter.dmi
new file mode 100644
index 000000000000..6e09f54898a8
Binary files /dev/null and b/modular_ss220/antagonists/icons/objects/critter.dmi differ