From b80a184d9723e47cd8cafb1bf192aeb0c29b21fe Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 11 Jun 2017 00:04:00 -0500 Subject: [PATCH] up to upstream-merge-27868 --- code/_onclick/autoclick.dm | 49 ++++- code/game/atoms_movable.dm | 4 + .../clock_helpers/clock_powerdrain.dm | 2 +- code/game/gamemodes/events.dm | 2 +- code/game/machinery/cell_charger.dm | 2 +- .../machinery/porta_turret/portable_turret.dm | 192 +----------------- code/game/machinery/recharger.dm | 56 ++--- code/game/machinery/spaceheater.dm | 3 + code/game/mecha/mecha.dm | 5 +- code/game/objects/items/weapons/defib.dm | 47 +++-- code/game/objects/items/weapons/stunbaton.dm | 46 ++--- code/game/objects/items/weapons/teleprod.dm | 2 +- code/game/objects/objs.dm | 10 +- .../closets/secure/engineering.dm | 3 + code/game/objects/structures/watercloset.dm | 4 +- .../modules/admin/verbs/individual_logging.dm | 13 +- .../components/trinary_devices/filter.dm | 8 + code/modules/cargo/packs.dm | 7 + .../mob/living/carbon/human/interactive.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 3 + .../mob/living/silicon/robot/robot_defense.dm | 2 +- .../mob/living/silicon/robot/robot_modules.dm | 42 ++-- .../mob/living/simple_animal/bot/ed209bot.dm | 14 +- .../mob/living/simple_animal/hostile/mimic.dm | 10 +- .../computers/item/computer_power.dm | 5 + code/modules/ninja/suit/ninjaDrainAct.dm | 2 +- code/modules/ninja/suit/suit.dm | 2 + code/modules/ninja/suit/suit_attackby.dm | 2 +- code/modules/power/apc.dm | 12 +- code/modules/power/cell.dm | 17 +- code/modules/projectiles/guns/energy.dm | 63 +++--- .../guns/energy/kinetic_accelerator.dm | 4 +- .../projectiles/guns/energy/special.dm | 10 +- code/modules/projectiles/projectile.dm | 86 ++++---- .../modules/research/designs/power_designs.dm | 11 + icons/mob/inhands/items_lefthand.dmi | Bin 133918 -> 134365 bytes icons/mob/inhands/items_righthand.dmi | Bin 132061 -> 132513 bytes icons/obj/tools.dmi | Bin 10864 -> 11806 bytes tgstation.dme | 2 + 39 files changed, 333 insertions(+), 411 deletions(-) diff --git a/code/_onclick/autoclick.dm b/code/_onclick/autoclick.dm index 7b6e2f108a..23d07e2968 100644 --- a/code/_onclick/autoclick.dm +++ b/code/_onclick/autoclick.dm @@ -1,5 +1,10 @@ /client var/list/atom/selected_target[2] + var/obj/item/active_mousedown_item = null + var/mouseParams = "" + var/mouseLocation = null + var/mouseObject = null + var/mouseControlObject = null /client/MouseDown(object, location, control, params) var/delay = mob.CanMobAutoclick(object, location, params) @@ -9,14 +14,26 @@ while(selected_target[1]) Click(selected_target[1], location, control, selected_target[2]) sleep(delay) + active_mousedown_item = mob.canMobMousedown(object, location, params) + if(active_mousedown_item) + active_mousedown_item.onMouseDown(object, location, params, mob) /client/MouseUp(object, location, control, params) selected_target[1] = null + if(active_mousedown_item) + active_mousedown_item.onMouseUp(object, location, params, mob) + active_mousedown_item = null /client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params) + mouseParams = params + mouseLocation = over_location + mouseObject = over_object + mouseControlObject = over_control if(selected_target[1] && over_object && over_object.IsAutoclickable()) selected_target[1] = over_object selected_target[2] = params + if(active_mousedown_item) + active_mousedown_item.onMouseDrag(src_object, over_object, src_location, over_location, params, mob) /mob/proc/CanMobAutoclick(object, location, params) @@ -27,8 +44,31 @@ if(h) . = h.CanItemAutoclick(object, location, params) +/mob/proc/canMobMousedown(object, location, params) + +/mob/living/carbon/canMobMousedown(atom/object, location, params) + var/obj/item/H = get_active_held_item() + if(H) + . = H.canItemMouseDown(object, location, params) + /obj/item/proc/CanItemAutoclick(object, location, params) +/obj/item/proc/canItemMouseDown(object, location, params) + if(canMouseDown) + return src + +/obj/item/proc/onMouseDown(object, location, params, mob) + return + +/obj/item/proc/onMouseUp(object, location, params, mob) + return + +/obj/item/proc/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) + return + +/obj/item + var/canMouseDown = FALSE + /obj/item/weapon/gun var/automatic = 0 //can gun use it, 0 is no, anything above 0 is the delay between clicks in ds @@ -42,4 +82,11 @@ . = 0 /obj/screen/click_catcher/IsAutoclickable() - . = 1 \ No newline at end of file + . = 1 + +//Please don't roast me too hard +/client/MouseMove(object,location,control,params) + mouseParams = params + mouseLocation = location + mouseObject = object + mouseControlObject = control diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index edbb46d7fe..78eaa4d13b 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -679,3 +679,7 @@ set waitfor = FALSE if(!anchored && has_gravity()) step(src, movedir) + +//Returns an atom's power cell, if it has one. Overload for individual items. +/atom/movable/proc/get_cell() + return diff --git a/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm b/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm index 705273876c..cdde45bb4c 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm @@ -29,7 +29,7 @@ if(charge) . = min(charge, 250) charge = use(.) - updateicon() + update_icon() /obj/machinery/light/power_drain(clockcult_user) if(on) diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index b44b6b58b6..2b3e945c1f 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -9,7 +9,7 @@ S.update_icon() S.power_change() - var/list/skipped_areas = list(/area/engine/engineering, /area/ai_monitored/turret_protected/ai) + var/list/skipped_areas = list(/area/engine/engineering, /area/engine/supermatter, /area/engine/atmospherics_engine, /area/ai_monitored/turret_protected/ai) for(var/area/A in world) if( !A.requires_power || A.always_unpowered ) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 9f63391c86..8d17831a3b 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -71,7 +71,7 @@ /obj/machinery/cell_charger/proc/removecell() - charging.updateicon() + charging.update_icon() charging = null chargelevel = -1 updateicon() diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 4b2176c603..7f51b4290a 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -87,9 +87,9 @@ if(has_cover) cover = new /obj/machinery/porta_turret_cover(loc) cover.parent_turret = src - var/mutable_appearance/base = mutable_appearance('icons/obj/turrets.dmi', "basedark") - base.layer = NOT_HIGH_OBJ_LAYER - underlays += base + var/mutable_appearance/base = mutable_appearance('icons/obj/turrets.dmi', "basedark") + base.layer = NOT_HIGH_OBJ_LAYER + underlays += base if(!has_cover) INVOKE_ASYNC(src, .proc/popUp) @@ -554,7 +554,7 @@ use_power = 0 has_cover = 0 scan_range = 9 - req_access = list(GLOB.access_syndicate) + req_access = list(GLOB.access_syndicate) stun_projectile = /obj/item/projectile/bullet lethal_projectile = /obj/item/projectile/bullet lethal_projectile_sound = 'sound/weapons/Gunshot.ogg' @@ -571,8 +571,8 @@ return 10 //Syndicate turrets shoot everything not in their faction /obj/machinery/porta_turret/syndicate/pod - max_integrity = 40 - integrity_failure = 20 + max_integrity = 40 + integrity_failure = 20 obj_integrity = 40 stun_projectile = /obj/item/projectile/bullet/weakbullet3 lethal_projectile = /obj/item/projectile/bullet/weakbullet3 @@ -924,182 +924,4 @@ if(istype(P, /obj/item/projectile/beam/lasertag/bluetag)) on = 0 spawn(100) - on = 1 - -/////// MANNED TURRET //////// - -/obj/machinery/manned_turret - name = "machine gun turret" - desc = "While the trigger is held down, this gun will redistribute recoil to allow its user to easily shift targets." - icon = 'icons/obj/turrets.dmi' - icon_state = "machinegun" - can_buckle = TRUE - density = TRUE - max_integrity = 100 - obj_integrity = 100 - buckle_lying = 0 - layer = ABOVE_MOB_LAYER - var/view_range = 10 - var/cooldown = 0 - var/projectile_type = /obj/item/projectile/bullet/weakbullet3 - var/rate_of_fire = 1 - var/number_of_shots = 40 - var/cooldown_duration = 90 - var/atom/target - var/turf/target_turf - var/warned = FALSE - var/mouseparams - -//BUCKLE HOOKS - -/obj/machinery/manned_turret/unbuckle_mob(mob/living/buckled_mob,force = 0) - playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) - for(var/obj/item/I in buckled_mob.held_items) - if(istype(I, /obj/item/gun_control)) - qdel(I) - if(istype(buckled_mob)) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 0 - if(buckled_mob.client) - buckled_mob.client.change_view(world.view) - anchored = FALSE - . = ..() - -/obj/machinery/manned_turret/user_buckle_mob(mob/living/M, mob/living/carbon/user) - if(user.incapacitated() || !istype(user)) - return - M.forceMove(get_turf(src)) - ..() - for(var/V in M.held_items) - var/obj/item/I = V - if(istype(I)) - if(M.dropItemToGround(I)) - var/obj/item/gun_control/TC = new /obj/item/gun_control(src) - M.put_in_hands(TC) - else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand - var/obj/item/gun_control/TC = new /obj/item/gun_control(src) - M.put_in_hands(TC) - M.pixel_y = 14 - layer = ABOVE_MOB_LAYER - setDir(SOUTH) - playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) - anchored = TRUE - if(user.client) - user.client.change_view(view_range) - -/obj/item/gun_control - name = "turret controls" - icon = 'icons/obj/weapons.dmi' - icon_state = "offhand" - w_class = WEIGHT_CLASS_HUGE - flags = ABSTRACT | NODROP | NOBLUDGEON - resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/obj/machinery/manned_turret/turret - -/obj/item/gun_control/New(obj/machinery/manned_turret/MT) - if(MT) - turret = MT - else - qdel(src) - -/obj/item/gun_control/CanItemAutoclick() - return 1 - -/obj/item/gun_control/attack_obj(obj/O, mob/living/user) - user.changeNext_move(CLICK_CD_MELEE) - O.attacked_by(src, user) - -/obj/item/gun_control/attack(mob/living/M, mob/living/user) - user.lastattacked = M - M.lastattacker = user - M.attacked_by(src, user) - add_fingerprint(user) - -/obj/item/gun_control/afterattack(atom/targeted_atom, mob/user, flag, params) - ..() - var/obj/machinery/manned_turret/E = user.buckled - E.setDir(get_dir(E,targeted_atom)) - user.setDir(E.dir) - E.mouseparams = params - switch(E.dir) - if(NORTH) - E.layer = BELOW_MOB_LAYER - user.pixel_x = 0 - user.pixel_y = -14 - if(NORTHEAST) - E.layer = BELOW_MOB_LAYER - user.pixel_x = -8 - user.pixel_y = -4 - if(EAST) - E.layer = ABOVE_MOB_LAYER - user.pixel_x = -14 - user.pixel_y = 0 - if(SOUTHEAST) - E.layer = BELOW_MOB_LAYER - user.pixel_x = -8 - user.pixel_y = 4 - if(SOUTH) - E.layer = ABOVE_MOB_LAYER - user.pixel_x = 0 - user.pixel_y = 14 - if(SOUTHWEST) - E.layer = BELOW_MOB_LAYER - user.pixel_x = 8 - user.pixel_y = 4 - if(WEST) - E.layer = ABOVE_MOB_LAYER - user.pixel_x = 14 - user.pixel_y = 0 - if(NORTHWEST) - E.layer = BELOW_MOB_LAYER - user.pixel_x = 8 - user.pixel_y = -4 - E.checkfire(targeted_atom, user) - -/obj/machinery/manned_turret/proc/checkfire(atom/targeted_atom, mob/user) - target = targeted_atom - if(target == user || target == get_turf(src)) - return - if(world.time < cooldown) - if(!warned && world.time > (cooldown - cooldown_duration + rate_of_fire*number_of_shots)) // To capture the window where one is done firing - warned = TRUE - playsound(src, 'sound/weapons/sear.ogg', 100, 1) - return - else - cooldown = world.time + cooldown_duration - warned = FALSE - volley(user) - -/obj/machinery/manned_turret/proc/volley(mob/user) - target_turf = get_turf(target) - for(var/i in 1 to number_of_shots) - addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper, user), i*rate_of_fire) - - -/obj/machinery/manned_turret/proc/fire_helper(mob/user) - if(!src) - return - var/turf/targets_from = get_turf(src) - if(QDELETED(target)) - target = target_turf - var/obj/item/projectile/P = new projectile_type(targets_from) - P.current = targets_from - P.starting = targets_from - P.firer = user - P.original = target - playsound(src, 'sound/weapons/Gunshot_smg.ogg', 75, 1) - P.preparePixelProjectile(target, target_turf, user, mouseparams, rand(-9, 9)) - P.fire() - -/obj/machinery/manned_turret/ultimate // Admin-only proof of concept for autoclicker automatics - name = "Infinity Gun" - view_range = 12 - projectile_type = /obj/item/projectile/bullet/weakbullet3 - - -/obj/machinery/manned_turret/ultimate/checkfire(atom/targeted_atom, mob/user) - target = targeted_atom - if(target == user || target == get_turf(src)) - return - target_turf = get_turf(target) - fire_helper(user) + on = 1 \ No newline at end of file diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index a081e3eb80..ff1887f699 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -61,7 +61,7 @@ G.loc = src charging = G use_power = 2 - update_icon(scan = TRUE) + update_icon(scan = TRUE) else to_chat(user, "[src] isn't connected to anything!") return 1 @@ -108,41 +108,25 @@ var/using_power = 0 if(charging) - if(istype(charging, /obj/item/weapon/gun/energy)) - var/obj/item/weapon/gun/energy/E = charging - if(E.power_supply.charge < E.power_supply.maxcharge) - E.power_supply.give(E.power_supply.chargerate * recharge_coeff) - E.recharge_newshot() + var/obj/item/weapon/stock_parts/cell/C = charging.get_cell() + if(C) + if(C.charge < C.maxcharge) + C.give(C.chargerate * recharge_coeff) use_power(250 * recharge_coeff) using_power = 1 - - - if(istype(charging, /obj/item/weapon/melee/baton)) - var/obj/item/weapon/melee/baton/B = charging - if(B.bcell) - if(B.bcell.give(B.bcell.chargerate * recharge_coeff)) - use_power(200 * recharge_coeff) - using_power = 1 - + update_icon(using_power) + if(istype(charging, /obj/item/weapon/gun/energy)) + var/obj/item/weapon/gun/energy/E = charging + E.recharge_newshot() + return if(istype(charging, /obj/item/ammo_box/magazine/recharge)) var/obj/item/ammo_box/magazine/recharge/R = charging if(R.stored_ammo.len < R.max_ammo) R.stored_ammo += new R.ammo_type(R) use_power(200 * recharge_coeff) using_power = 1 - - if(istype(charging, /obj/item/device/modular_computer)) - var/obj/item/device/modular_computer/C = charging - var/obj/item/weapon/computer_hardware/battery/battery_module = C.all_components[MC_CELL] - if(battery_module) - var/obj/item/weapon/computer_hardware/battery/B = battery_module - if(B.battery) - if(B.battery.charge < B.battery.maxcharge) - B.battery.give(B.battery.chargerate * recharge_coeff) - use_power(200 * recharge_coeff) - using_power = 1 - - update_icon(using_power) + update_icon(using_power) + return /obj/machinery/recharger/power_change() ..() @@ -152,23 +136,23 @@ if(!(stat & (NOPOWER|BROKEN)) && anchored) if(istype(charging, /obj/item/weapon/gun/energy)) var/obj/item/weapon/gun/energy/E = charging - if(E.power_supply) - E.power_supply.emp_act(severity) + if(E.cell) + E.cell.emp_act(severity) else if(istype(charging, /obj/item/weapon/melee/baton)) var/obj/item/weapon/melee/baton/B = charging - if(B.bcell) - B.bcell.charge = 0 + if(B.cell) + B.cell.charge = 0 ..() -/obj/machinery/recharger/update_icon(using_power = 0, scan) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier. +/obj/machinery/recharger/update_icon(using_power = 0, scan) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier. if(stat & (NOPOWER|BROKEN) || !anchored) icon_state = "rechargeroff" return - if(scan) - icon_state = "rechargeroff" - return + if(scan) + icon_state = "rechargeroff" + return if(panel_open) icon_state = "rechargeropen" return diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index df76fef5a9..671dfbbdf2 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -24,6 +24,9 @@ var/settableTemperatureMedian = 30 + T0C var/settableTemperatureRange = 30 +/obj/machinery/space_heater/get_cell() + return cell + /obj/machinery/space_heater/New() ..() cell = new(src) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 1e6fd57b1d..c9be720d75 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -142,6 +142,9 @@ diag_hud_set_mechstat() diag_hud_set_mechtracking() +/obj/mecha/get_cell() + return cell + /obj/mecha/Destroy() go_out() @@ -154,7 +157,7 @@ M.forceMove(loc) if(prob(30)) - explosion(get_turf(loc), 0, 0, 1, 3) + explosion(get_turf(loc), 0, 0, 1, 3) if(wreckage) var/obj/structure/mecha_wreckage/WR = new wreckage(loc, AI) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 886d875edc..d616f4aaa4 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -19,7 +19,7 @@ var/safety = 1 //if you can zap people with the defibs on harm mode var/powered = 0 //if there's a cell in the defib with enough power for a revive, blocks paddles from reviving otherwise var/obj/item/weapon/twohanded/shockpaddles/paddles - var/obj/item/weapon/stock_parts/cell/high/bcell = null + var/obj/item/weapon/stock_parts/cell/high/cell var/combat = 0 //can we revive through space suits? var/grab_ghost = FALSE // Do we pull the ghost back into their body? @@ -29,10 +29,13 @@ update_icon() return +/obj/item/weapon/defibrillator/get_cell() + return cell + /obj/item/weapon/defibrillator/loaded/Initialize() //starts with hicap . = ..() paddles = make_paddles() - bcell = new(src) + cell = new(src) update_icon() return @@ -42,8 +45,8 @@ update_charge() /obj/item/weapon/defibrillator/proc/update_power() - if(bcell) - if(bcell.charge < paddles.revivecost) + if(cell) + if(cell.charge < paddles.revivecost) powered = 0 else powered = 1 @@ -56,21 +59,21 @@ add_overlay("[initial(icon_state)]-paddles") if(powered) add_overlay("[initial(icon_state)]-powered") - if(!bcell) + if(!cell) add_overlay("[initial(icon_state)]-nocell") if(!safety) add_overlay("[initial(icon_state)]-emagged") /obj/item/weapon/defibrillator/proc/update_charge() if(powered) //so it doesn't show charge if it's unpowered - if(bcell) - var/ratio = bcell.charge / bcell.maxcharge + if(cell) + var/ratio = cell.charge / cell.maxcharge ratio = Ceiling(ratio*4) * 25 add_overlay("[initial(icon_state)]-charge[ratio]") /obj/item/weapon/defibrillator/CheckParts(list/parts_list) ..() - bcell = locate(/obj/item/weapon/stock_parts/cell) in contents + cell = locate(/obj/item/weapon/stock_parts/cell) in contents update_icon() /obj/item/weapon/defibrillator/ui_action_click() @@ -105,7 +108,7 @@ toggle_paddles() else if(istype(W, /obj/item/weapon/stock_parts/cell)) var/obj/item/weapon/stock_parts/cell/C = W - if(bcell) + if(cell) to_chat(user, "[src] already has a cell.") else if(C.maxcharge < paddles.revivecost) @@ -113,15 +116,15 @@ return if(!user.transferItemToLoc(W, src)) return - bcell = W + cell = W to_chat(user, "You install a cell in [src].") update_icon() else if(istype(W, /obj/item/weapon/screwdriver)) - if(bcell) - bcell.updateicon() - bcell.loc = get_turf(src.loc) - bcell = null + if(cell) + cell.update_icon() + cell.loc = get_turf(src.loc) + cell = null to_chat(user, "You remove the cell from [src].") update_icon() else @@ -136,7 +139,7 @@ to_chat(user, "You silently enable [src]'s safety protocols with the cryptographic sequencer.") /obj/item/weapon/defibrillator/emp_act(severity) - if(bcell) + if(cell) deductcharge(1000 / severity) if(safety) safety = 0 @@ -200,11 +203,11 @@ update_icon() /obj/item/weapon/defibrillator/proc/deductcharge(chrgdeductamt) - if(bcell) - if(bcell.charge < (paddles.revivecost+chrgdeductamt)) + if(cell) + if(cell.charge < (paddles.revivecost+chrgdeductamt)) powered = 0 update_icon() - if(bcell.use(chrgdeductamt)) + if(cell.use(chrgdeductamt)) update_icon() return 1 else @@ -213,8 +216,8 @@ /obj/item/weapon/defibrillator/proc/cooldowncheck(mob/user) spawn(50) - if(bcell) - if(bcell.charge >= paddles.revivecost) + if(cell) + if(cell.charge >= paddles.revivecost) user.visible_message("[src] beeps: Unit ready.") playsound(get_turf(src), 'sound/machines/defib_ready.ogg', 50, 0) else @@ -240,7 +243,7 @@ /obj/item/weapon/defibrillator/compact/loaded/Initialize() . = ..() paddles = make_paddles() - bcell = new(src) + cell = new(src) update_icon() /obj/item/weapon/defibrillator/compact/combat @@ -252,7 +255,7 @@ /obj/item/weapon/defibrillator/compact/combat/loaded/Initialize() . = ..() paddles = make_paddles() - bcell = new /obj/item/weapon/stock_parts/cell/infinite(src) + cell = new /obj/item/weapon/stock_parts/cell/infinite(src) update_icon() /obj/item/weapon/defibrillator/compact/combat/loaded/attackby(obj/item/weapon/W, mob/user, params) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index c1b932d1bc..390357047a 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -13,7 +13,7 @@ var/stunforce = 7 var/status = 0 - var/obj/item/weapon/stock_parts/cell/high/bcell = null + var/obj/item/weapon/stock_parts/cell/high/cell = null var/hitcost = 1000 var/throw_hit_chance = 35 @@ -21,8 +21,8 @@ user.visible_message("[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!") return (FIRELOSS) -/obj/item/weapon/melee/baton/Initialize() - . = ..() +/obj/item/weapon/melee/baton/Initialize() + . = ..() update_icon() /obj/item/weapon/melee/baton/throw_impact(atom/hit_atom) @@ -31,16 +31,16 @@ if(status && prob(throw_hit_chance) && iscarbon(hit_atom)) baton_stun(hit_atom) -/obj/item/weapon/melee/baton/loaded/Initialize() //this one starts with a cell pre-installed. - bcell = new(src) - . = ..() +/obj/item/weapon/melee/baton/loaded/Initialize() //this one starts with a cell pre-installed. + cell = new(src) + . = ..() /obj/item/weapon/melee/baton/proc/deductcharge(chrgdeductamt) - if(bcell) + if(cell) //Note this value returned is significant, as it will determine //if a stun is applied or not - . = bcell.use(chrgdeductamt) - if(status && bcell.charge < hitcost) + . = cell.use(chrgdeductamt) + if(status && cell.charge < hitcost) //we're below minimum, turn off status = 0 update_icon() @@ -50,22 +50,22 @@ /obj/item/weapon/melee/baton/update_icon() if(status) icon_state = "[initial(name)]_active" - else if(!bcell) + else if(!cell) icon_state = "[initial(name)]_nocell" else icon_state = "[initial(name)]" /obj/item/weapon/melee/baton/examine(mob/user) ..() - if(bcell) - to_chat(user, "The baton is [round(bcell.percent())]% charged.") + if(cell) + to_chat(user, "The baton is [round(cell.percent())]% charged.") else - to_chat(user, "The baton does not have a power source installed.") + to_chat(user, "The baton does not have a power source installed.") /obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/stock_parts/cell)) var/obj/item/weapon/stock_parts/cell/C = W - if(bcell) + if(cell) to_chat(user, "[src] already has a cell.") else if(C.maxcharge < hitcost) @@ -73,15 +73,15 @@ return if(!user.transferItemToLoc(W, src)) return - bcell = W + cell = W to_chat(user, "You install a cell in [src].") update_icon() else if(istype(W, /obj/item/weapon/screwdriver)) - if(bcell) - bcell.updateicon() - bcell.loc = get_turf(src.loc) - bcell = null + if(cell) + cell.update_icon() + cell.forceMove(get_turf(src)) + cell = null to_chat(user, "You remove the cell from [src].") status = 0 update_icon() @@ -89,13 +89,13 @@ return ..() /obj/item/weapon/melee/baton/attack_self(mob/user) - if(bcell && bcell.charge > hitcost) + if(cell && cell.charge > hitcost) status = !status to_chat(user, "[src] is now [status ? "on" : "off"].") playsound(loc, "sparks", 75, 1, -1) else status = 0 - if(!bcell) + if(!cell) to_chat(user, "[src] does not have a power source!") else to_chat(user, "[src] is out of charge.") @@ -186,8 +186,8 @@ slot_flags = SLOT_BACK var/obj/item/device/assembly/igniter/sparkler = 0 -/obj/item/weapon/melee/baton/cattleprod/Initialize() - . = ..() +/obj/item/weapon/melee/baton/cattleprod/Initialize() + . = ..() sparkler = new (src) /obj/item/weapon/melee/baton/cattleprod/baton_stun() diff --git a/code/game/objects/items/weapons/teleprod.dm b/code/game/objects/items/weapons/teleprod.dm index 07af7a30c4..d14788e0b1 100644 --- a/code/game/objects/items/weapons/teleprod.dm +++ b/code/game/objects/items/weapons/teleprod.dm @@ -28,7 +28,7 @@ /obj/item/weapon/melee/baton/cattleprod/attackby(obj/item/I, mob/user, params)//handles sticking a crystal onto a stunprod to make a teleprod if(istype(I, /obj/item/weapon/ore/bluespace_crystal)) - if(!bcell) + if(!cell) var/obj/item/weapon/melee/baton/cattleprod/teleprod/S = new /obj/item/weapon/melee/baton/cattleprod/teleprod remove_item_from_storage(user) qdel(src) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 7482b4ca14..b08f0542a0 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -23,7 +23,7 @@ var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset. var/unique_rename = FALSE // can you customize the description/name of the thing? - + var/dangerous_possession = FALSE //Admin possession yes/no /obj/vv_edit_var(vname, vval) @@ -37,7 +37,7 @@ ..() /obj/Initialize() - . = ..() + . = ..() if (!armor) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) if(on_blueprints && isturf(loc)) @@ -193,6 +193,6 @@ ..() if(unique_rename) to_chat(user, "Use a pen on it to rename it or change its description.") - -/obj/proc/gang_contraband_value() - return 0 + +/obj/proc/gang_contraband_value() + return 0 diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index f1c30a0bfb..89273de04e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -26,6 +26,7 @@ new /obj/item/clothing/glasses/meson/engine(src) new /obj/item/weapon/door_remote/chief_engineer(src) new /obj/item/weapon/pipe_dispenser(src) + new /obj/item/weapon/inducer(src) /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" @@ -37,6 +38,8 @@ ..() new /obj/item/clothing/gloves/color/yellow(src) new /obj/item/clothing/gloves/color/yellow(src) + new /obj/item/weapon/inducer(src) + new /obj/item/weapon/inducer(src) for(var/i in 1 to 3) new /obj/item/weapon/storage/toolbox/electrical(src) for(var/i in 1 to 3) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 1e5c16f665..90c26657f5 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -480,8 +480,8 @@ if(istype(O, /obj/item/weapon/melee/baton)) var/obj/item/weapon/melee/baton/B = O - if(B.bcell) - if(B.bcell.charge > 0 && B.status == 1) + if(B.cell) + if(B.cell.charge > 0 && B.status == 1) flick("baton_active", src) var/stunforce = B.stunforce user.Stun(stunforce) diff --git a/code/modules/admin/verbs/individual_logging.dm b/code/modules/admin/verbs/individual_logging.dm index d7db82f5b3..ca84d5d759 100644 --- a/code/modules/admin/verbs/individual_logging.dm +++ b/code/modules/admin/verbs/individual_logging.dm @@ -14,11 +14,12 @@ if(type == INDIVIDUAL_SHOW_ALL_LOG) dat += "
Displaying all logs of [key_name(M)]


