mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-19 19:10:05 +01:00
Refactored the projectile code, mostly in line with TG's now. Refactored various procs that are used or depends on it. Projectiles can now ricochet if enabled to. Damage falloffs with distance. Homing projectiles can now have accuracy falloff with distance. Projectiles have a maximum range. Muzzle flash is configurable per projectile. Impact effect of the projectile is configurable per projectile. Accuracy decreases with distance. Projectiles work with signals and emits them, for easy hooking up from other parts of the code. Meatshielding is now less effective . Impact sound is now configurable per projectile. High risk.
230 lines
7.3 KiB
Plaintext
230 lines
7.3 KiB
Plaintext
/obj/item/material/sword
|
|
name = "claymore"
|
|
desc = "What are you standing around staring at this for? Get to killing!"
|
|
desc_antag = "As a Cultist, this item can be reforged to become a cult blade."
|
|
icon = 'icons/obj/sword.dmi'
|
|
icon_state = "claymore"
|
|
item_state = "claymore"
|
|
contained_sprite = TRUE
|
|
slot_flags = SLOT_BELT|SLOT_BACK
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
force_divisor = 0.7 // 42 when wielded with hardnes 60 (steel)
|
|
thrown_force_divisor = 0.5 // 10 when thrown with weight 20 (steel)
|
|
sharp = 1
|
|
edge = TRUE
|
|
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
|
hitsound = 'sound/weapons/bladeslice.ogg'
|
|
can_embed = 0
|
|
var/parry_chance = 40
|
|
drop_sound = 'sound/items/drop/sword.ogg'
|
|
pickup_sound = /singleton/sound_category/sword_pickup_sound
|
|
equip_sound = /singleton/sound_category/sword_equip_sound
|
|
worth_multiplier = 30
|
|
|
|
/obj/item/material/sword/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
|
var/parry_bonus = 1
|
|
|
|
if(ishuman(user))
|
|
var/mob/living/carbon/human/H = user
|
|
var/has_parry_bonus = H.check_weapon_affinity(src, TRUE)
|
|
if(has_parry_bonus)
|
|
parry_bonus = has_parry_bonus // proc returns the parry multiplier
|
|
|
|
if(default_parry_check(user, attacker, damage_source) && prob(parry_chance * parry_bonus))
|
|
user.visible_message(SPAN_DANGER("\The [user] parries [attack_text] with \the [src]!"))
|
|
playsound(user.loc, 'sound/weapons/bladeparry.ogg', 50, 1)
|
|
return BULLET_ACT_BLOCK
|
|
return BULLET_ACT_HIT
|
|
|
|
/obj/item/material/sword/perform_technique(var/mob/living/carbon/human/target, var/mob/living/carbon/human/user, var/target_zone)
|
|
var/armor_reduction = target.get_blocked_ratio(target_zone, DAMAGE_BRUTE, DAMAGE_FLAG_EDGE|DAMAGE_FLAG_SHARP, damage = force)*100
|
|
var/obj/item/organ/external/affecting = target.get_organ(target_zone)
|
|
if(!affecting)
|
|
return
|
|
|
|
user.do_attack_animation(target)
|
|
|
|
if(target_zone == BP_HEAD || target_zone == BP_EYES || target_zone == BP_MOUTH)
|
|
if(prob(70 - armor_reduction))
|
|
target.eye_blurry += 5
|
|
target.confused += 10
|
|
return TRUE
|
|
|
|
if(target_zone == BP_R_ARM || target_zone == BP_L_ARM || target_zone == BP_R_HAND || target_zone == BP_L_HAND)
|
|
if(prob(80 - armor_reduction))
|
|
if(target_zone == BP_R_ARM || target_zone == BP_R_HAND)
|
|
target.drop_r_hand()
|
|
else
|
|
target.drop_l_hand()
|
|
return TRUE
|
|
|
|
if(target_zone == BP_R_FOOT || target_zone == BP_R_FOOT || target_zone == BP_R_LEG || target_zone == BP_L_LEG)
|
|
if(prob(60 - armor_reduction))
|
|
target.Weaken(5)
|
|
return TRUE
|
|
|
|
return FALSE
|
|
|
|
/obj/item/material/sword/katana
|
|
name = "katana"
|
|
desc = "Woefully underpowered in D20. This one looks pretty sharp."
|
|
icon_state = "katana"
|
|
item_state = "katana"
|
|
slot_flags = SLOT_BELT | SLOT_BACK
|
|
|
|
/obj/item/material/sword/rapier
|
|
name = "rapier"
|
|
desc = "A slender, fancy and sharply pointed sword."
|
|
icon_state = "rapier"
|
|
item_state = "rapier"
|
|
slot_flags = SLOT_BELT
|
|
attack_verb = list("attacked", "stabbed", "prodded", "poked", "lunged")
|
|
sharp = 0
|
|
|
|
/obj/item/material/sword/longsword
|
|
name = "longsword"
|
|
desc = "A double-edged large blade."
|
|
icon_state = "longsword"
|
|
item_state = "longsword"
|
|
slot_flags = SLOT_BELT | SLOT_BACK
|
|
|
|
/obj/item/material/sword/longsword/pre_attack(var/mob/living/target, var/mob/living/user)
|
|
if(istype(target))
|
|
cleave(user, target)
|
|
..()
|
|
|
|
/obj/item/material/sword/sabre
|
|
name = "sabre"
|
|
desc = "A sharp curved backsword."
|
|
icon_state = "sabre"
|
|
item_state = "sabre"
|
|
slot_flags = SLOT_BELT
|
|
|
|
/obj/item/material/sword/sabre/silver/Initialize(newloc, material_key)
|
|
. = ..(newloc, MATERIAL_SILVER)
|
|
|
|
/obj/item/material/sword/axe
|
|
name = "battle axe"
|
|
desc = "A one handed battle axe, still a deadly weapon."
|
|
icon_state = "axe"
|
|
item_state = "axe"
|
|
slot_flags = SLOT_BACK
|
|
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
|
|
applies_material_colour = 0
|
|
parry_chance = 10
|
|
drop_sound = 'sound/items/drop/axe.ogg'
|
|
pickup_sound = 'sound/items/pickup/axe.ogg'
|
|
|
|
/obj/item/material/sword/axe/pre_attack(var/mob/living/target, var/mob/living/user)
|
|
if(istype(target))
|
|
cleave(user, target)
|
|
..()
|
|
|
|
/obj/item/material/sword/axe/can_woodcut()
|
|
return TRUE
|
|
|
|
/obj/item/material/sword/khopesh
|
|
name = "khopesh"
|
|
desc = "An ancient sword shapped like a sickle."
|
|
icon_state = "khopesh"
|
|
item_state = "khopesh"
|
|
slot_flags = SLOT_BELT
|
|
|
|
/obj/item/material/sword/dao
|
|
name = "dao"
|
|
desc = "A single-edged broadsword."
|
|
icon_state = "dao"
|
|
item_state = "dao"
|
|
slot_flags = SLOT_BELT
|
|
|
|
/obj/item/material/sword/gladius
|
|
name = "gladius"
|
|
desc = "An ancient short sword, designed to stab and cut."
|
|
icon_state = "gladius"
|
|
item_state = "gladius"
|
|
slot_flags = SLOT_BELT
|
|
|
|
/obj/item/material/sword/amohdan_sword
|
|
name = "amohdan blade"
|
|
desc = "A tajaran sword, commonly used by the swordsmen of the island of Amohda."
|
|
icon_state = "amohdan_sword"
|
|
item_state = "amohdan_sword"
|
|
slot_flags = SLOT_BELT
|
|
use_material_name = FALSE
|
|
applies_material_colour = FALSE
|
|
unbreakable = TRUE //amohdan steel is the finest in the spur
|
|
|
|
|
|
// improvised sword
|
|
/obj/item/material/sword/improvised_sword
|
|
name = "selfmade sword"
|
|
desc = "A crudely made, rough looking sword. Still appears to be quite deadly."
|
|
icon_state = "improvsword"
|
|
item_state = "improvsword"
|
|
var/obj/item/material/hilt //what is the handle made of?
|
|
force_divisor = 0.3
|
|
slot_flags = SLOT_BELT
|
|
|
|
/obj/item/material/sword/improvised_sword/apply_hit_effect()
|
|
. = ..()
|
|
if(!unbreakable)
|
|
if(hilt.material.is_brittle())
|
|
health = 0
|
|
else if(!prob(hilt.material.hardness))
|
|
health--
|
|
check_health()
|
|
|
|
/obj/item/material/sword/improvised_sword/proc/assignDescription()
|
|
if(hilt)
|
|
desc = "A crudely made, rough looking sword. Still appears to be quite deadly. It has a blade of [src.material], and a hilt of [hilt.material]."
|
|
else
|
|
desc = "A crudely made, rough looking sword. Still appears to be quite deadly. It has a blade of [src.material]."
|
|
|
|
// the things needed to create the above
|
|
/obj/item/material/sword_hilt
|
|
name = "hilt"
|
|
desc = "A hilt without a blade, quite useless."
|
|
icon = 'icons/obj/weapons_build.dmi'
|
|
icon_state = "swordhilt"
|
|
unbreakable = TRUE
|
|
force_divisor = 0.05
|
|
thrown_force_divisor = 0.2
|
|
|
|
/obj/item/material/sword_hilt/attackby(obj/item/attacking_item, mob/user)
|
|
if(istype(attacking_item, /obj/item/material/sword_blade))
|
|
var/obj/item/material/sword_blade/blade = attacking_item
|
|
var/obj/item/material/sword/improvised_sword/new_sword = new(src.loc, blade.material.name)
|
|
new_sword.hilt = src
|
|
user.drop_from_inventory(src,new_sword)
|
|
user.drop_from_inventory(blade,new_sword)
|
|
user.put_in_hands(new_sword)
|
|
qdel(blade)
|
|
qdel(src)
|
|
new_sword.assignDescription()
|
|
else
|
|
..()
|
|
|
|
/obj/item/material/sword_blade
|
|
name = "blade"
|
|
desc = "A blade without a hilt, don't cut yourself!"
|
|
icon = 'icons/obj/weapons_build.dmi'
|
|
icon_state = "swordblade"
|
|
unbreakable = TRUE
|
|
force_divisor = 0.20
|
|
thrown_force_divisor = 0.3
|
|
|
|
/obj/item/material/sword_blade/attackby(obj/item/attacking_item, mob/user)
|
|
if(istype(attacking_item, /obj/item/material/sword_hilt))
|
|
var/obj/item/material/sword_hilt/hilt = attacking_item
|
|
var/obj/item/material/sword/improvised_sword/new_sword = new(src.loc, src.material.name)
|
|
new_sword.hilt = hilt.material
|
|
new_sword.assignDescription()
|
|
user.drop_from_inventory(src,new_sword)
|
|
user.drop_from_inventory(hilt,new_sword)
|
|
user.put_in_hands(new_sword)
|
|
qdel(hilt)
|
|
qdel(src)
|
|
new_sword.assignDescription()
|
|
else
|
|
..()
|