diff --git a/doc/ChangeLog.html b/doc/ChangeLog.html index d86660e63..b87866170 100644 --- a/doc/ChangeLog.html +++ b/doc/ChangeLog.html @@ -31,6 +31,7 @@ <li>Future 1.19 Release<p> <ul> <li>+++ + <li>Undo the UI rewrite because of CPU usage increase. <li>Made computer reciprocate Shared Vision and Ally Commands (from Russell Smith) <li>Made the 'make it so' cheat reversable and changes build speed for buildings already under construction (Nehal Mistry). <li>Fixed bug #427560: Diplomacy menu button (from Jimmy Salmon). diff --git a/src/action/command.cpp b/src/action/command.cpp index b1b858cde..639382b01 100644 --- a/src/action/command.cpp +++ b/src/action/command.cpp @@ -1373,13 +1373,6 @@ global void CommandAutoSpellCast(Unit* unit,SpellType* spell) */ global void CommandDiplomacy(int player,int state,int opponent) { - // If we work changing states with a computer, it should - // automatically reciprocate the changes :) - if( Players[opponent].Type == PlayerComputer && - Players[player].Type == PlayerPerson ) { - CommandDiplomacy(opponent,state,player); - } - switch( state ) { case DiplomacyNeutral: Players[player].Enemy&=~(1<<opponent); @@ -1412,13 +1405,6 @@ global void CommandSharedVision(int player,int state,int opponent) { int i; Unit* unit; - - // If we work changing states with a computer, it should - // automatically reciprocate the changes :) - if( Players[opponent].Type == PlayerComputer && - Players[player].Type == PlayerPerson ) { - CommandSharedVision(opponent,state,player); - } if( state==0 ) { // Check all tiles and mark unseen ones as explored. diff --git a/src/editor/editloop.cpp b/src/editor/editloop.cpp index d9069c5a4..8a2cb1449 100644 --- a/src/editor/editloop.cpp +++ b/src/editor/editloop.cpp @@ -339,12 +339,13 @@ local int CalculateUnitIcons(void) i = 0; count = 0; x = TheUI.ButtonPanelY + 24; - while (x < TheUI.ButtonPanelEndY - IconHeight) { + while (x < TheUI.ButtonPanelY + TheUI.ButtonPanel.Graphic->Height + - IconHeight) { ++i; x += IconHeight + 2; } x = TheUI.ButtonPanelX + 10; - while (x < TheUI.ButtonPanelEndX) { + while (x < TheUI.ButtonPanelX + 146) { count += i; x += IconWidth + 8; } @@ -618,7 +619,8 @@ local void DrawUnitIcons(void) y = TheUI.ButtonPanelY + 24; i = UnitIndex; - while (y < TheUI.ButtonPanelEndY - IconHeight) { + while (y < TheUI.ButtonPanelY + + TheUI.ButtonPanel.Graphic->Height - IconHeight) { if (i >= MaxShownUnits) { break; } @@ -806,31 +808,6 @@ local void DrawEditorInfo(void) int y; unsigned flags; char buf[256]; - int resx; - int resy; - - resx = resy = 9999; - for (i = 1; i < MaxCosts; ++i) { - x = TheUI.Resources[i].IconX; - if (TheUI.Resources[i].Icon.Graphic && x < resx) { - resx = x; - } - x = TheUI.Resources[i].TextX; - if (x != -1 && x < resx) { - resx = TheUI.Resources[i].IconX; - } - y = TheUI.Resources[i].IconY; - if (TheUI.Resources[i].Icon.Graphic && y < resy) { - resy = y; - } - y = TheUI.Resources[i].TextY; - if (y != -1 && y < resx) { - resy = TheUI.Resources[i].IconY; - } - } - if (resx == 9999 || resy == 9999) { - return; - } x = y = 0; if (TheUI.MouseViewport) { @@ -839,7 +816,7 @@ local void DrawEditorInfo(void) } sprintf(buf, "Editor (%d %d)", x, y); - VideoDrawText(resx + 2, resy + 2, GameFont, buf); + VideoDrawText(TheUI.ResourceX + 2, TheUI.ResourceY + 2, GameFont, buf); // // Flags info @@ -860,7 +837,7 @@ local void DrawEditorInfo(void) flags & MapFieldAirUnit ? 'a' : '-', flags & MapFieldSeaUnit ? 's' : '-', flags & MapFieldBuilding ? 'b' : '-'); - VideoDrawText(resx + 118, resy + 2, GameFont, buf); + VideoDrawText(TheUI.ResourceX + 118, TheUI.ResourceY + 2, GameFont, buf); // // Tile info @@ -881,7 +858,7 @@ local void DrawEditorInfo(void) ? TheMap.Tileset->TileNames[TheMap.Tileset->MixedNameTable[i]] : ""); - VideoDrawText(resx + 252, resy + 2, GameFont, buf); + VideoDrawText(TheUI.ResourceX + 252, TheUI.ResourceY + 2, GameFont, buf); } /** @@ -917,16 +894,6 @@ global void EditorUpdateDisplay(void) DrawMapArea(); // draw the map area - // - // Panels - // - for (i = 0; i < TheUI.NumPanels; ++i) { - if (TheUI.Panel[i].Graphic) { - VideoDraw(TheUI.Panel[i].Graphic, 0, - TheUI.PanelX[i], TheUI.PanelY[i]); - } - } - if (CursorOn == CursorOnMap) { DrawMapCursor(); // cursor on map } @@ -934,14 +901,25 @@ global void EditorUpdateDisplay(void) // // Menu button // - DrawMenuButton(TheUI.MenuButton.Button, - (ButtonAreaUnderCursor == ButtonAreaMenu - && ButtonUnderCursor == 0 ? MenuButtonActive : 0)| + if (TheUI.MenuButton.Graphic) { + VideoDrawSub(TheUI.MenuButton.Graphic, 0, 0, + TheUI.MenuButton.Graphic->Width, TheUI.MenuButton.Graphic->Height, + TheUI.MenuButtonX, TheUI.MenuButtonY); + } + DrawMenuButton(MBUTTON_MAIN, + (ButtonUnderCursor == 0 ? MenuButtonActive : 0)| (GameMenuButtonClicked ? MenuButtonClicked : 0), - TheUI.MenuButton.Width, TheUI.MenuButton.Height, - TheUI.MenuButton.X,TheUI.MenuButton.Y, - GameFont,TheUI.MenuButton.Text,NULL,NULL); + 128, 19, + TheUI.MenuButtonX+24,TheUI.MenuButtonY+2, + GameFont,"Menu (~<F10~>)",NULL,NULL); + // + // Minimap border + // + if (TheUI.Minimap.Graphic) { + VideoDrawSub(TheUI.Minimap.Graphic, 0, 0, TheUI.Minimap.Graphic->Width, + TheUI.Minimap.Graphic->Height, TheUI.MinimapX, TheUI.MinimapY); + } // // Minimap // @@ -958,12 +936,40 @@ global void EditorUpdateDisplay(void) TheUI.InfoPanel.Graphic->Width, TheUI.InfoPanel.Graphic->Height/4, TheUI.InfoPanelX, TheUI.InfoPanelY); } + // + // Button panel + // + if (TheUI.ButtonPanel.Graphic) { + VideoDrawSub(TheUI.ButtonPanel.Graphic, 0, 0, + TheUI.ButtonPanel.Graphic->Width, + TheUI.ButtonPanel.Graphic->Height, TheUI.ButtonPanelX, + TheUI.ButtonPanelY); + } DrawEditorPanel(); + // + // Resource + // + if (TheUI.Resource.Graphic) { + VideoDrawSub(TheUI.Resource.Graphic, 0, 0, + TheUI.Resource.Graphic->Width, TheUI.Resource.Graphic->Height, + TheUI.ResourceX, TheUI.ResourceY); + } if (CursorOn==CursorOnMap) { DrawEditorInfo(); } + // + // Fillers + // + for (i = 0; i < TheUI.NumFillers; ++i) { + if (TheUI.Filler[i].Graphic) { + VideoDrawSub(TheUI.Filler[i].Graphic, 0, 0, + TheUI.Filler[i].Graphic->Width, + TheUI.Filler[i].Graphic->Height, + TheUI.FillerX[i], TheUI.FillerY[i]); + } + } // // Status line // @@ -999,8 +1005,7 @@ local void EditorCallbackButtonUp(unsigned button) if ((1<<button) == LeftButton && GameMenuButtonClicked == 1) { GameMenuButtonClicked = 0; - if (ButtonAreaUnderCursor == ButtonAreaMenu - && ButtonUnderCursor == ButtonUnderMenu) { + if (ButtonUnderCursor == 0) { ProcessMenu("menu-editor", 1); } } @@ -1021,8 +1026,7 @@ local void EditorCallbackButtonDown(unsigned button __attribute__ ((unused))) // // Click on menu button // - if (CursorOn == CursorOnButton && ButtonAreaUnderCursor == ButtonAreaMenu - && ButtonUnderCursor == ButtonUnderMenu + if (CursorOn == CursorOnButton && ButtonUnderCursor == 0 && (MouseButtons & LeftButton) && !GameMenuButtonClicked) { PlayGameSound(GameSounds.Click.Sound, MaxSampleVolume); GameMenuButtonClicked = 1; @@ -1567,14 +1571,13 @@ local void EditorCallbackMouse(int x, int y) CursorOn = -1; CursorPlayer = -1; CursorUnitIndex = -1; - ButtonAreaUnderCursor = -1; ButtonUnderCursor = -1; // // Minimap // - if (x >= TheUI.MinimapX && x < TheUI.MinimapX+TheUI.MinimapW - && y >= TheUI.MinimapY && y < TheUI.MinimapY+TheUI.MinimapH) { + if (x >= TheUI.MinimapX+24 && x < TheUI.MinimapX+24+MINIMAP_W + && y >= TheUI.MinimapY+2 && y < TheUI.MinimapY+2+MINIMAP_H) { CursorOn = CursorOnMinimap; } @@ -1606,7 +1609,8 @@ local void EditorCallbackMouse(int x, int y) i = UnitIndex; by = TheUI.ButtonPanelY + 24; - while (by < TheUI.ButtonPanelEndY - IconHeight) { + while (by < TheUI.ButtonPanelY + + TheUI.ButtonPanel.Graphic->Height - IconHeight) { if (i >= MaxShownUnits || !ShownUnitTypes[i]) { break; } @@ -1709,24 +1713,25 @@ local void EditorCallbackMouse(int x, int y) SetStatusLine("Tile mode"); return; } - if( TheUI.MenuButton.X!=-1 ) { - if( x>=TheUI.MenuButton.X - && x<=TheUI.MenuButton.X+TheUI.MenuButton.Width - && y>TheUI.MenuButton.Y - && y<=TheUI.MenuButton.Y+TheUI.MenuButton.Height ) { - ButtonAreaUnderCursor=ButtonAreaMenu; - ButtonUnderCursor=ButtonUnderMenu; - CursorOn=CursorOnButton; - MustRedraw|=RedrawMenuButton; - return; + for (i = 0; i < (int)(sizeof(TheUI.Buttons)/sizeof(*TheUI.Buttons)); ++i) { + if (x < TheUI.Buttons[i].X + || x > TheUI.Buttons[i].X + TheUI.Buttons[i].Width + || y < TheUI.Buttons[i].Y + || y > TheUI.Buttons[i].Y + TheUI.Buttons[i].Height) { + continue; } + DebugLevel3("On button %d\n" _C_ i); + ButtonUnderCursor = i; + CursorOn = CursorOnButton; + ClearStatusLine(); + return; } // // Minimap // - if (x >= TheUI.MinimapX && x < TheUI.MinimapX + TheUI.MinimapW - && y >= TheUI.MinimapY && y < TheUI.MinimapY + TheUI.MinimapH) { + if (x >= TheUI.MinimapX + 24 && x < TheUI.MinimapX + 24 + MINIMAP_W + && y >= TheUI.MinimapY + 2 && y < TheUI.MinimapY + 2 + MINIMAP_H) { CursorOn = CursorOnMinimap; return; } diff --git a/src/game/campaign.cpp b/src/game/campaign.cpp index b240b3560..a4550c415 100644 --- a/src/game/campaign.cpp +++ b/src/game/campaign.cpp @@ -514,6 +514,22 @@ global void CampaignCclRegister(void) gh_new_procedureN("briefing",CclBriefing); } +/** +** FIXME: should use the names of the real fonts. +*/ +local char *FontNames[] = { + "small", + "game", + "large", + "small-title", + "large-title", + "user1", + "user2", + "user3", + "user4", + "user5", +}; + /** ** Save the campaign module. */ diff --git a/src/include/font.h b/src/include/font.h index 206700f7e..8c6253651 100644 --- a/src/include/font.h +++ b/src/include/font.h @@ -129,12 +129,6 @@ enum _game_font_ { -- Variables ----------------------------------------------------------------------------*/ -/** -** Font names -** FIXME: should use the names of the real fonts. -*/ -extern char *FontNames[]; - /*---------------------------------------------------------------------------- -- Functions ----------------------------------------------------------------------------*/ diff --git a/src/include/freecraft.h b/src/include/freecraft.h index c06883280..486ef78ca 100644 --- a/src/include/freecraft.h +++ b/src/include/freecraft.h @@ -352,6 +352,9 @@ 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) diff --git a/src/include/interface.h b/src/include/interface.h index a85f39600..2e19f0246 100644 --- a/src/include/interface.h +++ b/src/include/interface.h @@ -85,19 +85,6 @@ struct _button_action_ { char* UnitMask; /// for which units is it available }; -enum _button_area_ { - ButtonAreaInfo, - ButtonAreaTraining, - ButtonAreaButton, - ButtonAreaMenu, -}; - -enum _button_under_ { - ButtonUnderMenu, - ButtonUnderNetworkMenu, - ButtonUnderNetworkDiplomacy, -}; - /// current interface state enum _iface_state_ { IfaceStateNormal, /// Normal Game state @@ -245,14 +232,10 @@ extern enum _scroll_state_ MouseScrollState; extern enum _key_state_ KeyState; /// pointer to unit under the cursor extern Unit* UnitUnderCursor; - /// button area under the cursor -extern int ButtonAreaUnderCursor; /// button number under the cursor extern int ButtonUnderCursor; - /// menu button was clicked down + /// button 0 (Game Menu) was clicked down extern char GameMenuButtonClicked; - /// diplomacy button was clicked down -extern char GameDiplomacyButtonClicked; /// Mouse leaves windows stops scroll extern char LeaveStops; /// current CursorOn field diff --git a/src/include/menus.h b/src/include/menus.h index 115e08e47..f5296bfd8 100644 --- a/src/include/menus.h +++ b/src/include/menus.h @@ -60,7 +60,6 @@ typedef int MenuButtonId; /// FIXME: FILL IN THIS TABLE!!!! #define MBUTTON_MAIN 4 /// FIXME: write docu -#define MBUTTON_NETWORK 7 #define MBUTTON_GM_HALF 10 #define MBUTTON_132 13 #define MBUTTON_GM_FULL 16 @@ -330,9 +329,6 @@ extern _MenuFuncHash MenuFuncHash; -- Functions ----------------------------------------------------------------------------*/ - /// Menu button style to char* -extern char *MenuButtonStyle(int style); - /// Initialize the hash tables for the menus extern void InitMenuFuncHash(void); diff --git a/src/include/ui.h b/src/include/ui.h index f74734318..7e3aa1ee1 100644 --- a/src/include/ui.h +++ b/src/include/ui.h @@ -53,6 +53,9 @@ */ #define MOUSESCALE 1 + /// MACRO - HARDCODED NUMBER OF BUTTONS on screen +#define MaxButtons 19 + /// typedef for buttons on screen themselves typedef struct _button_ Button; @@ -163,13 +166,14 @@ typedef struct _ui_ { char* NormalFontColor; /// Color for normal text displayed char* ReverseFontColor; /// Color for reverse text displayed - // Panels - GraphicConfig* Panel; /// Panel graphics - int* PanelX; /// Panel X positions - int* PanelY; /// Panel Y positions - int NumPanels; /// Number of panels + // Fillers + GraphicConfig* Filler; /// Filler graphics + int* FillerX; /// Filler X positions + int* FillerY; /// Filler Y positions + int NumFillers; /// Number of fillers // Resource line + GraphicConfig Resource; /// Resource background int ResourceX; /// Resource X position int ResourceY; /// Resource Y position @@ -194,36 +198,44 @@ typedef struct _ui_ { int IconH; /// icon H position int TextX; /// text X position int TextY; /// text Y position - } Resources[MaxCosts+2]; /// Icon+Text of all resources - /// +2 for food and score + } Resources[MaxCosts]; /// Icon+Text of all resources + + GraphicConfig FoodIcon; /// units icon image + int FoodIconRow; /// units icon image row (frame) + int FoodIconX; /// units icon X position + int FoodIconY; /// units icon Y position + int FoodIconW; /// units icon W position + int FoodIconH; /// units icon H position + int FoodTextX; /// units text X position + int FoodTextY; /// units text Y position + + GraphicConfig ScoreIcon; /// score icon image + int ScoreIconRow; /// score icon image row (frame) + int ScoreIconX; /// score icon X position + int ScoreIconY; /// score icon Y position + int ScoreIconW; /// score icon W position + int ScoreIconH; /// score icon H position + int ScoreTextX; /// score text X position + int ScoreTextY; /// score text Y position // Info panel GraphicConfig InfoPanel; /// Info panel background int InfoPanelX; /// Info panel screen X position int InfoPanelY; /// Info panel screen Y position - int InfoPanelW; /// Info panel screen width - int InfoPanelH; /// Info panel screen height - int InfoPanelNeutralFrame; - int InfoPanelSelectedFrame; - int InfoPanelMagicFrame; - int InfoPanelConstructionFrame; + int InfoPanelW; /// Info panel width + int InfoPanelH; /// Info panel height // Complete bar int CompleteBarColor; /// color for complete bar int CompleteBarX; /// complete bar X position int CompleteBarY; /// complete bar Y position - int CompleteBarW; /// complete bar width - int CompleteBarH; /// complete bar height - char* CompleteBarText; /// complete bar text - unsigned CompleteBarFont; /// complete bar font int CompleteTextX; /// complete text X position int CompleteTextY; /// complete text Y position // Button panel + GraphicConfig ButtonPanel; /// Button panel background int ButtonPanelX; /// Button panel screen X position int ButtonPanelY; /// Button panel screen Y position - int ButtonPanelEndX; /// Button panel screen end X position - int ButtonPanelEndY; /// Button panel screen end Y position // Map area ViewportMode ViewportMode; /// Current viewport mode @@ -235,42 +247,25 @@ typedef struct _ui_ { Viewport MapArea; /// geometry of the whole map area // The menu button - struct { - int X; /// button screen X position - int Y; /// button screen Y position - char* Text; /// button caption - int Width; /// button width - int Height; /// button height - int Button; /// button style - } MenuButton, - NetworkMenuButton, - NetworkDiplomacyButton; + GraphicConfig MenuButton; /// menu button background + int MenuButtonX; /// menu button screen X position + int MenuButtonY; /// menu button screen Y position // The minimap + GraphicConfig Minimap; /// minimap panel background int MinimapX; /// minimap screen X position int MinimapY; /// minimap screen Y position - int MinimapW; /// minimap screen width - int MinimapH; /// minimap screen height - int MinimapCursorColor; /// minimap cursor color + int ViewportCursorColor; /// minimap cursor color // The status line - int StatusLineX; /// Status line screen X position - int StatusLineY; /// Status line screen Y position - int StatusLineW; /// Status line screen width - unsigned StatusLineFont; /// Status line font + GraphicConfig StatusLine; /// Status line background + int StatusLineX; /// status line screeen X position + int StatusLineY; /// status line screeen Y position - // Message area - int MessageAreaX; /// Message screen X position - int MessageAreaY; /// Message screen Y position - int MessageAreaW; /// Message screen width - unsigned MessageAreaFont; /// Message font - - Button* InfoButtons; /// Info buttons - int NumInfoButtons; /// Number of info buttons - Button* TrainingButtons; /// Training buttons - int NumTrainingButtons; /// Number of training buttons - Button* ButtonButtons; /// Button panel buttons - int NumButtonButtons; /// Number of button panel buttons + /// all buttons (1 Menu, 9 Group, 9 Command) + Button Buttons[MaxButtons]; + /// used for displaying unit training queues + Button Buttons2[6]; // Offsets for 640x480 center used by menus int Offset640X; /// Offset for 640x480 X position diff --git a/src/include/upgrade_structs.h b/src/include/upgrade_structs.h index 3cc5ea720..3428a0f12 100644 --- a/src/include/upgrade_structs.h +++ b/src/include/upgrade_structs.h @@ -62,9 +62,6 @@ enum _costs_ { MaxCosts /// how many different costs }; -#define FoodCost MaxCosts -#define ScoreCost MaxCosts+1 - /** ** Speed factor for harvesting resources */ diff --git a/src/map/minimap.cpp b/src/map/minimap.cpp index c371ac749..fec08a501 100644 --- a/src/map/minimap.cpp +++ b/src/map/minimap.cpp @@ -49,8 +49,8 @@ local Graphic* MinimapTerrainGraphic; /// generated minimap terrain local Graphic* MinimapGraphic; /// generated minimap -local int* Minimap2MapX; /// fast conversion table -local int* Minimap2MapY; /// fast conversion table +local int Minimap2MapX[MINIMAP_W]; /// fast conversion table +local int Minimap2MapY[MINIMAP_H]; /// fast conversion table local int Map2MinimapX[MaxMapWidth]; /// fast conversion table local int Map2MinimapY[MaxMapHeight]; /// fast conversion table @@ -96,10 +96,6 @@ global void UpdateMinimapXY(int tx,int ty) int y; int scale; - if( TheUI.MinimapX==-1 ) { - return; - } - if( !(scale=(MinimapScale/MINIMAP_FAC)) ) { scale=1; } @@ -107,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<TheUI.MinimapH-MinimapY; ++my ) { + for( my=MinimapY; my<MINIMAP_H-MinimapY; ++my ) { y=Minimap2MapY[my]; if( y<ty ) { continue; @@ -116,7 +112,7 @@ global void UpdateMinimapXY(int tx,int ty) break; } - for( mx=MinimapX; mx<TheUI.MinimapW-MinimapX; ++mx ) { + for( mx=MinimapX; mx<MINIMAP_W-MinimapX; ++mx ) { int tile; x=Minimap2MapX[mx]; @@ -128,7 +124,7 @@ global void UpdateMinimapXY(int tx,int ty) } tile=TheMap.Fields[x+y].Tile; - ((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*TheUI.MinimapW]= + ((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*MINIMAP_W]= TheMap.Tiles[tile][7+(mx%scale)*8+(6+(my%scale)*8)*TileSizeX]; } } @@ -147,10 +143,6 @@ global void UpdateMinimapTerrain(void) int my; int scale; - if( TheUI.MinimapX==-1 ) { - return; - } - if( !(scale=(MinimapScale/MINIMAP_FAC)) ) { scale=1; } @@ -158,12 +150,12 @@ global void UpdateMinimapTerrain(void) // // Pixel 7,6 7,14, 15,6 15,14 are taken for the minimap picture. // - for( my=MinimapY; my<TheUI.MinimapH-MinimapY; ++my ) { - for( mx=MinimapX; mx<TheUI.MinimapW-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*)MinimapTerrainGraphic->Frames)[mx+my*TheUI.MinimapW]= + ((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*MINIMAP_W]= TheMap.Tiles[tile][7+(mx%scale)*8+(6+(my%scale)*8)*TileSizeX]; } } @@ -178,21 +170,17 @@ global void CreateMinimap(void) { int n; - if( TheUI.MinimapX==-1 ) { - return; - } - if( TheMap.Width>TheMap.Height ) { // Scale to biggest value. n=TheMap.Width; } else { n=TheMap.Height; } - MinimapScale=(TheUI.MinimapW*MINIMAP_FAC)/n; + MinimapScale=(MINIMAP_W*MINIMAP_FAC)/n; - 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; + 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; DebugLevel0Fn("MinimapScale %d(%d), X off %d, Y off %d\n" _C_ MinimapScale/MINIMAP_FAC _C_ MinimapScale _C_ MinimapX _C_ MinimapY); @@ -202,12 +190,10 @@ global void CreateMinimap(void) // // FIXME: this needs to be recalculated during map load - the map size // might have changed! - Minimap2MapX=calloc(sizeof(int),TheUI.MinimapW*TheUI.MinimapH); - Minimap2MapY=calloc(sizeof(int),TheUI.MinimapW*TheUI.MinimapH); - for( n=MinimapX; n<TheUI.MinimapW-MinimapX; ++n ) { + for( n=MinimapX; n<MINIMAP_W-MinimapX; ++n ) { Minimap2MapX[n]=((n-MinimapX)*MINIMAP_FAC)/MinimapScale; } - for( n=MinimapY; n<TheUI.MinimapH-MinimapY; ++n ) { + for( n=MinimapY; n<MINIMAP_H-MinimapY; ++n ) { Minimap2MapY[n]=(((n-MinimapY)*MINIMAP_FAC)/MinimapScale)*TheMap.Width; } for( n=0; n<TheMap.Width; ++n ) { @@ -217,11 +203,11 @@ global void CreateMinimap(void) Map2MinimapY[n]=(n*MinimapScale)/MINIMAP_FAC; } - MinimapTerrainGraphic=NewGraphic(8,TheUI.MinimapW,TheUI.MinimapH); - memset(MinimapTerrainGraphic->Frames,0,TheUI.MinimapW*TheUI.MinimapH); - MinimapGraphic=NewGraphic(8,TheUI.MinimapW,TheUI.MinimapH); + MinimapTerrainGraphic=NewGraphic(8,MINIMAP_W,MINIMAP_H); + memset(MinimapTerrainGraphic->Frames,0,MINIMAP_W*MINIMAP_H); + MinimapGraphic=NewGraphic(8,MINIMAP_W,MINIMAP_H); MinimapGraphic->Pixels=VideoCreateNewPalette(GlobalPalette); - memset(MinimapGraphic->Frames,0,TheUI.MinimapW*TheUI.MinimapH); + memset(MinimapGraphic->Frames,0,MINIMAP_W*MINIMAP_H); UpdateMinimapTerrain(); } @@ -239,10 +225,8 @@ global void DestroyMinimap(void) } VideoSaveFree(MinimapGraphic); MinimapGraphic=NULL; - free(Minimap2MapX); - Minimap2MapX=NULL; - free(Minimap2MapY); - Minimap2MapY=NULL; + memset(Minimap2MapX,0,MINIMAP_W*sizeof(int)); + memset(Minimap2MapY,0,MINIMAP_H*sizeof(int)); } /** @@ -262,10 +246,6 @@ global void UpdateMinimap(void) int h; int h0; - if( TheUI.MinimapX==-1 ) { - return; - } - w=(FrameCounter/FRAMES_PER_SECOND)&1; if( (new_phase=red_phase-w) ) { red_phase=w; @@ -274,27 +254,26 @@ global void UpdateMinimap(void) // // Draw the mini-map background. Note draws a little too much. // -#if 0 - for( h=0; h<TheUI.MinimapH; ++h ) { - memcpy(&((unsigned char*)MinimapGraphic->Frames)[h*TheUI.MinimapW], - &((unsigned char*)TheUI.Minimap.Graphic->Frames)[h*TheUI.Minimap.Graphic->Width], + // 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); } -#endif // // Draw the terrain // if( MinimapWithTerrain ) { - for( my=0; my<TheUI.MinimapH; ++my ) { - for( mx=0; mx<TheUI.MinimapW; ++mx ) { + for( my=0; my<MINIMAP_H; ++my ) { + 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))) || ReplayRevealMap ) { - ((unsigned char*)MinimapGraphic->Frames)[mx+my*TheUI.MinimapW]= - ((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*TheUI.MinimapW]; + ((unsigned char*)MinimapGraphic->Frames)[mx+my*MINIMAP_W]= + ((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*MINIMAP_W]; } } } @@ -330,17 +309,17 @@ global void UpdateMinimap(void) mx=1+MinimapX+Map2MinimapX[(*table)->X]; my=1+MinimapY+Map2MinimapY[(*table)->Y]; w=Map2MinimapX[type->TileWidth]; - if( mx+w>=TheUI.MinimapW ) { // clip right side - w=TheUI.MinimapW-mx; + if( mx+w>=MINIMAP_W ) { // clip right side + w=MINIMAP_W-mx; } h0=Map2MinimapY[type->TileHeight]; - if( my+h0>=TheUI.MinimapH ) { // clip bottom side - h0=TheUI.MinimapH-my; + if( my+h0>=MINIMAP_H ) { // clip bottom side + h0=MINIMAP_H-my; } while( w-->=0 ) { h=h0; while( h-->=0 ) { - ((unsigned char*)MinimapGraphic->Frames)[mx+w+(my+h)*TheUI.MinimapW]=color; + ((unsigned char*)MinimapGraphic->Frames)[mx+w+(my+h)*MINIMAP_W]=color; } } } @@ -396,17 +375,17 @@ global void UpdateMinimap(void) mx=1+MinimapX+Map2MinimapX[unit->X]; my=1+MinimapY+Map2MinimapY[unit->Y]; w=Map2MinimapX[type->TileWidth]; - if( mx+w>=TheUI.MinimapW ) { // clip right side - w=TheUI.MinimapW-mx; + if( mx+w>=MINIMAP_W ) { // clip right side + w=MINIMAP_W-mx; } h0=Map2MinimapY[type->TileHeight]; - if( my+h0>=TheUI.MinimapH ) { // clip bottom side - h0=TheUI.MinimapH-my; + if( my+h0>=MINIMAP_H ) { // clip bottom side + h0=MINIMAP_H-my; } while( w-->=0 ) { h=h0; while( h-->=0 ) { - ((unsigned char*)MinimapGraphic->Frames)[mx+w+(my+h)*TheUI.MinimapW]=color; + ((unsigned char*)MinimapGraphic->Frames)[mx+w+(my+h)*MINIMAP_W]=color; } } } @@ -421,13 +400,9 @@ global void UpdateMinimap(void) global void DrawMinimap(int vx __attribute__((unused)), int vy __attribute__((unused))) { - if( TheUI.MinimapX==-1 ) { - return; - } - VideoDrawSub(MinimapGraphic,0,0 ,MinimapGraphic->Width,MinimapGraphic->Height - ,TheUI.MinimapX,TheUI.MinimapY); + ,TheUI.MinimapX+24,TheUI.MinimapY+2); } /** @@ -457,16 +432,12 @@ global void DrawMinimapCursor(int vx, int vy) int h; int i; - if( TheUI.MinimapX==-1 ) { - return; - } - // Determine and save region below minimap cursor // FIXME: position of the minimap in the graphic is hardcoded (24x2) OldMinimapCursorX=x= - TheUI.MinimapX+MinimapX+(vx*MinimapScale)/MINIMAP_FAC; + TheUI.MinimapX+24+MinimapX+(vx*MinimapScale)/MINIMAP_FAC; OldMinimapCursorY=y= - TheUI.MinimapY+MinimapY+(vy*MinimapScale)/MINIMAP_FAC; + TheUI.MinimapY+2+MinimapY+(vy*MinimapScale)/MINIMAP_FAC; OldMinimapCursorW=w= (TheUI.SelectedViewport->MapWidth*MinimapScale)/MINIMAP_FAC; OldMinimapCursorH=h= @@ -484,7 +455,7 @@ global void DrawMinimapCursor(int vx, int vy) SaveCursorRectangle(OldMinimapCursorImage,x,y,w,h); // Draw cursor as rectangle (Note: unclipped, as it is always visible) - VideoDraw50TransRectangle(TheUI.MinimapCursorColor,x,y,w,h); + VideoDraw50TransRectangle(TheUI.ViewportCursorColor,x,y,w,h); } /** @@ -497,7 +468,7 @@ global int ScreenMinimap2MapX(int x) { int tx; - tx=((((x)-TheUI.MinimapX-MinimapX)*MINIMAP_FAC)/MinimapScale); + tx=((((x)-TheUI.MinimapX-24-MinimapX)*MINIMAP_FAC)/MinimapScale); if( tx<0 ) { return 0; } @@ -514,7 +485,7 @@ global int ScreenMinimap2MapY(int y) { int ty; - ty=((((y)-TheUI.MinimapY-MinimapY)*MINIMAP_FAC)/MinimapScale); + ty=((((y)-TheUI.MinimapY-2-MinimapY)*MINIMAP_FAC)/MinimapScale); if( ty<0 ) { return 0; } diff --git a/src/stratagus/mainloop.cpp b/src/stratagus/mainloop.cpp index 3acff76eb..fb78d076b 100644 --- a/src/stratagus/mainloop.cpp +++ b/src/stratagus/mainloop.cpp @@ -254,40 +254,23 @@ global void DebugTestDisplay(void) /** ** Draw menu button area. ** -** With DRAW_DEBUG it shows the used frame time and arrival of network packets. +** With debug it shows the used frame time and arrival of network packets. +** +** @todo Must be more configurable. Adding diplomacy menu here? */ local void DrawMenuButtonArea(void) { - if( NetworkFildes==-1 ) { - if( TheUI.MenuButton.X!=-1 ) { - DrawMenuButton(TheUI.MenuButton.Button, - (ButtonAreaUnderCursor==ButtonAreaMenu - && ButtonUnderCursor==ButtonUnderMenu ? MenuButtonActive : 0)| - (GameMenuButtonClicked ? MenuButtonClicked : 0), - TheUI.MenuButton.Width, TheUI.MenuButton.Height, - TheUI.MenuButton.X,TheUI.MenuButton.Y, - GameFont,TheUI.MenuButton.Text,NULL,NULL); - } - } else { - if( TheUI.NetworkMenuButton.X!=-1 ) { - DrawMenuButton(TheUI.NetworkMenuButton.Button, - (ButtonAreaUnderCursor==ButtonAreaMenu - && ButtonUnderCursor==ButtonUnderNetworkMenu ? MenuButtonActive : 0)| - (GameMenuButtonClicked ? MenuButtonClicked : 0), - TheUI.NetworkMenuButton.Width, TheUI.NetworkMenuButton.Height, - TheUI.NetworkMenuButton.X,TheUI.NetworkMenuButton.Y, - GameFont,TheUI.NetworkMenuButton.Text,NULL,NULL); - } - if( TheUI.NetworkDiplomacyButton.X!=-1 ) { - DrawMenuButton(TheUI.NetworkDiplomacyButton.Button, - (ButtonAreaUnderCursor==ButtonAreaMenu - && ButtonUnderCursor==ButtonUnderNetworkDiplomacy ? MenuButtonActive : 0)| - (GameMenuButtonClicked ? MenuButtonClicked : 0), - TheUI.NetworkDiplomacyButton.Width, TheUI.NetworkDiplomacyButton.Height, - TheUI.NetworkDiplomacyButton.X,TheUI.NetworkDiplomacyButton.Y, - GameFont,TheUI.NetworkDiplomacyButton.Text,NULL,NULL); - } - } + VideoDrawSub(TheUI.MenuButton.Graphic,0,0 + ,TheUI.MenuButton.Graphic->Width + ,TheUI.MenuButton.Graphic->Height + ,TheUI.MenuButtonX,TheUI.MenuButtonY); + + DrawMenuButton(MBUTTON_MAIN, + (ButtonUnderCursor == 0 ? MenuButtonActive : 0)| + (GameMenuButtonClicked ? MenuButtonClicked : 0), + 128, 19, + TheUI.MenuButtonX+24,TheUI.MenuButtonY+2, + GameFont,"Menu (~<F10~>)",NULL,NULL); #ifdef DRAW_DEBUG // @@ -525,52 +508,77 @@ global void DrawMapArea(void) */ global void UpdateDisplay(void) { - int i; - MustRedraw&=EnableRedraw; // Don't redraw disabled parts VideoLockScreen(); // prepare video write HideAnyCursor(); // remove cursor (when available) - if( GuiGameStarted ) { + if( MustRedraw&RedrawMap ) { DrawMapArea(); + } + if( MustRedraw&(RedrawMessage|RedrawMap) ) { DrawMessages(); + } + if( MustRedraw&RedrawFillers ) { + int i; - for( i=0; i<TheUI.NumPanels; ++i ) { - VideoDraw(TheUI.Panel[i].Graphic,0, - TheUI.PanelX[i],TheUI.PanelY[i]); + for( i=0; i<TheUI.NumFillers; ++i ) { + VideoDrawSub(TheUI.Filler[i].Graphic,0,0 + ,TheUI.Filler[i].Graphic->Width + ,TheUI.Filler[i].Graphic->Height + ,TheUI.FillerX[i],TheUI.FillerY[i]); } + } + if( MustRedraw&RedrawMenuButton ) { DrawMenuButtonArea(); + } + if( MustRedraw&RedrawMinimapBorder ) { + VideoDrawSub(TheUI.Minimap.Graphic,0,0 + ,TheUI.Minimap.Graphic->Width,TheUI.Minimap.Graphic->Height + ,TheUI.MinimapX,TheUI.MinimapY); + } - PlayerPixels(Players); // Reset to default colors + PlayerPixels(Players); // Reset to default colors + if( MustRedraw&RedrawMinimap ) { // FIXME: redraw only 1* per second! // HELPME: Viewpoint rectangle must be drawn faster (if implemented) ? DrawMinimap(TheUI.SelectedViewport->MapX, TheUI.SelectedViewport->MapY); DrawMinimapCursor(TheUI.SelectedViewport->MapX, TheUI.SelectedViewport->MapY); + } else if (MustRedraw&RedrawMinimapCursor) { + HideMinimapCursor(); + DrawMinimapCursor(TheUI.SelectedViewport->MapX, + TheUI.SelectedViewport->MapY); + } + if( MustRedraw&RedrawInfoPanel ) { DrawInfoPanel(); PlayerPixels(Players); // Reset to default colors - + } + if( MustRedraw&RedrawButtonPanel ) { DrawButtonPanel(); PlayerPixels(Players); // Reset to default colors - + } + if( MustRedraw&RedrawResources ) { DrawResources(); - + } + if( MustRedraw&RedrawStatusLine ) { DrawStatusLine(); MustRedraw|=RedrawCosts; - + } + if( MustRedraw&RedrawCosts ) { DrawCosts(); - + } + if( MustRedraw&RedrawTimer ) { DrawTimer(); } - if( CurrentMenu ) { + if( MustRedraw&RedrawMenu ) { DrawMenu(CurrentMenu); } @@ -588,94 +596,59 @@ global void UpdateDisplay(void) if( MustRedraw&RedrawMap ) { // FIXME: split into small parts see RedrawTile and RedrawRow InvalidateAreaAndCheckCursor( - TheUI.MapArea.X,TheUI.MapArea.Y, - TheUI.MapArea.EndX-TheUI.MapArea.X+1, - TheUI.MapArea.EndY-TheUI.MapArea.Y+1); + TheUI.MapArea.X,TheUI.MapArea.Y + ,TheUI.MapArea.EndX-TheUI.MapArea.X+1 + ,TheUI.MapArea.EndY-TheUI.MapArea.Y+1); } if( MustRedraw&RedrawFillers ) { int i; - for( i=0; i<TheUI.NumPanels; ++i ) { + for( i=0; i<TheUI.NumFillers; ++i ) { InvalidateAreaAndCheckCursor( - TheUI.PanelX[i],TheUI.PanelY[i], - TheUI.Panel[i].Graphic->Width, - TheUI.Panel[i].Graphic->Height); + TheUI.FillerX[i],TheUI.FillerY[i] + ,TheUI.Filler[i].Graphic->Width + ,TheUI.Filler[i].Graphic->Height); } } if(MustRedraw&RedrawMenuButton ) { - if( NetworkFildes==-1 ) { - if( TheUI.MenuButton.X!=-1 ) { - InvalidateAreaAndCheckCursor( - TheUI.MenuButton.X,TheUI.MenuButton.Y, - TheUI.MenuButton.Width, - TheUI.MenuButton.Height); - } - } else { - if( TheUI.NetworkMenuButton.X!=-1 ) { - InvalidateAreaAndCheckCursor( - TheUI.NetworkMenuButton.X, - TheUI.NetworkMenuButton.Y, - TheUI.NetworkMenuButton.Width, - TheUI.NetworkMenuButton.Height); - } - if( TheUI.NetworkDiplomacyButton.X!=-1 ) { - InvalidateAreaAndCheckCursor( - TheUI.NetworkDiplomacyButton.X, - TheUI.NetworkDiplomacyButton.Y, - TheUI.NetworkDiplomacyButton.Width, - TheUI.NetworkDiplomacyButton.Height); - } - } + InvalidateAreaAndCheckCursor( + TheUI.MenuButtonX,TheUI.MenuButtonY + ,TheUI.MenuButton.Graphic->Width + ,TheUI.MenuButton.Graphic->Height); } if( MustRedraw&RedrawMinimapBorder ) { - // Unused -// InvalidateAreaAndCheckCursor( -// TheUI.MinimapX,TheUI.MinimapY -// ,TheUI.Minimap.Graphic->Width,TheUI.Minimap.Graphic->Height); + InvalidateAreaAndCheckCursor( + TheUI.MinimapX,TheUI.MinimapY + ,TheUI.Minimap.Graphic->Width,TheUI.Minimap.Graphic->Height); } else if( (MustRedraw&RedrawMinimap) || (MustRedraw&RedrawMinimapCursor) ) { // FIXME: Redraws too much of the minimap - if( TheUI.MinimapX!=-1 ) { - InvalidateAreaAndCheckCursor( - TheUI.MinimapX,TheUI.MinimapY, - TheUI.MinimapW,TheUI.MinimapH); - } + InvalidateAreaAndCheckCursor( + TheUI.MinimapX+24,TheUI.MinimapY+2 + ,MINIMAP_W,MINIMAP_H); } if( MustRedraw&RedrawInfoPanel ) { - if( TheUI.InfoPanelX!=-1 ) { - InvalidateAreaAndCheckCursor( - TheUI.InfoPanelX,TheUI.InfoPanelY, - TheUI.InfoPanelW,TheUI.InfoPanelH); - } + InvalidateAreaAndCheckCursor( + TheUI.InfoPanelX,TheUI.InfoPanelY + ,TheUI.InfoPanelW,TheUI.InfoPanelH); } if( MustRedraw&RedrawButtonPanel ) { InvalidateAreaAndCheckCursor( - TheUI.ButtonPanelX,TheUI.ButtonPanelY, - TheUI.ButtonPanelEndX-TheUI.ButtonPanelX+7, - TheUI.ButtonPanelEndY-TheUI.ButtonPanelY+7); + TheUI.ButtonPanelX,TheUI.ButtonPanelY + ,TheUI.ButtonPanel.Graphic->Width + ,TheUI.ButtonPanel.Graphic->Height); } if( MustRedraw&RedrawResources ) { - for( i=0; i<MaxCosts+2; ++i ) { - if( TheUI.Resources[i].TextX!=-1 ) { - // FIXME: width is wrong - static int width=0; - if( !width ) { - width=VideoTextLength(GameFont,"99,999"); - } - InvalidateAreaAndCheckCursor( - TheUI.Resources[i].TextX,TheUI.Resources[i].TextY, - width, - VideoTextHeight(GameFont)); - } - } + InvalidateAreaAndCheckCursor( + TheUI.ResourceX,TheUI.ResourceY + ,TheUI.Resource.Graphic->Width + ,TheUI.Resource.Graphic->Height); } if( MustRedraw&RedrawStatusLine || MustRedraw&RedrawCosts ) { - if( TheUI.StatusLineX!=-1 ) { - InvalidateAreaAndCheckCursor( - TheUI.StatusLineX,TheUI.StatusLineY, - TheUI.StatusLineW, - VideoTextHeight(TheUI.StatusLineFont)); - } + InvalidateAreaAndCheckCursor( + TheUI.StatusLineX,TheUI.StatusLineY + ,TheUI.StatusLine.Graphic->Width + ,TheUI.StatusLine.Graphic->Height); } if( MustRedraw&RedrawTimer ) { // FIXME: Invalidate timer area @@ -869,6 +842,10 @@ global void GameMainLoop(void) if( Callbacks==&MenuCallbacks ) { MustRedraw|=RedrawMenu; } + if( CurrentMenu && CurrentMenu->Panel + && !strcmp(CurrentMenu->Panel, ScPanel) ) { + MustRedraw = RedrawEverything; + } //For debuggin only: replace UpdateDisplay by DebugTestDisplay when // debugging linedraw routines.. diff --git a/src/ui/botpanel.cpp b/src/ui/botpanel.cpp index 66e047574..30e457591 100644 --- a/src/ui/botpanel.cpp +++ b/src/ui/botpanel.cpp @@ -374,9 +374,12 @@ global void DrawButtonPanel(void) const ButtonAction* buttons; char buf[8]; - if( !TheUI.NumButtonButtons ) { - return; - } + // + // Draw background + // + VideoDrawSub(TheUI.ButtonPanel.Graphic,0,0 + ,TheUI.ButtonPanel.Graphic->Width,TheUI.ButtonPanel.Graphic->Height + ,TheUI.ButtonPanelX,TheUI.ButtonPanelY); if( !(buttons=CurrentButtons) ) { // no buttons return; @@ -385,14 +388,13 @@ global void DrawButtonPanel(void) // FIXME: this is unneeded DrawUnitIcon does it self PlayerPixels(ThisPlayer); // could only select own units. - for( i=0; i<TheUI.NumButtonButtons; ++i ) { + for( i=0; i<9; ++i ) { if( buttons[i].Pos!=-1 ) { int j; int action; // cursor is on that button - if( ButtonAreaUnderCursor==ButtonAreaButton - && ButtonUnderCursor==i ) { + if( ButtonUnderCursor==i+10 ) { v=IconActive; if( MouseButtons&LeftButton ) { v=IconClicked; @@ -491,13 +493,12 @@ global void DrawButtonPanel(void) } DrawUnitIcon(ThisPlayer,buttons[i].Icon.Icon - ,v,TheUI.ButtonButtons[i].X,TheUI.ButtonButtons[i].Y); + ,v,TheUI.Buttons[i+10].X,TheUI.Buttons[i+10].Y); // // Update status line for this button // - if( ButtonAreaUnderCursor==ButtonAreaButton - && ButtonUnderCursor==i && KeyState!=KeyStateInput ) { + if( ButtonUnderCursor==i+10 && KeyState!=KeyStateInput ) { SetStatusLine(buttons[i].Hint); // FIXME: Draw costs v=buttons[i].Value; @@ -538,7 +539,7 @@ global void DrawButtonPanel(void) if( ShowCommandKey ) { Button* b; - b=&TheUI.ButtonButtons[i]; + b=&TheUI.Buttons[i+10]; if( CurrentButtons[i].Key==27 ) { strcpy(buf,"ESC"); VideoDrawText(b->X+4+b->Width-VideoTextLength(GameFont,buf), diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp index 9dd104478..f800d353b 100644 --- a/src/ui/interface.cpp +++ b/src/ui/interface.cpp @@ -95,7 +95,7 @@ local void ShowInput(void) sprintf(InputStatusLine,"MESSAGE:%s~!_",Input); input=InputStatusLine; // FIXME: This is slow! - while( VideoTextLength(GameFont,input)>TheUI.StatusLineW ) { + while( VideoTextLength(GameFont,input)>TheUI.StatusLine.Graphic->Width ) { ++input; } KeyState=KeyStateCommand; diff --git a/src/ui/mainscr.cpp b/src/ui/mainscr.cpp index 9a9a2756d..599097558 100644 --- a/src/ui/mainscr.cpp +++ b/src/ui/mainscr.cpp @@ -133,19 +133,14 @@ local void UiDrawCompleted(int full,int ready) { int f; - if( TheUI.CompleteBarX==-1 ) { - return; - } - if( !full ) { return; } f=(100*ready)/full; - f=(f*TheUI.CompleteBarW)/100; - VideoFillRectangleClip(TheUI.CompleteBarColor, - TheUI.CompleteBarX,TheUI.CompleteBarY,f,TheUI.CompleteBarH); - VideoDrawText(TheUI.CompleteTextX,TheUI.CompleteTextY, - TheUI.CompleteBarFont,TheUI.CompleteBarText); + f=(f*152)/100; + VideoFillRectangleClip(TheUI.CompleteBarColor + ,TheUI.CompleteBarX,TheUI.CompleteBarY,f,14); + VideoDrawText(TheUI.CompleteTextX,TheUI.CompleteTextY,GameFont,"% Complete"); } /** @@ -193,28 +188,22 @@ global void DrawUnitInfo(const Unit* unit) // // Draw icon in upper left corner // - if( TheUI.NumInfoButtons>=2 ) { - x=TheUI.InfoButtons[0].X; - y=TheUI.InfoButtons[0].Y; - DrawUnitIcon(unit->Player,type->Icon.Icon - ,(ButtonAreaUnderCursor==ButtonAreaInfo && ButtonUnderCursor==0) - ? (IconActive|(MouseButtons&LeftButton)) : 0 - ,x,y); - UiDrawLifeBar(unit,x,y); + x=TheUI.Buttons[1].X; + y=TheUI.Buttons[1].Y; + DrawUnitIcon(unit->Player,type->Icon.Icon + ,(ButtonUnderCursor==1) + ? (IconActive|(MouseButtons&LeftButton)) : 0 + ,x,y); + UiDrawLifeBar(unit,x,y); - if( unit->Player==ThisPlayer ) { // Only for own units. - if( unit->HP && unit->HP<10000 ) { - sprintf(buf,"%d/%d",unit->HP,stats->HitPoints); - VideoDrawTextCentered(x+(type->Icon.Icon->Width+7)/2 - ,y+type->Icon.Icon->Height+7+7+3,SmallFont,buf); - } + if( unit->Player==ThisPlayer ) { // Only for own units. + if( unit->HP && unit->HP<10000 ) { + sprintf(buf,"%d/%d",unit->HP,stats->HitPoints); + VideoDrawTextCentered(x+(type->Icon.Icon->Width+7)/2 + ,y+type->Icon.Icon->Height+7+7+3,SmallFont,buf); } } - if( TheUI.InfoPanelW<176 ) { - return; - } - x=TheUI.InfoPanelX; y=TheUI.InfoPanelY; @@ -324,12 +313,12 @@ global void DrawUnitInfo(const Unit* unit) } else { VideoDrawTextCentered(x+114,y+8+29,GameFont,"Training..."); - for( i=0; i<unit->Data.Train.Count; ++i ) { + for( i = 0; i < unit->Data.Train.Count; i++ ) { DrawUnitIcon(unit->Player ,unit->Data.Train.What[i]->Icon.Icon - ,(ButtonAreaUnderCursor==ButtonAreaTraining && ButtonUnderCursor==i) + ,(ButtonUnderCursor==i+4) ? (IconActive|(MouseButtons&LeftButton)) : 0 - ,TheUI.TrainingButtons[i].X,TheUI.TrainingButtons[i].Y); + ,TheUI.Buttons2[i].X,TheUI.Buttons2[i].Y); } UiDrawCompleted( @@ -442,16 +431,16 @@ global void DrawUnitInfo(const Unit* unit) if( unit->OnBoard[i]!=NoUnitP ) { DrawUnitIcon(unit->Player ,unit->OnBoard[i]->Type->Icon.Icon - ,(ButtonAreaUnderCursor==ButtonAreaInfo && ButtonUnderCursor==i+3) + ,(ButtonUnderCursor==i+4) ? (IconActive|(MouseButtons&LeftButton)) : 0 - ,TheUI.InfoButtons[i+3].X,TheUI.InfoButtons[i+3].Y); + ,TheUI.Buttons[i+4].X,TheUI.Buttons[i+4].Y); UiDrawLifeBar(unit->OnBoard[i] - ,TheUI.InfoButtons[i+3].X,TheUI.InfoButtons[i+3].Y); + ,TheUI.Buttons[i+4].X,TheUI.Buttons[i+4].Y); if( unit->OnBoard[i]->Type->CanCastSpell ) { UiDrawManaBar(unit->OnBoard[i] - ,TheUI.InfoButtons[i+3].X,TheUI.InfoButtons[i+3].Y); + ,TheUI.Buttons[i+4].X,TheUI.Buttons[i+4].Y); } - if( ButtonAreaUnderCursor==ButtonAreaInfo && ButtonUnderCursor==i+3 ) { + if( ButtonUnderCursor==i+4 ) { if( unit->OnBoard[i]->Name ) { char buf[128]; @@ -578,6 +567,11 @@ global void DrawResources(void) int i; int v; + VideoDrawSub(TheUI.Resource.Graphic,0,0 + ,TheUI.Resource.Graphic->Width + ,TheUI.Resource.Graphic->Height + ,TheUI.ResourceX,TheUI.ResourceY); + if( TheUI.OriginalResources ) { // FIXME: could write a sub function for this VideoDrawSub(TheUI.Resources[GoldCost].Icon.Graphic,0 @@ -611,43 +605,31 @@ global void DrawResources(void) ,0,TheUI.Resources[i].IconRow*TheUI.Resources[i].IconH ,TheUI.Resources[i].IconW,TheUI.Resources[i].IconH ,TheUI.Resources[i].IconX,TheUI.Resources[i].IconY); - } - if( TheUI.Resources[i].TextX!=-1 ) { v=ThisPlayer->Resources[i]; VideoDrawNumber(TheUI.Resources[i].TextX ,TheUI.Resources[i].TextY+(v>99999)*3 ,v>99999 ? SmallFont : GameFont,v); } } - if( TheUI.Resources[FoodCost].Icon.Graphic ) { - VideoDrawSub(TheUI.Resources[FoodCost].Icon.Graphic,0 - ,TheUI.Resources[FoodCost].IconRow*TheUI.Resources[FoodCost].IconH - ,TheUI.Resources[FoodCost].IconW,TheUI.Resources[FoodCost].IconH - ,TheUI.Resources[FoodCost].IconX,TheUI.Resources[FoodCost].IconY); - } - if( TheUI.Resources[FoodCost].TextX!=-1 ) { - sprintf(tmp,"%d/%d",ThisPlayer->NumFoodUnits,ThisPlayer->Food); - if( ThisPlayer->Food<ThisPlayer->NumFoodUnits ) { - VideoDrawReverseText(TheUI.Resources[FoodCost].TextX, - TheUI.Resources[FoodCost].TextY,GameFont,tmp); - } else { - VideoDrawText(TheUI.Resources[FoodCost].TextX, - TheUI.Resources[FoodCost].TextY,GameFont,tmp); - } + VideoDrawSub(TheUI.FoodIcon.Graphic,0 + ,TheUI.FoodIconRow*TheUI.FoodIconH + ,TheUI.FoodIconW,TheUI.FoodIconH + ,TheUI.FoodIconX,TheUI.FoodIconY); + sprintf(tmp,"%d/%d",ThisPlayer->NumFoodUnits,ThisPlayer->Food); + if( ThisPlayer->Food<ThisPlayer->NumFoodUnits ) { + VideoDrawReverseText(TheUI.FoodTextX,TheUI.FoodTextY,GameFont,tmp); + } else { + VideoDrawText(TheUI.FoodTextX,TheUI.FoodTextY,GameFont,tmp); } - if( TheUI.Resources[ScoreCost].Icon.Graphic ) { - VideoDrawSub(TheUI.Resources[ScoreCost].Icon.Graphic,0 - ,TheUI.Resources[ScoreCost].IconRow*TheUI.Resources[ScoreCost].IconH - ,TheUI.Resources[ScoreCost].IconW,TheUI.Resources[ScoreCost].IconH - ,TheUI.Resources[ScoreCost].IconX,TheUI.Resources[ScoreCost].IconY); - } - if( TheUI.Resources[ScoreCost].TextX!=-1 ) { - v=ThisPlayer->Score; - VideoDrawNumber(TheUI.Resources[ScoreCost].TextX - ,TheUI.Resources[ScoreCost].TextY+(v>99999)*3 - ,v>99999 ? SmallFont : GameFont,v); - } + VideoDrawSub(TheUI.ScoreIcon.Graphic,0 + ,TheUI.ScoreIconRow*TheUI.ScoreIconH + ,TheUI.ScoreIconW,TheUI.ScoreIconH + ,TheUI.ScoreIconX,TheUI.ScoreIconY); + v=ThisPlayer->Score; + VideoDrawNumber(TheUI.ScoreTextX + ,TheUI.ScoreTextY+(v>99999)*3 + ,v>99999 ? SmallFont : GameFont,v); } } @@ -722,7 +704,7 @@ global void UpdateMessages(void) // Scroll/remove old message line if (MessagesFrameTimeout < FrameCounter) { ++MessagesScrollY; - if (MessagesScrollY == VideoTextHeight(TheUI.MessageAreaFont) + 1) { + if (MessagesScrollY == VideoTextHeight(GameFont) + 1) { MessagesFrameTimeout = FrameCounter + MESSAGES_TIMEOUT - MessagesScrollY; MessagesScrollY = 0; ShiftMessages(); @@ -742,20 +724,16 @@ global void DrawMessages(void) { int z; - if (TheUI.MessageAreaX==-1 ) { - return; - } - // Draw message line(s) for (z = 0; z < MessagesCount; z++) { if (z == 0) { PushClipping(); - SetClipping(TheUI.MessageAreaX, TheUI.MessageAreaY, VideoWidth - 1, + SetClipping(TheUI.MapArea.X + 8, TheUI.MapArea.Y + 8, VideoWidth - 1, VideoHeight - 1); } - VideoDrawTextClip(TheUI.MessageAreaX, - TheUI.MessageAreaY + z * (VideoTextHeight(TheUI.MessageAreaFont) + 1) - MessagesScrollY, - TheUI.MessageAreaFont, Messages[z]); + VideoDrawTextClip(TheUI.MapArea.X + 8, + TheUI.MapArea.Y + 8 + z * (VideoTextHeight(GameFont) + 1) - MessagesScrollY, + GameFont, Messages[z]); if (z == 0) { PopClipping(); } @@ -776,10 +754,6 @@ local void AddMessage(const char *msg) char *message; char *next; - if (TheUI.MessageAreaX==-1) { - return; - } - if (!MessagesCount) { MessagesFrameTimeout = FrameCounter + MESSAGES_TIMEOUT; } @@ -814,7 +788,8 @@ local void AddMessage(const char *msg) next = ptr = message + strlen(message); } - while (VideoTextLength(TheUI.MessageAreaFont, message) >= TheUI.MessageAreaW ) { + // FIXME: 440+(VideoWidth-640) is the wrong value. + while (VideoTextLength(GameFont, message) >= 440+(VideoWidth-640) ) { while (1) { --ptr; if (*ptr == ' ') { @@ -828,7 +803,7 @@ local void AddMessage(const char *msg) // No space found, wrap in the middle of a word if (ptr == message) { ptr = next-1; - while (VideoTextLength(TheUI.MessageAreaFont, message) >= TheUI.MessageAreaW ) { + while (VideoTextLength(GameFont, message) >= 440+(VideoWidth-640) ) { *--ptr = '\0'; } next = ptr+1; @@ -971,9 +946,12 @@ local char StatusLine[STATUS_LINE_LEN]; /// status line/hints */ global void DrawStatusLine(void) { - if( TheUI.StatusLineX!=-1 && StatusLine[0] ) { - VideoDrawText(TheUI.StatusLineX,TheUI.StatusLineY, - TheUI.StatusLineFont,StatusLine); + VideoDrawSub(TheUI.StatusLine.Graphic + ,0,0 + ,TheUI.StatusLine.Graphic->Width,TheUI.StatusLine.Graphic->Height + ,TheUI.StatusLineX,TheUI.StatusLineY); + if( StatusLine ) { + VideoDrawText(TheUI.StatusLineX+2,TheUI.StatusLineY+2,GameFont,StatusLine); } } @@ -984,9 +962,9 @@ global void DrawStatusLine(void) */ global void SetStatusLine(char* status) { - if( KeyState!=KeyStateInput && strcmp(StatusLine,status) ) { + if( KeyState!=KeyStateInput && strcmp( StatusLine, status ) ) { MustRedraw|=RedrawStatusLine; - strncpy(StatusLine,status,STATUS_LINE_LEN-1); + strncpy( StatusLine, status, STATUS_LINE_LEN-1 ); StatusLine[STATUS_LINE_LEN-1] = 0; } } @@ -997,7 +975,7 @@ global void SetStatusLine(char* status) global void ClearStatusLine(void) { if( KeyState!=KeyStateInput ) { - SetStatusLine(""); + SetStatusLine( "" ); } } @@ -1020,15 +998,13 @@ global void DrawCosts(void) x=TheUI.StatusLineX+270; if( CostsMana ) { // FIXME: hardcoded image!!! - if( TheUI.Resources[GoldCost].Icon.Graphic ) { - VideoDrawSub(TheUI.Resources[GoldCost].Icon.Graphic - /* ,0,TheUI.Resources[GoldCost].IconRow - *TheUI.Resources[GoldCost].IconH */ - ,0,3*TheUI.Resources[GoldCost].IconH - ,TheUI.Resources[GoldCost].IconW - ,TheUI.Resources[GoldCost].IconH - ,x,TheUI.StatusLineY+1); - } + VideoDrawSub(TheUI.Resources[GoldCost].Icon.Graphic + /* ,0,TheUI.Resources[GoldCost].IconRow + *TheUI.Resources[GoldCost].IconH */ + ,0,3*TheUI.Resources[GoldCost].IconH + ,TheUI.Resources[GoldCost].IconW + ,TheUI.Resources[GoldCost].IconH + ,x,TheUI.StatusLineY+1); VideoDrawNumber(x+15,TheUI.StatusLineY+2,GameFont,CostsMana); x+=45; @@ -1052,12 +1028,10 @@ global void DrawCosts(void) if( CostsFood ) { // FIXME: hardcoded image!!! - if( TheUI.Resources[FoodCost].Icon.Graphic ) { - VideoDrawSub(TheUI.Resources[FoodCost].Icon.Graphic - ,0,TheUI.Resources[FoodCost].IconRow*TheUI.Resources[FoodCost].IconH - ,TheUI.Resources[FoodCost].IconW,TheUI.Resources[FoodCost].IconH - ,x,TheUI.StatusLineY+1); - } + VideoDrawSub(TheUI.FoodIcon.Graphic + ,0,TheUI.FoodIconRow*TheUI.FoodIconH + ,TheUI.FoodIconW,TheUI.FoodIconH + ,x,TheUI.StatusLineY+1); VideoDrawNumber(x+15,TheUI.StatusLineY+2,GameFont,CostsFood); x+=45; } @@ -1123,12 +1097,10 @@ global void ClearCosts(void) */ local void DrawInfoPanelBackground(unsigned frame) { - if( TheUI.InfoPanel.Graphic ) { - VideoDrawSub(TheUI.InfoPanel.Graphic, - 0,TheUI.InfoPanelH*frame, - TheUI.InfoPanelW,TheUI.InfoPanelH, - TheUI.InfoPanelX,TheUI.InfoPanelY); - } + VideoDrawSub(TheUI.InfoPanel.Graphic + ,0,TheUI.InfoPanelH*frame + ,TheUI.InfoPanelW,TheUI.InfoPanelH + ,TheUI.InfoPanelX,TheUI.InfoPanelY); } /** @@ -1144,25 +1116,20 @@ global void DrawInfoPanel(void) { int i; - if( TheUI.InfoPanelX==-1 ) { - return; - } - if( NumSelected ) { if( NumSelected>1 ) { PlayerPixels(ThisPlayer); // can only be own! - DrawInfoPanelBackground(TheUI.InfoPanelNeutralFrame); + DrawInfoPanelBackground(0); for( i=0; i<NumSelected; ++i ) { - DrawUnitIcon(ThisPlayer, - Selected[i]->Type->Icon.Icon, - (ButtonAreaUnderCursor==ButtonAreaInfo && ButtonUnderCursor==0) - ? (IconActive|(MouseButtons&LeftButton)) : 0, - TheUI.InfoButtons[i].X,TheUI.InfoButtons[i].Y); + DrawUnitIcon(ThisPlayer + ,Selected[i]->Type->Icon.Icon + ,(ButtonUnderCursor==i+1) + ? (IconActive|(MouseButtons&LeftButton)) : 0 + ,TheUI.Buttons[i+1].X,TheUI.Buttons[i+1].Y); UiDrawLifeBar(Selected[i] - ,TheUI.InfoButtons[i].X,TheUI.InfoButtons[i].Y); + ,TheUI.Buttons[i+1].X,TheUI.Buttons[i+1].Y); - if( ButtonAreaUnderCursor==ButtonAreaInfo - && ButtonUnderCursor==i ) { + if( ButtonUnderCursor==1+i ) { if( Selected[i]->Name ) { char buf[128]; @@ -1183,18 +1150,18 @@ global void DrawInfoPanel(void) || Selected[0]->Orders[0].Action==UnitActionResearch || Selected[0]->Orders[0].Action==UnitActionUpgradeTo || Selected[0]->Orders[0].Action==UnitActionTrain) ) { - i=TheUI.InfoPanelConstructionFrame; + i=3; } else if( Selected[0]->Type->_MaxMana ) { - i=TheUI.InfoPanelMagicFrame; + i=2; } else { - i=TheUI.InfoPanelSelectedFrame; + i=1; } } else { - i=TheUI.InfoPanelNeutralFrame; + i=0; } DrawInfoPanelBackground(i); DrawUnitInfo(Selected[0]); - if( ButtonAreaUnderCursor==ButtonAreaInfo && ButtonUnderCursor==0 ) { + if( ButtonUnderCursor==1 ) { if( Selected[0]->Name ) { char buf[128]; @@ -1211,7 +1178,7 @@ global void DrawInfoPanel(void) // Nothing selected - DrawInfoPanelBackground(TheUI.InfoPanelNeutralFrame); + DrawInfoPanelBackground(0); if( UnitUnderCursor && UnitVisibleOnMap(UnitUnderCursor) ) { // FIXME: not correct for enemies units DrawUnitInfo(UnitUnderCursor); @@ -1222,10 +1189,6 @@ global void DrawInfoPanel(void) char* rc; // FIXME: need some cool ideas for this. - if( TheUI.InfoPanelW<176 ) { - return; - } - x=TheUI.InfoPanelX+16; y=TheUI.InfoPanelY+8; @@ -1276,23 +1239,23 @@ global void DrawTimer(void) int min; int sec; - if( !GameTimer.Init ) { + if (!GameTimer.Init) { return; } - sec=GameTimer.Cycles / CYCLES_PER_SECOND % 60; - min=(GameTimer.Cycles / CYCLES_PER_SECOND / 60) % 60; - hour=(GameTimer.Cycles / CYCLES_PER_SECOND / 3600); + sec = GameTimer.Cycles / CYCLES_PER_SECOND % 60; + min = (GameTimer.Cycles / CYCLES_PER_SECOND / 60) % 60; + hour = (GameTimer.Cycles / CYCLES_PER_SECOND / 3600); - if( hour ) { - sprintf(buf,"%d:%02d:%02d",hour,min,sec); + if (hour) { + sprintf(buf, "%d:%02d:%02d", hour, min, sec); } else { - sprintf(buf,"%d:%02d",min,sec); + sprintf(buf, "%d:%02d", min, sec); } // FIXME: make this configurable - VideoDrawText(TheUI.SelectedViewport->EndX-70, - TheUI.SelectedViewport->Y+15,GameFont,buf); + VideoDrawText(TheUI.SelectedViewport->EndX - 70, + TheUI.SelectedViewport->Y + 15, GameFont, buf); } /** diff --git a/src/ui/menu_defs.inc b/src/ui/menu_defs.inc index 06bf88db9..ea45717c3 100644 --- a/src/ui/menu_defs.inc +++ b/src/ui/menu_defs.inc @@ -157,6 +157,46 @@ local char *MenuHotKeyToStr(int key, char *buf) return buf; } +local char *MenuButtonStyle(int style) +{ + switch (style) { + case MBUTTON_MAIN: + return "main"; + case MBUTTON_GM_HALF: + return "gm-half"; + case MBUTTON_132: + return "132"; + case MBUTTON_GM_FULL: + return "gm-full"; + case MBUTTON_GEM_ROUND: + return "gem-round"; + case MBUTTON_GEM_SQUARE: + return "gem-square"; + case MBUTTON_UP_ARROW: + return "up-arrow"; + case MBUTTON_DOWN_ARROW: + return "down-arrow"; + case MBUTTON_LEFT_ARROW: + return "left-arrow"; + case MBUTTON_RIGHT_ARROW: + return "right-arrow"; + case MBUTTON_S_KNOB: + return "s-knob"; + case MBUTTON_S_VCONT: + return "s-vcont"; + case MBUTTON_S_HCONT: + return "s-hcont"; + case MBUTTON_PULLDOWN: + return "pulldown"; + case MBUTTON_VTHIN: + return "vthin"; + case MBUTTON_FOLDER: + return "folder"; + } + fprintf(stderr,"MenuButtonStyle not found: %d\n", style); + return ""; +} + /** ** Save state of units to file. ** diff --git a/src/ui/menu_proc.cpp b/src/ui/menu_proc.cpp index f5b957e0e..04b24a6a5 100644 --- a/src/ui/menu_proc.cpp +++ b/src/ui/menu_proc.cpp @@ -104,51 +104,6 @@ local int MenuButtonCurSel = -1; -- Menu operation functions ----------------------------------------------------------------------------*/ -/** -** FIXME: docu -*/ -global char *MenuButtonStyle(int style) -{ - switch (style) { - case MBUTTON_MAIN: - return "main"; - case MBUTTON_NETWORK: - return "network"; - case MBUTTON_GM_HALF: - return "gm-half"; - case MBUTTON_132: - return "132"; - case MBUTTON_GM_FULL: - return "gm-full"; - case MBUTTON_GEM_ROUND: - return "gem-round"; - case MBUTTON_GEM_SQUARE: - return "gem-square"; - case MBUTTON_UP_ARROW: - return "up-arrow"; - case MBUTTON_DOWN_ARROW: - return "down-arrow"; - case MBUTTON_LEFT_ARROW: - return "left-arrow"; - case MBUTTON_RIGHT_ARROW: - return "right-arrow"; - case MBUTTON_S_KNOB: - return "s-knob"; - case MBUTTON_S_VCONT: - return "s-vcont"; - case MBUTTON_S_HCONT: - return "s-hcont"; - case MBUTTON_PULLDOWN: - return "pulldown"; - case MBUTTON_VTHIN: - return "vthin"; - case MBUTTON_FOLDER: - return "folder"; - } - fprintf(stderr,"MenuButtonStyle not found: %d\n", style); - return ""; -} - /** ** Find a menu by ident. ** @@ -2388,6 +2343,9 @@ global void ProcessMenu(const char *menu_id, int loop) } DebugLevel3("MustRedraw: 0x%08x\n" _C_ MustRedraw); if (MustRedraw) { + if (CurrentMenu->Panel && !strcmp(CurrentMenu->Panel, ScPanel)) { + MustRedraw = RedrawEverything; + } if (MustRedraw == RedrawEverything) { InterfaceState = IfaceStateNormal; UpdateDisplay(); diff --git a/src/ui/mouse.cpp b/src/ui/mouse.cpp index 69e71f34e..3916d6bc0 100644 --- a/src/ui/mouse.cpp +++ b/src/ui/mouse.cpp @@ -61,10 +61,8 @@ global enum _mouse_buttons_ MouseButtons;/// Current pressed mouse buttons global enum _key_modifiers_ KeyModifiers;/// Current keyboard modifiers global Unit* UnitUnderCursor; /// Unit under cursor -global int ButtonAreaUnderCursor=-1; /// Button area under cursor global int ButtonUnderCursor=-1; /// Button under cursor -global char GameMenuButtonClicked; /// Menu button was clicked -global char GameDiplomacyButtonClicked; /// Diplomacy button was clicked +global char GameMenuButtonClicked; /// Game menu button (F10) was clicked global char LeaveStops; /// Mouse leaves windows stops scroll global enum _cursor_on_ CursorOn=CursorOnUnknown; /// Cursor on field @@ -105,31 +103,31 @@ local void DrawMouseCoordsOnMap(int x,int y) return; } VideoLockScreen(); - VideoDrawSub(TheUI.MenuButton.Graphic,0,0, - TheUI.MenuButton.Graphic->Width, - TheUI.MenuButton.Graphic->Height, - TheUI.MenuButtonX,TheUI.MenuButtonY); + VideoDrawSub(TheUI.MenuButton.Graphic,0,0 + ,TheUI.MenuButton.Graphic->Width + ,TheUI.MenuButton.Graphic->Height + ,TheUI.MenuButtonX,TheUI.MenuButtonY); flags=TheMap.Fields[x+y*TheMap.Width].Flags; // sprintf(buf,"%3d,%3d=%02X|%04X|%c%c%c%c%c%c%c%c%c",x,y - sprintf(buf,"%3d,%3d=%02X|%04X|%c%c%c%c%c%c%c",x,y, - TheMap.Fields[x+y*TheMap.Width].Value, - flags, + sprintf(buf,"%3d,%3d=%02X|%04X|%c%c%c%c%c%c%c",x,y + ,TheMap.Fields[x+y*TheMap.Width].Value + ,flags //,TheMap.Fields[x+y*TheMap.Width].Tile - flags&MapFieldUnpassable ?'u':'-', - flags&MapFieldNoBuilding ?'n':'-', - flags&MapFieldForest ?'f':'-', - flags&MapFieldWaterAllowed ?'w':'-', - flags&MapFieldCoastAllowed ?'c':'-', - flags&MapFieldLandAllowed ?'l':'-', - flags&MapFieldHuman ?'h':'-' -// flags&MapFieldExplored ?'e':'-' -// flags&MapFieldVisible ?'v':'-' + ,flags&MapFieldUnpassable ?'u':'-' + ,flags&MapFieldNoBuilding ?'n':'-' + ,flags&MapFieldForest ?'f':'-' + ,flags&MapFieldWaterAllowed ?'w':'-' + ,flags&MapFieldCoastAllowed ?'c':'-' + ,flags&MapFieldLandAllowed ?'l':'-' + ,flags&MapFieldHuman ?'h':'-' +// ,flags&MapFieldExplored ?'e':'-' +// ,flags&MapFieldVisible ?'v':'-' ); VideoDrawText(TheUI.MenuButtonX+3,TheUI.MenuButtonY+3,GameFont,buf); VideoUnlockScreen(); - InvalidateArea(TheUI.MenuButtonX,TheUI.MenuButtonY, - TheUI.MenuButton.Graphic->Width, - TheUI.MenuButton.Graphic->Height); + InvalidateArea(TheUI.MenuButtonX,TheUI.MenuButtonY + ,TheUI.MenuButton.Graphic->Width + ,TheUI.MenuButton.Graphic->Height); } #endif // } FLAG_DEBUG @@ -465,105 +463,46 @@ local void HandleMouseOn(int x,int y) // // Handle buttons // - if( NetworkFildes==-1 ) { - if( TheUI.MenuButton.X!=-1 ) { - if( x>=TheUI.MenuButton.X - && x<=TheUI.MenuButton.X+TheUI.MenuButton.Width - && y>TheUI.MenuButton.Y - && y<=TheUI.MenuButton.Y+TheUI.MenuButton.Height ) { - ButtonAreaUnderCursor=ButtonAreaMenu; - ButtonUnderCursor=ButtonUnderMenu; - CursorOn=CursorOnButton; + for( i=0; i<(int)(sizeof(TheUI.Buttons)/sizeof(*TheUI.Buttons)); ++i ) { + if( x<TheUI.Buttons[i].X + || x>TheUI.Buttons[i].X+TheUI.Buttons[i].Width + || y<TheUI.Buttons[i].Y + || y>TheUI.Buttons[i].Y+TheUI.Buttons[i].Height ) { + continue; + } + DebugLevel3("On button %d\n" _C_ i); + ButtonUnderCursor=i; + CursorOn=CursorOnButton; + if( i<10 ) { + if (i == 0) { // Menu button MustRedraw|=RedrawMenuButton; - return; + } else { + MustRedraw|=RedrawInfoPanel; + } + } else { + MustRedraw|=RedrawButtonPanel; + } + return; + } + + if( ButtonUnderCursor!=-1 ) { // remove old display + if( ButtonUnderCursor<10 ) { + if (ButtonUnderCursor == 0) { // Menu button + MustRedraw|=RedrawMenuButton; + } else { + MustRedraw|=RedrawInfoPanel; } - } - } else { - if( TheUI.NetworkMenuButton.X!=-1 ) { - if( x>=TheUI.NetworkMenuButton.X - && x<=TheUI.NetworkMenuButton.X+TheUI.NetworkMenuButton.Width - && y>TheUI.NetworkMenuButton.Y - && y<=TheUI.NetworkMenuButton.Y+TheUI.NetworkMenuButton.Height ) { - ButtonAreaUnderCursor=ButtonAreaMenu; - ButtonUnderCursor=ButtonUnderNetworkMenu; - CursorOn=CursorOnButton; - MustRedraw|=RedrawMenuButton; - return; - } - } - if( TheUI.NetworkDiplomacyButton.X!=-1 ) { - if( x>=TheUI.NetworkDiplomacyButton.X - && x<=TheUI.NetworkDiplomacyButton.X+TheUI.NetworkDiplomacyButton.Width - && y>TheUI.NetworkDiplomacyButton.Y - && y<=TheUI.NetworkDiplomacyButton.Y+TheUI.NetworkDiplomacyButton.Height ) { - ButtonAreaUnderCursor=ButtonAreaMenu; - ButtonUnderCursor=ButtonUnderNetworkDiplomacy; - CursorOn=CursorOnButton; - MustRedraw|=RedrawMenuButton; - return; - } - } - } - for( i=0; i<TheUI.NumButtonButtons; ++i ) { - if( x>=TheUI.ButtonButtons[i].X - && x<=TheUI.ButtonButtons[i].X+TheUI.ButtonButtons[i].Width+7 - && y>TheUI.ButtonButtons[i].Y - && y<=TheUI.ButtonButtons[i].Y+TheUI.ButtonButtons[i].Height+7 ) { - ButtonAreaUnderCursor=ButtonAreaButton; - ButtonUnderCursor=i; - CursorOn=CursorOnButton; - MustRedraw|=RedrawButtonPanel; - return; - } - } - if( NumSelected==1 && Selected[0]->Type->Building - && Selected[0]->Orders[0].Action==UnitActionTrain - && Selected[0]->Data.Train.Count>1 ) { - for( i=0; i<TheUI.NumTrainingButtons; ++i ) { - if( x>=TheUI.TrainingButtons[i].X - && x<=TheUI.TrainingButtons[i].X+TheUI.TrainingButtons[i].Width+7 - && y>TheUI.TrainingButtons[i].Y - && y<=TheUI.TrainingButtons[i].Y+TheUI.TrainingButtons[i].Height+7 ) { - ButtonAreaUnderCursor=ButtonAreaTraining; - ButtonUnderCursor=i; - CursorOn=CursorOnButton; - MustRedraw|=RedrawButtonPanel; - return; - } - } - } else { - for( i=0; i<TheUI.NumInfoButtons; ++i ) { - if( x>=TheUI.InfoButtons[i].X - && x<=TheUI.InfoButtons[i].X+TheUI.InfoButtons[i].Width+7 - && y>TheUI.InfoButtons[i].Y - && y<=TheUI.InfoButtons[i].Y+TheUI.InfoButtons[i].Height+7 ) { - ButtonAreaUnderCursor=ButtonAreaInfo; - ButtonUnderCursor=i; - CursorOn=CursorOnButton; - MustRedraw|=RedrawButtonPanel; - return; - } - } - } - - if( ButtonUnderCursor!=-1 ) { // remove old display - if( ButtonAreaUnderCursor==ButtonAreaMenu ) { - MustRedraw|=RedrawMenuButton; - } else if( ButtonAreaUnderCursor==ButtonAreaInfo ) { - MustRedraw|=RedrawInfoPanel; } else { MustRedraw|=RedrawButtonPanel; } - ButtonAreaUnderCursor=-1; ButtonUnderCursor=-1; } // // Minimap // - if( TheUI.MinimapX!=-1 - && x>=TheUI.MinimapX && x<TheUI.MinimapX+TheUI.MinimapW - && y>=TheUI.MinimapY && y<TheUI.MinimapY+TheUI.MinimapH ) { + if( x>=TheUI.MinimapX+24 && x<TheUI.MinimapX+24+MINIMAP_W + && y>=TheUI.MinimapY+2 && y<TheUI.MinimapY+2+MINIMAP_H ) { CursorOn=CursorOnMinimap; return; } @@ -657,18 +596,18 @@ global void RestrictCursorToViewport(void) */ global void RestrictCursorToMinimap(void) { - if (CursorX < TheUI.MinimapX) { - CursorStartX = TheUI.MinimapX; - } else if (CursorX >= TheUI.MinimapX + TheUI.MinimapW) { - CursorStartX = TheUI.MinimapX + TheUI.MinimapW - 1; + if (CursorX < TheUI.MinimapX + 24) { + CursorStartX = TheUI.MinimapX + 24; + } else if (CursorX >= TheUI.MinimapX + 24 + MINIMAP_W) { + CursorStartX = TheUI.MinimapX + 24 + MINIMAP_W - 1; } else { CursorStartX = CursorX; } - if (CursorY < TheUI.MinimapY) { - CursorStartY = TheUI.MinimapY; - } else if (CursorY >= TheUI.MinimapY + TheUI.MinimapH) { - CursorStartY = TheUI.MinimapY + TheUI.MinimapH - 1; + if (CursorY < TheUI.MinimapY + 2) { + CursorStartY = TheUI.MinimapY + 2; + } else if (CursorY >= TheUI.MinimapY + 2 + MINIMAP_H) { + CursorStartY = TheUI.MinimapY + 2 + MINIMAP_H - 1; } else { CursorStartY = CursorY; } @@ -755,7 +694,7 @@ global void UIHandleMouseMove(int x,int y) // // User may be draging with button pressed. // - if( GameMenuButtonClicked || GameDiplomacyButtonClicked ) { + if( GameMenuButtonClicked ) { return; } @@ -1276,11 +1215,11 @@ local void UISelectStateButtonDown(unsigned button __attribute__((unused))) sx = CursorX - vp->X + TileSizeX * vp->MapX; sy = CursorY - vp->Y + TileSizeY * vp->MapY; if( MouseButtons&LeftButton ) { - MakeLocalMissile(MissileTypeGreenCross, - vp->MapX*TileSizeX+CursorX - vp->X, - vp->MapY*TileSizeY+CursorY - vp->Y, - vp->MapX*TileSizeX+CursorX - vp->X, - vp->MapY*TileSizeY+CursorY - vp->Y); + MakeLocalMissile(MissileTypeGreenCross + ,vp->MapX*TileSizeX+CursorX - vp->X + ,vp->MapY*TileSizeY+CursorY - vp->Y + ,vp->MapX*TileSizeX+CursorX - vp->X + ,vp->MapY*TileSizeY+CursorY - vp->Y); SendCommand(sx, sy); } return; @@ -1305,8 +1244,8 @@ local void UISelectStateButtonDown(unsigned button __attribute__((unused))) CurrentButtonLevel = 0; // reset unit buttons to normal UpdateButtonPanel(); MustRedraw|=RedrawButtonPanel|RedrawCursor; - MakeLocalMissile(MissileTypeGreenCross, - sx+TileSizeX/2,sy+TileSizeY/2,0,0); + MakeLocalMissile(MissileTypeGreenCross + ,sx+TileSizeX/2,sy+TileSizeY/2,0,0); SendCommand(sx,sy); } else { ViewportCenterViewpoint(TheUI.SelectedViewport, mx, my); @@ -1316,8 +1255,8 @@ local void UISelectStateButtonDown(unsigned button __attribute__((unused))) if( CursorOn==CursorOnButton ) { // FIXME: other buttons? - if( ButtonAreaUnderCursor==ButtonAreaButton ) { - DoButtonButtonClicked(ButtonUnderCursor); + if( ButtonUnderCursor>9 ) { + DoButtonButtonClicked(ButtonUnderCursor-10); return; } } @@ -1424,16 +1363,16 @@ global void UIHandleButtonDown(unsigned button) } if( CanBuildUnitType(Selected[0],CursorBuilding,x,y) && (explored || ReplayRevealMap) ) { - PlayGameSound(GameSounds.PlacementSuccess.Sound, - MaxSampleVolume); - SendCommandBuildBuilding(Selected[0],x,y,CursorBuilding, - !(KeyModifiers&ModifierShift)); + PlayGameSound(GameSounds.PlacementSuccess.Sound + ,MaxSampleVolume); + SendCommandBuildBuilding(Selected[0],x,y,CursorBuilding + ,!(KeyModifiers&ModifierShift)); if( !(KeyModifiers&ModifierAlt) ) { CancelBuildingMode(); } } else { - PlayGameSound(GameSounds.PlacementError.Sound, - MaxSampleVolume); + PlayGameSound(GameSounds.PlacementError.Sound + ,MaxSampleVolume); } } else { CancelBuildingMode(); @@ -1479,10 +1418,10 @@ global void UIHandleButtonDown(unsigned button) if( UnitUnderCursor && (unit=UnitOnScreenMapPosition(x,y)) ) { unit->Blink=4; // if right click on building -- blink } else { // if not not click on building -- green cross - MakeLocalMissile(MissileTypeGreenCross, - TheUI.MouseViewport->MapX*TileSizeX - +CursorX-TheUI.MouseViewport->X, - TheUI.MouseViewport->MapY*TileSizeY + MakeLocalMissile(MissileTypeGreenCross + ,TheUI.MouseViewport->MapX*TileSizeX + +CursorX-TheUI.MouseViewport->X + ,TheUI.MouseViewport->MapY*TileSizeY +CursorY-TheUI.MouseViewport->Y,0,0); } DoRightButton(x,y); @@ -1497,9 +1436,9 @@ global void UIHandleButtonDown(unsigned button) ScreenMinimap2MapX(CursorX), ScreenMinimap2MapY(CursorY)); } else if( MouseButtons&RightButton ) { if( !GameObserve && !GamePaused ) { - MakeLocalMissile(MissileTypeGreenCross, - ScreenMinimap2MapX(CursorX)*TileSizeX+TileSizeX/2, - ScreenMinimap2MapY(CursorY)*TileSizeY+TileSizeY/2,0,0); + MakeLocalMissile(MissileTypeGreenCross + ,ScreenMinimap2MapX(CursorX)*TileSizeX+TileSizeX/2 + ,ScreenMinimap2MapY(CursorY)*TileSizeY+TileSizeY/2,0,0); // DoRightButton() takes screen map coordinates DoRightButton(ScreenMinimap2MapX(CursorX) * TileSizeX, ScreenMinimap2MapY(CursorY) * TileSizeY); @@ -1512,82 +1451,75 @@ global void UIHandleButtonDown(unsigned button) // // clicked on info panel - selection shown // - if( NumSelected>1 && ButtonAreaUnderCursor==ButtonAreaInfo ) { + if( NumSelected>1 && ButtonUnderCursor && ButtonUnderCursor<10 ) { if( !GameObserve && !GamePaused ) { - DoSelectionButtons(ButtonUnderCursor,button); + DoSelectionButtons(ButtonUnderCursor-1,button); } } else if( (MouseButtons&LeftButton) ) { // // clicked on menu button // - if( ButtonAreaUnderCursor==ButtonAreaMenu ) { - if( (ButtonUnderCursor==ButtonUnderMenu - || ButtonUnderCursor==ButtonUnderNetworkMenu) - && !GameMenuButtonClicked ) { - PlayGameSound(GameSounds.Click.Sound,MaxSampleVolume); - GameMenuButtonClicked=1; - MustRedraw|=RedrawMenuButton; - } else if( ButtonUnderCursor==ButtonUnderNetworkDiplomacy - && !GameDiplomacyButtonClicked ) { - PlayGameSound(GameSounds.Click.Sound,MaxSampleVolume); - GameDiplomacyButtonClicked=1; - MustRedraw|=RedrawMenuButton; - } + if( ButtonUnderCursor==0 && !GameMenuButtonClicked ) { + PlayGameSound(GameSounds.Click.Sound,MaxSampleVolume); + GameMenuButtonClicked = 1; + MustRedraw|=RedrawMenuButton; // - // clicked on info panel + // clicked on info panel - single unit shown // - } else if( ButtonAreaUnderCursor==ButtonAreaInfo ) { - // - // clicked on single unit shown - // - if( ButtonUnderCursor==0 && NumSelected==1 ) { - PlayGameSound(GameSounds.Click.Sound,MaxSampleVolume); - ViewportCenterViewpoint(TheUI.SelectedViewport, Selected[0]->X, - Selected[0]->Y); - // - // for transporter - // - } else if( ButtonUnderCursor>2 && ButtonUnderCursor<9 ) { - if( NumSelected==1 && Selected[0]->Type->Transporter ) { - if( !GameObserve && !GamePaused ) { - if( Selected[0]->OnBoard[ButtonUnderCursor-3] ) { - // FIXME: should check if valid here. - SendCommandUnload(Selected[0], - Selected[0]->X,Selected[0]->Y, - Selected[0]->OnBoard[ButtonUnderCursor-3], - !(KeyModifiers&ModifierShift)); - } + } else if( ButtonUnderCursor==1 && NumSelected==1 ) { + PlayGameSound(GameSounds.Click.Sound,MaxSampleVolume); + ViewportCenterViewpoint(TheUI.SelectedViewport, Selected[0]->X, + Selected[0]->Y); + // + // clicked on info panel - single unit shown + // for transporter - training queues + // + } else if( ButtonUnderCursor>3 && ButtonUnderCursor<10 ) { + if( NumSelected==1 && Selected[0]->Type->Transporter ) { + if( !GameObserve && !GamePaused ) { + if( Selected[0]->OnBoard[ButtonUnderCursor-4] ) { + // FIXME: should check if valid here. + SendCommandUnload(Selected[0] + ,Selected[0]->X,Selected[0]->Y + ,Selected[0]->OnBoard[ButtonUnderCursor-4] + ,!(KeyModifiers&ModifierShift)); } } } - // - // clicked on training button - // - } else if( ButtonAreaUnderCursor==ButtonAreaTraining ) { - if( !GameObserve && !GamePaused ) { - if( ButtonUnderCursor<Selected[0]->Data.Train.Count ) { - DebugLevel0Fn("Cancel slot %d %s\n" _C_ - ButtonUnderCursor _C_ - Selected[0]->Data.Train.What[ButtonUnderCursor]->Ident); - SendCommandCancelTraining(Selected[0], - ButtonUnderCursor, - Selected[0]->Data.Train.What[ButtonUnderCursor]); + else if( NumSelected==1 && Selected[0]->Type->Building && + Selected[0]->Orders[0].Action==UnitActionTrain) { + if( !GameObserve && !GamePaused ) { + int slotid = ButtonUnderCursor-4; + if ( Selected[0]->Data.Train.Count == 1 ) { + // FIXME: ignore clicks that did not hit + // FIXME: with only one unit being built, this + // unit is displayed between two slots. + slotid = 0; + } + if ( slotid < Selected[0]->Data.Train.Count ) { + DebugLevel0Fn("Cancel slot %d %s\n" _C_ + slotid _C_ + Selected[0]->Data.Train.What[slotid] + ->Ident); + SendCommandCancelTraining(Selected[0], + slotid, + Selected[0]->Data.Train.What[slotid]); + } } } // // clicked on button panel // - } else if( ButtonAreaUnderCursor==ButtonAreaButton ) { + } else if( ButtonUnderCursor>9 ) { if( !GameObserve && !GamePaused ) { - DoButtonButtonClicked(ButtonUnderCursor); + DoButtonButtonClicked(ButtonUnderCursor-10); } } } else if( (MouseButtons&MiddleButton) ) { // // clicked on info panel - single unit shown // - if( ButtonAreaUnderCursor==ButtonAreaInfo - && ButtonUnderCursor==0 && NumSelected==1 ) { + if( ButtonUnderCursor==1 && NumSelected==1 ) { PlayGameSound(GameSounds.Click.Sound,MaxSampleVolume); if( TheUI.SelectedViewport->Unit == Selected[0] ) { TheUI.SelectedViewport->Unit = NULL; @@ -1621,9 +1553,7 @@ global void UIHandleButtonUp(unsigned button) if( (1<<button) == LeftButton && GameMenuButtonClicked == 1 ) { GameMenuButtonClicked = 0; MustRedraw|=RedrawMenuButton; - if( ButtonAreaUnderCursor==ButtonAreaMenu - && (ButtonUnderCursor==ButtonUnderMenu - || ButtonUnderCursor==ButtonUnderNetworkMenu) ) { + if( ButtonUnderCursor == 0 ) { // FIXME: Not if, in input mode. if( NetworkFildes==-1 ) { GamePaused=1; @@ -1634,20 +1564,6 @@ global void UIHandleButtonUp(unsigned button) } } - // - // Diplomacy button - // - if( (1<<button) == LeftButton && GameDiplomacyButtonClicked == 1 ) { - GameDiplomacyButtonClicked = 0; - MustRedraw|=RedrawMenuButton; - if( ButtonAreaUnderCursor==ButtonAreaMenu - && ButtonUnderCursor==ButtonUnderNetworkDiplomacy) { - // FIXME: Not if, in input mode. - ProcessMenu("menu-diplomacy",0); - return; - } - } - // FIXME: should be completly rewritten // FIXME: must selecting! (lokh: what does this mean? is this done now?) @@ -1721,10 +1637,10 @@ global void UIHandleButtonUp(unsigned button) if( IsMapFieldVisible(ThisPlayer, Viewport2MapX(TheUI.MouseViewport,CursorX), Viewport2MapY(TheUI.MouseViewport,CursorY)) || ReplayRevealMap ) { - unit=UnitOnScreen(unit, - CursorX-TheUI.MouseViewport->X+ - TheUI.MouseViewport->MapX*TileSizeX, - CursorY-TheUI.MouseViewport->Y+ + unit=UnitOnScreen(unit + ,CursorX-TheUI.MouseViewport->X+ + TheUI.MouseViewport->MapX*TileSizeX + ,CursorY-TheUI.MouseViewport->Y+ TheUI.MouseViewport->MapY*TileSizeY); } if( unit ) { diff --git a/src/ui/script_ui.cpp b/src/ui/script_ui.cpp index 04b3aecb1..578d16fe8 100644 --- a/src/ui/script_ui.cpp +++ b/src/ui/script_ui.cpp @@ -530,83 +530,753 @@ local SCM CclSetGameCursor(SCM ident) } /** -** Define a menu item +** Define the look+feel of the user interface. ** ** FIXME: need some general data structure to make this parsing easier. -** -** @param value Button type. +** FIXME: use the new tagged config format. */ -local MenuButtonId scm2buttonid(SCM value) +local SCM CclDefineUI(SCM list) { - MenuButtonId id; + SCM value; + SCM temp; + char* str; + int x; + int y; + int i; + UI* ui; + void* v; + MenuPanel** menupanel; - if ( gh_eq_p(value, gh_symbol2scm("main")) ) { - id=MBUTTON_MAIN; - } else if ( gh_eq_p(value, gh_symbol2scm("network")) ) { - id=MBUTTON_NETWORK; - } else if ( gh_eq_p(value, gh_symbol2scm("gm-half")) ) { - id=MBUTTON_GM_HALF; - } else if ( gh_eq_p(value, gh_symbol2scm("132")) ) { - id=MBUTTON_132; - } else if ( gh_eq_p(value, gh_symbol2scm("gm-full")) ) { - id=MBUTTON_GM_FULL; - } else if ( gh_eq_p(value, gh_symbol2scm("gem-round")) ) { - id=MBUTTON_GEM_ROUND; - } else if ( gh_eq_p(value, gh_symbol2scm("gem-square")) ) { - id=MBUTTON_GEM_SQUARE; - } else if ( gh_eq_p(value, gh_symbol2scm("up-arrow")) ) { - id=MBUTTON_UP_ARROW; - } else if ( gh_eq_p(value, gh_symbol2scm("down-arrow")) ) { - id=MBUTTON_DOWN_ARROW; - } else if ( gh_eq_p(value, gh_symbol2scm("left-arrow")) ) { - id=MBUTTON_LEFT_ARROW; - } else if ( gh_eq_p(value, gh_symbol2scm("right-arrow")) ) { - id=MBUTTON_RIGHT_ARROW; - } else if ( gh_eq_p(value, gh_symbol2scm("s-knob")) ) { - id=MBUTTON_S_KNOB; - } else if ( gh_eq_p(value, gh_symbol2scm("s-vcont")) ) { - id=MBUTTON_S_VCONT; - } else if ( gh_eq_p(value, gh_symbol2scm("s-hcont")) ) { - id=MBUTTON_S_HCONT; - } else if ( gh_eq_p(value, gh_symbol2scm("pulldown")) ) { - id=MBUTTON_PULLDOWN; - } else if ( gh_eq_p(value, gh_symbol2scm("vthin")) ) { - id=MBUTTON_VTHIN; - } else if ( gh_eq_p(value, gh_symbol2scm("folder")) ) { - id=MBUTTON_FOLDER; - } else if ( gh_eq_p(value, gh_symbol2scm("sc-gem-round")) ) { - id=MBUTTON_SC_GEM_ROUND; - } else if ( gh_eq_p(value, gh_symbol2scm("sc-gem-square")) ) { - id=MBUTTON_SC_GEM_SQUARE; - } else if ( gh_eq_p(value, gh_symbol2scm("sc-up-arrow")) ) { - id=MBUTTON_SC_UP_ARROW; - } else if ( gh_eq_p(value, gh_symbol2scm("sc-down-arrow")) ) { - id=MBUTTON_SC_DOWN_ARROW; - } else if ( gh_eq_p(value, gh_symbol2scm("sc-left-arrow")) ) { - id=MBUTTON_SC_LEFT_ARROW; - } else if ( gh_eq_p(value, gh_symbol2scm("sc-right-arrow")) ) { - id=MBUTTON_SC_RIGHT_ARROW; - } else if ( gh_eq_p(value, gh_symbol2scm("sc-s-knob")) ) { - id=MBUTTON_SC_S_KNOB; - } else if ( gh_eq_p(value, gh_symbol2scm("sc-s-vcont")) ) { - id=MBUTTON_SC_S_VCONT; - } else if ( gh_eq_p(value, gh_symbol2scm("sc-s-hcont")) ) { - id=MBUTTON_SC_S_HCONT; - } else if ( gh_eq_p(value, gh_symbol2scm("sc-pulldown")) ) { - id=MBUTTON_SC_PULLDOWN; - } else if ( gh_eq_p(value, gh_symbol2scm("sc-button-left")) ) { - id=MBUTTON_SC_BUTTON_LEFT; - } else if ( gh_eq_p(value, gh_symbol2scm("sc-button")) ) { - id=MBUTTON_SC_BUTTON; - } else if ( gh_eq_p(value, gh_symbol2scm("sc-button-right")) ) { - id=MBUTTON_SC_BUTTON_RIGHT; - } else { - char *s1=gh_scm2newstr(value, NULL); - fprintf(stderr, "Unsupported button %s\n", s1); - free(s1); - return 0; + // Get identifier + value=gh_car(list); + list=gh_cdr(list); + str=gh_scm2newstr(value,NULL); + value=gh_car(list); + list=gh_cdr(list); + x=gh_scm2int(value); + value=gh_car(list); + list=gh_cdr(list); + y=gh_scm2int(value); + + // Find slot: new or redefinition + ui=NULL; + i=0; + if( UI_Table ) { + for( ; UI_Table[i]; ++i ) { + if( UI_Table[i]->Width==x && UI_Table[i]->Height==y + && !strcmp(UI_Table[i]->Name,str) ) { + ui=UI_Table[i]; + break; + } + } } - return id; + if( !ui ) { + ui=calloc(1,sizeof(UI)); + v=malloc(sizeof(UI*)*(i+2)); + memcpy(v,UI_Table,i*sizeof(UI*)); + free(UI_Table); + UI_Table=v; + UI_Table[i]=ui; + UI_Table[i+1]=NULL; + } + + free(ui->Name); + ui->Name=str; + ui->Width=x; + ui->Height=y; + + // + // Some value defaults + // + + // This save the setup values FIXME: They are set by CCL. + + ui->Contrast=TheUI.Contrast; + ui->Brightness=TheUI.Brightness; + ui->Saturation=TheUI.Saturation; + + ui->MouseScroll=TheUI.MouseScroll; + ui->KeyScroll=TheUI.KeyScroll; + ui->ReverseMouseMove=TheUI.ReverseMouseMove; + + ui->WarpX=-1; + ui->WarpY=-1; + + ui->MouseAdjust=TheUI.MouseAdjust; + ui->MouseScale=TheUI.MouseScale; + + ui->OriginalResources=TheUI.OriginalResources; + + // + // Now the real values. + // + + // Filler 1 + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + for( i=0; i<ui->NumFillers; ++i ) { + free(ui->Filler[i].File); + } + free(ui->Filler); + free(ui->FillerX); + free(ui->FillerY); + + ui->NumFillers=1; + ui->Filler=malloc(ui->NumFillers*sizeof(*ui->Filler)); + ui->FillerX=malloc(ui->NumFillers*sizeof(*ui->FillerX)); + ui->FillerY=malloc(ui->NumFillers*sizeof(*ui->FillerY)); + + ui->Filler[0].File=str; + ui->FillerX[0]=x; + ui->FillerY[0]=y; + + // Resource + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + free(ui->Resource.File); + ui->Resource.File=str; + ui->ResourceX=x; + ui->ResourceY=y; + + // + // Parse icons + // + for( i=1; i<MaxCosts; ++i ) { + // icon + temp=gh_car(list); + list=gh_cdr(list); + + if( gh_null_p(temp) ) { + free(ui->Resources[i].Icon.File); + ui->Resources[i].Icon.File=NULL; + ui->Resources[i].Icon.Graphic=NULL; + ui->Resources[i].IconRow=0; + ui->Resources[i].IconX=0; + ui->Resources[i].IconY=0; + ui->Resources[i].IconW=0; + ui->Resources[i].IconH=0; + ui->Resources[i].TextX=0; + ui->Resources[i].TextY=0; + continue; + } + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->Resources[i].Icon.File); + ui->Resources[i].Icon.File=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Resources[i].IconRow=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Resources[i].IconX=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Resources[i].IconY=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Resources[i].IconW=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Resources[i].IconH=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Resources[i].TextX=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Resources[i].TextY=y; + } + + // Food icon + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->FoodIcon.File); + ui->FoodIcon.File=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + i=gh_scm2int(value); + ui->FoodIconRow=i; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->FoodIconX=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->FoodIconY=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->FoodIconW=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->FoodIconH=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->FoodTextX=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->FoodTextY=y; + + // Score icon + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ScoreIcon.File); + ui->ScoreIcon.File=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + i=gh_scm2int(value); + ui->ScoreIconRow=i; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->ScoreIconX=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->ScoreIconY=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->ScoreIconW=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->ScoreIconH=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->ScoreTextX=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->ScoreTextY=y; + + // InfoPanel + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + free(ui->InfoPanel.File); + ui->InfoPanel.File=str; + ui->InfoPanelX=x; + ui->InfoPanelY=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->InfoPanelW=x; + ui->InfoPanelH=y; + + // Completed bar + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + value=gh_car(temp); + temp=gh_cdr(temp); + i=gh_scm2int(value); + ui->CompleteBarColor=i; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->CompleteBarX=x; + ui->CompleteBarY=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->CompleteTextX=x; + ui->CompleteTextY=y; + + // ButtonPanel + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + free(ui->ButtonPanel.File); + ui->ButtonPanel.File=str; + ui->ButtonPanelX=x; + ui->ButtonPanelY=y; + + // The map + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->MapArea.X=x; + ui->MapArea.Y=y; + if ( ui->MapArea.X < 0 || ui->MapArea.Y < 0 ) { + fprintf(stderr,"map top-left point expected\n"); + return SCM_UNSPECIFIED; + } + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + //StephanR: note that the bottom-right point is one pixel off + ui->MapArea.EndX = x-1; + ui->MapArea.EndY = y-1; + if ( x < 1 || y < 1 || ui->MapArea.EndX < ui->MapArea.X || + ui->MapArea.EndY < ui->MapArea.Y ) { + fprintf(stderr,"map bottom-right point expected\n"); + return SCM_UNSPECIFIED; + } + + // MenuButton + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + free(ui->MenuButton.File); + ui->MenuButton.File=str; + ui->MenuButtonX=x; + ui->MenuButtonY=y; + + // Minimap + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + free(ui->Minimap.File); + ui->Minimap.File=str; + ui->MinimapX=x; + ui->MinimapY=y; + + // StatusLine + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + free(ui->StatusLine.File); + ui->StatusLine.File=str; + ui->StatusLineX=x; + ui->StatusLineY=y; + + // Buttons + for( i=0; i<MaxButtons; ++i ) { + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Buttons[i].X=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Buttons[i].Y=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Buttons[i].Width=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Buttons[i].Height=y; + } + for( i=0; i<6; ++i ) { + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Buttons2[i].X=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Buttons2[i].Y=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Buttons2[i].Width=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Buttons2[i].Height=y; + } + + // + // Get the cursors definitions. + // + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->Point.Name); + ui->Point.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->Glass.Name); + ui->Glass.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->Cross.Name); + ui->Cross.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->YellowHair.Name); + ui->YellowHair.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->GreenHair.Name); + ui->GreenHair.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->RedHair.Name); + ui->RedHair.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->Scroll.Name); + ui->Scroll.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowE.Name); + ui->ArrowE.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowNE.Name); + ui->ArrowNE.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowN.Name); + ui->ArrowN.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowNW.Name); + ui->ArrowNW.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowW.Name); + ui->ArrowW.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowSW.Name); + ui->ArrowSW.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowS.Name); + ui->ArrowS.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowSE.Name); + ui->ArrowSE.Name=str; + + // + // Panels + // + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + menupanel=&ui->MenuPanels; + while( *menupanel ) { + menupanel=&(*menupanel)->Next; + } + (*menupanel)=calloc(1,sizeof(**menupanel)); + (*menupanel)->Ident=strdup("panel1"); + (*menupanel)->Panel.File=str; + + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + while( *menupanel ) { + menupanel=&(*menupanel)->Next; + } + (*menupanel)=calloc(1,sizeof(**menupanel)); + (*menupanel)->Ident=strdup("panel2"); + (*menupanel)->Panel.File=str; + + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + while( *menupanel ) { + menupanel=&(*menupanel)->Next; + } + (*menupanel)=calloc(1,sizeof(**menupanel)); + (*menupanel)->Ident=strdup("panel3"); + (*menupanel)->Panel.File=str; + + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + while( *menupanel ) { + menupanel=&(*menupanel)->Next; + } + (*menupanel)=calloc(1,sizeof(**menupanel)); + (*menupanel)->Ident=strdup("panel4"); + (*menupanel)->Panel.File=str; + + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + while( *menupanel ) { + menupanel=&(*menupanel)->Next; + } + (*menupanel)=calloc(1,sizeof(**menupanel)); + (*menupanel)->Ident=strdup("panel5"); + (*menupanel)->Panel.File=str; + + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->VictoryBackground.File); + ui->VictoryBackground.File=str; + + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->DefeatBackground.File); + ui->DefeatBackground.File=str; + + return SCM_UNSPECIFIED; } /** @@ -614,10 +1284,10 @@ local MenuButtonId scm2buttonid(SCM value) ** ** @param list Tagged list of the user interface configuration. */ -local SCM CclDefineUI(SCM list) +local SCM CclDefineNewUI(SCM list) { SCM value; - SCM sublist; + //SCM temp; char* str; int x; int y; @@ -687,20 +1357,6 @@ local SCM CclDefineUI(SCM list) ui->OriginalResources=TheUI.OriginalResources; - ui->MenuButton.X=-1; - ui->NetworkMenuButton.X=-1; - ui->NetworkDiplomacyButton.X=-1; - ui->MinimapX=-1; - ui->StatusLineX=-1; - ui->InfoPanelX=-1; - ui->InfoPanelW=-1; - ui->CompleteBarX=-1; - ui->ButtonPanelX=-1; - ui->MessageAreaX=-1; - for( i=0; i<MaxCosts+2; ++i ) { - ui->Resources[i].TextX=-1; - } - // // Now the real values. // @@ -715,623 +1371,664 @@ local SCM CclDefineUI(SCM list) value=gh_car(list); list=gh_cdr(list); ui->ReverseFontColor=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("panel")) ) { - sublist=gh_car(list); + } else if( gh_eq_p(value,gh_symbol2scm("filler")) ) { + value=gh_car(list); list=gh_cdr(list); - ui->NumPanels++; - ui->Panel=realloc(ui->Panel,ui->NumPanels*sizeof(*ui->Panel)); - ui->PanelX=realloc(ui->PanelX,ui->NumPanels*sizeof(*ui->PanelX)); - ui->PanelY=realloc(ui->PanelY,ui->NumPanels*sizeof(*ui->PanelY)); - 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->Panel[ui->NumPanels-1].File=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->PanelX[ui->NumPanels-1]=gh_scm2int(gh_car(value)); - ui->PanelY[ui->NumPanels-1]=gh_scm2int(gh_car(gh_cdr(value))); - } else { - errl("Unsupported tag",value); - } - } } else if( gh_eq_p(value,gh_symbol2scm("resources")) ) { - sublist=gh_car(list); + value=gh_car(list); + list=gh_cdr(list); + } else if( gh_eq_p(value,gh_symbol2scm("info-panel")) ) { + value=gh_car(list); + list=gh_cdr(list); + } else if( gh_eq_p(value,gh_symbol2scm("button-panel")) ) { + value=gh_car(list); list=gh_cdr(list); - while( !gh_null_p(sublist) ) { - SCM slist; - int res; - char* name; - - value=gh_car(sublist); - sublist=gh_cdr(sublist); - name=gh_scm2newstr(value,NULL); - for( res=0; res<MaxCosts; ++res ) { - if( !strcmp(name,DefaultResourceNames[res]) ) { - break; - } - } - if( res==MaxCosts ) { - if( !strcmp(name,"food") ) { - res=FoodCost; - } else if( !strcmp(name,"score") ) { - res=ScoreCost; - } else { - errl("Resource not found",value); - } - } - free(name); - slist=gh_car(sublist); - sublist=gh_cdr(sublist); - while( !gh_null_p(slist) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - ui->Resources[res].IconX=gh_scm2int(gh_car(value)); - ui->Resources[res].IconY=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("file")) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - ui->Resources[res].Icon.File=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("row")) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - ui->Resources[res].IconRow=gh_scm2int(value); - } else if( gh_eq_p(value,gh_symbol2scm("size")) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - ui->Resources[res].IconW=gh_scm2int(gh_car(value)); - ui->Resources[res].IconH=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("text-pos")) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - ui->Resources[res].TextX=gh_scm2int(gh_car(value)); - ui->Resources[res].TextY=gh_scm2int(gh_car(gh_cdr(value))); - } else { - errl("Unsupported tag",value); - } - } - } } else if( gh_eq_p(value,gh_symbol2scm("map-area")) ) { - int w; - int h; - - w=0; - h=0; - sublist=gh_car(list); + value=gh_car(list); list=gh_cdr(list); - while( !gh_null_p(sublist) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->MapArea.X=gh_scm2int(gh_car(value)); - ui->MapArea.Y=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("size")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - w=gh_scm2int(gh_car(value)); - h=gh_scm2int(gh_car(gh_cdr(value))); - } else { - errl("Unsupported tag",value); - } - } - ui->MapArea.EndX=ui->MapArea.X+w-1; - ui->MapArea.EndY=ui->MapArea.Y+h-1; - } else if( gh_eq_p(value,gh_symbol2scm("info-area")) ) { - int minx; - int miny; - int maxx; - int maxy; - - minx=miny=9999; - maxx=maxy=0; - - sublist=gh_car(list); - list=gh_cdr(list); - while( !gh_null_p(sublist) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->InfoPanelX=gh_scm2int(gh_car(value)); - ui->InfoPanelY=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("panel")) ) { - SCM slist; - - slist=gh_car(sublist); - sublist=gh_cdr(sublist); - while( !gh_null_p(slist) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - if( gh_eq_p(value,gh_symbol2scm("file")) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - ui->InfoPanel.File=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("size")) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - ui->InfoPanelW=gh_scm2int(gh_car(value)); - ui->InfoPanelH=gh_scm2int(gh_car(gh_cdr(value))); - } else { - errl("Unsupported tag",value); - } - } - } else if( gh_eq_p(value,gh_symbol2scm("neutral-frame")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->InfoPanelNeutralFrame=gh_scm2int(value); - } else if( gh_eq_p(value,gh_symbol2scm("selected-frame")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->InfoPanelSelectedFrame=gh_scm2int(value); - } else if( gh_eq_p(value,gh_symbol2scm("magic-frame")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->InfoPanelMagicFrame=gh_scm2int(value); - } else if( gh_eq_p(value,gh_symbol2scm("construction-frame")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->InfoPanelConstructionFrame=gh_scm2int(value); - } else if( gh_eq_p(value,gh_symbol2scm("completed-bar")) ) { - SCM slist; - - slist=gh_car(sublist); - sublist=gh_cdr(sublist); - while( !gh_null_p(slist) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - if( gh_eq_p(value,gh_symbol2scm("color")) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - ui->CompleteBarColor=gh_scm2int(value); - } else if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - ui->CompleteBarX=gh_scm2int(gh_car(value)); - ui->CompleteBarY=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("size")) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - ui->CompleteBarW=gh_scm2int(gh_car(value)); - ui->CompleteBarH=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("text")) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - ui->CompleteBarText=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("font")) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - ui->CompleteBarFont=CclFontByIdentifier(value); - } else if( gh_eq_p(value,gh_symbol2scm("text-pos")) ) { - value=gh_car(slist); - slist=gh_cdr(slist); - ui->CompleteTextX=gh_scm2int(gh_car(value)); - ui->CompleteTextY=gh_scm2int(gh_car(gh_cdr(value))); - } else { - errl("Unsupported tag",value); - } - } - } else if( gh_eq_p(value,gh_symbol2scm("buttons")) ) { - SCM slist; - SCM sslist; - Button* b; - - slist=gh_car(sublist); - sublist=gh_cdr(sublist); - while( !gh_null_p(slist) ) { - sslist=gh_car(slist); - slist=gh_cdr(slist); - ui->NumInfoButtons++; - ui->InfoButtons=realloc(ui->InfoButtons, - ui->NumInfoButtons*sizeof(*ui->InfoButtons)); - b=&ui->InfoButtons[ui->NumInfoButtons-1]; - while( !gh_null_p(sslist) ) { - value=gh_car(sslist); - sslist=gh_cdr(sslist); - if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(sslist); - sslist=gh_cdr(sslist); - b->X=gh_scm2int(gh_car(value)); - b->Y=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("size")) ) { - value=gh_car(sslist); - sslist=gh_cdr(sslist); - b->Width=gh_scm2int(gh_car(value)); - b->Height=gh_scm2int(gh_car(gh_cdr(value))); - } else { - errl("Unsupported tag",value); - } - } - if( b->X<minx ) { - minx=b->X; - } - if( b->Y<miny ) { - miny=b->Y; - } - if( b->X+b->Width>maxx ) { - maxx=b->X+b->Width; - } - if( b->Y+b->Height>maxy ) { - maxy=b->Y+b->Height; - } - } - } else if( gh_eq_p(value,gh_symbol2scm("training-buttons")) ) { - SCM slist; - SCM sslist; - Button* b; - - slist=gh_car(sublist); - sublist=gh_cdr(sublist); - while( !gh_null_p(slist) ) { - sslist=gh_car(slist); - slist=gh_cdr(slist); - ui->NumTrainingButtons++; - ui->TrainingButtons=realloc(ui->TrainingButtons, - ui->NumTrainingButtons*sizeof(*ui->TrainingButtons)); - b=&ui->TrainingButtons[ui->NumTrainingButtons-1]; - while( !gh_null_p(sslist) ) { - value=gh_car(sslist); - sslist=gh_cdr(sslist); - if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(sslist); - sslist=gh_cdr(sslist); - b->X=gh_scm2int(gh_car(value)); - b->Y=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("size")) ) { - value=gh_car(sslist); - sslist=gh_cdr(sslist); - b->Width=gh_scm2int(gh_car(value)); - b->Height=gh_scm2int(gh_car(gh_cdr(value))); - } else { - errl("Unsupported tag",value); - } - } - if( b->X<minx ) { - minx=b->X; - } - if( b->Y<miny ) { - miny=b->Y; - } - if( b->X+b->Width>maxx ) { - maxx=b->X+b->Width; - } - if( b->Y+b->Height>maxy ) { - maxy=b->Y+b->Height; - } - } - } else { - errl("Unsupported tag",value); - } - } - if( ui->InfoPanelX==-1 ) { - ui->InfoPanelX=minx; - ui->InfoPanelY=miny; - } - if( ui->InfoPanelW==-1 ) { - ui->InfoPanelW=maxx-ui->InfoPanelX; - ui->InfoPanelH=maxy-ui->InfoPanelY; - } - } else if( gh_eq_p(value,gh_symbol2scm("button-area")) ) { - sublist=gh_car(list); - list=gh_cdr(list); - while( !gh_null_p(sublist) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - if( gh_eq_p(value,gh_symbol2scm("buttons")) ) { - SCM slist; - SCM sslist; - Button* b; - - slist=gh_car(sublist); - sublist=gh_cdr(sublist); - while( !gh_null_p(slist) ) { - sslist=gh_car(slist); - slist=gh_cdr(slist); - ui->NumButtonButtons++; - ui->ButtonButtons=realloc(ui->ButtonButtons, - ui->NumButtonButtons*sizeof(*ui->ButtonButtons)); - b=&ui->ButtonButtons[ui->NumButtonButtons-1]; - while( !gh_null_p(sslist) ) { - value=gh_car(sslist); - sslist=gh_cdr(sslist); - if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(sslist); - sslist=gh_cdr(sslist); - b->X=gh_scm2int(gh_car(value)); - b->Y=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("size")) ) { - value=gh_car(sslist); - sslist=gh_cdr(sslist); - b->Width=gh_scm2int(gh_car(value)); - b->Height=gh_scm2int(gh_car(gh_cdr(value))); - } else { - errl("Unsupported tag",value); - } - } - if( ui->NumButtonButtons==1 - || b->X<ui->ButtonPanelX ) { - ui->ButtonPanelX=b->X; - } - if( ui->NumButtonButtons==1 - || b->X+b->Width>ui->ButtonPanelEndX ) { - ui->ButtonPanelEndX=b->X+b->Width; - } - if( ui->NumButtonButtons==1 - || b->Y<ui->ButtonPanelY ) { - ui->ButtonPanelY=b->Y; - } - if( ui->NumButtonButtons==1 - || b->Y+b->Height>ui->ButtonPanelEndY ) { - ui->ButtonPanelEndY=b->Y+b->Height; - } - } - } else { - errl("Unsupported tag",value); - } - } - } else if( gh_eq_p(value,gh_symbol2scm("minimap-area")) ) { - sublist=gh_car(list); - list=gh_cdr(list); - while( !gh_null_p(sublist) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->MinimapX=gh_scm2int(gh_car(value)); - ui->MinimapY=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 if( gh_eq_p(value,gh_symbol2scm("cursor-color")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->MinimapCursorColor=gh_scm2int(value); - } else { - errl("Unsupported tag",value); - } - } - } else if( gh_eq_p(value,gh_symbol2scm("status-line")) ) { - sublist=gh_car(list); - list=gh_cdr(list); - while( !gh_null_p(sublist) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - if( gh_eq_p(value,gh_symbol2scm("font")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->StatusLineFont=CclFontByIdentifier(value); - } else if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->StatusLineX=gh_scm2int(gh_car(value)); - ui->StatusLineY=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("width")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->StatusLineW=gh_scm2int(value); - } else { - errl("Unsupported tag",value); - } - } } else if( gh_eq_p(value,gh_symbol2scm("menu-button")) ) { - sublist=gh_car(list); + value=gh_car(list); list=gh_cdr(list); - while( !gh_null_p(sublist) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->MenuButton.X=gh_scm2int(gh_car(value)); - ui->MenuButton.Y=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->MenuButton.Width=gh_scm2int(gh_car(value)); - ui->MenuButton.Height=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("caption")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->MenuButton.Text=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("style")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->MenuButton.Button=scm2buttonid(value); - } else { - errl("Unsupported tag",value); - } - } - } else if( gh_eq_p(value,gh_symbol2scm("network-menu-button")) ) { - sublist=gh_car(list); + } else if( gh_eq_p(value,gh_symbol2scm("minimap")) ) { + value=gh_car(list); list=gh_cdr(list); - while( !gh_null_p(sublist) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->NetworkMenuButton.X=gh_scm2int(gh_car(value)); - ui->NetworkMenuButton.Y=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->NetworkMenuButton.Width=gh_scm2int(gh_car(value)); - ui->NetworkMenuButton.Height=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("caption")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->NetworkMenuButton.Text=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("style")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->NetworkMenuButton.Button=scm2buttonid(value); - } else { - errl("Unsupported tag",value); - } - } - } else if( gh_eq_p(value,gh_symbol2scm("network-diplomacy-button")) ) { - sublist=gh_car(list); + } else if( gh_eq_p(value,gh_symbol2scm("status-line")) ) { + value=gh_car(list); list=gh_cdr(list); - while( !gh_null_p(sublist) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->NetworkDiplomacyButton.X=gh_scm2int(gh_car(value)); - ui->NetworkDiplomacyButton.Y=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->NetworkDiplomacyButton.Width=gh_scm2int(gh_car(value)); - ui->NetworkDiplomacyButton.Height=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("caption")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->NetworkDiplomacyButton.Text=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("style")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->NetworkDiplomacyButton.Button=scm2buttonid(value); - } else { - errl("Unsupported tag",value); - } - } - } else if( gh_eq_p(value,gh_symbol2scm("message-area")) ) { - sublist=gh_car(list); + } else if( gh_eq_p(value,gh_symbol2scm("buttons")) ) { + value=gh_car(list); + list=gh_cdr(list); + } else if( gh_eq_p(value,gh_symbol2scm("buttons-2")) ) { + value=gh_car(list); list=gh_cdr(list); - while( !gh_null_p(sublist) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - if( gh_eq_p(value,gh_symbol2scm("font")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->MessageAreaFont=CclFontByIdentifier(value); - } else if( gh_eq_p(value,gh_symbol2scm("pos")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->MessageAreaX=gh_scm2int(gh_car(value)); - ui->MessageAreaY=gh_scm2int(gh_car(gh_cdr(value))); - } else if( gh_eq_p(value,gh_symbol2scm("width")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->MessageAreaW=gh_scm2int(value); - } else { - errl("Unsupported tag",value); - } - } } else if( gh_eq_p(value,gh_symbol2scm("cursors")) ) { - sublist=gh_car(list); - list=gh_cdr(list); - while( !gh_null_p(sublist) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - if( gh_eq_p(value,gh_symbol2scm("point")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->Point.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("glass")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->Glass.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("cross")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->Cross.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("yellow")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->YellowHair.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("green")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->GreenHair.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("red")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->RedHair.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("scroll")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->Scroll.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("arrow-e")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->ArrowE.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("arrow-ne")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->ArrowNE.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("arrow-n")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->ArrowN.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("arrow-nw")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->ArrowNW.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("arrow-w")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->ArrowW.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("arrow-sw")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->ArrowSW.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("arrow-s")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->ArrowS.Name=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("arrow-se")) ) { - value=gh_car(sublist); - sublist=gh_cdr(sublist); - ui->ArrowSE.Name=gh_scm2newstr(value,NULL); - } else { - errl("Unsupported tag",value); - } - } - } else if( gh_eq_p(value,gh_symbol2scm("victory-background")) ) { value=gh_car(list); list=gh_cdr(list); - ui->VictoryBackground.File=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("defeat-background")) ) { + } else if( gh_eq_p(value,gh_symbol2scm("panels")) ) { value=gh_car(list); list=gh_cdr(list); - ui->DefeatBackground.File=gh_scm2newstr(value,NULL); - } else if( gh_eq_p(value,gh_symbol2scm("menu-panels")) ) { - sublist=gh_car(list); - list=gh_cdr(list); - while( !gh_null_p(sublist) ) { - MenuPanel** menupanel; - - menupanel=&ui->MenuPanels; - while( *menupanel ) { - menupanel=&(*menupanel)->Next; - } - *menupanel=calloc(1,sizeof(**menupanel)); - value=gh_car(sublist); - sublist=gh_cdr(sublist); - (*menupanel)->Ident=gh_scm2newstr(value,NULL); - value=gh_car(sublist); - sublist=gh_cdr(sublist); - (*menupanel)->Panel.File=gh_scm2newstr(value,NULL); - } } else { errl("Unsupported tag",value); } } +#if 0 + // Filler 1 + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + free(ui->Filler1.File); + ui->Filler1.File=str; + ui->Filler1X=x; + ui->Filler1Y=y; + + // Resource + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + free(ui->Resource.File); + ui->Resource.File=str; + ui->ResourceX=x; + ui->ResourceY=y; + + // + // Parse icons + // + for( i=1; i<MaxCosts; ++i ) { + // icon + temp=gh_car(list); + list=gh_cdr(list); + + if( gh_null_p(temp) ) { + free(ui->Resources[i].Icon.File); + ui->Resources[i].Icon.File=NULL; + ui->Resources[i].Icon.Graphic=NULL; + ui->Resources[i].IconRow=0; + ui->Resources[i].IconX=0; + ui->Resources[i].IconY=0; + ui->Resources[i].IconW=0; + ui->Resources[i].IconH=0; + ui->Resources[i].TextX=0; + ui->Resources[i].TextY=0; + continue; + } + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->Resources[i].Icon.File); + ui->Resources[i].Icon.File=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Resources[i].IconRow=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Resources[i].IconX=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Resources[i].IconY=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Resources[i].IconW=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Resources[i].IconH=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Resources[i].TextX=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Resources[i].TextY=y; + } + + // Food icon + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->FoodIcon.File); + ui->FoodIcon.File=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + i=gh_scm2int(value); + ui->FoodIconRow=i; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->FoodIconX=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->FoodIconY=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->FoodIconW=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->FoodIconH=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->FoodTextX=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->FoodTextY=y; + + // Score icon + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ScoreIcon.File); + ui->ScoreIcon.File=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + i=gh_scm2int(value); + ui->ScoreIconRow=i; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->ScoreIconX=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->ScoreIconY=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->ScoreIconW=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->ScoreIconH=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->ScoreTextX=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->ScoreTextY=y; + + // InfoPanel + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + free(ui->InfoPanel.File); + ui->InfoPanel.File=str; + ui->InfoPanelX=x; + ui->InfoPanelY=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->InfoPanelW=x; + ui->InfoPanelH=y; + + // Completed bar + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + value=gh_car(temp); + temp=gh_cdr(temp); + i=gh_scm2int(value); + ui->CompleteBarColor=i; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->CompleteBarX=x; + ui->CompleteBarY=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->CompleteTextX=x; + ui->CompleteTextY=y; + + // ButtonPanel + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + free(ui->ButtonPanel.File); + ui->ButtonPanel.File=str; + ui->ButtonPanelX=x; + ui->ButtonPanelY=y; + + // The map + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->MapArea.X=x; + ui->MapArea.Y=y; + if ( ui->MapArea.X < 0 || ui->MapArea.Y < 0 ) { + fprintf(stderr,"map top-left point expected\n"); + return SCM_UNSPECIFIED; + } + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + //StephanR: note that the bottom-right point is one pixel off + ui->MapArea.EndX = x-1; + ui->MapArea.EndY = y-1; + if ( x < 1 || y < 1 || ui->MapArea.EndX < ui->MapArea.X || + ui->MapArea.EndY < ui->MapArea.Y ) { + fprintf(stderr,"map bottom-right point expected\n"); + return SCM_UNSPECIFIED; + } + + // MenuButton + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + free(ui->MenuButton.File); + ui->MenuButton.File=str; + ui->MenuButtonX=x; + ui->MenuButtonY=y; + + // Minimap + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + free(ui->Minimap.File); + ui->Minimap.File=str; + ui->MinimapX=x; + ui->MinimapY=y; + + // StatusLine + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + + free(ui->StatusLine.File); + ui->StatusLine.File=str; + ui->StatusLineX=x; + ui->StatusLineY=y; + + // Buttons + for( i=0; i<MaxButtons; ++i ) { + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Buttons[i].X=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Buttons[i].Y=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Buttons[i].Width=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Buttons[i].Height=y; + } + for( i=0; i<6; ++i ) { + temp=gh_car(list); + list=gh_cdr(list); + + if( !gh_list_p(temp) ) { + fprintf(stderr,"list expected\n"); + return SCM_UNSPECIFIED; + } + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Buttons2[i].X=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Buttons2[i].Y=y; + + value=gh_car(temp); + temp=gh_cdr(temp); + x=gh_scm2int(value); + ui->Buttons2[i].Width=x; + + value=gh_car(temp); + temp=gh_cdr(temp); + y=gh_scm2int(value); + ui->Buttons2[i].Height=y; + } + + // + // Get the cursors definitions. + // + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->Point.Name); + ui->Point.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->Glass.Name); + ui->Glass.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->Cross.Name); + ui->Cross.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->YellowHair.Name); + ui->YellowHair.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->GreenHair.Name); + ui->GreenHair.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->RedHair.Name); + ui->RedHair.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->Scroll.Name); + ui->Scroll.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowE.Name); + ui->ArrowE.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowNE.Name); + ui->ArrowNE.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowN.Name); + ui->ArrowN.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowNW.Name); + ui->ArrowNW.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowW.Name); + ui->ArrowW.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowSW.Name); + ui->ArrowSW.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowS.Name); + ui->ArrowS.Name=str; + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ArrowSE.Name); + ui->ArrowSE.Name=str; + + // + // Panels + // + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->GameMenuPanel.File); + ui->GameMenuPanel.File=str; + + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->Menu1Panel.File); + ui->Menu1Panel.File=str; + + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->Menu2Panel.File); + ui->Menu2Panel.File=str; + + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->VictoryPanel.File); + ui->VictoryPanel.File=str; + + temp=gh_car(list); + list=gh_cdr(list); + + value=gh_car(temp); + temp=gh_cdr(temp); + str=gh_scm2newstr(value,NULL); + free(ui->ScenarioPanel.File); + ui->ScenarioPanel.File=str; +#endif + return SCM_UNSPECIFIED; } @@ -1707,6 +2404,84 @@ local SCM CclDefineMenu(SCM list) return SCM_UNSPECIFIED; } +/** +** Define a menu item +** +** FIXME: need some general data structure to make this parsing easier. +** +** @param value Button type. +*/ +local MenuButtonId scm2buttonid(SCM value) +{ + MenuButtonId id; + + if ( gh_eq_p(value, gh_symbol2scm("main")) ) { + id=MBUTTON_MAIN; + } else if ( gh_eq_p(value, gh_symbol2scm("gm-half")) ) { + id=MBUTTON_GM_HALF; + } else if ( gh_eq_p(value, gh_symbol2scm("132")) ) { + id=MBUTTON_132; + } else if ( gh_eq_p(value, gh_symbol2scm("gm-full")) ) { + id=MBUTTON_GM_FULL; + } else if ( gh_eq_p(value, gh_symbol2scm("gem-round")) ) { + id=MBUTTON_GEM_ROUND; + } else if ( gh_eq_p(value, gh_symbol2scm("gem-square")) ) { + id=MBUTTON_GEM_SQUARE; + } else if ( gh_eq_p(value, gh_symbol2scm("up-arrow")) ) { + id=MBUTTON_UP_ARROW; + } else if ( gh_eq_p(value, gh_symbol2scm("down-arrow")) ) { + id=MBUTTON_DOWN_ARROW; + } else if ( gh_eq_p(value, gh_symbol2scm("left-arrow")) ) { + id=MBUTTON_LEFT_ARROW; + } else if ( gh_eq_p(value, gh_symbol2scm("right-arrow")) ) { + id=MBUTTON_RIGHT_ARROW; + } else if ( gh_eq_p(value, gh_symbol2scm("s-knob")) ) { + id=MBUTTON_S_KNOB; + } else if ( gh_eq_p(value, gh_symbol2scm("s-vcont")) ) { + id=MBUTTON_S_VCONT; + } else if ( gh_eq_p(value, gh_symbol2scm("s-hcont")) ) { + id=MBUTTON_S_HCONT; + } else if ( gh_eq_p(value, gh_symbol2scm("pulldown")) ) { + id=MBUTTON_PULLDOWN; + } else if ( gh_eq_p(value, gh_symbol2scm("vthin")) ) { + id=MBUTTON_VTHIN; + } else if ( gh_eq_p(value, gh_symbol2scm("folder")) ) { + id=MBUTTON_FOLDER; + } else if ( gh_eq_p(value, gh_symbol2scm("sc-gem-round")) ) { + id=MBUTTON_SC_GEM_ROUND; + } else if ( gh_eq_p(value, gh_symbol2scm("sc-gem-square")) ) { + id=MBUTTON_SC_GEM_SQUARE; + } else if ( gh_eq_p(value, gh_symbol2scm("sc-up-arrow")) ) { + id=MBUTTON_SC_UP_ARROW; + } else if ( gh_eq_p(value, gh_symbol2scm("sc-down-arrow")) ) { + id=MBUTTON_SC_DOWN_ARROW; + } else if ( gh_eq_p(value, gh_symbol2scm("sc-left-arrow")) ) { + id=MBUTTON_SC_LEFT_ARROW; + } else if ( gh_eq_p(value, gh_symbol2scm("sc-right-arrow")) ) { + id=MBUTTON_SC_RIGHT_ARROW; + } else if ( gh_eq_p(value, gh_symbol2scm("sc-s-knob")) ) { + id=MBUTTON_SC_S_KNOB; + } else if ( gh_eq_p(value, gh_symbol2scm("sc-s-vcont")) ) { + id=MBUTTON_SC_S_VCONT; + } else if ( gh_eq_p(value, gh_symbol2scm("sc-s-hcont")) ) { + id=MBUTTON_SC_S_HCONT; + } else if ( gh_eq_p(value, gh_symbol2scm("sc-pulldown")) ) { + id=MBUTTON_SC_PULLDOWN; + } else if ( gh_eq_p(value, gh_symbol2scm("sc-button-left")) ) { + id=MBUTTON_SC_BUTTON_LEFT; + } else if ( gh_eq_p(value, gh_symbol2scm("sc-button")) ) { + id=MBUTTON_SC_BUTTON; + } else if ( gh_eq_p(value, gh_symbol2scm("sc-button-right")) ) { + id=MBUTTON_SC_BUTTON_RIGHT; + } else { + char *s1=gh_scm2newstr(value, NULL); + fprintf(stderr, "Unsupported button %s\n", s1); + free(s1); + return 0; + } + return id; +} + local int scm2hotkey(SCM value) { char *s; @@ -2926,6 +3701,7 @@ global void UserInterfaceCclRegister(void) gh_new_procedureN("define-cursor",CclDefineCursor); gh_new_procedure1_0("set-game-cursor!",CclSetGameCursor); gh_new_procedureN("define-ui",CclDefineUI); + gh_new_procedureN("define-new-ui",CclDefineNewUI); gh_new_procedureN("define-viewports",CclDefineViewports); gh_new_procedure1_0("set-grab-mouse!", CclSetGrabMouse); diff --git a/src/ui/ui.cpp b/src/ui/ui.cpp index 5de0f8a95..163b5589e 100644 --- a/src/ui/ui.cpp +++ b/src/ui/ui.cpp @@ -39,7 +39,6 @@ #include "interface.h" #include "map.h" #include "ui.h" -#include "menus.h" /*---------------------------------------------------------------------------- -- Variables @@ -70,6 +69,7 @@ global UI** UI_Table; local void ClipViewport(Viewport* vp, int ClipX, int ClipY); local void FinishViewportModeConfiguration(Viewport new_vps[], int num_vps); + /** ** Initialize the user interface. ** @@ -146,6 +146,16 @@ global void InitUserInterface(const char *race_name) } else { SetViewportMode(VIEWPORT_SINGLE); } + + // FIXME: Can be removed after new config is working + if( !strcmp(race_name,"human") || !strcmp(race_name,"alliance") ) { + TheUI.NormalFontColor=strdup(FontWhite); + TheUI.ReverseFontColor=strdup(FontYellow); + } else { + TheUI.NormalFontColor=strdup(FontYellow); + TheUI.ReverseFontColor=strdup(FontWhite); + } + TheUI.ViewportCursorColor=ColorWhite; } /** @@ -163,14 +173,20 @@ global void LoadUserInterface(void) // // Load graphics // - for( i=0; i<TheUI.NumPanels; ++i ) { - if( TheUI.Panel[i].File ) { - TheUI.Panel[i].Graphic=LoadSprite(TheUI.Panel[i].File,0,0); + for( i=0; i<TheUI.NumFillers; ++i ) { + if( TheUI.Filler[i].File ) { + TheUI.Filler[i].Graphic=LoadGraphic(TheUI.Filler[i].File); #ifdef USE_OPENGL - MakeTexture(TheUI.Panel[i].Graphic,TheUI.Panel[i].Graphic->Width,TheUI.Panel[i].Graphic->Height); + MakeTexture(TheUI.Filler[i].Graphic,TheUI.Filler[i].Graphic->Width,TheUI.Filler[i].Graphic->Height); #endif } } + if( TheUI.Resource.File ) { + TheUI.Resource.Graphic=LoadGraphic(TheUI.Resource.File); +#ifdef USE_OPENGL + MakeTexture(TheUI.Resource.Graphic,TheUI.Resource.Graphic->Width,TheUI.Resource.Graphic->Height); +#endif + } for( i=0; i<MaxCosts; ++i ) { // FIXME: reuse same graphics? @@ -184,17 +200,17 @@ global void LoadUserInterface(void) } // FIXME: reuse same graphics? - if( TheUI.Resources[FoodCost].Icon.File ) { - TheUI.Resources[FoodCost].Icon.Graphic=LoadGraphic(TheUI.Resources[FoodCost].Icon.File); + if( TheUI.FoodIcon.File ) { + TheUI.FoodIcon.Graphic=LoadGraphic(TheUI.FoodIcon.File); #ifdef USE_OPENGL - MakeTexture(TheUI.Resources[FoodCost].Icon.Graphic,TheUI.Resources[FoodCost].Icon.Graphic->Width,TheUI.Resources[FoodCost].Icon.Graphic->Height); + MakeTexture(TheUI.FoodIcon.Graphic,TheUI.FoodIcon.Graphic->Width,TheUI.FoodIcon.Graphic->Height); #endif } // FIXME: reuse same graphics? - if( TheUI.Resources[ScoreCost].Icon.File ) { - TheUI.Resources[ScoreCost].Icon.Graphic=LoadGraphic(TheUI.Resources[ScoreCost].Icon.File); + if( TheUI.ScoreIcon.File ) { + TheUI.ScoreIcon.Graphic=LoadGraphic(TheUI.ScoreIcon.File); #ifdef USE_OPENGL - MakeTexture(TheUI.Resources[ScoreCost].Icon.Graphic,TheUI.Resources[ScoreCost].Icon.Graphic->Width,TheUI.Resources[ScoreCost].Icon.Graphic->Height); + MakeTexture(TheUI.ScoreIcon.Graphic,TheUI.ScoreIcon.Graphic->Width,TheUI.ScoreIcon.Graphic->Height); #endif } @@ -204,6 +220,30 @@ global void LoadUserInterface(void) MakeTexture(TheUI.InfoPanel.Graphic,TheUI.InfoPanel.Graphic->Width,TheUI.InfoPanel.Graphic->Height); #endif } + if( TheUI.ButtonPanel.File ) { + TheUI.ButtonPanel.Graphic=LoadGraphic(TheUI.ButtonPanel.File); +#ifdef USE_OPENGL + MakeTexture(TheUI.ButtonPanel.Graphic,TheUI.ButtonPanel.Graphic->Width,TheUI.ButtonPanel.Graphic->Height); +#endif + } + if( TheUI.MenuButton.File ) { + TheUI.MenuButton.Graphic=LoadGraphic(TheUI.MenuButton.File); +#ifdef USE_OPENGL + MakeTexture(TheUI.MenuButton.Graphic,TheUI.MenuButton.Graphic->Width,TheUI.MenuButton.Graphic->Height); +#endif + } + if( TheUI.Minimap.File ) { + TheUI.Minimap.Graphic=LoadGraphic(TheUI.Minimap.File); +#ifdef USE_OPENGL + MakeTexture(TheUI.Minimap.Graphic,TheUI.Minimap.Graphic->Width,TheUI.Minimap.Graphic->Height); +#endif + } + if( TheUI.StatusLine.File ) { + TheUI.StatusLine.Graphic=LoadGraphic(TheUI.StatusLine.File); +#ifdef USE_OPENGL + MakeTexture(TheUI.StatusLine.Graphic,TheUI.StatusLine.Graphic->Width,TheUI.StatusLine.Graphic->Height); +#endif + } // // Resolve cursors @@ -245,226 +285,235 @@ global void LoadUserInterface(void) ** @param file Save file handle ** @param ui User interface to save */ -local void SaveUi(FILE * file, const UI * ui) +local void OldSaveUi(FILE* file,const UI* ui) { int i; MenuPanel* menupanel; - fprintf(file, "(define-ui '%s %d %d", + fprintf(file,"(define-old-ui '%s %d %d\t; Selector\n", + ui->Name,ui->Width,ui->Height); + fprintf(file," ; Filler 1\n"); + fprintf(file," (list \"%s\" %d %d)\n", + ui->Filler[0].File,ui->FillerX[0],ui->FillerY[0]); + fprintf(file," ; Resource line\n"); + fprintf(file," (list \"%s\" %d %d)\n", + ui->Resource.File,ui->ResourceX,ui->ResourceY); + + for( i=1; i<MaxCosts; ++i ) { + fprintf(file," ; Resource %s\n",DefaultResourceNames[i]); + fprintf(file," (list \"%s\" %d\n %d %d %d %d %d %d)\n", + ui->Resources[i].Icon.File,ui->Resources[i].IconRow, + ui->Resources[i].IconX,ui->Resources[i].IconY, + ui->Resources[i].IconW,ui->Resources[i].IconH, + ui->Resources[i].TextX,ui->Resources[i].TextY); + } + fprintf(file," ; Food\n"); + fprintf(file," (list \"%s\" %d\n %d %d %d %d %d %d)\n", + ui->FoodIcon.File,ui->FoodIconRow, + ui->FoodIconX,ui->FoodIconY, + ui->FoodIconW,ui->FoodIconH, + ui->FoodTextX,ui->FoodTextY); + fprintf(file," ; Score\n"); + fprintf(file," (list \"%s\" %d\n %d %d %d %d %d %d)\n", + ui->ScoreIcon.File,ui->ScoreIconRow, + ui->ScoreIconX,ui->ScoreIconY, + ui->ScoreIconW,ui->ScoreIconH, + ui->ScoreTextX,ui->ScoreTextY); + + fprintf(file," ; Info panel\n"); + fprintf(file," (list \"%s\" %d %d %d %d)\n", + ui->InfoPanel.File, + ui->InfoPanelX,ui->InfoPanelY, + ui->InfoPanelW,ui->InfoPanelH); + + fprintf(file," ; Complete bar\n"); + fprintf(file," (list %d %d %d %d %d)\n", + ui->CompleteBarColor, + ui->CompleteBarX,ui->CompleteBarY, + ui->CompleteTextX,ui->CompleteTextY); + + fprintf(file," ; Button panel\n"); + fprintf(file," (list \"%s\" %d %d)\n", + ui->ButtonPanel.File,ui->ButtonPanelX,ui->ButtonPanelY); + + fprintf(file," ; The map area\n"); + fprintf(file," (list %d %d %d %d)\n", + ui->MapArea.X, ui->MapArea.Y, + ui->MapArea.EndX+1,ui->MapArea.EndY+1); + + fprintf(file," ; Menu button background\n"); + fprintf(file," (list \"%s\" %d %d)\n", + ui->MenuButton.File,ui->MenuButtonX,ui->MenuButtonY); + + fprintf(file," ; Minimap background\n"); + fprintf(file," (list \"%s\" %d %d)\n", + ui->Minimap.File,ui->MinimapX,ui->MinimapY); + + fprintf(file," ; Status line\n"); + fprintf(file," (list \"%s\" %d %d)\n", + ui->StatusLine.File,ui->StatusLineX,ui->StatusLineY); + + fprintf(file," ; Buttons\n"); + for( i=0; i<MaxButtons; ++i ) { + fprintf(file," (list %3d %3d %4d %3d)\n", + ui->Buttons[i].X,ui->Buttons[i].Y, + ui->Buttons[i].Width,ui->Buttons[i].Height); + } + + fprintf(file," ; Buttons II\n"); + for( i=0; i<6; ++i ) { + fprintf(file," (list %3d %3d %4d %3d)\n", + ui->Buttons2[i].X,ui->Buttons2[i].Y, + ui->Buttons2[i].Width,ui->Buttons2[i].Height); + } + + fprintf(file," ; Cursors\n"); + fprintf(file," (list"); + fprintf(file," '%s",ui->Point.Name); + fprintf(file," '%s",ui->Glass.Name); + fprintf(file," '%s\n",ui->Cross.Name); + fprintf(file," '%s",ui->YellowHair.Name); + fprintf(file," '%s",ui->GreenHair.Name); + fprintf(file," '%s\n",ui->RedHair.Name); + fprintf(file," '%s\n",ui->Scroll.Name); + + fprintf(file," '%s",ui->ArrowE.Name); + fprintf(file," '%s",ui->ArrowNE.Name); + fprintf(file," '%s",ui->ArrowN.Name); + fprintf(file," '%s\n",ui->ArrowNW.Name); + fprintf(file," '%s",ui->ArrowW.Name); + fprintf(file," '%s",ui->ArrowSW.Name); + fprintf(file," '%s",ui->ArrowS.Name); + fprintf(file," '%s)\n",ui->ArrowSE.Name); + + menupanel=ui->MenuPanels; + while( menupanel ) { + fprintf(file," (list \"%s\")\n",menupanel->Panel.File); + menupanel=menupanel->Next; + } + + fprintf(file," (list \"%s\")\n",ui->VictoryBackground.File); + fprintf(file," (list \"%s\")",ui->DefeatBackground.File); + + fprintf(file," )\n\n"); +} + +#if 0 +/** +** Save the UI structure. +** +** @param file Save file handle +** @param ui User interface to save +*/ +local void NewSaveUi(FILE * file, const UI * ui) +{ + int i; + + fprintf(file, "(define-ui '%s %d %d\t; Selector\n", ui->Name, ui->Width, ui->Height); - fprintf(file, "\n 'normal-font-color '%s\n 'reverse-font-color '%s", + fprintf(file, " 'normal-font-color '%s 'reverse-font-color '%s\n", ui->NormalFontColor, ui->ReverseFontColor); - fprintf(file, "\n"); - for( i=0; i<TheUI.NumPanels; ++i ) { - fprintf(file, "\n 'panel '(file \"%s\" pos (%d %d))", - ui->Panel[i].File, ui->PanelX[i], ui->PanelY[i]); + for( i=0; i<TheUI.NumFillers; ++i ) { + fprintf(file, " 'filler '(pos (%d %d) image \"%s\")\n", + ui->FillerX[i], ui->FillerY[i], ui->Filler[i].File); } - fprintf(file, "\n"); - fprintf(file, "\n 'resources '("); - for (i=1; i<MaxCosts; ++i) { + fprintf(file, " 'resources '(pos (%d %d) image \"%s\"", + ui->ResourceX, ui->ResourceY, ui->Resource.File); + for (i = 1; i < MaxCosts; ++i) { // FIXME: use slot 0 for time displays! - if( DefaultResourceNames[i] ) { - fprintf(file, "\n %s (", DefaultResourceNames[i]); - if( ui->Resources[i].Icon.File ) { - fprintf(file, "\n pos (%d %d) file \"%s\" row %d size (%d %d)", - ui->Resources[i].IconX, ui->Resources[i].IconY, - ui->Resources[i].Icon.File, - ui->Resources[i].IconRow, - ui->Resources[i].IconW, ui->Resources[i].IconH); - } - if( ui->Resources[i].TextX!=-1 ) { - fprintf(file, "\n text-pos (%d %d)", - ui->Resources[i].TextX, ui->Resources[i].TextY); - } - fprintf(file, ")"); - } - } - if( ui->Resources[FoodCost].Icon.File ) { - fprintf(file, "\n food ("); - fprintf(file, "\n pos (%d %d) file \"%s\" row %d size (%d %d)", - ui->Resources[FoodCost].IconX, ui->Resources[FoodCost].IconY, - ui->Resources[FoodCost].Icon.File, - ui->Resources[FoodCost].IconRow, - ui->Resources[FoodCost].IconW, ui->Resources[FoodCost].IconH); - if( ui->Resources[FoodCost].TextX!=-1 ) { - fprintf(file, "\n text-pos (%d %d)", - ui->Resources[FoodCost].TextX, ui->Resources[FoodCost].TextY); - } - fprintf(file, ")"); - } - if( ui->Resources[ScoreCost].Icon.File ) { - fprintf(file, "\n score ("); - fprintf(file, "\n pos (%d %d) file \"%s\" row %d size (%d %d)", - ui->Resources[ScoreCost].IconX, ui->Resources[ScoreCost].IconY, - ui->Resources[ScoreCost].Icon.File, - ui->Resources[ScoreCost].IconRow, - ui->Resources[ScoreCost].IconW, ui->Resources[ScoreCost].IconH); - if( ui->Resources[ScoreCost].TextX!=-1 ) { - fprintf(file, "\n text-pos (%d %d)", - ui->Resources[ScoreCost].TextX, ui->Resources[ScoreCost].TextY); - } - fprintf(file, ")"); + fprintf(file, "\n %s (icon-pos (%d %d) icon-file \"%s\"\n", + DefaultResourceNames[i], + ui->Resources[i].IconX, ui->Resources[i].IconY, + ui->Resources[i].Icon.File); + fprintf(file," icon-frame %d icon-size (%d %d) text-pos (%d %d))", + ui->Resources[i].IconRow, + ui->Resources[i].IconW, ui->Resources[i].IconH, + ui->Resources[i].TextX, ui->Resources[i].TextY); } + fprintf(file, "\n food (icon-pos (%d %d) icon-file \"%s\"\n", + ui->FoodIconX, ui->FoodIconY, ui->FoodIcon.File); + fprintf(file," icon-frame %d icon-size (%d %d) text-pos (%d %d))", + ui->FoodIconRow, + ui->FoodIconW, ui->FoodIconH, ui->FoodTextX, ui->FoodTextY); + fprintf(file, "\n score (icon-pos (%d %d) icon-file \"%s\"\n", + ui->ScoreIconX, ui->ScoreIconY, ui->ScoreIcon.File); + fprintf(file," icon-frame %d icon-size (%d %d) text-pos (%d %d))", + ui->ScoreIconRow, + ui->ScoreIconW, ui->ScoreIconH, ui->ScoreTextX, ui->ScoreTextY); fprintf(file, ")\n"); - fprintf(file, "\n 'map-area '(pos (%d %d) size (%d %d))", + fprintf(file, " 'info-panel '(pos (%d %d) image \"%s\"\n", + ui->InfoPanelX, ui->InfoPanelY, + ui->InfoPanel.File); + fprintf(file, " size (%d %d)\n", + ui->InfoPanelW, ui->InfoPanelH); + + fprintf(file, " complete-bar (color %d pos (%d %d) text-pos (%d %d)))\n", + ui->CompleteBarColor, + ui->CompleteBarX, ui->CompleteBarY, + ui->CompleteTextX, ui->CompleteTextY); + + fprintf(file, " 'button-panel '(pos (%d %d) image \"%s\")\n", + ui->ButtonPanelX, ui->ButtonPanelY, ui->ButtonPanel.File); + + fprintf(file, " 'map-area '(pos (%d %d) size (%d %d))\n", ui->MapArea.X, ui->MapArea.Y, ui->MapArea.EndX + 1, ui->MapArea.EndY + 1); - fprintf(file, "\n"); - fprintf(file, "\n 'info-area '("); - fprintf(file, "\n pos (%d %d)", - ui->InfoPanelX, ui->InfoPanelY); - if( ui->InfoPanel.File ) { - fprintf(file, "\n panel (file \"%s\" size (%d %d))", - ui->InfoPanel.File, ui->InfoPanelW, ui->InfoPanelH); + fprintf(file, " 'menu-button '(pos (%d %d) image \"%s\")\n", + ui->MenuButtonX, ui->MenuButtonY, ui->MenuButton.File); + + fprintf(file, " 'minimap '(pos (%d %d) image \"%s\" 'viewport-color %d)\n", + ui->MinimapX, ui->MinimapY, ui->Minimap.File, ui->ViewportCursorColor); + + fprintf(file, " 'status-line '(pos (%d %d) image \"%s\")\n", + ui->StatusLineX, ui->StatusLineY, ui->StatusLine.File); + + fprintf(file, "; 0 Menu 1-9 Info 10-19 Button\n"); + fprintf(file, " 'buttons '("); + for (i = 0; i < MaxButtons; ++i) { + fprintf(file, "\n (pos (%3d %3d) size (%4d %3d))", + ui->Buttons[i].X, ui->Buttons[i].Y, + ui->Buttons[i].Width, ui->Buttons[i].Height); } - fprintf(file, "\n neutral-frame %d", - ui->InfoPanelNeutralFrame); - fprintf(file, "\n selected-frame %d", - ui->InfoPanelSelectedFrame); - fprintf(file, "\n magic-frame %d", - ui->InfoPanelMagicFrame); - fprintf(file, "\n construction-frame %d", - ui->InfoPanelConstructionFrame); - fprintf(file, "\n completed-bar ("); - fprintf(file, "\n color %d", ui->CompleteBarColor); - fprintf(file, "\n pos (%d %d)", ui->CompleteBarX, ui->CompleteBarY); - fprintf(file, "\n size (%d %d)", ui->CompleteBarW, ui->CompleteBarH); - fprintf(file, "\n text \"%s\"", ui->CompleteBarText); - fprintf(file, "\n font %s", FontNames[ui->CompleteBarFont]); - fprintf(file, "\n text-pos (%d %d)", - ui->CompleteTextX, ui->CompleteTextY); - fprintf(file, ")"); - if( ui->NumInfoButtons ) { - fprintf(file, "\n buttons ("); - for( i=0; i<ui->NumInfoButtons; ++i ) { - fprintf(file, "\n (pos (%3d %3d) size (%3d %3d))", - ui->InfoButtons[i].X, ui->InfoButtons[i].Y, - ui->InfoButtons[i].Width, ui->InfoButtons[i].Height); - } - fprintf(file, ")"); + + fprintf(file, ")\n; 0-5 Training\n"); + fprintf(file, " 'buttons-2 '("); + for (i = 0; i < 6; ++i) { + fprintf(file, "\n (pos (%3d %3d) size (%4d %3d))", + ui->Buttons2[i].X, ui->Buttons2[i].Y, + ui->Buttons2[i].Width, ui->Buttons2[i].Height); } - if( ui->NumTrainingButtons ) { - fprintf(file, "\n buttons ("); - for( i=0; i<ui->NumTrainingButtons; ++i ) { - fprintf(file, "\n (pos (%3d %3d) size (%3d %3d))", - ui->TrainingButtons[i].X, ui->TrainingButtons[i].Y, - ui->TrainingButtons[i].Width, ui->TrainingButtons[i].Height); - } - fprintf(file, ")"); - } - fprintf(file, ")\n"); - fprintf(file, "\n 'button-area '("); - if( ui->NumButtonButtons ) { - fprintf(file, "\n buttons ("); - for( i=0; i<ui->NumButtonButtons; ++i ) { - fprintf(file, "\n (pos (%3d %3d) size (%3d %3d))", - ui->ButtonButtons[i].X, ui->ButtonButtons[i].Y, - ui->ButtonButtons[i].Width, ui->ButtonButtons[i].Height); - } - fprintf(file, ")"); - } - fprintf(file, ")\n"); + fprintf(file, ")\n 'cursors '(point %s\n", ui->Point.Name); + fprintf(file, " glass %s\n", ui->Glass.Name); + fprintf(file, " cross %s\n", ui->Cross.Name); + fprintf(file, " yellow %s\n", ui->YellowHair.Name); + fprintf(file, " green %s\n", ui->GreenHair.Name); + fprintf(file, " red %s\n", ui->RedHair.Name); + fprintf(file, " scroll %s\n", ui->Scroll.Name); - fprintf(file, "\n 'minimap-area '("); - fprintf(file, "\n pos (%d %d)", - ui->MinimapX, ui->MinimapY); - fprintf(file, "\n size (%d %d)", - ui->MinimapW, ui->MinimapH); - fprintf(file, "\n cursor-color %d", - ui->MinimapCursorColor); - fprintf(file, ")\n"); + fprintf(file, " arrow-e %s\n", ui->ArrowE.Name); + fprintf(file, " arrow-ne %s\n", ui->ArrowNE.Name); + fprintf(file, " arrow-n %s\n", ui->ArrowN.Name); + fprintf(file, " arrow-nw %s\n", ui->ArrowNW.Name); + fprintf(file, " arrow-w %s\n", ui->ArrowW.Name); + fprintf(file, " arrow-sw %s\n", ui->ArrowSW.Name); + fprintf(file, " arrow-s %s\n", ui->ArrowS.Name); + fprintf(file, " arrow-se %s)\n", ui->ArrowSE.Name); - fprintf(file, "\n 'status-line '("); - fprintf(file, "\n font %s", - FontNames[ui->StatusLineFont]); - fprintf(file, "\n pos (%d %d)", - ui->StatusLineX, ui->StatusLineY); - fprintf(file, "\n width %d", - ui->StatusLineW); - fprintf(file, ")\n"); - - fprintf(file, "\n 'menu-button '("); - fprintf(file, "\n pos (%d %d)", - ui->MenuButton.X, ui->MenuButton.Y); - fprintf(file, "\n size (%d %d)", - ui->MenuButton.Width, ui->MenuButton.Height); - fprintf(file, "\n caption \"%s\"", - ui->MenuButton.Text); - fprintf(file, "\n style %s", - MenuButtonStyle(ui->MenuButton.Button)); - fprintf(file, ")"); - - fprintf(file, "\n 'network-menu-button '("); - fprintf(file, "\n pos (%d %d)", - ui->NetworkMenuButton.X, ui->NetworkMenuButton.Y); - fprintf(file, "\n size (%d %d)", - ui->NetworkMenuButton.Width, ui->NetworkMenuButton.Height); - fprintf(file, "\n caption \"%s\"", - ui->NetworkMenuButton.Text); - fprintf(file, "\n style %s", - MenuButtonStyle(ui->NetworkMenuButton.Button)); - fprintf(file, ")"); - - fprintf(file, "\n 'network-diplomacy-button '("); - fprintf(file, "\n pos (%d %d)", - ui->NetworkDiplomacyButton.X, ui->NetworkDiplomacyButton.Y); - fprintf(file, "\n size (%d %d)", - ui->NetworkDiplomacyButton.Width, ui->NetworkDiplomacyButton.Height); - fprintf(file, "\n caption \"%s\"", - ui->NetworkDiplomacyButton.Text); - fprintf(file, "\n style %s", - MenuButtonStyle(ui->NetworkDiplomacyButton.Button)); - fprintf(file, ")\n"); - - fprintf(file, "\n 'message-area '("); - fprintf(file, "\n font %s", FontNames[ui->MessageAreaFont]); - fprintf(file, "\n pos (%d %d)", - ui->MessageAreaX, ui->MessageAreaY); - fprintf(file, "\n width %d", ui->MessageAreaW); - fprintf(file, ")\n"); - - fprintf(file, "\n 'cursors '("); - fprintf(file, "\n point %s", ui->Point.Name); - fprintf(file, "\n glass %s", ui->Glass.Name); - fprintf(file, "\n cross %s", ui->Cross.Name); - fprintf(file, "\n yellow %s", ui->YellowHair.Name); - fprintf(file, "\n green %s", ui->GreenHair.Name); - fprintf(file, "\n red %s", ui->RedHair.Name); - fprintf(file, "\n scroll %s", ui->Scroll.Name); - - fprintf(file, "\n arrow-e %s", ui->ArrowE.Name); - fprintf(file, "\n arrow-ne %s", ui->ArrowNE.Name); - fprintf(file, "\n arrow-n %s", ui->ArrowN.Name); - fprintf(file, "\n arrow-nw %s", ui->ArrowNW.Name); - fprintf(file, "\n arrow-w %s", ui->ArrowW.Name); - fprintf(file, "\n arrow-sw %s", ui->ArrowSW.Name); - fprintf(file, "\n arrow-s %s", ui->ArrowS.Name); - fprintf(file, "\n arrow-se %s", ui->ArrowSE.Name); - fprintf(file, ")\n"); - - fprintf(file, "\n 'victory-background \"%s\"", - ui->VictoryBackground.File); - fprintf(file, "\n 'defeat-background \"%s\"", - ui->DefeatBackground.File); - fprintf(file, "\n"); - - fprintf(file, "\n 'menu-panels '("); - menupanel=ui->MenuPanels; - while( menupanel ) { - fprintf(file,"\n %s \"%s\"", - menupanel->Ident, menupanel->Panel.File); - menupanel=menupanel->Next; - } - fprintf(file, ")"); + fprintf(file, " 'panels '(game-menu \"%s\"\n", ui->GameMenuPanel.File); + fprintf(file, " menu-1 \"%s\"\n", ui->Menu1Panel.File); + fprintf(file, " menu-2 \"%s\"\n", ui->Menu2Panel.File); + fprintf(file, " victory \"%s\"\n", ui->VictoryPanel.File); + fprintf(file, " scenario \"%s\")", ui->ScenarioPanel.File); fprintf(file, " )\n\n"); } +#endif /** ** Save the viewports. @@ -514,7 +563,8 @@ global void SaveUserInterface(FILE* file) TheUI.OriginalResources ? "#t" : "#f"); // Save the current UI - SaveUi(file,&TheUI); + OldSaveUi(file,&TheUI); + // NewSaveUi(file,&TheUI); SaveViewports(file,&TheUI); } @@ -531,17 +581,22 @@ global void CleanUserInterface(void) // // Free the graphics. FIXME: if they are shared this will crash. // - for( i=0; i<TheUI.NumPanels; ++i ) { - VideoSaveFree(TheUI.Panel[i].Graphic); + for( i=0; i<TheUI.NumFillers; ++i ) { + VideoSaveFree(TheUI.Filler[i].Graphic); } + VideoSaveFree(TheUI.Resource.Graphic); for( i=0; i<MaxCosts; ++i ) { VideoSaveFree(TheUI.Resources[i].Icon.Graphic); } - VideoSaveFree(TheUI.Resources[FoodCost].Icon.Graphic); - VideoSaveFree(TheUI.Resources[ScoreCost].Icon.Graphic); + VideoSaveFree(TheUI.FoodIcon.Graphic); + VideoSaveFree(TheUI.ScoreIcon.Graphic); VideoSaveFree(TheUI.InfoPanel.Graphic); + VideoSaveFree(TheUI.ButtonPanel.Graphic); + VideoSaveFree(TheUI.MenuButton.Graphic); + VideoSaveFree(TheUI.Minimap.Graphic); + VideoSaveFree(TheUI.StatusLine.Graphic); menupanel=TheUI.MenuPanels; while( menupanel ) { diff --git a/src/video/font.cpp b/src/video/font.cpp index 06a65f89c..b13aae11e 100644 --- a/src/video/font.cpp +++ b/src/video/font.cpp @@ -97,22 +97,6 @@ local int FontBitmapWidths[MaxFonts]; local int CurrentFont; #endif -/** -** FIXME: should use the names of the real fonts. -*/ -global char *FontNames[] = { - "small", - "game", - "large", - "small-title", - "large-title", - "user1", - "user2", - "user3", - "user4", - "user5", -}; - /*---------------------------------------------------------------------------- -- Functions ----------------------------------------------------------------------------*/