mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
Tyr Update Code Jellyfish (#11749)
This commit is contained in:
@@ -19,7 +19,7 @@
|
||||
)
|
||||
|
||||
rare_loot = list(
|
||||
/obj/item/weldingtool/silver,
|
||||
/obj/item/weldingtool/alien,
|
||||
/obj/item/cell/slime/jellyfish
|
||||
)
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user