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