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