view Engine/mm7text_ru.cpp @ 2541:a902abdfc7f2

1. Renamed class Game to class Engine. 2. Separated game logic as state of FSM from game logic as engine. 3. Found out that many UI screen initializers were optimized away, intially they all returned newly created window as separate object like it is done in CharacterUI_Initialize.
author a.parshin
date Sun, 10 May 2015 01:29:11 +0200
parents 68cdef6879a0
children
line wrap: on
line source

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#include "Engine/Engine.h"


struct GenderTableEntry
{
  const char *name;
  int         gender;
} gender_table_caps[] =
{
  {"Авель", 0},
  {"Адам", 0},
  {"Адриан", 0},
  {"Адрианис", 0},
  {"Адская", 1},
  {"Айр", 0},
  {"Акио", 0},
  {"Акира", 0},
  {"Алан", 0},
  {"Алейн", 0},
  {"Алек", 0},
  {"Александр", 0},
  {"Алексис", 1},
  {"Ален", 0},
  {"Алехандро", 0},
  {"Алиса", 1},
  {"Альберт", 0},
  {"Альтон", 0},
  {"Альтред", 0},
  {"Альфред", 0},
  {"Аманда", 1},
  {"Амбер", 1},
  {"Амброзий", 0},
  {"Амелия", 1},
  {"Амос", 0},
  {"Ангел", 0},
  {"Андреа", 1},
  {"Андрей", 0},
  {"Анжела", 1},
  {"Анита", 1},
  {"Анна", 1},
  {"Антон", 0},
  {"Антоний", 0},
  {"Арби", 0},
  {"Арда", 0},
  {"Арден", 0},
  {"Арена", 1},
  {"Аристей", 0},
  {"Аристидис", 0},
  {"Арих", 0},
  {"Ариэль", 0},
  {"Арлен", 0},
  {"Арло", 0},
  {"Арманд", 0},
  {"Арнольд", 0},
  {"Арон", 0},
  {"Артур", 0},
  {"Архангел", 0},
  {"Архимаг", 0},
  {"Ахмед", 0},
  {"Бёртон", 0},
  {"Бад", 0},
  {"Байрон", 0},
  {"Бандит", 0},
  {"Бар", 0},
  {"Барбара", 1},
  {"Баретт", 0},
  {"Барт", 0},
  {"Батч", 0},
  {"Беатрис", 1},
  {"Беверли", 1},
  {"Беки", 1},
  {"Белинда", 1},
  {"Бен", 0},
  {"Бенджамин", 0},
  {"Бенедикт", 0},
  {"Бенито", 0},
  {"Беннет", 0},
  {"Бенни", 0},
  {"Бенуа", 0},
  {"Бернадетта", 1},
  {"Бернард", 0},
  {"Берни", 0},
  {"Бернис", 1},
  {"Бернучо", 0},
  {"Берт", 0},
  {"Бертран", 0},
  {"Бет", 1},
  {"Бетси", 1},
  {"Бетти", 1},
  {"Билли", 0},
  {"Биллис", 1},
  {"Бишоп", 0},
  {"Блейк", 0},
  {"Блейн", 0},
  {"Блондо", 0},
  {"Бо", 0},
  {"Боб", 0},
  {"Бобби", 0},
  {"Бодо", 0},
  {"Болотный", 0},
  {"Большой", 0},
  {"Бонни", 1},
  {"Борегард", 0},
  {"Борис", 0},
  {"Браден", 0},
  {"Брайс", 0},
  {"Брат", 0},
  {"Брейн", 0},
  {"Бренда", 1},
  {"Брендон", 0},
  {"Брент", 0},
  {"Брет", 0},
  {"Бронвин", 0},
  {"Бронзовый", 0},
  {"Брук", 0},
  {"Бруно", 0},
  {"Брэд", 0},
  {"Брэдли", 0},
  {"Брэдфорд", 0},
  {"Брэндон", 0},
  {"Брюс", 0},
  {"Буфорд", 0},
  {"Вадим", 0},
  {"Вал", 0},
  {"Валерия", 1},
  {"Вальтер", 0},
  {"Ванда", 1},
  {"Ванесса", 1},
  {"Ванетта", 1},
  {"Ванс", 0},
  {"Вейн", 0},
  {"Великий", 0},
  {"Венделл", 0},
  {"Венди", 1},
  {"Вера", 1},
  {"Верн", 0},
  {"Вернон", 0},
  {"Вероника", 1},
  {"Верховная", 1},
  {"Весли", 0},
  {"Виверн", 0},
  {"Вивьен", 1},
  {"Вики", 1},
  {"Виктор", 0},
  {"Викторис", 0},
  {"Виктория", 1},
  {"Вилам", 0},
  {"Вилл", 0},
  {"Виллард", 0},
  {"Вильма", 1},
  {"Вильфред", 0},
  {"Вильям", 0},
  {"Винный", 0},
  {"Винстон", 0},
  {"Винченцо", 0},
  {"Виолет", 1},
  {"Виргилий", 0},
  {"Виргиния", 1},
  {"Вихрь", 0},
  {"Владимир", 0},
  {"Властелин", 0},
  {"Водный", 0},
  {"Военное", 2},
  {"Воздушная", 1},
  {"Воздушный", 0},
  {"Волхв", 0},
  {"Вольг", 0},
  {"Восставший", 0},
  {"Врата", 1},
  {"Вудро", 0},
  {"Вурдалак", 0},
  {"Высшая", 1},
  {"Вэйд", 0},
  {"Габриэль", 0},
  {"Гай", 0},
  {"Ганс", 0},
  {"Гарет", 0},
  {"Гари", 0},
  {"Гарпия", 1},
  {"Гарри", 0},
  {"Гвендолин", 1},
  {"Гвенн", 1},
  {"Гейб", 0},
  {"Гейл", 1},
  {"Гектор", 0},
  {"Гельмут", 0},
  {"Геникки", 1},
  {"Генри", 0},
  {"Георгина", 1},
  {"Герб", 0},
  {"Герберт", 0},
  {"Герман", 0},
  {"Гертруда", 1},
  {"Герц", 0},
  {"Гигантская", 1},
  {"Гильдия", 1},
  {"Гильермо", 0},
  {"Гильмор", 0},
  {"Гимнастический", 0},
  {"Глазище", 2},
  {"Глен", 0},
  {"Гленда", 1},
  {"Глиняный", 0},
  {"Глория", 1},
  {"Гниющий", 0},
  {"Гном", 0},
  {"Гоблин", 0},
  {"Говард", 0},
  {"Гог", 0},
  {"Гомер", 0},
  {"Гонзало", 0},
  {"Гораций", 0},
  {"Гордон", 0},
  {"Горный", 0},
  {"Грабитель", 0},
  {"Грант", 0},
  {"Грахэм", 0},
  {"Грег", 0},
  {"Грегори", 0},
  {"Грей", 0},
  {"Гретхен", 1},
  {"Грифон", 0},
  {"Грозовой", 0},
  {"Гус", 0},
  {"Давид", 0},
  {"Дайана", 1},
  {"Дал", 0},
  {"Даллас", 0},
  {"Дамиан", 0},
  {"Дана", 1},
  {"Даниэль", 0},
  {"Данте", 0},
  {"Дара", 1},
  {"Дарлин", 1},
  {"Дарон", 0},
  {"Дарси", 1},
  {"Дастин", 0},
  {"Дафна", 1},
  {"Двайт", 0},
  {"Двейн", 0},
  {"Деанна", 1},
  {"Дебби", 1},
  {"Дебора", 1},
  {"Девон", 0},
  {"Дейв", 0},
  {"Дейл", 0},
  {"Дел", 0},
  {"Делорис", 1},
  {"Денис", 1},
  {"Денни", 0},
  {"Депозитарий", 0},
  {"Дерево", 2},
  {"Дерек", 0},
  {"Десмонд", 0},
  {"Джанис", 1},
  {"Джастин", 0},
  {"Джед", 0},
  {"Джедай", 0},
  {"Джей", 0},
  {"Джейк", 0},
  {"Джеймс", 0},
  {"Джейн", 1},
  {"Джейсон", 0},
  {"Джек", 0},
  {"Джеки", 1},
  {"Джеми", 0},
  {"Дженифер", 1},
  {"Дженни", 1},
  {"Джеральд", 0},
  {"Джеральдина", 1},
  {"Джером", 0},
  {"Джероми", 0},
  {"Джерри", 0},
  {"Джесс", 0},
  {"Джесса", 1},
  {"Джессика", 1},
  {"Джетано", 0},
  {"Джим", 0},
  {"Джин", 1},
  {"Джина", 1},
  {"Джинжер", 1},
  {"Джинни", 1},
  {"Джино", 0},
  {"Джо", 2},
  {"Джоан", 1},
  {"Джоанн", 1},
  {"Джоанна", 1},
  {"Джозеф", 0},
  {"Джой", 0},
  {"Джойс", 1},
  {"Джойсин", 1},
  {"Джон", 0},
  {"Джонатан", 0},
  {"Джордж", 0},
  {"Джоу", 0},
  {"Джошуа", 0},
  {"Джоэль", 0},
  {"Джуд", 0},
  {"Джуди", 1},
  {"Джудис", 1},
  {"Джули", 1},
  {"Джун", 1},
  {"Диана", 1},
  {"Дилан", 0},
  {"Дин", 0},
  {"Дитер", 0},
  {"Додридж", 0},
  {"Док", 0},
  {"Долорес", 1},
  {"Дольф", 0},
  {"Дом", 0},
  {"Доминик", 0},
  {"Доминика", 1},
  {"Дон", 0},
  {"Донайс", 1},
  {"Дональд", 0},
  {"Донна", 1},
  {"Дорин", 1},
  {"Дорис", 1},
  {"Дороти", 1},
  {"Драконовая", 1},
  {"Древнее", 2},
  {"Древний", 0},
  {"Друид", 0},
  {"Дрю", 0},
  {"Дуглас", 0},
  {"Дункан", 0},
  {"Дьявол", 0},
  {"Дэви", 0},
  {"Дэн", 0},
  {"Дэнис", 0},
  {"Дэнни", 0},
  {"Дюк", 0},
  {"Ева", 1},
  {"Евгений", 0},
  {"Елизавета", 1},
  {"Жан-Поль", 0},
  {"Жан-Пьер", 0},
  {"Жанета", 1},
  {"Жанетт", 1},
  {"Жанетта", 1},
  {"Жанин", 1},
  {"Жанис", 1},
  {"Жанна", 1},
  {"Жасмин", 1},
  {"Жейн", 1},
  {"Женна", 1},
  {"Жильбер", 0},
  {"Жофрей", 0},
  {"Жуль", 0},
  {"Зак", 0},
  {"Замок", 0},
  {"Замороженные", 2},
  {"Захарий", 0},
  {"Зебулон", 0},
  {"Зеленый", 0},
  {"Земной", 0},
  {"Зигги", 0},
  {"Зик", 0},
  {"Златые", 2},
  {"Зод", 0},
  {"Золотой", 0},
  {"Золтан", 0},
  {"Зорекс", 0},
  {"Ив", 0},
  {"Иван", 0},
  {"Ивар", 0},
  {"Иверсон", 0},
  {"Ивонна", 1},
  {"Игнасио", 0},
  {"Игорь", 0},
  {"Ида", 1},
  {"Иеремия", 0},
  {"Измаил", 0},
  {"Изумрудный", 0},
  {"Ике", 0},
  {"Илена", 1},
  {"Илья", 0},
  {"Имение", 2},
  {"Инкубатор", 0},
  {"Иоланда", 1},
  {"Ион", 0},
  {"Иона", 0},
  {"Иоханн", 0},
  {"Ирвин", 0},
  {"Ирвинг", 0},
  {"Ирена", 1},
  {"Ирина", 1},
  {"Ирис", 1},
  {"Ирма", 1},
  {"Исаак", 0},
  {"Исао", 0},
  {"Йордан", 0},
  {"Каао", 0},
  {"Кай", 0},
  {"Калеб", 0},
  {"Кальвин", 0},
  {"Каменная", 1},
  {"Каменный", 0},
  {"Кандейс", 1},
  {"Капитан", 0},
  {"Карен", 1},
  {"Кари", 0},
  {"Карин", 0},
  {"Карл", 0},
  {"Карли", 1},
  {"Карло", 0},
  {"Карлон", 0},
  {"Карлос", 0},
  {"Кармен", 1},
  {"Картер", 0},
  {"Касандра", 1},
  {"Катерина", 1},
  {"Кати", 1},
  {"Катлин", 1},
  {"Кван", 0},
  {"Квентин", 0},
  {"Квинн", 0},
  {"Кевин", 0},
  {"Кевинус", 0},
  {"Кейлин", 1},
  {"Кейт", 0},
  {"Кел", 0},
  {"Келли", 1},
  {"Кен", 0},
  {"Кеннет", 0},
  {"Кери", 1},
  {"Керн", 0},
  {"Киган", 0},
  {"Ким", 1},
  {"Кимберли", 1},
  {"Кирк", 0},
  {"Кирус", 0},
  {"Клайд", 0},
  {"Кларенс", 0},
  {"Кларк", 0},
  {"Клирик", 0},
  {"Клиффорд", 0},
  {"Клэй", 0},
  {"Клэр", 1},
  {"Коди", 0},
  {"Колин", 0},
  {"Колония", 1},
  {"Конни", 1},
  {"Коннор", 0},
  {"Конрад", 0},
  {"Константин", 0},
  {"Констанция", 1},
  {"Копи", 2},
  {"Кора", 1},
  {"Корбет", 0},
  {"Корд", 0},
  {"Кори", 0},
  {"Корисо", 0},
  {"Корнелия", 1},
  {"Корнилий", 0},
  {"Королева", 1},
  {"Королевский", 0},
  {"Король", 0},
  {"Кошка", 1},
  {"Красный", 0},
  {"Крейг", 0},
  {"Крис", 0},
  {"Криста", 1},
  {"Кристен", 1},
  {"Кристина", 1},
  {"Кристис", 1},
  {"Кристофер", 0},
  {"Кровавый", 0},
  {"Ксуан", 0},
  {"Кулак", 0},
  {"Курган", 0},
  {"Курица", 1},
  {"Кэй", 1},
  {"Кэйс", 1},
  {"Кэл", 0},
  {"Кэлло", 0},
  {"Кэмерон", 0},
  {"Кэнди", 1},
  {"Кэри", 1},
  {"Кэрол", 1},
  {"Кэролан", 1},
  {"Кэролин", 1},
  {"Кэрри", 1},
  {"Кэси", 0},
  {"Лабиринт", 0},
  {"Лаборатория", 1},
  {"Лазарь", 0},
  {"Лайонел", 0},
  {"Лаки", 0},
  {"Лана", 1},
  {"Ланс", 0},
  {"Лара", 1},
  {"Ларри", 0},
  {"Ларс", 0},
  {"Лаура", 1},
  {"Лаури", 1},
  {"Леа", 1},
  {"Леаса", 1},
  {"Лейф", 0},
  {"Лео", 0},
  {"Леонард", 0},
  {"Леора", 1},
  {"Лерой", 0},
  {"Лесли", 1},
  {"Лестер", 0},
  {"Летучая", 1},
  {"Ли", 0},
  {"Ли", 1},
  {"Лиам", 0},
  {"Ливия", 1},
  {"Лиза", 1},
  {"Лила", 1},
  {"Лиланд", 0},
  {"Лилли", 1},
  {"Лиман", 0},
  {"Линда", 1},
  {"Линден", 0},
  {"Линдсей", 0},
  {"Линн", 1},
  {"Лион", 0},
  {"Лич", 0},
  {"Ллойд", 0},
  {"Ловчий", 0},
  {"Логан", 0},
  {"Логово", 2},
  {"Лон", 0},
  {"Лонни", 0},
  {"Лора", 1},
  {"Лорд", 0},
  {"Лорен", 1},
  {"Лорена", 1},
  {"Лоу", 0},
  {"Лоувелл", 0},
  {"Лояльный", 0},
  {"Луи", 0},
  {"Луиджи", 0},
  {"Луиза", 1},
  {"Луис", 0},
  {"Луиса", 1},
  {"Лучник", 0},
  {"Льюис", 0},
  {"Людвиг", 0},
  {"Люк", 0},
  {"Люсиль", 1},
  {"Лютер", 0},
  {"Маделена", 1},
  {"Майк", 0},
  {"Майлз", 0},
  {"Майлс", 0},
  {"Мак", 0},
  {"Макро", 0},
  {"Макс", 0},
  {"Максвелл", 0},
  {"Малкольм", 0},
  {"Малый", 0},
  {"Мами", 1},
  {"Манни", 0},
  {"Мантикора", 1},
  {"Манфред", 0},
  {"Марвин", 0},
  {"Маргарита", 1},
  {"Марджори", 1},
  {"Марж", 1},
  {"Мариана", 1},
  {"Марианна", 1},
  {"Марио", 0},
  {"Марион", 0},
  {"Марис", 1},
  {"Мариса", 1},
  {"Маришаль", 1},
  {"Мария", 1},
  {"Марк", 0},
  {"Марко", 0},
  {"Маркони", 0},
  {"Маркус", 0},
  {"Марлен", 1},
  {"Марлон", 0},
  {"Марни", 1},
  {"Марси", 1},
  {"Марсия", 1},
  {"Марта", 1},
  {"Мартил", 1},
  {"Мартин", 0},
  {"Мархэм", 0},
  {"Марчелло", 0},
  {"Марша", 1},
  {"Маршал", 0},
  {"Мастер", 0},
  {"Матвей", 0},
  {"Материальные", 2},
  {"Матт", 0},
  {"Мегадракон", 0},
  {"Медный", 0},
  {"Медуза", 1},
  {"Мейм", 1},
  {"Мелани", 1},
  {"Мелвин", 0},
  {"Мелинда", 1},
  {"Мелисса", 1},
  {"Мелководье", 2},
  {"Мелоди", 1},
  {"Мертвец", 0},
  {"Мертвый", 0},
  {"Местная", 1},
  {"Местный", 0},
  {"Мик", 0},
  {"Минди", 1},
  {"Минеральные", 2},
  {"Миникора", 1},
  {"Минни", 1},
  {"Мириам", 1},
  {"Митч", 0},
  {"Мишель", 1},
  {"Могучий", 0},
  {"Мойра", 1},
  {"Монах", 0},
  {"Моника", 1},
  {"Монте", 0},
  {"Морел", 0},
  {"Морина", 1},
  {"Моррис", 0},
  {"Мортон", 0},
  {"Мохаммед", 0},
  {"Мраморная", 1},
  {"Мудрый", 0},
  {"Мэл", 0},
  {"Мэнди", 1},
  {"Мэри", 1},
  {"Мэри", 1},
  {"Мэрилин", 1},
  {"Мюрель", 1},
  {"Мюррей", 0},
  {"Надина", 1},
  {"Налётчик", 0},
  {"Наоми", 1},
  {"Натали", 1},
  {"Натан", 0},
  {"Натаниэль", 0},
  {"Начальная", 1},
  {"Небеса", 1},
  {"Нед", 0},
  {"Некромант", 0},
  {"Нельсон", 0},
  {"Неустрашимый", 0},
  {"Ник", 0},
  {"Ники", 1},
  {"Николай", 0},
  {"Николас", 0},
  {"Николь", 1},
  {"Нил", 0},
  {"Новобранец", 0},
  {"Ной", 0},
  {"Норина", 1},
  {"Норм", 0},
  {"Норма", 1},
  {"Норман", 0},
  {"Норрис", 0},
  {"Ньют", 0},
  {"Нэйт", 0},
  {"Нэнси", 1},
  {"Нэнсис", 1},
  {"Обсидиановая", 1},
  {"Огненный", 0},
  {"Олаф", 0},
  {"Оливер", 0},
  {"Оливия", 1},
  {"Орден", 0},
  {"Особняк", 0},
  {"Остин", 0},
  {"Отис", 0},
  {"Оувен", 0},
  {"Охотник", 0},
  {"Павел", 0},
  {"Пам", 1},
  {"Памела", 1},
  {"Паркер", 0},
  {"Парти", 1},
  {"Патрик", 0},
  {"Патрисия", 1},
  {"Пег", 1},
  {"Пегги", 1},
  {"Пейдж", 1},
  {"Пенни", 1},
  {"Перри", 0},
  {"Перси", 0},
  {"Персиваль", 0},
  {"Петер", 0},
  {"Пикси", 1},
  {"Пирс", 0},
  {"Пит", 0},
  {"Плавучий", 0},
  {"Покои", 2},
  {"Пол", 0},
  {"Посвящённый", 0},
  {"Посвященный", 0},
  {"Последний", 0},
  {"Послушник", 0},
  {"Постоялый", 0},
  {"Предводитель", 0},
  {"Престон", 0},
  {"Привидение", 2},
  {"Придорожный", 0},
  {"Призрак", 0},
  {"Природные", 2},
  {"Пьер", 0},
  {"Пэт", 0},
  {"Пэтти", 1},
  {"Раду", 0},
  {"Разбойник", 0},
  {"Райан", 0},
  {"Раймонд", 0},
  {"Ральф", 0},
  {"Рамей", 0},
  {"Рамси", 0},
  {"Рандольф", 0},
  {"Рассел", 0},
  {"Расти", 0},
  {"Ратуша", 1},
  {"Рауль", 0},
  {"Рафаэль", 0},
  {"Рашель", 1},
  {"Ребекка", 1},
  {"Реви", 1},
  {"Рег", 0},
  {"Регина", 1},
  {"Реджинальд", 0},
  {"Рекс", 0},
  {"Рене", 0},
  {"Рени", 1},
  {"Ренцо", 0},
  {"Ресанда", 1},
  {"Речной", 0},
  {"Рики", 0},
  {"Ринальдо", 0},
  {"Рита", 1},
  {"Ричард", 0},
  {"Роб", 0},
  {"Робби", 0},
  {"Роберт", 0},
  {"Роберта", 1},
  {"Робин", 0},
  {"Рогатый", 0},
  {"Родерик", 0},
  {"Родни", 0},
  {"Роза", 1},
  {"Розали", 1},
  {"Розанна", 1},
  {"Рози", 1},
  {"Розмари", 1},
  {"Розмарина", 1},
  {"Рой", 0},
  {"Роки", 0},
  {"Роланд", 0},
  {"Ромона", 1},
  {"Рон", 0},
  {"Рональд", 0},
  {"Ронда", 1},
  {"Рори", 0},
  {"Росс", 0},
  {"Роуз", 1},
  {"Рошель", 1},
  {"Рубина", 1},
  {"Руди", 0},
  {"Руперт", 0},
  {"Рут", 1},
  {"Рути", 1},
  {"Рэндал", 0},
  {"Рэнди", 0},
  {"Саад", 0},
  {"Сабрина", 1},
  {"Сади", 1},
  {"Сал", 0},
  {"Салли", 1},
  {"Сальваторе", 0},
  {"Самюэль", 0},
  {"Сандип", 0},
  {"Сандра", 1},
  {"Сантос", 0},
  {"Сапфировый", 0},
  {"Сара", 1},
  {"Свен", 0},
  {"Свет", 0},
  {"Светлана", 1},
  {"Светящийся", 0},
  {"Святилище", 2},
  {"Священная", 1},
  {"Священник", 0},
  {"Себастьян", 0},
  {"Седрик", 0},
  {"Сеймур", 0},
  {"Секлия", 1},
  {"Селена", 1},
  {"Сергио", 0},
  {"Серена", 1},
  {"Серый", 0},
  {"Сесиль", 0},
  {"Сет", 0},
  {"Сидней", 0},
  {"Сильвестр", 0},
  {"Сильфида", 1},
  {"Симон", 0},
  {"Симона", 1},
  {"Синди", 1},
  {"Синдис", 1},
  {"Синий", 0},
  {"Синтия", 1},
  {"Скалис", 0},
  {"Скелет", 0},
  {"Скорпикора", 1},
  {"Скотт", 0},
  {"Слабый", 0},
  {"Слейд", 0},
  {"Собака", 1},
  {"Собор", 0},
  {"Сол", 0},
  {"Солнце", 2},
  {"Сонни", 0},
  {"Спенсер", 0},
  {"Старший", 0},
  {"Стейси", 1},
  {"Стелс", 0},
  {"Стефан", 0},
  {"Стефани", 1},
  {"Стив", 0},
  {"Стивен", 0},
  {"Сторожевая", 1},
  {"Страж", 0},
  {"Стражник", 0},
  {"Стрекозавр", 0},
  {"Стрелок", 0},
  {"Стэн", 0},
  {"Стэнли", 0},
  {"Стюарт", 0},
  {"Суанна", 1},
  {"Судья", 0},
  {"Сулейман", 0},
  {"Сумеречный", 0},
  {"Сьюзан", 1},
  {"Сьюзи", 1},
  {"Сэм", 0},
  {"Сэнди", 1},
  {"Сэндин", 1},
  {"Сэра", 1},
  {"Сюзанна", 1},
  {"Тадеус", 0},
  {"Тайлер", 0},
  {"Тайсон", 0},
  {"Така", 0},
  {"Тамара", 1},
  {"Тамми", 1},
  {"Таня", 1},
  {"Тара", 1},
  {"Тейн", 0},
  {"Теодор", 0},
  {"Тереза", 1},
  {"Тереса", 1},
  {"Терранс", 0},
  {"Терри", 1},
  {"Тим", 0},
  {"Тимоти", 0},
  {"Тина", 1},
  {"Тиффани", 1},
  {"Тобиас", 0},
  {"Тодд", 0},
  {"Том", 0},
  {"Томас", 0},
  {"Тон", 0},
  {"Тони", 0},
  {"Тор", 0},
  {"Тран", 0},
  {"Траян", 0},
  {"Трейси", 1},
  {"Трент", 0},
  {"Трентон", 0},
  {"Трина", 1},
  {"Трип", 0},
  {"Трисия", 1},
  {"Троглодит", 0},
  {"Тронный", 0},
  {"Трувор", 0},
  {"Трэвис", 0},
  {"Туманный", 0},
  {"Тэд", 0},
  {"Тэрри", 1},
  {"Тюрьма", 1},
  {"Уальдо", 0},
  {"Уилберт", 0},
  {"Уильсон", 0},
  {"Ундина", 1},
  {"Уоллес", 0},
  {"Уоррен", 0},
  {"Упырь", 0},
  {"Учебный", 0},
  {"Уэбб", 0},
  {"Фабиан", 0},
  {"Фамильный", 0},
  {"Фарелл", 0},
  {"Федрус", 0},
  {"Фейт", 1},
  {"Феликс", 0},
  {"Фелиция", 1},
  {"Фердинанд", 0},
  {"Фил", 0},
  {"Филип", 0},
  {"Филлис", 1},
  {"Филомена", 1},
  {"Флетчер", 0},
  {"Флойд", 0},
  {"Флоренция", 1},
  {"Флосси", 1},
  {"Форрест", 0},
  {"Франк", 0},
  {"Франклин", 0},
  {"Франц", 0},
  {"Франциск", 0},
  {"Франческа", 1},
  {"Фред", 0},
  {"Фредерик", 0},
  {"Хавьер", 0},
  {"Хайден", 0},
  {"Хайди", 1},
  {"Хан", 0},
  {"Ханк", 0},
  {"Ханн", 0},
  {"Хаос", 0},
  {"Харви", 0},
  {"Харди", 0},
  {"Хариетта", 1},
  {"Харлан", 0},
  {"Харлей", 0},
  {"Харольд", 0},
  {"Харрисон", 0},
  {"Хелен", 1},
  {"Хильда", 1},
  {"Хит", 0},
  {"Хитер", 1},
  {"Хитет", 0},
  {"Хитоми", 1},
  {"Ходячий", 0},
  {"Хок", 0},
  {"Холден", 0},
  {"Холли", 1},
  {"Храм", 0},
  {"Хранилище", 2},
  {"Хью", 0},
  {"Хьюго", 0},
  {"Хэл", 0},
  {"Хэмптон", 0},
  {"Царь", 0},
  {"Цезарь", 0},
  {"Циклон", 0},
  {"Цитадель", 1},
  {"Чад", 0},
  {"Чак", 0},
  {"Чан", 0},
  {"Чандра", 1},
  {"Чарли", 0},
  {"Чарльз", 0},
  {"Чародей", 0},
  {"Часовой", 0},
  {"Чемпион", 0},
  {"Черная", 1},
  {"Чернокнижник", 0},
  {"Чертог", 0},
  {"Честер", 0},
  {"Чет", 0},
  {"Чип", 0},
  {"Чудище", 2},
  {"Шатер", 0},
  {"Шахтерская", 1},
  {"Шейла", 1},
  {"Шейлани", 1},
  {"Шелдон", 0},
  {"Шелл", 0},
  {"Шелли", 1},
  {"Шеллис", 1},
  {"Шердон", 0},
  {"Шерил", 1},
  {"Шерман", 0},
  {"Шерри", 1},
  {"Шеррин", 1},
  {"Шимон", 0},
  {"Школа", 1},
  {"Шон", 0},
  {"Шоуна", 1},
  {"Штаб", 0},
  {"Шэнон", 1},
  {"Шэри", 1},
  {"Шэрон", 1},
  {"Эван", 0},
  {"Эвелин", 1},
  {"Эд", 0},
  {"Эдгар", 0},
  {"Эдди", 0},
  {"Эдисон", 0},
  {"Эдит", 1},
  {"Эдмонд", 0},
  {"Эдна", 1},
  {"Эйб", 0},
  {"Эйлин", 1},
  {"Эйприл", 1},
  {"Экспертная", 1},
  {"Эл", 0},
  {"Элвин", 0},
  {"Элегантный", 0},
  {"Элен", 1},
  {"Элеонора", 1},
  {"Элиот", 0},
  {"Элисон", 1},
  {"Элисса", 1},
  {"Элитный", 0},
  {"Элла", 1},
  {"Эллен", 1},
  {"Элси", 1},
  {"Элтон", 0},
  {"Эльф", 0},
  {"Эми", 1},
  {"Эмиль", 0},
  {"Эмма", 1},
  {"Эммануил", 0},
  {"Эммет", 0},
  {"Энджи", 1},
  {"Энди", 0},
  {"Энн", 1},
  {"Энн", 2},
  {"Энок", 0},
  {"Эрвин", 0},
  {"Эрик", 0},
  {"Эрин", 1},
  {"Эрл", 0},
  {"Эрнест", 0},
  {"Эрни", 0},
  {"Эрнин", 0},
  {"Эрол", 0},
  {"Этан", 0},
  {"Этель", 1},
  {"Эш", 0},
  {"Эштон", 0},
  {"Юдифь", 1},
  {"Юрий", 0},
  {"Ядовитый", 0},
  {"Якоб", 0},
  {"Ян", 0},
  {"Янси", 0},
  {"Ярод", 0},
  {"Яспер", 0}
},
  gender_table[] =
{
  {"ад", 0},       {"акула", 1},    {"банк", 0},      {"башня", 1},      {"бластер", 0}, {"вампир", 0},   {"вдова", 1},      {"ведьма", 1},   {"витерсмит", 0}, {"владыка", 0},  {"владычица", 1},
  {"воин", 0},     {"вор", 0},      {"гидра", 1},     {"глаз", 0},       {"голем", 0},   {"гора", 1},     {"горгулья", 1},   {"город", 0},    {"громовая", 1},  {"двор", 0},     {"джинн", 0},
  {"дракон", 0},   {"дух", 0},      {"житель", 0},    {"жительница", 1}, {"зал", 0},     {"защитник", 0}, {"земля", 1},      {"искатель", 0}, {"ифрит", 0},     {"квартира", 1}, {"кольчуга", 1},
  {"командир", 0}, {"крыса", 1},    {"лейтенант", 0}, {"луна", 1},       {"людоед", 0},  {"магог", 0},    {"меч", 0},        {"мечник", 0},   {"минотавр", 0},  {"мышь", 1},     {"наемник", 0},
  {"огненная", 1}, {"огонь", 0},    {"орк", 0},       {"паук", 0},       {"пещера", 1},  {"пещеры", 1},   {"повелитель", 0}, {"погреб", 0},   {"полигон", 0},   {"приют", 0},    {"птица", 1},
  {"птичий", 0},   {"работник", 0}, {"рай", 0},       {"рейнджер", 0},   {"рух", 0},     {"слизень", 0},  {"солдат", 0},     {"титан", 0},    {"трактир", 0},   {"тролль", 0},   {"убийца", 0},
  {"улан", 0},     {"училище", 2},  {"шляпа", 1},     {"элементал", 0}
};



