From a37f2de71d085799b16d6cc9bd9263bec39f998c Mon Sep 17 00:00:00 2001 From: Useroth Date: Sun, 8 Dec 2019 14:00:08 +0100 Subject: [PATCH 1/4] First step of porting lavaland tumors. Looks like Cita is much behind tg regarding simplemobs. --- code/_onclick/hud/_defines.dm | 4 ++++ code/_onclick/hud/screen_objects.dm | 6 ++++++ .../mood_events/generic_positive_events.dm | 5 +++++ code/datums/ruins/lavaland.dm | 11 ++++++++++- .../mob/living/carbon/human/human_defense.dm | 6 +++++- icons/mob/accessories.dmi | Bin 9452 -> 9688 bytes icons/mob/neck.dmi | Bin 44445 -> 45707 bytes icons/obj/lavaland/artefacts.dmi | Bin 25700 -> 26100 bytes tgstation.dme | 6 ++++++ 9 files changed, 36 insertions(+), 2 deletions(-) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 167fa989b2..9d53703cdd 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -107,6 +107,10 @@ #define ui_internal "EAST-1:28,CENTER+1:19"//CIT CHANGE - moves internal icon up a little bit to accommodate for the stamina meter #define ui_mood "EAST-1:28,CENTER-3:10" +//living +#define ui_living_pull "EAST-1:28,CENTER-2:15" +#define ui_living_health "EAST-1:28,CENTER:15" + //borgs #define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator. diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 5f128ff76d..86b4b0c024 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -644,6 +644,12 @@ screen_loc = ui_construct_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT +/obj/screen/healths/lavaland_elite + icon = 'icons/mob/screen_elite.dmi' + icon_state = "elite_health0" + screen_loc = ui_health + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + /obj/screen/healthdoll name = "health doll" screen_loc = ui_healthdoll diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 9ae7ba2289..731df2ea1a 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -148,3 +148,8 @@ /datum/mood_event/fedprey description = "It feels quite cozy in here.\n" mood_change = 3 + +/datum/mood_event/hope_lavaland + description = "What a peculiar emblem. It makes me feel hopeful for my future.\n" + mood_change = 5 + diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 4f18e6fd62..7ea2d2615d 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -229,4 +229,13 @@ id = "puzzle" description = "Mystery to be solved." suffix = "lavaland_surface_puzzle.dmm" - cost = 5 \ No newline at end of file + cost = 5 + +/datum/map_template/ruin/lavaland/elite_tumor + name = "Pulsating Tumor" + id = "tumor" + description = "A strange tumor which houses a powerful beast..." + suffix = "lavaland_surface_elite_tumor.dmm" + cost = 5 + always_place = TRUE + allow_duplicates = TRUE diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index f9fa5d84da..d4a7e8e1fb 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -23,7 +23,7 @@ if(!d_type) return 0 var/protection = 0 - var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor) + var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id, wear_neck) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor) for(var/bp in body_parts) if(!bp) continue @@ -116,6 +116,10 @@ var/final_block_chance = w_uniform.block_chance - (CLAMP((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier if(w_uniform.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) return 1 + if(wear_neck) + var/final_block_chance = wear_neck.block_chance - (CLAMP((armour_penetration-wear_neck.armour_penetration)/2,0,100)) + block_chance_modifier + if(wear_neck.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) + return 1 return 0 /mob/living/carbon/human/proc/check_block() diff --git a/icons/mob/accessories.dmi b/icons/mob/accessories.dmi index 33964645ee192faadb0ce7db9dc4a2b412c7bdfd..cda7cca4049d1a95511f5cf0f97ab8bb34d66a90 100644 GIT binary patch literal 9688 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 O0-illS1gw|4fro9-8x(V literal 9452 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 mj5Ko5S7+u|A$RqX{!$Q diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi index 5eb270d23f34996d04d8910f732a963cdc24a94d..de59a136d99ca23e0b751b962395756793bcaafb 100644 GIT binary patch delta 2980 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 Date: Sun, 8 Dec 2019 14:05:05 +0100 Subject: [PATCH 2/4] Forgot to track the new files --- .../lavaland_surface_elite_tumor.dmm | 111 ++++++ code/_onclick/hud/lavaland_elite.dm | 16 + .../hostile/mining_mobs/elites/elite.dm | 360 ++++++++++++++++++ .../mining_mobs/elites/goliath_broodmother.dm | 245 ++++++++++++ .../hostile/mining_mobs/elites/herald.dm | 274 +++++++++++++ .../hostile/mining_mobs/elites/legionnaire.dm | 300 +++++++++++++++ .../hostile/mining_mobs/elites/pandora.dm | 192 ++++++++++ icons/mob/actions/actions_elites.dmi | Bin 0 -> 8631 bytes icons/mob/lavaland/lavaland_elites.dmi | Bin 0 -> 20149 bytes icons/mob/screen_elite.dmi | Bin 0 -> 6735 bytes icons/obj/lavaland/elite_trophies.dmi | Bin 0 -> 1057 bytes icons/obj/lavaland/legionnaire_bonfire.dmi | Bin 0 -> 1184 bytes icons/obj/lavaland/tumor.dmi | Bin 0 -> 988 bytes sound/magic/curse.ogg | Bin 0 -> 17620 bytes 14 files changed, 1498 insertions(+) create mode 100644 _maps/RandomRuins/LavaRuins/lavaland_surface_elite_tumor.dmm create mode 100644 code/_onclick/hud/lavaland_elite.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm create mode 100644 icons/mob/actions/actions_elites.dmi create mode 100644 icons/mob/lavaland/lavaland_elites.dmi create mode 100644 icons/mob/screen_elite.dmi create mode 100644 icons/obj/lavaland/elite_trophies.dmi create mode 100644 icons/obj/lavaland/legionnaire_bonfire.dmi create mode 100644 icons/obj/lavaland/tumor.dmi create mode 100644 sound/magic/curse.ogg diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elite_tumor.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elite_tumor.dmm new file mode 100644 index 0000000000..6e44ec3197 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elite_tumor.dmm @@ -0,0 +1,111 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/lavaland/surface/outdoors) +"b" = ( +/obj/structure/elite_tumor, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"c" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +a +a +c +c +c +a +a +a +"} +(5,1,1) = {" +a +a +a +c +b +c +a +a +a +"} +(6,1,1) = {" +a +a +a +c +c +c +a +a +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +a +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +"} diff --git a/code/_onclick/hud/lavaland_elite.dm b/code/_onclick/hud/lavaland_elite.dm new file mode 100644 index 0000000000..277ea8b898 --- /dev/null +++ b/code/_onclick/hud/lavaland_elite.dm @@ -0,0 +1,16 @@ +/datum/hud/lavaland_elite + ui_style = 'icons/mob/screen_elite.dmi' + +/datum/hud/lavaland_elite/New(mob/living/simple_animal/hostile/asteroid/elite) + ..() + + pull_icon = new /obj/screen/pull() + pull_icon.icon = ui_style + pull_icon.update_icon() + pull_icon.screen_loc = ui_living_pull + pull_icon.hud = src + static_inventory += pull_icon + + healths = new /obj/screen/healths/lavaland_elite() + healths.hud = src + infodisplay += healths diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm new file mode 100644 index 0000000000..7c135cc970 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -0,0 +1,360 @@ +#define TUMOR_INACTIVE 0 +#define TUMOR_ACTIVE 1 +#define TUMOR_PASSIVE 2 + +//Elite mining mobs +/mob/living/simple_animal/hostile/asteroid/elite + name = "elite" + desc = "An elite monster, found in one of the strange tumors on lavaland." + icon = 'icons/mob/lavaland/lavaland_elites.dmi' + faction = list("boss") + robust_searching = TRUE + ranged_ignores_vision = TRUE + ranged = TRUE + obj_damage = 5 + vision_range = 6 + aggro_vision_range = 18 + environment_smash = ENVIRONMENT_SMASH_NONE //This is to prevent elites smashing up the mining station, we'll make sure they can smash minerals fine below. + harm_intent_damage = 0 //Punching elites gets you nowhere + stat_attack = UNCONSCIOUS + layer = LARGE_MOB_LAYER + sentience_type = SENTIENCE_BOSS + hud_type = /datum/hud/lavaland_elite + var/chosen_attack = 1 + var/list/attack_action_types = list() + var/can_talk = FALSE + var/obj/loot_drop = null + + +//Gives player-controlled variants the ability to swap attacks +/mob/living/simple_animal/hostile/asteroid/elite/Initialize(mapload) + . = ..() + for(var/action_type in attack_action_types) + var/datum/action/innate/elite_attack/attack_action = new action_type() + attack_action.Grant(src) + +//Prevents elites from attacking members of their faction (can't hurt themselves either) and lets them mine rock with an attack despite not being able to smash walls. +/mob/living/simple_animal/hostile/asteroid/elite/AttackingTarget() + if(istype(target, /mob/living/simple_animal/hostile)) + var/mob/living/simple_animal/hostile/M = target + if(faction_check_mob(M)) + return FALSE + if(istype(target, /obj/structure/elite_tumor)) + var/obj/structure/elite_tumor/T = target + if(T.mychild == src && T.activity == TUMOR_PASSIVE) + var/elite_remove = alert("Re-enter the tumor?", "Despawn yourself?", "Yes", "No") + if(elite_remove == "No" || !src || QDELETED(src)) + return + T.mychild = null + T.activity = TUMOR_INACTIVE + T.icon_state = "advanced_tumor" + qdel(src) + return FALSE + . = ..() + if(ismineralturf(target)) + var/turf/closed/mineral/M = target + M.gets_drilled() + +//Elites can't talk (normally)! +/mob/living/simple_animal/hostile/asteroid/elite/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) + if(can_talk) + . = ..() + return TRUE + return FALSE + +/*Basic setup for elite attacks, based on Whoneedspace's megafauna attack setup. +While using this makes the system rely on OnFire, it still gives options for timers not tied to OnFire, and it makes using attacks consistent accross the board for player-controlled elites.*/ + +/datum/action/innate/elite_attack + name = "Elite Attack" + icon_icon = 'icons/mob/actions/actions_elites.dmi' + button_icon_state = "" + background_icon_state = "bg_default" + var/mob/living/simple_animal/hostile/asteroid/elite/M + var/chosen_message + var/chosen_attack_num = 0 + +/datum/action/innate/elite_attack/Grant(mob/living/L) + if(istype(L, /mob/living/simple_animal/hostile/asteroid/elite)) + M = L + return ..() + return FALSE + +/datum/action/innate/elite_attack/Activate() + M.chosen_attack = chosen_attack_num + to_chat(M, chosen_message) + +/mob/living/simple_animal/hostile/asteroid/elite/updatehealth() + . = ..() + update_health_hud() + +/mob/living/simple_animal/hostile/asteroid/elite/update_health_hud() + if(hud_used) + var/severity = 0 + var/healthpercent = (health/maxHealth) * 100 + switch(healthpercent) + if(100 to INFINITY) + hud_used.healths.icon_state = "elite_health0" + if(80 to 100) + severity = 1 + if(60 to 80) + severity = 2 + if(40 to 60) + severity = 3 + if(20 to 40) + severity = 4 + if(10 to 20) + severity = 5 + if(1 to 20) + severity = 6 + else + severity = 7 + hud_used.healths.icon_state = "elite_health[severity]" + if(severity > 0) + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") + +//The Pulsing Tumor, the actual "spawn-point" of elites, handles the spawning, arena, and procs for dealing with basic scenarios. + +/obj/structure/elite_tumor + name = "pulsing tumor" + desc = "An odd, pulsing tumor sticking out of the ground. You feel compelled to reach out and touch it..." + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + resistance_flags = INDESTRUCTIBLE + var/activity = TUMOR_INACTIVE + var/boosted = FALSE + var/times_won = 0 + var/mob/living/carbon/human/activator = null + var/mob/living/simple_animal/hostile/asteroid/elite/mychild = null + var/potentialspawns = list(/mob/living/simple_animal/hostile/asteroid/elite/broodmother, + /mob/living/simple_animal/hostile/asteroid/elite/pandora, + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire, + /mob/living/simple_animal/hostile/asteroid/elite/herald) + icon = 'icons/obj/lavaland/tumor.dmi' + icon_state = "tumor" + pixel_x = -16 + light_color = LIGHT_COLOR_RED + light_range = 3 + anchored = TRUE + density = FALSE + +/obj/structure/elite_tumor/attack_hand(mob/user) + . = ..() + if(ishuman(user)) + switch(activity) + if(TUMOR_PASSIVE) + activity = TUMOR_ACTIVE + visible_message("[src] convulses as your arm enters its radius. Your instincts tell you to step back.") + activator = user + if(boosted) + mychild.playsound_local(get_turf(mychild), 'sound/effects/magic.ogg', 40, 0) + to_chat(mychild, "Someone has activated your tumor. You will be returned to fight shortly, get ready!") + addtimer(CALLBACK(src, .proc/return_elite), 30) + INVOKE_ASYNC(src, .proc/arena_checks) + if(TUMOR_INACTIVE) + activity = TUMOR_ACTIVE + var/mob/dead/observer/elitemind = null + visible_message("[src] begins to convulse. Your instincts tell you to step back.") + activator = user + if(!boosted) + addtimer(CALLBACK(src, .proc/spawn_elite), 30) + return + visible_message("Something within [src] stirs...") + var/list/candidates = pollCandidatesForMob("Do you want to play as a lavaland elite?", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, src, POLL_IGNORE_SENTIENCE_POTION) + if(candidates.len) + audible_message("The stirring sounds increase in volume!") + elitemind = pick(candidates) + elitemind.playsound_local(get_turf(elitemind), 'sound/effects/magic.ogg', 40, 0) + to_chat(elitemind, "You have been chosen to play as a Lavaland Elite.\nIn a few seconds, you will be summoned on Lavaland as a monster to fight your activator, in a fight to the death.\nYour attacks can be switched using the buttons on the top left of the HUD, and used by clicking on targets or tiles similar to a gun.\nWhile the opponent might have an upper hand with powerful mining equipment and tools, you have great power normally limited by AI mobs.\nIf you want to win, you'll have to use your powers in creative ways to ensure the kill. It's suggested you try using them all as soon as possible.\nShould you win, you'll receive extra information regarding what to do after. Good luck!") + addtimer(CALLBACK(src, .proc/spawn_elite, elitemind), 100) + else + visible_message("The stirring stops, and nothing emerges. Perhaps try again later.") + activity = TUMOR_INACTIVE + activator = null + + +obj/structure/elite_tumor/proc/spawn_elite(var/mob/dead/observer/elitemind) + var/selectedspawn = pick(potentialspawns) + mychild = new selectedspawn(loc) + visible_message("[mychild] emerges from [src]!") + playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) + if(boosted) + mychild.key = elitemind.key + mychild.sentience_act() + icon_state = "tumor_popped" + INVOKE_ASYNC(src, .proc/arena_checks) + +obj/structure/elite_tumor/proc/return_elite() + mychild.forceMove(loc) + visible_message("[mychild] emerges from [src]!") + playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) + mychild.revive(full_heal = TRUE, admin_revive = TRUE) + if(boosted) + mychild.maxHealth = mychild.maxHealth * 2 + mychild.health = mychild.maxHealth + +/obj/structure/elite_tumor/Initialize(mapload) + . = ..() + AddComponent(/datum/component/gps, "Menacing Signal") + START_PROCESSING(SSobj, src) + +/obj/structure/elite_tumor/Destroy() + STOP_PROCESSING(SSobj, src) + mychild = null + activator = null + return ..() + +/obj/structure/elite_tumor/process() + if(isturf(loc)) + for(var/mob/living/simple_animal/hostile/asteroid/elite/elitehere in loc) + if(elitehere == mychild && activity == TUMOR_PASSIVE) + mychild.adjustHealth(-mychild.maxHealth*0.05) + var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(mychild)) + H.color = "#FF0000" + +/obj/structure/elite_tumor/attackby(obj/item/I, mob/user, params) + . = ..() + if(istype(I, /obj/item/organ/regenerative_core) && activity == TUMOR_INACTIVE && !boosted) + var/obj/item/organ/regenerative_core/core = I + if(!core.preserved) + return + visible_message("As [user] drops the core into [src], [src] appears to swell.") + icon_state = "advanced_tumor" + boosted = TRUE + light_range = 6 + desc = "[desc] This one seems to glow with a strong intensity." + qdel(core) + return TRUE + +/obj/structure/elite_tumor/proc/arena_checks() + if(activity != TUMOR_ACTIVE || QDELETED(src)) + return + INVOKE_ASYNC(src, .proc/fighters_check) //Checks to see if our fighters died. + INVOKE_ASYNC(src, .proc/arena_trap) //Gets another arena trap queued up for when this one runs out. + INVOKE_ASYNC(src, .proc/border_check) //Checks to see if our fighters got out of the arena somehow. + addtimer(CALLBACK(src, .proc/arena_checks), 50) + +/obj/structure/elite_tumor/proc/fighters_check() + if(activator != null && activator.stat == DEAD || activity == TUMOR_ACTIVE && QDELETED(activator)) + onEliteWon() + if(mychild != null && mychild.stat == DEAD || activity == TUMOR_ACTIVE && QDELETED(mychild)) + onEliteLoss() + +/obj/structure/elite_tumor/proc/arena_trap() + var/turf/T = get_turf(src) + if(loc == null) + return + for(var/t in RANGE_TURFS(12, T)) + if(get_dist(t, T) == 12) + var/obj/effect/temp_visual/elite_tumor_wall/newwall + newwall = new /obj/effect/temp_visual/elite_tumor_wall(t, src) + newwall.activator = src.activator + newwall.ourelite = src.mychild + +/obj/structure/elite_tumor/proc/border_check() + if(activator != null && get_dist(src, activator) >= 12) + activator.forceMove(loc) + visible_message("[activator] suddenly reappears above [src]!") + playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) + if(mychild != null && get_dist(src, mychild) >= 12) + mychild.forceMove(loc) + visible_message("[mychild] suddenly reappears above [src]!") + playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) + +obj/structure/elite_tumor/proc/onEliteLoss() + playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, 0, 50, TRUE, TRUE) + visible_message("[src] begins to convulse violently before beginning to dissipate.") + visible_message("As [src] closes, something is forced up from down below.") + var/obj/structure/closet/crate/necropolis/tendril/lootbox = new /obj/structure/closet/crate/necropolis/tendril(loc) + if(!boosted) + mychild = null + activator = null + qdel(src) + return + var/lootpick = rand(1, 2) + if(lootpick == 1 && mychild.loot_drop != null) + new mychild.loot_drop(lootbox) + else + new /obj/item/tumor_shard(lootbox) + mychild = null + activator = null + qdel(src) + +obj/structure/elite_tumor/proc/onEliteWon() + activity = TUMOR_PASSIVE + activator = null + mychild.revive(full_heal = TRUE, admin_revive = TRUE) + if(boosted) + times_won++ + mychild.maxHealth = mychild.maxHealth * 0.5 + mychild.health = mychild.maxHealth + if(times_won == 1) + mychild.playsound_local(get_turf(mychild), 'sound/effects/magic.ogg', 40, 0) + to_chat(mychild, "As the life in the activator's eyes fade, the forcefield around you dies out and you feel your power subside.\nDespite this inferno being your home, you feel as if you aren't welcome here anymore.\nWithout any guidance, your purpose is now for you to decide.") + to_chat(mychild, "Your max health has been halved, but can now heal by standing on your tumor. Note, it's your only way to heal.\nBear in mind, if anyone interacts with your tumor, you'll be resummoned here to carry out another fight. In such a case, you will regain your full max health.\nAlso, be weary of your fellow inhabitants, they likely won't be happy to see you!") + to_chat(mychild, "Note that you are a lavaland monster, and thus not allied to the station. You should not cooperate or act friendly with any station crew unless under extreme circumstances!") + +/obj/item/tumor_shard + name = "tumor shard" + desc = "A strange, sharp, crystal shard from an odd tumor on Lavaland. Stabbing the corpse of a lavaland elite with this will revive them, assuming their soul still lingers. Revived lavaland elites only have half their max health, but are completely loyal to their reviver." + icon = 'icons/obj/lavaland/artefacts.dmi' + icon_state = "crevice_shard" + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + item_state = "screwdriver_head" + throwforce = 5 + w_class = WEIGHT_CLASS_SMALL + throw_speed = 3 + throw_range = 5 + +/obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag) + . = ..() + if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite) && proximity_flag) + var/mob/living/simple_animal/hostile/asteroid/elite/E = target + if(E.stat != DEAD || E.sentience_type != SENTIENCE_BOSS || !E.key) + user.visible_message("It appears [E] is unable to be revived right now. Perhaps try again later.") + return + E.faction = list("neutral") + E.revive(full_heal = TRUE, admin_revive = TRUE) + user.visible_message("[user] stabs [E] with [src], reviving it.") + E.playsound_local(get_turf(E), 'sound/effects/magic.ogg', 40, 0) + to_chat(E, "You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk.Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!") + E.maxHealth = E.maxHealth * 0.5 + E.health = E.maxHealth + E.desc = "[E.desc] However, this one appears appears less wild in nature, and calmer around people." + E.sentience_type = SENTIENCE_ORGANIC + qdel(src) + else + to_chat(user, "[src] only works on the corpse of a sentient lavaland elite.") + +/obj/effect/temp_visual/elite_tumor_wall + name = "magic wall" + icon = 'icons/turf/walls/hierophant_wall_temp.dmi' + icon_state = "wall" + duration = 50 + smooth = SMOOTH_TRUE + layer = BELOW_MOB_LAYER + var/mob/living/carbon/human/activator = null + var/mob/living/simple_animal/hostile/asteroid/elite/ourelite = null + color = rgb(255,0,0) + light_range = MINIMUM_USEFUL_LIGHT_RANGE + light_color = LIGHT_COLOR_RED + +/obj/effect/temp_visual/elite_tumor_wall/Initialize(mapload, new_caster) + . = ..() + queue_smooth_neighbors(src) + queue_smooth(src) + +/obj/effect/temp_visual/elite_tumor_wall/Destroy() + queue_smooth_neighbors(src) + activator = null + ourelite = null + return ..() + +/obj/effect/temp_visual/elite_tumor_wall/CanPass(atom/movable/mover, turf/target) + if(mover == ourelite || mover == activator) + return FALSE + else + return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm new file mode 100644 index 0000000000..1bcd3173ea --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -0,0 +1,245 @@ +#define TENTACLE_PATCH 1 +#define SPAWN_CHILDREN 2 +#define RAGE 3 +#define CALL_CHILDREN 4 + +/** + * # Goliath Broodmother + * + * A stronger, faster variation of the goliath. Has the ability to spawn baby goliaths, which it can later detonate at will. + * When it's health is below half, tendrils will spawn randomly around it. When it is below a quarter of health, this effect is doubled. + * It's attacks are as follows: + * - Spawns a 3x3/plus shape of tentacles on the target location + * - Spawns 2 baby goliaths on its tile, up to a max of 8. Children blow up when they die. + * - The broodmother lets out a noise, and is able to move faster for 6.5 seconds. + * - Summons your children around you. + * The broodmother is a fight revolving around stage control, as the activator has to manage the baby goliaths and the broodmother herself, along with all the tendrils. + */ + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother + name = "goliath broodmother" + desc = "An example of sexual dimorphism, this female goliath looks much different than the males of her species. She is, however, just as dangerous, if not more." + gender = FEMALE + icon_state = "broodmother" + icon_living = "broodmother" + icon_aggro = "broodmother" + icon_dead = "egg_sac" + icon_gib = "syndicate_gib" + maxHealth = 800 + health = 800 + melee_damage_lower = 30 + melee_damage_upper = 30 + armour_penetration = 30 + attack_verb_continuous = "beats down on" + attack_verb_simple = "beat down on" + attack_sound = 'sound/weapons/punch1.ogg' + throw_message = "does nothing to the rocky hide of the" + speed = 2 + move_to_delay = 5 + mob_biotypes = MOB_ORGANIC|MOB_BEAST + mouse_opacity = MOUSE_OPACITY_ICON + deathmessage = "explodes into gore!" + loot_drop = /obj/item/crusher_trophy/broodmother_tongue + + attack_action_types = list(/datum/action/innate/elite_attack/tentacle_patch, + /datum/action/innate/elite_attack/spawn_children, + /datum/action/innate/elite_attack/rage, + /datum/action/innate/elite_attack/call_children) + + var/rand_tent = 0 + var/list/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/children_list = list() + +/datum/action/innate/elite_attack/tentacle_patch + name = "Tentacle Patch" + button_icon_state = "tentacle_patch" + chosen_message = "You are now attacking with a patch of tentacles." + chosen_attack_num = TENTACLE_PATCH + +/datum/action/innate/elite_attack/spawn_children + name = "Spawn Children" + button_icon_state = "spawn_children" + chosen_message = "You will spawn two children at your location to assist you in combat. You can have up to 8." + chosen_attack_num = SPAWN_CHILDREN + +/datum/action/innate/elite_attack/rage + name = "Rage" + button_icon_state = "rage" + chosen_message = "You will temporarily increase your movement speed." + chosen_attack_num = RAGE + +/datum/action/innate/elite_attack/call_children + name = "Call Children" + button_icon_state = "call_children" + chosen_message = "You will summon your children to your location." + chosen_attack_num = CALL_CHILDREN + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/OpenFire() + if(client) + switch(chosen_attack) + if(TENTACLE_PATCH) + tentacle_patch(target) + if(SPAWN_CHILDREN) + spawn_children() + if(RAGE) + rage() + if(CALL_CHILDREN) + call_children() + return + var/aiattack = rand(1,4) + switch(aiattack) + if(TENTACLE_PATCH) + tentacle_patch(target) + if(SPAWN_CHILDREN) + spawn_children() + if(RAGE) + rage() + if(CALL_CHILDREN) + call_children() + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/Life() + . = ..() + if(!.) //Checks if they are dead as a rock. + return + if(health < maxHealth * 0.5 && rand_tent < world.time) + rand_tent = world.time + 30 + var/tentacle_amount = 5 + if(health < maxHealth * 0.25) + tentacle_amount = 10 + var/tentacle_loc = spiral_range_turfs(5, get_turf(src)) + for(var/i in 1 to tentacle_amount) + var/turf/t = pick_n_take(tentacle_loc) + new /obj/effect/temp_visual/goliath_tentacle/broodmother(t, src) + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/tentacle_patch(var/target) + ranged_cooldown = world.time + 15 + var/tturf = get_turf(target) + if(!isturf(tturf)) + return + visible_message("[src] digs its tentacles under [target]!") + new /obj/effect/temp_visual/goliath_tentacle/broodmother/patch(tturf, src) + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/spawn_children(var/target) + ranged_cooldown = world.time + 40 + visible_message("The ground churns behind [src]!") + for(var/i in 1 to 2) + if(children_list.len >= 8) + return + var/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/newchild = new /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child(loc) + newchild.GiveTarget(target) + newchild.faction = faction.Copy() + visible_message("[newchild] appears below [src]!") + newchild.mother = src + children_list += newchild + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/rage() + ranged_cooldown = world.time + 70 + playsound(src,'sound/spookoween/insane_low_laugh.ogg', 200, 1) + visible_message("[src] starts picking up speed!") + color = "#FF0000" + set_varspeed(0) + move_to_delay = 3 + addtimer(CALLBACK(src, .proc/reset_rage), 65) + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/reset_rage() + color = "#FFFFFF" + set_varspeed(2) + move_to_delay = 5 + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/call_children() + ranged_cooldown = world.time + 60 + visible_message("The ground shakes near [src]!") + var/list/directions = GLOB.cardinals.Copy() + GLOB.diagonals.Copy() + for(var/mob/child in children_list) + var/spawndir = pick_n_take(directions) + var/turf/T = get_step(src, spawndir) + if(T) + child.forceMove(T) + playsound(src, 'sound/effects/bamf.ogg', 100, 1) + +//The goliath's children. Pretty weak, simple mobs which are able to put a single tentacle under their target when at range. +/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child + name = "baby goliath" + desc = "A young goliath recently born from it's mother. While they hatch from eggs, said eggs are incubated in the mother until they are ready to be born." + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' + icon_state = "goliath_baby" + icon_living = "goliath_baby" + icon_aggro = "goliath_baby" + icon_dead = "goliath_baby_dead" + icon_gib = "syndicate_gib" + maxHealth = 30 + health = 30 + melee_damage_lower = 5 + melee_damage_upper = 5 + attack_verb_continuous = "bashes against" + attack_verb_simple = "bash against" + attack_sound = 'sound/weapons/punch1.ogg' + throw_message = "does nothing to the rocky hide of the" + speed = 2 + move_to_delay = 5 + mob_biotypes = MOB_ORGANIC|MOB_BEAST + mouse_opacity = MOUSE_OPACITY_ICON + butcher_results = list() + guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide = 1) + deathmessage = "falls to the ground." + status_flags = CANPUSH + var/mob/living/simple_animal/hostile/asteroid/elite/broodmother/mother = null + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/OpenFire(target) + ranged_cooldown = world.time + 40 + var/tturf = get_turf(target) + if(!isturf(tturf)) + return + if(get_dist(src, target) <= 7)//Screen range check, so it can't attack people off-screen + visible_message("[src] digs one of its tentacles under [target]!") + new /obj/effect/temp_visual/goliath_tentacle/broodmother(tturf, src) + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/death() + . = ..() + if(mother != null) + mother.children_list -= src + visible_message("[src] explodes!") + explosion(get_turf(loc),0,0,0,flame_range = 3, adminlog = FALSE) + gib() + +//Tentacles have less stun time compared to regular variant, to balance being able to use them much more often. Also, 10 more damage. +/obj/effect/temp_visual/goliath_tentacle/broodmother/trip() + var/latched = FALSE + for(var/mob/living/L in loc) + if((!QDELETED(spawner) && spawner.faction_check_mob(L)) || L.stat == DEAD) + continue + visible_message("[src] grabs hold of [L]!") + L.Stun(10) + L.adjustBruteLoss(rand(30,35)) + latched = TRUE + if(!latched) + retract() + else + deltimer(timerid) + timerid = addtimer(CALLBACK(src, .proc/retract), 10, TIMER_STOPPABLE) + +/obj/effect/temp_visual/goliath_tentacle/broodmother/patch/Initialize(mapload, new_spawner) + . = ..() + var/tentacle_locs = spiral_range_turfs(1, get_turf(src)) + for(var/T in tentacle_locs) + new /obj/effect/temp_visual/goliath_tentacle/broodmother(T, spawner) + var/list/directions = GLOB.cardinals.Copy() + for(var/i in directions) + var/turf/T = get_step(get_turf(src), i) + T = get_step(T, i) + new /obj/effect/temp_visual/goliath_tentacle/broodmother(T, spawner) + +// Broodmother's loot: Broodmother Tongue +/obj/item/crusher_trophy/broodmother_tongue + name = "broodmother tongue" + desc = "The tongue of a broodmother. If attached a certain way, makes for a suitable crusher trophy." + icon = 'icons/obj/lavaland/elite_trophies.dmi' + icon_state = "broodmother_tongue" + denied_type = /obj/item/crusher_trophy/broodmother_tongue + bonus_value = 10 + +/obj/item/crusher_trophy/broodmother_tongue/effect_desc() + return "mark detonation to have a [bonus_value]% chance to summon a patch of goliath tentacles at the target's location" + +/obj/item/crusher_trophy/broodmother_tongue/on_mark_detonation(mob/living/target, mob/living/user) + if(rand(1, 100) <= bonus_value && target.stat != DEAD) + new /obj/effect/temp_visual/goliath_tentacle/broodmother/patch(get_turf(target), user) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm new file mode 100644 index 0000000000..3f184e2f52 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -0,0 +1,274 @@ +#define HERALD_TRISHOT 1 +#define HERALD_DIRECTIONALSHOT 2 +#define HERALD_TELESHOT 3 +#define HERALD_MIRROR 4 + +/** + * # Herald + * + * A slow-moving projectile user with a few tricks up it's sleeve. Less unga-bunga than Colossus, with more cleverness in it's fighting style. + * As it's health gets lower, the amount of projectiles fired per-attack increases. + * It's attacks are as follows: + * - Fires three projectiles in a a given direction. + * - Fires a spread in every cardinal and diagonal direction at once, then does it again after a bit. + * - Shoots a single, golden bolt. Wherever it lands, the herald will be teleported to the location. + * - Spawns a mirror which reflects projectiles directly at the target. + * Herald is a more concentrated variation of the Colossus fight, having less projectiles overall, but more focused attacks. + */ + +/mob/living/simple_animal/hostile/asteroid/elite/herald + name = "herald" + desc = "A monstrous beast which fires deadly projectiles at threats and prey." + icon_state = "herald" + icon_living = "herald" + icon_aggro = "herald" + icon_dead = "herald_dying" + icon_gib = "syndicate_gib" + maxHealth = 800 + health = 800 + melee_damage_lower = 20 + melee_damage_upper = 20 + attack_verb_continuous = "preaches to" + attack_verb_simple = "preach to" + attack_sound = 'sound/magic/clockwork/ratvar_attack.ogg' + throw_message = "doesn't affect the purity of" + speed = 4 + move_to_delay = 10 + mouse_opacity = MOUSE_OPACITY_ICON + deathsound = 'sound/magic/demon_dies.ogg' + deathmessage = "begins to shudder as it becomes transparent..." + loot_drop = /obj/item/clothing/neck/cloak/herald_cloak + + can_talk = 1 + + attack_action_types = list(/datum/action/innate/elite_attack/herald_trishot, + /datum/action/innate/elite_attack/herald_directionalshot, + /datum/action/innate/elite_attack/herald_teleshot, + /datum/action/innate/elite_attack/herald_mirror) + + var/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/my_mirror = null + var/is_mirror = FALSE + +/mob/living/simple_animal/hostile/asteroid/elite/herald/death() + . = ..() + if(!is_mirror) + addtimer(CALLBACK(src, .proc/become_ghost), 8) + if(my_mirror != null) + qdel(my_mirror) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/become_ghost() + icon_state = "herald_ghost" + +/mob/living/simple_animal/hostile/asteroid/elite/herald/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) + . = ..() + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + +/datum/action/innate/elite_attack/herald_trishot + name = "Triple Shot" + button_icon_state = "herald_trishot" + chosen_message = "You are now firing three shots in your chosen direction." + chosen_attack_num = HERALD_TRISHOT + +/datum/action/innate/elite_attack/herald_directionalshot + name = "Circular Shot" + button_icon_state = "herald_directionalshot" + chosen_message = "You are firing projectiles in all directions." + chosen_attack_num = HERALD_DIRECTIONALSHOT + +/datum/action/innate/elite_attack/herald_teleshot + name = "Teleport Shot" + button_icon_state = "herald_teleshot" + chosen_message = "You will now fire a shot which teleports you where it lands." + chosen_attack_num = HERALD_TELESHOT + +/datum/action/innate/elite_attack/herald_mirror + name = "Summon Mirror" + button_icon_state = "herald_mirror" + chosen_message = "You will spawn a mirror which duplicates your attacks." + chosen_attack_num = HERALD_MIRROR + +/mob/living/simple_animal/hostile/asteroid/elite/herald/OpenFire() + if(client) + switch(chosen_attack) + if(HERALD_TRISHOT) + herald_trishot(target) + if(my_mirror != null) + my_mirror.herald_trishot(target) + if(HERALD_DIRECTIONALSHOT) + herald_directionalshot() + if(my_mirror != null) + my_mirror.herald_directionalshot() + if(HERALD_TELESHOT) + herald_teleshot(target) + if(my_mirror != null) + my_mirror.herald_teleshot(target) + if(HERALD_MIRROR) + herald_mirror() + return + var/aiattack = rand(1,4) + switch(aiattack) + if(HERALD_TRISHOT) + herald_trishot(target) + if(my_mirror != null) + my_mirror.herald_trishot(target) + if(HERALD_DIRECTIONALSHOT) + herald_directionalshot() + if(my_mirror != null) + my_mirror.herald_directionalshot() + if(HERALD_TELESHOT) + herald_teleshot(target) + if(my_mirror != null) + my_mirror.herald_teleshot(target) + if(HERALD_MIRROR) + herald_mirror() + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/shoot_projectile(turf/marker, set_angle, var/is_teleshot) + var/turf/startloc = get_turf(src) + var/obj/projectile/herald/H = null + if(!is_teleshot) + H = new /obj/projectile/herald(startloc) + else + H = new /obj/projectile/herald/teleshot(startloc) + H.preparePixelProjectile(marker, startloc) + H.firer = src + if(target) + H.original = target + H.fire(set_angle) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_trishot(target) + ranged_cooldown = world.time + 30 + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + var/target_turf = get_turf(target) + var/angle_to_target = Get_Angle(src, target_turf) + shoot_projectile(target_turf, angle_to_target, FALSE) + addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 2) + addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 4) + if(health < maxHealth * 0.5) + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 10) + addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 12) + addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 14) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_circleshot() + var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) + for(var/i in directional_shot_angles) + shoot_projectile(get_turf(src), i, FALSE) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/unenrage() + if(stat == DEAD || is_mirror) + return + icon_state = "herald" + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_directionalshot() + ranged_cooldown = world.time + 50 + if(!is_mirror) + icon_state = "herald_enraged" + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + addtimer(CALLBACK(src, .proc/herald_circleshot), 5) + if(health < maxHealth * 0.5) + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + addtimer(CALLBACK(src, .proc/herald_circleshot), 15) + addtimer(CALLBACK(src, .proc/unenrage), 20) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_teleshot(target) + ranged_cooldown = world.time + 30 + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + var/target_turf = get_turf(target) + var/angle_to_target = Get_Angle(src, target_turf) + shoot_projectile(target_turf, angle_to_target, TRUE) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_mirror() + ranged_cooldown = world.time + 40 + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + if(my_mirror != null) + qdel(my_mirror) + my_mirror = null + var/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/new_mirror = new /mob/living/simple_animal/hostile/asteroid/elite/herald/mirror(loc) + my_mirror = new_mirror + my_mirror.my_master = src + my_mirror.faction = faction.Copy() + +/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror + name = "herald's mirror" + desc = "This fiendish work of magic copies the herald's attacks. Seems logical to smash it." + health = 60 + maxHealth = 60 + icon_state = "herald_mirror" + deathmessage = "shatters violently!" + deathsound = 'sound/effects/glassbr1.ogg' + movement_type = FLYING + del_on_death = TRUE + is_mirror = TRUE + var/mob/living/simple_animal/hostile/asteroid/elite/herald/my_master = null + +/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Initialize() + ..() + toggle_ai(AI_OFF) + +/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Destroy() + if(my_master != null) + my_master.my_mirror = null + . = ..() + +/obj/projectile/herald + name ="death bolt" + icon_state= "chronobolt" + damage = 15 + armour_penetration = 60 + speed = 2 + eyeblur = 0 + damage_type = BRUTE + pass_flags = PASSTABLE + +/obj/projectile/herald/teleshot + name ="golden bolt" + damage = 0 + color = rgb(255,255,102) + +/obj/projectile/herald/on_hit(atom/target, blocked = FALSE) + . = ..() + if(ismineralturf(target)) + var/turf/closed/mineral/M = target + M.gets_drilled() + return + else if(isliving(target)) + var/mob/living/L = target + var/mob/living/F = firer + if(F != null && istype(F, /mob/living/simple_animal/hostile/asteroid/elite) && F.faction_check_mob(L)) + L.heal_overall_damage(damage) + +/obj/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE) + . = ..() + firer.forceMove(get_turf(src)) + +//Herald's loot: Cloak of the Prophet + +/obj/item/clothing/neck/cloak/herald_cloak + name = "cloak of the prophet" + desc = "A cloak which protects you from the heresy of the world." + icon = 'icons/obj/lavaland/elite_trophies.dmi' + icon_state = "herald_cloak" + body_parts_covered = CHEST|GROIN|ARMS + hit_reaction_chance = 10 + +/obj/item/clothing/neck/cloak/herald_cloak/proc/reactionshot(mob/living/carbon/owner) + var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) + for(var/i in directional_shot_angles) + shoot_projectile(get_turf(owner), i, owner) + +/obj/item/clothing/neck/cloak/herald_cloak/proc/shoot_projectile(turf/marker, set_angle, mob/living/carbon/owner) + var/turf/startloc = get_turf(owner) + var/obj/projectile/herald/H = null + H = new /obj/projectile/herald(startloc) + H.preparePixelProjectile(marker, startloc) + H.firer = owner + H.fire(set_angle) + +/obj/item/clothing/neck/cloak/herald_cloak/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + . = ..() + if(rand(1,100) > hit_reaction_chance) + return + owner.visible_message("[owner]'s [src] emits a loud noise as [owner] is struck!") + var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) + playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) + addtimer(CALLBACK(src, .proc/reactionshot, owner), 10) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm new file mode 100644 index 0000000000..5e0c00d998 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -0,0 +1,300 @@ +#define LEGIONNAIRE_CHARGE 1 +#define HEAD_DETACH 2 +#define BONFIRE_TELEPORT 3 +#define SPEW_SMOKE 4 + +/** + * # Legionnaire + * + * A towering skeleton, embodying the power of Legion. + * As it's health gets lower, the head does more damage. + * It's attacks are as follows: + * - Charges at the target after a telegraph, throwing them across the arena should it connect. + * - Legionnaire's head detaches, attacking as it's own entity. Has abilities of it's own later into the fight. Once dead, regenerates after a brief period. If the skill is used while the head is off, it will be killed. + * - Leaves a pile of bones at your location. Upon using this skill again, you'll swap locations with the bone pile. + * - Spews a cloud of smoke from it's maw, wherever said maw is. + * A unique fight incorporating the head mechanic of legion into a whole new beast. Combatants will need to make sure the tag-team of head and body don't lure them into a deadly trap. + */ + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire + name = "legionnaire" + desc = "A towering skeleton, embodying the terrifying power of Legion." + icon_state = "legionnaire" + icon_living = "legionnaire" + icon_aggro = "legionnaire" + icon_dead = "legionnaire_dead" + icon_gib = "syndicate_gib" + maxHealth = 800 + health = 800 + melee_damage_lower = 30 + melee_damage_upper = 30 + attack_verb_continuous = "slashes its arms at" + attack_verb_simple = "slash your arms at" + attack_sound = 'sound/weapons/bladeslice.ogg' + throw_message = "doesn't affect the sturdiness of" + speed = 1 + move_to_delay = 3 + mouse_opacity = MOUSE_OPACITY_ICON + deathsound = 'sound/magic/curse.ogg' + deathmessage = "'s arms reach out before it falls apart onto the floor, lifeless." + loot_drop = /obj/item/crusher_trophy/legionnaire_spine + + attack_action_types = list(/datum/action/innate/elite_attack/legionnaire_charge, + /datum/action/innate/elite_attack/head_detach, + /datum/action/innate/elite_attack/bonfire_teleport, + /datum/action/innate/elite_attack/spew_smoke) + + var/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead/myhead = null + var/obj/structure/legionnaire_bonfire/mypile = null + var/has_head = TRUE + +/datum/action/innate/elite_attack/legionnaire_charge + name = "Legionnaire Charge" + button_icon_state = "legionnaire_charge" + chosen_message = "You will attempt to grab your opponent and throw them." + chosen_attack_num = LEGIONNAIRE_CHARGE + +/datum/action/innate/elite_attack/head_detach + name = "Release Head" + button_icon_state = "head_detach" + chosen_message = "You will now detach your head or kill it if it is already released." + chosen_attack_num = HEAD_DETACH + +/datum/action/innate/elite_attack/bonfire_teleport + name = "Bonfire Teleport" + button_icon_state = "bonfire_teleport" + chosen_message = "You will leave a bonfire. Second use will let you swap positions with it indefintiely. Using this move on the same tile as your active bonfire removes it." + chosen_attack_num = BONFIRE_TELEPORT + +/datum/action/innate/elite_attack/spew_smoke + name = "Spew Smoke" + button_icon_state = "spew_smoke" + chosen_message = "Your head will spew smoke in an area, wherever it may be." + chosen_attack_num = SPEW_SMOKE + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/OpenFire() + if(client) + switch(chosen_attack) + if(LEGIONNAIRE_CHARGE) + legionnaire_charge(target) + if(HEAD_DETACH) + head_detach(target) + if(BONFIRE_TELEPORT) + bonfire_teleport() + if(SPEW_SMOKE) + spew_smoke() + return + var/aiattack = rand(1,4) + switch(aiattack) + if(LEGIONNAIRE_CHARGE) + legionnaire_charge(target) + if(HEAD_DETACH) + head_detach(target) + if(BONFIRE_TELEPORT) + bonfire_teleport() + if(SPEW_SMOKE) + spew_smoke() + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/legionnaire_charge(target) + ranged_cooldown = world.time + 50 + var/dir_to_target = get_dir(get_turf(src), get_turf(target)) + var/turf/T = get_step(get_turf(src), dir_to_target) + for(var/i in 1 to 4) + new /obj/effect/temp_visual/dragon_swoop/legionnaire(T) + T = get_step(T, dir_to_target) + playsound(src,'sound/magic/demon_attack1.ogg', 200, 1) + visible_message("[src] prepares to charge!") + addtimer(CALLBACK(src, .proc/legionnaire_charge_2, dir_to_target, 0), 5) + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/legionnaire_charge_2(var/move_dir, var/times_ran) + if(times_ran >= 4) + return + var/turf/T = get_step(get_turf(src), move_dir) + if(ismineralturf(T)) + var/turf/closed/mineral/M = T + M.gets_drilled() + if(T.density) + return + for(var/obj/structure/window/W in T.contents) + return + for(var/obj/machinery/door/D in T.contents) + return + forceMove(T) + playsound(src,'sound/effects/bang.ogg', 200, 1) + var/list/hit_things = list() + var/throwtarget = get_edge_target_turf(src, move_dir) + for(var/mob/living/L in T.contents - hit_things - src) + if(faction_check_mob(L)) + return + hit_things += L + visible_message("[src] attacks [L] with much force!") + to_chat(L, "[src] grabs you and throws you with much force!") + L.safe_throw_at(throwtarget, 10, 1, src) + L.Paralyze(20) + L.adjustBruteLoss(50) + addtimer(CALLBACK(src, .proc/legionnaire_charge_2, move_dir, (times_ran + 1)), 2) + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/head_detach(target) + ranged_cooldown = world.time + 10 + if(myhead != null) + myhead.adjustBruteLoss(600) + return + if(has_head) + has_head = FALSE + icon_state = "legionnaire_headless" + icon_living = "legionnaire_headless" + icon_aggro = "legionnaire_headless" + visible_message("[src]'s head flies off!") + var/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead/newhead = new /mob/living/simple_animal/hostile/asteroid/elite/legionnairehead(loc) + newhead.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) + newhead.GiveTarget(target) + newhead.faction = faction.Copy() + myhead = newhead + myhead.body = src + if(health < maxHealth * 0.25) + myhead.melee_damage_lower = 30 + myhead.melee_damage_upper = 30 + else if(health < maxHealth * 0.5) + myhead.melee_damage_lower = 20 + myhead.melee_damage_upper = 20 + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/onHeadDeath() + myhead = null + addtimer(CALLBACK(src, .proc/regain_head), 50) + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/regain_head() + has_head = TRUE + if(stat == DEAD) + return + icon_state = "legionnaire" + icon_living = "legionnaire" + icon_aggro = "legionnaire" + visible_message("The top of [src]'s spine leaks a black liquid, forming into a skull!") + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/bonfire_teleport() + ranged_cooldown = world.time + 5 + if(mypile == null) + var/obj/structure/legionnaire_bonfire/newpile = new /obj/structure/legionnaire_bonfire(loc) + mypile = newpile + mypile.myowner = src + playsound(get_turf(src),'sound/items/fulext_deploy.wav', 200, 1) + visible_message("[src] summons a bonfire on [get_turf(src)]!") + return + else + var/turf/legionturf = get_turf(src) + var/turf/pileturf = get_turf(mypile) + if(legionturf == pileturf) + mypile.take_damage(100) + mypile = null + return + playsound(pileturf,'sound/items/fulext_deploy.wav', 200, 1) + playsound(legionturf,'sound/items/fulext_deploy.wav', 200, 1) + visible_message("[src] melts down into a burning pile of bones!") + forceMove(pileturf) + visible_message("[src] forms from the bonfire!") + mypile.forceMove(legionturf) + +/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/spew_smoke() + ranged_cooldown = world.time + 60 + var/turf/T = null + if(myhead != null) + T = get_turf(myhead) + else + T = get_turf(src) + if(myhead != null) + myhead.visible_message("[myhead] spews smoke from its maw!") + else if(!has_head) + visible_message("[src] spews smoke from the tip of their spine!") + else + visible_message("[src] spews smoke from its maw!") + var/datum/effect_system/smoke_spread/smoke = new + smoke.set_up(2, T) + smoke.start() + +//The legionnaire's head. Basically the same as any legion head, but we have to tell our creator when we die so they can generate another head. +/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead + name = "legionnaire head" + desc = "The legionnaire's head floating by itself. One shouldn't get too close, though once it sees you, you really don't have a choice." + icon_state = "legionnaire_head" + icon_living = "legionnaire_head" + icon_aggro = "legionnaire_head" + icon_dead = "legionnaire_dead" + icon_gib = "syndicate_gib" + maxHealth = 80 + health = 80 + melee_damage_lower = 10 + melee_damage_upper = 10 + attack_verb_continuous = "bites at" + attack_verb_simple = "bite at" + attack_sound = 'sound/effects/curse1.ogg' + throw_message = "simply misses" + speed = 0 + move_to_delay = 2 + del_on_death = 1 + deathmessage = "crumbles away!" + faction = list() + ranged = FALSE + var/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/body = null + +/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead/death() + . = ..() + if(body) + body.onHeadDeath() + +//The legionnaire's bonfire, which can be swapped positions with. Also sets flammable living beings on fire when they walk over it. +/obj/structure/legionnaire_bonfire + name = "bone pile" + desc = "A pile of bones which seems to occasionally move a little. It's probably a good idea to smash them." + icon = 'icons/obj/lavaland/legionnaire_bonfire.dmi' + icon_state = "bonfire" + max_integrity = 100 + move_resist = MOVE_FORCE_EXTREMELY_STRONG + anchored = TRUE + density = FALSE + light_range = 4 + light_color = LIGHT_COLOR_RED + var/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/myowner = null + + +/obj/structure/legionnaire_bonfire/Entered(atom/movable/mover, turf/target) + if(isliving(mover)) + var/mob/living/L = mover + L.adjust_fire_stacks(3) + L.IgniteMob() + . = ..() + +/obj/structure/legionnaire_bonfire/Destroy() + if(myowner != null) + myowner.mypile = null + . = ..() + +//The visual effect which appears in front of legionnaire when he goes to charge. +/obj/effect/temp_visual/dragon_swoop/legionnaire + duration = 10 + color = rgb(0,0,0) + +/obj/effect/temp_visual/dragon_swoop/legionnaire/Initialize() + . = ..() + transform *= 0.33 + +// Legionnaire's loot: Legionnaire Spine + +/obj/item/crusher_trophy/legionnaire_spine + name = "legionnaire spine" + desc = "The spine of a legionnaire. It almost feels like it's moving..." + icon = 'icons/obj/lavaland/elite_trophies.dmi' + icon_state = "legionnaire_spine" + denied_type = /obj/item/crusher_trophy/legionnaire_spine + bonus_value = 20 + +/obj/item/crusher_trophy/legionnaire_spine/effect_desc() + return "mark detonation to have a [bonus_value]% chance to summon a loyal legion skull" + +/obj/item/crusher_trophy/legionnaire_spine/on_mark_detonation(mob/living/target, mob/living/user) + if(!rand(1, 100) <= bonus_value || target.stat == DEAD) + return + var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion(user.loc) + A.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) + A.GiveTarget(target) + A.friends = user + A.faction = user.faction.Copy() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm new file mode 100644 index 0000000000..7422a441aa --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm @@ -0,0 +1,192 @@ +#define SINGULAR_SHOT 1 +#define MAGIC_BOX 2 +#define PANDORA_TELEPORT 3 +#define AOE_SQUARES 4 + +/** + * # Pandora + * + * A box with a similar design to the Hierophant which trades large, single attacks for more frequent smaller ones. + * As it's health gets lower, the time between it's attacks decrease. + * It's attacks are as follows: + * - Fires hierophant blasts in a straight line. Can only fire in a straight line in 8 directions, being the diagonals and cardinals. + * - Creates a box of hierophant blasts around the target. If they try to run away to avoid it, they'll very likely get hit. + * - Teleports the pandora from one location to another, almost identical to Hierophant. + * - Spawns a 5x5 AOE at the location of choice, spreading out from the center. + * Pandora's fight mirrors Hierophant's closely, but has stark differences in attack effects. Instead of long-winded dodge times and long cooldowns, Pandora constantly attacks the opponent, but leaves itself open for attack. + */ + +/mob/living/simple_animal/hostile/asteroid/elite/pandora + name = "pandora" + desc = "A large magic box with similar power and design to the Hierophant. Once it opens, it's not easy to close it." + icon_state = "pandora" + icon_living = "pandora" + icon_aggro = "pandora" + icon_dead = "pandora_dead" + icon_gib = "syndicate_gib" + maxHealth = 800 + health = 800 + melee_damage_lower = 15 + melee_damage_upper = 15 + attack_verb_continuous = "smashes into the side of" + attack_verb_simple = "smash into the side of" + attack_sound = 'sound/weapons/sonic_jackhammer.ogg' + throw_message = "merely dinks off of the" + speed = 4 + move_to_delay = 10 + mouse_opacity = MOUSE_OPACITY_ICON + deathsound = 'sound/magic/repulse.ogg' + deathmessage = "'s lights flicker, before its top part falls down." + loot_drop = /obj/item/clothing/accessory/pandora_hope + + attack_action_types = list(/datum/action/innate/elite_attack/singular_shot, + /datum/action/innate/elite_attack/magic_box, + /datum/action/innate/elite_attack/pandora_teleport, + /datum/action/innate/elite_attack/aoe_squares) + + var/sing_shot_length = 8 + var/cooldown_time = 20 + +/datum/action/innate/elite_attack/singular_shot + name = "Singular Shot" + button_icon_state = "singular_shot" + chosen_message = "You are now creating a single linear magic square." + chosen_attack_num = SINGULAR_SHOT + +/datum/action/innate/elite_attack/magic_box + name = "Magic Box" + button_icon_state = "magic_box" + chosen_message = "You are now attacking with a box of magic squares." + chosen_attack_num = MAGIC_BOX + +/datum/action/innate/elite_attack/pandora_teleport + name = "Line Teleport" + button_icon_state = "pandora_teleport" + chosen_message = "You will now teleport to your target." + chosen_attack_num = PANDORA_TELEPORT + +/datum/action/innate/elite_attack/aoe_squares + name = "AOE Blast" + button_icon_state = "aoe_squares" + chosen_message = "Your attacks will spawn an AOE blast at your target location." + chosen_attack_num = AOE_SQUARES + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/OpenFire() + if(client) + switch(chosen_attack) + if(SINGULAR_SHOT) + singular_shot(target) + if(MAGIC_BOX) + magic_box(target) + if(PANDORA_TELEPORT) + pandora_teleport(target) + if(AOE_SQUARES) + aoe_squares(target) + return + var/aiattack = rand(1,4) + switch(aiattack) + if(SINGULAR_SHOT) + singular_shot(target) + if(MAGIC_BOX) + magic_box(target) + if(PANDORA_TELEPORT) + pandora_teleport(target) + if(AOE_SQUARES) + aoe_squares(target) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/Life() + . = ..() + if(health >= maxHealth * 0.5) + cooldown_time = 20 + return + if(health < maxHealth * 0.5 && health > maxHealth * 0.25) + cooldown_time = 15 + return + else + cooldown_time = 10 + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot(target) + ranged_cooldown = world.time + (cooldown_time * 0.5) + var/dir_to_target = get_dir(get_turf(src), get_turf(target)) + var/turf/T = get_step(get_turf(src), dir_to_target) + singular_shot_line(sing_shot_length, dir_to_target, T) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot_line(var/procsleft, var/angleused, var/turf/T) + if(procsleft <= 0) + return + new /obj/effect/temp_visual/hierophant/blast/pandora(T, src) + T = get_step(T, angleused) + procsleft = procsleft - 1 + addtimer(CALLBACK(src, .proc/singular_shot_line, procsleft, angleused, T), 2) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/magic_box(target) + ranged_cooldown = world.time + cooldown_time + var/turf/T = get_turf(target) + for(var/t in spiral_range_turfs(3, T)) + if(get_dist(t, T) > 1) + new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport(target) + ranged_cooldown = world.time + cooldown_time + var/turf/T = get_turf(target) + var/turf/source = get_turf(src) + new /obj/effect/temp_visual/hierophant/telegraph(T, src) + new /obj/effect/temp_visual/hierophant/telegraph(source, src) + playsound(source,'sound/machines/airlockopen.ogg', 200, 1) + addtimer(CALLBACK(src, .proc/pandora_teleport_2, T, source), 2) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_2(var/turf/T, var/turf/source) + new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src) + new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, src) + for(var/t in RANGE_TURFS(1, T)) + new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) + for(var/t in RANGE_TURFS(1, source)) + new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) + animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out + visible_message("[src] fades out!") + density = FALSE + addtimer(CALLBACK(src, .proc/pandora_teleport_3, T), 2) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_3(var/turf/T) + forceMove(T) + animate(src, alpha = 255, time = 2, easing = EASE_IN) //fade IN + density = TRUE + visible_message("[src] fades in!") + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares(target) + ranged_cooldown = world.time + cooldown_time + var/turf/T = get_turf(target) + new /obj/effect/temp_visual/hierophant/blast/pandora(T, src) + var/max_size = 2 + addtimer(CALLBACK(src, .proc/aoe_squares_2, T, 0, max_size), 2) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares_2(var/turf/T, var/ring, var/max_size) + if(ring > max_size) + return + for(var/t in spiral_range_turfs(ring, T)) + if(get_dist(t, T) == ring) + new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) + addtimer(CALLBACK(src, .proc/aoe_squares_2, T, (ring + 1), max_size), 2) + +//The specific version of hiero's squares pandora uses +/obj/effect/temp_visual/hierophant/blast/pandora + damage = 20 + monster_damage_boost = FALSE + +//Pandora's loot: Hope +/obj/item/clothing/accessory/pandora_hope + name = "Hope" + desc = "Found at the bottom of Pandora. After all the evil was released, this was the only thing left inside." + icon = 'icons/obj/lavaland/elite_trophies.dmi' + icon_state = "hope" + resistance_flags = FIRE_PROOF + +/obj/item/clothing/accessory/pandora_hope/on_uniform_equip(obj/item/clothing/under/U, user) + var/mob/living/L = user + if(L && L.mind) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "hope_lavaland", /datum/mood_event/hope_lavaland) + +/obj/item/clothing/accessory/pandora_hope/on_uniform_dropped(obj/item/clothing/under/U, user) + var/mob/living/L = user + if(L && L.mind) + SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "hope_lavaland") diff --git a/icons/mob/actions/actions_elites.dmi b/icons/mob/actions/actions_elites.dmi new file mode 100644 index 0000000000000000000000000000000000000000..335261b0f646eace1032a8539d44eb0d46bcbd66 GIT binary patch literal 8631 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 KM5U5d=>G$|N=ZHd literal 0 HcmV?d00001 diff --git a/icons/mob/lavaland/lavaland_elites.dmi b/icons/mob/lavaland/lavaland_elites.dmi new file mode 100644 index 0000000000000000000000000000000000000000..69032735d96527a4df16717c8c1bb66006f4bd96 GIT binary patch literal 20149 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 literal 0 HcmV?d00001 diff --git a/icons/mob/screen_elite.dmi b/icons/mob/screen_elite.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f407fb79e41c5e82c71510207f7505d6830dd1a0 GIT binary patch literal 6735 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 GNBtkn*|Qk{ literal 0 HcmV?d00001 diff --git a/icons/obj/lavaland/elite_trophies.dmi b/icons/obj/lavaland/elite_trophies.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d194c93853dbb4e72d876448831b8b49e26b25f3 GIT binary patch literal 1057 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 literal 0 HcmV?d00001 From ea4f57beb673557c11ef6e13fd4d1598260caa80 Mon Sep 17 00:00:00 2001 From: Useroth Date: Sun, 8 Dec 2019 16:47:21 +0100 Subject: [PATCH 3/4] Spaghettid my way around the errors. --- code/modules/mob/living/emote.dm | 6 +++++ .../hostile/mining_mobs/elites/elite.dm | 10 ++++++-- .../mining_mobs/elites/goliath_broodmother.dm | 14 ++++++----- .../hostile/mining_mobs/elites/herald.dm | 23 ++++++++++--------- .../hostile/mining_mobs/elites/legionnaire.dm | 15 +++++++----- .../hostile/mining_mobs/elites/pandora.dm | 5 ++-- code/modules/mob/mob_defines.dm | 6 +++++ 7 files changed, 52 insertions(+), 27 deletions(-) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 6c1a2cfec9..041b367ebf 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -87,6 +87,12 @@ message_simple = S.deathmessage . = ..() message_simple = initial(message_simple) + if(. && user.deathsound) + if(isliving(user)) + var/mob/living/L = user + if(!L.can_speak_vocal() || L.oxyloss >= 50) + return //stop the sound if oxyloss too high/cant speak + playsound(user, user.deathsound, 200, TRUE, TRUE) if(. && isalienadult(user)) playsound(user.loc, 'sound/voice/hiss6.ogg', 80, 1, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 7c135cc970..36abd92b40 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -24,7 +24,6 @@ var/list/attack_action_types = list() var/can_talk = FALSE var/obj/loot_drop = null - //Gives player-controlled variants the ability to swap attacks /mob/living/simple_animal/hostile/asteroid/elite/Initialize(mapload) @@ -138,6 +137,13 @@ While using this makes the system rely on OnFire, it still gives options for tim light_range = 3 anchored = TRUE density = FALSE + var/obj/item/gps/internal = null + +/obj/item/gps/internal/elite + icon_state = null + gpstag = "Menacing Signal" + desc = "You're not quite sure how a signal can be bloody." + invisibility = 100 /obj/structure/elite_tumor/attack_hand(mob/user) . = ..() @@ -196,7 +202,7 @@ obj/structure/elite_tumor/proc/return_elite() /obj/structure/elite_tumor/Initialize(mapload) . = ..() - AddComponent(/datum/component/gps, "Menacing Signal") + internal = new/obj/item/gps/internal/elite(src) START_PROCESSING(SSobj, src) /obj/structure/elite_tumor/Destroy() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm index 1bcd3173ea..c18a342206 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -30,13 +30,14 @@ melee_damage_lower = 30 melee_damage_upper = 30 armour_penetration = 30 - attack_verb_continuous = "beats down on" - attack_verb_simple = "beat down on" + attacktext = "beats down on" + /*attack_verb_continuous = "beats down on" + attack_verb_simple = "beat down on"*/ attack_sound = 'sound/weapons/punch1.ogg' throw_message = "does nothing to the rocky hide of the" speed = 2 move_to_delay = 5 - mob_biotypes = MOB_ORGANIC|MOB_BEAST + mob_biotypes = list(MOB_ORGANIC, MOB_BEAST) mouse_opacity = MOUSE_OPACITY_ICON deathmessage = "explodes into gore!" loot_drop = /obj/item/crusher_trophy/broodmother_tongue @@ -170,13 +171,14 @@ health = 30 melee_damage_lower = 5 melee_damage_upper = 5 - attack_verb_continuous = "bashes against" - attack_verb_simple = "bash against" + attacktext = "bashes against" + /*attack_verb_continuous = "bashes against" + attack_verb_simple = "bash against"*/ attack_sound = 'sound/weapons/punch1.ogg' throw_message = "does nothing to the rocky hide of the" speed = 2 move_to_delay = 5 - mob_biotypes = MOB_ORGANIC|MOB_BEAST + mob_biotypes = list(MOB_ORGANIC, MOB_BEAST) mouse_opacity = MOUSE_OPACITY_ICON butcher_results = list() guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide = 1) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index 3f184e2f52..f1e7494beb 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -28,8 +28,9 @@ health = 800 melee_damage_lower = 20 melee_damage_upper = 20 - attack_verb_continuous = "preaches to" - attack_verb_simple = "preach to" + attacktext = "preaches to" + /*attack_verb_continuous = "preaches to" + attack_verb_simple = "preach to"*/ attack_sound = 'sound/magic/clockwork/ratvar_attack.ogg' throw_message = "doesn't affect the purity of" speed = 4 @@ -124,11 +125,11 @@ /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/shoot_projectile(turf/marker, set_angle, var/is_teleshot) var/turf/startloc = get_turf(src) - var/obj/projectile/herald/H = null + var/obj/item/projectile/herald/H = null if(!is_teleshot) - H = new /obj/projectile/herald(startloc) + H = new /obj/item/projectile/herald(startloc) else - H = new /obj/projectile/herald/teleshot(startloc) + H = new /obj/item/projectile/herald/teleshot(startloc) H.preparePixelProjectile(marker, startloc) H.firer = src if(target) @@ -210,7 +211,7 @@ my_master.my_mirror = null . = ..() -/obj/projectile/herald +/obj/item/projectile/herald name ="death bolt" icon_state= "chronobolt" damage = 15 @@ -220,12 +221,12 @@ damage_type = BRUTE pass_flags = PASSTABLE -/obj/projectile/herald/teleshot +/obj/item/projectile/herald/teleshot name ="golden bolt" damage = 0 color = rgb(255,255,102) -/obj/projectile/herald/on_hit(atom/target, blocked = FALSE) +/obj/item/projectile/herald/on_hit(atom/target, blocked = FALSE) . = ..() if(ismineralturf(target)) var/turf/closed/mineral/M = target @@ -237,7 +238,7 @@ if(F != null && istype(F, /mob/living/simple_animal/hostile/asteroid/elite) && F.faction_check_mob(L)) L.heal_overall_damage(damage) -/obj/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE) +/obj/item/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE) . = ..() firer.forceMove(get_turf(src)) @@ -258,8 +259,8 @@ /obj/item/clothing/neck/cloak/herald_cloak/proc/shoot_projectile(turf/marker, set_angle, mob/living/carbon/owner) var/turf/startloc = get_turf(owner) - var/obj/projectile/herald/H = null - H = new /obj/projectile/herald(startloc) + var/obj/item/projectile/herald/H = null + H = new /obj/item/projectile/herald(startloc) H.preparePixelProjectile(marker, startloc) H.firer = owner H.fire(set_angle) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm index 5e0c00d998..1bc9ea1e4e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -28,8 +28,9 @@ health = 800 melee_damage_lower = 30 melee_damage_upper = 30 - attack_verb_continuous = "slashes its arms at" - attack_verb_simple = "slash your arms at" + attacktext = "slashes its arms at" + /*attack_verb_continuous = "slashes its arms at" + attack_verb_simple = "slash your arms at"*/ attack_sound = 'sound/weapons/bladeslice.ogg' throw_message = "doesn't affect the sturdiness of" speed = 1 @@ -130,7 +131,8 @@ visible_message("[src] attacks [L] with much force!") to_chat(L, "[src] grabs you and throws you with much force!") L.safe_throw_at(throwtarget, 10, 1, src) - L.Paralyze(20) + //L.Paralyze(20) + L.Stun(20) //substituting this for the Paralyze from the line above, because we don't have tg paralysis stuff L.adjustBruteLoss(50) addtimer(CALLBACK(src, .proc/legionnaire_charge_2, move_dir, (times_ran + 1)), 2) @@ -224,8 +226,9 @@ health = 80 melee_damage_lower = 10 melee_damage_upper = 10 - attack_verb_continuous = "bites at" - attack_verb_simple = "bite at" + attacktext = "bites at" + /*attack_verb_continuous = "bites at" + attack_verb_simple = "bite at"*/ attack_sound = 'sound/effects/curse1.ogg' throw_message = "simply misses" speed = 0 @@ -248,7 +251,7 @@ icon = 'icons/obj/lavaland/legionnaire_bonfire.dmi' icon_state = "bonfire" max_integrity = 100 - move_resist = MOVE_FORCE_EXTREMELY_STRONG + //move_resist = MOVE_FORCE_EXTREMELY_STRONG anchored = TRUE density = FALSE light_range = 4 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm index 7422a441aa..540470d505 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm @@ -28,8 +28,9 @@ health = 800 melee_damage_lower = 15 melee_damage_upper = 15 - attack_verb_continuous = "smashes into the side of" - attack_verb_simple = "smash into the side of" + attacktext = "smashes into the side of" + /*attack_verb_continuous = "smashes into the side of" + attack_verb_simple = "smash into the side of"*/ attack_sound = 'sound/weapons/sonic_jackhammer.ogg' throw_message = "merely dinks off of the" speed = 4 diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 0cb886f11b..a9f4c94397 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -99,6 +99,12 @@ var/obj/control_object //Used by admins to possess objects. All mobs should have this var var/atom/movable/remote_control //Calls relaymove() to whatever it is + /** + * The sound made on death + * + * leave null for no sound. used for *deathgasp + */ + var/deathsound = null var/turf/listed_turf = null //the current turf being examined in the stat panel From 1d0438800e9152a73800697c1f4e74b1c43ba823 Mon Sep 17 00:00:00 2001 From: Useroth Date: Sun, 8 Dec 2019 17:04:11 +0100 Subject: [PATCH 4/4] Touched up a copy-paste leftover. --- .../living/simple_animal/hostile/mining_mobs/elites/elite.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 36abd92b40..04a1b4a468 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -142,7 +142,7 @@ While using this makes the system rely on OnFire, it still gives options for tim /obj/item/gps/internal/elite icon_state = null gpstag = "Menacing Signal" - desc = "You're not quite sure how a signal can be bloody." + desc = "You're not quite sure how a signal can be menacing." invisibility = 100 /obj/structure/elite_tumor/attack_hand(mob/user)