Revert "12/21 modernizations from TG live"

This commit is contained in:
LetterJay
2016-12-22 22:35:44 -06:00
committed by GitHub
parent cf59ac1c3d
commit ae40d4134e
2215 changed files with 86928 additions and 707332 deletions
+13 -69
View File
@@ -1,66 +1,14 @@
#define TARGET_CLOSEST 1
#define TARGET_RANDOM 2
/obj/effect/proc_holder
var/panel = "Debug"//What panel the proc holder needs to go on.
var/active = FALSE //Used by toggle based abilities.
var/ranged_mousepointer
var/mob/living/ranged_ability_user
var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin verb for now
/obj/effect/proc_holder/Destroy()
if(ranged_ability_user)
remove_ranged_ability()
return ..()
/obj/effect/proc_holder/proc/InterceptClickOn(mob/user, params, atom/A)
return
/obj/effect/proc_holder/proc/InterceptClickOn(mob/living/caller, params, atom/A)
if(caller.ranged_ability != src || ranged_ability_user != caller) //I'm not actually sure how these would trigger, but, uh, safety, I guess?
caller << "<span class='warning'><b>[caller.ranged_ability.name]</b> has been disabled."
caller.ranged_ability.remove_ranged_ability()
return TRUE //TRUE for failed, FALSE for passed.
ranged_ability_user.next_click = world.time + CLICK_CD_CLICK_ABILITY
ranged_ability_user.face_atom(A)
return FALSE
/obj/effect/proc_holder/proc/add_ranged_ability(mob/living/user, msg, forced)
if(!user || !user.client)
return
if(user.ranged_ability && user.ranged_ability != src)
if(forced)
user << "<span class='warning'><b>[user.ranged_ability.name]</b> has been replaced by <b>[name]</b>."
user.ranged_ability.remove_ranged_ability()
else
return
user.ranged_ability = src
user.client.click_intercept = user.ranged_ability
add_mousepointer(user.client)
ranged_ability_user = user
if(msg)
ranged_ability_user << msg
active = TRUE
update_icon()
/obj/effect/proc_holder/proc/add_mousepointer(client/C)
if(C && ranged_mousepointer && C.mouse_pointer_icon == initial(C.mouse_pointer_icon))
C.mouse_pointer_icon = ranged_mousepointer
/obj/effect/proc_holder/proc/remove_mousepointer(client/C)
if(C && ranged_mousepointer && C.mouse_pointer_icon == ranged_mousepointer)
C.mouse_pointer_icon = initial(C.mouse_pointer_icon)
/obj/effect/proc_holder/proc/remove_ranged_ability(msg)
if(!ranged_ability_user || !ranged_ability_user.client || (ranged_ability_user.ranged_ability && ranged_ability_user.ranged_ability != src)) //To avoid removing the wrong ability
return
ranged_ability_user.ranged_ability = null
ranged_ability_user.client.click_intercept = null
remove_mousepointer(ranged_ability_user.client)
if(msg)
ranged_ability_user << msg
ranged_ability_user = null
active = FALSE
update_icon()
/obj/effect/proc_holder/spell
name = "Spell"
@@ -113,10 +61,10 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/critfailchance = 0
var/centcom_cancast = 1 //Whether or not the spell should be allowed on z2
var/datum/action/spell_action/action = null
var/action_icon = 'icons/mob/actions.dmi'
var/action_icon_state = "spell_default"
var/action_background_icon_state = "bg_spell"
var/datum/action/spell_action/action
/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell
@@ -160,18 +108,14 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
user << "<span class='notice'>You can't get the words out!</span>"
return 0
var/list/casting_clothes = typecacheof(list(/obj/item/clothing/suit/wizrobe,
/obj/item/clothing/suit/space/hardsuit/wizard,
/obj/item/clothing/head/wizard,
/obj/item/clothing/head/helmet/space/hardsuit/wizard,
/obj/item/clothing/suit/space/hardsuit/shielded/wizard,
/obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard))
if(clothes_req) //clothes check
if(!is_type_in_typecache(H.wear_suit, casting_clothes))
if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/wizard))
H << "<span class='notice'>I don't feel strong enough without my robe.</span>"
return 0
if(!is_type_in_typecache(H.head, casting_clothes))
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
H << "<span class='notice'>I don't feel strong enough without my sandals.</span>"
return 0
if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/wizard))
H << "<span class='notice'>I don't feel strong enough without my hat.</span>"
return 0
if(cult_req) //CULT_REQ CLOTHES CHECK
@@ -267,9 +211,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(overlay)
for(var/atom/target in targets)
var/location
if(isliving(target))
if(istype(target,/mob/living))
location = target.loc
else if(isturf(target))
else if(istype(target,/turf))
location = target
var/obj/effect/overlay/spell = new /obj/effect/overlay(location)
spell.icon = overlay_icon
@@ -281,11 +225,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
/obj/effect/proc_holder/spell/proc/after_cast(list/targets)
for(var/atom/target in targets)
var/location
if(isliving(target))
if(istype(target,/mob/living))
location = target.loc
else if(isturf(target))
else if(istype(target,/turf))
location = target
if(isliving(target) && message)
if(istype(target,/mob/living) && message)
target << text("[message]")
if(sparks_spread)
var/datum/effect_system/spark_spread/sparks = new
+1 -1
View File
@@ -47,4 +47,4 @@
target.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1)
playsound(get_turf(target), mSounds[randM], 50, 1)
target.flash_act()
target.flash_eyes()
+12 -18
View File
@@ -14,11 +14,11 @@
/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets,mob/user = usr)
for(var/mob/living/L in targets)
var/list/hand_items = list(L.get_active_held_item(),L.get_inactive_held_item())
var/list/hand_items = list(L.get_active_hand(),L.get_inactive_hand())
var/charged_item = null
var/burnt_out = 0
if(L.pulling && isliving(L.pulling))
if(L.pulling && (istype(L.pulling, /mob/living)))
var/mob/living/M = L.pulling
if(M.mob_spell_list.len != 0 || (M.mind && M.mind.spell_list.len != 0))
for(var/obj/effect/proc_holder/spell/S in M.mob_spell_list)
@@ -58,17 +58,15 @@
if(istype(item,/obj/item/weapon/gun/magic/wand) && I.max_charges != 0)
var/obj/item/weapon/gun/magic/W = item
W.icon_state = initial(W.icon_state)
I.process_chamber()
charged_item = I
break
else if(istype(item, /obj/item/weapon/stock_parts/cell/))
var/obj/item/weapon/stock_parts/cell/C = item
if(!C.self_recharge)
if(prob(80))
C.maxcharge -= 200
if(C.maxcharge <= 1) //Div by 0 protection
C.maxcharge = 1
burnt_out = 1
if(prob(80))
C.maxcharge -= 200
if(C.maxcharge <= 1) //Div by 0 protection
C.maxcharge = 1
burnt_out = 1
C.charge = C.maxcharge
charged_item = C
break
@@ -77,16 +75,12 @@
for(I in item.contents)
if(istype(I, /obj/item/weapon/stock_parts/cell/))
var/obj/item/weapon/stock_parts/cell/C = I
if(!C.self_recharge)
if(prob(80))
C.maxcharge -= 200
if(C.maxcharge <= 1) //Div by 0 protection
C.maxcharge = 1
burnt_out = 1
if(prob(80))
C.maxcharge -= 200
if(C.maxcharge <= 1) //Div by 0 protection
C.maxcharge = 1
burnt_out = 1
C.charge = C.maxcharge
if(istype(C.loc,/obj/item/weapon/gun))
var/obj/item/weapon/gun/G = C.loc
G.process_chamber()
item.update_icon()
charged_item = item
break
+1 -32
View File
@@ -38,7 +38,7 @@
for(var/varName in newVars)
if(varName in summoned_object.vars)
summoned_object.vars[varName] = newVars[varName]
summoned_object.admin_spawned = TRUE
if(summon_lifespan)
QDEL_IN(summoned_object, summon_lifespan)
@@ -50,34 +50,3 @@
summon_amt = 10
range = 3
newVars = list("emagged" = 2, "remote_disabled" = 1,"shoot_sound" = 'sound/weapons/laser.ogg',"projectile" = /obj/item/projectile/beam/laser, "declare_arrests" = 0,"name" = "Wizard's Justicebot")
/obj/effect/proc_holder/spell/targeted/conjure_item
name = "Summon weapon"
desc = "A generic spell that should not exist. This summons an instance of a specific type of item, or if one already exists, un-summons it. Summons into hand if possible."
invocation_type = "none"
include_user = 1
range = -1
clothes_req = 0
var/obj/item/item
var/item_type = /obj/item/weapon/banhammer
school = "conjuration"
charge_max = 150
cooldown_min = 10
/obj/effect/proc_holder/spell/targeted/conjure_item/cast(list/targets, mob/user = usr)
if (item && !qdeleted(item))
qdel(item)
item = null
else
for(var/mob/living/carbon/C in targets)
if(C.drop_item())
item = make_item()
C.put_in_hands(item)
/obj/effect/proc_holder/spell/targeted/conjure_item/Destroy()
if(item)
qdel(item)
return ..()
/obj/effect/proc_holder/spell/targeted/conjure_item/proc/make_item()
return new item_type
@@ -105,11 +105,19 @@
range = -1
include_user = 1
jaunt_duration = 50 //in deciseconds
centcom_cancast = 0 //Stop people from getting to centcom
action_icon_state = "phaseshift"
action_background_icon_state = "bg_demon"
jaunt_in_time = 12
jaunt_in_type = /obj/effect/overlay/temp/dir_setting/wraith
jaunt_out_type = /obj/effect/overlay/temp/dir_setting/wraith/out
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_disappear(atom/movable/overlay/animation, mob/living/target)
animation.icon_state = "phase_shift"
animation.setDir(target.dir)
flick("phase_shift",animation)
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_reappear(atom/movable/overlay/animation, mob/living/target)
animation.icon_state = "phase_shift2"
animation.setDir(target.dir)
flick("phase_shift2",animation)
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_steam(mobloc)
return
+57 -90
View File
@@ -1,11 +1,12 @@
/obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork
/obj/effect/proc_holder/spell/targeted/summon_pitchfork
name = "Summon Pitchfork"
desc = "A devil's weapon of choice. Use this to summon/unsummon your pitchfork."
invocation_type = "none"
include_user = 1
range = -1
clothes_req = 0
item_type = /obj/item/weapon/twohanded/pitchfork/demonic
var/obj/item/weapon/twohanded/pitchfork/demonic/pitchfork
var/pitchfork_type = /obj/item/weapon/twohanded/pitchfork/demonic/
school = "conjuration"
charge_max = 150
@@ -13,20 +14,25 @@
action_icon_state = "pitchfork"
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/greater
item_type = /obj/item/weapon/twohanded/pitchfork/demonic/greater
/obj/effect/proc_holder/spell/targeted/summon_pitchfork/cast(list/targets, mob/user = usr)
if (pitchfork)
qdel(pitchfork)
else
for(var/mob/living/carbon/C in targets)
if(C.drop_item())
pitchfork = new pitchfork_type
C.put_in_hands(pitchfork)
/obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/ascended
item_type = /obj/item/weapon/twohanded/pitchfork/demonic/ascended
/obj/effect/proc_holder/spell/targeted/summon_pitchfork/Del()
if(pitchfork)
qdel(pitchfork)
/obj/effect/proc_holder/spell/targeted/summon_pitchfork/greater
pitchfork_type = /obj/item/weapon/twohanded/pitchfork/demonic/greater
/obj/effect/proc_holder/spell/targeted/summon_pitchfork/ascended
pitchfork_type = /obj/item/weapon/twohanded/pitchfork/demonic/ascended
/obj/effect/proc_holder/spell/targeted/conjure_item/violin
item_type = /obj/item/device/instrument/violin/golden
desc = "A devil's instrument of choice. Use this to summon/unsummon your golden violin."
invocation_type = "whisper"
invocation = "I aint have this much fun since Georgia."
action_icon_state = "golden_violin"
name = "Summon golden violin"
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/targeted/summon_contract
name = "Summon infernal contract"
@@ -66,10 +72,10 @@
contract = new /obj/item/weapon/paper/contract/infernal/knowledge(C.loc, C.mind, user.mind)
C.put_in_hands(contract)
else
user << "<span class='notice'>[C] seems to not be sentient. You cannot summon a contract for [C.p_them()].</span>"
user << "<span class='notice'>[C] seems to not be sentient. You cannot summon a contract for them.</span>"
/obj/effect/proc_holder/spell/fireball/hellish
/obj/effect/proc_holder/spell/dumbfire/fireball/hellish
name = "Hellfire"
desc = "This spell launches hellfire at the target."
@@ -80,14 +86,22 @@
invocation_type = "shout"
range = 2
fireball_type = /obj/item/projectile/magic/fireball/infernal
proj_icon_state = "fireball"
proj_name = "a fireball"
proj_type = /obj/effect/proc_holder/spell/turf/fireball/infernal
proj_lifespan = 200
proj_step_delay = 1
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/turf/fireball/infernal/cast(turf/T,mob/user = usr)
explosion(T, -1, -1, 1, 4, 0, flame_range = 5)
/obj/effect/proc_holder/spell/targeted/infernal_jaunt
name = "Infernal Jaunt"
desc = "Use hellfire to phase out of existence."
charge_max = 200
charge_max = 10
clothes_req = 0
selection_type = "range"
range = -1
@@ -102,17 +116,12 @@
if(istype(user))
if(istype(user.loc, /obj/effect/dummy/slaughter/))
var/continuing = 0
if(istype(get_area(user), /area/shuttle/)) // Can always phase in in a shuttle.
continuing = 1
else
for(var/mob/living/C in orange(2, get_turf(user.loc))) //Can also phase in when nearby a potential buyer.
if (C.mind && C.mind.soulOwner == C.mind)
continuing = 1
break
for(var/mob/living/C in orange(2, get_turf(user.loc)))
if (C.mind && C.mind.soulOwner == C.mind)
continuing = 1
break
if(continuing)
user << "<span class='warning'>You are now phasing in.</span>"
if(do_mob(user,user,150))
user.infernalphasein()
addtimer(user,"infernalphasein",150,TRUE)
else
user << "<span class='warning'>You can only re-appear near a potential signer."
revert_cast()
@@ -120,23 +129,21 @@
else
user.notransform = 1
user.fakefire()
src << "<span class='warning'>You begin to phase back into sinful flames.</span>"
if(do_mob(user,user,150))
user.infernalphaseout()
else
user << "<span class='warning'>You must remain still while exiting.</span>"
user.ExtinguishMob()
addtimer(user, "infernalphaseout",150,TRUE,get_turf(user))
start_recharge()
return
revert_cast()
/mob/living/proc/infernalphaseout()
/mob/living/proc/infernalphaseout(var/turf/mobloc)
if(get_turf(src) != mobloc)
src << "<span class='warning'>You must remain still while exiting."
return
dust_animation()
spawn_dust()
src.visible_message("<span class='warning'>[src] disappears in a flashfire!</span>")
playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
var/obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,loc)
var/obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,mobloc)
src.ExtinguishMob()
if(buckled)
buckled.unbuckle_mob(src,force=1)
@@ -160,7 +167,20 @@
src.client.eye = src
src.visible_message("<span class='warning'><B>[src] appears in a firey blaze!</B>")
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
addtimer(src, "fakefireextinguish", 15, TIMER_UNIQUE)
addtimer(src, "fakefireextinguish" ,15,TRUE,get_turf(src))
/mob/living/proc/fakefire()
return
/mob/living/carbon/fakefire(var/fire_icon = "Generic_mob_burning")
overlays_standing[FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"= fire_icon, "layer"=-FIRE_LAYER)
apply_overlay(FIRE_LAYER)
/mob/living/proc/fakefireextinguish()
return
/mob/living/carbon/fakefireextinguish()
remove_overlay(FIRE_LAYER)
/obj/effect/proc_holder/spell/targeted/sintouch
name = "Sin Touch"
@@ -196,56 +216,3 @@
H.influenceSin()
H.Weaken(2)
H.Stun(2)
/obj/effect/proc_holder/spell/targeted/summon_dancefloor
name = "Summon Dancefloor"
desc = "When what a Devil really needs is funk."
include_user = 1
range = -1
clothes_req = 0
school = "conjuration"
charge_max = 10
cooldown_min = 50 //5 seconds, so the smoke can't be spammed
action_icon_state = "funk"
action_background_icon_state = "bg_demon"
var/list/dancefloor_turfs
var/list/dancefloor_turfs_types
var/dancefloor_exists = FALSE
var/datum/effect_system/smoke_spread/transparent/dancefloor_devil/smoke
/obj/effect/proc_holder/spell/targeted/summon_dancefloor/cast(list/targets, mob/user = usr)
LAZYINITLIST(dancefloor_turfs)
LAZYINITLIST(dancefloor_turfs_types)
if(!smoke)
smoke = new()
smoke.set_up(0, get_turf(user))
smoke.start()
if(dancefloor_exists)
dancefloor_exists = FALSE
for(var/i in 1 to dancefloor_turfs.len)
var/turf/T = dancefloor_turfs[i]
T.ChangeTurf(dancefloor_turfs_types[i])
else
dancefloor_exists = TRUE
var/i = 1
var/list/funky_turfs = RANGE_TURFS(1, user)
dancefloor_turfs.len = funky_turfs.len
dancefloor_turfs_types.len = funky_turfs.len
for(var/t in funky_turfs)
var/turf/T = t
dancefloor_turfs[i] = T
dancefloor_turfs_types[i] = T.type
T.ChangeTurf((i % 2 == 0) ? /turf/open/floor/light/colour_cycle/dancefloor_a : /turf/open/floor/light/colour_cycle/dancefloor_b)
i++
/datum/effect_system/smoke_spread/transparent/dancefloor_devil
effect_type = /obj/effect/particle_effect/smoke/transparent/dancefloor_devil
/obj/effect/particle_effect/smoke/transparent/dancefloor_devil
lifetime = 2
@@ -10,58 +10,73 @@
range = -1
cooldown_min = 100 //50 deciseconds reduction per rank
include_user = 1
centcom_cancast = 0 //Prevent people from getting to centcom
nonabstract_req = 1
var/jaunt_duration = 50 //in deciseconds
var/jaunt_in_time = 5
var/jaunt_in_type = /obj/effect/overlay/temp/wizard
var/jaunt_out_type = /obj/effect/overlay/temp/wizard/out
action_icon_state = "jaunt"
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets,mob/user = usr) //magnets, so mostly hardcoded
playsound(get_turf(user), 'sound/magic/Ethereal_Enter.ogg', 50, 1, -1)
for(var/mob/living/target in targets)
addtimer(src, "do_jaunt", 0, TIMER_NORMAL, target)
target.notransform = 1 //protects the mob from being transformed (replaced) midjaunt and getting stuck in bluespace
spawn(0)
var/turf/mobloc = get_turf(target.loc)
var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( mobloc )
var/atom/movable/overlay/animation = new /atom/movable/overlay( mobloc )
animation.name = "water"
animation.density = 0
animation.anchored = 1
animation.icon = 'icons/mob/mob.dmi'
animation.layer = FLY_LAYER
animation.master = holder
target.ExtinguishMob()
if(target.buckled)
target.buckled.unbuckle_mob(target,force=1)
if(target.pulledby)
target.pulledby.stop_pulling()
target.stop_pulling()
if(target.has_buckled_mobs())
target.unbuckle_all_mobs(force=1)
jaunt_disappear(animation, target)
target.loc = holder
target.reset_perspective(holder)
target.notransform=0 //mob is safely inside holder now, no need for protection.
jaunt_steam(mobloc)
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/do_jaunt(mob/living/target)
target.notransform = 1
var/turf/mobloc = get_turf(target)
var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt(mobloc)
PoolOrNew(jaunt_out_type, list(mobloc, holder.dir))
target.ExtinguishMob()
if(target.buckled)
target.buckled.unbuckle_mob(target,force=1)
if(target.pulledby)
target.pulledby.stop_pulling()
target.stop_pulling()
if(target.has_buckled_mobs())
target.unbuckle_all_mobs(force=1)
target.loc = holder
target.reset_perspective(holder)
target.notransform=0 //mob is safely inside holder now, no need for protection.
jaunt_steam(mobloc)
sleep(jaunt_duration)
sleep(jaunt_duration)
if(target.loc != holder) //mob warped out of the warp
qdel(holder)
return
mobloc = get_turf(target.loc)
animation.loc = mobloc
jaunt_steam(mobloc)
target.canmove = 0
holder.reappearing = 1
playsound(get_turf(user), 'sound/magic/Ethereal_Exit.ogg', 50, 1, -1)
sleep(20)
if(!qdeleted(target))
jaunt_reappear(animation, target)
sleep(5)
qdel(animation)
qdel(holder)
if(!qdeleted(target))
if(mobloc.density)
for(var/direction in list(1,2,4,8,5,6,9,10))
var/turf/T = get_step(mobloc, direction)
if(T)
if(target.Move(T))
break
target.canmove = 1
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_disappear(atom/movable/overlay/animation, mob/living/target)
animation.icon_state = "liquify"
flick("liquify",animation)
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_reappear(atom/movable/overlay/animation, mob/living/target)
flick("reappear",animation)
if(target.loc != holder) //mob warped out of the warp
qdel(holder)
return
mobloc = get_turf(target.loc)
jaunt_steam(mobloc)
target.canmove = 0
holder.reappearing = 1
playsound(get_turf(target), 'sound/magic/Ethereal_Exit.ogg', 50, 1, -1)
sleep(25 - jaunt_in_time)
PoolOrNew(jaunt_in_type, list(mobloc, holder.dir))
sleep(jaunt_in_time)
qdel(holder)
if(!qdeleted(target))
if(mobloc.density)
for(var/direction in alldirs)
var/turf/T = get_step(mobloc, direction)
if(T)
if(target.Move(T))
break
target.canmove = 1
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_steam(mobloc)
var/datum/effect_system/steam_spread/steam = new /datum/effect_system/steam_spread()
@@ -77,7 +92,7 @@
density = 0
anchored = 1
invisibility = 60
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
burn_state = LAVA_PROOF
/obj/effect/dummy/spell_jaunt/Destroy()
// Eject contents if deleted somehow
@@ -88,7 +103,6 @@
/obj/effect/dummy/spell_jaunt/relaymove(var/mob/user, direction)
if (!src.canmove || reappearing || !direction) return
var/turf/newLoc = get_step(src,direction)
setDir(direction)
if(!(newLoc.flags & NOJAUNT))
loc = newLoc
else
@@ -1,36 +0,0 @@
/obj/effect/proc_holder/spell/targeted/forcewall
name = "Forcewall"
desc = "Create a magical barrier that only you can pass through. Does not require wizard garb."
school = "transmutation"
charge_max = 100
clothes_req = 0
invocation = "TARCOL MINTI ZHERI"
invocation_type = "shout"
sound = "sound/magic/ForceWall.ogg"
action_icon_state = "shield"
range = -1
include_user = 1
cooldown_min = 50 //12 deciseconds reduction per rank
/obj/effect/proc_holder/spell/targeted/forcewall/cast(list/targets,mob/user = usr)
new /obj/effect/forcefield/wizard(get_turf(user),user)
if(user.dir == SOUTH || user.dir == NORTH)
new /obj/effect/forcefield/wizard(get_step(user, EAST),user)
new /obj/effect/forcefield/wizard(get_step(user, WEST),user)
else
new /obj/effect/forcefield/wizard(get_step(user, NORTH),user)
new /obj/effect/forcefield/wizard(get_step(user, SOUTH),user)
/obj/effect/forcefield/wizard
var/mob/wizard
/obj/effect/forcefield/wizard/New(atom/loc, mob/summoner)
..()
wizard = summoner
QDEL_IN(src, 300)
/obj/effect/forcefield/wizard/CanPass(atom/movable/mover, turf/target, height=0)
if(mover == wizard)
return 1
return 0
+1 -1
View File
@@ -8,7 +8,7 @@
icon_state = "syndballoon"
item_state = null
flags = ABSTRACT | NODROP
w_class = WEIGHT_CLASS_HUGE
w_class = 5
force = 0
throwforce = 0
throw_range = 0
@@ -1,6 +1,6 @@
/obj/effect/proc_holder/spell/targeted/infinite_guns
name = "Lesser Summon Guns"
desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles. Requires both hands free to use. Learning this spell makes you unable to learn Arcane Barrage."
desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles. Requires both hands free to use."
invocation_type = "none"
include_user = 1
range = -1
@@ -10,21 +10,13 @@
clothes_req = 1
cooldown_min = 10 //Gun wizard
action_icon_state = "bolt_action"
var/summon_path = /obj/item/weapon/gun/ballistic/shotgun/boltaction/enchanted
/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/C in targets)
C.drop_item()
C.swap_hand()
C.drop_item()
var/GUN = new summon_path
var/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/GUN = new
C.put_in_hands(GUN)
C.swap_hand(C.get_held_index_of_item(GUN))
/obj/effect/proc_holder/spell/targeted/infinite_guns/gun
/obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage
name = "Arcane Barrage"
desc = "Fire a torrent of arcane energy at your foes with this (powerful) spell. Requires both hands free to use. Learning this spell makes you unable to learn Lesser Summon Gun."
action_icon_state = "arcane_barrage"
summon_path = /obj/item/weapon/gun/ballistic/shotgun/boltaction/enchanted/arcane_barrage
+2 -2
View File
@@ -16,9 +16,9 @@
user << sound("sound/magic/Knock.ogg")
for(var/turf/T in targets)
for(var/obj/machinery/door/door in T.contents)
addtimer(src, "open_door", 0, TIMER_NORMAL, door)
addtimer(src, "open_door", 0, FALSE, door)
for(var/obj/structure/closet/C in T.contents)
addtimer(src, "open_closet", 0, TIMER_NORMAL, C)
addtimer(src, "open_closet", 0, FALSE, C)
/obj/effect/proc_holder/spell/aoe_turf/knock/proc/open_door(var/obj/machinery/door/door)
if(istype(door, /obj/machinery/door/airlock))
+8 -11
View File
@@ -43,7 +43,7 @@
for(var/mob/M in targets)
var/list/hand_items = list()
if(iscarbon(M))
hand_items = list(M.get_active_held_item(),M.get_inactive_held_item())
hand_items = list(M.get_active_hand(),M.get_inactive_hand())
if(marked_item && !stat_allowed) //sanity, shouldn't happen without badminry
marked_item = null
@@ -72,7 +72,7 @@
var/mob/living/carbon/human/lich = new /mob/living/carbon/human(item_turf)
lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(lich), slot_shoes)
lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(lich), slot_shoes)
lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), slot_w_uniform)
lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), slot_wear_suit)
lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), slot_head)
@@ -80,7 +80,7 @@
lich.real_name = M.mind.name
M.mind.transfer_to(lich)
lich.hardset_dna(null,null,lich.real_name,null,/datum/species/skeleton)
lich << "<span class='warning'>Your bones clatter and shutter as you are pulled back into this world!</span>"
lich << "<span class='warning'>Your bones clatter and shutter as they're pulled back into this world!</span>"
charge_max += 600
var/mob/old_body = current_body
var/turf/body_turf = get_turf(old_body)
@@ -92,14 +92,13 @@
var/mob/living/carbon/C = old_body
for(var/obj/item/W in C)
C.unEquip(W)
for(var/X in C.internal_organs)
var/obj/item/organ/I = X
for(var/obj/item/organ/I in C.internal_organs)
I.Remove(C)
I.forceMove(body_turf)
var/wheres_wizdo = dir2text(get_dir(body_turf, item_turf))
if(wheres_wizdo)
old_body.visible_message("<span class='warning'>Suddenly [old_body.name]'s corpse falls to pieces! You see a strange energy rise from the remains, and speed off towards the [wheres_wizdo]!</span>")
body_turf.Beam(item_turf,icon_state="lichbeam",time=10+10*resurrections,maxdistance=INFINITY)
body_turf.Beam(item_turf,icon_state="lichbeam",icon='icons/effects/effects.dmi',time=10+10*resurrections,maxdistance=INFINITY)
old_body.dust()
if(!marked_item) //linking item to the spell
@@ -124,11 +123,9 @@
charge_max = 1800 //3 minute cooldown, if you rise in sight of someone and killed again, you're probably screwed.
charge_counter = 1800
stat_allowed = 1
marked_item.name = "ensouled [marked_item.name]"
marked_item.desc += "\nA terrible aura surrounds this item, its very existence is offensive to life itself..."
marked_item.add_atom_colour("#003300", ADMIN_COLOUR_PRIORITY)
poi_list |= marked_item
marked_item.name = "Ensouled [marked_item.name]"
marked_item.desc = "A terrible aura surrounds this item, its very existence is offensive to life itself..."
marked_item.color = "#003300"
M << "<span class='userdanger'>With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich!</span>"
M.set_species(/datum/species/skeleton)
current_body = M.mind.current
+5 -8
View File
@@ -32,18 +32,15 @@
if(ready && cast_check(skipcharge=1))
choose_targets()
else
revert_cast(user, 0)
else
revert_cast(user, 0)
Reset(user)
/obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
ready = 0
if(halo)
user.overlays.Remove(halo)
/obj/effect/proc_holder/spell/targeted/lightning/revert_cast(mob/user = usr, message = 1)
if(message)
user << "<span class='notice'>No target found in range.</span>"
/obj/effect/proc_holder/spell/targeted/lightning/revert_cast(mob/user = usr)
user << "<span class='notice'>No target found in range.</span>"
Reset(user)
..()
@@ -58,13 +55,13 @@
return
playsound(get_turf(user), 'sound/magic/lightningbolt.ogg', 50, 1)
user.Beam(target,icon_state="lightning[rand(1,12)]",time=5)
user.Beam(target,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5)
Bolt(user,target,30,5,user)
Reset(user)
/obj/effect/proc_holder/spell/targeted/lightning/proc/Bolt(mob/origin,mob/target,bolt_energy,bounces,mob/user = usr)
origin.Beam(target,icon_state="lightning[rand(1,12)]",time=5)
origin.Beam(target,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5)
var/mob/living/carbon/current = target
if(bounces < 1)
current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1)
+1 -1
View File
@@ -21,7 +21,7 @@
if(!usr.mind.miming)
usr << "<span class='notice'>You must dedicate yourself to silence first.</span>"
return
invocation = "<B>[usr.real_name]</B> looks as if a wall is in front of [usr.p_them()]."
invocation = "<B>[usr.real_name]</B> looks as if a wall is in front of them."
else
invocation_type ="none"
..()
@@ -31,14 +31,11 @@ Also, you never added distance checking after target is selected. I've went ahea
var/mob/living/target = targets[1]
var/t_He = target.p_they(TRUE)
var/t_is = target.p_are()
if(!(target in oview(range)) && !distanceoverride)//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it.
user << "<span class='warning'>[t_He] [t_is] too far away!</span>"
user << "<span class='warning'>They are too far away!</span>"
return
if(ismegafauna(target))
if(istype(target, /mob/living/simple_animal/hostile/megafauna))
user << "<span class='warning'>This creature is too powerful to control!</span>"
return
@@ -47,7 +44,7 @@ Also, you never added distance checking after target is selected. I've went ahea
return
if(!target.key || !target.mind)
user << "<span class='warning'>[t_He] appear[target.p_s()] to be catatonic! Not even magic can affect [target.p_their()] vacant mind.</span>"
user << "<span class='warning'>They appear to be catatonic! Not even magic can affect their vacant mind.</span>"
return
if(user.suiciding)
@@ -55,7 +52,7 @@ Also, you never added distance checking after target is selected. I've went ahea
return
if((target.mind.special_role in protected_roles) || cmptext(copytext(target.key,1,2),"@"))
user << "<span class='warning'>[target.p_their(TRUE)] mind is resisting your spell!</span>"
user << "<span class='warning'>Their mind is resisting your spell!</span>"
return
var/mob/living/victim = target//The target of the spell whos body will be transferred to.
@@ -2,8 +2,8 @@
/proc/rightandwrong(summon_type, mob/user, survivor_probability) //0 = Summon Guns, 1 = Summon Magic
var/list/gunslist = list("taser","gravgun","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","speargun","arg","uzi","alienpistol","dragnet","turret","pulsecarbine","decloner","mindflayer","hyperkinetic","advplasmacutter","wormhole","wt550","bulldog","grenadelauncher","goldenrevolver","sniper","medibeam","scatterbeam")
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying","staffdoor","voodoo", "whistle", "battlemage", "immortality", "ghostsword", "special")
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos", "necromantic", "bloodcontract")
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying","staffdoor","voodoo", "special")
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos", "necromantic")
if(user) //in this case either someone holding a spellbook or a badmin
user << "<B>You summoned [summon_type ? "magic" : "guns"]!</B>"
@@ -15,23 +15,19 @@
if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice" || H.mind.special_role == "survivalist") continue
if(prob(survivor_probability) && !(H.mind in ticker.mode.traitors))
ticker.mode.traitors += H.mind
if(!summon_type)
var/datum/objective/steal_five_of_type/summon_guns/guns = new
guns.owner = H.mind
H.mind.objectives += guns
H.mind.special_role = "survivalist"
H << "<B>You are the survivalist! Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, by any means necessary. Kill anyone who gets in your way.</B>"
else
var/datum/objective/steal_five_of_type/summon_magic/magic = new
magic.owner = H.mind
H.mind.objectives += magic
H.mind.special_role = "amateur magician"
H << "<B>You are the amateur magician! Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way.</B>"
var/datum/objective/summon_guns/guns = new
guns.owner = H.mind
H.mind.objectives += guns
H.mind.special_role = "survivalist"
var/datum/objective/survive/survive = new
survive.owner = H.mind
H.mind.objectives += survive
H.attack_log += "\[[time_stamp()]\] <font color='red'>Was made into a survivalist, and trusts no one!</font>"
H.mind.announce_objectives()
H << "<B>You are the survivalist! Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, by any means necessary. Kill anyone who gets in your way.</B>"
var/obj_count = 1
for(var/datum/objective/OBJ in H.mind.objectives)
H << "<B>Objective #[obj_count]</B>: [OBJ.explanation_text]"
obj_count++
var/randomizeguns = pick(gunslist)
var/randomizemagic = pick(magiclist)
var/randomizemagicspecial = pick(magicspeciallist)
@@ -39,62 +35,62 @@
var/obj/item/weapon/gun/G
switch (randomizeguns)
if("taser")
G = new /obj/item/weapon/gun/energy/e_gun/advtaser(get_turf(H))
G = new /obj/item/weapon/gun/energy/gun/advtaser(get_turf(H))
if("egun")
G = new /obj/item/weapon/gun/energy/e_gun(get_turf(H))
G = new /obj/item/weapon/gun/energy/gun(get_turf(H))
if("laser")
G = new /obj/item/weapon/gun/energy/laser(get_turf(H))
if("revolver")
G = new /obj/item/weapon/gun/ballistic/revolver(get_turf(H))
G = new /obj/item/weapon/gun/projectile/revolver(get_turf(H))
if("detective")
G = new /obj/item/weapon/gun/ballistic/revolver/detective(get_turf(H))
G = new /obj/item/weapon/gun/projectile/revolver/detective(get_turf(H))
if("deagle")
G = new /obj/item/weapon/gun/ballistic/automatic/pistol/deagle/camo(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo(get_turf(H))
if("gyrojet")
G = new /obj/item/weapon/gun/ballistic/automatic/gyropistol(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H))
if("pulse")
G = new /obj/item/weapon/gun/energy/pulse(get_turf(H))
if("suppressed")
G = new /obj/item/weapon/gun/ballistic/automatic/pistol(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/pistol(get_turf(H))
new /obj/item/weapon/suppressor(get_turf(H))
if("doublebarrel")
G = new /obj/item/weapon/gun/ballistic/revolver/doublebarrel(get_turf(H))
G = new /obj/item/weapon/gun/projectile/revolver/doublebarrel(get_turf(H))
if("shotgun")
G = new /obj/item/weapon/gun/ballistic/shotgun(get_turf(H))
G = new /obj/item/weapon/gun/projectile/shotgun(get_turf(H))
if("combatshotgun")
G = new /obj/item/weapon/gun/ballistic/shotgun/automatic/combat(get_turf(H))
G = new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(H))
if("arg")
G = new /obj/item/weapon/gun/ballistic/automatic/ar(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H))
if("mateba")
G = new /obj/item/weapon/gun/ballistic/revolver/mateba(get_turf(H))
G = new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(H))
if("boltaction")
G = new /obj/item/weapon/gun/ballistic/shotgun/boltaction(get_turf(H))
G = new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H))
if("speargun")
G = new /obj/item/weapon/gun/ballistic/automatic/speargun(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/speargun(get_turf(H))
if("uzi")
G = new /obj/item/weapon/gun/ballistic/automatic/mini_uzi(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H))
if("cannon")
G = new /obj/item/weapon/gun/energy/lasercannon(get_turf(H))
if("crossbow")
G = new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large(get_turf(H))
if("nuclear")
G = new /obj/item/weapon/gun/energy/e_gun/nuclear(get_turf(H))
G = new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H))
if("sabr")
G = new /obj/item/weapon/gun/ballistic/automatic/proto(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/proto(get_turf(H))
if("bulldog")
G = new /obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H))
if("c20r")
G = new /obj/item/weapon/gun/ballistic/automatic/c20r(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H))
if("saw")
G = new /obj/item/weapon/gun/ballistic/automatic/l6_saw(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/l6_saw(get_turf(H))
if("car")
G = new /obj/item/weapon/gun/ballistic/automatic/m90(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/m90(get_turf(H))
if("alienpistol")
G = new /obj/item/weapon/gun/energy/alien(get_turf(H))
if("dragnet")
G = new /obj/item/weapon/gun/energy/e_gun/dragnet(get_turf(H))
G = new /obj/item/weapon/gun/energy/gun/dragnet(get_turf(H))
if("turret")
G = new /obj/item/weapon/gun/energy/e_gun/turret(get_turf(H))
G = new /obj/item/weapon/gun/energy/gun/turret(get_turf(H))
if("pulsecarbine")
G = new /obj/item/weapon/gun/energy/pulse/carbine(get_turf(H))
if("decloner")
@@ -102,21 +98,21 @@
if("mindflayer")
G = new /obj/item/weapon/gun/energy/mindflayer(get_turf(H))
if("hyperkinetic")
G = new /obj/item/weapon/gun/energy/kinetic_accelerator(get_turf(H))
G = new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper(get_turf(H))
if("advplasmacutter")
G = new /obj/item/weapon/gun/energy/plasmacutter/adv(get_turf(H))
if("wormhole")
G = new /obj/item/weapon/gun/energy/wormhole_projector(get_turf(H))
if("wt550")
G = new /obj/item/weapon/gun/ballistic/automatic/wt550(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/wt550(get_turf(H))
if("bulldog")
G = new /obj/item/weapon/gun/ballistic/automatic/shotgun(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/shotgun(get_turf(H))
if("grenadelauncher")
G = new /obj/item/weapon/gun/ballistic/revolver/grenadelauncher(get_turf(H))
G = new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(get_turf(H))
if("goldenrevolver")
G = new /obj/item/weapon/gun/ballistic/revolver/golden(get_turf(H))
G = new /obj/item/weapon/gun/projectile/revolver/golden(get_turf(H))
if("sniper")
G = new /obj/item/weapon/gun/ballistic/automatic/sniper_rifle(get_turf(H))
G = new /obj/item/weapon/gun/projectile/automatic/sniper_rifle(get_turf(H))
if("medibeam")
G = new /obj/item/weapon/gun/medbeam(get_turf(H))
if("scatterbeam")
@@ -173,14 +169,6 @@
H << "<span class='notice'>The walls suddenly disappear.</span>"
if("voodoo")
new /obj/item/voodoo(get_turf(H))
if("whistle")
new /obj/item/warpwhistle(get_turf(H))
if("battlemage")
new /obj/item/clothing/suit/space/hardsuit/shielded/wizard(get_turf(H))
if("immortality")
new /obj/item/device/immortality_talisman(get_turf(H))
if("ghostsword")
new /obj/item/weapon/melee/ghost_sword(get_turf(H))
if("special")
magiclist -= "special" //only one super OP item per summoning max
switch (randomizemagicspecial)
@@ -196,8 +184,6 @@
new /obj/item/weapon/gun/magic/staff/chaos(get_turf(H))
if("necromantic")
new /obj/item/device/necromantic_stone(get_turf(H))
if("bloodcontract")
new /obj/item/blood_contract(get_turf(H))
H << "<span class='notice'>You suddenly feel lucky.</span>"
playsound(get_turf(H),'sound/magic/Summon_Magic.ogg', 50, 1)
@@ -1,42 +0,0 @@
/obj/effect/proc_holder/spell/targeted/rod_form
name = "Rod Form"
desc = "Take on the form of an immovable rod, destroying all in your path."
clothes_req = 1
human_req = 0
charge_max = 250
cooldown_min = 100
range = -1
include_user = 1
invocation = "CLANG!"
invocation_type = "shout"
action_icon_state = "immrod"
/obj/effect/proc_holder/spell/targeted/rod_form/cast(list/targets,mob/user = usr)
for(var/mob/living/M in targets)
var/turf/start = get_turf(M)
var/obj/effect/immovablerod/wizard/W = new(start, get_ranged_target_turf(M, M.dir, (15 + spell_level * 3)))
W.wizard = M
W.max_distance += spell_level * 3 //You travel farther when you upgrade the spell
W.start_turf = start
M.forceMove(W)
M.notransform = 1
M.status_flags |= GODMODE
//Wizard Version of the Immovable Rod
/obj/effect/immovablerod/wizard
var/max_distance = 13
var/mob/living/wizard
var/turf/start_turf
/obj/effect/immovablerod/wizard/Move()
if(get_dist(start_turf, get_turf(src)) >= max_distance)
qdel(src)
..()
/obj/effect/immovablerod/wizard/Destroy()
if(wizard)
wizard.status_flags &= ~GODMODE
wizard.notransform = 0
wizard.forceMove(get_turf(src))
return ..()
+1 -11
View File
@@ -70,14 +70,4 @@
current_shapes.Remove(shape)
shape.mind.transfer_to(caster)
qdel(shape) //Gib it maybe ?
/obj/effect/proc_holder/spell/targeted/shapeshift/dragon
name = "Dragon Form"
desc = "Take on the shape a lesser ash drake."
invocation = "RAAAAAAAAWR!"
shapeshift_type = /mob/living/simple_animal/hostile/megafauna/dragon/lesser
list/current_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser)
list/current_casters = list()
list/possible_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser)
qdel(shape) //Gib it maybe ?
@@ -8,8 +8,6 @@
var/ready = TRUE
centcom_cancast = FALSE
sound = "sound/effects/magic.ogg"
cooldown_min = 300
level_max = 0
/obj/effect/proc_holder/spell/spacetime_dist/can_cast(mob/user = usr)
if(ready)
+13 -2
View File
@@ -17,7 +17,8 @@
/obj/effect/proc_holder/spell/targeted/summonitem/cast(list/targets,mob/user = usr)
for(var/mob/living/L in targets)
var/list/hand_items = list(L.get_active_held_item(),L.get_inactive_held_item())
var/list/hand_items = list(L.get_active_hand(),L.get_inactive_hand())
var/butterfingers = 0
var/message
if(!marked_item) //linking item to the spell
@@ -92,7 +93,17 @@
if(item_to_retrive.loc)
item_to_retrive.loc.visible_message("<span class='warning'>The [item_to_retrive.name] suddenly disappears!</span>")
if(!L.put_in_hands(item_to_retrive))
if(L.hand) //left active hand
if(!L.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1))
if(!L.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1))
butterfingers = 1
else //right active hand
if(!L.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1))
if(!L.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1))
butterfingers = 1
if(butterfingers)
item_to_retrive.loc = L.loc
item_to_retrive.loc.visible_message("<span class='caution'>The [item_to_retrive.name] suddenly appears!</span>")
playsound(get_turf(L),"sound/magic/SummonItems_generic.ogg",50,1)
@@ -1,4 +1,4 @@
/obj/effect/proc_holder/spell/targeted/touch
/obj/effect/proc_holder/spell/targeted/touch/
var/hand_path = "/obj/item/weapon/melee/touch_attack"
var/obj/item/weapon/melee/touch_attack/attached_hand = null
invocation_type = "none" //you scream on connecting, not summoning
@@ -24,8 +24,17 @@
sleep(1)
/obj/effect/proc_holder/spell/targeted/touch/proc/ChargeHand(mob/living/carbon/user)
var/hand_handled = 1
attached_hand = new hand_path(src)
if(!user.put_in_hands(attached_hand))
if(user.hand) //left active hand
if(!user.equip_to_slot_if_possible(attached_hand, slot_l_hand, 0, 1, 1))
if(!user.equip_to_slot_if_possible(attached_hand, slot_r_hand, 0, 1, 1))
hand_handled = 0
else //right active hand
if(!user.equip_to_slot_if_possible(attached_hand, slot_r_hand, 0, 1, 1))
if(!user.equip_to_slot_if_possible(attached_hand, slot_l_hand, 0, 1, 1))
hand_handled = 0
if(!hand_handled)
qdel(attached_hand)
charge_counter = charge_max
attached_hand = null
+46 -112
View File
@@ -42,6 +42,7 @@
invocation_type = "shout"
range = -1
include_user = 1
centcom_cancast = 0
mutations = list(LASEREYES, HULK)
duration = 300
@@ -104,6 +105,8 @@
inner_tele_radius = 0
outer_tele_radius = 6
centcom_cancast = 0 //prevent people from getting to centcom
action_icon_state = "blink"
sound1="sound/magic/blink.ogg"
sound2="sound/magic/blink.ogg"
@@ -133,6 +136,25 @@
sound1="sound/magic/Teleport_diss.ogg"
sound2="sound/magic/Teleport_app.ogg"
/obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
name = "Forcewall"
desc = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb."
school = "transmutation"
charge_max = 100
clothes_req = 0
invocation = "TARCOL MINTI ZHERI"
invocation_type = "whisper"
range = 0
cooldown_min = 50 //12 deciseconds reduction per rank
summon_type = list("/obj/effect/forcefield")
summon_lifespan = 300
action_icon_state = "shield"
cast_sound = "sound/magic/ForceWall.ogg"
/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop
name = "Stop Time"
desc = "This spell stops time for everyone except for you, allowing you to move freely while your enemies and even projectiles are frozen."
@@ -228,7 +250,7 @@
duration = 300
sound="sound/magic/Blind.ogg"
/obj/effect/proc_holder/spell/fireball
/obj/effect/proc_holder/spell/dumbfire/fireball
name = "Fireball"
desc = "This spell fires a fireball at a target and does not require wizard garb."
@@ -239,65 +261,30 @@
invocation_type = "shout"
range = 20
cooldown_min = 20 //10 deciseconds reduction per rank
var/fireball_type = /obj/item/projectile/magic/fireball
action_icon_state = "fireball0"
proj_icon_state = "fireball"
proj_name = "a fireball"
proj_type = "/obj/effect/proc_holder/spell/turf/fireball"
proj_lifespan = 200
proj_step_delay = 1
action_icon_state = "fireball"
sound = "sound/magic/Fireball.ogg"
active = FALSE
/obj/effect/proc_holder/spell/turf/fireball/cast(turf/T,mob/user = usr)
explosion(T, -1, 0, 2, 3, 0, flame_range = 2)
/obj/effect/proc_holder/spell/fireball/Click()
var/mob/living/user = usr
if(!istype(user))
return
/obj/effect/proc_holder/spell/targeted/inflict_handler/fireball
amt_dam_brute = 20
amt_dam_fire = 25
var/msg
if(!can_cast(user))
msg = "<span class='warning'>You can no longer cast Fireball.</span>"
remove_ranged_ability(msg)
return
if(active)
msg = "<span class='notice'>You extinguish your fireball...for now.</span>"
remove_ranged_ability(msg)
else
msg = "<span class='notice'>Your prepare to cast your fireball spell! <B>Left-click to cast at a target!</B></span>"
add_ranged_ability(user, msg, TRUE)
/obj/effect/proc_holder/spell/fireball/update_icon()
if(!action)
return
action.button_icon_state = "fireball[active]"
action.UpdateButtonIcon()
/obj/effect/proc_holder/spell/fireball/InterceptClickOn(mob/living/caller, params, atom/target)
if(..())
return FALSE
if(!cast_check(0, ranged_ability_user))
remove_ranged_ability()
return FALSE
var/list/targets = list(target)
perform(targets,user = ranged_ability_user)
return TRUE
/obj/effect/proc_holder/spell/fireball/cast(list/targets, mob/living/user)
var/target = targets[1] //There is only ever one target for fireball
var/turf/T = user.loc
var/turf/U = get_step(user, user.dir) // Get the tile infront of the move, based on their direction
if(!isturf(U) || !isturf(T))
return 0
var/obj/item/projectile/magic/fireball/FB = new fireball_type(user.loc)
FB.current = get_turf(user)
FB.preparePixelProjectile(target, get_turf(target), user)
FB.fire()
user.newtonian_move(get_dir(U, T))
remove_ranged_ability() //Auto-disable the ability once successfully performed
return 1
/obj/effect/proc_holder/spell/targeted/explosion/fireball
ex_severe = -1
ex_heavy = -1
ex_light = 2
ex_flash = 5
/obj/effect/proc_holder/spell/aoe_turf/repulse
name = "Repulse"
@@ -315,7 +302,7 @@
action_icon_state = "repulse"
/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets,mob/user = usr, var/stun_amt = 2)
/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets,mob/user = usr)
var/list/thrownatoms = list()
var/atom/throwtarget
var/distfromcaster
@@ -332,15 +319,15 @@
throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(AM, user)))
distfromcaster = get_dist(user, AM)
if(distfromcaster == 0)
if(isliving(AM))
if(istype(AM, /mob/living))
var/mob/living/M = AM
M.Weaken(5)
M.adjustBruteLoss(5)
M << "<span class='userdanger'>You're slammed into the floor by [user]!</span>"
else
if(isliving(AM))
if(istype(AM, /mob/living))
var/mob/living/M = AM
M.Weaken(stun_amt)
M.Weaken(2)
M << "<span class='userdanger'>You're thrown back by [user]!</span>"
AM.throw_at_fast(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time.
@@ -362,57 +349,4 @@
var/mob/living/carbon/C = user
playsound(C.loc, 'sound/voice/hiss5.ogg', 80, 1, 1)
C.spin(6,1)
..(targets, user, 3)
/obj/effect/proc_holder/spell/targeted/sacred_flame
name = "Sacred Flame"
desc = "Makes everyone around you more flammable, and lights yourself on fire."
charge_max = 60
clothes_req = 0
invocation = "FI'RAN DADISKO"
invocation_type = "shout"
max_targets = 0
range = 6
include_user = 1
selection_type = "view"
action_icon_state = "sacredflame"
sound = "sound/magic/Fireball.ogg"
/obj/effect/proc_holder/spell/targeted/sacred_flame/cast(list/targets, mob/user = usr)
for(var/mob/living/L in targets)
L.adjust_fire_stacks(20)
if(isliving(user))
var/mob/living/U = user
U.IgniteMob()
/obj/effect/proc_holder/spell/targeted/conjure_item/spellpacket
name = "Thrown Lightning"
desc = "Forged from eldrich energies, a packet of pure power, known as a spell packet will appear in your hand, that when thrown will stun the target."
clothes_req = 1
item_type = /obj/item/spellpacket/lightningbolt
charge_max = 10
/obj/effect/proc_holder/spell/targeted/conjure_item/spellpacket/cast(list/targets, mob/user = usr)
..()
for(var/mob/living/carbon/C in targets)
C.throw_mode_on()
/obj/item/spellpacket/lightningbolt
name = "\improper Lightning bolt Spell Packet"
desc = "Some birdseed wrapped in cloth that somehow crackles with electricity."
icon = 'icons/obj/toy.dmi'
icon_state = "snappop"
w_class = WEIGHT_CLASS_TINY
/obj/item/spellpacket/lightningbolt/throw_impact(atom/hit_atom)
if(!..())
if(isliving(hit_atom))
var/mob/living/M = hit_atom
M.electrocute_act(80, src, illusion = 1)
qdel(src)
/obj/item/spellpacket/lightningbolt/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0)
. = ..()
if(ishuman(thrower))
var/mob/living/carbon/human/H = thrower
H.say("LIGHTNINGBOLT!!")