Files
source/Editor/EditorMapInfo.cpp
T
BeatAroundTheBuscherandGitHub ed00830202 Fixes Upper/Lower Casing for include paths (#487)
* Fixing upper/lower case for includes

types.h, zconf.h and zlib.h were renamed so that global includes like Types.h
are not used.
2025-08-16 22:01:12 -03:00

347 lines
12 KiB
C++

#include "builddefines.h"
#ifdef JA2EDITOR
#include <windows.h>
#include "tiledef.h"
#include "edit_sys.h"
#include "vsurface.h"
#include "vobject.h"
#include "mousesystem.h"
#include "Button System.h"
#include "WCheck.h"
#include "vsurface.h"
#include "line.h"
#include "input.h"
#include "sysutil.h"
#include "Font.h"
#include "Font Control.h"
#include "editscreen.h"
#include "selectwin.h"
#include "video.h"
#include "vobject_blitters.h"
#include "Interface Panels.h"
#include "Interface Items.h"
#include "Utilities.h"
#include "World Items.h"
#include "worldman.h"
#include "Overhead.h" //GetSoldier
#include "renderworld.h"
#include "Animation Data.h"
#include "Animation Control.h"
#include "lighting.h"
#include "EditorDefines.h"
#include "EditorMercs.h"
#include "EditorTerrain.h" //for access to TerrainTileDrawMode
#include "Soldier Create.h" //The stuff that connects the editor generated information
#include "Soldier Init List.h"
#include "strategicmap.h"
#include "Soldier Add.h"
#include "soldier profile type.h"
#include "Soldier Profile.h"
#include "Text Input.h"
#include "random.h"
#include "WordWrap.h"
#include "EditorItems.h"
#include "Editor Taskbar Utils.h"
#include "Exit Grids.h"
#include "Editor Undo.h"
#include "Item Statistics.h"
#include "Map Information.h"
#include "EditorMapInfo.h"
#include "environment.h"
#include "Simple Render Utils.h"
#include "Text.h"
//forward declarations of common classes to eliminate includes
class OBJECTTYPE;
class SOLDIERTYPE;
INT8 gbDefaultLightType = PRIMETIME_LIGHT;
SGPPaletteEntry gEditorLightColor;
BOOLEAN gfEditorForceShadeTableRebuild = FALSE;
//dnl ch43 290909
INT32 iNewMapWorldRows = OLD_WORLD_ROWS;
INT32 iNewMapWorldCols = OLD_WORLD_COLS;
void SetupTextInputForOptions(void)//dnl ch52 091009
{
CHAR16 str[10];
InitTextInputModeWithScheme(DEFAULT_SCHEME);
AddUserInputField(NULL); // Just so we can use short cut keys while not typing.
swprintf(str, L"%d", WORLD_ROWS);
AddTextInputField( iScreenWidthOffset+5, 2*iScreenHeightOffset+394, 30, 18, MSYS_PRIORITY_NORMAL, str, 4, INPUTTYPE_NUMERICSTRICT);
swprintf(str, L"%d", WORLD_COLS);
AddTextInputField(iScreenWidthOffset+5, 2*iScreenHeightOffset+414, 30, 18, MSYS_PRIORITY_NORMAL, str, 4, INPUTTYPE_NUMERICSTRICT);
DisableTextField(2);
}
void UpdateOptions()
{
if (gfResizeMapOnLoading)
EnableTextField(1);
else
DisableTextField(1);
SetFont( FONT10ARIAL );
SetFontShadow( FONT_NEARBLACK );
SetFontForeground( FONT_YELLOW );
mprintf( iScreenWidthOffset + 38, 2 * iScreenHeightOffset + 399, L"Rows");
SetFontForeground( FONT_YELLOW );
mprintf( iScreenWidthOffset + 38, 2 * iScreenHeightOffset + 419, L"Cols");
SetFontForeground( FONT_RED );
}
void ExtractAndUpdateOptions(void)//dnl ch52 091009
{
iNewMapWorldRows = max(min(GetNumericStrictValueFromField(1), WORLD_ROWS_MAX), OLD_WORLD_ROWS);
iNewMapWorldRows /= 4;
iNewMapWorldRows *= 4;
iNewMapWorldCols = iNewMapWorldRows;
//iNewMapWorldCols = max(min(GetNumericStrictValueFromField(2), WORLD_COLS_MAX), OLD_WORLD_COLS);
//iNewMapWorldCols /= 4;
//iNewMapWorldCols *= 4;
}
void SetupTextInputForMapInfo()
{
CHAR16 str[10];
InitTextInputModeWithScheme( DEFAULT_SCHEME );
AddUserInputField( NULL ); //just so we can use short cut keys while not typing.
//light rgb fields
swprintf( str, L"%d", gEditorLightColor.peRed );
AddTextInputField( iScreenWidthOffset + 10, 2 * iScreenHeightOffset + 394, 25, 18, MSYS_PRIORITY_NORMAL, str, 3, INPUTTYPE_NUMERICSTRICT );
swprintf( str, L"%d", gEditorLightColor.peGreen );
AddTextInputField( iScreenWidthOffset + 10, 2 * iScreenHeightOffset + 414, 25, 18, MSYS_PRIORITY_NORMAL, str, 3, INPUTTYPE_NUMERICSTRICT );
swprintf( str, L"%d", gEditorLightColor.peBlue );
AddTextInputField( iScreenWidthOffset + 10, 2 * iScreenHeightOffset + 434, 25, 18, MSYS_PRIORITY_NORMAL, str, 3, INPUTTYPE_NUMERICSTRICT );
swprintf( str, L"%d", gsLightRadius );
AddTextInputField( iScreenWidthOffset + 120, 2 * iScreenHeightOffset + 394, 25, 18, MSYS_PRIORITY_NORMAL, str, 3, INPUTTYPE_NUMERICSTRICT );
swprintf( str, L"%d", gfFakeLights ? gusSavedLightLevel : gusLightLevel );//dnl ch80 011213
AddTextInputField( iScreenWidthOffset + 120, 2 * iScreenHeightOffset + 414, 25, 18, MSYS_PRIORITY_NORMAL, str, 2, INPUTTYPE_NUMERICSTRICT );
//Scroll restriction ID
if( !gMapInformation.ubRestrictedScrollID )
swprintf( str, L"" );
else
swprintf( str, L"%d", gMapInformation.ubRestrictedScrollID );
AddTextInputField( iScreenWidthOffset + 210, 2 * iScreenHeightOffset + 420, 30, 20, MSYS_PRIORITY_NORMAL, str, 2, INPUTTYPE_NUMERICSTRICT );
//exit grid input fields
swprintf( str, L"%c%d", gExitGrid.ubGotoSectorY + 'A' - 1, gExitGrid.ubGotoSectorX );
AddTextInputField( iScreenWidthOffset + 338, 2 * iScreenHeightOffset + 363, 30, 18, MSYS_PRIORITY_NORMAL, str, 3, INPUTTYPE_EXCLUSIVE_COORDINATE );
swprintf( str, L"%d", gExitGrid.ubGotoSectorZ );
AddTextInputField( iScreenWidthOffset + 338, 2 * iScreenHeightOffset + 383, 30, 18, MSYS_PRIORITY_NORMAL, str, 1, INPUTTYPE_NUMERICSTRICT );
swprintf( str, L"%d", gExitGrid.usGridNo );
AddTextInputField( iScreenWidthOffset + 338, 2 * iScreenHeightOffset + 403, 50, 18, MSYS_PRIORITY_NORMAL, str, 7, INPUTTYPE_NUMERICSTRICT );
}
void UpdateMapInfo()
{
SetFont( FONT10ARIAL );
SetFontShadow( FONT_NEARBLACK );
SetFontForeground( FONT_RED );
mprintf( iScreenWidthOffset + 38, 2 * iScreenHeightOffset + 399, pUpdateMapInfoText[0]);
SetFontForeground( FONT_GREEN );
mprintf( iScreenWidthOffset + 38, 2 * iScreenHeightOffset + 419, pUpdateMapInfoText[1]);
SetFontForeground( FONT_DKBLUE );
mprintf( iScreenWidthOffset + 38, 2 * iScreenHeightOffset + 439, pUpdateMapInfoText[2]);
SetFontForeground( FONT_YELLOW );
mprintf( iScreenWidthOffset + 65, 2 * iScreenHeightOffset + 369, pUpdateMapInfoText[3] );
mprintf( iScreenWidthOffset + 65, 2 * iScreenHeightOffset + 382, pUpdateMapInfoText[4] );
mprintf( iScreenWidthOffset + 65, 2 * iScreenHeightOffset + 397, pUpdateMapInfoText[5] );
SetFontForeground( FONT_YELLOW );
mprintf( iScreenWidthOffset + 148, 2 * iScreenHeightOffset + 399, pUpdateMapInfoText[6] );
if( !gfBasement && !gfCaves )
SetFontForeground( FONT_DKYELLOW );
mprintf( iScreenWidthOffset + 148, 2 * iScreenHeightOffset + 414, pUpdateMapInfoText[7] );
mprintf( iScreenWidthOffset + 148, 2 * iScreenHeightOffset + 423, pUpdateMapInfoText[8] );
SetFontForeground( FONT_YELLOW );
mprintf( iScreenWidthOffset + 230, 2 * iScreenHeightOffset + 369, pUpdateMapInfoText[9] );
mprintf( iScreenWidthOffset + 230, 2 * iScreenHeightOffset + 384, pUpdateMapInfoText[10] );
mprintf( iScreenWidthOffset + 230, 2 * iScreenHeightOffset + 399, pUpdateMapInfoText[11] );
SetFontForeground( FONT_ORANGE );
mprintf( iScreenWidthOffset + 250, 2 * iScreenHeightOffset + 420, pUpdateMapInfoText[12] );
mprintf( iScreenWidthOffset + 250, 2 * iScreenHeightOffset + 430, pUpdateMapInfoText[13] );
SetFontForeground( FONT_YELLOW );
mprintf( iScreenWidthOffset + 368, 2 * iScreenHeightOffset + 363, pUpdateMapInfoText[14] );
mprintf( iScreenWidthOffset + 368, 2 * iScreenHeightOffset + 372, pUpdateMapInfoText[15] );
mprintf( iScreenWidthOffset + 368, 2 * iScreenHeightOffset + 383, pUpdateMapInfoText[16] );
mprintf( iScreenWidthOffset + 368, 2 * iScreenHeightOffset + 392, pUpdateMapInfoText[17] );
mprintf( iScreenWidthOffset + 388, 2 * iScreenHeightOffset + 403, pUpdateMapInfoText[18] );
mprintf( iScreenWidthOffset + 388, 2 * iScreenHeightOffset + 412, pUpdateMapInfoText[19] );
SetFontForeground( FONT_RED );
}
void UpdateMapInfoFields()
{
CHAR16 str[10];
//Update the text fields to reflect the validated values.
//light rgb fields
swprintf( str, L"%d", gEditorLightColor.peRed );
SetInputFieldStringWith16BitString( 1, str );
swprintf( str, L"%d", gEditorLightColor.peGreen );
SetInputFieldStringWith16BitString( 2, str );
swprintf( str, L"%d", gEditorLightColor.peBlue );
SetInputFieldStringWith16BitString( 3, str );
swprintf( str, L"%d", gsLightRadius );
SetInputFieldStringWith16BitString( 4, str );
swprintf( str, L"%d", gusLightLevel );
SetInputFieldStringWith16BitString( 5, str );
if( !gMapInformation.ubRestrictedScrollID )
swprintf( str, L"" );
else
swprintf( str, L"%d", gMapInformation.ubRestrictedScrollID );
SetInputFieldStringWith16BitString( 6, str );
ApplyNewExitGridValuesToTextFields();
}
void ExtractAndUpdateMapInfo()
{
CHAR16 str[10];
INT32 temp;
BOOLEAN fUpdateLight1 = FALSE;
//extract light1 colors
temp = min( GetNumericStrictValueFromField( 1 ), 255 );
if( temp != -1 && temp != gEditorLightColor.peRed )
{
fUpdateLight1 = TRUE;
gEditorLightColor.peRed = (UINT8)temp;
}
temp = min( GetNumericStrictValueFromField( 2 ), 255 );
if( temp != -1 && temp != gEditorLightColor.peGreen )
{
fUpdateLight1 = TRUE;
gEditorLightColor.peGreen = (UINT8)temp;
}
temp = min( GetNumericStrictValueFromField( 3 ), 255 );
if( temp != -1 && temp != gEditorLightColor.peBlue )
{
fUpdateLight1 = TRUE;
gEditorLightColor.peBlue = (UINT8)temp;
}
if( fUpdateLight1 )
{
gfEditorForceShadeTableRebuild = TRUE;
LightSetColors( &gEditorLightColor, 1 );
gfEditorForceShadeTableRebuild = FALSE;
}
//dnl ch80 011213 extract radius
temp = max(min(GetNumericStrictValueFromField(4), 8), 1);
if(temp != -1)
gsLightRadius = (INT16)temp;
temp = max(min(GetNumericStrictValueFromField(5), 15), 1);
if(temp != -1 && temp != gusLightLevel)
{
gusLightLevel = (UINT16)temp;
if(gfFakeLights)
gusLightLevel = EDITOR_LIGHT_FAKE;
LightSetBaseLevel((UINT8)(EDITOR_LIGHT_MAX - gusLightLevel));
LightSpriteRenderAll();
gfRenderWorld = TRUE;
}
temp = GetNumericStrictValueFromField(6);
if(temp == -1)
gMapInformation.ubRestrictedScrollID = 0;
else
{
gMapInformation.ubRestrictedScrollID = (temp ? 1 : 0);
InitRenderParams(gMapInformation.ubRestrictedScrollID);
}
//set up fields for exitgrid information
Get16BitStringFromField( 7, str, 10 );
if( str[0] >= 'a' && str[0] <= 'z' )
str[0] -= 32; //uppercase it!
if( str[0] >= 'A' && str[0] <= 'Z' &&
str[1] >= '0' && str[1] <= '9' )
{ //only update, if coordinate is valid.
gExitGrid.ubGotoSectorY = (UINT8)(str[0] - 'A' + 1);
gExitGrid.ubGotoSectorX = (UINT8)(str[1] - '0');
if( str[2] >= '0' && str[2] <= '9' )
gExitGrid.ubGotoSectorX = (UINT8)(gExitGrid.ubGotoSectorX * 10 + str[2] - '0' );
gExitGrid.ubGotoSectorX = (UINT8)max( min( gExitGrid.ubGotoSectorX, 16 ), 1 );
gExitGrid.ubGotoSectorY = (UINT8)max( min( gExitGrid.ubGotoSectorY, 16 ), 1 );
}
gExitGrid.ubGotoSectorZ = (UINT8)max( min( GetNumericStrictValueFromField( 8 ), 3 ), 0 );
gExitGrid.usGridNo = max( min( GetNumericStrictValueFromField( 9 ), (WORLD_COLS_MAX * WORLD_ROWS_MAX) ), 0 );
UpdateMapInfoFields();
}
BOOLEAN ApplyNewExitGridValuesToTextFields()
{
CHAR16 str[10];
//exit grid input fields
if( iCurrentTaskbar != TASK_MAPINFO )
return FALSE;
swprintf( str, L"%c%d", gExitGrid.ubGotoSectorY + 'A' - 1, gExitGrid.ubGotoSectorX );
SetInputFieldStringWith16BitString( 7, str );
swprintf( str, L"%d", gExitGrid.ubGotoSectorZ );
SetInputFieldStringWith16BitString( 8, str );
swprintf( str, L"%d", gExitGrid.usGridNo );
SetInputFieldStringWith16BitString( 9, str );
SetActiveField( 0 );
return TRUE;
}
INT32 usCurrentExitGridNo = 0;
void LocateNextExitGrid()
{
EXITGRID ExitGrid;
INT32 i;
for( i = usCurrentExitGridNo + 1; i < WORLD_MAX; i++ )
{
if( GetExitGrid( i, &ExitGrid ) )
{
usCurrentExitGridNo = i;
CenterScreenAtMapIndex( i );
return;
}
}
for( i = 0; i < usCurrentExitGridNo; i++ )
{
if( GetExitGrid( i, &ExitGrid ) )
{
usCurrentExitGridNo = i;
CenterScreenAtMapIndex( i );
return;
}
}
}
void ChangeLightDefault( INT8 bLightType )
{
UnclickEditorButton( MAPINFO_PRIMETIME_LIGHT + gbDefaultLightType );
gbDefaultLightType = bLightType;
ClickEditorButton( MAPINFO_PRIMETIME_LIGHT + gbDefaultLightType );
}
#endif