Tweaks jungleland mobs (#22293)

* Update jungle_alpha_mobs.dm

* Update jungle_alpha_mobs.dm

* Update jungle_projectiles.dm

* tweaks

* slow

* tweaks

* oh god what have i gotten myself into

* typepaths

* nah, take it back

* whoops

* Update wasp.dm

* tweaks

* tweaks

* faster

* no revive alphas

* tweaks

* tweaks

* Update JungleBiomes.dm

* Update JungleBiomes.dm
This commit is contained in:
Molti
2024-07-25 21:46:43 -05:00
committed by GitHub
parent 3cbff1a16d
commit b8da9f122c
17 changed files with 319 additions and 483 deletions

View File

@@ -41,7 +41,7 @@
/turf/open/indestructible/grass/jungle,
/area/template_noop)
"u" = (
/mob/living/simple_animal/hostile/yog_jungle/dryad{
/mob/living/simple_animal/hostile/asteroid/yog_jungle/dryad{
desc = "An elderly spirit. It looks to have tended to this quaint garden for a very long time.";
name = "The Gardener"
},

View File

@@ -11,7 +11,7 @@
/turf/open/floor/plating/dirt/jungleland/jungle,
/area/ruin/unpowered)
"h" = (
/mob/living/simple_animal/hostile/yog_jungle/corrupted_dryad{
/mob/living/simple_animal/hostile/asteroid/yog_jungle/corrupted_dryad{
startDead = 1
},
/turf/open/floor/plating/dirt/jungleland/jungle,
@@ -80,7 +80,7 @@
/turf/open/floor/plating/dirt/jungleland/jungle,
/area/ruin/unpowered)
"L" = (
/mob/living/simple_animal/hostile/yog_jungle/corrupted_dryad,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/corrupted_dryad,
/turf/open/floor/plating/dirt/jungleland/jungle,
/area/ruin/unpowered)
"O" = (

View File

@@ -51,7 +51,7 @@
/turf/open/floor/plating/dirt/jungleland/shallow_mud,
/area/template_noop)
"s" = (
/mob/living/simple_animal/hostile/yog_jungle/meduracha,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/meduracha,
/turf/open/water/smooth/toxic_pit,
/area/template_noop)
"t" = (

View File

@@ -166,6 +166,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define ismegafauna(A) (istype(A, /mob/living/simple_animal/hostile/megafauna))
#define isjunglealpha(A) (istype(A, /mob/living/simple_animal/hostile/megafauna))
#define isclown(A) (istype(A, /mob/living/simple_animal/hostile/retaliate/clown))
#define issupplypod(A) (istype(A, /obj/structure/closet/supplypod))

View File

@@ -610,7 +610,7 @@ GLOBAL_LIST_EMPTY(aide_list)
return
if(isliving(target))
var/mob/living/L = target
if(ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid) || istype(L,/mob/living/simple_animal/hostile/yog_jungle)) //no loot allowed from the little skulls
if(ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid) || istype(L,/mob/living/simple_animal/hostile/asteroid/yog_jungle)) //no loot allowed from the little skulls
if(!istype(L, /mob/living/simple_animal/hostile/asteroid/hivelordbrood))
RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(roll_loot), TRUE)
//after quite a bit of grinding, you'll be doing a total of 120 damage to fauna per hit. A lot, but i feel like the grind justifies the payoff. also this doesn't effect crew. so. go nuts.

View File

@@ -2,7 +2,7 @@
/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)
faction = list("mining")
faction = list("mining", "skintwister_cloak")
weather_immunities = ALL
obj_damage = 30
environment_smash = ENVIRONMENT_SMASH_WALLS
@@ -13,16 +13,18 @@
response_harm = "strikes"
status_flags = 0
combat_mode = TRUE
var/crusher_loot
var/throw_message = "bounces off of"
var/fromtendril = FALSE
// Pale purple, should be red enough to see stuff on lavaland
lighting_cutoff_red = 25
lighting_cutoff_green = 15
lighting_cutoff_blue = 35
mob_size = MOB_SIZE_LARGE
/// If we try to spawn an "empowered" version, what will it spawn
var/alpha_type
var/icon_aggro = null
var/crusher_loot
var/crusher_drop_mod = 25
var/throw_message = "bounces off of"
var/fromtendril = FALSE
/mob/living/simple_animal/hostile/asteroid/Aggro()
..()

View File

@@ -6,6 +6,7 @@
icon_state = "wasp"
icon_living = "wasp"
icon_aggro = "wasp"
mob_biotypes = (MOB_BEAST | MOB_ORGANIC)
icon_dead = "wasp_dead"
icon_gib = "syndicate_gib"
throw_message = "bounces harmlessly off the"
@@ -13,10 +14,12 @@
movement_type = FLYING
ranged = 1
ranged_cooldown_time = 120
speak = list("bzzzzz")
speak_emote = list("buzzes")
emote_hear = list("buzzes")
emote_taunt = list("buzzes")
vision_range = 5
aggro_vision_range = 9
see_in_dark = 7
speed = 2
maxHealth = 200
health = 200
@@ -33,6 +36,7 @@
var/revving_charge = FALSE
var/poison_type = /datum/reagent/toxin/venom
var/poison_per_attack = 5
var/dash_speed = 1
/mob/living/simple_animal/hostile/asteroid/wasp/AttackingTarget()
..()
@@ -71,9 +75,8 @@
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_towards(src, T, dash_speed)
SLEEP_CHECK_DEATH(get_dist(src, T) * dash_speed)
walk(src, 0) // cancel the movement
charging = FALSE

View File

@@ -46,4 +46,4 @@
/datum/mapGenerator/asteroid/filled
modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidWalls)
buildmode_name = "Block: Asteroid Walls"
buildmode_name = "Block: Asteroid Walls"

View File

@@ -25,7 +25,7 @@
return
var/mob/living/L = target
if(ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid) || istype(L, /mob/living/simple_animal/hostile/yog_jungle) || istype(L, /mob/living/simple_animal/hostile/tar))
if(ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid) || istype(L, /mob/living/simple_animal/hostile/asteroid/yog_jungle) || istype(L, /mob/living/simple_animal/hostile/tar))
L.apply_damage(fauna_damage_bonus)
if(!istype(ammo_type, /obj/item/ammo_casing/reusable/arrow))

View File

@@ -922,7 +922,7 @@
M.visible_message(span_warning("[M]'s body shivers slightly, maybe the dose wasn't enough..."))
return ..()
if(M.stat == DEAD)
if(M.suiciding || M.hellbound || ismegafauna(M)) //they are never coming back
if(M.suiciding || M.hellbound || ismegafauna(M) || isjunglealpha(M)) //they are never coming back
M.visible_message(span_warning("[M]'s body does not react..."))
return
if(iscarbon(M) && (M.getBruteLoss() + M.getFireLoss() >= 100 || HAS_TRAIT(M, TRAIT_HUSK))) //body is too damaged to be revived

View File

