Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bugfix: This Space FFFire #1898

Merged
merged 2 commits into from
Feb 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions maps/sierra/sierra.dm
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@
#include "../../mods/screentips/_screentips.dme"
#include "../../mods/tajara/_tajara.dme"
#include "../../mods/sauna_props/_sauna_props.dme"
#include "../../mods/wyccbay_optimization/_wyccbay_optimization.dme"

// UNUSED MODS
// Keep them in ascending alphabetical order too, please
Expand Down
83 changes: 83 additions & 0 deletions mods/wyccbay_optimization/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@

#### Список PRов:

- https://github.com/SierraBay/SierraBay12/pull/1898
<!--
Ссылки на PRы, связанные с модом:
- Создание
- Большие изменения
-->

<!-- Название мода. Не важно на русском или на английском. -->
## Мод-пример

ID мода: WYCCBAY_OPTIMIZATION
<!--
Название модпака прописными буквами, СОЕДИНЁННЫМИ_ПОДЧЁРКИВАНИЕМ,
которое ты будешь использовать для обозначения файлов.
-->

### Описание мода

Мод по большей части овверрайдит коркод, так что отключив его мы просто вернемся к рабочей на оффах системе.
В данный момент тут реализованы подобные фиксы:
- Оптимизация обновления внешнего вида тюрфов от газа на них, если на тюрфе мало молей газа
<!--
Что он делает, что добавляет: что, куда, зачем и почему - всё здесь.
А также любая полезная информация.
-->

### Изменения *кор кода*

- "Отсутствуют"
<!--
Если вы редактировали какие-либо процедуры или переменные в кор коде,
они должны быть указаны здесь.
Нужно указать и файл, и процедуры/переменные.

Изменений нет - напиши "Отсутствуют"
-->

### Оверрайды

- `mods\wyccbay_optimization\code\xgm\xgm_gas_data.dm`: `proc/generateGasData`
- `mods\wyccbay_optimization\code\xgm\xgm_gas_mixture.dm`: `proc/merge`, `proc/check_tile_graphic`
- `mods\wyccbay_optimization\code\ZAS\Turf.dm`: `proc/update_graphic`
- `mods\wyccbay_optimization\code\ZAS\Zone.dm`: `proc/add`, `proc/remove`, `proc/c_invalidate`, `proc/c_merge`, `proc/rebuild`, `proc/add_tile_air`, `proc/tick`
<!--
Если ты добавлял новый модульный оверрайд, его нужно указать здесь.
Здесь указываются оверрайды в твоём моде и папке `_master_files`

Изменений нет - напиши "Отсутствуют"
-->

### Дефайны

- "Отсутствуют"
<!--
Если требовалось добавить какие-либо дефайны, укажи файлы,
в которые ты их добавил, а также перечисли имена.
И то же самое, если ты используешь дефайны, определённые другим модом.

Не используешь - напиши "Отсутствуют"
-->

### Используемые файлы, не содержащиеся в модпаке

- "Отсутствуют"
<!--
Будь то немодульный файл или модульный файл, который не содержится в папке,
принадлежащей этому конкретному моду, он должен быть упомянут здесь.
Хорошими примерами являются иконки или звуки, которые используются одновременно
несколькими модулями, или что-либо подобное.
-->

### Авторы:

KandJX
Gaxer
<!--
Здесь находится твой никнейм
Если работал совместно - никнеймы тех, кто помогал.
В случае порта чего-либо должна быть ссылка на источник.
-->
4 changes: 4 additions & 0 deletions mods/wyccbay_optimization/_wyccbay_optimization.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/singleton/modpack/wyccbay_optimization
name = "Порт Оптимизации с WyccBay'я"
desc = "Мод по большей части овверрайдит коркод, так что отключив его мы просто вернемся к рабочей на оффах системе."
author = "KandJX(портировал), Gaxer(автор)"
12 changes: 12 additions & 0 deletions mods/wyccbay_optimization/_wyccbay_optimization.dme
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef MODPACK_WYCCBAY_OPTIMIZATION
#define MODPACK_WYCCBAY_OPTIMIZATION

#include "_wyccbay_optimization.dm"

#include "code/xgm/xgm_gas_data.dm"
#include "code/xgm/xgm_gas_mixture.dm"

#include "code/ZAS/Turf.dm"
#include "code/ZAS/Zone.dm"

#endif
8 changes: 8 additions & 0 deletions mods/wyccbay_optimization/code/ZAS/Turf.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
//OVERRIDE

