TauCetiStation / TauCetiClassic

Франкенштейн жив
GNU Affero General Public License v3.0
144 stars 419 forks source link

Неверно работающие проки атмоса. #1157

Open Dennok opened 7 years ago

Dennok commented 7 years ago

Подробное описание проблемы

Проки /datum/gas_mixture/proc/remove_ratio(ratio) /datum/gas_mixture/proc/remove(amount) неверно расчитывают газ. возможно и каие либо другие проки атмоса.

Что должно было произойти

Расчитывать физически верно.

Что произошло на самом деле

Расчитывает для зоны как для одного турфа.

Как повторить

Использовать прок атмоса.

Дополнительная информация:

/datum/gas_mixture/proc/remove_ratio(ratio)  //предположим мы хотим удалить весь воздух в зоне ratio =1
    //Purpose: Removes a certain ratio of the air.
    //Called by: ?
    //Inputs: Percentage to remove.
    //Outputs: Removed air.

    if(ratio <= 0)
        return null

    ratio = min(ratio, 1)

    var/datum/gas_mixture/removed = new //создаем "кусок" воздуха

    removed.oxygen = QUANTIZE(oxygen*ratio) //вроде правильно мы забираем % от текущего кол-ва молей, вот только это правильно только для турфа. Для зоны аирмикс хранит кол-во молей для турфа и кол-во турфов.
    removed.nitrogen = QUANTIZE(nitrogen*ratio)
    removed.carbon_dioxide = QUANTIZE(carbon_dioxide*ratio)
    removed.phoron = QUANTIZE(phoron*ratio)

    oxygen -= removed.oxygen/group_multiplier //Тут мы уже правильно отнимаем от ВСЕЙ зоны, тоесть щитай от каждого турфа кол-во молей что приходит на его долю.
    nitrogen -= removed.nitrogen/group_multiplier
    carbon_dioxide -= removed.carbon_dioxide/group_multiplier
    phoron -= removed.phoron/group_multiplier

    if(trace_gases.len)
        for(var/datum/gas/trace_gas in trace_gases)
            var/datum/gas/corresponding = new trace_gas.type()
            removed.trace_gases += corresponding

            corresponding.moles = trace_gas.moles*ratio
            trace_gas.moles -= corresponding.moles/group_multiplier

    removed.temperature = temperature
    update_values()
    removed.update_values()

    return removed

В итоге, remove_ratio(1) от ЛЮБОЙ зоны отнимет только моли одного турфа. что не есть верно. многие машины, и сам атмос изза этого работает медленнее чем надо.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/41985393-?utm_campaign=plugin&utm_content=tracker%2F34704297&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F34704297&utm_medium=issues&utm_source=github).
ZVee commented 7 years ago

Я тут задумался таки, а надо ли это вообще? Где может быть потребность опустошить целиком всю зону или не всю, но огромный процент? Если и есть такая необходимость, то это можно и сейчас проделать написав прок специально под этот случай. Машинам это не нужно, поведение атмоса вроде как удовлетворительно - дыра в полу/разбитая стенка в космос - опустошают помещение за считанные секунды.

Dennok commented 7 years ago

Проблема не в опустошении всей зоны. проблема в опустошении % от зоны. Чем больше зона тем меньше % и он идет по экспоненте. От 1го турфа мы сможем забрать за 1 процес 100%, От зоны в два турфа уже только 50%, от зоны в 3 турфа 1/3, ... 1/4 ...1/5, от десяти турфовой зоны(большинство на станции примерно такие или больше) уже только 10% вместо 100%, Проблема в падении эффективности прока с ростом зоны, хотя для этого прока ее быть не должно.

ZVee commented 7 years ago

Потер всю тут "горячую" дискуссию и подведу итоги:

Я согласен с тем что это баг, но иногда в редких случаях, баги работают логичнее, становятся фичами и их не фиксят.