@@ -47,15 +47,33 @@
var/obj/structure/flora = pickweight(loose_flora)
new flora(gen_turf)
/**
* Tar wastes
*/
/datum/biome/jungleland/tar_wastes
turf_type = /turf/open/floor/plating/dirt/jungleland/obsidian
closed_turf = /turf/open/water/smooth/tar_basin
loose_flora = list(/obj/structure/flora/rock = 2,/obj/structure/flora/rock/pile = 2)
loose_flora = list(
/obj/structure/flora/rock = 2,
/obj/structure/flora/rock/pile = 2
)
loose_flora_density = 10
fauna_density = 0.5
fauna_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 33,/mob/living/simple_animal/hostile/asteroid/goliath/beast = 33,/mob/living/simple_animal/hostile/asteroid/goldgrub = 25,/mob/living/simple_animal/hostile/yog_jungle/skin_twister = 1, /mob/living/simple_animal/hostile/asteroid/marrowweaver = 7)
fauna_types = list(
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 33,
/mob/living/simple_animal/hostile/asteroid/goliath/beast = 33,
/mob/living/simple_animal/hostile/asteroid/goldgrub = 25,
/mob/living/simple_animal/hostile/asteroid/marrowweaver = 7,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/skin_twister = 1,
)
this_area = /area/jungleland/tar_wastes
/**
* Dry swamp
*/
/datum/biome/jungleland/dry_swamp
turf_type = /turf/open/floor/plating/dirt/jungleland/deep_sand
closed_turf = /turf/open/water/smooth/toxic_pit
@@ -82,17 +100,20 @@
loose_flora_density = 10
fauna_types = list(
/mob/living/simple_animal/hostile/yog_jungle/emeraldspider = 15,
/mob/living/simple_animal/hostile/yog_jungle/mosquito = 15,
/mob/living/simple_animal/hostile/yog_jungle/blobby = 10,
/mob/living/simple_animal/hostile/yog_jungle/meduracha = 10,
/mob/living/simple_animal/hostile/yog_jungle/skin_twister = 1
/mob/living/simple_animal/hostile/asteroid/yog_jungle/emeraldspider = 15,
/mob/living/simple_animal/hostile/asteroid/wasp/mosquito = 15,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/blobby = 10,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/meduracha = 10,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/skin_twister = 1
)
fauna_density = 0.4
spawn_fauna_on_closed = TRUE
this_area = /area/jungleland/dry_swamp
/**
* Toxic pit
*/
/datum/biome/jungleland/toxic_pit
turf_type = /turf/open/floor/plating/dirt/jungleland/shallow_mud
closed_turf = /turf/open/water/smooth/toxic_pit
@@ -117,17 +138,20 @@
loose_flora_density = 20
fauna_types = list(
/mob/living/simple_animal/hostile/yog_jungle/meduracha = 50,
/mob/living/simple_animal/hostile/yog_jungle/mosquito = 40,
/mob/living/simple_animal/hostile/yog_jungle/blobby = 25,
/mob/living/simple_animal/hostile/yog_jungle/emeraldspider = 2,
/mob/living/simple_animal/hostile/yog_jungle/skin_twister = 1
/mob/living/simple_animal/hostile/asteroid/yog_jungle/meduracha = 50,
/mob/living/simple_animal/hostile/asteroid/wasp/mosquito = 40,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/blobby = 25,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/emeraldspider = 2,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/skin_twister = 1
)
fauna_density = 0.7
spawn_fauna_on_closed = TRUE
this_area = /area/jungleland/toxic_pit
/**
* Dying forest
*/
/datum/biome/jungleland/dying_forest
turf_type = /turf/open/floor/plating/dirt/jungleland/deep_sand
closed_turf = /turf/open/floor/plating/dirt/jungleland/shallow_mud
@@ -148,14 +172,17 @@
dense_flora_density = 50
fauna_types = list(
/mob/living/simple_animal/hostile/yog_jungle/corrupted_dryad = 60,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/corrupted_dryad = 60,
/mob/living/simple_animal/hostile/asteroid/goldgrub = 30,
/mob/living/simple_animal/hostile/yog_jungle/mosquito = 10,
/mob/living/simple_animal/hostile/yog_jungle/skin_twister = 1
/mob/living/simple_animal/hostile/asteroid/wasp/mosquito = 10,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/skin_twister = 1
)
fauna_density = 0.8
this_area = /area/jungleland/dying_forest
/**
* Jungle
*/
/datum/biome/jungleland/jungle
turf_type = /turf/open/floor/plating/dirt/jungleland/jungle
closed_turf = /turf/open/floor/plating/dirt/jungleland/jungle
@@ -187,11 +214,11 @@
loose_flora_density = 60
fauna_types = list(
/mob/living/simple_animal/hostile/yog_jungle/dryad = 65,
/mob/living/simple_animal/hostile/yog_jungle/emeraldspider = 15,
/mob/living/simple_animal/hostile/yog_jungle/mosquito = 10,
/mob/living/simple_animal/hostile/yog_jungle/yellowjacket = 10,
/mob/living/simple_animal/hostile/yog_jungle/skin_twister = 1,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/dryad = 65,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/emeraldspider = 15,
/mob/living/simple_animal/hostile/asteroid/wasp/mosquito = 10,
/mob/living/simple_animal/hostile/asteroid/wasp/yellowjacket = 10,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/skin_twister = 1,
)
fauna_density = 0.65
this_area = /area/jungleland/proper

View File

