Files
source/Editor/SmartMethod.cpp
T
00fb898600 Delete builddefines.h
Nothing was left in it but the include of profiler.h, and 132 translation units
were including it for that alone. Fifteen files were leaning on profiler.h to
drag in <set>, <vector> and <ostream> for them; those now include what they use.

This is the commit that moves line numbers. Removing an include line shifts
__LINE__ by one for everything below it, and __LINE__ is an immediate operand in
every Assert() and DebugMsg() call, so the four game executables differ from
their predecessors by roughly a thousand 32-bit constants each. Every one of
those is accounted for: each is a single immediate that moved by -1 where the
builddefines.h include went away, or +1 where a <set>/<vector> include was
added. Nothing else in .text, .rdata or .data moves, no object file's section
sizes change, and symbolize_crash and Ja2Export stay bit-identical.

The one non-immediate difference is that the 24 Editor translation units of the
non-editor apps stop emitting __Avx2WmemEnabledWeakValue, a 4-byte weak COMDAT
they only ever instantiated through profiler.h's <vector>. It is a UCRT weak
default that other translation units still provide.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 01:07:26 -03:00

623 lines
22 KiB
C++

#ifdef JA2EDITOR
#include "worlddef.h" //LEVELNODE def
#include "worldman.h" //ReplaceStructIndex
#include "SmartMethod.h"
#include "Smoothing Utils.h"
#include "Editor Undo.h"
UINT8 gubDoorUIValue = 0;
UINT8 gubWindowUIValue = 0;
UINT8 gubWallUIValue = FIRSTWALL;
UINT8 gubBrokenWallUIValue = 0;
void CalcSmartWallDefault( UINT16 *pusObjIndex, UINT16 *pusUseIndex )
{
*pusUseIndex = 0;
*pusObjIndex = gubWallUIValue;
}
void CalcSmartDoorDefault( UINT16 *pusObjIndex, UINT16 *pusUseIndex )
{
*pusUseIndex = 4 * ( gubDoorUIValue % 2 ); //open or closed -- odd or even
*pusObjIndex = FIRSTDOOR + gubDoorUIValue / 2;
}
void CalcSmartWindowDefault( UINT16 *pusObjIndex, UINT16 *pusUseIndex )
{
*pusUseIndex = 44 + gubWindowUIValue; //first exterior top right oriented window
*pusObjIndex = FIRSTWALL;
}
void CalcSmartBrokenWallDefault( UINT16 *pusObjIndex, UINT16 *pusUseIndex )
{
switch( gubBrokenWallUIValue )
{
case 0:case 1: *pusUseIndex = 49 + gubBrokenWallUIValue; break;
case 3: *pusUseIndex = 62; break;
case 4: *pusUseIndex = 64; break;
}
*pusObjIndex = FIRSTWALL;
}
UINT16 CalcSmartWindowIndex( UINT16 usWallOrientation )
{
return (UINT16)(33 + usWallOrientation*3 + gubWindowUIValue);
}
UINT16 CalcSmartDoorIndex( UINT16 usWallOrientation )
{
//convert the orientation values as the graphics are in reverse order
//orientation values: INSIDE_TOP_LEFT=1, INSIDE_TOP_RIGHT=2, OUTSIDE_TOP_LEFT=3, OUTSIDE_TOP_RIGHT=4
//door graphics order: INSIDE_TOP_LEFT=15, INSIDE_TOP_RIGHT=10, OUTSIDE_TOP_LEFT=5, OUTSIDE_TOP_RIGHT=0
usWallOrientation = (4 - usWallOrientation) * 5;
//4 * (gubDoorUIValue%2) evaluates to +4 if the door is open, 0 if closed
return (UINT16)( 1 + usWallOrientation + 4 * (gubDoorUIValue % 2) );
}
UINT16 CalcSmartDoorType()
{
return (UINT16)( FIRSTDOOR + gubDoorUIValue / 2 );
}
UINT16 CalcSmartBrokenWallIndex( UINT16 usWallOrientation )
{
if( gubBrokenWallUIValue == 2 ) //the hole in the wall
return 0xffff;
if( gubBrokenWallUIValue < 2 ) //broken walls
{
//convert the orientation value as the graphics are in a different order.
//orientation values: INSIDE_TOP_LEFT=1, INSIDE_TOP_RIGHT=2, OUTSIDE_TOP_LEFT=3, OUTSIDE_TOP_RIGHT=4
// 4 6 8 10
//door graphics order: INSIDE_TOP_LEFT=4, INSIDE_TOP_RIGHT=6, OUTSIDE_TOP_LEFT=0, OUTSIDE_TOP_RIGHT=2
usWallOrientation = usWallOrientation * 2 + 2;
usWallOrientation -= usWallOrientation > 6 ? 8 : 0;
return (UINT16)( usWallOrientation + 48 + gubBrokenWallUIValue );
}
//cracked and smudged walls
//convert the orientation value as the graphics are in a different order.
//orientation values: INSIDE_TOP_LEFT=1, INSIDE_TOP_RIGHT=2, OUTSIDE_TOP_LEFT=3, OUTSIDE_TOP_RIGHT=4
//door graphics order: INSIDE_TOP_LEFT=1, INSIDE_TOP_RIGHT=2, OUTSIDE_TOP_LEFT=5, OUTSIDE_TOP_RIGHT=6
usWallOrientation += usWallOrientation > 1 ? 2 : 0;
usWallOrientation += gubBrokenWallUIValue == 4 ? 2 : 0; //smudged type which is 2 index values higher.
return (UINT16)( usWallOrientation + 57 );
}
void IncSmartWallUIValue()
{
gubWallUIValue += gubWallUIValue < LASTWALL ? 1 : -3;
}
void DecSmartWallUIValue()
{
gubWallUIValue -= gubWallUIValue > FIRSTWALL ? 1 : -3;
}
void IncSmartDoorUIValue()
{
gubDoorUIValue += gubDoorUIValue < 7 ? 1 : -7;
}
void DecSmartDoorUIValue()
{
gubDoorUIValue -= gubDoorUIValue > 0 ? 1 : -7;
}
void IncSmartWindowUIValue()
{
gubWindowUIValue += gubWindowUIValue < 2 ? 1 : -2;
}
void DecSmartWindowUIValue()
{
gubWindowUIValue -= gubWindowUIValue > 0 ? 1 : -2;
}
void IncSmartBrokenWallUIValue()
{
gubBrokenWallUIValue += gubBrokenWallUIValue < 4 ? 1 : -4;
}
void DecSmartBrokenWallUIValue()
{
gubBrokenWallUIValue -= gubBrokenWallUIValue > 0 ? 1 : -4;
}
BOOLEAN CalcWallInfoUsingSmartMethod( INT32 iMapIndex, UINT16 *pusWallType, UINT16 *pusIndex )
{
return FALSE;
}
BOOLEAN CalcDoorInfoUsingSmartMethod( INT32 iMapIndex, UINT16 *pusDoorType, UINT16 *pusIndex )
{
LEVELNODE *pWall = NULL;
UINT16 usWallOrientation;
pWall = GetVerticalWall( iMapIndex );
if( pWall )
{
GetWallOrientation( pWall->usIndex, &usWallOrientation );
*pusIndex = CalcSmartDoorIndex( usWallOrientation ) - 1;
*pusDoorType = CalcSmartDoorType();
return TRUE;
}
pWall = GetHorizontalWall( iMapIndex );
if( pWall )
{
GetWallOrientation( pWall->usIndex, &usWallOrientation );
*pusIndex = CalcSmartDoorIndex( usWallOrientation ) - 1;
*pusDoorType = CalcSmartDoorType();
return TRUE;
}
return FALSE;
}
BOOLEAN CalcWindowInfoUsingSmartMethod( INT32 iMapIndex, UINT16 *pusWallType, UINT16 *pusIndex )
{
LEVELNODE *pWall = NULL;
UINT32 uiTileType;
UINT16 usWallOrientation;
pWall = GetVerticalWall( iMapIndex );
if( pWall )
{
GetTileType( pWall->usIndex, &uiTileType );
*pusWallType = (UINT16)uiTileType;
if( uiTileType >= FIRSTDOOR && uiTileType <= LASTDOOR )
{
//We want to be able to replace doors with a window, however, the doors do not
//contain the wall type, so we have to search for the nearest wall to extract it.
*pusWallType = SearchForWallType( iMapIndex );
}
GetWallOrientation( pWall->usIndex, &usWallOrientation );
*pusIndex = CalcSmartWindowIndex( usWallOrientation ) - 1;
return TRUE;
}
pWall = GetHorizontalWall( iMapIndex );
if( pWall )
{
GetTileType( pWall->usIndex, &uiTileType );
*pusWallType = (UINT16)uiTileType;
if( uiTileType >= FIRSTDOOR && uiTileType <= LASTDOOR )
{
//We want to be able to replace doors with a window, however, the doors do not
//contain the wall type, so we have to search for the nearest wall to extract it.
*pusWallType = SearchForWallType( iMapIndex );
}
GetWallOrientation( pWall->usIndex, &usWallOrientation );
*pusIndex = CalcSmartWindowIndex( usWallOrientation ) - 1;
return TRUE;
}
return FALSE;
}
BOOLEAN CalcBrokenWallInfoUsingSmartMethod( INT32 iMapIndex, UINT16 *pusWallType, UINT16 *pusIndex )
{
LEVELNODE *pWall = NULL;
UINT32 uiTileType;
UINT16 usWallOrientation;
if( gubBrokenWallUIValue == 2 ) //the hole in the wall
{
*pusWallType = 0xffff;
*pusIndex = 0xffff; //but it won't draw it.
return TRUE;
}
pWall = GetVerticalWall( iMapIndex );
if( pWall )
{
GetTileType( pWall->usIndex, &uiTileType );
*pusWallType = (UINT16)uiTileType;
if( uiTileType >= FIRSTDOOR && uiTileType <= LASTDOOR )
{
//We want to be able to replace doors with a walltype, however, the doors do not
//contain the wall type, so we have to search for the nearest wall to extract it.
*pusWallType = SearchForWallType( iMapIndex );
}
GetWallOrientation( pWall->usIndex, &usWallOrientation );
*pusIndex = CalcSmartBrokenWallIndex( usWallOrientation ) - 1;
return TRUE;
}
pWall = GetHorizontalWall( iMapIndex );
if( pWall )
{
GetTileType( pWall->usIndex, &uiTileType );
*pusWallType = (UINT16)uiTileType;
if( uiTileType >= FIRSTDOOR && uiTileType <= LASTDOOR )
{
//We want to be able to replace doors with a walltype, however, the doors do not
//contain the wall type, so we have to search for the nearest wall to extract it.
*pusWallType = SearchForWallType( iMapIndex );
}
GetWallOrientation( pWall->usIndex, &usWallOrientation );
*pusIndex = CalcSmartBrokenWallIndex( usWallOrientation ) - 1;
return TRUE;
}
return FALSE;
}
//This is a very difficult function to document properly. The reason being is that it is sooo
//subliminal by nature. I have thought up of priorities and choose the best piece to draw based
//on the surrounding conditions. Here are the priorities which are referenced below via comments:
//A) If there is currently a bottom piece and a right piece, immediately exit.
//B) We are currently over a bottom piece. Now, we don't automatically want to draw a right piece here
// for multiple reasons. First, the UI will be too quick and place bottom and right pieces for every
// place the user clicks, which isn't what we want. Therefore, we look to see if there is a right
// piece in the y-1 gridno. It would then make sense to place a right piece down here. Regardless,
// if we encounter a bottom piece here, we will exit.
//C) This is the counterpart to B, but we are looking at a current right piece, and are determining if
// we should place a bottom piece based on another bottom piece existing in the x-1 gridno.
//D) Now, we analyse the neighboring tiles and determine the orientations that would add weight to the
// current tile either towards drawing a horizontal piece or a vertical piece.
//E) Now that we have the information, we give the highest priority to any weights that match the current
// wall piece type selected by the user. Based on that, we will only consider the best match of the
// type and use it. If there are no matches on type, we continue.
//F) We failed to find weights matching the current wall type, but before we give up using the user's wall
// type, there are two more cases. When there is a bottom wall in the y+1 position or a right wall in
// the x+1 position. If there are matching walls, there, then we draw two pieces to connect the current
// gridno with the respective position.
void PasteSmartWall( INT32 iMapIndex )
{
static BOOLEAN fWallAlone = FALSE;
static UINT32 iAloneMapIndex = 0x80000000;
UINT16 usWallType;
//These are the counters for the walls of each type
UINT16 usNumV[4]={0,0,0,0}; //vertical wall weights
UINT16 usNumH[4]={0,0,0,0}; //horizontal wall weights
//*A* See above documentation
if( GetVerticalWall( iMapIndex ) && GetHorizontalWall( iMapIndex ) )
return;
//*B* See above documentation
usWallType = GetHorizontalWallType( iMapIndex );
if( usWallType )
{
if( usWallType == gubWallUIValue )
{
usWallType = GetVerticalWallType( iMapIndex - WORLD_COLS );
if( usWallType == gubWallUIValue )
{
if( FloorAtGridNo( iMapIndex + 1 ) )
BuildWallPiece( iMapIndex, EXTERIOR_RIGHT, gubWallUIValue );
else
BuildWallPiece( iMapIndex, INTERIOR_RIGHT, gubWallUIValue );
return;
}
usWallType = GetHorizontalWallType( iMapIndex - WORLD_COLS );
if( usWallType == gubWallUIValue )
{
if( FloorAtGridNo( iMapIndex + 1 ) )
{
BuildWallPiece( iMapIndex, EXTERIOR_RIGHT, gubWallUIValue );
if( !GetHorizontalWall( iMapIndex - WORLD_COLS + 1 ) )
ChangeVerticalWall( iMapIndex, INTERIOR_EXTENDED );
}
else
{
BuildWallPiece( iMapIndex, INTERIOR_RIGHT, gubWallUIValue );
if( !GetHorizontalWall( iMapIndex - WORLD_COLS + 1 ) )
ChangeVerticalWall( iMapIndex, EXTERIOR_EXTENDED );
}
}
}
return;
}
//*C* See above documentation
usWallType = GetVerticalWallType( iMapIndex );
if( usWallType )
{
if( usWallType == gubWallUIValue )
{
usWallType = GetHorizontalWallType( iMapIndex - 1 );
if( usWallType == gubWallUIValue )
{
if( FloorAtGridNo( iMapIndex + WORLD_COLS ) )
BuildWallPiece( iMapIndex, EXTERIOR_BOTTOM, gubWallUIValue );
else
BuildWallPiece( iMapIndex, INTERIOR_BOTTOM, gubWallUIValue );
}
}
return;
}
//*D* See above documentation
//Evaluate left adjacent tile
if( usWallType = GetVerticalWallType( iMapIndex - 1 ) )
usNumH[ usWallType - FIRSTWALL ]++;
if( usWallType = GetHorizontalWallType( iMapIndex - 1 ) )
usNumH[ usWallType - FIRSTWALL ]++;
//Evaluate right adjacent tile
if( usWallType = GetHorizontalWallType( iMapIndex + 1 ) )
usNumH[ usWallType - FIRSTWALL ]++;
//Evaluate upper adjacent tile
if( usWallType = GetVerticalWallType( iMapIndex - WORLD_COLS ) )
usNumV[ usWallType - FIRSTWALL ]++;
if( usWallType = GetHorizontalWallType( iMapIndex - WORLD_COLS ) )
usNumV[ usWallType - FIRSTWALL ]++;
//Evaluate lower adjacent tile
if( usWallType = GetVerticalWallType( iMapIndex + WORLD_COLS ) )
usNumV[ usWallType - FIRSTWALL ]++;
//*E* See above documentation
if( usNumV[gubWallUIValue - FIRSTWALL] | usNumH[gubWallUIValue - FIRSTWALL] )
{
if( usNumV[gubWallUIValue - FIRSTWALL] >= usNumH[gubWallUIValue - FIRSTWALL] )
{
if( FloorAtGridNo( iMapIndex + 1 ) )
{ //inside
BuildWallPiece( iMapIndex, EXTERIOR_RIGHT, gubWallUIValue );
//Change to extended piece if it is a new top right corner to cover the end part.
if( GetHorizontalWall( iMapIndex - WORLD_COLS ) && !GetHorizontalWall( iMapIndex - WORLD_COLS + 1 )
&& !GetVerticalWall( iMapIndex - WORLD_COLS ) )
ChangeVerticalWall( iMapIndex, INTERIOR_EXTENDED );
else if( GetHorizontalWall( iMapIndex - WORLD_COLS ) && !GetHorizontalWall( iMapIndex - WORLD_COLS - 1 )
&& !GetVerticalWall( iMapIndex - WORLD_COLS - 1 ) )
{
ChangeVerticalWall( iMapIndex, INTERIOR_EXTENDED );
EraseHorizontalWall( iMapIndex - WORLD_COLS );
}
}
else
{ //outside
BuildWallPiece( iMapIndex, INTERIOR_RIGHT, gubWallUIValue );
if( GetHorizontalWall( iMapIndex - WORLD_COLS ) && !GetHorizontalWall( iMapIndex - WORLD_COLS + 1 )
&& !GetVerticalWall( iMapIndex - WORLD_COLS ) )
ChangeVerticalWall( iMapIndex, EXTERIOR_EXTENDED );
else if( GetHorizontalWall( iMapIndex - WORLD_COLS ) && !GetHorizontalWall( iMapIndex - WORLD_COLS - 1 )
&& !GetVerticalWall( iMapIndex - WORLD_COLS - 1 ) )
{
ChangeVerticalWall( iMapIndex, EXTERIOR_EXTENDED );
EraseHorizontalWall( iMapIndex - WORLD_COLS );
}
}
}
else
{
if( GetVerticalWall( iMapIndex - 1 ) && !GetVerticalWall( iMapIndex - WORLD_COLS - 1 )
&& !GetHorizontalWall( iMapIndex - WORLD_COLS - 1 ) )
EraseVerticalWall( iMapIndex - 1);
if( FloorAtGridNo( iMapIndex + WORLD_COLS ) )
{ //inside
BuildWallPiece( iMapIndex, EXTERIOR_BOTTOM, gubWallUIValue );
if( GetVerticalWall( iMapIndex + WORLD_COLS ) )
ChangeVerticalWall( iMapIndex + WORLD_COLS, INTERIOR_EXTENDED );
if( GetVerticalWall( iMapIndex + WORLD_COLS - 1 ) && !GetVerticalWall( iMapIndex - 1 ) )
ChangeVerticalWall( iMapIndex + WORLD_COLS - 1, INTERIOR_EXTENDED );
else if( GetVerticalWall( iMapIndex - 1 ) && !GetVerticalWall( iMapIndex + WORLD_COLS - 1 )
&& FloorAtGridNo( iMapIndex ) )
ChangeVerticalWall( iMapIndex - 1, INTERIOR_BOTTOMEND );
}
else
{ //outside
BuildWallPiece( iMapIndex, INTERIOR_BOTTOM, gubWallUIValue );
if( GetVerticalWall( iMapIndex + WORLD_COLS ) )
ChangeVerticalWall( iMapIndex + WORLD_COLS, EXTERIOR_EXTENDED );
if( GetVerticalWall( iMapIndex + WORLD_COLS - 1 ) && !GetVerticalWall( iMapIndex - 1 ) )
ChangeVerticalWall( iMapIndex + WORLD_COLS - 1, EXTERIOR_EXTENDED );
else if( GetVerticalWall( iMapIndex - 1 ) && !GetVerticalWall( iMapIndex + WORLD_COLS - 1 )
&& FloorAtGridNo( iMapIndex ) )
ChangeVerticalWall( iMapIndex - 1, EXTERIOR_BOTTOMEND );
}
}
return;
}
//*F* See above documentation
usWallType = GetHorizontalWallType( iMapIndex + WORLD_COLS );
if( usWallType == gubWallUIValue )
{
if( !GetHorizontalWall( iMapIndex + WORLD_COLS - 1 ) )
EraseHorizontalWall( iMapIndex + WORLD_COLS );
if( FloorAtGridNo( iMapIndex + 1 ) )
{ //inside
BuildWallPiece( iMapIndex + WORLD_COLS, EXTERIOR_RIGHT, gubWallUIValue );
BuildWallPiece( iMapIndex, EXTERIOR_RIGHT, gubWallUIValue );
if( !GetVerticalWall( iMapIndex + WORLD_COLS * 2 ) && FloorAtGridNo( iMapIndex + WORLD_COLS * 2 + 1 ) )
ChangeVerticalWall( iMapIndex + WORLD_COLS, INTERIOR_BOTTOMEND );
else //override the damn other smoothing.
ChangeVerticalWall( iMapIndex + WORLD_COLS, INTERIOR_R );
}
else
{ //outside
BuildWallPiece( iMapIndex + WORLD_COLS, INTERIOR_RIGHT, gubWallUIValue );
BuildWallPiece( iMapIndex, INTERIOR_RIGHT, gubWallUIValue );
if( !GetVerticalWall( iMapIndex + WORLD_COLS * 2 ) && !FloorAtGridNo( iMapIndex + WORLD_COLS * 2 + 1 ) )
ChangeVerticalWall( iMapIndex + WORLD_COLS, EXTERIOR_BOTTOMEND );
else //override the damn other smoothing.
ChangeVerticalWall( iMapIndex + WORLD_COLS, EXTERIOR_R );
}
return;
}
usWallType = GetVerticalWallType( iMapIndex + 1 );
if( usWallType == gubWallUIValue )
{
if(FloorAtGridNo( iMapIndex + WORLD_COLS ) )
{ //inside
BuildWallPiece( iMapIndex + 1, EXTERIOR_BOTTOM, gubWallUIValue );
BuildWallPiece( iMapIndex, EXTERIOR_BOTTOM, gubWallUIValue );
if( !GetVerticalWall( iMapIndex - WORLD_COLS + 1 ) )
{
EraseVerticalWall( iMapIndex + 1 );
ChangeVerticalWall( iMapIndex + WORLD_COLS + 1, INTERIOR_EXTENDED );
}
if( !GetVerticalWall( iMapIndex + WORLD_COLS + 1) )
{
if( !GetHorizontalWall( iMapIndex - WORLD_COLS + 1) && !GetVerticalWall( iMapIndex - WORLD_COLS + 1 )
&& GetHorizontalWall( iMapIndex - WORLD_COLS + 2 ) )
ChangeVerticalWall( iMapIndex + 1, INTERIOR_EXTENDED );
else
ChangeVerticalWall( iMapIndex + 1, INTERIOR_BOTTOMEND );
}
}
else
{ //outside
BuildWallPiece( iMapIndex + 1, INTERIOR_BOTTOM, gubWallUIValue );
BuildWallPiece( iMapIndex, INTERIOR_BOTTOM, gubWallUIValue );
if( !GetVerticalWall( iMapIndex - WORLD_COLS + 1 ) )
{
EraseVerticalWall( iMapIndex + 1 );
ChangeVerticalWall( iMapIndex + WORLD_COLS + 1, EXTERIOR_EXTENDED );
}
if( !GetVerticalWall( iMapIndex + WORLD_COLS + 1) )
{
if( !GetHorizontalWall( iMapIndex - WORLD_COLS + 1) && !GetVerticalWall( iMapIndex - WORLD_COLS + 1 )
&& GetHorizontalWall( iMapIndex - WORLD_COLS + 2 ) )
ChangeVerticalWall( iMapIndex + 1, EXTERIOR_EXTENDED );
else
ChangeVerticalWall( iMapIndex + 1, EXTERIOR_BOTTOMEND );
}
}
return;
}
//Check for the highest weight value.
}
void PasteSmartDoor( INT32 iMapIndex )
{
LEVELNODE *pWall = NULL;
UINT16 usTileIndex;
UINT16 usDoorType;
UINT16 usIndex;
UINT16 usWallOrientation;
if( pWall = GetVerticalWall( iMapIndex ) )
{
GetWallOrientation( pWall->usIndex, &usWallOrientation );
usIndex = CalcSmartDoorIndex( usWallOrientation );
usDoorType = CalcSmartDoorType();
AddToUndoList( iMapIndex );
GetTileIndexFromTypeSubIndex( usDoorType, usIndex, &usTileIndex );
ReplaceStructIndex( iMapIndex, pWall->usIndex, usTileIndex );
}
if( pWall = GetHorizontalWall( iMapIndex ) )
{
GetWallOrientation( pWall->usIndex, &usWallOrientation );
usIndex = CalcSmartDoorIndex( usWallOrientation );
usDoorType = CalcSmartDoorType();
AddToUndoList( iMapIndex );
GetTileIndexFromTypeSubIndex( usDoorType, usIndex, &usTileIndex );
ReplaceStructIndex( iMapIndex, pWall->usIndex, usTileIndex );
}
}
void PasteSmartWindow( INT32 iMapIndex )
{
UINT16 usNewWallIndex;
LEVELNODE *pWall = NULL;
UINT32 uiTileType;
UINT16 usWallType;
UINT16 usIndex;
UINT16 usWallOrientation;
pWall = GetVerticalWall( iMapIndex );
if( pWall )
{
GetTileType( pWall->usIndex, &uiTileType );
usWallType = (UINT16)uiTileType;
if( uiTileType >= FIRSTDOOR && uiTileType <= LASTDOOR )
{
//We want to be able to replace doors with a window, however, the doors do not
//contain the wall type, so we have to search for the nearest wall to extract it.
usWallType = SearchForWallType( iMapIndex );
}
GetWallOrientation( pWall->usIndex, &usWallOrientation );
usIndex = CalcSmartWindowIndex( usWallOrientation );
//Calculate the new graphic for the window type selected.
AddToUndoList( iMapIndex );
GetTileIndexFromTypeSubIndex( usWallType, usIndex, &usNewWallIndex );
ReplaceStructIndex( iMapIndex, pWall->usIndex, usNewWallIndex );
}
pWall = GetHorizontalWall( iMapIndex );
if( pWall )
{
GetTileType( pWall->usIndex, &uiTileType );
usWallType = (UINT16)uiTileType;
if( uiTileType >= FIRSTDOOR && uiTileType <= LASTDOOR )
{
//We want to be able to replace doors with a window, however, the doors do not
//contain the wall type, so we have to search for the nearest wall to extract it.
usWallType = SearchForWallType( iMapIndex );
}
GetWallOrientation( pWall->usIndex, &usWallOrientation );
usIndex = CalcSmartWindowIndex( usWallOrientation );
//Calculate the new graphic for the window type selected.
AddToUndoList( iMapIndex );
GetTileIndexFromTypeSubIndex( usWallType, usIndex, &usNewWallIndex );
ReplaceStructIndex( iMapIndex, pWall->usIndex, usNewWallIndex );
}
}
void PasteSmartBrokenWall( INT32 iMapIndex )
{
UINT16 usNewWallIndex;
LEVELNODE *pWall;
UINT32 uiTileType;
UINT16 usWallType;
UINT16 usIndex;
UINT16 usWallOrientation;
pWall = GetVerticalWall( iMapIndex );
if( pWall )
{
GetTileType( pWall->usIndex, &uiTileType );
usWallType = (UINT16)uiTileType;
if( uiTileType >= FIRSTDOOR && uiTileType <= LASTDOOR )
{
usWallType = SearchForWallType( iMapIndex );
}
GetWallOrientation( pWall->usIndex, &usWallOrientation );
usIndex = CalcSmartBrokenWallIndex( usWallOrientation );
if( usIndex == 0xffff )
{
AddToUndoList( iMapIndex );
RemoveStruct( iMapIndex, pWall->usIndex );
}
else
{
AddToUndoList( iMapIndex );
GetTileIndexFromTypeSubIndex( usWallType, usIndex, &usNewWallIndex );
ReplaceStructIndex( iMapIndex, pWall->usIndex, usNewWallIndex );
}
}
pWall = GetHorizontalWall( iMapIndex );
if( pWall )
{
GetTileType( pWall->usIndex, &uiTileType );
usWallType = (UINT16)uiTileType;
if( uiTileType >= FIRSTDOOR && uiTileType <= LASTDOOR )
{
//We want to be able to replace doors with a window, however, the doors do not
//contain the wall type, so we have to search for the nearest wall to extract it.
usWallType = SearchForWallType( iMapIndex );
}
GetWallOrientation( pWall->usIndex, &usWallOrientation );
usIndex = CalcSmartBrokenWallIndex( usWallOrientation );
if( usIndex == 0xffff )
{
AddToUndoList( iMapIndex );
RemoveStruct( iMapIndex, pWall->usIndex );
}
else
{
AddToUndoList( iMapIndex );
GetTileIndexFromTypeSubIndex( usWallType, usIndex, &usNewWallIndex );
ReplaceStructIndex( iMapIndex, pWall->usIndex, usNewWallIndex );
}
//Calculate the new graphic for the window type selected.
}
}
#endif