[Ready for review until the inevitable map conflicts] Firing pins (#3375)

I'm going full steam ahead with this.

Adds firing pins/ Authentication mechanisms. these are needed to fire any specific weapon.

Weapons generally spawn with firing pins in them. or at least should. The exception to this is anything made in R&D - which needs to secure a firing pin from somewhere.

There's currently the following firing pins:

One that checks for a specific implant, EG a loyalty implant one.

One that always fails, and can replace other pins. (this one would likely be admin only. it's clown themed)

The Laser tag code got refactored to the pins. so each gun has a different pin. if you somehow got this pin, you could make it so you could only shoot a gun while wearing a laser tag vest, for example.

A Testing range pin, which only allows firing in specific areas - of which are mapped in currently.

A DNA locked one. and a subtype which will explode if someone else tries to use it.

the system's designed to be easy enough to add on to.

Feedback fourm is here:
This commit is contained in:
Pacmandevil
2018-01-27 14:59:00 -04:00
committed by Erki
parent d620bd194d
commit b22cb0e59d
26 changed files with 874 additions and 73 deletions

View File

@@ -1938,6 +1938,7 @@
#include "code\modules\projectiles\ammunition.dm" #include "code\modules\projectiles\ammunition.dm"
#include "code\modules\projectiles\effects.dm" #include "code\modules\projectiles\effects.dm"
#include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\gun.dm"
#include "code\modules\projectiles\pins.dm"
#include "code\modules\projectiles\projectile.dm" #include "code\modules\projectiles\projectile.dm"
#include "code\modules\projectiles\ammunition\boxes.dm" #include "code\modules\projectiles\ammunition\boxes.dm"
#include "code\modules\projectiles\ammunition\bullets.dm" #include "code\modules\projectiles\ammunition\bullets.dm"

View File

@@ -174,6 +174,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define RAD_SHIELDED 1 //shielded from radiation, clearly #define RAD_SHIELDED 1 //shielded from radiation, clearly
#define SPAWN_ROOF 2 // if we should attempt to spawn a roof above us. #define SPAWN_ROOF 2 // if we should attempt to spawn a roof above us.
#define HIDE_FROM_HOLOMAP 4 // if we shouldn't be drawn on station holomaps #define HIDE_FROM_HOLOMAP 4 // if we shouldn't be drawn on station holomaps
#define FIRING_RANGE 8
// Convoluted setup so defines can be supplied by Bay12 main server compile script. // Convoluted setup so defines can be supplied by Bay12 main server compile script.
// Should still work fine for people jamming the icons into their repo. // Should still work fine for people jamming the icons into their repo.

View File

@@ -15,6 +15,13 @@
path = /obj/item/weapon/storage/secure/briefcase/money path = /obj/item/weapon/storage/secure/briefcase/money
desc = "A briefcase with 10,000 untraceable credits for funding your sneaky activities." desc = "A briefcase with 10,000 untraceable credits for funding your sneaky activities."
/datum/uplink_item/item/tools/firingpin //todo, make this a special syndicate one instead of just a normal one?
name = "Firing Pin"
item_cost = 2
path = /obj/item/device/firing_pin
desc = "A Syndicate-branded Firing pin - It should be compatible with nearly every weapon onboard."
/datum/uplink_item/item/tools/clerical /datum/uplink_item/item/tools/clerical
name = "Morphic Clerical Kit" name = "Morphic Clerical Kit"
item_cost = 3 item_cost = 3

View File

@@ -650,7 +650,8 @@
/obj/item/ammo_magazine/c45x = 6, /obj/item/ammo_magazine/c45x = 6,
/obj/item/ammo_magazine/a556 = 12, /obj/item/ammo_magazine/a556 = 12,
/obj/item/ammo_magazine/a556/ap = 4, /obj/item/ammo_magazine/a556/ap = 4,
/obj/item/weapon/material/hatchet/tacknife = 4 /obj/item/weapon/material/hatchet/tacknife = 4,
/obj/item/device/firing_pin = 12
) )
//This one's from bay12 //This one's from bay12

View File

@@ -18,6 +18,7 @@
* Kitchen utensil box * Kitchen utensil box
* Random preserved snack box * Random preserved snack box
* For syndicate call-ins see uplink_kits.dm * For syndicate call-ins see uplink_kits.dm
* Firing pin boxes - Testing and Normal. one for sec, one for science.
*/ */
/obj/item/weapon/storage/box /obj/item/weapon/storage/box
@@ -338,6 +339,46 @@
new /obj/item/weapon/grenade/flashbang(src) new /obj/item/weapon/grenade/flashbang(src)
new /obj/item/weapon/grenade/flashbang(src) new /obj/item/weapon/grenade/flashbang(src)
/obj/item/weapon/storage/box/firingpins
name = "box of firing pins"
desc = "A box of NT brand Firearm authentication pins; Needed to operate most weapons."
/obj/item/weapon/storage/box/firingpins/fill()
..()
new /obj/item/device/firing_pin(src)
new /obj/item/device/firing_pin(src)
new /obj/item/device/firing_pin(src)
new /obj/item/device/firing_pin(src)
new /obj/item/device/firing_pin(src)
new /obj/item/device/firing_pin(src)
new /obj/item/device/firing_pin(src)
/obj/item/weapon/storage/box/testpins
name = "box of firing pins"
desc = "A box of NT brand Testing Authentication pins; allows guns to fire in designated firing ranges."
/obj/item/weapon/storage/box/testpins/fill()
..()
new /obj/item/device/firing_pin/test_range(src)
new /obj/item/device/firing_pin/test_range(src)
new /obj/item/device/firing_pin/test_range(src)
new /obj/item/device/firing_pin/test_range(src)
new /obj/item/device/firing_pin/test_range(src)
new /obj/item/device/firing_pin/test_range(src)
new /obj/item/device/firing_pin/test_range(src)
new /obj/item/device/firing_pin/test_range(src)
/obj/item/weapon/storage/box/loyaltypins
name = "box of firing pins"
desc = "A box of specialised \"loyalty\" authentication pins produced by Nanotrasen; these check to see if the user of the gun it's installed in has been implanted with a loyalty implant. Often used in ERTs."
/obj/item/weapon/storage/box/loyaltypins/fill()
..()
new /obj/item/device/firing_pin/implant/loyalty(src)
new /obj/item/device/firing_pin/implant/loyalty(src)
new /obj/item/device/firing_pin/implant/loyalty(src)
new /obj/item/device/firing_pin/implant/loyalty(src)
/obj/item/weapon/storage/box/teargas /obj/item/weapon/storage/box/teargas
name = "box of pepperspray grenades" name = "box of pepperspray grenades"
desc = "A box containing 7 tear gas grenades. A gas mask is printed on the label.<br> WARNING: Exposure carries risk of serious injury or death. Keep away from persons with lung conditions." desc = "A box containing 7 tear gas grenades. A gas mask is printed on the label.<br> WARNING: Exposure carries risk of serious injury or death. Keep away from persons with lung conditions."