#include <mbstring.h>

int GetGender(char *ansi_name, int name_len)
{
  auto name = (unsigned char *)ansi_name;

  GenderTableEntry *table = nullptr;
  unsigned int      table_size = 0;
  if (name[0] >= (unsigned char)'а' && name[0] <= (unsigned char)'я')
  {
    table = gender_table;
    table_size = sizeof(gender_table) / sizeof(*gender_table);
  }
  else if (name[0] >= (unsigned char)'А' && name[0] <= (unsigned char)'Я')
  {
    table = gender_table_caps;
    table_size = sizeof(gender_table_caps) / sizeof(*gender_table_caps);
  }
  else return 0;

  int left = 0,
      right = table_size - 1,
      match = 0;
  while (left < right - 1)
  {
    match = left + (right - left) / 2;
    int rval = _mbsncmp(name, (unsigned char *)table[match].name, name_len);
    if (rval < 0)
      right = match;
    else if (!rval)
      return table[match].gender;
    else
      left = match;
  }

  Log::Warning(L"sprintfex: unknown gender: %S", name);
  return 0;
}


bool IsSpecialName(const char *ansi_name)
{
  auto name = (unsigned char *)ansi_name;
  return !_mbsncmp(name, (unsigned char *)"Мэри Джо", 8)        || !_mbsncmp(name, (unsigned char *)"Ли Энн", 6) ||
         !_mbsncmp(name, (unsigned char *)"Врата в Бездну", 14) || !_mbsncmp(name, (unsigned char *)"Стены тумана", 12);
}
int GetSpecialGender(const char *ansi_name)
{
  auto name = (unsigned char *)ansi_name;
  if (!_mbsncmp(name, (unsigned char *)"Мэри Джо", 8))
    return 1;
  if (!_mbsncmp(name, (unsigned char *)"Ли Энн", 6))
    return 1;
  if (!_mbsncmp(name, (unsigned char *)"Врата в Бездну", 14))
    return 1;
  if (!!_mbsncmp(name, (unsigned char *)"Стены тумана", 12))
    return 0;
  return 0;
}
const char *GetSpecialCase(const char *ansi_name, char c)
{
  auto name = (unsigned char *)ansi_name;

  if (!_mbsncmp(name, (unsigned char *)"Мэри Джо", 8))
    return "Мэри Джо";
  if (!_mbsncmp(name, (unsigned char *)"Ли Энн", 6))
    return "Ли Энн";

  if (!_mbsncmp(name, (unsigned char *)"Врата в Бездну", 14))
    switch (c)
    {
      case 'I': case 'i': return "Врата в Бездну";
      case 'R': case 'r': return "Врат в Бездну";
      case 'D': case 'd': return "Вратам в Бездну";
      case 'V': case 'v': return "Врат в Бездну";
      case 'T': case 't': return "Вратами в Бездну";
      case 'P': case 'p': return "Вратах в Бездну";
    }

  if (!_mbsncmp(name, (unsigned char *)"Стены тумана", 12))
    switch (c)
    {
      case 'I': case 'i': return "Стены тумана";
      case 'R': case 'r': return "Стен тумана";
      case 'D': case 'd': return "Стенам тумана";
      case 'V': case 'v': return "Стены тумана";
      case 'T': case 't': return "Стенами тумана";
      case 'P': case 'p': return "Стенах тумана";
    }

  return nullptr;
}

