Cleans up + Improves bows, Sorts files, Adds the Divine Archer clothing, weapon, rite (#74811)

## About The Pull Request

### Divine Archer 🏹 


![image](https://user-images.githubusercontent.com/40974010/232647927-aace69ea-bda8-4ec9-9bf1-60140034fbb3.png)

Adds a new chaplain weapon and suit of armor, the divine archer. It's an
orderable set of armor, but provides less armor than the rest, but you
get more pieces of armor (boots, bracer, undersuit).

The divine bow comes with a quiver that holds holy arrows. The holy
arrows come with bane support, dealing critical damage to revenants.

### Bow Features  

- arrows can now be dipped in poison

### Bow Improvements 🔧 

- bows now drop their arrow when you put them on your back while nocking
a bow
- bows give feedback for trying to draw without a nocked arrow
- codewise, bows support subtypes much better. They still have
hard-sprited loaded arrows, but one day that'll change.

## Why It's Good For The Game

Yeah, we could add null rod #2342 that does almost the same as the
others, or we could have a unique bow weapon!

Player Dev Project thread:
https://discord.com/channels/326822144233439242/1093521091957370940/1093521091957370940

## Changelog
🆑 tralezab code, Drag for the commission and player project, cre#0484
for their spritework
add: Divine Archer Armor and Weapon
qol: Bows give more feedback when you're doing something wrong, like
trying to draw without a nocked arrow
code: Sorted files, cleaned bow code up to allow subtypes
/🆑
This commit is contained in:
tralezab
2023-04-28 19:07:44 -07:00
committed by GitHub
parent e5cf268dd5
commit bc813ab93d
57 changed files with 678 additions and 293 deletions
+3 -1
View File
@@ -8,6 +8,8 @@
var/alternative_mode = FALSE
///Whether the hood is flipped up
var/hood_up = FALSE
/// What should be added to the end of the icon state when the hood is up? Set to "" for the suit sprite to not change at all
var/hood_up_affix = "_t"
/// Are we zipped? Mostly relevant for wintercoats, leaving this here to simplify logic and so someone else can extend it if they ever wish to.
var/zipped = FALSE
@@ -86,7 +88,7 @@
RemoveHood()
return
hood_up = TRUE
icon_state = "[initial(icon_state)]_t"
icon_state = "[initial(icon_state)][hood_up_affix]"
worn_icon_state = icon_state
zipped = TRUE // Just to maintain the same behavior, and so we avoid any bugs that otherwise relied on this behavior of zipping the jacket when bringing up the hood
H.update_worn_oversuit()
@@ -0,0 +1,63 @@
// this costume has so many fugging parts 😭. fuck it, it's a file.
//in fact, we should strive to make the chaplain kits of this quality, moreso than the other way around.
/// undersuit
/obj/item/clothing/under/rank/civilian/chaplain/divine_archer
name = "divine archer's garb"
desc = "Inner garb for divine archers."
icon_state = "archergarb"
inhand_icon_state = "archergarb"
can_adjust = TRUE
/// suit
/obj/item/clothing/suit/hooded/chaplain_hoodie/divine_archer
name = "divine archer coat"
desc = "Outer coat for divine archers. Offers some protection."
icon_state = "archercoat"
inhand_icon_state = "archercoat"
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
armor_type = /datum/armor/chaplainsuit_armor_weaker
clothing_flags = BLOCKS_SHOVE_KNOCKDOWN
strip_delay = 80
equip_delay_other = 60
hoodtype = /obj/item/clothing/head/hooded/chaplain_hood/divine_archer
hood_up_affix = ""
/datum/armor/chaplainsuit_armor_weaker
melee = 40
bullet = 5
laser = 5
energy = 5
fire = 60
acid = 60
wound = 10
/// hood
/obj/item/clothing/head/hooded/chaplain_hood/divine_archer
name = "divine archer hood"
desc = "A divine hood included, because have you ever got the sun in your eyes during archery? Oh, it's just the worst."
icon_state = "archerhood"
/// gloves
/obj/item/clothing/gloves/divine_archer
name = "divine archer bracers"
desc = "Bracers, a wise choice for archers who do not want their outfit to get in the way of drawing and firing their weapon."
icon_state = "archerbracers"
inhand_icon_state = "archerbracers"
strip_delay = 40
equip_delay_other = 20
resistance_flags = NONE
/// boots
/obj/item/clothing/shoes/divine_archer
name = "divine archer boots"
desc = "Boots, For steady footing while aiming."
icon_state = "archerboots"
inhand_icon_state = "archerboots"
strip_delay = 30
equip_delay_other = 50
resistance_flags = NONE
can_be_tied = FALSE
@@ -0,0 +1,627 @@
// CHAPLAIN NULLROD AND CUSTOM WEAPONS //
/obj/item/nullrod
name = "null rod"
desc = "A rod of pure obsidian; its very presence disrupts and dampens 'magical forces'. That's what the guidebook says, anyway."
icon = 'icons/obj/weapons/staff.dmi'
icon_state = "nullrod"
inhand_icon_state = "nullrod"
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
force = 18
throw_speed = 3
throw_range = 4
throwforce = 10
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_TINY
obj_flags = UNIQUE_RENAME
wound_bonus = -10
/// boolean on whether it's allowed to be picked from the nullrod's transformation ability
var/chaplain_spawnable = TRUE
/// Short description of what this item is capable of, for radial menu uses.
var/menu_description = "A standard chaplain's weapon. Fits in pockets. Can be worn on the belt."
/obj/item/nullrod/Initialize(mapload)
. = ..()
AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY)
AddComponent(/datum/component/effect_remover, \
success_feedback = "You disrupt the magic of %THEEFFECT with %THEWEAPON.", \
success_forcesay = "BEGONE FOUL MAGIKS!!", \
tip_text = "Clear rune", \
on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed)), \
effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune, /obj/effect/cosmic_rune), \
)
AddElement(/datum/element/bane, target_type = /mob/living/simple_animal/revenant, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE)
if(!GLOB.holy_weapon_type && type == /obj/item/nullrod)
var/list/rods = list()
for(var/obj/item/nullrod/nullrod_type as anything in typesof(/obj/item/nullrod))
if(!initial(nullrod_type.chaplain_spawnable))
continue
rods[nullrod_type] = initial(nullrod_type.menu_description)
//special non-nullrod subtyped shit
rods[/obj/item/gun/ballistic/bow/divine/with_quiver] = "A divine bow and 10 quivered holy arrows."
AddComponent(/datum/component/subtype_picker, rods, CALLBACK(src, PROC_REF(on_holy_weapon_picked)))
/obj/item/nullrod/proc/on_holy_weapon_picked(obj/item/nullrod/holy_weapon_type)
GLOB.holy_weapon_type = holy_weapon_type
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NULLROD_PICKED)
SSblackbox.record_feedback("tally", "chaplain_weapon", 1, "[initial(holy_weapon_type.name)]")
/obj/item/nullrod/proc/on_cult_rune_removed(obj/effect/target, mob/living/user)
if(!istype(target, /obj/effect/rune))
return
var/obj/effect/rune/target_rune = target
if(target_rune.log_when_erased)
user.log_message("erased [target_rune.cultist_name] rune using a null rod", LOG_GAME)
message_admins("[ADMIN_LOOKUPFLW(user)] erased a [target_rune.cultist_name] rune with a null rod.")
SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE
/obj/item/nullrod/suicide_act(mob/living/user)
user.visible_message(span_suicide("[user] is killing [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to get closer to god!"))
return (BRUTELOSS|FIRELOSS)
/obj/item/nullrod/godhand
name = "god hand"
desc = "This hand of yours glows with an awesome power!"
icon = 'icons/obj/weapons/hand.dmi'
icon_state = "disintegrate"
inhand_icon_state = "disintegrate"
lefthand_file = 'icons/mob/inhands/items/touchspell_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/touchspell_righthand.dmi'
slot_flags = null
item_flags = ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
hitsound = 'sound/weapons/sear.ogg'
damtype = BURN
attack_verb_continuous = list("punches", "cross counters", "pummels")
attack_verb_simple = list(SFX_PUNCH, "cross counter", "pummel")
menu_description = "An undroppable god hand dealing burn damage. Disappears if the arm holding it is cut off."
/obj/item/nullrod/godhand/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
/obj/item/nullrod/staff
name = "red holy staff"
desc = "It has a mysterious, protective aura."
icon = 'icons/obj/weapons/staff.dmi'
icon_state = "godstaff-red"
inhand_icon_state = "godstaff-red"
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
w_class = WEIGHT_CLASS_HUGE
force = 5
slot_flags = ITEM_SLOT_BACK
block_chance = 50
menu_description = "A red staff which provides a medium chance of blocking incoming attacks via a protective red aura around its user, but deals very low amount of damage. Can be worn only on the back."
/// The icon which appears over the mob holding the item
var/shield_icon = "shield-red"
/obj/item/nullrod/staff/worn_overlays(mutable_appearance/standing, isinhands)
. = ..()
if(isinhands)
. += mutable_appearance('icons/effects/effects.dmi', shield_icon, MOB_SHIELD_LAYER)
/obj/item/nullrod/staff/blue
name = "blue holy staff"
icon_state = "godstaff-blue"
inhand_icon_state = "godstaff-blue"
shield_icon = "shield-old"
menu_description = "A blue staff which provides a medium chance of blocking incoming attacks via a protective blue aura around its user, but deals very low amount of damage. Can be worn only on the back."
/obj/item/nullrod/claymore
name = "holy claymore"
desc = "A weapon fit for a crusade!"
icon = 'icons/obj/weapons/sword.dmi'
icon_state = "claymore_gold"
inhand_icon_state = "claymore_gold"
worn_icon_state = "claymore_gold"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT
block_chance = 30
sharpness = SHARP_EDGED
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts")
attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
menu_description = "A sharp claymore which provides a low chance of blocking incoming melee attacks. Can be worn on the back or belt."
/obj/item/nullrod/claymore/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(attack_type == PROJECTILE_ATTACK)
final_block_chance = 0 //Don't bring a sword to a gunfight
return ..()
/obj/item/nullrod/claymore/darkblade
name = "dark blade"
desc = "Spread the glory of the dark gods!"
icon = 'icons/obj/cult/items_and_weapons.dmi'
icon_state = "cultblade"
inhand_icon_state = "cultblade"
worn_icon_state = "cultblade"
lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi'
righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
inhand_x_dimension = 64
inhand_y_dimension = 64
hitsound = 'sound/hallucinations/growl1.ogg'
menu_description = "A sharp blade which provides a low chance of blocking incoming melee attacks. Can be worn on the back or belt."
/obj/item/nullrod/claymore/chainsaw_sword
name = "sacred chainsaw sword"
desc = "Suffer not a heretic to live."
icon_state = "chainswordon"
inhand_icon_state = "chainswordon"
worn_icon_state = "chainswordon"
slot_flags = ITEM_SLOT_BELT
attack_verb_continuous = list("saws", "tears", "lacerates", "cuts", "chops", "dices")
attack_verb_simple = list("saw", "tear", "lacerate", "cut", "chop", "dice")
hitsound = 'sound/weapons/chainsawhit.ogg'
tool_behaviour = TOOL_SAW
toolspeed = 1.5 //slower than a real saw
menu_description = "A sharp chainsaw sword which provides a low chance of blocking incoming melee attacks. Can be used as a slower saw tool. Can be worn on the belt."
/obj/item/nullrod/claymore/glowing
name = "force weapon"
desc = "The blade glows with the power of faith. Or possibly a battery."
icon_state = "swordon"
inhand_icon_state = "swordon"
worn_icon_state = "swordon"
menu_description = "A sharp weapon which provides a low chance of blocking incoming melee attacks. Can be worn on the back or belt."
/obj/item/nullrod/claymore/katana
name = "\improper Hanzo steel"
desc = "Capable of cutting clean through a holy claymore."
icon_state = "katana"
inhand_icon_state = "katana"
worn_icon_state = "katana"
menu_description = "A sharp katana which provides a low chance of blocking incoming melee attacks. Can be worn on the back or belt."
/obj/item/nullrod/claymore/multiverse
name = "extradimensional blade"
desc = "Once the harbinger of an interdimensional war, its sharpness fluctuates wildly."
icon_state = "multiverse"
inhand_icon_state = "multiverse"
worn_icon_state = "multiverse"
slot_flags = ITEM_SLOT_BACK
force = 15
menu_description = "An odd sharp blade which provides a low chance of blocking incoming melee attacks and deals a random amount of damage, which can range from almost nothing to very high. Can be worn on the back."
/obj/item/nullrod/claymore/multiverse/melee_attack_chain(mob/user, atom/target, params)
var/old_force = force
force += rand(-14, 15)
. = ..()
force = old_force
/obj/item/nullrod/claymore/saber
name = "light energy sword"
desc = "If you strike me down, I shall become more robust than you can possibly imagine."
icon = 'icons/obj/weapons/transforming_energy.dmi'
icon_state = "e_sword_on_blue"
inhand_icon_state = "e_sword_on_blue"
worn_icon_state = "swordblue"
slot_flags = ITEM_SLOT_BELT
hitsound = 'sound/weapons/blade1.ogg'
menu_description = "A sharp energy sword which provides a low chance of blocking incoming melee attacks. Can be worn on the belt."
/obj/item/nullrod/claymore/saber/red
name = "dark energy sword"
desc = "Woefully ineffective when used on steep terrain."
icon_state = "e_sword_on_red"
inhand_icon_state = "e_sword_on_red"
worn_icon_state = "swordred"
/obj/item/nullrod/claymore/saber/pirate
name = "nautical energy sword"
desc = "Convincing HR that your religion involved piracy was no mean feat."
icon_state = "e_cutlass_on"
inhand_icon_state = "e_cutlass_on"
worn_icon_state = "swordred"
/obj/item/nullrod/sord
name = "\improper UNREAL SORD"
desc = "This thing is so unspeakably HOLY you are having a hard time even holding it."
icon = 'icons/obj/weapons/sword.dmi'
icon_state = "sord"
inhand_icon_state = "sord"
worn_icon_state = "sord"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
force = 4.13
throwforce = 1
slot_flags = ITEM_SLOT_BELT
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts")
attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
menu_description = "An odd s(w)ord dealing a laughable amount of damage. Fits in pockets. Can be worn on the belt."
/obj/item/nullrod/sord/suicide_act(mob/living/user) //a near-exact copy+paste of the actual sord suicide_act()
user.visible_message(span_suicide("[user] is trying to impale [user.p_them()]self with [src]! It might be a suicide attempt if it weren't so HOLY."), \
span_suicide("You try to impale yourself with [src], but it's TOO HOLY..."))
return SHAME
/obj/item/nullrod/scythe
name = "reaper scythe"
desc = "Ask not for whom the bell tolls..."
icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "scythe1"
inhand_icon_state = "scythe1"
lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
armour_penetration = 35
slot_flags = ITEM_SLOT_BACK
sharpness = SHARP_EDGED
attack_verb_continuous = list("chops", "slices", "cuts", "reaps")
attack_verb_simple = list("chop", "slice", "cut", "reap")
menu_description = "A sharp scythe which partially penetrates armor. Very effective at butchering bodies. Can be worn on the back."
/obj/item/nullrod/scythe/Initialize(mapload)
. = ..()
AddComponent(/datum/component/butchering, \
speed = 7 SECONDS, \
effectiveness = 110, \
)
AddElement(/datum/element/bane, mob_biotypes = MOB_PLANT, damage_multiplier = 0.5, requires_combat_mode = FALSE)
/obj/item/nullrod/scythe/vibro
name = "high frequency blade"
desc = "Bad references are the DNA of the soul."
icon = 'icons/obj/weapons/sword.dmi'
icon_state = "hfrequency0"
inhand_icon_state = "hfrequency1"
worn_icon_state = "hfrequency0"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
attack_verb_continuous = list("chops", "slices", "cuts", "zandatsu's")
attack_verb_simple = list("chop", "slice", "cut", "zandatsu")
hitsound = 'sound/weapons/rapierhit.ogg'
menu_description = "A sharp blade which partially penetrates armor. Very effective at butchering bodies. Can be worn on the back."
/obj/item/nullrod/scythe/spellblade
name = "dormant spellblade"
desc = "The blade grants the wielder nearly limitless power...if they can figure out how to turn it on, that is."
icon = 'icons/obj/weapons/guns/magic.dmi'
icon_state = "spellblade"
inhand_icon_state = "spellblade"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
worn_icon_state = "spellblade"
hitsound = 'sound/weapons/rapierhit.ogg'
menu_description = "A sharp blade which partially penetrates armor. Very effective at butchering bodies. Can be worn on the back."
/obj/item/nullrod/scythe/talking
name = "possessed blade"
desc = "When the station falls into chaos, it's nice to have a friend by your side."
icon = 'icons/obj/weapons/sword.dmi'
icon_state = "talking_sword"
inhand_icon_state = "talking_sword"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
worn_icon_state = "talking_sword"
attack_verb_continuous = list("chops", "slices", "cuts")
attack_verb_simple= list("chop", "slice", "cut")
hitsound = 'sound/weapons/rapierhit.ogg'
menu_description = "A sharp blade which partially penetrates armor. Able to awaken a friendly spirit to provide guidance. Very effective at butchering bodies. Can be worn on the back."
/obj/item/nullrod/scythe/talking/Initialize(mapload)
. = ..()
AddComponent(/datum/component/spirit_holding)
/obj/item/nullrod/scythe/talking/chainsword
name = "possessed chainsaw sword"
desc = "Suffer not a heretic to live."
icon_state = "chainswordon"
inhand_icon_state = "chainswordon"
worn_icon_state = "chainswordon"
force = 30
slot_flags = ITEM_SLOT_BELT
attack_verb_continuous = list("saws", "tears", "lacerates", "cuts", "chops", "dices")
attack_verb_simple = list("saw", "tear", "lacerate", "cut", "chop", "dice")
hitsound = 'sound/weapons/chainsawhit.ogg'
tool_behaviour = TOOL_SAW
toolspeed = 0.5 //same speed as an active chainsaw
chaplain_spawnable = FALSE //prevents being pickable as a chaplain weapon (it has 30 force)
/obj/item/nullrod/hammer
name = "relic war hammer"
desc = "This war hammer cost the chaplain forty thousand space dollars."
icon = 'icons/obj/weapons/hammer.dmi'
icon_state = "hammeron"
inhand_icon_state = "hammeron"
worn_icon_state = "hammeron"
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
attack_verb_continuous = list("smashes", "bashes", "hammers", "crunches")
attack_verb_simple = list("smash", "bash", "hammer", "crunch")
menu_description = "A war hammer. Capable of tapping knees to measure brain health. Can be worn on the belt."
/obj/item/nullrod/hammer/Initialize(mapload)
. = ..()
AddElement(/datum/element/kneejerk)
/obj/item/nullrod/chainsaw
name = "chainsaw hand"
desc = "Good? Bad? You're the guy with the chainsaw hand."
icon = 'icons/obj/weapons/chainsaw.dmi'
icon_state = "chainsaw_on"
inhand_icon_state = "mounted_chainsaw"
lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
w_class = WEIGHT_CLASS_HUGE
slot_flags = null
item_flags = ABSTRACT
sharpness = SHARP_EDGED
attack_verb_continuous = list("saws", "tears", "lacerates", "cuts", "chops", "dices")
attack_verb_simple = list("saw", "tear", "lacerate", "cut", "chop", "dice")
hitsound = 'sound/weapons/chainsawhit.ogg'
tool_behaviour = TOOL_SAW
toolspeed = 2 //slower than a real saw
menu_description = "An undroppable sharp chainsaw hand. Can be used as a very slow saw tool. Capable of slowly butchering bodies. Disappears if the arm holding it is cut off."
/obj/item/nullrod/chainsaw/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
AddComponent(/datum/component/butchering, \
speed = 3 SECONDS, \
effectiveness = 100, \
bonus_modifier = 0, \
butcher_sound = hitsound, \
)
/obj/item/nullrod/clown
name = "clown dagger"
desc = "Used for absolutely hilarious sacrifices."
icon = 'icons/obj/wizard.dmi'
icon_state = "clownrender"
inhand_icon_state = "cultdagger"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
worn_icon_state = "render"
hitsound = 'sound/items/bikehorn.ogg'
sharpness = SHARP_EDGED
attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts")
attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
menu_description = "A sharp dagger. Fits in pockets. Can be worn on the belt. Honk."
#define CHEMICAL_TRANSFER_CHANCE 30
/obj/item/nullrod/pride_hammer
name = "Pride-struck Hammer"
desc = "It resonates an aura of Pride."
icon = 'icons/obj/weapons/hammer.dmi'
icon_state = "pride"
inhand_icon_state = "pride"
worn_icon_state = "pride"
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
force = 16
throwforce = 15
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
attack_verb_continuous = list("attacks", "smashes", "crushes", "splatters", "cracks")
attack_verb_simple = list("attack", "smash", "crush", "splatter", "crack")
hitsound = 'sound/weapons/blade1.ogg'
menu_description = "A hammer dealing a little less damage due to its user's pride. Has a low chance of transferring some of the user's reagents to the target. Capable of tapping knees to measure brain health. Can be worn on the back."
/obj/item/nullrod/pride_hammer/Initialize(mapload)
. = ..()
AddElement(/datum/element/kneejerk)
AddElement(
/datum/element/chemical_transfer,\
span_notice("Your pride reflects on %VICTIM."),\
span_userdanger("You feel insecure, taking on %ATTACKER's burden."),\
CHEMICAL_TRANSFER_CHANCE\
)
#undef CHEMICAL_TRANSFER_CHANCE
/obj/item/nullrod/whip
name = "holy whip"
desc = "What a terrible night to be on Space Station 13."
icon = 'icons/obj/weapons/whip.dmi'
icon_state = "chain"
inhand_icon_state = "chain"
worn_icon_state = "whip"
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
slot_flags = ITEM_SLOT_BELT
attack_verb_continuous = list("whips", "lashes")
attack_verb_simple = list("whip", "lash")
hitsound = 'sound/weapons/chainhit.ogg'
menu_description = "A whip. Deals extra damage to vampires. Fits in pockets. Can be worn on the belt."
/obj/item/nullrod/fedora
name = "atheist's fedora"
desc = "The brim of the hat is as sharp as your wit. The edge would hurt almost as much as disproving the existence of God."
icon_state = "fedora"
inhand_icon_state = "fedora"
slot_flags = ITEM_SLOT_HEAD
icon = 'icons/obj/clothing/head/hats.dmi'
worn_icon = 'icons/mob/clothing/head/hats.dmi'
lefthand_file = 'icons/mob/inhands/clothing/hats_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing/hats_righthand.dmi'
force = 0
throw_speed = 4
throw_range = 7
throwforce = 30
sharpness = SHARP_EDGED
attack_verb_continuous = list("enlightens", "redpills")
attack_verb_simple = list("enlighten", "redpill")
menu_description = "A sharp fedora dealing a very high amount of throw damage, but none of melee. Fits in pockets. Can be worn on the head, obviously."
/obj/item/nullrod/fedora/suicide_act(mob/living/user)
user.visible_message(span_suicide("[user] is killing [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to get further from god!"))
return (BRUTELOSS|FIRELOSS)
/obj/item/nullrod/armblade
name = "dark blessing"
desc = "Particularly twisted deities grant gifts of dubious value."
icon = 'icons/obj/weapons/changeling_items.dmi'
icon_state = "arm_blade"
inhand_icon_state = "arm_blade"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
slot_flags = null
item_flags = ABSTRACT
w_class = WEIGHT_CLASS_HUGE
sharpness = SHARP_EDGED
wound_bonus = -20
bare_wound_bonus = 25
menu_description = "An undroppable sharp armblade capable of inflicting deep wounds. Capable of an ineffective butchering of bodies. Disappears if the arm holding it is cut off."
/obj/item/nullrod/armblade/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
AddComponent(/datum/component/butchering, \
speed = 8 SECONDS, \
effectiveness = 70, \
)
/obj/item/nullrod/armblade/tentacle
name = "unholy blessing"
icon_state = "tentacle"
inhand_icon_state = "tentacle"
menu_description = "An undroppable sharp tentacle capable of inflicting deep wounds. Capable of an ineffective butchering of bodies. Disappears if the arm holding it is cut off."
/obj/item/nullrod/carp
name = "carp-sie plushie"
desc = "An adorable stuffed toy that resembles the god of all carp. The teeth look pretty sharp. Activate it to receive the blessing of Carp-Sie."
icon = 'icons/obj/toys/plushes.dmi'
icon_state = "carpplush"
inhand_icon_state = "carp_plushie"
worn_icon_state = "nullrod"
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
force = 15
attack_verb_continuous = list("bites", "eats", "fin slaps")
attack_verb_simple = list("bite", "eat", "fin slap")
hitsound = 'sound/weapons/bite.ogg'
menu_description = "A plushie dealing a little less damage due to its cute form. Capable of blessing one person with the Carp-Sie favor, which grants friendship of all wild space carps. Fits in pockets. Can be worn on the belt."
/obj/item/nullrod/carp/Initialize(mapload)
. = ..()
AddComponent(/datum/component/faction_granter, FACTION_CARP, holy_role_required = HOLY_ROLE_PRIEST, grant_message = span_boldnotice("You are blessed by Carp-Sie. Wild space carp will no longer attack you."))
/obj/item/nullrod/claymore/bostaff //May as well make it a "claymore" and inherit the blocking
name = "monk's staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts, it is now used to harass the clown."
force = 15
block_chance = 40
slot_flags = ITEM_SLOT_BACK
w_class = WEIGHT_CLASS_BULKY
sharpness = NONE
hitsound = SFX_SWING_HIT
attack_verb_continuous = list("smashes", "slams", "whacks", "thwacks")
attack_verb_simple = list("smash", "slam", "whack", "thwack")
icon = 'icons/obj/weapons/staff.dmi'
icon_state = "bostaff0"
inhand_icon_state = "bostaff0"
worn_icon_state = "bostaff0"
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
menu_description = "A staff which provides a medium-low chance of blocking incoming melee attacks and deals a little less damage due to being made of wood. Can be worn on the back."
/obj/item/nullrod/tribal_knife
name = "arrhythmic knife"
desc = "They say fear is the true mind killer, but stabbing them in the head works too. Honour compels you to not sheathe it once drawn."
icon = 'icons/obj/weapons/sword.dmi'
icon_state = "crysknife"
inhand_icon_state = "crysknife"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
w_class = WEIGHT_CLASS_HUGE
sharpness = SHARP_EDGED
slot_flags = null
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts")
attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
item_flags = SLOWS_WHILE_IN_HAND
menu_description = "A sharp knife. Randomly speeds or slows its user at a regular intervals. Capable of butchering bodies. Cannot be worn anywhere."
/obj/item/nullrod/tribal_knife/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
AddComponent(/datum/component/butchering, \
speed = 5 SECONDS, \
effectiveness = 100, \
)
/obj/item/nullrod/tribal_knife/Destroy()
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/item/nullrod/tribal_knife/process()
slowdown = rand(-10, 10)/10
if(iscarbon(loc))
var/mob/living/carbon/wielder = loc
if(wielder.is_holding(src))
wielder.update_equipment_speed_mods()
/obj/item/nullrod/pitchfork
name = "unholy pitchfork"
desc = "Holding this makes you look absolutely devilish."
icon = 'icons/obj/weapons/spear.dmi'
icon_state = "pitchfork0"
inhand_icon_state = "pitchfork0"
lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
worn_icon_state = "pitchfork0"
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
attack_verb_continuous = list("pokes", "impales", "pierces", "jabs")
attack_verb_simple = list("poke", "impale", "pierce", "jab")
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = SHARP_EDGED
menu_description = "A sharp pitchfork. Can be worn on the back."
/obj/item/nullrod/egyptian
name = "egyptian staff"
desc = "A tutorial in mummification is carved into the staff. You could probably craft the wraps if you had some cloth."
icon = 'icons/obj/weapons/guns/magic.dmi'
icon_state = "pharoah_sceptre"
inhand_icon_state = "pharoah_sceptre"
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
worn_icon_state = "pharoah_sceptre"
w_class = WEIGHT_CLASS_NORMAL
slot_flags = ITEM_SLOT_BACK
attack_verb_continuous = list("bashes", "smacks", "whacks")
attack_verb_simple = list("bash", "smack", "whack")
menu_description = "A staff. Can be used as a tool to craft exclusive egyptian items. Easily stored. Can be worn on the back."
/obj/item/nullrod/hypertool
name = "hypertool"
desc = "A tool so powerful even you cannot perfectly use it."
icon = 'icons/obj/device.dmi'
icon_state = "hypertool"
inhand_icon_state = "hypertool"
worn_icon_state = "hypertool"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
slot_flags = ITEM_SLOT_BELT
damtype = BRAIN
armour_penetration = 35
attack_verb_continuous = list("pulses", "mends", "cuts")
attack_verb_simple = list("pulse", "mend", "cut")
hitsound = 'sound/effects/sparks4.ogg'
menu_description = "A tool dealing brain damage which partially penetrates armor. Fits in pockets. Can be worn on the belt."
/obj/item/nullrod/spear
name = "ancient spear"
desc = "An ancient spear made of brass, I mean gold, I mean bronze. It looks highly mechanical."
icon = 'icons/obj/weapons/spear.dmi'
icon_state = "ratvarian_spear"
inhand_icon_state = "ratvarian_spear"
lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
slot_flags = ITEM_SLOT_BELT
armour_penetration = 10
sharpness = SHARP_POINTY
w_class = WEIGHT_CLASS_HUGE
attack_verb_continuous = list("stabs", "pokes", "slashes", "clocks")
attack_verb_simple = list("stab", "poke", "slash", "clock")
hitsound = 'sound/weapons/bladeslice.ogg'
menu_description = "A pointy spear which penetrates armor a little. Can be worn only on the belt."
@@ -1,10 +1,11 @@
/obj/item/gun/ballistic/bow
name = "longbow"
desc = "While pretty finely crafted, surely you can find something better to use in the current year."
icon = 'icons/obj/weapons/guns/ballistic.dmi'
icon = 'icons/obj/weapons/guns/bows/bows.dmi'
lefthand_file = 'icons/mob/inhands/weapons/bows_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/bows_righthand.dmi'
icon_state = "bow"
inhand_icon_state = "bow"
base_icon_state = "bow"
load_sound = null
fire_sound = null
mag_type = /obj/item/ammo_box/magazine/internal/bow
@@ -16,11 +17,12 @@
internal_magazine = TRUE
cartridge_wording = "arrow"
bolt_type = BOLT_TYPE_NO_BOLT
/// whether the bow is drawn back
var/drawn = FALSE
/obj/item/gun/ballistic/bow/update_icon_state()
. = ..()
icon_state = chambered ? "bow_[drawn]" : "bow"
icon_state = chambered ? "[base_icon_state]_[drawn ? "drawn" : "nocked"]" : "[base_icon_state]"
/obj/item/gun/ballistic/bow/proc/drop_arrow()
drawn = FALSE
@@ -38,7 +40,9 @@
chambered.forceMove(src)
/obj/item/gun/ballistic/bow/attack_self(mob/user)
if(chambered)
if(!chambered)
balloon_alert(user, "no arrow nocked!")
else
balloon_alert(user, "[drawn ? "string released" : "string drawn"]")
drawn = !drawn
update_appearance()
@@ -56,8 +60,16 @@
. = ..() //fires, removing the arrow
update_appearance()
/obj/item/gun/ballistic/bow/equipped(mob/user, slot, initial)
. = ..()
if(slot == ITEM_SLOT_BACK && chambered)
balloon_alert(user, "the arrow falls out!")
drop_arrow()
drawn = FALSE
update_appearance()
/obj/item/gun/ballistic/bow/shoot_with_empty_chamber(mob/living/user)
return //so clicking sounds please
return //no clicking sounds please
/obj/item/ammo_box/magazine/internal/bow
name = "bowstring"
@@ -65,58 +77,3 @@
max_ammo = 1
start_empty = TRUE
caliber = CALIBER_ARROW
/obj/item/ammo_casing/caseless/arrow
name = "arrow"
desc = "Stabby Stabman!"
icon_state = "arrow"
inhand_icon_state = "arrow"
flags_1 = NONE
throwforce = 1
projectile_type = /obj/projectile/bullet/reusable/arrow
firing_effect_type = null
caliber = CALIBER_ARROW
heavy_metal = FALSE
/obj/item/ammo_casing/caseless/arrow/despawning/dropped()
. = ..()
addtimer(CALLBACK(src, PROC_REF(floor_vanish)), 5 SECONDS)
/obj/item/ammo_casing/caseless/arrow/despawning/proc/floor_vanish()
if(isturf(loc))
qdel(src)
/obj/projectile/bullet/reusable/arrow
name = "arrow"
desc = "Ow! Get it out of me!"
ammo_type = /obj/item/ammo_casing/caseless/arrow
damage = 50
speed = 1
range = 25
/obj/item/storage/bag/quiver
name = "quiver"
desc = "Holds arrows for your bow. Good, because while pocketing arrows is possible, it surely can't be pleasant."
icon_state = "quiver"
inhand_icon_state = null
worn_icon_state = "harpoon_quiver"
var/arrow_path = /obj/item/ammo_casing/caseless/arrow
/obj/item/storage/bag/quiver/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_TINY
atom_storage.max_slots = 40
atom_storage.max_total_storage = 100
atom_storage.set_holdable(list(
/obj/item/ammo_casing/caseless/arrow
))
/obj/item/storage/bag/quiver/PopulateContents()
. = ..()
for(var/i in 1 to 10)
new arrow_path(src)
/obj/item/storage/bag/quiver/despawning
arrow_path = /obj/item/ammo_casing/caseless/arrow/despawning
@@ -0,0 +1,94 @@
///base arrow
/obj/item/ammo_casing/caseless/arrow
name = "arrow"
desc = "Stabby Stabman!"
icon = 'icons/obj/weapons/guns/bows/arrows.dmi'
icon_state = "arrow"
inhand_icon_state = "arrow"
projectile_type = /obj/projectile/bullet/reusable/arrow
flags_1 = NONE
throwforce = 1
firing_effect_type = null
caliber = CALIBER_ARROW
heavy_metal = FALSE
/obj/item/ammo_casing/caseless/arrow/Initialize(mapload)
. = ..()
AddComponent(/datum/element/envenomable_casing)
///base arrow projectile
/obj/projectile/bullet/reusable/arrow
name = "arrow"
desc = "Ow! Get it out of me!"
icon = 'icons/obj/weapons/guns/bows/arrows.dmi'
icon_state = "arrow_projectile"
ammo_type = /obj/item/ammo_casing/caseless/arrow
damage = 50
speed = 1
range = 25
///*sigh* NON-REUSABLE base arrow projectile. In the future: let's componentize the reusable subtype, jesus
/obj/projectile/bullet/arrow
name = "arrow"
desc = "Ow! Get it out of me!"
icon = 'icons/obj/weapons/guns/bows/arrows.dmi'
icon_state = "arrow_projectile"
damage = 50
speed = 1
range = 25
/// despawning arrow type
/obj/item/ammo_casing/caseless/arrow/despawning/dropped()
. = ..()
addtimer(CALLBACK(src, PROC_REF(floor_vanish)), 5 SECONDS)
/obj/item/ammo_casing/caseless/arrow/despawning/proc/floor_vanish()
if(isturf(loc))
qdel(src)
/// holy arrows
/obj/item/ammo_casing/caseless/arrow/holy
name = "holy arrow"
desc = "A holy diver seeking its target."
icon_state = "holy_arrow"
inhand_icon_state = "holy_arrow"
projectile_type = /obj/projectile/bullet/reusable/arrow/holy
/// holy arrow projectile
/obj/projectile/bullet/reusable/arrow/holy
name = "holy arrow"
desc = "Here it comes, cultist scum!"
icon_state = "holy_arrow_projectile"
ammo_type = /obj/item/ammo_casing/caseless/arrow/holy
damage = 20 //still a lot but this is roundstart gear so far less
/obj/projectile/bullet/reusable/arrow/holy/Initialize(mapload)
. = ..()
//50 damage to revenants
AddElement(/datum/element/bane, target_type = /mob/living/simple_animal/revenant, damage_multiplier = 0, added_damage = 30)
/// special pyre sect arrow
/// in the future, this needs a special sprite, but bows don't support non-hardcoded arrow sprites
/obj/item/ammo_casing/caseless/arrow/holy/blazing
name = "blazing star arrow"
desc = "A holy diver seeking its target, blessed with fire. Will ignite on hit, destroying the arrow. But if you hit an already ignited target...?"
projectile_type = /obj/projectile/bullet/arrow/blazing
/obj/projectile/bullet/arrow/blazing
name = "blazing arrow"
desc = "THE UNMATCHED POWER OF THE SUN"
icon_state = "holy_arrow_projectile"
damage = 20
/obj/projectile/bullet/arrow/blazing/on_hit(atom/target, blocked, pierce_hit)
. = ..()
if(!ishuman(target))
return
var/mob/living/carbon/human/human_target = target
if(!human_target.on_fire)
to_chat(human_target, span_danger("[src] explodes into flames which quickly envelop you!"))
human_target.adjust_fire_stacks(2)
human_target.ignite_mob()
return
to_chat(human_target, span_danger("[src] reacts with the flames on y-"))
explosion(src, light_impact_range = 1, flame_range = 2) //ow
@@ -0,0 +1,35 @@
/obj/item/storage/bag/quiver
name = "quiver"
desc = "Holds arrows for your bow. Good, because while pocketing arrows is possible, it surely can't be pleasant."
icon = 'icons/obj/weapons/guns/bows/quivers.dmi'
icon_state = "quiver"
inhand_icon_state = null
worn_icon_state = "harpoon_quiver"
/// type of arrow the quivel should hold
var/arrow_path = /obj/item/ammo_casing/caseless/arrow
/obj/item/storage/bag/quiver/Initialize(mapload)
. = ..()
atom_storage.max_specific_storage = WEIGHT_CLASS_TINY
atom_storage.max_slots = 40
atom_storage.max_total_storage = 100
atom_storage.set_holdable(list(
/obj/item/ammo_casing/caseless/arrow,
))
/obj/item/storage/bag/quiver/PopulateContents()
. = ..()
for(var/i in 1 to 10)
new arrow_path(src)
/obj/item/storage/bag/quiver/despawning
arrow_path = /obj/item/ammo_casing/caseless/arrow/despawning
/obj/item/storage/bag/quiver/holy
name = "divine quiver"
desc = "Holds arrows for your divine bow, where they wait to find their target."
icon_state = "holyquiver"
inhand_icon_state = "holyquiver"
worn_icon_state = "holyquiver"
arrow_path = /obj/item/ammo_casing/caseless/arrow/holy
@@ -0,0 +1,47 @@
///basic bow, used for medieval sim
/obj/item/gun/ballistic/bow/longbow
name = "longbow"
desc = "While pretty finely crafted, surely you can find something better to use in the current year."
///chaplain's divine archer bow
/obj/item/gun/ballistic/bow/divine
name = "divine bow"
desc = "Holy armament to pierce the souls of sinners."
icon_state = "holybow"
inhand_icon_state = "holybow"
base_icon_state = "holybow"
worn_icon_state = "holybow"
slot_flags = ITEM_SLOT_BACK
mag_type = /obj/item/ammo_box/magazine/internal/bow/holy
/obj/item/ammo_box/magazine/internal/bow/holy
name = "divine bowstring"
ammo_type = /obj/item/ammo_casing/caseless/arrow/holy
/obj/item/gun/ballistic/bow/divine/Initialize(mapload)
. = ..()
AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY)
AddComponent(/datum/component/effect_remover, \
success_feedback = "You disrupt the magic of %THEEFFECT with %THEWEAPON.", \
success_forcesay = "BOW-GONE FOUL MAGIKS!!", \
tip_text = "Clear rune", \
on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed)), \
effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune) \
)
AddElement(/datum/element/bane, target_type = /mob/living/simple_animal/revenant, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE)
/obj/item/gun/ballistic/bow/divine/proc/on_cult_rune_removed(obj/effect/target, mob/living/user)
SIGNAL_HANDLER
if(!istype(target, /obj/effect/rune))
return
var/obj/effect/rune/target_rune = target
if(target_rune.log_when_erased)
user.log_message("erased [target_rune.cultist_name] rune using a null rod", LOG_GAME)
message_admins("[ADMIN_LOOKUPFLW(user)] erased a [target_rune.cultist_name] rune with a null rod.")
SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE
/obj/item/gun/ballistic/bow/divine/with_quiver/Initialize(mapload)
. = ..()
new /obj/item/storage/bag/quiver/holy(loc)
+2 -2
View File
@@ -242,14 +242,14 @@
* pierce_hit - are we piercing through or regular hitting
*/
/obj/projectile/proc/on_hit(atom/target, blocked = FALSE, pierce_hit)
if(fired_from)
SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_ON_HIT, firer, target, Angle)
// i know that this is probably more with wands and gun mods in mind, but it's a bit silly that the projectile on_hit signal doesn't ping the projectile itself.
// maybe we care what the projectile thinks! See about combining these via args some time when it's not 5AM
var/obj/item/bodypart/hit_limb
if(isliving(target))
var/mob/living/L = target
hit_limb = L.check_limb_hit(def_zone)
if(fired_from)
SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_ON_HIT, firer, target, Angle, hit_limb)
SEND_SIGNAL(src, COMSIG_PROJECTILE_SELF_ON_HIT, firer, target, Angle, hit_limb)
if(QDELETED(src)) // in case one of the above signals deleted the projectile for whatever reason
@@ -128,7 +128,7 @@
var/obj/item/paper/autograph = writ_target
var/turf/tool_turf = get_turf(religious_tool)
writ_target = null
if(QDELETED(autograph) || !(tool_turf == autograph.loc)) //check if the same food is still there
if(QDELETED(autograph) || !(tool_turf == autograph.loc)) //check if the paper is still there
to_chat(user, span_warning("Your target left the altar!"))
return FALSE
autograph.visible_message(span_notice("Words magically form on [autograph]!"))
+151
View File
@@ -0,0 +1,151 @@
///apply a bunch of fire immunity effect to clothing
/datum/religion_rites/fireproof/proc/apply_fireproof(obj/item/clothing/fireproofed)
fireproofed.name = "unmelting [fireproofed.name]"
fireproofed.max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
fireproofed.heat_protection = chosen_clothing.body_parts_covered
fireproofed.resistance_flags |= FIRE_PROOF
/datum/religion_rites/fireproof
name = "Unmelting Protection"
desc = "Grants fire immunity to any piece of clothing."
ritual_length = 15 SECONDS
ritual_invocations = list("And so to support the holder of the Ever-Burning candle...",
"... allow this unworthy apparel to serve you ...",
"... make it strong enough to burn a thousand time and more ...")
invoke_msg = "... Come forth in your new form, and join the unmelting wax of the one true flame!"
favor_cost = 1000
///the piece of clothing that will be fireproofed, only one per rite
var/obj/item/clothing/chosen_clothing
/datum/religion_rites/fireproof/perform_rite(mob/living/user, atom/religious_tool)
for(var/obj/item/clothing/apparel in get_turf(religious_tool))
if(apparel.max_heat_protection_temperature >= FIRE_IMMUNITY_MAX_TEMP_PROTECT)
continue //we ignore anything that is already fireproof
chosen_clothing = apparel //the apparel has been chosen by our lord and savior
return ..()
return FALSE
/datum/religion_rites/fireproof/invoke_effect(mob/living/user, atom/religious_tool)
..()
if(!QDELETED(chosen_clothing) && get_turf(religious_tool) == chosen_clothing.loc) //check if the same clothing is still there
if(istype(chosen_clothing,/obj/item/clothing/suit/hooded))
for(var/obj/item/clothing/head/integrated_helmet in chosen_clothing.contents) //check if the clothing has a hood/helmet integrated and fireproof it if there is one.
apply_fireproof(integrated_helmet)
apply_fireproof(chosen_clothing)
playsound(get_turf(religious_tool), 'sound/magic/fireball.ogg', 50, TRUE)
chosen_clothing = null //our lord and savior no longer cares about this apparel
return TRUE
chosen_clothing = null
to_chat(user, span_warning("The clothing that was chosen for the rite is no longer on the altar!"))
return FALSE
/datum/religion_rites/burning_sacrifice
name = "Burning Offering"
desc = "Sacrifice a buckled burning corpse for favor, the more burn damage the corpse has the more favor you will receive."
ritual_length = 20 SECONDS
ritual_invocations = list("Burning body ...",
"... cleansed by the flame ...",
"... we were all created from fire ...",
"... and to it ...")
invoke_msg = "... WE RETURN! "
///the burning corpse chosen for the sacrifice of the rite
var/mob/living/carbon/chosen_sacrifice
/datum/religion_rites/burning_sacrifice/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("Nothing is buckled to the altar!"))
return FALSE
for(var/corpse in movable_reltool.buckled_mobs)
if(!iscarbon(corpse))// only works with carbon corpse since most normal mobs can't be set on fire.
to_chat(user, span_warning("Only carbon lifeforms can be properly burned for the sacrifice!"))
return FALSE
chosen_sacrifice = corpse
if(chosen_sacrifice.stat != DEAD)
to_chat(user, span_warning("You can only sacrifice dead bodies, this one is still alive!"))
return FALSE
if(!chosen_sacrifice.on_fire)
to_chat(user, span_warning("This corpse needs to be on fire to be sacrificed!"))
return FALSE
return ..()
/datum/religion_rites/burning_sacrifice/invoke_effect(mob/living/user, atom/movable/religious_tool)
..()
if(!(chosen_sacrifice in religious_tool.buckled_mobs)) //checks one last time if the right corpse is still buckled
to_chat(user, span_warning("The right sacrifice is no longer on the altar!"))
chosen_sacrifice = null
return FALSE
if(!chosen_sacrifice.on_fire)
to_chat(user, span_warning("The sacrifice is no longer on fire, it needs to burn until the end of the rite!"))
chosen_sacrifice = null
return FALSE
if(chosen_sacrifice.stat != DEAD)
to_chat(user, span_warning("The sacrifice has to stay dead for the rite to work!"))
chosen_sacrifice = null
return FALSE
var/favor_gained = 100 + round(chosen_sacrifice.getFireLoss())
GLOB.religious_sect.adjust_favor(favor_gained, user)
to_chat(user, span_notice("[GLOB.deity] absorbs the burning corpse and any trace of fire with it. [GLOB.deity] rewards you with [favor_gained] favor."))
chosen_sacrifice.dust(force = TRUE)
playsound(get_turf(religious_tool), 'sound/effects/supermatter.ogg', 50, TRUE)
chosen_sacrifice = null
return TRUE
/datum/religion_rites/infinite_candle
name = "Immortal Candles"
desc = "Creates 5 candles that never run out of wax."
ritual_length = 10 SECONDS
invoke_msg = "Burn bright, little candles, for you will only extinguish along with the universe."
favor_cost = 200
/datum/religion_rites/infinite_candle/invoke_effect(mob/living/user, atom/movable/religious_tool)
..()
var/altar_turf = get_turf(religious_tool)
for(var/i in 1 to 5)
new /obj/item/flashlight/flare/candle/infinite(altar_turf)
playsound(altar_turf, 'sound/magic/fireball.ogg', 50, TRUE)
return TRUE
/datum/religion_rites/blazing_star
name = "Blazing Star"
desc = "Enchants a holy arrow to set someone on fire on hit, or if the victim is already on fire... note, this consumes the arrow."
ritual_length = 15 SECONDS
ritual_invocations = list(
"And so to keep the Ever-Burning candle protected ...",
"... grant this feeble bolt your blessing ...",
"... make it burn bright ...",
)
invoke_msg = "... a blazing star is born!"
favor_cost = 2000
///arrow to enchant
var/obj/item/ammo_casing/caseless/arrow/holy/enchant_target
/datum/religion_rites/blazing_star/perform_rite(mob/living/user, atom/religious_tool)
for(var/obj/item/ammo_casing/caseless/arrow/holy/can_enchant in get_turf(religious_tool))
if(istype(can_enchant, /obj/item/ammo_casing/caseless/arrow/holy/blazing))
continue
enchant_target = can_enchant
return ..()
to_chat(user, span_warning("You need to place a holy arrow on [religious_tool] to do this!"))
return FALSE
/datum/religion_rites/blazing_star/invoke_effect(mob/living/user, atom/movable/religious_tool)
..()
var/obj/item/ammo_casing/caseless/arrow/holy/enchanting = enchant_target
var/turf/tool_turf = get_turf(religious_tool)
enchant_target = null
if(QDELETED(enchanting) || !(tool_turf == enchanting.loc)) //check if the arrow is still there
to_chat(user, span_warning("Your target left the altar!"))
return FALSE
enchanting.visible_message(span_notice("[enchant_target] is blessed by holy fire!"))
playsound(tool_turf, 'sound/effects/pray.ogg', 50, TRUE)
new /obj/item/ammo_casing/caseless/arrow/holy/blazing(tool_turf)
qdel(enchanting)
return TRUE
+8
View File
@@ -208,6 +208,14 @@
rites_list = list(/datum/religion_rites/fireproof, /datum/religion_rites/burning_sacrifice, /datum/religion_rites/infinite_candle)
altar_icon_state = "convertaltar-red"
/datum/religion_sect/pyre/on_select()
. = ..()
AddComponent(/datum/component/sect_nullrod_bonus, list(
/obj/item/gun/ballistic/bow/divine/with_quiver = list(
/datum/religion_rites/blazing_star,
),
))
//candle sect bibles don't heal or do anything special apart from the standard holy water blessings
/datum/religion_sect/pyre/sect_bless(mob/living/target, mob/living/chap)
return TRUE
-118
View File
@@ -139,124 +139,6 @@
new blessing(altar_turf)
return TRUE
/**** Pyre God ****/
///apply a bunch of fire immunity effect to clothing
/datum/religion_rites/fireproof/proc/apply_fireproof(obj/item/clothing/fireproofed)
fireproofed.name = "unmelting [fireproofed.name]"
fireproofed.max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
fireproofed.heat_protection = chosen_clothing.body_parts_covered
fireproofed.resistance_flags |= FIRE_PROOF
/datum/religion_rites/fireproof
name = "Unmelting Protection"
desc = "Grants fire immunity to any piece of clothing."
ritual_length = 15 SECONDS
ritual_invocations = list("And so to support the holder of the Ever-Burning candle...",
"... allow this unworthy apparel to serve you ...",
"... make it strong enough to burn a thousand time and more ...")
invoke_msg = "... Come forth in your new form, and join the unmelting wax of the one true flame!"
favor_cost = 1000
///the piece of clothing that will be fireproofed, only one per rite
var/obj/item/clothing/chosen_clothing
/datum/religion_rites/fireproof/perform_rite(mob/living/user, atom/religious_tool)
for(var/obj/item/clothing/apparel in get_turf(religious_tool))
if(apparel.max_heat_protection_temperature >= FIRE_IMMUNITY_MAX_TEMP_PROTECT)
continue //we ignore anything that is already fireproof
chosen_clothing = apparel //the apparel has been chosen by our lord and savior
return ..()
return FALSE
/datum/religion_rites/fireproof/invoke_effect(mob/living/user, atom/religious_tool)
..()
if(!QDELETED(chosen_clothing) && get_turf(religious_tool) == chosen_clothing.loc) //check if the same clothing is still there
if(istype(chosen_clothing,/obj/item/clothing/suit/hooded))
for(var/obj/item/clothing/head/integrated_helmet in chosen_clothing.contents) //check if the clothing has a hood/helmet integrated and fireproof it if there is one.
apply_fireproof(integrated_helmet)
apply_fireproof(chosen_clothing)
playsound(get_turf(religious_tool), 'sound/magic/fireball.ogg', 50, TRUE)
chosen_clothing = null //our lord and savior no longer cares about this apparel
return TRUE
chosen_clothing = null
to_chat(user, span_warning("The clothing that was chosen for the rite is no longer on the altar!"))
return FALSE
/datum/religion_rites/burning_sacrifice
name = "Burning Offering"
desc = "Sacrifice a buckled burning corpse for favor, the more burn damage the corpse has the more favor you will receive."
ritual_length = 20 SECONDS
ritual_invocations = list("Burning body ...",
"... cleansed by the flame ...",
"... we were all created from fire ...",
"... and to it ...")
invoke_msg = "... WE RETURN! "
///the burning corpse chosen for the sacrifice of the rite
var/mob/living/carbon/chosen_sacrifice
/datum/religion_rites/burning_sacrifice/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("Nothing is buckled to the altar!"))
return FALSE
for(var/corpse in movable_reltool.buckled_mobs)
if(!iscarbon(corpse))// only works with carbon corpse since most normal mobs can't be set on fire.
to_chat(user, span_warning("Only carbon lifeforms can be properly burned for the sacrifice!"))
return FALSE
chosen_sacrifice = corpse
if(chosen_sacrifice.stat != DEAD)
to_chat(user, span_warning("You can only sacrifice dead bodies, this one is still alive!"))
return FALSE
if(!chosen_sacrifice.on_fire)
to_chat(user, span_warning("This corpse needs to be on fire to be sacrificed!"))
return FALSE
return ..()
/datum/religion_rites/burning_sacrifice/invoke_effect(mob/living/user, atom/movable/religious_tool)
..()
if(!(chosen_sacrifice in religious_tool.buckled_mobs)) //checks one last time if the right corpse is still buckled
to_chat(user, span_warning("The right sacrifice is no longer on the altar!"))
chosen_sacrifice = null
return FALSE
if(!chosen_sacrifice.on_fire)
to_chat(user, span_warning("The sacrifice is no longer on fire, it needs to burn until the end of the rite!"))
chosen_sacrifice = null
return FALSE
if(chosen_sacrifice.stat != DEAD)
to_chat(user, span_warning("The sacrifice has to stay dead for the rite to work!"))
chosen_sacrifice = null
return FALSE
var/favor_gained = 100 + round(chosen_sacrifice.getFireLoss())
GLOB.religious_sect.adjust_favor(favor_gained, user)
to_chat(user, span_notice("[GLOB.deity] absorbs the burning corpse and any trace of fire with it. [GLOB.deity] rewards you with [favor_gained] favor."))
chosen_sacrifice.dust(force = TRUE)
playsound(get_turf(religious_tool), 'sound/effects/supermatter.ogg', 50, TRUE)
chosen_sacrifice = null
return TRUE
/datum/religion_rites/infinite_candle
name = "Immortal Candles"
desc = "Creates 5 candles that never run out of wax."
ritual_length = 10 SECONDS
invoke_msg = "Burn bright, little candles, for you will only extinguish along with the universe."
favor_cost = 200
/datum/religion_rites/infinite_candle/invoke_effect(mob/living/user, atom/movable/religious_tool)
..()
var/altar_turf = get_turf(religious_tool)
for(var/i in 1 to 5)
new /obj/item/flashlight/flare/candle/infinite(altar_turf)
playsound(altar_turf, 'sound/magic/fireball.ogg', 50, TRUE)
return TRUE
/*********Greedy God**********/
///all greed rites cost money instead