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

[PRIME] The Case of the Golden Idol #1421

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions modular_ss220/objects/_objects.dme
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,4 @@
#include "code/components.dm"
#include "code/airlock_painter.dm"
#include "code/animalhide.dm"
#include "code/golden_idol.dm"
212 changes: 212 additions & 0 deletions modular_ss220/objects/code/golden_idol.dm
Original file line number Diff line number Diff line change
@@ -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
Binary file added modular_ss220/objects/icons/golden_idol.dmi
Binary file not shown.
Loading