#pragma once // ----------------------------------------------------------------------------- // Единственное место, где строковый id движка превращается в вид игры. // // Движок (и редактор вместе с ним) знает про сущности только то, что написано // в assets/catalog/entities.txt: id, цвет, радиус, спрайт. Что такое SHAMBLER // и чем он бьёт — знание игры, и оно живёт в sim/target.cpp. Таблица ниже // связывает одно с другим, и других таких таблиц в проекте быть не должно: // как только их станет две, они разойдутся. // // Новая тварь — это строка в каталоге, запись в EnemyDefOf и строка здесь. // Ни редактор, ни формат комнат при этом не меняются вообще. // ----------------------------------------------------------------------------- #include #include #include "ecs/ecs.h" #include "engine/level_gen.h" #include "sim/items.h" #include "sim/target.h" #include "engine/tilemap.h" // false — такого id в игре нет. Это не авария: комната могла ссылаться на // сущность, которую из игры убрали, и уровень обязан собраться без неё. bool EnemyKindOfId(const std::string& id, EnemyKind& out); bool ItemIdOfId(const std::string& id, ItemId& out); // Обратный перевод — для отчётов, dev-вывода и записи профиля. const char* IdOfEnemyKind(EnemyKind kind); // "-" для ItemId::NONE и для предмета, которого нет в каталоге: пустая ячейка // в файле профиля обязана быть видимой, а не отсутствующей. const char* IdOfItem(ItemId item); // Выкатить в мир то, что нагенерил движок. Возвращает, сколько сущностей // реально встало; unknown (если передан) — сколько id не опознано. int SpawnFromLevel(ecs::World& world, const std::vector& list, const Tilemap& map, int* unknown = nullptr); // То же для лежащих предметов. int SpawnLootFromLevel(ecs::World& world, const std::vector& list, int* unknown = nullptr);