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:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 ..()
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!!")
|
||||
|
||||
Reference in New Issue
Block a user