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