/turf/simulated/update_graphic(list/graphic_add = null, list/graphic_remove = null)
if(length(graphic_add))
vis_contents += graphic_add

if(length(graphic_remove))
vis_contents -= graphic_remove
90 changes: 90 additions & 0 deletions mods/wyccbay_optimization/code/ZAS/Zone.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
//OVERRIDE

/zone/add(turf/simulated/turf_to_add)
#ifdef ZASDBG
ASSERT(!invalid)
ASSERT(istype(turf_to_add))
ASSERT(!SSair.has_valid_zone(turf_to_add))
#endif

var/datum/gas_mixture/turf_air = turf_to_add.return_air()
add_tile_air(turf_air)
turf_to_add.zone = src
contents += turf_to_add

if(turf_to_add.hotspot)
fire_tiles += turf_to_add
SSair.active_fire_zones |= src

turf_to_add.update_graphic(air.graphic)

/zone/remove(turf/simulated/turf_to_remove)
#ifdef ZASDBG
ASSERT(!invalid)
ASSERT(istype(turf_to_remove))
ASSERT(turf_to_remove.zone == src)
soft_assert(turf_to_remove in contents, "Lists are weird broseph")
#endif
contents -= turf_to_remove
fire_tiles -= turf_to_remove
turf_to_remove.zone = null
turf_to_remove.update_graphic(graphic_remove = air.graphic)
if(length(contents))
air.group_multiplier = length(contents)
else
c_invalidate()

/zone/c_merge(zone/into)
#ifdef ZASDBG
ASSERT(!invalid)
ASSERT(istype(into))
ASSERT(into != src)
ASSERT(!into.invalid)
#endif
c_invalidate()
for(var/turf/simulated/inner_turf in contents)
into.add(inner_turf)
inner_turf.update_graphic(graphic_remove = air.graphic)
#ifdef ZASDBG
inner_turf.dbg(merged)
#endif

//rebuild the old zone's edges so that they will be possessed by the new zone
for(var/connection_edge/edge in edges)
if(edge.contains_zone(into))
continue //don't need to rebuild this edge

for(var/turf/connecting_turf in edge.connecting_turfs)
SSair.mark_for_update(connecting_turf)

/zone/c_invalidate()
invalid = TRUE
SSair.remove_zone(src)
#ifdef ZASDBG
for(var/turf/simulated/inner_turf in contents)
inner_turf.dbg(invalid_zone)
#endif

/zone/rebuild()
if(invalid) return //Short circuit for explosions where rebuild is called many times over.
c_invalidate()
for(var/turf/simulated/inner_turf in contents)
inner_turf.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt
inner_turf.needs_air_update = FALSE //Reset the marker so that it will be added to the list.
SSair.mark_for_update(inner_turf)

/zone/add_tile_air(datum/gas_mixture/tile_air)
//air.volume += CELL_VOLUME
air.group_multiplier = 1
air.multiply(length(contents))
air.merge(tile_air)
air.divide(length(contents) + 1)
air.group_multiplier = length(contents) + 1

/zone/tick()

// Update fires.
if(air.temperature >= PHORON_FLASHPOINT && !(src in SSair.active_fire_zones) && air.check_combustability() && length(contents))
var/turf/turf_to_ignite = pick(contents)
if(istype(turf_to_ignite))
turf_to_ignite.create_fire(vsc.fire_firelevel_multiplier)
31 changes: 31 additions & 0 deletions mods/wyccbay_optimization/code/xgm/xgm_gas_data.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//OVERRIDE
/hook/startup/generateGasData()
gas_data = new
for(var/p in (subtypesof(/singleton/xgm_gas)))
var/singleton/xgm_gas/gas = new p //avoid initial() because of potential New() actions

if(gas.id in gas_data.gases)
error("Duplicate gas id `[gas.id]` in `[p]`")

gas_data.gases += gas.id
gas_data.name[gas.id] = gas.name
gas_data.specific_heat[gas.id] = gas.specific_heat
gas_data.molar_mass[gas.id] = gas.molar_mass
if(gas.overlay_limit)
gas_data.overlay_limit[gas.id] = gas.overlay_limit
gas_data.tile_overlay[gas.id] = gas.tile_overlay
gas_data.tile_overlay_color[gas.id] = gas.tile_color
gas_data.flags[gas.id] = gas.flags
gas_data.burn_product[gas.id] = gas.burn_product

gas_data.symbol_html[gas.id] = gas.symbol_html
gas_data.symbol[gas.id] = gas.symbol

if(!isnull(gas.condensation_product) && !isnull(gas.condensation_point))
gas_data.condensation_points[gas.id] = gas.condensation_point
gas_data.condensation_products[gas.id] = gas.condensation_product