@@ -1,17 +1,21 @@
/mob/living/simple_animal/hostile/yog_jungle/alpha
gold_core_spawnable = FALSE
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha
gold_core_spawnable = NO_SPAWN
sentience_type = SENTIENCE_BOSS
mob_biotypes = MOB_BEAST | MOB_ORGANIC
/mob/living/simple_animal/hostile/yog_jungle/alpha/death(gibbed)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/death(gibbed)
new /obj/structure/closet/crate/necropolis/tendril(loc)
return ..()
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_meduracha
////////////////////////////////////////////////////////////////////////////////////
//----------------------------------Big squiggle----------------------------------//
////////////////////////////////////////////////////////////////////////////////////
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_meduracha
name ="Meduracha majora"
desc = "Collosal beast of tentacles, its deep eye looks directly at you."
desc = "Colossal mass of tentacles, its deep eye looks directly at you."
icon_state = "alpha_meduracha"
icon_living = "alpha_meduracha"
icon_dead = "alpha_meduracha_dead"
mob_biotypes = list(MOB_BEAST,MOB_ORGANIC)
speak = list("hgrah!","blrp!","poasp!","ahkr!")
speak_emote = list("bubbles", "vibrates")
emote_hear = list("gazes.","bellows.","splashes.")
@@ -20,29 +24,24 @@
taunt_chance = 1
move_to_delay = 7
butcher_results = list(/obj/item/stack/sheet/meduracha = 5, /obj/item/gem/emerald = 2)
faction = list("mining")
response_help = "gently pokes"
response_disarm = "gently pushes aside"
response_harm = "hits"
maxHealth = 300
health = 300
spacewalk = TRUE
crusher_loot = /obj/item/crusher_trophy/jungleland/meduracha_tentacles
melee_damage_lower = 20
melee_damage_lower = 25
melee_damage_upper = 25
ranged = TRUE
ranged_cooldown = 5 SECONDS
projectiletype = /obj/projectile/jungle/meduracha_spit
sentience_type = SENTIENCE_BOSS
var/list/anchors = list("SOUTH" = null, "NORTH" = null, "EAST" = null, "WEST" = null)
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_meduracha/Initialize()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_meduracha/Initialize()
. = ..()
for(var/side in anchors)
anchors[side] = get_beam()
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_meduracha/Move(atom/newloc, dir, step_x, step_y)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_meduracha/Move(atom/newloc, dir, step_x, step_y)
for(var/direction in list("NORTH","SOUTH","EAST","WEST"))
var/datum/beam/B = anchors[direction]
if(!B || QDELETED(B))
@@ -52,7 +51,7 @@
remake_beam(direction)
. = ..()
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_meduracha/Shoot(atom/targeted_atom)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_meduracha/Shoot(atom/targeted_atom)
. = ..()
var/angle = Get_Angle(src,targeted_atom)
var/list/to_shoot = list()
@@ -63,7 +62,7 @@
for(var/turf/T as anything in to_shoot)
shoot_projectile(T)
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_meduracha/proc/shoot_projectile(atom/targeted_atom)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_meduracha/proc/shoot_projectile(atom/targeted_atom)
var/turf/startloc = get_turf(src)
var/obj/projectile/P = new projectiletype(startloc)
playsound(src, projectilesound, 100, 1)
@@ -78,24 +77,26 @@
P.preparePixelProjectile(targeted_atom, src)
P.fire()
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_meduracha/proc/get_beam()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_meduracha/proc/get_beam()
var/list/turfs = spiral_range_turfs(4,src)
var/turf/T = pick(turfs)
return Beam(T,"meduracha",'yogstation/icons/effects/beam.dmi',INFINITY,8)
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_meduracha/proc/remake_beam(side)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_meduracha/proc/remake_beam(side)
var/datum/beam/B = anchors[side]
anchors[side] = get_beam()
qdel(B)
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_blobby
////////////////////////////////////////////////////////////////////////////////////
//----------------------------------Big blob--------------------------------------//
////////////////////////////////////////////////////////////////////////////////////
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_blobby
name = "Gelatinous Giant"
desc = "A gelatinous creature of the swampy regions of the jungle. It's a big blob of goo, and it's not very friendly."
icon = 'yogstation/icons/mob/jungle64x64.dmi'
icon_state = "big_blob"
icon_living = "big_blob"
icon_dead = "big_blob_dead"
mob_biotypes = list(MOB_BEAST,MOB_ORGANIC)
speak = list("brbl","bop","pop","blsp")
speak_emote = list("bops", "pops")
emote_hear = list("vibrates.","listens.","hears.")
@@ -103,9 +104,6 @@
speak_chance = 1
taunt_chance = 1
turns_per_move = 1
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
faction = list("mining")
maxHealth = 400
health = 400
@@ -114,23 +112,24 @@
pixel_y = -16
move_to_delay = 5
loot = list(/obj/item/stack/sheet/slime = 10, /obj/item/gem/emerald = 2)
melee_damage_lower = 30
melee_damage_lower = 40
melee_damage_upper = 40
crusher_loot = /obj/item/crusher_trophy/jungleland/blob_brain
sentience_type = SENTIENCE_BOSS
/// Increments up as splits happen, used to shrink the mob
var/stage = 1
/// How much health needs to be lost to split off new blobs
var/stage_threshold = 100 //every 100 health lost, split off
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_blobby/attacked_by(obj/item/I, mob/living/user)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_blobby/attacked_by(obj/item/I, mob/living/user)
. = ..()
if((stage == 1 && health <= 300) || (stage == 2 && health <= 200) || (stage == 3 && health <= 100))
if(stage < (maxHealth/stage_threshold - health/stage_threshold) + 1)
increment_stage()
return
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_blobby/proc/increment_stage()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_blobby/proc/increment_stage()
if(!target)
return
var/mob/living/simple_animal/hostile/A = new /mob/living/simple_animal/hostile/yog_jungle/blobby(get_step(src,turn(get_dir(src,target),90)),4 - stage)
var/mob/living/simple_animal/hostile/B = new /mob/living/simple_animal/hostile/yog_jungle/blobby(get_step(src,turn(get_dir(src,target),-90)),4 - stage)
var/mob/living/simple_animal/hostile/A = new /mob/living/simple_animal/hostile/asteroid/yog_jungle/blobby(get_step(src,turn(get_dir(src,target),90)), 4 - stage)
var/mob/living/simple_animal/hostile/B = new /mob/living/simple_animal/hostile/asteroid/yog_jungle/blobby(get_step(src,turn(get_dir(src,target),-90)), 4 - stage)
A.PickTarget(list(target))
B.PickTarget(list(target))
stage++
@@ -138,66 +137,68 @@
M.Scale(1/stage)
transform = M
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_dryad
////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------Big trees------------------------------------//
////////////////////////////////////////////////////////////////////////////////////
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_dryad
name ="Wrath of Gaia"
desc = "Collosal tree inhabited by all the furious spirits of the jungle."
desc = "Colossal tree inhabited by all the furious spirits of the jungle."
icon = 'yogstation/icons/mob/jungle96x96.dmi'
icon_state = "wrath_of_gaia"
icon_living = "wrath_of_gaia"
icon_dead = "wrath_of_gaia_dead"
mob_biotypes = list(MOB_BEAST,MOB_ORGANIC)
faction = list("mining")
response_help = "gently pokes"
response_disarm = "gently pushes aside"
response_harm = "hits"
maxHealth = 500
health = 500
crusher_loot = /obj/item/crusher_trophy/jungleland/dryad_branch
loot = list(/obj/item/organ/regenerative_core/dryad = 5, /obj/item/gem/emerald = 2)
melee_damage_lower = 20
melee_damage_upper = 25
crusher_loot = /obj/item/crusher_trophy/jungleland/dryad_branch
melee_damage_lower = 0
melee_damage_upper = 0
minimum_distance = 5
ranged = TRUE
ranged_cooldown = 20 SECONDS
move_to_delay = 10
pixel_x = -32
sentience_type = SENTIENCE_BOSS
var/list/spawnables = list(/mob/living/simple_animal/hostile/yog_jungle/dryad,/mob/living/simple_animal/hostile/yog_jungle/meduracha, /mob/living/simple_animal/hostile/yog_jungle/yellowjacket,/mob/living/simple_animal/hostile/yog_jungle/emeraldspider)
projectiletype = /obj/projectile/jungle/damage_orb
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_dryad/OpenFire(atom/A)
. = ..()
for(var/i in 0 to rand(1,3))
var/to_spawn = pick(spawnables)
var/max_spawn = 3
var/list/spawnables = list(
/mob/living/simple_animal/hostile/asteroid/yog_jungle/dryad = 4,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/meduracha = 2,
/mob/living/simple_animal/hostile/asteroid/wasp/yellowjacket = 2,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/emeraldspider = 2,
/mob/living/simple_animal/hostile/asteroid/yog_jungle/blobby = 2,
/mob/living/simple_animal/hostile/asteroid/wasp/mosquito = 2
)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_dryad/Shoot(atom/targeted_atom)
playsound(src, 'sound/magic/clockwork/narsie_attack.ogg', 80, 1)
addtimer(CALLBACK(src, PROC_REF(finish_shoot), targeted_atom), 1 SECONDS) //give it a slight telegraph before doing the attack
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_dryad/proc/finish_shoot(atom/targeted_atom)
for(var/i in 1 to rand(1, max_spawn))
var/to_spawn = pickweight(spawnables)
var/mob/living/simple_animal/hostile/spawned = new to_spawn(get_step(src,pick(GLOB.cardinals)))
spawned.PickTarget(A)
spawned.PickTarget(targeted_atom)
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_corrupted_dryad
/**
* Corrupted version also shoots, but spawns less enemies and mostly spawns corrupted dryads
*/
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_dryad/corrupted
name ="Wrath of Corruption"
desc = "Collosal tree that used to be a home of the dryads. Now it serves as a weapon of corruption, spreading it's destruction wherever it goes."
icon = 'yogstation/icons/mob/jungle96x96.dmi'
desc = "Colossal tree that used to be a home to the dryads. Now it serves as a weapon of corruption, spreading it's destruction wherever it goes."
icon_state = "wrath_of_corruption"
icon_living = "wrath_of_corruption"
icon_dead = "wrath_of_corruption_dead"
mob_biotypes = list(MOB_BEAST,MOB_ORGANIC)
faction = list("mining")
response_help = "gently pokes"
response_disarm = "gently pushes aside"
response_harm = "hits"
maxHealth = 500
health = 500
crusher_loot = /obj/item/crusher_trophy/jungleland/corrupted_dryad_branch
loot = list(/obj/item/organ/regenerative_core/dryad/corrupted = 5, /obj/item/gem/emerald = 2)
melee_damage_lower = 20
melee_damage_upper = 25
ranged = TRUE
ranged_cooldown = 17.5 SECONDS
move_to_delay = 10
pixel_x = -32
projectiletype = /obj/projectile/jungle/damage_orb
sentience_type = SENTIENCE_BOSS
crusher_loot = /obj/item/crusher_trophy/jungleland/corrupted_dryad_branch
var/list/spawnables = list(/mob/living/simple_animal/hostile/yog_jungle/skin_twister,/mob/living/simple_animal/hostile/yog_jungle/blobby,/mob/living/simple_animal/hostile/yog_jungle/corrupted_dryad)
max_spawn = 2
spawnables = list(
/mob/living/simple_animal/hostile/asteroid/yog_jungle/corrupted_dryad = 20
)
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_corrupted_dryad/Shoot(atom/targeted_atom)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_dryad/corrupted/finish_shoot(atom/targeted_atom)
. = ..()
var/angle = Get_Angle(src,targeted_atom)
var/list/to_shoot = list()
@@ -209,13 +210,8 @@
for(var/turf/T as anything in to_shoot)
shoot_projectile(T)
for(var/i in 0 to rand(1,3))
var/to_spawn = pick(spawnables)
var/mob/living/simple_animal/hostile/spawned = new to_spawn(get_step(src,pick(GLOB.cardinals)))
spawned.faction = faction
spawned.PickTarget(targeted_atom)
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_corrupted_dryad/proc/shoot_projectile(atom/targeted_atom)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_dryad/corrupted/proc/shoot_projectile(atom/targeted_atom)
var/turf/startloc = get_turf(src)
var/obj/projectile/P = new projectiletype(startloc)
playsound(src, projectilesound, 100, 1)
@@ -230,106 +226,12 @@
P.preparePixelProjectile(targeted_atom, src)
P.fire()
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_mosquito
name ="Mosquito Patriarch"
desc = "A collosoal blood sucking mosquito, it is very angry."
icon = 'yogstation/icons/mob/jungle64x64.dmi'
icon_state = "mosquito"
icon_living = "mosquito"
icon_dead = "mosquito_dead"
mob_biotypes = list(MOB_BEAST,MOB_ORGANIC)
faction = list("mining")
response_help = "gently pokes"
response_disarm = "gently pushes aside"
response_harm = "hits"
maxHealth = 350
health = 350
crusher_loot = /obj/item/crusher_trophy/jungleland/corrupted_dryad_branch
butcher_results = list(/obj/item/stinger = 1, /obj/item/stack/sheet/animalhide/weaver_chitin = 2, /obj/item/stack/sheet/sinew = 4, /obj/item/gem/ruby = 2)
melee_damage_lower = 15
melee_damage_upper = 25
pixel_x = -16
pixel_y = -16
sentience_type = SENTIENCE_BOSS
var/can_charge = TRUE
var/cooldown = 5 SECONDS
var/charge_ramp_up = 1 SECONDS
var/charging = FALSE
var/has_blood = FALSE
var/overshoot_dist = 5
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_mosquito/Aggro()
. = ..()
prepare_charge()
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_mosquito/Goto(target, delay, minimum_distance)
if (iscarbon(target) && get_dist(src,target) > 4 && get_charge())
prepare_charge()
return
if(!charging)
return ..()
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_mosquito/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
charging = FALSE
if(!ishuman(hit_atom))
animate(src,color = initial(color),time = charge_ramp_up/2)
return
var/mob/living/carbon/human/humie = hit_atom
humie.blood_volume -= 15 // ouch!
var/malaria_chance = 150 - humie.getarmor(null,BIO) // NEVER 100 PERCENT
if(prob(malaria_chance * 0.5))
var/datum/disease/malaria/infection = new()
humie.ForceContractDisease(infection,FALSE,TRUE)
has_blood = TRUE
rapid_melee = TRUE
melee_damage_lower = 30
melee_damage_upper = 50
icon_state = "mosquito_blood"
animate(src,color = initial(color),time = charge_ramp_up*2)
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_mosquito/proc/prepare_charge()
if(!get_charge())
return FALSE
var/dir = Get_Angle(src.loc,target.loc)
//i actually fucking hate this utility function, for whatever reason Get_Angle returns the angle assuming that [0;-1] is 0 degrees rather than [1;0] like any sane being.
var/tx = clamp(0,round(target.loc.x + sin(dir) * overshoot_dist),255)
var/ty = clamp(0,round(target.loc.y + cos(dir) * overshoot_dist),255)
var/turf/found_turf = locate(tx,ty,loc.z)
if(found_turf == null)
return FALSE
var/dist = get_dist(src,found_turf)
charging = TRUE
animate(src,color = rgb(163, 0, 0),time = charge_ramp_up)
sleep(charge_ramp_up)
if(stat == DEAD)
animate(src,color = initial(color),time = charge_ramp_up)
return
throw_at(found_turf,dist + overshoot_dist,4,spin = FALSE)
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_mosquito/proc/reset_charge()
can_charge = TRUE
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_mosquito/proc/use_charge()
can_charge = FALSE
addtimer(CALLBACK(src,PROC_REF(reset_charge)),cooldown,TIMER_UNIQUE)
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_mosquito/proc/get_charge()
return can_charge
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_yellowjacket
////////////////////////////////////////////////////////////////////////////////////
//------------------------------------Big wasp------------------------------------//
////////////////////////////////////////////////////////////////////////////////////
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_yellowjacket
name = "yellow jacket matriarch"
desc = "A large and aggressive creature with a massive stinger. It is very angry."
desc = "A large and aggressive creature with a massive stinger, it looks very angry."
icon = 'yogstation/icons/mob/jungle64x64.dmi'
icon_state = "wasp"
icon_living = "wasp"
@@ -338,14 +240,13 @@
move_to_delay = 5
movement_type = FLYING
ranged = 1
ranged_cooldown_time = 120
ranged_cooldown_time = 12 SECONDS
speak_emote = list("buzzes")
vision_range = 5
aggro_vision_range = 9
see_in_dark = 7
speed = 2
maxHealth = 320
health = 320
maxHealth = 280
health = 280
environment_smash = ENVIRONMENT_SMASH_NONE //held off by walls and windows, stupid oversized bee
melee_damage_lower = 10 //not that lethal, but it'll catch up to you easily
melee_damage_upper = 10
@@ -357,20 +258,20 @@
crusher_loot = /obj/item/crusher_trophy/jungleland/wasp_head
pixel_x = -16
pixel_y = -16
sentience_type = SENTIENCE_BOSS
var/dash_speed = 1
var/charging = FALSE
var/revving_charge = FALSE
var/poison_type = /datum/reagent/toxin/concentrated
var/poison_per_attack = 7.5
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_yellowjacket/AttackingTarget()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_yellowjacket/AttackingTarget()
..()
if(isliving(target))
var/mob/living/L = target
if(target.reagents)
L.reagents.add_reagent(poison_type, poison_per_attack)
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_yellowjacket/OpenFire()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_yellowjacket/OpenFire()
if(charging)
return
var/tturf = get_turf(target)
@@ -380,10 +281,10 @@
charge()
ranged_cooldown = world.time + ranged_cooldown_time
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_yellowjacket/Aggro()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_yellowjacket/Aggro()
vision_range = aggro_vision_range
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_yellowjacket/proc/charge(atom/chargeat = target, delay = 4)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_yellowjacket/proc/charge(atom/chargeat = target, delay = 4)
if(!chargeat)
return
var/chargeturf = get_turf(chargeat)
@@ -400,16 +301,58 @@
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_towards(src, T, dash_speed)
SLEEP_CHECK_DEATH(get_dist(src, T) * dash_speed)
walk(src, 0) // cancel the movement
release_guards()
charging = FALSE
/mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_yellowjacket/Move()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_yellowjacket/Move()
if(revving_charge)
return FALSE
if(charging)
DestroySurroundings() //"Fred, were you feeding steroids to the wasp again?"
..()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_yellowjacket/proc/release_guards()
new /mob/living/simple_animal/hostile/asteroid/wasp/yellowjacket(get_turf(src))
////////////////////////////////////////////////////////////////////////////////////
//----------------------------------Big mosquito----------------------------------//
////////////////////////////////////////////////////////////////////////////////////
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_yellowjacket/mosquito
name ="Mosquito Patriarch"
desc = "A colossal blood sucking mosquito, it looks very angry."
icon = 'yogstation/icons/mob/jungle64x64.dmi'
icon_state = "mosquito"
icon_living = "mosquito"
icon_dead = "mosquito_dead"
maxHealth = 350
health = 350
move_to_delay = 4
ranged_cooldown_time = 3 SECONDS //constantly dashes
crusher_loot = /obj/item/crusher_trophy/jungleland/corrupted_dryad_branch
butcher_results = list(/obj/item/stinger = 1, /obj/item/stack/sheet/animalhide/weaver_chitin = 2, /obj/item/stack/sheet/sinew = 4, /obj/item/gem/ruby = 2)
melee_damage_lower = 35
melee_damage_upper = 35
pixel_x = -16
pixel_y = -16
dash_speed = 0.8
poison_per_attack = 0
attack_sound = null
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_yellowjacket/mosquito/AttackingTarget()
..()
if(!ishuman(target))
return
var/mob/living/carbon/human/humie = target
humie.blood_volume -= 15 // ouch!
var/malaria_chance = 150 - humie.getarmor(null,BIO) // NEVER 100 PERCENT
if(prob(malaria_chance * 0.5))
var/datum/disease/malaria/infection = new()
humie.ForceContractDisease(infection,FALSE,TRUE)
icon_state = "mosquito_blood"
/mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_yellowjacket/mosquito/release_guards()
return //no guards, mosquitos are spiteful creatures

