diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index af4e47587a8d..4f5b79b684fd 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -127,14 +127,14 @@ if(length(req_access)) locked = TRUE new_core?.install(src) - helmet = new /obj/item/clothing/head/mod(src) + helmet = build_head() // SS220 EDIT - original: new /obj/item/clothing/head/mod(src) mod_parts += helmet - chestplate = new /obj/item/clothing/suit/mod(src) + chestplate = build_suit() // SS220 EDIT - original: new /obj/item/clothing/suit/mod(src) chestplate.allowed += theme.allowed_suit_storage mod_parts += chestplate - gauntlets = new /obj/item/clothing/gloves/mod(src) + gauntlets = build_gloves() // SS220 EDIT - original: new /obj/item/clothing/gloves/mod(src) mod_parts += gauntlets - boots = new /obj/item/clothing/shoes/mod(src) + boots = build_shoes() // SS220 EDIT - original: new /obj/item/clothing/shoes/mod(src) mod_parts += boots var/list/all_parts = mod_parts + src for(var/obj/item/part as anything in all_parts) diff --git a/modular_ss220/clothing/_clothing.dme b/modular_ss220/clothing/_clothing.dme index 7d41d6f1a1d2..a70b69054c10 100644 --- a/modular_ss220/clothing/_clothing.dme +++ b/modular_ss220/clothing/_clothing.dme @@ -11,3 +11,4 @@ #include "code/shoes.dm" #include "code/suits.dm" #include "code/under.dm" +#include "code/mod.dm" diff --git a/modular_ss220/clothing/code/mod.dm b/modular_ss220/clothing/code/mod.dm new file mode 100644 index 000000000000..26a4d974fabd --- /dev/null +++ b/modular_ss220/clothing/code/mod.dm @@ -0,0 +1,280 @@ +// MARK: MODsuit clothes +/obj/item/clothing/head/mod/exclusive + icon = 'modular_ss220/clothing/icons/object/mod_clothing.dmi' + item_state = 'modular_ss220/clothing/icons/mob/mod_clothing.dmi' + icon_override = 'modular_ss220/clothing/icons/mob/mod_clothing.dmi' + sprite_sheets = list( + "Human" = 'modular_ss220/clothing/icons/mob/mod_clothing.dmi', + "Skrell" = 'modular_ss220/clothing/icons/mob/species/skrell/mod_clothing.dmi', + ) + +/obj/item/clothing/suit/mod/exclusive + icon = 'modular_ss220/clothing/icons/object/mod_clothing.dmi' + item_state = 'modular_ss220/clothing/icons/mob/mod_clothing.dmi' + icon_override = 'modular_ss220/clothing/icons/mob/mod_clothing.dmi' + sprite_sheets = list( + "Human" = 'modular_ss220/clothing/icons/mob/mod_clothing.dmi', + "Skrell" = 'modular_ss220/clothing/icons/mob/species/skrell/mod_clothing.dmi', + ) + +/obj/item/clothing/gloves/mod/exclusive + icon = 'modular_ss220/clothing/icons/object/mod_clothing.dmi' + item_state = 'modular_ss220/clothing/icons/mob/mod_clothing.dmi' + icon_override = 'modular_ss220/clothing/icons/mob/mod_clothing.dmi' + sprite_sheets = list( + "Human" = 'modular_ss220/clothing/icons/mob/mod_clothing.dmi', + "Skrell" = 'modular_ss220/clothing/icons/mob/species/skrell/mod_clothing.dmi', + ) + +/obj/item/clothing/shoes/mod/exclusive + icon = 'modular_ss220/clothing/icons/object/mod_clothing.dmi' + item_state = 'modular_ss220/clothing/icons/mob/mod_clothing.dmi' + icon_override = 'modular_ss220/clothing/icons/mob/mod_clothing.dmi' + sprite_sheets = list( + "Human" = 'modular_ss220/clothing/icons/mob/mod_clothing.dmi', + "Skrell" = 'modular_ss220/clothing/icons/mob/species/skrell/mod_clothing.dmi', + ) + +// MARK: MODsuit control +/obj/item/mod/control/proc/build_head() + return new /obj/item/clothing/head/mod(src) + +/obj/item/mod/control/proc/build_suit() + return new /obj/item/clothing/suit/mod(src) + +/obj/item/mod/control/proc/build_gloves() + return new /obj/item/clothing/gloves/mod(src) + +/obj/item/mod/control/proc/build_shoes() + return new /obj/item/clothing/shoes/mod(src) + +/obj/item/mod/control/proc/is_any_part_deployed() + for(var/obj/item/part as anything in mod_parts) + if(part.loc != src) + return TRUE + return FALSE + +// This is kinda sick but we need to retract it before the actual species change. +/obj/item/mod/control/proc/pre_species_gain(datum/species/new_species) + if(!wearer) + return + if(is_any_part_deployed() && !theme.is_species_allowed(new_species)) + // Deactivate MODsuit to respect the species allowed. + to_chat(wearer, span_warning("Ошибка видовой принадлежности! Деактивация.")) + if(active) + var/old_activation_step_time = activation_step_time + activation_step_time = 0.1 SECONDS // gotta go fast + toggle_activate(wearer, force_deactivate = TRUE) + activation_step_time = old_activation_step_time + quick_deploy(wearer) + +/obj/item/mod/control/quick_deploy(mob/user) + user = user || loc // why the fuck this is nullable + if(!is_any_part_deployed() && !theme.is_species_allowed(user.dna.species)) + to_chat(user, span_warning("Ошибка видовой принадлежности! Развертывание недоступно.")) + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + return ..() + +/obj/item/mod/control/deploy(mob/user, obj/item/part, mass) + user = user || loc // why the fuck this is nullable + if(!mass && part.loc != user && !theme.is_species_allowed(user.dna.species)) + to_chat(user, span_warning("Ошибка видовой принадлежности! Развертывание недоступно.")) + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + return ..() + +/obj/item/mod/control/pre_equipped/exclusive + icon = 'modular_ss220/clothing/icons/object/mod_clothing.dmi' + icon_override = 'modular_ss220/clothing/icons/mob/mod_clothing.dmi' + +/obj/item/mod/control/pre_equipped/exclusive/build_head() + return new /obj/item/clothing/head/mod/exclusive(src) + +/obj/item/mod/control/pre_equipped/exclusive/build_suit() + return new /obj/item/clothing/suit/mod/exclusive(src) + +/obj/item/mod/control/pre_equipped/exclusive/build_gloves() + return new /obj/item/clothing/gloves/mod/exclusive(src) + +/obj/item/mod/control/pre_equipped/exclusive/build_shoes() + return new /obj/item/clothing/shoes/mod/exclusive(src) + +// MARK: MODsuit Theme +/datum/mod_theme + /// Which species are allowed to deploy MODsuit. Consider empty list as no restriction. + var/list/species_allowed = list() + +/datum/mod_theme/proc/is_species_allowed(datum/species/species) + if(!length(species_allowed)) + return TRUE + if(!(species.name in species_allowed)) + return FALSE + return TRUE + +/mob/living/carbon/human/change_dna(datum/dna/new_dna, include_species_change) + if(istype(back, /obj/item/mod/control)) + INVOKE_ASYNC(back, TYPE_PROC_REF(/obj/item/mod/control, pre_species_gain), new_dna.species) + return ..() + +/mob/living/carbon/human/set_species(datum/species/new_species, use_default_color = FALSE, delay_icon_update = FALSE, skip_same_check = FALSE, retain_damage = FALSE, transformation = FALSE, keep_missing_bodyparts = FALSE) + if(istype(back, /obj/item/mod/control)) + INVOKE_ASYNC(back, TYPE_PROC_REF(/obj/item/mod/control, pre_species_gain), new_species) + return ..() + +// MARK: Skrell elite MODsuit - Raskinta +/datum/mod_theme/skrell_raskinta + name = "\improper raskinta" + desc = "Боевая броня с функцией костюма для ВКД, созданная для воинов Раскинта Ме'керр-Кэтиш." + extended_desc = "Массивный бронекостюм, выполненный в черно-синих цветах, является отличительной чертой \ + военных формирований Раскинта-Кэтиш. Защитные пластины состоят из укрепленной керамики, в то время как \ + каркасные пластины выполнены из сплавов вороной пластали, позволяющей эффективно поглощать и рассеивать энергию \ + через радиаторные отводы на \"хвостовых\" окончаниях шлема. \ + Этот костюм является самым часто встречаемым в штурмовых отрядах Оборонительных Сил Скреллов." + default_skin = "skrell_elite" + armor_type_1 = /obj/item/mod/armor/mod_theme_skrell_raskinta + flag_2_flags = RAD_PROTECT_CONTENTS_2 + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 1 + slowdown_active = 0.25 + complexity_max = DEFAULT_MAX_COMPLEXITY + 5 + allowed_suit_storage = list( + /obj/item/ammo_box, + /obj/item/ammo_casing, + /obj/item/restraints/handcuffs, + /obj/item/flash, + /obj/item/melee/baton, + /obj/item/gun, + /obj/item/melee/vibroblade, + ) + species_allowed = list("Skrell") + skins = list( + "skrell_elite" = list( + MOD_ICON_OVERRIDE = 'modular_ss220/clothing/icons/object/mod_clothing.dmi', + HELMET_FLAGS = list( + UNSEALED_LAYER = COLLAR_LAYER, + + SEALED_CLOTHING = THICKMATERIAL | STOPSPRESSUREDMAGE | BLOCK_GAS_SMOKE_EFFECT | BLOCKHAIR, + UNSEALED_INVISIBILITY = HIDEFACE, + SEALED_INVISIBILITY = HIDEMASK | HIDEEYES | HIDEFACE, + SEALED_COVER = HEADCOVERSMOUTH | HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT | HIDETAIL, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDMAGE, + CAN_OVERSLOT = TRUE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDMAGE, + CAN_OVERSLOT = TRUE, + ), + ), + ) + +/obj/item/mod/armor/mod_theme_skrell_raskinta + armor = list(MELEE = 40, BULLET = 25, LASER = 25, ENERGY = 20, BOMB = 25, RAD = INFINITY, FIRE = 200, ACID = 200) + +/obj/item/mod/control/pre_equipped/exclusive/skrell_raskinta + theme = /datum/mod_theme/skrell_raskinta + applied_cell = /obj/item/stock_parts/cell/super + applied_modules = list( + /obj/item/mod/module/storage/syndicate, + /obj/item/mod/module/emp_shield, + /obj/item/mod/module/status_readout, + /obj/item/mod/module/flashlight, + /obj/item/mod/module/magboot/advanced, + /obj/item/mod/module/jetpack/advanced, + ) + default_pins = list( + /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/magboot/advanced, + ) + +// MARK: Skrell elite MODsuit - Sardaukars +/datum/mod_theme/skrell_sardaukars + name = "\improper emperor guard" + desc = "Элитная боевая броня гвардейцев Скреллианской империи." + extended_desc = "Благодаря высшим технологическим достижениям скреллов этот костюм сочетает в себе \ + невероятные показатели защищенности и мобильности, являясь незаменимой вещью на вооружении свирепых Куи'кверр-Кэтиш. \ + Носящие его воины являются личной гвардией Императора и выполняют самые сложные задачи по его воле. \ + Кроваво-белоснежные цвета, отождествляющие кровь врагов и власть Его Величества, скорее всего последнее \ + что вы увидите в своей жизни." + default_skin = "skrell_white" + armor_type_1 = /obj/item/mod/armor/mod_theme_skrell_sardaukars + resistance_flags = FIRE_PROOF + flag_2_flags = RAD_PROTECT_CONTENTS_2 + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 0.5 + slowdown_active = 0 + complexity_max = DEFAULT_MAX_COMPLEXITY + 10 + allowed_suit_storage = list( + /obj/item/ammo_box, + /obj/item/ammo_casing, + /obj/item/restraints/handcuffs, + /obj/item/flash, + /obj/item/melee/baton, + /obj/item/gun, + /obj/item/melee/vibroblade, + ) + species_allowed = list("Skrell") + skins = list( + "skrell_white" = list( + MOD_ICON_OVERRIDE = 'modular_ss220/clothing/icons/object/mod_clothing.dmi', + HELMET_FLAGS = list( + UNSEALED_LAYER = COLLAR_LAYER, + + SEALED_CLOTHING = THICKMATERIAL | STOPSPRESSUREDMAGE | BLOCK_GAS_SMOKE_EFFECT | BLOCKHAIR, + UNSEALED_INVISIBILITY = HIDEFACE, + SEALED_INVISIBILITY = HIDEMASK | HIDEEYES | HIDEFACE, + SEALED_COVER = HEADCOVERSMOUTH | HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT | HIDETAIL, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDMAGE, + CAN_OVERSLOT = TRUE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDMAGE, + CAN_OVERSLOT = TRUE, + ), + ), + ) + +/obj/item/mod/armor/mod_theme_skrell_sardaukars + armor = list(MELEE = 120, BULLET = 120, LASER = 100, ENERGY = 50, BOMB = 100, RAD = INFINITY, FIRE = INFINITY, ACID = INFINITY) + +/obj/item/mod/control/pre_equipped/exclusive/skrell_sardaukars + theme = /datum/mod_theme/skrell_sardaukars + applied_cell = /obj/item/stock_parts/cell/bluespace + applied_modules = list( + /obj/item/mod/module/storage/bluespace, + /obj/item/mod/module/emp_shield, + /obj/item/mod/module/flashlight, + /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/status_readout, + /obj/item/mod/module/magboot/advanced, + /obj/item/mod/module/visor/thermal + ) + default_pins = list( + /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/magboot/advanced, + /obj/item/mod/module/visor/thermal + ) + +/obj/item/mod/control/pre_equipped/exclusive/skrell_sardaukars/Initialize(mapload, new_theme, new_skin, new_core, new_access) + . = ..() + ADD_TRAIT(chestplate, TRAIT_RSG_IMMUNE, ROUNDSTART_TRAIT) diff --git a/modular_ss220/clothing/icons/mob/mod_clothing.dmi b/modular_ss220/clothing/icons/mob/mod_clothing.dmi new file mode 100644 index 000000000000..b72c882ea4c3 Binary files /dev/null and b/modular_ss220/clothing/icons/mob/mod_clothing.dmi differ diff --git a/modular_ss220/clothing/icons/mob/species/skrell/mod_clothing.dmi b/modular_ss220/clothing/icons/mob/species/skrell/mod_clothing.dmi new file mode 100644 index 000000000000..b72c882ea4c3 Binary files /dev/null and b/modular_ss220/clothing/icons/mob/species/skrell/mod_clothing.dmi differ diff --git a/modular_ss220/clothing/icons/object/mod_clothing.dmi b/modular_ss220/clothing/icons/object/mod_clothing.dmi new file mode 100644 index 000000000000..2c08f1e9ca76 Binary files /dev/null and b/modular_ss220/clothing/icons/object/mod_clothing.dmi differ diff --git a/modular_ss220/jobs/code/jobs_global_list.dm b/modular_ss220/jobs/code/jobs_global_list.dm index 6da25d934924..02c3923603db 100644 --- a/modular_ss220/jobs/code/jobs_global_list.dm +++ b/modular_ss220/jobs/code/jobs_global_list.dm @@ -16,6 +16,11 @@ GLOBAL_LIST_INIT(security_positions_ss220, list( "Security Cadet", )) +// ====================== EVENT ====================== +GLOBAL_LIST_INIT(event_ss220, list( + "SDTF Raskinta Katish", + "Emperor Guard", +)) // ====================== DONOR ====================== GLOBAL_LIST_INIT(donor_tier_1_jobs, list( @@ -92,13 +97,13 @@ GLOBAL_LIST_INIT(jobs_excluded_from_selection, list("Donor")) // ====================== SPECIAL ====================== // cant be antags GLOBAL_LIST_INIT(restricted_jobs_ss220, security_positions_ss220 + ( - donor_tier_4_jobs + donor_tier_5_jobs + jobs_excluded_from_selection + donor_tier_4_jobs + donor_tier_5_jobs + jobs_excluded_from_selection + event_ss220 )) // ===================== ALL JOBS ===================== GLOBAL_LIST_INIT(all_jobs_ss220, (list() + ( - medical_positions_ss220 + science_positions_ss220 + engineering_positions_ss220 + security_positions_ss220 + all_donor_jobs))) + medical_positions_ss220 + science_positions_ss220 + engineering_positions_ss220 + security_positions_ss220 + all_donor_jobs + event_ss220))) // ====================== TITLE ====================== @@ -133,5 +138,8 @@ GLOBAL_LIST_INIT(all_jobs_ss220, (list() + ( /proc/get_all_assistant_titles_ss220() return GLOB.assistant_donor_jobs + get_alt_titles(GLOB.assistant_donor_jobs) +/proc/get_all_event_titles_ss220() + return GLOB.event_ss220 + get_alt_titles(GLOB.event_ss220) + /proc/get_all_titles_ss220() - return get_all_medical_titles_ss220() + get_all_security_titles_ss220() + get_all_engineering_titles_ss220() + get_all_science_titles_ss220() + get_all_service_titles_ss220() + get_all_supply_titles_ss220() + get_all_assistant_titles_ss220() + return get_all_medical_titles_ss220() + get_all_security_titles_ss220() + get_all_engineering_titles_ss220() + get_all_science_titles_ss220() + get_all_service_titles_ss220() + get_all_supply_titles_ss220() + get_all_assistant_titles_ss220() + get_all_event_titles_ss220() diff --git a/modular_ss220/jobs/icons/hud.dmi b/modular_ss220/jobs/icons/hud.dmi index 21c2a2aa47f6..9a032a279adf 100644 Binary files a/modular_ss220/jobs/icons/hud.dmi and b/modular_ss220/jobs/icons/hud.dmi differ diff --git a/modular_ss220/objects/_objects.dme b/modular_ss220/objects/_objects.dme index 0e95f3c7de7a..e38f4a613dc4 100644 --- a/modular_ss220/objects/_objects.dme +++ b/modular_ss220/objects/_objects.dme @@ -16,10 +16,13 @@ #include "code/weapons/melee/baseball_bat.dm" #include "code/weapons/melee/electrostaff.dm" #include "code/weapons/melee/stylet.dm" +#include "code/weapons/melee/vibroblade.dm" #include "code/weapons/ranged/beretta.dm" #include "code/weapons/ranged/pneumagun.dm" #include "code/weapons/ranged/revolvers.dm" #include "code/weapons/ranged/sslr.dm" +#include "code/weapons/ranged/sakhno.dm" +#include "code/weapons/ranged/skrell_rifle.dm" // Plushies #include "code/plushies/hampters.dm" diff --git a/modular_ss220/objects/code/weapons/melee/vibroblade.dm b/modular_ss220/objects/code/weapons/melee/vibroblade.dm new file mode 100644 index 000000000000..16abdf90c341 --- /dev/null +++ b/modular_ss220/objects/code/weapons/melee/vibroblade.dm @@ -0,0 +1,173 @@ +// MARK: Vibroblade +#define CHARGE_LEVEL_NONE 0 +#define CHARGE_LEVEL_LOW 1 +#define CHARGE_LEVEL_MEDIUM 2 +#define CHARGE_LEVEL_HIGH 3 +#define CHARGE_LEVEL_OVERCHARGE 4 + +/obj/item/melee/vibroblade + name = "\improper vibroblade" + desc = "Виброклинок воинов Раскинта. Микрогенератор ультразвука в рукояти позволяет лезвию вибрировать \ + с огромной частотой, что позволяет при его достаточной зарядке наносить глубокие раны даже ударами по касательной." + icon = 'modular_ss220/objects/icons/melee.dmi' + icon_state = "vibroblade" + item_state = "vibroblade" + lefthand_file = 'modular_ss220/objects/icons/inhands/melee_lefthand.dmi' + righthand_file = 'modular_ss220/objects/icons/inhands/melee_righthand.dmi' + hitsound = 'modular_ss220/objects/sound/weapons/melee/sardaukar/knifehit1.ogg' + drop_sound = 'modular_ss220/aesthetics_sounds/sound/handling/drop/knife.ogg' + pickup_sound = 'modular_ss220/objects/sound/weapons/melee/sardaukar/equip.ogg' + attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + force = 20 + throwforce = 15 + throw_speed = 2 + throw_range = 5 + armour_penetration_percentage = 75 + slot_flags = SLOT_FLAG_BELT + w_class = WEIGHT_CLASS_NORMAL + sharp = TRUE + flags = CONDUCT + var/charge_level = CHARGE_LEVEL_NONE + var/max_charge_level = CHARGE_LEVEL_OVERCHARGE + /// How long does it take to reach next level of charge. + var/charge_time = 4 SECONDS + /// TRUE if the item keeps charge only when is held in hands. FALSE if the item always keeps charge. + var/hold_to_be_charged = TRUE + var/emp_proof = FALSE + /// Body parts that can be cut off. + var/list/cutoff_candidates = list( + BODY_ZONE_L_LEG, + BODY_ZONE_R_LEG, + BODY_ZONE_L_ARM, + BODY_ZONE_R_ARM, + BODY_ZONE_PRECISE_L_FOOT, + BODY_ZONE_PRECISE_R_FOOT, + BODY_ZONE_PRECISE_L_HAND, + BODY_ZONE_PRECISE_R_HAND, + ) + +/obj/item/melee/vibroblade/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_MOVABLE_POST_THROW, PROC_REF(thrown)) + AddComponent(/datum/component/parry, _stamina_constant = 2, _stamina_coefficient = 0.5, _parryable_attack_types = ALL_ATTACK_TYPES) + +/obj/item/melee/vibroblade/Destroy() + . = ..() + UnregisterSignal(src, COMSIG_MOVABLE_POST_THROW) + +/obj/item/melee/vibroblade/update_icon_state() + icon_state = initial(icon_state) + (charge_level > CHARGE_LEVEL_NONE ? "_[charge_level]" : "") + +/obj/item/melee/vibroblade/examine(mob/user) + . = ..() + . += span_notice("Используйте [src] в руке, чтобы повысить уровень заряда.") + if(charge_level == CHARGE_LEVEL_NONE) + . += span_notice("[src] не заряжен.") + return + + . += span_notice("[src] заряжен на [(charge_level / max_charge_level)*100]%.") + . += charge_level == max_charge_level \ + ? span_danger("Следующий удар будет крайне травмирующим!") \ + : span_warning("Следующий удар будет усиленным!") + +/obj/item/melee/vibroblade/attack_self(mob/living/user) + . = ..() + if(charge_level >= max_charge_level) + user.visible_message( + span_notice("[user.name] пытается зарядить [src], но кнопка на рукояти не поддается!"), + span_notice("Вы пытаетесь нажать на кнопку зарядки [src], но она заблокирована.") + ) + return FALSE + + user.visible_message( + span_notice("[user.name] нажимает на кнопку зарядки [src]..."), + span_notice("Вы нажимаете на кнопку зарядки [src], заряжая микрогенератор...") + ) + + if(!do_after_once(user, charge_time, allow_moving = TRUE, must_be_held = TRUE, target = src)) + return + playsound(loc, 'sound/effects/sparks3.ogg', vol = 10, vary = TRUE) + do_sparks(1, TRUE, src) + set_charge_level(charge_level + 1) + +/obj/item/melee/vibroblade/pre_attack(atom/A, mob/living/user, params) + . = ..() + force = initial(force) * get_damage_factor() + +/obj/item/melee/vibroblade/attack(mob/living/target, mob/living/user, def_zone) + var/obj/item/organ/external/selected_bodypart + if(user.zone_selected in cutoff_candidates) + selected_bodypart = target.get_organ(user.zone_selected) + . = ..() + + if(charge_level == CHARGE_LEVEL_HIGH) + target.Weaken(1.5 SECONDS) + else if(charge_level == CHARGE_LEVEL_OVERCHARGE && selected_bodypart && istype(target, /mob/living/carbon/human)) + var/obj/item/organ/external/after_attack_bodypart = target.get_organ(user.zone_selected) + + // We compare these in case the body part hasn't been cut off by standard attack logic + if(after_attack_bodypart == selected_bodypart) + after_attack_bodypart.droplimb(TRUE, DROPLIMB_SHARP) + user.visible_message( + span_danger("[user] изящно и непринужденно отсекает [selected_bodypart] [target]!"), + span_biggerdanger("Вы искусно отсекаете [selected_bodypart] [target]!") + ) + + set_charge_level(CHARGE_LEVEL_NONE) + +/obj/item/melee/vibroblade/suicide_act(mob/living/carbon/human/user) + var/obj/item/organ/external/head = user.get_organ(BODY_ZONE_HEAD) + user.visible_message(span_suicide("[user] прижимает лезвие [src] к своей шее и нажимает на кнопку зарядки микрогенератора. \ + Кажется, это попытка самоубийства!")) + user.atom_say("Слава Вечной Империи!") + head.droplimb(TRUE, DROPLIMB_SHARP, FALSE, TRUE) + set_charge_level(CHARGE_LEVEL_NONE) + return BRUTELOSS + +/obj/item/melee/vibroblade/emp_act(severity) + . = ..() + if(emp_proof) + return + set_charge_level(CHARGE_LEVEL_NONE) + +/obj/item/melee/vibroblade/equipped(mob/user, slot, initial) + . = ..() + if(hold_to_be_charged && slot != SLOT_HUD_LEFT_HAND && slot != SLOT_HUD_RIGHT_HAND) + set_charge_level(CHARGE_LEVEL_NONE) + +/obj/item/melee/vibroblade/dropped(mob/user, silent) + . = ..() + if(hold_to_be_charged && !silent) + set_charge_level(CHARGE_LEVEL_NONE) + +/obj/item/melee/vibroblade/proc/thrown(datum/thrownthing/thrown_thing, spin) + SIGNAL_HANDLER + if(hold_to_be_charged) + set_charge_level(CHARGE_LEVEL_NONE) + +/obj/item/melee/vibroblade/proc/get_damage_factor() + return 1 + 0.25 * clamp(charge_level, CHARGE_LEVEL_NONE, max_charge_level) + +/obj/item/melee/vibroblade/proc/set_charge_level(charge_level) + src.charge_level = charge_level + force = initial(force) * get_damage_factor() + update_icon_state() + +/obj/item/melee/vibroblade/sardaukar + name = "\improper emperor guard vibroblade" + desc = "Виброклинок гвардейцев Императора. Микрогенератор ультразвука в рукояти позволяет лезвию вибрировать \ + с огромной частотой, что позволяет при его достаточной зарядке наносить глубокие раны даже ударами по касательной. \ + Воины Куи'кверр-Кэтиш обучаются мастерству ближнего боя с детства, поэтому в их руках он особо опасен и жесток. \ + Каждый будущий гвардеец добывает свой клинок в ритуальном бою, и его сохранность есть вопрос жизни и смерти владельца." + icon_state = "vibroblade_elite" + item_state = "vibroblade_elite" + force = 25 + charge_time = 2 SECONDS + hold_to_be_charged = FALSE + emp_proof = TRUE + +#undef CHARGE_LEVEL_NONE +#undef CHARGE_LEVEL_LOW +#undef CHARGE_LEVEL_MEDIUM +#undef CHARGE_LEVEL_HIGH +#undef CHARGE_LEVEL_OVERCHARGE diff --git a/modular_ss220/objects/code/weapons/ranged/sakhno.dm b/modular_ss220/objects/code/weapons/ranged/sakhno.dm new file mode 100644 index 000000000000..cd1f09d88c25 --- /dev/null +++ b/modular_ss220/objects/code/weapons/ranged/sakhno.dm @@ -0,0 +1,43 @@ +// MARK: Sakhno rifle +/obj/item/gun/projectile/shotgun/boltaction/sakhno + name = "\improper Sakhno precision rifle" + desc = "Высокоточная винтовка Sakhno со скользящим затвором, которая была (и, безусловно, остается) крайне популярной среди \ + покорителей фронтира, контрабандистов, ЧОП'овцев, исследователей, и прочих рисковых ребят. Эта модель \ + была разработана и производится с 2440 года." + icon = 'modular_ss220/objects/icons/wide_guns.dmi' + icon_state = "sakhno" + item_state = "sakhno" + lefthand_file = 'modular_ss220/objects/icons/inhands/guns_lefthand.dmi' + righthand_file = 'modular_ss220/objects/icons/inhands/guns_righthand.dmi' + fire_sound = 'modular_ss220/objects/sound/weapons/gunshots/shot_heavy.ogg' + mag_type = /obj/item/ammo_box/magazine/internal/boltaction/sakhno + knife_x_offset = 30 + knife_y_offset = 12 + +/obj/item/ammo_box/magazine/internal/boltaction/sakhno + icon = 'modular_ss220/objects/icons/ammo.dmi' + icon_state = "310" + ammo_type = /obj/item/ammo_casing/s310 + caliber = "s310" + max_ammo = 5 + multiload = 1 + +// MARK: .310 +/obj/item/ammo_box/s310 + name = "stripper clip (.310)" + desc = "A stripper clip for .310 cartridges, used in Sakhno rifles. Five round capacity." + icon = 'modular_ss220/objects/icons/ammo.dmi' + icon_state = "310" + ammo_type = /obj/item/ammo_casing/s310 + max_ammo = 5 + multi_sprite_step = 1 + +/obj/item/ammo_casing/s310 + name = ".310 round" + desc = "A .310 rifle cartridge" + icon = 'modular_ss220/objects/icons/ammo.dmi' + icon_state = "310-casing" + caliber = "s310" + projectile_type = /obj/item/projectile/bullet/midbullet3/hp + muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG + muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG diff --git a/modular_ss220/objects/code/weapons/ranged/skrell_rifle.dm b/modular_ss220/objects/code/weapons/ranged/skrell_rifle.dm new file mode 100644 index 000000000000..e7844b3d0c20 --- /dev/null +++ b/modular_ss220/objects/code/weapons/ranged/skrell_rifle.dm @@ -0,0 +1,148 @@ +// MARK: Skrellian carbine +/obj/item/gun/energy/gun/skrell_carbine + name = "\improper skrellian carbine" + desc = "Энергетический карабин Vuu'Xqu*ix T-3, более известный в ТСФ как 'VT-3'. Это оружие редко можно увидеть где-то, помимо ОСС. \ + Имеет два режима мощности энерголуча: 'летальный' и 'штурмовой'. Второй предназначен для прорыва сквозь укрпеления противника." + icon = 'modular_ss220/objects/icons/guns.dmi' + lefthand_file = 'modular_ss220/objects/icons/inhands/guns_lefthand.dmi' + righthand_file = 'modular_ss220/objects/icons/inhands/guns_righthand.dmi' + item_state = "skrell_carbine" + icon_state = "skrell_carbine" + cell_type = /obj/item/stock_parts/cell/skrell_carbine_cell + ammo_type = list(/obj/item/ammo_casing/energy/laser/skrell_light, /obj/item/ammo_casing/energy/laser/skrell_assault) + origin_tech = "combat=6;magnets=5" + modifystate = 2 + execution_speed = 3 SECONDS + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/gun/energy/gun/skrell_carbine/elite + name = "\improper elite skrellian carbine" + desc = "Энергетический карабин Vuu'Xqu*ix T-3, более известный в ТСФ как 'VT-3'. Это оружие редко можно увидеть где-то, помимо ОСС. \ + Этот экземпляр обладает батареей повышенной емкости, а так же дополнительными стабилизаторами стрельбы. \ + Имеет два режима мощности энерголуча: 'летальный' и 'штурмовой'. Второй предназначен для прорыва сквозь укрпеления противника." + ammo_type = list(/obj/item/ammo_casing/energy/laser/skrell_light/elite, /obj/item/ammo_casing/energy/laser/skrell_assault/elite) + +/obj/item/ammo_casing/energy/laser/skrell_light + projectile_type = /obj/item/projectile/beam/laser/skrell_light + muzzle_flash_color = LIGHT_COLOR_LAVENDER + select_name = "light" + fire_sound = 'modular_ss220/objects/sound/weapons/gunshots/blaster.ogg' + +/obj/item/ammo_casing/energy/laser/skrell_assault + projectile_type = /obj/item/projectile/beam/pulse/skrell_laser_assault + muzzle_flash_color = LIGHT_COLOR_LAVENDER + select_name = "assault" + e_cost = 1600 + fire_sound = 'modular_ss220/objects/sound/weapons/gunshots/blaster.ogg' + +/obj/item/ammo_casing/energy/laser/skrell_light/elite + e_cost = 50 + +/obj/item/ammo_casing/energy/laser/skrell_assault/elite + e_cost = 200 + +/obj/item/projectile/beam/laser/skrell_light + name = "laser" + icon_state = "purple_laser" + damage = 23 + impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser + light_color = LIGHT_COLOR_LAVENDER + +/obj/item/projectile/beam/pulse/skrell_laser_assault + name = "heavy laser" + icon_state = "u_laser_alt" + damage = 10 + stamina = 80 + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser + light_color = LIGHT_COLOR_DARK_BLUE + weakened_against_rwalls = TRUE + +/obj/item/stock_parts/cell/skrell_carbine_cell + name = "\improper Vuu'Xqu*ix T-3 gun power cell" + maxcharge = 1600 + +// MARK: Skrellian railgun rifle +/obj/item/gun/projectile/automatic/sniper_rifle/skrell_rifle + name = "\improper skrellian rifle" + desc = "Винтовка Zquiv*Tzuuli-8, или ''ZT-8'' - это рельсотрон, стоящий на вооружении тяжелых штурмовых отрядов Раскинта из ОСС. \ + Имеет цилиндрический магазин заряжания, разгонный магнитный блок и стабилизаторы для точной стрельбы." + icon = 'modular_ss220/objects/icons/guns.dmi' + lefthand_file = 'modular_ss220/objects/icons/inhands/guns_lefthand.dmi' + righthand_file = 'modular_ss220/objects/icons/inhands/guns_righthand.dmi' + icon_state = "sniper" + item_state = "sniper" + fire_sound = 'modular_ss220/objects/sound/weapons/gunshots/railgun.ogg' + recoil = 0 + fire_delay = 25 + slot_flags = SLOT_FLAG_BELT + zoomable = FALSE + can_suppress = FALSE + mag_type = /obj/item/ammo_box/magazine/skrell_magazine + +/obj/item/gun/projectile/automatic/sniper_rifle/skrell_rifle/elite + name = "\improper elite skrellian rifle" + desc = "Винтовка Zquiv*Tzuuli-8, или ''ZT-8'' - это рельсотрон, стоящий на вооружении тяжелых штурмовых отрядов Раскинта из ОСС. \ + Имеет цилиндрический магазин заряжания, разгонный магнитный блок и стабилизаторы для точной стрельбы. \ + Этот экземпляр обладает расширенным магазинным гнездом, а так же оптическим прицелом." + fire_delay = 20 + zoomable = TRUE + mag_type = /obj/item/ammo_box/magazine/skrell_magazine/skrell_magazine_elite + +/obj/item/ammo_box/magazine/skrell_magazine + name = "\improper ammo cylinder" + desc = "Цилиндровый магазин для рельсотрона." + icon = 'modular_ss220/objects/icons/ammo.dmi' + icon_state = "skrell_magazine" + multi_sprite_step = 3 + ammo_type = /obj/item/ammo_casing/railgun + max_ammo = 4 + caliber = "railgun" + multiload = TRUE + +/obj/item/ammo_box/magazine/skrell_magazine/skrell_magazine_elite + icon_state = "skrell_magazine_elite" + multi_sprite_step = 7 + max_ammo = 8 + ammo_type = /obj/item/ammo_casing/railgun/railgun_strong + +/obj/item/ammo_casing/railgun + name = "\improper railgun ammo casing" + desc = "Снаряд для рельсотрона. Состоит из поражающего элемента и магнитного стабилизатора." + icon = 'modular_ss220/objects/icons/ammo.dmi' + icon_state = "railgun-casing" + caliber = "railgun" + projectile_type = /obj/item/projectile/bullet/railgun + +/obj/item/ammo_casing/railgun/railgun_strong + projectile_type = /obj/item/projectile/bullet/railgun/railgun_strong + +/obj/item/projectile/bullet/railgun + damage = 35 + armour_penetration_flat = 80 + pass_flags = PASSTABLE | PASSGRILLE | PASSGIRDER + speed = 0.2 + icon_state = "gauss_silenced" + light_color = LIGHT_COLOR_LIGHT_CYAN + +/obj/item/projectile/bullet/railgun/railgun_strong + damage = 45 + armour_penetration_flat = 30 + weaken = 0.2 + speed = 0.2 + +// MARK: Skrellian pistol +/obj/item/gun/energy/gun/skrell_pistol + name = "\improper self-charge skrellian pistol" + desc = "Энергетический пистолет Qua'l*Sarqzix-44x, известный на территориях ТСФ как QS-44. Компактный и удобный в использовании, имеет два режима мощности энерголуча: 'летальный' и 'нейтрализующий'. \ + Встроенный микрогенератор постепенно пополняет запас аккамулятора прямо в бою." + icon = 'modular_ss220/objects/icons/guns.dmi' + icon_state = "skrell_pistol" + item_state = "skrell_pistol" + lefthand_file = 'modular_ss220/objects/icons/inhands/guns_lefthand.dmi' + righthand_file = 'modular_ss220/objects/icons/inhands/guns_righthand.dmi' + ammo_type = list(/obj/item/ammo_casing/energy/laser/skrell_light, /obj/item/ammo_casing/energy/disabler) + w_class = WEIGHT_CLASS_SMALL + shaded_charge = FALSE + can_holster = TRUE + execution_speed = 4 SECONDS + selfcharge = TRUE diff --git a/modular_ss220/objects/icons/ammo.dmi b/modular_ss220/objects/icons/ammo.dmi index a3fab60866e5..9e52b4ae7c81 100644 Binary files a/modular_ss220/objects/icons/ammo.dmi and b/modular_ss220/objects/icons/ammo.dmi differ diff --git a/modular_ss220/objects/icons/boxes.dmi b/modular_ss220/objects/icons/boxes.dmi new file mode 100644 index 000000000000..7290c8bf0f25 Binary files /dev/null and b/modular_ss220/objects/icons/boxes.dmi differ diff --git a/modular_ss220/objects/icons/guns.dmi b/modular_ss220/objects/icons/guns.dmi index dee535c69061..0b1e0c63091e 100644 Binary files a/modular_ss220/objects/icons/guns.dmi and b/modular_ss220/objects/icons/guns.dmi differ diff --git a/modular_ss220/objects/icons/inhands/guns_lefthand.dmi b/modular_ss220/objects/icons/inhands/guns_lefthand.dmi index 204f9527ebe0..8b77e53ebc47 100644 Binary files a/modular_ss220/objects/icons/inhands/guns_lefthand.dmi and b/modular_ss220/objects/icons/inhands/guns_lefthand.dmi differ diff --git a/modular_ss220/objects/icons/inhands/guns_righthand.dmi b/modular_ss220/objects/icons/inhands/guns_righthand.dmi index 29da95a9c061..bbecbad178b5 100644 Binary files a/modular_ss220/objects/icons/inhands/guns_righthand.dmi and b/modular_ss220/objects/icons/inhands/guns_righthand.dmi differ diff --git a/modular_ss220/objects/icons/inhands/melee_lefthand.dmi b/modular_ss220/objects/icons/inhands/melee_lefthand.dmi index 446d4dd0ad31..738f8c58acc4 100644 Binary files a/modular_ss220/objects/icons/inhands/melee_lefthand.dmi and b/modular_ss220/objects/icons/inhands/melee_lefthand.dmi differ diff --git a/modular_ss220/objects/icons/inhands/melee_righthand.dmi b/modular_ss220/objects/icons/inhands/melee_righthand.dmi index c15e31bfa1d9..844e8b00b1c7 100644 Binary files a/modular_ss220/objects/icons/inhands/melee_righthand.dmi and b/modular_ss220/objects/icons/inhands/melee_righthand.dmi differ diff --git a/modular_ss220/objects/icons/melee.dmi b/modular_ss220/objects/icons/melee.dmi index bd594df9aa10..d219ebe2a30d 100644 Binary files a/modular_ss220/objects/icons/melee.dmi and b/modular_ss220/objects/icons/melee.dmi differ diff --git a/modular_ss220/objects/icons/wide_guns.dmi b/modular_ss220/objects/icons/wide_guns.dmi new file mode 100644 index 000000000000..9e84712f81f2 Binary files /dev/null and b/modular_ss220/objects/icons/wide_guns.dmi differ diff --git a/modular_ss220/objects/sound/weapons/gunshots/blaster.ogg b/modular_ss220/objects/sound/weapons/gunshots/blaster.ogg new file mode 100644 index 000000000000..829a5c365579 Binary files /dev/null and b/modular_ss220/objects/sound/weapons/gunshots/blaster.ogg differ diff --git a/modular_ss220/objects/sound/weapons/gunshots/railgun.ogg b/modular_ss220/objects/sound/weapons/gunshots/railgun.ogg new file mode 100644 index 000000000000..0b939fd9a60e Binary files /dev/null and b/modular_ss220/objects/sound/weapons/gunshots/railgun.ogg differ diff --git a/modular_ss220/objects/sound/weapons/gunshots/shot_heavy.ogg b/modular_ss220/objects/sound/weapons/gunshots/shot_heavy.ogg new file mode 100644 index 000000000000..f91b21ec4d80 Binary files /dev/null and b/modular_ss220/objects/sound/weapons/gunshots/shot_heavy.ogg differ diff --git a/modular_ss220/objects/sound/weapons/melee/sardaukar/equip.ogg b/modular_ss220/objects/sound/weapons/melee/sardaukar/equip.ogg new file mode 100644 index 000000000000..92ca5f02172f Binary files /dev/null and b/modular_ss220/objects/sound/weapons/melee/sardaukar/equip.ogg differ diff --git a/modular_ss220/objects/sound/weapons/melee/sardaukar/knifehit1.ogg b/modular_ss220/objects/sound/weapons/melee/sardaukar/knifehit1.ogg new file mode 100644 index 000000000000..3e4a04c0f1de Binary files /dev/null and b/modular_ss220/objects/sound/weapons/melee/sardaukar/knifehit1.ogg differ diff --git a/modular_ss220/outfits/code/outfits.dm b/modular_ss220/outfits/code/outfits.dm index 48da37da9efe..f19ce9ceb7ec 100644 --- a/modular_ss220/outfits/code/outfits.dm +++ b/modular_ss220/outfits/code/outfits.dm @@ -316,3 +316,138 @@ /datum/outfit/job/centcom/response_team/engineer/amber suit = /obj/item/clothing/suit/space/ert_engineer head = /obj/item/clothing/head/helmet/space/ert_engineer + +// MARK: Skrell +/datum/outfit/admin/sdtf + name = "Skrellian Defence Task Forces Marine" + uniform = /obj/item/clothing/under/solgov/srt + back = /obj/item/mod/control/pre_equipped/exclusive/skrell_raskinta + belt = /obj/item/melee/vibroblade + glasses = /obj/item/clothing/glasses/night + gloves = /obj/item/clothing/gloves/combat + shoes = /obj/item/clothing/shoes/combat + l_ear = /obj/item/radio/headset/skrellian + id = /obj/item/card/id + l_hand = /obj/item/gun/energy/gun/skrell_carbine/elite + r_pocket = /obj/item/reagent_containers/hypospray/autoinjector/nt_emergency/skrell + l_pocket = /obj/item/tank/internals/emergency_oxygen/double + mask = /obj/item/clothing/mask/gas/swat + backpack_contents = list( + /obj/item/storage/box/skrell, + /obj/item/storage/box/smoke_grenades, + /obj/item/grenade/plastic/c4 = 2, + /obj/item/storage/box/handcuffs, + /obj/item/clothing/accessory/holster, + /obj/item/gun/energy/gun/skrell_pistol + ) + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/chest/nutriment/plus, + /obj/item/organ/internal/cyberimp/brain/anti_drop, + /obj/item/organ/internal/cyberimp/eyes/hud/medical, + ) + var/is_sardaukar = FALSE + +/datum/outfit/admin/sdtf/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + if(visualsOnly) + return + + H.add_language("Skrellian") + H.set_default_language(GLOB.all_languages["Skrellian"]) + + var/obj/item/card/id/I = H.wear_id + if(istype(I)) + var/applied_rank = is_sardaukar ? "Emperor Guard" : "SDTF Raskinta Katish" + apply_to_card(I, H, list(ACCESS_MAINT_TUNNELS), applied_rank, /obj/item/card/id/away/old/med::icon_state) + H.sec_hud_set_ID() + +/datum/outfit/admin/sdtf/rifleman + name = "Skrellian Defence Task Forces Officer" + l_hand = /obj/item/gun/projectile/automatic/sniper_rifle/skrell_rifle + belt = /obj/item/storage/belt/military/assault/skrell + suit_store = /obj/item/melee/vibroblade + backpack_contents = list( + /obj/item/storage/box/skrell, + /obj/item/gun/energy/gun/skrell_carbine/elite, + /obj/item/storage/box/smoke_grenades, + /obj/item/grenade/plastic/c4 = 2, + /obj/item/clothing/accessory/holster, + /obj/item/gun/energy/gun/skrell_pistol + ) + +/datum/outfit/admin/sdtf/sardaukar + name = "Skrellian Defence Task Forces Emperor Guard" + l_hand = /obj/item/gun/projectile/automatic/sniper_rifle/skrell_rifle/elite + belt = /obj/item/storage/belt/military/assault/skrell_elite + back = /obj/item/mod/control/pre_equipped/exclusive/skrell_sardaukars + r_pocket = /obj/item/reagent_containers/hypospray/combat/nanites + suit_store = /obj/item/melee/vibroblade/sardaukar + backpack_contents = list( + /obj/item/gun/energy/gun/skrell_carbine/elite, + /obj/item/storage/box/skrell, + /obj/item/storage/box/smoke_grenades, + /obj/item/grenade/plastic/c4 = 2, + /obj/item/clothing/accessory/holster, + /obj/item/CQC_manual, + /obj/item/shield/energy, + /obj/item/gun/energy/gun/skrell_pistol + ) + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/chest/nutriment/plus, + /obj/item/organ/internal/cyberimp/brain/anti_drop, + /obj/item/organ/internal/cyberimp/eyes/hud/medical, + /obj/item/organ/internal/cyberimp/brain/sensory_enhancer, + /obj/item/organ/internal/cyberimp/brain/anti_stam + ) + is_sardaukar = TRUE + +/obj/item/radio/headset/skrellian + name = "skrellian bowman headset" + desc = "Used by SDFT forces. Protects ears from flashbangs." + flags = EARBANGPROTECT + origin_tech = "syndicate=3" + icon_state = "com_headset_alt" + item_state = "com_headset_alt" + ks1type = /obj/item/encryptionkey/skrell + requires_tcomms = FALSE + +/obj/item/encryptionkey/skrell + name = "skrellian encryption key" + icon_state = "cypherkey" + channels = list("Special Ops" = 1, "Security" = 1, "Command" = 1) + origin_tech = "syndicate=4" + +/obj/item/reagent_containers/hypospray/autoinjector/nt_emergency/skrell + name = "nanites emergency autoinjector" + desc = "Одноразовый автоинжектор с нанитами." + list_reagents = list("nanites" = 10) + +/obj/item/storage/box/skrell + name = "boxed survival kit" + desc = "A standard issue SDTF survival kit." + icon = 'modular_ss220/objects/icons/boxes.dmi' + icon_state = "skrell_box" + +/obj/item/storage/box/skrell/populate_contents() + new /obj/item/tank/internals/emergency_oxygen/engi(src) + new /obj/item/crowbar/small(src) + new /obj/item/flashlight/flare(src) + new /obj/item/kitchen/knife/combat(src) + new /obj/item/reagent_containers/hypospray/autoinjector/nt_emergency/skrell(src) + new /obj/item/reagent_containers/hypospray/autoinjector/nt_emergency/skrell(src) + +/obj/item/storage/belt/military/assault/skrell/populate_contents() + new /obj/item/ammo_box/magazine/skrell_magazine(src) + new /obj/item/ammo_box/magazine/skrell_magazine(src) + new /obj/item/ammo_box/magazine/skrell_magazine(src) + new /obj/item/ammo_box/magazine/skrell_magazine(src) + new /obj/item/ammo_box/magazine/skrell_magazine(src) + new /obj/item/restraints/legcuffs/bola/energy(src) + +/obj/item/storage/belt/military/assault/skrell_elite/populate_contents() + new /obj/item/ammo_box/magazine/skrell_magazine/skrell_magazine_elite(src) + new /obj/item/ammo_box/magazine/skrell_magazine/skrell_magazine_elite(src) + new /obj/item/ammo_box/magazine/skrell_magazine/skrell_magazine_elite(src) + new /obj/item/ammo_box/magazine/skrell_magazine/skrell_magazine_elite(src) + new /obj/item/ammo_box/magazine/skrell_magazine/skrell_magazine_elite(src) + new /obj/item/restraints/legcuffs/bola/energy(src)