From 2091a431bbe896c517e1345f9fb883db7f74df77 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Fri, 29 Mar 2019 23:55:54 +0100 Subject: [PATCH] Split mining mob files --- code/game/turfs/simulated/floor/asteroid.dm | 1 - .../game/turfs/simulated/floor/fancy_floor.dm | 25 - .../mining/lavaland/loot/ashdragon_loot.dm | 2 +- .../mining/lavaland/loot/colossus_loot.dm | 2 +- .../simple_animal/hostile/mining/basilisk.dm | 81 +++ .../simple_animal/hostile/mining/goliath.dm | 176 ++++++ .../simple_animal/hostile/mining/gutlunch.dm | 112 ++++ .../simple_animal/hostile/mining/mining.dm | 47 ++ .../simple_animal/hostile/mining/spawners.dm | 85 +++ .../simple_animal/hostile/mining_mobs.dm | 527 ------------------ paradise.dme | 6 +- 11 files changed, 508 insertions(+), 556 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/mining/goliath.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/mining/mining.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/mining/spawners.dm delete mode 100644 code/modules/mob/living/simple_animal/hostile/mining_mobs.dm diff --git a/code/game/turfs/simulated/floor/asteroid.dm b/code/game/turfs/simulated/floor/asteroid.dm index 0ad0c4edbb6..aad46cd64bb 100644 --- a/code/game/turfs/simulated/floor/asteroid.dm +++ b/code/game/turfs/simulated/floor/asteroid.dm @@ -93,7 +93,6 @@ /turf/simulated/floor/plating/asteroid/basalt name = "volcanic floor" baseturf = /turf/simulated/floor/plating/asteroid/basalt - icon = 'icons/turf/floors.dmi' icon_state = "basalt" icon_plating = "basalt" environment_type = "basalt" diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index e9f8d96e70f..97065cd9711 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -78,31 +78,6 @@ playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) make_plating() -// NEEDS TO BE UPDATED -/turf/simulated/floor/basalt //By your powers combined, I am captain planet - name = "volcanic floor" - icon_state = "basalt0" - oxygen = 14 - nitrogen = 23 - temperature = 300 - -/turf/simulated/floor/basalt/attackby(obj/item/W, mob/user, params) - if(..()) - return - if(istype(W, /obj/item/shovel)) - new /obj/item/stack/ore/glass/basalt(src, 2) - user.visible_message("[user] digs up [src].", "You uproot [src].") - playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) - make_plating() - -/turf/simulated/floor/basalt/New() - ..() - if(prob(15)) - icon_state = "basalt[rand(0, 12)]" - switch(icon_state) - if("basalt1", "basalt2", "basalt3") - set_light(1, 1) - /turf/simulated/floor/carpet name = "carpet" icon = 'icons/turf/floors/carpet.dmi' diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index 7edfed65569..c4e468cea31 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -163,7 +163,7 @@ unacidable = 1 var/turf_type = /turf/simulated/floor/plating/lava/smooth var/transform_string = "lava" - var/reset_turf_type = /turf/simulated/floor/plating/asteroid/airless // /turf/simulated/floor/plating/asteroid/basalt once Lavaland turfs are added + var/reset_turf_type = /turf/simulated/floor/plating/asteroid/basalt var/reset_string = "basalt" var/create_cooldown = 100 var/create_delay = 30 diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index 311d7387614..73f4045e631 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -189,7 +189,7 @@ terrain_theme = pick("lavaland","winter","jungle","alien") switch(terrain_theme) if("lavaland")//Depressurizes the place... and free cult metal, I guess. - NewTerrainFloors = /turf/simulated/floor/basalt // Needs to be updated after turf update + NewTerrainFloors = /turf/simulated/floor/asteroid/basalt // Needs to be updated after turf update NewTerrainWalls = /turf/simulated/wall/cult NewFlora = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) florachance = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm new file mode 100644 index 00000000000..4f456bb79da --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm @@ -0,0 +1,81 @@ +/mob/living/simple_animal/hostile/asteroid/basilisk + name = "basilisk" + desc = "A territorial beast, covered in a thick shell that absorbs energy. Its stare causes victims to freeze from the inside." + icon = 'icons/mob/animal.dmi' + icon_state = "Basilisk" + icon_living = "Basilisk" + icon_aggro = "Basilisk_alert" + icon_dead = "Basilisk_dead" + icon_gib = "syndicate_gib" + move_to_delay = 20 + projectiletype = /obj/item/projectile/temp/basilisk + projectilesound = 'sound/weapons/pierce.ogg' + ranged = 1 + ranged_message = "stares" + ranged_cooldown_time = 30 + throw_message = "does nothing against the hard shell of" + vision_range = 2 + speed = 3 + maxHealth = 200 + health = 200 + harm_intent_damage = 5 + obj_damage = 60 + melee_damage_lower = 12 + melee_damage_upper = 12 + attacktext = "bites into" + a_intent = INTENT_HARM + speak_emote = list("chitters") + attack_sound = 'sound/weapons/bladeslice.ogg' + aggro_vision_range = 9 + idle_vision_range = 2 + turns_per_move = 5 + loot = list(/obj/item/stack/ore/diamond{layer = 4.1}, + /obj/item/stack/ore/diamond{layer = 4.1}) + +/obj/item/projectile/temp/basilisk + name = "freezing blast" + icon_state = "ice_2" + damage = 0 + damage_type = BURN + nodamage = 1 + flag = "energy" + temperature = 50 + +/mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(var/new_target) + if(..()) //we have a target + if(isliving(target)) + var/mob/living/L = target + if(L.bodytemperature > 261) + L.bodytemperature = 261 + visible_message("The [src.name]'s stare chills [L.name] to the bone!") + +/mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity) + switch(severity) + if(1.0) + gib() + if(2.0) + adjustBruteLoss(140) + if(3.0) + adjustBruteLoss(110) + +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher + name = "watcher" + desc = "A levitating, eye-like creature held aloft by winglike formations of sinew. A sharp spine of crystal protrudes from its body." + icon = 'icons/mob/lavaland/watcher.dmi' + icon_state = "watcher" + icon_living = "watcher" + icon_aggro = "watcher" + icon_dead = "watcher_dead" + pixel_x = -10 + throw_message = "bounces harmlessly off of" + melee_damage_lower = 15 + melee_damage_upper = 15 + attacktext = "impales" + a_intent = INTENT_HARM + speak_emote = list("telepathically cries") + attack_sound = 'sound/weapons/bladeslice.ogg' + stat_attack = 1 + flying = TRUE + robust_searching = 1 + loot = list() + butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm new file mode 100644 index 00000000000..f9cabef1431 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm @@ -0,0 +1,176 @@ +/mob/living/simple_animal/hostile/asteroid/goliath + name = "goliath" + desc = "A massive beast that uses long tentacles to ensare its prey, threatening them is not advised under any conditions." + icon = 'icons/mob/animal.dmi' + icon_state = "Goliath" + icon_living = "Goliath" + icon_aggro = "Goliath_alert" + icon_dead = "Goliath_dead" + icon_gib = "syndicate_gib" + attack_sound = 'sound/weapons/punch4.ogg' + mouse_opacity = MOUSE_OPACITY_OPAQUE + move_to_delay = 40 + ranged = 1 + ranged_cooldown = 2 //By default, start the Goliath with his cooldown off so that people can run away quickly on first sight + ranged_cooldown_time = 120 + friendly = "wails at" + speak_emote = list("bellows") + vision_range = 4 + speed = 3 + maxHealth = 300 + health = 300 + harm_intent_damage = 1 //Only the manliest of men can kill a Goliath with only their fists. + obj_damage = 100 + melee_damage_lower = 25 + melee_damage_upper = 25 + attacktext = "pulverizes" + attack_sound = 'sound/weapons/punch1.ogg' + throw_message = "does nothing to the rocky hide of the" + aggro_vision_range = 9 + idle_vision_range = 5 + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG + var/pre_attack = 0 + var/pre_attack_icon = "Goliath_preattack" + loot = list(/obj/item/asteroid/goliath_hide{layer = 4.1}) + +/mob/living/simple_animal/hostile/asteroid/goliath/process_ai() + ..() + handle_preattack() + +/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack() + if(ranged_cooldown <= world.time + ranged_cooldown_time * 0.25 && !pre_attack) + pre_attack++ + if(!pre_attack || stat || AIStatus == AI_IDLE) + return + icon_state = pre_attack_icon + +/mob/living/simple_animal/hostile/asteroid/goliath/revive() + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG + ..() + +/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire() + var/tturf = get_turf(target) + if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen + visible_message("The [src.name] digs its tentacles under [target.name]!") + new /obj/effect/goliath_tentacle/original(tturf) + ranged_cooldown = world.time + ranged_cooldown_time + icon_state = icon_aggro + pre_attack = 0 + return + +/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(damage) + ranged_cooldown-- + handle_preattack() + ..() + +/mob/living/simple_animal/hostile/asteroid/goliath/Aggro() + vision_range = aggro_vision_range + handle_preattack() + if(icon_state != icon_aggro) + icon_state = icon_aggro + return + +/obj/effect/goliath_tentacle + name = "Goliath tentacle" + icon = 'icons/mob/animal.dmi' + icon_state = "Goliath_tentacle" + var/latched = 0 + +/obj/effect/goliath_tentacle/New() + var/turftype = get_turf(src) + if(istype(turftype, /turf/simulated/mineral)) + var/turf/simulated/mineral/M = turftype + M.gets_drilled() + spawn(20) + Trip() + +/obj/effect/goliath_tentacle/original + +/obj/effect/goliath_tentacle/original/New() + for(var/obj/effect/goliath_tentacle/original/O in loc)//No more GG NO RE from 2+ goliaths simultaneously tentacling you + if(O != src) + qdel(src) + var/list/directions = cardinal.Copy() + var/counter + for(counter = 1, counter <= 3, counter++) + var/spawndir = pick(directions) + directions -= spawndir + var/turf/T = get_step(src,spawndir) + new /obj/effect/goliath_tentacle(T) + ..() + + +/obj/effect/goliath_tentacle/proc/Trip() + for(var/mob/living/M in src.loc) + M.Stun(5) + M.adjustBruteLoss(rand(10,15)) + latched = 1 + if(src && M) + visible_message("The [src.name] grabs hold of [M.name]!") + if(!latched) + qdel(src) + else + spawn(50) + qdel(src) + +/obj/item/asteroid/goliath_hide + name = "goliath hide plates" + desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna." + icon = 'icons/obj/items.dmi' + icon_state = "goliath_hide" + flags = NOBLUDGEON + w_class = WEIGHT_CLASS_NORMAL + layer = 4 + +/obj/item/asteroid/goliath_hide/afterattack(atom/target, mob/user, proximity_flag) + if(proximity_flag) + if(istype(target, /obj/item/clothing/suit/space/hardsuit/mining) || istype(target, /obj/item/clothing/head/helmet/space/hardsuit/mining) || istype(target, /obj/item/clothing/suit/space/eva/plasmaman/miner) || istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman/miner)) + var/obj/item/clothing/C = target + var/current_armor = C.armor + if(current_armor["melee"] < 60) + current_armor["melee"] = min(current_armor["melee"] + 10, 60) + to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") + qdel(src) + else + to_chat(user, "You can't improve [C] any further.") + return + if(istype(target, /obj/mecha/working/ripley)) + var/obj/mecha/D = target + if(D.icon_state != "ripley-open") + to_chat(user, "You can't add armour onto the mech while someone is inside!") + return + var/list/damage_absorption = D.damage_absorption + if(damage_absorption["brute"] > 0.3) + damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3) + damage_absorption["bullet"] = damage_absorption["bullet"] - 0.05 + damage_absorption["fire"] = damage_absorption["fire"] - 0.05 + damage_absorption["laser"] = damage_absorption["laser"] - 0.025 + to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") + qdel(src) + D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open") + D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates." + if(damage_absorption["brute"] == 0.3) + D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open") + D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter." + else + to_chat(user, "You can't improve [D] any further!") + return + +/mob/living/simple_animal/hostile/asteroid/goliath/beast + name = "goliath" + desc = "A hulking, armor-plated beast with long tendrils arching from its back." + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' + icon_state = "goliath" + icon_living = "goliath" + icon_aggro = "goliath" + icon_dead = "goliath_dead" + throw_message = "does nothing to the tough hide of the" + pre_attack_icon = "goliath2" + butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2) + loot = list() + stat_attack = 1 + robust_searching = 1 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm new file mode 100644 index 00000000000..fe8860c79e1 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm @@ -0,0 +1,112 @@ +/mob/living/simple_animal/hostile/asteroid/gutlunch + name = "gutlunch" + desc = "A scavenger that eats raw meat, often found alongside ash walkers. Produces a thick, nutritious milk." + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' + icon_state = "gutlunch" + icon_living = "gutlunch" + icon_dead = "gutlunch" + speak_emote = list("warbles", "quavers") + emote_hear = list("trills.") + emote_see = list("sniffs.", "burps.") + weather_immunities = list("lava","ash") + faction = list("mining", "ashwalker") + density = 0 + speak_chance = 1 + turns_per_move = 8 + obj_damage = 0 + environment_smash = 0 + move_to_delay = 15 + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "squishes" + friendly = "pinches" + a_intent = INTENT_HELP + ventcrawler = 2 + gold_core_spawnable = 2 + stat_attack = 1 + gender = NEUTER + stop_automated_movement = FALSE + stop_automated_movement_when_pulled = TRUE + stat_exclusive = TRUE + robust_searching = TRUE + search_objects = TRUE + del_on_death = TRUE + loot = list(/obj/effect/decal/cleanable/blood/gibs) + deathmessage = "is pulped into bugmash." + + simplespecies = /mob/living/simple_animal/hostile/asteroid/gutlunch + childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55) + + wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs) + var/obj/item/udder/gutlunch/udder = null + +/mob/living/simple_animal/hostile/asteroid/gutlunch/New() + udder = new() + ..() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/Destroy() + qdel(udder) + udder = null + return ..() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/regenerate_icons() + cut_overlays() + if(udder.reagents.total_volume == udder.reagents.maximum_volume) + add_overlay("gl_full") + ..() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/attackby(obj/item/O, mob/user, params) + if(stat == CONSCIOUS && istype(O, /obj/item/reagent_containers/glass)) + udder.milkAnimal(O, user) + regenerate_icons() + else + ..() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/AttackingTarget() + if(is_type_in_typecache(target, wanted_objects)) //we eats + udder.generateMilk() + regenerate_icons() + visible_message("[src] slurps up [target].") + qdel(target) + ..() + +/obj/item/udder/gutlunch + name = "nutrient sac" + +/obj/item/udder/gutlunch/New() + reagents = new(50) + reagents.my_atom = src + +/obj/item/udder/gutlunch/generateMilk() + if(prob(60)) + reagents.add_reagent("cream", rand(2, 5)) + if(prob(45)) + reagents.add_reagent("salglu_solution", rand(2,5)) + + +//Male gutlunch. They're smaller and more colorful! +/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck + name = "gubbuck" + gender = MALE + +/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck/New() + ..() + add_atom_colour(pick("#E39FBB", "#D97D64", "#CF8C4A"), FIXED_COLOUR_PRIORITY) + resize = 0.85 + update_transform() + +//Lady gutlunch. They make the babby. +/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen + name = "guthen" + gender = FEMALE + +/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/Life() + ..() + if(udder.reagents.total_volume == udder.reagents.maximum_volume) //Only breed when we're full. + make_babies() + +/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/make_babies() + . = ..() + if(.) + udder.reagents.clear_reagents() + regenerate_icons() diff --git a/code/modules/mob/living/simple_animal/hostile/mining/mining.dm b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm new file mode 100644 index 00000000000..2fd5e6ef0f2 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm @@ -0,0 +1,47 @@ +/mob/living/simple_animal/hostile/asteroid/ + vision_range = 2 + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + unsuitable_atmos_damage = 15 + faction = list("mining") + weather_immunities = list("lava","ash") + obj_damage = 30 + environment_smash = 2 + minbodytemp = 0 + heat_damage_per_tick = 20 + response_help = "pokes" + response_disarm = "shoves" + response_harm = "strikes" + status_flags = 0 + a_intent = INTENT_HARM + var/throw_message = "bounces off of" + var/icon_aggro = null // for swapping to when we get aggressive + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + mob_size = MOB_SIZE_LARGE + +/mob/living/simple_animal/hostile/asteroid/Aggro() + ..() + icon_state = icon_aggro + +/mob/living/simple_animal/hostile/asteroid/LoseAggro() + ..() + if(stat == CONSCIOUS) + icon_state = icon_living + +/mob/living/simple_animal/hostile/asteroid/bullet_act(var/obj/item/projectile/P)//Reduces damage from most projectiles to curb off-screen kills + if(!stat) + Aggro() + if(P.damage < 30 && P.damage_type != BRUTE) + P.damage = (P.damage / 3) + visible_message("The [P] has a reduced effect on [src]!") + ..() + +/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM)//No floor tiling them to death, wiseguy + if(istype(AM, /obj/item)) + var/obj/item/T = AM + if(!stat) + Aggro() + if(T.throwforce <= 20) + visible_message("The [T.name] [src.throw_message] [src.name]!") + return + ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining/spawners.dm b/code/modules/mob/living/simple_animal/hostile/mining/spawners.dm new file mode 100644 index 00000000000..9ef81c8b0ba --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining/spawners.dm @@ -0,0 +1,85 @@ +/mob/living/simple_animal/hostile/spawner/lavaland + name = "necropolis tendril" + desc = "A vile tendril of corruption, originating deep underground. Terrible monsters are pouring out of it." + icon = 'icons/mob/nest.dmi' + icon_state = "tendril" + icon_living = "tendril" + icon_dead = "tendril" + faction = list("mining") + weather_immunities = list("lava","ash") + luminosity = 1 + health = 250 + maxHealth = 250 + max_mobs = 3 + spawn_time = 300 //30 seconds default + mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk/watcher + spawn_text = "emerges from" + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + maxbodytemp = INFINITY + loot = list(/obj/effect/collapse, /obj/structure/closet/crate/necropolis/tendril) + del_on_death = 1 + var/gps = null + +/mob/living/simple_animal/hostile/spawner/lavaland/New() + ..() + //for(var/F in RANGE_TURFS(1, src)) TODO: Uncomment + //if(ismineralturf(F)) + //var/turf/simulated/mineral/M = F + //M.ChangeTurf(M.turf_type, FALSE, TRUE) + gps = new /obj/item/gps/internal(src) + +/mob/living/simple_animal/hostile/spawner/lavaland/Destroy() + qdel(gps) + . = ..() + +#define MEDAL_PREFIX "Tendril" +/mob/living/simple_animal/hostile/spawner/lavaland/death() + var/last_tendril = TRUE + for(var/mob/living/simple_animal/hostile/spawner/lavaland/other in GLOB.mob_list) + if(other != src) + last_tendril = FALSE + break + if(last_tendril && !admin_spawned) + if(global.medal_hub && global.medal_pass && global.medals_enabled) + for(var/mob/living/L in view(7,src)) + if(L.stat) + continue + if(L.client) + var/client/C = L.client + var/suffixm = ALL_KILL_MEDAL + var/prefix = MEDAL_PREFIX + UnlockMedal("[prefix] [suffixm]",C) + SetScore(TENDRIL_CLEAR_SCORE,C,1) + ..() +#undef MEDAL_PREFIX + +/obj/effect/collapse + name = "collapsing necropolis tendril" + desc = "Get clear!" + luminosity = 1 + layer = ABOVE_OPEN_TURF_LAYER + icon = 'icons/mob/nest.dmi' + icon_state = "tendril" + anchored = TRUE + +/obj/effect/collapse/New() + ..() + visible_message("The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!") + visible_message("Something falls free of the tendril!") + playsound(get_turf(src),'sound/effects/tendril_destroyed.ogg', 200, 0, 50, 1, 1) + spawn(50) + for(var/mob/M in range(7,src)) + shake_camera(M, 15, 1) + playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, 1) + visible_message("The tendril falls inward, the ground around it widening into a yawning chasm!") + for(var/turf/T in range(2,src)) + if(!T.density) + T.TerraformTurf(/turf/simulated/floor/chasm/straight_down/lava_land_surface) + qdel(src) + +/mob/living/simple_animal/hostile/spawner/lavaland/goliath + mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast + +/mob/living/simple_animal/hostile/spawner/lavaland/legion + mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm deleted file mode 100644 index 3f785fb1744..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ /dev/null @@ -1,527 +0,0 @@ -/mob/living/simple_animal/hostile/asteroid/ - vision_range = 2 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 15 - faction = list("mining") - weather_immunities = list("lava","ash") - obj_damage = 30 - environment_smash = 2 - minbodytemp = 0 - heat_damage_per_tick = 20 - response_help = "pokes" - response_disarm = "shoves" - response_harm = "strikes" - status_flags = 0 - a_intent = INTENT_HARM - var/throw_message = "bounces off of" - var/icon_aggro = null // for swapping to when we get aggressive - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - mob_size = MOB_SIZE_LARGE - -/mob/living/simple_animal/hostile/asteroid/Aggro() - ..() - icon_state = icon_aggro - -/mob/living/simple_animal/hostile/asteroid/LoseAggro() - ..() - if(stat == CONSCIOUS) - icon_state = icon_living - -/mob/living/simple_animal/hostile/asteroid/bullet_act(var/obj/item/projectile/P)//Reduces damage from most projectiles to curb off-screen kills - if(!stat) - Aggro() - if(P.damage < 30 && P.damage_type != BRUTE) - P.damage = (P.damage / 3) - visible_message("The [P] has a reduced effect on [src]!") - ..() - -/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM)//No floor tiling them to death, wiseguy - if(istype(AM, /obj/item)) - var/obj/item/T = AM - if(!stat) - Aggro() - if(T.throwforce <= 20) - visible_message("The [T.name] [src.throw_message] [src.name]!") - return - ..() - -/mob/living/simple_animal/hostile/asteroid/basilisk - name = "basilisk" - desc = "A territorial beast, covered in a thick shell that absorbs energy. Its stare causes victims to freeze from the inside." - icon = 'icons/mob/animal.dmi' - icon_state = "Basilisk" - icon_living = "Basilisk" - icon_aggro = "Basilisk_alert" - icon_dead = "Basilisk_dead" - icon_gib = "syndicate_gib" - move_to_delay = 20 - projectiletype = /obj/item/projectile/temp/basilisk - projectilesound = 'sound/weapons/pierce.ogg' - ranged = 1 - ranged_message = "stares" - ranged_cooldown_time = 30 - throw_message = "does nothing against the hard shell of" - vision_range = 2 - speed = 3 - maxHealth = 200 - health = 200 - harm_intent_damage = 5 - obj_damage = 60 - melee_damage_lower = 12 - melee_damage_upper = 12 - attacktext = "bites into" - a_intent = INTENT_HARM - speak_emote = list("chitters") - attack_sound = 'sound/weapons/bladeslice.ogg' - aggro_vision_range = 9 - idle_vision_range = 2 - turns_per_move = 5 - loot = list(/obj/item/stack/ore/diamond{layer = 4.1}, - /obj/item/stack/ore/diamond{layer = 4.1}) - -/obj/item/projectile/temp/basilisk - name = "freezing blast" - icon_state = "ice_2" - damage = 0 - damage_type = BURN - nodamage = 1 - flag = "energy" - temperature = 50 - -/mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(var/new_target) - if(..()) //we have a target - if(isliving(target)) - var/mob/living/L = target - if(L.bodytemperature > 261) - L.bodytemperature = 261 - visible_message("The [src.name]'s stare chills [L.name] to the bone!") - -/mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity) - switch(severity) - if(1.0) - gib() - if(2.0) - adjustBruteLoss(140) - if(3.0) - adjustBruteLoss(110) - -/mob/living/simple_animal/hostile/asteroid/goliath - name = "goliath" - desc = "A massive beast that uses long tentacles to ensare its prey, threatening them is not advised under any conditions." - icon = 'icons/mob/animal.dmi' - icon_state = "Goliath" - icon_living = "Goliath" - icon_aggro = "Goliath_alert" - icon_dead = "Goliath_dead" - icon_gib = "syndicate_gib" - attack_sound = 'sound/weapons/punch4.ogg' - mouse_opacity = MOUSE_OPACITY_OPAQUE - move_to_delay = 40 - ranged = 1 - ranged_cooldown = 2 //By default, start the Goliath with his cooldown off so that people can run away quickly on first sight - ranged_cooldown_time = 120 - friendly = "wails at" - speak_emote = list("bellows") - vision_range = 4 - speed = 3 - maxHealth = 300 - health = 300 - harm_intent_damage = 1 //Only the manliest of men can kill a Goliath with only their fists. - obj_damage = 100 - melee_damage_lower = 25 - melee_damage_upper = 25 - attacktext = "pulverizes" - attack_sound = 'sound/weapons/punch1.ogg' - throw_message = "does nothing to the rocky hide of the" - aggro_vision_range = 9 - idle_vision_range = 5 - move_force = MOVE_FORCE_VERY_STRONG - move_resist = MOVE_FORCE_VERY_STRONG - pull_force = MOVE_FORCE_VERY_STRONG - var/pre_attack = 0 - var/pre_attack_icon = "Goliath_preattack" - loot = list(/obj/item/asteroid/goliath_hide{layer = 4.1}) - -/mob/living/simple_animal/hostile/asteroid/goliath/process_ai() - ..() - handle_preattack() - -/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack() - if(ranged_cooldown <= world.time + ranged_cooldown_time * 0.25 && !pre_attack) - pre_attack++ - if(!pre_attack || stat || AIStatus == AI_IDLE) - return - icon_state = pre_attack_icon - -/mob/living/simple_animal/hostile/asteroid/goliath/revive() - move_force = MOVE_FORCE_VERY_STRONG - move_resist = MOVE_FORCE_VERY_STRONG - pull_force = MOVE_FORCE_VERY_STRONG - ..() - -/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire() - var/tturf = get_turf(target) - if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen - visible_message("The [src.name] digs its tentacles under [target.name]!") - new /obj/effect/goliath_tentacle/original(tturf) - ranged_cooldown = world.time + ranged_cooldown_time - icon_state = icon_aggro - pre_attack = 0 - return - -/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(damage) - ranged_cooldown-- - handle_preattack() - ..() - -/mob/living/simple_animal/hostile/asteroid/goliath/Aggro() - vision_range = aggro_vision_range - handle_preattack() - if(icon_state != icon_aggro) - icon_state = icon_aggro - return - -/obj/effect/goliath_tentacle - name = "Goliath tentacle" - icon = 'icons/mob/animal.dmi' - icon_state = "Goliath_tentacle" - var/latched = 0 - -/obj/effect/goliath_tentacle/New() - var/turftype = get_turf(src) - if(istype(turftype, /turf/simulated/mineral)) - var/turf/simulated/mineral/M = turftype - M.gets_drilled() - spawn(20) - Trip() - -/obj/effect/goliath_tentacle/original - -/obj/effect/goliath_tentacle/original/New() - for(var/obj/effect/goliath_tentacle/original/O in loc)//No more GG NO RE from 2+ goliaths simultaneously tentacling you - if(O != src) - qdel(src) - var/list/directions = cardinal.Copy() - var/counter - for(counter = 1, counter <= 3, counter++) - var/spawndir = pick(directions) - directions -= spawndir - var/turf/T = get_step(src,spawndir) - new /obj/effect/goliath_tentacle(T) - ..() - - -/obj/effect/goliath_tentacle/proc/Trip() - for(var/mob/living/M in src.loc) - M.Stun(5) - M.adjustBruteLoss(rand(10,15)) - latched = 1 - if(src && M) - visible_message("The [src.name] grabs hold of [M.name]!") - if(!latched) - qdel(src) - else - spawn(50) - qdel(src) - -/obj/item/asteroid/goliath_hide - name = "goliath hide plates" - desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna." - icon = 'icons/obj/items.dmi' - icon_state = "goliath_hide" - flags = NOBLUDGEON - w_class = WEIGHT_CLASS_NORMAL - layer = 4 - -/obj/item/asteroid/goliath_hide/afterattack(atom/target, mob/user, proximity_flag) - if(proximity_flag) - if(istype(target, /obj/item/clothing/suit/space/hardsuit/mining) || istype(target, /obj/item/clothing/head/helmet/space/hardsuit/mining) || istype(target, /obj/item/clothing/suit/space/eva/plasmaman/miner) || istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman/miner)) - var/obj/item/clothing/C = target - var/current_armor = C.armor - if(current_armor["melee"] < 60) - current_armor["melee"] = min(current_armor["melee"] + 10, 60) - to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") - qdel(src) - else - to_chat(user, "You can't improve [C] any further.") - return - if(istype(target, /obj/mecha/working/ripley)) - var/obj/mecha/D = target - if(D.icon_state != "ripley-open") - to_chat(user, "You can't add armour onto the mech while someone is inside!") - return - var/list/damage_absorption = D.damage_absorption - if(damage_absorption["brute"] > 0.3) - damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3) - damage_absorption["bullet"] = damage_absorption["bullet"] - 0.05 - damage_absorption["fire"] = damage_absorption["fire"] - 0.05 - damage_absorption["laser"] = damage_absorption["laser"] - 0.025 - to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") - qdel(src) - D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open") - D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates." - if(damage_absorption["brute"] == 0.3) - D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open") - D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter." - else - to_chat(user, "You can't improve [D] any further!") - return - -/////////////////////Lavaland - -//Watcher - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher - name = "watcher" - desc = "A levitating, eye-like creature held aloft by winglike formations of sinew. A sharp spine of crystal protrudes from its body." - icon = 'icons/mob/lavaland/watcher.dmi' - icon_state = "watcher" - icon_living = "watcher" - icon_aggro = "watcher" - icon_dead = "watcher_dead" - pixel_x = -10 - throw_message = "bounces harmlessly off of" - melee_damage_lower = 15 - melee_damage_upper = 15 - attacktext = "impales" - a_intent = INTENT_HARM - speak_emote = list("telepathically cries") - attack_sound = 'sound/weapons/bladeslice.ogg' - stat_attack = 1 - flying = TRUE - robust_searching = 1 - loot = list() - butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1) - -//Goliath - -/mob/living/simple_animal/hostile/asteroid/goliath/beast - name = "goliath" - desc = "A hulking, armor-plated beast with long tendrils arching from its back." - icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "goliath" - icon_living = "goliath" - icon_aggro = "goliath" - icon_dead = "goliath_dead" - throw_message = "does nothing to the tough hide of the" - pre_attack_icon = "goliath2" - butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2) - loot = list() - stat_attack = 1 - robust_searching = 1 - -//Gutlunches - -/obj/item/udder/gutlunch - name = "nutrient sac" - -/obj/item/udder/gutlunch/New() - reagents = new(50) - reagents.my_atom = src - -/obj/item/udder/gutlunch/generateMilk() - if(prob(60)) - reagents.add_reagent("cream", rand(2, 5)) - if(prob(45)) - reagents.add_reagent("salglu_solution", rand(2,5)) - -/mob/living/simple_animal/hostile/asteroid/gutlunch - name = "gutlunch" - desc = "A scavenger that eats raw meat, often found alongside ash walkers. Produces a thick, nutritious milk." - icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "gutlunch" - icon_living = "gutlunch" - icon_dead = "gutlunch" - speak_emote = list("warbles", "quavers") - emote_hear = list("trills.") - emote_see = list("sniffs.", "burps.") - weather_immunities = list("lava","ash") - faction = list("mining", "ashwalker") - density = 0 - speak_chance = 1 - turns_per_move = 8 - obj_damage = 0 - environment_smash = 0 - move_to_delay = 15 - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "squishes" - friendly = "pinches" - a_intent = INTENT_HELP - ventcrawler = 2 - gold_core_spawnable = 2 - stat_attack = 1 - gender = NEUTER - stop_automated_movement = FALSE - stop_automated_movement_when_pulled = TRUE - stat_exclusive = TRUE - robust_searching = TRUE - search_objects = TRUE - del_on_death = TRUE - loot = list(/obj/effect/decal/cleanable/blood/gibs) - deathmessage = "is pulped into bugmash." - - simplespecies = /mob/living/simple_animal/hostile/asteroid/gutlunch - childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55) - - wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs) - var/obj/item/udder/gutlunch/udder = null - -/mob/living/simple_animal/hostile/asteroid/gutlunch/New() - udder = new() - ..() - -/mob/living/simple_animal/hostile/asteroid/gutlunch/Destroy() - qdel(udder) - udder = null - return ..() - -/mob/living/simple_animal/hostile/asteroid/gutlunch/regenerate_icons() - cut_overlays() - if(udder.reagents.total_volume == udder.reagents.maximum_volume) - add_overlay("gl_full") - ..() - -/mob/living/simple_animal/hostile/asteroid/gutlunch/attackby(obj/item/O, mob/user, params) - if(stat == CONSCIOUS && istype(O, /obj/item/reagent_containers/glass)) - udder.milkAnimal(O, user) - regenerate_icons() - else - ..() - -/mob/living/simple_animal/hostile/asteroid/gutlunch/AttackingTarget() - if(is_type_in_typecache(target, wanted_objects)) //we eats - udder.generateMilk() - regenerate_icons() - visible_message("[src] slurps up [target].") - qdel(target) - ..() - -/obj/item/udder/gutlunch - name = "nutrient sac" - -/obj/item/udder/gutlunch/New() - reagents = new(50) - reagents.my_atom = src - -/obj/item/udder/gutlunch/generateMilk() - if(prob(60)) - reagents.add_reagent("cream", rand(2, 5)) - if(prob(45)) - reagents.add_reagent("salglu_solution", rand(2,5)) - - -//Male gutlunch. They're smaller and more colorful! -/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck - name = "gubbuck" - gender = MALE - -/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck/New() - ..() - add_atom_colour(pick("#E39FBB", "#D97D64", "#CF8C4A"), FIXED_COLOUR_PRIORITY) - resize = 0.85 - update_transform() - -//Lady gutlunch. They make the babby. -/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen - name = "guthen" - gender = FEMALE - -/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/Life() - ..() - if(udder.reagents.total_volume == udder.reagents.maximum_volume) //Only breed when we're full. - make_babies() - -/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/make_babies() - . = ..() - if(.) - udder.reagents.clear_reagents() - regenerate_icons() - -//Nests -/mob/living/simple_animal/hostile/spawner/lavaland - name = "necropolis tendril" - desc = "A vile tendril of corruption, originating deep underground. Terrible monsters are pouring out of it." - icon = 'icons/mob/nest.dmi' - icon_state = "tendril" - icon_living = "tendril" - icon_dead = "tendril" - faction = list("mining") - weather_immunities = list("lava","ash") - luminosity = 1 - health = 250 - maxHealth = 250 - max_mobs = 3 - spawn_time = 300 //30 seconds default - mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk/watcher - spawn_text = "emerges from" - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = INFINITY - loot = list(/obj/effect/collapse, /obj/structure/closet/crate/necropolis/tendril) - del_on_death = 1 - var/gps = null - -/mob/living/simple_animal/hostile/spawner/lavaland/New() - ..() - //for(var/F in RANGE_TURFS(1, src)) TODO: Uncomment - //if(ismineralturf(F)) - //var/turf/simulated/mineral/M = F - //M.ChangeTurf(M.turf_type, FALSE, TRUE) - gps = new /obj/item/gps/internal(src) - -/mob/living/simple_animal/hostile/spawner/lavaland/Destroy() - qdel(gps) - . = ..() - -#define MEDAL_PREFIX "Tendril" -/mob/living/simple_animal/hostile/spawner/lavaland/death() - var/last_tendril = TRUE - for(var/mob/living/simple_animal/hostile/spawner/lavaland/other in GLOB.mob_list) - if(other != src) - last_tendril = FALSE - break - if(last_tendril && !admin_spawned) - if(global.medal_hub && global.medal_pass && global.medals_enabled) - for(var/mob/living/L in view(7,src)) - if(L.stat) - continue - if(L.client) - var/client/C = L.client - var/suffixm = ALL_KILL_MEDAL - var/prefix = MEDAL_PREFIX - UnlockMedal("[prefix] [suffixm]",C) - SetScore(TENDRIL_CLEAR_SCORE,C,1) - ..() -#undef MEDAL_PREFIX - -/obj/effect/collapse - name = "collapsing necropolis tendril" - desc = "Get clear!" - luminosity = 1 - layer = ABOVE_OPEN_TURF_LAYER - icon = 'icons/mob/nest.dmi' - icon_state = "tendril" - anchored = TRUE - -/obj/effect/collapse/New() - ..() - visible_message("The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!") - visible_message("Something falls free of the tendril!") - playsound(get_turf(src),'sound/effects/tendril_destroyed.ogg', 200, 0, 50, 1, 1) - spawn(50) - for(var/mob/M in range(7,src)) - shake_camera(M, 15, 1) - playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, 1) - visible_message("The tendril falls inward, the ground around it widening into a yawning chasm!") - for(var/turf/T in range(2,src)) - if(!T.density) - T.TerraformTurf(/turf/simulated/floor/chasm/straight_down/lava_land_surface) - qdel(src) - -/mob/living/simple_animal/hostile/spawner/lavaland/goliath - mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast - -/mob/living/simple_animal/hostile/spawner/lavaland/legion - mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index d844ee68001..ae24703c635 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1899,7 +1899,6 @@ #include "code\modules\mob\living\simple_animal\hostile\jungle_animals.dm" #include "code\modules\mob\living\simple_animal\hostile\killertomato.dm" #include "code\modules\mob\living\simple_animal\hostile\mimic.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" #include "code\modules\mob\living\simple_animal\hostile\russian.dm" @@ -1915,8 +1914,13 @@ #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\mining\basilisk.dm" #include "code\modules\mob\living\simple_animal\hostile\mining\goldgrub.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\goliath.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\gutlunch.dm" #include "code\modules\mob\living\simple_animal\hostile\mining\hivelord.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\mining.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining\spawners.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\fish.dm"