mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-13 03:02:38 +00:00
## About The Pull Request 123 changed files and multiple crashes after writing broken regex, I replaced most remains of direct spans with macros. This cleans up the code and makes it easier to work with in general, see justification for the original PR. I also fixed a bunch of broken and/or unclosed spans here too. I intentionally avoided replacing spans with multiple classes (in most cases) and spans in the middle of strings as it would impact readability (in my opinion at least) and could be done later if required. ## Why It's Good For The Game Cleaner code, actually using our macros, fixes borked HTML in some places. See original PR. ## Changelog Nothing player-facing
353 lines
11 KiB
Plaintext
353 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"
|
|
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
|