Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
Merged
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 code/__DEFINES/say.dm
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@
#define SPAN_COMMAND "command_headset"
#define SPAN_CLOWN "clown"
#define SPAN_SINGING "singing"
#define SPAN_CULTLARGE "cultlarge"

//bitflag #defines for return value of the radio() proc.
#define ITALICS (1<<0)
Expand Down
6 changes: 6 additions & 0 deletions code/game/objects/items/kitchen.dm
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Fork
* Kitchen knives
* Ritual Knife
* Holy Ritual Knife
* Bloodletter
* Butcher's cleaver
* Combat Knife
Expand Down Expand Up @@ -123,6 +124,11 @@
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
w_class = WEIGHT_CLASS_NORMAL

/obj/item/kitchen/knife/ritual/holy
name = "ruinous knife"
desc = "The runes inscribed on the knife radiate a strange power."
force = 12

/obj/item/kitchen/knife/bloodletter
name = "bloodletter"
desc = "An occult looking dagger that is cold to the touch. Somehow, the flawless orb on the pommel is made entirely of liquid blood."
Expand Down
22 changes: 22 additions & 0 deletions code/game/objects/items/stacks/sheets/sheet_types.dm
Original file line number Diff line number Diff line change
Expand Up @@ -759,3 +759,25 @@ GLOBAL_LIST_INIT(cheese_recipes, list (
/obj/item/stack/sheet/cheese/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.cheese_recipes
. = ..()

/obj/item/stack/sheet/ruinous_metal
name = "ruinous metal"
desc = "Metal with a strange aura surrounding it, along with various inscriptions etched onto the surface.."
icon_state = "sheet-runed"
item_state = "sheet-rune"
icon = 'icons/obj/stack_objects.dmi'
singular_name = "ruinous metal sheet"
sheettype = null
max_amount = 20
novariants = TRUE
grind_results = list(/datum/reagent/iron = 5, /datum/reagent/blood = 15)
merge_type = /obj/item/stack/sheet/ruinous_metal

GLOBAL_LIST_INIT(ruinous_metal_recipes, list (
new/datum/stack_recipe("holy fountain", /obj/structure/holyfountain, 3, one_per_turf = 1, on_floor = 1, time = 40), \
new/datum/stack_recipe("altar of the gods", /obj/structure/altar_of_gods, 6, one_per_turf = 1, on_floor = 1, time = 40 )))

/obj/item/stack/sheet/ruinous_metal/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.ruinous_metal_recipes
. = ..()

17 changes: 17 additions & 0 deletions code/modules/food_and_drinks/food/snacks/meat.dm
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,23 @@
filling_color = "#B22222"
tastes = list("beef" = 1, "cod fish" = 1)

/obj/item/reagent_containers/food/snacks/meat/slab/blessed
name = "blessed meat"
icon_state = "shadowmeat"
desc = "It is covered in a strange darkness."
bitesize = 2
list_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3) //pretty healthy, chap could start a cult diner.
slice_path = null //its perfect as it is, why would you want to defile it
cooked_type = null
filling_color = "#202020"
tastes = list("holyness" = 1, "meat" = 1, "dread" = 1)
foodtype = MEAT | RAW | GROSS //they just don't understand how tasty it really is

/obj/item/reagent_containers/food/snacks/meat/slab/blessed/weak
name = "lesser blessed meat"
icon_state = "shadowmeat"
desc = "It is covered in a strange darkness. This slab's magical properties appear to be drastically weakened due to the synthetic nature of the meat."

////////////////////////////////////// MEAT STEAKS ///////////////////////////////////////////////////////////


Expand Down
40 changes: 40 additions & 0 deletions code/modules/mob/living/carbon/human/species_types/golems.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1344,3 +1344,43 @@
remove_ranged_ability("Something nullifies any teleports in the local area...")
return FALSE
return TRUE

/datum/species/golem/ruinous //slightly weaker and faster,gets telepathy,speaks louder, and their text is cult colored
name = "Ruinous Golem"
id = "ruinous golem"
//limbs_id = "ruingolem" //i cant get it to work, if someone else finds out what the problem is later on, be my guest, and please fix it.
//sexes = FALSE
armor = 40 //down from 55
//species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) //no mutcolors or eyesprites
speedmod = 1.5 //inbetween gold golem and iron
meat = /obj/item/reagent_containers/food/snacks/meat/slab/blessed
fixed_mut_color = "333"
info_text = "As an <span class='danger'>Ruinous Golem</span>, you are made of an ancient powerful metal. While not particularly tough, you have a connection with the old gods that grants you a selection of abilities."
prefix = "Ruinous"
special_names = list("One", "Elder", "Watcher", "Walker") //ominous
var/obj/effect/proc_holder/spell/targeted/telepathy/eldritch/ruinoustelepathy
var/obj/effect/proc_holder/spell/targeted/touch/flagellate/flagellate

/datum/species/golem/ruinous/on_species_loss(mob/living/carbon/C)
..()
UnregisterSignal(C, COMSIG_MOB_SAY)
REMOVE_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
if(ruinoustelepathy)
C.RemoveSpell(ruinoustelepathy)
if(flagellate)
C.RemoveSpell(flagellate)

/datum/species/golem/ruinous/on_species_gain(mob/living/carbon/C, datum/species/old_species)
..()
RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech)
ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
ruinoustelepathy = new
ruinoustelepathy.charge_counter = 0
C.AddSpell(ruinoustelepathy)
flagellate = new
flagellate.charge_counter = 0
C.AddSpell(flagellate)

