diff --git a/ModularTegustation/Teguicons/64x64.dmi b/ModularTegustation/Teguicons/64x64.dmi
index f35ef9811191..91a4f46651b3 100644
Binary files a/ModularTegustation/Teguicons/64x64.dmi and b/ModularTegustation/Teguicons/64x64.dmi differ
diff --git a/ModularTegustation/tegu_items/rcorp/landmarks.dm b/ModularTegustation/tegu_items/rcorp/landmarks.dm
index 6fc353aed094..09848da9e9b8 100644
--- a/ModularTegustation/tegu_items/rcorp/landmarks.dm
+++ b/ModularTegustation/tegu_items/rcorp/landmarks.dm
@@ -11,7 +11,8 @@ GLOBAL_LIST_INIT(easysupport, list(/mob/living/simple_animal/hostile/abnormality
/mob/living/simple_animal/hostile/abnormality/voiddream,
/mob/living/simple_animal/hostile/abnormality/pisc_mermaid,
/mob/living/simple_animal/hostile/abnormality/rudolta,
- /mob/living/simple_animal/hostile/abnormality/redblooded))
+ /mob/living/simple_animal/hostile/abnormality/redblooded,
+ /mob/living/simple_animal/hostile/abnormality/wayward))
GLOBAL_LIST_INIT(easytank, list(/mob/living/simple_animal/hostile/abnormality/jangsan,
/mob/living/simple_animal/hostile/abnormality/scarecrow,
diff --git a/code/datums/abnormality/_ego_datum/waw.dm b/code/datums/abnormality/_ego_datum/waw.dm
index 965fc1c890df..ddb3102ceea6 100644
--- a/code/datums/abnormality/_ego_datum/waw.dm
+++ b/code/datums/abnormality/_ego_datum/waw.dm
@@ -220,6 +220,10 @@
item_path = /obj/item/gun/ego_gun/warring
cost = 50
+/datum/ego_datum/weapon/warring2
+ item_path = /obj/item/ego_weapon/charge/warring
+ cost = 50
+
// Clown Smiling at Me - Dark Carnival
/datum/ego_datum/armor/darkcarnival
item_path = /obj/item/clothing/suit/armor/ego_gear/waw/darkcarnival
diff --git a/code/game/objects/items/ego_weapons/waw.dm b/code/game/objects/items/ego_weapons/waw.dm
index a4699e890373..42c780252218 100644
--- a/code/game/objects/items/ego_weapons/waw.dm
+++ b/code/game/objects/items/ego_weapons/waw.dm
@@ -1627,3 +1627,73 @@
force_cap = 70 //double base damage
force_per_tile = 5 //if I can read, this means you need to cross 14 tiles for max damage
pierce_force_cost = 20
+
+/obj/item/ego_weapon/charge/warring
+ name = "warring"
+ desc = "It was a good day to die, but everybody did."
+ special = "Upon throwing, this weapon returns to the user. Throwing will activate the charge effect."
+ icon_state = "warring2"
+ force = 30
+ attack_speed = 0.8
+ throwforce = 65
+ throw_speed = 1
+ throw_range = 7
+ damtype = BLACK_DAMAGE
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ release_message = "You release your charge!"
+ charge_effect = "expend all charge stacks in a powerful burst."
+ charge_cost = 5
+ attribute_requirements = list(
+ FORTITUDE_ATTRIBUTE = 60,
+ JUSTICE_ATTRIBUTE = 60
+ )
+
+/obj/item/ego_weapon/charge/warring/Initialize()
+ ..()
+ AddElement(/datum/element/update_icon_updates_onmob)
+
+/obj/item/ego_weapon/charge/warring/attack(mob/living/target, mob/living/user)
+ if(charge == 19)//max power, get ready to throw!
+ playsound(src, 'sound/magic/lightningshock.ogg', 50, TRUE)
+ . = ..()
+ if(charge == 5)
+ playsound(src, 'sound/magic/lightningshock.ogg', 50, TRUE)
+ icon_state = "warring2_firey"
+ hitsound = 'sound/abnormalities/thunderbird/tbird_peck.ogg'
+ if(user)
+ user.update_inv_hands()
+
+/obj/item/ego_weapon/charge/warring/release_charge(mob/living/target, mob/living/user)
+ playsound(src, 'sound/abnormalities/thunderbird/tbird_bolt.ogg', 50, TRUE)
+ var/turf/T = get_turf(src)
+ for(var/mob/living/L in view(1, T))
+ var/aoe = charge * 5
+ var/userjust = (get_modified_attribute_level(user, JUSTICE_ATTRIBUTE))
+ var/justicemod = 1 + userjust/100
+ aoe*=justicemod
+ if(L == user || ishuman(L))
+ continue
+ L.apply_damage(aoe, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ new /obj/effect/temp_visual/tbirdlightning(get_turf(L))
+ icon_state = initial(icon_state)
+ hitsound = initial(hitsound)
+ charge = 0
+
+/obj/item/ego_weapon/charge/warring/on_thrown(mob/living/carbon/user, atom/target)//No, clerks cannot hilariously kill themselves with this
+ if(!CanUseEgo(user))
+ return
+ return ..()
+
+/obj/item/ego_weapon/charge/warring/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+ var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum)
+ if(thrownby && !caught)
+ if(charge >= charge_cost && isliving(hit_atom))
+ release_charge(hit_atom)
+ addtimer(CALLBACK(src, /atom/movable.proc/throw_at, thrownby, throw_range+2, throw_speed, null, TRUE), 1)
+ if(caught)
+ return
+ else
+ return ..()
+
+/obj/item/ego_weapon/charge/warring/get_clamped_volume()
+ return 40
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/KQE.dm b/code/modules/mob/living/simple_animal/abnormality/he/KQE.dm
index 5fcfac672fe6..a120f61783cd 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/KQE.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/KQE.dm
@@ -87,6 +87,7 @@
if(!LAZYLEN(GLOB.department_centers))
heart = TRUE
else
+ damage_coeff = list(BRUTE = 1, RED_DAMAGE = 0.3, WHITE_DAMAGE = 0.2, BLACK_DAMAGE = 0.2, PALE_DAMAGE = 0.2)//In regular gamemodes you are now esentially forced to suppress the heart
var/X = pick(GLOB.department_centers)
var/mob/living/simple_animal/hostile/kqe_heart/H = new(get_turf(X))
heart = H
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm b/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm
index e8d516fefd27..8c3dda4b9e46 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm
@@ -67,7 +67,7 @@
name = "Teleport"
icon_icon = 'icons/effects/effects.dmi'
button_icon_state = "rift"
- chosen_message = "You will now teleport to a random target."
+ chosen_message = "You will now teleport to your target."
chosen_attack_num = 1
/datum/action/innate/abnormality_attack/wayward_dash
@@ -108,7 +108,7 @@
if(!LAZYLEN(get_path_to(src,target, /turf/proc/Distance, 0, 30)))
to_chat(src, "Invalid target.")
return
- TryTeleport(target)
+ TryTeleport(get_turf(target))
if(2)
Dash(target)
return
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/thunder_bird.dm b/code/modules/mob/living/simple_animal/abnormality/waw/thunder_bird.dm
index 1fd50daf2a36..4f4eb3740ae0 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/thunder_bird.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/thunder_bird.dm
@@ -1,5 +1,3 @@
-GLOBAL_LIST_EMPTY(zombies)
-
/mob/living/simple_animal/hostile/abnormality/thunder_bird
name = "Thunderbird Altar"
desc = "An ominous totem built from the corpses of unusual creatures, crowned with the visage of its namesake in wood."
@@ -23,7 +21,7 @@ GLOBAL_LIST_EMPTY(zombies)
light_power = 0
pixel_x = -16
- base_pixel_x = -8
+ base_pixel_x = -16
//suppression info
maxHealth = 2000
@@ -48,6 +46,7 @@ GLOBAL_LIST_EMPTY(zombies)
//change the E.G.O to "warring"
ego_list = list(
/datum/ego_datum/weapon/warring,
+ /datum/ego_datum/weapon/warring2,
/datum/ego_datum/armor/warring
)
gift_type = /datum/ego_gifts/warring
@@ -68,6 +67,9 @@ GLOBAL_LIST_EMPTY(zombies)
aggro_vision_range = 30
ranged = TRUE//allows it to attempt charging without being in melee range
+ //Zombie list
+ var/list/spawned_mobs = list()
+
//range and attack speed for thunder bombs, taken from general bee
var/fire_cooldown_time = 3 SECONDS
var/fireball_range = 7
@@ -82,6 +84,12 @@ GLOBAL_LIST_EMPTY(zombies)
var/list/been_hit = list() // Don't get hit twice.
/*---Simple Mob Procs---*/
+/mob/living/simple_animal/hostile/abnormality/thunder_bird/PostSpawn()
+ ..()
+ if(locate(/obj/structure/tbird_perch) in get_turf(src))
+ return
+ new /obj/structure/tbird_perch(get_turf(src))
+
//attempts to charge its target regardless of distance with a short cooldown. Can be spammed if distant enough.
/mob/living/simple_animal/hostile/abnormality/thunder_bird/AttackingTarget()
if(charging)
@@ -138,9 +146,9 @@ GLOBAL_LIST_EMPTY(zombies)
//delete the zombies on death
/mob/living/simple_animal/hostile/abnormality/thunder_bird/Destroy()
..()
- for(var/mob/living/simple_animal/hostile/thunder_zombie/Z in GLOB.zombies)
+ for(var/mob/living/simple_animal/hostile/thunder_zombie/Z in spawned_mobs)
QDEL_IN(Z, rand(3) SECONDS)
- GLOB.zombies -= Z
+ spawned_mobs -= Z
/*---Dash Stuff ---*/
/mob/living/simple_animal/hostile/abnormality/thunder_bird/proc/thunder_bird_dash(target)
@@ -250,7 +258,8 @@ GLOBAL_LIST_EMPTY(zombies)
continue
if (targetAmount <= 2)
++targetAmount
- new /obj/effect/thunderbolt(get_turf(L))//do this for the # of targets + 1
+ var/obj/effect/thunderbolt/E = new(get_turf(L))//do this for the # of targets + 1
+ E.master = src
targetAmount = 0
//thunderbolt objects
@@ -265,6 +274,7 @@ GLOBAL_LIST_EMPTY(zombies)
movement_type = PHASING | FLYING
var/boom_damage = 50
layer = POINT_LAYER //Sprite should always be visible
+ var/mob/living/simple_animal/hostile/abnormality/thunder_bird/master
/obj/effect/thunderbolt/Initialize()
. = ..()
@@ -280,6 +290,8 @@ GLOBAL_LIST_EMPTY(zombies)
can_act = FALSE
playsound(src, 'sound/abnormalities/thunderbird/tbird_zombify.ogg', 45, FALSE, 5)
var/mob/living/simple_animal/hostile/thunder_zombie/C = new(get_turf(src))
+ master.spawned_mobs += C
+ C.master = master
if(!QDELETED(H))
C.name = "[H.real_name]"//applies the target's name and adds the name to its description
C.icon_state = "human_thunderbolt"
@@ -332,34 +344,10 @@ GLOBAL_LIST_EMPTY(zombies)
stat_attack = HARD_CRIT
del_on_death = FALSE
density = TRUE
+ guaranteed_butcher_results = list(/obj/item/food/badrecipe = 1)
var/list/breach_affected = list()
var/can_act = TRUE
-
-//Zombie conversion from other zombies
-/mob/living/simple_animal/hostile/thunder_zombie/proc/Convert(mob/living/carbon/human/H)
- if(!istype(H))
- return
- if(!can_act)
- return
- can_act = FALSE
- forceMove(get_turf(H))
- playsound(src, 'sound/abnormalities/thunderbird/tbird_zombify.ogg', 45, FALSE, 5)
- SLEEP_CHECK_DEATH(3)
- for(var/i = 1 to 4)
- new /obj/effect/temp_visual/sparks(get_turf(src))
- SLEEP_CHECK_DEATH(5.5)
- if(!QDELETED(H))
- if(!H.real_name)
- return FALSE
- var/mob/living/simple_animal/hostile/thunder_zombie/C = new(get_turf(src))
- C.name = "[H.real_name]"//applies the target's name and adds the name to its description
- C.icon_state = "human_thunderbolt"
- C.icon_living = "human_thunderbolt"
- C.desc = "What appears to be [H.real_name], only charred and screaming incoherently..."
- C.gender = H.gender
- C.faction = src.faction
- H.gib()
- can_act = TRUE
+ var/mob/living/simple_animal/hostile/abnormality/thunder_bird/master
//Zombie conversion from zombie kills
/mob/living/simple_animal/hostile/thunder_zombie/AttackingTarget()
@@ -374,7 +362,6 @@ GLOBAL_LIST_EMPTY(zombies)
/mob/living/simple_animal/hostile/thunder_zombie/Initialize()
. = ..()
- GLOB.zombies += src
playsound(get_turf(src), 'sound/abnormalities/thunderbird/tbird_charge.ogg', 50, 1, 4)
base_pixel_x = rand(-6,6)
pixel_x = base_pixel_x
@@ -399,3 +386,47 @@ GLOBAL_LIST_EMPTY(zombies)
revive(full_heal = TRUE, admin_revive = FALSE)
visible_message("[src] staggers back on their feet!")
playsound(get_turf(src), 'sound/abnormalities/thunderbird/tbird_bolt.ogg', 50, 0, 8)
+
+//Zombie conversion from other zombies
+/mob/living/simple_animal/hostile/thunder_zombie/proc/Convert(mob/living/carbon/human/H)
+ if(!istype(H))
+ return
+ if(!can_act)
+ return
+ can_act = FALSE
+ forceMove(get_turf(H))
+ playsound(src, 'sound/abnormalities/thunderbird/tbird_zombify.ogg', 45, FALSE, 5)
+ SLEEP_CHECK_DEATH(3)
+ for(var/i = 1 to 4)
+ new /obj/effect/temp_visual/sparks(get_turf(src))
+ SLEEP_CHECK_DEATH(5.5)
+ if(!QDELETED(H))
+ if(!H.real_name)
+ return FALSE
+ var/mob/living/simple_animal/hostile/thunder_zombie/C = new(get_turf(src))
+ if(master)
+ master.spawned_mobs += C
+ C.master = master
+ C.name = "[H.real_name]"//applies the target's name and adds the name to its description
+ C.icon_state = "human_thunderbolt"
+ C.icon_living = "human_thunderbolt"
+ C.desc = "What appears to be [H.real_name], only charred and screaming incoherently..."
+ C.gender = H.gender
+ C.faction = src.faction
+ H.gib()
+ can_act = TRUE
+
+//The perch
+/obj/structure/tbird_perch
+ name = "thunderbird altar"
+ desc = "An idol bloodied by the creature who stood upon it.."
+ icon = 'ModularTegustation/Teguicons/64x64.dmi'
+ icon_state = "thunderbird_altar"
+ pixel_x = -16
+ base_pixel_x = -16
+ anchored = TRUE
+ density = FALSE
+ layer = TURF_LAYER
+ plane = FLOOR_PLANE
+ resistance_flags = INDESTRUCTIBLE
+ mouse_opacity = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/gold.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/gold.dm
index 2f974ca43264..edf5d932aec4 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/gold.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/gold.dm
@@ -621,6 +621,7 @@
C.desc = "What appears to be [H.real_name], only charred and screaming incoherently..."
C.gender = H.gender
C.faction = src.faction
+ C.master = src
spawned_mobs += C
H.gib()
diff --git a/code/modules/projectiles/projectile/magic/abnormality.dm b/code/modules/projectiles/projectile/magic/abnormality.dm
index f606fcb66c64..bc88f52121ad 100644
--- a/code/modules/projectiles/projectile/magic/abnormality.dm
+++ b/code/modules/projectiles/projectile/magic/abnormality.dm
@@ -227,7 +227,8 @@
/obj/projectile/thunder_tomahawk
name = "tomahawk"
desc = "Look out!"
- icon_state = "thunder_tomahawk"
+ icon = 'icons/obj/ego_weapons.dmi'
+ icon_state = "warring2_firey"
damage_type = BLACK_DAMAGE
damage = 45
diff --git a/icons/mob/inhands/weapons/ego_lefthand.dmi b/icons/mob/inhands/weapons/ego_lefthand.dmi
index 1b90e8f2de54..2f0b2b91a9ed 100644
Binary files a/icons/mob/inhands/weapons/ego_lefthand.dmi and b/icons/mob/inhands/weapons/ego_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/ego_righthand.dmi b/icons/mob/inhands/weapons/ego_righthand.dmi
index 4af90a221065..8a512ed539a2 100644
Binary files a/icons/mob/inhands/weapons/ego_righthand.dmi and b/icons/mob/inhands/weapons/ego_righthand.dmi differ
diff --git a/icons/obj/ego_weapons.dmi b/icons/obj/ego_weapons.dmi
index d154f7394617..2ee04388c783 100644
Binary files a/icons/obj/ego_weapons.dmi and b/icons/obj/ego_weapons.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 31b4b73cd90a..a0b1cacf31ef 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