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