/datum/species/golem/ruinous/proc/handle_speech(datum/source, list/speech_args)
speech_args[SPEECH_SPANS] |= SPAN_CULTLARGE
playsound(source, 'sound/effects/curseattack.ogg', 100, 1, 1)
28 changes: 28 additions & 0 deletions code/modules/religion/religion_sects.dm
Original file line number Diff line number Diff line change
Expand Up @@ -291,3 +291,31 @@
to_chat(L, "<span class='notice'>[GLOB.deity] happily accepts your offering, and brings the crop to a new home.</span>")
qdel(I)
return TRUE

/**** Gathering of the Old Ones sect, bless flesh and sacrifice it to gain favor for fancy runes. ****/
// Blessed meat slabs are the currency of this sect, they use it in order to make fancy structures and runes.

/datum/religion_sect/oldgods
name = "Gathering of the Old Ones"
desc = "A sect dedicated to the Old Gods."
convert_opener = "The great gods of old welcome you to their gathering, acolyte.<br>Bless slabs of meat on your altar and then sacrifice it in the name of the Old Gods."
alignment = ALIGNMENT_EVIL //kind of evil?
max_favor = 3000
desired_items = list(/obj/item/reagent_containers/food/snacks/meat/slab/blessed)
rites_list = list(/datum/religion_rites/meatbless, /datum/religion_rites/ruinousknife, /datum/religion_rites/ruinousmetal, /datum/religion_rites/bodybless)
altar_icon_state = "convertaltar-black"

//old ones sect bibles don't heal or do anything special apart from the standard holy water blessings
/datum/religion_sect/oldgods/sect_bless(mob/living/blessed, mob/living/user)
return TRUE

/datum/religion_sect/oldgods/on_sacrifice(obj/item/reagent_containers/food/snacks/meat/slab/blessed/offering, mob/living/user)
if(!istype(offering))
return
to_chat(user, "<span class='notice'> An image of [GLOB.deity] flashes in your mind. They look pleased.</span>")
if(istype(offering, /obj/item/reagent_containers/food/snacks/meat/slab/blessed/weak))
adjust_favor(10, user)
else
adjust_favor(75, user)
qdel(offering)
return TRUE
35 changes: 34 additions & 1 deletion code/modules/religion/religion_structures.dm
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,37 @@
if(sect_to_altar.altar_icon)
icon = sect_to_altar.altar_icon
if(sect_to_altar.altar_icon_state)
icon_state = sect_to_altar.altar_icon_state
icon_state = sect_to_altar.altar_icon_state

//****Old Gods sect structures****//

/obj/structure/holyfountain //reskinned healing fountain, but different enough i guess
name = "blessed fountain"
desc = "A dark fountain filled with some kind of strange liquid."
icon = 'icons/obj/hand_of_god_structures.dmi'
icon_state = "fountain-black"
anchored = TRUE
density = TRUE
var/time_between_uses = 1800
var/last_process = 0

/obj/structure/holyfountain/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(last_process + time_between_uses > world.time)
to_chat(user, "<span class='notice'>The fountain appears to be empty.</span>")
return
last_process = world.time
to_chat(user, "<span class='notice'>The liquid feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards.</span>")
user.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood,10) //Hurts your brain and makes you go insane
user.reagents.add_reagent(/datum/reagent/toxin/mindbreaker,10) //However, it gives rather potent healing.
update_icon()
addtimer(CALLBACK(src, .proc/update_icon), time_between_uses)