gas_data.breathed_product[gas.id] = gas.breathed_product
gas_data.hidden_from_codex[gas.id] = gas.hidden_from_codex

return 1
93 changes: 93 additions & 0 deletions mods/wyccbay_optimization/code/xgm/xgm_gas_mixture.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
//OVERRIDE

//Merges all the gas from another mixture into this one. Respects group_multipliers and adjusts temperature correctly.
//Does not modify giver in any way.
/datum/gas_mixture/merge(datum/gas_mixture/giver)
if(!giver)
return

if(abs(temperature-giver.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/self_heat_capacity = heat_capacity()
var/giver_heat_capacity = giver.heat_capacity()
var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity
if(combined_heat_capacity != 0)
temperature = (giver.temperature * giver_heat_capacity + temperature*self_heat_capacity) / combined_heat_capacity

if((group_multiplier != 1)||(giver.group_multiplier != 1))
for(var/g in giver.gas)
gas[g] += giver.gas[g] * giver.group_multiplier / group_multiplier
else
for(var/g in giver.gas)
gas[g] += giver.gas[g]

update_values()

//Rechecks the gas_mixture and adjusts the graphic list if needed.
//Two lists can be passed by reference if you need know specifically which graphics were added and removed.
/datum/gas_mixture/check_tile_graphic(list/graphic_add = null, list/graphic_remove = null)
for(var/obj/gas_overlay/gas_overlay in graphic)
if(istype(gas_overlay, /obj/gas_overlay/heat))
continue

if(istype(gas_overlay, /obj/gas_overlay/cold))
continue

if(gas[gas_overlay.gas_id] <= gas_data.overlay_limit[gas_overlay.gas_id])
LAZYADD(graphic_remove, gas_overlay)

var/should_generate_temp_overlay = FALSE
for(var/gas_id in gas_data.overlay_limit)
//Overlay isn't applied for this gas, check if it's valid and needs to be added.
if(gas[gas_id] > gas_data.overlay_limit[gas_id])
should_generate_temp_overlay = TRUE
var/tile_overlay = get_tile_overlay(gas_id)
if(!(tile_overlay in graphic))
LAZYADD(graphic_add, tile_overlay)
. = FALSE

if(should_generate_temp_overlay)
var/heat_overlay = get_tile_overlay(GAS_HEAT)
//If it's hot add something
if(temperature >= CARBON_LIFEFORM_FIRE_RESISTANCE)
if(!(heat_overlay in graphic))
LAZYADD(graphic_add, heat_overlay)
else if (heat_overlay in graphic)
LAZYADD(graphic_remove, heat_overlay)

var/cold_overlay = get_tile_overlay(GAS_COLD)
if(temperature <= FOGGING_TEMPERATURE && (return_pressure() >= (ONE_ATMOSPHERE / 4)))
if(!(cold_overlay in graphic))
LAZYADD(graphic_add, cold_overlay)
else if (cold_overlay in graphic)
LAZYADD(graphic_remove, cold_overlay)

//Apply changes
if(graphic_add && length(graphic_add))
graphic |= graphic_add
. = TRUE

if(graphic_remove && length(graphic_remove))
graphic -= graphic_remove
. = TRUE

if(!length(graphic))
return .

var/pressure_mod = clamp(return_pressure() / ONE_ATMOSPHERE, 0, 2)
for(var/obj/gas_overlay/overlay in graphic)
if(istype(overlay, /obj/gas_overlay/heat)) //Heat based
var/new_alpha = clamp(max(125, 255 * ((temperature - CARBON_LIFEFORM_FIRE_RESISTANCE) / CARBON_LIFEFORM_FIRE_RESISTANCE * 4)), 125, 255)
if(new_alpha != overlay.alpha)
overlay.update_alpha_animation(new_alpha)
continue

if(istype(overlay, /obj/gas_overlay/cold))
var/new_alpha = clamp(max(125, 200 * (1 - ((temperature - MAX_FOG_TEMPERATURE) / (FOGGING_TEMPERATURE - MAX_FOG_TEMPERATURE)))), 125, 200)
if(new_alpha != overlay.alpha)
overlay.update_alpha_animation(new_alpha)
continue

var/concentration_mod = clamp(gas[overlay.gas_id] / total_moles, 0.1, 1)
var/new_alpha = min(230, round(pressure_mod * concentration_mod * 180, 5))
if(new_alpha != overlay.alpha)
overlay.update_alpha_animation(new_alpha)