До "полоски прогресса" пока не дошел, потому что сначала хотел закончить свой вариант расположения информации вверху городского экрана.

Для начала я отвязал информацию о состоянии городского склада от названия города и перенес ее в левый верхний угол. Плюс добавил к ней иконку склада. Одновременно на освободившееся место рядом с названием города перенес данные об "очках рождаемости". Для них это самое подходящее место. В итоге получилось так:



Пока не идеально, но мне кажется выглядит уже поприличнее. Этот вариант работает стабильно и вылетов нет. Но нет и подсказки при наведении мышки на данные склада (зеленые цифры и иконка). А хотелось бы!

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

1. В CvEnums.h добавил

Код:
    WIDGET_HELP_POPULATION,
//KJ Warehouse START
    WIDGET_HELP_WAREHOUSE,
//KJ Warehouse END
    WIDGET_HELP_REBEL
2. В CyEnumsInterface.cpp:

Код:
        .value("WIDGET_HELP_POPULATION", WIDGET_HELP_POPULATION)
//KJ Warehouse START
        .value("WIDGET_HELP_WAREHOUSE", WIDGET_HELP_WAREHOUSE)
//KJ Warehouse END
        .value("WIDGET_HELP_REBEL", WIDGET_HELP_REBEL)
3. В CvDLLWidgetData.h:

Код:
    void parsePopulationHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer);
//KJ Warehouse START
    void parseWarehouseHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer);
//KJ Warehouse END
    void parseRebelHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer);
4. В CvDLLWidgetData.cpp:

Код:
    case WIDGET_HELP_POPULATION:
        parsePopulationHelp(widgetDataStruct, szBuffer);
        break;

//KJ Warehouse START
    case WIDGET_HELP_WAREHOUSE:
        parseWarehouseHelp(widgetDataStruct, szBuffer);
        break;
//KJ Warehouse END
        
    case WIDGET_HELP_REBEL:
        parseRebelHelp(widgetDataStruct, szBuffer);
        break;
и

Код:
void CvDLLWidgetData::parsePopulationHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer)
{
    CvCity* pHeadSelectedCity;

    pHeadSelectedCity = gDLL->getInterfaceIFace()->getHeadSelectedCity();

    if (pHeadSelectedCity != NULL)
    
    {
//        szBuffer.assign(gDLL->getText("TXT_KEY_MISC_FOOD_THRESHOLD", pHeadSelectedCity->getFood(), pHeadSelectedCity->growthThreshold()));    //original, closed by KJ
        szBuffer.assign(gDLL->getText("TXT_KEY_MISC_BIRTHPOINTS_THRESHOLD", pHeadSelectedCity->getBirthPoints(), pHeadSelectedCity->currentBirthPoints(), pHeadSelectedCity->growthThreshold()));   //KJ addon
    }
}

//KJ Warehouse START
void CvDLLWidgetData::parseWarehouseHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer)
{
    CvCity* pHeadSelectedCity;

    pHeadSelectedCity = gDLL->getInterfaceIFace()->getHeadSelectedCity();

    if (pHeadSelectedCity != NULL)
    {
        szBuffer.assign(gDLL->getText("TXT_KEY_MISC_WAREHOUSE", pHeadSelectedCity->getTotalYieldStored(), pHeadSelectedCity->getMaxYieldCapacity()));
    }
}
//KJ Warehouse END

void CvDLLWidgetData::parseRebelHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer)
{
    if (widgetDataStruct.m_iData1 == 1)
    {
        CvCity* pHeadSelectedCity = gDLL->getInterfaceIFace()->getHeadSelectedCity();
        if (pHeadSelectedCity != NULL)
        {
            szBuffer.assign(gDLL->getText("TXT_KEY_MISC_REBEL_HELP", pHeadSelectedCity->getRebelPercent()));
        }
    }
    else
    {
        szBuffer.assign(gDLL->getText("TXT_KEY_MISC_REBEL_HELP", GET_TEAM(GC.getGameINLINE().getActiveTeam()).getRebelPercent()));
    }
}
5. CvDLLWidgetData.h:

Код:
    void parsePopulationHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer);
//KJ Warehouse START
    void parseWarehouseHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer);
//KJ Warehouse END
    void parseRebelHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer);
Компилируем без ошибок, запускаем мод тоже без проблем. А дальше начинается какая-то мистика.

Если я работаю мышкой и после наведения ею на кнопку "Continue" я получаю немедленный вылет на десктоп.



Если же я использую клавиатуру и просто нажимаю на этом экране кнопку "Enter", то могу спокойно продолжать игру.

Итак, стоим город, селим в нем пару жителей. Верхняя часть экрана после небольшого редактирования теперь выглядит так:



Я оставил только данные об изменении запасов на складе за ход. Все остальное - а именно текущее наполнение склада и его максимальная емкость - перемещены в подсказку.

Когда склад пополняется, это выглядит так



Когда склад опорожняется, так:



Можно конечно радоваться, ибо это именно тот вариант, что мне хотелось бы иметь, но на выходе меня ждут вторые грабли.

Снова, как и в случае с кнопкой "Continue", стоит мне навести курсор мыши на кнопку "Exit", следует моментальный вылет на десктоп.



И опять же, если выходить с городского экране не мышкой, а с помощью клавиатуры (кнопка "Esc"), то вылета нет и можно спокойно продолжать игру.

Лично я с таким встречаюсь впервые. Вчера весь вечер потратил на поиск этих "граблей", но так и не нашел.

WIDGET_HELP_WAREHOUSE прописал в кодах правильно, остальное тоже вроде бы все нормально. В конце концов весь с клавиатурой все же работает именно так, как и должно быть! А лишь при наведении мышькой на кнопки "Continue" и "Exit" следует немедленный вылет. Почему?