Files
2020-02-16 19:40:21 -08:00

399 lines
13 KiB
Plaintext

// Added support for old-style grenades (Convair880).
/obj/item/mousetrap
name = "mousetrap"
desc = "A handy little spring-loaded trap for catching pesty rodents."
icon = 'icons/obj/weapons.dmi'
icon_state = "mousetrap"
item_state = "mousetrap"
w_class = 1
force = null
throwforce = null
var/armed = 0
var/obj/item/chem_grenade/grenade = null
var/obj/item/old_grenade/grenade_old = null
var/obj/item/pipebomb/bomb/pipebomb = null
var/obj/item/reagent_containers/food/snacks/pie/pie = null
var/obj/item/parts/arm = null
stamina_damage = 5
stamina_cost = 5
stamina_crit_chance = 5
event_handler_flags = USE_HASENTERED | USE_FLUID_ENTER
armed
icon_state = "mousetraparmed"
armed = 1
triggered(mob/target as mob, var/type = "feet")
..(target, type)
src.armed = 1
return
cleaner
name = "cleantrap"
New()
..()
src.overlays += image('icons/obj/weapons.dmi', "trap-grenade")
src.grenade = new /obj/item/chem_grenade/cleaner(src)
return
examine()
set src in oview(12)
set category = "Local"
..()
if (src.armed)
boutput(usr, "<span style=\"color:red\">It looks like it's armed.</span>")
return
attack_self(mob/user as mob)
if (!src.armed)
icon_state = "mousetraparmed"
user.show_text("You arm the mousetrap.", "blue")
else
icon_state = "mousetrap"
if ((user.get_brain_damage() >= 60 || user.bioHolder.HasEffect("clumsy")) && prob(50))
var/which_hand = "l_arm"
if (!user.hand)
which_hand = "r_arm"
src.triggered(user, which_hand)
user.visible_message("<span style=\"color:red\"><B>[user] accidentally sets off the mousetrap, breaking their fingers.</B></span>",\
"<span style=\"color:red\"><B>You accidentally trigger the mousetrap!</B></span>")
return
user.show_text("You disarm the mousetrap.", "blue")
src.armed = !src.armed
playsound(user.loc, "sound/weapons/handcuffs.ogg", 30, 1, -3)
return
attack_hand(mob/user as mob)
if (src.armed)
if ((user.get_brain_damage() >= 60 || user.bioHolder.HasEffect("clumsy")) && prob(50))
var/which_hand = "l_arm"
if (!user.hand)
which_hand = "r_arm"
src.triggered(user, which_hand)
user.visible_message("<span style=\"color:red\"><B>[user] accidentally sets off the mousetrap, breaking their fingers.</B></span>",\
"<span style=\"color:red\"><B>You accidentally trigger the mousetrap!</B></span>")
return
..()
return
attackby(obj/item/C as obj, mob/user as mob)
if (istype(C, /obj/item/chem_grenade) && !src.grenade && !src.grenade_old && !src.pipebomb && !src.arm)
var/obj/item/chem_grenade/CG = C
if (CG.stage == 2 && !CG.state)
user.u_equip(CG)
CG.set_loc(src)
user.show_text("You attach [CG]'s detonator to [src].", "blue")
src.grenade = CG
src.overlays += image('icons/obj/weapons.dmi', "trap-grenade")
message_admins("[key_name(user)] rigs [src] with [CG] at [log_loc(user)].")
logTheThing("bombing", user, null, "rigs [src] with [CG] at [log_loc(user)].")
else if (istype(C, /obj/item/old_grenade/) && !src.grenade && !src.grenade_old && !src.pipebomb && !src.arm)
var/obj/item/old_grenade/OG = C
if (OG.not_in_mousetraps == 0 && !OG.state)
user.u_equip(OG)
OG.set_loc(src)
user.show_text("You attach [OG]'s detonator to [src].", "blue")
src.grenade_old = OG
src.overlays += image('icons/obj/weapons.dmi', "trap-grenade")
message_admins("[key_name(user)] rigs [src] with [OG] at [log_loc(user)].")
logTheThing("bombing", user, null, "rigs [src] with [OG] at [log_loc(user)].")
else if (istype(C, /obj/item/pipebomb/bomb) && !src.grenade && !src.grenade_old && !src.pipebomb && !src.arm)
var/obj/item/pipebomb/bomb/PB = C
if (!PB.armed)
user.u_equip(PB)
PB.set_loc(src)
user.show_text("You attach [PB]'s detonator to [src].", "blue")
src.pipebomb = PB
src.overlays += image('icons/obj/weapons.dmi', "trap-pipebomb")
message_admins("[key_name(user)] rigs [src] with [PB] at [log_loc(user)].")
logTheThing("bombing", user, null, "rigs [src] with [PB] at [log_loc(user)].")
else if (istype(C, /obj/item/pipebomb/frame))
var/obj/item/pipebomb/frame/PF = C
if (src.loc != user)
user.show_text("You need to actually be holding [src] to do this.", "red")
return
if (PF.state > 2)
user.show_text("[PF] needs to be empty to be used.", "red")
return
// Pies won't do, they require a mob as the target. Obviously, the mousetrap roller is much more
// likely to bump into an inanimate object.
if (!src.grenade && !src.grenade_old && !src.pipebomb)
user.show_text("[src] must have a grenade or pipe bomb attached first.", "red")
return
user.u_equip(src)
user.u_equip(PF)
new /obj/item/mousetrap_roller(get_turf(src), src, PF)
return
else if (!src.arm && (istype(C, /obj/item/parts/robot_parts/arm) || istype(C, /obj/item/parts/human_parts/arm)) && !src.grenade && !src.grenade_old && !src.pipebomb)
user.u_equip(C)
src.arm = C
C.set_loc(src)
src.overlays += image(C.icon, C.icon_state)
user.show_text("You add [C] to [src].", "blue")
else if (istype(C, /obj/item/reagent_containers/food/snacks/pie) && !src.grenade && !src.grenade_old && !src.pipebomb)
if (src.pie)
user.show_text("There's already a pie attached to [src]!", "red")
return
else if (!src.arm)
user.show_text("You can't quite seem to get [C] to stay on [src]. Seems like it needs something to hold it in place.", "red")
return
else if (C.w_class > 1) // Transfer valve bomb pies are a thing. Shouldn't fit in a backpack, much less a box.
user.show_text("[C] is way too large. You can't find any way to balance it on the arm.", "red")
return
user.u_equip(C)
src.pie = C
C.set_loc(src)
src.overlays += image(C.icon, C.icon_state)
user.show_text("You carefully set [C] in [src]'s [src.arm].", "blue")
logTheThing("bombing", user, null, "rigs [src] with [src.arm] and [C] at [log_loc(user)].")
else if (iswrenchingtool(C))
if (src.grenade)
user.show_text("You detach [src.grenade].", "blue")
src.grenade.set_loc(get_turf(src))
src.grenade = null
src.overlays -= image('icons/obj/weapons.dmi', "trap-grenade")
else if (src.grenade_old)
user.show_text("You detach [src.grenade_old].", "blue")
src.grenade_old.set_loc(get_turf(src))
src.grenade_old = null
src.overlays -= image('icons/obj/weapons.dmi', "trap-grenade")
else if (src.pipebomb)
user.show_text("You detach [src.pipebomb].", "blue")
src.pipebomb.set_loc(get_turf(src))
src.pipebomb = null
src.overlays -= image('icons/obj/weapons.dmi', "trap-pipebomb")
else if (src.pie)
user.show_text("You remove [src.pie] from [src].", "blue")
src.overlays -= image(src.pie.icon, src.pie.icon_state)
src.pie.layer = initial(src.pie.layer)
src.pie.set_loc(get_turf(src))
src.pie = null
else if (src.arm)
user.show_text("You remove [src.arm] from [src].", "blue")
src.overlays -= image(src.arm.icon, src.arm.icon_state)
src.arm.layer = initial(src.arm.layer)
src.arm.set_loc(get_turf(src))
src.arm = null
else
..()
return
HasEntered(AM as mob|obj)
if ((ishuman(AM)) && (src.armed))
var/mob/living/carbon/H = AM
if (H.m_intent == "run")
src.triggered(H)
H.visible_message("<span style=\"color:red\"><B>[H] accidentally steps on the mousetrap.</B></span>",\
"<span style=\"color:red\"><B>You accidentally step on the mousetrap!</B></span>")
else if ((iscritter(AM)) && (src.armed))
var/mob/living/critter/C = AM
src.triggered(C)
C.visible_message("<span style=\"color:red\"><B>[C] accidentally triggers the mousetrap.</B></span>",\
"<span style=\"color:red\"><B>You accidentally trigger the mousetrap!</B></span>")
else if (istype(AM, /obj/critter/mouse) && (src.armed))
var/obj/critter/mouse/M = AM
playsound(src.loc, "sound/impact_sounds/Generic_Snap_1.ogg", 50, 1)
icon_state = "mousetrap"
src.armed = 0
src.visible_message("<span style=\"color:red\"><b>[M] is caught in the trap!</b></span>")
M.CritterDeath()
..()
return
hitby(A as mob|obj)
if (!src.armed)
return ..()
src.visible_message("<span style=\"color:red\"><B>The mousetrap is triggered by [A].</B></span>")
src.triggered(null)
return
proc/triggered(mob/target as mob, var/type = "feet")
if (!src || !src.armed)
return
var/obj/item/affecting = null
if (target && ishuman(target))
var/mob/living/carbon/human/H = target
switch(type)
if ("feet")
if (!H.shoes)
affecting = H.organs[pick("l_leg", "r_leg")]
H.changeStatus("weakened", 3 SECONDS)
if ("l_arm", "r_arm")
if (!H.gloves)
affecting = H.organs[type]
H.changeStatus("stunned", 3 SECONDS)
if (affecting)
affecting.take_damage(1, 0)
H.UpdateDamageIcon()
H.updatehealth()
else if (iscritter(target))
var/mob/living/critter/C = target
C.TakeDamage("All", 1)
if (target)
playsound(target.loc, "sound/impact_sounds/Generic_Snap_1.ogg", 50, 1)
src.icon_state = "mousetrap"
src.armed = 0
if (src.grenade)
logTheThing("bombing", target, null, "triggers [src] (armed with: [src.grenade]) at [log_loc(src)]")
src.grenade.explode()
src.grenade = null
src.overlays -= image('icons/obj/weapons.dmi', "trap-grenade")
else if (src.grenade_old)
logTheThing("bombing", target, null, "triggers [src] (armed with: [src.grenade_old]) at [log_loc(src)]")
src.grenade_old.prime()
src.grenade_old = null
src.overlays -= image('icons/obj/weapons.dmi', "trap-grenade")
else if (src.pipebomb)
logTheThing("bombing", target, null, "triggers [src] (armed with: [src.pipebomb]) at [log_loc(src)]")
src.overlays -= image('icons/obj/weapons.dmi', "trap-pipebomb")
src.pipebomb.do_explode()
src.pipebomb = null
else if (src.pie && src.arm)
logTheThing("bombing", target, null, "triggers [src] (armed with: [src.arm] and [src.pie]) at [log_loc(src)]")
target.visible_message("<span style=\"color:red\"><b>[src]'s [src.arm] launches [src.pie] at [target]!</b></span>",\
"<span style=\"color:red\"><b>[src]'s [src.arm] launches [src.pie] at you!</b></span>")
src.overlays -= image(src.pie.icon, src.pie.icon_state)
src.pie.layer = initial(src.pie.layer)
src.pie.set_loc(get_turf(target))
src.pie.throw_impact(target)
src.pie = null
return
// Added support for old-style grenades and pipe bombs (Convair880).
/obj/item/mousetrap_roller
name = "mousetrap roller assembly"
desc = "A mousetrap bomb attached to a set of wheels. Looks like the mousetrap going off would send it rolling. Huh."
icon = 'icons/obj/weapons.dmi'
icon_state = "mousetrap_roller"
item_state = "mousetrap"
w_class = 1
var/armed = 0
var/obj/item/mousetrap/mousetrap = null
var/obj/item/pipebomb/frame/frame = null
var/payload = ""
New(ourLoc, var/obj/item/mousetrap/newtrap, obj/item/pipebomb/frame/newframe)
..()
if (newtrap)
newtrap.set_loc(src)
src.mousetrap = newtrap
else
src.mousetrap = new /obj/item/mousetrap(src)
// Fallback in case something goes wrong.
if (!src.mousetrap.grenade && !src.mousetrap.grenade_old && !src.mousetrap.pipebomb)
src.mousetrap.grenade = new /obj/item/chem_grenade/flashbang(src.mousetrap)
src.mousetrap.overlays += image('icons/obj/weapons.dmi', "trap-grenade")
if (src.mousetrap.grenade)
src.payload = src.mousetrap.grenade.name
src.name = "mousetrap/grenade/roller assembly"
else if (src.mousetrap.grenade_old)
src.payload = src.mousetrap.grenade_old.name
src.name = "mousetrap/grenade/roller assembly"
else if (src.mousetrap.pipebomb)
src.payload = src.mousetrap.pipebomb.name
src.name = "mousetrap/pipe bomb/roller assembly"
else
src.payload = "*unknown or null*"
if (newframe)
newframe.set_loc(src)
src.frame = newframe
else
src.frame = new /obj/item/pipebomb/frame(src)
return
attackby(obj/item/C as obj, mob/user as mob)
if (iswrenchingtool(C))
if (!isturf(src.loc))
user.show_text("Place the [src.name] on the ground first.", "red")
return
user.visible_message("<b>[user]</b> disassembles [src].","You disassemble [src].")
if (src.mousetrap)
src.mousetrap.set_loc(src.loc)
src.mousetrap = null
if (src.frame)
src.frame.set_loc(src.loc)
src.frame = null
qdel(src)
else
..()
return
attack_hand(mob/user as mob)
if (src.armed)
return
return ..()
attack_self(mob/user as mob)
if (!isturf(user.loc))
user.show_text("You can't release the [src.name] in a confined space.", "red")
return
if (src.armed)
return
user.visible_message("<span style=\"color:red\">[user] starts up the [src.name].</span>", "You start up the [src.name]")
message_admins("[key_name(user)] releases a [src] (Payload: [src.payload]) at [log_loc(user)]. Direction: [dir2text(user.dir)].")
logTheThing("bombing", user, null, "releases a [src] (Payload: [src.payload]) at [log_loc(user)]. Direction: [dir2text(user.dir)].")
src.armed = 1
if (src.mousetrap)
src.mousetrap.armed = 1 // Must be armed or it won't work in mousetrap.triggered().
src.set_density(1)
user.u_equip(src)
src.layer = initial(src.layer)
src.dir = user.dir
walk(src, src.dir, 3)
Bump(atom/movable/AM as mob|obj)
if (src.armed && src.mousetrap)
src.visible_message("<span style=\"color:red\">[src] bumps against [AM]!</span>")
walk(src, 0)
src.mousetrap.triggered(AM && ismob(AM) ? AM : null)
if (src.mousetrap)
src.mousetrap.set_loc(src.loc)
src.mousetrap = null
if (src.frame)
src.frame.set_loc(src.loc)
src.frame = null
qdel(src)
return