У нас как раз такой случай, будет неправильно, если вне зависимости от размера зоны, мы будем убирать газ с одинаковой скоростью, будь то комната 2х2 или сложный коридор с поворотами и общей длинной в 50+ турфов, но посмотрим.

С точки зрения наполнения комнаты - это тоже выглядит неправильно, вот есть у нас бочка на 3к форона, открыли мы ее - без учета турфов - у нас во всей зоне станет 3к газа (если глядеть со стороны турфов - то над каждым турфом у нас 3к газа) или все таки эти 3к газа должны быть разделены на кол.во турфов в зоне? - Но, на деле - это 3к газа что турфами, что зоной. Можно конечно в первом случае помножить 3к на кол.во турфов и офигеть - но это неверно будет). Однако в первом случае есть один косяк - без учета турфов в зоне - 3к газа просто начнут убивать всех мобов - поэтому таки даже в этом случае - нам надо знать кол.во газа на турф.

Dennok commented 7 years ago

Заполнение зон в порядке, так как там идет работа в основном через мердж, и в этом проке все правильно прописано. Тут скорее проблемы с работой с машинами. Например в помпе при расчете молей для доведения зоны до требуемого давления нет учета груп мулттиплиера и в итоге 1 процес доводит до требуемого давления только 1н турф(вместо всей зоны). Еслиже починить эту формулу так чтоб расчет молей для заполнения, то венты действително станут быстрее. С одной стороны это ребаланс, а с другой стороны, венты которые закончили свою работу не будут грузить сервер.

Хотя вероятно нагрузка на сервер от вент ликвидирована автоматическим отключением их при аираларме в зоне.

Dennok commented 7 years ago

Тутже всплывает другая проблема. отсутствие параметра пропускной способности, изза чего и выходит моментальное заполнение или опустошение зоны.

ZVee commented 7 years ago

Ну я посмотрю атмос в любом случае и наш и беевский, возможно даже поправлю это дело (чуть попозже).

По поводу нагрузки - ее как таковой от газов и нет, основная нагрузка у атмоса - это от разгермы, а именно - от сдувания атомов - потому что мы просматривает весь контент зоны, делаем проверку на то - можем ли мы этот атом сдуть, и если да - заставляем его двигаться. Такая же проблема нагрузки и от мобов с И.И. который тоже заставляет мобов куда-то двигаться, у бъенда проки движения для И.И. уж очень неприятную нагрузку дают, помню на маринах вводил фичу для мордопрыгов - чтобы они сами бежали и прыгали на всех хуманов что увидят, и когда этих мордопрыгов становилось под 60-70 - нагрузка уже была знатная в момент, когда эти парни одновременно начинали бежать.

Так что в плане нагрузки от газов - все в принципе хорошо.

то венты действително станут быстрее

Я хотел линду/тг атмос упомянуть (не знаю как сейчас, может они ускорили) - вот это действительно называется медленно, а у нас - скорость вполне годная, а зная твою манию к инженерии - предположу что это просто тебе очень хочется в секунду заполнять/высасывать газы из комнат :).

Dennok commented 7 years ago

Еще одно, механ венты реализован так что сперва газ и пайплайна идет в венту. у которйо емкость 200, а дальше уже идет в зону. тоесть при изменении формулы расчета передаваемых молей. все будет невилировано тем что помпа не может отдать газ из трубы, а только из себя. Тожесамое и при выкачивании.

Dennok commented 7 years ago

Про газ в трубах я говорил про это https://github.com/TauCetiStation/TauCetiClassic/blob/master/code/ATMOSPHERICS/datum_pipeline.dm#L35

stale[bot] commented 5 years ago

Этот ишью пробыл открытым более полугода. Пожалуйста, сообщите, является ли он актуальным для текущей версии билда?

RichardJones1 commented 5 years ago

Вообще... Играя, я принял это как что-то само разумеющееся, даже не предполагая, что это может быть багом... Что думаешь, @ZVee , закапывать будем?