Minimap size is configurable

This commit is contained in:
jsalmon3 2003-10-04 04:26:50 +00:00
parent 04e857ac3d
commit 5f133aba81
8 changed files with 88 additions and 65 deletions

View file

@ -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;
}

View file

@ -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)

View file

@ -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

View file

@ -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 =

View file

@ -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(

View file

@ -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;
}

View file

@ -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);

View file

@ -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);