mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-28 06:28:01 +01:00
Conflict Resolution
This commit is contained in:
@@ -1,56 +1,3 @@
|
||||
<<<<<<< HEAD
|
||||
// Saviks are dangerous, angry creatures that hit hard, and will berserk if losing a fight.
|
||||
|
||||
/mob/living/simple_mob/animal/sif/savik
|
||||
name = "savik"
|
||||
tt_desc = "S Pistris tellus" //landshark
|
||||
player_msg = "You have the ability to <b>berserk at will</b>, which will grant strong physical bonuses for \
|
||||
a short period of time, however it will tire you and you will be much weaker for awhile after it expires."
|
||||
|
||||
faction = "savik"
|
||||
|
||||
icon_state = "savik"
|
||||
icon_living = "savik"
|
||||
icon_dead = "savik_dead"
|
||||
icon = 'icons/jungle.dmi'
|
||||
|
||||
maxHealth = 125
|
||||
health = 125
|
||||
|
||||
movement_cooldown = 0.5 SECONDS
|
||||
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 35
|
||||
attack_armor_pen = 15
|
||||
attack_sharp = TRUE
|
||||
attack_edge = TRUE
|
||||
melee_attack_delay = 1 SECOND
|
||||
attacktext = list("mauled")
|
||||
|
||||
say_list_type = /datum/say_list/savik
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/savik
|
||||
|
||||
/datum/say_list/savik
|
||||
speak = list("Hruuugh!","Hrunnph")
|
||||
emote_see = list("paws the ground","shakes its mane","stomps")
|
||||
emote_hear = list("snuffles")
|
||||
|
||||
/mob/living/simple_mob/animal/sif/savik/handle_special()
|
||||
if((get_AI_stance() in list(STANCE_APPROACH, STANCE_FIGHT)) && !is_AI_busy() && isturf(loc))
|
||||
if(health <= (maxHealth * 0.5)) // At half health, and fighting someone currently.
|
||||
berserk()
|
||||
|
||||
/datum/ai_holder/simple_mob/savik
|
||||
mauling = TRUE
|
||||
|
||||
// So players can use it too.
|
||||
/mob/living/simple_mob/animal/sif/savik/verb/berserk()
|
||||
set name = "Berserk"
|
||||
set desc = "Enrage and become vastly stronger for a period of time, however you will be weaker afterwards."
|
||||
set category = "Abilities"
|
||||
|
||||
add_modifier(/datum/modifier/berserk, 30 SECONDS)
|
||||
=======
|
||||
// Saviks are dangerous, angry creatures that hit hard, and will berserk if losing a fight.
|
||||
|
||||
/datum/category_item/catalogue/fauna/savik
|
||||
@@ -119,5 +66,4 @@
|
||||
set desc = "Enrage and become vastly stronger for a period of time, however you will be weaker afterwards."
|
||||
set category = "Abilities"
|
||||
|
||||
add_modifier(/datum/modifier/berserk, 30 SECONDS)
|
||||
>>>>>>> 1afbe8d... Explorer Update - Cataloguers (#6016)
|
||||
add_modifier(/datum/modifier/berserk, 30 SECONDS)
|
||||
|
||||
@@ -1,74 +1,3 @@
|
||||
<<<<<<< HEAD
|
||||
// Shantaks are essentially sif wolves.
|
||||
|
||||
/mob/living/simple_mob/animal/sif/shantak
|
||||
name = "shantak"
|
||||
desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. \
|
||||
Don't be fooled by its beauty though."
|
||||
tt_desc = "S Choeros shantak"
|
||||
|
||||
faction = "shantak"
|
||||
|
||||
icon_state = "shantak"
|
||||
icon_living = "shantak"
|
||||
icon_dead = "shantak_dead"
|
||||
icon = 'icons/jungle.dmi'
|
||||
|
||||
maxHealth = 75
|
||||
|
||||
movement_cooldown = 5
|
||||
|
||||
melee_damage_lower = 6
|
||||
melee_damage_upper = 14
|
||||
base_attack_cooldown = 1 SECOND
|
||||
melee_attack_delay = 0.5 SECONDS
|
||||
attack_armor_pen = 5
|
||||
attack_sharp = TRUE
|
||||
attack_edge = TRUE
|
||||
attacktext = list("gouged")
|
||||
|
||||
say_list_type = /datum/say_list/shantak
|
||||
|
||||
/datum/say_list/shantak
|
||||
speak = list("Shuhn.","Shrunnph?","Shunpf.")
|
||||
emote_see = list("scratches the ground", "shakes out its mane", "clinks gently as it moves")
|
||||
|
||||
|
||||
// The pack leader.
|
||||
// Will command other shantaks to follow it.
|
||||
/mob/living/simple_mob/animal/sif/shantak/leader
|
||||
name = "big shantak"
|
||||
desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. \
|
||||
This one seems bigger than the others, and has a commanding presence."
|
||||
icon_scale = 1.5
|
||||
maxHealth = 125
|
||||
player_msg = "You have the ability to <b>command other shantaks to follow you</b>."
|
||||
|
||||
/mob/living/simple_mob/animal/sif/shantak/leader/verb/rally_pack()
|
||||
set name = "Rally Pack"
|
||||
set desc = "Commands your fellow packmembers to follow you, the leader."
|
||||
set category = "Abilities"
|
||||
|
||||
for(var/mob/living/simple_mob/animal/sif/shantak/S in hearers(7, src))
|
||||
if(istype(S, /mob/living/simple_mob/animal/sif/shantak/leader)) // Leaders won't follow other leaders. Also avoids trying to follow ourselves.
|
||||
continue
|
||||
if(!S.ai_holder)
|
||||
continue
|
||||
if(S.faction != src.faction)
|
||||
continue
|
||||
var/datum/ai_holder/AI = S.ai_holder
|
||||
AI.set_follow(src)
|
||||
|
||||
// Variant that automatically commands nearby allies to follow it when created.
|
||||
// Suggested to spawn last so it can rally up all the shantaks easily before hunting for tasty explorers.
|
||||
/mob/living/simple_mob/animal/sif/shantak/leader/autofollow/Initialize()
|
||||
rally_pack()
|
||||
return ..()
|
||||
|
||||
|
||||
// These ones only retaliate. Used for a PoI.
|
||||
/mob/living/simple_mob/animal/sif/shantak/retaliate
|
||||
=======
|
||||
// Shantaks are essentially sif wolves.
|
||||
|
||||
/datum/category_item/catalogue/fauna/shantak
|
||||
@@ -165,6 +94,5 @@
|
||||
|
||||
|
||||
// These ones only retaliate. Used for a PoI.
|
||||
/mob/living/simple_mob/animal/sif/shantak/retaliate
|
||||
>>>>>>> 1afbe8d... Explorer Update - Cataloguers (#6016)
|
||||
/mob/living/simple_mob/animal/sif/shantak/retaliate
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/retaliate
|
||||
@@ -1,133 +1,3 @@
|
||||
<<<<<<< HEAD
|
||||
// Space carp show up as a random event to wreck hapless people in space or near windows.
|
||||
// They generally fit the archetype of 'fast but fragile'.
|
||||
// This is compensated by being in groups (usually).
|
||||
/mob/living/simple_mob/animal/space/carp
|
||||
name = "space carp"
|
||||
desc = "A ferocious, fang-bearing creature that resembles a fish."
|
||||
icon_state = "carp"
|
||||
icon_living = "carp"
|
||||
icon_dead = "carp_dead"
|
||||
icon_gib = "carp_gib"
|
||||
|
||||
faction = "carp"
|
||||
maxHealth = 25
|
||||
health = 25
|
||||
movement_cooldown = 0 // Carp go fast
|
||||
hovering = TRUE
|
||||
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "hits the"
|
||||
|
||||
melee_damage_lower = 7 // About 14 DPS.
|
||||
melee_damage_upper = 7
|
||||
base_attack_cooldown = 10 // One attack a second.
|
||||
attack_sharp = TRUE
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
attacktext = list("bitten")
|
||||
|
||||
meat_amount = 1
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee
|
||||
|
||||
var/knockdown_chance = 15
|
||||
|
||||
/mob/living/simple_mob/animal/space/carp/apply_melee_effects(var/atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(prob(knockdown_chance))
|
||||
L.Weaken(3)
|
||||
L.visible_message(span("danger", "\The [src] knocks down \the [L]!"))
|
||||
|
||||
// Subtypes.
|
||||
|
||||
// Won't wander away.
|
||||
/mob/living/simple_mob/animal/space/carp/event
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/event
|
||||
|
||||
|
||||
/mob/living/simple_mob/animal/space/carp/large
|
||||
name = "elder carp"
|
||||
desc = "An older, more matured carp. Few survive to this age due to their aggressiveness."
|
||||
icon = 'icons/mob/64x32.dmi'
|
||||
icon_state = "shark"
|
||||
icon_living = "shark"
|
||||
icon_dead = "shark_dead"
|
||||
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
movement_cooldown = 5 // Slower than the younger carp.
|
||||
mob_size = MOB_LARGE
|
||||
|
||||
pixel_x = -16
|
||||
default_pixel_x = -16
|
||||
|
||||
meat_amount = 3
|
||||
|
||||
|
||||
/mob/living/simple_mob/animal/space/carp/large/huge
|
||||
name = "great white carp"
|
||||
desc = "A very rare breed of carp- and a very aggressive one."
|
||||
icon = 'icons/mob/64x64.dmi'
|
||||
icon_dead = "megacarp_dead"
|
||||
icon_living = "megacarp"
|
||||
icon_state = "megacarp"
|
||||
|
||||
maxHealth = 230
|
||||
health = 230
|
||||
movement_cooldown = 10
|
||||
|
||||
melee_damage_lower = 15 // About 20 DPS.
|
||||
melee_damage_upper = 25
|
||||
|
||||
pixel_y = -16
|
||||
default_pixel_y = -16
|
||||
|
||||
meat_amount = 10
|
||||
|
||||
|
||||
/mob/living/simple_mob/animal/space/carp/holographic
|
||||
name = "holographic carp"
|
||||
desc = "An obviously holographic, but still ferocious looking carp."
|
||||
// Might be worth using a filter similar to AI holograms in the future.
|
||||
icon = 'icons/mob/AI.dmi'
|
||||
icon_state = "holo4"
|
||||
icon_living = "holo4"
|
||||
icon_dead = "holo4"
|
||||
alpha = 127
|
||||
icon_gib = null
|
||||
meat_amount = 0
|
||||
meat_type = null
|
||||
|
||||
mob_class = MOB_CLASS_PHOTONIC // Xeno-taser won't work on this as its not a 'real' carp.
|
||||
|
||||
/mob/living/simple_mob/animal/space/carp/holographic/Initialize()
|
||||
set_light(2) // Hologram lighting.
|
||||
return ..()
|
||||
|
||||
// Presumably the holodeck emag code requires this.
|
||||
// Pass TRUE to make safe. Pass FALSE to make unsafe.
|
||||
/mob/living/simple_mob/animal/space/carp/holographic/proc/set_safety(safe)
|
||||
if(!isnull(get_AI_stance())) // Will return null if lacking an AI holder or a player is controlling it w/o autopilot var.
|
||||
ai_holder.hostile = !safe // Inverted so safe = TRUE means hostility = FALSE.
|
||||
ai_holder.forget_everything() // Reset state so it'll stop chewing on its target.
|
||||
|
||||
// Called on death.
|
||||
/mob/living/simple_mob/animal/space/carp/holographic/proc/derez()
|
||||
visible_message(span("notice", "\The [src] fades away!"))
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_mob/animal/space/carp/holographic/gib()
|
||||
derez() // Holograms can't gib.
|
||||
|
||||
/mob/living/simple_mob/animal/space/carp/holographic/death()
|
||||
..()
|
||||
derez()
|
||||
|
||||
|
||||
=======
|
||||
// Space carp show up as a random event to wreck hapless people in space or near windows.
|
||||
// They generally fit the archetype of 'fast but fragile'.
|
||||
// This is compensated by being in groups (usually).
|
||||
@@ -280,5 +150,4 @@
|
||||
..()
|
||||
derez()
|
||||
|
||||
|
||||
>>>>>>> 1afbe8d... Explorer Update - Cataloguers (#6016)
|
||||
|
||||
|
||||
@@ -1,268 +1,3 @@
|
||||
<<<<<<< HEAD
|
||||
// Stronger than a regular Dark Gygax, this one has three special attacks, based on intents.
|
||||
// First special attack launches three arcing rockets at the current target.
|
||||
// Second special attack fires a projectile that creates a short-lived microsingularity that pulls in everything nearby. Magboots can protect from this.
|
||||
// Third special attack creates a dangerous electric field that causes escalating electric damage, before emitting a tesla shock and blinding anyone looking at the mecha.
|
||||
// The AI will choose one every ten seconds.
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced
|
||||
name = "advanced dark gygax"
|
||||
desc = "An experimental exosuit that utilizes advanced materials to allow for greater protection while still being lightweight and fast. \
|
||||
It also is armed with an array of next-generation weaponry."
|
||||
icon_state = "darkgygax_adv"
|
||||
wreckage = /obj/structure/loot_pile/mecha/gygax/dark/adv
|
||||
icon_scale = 1.5
|
||||
movement_shake_radius = 14
|
||||
|
||||
maxHealth = 450
|
||||
deflect_chance = 25
|
||||
has_repair_droid = TRUE
|
||||
armor = list(
|
||||
"melee" = 50,
|
||||
"bullet" = 50,
|
||||
"laser" = 50,
|
||||
"energy" = 30,
|
||||
"bomb" = 30,
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
special_attack_cooldown = 10 SECONDS
|
||||
projectiletype = /obj/item/projectile/force_missile
|
||||
projectilesound = 'sound/weapons/wave.ogg'
|
||||
var/obj/effect/overlay/energy_ball/energy_ball = null
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced/Destroy()
|
||||
if(energy_ball)
|
||||
energy_ball.stop_orbit()
|
||||
qdel(energy_ball)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced/do_special_attack(atom/A)
|
||||
. = TRUE // So we don't fire a laser as well.
|
||||
switch(a_intent)
|
||||
if(I_DISARM) // Side gun
|
||||
electric_defense(A)
|
||||
if(I_HURT) // Rockets
|
||||
launch_rockets(A)
|
||||
if(I_GRAB) // Micro-singulo
|
||||
launch_microsingularity(A)
|
||||
|
||||
#define ELECTRIC_ZAP_POWER 20000
|
||||
|
||||
// Charges a tesla shot, while emitting a dangerous electric field. The exosuit is immune to electric damage while this is ongoing.
|
||||
// It also briefly blinds anyone looking directly at the mech without flash protection.
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced/proc/electric_defense(atom/target)
|
||||
set waitfor = FALSE
|
||||
|
||||
// Temporary immunity to shock to avoid killing themselves with their own attack.
|
||||
var/old_shock_resist = shock_resist
|
||||
shock_resist = 1
|
||||
|
||||
// Make the energy ball. This is purely visual since the tesla ball is hyper-deadly.
|
||||
energy_ball = new(loc)
|
||||
energy_ball.adjust_scale(0.5)
|
||||
energy_ball.orbit(src, 32, TRUE, 1 SECOND)
|
||||
|
||||
visible_message(span("warning", "\The [src] creates \an [energy_ball] around itself!"))
|
||||
|
||||
playsound(src.loc, 'sound/effects/lightning_chargeup.ogg', 100, 1, extrarange = 30)
|
||||
|
||||
// Shock nearby things that aren't ourselves.
|
||||
for(var/i = 1 to 10)
|
||||
energy_ball.adjust_scale(0.5 + (i/10))
|
||||
energy_ball.set_light(i/2, i/2, "#0000FF")
|
||||
for(var/thing in range(3, src))
|
||||
// This is stupid because mechs are stupid and not mobs.
|
||||
if(isliving(thing))
|
||||
var/mob/living/L = thing
|
||||
|
||||
if(L == src)
|
||||
continue
|
||||
if(L.stat)
|
||||
continue // Otherwise it can get pretty laggy if there's loads of corpses around.
|
||||
L.inflict_shock_damage(i * 2)
|
||||
if(L && L.has_AI()) // Some mobs delete themselves when dying.
|
||||
L.ai_holder.react_to_attack(src)
|
||||
|
||||
else if(istype(thing, /obj/mecha))
|
||||
var/obj/mecha/M = thing
|
||||
M.take_damage(i * 2, "energy") // Mechs don't have a concept for siemens so energy armor check is the best alternative.
|
||||
|
||||
sleep(1 SECOND)
|
||||
|
||||
// Shoot a tesla bolt, and flashes people who are looking at the mecha without sufficent eye protection.
|
||||
visible_message(span("warning", "\The [energy_ball] explodes in a flash of light, sending a shock everywhere!"))
|
||||
playsound(src.loc, 'sound/effects/lightningbolt.ogg', 100, 1, extrarange = 30)
|
||||
tesla_zap(src.loc, 5, ELECTRIC_ZAP_POWER, FALSE)
|
||||
for(var/mob/living/L in viewers(src))
|
||||
if(L == src)
|
||||
continue
|
||||
var/dir_towards_us = get_dir(L, src)
|
||||
if(L.dir && L.dir & dir_towards_us)
|
||||
to_chat(L, span("danger", "The flash of light blinds you briefly."))
|
||||
L.flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = TRUE)
|
||||
|
||||
// Get rid of our energy ball.
|
||||
energy_ball.stop_orbit()
|
||||
qdel(energy_ball)
|
||||
|
||||
sleep(1 SECOND)
|
||||
// Resist resistance to old value.
|
||||
shock_resist = old_shock_resist // Not using initial() in case the value gets modified by an admin or something.
|
||||
|
||||
#undef ELECTRIC_ZAP_POWER
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced/proc/launch_rockets(atom/target)
|
||||
set waitfor = FALSE
|
||||
|
||||
// Telegraph our next move.
|
||||
Beam(target, icon_state = "sat_beam", time = 3.5 SECONDS, maxdistance = INFINITY)
|
||||
visible_message(span("warning", "\The [src] deploys a missile rack!"))
|
||||
playsound(src, 'sound/effects/turret/move1.wav', 50, 1)
|
||||
sleep(0.5 SECONDS)
|
||||
|
||||
for(var/i = 1 to 3)
|
||||
if(target) // Might get deleted in the meantime.
|
||||
var/turf/T = get_turf(target)
|
||||
if(T)
|
||||
visible_message(span("warning", "\The [src] fires a rocket into the air!"))
|
||||
playsound(src, 'sound/weapons/rpg.ogg', 70, 1)
|
||||
face_atom(T)
|
||||
var/obj/item/projectile/arc/explosive_rocket/rocket = new(loc)
|
||||
rocket.old_style_target(T, src)
|
||||
rocket.fire()
|
||||
sleep(1 SECOND)
|
||||
|
||||
visible_message(span("warning", "\The [src] retracts the missile rack."))
|
||||
playsound(src, 'sound/effects/turret/move2.wav', 50, 1)
|
||||
|
||||
// Arcing rocket projectile that produces a weak explosion when it lands.
|
||||
// Shouldn't punch holes in the floor, but will still hurt.
|
||||
/obj/item/projectile/arc/explosive_rocket
|
||||
name = "rocket"
|
||||
icon_state = "mortar"
|
||||
|
||||
/obj/item/projectile/arc/explosive_rocket/on_impact(turf/T)
|
||||
new /obj/effect/explosion(T) // Weak explosions don't produce this on their own, apparently.
|
||||
explosion(T, 0, 0, 2, adminlog = FALSE)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced/proc/launch_microsingularity(atom/target)
|
||||
var/turf/T = get_turf(target)
|
||||
visible_message(span("warning", "\The [src] fires an energetic sphere into the air!"))
|
||||
playsound(src, 'sound/weapons/Laser.ogg', 50, 1)
|
||||
face_atom(T)
|
||||
var/obj/item/projectile/arc/microsingulo/sphere = new(loc)
|
||||
sphere.old_style_target(T, src)
|
||||
sphere.fire()
|
||||
|
||||
/obj/item/projectile/arc/microsingulo
|
||||
name = "micro singularity"
|
||||
icon_state = "bluespace"
|
||||
|
||||
/obj/item/projectile/arc/microsingulo/on_impact(turf/T)
|
||||
new /obj/effect/temporary_effect/pulse/microsingulo(T)
|
||||
|
||||
|
||||
/obj/effect/temporary_effect/pulse/microsingulo
|
||||
name = "micro singularity"
|
||||
desc = "It's sucking everything in!"
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "bhole3"
|
||||
light_range = 4
|
||||
light_power = 5
|
||||
light_color = "#2ECCFA"
|
||||
pulses_remaining = 10
|
||||
pulse_delay = 0.5 SECONDS
|
||||
var/pull_radius = 3
|
||||
var/pull_strength = STAGE_THREE
|
||||
|
||||
/obj/effect/temporary_effect/pulse/microsingulo/on_pulse()
|
||||
for(var/atom/A in range(pull_radius, src))
|
||||
A.singularity_pull(src, pull_strength)
|
||||
|
||||
|
||||
// The Advanced Dark Gygax's AI.
|
||||
// The mob has three special attacks, based on the current intent.
|
||||
// This AI choose the appropiate intent for the situation, and tries to ensure it doesn't kill itself by firing missiles at its feet.
|
||||
/datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
conserve_ammo = TRUE // Might help avoid 'I shoot the wall forever' cheese.
|
||||
var/closest_desired_distance = 1 // Otherwise run up to them to be able to potentially shock or punch them.
|
||||
|
||||
var/electric_defense_radius = 3 // How big to assume electric defense's area is.
|
||||
var/microsingulo_radius = 3 // Same but for microsingulo pull.
|
||||
var/rocket_explosive_radius = 2 // Explosion radius for the rockets.
|
||||
|
||||
var/electric_defense_threshold = 2 // How many non-targeted people are needed in close proximity before electric defense is viable.
|
||||
var/microsingulo_threshold = 2 // Similar to above, but uses an area around the target.
|
||||
|
||||
// Used to control the mob's positioning based on which special attack it has done.
|
||||
// Note that the intent will not change again until the next special attack is about to happen.
|
||||
/datum/ai_holder/simple_mob/intentional/adv_dark_gygax/on_engagement(atom/A)
|
||||
// Make the AI backpeddle if using an AoE special attack.
|
||||
var/list/risky_intents = list(I_GRAB, I_HURT) // Mini-singulo and missiles.
|
||||
if(holder.a_intent in risky_intents)
|
||||
var/closest_distance = 1
|
||||
switch(holder.a_intent) // Plus one just in case.
|
||||
if(I_HURT)
|
||||
closest_distance = rocket_explosive_radius + 1
|
||||
if(I_GRAB)
|
||||
closest_distance = microsingulo_radius + 1
|
||||
|
||||
if(get_dist(holder, A) <= closest_distance)
|
||||
holder.IMove(get_step_away(holder, A, closest_distance))
|
||||
|
||||
// Otherwise get up close and personal.
|
||||
else if(get_dist(holder, A) > closest_desired_distance)
|
||||
holder.IMove(get_step_towards(holder, A))
|
||||
|
||||
// Changes the mob's intent, which controls which special attack is used.
|
||||
// I_DISARM causes Electric Defense, I_GRAB causes Micro-Singularity, and I_HURT causes Missile Barrage.
|
||||
/datum/ai_holder/simple_mob/intentional/adv_dark_gygax/pre_special_attack(atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/target = A
|
||||
|
||||
// If we're surrounded, Electric Defense will quickly fix that.
|
||||
var/tally = 0
|
||||
var/list/potential_targets = list_targets() // Returns list of mobs and certain objects like mechs and turrets.
|
||||
for(var/atom/movable/AM in potential_targets)
|
||||
if(get_dist(holder, AM) > electric_defense_radius)
|
||||
continue
|
||||
if(!can_attack(AM))
|
||||
continue
|
||||
tally++
|
||||
|
||||
// Should we shock them?
|
||||
if(tally >= electric_defense_threshold || get_dist(target, holder) <= electric_defense_radius)
|
||||
holder.a_intent = I_DISARM
|
||||
return
|
||||
|
||||
// Otherwise they're a fair distance away and we're not getting mobbed up close.
|
||||
// See if we should use missiles or microsingulo.
|
||||
tally = 0 // Let's recycle the var.
|
||||
for(var/atom/movable/AM in potential_targets)
|
||||
if(get_dist(target, AM) > microsingulo_radius) // Deliberately tests distance between target and nearby targets and not the holder.
|
||||
continue
|
||||
if(!can_attack(AM))
|
||||
continue
|
||||
if(AM.anchored) // Microsingulo doesn't do anything to anchored things.
|
||||
tally--
|
||||
else
|
||||
tally++
|
||||
|
||||
// Lots of people means minisingulo would be more useful.
|
||||
if(tally >= microsingulo_threshold)
|
||||
holder.a_intent = I_GRAB
|
||||
else // Otherwise use rockets.
|
||||
holder.a_intent = I_HURT
|
||||
|
||||
else
|
||||
if(get_dist(holder, A) >= rocket_explosive_radius + 1)
|
||||
holder.a_intent = I_HURT // Fire rockets if it's an obj/turf.
|
||||
else
|
||||
holder.a_intent = I_DISARM // Electricity might not work but it's safe up close.
|
||||
=======
|
||||
// Stronger than a regular Dark Gygax, this one has three special attacks, based on intents.
|
||||
// First special attack launches three arcing rockets at the current target.
|
||||
// Second special attack fires a projectile that creates a short-lived microsingularity that pulls in everything nearby. Magboots can protect from this.
|
||||
@@ -610,5 +345,4 @@
|
||||
if(get_dist(holder, A) >= rocket_explosive_radius + 1)
|
||||
holder.a_intent = I_HURT // Fire rockets if it's an obj/turf.
|
||||
else
|
||||
holder.a_intent = I_DISARM // Electricity might not work but it's safe up close.
|
||||
>>>>>>> 1afbe8d... Explorer Update - Cataloguers (#6016)
|
||||
holder.a_intent = I_DISARM // Electricity might not work but it's safe up close.
|
||||
|
||||
@@ -1,58 +1,3 @@
|
||||
<<<<<<< HEAD
|
||||
// Durands are slow, tanky, beefy, and hit really hard.
|
||||
// They can also root themselves to become even tankier.
|
||||
// The AI doesn't do this currently.
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/durand
|
||||
name = "durand"
|
||||
desc = "An aging combat exosuit utilized by many corporations. It was originally developed to fight in the First Contact War."
|
||||
icon_state = "durand"
|
||||
movement_cooldown = 10
|
||||
wreckage = /obj/structure/loot_pile/mecha/durand
|
||||
|
||||
maxHealth = 400
|
||||
deflect_chance = 20
|
||||
armor = list(
|
||||
"melee" = 50,
|
||||
"bullet" = 35,
|
||||
"laser" = 15,
|
||||
"energy" = 10,
|
||||
"bomb" = 20,
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
melee_damage_lower = 40
|
||||
melee_damage_upper = 40
|
||||
base_attack_cooldown = 2 SECONDS
|
||||
projectiletype = /obj/item/projectile/beam/heavylaser
|
||||
|
||||
var/defense_mode = FALSE
|
||||
var/defense_deflect = 35
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/durand/proc/set_defense_mode(new_mode)
|
||||
defense_mode = new_mode
|
||||
deflect_chance = defense_mode ? defense_deflect : initial(deflect_chance)
|
||||
to_chat(src, span("notice", "You [defense_mode ? "en" : "dis"]able defense mode."))
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/durand/SelfMove(turf/n, direct)
|
||||
if(defense_mode)
|
||||
to_chat(src, span("warning", "You are in defense mode, you cannot move."))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
// So players can toggle it too.
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/durand/verb/toggle_defense_mode()
|
||||
set name = "Toggle Defense Mode"
|
||||
set desc = "Toggles a special mode which makes you immobile and much more resilient."
|
||||
set category = "Abilities"
|
||||
|
||||
set_defense_mode(!defense_mode)
|
||||
|
||||
// Variant that starts in defense mode, perhaps for PoIs.
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/durand/defensive/Initialize()
|
||||
set_defense_mode(TRUE)
|
||||
return ..()
|
||||
=======
|
||||
// Durands are slow, tanky, beefy, and hit really hard.
|
||||
// They can also root themselves to become even tankier.
|
||||
// The AI doesn't do this currently.
|
||||
@@ -119,5 +64,4 @@
|
||||
// Variant that starts in defense mode, perhaps for PoIs.
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/durand/defensive/Initialize()
|
||||
set_defense_mode(TRUE)
|
||||
return ..()
|
||||
>>>>>>> 1afbe8d... Explorer Update - Cataloguers (#6016)
|
||||
return ..()
|
||||
|
||||
@@ -1,31 +1,3 @@
|
||||
<<<<<<< HEAD
|
||||
// Ranged, and capable of flight.
|
||||
/mob/living/simple_mob/mechanical/mecha/hoverpod
|
||||
name = "hover pod"
|
||||
desc = "Stubby and round, this space-capable craft is an ancient favorite. It has a jury-rigged welder-laser."
|
||||
icon_state = "engineering_pod"
|
||||
movement_sound = 'sound/machines/hiss.ogg'
|
||||
wreckage = /obj/structure/loot_pile/mecha/hoverpod
|
||||
|
||||
maxHealth = 150
|
||||
hovering = TRUE // Can fly.
|
||||
|
||||
projectiletype = /obj/item/projectile/beam
|
||||
base_attack_cooldown = 2 SECONDS
|
||||
|
||||
var/datum/effect/effect/system/ion_trail_follow/ion_trail
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/hoverpod/manned
|
||||
pilot_type = /mob/living/simple_mob/humanoid/merc/ranged
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/hoverpod/Initialize()
|
||||
ion_trail = new /datum/effect/effect/system/ion_trail_follow()
|
||||
ion_trail.set_up(src)
|
||||
ion_trail.start()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/hoverpod/Process_Spacemove(var/check_drift = 0)
|
||||
=======
|
||||
// Ranged, and capable of flight.
|
||||
|
||||
/datum/category_item/catalogue/technology/hoverpod
|
||||
@@ -65,6 +37,5 @@
|
||||
ion_trail.start()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/hoverpod/Process_Spacemove(var/check_drift = 0)
|
||||
>>>>>>> 1afbe8d... Explorer Update - Cataloguers (#6016)
|
||||
/mob/living/simple_mob/mechanical/mecha/hoverpod/Process_Spacemove(var/check_drift = 0)
|
||||
return TRUE
|
||||
@@ -1522,15 +1522,11 @@
|
||||
#include "code\modules\blob2\overmind\types.dm"
|
||||
#include "code\modules\busy_space\air_traffic.dm"
|
||||
#include "code\modules\busy_space\loremaster.dm"
|
||||
<<<<<<< HEAD:vorestation.dme
|
||||
#include "code\modules\busy_space_vr\organizations.dm"
|
||||
=======
|
||||
#include "code\modules\busy_space\organizations.dm"
|
||||
#include "code\modules\catalogue\atoms.dm"
|
||||
#include "code\modules\catalogue\catalogue_data.dm"
|
||||
#include "code\modules\catalogue\cataloguer.dm"
|
||||
#include "code\modules\catalogue\cataloguer_visuals.dm"
|
||||
>>>>>>> 1afbe8d... Explorer Update - Cataloguers (#6016):polaris.dme
|
||||
#include "code\modules\client\client defines.dm"
|
||||
#include "code\modules\client\client procs.dm"
|
||||
#include "code\modules\client\movement.dm"
|
||||
|
||||
Reference in New Issue
Block a user