From cee17f56510469ed427990f5404e2bbc07515592 Mon Sep 17 00:00:00 2001 From: Flugente Date: Tue, 18 Feb 2014 21:26:46 +0000 Subject: [PATCH] New Feature: strategic militia command allows ordering militia around in the map if someoen performs the STRATEGIC_MILITIA_MOVEMENT facility assignment. requires GameDir >= r1946 git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6943 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameVersion.h | 3 +- Strategic/Assignments.cpp | 91 +++++++++++++++- Strategic/Assignments.h | 3 + Strategic/Campaign Types.h | 1 + Strategic/Facilities.cpp | 5 +- Strategic/Game Event Hook.cpp | 4 + Strategic/Game Event Hook.h | 2 + Strategic/Map Screen Interface Map.cpp | 104 ++++++++++++++++++ Strategic/Map Screen Interface Map.h | 3 +- Strategic/MilitiaSquads.cpp | 142 ++++++++++++++++++------- Strategic/MilitiaSquads.h | 4 + Strategic/Strategic Movement.cpp | 2 +- Strategic/Strategic Movement.h | 2 + Strategic/XML_FacilityTypes.cpp | 4 + Strategic/mapscreen.cpp | 20 ++++ Strategic/strategic.cpp | 101 +++++++++++++++++- Strategic/strategic.h | 24 ++++- Strategic/strategicmap.cpp | 34 ++++-- Tactical/Faces.cpp | 5 + Utils/Text.h | 4 + Utils/_ChineseText.cpp | 17 +++ Utils/_DutchText.cpp | 17 +++ Utils/_EnglishText.cpp | 6 ++ Utils/_FrenchText.cpp | 17 +++ Utils/_GermanText.cpp | 17 +++ Utils/_ItalianText.cpp | 17 +++ Utils/_PolishText.cpp | 17 +++ Utils/_RussianText.cpp | 17 +++ Utils/_TaiwaneseText.cpp | 17 +++ 29 files changed, 643 insertions(+), 57 deletions(-) diff --git a/GameVersion.h b/GameVersion.h index 97550a00..ba5302a4 100644 --- a/GameVersion.h +++ b/GameVersion.h @@ -21,6 +21,7 @@ extern CHAR16 zTrackingNumber[16]; // Keeps track of the saved game version. Increment the saved game version whenever // you will invalidate the saved game file +#define MILITIA_MOVEMENT 152 // Flugente: allow control of strategic militia movement #define SNITCH_TRAIT_EXTENDED 151 // anv: more soldier flags, remembering exposition of snitch #define CAMPAIGNSTATS 150 // Flugente: store campaign statistics #define WALDO_CAN_REPAIR_HELICOPTER 149 // anv: have to refresh Waldo records @@ -70,7 +71,7 @@ extern CHAR16 zTrackingNumber[16]; #define AP100_SAVEGAME_DATATYPE_CHANGE 105 // Before this, we didn't have the 100AP structure changes #define NIV_SAVEGAME_DATATYPE_CHANGE 102 // Before this, we used the old structure system -#define SAVE_GAME_VERSION SNITCH_TRAIT_EXTENDED +#define SAVE_GAME_VERSION MILITIA_MOVEMENT //#define RUSSIANGOLD #ifdef __cplusplus diff --git a/Strategic/Assignments.cpp b/Strategic/Assignments.cpp index fa479880..90d17377 100644 --- a/Strategic/Assignments.cpp +++ b/Strategic/Assignments.cpp @@ -455,6 +455,9 @@ void ClearSectorScanResults(); void HandleSpreadingPropagandaInSector( INT16 sMapX, INT16 sMapY, INT8 bZ ); +// Flugente: handle militia command +void HandleMilitiaCommand(); + // is the character between secotrs in mvt BOOLEAN CharacterIsBetweenSectors( SOLDIERTYPE *pSoldier ); @@ -2425,7 +2428,7 @@ void UpdateAssignments() // handle any training HandleTrainingInSector( sX, sY, bZ ); - + // handle training of character in sector HandleRadioScanInSector( sX, sY, bZ ); @@ -2445,6 +2448,9 @@ void UpdateAssignments() } } + // Flugente: handle militia command + HandleMilitiaCommand(); + // check to see if anyone is done healing? UpdatePatientsWhoAreDoneHealing( ); @@ -5617,6 +5623,24 @@ void ClearSectorScanResults() } } +// Flugente: handle militia command +void HandleMilitiaCommand() +{ + SOLDIERTYPE *pSoldier = NULL; + UINT32 uiCnt = 0; + UINT32 firstid = gTacticalStatus.Team[ OUR_TEAM ].bFirstID; + UINT32 lastid = gTacticalStatus.Team[ OUR_TEAM ].bLastID; + for ( uiCnt = firstid, pSoldier = MercPtrs[ uiCnt ]; uiCnt <= lastid; ++uiCnt, ++pSoldier) + { + if( pSoldier && pSoldier->bAssignment == FACILITY_STRATEGIC_MILITIA_MOVEMENT && pSoldier->flags.fMercAsleep == FALSE ) + { + // every commander gets a bit of leadership and wisdom + StatChange( pSoldier, LDRAMT, 2, TRUE ); + StatChange( pSoldier, WISDOMAMT, 1, TRUE ); + } + } +} + // handle snitch spreading propaganda assignment // totally not a copy of HandleRadioScanInSector void HandleSpreadingPropagandaInSector( INT16 sMapX, INT16 sMapY, INT8 bZ ) @@ -14575,6 +14599,28 @@ void SetSoldierAssignment( SOLDIERTYPE *pSoldier, INT8 bAssignment, INT32 iParam AssignMercToAMovementGroup( pSoldier ); } break; + case FACILITY_STRATEGIC_MILITIA_MOVEMENT: + { + pSoldier->bOldAssignment = pSoldier->bAssignment; + + // remove from squad + RemoveCharacterFromSquads( pSoldier ); + + // remove from any vehicle + if( pSoldier->bOldAssignment == VEHICLE ) + { + TakeSoldierOutOfVehicle( pSoldier ); + } + + if ( pSoldier->bAssignment != bAssignment ) + { + SetTimeOfAssignmentChangeForMerc( pSoldier ); + } + + ChangeSoldiersAssignment( pSoldier, bAssignment ); + AssignMercToAMovementGroup( pSoldier ); + } + break; case( VEHICLE ): if( CanCharacterVehicle( pSoldier ) && IsThisVehicleAccessibleToSoldier( pSoldier, iParam1 ) ) { @@ -15820,6 +15866,10 @@ void ReEvaluateEveryonesNothingToDo() fNothingToDo = FALSE; break; + case FACILITY_STRATEGIC_MILITIA_MOVEMENT: + fNothingToDo = FALSE; + break; + case VEHICLE: default: // squads fNothingToDo = FALSE; @@ -16101,6 +16151,14 @@ void SetAssignmentForList( INT8 bAssignment, INT8 bParam ) fItWorked = TRUE; } break; + case FACILITY_STRATEGIC_MILITIA_MOVEMENT: + if( CanCharacterFacility( pSoldier, bParam, FAC_STRATEGIC_MILITIA_MOVEMENT ) ) + { + pSoldier->bOldAssignment = pSoldier->bAssignment; + SetSoldierAssignment( pSoldier, FACILITY_STRATEGIC_MILITIA_MOVEMENT, bParam, 0,0 ); + fItWorked = TRUE; + } + break; case( SQUAD_1 ): case( SQUAD_2 ): case( SQUAD_3 ): @@ -18605,9 +18663,16 @@ BOOLEAN CanCharacterFacility( SOLDIERTYPE *pSoldier, UINT8 ubFacilityType, UINT8 } } + /*if ( ubAssignmentType == FAC_STRATEGIC_MILITIA_MOVEMENT ) + { + if( !CanCharacterGatherInformation(pSoldier) ) + { + return( FALSE ); + } + }*/ + // If we've reached this, then all is well. return( TRUE ); - } INT8 CountFreeFacilitySlots( UINT8 sMapX, UINT8 sMapY, UINT8 ubFacilityType ) @@ -19632,6 +19697,9 @@ void FacilityAssignmentMenuBtnCallback ( MOUSE_REGION * pRegion, INT32 iReason ) case FAC_GATHER_RUMOURS: ChangeSoldiersAssignment( pSoldier, FACILITY_GATHER_RUMOURS ); break; + case FAC_STRATEGIC_MILITIA_MOVEMENT: + ChangeSoldiersAssignment( pSoldier, FACILITY_STRATEGIC_MILITIA_MOVEMENT ); + break; } // Flugente: I guess this piece of code is here to get a group Id for the soldier, which must not be there for movement specifically. Just my understanding, in case anybody else coming here wonders @@ -20408,4 +20476,21 @@ void MoveItemMenuMvtCallback(MOUSE_REGION * pRegion, INT32 iReason ) // unhighlight all strings in box UnHighLightBox( ghMoveItemBox ); } -} \ No newline at end of file +} + +BOOLEAN MercStaffsMilitaryHQ() +{ + SOLDIERTYPE *pSoldier = NULL; + UINT32 uiCnt = 0; + UINT32 firstid = gTacticalStatus.Team[ OUR_TEAM ].bFirstID; + UINT32 lastid = gTacticalStatus.Team[ OUR_TEAM ].bLastID; + for ( uiCnt = firstid, pSoldier = MercPtrs[ uiCnt ]; uiCnt <= lastid; ++uiCnt, ++pSoldier) + { + if( pSoldier && pSoldier->bAssignment == FACILITY_STRATEGIC_MILITIA_MOVEMENT && pSoldier->flags.fMercAsleep == FALSE ) + { + return TRUE; + } + } + + return FALSE; +} diff --git a/Strategic/Assignments.h b/Strategic/Assignments.h index 2ffd4216..872e46ca 100644 --- a/Strategic/Assignments.h +++ b/Strategic/Assignments.h @@ -78,6 +78,7 @@ enum FACILITY_GATHER_RUMOURS, SNITCH_SPREAD_PROPAGANDA, SNITCH_GATHER_RUMOURS, + FACILITY_STRATEGIC_MILITIA_MOVEMENT, // Flugente: merc staffs a military HQ, we can now control militia movement on the map NUM_ASSIGNMENTS, }; @@ -451,6 +452,8 @@ UINT32 HandlePropagandaBlockingBadNewsInTown( INT8 bTownId, UINT32 uiLoyaltyDecr void HandleGatheringInformationBySoldier( SOLDIERTYPE* pSoldier ); +BOOLEAN MercStaffsMilitaryHQ(); + #endif diff --git a/Strategic/Campaign Types.h b/Strategic/Campaign Types.h index 7cb761d4..c0018d4c 100644 --- a/Strategic/Campaign Types.h +++ b/Strategic/Campaign Types.h @@ -191,6 +191,7 @@ enum FAC_SPREAD_PROPAGANDA, FAC_SPREAD_PROPAGANDA_GLOBAL, FAC_GATHER_RUMOURS, + FAC_STRATEGIC_MILITIA_MOVEMENT, NUM_FACILITY_ASSIGNMENTS, }; diff --git a/Strategic/Facilities.cpp b/Strategic/Facilities.cpp index 8eaef3f6..a48bbc75 100644 --- a/Strategic/Facilities.cpp +++ b/Strategic/Facilities.cpp @@ -769,7 +769,7 @@ INT8 GetSoldierFacilityAssignmentIndex( SOLDIERTYPE *pSoldier ) bAssignment == IN_TRANSIT || bAssignment == TRAIN_TOWN || bAssignment == TRAIN_MOBILE || - ( bAssignment > FACILITY_REST && ( bAssignment < FACILITY_PRISON_SNITCH || bAssignment > FACILITY_GATHER_RUMOURS ) )) + ( bAssignment > FACILITY_REST && bAssignment != FACILITY_STRATEGIC_MILITIA_MOVEMENT && ( bAssignment < FACILITY_PRISON_SNITCH || bAssignment > FACILITY_GATHER_RUMOURS ) )) { // Soldier is performing a distinctly NON-FACILITY assignment. return (-1); @@ -933,6 +933,9 @@ INT8 GetSoldierFacilityAssignmentIndex( SOLDIERTYPE *pSoldier ) case FACILITY_GATHER_RUMOURS: bAssignmentIndex = FAC_GATHER_RUMOURS; break; + case FACILITY_STRATEGIC_MILITIA_MOVEMENT: + bAssignmentIndex = FAC_STRATEGIC_MILITIA_MOVEMENT; + break; default: bAssignmentIndex = -1; break; diff --git a/Strategic/Game Event Hook.cpp b/Strategic/Game Event Hook.cpp index e39cfb8e..00b90ed8 100644 --- a/Strategic/Game Event Hook.cpp +++ b/Strategic/Game Event Hook.cpp @@ -44,6 +44,7 @@ #include "laptop.h" #include "Campaign.h" #include "PostalService.h" + #include "MilitiaSquads.h" #endif #include "connect.h" @@ -505,6 +506,9 @@ BOOLEAN ExecuteStrategicEvent( STRATEGICEVENT *pEvent ) CrippledVersionEndGameCheck(); break; #endif + case EVENT_MILITIA_MOVEMENT_ORDER: + MilitiaMovementOrder( (UINT8) pEvent->uiParam ); + break; } gfPreventDeletionOfAnyEvent = fOrigPreventFlag; return TRUE; diff --git a/Strategic/Game Event Hook.h b/Strategic/Game Event Hook.h index ba30d008..ee920fa4 100644 --- a/Strategic/Game Event Hook.h +++ b/Strategic/Game Event Hook.h @@ -112,6 +112,8 @@ enum EVENT_HELICOPTER_HOVER_FOR_A_MINUTE, EVENT_HELICOPTER_REFUEL_FOR_A_MINUTE, + EVENT_MILITIA_MOVEMENT_ORDER, // Flugente: timed event: militia was ordered to move, at this time they should arrive + NUMBER_OF_EVENT_TYPES_PLUS_ONE, NUMBER_OF_EVENT_TYPES = NUMBER_OF_EVENT_TYPES_PLUS_ONE - 1 }; diff --git a/Strategic/Map Screen Interface Map.cpp b/Strategic/Map Screen Interface Map.cpp index fb2fbd74..c26bc3fa 100644 --- a/Strategic/Map Screen Interface Map.cpp +++ b/Strategic/Map Screen Interface Map.cpp @@ -3741,7 +3741,108 @@ void ShowEnemyGroupsInMotion( INT16 sX, INT16 sY ) } curr = curr->next; } +} +// Flugente: show militia movement +void ShowMilitiaInMotion( INT16 sX, INT16 sY ) +{ + INT32 sExiting = 0; + INT32 sEntering = 0; + INT16 sDest = 0; + INT16 sSource = 0; + INT16 sOffsetX = 0, sOffsetY = 0; + INT16 sXPosition = 0, sYPosition = 0; + INT32 iCounter = 0; + HVOBJECT hIconHandle; + INT16 sTextXOffset = 0; + INT16 sTextYOffset = 0; + INT32 iWidth = 0, iHeight = 0; + INT32 iDeltaXForError = 0, iDeltaYForError = 0; + + if( iCurrentMapSectorZ ) + return; + + SECTORINFO *pSectorInfo = &( SectorInfo[ SECTOR( sX, sY ) ] ); + + if ( !CountMilitia(pSectorInfo) ) + return; + + if ( ( StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags & MILITIA_MOVE_ALLDIRS ) == 0 ) + return; + + // show the icons for people in motion from this sector to the next guy over + + INT16 iX = sX, iY = sY; + UINT8 ubDirection = 0; + + GetVideoObject(&hIconHandle, guiENEMYBETWEENSECTORICONS ); + + INT16 iconOffsetX = 0; + INT16 iconOffsetY = 0; + + if ( StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags & MILITIA_MOVE_NORTH ) + { + ubDirection = 4; + sOffsetX = (MAP_GRID_X / 2); + sOffsetY = 0; + iconOffsetX = -(hIconHandle->pETRLEObject[ubDirection].usWidth / 2); + iconOffsetY = -(hIconHandle->pETRLEObject[ubDirection].usHeight); + } + else if ( StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags & MILITIA_MOVE_EAST ) + { + ubDirection = 5; + sOffsetX = MAP_GRID_X; + sOffsetY = (MAP_GRID_Y / 2); + iconOffsetY = -(hIconHandle->pETRLEObject[ubDirection].usHeight / 2); + } + else if ( StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags & MILITIA_MOVE_SOUTH ) + { + ubDirection = 6; + sOffsetX = (MAP_GRID_X / 2); + sOffsetY = MAP_GRID_Y; + iconOffsetX = -(hIconHandle->pETRLEObject[ubDirection].usWidth / 2); + } + else if ( StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags & MILITIA_MOVE_WEST ) + { + ubDirection = 7; + sOffsetX = 0; + sOffsetY = (MAP_GRID_Y / 2); + iconOffsetX = -(hIconHandle->pETRLEObject[ubDirection].usWidth); + iconOffsetY = -(hIconHandle->pETRLEObject[ubDirection].usHeight / 2); + } + + if (iResolution >= _1024x768 ) + { + iconOffsetY -= 1; + } + + iX = MAP_VIEW_START_X+( sX * MAP_GRID_X ) + sOffsetX + iconOffsetX; + iY = MAP_VIEW_START_Y + ( sY * MAP_GRID_Y ) + sOffsetY + iconOffsetY; + + BltVideoObject(guiSAVEBUFFER, hIconHandle, ubDirection , ( INT16 ) iX, ( INT16 ) iY , VO_BLT_SRCTRANSPARENCY, NULL ); + + iWidth = 12; + iHeight = 7; + + // error correction for scrolling with people on the move + if( iX < 0 ) + { + iDeltaXForError = 0 - iX; + iWidth -= iDeltaXForError; + iX = 0; + } + + if( iY < 0 ) + { + iDeltaYForError = 0 - iY; + iHeight -= iDeltaYForError; + iY = 0; + } + + if( ( iWidth > 0 )&&( iHeight > 0 ) ) + { + RestoreExternBackgroundRect( iX, iY, ( INT16 )iWidth, ( INT16 )iHeight ); + } } void DisplayDistancesForHelicopter( void ) @@ -6389,6 +6490,9 @@ void HandleShowingOfEnemyForcesInSector( INT16 sSectorX, INT16 sSectorY, INT8 bS return; } + // Flugente: show militia in motion + ShowMilitiaInMotion( sSectorX, sSectorY ); + // get total number of badguys here sNumberOfEnemies = NumEnemiesInSector( sSectorX, sSectorY ); diff --git a/Strategic/Map Screen Interface Map.h b/Strategic/Map Screen Interface Map.h index de6a977e..a0dd5469 100644 --- a/Strategic/Map Screen Interface Map.h +++ b/Strategic/Map Screen Interface Map.h @@ -110,6 +110,7 @@ void RestoreClipRegionToFullScreenForRectangle( UINT32 uiDestPitchBYTES ); // show the icons for people in motion void ShowPeopleInMotion( INT16 sX, INT16 sY ); void ShowEnemyGroupsInMotion( INT16 sX, INT16 sY); +void ShowMilitiaInMotion( INT16 sX, INT16 sY); // added by Flugente // last sector in helicopter's path INT16 GetLastSectorOfHelicoptersPath( void ); @@ -298,7 +299,7 @@ extern SGPRect MapScreenRect; extern BOOLEAN fDrawTempHeliPath; // selected destination char -extern INT8 bSelectedDestChar; +extern INT8 bSelectedDestChar; // current assignment character extern INT8 bSelectedAssignChar; diff --git a/Strategic/MilitiaSquads.cpp b/Strategic/MilitiaSquads.cpp index 38c0d1fa..65175550 100644 --- a/Strategic/MilitiaSquads.cpp +++ b/Strategic/MilitiaSquads.cpp @@ -464,7 +464,7 @@ void GenerateMilitiaSquad(INT16 sMapX, INT16 sMapY, INT16 sTMapX, INT16 sTMapY, } // Creates militia at destination sector and removes it from starting sector -void MoveMilitiaSquad(INT16 sMapX, INT16 sMapY, INT16 sTMapX, INT16 sTMapY, BOOLEAN fAlternativeMax ) +void MoveMilitiaSquad(INT16 sMapX, INT16 sMapY, INT16 sTMapX, INT16 sTMapY, BOOLEAN fAlternativeMax, BOOLEAN fSkipSpreading ) { SECTORINFO *pSectorInfo = &( SectorInfo[ SECTOR( sMapX, sMapY ) ] ); SECTORINFO *pTSectorInfo = &( SectorInfo[ SECTOR( sTMapX, sTMapY ) ] ); @@ -476,13 +476,13 @@ void MoveMilitiaSquad(INT16 sMapX, INT16 sMapY, INT16 sTMapX, INT16 sTMapY, BOOL UINT8 bTotalGreensPercent = 0, bTotalRegularsPercent = 0, bTotalElitesPercent = 0; INT8 bNewSourceGroupSize = 0, bNewDestGroupSize = 0, bGroupSizeRatio = 0; UINT8 ubChanceToSpreadOut; - + ////////////////////////////////////////////////////////// // We begin by determining the group's chance to "spread out" into the next sector rather // than moving in en-masse. This is mainly affected by the presence of enemies. // Is the target a city or SAM site? - if (IsThisSectorASAMSector( sTMapX, sTMapY, 0 ) || + if (fSkipSpreading || IsThisSectorASAMSector( sTMapX, sTMapY, 0 ) || ( GetTownIdForSector( sTMapX, sTMapY ) != BLANK_SECTOR && gfMilitiaAllowedInTown[GetTownIdForSector( sTMapX, sTMapY )] )) { @@ -1421,13 +1421,78 @@ void ClearBlockMoveList() BOOLEAN CheckInBlockMoveList(INT16 sMapX, INT16 sMapY) { - UINT16 i; - for( i = 0; i < uiBlockMoveListPointer ; ++i) - if( sMapX == SECTORX(pBlockMoveList[i]) && sMapY == SECTORY(pBlockMoveList[i]) )return TRUE; + for( UINT16 i = 0; i < uiBlockMoveListPointer ; ++i) + { + if( sMapX == SECTORX(pBlockMoveList[i]) && sMapY == SECTORY(pBlockMoveList[i]) ) + return TRUE; + } return FALSE; } +void MilitiaMovementOrder(UINT8 sector) +{ + INT16 sX = SECTORX(sector); + INT16 sY = SECTORY(sector); + + // if we are in gamescreen and a battle is going on, and this is the sector that militia moves from, don't move them. Suddenly disappearing would be... awkward + if ( guiCurrentScreen == GAME_SCREEN && gTacticalStatus.uiFlags & INCOMBAT && gWorldSectorX == sX && gWorldSectorY == sY && !gbWorldSectorZ ) + { + // remove all movement flags + StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags &= ~MILITIA_MOVE_ALLDIRS; + return; + } + + // to stop the player from just setting someone in HQ to give orders and then reassigning them, we simply demand that there'll also be someone when the militia peform the travelling + if ( !MercStaffsMilitaryHQ() ) + { + // remove all movement flags + StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags &= ~MILITIA_MOVE_ALLDIRS; + return; + } + + INT16 targetX = sX; + INT16 targetY = sY; + + if ( StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags & MILITIA_MOVE_NORTH ) + --targetY; + else if ( StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags & MILITIA_MOVE_WEST ) + --targetX; + else if ( StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags & MILITIA_MOVE_EAST ) + ++targetX; + else if ( StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags & MILITIA_MOVE_SOUTH ) + ++targetY; + + // remove all movement flags + StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags &= ~MILITIA_MOVE_ALLDIRS; + + UINT8 targetsector = SECTOR(targetX, targetY); + + if ( gGameExternalOptions.gflimitedRoaming && !IsSectorRoamingAllowed(targetsector) ) + return; + + // if militia moves from the currently loaded sector, it has to drop all gear first + if ( gGameExternalOptions.fMilitiaUseSectorInventory && gWorldSectorX == sX && gWorldSectorY == sY && !gbWorldSectorZ ) + { + TeamDropAll( MILITIA_TEAM ); + } + + MoveMilitiaSquad( sX, sY, targetX, targetY, FALSE, TRUE ); + + if ( gfStrategicMilitiaChangesMade) + ResetMilitia(); + + if( NumEnemiesInSector( targetX, targetY ) ) + { + //Moa: handle deserters before moving in hostile territory + MobileMilitiaDeserters( targetX, targetY, TRUE, TRUE ); + + gfMSBattle = TRUE; + + EnterAutoResolveMode( targetX, targetY ); + } +} + void UpdateMilitiaSquads(INT16 sMapX, INT16 sMapY ) { UINT16 pMoveDir[4][3]; @@ -1456,11 +1521,13 @@ void UpdateMilitiaSquads(INT16 sMapX, INT16 sMapY ) gfMSBattle = FALSE; } - if( CheckInBlockMoveList( sMapX, sMapY ) )return; + if( CheckInBlockMoveList( sMapX, sMapY ) ) + return; uiMilitiaCount = CountMilitia(pSectorInfo); - if( !uiMilitiaCount )return; + if( !uiMilitiaCount ) + return; // Kaiden: Moved Create Militia code into CreateMilitiaSquads // Removed the code from here and added the procedure call @@ -1469,19 +1536,21 @@ void UpdateMilitiaSquads(INT16 sMapX, INT16 sMapY ) if( (!gGameExternalOptions.gfmusttrainroaming) && ( GetTownIdForSector( sMapX, sMapY ) != BLANK_SECTOR ) ) { - if (GetWorldDay( ) < gGameExternalOptions.guiAllowMilitiaGroupsDelay) - return; - - if( GetWorldHour() % gGameExternalOptions.guiCreateEachNHours ) - return; - - CreateMilitiaSquads( sMapX, sMapY ); - if (gfStrategicMilitiaChangesMade) + // Flugente: only enter this if the time is correct (but do not return if it isn't, we still might do the movement part) + if (GetWorldDay( ) < gGameExternalOptions.guiAllowMilitiaGroupsDelay && GetWorldHour() % gGameExternalOptions.guiCreateEachNHours ) { - ResetMilitia(); + CreateMilitiaSquads( sMapX, sMapY ); + if (gfStrategicMilitiaChangesMade) + { + ResetMilitia(); + } } } + // Flugente: if we can order militia directly, don't have them wander around at random + if ( !MercStaffsMilitaryHQ() ) + return; + // HEADROCK HAM B2.7: If INI flag is set, allow militia to move out of Minor City sectors (Orta, Tixa, San Mona, etc). if (gGameExternalOptions.fAllowMilitiaMoveThroughMinorCities) fSourceCityAllowsRoaming = ( !gfMilitiaAllowedInTown[GetTownIdForSector( sMapX, sMapY )] ); @@ -1493,14 +1562,16 @@ void UpdateMilitiaSquads(INT16 sMapX, INT16 sMapY ) { if( !gGameExternalOptions.gfAllowMilitiaFollowPlayer || !PlayerMercsInSector_MSE( (UINT8)sMapX, (UINT8)sMapY, FALSE ) ) // and there's no player's mercs in the sector, or they are not forced to follow { - if( GetWorldHour() % 2 )return; + if( GetWorldHour() % 2 ) + return; memset(pMoveDir, 0, sizeof(pMoveDir)); GenerateDirectionInfos( sMapX, sMapY, &uiDirNumber, pMoveDir, FALSE, FALSE ); if( uiDirNumber ) { - for( x = 1; x < uiDirNumber ; ++x )pMoveDir[x][1] += pMoveDir[x-1][1]; + for( x = 1; x < uiDirNumber ; ++x ) + pMoveDir[x][1] += pMoveDir[x-1][1]; // ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%ld,%ld", x, pMoveDir[x][1]); // HEADROCK HAM 3.6: Too many INI settings. Removed a couple, including MIN/MAX SQUAD SIZE. @@ -1508,12 +1579,12 @@ void UpdateMilitiaSquads(INT16 sMapX, INT16 sMapY ) // ( uiMilitiaCount >= gGameExternalOptions.guiMinMilitiaSquadSize ? CHANCE_TO_MOVE_A_SQUAD : CHANCE_TO_MOVE_AN_UNFULL_SQUAD ) ); iRandom = Random( pMoveDir[ uiDirNumber - 1 ][1] ); - //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Roll %ld", iRandomRes); iRandomRes = 256; for( x = 0; x < uiDirNumber; ++x) + { if( iRandom < pMoveDir[x][1] ) { iRandomRes = x; @@ -1544,11 +1615,11 @@ void UpdateMilitiaSquads(INT16 sMapX, INT16 sMapY ) } // WDS bug fix for moving militia - int targetX = SECTORX( pMoveDir[ iRandomRes ][0] ); - int targetY = SECTORY( pMoveDir[ iRandomRes ][0] ); + INT16 targetX = SECTORX( pMoveDir[ iRandomRes ][0] ); + INT16 targetY = SECTORY( pMoveDir[ iRandomRes ][0] ); Assert(targetX >= 0 && targetX < MAP_WORLD_X); Assert(targetY >= 0 && targetY < MAP_WORLD_Y); - MoveMilitiaSquad( sMapX, sMapY, targetX, targetY, FALSE ); + MoveMilitiaSquad( sMapX, sMapY, targetX, targetY, FALSE, FALSE ); if ( gfStrategicMilitiaChangesMade) { @@ -1575,23 +1646,23 @@ void UpdateMilitiaSquads(INT16 sMapX, INT16 sMapY ) //Moa: handle deserters before moving in hostile territory MobileMilitiaDeserters( targetX, targetY, TRUE, TRUE ); - gfMSBattle = TRUE; + gfMSBattle = TRUE; - // GroupArrivedAtSector( pEnemyGroup->ubGroupID , TRUE, FALSE ); - EnterAutoResolveMode( targetX, targetY ); + // GroupArrivedAtSector( pEnemyGroup->ubGroupID , TRUE, FALSE ); + EnterAutoResolveMode( targetX, targetY ); // } } + } } - else return; } } } - // Kaiden: Roaming Militia Training: - // If we're training roaming militia, - // we'll get our squad from here: - // Don't need to check for delay, as this function won't be - // called if there is a delay set. +// Kaiden: Roaming Militia Training: +// If we're training roaming militia, +// we'll get our squad from here: +// Don't need to check for delay, as this function won't be +// called if there is a delay set. void CreateMilitiaSquads(INT16 sMapX, INT16 sMapY ) { // Variables for Direction Rating checks @@ -1690,7 +1761,7 @@ void CreateMilitiaSquads(INT16 sMapX, INT16 sMapY ) } } } - iCounter++; + ++iCounter; } } @@ -1718,7 +1789,7 @@ void CreateMilitiaSquads(INT16 sMapX, INT16 sMapY ) // Check for enemies in target sector if( NumEnemiesInSector( sTMapX, sTMapY ) ) - { + { // Initiave battle gfMSBattle = TRUE; EnterAutoResolveMode( sTMapX, sTMapY ); @@ -1742,7 +1813,6 @@ void CreateMilitiaSquads(INT16 sMapX, INT16 sMapY ) } } } - return; } @@ -1976,7 +2046,7 @@ void MilitiaFollowPlayer( INT16 sMapX, INT16 sMapY, INT16 sDMapX, INT16 sDMapY ) IsThisSectorASAMSector( sDMapX, sDMapY, 0 ) )return; - MoveMilitiaSquad( sMapX, sMapY, sDMapX, sDMapY, FALSE ); + MoveMilitiaSquad( sMapX, sMapY, sDMapX, sDMapY, FALSE, FALSE ); } diff --git a/Strategic/MilitiaSquads.h b/Strategic/MilitiaSquads.h index c7c69459..2b67bf92 100644 --- a/Strategic/MilitiaSquads.h +++ b/Strategic/MilitiaSquads.h @@ -14,6 +14,10 @@ extern UINT8 guiDirNumber; // Updates movement orders for militia squads void UpdateMilitiaSquads(INT16 sMapX, INT16 sMapY ); + +// Flugente: militia in this sector is ordered to move according to flags that were applied to it prior +void MilitiaMovementOrder(UINT8 sector); + // Kaiden: creates militia squad in an adjacent sector // to the coordinates you pass to it. void CreateMilitiaSquads(INT16 sMapX, INT16 sMapY ); diff --git a/Strategic/Strategic Movement.cpp b/Strategic/Strategic Movement.cpp index 470d4859..6a2eb87d 100644 --- a/Strategic/Strategic Movement.cpp +++ b/Strategic/Strategic Movement.cpp @@ -3059,7 +3059,7 @@ INT32 FindTravelTimeBetweenWaypoints( WAYPOINT * pSource, WAYPOINT * pDest, GROU -#define FOOT_TRAVEL_TIME 89 +//#define FOOT_TRAVEL_TIME 89 // Flugente: moved to header #define CAR_TRAVEL_TIME 30 #define TRUCK_TRAVEL_TIME 32 #define TRACKED_TRAVEL_TIME 46 diff --git a/Strategic/Strategic Movement.h b/Strategic/Strategic Movement.h index db00d846..7fd20759 100644 --- a/Strategic/Strategic Movement.h +++ b/Strategic/Strategic Movement.h @@ -35,6 +35,8 @@ enum THROUGH_STRATEGIC_MOVE }; +#define FOOT_TRAVEL_TIME 89 + //This structure contains all of the information about a group moving in the strategic //layer. This includes all troops, equipment, and waypoints, and location. //NOTE: This is used for groups that are initiating a movement to another sector. diff --git a/Strategic/XML_FacilityTypes.cpp b/Strategic/XML_FacilityTypes.cpp index 2c459012..32e9412d 100644 --- a/Strategic/XML_FacilityTypes.cpp +++ b/Strategic/XML_FacilityTypes.cpp @@ -852,6 +852,10 @@ facilitytypeEndElementHandle(void *userData, const XML_Char *name) { //pData->curAssignmentType = (INT16) atol(pData->szCharData); pData->curAssignmentType = FAC_GATHER_RUMOURS; + } + else if (strcmp(pData->szCharData, "STRATEGIC_MILITIA_MOVEMENT") == 0) + { + pData->curAssignmentType = FAC_STRATEGIC_MILITIA_MOVEMENT; } else { diff --git a/Strategic/mapscreen.cpp b/Strategic/mapscreen.cpp index d85ef36f..feadbbf0 100644 --- a/Strategic/mapscreen.cpp +++ b/Strategic/mapscreen.cpp @@ -7438,6 +7438,11 @@ void GetMapKeyboardInput( UINT32 *puiNewEvent ) //activate autoresolve in prebattle interface. ActivatePreBattleAutoresolveAction(); } + // Flugente: militia orders + else if ( SetMilitiaMovementOrder(sSelMapX, sSelMapY, iCurrentMapSectorZ, MILITIA_MOVE_WEST) ) + { + ; + } else { // only handle border button keyboard equivalents if the button is visible! @@ -7491,6 +7496,11 @@ void GetMapKeyboardInput( UINT32 *puiNewEvent ) TestDumpStatChanges(); } #endif + // Flugente: militia orders + if ( SetMilitiaMovementOrder(sSelMapX, sSelMapY, iCurrentMapSectorZ, MILITIA_MOVE_EAST) ) + { + ; + } break; case 'D': @@ -7950,6 +7960,11 @@ void GetMapKeyboardInput( UINT32 *puiNewEvent ) gfSaveGame = TRUE; RequestTriggerExitFromMapscreen( MAP_EXIT_TO_SAVE ); } + // Flugente: militia orders + else if ( SetMilitiaMovementOrder(sSelMapX, sSelMapY, iCurrentMapSectorZ, MILITIA_MOVE_SOUTH) ) + { + ; + } else if(gGameExternalOptions.fEnableInventoryPoolQ && fShowMapInventoryPool == TRUE)//dnl ch51 081009 { SortInventoryPoolQ(); @@ -8192,6 +8207,11 @@ void GetMapKeyboardInput( UINT32 *puiNewEvent ) else if( fCtrl ) { } + // Flugente: militia orders + else if ( SetMilitiaMovementOrder(sSelMapX, sSelMapY, iCurrentMapSectorZ, MILITIA_MOVE_NORTH) ) + { + ; + } else { // only handle border button keyboard equivalents if the button is visible! diff --git a/Strategic/strategic.cpp b/Strategic/strategic.cpp index 9a683226..41870e13 100644 --- a/Strategic/strategic.cpp +++ b/Strategic/strategic.cpp @@ -16,6 +16,10 @@ #include "Vehicles.h" #include "Game Clock.h" #include "CampaignStats.h" // added by Flugente + #include "militiasquads.h" // added by Flugente + #include "Game Event Hook.h" // added by Flugente + #include "message.h" // added by Flugente + #include "Text.h" // added by Flugente #endif #ifdef JA2UB @@ -160,7 +164,98 @@ void HandleSoldierDeadComments( SOLDIERTYPE *pSoldier ) #endif } - - - return; } + +BOOLEAN SetMilitiaMovementOrder(INT16 sX, INT16 sY, INT8 sZ, UINT32 dir) +{ + // militia can only move on the surface + if ( sZ ) + return FALSE; + + SECTORINFO *pSectorInfo = &( SectorInfo[ SECTOR( sX, sY ) ] ); + + // militia needs to be here... + if ( !CountMilitia(pSectorInfo) ) + return FALSE; + + // in order to give movement orders, we need a merc to staff a military headquarter + if ( !MercStaffsMilitaryHQ() ) + return FALSE; + + INT16 newX = sX; + INT16 newY = sY; + UINT8 movetype = THROUGH_STRATEGIC_MOVE; + + switch (dir) + { + case MILITIA_MOVE_NORTH: + --newY; + movetype = NORTH_STRATEGIC_MOVE; + break; + + case MILITIA_MOVE_WEST: + --newX; + movetype = WEST_STRATEGIC_MOVE; + break; + + case MILITIA_MOVE_EAST: + ++newX; + movetype = EAST_STRATEGIC_MOVE; + break; + + case MILITIA_MOVE_SOUTH: + ++newY; + movetype = SOUTH_STRATEGIC_MOVE; + break; + + default: + return FALSE; + break; + } + + if ( gGameExternalOptions.gflimitedRoaming && !IsSectorRoamingAllowed( SECTOR(newX, newY) ) ) + { + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, gpStrategicString[STR_MILITIAMOVEMENT_NO_LIMITEDROAMING] ); + return FALSE; + } + + UINT8 ubTraverseType = SectorInfo[ SECTOR(sX, sY) ].ubTraversability[ movetype ]; + + if( ubTraverseType == GROUNDBARRIER || ubTraverseType == EDGEOFWORLD ) + return FALSE; + + UINT32 ubTraverseMod = 0; + + switch( ubTraverseType ) + { + case TOWN: ubTraverseMod = 1780;break; + case ROAD: ubTraverseMod = 100;break; + case PLAINS: ubTraverseMod = 85; break; + case SAND: ubTraverseMod = 50; break; + case SPARSE: ubTraverseMod = 70; break; + case DENSE: ubTraverseMod = 60; break; + case SWAMP: ubTraverseMod = 35; break; + case WATER: ubTraverseMod = 25; break; + case HILLS: ubTraverseMod = 50; break; + case NS_RIVER: ubTraverseMod = 25; break; + case EW_RIVER: ubTraverseMod = 25; break; + } + + if( ubTraverseMod ) + { + UINT32 timeneeded = FOOT_TRAVEL_TIME * 100 / ubTraverseMod; + + SECTORINFO *pSectorInfo = &( SectorInfo[ SECTOR( sX, sY ) ] ); + + StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags &= ~MILITIA_MOVE_ALLDIRS; + StrategicMap[ sX + ( sY * MAP_WORLD_X ) ].usFlags |= dir; + + AddStrategicEvent( EVENT_MILITIA_MOVEMENT_ORDER, GetWorldTotalMin() + timeneeded, SECTOR( sX, sY ) ); + + fMapPanelDirty = TRUE; + + return TRUE; + } + + return FALSE; +} \ No newline at end of file diff --git a/Strategic/strategic.h b/Strategic/strategic.h index cfe6ad32..ae3a9a2c 100644 --- a/Strategic/strategic.h +++ b/Strategic/strategic.h @@ -9,15 +9,18 @@ struct strategicmapelement{ UINT8 UNUSEDuiFootEta[4]; // eta/mvt costs for feet UINT8 UNUSEDuiVehicleEta[4]; // eta/mvt costs for vehicles - UINT8 uiBadFootSector[4]; // blocking mvt for foot - UINT8 uiBadVehicleSector[4]; // blocking mvt from vehicles + UINT8 uiBadFootSector[4]; // blocking mvt for foot + UINT8 uiBadVehicleSector[4]; // blocking mvt from vehicles INT8 bNameId; - BOOLEAN fEnemyControlled; // enemy controlled or not + BOOLEAN fEnemyControlled; // enemy controlled or not BOOLEAN fEnemyAirControlled; BOOLEAN UNUSEDfLostControlAtSomeTime; - INT8 bSAMCondition; // SAM Condition .. 0 - 100, just like an item's status + INT8 bSAMCondition; // SAM Condition .. 0 - 100, just like an item's status + + INT8 bFillupforPadding[ 3 ]; // necessary for padding + UINT32 usFlags; // Flugente: various flags INT8 bPadding[ 20 ]; -} ; +}; enum { @@ -33,6 +36,15 @@ enum INSERTION_CODE_CENTER, }; +// -------- added by Flugente: various item flags -------- +// flags used for various properties (easier than adding 32 differently named variables). DO NOT CHANGE THEM, UNLESS YOU KNOW WHAT YOU ARE DOING!!! +#define MILITIA_MOVE_NORTH 0x00000001 //1 // movement directions for ordering militia on the strategic map +#define MILITIA_MOVE_WEST 0x00000002 //2 +#define MILITIA_MOVE_EAST 0x00000004 //4 +#define MILITIA_MOVE_SOUTH 0x00000008 //8 + +#define MILITIA_MOVE_ALLDIRS 0x0000000F // 15 +// ------------------------------------------------------- //PLEASE USE CALCULATE_STRATEGIC_INDEX() macro instead (they're identical). //#define GETWORLDMAPNO( x, y ) ( x+(MAP_WORLD_X*y) ) @@ -46,4 +58,6 @@ void HandleSoldierDeadComments( SOLDIERTYPE *pSoldier ); BOOLEAN HandleStrategicDeath( SOLDIERTYPE *pSoldier ); +BOOLEAN SetMilitiaMovementOrder(INT16 sX, INT16 sY, INT8 sZ, UINT32 dir); + #endif \ No newline at end of file diff --git a/Strategic/strategicmap.cpp b/Strategic/strategicmap.cpp index 9f97e1bf..dfc1d3ba 100644 --- a/Strategic/strategicmap.cpp +++ b/Strategic/strategicmap.cpp @@ -103,6 +103,7 @@ #include "Explosion Control.h" #include "Auto Resolve.h" #include "cursors.h" + #include "GameVersion.h" #endif #include "LuaInitNPCs.h" @@ -5306,16 +5307,38 @@ BOOLEAN SaveStrategicInfoToSavedFile( HWFILE hFile ) BOOLEAN LoadStrategicInfoFromSavedFile( HWFILE hFile ) { UINT32 uiNumBytesRead=0; - UINT32 uiSize = sizeof( StrategicMapElement ) * ( MAP_WORLD_X * MAP_WORLD_Y ); + UINT32 uiSize = sizeof( StrategicMapElement ); - // Load the strategic map information - FileRead( hFile, StrategicMap, uiSize, &uiNumBytesRead ); - if( uiNumBytesRead != uiSize) + if ( guiCurrentSaveGameVersion >= MILITIA_MOVEMENT ) { - return(FALSE); + for(UINT16 i = 0; i < MAP_WORLD_X * MAP_WORLD_Y; ++i) + { + // Load the strategic map information + FileRead( hFile, &StrategicMap[i], uiSize, &uiNumBytesRead ); + if( uiNumBytesRead != uiSize) + { + return(FALSE); + } + } } + else + { + uiSize = 41; + for(UINT16 i = 0; i < MAP_WORLD_X * MAP_WORLD_Y; ++i) + { + // Load the strategic map information + FileRead( hFile, &StrategicMap[i], uiSize, &uiNumBytesRead ); + if( uiNumBytesRead != uiSize) + { + return(FALSE); + } + + StrategicMap[i].usFlags = 0; + } + } + // Load the Sector Info for (int sectorID = 0; sectorID <= 255; ++ sectorID) { FileRead( hFile, &SectorInfo[sectorID], sizeof( SECTORINFO ), &uiNumBytesRead ); @@ -5348,7 +5371,6 @@ BOOLEAN LoadStrategicInfoFromSavedFile( HWFILE hFile ) return(FALSE); } - return( TRUE ); } diff --git a/Tactical/Faces.cpp b/Tactical/Faces.cpp index 3994f8e8..1373254d 100644 --- a/Tactical/Faces.cpp +++ b/Tactical/Faces.cpp @@ -2356,6 +2356,11 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE sIconIndex_Assignment = 26; fDoIcon_Assignment = TRUE; break; + + case FACILITY_STRATEGIC_MILITIA_MOVEMENT: + sIconIndex_Assignment = 16; + fDoIcon_Assignment = TRUE; + break; } // Check for being serviced... diff --git a/Utils/Text.h b/Utils/Text.h index 8b3cd2ca..b5da3841 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -1807,6 +1807,10 @@ enum STR_DIALOG_CREATURES_KILL_CIVILIANS, STR_DIALOG_ENEMIES_ATTACK_UNCONCIOUSMERCS, STR_DIALOG_CREATURES_ATTACK_UNCONCIOUSMERCS, + + // Flugente: militia movement forbidden due to limited roaming + STR_MILITIAMOVEMENT_NO_LIMITEDROAMING, + TEXT_NUM_STRATEGIC_TEXT }; diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index dcdba13d..a40a6997 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -1844,6 +1844,13 @@ STR16 pAssignmentStrings[] = L"战俘", // Prisoner of war - captured L"伤员", // patient in a hospital L"空车", // Vehicle is empty + L"Snitch", // facility: undercover prisoner (snitch) // TODO.Translate + L"Propag.", // facility: spread propaganda + L"Propag.", // facility: spread propaganda (globally) + L"Rumours", // facility: gather information + L"Propag.", // spread propaganda + L"Rumours", // gather information + L"Command", // militia movement orders }; @@ -1939,6 +1946,7 @@ STR16 pPersonnelAssignmentStrings[] = L"搜集谣言", // facility: gather rumours L"派发传单", // spread propaganda L"搜集谣言", // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -1993,6 +2001,7 @@ STR16 pLongAssignmentStrings[] = L"搜集谣言", // facility: gather rumours L"派发传单", // spread propaganda L"搜集谣言", // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -2784,6 +2793,8 @@ STR16 gpStrategicString[] = //%s is the sector location -- ex: A9: Omerta L"异形向你在分区%s的佣兵发起了攻击。你的佣兵中没人能进行战斗。", + // Flugente: militia movement forbidden due to limited roaming // TODO.Translate + L"Militia cannot move here (RESTRICT_ROAMING = TRUE).", }; STR16 gpGameClockString[] = @@ -7162,6 +7173,12 @@ STR16 gzFacilityAssignmentStrings[]= L"训练领导", L"训练爆破", L"审讯俘虏", //L"Interrogate Prisoners", + L"Undercover Snitch", // TODO.Translate + // 36-40 + L"Spread Propaganda", + L"Spread Propaganda", // spread propaganda (globally) + L"Gather Rumours", + L"Command Militia", // militia movement orders }; STR16 Additional113Text[]= { diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 15c2372b..a65c6cb9 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -1841,6 +1841,13 @@ STR16 pAssignmentStrings[] = L"POW", // Prisoner of war - captured L"Kliniek", // patient in a hospital L"Leeg", // Vehicle is empty + L"Snitch", // facility: undercover prisoner (snitch) // TODO.Translate + L"Propag.", // facility: spread propaganda + L"Propag.", // facility: spread propaganda (globally) + L"Rumours", // facility: gather information + L"Propag.", // spread propaganda + L"Rumours", // gather information + L"Command", // militia movement orders }; @@ -1936,6 +1943,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Gathering Rumours",// TODO.Translate // facility: gather rumours L"Spreading Propaganda",// TODO.Translate // spread propaganda L"Gathering Rumours",// TODO.Translate // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -1990,6 +1998,7 @@ STR16 pLongAssignmentStrings[] = L"Gather Rumours",// TODO.Translate // facility: gather rumours L"Spread Propaganda",// TODO.Translate // spread propaganda L"Gather Rumours",// TODO.Translate // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -2780,6 +2789,8 @@ STR16 gpStrategicString[] = //%s is the sector location -- ex: A9: Omerta L"Beesten vallen je huurlingen aan in sector %s. Geen enkele huurling kan vechten!", + // Flugente: militia movement forbidden due to limited roaming // TODO.Translate + L"Militia cannot move here (RESTRICT_ROAMING = TRUE).", }; STR16 gpGameClockString[] = @@ -7170,6 +7181,12 @@ STR16 gzFacilityAssignmentStrings[]= L"Trainer Leadership", L"Trainer Explosives", L"Interrogate Prisoners", // added by Flugente TODO.Translate + L"Undercover Snitch", // TODO.Translate + // 36-40 + L"Spread Propaganda", + L"Spread Propaganda", // spread propaganda (globally) + L"Gather Rumours", + L"Command Militia", // militia movement orders }; STR16 Additional113Text[]= diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index ff2ba288..f65abc22 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -1851,6 +1851,7 @@ STR16 pAssignmentStrings[] = L"Rumours", // facility: gather information L"Propag.", // spread propaganda L"Rumours", // gather information + L"Command", // militia movement orders }; @@ -1946,6 +1947,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Gathering Rumours", // facility: gather rumours L"Spreading Propaganda", // spread propaganda L"Gathering Rumours", // gather information + L"Commanding Militia", // militia movement orders }; @@ -2000,6 +2002,7 @@ STR16 pLongAssignmentStrings[] = L"Gather Rumours", // facility: gather rumours L"Spread Propaganda", // spread propaganda L"Gather Rumours", // gather information + L"Commanding Militia", // militia movement orders }; @@ -2789,6 +2792,8 @@ STR16 gpStrategicString[] = //%s is the sector location -- ex: A9: Omerta L"Creatures attack your mercs in sector %s. None of your mercs are able to fight!", + // Flugente: militia movement forbidden due to limited roaming + L"Militia cannot move here (RESTRICT_ROAMING = TRUE).", }; STR16 gpGameClockString[] = @@ -7170,6 +7175,7 @@ STR16 gzFacilityAssignmentStrings[]= L"Spread Propaganda", L"Spread Propaganda", // spread propaganda (globally) L"Gather Rumours", + L"Command Militia", // militia movement orders }; STR16 Additional113Text[]= { diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index 560cbfa7..c431c351 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -1848,6 +1848,13 @@ STR16 pAssignmentStrings[] = L"Capturé(e)", // Prisoner of war - captured L"Hôpital", // patient in a hospital L"Vide", // Vehicle is empty + L"Snitch", // facility: undercover prisoner (snitch) // TODO.Translate + L"Propag.", // facility: spread propaganda + L"Propag.", // facility: spread propaganda (globally) + L"Rumours", // facility: gather information + L"Propag.", // spread propaganda + L"Rumours", // gather information + L"Command", // militia movement orders }; @@ -1943,6 +1950,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Gathering Rumours",// TODO.Translate // facility: gather rumours L"Spreading Propaganda",// TODO.Translate // spread propaganda L"Gathering Rumours",// TODO.Translate // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -1997,6 +2005,7 @@ STR16 pLongAssignmentStrings[] = L"Gather Rumours",// TODO.Translate // facility: gather rumours L"Spread Propaganda",// TODO.Translate // spread propaganda L"Gather Rumours",// TODO.Translate // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -2789,6 +2798,8 @@ STR16 gpStrategicString[] = //%s is the sector location -- ex: A9: Omerta L"Les créatures attaquent vos mercenaires dans le secteur %s. Aucun de vos hommes ne peut combattre !", + // Flugente: militia movement forbidden due to limited roaming // TODO.Translate + L"Militia cannot move here (RESTRICT_ROAMING = TRUE).", }; STR16 gpGameClockString[] = @@ -7162,6 +7173,12 @@ STR16 gzFacilityAssignmentStrings[]= L"Entraîneur Commandement", L"Entraîneur Explosif", L"Interroger prisonnier", // added by Flugente + L"Undercover Snitch", // TODO.Translate + // 36-40 + L"Spread Propaganda", + L"Spread Propaganda", // spread propaganda (globally) + L"Gather Rumours", + L"Command Militia", // militia movement orders }; STR16 Additional113Text[]= { diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 664a33f1..dc86d1fa 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -1853,6 +1853,13 @@ STR16 pAssignmentStrings[] = L"Gefangen", // Prisoner of war - captured L"Hospital", // patient in a hospital L"Leer", //Vehicle is empty + L"Snitch", // facility: undercover prisoner (snitch) // TODO.Translate + L"Propag.", // facility: spread propaganda + L"Propag.", // facility: spread propaganda (globally) + L"Rumours", // facility: gather information + L"Propag.", // spread propaganda + L"Rumours", // gather information + L"Command", // militia movement orders }; STR16 pMilitiaString[] = @@ -1944,6 +1951,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Gathering Rumours",// TODO.Translate // facility: gather rumours L"Spreading Propaganda",// TODO.Translate // spread propaganda L"Gathering Rumours",// TODO.Translate // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; // refer to above for comments @@ -1996,6 +2004,7 @@ STR16 pLongAssignmentStrings[] = L"Gather Rumours",// TODO.Translate // facility: gather rumours L"Spread Propaganda",// TODO.Translate // spread propaganda L"Gather Rumours",// TODO.Translate // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; // the contract options @@ -2789,6 +2798,8 @@ STR16 gpStrategicString[] = //%s is the sector -- ex: A9 L"Monster attackieren Ihre Söldner im Sektor %s. Alle Söldner sind bewusstlos!", + // Flugente: militia movement forbidden due to limited roaming // TODO.Translate + L"Militia cannot move here (RESTRICT_ROAMING = TRUE).", }; STR16 gpGameClockString[] = @@ -6987,6 +6998,12 @@ STR16 gzFacilityAssignmentStrings[]= L"Trainer Führungsqualität", L"Trainer Sprengstoff", L"Gefangene verhören", // added by Flugente + L"Undercover Snitch", // TODO.Translate + // 36-40 + L"Spread Propaganda", + L"Spread Propaganda", // spread propaganda (globally) + L"Gather Rumours", + L"Command Militia", // militia movement orders }; STR16 Additional113Text[]= diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 8f5a20fe..2be911cb 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -1837,6 +1837,13 @@ STR16 pAssignmentStrings[] = L"PDG", // Prisoner of war - captured L"Ospedale", // patient in a hospital L"Vuoto", // Vehicle is empty + L"Snitch", // facility: undercover prisoner (snitch) // TODO.Translate + L"Propag.", // facility: spread propaganda + L"Propag.", // facility: spread propaganda (globally) + L"Rumours", // facility: gather information + L"Propag.", // spread propaganda + L"Rumours", // gather information + L"Command", // militia movement orders }; @@ -1932,6 +1939,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Gathering Rumours",// TODO.Translate // facility: gather rumours L"Spreading Propaganda",// TODO.Translate // spread propaganda L"Gathering Rumours",// TODO.Translate // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -1986,6 +1994,7 @@ STR16 pLongAssignmentStrings[] = L"Gather Rumours",// TODO.Translate // facility: gather rumours L"Spread Propaganda",// TODO.Translate // spread propaganda L"Gather Rumours",// TODO.Translate // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -2776,6 +2785,8 @@ STR16 gpStrategicString[] = //%s is the sector location -- ex: A9: Omerta L"I nemici attaccano i vostri mercenari nel settore %s. Nessuno dei vostri mercenari è in grado di combattere!", + // Flugente: militia movement forbidden due to limited roaming // TODO.Translate + L"Militia cannot move here (RESTRICT_ROAMING = TRUE).", }; STR16 gpGameClockString[] = @@ -7161,6 +7172,12 @@ STR16 gzFacilityAssignmentStrings[]= L"Trainer Leadership", L"Trainer Explosives", L"Interrogate Prisoners", // added by Flugente TODO.Translate + L"Undercover Snitch", // TODO.Translate + // 36-40 + L"Spread Propaganda", + L"Spread Propaganda", // spread propaganda (globally) + L"Gather Rumours", + L"Command Militia", // militia movement orders }; STR16 Additional113Text[]= diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index 392ee481..328fa097 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -1853,6 +1853,13 @@ STR16 pAssignmentStrings[] = L"Jeniec", // Prisoner of war - captured L"Szpital", // patient in a hospital L"Pusty", // Vehicle is empty + L"Snitch", // facility: undercover prisoner (snitch) // TODO.Translate + L"Propag.", // facility: spread propaganda + L"Propag.", // facility: spread propaganda (globally) + L"Rumours", // facility: gather information + L"Propag.", // spread propaganda + L"Rumours", // gather information + L"Command", // militia movement orders }; @@ -1948,6 +1955,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Zbiera plotki", // facility: gather rumours L"Szerzy propagandę", // spread propaganda L"Zbiera plotki", // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -2002,6 +2010,7 @@ STR16 pLongAssignmentStrings[] = L"Zbieraj plotki", // facility: gather rumours L"Szerz propagandę", // spread propaganda L"Zbieraj plotki", // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -2790,6 +2799,8 @@ STR16 gpStrategicString[] = //%c%d is the sector -- ex: A9 L"Stworzenia zatakowały twoich najemników w sektorze %s. Żaden z twoich najemników nie może walczyć!", + // Flugente: militia movement forbidden due to limited roaming // TODO.Translate + L"Militia cannot move here (RESTRICT_ROAMING = TRUE).", }; STR16 gpGameClockString[] = @@ -7178,6 +7189,12 @@ STR16 gzFacilityAssignmentStrings[]= L"Instruktor um. dowodzenia", L"Instruktor zn. mat. wybuchowych", L"Interrogate Prisoners", // added by Flugente TODO.Translate + L"Undercover Snitch", // TODO.Translate + // 36-40 + L"Spread Propaganda", + L"Spread Propaganda", // spread propaganda (globally) + L"Gather Rumours", + L"Command Militia", // militia movement orders }; STR16 Additional113Text[]= diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index cfc8e927..b98b7080 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -1845,6 +1845,13 @@ STR16 pAssignmentStrings[] = L"В плену", // Prisoner of war - captured L"Госпиталь", // patient in a hospital L"Пуст", // Vehicle is empty + L"Snitch", // facility: undercover prisoner (snitch) // TODO.Translate + L"Propag.", // facility: spread propaganda + L"Propag.", // facility: spread propaganda (globally) + L"Rumours", // facility: gather information + L"Propag.", // spread propaganda + L"Rumours", // gather information + L"Command", // militia movement orders }; @@ -1940,6 +1947,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Gathering Rumours",// TODO.Translate // facility: gather rumours L"Spreading Propaganda",// TODO.Translate // spread propaganda L"Gathering Rumours",// TODO.Translate // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -1994,6 +2002,7 @@ STR16 pLongAssignmentStrings[] = L"Gather Rumours",// TODO.Translate // facility: gather rumours L"Spread Propaganda",// TODO.Translate // spread propaganda L"Gather Rumours",// TODO.Translate // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -2783,6 +2792,8 @@ STR16 gpStrategicString[] = //%s is the sector location -- ex: A9: Omerta L"Твари атаковали ваших наемников в секторе %s. Ни один из ваших бойцов не в состоянии сражаться!", + // Flugente: militia movement forbidden due to limited roaming // TODO.Translate + L"Militia cannot move here (RESTRICT_ROAMING = TRUE).", }; STR16 gpGameClockString[] = @@ -7162,6 +7173,12 @@ STR16 gzFacilityAssignmentStrings[]= L"Тренер на Лидерство", L"Тренер на Взрывчатку", L"Interrogate Prisoners", // added by Flugente TODO.Translate + L"Undercover Snitch", // TODO.Translate + // 36-40 + L"Spread Propaganda", + L"Spread Propaganda", // spread propaganda (globally) + L"Gather Rumours", + L"Command Militia", // militia movement orders }; STR16 Additional113Text[]= { diff --git a/Utils/_TaiwaneseText.cpp b/Utils/_TaiwaneseText.cpp index caf8e3fe..eeaea81c 100644 --- a/Utils/_TaiwaneseText.cpp +++ b/Utils/_TaiwaneseText.cpp @@ -1845,6 +1845,13 @@ STR16 pAssignmentStrings[] = L"POW", // Prisoner of war - captured L"Hospital", // patient in a hospital L"Empty", // Vehicle is empty + L"Snitch", // facility: undercover prisoner (snitch) // TODO.Translate + L"Propag.", // facility: spread propaganda + L"Propag.", // facility: spread propaganda (globally) + L"Rumours", // facility: gather information + L"Propag.", // spread propaganda + L"Rumours", // gather information + L"Command", // militia movement orders }; @@ -1940,6 +1947,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Gathering Rumours",// TODO.Translate // facility: gather rumours L"Spreading Propaganda",// TODO.Translate // spread propaganda L"Gathering Rumours",// TODO.Translate // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -1994,6 +2002,7 @@ STR16 pLongAssignmentStrings[] = L"Gather Rumours",// TODO.Translate // facility: gather rumours L"Spread Propaganda",// TODO.Translate // spread propaganda L"Gather Rumours",// TODO.Translate // gather information + L"Commanding Militia", // militia movement orders // TODO.Translate }; @@ -2785,6 +2794,8 @@ STR16 gpStrategicString[] = //%s is the sector location -- ex: A9: Omerta L"Creatures attack your mercs in sector %s. None of your mercs are able to fight!", + // Flugente: militia movement forbidden due to limited roaming // TODO.Translate + L"Militia cannot move here (RESTRICT_ROAMING = TRUE).", }; STR16 gpGameClockString[] = @@ -7170,6 +7181,12 @@ STR16 gzFacilityAssignmentStrings[]= L"Trainer Leadership", L"Trainer Explosives", L"Interrogate Prisoners", // added by Flugente TODO.Translate + L"Undercover Snitch", // TODO.Translate + // 36-40 + L"Spread Propaganda", + L"Spread Propaganda", // spread propaganda (globally) + L"Gather Rumours", + L"Command Militia", // militia movement orders }; STR16 Additional113Text[]=