diff --git a/code/_onclick/hud/rendering/plane_master_controller.dm b/code/_onclick/hud/rendering/plane_master_controller.dm index ff2c6853fa6..6e7676a5c71 100644 --- a/code/_onclick/hud/rendering/plane_master_controller.dm +++ b/code/_onclick/hud/rendering/plane_master_controller.dm @@ -57,7 +57,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/plane_master_controller) /atom/movable/plane_master_controller/transition_filter(name, time, list/new_params, easing, loop) . = ..() for(var/atom/movable/screen/plane_master/pm_iterator as anything in get_planes()) - pm_iterator.transition_filter(name, time, new_params, easing, loop) + pm_iterator.transition_filter(name, new_params, time, easing, loop) ///Full override so we can just use filterrific /atom/movable/plane_master_controller/add_atom_colour(coloration, colour_priority) diff --git a/code/datums/components/supermatter_crystal.dm b/code/datums/components/supermatter_crystal.dm index dbc865002ab..3a5a854533c 100644 --- a/code/datums/components/supermatter_crystal.dm +++ b/code/datums/components/supermatter_crystal.dm @@ -43,7 +43,7 @@ if(!blob || isspaceturf(atom_source)) //does nothing in space return playsound(get_turf(atom_source), 'sound/effects/supermatter.ogg', 50, TRUE) - consume_returns(damage_increase = blob.get_integrity() * 0.5) + consume_returns(damage_increase = blob.get_integrity() * 0.05) if(blob.get_integrity() > 100) blob.visible_message(span_danger("\The [blob] strikes at \the [atom_source] and flinches away!"), span_hear("You hear a loud crack as you are washed with a wave of heat.")) @@ -247,7 +247,7 @@ consumed_mob.dust(force = TRUE) matter_increase += 100 * object_size if(is_clown_job(consumed_mob.mind?.assigned_role)) - damage_increase += rand(-300, 300) // HONK + damage_increase += rand(-30, 30) // HONK consume_returns(matter_increase, damage_increase) else if(consumed_object.flags_1 & SUPERMATTER_IGNORES_1) return diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 8ed452b4ad7..fe2beae6c27 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1602,7 +1602,15 @@ /atom/proc/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) return -/atom/proc/add_filter(name,priority,list/params) +/** Add a filter to the atom. + * Can also be used to assert a filter's existence. I.E. update a filter regardless if it exists or not. + * + * Arguments: + * * name - Filter name + * * priority - Priority used when sorting the filter. + * * params - Parameters of the filter. + */ +/atom/proc/add_filter(name, priority, list/params) LAZYINITLIST(filter_data) var/list/copied_parameters = params.Copy() copied_parameters["priority"] = priority @@ -1619,20 +1627,40 @@ filters += filter(arglist(arguments)) UNSETEMPTY(filter_data) -/atom/proc/transition_filter(name, time, list/new_params, easing, loop) +/** Update a filter's parameter and animate this change. If the filter doesnt exist we won't do anything. + * Basically a [atom/proc/modify_filter] call but with animations. Unmodified filter parameters are kept. + * + * Arguments: + * * name - Filter name + * * new_params - New parameters of the filter + * * time - time arg of the BYOND animate() proc. + * * easing - easing arg of the BYOND animate() proc. + * * loop - loop arg of the BYOND animate() proc. + */ +/atom/proc/transition_filter(name, list/new_params, time, easing, loop) var/filter = get_filter(name) if(!filter) return - - var/list/old_filter_data = filter_data[name] - - var/list/params = old_filter_data.Copy() - for(var/thing in new_params) - params[thing] = new_params[thing] - animate(filter, new_params, time = time, easing = easing, loop = loop) - for(var/param in params) - filter_data[name][param] = params[param] + modify_filter(name, new_params) + +/** Update a filter's parameter to the new one. If the filter doesnt exist we won't do anything. + * + * Arguments: + * * name - Filter name + * * new_params - New parameters of the filter + * * overwrite - TRUE means we replace the parameter list completely. FALSE means we only replace the things on new_params. + */ +/atom/proc/modify_filter(name, list/new_params, overwrite = FALSE) + var/filter = get_filter(name) + if(!filter) + return + if(overwrite) + filter_data[name] = new_params + else + for(var/thing in new_params) + filter_data[name][thing] = new_params[thing] + update_filters() /atom/proc/change_filter_priority(name, new_priority) if(!filter_data || !filter_data[name]) diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index 2186add2803..397ecbf9928 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -109,7 +109,7 @@ var/obj/machinery/power/supermatter_crystal/S = attached_to if(!istype(S)) return - return "
[round(S.get_integrity_percent(), 1)]%
" + return "
[round(S.get_integrity_percent())]%
" /obj/effect/countdown/transformer name = "transformer countdown" diff --git a/code/modules/admin/view_variables/filterrific.dm b/code/modules/admin/view_variables/filterrific.dm index 6cef9b178ac..0bd9f51c114 100644 --- a/code/modules/admin/view_variables/filterrific.dm +++ b/code/modules/admin/view_variables/filterrific.dm @@ -53,7 +53,7 @@ target.change_filter_priority(params["name"], new_priority) . = TRUE if("transition_filter_value") - target.transition_filter(params["name"], 4, params["new_data"]) + target.transition_filter(params["name"], params["new_data"], 4) . = TRUE if("modify_filter_value") var/list/old_filter_data = target.filter_data[params["name"]] @@ -69,7 +69,7 @@ if("modify_color_value") var/new_color = input(usr, "Pick new filter color", "Filteriffic Colors!") as color|null if(new_color) - target.transition_filter(params["name"], 4, list("color" = new_color)) + target.transition_filter(params["name"], list("color" = new_color), 4) . = TRUE if("modify_icon_value") var/icon/new_icon = input("Pick icon:", "Icon") as null|icon diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 6ea9a55bed7..fe62c5c5585 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -115,7 +115,7 @@ GLOBAL_DATUM_INIT(orbit_menu, /datum/orbit_menu, new) // Display the supermatter crystal integrity if(istype(atom_poi, /obj/machinery/power/supermatter_crystal)) var/obj/machinery/power/supermatter_crystal/crystal = atom_poi - misc[length(misc)]["extra"] = "Integrity: [crystal.get_integrity_percent()]%" + misc[length(misc)]["extra"] = "Integrity: [round(crystal.get_integrity_percent())]%" continue // Display the nuke timer if(istype(atom_poi, /obj/machinery/nuclearbomb)) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 36ce36d64f9..c754554fd28 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -64,16 +64,16 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/list/waste_multiplier_factors ///The point at which we consider the supermatter to be [SUPERMATTER_STATUS_WARNING] - var/warning_point = 50 + var/warning_point = 5 var/warning_channel = RADIO_CHANNEL_ENGINEERING ///The point at which we consider the supermatter to be [SUPERMATTER_STATUS_DANGER] ///Spawns anomalies when more damaged than this too. - var/danger_point = 550 + var/danger_point = 60 ///The point at which we consider the supermatter to be [SUPERMATTER_STATUS_EMERGENCY] - var/emergency_point = 675 + var/emergency_point = 75 var/emergency_channel = null // Need null to actually broadcast, lol. - ///The point at which we delam [SUPERMATTER_STATUS_DELAMINATING] - var/explosion_point = 900 + ///The point at which we delam [SUPERMATTER_STATUS_DELAMINATING]. + var/explosion_point = 100 ///Are we exploding? var/final_countdown = FALSE ///A scaling value that affects the severity of explosions. @@ -419,9 +419,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) return SUPERMATTER_NORMAL return SUPERMATTER_INACTIVE +/// Returns the integrity percent of the Supermatter. No rounding made yet, round it yourself. /obj/machinery/power/supermatter_crystal/proc/get_integrity_percent() var/integrity = damage / explosion_point - integrity = round(100 - integrity * 100, 0.01) + integrity = 100 - integrity * 100 integrity = integrity < 0 ? 0 : integrity return integrity @@ -704,20 +705,20 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) additive_damage[SM_DAMAGE_EXTERNAL] = external_damage_immediate * clamp((emergency_point - damage) / emergency_point, 0, 1) external_damage_immediate = 0 - additive_damage[SM_DAMAGE_HEAT] = clamp((absorbed_gasmix.temperature - temp_limit) / 2400, 0, 1.5) - additive_damage[SM_DAMAGE_POWER] = clamp((internal_energy - POWER_PENALTY_THRESHOLD) / 4000, 0, 1) - additive_damage[SM_DAMAGE_MOLES] = clamp((total_moles - MOLE_PENALTY_THRESHOLD) / 320, 0, 1) + additive_damage[SM_DAMAGE_HEAT] = clamp((absorbed_gasmix.temperature - temp_limit) / 24000, 0, 0.15) + additive_damage[SM_DAMAGE_POWER] = clamp((internal_energy - POWER_PENALTY_THRESHOLD) / 40000, 0, 0.1) + additive_damage[SM_DAMAGE_MOLES] = clamp((total_moles - MOLE_PENALTY_THRESHOLD) / 3200, 0, 0.1) var/is_spaced = FALSE if(isturf(src.loc)) var/turf/local_turf = src.loc for (var/turf/open/space/turf in ((local_turf.atmos_adjacent_turfs || list()) + local_turf)) - additive_damage[SM_DAMAGE_SPACED] = clamp(internal_energy * 0.00125, 0, 10) + additive_damage[SM_DAMAGE_SPACED] = clamp(internal_energy * 0.000125, 0, 1) is_spaced = TRUE break if(total_moles > 0 && !is_spaced) - additive_damage[SM_DAMAGE_HEAL_HEAT] = clamp((absorbed_gasmix.temperature - temp_limit) / 600, -1, 0) + additive_damage[SM_DAMAGE_HEAL_HEAT] = clamp((absorbed_gasmix.temperature - temp_limit) / 6000, -0.1, 0) var/total_damage = 0 for (var/damage_type in additive_damage) diff --git a/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm b/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm index 5aa656e82a8..35dcdb03dd1 100644 --- a/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm +++ b/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm @@ -59,14 +59,14 @@ GLOBAL_LIST_INIT(sm_delam_list, list( playsound(sm, 'sound/machines/terminal_alert.ogg', 75) if(sm.damage < sm.damage_archived) // Healing - sm.radio.talk_into(sm,"Crystalline hyperstructure returning to safe operating parameters. Integrity: [sm.get_integrity_percent()]%", sm.damage_archived >= sm.emergency_point ? sm.emergency_channel : sm.warning_channel) + sm.radio.talk_into(sm,"Crystalline hyperstructure returning to safe operating parameters. Integrity: [round(sm.get_integrity_percent(), 0.01)]%", sm.damage_archived >= sm.emergency_point ? sm.emergency_channel : sm.warning_channel) return FALSE if(sm.damage >= sm.emergency_point) // Taking damage, in emergency - sm.radio.talk_into(sm, "CRYSTAL DELAMINATION IMMINENT Integrity: [sm.get_integrity_percent()]%", sm.emergency_channel) + sm.radio.talk_into(sm, "CRYSTAL DELAMINATION IMMINENT Integrity: [round(sm.get_integrity_percent(), 0.01)]%", sm.emergency_channel) sm.lastwarning = REALTIMEOFDAY - (SUPERMATTER_WARNING_DELAY / 2) // Cut the time to next announcement in half. else // Taking damage, in warning - sm.radio.talk_into(sm, "Danger! Crystal hyperstructure integrity faltering! Integrity: [sm.get_integrity_percent()]%", sm.warning_channel) + sm.radio.talk_into(sm, "Danger! Crystal hyperstructure integrity faltering! Integrity: [round(sm.get_integrity_percent(), 0.01)]%", sm.warning_channel) SEND_SIGNAL(sm, COMSIG_SUPERMATTER_DELAM_ALARM) return TRUE @@ -100,10 +100,10 @@ GLOBAL_LIST_INIT(sm_delam_list, list( sm.add_filter(name = "ray", priority = 1, params = list( type = "rays", - size = clamp(sm.internal_energy / 30, 1, 125), + size = clamp(sm.internal_energy / 50, 1, 100), color = (sm.gas_heat_power_generation > 0.8 ? SUPERMATTER_RED : SUPERMATTER_COLOUR), - factor = clamp(sm.damage/600, 1, 10), - density = clamp(sm.damage/10, 12, 100) + factor = clamp(sm.damage / 10, 1, 10), + density = clamp(sm.damage, 12, 100) )) // Filter animation persists even if the filter itself is changed externally. @@ -116,8 +116,8 @@ GLOBAL_LIST_INIT(sm_delam_list, list( /// [/obj/machinery/power/supermatter_crystal/process_atmos] /datum/sm_delam/proc/lights(obj/machinery/power/supermatter_crystal/sm) sm.set_light( - l_range = 4 + sm.internal_energy/200, - l_power = 1 + sm.internal_energy/1000, + l_range = ROUND_UP(clamp(sm.internal_energy / 500, 4, 10)), + l_power = ROUND_UP(clamp(sm.internal_energy / 1000, 1, 5)), l_color = sm.gas_heat_power_generation > 0.8 ? SUPERMATTER_RED : SUPERMATTER_COLOUR, l_on = !!sm.internal_energy, ) diff --git a/code/modules/power/supermatter/supermatter_delamination/common_delams.dm b/code/modules/power/supermatter/supermatter_delamination/common_delams.dm index 4d8e23cbf3e..f82271171c0 100644 --- a/code/modules/power/supermatter/supermatter_delamination/common_delams.dm +++ b/code/modules/power/supermatter/supermatter_delamination/common_delams.dm @@ -31,13 +31,8 @@ /datum/sm_delam/singularity/filters(obj/machinery/power/supermatter_crystal/sm) ..() - // override the ray from parent call. - sm.add_filter(name = "ray", priority = 1, params=list( - type = "rays", - size = sm.internal_energy ? clamp((sm.damage/100) * sm.internal_energy, 50, 125) : 1, - color = SUPERMATTER_SINGULARITY_RAYS_COLOUR, - factor = clamp(sm.damage / 300, 1, 30), - density = clamp(sm.damage / 5, 12, 200) + sm.modify_filter(name = "ray", new_params = list( + color = SUPERMATTER_SINGULARITY_RAYS_COLOUR )) sm.add_filter(name = "outline", priority = 2, params = list( @@ -63,12 +58,8 @@ return list() /datum/sm_delam/singularity/lights(obj/machinery/power/supermatter_crystal/sm) - sm.set_light( - l_range = 4 + clamp(sm.damage/2, 10, 50), - l_power = 3, - l_color = SUPERMATTER_SINGULARITY_LIGHT_COLOUR, - l_on = !!sm.internal_energy, - ) + ..() + sm.set_light_color(SUPERMATTER_SINGULARITY_LIGHT_COLOUR) /// When we have too much power. /datum/sm_delam/tesla @@ -102,13 +93,8 @@ /datum/sm_delam/tesla/filters(obj/machinery/power/supermatter_crystal/sm) ..() - // override the ray from parent call. - sm.add_filter(name = "ray", priority = 1, params = list( - type = "rays", - size = sm.internal_energy ? clamp((sm.damage/100) * sm.internal_energy, 50, 125) : 1, + sm.modify_filter(name = "ray", new_params = list( color = SUPERMATTER_TESLA_COLOUR, - factor = clamp(sm.damage/300, 1, 30), - density = clamp(sm.damage/5, 12, 200) )) sm.add_filter(name = "icon", priority = 2, params = list( @@ -122,12 +108,8 @@ sm.remove_filter(list("icon")) /datum/sm_delam/tesla/lights(obj/machinery/power/supermatter_crystal/sm) - sm.set_light( - l_range = 4 + clamp(sm.damage * sm.internal_energy, 50, 500), - l_power = 3, - l_color = SUPERMATTER_TESLA_COLOUR, - l_on = !!sm.internal_energy, - ) + ..() + sm.set_light_color(SUPERMATTER_TESLA_COLOUR) /// Default delam. /datum/sm_delam/explosive diff --git a/code/modules/power/supermatter/supermatter_hit_procs.dm b/code/modules/power/supermatter/supermatter_hit_procs.dm index 09f32ed1167..124dcaf9433 100644 --- a/code/modules/power/supermatter/supermatter_hit_procs.dm +++ b/code/modules/power/supermatter/supermatter_hit_procs.dm @@ -23,7 +23,7 @@ external_power_immediate += projectile.damage * bullet_energy + kiss_power log_activation(who = projectile.firer, how = projectile.fired_from) else - external_damage_immediate += projectile.damage * bullet_energy + external_damage_immediate += projectile.damage * bullet_energy * 0.1 // Stop taking damage at emergency point, yell to players at danger point. // This isn't clean and we are repeating [/obj/machinery/power/supermatter_crystal/proc/calculate_damage], sorry for this. var/damage_to_be = damage + external_damage_immediate * clamp((emergency_point - damage) / emergency_point, 0, 1) @@ -94,7 +94,7 @@ user.investigate_log("attached [destabilizing_crystal] to a supermatter crystal.", INVESTIGATE_ENGINE) to_chat(user, span_danger("\The [destabilizing_crystal] snaps onto \the [src].")) set_delam(SM_DELAM_PRIO_IN_GAME, /datum/sm_delam/cascade) - external_damage_immediate += 100 + external_damage_immediate += 10 external_power_trickle += 500 log_activation(who = user, how = destabilizing_crystal) qdel(destabilizing_crystal) diff --git a/tgui/packages/tgui/interfaces/Supermatter.tsx b/tgui/packages/tgui/interfaces/Supermatter.tsx index 4c66b5975c5..5dd1bf8c399 100644 --- a/tgui/packages/tgui/interfaces/Supermatter.tsx +++ b/tgui/packages/tgui/interfaces/Supermatter.tsx @@ -132,16 +132,20 @@ export const SupermatterContent = (props: SupermatterProps, context) => { good: [0.9, Infinity], average: [0.5, 0.9], bad: [-Infinity, 0.5], - }} - /> + }}> + {toFixed(integrity, 2) + ' %'} + } detail={ !!integrity_factors.length && ( {integrity_factors.map(({ name, amount }) => ( - + 0 ? 'green' : 'red'}> - {toFixed(amount, 2)} + {toFixed(amount, 2) + ' %'} ))} @@ -169,7 +173,10 @@ export const SupermatterContent = (props: SupermatterProps, context) => { !!internal_energy_factors.length && ( {internal_energy_factors.map(({ name, amount }) => ( - + 0 ? 'green' : 'red'}> {toFixed(amount, 2) + ' MeV/cm3'}