From 7c400a7492abeb6defc2c392476fd2d7894b3c01 Mon Sep 17 00:00:00 2001 From: "rastaf.zero@gmail.com" Date: Fri, 24 Jun 2011 17:52:49 +0000 Subject: [PATCH] Fixes for APC: - fixed issue 88: monkeys now can play with APC. - Silicon liveforms cannot use malfhacked APCs if they arent an AT who hacked APC or his slaved borgs. Fixed issue 121. Latejoiners got their backpacks back. Fixed attack log. Fixed ammo icons not showing in dreammaker map editor. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1720 316c924e-a436-60f5-8080-3fe189b3f50e --- code/defines/obj/weapon.dm | 13 - code/game/jobs/jobprocs.dm | 3 +- code/game/objects/devices/PDA/PDA.dm | 2 +- code/game/objects/items/weapons/guns_new.dm | 57 ++-- code/modules/power/apc.dm | 284 ++++++++++++-------- icons/obj/ammo.dmi | Bin 2104 -> 2119 bytes tgstation.dme | 1 - 7 files changed, 204 insertions(+), 156 deletions(-) diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 67f3d777443..db6b9ed0112 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -862,19 +862,6 @@ origin_tech = "combat=2;materials=2" */ -/obj/item/weapon/gun/projectile/detective - desc = "A cheap Martian knock-off of a Smith & Wesson Model 10. Uses .38-Special rounds." - name = ".38 revolver" - icon_state = "detective" - w_class = 3.0 - throw_speed = 2 - throw_range = 10 - force = 14.0 - m_amt = 1000 - origin_tech = "combat=2;materials=2" - - - /obj/item/weapon/hand_tele name = "hand tele" icon = 'device.dmi' diff --git a/code/game/jobs/jobprocs.dm b/code/game/jobs/jobprocs.dm index 0be1763a9f9..3a5686b67cd 100644 --- a/code/game/jobs/jobprocs.dm +++ b/code/game/jobs/jobprocs.dm @@ -609,7 +609,7 @@ src.loc = S.loc // if(S.name == "Cyborg") // src.Robotize() - else + /*else var/list/L = list() for(var/area/arrival/start/S in world) L += S @@ -627,6 +627,7 @@ if(clear) NL += T src.loc = pick(NL) + */ if(src.mind.assigned_role == "Cyborg") src << "YOU ARE GETTING BORGED NOW" src.Robotize() diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm index 69936503fef..ff10315987f 100644 --- a/code/game/objects/devices/PDA/PDA.dm +++ b/code/game/objects/devices/PDA/PDA.dm @@ -626,7 +626,7 @@ name = "PDA-[owner] ([ownjob])" user << "\blue Card scanned." else - var/input=alert("Would you like to inert the card or update owner information?",,"Insert","Update") + var/input=alert("Would you like to insert the card or update owner information?",,"Insert","Update") //Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand. if ( ( (src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) ) diff --git a/code/game/objects/items/weapons/guns_new.dm b/code/game/objects/items/weapons/guns_new.dm index 37cbc1fe3ed..ca272f94525 100644 --- a/code/game/objects/items/weapons/guns_new.dm +++ b/code/game/objects/items/weapons/guns_new.dm @@ -17,9 +17,9 @@ var/const/PROJECTILE_DART = 8 icon_state = "bullet" density = 1 throwforce = 0.1 //an attempt to make it possible to shoot your way through space - unacidable = 1//Just to be sure. - anchored = 1.0 - flags = FPRINT | TABLEPASS | CONDUCT | ONBELT + unacidable = 1 //Just to be sure. + anchored = 1 // I'm not sure if it is a good idea. Bullets sucked to space and curve trajectories near singularity could be awesome. --rastaf0 + flags = FPRINT | TABLEPASS | CONDUCT | ONBELT // ONBELT??? var def_zone = "" damage_type = PROJECTILE_BULLET @@ -58,25 +58,23 @@ var/const/PROJECTILE_DART = 8 icon_state = "cbbolt" Bump(atom/A as mob|obj|turf|area) + if(firer && istype(A, /mob)) + var/mob/M = A + if(!silenced) + visible_message("\red [A.name] has been shot by [firer.name].", "\blue You hear a [istype(src, /obj/item/projectile/beam) ? "gunshot" : "laser blast"].") + else + M << "\red You've been shot!" + if(istype(firer, /mob)) + M.attack_log += text("[] []/[] shot []/[] with a []", world.time, firer, firer.ckey, M, M.ckey, src) + firer.attack_log += text("[] []/[] shot []/[] with a []", world.time, firer, firer.ckey, M, M.ckey, src) + else + M.attack_log += text("[] UNKOWN SUBJECT (No longer exists) shot []/[] with a []", world.time, M, M.ckey, src) spawn(0) if(A) A.bullet_act(damage_type, src, def_zone) if(istype(A,/turf) && !istype(src, /obj/item/projectile/beam)) for(var/obj/O in A) O.bullet_act(damage_type, src, def_zone) - if(firer && istype(A, /mob)) - var/mob/M = A - if(!silenced) - visible_message("\red [A.name] has been shot by [firer.name].", "\blue You hear a [istype(src, /obj/item/projectile/beam) ? "gunshot" : "laser blast"].") - else - if(M) - if(M.client) - M << "\red You've been shot!" - if(istype(firer, /mob)) - M.attack_log += text("[] []/[] shot []/[] with a []", world.time, firer, firer.client, M, M.client, src) - firer.attack_log += text("[] []/[] shot []/[] with a []", world.time, firer, firer.client, M, M.client, src) - else - M.attack_log += text("[] UNKOWN SUBJECT (No longer exists) shot []/[] with a []", world.time, M, M.client, src) del(src) return @@ -201,8 +199,19 @@ var/const/PROJECTILE_DART = 8 for(var/i = 1, i <= 7, i++) stored_ammo += new /obj/item/ammo_casing/c38(src) update_icon() +/* + shotgun + name = "ammo box (12gauge)" + desc = "A box of 12 gauge shell" + icon_state = "" //no sprite :'( + caliber = "shotgun" + m_amt = 25000 - + New() + BB = new /obj/item/projectile/shotgun(src) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) +*/ /////////////////////////////////////////////// //////////////////////Guns///////////////////// /////////////////////////////////////////////// @@ -259,7 +268,7 @@ var/const/PROJECTILE_DART = 8 return 0 New() - for(var/i = 1, i <= 7, i++) + for(var/i = 1, i <= max_shells, i++) loaded += new /obj/item/ammo_casing(src) update_icon() @@ -293,12 +302,12 @@ var/const/PROJECTILE_DART = 8 detective desc = "A cheap Martian knock-off of a Smith & Wesson Model 10. Uses .38-Special rounds." name = ".38 revolver" - max_shells = 7 + icon_state = "detective" force = 14.0 caliber = "38" New() - for(var/i = 1, i <= 7, i++) + for(var/i = 1, i <= max_shells, i++) loaded += new /obj/item/ammo_casing/c38(src) update_icon() @@ -323,6 +332,8 @@ var/const/PROJECTILE_DART = 8 caliber = "shotgun" New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing/shotgun/beanbag(src) update_icon() combat @@ -333,6 +344,10 @@ var/const/PROJECTILE_DART = 8 flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY | ONBACK max_shells = 8 origin_tech = "combat=3" + New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing/shotgun(src) + update_icon() energy icon_state = "energy" @@ -395,7 +410,7 @@ var/const/PROJECTILE_DART = 8 icon_state = "caplaser" desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy. On the item is an image of Space Station 13. The station is exploding." force = 10 - origin_tech = null + origin_tech = null //forgotten technology of ancients lol cyborg load_into_chamber() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index c7f26631650..2033ecc568f 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -439,7 +439,9 @@ // attack with hand - remove cell (if cover open) or interact with the APC /obj/machinery/power/apc/attack_hand(mob/user) - add_fingerprint(user) + if (!can_use()) + return + src.add_fingerprint(user) if(opened && (!istype(user, /mob/living/silicon))) if(cell) usr.put_in_hand(cell) @@ -452,7 +454,8 @@ charging = 0 src.updateicon() return - if(stat & (BROKEN|MAINT)) return + if(stat & (BROKEN|MAINT)) + return if(ishuman(user)) if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) @@ -701,126 +704,169 @@ src.aidisabled = 0 src.updateDialog() -/obj/machinery/power/apc/Topic(href, href_list) - ..() - if (((in_range(src, usr) && istype(src.loc, /turf))) || ((istype(usr, /mob/living/silicon) && !(src.aidisabled)))) - usr.machine = src - if (href_list["apcwires"]) - var/t1 = text2num(href_list["apcwires"]) - if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) )) - usr << "You need wirecutters!" - return - if (src.isWireColorCut(t1)) - src.mend(t1) - else - src.cut(t1) - else if (href_list["pulse"]) - var/t1 = text2num(href_list["pulse"]) - if (!istype(usr.equipped(), /obj/item/device/multitool)) - usr << "You need a multitool!" - return - if (src.isWireColorCut(t1)) - usr << "You can't pulse a cut wire." - return - else - src.pulse(t1) - else if (href_list["lock"]) - coverlocked = !coverlocked - - else if (href_list["breaker"]) - operating = !operating - src.update() - updateicon() - - else if (href_list["cmode"]) - chargemode = !chargemode - if(!chargemode) - charging = 0 - updateicon() - - else if (href_list["eqp"]) - var/val = text2num(href_list["eqp"]) - - equipment = (val==1) ? 0 : val - - updateicon() - update() - - else if (href_list["lgt"]) - var/val = text2num(href_list["lgt"]) - - lighting = (val==1) ? 0 : val - - updateicon() - update() - else if (href_list["env"]) - var/val = text2num(href_list["env"]) - - environ = (val==1) ? 0 :val - - updateicon() - update() - else if( href_list["close"] ) - usr << browse(null, "window=apc") - usr.machine = null - return - else if (href_list["close2"]) - usr << browse(null, "window=apcwires") - usr.machine = null - return - - else if (href_list["overload"]) - if( istype(usr, /mob/living/silicon) && !src.aidisabled ) - src.overload_lighting() - - else if (href_list["malfhack"]) - var/mob/living/silicon/ai/malfai = usr - if( istype(malfai, /mob/living/silicon/ai) && !src.aidisabled ) - if (malfai.malfhacking) - malfai << "You are already hacking an APC." - return - malfai << "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process." - malfai.malfhack = src - malfai.malfhacking = 1 - sleep(600) - if (!src.aidisabled) - malfai.malfhack = null - malfai.malfhacking = 0 - if (ticker.mode.config_tag == "malfunction") - if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas)) - ticker.mode:apcs++ - src.malfai = usr - src.locked = 1 - if (src.cell) - if (src.cell.charge > 0) - src.cell.charge = 0 - cell.corrupt() - src.malfhack = 1 - malfai << "Hack complete. The APC is now under your exclusive control. Discharging cell to fuse interface." - updateicon() - - var/datum/effects/system/harmless_smoke_spread/smoke = new /datum/effects/system/harmless_smoke_spread() - smoke.set_up(3, 0, src.loc) - smoke.attach(src) - smoke.start() - var/datum/effects/system/spark_spread/s = new /datum/effects/system/spark_spread - s.set_up(3, 1, src) - s.start() - for(var/mob/M in viewers(src)) - M.show_message("\red The [src.name] suddenly lets out a blast of smoke and some sparks!", 3, "\red You hear sizzling electronics.", 2) - else - malfai << "Hack complete. The APC is now under your exclusive control. Unable to fuse interface due to insufficient cell charge." - else - malfai << "Hack complete. The APC is now under your exclusive control. Unable to fuse interface due to lack of cell to discharge." - - - src.updateDialog() - return - - else +/obj/machinery/power/apc/proc/can_use() //used by attack_hand() and Topic() + if (usr.stat) + usr << "\red You must be conscious to use this [src]!" + return 0 + if ( ! (istype(usr, /mob/living/carbon/human) || \ + istype(usr, /mob/living/silicon) || \ + istype(usr, /mob/living/carbon/monkey) /*&& ticker && ticker.mode.name == "monkey"*/) ) + usr << "\red You don't have the dexterity to use this [src]!" usr << browse(null, "window=apc") usr.machine = null + return 0 + if(usr.restrained()) + usr << "\red You must have free hands to use this [src]" + return 0 + if(usr.lying) + usr << "\red You must stand to use this [src]!" + return 0 + if (istype(usr, /mob/living/silicon)) + var/mob/living/silicon/ai/AI = usr + var/mob/living/silicon/robot/robot = usr + if ( \ + src.aidisabled || \ + malfhack && istype(malfai) && \ + ( \ + (istype(AI) && malfai!=AI) || \ + (istype(robot) && (robot in malfai.connected_robots)) \ + ) \ + ) + usr << "\red \The [src] have AI control disabled!" + usr << browse(null, "window=apc") + usr.machine = null + return 0 + else + if ((!in_range(src, usr) || !istype(src.loc, /turf))) + usr << browse(null, "window=apc") + usr.machine = null + return 0 + var/mob/living/carbon/human/H = usr + if (istype(H)) + if(H.brainloss >= 60) + for(var/mob/M in viewers(src, null)) + M << "\red [H] stares cluelessly at [src] and drools." + return 0 + else if(prob(H.brainloss)) + usr << "\red You momentarily forget how to use [src]." + return 0 + return 1 +/obj/machinery/power/apc/Topic(href, href_list) + if (!can_use()) + return + src.add_fingerprint(usr) + usr.machine = src + if (href_list["apcwires"]) + var/t1 = text2num(href_list["apcwires"]) + if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) )) + usr << "You need wirecutters!" + return + if (src.isWireColorCut(t1)) + src.mend(t1) + else + src.cut(t1) + else if (href_list["pulse"]) + var/t1 = text2num(href_list["pulse"]) + if (!istype(usr.equipped(), /obj/item/device/multitool)) + usr << "You need a multitool!" + return + if (src.isWireColorCut(t1)) + usr << "You can't pulse a cut wire." + return + else + src.pulse(t1) + else if (href_list["lock"]) + coverlocked = !coverlocked + + else if (href_list["breaker"]) + operating = !operating + src.update() + updateicon() + + else if (href_list["cmode"]) + chargemode = !chargemode + if(!chargemode) + charging = 0 + updateicon() + + else if (href_list["eqp"]) + var/val = text2num(href_list["eqp"]) + + equipment = (val==1) ? 0 : val + + updateicon() + update() + + else if (href_list["lgt"]) + var/val = text2num(href_list["lgt"]) + + lighting = (val==1) ? 0 : val + + updateicon() + update() + else if (href_list["env"]) + var/val = text2num(href_list["env"]) + + environ = (val==1) ? 0 :val + + updateicon() + update() + else if( href_list["close"] ) + usr << browse(null, "window=apc") + usr.machine = null + return + else if (href_list["close2"]) + usr << browse(null, "window=apcwires") + usr.machine = null + return + + else if (href_list["overload"]) + if( istype(usr, /mob/living/silicon) && !src.aidisabled ) + src.overload_lighting() + + else if (href_list["malfhack"]) + var/mob/living/silicon/ai/malfai = usr + if( istype(malfai, /mob/living/silicon/ai) && !src.aidisabled ) + if (malfai.malfhacking) + malfai << "You are already hacking an APC." + return + malfai << "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process." + malfai.malfhack = src + malfai.malfhacking = 1 + sleep(600) + if (!src.aidisabled) + malfai.malfhack = null + malfai.malfhacking = 0 + if (ticker.mode.config_tag == "malfunction") + if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas)) + ticker.mode:apcs++ + src.malfai = usr + src.locked = 1 + if (src.cell) + if (src.cell.charge > 0) + src.cell.charge = 0 + cell.corrupt() + src.malfhack = 1 + malfai << "Hack complete. The APC is now under your exclusive control. Discharging cell to fuse interface." + updateicon() + + var/datum/effects/system/harmless_smoke_spread/smoke = new /datum/effects/system/harmless_smoke_spread() + smoke.set_up(3, 0, src.loc) + smoke.attach(src) + smoke.start() + var/datum/effects/system/spark_spread/s = new /datum/effects/system/spark_spread + s.set_up(3, 1, src) + s.start() + for(var/mob/M in viewers(src)) + M.show_message("\red The [src.name] suddenly lets out a blast of smoke and some sparks!", 3, "\red You hear sizzling electronics.", 2) + else + malfai << "Hack complete. The APC is now under your exclusive control. Unable to fuse interface due to insufficient cell charge." + else + malfai << "Hack complete. The APC is now under your exclusive control. Unable to fuse interface due to lack of cell to discharge." + + + src.updateDialog() return /obj/machinery/power/apc/proc/ion_act() diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index ce47d8f39ea41c18ec99da89cb03fa69d7312329..60ec3095a896e40cd11f02afa2cbfd3fcbce7544 100644 GIT binary patch delta 1980 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