diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 23e937acf102..11eeef8b4a8e 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -180,3 +180,7 @@
/mob/living/carbon/alien/on_standing_up()
. = ..()
update_icons()
+
+/mob/living/carbon/alien/examine(mob/user)
+ . = ..()
+ . += "It's a strange creature."
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
index ec4105fde0ce..ccd6540ffca1 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
@@ -291,7 +291,7 @@ Doesn't work on other aliens/AI.*/
/obj/effect/proc_holder/alien/sneak/fire(mob/living/carbon/alien/humanoid/user)
if(!active)
- user.alpha = 25
+ user.alpha = 150
user.sneaking = TRUE
active = TRUE
to_chat(user, "You blend into the shadows...")
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index 5163821a9573..57835578cf84 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -100,8 +100,7 @@
return
else //Maybe uses plasma in the future, although that wouldn't make any sense...
- leaping = 1
- weather_immunities += "lava"
+ leaping = TRUE
update_icons()
throw_at(leap_target, MAX_ALIEN_LEAP_DIST, 2, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(leap_end)))
@@ -115,7 +114,6 @@
* the icons of the hunter.
*/
/mob/living/carbon/alien/humanoid/hunter/proc/leap_end()
- leaping = 0
- LAZYREMOVE(weather_immunities, "lava")
+ leaping = FALSE
update_icons()
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index 49ff1e88937b..4e797ede06c0 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -104,7 +104,8 @@
if(gib_on_success)
new_xeno.visible_message("[new_xeno] bursts out of [owner] in a shower of gore!", "You exit [owner], your previous host.", "You hear organic matter ripping and tearing!")
- owner.gib()
+ owner.adjustBruteLoss(200)
+ owner.cut_overlay(overlay)
else
new_xeno.visible_message("[new_xeno] wriggles out of [owner]!", "You exit [owner], your previous host.")
owner.adjustBruteLoss(40)
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index a9caeba37208..c9cdcaf8199c 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -47,7 +47,7 @@
/// Whether or not this facehugger can actually impregnate targets
var/sterile = FALSE
/// How long it takes for a facehugger to impregnate a target once attached
- var/pregnation_time = 10 SECONDS
+ var/pregnation_time = 5 SECONDS
/// How long it takes between coupling attempts
var/couple_retry_time = 15 SECONDS
/// The mob's internal mask version, stored within the mob when the facehugger isn't being used as an item.
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 123ecf6d4fba..7091090f8877 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -284,30 +284,30 @@
return TRUE
apply_damage(damage, BRUTE, affecting, armor_block)
- if(M.a_intent == INTENT_DISARM) //Always drop item in hand on first go. If no item exists, try to shove them back. If you share the tile with the target, slam them directly into the ground to stun them and slightly damage them.
- var/obj/item/I = get_active_held_item()
- if(I && dropItemToGround(I))
- playsound(loc, 'sound/weapons/slash.ogg', 25, TRUE, -1)
- visible_message("[M] disarms [src]!", \
- "[M] disarms you!", "You hear aggressive shuffling!", null, M)
- to_chat(M, "You disarm [src]!")
- else if(get_dist(src, M) != 0)
- playsound(loc, 'sound/weapons/pierce.ogg', 25, TRUE, -1)
- var/shovetarget = get_edge_target_turf(M, get_dir(M, get_step_away(src, M)))
- Knockdown(0.3 SECONDS)
- throw_at(shovetarget, 4, 2, M, force = MOVE_FORCE_OVERPOWERING)
- log_combat(M, src, "shoved")
- visible_message("[M] tackles [src] down!", \
- "[M] shoves you with great force!", "You hear aggressive shuffling followed by a loud thud!", null, M)
- to_chat(M, "You shove [src] with great force!")
- else
- Paralyze(3 SECONDS)
- adjustBruteLoss(5)
- playsound(loc, 'sound/weapons/punch3.ogg', 25, TRUE, -1)
- visible_message("[M] slams [src] into the floor!", \
- "[M] slams you into the ground!", "You hear something slam loudly onto the floor!", null, M)
- to_chat(M, "You slam [src] into the floor beneath you!")
- log_combat(M, src, "slammed into the ground")
+ if(M.a_intent == INTENT_DISARM) //Always drop item in hand on first go. If no item exists, try to shove them back. If you share the tile with the target, slam them directly into the ground to stun them and slightly damage them.
+ var/obj/item/I = get_active_held_item()
+ if(I && dropItemToGround(I) && prob(50))
+ playsound(loc, 'sound/weapons/slash.ogg', 25, TRUE, -1)
+ visible_message("[M] disarms [src]!", \
+ "[M] disarms you!", "You hear aggressive shuffling!", null, M)
+ to_chat(M, "You disarm [src]!")
+ else if(get_dist(src, M) != 0)
+ playsound(loc, 'sound/weapons/pierce.ogg', 25, TRUE, -1)
+ var/shovetarget = get_edge_target_turf(M, get_dir(M, get_step_away(src, M)))
+ Knockdown(0.3 SECONDS)
+ throw_at(shovetarget, 4, 2, M, force = MOVE_FORCE_OVERPOWERING)
+ log_combat(M, src, "shoved")
+ visible_message("[M] tackles [src] down!", \
+ "[M] shoves you with great force!", "You hear aggressive shuffling followed by a loud thud!", null, M)
+ to_chat(M, "You shove [src] with great force!")
+ else
+ Paralyze(1 SECONDS)
+ adjustBruteLoss(5)
+ playsound(loc, 'sound/weapons/punch3.ogg', 25, TRUE, -1)
+ visible_message("[M] slams [src] into the floor!", \
+ "[M] slams you into the ground!", "You hear something slam loudly onto the floor!", null, M)
+ to_chat(M, "You slam [src] into the floor beneath you!")
+ log_combat(M, src, "slammed into the ground")
/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L)
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index f91eb07f52cb..45d7f96b7df4 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -366,7 +366,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
smoke.start()
-/obj/effect/proc_holder/spell/proc/cast(list/targets,mob/user = usr)
+/obj/effect/proc_holder/spell/proc/cast(list/targets, mob/user = usr)
return
/obj/effect/proc_holder/spell/proc/view_or_range(distance = world.view, center=usr, type="view")
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index 387a2ee9712c..2fab8c5848ef 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -242,46 +242,34 @@
sound = 'sound/magic/repulse.ogg'
var/maxthrow = 5
var/sparkle_path = /obj/effect/temp_visual/gravpush
- var/anti_magic_check = TRUE
var/repulse_force = MOVE_FORCE_EXTREMELY_STRONG
-
+ var/stun_amt = 5
action_icon_state = "repulse"
-/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets,mob/user = usr, stun_amt = 5)
+/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/hit_turfs, mob/user = usr)
var/list/thrownatoms = list()
- var/atom/throwtarget
var/distfromcaster
playMagSound()
- for(var/atom/movable/hit_target as anything in targets) //Done this way so things don't get thrown all around hilariously.
- thrownatoms += hit_target
- for(var/am in thrownatoms)
- var/atom/movable/AM = am
+ for(var/turf/T in hit_turfs)
+ for(var/atom/movable/hit_target in T.contents)
+ thrownatoms += hit_target
+
+ for(var/thrown_atom in thrownatoms)
+ if(!ismovable(thrown_atom))
+ continue
+ var/atom/movable/AM = thrown_atom
if(AM == user || AM.anchored)
continue
-
- if(ismob(AM))
- var/mob/M = AM
- if(M.anti_magic_check(anti_magic_check, FALSE))
- continue
-
- throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(AM, user)))
- distfromcaster = get_dist(user, AM)
- if(distfromcaster == 0)
- if(isliving(AM))
- var/mob/living/M = AM
- M.Paralyze(40)
- M.adjustBruteLoss(5)
- shake_camera(AM, 2, 1)
- to_chat(M, "You're slammed into the floor by [user]!")
- else
- new sparkle_path(get_turf(AM), get_dir(user, AM)) //created sparkles will disappear on their own
- if(isliving(AM))
- var/mob/living/M = AM
- shake_camera(AM, 2, 1)
+ var/atom/throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(AM, user)))
+ new sparkle_path(get_turf(AM), get_dir(user, AM)) //created sparkles will disappear on their own
+ if(isliving(AM))
+ var/mob/living/M = AM
+ shake_camera(AM, 2, 1)
+ if(stun_amt)
M.Paralyze(stun_amt)
- to_chat(M, "You're thrown back by [user]!")
- AM.safe_throw_at(throwtarget, ((clamp((maxthrow - (clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user, force = repulse_force)//So stuff gets tossed around at the same time.
+ to_chat(M, "You're thrown back by [user]!")
+ AM.safe_throw_at(throwtarget, ((clamp((maxthrow - (clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user, force = repulse_force)//So stuff gets tossed around at the same time.
/obj/effect/proc_holder/spell/aoe_turf/repulse/xeno //i fixed conflicts only to find out that this is in the WIZARD file instead of the xeno file?!
name = "Tail Sweep"
@@ -297,7 +285,7 @@
action_icon = 'icons/mob/actions/actions_xeno.dmi'
action_icon_state = "tailsweep"
action_background_icon_state = "bg_alien"
- anti_magic_check = FALSE
+ stun_amt = 0
/obj/effect/proc_holder/spell/aoe_turf/repulse/xeno/cast(list/targets,mob/user = usr)
if(iscarbon(user))