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