View File

@@ -811,7 +811,8 @@
/obj/random/hoodie = 0.5, /obj/random/hoodie = 0.5,
/obj/random/junk = 0.9, /obj/random/junk = 0.9,
/obj/item/weapon/spacecash/ewallet/lotto = 0.3, /obj/item/weapon/spacecash/ewallet/lotto = 0.3,
/obj/random/spacecash = 0.3 /obj/random/spacecash = 0.3,
/obj/item/device/firing_pin = 0.3
) )
/obj/random/hoodie /obj/random/hoodie

View File

@@ -165,6 +165,7 @@ var/list/global/random_stock_uncommon = list(
"sord" = 1, "sord" = 1,
"policebaton" = 1.5, "policebaton" = 1.5,
"stunbaton" = 0.75,//batons spawn with no powercell "stunbaton" = 0.75,//batons spawn with no powercell
"firingpin" = 3,
"watches" = 3, "watches" = 3,
"MMI" = 1.5, "MMI" = 1.5,
"voidsuit" = 2, "voidsuit" = 2,
@@ -1062,6 +1063,8 @@ var/list/global/random_stock_large = list(
new /obj/random/action_figure(L) new /obj/random/action_figure(L)
if("plushie") if("plushie")
new /obj/random/plushie(L) new /obj/random/plushie(L)
if("firingpin")
new /obj/item/weapon/storage/box/firingpins(L)
if("mediumcell") if("mediumcell")
var/number = rand(1,2) var/number = rand(1,2)
while (number > 0) while (number > 0)

View File

@@ -344,3 +344,5 @@ var/list/slot_equipment_priority = list( \
for(var/entry in get_equipped_items(include_carried)) for(var/entry in get_equipped_items(include_carried))
drop_from_inventory(entry) drop_from_inventory(entry)
qdel(entry) qdel(entry)

View File

@@ -65,6 +65,8 @@
var/list/dispersion = list(0) var/list/dispersion = list(0)
var/reliability = 100 var/reliability = 100
var/obj/item/device/firing_pin/pin = /obj/item/device/firing_pin//standard firing pin for most guns.
var/next_fire_time = 0 var/next_fire_time = 0
@@ -76,6 +78,7 @@
var/recoil_wielded = 0 var/recoil_wielded = 0
var/accuracy_wielded = 0 var/accuracy_wielded = 0
var/wielded = 0 var/wielded = 0
var/needspin = TRUE
//aiming system stuff //aiming system stuff
@@ -84,7 +87,7 @@
var/tmp/mob/living/last_moved_mob //Used to fire faster at more than one person. var/tmp/mob/living/last_moved_mob //Used to fire faster at more than one person.
var/tmp/lock_time = -100 var/tmp/lock_time = -100
/obj/item/weapon/gun/Initialize() /obj/item/weapon/gun/Initialize(mapload)
. = ..() . = ..()
for(var/i in 1 to firemodes.len) for(var/i in 1 to firemodes.len)
firemodes[i] = new /datum/firemode(src, firemodes[i]) firemodes[i] = new /datum/firemode(src, firemodes[i])
@@ -92,8 +95,15 @@
if(isnull(scoped_accuracy)) if(isnull(scoped_accuracy))
scoped_accuracy = accuracy scoped_accuracy = accuracy
if (mapload && !pin && needspin)
pin = /obj/item/device/firing_pin
if(pin && needspin)
pin = new pin(src)
queue_icon_update() queue_icon_update()
//Checks whether a given mob can use the gun //Checks whether a given mob can use the gun
//Any checks that shouldn't result in handle_click_empty() being called if they fail should go here. //Any checks that shouldn't result in handle_click_empty() being called if they fail should go here.
//Otherwise, if you want handle_click_empty() to be called, check in consume_next_projectile() and return null there. //Otherwise, if you want handle_click_empty() to be called, check in consume_next_projectile() and return null there.
@@ -102,6 +112,7 @@
return 0 return 0
if(!user.IsAdvancedToolUser()) if(!user.IsAdvancedToolUser())
return 0 return 0
if(user.disabilities & PACIFIST) if(user.disabilities & PACIFIST)
to_chat(user, "<span class='notice'>You don't want to risk harming anyone!</span>") to_chat(user, "<span class='notice'>You don't want to risk harming anyone!</span>")
return 0 return 0
@@ -124,6 +135,20 @@
else else
handle_click_empty(user) handle_click_empty(user)
return 0 return 0
if(pin && needspin)
if(pin.pin_auth(user) || pin.emagged)
return 1
else
pin.auth_fail(user)
return 0
else
if(needspin)
to_chat(user, "<span class='warning'>[src]'s trigger is locked. This weapon doesn't have a firing pin installed!</span>")
return 0
else
return 1
return 1 return 1
/obj/item/weapon/gun/emp_act(severity) /obj/item/weapon/gun/emp_act(severity)
@@ -397,6 +422,14 @@
var/obj/item/projectile/in_chamber = consume_next_projectile() var/obj/item/projectile/in_chamber = consume_next_projectile()
if (istype(in_chamber)) if (istype(in_chamber))
user.visible_message("<span class = 'warning'>[user] pulls the trigger.</span>") user.visible_message("<span class = 'warning'>[user] pulls the trigger.</span>")
if (!pin && needspin)//Checks the pin of the gun.
user.visible_message("<span class = 'warning'>*click click*</span>")
mouthshoot = 0
return
if (!pin.pin_auth() && needspin)
user.visible_message("<span class = 'warning'>*click click*</span>")
mouthshoot = 0
return
if(silenced) if(silenced)
playsound(user, fire_sound, 10, 1) playsound(user, fire_sound, 10, 1)
else else
@@ -607,6 +640,20 @@
mob_can_equip(M as mob, slot) mob_can_equip(M as mob, slot)
return 0 return 0
/obj/item/weapon/gun/examine(mob/user)
..()
if(needspin)
if(pin)
user << "There is a \[pin] in the trigger mechanism."
else
user << "It doesn't have a firing pin installed, and won't fire."
obj/item/weapon/gun/Destroy()
if (istype(pin))
QDEL_NULL(pin)
return ..()
/obj/item/weapon/gun/proc/handle_reliability_fail(var/mob/user) /obj/item/weapon/gun/proc/handle_reliability_fail(var/mob/user)
var/severity = 1 var/severity = 1
if(prob(100-reliability)) if(prob(100-reliability))
@@ -629,3 +676,23 @@
/obj/item/weapon/gun/proc/critical_fail(var/mob/user) /obj/item/weapon/gun/proc/critical_fail(var/mob/user)
return return
/obj/item/weapon/gun/attackby(var/obj/item/I as obj, var/mob/user as mob)
if(!pin)
return ..()
if(isscrewdriver(I))
visible_message("<span class = 'warning'>[user] begins to try and pry out [src]'s firing pin!</span>")
if(do_after(user,45 SECONDS,act_target = src))
if(pin.durable)
visible_message("<span class = 'notice'>[user] pops the [pin] out of [src]!</span>")
pin.forceMove(get_turf(src))
pin = null//clear it out.
else
user.visible_message(
"<span class='warning'>[user] breaks some electronics free from [src] with a crack.</span>",
"<span class='alert'>You apply a bit too much force to [pin], and it breaks in two. Oops.</span>",
"You hear a metallic crack.")
qdel(pin)
pin = null
.=..()

View File

@@ -65,6 +65,7 @@ obj/item/weapon/gun/energy/retro
charge_cost = 400 charge_cost = 400
max_shots = 5 max_shots = 5
fire_delay = 20 fire_delay = 20
pin = null
can_turret = 1 can_turret = 1
turret_sprite_set = "cannon" turret_sprite_set = "cannon"
@@ -86,6 +87,7 @@ obj/item/weapon/gun/energy/retro
charge_cost = 100 charge_cost = 100
max_shots = 20 max_shots = 20
fire_delay = 1 fire_delay = 1
pin = null
can_turret = 1 can_turret = 1
turret_sprite_set = "xray" turret_sprite_set = "xray"
@@ -158,6 +160,7 @@ obj/item/weapon/gun/energy/retro
move_delay = 0 move_delay = 0
fire_delay = 2 fire_delay = 2
dispersion = list(1.0, -1.0, 2.0, -2.0) dispersion = list(1.0, -1.0, 2.0, -2.0)
pin = null
can_turret = 1 can_turret = 1
turret_sprite_set = "laser" turret_sprite_set = "laser"
@@ -186,6 +189,7 @@ obj/item/weapon/gun/energy/retro
item_state = "bluetag" item_state = "bluetag"
projectile_type = /obj/item/projectile/beam/lastertag/blue projectile_type = /obj/item/projectile/beam/lastertag/blue
required_vest = /obj/item/clothing/suit/bluetag required_vest = /obj/item/clothing/suit/bluetag
pin = /obj/item/device/firing_pin/tag/blue
can_turret = 1 can_turret = 1
turret_is_lethal = 0 turret_is_lethal = 0
turret_sprite_set = "blue" turret_sprite_set = "blue"
@@ -195,6 +199,7 @@ obj/item/weapon/gun/energy/retro
item_state = "redtag" item_state = "redtag"
projectile_type = /obj/item/projectile/beam/lastertag/red projectile_type = /obj/item/projectile/beam/lastertag/red
required_vest = /obj/item/clothing/suit/redtag required_vest = /obj/item/clothing/suit/redtag
pin = /obj/item/device/firing_pin/tag/red
can_turret = 1 can_turret = 1
turret_is_lethal = 0 turret_is_lethal = 0
turret_sprite_set = "red" turret_sprite_set = "red"

View File

@@ -14,6 +14,7 @@
var/message_enabled = 0 //If playing the message should be enabled var/message_enabled = 0 //If playing the message should be enabled
var/message_disable = 0 //If the loop should be stopped var/message_disable = 0 //If the loop should be stopped
var/default_desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes." var/default_desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes."
pin = null
firemodes = list( firemodes = list(
list( list(
@@ -122,7 +123,7 @@
message_enabled = 0 message_enabled = 0
message_disable = 0 message_disable = 0
/obj/item/weapon/gun/energy/lawgiver/attack_self(mob/living/carbon/user as mob) /obj/item/weapon/gun/energy/lawgiver/attack_self(mob/living/carbon/user as mob) //can probably remove this in favor of the DNA locked firing pins. not touching that now though. edit: lol nevermind snowflake code of the year
if(dna != null) if(dna != null)
return return
else else
@@ -144,7 +145,7 @@
user << "<span class='danger'>You hear a soft beep from the gun and 'ID FAIL' flashes across the screen.</span>" user << "<span class='danger'>You hear a soft beep from the gun and 'ID FAIL' flashes across the screen.</span>"
user << "<span class='danger'>You feel a tiny prick in your hand!</span>" user << "<span class='danger'>You feel a tiny prick in your hand!</span>"
user.drop_item() user.drop_item()
//Blow up Unauthorized Users Hand //Blow up Unauthorized Users Hand//todo, delet this, as it's duplicate behaviour from Firing pins.
sleep(60) sleep(60)
if(active_hand) if(active_hand)
LA.droplimb(0,DROPLIMB_BLUNT) LA.droplimb(0,DROPLIMB_BLUNT)

View File

@@ -16,6 +16,8 @@
origin_tech = list(TECH_COMBAT = 7, TECH_MAGNET = 5, TECH_BLUESPACE = 7) origin_tech = list(TECH_COMBAT = 7, TECH_MAGNET = 5, TECH_BLUESPACE = 7)
self_recharge = 1 self_recharge = 1
charge_meter = 0 charge_meter = 0
pin = /obj/item/device/firing_pin/magic
obj/item/weapon/gun/energy/staff/special_check(var/mob/living/user) obj/item/weapon/gun/energy/staff/special_check(var/mob/living/user)
if(HULK in user.mutations) if(HULK in user.mutations)
@@ -187,6 +189,7 @@ obj/item/weapon/gun/energy/staff/focus/attack_self(mob/living/user as mob)
projectile_type = /obj/item/projectile/magic projectile_type = /obj/item/projectile/magic
origin_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 5, TECH_BLUESPACE = 6) origin_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 5, TECH_BLUESPACE = 6)
charge_meter = 0 charge_meter = 0
pin = /obj/item/device/firing_pin/magic
charge_failure_message = null charge_failure_message = null
/obj/item/weapon/gun/energy/wand/get_cell() /obj/item/weapon/gun/energy/wand/get_cell()

View File

@@ -16,7 +16,6 @@
origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 4, TECH_POWER = 4) origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 4, TECH_POWER = 4)
projectile_type = /obj/item/projectile/kinetic projectile_type = /obj/item/projectile/kinetic
fire_sound = 'sound/weapons/Kenetic_accel.ogg' fire_sound = 'sound/weapons/Kenetic_accel.ogg'
var/max_mod_capacity = 100 var/max_mod_capacity = 100
var/list/modkits = list() var/list/modkits = list()

View File

@@ -6,6 +6,7 @@
fire_sound = 'sound/weapons/Taser.ogg' fire_sound = 'sound/weapons/Taser.ogg'
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
max_shots = 10 max_shots = 10
pin = null
can_turret = 1 can_turret = 1
secondary_projectile_type = /obj/item/projectile/beam secondary_projectile_type = /obj/item/projectile/beam
secondary_fire_sound = 'sound/weapons/Laser.ogg' secondary_fire_sound = 'sound/weapons/Laser.ogg'
@@ -38,6 +39,7 @@
force = 8 //looks heavier than a pistol force = 8 //looks heavier than a pistol
self_recharge = 1 self_recharge = 1
modifystate = null modifystate = null
pin = null
reliability = 95 reliability = 95
turret_sprite_set = "nuclear" turret_sprite_set = "nuclear"
charge_failure_message = "'s charging socket was removed to make room for a minaturized reactor." charge_failure_message = "'s charging socket was removed to make room for a minaturized reactor."

View File

@@ -9,6 +9,7 @@
projectile_type = /obj/item/projectile/beam projectile_type = /obj/item/projectile/beam
sel_mode = 2 sel_mode = 2
max_shots = 10 max_shots = 10
pin = null
can_turret = 1 can_turret = 1
secondary_projectile_type = /obj/item/projectile/beam/pulse secondary_projectile_type = /obj/item/projectile/beam/pulse
secondary_fire_sound = 'sound/weapons/pulse.ogg' secondary_fire_sound = 'sound/weapons/pulse.ogg'
@@ -37,3 +38,4 @@
icon_state = "pulse_pistol" icon_state = "pulse_pistol"
item_state = "pulse_pistol" item_state = "pulse_pistol"
max_shots = 5 max_shots = 5
pin = null

View File

@@ -41,6 +41,7 @@
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_POWER = 3) origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_POWER = 3)
max_shots = 10 max_shots = 10
projectile_type = /obj/item/projectile/energy/declone projectile_type = /obj/item/projectile/energy/declone
pin = null
/obj/item/weapon/gun/energy/floragun /obj/item/weapon/gun/energy/floragun
name = "floral somatoray" name = "floral somatoray"
@@ -111,6 +112,7 @@
w_class = 3.0 w_class = 3.0
origin_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4) origin_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4)
projectile_type = /obj/item/projectile/energy/phoron projectile_type = /obj/item/projectile/energy/phoron
pin = null
can_turret = 1 can_turret = 1
turret_is_lethal = 0 turret_is_lethal = 0
turret_sprite_set = "net" turret_sprite_set = "net"
@@ -133,6 +135,7 @@
move_delay = 3 move_delay = 3
fire_delay = 0 fire_delay = 0
dispersion = list(0.0, 0.2, -0.2) dispersion = list(0.0, 0.2, -0.2)
pin = null
/obj/item/weapon/gun/energy/mousegun /obj/item/weapon/gun/energy/mousegun
name = "\improper NT \"Arodentia\" Exterminator ray" name = "\improper NT \"Arodentia\" Exterminator ray"
@@ -223,6 +226,7 @@
burst_delay = 1 burst_delay = 1
fire_delay = 10 fire_delay = 10
dispersion = list(0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9) dispersion = list(0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)
pin = null
firemodes = list( firemodes = list(
list(mode_name="concentrated burst", burst=10, burst_delay = 1, fire_delay = 10, dispersion = list(0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)), list(mode_name="concentrated burst", burst=10, burst_delay = 1, fire_delay = 10, dispersion = list(0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)),
@@ -285,9 +289,9 @@
burst = 1 burst = 1
burst_delay = 1 burst_delay = 1
fire_delay = 0 fire_delay = 0
pin = null
can_turret = 1 can_turret = 1
turret_sprite_set = "laser" turret_sprite_set = "laser"
firemodes = list( firemodes = list(
list(mode_name="single shot", burst=1, burst_delay = 1, fire_delay = 0), list(mode_name="single shot", burst=1, burst_delay = 1, fire_delay = 0),
list(mode_name="concentrated burst", burst=3, burst_delay = 1, fire_delay = 5) list(mode_name="concentrated burst", burst=3, burst_delay = 1, fire_delay = 5)

View File

@@ -31,6 +31,7 @@
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
projectile_type = /obj/item/projectile/energy/electrode projectile_type = /obj/item/projectile/energy/electrode
max_shots = 8 max_shots = 8
pin = null
/obj/item/weapon/gun/energy/crossbow /obj/item/weapon/gun/energy/crossbow

View File

@@ -12,6 +12,7 @@
multi_aim = 1 multi_aim = 1
burst_delay = 2 burst_delay = 2
sel_mode = 1 sel_mode = 1
pin = null
firemodes = list( firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
@@ -321,6 +322,7 @@
allowed_magazines = list(/obj/item/ammo_magazine/trodpack) allowed_magazines = list(/obj/item/ammo_magazine/trodpack)
auto_eject = 1 auto_eject = 1
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
pin = null
firemodes = list( firemodes = list(
list(mode_name="single coil", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), list(mode_name="single coil", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),

View File

@@ -118,6 +118,7 @@
handle_casings = CYCLE_CASINGS handle_casings = CYCLE_CASINGS
max_shells = 7 max_shells = 7
ammo_type = /obj/item/ammo_casing/cap ammo_type = /obj/item/ammo_casing/cap
needspin = FALSE
/obj/item/weapon/gun/projectile/revolver/capgun/attackby(obj/item/W, mob/user) /obj/item/weapon/gun/projectile/revolver/capgun/attackby(obj/item/W, mob/user)
if(!iswirecutter(W) || icon_state == "revolver") if(!iswirecutter(W) || icon_state == "revolver")

View File

@@ -0,0 +1,207 @@
/*
Alright boys, Firing pins. hopefully with minimal shitcode.
"pin_auth(mob/living/user)" is the check to see if it fires, put the snowflake code here. return one to fire, zero to flop. ezpz
Firing pins as a rule can't be removed without replacing them, blame a really shitty mechanism for it by NT or something idk, this is to stop people from just taking pins from like a capgun or something.
*/
/obj/item/device/firing_pin
name = "electronic firing pin"
desc = "A small authentication device, to be inserted into a firearm receiver to allow operation. NT safety regulations require all new designs to incorporate one."
icon = 'icons/obj/firingpins.dmi'
icon_state = "firing_pin"
item_state = "pen"
origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 2)
flags = CONDUCT
w_class = 1
attack_verb = list("poked")
var/emagged = FALSE
var/fail_message = "<span class='warning'>INVALID USER.</span>"
var/selfdestruct = 0 // Explode when user check is failed.
var/force_replace = 0 // Can forcefully replace other pins.
var/pin_replaceable = 0 // Can be replaced by any pin.
var/durable = FALSE //is destroyed when it's pried out with a screwdriver, see gun.dm
var/obj/item/weapon/gun/gun
/obj/item/device/firing_pin/Initialize(mapload)
.=..()
if(istype(loc, /obj/item/weapon/gun))
gun = loc
/obj/item/device/firing_pin/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag)
if(istype(target, /obj/item/weapon/gun))
var/obj/item/weapon/gun/G = target
if(G.pin && (force_replace || G.pin.pin_replaceable))
G.pin.forceMove(get_turf(G))
G.pin.gun_remove(user)
to_chat(user, "<span class ='notice'>You remove [G]'s old pin.</span>")
if(!G.pin)
gun_insert(user, G)
to_chat(user, "<span class ='notice'>You insert [src] into [G].</span>")
else
to_chat(user, "<span class ='notice'>This firearm already has a firing pin installed.</span>")
/obj/item/device/firing_pin/emag_act(mob/user)
if(!emagged)
emagged = TRUE
to_chat(user, "<span class='notice'>You override the authentication mechanism.</span>")
/obj/item/device/firing_pin/proc/gun_insert(mob/living/user, obj/item/weapon/gun/G)
gun = G
user.drop_from_inventory(src)
forceMove(gun)
gun.pin = src
return
/obj/item/device/firing_pin/proc/gun_remove(mob/living/user)
gun.pin = null
gun = null
qdel(src)
return
/obj/item/device/firing_pin/proc/pin_auth(mob/living/user)
return 1
/obj/item/device/firing_pin/proc/auth_fail(mob/living/carbon/human/user)
user.show_message(fail_message, 1)
if(selfdestruct)//sound stolen from the lawgiver. todo, remove this from the lawgiver. there can only be one.
user.show_message("<span class='danger'>SELF-DESTRUCTING...</span><br>", 1)
visible_message("<span class='danger'>[gun] explodes!</span>")
playsound(user, 'sound/weapons/lawgiver_idfail.ogg', 40, 1)
var/obj/item/organ/external/E = user.organs_by_name[user.hand ? "l_hand" : "r_hand"]
E.droplimb(0,DROPLIMB_BLUNT)
explosion(get_turf(gun), -1, 0, 2, 3)
if(gun)
qdel(gun)
/*
Pins Below.
*/
//only used in wizard staffs/wands.
/obj/item/device/firing_pin/magic
name = "magic crystal shard"
desc = "A small enchanted shard which allows magical weapons to fire."
icon_state = "firing_pin_wizwoz"
// Test pin, works only near firing ranges.
/obj/item/device/firing_pin/test_range
name = "test-range firing pin"
desc = "This safety firing pin allows weapons to be fired within proximity to a firing range."
fail_message = "<span class='warning'>TEST RANGE CHECK FAILED.</span>"
pin_replaceable = 1
durable = TRUE
origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 2)
/obj/item/device/firing_pin/test_range/pin_auth(mob/living/user)
var/area/A = get_area(src)
if (A && (A.flags & FIRING_RANGE))
return 1
else
return 0
// Implant pin, checks for implant
/obj/item/device/firing_pin/implant
name = "implant-keyed firing pin"
desc = "This is a implant-locked firing pin which only authorizes users who are implanted with a certain device."
fail_message = "<span class='warning'>IMPLANT CHECK FAILED.</span>"
var/req_implant
/obj/item/device/firing_pin/implant/pin_auth(mob/living/user)
if (locate(req_implant) in user)
return 1
else
return 0
/obj/item/device/firing_pin/implant/loyalty
name = "loyalty firing pin"
desc = "This implant-locked firing pin authorizes the weapon for only loyalty-implanted users."
icon_state = "firing_pin_loyalty"
req_implant = /obj/item/weapon/implant/loyalty
// Honk pin, clown joke item.
// Can replace other pins. Replace a pin in cap's laser for extra fun! This is generally adminbus only unless someone thinks of a use for it.
/obj/item/device/firing_pin/clown
name = "hilarious firing pin"
desc = "Advanced clowntech that can convert any firearm into a far more useful object."
color = "#FFFF00"
fail_message = "<span class='warning'>HONK!</span>"
force_replace = 1
/obj/item/device/firing_pin/clown/pin_auth(mob/living/user)
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
return 0
// DNA-keyed pin.
// When you want to keep your toys for youself.
/obj/item/device/firing_pin/dna
name = "DNA-keyed firing pin"
desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link."
icon_state = "firing_pin_dna"
fail_message = "<span class='warning'>DNA CHECK FAILED.</span>"
var/unique_enzymes = null
/obj/item/device/firing_pin/dna/afterattack(atom/target, mob/user, proximity_flag)
..()
if(proximity_flag && iscarbon(target))
var/mob/living/carbon/M = target
if(M.dna && M.dna.unique_enzymes)
unique_enzymes = M.dna.unique_enzymes
to_chat(user, "<span class='notice'>DNA-LOCK SET.</span>")
/obj/item/device/firing_pin/dna/pin_auth(mob/living/carbon/user)
if(istype(user) && user.dna && user.dna.unique_enzymes)
if(user.dna.unique_enzymes == unique_enzymes)
return 1
return 0
/obj/item/device/firing_pin/dna/auth_fail(mob/living/carbon/user)
if(!unique_enzymes)
if(istype(user) && user.dna && user.dna.unique_enzymes)
unique_enzymes = user.dna.unique_enzymes
to_chat(user, "<span class='notice'>DNA-LOCK SET.</span>")
else
..()
/obj/item/device/firing_pin/dna/dredd
desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link. It has a small explosive charge on it."
selfdestruct = 1
// Laser tag pins
/obj/item/device/firing_pin/tag
name = "laser tag firing pin"
desc = "A recreational firing pin, used in laser tag units to ensure users have their vests on."
fail_message = "<span class='warning'>SUIT CHECK FAILED.</span>"
var/obj/item/clothing/suit/suit_requirement = null
var/tagcolor = ""
/obj/item/device/firing_pin/tag/pin_auth(mob/living/user)
if(ishuman(user))
var/mob/living/carbon/human/M = user
if(istype(M.wear_suit, suit_requirement))
return 1
to_chat(user, "<span class='warning'>You need to be wearing [tagcolor] laser tag armor!</span>")
return 0
/obj/item/device/firing_pin/tag/red
name = "red laser tag firing pin"
icon_state = "firing_pin_red"
suit_requirement = /obj/item/clothing/suit/redtag
tagcolor = "red"
/obj/item/device/firing_pin/tag/blue
name = "blue laser tag firing pin"
icon_state = "firing_pin_blue"
suit_requirement = /obj/item/clothing/suit/bluetag
tagcolor = "blue"
/obj/item/device/firing_pin/Destroy()
if(gun)
gun.pin = null
return ..()

View File

@@ -0,0 +1,5 @@
author: Pacmandevil
delete-after: True
changes:
- rscadd: "Firing pins. Guns now need an Authentication device to fire. there are several different types."
- rscadd: "Science now has a testing range to test guns in."

BIN
icons/obj/firingpins.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -76,6 +76,10 @@
name = "\improper Research - Miscellaneous Research" name = "\improper Research - Miscellaneous Research"
icon_state = "toxmisc" icon_state = "toxmisc"
/area/rnd/test_range
name = "\improper Research - Weapons Testing Range"
flags = FIRING_RANGE
/area/toxins /area/toxins
station_area = 1 station_area = 1

View File

@@ -60,6 +60,7 @@
/area/security/range /area/security/range
name = "\improper Security - Firing Range" name = "\improper Security - Firing Range"
icon_state = "firingrange" icon_state = "firingrange"
flags = FIRING_RANGE
/area/security/tactical /area/security/tactical
name = "\improper Security - Tactical Equipment" name = "\improper Security - Tactical Equipment"

View File

@@ -17503,14 +17503,24 @@
/turf/simulated/floor/plating, /turf/simulated/floor/plating,
/area/medical/patient_wing) /area/medical/patient_wing)
"FP" = ( "FP" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/structure/cable/green{ /obj/structure/cable/green{
d1 = 1; d1 = 1;
d2 = 2; d2 = 2;
icon_state = "1-2" icon_state = "1-2"
}, },
/obj/effect/floor_decal/corner/mauve, /obj/effect/floor_decal/corner/mauve,
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
icon_state = "map-scrubbers";
dir = 4
},
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
dir = 4
},
/obj/structure/cable/green{
d1 = 1;
d2 = 8;
icon_state = "1-8"
},
/turf/simulated/floor/tiled/white, /turf/simulated/floor/tiled/white,
/area/outpost/research/hallway) /area/outpost/research/hallway)
"FQ" = ( "FQ" = (
@@ -24812,8 +24822,7 @@
/obj/machinery/atmospherics/valve/digital{ /obj/machinery/atmospherics/valve/digital{
dir = 4; dir = 4;
icon_state = "map_valve0"; icon_state = "map_valve0";
name = "Air Bypass valve"; name = "Air Bypass valve"
}, },
/turf/simulated/floor/tiled, /turf/simulated/floor/tiled,
/area/engineering/atmos) /area/engineering/atmos)
@@ -25041,6 +25050,435 @@
}, },
/turf/simulated/floor/tiled/freezer, /turf/simulated/floor/tiled/freezer,
/area/crew_quarters/medbreak) /area/crew_quarters/medbreak)
"TS" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"TT" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"TU" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"TV" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"TW" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"TX" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"TY" = (
/obj/effect/floor_decal/corner/mauve{
icon_state = "corner_white";
dir = 5
},
/obj/effect/floor_decal/corner/mauve{
icon_state = "corner_white";
dir = 9
},
/obj/machinery/bodyscanner{
tag = "icon-body_scanner_0 (WEST)";
icon_state = "body_scanner_0";
dir = 8
},
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"TZ" = (
/obj/effect/floor_decal/corner/mauve{
icon_state = "corner_white";
dir = 5
},
/obj/machinery/body_scanconsole{
tag = "icon-body_scannerconsole (WEST)";
icon_state = "body_scannerconsole";
dir = 8
},
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Ua" = (
/obj/effect/floor_decal/corner/mauve{
icon_state = "corner_white";
dir = 5
},
/obj/structure/bed/chair/office/light{
tag = "icon-officechair_white (EAST)";
icon_state = "officechair_white";
dir = 4
},
/obj/machinery/firealarm/north,
/obj/machinery/light{
dir = 1
},
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Ub" = (
/obj/effect/floor_decal/corner/mauve{
icon_state = "corner_white";
dir = 5
},
/obj/effect/floor_decal/corner/mauve{
icon_state = "corner_white";
dir = 6
},
/obj/structure/table/reinforced,
/obj/item/weapon/paper_bin,
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Uc" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"Ud" = (
/obj/effect/floor_decal/corner/mauve{
icon_state = "corner_white";
dir = 9
},
/obj/machinery/alarm{
dir = 4;
pixel_x = -23;
pixel_y = 0
},
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Ue" = (
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Uf" = (
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Ug" = (
/obj/effect/floor_decal/corner/mauve{
icon_state = "corner_white";
dir = 6
},
/obj/structure/table/reinforced,
/obj/item/weapon/pen,
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Uh" = (
/obj/structure/grille,
/obj/structure/window/reinforced{
dir = 8
},
/obj/structure/window/reinforced{
icon_state = "rwindow";
dir = 4
},
/obj/machinery/door/firedoor,
/obj/machinery/door/blast/regular{
density = 0;
dir = 1;
icon_state = "pdoor0";
id = "Biohazard";
name = "Biohazard Shutter";
opacity = 0
},
/obj/structure/window/reinforced,
/turf/simulated/floor/plating,
/area/outpost/research/hallway)
"Ui" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"Uj" = (
/obj/effect/floor_decal/corner/mauve{
icon_state = "corner_white";
dir = 9
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
icon_state = "intact-supply";
dir = 6
},
/obj/machinery/power/apc{
dir = 8;
name = "west bump";
pixel_x = -24
},
/obj/structure/cable/green{
d2 = 4;
icon_state = "0-4"
},
/obj/machinery/light{
dir = 8
},
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Uk" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/obj/structure/cable/green{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Ul" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Um" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 6
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/obj/structure/cable/green{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Un" = (
/obj/machinery/door/airlock/glass_research{
name = "Test Range"
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/obj/structure/cable/green{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/turf/simulated/floor/tiled/white,
/area/outpost/research/hallway)
"Uo" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/turf/simulated/floor/tiled/white,
/area/outpost/research/hallway)
"Up" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/turf/simulated/floor/tiled/white,
/area/outpost/research/hallway)
"Uq" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"Ur" = (
/obj/effect/floor_decal/corner/mauve{
icon_state = "corner_white";
dir = 9
},
/obj/effect/floor_decal/industrial/warning,
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 1
},
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Us" = (
/obj/effect/floor_decal/industrial/warning,
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Ut" = (
/obj/effect/floor_decal/industrial/warning,
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Uu" = (
/obj/effect/floor_decal/corner/mauve{
icon_state = "corner_white";
dir = 6
},
/obj/effect/floor_decal/industrial/warning,
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 1
},
/turf/simulated/floor/tiled/white,
/area/rnd/test_range)
"Uv" = (
/obj/structure/grille,
/obj/structure/window/reinforced{
dir = 8
},
/obj/structure/window/reinforced{
icon_state = "rwindow";
dir = 4
},
/obj/machinery/door/firedoor,
/obj/machinery/door/blast/regular{
density = 0;
dir = 1;
icon_state = "pdoor0";
id = "Biohazard";
name = "Biohazard Shutter";
opacity = 0
},
/obj/effect/floor_decal/industrial/warning,
/obj/structure/window/reinforced{
icon_state = "rwindow";
dir = 1
},
/turf/simulated/floor/plating,
/area/outpost/research/hallway)
"Uw" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"Ux" = (
/obj/machinery/door/window/southright,
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"Uy" = (
/obj/structure/table/reinforced,
/obj/structure/window/reinforced{
icon_state = "rwindow";
dir = 8
},
/obj/item/device/firing_pin/test_range,
/obj/item/device/firing_pin/test_range,
/obj/item/device/firing_pin/test_range,
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"Uz" = (
/obj/structure/table/reinforced,
/obj/effect/floor_decal/industrial/warning{
dir = 8
},
/obj/effect/floor_decal/industrial/warning{
dir = 4
},
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UA" = (
/obj/structure/table/reinforced,
/obj/item/target,
/obj/item/target,
/obj/item/target,
/obj/structure/closet/crate{
name = "Target Crate"
},
/obj/item/weapon/storage/box/monkeycubes,
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UB" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"UC" = (
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UD" = (
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UE" = (
/obj/effect/floor_decal/industrial/warning{
dir = 8
},
/obj/effect/floor_decal/industrial/warning{
dir = 4
},
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UF" = (
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UG" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"UH" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"UI" = (
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UJ" = (
/obj/effect/floor_decal/industrial/warning{
dir = 8
},
/obj/effect/floor_decal/industrial/warning{
dir = 4
},
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UK" = (
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UL" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"UM" = (
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UN" = (
/obj/effect/floor_decal/industrial/warning{
dir = 8
},
/obj/effect/floor_decal/industrial/warning{
dir = 4
},
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UO" = (
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UP" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"UQ" = (
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UR" = (
/obj/effect/floor_decal/industrial/warning{
dir = 8
},
/obj/effect/floor_decal/industrial/warning{
dir = 4
},
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"US" = (
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UT" = (
/turf/simulated/wall/r_wall,
/area/rnd/test_range)
"UU" = (
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UV" = (
/obj/structure/target_stake,
/obj/effect/floor_decal/industrial/warning{
dir = 8
},
/obj/effect/floor_decal/industrial/warning{
dir = 4
},
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UW" = (
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UX" = (
/obj/machinery/light{
dir = 8
},
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UY" = (
/obj/machinery/light{
dir = 4;
status = 2
},
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
"UZ" = (
/obj/effect/decal/cleanable/blood,
/turf/simulated/floor/tiled/dark,
/area/rnd/test_range)
(1,1,1) = {" (1,1,1) = {"
aa aa
@@ -42154,16 +42592,16 @@ aa
aa aa
aa aa
aa aa
TS
TS
TS
TS
TS
TS
TS
TS
ac ac
ac mb
ac
ac
ac
ac
ac
ac
ac
ac
aa aa
KO KO
Ls Ls
@@ -42411,17 +42849,17 @@ aa
aa aa
aa aa
aa aa
ac TS
ac TY
ac Ud
ac Uj
ac Ur
ac Ux
ac UC
ac TS
ac TS
aa TS
aa TS
KO KO
Lt Lt
LV LV
@@ -42668,17 +43106,17 @@ aa
aa aa
aa aa
aa aa
ac TS
ac TZ
ac Ue
ac Uk
ac Us
ac Uy
ac UC
ac UX
ac UC
aa UC
aa UZ
KO KO
Lu Lu
LW LW
@@ -42925,17 +43363,17 @@ aa
aa aa
aa aa
aa aa
ac TS
ac Ua
ac Ue
ac Uk
ac Us
ac Uz
ac UE
ac UE
aa UE
aa UE
aa UV
KO KO
KO KO
KO KO
@@ -43182,17 +43620,17 @@ aa
aa aa
aa aa
aa aa
aa TS
ac Ub
ac Ug
ac Um
ac Uu
ac UA
ac UC
aa UY
aa UC
aa UC
aa UC
KP KP
Lv Lv
Lv Lv
@@ -43441,9 +43879,9 @@ xv
xv xv
xv xv
uZ uZ
vs Uh
vs Un
vs Uv
vs vs
xe xe
xy xy
@@ -43699,7 +44137,7 @@ Db
SQ SQ
Ex Ex
Ff Ff
vt vv
Co Co
Hp Hp
HY HY
@@ -43956,7 +44394,7 @@ Dc
SQ SQ
vb vb
uD uD
uD vv
GK GK
Hq Hq
HZ HZ
@@ -63763,7 +64201,7 @@ OM
Pn Pn
PI PI
PZ PZ
TR TQ
Ko Ko
aa aa
aa aa

View File

@@ -12813,6 +12813,7 @@
dir = 4 dir = 4
}, },
/obj/structure/table/rack, /obj/structure/table/rack,
/obj/item/weapon/storage/box/firingpins,
/turf/simulated/floor/tiled/dark, /turf/simulated/floor/tiled/dark,
/area/security/armoury) /area/security/armoury)
"axm" = ( "axm" = (
@@ -14647,6 +14648,7 @@
pixel_y = -2 pixel_y = -2
}, },
/obj/item/weapon/storage/box/teargas, /obj/item/weapon/storage/box/teargas,
/obj/item/weapon/storage/box/firingpins,
/turf/simulated/floor/tiled/dark, /turf/simulated/floor/tiled/dark,
/area/security/armoury) /area/security/armoury)
"aAp" = ( "aAp" = (