From e8851bddf9a52b81f1282b708440a4c41c07d800 Mon Sep 17 00:00:00 2001 From: "sieve32@gmail.com" Date: Tue, 19 Jun 2012 02:00:02 +0000 Subject: [PATCH] More bugfixes! -Fixes an issue with protolathes being able to be loaded forever -Adds 3 pairs of Mesons to the EngiVend to compensate for all the missing engineering lockers -Changed the spawn order for lasertag closets (So you can actually click the different items) -Makes lasertag turrets and ED-209's much more efficient, prevents them from shooting at downed people, they don't target 'criminals', they cannot be used by the opposing team, most options are auto-magically set on creation and the buttons to change them are disabled (Everything but the on/off and the patrol for ED's, for now), and when emagged, they fire 'omnitag' bolts (Stuns everyone with a vest) -Gave blue lasertag bolts their own sprite to match the style of the red tags -Nerfed the amount of radiation from the radium and uranium reagents git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3866 316c924e-a436-60f5-8080-3fe189b3f50e --- code/defines/obj/vending.dm | 4 +- code/game/machinery/bots/ed209bot.dm | 124 +++++-- code/game/machinery/portable_turret.dm | 340 +++++++++++-------- code/game/objects/closets/fitnesscloset.dm | 10 +- code/modules/chemical/Chemistry-Reagents.dm | 4 +- code/modules/projectiles/projectile/beams.dm | 17 +- code/modules/research/protolathe.dm | 14 +- icons/obj/projectiles.dmi | Bin 26479 -> 26953 bytes 8 files changed, 333 insertions(+), 180 deletions(-) diff --git a/code/defines/obj/vending.dm b/code/defines/obj/vending.dm index 2da0dfca818..c4dc34db10d 100644 --- a/code/defines/obj/vending.dm +++ b/code/defines/obj/vending.dm @@ -262,8 +262,8 @@ icon_state = "engivend" icon_deny = "engivend-deny" req_access_txt = "10" //Engineering access - product_paths = "/obj/item/weapon/cable_coil/random;/obj/item/weapon/crowbar;/obj/item/weapon/weldingtool;/obj/item/weapon/wirecutters;/obj/item/weapon/wrench;/obj/item/device/t_scanner;/obj/item/device/multitool;/obj/item/weapon/airlock_electronics;/obj/item/weapon/module/power_control" - product_amounts = "5;5;3;5;5;5;2;3;3" + product_paths = "/obj/item/weapon/cable_coil/random;/obj/item/clothing/glasses/meson;/obj/item/weapon/crowbar;/obj/item/weapon/weldingtool;/obj/item/weapon/wirecutters;/obj/item/weapon/wrench;/obj/item/device/t_scanner;/obj/item/device/multitool;/obj/item/weapon/airlock_electronics;/obj/item/weapon/module/power_control" + product_amounts = "5;3;5;3;5;5;5;2;3;3" product_hidden = "/obj/item/weapon/weldingtool/hugetank;/obj/item/clothing/gloves/fyellow" product_hideamt = "2;2" product_coin = "/obj/item/weapon/storage/belt/utility" diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index 7ce256f6fbe..fe4329dd905 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -1,5 +1,5 @@ /obj/machinery/bot/ed209 - name = "ED-209" + name = "ED-209 Security Robot" desc = "A security robot. He looks less than thrilled." icon = 'aibots.dmi' icon_state = "ed2090" @@ -16,7 +16,7 @@ var/lastfired = 0 var/shot_delay = 3 //.3 seconds between shots var/lasercolor = "" - var/disabled = 0 + var/disabled = 0//A holder for if it needs to be disabled, if true it will not seach for targets, shoot at targets, or move, currently only used for lasertag //var/lasers = 0 @@ -31,6 +31,7 @@ var/idcheck = 1 //If false, all station IDs are authorized for weapons. var/check_records = 1 //Does it check security records? var/arrest_type = 0 //If true, don't handcuff + var/projectile = null//Holder for projectile type, to avoid so many else if chains var/mode = 0 #define SECBOT_IDLE 0 // idle @@ -86,11 +87,14 @@ radio_controller.add_object(src, control_freq, filter = RADIO_SECBOT) radio_controller.add_object(src, beacon_freq, filter = RADIO_NAVBEACONS) if(lasercolor) + shot_delay = 6//Longer shot delay because JESUS CHRIST + check_records = 0//Don't actively target people set to arrest + arrest_type = 1//Don't even try to cuff req_access = list(access_maint_tunnels,access_clown,access_mime) arrest_type = 1 - if(lasercolor == "b") + if((lasercolor == "b") && (name == "ED-209 Security Robot"))//Picks a name if there isn't already a custome one name = pick("BLUE BALLER","SANIC","BLUE KILLDEATH MURDERBOT") - if(lasercolor == "r") + if((lasercolor == "r") && (name == "ED-209 Security Robot")) name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT") /obj/machinery/bot/ed209/turn_on() @@ -123,7 +127,8 @@ Behaviour controls are [src.locked ? "locked" : "unlocked"]"}, "[src.on ? "On" : "Off"]" ) if(!src.locked) - dat += text({"
+ if(!lasercolor) + dat += text({"
Check for Weapon Authorization: []
Check Security Records: []
Operating Mode: []
@@ -132,6 +137,11 @@ Auto Patrol: []"}, "[src.idcheck ? "Yes" : "No"]", "[src.check_records ? "Yes" : "No"]", "[src.arrest_type ? "Detain" : "Arrest"]", +"[auto_patrol ? "On" : "Off"]" ) + else + dat += text({"
+Auto Patrol: []"}, + "[auto_patrol ? "On" : "Off"]" ) @@ -144,6 +154,12 @@ Auto Patrol: []"}, return usr.machine = src src.add_fingerprint(usr) + if(lasercolor && (istype(usr,/mob/living/carbon/human))) + var/mob/living/carbon/human/H = usr + if((lasercolor == "b") && (istype(H.wear_suit, /obj/item/clothing/suit/redtag)))//Opposing team cannot operate it + return + else if((lasercolor == "r") && (istype(H.wear_suit, /obj/item/clothing/suit/bluetag))) + return if ((href_list["power"]) && (src.allowed(usr))) if (src.on) turn_off() @@ -177,6 +193,8 @@ Auto Patrol: []"}, ..() if (!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!src.target)) src.target = user + if(lasercolor)//To make up for the fact that lasertag bots don't hunt + src.shootAt(user) src.mode = SECBOT_HUNT /obj/machinery/bot/ed209/Emag(mob/user as mob) @@ -192,6 +210,7 @@ Auto Patrol: []"}, src.emagged = 1 src.on = 1 src.icon_state = "[lasercolor]ed209[src.on]" + src.projectile = null mode = SECBOT_IDLE /obj/machinery/bot/ed209/process() @@ -233,6 +252,7 @@ Auto Patrol: []"}, if(SECBOT_HUNT) // hunting for perp if(src.lasercolor)//Lasertag bots do not tase or arrest anyone, just patrol and shoot and whatnot + mode = SECBOT_IDLE return // if can't reach perp for long enough, go idle if (src.frustration >= 8) @@ -282,6 +302,7 @@ Auto Patrol: []"}, if(SECBOT_PREP_ARREST) // preparing to arrest target if(src.lasercolor) + mode = SECBOT_IDLE return if (!target) mode = SECBOT_IDLE @@ -319,6 +340,7 @@ Auto Patrol: []"}, if(SECBOT_ARREST) // arresting if(src.lasercolor) + mode = SECBOT_IDLE return if (!target || src.target.handcuffed) src.anchored = 0 @@ -387,6 +409,8 @@ Auto Patrol: []"}, path -= loc look_for_perp() + if(lasercolor) + sleep(20) else // failed to move blockcount++ @@ -585,12 +609,17 @@ Auto Patrol: []"}, // look for a criminal in view of the bot /obj/machinery/bot/ed209/proc/look_for_perp() + if(src.disabled) + return src.anchored = 0 src.threatlevel = 0 for (var/mob/living/carbon/C in view(12,src)) //Let's find us a criminal if ((C.stat) || (C.handcuffed)) continue + if((src.lasercolor) && (C.lying)) + continue//Does not shoot at people lyind down when in lasertag mode, because it's just annoying, and they can fire once they get up. + if ((C.name == src.oldtarget_name) && (world.time < src.last_found + 100)) continue @@ -606,7 +635,8 @@ Auto Patrol: []"}, src.target = C src.oldtarget_name = C.name src.speak("Level [src.threatlevel] infraction alert!") - playsound(src.loc, pick('ed209_20sec.ogg', 'EDPlaceholder.ogg'), 50, 0) + if(!src.lasercolor) + playsound(src.loc, pick('ed209_20sec.ogg', 'EDPlaceholder.ogg'), 50, 0) src.visible_message("[src] points at [C.name]!") mode = SECBOT_HUNT spawn(0) @@ -624,8 +654,6 @@ Auto Patrol: []"}, if(src.emagged) return 10 //Everyone is a criminal! if((src.idcheck) || (isnull(perp:wear_id)) || (istype(perp:wear_id, /obj/item/weapon/card/id/syndicate))) - if(src.allowed(perp)) //Corrupt cops cannot exist beep boop - return 0 if((istype(perp.l_hand, /obj/item/weapon/gun) && !istype(perp.l_hand, /obj/item/weapon/gun/projectile/shotgun)) || istype(perp.l_hand, /obj/item/weapon/melee/baton)) if(!istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/bluetag) \ @@ -656,6 +684,7 @@ Auto Patrol: []"}, threatcount -= 2 if(src.lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve + threatcount = 0//They will not, however shoot at people who have guns, because it gets really fucking annoying if(istype(perp.wear_suit, /obj/item/clothing/suit/redtag)) threatcount += 4 if((istype(perp:r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(perp:l_hand,/obj/item/weapon/gun/energy/laser/redtag))) @@ -664,6 +693,7 @@ Auto Patrol: []"}, threatcount += 2 if(src.lasercolor == "r") + threatcount = 0 if(istype(perp.wear_suit, /obj/item/clothing/suit/bluetag)) threatcount += 4 if((istype(perp:r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(perp:l_hand,/obj/item/weapon/gun/energy/laser/bluetag))) @@ -690,6 +720,9 @@ Auto Patrol: []"}, threatcount = 4 break + if((src.idcheck) && (src.allowed(perp)) && !(src.lasercolor)) + threatcount = 0//Corrupt cops cannot exist beep boop + return threatcount /obj/machinery/bot/ed209/Bump(M as mob|obj) //Leave no door unopened! @@ -739,7 +772,19 @@ Auto Patrol: []"}, G.power_supply.charge = 0 if (prob(50)) - new /obj/item/robot_parts/l_arm(Tsec) + new /obj/item/robot_parts/l_leg(Tsec) + if (prob(25)) + new /obj/item/robot_parts/r_leg(Tsec) + if (prob(25))//50% chance for a helmet OR vest + if (prob(50)) + new /obj/item/clothing/head/helmet(Tsec) + else + if(!lasercolor) + new /obj/item/clothing/suit/armor/vest(Tsec) + if(lasercolor == "b") + new /obj/item/clothing/suit/bluetag(Tsec) + if(lasercolor == "r") + new /obj/item/clothing/suit/redtag(Tsec) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) @@ -765,27 +810,26 @@ Auto Patrol: []"}, //if(lastfired && world.time - lastfired < 100) // playsound(src.loc, 'ed209_shoot.ogg', 50, 0) - var/obj/item/projectile/A - if(!lasercolor) - if (src.emagged) - A = new /obj/item/projectile/beam( loc ) - else - A = new /obj/item/projectile/energy/electrode( loc ) - else if(lasercolor == "b") - if (src.emagged) - A = new /obj/item/projectile/energy/electrode( loc ) - else - A = new /obj/item/projectile/bluetag( loc ) - else if(lasercolor == "r") - if (src.emagged) - A = new /obj/item/projectile/energy/electrode( loc ) - else - A = new /obj/item/projectile/redtag( loc ) + if(!projectile) + if(!lasercolor) + if (src.emagged) + projectile = /obj/item/projectile/beam + else + projectile = /obj/item/projectile/energy/electrode + else if(lasercolor == "b") + if (src.emagged) + projectile = /obj/item/projectile/omnitag + else + projectile = /obj/item/projectile/bluetag + else if(lasercolor == "r") + if (src.emagged) + projectile = /obj/item/projectile/omnitag + else + projectile = /obj/item/projectile/redtag if (!( istype(U, /turf) )) - //A = null - del(A) return + var/obj/item/projectile/A = new projectile (loc) A.current = U A.yo = U.y - T.y A.xo = U.x - T.x @@ -963,11 +1007,33 @@ Auto Patrol: []"}, if((src.lasercolor == "b") && (src.disabled == 0)) if(istype(Proj, /obj/item/projectile/redtag)) src.disabled = 1 + del (Proj) sleep(100) src.disabled = 0 - if((src.lasercolor == "r") && (src.disabled == 0)) + else + ..() + else if((src.lasercolor == "r") && (src.disabled == 0)) if(istype(Proj, /obj/item/projectile/bluetag)) src.disabled = 1 + del (Proj) sleep(100) src.disabled = 0 - ..() + else + ..() + else + ..() + +/obj/machinery/bot/ed209/bluetag/New()//If desired, you spawn red and bluetag bots easily + var/obj/machinery/bot/ed209/S = new /obj/machinery/bot/ed209 + S.loc = get_turf(src) + S.lasercolor = "b" + S.New() + del(src) + + +/obj/machinery/bot/ed209/redtag/New() + var/obj/machinery/bot/ed209/S = new /obj/machinery/bot/ed209 + S.loc = get_turf(src) + S.lasercolor = "r" + S.New() + del(src) \ No newline at end of file diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 763bcd76944..b44b61fec79 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -32,6 +32,7 @@ var/installation // 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 = 0 //holder for power needed var/sound = null//So the taser can have sound var/iconholder = null//holder for the icon_state @@ -63,6 +64,112 @@ spark_system = new /datum/effect/effect/system/spark_spread spark_system.set_up(5, 0, src) spark_system.attach(src) + sleep(10) + if(!installation)// if for some reason the turret has no gun (ie, admin spawned) it resorts to basic taser shots + projectile = /obj/item/projectile/energy/electrode//holder for the projectile, here it is being set + eprojectile = /obj/item/projectile/beam//holder for the projectile when emagged, if it is different + reqpower = 200 + sound = 1 + iconholder = 1 + else + var/obj/item/weapon/gun/energy/E=new installation + // All energy-based weapons are applicable + switch(E.type) + if(/obj/item/weapon/gun/energy/laser/bluetag) + projectile = /obj/item/projectile/bluetag + eprojectile = /obj/item/projectile/omnitag//This bolt will stun ERRYONE with a vest + iconholder = null + reqpower = 100 + lasercolor = "b" + req_access = list(access_maint_tunnels,access_clown,access_mime) + check_records = 0 + criminals = 0 + auth_weapons = 1 + stun_all = 0 + check_anomalies = 0 + shot_delay = 30 + + if(/obj/item/weapon/gun/energy/laser/redtag) + projectile = /obj/item/projectile/redtag + eprojectile = /obj/item/projectile/omnitag + iconholder = null + reqpower = 100 + lasercolor = "r" + req_access = list(access_maint_tunnels,access_clown,access_mime) + check_records = 0 + criminals = 0 + auth_weapons = 1 + stun_all = 0 + check_anomalies = 0 + shot_delay = 30 + + if(/obj/item/weapon/gun/energy/pulse_rifle) + projectile = /obj/item/projectile/beam/pulse + eprojectile = projectile + iconholder = null + reqpower = 700 + + if(/obj/item/weapon/gun/energy/staff) + projectile = /obj/item/projectile/change + eprojectile = projectile + iconholder = 1 + reqpower = 700 + + if(/obj/item/weapon/gun/energy/ionrifle) + projectile = /obj/item/projectile/ion + eprojectile = projectile + iconholder = 1 + reqpower = 700 + + if(/obj/item/weapon/gun/energy/taser) + projectile = /obj/item/projectile/energy/electrode + eprojectile = projectile + iconholder = 1 + reqpower = 200 + + if(/obj/item/weapon/gun/energy/stunrevolver) + projectile = /obj/item/projectile/energy/electrode + eprojectile = projectile + iconholder = 1 + reqpower = 200 + + if(/obj/item/weapon/gun/energy/lasercannon) + projectile = /obj/item/projectile/beam/heavylaser + eprojectile = projectile + iconholder = null + reqpower = 600 + + if(/obj/item/weapon/gun/energy/decloner) + projectile = /obj/item/projectile/energy/declone + eprojectile = projectile + iconholder = null + reqpower = 600 + + if(/obj/item/weapon/gun/energy/crossbow/largecrossbow) + projectile = /obj/item/projectile/energy/bolt/large + eprojectile = projectile + iconholder = null + reqpower = 125 + + if(/obj/item/weapon/gun/energy/crossbow) + projectile = /obj/item/projectile/energy/bolt + eprojectile = projectile + iconholder = null + reqpower = 50 + + if(/obj/item/weapon/gun/energy/laser) + projectile = /obj/item/projectile/beam + eprojectile = projectile + iconholder = null + reqpower = 500 + + else // Energy gun shots + projectile = /obj/item/projectile/energy/electrode// if it hasn't been emagged, it uses normal taser shots + eprojectile = /obj/item/projectile/beam//If it has, going to kill mode + iconholder = 1 + egun = 1 + reqpower = 200 + Del() // deletes its own cover with it del(cover) @@ -79,15 +186,16 @@ var/dat // The browse() text, similar to ED-209s and beepskies. - dat += text({" + if(!(src.lasercolor))//Lasertag turrets have less options + dat += text({" Automatic Portable Turret Installation

Status: []
Behaviour controls are [src.locked ? "locked" : "unlocked"]"}, "[src.on ? "On" : "Off"]" ) - if(!src.locked) - dat += text({"
+ if(!src.locked) + dat += text({"
Check for Weapon Authorization: []
Check Security Records: []
Neutralize Identified Criminals: []
@@ -99,6 +207,18 @@ Neutralize All Unidentified Life Signs: []
"}, "[src.criminals ? "Yes" : "No"]", "[stun_all ? "Yes" : "No"]", "[check_anomalies ? "Yes" : "No"]" ) + else + if(istype(user,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + if(((src.lasercolor) == "b") && (istype(H.wear_suit, /obj/item/clothing/suit/redtag))) + return + if(((src.lasercolor) == "r") && (istype(H.wear_suit, /obj/item/clothing/suit/bluetag))) + return + dat += text({" +Automatic Portable Turret Installation

+Status: []
"}, + +"[src.on ? "On" : "Off"]" ) user << browse("Automatic Portable Turret Installation[dat]", "window=autosec") @@ -251,11 +371,13 @@ Neutralize All Unidentified Life Signs: []
"}, if((src.lasercolor == "b") && (src.disabled == 0)) if(istype(Proj, /obj/item/projectile/redtag)) src.disabled = 1 + del (Proj) sleep(100) src.disabled = 0 if((src.lasercolor == "r") && (src.disabled == 0)) if(istype(Proj, /obj/item/projectile/bluetag)) src.disabled = 1 + del (Proj) sleep(100) src.disabled = 0 return @@ -286,7 +408,7 @@ Neutralize All Unidentified Life Signs: []
"}, src.health = 0 src.density = 0 src.stat |= BROKEN // enables the BROKEN bit - src.icon_state = "destroyed_target_prism" + src.icon_state = "[lasercolor]destroyed_target_prism" invisibility=0 src.spark_system.start() // creates some sparks because they look cool src.density=1 @@ -396,6 +518,8 @@ Neutralize All Unidentified Life Signs: []
"}, /obj/machinery/porta_turret/proc popUp() // pops the turret up + if(disabled) + return if(raising || raised) return if(stat & BROKEN) return invisibility=0 @@ -409,6 +533,8 @@ Neutralize All Unidentified Life Signs: []
"}, layer=4 popDown() // pops the turret down + if(disabled) + return if(raising || !raised) return if(stat & BROKEN) return layer=3 @@ -435,7 +561,7 @@ Neutralize All Unidentified Life Signs: []
"}, if(auth_weapons) // check for weapon authorization if((isnull(perp:wear_id)) || (istype(perp:wear_id, /obj/item/weapon/card/id/syndicate))) - if((src.allowed(perp)) && (!lasercolor)) // if the perp has security access, return 0 + if((src.allowed(perp)) && !(src.lasercolor)) // if the perp has security access, return 0 return 0 if((istype(perp.l_hand, /obj/item/weapon/gun) && !istype(perp.l_hand, /obj/item/weapon/gun/projectile/shotgun)) || istype(perp.l_hand, /obj/item/weapon/melee/baton)) @@ -447,7 +573,8 @@ Neutralize All Unidentified Life Signs: []
"}, if(istype(perp:belt, /obj/item/weapon/gun) || istype(perp:belt, /obj/item/weapon/melee/baton)) threatcount += 2 - if(src.lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve + if((src.lasercolor) == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve + threatcount = 0//But does not target anyone else if(istype(perp.wear_suit, /obj/item/clothing/suit/redtag)) threatcount += 4 if((istype(perp:r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(perp:l_hand,/obj/item/weapon/gun/energy/laser/redtag))) @@ -455,7 +582,8 @@ Neutralize All Unidentified Life Signs: []
"}, if(istype(perp:belt, /obj/item/weapon/gun/energy/laser/redtag)) threatcount += 2 - if(src.lasercolor == "r") + if((src.lasercolor) == "r") + threatcount = 0 if(istype(perp.wear_suit, /obj/item/clothing/suit/bluetag)) threatcount += 4 if((istype(perp:r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(perp:l_hand,/obj/item/weapon/gun/energy/laser/bluetag))) @@ -483,6 +611,7 @@ Neutralize All Unidentified Life Signs: []
"}, break + return threatcount @@ -490,6 +619,13 @@ Neutralize All Unidentified Life Signs: []
"}, /obj/machinery/porta_turret/proc/shootAt(var/atom/movable/target) // shoots at a target + if(disabled) + return + + if(lasercolor && (istype(target,/mob/living/carbon/human))) + var/mob/living/carbon/human/H = target + if(H.lying) + return if(!emagged) // if it hasn't been emagged, it has to obey a cooldown rate if(last_fired || !raised) return // prevents rapid-fire shooting, unless it's been emagged @@ -509,110 +645,23 @@ Neutralize All Unidentified Life Signs: []
"}, // any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power! - - if(!projectile) - lasercolor = "" - req_access = list(access_security) - if(!installation)// if for some reason the turret has no gun (ie, admin spawned) it resorts to basic taser shots - projectile = /obj/item/projectile/energy/electrode - reqpower = 200 - sound = 1 - iconholder = 1 - else - var/obj/item/weapon/gun/energy/E=new installation - // All energy-based weapons are applicable - if(istype(E, /obj/item/weapon/gun/energy/laser/bluetag)) - projectile = /obj/item/projectile/bluetag - iconholder = null - reqpower = 100 - lasercolor = "b" - req_access = list(access_maint_tunnels,access_clown,access_mime) - - else if(istype(E, /obj/item/weapon/gun/energy/laser/redtag)) - projectile = /obj/item/projectile/redtag - iconholder = null - reqpower = 100 - lasercolor = "r" - req_access = list(access_maint_tunnels,access_clown,access_mime) - - else if(istype(E, /obj/item/weapon/gun/energy/pulse_rifle)) - projectile = /obj/item/projectile/beam/pulse - iconholder = null - reqpower = 700 - - else if(istype(E, /obj/item/weapon/gun/energy/staff)) - projectile = /obj/item/projectile/change - iconholder = 1 - reqpower = 700 - - else if(istype(E, /obj/item/weapon/gun/energy/ionrifle)) - projectile = /obj/item/projectile/ion - iconholder = 1 - reqpower = 700 - - else if(istype(E, /obj/item/weapon/gun/energy/taser) || istype(E, /obj/item/weapon/gun/energy/stunrevolver)) - projectile = /obj/item/projectile/energy/electrode - iconholder = 1 - reqpower = 200 - - else if(istype(E, /obj/item/weapon/gun/energy/lasercannon)) - projectile = /obj/item/projectile/beam/heavylaser - iconholder = null - reqpower = 600 - - else if(istype(E, /obj/item/weapon/gun/energy/decloner)) - projectile = /obj/item/projectile/energy/declone - iconholder = null - reqpower = 600 - - else if(istype(E, /obj/item/weapon/gun/energy/crossbow/largecrossbow)) - projectile = /obj/item/projectile/energy/bolt/large - iconholder = null - reqpower = 125 - - else if(istype(E, /obj/item/weapon/gun/energy/crossbow)) - projectile = /obj/item/projectile/energy/bolt - iconholder = null - reqpower = 50 - - else if(istype(E, /obj/item/weapon/gun/energy/laser)) - projectile = /obj/item/projectile/beam - iconholder = null - reqpower = 500 - - else // Energy gun shots - projectile = /obj/item/projectile/energy/electrode// if it hasn't been emagged, it uses normal taser shots - iconholder = 1 - egun = 1 - reqpower = 200 - - var/obj/item/projectile/A = projectile - var/obj/item/weapon/gun/energy/E=new installation if(iconholder) icon_state = "[lasercolor]target_prism" else icon_state = "[lasercolor]orange_target_prism" if(sound) playsound(src.loc, 'Taser.ogg', 75, 1) - A = new projectile( loc ) + var/obj/item/projectile/A + if(emagged) + A = new eprojectile( loc ) + else + A = new projectile( loc ) A.original = target.loc if(!emagged) use_power(reqpower) else use_power((reqpower*2)) - if(egun)// if it has been emagged, use laser shots - projectile = /obj/item/projectile/beam - iconholder = null - reqpower = 500 - // Shooting Code: - - if(!E.silenced) - playsound(src.loc, E.fire_sound, 75, 1) - else - playsound(src.loc, E.fire_sound, 10, 1) - - del(E) A.current = T A.yo = U.y - T.y A.xo = U.x - T.x @@ -773,9 +822,10 @@ Neutralize All Unidentified Life Signs: []
"}, Turret.installation = src.installation Turret.gun_charge = src.gun_charge - Turret.cover=new/obj/machinery/porta_turret_cover(src.loc) - Turret.cover.Parent_Turret=Turret - Turret.cover.name = finish_name +// Turret.cover=new/obj/machinery/porta_turret_cover(src.loc) +// Turret.cover.Parent_Turret=Turret +// Turret.cover.name = finish_name + Turret.New() del(src) else if(istype(W, /obj/item/weapon/crowbar)) @@ -846,8 +896,8 @@ Neutralize All Unidentified Life Signs: []
"}, if (.) return var/dat - - dat += text({" + if(!(Parent_Turret.lasercolor)) + dat += text({" Automatic Portable Turret Installation

Status: []
Behaviour controls are [Parent_Turret.locked ? "locked" : "unlocked"]"}, @@ -855,38 +905,6 @@ Behaviour controls are [Parent_Turret.locked ? "locked" : "unlocked"]"}, "[Parent_Turret.on ? "On" : "Off"]" ) - dat += text({"
-Check for Weapon Authorization: []
-Check Security Records: []
-Neutralize Identified Criminals: []
-Neutralize All Non-Security and Non-Command Personnel: []
-Neutralize All Unidentified Life Signs: []
"}, - -"[Parent_Turret.auth_weapons ? "Yes" : "No"]", -"[Parent_Turret.check_records ? "Yes" : "No"]", -"[Parent_Turret.criminals ? "Yes" : "No"]", -"[Parent_Turret.stun_all ? "Yes" : "No"]" , -"[Parent_Turret.check_anomalies ? "Yes" : "No"]" ) - - - user << browse("Automatic Portable Turret Installation[dat]", "window=autosec") - onclose(user, "autosec") - return - -/obj/machinery/porta_turret_cover/attack_hand(mob/user as mob) - . = ..() - if (.) - return - var/dat - - dat += text({" -Automatic Portable Turret Installation

-Status: []
-Behaviour controls are [Parent_Turret.locked ? "locked" : "unlocked"]"}, - -"[Parent_Turret.on ? "On" : "Off"]" ) - - if(!Parent_Turret.locked) dat += text({"
Check for Weapon Authorization: []
Check Security Records: []
@@ -899,6 +917,56 @@ Neutralize All Unidentified Life Signs: []
"}, "[Parent_Turret.criminals ? "Yes" : "No"]", "[Parent_Turret.stun_all ? "Yes" : "No"]" , "[Parent_Turret.check_anomalies ? "Yes" : "No"]" ) + else + dat += text({" +Automatic Portable Turret Installation

+Status: []
"}, + +"[Parent_Turret.on ? "On" : "Off"]" ) + + user << browse("Automatic Portable Turret Installation[dat]", "window=autosec") + onclose(user, "autosec") + return + +/obj/machinery/porta_turret_cover/attack_hand(mob/user as mob) + . = ..() + if (.) + return + var/dat + if(!(Parent_Turret.lasercolor)) + dat += text({" +Automatic Portable Turret Installation

+Status: []
+Behaviour controls are [Parent_Turret.locked ? "locked" : "unlocked"]"}, + +"[Parent_Turret.on ? "On" : "Off"]" ) + + if(!Parent_Turret.locked) + dat += text({"
+Check for Weapon Authorization: []
+Check Security Records: []
+Neutralize Identified Criminals: []
+Neutralize All Non-Security and Non-Command Personnel: []
+Neutralize All Unidentified Life Signs: []
"}, + +"[Parent_Turret.auth_weapons ? "Yes" : "No"]", +"[Parent_Turret.check_records ? "Yes" : "No"]", +"[Parent_Turret.criminals ? "Yes" : "No"]", +"[Parent_Turret.stun_all ? "Yes" : "No"]" , +"[Parent_Turret.check_anomalies ? "Yes" : "No"]" ) + else + if(istype(user,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + if(((Parent_Turret.lasercolor) == "b") && (istype(H.wear_suit, /obj/item/clothing/suit/redtag))) + return + if(((Parent_Turret.lasercolor) == "r") && (istype(H.wear_suit, /obj/item/clothing/suit/bluetag))) + return + dat += text({" +Automatic Portable Turret Installation

+Status: []
"}, + +"[Parent_Turret.on ? "On" : "Off"]" ) + user << browse("Automatic Portable Turret Installation[dat]", "window=autosec") diff --git a/code/game/objects/closets/fitnesscloset.dm b/code/game/objects/closets/fitnesscloset.dm index 10f89b69038..c676464ccdf 100644 --- a/code/game/objects/closets/fitnesscloset.dm +++ b/code/game/objects/closets/fitnesscloset.dm @@ -25,15 +25,15 @@ /obj/structure/closet/lasertag/red/New() ..() sleep(2) - new /obj/item/clothing/suit/redtag(src) - new /obj/item/clothing/suit/redtag(src) new /obj/item/weapon/gun/energy/laser/redtag(src) new /obj/item/weapon/gun/energy/laser/redtag(src) + new /obj/item/clothing/suit/redtag(src) + new /obj/item/clothing/suit/redtag(src) /obj/structure/closet/lasertag/blue/New() ..() sleep(2) - new /obj/item/clothing/suit/bluetag(src) - new /obj/item/clothing/suit/bluetag(src) new /obj/item/weapon/gun/energy/laser/bluetag(src) - new /obj/item/weapon/gun/energy/laser/bluetag(src) \ No newline at end of file + new /obj/item/weapon/gun/energy/laser/bluetag(src) + new /obj/item/clothing/suit/bluetag(src) + new /obj/item/clothing/suit/bluetag(src) \ No newline at end of file diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm index 588410cfed5..438d6ad5c3f 100644 --- a/code/modules/chemical/Chemistry-Reagents.dm +++ b/code/modules/chemical/Chemistry-Reagents.dm @@ -762,7 +762,7 @@ datum on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - M.apply_effect(10,IRRADIATE,0) + M.apply_effect(2,IRRADIATE,0) ..() return @@ -912,7 +912,7 @@ datum on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - M.apply_effect(3,IRRADIATE,0) + M.apply_effect(1,IRRADIATE,0) ..() return diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index c60e6444856..db8971a1b3c 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -46,7 +46,7 @@ /obj/item/projectile/bluetag name = "lasertag beam" - icon_state = "ice_2" + icon_state = "bluelaser" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE damage = 0 damage_type = BURN @@ -72,4 +72,19 @@ 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/omnitag//A laser tag bolt that stuns EVERYONE + name = "lasertag beam" + icon_state = "omnilaser" + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + damage = 0 + damage_type = BURN + flag = "laser" + + on_hit(var/atom/target, var/blocked = 0) + if(istype(target, /mob/living/carbon/human)) + 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) return 1 \ No newline at end of file diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 71fe1aca326..4f3221a5512 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -126,17 +126,21 @@ Note: Must be placed west/left of and R&D console to function. return 1 if (stat) return 1 - if (TotalMaterials() + 3750 > max_material_storage) - user << "\red The protolathe's material bin is full. Please remove material before adding more." - return 1 + if(istype(O,/obj/item/stack/sheet)) + var/obj/item/stack/sheet/S = O + if (TotalMaterials() + S.perunit > max_material_storage) + user << "\red The protolathe's material bin is full. Please remove material before adding more." + return 1 var/obj/item/stack/sheet/stack = O - var/amount = round(input("How many sheets do you want to add?") as num) - if(amount < 0) + var/amount = round(input("How many sheets do you want to add?") as num)//No decimals + if(amount < 0)//No negative numbers amount = 0 if(amount == 0) return if(amount > stack.amount) + amount = stack.amount + if(max_material_storage - TotalMaterials() < (amount*stack.perunit))//Can't overfill amount = min(stack.amount, round((max_material_storage-TotalMaterials())/stack.perunit)) src.overlays += "protolathe_[stack.name]" diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 1a00168f5256c2104e4597679c32aa8c47b3537e..d631540cc00e18c481e5c68ae3869a99bcecdd5b 100644 GIT binary patch delta 6685 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