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 a20439dea2..d08290d169 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index aba22012b2..067b42575e 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index cd0d3f835e..0cff456af6 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index c1bbac4d4a..dee2d3aad0 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -831,6 +831,7 @@
#include "code\game\objects\items\weapons\his_grace.dm"
#include "code\game\objects\items\weapons\holosign_creator.dm"
#include "code\game\objects\items\weapons\holy_weapons.dm"
+#include "code\game\objects\items\weapons\inducer.dm"
#include "code\game\objects\items\weapons\kitchen.dm"
#include "code\game\objects\items\weapons\manuals.dm"
#include "code\game\objects\items\weapons\miscellaneous.dm"
@@ -932,6 +933,7 @@
#include "code\game\objects\structures\ladders.dm"
#include "code\game\objects\structures\lattice.dm"
#include "code\game\objects\structures\life_candle.dm"
+#include "code\game\objects\structures\manned_turret.dm"
#include "code\game\objects\structures\memorial.dm"
#include "code\game\objects\structures\mineral_doors.dm"
#include "code\game\objects\structures\mirror.dm"