Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Звёздные войны 13 #1227

Closed
wants to merge 14 commits into from
Closed
2 changes: 1 addition & 1 deletion modular_ss220/objects/_objects.dme
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,4 @@
#include "code/flashlight.dm"
#include "code/electrostaff.dm"
#include "code/material_pouch.dm"

#include "code/components.dm"
48 changes: 48 additions & 0 deletions modular_ss220/objects/code/components.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#define COMSIG_IS_CONDITION_PASSED "is_condition_passed"
#define COMSIG_PICK_LEGENDARY_ITEM "pick_legendary_item"
#define COMPONENT_CONDITION_PASSED 1 << 0
#define COMPONENT_CONDITION_FAILED 0 << 0

/datum/component/condition_locked_pickup
var/pickup_damage
var/force = 20

/datum/component/condition_locked_pickup/Initialize(required_role, ckey_whitelist, pickup_damage = 0)
src.pickup_damage = pickup_damage
AddComponent(/datum/component/pass_condition, _ckeys = ckey_whitelist, _required_role = required_role)

/datum/component/condition_locked_pickup/RegisterWithParent()
RegisterSignal(parent, COMSIG_ITEM_PICKUP, PROC_REF(try_pick_up))


/datum/component/condition_locked_pickup/proc/try_pick_up(obj/item/I, mob/living/user)

