[TM FIRST] Рассказчики#5777
Conversation
|
Арты очень крутые. |
|
ну и почти 15к строк кода. Аниме-псих. И удивлен что кроме меня никто ничего не отписал =(. Хотя идея очень крутая. |
| return . | ||
|
|
||
|
|
||
| /proc/is_safe_area(area/to_check) |
There was a problem hiding this comment.
Время нанести первый удар по 15к строкам кода и первая стрела называется "ЗАНУДСТВО".
Я бы в целом посоветовал некоторую часть файлов переименовал, как например у тебя в этом файле по сути helper'sы для сторителлеров, но функции теоретически можно применять и в других местах. Если не забуду то укажу и остальные такие файлы.
А второе, это названия функций и отсутствие документации к ним. Интуитивно не смотря в код трудно понять зачем оно и как определяется безопасность комнаты.
There was a problem hiding this comment.
Забыл указать. Забыл какие нужно. Альцг.......
| for(var/obj/machinery/atmospherics/components/unary/vent_pump/vent in vents) | ||
| var/turf/open/T = get_turf(vent) | ||
| var/datum/gas_mixture/floor_gas_mixture = T.air | ||
| if(!floor_gas_mixture) | ||
| unsafe_vents += 1 | ||
| continue |
There was a problem hiding this comment.
Лучше проверяй через var/turf/T, потому что венты могут быть в стенах и насколько я понял здесь они считаются как безопасные. Мб проверять тип турфа (closed или тп) и потом уже газы
| if((floor_gas_mixture.temperature <= 270) || (floor_gas_mixture.temperature >= 360)) | ||
| unsafe_vents += 1 | ||
| continue | ||
|
|
||
| var/pressure = floor_gas_mixture.return_pressure() | ||
| if((pressure <= 20) || (pressure >= 550)) | ||
| unsafe_vents += 1 | ||
| continue |
There was a problem hiding this comment.
270, 360 температуру и 20, 550 замени на дефайны BODYTEMP_COLD_DAMAGE_LIMIT, BODYTEMP_HEAT_DAMAGE_LIMIT и HAZARD_LOW_PRESSURE, HAZARD_HIGH_PRESSURE (atmos_mob_interaction.dm в помощь)
| if(!(total_vents == 1 && unsafe_vents == 0)) | ||
| return !(unsafe_vents > round(total_vents * 0.5)) |
There was a problem hiding this comment.
Возможно я не понимаю тонкости 100 строки, но не проще было бы вписать false?
| return !(unsafe_vents > round(total_vents * 0.5)) | ||
| return TRUE | ||
|
|
||
| /proc/pick_weight_f(list/list_to_pick) |
There was a problem hiding this comment.
Документация. Буквально. Функция pick_weight_f вычисляет CUM предметов 😄
| @@ -0,0 +1,413 @@ | |||
| ADMIN_VERB(storyteller_vote, R_ADMIN | R_DEBUG, "Storyteller - Start Vote", "Start a global storyteller vote.", ADMIN_CATEGORY_STORYTELLER) | |||
There was a problem hiding this comment.
Тут еще заметил, что в файле сначала идут педальные вербы, потом ассеты, после навыки и сразу подсистемы. Не помешали бы комменты где что начинается
| vote_start_time = 0 // Reset vote start time | ||
| deltimer(vote_timer_id) | ||
| var/list/tallies = list() | ||
| var/list/diff_tallies = list() |
There was a problem hiding this comment.
Тут докопаюсь, без этого никак, надо повторять за другими. diff_tallies изначально трудно интерпретировать как сложность, скорее в голову придёт difference или что-то такое
| if(!length(best_storytellers)) | ||
| to_chat(world, span_boldnotice("No votes were cast! Random storyteller selected.")) | ||
| selected_id = pick(list(storyteller_data)) | ||
| selected_difficulty = 1.0 |
There was a problem hiding this comment.
Локальный selected_difficulty затерялся в return'е. Возможно ты куда-то забыл его передать
| if(length(best_storytellers) == 1) | ||
| selected_id_str = best_storytellers[1] | ||
| else | ||
| selected_id_str = pick(best_storytellers) | ||
| to_chat(world, span_announce("Tie broken randomly!")) |
There was a problem hiding this comment.
Можно сократить до
selected_id_str = pick(best_storytellers)
if(length(best_storytellers) > 1) to_chat(блаблабла)
| /proc/get_avg(list/nums) | ||
| if (!length(nums)) | ||
| return 1.0 | ||
| var/sum = 0 | ||
| for (var/n in nums) | ||
| sum += n | ||
| return sum / length(nums) |
There was a problem hiding this comment.
Как будто бы этому место где-то в дефайнах/хелперах. При чём для огромной части старого кода, почему этой функции раньше не существовало лол
|
Могеоко сосал |

About The Pull Request
Work in Progress
Этот ПР представляет комплексную систему Storyteller , непосредственно вдохновленную механикой адаптивного повествования RimWorld. Созданная с нуля, она динамически анализирует состояние станции в режиме реального времени, балансирует динамику отношений между экипажем и антагонистами и организует связное повествование с помощью интеллектуально спланированных целей и событий.
В отличие от статических систем событий, эта настройка создает адаптивные, специфичные для раунда истории:
Ключевые компоненты системы (подробно описаны ниже):
Этот PR реализует пять уникальных рассказчиков (с возможностью расширения), каждый с отличными настроениями, личностями и конфигурациями для различных стилей игры. Полная настраиваемость через настройки сервера; портреты/логотипы для погружения в атмосферу; голосование перед раундом и административные переопределения во время раунда.
Implemented Storytellers
Mia'Chill
Молодая исследовательница тешари, блуждающая по звездам в поисках новых миров. Ее спокойный и общительный характер привносит порядок и равновесие в окружающий хаос.
Cas'Classic
Кэс - писатель-лиса, обожающий сбалансированные, полные приключений рассказы, в которых большая опасность всегда приводит к открытиям и росту.
Randall's Gambit
Рэндалл - азартный игрок, который доверяет все случаю. Забудьте о покое - он отправит ящики пива сразу после падения метеорита, если такова будет воля судьбы.
Edd Catastrophe
Эдд Катастрофа родом из пустоты, где милосердие и сострадание не имеют значения. Его существование определяется разрушением и геноцидом - он не оставит от станции ничего.
Mia & Edd'Challenge
Настоящий парадокс - существо, закаленное в разрушении, встречает того, кто олицетворяет мир. Вместе они создают гармонию на грани катастрофы.
ЮИ:
Основные механизмы: как работают рассказчики
Адаптация в зависимости от настроения: настроение каждого рассказчика (темп: скорость событий; агрессивность: интенсивность угрозы; изменчивость: непредсказуемость) развивается на основе моментальных снимков станции, влияя на выбор цели.
Динамический баланс:
Хранилище и моментальные снимки: Все метрики хранятся в хранилище (ассоциативный список); снимки фиксируют состояния для принятия решений планировщиком.
Пороги: здоровье/раненые/болезни/смерти классифицируются (например,
HEALTH_LOW_THRESHOLD,DEAD_RATIO_HIGH_THRESHOLD) для точных реакций.Анализ станции (анализатор)
Асинхронный сбор метрик (обновляется через
SSstorytellers):Планирование сюжета («Мышление»)
Модульный цикл (
storyteller_think.dm):Предотвращение спама: штрафы за повторение; льготные периоды; ограничения на недавний урон.
Дополнительные функции
Почему это хорошо для игры
NovaSector Ready: беспроблемная интеграция; настраиваемые переключатели.
Доказательство тестирования
Скриншоты/видео
Журнал изменений