mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-14 19:51:59 +00:00
## About The Pull Request This is the first PR in a series attempting to modernize our damage and armor, both from a code and a gameplay perspective. This part implements unique attack animations, adds alternate attack modes for items and fixes some minor oversights. Items now have unique attack animation based on their sharpness - sharp items are now swung in an arc, while pointy items are thrust forward. This change is ***purely visual***, this is not swing combat. (However, this does assign icon rotation data to many items, which should help swing combat later down the line). Certain items like knives and swords now have secondary attacks - right clicks will perform stabbing attacks instead of slashing for a chance to leave piercing wounds, albeit with slightly lower damage - trying to stick a katana through someone won't get you very far! https://github.com/user-attachments/assets/1f92bbcd-9aa1-482f-bc26-5e84fe2a07e1 Turns out that spears acted as oversized knives this entire time, being SHARP_EDGED instead of SHARP_POINTY - in order for their animations to make sense, they're now once again pointy (according to comment, originally they were made sharp because piercing wounds weren't very threatening, which is no longer the case) Another major change is that structure damage is now influenced by armor penetration - I am not sure if this is intentional or not, but attacking item's AP never applied to non-mob damage. Additionally, also fixes an issue where attack verbs for you and everyone else may differ.
354 lines
11 KiB
Plaintext
354 lines
11 KiB
Plaintext
/obj/item/gun/magic/wand
|
|
name = "wand"
|
|
desc = "You shouldn't have this."
|
|
ammo_type = /obj/item/ammo_casing/magic
|
|
icon_state = "nothingwand"
|
|
inhand_icon_state = "wand"
|
|
icon_angle = -45
|
|
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
|
|
base_icon_state = "nothingwand"
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
can_charge = FALSE
|
|
max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths)
|
|
var/variable_charges = TRUE
|
|
|
|
/obj/item/gun/magic/wand/Initialize(mapload)
|
|
if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges
|
|
if(prob(33))
|
|
max_charges = CEILING(max_charges / 3, 1)
|
|
else
|
|
max_charges = CEILING(max_charges / 2, 1)
|
|
return ..()
|
|
|
|
/obj/item/gun/magic/wand/examine(mob/user)
|
|
. = ..()
|
|
. += "Has [charges] charge\s remaining."
|
|
|
|
/obj/item/gun/magic/wand/update_icon_state()
|
|
icon_state = "[base_icon_state][charges ? null : "-drained"]"
|
|
return ..()
|
|
|
|
/obj/item/gun/magic/wand/attack(atom/target, mob/living/user)
|
|
if(target == user)
|
|
return
|
|
..()
|
|
|
|
/obj/item/gun/magic/wand/try_fire_gun(atom/target, mob/living/user, params)
|
|
if(!charges)
|
|
shoot_with_empty_chamber(user)
|
|
return FALSE
|
|
if(target == user)
|
|
if(no_den_usage && istype(get_area(user), /area/centcom/wizard_station))
|
|
to_chat(user, span_warning("You know better than to violate the security of The Den, best wait until you leave to use [src]."))
|
|
return FALSE
|
|
zap_self(user)
|
|
. = TRUE
|
|
|
|
else
|
|
. = ..()
|
|
|
|
if(.)
|
|
update_appearance()
|
|
return .
|
|
|
|
/obj/item/gun/magic/wand/proc/zap_self(mob/living/user)
|
|
user.visible_message(span_danger("[user] zaps [user.p_them()]self with [src]."))
|
|
playsound(user, fire_sound, 50, TRUE)
|
|
user.log_message("zapped [user.p_them()]self with a <b>[src]</b>", LOG_ATTACK)
|
|
|
|
|
|
/////////////////////////////////////
|
|
//WAND OF DEATH
|
|
/////////////////////////////////////
|
|
|
|
/obj/item/gun/magic/wand/death
|
|
name = "wand of death"
|
|
desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail."
|
|
school = SCHOOL_NECROMANCY
|
|
fire_sound = 'sound/effects/magic/wandodeath.ogg'
|
|
ammo_type = /obj/item/ammo_casing/magic/death
|
|
icon_state = "deathwand"
|
|
base_icon_state = "deathwand"
|
|
max_charges = 3 //3, 2, 2, 1
|
|
|
|
/obj/item/gun/magic/wand/death/zap_self(mob/living/user)
|
|
..()
|
|
charges--
|
|
if(user.can_block_magic())
|
|
user.visible_message(span_warning("[src] has no effect on [user]!"))
|
|
return
|
|
if(isliving(user))
|
|
var/mob/living/L = user
|
|
if(L.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead
|
|
user.revive(ADMIN_HEAL_ALL, force_grab_ghost = TRUE) // This heals suicides
|
|
to_chat(user, span_notice("You feel great!"))
|
|
return
|
|
to_chat(user, span_warning("You irradiate yourself with pure negative energy! \
|
|
[pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You die...","Do you want your possessions identified?")]"))
|
|
user.death(FALSE)
|
|
|
|
/obj/item/gun/magic/wand/death/debug
|
|
desc = "In some obscure circles, this is known as the 'cloning tester's friend'."
|
|
max_charges = 500
|
|
variable_charges = FALSE
|
|
can_charge = TRUE
|
|
recharge_rate = 1
|
|
|
|
|
|
/////////////////////////////////////
|
|
//WAND OF HEALING
|
|
/////////////////////////////////////
|
|
|
|
/obj/item/gun/magic/wand/resurrection
|
|
name = "wand of healing"
|
|
desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason."
|
|
school = SCHOOL_RESTORATION
|
|
ammo_type = /obj/item/ammo_casing/magic/heal
|
|
fire_sound = 'sound/effects/magic/staff_healing.ogg'
|
|
icon_state = "revivewand"
|
|
base_icon_state = "revivewand"
|
|
max_charges = 10 //10, 5, 5, 4
|
|
|
|
/obj/item/gun/magic/wand/resurrection/zap_self(mob/living/user)
|
|
..()
|
|
charges--
|
|
if(user.can_block_magic())
|
|
user.visible_message(span_warning("[src] has no effect on [user]!"))
|
|
return
|
|
if(isliving(user))
|
|
var/mob/living/L = user
|
|
if(L.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead
|
|
to_chat(user, span_warning("You irradiate yourself with pure positive energy! \
|
|
[pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You die...","Do you want your possessions identified?")]"))
|
|
user.investigate_log("has been killed by a bolt of resurrection.", INVESTIGATE_DEATHS)
|
|
user.death(FALSE)
|
|
return
|
|
user.revive(ADMIN_HEAL_ALL, force_grab_ghost = TRUE) // This heals suicides
|
|
to_chat(user, span_notice("You feel great!"))
|
|
|
|
/obj/item/gun/magic/wand/resurrection/debug //for testing
|
|
desc = "Is it possible for something to be even more powerful than regular magic? This wand is."
|
|
max_charges = 500
|
|
variable_charges = FALSE
|
|
can_charge = TRUE
|
|
recharge_rate = 1
|
|
|
|
/////////////////////////////////////
|
|
//WAND OF POLYMORPH
|
|
/////////////////////////////////////
|
|
|
|
/obj/item/gun/magic/wand/polymorph
|
|
name = "wand of polymorph"
|
|
desc = "This wand is attuned to chaos and will radically alter the victim's form."
|
|
school = SCHOOL_TRANSMUTATION
|
|
ammo_type = /obj/item/ammo_casing/magic/change
|
|
icon_state = "polywand"
|
|
base_icon_state = "polywand"
|
|
fire_sound = 'sound/effects/magic/staff_change.ogg'
|
|
max_charges = 10 //10, 5, 5, 4
|
|
|
|
/obj/item/gun/magic/wand/polymorph/zap_self(mob/living/user)
|
|
. = ..() //because the user mob ceases to exists by the time wabbajack fully resolves
|
|
|
|
user.wabbajack()
|
|
charges--
|
|
|
|
/////////////////////////////////////
|
|
//WAND OF TELEPORTATION
|
|
/////////////////////////////////////
|
|
|
|
/obj/item/gun/magic/wand/teleport
|
|
name = "wand of teleportation"
|
|
desc = "This wand will wrench targets through space and time to move them somewhere else."
|
|
school = SCHOOL_TRANSLOCATION
|
|
ammo_type = /obj/item/ammo_casing/magic/teleport
|
|
fire_sound = 'sound/effects/magic/wand_teleport.ogg'
|
|
icon_state = "telewand"
|
|
base_icon_state = "telewand"
|
|
max_charges = 10 //10, 5, 5, 4
|
|
no_den_usage = TRUE
|
|
|
|
/obj/item/gun/magic/wand/teleport/zap_self(mob/living/user)
|
|
if(do_teleport(user, user, 10, channel = TELEPORT_CHANNEL_MAGIC))
|
|
var/datum/effect_system/fluid_spread/smoke/smoke = new
|
|
smoke.set_up(3, holder = src, location = user.loc)
|
|
smoke.start()
|
|
charges--
|
|
..()
|
|
|
|
/obj/item/gun/magic/wand/safety
|
|
name = "wand of safety"
|
|
desc = "This wand will use the lightest of bluespace currents to gently place the target somewhere safe."
|
|
school = SCHOOL_TRANSLOCATION
|
|
ammo_type = /obj/item/ammo_casing/magic/safety
|
|
fire_sound = 'sound/effects/magic/wand_teleport.ogg'
|
|
icon_state = "telewand"
|
|
base_icon_state = "telewand"
|
|
max_charges = 10 //10, 5, 5, 4
|
|
no_den_usage = FALSE
|
|
|
|
/obj/item/gun/magic/wand/safety/zap_self(mob/living/user)
|
|
var/turf/origin = get_turf(user)
|
|
var/turf/destination = find_safe_turf(extended_safety_checks = TRUE)
|
|
|
|
if(do_teleport(user, destination, channel=TELEPORT_CHANNEL_MAGIC))
|
|
for(var/t in list(origin, destination))
|
|
var/datum/effect_system/fluid_spread/smoke/smoke = new
|
|
smoke.set_up(0, holder = src, location = t)
|
|
smoke.start()
|
|
..()
|
|
|
|
/obj/item/gun/magic/wand/safety/debug
|
|
desc = "This wand has 'find_safe_turf()' engraved into its blue wood. Perhaps it's a secret message?"
|
|
max_charges = 500
|
|
variable_charges = FALSE
|
|
can_charge = TRUE
|
|
recharge_rate = 1
|
|
|
|
|
|
/////////////////////////////////////
|
|
//WAND OF DOOR CREATION
|
|
/////////////////////////////////////
|
|
|
|
/obj/item/gun/magic/wand/door
|
|
name = "wand of door creation"
|
|
desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics."
|
|
school = SCHOOL_TRANSMUTATION
|
|
ammo_type = /obj/item/ammo_casing/magic/door
|
|
icon_state = "doorwand"
|
|
base_icon_state = "doorwand"
|
|
fire_sound = 'sound/effects/magic/staff_door.ogg'
|
|
max_charges = 20 //20, 10, 10, 7
|
|
no_den_usage = 1
|
|
|
|
/obj/item/gun/magic/wand/door/zap_self(mob/living/user)
|
|
to_chat(user, span_notice("You feel vaguely more open with your feelings."))
|
|
charges--
|
|
..()
|
|
|
|
/////////////////////////////////////
|
|
//WAND OF FIREBALL
|
|
/////////////////////////////////////
|
|
|
|
/obj/item/gun/magic/wand/fireball
|
|
name = "wand of fireball"
|
|
desc = "This wand shoots scorching balls of fire that explode into destructive flames."
|
|
school = SCHOOL_EVOCATION
|
|
fire_sound = 'sound/effects/magic/fireball.ogg'
|
|
ammo_type = /obj/item/ammo_casing/magic/fireball
|
|
icon_state = "firewand"
|
|
base_icon_state = "firewand"
|
|
max_charges = 8 //8, 4, 4, 3
|
|
|
|
/obj/item/gun/magic/wand/fireball/zap_self(mob/living/user)
|
|
..()
|
|
explosion(user, devastation_range = -1, light_impact_range = 2, flame_range = 2, flash_range = 3, adminlog = FALSE, explosion_cause = src)
|
|
charges--
|
|
|
|
/////////////////////////////////////
|
|
//WAND OF NOTHING
|
|
/////////////////////////////////////
|
|
|
|
/obj/item/gun/magic/wand/nothing
|
|
name = "wand of nothing"
|
|
desc = "It's not just a stick, it's a MAGIC stick?"
|
|
ammo_type = /obj/item/ammo_casing/magic/nothing
|
|
|
|
|
|
/////////////////////////////////////
|
|
//WAND OF SHRINKING
|
|
/////////////////////////////////////
|
|
|
|
/obj/item/gun/magic/wand/shrink
|
|
name = "wand of shrinking"
|
|
desc = "Feel the tiny eldritch terror of an itty... bitty... head!"
|
|
ammo_type = /obj/item/ammo_casing/magic/shrink/wand
|
|
icon_state = "shrinkwand"
|
|
base_icon_state = "shrinkwand"
|
|
fire_sound = 'sound/effects/magic/staff_shrink.ogg'
|
|
max_charges = 10 //10, 5, 5, 4
|
|
no_den_usage = TRUE
|
|
w_class = WEIGHT_CLASS_TINY
|
|
|
|
/obj/item/gun/magic/wand/shrink/zap_self(mob/living/user)
|
|
to_chat(user, span_notice("The world grows large..."))
|
|
charges--
|
|
user.AddComponent(/datum/component/shrink, -1) // small forever
|
|
return ..()
|
|
|
|
// Wand of debugging
|
|
|
|
#ifdef TESTING
|
|
|
|
/obj/item/gun/magic/wand/antag
|
|
name = "wand of antag"
|
|
desc = "This wand uses the powers of bullshit to turn anyone it hits into an antag"
|
|
school = SCHOOL_FORBIDDEN
|
|
ammo_type = /obj/item/ammo_casing/magic/antag
|
|
icon_state = "revivewand"
|
|
base_icon_state = "revivewand"
|
|
color = COLOR_ADMIN_PINK
|
|
max_charges = 99999
|
|
|
|
/obj/item/gun/magic/wand/antag/zap_self(mob/living/user)
|
|
. = ..()
|
|
var/obj/item/ammo_casing/magic/antag/casing = new ammo_type()
|
|
var/obj/projectile/magic/magic_proj = casing.projectile_type
|
|
magic_proj = new magic_proj(src)
|
|
magic_proj.on_hit(user)
|
|
QDEL_NULL(casing)
|
|
|
|
/obj/item/ammo_casing/magic/antag
|
|
projectile_type = /obj/projectile/magic/antag
|
|
harmful = FALSE
|
|
|
|
/obj/projectile/magic/antag
|
|
name = "bolt of antag"
|
|
icon_state = "ion"
|
|
var/antag = /datum/antagonist/traitor
|
|
|
|
/obj/projectile/magic/antag/on_hit(atom/target, blocked, pierce_hit)
|
|
. = ..()
|
|
|
|
if(isliving(target))
|
|
var/mob/living/victim = target
|
|
if(isnull(victim.mind))
|
|
victim.mind_initialize()
|
|
if(victim.mind.has_antag_datum(antag))
|
|
victim.mind.remove_antag_datum(antag)
|
|
to_chat(world, "removed")
|
|
else
|
|
victim.mind.add_antag_datum(antag)
|
|
to_chat(world, "added")
|
|
|
|
/obj/item/gun/magic/wand/antag/heretic
|
|
name = "wand of antag heretic"
|
|
desc = "This wand uses the powers of bullshit to turn anyone it hits into an antag heretic"
|
|
color = COLOR_GREEN
|
|
ammo_type = /obj/item/ammo_casing/magic/antag/heretic
|
|
|
|
/obj/item/ammo_casing/magic/antag/heretic
|
|
projectile_type = /obj/projectile/magic/antag/heretic
|
|
|
|
/obj/projectile/magic/antag/heretic
|
|
name = "bolt of antag heretic"
|
|
icon_state = "ion"
|
|
antag = /datum/antagonist/heretic
|
|
|
|
/obj/item/gun/magic/wand/antag/cult
|
|
name = "wand of antag cultist"
|
|
desc = "This wand uses the powers of bullshit to turn anyone it hits into an antag cultist"
|
|
color = COLOR_CULT_RED
|
|
ammo_type = /obj/item/ammo_casing/magic/antag/cult
|
|
|
|
/obj/item/ammo_casing/magic/antag/cult
|
|
projectile_type = /obj/projectile/magic/antag/cult
|
|
|
|
/obj/projectile/magic/antag/cult
|
|
name = "bolt of antag cult"
|
|
icon_state = "ion"
|
|
antag = /datum/antagonist/cult
|
|
|
|
#endif
|