mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
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:
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -46,4 +46,4 @@
|
||||
|
||||
/datum/mapGenerator/asteroid/filled
|
||||
modules = list(/datum/mapGeneratorModule/bottomLayer/asteroidWalls)
|
||||
buildmode_name = "Block: Asteroid Walls"
|
||||
buildmode_name = "Block: Asteroid Walls"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user