diff --git a/code/datums/supplypacks/recreation.dm b/code/datums/supplypacks/recreation.dm
index 9c12c17a149..357f0eaeadc 100644
--- a/code/datums/supplypacks/recreation.dm
+++ b/code/datums/supplypacks/recreation.dm
@@ -87,4 +87,14 @@
contains = list(
/obj/item/weapon/storage/box/wormcan,
/obj/item/weapon/storage/box/wormcan/deluxe
+ )
+
+/datum/supply_pack/recreation/ltagturrets
+ name = "Laser Tag Turrets"
+ cost = 40
+ containername = "laser tag turret crate"
+ containertype = /obj/structure/closet/crate
+ contains = list(
+ /obj/machinery/porta_turret/lasertag/blue,
+ /obj/machinery/porta_turret/lasertag/red
)
\ No newline at end of file
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 12343bb3430..bf946b444ed 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -36,83 +36,73 @@
name = "turret"
catalogue_data = list(/datum/category_item/catalogue/technology/turret)
icon = 'icons/obj/turrets.dmi'
- icon_state = "turret_cover"
- anchored = 1
+ icon_state = "turret_cover_normal"
+ anchored = TRUE
- density = 0
- use_power = 1 //this turret uses and requires power
+ density = FALSE
+ use_power = TRUE //this turret uses and requires power
idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power
active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power
power_channel = EQUIP //drains power from the EQUIPMENT channel
req_one_access = list(access_security, access_heads)
- // icon_states for turrets.
- // These are for the turret covers.
- var/closed_state = "turret_cover" // For when it is closed.
- var/raising_state = "popup" // When turret is opening.
- var/opened_state = "open" // When fully opened.
- var/lowering_state = "popdown" // When closing.
- var/gun_active_state = "target_prism" // The actual gun's icon_state when active.
- var/gun_disabled_state = "grey_target_prism" // Gun sprite when depowered/disabled.
- var/gun_destroyed_state = "destroyed_target_prism" // Turret sprite for when the turret dies.
-
- var/raised = 0 //if the turret cover is "open" and the turret is raised
- var/raising= 0 //if the turret is currently opening or closing its cover
- var/health = 80 //the turret's health
- var/maxhealth = 80 //turrets maximal health.
- var/auto_repair = 0 //if 1 the turret slowly repairs itself.
- var/locked = 1 //if the turret's behaviour control access is locked
- var/controllock = 0 //if the turret responds to control panels
+ var/raised = FALSE //if the turret cover is "open" and the turret is raised
+ var/raising= FALSE //if the turret is currently opening or closing its cover
+ var/health = 80 //the turret's health
+ var/maxhealth = 80 //turrets maximal health.
+ var/auto_repair = FALSE //if 1 the turret slowly repairs itself.
+ var/locked = TRUE //if the turret's behaviour control access is locked
+ var/controllock = FALSE //if the turret responds to control panels
var/installation = /obj/item/weapon/gun/energy/gun //the type of weapon installed
- var/gun_charge = 0 //the charge of the gun inserted
- var/projectile = null //holder for bullettype
- var/eprojectile = null //holder for the shot when emagged
- var/reqpower = 500 //holder for power needed
- var/iconholder = null //holder for the icon_state. 1 for sprite based on icon_color, null for blue.
- var/icon_color = "orange" // When iconholder is set to 1, the icon_state changes based on what is in this variable.
- var/egun = null //holder to handle certain guns switching bullettypes
+ var/gun_charge = 0 //the charge of the gun inserted
+ var/projectile = null //holder for bullettype
+ var/lethal_projectile = null //holder for the shot when emagged
+ var/reqpower = 500 //holder for power needed
+ var/turret_type = "normal"
+ var/icon_color = "blue"
+ var/lethal_icon_color = "blue"
- var/last_fired = 0 //1: if the turret is cooling down from a shot, 0: turret is ready to fire
+ var/last_fired = FALSE //TRUE: if the turret is cooling down from a shot, FALSE: turret is ready to fire
var/shot_delay = 1.5 SECONDS //1.5 seconds between each shot
- var/check_arrest = 1 //checks if the perp is set to arrest
- var/check_records = 1 //checks if a security record exists at all
- var/check_weapons = 0 //checks if it can shoot people that have a weapon they aren't authorized to have
- var/check_access = 1 //if this is active, the turret shoots everything that does not meet the access requirements
- var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos)
- var/check_synth = 0 //if active, will shoot at anything not an AI or cyborg
- var/check_all = 0 //If active, will fire on anything, including synthetics.
- var/ailock = 0 // AI cannot use this
- var/faction = null //if set, will not fire at people in the same faction for any reason.
+ var/check_arrest = TRUE //checks if the perp is set to arrest
+ var/check_records = TRUE //checks if a security record exists at all
+ var/check_weapons = FALSE //checks if it can shoot people that have a weapon they aren't authorized to have
+ var/check_access = TRUE //if this is active, the turret shoots everything that does not meet the access requirements
+ var/check_anomalies = TRUE //checks if it can shoot at unidentified lifeforms (ie xenos)
+ var/check_synth = FALSE //if active, will shoot at anything not an AI or cyborg
+ var/check_all = FALSE //If active, will fire on anything, including synthetics.
+ var/ailock = FALSE // AI cannot use this
+ var/faction = null //if set, will not fire at people in the same faction for any reason.
- var/attacked = 0 //if set to 1, the turret gets pissed off and shoots at people nearby (unless they have sec access!)
+ var/attacked = FALSE //if set to TRUE, the turret gets pissed off and shoots at people nearby (unless they have sec access!)
- var/enabled = 1 //determines if the turret is on
- var/lethal = 0 //whether in lethal or stun mode
- var/disabled = 0
+ var/enabled = TRUE //determines if the turret is on
+ var/lethal = FALSE //whether in lethal or stun mode
+ var/disabled = FALSE
- var/shot_sound //what sound should play when the turret fires
- var/eshot_sound //what sound should play when the emagged turret fires
+ var/shot_sound //what sound should play when the turret fires
+ var/lethal_shot_sound //what sound should play when the emagged turret fires
var/datum/effect/effect/system/spark_spread/spark_system //the spark system, used for generating... sparks?
- var/wrenching = 0
+ var/wrenching = FALSE
var/last_target //last target fired at, prevents turrets from erratically firing at all valid targets in range
var/timeout = 10 // When a turret pops up, then finds nothing to shoot at, this number decrements until 0, when it pops down.
var/can_salvage = TRUE // If false, salvaging doesn't give you anything.
/obj/machinery/porta_turret/crescent
req_one_access = list(access_cent_specops)
- enabled = 0
- ailock = 1
- check_synth = 0
- check_access = 1
- check_arrest = 1
- check_records = 1
- check_weapons = 1
- check_anomalies = 1
- check_all = 0
+ enabled = FALSE
+ ailock = TRUE
+ check_synth = FALSE
+ check_access = TRUE
+ check_arrest = TRUE
+ check_records = TRUE
+ check_weapons = TRUE
+ check_anomalies = TRUE
+ check_all = FALSE
/obj/machinery/porta_turret/can_catalogue(mob/user) // Dead turrets can't be scanned.
if(stat & BROKEN)
@@ -121,8 +111,8 @@
return ..()
/obj/machinery/porta_turret/stationary
- ailock = 1
- lethal = 1
+ ailock = TRUE
+ lethal = TRUE
installation = /obj/item/weapon/gun/energy/laser
/obj/machinery/porta_turret/stationary/syndie // Generic turrets for POIs that need to not shoot their buddies.
@@ -155,7 +145,7 @@
name = "interior anti-boarding turret"
desc = "A very tough looking turret made by alien hands."
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_turret)
- icon_state = "alien_turret_cover"
+ icon_state = "turret_cover_alien"
req_one_access = list(access_alien)
installation = /obj/item/weapon/gun/energy/alien
enabled = TRUE
@@ -164,19 +154,12 @@
check_all = TRUE
health = 250 // Similar to the AI turrets.
maxhealth = 250
-
- closed_state = "alien_turret_cover"
- raising_state = "alien_popup"
- opened_state = "alien_open"
- lowering_state = "alien_popdown"
- gun_active_state = "alien_gun"
- gun_disabled_state = "alien_gun_disabled"
- gun_destroyed_state = "alien_gun_destroyed"
+ turret_type = "alien"
/obj/machinery/porta_turret/alien/destroyed // Turrets that are already dead, to act as a warning of what the rest of the submap contains.
name = "broken interior anti-boarding turret"
desc = "A very tough looking turret made by alien hands. This one looks destroyed, thankfully."
- icon_state = "alien_gun_destroyed"
+ icon_state = "destroyed_target_prism_alien"
stat = BROKEN
can_salvage = FALSE // So you need to actually kill a turret to get the alien gun.
@@ -184,18 +167,11 @@
name = "industrial turret"
desc = "This variant appears to be much more rugged."
req_one_access = list(access_heads)
+ icon_state = "turret_cover_industrial"
installation = /obj/item/weapon/gun/energy/phasegun
health = 200
maxhealth = 200
-
- icon_state = "turret_cover_industrial"
- closed_state = "turret_cover_industrial"
- raising_state = "popup_industrial"
- opened_state = "open_industrial"
- lowering_state = "popdown_industrial"
- gun_active_state = "target_prism_industrial"
- gun_disabled_state = "grey_target_prism_industrial"
- gun_destroyed_state = "destroyed_target_prism_industrial"
+ turret_type = "industrial"
/obj/machinery/porta_turret/industrial/bullet_act(obj/item/projectile/Proj)
var/damage = round(Proj.get_structure_damage() * 1.33)
@@ -205,10 +181,10 @@
if(enabled)
if(!attacked && !emagged)
- attacked = 1
+ attacked = TRUE
spawn()
sleep(60)
- attacked = 0
+ attacked = FALSE
take_damage(damage)
@@ -230,6 +206,97 @@
check_all = TRUE
can_salvage = FALSE // So you can't just twoshot a turret and get a fancy gun
+/obj/machinery/porta_turret/lasertag
+ name = "lasertag turret"
+ turret_type = "normal"
+ req_one_access = list()
+ installation = /obj/item/weapon/gun/energy/lasertag/omni
+
+ locked = FALSE
+ enabled = FALSE
+ anchored = FALSE
+ //These two are used for lasertag
+ check_synth = FALSE
+ check_weapons = FALSE
+ //These vars aren't used
+ check_access = FALSE
+ check_arrest = FALSE
+ check_records = FALSE
+ check_anomalies = FALSE
+ check_all = FALSE
+
+/obj/machinery/porta_turret/lasertag/red
+ turret_type = "red"
+ installation = /obj/item/weapon/gun/energy/lasertag/red
+ check_weapons = TRUE // Used to target blue players
+
+/obj/machinery/porta_turret/lasertag/blue
+ turret_type = "blue"
+ installation = /obj/item/weapon/gun/energy/lasertag/blue
+ check_synth = TRUE // Used to target red players
+
+/obj/machinery/porta_turret/lasertag/assess_living(var/mob/living/L)
+ if(!ishuman(L))
+ return TURRET_NOT_TARGET
+
+ if(L.invisibility >= INVISIBILITY_LEVEL_ONE) // Cannot see him. see_invisible is a mob-var
+ return TURRET_NOT_TARGET
+
+ if(get_dist(src, L) > 7) //if it's too far away, why bother?
+ return TURRET_NOT_TARGET
+
+ if(!(L in check_trajectory(L, src))) //check if we have true line of sight
+ return TURRET_NOT_TARGET
+
+ if(L.lying) //Don't need to stun-lock the players
+ return TURRET_NOT_TARGET
+
+ if(ishuman(L))
+ var/mob/living/carbon/human/M = L
+ if(istype(M.wear_suit, /obj/item/clothing/suit/redtag) && check_synth) // Checks if they are a red player
+ return TURRET_PRIORITY_TARGET
+
+ if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag) && check_weapons) // Checks if they are a blue player
+ return TURRET_PRIORITY_TARGET
+
+/obj/machinery/porta_turret/lasertag/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
+ data["access"] = !isLocked(user)
+ data["locked"] = locked
+ data["enabled"] = enabled
+ data["is_lethal"] = 1
+ data["lethal"] = lethal
+
+ if(data["access"])
+ var/settings[0]
+ settings[++settings.len] = list("category" = "Target Red", "setting" = "check_synth", "value" = check_synth) // Could not get the UI to work with new vars specifically for lasertag turrets -Nalarac
+ settings[++settings.len] = list("category" = "Target Blue", "setting" = "check_weapons", "value" = check_weapons) // So I'm using these variables since they don't do anything else in this case
+ data["settings"] = settings
+
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+
+/obj/machinery/porta_turret/lasertag/Topic(href, href_list)
+ if(..())
+ return 1
+
+ if(href_list["command"] && href_list["value"])
+ var/value = text2num(href_list["value"])
+ if(href_list["command"] == "enable")
+ enabled = value
+ else if(href_list["command"] == "lethal")
+ lethal = value
+ else if(href_list["command"] == "check_synth")
+ check_synth = value
+ else if(href_list["command"] == "check_weapons")
+ check_weapons = value
+
+ return 1
+
/obj/machinery/porta_turret/Initialize()
//Sets up a spark system
spark_system = new /datum/effect/effect/system/spark_spread
@@ -239,7 +306,7 @@
setup()
// If turrets ever switch overlays, this will need to be cached and reapplied each time overlays_cut() is called.
- var/image/turret_opened_overlay = image(icon, opened_state)
+ var/image/turret_opened_overlay = image(icon, "open_[turret_type]")
turret_opened_overlay.layer = layer-0.1
add_overlay(turret_opened_overlay)
return ..()
@@ -251,99 +318,85 @@
/obj/machinery/porta_turret/update_icon()
if(stat & BROKEN) // Turret is dead.
- icon_state = gun_destroyed_state
+ icon_state = "destroyed_target_prism_[turret_type]"
else if(raised || raising)
// Turret is open.
if(powered() && enabled)
// Trying to shoot someone.
- icon_state = gun_active_state
+ if(lethal)
+ icon_state = "[lethal_icon_color]_target_prism_[turret_type]"
+ else
+ icon_state = "[icon_color]_target_prism_[turret_type]"
else
// Disabled.
- icon_state = gun_disabled_state
+ icon_state = "grey_target_prism_[turret_type]"
else
// Its closed.
- icon_state = closed_state
+ icon_state = "turret_cover_[turret_type]"
/obj/machinery/porta_turret/proc/setup()
var/obj/item/weapon/gun/energy/E = installation //All energy-based weapons are applicable
+ var/obj/item/projectile/P = initial(E.projectile_type)
//var/obj/item/ammo_casing/shottype = E.projectile_type
- projectile = initial(E.projectile_type)
- eprojectile = projectile
- shot_sound = initial(E.fire_sound)
- eshot_sound = shot_sound
+ projectile = P
+ lethal_projectile = projectile
+ shot_sound = initial(P.fire_sound)
+ lethal_shot_sound = shot_sound
+
+ if(istype(P, /obj/item/projectile/energy))
+ icon_color = "orange"
+
+ else if(istype(P, /obj/item/projectile/beam/stun))
+ icon_color = "blue"
+
+ else if(istype(P, /obj/item/projectile/beam/lasertag))
+ icon_color = "blue"
+
+ else if(istype(P, /obj/item/projectile/beam))
+ icon_color = "red"
+
+ else
+ icon_color = "blue"
+
+ lethal_icon_color = icon_color
weapon_setup(installation)
/obj/machinery/porta_turret/proc/weapon_setup(var/guntype)
switch(guntype)
- if(/obj/item/weapon/gun/energy/laser/practice)
- iconholder = 1
- eprojectile = /obj/item/projectile/beam
-
-// if(/obj/item/weapon/gun/energy/laser/practice/sc_laser)
-// iconholder = 1
-// eprojectile = /obj/item/projectile/beam
-
if(/obj/item/weapon/gun/energy/gun/burst)
- iconholder = 1
- eprojectile = /obj/item/projectile/beam/burstlaser
- eshot_sound = 'sound/weapons/Laser.ogg'
- icon_color = "red"
- projectile = /obj/item/projectile/beam/stun/weak
- shot_sound = 'sound/weapons/Taser.ogg'
+ lethal_icon_color = "red"
+ lethal_projectile = /obj/item/projectile/beam/burstlaser
+ lethal_shot_sound = 'sound/weapons/Laser.ogg'
shot_delay = 1 SECOND
if(/obj/item/weapon/gun/energy/phasegun)
- iconholder = 1
- eprojectile = /obj/item/projectile/energy/phase/heavy
- eshot_sound = 'sound/weapons/gunshot_pathetic.ogg'
icon_color = "orange"
- projectile = /obj/item/projectile/energy/phase
- shot_sound = 'sound/weapons/gunshot_pathetic.ogg'
+ lethal_icon_color = "orange"
+ lethal_projectile = /obj/item/projectile/energy/phase/heavy
shot_delay = 1 SECOND
- if(/obj/item/weapon/gun/energy/retro)
- iconholder = 1
-
-// if(/obj/item/weapon/gun/energy/retro/sc_retro)
-// iconholder = 1
-
- if(/obj/item/weapon/gun/energy/captain)
- iconholder = 1
-
- if(/obj/item/weapon/gun/energy/lasercannon)
- iconholder = 1
-
- if(/obj/item/weapon/gun/energy/taser)
- eprojectile = /obj/item/projectile/beam
- eshot_sound = 'sound/weapons/Laser.ogg'
-
- if(/obj/item/weapon/gun/energy/stunrevolver)
- eprojectile = /obj/item/projectile/beam
- eshot_sound = 'sound/weapons/Laser.ogg'
-
if(/obj/item/weapon/gun/energy/gun)
- eprojectile = /obj/item/projectile/beam //If it has, going to kill mode
- eshot_sound = 'sound/weapons/Laser.ogg'
- egun = 1
+ lethal_icon_color = "red"
+ lethal_projectile = /obj/item/projectile/beam //If it has, going to kill mode
+ lethal_shot_sound = 'sound/weapons/Laser.ogg'
if(/obj/item/weapon/gun/energy/gun/nuclear)
- eprojectile = /obj/item/projectile/beam //If it has, going to kill mode
- eshot_sound = 'sound/weapons/Laser.ogg'
- egun = 1
+ lethal_icon_color = "red"
+ lethal_projectile = /obj/item/projectile/beam //If it has, going to kill mode
+ lethal_shot_sound = 'sound/weapons/Laser.ogg'
if(/obj/item/weapon/gun/energy/xray)
- eprojectile = /obj/item/projectile/beam/xray
+ lethal_icon_color = "green"
+ lethal_projectile = /obj/item/projectile/beam/xray
projectile = /obj/item/projectile/beam/stun // Otherwise we fire xrays on both modes.
- eshot_sound = 'sound/weapons/eluger.ogg'
+ lethal_shot_sound = 'sound/weapons/eluger.ogg'
shot_sound = 'sound/weapons/Taser.ogg'
- iconholder = 1
- icon_color = "green"
/obj/machinery/porta_turret/proc/isLocked(mob/user)
if(ailock && issilicon(user))
@@ -486,20 +539,20 @@
"You begin [anchored ? "un" : ""]securing the turret." \
)
- wrenching = 1
+ wrenching = TRUE
if(do_after(user, 50 * I.toolspeed))
//This code handles moving the turret around. After all, it's a portable turret!
if(!anchored)
playsound(loc, I.usesound, 100, 1)
- anchored = 1
+ anchored = TRUE
update_icon()
to_chat(user, "You secure the exterior bolts on the turret.")
else if(anchored)
playsound(loc, I.usesound, 100, 1)
- anchored = 0
+ anchored = FALSE
to_chat(user, "You unsecure the exterior bolts on the turret.")
update_icon()
- wrenching = 0
+ wrenching = FALSE
else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda))
//Behavior lock/unlock mangement
@@ -540,12 +593,11 @@
//the turret shoot much, much faster.
to_chat(user, "You short out [src]'s threat assessment circuits.")
visible_message("[src] hums oddly...")
- emagged = 1
- iconholder = 1
- controllock = 1
- enabled = 0 //turns off the turret temporarily
+ emagged = TRUE
+ controllock = TRUE
+ enabled = FALSE //turns off the turret temporarily
sleep(60) //6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit
- enabled = 1 //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here
+ enabled = TRUE //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here
return 1
/obj/machinery/porta_turret/proc/take_damage(var/force)
@@ -571,7 +623,7 @@
attacked = 1
spawn()
sleep(60)
- attacked = 0
+ attacked = FALSE
..()
@@ -587,12 +639,12 @@
check_access = prob(20) // check_access is a pretty big deal, so it's least likely to get turned on
check_anomalies = prob(50)
if(prob(5))
- emagged = 1
+ emagged = TRUE
enabled=0
spawn(rand(60,600))
if(!enabled)
- enabled=1
+ enabled = TRUE
..()
@@ -677,7 +729,7 @@
if(faction && L.faction == faction)
return TURRET_NOT_TARGET
- if(!emagged && issilicon(L) && check_all == 0) // Don't target silica, unless told to neutralize everything.
+ if(!emagged && issilicon(L) && check_all == FALSE) // Don't target silica, unless told to neutralize everything.
return TURRET_NOT_TARGET
if(L.stat && !emagged) //if the perp is dead/dying, no need to bother really
@@ -703,7 +755,7 @@
if(iscuffed(L)) // If the target is handcuffed, leave it alone
return TURRET_NOT_TARGET
- if(isanimal(L) || issmall(L)) // Animals are not so dangerous
+ if(isanimal(L)) // Animals are not so dangerous
return check_anomalies ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
if(isxenomorph(L) || isalien(L)) // Xenos are dangerous
@@ -750,7 +802,7 @@
var/atom/flick_holder = new /atom/movable/porta_turret_cover(loc)
flick_holder.layer = layer + 0.1
- flick(raising_state, flick_holder)
+ flick("popup_[turret_type]", flick_holder)
sleep(10)
qdel(flick_holder)
@@ -771,7 +823,7 @@
var/atom/flick_holder = new /atom/movable/porta_turret_cover(loc)
flick_holder.layer = layer + 0.1
- flick(lowering_state, flick_holder)
+ flick("popdown_[turret_type]", flick_holder)
sleep(10)
qdel(flick_holder)
@@ -802,10 +854,10 @@
if(!(emagged || attacked)) //if it hasn't been emagged or attacked, it has to obey a cooldown rate
if(last_fired || !raised) //prevents rapid-fire shooting, unless it's been emagged
return
- last_fired = 1
+ last_fired = TRUE
spawn()
sleep(shot_delay)
- last_fired = 0
+ last_fired = FALSE
var/turf/T = get_turf(src)
var/turf/U = get_turf(target)
@@ -818,8 +870,8 @@
update_icon()
var/obj/item/projectile/A
if(emagged || lethal)
- A = new eprojectile(loc)
- playsound(loc, eshot_sound, 75, 1)
+ A = new lethal_projectile(loc)
+ playsound(loc, lethal_shot_sound, 75, 1)
else
A = new projectile(loc)
playsound(loc, shot_sound, 75, 1)
@@ -862,7 +914,6 @@
return
enabled = TC.enabled
lethal = TC.lethal
- iconholder = TC.lethal
check_synth = TC.check_synth
check_access = TC.check_access
@@ -898,7 +949,7 @@
if(I.is_wrench() && !anchored)
playsound(loc, I.usesound, 100, 1)
to_chat(user, "You secure the external bolts.")
- anchored = 1
+ anchored = TRUE
build_step = 1
return
@@ -923,7 +974,7 @@
else if(I.is_wrench())
playsound(loc, I.usesound, 75, 1)
to_chat(user, "You unfasten the external bolts.")
- anchored = 0
+ anchored = FALSE
build_step = 0
return
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index e657876b7d4..7d46fcd73f7 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -693,7 +693,7 @@
if (istype(in_chamber))
user.visible_message("[user] pulls the trigger.")
play_fire_sound()
- if(istype(in_chamber, /obj/item/projectile/beam/lastertag))
+ if(istype(in_chamber, /obj/item/projectile/beam/lasertag))
user.show_message("You feel rather silly, trying to commit suicide with a toy.")
mouthshoot = 0
return
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 266df1f3589..eeb8d779d28 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -1,261 +1,261 @@
-/obj/item/weapon/gun/energy/laser
- name = "laser rifle"
- desc = "A Hephaestus Industries G40E rifle, designed to kill with concentrated energy blasts. This variant has the ability to \
- switch between standard fire and a more efficent but weaker 'suppressive' fire."
- icon_state = "laser"
- item_state = "laser"
- wielded_item_state = "laser-wielded"
- fire_delay = 8
- slot_flags = SLOT_BELT|SLOT_BACK
- w_class = ITEMSIZE_LARGE
- force = 10
- origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
- matter = list(DEFAULT_WALL_MATERIAL = 2000)
- projectile_type = /obj/item/projectile/beam/midlaser
-// one_handed_penalty = 30
-
- firemodes = list(
- list(mode_name="normal", fire_delay=8, projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 240),
- list(mode_name="suppressive", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60),
- )
-
-/obj/item/weapon/gun/energy/laser/mounted
- self_recharge = 1
- use_external_power = 1
- one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry.
-
-/obj/item/weapon/gun/energy/laser/practice
- name = "practice laser carbine"
- desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice."
- projectile_type = /obj/item/projectile/beam/practice
- charge_cost = 48
-
- cell_type = /obj/item/weapon/cell/device
-
- firemodes = list(
- list(mode_name="normal", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 48),
- list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 12),
- )
-
-/obj/item/weapon/gun/energy/retro
- name = "retro laser"
- icon_state = "retro"
- item_state = "retro"
- desc = "An older model of the basic lasergun. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws."
- slot_flags = SLOT_BELT
- w_class = ITEMSIZE_NORMAL
- projectile_type = /obj/item/projectile/beam
- fire_delay = 10 //old technology
-
-/obj/item/weapon/gun/energy/retro/mounted
- self_recharge = 1
- use_external_power = 1
-
-/obj/item/weapon/gun/energy/retro/empty
- icon_state = "retro"
- cell_type = null
-
-
-/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol
- name = "Precursor Alpha Weapon - Appendageheld Laser"
- desc = "This object strongly resembles a weapon, and if one were to pull the \
- trigger located on the handle of the object, it would fire a deadly \
- laser at whatever it was pointed at. The beam fired appears to cause too \
- much damage to whatever it would hit to have served as a long ranged repair tool, \
- therefore this object was most likely designed to be a deadly weapon. If so, this \
- has several implications towards its creators;\
-
\
- Firstly, it implies that these precursors, at some point during their development, \
- had needed to defend themselves, or otherwise had a need to utilize violence, and \
- as such created better tools to do so. It is unclear if violence was employed against \
- themselves as a form of in-fighting, or if violence was exclusive to outside species.\
-
\
- Secondly, the shape and design of the weapon implies that the creators of this \
- weapon were able to grasp objects, and be able to manipulate the trigger independently \
- from merely holding onto the weapon, making certain types of appendages like tentacles be \
- unlikely.\
-
\
- An interesting note about this weapon, when compared to contemporary energy weapons, is \
- that this gun appears to be inferior to modern laser weapons. The beam fired has less \
- of an ability to harm, and the power consumption appears to be higher than average for \
- a human-made energy side-arm. One possible explaination is that the creators of this \
- weapon, in their later years, had less of a need to optimize their capability for war, \
- and instead focused on other endeavors. Another explaination is that vast age of the weapon \
- may have caused it to degrade, yet still remain functional at a reduced capability."
- value = CATALOGUER_REWARD_MEDIUM
-
-/obj/item/weapon/gun/energy/alien
- name = "alien pistol"
- desc = "A weapon that works very similarly to a traditional energy weapon. How this came to be will likely be a mystery for the ages."
- catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol)
- icon_state = "alienpistol"
- item_state = "alienpistol"
- fire_sound = 'sound/weapons/eLuger.ogg'
- fire_delay = 10 // Handguns should be inferior to two-handed weapons. Even alien ones I suppose.
- charge_cost = 480 // Five shots.
-
- projectile_type = /obj/item/projectile/beam/cyan
- cell_type = /obj/item/weapon/cell/device/weapon/recharge/alien // Self charges.
- origin_tech = list(TECH_COMBAT = 8, TECH_MAGNET = 7)
- modifystate = "alienpistol"
-
-
-/obj/item/weapon/gun/energy/captain
- name = "antique laser gun"
- icon_state = "caplaser"
- item_state = "caplaser"
- desc = "A rare weapon, handcrafted by a now defunct specialty manufacturer on Luna for a small fortune. It's certainly aged well."
- force = 5
- slot_flags = SLOT_BELT
- w_class = ITEMSIZE_NORMAL
- projectile_type = /obj/item/projectile/beam
- origin_tech = null
- fire_delay = 10 //Old pistol
- charge_cost = 480 //to compensate a bit for self-recharging
- cell_type = /obj/item/weapon/cell/device/weapon/recharge/captain
- battery_lock = 1
-
-/obj/item/weapon/gun/energy/lasercannon
- name = "laser cannon"
- desc = "With the laser cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron \
- flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!"
- icon_state = "lasercannon"
- item_state = null
- origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
- slot_flags = SLOT_BELT|SLOT_BACK
- projectile_type = /obj/item/projectile/beam/heavylaser/cannon
- battery_lock = 1
- fire_delay = 20
- w_class = ITEMSIZE_LARGE
-// one_handed_penalty = 90 // The thing's heavy and huge.
- accuracy = 45
- charge_cost = 600
-
-/obj/item/weapon/gun/energy/lasercannon/mounted
- name = "mounted laser cannon"
- self_recharge = 1
- use_external_power = 1
- recharge_time = 10
- accuracy = 0 // Mounted cannons are just fine the way they are.
- one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry.
- projectile_type = /obj/item/projectile/beam/heavylaser
- charge_cost = 400
- fire_delay = 20
-
-/obj/item/weapon/gun/energy/xray
- name = "xray laser gun"
- desc = "A high-power laser gun capable of expelling concentrated xray blasts, which are able to penetrate matter easier than \
- standard photonic beams, resulting in an effective 'anti-armor' energy weapon."
- icon_state = "xray"
- item_state = "xray"
- origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2)
- projectile_type = /obj/item/projectile/beam/xray
- charge_cost = 200
-
-/obj/item/weapon/gun/energy/sniperrifle
- name = "marksman energy rifle"
- desc = "The HI DMR 9E is an older design of Hephaestus Industries. A designated marksman rifle capable of shooting powerful \
- ionized beams, this is a weapon to kill from a distance."
- icon_state = "sniper"
- item_state = "sniper"
- item_state_slots = list(slot_r_hand_str = "z8carbine", slot_l_hand_str = "z8carbine") //placeholder
- origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4)
- projectile_type = /obj/item/projectile/beam/sniper
- slot_flags = SLOT_BACK
- battery_lock = 1
- charge_cost = 600
- fire_delay = 35
- force = 10
- w_class = ITEMSIZE_HUGE // So it can't fit in a backpack.
- accuracy = -45 //shooting at the hip
- scoped_accuracy = 0
-// requires_two_hands = 1
-// one_handed_penalty = 60 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand.
-
-/obj/item/weapon/gun/energy/sniperrifle/verb/scope()
- set category = "Object"
- set name = "Use Scope"
- set popup_menu = 1
-
- toggle_scope(2.0)
-
-/obj/item/weapon/gun/energy/monorifle
- name = "antique mono-rifle"
- desc = "An old laser rifle. This one can only fire once before requiring recharging."
- description_fluff = "Modeled after ancient hunting rifles, this rifle was dubbed the 'Rainy Day Special' by some, due to its use as some barmens' fight-stopper of choice. One shot is all it takes, or so they say."
- icon_state = "eshotgun"
- item_state = "shotgun"
- origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_POWER = 3)
- projectile_type = /obj/item/projectile/beam/sniper
- slot_flags = SLOT_BACK
- charge_cost = 1300
- fire_delay = 20
- force = 8
- w_class = ITEMSIZE_LARGE
- accuracy = 10
- scoped_accuracy = 15
- var/scope_multiplier = 1.5
-
-/obj/item/weapon/gun/energy/monorifle/verb/sights()
- set category = "Object"
- set name = "Aim Down Sights"
- set popup_menu = 1
-
- toggle_scope(scope_multiplier)
-
-/obj/item/weapon/gun/energy/monorifle/combat
- name = "combat mono-rifle"
- desc = "A modernized version of the mono-rifle. This one can fire twice before requiring recharging."
- description_fluff = "A modern design produced by a company once working from Saint Columbia, based on the antique mono-rifle 'Rainy Day Special' design."
- icon_state = "ecshotgun"
- item_state = "cshotgun"
- charge_cost = 1000
- force = 12
- accuracy = 0
- scoped_accuracy = 20
-
-////////Laser Tag////////////////////
-
-/obj/item/weapon/gun/energy/lasertag
- name = "laser tag gun"
- item_state = "laser"
- desc = "Standard issue weapon of the Imperial Guard"
- origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2)
- matter = list(DEFAULT_WALL_MATERIAL = 2000)
- projectile_type = /obj/item/projectile/beam/lastertag/blue
- cell_type = /obj/item/weapon/cell/device/weapon/recharge
- battery_lock = 1
- var/required_vest
-
-/obj/item/weapon/gun/energy/lasertag/special_check(var/mob/living/carbon/human/M)
- if(ishuman(M))
- if(!istype(M.wear_suit, required_vest))
- M << "You need to be wearing your laser tag vest!"
- return 0
- return ..()
-
-/obj/item/weapon/gun/energy/lasertag/blue
- icon_state = "bluetag"
- item_state = "bluetag"
- projectile_type = /obj/item/projectile/beam/lastertag/blue
- required_vest = /obj/item/clothing/suit/bluetag
-
-/obj/item/weapon/gun/energy/lasertag/red
- icon_state = "redtag"
- item_state = "redtag"
- projectile_type = /obj/item/projectile/beam/lastertag/red
- required_vest = /obj/item/clothing/suit/redtag
-
-/*
- * Laser scattergun, proof of concept.
- */
-
-/obj/item/weapon/gun/energy/lasershotgun
- name = "laser scattergun"
- icon = 'icons/obj/energygun.dmi'
- item_state = "laser"
- icon_state = "scatter"
- desc = "A strange Almachi weapon, utilizing a refracting prism to turn a single laser blast into a diverging cluster."
- origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 1, TECH_MATERIAL = 4)
-
- projectile_type = /obj/item/projectile/scatter/laser
+/obj/item/weapon/gun/energy/laser
+ name = "laser rifle"
+ desc = "A Hephaestus Industries G40E rifle, designed to kill with concentrated energy blasts. This variant has the ability to \
+ switch between standard fire and a more efficent but weaker 'suppressive' fire."
+ icon_state = "laser"
+ item_state = "laser"
+ wielded_item_state = "laser-wielded"
+ fire_delay = 8
+ slot_flags = SLOT_BELT|SLOT_BACK
+ w_class = ITEMSIZE_LARGE
+ force = 10
+ origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 2000)
+ projectile_type = /obj/item/projectile/beam/midlaser
+// one_handed_penalty = 30
+
+ firemodes = list(
+ list(mode_name="normal", fire_delay=8, projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 240),
+ list(mode_name="suppressive", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60),
+ )
+
+/obj/item/weapon/gun/energy/laser/mounted
+ self_recharge = 1
+ use_external_power = 1
+ one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry.
+
+/obj/item/weapon/gun/energy/laser/practice
+ name = "practice laser carbine"
+ desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice."
+ projectile_type = /obj/item/projectile/beam/practice
+ charge_cost = 48
+
+ cell_type = /obj/item/weapon/cell/device
+
+ firemodes = list(
+ list(mode_name="normal", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 48),
+ list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 12),
+ )
+
+/obj/item/weapon/gun/energy/retro
+ name = "retro laser"
+ icon_state = "retro"
+ item_state = "retro"
+ desc = "An older model of the basic lasergun. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws."
+ slot_flags = SLOT_BELT
+ w_class = ITEMSIZE_NORMAL
+ projectile_type = /obj/item/projectile/beam
+ fire_delay = 10 //old technology
+
+/obj/item/weapon/gun/energy/retro/mounted
+ self_recharge = 1
+ use_external_power = 1
+
+/obj/item/weapon/gun/energy/retro/empty
+ icon_state = "retro"
+ cell_type = null
+
+
+/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol
+ name = "Precursor Alpha Weapon - Appendageheld Laser"
+ desc = "This object strongly resembles a weapon, and if one were to pull the \
+ trigger located on the handle of the object, it would fire a deadly \
+ laser at whatever it was pointed at. The beam fired appears to cause too \
+ much damage to whatever it would hit to have served as a long ranged repair tool, \
+ therefore this object was most likely designed to be a deadly weapon. If so, this \
+ has several implications towards its creators;\
+
\
+ Firstly, it implies that these precursors, at some point during their development, \
+ had needed to defend themselves, or otherwise had a need to utilize violence, and \
+ as such created better tools to do so. It is unclear if violence was employed against \
+ themselves as a form of in-fighting, or if violence was exclusive to outside species.\
+
\
+ Secondly, the shape and design of the weapon implies that the creators of this \
+ weapon were able to grasp objects, and be able to manipulate the trigger independently \
+ from merely holding onto the weapon, making certain types of appendages like tentacles be \
+ unlikely.\
+
\
+ An interesting note about this weapon, when compared to contemporary energy weapons, is \
+ that this gun appears to be inferior to modern laser weapons. The beam fired has less \
+ of an ability to harm, and the power consumption appears to be higher than average for \
+ a human-made energy side-arm. One possible explaination is that the creators of this \
+ weapon, in their later years, had less of a need to optimize their capability for war, \
+ and instead focused on other endeavors. Another explaination is that vast age of the weapon \
+ may have caused it to degrade, yet still remain functional at a reduced capability."
+ value = CATALOGUER_REWARD_MEDIUM
+
+/obj/item/weapon/gun/energy/alien
+ name = "alien pistol"
+ desc = "A weapon that works very similarly to a traditional energy weapon. How this came to be will likely be a mystery for the ages."
+ catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol)
+ icon_state = "alienpistol"
+ item_state = "alienpistol"
+ fire_delay = 10 // Handguns should be inferior to two-handed weapons. Even alien ones I suppose.
+ charge_cost = 480 // Five shots.
+
+ projectile_type = /obj/item/projectile/beam/cyan
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge/alien // Self charges.
+ origin_tech = list(TECH_COMBAT = 8, TECH_MAGNET = 7)
+ modifystate = "alienpistol"
+
+
+/obj/item/weapon/gun/energy/captain
+ name = "antique laser gun"
+ icon_state = "caplaser"
+ item_state = "caplaser"
+ desc = "A rare weapon, handcrafted by a now defunct specialty manufacturer on Luna for a small fortune. It's certainly aged well."
+ force = 5
+ slot_flags = SLOT_BELT
+ w_class = ITEMSIZE_NORMAL
+ projectile_type = /obj/item/projectile/beam
+ origin_tech = null
+ fire_delay = 10 //Old pistol
+ charge_cost = 480 //to compensate a bit for self-recharging
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge/captain
+ battery_lock = 1
+
+/obj/item/weapon/gun/energy/lasercannon
+ name = "laser cannon"
+ desc = "With the laser cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron \
+ flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!"
+ icon_state = "lasercannon"
+ item_state = null
+ origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
+ slot_flags = SLOT_BELT|SLOT_BACK
+ projectile_type = /obj/item/projectile/beam/heavylaser/cannon
+ battery_lock = 1
+ fire_delay = 20
+ w_class = ITEMSIZE_LARGE
+// one_handed_penalty = 90 // The thing's heavy and huge.
+ accuracy = 45
+ charge_cost = 600
+
+/obj/item/weapon/gun/energy/lasercannon/mounted
+ name = "mounted laser cannon"
+ self_recharge = 1
+ use_external_power = 1
+ recharge_time = 10
+ accuracy = 0 // Mounted cannons are just fine the way they are.
+ one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry.
+ projectile_type = /obj/item/projectile/beam/heavylaser
+ charge_cost = 400
+ fire_delay = 20
+
+/obj/item/weapon/gun/energy/xray
+ name = "xray laser gun"
+ desc = "A high-power laser gun capable of expelling concentrated xray blasts, which are able to penetrate matter easier than \
+ standard photonic beams, resulting in an effective 'anti-armor' energy weapon."
+ icon_state = "xray"
+ item_state = "xray"
+ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2)
+ projectile_type = /obj/item/projectile/beam/xray
+ charge_cost = 200
+
+/obj/item/weapon/gun/energy/sniperrifle
+ name = "marksman energy rifle"
+ desc = "The HI DMR 9E is an older design of Hephaestus Industries. A designated marksman rifle capable of shooting powerful \
+ ionized beams, this is a weapon to kill from a distance."
+ icon_state = "sniper"
+ item_state = "sniper"
+ item_state_slots = list(slot_r_hand_str = "z8carbine", slot_l_hand_str = "z8carbine") //placeholder
+ origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4)
+ projectile_type = /obj/item/projectile/beam/sniper
+ slot_flags = SLOT_BACK
+ battery_lock = 1
+ charge_cost = 600
+ fire_delay = 35
+ force = 10
+ w_class = ITEMSIZE_HUGE // So it can't fit in a backpack.
+ accuracy = -45 //shooting at the hip
+ scoped_accuracy = 0
+// requires_two_hands = 1
+// one_handed_penalty = 60 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand.
+
+/obj/item/weapon/gun/energy/sniperrifle/verb/scope()
+ set category = "Object"
+ set name = "Use Scope"
+ set popup_menu = 1
+
+ toggle_scope(2.0)
+
+/obj/item/weapon/gun/energy/monorifle
+ name = "antique mono-rifle"
+ desc = "An old laser rifle. This one can only fire once before requiring recharging."
+ description_fluff = "Modeled after ancient hunting rifles, this rifle was dubbed the 'Rainy Day Special' by some, due to its use as some barmens' fight-stopper of choice. One shot is all it takes, or so they say."
+ icon_state = "eshotgun"
+ item_state = "shotgun"
+ origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_POWER = 3)
+ projectile_type = /obj/item/projectile/beam/sniper
+ slot_flags = SLOT_BACK
+ charge_cost = 1300
+ fire_delay = 20
+ force = 8
+ w_class = ITEMSIZE_LARGE
+ accuracy = 10
+ scoped_accuracy = 15
+ var/scope_multiplier = 1.5
+
+/obj/item/weapon/gun/energy/monorifle/verb/sights()
+ set category = "Object"
+ set name = "Aim Down Sights"
+ set popup_menu = 1
+
+ toggle_scope(scope_multiplier)
+
+/obj/item/weapon/gun/energy/monorifle/combat
+ name = "combat mono-rifle"
+ desc = "A modernized version of the mono-rifle. This one can fire twice before requiring recharging."
+ description_fluff = "A modern design produced by a company once working from Saint Columbia, based on the antique mono-rifle 'Rainy Day Special' design."
+ icon_state = "ecshotgun"
+ item_state = "cshotgun"
+ charge_cost = 1000
+ force = 12
+ accuracy = 0
+ scoped_accuracy = 20
+
+////////Laser Tag////////////////////
+
+/obj/item/weapon/gun/energy/lasertag
+ name = "laser tag gun"
+ item_state = "laser"
+ desc = "Standard issue weapon of the Imperial Guard"
+ origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 2000)
+ projectile_type = /obj/item/projectile/beam/lasertag/blue
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge
+ battery_lock = 1
+ var/required_vest
+
+/obj/item/weapon/gun/energy/lasertag/special_check(var/mob/living/carbon/human/M)
+ if(ishuman(M))
+ if(!istype(M.wear_suit, required_vest))
+ M << "You need to be wearing your laser tag vest!"
+ return 0
+ return ..()
+
+/obj/item/weapon/gun/energy/lasertag/blue
+ icon_state = "bluetag"
+ item_state = "bluetag"
+ projectile_type = /obj/item/projectile/beam/lasertag/blue
+ required_vest = /obj/item/clothing/suit/bluetag
+
+/obj/item/weapon/gun/energy/lasertag/red
+ icon_state = "redtag"
+ item_state = "redtag"
+ projectile_type = /obj/item/projectile/beam/lasertag/red
+ required_vest = /obj/item/clothing/suit/redtag
+
+/obj/item/weapon/gun/energy/lasertag/omni
+ projectile_type = /obj/item/projectile/beam/lasertag/omni
+
+// Laser scattergun, proof of concept.
+
+/obj/item/weapon/gun/energy/lasershotgun
+ name = "laser scattergun"
+ icon = 'icons/obj/energygun.dmi'
+ item_state = "laser"
+ icon_state = "scatter"
+ desc = "A strange Almachi weapon, utilizing a refracting prism to turn a single laser blast into a diverging cluster."
+ origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 1, TECH_MATERIAL = 4)
+
+ projectile_type = /obj/item/projectile/scatter/laser
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index f1a1f28e6cc..ec2670c61d2 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -89,6 +89,7 @@
/obj/item/projectile/beam/cyan
name = "cyan beam"
icon_state = "cyan"
+ fire_sound = 'sound/weapons/eluger.ogg'
damage = 40
light_color = "#00C6FF"
@@ -125,62 +126,52 @@
tracer_type = /obj/effect/projectile/tracer/emitter
impact_type = /obj/effect/projectile/impact/emitter
-/obj/item/projectile/beam/lastertag/blue
+/obj/item/projectile/beam/lasertag
name = "lasertag beam"
- icon_state = "bluelaser"
damage = 0
+ eyeblur = 0
no_attack_log = 1
damage_type = BURN
check_armour = "laser"
- light_color = "#0066FF"
combustion = FALSE
+/obj/item/projectile/beam/lasertag/blue
+ icon_state = "bluelaser"
+ light_color = "#0066FF"
+
muzzle_type = /obj/effect/projectile/muzzle/laser_blue
tracer_type = /obj/effect/projectile/tracer/laser_blue
impact_type = /obj/effect/projectile/impact/laser_blue
-/obj/item/projectile/beam/lastertag/blue/on_hit(var/atom/target, var/blocked = 0)
- if(istype(target, /mob/living/carbon/human))
+/obj/item/projectile/beam/lasertag/blue/on_hit(var/atom/target, var/blocked = 0)
+ if(ishuman(target))
var/mob/living/carbon/human/M = target
if(istype(M.wear_suit, /obj/item/clothing/suit/redtag))
M.Weaken(5)
return 1
-/obj/item/projectile/beam/lastertag/red
- name = "lasertag beam"
+/obj/item/projectile/beam/lasertag/red
icon_state = "laser"
- damage = 0
- no_attack_log = 1
- damage_type = BURN
- check_armour = "laser"
light_color = "#FF0D00"
- combustion = FALSE
-
-/obj/item/projectile/beam/lastertag/red/on_hit(var/atom/target, var/blocked = 0)
- if(istype(target, /mob/living/carbon/human))
+/obj/item/projectile/beam/lasertag/red/on_hit(var/atom/target, var/blocked = 0)
+ if(ishuman(target))
var/mob/living/carbon/human/M = target
if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag))
M.Weaken(5)
return 1
-/obj/item/projectile/beam/lastertag/omni//A laser tag bolt that stuns EVERYONE
- name = "lasertag beam"
+/obj/item/projectile/beam/lasertag/omni//A laser tag bolt that stuns EVERYONE
icon_state = "omnilaser"
- damage = 0
- damage_type = BURN
- check_armour = "laser"
light_color = "#00C6FF"
- combustion = FALSE
-
muzzle_type = /obj/effect/projectile/muzzle/laser_omni
tracer_type = /obj/effect/projectile/tracer/laser_omni
impact_type = /obj/effect/projectile/impact/laser_omni
-/obj/item/projectile/beam/lastertag/omni/on_hit(var/atom/target, var/blocked = 0)
- if(istype(target, /mob/living/carbon/human))
+/obj/item/projectile/beam/lasertag/omni/on_hit(var/atom/target, var/blocked = 0)
+ if(ishuman(target))
var/mob/living/carbon/human/M = target
if((istype(M.wear_suit, /obj/item/clothing/suit/bluetag))||(istype(M.wear_suit, /obj/item/clothing/suit/redtag)))
M.Weaken(5)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index d2b4dc149d8..4ccd444d0ea 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -158,7 +158,7 @@
message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (JMP).")
log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).")
- if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
+ if(!istype(Proj ,/obj/item/projectile/beam/lasertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
explode()
/obj/structure/reagent_dispensers/fueltank/ex_act()
diff --git a/code/modules/xenoarcheaology/tools/coolant_tank.dm b/code/modules/xenoarcheaology/tools/coolant_tank.dm
index df6c901517b..9f5172b3dee 100644
--- a/code/modules/xenoarcheaology/tools/coolant_tank.dm
+++ b/code/modules/xenoarcheaology/tools/coolant_tank.dm
@@ -11,7 +11,7 @@
/obj/structure/reagent_dispensers/coolanttank/bullet_act(var/obj/item/projectile/Proj)
if(Proj.get_structure_damage())
- if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) // TODO: make this not terrible
+ if(!istype(Proj ,/obj/item/projectile/beam/lasertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) // TODO: make this not terrible
explode()
/obj/structure/reagent_dispensers/coolanttank/ex_act()
diff --git a/html/changelogs/Nalarac - Turret Tweaks.yml b/html/changelogs/Nalarac - Turret Tweaks.yml
new file mode 100644
index 00000000000..f878cb3d8f9
--- /dev/null
+++ b/html/changelogs/Nalarac - Turret Tweaks.yml
@@ -0,0 +1,41 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Nalarac
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Adds laser tag turrets orderable from cargo."
+ - bugfix: "Turrets will shoot people laying down if emagged or set to lethal."
+ - bugfix: "Turrets can not be lethal if built with non-lethal weapon."
+ - bugfix: "Alien pistol fire noise moved to projectile. Now the turret will use the proper noise."
+ - tweak: "Turrets will have new colors based on projectile used."
+ - tweak: "Projectile lastertag is no more. It is now properly lasertag."
\ No newline at end of file
diff --git a/icons/obj/turrets.dmi b/icons/obj/turrets.dmi
index a1015669425..94fa13eaf54 100644
Binary files a/icons/obj/turrets.dmi and b/icons/obj/turrets.dmi differ