No Crash to post but I believe this is the pertinent code
As you can see there is supposed to be a post revolution bliss and some other stuff preventing these cities from revolting over and over again. I don't think the code is broken, I think the new civ just cant handle the city after the bliss period ends.
I think we may have to do one or more of the following
- Check if Capitol exists for the new civ and create the capitol, I think the lack of the capitol makes it tough to continue
- Cut the population of the revolting city (casualties of the revolution). Large population seems to be thesource of the constant revolts.
- Create additional units that impose martial law
- Just give it to the Barbarians
- RevoltingCitiesJoinPlayer should be given to a wonder earlier in the game
- Accept it as is. I know Bureaubert has cringed. I think its kind of a nice touch. it is a bit much but never hurt my game.
Code:
void CityData::Revolt(sint32 &playerToJoin, BOOL causeIsExternal) { sint32 i, n; PLAYER_INDEX const orgowner = m_owner; CellUnitList army; MapPoint city_pos, new_city; BOOL joined_egalatarians = FALSE; g_player[m_owner]->m_score->AddRevolution(); m_home_city.GetPos(city_pos) ; if(!causeIsExternal && g_network.IsActive()) { g_network.Block(m_owner); } PLAYER_INDEX newowner = PLAYER_UNASSIGNED; if(wonderutil_GetRevoltingCitiesJoinPlayer(g_theWonderTracker->GetBuiltWonders())) { sint32 p; for(p = 0; p < k_MAX_PLAYERS; p++) { if(g_player[p]) { if(wonderutil_GetRevoltingCitiesJoinPlayer( g_player[p]->m_builtWonders)) { newowner = p; if(newowner == m_owner) { newowner = PLAYER_UNASSIGNED; } else { joined_egalatarians = TRUE; } break; } } } } if(newowner < 0) { if(playerToJoin < 0) { newowner = civilisation_NewCivilisationOrVandals(m_owner); playerToJoin = newowner; } else { newowner = playerToJoin; } } if (orgowner != newowner) { if(g_network.IsHost()) { g_network.Block(orgowner); g_network.Enqueue(new NetInfo(NET_INFO_CODE_REVOLT_NOTICES, orgowner, newowner, m_home_city.m_id, joined_egalatarians)); g_network.Unblock(orgowner); } SlicObject *so = new SlicObject("010NewCiv"); so->AddAllRecipients(); so->AddCivilisation(orgowner); so->AddCivilisation(newowner); so->AddCity(m_home_city); g_slicEngine->Execute(so) ; if (joined_egalatarians) { so = new SlicObject("011CityJoinedYourCiv"); so->AddRecipient(newowner); so->AddCivilisation(orgowner); so->AddCivilisation(newowner); so->AddCity(m_home_city); g_slicEngine->Execute(so) ; } } if(!causeIsExternal && g_network.IsActive()) { g_network.Unblock(m_owner); } m_home_city.ResetCityOwner(newowner, FALSE, CAUSE_REMOVE_CITY_HAPPINESS_REVOLT); m_build_queue.Clear(); #if 0 AddHappyTimer(50, 100, HAPPY_REASON_POST_REVOULTION_BLISS); #endif g_theWorld->GetCell(city_pos)->GetArmy(army) ; n=army.Num() ; for (i=0; iAddEvent(GEV_INSERT_AfterCurrent, GEV_KillUnit, GEA_Unit, army[i].m_id, GEA_Int, CAUSE_REMOVE_ARMY_UPRISING, GEA_Player, newowner, GEA_End); } SpecialAttackInfoRecord const * specRec = unitutil_GetSpecialAttack(SPECATTACK_REVOLUTION); if (specRec) { sint32 const soundID = specRec->GetSoundIDIndex(); if (soundID >= 0) { sint32 const spriteID = specRec->GetSpriteID()->GetValue(); if (spriteID >= 0) { g_director->AddSpecialAttack (m_home_city.GetActor()->GetUnitID(), m_home_city, SPECATTACK_REVOLUTION); } else { sint32 const visiblePlayer = g_selected_item->GetVisiblePlayer(); if ((visiblePlayer == m_owner) || (m_home_city.GetVisibility() & (1 << visiblePlayer)) ) { g_soundManager->AddSound(SOUNDTYPE_SFX, (uint32)0, soundID, m_home_city.RetPos().x, m_home_city.RetPos().y); } } } } // Modified by kaan to address bug # 12 // Prevent city from revolting twice in the same turn. m_min_turns_revolt = static_cast (g_theConstDB->GetMinTurnsBetweenRevolt()); }
As you can see there is supposed to be a post revolution bliss and some other stuff preventing these cities from revolting over and over again. I don't think the code is broken, I think the new civ just cant handle the city after the bliss period ends.
I think we may have to do one or more of the following
- Check if Capitol exists for the new civ and create the capitol, I think the lack of the capitol makes it tough to continue
- Cut the population of the revolting city (casualties of the revolution). Large population seems to be thesource of the constant revolts.
- Create additional units that impose martial law
- Just give it to the Barbarians
- RevoltingCitiesJoinPlayer should be given to a wonder earlier in the game
- Accept it as is. I know Bureaubert has cringed. I think its kind of a nice touch. it is a bit much but never hurt my game.