Tyr Update Code Jellyfish (#11749)

This commit is contained in:
FluffMedic
2025-09-27 19:15:46 -04:00
committed by GitHub
parent 97cd6e8ed2
commit 3ad2c9d334
20 changed files with 2698 additions and 3178 deletions

View File

@@ -19,7 +19,7 @@
)
rare_loot = list(
/obj/item/weldingtool/silver,
/obj/item/weldingtool/alien,
/obj/item/cell/slime/jellyfish
)

View File

@@ -1,49 +0,0 @@
/obj/structure/prop/weather_signal
name = "odd device"
desc = "A strange machine that has a button but no clear purpose. Seems to hum during certian weathers."
icon = 'modular_chomp/icons/mob/starbeast.dmi'
icon_state = "machine_working"
density = FALSE //Anti-cheese purposes.
anchored = TRUE
var/uses = 1
/obj/structure/prop/weather_signal/proc/get_planet()
var/turf/T = get_turf(src)
if(!T)
return
if(!T.is_outdoors())
return
var/datum/planet/P = SSplanets.z_to_planet[T.z]
if(!P)
return
return P
/obj/structure/prop/weather_signal/attack_hand(mob/living/user)
var/datum/planet/P = get_planet()
if(user.is_incorporeal())
return
to_chat(user, "You push on the [src].")
if(uses == 0)
to_chat(user, "The machine is destroyed.")
if(P.weather_holder == /datum/weather/sif/sandstorm)
visible_message(span_bolddanger(span_orange("The [src] begins to tremble before something emerges!.")))
uses = 0
new /mob/living/simple_mob/vore/weatherbeast/sandstorm (src.loc)
if(P.weather_holder == /datum/weather/sif/toxinrain)
visible_message(span_bolddanger(span_orange("The [src] begins to tremble before something emerges!.")))
uses = 0
new /mob/living/simple_mob/vore/weatherbeast/acidrain (src.loc)
if(P.weather_holder == /datum/weather/sif/midnightfog)
visible_message(span_bolddanger(span_orange("The [src] begins to tremble before something emerges!.")))
uses = 0
new /mob/living/simple_mob/vore/weatherbeast/darkmist (src.loc)
if(P.weather_holder == /datum/weather/sif/starryrift)
visible_message(span_bolddanger(span_orange("The [src] begins to tremble before something emerges!.")))
uses = 0
new /mob/living/simple_mob/vore/weatherbeast/starsky (src.loc)

View File

@@ -1,23 +1,3 @@
/mob/living/simple_mob/vore/weatherbeast/acidrain/death()
new /obj/item/melee/jellyfishwhip (src.loc)
new /obj/item/cell/slime/jellyfish (src.loc)
.=..()
/mob/living/simple_mob/vore/weatherbeast/starsky/death()
new /obj/item/gun/energy/astarrail (src.loc)
new /obj/item/weldingtool/silver (src.loc)
.=..()
/mob/living/simple_mob/vore/weatherbeast/darkmist/death()
new /obj/item/melee/midnightblade (src.loc)
new /obj/item/reagent_containers/glass/beaker/gilded (src.loc)
.=..()
/mob/living/simple_mob/vore/weatherbeast/sandstorm/death()
new /obj/item/gun/magnetic/matfed/phoronbore/modified (src.loc)
new /obj/item/personal_shield_generator/belt/magnetbelt (src.loc)
.=..()
//Acid Rain Boss
/obj/item/melee/jellyfishwhip
name = "dettached jellyfish tendril"
@@ -41,7 +21,7 @@
user.adjustBruteLoss(-7)
else if(user.a_intent == I_DISARM) //DoT mode
. = ..()
target.add_modifier(/datum/modifier/poisoned/weak/acid, 20)
target.add_modifier(/datum/modifier/poisoned, 20)
else if(user.a_intent == I_GRAB) //weaken mode
. = ..()
target.add_modifier(/datum/modifier/hivebot_weaken, 20)
@@ -53,68 +33,6 @@
maxcharge = 10000
charge_amount = 1000
//Starry Nights
/obj/item/gun/energy/astarrail
name = "Astral Slicer"
desc = "A strange gun pulsing with energy, it feeling oddly lightweight."
icon = 'modular_chomp/icons/obj/guns/precursor/eclipse.dmi'
icon_state = "star_revolver"
item_state = "star_revolver"
wielded_item_state = "cryogun-wielded"
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_COMBAT = 6, TECH_POWER = 5, TECH_PRECURSOR = 3)
charge_cost = 600 //How much energy is needed to fire.
accept_cell_type = /obj/item/cell/device
cell_type = /obj/item/cell/device/weapon
projectile_type = /obj/item/projectile/energy/astralrail
recoil_mode = 0
charge_meter = 1
reload_time = 1 //Stupidly low recharge. Revolvery weapon.
move_delay = 0
/obj/item/projectile/energy/astralrail
name = "odd mist"
icon = 'modular_chomp/icons/mob/starbeast.dmi'
icon_state = "mist"
fire_sound='sound/weapons/gauss_shoot.ogg'
damage = 0
nodamage = 1
modifier_type_to_apply = /datum/modifier/astralkarma
modifier_duration = 0.1 MINUTE
/datum/modifier/astralkarma
name = "starfall"
desc = "You feel dead."
mob_overlay_state = "red_electricity_constant"
stacks = MODIFIER_STACK_EXTEND
/datum/modifier/astralkarma/tick()
holder.adjustBruteLoss(2.5)
holder.adjustFireLoss(2.5)
/obj/item/weldingtool/silver
name = "strange welding tool"
desc = "A strange welding tool. Whilst slower then advanced gear of RnD and precursor technolgy, has benefits from both courses."
icon_state = "hybwelder"
toolspeed = 0.5
flame_color = "#C2C2C2" // Light bluish.
color = "#C2C2C2"
eye_safety_modifier = 1
always_process = TRUE
reach = 2
/obj/item/weldingtool/silver/process()
if(get_fuel() <= get_max_fuel())
reagents.add_reagent(REAGENT_ID_FUEL, 1)
..()
//Midnightfog
//funny melee weapon
/obj/item/melee/midnightblade
@@ -137,25 +55,6 @@
if(prob(0.0001))
target.add_modifier(/datum/modifier/doomed, 120)
//A wierd beaker
/obj/item/reagent_containers/glass/beaker/gilded //Soo technically a good item but cumbersome to use.
name = "golden beaker"
desc = "An odd gold beaker, light seeming to bend around it, it's shadow dancing.."
icon_state = "beakergold_unused"
center_of_mass_x = 16
center_of_mass_y= 13
matter = list(MAT_GLASS = 500)
volume = 400
amount_per_transfer_from_this = 10
flags = OPENCONTAINER | NOREACT
//Sandstorm
//Sticking with the mining theme
/obj/item/gun/magnetic/matfed/phoronbore/modified
name = "modified portable phoron bore"
mat_cost = 100 //more unwieldy ammo better effiency
ammo_material = MAT_TRITIUM
//Mining tool
/obj/item/personal_shield_generator/belt/magnetbelt
name = "magnet generator belt"
@@ -165,9 +64,24 @@
damage_cost = 0
modifier_type = /datum/modifier/magnet
/obj/item/personal_shield_generator/belt/fossiltank
name = "expirmental magnet generator belt"
desc = "A belt that will pull in minerals torwards you whilst bolstering your defense."
modifier_type = /datum/modifier/magnet/defense
/datum/modifier/magnet //you are now a magnet
name = "Magnet Pull"
/datum/modifier/magnet/tick()
for(var/obj/item/ore/O in orange(4, holder))
step_towards(O, get_turf(holder))
/datum/modifier/magnet/defense
max_brute_resistance = 0.3
min_brute_resistance = 0.8
effective_brute_resistance = 1
max_fire_resistance = 0.3
min_fire_resistance = 0.8
effective_fire_resistance = 1

View File

