From 5c705288acc39a0083a44b88aa8e34d39ff19faf Mon Sep 17 00:00:00 2001 From: Sun-Soaked <45698967+Sun-Soaked@users.noreply.github.com> Date: Tue, 22 Oct 2024 15:46:27 -0400 Subject: [PATCH] Claymores & Mine Tweaks (#2988) ## About The Pull Request TODO: - [x] Actually implement claymores (should we let players have them?)(Cargo?) - [x] Remove weird sprite shim I made when world icons are merged, add world icons to mines - [x] Sprites (this time we actually need them since the placeholder ones are tgmc & I didn't ask for permission) Adds Mines that explode when an object passes in front of them & fire an ammo casing in that direction. Adds claymores as an implemented example of this- short range, shreds people at point blank. Adds World Icons to normal Mines I had to do some tweaking behind the scenes to implement mobless casing firing- but I'm pleased to say that fire_casing() can now deal emotionally with being handed a null user. Also minorly tweaks explosion devastation, so heavy explosions can only strip tiles that have already been damaged You can still immediately strip tiles with devastating explosions ## Why It's Good For The Game FRONT TOWARDS ENEMY ## Changelog :cl: add: Directional Mines, implemented as Claymores. add: Mines now have World Icons balance: explosions now only strip to space when a tile is already damaged fix: Prox mines explode from slightly further away & no longer activate through walls. fix: Multiple mines can no longer be stacked on a tile code: fire_casing() can now be called by non-mobs, allowing objects to shoot casings. /:cl: --- code/datums/components/pellet_cloud.dm | 13 +- code/game/objects/items/devices/mines.dm | 229 +++++++++++++++--- code/game/objects/items/shrapnel.dm | 43 +++- code/game/turfs/open/floor.dm | 2 +- code/modules/cargo/packs/sec_supply.dm | 25 ++ .../modules/projectiles/ammunition/_firing.dm | 4 +- .../projectiles/projectile/energy/misc.dm | 25 +- icons/obj/landmine.dmi | Bin 2821 -> 3328 bytes icons/obj/world/landmine.dmi | Bin 0 -> 3377 bytes 9 files changed, 292 insertions(+), 49 deletions(-) create mode 100644 icons/obj/world/landmine.dmi diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm index 9ef5b57d1fa1..d18bdc7d8cbc 100644 --- a/code/datums/components/pellet_cloud.dm +++ b/code/datums/components/pellet_cloud.dm @@ -90,7 +90,10 @@ /datum/component/pellet_cloud/proc/create_casing_pellets(obj/item/ammo_casing/shell, atom/target, mob/living/user, fired_from, randomspread, spread, zone_override, params, distro) - shooter = user + if(user) + shooter = user + else + shooter = fired_from var/targloc = get_turf(target) if(!zone_override) zone_override = shooter.zone_selected @@ -106,8 +109,12 @@ RegisterSignal(shell.BB, COMSIG_PROJECTILE_SELF_ON_HIT, PROC_REF(pellet_hit)) RegisterSignal(shell.BB, list(COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PARENT_QDELETING), PROC_REF(pellet_range)) pellets += shell.BB - if(!shell.throw_proj(target, targloc, shooter, params, spread)) - return + if(user) + if(!shell.throw_proj(target, targloc, shooter, params, spread)) + return + else + if(!shell.throw_proj(target, targloc, null, params, spread, shooter)) + return if(i != num_pellets) shell.newshot() diff --git a/code/game/objects/items/devices/mines.dm b/code/game/objects/items/devices/mines.dm index 1772cbf497c3..6547fde77ada 100644 --- a/code/game/objects/items/devices/mines.dm +++ b/code/game/objects/items/devices/mines.dm @@ -11,6 +11,7 @@ icon_state = "mine" item_state = "assembly"//when we get custom sprites replace this. please base_icon_state = "mine" + light_color = "#FF0000" /// Is our mine live? var/armed = FALSE @@ -24,13 +25,11 @@ var/manufacturer = MANUFACTURER_NONE - /obj/item/mine/Initialize(mapload) . = ..() if(armed) now_armed() - /obj/item/mine/examine(mob/user) . = ..() if(!armed) @@ -45,33 +44,39 @@ . = ..() icon_state = "[base_icon_state][triggered ? "_exploding" : null][!armed && anchored ? "_arming" : null][armed && anchored && !triggered ? "_armed" : null]" -//mines have a small chance to be triggered by damage, but they take longer to explode +/// mines have a small chance to be triggered by damage, but they take longer to explode /obj/item/mine/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir) . = ..() if(prob(35) & obj_integrity > 0) blast_delay = blast_delay * 2 trigger_mine() -//insert your horrible fate here +/// insert your horrible fate here /obj/item/mine/proc/mine_effect(mob/victim) return -//handles controlled deactivation +/// handles controlled deactivation /obj/item/mine/proc/disarm() if(triggered) //no turning back now return + light_power = 0 + light_range = 0 anchored = FALSE armed = FALSE update_appearance(UPDATE_ICON_STATE) return -//using an unarmed mine inhand deploys it. +/// using an unarmed mine inhand deploys it. /obj/item/mine/attack_self(mob/user) if(!armed) + if(!loccheck(user)) + to_chat(user, span_warning("There's already a mine at this position!")) + return user.visible_message(span_danger("[user] deploys the [src]."), span_notice("You deploy the [src].")) user.dropItemToGround(src) anchored = TRUE + dir = user.dir playsound(src, 'sound/machines/click.ogg', 60, TRUE) if(arm_delay) @@ -82,27 +87,30 @@ armed = TRUE message_admins("[key_name(user)] has placed \a [src] at ([x],[y],[z]).") -//let them know the mine's done cooking +/obj/item/mine/proc/loccheck(mob/user) + for(var/obj/item/mine/alreadymined in user.loc) + if(alreadymined.anchored) + return FALSE + return TRUE + +/// let them know the mine's done cooking /obj/item/mine/proc/now_armed() armed = TRUE update_appearance(UPDATE_ICON_STATE) + light_power = 1 + light_range = 1 playsound(src, 'sound/machines/nuke/angry_beep.ogg', 55, FALSE, 1) visible_message("\The [src] beeps softly, indicating it is now active.", vision_distance = COMBAT_MESSAGE_RANGE) /// Can this mine trigger on the passed movable? /obj/item/mine/proc/can_trigger(atom/movable/on_who) - //var/badtype = typecacheof(list(/obj/effect, /obj/item/mine)) if(triggered || !isturf(loc) || !armed || iseffect(on_who) || istype(on_who, /obj/item/mine)) return FALSE - //if(on_who == badtype)//no recursive self triggering. Bad landmine - // return FALSE return TRUE /// When something sets off a mine /obj/item/mine/proc/trigger_mine(atom/movable/triggerer) - if(obj_integrity <= 0) - return - if(triggered) //too busy detonating to detonate again + if(obj_integrity <= 0 || triggered)//too busy detonating to detonate again return if(triggerer) triggerer.visible_message(span_danger("[icon2html(src, viewers(src))] [triggerer] sets off \the [src]. It's gonna blow!"), span_danger("[icon2html(src, viewers(src))] \The [src] activates.")) @@ -114,7 +122,6 @@ playsound(src, 'sound/items/mine_activate.ogg', 70, FALSE) else playsound(src, 'sound/items/mine_activate_short.ogg', 80, FALSE) - light_color = "#FF0000" light_power = 5 light_range = 3 if(!blast_delay)//addtimer gets mad if the delay is 0 @@ -122,7 +129,7 @@ else addtimer(CALLBACK(src, PROC_REF(blast_now), triggerer), blast_delay) -//NOW we actually blow up +///NOW we actually blow up /obj/item/mine/proc/blast_now(atom/movable/triggerer) var/datum/effect_system/spark_spread/sporks = new /datum/effect_system/spark_spread sporks.set_up(3, 1, src) @@ -142,7 +149,7 @@ user.visible_message(span_warning("[user] extends their hand towards \the [src]!"), span_userdanger("You extend your arms to pick up \the [src], knowing that it will likely blow up when you touch it!")) if(do_after(user, 5 SECONDS, target = src))//SO SO generous. You can still step back from the edge. if(prob(10)) - user.visible_message(span_notice("[user] picks up \the [src], which miraculously doesn't explode!"), span_notice("You pick up \the [src], which miraculously doesn't explode!")) + user.visible_message(span_notice("[user] picks up \the [src], which miraculously doesn't go off!"), span_notice("You pick up \the [src], which miraculously doesn't go off!")) disarm() else user.visible_message(span_danger("[user] attempts to pick up \the [src] only to hear a beep as it activates in their hand!"), span_danger("You attempt to pick up \the [src] only to hear a beep as it activates in your hands!")) @@ -166,8 +173,8 @@ trigger_mine(user) // -//PRESSURE BASED MINE: -//Mine that explodes when stepped on. +///PRESSURE BASED MINE: +///Mine that explodes when stepped on. /obj/item/mine/pressure name = "dummy landmine" /// When true, mines trigger instantly on being stepped upon @@ -254,11 +261,7 @@ clicked = FALSE . = ..() -/obj/item/mine/pressure/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) - trigger_mine(AM) - ..() - -//handles disarming(and failing to disarm) +///handles disarming(and failing to disarm) /obj/item/mine/pressure/attackby(obj/item/I, mob/user) if(I.tool_behaviour == TOOL_SCREWDRIVER) if(sealed) @@ -275,18 +278,16 @@ else . = ..() -// -//PROXIMITY MINES -//Mines that explode when someone moves nearby. Simpler, because I don't have to worry about saving step info or disarming logic -// +//PROXIMITY MINES +///Mines that explode when someone moves nearby. Simpler, because I don't have to worry about saving step info or disarming logic /obj/item/mine/proximity name = "dummy proximity mine" blast_delay = 15 DECISECONDS arm_delay = 10 SECONDS//clear the area ///needed for the proximity checks. var/datum/proximity_monitor/proximity_monitor - var/proximity_range = 2 + var/proximity_range = 3 /obj/item/mine/proximity/Initialize(mapload) . = ..() @@ -302,12 +303,8 @@ /obj/item/mine/proximity/now_armed() . = ..() proximity_monitor = new(src, proximity_range) - light_color = "#FF0000" - light_power = 1 - light_range = 1 /obj/item/mine/proximity/disarm() - . = ..() QDEL_NULL(proximity_monitor) /obj/item/mine/proximity/Destroy() @@ -316,7 +313,11 @@ . = ..() /obj/item/mine/proximity/HasProximity(atom/movable/triggerer) - if(!iscarbon(triggerer))//let's keep these on player movements for now. + //let's keep these on player movements for now. + if(!iscarbon(triggerer)) + return + //Quick and dirty solution for preventing activations behind walls. + if(!(triggerer in view(proximity_range, src))) return if(!can_trigger(triggerer)) return @@ -326,9 +327,92 @@ QDEL_NULL(proximity_monitor) return +//DIRECTIONAL MINES +///Once deployed, keeps an eye on a line of turfs in the faced direction. If something moves in them, explode. +/obj/item/mine/directional + name = "directional mine" + desc = "An anti-personnel device that activates when an object moves in front of it. This one does nothing and is for testing purposes only." + + blast_delay = 1 DECISECONDS + arm_delay = 5 SECONDS + + ///range of tripwire + var/trigger_range = 4 + + ///projectile casing to fire in the selected direction when the mine is triggered. + //null prevents a projectile from being fired. + var/obj/item/ammo_casing/casingtype = null + + ///cache of turfs for detection area + var/list/tripwire_turfs + + ///for aiming the resulting projectiles + var/turf/target_turf + +///kills any existing tripwires +/obj/item/mine/directional/proc/remove_tripwires() + if(tripwire_turfs) + for(var/turf/affected_turf in tripwire_turfs) + UnregisterSignal(affected_turf, COMSIG_ATOM_ENTERED) + tripwire_turfs = null + if(target_turf) + target_turf = null + return + +///sets up tripwires(or recreates them, if already present) +/obj/item/mine/directional/proc/draw_tripwires() + if(tripwire_turfs) + remove_tripwires() + //we'll also use this to set up the pew + target_turf = get_ranged_target_turf(src, dir, trigger_range) + var/turf/starting_turf = get_turf(src) + tripwire_turfs = get_line(starting_turf, target_turf) + + for(var/turf/affected_turf in tripwire_turfs) + RegisterSignal(affected_turf, COMSIG_ATOM_ENTERED, PROC_REF(on_entered)) + +/obj/item/mine/directional/claymore/now_armed() + draw_tripwires() + . = ..() + +/obj/item/mine/directional/proc/on_entered(datum/source, atom/movable/arrived) + SIGNAL_HANDLER + if(!(arrived in view(trigger_range, src))) + return + if(!can_trigger(arrived)) + return + + if(ismob(arrived)) + var/mob/living/fool = arrived + fool.do_alert_animation(fool) + + visible_message(span_danger("[icon2html(src, viewers(src))] *click*")) + playsound(src, 'sound/machines/click.ogg', 100, TRUE) + INVOKE_ASYNC(src, PROC_REF(trigger_mine), arrived) + + +//pew pew +/obj/item/mine/directional/mine_effect(mob/victim) + if(casingtype && target_turf && victim ?(src.loc != victim.loc) : victim == null) + var/obj/item/ammo_casing/casing = new casingtype(src) + casing.fire_casing(target_turf, null, null, null, 30, ran_zone(), 60, src) + . = ..() + +/obj/item/mine/directional/disarm() + remove_tripwires() + visible_message(span_danger("With a soft clunk, the [src]'s securing bolts retract.")) + . = ..() + +///handles weird cases like ship movement or teleporting +/obj/item/mine/directional/Moved() + . = ..() + if(!loc) + return + if(armed & !triggered) + draw_tripwires() + // //LANDMINE TYPES -//Rylie please help me make these more immersive // /obj/item/mine/pressure/explosive @@ -380,7 +464,7 @@ shrapnel_magnitude = 4 /obj/item/mine/pressure/explosive/fire/mine_effect(mob/victim) - if(victim.is_holding(src))//in case it's been picked up + if(victim && victim.is_holding(src))//in case it's been picked up for(var/turf/T in view(4,victim)) T.IgniteTurf(15) new /obj/effect/hotspot(T) @@ -473,7 +557,7 @@ AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_magnitude) -//like all real 'less' than lethal crowd control options this is, in fact, not very good at being nonlethal +///like all real 'less' than lethal crowd control options this is, in fact, not very good at being nonlethal /obj/item/mine/proximity/explosive/sting name = "\improper'Stinger' Crowd Management Device" desc = "A \"less\" than lethal crowd control weapon, designed to demoralise and scatter anti-NT protestors. The bands of ballistic gel inside strike targets and incapacitate without causing serious maiming. In Theory." @@ -526,6 +610,76 @@ desc = "An anti-infantry device produced during the corporate wars. The explosive payload has been swapped out for 'viscerator'-type antipersonnel drones." spawn_type = /mob/living/simple_animal/hostile/viscerator + + +//Claymores +//shrapnel based dir explosive, extreme short range +//FRONT TOWARDS ENEMY +/obj/item/mine/directional/claymore + name = "C-10 Claymore" + desc = "A compact anti-personnel device with a directional trigger that responds to movement. A faded sticker on the back reads \"FRONT TOWARDS ENEMY\"." + icon = 'icons/obj/world/landmine.dmi' + icon_state = "mine_claymore" + base_icon_state = "mine_claymore" + + trigger_range = 2 + + //customize explosive power + var/range_devastation = -1 + var/range_heavy = 1 + var/range_light = 2 + var/range_flame = 0 + + //using this to indicate pb + var/range_flash = 1 + + //a second run of shrapnel, intended for maiming especially pb targets + var/obj/item/ammo_casing/shredtype = /obj/item/ammo_casing/caseless/shrapnel/shred + casingtype = /obj/item/ammo_casing/caseless/shrapnel + + manufacturer = MANUFACTURER_SCARBOROUGH + +//this will return to basic mines when we relegate them to specifically being on certain ruins & battlefields. For now, it's way too dangerous +/obj/item/mine/directional/claymore/Initialize() + . = ..() + AddElement(/datum/element/world_icon, null, icon, 'icons/obj/landmine.dmi') + +/obj/item/mine/directional/claymore/attackby(obj/item/I, mob/user) + if (I.tool_behaviour == TOOL_SCREWDRIVER && armed) + to_chat(user, "You begin unscrewing \the [src]'s arming pin...") + I.play_tool_sound(src, 50) + if(do_after(user, 10 SECONDS, target = src)) + to_chat(user, "You unscrew \the [src]'s arming pin, disarming it.") + disarm() + else + . = ..() + +/obj/item/mine/directional/claymore/mine_effect(mob/victim) + . = ..() + //if you somehow explode it while on the same tile, you win bonus shrapnel + //also spews stuff everywhere if it's triggered while not set up + if(!target_turf || victim ? (victim.loc == src.loc) : victim == null) + explosion(src, range_devastation, range_heavy, range_light, range_flash, 1, 0, range_flame, 0, 1) + var/casingammo = casingtype.projectile_type + var/shredammo = shredtype.projectile_type + if(casingtype) + AddComponent(/datum/component/pellet_cloud, projectile_type = casingammo, magnitude = 1) + if(shredtype) + AddComponent(/datum/component/pellet_cloud, projectile_type = shredammo, magnitude = 2) + else + var/blastloc = get_step_towards(src, target_turf) + explosion(blastloc, range_devastation, range_heavy, range_light, range_flash, 1, 0, range_flame, 0, 1) + if(shredtype) + var/obj/item/ammo_casing/shredcasing = new shredtype(src) + shredcasing.fire_casing(target_turf, null, null, null, 30, ran_zone(), 50, src) + +/obj/item/mine/directional/claymore/plasma + name = "\improper Etherbor EC-1" + desc = "A proximity explosive designed by the PGF for ambushing advancing infantry & defending corridors. Cooks armored targets to well-done." + shredtype = /obj/item/ammo_casing/caseless/shrapnel/shred/plasma + casingtype = /obj/item/ammo_casing/caseless/shrapnel/plasma + manufacturer = MANUFACTURER_PGF + // //GIMMICK MINES// //pretty much exclusively for adminbus & code dependencies @@ -671,6 +825,9 @@ LIVE_MINE_HELPER(proximity/explosive/sting) LIVE_MINE_HELPER(proximity/spawner/manhack) LIVE_MINE_HELPER(proximity/explosive/plasma) +LIVE_MINE_HELPER(directional/claymore) +LIVE_MINE_HELPER(directional/claymore/plasma) + LIVE_MINE_HELPER(pressure/gas) LIVE_MINE_HELPER(pressure/kickmine) LIVE_MINE_HELPER(pressure/sound) diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm index 249ee7dc41ed..db676e60fc3c 100644 --- a/code/game/objects/items/shrapnel.dm +++ b/code/game/objects/items/shrapnel.dm @@ -35,7 +35,7 @@ name = "flying shrapnel shard" damage = 10 range = 10 - armour_penetration = -20 + armour_penetration = -5 dismemberment = 25 ricochets_max = 2 ricochet_chance = 40 @@ -49,7 +49,7 @@ /obj/projectile/bullet/shrapnel/rusty damage = 8 - armour_penetration = -35 + armour_penetration = -10 dismemberment = 15 ricochets_max = 3//duller = less likely to stick in a wall ricochet_chance = 60 @@ -115,3 +115,42 @@ /obj/projectile/bullet/pellet/stingball/on_ricochet(atom/A) hit_stunned_targets = TRUE // ducking will save you from the first wave, but not the rebounds + + +//claymore shrapnel stuff// +//2 small bursts- one that harasses people passing by a bit aways, one that brutalizes point-blank targets. +/obj/item/ammo_casing/caseless/shrapnel + name = "directional shrapnel burst :D" + desc = "I May Have Overreacted" + pellets = 4 + variance = 70 + projectile_type = /obj/projectile/bullet/shrapnel/claymore + randomspread = TRUE + +/obj/item/ammo_casing/caseless/shrapnel/shred + name = "point blank directional shrapnel burst" + desc = "Claymores are lethal to armored infantry at point blank range." + pellets = 3 + variance = 50 + projectile_type = /obj/projectile/bullet/shrapnel/claymore/pointbl + randomspread = TRUE + +/obj/projectile/bullet/shrapnel/claymore + name = "ceramic splinter" + range = 4 + armour_penetration = 0 + +/obj/projectile/bullet/shrapnel/claymore/pointbl + name = "large ceramic shard" + range = 2 + damage = 18 + dismemberment = 30 + armour_penetration = 10 + +/obj/item/ammo_casing/caseless/shrapnel/plasma + name = "directional plasma burst" + projectile_type = /obj/projectile/energy/plasmabolt + +/obj/item/ammo_casing/caseless/shrapnel/shred/plasma + name = "point blank directional plasma burst" + projectile_type = /obj/projectile/energy/plasmabolt/shred diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index 23fdfcc6d998..7b1603df119d 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -62,7 +62,7 @@ if(1) ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) if(2) - if(prob(60)) + if(prob(50) && broken) ScrapeAway(flags = CHANGETURF_INHERIT_AIR) else break_tile() diff --git a/code/modules/cargo/packs/sec_supply.dm b/code/modules/cargo/packs/sec_supply.dm index e4208699338b..3ae043e4293d 100644 --- a/code/modules/cargo/packs/sec_supply.dm +++ b/code/modules/cargo/packs/sec_supply.dm @@ -155,3 +155,28 @@ contains = list(/obj/item/gun/energy/e_gun/advtaser, /obj/item/gun/energy/e_gun/advtaser) crate_name = "hybrid taser crate" + +/datum/supply_pack/sec_supply/claymore + name = "C-10 Claymore Crate" + desc = "Four motion-activated directional mines, perfect for ambushing enemy infantry. Still debatably legal to sell!" + cost = 3000 + contains = list(/obj/item/paper/fluff/claymore, + /obj/item/mine/directional/claymore, + /obj/item/mine/directional/claymore, + /obj/item/mine/directional/claymore, + /obj/item/mine/directional/claymore) + crate_name = "C-10 Claymore crate" + +/obj/item/paper/fluff/claymore + name = "PRODUCT USAGE GUIDE" + desc = "A dusty memo stamped with the Scarborough Arms logo." + default_raw_text = "ASSEMBLY:

\ + -Deploy mounting legs and emplace device. Front should be placed in direction of enemy egress, no more then three meters from intended target area.

\ + -INFORM ALLIES OF PLACEMENT LOCATION.

\ + -Wait for arming sequence to complete.

\ + -Enjoy hands-free area denial, courtesy of Scarborough Arms.


\ + DISASSEMBLY & STORAGE:

\ + -Insert screwdriver into arming pin access and turn 180 degrees. There will be considerable resistance. DO NOT Step onto or in front of device.

\ + -When pressure releases, reach below device and lift via underside in one clean motion. Mounting legs will automatically retract.

\ + -The device is now safe to handle.

\ + -Safely stow device in secure, moisture-free location, away from fire and blunt force. " diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index bdc5254f13c9..cfa4e91e645c 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -8,7 +8,7 @@ spread = round((rand() - 0.5) * distro) else //Smart spread spread = round(1 - 0.5) * distro - if(!throw_proj(target, targloc, user, params, spread)) + if(!throw_proj(target, targloc, user, params, spread, fired_from)) return FALSE else if(isnull(BB)) @@ -45,7 +45,7 @@ reagents.trans_to(BB, reagents.total_volume, transfered_by = user) //For chemical darts/bullets qdel(reagents) -/obj/item/ammo_casing/proc/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread) +/obj/item/ammo_casing/proc/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread, atom/fired_from) var/turf/curloc if(user) curloc = get_turf(user) diff --git a/code/modules/projectiles/projectile/energy/misc.dm b/code/modules/projectiles/projectile/energy/misc.dm index 11f948ddb415..c9e113455387 100644 --- a/code/modules/projectiles/projectile/energy/misc.dm +++ b/code/modules/projectiles/projectile/energy/misc.dm @@ -27,18 +27,33 @@ /obj/projectile/energy/plasmabolt name = "ionized plasma" damage = 25 - armour_penetration = -10 + armour_penetration = -15 range = 8 damage_type = BURN icon_state = "blastwave" color = "#00ff00" hitsound = 'sound/weapons/sear.ogg' + var/heatpwr = 350 /obj/projectile/energy/plasmabolt/on_hit(atom/target, blocked = FALSE) . = ..() if(iscarbon(target)) - var/mob/living/carbon/M = target - M.adjust_bodytemperature(350) + var/mob/living/carbon/cooked = target + cooked.adjust_bodytemperature(heatpwr) if(prob(35)) - M.adjust_fire_stacks(15) - M.IgniteMob() + cooked.adjust_fire_stacks(15) + cooked.IgniteMob() + else + if(cooked.on_fire) + cooked.adjust_fire_stacks(10) + +/obj/projectile/energy/plasmabolt/shred + name = "high-energy ionized plasma" + damage = 35 + armour_penetration = -5 + range = 2 + damage_type = BURN + icon_state = "blastwave" + color = "#00ff00" + hitsound = 'sound/weapons/sear.ogg' + heatpwr = 700 diff --git a/icons/obj/landmine.dmi b/icons/obj/landmine.dmi index dd19fd9d3991a7ab6066d70f467cbd9d60140f3c..40b3e3e4ba127417b178ff6cfadf594d668fb3bf 100644 GIT binary patch literal 3328 zcmbVPcTm&Yx=lbpq(m=BF9L_4hZY4vK#3G7A|N>tkdE};1!)P0pi(U8#Y2mDP!1(Q z2t{h>#drk-3=kkd=)Ds{^2^J4Gw;5+Z{C|Xb7%JYzS(>BUiyJ)kZxcNS`6Bg!Qfim=Q&wNcB5_^iw6njZc zGI_(bLKxi$5;qmfT9GOvwXDpSSwbbbFEL~B`Z*^2pYVEi%wp}OX~TdthpQ(?o^NbS z#A)yB#J#=1Az-KM{Ra6u90rc0JaS3~JDB^9HGOOK-B%v9(ht1up~@H& zP6H`jUD1Rv=6lADf;N4seXGaGr@L!ZN(O&E@GblP&b zkmLtIkmxy3_aK*qyC1oS2?crVzN3BC5JgjKwH&M$ssMr=Rqu6{`MY&gNSZXd(c*so zPt9ow>96ltCt7;eAwJ0z+5NrBP?!P`vdV4xwU!q+Y`f_5?QYK^i=nIl8Yxuy0DQge z670vdsL$d};MMuey31g;))c3FkF%Kbz?STS`shY79~BjcgEd^CC$eAfpO@9c-deq$ z+j7MN2#h-vX0@2u_An&z;h$(n6L^h9R4j3kX3u>479_=bn1}$@xVPH?BU>-8;}oyB zTm{oscI{e}rOe5!1xx#q>gwx?*{}i@v4dk(&C4eGQo5e%U&G_pS~o_H<(OJ9k$vm0 zGCz!%-YR{eK>GR10_MPRJBgWAVZ$XtEYb>K+ zBl3X~`p90A-ym!@WnnFEV!6t?;5(9bRo)tzgnIMV63b7mP^`TUqq&$ z_kf+^SfKJm#K{3+=(O-VwyG4~%E{Bzyk84qxBQACi@{C}FkZTw>RI zgi$Z1X4-MnH77^0v0#c|N+1V}fuXKeDWtDTs*;l2z4zFyk zF3M`-{%9(XdroM=$?5;ypFn{p3xq~J4EyjIeVCC>vLw^bFxLd-CMztYt}ino1yNAsuP5n37V}&&%{-MXI{slP~2Ak?PJ@aL6t>Fn%ob6|}SODasVq zRzQB<&-(-xkjmCkyb7IDMoMBXM?2**Lyn%HtD4&0l-pBYZtK;>iYMgAk~@9dVSj)# zW%4pLvcmw_056Oq%2G+KxJ^C@XAW#>r9fDn^M;qg+3s=j+d-j z3&iMT+!(PqzYr-vUJ(%UT+`KF)+(H|d1cFraT#mKE_&bo)X#_%ReiNUNm+S#)!L33 zu?q3!qR$02$Ru=I?31-&KXJq}``w+5BXsJ0oZuO)AkfT`9zh>V36JW+R3PaB(4Qzb z63&k)^FkXaR!gM|`CAnSy!UgvKQnk@|N9^9#X#tq6q9D68gJ`4sZBmOfc9srE}i3wa2cZVfZI%tqqhqRk#bF zS1RCD0D4JcFiK#!`kFlq9X;4VZ8S5rP>@#5jByg(5j5$!Lo_5^UHz_#1<<-~{-5j1 zMJuPWmexfh8S3GC`Am+=sqfP`mpiIgN=pv|&|KFChfS+Od~c)L9#GCg_V?ZW9USPK zpUQz0IwyCsf~U9y7F*C9h%LclA6IYG|BWe9n8jW+7P3 z{ty{>UwGEG`M705_L=N;(0Q|!tJ|aJu@$Kt?qmV3xnOQK2kAr|rUoaK* z6IbC@g|VKjd?h0Wv6JmUpGjm>ivVTGU?*aTOZ=tQ=Bjba4Ifcx1(~APMxdO4(ACus z92^{%9Pl*JXDnb^?MwUU7Zz0Nsfq+&S0T+L}Od_0w&aek6Uc- z&g0{|Uw|Q|N|K3t!tpE9TWf75~2Bbz)pk*xW+1n@ujqEz%MweK6S0 zb}pu#8~s+fM_>6{^intBIs?zWEjqx|8e-nzn{%ZDYlo?&Wo6Y`n-jOjf6Ch~E$wbY zP@tOuj*jsKV{yzpR(u*T4VK88s=?eyA705ns@$1#od8le-rbSw4^{#e7IMs3gM{20J&v)uYr%Ghk~n{qb|+P3ABaqLD2Bg(FT4U_lm7GIKbO45k9gh?cx@~U zOXjR(Zs;yNn?%&Pe~q=iQ4I&S%F2EX(ATSb$uOk9{NEZp{R7CtO61+ zQA#vO4MhS8C?F+4I)sprmwog8?Y^0N@0okfneW^?bH4dbD%92jC?F*O004kimS*;B z8^_)re7x*)JTlUXZE7MNoP*6ggYE@-KMwZxe*^%8mxlDC1rkiexrZayorH*gR5hCx z`yoWn?nokD>vqh^H(ry4BR_pIv_5~1E6DUz|BdmATJ?@Mu2jQI^67U)!yZNp1M{+% zr$W16xF4=V!+hoj0VbcE+f3x;0s_`PKV*T+TydifrP+y9iFs~D#@61+wF~kK2-of;G~t=C5Q0RwK6|nv3(gF zgoO_B6?$o7Ri>nxtME2A(K{2`W}K4mNWAR$j-sXGZS!15q}Cp0?E(uXlBqy~?AU(o z_z5k1xOQEMR#Sbws^j=OEL26Yl4F$nuJY5exo178pkH@12Om(MaZkUI$!5hUU^bXT z`%Fmm`e4{Ti)p*Fvom)_6Yt}M^$ZCBp4MyTP{3)&EwuAKJ2eT&o|iHSbmOvodUI9S zz(Cmf{VW=d?!hp+*yZAYUIoYmpSLGN%oTYgAtGejB#{Tgp*lUhc z0X6fm^(i6j=0!Dm(3m|7iQ|}Q!USheK=|lZfG=VXrv$A ze|dHc-rJ_?x>xsl`ryHOU;Rpy5qWwCIq6gXY8E<=wt-`CuGvR2z{ksTzc*A@YxqwQ zy7$WAj12q)sE0cAhS(XRuTR8}@~5xBr%wF+v@R!~@V*xI0#7)suNG8bsE*jm1dB$q zK;uIr(bV7h{^X@QA9W0FSt{h;&bJ&4Vk1*DakHu`kK0R+I1kb&Z2~+RC*(Gu9=BpN zPE=|KJ#rUZgG~V5|9GGG`M6tq=QBTXJgFANBkyZP8J;O@>x}ivwHjI@-TEyi-Uu51 zCnEE*{MU%iTk`rT9^7z!D-%L{{(+4gJ1ia>c&mdn($&R`K+asKG2Ab8 zP!rsR31@27t>-%0vlf?uN=8IKdX8*nLA9=0GX@gK1=s)bb!EF}@Efv-u(Vl|L(Td| zui|5RW&w=Xc}*+dG^U$Yo^O?Xcv@WQ-uH;Qwl;_>Z|gSO7fl9U(WcqbamD!)VR*GF zO>w0vF~)YhKHIdd*zN2+=*Kr9tp}?)KW?fhOLJu;Ra2L}ES#uJw~HFhu>q+$nH-4u z>y2l21oe5q(g8XGdvakL4-ZF&0*VQ@-cwMCXe$V}*30ZE4)V76BNPloZ``{COtl>#G}MG)5uMs^-JE-eyHfGQ!PyD$t!p z9-ub~=ELe=#~yx&;e;Z+h{ZbbE&?Y@(Ly`Dp#iqjefr6GtklvfYLsA7 zu$yEcXZBw@J_LOE|6Kh?u=MxP^)7;yZ|u?x(AFx5;G@% z6HzKkwlhY59`?GL#^4_47$mn^Y)b9z48N$~vSN8AYuP+y0HS2i7nO9FuicLVrPxqt z>rsV4PU5OtV$_p@7bhVmP2QX$H^do!26~el9=lsyZqc~%WAL92VlfHQ5r=d>Xc>*s zjq?3IiSkiNds25DG=C=vvv0Tc>oCWDK^bgl(670EemGlScV1vpJ5xAmj$~6(p97j3 z@N@mkla0XvJ}NtGkN~lmeJ+W^B5CGQKqPF#OSoH zou~+KP<`sfnqn{iOafVIY5CpZ)`V(UbSLU(e&sA3tDwKEC^5EC@z0pH=jm=SsEvJH7~4@QHAq6=dMWrDHfHmM0JVMeUq> zG@?k>bJUK{b`^k6oPzOiaF2O++=O2QWdi7~++5$I4ZK6re_LP#!TN*BIVG}&!tkYA zExkD8y2W+wSDpdjb2h$xXGA-#X>`DM3YQt8Aa&rI=PS=j6$E*kq7I4YEacp?@E6$* zPbuv(p~3f*1NS)3XFXw#NEd#R9ZOq02F8zW9@w7D)ipNGE3YvZ%gD&sZgm`5_9`qx z%gP5GPpraXU!uYd9PQ45pWbnPv9p_lJe^lsV~({1<2U;v&AaERRIhFaD%0t_4ey8c z9<~qhoi90VEV5s?qVAmbMTSa?oExmz7>)1Gpl9E)xq{>Z|&0x*}il#GsVBy&38J1HkYoqFs3p9+v0wwcb z+|(22=w^Lu;<&F@E;!@3*0#=4pDt-#Re~1efUqKnA~w=@=jF0NE7u0f)k5*fv`& z4dgBVou;MQCnce_du!8eL`P@G8To(c?Eko{NIK?)Igb35IDf(eGx6e7UWeFXMpi+Y zy+1eUuq(N*Fn{IIZS0eK)$g!lEf_VBXF5Ar1^in=i88fI76a28EBXL_n|bZ-l-pE8 zHiu|*UiVmE3-@S-JE2sj9&r>|t-=MC!w zOB+{8=q77H#)0nVG_qs3j*r7oxw#;Z0_g7@@xwOOgq{b*hUqOz^YflHFBkw!6eHk1 zL2CO|T9rz8(kE#dnFvZ_9xZ%I6%2_pkBw$jDwltD)zvj7Pc6Hou>XiaTrML|dz_eo z?@Gb^$emu%jC%xvm#p3Ob(E$VCVO+UB?#95P&U2|kk}Yq5Vvxai>6CO-p|z*Eaq|z z_YO>JPBtMQQp)&<_P5R&ANlWwm<_sPzb>mw)b0vztkSsQenJbqIFtjt>jpG7j(SMJ z_4OYe(M@;MPl7ZJc$SVqc{`inC1T}R2zFY zl@`nujzVAC$$Jy{-a*aSJ#>cMB=Rw_fT^0KYe>fCP2&l+DM%#^s RvgcZW)fHQ_W>XKue*h~EmDT_N diff --git a/icons/obj/world/landmine.dmi b/icons/obj/world/landmine.dmi new file mode 100644 index 0000000000000000000000000000000000000000..be8db65a3f5fdeb8d15450a93a800aaf2ff4f4de GIT binary patch literal 3377 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 D&Uv3_ literal 0 HcmV?d00001