diff --git a/Tactical/Handle UI.cpp b/Tactical/Handle UI.cpp index 4a552e68..44ef87b2 100644 --- a/Tactical/Handle UI.cpp +++ b/Tactical/Handle UI.cpp @@ -1238,7 +1238,7 @@ UINT32 UIHandleEnterPalEditMode( UI_EVENT *pUIEvent ) UINT32 UIHandleEndTurn( UI_EVENT *pUIEvent ) { -CHAR16 zString[128]; + CHAR16 zString[128]; // CANCEL FROM PLANNING MODE! if ( InUIPlanMode( ) ) @@ -1248,9 +1248,7 @@ CHAR16 zString[128]; // ATE: If we have an item pointer end it! CancelItemPointer( ); - - //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ ENDING_TURN ] ); - + if ( CheckForEndOfCombatMode( FALSE ) ) { // do nothing... @@ -1274,76 +1272,82 @@ CHAR16 zString[128]; SaveGame(SAVE__END_TURN_NUM, zString ); } - ////ddd оптимизация для хода драников - if ( (gTacticalStatus.uiFlags & TURNBASED) && (gTacticalStatus.uiFlags & INCOMBAT ) ) - { -//UINT32 uiStartTime, uiEndTime; -//uiStartTime = GetJA2Clock(); - - - memset( gubWorldTileInLight, FALSE, sizeof( gubWorldTileInLight ) ); - memset( gubIsCorpseThere, FALSE, sizeof( gubIsCorpseThere ) ); - memset( gubMerkCanSeeThisTile, FALSE, sizeof( gubMerkCanSeeThisTile ) ); - //развертка цикла. при изменении WORLD_MAX на др.знач. необходимо будет подчищать хвосты! ибо опасный код!!! ;) - for(INT32 i=0; istats.bLife >= OKLIFE && tS->sGridNo != NOWHERE && tS->bInSector ) + ////ddd оптимизация для хода драников + if ( (gTacticalStatus.uiFlags & TURNBASED) && (gTacticalStatus.uiFlags & INCOMBAT ) ) { - //loop through all the gridnos that we are interested in - for (sYOffset = -30; sYOffset <= 30; sYOffset++) - for (sXOffset = -30; sXOffset <= 30; sXOffset++) - { - sGridNo = tS->sGridNo + sXOffset + (MAXCOL * sYOffset); - if ( sGridNo <= 0 || sGridNo >= WORLD_MAX ) continue; - //usSightLimit = tS->GetMaxDistanceVisible(sGridNo, FALSE, CALC_FROM_WANTED_DIR); - if(gubMerkCanSeeThisTile[sGridNo]==0) - gubMerkCanSeeThisTile[sGridNo]=//SoldierToVirtualSoldierLineOfSightTest( tS, sGridNo, FALSE, ANIM_STAND, TRUE, usSightLimit ); - SoldierToVirtualSoldierLineOfSightTest( tS, sGridNo, tS->pathing.bLevel, - ANIM_STAND, TRUE, CALC_FROM_WANTED_DIR); + memset( gubWorldTileInLight, FALSE, sizeof( gubWorldTileInLight ) ); + memset( gubIsCorpseThere, FALSE, sizeof( gubIsCorpseThere ) ); + memset( gubMerkCanSeeThisTile, FALSE, sizeof( gubMerkCanSeeThisTile ) ); + + //развертка цикла. при изменении WORLD_MAX на др.знач. необходимо будет подчищать хвосты! ибо опасный код!!! ;) - }//fo - }//if -///////////////////////////////////////////////////////////////////////////// -//uiEndTime = GetJA2Clock(); -//ScreenMsg( 144,0, L"t=%d",uiEndTime - uiStartTime ); -// - } - //ddd оптимизация для хода драников** - + // WANNE: We had a custom user map (Tixa, J9), where the following loop caused an unhandled exception. + // The crash occurd at ~index 16000 when calling the method IsCorpseAtGridNo() ... + // I don't know what causes it ... + // Just try/catch (ugly, but works). + __try + { + for(UINT32 i=0; istats.bLife >= OKLIFE && tS->sGridNo != NOWHERE && tS->bInSector ) + { + //loop through all the gridnos that we are interested in + for (sYOffset = -30; sYOffset <= 30; sYOffset++) + for (sXOffset = -30; sXOffset <= 30; sXOffset++) + { + sGridNo = tS->sGridNo + sXOffset + (MAXCOL * sYOffset); + if ( sGridNo <= 0 || sGridNo >= WORLD_MAX ) + continue; + //usSightLimit = tS->GetMaxDistanceVisible(sGridNo, FALSE, CALC_FROM_WANTED_DIR); + if(gubMerkCanSeeThisTile[sGridNo]==0) + gubMerkCanSeeThisTile[sGridNo]=//SoldierToVirtualSoldierLineOfSightTest( tS, sGridNo, FALSE, ANIM_STAND, TRUE, usSightLimit ); + SoldierToVirtualSoldierLineOfSightTest( tS, sGridNo, tS->pathing.bLevel, + ANIM_STAND, TRUE, CALC_FROM_WANTED_DIR); + + }//fo + }//if + } + //ddd оптимизация для хода драников** + // End our turn! if (is_server || !is_client) { EndTurn( gbPlayerNum + 1 ); } - if(!is_server && is_client) + if(!is_server && is_client) + { + + if (INTERRUPT_QUEUED) { - - if (INTERRUPT_QUEUED) - { - EndTurn( gbPlayerNum + 1 );//is ending interrupt instead - } - else - { - send_EndTurn( netbTeam+1 );//for sending next netbteam rather than next local team - } + EndTurn( gbPlayerNum + 1 );//is ending interrupt instead } + else + { + send_EndTurn( netbTeam+1 );//for sending next netbteam rather than next local team + } + } } return( GAME_SCREEN );