Adds basic hostile silicon mobs: borgs and mechs (#31481)

* Adds basic hostile silicon mobs: Cyborgs and Mechs

* DVORAK

* Map fix

* Apply suggestion from @Burzah

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

* Update code/modules/mob/living/basic/hostile/silicon/hostile_mechs.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

* Apply suggestion from @Burzah

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

* Update code/modules/mob/living/basic/hostile/silicon/hostile_mechs.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

* Update code/modules/mob/living/basic/hostile/silicon/hostile_mechs.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

* Update code/modules/mob/living/basic/hostile/silicon/hostile_mechs.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

---------

Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
PollardTheDragon
2026-02-11 22:20:27 +00:00
committed by GitHub
co-authored by Burzah
parent 4fa5017709
commit 33652c77c9
10 changed files with 585 additions and 55 deletions
@@ -0,0 +1,160 @@
/mob/living/basic/malfborg
name = "malfunctioning cyborg"
desc = "It doesn't appear to obey the laws of robotics."
icon = 'icons/mob/robots.dmi'
icon_state = "Noble"
health = 200
maxHealth = 200
faction = list("malf_drone")
mob_biotypes = MOB_ROBOTIC
speed = 0.5
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minimum_survivable_temperature = 0
speak_emote = list("states")
a_intent = INTENT_HARM
harm_intent_damage = 0
melee_damage_lower = 25
melee_damage_upper = 35
attack_verb_simple = "slash"
attack_verb_continuous = "slashes"
melee_attack_cooldown_min = 1.5 SECONDS
melee_attack_cooldown_min = 2.5 SECONDS
initial_traits = list(TRAIT_NOFIRE)
attack_sound = 'sound/weapons/blade1.ogg'
is_ranged = TRUE
projectile_type = /obj/projectile/beam/laser
projectile_sound = 'sound/weapons/laser.ogg'
death_sound = 'sound/voice/borg_deathsound.ogg'
ranged_burst_count = 2
death_message = "blows apart!"
bubble_icon = "machine"
basic_mob_flags = DEL_ON_DEATH
ai_controller = /datum/ai_controller/basic_controller/malfborg
/mob/living/basic/malfborg/Initialize(mapload)
. = ..()
AddComponent(/datum/component/aggro_emote, emote_list = list("beeps", "buzzes"), emote_chance = 50)
add_language("Galactic Common")
set_default_language(GLOB.all_languages["Galactic Common"])
AddElement(/datum/element/ai_retaliate)
/mob/living/basic/malfborg/emp_act(severity)
. = ..()
ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET)
adjustBruteLoss(50)
/mob/living/basic/malfborg/death(gibbed)
// Only execute the below if we successfully died
. = ..(gibbed)
if(!.)
return FALSE
do_sparks(3, 1, src)
new /obj/effect/gibspawner/robot(get_turf(src))
/mob/living/basic/malfborg/sec
name = "security cyborg"
desc = "Oh god they still have access to these!"
icon_state = "Noble-Security"
attack_verb_simple = "baton"
attack_verb_continuous = "batons"
projectile_type = /obj/projectile/beam/disabler/weak
projectile_sound = 'sound/weapons/taser2.ogg'
var/obj/item/melee/baton/infinite_cell/baton = null // stunbaton bot uses to melee attack
/mob/living/basic/malfborg/sec/Initialize(mapload)
. = ..()
baton = new(src)
/mob/living/basic/malfborg/sec/melee_attack(atom/target, list/modifiers, ignore_cooldown)
if(!early_melee_attack(target, modifiers, ignore_cooldown))
return FALSE
if(QDELETED(target))
return FALSE
face_atom(target)
baton.melee_attack_chain(src, target)
SEND_SIGNAL(src, COMSIG_HOSTILE_POST_ATTACKINGTARGET, target, TRUE)
return TRUE
/mob/living/basic/malfborg/sec/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
if(!used_item && !isturf(A))
used_item = baton
..()
/mob/living/basic/malfborg/sec/Destroy()
QDEL_NULL(baton)
return ..()
/mob/living/basic/malfborg/sec/engi // Engiborg has a batonga. Might as well inherit it.
name = "engineering cyborg"
desc = "Don't let this one near the engine."
icon_state = "Noble-Engineering"
projectile_type = /obj/projectile/beam/emitter
projectile_sound = 'sound/weapons/emitter.ogg'
ranged_burst_count = 1
ranged_cooldown = 1.5 SECONDS
/mob/living/basic/malfborg/sec/combat
name = "combat cyborg"
desc = "One of Central Command's own, subverted to work for a hostile AI."
icon_state = "Bloodhound_Combat"
attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
casing_type = /obj/item/ammo_casing/caseless/multi_immolator
projectile_type = null
projectile_sound = 'sound/weapons/laser3.ogg'
ranged_burst_count = 1
ranged_cooldown = 1.5 SECONDS
/mob/living/basic/malfborg/service
name = "service cyborg"
desc = "It's ready to serve an ass kicking."
icon_state = "Noble-Service"
melee_damage_lower = 15
melee_damage_upper = 25
attack_verb_simple = "slam"
attack_verb_continuous = "slams"
attack_sound = 'sound/weapons/guitarslam.ogg'
projectile_type = null
casing_type = /obj/item/ammo_casing/caseless/eshotgun
ranged_burst_count = 1
ranged_cooldown = 1.5 SECONDS
/obj/item/ammo_casing/caseless/eshotgun
projectile_type = /obj/projectile/beam/scatter/eshotgun
pellets = 6
variance = 25
fire_sound = 'sound/weapons/laser.ogg'
/obj/item/ammo_casing/caseless/multi_immolator
projectile_type = /obj/projectile/beam/immolator/weak
pellets = 6
variance = 25
fire_sound = 'sound/weapons/laser3.ogg'
/mob/living/basic/malfborg/mining
name = "mining cyborg"
desc = "It digs holes in organic flesh."
icon_state = "Noble-DIG"
melee_damage_lower = 20
melee_damage_upper = 30
attack_verb_simple = "mine"
attack_verb_continuous = "mines"
attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
projectile_type = /obj/projectile/kinetic/malf
projectile_sound = 'sound/weapons/kenetic_accel.ogg'
ranged_burst_count = 1
/datum/ai_controller/basic_controller/malfborg
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
)
ai_movement = /datum/ai_movement/jps
idle_behavior = /datum/idle_behavior/idle_random_walk
interesting_dist = AI_SIMPLE_INTERESTING_DIST
planning_subtrees = list(
/datum/ai_planning_subtree/target_retaliate/check_faction,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/ranged_skirmish,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
)
@@ -0,0 +1,39 @@
/datum/action/cooldown/mob_cooldown/hostile_mech
button_icon = 'icons/mecha/mecha_equipment.dmi'
button_icon_state = "mecha_uac2"
/datum/action/cooldown/mob_cooldown/hostile_mech/launcher
name = "launch"
button_icon_state = "mecha_missilerack_six"
desc = ABSTRACT_TYPE_DESC
melee_cooldown_time = CLICK_CD_CLICK_ABILITY
cooldown_time = 6 SECONDS
shared_cooldown = NONE
var/obj/projectile/projectile
/datum/action/cooldown/mob_cooldown/hostile_mech/launcher/Activate(atom/target)
. = ..()
var/mob/living/basic/hostile_mech/mech = owner
if(!istype(mech))
return
mech.shoot_projectile(target, projectile)
playsound(get_turf(mech), 'sound/effects/bang.ogg', 100, TRUE)
StartCooldown()
/datum/action/cooldown/mob_cooldown/hostile_mech/bola_launcher
name = "Bola Launcher"
desc = "Fire a bola at the target."
button_icon = "mecha_bola"
cooldown_time = 20 SECONDS
/datum/action/cooldown/mob_cooldown/hostile_mech/bola_launcher/Activate(atom/target)
. = ..()
var/mob/living/basic/hostile_mech/mech = owner
if(!istype(mech))
return
var/obj/item/restraints/legcuffs/bola/bola = new /obj/item/restraints/legcuffs/bola(mech.loc)
bola.throw_at(target, 7, 1)
playsound(get_turf(mech), 'sound/weapons/whip.ogg', 100, TRUE)
StartCooldown()
@@ -0,0 +1,354 @@
/mob/living/basic/hostile_mech
name = "hostile mech"
desc = "I'm a base type and someone was bad and spawned me."
icon = 'icons/mecha/mecha.dmi'
icon_state = "ripley"
health = 300
maxHealth = 300
faction = list("malf_drone")
mob_biotypes = MOB_ROBOTIC
sentience_type = SENTIENCE_ARTIFICIAL
move_resist = MOVE_FORCE_OVERPOWERING
pull_force = MOVE_FORCE_OVERPOWERING
flags_2 = IMMUNE_TO_SHUTTLECRUSH_2
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minimum_survivable_temperature = 0
maximum_survivable_temperature = 20000
environment_smash = ENVIRONMENT_SMASH_RWALLS
speak_emote = list("states")
a_intent = INTENT_HARM
harm_intent_damage = 0
melee_damage_lower = 30
melee_damage_upper = 40
attack_verb_simple = "smash"
attack_verb_continuous = "smashes"
melee_attack_cooldown_min = 1.5 SECONDS
melee_attack_cooldown_min = 2.5 SECONDS
damage_coeff = list(BRUTE = 0.7, BURN = 0.6, TOX = 0, STAMINA = 0, OXY = 0)
initial_traits = list(TRAIT_NOFIRE)
is_ranged = TRUE
projectile_type = /obj/projectile/beam/laser
projectile_sound = 'sound/weapons/laser.ogg'
ranged_burst_interval = 0.3 SECONDS
death_message = "breaks apart!"
bubble_icon = "machine"
basic_mob_flags = DEL_ON_DEATH
ai_controller = /datum/ai_controller/basic_controller/evil_mech
/// Weapon types the mech has
var/list/weapon_types = list()
/// Time until next move
var/can_move = 0
/// Amount of time to add on move
var/step_in = 1 SECONDS
/// Chance the mech bounces a hit
var/deflect_chance = 15
/// Does the mech use a punch?
var/mech_punch = FALSE
/// Actions to grant on Initialize
var/list/innate_actions = list()
/mob/living/basic/hostile_mech/Initialize(mapload)
. = ..()
AddComponent(/datum/component/aggro_emote, aggro_sound = 'sound/misc/interference.ogg', aggro_volume = 100, emote_chance = 50, sound_vary = FALSE)
add_language("Galactic Common")
set_default_language(GLOB.all_languages["Galactic Common"])
AddElement(/datum/element/ai_retaliate)
grant_actions_by_list(innate_actions)
RegisterSignal(src, COMSIG_BASICMOB_PRE_ATTACK_RANGED, PROC_REF(cycle_weapon))
update_icon(UPDATE_OVERLAYS)
/mob/living/basic/hostile_mech/emp_act(severity)
. = ..()
adjustBruteLoss(30 / severity)
if(prob(25))
apply_effect(3 SECONDS, STUN, 0)
playsound(get_turf(src), 'sound/mecha/internaldmgalarm.ogg', 100, FALSE)
/mob/living/basic/hostile_mech/death(gibbed)
// Only execute the below if we successfully died
do_sparks(3, TRUE, src)
playsound(get_turf(src), 'sound/mecha/critdestrsyndi.ogg', 100, FALSE)
. = ..(gibbed)
if(!.)
return FALSE
/mob/living/basic/hostile_mech/update_overlays()
. = ..()
underlays.Cut()
underlays += emissive_appearance('icons/mecha/mecha_emissive.dmi', "[icon_state]_lightmask")
/mob/living/basic/hostile_mech/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
if(has_gravity(src))
return TRUE
if(isspaceturf(get_turf(src)))
new /obj/effect/particle_effect/ion_trails(get_turf(src), dir)
return TRUE
/mob/living/basic/hostile_mech/attack_by(obj/item/attacking, mob/living/user, params)
if(prob(deflect_chance))
return
. = ..()
if(prob(25))
do_sparks(3, TRUE, src)
/mob/living/basic/hostile_mech/melee_attack(atom/target, list/modifiers, ignore_cooldown)
. = ..()
if(mech_punch && isliving(target))
var/mob/living/L = target
step_away(L, src, 15)
L.Paralyse(2 SECONDS)
/mob/living/basic/hostile_mech/Move(atom/destination)
if(can_move >= world.time)
return FALSE
. = ..()
playsound(get_turf(src), 'sound/mecha/mechstep.ogg', 100, TRUE)
can_move = world.time + step_in
/// Proc used for switching weapons
/mob/living/basic/hostile_mech/proc/cycle_weapon()
if(!prob(25)) // 75% chance we keep using the existing weapon
return
select_new_weapon()
update_ranged_weapon()
/mob/living/basic/hostile_mech/proc/select_new_weapon()
return
/mob/living/basic/hostile_mech/proc/update_ranged_weapon()
var/datum/component/ranged_attacks/comp = GetComponent(/datum/component/ranged_attacks)
if(projectile_type)
comp.projectile_type = projectile_type
comp.casing_type = null
else if(casing_type)
comp.casing_type = casing_type
comp.projectile_type = null
comp.projectile_sound = projectile_sound
comp.burst_shots = ranged_burst_count
/mob/living/basic/hostile_mech/proc/shoot_projectile(atom/target_atom, obj/projectile/thing_to_shoot, set_angle)
var/turf/startloc = get_turf(src)
dir = get_dir(src, target_atom)
if(!startloc || !target_atom)
return
var/obj/projectile/P = new thing_to_shoot(startloc)
P.preparePixelProjectile(target_atom, startloc)
P.firer = src
P.firer_source_atom = src
if(isnum(set_angle))
P.fire(set_angle)
else
P.fire()
/datum/ai_controller/basic_controller/evil_mech
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
)
ai_movement = /datum/ai_movement/jps // Need this for smashing through walls
idle_behavior = /datum/idle_behavior/idle_random_walk
interesting_dist = AI_SIMPLE_INTERESTING_DIST
planning_subtrees = list(
/datum/ai_planning_subtree/target_retaliate/check_faction,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/targeted_mob_ability/evil_mech_weaponry,
/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic,
/datum/ai_planning_subtree/ranged_skirmish/hostile_mech,
/datum/ai_planning_subtree/attack_obstacle_in_path/walls,
)
/datum/ai_planning_subtree/ranged_skirmish/hostile_mech
min_range = 0
/datum/ai_planning_subtree/targeted_mob_ability/evil_mech_weaponry
ability_key = BB_HOSTILE_MECH_SECONDARY_WEAPON
/// Minimum time between any firing
var/weapon_swap_delay = 2 SECONDS
/datum/ai_planning_subtree/targeted_mob_ability/evil_mech_weaponry/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
if(controller.blackboard[BB_HOSTILE_MECH_WEAPON_COOLDOWN] >= world.time)
return
var/list/ability_keys = list(BB_HOSTILE_MECH_SECONDARY_WEAPON, BB_HOSTILE_MECH_TERTIARY_WEAPON)
ability_key = pick_n_take(ability_keys)
var/datum/action/cooldown/mob_cooldown/selected_action = controller.blackboard[ability_key]
while(selected_action && !selected_action.IsAvailable())
if(!ability_keys.len) // All extras are on cooldown
return
ability_key = pick_n_take(ability_keys)
selected_action = controller.blackboard[ability_key]
controller.set_blackboard_key(BB_HOSTILE_MECH_WEAPON_COOLDOWN, world.time + weapon_swap_delay)
return ..()
/mob/living/basic/hostile_mech/ripley
name = "hostile ripley"
desc = "A hacked Ripley mech, armed with a malfunctioning grenade launcher, heavy plasma cutter, and a drill."
melee_damage_lower = 10
melee_damage_upper = 15
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
attack_verb_simple = "drill"
attack_verb_continuous = "drills"
melee_attack_cooldown_min = 0.5 SECONDS
melee_attack_cooldown_min = 1.5 SECONDS
attack_sound = 'sound/weapons/drill.ogg'
projectile_type = /obj/projectile/plasma/adv/mech/evil
loot = list(/obj/structure/mecha_wreckage/ripley)
weapon_types = list("217-D Heavy Plasma Cutter", "\"Fat Boy\" Mining Grenade Launcher")
/mob/living/basic/hostile_mech/ripley/select_new_weapon()
var/new_weapon = pick(weapon_types)
switch(new_weapon)
if("217-D Heavy Plasma Cutter")
projectile_type = /obj/projectile/plasma/adv/mech/evil
projectile_sound = 'sound/weapons/laser.ogg'
if("\"Fat Boy\" Mining Grenade Launcher")
projectile_type = /obj/projectile/bullet/a40mm
projectile_sound = 'sound/effects/bang.ogg'
visible_message(SPAN_WARNING("[src] raises its [new_weapon]!"))
/obj/projectile/plasma/adv/mech/evil
damage = 15
/mob/living/basic/hostile_mech/gygax
name = "hostile gygax"
desc = "A hacked gygax mech, armed with a small missile pod, heavy LMG, and a bola launcher."
icon_state = "gygax"
health = 250
maxHealth = 250
melee_damage_lower = 25
melee_damage_upper = 35
damage_coeff = list(BRUTE = 0.8, BURN = 0.75, TOX = 0, STAMINA = 0, OXY = 0)
projectile_type = /obj/projectile/bullet/weakbullet3
ranged_burst_count = 3
ranged_cooldown = 1.5 SECONDS
projectile_sound = 'sound/weapons/gunshots/gunshot_mg.ogg'
innate_actions = list(
/datum/action/cooldown/mob_cooldown/hostile_mech/bola_launcher = BB_HOSTILE_MECH_SECONDARY_WEAPON
)
step_in = 0.3 SECONDS
mech_punch = TRUE
deflect_chance = 5
loot = list(/obj/structure/mecha_wreckage/gygax)
weapon_types = list("SRM-8 Light Missile Rack", "Ultra AC 2")
/mob/living/basic/hostile_mech/gygax/select_new_weapon()
var/new_weapon = pick(weapon_types)
switch(new_weapon)
if("SRM-8 Light Missile Rack")
projectile_type = /obj/projectile/missile/light
ranged_burst_count = 1
projectile_sound = 'sound/effects/bang.ogg'
if("Ultra AC 2")
projectile_type = /obj/projectile/bullet/weakbullet3
ranged_burst_count = 3
projectile_sound = 'sound/weapons/gunshots/gunshot_mg.ogg'
visible_message(SPAN_WARNING("[src] raises its [new_weapon]!"))
/mob/living/basic/hostile_mech/durand
name = "hostile durand"
desc = "A hacked Durand mech, armed with a small missile pod, Solaris laser cannon, and a scattershot shotgun."
icon_state = "durand"
health = 400
maxHealth = 400
melee_damage_lower = 35
melee_damage_upper = 45
damage_coeff = list(BRUTE = 0.6, BURN = 0.85, TOX = 0, STAMINA = 0, OXY = 0)
projectile_type = /obj/projectile/beam/laser/heavylaser
ranged_burst_interval = 1 SECONDS
ranged_cooldown = 1.5 SECONDS
projectile_sound = 'sound/weapons/lasercannonfire.ogg'
step_in = 0.4 SECONDS
mech_punch = TRUE
deflect_chance = 20
loot = list(/obj/structure/mecha_wreckage/durand)
weapon_types = list("SRM-8 Light Missile Rack", "CH-LC \"Solaris\" Laser Cannon", "LBX AC 10 \"Scattershot\"")
/mob/living/basic/hostile_mech/durand/select_new_weapon()
var/new_weapon = pick(weapon_types)
switch(new_weapon)
if("SRM-8 Light Missile Rack")
casing_type = null
projectile_type = /obj/projectile/missile/light
projectile_sound = 'sound/effects/bang.ogg'
if("CH-LC \"Solaris\" Laser Cannon")
casing_type = null
projectile_type = /obj/projectile/beam/laser/heavylaser
projectile_sound = 'sound/weapons/lasercannonfire.ogg'
if("LBX AC 10 \"Scattershot\"")
casing_type = /obj/item/ammo_casing/caseless/mecha_scatter
projectile_type = null
projectile_sound = 'sound/weapons/gunshots/gunshot_shotgun.ogg'
visible_message(SPAN_WARNING("[src] raises its [new_weapon]!"))
/mob/living/basic/hostile_mech/ares
name = "hostile ares"
desc = "A hacked Ares mech, armed with a Solaris laser cannon, xray laser rifle, and an AC6 light machine gun."
icon_state = "ares"
health = 450
maxHealth = 450
melee_damage_lower = 35
melee_damage_upper = 45
damage_coeff = list(BRUTE = 0.5, BURN = 0.6, TOX = 0, STAMINA = 0, OXY = 0)
projectile_type = /obj/projectile/beam/xray
ranged_cooldown = 1.5 SECONDS
projectile_sound = 'sound/weapons/laser3.ogg'
step_in = 0.4 SECONDS
mech_punch = TRUE
deflect_chance = 25
loot = list(/obj/structure/mecha_wreckage/ares)
weapon_types = list("S-1 X-Ray Projector", "CH-LC \"Solaris\" Laser Cannon", "Ultra AC 2")
/mob/living/basic/hostile_mech/ares/select_new_weapon()
var/new_weapon = pick(weapon_types)
switch(new_weapon)
if("S-1 X-Ray Projector")
projectile_type = /obj/projectile/beam/xray
ranged_burst_count = 1
projectile_sound = 'sound/weapons/laser3.ogg'
if("CH-LC \"Solaris\" Laser Cannon")
projectile_type = /obj/projectile/beam/laser/heavylaser
ranged_burst_count = 1
projectile_sound = 'sound/weapons/lasercannonfire.ogg'
if("Ultra AC 2")
projectile_type = /obj/projectile/bullet/weakbullet3
ranged_burst_count = 3
projectile_sound = 'sound/weapons/gunshots/gunshot_mg.ogg'
visible_message(SPAN_WARNING("[src] raises its [new_weapon]!"))
/mob/living/basic/hostile_mech/marauder
name = "hostile marauder"
desc = "A hacked Marauder mech, armed with a pulse laser cannon, xray laser rifle, and a light missile launcher."
icon_state = "marauder"
health = 500
maxHealth = 500
melee_damage_lower = 35
melee_damage_upper = 45
damage_coeff = list(BRUTE = 0.5, BURN = 0.55, TOX = 0, STAMINA = 0, OXY = 0)
projectile_type = /obj/projectile/beam/xray
ranged_cooldown = 1.5 SECONDS
projectile_sound = 'sound/weapons/laser3.ogg'
step_in = 0.4 SECONDS
mech_punch = TRUE
deflect_chance = 25
loot = list(/obj/structure/mecha_wreckage/ares)
weapon_types = list("S-1 X-Ray Projector", "eZ-13 mk2 Heavy Pulse Rifle", "SRM-8 Light Missile Rack")
/mob/living/basic/hostile_mech/marauder/select_new_weapon()
var/new_weapon = pick(weapon_types)
switch(new_weapon)
if("S-1 X-Ray Projector")
projectile_type = /obj/projectile/beam/xray
projectile_sound = 'sound/weapons/laser3.ogg'
if("eZ-13 mk2 Heavy Pulse Rifle")
projectile_type = /obj/projectile/beam/pulse/hitscan/heavy
projectile_sound = 'sound/weapons/marauder.ogg'
if("SRM-8 Light Missile Rack")
projectile_type = /obj/projectile/missile/light
projectile_sound = 'sound/effects/bang.ogg'
visible_message(SPAN_WARNING("[src] raises its [new_weapon]!"))
/obj/item/ammo_casing/caseless/mecha_scatter
projectile_type = /obj/projectile/bullet/midbullet2
pellets = 4
variance = 25
fire_sound = 'sound/weapons/gunshots/gunshot_shotgun.ogg'