diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 5a1c57ff53..abf0a15446 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -133,9 +133,6 @@
return 0
return 1
-/obj/item/mecha_parts/mecha_equipment/proc/handle_movement_action() //Any modules that have special effects or needs when taking a step or floating through space.
- return
-
/obj/item/mecha_parts/mecha_equipment/proc/action(atom/target)
return
diff --git a/code/game/mecha/equipment/mecha_equipment_dynamicprocs.dm b/code/game/mecha/equipment/mecha_equipment_dynamicprocs.dm
new file mode 100644
index 0000000000..9166e6a3de
--- /dev/null
+++ b/code/game/mecha/equipment/mecha_equipment_dynamicprocs.dm
@@ -0,0 +1,19 @@
+/*
+ * File containing all the default 'handlers' for Exosuit equipment, hopefully to make all dynX calls extinct.
+ */
+
+// Used for impacting (thrown) objects, and damage value.
+/obj/item/mecha_parts/mecha_equipment/proc/handle_ranged_contact(var/obj/A, var/inc_damage = 0)
+ return max(0, inc_damage)
+
+// Used for melee strikes with an object, and a mob, and damage value.
+/obj/item/mecha_parts/mecha_equipment/proc/handle_melee_contact(var/obj/item/weapon/W, var/mob/living/user, var/inc_damage = 0)
+ return max(0, inc_damage)
+
+// Used for projectile impacts from bullet_act.
+/obj/item/mecha_parts/mecha_equipment/proc/handle_projectile_contact(var/obj/item/projectile/Proj, var/inc_damage = 0)
+ return max(0, inc_damage)
+
+// Used for on-movement actions.
+/obj/item/mecha_parts/mecha_equipment/proc/handle_movement_action() //Any modules that have special effects or needs when taking a step or floating through space.
+ return
diff --git a/code/game/mecha/equipment/tools/armor_melee.dm b/code/game/mecha/equipment/tools/armor_melee.dm
index a723882657..8390a2cc52 100644
--- a/code/game/mecha/equipment/tools/armor_melee.dm
+++ b/code/game/mecha/equipment/tools/armor_melee.dm
@@ -11,6 +11,30 @@
equip_type = EQUIP_HULL
+/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/get_equip_info()
+ if(!chassis) return
+ return "* [src.name]"
+
+/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/handle_melee_contact(var/obj/item/weapon/W, var/mob/living/user, var/inc_damage = null)
+ if(!action_checks(user))
+ return inc_damage
+ chassis.log_message("Attacked by [W]. Attacker - [user]")
+ if(prob(chassis.deflect_chance*deflect_coeff))
+ to_chat(user, "\The [W] bounces off \the [chassis]'s armor.")
+ chassis.log_append_to_last("Armor saved.")
+ inc_damage = 0
+ else
+ chassis.occupant_message("\The [user] hits [chassis] with [W].")
+ user.visible_message("\The [user] hits [chassis] with [W].", "You hit [src] with [W].")
+ inc_damage *= damage_coeff
+ set_ready_state(0)
+ chassis.use_power(energy_drain)
+ spawn()
+ do_after_cooldown()
+ return max(0, inc_damage)
+
+/*
+
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/can_attach(obj/mecha/M as obj)
if(..())
if(!M.proc_res["dynattackby"])
@@ -27,10 +51,6 @@
..()
return
-/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/get_equip_info()
- if(!chassis) return
- return "* [src.name]"
-
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob)
if(!action_checks(user))
return chassis.dynattackby(W,user)
@@ -46,4 +66,5 @@
set_ready_state(0)
chassis.use_power(energy_drain)
do_after_cooldown()
- return
\ No newline at end of file
+ return
+*/
diff --git a/code/game/mecha/equipment/tools/armor_ranged.dm b/code/game/mecha/equipment/tools/armor_ranged.dm
index 2e3523275f..4fb3aac32b 100644
--- a/code/game/mecha/equipment/tools/armor_ranged.dm
+++ b/code/game/mecha/equipment/tools/armor_ranged.dm
@@ -11,6 +11,45 @@
equip_type = EQUIP_HULL
+/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/handle_projectile_contact(var/obj/item/projectile/Proj, var/inc_damage)
+ if(istype(Proj, /obj/item/projectile/test))
+ return inc_damage// Don't care about test projectiles, just what comes after them
+ if(!action_checks(src))
+ return inc_damage
+ if(prob(chassis.deflect_chance*deflect_coeff))
+ chassis.occupant_message("The armor deflects incoming projectile.")
+ chassis.visible_message("The [chassis.name] armor deflects the projectile.")
+ chassis.log_append_to_last("Armor saved.")
+ inc_damage = 0
+ else
+ inc_damage *= src.damage_coeff
+ set_ready_state(0)
+ chassis.use_power(energy_drain)
+ spawn()
+ do_after_cooldown()
+ return max(0, inc_damage)
+
+/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/handle_ranged_contact(var/obj/A, var/inc_damage = 0)
+ if(!action_checks(A))
+ return inc_damage
+ if(prob(chassis.deflect_chance*deflect_coeff))
+ chassis.occupant_message("The [A] bounces off the armor.")
+ chassis.visible_message("The [A] bounces off \the [chassis]'s armor")
+ chassis.log_append_to_last("Armor saved.")
+ inc_damage = 0
+ else if(istype(A, /obj))
+ inc_damage *= damage_coeff
+ set_ready_state(0)
+ chassis.use_power(energy_drain)
+ spawn()
+ do_after_cooldown()
+ return max(0, inc_damage)
+
+/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/get_equip_info()
+ if(!chassis) return
+ return "* [src.name]"
+
+/*
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/can_attach(obj/mecha/M as obj)
if(..())
if(!M.proc_res["dynbulletdamage"] && !M.proc_res["dynhitby"])
@@ -29,10 +68,6 @@
..()
return
-/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/get_equip_info()
- if(!chassis) return
- return "* [src.name]"
-
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/proc/dynbulletdamage(var/obj/item/projectile/Proj)
if(istype(Proj, /obj/item/projectile/test))
return // Don't care about test projectiles, just what comes after them
@@ -69,4 +104,5 @@
set_ready_state(0)
chassis.use_power(energy_drain)
do_after_cooldown()
- return
\ No newline at end of file
+ return
+*/
diff --git a/code/game/mecha/equipment/tools/hardpoint_actuator.dm b/code/game/mecha/equipment/tools/hardpoint_actuator.dm
new file mode 100644
index 0000000000..735fec6f96
--- /dev/null
+++ b/code/game/mecha/equipment/tools/hardpoint_actuator.dm
@@ -0,0 +1,34 @@
+/*
+ * A special device used to pick up and equip other exosuit components on the fly, without leaving an Exosuit. Costly.
+ */
+
+/obj/item/mecha_parts/mecha_equipment/hardpoint_actuator
+ name = "hardpoint actuator clamp"
+ icon_state = "mecha_clamp"
+ equip_cooldown = 10 SECONDS
+ energy_drain = 600
+ equip_type = EQUIP_HULL
+ origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_POWER = 4, TECH_COMBAT = 1, TECH_MAGNET = 4)
+
+/obj/item/mecha_parts/mecha_equipment/hardpoint_actuator/action(atom/target)
+ if(!action_checks(target))
+ return
+
+ if(istype(target,/obj/item/mecha_parts/mecha_equipment))
+ var/obj/item/mecha_parts/mecha_equipment/ME = target
+ if(ME.can_attach(chassis))
+ occupant_message("[ME] can be integrated. Stand by.")
+ if(do_after(chassis.occupant, 3 SECONDS, target))
+ if(ME.can_attach(chassis) && action_checks(target))
+ ME.attach(chassis)
+ occupant_message("[ME] successfully integrated.")
+ else
+ occupant_message("[ME] cannot be integrated due to lack of free hardpoints.")
+
+ else
+ occupant_message("[target] is not compatible with any present hardpoints.")
+
+ set_ready_state(0)
+ chassis.use_power(energy_drain)
+ do_after_cooldown()
+ return
diff --git a/code/game/mecha/equipment/tools/inflatables.dm b/code/game/mecha/equipment/tools/inflatables.dm
new file mode 100644
index 0000000000..b18ba2eae1
--- /dev/null
+++ b/code/game/mecha/equipment/tools/inflatables.dm
@@ -0,0 +1,47 @@
+/obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables
+ name = "inflatable deployment mechanism"
+ desc = "An exosuit-mounted inflatable barrier deployer. Useful!"
+ icon_state = "mecha_inflatables"
+ origin_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3)
+ equip_cooldown = 3
+ energy_drain = 30
+ range = MELEE
+ equip_type = EQUIP_UTILITY
+ ready_sound = 'sound/effects/spray.ogg'
+ required_type = list(/obj/mecha/working/ripley)
+
+ tooltype = /obj/item/weapon/inflatable_dispenser/robot
+ var/obj/item/weapon/inflatable_dispenser/my_deployer = null
+
+/obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables/Initialize()
+ ..()
+ my_deployer = my_tool
+
+/obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables/Topic(href, href_list)
+ ..()
+ if(href_list["toggle_deployable_mode"])
+ my_deployer.attack_self()
+ update_chassis_page()
+ return
+
+/obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables/get_equip_info()
+ if(!chassis) return
+ var/data_return = "* [chassis.selected==src?"":""][src.name][chassis.selected==src?"":""] - Deploy [my_deployer.mode?"Door":"Wall"]
\
+ - Doors left: [my_deployer.stored_doors]/[my_deployer.max_doors]
\
+ - Walls left: [my_deployer.stored_walls]/[my_deployer.max_walls]"
+
+ return data_return
+
+/obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables/action(atom/target, params)
+ if(!action_checks(target))
+ return
+
+ if(istype(target, /turf))
+ my_deployer.try_deploy_inflatable(target, chassis.occupant)
+ if(istype(target, /obj/item/inflatable) || istype(target, /obj/structure/inflatable))
+ my_deployer.pick_up(target, chassis.occupant)
+
+ set_ready_state(0)
+ chassis.use_power(energy_drain)
+ do_after_cooldown()
+ return
diff --git a/code/game/mecha/equipment/tools/passenger.dm b/code/game/mecha/equipment/tools/passenger.dm
index a84dc2981b..8ce9d21aa9 100644
--- a/code/game/mecha/equipment/tools/passenger.dm
+++ b/code/game/mecha/equipment/tools/passenger.dm
@@ -1,7 +1,7 @@
/obj/item/mecha_parts/mecha_equipment/tool/passenger
name = "passenger compartment"
desc = "A mountable passenger compartment for exosuits. Rather cramped."
- icon_state = "mecha_abooster_ccw"
+ icon_state = "mecha_passenger"
origin_tech = list(TECH_ENGINEERING = 1, TECH_BIO = 1)
energy_drain = 10
range = MELEE
diff --git a/code/game/mecha/equipment/tools/wrench.dm b/code/game/mecha/equipment/tools/powertool.dm
similarity index 66%
rename from code/game/mecha/equipment/tools/wrench.dm
rename to code/game/mecha/equipment/tools/powertool.dm
index 605c2ee33d..0adcb98929 100644
--- a/code/game/mecha/equipment/tools/wrench.dm
+++ b/code/game/mecha/equipment/tools/powertool.dm
@@ -38,4 +38,18 @@
desc = "An exosuit-mounted pneumatic prybar."
icon_state = "mecha_crowbar"
tooltype = /obj/item/weapon/tool/crowbar/power
- ready_sound = 'sound/mecha/gasdisconnected.ogg'
\ No newline at end of file
+ ready_sound = 'sound/mecha/gasdisconnected.ogg'
+
+/obj/item/mecha_parts/mecha_equipment/tool/powertool/cutter
+ name = "pneumatic cablecutter"
+ desc = "An exosuit-mounted pneumatic cablecutter."
+ icon_state = "mecha_cablecutter"
+ tooltype = /obj/item/weapon/tool/wirecutters/power
+ ready_sound = 'sound/mecha/gasdisconnected.ogg'
+
+/obj/item/mecha_parts/mecha_equipment/tool/powertool/screwdriver
+ name = "pneumatic screwdriver"
+ desc = "An exosuit-mounted pneumatic screwdriver."
+ icon_state = "mecha_screwdriver"
+ tooltype = /obj/item/weapon/tool/screwdriver/power
+ ready_sound = 'sound/mecha/gasdisconnected.ogg'
diff --git a/code/game/mecha/equipment/tools/weldinglaser.dm b/code/game/mecha/equipment/tools/weldinglaser.dm
new file mode 100644
index 0000000000..ff1c5733a5
--- /dev/null
+++ b/code/game/mecha/equipment/tools/weldinglaser.dm
@@ -0,0 +1,34 @@
+/obj/item/mecha_parts/mecha_equipment/tool/powertool/welding
+ name = "welding laser"
+ desc = "An exosuit-mounted welding laser."
+ icon_state = "mecha_laser-rig"
+ origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_POWER = 4, TECH_PHORON = 2)
+ equip_cooldown = 3
+ energy_drain = 15
+ range = MELEE
+ equip_type = EQUIP_UTILITY
+ ready_sound = 'sound/items/Ratchet.ogg'
+ required_type = list(/obj/mecha/working/ripley)
+
+ tooltype = /obj/item/weapon/weldingtool/electric/mounted/exosuit
+
+/obj/item/mecha_parts/mecha_equipment/tool/powertool/welding/action(var/atom/target)
+ ..()
+
+ var/datum/beam/weld_beam = null
+ if(is_ranged())
+ var/atom/movable/beam_origin = chassis
+ weld_beam = beam_origin.Beam(target, icon_state = "solar_beam", time = 0.3 SECONDS)
+
+ if(!do_after(chassis.occupant, 0.3 SECONDS, target))
+ qdel(weld_beam)
+
+/obj/item/mecha_parts/mecha_equipment/tool/powertool/welding/attach(obj/mecha/M as obj)
+ ..()
+
+ if(enable_special)
+ range = MELEE|RANGED
+ my_tool.reach = 7
+ else
+ range = MELEE
+ my_tool.reach = 1
diff --git a/code/game/mecha/equipment/weapons/defense/shocker.dm b/code/game/mecha/equipment/weapons/defense/shocker.dm
index af120167d2..58dccec562 100644
--- a/code/game/mecha/equipment/weapons/defense/shocker.dm
+++ b/code/game/mecha/equipment/weapons/defense/shocker.dm
@@ -15,6 +15,7 @@
equip_type = EQUIP_HULL
+/*
/obj/item/mecha_parts/mecha_equipment/shocker/can_attach(obj/mecha/M as obj)
if(..())
if(!M.proc_res["dynattackby"] && !M.proc_res["dynattackhand"] && !M.proc_res["dynattackalien"])
@@ -25,9 +26,11 @@
..()
chassis.proc_res["dynattackby"] = src
return
+*/
-/obj/item/mecha_parts/mecha_equipment/shocker/proc/dynattackby(obj/item/weapon/W, mob/living/user)
+/obj/item/mecha_parts/mecha_equipment/shocker/handle_melee_contact(var/obj/item/weapon/W, var/mob/living/user, var/inc_damage = null)
if(!action_checks(user) || !active)
return
+
user.electrocute_act(shock_damage, src)
- return chassis.dynattackby(W,user)
+ return inc_damage
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 34b1655fff..d78053d6b2 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -622,7 +622,12 @@
else if(istype(A, /obj))
var/obj/O = A
if(O.throwforce)
- src.take_damage(O.throwforce)
+
+ var/pass_damage = O.throwforce
+ for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
+ pass_damage = ME.handle_ranged_contact(A, pass_damage)
+
+ src.take_damage(pass_damage)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
return
@@ -652,7 +657,12 @@
var/ignore_threshold
if(istype(Proj, /obj/item/projectile/beam/pulse))
ignore_threshold = 1
- src.take_damage(Proj.damage, Proj.check_armour)
+
+ var/pass_damage = Proj.damage
+ for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
+ pass_damage = ME.handle_projectile_contact(Proj, pass_damage)
+
+ src.take_damage(pass_damage, Proj.check_armour)
if(prob(25)) spark_system.start()
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold)
@@ -748,7 +758,11 @@
else
src.occupant_message("[user] hits [src] with [W].")
user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].")
- src.take_damage(W.force,W.damtype)
+
+ var/pass_damage = W.force
+ for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
+ pass_damage = ME.handle_projectile_contact(W, user, pass_damage)
+ src.take_damage(pass_damage,W.damtype)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
return
diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm
index 8e27d6eaa1..b2bd3f3aed 100644
--- a/code/game/objects/items/weapons/tools/weldingtool.dm
+++ b/code/game/objects/items/weapons/tools/weldingtool.dm
@@ -643,6 +643,10 @@
var/obj/item/weapon/rig/suit = H.back
if(istype(suit))
return suit.cell
+ if(istype(src.loc, /obj/item/mecha_parts/mecha_equipment))
+ var/obj/item/mecha_parts/mecha_equipment/mounting = src.loc
+ if(mounting.chassis && mounting.chassis.cell)
+ return mounting.chassis.cell
return null
/obj/item/weapon/weldingtool/electric/mounted
@@ -651,4 +655,26 @@
/obj/item/weapon/weldingtool/electric/mounted/cyborg
toolspeed = 0.5
+/obj/item/weapon/weldingtool/electric/mounted/exosuit
+ var/obj/item/mecha_parts/mecha_equipment/equip_mount = null
+ flame_intensity = 1
+ eye_safety_modifier = 2
+ always_process = TRUE
+
+/obj/item/weapon/weldingtool/electric/mounted/exosuit/Initialize()
+ ..()
+
+ if(istype(loc, /obj/item/mecha_parts/mecha_equipment))
+ equip_mount = loc
+
+/obj/item/weapon/weldingtool/electric/mounted/exosuit/process()
+ ..()
+
+ if(equip_mount && equip_mount.chassis)
+ var/obj/mecha/M = equip_mount.chassis
+ if(M.selected == equip_mount && get_fuel())
+ setWelding(TRUE, M.occupant)
+ else
+ setWelding(FALSE, M.occupant)
+
#undef WELDER_FUEL_BURN_INTERVAL
diff --git a/code/modules/mob/_modifiers/fire.dm b/code/modules/mob/_modifiers/fire.dm
new file mode 100644
index 0000000000..d69a35c2ec
--- /dev/null
+++ b/code/modules/mob/_modifiers/fire.dm
@@ -0,0 +1,36 @@
+// Ignition, but confined to the modifier system.
+// This makes it more predictable and thus, easier to balance.
+/datum/modifier/fire
+ name = "on fire"
+ desc = "You are on fire! You will be harmed until the fire goes out or you extinguish it with water."
+ mob_overlay_state = "on_fire"
+
+ on_created_text = "You burst into flames!"
+ on_expired_text = "The fire starts to fade."
+ stacks = MODIFIER_STACK_ALLOWED // Multiple instances will hurt a lot.
+ var/damage_per_tick = 5
+
+/datum/modifier/fire/intense
+ mob_overlay_state = "on_fire_intense"
+ damage_per_tick = 10
+
+/datum/modifier/fire/tick()
+ holder.inflict_heat_damage(damage_per_tick)
+
+/*
+ * Modifier used by projectiles, like the flamethrower, that rely heavily on fire_stacks to persist.
+ */
+
+/datum/modifier/fire/stack_managed/tick()
+ ..()
+
+ if(!holder.fire_stacks || holder.fire_stacks < 0)
+ if(prob(10))
+ expire()
+
+ else if(holder.fire_stacks > 0)
+ holder.fire_stacks -= 1
+
+/datum/modifier/fire/stack_managed/intense
+ mob_overlay_state = "on_fire_intense"
+ damage_per_tick = 10
diff --git a/code/modules/mob/_modifiers/modifiers_misc.dm b/code/modules/mob/_modifiers/modifiers_misc.dm
index af6eaa952e..9d87088dae 100644
--- a/code/modules/mob/_modifiers/modifiers_misc.dm
+++ b/code/modules/mob/_modifiers/modifiers_misc.dm
@@ -224,28 +224,6 @@ the artifact triggers the rage.
accuracy_dispersion = 2 // A combination of fear and immense pain or damage reults in a twitching firing arm. Flee.
-
-
-// Ignition, but confined to the modifier system.
-// This makes it more predictable and thus, easier to balance.
-/datum/modifier/fire
- name = "on fire"
- desc = "You are on fire! You will be harmed until the fire goes out or you extinguish it with water."
- mob_overlay_state = "on_fire"
-
- on_created_text = "You combust into flames!"
- on_expired_text = "The fire starts to fade."
- stacks = MODIFIER_STACK_ALLOWED // Multiple instances will hurt a lot.
- var/damage_per_tick = 5
-
-/datum/modifier/fire/intense
- mob_overlay_state = "on_fire_intense"
- damage_per_tick = 10
-
-/datum/modifier/fire/tick()
- holder.inflict_heat_damage(damage_per_tick)
-
-
// Applied when near something very cold.
// Reduces mobility, attack speed.
/datum/modifier/chilled
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 1d806dde45..aeab794552 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -109,5 +109,9 @@
if(drowsy) apply_effect(drowsy, DROWSY, blocked)
if(agony) apply_effect(agony, AGONY, blocked)
if(flammable) adjust_fire_stacks(flammable)
- if(ignite) IgniteMob()
+ if(ignite)
+ if(ignite >= 3)
+ add_modifier(/datum/modifier/fire/stack_managed/intense, 60 SECONDS)
+ else
+ add_modifier(/datum/modifier/fire/stack_managed, 45 * ignite SECONDS)
return 1
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index f3603a783d..e91a906442 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -104,7 +104,7 @@
var/projectile_type = /obj/item/projectile
var/penetrating = 0 //If greater than zero, the projectile will pass through dense objects as specified by on_penetrate()
//Effects
- var/incendiary = 0 //1 for ignite on hit, 2 for trail of fire. 3 maybe later for burst of fire around the impact point. - Mech
+ var/incendiary = 0 //1 for ignite on hit, 2 for trail of fire. 3 for intense fire. - Mech
var/flammability = 0 //Amount of fire stacks to add for the above.
var/combustion = TRUE //Does this set off flammable objects on fire/hit?
var/stun = 0
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 8220e90eee..d25b0e5fee 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -245,7 +245,7 @@
icon_state = "bullet_alt"
damage = 15
damage_type = BURN
- incendiary = 1
+ incendiary = 0.5
flammability = 2
/obj/item/projectile/bullet/incendiary/flamethrower
@@ -261,7 +261,9 @@
vacuum_traversal = 0
/obj/item/projectile/bullet/incendiary/flamethrower/large
- damage = 15
+ damage = 5
+ incendiary = 3
+ flammability = 2
range = 6
/* Practice rounds and blanks */
diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm
index 0fdd3df5be..480f085c90 100644
--- a/code/modules/research/mechfab_designs.dm
+++ b/code/modules/research/mechfab_designs.dm
@@ -680,6 +680,46 @@
materials = list(DEFAULT_WALL_MATERIAL = 4000, "osmium" = 3000, "glass" = 1000)
build_path = /obj/item/mecha_parts/mecha_equipment/tool/powertool/prybar
+/datum/design/item/mecha/powercutters
+ name = "hydraulic cable cutter"
+ desc = "A large, hydraulic cablecutter."
+ id = "mech_wirecutter"
+ req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2, TECH_POWER = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 4000, "osmium" = 3000, "glass" = 1000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/powertool/cutter
+
+/datum/design/item/mecha/powerscrewdriver
+ name = "hydraulic screwdriver"
+ desc = "A large, hydraulic screwdriver."
+ id = "mech_screwdriver"
+ req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2, TECH_POWER = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 4000, "osmium" = 3000, "glass" = 1000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/powertool/screwdriver
+
+/datum/design/item/mecha/powerwelder
+ name = "welding laser"
+ desc = "A large welding laser."
+ id = "mech_welder"
+ req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2, TECH_POWER = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_PHORON = 3000, "glass" = 1000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/powertool/welding
+
+/datum/design/item/mecha/inflatables
+ name = "inflatables deployer"
+ desc = "A large pneumatic inflatable deployer."
+ id = "mech_inflatables"
+ req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2, TECH_POWER = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_PLASTIC = 4000, "glass" = 1000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables
+
+/datum/design/item/mecha/hardpoint_clamp
+ name = "hardpoint actuator"
+ desc = "A complex device used to commandeer equipment from the ground."
+ id = "mech_hardpoint_clamp"
+ req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_POWER = 5, TECH_COMBAT = 2, TECH_MAGNET = 4)
+ materials = list(MAT_PLASTEEL = 2500, MAT_PLASTIC = 3000, MAT_OSMIUM = 1500, MAT_SILVER = 2000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/hardpoint_actuator
+
/datum/design/item/mecha/generator_nuclear
name = "Nuclear Reactor"
desc = "Exosuit-held nuclear reactor. Converts uranium and everyone's health to energy."
diff --git a/html/changelogs/mechoid - exoexpansion.yml b/html/changelogs/mechoid - exoexpansion.yml
new file mode 100644
index 0000000000..c8a399fe79
--- /dev/null
+++ b/html/changelogs/mechoid - exoexpansion.yml
@@ -0,0 +1,42 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Mechoid
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Hardpoint Actuator equipment for Exosuits, allowing them (And most effectively, Ripleys) to swap components on the fly, after a short delay."
+ - rscadd: "Exo Inflatables Deployer, allowing exosuits to pick up and deploy inflatables."
+ - rscadd: "Exo screwdriver, wirecutters, and welding laser, to help round-out the tool-based equipment types."
+ - rscadd: "Fire modifiers based on stacks added, to be used by the damage system tweaked above."
+ - tweak: "Incendiary exo weapons tweaked to conform with fire change."
+ - tweak: "Ignition effects from weapons changed from the old fire-system to the modifier fire system."
+ - bugfix: "Shocker now retaliates properly against melee."
diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi
index cba863ea47..1fcdff0f72 100644
Binary files a/icons/mecha/mecha_equipment.dmi and b/icons/mecha/mecha_equipment.dmi differ
diff --git a/polaris.dme b/polaris.dme
index a7d01bd843..f826b91eae 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -795,6 +795,7 @@
#include "code\game\mecha\combat\marauder.dm"
#include "code\game\mecha\combat\phazon.dm"
#include "code\game\mecha\equipment\mecha_equipment.dm"
+#include "code\game\mecha\equipment\mecha_equipment_dynamicprocs.dm"
#include "code\game\mecha\equipment\tools\armor_melee.dm"
#include "code\game\mecha\equipment\tools\armor_ranged.dm"
#include "code\game\mecha\equipment\tools\cable_layer.dm"
@@ -804,9 +805,12 @@
#include "code\game\mecha\equipment\tools\energy_relay.dm"
#include "code\game\mecha\equipment\tools\extinguisher.dm"
#include "code\game\mecha\equipment\tools\generator.dm"
+#include "code\game\mecha\equipment\tools\hardpoint_actuator.dm"
+#include "code\game\mecha\equipment\tools\inflatables.dm"
#include "code\game\mecha\equipment\tools\jetpack.dm"
#include "code\game\mecha\equipment\tools\orescanner.dm"
#include "code\game\mecha\equipment\tools\passenger.dm"
+#include "code\game\mecha\equipment\tools\powertool.dm"
#include "code\game\mecha\equipment\tools\rcd.dm"
#include "code\game\mecha\equipment\tools\repair_droid.dm"
#include "code\game\mecha\equipment\tools\shield.dm"
@@ -815,8 +819,8 @@
#include "code\game\mecha\equipment\tools\syringe_gun.dm"
#include "code\game\mecha\equipment\tools\teleporter.dm"
#include "code\game\mecha\equipment\tools\tools.dm"
+#include "code\game\mecha\equipment\tools\weldinglaser.dm"
#include "code\game\mecha\equipment\tools\wormhole.dm"
-#include "code\game\mecha\equipment\tools\wrench.dm"
#include "code\game\mecha\equipment\weapons\honk.dm"
#include "code\game\mecha\equipment\weapons\weapons.dm"
#include "code\game\mecha\equipment\weapons\ballistic\automatic.dm"
@@ -1927,6 +1931,7 @@
#include "code\modules\mob\update_icons.dm"
#include "code\modules\mob\_modifiers\aura.dm"
#include "code\modules\mob\_modifiers\cloning.dm"
+#include "code\modules\mob\_modifiers\fire.dm"
#include "code\modules\mob\_modifiers\medical.dm"
#include "code\modules\mob\_modifiers\modifiers.dm"
#include "code\modules\mob\_modifiers\modifiers_misc.dm"