/obj/structure/holyfountain/update_icon()
if(last_process + time_between_uses > world.time)
icon_state = "fountain"
else
icon_state = "fountain-black"
105 changes: 105 additions & 0 deletions code/modules/religion/rites.dm
Original file line number Diff line number Diff line change
Expand Up @@ -378,3 +378,108 @@
var/altar_turf = get_turf(religious_tool)
new /obj/effect/mob_spawn/photogeist(altar_turf)
return TRUE

/*********Old Ones**********/

/datum/religion_rites/ruinousknife
name = "Ruinous Knife"
desc = "Creates a knife that is mostly cosmetic, but is also a weapon."
ritual_length = 5 SECONDS
invoke_msg = "please, old ones, lend us a tool of holy creation."
favor_cost = 50

/datum/religion_rites/ruinousknife/invoke_effect(mob/living/user, atom/movable/religious_tool)
var/altar_turf = get_turf(religious_tool)
new /obj/item/kitchen/knife/ritual/holy(altar_turf)
playsound(altar_turf, 'sound/magic/enter_blood.ogg', 50, TRUE)
return TRUE

/datum/religion_rites/meatbless
name = "Meat Blessing"
desc = "Bless a piece of meat. Preps it for sacrifice"
ritual_length = 2 SECONDS
//no invoke message, this does a custom one down below in invoke_effect
///the piece of meat that will be blessed, only one per rite
var/obj/item/reagent_containers/food/snacks/meat/slab/chosen_meat

/datum/religion_rites/meatbless/perform_rite(mob/living/user, atom/religious_tool)
for(var/obj/item/reagent_containers/food/snacks/meat/slab/offering in get_turf(religious_tool))
if(istype(offering, /obj/item/reagent_containers/food/snacks/meat/slab/blessed))
continue //we ignore anything that is already blessed
chosen_meat = offering //the meat has been chosen by our lord and savior
return ..()
return FALSE

/datum/religion_rites/meatbless/invoke_effect(mob/living/user, atom/religious_tool)
if(!QDELETED(chosen_meat) && get_turf(religious_tool) == chosen_meat.loc) //check if the same meat is still there
var/altar_turf = get_turf(religious_tool)
playsound(get_turf(religious_tool), 'sound/magic/enter_blood.ogg', 50, TRUE)
if(istype(chosen_meat, /obj/item/reagent_containers/food/snacks/meat/slab/synthmeat))
new /obj/item/reagent_containers/food/snacks/meat/slab/blessed/weak(altar_turf)
else
new /obj/item/reagent_containers/food/snacks/meat/slab/blessed(altar_turf)
qdel(chosen_meat)
chosen_meat = null //our lord and savior no longer cares about this meat
var/mb_message = pick("old ones, I bless this meat for you!", "old ones, I bless this flesh in your name", "old ones, I empower this flesh in your name.")
user.say(mb_message, forced = "ritual") //chooses one of three invoke messages to say in order to avoid auto mute and add variety.
return TRUE
chosen_meat = null
to_chat(user, "<span class='warning'>The meat that was chosen for the rite is no longer on the altar!</span>")
return FALSE

/datum/religion_rites/ruinousmetal
name = "Ruinous Metal"
desc = "Creates a piece of metal that can create various holy structures."
ritual_length = 5 SECONDS
invoke_msg = "please, old ones, lend us some of your holy material."
favor_cost = 150

/datum/religion_rites/ruinousmetal/invoke_effect(mob/living/user, atom/movable/religious_tool)
var/altar_turf = get_turf(religious_tool)
new /obj/item/stack/sheet/ruinous_metal(altar_turf)
playsound(altar_turf, 'sound/magic/enter_blood.ogg', 50, TRUE)
return TRUE

/datum/religion_rites/bodybless
name = "Body Blessing"
desc = "Convert a human-esque individual into a being of ruinous metal."
ritual_length = 1 MINUTES
ritual_invocations = list(
"Let us call upon the blessings of the old gods...",
"... Show them one that is worthy of greatness...",
"... And allow them to bless this one with a great power..."
)
invoke_msg = "... Become one with the blessings of our gods, arise great one!!"
favor_cost = 2000 // 27 slabs of blessed meat/200 blessed synthetic meat, more expensive than working with xenobio.

/datum/religion_rites/bodybless/perform_rite(mob/living/user, atom/religious_tool)
if(!ismovable(religious_tool))
to_chat(user, "<span class='warning'>This rite requires a religious device that individuals can be buckled to.</span>")
return FALSE
var/atom/movable/movable_reltool = religious_tool
if(!movable_reltool)
return FALSE
if(!LAZYLEN(movable_reltool.buckled_mobs))
. = FALSE
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 class='warning'>This rite requires a religious device that individuals can be buckled to.</span>")
return
to_chat(user, "<span class='warning'>This rite requires an individual to be buckled to [movable_reltool].</span>")
return
return ..()

