diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 4edaae81aac..3b8cf65816b 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -290,4 +290,48 @@
return "* [chassis.selected==src?"":""][src.name][chassis.selected==src?"":""]\[[src.projectiles]\]"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/rearm()
- return//Extra bit of security
\ No newline at end of file
+ return//Extra bit of security
+
+//////////////
+//Fire-based//
+//////////////
+
+/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/incendiary
+ name = "\improper DR-AC 3"
+ desc = "Dual-barrel rotary machinegun that fires small, incendiary rounds. Ages ten and up."
+ description_fluff = "A weapon designed by Hephaestus Industries, the DR-AC 3's design was plagued by prototype faults including but not limited to: Spontaneous combustion, spontaneous detonation, and excessive collateral conflagration."
+ icon_state = "mecha_drac3"
+ equip_cooldown = 20
+ projectile = /obj/item/projectile/bullet/incendiary
+ fire_sound = 'sound/weapons/machinegun.ogg'
+ projectiles = 30
+ projectiles_per_shot = 2
+ deviation = 0.4
+ projectile_energy_cost = 40
+ fire_cooldown = 3
+ origin_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 5, TECH_PHORON = 2, TECH_ILLEGAL = 1)
+
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer
+ equip_cooldown = 30
+ name = "\improper CR-3 Mark 8"
+ desc = "An imposing device, this weapon hurls balls of fire."
+ description_fluff = "A weapon designed by Hephaestus for anti-infantry combat, the CR-3 is capable of outputting a large volume of synthesized fuel. Initially designed by a small company, later purchased by Aether, on Earth as a device made for clearing underbrush and co-operating with firefighting operations. Obviously, Hephaestus has found an 'improved' use for the Aether designs."
+ icon_state = "mecha_cremate"
+
+ energy_drain = 30
+
+ projectile = /obj/item/projectile/bullet/incendiary/flamethrower/large
+ fire_sound = 'sound/weapons/towelwipe.ogg'
+
+ origin_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 6, TECH_PHORON = 4, TECH_ILLEGAL = 4)
+
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged
+ name = "\improper AA-CR-1 Mark 4"
+ description_fluff = "A firefighting tool maintained by Aether Atmospherics, whose initial design originated from a small Earth company. This one seems to have been jury rigged."
+
+ energy_drain = 50
+ required_type = list(/obj/mecha/combat, /obj/mecha/working)
+
+ projectile = /obj/item/projectile/bullet/incendiary/flamethrower
+
+ origin_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 3, TECH_PHORON = 3, TECH_ILLEGAL = 2)
diff --git a/code/game/objects/effects/decals/Cleanable/fuel.dm b/code/game/objects/effects/decals/Cleanable/fuel.dm
index 2bf3a2a574d..85e68c31afd 100644
--- a/code/game/objects/effects/decals/Cleanable/fuel.dm
+++ b/code/game/objects/effects/decals/Cleanable/fuel.dm
@@ -6,66 +6,66 @@
anchored = 1
var/amount = 1
- New(turf/newLoc,amt=1,nologs=0)
- if(!nologs)
- message_admins("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z]) (JMP)")
- log_game("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z])")
- src.amount = amt
+/obj/effect/decal/cleanable/liquid_fuel/New(turf/newLoc,amt=1,nologs=0)
+ if(!nologs)
+ message_admins("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z]) (JMP)")
+ log_game("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z])")
+ src.amount = amt
- var/has_spread = 0
- //Be absorbed by any other liquid fuel in the tile.
- for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
- if(other != src)
- other.amount += src.amount
- other.Spread()
- has_spread = 1
- break
-
- . = ..()
- if(!has_spread)
- Spread()
- else
- qdel(src)
-
- proc/Spread(exclude=list())
- //Allows liquid fuels to sometimes flow into other tiles.
- if(amount < 15) return //lets suppose welder fuel is fairly thick and sticky. For something like water, 5 or less would be more appropriate.
- var/turf/simulated/S = loc
- if(!istype(S)) return
- for(var/d in cardinal)
- var/turf/simulated/target = get_step(src,d)
- var/turf/simulated/origin = get_turf(src)
- if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
- var/obj/effect/decal/cleanable/liquid_fuel/other_fuel = locate() in target
- if(other_fuel)
- other_fuel.amount += amount*0.25
- if(!(other_fuel in exclude))
- exclude += src
- other_fuel.Spread(exclude)
- else
- new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25,1)
- amount *= 0.75
-
-
- flamethrower_fuel
- icon_state = "mustard"
- anchored = 0
- New(newLoc, amt = 1, d = 0)
- set_dir(d) //Setting this direction means you won't get torched by your own flamethrower.
- . = ..()
+ var/has_spread = 0
+ //Be absorbed by any other liquid fuel in the tile.
+ for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
+ if(other != src)
+ other.amount += src.amount
+ other.Spread()
+ has_spread = 1
+ break
+ . = ..()
+ if(!has_spread)
Spread()
- //The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
- if(amount < 0.1) return
- var/turf/simulated/S = loc
- if(!istype(S)) return
+ else
+ qdel(src)
- for(var/d in list(turn(dir,90),turn(dir,-90), dir))
- var/turf/simulated/O = get_step(S,d)
- if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O)
- continue
- if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0))
- new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
- O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
+/obj/effect/decal/cleanable/liquid_fuel/proc/Spread(exclude=list())
+ //Allows liquid fuels to sometimes flow into other tiles.
+ if(amount < 15) return //lets suppose welder fuel is fairly thick and sticky. For something like water, 5 or less would be more appropriate.
+ var/turf/simulated/S = loc
+ if(!istype(S)) return
+ for(var/d in cardinal)
+ var/turf/simulated/target = get_step(src,d)
+ var/turf/simulated/origin = get_turf(src)
+ if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
+ var/obj/effect/decal/cleanable/liquid_fuel/other_fuel = locate() in target
+ if(other_fuel)
+ other_fuel.amount += amount*0.25
+ if(!(other_fuel in exclude))
+ exclude += src
+ other_fuel.Spread(exclude)
+ else
+ new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25,1)
+ amount *= 0.75
- amount *= 0.25
+/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel
+ icon_state = "mustard"
+ anchored = 0
+
+/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/New(newLoc, amt = 1, d = 0)
+ set_dir(d) //Setting this direction means you won't get torched by your own flamethrower.
+ . = ..()
+
+/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/Spread()
+ //The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
+ if(amount < 0.1) return
+ var/turf/simulated/S = loc
+ if(!istype(S)) return
+
+ for(var/d in list(turn(dir,90),turn(dir,-90), dir))
+ var/turf/simulated/O = get_step(S,d)
+ if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O)
+ continue
+ if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0))
+ new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
+ O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
+
+ amount *= 0.25
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 0fa139c36f1..22289c6b438 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -87,7 +87,7 @@
return 1
-/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0)
+/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0, var/ignite = 0, var/flammable = 0)
if(blocked >= 100)
return 0
if(stun) apply_effect(stun, STUN, blocked)
@@ -98,4 +98,6 @@
if(eyeblur) apply_effect(eyeblur, EYE_BLUR, blocked)
if(drowsy) apply_effect(drowsy, DROWSY, blocked)
if(agony) apply_effect(agony, AGONY, blocked)
+ if(flammable) adjust_fire_stacks(flammable)
+ if(ignite) IgniteMob()
return 1
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index c4344c052b8..76c4249092a 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -45,6 +45,8 @@
var/penetrating = 0 //If greater than zero, the projectile will pass through dense objects as specified by on_penetrate()
var/kill_count = 50 //This will de-increment every process(). When 0, it will delete the projectile.
//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/flammability = 0 //Amount of fire stacks to add for the above.
var/stun = 0
var/weaken = 0
var/paralyze = 0
@@ -78,7 +80,7 @@
if(!isliving(target)) return 0
// if(isanimal(target)) return 0
var/mob/living/L = target
- L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, blocked) // add in AGONY!
+ L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, blocked, incendiary, flammability) // add in AGONY!
return 1
//called when the projectile stops flying because it collided with something
@@ -322,6 +324,10 @@
else if(!bumped)
tracer_effect(effect_transform)
+ if(incendiary >= 2)
+ var/trail_volume = (flammability * 0.10)
+ new /obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(src.loc, trail_volume, src.dir)
+
if(!hitscan)
sleep(step_delay) //add delay between movement iterations if it's not a hitscan weapon
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index a6237a604a6..5b95ee66397 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -252,6 +252,31 @@
explosion(target, -1, 0, 2)
..()
+/* Incendiary */
+
+/obj/item/projectile/bullet/incendiary
+ name = "incendiary bullet"
+ icon_state = "bullet_alt"
+ damage = 15
+ damage_type = BURN
+ incendiary = 1
+ flammability = 2
+
+/obj/item/projectile/bullet/incendiary/flamethrower
+ name = "ball of fire"
+ desc = "Don't stand in the fire."
+ icon_state = "fireball"
+ damage = 10
+ embed_chance = 0
+ incendiary = 2
+ flammability = 4
+ agony = 30
+ kill_count = 4
+
+/obj/item/projectile/bullet/incendiary/flamethrower/large
+ damage = 15
+ kill_count = 6
+
/obj/item/projectile/bullet/blank
invisibility = 101
damage = 1
diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm
index 7ebdc5fbb69..4d7149c1882 100644
--- a/code/modules/research/mechfab_designs.dm
+++ b/code/modules/research/mechfab_designs.dm
@@ -354,6 +354,30 @@
materials = list(DEFAULT_WALL_MATERIAL = 15000, "gold" = 4500, "uranium" = 4500)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited
+/datum/design/item/mecha/weapon/flamer
+ name = "CR-3 Mark 8 Flamethrower"
+ desc = "A weapon that violates the CCWC at two hundred gallons per minute."
+ id = "mech_flamer_full"
+ req_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 6, TECH_PHORON = 4, TECH_ILLEGAL = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "gold" = 2000, "uranium" = 3000, "phoron" = 8000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer
+
+/datum/design/item/mecha/weapon/flamer_rigged
+ name = "AA-CR-1 Mark 4 Flamethrower"
+ desc = "A weapon that accidentally violates the CCWC at one hundred gallons per minute."
+ id = "mech_flamer_rigged"
+ req_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 3, TECH_PHORON = 3, TECH_ILLEGAL = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 1500, "silver" = 1500, "uranium" = 2000, "phoron" = 6000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged
+
+/datum/design/item/mecha/weapon/flame_mg
+ name = "DR-AC 3 Incendiary Rotary MG"
+ desc = "A weapon that violates the CCWC at sixty rounds a minute."
+ id = "mech_lmg_flamer"
+ req_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 5, TECH_PHORON = 2, TECH_ILLEGAL = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 2000, "silver" = 1750, "uranium" = 1500, "phoron" = 4000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/incendiary
+
// *** Nonweapon modules
/datum/design/item/mecha/wormhole_gen
name = "Wormhole generator"
diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi
index 5f1898b8578..930e724d220 100644
Binary files a/icons/mecha/mecha_equipment.dmi and b/icons/mecha/mecha_equipment.dmi differ