Files
source/Editor/SmartMethod.cpp
majcostaandGitHub 24425a82b1 More unused stuff removal (#49)
* More unused stuff removal

delete:
- giant 'metaheaders' (JA2 All.h, Laptop All.h, etc), preferring to add #includes directly where needed
- unused ExceptionHandling and DbMan translation units
- unused WizShare.h, Bitmap.h, trle.h, video_private.h headers

* remove mentions from vc proj files too

* remove preprocessor conditionals for unused definitions

find . -iname '*.h' -o -iname '*.cpp' -exec unifdef.exe -m -UPRECOMPILED_HEADERS -UJA2_PRECOMPILED_HEADERS -UWIZ8_PRECOMPILED_HEADERS -UPRECOMPILEDHEADERS {} ';'

then manually fixed a couple files the tool errored out on

* yes, the comments too

as title
2023-01-03 15:51:48 +02:00

624 lines
22 KiB
C++

#include "builddefines.h"
#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