@@ -347,7 +347,7 @@ ANT STRUCTURES
return
if(anchored && isliving(source))
var/mob/living/L = source
if(L == /mob/living/simple_mob/animal/tyr/mineral_ants)
if(L.faction == FACTION_TYR_ANT)
return
else if(L.m_intent == I_RUN)
L.visible_message(
@@ -362,10 +362,6 @@ ANT STRUCTURES
/obj/effect/ant_structure/trap/proc/attack_mob(mob/living/L)
L.add_modifier(modifiertype, 5 SECONDS)
/obj/effect/ant_structure/trap/knockdown
icon_state = "knock_trap"
modifiertype = /datum/modifier/poisoned
/obj/effect/ant_structure/trap/burn
icon_state = "burn_trap"
//No modifier.
@@ -392,7 +388,6 @@ ANT STRUCTURES
/obj/random/ant_building/item_to_spawn()
return pick(/obj/effect/ant_structure/wall,
/obj/effect/ant_structure/trap/burn,
/obj/effect/ant_structure/trap/knockdown,
/obj/effect/ant_structure/trap/slowdown)

View File

@@ -1098,3 +1098,17 @@
addtimer(CALLBACK(src, PROC_REF(cutoff_ulti), target, next_cycle, fire_delay, amount), fire_delay, TIMER_DELETE_ME)
else
attackcycle = next_cycle
/datum/modifier/mmo_drop
name = "Targeted"
on_created_text = span_notice("You feel like you're being targeted.")
stacks = MODIFIER_STACK_FORBID
var/puddleitem = /obj/effect/spider/spiderling/antling
/datum/modifier/mmo_drop/on_expire()
if(holder.stat != DEAD)
var/turf/T = get_turf(holder)
new puddleitem(T)
/datum/modifier/mmo_drop/jelly_fish
puddleitem = /obj/effect/ant_structure/trap

View File

@@ -562,10 +562,13 @@
health = 1000
maxHealth = 1000 //I don't like four digits, but the intended weapon has 30 damage, and desired player count is 3 with a length of 3 mins, doing the math adds up to 1080 but going to do 1k
faction = FACTION_TYR
armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 30, bio = 100, rad = 100)
movement_cooldown = 40
icon = 'modular_chomp/icons/mob/tyr.dmi'
size_multiplier = 2
swallowTime = 0.5 SECONDS
vore_active = 1
vore_capacity = 1
vore_capacity = 5
vore_bump_chance = 10
vore_stomach_name = "Stomach"
vore_default_item_mode = IM_DIGEST
@@ -598,22 +601,23 @@
/obj/item/stock_parts/matter_bin/hyper = 80,
)
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/load_default_bellies()
. = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.mode_flags = DM_FLAG_THICKBELLY | DM_FLAG_NUMBING
B.digest_brute = 1
B.digest_burn = 1
B.digestchance = 0
B.absorbchance = 0
B.escapechance = 25
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/chambera //poison boss
name = "experiment 20"
icon_state = "poison_boss"
icon_living = "poison_boss"
wreckage = /obj/item/prop/tyrlore/basicflora
size_multiplier = 0.8
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/chambera/load_default_bellies()
. = ..()
var/obj/belly/B = vore_selected
B.name = "flora gut"
B.desc = "You have been devoured by the vulpakin like plant beast. A mix of flesh and flora surrond you, purple bubbling fluid soaking into your body. The beast effortlessly carrying your body, it's motions seemingly exaggerated, alien words spoken, the beast trying to taunt you."
B.digest_brute = 1
B.digest_burn = 1
B.digestchance = 0
B.absorbchance = 0
B.escapechance = 15
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/chamberc/bullet_act(obj/item/projectile/P)
if(istype(P,/obj/item/projectile/beam) || istype(P, /obj/item/projectile/energy))
@@ -658,6 +662,17 @@
projectiletype = /obj/item/projectile/knockback/slow
wreckage = /obj/item/prop/tyrlore/basicsonic
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/chamberb/load_default_bellies()
. = ..()
var/obj/belly/B = vore_selected
B.name = "alien gut"
B.desc = "Your ears ring as the stomach groans to life around you. The constant ringing mixing with acidic gurgling, and gutteral groans. Silver flesh kneading at your figure, whilst the beast ignores you stewing in it's gut."
B.digest_brute = 1.5
B.digest_burn = 0.5
B.digestchance = 0
B.absorbchance = 0
B.escapechance = 15
/obj/item/projectile/knockback/slow
speed = 10
@@ -694,6 +709,17 @@
var/fullshield = 300
var/shieldrage = 3
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/chamberc/load_default_bellies()
. = ..()
var/obj/belly/B = vore_selected
B.name = "alien gut"
B.desc = "You are dunked into a multi-colored, or maybe multi-fluid, stew. Blues, purples, oranges, and greens, all swishing around you as the alien creature contunies it's mindless guarding.."
B.digest_brute = 0.5
B.digest_burn = 1.5
B.digestchance = 0
B.absorbchance = 0
B.escapechance = 15
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/chamberc/bullet_act(obj/item/projectile/P)
if(fullshield > 0)
fullshield -= P.damage
@@ -733,46 +759,6 @@
attackcycle = 0
addtimer(CALLBACK(src, PROC_REF(gattlingfire), A, rng_cycle, 8, 7), 0.5 SECONDS, TIMER_DELETE_ME)
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/chamberd //the wall
name = "security master control"
health = 600 //summoner boss so reduced health
maxHealth = 600 //summoner boss so reduced health
specialattackprojectile = /obj/item/projectile/spawnball
icon_state = "spawn_boss"
icon_living = "spawn_boss"
wreckage = /obj/item/prop/tyrlore/drones
/obj/item/projectile/spawnball
name = "nano sphere"
icon_state = "bolter"
speed = 10
damage = 10
embed_chance = 0
damage_type = BRUTE
muzzle_type = null
combustion = FALSE
/obj/item/projectile/spawnball/on_hit(var/atom/target, var/blocked = 0)
if(isturf(target.loc))
visible_message(span_danger("\The [src] creates a hivebot!"))
new /mob/living/simple_mob/mechanical/hivebot/tyr(target.loc)
..()
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/chamberd/do_special_attack(atom/A)
rng_cycle = rand(1,4)
if(attackcycle == 1)
addtimer(CALLBACK(src, PROC_REF(quad_random_firing), A, 20, rng_cycle, 10), 0.5 SECONDS, TIMER_DELETE_ME)
attackcycle = 0
else if(attackcycle == 2)
addtimer(CALLBACK(src, PROC_REF(dual_spin), A, rng_cycle, 5), 0.5 SECONDS, TIMER_DELETE_ME)
attackcycle = 0
else if(attackcycle == 3)
addtimer(CALLBACK(src, PROC_REF(bomb_chaos), A, rng_cycle), 2.5 SECONDS, TIMER_DELETE_ME)
attackcycle = 0
else if(attackcycle == 4)
addtimer(CALLBACK(src, PROC_REF(bomb_lines), A, rng_cycle), 2.5 SECONDS, TIMER_DELETE_ME)
attackcycle = 0
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/chambere
name = "defense automaton"
desc = "A large, very important looking ai. Plating appears similiar to albative plating."
@@ -780,30 +766,9 @@
icon_state = "cyan"
icon_living = "cyan"
size_multiplier = 3
projectiletype = /obj/item/projectile/arc/explosive_rocket
projectiletype = /obj/item/projectile/arc/blue_energy
wreckage = /obj/item/prop/tyrlore/ants
specialattackprojectile = /obj/item/projectile/energy/eclipse/tyrjavelin
loot_list = list(/obj/item/projectile/energy/wp_shotgun = 30,
/obj/item/gun/energy/energyballchain = 30,
/obj/item/tool/wirecutters/hybrid/alien = 30,
/obj/item/tool/wrench/hybrid/alien = 30,
/obj/item/tool/crowbar/hybrid/alien = 30,
/obj/item/tool/screwdriver/hybrid/alien = 30,
/obj/item/pickaxe/diamonddrill/alien = 30,
/obj/item/melee/energy/sword/dualsaber = 30,
/obj/item/shield_projector/rectangle/automatic/tyrvault = 0.01,
/obj/item/stock_parts/scanning_module/omni = 80,
/obj/item/stock_parts/micro_laser/omni = 80,
/obj/item/stock_parts/capacitor/omni = 80,
/obj/item/stock_parts/manipulator/omni = 80,
/obj/item/stock_parts/matter_bin/omni = 80,
/obj/item/stock_parts/scanning_module/hyper = 80,
/obj/item/stock_parts/micro_laser/hyper = 80,
/obj/item/stock_parts/capacitor/hyper = 80,
/obj/item/stock_parts/manipulator/hyper = 80,
/obj/item/stock_parts/matter_bin/hyper = 80,
/obj/item/cell/slime/jellyfish = 100
)
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/chambere/do_special_attack(atom/A)
rng_cycle = rand(1,6)
@@ -890,8 +855,6 @@
name = "expirement 28"
specialattackprojectile = /obj/item/projectile/energy/eclipse/tyrjavelin
resistance = 10
health = 1000
maxHealth = 1000
icon_state = "UPshield_boss"
icon_living = "UPshield_boss"
color = "#FF0000"
@@ -937,3 +900,73 @@
icon_state = "shield_boss"
icon_living = "shield_boss"
..()
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/massswarm
name = "swarm controler"
health = 600
maxHealth = 600
icon_state = "bright_green"
icon_living = "bright_green"
icon = 'modular_chomp/icons/mob/hivebot.dmi'
size_multiplier = 3
wreckage = /obj/item/prop/tyrlore/drones
special_attack_min_range = 1
special_attack_max_range = 7
special_attack_cooldown = 5 SECONDS
melee_damage_lower = 25
melee_damage_upper = 25
attack_armor_pen = 50
grab_resist = 100
movement_cooldown = 3
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/massswarm/bullet_act(obj/item/projectile/P)
for(var/i =1 to 3)
new /mob/living/simple_mob/mechanical/hivebot/nanoevent/bright_green/tyr(src.loc)
..()
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/massswarm/attackby(var/obj/item/O as obj, var/mob/user as mob)
for(var/i =1 to 3)
new /mob/living/simple_mob/mechanical/hivebot/nanoevent/bright_green/tyr(src.loc)
..()
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/finale/do_special_attack(atom/A)
rng_cycle = rand(1,2)
if(attackcycle == 1)
addtimer(CALLBACK(src, PROC_REF(bomb_chaos), A, rng_cycle), 2.5 SECONDS, TIMER_DELETE_ME)
attackcycle = 0
else if(attackcycle == 2)
addtimer(CALLBACK(src, PROC_REF(bomb_lines), A, rng_cycle), 2.5 SECONDS, TIMER_DELETE_ME)
attackcycle = 0
/*
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/finale //finale
name = "guardian program"
health = 1200
maxHealth = 1200
specialattackprojectile = /obj/item/projectile/bullet/astral_blade
icon_state = "guardian"
icon_living = "guardian"
wreckage = /obj/item/prop/tyrlore/drones
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/finale/bullet_act(obj/item/projectile/P)
if(P == /obj/item/projectile/bullet/astral_blade) //no friendly fire
return
else
..()
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/finale/do_special_attack(atom/A)
rng_cycle = rand(1,4)
if(attackcycle == 1)
addtimer(CALLBACK(src, PROC_REF(quad_random_firing), A, 20, rng_cycle, 10), 0.5 SECONDS, TIMER_DELETE_ME)
attackcycle = 0
else if(attackcycle == 2)
addtimer(CALLBACK(src, PROC_REF(dual_spin), A, rng_cycle, 5), 0.5 SECONDS, TIMER_DELETE_ME)
attackcycle = 0
else if(attackcycle == 3)
addtimer(CALLBACK(src, PROC_REF(bomb_chaos), A, rng_cycle), 2.5 SECONDS, TIMER_DELETE_ME)
attackcycle = 0
else if(attackcycle == 4)
addtimer(CALLBACK(src, PROC_REF(bomb_lines), A, rng_cycle), 2.5 SECONDS, TIMER_DELETE_ME)
attackcycle = 0
*/