/datum/religion_rites/bodybless/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
if(!movable_reltool?.buckled_mobs?.len)
return FALSE
var/mob/living/carbon/human/human2ruinous
for(var/i in movable_reltool.buckled_mobs)
if(istype(i,/mob/living/carbon/human))
human2ruinous = i
break
if(!human2ruinous)
return FALSE
human2ruinous.set_species(/datum/species/golem/ruinous)
human2ruinous.visible_message("<span class='notice'>[human2ruinous] has been converted by the rite of [name]!</span>")
3 changes: 2 additions & 1 deletion code/modules/ruins/lavaland_ruin_code.dm
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@
/obj/item/stack/sheet/cheese = /datum/species/golem/cheese,
/obj/item/stack/telecrystal = /datum/species/golem/telecrystal,
/obj/item/stack/telecrystal/five = /datum/species/golem/telecrystal,
/obj/item/stack/telecrystal/twenty = /datum/species/golem/telecrystal)
/obj/item/stack/telecrystal/twenty = /datum/species/golem/telecrystal,
/obj/item/stack/sheet/ruinous_metal = /datum/species/golem/ruinous)

if(istype(I, /obj/item/stack))
var/obj/item/stack/O = I
Expand Down
31 changes: 31 additions & 0 deletions code/modules/spells/spell_types/godhand.dm
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,34 @@
M.Stun(40)
M.petrify()
return ..()

/obj/item/melee/touch_attack/flagellate
name = "\improper flagellating touch"
desc = "I'd like to see them greytide me now."
catchphrase = "RETRIBUTION!!"
on_use_sound = 'sound/magic/wandodeath.ogg'
icon_state = "flagellation"
item_state = "hivehand"

/obj/item/melee/touch_attack/flagellate/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || target == user || !isliving(target) || !iscarbon(user)) //flagellating your own mind painfully wouldn't be THAT bad but still bad
return
if(!(user.mobility_flags & MOBILITY_USE))
to_chat(user, "<span class='warning'>You can't reach out!</span>")
return
if(!user.can_speak_vocal())
to_chat(user, "<span class='notice'>You can't get the words out!</span>")
return
var/mob/living/M = target
if(M.anti_magic_check())
to_chat(user, "<span class='warning'>The spell can't seem to affect [M]!</span>")
to_chat(M, "<span class='warning'>You feel faint energies trying to get into your head, before they suddenly vanish!</span>")
..()
return
M.adjustBruteLoss(18) //same as nullrod, but with a large cooldown, so it should be fine
M.blur_eyes(10)
M.confused = max(M.confused, 6)
M.visible_message("<span class='danger'>[M] cringes in pain as they hold their head for a second!</span>")
M.emote("scream")
to_chat(M, "<span class='warning'>You feel an explosion of pain erupt in your mind!</span>")
return ..()
13 changes: 13 additions & 0 deletions code/modules/spells/spell_types/touch_attacks.dm
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,16 @@

action_icon_state = "statue"
sound = 'sound/magic/fleshtostone.ogg'

/obj/effect/proc_holder/spell/targeted/touch/flagellate //doesn't do much, mostly cosmetic punishment tool for chaplains
name = "Flagellate"
desc = "This spell charges your hand with the power of the old gods, allowing you to flagellate heathens."
hand_path = /obj/item/melee/touch_attack/flagellate
clothes_req = FALSE

charge_max = 300 //its very weak so it doesn't need a super long cooldown. 30 second cooldown

action_icon = 'icons/mob/actions/actions_cult.dmi'
action_icon_state = "horror"
action_background_icon_state = "bg_ecult"
sound = 'sound/magic/fleshtostone.ogg'
2 changes: 1 addition & 1 deletion code/modules/spells/spell_types/voice_of_god.dm
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,4 @@
power_mod = 0.1
cooldown_mod = 0.5
spans = list("clown")
speech_sound = 'sound/spookoween/scary_horn2.ogg'
speech_sound = 'sound/spookoween/scary_horn2.ogg'
Binary file modified icons/mob/human_parts.dmi
Binary file not shown.
Binary file modified icons/obj/hand_of_god_structures.dmi
Binary file not shown.
Binary file modified icons/obj/items_and_weapons.dmi
Binary file not shown.