I think this is the source of the worker bug
the current code is first with the '*/' stuff and i put an older version of code in. I have to test it though
Code:
void CityData::ChangePopulation(sint32 delta)
{
/* //this code was change and maybe source of worker bug since workers done twice
m_population += delta;
m_numSpecialists[POP_WORKER] += (sint16)delta; //this might be extra
if (delta < 0)
{
m_numSpecialists[POP_WORKER] += (sint16)delta;
if(m_numSpecialists[POP_WORKER] < 0) {
sint32 needToRemove = -m_numSpecialists[POP_WORKER];
m_numSpecialists[POP_WORKER] = 0;
for (sint32 i = 0; i < POP_MAX && needToRemove > 0; i++)
{
if(m_numSpecialists[i] >= (sint16)needToRemove) {
m_numSpecialists[i] -= (sint16)needToRemove;
needToRemove = 0;
} else if(m_numSpecialists[i] >= 0) {
needToRemove -= m_numSpecialists[i];
m_numSpecialists[i] = 0;
}
}
}
}
*/
//original code (from rev 632 archive)
m_population += delta;
if(delta > 0) {
m_numSpecialists[POP_WORKER] += (sint16)delta;
} else {
m_numSpecialists[POP_WORKER] += (sint16)delta;
if(m_numSpecialists[POP_WORKER] < 0) {
sint32 needToRemove = -m_numSpecialists[POP_WORKER];
m_numSpecialists[POP_WORKER] = 0;
sint32 i;
for(i = 0; i < POP_MAX && needToRemove > 0; i++) {
if(m_numSpecialists[i] >= (sint16)needToRemove) {
m_numSpecialists[i] -= (sint16)needToRemove;
needToRemove = 0;
} else if(m_numSpecialists[i] >= 0) {
needToRemove -= m_numSpecialists[i];
m_numSpecialists[i] = 0;
}
}
}
}
AdjustSizeIndices();
UpdateSprite();
if(g_network.IsHost()) {
g_network.Block(m_owner);
g_network.Enqueue(m_home_city.AccessData(), this);
g_network.Unblock(m_owner);
}
if(m_population <= 0) {
g_gevManager->AddEvent(GEV_INSERT_AfterCurrent, GEV_KillCity,
GEA_City, m_home_city.m_id,
GEA_Int, CAUSE_REMOVE_CITY_UNKNOWN,
GEA_Player, -1,
GEA_End);
}
}
Bookmarks