← Дневник разработки

Скорпион в бинтах

Пришёл скриншот из чужой кампании про пустыню. Подпись под картинкой: «поранений піщаний скорпіон». На картинке — мускулистый мужчина в бинтах и капюшоне, стоит прямо, лицом к зрителю. К нему приделаны клешни и хвост с жалом.

Род — это грамматика

У каждого персонажа есть поле gender. Заведено оно вот зачем:

Russian adjectives agree with the noun’s gender, so “friendly” and “alive” have no single correct rendering without it: дружелюбен / дружелюбна, жив / жива.

Из имени род не вывести, поэтому Мастер объявляет его явно. Поле грамматическое, и в инструкции Мастеру написано ровно это.

А рисовальщик читал то же самое поле как анатомию:

GENDER_WORD = {"m": "man", "f": "woman", "n": "creature"}

Каждый запрос к модели начинался со строки Subject: a hulking and massive man., и уже под ней шло описание скорпиона.

«Скорпион» — мужского рода. Мастер поставил m, и он был прав: иначе поплывут все прилагательные вокруг персонажа. Средний род выглядит выходом — он даёт «creature» вместо «man», — но добраться до него почти нельзя: дракон и волк мужского рода, змея женского. Нет такого значения, при котором и текст выходит правильный, и картинка.

Так что чинить надо было не инструкцию, а модель данных.

Восемь картинок

Проверяли измерением, а не рассуждением: восемь рендеров на настоящем стиле мира и с его настоящим якорем. Описание во всех одно и то же, и в нём ни слова про одежду — только хитин, восемь ног, клешни, хвост.

Контроль — нынешний код, ничего не менялось — вернул мужчину в капюшоне, рясе и поясе. Ни капюшона, ни рясы в описании не было. Они пришли из строки Subject: a … man и из материалов самого мира. То есть описание, написанное Мастером, было ни при чём — виновата оказалась дорога, по которой оно ехало.

Дальше выяснились две вещи, и обе сократили работу. Менять надо ровно одно — существительное. И хватает общего слова: «крупное животное, зверь, не человек», без указания породы. Породу модель и так берёт из описания. Значит, не нужно ни нового переводимого поля, ни дробления кэша картинок по языкам.

Так появилось поле morphology со значениями humanoid и beast. Значение по умолчанию не попадает ни в запрос, ни в ключ картинки, ни в файл-описание рядом с ней — поэтому ни один уже нарисованный портрет не перерисовывается.

Измерение было верное, а вывод — нет

Через несколько часов в игре появился костяной дракон. Помечен beast, поле дошло куда следует, запрос к модели содержал «зверь, не человек» — а на картинке двуногий, с квадратными плечами, в броне, надетой как кираса.

Скорпион ничего не доказал про дракона.

Рамка кадра говорит:

The entire figure from head to feet, standing upright and facing the viewer

У скорпиона нет варианта «встать прямо» — этой инструкции не за что зацепиться. У дракона есть. И в одном запросе одновременно оказались «зверь, не человек» — и четыре указания в другую сторону: встать прямо; ноги и ступни должны быть видны; материалы мира, где перечислены рубахи, фартуки и сапоги; и строчка про то, что это «один из людей этого мира».

Против дракона четверо перевешивают.

Заменили одну строку — на «в собственной стойке и анатомии, как это существо на самом деле стоит и двигается, не в человеческой позе». Двуногий стал четвероногим. Броня никуда не делась, но легла на животное как попона, а не как кираса на грудь: описание её требовало, и требовало законно.

Не описывайте картинке её содержимое

Во второй заход мы наступили на собственные грабли.

В новых правилах кадра было написано: «существо целиком, от края до края, в своём настоящем масштабе». Слизень, которого описание называет огромным, вернулся в кольце крестьян с факелами. Модель попросили показать настоящий масштаб — она добросовестно добавила то, с чем масштаб можно сравнить.

Правило теперь говорит, что существо в кадре одно, и ничего не говорит про его размер.

Обе ошибки одной формы, и это единственный вывод, который стоит унести:

Фраза, описывающая, что должно быть на картинке, — это приглашение что-нибудь дорисовать. Запретили одежду — животных одели в бинты (материалы мира спорили с рамкой, и модель поделила разницу пополам). Попросили масштаб — вокруг животного собрали толпу. Дело рамки — телосложение и кадрирование, остальное не её.

Заодно нашлось

Пока всё это проверяли, выяснилось, что в редакторе миров нельзя сохранить ни одного персонажа из готового мира — вообще ни одно поле. Сервер отвечал ошибкой на любое сохранение.

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

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

Починка — одна строка. Жил этот дефект неизвестно сколько.

Что дальше

Морфология пока умеет ровно два значения: человек и зверь. Крылатых, змеевидных и бесформенных в списке нет намеренно — за каждым значением должна стоять проверенная картинка, а не догадка.

В комиксе звери по-прежнему рисуются людьми: там своя рамка, свои ключи и своя сцена, и это отдельная работа.