diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 9faf018a7889b..3f5c82772e3f9 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -540,6 +540,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) return FALSE return TRUE + /obj/effect/proc_holder/spell/summonmob name = "Summon Servant" desc = "This spell can be used to call your servant, whenever you need it." diff --git a/code/modules/events/spider_terror.dm b/code/modules/events/spider_terror.dm index d5805c75a565b..9f0d0a677a525 100644 --- a/code/modules/events/spider_terror.dm +++ b/code/modules/events/spider_terror.dm @@ -65,9 +65,8 @@ var/mob/M = pick_n_take(candidates) S.key = M.key dust_if_respawnable(M) - if(infestation_type != PRINCE_SPIDER) - S.forceMove(vent) - S.add_ventcrawl(vent) + S.forceMove(vent) + S.add_ventcrawl(vent) SEND_SOUND(S, sound('sound/ambience/antag/terrorspider.ogg')) S.give_intro_text() spawncount-- diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm index f9f6f7016d7da..3fc52c744b580 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm @@ -23,6 +23,8 @@ maxHealth = 600 // 30 laser shots health = 600 regen_points_per_hp = 6 // double the normal - IE halved regen speed + move_to_delay = 3 + speed = 0.5 melee_damage_lower = 30 melee_damage_upper = 40 ventcrawler = 0 @@ -40,3 +42,67 @@ L.KnockDown(10 SECONDS) L.adjustStaminaLoss(40) return ..() + +/mob/living/simple_animal/hostile/poison/terror_spider/prince/Initialize(mapload) + . = ..() + if(mind) + var/obj/effect/proc_holder/spell/spell = new /obj/effect/proc_holder/spell/princely_charge() + mind.AddSpell(spell) + else + RegisterSignal(src, COMSIG_MOB_LOGIN, TYPE_PROC_REF(/mob/living/simple_animal/hostile/poison/terror_spider/prince, give_spell)) + +/mob/living/simple_animal/hostile/poison/terror_spider/prince/proc/give_spell() + SIGNAL_HANDLER + var/obj/effect/proc_holder/spell/spell = new /obj/effect/proc_holder/spell/princely_charge() + mind.AddSpell(spell) + UnregisterSignal(src, COMSIG_MOB_LOGIN) + +/obj/effect/proc_holder/spell/princely_charge + name = "Princely Charge" + desc = "You charge at wherever you click on screen, dealing large amounts of damage, stunning and destroying walls and other objects." + gain_desc = "You can now charge at a target on screen, dealing massive damage and destroying structures." + base_cooldown = 30 SECONDS + clothes_req = FALSE + action_icon_state = "terror_prince" + +/obj/effect/proc_holder/spell/princely_charge/create_new_targeting() + return new /datum/spell_targeting/clicked_atom + +/obj/effect/proc_holder/spell/princely_charge/cast(list/targets, mob/user) + var/target = targets[1] + if(isliving(user)) + var/mob/living/L = user + L.apply_status_effect(STATUS_EFFECT_CHARGING) + L.throw_at(target, 9, 1, L, FALSE, callback = CALLBACK(L, TYPE_PROC_REF(/mob/living, remove_status_effect), STATUS_EFFECT_CHARGING)) + +/mob/living/simple_animal/hostile/poison/terror_spider/prince/throw_impact(atom/hit_atom, throwingdatum) + . = ..() + if(!has_status_effect(STATUS_EFFECT_CHARGING) || has_status_effect(STATUS_EFFECT_IMPACT_IMMUNE)) + return + + var/hit_something = FALSE + if(ismovable(hit_atom)) + var/atom/movable/AM = hit_atom + var/atom/throw_target = get_edge_target_turf(AM, dir) + if(!AM.anchored || ismecha(AM)) + AM.throw_at(throw_target, 5, 12, src) + hit_something = TRUE + if(isobj(hit_atom)) + var/obj/O = hit_atom + O.take_damage(150, BRUTE) + hit_something = TRUE + if(isliving(hit_atom)) + var/mob/living/L = hit_atom + L.adjustBruteLoss(60) + L.KnockDown(12 SECONDS) + L.Confused(10 SECONDS) + shake_camera(L, 4, 3) + hit_something = TRUE + if(isturf(hit_atom)) + var/turf/T = hit_atom + if(iswallturf(T)) + T.dismantle_wall(TRUE) + hit_something = TRUE + if(hit_something) + visible_message("<span class='danger'>[src] slams into [hit_atom]!</span>", "<span class='userdanger'>You slam into [hit_atom]!</span>") + playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 100, TRUE) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index b04db3f1dd349..da2c3a0ca986c 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -474,3 +474,7 @@ GLOBAL_LIST_EMPTY(ts_infected_list) . = ..() if(pulling && !ismob(pulling) && pulling.density) . += 6 // Drastic move speed penalty for dragging anything that is not a mob or a non dense object + +/mob/living/simple_animal/hostile/poison/terror_spider/Login() + . = ..() + SEND_SIGNAL(src, COMSIG_MOB_LOGIN) diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index cdf7f3b8cedee..247d0b32dd76c 100644 Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