diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index e880379b557f..cb404e75fc71 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -230,7 +230,7 @@ if (!mob_spawn_list) mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goldgrub = 1, /mob/living/simple_animal/hostile/asteroid/goliath = 5, /mob/living/simple_animal/hostile/asteroid/basilisk = 4, /mob/living/simple_animal/hostile/asteroid/hivelord = 3) if (!megafauna_spawn_list) - megafauna_spawn_list = list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = SPAWN_BUBBLEGUM) + megafauna_spawn_list = list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/stalwart = 3, /mob/living/simple_animal/hostile/megafauna/bubblegum = SPAWN_BUBBLEGUM) if (!flora_spawn_list) flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2) if(!terrain_spawn_list) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 5e9c6b33c361..c0139b1ccad5 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -1392,6 +1392,21 @@ /obj/item/hierophant_club/station z_level_check = FALSE +//Stalwart +/obj/structure/closet/crate/sphere/stalwart + name = "silvery capsule" + desc = "It feels cold to the touch..." + +/obj/structure/closet/crate/sphere/stalwart/PopulateContents() + new /obj/item/gun/energy/plasmacutter/adv/robocutter + +/obj/item/gun/energy/plasmacutter/adv/robocutter + name = "energized powercutter" + desc = "Ripped out of an ancient machine, this self-recharging cutter is unmatched." + fire_delay = 4 + icon = 'icons/obj/guns/energy.dmi' + icon_state = "robocutter" + selfcharge = 1 //Just some minor stuff /obj/structure/closet/crate/necropolis/puzzle name = "puzzling chest" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/stalwart.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/stalwart.dm new file mode 100644 index 000000000000..a96e1c9c71db --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/stalwart.dm @@ -0,0 +1,177 @@ +/mob/living/simple_animal/hostile/megafauna/stalwart + name = "stalwart" + desc = "A graceful, floating automaton. It emits a soft hum." + health = 3000 + maxHealth = 3000 + attacktext = "zaps" + attack_sound = 'sound/effects/empulse.ogg' + icon_state = "stalwart" + icon_living = "stalwart" + icon_dead = "" + friendly = "scans" + icon = 'icons/mob/lavaland/64x64megafauna.dmi' + speak_emote = list("screeches") + armour_penetration = 40 + melee_damage_lower = 40 + melee_damage_upper = 40 + speed = 5 + move_to_delay = 5 + ranged = TRUE + del_on_death = TRUE + pixel_x = -16 + internal_type = /obj/item/gps/internal/stalwart + loot = list(/obj/structure/closet/crate/sphere/stalwart) + deathmessage = "erupts into blue flame, and screeches before violently shattering." + deathsound = 'sound/voice/borg_deathsound.ogg' + internal_type = /obj/item/gps/internal/stalwart + var/charging = FALSE + var/revving_charge = FALSE + +/mob/living/simple_animal/hostile/megafauna/stalwart/OpenFire() + ranged_cooldown = world.time + 50 + anger_modifier = clamp(((maxHealth - health)/50),0,20) + if(prob(20+anger_modifier)) //Major attack + stalnade() + else if(prob(20)) + charge() + else + if(prob(70)) + backup() + else + energy_pike() + +/mob/living/simple_animal/hostile/megafauna/stalwart/proc/telegraph() + for(var/mob/M in range(10,src)) + flash_color(M.client, "#6CA4E3", 1) + shake_camera(M, 4, 3) + playsound(src, 'sound/voice/borg_deathsound.ogg', 200, 1) + +/mob/living/simple_animal/hostile/megafauna/stalwart/proc/shoot_projectile(turf/marker, set_angle) + if(!isnum(set_angle) && (!marker || marker == loc)) + return + var/turf/startloc = get_turf(src) + var/obj/item/projectile/P = new /obj/item/projectile/stalpike(startloc) + P.preparePixelProjectile(marker, startloc) + P.firer = src + if(target) + P.original = target + P.fire(set_angle) + +/mob/living/simple_animal/hostile/megafauna/stalwart/proc/bombsaway(turf/marker) + if(!marker || marker == loc) + return + var/turf/startloc = get_turf(src) + var/obj/item/projectile/P = new /obj/item/projectile/stalnade(startloc) + P.preparePixelProjectile(marker, startloc) + P.firer = src + if(target) + P.original = target + P.fire() + +/mob/living/simple_animal/hostile/megafauna/stalwart/proc/stalnade(turf/marker) + for(var/d in dir) + var/turf/E = get_step(src, d) + bombsaway(E) + +/mob/living/simple_animal/hostile/megafauna/stalwart/proc/backup() + visible_message("[src] constructs a flock of mini mechanoid!") + for(var/turf/open/H in range(src, 2)) + if(prob(25)) + new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/staldrone(H.loc) + +/mob/living/simple_animal/hostile/megafauna/stalwart/proc/energy_pike() + ranged_cooldown = world.time + 40 + dir_shots(GLOB.diagonals) + dir_shots(GLOB.cardinals) + SLEEP_CHECK_DEATH(10) + +/mob/living/simple_animal/hostile/megafauna/stalwart/proc/dir_shots(list/dirs) + if(!islist(dirs)) + dirs = GLOB.alldirs.Copy() + playsound(src, 'sound/effects/pop_expl.ogg', 200, 1, 2) + for(var/d in dirs) + var/turf/E = get_step(src, d) + shoot_projectile(E) + +/mob/living/simple_animal/hostile/megafauna/stalwart/proc/charge(var/atom/chargeat = target, var/delay = 5) + if(!chargeat) + return + var/chargeturf = get_turf(chargeat) + if(!chargeturf) + return + var/dir = get_dir(src, chargeturf) + var/turf/T = get_ranged_target_turf(chargeturf, dir, 2) + if(!T) + return + charging = TRUE + revving_charge = TRUE + telegraph(src) + walk(src, 0) + setDir(dir) + SLEEP_CHECK_DEATH(delay) + revving_charge = FALSE + var/movespeed = 1 + walk_towards(src, T, movespeed) + SLEEP_CHECK_DEATH(get_dist(src, T) * movespeed) + walk(src, 0) // cancel the movement + charging = FALSE + +/mob/living/simple_animal/hostile/megafauna/stalwart/Move() + if(revving_charge) + return FALSE + if(charging) + DestroySurroundings() // code stolen from chester stolen from bubblegum i am the ultimate shitcoder + ..() + +//Projectiles and such + +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/staldrone + name = "mini mechanoid" + desc = "It's staring at you intently. Do not taunt." + icon_state = "drone_gem" + faction = list("mining") + weather_immunities = list("lava","ash") + +/obj/item/gps/internal/stalwart + icon_state = null + gpstag = "Ancient Signal" + desc = "Bzz bizzop boop blip beep" + invisibility = 100 + +/obj/item/projectile/stalpike + name = "energy pike" + icon_state = "arcane_barrage" + damage = 20 + armour_penetration = 100 + speed = 5 + eyeblur = 0 + damage_type = BURN + pass_flags = PASSTABLE + color = "#6CA4E3" + +/obj/item/projectile/stalnade + name = "volatile orb" + icon_state = "wipe" + damage = 300 + armour_penetration = 100 + speed = 1 + eyeblur = 0 + pass_flags = PASSTABLE + +/obj/item/projectile/stalnade/Move() + . = ..() + var/turf/location = get_turf(src) + if(location) + new /obj/effect/temp_visual/hierophant/wall/stalwart(location) + +/obj/effect/temp_visual/hierophant/wall/stalwart + name = "azure barrier" + icon = 'icons/effects/fire.dmi' + icon_state = "3" + duration = 100 + smooth = SMOOTH_FALSE + color = "#6CA4E3" + +/mob/living/simple_animal/hostile/megafauna/stalwart/devour(mob/living/L) + visible_message("[src] melts [L]!") + L.dust() diff --git a/icons/mob/lavaland/64x64megafauna.dmi b/icons/mob/lavaland/64x64megafauna.dmi index 1794c789ded4..c8869352be75 100644 Binary files a/icons/mob/lavaland/64x64megafauna.dmi and b/icons/mob/lavaland/64x64megafauna.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index a8d7d283b189..f80b02ff16fa 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/yogstation.dme b/yogstation.dme index 0258406eec99..3bfc2697aa7d 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -2390,6 +2390,7 @@ #include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\stalwart.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm"