diff --git a/modular_ss220/objects/_objects.dme b/modular_ss220/objects/_objects.dme index df38bb801967..32daa80052a6 100644 --- a/modular_ss220/objects/_objects.dme +++ b/modular_ss220/objects/_objects.dme @@ -47,3 +47,4 @@ #include "code/components.dm" #include "code/airlock_painter.dm" #include "code/animalhide.dm" +#include "code/golden_idol.dm" diff --git a/modular_ss220/objects/code/golden_idol.dm b/modular_ss220/objects/code/golden_idol.dm new file mode 100644 index 000000000000..1a9316d73689 --- /dev/null +++ b/modular_ss220/objects/code/golden_idol.dm @@ -0,0 +1,212 @@ +#define IDOL_NOUN_LIFESPAN "GAD" +#define IDOL_NOUN_HEAT "HORA" +#define IDOL_NOUN_MATTER "BRIN" +#define IDOL_NOUN_AIR "SUKB" // There is no info about how AIR noun sounds +#define IDOL_NOUN_EMPTY "пусто" + +#define IDOL_VERB_DECREASE "NAGANA" +#define IDOL_VERB_INCREASE "TEGANA" + +#define IDOL_COOLING_TARGET 100 // In kelvins +#define IDOL_HEATING_MAX 4000 // In kelvins + +/obj/item/golden_idol + name = "золотой идол" + desc = "Причудливая статуэтка, отлитая из бронзы и покрытая золотом. На её спине расположено три глифа и небольшой рычажок. Один взгляд на идол пробуждает в вас желание власти." + icon = 'modular_ss220/objects/icons/golden_idol.dmi' + icon_state = "red" + var/idol_verb = IDOL_VERB_DECREASE + var/idol_noun = IDOL_NOUN_LIFESPAN + var/idol_addition = IDOL_NOUN_EMPTY + var/idol_in_use = FALSE + var/idol_storage = null + +/obj/item/golden_idol/examine(mob/user) + . = ..() + . += span_notice("Используйте в руке чтобы изменить глагол. Сейчас активен ") + span_boldnotice(idol_verb) + . += span_notice("Используйте альт-клик чтобы изменить существительное. Сейчас активно ") + span_boldnotice(idol_noun) + . += span_notice("Используйте контрл-клик чтобы изменить дополнение. Сейчас активно ") + span_boldnotice(idol_addition) + +// Glif changing + +/obj/item/golden_idol/attack_self(mob/user) + if(idol_verb == IDOL_VERB_DECREASE) + idol_verb = IDOL_VERB_INCREASE + else + idol_verb = IDOL_VERB_DECREASE + to_chat(user, span_notice("Вы изменили глиф глагола на [idol_verb]")) + +/obj/item/golden_idol/AltClick(mob/user) + if(!Adjacent(user) || !ishuman(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + return + + if(idol_in_use) + to_chat(user, span_warning("У вас не получается изменить глиф существительного. Идол дрожит от наполняющей его энергии. Вам нужно выпустить ей!")) + return + + switch(idol_noun) + if(IDOL_NOUN_LIFESPAN) + idol_noun = IDOL_NOUN_HEAT + if(IDOL_NOUN_HEAT) + idol_noun = IDOL_NOUN_MATTER + if(IDOL_NOUN_MATTER) + idol_noun = IDOL_NOUN_AIR + if(IDOL_NOUN_AIR) + idol_noun = IDOL_NOUN_LIFESPAN + to_chat(user, span_notice("Вы изменили глиф существительного на [idol_noun]")) + +/obj/item/golden_idol/CtrlClick(mob/user) + ..() + if(!Adjacent(user) || !ishuman(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + return + + if(loc != user) + return + + if(idol_in_use) + to_chat(user, span_warning("У вас не получается изменить глиф дополнения. Идол дрожит от наполняющей его энергии. Вам нужно выпустить ей!")) + return + + switch(idol_addition) + if(IDOL_NOUN_LIFESPAN) + idol_addition = IDOL_NOUN_HEAT + if(IDOL_NOUN_HEAT) + idol_addition = IDOL_NOUN_MATTER + if(IDOL_NOUN_MATTER) + idol_addition = IDOL_NOUN_AIR + if(IDOL_NOUN_AIR) + idol_addition = IDOL_NOUN_EMPTY + if(IDOL_NOUN_EMPTY) + idol_addition = IDOL_NOUN_LIFESPAN + to_chat(user, span_notice("Вы изменили глиф дополнения на [idol_addition]")) + +// Spells + +/obj/item/golden_idol/update_icon_state() + if(idol_in_use) + icon_state = "blue" + return + icon_state = "red" + +/obj/item/golden_idol/proc/set_storage(new_value) + idol_storage = new_value + +// Used to get not read-only air mixture +/datum/milla_safe/golden_idol/get_air/on_run(obj/item/golden_idol/idol, turf/L) + var/datum/gas_mixture/air = get_turf_air(L) + idol.set_storage(air.remove(air.total_moles())) + +/datum/milla_safe/golden_idol/absorb_heat/on_run(obj/item/golden_idol/idol, turf/L) + var/datum/gas_mixture/air = get_turf_air(L) + if(!isnull(air)) + return + if(!air.heat_capacity()) + return + if(air.temperature() > IDOL_COOLING_TARGET) + idol.set_storage((air.temperature() - IDOL_COOLING_TARGET) * air.heat_capacity()) + air.set_temperature(IDOL_COOLING_TARGET) + +/datum/milla_safe/golden_idol/release_heat/on_run(obj/item/golden_idol/idol, turf/L) + var/datum/gas_mixture/air = get_turf_air(L) + if(!isnull(air)) + return + if(!air.heat_capacity()) + return + if(air.temperature() < IDOL_HEATING_MAX) + air.set_temperature(max(air.temperature() + (idol.idol_storage / air.heat_capacity()), IDOL_HEATING_MAX)) + idol.set_storage(null) + +/obj/item/golden_idol/afterattack(atom/target, mob/user, proximity, params) + if(!proximity) + return + if(idol_in_use && idol_verb == IDOL_VERB_DECREASE) + to_chat(user, span_warning("У вас не получается активировать идол. Он дрожит от наполняющей его энергии. Вам нужно выпустить её!")) + return + if(!idol_in_use && idol_verb == IDOL_VERB_INCREASE) + to_chat(user, span_warning("Вы нажимаете на рычажок идола, но ничего не происходит. Вы что-то делаете не так.")) + return + + // Hold items + if(idol_noun == IDOL_NOUN_MATTER && idol_addition == IDOL_NOUN_EMPTY) + if(idol_in_use) + if(isnull(idol_storage)) + return + if(!isturf(target.loc) && !isturf(target)) + return + if(!isitem(idol_storage)) + return + var/obj/item/I = idol_storage + I.forceMove(get_turf(target)) + idol_storage = null + visible_message(span_warning("[I] появляется в луче света, идущем от самоцвета в золотом идоле.")) + playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + idol_in_use = FALSE + else + if(!isitem(target)) + return + var/obj/item/I = target + I.forceMove(src) + idol_storage = I + visible_message(span_warning("[I] растворяется в луче света, идущем от самоцвета в золотом идоле.")) + playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + idol_in_use = TRUE + + // Transfer Air + else if(idol_noun == IDOL_NOUN_AIR && idol_addition == IDOL_NOUN_EMPTY) + if(idol_in_use) + var/turf/simulated/L = get_turf(target) + var/datum/gas_mixture/air = idol_storage + if(!istype(air) || !istype(L)) + return + L.blind_release_air(air) + visible_message(span_warning("Идол выплёскивает волну газа!.")) + playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + idol_in_use = FALSE + else + var/turf/simulated/L = get_turf(target) + if(!istype(L)) + return + var/datum/milla_safe/golden_idol/get_air/milla = new() + milla.invoke_async(src, L) + visible_message(span_warning("Идол поглощает газ вокруг себя!")) + playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + idol_in_use = TRUE + + // Transfering heat + else if(idol_noun == IDOL_NOUN_AIR && idol_addition == IDOL_NOUN_HEAT) + if(idol_in_use) + var/turf/simulated/L = get_turf(target) + var/datum/gas_mixture/air = idol_storage + if(!istype(air) || !istype(L)) + return + var/datum/milla_safe/golden_idol/release_heat/milla = new() + milla.invoke_async(src, L) + visible_message(span_warning("Идол нагревает газ вокруг себя!.")) + playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + idol_in_use = FALSE + else + var/turf/simulated/L = get_turf(target) + if(!istype(L)) + return + var/datum/milla_safe/golden_idol/absorb_heat/milla = new() + milla.invoke_async(src, L) + visible_message(span_warning("Идол охлаждает газ вокруг себя!")) + playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + idol_in_use = TRUE + else + to_chat(user, span_warning("Вы нажимаете на рычажок идола, но ничего не происходит. Вы что-то делаете не так.")) + update_icon_state() + + + +#undef IDOL_NOUN_LIFESPAN +#undef IDOL_NOUN_HEAT +#undef IDOL_NOUN_MATTER +#undef IDOL_NOUN_AIR +#undef IDOL_NOUN_EMPTY + +#undef IDOL_VERB_DECREASE +#undef IDOL_VERB_INCREASE + +#undef IDOL_COOLING_TARGET +#undef IDOL_HEATING_MAX diff --git a/modular_ss220/objects/icons/golden_idol.dmi b/modular_ss220/objects/icons/golden_idol.dmi new file mode 100644 index 000000000000..1fafd8b7eea8 Binary files /dev/null and b/modular_ss220/objects/icons/golden_idol.dmi differ