Files
Bubberstation/code/modules/religion/rites.dm
MrMelbert 328326c426 Fix warning on master (#83014)
## Changelog

🆑 Melbert
fix: New machine god blessings now actually works probably
/🆑
2024-05-03 02:02:44 +00:00

481 lines
19 KiB
Plaintext

/datum/religion_rites
/// name of the religious rite
var/name = "religious rite"
/// Description of the religious rite
var/desc = "immm gonna rooon"
/// length it takes to complete the ritual
var/ritual_length = (10 SECONDS) //total length it'll take
/// list of invocations said (strings) throughout the rite
var/list/ritual_invocations //strings that are by default said evenly throughout the rite
/// message when you invoke
var/invoke_msg
var/favor_cost = 0
/// does the altar auto-delete the rite
var/auto_delete = TRUE
/datum/religion_rites/New()
. = ..()
if(!GLOB?.religious_sect)
return
LAZYADD(GLOB.religious_sect.active_rites, src)
/datum/religion_rites/Destroy()
if(!GLOB?.religious_sect)
return
LAZYREMOVE(GLOB.religious_sect.active_rites, src)
return ..()
/datum/religion_rites/proc/can_afford(mob/living/user)
if(GLOB.religious_sect?.favor < favor_cost)
to_chat(user, span_warning("This rite requires more favor!"))
return FALSE
return TRUE
///Called to perform the invocation of the rite, with args being the performer and the altar where it's being performed. Maybe you want it to check for something else?
/datum/religion_rites/proc/perform_rite(mob/living/user, atom/religious_tool)
if(!can_afford(user))
return FALSE
to_chat(user, span_notice("You begin to perform the rite of [name]..."))
if(!ritual_invocations)
if(do_after(user, ritual_length))
return TRUE
return FALSE
var/first_invoke = TRUE
for(var/i in ritual_invocations)
if(first_invoke) //instant invoke
user.say(i)
first_invoke = FALSE
continue
if(!length(ritual_invocations)) //we divide so we gotta protect
return FALSE
if(!do_after(user, ritual_length/length(ritual_invocations)))
return FALSE
user.say(i)
if(!do_after(user, ritual_length/length(ritual_invocations))) //because we start at 0 and not the first fraction in invocations, we still have another fraction of ritual_length to complete
return FALSE
if(invoke_msg)
user.say(invoke_msg)
return TRUE
///Does the thing if the rite was successfully performed. return value denotes that the effect successfully (IE a harm rite does harm)
/datum/religion_rites/proc/invoke_effect(mob/living/user, atom/religious_tool)
SHOULD_CALL_PARENT(TRUE)
GLOB.religious_sect.on_riteuse(user,religious_tool)
return TRUE
/**** Mechanical God ****/
/datum/religion_rites/synthconversion
name = "Synthetic Conversion"
desc = "Convert a human-esque individual into a (superior) Android. Buckle a human to convert them, otherwise it will convert you."
ritual_length = 30 SECONDS
ritual_invocations = list("By the inner workings of our god ...",
"... We call upon you, in the face of adversity ...",
"... to complete us, removing that which is undesirable ...")
invoke_msg = "... Arise, our champion! Become that which your soul craves, live in the world as your true form!!"
favor_cost = 1000
/datum/religion_rites/synthconversion/perform_rite(mob/living/user, atom/religious_tool)
if(!ismovable(religious_tool))
to_chat(user, span_warning("This rite requires a religious device that individuals can be buckled to."))
return FALSE
var/atom/movable/movable_reltool = religious_tool
if(!movable_reltool)
return FALSE
if(LAZYLEN(movable_reltool.buckled_mobs))
to_chat(user, span_warning("You're going to convert the one buckled on [movable_reltool]."))
else
if(!movable_reltool.can_buckle) //yes, if you have somehow managed to have someone buckled to something that now cannot buckle, we will still let you perform the rite!
to_chat(user, span_warning("This rite requires a religious device that individuals can be buckled to."))
return FALSE
if(isandroid(user))
to_chat(user, span_warning("You've already converted yourself. To convert others, they must be buckled to [movable_reltool]."))
return FALSE
to_chat(user, span_warning("You're going to convert yourself with this ritual."))
return ..()
/datum/religion_rites/synthconversion/invoke_effect(mob/living/user, atom/religious_tool)
..()
if(!ismovable(religious_tool))
CRASH("[name]'s perform_rite had a movable atom that has somehow turned into a non-movable!")
var/atom/movable/movable_reltool = religious_tool
var/mob/living/carbon/human/rite_target
if(!movable_reltool?.buckled_mobs?.len)
rite_target = user
else
for(var/buckled in movable_reltool.buckled_mobs)
if(ishuman(buckled))
rite_target = buckled
break
if(!rite_target)
return FALSE
rite_target.set_species(/datum/species/android)
rite_target.visible_message(span_notice("[rite_target] has been converted by the rite of [name]!"))
return TRUE
/datum/religion_rites/machine_blessing
name = "Receive Blessing"
desc = "Receive a blessing from the machine god to further your ascension."
ritual_length = 5 SECONDS
ritual_invocations =list( "Let your will power our forges.",
"...Help us in our great conquest!")
invoke_msg = "The end of flesh is near!"
favor_cost = 2000
/datum/religion_rites/machine_blessing/invoke_effect(mob/living/user, atom/movable/religious_tool)
..()
var/altar_turf = get_turf(religious_tool)
var/blessing = pick_weight_recursive(
list(
// Arms
list(
/obj/item/organ/internal/cyberimp/arm/combat = 1,
/obj/item/organ/internal/cyberimp/arm/surgery = 1000000,
/obj/item/organ/internal/cyberimp/arm/toolset = 1500000,
) = 15,
// Eyes
list(
/obj/item/organ/internal/cyberimp/eyes/hud/diagnostic = 1,
/obj/item/organ/internal/cyberimp/eyes/hud/medical = 1,
/obj/item/organ/internal/eyes/robotic/glow = 1,
/obj/item/organ/internal/eyes/robotic/shield = 2,
) = 15,
// Chest
list(
/obj/item/organ/internal/cyberimp/chest/reviver = 1,
/obj/item/organ/internal/cyberimp/chest/thrusters = 2,
) = 9,
// Brain / Head
list(
/obj/item/organ/internal/cyberimp/brain/anti_drop = 100,
/obj/item/organ/internal/cyberimp/brain/anti_stun = 10,
) = 10,
// Misc
list(
/obj/item/organ/internal/cyberimp/mouth/breathing_tube = 1,
) = 5,
)
)
new blessing(altar_turf)
return TRUE
/*********Greedy God**********/
///all greed rites cost money instead
/datum/religion_rites/greed
ritual_length = 5 SECONDS
invoke_msg = "Sorry I was late, I was just making a shitload of money."
var/money_cost = 0
/datum/religion_rites/greed/can_afford(mob/living/user)
var/datum/bank_account/account = user.get_bank_account()
if(!account)
to_chat(user, span_warning("You need a way to pay for the rite!"))
return FALSE
if(account.account_balance < money_cost)
to_chat(user, span_warning("This rite requires more money!"))
return FALSE
return TRUE
/datum/religion_rites/greed/invoke_effect(mob/living/user, atom/movable/religious_tool)
var/datum/bank_account/account = user.get_bank_account()
if(!account || account.account_balance < money_cost)
to_chat(user, span_warning("This rite requires more money!"))
return FALSE
account.adjust_money(-money_cost, "Church Donation: Rite")
. = ..()
/datum/religion_rites/greed/vendatray
name = "Purchase Vend-a-tray"
desc = "Summons a Vend-a-tray. You can use it to sell items!"
invoke_msg = "I need a vend-a-tray to make some more money!"
money_cost = 300
/datum/religion_rites/greed/vendatray/invoke_effect(mob/living/user, atom/movable/religious_tool)
..()
var/altar_turf = get_turf(religious_tool)
new /obj/structure/displaycase/forsale(altar_turf)
playsound(get_turf(religious_tool), 'sound/effects/cashregister.ogg', 60, TRUE)
return TRUE
/datum/religion_rites/greed/custom_vending
name = "Purchase Personal Vending Machine"
desc = "Summons a custom vending machine. You can use it to sell MANY items!"
invoke_msg = "If I get a custom vending machine for my products, I can be RICH!"
money_cost = 1000 //quite a step up from vendatray
/datum/religion_rites/greed/custom_vending/invoke_effect(mob/living/user, atom/movable/religious_tool)
..()
var/altar_turf = get_turf(religious_tool)
new /obj/machinery/vending/custom/greed(altar_turf)
playsound(get_turf(religious_tool), 'sound/effects/cashregister.ogg', 60, TRUE)
return TRUE
/*********Maintenance God**********/
/datum/religion_rites/maint_adaptation
name = "Maintenance Adaptation"
desc = "Begin your metamorphasis into a being more fit for Maintenance."
ritual_length = 10 SECONDS
ritual_invocations = list("I abandon the world ...",
"... to become one with the deep.",
"My form will become twisted ...")
invoke_msg = "... but my smile I will keep!"
favor_cost = 150 //150u of organic slurry
/datum/religion_rites/maint_adaptation/perform_rite(mob/living/carbon/human/user, atom/religious_tool)
if(!ishuman(user))
return FALSE
//uses HAS_TRAIT_FROM because junkies are also hopelessly addicted
if(HAS_TRAIT_FROM(user, TRAIT_HOPELESSLY_ADDICTED, "maint_adaptation"))
to_chat(user, span_warning("You've already adapted.</b>"))
return FALSE
return ..()
/datum/religion_rites/maint_adaptation/invoke_effect(mob/living/user, atom/movable/religious_tool)
..()
to_chat(user, span_warning("You feel your genes rattled and reshaped. <b>You're becoming something new.</b>"))
user.emote("laugh")
ADD_TRAIT(user, TRAIT_HOPELESSLY_ADDICTED, "maint_adaptation")
//addiction sends some nasty mood effects but we want the maint adaption to be enjoyed like a fine wine
user.add_mood_event("maint_adaptation", /datum/mood_event/maintenance_adaptation)
if(iscarbon(user))
var/mob/living/carbon/vomitorium = user
vomitorium.vomit(VOMIT_CATEGORY_DEFAULT)
var/datum/dna/dna = vomitorium.has_dna()
dna?.add_mutation(/datum/mutation/human/stimmed) //some fluff mutations
dna?.add_mutation(/datum/mutation/human/strong)
user.mind.add_addiction_points(/datum/addiction/maintenance_drugs, 1000)//ensure addiction
/datum/religion_rites/adapted_eyes
name = "Adapted Eyes"
desc = "Only available after maintenance adaptation. Your eyes will adapt as well, becoming useless in the light."
ritual_length = 10 SECONDS
invoke_msg = "I no longer want to see the light."
favor_cost = 300 //300u of organic slurry, i'd consider this a reward of the sect
/datum/religion_rites/adapted_eyes/perform_rite(mob/living/carbon/human/user, atom/religious_tool)
if(!ishuman(user))
return FALSE
if(!HAS_TRAIT_FROM(user, TRAIT_HOPELESSLY_ADDICTED, "maint_adaptation"))
to_chat(user, span_warning("You need to adapt to maintenance first."))
return FALSE
var/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/adapted = user.get_organ_slot(ORGAN_SLOT_EYES)
if(adapted && istype(adapted))
to_chat(user, span_warning("Your eyes are already adapted!"))
return FALSE
return ..()
/datum/religion_rites/adapted_eyes/invoke_effect(mob/living/carbon/human/user, atom/movable/religious_tool)
..()
var/obj/item/organ/internal/eyes/oldeyes = user.get_organ_slot(ORGAN_SLOT_EYES)
to_chat(user, span_warning("You feel your eyes adapt to the darkness!"))
if(oldeyes)
oldeyes.Remove(user, special = TRUE)
qdel(oldeyes)//eh
var/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/neweyes = new
neweyes.Insert(user, special = TRUE)
/datum/religion_rites/adapted_food
name = "Moldify"
desc = "Once adapted to the Maintenance, you will not be able to eat regular food. This should help."
ritual_length = 5 SECONDS
invoke_msg = "Moldify!"
favor_cost = 5 //5u of organic slurry
///the food that will be molded, only one per rite
var/obj/item/food/mold_target
/datum/religion_rites/adapted_food/perform_rite(mob/living/user, atom/religious_tool)
for(var/obj/item/food/could_mold in get_turf(religious_tool))
if(istype(could_mold, /obj/item/food/badrecipe/moldy))
continue
mold_target = could_mold //moldify this o great one
return ..()
to_chat(user, span_warning("You need to place food on [religious_tool] to do this!"))
return FALSE
/datum/religion_rites/adapted_food/invoke_effect(mob/living/user, atom/movable/religious_tool)
..()
var/obj/item/food/moldify = mold_target
mold_target = null
if(QDELETED(moldify) || !(get_turf(religious_tool) == moldify.loc)) //check if the same food is still there
to_chat(user, span_warning("Your target left the altar!"))
return FALSE
to_chat(user, span_warning("[moldify] becomes rancid!"))
user.emote("laugh")
new /obj/item/food/badrecipe/moldy(get_turf(religious_tool))
qdel(moldify)
return TRUE
/datum/religion_rites/ritual_totem
name = "Create Ritual Totem"
desc = "Creates a Ritual Totem, a portable tool for performing rites on the go. Requires wood. Can only be picked up by the holy."
favor_cost = 100
invoke_msg = "Padala!!"
///the food that will be molded, only one per rite
var/obj/item/stack/sheet/mineral/wood/converted
/datum/religion_rites/ritual_totem/perform_rite(mob/living/user, atom/religious_tool)
for(var/obj/item/stack/sheet/mineral/wood/could_totem in get_turf(religious_tool))
converted = could_totem //totemify this o great one
return ..()
to_chat(user, span_warning("You need at least 1 wood to do this!"))
return FALSE
/datum/religion_rites/ritual_totem/invoke_effect(mob/living/user, atom/movable/religious_tool)
..()
var/altar_turf = get_turf(religious_tool)
var/obj/item/stack/sheet/mineral/wood/padala = converted
converted = null
if(QDELETED(padala) || !(get_turf(religious_tool) == padala.loc)) //check if the same food is still there
to_chat(user, span_warning("Your target left the altar!"))
return FALSE
to_chat(user, span_warning("[padala] reshapes into a totem!"))
if(!padala.use(1))//use one wood
return
user.emote("laugh")
new /obj/item/ritual_totem(altar_turf)
return TRUE
///sparring god rites
/datum/religion_rites/sparring_contract
name = "Summon Sparring Contract"
desc = "Turns some paper into a sparring contract."
invoke_msg = "I will train in the name of my god."
///paper to turn into a sparring contract
var/obj/item/paper/contract_target
/datum/religion_rites/sparring_contract/perform_rite(mob/living/user, atom/religious_tool)
for(var/obj/item/paper/could_contract in get_turf(religious_tool))
if(could_contract.get_total_length()) //blank paper pls
continue
contract_target = could_contract
return ..()
to_chat(user, span_warning("You need to place blank paper on [religious_tool] to do this!"))
return FALSE
/datum/religion_rites/sparring_contract/invoke_effect(mob/living/user, atom/movable/religious_tool)
..()
var/obj/item/paper/blank_paper = contract_target
var/turf/tool_turf = get_turf(religious_tool)
contract_target = null
if(QDELETED(blank_paper) || !(tool_turf == blank_paper.loc)) //check if the same paper is still there
to_chat(user, span_warning("Your target left the altar!"))
return FALSE
blank_paper.visible_message(span_notice("words magically form on [blank_paper]!"))
playsound(tool_turf, 'sound/effects/pray.ogg', 50, TRUE)
var/datum/religion_sect/spar/sect = GLOB.religious_sect
if(sect.existing_contract)
sect.existing_contract.visible_message(span_warning("[src] fizzles into nothing!"))
qdel(sect.existing_contract)
sect.existing_contract = new /obj/item/sparring_contract(tool_turf)
qdel(blank_paper)
return TRUE
/datum/religion_rites/declare_arena
name = "Declare Arena"
desc = "Declare a new area as fit for sparring. You'll be able to select it in contracts."
ritual_length = 6 SECONDS
ritual_invocations = list("I seek new horizons ...")
invoke_msg = "... may my climb be steep."
favor_cost = 1 //only costs one holy battle for a new area
var/area/area_instance
/datum/religion_rites/declare_arena/perform_rite(mob/living/user, atom/religious_tool)
var/list/filtered = list()
for(var/area/unfiltered_area as anything in get_sorted_areas())
if(istype(unfiltered_area, /area/centcom)) //youuu dont need thaaat
continue
if(!(unfiltered_area.area_flags & HIDDEN_AREA))
filtered += unfiltered_area
area_instance = tgui_input_list(user, "Choose an area to mark as an arena!", "Arena Declaration", filtered)
if(isnull(area_instance))
return FALSE
. = ..()
/datum/religion_rites/declare_arena/invoke_effect(mob/living/user, atom/movable/religious_tool)
. = ..()
var/datum/religion_sect/spar/sect = GLOB.religious_sect
sect.arenas[area_instance.name] = area_instance.type
to_chat(user, span_warning("[area_instance] is a now an option to select on sparring contracts."))
/datum/religion_rites/ceremonial_weapon
name = "Forge Ceremonial Gear"
desc = "Turn some material into ceremonial gear. Ceremonial blades are weak outside of sparring, and are quite heavy to lug around."
ritual_length = 10 SECONDS
invoke_msg = "Weapons in your name! Battles with your blood!"
favor_cost = 0
///the material that will be attempted to be forged into a weapon
var/obj/item/stack/sheet/converted
/datum/religion_rites/ceremonial_weapon/perform_rite(mob/living/user, atom/religious_tool)
for(var/obj/item/stack/sheet/could_blade in get_turf(religious_tool))
if(!(GET_MATERIAL_REF(could_blade.material_type) in SSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL]))
continue
if(could_blade.amount < 5)
continue
converted = could_blade
return ..()
to_chat(user, span_warning("You need at least 5 sheets of a material that can be made into items!"))
return FALSE
/datum/religion_rites/ceremonial_weapon/invoke_effect(mob/living/user, atom/movable/religious_tool)
..()
var/altar_turf = get_turf(religious_tool)
var/obj/item/stack/sheet/used_for_blade = converted
converted = null
if(QDELETED(used_for_blade) || !(get_turf(religious_tool) == used_for_blade.loc) || used_for_blade.amount < 5) //check if the same food is still there
to_chat(user, span_warning("Your target left the altar!"))
return FALSE
var/material_used = used_for_blade.material_type
to_chat(user, span_warning("[used_for_blade] reshapes into a ceremonial blade!"))
if(!used_for_blade.use(5))//use 5 of the material
return
var/obj/item/ceremonial_blade/blade = new(altar_turf)
blade.set_custom_materials(list(GET_MATERIAL_REF(material_used) = SHEET_MATERIAL_AMOUNT * 5))
return TRUE
/datum/religion_rites/unbreakable
name = "Become Unbreakable"
desc = "Your training has made you unbreakable. In times of crisis, you will attempt to keep fighting on."
ritual_length = 10 SECONDS
invoke_msg = "My will must be unbreakable. Grant me this boon!"
favor_cost = 4 //4 duels won
/datum/religion_rites/unbreakable/perform_rite(mob/living/carbon/human/user, atom/religious_tool)
if(!ishuman(user))
return FALSE
if(HAS_TRAIT_FROM(user, TRAIT_UNBREAKABLE, INNATE_TRAIT))
to_chat(user, span_warning("Your spirit is already unbreakable!"))
return FALSE
return ..()
/datum/religion_rites/unbreakable/invoke_effect(mob/living/carbon/human/user, atom/movable/religious_tool)
..()
to_chat(user, span_nicegreen("You feel [GLOB.deity]'s will to keep fighting pouring into you!"))
user.AddComponent(/datum/component/unbreakable)
/datum/religion_rites/tenacious
name = "Become Tenacious"
desc = "Your training has made you tenacious. In times of crisis, you will be able to crawl faster."
ritual_length = 10 SECONDS
invoke_msg = "Grant me your tenacity! I have proven myself!"
favor_cost = 3 //3 duels won
/datum/religion_rites/tenacious/perform_rite(mob/living/carbon/human/user, atom/religious_tool)
if(!ishuman(user))
return FALSE
if(HAS_TRAIT_FROM(user, TRAIT_TENACIOUS, INNATE_TRAIT))
to_chat(user, span_warning("Your spirit is already tenacious!"))
return FALSE
return ..()
/datum/religion_rites/tenacious/invoke_effect(mob/living/carbon/human/user, atom/movable/religious_tool)
..()
to_chat(user, span_nicegreen("You feel [GLOB.deity]'s tenacity pouring into you!"))
user.AddElement(/datum/element/tenacious)