|
•Вторая ревизия, исправленная и додуманная - Artlav, 08.02.2011 11:50:07 |
|
|
Более готовый вариант, с примерным описанием решения задач. Просьба думать и комментировать.
Предпосылки: -Юниты на сетке, связность заранее не известна -Поиск связности идёт рекурсивно по карте присутствия (unu) -Обрабатывается по одному ресурсу за раз без приоритетов -Обработка возможно как по временной схеме, без изменеий (для запросов), так и по постоянной -Потребляющий юнит не может быть невыключаемым -Производящий юнит может быть невыключаемым -У юнита есть единое состояние включенности, при котором он потребляет и производит -Хранение и долги юнит даёт всегда, отказаться нельзя -Проводимость у юнита постоянная
Шахта: -Производство фиксируется при создании и перерассчитывается при распределении -Производство не может превышать 16 единиц в сумме добываемых материалов
События игры: -Создан юнит --=Выключенный или постоянно производящий. --=Может изменить связность, но не влияет на распределение --=Ничего менять не надо
-Убран юнит --=Взорван, потеряна связность. Нужно обновить от всех, кто рядом с ним --=Вырублен, не потеряна связность. Нужно обновить от него
-Запущен юнит --=Запросить возможность включения, запрос идёт по временной схеме --=В случае успеха повторить на основной схеме или скопировать в неё --=В случае неуспеха не запускать
-Остановлен юнит --=Запросить возможность остановки, по временной схеме --=В случае успеха повторить на основной схеме или скопировать в неё --=В случае неуспеха не останавливать
-Изменено потребление/производство юнита --=Запросить разницу как запрос добавления/остановки, по временной схеме. Один ресурс за событие --=В случае успеха повторить на основной схеме или скопировать в неё
-Заменён юнит (удалён-создан без изменения связности, например здание построено на коннекторе) --=Ресурсы не задействованны, удалить и создать без запросов к распределителю
-Передача материалов ---Проверить на связность, если да - то передать долг вместе с материалом, если нет, то следующий такт. --=Если долг превышает остаток+производство, то сделать долг равным производству и обновить, иначе ничего не делать
Обновление: -Возможные конечные ситуации: --=Всё ОК --=Долги остались, потребитель пропал --=Потребление осталось, долги пропали -Решение: --=Обойти всё, суммировать потребление и суммировать долги --=Вычесть из долгов потребление, остаток долга освободить или избыток добавить
Рекурсивность: -При запуске может понадобиться запустить производителя, приводя к рекурсивному запросу -Временная схема одна. -Как делать?
Раздельность: -Если обновлять ресурсы по отдельность, то как гарантировать то, что обновление одного не угробит обновление другого? -Рекурсивность по разным ресурсам?
Конец хода: -Требования: --=Нужно удовлетворить потребности --=Нужно остановить тех, кто не получил по потребностям --=Нужно положить избыток в хранилища (возможно, что произведено больше, чем влезет, но будет потрачено и влезет) --=Нужно обновить потребления у производителей --=Всё должно быть целостным -Решения: --=Предположить, что всё обновлено, либо вызвать обновление? --=Произвести всё, положить в хранилища не учитывая ограничения --=Вычесть все долги, из хранилищ. Производство учитывается переполнением хранилищ --=Отсечь избыток из хранилищ, распределив его по остальным и выбросив невлазящее (запрос на немедленную клажу в себя, что не влезло - удалить) --=Пересчитать потребление - продвинуть строительство, и т.п. --=Обновить
Данные: -Для каждого ресурса хранится рабочая и рассчётная структура: --=num Суммарное число --=use Потребить в этом ходу --=now Имеется на борту --=pro Произвести за этот ход --=dbt Долг за этот ход, необходим чтобы определить, а можем ли мы включить что-то
Функции: -Обновить -Конец хода -Передача
-Добавить ресурс немедленно, рекурсивно, не меняет балансировку --=Обойти всех, кладя по мере нахождения пустот, выйти при иссякании запроса, или вернуть недоложенное как результат
-Запрос наличия: --наличия ресурса (сумма хранения) --наличия свободного места (сумма пустоты) --наличия свободного долга (сумма производства и хранения) --наличия свободного ресурса (хранение минус max(0,(долг минус производство))) --=Обойти всех, суммируя требуемое, и вернуть сумму как результат
-Запрос на добавление долга --=Обойти всех по временной схеме, добавляя долг --=Если не хватате, то откатить и начать поиск объекта для запуска, запустить его, и вернуться в начала --=Если хватило, то перенести временное в постоянное, иначе вернуть отказ --=Что если хватило одного ресурса, но не второго? Электры останутся запущенными, и всё?
-Запуск юнита: --=Проверить необходимость потребления, если нет, то всё --=Если есть потребление, то по отдельности на каждый ресурс запросить долг по временной схеме (кто её инициализирует?) --=Если хватило, то запросить долг по основной
-Остановка юнита: --=Если нет производства, то освободить потребление и всё --=Если есть производство, то по временной схеме запросить эквивалентное число долгов (исключая себя) --=Если хватило, то выключится и запросить по основной схеме, освободить потребление, и готово
В диалоге передачи делать функцию отображения только незаблокированных ресурсов? т.е., есть полный склад и завод, съедающий 9 материалов. Показывать, что можно передать безопасные 41 или все 50?
|
|
| |