New ingame option: Smart tree tops.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8936 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Sevenfm
2021-02-16 17:22:44 +00:00
parent 0ccecc472c
commit 7c1e9e3200
17 changed files with 209 additions and 33 deletions
+3
View File
@@ -219,6 +219,7 @@ BOOLEAN LoadGameSettings()
gGameSettings.fOptions[TOPTION_SNAP_CURSOR_TO_DOOR] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_SNAP_CURSOR_TO_DOOR" , TRUE );
gGameSettings.fOptions[TOPTION_GLOW_ITEMS] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_GLOW_ITEMS" , TRUE );
gGameSettings.fOptions[TOPTION_TOGGLE_TREE_TOPS] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_TOGGLE_TREE_TOPS" , TRUE );
gGameSettings.fOptions[TOPTION_SMART_TREE_TOPS] = iniReader.ReadBoolean("JA2 Game Settings", "TOPTION_SMART_TREE_TOPS" , FALSE );
gGameSettings.fOptions[TOPTION_TOGGLE_WIREFRAME] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_TOGGLE_WIREFRAME" , TRUE );
gGameSettings.fOptions[TOPTION_3D_CURSOR] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_3D_CURSOR" , FALSE );
gGameSettings.fOptions[TOPTION_CTH_CURSOR] = iniReader.ReadBoolean("JA2 Game Settings","TOPTION_CTH_CURSOR" , TRUE );
@@ -436,6 +437,7 @@ BOOLEAN SaveGameSettings()
settings << "TOPTION_SNAP_CURSOR_TO_DOOR = " << (gGameSettings.fOptions[TOPTION_SNAP_CURSOR_TO_DOOR] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_GLOW_ITEMS = " << (gGameSettings.fOptions[TOPTION_GLOW_ITEMS] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_TOGGLE_TREE_TOPS = " << (gGameSettings.fOptions[TOPTION_TOGGLE_TREE_TOPS] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_SMART_TREE_TOPS = " << (gGameSettings.fOptions[TOPTION_SMART_TREE_TOPS] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_TOGGLE_WIREFRAME = " << (gGameSettings.fOptions[TOPTION_TOGGLE_WIREFRAME] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_3D_CURSOR = " << (gGameSettings.fOptions[TOPTION_3D_CURSOR] ? "TRUE" : "FALSE" ) << endl;
settings << "TOPTION_CTH_CURSOR = " << (gGameSettings.fOptions[TOPTION_CTH_CURSOR] ? "TRUE" : "FALSE" ) << endl;
@@ -551,6 +553,7 @@ void InitGameSettings()
gGameSettings.fOptions[ TOPTION_SNAP_CURSOR_TO_DOOR ] = TRUE;
gGameSettings.fOptions[ TOPTION_GLOW_ITEMS ] = TRUE;
gGameSettings.fOptions[ TOPTION_TOGGLE_TREE_TOPS ] = TRUE;
gGameSettings.fOptions[ TOPTION_SMART_TREE_TOPS ] = FALSE;
gGameSettings.fOptions[ TOPTION_TOGGLE_WIREFRAME ] = TRUE;
gGameSettings.fOptions[ TOPTION_3D_CURSOR ] = FALSE;
gGameSettings.fOptions[ TOPTION_CTH_CURSOR ] = TRUE;
+1
View File
@@ -38,6 +38,7 @@ enum
TOPTION_SNAP_CURSOR_TO_DOOR,
TOPTION_GLOW_ITEMS,
TOPTION_TOGGLE_TREE_TOPS,
TOPTION_SMART_TREE_TOPS,
TOPTION_TOGGLE_WIREFRAME,
TOPTION_3D_CURSOR,
TOPTION_CTH_CURSOR,
+3 -1
View File
@@ -904,7 +904,9 @@ void ExitOptionsScreen()
}
//if the user changed the TREE TOP option, AND a world is loaded
if( gfSettingOfTreeTopStatusOnEnterOfOptionScreen != gGameSettings.fOptions[ TOPTION_TOGGLE_TREE_TOPS ] && gfWorldLoaded )
// sevenfm: always update tree top state
//if( gfSettingOfTreeTopStatusOnEnterOfOptionScreen != gGameSettings.fOptions[ TOPTION_TOGGLE_TREE_TOPS ] && gfWorldLoaded )
if (gfWorldLoaded)
{
SetTreeTopStateForMap();
}
+9
View File
@@ -526,6 +526,8 @@ void PreventFromTheFreezingBug(SOLDIERTYPE* pSoldier)
UIHandleLUIEndLock( NULL );
}
INT32 gOldMapSpot = NOWHERE;
// MAIN TACTICAL UI HANDLER
UINT32 HandleTacticalUI( void )
{
@@ -661,6 +663,13 @@ UINT32 HandleTacticalUI( void )
if ( GetMouseMapPos( &usMapPos ) )
{
// sevenfm: update trees
if (usMapPos != gOldMapSpot)
{
gOldMapSpot = usMapPos;
UpdateTreeVisibility();
}
// Look for soldier full
if ( FindSoldier( usMapPos, &gusUIFullTargetID, &guiUIFullTargetFlags, ( FINDSOLDIERSAMELEVEL( gsInterfaceLevel ) ) ) )
{
+12
View File
@@ -2854,12 +2854,18 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving )
// trversing...
if ( gubWaitingForAllMercsToExitCode == WAIT_FOR_MERCS_TO_WALKOFF_SCREEN || gubWaitingForAllMercsToExitCode == WAIT_FOR_MERCS_TO_WALK_TO_GRIDNO )
{
// sevenfm: update tree visibility
UpdateTreeVisibility();
return( TRUE );
}
// Check if they are out of breath
if ( pSoldier->CheckForBreathCollapse( ) )
{
// sevenfm: update tree visibility
UpdateTreeVisibility();
(*pfKeepMoving ) = TRUE;
return( FALSE );
}
@@ -2867,6 +2873,9 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving )
// see if a mine gets set off...
if (SetOffBombsInGridNo( pSoldier->ubID, pSoldier->sGridNo, FALSE, pSoldier->pathing.bLevel ) )
{
// sevenfm: update tree visibility
UpdateTreeVisibility();
(*pfKeepMoving) = FALSE;
pSoldier->EVENT_StopMerc( pSoldier->sGridNo, pSoldier->ubDirection );
return( FALSE );
@@ -2897,6 +2906,9 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving )
HandleSight(pSoldier,SIGHT_LOOK | SIGHT_RADIO | SIGHT_INTERRUPT);
}
// sevenfm: update tree visibility
UpdateTreeVisibility();
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SANDRO - if pending interrupt flag was set for movement type of interupt, resolve it here
if ( UsingImprovedInterruptSystem() )
+1 -1
View File
@@ -7571,7 +7571,7 @@ void SOLDIERTYPE::ChangeSoldierStance( UINT8 ubDesiredStance )
// Set desired stance
this->ubDesiredHeight = ubDesiredStance;
this->EVENT_InitNewSoldierAnim(usNewState, 0, FALSE);
this->EVENT_InitNewSoldierAnim(usNewState, 0, FALSE);
}
this->usSoldierFlagMask |= SOLDIER_REDOFLASHLIGHT;
+2 -1
View File
@@ -5091,6 +5091,7 @@ void ToggleTreeTops()
if ( gGameSettings.fOptions[ TOPTION_TOGGLE_TREE_TOPS ] )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ REMOVING_TREETOPS_STR ] );
gGameSettings.fOptions[TOPTION_TOGGLE_TREE_TOPS] = FALSE;
WorldHideTrees( );
gTacticalStatus.uiFlags |= NOHIDE_REDUNDENCY;
}
@@ -5098,9 +5099,9 @@ void ToggleTreeTops()
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ SHOWING_TREETOPS_STR ]);
WorldShowTrees( );
gGameSettings.fOptions[TOPTION_TOGGLE_TREE_TOPS] = TRUE;
gTacticalStatus.uiFlags &= (~NOHIDE_REDUNDENCY);
}
gGameSettings.fOptions[ TOPTION_TOGGLE_TREE_TOPS ] = !gGameSettings.fOptions[ TOPTION_TOGGLE_TREE_TOPS ];
// FOR THE NEXT RENDER LOOP, RE-EVALUATE REDUNDENT TILES
InvalidateWorldRedundency( );
+145 -29
View File
@@ -4000,30 +4000,30 @@ LEVELNODE* FindShadow(INT32 sGridNo, UINT16 usStructIndex)
}
void WorldHideTrees( )
void WorldHideTrees()
{
LEVELNODE *pNode;
BOOLEAN fRerender=FALSE;
UINT32 fTileFlags;
INT32 cnt;
LEVELNODE *pNode;
BOOLEAN fRerender = FALSE;
UINT32 fTileFlags;
INT32 cnt;
for ( cnt = 0; cnt < WORLD_MAX; cnt++ )
for (cnt = 0; cnt < WORLD_MAX; cnt++)
{
pNode=gpWorldLevelData[ cnt ].pStructHead;
while(pNode!=NULL)
pNode = gpWorldLevelData[cnt].pStructHead;
while (pNode != NULL)
{
GetTileFlags( pNode->usIndex, &fTileFlags );
GetTileFlags(pNode->usIndex, &fTileFlags);
if ( fTileFlags & FULL3D_TILE )
if (fTileFlags & FULL3D_TILE)
{
if ( !( pNode->uiFlags & LEVELNODE_REVEALTREES ) )
if (!(pNode->uiFlags & LEVELNODE_REVEALTREES))
{
pNode->uiFlags |= ( LEVELNODE_REVEALTREES );
pNode->uiFlags |= (LEVELNODE_REVEALTREES);
}
fRerender=TRUE;
fRerender = TRUE;
}
pNode=pNode->pNext;
pNode = pNode->pNext;
}
}
@@ -4031,39 +4031,155 @@ INT32 cnt;
}
void WorldShowTrees( )
void WorldShowTrees()
{
LEVELNODE *pNode;
BOOLEAN fRerender=FALSE;
UINT32 fTileFlags;
INT32 cnt;
LEVELNODE *pNode;
BOOLEAN fRerender = FALSE;
UINT32 fTileFlags;
INT32 cnt;
for ( cnt = 0; cnt < WORLD_MAX; cnt++ )
for (cnt = 0; cnt < WORLD_MAX; cnt++)
{
pNode=gpWorldLevelData[cnt].pStructHead;
while(pNode!=NULL)
pNode = gpWorldLevelData[cnt].pStructHead;
while (pNode != NULL)
{
GetTileFlags( pNode->usIndex, &fTileFlags );
GetTileFlags(pNode->usIndex, &fTileFlags);
if ( fTileFlags & FULL3D_TILE )
if (fTileFlags & FULL3D_TILE)
{
if ( ( pNode->uiFlags & LEVELNODE_REVEALTREES ) )
if ((pNode->uiFlags & LEVELNODE_REVEALTREES))
{
pNode->uiFlags &=(~( LEVELNODE_REVEALTREES ) );
pNode->uiFlags &= (~(LEVELNODE_REVEALTREES));
}
fRerender=TRUE;
fRerender = TRUE;
}
pNode=pNode->pNext;
pNode = pNode->pNext;
}
}
SetRenderFlags(RENDER_FLAG_FULL );
// sevenfm: also update smart tree tops
if (gGameSettings.fOptions[TOPTION_SMART_TREE_TOPS])
UpdateTreeVisibility();
SetRenderFlags(RENDER_FLAG_FULL);
}
void UpdateTreeVisibility()
{
if (!gGameSettings.fOptions[TOPTION_SMART_TREE_TOPS] || !gGameSettings.fOptions[TOPTION_TOGGLE_TREE_TOPS])
return;
LEVELNODE *pNode;
BOOLEAN fRerender = FALSE;
BOOLEAN fHidden = FALSE;
UINT32 fTileFlags;
INT32 cnt;
SOLDIERTYPE *pOpponent;
STRUCTURE *pStructureData;
INT32 sSpot;
BOOLEAN fHideTree;
INT32 usMouseSpot;
//Get the gridno the cursor is at
GetMouseMapPos(&usMouseSpot);
// first show all trees
for (cnt = 0; cnt < WORLD_MAX; cnt++)
{
pNode = gpWorldLevelData[cnt].pStructHead;
while (pNode != NULL)
{
GetTileFlags(pNode->usIndex, &fTileFlags);
if (fTileFlags & FULL3D_TILE)
{
if ((pNode->uiFlags & LEVELNODE_REVEALTREES))
{
pNode->uiFlags &= ~(LEVELNODE_REVEALTREES);
fRerender = TRUE;
}
}
pNode = pNode->pNext;
}
}
// now show all trees except trees near visible soldiers
for (cnt = 0; cnt < WORLD_MAX; cnt++)
{
pNode = gpWorldLevelData[cnt].pStructHead;
while (pNode != NULL)
{
pStructureData = pNode->pStructureData;
if (pStructureData)
sSpot = pNode->pStructureData->sGridNo;
//sSpot = pNode->pStructureData->sBaseGridNo;
else
sSpot = NOWHERE;
fHideTree = FALSE;
// check trees near cursor position
if (!TileIsOutOfBounds(usMouseSpot) &&
(PythSpacesAway(sSpot, usMouseSpot) <= 2 && AIDirection(sSpot, usMouseSpot) == 0 ||
PythSpacesAway(sSpot, usMouseSpot) <= 5 && AIDirection(sSpot, usMouseSpot) == 7 ||
PythSpacesAway(sSpot, usMouseSpot) <= 2 && AIDirection(sSpot, usMouseSpot) == 6))
{
fHideTree = TRUE;
}
// find visible soldier near spot
if (!TileIsOutOfBounds(sSpot) && !fHideTree)
{
for (UINT8 uiLoop = 0; uiLoop < guiNumMercSlots; uiLoop++)
{
pOpponent = MercSlots[uiLoop];
if (pOpponent &&
pOpponent->bVisible != -1 &&
!TileIsOutOfBounds(pOpponent->sGridNo) &&
(PythSpacesAway(sSpot, pOpponent->sGridNo) <= 2 && AIDirection(sSpot, pOpponent->sGridNo) == 0 ||
PythSpacesAway(sSpot, pOpponent->sGridNo) <= 5 && AIDirection(sSpot, pOpponent->sGridNo) == 7 ||
PythSpacesAway(sSpot, pOpponent->sGridNo) <= 2 && AIDirection(sSpot, pOpponent->sGridNo) == 6))
{
fHideTree = TRUE;
break;
}
}
}
if (fHideTree)
{
GetTileFlags(pNode->usIndex, &fTileFlags);
if (fTileFlags & FULL3D_TILE)
{
if (!(pNode->uiFlags & LEVELNODE_REVEALTREES))
{
pNode->uiFlags |= (LEVELNODE_REVEALTREES);
fRerender = TRUE;
fHidden = TRUE;
}
}
}
pNode = pNode->pNext;
}
}
if (fRerender)
{
SetRenderFlags(RENDER_FLAG_FULL);
if (fHidden)
{
gTacticalStatus.uiFlags |= NOHIDE_REDUNDENCY;
//gTacticalStatus.uiFlags &= (~NOHIDE_REDUNDENCY);
InvalidateWorldRedundency();
}
}
}
void SetWorldFlagsFromNewNode( INT32 sGridNo, UINT16 usIndex )
+1 -1
View File
@@ -158,7 +158,7 @@ LEVELNODE * FindShadow( INT32 sGridNo, UINT16 usStructIndex );
void WorldHideTrees( );
void WorldShowTrees( );
void UpdateTreeVisibility();
BOOLEAN IsTileRedundent( UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex );
+4
View File
@@ -6340,6 +6340,7 @@ STR16 zOptionsToggleText[] =
L"锁定门", //"Snap Cursor to Doors",
L"物品闪亮", //"Make Items Glow",
L"显示树冠", //"Show Tree Tops",
L"Smart Tree Tops", // TODO. Translate
L"显示轮廓", //"Show Wireframes",
L"显示3D光标", //"Show 3D Cursor",
L"显示命中机率", //"Show Chance to Hit on cursor",
@@ -6451,6 +6452,9 @@ STR16 zOptionsScreenHelpText[] =
//toggle tree tops
L"打开时,显示树冠。(|T)",
//smart tree tops
L"When ON, hides tree tops near visible mercs and cursor position.", // TODO.Translate
//toggle wireframe
L"打开时,显示未探明的墙的轮廓。(|C|t|r|l+|A|l|t+|W)",
+4
View File
@@ -6347,6 +6347,7 @@ STR16 zOptionsToggleText[] =
L"Auto-Cursor naar Deuren",
L"Items Oplichten",
L"Toon Boomtoppen",
L"Smart Tree Tops", // TODO. Translate
L"Toon Draadmodellen",
L"Toon 3D Cursor",
L"Show Chance to Hit on cursor",
@@ -6458,6 +6459,9 @@ STR16 zOptionsScreenHelpText[] =
//toggle tree tops
L"Wanneer INGESCHAKELD worden Boom|toppen getoond.",
//smart tree tops
L"When ON, hides tree tops near visible mercs and cursor position.", // TODO.Translate
//toggle wireframe
L"Wanneer INGESCHAKELD worden Draadmodellen van niet-zichtbare muren getoond. (|C|t|r|l+|A|l|t+|W)",
+4
View File
@@ -6354,6 +6354,7 @@ STR16 zOptionsToggleText[] =
L"Snap Cursor to Doors",
L"Make Items Glow",
L"Show Tree Tops",
L"Smart Tree Tops",
L"Show Wireframes",
L"Show 3D Cursor",
L"Show Chance to Hit on Cursor",
@@ -6465,6 +6466,9 @@ STR16 zOptionsScreenHelpText[] =
//toggle tree tops
L"When ON, shows the |Tree tops.",
//smart tree tops
L"When ON, hides tree tops near visible mercs and cursor position.",
//toggle wireframe
L"When ON, displays Wireframes for obscured walls. (|C|t|r|l+|A|l|t+|W)",
+4
View File
@@ -6352,6 +6352,7 @@ STR16 zOptionsToggleText[] =
L"Figer curseur sur les portes",
L"Objets en surbrillance",
L"Afficher cimes",
L"Smart Tree Tops", // TODO. Translate
L"Affichage fil de fer",
L"Curseur toit",
L"Afficher chance de toucher",
@@ -6462,6 +6463,9 @@ STR16 zOptionsScreenHelpText[] =
//toggle tree tops
L"Activez cette option pour afficher la cime des arbres. (|T)",
//smart tree tops
L"When ON, hides tree tops near visible mercs and cursor position.", // TODO.Translate
//toggle wireframe
L"Activez cette option pour afficher les murs en fil de fer. (|C|T|R|L+|A|L|T+||W)",
+4
View File
@@ -6217,6 +6217,7 @@ STR16 zOptionsToggleText[] =
L"Cursor autom. auf Türen",
L"Gegenstände leuchten",
L"Baumkronen zeigen",
L"Smart Tree Tops", // TODO. Translate
L"Drahtgitter zeigen",
L"3D Cursor zeigen",
L"Trefferchance anzeigen",
@@ -6328,6 +6329,9 @@ STR16 zOptionsScreenHelpText[] =
//toggle tree tops
L"Mit der Deaktivierung dieser Funktion lassen sich Baumkronen ausblenden um bessere Sicht auf das Geschehen zu ermöglichen (|T).",
//smart tree tops
L"When ON, hides tree tops near visible mercs and cursor position.", // TODO.Translate
//toggle wireframe
L"Wenn diese Funktion aktiviert ist, werden Drahtgitter verborgener Wände gezeigt um z.B. perspektivisch verdeckte Fenster zu erkennen (|C|t|r|l+|A|l|t+|W).",
+4
View File
@@ -6330,6 +6330,7 @@ STR16 zOptionsToggleText[] =
L"Sposta il cursore sulle porte",
L"Evidenzia gli oggetti",
L"Mostra le fronde degli alberi",
L"Smart Tree Tops", // TODO. Translate
L"Mostra strutture",
L"Mostra il cursore 3D",
L"Show Chance to Hit on cursor",
@@ -6441,6 +6442,9 @@ STR16 zOptionsScreenHelpText[] =
//toggle tree tops
L"Se attivata, mostra le fronde degli alberi. (|T)",
//smart tree tops
L"When ON, hides tree tops near visible mercs and cursor position.", // TODO.Translate
//toggle wireframe
L"Se attivata, visualizza le |Strutture dei muri nascosti. (|C|t|r|l+|A|l|t+|W)",
+4
View File
@@ -6348,6 +6348,7 @@ STR16 zOptionsToggleText[] =
L"Przyciągaj kursor do drzwi",
L"Pulsujące przedmioty",
L"Pokazuj korony drzew",
L"Smart Tree Tops", // TODO. Translate
L"Pokazuj siatkę",
L"Pokazuj kursor 3D",
L"Pokazuj szansę na trafienie",
@@ -6460,6 +6461,9 @@ STR16 zOptionsScreenHelpText[] =
//toggle tree tops
L"Jeśli WŁĄCZONE, wyświetlane będą korony drzew. ( |T )",
//smart tree tops
L"When ON, hides tree tops near visible mercs and cursor position.", // TODO.Translate
//toggle wireframe
L"Jeśli WŁĄCZONE, wyświetlane będą zarysy niewidocznych ścian. ( |C|t|r|l+|A|l|t+|W )",
+4
View File
@@ -6340,6 +6340,7 @@ STR16 zOptionsToggleText[] =
L"Курсор на дверь",
L"Мерцание вещей",
L"Показать кроны деревьев",
L"Скрывать мешающие кроны",
L"Показать каркасы",
L"Трехмерный курсор",
L"Показать шанс попадания",
@@ -6451,6 +6452,9 @@ STR16 zOptionsScreenHelpText[] =
//toggle tree tops
L"Если включено, то отображаются кроны деревьев (|T).",
//smart tree tops
L"Если включено, кроны деревьев не будут отображаться около видимых солдат и около курсора.",
//toggle wireframe
L"Если включено, то у препятствий\nдополнительно показывается каркас (|C|t|r|l+|A|l|t+|W).",