View File

@@ -16,7 +16,7 @@
icon_living = "tar_king"
icon = 'yogstation/icons/mob/jungle64x64.dmi'
health_doll_icon = "tar_king"
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mob_biotypes = (MOB_ORGANIC | MOB_HUMANOID)
light_color = "#dd35d5"
combat_mode = TRUE
melee_damage_lower = 40

View File

@@ -1,36 +1,19 @@
/mob/living/simple_animal/hostile/yog_jungle //yog_jungle and not just jungle because TG has some mobs under /jungle/ that i dont want to fuck with and override (they are unused, but like whats the point..)
/mob/living/simple_animal/hostile/asteroid/yog_jungle //yog_jungle and not just jungle because TG has some mobs under /jungle/ that i dont want to fuck with and override (they are unused, but like whats the point..)
icon = 'yogstation/icons/mob/jungle.dmi'
stat_attack = UNCONSCIOUS
weather_immunities = WEATHER_STORM
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)
faction = list("mining", "skintwister_cloak")
see_in_dark = 3
mob_biotypes = MOB_BEAST | MOB_ORGANIC
vision_range = 4
minbodytemp = 0
maxbodytemp = INFINITY
pressure_resistance = 100
mob_size = MOB_SIZE_LARGE
var/alpha_damage_boost = 1 //if a mob has really high damage it may be unfair to boost it further when making an alpha version.
var/crusher_loot
var/alpha_type = 0
/mob/living/simple_animal/hostile/yog_jungle/attacked_by(obj/item/I, mob/living/user)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/attacked_by(obj/item/I, mob/living/user)
if(stat == CONSCIOUS && AIStatus != AI_OFF && !client && user)
ADD_TRAIT(user,TRAIT_ENEMY_OF_THE_FOREST,JUNGLELAND_TRAIT)
return ..()
/mob/living/simple_animal/hostile/yog_jungle/death(gibbed)
var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
if(C && crusher_loot && C.total_damage >= maxHealth * 0.6 && crusher_loot)
loot += crusher_loot
. = ..()
/mob/living/simple_animal/hostile/yog_jungle/dryad
/mob/living/simple_animal/hostile/asteroid/yog_jungle/dryad
name = "Jungle spirit"
desc = "A spirit of the jungle, protector of the forest, heals the ones in need, and butchers the ones that plauge the forest."
icon_state = "dryad"
icon_living = "dryad"
icon_dead = "dryad_dead"
mob_biotypes = list(MOB_BEAST,MOB_ORGANIC)
speak = list("eak!","sheik!","ahik!","keish!")
speak_emote = list("shimmers", "vibrates")
emote_hear = list("vibes.","sings.","shimmers.")
@@ -38,7 +21,6 @@
speak_chance = 1
taunt_chance = 1
turns_per_move = 1
butcher_results = list()
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
@@ -51,11 +33,11 @@
retreat_distance = 1
minimum_distance = 3
projectiletype = /obj/projectile/jungle/damage_orb
alpha_type = /mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_dryad
alpha_type = /mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_dryad
var/alt_projectiletype = /obj/projectile/jungle/heal_orb
var/alt_cooldown_time = 10 SECONDS
/mob/living/simple_animal/hostile/yog_jungle/dryad/Shoot(atom/targeted_atom)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/dryad/Shoot(atom/targeted_atom)
if(HAS_TRAIT(targeted_atom,TRAIT_ENEMY_OF_THE_FOREST))
projectiletype = initial(projectiletype)
ranged_cooldown_time = alt_cooldown_time
@@ -64,13 +46,12 @@
ranged_cooldown_time = initial(ranged_cooldown_time)
return ..()
/mob/living/simple_animal/hostile/yog_jungle/corrupted_dryad
/mob/living/simple_animal/hostile/asteroid/yog_jungle/corrupted_dryad
name = "Cursed jungle spirit"
desc = "A spirit of the jungle, once a protector, but now corrupted by forced beyond this world. It's essence it's twisted and it will attack everyone in sight"
icon_state = "corrupted_dryad"
icon_living = "corrupted_dryad"
icon_dead = "corrupted_dryad_dead"
mob_biotypes = list(MOB_BEAST,MOB_ORGANIC)
speak = list("eak!","sheik!","ahik!","keish!")
speak_emote = list("shimmers", "vibrates")
emote_hear = list("vibes.","sings.","shimmers.")
@@ -90,15 +71,14 @@
retreat_distance = 1
minimum_distance = 3
projectiletype = /obj/projectile/jungle/damage_orb
alpha_type = /mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_corrupted_dryad
alpha_type = /mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_dryad/corrupted
/mob/living/simple_animal/hostile/yog_jungle/meduracha
/mob/living/simple_animal/hostile/asteroid/yog_jungle/meduracha
name ="Meduracha aquatica"
desc = "A predator of the toxic swamps, it's long tendrils cause very fast toxic buildup that after a while will cause varying degrees of incapacitation"
icon_state = "meduracha"
icon_living = "meduracha"
icon_dead = "meduracha_dead"
mob_biotypes = list(MOB_BEAST,MOB_ORGANIC)
speak = list("hgrah!","blrp!","poasp!","ahkr!")
speak_emote = list("bubbles", "vibrates")
emote_hear = list("gazes.","bellows.","splashes.")
@@ -119,15 +99,15 @@
rapid_melee = 3
alpha_type = /mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_meduracha
alpha_type = /mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_meduracha
var/sulking = FALSE
/mob/living/simple_animal/hostile/yog_jungle/meduracha/Initialize()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/meduracha/Initialize()
. = ..()
RegisterSignal(src,COMSIG_MOVABLE_MOVED,PROC_REF(on_sulking))
/mob/living/simple_animal/hostile/yog_jungle/meduracha/AttackingTarget()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/meduracha/AttackingTarget()
. = ..()
update_sulking(FALSE)
if(!ishuman(target))
@@ -137,20 +117,20 @@
if(prob(max(10,chance * 0.66))) // higher chance than toxic water
humie.reagents.add_reagent(/datum/reagent/toxic_metabolites,2.5)
/mob/living/simple_animal/hostile/yog_jungle/meduracha/Goto(target, delay, minimum_distance)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/meduracha/Goto(target, delay, minimum_distance)
update_sulking(TRUE)
return ..()
/mob/living/simple_animal/hostile/yog_jungle/meduracha/LoseAggro()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/meduracha/LoseAggro()
update_sulking(TRUE)
return ..()
/mob/living/simple_animal/hostile/yog_jungle/meduracha/proc/update_sulking(bool)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/meduracha/proc/update_sulking(bool)
sulking = bool
on_sulking()
/mob/living/simple_animal/hostile/yog_jungle/meduracha/proc/on_sulking()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/meduracha/proc/on_sulking()
if(stat != CONSCIOUS)
return
if(istype(loc,/turf/open/water) && sulking)
@@ -160,13 +140,18 @@
move_to_delay = 3
icon_state = "meduracha"
/mob/living/simple_animal/hostile/yog_jungle/skin_twister
////////////////////////////////////////////////////////////////////////////////////
//--------------------------------Skin twister------------------------------------//
////////////////////////////////////////////////////////////////////////////////////
/**
* Disguises as a killed player, calling for help over comms to trick people into getting killed too
*/
/mob/living/simple_animal/hostile/asteroid/yog_jungle/skin_twister
name = "Skin twister"
desc = "The apex predator of this planet, kills everything and then steals the victim's skin, allowing it to lure it's prey and kill them with ease"
icon_state = "skin_twister"
icon_living = "skin_twister"
icon_dead = "skin_twister_dead"
mob_biotypes = list(MOB_BEAST,MOB_ORGANIC)
speak = list("AGRH!","SAGH!","REAAH!","REEIK!")
speak_emote = list("roars", "howls")
emote_hear = list("stalks.","listens.","hears.")
@@ -182,10 +167,9 @@
health = 285
spacewalk = TRUE
melee_damage_lower = 30
melee_damage_upper = 55 // ouch
melee_damage_upper = 30
rapid_melee = 2
butcher_results = list(/obj/item/stack/sheet/skin_twister = 2,/obj/item/stack/sheet/bone = 3, /obj/item/stack/sheet/sinew = 2)
alpha_damage_boost = 0 // 30-55 damage is too much to be boosts by 50%
move_force = MOVE_FORCE_VERY_STRONG
move_resist = MOVE_FORCE_VERY_STRONG
pull_force = MOVE_FORCE_VERY_STRONG
@@ -193,7 +177,7 @@
var/obj/item/encryptionkey/lure_encryption_key
var/victim_ref
/mob/living/simple_animal/hostile/yog_jungle/skin_twister/AttackingTarget()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/skin_twister/AttackingTarget()
. = ..()
if(victim_ref)
reveal_true_form()
@@ -203,7 +187,7 @@
if(!QDELETED(living_target) && living_target.stat > UNCONSCIOUS) //Unconcious or dead
steal_identity(living_target)
/mob/living/simple_animal/hostile/yog_jungle/skin_twister/Life()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/skin_twister/Life()
. = ..()
if(!.) //dead
return
@@ -211,7 +195,7 @@
if(human_lure && prob(5))
lure()
/mob/living/simple_animal/hostile/yog_jungle/skin_twister/proc/steal_identity(mob/living/victim)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/skin_twister/proc/steal_identity(mob/living/victim)
new /obj/effect/better_animated_temp_visual/skin_twister_in(get_turf(src))
name = victim.name
@@ -238,9 +222,9 @@
lure_encryption_key = headphones.keyslot
else
fully_heal()
faction = list("mining")
faction |= "mining"
/mob/living/simple_animal/hostile/yog_jungle/skin_twister/proc/reveal_true_form()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/skin_twister/proc/reveal_true_form()
new /obj/effect/better_animated_temp_visual/skin_twister_out(get_turf(src))
name = initial(name)
desc = initial(desc)
@@ -252,10 +236,10 @@
speak_chance = initial(speak_chance)
taunt_chance = initial(taunt_chance)
human_lure = FALSE
faction = list("skin_walkers")
faction -= "mining"
/mob/living/simple_animal/hostile/yog_jungle/skin_twister/proc/pick_lure()
var/mob/living/picked = pick(subtypesof(/mob/living/simple_animal/hostile/yog_jungle))
/mob/living/simple_animal/hostile/asteroid/yog_jungle/skin_twister/proc/pick_lure()
var/mob/living/picked = pick(subtypesof(/mob/living/simple_animal/hostile/asteroid/yog_jungle))
return pick(list("Help me!", "I'm stuck!", "Come quickly, I'm close to death!", "I'm dying!", "I won't make it unless someone comes here!", "Please don't leave me!",
"I'm so close to base!", "These fucking beasts got me", "I'm out of pens", "I'm running out of blood", "Please, I beg you", "I walked into the fucking water",
"[initial(picked.name)] nearly killed me, but I'm gonna bleed out", "Damned fauna", "Why fucking again?", "I have so many mats",
@@ -263,7 +247,7 @@
"HELP", "MINING", "MINING BASE",
"If someone finds my body take the loot [pick("mango", "alpha", "delta", "beta", "omega" , "olive", "tango", "fiesta", "carp")] [rand(0,9)][rand(0,9)][rand(0,9)]", "HELP [pick(generate_code_phrase(TRUE))]"))
/mob/living/simple_animal/hostile/yog_jungle/skin_twister/proc/lure()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/skin_twister/proc/lure()
if(!human_lure)
return
@@ -278,21 +262,25 @@
say(lure)
/mob/living/simple_animal/hostile/yog_jungle/skin_twister/death(gibbed)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/skin_twister/death(gibbed)
move_force = MOVE_FORCE_DEFAULT
move_resist = MOVE_RESIST_DEFAULT
pull_force = PULL_FORCE_DEFAULT
reveal_true_form()
return ..(gibbed)
/mob/living/simple_animal/hostile/yog_jungle/blobby
////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------Blobby---------------------------------------//
////////////////////////////////////////////////////////////////////////////////////
/**
* Splits upon death, summoning two smaller versions of itself
*/
/mob/living/simple_animal/hostile/asteroid/yog_jungle/blobby
name = "Blobby"
desc = "A gelatinous creature of the swampy regions of the jungle. It's a big blob of goo, and it's not very friendly."
icon_state = "blobby"
icon_living = "blobby"
icon_dead = "blobby_dead"
mob_biotypes = list(MOB_BEAST,MOB_ORGANIC)
speak = list("brbl","bop","pop","blsp")
speak_emote = list("bops", "pops")
emote_hear = list("vibrates.","listens.","hears.")
@@ -308,17 +296,17 @@
health = 120
spacewalk = TRUE
loot = list(/obj/item/stack/sheet/slime)
melee_damage_lower = 4
melee_damage_upper = 6
melee_damage_lower = 5
melee_damage_upper = 5
alpha_type = /mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_blobby
alpha_type = /mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_blobby
var/current_size = 3
/mob/living/simple_animal/hostile/yog_jungle/blobby/Initialize(mapload,spawned_size = 3)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/blobby/Initialize(mapload,spawned_size = 3)
. = ..()
current_size = spawned_size > 0 ? spawned_size : current_size
current_size = clamp(spawned_size, 1, current_size)
melee_damage_lower = melee_damage_lower * current_size
melee_damage_upper = melee_damage_upper * current_size
var/matrix/M = new
@@ -327,7 +315,7 @@
maxHealth = maxHealth * (current_size/3)
health = health * (current_size/3)
/mob/living/simple_animal/hostile/yog_jungle/blobby/death(gibbed)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/blobby/death(gibbed)
if(current_size > 1 && !gibbed)
del_on_death = TRUE
var/list/possible_spawns = list()
@@ -335,207 +323,77 @@
if(isclosedturf(T))
continue
possible_spawns += T
var/mob/living/simple_animal/hostile/A = new /mob/living/simple_animal/hostile/yog_jungle/blobby(pick(possible_spawns),current_size - 1)
var/mob/living/simple_animal/hostile/B = new /mob/living/simple_animal/hostile/yog_jungle/blobby(pick(possible_spawns),current_size - 1)
var/mob/living/simple_animal/hostile/A = new /mob/living/simple_animal/hostile/asteroid/yog_jungle/blobby(pick(possible_spawns),current_size - 1)
var/mob/living/simple_animal/hostile/B = new /mob/living/simple_animal/hostile/asteroid/yog_jungle/blobby(pick(possible_spawns),current_size - 1)
if(target)
A.FindTarget(list(target))
B.FindTarget(list(target))
return ..()
/mob/living/simple_animal/hostile/yog_jungle/mosquito
////////////////////////////////////////////////////////////////////////////////////
//------------------------------------Wasps---------------------------------------//
////////////////////////////////////////////////////////////////////////////////////
/**
* jungle version of the wasp. Slightly weaker and faster, with different loot. Renamed to avoid confusion. Credit to original creator.
*/
/mob/living/simple_animal/hostile/asteroid/wasp/yellowjacket
name = "yellow jacket"
desc = "A large and aggressive creature with a massive stinger."
move_to_delay = 6
maxHealth = 160
health = 160
butcher_results = list(/obj/item/stinger = 1,/obj/item/stack/sheet/animalhide/weaver_chitin = 1, /obj/item/stack/sheet/sinew = 1, /obj/item/stack/sheet/bone = 1)
alpha_type = /mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_yellowjacket
//the same thing, but with malaria instead of toxins
/mob/living/simple_animal/hostile/asteroid/wasp/mosquito
name = "Giant Mosquito"
desc = "Massively overgrown bug, how did it get so big?"
icon = 'yogstation/icons/mob/jungle.dmi'
icon_state = "mosquito"
icon_living = "mosquito"
icon_dead = "mosquito_dead"
mob_biotypes = list(MOB_BEAST,MOB_ORGANIC)
speak = list("bzzzzz")
speak_emote = list("buzzes")
emote_hear = list("buzzes")
emote_taunt = list("buzzes")
speak_chance = 0
taunt_chance = 0
turns_per_move = 0
butcher_results = list(/obj/item/stinger = 1,/obj/item/stack/sheet/animalhide/weaver_chitin = 1, /obj/item/stack/sheet/sinew = 2)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
maxHealth = 60
maxHealth = 60 //swat it once and it dies
health = 60
melee_damage_lower = 20 //hits harder
melee_damage_upper = 20
move_to_delay = 4 //moves faster
turns_per_move = 0
ranged_cooldown_time = 3 SECONDS //dashes faster
butcher_results = list(/obj/item/stinger = 1,/obj/item/stack/sheet/animalhide/weaver_chitin = 1, /obj/item/stack/sheet/sinew = 2)
spacewalk = TRUE
melee_damage_lower = 10
melee_damage_upper = 40
alpha_type = /mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_mosquito
move_to_delay = 5
var/can_charge = TRUE
var/cooldown = 15 SECONDS
var/charge_ramp_up = 2 SECONDS
var/charging = FALSE
alpha_type = /mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_yellowjacket/mosquito
poison_per_attack = 0
dash_speed = 0.8
attack_sound = null
var/has_blood = FALSE
var/overshoot_dist = 5
/mob/living/simple_animal/hostile/yog_jungle/mosquito/Aggro()
. = ..()
prepare_charge()
/mob/living/simple_animal/hostile/yog_jungle/mosquito/Goto(target, delay, minimum_distance)
if (iscarbon(target) && get_dist(src,target) > 4 && get_charge())
prepare_charge()
/mob/living/simple_animal/hostile/asteroid/wasp/mosquito/AttackingTarget()
..()
if(!ishuman(target))
return
if(!charging)
return ..()
/mob/living/simple_animal/hostile/yog_jungle/mosquito/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
charging = FALSE
if(!ishuman(hit_atom))
animate(src,color = initial(color),time = charge_ramp_up/2)
return
var/mob/living/carbon/human/humie = hit_atom
var/mob/living/carbon/human/humie = target
humie.blood_volume -= 10 // ouch!
var/malaria_chance = 125 - humie.getarmor(null,BIO)
if(prob(malaria_chance * 0.25))
var/datum/disease/malaria/infection = new()
humie.ForceContractDisease(infection,FALSE,TRUE)
has_blood = TRUE
rapid_melee = TRUE
melee_damage_lower = 30
melee_damage_upper = 50
icon_state = "mosquito_blood"
animate(src,color = initial(color),time = charge_ramp_up*2)
/mob/living/simple_animal/hostile/yog_jungle/mosquito/proc/prepare_charge()
if(!get_charge())
return FALSE
var/dir = Get_Angle(src.loc,target.loc)
//i actually fucking hate this utility function, for whatever reason Get_Angle returns the angle assuming that [0;-1] is 0 degrees rather than [1;0] like any sane being.
var/tx = clamp(0,round(target.loc.x + sin(dir) * overshoot_dist),255)
var/ty = clamp(0,round(target.loc.y + cos(dir) * overshoot_dist),255)
var/turf/found_turf = locate(tx,ty,loc.z)
if(found_turf == null)
return FALSE
var/dist = get_dist(src,found_turf)
charging = TRUE
animate(src,color = rgb(163, 0, 0),time = charge_ramp_up)
sleep(charge_ramp_up)
if(stat == DEAD)
animate(src,color = initial(color),time = charge_ramp_up)
return
throw_at(found_turf,dist + overshoot_dist,4,spin = FALSE)
/mob/living/simple_animal/hostile/yog_jungle/mosquito/proc/reset_charge()
can_charge = TRUE
/mob/living/simple_animal/hostile/yog_jungle/mosquito/proc/use_charge()
can_charge = FALSE
addtimer(CALLBACK(src,PROC_REF(reset_charge)),cooldown,TIMER_UNIQUE)
/mob/living/simple_animal/hostile/yog_jungle/mosquito/proc/get_charge()
return can_charge
//jungle version of the wasp. Slightly weaker and faster, with different loot. Renamed to avoid confusion. Credit to original creator.
/mob/living/simple_animal/hostile/yog_jungle/yellowjacket
name = "yellow jacket"
desc = "A large and aggressive creature with a massive stinger."
icon = 'icons/mob/jungle/wasp.dmi'
icon_state = "wasp"
icon_living = "wasp"
icon_dead = "wasp_dead"
icon_gib = "syndicate_gib"
move_to_delay = 6
movement_type = FLYING
ranged = 1
ranged_cooldown_time = 120
speak_emote = list("buzzes")
vision_range = 5
aggro_vision_range = 9
see_in_dark = 7
speed = 2
maxHealth = 160
health = 160
environment_smash = ENVIRONMENT_SMASH_NONE //held off by walls and windows, stupid oversized bee
melee_damage_lower = 10 //not that lethal, but it'll catch up to you easily
melee_damage_upper = 10
attacktext = "stings"
attack_sound = 'sound/voice/moth/scream_moth.ogg'
deathmessage = "rolls over, falling to the ground."
gold_core_spawnable = HOSTILE_SPAWN
butcher_results = list(/obj/item/stinger = 1,/obj/item/stack/sheet/animalhide/weaver_chitin = 1, /obj/item/stack/sheet/sinew = 1, /obj/item/stack/sheet/bone = 1)
loot = list()
alpha_type = /mob/living/simple_animal/hostile/yog_jungle/alpha/alpha_yellowjacket
var/charging = FALSE
var/revving_charge = FALSE
var/poison_type = /datum/reagent/toxin
var/poison_per_attack = 5
/mob/living/simple_animal/hostile/yog_jungle/yellowjacket/AttackingTarget()
..()
if(isliving(target))
var/mob/living/L = target
if(target.reagents)
L.reagents.add_reagent(poison_type, poison_per_attack)
/mob/living/simple_animal/hostile/yog_jungle/yellowjacket/OpenFire()
if(charging)
return
var/tturf = get_turf(target)
if(!isturf(tturf))
return
if(get_dist(src, target) <= 7)
charge()
ranged_cooldown = world.time + ranged_cooldown_time
/mob/living/simple_animal/hostile/yog_jungle/yellowjacket/Aggro()
vision_range = aggro_vision_range
/mob/living/simple_animal/hostile/yog_jungle/yellowjacket/proc/charge(atom/chargeat = target, 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
do_alert_animation(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/yog_jungle/yellowjacket/Move()
if(revving_charge)
return FALSE
if(charging)
DestroySurroundings() //"Fred, were you feeding steroids to the wasp again?"
..()
/mob/living/simple_animal/hostile/yog_jungle/emeraldspider
////////////////////////////////////////////////////////////////////////////////////
//------------------------------------spider--------------------------------------//
////////////////////////////////////////////////////////////////////////////////////
/**
* basically shoots bolas as the target
*/
/mob/living/simple_animal/hostile/asteroid/yog_jungle/emeraldspider
name = "emerald spider"
desc = "A big, angry, venomous spider. Flings webs at prey to slow them down, before closing in on them."
icon_state = "emeraldspider"
icon_living = "emeraldspider"
icon_dead = "emeraldspider_dead"
butcher_results = list(/obj/item/stack/sheet/bone = 4, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/animalhide/weaver_chitin = 4, /obj/item/reagent_containers/food/snacks/meat/slab/spider = 2)
loot = list()
attacktext = "bites"
gold_core_spawnable = HOSTILE_SPAWN
health = 240
@@ -544,8 +402,8 @@
move_to_delay = 12
speed = 3
ranged = 1
melee_damage_lower = 13
melee_damage_upper = 16
melee_damage_lower = 10
melee_damage_upper = 10
stat_attack = 1
robust_searching = 1
see_in_dark = 7
@@ -585,7 +443,7 @@
icon_state = "websling"
icon = 'yogstation/icons/mob/jungle.dmi'
/mob/living/simple_animal/hostile/yog_jungle/emeraldspider/AttackingTarget()
/mob/living/simple_animal/hostile/asteroid/yog_jungle/emeraldspider/AttackingTarget()
..()
if(isliving(target))
var/mob/living/L = target
@@ -610,7 +468,7 @@
else
to_chat(src, span_warning("There are no organs left in this corpse."))
/mob/living/simple_animal/hostile/yog_jungle/emeraldspider/CanAttack(atom/A)
/mob/living/simple_animal/hostile/asteroid/yog_jungle/emeraldspider/CanAttack(atom/A)
if(..())
return TRUE
if((health < maxHealth) && ishuman(A) && !faction_check_mob(A))
@@ -641,7 +499,7 @@
icon_state = "tar_faithless"
health = 200
maxHealth = 200
melee_damage_lower = 25
melee_damage_lower = 30
melee_damage_upper = 30
/mob/living/simple_animal/hostile/tar/amalgamation/AttackingTarget()

View File

@@ -5,21 +5,25 @@
name = "Orb of healing"
icon_state = "heal_orb"
damage = -10
speed = 2
homing = TRUE
/obj/projectile/jungle/damage_orb
name = "Orb of vengeance"
icon_state = "damage_orb"
damage = 20
speed = 1
armor_flag = MELEE
/obj/projectile/jungle/damage_orb/on_hit(atom/target, blocked)
if(istype(target, /mob/living/simple_animal/hostile/asteroid/yog_jungle/alpha/alpha_dryad) || istype(target, /mob/living/simple_animal/hostile/asteroid/yog_jungle/corrupted_dryad))
return BULLET_ACT_FORCE_PIERCE
return ..()
/obj/projectile/jungle/meduracha_spit
name = "Glob of toxic goo"
icon_state = "meduracha_spit"
damage = 20
speed = 3
damage_type = TOX
armor_flag = BIO
/obj/projectile/jungle/meduracha_spit/on_hit(atom/target, blocked)
. = ..()

View File

@@ -384,31 +384,28 @@ GLOBAL_LIST_INIT(nests, list())
return ..()
/obj/structure/spawner/nest/proc/spawn_mother_monster()
var/mob/living/simple_animal/hostile/yog_jungle/type = pick(mob_types)
if(initial(type.alpha_type) == 0)
var/mob/living/simple_animal/hostile/yog_jungle/monster = new type(loc)
var/mob/living/simple_animal/hostile/asteroid/yog_jungle/enemy_type = pick(mob_types)
if(!initial(enemy_type.alpha_type))
var/mob/living/simple_animal/hostile/asteroid/yog_jungle/monster = new enemy_type(loc)
monster.setMaxHealth(monster.maxHealth * 1.5)
monster.health = monster.maxHealth * 1.5
monster.move_to_delay = max(monster.move_to_delay / 2, 1)
if(monster.alpha_damage_boost == 1) //mobs with really high damage amounts may be exempt from giant damage boosts
monster.melee_damage_lower *= 1.5
monster.melee_damage_upper *= 1.5
monster.faction = list("mining")
var/matrix/M = matrix()
M.Scale(1.5,1.5)
monster.transform = M
monster.health = monster.maxHealth
monster.move_to_delay = max(monster.move_to_delay / 2, 2)
monster.melee_damage_lower *= 1.5
monster.melee_damage_upper *= 1.5
monster.transform = matrix().Scale(1.5)
monster.color = "#c30505"
return
type = initial(type.alpha_type)
new type(loc)
enemy_type = initial(enemy_type.alpha_type)
new enemy_type(loc)
/obj/structure/spawner/nest/jungle
possible_mob_types = list(/mob/living/simple_animal/hostile/yog_jungle/dryad, /mob/living/simple_animal/hostile/yog_jungle/yellowjacket)
possible_mob_types = list(/mob/living/simple_animal/hostile/asteroid/yog_jungle/dryad, /mob/living/simple_animal/hostile/asteroid/wasp/yellowjacket)
/obj/structure/spawner/nest/swamp
possible_mob_types = list(/mob/living/simple_animal/hostile/yog_jungle/mosquito,/mob/living/simple_animal/hostile/yog_jungle/meduracha, /mob/living/simple_animal/hostile/yog_jungle/blobby)
possible_mob_types = list(/mob/living/simple_animal/hostile/asteroid/wasp/mosquito,/mob/living/simple_animal/hostile/asteroid/yog_jungle/meduracha, /mob/living/simple_animal/hostile/asteroid/yog_jungle/blobby)
/obj/structure/spawner/nest/dying
possible_mob_types = list(/mob/living/simple_animal/hostile/yog_jungle/corrupted_dryad,/mob/living/simple_animal/hostile/yog_jungle/mosquito)
possible_mob_types = list(/mob/living/simple_animal/hostile/asteroid/yog_jungle/corrupted_dryad,/mob/living/simple_animal/hostile/asteroid/wasp/mosquito)
/obj/effect/spawner/tendril_spawner

View File

@@ -211,7 +211,7 @@
/mob/living/simple_animal/hostile/double/AttackingTarget()
..()
var/mob/living/simple_animal/M = target
if(ismegafauna(M) || istype(M, /mob/living/simple_animal/hostile/asteroid) || istype(M, /mob/living/simple_animal/hostile/yog_jungle))
if(ismegafauna(M) || istype(M, /mob/living/simple_animal/hostile/asteroid) || istype(M, /mob/living/simple_animal/hostile/asteroid/yog_jungle))
M.apply_damage(melee_fauna_bonus, BRUTE)
/mob/living/simple_animal/hostile/double/bullet_act(obj/projectile/P)
@@ -315,5 +315,5 @@
/obj/projectile/doppshot/on_hit(atom/target, blocked = FALSE)
var/mob/living/M = target
M.apply_damage(actual_damage, BRUTE)
if(ismegafauna(M) || istype(M, /mob/living/simple_animal/hostile/asteroid) || istype(M, /mob/living/simple_animal/hostile/yog_jungle))
if(ismegafauna(M) || istype(M, /mob/living/simple_animal/hostile/asteroid) || istype(M, /mob/living/simple_animal/hostile/asteroid/yog_jungle))
M.apply_damage(ranged_fauna_bonus, BRUTE)