View File

@@ -20,6 +20,14 @@
pass_flags = PASSTABLE
movement_cooldown = -1
/mob/living/simple_mob/mechanical/hivebot/nanoevent/bright_green/tyr
faction = FACTION_TYR
movement_cooldown = 0
maxHealth = 0.2 LASERS_TO_KILL // 10 HP
health = 0.2 LASERS_TO_KILL
melee_damage_lower = 12
melee_damage_upper = 12
/mob/living/simple_mob/mechanical/hivebot/nanoevent/cyan //cracks the shell
name = "nanoweave cracker hivebot"
icon_state = "cyan"

View File

@@ -1,128 +1,11 @@
/mob/living/simple_mob/vore/weatherbeast //Mostly so mappers don't have to scroll through even more things
icon = 'modular_chomp/icons/mob/starbeast.dmi'
melee_damage_lower = 25
melee_damage_upper = 25
attack_armor_pen = 30
heat_resist = 1
cold_resist = 1
melee_attack_delay = 1 SECOND
grab_resist = 100
devourable = 0
faction = "Weather_Boss"
var/weatherprojectile = /obj/item/projectile/energy/phase/bolt
/mob/living/simple_mob/vore/weatherbeast/proc/up_up(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x, src.y+2, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/up_up_left(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x-1, src.y+2, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/up_up_left_left(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x-2, src.y+2, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/up_up_right(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x+1, src.y+2, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/up_up_right_right(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x+2, src.y+2, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/up_right_right(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x+2, src.y+1, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/up_left_left(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x-2, src.y+1, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/left_left(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x-2, src.y, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/right_right(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x+2, src.y, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/down_down(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x, src.y-2, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/down_down_left(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x-1, src.y-2, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/down_down_left_left(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x-2, src.y-2, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/down_down_right(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x+1, src.y-2, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/down_down_right_right(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x+2, src.y-2, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/down_right_right(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x+2, src.y-1, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/weatherbeast/proc/down_left_left(atom/target)
var/obj/item/projectile/P = new weatherprojectile(get_turf(src))
var/turf = locate(src.x-2, src.y-1, src.z)
target = turf
P.launch_projectile(target, BP_TORSO, src)
//Sup, trying to be better with commenting of my code and explain the oddities behind myself. Several may seem off
//A bit ago I added rare anomalous weather with the intent to add some creatures to summon during them, and well here they are.
//The device to summon them, and a potential anomalous weather summoner is a diffrent file/pr.
//Now the design goals.
//The dark mist boss, a strange cloaked furball. Bullet hellish with a fair bit of tell.
//The star sky boss, a mechanical worm. Trying to alter the work on the old worm code to make it function. May need it's own file.
//The sandstorm boss. Dinosaur.
//The acidrain boss. Either summoner, or ranged.
/mob/living/simple_mob/vore/weatherbeast/sandstorm //slow but endless hunter
name = "fossil tank"
/mob/living/simple_mob/vore/fossiltank //slow but endless hunter
name = "rolling crematorium"
desc = "A large metal tank."
health = 800
maxHealth = 800
health = 500
maxHealth = 500
armor = list(melee = 40, bullet = 40, laser = 40, energy = 40, bomb = 50, bio = 100, rad = 100) //No thematics but I like boss critters to take a bit
icon_state = "rex"
melee_attack_delay = 0.5 SECOND
melee_attack_delay = 0.5 SECONDS
melee_damage_lower = 40 //Will murder you if you get within melee.
melee_damage_upper = 40
attack_armor_pen = 40
@@ -134,9 +17,38 @@
taser_kill = FALSE
poison_resist = 1.0
shock_resist = -0.2
icon = 'modular_chomp/icons/mob/tyr.dmi'
special_attack_min_range = 1
special_attack_max_range = 14 //The special attacks are more meant to pin you down or provide a healing to this tank.
special_attack_cooldown = 10 SECONDS
swallowTime = 0.5 SECONDS
vore_active = 1
vore_capacity = 1
vore_bump_chance = 10
vore_pounce_chance = 50
vore_pounce_cooldown = 10
vore_pounce_successrate = 75
vore_pounce_falloff = 0
vore_pounce_maxhealth = 100
vore_standing_too = TRUE
unacidable = TRUE
grab_resist = 100
devourable = FALSE
faction = FACTION_ECLIPSE
loot_list = list(/obj/item/personal_shield_generator/belt/fossiltank = 100,
)
/mob/living/simple_mob/vore/fossiltank/load_default_bellies()
. = ..()
var/obj/belly/B = vore_selected
B.name = "furnace"
B.desc = "Turns out the skull head opens, and you have been consumed into the beast's furnace! Sweltering heat rages around you as your metal confines rumble with the rurr of strange machinery. The chamber jostling you about as you may attempt to escape, or perhaps accept your fate."
B.digest_brute = 0
B.digest_burn = 3
B.digestchance = 0
B.absorbchance = 0
B.escapechance = 15
/datum/ai_holder/simple_mob/fossiltank
use_astar = TRUE
@@ -144,12 +56,12 @@
retaliate = TRUE
mauling = TRUE
unconscious_vore = TRUE
vision_range = 100 //The entire gimmick of this thing is a slow moving, endless hunter. You shall not escape.
vision_range = 25 //The entire gimmick of this thing is a slow moving, endless hunter. You shall not escape.
respect_alpha = FALSE
destructive = TRUE
forgive_resting = FALSE
/mob/living/simple_mob/vore/weatherbeast/sandstorm/updatehealth()
/mob/living/simple_mob/vore/fossiltank/updatehealth()
. = ..()
if(health < maxHealth*0.25)
@@ -165,575 +77,250 @@
icon_state = "rex"
icon_living = "rex"
/mob/living/simple_mob/vore/weatherbeast/sandstorm/do_special_attack(atom/A)
/mob/living/simple_mob/vore/fossiltank/do_special_attack(atom/A)
if(health < maxHealth*0.25)
visible_message(span_bolddanger(span_orange("The fossil tank begins self repairs!.")))
sleep(30)
for(var/i =1 to 10)
adjustBruteLoss(-100)
adjustFireLoss(-100)
sleep(15)
adjustBruteLoss(-100)
adjustFireLoss(-100)
addtimer(CALLBACK(src, PROC_REF(cycle_heal), 8), 1 SECOND, TIMER_DELETE_ME)
else
Beam(A, icon_state = "sat_beam", time = 2.5 SECONDS, maxdistance = INFINITY)
sleep(30)
var/obj/item/projectile/P = new /obj/item/projectile/beam/lightning(get_turf(src))
P.launch_projectile(A, BP_TORSO, src)
Beam(A, icon_state = "sat_beam", time = 3.5 SECONDS, maxdistance = INFINITY)
addtimer(CALLBACK(src, PROC_REF(sniper_shot), A), 4 SECONDS, TIMER_DELETE_ME)
/mob/living/simple_mob/vore/fossiltank/proc/cycle_heal(var/healamount)
adjustBruteLoss(-100)
adjustFireLoss(-100)
if(healamount > 0)
healamount -= 1
addtimer(CALLBACK(src, PROC_REF(cycle_heal), 8), 1 SECOND, TIMER_DELETE_ME)
/mob/living/simple_mob/vore/weatherbeast/acidrain //acidrain
name = "toxic jellyfish"
/mob/living/simple_mob/vore/fossiltank/proc/sniper_shot(atom/target)
if(!target)
return
var/obj/item/projectile/P = new /obj/item/projectile/beam/lightning(get_turf(src))
P.launch_projectile(target, BP_TORSO, src)
/mob/living/simple_mob/vore/boss_jellyfish
name = "expirmental jellyfish"
desc = "A glowing green jellyfish"
health = 700 //15 laser shots
maxHealth = 700 //15 laser shots, assuming no armor
armor = list(melee = 60, bullet = 60, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 100) //So, it's made of jelly. Bullets and melee bounces off of it. The 20 laser and energy are for a smidge extra tankny because I savour endurance fights
health = 600
maxHealth = 600
armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 50, bio = 100, rad = 100) //So, it's made of jelly. Bullets and melee bounces off of it. The 20 laser and energy are for a smidge extra tankny because I savour endurance fights
icon = 'modular_chomp/icons/mob/tyr.dmi'
icon_state = "jellyfish"
icon_state = "jellyfish_dead"
movement_cooldown = -2
icon_living = "jellyfish"
icon_dead = "jelltdish_dead"
movement_cooldown = 1
damage_fatigue_mult = 0 //It's a mutant jellyfish boss mob.
melee_attack_delay = 1.5 SECOND
melee_damage_lower = 17 //designed to deal 17ish damage when wearing explo voidsuit
melee_damage_upper = 17
attack_armor_pen = 20
glow_color = "#14ff20"
light_color = "#14ff20"
glow_range = 7
glow_intensity = 3
special_attack_min_range = 1
special_attack_max_range = 7
special_attack_cooldown = 30 SECONDS
special_attack_cooldown = 13 SECONDS
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/jellyfish
//So this guy is gonna be funky. Their special attacks depend on their nutrition.
nutrition = 250
swallowTime = 1.5 SECONDS
vore_active = 1
vore_capacity = 1
vore_bump_chance = 10
vore_pounce_chance = 50
vore_pounce_cooldown = 10
vore_pounce_successrate = 75
vore_pounce_falloff = 0
vore_pounce_maxhealth = 100
vore_standing_too = TRUE
unacidable = TRUE
grab_resist = 100
devourable = FALSE
/mob/living/simple_mob/vore/weatherbeast/acidrain/apply_melee_effects(var/atom/A)
faction = FACTION_TYR_ANT
loot_list = list(/obj/item/melee/jellyfishwhip = 100,
/obj/item/cell/slime/jellyfish = 100,
)
var/leech = 50
var/chain_number = 0
/mob/living/simple_mob/vore/boss_jellyfish/load_default_bellies()
. = ..()
var/obj/belly/B = vore_selected
B.name = "internal chamber"
B.desc = "It's smooth and translucent. You can see the world around you distort and wobble with the movement of the space jellyfish. It floats casually, while the delicate flesh seems to form to you. It's surprisingly cool, and flickers with its own light. You're on display for all to see, trapped within the confines of this strange space alien!"
B.digest_brute = 1
B.digest_burn = 1
B.digestchance = 0
B.absorbchance = 0
B.escapechance = 15
/mob/living/simple_mob/vore/boss_jellyfish/apply_melee_effects(var/atom/A) //Not a real threat unless multiple hits. It acts a timer for special traits.
if(isliving(A))
var/mob/living/L = A
if(L.nutrition)
L.adjust_nutrition(-250)
adjust_nutrition(250)
if(prob(25))
L.adjustHalLoss(20)
L.adjust_nutrition(-leech)
adjust_nutrition(leech)
/mob/living/simple_mob/vore/weatherbeast/acidrain/do_special_attack(atom/A)
if(nutrition > 1100)
visible_message(span_bolddanger(span_orange("The giant jellyfish begins to regenerate!.")))
adjustBruteLoss(-300)
adjustFireLoss(-300)
adjust_nutrition(-500)
else
/mob/living/simple_mob/vore/boss_jellyfish/do_special_attack(atom/A)
if(nutrition > 500)
Beam(A, icon_state = "sat_beam", time = 3.5 SECONDS, maxdistance = INFINITY)
addtimer(CALLBACK(src, PROC_REF(sniper_shot), A), 4 SECONDS, TIMER_DELETE_ME)
else if(health < maxHealth*0.25) //phase 4 where it teleports then chains 3 attacks
chain_number = 3
addtimer(CALLBACK(src, PROC_REF(astral_sea_warp), A), 3 SECONDS, TIMER_DELETE_ME)
icon_state = "jellyfish_blue"
icon_living = "jellyfish_blue"
else if(health < maxHealth*0.5) //teleports then chains 2 attacks
chain_number = 2
addtimer(CALLBACK(src, PROC_REF(astral_sea_warp), A), 3 SECONDS, TIMER_DELETE_ME)
icon_state = "jellyfish_blue"
icon_living = "jellyfish_blue"
else if(health < maxHealth*0.75) //teleports then attacks
chain_number = 1
icon_state = "jellyfish_blue"
icon_living = "jellyfish_blue"
addtimer(CALLBACK(src, PROC_REF(astral_sea_warp), A), 3 SECONDS, TIMER_DELETE_ME)
else //attacks once
if(prob(50))
icon_state = "jellyfish_yellow"
icon_living = "jellyfish_yellow"
addtimer(CALLBACK(src, PROC_REF(dash_attack), A), 4 SECONDS, TIMER_DELETE_ME)
else
icon_state = "jellyfish_red"
icon_living = "jellyfish_red"
addtimer(CALLBACK(src, PROC_REF(summon_puddles), A), 4 SECONDS, TIMER_DELETE_ME)
/mob/living/simple_mob/vore/boss_jellyfish/proc/dash_attack(atom/A) //spider dash attack
set waitfor = FALSE
set_AI_busy(TRUE)
if(!A)
return
/mob/living/simple_mob/vore/weatherbeast/acidrain/bullet_act(obj/item/projectile/P)
..()
if(istype(P, /obj/item/projectile/energy))
projectiletype = /obj/item/projectile/energy/declone
adjust_nutrition(-50)
if(istype(P, /obj/item/projectile/bullet))
projectiletype = /obj/item/projectile/energy/bolt
adjust_nutrition(-50)
if(istype(P, /obj/item/projectile/beam))
projectiletype = /obj/item/projectile/beam/gamma
adjust_nutrition(-50)
status_flags |= LEAPING
visible_message(span_danger("\The [src] leaps at \the [A]!"))
throw_at(get_step(get_turf(A), get_turf(src)), special_attack_max_range+1, 1, src)
/mob/living/simple_mob/vore/weatherbeast/acidrain/handle_special()
if(stat != DEAD)
acid_aura()
..()
sleep(5) // For the throw to complete. It won't hold up the AI ticker due to waitfor being false.
/mob/living/simple_mob/vore/weatherbeast/acidrain/proc/acid_aura()
for(var/mob/living/L in view(7, src))
if(L.stat == DEAD)
continue
if(IIsAlly(L))
if(status_flags & LEAPING)
status_flags &= ~LEAPING // Revert special passage ability.
var/turf/T = get_turf(src) // Where we landed. This might be different than A's turf.
. = FALSE
// Now for the stun.
var/mob/living/victim = null
for(var/mob/living/L in T) // So player-controlled spiders only need to click the tile to stun them.
if(L == src)
continue
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.isSynthetic())
continue
L.add_modifier(/datum/modifier/poisoned/weak/acid, 12, src)
if(H.check_shields(damage = 0, damage_source = src, attacker = src, def_zone = null, attack_text = "the leap"))
continue // We were blocked.
/datum/modifier/poisoned/weak/acid //Getting multiple of this will destroy you swiftly.
incoming_tox_damage_percent = 1.5
victim = L
break
/datum/ai_holder/simple_mob/intentional/dark_stranger
use_astar = TRUE
var/closest_desired_distance = 4
var/close_range_radius = 3
/datum/ai_holder/simple_mob/intentional/dark_stranger/on_engagement(atom/A)
if(get_dist(holder, A) > closest_desired_distance)
holder.IMove(get_step_towards(holder, A))
/datum/ai_holder/simple_mob/intentional/dark_stranger/pre_special_attack(atom/A)
if(isliving(A))
var/mob/living/target = A
if(flee_when_dying && (holder.health / holder.getMaxHealth()) <= 0.4) //Phase two baby lets ago
holder.a_intent = I_GRAB
if(get_dist(target, holder) <= close_range_radius) //So doing a BH tradditonally when they're super close would feel a smidge unfair so get away attacks
holder.a_intent = I_DISARM
if(victim)
victim.Weaken(2)
victim.visible_message(span_danger("\The [src] knocks down \the [victim]!"))
to_chat(victim, span_critical("\The [src] jumps on you!"))
. = TRUE
set_AI_busy(FALSE)
if(chain_number > 0)
chain_number -= 1
if(prob(50))
icon_state = "jellyfish_yellow"
icon_living = "jellyfish_yellow"
addtimer(CALLBACK(src, PROC_REF(dash_attack), A), 4 SECONDS, TIMER_DELETE_ME)
else
holder.a_intent = I_HURT
/mob/living/simple_mob/vore/weatherbeast/darkmist //the dark mist
name = "strange figure"
desc = "A figure cloaked in purple."
health = 700
maxHealth = 700
armor = list(melee = 20, bullet = 20, laser = 60, energy = 60, bomb = 50, bio = 100, rad = 100) //Is use to manpulation of strange energies
icon_state = "stranger"
icon_dead = "stranger_dead"
ai_holder_type = /datum/ai_holder/simple_mob/intentional/dark_stranger
damage_fatigue_mult = 0
movement_cooldown = -1
special_attack_min_range = 1
special_attack_max_range = 7
special_attack_cooldown = 3.5 SECONDS
projectiletype = /obj/item/projectile/energy/mob/precursor
weatherprojectile = /obj/item/projectile/energy/mob/precursor
var/attack_cycle = 1
/obj/item/projectile/bullet/precursorburst
use_submunitions = 1
only_submunitions = 1
range = 0
embed_chance = 0
submunition_spread_max = 1200
submunition_spread_min = 500
submunitions = list(/obj/item/projectile/energy/mob/precursor = 4)
/obj/item/projectile/bullet/precursorburst/on_range()
qdel(src)
/obj/item/projectile/bullet/precursorburst/shotgun
submunition_spread_max = 600
submunition_spread_min = 100
/mob/living/simple_mob/vore/weatherbeast/darkmist/do_special_attack(atom/A)
. = TRUE
switch(a_intent)
if(I_DISARM)
close_range(A)
if(I_HURT) //
bullet_wave(A)
if(I_GRAB)
phase_two(A)
//The way too many special attacks for one boss
/mob/living/simple_mob/vore/weatherbeast/darkmist/proc/close_range(atom/target) //when things are close, going to do pure lasers
weatherprojectile = /obj/item/projectile/beam/precursor
if(attack_cycle == 1)
close_one(target)
else if(attack_cycle == 2)
close_two(target)
else if(attack_cycle == 3)
close_three(target)
/mob/living/simple_mob/vore/weatherbeast/darkmist/proc/normal_one(atom/target) //we attempt to be a machine gun
icon_state = "stranger_one"
Beam(target, icon_state = "sat_beam", time = 5 SECONDS, maxdistance = INFINITY)
var/obj/item/projectile/P = new /obj/item/projectile/energy/mob/precursor(get_turf(src))
sleep(5)
for(var/i =1 to 5)
P.launch_projectile(target, BP_TORSO, src)
sleep(5)
P.launch_projectile(, BP_TORSO, src)
attack_cycle = 2
/mob/living/simple_mob/vore/weatherbeast/darkmist/proc/normal_two(atom/target) //Get up/down or to the side
attack_cycle = 3
icon_state = "stranger_three"
sleep(10)
if(prob(50))
up_up(target)
up_up_left(target)
up_up_right(target)
down_down(target)
down_down_right(target)
down_down_left(target)
icon_state = "jellyfish_red"
icon_living = "jellyfish_red"
addtimer(CALLBACK(src, PROC_REF(summon_puddles), A), 4 SECONDS, TIMER_DELETE_ME)
else
up_left_left(target)
left_left(target)
down_left_left(target)
down_right_right(target)
up_right_right(target)
right_right(target)
icon_state = "jellyfish"
icon_living = "jellyfish"
/mob/living/simple_mob/vore/weatherbeast/darkmist/proc/normal_three(atom/target) //Yes
icon_state = "stranger_five"
sleep(10)
up_left_left(target)
left_left(target)
down_left_left(target)
down_right_right(target)
up_right_right(target)
right_right(target)
up_up(target)
up_up_left(target)
up_up_right(target)
down_down(target)
down_down_right(target)
down_down_left(target)
down_down_left_left(target)
down_down_right_right(target)
up_up_right_right(target)
up_up_left_left(target)
attack_cycle = 1
/mob/living/simple_mob/vore/weatherbeast/darkmist/proc/bullet_wave(atom/target) //when long away, projectiles.
weatherprojectile = /obj/item/projectile/energy/mob/precursor
if(attack_cycle == 1)
normal_one(target)
else if(attack_cycle == 2)
normal_two(target)
else if(attack_cycle == 3)
normal_three(target)
/mob/living/simple_mob/vore/weatherbeast/darkmist/proc/close_one(atom/target) //Firing a laser
icon_state = "stranger_two"
Beam(target, icon_state = "sat_beam", time = 5 SECONDS, maxdistance = INFINITY)
var/obj/item/projectile/P = new /obj/item/projectile/beam/precursor(get_turf(src))
sleep(25)
/mob/living/simple_mob/vore/boss_jellyfish/proc/sniper_shot(atom/target)
var/obj/item/projectile/P = new /obj/item/projectile/beam/nutrition_gigabeam(get_turf(src))
P.launch_projectile(target, BP_TORSO, src)
attack_cycle = 2
/mob/living/simple_mob/vore/weatherbeast/darkmist/proc/close_two(atom/target) //Does either an X or a cross
attack_cycle = 3
icon_state = "stranger_four"
sleep(10)
if(prob(50))
up_up_left_left(target)
up_up_right_right(target)
down_down_left_left(target)
down_down_right_right(target)
else
up_up(target)
down_down(target)
left_left(target)
right_right(target)
/mob/living/simple_mob/vore/boss_jellyfish/proc/summon_puddles(atom/A)
for(var/mob/living/L in view(src, 7))
if(L.stat != DEAD || !IIsAlly(L))
L.add_modifier(/datum/modifier/mmo_drop/jelly_fish, 3, src)
if(chain_number > 0)
chain_number -= 1
if(prob(50))
icon_state = "jellyfish_yellow"
icon_living = "jellyfish_yellow"
addtimer(CALLBACK(src, PROC_REF(dash_attack), A), 4 SECONDS, TIMER_DELETE_ME)
else
icon_state = "jellyfish_red"
icon_living = "jellyfish_red"
addtimer(CALLBACK(src, PROC_REF(summon_puddles), A), 4 SECONDS, TIMER_DELETE_ME)
else
icon_state = "jellyfish"
icon_living = "jellyfish"
/mob/living/simple_mob/vore/weatherbeast/darkmist/proc/close_three(atom/target)
icon_state = "stranger_six"
sleep(10)
up_up_left_left(target)
down_down_right_right(target)
sleep(5)
up_left_left(target)
down_right_right(target)
sleep(5)
left_left(target)
right_right(target)
sleep(5)
down_left_left(target)
up_right_right(target)
sleep(5)
down_down_left_left(target)
up_up_right_right(target)
sleep(5)
down_down_left(target)
up_up_right(target)
sleep(5)
down_down(target)
up_up(target)
sleep(5)
down_down_left(target)
up_up_right(target)
attack_cycle = 1
/obj/item/projectile/beam/nutrition_gigabeam
damage = 40
armor_penetration = 90
/mob/living/simple_mob/vore/weatherbeast/darkmist/proc/phase_two(atom/target) //phase two we just mix and and match.
if(attack_cycle == 1)
phasetwo_one(target)
else if(attack_cycle == 2)
phasetwo_two(target)
else if(attack_cycle == 3)
phasetwo_three(target)
/mob/living/simple_mob/vore/boss_jellyfish/proc/astral_sea_warp(atom/target)
if(!target)
to_chat(src, span_warning("There's nothing to teleport to."))
return FALSE
/mob/living/simple_mob/vore/weatherbeast/darkmist/proc/phasetwo_one(atom/target) //Lighting
icon_state = "stranger_eight"
Beam(target, icon_state = "sat_beam", time = 5 SECONDS, maxdistance = INFINITY)
var/obj/item/projectile/P = new /obj/item/projectile/beam/chain_lightning(get_turf(src))
sleep(5)
P.launch_projectile(target, BP_TORSO, src)
attack_cycle = 2
var/list/nearby_things = range(3, target)
var/list/valid_turfs = list()
/mob/living/simple_mob/vore/weatherbeast/darkmist/proc/phasetwo_two(atom/target) //four spinny lasers. However lesser damage projectile
weatherprojectile = /obj/item/projectile/beam/inversion
icon_state = "stranger_seven"
sleep(10)
up_up_left_left(target)
down_down_right_right(target)
down_down_left_left(target)
up_up_right_right(target)
sleep(5)
up_left_left(target)
down_right_right(target)
down_down_left_left(target)
up_up_right(target)
sleep(5)
down_down(target)
up_up(target)
left_left(target)
right_right(target)
sleep(5)
down_left_left(target) //test
up_right_right(target)
down_down_left(target)
up_up_right(target)
sleep(5)
up_up_left_left(target)
down_down_right_right(target)
down_down_left_left(target)
up_up_right_right(target)
sleep(5)
up_left_left(target)
down_right_right(target)
down_down_left_left(target)
up_up_right_right(target)
sleep(5)
down_down(target)
up_up(target)
left_left(target)
right_right(target)
sleep(5)
down_left_left(target)
up_right_right(target)
down_down_left(target)
up_up_right(target)
attack_cycle = 3
// All this work to just go to a non-dense tile.
for(var/turf/potential_turf in nearby_things)
var/valid_turf = TRUE
if(potential_turf.density)
continue
for(var/atom/movable/AM in potential_turf)
if(AM.density)
valid_turf = FALSE
if(valid_turf)
valid_turfs.Add(potential_turf)
/mob/living/simple_mob/vore/weatherbeast/darkmist/proc/phasetwo_three(atom/target) //and reverse with a dangerous projectile
weatherprojectile = /obj/item/projectile/beam/crippling_beam
icon_state = "stranger_nine"
sleep(10)
down_left_left(target)
up_right_right(target)
down_down_left(target)
up_up_right(target)
sleep(5)
down_down(target)
up_up(target)
left_left(target)
right_right(target)
sleep(5)
up_left_left(target)
down_right_right(target)
down_down_left_left(target)
up_up_right_right(target)
sleep(5)
up_up_left_left(target)
down_down_right_right(target)
down_down_left_left(target)
up_up_right_right(target)
sleep(5)
down_left_left(target)
up_right_right(target)
down_down_left(target)
up_up_right(target)
sleep(5)
down_down(target)
up_up(target)
left_left(target)
right_right(target)
sleep(5)
up_left_left(target)
down_right_right(target)
down_down_left(target)
up_up_right(target)
sleep(5)
up_up_left_left(target)
down_down_right_right(target)
down_down_left_left(target)
up_up_right_right(target)
attack_cycle = 1
if(!(valid_turfs.len))
to_chat(src, span_warning("There wasn't an unoccupied spot to teleport to."))
return FALSE
//Note to future self, alter this one later to match the one up above when energy returns.
/mob/living/simple_mob/vore/weatherbeast/starsky //starry skies
name = "guardian unit"
desc = "A strange robotic being."
health = 300
maxHealth = 300
armor = list(melee = 40, bullet = 40, laser = 40, energy = 40, bomb = 50, bio = 100, rad = 100)
icon_state = "astral_sniper"
icon_dead = "astral_sniper_dead"
ai_holder_type = /datum/ai_holder/simple_mob/intentional/dark_stranger
damage_fatigue_mult = 0
movement_cooldown = -1
special_attack_min_range = 1
special_attack_max_range = 7
special_attack_cooldown = 10 SECONDS
projectiletype = /obj/item/projectile/energy/astralrail
weatherprojectile = /obj/item/projectile/energy/astralrail
var/turf/target_turf = pick(valid_turfs)
var/turf/T = get_turf(src)
var/datum/effect/effect/system/spark_spread/s1 = new /datum/effect/effect/system/smoke_spread
s1.set_up(5, 1, T)
var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/smoke_spread
s2.set_up(5, 1, target_turf)
/mob/living/simple_mob/vore/weatherbeast/starsky/do_special_attack(atom/A)
. = TRUE
switch(a_intent)
if(I_DISARM)
close_wave(A)
if(I_HURT) //
far_wave(A)
if(I_GRAB)
phase_two(A)
T.visible_message(span_notice("\The [src] vanishes!"))
s1.start()
forceMove(target_turf)
playsound(target_turf, 'sound/effects/phasein.ogg', 50, 1)
to_chat(src, span_notice("You teleport to \the [target_turf]."))
/mob/living/simple_mob/vore/weatherbeast/starsky/proc/close_wave(atom/target) //bullet pattern when folks up close
down_down_right_right(target)
down_down_left_left(target)
up_up_left_left(target)
up_up_left_left(target)
sleep(20)
right_right(target)
left_left(target)
up_up(target)
down_down(target)
sleep(20)
down_down_left(target)
down_down_right(target)
down_left_left(target)
down_right_right(target)
up_up_right(target)
up_up_left(target)
up_left_left(target)
up_right_right(target)
/mob/living/simple_mob/vore/weatherbeast/starsky/proc/far_wave(atom/target) //Bullet pattern when folks are far away
down_down_left_left(target)
down_down_left(target)
down_down(target)
down_down_right(target)
down_down_right_right(target)
up_up_left_left(target)
up_up_left(target)
up_up(target)
up_up_right(target)
up_up_right_right(target)
sleep(20)
up_up_right_right(target)
up_right_right(target)
right_right(target)
down_right_right(target)
down_down_right_right(target)
up_up_left_left(target)
up_left_left(target)
left_left(target)
down_left_left(target)
down_down_left_left(target)
sleep(20)
down_down_left_left(target)
down_down_left(target)
down_down(target)
down_down_right(target)
down_down_right_right(target)
up_up_left_left(target)
up_up_left(target)
up_up(target)
up_up_right(target)
up_up_right_right(target)
sleep(20)
up_up_right_right(target)
up_right_right(target)
right_right(target)
down_right_right(target)
down_down_right_right(target)
up_up_left_left(target)
up_left_left(target)
left_left(target)
down_left_left(target)
down_down_left_left(target)
/mob/living/simple_mob/vore/weatherbeast/starsky/proc/phase_two(atom/target) //Phase two bullet pattern
up_up_left_left(target)
down_down_right_right(target)
sleep(10)
up_up_left(target)
down_down_right(target)
sleep(10)
up_up(target)
down_down(target)
sleep(10)
up_up_right(target)
down_down_left(target)
sleep(10)
up_up_right_right(target)
down_down_left_left(target)
sleep(10)
up_right_right(target)
down_left_left(target)
sleep(10)
right_right(target)
left_left(target)
sleep(10)
down_right_right(target)
up_left_left(target)
sleep(10)
down_down_right_right(target)
up_up_left_left(target)
sleep(30)
up_up_right(target)
up_up(target)
up_up_left(target)
down_down_right(target)
down_down(target)
down_down_left(target)
left_left(target)
up_left_left(target)
down_left_left(target)
right_right(target)
up_right_right(target)
down_right_right(target)
sleep(30)
up_up_left_left(target)
up_up_left(target)
up_up(target)
up_up_right(target)
up_up_right_right(target)
down_down_left_left(target)
down_down_left(target)
down_down(target)
down_down_right(target)
down_down_right_right(target)
sleep(30)
up_up_left_left(target)
up_up_right_right(target)
down_down_right_right(target)
down_down_left_left(target)
sleep(10)
up_left_left(target)
up_up_right(target)
down_down_left(target)
down_right_right(target)
sleep(10)
left_left(target)
up_up(target)
down_down(target)
right_right(target)
sleep(10)
down_left_left(target)
up_up_left(target)
down_down_right(target)
up_right_right(target)
sleep(10)
up_up_left_left(target)
up_up_right_right(target)
down_down_right_right(target)
down_down_left_left(target)
sleep(50) //False sense of security for the finale
up_up_left_left(target)
up_up_left(target)
up_up(target)
up_up_right(target)
up_up_right_right(target)
up_right_right(target)
up_left_left(target)
right_right(target)
left_left(target)
down_right_right(target)
down_left_left(target)
down_down_left_left(target)
down_down_left(target)
down_down(target)
down_down_right(target)
down_down_right_right(target)
target_turf.visible_message(span_warning("\The [src] appears!"))
s2.start()
if(chain_number > 0)
chain_number -= 1
if(prob(50))
icon_state = "jellyfish_yellow"
icon_living = "jellyfish_yellow"
addtimer(CALLBACK(src, PROC_REF(dash_attack), target), 4 SECONDS, TIMER_DELETE_ME)
else
icon_state = "jellyfish_red"
icon_living = "jellyfish_red"
addtimer(CALLBACK(src, PROC_REF(summon_puddles), target), 4 SECONDS, TIMER_DELETE_ME)

View File

@@ -59,138 +59,6 @@
list(mode_name="explosive", fire_delay=10, projectile_type=/obj/item/projectile/energy/fireball, charge_cost = 160),
)
/obj/item/gun/energy/elementalray
name = "Proto-type Weapon Avatar"
desc = "A strange gun vibrating with energy, lathered with diffrent buttons and switches."
icon = 'modular_chomp/icons/obj/guns/precursor/eclipse.dmi'
icon_state = "avatar"
item_state = "avatar"
wielded_item_state = "avatar-wielded"
accept_cell_type = /obj/item/cell/device
cell_type = /obj/item/cell/device/weapon
projectile_type = /obj/item/projectile/bullet/flamegun
matter = list(MAT_DURASTEEL = 1000, MAT_MORPHIUM = 500)
origin_tech = list(TECH_COMBAT = 6, TECH_POWER = 5, TECH_PRECURSOR = 3)
recoil_mode = 0
charge_meter = 1
move_delay = 0
charge_cost = 160
reload_time = 20
firemodes = list(
list(mode_name="fire", burst=1, fire_delay=15, projectile_type=/obj/item/projectile/bullet/flamegun, charge_cost = 160, modifystate="avatarfire"),
list(mode_name="lighting", burst=1, fire_delay=20, projectile_type=/obj/item/projectile/beam/lightingsurge, charge_cost = 480, modifystate="avatarlighting"),
list(mode_name="frost", burst=3, fire_delay=15, projectile_type=/obj/item/projectile/energy/frostsphere, charge_cost = 260, modifystate="avatarfrost"),
list(mode_name="acid", burst=1, fire_delay=0.5, projectile_type=/obj/item/projectile/energy/muckblob, charge_cost = 10, modifystate="avataracid"),
)
/obj/item/gun/energy/elementalray/emag_act(var/remaining_charges, var/mob/user)
..()
to_chat(user, span_notice("You short circuit the internal locking mechanisms of \the [src]!"))
firemodes = list(
list(mode_name="fire", burst=1, fire_delay=15, projectile_type=/obj/item/projectile/bullet/flamegun, charge_cost = 160),
list(mode_name="lighting", burst=1, fire_delay=20, projectile_type=/obj/item/projectile/beam/lightingsurge, charge_cost = 480),
list(mode_name="frost", burst=3, fire_delay=15, projectile_type=/obj/item/projectile/energy/frostsphere, charge_cost = 160),
list(mode_name="acid", burst=1, fire_delay=0.5, projectile_type=/obj/item/projectile/energy/muckblob, charge_cost = 10),
list(mode_name="error", burst=1, fire_delay=30, projectile_type=/obj/item/projectile/bullet/errorelement, charge_cost = 1040),
)
return 1
/obj/item/projectile/bullet/errorelement //You are the bullet hell
use_submunitions = 1
only_submunitions = 1
range = 0
embed_chance = 0
submunition_spread_max = 3600
submunition_spread_min = 500
submunitions = list(/obj/item/projectile/energy/flamecrystal = 2, /obj/item/projectile/energy/frostsphere = 2, /obj/item/projectile/beam/lightingsurge = 1, /obj/item/projectile/energy/muckblob = 5)
hud_state = "laser_heat"
/obj/item/projectile/beam/lightingsurge //Anti-synth laser
damage = 60
light_color = "#00CCFF"
damage_type = ELECTROMAG
/obj/item/projectile/energy/muckblob
damage = 4
damage_type = BIOACID
check_armour = "bio"
combustion = FALSE
modifier_type_to_apply = /datum/modifier/muck
modifier_duration = 5
speed = 0.6
range = 8
/datum/modifier/muck
name = "acid covered"
desc = "You are covered in acid"
mob_overlay_state = "poisoned"
on_created_text = span_warning("You are covered in muck...")
on_expired_text = span_notice("You are no longer covered in muck.")
stacks = MODIFIER_STACK_ALLOWED
slowdown = 0.2
/obj/item/gun/energy/pulseglove
name = "Strange Glove"
desc = "A bulky glove cladded with strange tech. It hums with energy, and the battery port is inaccessiable"
icon = 'modular_chomp/icons/obj/guns/precursor/eclipse.dmi'
icon_state = "darkglove"
item_state = "darkglove"
charge_cost = 380 // 13 shots
projectile_type = /obj/item/projectile/bullet/lightingburst
cell_type = /obj/item/cell/device/weapon/recharge/alien
battery_lock = 1
/obj/item/projectile/energy/redlighting
name = "Flame Crystal"
icon = 'modular_chomp/icons/mob/eclipse.dmi' //commiting sin
icon_state = "redlighting"
damage = 20
armor_penetration = 20
hud_state = "laser_sniper"
/obj/item/projectile/energy/darkmeteor
name = "Strange Sphere"
icon = 'modular_chomp/icons/mob/eclipse.dmi' //commiting sin
icon_state = "darkmeteor"
damage = 60
damage_type = BRUTE
check_armour = "melee"
speed = 15
/obj/item/projectile/bullet/meteorstorm
use_submunitions = 1
only_submunitions = 1
range = 0
embed_chance = 0
submunition_spread_max = 3600
submunition_spread_min = 1200
submunitions = list(/obj/item/projectile/energy/darkmeteor = 3)
/obj/item/projectile/bullet/lightingburst
use_submunitions = 1
only_submunitions = 1
range = 0
embed_chance = 0
submunition_spread_max = 1200
submunition_spread_min = 200
submunitions = list(/obj/item/projectile/energy/redlighting = 3)
hud_state = "laser_sniper"
/obj/item/projectile/energy/mechahack
name = "remote hack"
icon = 'modular_chomp/icons/obj/guns/precursor/eclipse.dmi'
@@ -296,30 +164,3 @@
armor_penetration = 30
speed = 10
excavation_amount = 100
//technically not eclipse but honary
/obj/item/projectile/energy/eclipse/poisonwind
name = "anomalous winds"
icon_state = "ice_wind"
damage = 10
armor_penetration = 70
speed = 10
color = "#003300"
modifier_type_to_apply = /datum/modifier/poisoned //main threat right here, Will two tap most players if untreated
modifier_duration = 1 MINUTE
/obj/item/projectile/energy/eclipse/tyrjavelin //Five hits ought to end you
name = "energy javelin"
icon_state = "javelin"
damage_type = SEARING
check_armour = "melee"
damage = 23
armor_penetration = 30
speed = 10
color = "#FF6600"
modifier_type_to_apply = /datum/modifier/deep_wounds //reduced healing
modifier_duration = 1 MINUTE
/obj/item/projectile/energy/eclipse/tyrjavelin/speed
speed = 7

View File

@@ -21,6 +21,7 @@
armor_penetration = 60 //damage and AP matching makes brain happy for some reason. No real logic here, just brain saying yes, this is right
range = 8
speed = 5
penetrating = 2
check_armour = "melee"
damage_type = BRUTE
@@ -40,13 +41,13 @@
L.throw_at(get_edge_target_turf(L, throwdir), 3, 10)
return 1
//The blaster has 1 more range but lacks hitscan whilst the laser has 1 less range but has hitscan.
/obj/item/projectile/energy/wp_blaster
name = "laser blast"
icon = 'modular_chomp/icons/obj/guns/precursor/tyr.dmi'
icon_state = "blaster_blast"
damage = 35
range = 5
penetrating = 2
check_armour = "laser"
/obj/item/projectile/beam/precursor_tyr
@@ -54,7 +55,7 @@
icon_state = "laser"
damage = 8
armor_penetration = 30
penetrating = 20
penetrating = 2
damage_type = BURN
check_armour = "laser"
range = 5
@@ -132,7 +133,7 @@
wielded_item_state = "placeholder"
origin_tech = list(TECH_COMBAT = 6, TECH_POWER = 5, TECH_PRECURSOR = 3)
charge_cost = 625
charge_cost = 250
battery_lock = 1 //No changing
accept_cell_type = /obj/item/cell/device
@@ -156,3 +157,31 @@
/obj/item/projectile/energy/spikeenergy_ball/slow
speed = 15
range = 20
/obj/item/projectile/energy/eclipse/tyrjavelin //Five hits ought to end you
name = "energy javelin"
icon_state = "javelin"
damage_type = SEARING
check_armour = "melee"
damage = 23
armor_penetration = 30
speed = 10
color = "#FF6600"
modifier_type_to_apply = /datum/modifier/deep_wounds //reduced healing
modifier_duration = 1 MINUTE
/obj/item/projectile/energy/eclipse/tyrjavelin/speed
speed = 7
/obj/item/projectile/bullet/astral_blade
name = "bluespace slash"
icon_state = "astral_sea_blade"
icon = 'modular_chomp/icons/obj/guns/precursor/tyr.dmi'
damage = 40 //28 with intended armor
armor_penetration = 20
damage_type = BRUTE
check_armour = "melee"
embed_chance = 0
speed = 15
penetrating = 5
crawl_destroy = TRUE

View File

@@ -30,3 +30,15 @@
RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_RANGED
)
departmental_flags = DEPARTMENT_BITFLAG_SCIENCE
/datum/design_techweb/magnet_belt
name = "Magnet Belt"
id = "magnet_belt"
build_type = PROTOLATHE
materials = list(MAT_STEEL = 12000,MAT_DIAMOND = 700,MT_COPPER = 3000,MAT_MYDRO = 1000,MAT_QUARTZ = 5000,MAT_WEATHERED_AGATE = 8000)
build_path = /obj/item/personal_shield_generator/belt/magnetbelt
category = list(
RND_CATEGORY_EQUIPMENT
)
departmental_flags = DEPARTMENT_BITFLAG_SCIENCE

View File

@@ -7,6 +7,7 @@
"tyr_rifle",
"tyr_shotgun",
"tyr_meleegun",
"magnet_belt",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS)
required_experiments = list(/datum/experiment/scanning/points/tyr_precursor_study)