Minimap size is configurable
This commit is contained in:
parent
04e857ac3d
commit
5f133aba81
8 changed files with 88 additions and 65 deletions
src
editor
include
map
stratagus
ui
|
@ -1578,8 +1578,8 @@ local void EditorCallbackMouse(int x, int y)
|
|||
//
|
||||
// Minimap
|
||||
//
|
||||
if (x >= TheUI.MinimapPosX && x < TheUI.MinimapPosX + MINIMAP_W &&
|
||||
y >= TheUI.MinimapPosY && y < TheUI.MinimapPosY + MINIMAP_H) {
|
||||
if (x >= TheUI.MinimapPosX && x < TheUI.MinimapPosX + TheUI.MinimapW &&
|
||||
y >= TheUI.MinimapPosY && y < TheUI.MinimapPosY + TheUI.MinimapH) {
|
||||
CursorOn = CursorOnMinimap;
|
||||
}
|
||||
|
||||
|
@ -1731,8 +1731,8 @@ local void EditorCallbackMouse(int x, int y)
|
|||
//
|
||||
// Minimap
|
||||
//
|
||||
if (x >= TheUI.MinimapPosX && x < TheUI.MinimapPosX + MINIMAP_W &&
|
||||
y >= TheUI.MinimapPosY && y < TheUI.MinimapPosY + MINIMAP_H) {
|
||||
if (x >= TheUI.MinimapPosX && x < TheUI.MinimapPosX + TheUI.MinimapW &&
|
||||
y >= TheUI.MinimapPosY && y < TheUI.MinimapPosY + TheUI.MinimapH) {
|
||||
CursorOn = CursorOnMinimap;
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -356,9 +356,6 @@ extern char NameLine[];
|
|||
#define MAXMAP_W 50 /// Maximum map width in tiles on screen
|
||||
#define MAXMAP_H 40 /// Maximum map height in tiles
|
||||
|
||||
#define MINIMAP_W 128 /// Minimap width in pixels
|
||||
#define MINIMAP_H 128 /// Minimap height in pixels
|
||||
|
||||
/// Scrolling area (<= 15 y)
|
||||
#define SCROLL_UP 15
|
||||
/// Scrolling area (>= VideoHeight-16 y)
|
||||
|
|
|
@ -261,6 +261,8 @@ typedef struct _ui_ {
|
|||
GraphicConfig MinimapPanel; /// minimap panel background
|
||||
int MinimapPanelX; /// minimap panel screen X position
|
||||
int MinimapPanelY; /// minimap panel screen Y position
|
||||
int MinimapW; /// minimap screen Width
|
||||
int MinimapH; /// minimap screen Height
|
||||
int MinimapPosX; /// minimap screen X position
|
||||
int MinimapPosY; /// minimap screen Y position
|
||||
int ViewportCursorColor; /// minimap cursor color
|
||||
|
|
|
@ -54,8 +54,8 @@
|
|||
|
||||
local Graphic* MinimapTerrainGraphic; /// generated minimap terrain
|
||||
local Graphic* MinimapGraphic; /// generated minimap
|
||||
local int Minimap2MapX[MINIMAP_W]; /// fast conversion table
|
||||
local int Minimap2MapY[MINIMAP_H]; /// fast conversion table
|
||||
local int* Minimap2MapX; /// fast conversion table
|
||||
local int* Minimap2MapY; /// fast conversion table
|
||||
local int Map2MinimapX[MaxMapWidth]; /// fast conversion table
|
||||
local int Map2MinimapY[MaxMapHeight]; /// fast conversion table
|
||||
|
||||
|
@ -109,7 +109,7 @@ global void UpdateMinimapXY(int tx, int ty)
|
|||
// Pixel 7,6 7,14, 15,6 15,14 are taken for the minimap picture.
|
||||
//
|
||||
ty *= TheMap.Width;
|
||||
for (my = MinimapY; my < MINIMAP_H - MinimapY; ++my) {
|
||||
for (my = MinimapY; my < TheUI.MinimapH - MinimapY; ++my) {
|
||||
y = Minimap2MapY[my];
|
||||
if (y < ty) {
|
||||
continue;
|
||||
|
@ -118,7 +118,7 @@ global void UpdateMinimapXY(int tx, int ty)
|
|||
break;
|
||||
}
|
||||
|
||||
for (mx = MinimapX; mx < MINIMAP_W - MinimapX; ++mx) {
|
||||
for (mx = MinimapX; mx < TheUI.MinimapW - MinimapX; ++mx) {
|
||||
int tile;
|
||||
|
||||
x = Minimap2MapX[mx];
|
||||
|
@ -130,7 +130,7 @@ global void UpdateMinimapXY(int tx, int ty)
|
|||
}
|
||||
|
||||
tile = TheMap.Fields[x + y].Tile;
|
||||
((unsigned char*)MinimapTerrainGraphic->Frames)[mx + my * MINIMAP_W] =
|
||||
((unsigned char*)MinimapTerrainGraphic->Frames)[mx + my * TheUI.MinimapW] =
|
||||
TheMap.Tiles[tile][7 + (mx % scale) * 8 + (6 + (my % scale) * 8) * TileSizeX];
|
||||
}
|
||||
}
|
||||
|
@ -156,12 +156,12 @@ global void UpdateMinimapTerrain(void)
|
|||
//
|
||||
// Pixel 7,6 7,14, 15,6 15,14 are taken for the minimap picture.
|
||||
//
|
||||
for (my = MinimapY; my < MINIMAP_H - MinimapY; ++my) {
|
||||
for (mx = MinimapX; mx < MINIMAP_W - MinimapX; ++mx) {
|
||||
for (my = MinimapY; my < TheUI.MinimapH - MinimapY; ++my) {
|
||||
for (mx = MinimapX; mx < TheUI.MinimapW - MinimapX; ++mx) {
|
||||
int tile;
|
||||
|
||||
tile = TheMap.Fields[Minimap2MapX[mx] + Minimap2MapY[my]].Tile;
|
||||
((unsigned char*)MinimapTerrainGraphic->Frames)[mx + my * MINIMAP_W] =
|
||||
((unsigned char*)MinimapTerrainGraphic->Frames)[mx + my * TheUI.MinimapW] =
|
||||
TheMap.Tiles[tile][7 + (mx % scale) * 8 + (6 + (my % scale) * 8) * TileSizeX];
|
||||
}
|
||||
}
|
||||
|
@ -181,12 +181,12 @@ global void CreateMinimap(void)
|
|||
} else {
|
||||
n = TheMap.Height;
|
||||
}
|
||||
MinimapScale = (MINIMAP_W * MINIMAP_FAC) / n;
|
||||
MinimapScale = (TheUI.MinimapW * MINIMAP_FAC) / n;
|
||||
|
||||
MinimapX = ((MINIMAP_W * MINIMAP_FAC) / MinimapScale - TheMap.Width) / 2;
|
||||
MinimapY = ((MINIMAP_H * MINIMAP_FAC) / MinimapScale - TheMap.Height) / 2;
|
||||
MinimapX = (MINIMAP_W - (TheMap.Width * MinimapScale) / MINIMAP_FAC) / 2;
|
||||
MinimapY = (MINIMAP_H - (TheMap.Height * MinimapScale) / MINIMAP_FAC) / 2;
|
||||
MinimapX = ((TheUI.MinimapW * MINIMAP_FAC) / MinimapScale - TheMap.Width) / 2;
|
||||
MinimapY = ((TheUI.MinimapH * MINIMAP_FAC) / MinimapScale - TheMap.Height) / 2;
|
||||
MinimapX = (TheUI.MinimapW - (TheMap.Width * MinimapScale) / MINIMAP_FAC) / 2;
|
||||
MinimapY = (TheUI.MinimapH - (TheMap.Height * MinimapScale) / MINIMAP_FAC) / 2;
|
||||
|
||||
DebugLevel0Fn("MinimapScale %d(%d), X off %d, Y off %d\n" _C_
|
||||
MinimapScale / MINIMAP_FAC _C_ MinimapScale _C_ MinimapX _C_ MinimapY);
|
||||
|
@ -196,10 +196,12 @@ global void CreateMinimap(void)
|
|||
//
|
||||
// FIXME: this needs to be recalculated during map load - the map size
|
||||
// might have changed!
|
||||
for (n = MinimapX; n < MINIMAP_W - MinimapX; ++n) {
|
||||
Minimap2MapX = calloc(sizeof(int), TheUI.MinimapW * TheUI.MinimapH);
|
||||
Minimap2MapY = calloc(sizeof(int), TheUI.MinimapW * TheUI.MinimapH);
|
||||
for (n = MinimapX; n < TheUI.MinimapW - MinimapX; ++n) {
|
||||
Minimap2MapX[n] = ((n - MinimapX) * MINIMAP_FAC) / MinimapScale;
|
||||
}
|
||||
for (n = MinimapY; n < MINIMAP_H - MinimapY; ++n) {
|
||||
for (n = MinimapY; n < TheUI.MinimapH - MinimapY; ++n) {
|
||||
Minimap2MapY[n] = (((n - MinimapY) * MINIMAP_FAC) / MinimapScale) * TheMap.Width;
|
||||
}
|
||||
for (n = 0; n < TheMap.Width; ++n) {
|
||||
|
@ -209,11 +211,11 @@ global void CreateMinimap(void)
|
|||
Map2MinimapY[n] = (n * MinimapScale) / MINIMAP_FAC;
|
||||
}
|
||||
|
||||
MinimapTerrainGraphic = NewGraphic(8, MINIMAP_W, MINIMAP_H);
|
||||
memset(MinimapTerrainGraphic->Frames, 0, MINIMAP_W * MINIMAP_H);
|
||||
MinimapGraphic = NewGraphic(8, MINIMAP_W, MINIMAP_H);
|
||||
MinimapTerrainGraphic = NewGraphic(8, TheUI.MinimapW, TheUI.MinimapH);
|
||||
memset(MinimapTerrainGraphic->Frames, 0, TheUI.MinimapW * TheUI.MinimapH);
|
||||
MinimapGraphic = NewGraphic(8, TheUI.MinimapW, TheUI.MinimapH);
|
||||
MinimapGraphic->Pixels = VideoCreateNewPalette(GlobalPalette);
|
||||
memset(MinimapGraphic->Frames, 0, MINIMAP_W * MINIMAP_H);
|
||||
memset(MinimapGraphic->Frames, 0, TheUI.MinimapW * TheUI.MinimapH);
|
||||
|
||||
UpdateMinimapTerrain();
|
||||
}
|
||||
|
@ -231,8 +233,10 @@ global void DestroyMinimap(void)
|
|||
}
|
||||
VideoSaveFree(MinimapGraphic);
|
||||
MinimapGraphic = NULL;
|
||||
memset(Minimap2MapX, 0, MINIMAP_W * sizeof(int));
|
||||
memset(Minimap2MapY, 0, MINIMAP_H * sizeof(int));
|
||||
free(Minimap2MapX);
|
||||
Minimap2MapX = NULL;
|
||||
free(Minimap2MapY);
|
||||
Minimap2MapY = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -263,20 +267,20 @@ global void UpdateMinimap(void)
|
|||
// FIXME: make the image really use colorkey
|
||||
// FIXME: I think this is only necessary on each map size change?
|
||||
// Or maybe if you disable displaying terrain, too?
|
||||
memset(MinimapGraphic->Frames, 0, MINIMAP_W * MINIMAP_H);
|
||||
memset(MinimapGraphic->Frames, 0, TheUI.MinimapW * TheUI.MinimapH);
|
||||
|
||||
//
|
||||
// Draw the terrain
|
||||
//
|
||||
if (MinimapWithTerrain) {
|
||||
for (my = 0; my < MINIMAP_H; ++my) {
|
||||
for (mx = 0; mx < MINIMAP_W; ++mx) {
|
||||
for (my = 0; my < TheUI.MinimapH; ++my) {
|
||||
for (mx = 0; mx < TheUI.MinimapW; ++mx) {
|
||||
if (IsMapFieldVisible(ThisPlayer, Minimap2MapX[mx], Minimap2MapY[my] / TheMap.Width) ||
|
||||
(IsMapFieldExplored(ThisPlayer,Minimap2MapX[mx], Minimap2MapY[my] / TheMap.Width) &&
|
||||
((mx & 1) == (my & 1))) ||
|
||||
ReplayRevealMap) {
|
||||
((unsigned char*)MinimapGraphic->Frames)[mx + my * MINIMAP_W] =
|
||||
((unsigned char*)MinimapTerrainGraphic->Frames)[mx + my * MINIMAP_W];
|
||||
((unsigned char*)MinimapGraphic->Frames)[mx + my * TheUI.MinimapW] =
|
||||
((unsigned char*)MinimapTerrainGraphic->Frames)[mx + my * TheUI.MinimapW];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -314,18 +318,18 @@ global void UpdateMinimap(void)
|
|||
mx = 1 + MinimapX + Map2MinimapX[(*table)->X];
|
||||
my = 1 + MinimapY + Map2MinimapY[(*table)->Y];
|
||||
w = Map2MinimapX[type->TileWidth];
|
||||
if (mx + w >= MINIMAP_W) { // clip right side
|
||||
w = MINIMAP_W - mx;
|
||||
if (mx + w >= TheUI.MinimapW) { // clip right side
|
||||
w = TheUI.MinimapW - mx;
|
||||
}
|
||||
h0 = Map2MinimapY[type->TileHeight];
|
||||
if (my + h0 >= MINIMAP_H) { // clip bottom side
|
||||
h0 = MINIMAP_H - my;
|
||||
if (my + h0 >= TheUI.MinimapH) { // clip bottom side
|
||||
h0 = TheUI.MinimapH - my;
|
||||
}
|
||||
while (w-- >= 0) {
|
||||
h = h0;
|
||||
while (h-- >= 0) {
|
||||
((unsigned char*)MinimapGraphic->Frames)[
|
||||
mx + w + (my + h) * MINIMAP_W] = color;
|
||||
mx + w + (my + h) * TheUI.MinimapW] = color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -384,18 +388,18 @@ global void UpdateMinimap(void)
|
|||
mx = 1 + MinimapX + Map2MinimapX[unit->X];
|
||||
my = 1 + MinimapY + Map2MinimapY[unit->Y];
|
||||
w = Map2MinimapX[type->TileWidth];
|
||||
if (mx + w >= MINIMAP_W) { // clip right side
|
||||
w = MINIMAP_W - mx;
|
||||
if (mx + w >= TheUI.MinimapW) { // clip right side
|
||||
w = TheUI.MinimapW - mx;
|
||||
}
|
||||
h0 = Map2MinimapY[type->TileHeight];
|
||||
if (my + h0 >= MINIMAP_H) { // clip bottom side
|
||||
h0 = MINIMAP_H - my;
|
||||
if (my + h0 >= TheUI.MinimapH) { // clip bottom side
|
||||
h0 = TheUI.MinimapH - my;
|
||||
}
|
||||
while (w-- >= 0) {
|
||||
h = h0;
|
||||
while (h-- >= 0) {
|
||||
((unsigned char*)MinimapGraphic->Frames)[
|
||||
mx + w + (my + h) * MINIMAP_W] = color;
|
||||
mx + w + (my + h) * TheUI.MinimapW] = color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -447,7 +451,6 @@ global void DrawMinimapCursor(int vx, int vy)
|
|||
int i;
|
||||
|
||||
// Determine and save region below minimap cursor
|
||||
// FIXME: position of the minimap in the graphic is hardcoded (24x2)
|
||||
OldMinimapCursorX = x =
|
||||
TheUI.MinimapPosX + MinimapX + (vx * MinimapScale) / MINIMAP_FAC;
|
||||
OldMinimapCursorY = y =
|
||||
|
|
|
@ -689,7 +689,7 @@ global void UpdateDisplay(void)
|
|||
// FIXME: Redraws too much of the minimap
|
||||
InvalidateAreaAndCheckCursor(
|
||||
TheUI.MinimapPosX,TheUI.MinimapPosY
|
||||
,MINIMAP_W,MINIMAP_H);
|
||||
,TheUI.MinimapW,TheUI.MinimapH);
|
||||
}
|
||||
if( MustRedraw&RedrawInfoPanel ) {
|
||||
InvalidateAreaAndCheckCursor(
|
||||
|
|
|
@ -481,8 +481,8 @@ local void HandleMouseOn(int x, int y)
|
|||
//
|
||||
// Minimap
|
||||
//
|
||||
if (x >= TheUI.MinimapPosX && x < TheUI.MinimapPosX + MINIMAP_W &&
|
||||
y >= TheUI.MinimapPosY && y < TheUI.MinimapPosY + MINIMAP_H) {
|
||||
if (x >= TheUI.MinimapPosX && x < TheUI.MinimapPosX + TheUI.MinimapW &&
|
||||
y >= TheUI.MinimapPosY && y < TheUI.MinimapPosY + TheUI.MinimapH) {
|
||||
CursorOn = CursorOnMinimap;
|
||||
return;
|
||||
}
|
||||
|
@ -579,16 +579,16 @@ global void RestrictCursorToMinimap(void)
|
|||
{
|
||||
if (CursorX < TheUI.MinimapPosX) {
|
||||
CursorStartX = TheUI.MinimapPosX;
|
||||
} else if (CursorX >= TheUI.MinimapPosX + MINIMAP_W) {
|
||||
CursorStartX = TheUI.MinimapPosX + MINIMAP_W - 1;
|
||||
} else if (CursorX >= TheUI.MinimapPosX + TheUI.MinimapW) {
|
||||
CursorStartX = TheUI.MinimapPosX + TheUI.MinimapW - 1;
|
||||
} else {
|
||||
CursorStartX = CursorX;
|
||||
}
|
||||
|
||||
if (CursorY < TheUI.MinimapPosY) {
|
||||
CursorStartY = TheUI.MinimapPosY;
|
||||
} else if (CursorY >= TheUI.MinimapPosY + MINIMAP_H) {
|
||||
CursorStartY = TheUI.MinimapPosY + MINIMAP_H - 1;
|
||||
} else if (CursorY >= TheUI.MinimapPosY + TheUI.MinimapW) {
|
||||
CursorStartY = TheUI.MinimapPosY + TheUI.MinimapH - 1;
|
||||
} else {
|
||||
CursorStartY = CursorY;
|
||||
}
|
||||
|
|
|
@ -1643,17 +1643,35 @@ local SCM CclDefineUI(SCM list)
|
|||
ui->MenuButtonGraphic.File = SCM_PopNewStr(&sublist);
|
||||
ui->MenuButtonGraphicX = SCM_PopInt(&sublist);
|
||||
ui->MenuButtonGraphicY = SCM_PopInt(&sublist);
|
||||
} else if (gh_eq_p(value, gh_symbol2scm("minimap-panel"))) {
|
||||
} else if (gh_eq_p(value, gh_symbol2scm("minimap"))) {
|
||||
sublist = gh_car(list);
|
||||
list = gh_cdr(list);
|
||||
ui->MinimapPanel.File = SCM_PopNewStr(&sublist);
|
||||
ui->MinimapPanelX = SCM_PopInt(&sublist);
|
||||
ui->MinimapPanelY = SCM_PopInt(&sublist);
|
||||
} else if (gh_eq_p(value, gh_symbol2scm("minimap-pos"))) {
|
||||
sublist = gh_car(list);
|
||||
list = gh_cdr(list);
|
||||
ui->MinimapPosX = SCM_PopInt(&sublist);
|
||||
ui->MinimapPosY = SCM_PopInt(&sublist);
|
||||
while (!gh_null_p(sublist)) {
|
||||
value = gh_car(sublist);
|
||||
sublist = gh_cdr(sublist);
|
||||
if (gh_eq_p(value, gh_symbol2scm("file"))) {
|
||||
value = gh_car(sublist);
|
||||
sublist = gh_cdr(sublist);
|
||||
ui->MinimapPanel.File = gh_scm2newstr(value, NULL);
|
||||
} else if (gh_eq_p(value, gh_symbol2scm("panel-pos"))) {
|
||||
value = gh_car(sublist);
|
||||
sublist = gh_cdr(sublist);
|
||||
ui->MinimapPanelX = gh_scm2int(gh_car(value));
|
||||
ui->MinimapPanelY = gh_scm2int(gh_car(gh_cdr(value)));
|
||||
} else if (gh_eq_p(value, gh_symbol2scm("pos"))) {
|
||||
value = gh_car(sublist);
|
||||
sublist = gh_cdr(sublist);
|
||||
ui->MinimapPosX = gh_scm2int(gh_car(value));
|
||||
ui->MinimapPosY = gh_scm2int(gh_car(gh_cdr(value)));
|
||||
} else if (gh_eq_p(value, gh_symbol2scm("size"))) {
|
||||
value = gh_car(sublist);
|
||||
sublist = gh_cdr(sublist);
|
||||
ui->MinimapW = gh_scm2int(gh_car(value));
|
||||
ui->MinimapH = gh_scm2int(gh_car(gh_cdr(value)));
|
||||
} else {
|
||||
errl("Unsupported tag", value);
|
||||
}
|
||||
}
|
||||
} else if (gh_eq_p(value, gh_symbol2scm("status-line"))) {
|
||||
sublist = gh_car(list);
|
||||
list = gh_cdr(list);
|
||||
|
|
|
@ -372,12 +372,15 @@ local void SaveUi(CLFile* file, const UI* ui)
|
|||
ui->MenuButtonGraphic.File, ui->MenuButtonGraphicX,
|
||||
ui->MenuButtonGraphicY);
|
||||
|
||||
CLprintf(file, " ; Minimap background\n");
|
||||
CLprintf(file, " 'minimap-panel (list \"%s\" %d %d)\n",
|
||||
ui->MinimapPanel.File, ui->MinimapPanelX, ui->MinimapPanelY);
|
||||
CLprintf(file, " ; Minimap position\n");
|
||||
CLprintf(file, " 'minimap-pos (list %d %d)\n",
|
||||
CLprintf(file, " ; Minimap\n");
|
||||
CLprintf(file, " 'minimap-panel (list\n");
|
||||
CLprintf(file, " 'file \"%s\"\n", ui->MinimapPanel.File);
|
||||
CLprintf(file, " 'panel-pos (%d %d)\n",
|
||||
ui->MinimapPanelX, ui->MinimapPanelY);
|
||||
CLprintf(file, " 'pos (%d %d)\n",
|
||||
ui->MinimapPosX, ui->MinimapPosY);
|
||||
CLprintf(file, " 'size (%d %d))\n",
|
||||
ui->MinimapW, ui->MinimapH);
|
||||
|
||||
CLprintf(file, "\n 'status-line '(");
|
||||
CLprintf(file, "\n file \"%s\"",ui->StatusLine.File);
|
||||
|
|
Loading…
Add table
Reference in a new issue