Скорпион в бинтах
Пришёл скриншот из чужой кампании про пустыню. Подпись под картинкой: «поранений піщаний скорпіон». На картинке — мускулистый мужчина в бинтах и капюшоне, стоит прямо, лицом к зрителю. К нему приделаны клешни и хвост с жалом.
Род — это грамматика
У каждого персонажа есть поле 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.
Тесты этого не видели по неприятной причине. Каждый из них сначала создаёт себе персонажа — тем же самым запросом. То есть готовит данные тем способом, который работает, и сломаться правильным способом уже не может. Новая проверка поэтому берёт запись из готового мира, а не создаёт свою.
Починка — одна строка. Жил этот дефект неизвестно сколько.
Что дальше
Морфология пока умеет ровно два значения: человек и зверь. Крылатых, змеевидных и бесформенных в списке нет намеренно — за каждым значением должна стоять проверенная картинка, а не догадка.
В комиксе звери по-прежнему рисуются людьми: там своя рамка, свои ключи и своя сцена, и это отдельная работа.