int sprintfex_internal(char *str)
{
  auto p = strstr(str, "^");
  if (!p)
    return strlen(str);

  char buf[8192];
  Assert(strlen(str) < sizeof(buf));

  int next_integer_token = 0;
  bool integer_tokens_defined[10] = {false, false, false, false, false, false, false, false, false, false};
  int integer_tokens[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

  bool gender_token_defined = false;
  int gender_token = 0;
  
  auto src = buf,
       dst = p;
  strcpy(buf, str + (p - str));
  while (true)
  {
    switch (src[1])
    {
      case 'I':
      {
        if (src[2] != '[')
          goto _invalid_token;
        src += 3;  // ^I[
        
        Assert(next_integer_token < 10);
        if (sscanf(src, "%d", &integer_tokens[next_integer_token]))
          integer_tokens_defined[next_integer_token++] = true;

        auto int_begin = src;
        while (*src++ != ']');

        int int_len = src - int_begin - 1;
        strncpy(dst, int_begin, int_len);
        dst += int_len;
      }
      break;

      case 'L':
      {
        int integer_token_idx = 0;
        if (src[2] >= '1' && src[2] <= '9')
        {
          if (src[3] != '[')
            goto _invalid_token;
          integer_token_idx = src[2] - '1';

          src += 1;
        }
        else if (src[2] != '[')
          goto _invalid_token;

        Assert(integer_tokens_defined[integer_token_idx]);
        src += 3; // ^L[

        auto ending1 = src;
        while (*src++ != ';');
        auto ending2 = src;
        while (*src++ != ';');
        auto ending3 = src;
        while (*src++ != ']');

        char *actual_ending = nullptr;
        int   actual_ending_len = 0;

        int modulo = abs(integer_tokens[integer_token_idx]) % 10;
        if (modulo == 1)
        {
          actual_ending = ending1;
          actual_ending_len = ending2 - ending1 - 1;
        }
        else if (modulo >= 2 && modulo <= 4)
        {
          actual_ending = ending2;
          actual_ending_len = ending3 - ending2 - 1;
        }
        else
        {
          actual_ending = ending3;
          actual_ending_len = src - ending3 - 1;
        }

        strncpy(dst, actual_ending, actual_ending_len);
        dst += actual_ending_len;
      }
      break;

      case 'R':
      {
        if (src[2] != '[')
          goto _invalid_token;
        Assert(gender_token_defined);

        src += 3; // ^R[

        auto ending1 = src;
        while (*src++ != ';');
        auto ending2 = src;
        while (*src++ != ';');
        auto ending3 = src;
        while (*src++ != ']');

        char *actual_ending = nullptr;
        int   actual_ending_len = 0;

        if (gender_token == 0)
        {
          actual_ending = ending1;
          actual_ending_len = ending2 - ending1 - 1;
        }
        else if (gender_token == 1)
        {
          actual_ending = ending2;
          actual_ending_len = ending3 - ending2 - 1;
        }
        else if (gender_token == 2)
        {
          actual_ending = ending3;
          actual_ending_len = src - ending3 - 1;
        }
        else Error("Invalid gender token");

        strncpy(dst, actual_ending, actual_ending_len);
        dst += actual_ending_len;
      }
      break;

      case 'P':
      {
        if (src[3] != '[')
          goto _invalid_token;
        switch (src[2])
        {
          case 'I': case 'i':
          case 'R': case 'r':
          case 'D': case 'd':
          case 'V': case 'v':
          case 'T': case 't':
          case 'P': case 'p': break;
          default:
            goto _invalid_token;
        }

        if (IsSpecialName(src + 4))
        {
          auto name = GetSpecialCase(src + 4, src[2]);
          int name_len = strlen(name);

          gender_token = GetSpecialGender(src + 4);
          gender_token_defined = true;

          strncpy(dst, name, name_len);
          dst += name_len;
          while (*src++ != ']');
          break;
        }
        
        auto name_begin = src + 4;
        int name_len = 0;
        for (int i = 0; name_begin[i] != ']'; ++i)
          name_len++;
        gender_token = GetGender(name_begin, name_len);
        gender_token_defined = true;

        switch (src[2])
        {
          case 'I': case 'i':
          case 'V': case 'v':
          case 'R': case 'r':
          case 'D': case 'd':
          case 'T': case 't':
          {
            strncpy(dst, name_begin, name_len);
            dst += name_len;
          }
          break;

          case 'P': case 'p':
          {
            auto token_begin = src;
            int token_len = 1;
            for (int i = 0; token_begin[i] != ']'; ++i)
              token_len++;
            strncpy(dst, token_begin, token_len);
            dst += token_len;
          }
        }
        while (*src++ != ']');
      }
      break;

      default:
      {
_invalid_token:
        auto token_begin = src;
        while (*src++ != ']');

        int token_len = src - token_begin;
        char token[1024];
        strncpy(token, token_begin, token_len);
        token[token_len] = 0;

        Error("Invalid format token: %s", token);
      }
      break;
    }
    
    *dst = 0;

    auto copy_begin = src;
    src = strstr(src, "^");
    if (!src)
    {
      strcpy(dst, copy_begin); // just copy the rest
      break;
    }

    int copy_len = src - copy_begin;
    strncpy(dst, copy_begin, copy_len);
    dst += copy_len;
  }

  return dst - str;
}






//mm6text.non -> c structure array
  /*FILE *f = fopen("_1.txt", "w+t");
  FILE *in = fopen("mm6text.non", "rt");
  fscanf(in, "%*[^\n]\n");

  int idx = 0;
  auto pairs = new NameGender[8000];

  char line[1024];
  while (fscanf(in, "%[^\n]\n", line) && !feof(in))
  {
    char name1[100], name2[100], name3[100];
    int e = sscanf(line, "%s\t%s\t%s", pairs[idx].name, pairs[idx + 1].name, pairs[idx + 2].name);
    pairs[idx].gender = 0;
    pairs[idx+1].gender = 1;
    pairs[idx+2].gender = 2;
    idx += e;
  }

  for (int i = 0; i < idx; ++i)
    for (int j = 0; j < i; ++j)
    {
      if (_mbsicmp(pairs[i].name, pairs[j].name) < 0)
      {
        char n[1024];
        strcpy(n, (char *)pairs[j].name);
        auto g = pairs[j].gender;

        strcpy((char *)pairs[j].name, (char *)pairs[i].name);
        pairs[j].gender = pairs[i].gender;

        strcpy((char *)pairs[i].name, n);
        pairs[i].gender = g;
      }
    }
    
  for (int i = 0; i < idx; ++i)
  {
    fprintf(f, "  {\"%s\", %u},\n", pairs[i].name, pairs[i].gender);
  }
  fclose(f);*/