diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm
index 739a03d92c5..6bcba4cd83b 100644
--- a/code/datums/spells/wizard.dm
+++ b/code/datums/spells/wizard.dm
@@ -383,18 +383,18 @@
name = "Repulse"
desc = "This spell throws everything around the user away."
charge_max = 400
- clothes_req = 1
+ clothes_req = TRUE
invocation = "GITTAH WEIGH"
invocation_type = "shout"
range = 5
cooldown_min = 150
selection_type = "view"
+ sound = 'sound/magic/repulse.ogg'
var/maxthrow = 5
var/sparkle_path = /obj/effect/temp_visual/gravpush
action_icon_state = "repulse"
- sound = 'sound/magic/repulse.ogg'
-/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, stun_amt = 2)
var/list/thrownatoms = list()
var/atom/throwtarget
var/distfromcaster
@@ -411,16 +411,16 @@
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)
to_chat(M, "You're slammed into the floor by a mystical force!")
else
new sparkle_path(get_turf(AM), get_dir(user, AM)) //created sparkles will disappear on their own
- if(istype(AM, /mob/living))
+ if(isliving(AM))
var/mob/living/M = AM
- M.Weaken(2)
+ M.Weaken(stun_amt)
to_chat(M, "You're thrown back by a mystical force!")
spawn(0)
AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1)//So stuff gets tossed around at the same time.
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index d6dbf1dddbb..f7a0962269d 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -90,6 +90,10 @@
/obj/effect/temp_visual/dir_setting/wraith/out
icon_state = "phase_shift"
+/obj/effect/temp_visual/dir_setting/tailsweep
+ icon_state = "tailsweep"
+ duration = 4
+
/obj/effect/temp_visual/wizard
name = "water"
icon = 'icons/mob/mob.dmi'
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index cade1489c63..8eed750804f 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -231,6 +231,16 @@ Difficulty: Very Hard
target = new_target
INVOKE_ASYNC(src, /atom/movable/proc/orbit, target, 0, FALSE, 0, 0, FALSE, TRUE)
+/mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/item/projectile/P)
+ if(!stat)
+ var/obj/effect/temp_visual/at_shield/AT = new /obj/effect/temp_visual/at_shield(loc, src)
+ var/random_x = rand(-32, 32)
+ AT.pixel_x += random_x
+
+ var/random_y = rand(0, 72)
+ AT.pixel_y += random_y
+ return ..()
+
/obj/item/projectile/colossus
name ="death bolt"
icon_state= "chronobolt"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index ccd00514daa..8b6d6fed947 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -599,4 +599,74 @@ obj/effect/temp_visual/fireball
player_cooldown = world.time + 200 // needs seperate cooldown or cant use fire attacks
/mob/living/simple_animal/hostile/megafauna/dragon/lesser/grant_achievement(medaltype,scoretype)
+ return
+
+/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon
+ name = "space dragon"
+ maxHealth = 250
+ health = 250
+ faction = list("neutral")
+ desc = "A space carp turned dragon by vile magic. Has the same ferocity of a space carp, but also a much more enabling body."
+ icon = 'icons/mob/spacedragon.dmi'
+ icon_state = "spacedragon"
+ icon_living = "spacedragon"
+ icon_dead = "spacedragon_dead"
+ obj_damage = 80
+ melee_damage_upper = 35
+ melee_damage_lower = 35
+ speed = 0
+ mouse_opacity = MOUSE_OPACITY_ICON
+ loot = list()
+ crusher_loot = list()
+ butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
+ move_force = MOVE_FORCE_NORMAL
+ move_resist = MOVE_FORCE_NORMAL
+ pull_force = MOVE_FORCE_NORMAL
+ deathmessage = "screeches as its wings turn to dust and it collapses on the floor, life estinguished."
+ attack_action_types = list()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/grant_achievement(medaltype, scoretype)
+ return
+
+/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/Initialize(mapload)
+ var/obj/effect/proc_holder/spell/aoe_turf/repulse/spacedragon/repulse_action = new /obj/effect/proc_holder/spell/aoe_turf/repulse/spacedragon(src)
+ repulse_action.action.Grant(src)
+ mob_spell_list += repulse_action
+ . = ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/proc/fire_stream(var/atom/at = target)
+ playsound(get_turf(src),'sound/magic/fireball.ogg', 200, TRUE)
+ SLEEP_CHECK_DEATH(0)
+ var/range = 20
+ var/list/turfs = list()
+ turfs = line_target(0, range, at)
+ INVOKE_ASYNC(src, .proc/fire_line, turfs)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/OpenFire()
+ if(swooping)
+ return
+ ranged_cooldown = world.time + ranged_cooldown_time
+ fire_stream()
+
+/obj/effect/proc_holder/spell/aoe_turf/repulse/spacedragon
+ name = "Tail Sweep"
+ desc = "Throw back attackers with a sweep of your tail."
+ sound = 'sound/magic/tail_swing.ogg'
+ charge_max = 150
+ clothes_req = FALSE
+ range = 1
+ cooldown_min = 150
+ invocation_type = "none"
+ sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep
+ action_icon_state = "tailsweep"
+ action_background_icon_state = "bg_alien"
+
+/obj/effect/proc_holder/spell/aoe_turf/repulse/spacedragon/cast(list/targets, mob/user = usr)
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ playsound(C.loc, 'sound/effects/hit_punch.ogg', 80, TRUE, TRUE)
+ C.spin(6, 1)
+ ..(targets, user, 3)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/AltClickOn(atom/movable/A)
return
\ No newline at end of file
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index bea6f281f7a..89f57b2517d 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi
index 66795e14830..4ea648dea13 100644
Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ
diff --git a/icons/mob/spacedragon.dmi b/icons/mob/spacedragon.dmi
new file mode 100644
index 00000000000..98f20ea8851
Binary files /dev/null and b/icons/mob/spacedragon.dmi differ