Продвинутый режим: колонией командует код
Выкатил режим, в котором я не управляю героем вовсе. Ни WASD, ни клика по дереву: и герой, и колонисты делают ровно то, что им написано программой.
Два режима на выбор
«Новая игра» теперь сначала спрашивает, во что играем. Обычный — всё как было: ходьба на WASD, работа мышью, наряд колонисту через разговор. Продвинутый — тот же мир, те же волки и тот же голод, но людьми командует код.
Режим выбирается один раз, на старте, и живёт в сохранении: загруженная партия всегда идёт в своём режиме, что бы ни стояло в меню.
Язык PYLON
Щелчок по герою или колонисту открывает окно программы: слева редактор с подсветкой и номерами строк, справа справочник команд — клик по строке вставляет её в текст, — снизу журнал. Нажал «Запустить», и человек пошёл работать; окно можно закрыть, программа не прервётся. Само окно таскается за шапку и тянется за уголок.
Язык — урезанный python: отступы вместо скобок, if / while / for, свои функции, числа, строки, списки и клетки. Команды короткие:
- find("tree") — координаты ближайшего дерева или none, если рядом ничего нет;
- go(c) — дойти до клетки;
- mine(c) — рубить или копать, пока ресурс не кончится или мешок не наполнится;
- store() — отнести добычу в ближайший сундук, take("wood", 10) — забрать со склада;
- craft("rope", 2), build_site(c), hunt("hare"), plant(c, "tree"), eat(), wait(5).
Правило про инструмент осталось прежним: работает только то, что в руках. Поэтому программа лесоруба начинается с take_tool("axe") — иначе mine() честно ответит no_tool и напишет об этом в журнал.
Чего мышью больше нельзя
WASD и приказы кликом выключены. Кнопки «Создать» в крафте и «Строить» в стройке не нажимаются — вместо них в подсказке лежит готовая строчка кода, которую остаётся вписать в программу. А вот «Заказать» осталось: разметить место на карте — не то же самое, что скомандовать человеку, и собрать этот призрак программа умеет сама.
Что люди делают без программы
Еду по часам, ночёвку и оборону от волков колонисты держат на себе. Это нужды, а не работа: терять человека из-за строчки, которую ты забыл написать, — так себе урок программирования.
Как это устроено внутри
Программа проходит четыре шага: токены с отступами, дерево операторов, плоский список инструкций и машина, которая его исполняет. Плоский список я взял не ради скорости. «Дойти до дерева» — это секунды игры, и обход дерева пришлось бы держать в стеке вызовов GDScript, а у машины состояние — одно число, номер инструкции, и замереть на нём она может хоть на минуту.
Отсюда два свойства, ради которых всё и затевалось. Игра не виснет: за кадр машина выполняет не больше трёх тысяч инструкций, так что while true: pass просто крутится вхолостую и никому не мешает. Команды идут во времени честно: go, mine, craft возвращают не значение, а действие, которого машина ждёт. Ходьбу эти действия не двигают сами — шаги делает тот же код, что и при обычном управлении, иначе человек под программой шагал бы вдвое быстрее живого.
У каждого действия свой предел в секундах: не уложился — в журнал уходит «слишком долго», и программа идёт дальше. Без этого одно застрявшее go() вешало бы колониста навсегда.
Потрогать режим можно на плейтесте: сборка приходит через лаунчер, сейчас там четвёртая версия билда — уже с продвинутым режимом: onlyplaytest.com/playtests/p-y31ZZb.
Больше всего интересно, что люди напишут первым делом — и на чём язык сломается. Если наткнётесь на команду, которой не хватает, или на ошибку, из которой непонятно, что чинить, напишите в комментариях: это самое полезное, что сейчас можно принести.