if(!(SEND_SIGNAL(src, COMSIG_IS_CONDITION_PASSED) & COMPONENT_CONDITION_PASSED))
user.Weaken(10 SECONDS)
user.unEquip(I, force, silent = FALSE)
to_chat(user, span_userdanger("Вы недостойны."))
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.apply_damage(rand(pickup_damage, pickup_damage * 2), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
else
user.adjustBruteLoss(rand(pickup_damage, pickup_damage * 2))
return

/datum/component/pass_condition
var/list/ckeys = list()
var/required_role

/datum/component/pass_condition/Initialize(list/_ckeys = list(), _required_role = null)
ckeys = _ckeys
required_role = _required_role
RegisterSignal(parent, COMSIG_IS_CONDITION_PASSED, PROC_REF(check_requirements))

/datum/component/pass_condition/proc/check_requirements()
SIGNAL_HANDLER
if(usr.client.ckey in ckeys)
return COMPONENT_CONDITION_PASSED

if(required_role in usr.mind.vars)
if(usr.mind.vars[required_role])
return COMPONENT_CONDITION_PASSED
return COMPONENT_CONDITION_FAILED
1 change: 1 addition & 0 deletions modular_ss220/prime_only/_prime.dme
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@

#include "code/anakonda.dm"
#include "code/cattleprod.dm"
#include "code/objects.dm"
212 changes: 212 additions & 0 deletions modular_ss220/prime_only/code/objects.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
#define LEGENDARY_SWORDS_CKEY_WHITELIST list("grombila")

/obj/item/melee/rapier/genri_rapier
name = "Трость-рапира"
desc = "Стилизованная под трость рапира, чье элегантное и обоюдоострое лезвие усажено на роскошно украшенную рукоять. Одни лишь инкрустированные в неё драгоценные камни стоят как целая звездная система."
icon = 'modular_ss220/prime_only/icons/saber.dmi'
icon_state = "trrapier"
item_state = "trrapier"
force = 25
lefthand_file = 'modular_ss220/prime_only/icons/saber_left.dmi'
righthand_file = 'modular_ss220/prime_only/icons/saber_right.dmi'

/obj/item/storage/belt/rapier/genri_rapier
name = "Трость-рапира"
desc = "Ножны стилизованной под трость рапиры. Их корпус вырезан из черного дерева и щедро украшен позолотой. Их владелец обладает неоспоримый богатством и властью в известной Галактике."
icon_state = "trsheath"
item_state = "trsheath"
icon = 'modular_ss220/prime_only/icons/saber.dmi'
lefthand_file = 'modular_ss220/prime_only/icons/saber_left.dmi'
righthand_file = 'modular_ss220/prime_only/icons/saber_right.dmi'
can_hold = list(/obj/item/melee/rapier/genri_rapier)

/obj/item/storage/belt/rapier/genri_rapier/populate_contents()
new /obj/item/melee/rapier/genri_rapier(src)
update_icon()

/obj/item/dualsaber/legendary_saber
name = "Злоба"
desc = "\"Злоба\" - Один из легендарных мечей в галактике, был создан мастером Согда К'Тримом. Обладающий мистической энергией, он вызывает трепет у тех, кто стоит перед его обладателем. Злоба - олицетворяет самую темную сторону силы, рукоять меча гладкая, не имеющая массивных узоров и рун. При вспышке света он излучает рванный кроваво-красный свет, словно крича о непокорности и ярости своего владельца. По мифам в мече \"Злоба\" пребыает сама темная сущность могущества и бесконечного гнева, готовая исполнить волю своего хозяина даже за пределами пространства и времени. Текущий владелец: Миднайт Блэк.."
icon = 'modular_ss220/prime_only/icons/saber.dmi'
lefthand_file = 'modular_ss220/prime_only/icons/saber_left.dmi'
righthand_file = 'modular_ss220/prime_only/icons/saber_right.dmi'
icon_state = "mid_dualsaber0"
blade_color = "midnight"
colormap = LIGHT_COLOR_RED
wieldsound = 'modular_ss220/prime_only/sound/weapons/mid_saberon.ogg'
unwieldsound = 'modular_ss220/prime_only/sound/weapons/mid_saberoff.ogg'
var/saber_name = "mid"
var/hit_wield = 'modular_ss220/prime_only/sound/weapons/mid_saberhit.ogg'
var/hit_unwield = "swing_hit"

var/datum/enchantment/enchant = new/datum/enchantment/dash
var/ranged = FALSE
var/power = 1

/obj/item/dualsaber/legendary_saber/Initialize(mapload)
. = ..()
src.AddComponent(/datum/component/condition_locked_pickup, "offstation_role", LEGENDARY_SWORDS_CKEY_WHITELIST, pickup_damage = 10)

/obj/item/dualsaber/legendary_saber/pickup(mob/living/user)
. = ..()
log_debug("подобравший: [user]")

/obj/item/dualsaber/legendary_saber/update_icon_state()
if(HAS_TRAIT(src, TRAIT_WIELDED))
icon_state = "[saber_name]_dualsaber[blade_color]1"
set_light(brightness_on, l_color=colormap)
else
icon_state = "[saber_name]_dualsaber0"
set_light(0)

/obj/item/dualsaber/legendary_saber/on_wield(obj/item/source, mob/living/carbon/user)
if(user && HAS_TRAIT(user, TRAIT_HULK))
to_chat(user, "<span class='warning'>You lack the grace to wield this!</span>")
return COMPONENT_TWOHANDED_BLOCK_WIELD

hitsound = hit_wield
w_class = w_class_on

/obj/item/dualsaber/legendary_saber/on_unwield()
hitsound = hit_unwield
w_class = initial(w_class)

/obj/item/dualsaber/legendary_saber/gromov_saber
name = "Ловец Скорби"
desc = "\"Ловец Скорби\" (Второе название \"Плакса\") - один из легендарных световых мечей. Он сиволизизирует не только силу власти и могущества, но и является предметом гордости своего обладателя. Искусно выполненый клинок излучает мягкий голубой свет, словно призывая к миру и согласию, но при этом скрывает в себе силу и решимость защитить своего хозяина любой ценой. Рукоять меча состоит из матового металлического материала, так же на рукояти красуется фреска с логотипом NT. Ловец Скорби имеет специфический звук, отдалённо напоминающий плач, от чего некоторые прозвали меч \"Плаксой\" \n Создатель: Гаскон-Валлен-Деламот. Текущий владелец: Билл Громов"
icon_state = "gr_dualsaber0"
blade_color = "gromov"
colormap = LIGHT_COLOR_LIGHT_CYAN
saber_name = "gr"
wieldsound = 'modular_ss220/prime_only/sound/weapons/gr_saberon.ogg'
unwieldsound = 'modular_ss220/prime_only/sound/weapons/gr_saberoff.ogg'
hit_wield = 'modular_ss220/prime_only/sound/weapons/gr_saberhit.ogg'

/obj/item/dualsaber/legendary_saber/sharlotta_saber
name = "Пламя"
desc = "\"Пламя\" - один из легендарных световых мечей. Он отражает неумолимую справедливость и рьяность характера своего хозяина. В противоречие грозному названию, эфес меча представляет собой аккуратное и \"нежное\" произведение искусства - отполированная нарезная титановая основа завершается золотым навершием, а декоративная гарда выполнен в виде раскрывшегося бутона. Энергетический клинок источает яркий фиолетовый свет, несущий очищение и упокоение своим врагам. Рукоять меча крайне хорошо сбалансирована и отдает дань аристократическим традициям человеческого прошлого. Создатель: Гаскон-Валлен-Деламот. Текущий владелец: Шарлотта Дитерхис."
icon_state = "sh_dualsaber0"
blade_color = "sharlotta"
colormap = LIGHT_COLOR_LAVENDER
saber_name = "sh"
wieldsound = 'modular_ss220/prime_only/sound/weapons/sh_saberon.ogg'
unwieldsound = 'modular_ss220/prime_only/sound/weapons/sh_saberoff.ogg'
hit_wield = 'modular_ss220/prime_only/sound/weapons/sh_saberhit.ogg'

/obj/item/dualsaber/legendary_saber/kirien_saber
name = "Верность клятве"
desc = "\"Верность Клятве\" - легендарный световой меч с впечатляющим изумрудно-зеленым свечением. Сияющий осколок зеленого света, словно призывает к доблести и чести. Владение данным оружием говорит о преданности и силе духа. Этот меч служит, как напоминание о обязательствах и клятвах, данным владельцем при его получении. Согласно мифам, в свечении отражается сама душа создателя Арканона, который проводил долгие годы в изоляции в попытках создать воистину уникальное творение. Рукоять хромированный сатин, украшенный древними иероглифами людской расы. Создатель: Арканон. Текущий владелец: Хель Кириэн."
icon_state = "kir_dualsaber0"
blade_color = "kirien"
colormap = LIGHT_COLOR_PURE_GREEN
saber_name = "kir"
wieldsound = 'modular_ss220/prime_only/sound/weapons/kir_saberon.ogg'
unwieldsound = 'modular_ss220/prime_only/sound/weapons/kir_saberoff.ogg'
hit_wield = 'modular_ss220/prime_only/sound/weapons/kir_saberhit.ogg'

/obj/item/dualsaber/legendary_saber/normandy_saber
name = "Сестра"
desc = "\"Сестра\" - легендарный световой меч, представляет собой удивительное оружие с мистической историей и неповторимыми свойствами. Его лезвие излучает мягкий золотой свет, символизирующий мудрость, мощь и защиту. Сестра - это не просто меч, а источник силы и опоры для своего владельца. Его форма напоминает древние мечи рыцарей, но в тоже время он обладает строгим стилем, который дополняет своего владельца. Этот меч стал объектом поклонения и уважения во всей галактике, имя его символ доблести, чести и справедливости. По мифам считается, что только тот, кто искренне верит в силу справедлиовсти и защиты, способен раскрывать скрытые возможности Сестры. Этот меч служит не просто как инструмент борьбы, но как символ верности высшим идеалам. Создатель: Коникс`Хеллькикс. Текущий Владелец: Мунивёрс Нормандия"
icon_state = "norm_dualsaber0"
blade_color = "normandy"
colormap = LIGHT_COLOR_HOLY_MAGIC
saber_name = "norm"
wieldsound = 'modular_ss220/prime_only/sound/weapons/norm_saberon.ogg'
unwieldsound = 'modular_ss220/prime_only/sound/weapons/norm_saberoff.ogg'
hit_wield = 'modular_ss220/prime_only/sound/weapons/norm_saberhit.ogg'
/obj/item/dualsaber/legendary_saber/kelly_saber
name = "Ловец Бегущих"
desc = "\"Ловец Бегущих\" - легендарный световой меч который является младшей частью меча \"Сестра\". Первый взгляд на корпус даёт понять, что он служит уже продолжительное время. Вся поверхность изобилует царапинами, сколами и потёртостями. Под кнопкой включения, вдоль рукояти, нарисованы семь белых, перечёркнутых жетонов - счёт владельцев, через которых прошло это оружие. Рядом с самым первым жетоном выгравировано ''2361. А.М.'' Рукоять меча удлинена для комфортного боя как одной, так и двумя руками, навершие Типа P покрыто золотом и обладает специальным разъёмом для подключения второго меча, а гарда представляет собой два закруглённых отростка. Обладатели этого меча используют хаотичный, адаптивный под врага стиль боя. Создатель: Коникс`Хеллькикс. Текущий Владелец: Мунивёрс Нормандия, в последствии был передан Рицу Келли."
icon_state = "kel_dualsaber0"
blade_color = "kelly"
colormap = LIGHT_COLOR_HOLY_MAGIC
saber_name = "kel"
wieldsound = 'modular_ss220/prime_only/sound/weapons/kel_saberon.ogg'
unwieldsound = 'modular_ss220/prime_only/sound/weapons/kel_saberoff.ogg'
hit_wield = 'modular_ss220/prime_only/sound/weapons/kel_saberhit.ogg'

/obj/item/dualsaber/legendary_saber/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
enchant?.on_legendary_hit(target, user, proximity_flag, src)

/obj/item/dualsaber/legendary_saber/proc/add_enchantment(new_enchant, mob/living/user, intentional = TRUE)
var/datum/enchantment/E = new new_enchant
enchant = E
E.on_gain(src, user)
E.power *= power
if(intentional)
SSblackbox.record_feedback("nested tally", "saber_enchants", 1, list("[E.name]"))


/datum/enchantment/dash/proc/charge(mob/living/user, atom/chargeat, obj/item/dualsaber/legendary_saber/S)
if(on_leap_cooldown)
return
if(!chargeat)
return
var/turf/T = get_turf(chargeat)

if(!T)
return
var/list/targets = list()
for(var/atom/target in T.contents)
targets += target
charging = TRUE

var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(user.loc, user)
animate(D, alpha = 0, color = "#271e77", transform = matrix()*1, time = anim_time, loop = anim_loop)

var/i
for(i=0, i<5, i++)
spawn(i * 9 MILLISECONDS)
step_to(user, T, 1, movespeed)
var/obj/effect/temp_visual/decoy/D2 = new /obj/effect/temp_visual/decoy(user.loc, user)
animate(D2, alpha = 0, color = "#271e77", transform = matrix()*1, time = anim_time, loop = anim_loop)

spawn(45 MILLISECONDS)
if(get_dist(user, T) > 1)
return
charge_end(targets, user, S)


/datum/enchantment/dash/proc/charge_end(list/targets = list(), mob/living/user, obj/item/dualsaber/legendary_saber/S)
charging = FALSE

for(var/mob/living/L in targets)
if(!(L == user))
user.apply_damage(-40, STAMINA)
S.melee_attack_chain(user, L)

/datum/enchantment/dash
name = "Рывок"
desc = "Этот клинок несёт владельца прямо к цели. Никто не уйдёт."
ranged = TRUE
var/movespeed = 0.8
var/on_leap_cooldown = FALSE
var/charging = FALSE
var/anim_time = 3 DECISECONDS
var/anim_loop = 3 DECISECONDS


/datum/enchantment/proc/on_legendary_hit(mob/living/target, mob/living/user, proximity, obj/item/dualsaber/legendary_saber/S)
if(world.time < cooldown)
return FALSE
if(!istype(target))
return FALSE
if(target.stat == DEAD)
return FALSE
if(!ranged && !proximity)
return FALSE
cooldown = world.time + initial(cooldown)
return TRUE

/datum/enchantment/dash/on_legendary_hit(mob/living/target, mob/living/user, proximity, obj/item/dualsaber/legendary_saber/S)
if(proximity) // don't put it on cooldown if adjacent
return
. = ..()
if(!.)
return

if(HAS_TRAIT(S, TRAIT_WIELDED))
charge(user, target, S)


Binary file added modular_ss220/prime_only/icons/saber.dmi
Binary file not shown.
Binary file added modular_ss220/prime_only/icons/saber_left.dmi
Binary file not shown.
Binary file added modular_ss220/prime_only/icons/saber_right.dmi
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading