diff --git a/src/include/minimap.h b/src/include/minimap.h index 15217556b..3776db005 100644 --- a/src/include/minimap.h +++ b/src/include/minimap.h @@ -10,7 +10,7 @@ // /**@name minimap.h - The minimap headerfile. */ // -// (c) Copyright 1998,2000-2002 by Lutz Sammer +// (c) Copyright 1998,2000-2003 by Lutz Sammer and Jimmy Salmon // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published @@ -55,6 +55,8 @@ extern int MinimapShowSelected; /// highlight selected units /// Update tile change in minimap extern void UpdateMinimapXY(int tx,int ty); + /// Update minimap terrain +extern void UpdateMinimapTerrain(void); /// Update complete minimap extern void UpdateMinimap(void); /// Create new minimap diff --git a/src/map/minimap.cpp b/src/map/minimap.cpp index 44c2c67b0..6667aa15a 100644 --- a/src/map/minimap.cpp +++ b/src/map/minimap.cpp @@ -10,7 +10,7 @@ // /**@name minimap.c - The minimap. */ // -// (c) Copyright 1998-2003 by Lutz Sammer +// (c) Copyright 1998-2003 by Lutz Sammer and Jimmy Salmon // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published @@ -47,6 +47,7 @@ -- Variables ----------------------------------------------------------------------------*/ +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 @@ -64,6 +65,14 @@ global int MinimapWithTerrain=1; /// display minimap with terrain global int MinimapFriendly=1; /// switch colors of friendly units global int MinimapShowSelected=1; /// highlight selected units +local int OldMinimapCursorX; /// Save MinimapCursorX +local int OldMinimapCursorY; /// Save MinimapCursorY +local int OldMinimapCursorW; /// Save MinimapCursorW +local int OldMinimapCursorH; /// Save MinimapCursorH +local int OldMinimapCursorSize; /// Saved image size + +local void* OldMinimapCursorImage; /// Saved image behind cursor + /*---------------------------------------------------------------------------- -- Functions ----------------------------------------------------------------------------*/ @@ -77,7 +86,7 @@ global int MinimapShowSelected=1; /// highlight selected units ** @param tx Tile X position, where the map changed. ** @param ty Tile Y position, where the map changed. ** -** FIXME: this can surely speeded up?? +** FIXME: this can surely be sped up?? */ global void UpdateMinimapXY(int tx,int ty) { @@ -94,7 +103,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<MINIMAP_H-MinimapY; ++my ) { y=Minimap2MapY[my]; if( y<ty ) { continue; @@ -103,7 +112,7 @@ global void UpdateMinimapXY(int tx,int ty) break; } - for( mx=MinimapX; mx<MINIMAP_W-MinimapX; mx++ ) { + for( mx=MinimapX; mx<MINIMAP_W-MinimapX; ++mx ) { int tile; x=Minimap2MapX[mx]; @@ -115,7 +124,7 @@ global void UpdateMinimapXY(int tx,int ty) } tile=TheMap.Fields[x+y].Tile; - ((unsigned char*)MinimapGraphic->Frames)[mx+my*MINIMAP_W]= + ((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*MINIMAP_W]= TheMap.Tiles[tile][7+(mx%scale)*8+(6+(my%scale)*8)*TileSizeX]; } } @@ -126,9 +135,9 @@ global void UpdateMinimapXY(int tx,int ty) ** ** @todo FIXME: this is not correct should use SeenTile. ** -** FIXME: this can surely speeded up?? +** FIXME: this can surely be sped up?? */ -global void UpdateMinimap(void) +global void UpdateMinimapTerrain(void) { int mx; int my; @@ -141,12 +150,12 @@ global void UpdateMinimap(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<MINIMAP_H-MinimapY; ++my ) { + for( mx=MinimapX; mx<MINIMAP_W-MinimapX; ++mx ) { int tile; tile=TheMap.Fields[Minimap2MapX[mx]+Minimap2MapY[my]].Tile; - ((unsigned char*)MinimapGraphic->Frames)[mx+my*MINIMAP_W]= + ((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*MINIMAP_W]= TheMap.Tiles[tile][7+(mx%scale)*8+(6+(my%scale)*8)*TileSizeX]; } } @@ -161,7 +170,7 @@ global void CreateMinimap(void) { int n; - if( TheMap.Width>TheMap.Height ) { // Scale too biggest value. + if( TheMap.Width>TheMap.Height ) { // Scale to biggest value. n=TheMap.Width; } else { n=TheMap.Height; @@ -194,10 +203,13 @@ 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); + MinimapGraphic->Pixels=VideoCreateSharedPalette(GlobalPalette); memset(MinimapGraphic->Frames,0,MINIMAP_W*MINIMAP_H); - UpdateMinimap(); + UpdateMinimapTerrain(); } /** @@ -205,6 +217,8 @@ global void CreateMinimap(void) */ global void DestroyMinimap(void) { + VideoSaveFree(MinimapTerrainGraphic); + MinimapTerrainGraphic=NULL; VideoSaveFree(MinimapGraphic); MinimapGraphic=NULL; memset(Minimap2MapX,0,MINIMAP_W*sizeof(int)); @@ -212,22 +226,15 @@ global void DestroyMinimap(void) } /** -** Draw the mini-map with current viewpoint. -** -** @param vx View point X position. -** @param vy View point Y position. -** +** Update the minimap ** @note This one of the hot-points in the program optimize and optimize! */ -global void DrawMinimap(int vx __attribute__((unused)), - int vy __attribute__((unused))) +global void UpdateMinimap(void) { static int red_phase; int new_phase; int mx; int my; - int x; - int y; UnitType* type; Unit** table; Unit* unit; @@ -235,20 +242,20 @@ global void DrawMinimap(int vx __attribute__((unused)), int h; int h0; - x=(FrameCounter/FRAMES_PER_SECOND)&1; - if( (new_phase=red_phase-x) ) { - red_phase=x; + w=(FrameCounter/FRAMES_PER_SECOND)&1; + if( (new_phase=red_phase-w) ) { + red_phase=w; } - x=TheUI.MinimapX+24; - y=TheUI.MinimapY+2; - // // Draw the mini-map background. Note draws a little too much. // - VideoDrawSub(TheUI.Minimap.Graphic,24,2 - ,TheUI.Minimap.Graphic->Width-48,TheUI.Minimap.Graphic->Height-4 - ,x,y); + // FIXME: position of the minimap in the graphic is hardcoded (24x2) + for( h=0; h<MINIMAP_H; ++h ) { + memcpy(&((unsigned char*)MinimapGraphic->Frames)[h*MINIMAP_W], + &((unsigned char*)TheUI.Minimap.Graphic->Frames)[24+(h+2)*TheUI.Minimap.Graphic->Width], + TheUI.Minimap.Graphic->Width); + } // // Draw the terrain @@ -258,11 +265,11 @@ global void DrawMinimap(int vx __attribute__((unused)), for( mx=0; mx<MINIMAP_W; ++mx ) { if( IsMapFieldVisible(ThisPlayer,Minimap2MapX[mx],(Minimap2MapY[my]/TheMap.Width)) || (IsMapFieldExplored(ThisPlayer,Minimap2MapX[mx], - (Minimap2MapY[my]/TheMap.Width)) && - ((mx&1)==(my&1))) + (Minimap2MapY[my]/TheMap.Width)) && + ((mx&1)==(my&1))) || ReplayRevealMap ) { - VideoDrawPixel(((unsigned char*)MinimapGraphic->Frames) - [mx+my*MINIMAP_W],x+mx,y+my); + ((unsigned char*)MinimapGraphic->Frames)[mx+my*MINIMAP_W]= + ((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*MINIMAP_W]; } } } @@ -270,7 +277,7 @@ global void DrawMinimap(int vx __attribute__((unused)), // // Draw units on map - // FIXME: I should rewrite this complet + // FIXME: I should rewrite this completely // FIXME: make a bitmap of the units, and update it with the moves // FIXME: and other changes // @@ -280,13 +287,9 @@ global void DrawMinimap(int vx __attribute__((unused)), table = &DestroyedBuildings; while( *table ) { SysColors color; - if( !BuildingVisibleOnMap( *table ) && (*table)->SeenState != 3 - && !(*table)->SeenDestroyed ) { - type=(*table)->SeenType; - if( !type ) { - table=&(*table)->Next; - continue; - } + + if( !BuildingVisibleOnMap(*table) && (*table)->SeenState!=3 + && !(*table)->SeenDestroyed && (type=(*table)->SeenType) ) { if( (*table)->Player->Player==PlayerNumNeutral ) { if( type->Critter ) { color=ColorNPC; @@ -299,27 +302,27 @@ global void DrawMinimap(int vx __attribute__((unused)), color=(*table)->Player->Color; } - mx=x+1+MinimapX+Map2MinimapX[(*table)->X]; - my=y+1+MinimapY+Map2MinimapY[(*table)->Y]; + mx=1+MinimapX+Map2MinimapX[(*table)->X]; + my=1+MinimapY+Map2MinimapY[(*table)->Y]; w=Map2MinimapX[type->TileWidth]; - if( mx+w>=x+MINIMAP_W ) { // clip right side - w=x+MINIMAP_W-mx; + if( mx+w>=MINIMAP_W ) { // clip right side + w=MINIMAP_W-mx; } h0=Map2MinimapY[type->TileHeight]; - if( my+h0>=y+MINIMAP_H ) { // clip bottom side - h0=y+MINIMAP_H-my; + if( my+h0>=MINIMAP_H ) { // clip bottom side + h0=MINIMAP_H-my; } while( w-->=0 ) { h=h0; while( h-->=0 ) { - VideoDrawPixel(color,mx+w,my+h); + ((unsigned char*)MinimapGraphic->Frames)[mx+w+(my+h)*MINIMAP_W]=color; } } } table=&(*table)->Next; } #endif - for( table=Units; table<Units+NumUnits; table++ ) { + for( table=Units; table<Units+NumUnits; ++table ) { SysColors color; unit=*table; @@ -365,32 +368,38 @@ global void DrawMinimap(int vx __attribute__((unused)), color=unit->Player->Color; } - mx=x+1+MinimapX+Map2MinimapX[unit->X]; - my=y+1+MinimapY+Map2MinimapY[unit->Y]; + mx=1+MinimapX+Map2MinimapX[unit->X]; + my=1+MinimapY+Map2MinimapY[unit->Y]; w=Map2MinimapX[type->TileWidth]; - if( mx+w>=x+MINIMAP_W ) { // clip right side - w=x+MINIMAP_W-mx; + if( mx+w>=MINIMAP_W ) { // clip right side + w=MINIMAP_W-mx; } h0=Map2MinimapY[type->TileHeight]; - if( my+h0>=y+MINIMAP_H ) { // clip bottom side - h0=y+MINIMAP_H-my; + if( my+h0>=MINIMAP_H ) { // clip bottom side + h0=MINIMAP_H-my; } while( w-->=0 ) { h=h0; while( h-->=0 ) { - VideoDrawPixel(color,mx+w,my+h); + ((unsigned char*)MinimapGraphic->Frames)[mx+w+(my+h)*MINIMAP_W]=color; } } } } -local int OldMinimapCursorX; /// Save MinimapCursorX -local int OldMinimapCursorY; /// Save MinimapCursorY -local int OldMinimapCursorW; /// Save MinimapCursorW -local int OldMinimapCursorH; /// Save MinimapCursorH -local int OldMinimapCursorSize; /// Saved image size - -local void* OldMinimapCursorImage; /// Saved image behind cursor +/** +** Draw the mini-map with current viewpoint. +** +** @param vx View point X position. +** @param vy View point Y position. +*/ +global void DrawMinimap(int vx __attribute__((unused)), + int vy __attribute__((unused))) +{ + VideoDrawSub(MinimapGraphic,0,0 + ,MinimapGraphic->Width,MinimapGraphic->Height + ,TheUI.MinimapX+24,TheUI.MinimapY+2); +} /** ** Hide minimap cursor. @@ -398,10 +407,10 @@ local void* OldMinimapCursorImage; /// Saved image behind cursor global void HideMinimapCursor(void) { if( OldMinimapCursorW ) { - LoadCursorRectangle(OldMinimapCursorImage, - OldMinimapCursorX,OldMinimapCursorY, - OldMinimapCursorW,OldMinimapCursorH); - OldMinimapCursorW=0; + LoadCursorRectangle(OldMinimapCursorImage, + OldMinimapCursorX,OldMinimapCursorY, + OldMinimapCursorW,OldMinimapCursorH); + OldMinimapCursorW=0; } } @@ -420,28 +429,29 @@ global void DrawMinimapCursor(int vx, int vy) int i; // Determine and save region below minimap cursor - OldMinimapCursorX = x = - TheUI.MinimapX + 24 + MinimapX + (vx * MinimapScale) / MINIMAP_FAC; - OldMinimapCursorY = y = - TheUI.MinimapY + 2 + MinimapY + (vy * MinimapScale) / MINIMAP_FAC; - OldMinimapCursorW = w = - (TheUI.SelectedViewport->MapWidth * MinimapScale) / MINIMAP_FAC; - OldMinimapCursorH = h = - (TheUI.SelectedViewport->MapHeight * MinimapScale) / MINIMAP_FAC; - i = (w + 1 + h) * 2 * VideoTypeSize; - if (OldMinimapCursorSize < i) { - if (OldMinimapCursorImage) { - OldMinimapCursorImage = realloc(OldMinimapCursorImage, i); + // FIXME: position of the minimap in the graphic is hardcoded (24x2) + OldMinimapCursorX=x= + TheUI.MinimapX+24+MinimapX+(vx*MinimapScale)/MINIMAP_FAC; + OldMinimapCursorY=y= + TheUI.MinimapY+2+MinimapY+(vy*MinimapScale)/MINIMAP_FAC; + OldMinimapCursorW=w= + (TheUI.SelectedViewport->MapWidth*MinimapScale)/MINIMAP_FAC; + OldMinimapCursorH=h= + (TheUI.SelectedViewport->MapHeight*MinimapScale)/MINIMAP_FAC; + i=(w+1+h)*2*VideoTypeSize; + if( OldMinimapCursorSize<i ) { + if( OldMinimapCursorImage ) { + OldMinimapCursorImage=realloc(OldMinimapCursorImage,i); } else { - OldMinimapCursorImage = malloc(i); + OldMinimapCursorImage=malloc(i); } DebugLevel3("Cursor memory %d\n" _C_ i); - OldMinimapCursorSize = i; + OldMinimapCursorSize=i; } - SaveCursorRectangle(OldMinimapCursorImage, x, y, w, h); + SaveCursorRectangle(OldMinimapCursorImage,x,y,w,h); // Draw cursor as rectangle (Note: unclipped, as it is always visible) - VideoDraw50TransRectangle(TheUI.ViewportCursorColor, x, y, w, h); + VideoDraw50TransRectangle(TheUI.ViewportCursorColor,x,y,w,h); } /** diff --git a/src/stratagus/mainloop.cpp b/src/stratagus/mainloop.cpp index 1923bf320..95d3ab759 100644 --- a/src/stratagus/mainloop.cpp +++ b/src/stratagus/mainloop.cpp @@ -10,7 +10,7 @@ // /**@name mainloop.c - The main game loop. */ // -// (c) Copyright 1998-2003 by Lutz Sammer +// (c) Copyright 1998-2003 by Lutz Sammer and Jimmy Salmon // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published @@ -744,11 +744,6 @@ global void GameMainLoop(void) PlayersEachCycle(); // handle players UpdateTimer(); // update game timer - // FIXME: We don't do redraw if needed, costs to much cpu time - if( MustRedraw!=RedrawEverything ) { - MustRedraw&=~RedrawMinimap; // FIXME: this a little hack! - } - // // Work todo each second. // Split into different frames, to reduce cpu time. @@ -768,6 +763,7 @@ global void GameMainLoop(void) UnitIncrementHealth(); // berserker healing break; case 2: // minimap update + UpdateMinimap(); MustRedraw|=RedrawMinimap; break; case 3: // computer players diff --git a/src/ui/menus.cpp b/src/ui/menus.cpp index 144c2a346..ea4c7269b 100644 --- a/src/ui/menus.cpp +++ b/src/ui/menus.cpp @@ -5829,7 +5829,7 @@ local void EditorMapPropertiesOk(void) LoadConstructions(); LoadUnitTypes(); LoadIcons(); - UpdateMinimap(); + UpdateMinimapTerrain(); } // FIXME: Save the pud version somewhere