diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index abf7f5b827..97a343311d 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -522,10 +522,10 @@
var/projectile_damage_tick_ecost_coefficient = 2 //Lasers get half their damage chopped off, drains 50 power/tick. Note that fields are processed 5 times per second.
var/projectile_speed_coefficient = 1.5 //Higher the coefficient slower the projectile.
var/projectile_tick_speed_ecost = 15
- var/current_damage_dampening = 0
var/list/obj/item/projectile/tracked
var/image/projectile_effect
var/field_radius = 3
+ var/active = FALSE
/obj/item/borg/projectile_dampen/debug
maxenergy = 50000
@@ -538,13 +538,13 @@
tracked = list()
icon_state = "shield0"
START_PROCESSING(SSfastprocess, src)
+ host = loc
/obj/item/borg/projectile_dampen/Destroy()
STOP_PROCESSING(SSfastprocess, src)
return ..()
/obj/item/borg/projectile_dampen/attack_self(mob/user)
- var/active = FALSE
if(!istype(dampening_field))
activate_field()
active = TRUE
@@ -552,17 +552,30 @@
deactivate_field()
active = FALSE
to_chat(user, "You [active? "activate":"deactivate"] the [src].")
+
+/obj/item/borg/projectile_dampen/update_icon()
+ . = ..()
icon_state = "[initial(icon_state)][active]"
/obj/item/borg/projectile_dampen/proc/activate_field()
if(!istype(dampening_field))
dampening_field = make_field(/datum/proximity_monitor/advanced/peaceborg_dampener, list("current_range" = field_radius, "host" = src, "projector" = src))
+ update_icon()
/obj/item/borg/projectile_dampen/proc/deactivate_field()
QDEL_NULL(dampening_field)
visible_message("The [src] shuts off!")
for(var/obj/item/projectile/P in tracked)
restore_projectile(P)
+ update_icon()
+
+/obj/item/borg/projectile_dampen/dropped()
+ . = ..()
+ host = loc
+
+/obj/item/borg/projectile_dampen/equipped()
+ . = ..()
+ host = loc
/obj/item/borg/projectile_dampen/process()
process_recharge()
@@ -576,10 +589,11 @@
/obj/item/borg/projectile_dampen/proc/process_usage()
var/usage = 0
for(var/I in tracked)
- if(!tracked[I]) //No damage
+ var/obj/item/projectile/P = I
+ if(!P.stun && P.nodamage) //No damage
continue
usage += projectile_tick_speed_ecost
- usage += (current_damage_dampening * projectile_damage_tick_ecost_coefficient)
+ usage += (tracked[I] * projectile_damage_tick_ecost_coefficient)
energy = Clamp(energy - usage, 0, maxenergy)
if(energy <= 0)
deactivate_field()
@@ -587,8 +601,11 @@
/obj/item/borg/projectile_dampen/proc/process_recharge()
if(!istype(host))
- energy = Clamp(energy + energy_recharge, 0, maxenergy)
- return
+ if(iscyborg(host.loc))
+ host = host.loc
+ else
+ energy = Clamp(energy + energy_recharge, 0, maxenergy)
+ return
if((host.cell.charge >= (host.cell.maxcharge * cyborg_cell_critical_percentage)) && (energy < maxenergy))
host.cell.use(energy_recharge*energy_recharge_cyborg_drain_coefficient)
energy += energy_recharge
@@ -598,7 +615,6 @@
return
if(track_projectile)
tracked[P] = P.damage
- current_damage_dampening += P.damage
P.damage *= projectile_damage_coefficient
P.speed *= projectile_speed_coefficient
P.add_overlay(projectile_effect)
@@ -608,8 +624,6 @@
P.damage *= (1/projectile_damage_coefficient)
P.speed *= (1/projectile_speed_coefficient)
P.cut_overlay(projectile_effect)
- current_damage_dampening -= P.damage
-
/**********************************************************************
HUD/SIGHT things
diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm
index 4b083d7e02..4e18e45e9a 100644
--- a/code/modules/fields/fields.dm
+++ b/code/modules/fields/fields.dm
@@ -33,6 +33,7 @@
var/process_edge_turfs = FALSE //Don't do this either unless it's absolutely necessary, you can just track what things are inside manually or on the initial setup.
var/setup_edge_turfs = FALSE //Setup edge turfs/all field turfs. Set either or both to ON when you need it, it's defaulting to off unless you do to save CPU.
var/setup_field_turfs = FALSE
+ var/use_host_turf = FALSE //For fields from items carried on mobs to check turf instead of loc...
var/list/turf/field_turfs = list()
var/list/turf/edge_turfs = list()
@@ -90,8 +91,19 @@
for(var/turf/T in field_turfs)
cleanup_field_turf(T)
+/datum/proximity_monitor/advanced/proc/check_movement()
+ if(!use_host_turf)
+ if(host.loc != last_host_loc)
+ last_host_loc = host.loc
+ return TRUE
+ else
+ if(get_turf(host) != last_host_loc)
+ last_host_loc = get_turf(host)
+ return TRUE
+ return FALSE
+
/datum/proximity_monitor/advanced/proc/recalculate_field(ignore_movement_check = FALSE) //Call every time the field moves (done automatically if you use update_center) or a setup specification is changed.
- if(!(ignore_movement_check || ((host.loc != last_host_loc) && (field_shape != FIELD_NO_SHAPE))))
+ if(!(ignore_movement_check || check_movement()) && (field_shape != FIELD_NO_SHAPE))
return
update_new_turfs()
var/list/turf/needs_setup = field_turfs_new.Copy()
@@ -173,7 +185,6 @@
/datum/proximity_monitor/advanced/proc/update_new_turfs()
if(!istype(host))
return FALSE
- last_host_loc = host.loc
var/turf/center = get_turf(host)
field_turfs_new = list()
edge_turfs_new = list()
diff --git a/code/modules/fields/peaceborg_dampener.dm b/code/modules/fields/peaceborg_dampener.dm
index bcf8a88585..9cfc34f127 100644
--- a/code/modules/fields/peaceborg_dampener.dm
+++ b/code/modules/fields/peaceborg_dampener.dm
@@ -15,9 +15,11 @@
var/static/image/southwest_corner = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_southwest")
var/static/image/northeast_corner = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_northeast")
var/static/image/southeast_corner = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_southeast")
+ var/static/image/generic_edge = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_generic")
var/obj/item/borg/projectile_dampen/projector = null
var/list/obj/item/projectile/tracked
var/list/obj/item/projectile/staging
+ use_host_turf = TRUE
/datum/proximity_monitor/advanced/peaceborg_dampener/New()
tracked = list()
@@ -71,6 +73,8 @@
return southeast_corner
if(SOUTHWEST)
return southwest_corner
+ else
+ return generic_edge
/datum/proximity_monitor/advanced/peaceborg_dampener/proc/capture_projectile(obj/item/projectile/P, track_projectile = TRUE)
if(P in tracked)
diff --git a/code/modules/fields/turf_objects.dm b/code/modules/fields/turf_objects.dm
index 683fa67c96..c68f50bbdb 100644
--- a/code/modules/fields/turf_objects.dm
+++ b/code/modules/fields/turf_objects.dm
@@ -7,6 +7,7 @@
alpha = 0
invisibility = INVISIBILITY_ABSTRACT
flags = ABSTRACT|ON_BORDER
+ mouse_opacity = 0
var/datum/proximity_monitor/advanced/parent = null
/obj/effect/abstract/proximity_checker/advanced/Initialize(mapload, _monitor)
diff --git a/icons/effects/fields.dmi b/icons/effects/fields.dmi
index 5eadb96a1a..f87e1f3975 100644
Binary files a/icons/effects/fields.dmi and b/icons/effects/fields.dmi differ