Finalizes Changes

- Adds action buttons for Shadowling spells
- Fixes bugs and runtimes found while testing.
- Remove stupid snowflake check that allowed mobs with environment_smash
>= 2 to smash reinforced walls, but not regular walls (what the actual
fuck?).
This commit is contained in:
DZD
2015-08-04 11:14:52 -04:00
parent e5b619783b
commit 7637fe9582
8 changed files with 73 additions and 56 deletions
@@ -4,6 +4,7 @@
icon = 'icons/mob/mob.dmi'
icon_state = "shadowling_ascended"
icon_living = "shadowling_ascended"
speak = list("Azima'dox", "Mahz'kavek", "N'ildzak", "Kaz'vadosh")
speak_emote = list("telepathically thunders", "telepathically booms")
force_threshold = INFINITY //Can't die by normal means
health = 100000
@@ -13,6 +14,8 @@
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
universal_speak = 1
response_help = "stares at"
response_disarm = "flails at"
response_harm = "flails at"
+6 -6
View File
@@ -133,8 +133,8 @@ Made by Xhuis
/datum/game_mode/proc/finalize_shadowling(var/datum/mind/shadow_mind)
var/mob/living/carbon/human/S = shadow_mind.current
shadow_mind.current.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hatch)
shadow_mind.current.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/enthrall)
shadow_mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hatch)
shadow_mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/enthrall)
spawn(0)
shadow_mind.current.add_language("Shadowling Hivemind")
update_shadow_icons_added(shadow_mind)
@@ -152,9 +152,9 @@ Made by Xhuis
update_shadow_icons_added(new_thrall_mind)
new_thrall_mind.current.attack_log += "\[[time_stamp()]\] <span class='danger'>Became a thrall</span>"
new_thrall_mind.current.add_language("Shadowling Hivemind")
new_thrall_mind.current.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/lesser_glare)
new_thrall_mind.current.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/lesser_shadow_walk)
//new_thrall_mind.current.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/thrall_vision) //Uncomment when vision code is unfucked.
new_thrall_mind.current.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/lesser_glare)
new_thrall_mind.current.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/lesser_shadow_walk)
//new_thrall_mind.current.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/thrall_vision) //Uncomment when vision code is unfucked.
new_thrall_mind.current << "<span class='shadowling'><b>You see the truth. Reality has been torn away and you realize what a fool you've been.</b></span>"
new_thrall_mind.current << "<span class='shadowling'><b>The shadowlings are your masters.</b> Serve them above all else and ensure they complete their goals.</span>"
new_thrall_mind.current << "<span class='shadowling'>You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls.</span>"
@@ -168,10 +168,10 @@ Made by Xhuis
/datum/game_mode/proc/remove_thrall(datum/mind/thrall_mind, var/kill = 0)
if(!istype(thrall_mind) || !(thrall_mind in thralls) || !isliving(thrall_mind.current))
return 0 //If there is no mind, the mind isn't a thrall, or the mind's mob isn't alive, return
update_shadow_icons_removed(thrall_mind)
thralls.Remove(thrall_mind)
thrall_mind.current.attack_log += "\[[time_stamp()]\] <span class='danger'>Dethralled</span>"
thrall_mind.special_role = null
update_shadow_icons_removed(thrall_mind)
thrall_mind.remove_spell(/obj/effect/proc_holder/spell/wizard/targeted/lesser_glare)
thrall_mind.remove_spell(/obj/effect/proc_holder/spell/wizard/targeted/lesser_shadow_walk)
//thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/thrall_vision) //uncomment when vision code is unfucked.
@@ -4,6 +4,7 @@
panel = "Shadowling Abilities"
charge_max = 300
clothes_req = 0
action_icon_state = "glare"
/obj/effect/proc_holder/spell/wizard/targeted/glare/cast(list/targets)
for(var/mob/living/carbon/human/target in targets)
@@ -34,6 +35,7 @@
panel = "Thrall Abilities"
charge_max = 450
clothes_req = 0
action_icon_state = "glare"
/obj/effect/proc_holder/spell/wizard/targeted/lesser_glare/cast(list/targets)
for(var/mob/living/carbon/human/target in targets)
@@ -65,13 +67,14 @@
clothes_req = 0
range = 5
var/blacklisted_lights = list(/obj/item/device/flashlight/flare, /obj/item/device/flashlight/slime)
action_icon_state = "veil"
/obj/effect/proc_holder/spell/wizard/aoe_turf/veil/proc/extinguishItem(var/obj/item/I) //WARNING NOT SUFFICIENT TO EXTINGUISH AN ITEM HELD BY A MOB
if(istype(I, /obj/item/device/flashlight))
var/obj/item/device/flashlight/F = I
if(F.on)
if(is_type_in_list(I, blacklisted_lights))
I.visible_message("<span class='danger'>[I] dims slightly, before the shadows around it scatter.</span>")
I.visible_message("<span class='danger'>[I] dims slightly before scattering the shadows around it.</span>")
return
F.on = 0
F.update_brightness()
@@ -125,6 +128,7 @@
clothes_req = 0
range = -1
include_user = 1
action_icon_state = "shadow_walk"
/obj/effect/proc_holder/spell/wizard/targeted/shadow_walk/cast(list/targets)
for(var/mob/living/user in targets)
@@ -149,6 +153,7 @@
clothes_req = 0
range = -1
include_user = 1
action_icon_state = "shadow_walk"
/obj/effect/proc_holder/spell/wizard/targeted/lesser_shadow_walk/cast(list/targets)
for(var/mob/living/user in targets)
@@ -199,6 +204,7 @@
range = 5
charge_max = 1200
clothes_req = 0
action_icon_state = "icy_veins"
/obj/effect/proc_holder/spell/wizard/aoe_turf/flashfreeze/cast(list/targets)
usr << "<span class='shadowling'>You freeze the nearby air.</span>"
@@ -230,6 +236,7 @@
clothes_req = 0
range = 1 //Adjacent to user
var/enthralling = 0
action_icon_state = "enthrall"
/obj/effect/proc_holder/spell/wizard/targeted/enthrall/cast(list/targets)
var/mob/living/carbon/human/user = usr
@@ -319,6 +326,7 @@
var/screech_acquired
var/drainLifeAcquired
var/reviveThrallAcquired
action_icon_state = "collective_mind"
/obj/effect/proc_holder/spell/wizard/targeted/collective_mind/cast(list/targets)
for(var/mob/living/user in targets)
@@ -372,7 +380,7 @@
M.mind.spell_list -= CM
qdel(CM)
M.mind.remove_spell(/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hatch)
M.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/shadowling_ascend)
M.mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_ascend)
if(M == usr)
M << "<span class='shadowling'><i>You project this power to the rest of the shadowlings.</i></span>"
else
@@ -388,6 +396,7 @@
clothes_req = 0
range = -1
include_user = 1
action_icon_state = "black_smoke"
/obj/effect/proc_holder/spell/wizard/targeted/blindness_smoke/cast(list/targets) //Extremely hacky
for(var/mob/living/user in targets)
@@ -438,6 +447,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
range = 7
charge_max = 300
clothes_req = 0
action_icon_state = "screech"
/obj/effect/proc_holder/spell/wizard/aoe_turf/unearthly_screech/cast(list/targets)
usr.audible_message("<span class='warning'><b>[usr] lets out a horrible scream!</b></span>")
@@ -458,7 +468,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
M.ear_damage += 3
else if(issilicon(target))
var/mob/living/silicon/S = target
S << "<span class='warning'><b>ERROR $!(@ ERROR )#^! SENSOR OVERLOAD \[$(!@#</b></span>"
S << "<span class='warning'><b>ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#</b></span>"
S << 'sound/misc/interference.ogg'
playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1)
var/datum/effect/effect/system/spark_spread/sp = new /datum/effect/effect/system/spark_spread
@@ -479,12 +489,15 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
clothes_req = 0
var/targetsDrained
var/list/nearbyTargets
action_icon_state = "drain_life"
/obj/effect/proc_holder/spell/wizard/aoe_turf/drainLife/cast(list/targets, var/mob/living/carbon/human/U = usr)
targetsDrained = 0
nearbyTargets = list()
for(var/turf/T in targets)
for(var/mob/living/carbon/M in T.contents)
if(M == src)
continue
targetsDrained++
nearbyTargets.Add(M)
if(!targetsDrained)
@@ -514,6 +527,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
clothes_req = 0
include_user = 0
var/list/thralls_in_world = list()
action_icon_state = "revive_thrall"
/obj/effect/proc_holder/spell/wizard/targeted/reviveThrall/cast(list/targets)
for(var/mob/living/carbon/human/thrallToRevive in targets)
@@ -531,15 +545,15 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
if(ghost)
ghost << "<span class='ghostalert'>Your masters are resuscitating you! Return to your corpse if you wish to be brought to life.</span> (Verbs -> Ghost -> Re-enter corpse)"
ghost << 'sound/effects/genetics.ogg'
if(!do_mob(usr, thrallToRevive, 100))
if(!do_mob(usr, thrallToRevive, 30))
usr << "<span class='warning'>Your concentration snaps. The flow of energy ebbs.</span>"
charge_counter= charge_max
return
usr << "<span class='shadowling'><b><i>You release a massive surge of energy into [thrallToRevive]!</b></i></span>"
usr << "<span class='shadowling'><b><i>You release a massive surge of power into [thrallToRevive]!</b></i></span>"
usr.visible_message("<span class='boldannounce'><i>Red lightning surges from [usr]'s hands into [thrallToRevive]'s chest!</i></span>")
playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1)
playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1)
sleep(20)
sleep(10)
thrallToRevive.revive()
thrallToRevive.visible_message("<span class='boldannounce'>[thrallToRevive] draws in a huge breath, blinding violet light shining from their eyes.</span>", \
"<span class='shadowling'><b><i>You have returned. One of your masters has brought you from the darkness beyond.</b></i></span>")
@@ -556,6 +570,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
range = 7
charge_max = 0
clothes_req = 0
action_icon_state = "annihilate"
/obj/effect/proc_holder/spell/wizard/targeted/annihilate/cast(list/targets)
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
@@ -585,6 +600,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
range = 7
charge_max = 0
clothes_req = 0
action_icon_state = "enthrall"
/obj/effect/proc_holder/spell/wizard/targeted/hypnosis/cast(list/targets)
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
@@ -627,6 +643,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
include_user = 1
charge_max = 15
clothes_req = 0
action_icon_state = "shadow_walk"
/obj/effect/proc_holder/spell/wizard/targeted/shadowling_phase_shift/cast(list/targets)
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
@@ -645,37 +662,33 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
/obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast
name = "Glacial Blast"
desc = "Extremely empowered version of Icy Veins."
/obj/effect/proc_holder/spell/wizard/aoe_turf/ascendant_storm
name = "Lightning Storm"
desc = "Shocks everyone nearby."
panel = "Ascendant"
range = 5
range = 6
charge_max = 100
clothes_req = 0
action_icon_state = "lightning_storm"
/obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast/cast(list/targets)
/obj/effect/proc_holder/spell/wizard/aoe_turf/ascendant_storm/cast(list/targets)
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
if(SHA.phasing)
usr << "<span class='warning'>You are not in the same plane of existence. Unphase first.</span>"
charge_counter = charge_max
return
usr << "<span class='shadowling'>You freeze the nearby air.</span>"
playsound(usr.loc, 'sound/effects/ghost2.ogg', 100, 1)
usr.visible_message("<span class='warning'><b>A massive ball of lightning appears in [usr]'s hands and flares out!</b></span>", \
"<span class='shadowling'>You conjure a ball of lightning and release it.</span>")
for(var/turf/T in targets)
for(var/mob/living/carbon/human/target in T.contents)
if(is_shadow_or_thrall(target))
if(target == usr) //No message for the user, of course
continue
else
target << "<span class='danger'>You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!</span>"
continue
target << "<span class='userdanger'>You are hit by a blast of cold unlike anything you have ever felt. Your limbs instantly lock in place and you feel frost burns across your body!</span>"
target.Weaken(15)
if(target.bodytemperature)
target.bodytemperature -= INFINITY //:^)
target.take_organ_damage(0,80)
continue
target << "<span class='userdanger'>You are struck by a bolt of lightning!</span>"
playsound(target, 'sound/effects/eleczap.ogg', 50, 1)
target.electrocute_act(80, "lightning bolt")
usr.Beam(target,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
/obj/effect/proc_holder/spell/wizard/targeted/shadowlingAscendantTransmit
name = "Ascendant Broadcast"
@@ -685,10 +698,11 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
clothes_req = 0
range = -1
include_user = 1
action_icon_state = "transmit"
/obj/effect/proc_holder/spell/wizard/targeted/shadowlingAscendantTransmit/cast(list/targets)
for(var/mob/living/user in targets)
var/text = stripped_input(user, "What do you want to say to everything on and near [world.name]?.", "Transmit to World", "")
var/text = stripped_input(user, "What do you want to say to everything on and near [station_name()]?.", "Transmit to World", "")
if(!text)
return
world << "<font size=4><span class='shadowling'><b>\"[text]\"</font></span>"
@@ -8,6 +8,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
clothes_req = 0
range = -1
include_user = 1
action_icon_state = "hatch"
/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hatch/cast(list/targets)
if(usr.stat || !ishuman(usr) || !usr)
@@ -24,10 +25,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
H.visible_message("<span class='warning'>[H]'s things suddenly slip off. They hunch over and vomit up a copious amount of purple goo which begins to shape around them!</span>", \
"<span class='shadowling'>You remove any equipment which would hinder your hatching and begin regurgitating the resin which will protect you.</span>")
for(var/obj/item/I in H) //drops all items
var/obj/item/organ/O = I
if(!istype(O) || O.owner != src)
H.unEquip(I)
for(var/obj/item/I in H.contents - (H.organs | H.internal_organs)) //drops all items except organs
H.unEquip(I)
sleep(50)
var/turf/simulated/floor/F
@@ -91,12 +90,13 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
sleep(10)
H << "<span class='shadowling'><b><i>Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies.</b></i></span>"
H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hatch)
H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/glare)
H.AddSpell(/obj/effect/proc_holder/spell/wizard/aoe_turf/veil)
H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/shadow_walk)
H.AddSpell(/obj/effect/proc_holder/spell/wizard/aoe_turf/flashfreeze)
H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/collective_mind)
H.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_ascend)
H.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/glare)
H.AddSpell(new /obj/effect/proc_holder/spell/wizard/aoe_turf/veil)
H.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/shadow_walk)
H.AddSpell(new /obj/effect/proc_holder/spell/wizard/aoe_turf/flashfreeze)
H.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/collective_mind)
H.mind.remove_spell(src)
/obj/effect/proc_holder/spell/wizard/targeted/shadowling_ascend
name = "Ascend"
@@ -106,6 +106,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
clothes_req = 0
range = -1
include_user = 1
action_icon_state = "ascend"
/obj/effect/proc_holder/spell/wizard/targeted/shadowling_ascend/cast(list/targets)
if(usr.stat || !ishuman(usr) || !usr)
@@ -153,14 +154,14 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
for(var/obj/effect/proc_holder/spell/S in H.mind.spell_list)
if(S == src) continue
H.mind.remove_spell(S)
H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/annihilate)
H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/hypnosis)
H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/shadowling_phase_shift)
H.AddSpell(/obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast)
H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/shadowlingAscendantTransmit)
H.mind.transfer_to(A)
A.name = H.real_name
A.languages = H.languages
A.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/annihilate)
A.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/hypnosis)
A.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_phase_shift)
A.AddSpell(new /obj/effect/proc_holder/spell/wizard/aoe_turf/ascendant_storm)
A.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/shadowlingAscendantTransmit)
if(A.real_name)
A.real_name = H.real_name
H.invisibility = 60 //This is pretty bad, but is also necessary for the shuttle call to function properly
+7 -8
View File
@@ -251,14 +251,13 @@
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
if(M.environment_smash >= 2)
if(istype(src, /turf/simulated/wall/r_wall))
if(M.environment_smash == 3)
dismantle_wall(1)
M << "<span class='info'>You smash through the wall.</span>"
else
M << text("\blue You smash against the wall.")
take_damage(rand(25, 75))
return
if(M.environment_smash == 3)
dismantle_wall(1)
M << "<span class='info'>You smash through the wall.</span>"
else
M << text("<span class='notice'>You smash against the wall.</span>")
take_damage(rand(25, 75))
return
M << "\blue You push the wall but nothing happens!"
return
+3 -3
View File
@@ -767,7 +767,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(isturf(loc))
var/turf/T = loc
light_amount = T.get_lumcount()*10
if(light_amount > species.light_dam) //if there's enough light, start dying
if(light_amount > species.light_dam && !incorporeal_move) //if there's enough light, start dying
if(species.light_effect_amp)
adjustFireLoss(5) //This gets doubled by Shadowling's innate fire weakness, so it ends up being 10.
else
@@ -1797,9 +1797,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
holder.icon_state = "mutineer"
if("mutineer")
holder.icon_state = "mutineer"
if("Shadowling")
if("shadowling")
holder.icon_state = "hudshadowling"
if("Shadowling Thrall")
if("shadowling thrall")
holder.icon_state = "hudshadowlingthrall"
hud_list[SPECIALROLE_HUD] = holder
Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 KiB

After

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 42 KiB