" for(var/log_type in M.logging) - var/list/reversed = M.logging[log_type] - reversed = reverseRange(reversed.Copy()) dat += "
[log_type]

" - for(var/entry in reversed) - dat += "[entry]: [reversed[entry]]
" + var/list/reversed = M.logging[log_type] + if(islist(reversed)) + reversed = reverseRange(reversed.Copy()) + for(var/entry in reversed) + dat += "[entry]: [reversed[entry]]
" dat += "
" else dat += "
[type] of [key_name(M)]

" @@ -26,6 +27,6 @@ if(reversed) reversed = reverseRange(reversed.Copy()) for(var/entry in reversed) - dat += "[entry]: [reversed[entry]]
" + dat += "[entry]: [reversed[entry]]
" - usr << browse(dat, "window=invidual_logging;size=600x480") \ No newline at end of file + usr << browse(dat, "window=invidual_logging_[M];size=600x480") diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 3c6c7b2342..01a5b0da3a 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -13,6 +13,14 @@ icon_state = "filter_off_f" flipped = 1 +// These two filter types have critical_machine flagged to on and thus causes the area they are in to be exempt from the Grid Check event. + +/obj/machinery/atmospherics/components/trinary/filter/critical + critical_machine = TRUE + +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical + critical_machine = TRUE + /obj/machinery/atmospherics/components/trinary/filter/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) frequency = new_frequency diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index efda086af5..6c09b82402 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -543,6 +543,13 @@ crate_name = "electrical maintenance crate" crate_type = /obj/structure/closet/crate/engineering/electrical +/datum/supply_pack/engineering/inducers + name = "NT-75 Electromagnetic Power Inducers Crate" + cost = 2000 + contains = list(/obj/item/weapon/inducer/sci {cell_type = /obj/item/weapon/stock_parts/cell/{maxcharge = 5000; charge = 5000};opened = 0},/obj/item/weapon/inducer/sci {cell_type = /obj/item/weapon/stock_parts/cell/{maxcharge = 5000; charge = 5000};opened = 0}) //FALSE doesn't work in modified type paths apparently. + crate_name = "inducer crate" + crate_type = /obj/structure/closet/crate/engineering/electrical + /datum/supply_pack/engineering/engiequipment name = "Engineering Gear Crate" cost = 1300 diff --git a/code/modules/mob/living/carbon/human/interactive.dm b/code/modules/mob/living/carbon/human/interactive.dm index 9b4f963d07..c93a79f4fc 100644 --- a/code/modules/mob/living/carbon/human/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive.dm @@ -1540,7 +1540,7 @@ if(stunning && stunCheck.stunned) shouldFire = 0 if(shouldFire) - if(P.power_supply.charge <= 10) // can shoot seems to bug out for tasers, using this hacky method instead + if(P.cell.charge <= 10) // can shoot seems to bug out for tasers, using this hacky method instead P.update_icon() npcDrop(P,1) else diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 27cf0c3a82..abb81678bb 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -97,6 +97,9 @@ buckle_lying = FALSE can_ride_typecache = list(/mob/living/carbon/human) +/mob/living/silicon/robot/get_cell() + return cell + /mob/living/silicon/robot/Initialize(mapload) spark_system = new /datum/effect_system/spark_spread() spark_system.set_up(5, 0, src) diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 01c700768f..96247fa1b1 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -56,7 +56,7 @@ add_fingerprint(user) if(opened && !wiresexposed && !issilicon(user)) if(cell) - cell.updateicon() + cell.update_icon() cell.add_fingerprint(user) user.put_in_active_hand(cell) to_chat(user, "You remove \the [cell].") diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 4c629412bf..824f5b5f02 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -104,10 +104,10 @@ S.cost = 1 S.source = get_or_create_estorage(/datum/robot_energy_storage/wire) - else if(istype(S, /obj/item/stack/marker_beacon)) - S.cost = 1 - S.source = get_or_create_estorage(/datum/robot_energy_storage/beacon) - + else if(istype(S, /obj/item/stack/marker_beacon)) + S.cost = 1 + S.source = get_or_create_estorage(/datum/robot_energy_storage/beacon) + if(S && S.source) S.materials = list() S.is_cyborg = 1 @@ -149,8 +149,8 @@ F.update_icon() else if(istype(I, /obj/item/weapon/melee/baton)) var/obj/item/weapon/melee/baton/B = I - if(B.bcell) - B.bcell.charge = B.bcell.maxcharge + if(B.cell) + B.cell.charge = B.cell.maxcharge else if(istype(I, /obj/item/weapon/gun/energy)) var/obj/item/weapon/gun/energy/EG = I if(!EG.chambered) @@ -202,9 +202,9 @@ /obj/item/weapon/robot_module/proc/do_transform_animation() var/mob/living/silicon/robot/R = loc R.notransform = TRUE - var/obj/effect/temp_visual/decoy/fading/fivesecond/ANM = new /obj/effect/temp_visual/decoy/fading/fivesecond(R.loc, R) + var/obj/effect/temp_visual/decoy/fading/fivesecond/ANM = new /obj/effect/temp_visual/decoy/fading/fivesecond(R.loc, R) ANM.layer = R.layer - 0.01 - new /obj/effect/temp_visual/small_smoke(R.loc) + new /obj/effect/temp_visual/small_smoke(R.loc) if(R.hat) R.hat.forceMove(get_turf(R)) R.hat = null @@ -226,7 +226,7 @@ if(R.hud_used) R.hud_used.update_robot_modules_display() if(feedback_key && !did_feedback) - SSblackbox.inc(feedback_key, 1) + SSblackbox.inc(feedback_key, 1) /obj/item/weapon/robot_module/standard name = "Standard" @@ -275,7 +275,7 @@ /obj/item/roller/robo, /obj/item/borg/cyborghug/medical, /obj/item/stack/medical/gauze/cyborg, - /obj/item/weapon/organ_storage, + /obj/item/weapon/organ_storage, /obj/item/borg/lollipop) emag_modules = list(/obj/item/weapon/reagent_containers/borghypo/hacked) ratvar_modules = list( @@ -395,9 +395,9 @@ ..() var/obj/item/weapon/gun/energy/e_gun/advtaser/cyborg/T = locate(/obj/item/weapon/gun/energy/e_gun/advtaser/cyborg) in basic_modules if(T) - if(T.power_supply.charge < T.power_supply.maxcharge) + if(T.cell.charge < T.cell.maxcharge) var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select] - T.power_supply.give(S.e_cost * coeff) + T.cell.give(S.e_cost * coeff) T.update_icon() else T.charge_tick = 0 @@ -411,8 +411,8 @@ /obj/item/weapon/reagent_containers/borghypo/peace, /obj/item/weapon/holosign_creator/cyborg, /obj/item/borg/cyborghug/peacekeeper, - /obj/item/weapon/extinguisher, - /obj/item/borg/projectile_dampen) + /obj/item/weapon/extinguisher, + /obj/item/borg/projectile_dampen) emag_modules = list(/obj/item/weapon/reagent_containers/borghypo/peace/hacked) ratvar_modules = list( /obj/item/clockwork/slab/cyborg/peacekeeper, @@ -539,8 +539,8 @@ /obj/item/weapon/storage/bag/sheetsnatcher/borg, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator/cyborg, - /obj/item/device/gps/cyborg, - /obj/item/stack/marker_beacon) + /obj/item/device/gps/cyborg, + /obj/item/stack/marker_beacon) emag_modules = list(/obj/item/borg/stun) ratvar_modules = list( /obj/item/clockwork/slab/cyborg/miner, @@ -636,8 +636,8 @@ max_energy = 2500 recharge_rate = 250 name = "Medical Synthesizer" - -/datum/robot_energy_storage/beacon - max_energy = 30 - recharge_rate = 1 - name = "Marker Beacon Storage" + +/datum/robot_energy_storage/beacon + max_energy = 30 + recharge_rate = 1 + name = "Marker Beacon Storage" diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 4a79476bf0..61586e625c 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -9,7 +9,7 @@ maxHealth = 100 damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) obj_damage = 60 - environment_smash = ENVIRONMENT_SMASH_WALLS //Walls can't stop THE LAW + environment_smash = ENVIRONMENT_SMASH_WALLS //Walls can't stop THE LAW mob_size = MOB_SIZE_LARGE radio_key = /obj/item/device/encryptionkey/headset_sec @@ -358,21 +358,21 @@ Auto Patrol[]"}, var/obj/item/weapon/ed209_assembly/Sa = new /obj/item/weapon/ed209_assembly(Tsec) Sa.build_step = 1 - Sa.add_overlay("hs_hole") + Sa.add_overlay("hs_hole") Sa.created_name = name new /obj/item/device/assembly/prox_sensor(Tsec) if(!lasercolor) var/obj/item/weapon/gun/energy/e_gun/advtaser/G = new /obj/item/weapon/gun/energy/e_gun/advtaser(Tsec) - G.power_supply.charge = 0 + G.cell.charge = 0 G.update_icon() else if(lasercolor == "b") var/obj/item/weapon/gun/energy/laser/bluetag/G = new /obj/item/weapon/gun/energy/laser/bluetag(Tsec) - G.power_supply.charge = 0 + G.cell.charge = 0 G.update_icon() else if(lasercolor == "r") var/obj/item/weapon/gun/energy/laser/redtag/G = new /obj/item/weapon/gun/energy/laser/redtag(Tsec) - G.power_supply.charge = 0 + G.cell.charge = 0 G.update_icon() if(prob(50)) @@ -390,7 +390,7 @@ Auto Patrol[]"}, if(lasercolor == "r") new /obj/item/clothing/suit/redtag(Tsec) - do_sparks(3, TRUE, src) + do_sparks(3, TRUE, src) new /obj/effect/decal/cleanable/oil(loc) ..() @@ -444,7 +444,7 @@ Auto Patrol[]"}, if(severity==2 && prob(70)) ..(severity-1) else - new /obj/effect/temp_visual/emp(loc) + new /obj/effect/temp_visual/emp(loc) var/list/mob/living/carbon/targets = new for(var/mob/living/carbon/C in view(12,src)) if(C.stat==2) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index da45e31d1e..c94557f591 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca var/mob/living/creator = null // the creator var/destroy_objects = 0 var/knockdown_people = 0 - var/static/mutable_appearance/googly_eyes = mutable_appearance('icons/mob/mob.dmi', "googly_eyes") + var/static/mutable_appearance/googly_eyes = mutable_appearance('icons/mob/mob.dmi', "googly_eyes") gold_core_spawnable = 0 /mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0) @@ -203,7 +203,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca if(..()) emote_see = list("aims menacingly") obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE //needed? seems weird for them to do so + environment_smash = ENVIRONMENT_SMASH_NONE //needed? seems weird for them to do so ranged = 1 retreat_distance = 1 //just enough to shoot minimum_distance = 6 @@ -229,10 +229,10 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca /mob/living/simple_animal/hostile/mimic/copy/ranged/OpenFire(the_target) if(Zapgun) - if(Zapgun.power_supply) + if(Zapgun.cell) var/obj/item/ammo_casing/energy/shot = Zapgun.ammo_type[Zapgun.select] - if(Zapgun.power_supply.charge >= shot.e_cost) - Zapgun.power_supply.use(shot.e_cost) + if(Zapgun.cell.charge >= shot.e_cost) + Zapgun.cell.use(shot.e_cost) Zapgun.update_icon() ..() else if(Zapstick) diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index c03570c335..c62b0793ad 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -26,6 +26,11 @@ return battery_module.battery.give(amount) return 0 +/obj/item/device/modular_computer/get_cell() + var/obj/item/weapon/computer_hardware/battery/battery_module = all_components[MC_CELL] + if(battery_module && battery_module.battery) + return battery_module.battery + // Used in following function to reduce copypaste /obj/item/device/modular_computer/proc/power_failure() diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm index 7a3e119a56..c75dd1032d 100644 --- a/code/modules/ninja/suit/ninjaDrainAct.dm +++ b/code/modules/ninja/suit/ninjaDrainAct.dm @@ -111,7 +111,7 @@ They *could* go in their appropriate files, but this is supposed to be modular S.cell.charge += charge charge = 0 corrupt() - updateicon() + update_icon() //RDCONSOLE// diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index d5811e32c9..b304b3c530 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -56,6 +56,8 @@ Contents: var/s_bombs = 10//Number of starting ninja smoke bombs. var/a_boost = 3//Number of adrenaline boosters. +/obj/item/clothing/suit/space/space_ninja/get_cell() + return cell /obj/item/clothing/suit/space/space_ninja/New() ..() diff --git a/code/modules/ninja/suit/suit_attackby.dm b/code/modules/ninja/suit/suit_attackby.dm index e54a5e0e85..7903d4c3e7 100644 --- a/code/modules/ninja/suit/suit_attackby.dm +++ b/code/modules/ninja/suit/suit_attackby.dm @@ -32,7 +32,7 @@ U.put_in_hands(old_cell) old_cell.add_fingerprint(U) old_cell.corrupt() - old_cell.updateicon() + old_cell.update_icon() cell = CELL to_chat(U, "Upgrade complete. Maximum capacity: [round(cell.maxcharge/100)]%") else diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index d980591ceb..1ce26fb373 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -93,6 +93,10 @@ var/update_overlay = -1 var/icon_update_needed = FALSE +/obj/machinery/power/apc/get_cell() + return cell + + /obj/machinery/power/apc/connect_to_network() //Override because the APC does not directly connect to the network; it goes through a terminal. //The terminal is what the power computer looks for anyway. @@ -622,14 +626,10 @@ return if(usr == user && opened && (!issilicon(user))) if(cell) + user.visible_message("[user] removes \the [cell] from [src]!","You remove \the [cell].") user.put_in_hands(cell) - cell.add_fingerprint(user) - cell.updateicon() - + cell.update_icon() src.cell = null - user.visible_message("[user.name] removes the power cell from [src.name]!",\ - "You remove the power cell.") - //to_chat(user, "You remove the power cell.") charging = 0 src.update_icon() return diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index a4b994e0cf..1c3d44b7ea 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -19,13 +19,16 @@ var/ratingdesc = TRUE var/grown_battery = FALSE // If it's a grown that acts as a battery, add a wire overlay to it. +/obj/item/weapon/stock_parts/cell/get_cell() + return src + /obj/item/weapon/stock_parts/cell/New() ..() START_PROCESSING(SSobj, src) charge = maxcharge if(ratingdesc) desc += " This one has a power rating of [maxcharge], and you should not swallow it." - updateicon() + update_icon() /obj/item/weapon/stock_parts/cell/Destroy() STOP_PROCESSING(SSobj, src) @@ -46,16 +49,16 @@ else return PROCESS_KILL -/obj/item/weapon/stock_parts/cell/proc/updateicon() +/obj/item/weapon/stock_parts/cell/update_icon() cut_overlays() if(grown_battery) - add_overlay("grown_wires") + add_overlay("grown_wires") if(charge < 0.01) return else if(charge/maxcharge >=0.995) - add_overlay("cell-o2") + add_overlay("cell-o2") else - add_overlay("cell-o1") + add_overlay("cell-o1") /obj/item/weapon/stock_parts/cell/proc/percent() // return % charge of cell return 100*charge/maxcharge @@ -69,7 +72,7 @@ return 0 charge = (charge - amount) if(!istype(loc, /obj/machinery/power/apc)) - SSblackbox.add_details("cell_used","[src.type]") + SSblackbox.add_details("cell_used","[src.type]") return 1 // recharge the cell @@ -123,7 +126,7 @@ corrupt() return //explosion(T, 0, 1, 2, 2) - explosion(T, devastation_range, heavy_impact_range, light_impact_range, flash_range) + explosion(T, devastation_range, heavy_impact_range, light_impact_range, flash_range) qdel(src) /obj/item/weapon/stock_parts/cell/proc/corrupt() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index f8d0911011..2548dd3f74 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -4,13 +4,13 @@ desc = "A basic energy-based gun." icon = 'icons/obj/guns/energy.dmi' - var/obj/item/weapon/stock_parts/cell/power_supply //What type of power cell this uses + var/obj/item/weapon/stock_parts/cell/cell //What type of power cell this uses var/cell_type = /obj/item/weapon/stock_parts/cell var/modifystate = 0 var/list/ammo_type = list(/obj/item/ammo_casing/energy) var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next. var/can_charge = 1 //Can it be charged in a recharger? - var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_icon()? + var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_icon()? var/charge_sections = 4 ammo_x_offset = 2 var/shaded_charge = 0 //if this gun uses a stateful charge bar for more detail @@ -20,19 +20,22 @@ var/use_cyborg_cell = 0 //whether the gun's cell drains the cyborg user's cell to recharge /obj/item/weapon/gun/energy/emp_act(severity) - power_supply.use(round(power_supply.charge / severity)) + cell.use(round(cell.charge / severity)) chambered = null //we empty the chamber recharge_newshot() //and try to charge a new shot update_icon() +/obj/item/weapon/gun/energy/get_cell() + return cell -/obj/item/weapon/gun/energy/Initialize() - . = ..() + +/obj/item/weapon/gun/energy/Initialize() + . = ..() if(cell_type) - power_supply = new cell_type(src) + cell = new cell_type(src) else - power_supply = new(src) - power_supply.give(power_supply.maxcharge) + cell = new(src) + cell.give(cell.maxcharge) update_ammo_types() recharge_newshot(1) if(selfcharge) @@ -50,9 +53,7 @@ fire_delay = shot.delay /obj/item/weapon/gun/energy/Destroy() - if(power_supply) - qdel(power_supply) - power_supply = null + QDEL_NULL(cell) STOP_PROCESSING(SSobj, src) return ..() @@ -62,9 +63,9 @@ if(charge_tick < charge_delay) return charge_tick = 0 - if(!power_supply) + if(!cell) return - power_supply.give(100) + cell.give(100) if(!chambered) //if empty chamber we try to charge a new shot recharge_newshot(1) update_icon() @@ -76,10 +77,10 @@ /obj/item/weapon/gun/energy/can_shoot() var/obj/item/ammo_casing/energy/shot = ammo_type[select] - return power_supply.charge >= shot.e_cost + return cell.charge >= shot.e_cost /obj/item/weapon/gun/energy/recharge_newshot(no_cyborg_drain) - if (!ammo_type || !power_supply) + if (!ammo_type || !cell) return if(use_cyborg_cell && !no_cyborg_drain) if(iscyborg(loc)) @@ -87,10 +88,10 @@ if(R.cell) var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot if(R.cell.use(shot.e_cost)) //Take power from the borg... - power_supply.give(shot.e_cost) //... to recharge the shot + cell.give(shot.e_cost) //... to recharge the shot if(!chambered) var/obj/item/ammo_casing/energy/AC = ammo_type[select] - if(power_supply.charge >= AC.e_cost) //if there's enough power in the power_supply cell... + if(cell.charge >= AC.e_cost) //if there's enough power in the cell cell... chambered = AC //...prepare a new shot based on the current ammo type selected if(!chambered.BB) chambered.newshot() @@ -98,7 +99,7 @@ /obj/item/weapon/gun/energy/process_chamber() if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired... var/obj/item/ammo_casing/energy/shot = chambered - power_supply.use(shot.e_cost)//... drain the power_supply cell + cell.use(shot.e_cost)//... drain the cell cell chambered = null //either way, released the prepared shot recharge_newshot() //try to charge a new shot @@ -117,10 +118,10 @@ return /obj/item/weapon/gun/energy/update_icon() - ..() - if(!automatic_charge_overlays) - return - var/ratio = Ceiling((power_supply.charge / power_supply.maxcharge) * charge_sections) + ..() + if(!automatic_charge_overlays) + return + var/ratio = Ceiling((cell.charge / cell.maxcharge) * charge_sections) var/obj/item/ammo_casing/energy/shot = ammo_type[select] var/iconState = "[icon_state]_charge" var/itemState = null @@ -131,16 +132,16 @@ iconState += "_[shot.select_name]" if(itemState) itemState += "[shot.select_name]" - if(power_supply.charge < shot.e_cost) + if(cell.charge < shot.e_cost) add_overlay("[icon_state]_empty") else if(!shaded_charge) - var/mutable_appearance/charge_overlay = mutable_appearance(icon, iconState) + var/mutable_appearance/charge_overlay = mutable_appearance(icon, iconState) for(var/i = ratio, i >= 1, i--) - charge_overlay.pixel_x = ammo_x_offset * (i - 1) - add_overlay(charge_overlay) + charge_overlay.pixel_x = ammo_x_offset * (i - 1) + add_overlay(charge_overlay) else - add_overlay("[icon_state]_charge[ratio]") + add_overlay("[icon_state]_charge[ratio]") if(itemState) itemState += "[ratio]" item_state = itemState @@ -156,7 +157,7 @@ user.visible_message("[user] melts [user.p_their()] face off with [src]!") playsound(loc, fire_sound, 50, 1, -1) var/obj/item/ammo_casing/energy/shot = ammo_type[select] - power_supply.use(shot.e_cost) + cell.use(shot.e_cost) update_icon() return(FIRELOSS) else @@ -191,17 +192,17 @@ user.visible_message("[user] tries to light their [A.name] with [src], but it doesn't do anything. Dumbass.") playsound(user, E.fire_sound, 50, 1) playsound(user, BB.hitsound, 50, 1) - power_supply.use(E.e_cost) + cell.use(E.e_cost) . = "" else if(BB.damage_type != BURN) user.visible_message("[user] tries to light their [A.name] with [src], but only succeeds in utterly destroying it. Dumbass.") playsound(user, E.fire_sound, 50, 1) playsound(user, BB.hitsound, 50, 1) - power_supply.use(E.e_cost) + cell.use(E.e_cost) qdel(A) . = "" else playsound(user, E.fire_sound, 50, 1) playsound(user, BB.hitsound, 50, 1) - power_supply.use(E.e_cost) + cell.use(E.e_cost) . = "[user] casually lights their [A.name] with [src]. Damn." diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 77328bb422..3c7b15993b 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -98,7 +98,7 @@ empty() /obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty() - power_supply.use(500) + cell.use(500) update_icon() /obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time) @@ -125,7 +125,7 @@ return /obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload() - power_supply.give(500) + cell.give(500) recharge_newshot(1) if(!suppressed) playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index a8ae4da97a..f6841d6bf9 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -39,7 +39,7 @@ /obj/item/weapon/gun/energy/decloner/update_icon() ..() var/obj/item/ammo_casing/energy/shot = ammo_type[select] - if(power_supply.charge > shot.e_cost) + if(cell.charge > shot.e_cost) add_overlay("decloner_spin") /obj/item/weapon/gun/energy/floragun @@ -137,19 +137,19 @@ /obj/item/weapon/gun/energy/plasmacutter/examine(mob/user) ..() - if(power_supply) - to_chat(user, "[src] is [round(power_supply.percent())]% charged.") + if(cell) + to_chat(user, "[src] is [round(cell.percent())]% charged.") /obj/item/weapon/gun/energy/plasmacutter/attackby(obj/item/A, mob/user) if(istype(A, /obj/item/stack/sheet/mineral/plasma)) var/obj/item/stack/sheet/S = A S.use(1) - power_supply.give(1000) + cell.give(1000) recharge_newshot(1) to_chat(user, "You insert [A] in [src], recharging it.") else if(istype(A, /obj/item/weapon/ore/plasma)) qdel(A) - power_supply.give(500) + cell.give(500) recharge_newshot(1) to_chat(user, "You insert [A] in [src], recharging it.") else diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8c810155db..d051ec0221 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -78,7 +78,7 @@ return "chest" /obj/item/projectile/proc/prehit(atom/target) - return + return TRUE /obj/item/projectile/proc/on_hit(atom/target, blocked = 0) var/turf/target_loca = get_turf(target) @@ -142,7 +142,7 @@ if(firer && !ricochets) if(A == firer || (A == firer.loc && istype(A, /obj/mecha))) //cannot shoot yourself or your mech loc = A.loc - return 0 + return FALSE var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use. @@ -155,13 +155,14 @@ var/turf/target_turf = get_turf(A) - prehit(A) + if(!prehit(A)) + return FALSE var/permutation = A.bullet_act(src, def_zone) // searches for return value, could be deleted after run so check A isn't null if(permutation == -1 || forcedodge)// the bullet passes through a dense object! loc = target_turf if(A) permutated.Add(A) - return 0 + return FALSE else if(A && A.density && !ismob(A) && !(A.flags & ON_BORDER)) //if we hit a dense non-border obj or dense turf then we also hit one of the mobs on that tile. var/list/mobs_list = list() @@ -169,9 +170,11 @@ mobs_list += L if(mobs_list.len) var/mob/living/picked_mob = pick(mobs_list) - prehit(picked_mob) + if(!prehit(picked_mob)) + return FALSE picked_mob.bullet_act(src, def_zone) qdel(src) + return TRUE /obj/item/projectile/proc/check_ricochet() if(prob(ricochet_chance)) @@ -277,46 +280,53 @@ Range() sleep(config.run_speed * 0.9) - /obj/item/projectile/proc/preparePixelProjectile(atom/target, var/turf/targloc, mob/living/user, params, spread) var/turf/curloc = get_turf(user) - src.loc = get_turf(user) - src.starting = get_turf(user) - src.current = curloc - src.yo = targloc.y - curloc.y - src.xo = targloc.x - curloc.x + forceMove(get_turf(user)) + starting = get_turf(user) + current = curloc + yo = targloc.y - curloc.y + xo = targloc.x - curloc.x - if(params) - var/list/mouse_control = params2list(params) - if(mouse_control["icon-x"]) - src.p_x = text2num(mouse_control["icon-x"]) - if(mouse_control["icon-y"]) - src.p_y = text2num(mouse_control["icon-y"]) - if(mouse_control["screen-loc"]) - //Split screen-loc up into X+Pixel_X and Y+Pixel_Y - var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",") + var/list/calculated = calculate_projectile_angle_and_pixel_offsets(user, params) + Angle = calculated[1] + p_x = calculated[2] + p_y = calculated[3] - //Split X+Pixel_X up into list(X, Pixel_X) - var/list/screen_loc_X = splittext(screen_loc_params[1],":") - - //Split Y+Pixel_Y up into list(Y, Pixel_Y) - var/list/screen_loc_Y = splittext(screen_loc_params[2],":") - // to_chat(world, "X: [screen_loc_X[1]] PixelX: [screen_loc_X[2]] / Y: [screen_loc_Y[1]] PixelY: [screen_loc_Y[2]]") - var/x = text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32 - var/y = text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32 - - //Calculate the "resolution" of screen based on client's view and world's icon size. This will work if the user can view more tiles than average. - var/screenview = (user.client.view * 2 + 1) * world.icon_size //Refer to http://www.byond.com/docs/ref/info.html#/client/var/view for mad maths - - var/ox = round(screenview/2) //"origin" x - var/oy = round(screenview/2) //"origin" y - // to_chat(world, "Pixel position: [x] [y]") - var/angle = Atan2(y - oy, x - ox) - // to_chat(world, "Angle: [angle]") - src.Angle = angle if(spread) src.Angle += spread +/proc/calculate_projectile_angle_and_pixel_offsets(mob/user, params) + var/list/mouse_control = params2list(params) + var/p_x = 0 + var/p_y = 0 + var/angle = 0 + if(mouse_control["icon-x"]) + p_x = text2num(mouse_control["icon-x"]) + if(mouse_control["icon-y"]) + p_y = text2num(mouse_control["icon-y"]) + if(mouse_control["screen-loc"]) + //Split screen-loc up into X+Pixel_X and Y+Pixel_Y + var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",") + + //Split X+Pixel_X up into list(X, Pixel_X) + var/list/screen_loc_X = splittext(screen_loc_params[1],":") + + //Split Y+Pixel_Y up into list(Y, Pixel_Y) + var/list/screen_loc_Y = splittext(screen_loc_params[2],":") + // to_chat(world, "X: [screen_loc_X[1]] PixelX: [screen_loc_X[2]] / Y: [screen_loc_Y[1]] PixelY: [screen_loc_Y[2]]") + var/x = text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32 + var/y = text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32 + + //Calculate the "resolution" of screen based on client's view and world's icon size. This will work if the user can view more tiles than average. + var/screenview = (user.client.view * 2 + 1) * world.icon_size //Refer to http://www.byond.com/docs/ref/info.html#/client/var/view for mad maths + + var/ox = round(screenview/2) - user.client.pixel_x //"origin" x + var/oy = round(screenview/2) - user.client.pixel_y //"origin" y + // to_chat(world, "Pixel position: [x] [y]") + angle = Atan2(y - oy, x - ox) + // to_chat(world, "Angle: [angle]") + return list(angle, p_x, p_y) /obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it. ..() diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index f03bb8f3e9..393e64bd0d 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -68,6 +68,17 @@ build_path = /obj/item/device/lightreplacer category = list("Power Designs") +/datum/design/inducer + name = "Inducer" + desc = "The NT-75 Electromagnetic Power Inducer can wirelessly induce electric charge in an object, allowing you to recharge power cells without having to remove them." + id = "inducer" + req_tech = list("powerstorage" = 4, "engineering" = 4, "magnets" = 4) + build_type = PROTOLATHE + materials = list(MAT_METAL = 3000, MAT_GLASS = 1000) + build_path = /obj/item/weapon/inducer/sci + category = list("Power Designs") + + /datum/design/board/pacman name = "Machine Design (PACMAN-type Generator Board)" desc = "The circuit board that for a PACMAN-type portable generator." diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index a20439dea2e55be83165dafd702fe159264d09c8..d08290d169102a2fb4dfcdbe127e6c0735a86eaf 100644 GIT binary patch delta 11334 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 delta 10889 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 KDtl`6_J06{&TH!c delta 9009 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 literal 10864 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%0D}xqw=Tky+i6+l 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