Refactoring mines and simplying disarm.

This commit is contained in:
MistakeNot4892
2023-01-14 00:17:59 +11:00
parent 2903c367bd
commit 9c5eca2449
21 changed files with 412 additions and 506 deletions
-403
View File
@@ -1,403 +0,0 @@
/obj/effect/mine
name = "land mine" //The name and description are deliberately NOT modified, so you can't game the mines you find.
desc = "A small explosive land mine."
density = 0
anchored = 1
icon = 'icons/obj/weapons.dmi'
icon_state = "uglymine"
var/triggered = 0
var/smoke_strength = 3
var/obj/item/mine/mineitemtype = /obj/item/mine
var/panel_open = 0
var/datum/wires/mines/wires = null
var/camo_net = FALSE // Will the mine 'cloak' on deployment?
// The trap item will be triggered in some manner when detonating. Default only checks for grenades.
var/obj/item/trap = null
/obj/effect/mine/Initialize()
icon_state = "uglyminearmed"
wires = new(src)
. = ..()
if(ispath(trap))
trap = new trap(src)
register_dangerous_to_step()
if(camo_net)
alpha = 50
/obj/effect/mine/Destroy()
unregister_dangerous_to_step()
if(trap)
QDEL_NULL(trap)
QDEL_NULL(wires)
return ..()
/obj/effect/mine/Moved(atom/oldloc)
. = ..()
if(.)
var/turf/old_turf = get_turf(oldloc)
var/turf/new_turf = get_turf(src)
if(old_turf != new_turf)
old_turf.unregister_dangerous_object(src)
new_turf.register_dangerous_object(src)
/obj/effect/mine/proc/explode(var/mob/living/M)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread()
triggered = 1
s.set_up(3, 1, src)
s.start()
if(trap)
trigger_trap(M)
visible_message("\The [src.name] flashes as it is triggered!")
else
explosion(loc, 0, 2, 3, 4) //land mines are dangerous, folks.
visible_message("\The [src.name] detonates!")
qdel(s)
qdel(src)
/obj/effect/mine/proc/trigger_trap(var/mob/living/victim)
if(istype(trap, /obj/item/grenade))
var/obj/item/grenade/G = trap
trap = null
G.forceMove(get_turf(src))
if(victim.ckey)
msg_admin_attack("[key_name_admin(victim)] stepped on \a [src.name], triggering [trap]")
G.activate()
if(istype(trap, /obj/item/transfer_valve))
var/obj/item/transfer_valve/TV = trap
trap = null
TV.forceMove(get_turf(src))
TV.toggle_valve()
/obj/effect/mine/bullet_act()
if(prob(50))
explode()
/obj/effect/mine/ex_act(severity)
if(severity <= 2 || prob(50))
explode()
..()
/obj/effect/mine/Crossed(atom/movable/AM as mob|obj)
if(AM.is_incorporeal())
return
Bumped(AM)
/obj/effect/mine/Bumped(mob/M as mob|obj)
if(triggered)
return
if(istype(M, /obj/mecha))
explode(M)
if(istype(M, /mob/living/))
if(!M.hovering)
explode(M)
/obj/effect/mine/attackby(obj/item/W as obj, mob/living/user as mob)
if(W.is_screwdriver())
panel_open = !panel_open
user.visible_message("<span class='warning'>[user] very carefully screws the mine's panel [panel_open ? "open" : "closed"].</span>",
"<span class='notice'>You very carefully screw the mine's panel [panel_open ? "open" : "closed"].</span>")
playsound(src, W.usesound, 50, 1)
// Panel open, stay uncloaked, or uncloak if already cloaked. If you don't cloak on place, ignore it and just be normal alpha.
alpha = camo_net ? (panel_open ? 255 : 50) : 255
else if((W.is_wirecutter() || istype(W, /obj/item/multitool)) && panel_open)
interact(user)
else
..()
/obj/effect/mine/interact(mob/living/user as mob)
if(!panel_open || istype(user, /mob/living/silicon/ai))
return
user.set_machine(src)
wires.Interact(user)
/obj/effect/mine/camo
camo_net = TRUE
/obj/effect/mine/dnascramble
mineitemtype = /obj/item/mine/dnascramble
/obj/effect/mine/dnascramble/explode(var/mob/living/M)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread()
triggered = 1
s.set_up(3, 1, src)
s.start()
if(istype(M))
M.radiation += 50
randmutb(M)
domutcheck(M,null)
visible_message("\The [src.name] flashes violently before disintegrating!")
spawn(0)
qdel(s)
qdel(src)
/obj/effect/mine/stun
mineitemtype = /obj/item/mine/stun
/obj/effect/mine/stun/explode(var/mob/living/M)
triggered = 1
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread()
s.set_up(3, 1, src)
s.start()
if(istype(M))
M.Stun(30)
visible_message("\The [src.name] flashes violently before disintegrating!")
spawn(0)
qdel(s)
qdel(src)
/obj/effect/mine/n2o
mineitemtype = /obj/item/mine/n2o
/obj/effect/mine/n2o/explode(var/mob/living/M)
triggered = 1
for (var/turf/simulated/floor/target in range(1,src))
if(!target.blocks_air)
target.assume_gas("nitrous_oxide", 30)
visible_message("\The [src.name] detonates!")
spawn(0)
qdel(src)
/obj/effect/mine/phoron
mineitemtype = /obj/item/mine/phoron
/obj/effect/mine/phoron/explode(var/mob/living/M)
triggered = 1
for (var/turf/simulated/floor/target in range(1,src))
if(!target.blocks_air)
target.assume_gas("phoron", 30)
target.hotspot_expose(1000, CELL_VOLUME)
visible_message("\The [src.name] detonates!")
spawn(0)
qdel(src)
/obj/effect/mine/kick
mineitemtype = /obj/item/mine/kick
/obj/effect/mine/kick/explode(var/mob/living/M)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread()
triggered = 1
s.set_up(3, 1, src)
s.start()
if(istype(M, /obj/mecha))
var/obj/mecha/E = M
M = E.occupant
if(istype(M))
qdel(M.client)
spawn(0)
qdel(s)
qdel(src)
/obj/effect/mine/frag
mineitemtype = /obj/item/mine/frag
var/fragment_types = list(/obj/item/projectile/bullet/pellet/fragment)
var/num_fragments = 20 //total number of fragments produced by the grenade
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
var/spread_range = 7
/obj/effect/mine/frag/explode(var/mob/living/M)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread()
triggered = 1
s.set_up(3, 1, src)
s.start()
var/turf/O = get_turf(src)
if(!O)
return
src.fragmentate(O, 20, 7, list(/obj/item/projectile/bullet/pellet/fragment)) //only 20 weak fragments because you're stepping directly on it
visible_message("\The [src.name] detonates!")
spawn(0)
qdel(s)
qdel(src)
/obj/effect/mine/training //Name and Desc commented out so it's possible to trick people with the training mines
// name = "training mine"
// desc = "A mine with its payload removed, for EOD training and demonstrations."
mineitemtype = /obj/item/mine/training
/obj/effect/mine/training/explode(var/mob/living/M)
triggered = 1
visible_message("\The [src.name]'s light flashes rapidly as it 'explodes'.")
new src.mineitemtype(get_turf(src))
spawn(0)
qdel(src)
/obj/effect/mine/emp
mineitemtype = /obj/item/mine/emp
/obj/effect/mine/emp/explode(var/mob/living/M)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread()
s.set_up(3, 1, src)
s.start()
visible_message("\The [src.name] flashes violently before disintegrating!")
empulse(loc, 2, 4, 7, 10, 1) // As strong as an EMP grenade
spawn(0)
qdel(src)
/obj/effect/mine/emp/camo
camo_net = TRUE
/obj/effect/mine/incendiary
mineitemtype = /obj/item/mine/incendiary
/obj/effect/mine/incendiary/explode(var/mob/living/M)
triggered = 1
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread()
s.set_up(3, 1, src)
s.start()
if(istype(M))
M.adjust_fire_stacks(5)
M.fire_act()
visible_message("\The [src.name] bursts into flames!")
spawn(0)
qdel(src)
/obj/effect/mine/gadget
mineitemtype = /obj/item/mine/gadget
/obj/effect/mine/gadget/explode(var/mob/living/M)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread()
triggered = 1
s.set_up(3, 1, src)
s.start()
if(trap)
trigger_trap(M)
visible_message("\The [src.name] flashes as it is triggered!")
else
explosion(loc, 0, 0, 2, 2)
visible_message("\The [src.name] detonates!")
qdel(s)
qdel(src)
/////////////////////////////////////////////
// The held item version of the above mines
/////////////////////////////////////////////
/obj/item/mine
name = "mine"
desc = "A small explosive mine with 'HE' and a grenade symbol on the side."
icon = 'icons/obj/weapons.dmi'
icon_state = "uglymine"
var/countdown = 10
var/minetype = /obj/effect/mine //This MUST be an /obj/effect/mine type, or it'll runtime.
var/obj/item/trap = null
var/list/allowed_gadgets = null
/obj/item/mine/attack_self(mob/user as mob) // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times
add_fingerprint(user)
msg_admin_attack("[key_name_admin(user)] primed \a [src]")
user.visible_message("[user] starts priming \the [src.name].", "You start priming \the [src.name]. Hold still!")
if(do_after(user, 10 SECONDS))
playsound(src, 'sound/weapons/armbomb.ogg', 75, 1, -3)
prime(user)
else
visible_message("[user] triggers \the [src.name]!", "You accidentally trigger \the [src.name]!")
prime(user, TRUE)
return
/obj/item/mine/attackby(obj/item/W as obj, mob/living/user as mob)
if(W.is_screwdriver() && trap)
to_chat(user, "<span class='notice'>You begin removing \the [trap].</span>")
if(do_after(user, 10 SECONDS))
to_chat(user, "<span class='notice'>You finish disconnecting the mine's trigger.</span>")
trap.forceMove(get_turf(src))
trap = null
return
if(LAZYLEN(allowed_gadgets) && !trap)
var/allowed = FALSE
for(var/path in allowed_gadgets)
if(istype(W, path))
allowed = TRUE
break
if(allowed)
user.drop_from_inventory(W)
W.forceMove(src)
trap = W
..()
/obj/item/mine/proc/prime(mob/user as mob, var/explode_now = FALSE)
visible_message("\The [src.name] beeps as the priming sequence completes.")
var/obj/effect/mine/R = new minetype(get_turf(src))
src.transfer_fingerprints_to(R)
R.add_fingerprint(user)
if(trap)
R.trap = trap
trap = null
R.trap.forceMove(R)
if(explode_now)
R.explode(user)
spawn(0)
qdel(src)
/obj/item/mine/dnascramble
name = "radiation mine"
desc = "A small explosive mine with a radiation symbol on the side."
minetype = /obj/effect/mine/dnascramble
/obj/item/mine/phoron
name = "incendiary mine"
desc = "A small explosive mine with a fire symbol on the side."
minetype = /obj/effect/mine/phoron
/obj/item/mine/kick
name = "kick mine"
desc = "Concentrated war crimes. Handle with care."
minetype = /obj/effect/mine/kick
/obj/item/mine/n2o
name = "nitrous oxide mine"
desc = "A small explosive mine with three Z's on the side."
minetype = /obj/effect/mine/n2o
/obj/item/mine/stun
name = "stun mine"
desc = "A small explosive mine with a lightning bolt symbol on the side."
minetype = /obj/effect/mine/stun
/obj/item/mine/frag
name = "fragmentation mine"
desc = "A small explosive mine with 'FRAG' and a grenade symbol on the side."
minetype = /obj/effect/mine/frag
/obj/item/mine/training
name = "training mine"
desc = "A mine with its payload removed, for EOD training and demonstrations."
minetype = /obj/effect/mine/training
/obj/item/mine/emp
name = "emp mine"
desc = "A small explosive mine with a lightning bolt symbol on the side."
minetype = /obj/effect/mine/emp
/obj/item/mine/incendiary
name = "incendiary mine"
desc = "A small explosive mine with a fire symbol on the side."
minetype = /obj/effect/mine/incendiary
/obj/item/mine/gadget
name = "gadget mine"
desc = "A small pressure-triggered device. If no component is added, the internal release bolts will detonate in unison when triggered."
allowed_gadgets = list(/obj/item/grenade, /obj/item/transfer_valve)
// This tells AI mobs to not be dumb and step on mines willingly.
/obj/item/mine/is_safe_to_step(mob/living/L)
if(!L.hovering)
return FALSE
return ..()
+3 -2
View File
@@ -625,8 +625,9 @@ var/global/list/slot_flags_enumeration = list(
generate_blood_overlay()
//Make the blood_overlay have the proper color then apply it.
blood_overlay.color = blood_color
add_overlay(blood_overlay)
if(blood_overlay)
blood_overlay.color = blood_color
add_overlay(blood_overlay)
//if this blood isn't already in the list, add it
if(istype(M))
+186
View File
@@ -0,0 +1,186 @@
/obj/item/mine
name = "explosive mine"
desc = "A small explosive land mine."
density = FALSE
anchored = FALSE
icon = 'icons/obj/mine.dmi'
icon_state = "mine"
var/actual_name
var/actual_desc
var/actual_icon_state
var/hidden_alpha = 255
var/panel_open = FALSE
var/armed = FALSE
var/triggering = FALSE
var/datum/mine_payload/payload = /datum/mine_payload/explosive
var/static/list/concealable_turfs = list(
/turf/simulated/floor/concrete,
/turf/simulated/floor/outdoors
)
/obj/item/mine/Initialize()
. = ..()
if(ispath(payload))
payload = new payload
register_dangerous_to_step()
// We store and hide our appearance if we're armed, to avoid people gaming mines via desc.
actual_name = name
actual_desc = desc
actual_icon_state = icon_state
update_icon()
/obj/item/mine/Destroy()
if(istype(payload))
QDEL_NULL(payload)
unregister_dangerous_to_step()
return ..()
/obj/item/mine/update_icon()
. = ..()
alpha = initial(alpha)
cut_overlays()
if(panel_open)
add_overlay("[icon_state]_open")
else if(armed)
add_overlay("[icon_state]_armed")
alpha = hidden_alpha
else
add_overlay("[icon_state]_safe")
/obj/item/mine/attack_self(mob/user) // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times
add_fingerprint(user)
msg_admin_attack("[key_name_admin(user)] armed \the [src]")
user.visible_message(
SPAN_DANGER("\The [user] starts arming \the [src]."),
SPAN_DANGER("You start arming \the [src]. Hold still!")
)
if(do_after(user, 10 SECONDS))
playsound(src, 'sound/weapons/armbomb.ogg', 75, 1, -3)
prime(user)
else
visible_message(
SPAN_DANGER("\The [user] accidentally triggers \the [src]!"),
SPAN_DANGER("You accidentally trigger \the [src]!")
)
prime(user)
trigger_payload(user)
return TRUE
// debug proc, replace with proper disarm minigame
/obj/item/mine/proc/disarm()
armed = FALSE
triggering = FALSE
anchored = FALSE
name = actual_name
desc = actual_desc
icon_state = actual_icon_state
hidden_alpha = 255
update_icon()
/obj/item/mine/attack_hand(mob/living/user)
if(armed)
trigger_payload()
return TRUE
return ..()
/obj/item/mine/attackby(obj/item/W, mob/living/user)
if(W.is_screwdriver())
visible_message(SPAN_NOTICE("\The [user] begins carefully adjusting \the [src]'s casing."))
if(do_after(user, 5 SECONDS, src))
panel_open = !panel_open
visible_message(SPAN_NOTICE("\The [user] carefully [panel_open ? "opens" : "closes"] the casing of \the [src]."))
update_icon()
else if(armed)
to_chat(user, SPAN_DANGER("You set off \the [src]!"))
trigger_payload(user)
return TRUE
if(armed)
if(panel_open && W.is_wirecutter())
visible_message(SPAN_NOTICE("\The [user] begins painstakingly disarming \the [src]..."))
if(do_after(user, 10 SECONDS, src))
visible_message(SPAN_NOTICE("\The [user] disarms \the [src]!"))
disarm()
return TRUE
if(armed) // checking again in case the do_after() stacks
to_chat(user, SPAN_DANGER("You set off \the [src]!"))
trigger_payload(user)
return TRUE
return ..()
/obj/item/mine/proc/prime(mob/user)
if(armed)
return
if(user)
visible_message(SPAN_NOTICE("\The [src] beeps as the priming sequence completes."))
user.drop_from_inventory(src, get_turf(user))
add_fingerprint(user)
anchored = TRUE
armed = TRUE
if(isturf(loc) && prob(65))
for(var/turftype in concealable_turfs)
if(istype(loc, turftype))
hidden_alpha = pick(50, 90, 120)
break
name = "mine"
desc = "A small land mine."
icon_state = "mine"
update_icon()
/obj/item/mine/Moved(atom/oldloc)
. = ..()
if(.)
var/turf/old_turf = get_turf(oldloc)
var/turf/new_turf = get_turf(src)
if(old_turf != new_turf)
old_turf.unregister_dangerous_object(src)
new_turf.register_dangerous_object(src)
/obj/item/mine/proc/trigger_payload(var/mob/living/M)
if(!triggering && payload)
triggering = TRUE
if(ismob(loc))
var/mob/holder = loc
holder.drop_from_inventory(src)
visible_message("\The [src] goes off!")
payload.trigger_payload(src, M)
disarm() // the mine can be reused if the payload doesn't destroy it.
return TRUE
return FALSE
/obj/item/mine/bullet_act()
if(prob(50))
trigger_payload()
if(!QDELETED(src))
..()
/obj/item/mine/ex_act(severity)
if(severity <= 2 || prob(50))
trigger_payload()
if(!QDELETED(src))
..()
/obj/item/mine/Crossed(atom/movable/AM)
. = ..()
if(istype(AM) && !AM.is_incorporeal())
Bumped(AM)
/obj/item/mine/Bumped(atom/movable/AM)
. = ..()
if(!QDELETED(src) && !is_safe_to_step(AM))
trigger_payload(AM)
// This tells AI mobs to not be dumb and step on mines willingly.
/obj/item/mine/is_safe_to_step(mob/living/L)
return !istype(L, /obj/mecha) && (!isliving(L) || L.hovering)
@@ -0,0 +1,22 @@
/datum/mine_payload
var/do_sparks = TRUE
var/destroy_self_on_trigger = TRUE
/datum/mine_payload/proc/trigger_payload(var/obj/item/mine/owner, var/atom/trigger)
if(do_sparks)
var/datum/effect_system/spark_spread/s = new
s.set_up(3, 1, owner)
s.start()
if(destroy_self_on_trigger)
if(!QDELETED(owner))
QDEL_IN(owner, 1)
else
owner.disarm() // some mines can be reused
/datum/mine_payload/proc/remove_from_mine()
return
/datum/mine_payload/explosive/trigger_payload(var/obj/item/mine/owner, var/atom/trigger)
..()
owner.visible_message("\The [owner] detonates!")
explosion(owner.loc, 0, 2, 3, 4) //land mines are dangerous, folks.
@@ -0,0 +1,62 @@
/obj/item/mine/assembly
name = "mine assembly"
desc = "A small pressure-triggered device. Accepts grenades and tank transfer valves."
var/static/list/accepts_items = list(
/obj/item/transfer_valve = /datum/mine_payload/assembly/tank_transfer_valve,
/obj/item/grenade = /datum/mine_payload/assembly/grenade
)
/obj/item/mine/assembly/attackby(obj/item/W, mob/living/user)
if(!armed && !triggering)
var/datum/mine_payload/assembly/attached_payload = payload
if(attached_payload.attached)
if(W.is_screwdriver())
to_chat(user, "You disconnect \the [src]'s [attached_payload.attached.name] and remove it.")
attached_payload.attached.forceMove(get_turf(user))
payload.remove_from_mine()
QDEL_NULL(payload)
else
for(var/loadtype in accepts_items)
if(istype(W, loadtype))
user.drop_from_inventory(W)
W.forceMove(src)
var/payload_type = accepts_items[loadtype]
attached_payload = new payload_type
attached_payload.attached = W
payload = attached_payload
return TRUE
return ..()
/datum/mine_payload/assembly
var/obj/item/attached
/datum/mine_payload/assembly/New(var/obj/item/_attaching)
..()
attached = _attaching
/datum/mine_payload/assembly/Destroy()
QDEL_NULL(attached)
. = ..()
/datum/mine_payload/assembly/remove_from_mine()
attached = null
/datum/mine_payload/assembly/tank_transfer_valve/trigger_payload(var/obj/item/mine/owner, var/atom/trigger)
..()
if(istype(attached, /obj/item/transfer_valve))
var/obj/item/transfer_valve/ttv = attached
ttv.forceMove(get_turf(owner))
ttv.toggle_valve()
remove_from_mine()
/datum/mine_payload/assembly/grenade/trigger_payload(var/obj/item/mine/owner, var/atom/trigger)
..()
if(istype(attached, /obj/item/grenade))
var/obj/item/grenade/grenade = attached
grenade.forceMove(get_turf(owner))
if(ismob(trigger))
var/mob/victim = trigger
if(victim.ckey)
msg_admin_attack("[key_name_admin(victim)] stepped on \a [owner], triggering [grenade]")
grenade.activate()
remove_from_mine()
@@ -0,0 +1,13 @@
/obj/item/mine/dnascramble
name = "radiation mine"
desc = "A small explosive mine with a radiation symbol on the side."
payload = /datum/mine_payload/dnascramble
/datum/mine_payload/dnascramble/trigger_payload(var/obj/item/mine/owner, var/atom/trigger)
..()
if(ismob(trigger))
var/mob/M = trigger
M.radiation += 50
randmutb(M)
domutcheck(M,null)
owner.visible_message("\The [owner] flashes violently before disintegrating!")
@@ -0,0 +1,9 @@
/obj/item/mine/emp
name = "emp mine"
desc = "A small explosive mine with a lightning bolt symbol on the side."
payload = /datum/mine_payload/emp
/datum/mine_payload/emp/trigger_payload(var/obj/item/mine/owner, var/atom/trigger)
..()
owner.visible_message("\The [owner] flashes violently before disintegrating!")
empulse(owner.loc, 2, 4, 7, 10, 1) // As strong as an EMP grenade
@@ -0,0 +1,17 @@
/obj/item/mine/frag
name = "fragmentation mine"
desc = "A small explosive mine with 'FRAG' and a grenade symbol on the side."
payload = /datum/mine_payload/frag
/datum/mine_payload/frag
var/fragment_types = list(/obj/item/projectile/bullet/pellet/fragment)
var/num_fragments = 20 //total number of fragments produced by the grenade
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
var/spread_range = 7
/datum/mine_payload/frag/trigger_payload(var/obj/item/mine/owner, var/atom/trigger)
..()
var/turf/O = get_turf(owner)
if(O)
owner.fragmentate(O, num_fragments, spread_range, fragment_types)
owner.visible_message("\The [owner] detonates!")
@@ -0,0 +1,12 @@
/obj/item/mine/incendiary
name = "incendiary mine"
desc = "A small explosive mine with a fire symbol on the side."
payload = /datum/mine_payload/incendiary
/datum/mine_payload/incendiary/trigger_payload(var/obj/item/mine/owner, var/atom/trigger)
..()
for(var/turf/simulated/floor/target in range(1, owner))
if(!target.blocks_air)
target.assume_gas("phoron", 30)
target.hotspot_expose(1000, CELL_VOLUME)
owner.visible_message("\The [owner] spews a cloud of flaming gas!")
@@ -0,0 +1,13 @@
/obj/item/mine/kick
name = "kick mine"
desc = "Concentrated war crimes. Handle with care."
payload = /datum/mine_payload/kick
/datum/mine_payload/kick/trigger_payload(var/obj/item/mine/owner, var/atom/trigger)
..()
if(istype(trigger, /obj/mecha))
var/obj/mecha/E = trigger
trigger = E.occupant
if(ismob(trigger))
var/mob/M = trigger
qdel(M.client)
@@ -0,0 +1,12 @@
/obj/item/mine/napalm
name = "napalm mine"
desc = "A small explosive mine with a fire symbol on the side."
payload = /datum/mine_payload/napalm
/datum/mine_payload/napalm/trigger_payload(var/obj/item/mine/owner, var/atom/trigger)
..()
if(isliving(trigger))
var/mob/living/M = trigger
M.adjust_fire_stacks(5)
M.fire_act()
owner.visible_message("\The [owner] bursts into flames!")
@@ -0,0 +1,11 @@
/obj/item/mine/sleeping
name = "nitrous oxide mine"
desc = "A small explosive mine with three Z's on the side."
payload = /datum/mine_payload/sleeping
/datum/mine_payload/sleeping/trigger_payload(var/obj/item/mine/owner, var/atom/trigger)
..()
for (var/turf/simulated/floor/target in range(1, owner))
if(!target.blocks_air)
target.assume_gas("nitrous_oxide", 30)
owner.visible_message("\The [owner] sprays a cloud of gas!")
@@ -0,0 +1,11 @@
/obj/item/mine/stun
name = "stun mine"
desc = "A small explosive mine with a lightning bolt symbol on the side."
payload = /datum/mine_payload/stun
/datum/mine_payload/stun/trigger_payload(var/obj/item/mine/owner, var/atom/trigger)
..()
if(ismob(trigger))
var/mob/M = trigger
M.Stun(30)
owner.visible_message("\The [owner] flashes violently before disintegrating!")
@@ -0,0 +1,12 @@
/obj/item/mine/training
name = "training mine"
desc = "A mine with its payload removed, for EOD training and demonstrations."
payload = /datum/mine_payload/training
/datum/mine_payload/training
do_sparks = FALSE
destroy_self_on_trigger = FALSE
/datum/mine_payload/training/trigger_payload(var/obj/item/mine/owner, var/atom/trigger)
..()
owner.visible_message("\The [owner]'s light flashes rapidly as it 'explodes'.")
+14 -9
View File
@@ -130,18 +130,23 @@
/obj/random/landmine
name = "Random Land Mine"
desc = "This is a random land mine."
icon = 'icons/obj/weapons.dmi'
icon_state = "uglymine"
icon = 'icons/obj/mine.dmi'
icon_state = "mine"
spawn_nothing_percentage = 25
/obj/random/landmine/item_to_spawn()
return pick(prob(30);/obj/effect/mine,
prob(25);/obj/effect/mine/frag,
prob(25);/obj/effect/mine/emp,
prob(15);/obj/effect/mine/camo,
prob(15);/obj/effect/mine/emp/camo,
prob(10);/obj/effect/mine/stun,
prob(10);/obj/effect/mine/incendiary,)
return pick(
prob(60);/obj/item/mine,
prob(50);/obj/item/mine/emp,
prob(25);/obj/item/mine/frag,
prob(10);/obj/item/mine/stun,
prob(10);/obj/item/mine/incendiary
)
/obj/random/landmine/spawn_item()
var/obj/item/mine/mine = ..()
if(istype(mine))
mine.prime()
/obj/random/humanoidremains
name = "Random Humanoid Remains"