mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 16:44:33 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into OrganRefactor
This commit is contained in:
@@ -65,7 +65,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
caster.reset_view(0)
|
||||
return 0
|
||||
|
||||
if((user.z in config.admin_levels) && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
|
||||
if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
|
||||
return 0
|
||||
if(user.z == ZLEVEL_CENTCOMM && ticker.mode.name == "ragin' mages")
|
||||
return 0
|
||||
|
||||
if(!skipcharge)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/effect/proc_holder/spell/targeted/charge
|
||||
name = "Charge"
|
||||
desc = "This spell can be used to charge up spent magical artifacts, among other things."
|
||||
desc = "This spell can be used to recharge a variety of things in your hands, from magical artifacts to electrical components. A creative wizard can even use it to grant magical power to a fellow magic user."
|
||||
|
||||
school = "transmutation"
|
||||
charge_max = 600
|
||||
@@ -8,38 +8,45 @@
|
||||
invocation = "DIRI CEL"
|
||||
invocation_type = "whisper"
|
||||
range = -1
|
||||
// cooldown_min = 400 //50 deciseconds reduction per rank
|
||||
cooldown_min = 400 //50 deciseconds reduction per rank
|
||||
include_user = 1
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets)
|
||||
for(var/mob/living/user in targets)
|
||||
var/list/hand_items = list(user.get_active_hand(),user.get_inactive_hand())
|
||||
/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/charged_item = null
|
||||
var/burnt_out = 0
|
||||
|
||||
if(L.pulling && (istype(L.pulling, /mob/living)))
|
||||
var/mob/living/M = L.pulling
|
||||
if(M.spell_list.len != 0 || (M.mind && M.mind.spell_list.len != 0))
|
||||
for(var/obj/effect/proc_holder/spell/S in M.spell_list)
|
||||
S.charge_counter = S.charge_max
|
||||
if(M.mind)
|
||||
for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list)
|
||||
S.charge_counter = S.charge_max
|
||||
M <<"<span class='notice'>you feel raw magic flowing through you, it feels good!</span>"
|
||||
else
|
||||
M <<"<span class='notice'>you feel very strange for a moment, but then it passes.</span>"
|
||||
burnt_out = 1
|
||||
charged_item = M
|
||||
break
|
||||
for(var/obj/item in hand_items)
|
||||
if(istype(item, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = item
|
||||
if(G.affecting)
|
||||
var/mob/M = G.affecting
|
||||
if(M.spell_list.len != 0)
|
||||
for(var/obj/effect/proc_holder/spell/S in M.spell_list)
|
||||
S.charge_counter = S.charge_max
|
||||
M <<"<span class='notice'>you feel raw magic flowing through you, it feels good!</span>"
|
||||
if(istype(item, /obj/item/weapon/spellbook))
|
||||
if(istype(item, /obj/item/weapon/spellbook/oneuse))
|
||||
var/obj/item/weapon/spellbook/oneuse/I = item
|
||||
if(prob(80))
|
||||
L.visible_message("<span class='warning'>[I] catches fire!</span>")
|
||||
qdel(I)
|
||||
else
|
||||
M <<"<span class='notice'>you feel very strange for a moment, but then it passes.</span>"
|
||||
burnt_out = 1
|
||||
charged_item = M
|
||||
break
|
||||
else if(istype(item, /obj/item/weapon/spellbook/oneuse))
|
||||
var/obj/item/weapon/spellbook/oneuse/I = item
|
||||
if(prob(80))
|
||||
user.visible_message("<span class='warning'>[I] catches fire!</span>")
|
||||
qdel(I)
|
||||
I.used = 0
|
||||
charged_item = I
|
||||
break
|
||||
else
|
||||
I.used = 0
|
||||
charged_item = I
|
||||
break
|
||||
L << "<span class='caution'>Glowing red letters appear on the front cover...</span>"
|
||||
L << "<span class='warning'>[pick("NICE TRY BUT NO!","CLEVER BUT NOT CLEVER ENOUGH!", "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", "CUTE!", "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?")]</span>"
|
||||
burnt_out = 1
|
||||
else if(istype(item, /obj/item/weapon/gun/magic))
|
||||
var/obj/item/weapon/gun/magic/I = item
|
||||
if(prob(80) && !I.can_charge)
|
||||
@@ -78,8 +85,8 @@
|
||||
charged_item = item
|
||||
break
|
||||
if(!charged_item)
|
||||
user << "<span class='notice'>you feel magical power surging to your hands, but the feeling rapidly fades...</span>"
|
||||
L << "<span class='notice'>you feel magical power surging to your hands, but the feeling rapidly fades...</span>"
|
||||
else if(burnt_out)
|
||||
user << "<span class='caution'>[charged_item] doesn't seem to be reacting to the spell...</span>"
|
||||
L << "<span class='caution'>[charged_item] doesn't seem to be reacting to the spell...</span>"
|
||||
else
|
||||
user << "<span class='notice'>[charged_item] suddenly feels very warm!</span>"
|
||||
L << "<span class='notice'>[charged_item] suddenly feels very warm!</span>"
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Genetic"
|
||||
desc = "This spell inflicts a set of mutations and disabilities upon the target."
|
||||
|
||||
var/disabilities = 0 //bits
|
||||
var/sdisabilities = 0 //bits
|
||||
var/list/mutations = list() //mutation strings
|
||||
var/duration = 100 //deciseconds
|
||||
/*
|
||||
@@ -22,11 +22,11 @@
|
||||
target.mutations.Add(x)
|
||||
/* if(x == HULK && ishuman(target))
|
||||
target:hulk_time=world.time + duration */
|
||||
target.disabilities |= disabilities
|
||||
target.sdisabilities |= sdisabilities
|
||||
target.update_mutations() //update target's mutation overlays
|
||||
spawn(duration)
|
||||
target.mutations.Remove(mutations)
|
||||
target.disabilities &= ~disabilities
|
||||
target.sdisabilities &= ~sdisabilities
|
||||
target.update_mutations()
|
||||
|
||||
return
|
||||
@@ -0,0 +1,22 @@
|
||||
/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."
|
||||
invocation_type = "none"
|
||||
include_user = 1
|
||||
range = -1
|
||||
|
||||
school = "conjuration"
|
||||
charge_max = 750
|
||||
clothes_req = 1
|
||||
cooldown_min = 10 //Gun wizard
|
||||
action_icon_state = "bolt_action"
|
||||
|
||||
|
||||
|
||||
/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
|
||||
C.put_in_hands(GUN)
|
||||
@@ -22,4 +22,11 @@
|
||||
var/obj/machinery/door/airlock/A = door
|
||||
A.unlock(1) //forced because it's magic!
|
||||
door.open()
|
||||
for(var/obj/structure/closet/C in T.contents)
|
||||
spawn(1)
|
||||
if(istype(C, /obj/structure/closet/secure_closet))
|
||||
var/obj/structure/closet/secure_closet/SC = C
|
||||
SC.locked = 0
|
||||
C.open()
|
||||
|
||||
return
|
||||
@@ -0,0 +1,130 @@
|
||||
/obj/effect/proc_holder/spell/targeted/lichdom
|
||||
name = "Bind Soul"
|
||||
desc = "A dark necromantic pact that can forever bind your soul to an item of your choosing. So long as both your body and the item remain intact and on the same plane you can revive from death, though the time between reincarnations grows steadily with use."
|
||||
school = "necromancy"
|
||||
charge_max = 10
|
||||
clothes_req = 0
|
||||
centcom_cancast = 0
|
||||
invocation = "NECREM IMORTIUM!"
|
||||
invocation_type = "shout"
|
||||
range = -1
|
||||
level_max = 0 //cannot be improved
|
||||
cooldown_min = 10
|
||||
include_user = 1
|
||||
|
||||
var/obj/marked_item
|
||||
var/mob/living/current_body
|
||||
var/resurrections = 0
|
||||
var/existence_stops_round_end = 0
|
||||
|
||||
action_icon_state = "skeleton"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lichdom/New()
|
||||
if(!config.continuous_rounds)
|
||||
existence_stops_round_end = 1
|
||||
config.continuous_rounds = 1
|
||||
..()
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lichdom/Destroy()
|
||||
for(var/datum/mind/M in ticker.mode.wizards) //Make sure no other bones are about
|
||||
for(var/obj/effect/proc_holder/spell/S in M.spell_list)
|
||||
if(istype(S,/obj/effect/proc_holder/spell/targeted/lichdom) && S != src)
|
||||
return ..()
|
||||
if(existence_stops_round_end)
|
||||
config.continuous_rounds = 0
|
||||
return ..()
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets,mob/user = usr)
|
||||
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())
|
||||
|
||||
if(marked_item && !stat_allowed) //sanity, shouldn't happen without badminry
|
||||
marked_item = null
|
||||
return
|
||||
|
||||
if(stat_allowed) //Death is not my end!
|
||||
if(M.stat == CONSCIOUS && iscarbon(M))
|
||||
M << "<span class='notice'>You aren't dead enough to revive!</span>" //Usually a good problem to have
|
||||
charge_counter = charge_max
|
||||
return
|
||||
|
||||
if(!marked_item || qdeleted(marked_item)) //Wait nevermind
|
||||
M << "<span class='warning'>Your phylactery is gone!</span>"
|
||||
return
|
||||
|
||||
var/turf/user_turf = get_turf(M)
|
||||
var/turf/item_turf = get_turf(marked_item)
|
||||
|
||||
if(user_turf.z != item_turf.z)
|
||||
M << "<span class='warning'>Your phylactery is out of range!</span>"
|
||||
return
|
||||
|
||||
if(isobserver(M))
|
||||
var/mob/dead/observer/O = M
|
||||
O.reenter_corpse()
|
||||
|
||||
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/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)
|
||||
|
||||
lich.real_name = M.mind.name
|
||||
M.mind.transfer_to(lich)
|
||||
lich.set_species("Skeleton")
|
||||
lich << "<span class='warning'>Your bones clatter and shutter as they're pulled back into this world!</span>"
|
||||
charge_max += 600
|
||||
var/mob/old_body = current_body
|
||||
var/turf/body_turf = get_turf(old_body)
|
||||
current_body = lich
|
||||
lich.Weaken(10+10*resurrections)
|
||||
++resurrections
|
||||
if(old_body && old_body.loc)
|
||||
if(iscarbon(old_body))
|
||||
var/mob/living/carbon/C = old_body
|
||||
for(var/obj/item/W in C)
|
||||
C.unEquip(W)
|
||||
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)
|
||||
old_body.dust()
|
||||
|
||||
if(!marked_item) //linking item to the spell
|
||||
message = "<span class='warning'>"
|
||||
for(var/obj/item in hand_items)
|
||||
if(ABSTRACT in item.flags || NODROP in item.flags)
|
||||
continue
|
||||
marked_item = item
|
||||
M << "<span class='warning'>You begin to focus your very being into the [item.name]...</span>"
|
||||
break
|
||||
|
||||
if(!marked_item)
|
||||
M << "<span class='caution'>You must hold an item you wish to make your phylactery...</span>"
|
||||
return
|
||||
|
||||
spawn(50)
|
||||
if(marked_item.loc != M) //I changed my mind I don't want to put my soul in a cheeseburger!
|
||||
M << "<span class='warning'>Your soul snaps back to your body as you drop the [marked_item.name]!</span>"
|
||||
marked_item = null
|
||||
return
|
||||
name = "RISE!"
|
||||
desc = "Rise from the dead! You will reform at the location of your phylactery and your old body will crumble away."
|
||||
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"
|
||||
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>"
|
||||
current_body = M.mind.current
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.set_species("Skeleton")
|
||||
H.unEquip(H.wear_suit)
|
||||
H.unEquip(H.head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), slot_wear_suit)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), slot_head)
|
||||
@@ -7,7 +7,7 @@
|
||||
invocation = "GAR YOK"
|
||||
invocation_type = "whisper"
|
||||
range = -1
|
||||
level_max = 1 //cannot be improved
|
||||
level_max = 0 //cannot be improved
|
||||
cooldown_min = 100
|
||||
include_user = 1
|
||||
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
desc = "This spell fires several, slow moving, magic projectiles at nearby targets."
|
||||
|
||||
school = "evocation"
|
||||
charge_max = 150
|
||||
charge_max = 200
|
||||
clothes_req = 1
|
||||
invocation = "FORTI GY AMA"
|
||||
invocation_type = "shout"
|
||||
range = 7
|
||||
cooldown_min = 90 //15 deciseconds reduction per rank
|
||||
cooldown_min = 60 //35 deciseconds reduction per rank
|
||||
|
||||
max_targets = 0
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile
|
||||
amt_weakened = 3
|
||||
amt_dam_fire = 10
|
||||
|
||||
/obj/effect/proc_holder/spell/noclothes
|
||||
name = "No Clothes"
|
||||
@@ -225,7 +224,7 @@
|
||||
amt_eye_blurry = 20
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/genetic/blind
|
||||
disabilities = 1
|
||||
sdisabilities = BLIND
|
||||
duration = 300
|
||||
|
||||
/obj/effect/proc_holder/spell/dumbfire/fireball
|
||||
@@ -261,6 +260,7 @@
|
||||
ex_severe = -1
|
||||
ex_heavy = -1
|
||||
ex_light = 2
|
||||
ex_flash = 5
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/repulse
|
||||
name = "Repulse"
|
||||
|
||||
Reference in New Issue
Block a user