Новая система обучения.
Отказ от свободного и неограниченного притока специалистов из Европы потребовал введения корректив в систему обучения в Новом Свете. Сейчас обучение возможно по трем типам:
Тип 1: обучение колонистов среди туземцев. Эту часть я пока не трогал, она осталась практически без изменений.
Тип 2: обучение в процессе работы.
Это совершенно новый тип обучения и его я перенес из немецкого мода "ТАС 2.03", внеся ряд существенных дополнений и изменений.
Логика в данном случае предельно простая. Колонист, прибывший из Европы и не имеющий никакой професии, начинает работать к примеру дровосеком. Если он занят без перерыва на этой работе, к примеру, 10 месяцев (1 ход = 1 месяц

, то у него есть шанс стать профессиональным лесорубом либо сразу после непрерывного 10-месячного махания топором, либо с задержкой на 1-3 месяца. (ЗЫ, мне тоже приходилось валить лес, но нас - молодых тогда еще ребят - обучили этому делу максимум за час. Так что 10 месяцев это ооочень много, если сравнивать с реальной жизнью.)
Если же колонист через несколько ходов занялся другой работой, стал к примеру строителем, то его счетчик обнуляется и расчет идет по новой. Если колонист меняет профессии как перчатки, то он никогда не научится никакой профессии. Если кто помнит, то таких в советское время величали "летунами".
"Стаж непрерывной работы на данном месте" (извиняюсь за бюрократический сленг

для разных профессий различен. Он минимален для традиционных в Европе "полевых" профессиий (рыбак, лесоруб, фермер

, немного больше для неизвестных европейцам "полевых" профессий (разведения табака, выращивание какао и т.д.), еще больше для "городских профессий и максимально большой для профессий высшего уровня (администратор, священник

.
Эта часть уже полностью реализована и работает коррестно.
3 Тип: обучение в школах, колледжах, университетах.
В данном разделе мне лишь частично удалось исправить ситуацию.
Прежде всего простейший вопрос: о каком собственно обучении идет речь?
Ответ: речь идет о
профессиональном обучении, то есть колонист после обучения получает
профессию.
Что мы имеем в оригинальной версии игры? Для примера я возьму марафонскую скорость. Обучение в школе - 60 циклов, в колледже - 45, в университете - 30.
НО!!!
Школа выпускают лишь специалистов самых простейших профессий - типа рыбаков, фермеров и т.д. Но учат их 60 циклов!
Университет же выпускает высшее сословие (администраторов, священников

, но на это требуется всего 30 циклов!
Ясно же, что система обучения стоит на голове. Я изменил логику и сейчас она более соответствует действительности.
Обучение в школе самое короткое, но школа и дает лишь простейшие профессии, колледж - обучение длиннее, но и профессии после нее колонист получает более сложные, университет - самое длительное обучение, но зато там можно обучить самым сложным профессиям. В этом случае система обучения становится с головы на ноги.
Нечто подобное было в прошлом. Достаточно вспомнить систему профобучения в СССР: профучилище (рабочий

, техникум (мастер

, институт (инженер

.
Сроки обучения в школах, клледжах, университетах легко согласовать с обучением на рабочем месте по типу 2.
Как вариант такое соотношение:
(первая цифра - простейшая "полевая" профессия, вторая цифра - городская профессия, третья цифра - наиболее сложная профессия
Обучение на рабочем месте: 10 - 30 - 90
Обучение в учебном заведении: 15 - 30 - 45
Из цифр следует, что учиться полевым профессиям лучше работая, а не протирая штаны за партой.
Для городских профессий разницы нет, но необходимо наличия коллежда, а это время и деньги (стройматериалы
Однако колледж необходим как ступень для строительства университета, поскольку высшие по сложности профессии лучше получать именно учась, а не работая на них.
Описанное выше также реализовано и работает корректно.
Здесь можно было бы поставить точку, но есть небольшой ньюанс, на котором я споткнулся. Он заключается в том, что
колледж и университет выпускают всех специалистов одновременно. К примеру ниверситет через 45 циклов может выпустить как простейшего дровосека, так и администратора. Если первый будет бесплатным, то за последнего придется дополнительно выложить некое количество монет.
Но учатся-то они одинакое по продолжительности время! А, если по уму, то должны разное.
Дровосек в университете или коллежде должен заканчивать обучение через столько же циклов, как и в школе. Если в школе у него на обучение уходит 15 циклов, то в колледже или университете у него должна быть возможность закончить обучение через те же самые 15 циклов, а не сидеть там в 2 или 3 раза дольше положенного.
Совершенно аналогично для кузнеца. Его можно обучить только в колледже или университете, в школе - нельзя. На обучение в колледже требуется 30 циклов + некая кучка монет. Так и в университете кузнеца мы должны получить через те же самые 30 циклов + кучка монет.
Вместо этого и дровосек, и кузнец (я взял их обоих исключительно в качестве примера

торчат в университете втрое или в коллежде вдвое дольше положенного. Я пытаюсь исправить это, но пока, увы, безуспешно...
Что имеем на данный момент?
В CvUnit.cpp решение об окончании обучения описывается так:
Code:
if (pCity != NULL)
{
if (getYieldStored() >= pCity->educationThreshold())
{
if (isHuman())
{
CvPopupInfo* pPopupInfo = new CvPopupInfo(BUTTONPOPUP_CHOOSE_EDUCATION, pCity->getID(), getID());
gDLL->getInterfaceIFace()->addPopup(pPopupInfo, getOwnerINLINE());
}
else
{
pCity->AI_educateStudent(getID());
}
}
} Берется educationThreshold()
для данного города и сравнивается с накопленным количеством очков обучения getYieldStored(). Если их накоплено больше или столько же, как и необходимо, то процесс обучения заканчивается и колонист получает одну из доступных в данном городе специальностей.
Если я не ошибаюсь, то выбор доступных специальностей идет через
Code:
CvPopupInfo* pPopupInfo = new CvPopupInfo(BUTTONPOPUP_CHOOSE_EDUCATION, pCity->getID(), getID());
Я пробил исходные коды на "BUTTONPOPUP_CHOOSE_EDUCATION". Возможны три места, где программа составляет список юнитов, находящихся в данном городе на момент окончания образования. Это
1. CvDLLButtonPopup.cpp
Code:
case BUTTONPOPUP_CHOOSE_EDUCATION:
if (pPopupReturn->getButtonClicked() == GC.getNumUnitInfos())
{
CvCity* pCity = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getCity(info.getData1());
if (pCity != NULL)
{
gDLL->getInterfaceIFace()->selectCity(pCity, true);
CvPopupInfo* pInfo = new CvPopupInfo(BUTTONPOPUP_CHOOSE_EDUCATION, info.getData1(), info.getData2());
gDLL->getInterfaceIFace()->addPopup(pInfo, GC.getGameINLINE().getActivePlayer(), false, true);
}
}
else if (pPopupReturn->getButtonClicked() >= 0)
{
gDLL->sendDoTask(info.getData1(), TASK_EDUCATE, info.getData2(), pPopupReturn->getButtonClicked(), false, false, false, false);
}
break;
2. тот же самый CvDLLButtonPopup.cpp:
Code:
case BUTTONPOPUP_CHOOSE_EDUCATION:
{
PlayerTypes ePlayer = GC.getGameINLINE().getActivePlayer();
CvCity* pCity = GET_PLAYER(ePlayer).getCity(info.getData1());
if (NULL == pCity || pCity->getOwnerINLINE() != ePlayer)
{
gDLL->getInterfaceIFace()->popupSetAsCancelled(pPopup);
}
else
{
gDLL->getInterfaceIFace()->lookAtCityOffset(pCity->getID());
}
}
break;
3. CvGameTextMgr.cpp:
Code:
case BUTTONPOPUP_CHOOSE_EDUCATION:
{
CvPlayer& kPlayer = GET_PLAYER(GC.getGameINLINE().getActivePlayer());
CvCity* pCity = kPlayer.getCity(info.getData1());
CvUnit* pUnit = kPlayer.getUnit(info.getData2());
if (pCity != NULL && pUnit != NULL)
{
BuildingTypes eSchoolBuilding = pCity->getYieldBuilding(YIELD_EDUCATION);
if (eSchoolBuilding != NO_BUILDING)
{
szString += gDLL->getText("TXT_KEY_MINIMIZED_CHOOSE_EDUCATION", pUnit->getNameOrProfessionKey(), pCity->getNameKey(), GC.getBuildingInfo(eSchoolBuilding).getTextKeyWide());
}
}
}
break;
В принципе понятно, что именно программа делает. Она составляет список юнитов, находящихся в данном городе. Я подозреваю, что этот списоск есть Data2(). А когда приходит момент выбора специальности обучившимся студентом, то выдает этот список для выбора одной из профессий.
Мне до сих пор ни разу не приходилось встречаться с Data1() или Data2() "врЕменными матрицами" (вряд ли термин верный, поэтому прошу специалистов не бить сильно ногами

. По-моему, именно в них зашита та информация, которую мне нужно выправить. Пока я ищу пути как это можно сделать.