12/21 modernizations from TG live (#103)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes
This commit is contained in:
Poojawa
2016-12-22 03:57:55 -06:00
committed by GitHub
parent f5e143a452
commit cf59ac1c3d
2215 changed files with 707445 additions and 87041 deletions
+69 -13
View File
@@ -1,14 +1,66 @@
#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/proc/InterceptClickOn(mob/user, params, atom/A)
return
/obj/effect/proc_holder/Destroy()
if(ranged_ability_user)
remove_ranged_ability()
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"
@@ -61,10 +113,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
@@ -108,14 +160,18 @@ 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(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/wizard))
if(!is_type_in_typecache(H.wear_suit, casting_clothes))
H << "<span class='notice'>I don't feel strong enough without my robe.</span>"
return 0
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))
if(!is_type_in_typecache(H.head, casting_clothes))
H << "<span class='notice'>I don't feel strong enough without my hat.</span>"
return 0
if(cult_req) //CULT_REQ CLOTHES CHECK
@@ -211,9 +267,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(istype(target,/mob/living))
if(isliving(target))
location = target.loc
else if(istype(target,/turf))
else if(isturf(target))
location = target
var/obj/effect/overlay/spell = new /obj/effect/overlay(location)
spell.icon = overlay_icon
@@ -225,11 +281,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(istype(target,/mob/living))
if(isliving(target))
location = target.loc
else if(istype(target,/turf))
else if(isturf(target))
location = target
if(istype(target,/mob/living) && message)
if(isliving(target) && 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_eyes()
target.flash_act()
+18 -12
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_hand(),L.get_inactive_hand())
var/list/hand_items = list(L.get_active_held_item(),L.get_inactive_held_item())
var/charged_item = null
var/burnt_out = 0
if(L.pulling && (istype(L.pulling, /mob/living)))
if(L.pulling && isliving(L.pulling))
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,15 +58,17 @@
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(prob(80))
C.maxcharge -= 200
if(C.maxcharge <= 1) //Div by 0 protection
C.maxcharge = 1
burnt_out = 1
if(!C.self_recharge)
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
@@ -75,12 +77,16 @@
for(I in item.contents)
if(istype(I, /obj/item/weapon/stock_parts/cell/))
var/obj/item/weapon/stock_parts/cell/C = I
if(prob(80))
C.maxcharge -= 200
if(C.maxcharge <= 1) //Div by 0 protection
C.maxcharge = 1
burnt_out = 1
if(!C.self_recharge)
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
+32 -1
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,3 +50,34 @@
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,19 +105,11 @@
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"
/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)
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_steam(mobloc)
return
+90 -57
View File
@@ -1,12 +1,11 @@
/obj/effect/proc_holder/spell/targeted/summon_pitchfork
/obj/effect/proc_holder/spell/targeted/conjure_item/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
var/obj/item/weapon/twohanded/pitchfork/demonic/pitchfork
var/pitchfork_type = /obj/item/weapon/twohanded/pitchfork/demonic/
item_type = /obj/item/weapon/twohanded/pitchfork/demonic
school = "conjuration"
charge_max = 150
@@ -14,25 +13,20 @@
action_icon_state = "pitchfork"
action_background_icon_state = "bg_demon"
/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/greater
item_type = /obj/item/weapon/twohanded/pitchfork/demonic/greater
/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/summon_pitchfork/ascended
item_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"
@@ -72,10 +66,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 them.</span>"
user << "<span class='notice'>[C] seems to not be sentient. You cannot summon a contract for [C.p_them()].</span>"
/obj/effect/proc_holder/spell/dumbfire/fireball/hellish
/obj/effect/proc_holder/spell/fireball/hellish
name = "Hellfire"
desc = "This spell launches hellfire at the target."
@@ -86,22 +80,14 @@
invocation_type = "shout"
range = 2
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
fireball_type = /obj/item/projectile/magic/fireball/infernal
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 = 10
charge_max = 200
clothes_req = 0
selection_type = "range"
range = -1
@@ -116,12 +102,17 @@
if(istype(user))
if(istype(user.loc, /obj/effect/dummy/slaughter/))
var/continuing = 0
for(var/mob/living/C in orange(2, get_turf(user.loc)))
if (C.mind && C.mind.soulOwner == C.mind)
continuing = 1
break
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
if(continuing)
addtimer(user,"infernalphasein",150,TRUE)
user << "<span class='warning'>You are now phasing in.</span>"
if(do_mob(user,user,150))
user.infernalphasein()
else
user << "<span class='warning'>You can only re-appear near a potential signer."
revert_cast()
@@ -129,21 +120,23 @@
else
user.notransform = 1
user.fakefire()
addtimer(user, "infernalphaseout",150,TRUE,get_turf(user))
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()
start_recharge()
return
revert_cast()
/mob/living/proc/infernalphaseout(var/turf/mobloc)
if(get_turf(src) != mobloc)
src << "<span class='warning'>You must remain still while exiting."
return
/mob/living/proc/infernalphaseout()
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,mobloc)
var/obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,loc)
src.ExtinguishMob()
if(buckled)
buckled.unbuckle_mob(src,force=1)
@@ -167,20 +160,7 @@
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,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)
addtimer(src, "fakefireextinguish", 15, TIMER_UNIQUE)
/obj/effect/proc_holder/spell/targeted/sintouch
name = "Sin Touch"
@@ -216,3 +196,56 @@
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,73 +10,58 @@
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)
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)
addtimer(src, "do_jaunt", 0, TIMER_NORMAL, target)
sleep(jaunt_duration)
/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)
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)
sleep(jaunt_duration)
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()
@@ -92,7 +77,7 @@
density = 0
anchored = 1
invisibility = 60
burn_state = LAVA_PROOF
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/effect/dummy/spell_jaunt/Destroy()
// Eject contents if deleted somehow
@@ -103,6 +88,7 @@
/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
@@ -0,0 +1,36 @@
/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 = 5
w_class = WEIGHT_CLASS_HUGE
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."
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."
invocation_type = "none"
include_user = 1
range = -1
@@ -10,13 +10,21 @@
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/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/GUN = new
var/GUN = new summon_path
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, FALSE, door)
addtimer(src, "open_door", 0, TIMER_NORMAL, door)
for(var/obj/structure/closet/C in T.contents)
addtimer(src, "open_closet", 0, FALSE, C)
addtimer(src, "open_closet", 0, TIMER_NORMAL, C)
/obj/effect/proc_holder/spell/aoe_turf/knock/proc/open_door(var/obj/machinery/door/door)
if(istype(door, /obj/machinery/door/airlock))
+11 -8
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_hand(),M.get_inactive_hand())
hand_items = list(M.get_active_held_item(),M.get_inactive_held_item())
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(lich), slot_shoes)
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/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 they're pulled back into this world!</span>"
lich << "<span class='warning'>Your bones clatter and shutter as you are pulled back into this world!</span>"
charge_max += 600
var/mob/old_body = current_body
var/turf/body_turf = get_turf(old_body)
@@ -92,13 +92,14 @@
var/mob/living/carbon/C = old_body
for(var/obj/item/W in C)
C.unEquip(W)
for(var/obj/item/organ/I in C.internal_organs)
for(var/X in C.internal_organs)
var/obj/item/organ/I = X
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",icon='icons/effects/effects.dmi',time=10+10*resurrections,maxdistance=INFINITY)
body_turf.Beam(item_turf,icon_state="lichbeam",time=10+10*resurrections,maxdistance=INFINITY)
old_body.dust()
if(!marked_item) //linking item to the spell
@@ -123,9 +124,11 @@
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 = "A terrible aura surrounds this item, its very existence is offensive to life itself..."
marked_item.color = "#003300"
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
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
+8 -5
View File
@@ -32,15 +32,18 @@
if(ready && cast_check(skipcharge=1))
choose_targets()
else
Reset(user)
revert_cast(user, 0)
else
revert_cast(user, 0)
/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)
user << "<span class='notice'>No target found in range.</span>"
/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>"
Reset(user)
..()
@@ -55,13 +58,13 @@
return
playsound(get_turf(user), 'sound/magic/lightningbolt.ogg', 50, 1)
user.Beam(target,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5)
user.Beam(target,icon_state="lightning[rand(1,12)]",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)]",icon='icons/effects/effects.dmi',time=5)
origin.Beam(target,icon_state="lightning[rand(1,12)]",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 them."
invocation = "<B>[usr.real_name]</B> looks as if a wall is in front of [usr.p_them()]."
else
invocation_type ="none"
..()
@@ -31,11 +31,14 @@ 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'>They are too far away!</span>"
user << "<span class='warning'>[t_He] [t_is] too far away!</span>"
return
if(istype(target, /mob/living/simple_animal/hostile/megafauna))
if(ismegafauna(target))
user << "<span class='warning'>This creature is too powerful to control!</span>"
return
@@ -44,7 +47,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'>They appear to be catatonic! Not even magic can affect their vacant mind.</span>"
user << "<span class='warning'>[t_He] appear[target.p_s()] to be catatonic! Not even magic can affect [target.p_their()] vacant mind.</span>"
return
if(user.suiciding)
@@ -52,7 +55,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'>Their mind is resisting your spell!</span>"
user << "<span class='warning'>[target.p_their(TRUE)] 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", "special")
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos", "necromantic")
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")
if(user) //in this case either someone holding a spellbook or a badmin
user << "<B>You summoned [summon_type ? "magic" : "guns"]!</B>"
@@ -15,19 +15,23 @@
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
var/datum/objective/summon_guns/guns = new
guns.owner = H.mind
H.mind.objectives += guns
H.mind.special_role = "survivalist"
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/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 << "<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++
H.mind.announce_objectives()
var/randomizeguns = pick(gunslist)
var/randomizemagic = pick(magiclist)
var/randomizemagicspecial = pick(magicspeciallist)
@@ -35,62 +39,62 @@
var/obj/item/weapon/gun/G
switch (randomizeguns)
if("taser")
G = new /obj/item/weapon/gun/energy/gun/advtaser(get_turf(H))
G = new /obj/item/weapon/gun/energy/e_gun/advtaser(get_turf(H))
if("egun")
G = new /obj/item/weapon/gun/energy/gun(get_turf(H))
G = new /obj/item/weapon/gun/energy/e_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/projectile/revolver(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/revolver(get_turf(H))
if("detective")
G = new /obj/item/weapon/gun/projectile/revolver/detective(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/revolver/detective(get_turf(H))
if("deagle")
G = new /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/automatic/pistol/deagle/camo(get_turf(H))
if("gyrojet")
G = new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/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/projectile/automatic/pistol(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/automatic/pistol(get_turf(H))
new /obj/item/weapon/suppressor(get_turf(H))
if("doublebarrel")
G = new /obj/item/weapon/gun/projectile/revolver/doublebarrel(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/revolver/doublebarrel(get_turf(H))
if("shotgun")
G = new /obj/item/weapon/gun/projectile/shotgun(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/shotgun(get_turf(H))
if("combatshotgun")
G = new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/shotgun/automatic/combat(get_turf(H))
if("arg")
G = new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/automatic/ar(get_turf(H))
if("mateba")
G = new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/revolver/mateba(get_turf(H))
if("boltaction")
G = new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/shotgun/boltaction(get_turf(H))
if("speargun")
G = new /obj/item/weapon/gun/projectile/automatic/speargun(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/automatic/speargun(get_turf(H))
if("uzi")
G = new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/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/gun/nuclear(get_turf(H))
G = new /obj/item/weapon/gun/energy/e_gun/nuclear(get_turf(H))
if("sabr")
G = new /obj/item/weapon/gun/projectile/automatic/proto(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/automatic/proto(get_turf(H))
if("bulldog")
G = new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog(get_turf(H))
if("c20r")
G = new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/automatic/c20r(get_turf(H))
if("saw")
G = new /obj/item/weapon/gun/projectile/automatic/l6_saw(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/automatic/l6_saw(get_turf(H))
if("car")
G = new /obj/item/weapon/gun/projectile/automatic/m90(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/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/gun/dragnet(get_turf(H))
G = new /obj/item/weapon/gun/energy/e_gun/dragnet(get_turf(H))
if("turret")
G = new /obj/item/weapon/gun/energy/gun/turret(get_turf(H))
G = new /obj/item/weapon/gun/energy/e_gun/turret(get_turf(H))
if("pulsecarbine")
G = new /obj/item/weapon/gun/energy/pulse/carbine(get_turf(H))
if("decloner")
@@ -98,21 +102,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/hyper(get_turf(H))
G = new /obj/item/weapon/gun/energy/kinetic_accelerator(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/projectile/automatic/wt550(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/automatic/wt550(get_turf(H))
if("bulldog")
G = new /obj/item/weapon/gun/projectile/automatic/shotgun(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/automatic/shotgun(get_turf(H))
if("grenadelauncher")
G = new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/revolver/grenadelauncher(get_turf(H))
if("goldenrevolver")
G = new /obj/item/weapon/gun/projectile/revolver/golden(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/revolver/golden(get_turf(H))
if("sniper")
G = new /obj/item/weapon/gun/projectile/automatic/sniper_rifle(get_turf(H))
G = new /obj/item/weapon/gun/ballistic/automatic/sniper_rifle(get_turf(H))
if("medibeam")
G = new /obj/item/weapon/gun/medbeam(get_turf(H))
if("scatterbeam")
@@ -169,6 +173,14 @@
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)
@@ -184,6 +196,8 @@
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)
@@ -0,0 +1,42 @@
/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 ..()
+11 -1
View File
@@ -70,4 +70,14 @@
current_shapes.Remove(shape)
shape.mind.transfer_to(caster)
qdel(shape) //Gib it maybe ?
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)
@@ -8,6 +8,8 @@
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)
+2 -13
View File
@@ -17,8 +17,7 @@
/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_hand(),L.get_inactive_hand())
var/butterfingers = 0
var/list/hand_items = list(L.get_active_held_item(),L.get_inactive_held_item())
var/message
if(!marked_item) //linking item to the spell
@@ -93,17 +92,7 @@
if(item_to_retrive.loc)
item_to_retrive.loc.visible_message("<span class='warning'>The [item_to_retrive.name] suddenly disappears!</span>")
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)
if(!L.put_in_hands(item_to_retrive))
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,17 +24,8 @@
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.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)
if(!user.put_in_hands(attached_hand))
qdel(attached_hand)
charge_counter = charge_max
attached_hand = null
+112 -46
View File
@@ -42,7 +42,6 @@
invocation_type = "shout"
range = -1
include_user = 1
centcom_cancast = 0
mutations = list(LASEREYES, HULK)
duration = 300
@@ -105,8 +104,6 @@
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"
@@ -136,25 +133,6 @@
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."
@@ -250,7 +228,7 @@
duration = 300
sound="sound/magic/Blind.ogg"
/obj/effect/proc_holder/spell/dumbfire/fireball
/obj/effect/proc_holder/spell/fireball
name = "Fireball"
desc = "This spell fires a fireball at a target and does not require wizard garb."
@@ -261,30 +239,65 @@
invocation_type = "shout"
range = 20
cooldown_min = 20 //10 deciseconds reduction per rank
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"
var/fireball_type = /obj/item/projectile/magic/fireball
action_icon_state = "fireball0"
sound = "sound/magic/Fireball.ogg"
/obj/effect/proc_holder/spell/turf/fireball/cast(turf/T,mob/user = usr)
explosion(T, -1, 0, 2, 3, 0, flame_range = 2)
active = FALSE
/obj/effect/proc_holder/spell/targeted/inflict_handler/fireball
amt_dam_brute = 20
amt_dam_fire = 25
/obj/effect/proc_holder/spell/fireball/Click()
var/mob/living/user = usr
if(!istype(user))
return
/obj/effect/proc_holder/spell/targeted/explosion/fireball
ex_severe = -1
ex_heavy = -1
ex_light = 2
ex_flash = 5
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/aoe_turf/repulse
name = "Repulse"
@@ -302,7 +315,7 @@
action_icon_state = "repulse"
/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets,mob/user = usr)
/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets,mob/user = usr, var/stun_amt = 2)
var/list/thrownatoms = list()
var/atom/throwtarget
var/distfromcaster
@@ -319,15 +332,15 @@
throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(AM, user)))
distfromcaster = get_dist(user, AM)
if(distfromcaster == 0)
if(istype(AM, /mob/living))
if(isliving(AM))
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(istype(AM, /mob/living))
if(isliving(AM))
var/mob/living/M = AM
M.Weaken(2)
M.Weaken(stun_amt)
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.
@@ -349,4 +362,57 @@
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!!")