diff --git a/aurorastation.dme b/aurorastation.dme index 2f96924a3fe..2e12fdc9e54 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -846,6 +846,7 @@ #include "code\game\objects\items\weapons\candle.dm" #include "code\game\objects\items\weapons\cards_ids.dm" #include "code\game\objects\items\weapons\cards_ids_syndicate.dm" +#include "code\game\objects\items\weapons\chaplain_items.dm" #include "code\game\objects\items\weapons\chewables.dm" #include "code\game\objects\items\weapons\cigs_lighters.dm" #include "code\game\objects\items\weapons\cloaking_device.dm" diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 4065683b953..5ac579b76d5 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -741,7 +741,7 @@ var/list/sacrificed = list() rad = 4 go = 1 if (istype(W,/obj/item/nullrod)) - rad = 1 + rad = 2 go = 1 if(go) for(var/obj/effect/rune/R in orange(rad,src)) @@ -750,7 +750,7 @@ var/list/sacrificed = list() S=1 if(S) if(istype(W,/obj/item/nullrod)) - to_chat(user, "Arcane markings suddenly glow from underneath a thin layer of dust!") + visible_message(span("warning", "Arcane markings suddenly glow from underneath a thin layer of dust!")) return if(istype(W,/obj/effect/rune)) user.say("Nikt[pick("'","`")]o barada kla'atu!") diff --git a/code/game/objects/items/weapons/chaplain_items.dm b/code/game/objects/items/weapons/chaplain_items.dm new file mode 100644 index 00000000000..7f730b21d1d --- /dev/null +++ b/code/game/objects/items/weapons/chaplain_items.dm @@ -0,0 +1,173 @@ +// Nullrod, Aspergillum, Burial Urn + +/obj/item/nullrod + name = "null rod" + desc = "A rod of pure obsidian, its very presence disrupts and dampens the powers of paranormal phenomenae." + icon_state = "nullrod" + item_state = "nullrod" + slot_flags = SLOT_BELT + force = 15 + throw_speed = 1 + throw_range = 4 + throwforce = 10 + w_class = 2 + var/cooldown = 0 // floor tap cooldown + var/static/list/nullchoices = list("Null Rod" = /obj/item/nullrod/, "Null Staff" = /obj/item/nullrod/staff, "Null Orb" = /obj/item/nullrod/orb, "Null Athame" = /obj/item/nullrod/athame) + +/obj/item/nullrod/staff + name = "null staff" + desc = "A staff of pure obsidian, its very presence disrupts and dampens the powers of paranormal phenomenae." + icon_state = "nullstaff" + item_state = "nullstaff" + slot_flags = SLOT_BELT | SLOT_BACK + w_class = 4 + +/obj/item/nullrod/orb + name = "null sphere" + desc = "An orb of pure obsidian, its very presence disrupts and dampens the powers of paranormal phenomenae." + icon_state = "nullorb" + item_state = "nullorb" + +/obj/item/nullrod/athame + name = "null athame" + desc = "An athame of pure obsidian, its very presence disrupts and dampens the powers of paranormal phenomenae." + icon_state = "nullathame" + item_state = "nullathame" + +/obj/item/nullrod/obsidianshards + name = "obsidian shards" + desc = "A loose pile of obsidian shards, waiting to be assembled into a religious focus." + icon_state = "nullshards" + item_state = "nullshards" + +/obj/item/nullrod/verb/change(mob/user) + set name = "Reassemble Null Item" + set category = "Object" + set src in usr + + if(use_check_and_message(user, USE_FORCE_SRC_IN_USER)) + return + + var/picked = input("What form would you like your obsidian relic to take?", "Reassembling your obsidian relic") as null|anything in nullchoices + + if(use_check_and_message(user, USE_FORCE_SRC_IN_USER)) + return + if(!ispath(nullchoices[picked])) + return + + to_chat(user, span("notice", "You start reassembling your obsidian relic.")) + if(!do_after(user, 2 SECONDS)) + return + + var/obj/item/nullrod/chosenitem = nullchoices[picked] + new chosenitem(get_turf(user)) + qdel(src) + user.put_in_hands(chosenitem) + +/obj/item/nullrod/attack(mob/M as mob, mob/living/user as mob) + + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(M) + + if(LAZYLEN(user.spell_list)) + user.silence_spells(300) //30 seconds + to_chat(user, span("danger", "You've been silenced!")) + return + + if(!user.IsAdvancedToolUser()) + to_chat(user, span("danger", "You don't have the dexterity to use this!")) + return + + if((user.is_clumsy()) && prob(50)) + to_chat(user, span("danger", "The [src] slips out of your hand and you hit yourself!")) + visible_message(span("danger", "[user] fumbles with the [src] and hits themselves in the process!")) + user.take_organ_damage(10) + user.Paralyse(20) + return + + if(M.stat != DEAD && ishuman(M) && user.a_intent != I_HURT) + var/mob/living/K = M + if(cult && (K.mind in cult.current_antagonists) && prob(75)) + if(do_after(user, 15)) + K.visible_message(span("danger", "[user] waves \the [src] over \the [K]'s head, [K] looks captivated by it."), span("warning", "[user] waves the [src] over your head. You see a foreign light, asking you to follow it. Its presence burns and blinds.")) + var/choice = alert(K,"Do you want to give up your goal?","Become cleansed","Resist","Give in") + switch(choice) + if("Resist") + K.visible_message(span("warning", "The gaze in [K]'s eyes remains determined."), span("notice", "You turn away from the light, remaining true to the Geometer!")) + K.say("*scream") + K.take_overall_damage(5, 15) + admin_attack_log(user, M, "attempted to deconvert", "was unsuccessfully deconverted by", "attempted to deconvert") + if("Give in") + K.visible_message(span("notice", "[K]'s eyes become clearer, the evil gone, but not without leaving scars.")) + K.take_overall_damage(10, 20) + cult.remove_antagonist(K.mind) + admin_attack_log(user, M, "successfully deconverted", "was successfully deconverted by", "successfully deconverted") + else + user.visible_message(span("warning", "[user]'s concentration is broken!"), span("warning", "Your concentration is broken! You and your target need to stay uninterrupted for longer!")) + return + else + to_chat(user, span("danger", "The [src] appears to do nothing.")) + M.visible_message(span("danger", "\The [user] waves \the [src] over \the [M]'s head.")) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(prob(25)) + H.cure_all_traumas(cure_type = CURE_SOLITUDE) + else if(prob(20)) + H.cure_all_traumas(cure_type = CURE_CRYSTAL) + return + else if(user.a_intent != I_HURT) // to prevent the chaplain from hurting peoples accidentally + to_chat(user, span("notice", "The [src] appears to do nothing.")) + return + else + return ..() + +/obj/item/nullrod/afterattack(atom/A, mob/user as mob, proximity) + if(!proximity) + return + if (istype(A, /turf/simulated/floor) && (cooldown + 5 SECONDS < world.time)) + cooldown = world.time + user.visible_message(span("notice", "[user] loudly taps their [src.name] against the floor.")) + playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) + call(/obj/effect/rune/proc/revealrunes)(src) + return + +/obj/item/reagent_containers/spray/aspergillum + name = "aspergillum" + desc = "A ceremonial item for sprinkling holy water, or other liquids, on a subject." + icon = 'icons/obj/weapons.dmi' + icon_state = "aspergillum" + item_state = "aspergillum" + amount_per_transfer_from_this = 5 + possible_transfer_amounts = null + spray_size = 1 + volume = 10 + spray_sound = 'sound/effects/jingle.ogg' + +/obj/item/material/urn + name = "urn" + desc = "A vase used to store the ashes of the deceased." + icon = 'icons/obj/urn.dmi' + icon_state = "urn" + applies_material_colour = TRUE + w_class = ITEMSIZE_SMALL + +/obj/item/material/urn/attack(var/obj/A, var/mob/user, var/proximity) + if(!istype(A, /obj/effect/decal/cleanable/ash)) + return ..() + else if(proximity) + if(contents.len) + to_chat(user, span("warning", "\The [src] is already full!")) + return + user.visible_message("[user] scoops \the [A] into \the [src], securing the lid.", "You scoop \the [A] into \the [src], securing the lid.") + desc = "A vase used to store the ashes of the deceased. It contains some ashes." + A.forceMove(src) + +/obj/item/material/urn/attack_self(mob/user) + if(!contents.len) + to_chat(user, span("warning", "\The [src] is empty!")) + return + else + for(var/obj/effect/decal/cleanable/ash/A in contents) + A.dropInto(loc) + user.visible_message("[user] pours \the [A] out from \the [src].", "You pour \the [A] out from \the [src].") + desc = "A vase used to store the ashes of the deceased." diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index f22cd984544..6941de07938 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -1,18 +1,18 @@ /obj/item/storage/bible name = "bible" - desc = "Apply to head repeatedly." - icon_state ="bible" + desc = "A holy item, containing the written words of a religion." + icon_state = "bible" icon = 'icons/obj/library.dmi' throw_speed = 1 throw_range = 5 - w_class = 3.0 + w_class = ITEMSIZE_SMALL // POKKET - geeves var/mob/affecting = null use_sound = 'sound/bureaucracy/bookopen.ogg' drop_sound = 'sound/bureaucracy/bookclose.ogg' /obj/item/storage/bible/booze name = "bible" - desc = "To be applied to the head repeatedly." + desc = "A holy item, containing the written words of a religion." icon_state = "bible" starts_with = list( /obj/item/reagent_containers/food/drinks/bottle/small/beer = 2, @@ -20,81 +20,100 @@ ) /obj/item/storage/bible/afterattack(atom/A, mob/user as mob, proximity) - if(!proximity) return + if(!proximity) + return if(user.mind && (user.mind.assigned_role == "Chaplain")) if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder - to_chat(user, "You bless [A].") - var/water2holy = A.reagents.get_reagent_amount("water") - A.reagents.del_reagent("water") - A.reagents.add_reagent("holywater",water2holy) + if(A.reagents.get_reagent_amount("water") > 60) + to_chat(user, span("notice", "There's too much water for you to bless at once!")) + else + to_chat(user, span("notice", "You bless the water in [A], turning it into holy water.")) + var/water2holy = A.reagents.get_reagent_amount("water") + A.reagents.del_reagent("water") + A.reagents.add_reagent("holywater", water2holy) /obj/item/storage/bible/attackby(obj/item/W as obj, mob/user as mob) - if (src.use_sound) + if(src.use_sound) playsound(src.loc, src.use_sound, 50, 1, -5) ..() /obj/item/storage/bible/proc/Set_Religion(mob/user) if(use_check(user)) return - if(!ishuman(user)) return var/religion_name = "Christianity" var/new_religion = sanitize(input(user, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name), MAX_NAME_LEN) - if (!new_religion) + if(!new_religion) new_religion = religion_name var/book_name = sanitize(input(user, "Would you like the change your bible name? Default is holy bible.", "Book name change", name), MAX_NAME_LEN) - if (book_name) + if(book_name) name = book_name SSticker.Bible_name = book_name - var/new_book_style = input(user,"Which bible style would you like?") in list("Bible", "Quran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Atheist", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon") + var/new_book_style = input(user,"Which bible style would you like?") in list("Generic", "Bible", "White Bible", "Melted Bible", "Quran", "Torah", "Holy Light", "Tome", "Scroll", "The King in Yellow", "Ithaqua", "Trinary", "Stars", "Scrapbook", "Atheist", "Necronomicon") switch(new_book_style) - if("Quran") - icon_state = "quran" - item_state = "quran" - if("Scrapbook") - icon_state = "scrapbook" - item_state = "scrapbook" - if("Creeper") - icon_state = "creeper" - item_state = "creeper" + if("Bible") + icon_state = "bible" + item_state = "bible" + new /obj/item/clothing/accessory/rosary(src) if("White Bible") icon_state = "white" item_state = "white" + new /obj/item/clothing/accessory/rosary(src) + if("Melted Bible") + icon_state = "melted" + item_state = "melted" + new /obj/item/clothing/accessory/rosary(src) + if("Quran") + icon_state = "quran" + item_state = "quran" + if("Torah") + icon_state = "torah" + item_state = "torah" + if("Kojiki") + icon_state = "kojiki" + item_state = "kojiki" if("Holy Light") icon_state = "holylight" item_state = "holylight" - if("Atheist") - icon_state = "atheist" - item_state = "atheist" if("Tome") icon_state = "tome" item_state = "tome" + if("Scroll") + icon_state = "scroll" + item_state = "scroll" if("The King in Yellow") icon_state = "kingyellow" item_state = "kingyellow" if("Ithaqua") icon_state = "ithaqua" item_state = "ithaqua" - if("Scientology") - icon_state = "scientology" - item_state = "scientology" - if("the bible melts") - icon_state = "melted" - item_state = "melted" + if("Trinary") + icon_state = "trinary" + item_state = "trinary" + if("Stars") + icon_state = "skrellbible" + item_state = "skrellbible" + if("Scrapbook") + icon_state = "scrapbook" + item_state = "scrapbook" + if("Atheist") + icon_state = "atheist" + item_state = "atheist" if("Necronomicon") icon_state = "necronomicon" item_state = "necronomicon" else - icon_state = "bible" - item_state = "bible" + var/randbook = "book" + pick("1", "2", "3", "4", "5", "6" , "7") + icon_state = randbook + item_state = randbook SSticker.Bible_icon_state = icon_state SSticker.Bible_item_state = item_state - verbs -= /obj/item/storage/bible/proc/Set_Religion \ No newline at end of file + verbs -= /obj/item/storage/bible/proc/Set_Religion diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 4622dd36ac4..5dadf835fc0 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -1,155 +1,3 @@ - -/obj/item/nullrod - name = "null rod" - desc = "A rod of pure obsidian, its very presence disrupts and dampens the powers of paranormal phenomenae." - icon_state = "nullrod" - item_state = "nullrod" - icon = 'icons/obj/weapons.dmi' - hitsound = "swing_hit" - slot_flags = SLOT_BELT - force = 15 - throw_speed = 1 - throw_range = 4 - throwforce = 10 - w_class = 2 - var/static/list/nullchoices - -/obj/item/nullrod/nullstaff - name = "null staff" - desc = "A staff of pure obsidian, its very presence disrupts and dampens the powers of paranormal phenomenae." - icon_state = "nullstaff" - item_state = "nullstaff" - slot_flags = SLOT_BACK - w_class = 4 - -/obj/item/nullrod/nullorb - name = "null sphere" - desc = "An orb of pure obsidian, its very presence disrupts and dampens the powers of paranormal phenomenae." - icon_state = "nullorb" - item_state = "nullorb" - -/obj/item/nullrod/nullathame - name = "null athame" - desc = "An athame of pure obsidian, its very presence disrupts and dampens the powers of paranormal phenomenae." - icon_state = "nullathame" - item_state = "nullathame" - -/obj/item/nullrod/obsidianshards - name = "Obsidian Shards" - desc = "A loose pile of obsidian shards, waiting to be assembled into a religious focus." - icon_state = "nullshards" - item_state = "nullshards" - -/obj/item/nullrod/Initialize() - . = ..() - if(!nullchoices) - var/blocked = list(src.type, /obj/item/nullrod/nullorb) + typesof(/obj/item/nullrod/fluff) - nullchoices = generate_chameleon_choices(/obj/item/nullrod, blocked) - -/obj/item/nullrod/verb/change() - set name = "Reassemble" - set category = "Obsidian Relics" - set src in usr - - if (use_check_and_message(usr, USE_FORCE_SRC_IN_USER)) - return - - var/picked = input("What form would you like your obsidian relic to take?", "Reassembling your obsidian relic") as null|anything in nullchoices - - if (use_check_and_message(usr, USE_FORCE_SRC_IN_USER)) - return - - if(!ispath(nullchoices[picked])) - return - - disguise(nullchoices[picked]) - - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_r_hand(FALSE) - M.update_inv_l_hand() - -/obj/item/nullrod/attack(mob/M as mob, mob/living/user as mob) //Paste from old-code to decult with a null rod. - - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - user.do_attack_animation(M) - - if(LAZYLEN(user.spell_list)) - user.silence_spells(300) //30 seconds - to_chat(user, "You've been silenced!") - return - - if (!user.IsAdvancedToolUser()) - to_chat(user, "You don't have the dexterity to do this!") - return - - if ((user.is_clumsy()) && prob(50)) - to_chat(user, "The rod slips out of your hand and hits your head.") - user.take_organ_damage(10) - user.Paralyse(20) - return - - if (M.stat !=2 && ishuman(M) && user.a_intent != I_HURT) - var/mob/living/K = M - if(cult && (K.mind in cult.current_antagonists) && prob(33)) - if(do_after(user, 15)) - K.visible_message("\The [user] waves \the [src] over \the [K]'s head, [K] looks captivated by it.", "[user] wave's the [src] over your head. You see a foreign light, asking you to follow it. Its presence burns and blinds.") - var/choice = alert(K,"Do you want to give up your goal?","Become cleansed","Resist","Give in") - switch(choice) - if("Resist") - K.visible_message("The gaze in [K]'s eyes remains determined.", "You turn away from the light, remaining true to the Geometer!") - K.say("*scream") - K.take_overall_damage(5, 15) - if("Give in") - K.visible_message("[K]'s eyes become clearer, the evil gone, but not without leaving scars.") - K.take_overall_damage(15, 30) - cult.remove_antagonist(K.mind) - else - user.visible_message("[user]'s concentration is broken!", "Your concentration is broken! You and your target need to stay uninterrupted for longer!") - return - else if(prob(10)) - to_chat(user, "The rod slips in your hand.") - ..() - else - to_chat(user, "The rod appears to do nothing.") - M.visible_message("\The [user] waves \the [src] over \the [M]'s head.") - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(prob(15)) - H.cure_all_traumas(cure_type = CURE_SOLITUDE) - else if(prob(10)) - H.cure_all_traumas(cure_type = CURE_CRYSTAL) - return - M.attack_log += text("\[[time_stamp()]\] Is being deconverted with the [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attempt to deconvert [M.name] ([M.ckey])") - - msg_admin_attack("[key_name_admin(user)] attempted to deconvert [key_name_admin(M)] with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(M)) - - else - return ..() - -/obj/item/nullrod/afterattack(atom/A, mob/user as mob, proximity) - if(!proximity) - return - if (istype(A, /turf/simulated/floor)) - to_chat(user, "You hit the floor with the [src].") - call(/obj/effect/rune/proc/revealrunes)(src) - -/obj/item/reagent_containers/spray/aspergillum/AltClick() - return - -/obj/item/reagent_containers/spray/aspergillum - name = "aspergillum" - desc = "A ceremonial item for sprinkling holy water, or other liquids, on a subject." - icon = 'icons/obj/weapons.dmi' - icon_state = "aspergillum" - item_state = "aspergillum" - amount_per_transfer_from_this = 5 - possible_transfer_amounts = null - spray_size = 1 - volume = 10 - spray_sound = 'sound/effects/jingle.ogg' - /obj/item/energy_net name = "energy net" desc = "It's a net made of green energy." diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 73e0cf4eac7..c5d6aede687 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -219,6 +219,19 @@ return return ..(M,user) +//Religious items +/obj/item/clothing/accessory/rosary + name = "rosary" + desc = "A form of prayer psalter used in the Catholic Church, with a string of beads attached to it." + icon = 'icons/obj/clothing/chaplain.dmi' + icon_state = "rosary" + overlay_state = "rosary" + flippable = 1 + + slot_flags = SLOT_BELT | SLOT_TIE + + drop_sound = 'sound/items/drop/scrap.ogg' + //Medals /obj/item/clothing/accessory/medal name = "bronze medal" diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index e44e8db6501..7f729ba323a 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -21,6 +21,7 @@ recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] lock",/obj/item/material/lock_construct, 1, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]") + recipes += new/datum/stack_recipe("[display_name] urn", /obj/item/material/urn, 10, time = 30, one_per_turf = FALSE, on_floor = 1, supplied_material = "[name]") if(hardness>=10) recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") if(hardness>50) diff --git a/html/changelogs/geeves - forSNAKE.yml b/html/changelogs/geeves - forSNAKE.yml new file mode 100644 index 00000000000..540055b125b --- /dev/null +++ b/html/changelogs/geeves - forSNAKE.yml @@ -0,0 +1,18 @@ +author: Geeves + +delete-after: True + +changes: + - tweak: "Reassembling a null item now correctly assigns new values to it." + - rscdel: "You can no longer bonk yourself in the head when blessing people, if you're perfectly sane." + - tweak: "Chance to prompt the convert path raised to 75% up from 33%. (Cultists should not mess around with chaplains.)" + - tweak: "Damage done by conversions reduced a tad." + - tweak: "Chance of null rod waving curing some mental traumas raised by 10%." + - tweak: "You can no longer accidentally bash the shit out of people with the null rod." + - tweak: "Tapping your rod against the floor now makes a visible message, and reveals runes in a wider radius." + - tweak: "Bibles now have better descriptors, meme sprites removed." + - rscadd: "Added new bible types, as well as a generic variant with no face." + - rscadd: "You can now only bless up to 60u of water, the amount that's in a flask. No more blessing water tanks." + - rscadd: "Adds craftable burial urns." + - rscadd: "Added null orb sprite." + - rscadd: "Added the Catholic Rosary to the Bible and White Bible spawns." \ No newline at end of file diff --git a/icons/obj/clothing/chaplain.dmi b/icons/obj/clothing/chaplain.dmi new file mode 100644 index 00000000000..dc7f9fe20fd Binary files /dev/null and b/icons/obj/clothing/chaplain.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 1c0cf3462d6..e4beec6c9f0 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/obj/urn.dmi b/icons/obj/urn.dmi new file mode 100644 index 00000000000..e2d43cf594c Binary files /dev/null and b/icons/obj/urn.dmi differ