DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ B T ┃
Length: 43711 (0xaabf) Types: TextFile Names: »B«
└─⟦85b835f43⟧ Bits:30000549 8mm tape, Rational 1000, Xlib rev 6.00 └─ ⟦0c20f784e⟧ »DATA« └─⟦1abbe589f⟧ └─⟦306851c02⟧ └─⟦this⟧
with Text_Io; with Board; use Board; with Draw; use Draw; with Main; use Main; with Xlbt_Arithmetic; use Xlbt_Arithmetic; with Xlbt_Basic; use Xlbt_Basic; with Xlbt_Event; use Xlbt_Event; with Xlbt_Graphics; use Xlbt_Graphics; with Xlbt_String; use Xlbt_String; with Xlbp_Event; use Xlbp_Event; with Xlbp_Graphics; use Xlbp_Graphics; with Xlbp_Keyboard_Control; use Xlbp_Keyboard_Control; with Xlbp_Proc_Var; use Xlbp_Proc_Var; with Xlbp_Sync; use Xlbp_Sync; with Xlbmp_Environment; use Xlbmp_Environment; package body Button is ----------------------------------------------------------------------------- -- Dragon - a version of Mah-Jongg for X Windows -- -- Author: Gary E. Barnes March 1989 -- -- Button - Deals with the command buttons on the board ------------------------------------------------------------------------------ -- 04/24/89 GEB - When "Other" pressed, if "Samples" is on then turn it off -- - before changing button menus. -- 05/30/90 GEB - Translate to Ada ------------------------------------------------------------------------------ type Action_Enum is (Call_Null, Call_New_Game, Call_Restart_Game, Call_Save_Game, Call_Other, Call_Hints, Call_Restore_Game, Call_Game_Exit, Call_Redraw_All, Call_Sides, Call_Show_Samples, Call_Cheat, Call_Sync_All); type Button_Rec is record Text : X_String_Pointer; Action : Action_Enum; Toggle : Boolean; Hilite : Boolean; X : S_Short; Y : S_Short; Text_X : S_Short; Text_Y : S_Short; Border : X_Point_Array (0 .. 6 * 4 + 4 + 1); end record; type Button is access Button_Rec; N_Buttons : constant := 8; type Button_Array is array (S_Natural range 0 .. N_Buttons - 1) of Button; type Button_2d_Array is array (S_Natural range 1 .. 2) of Button_Array; Other_Button : constant := 3; Samples_Button : constant := 2; All_Buttons_Array : Button_2d_Array := ((new Button_Rec'(new X_String'("New Game"), Call_New_Game, False, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'("Restart"), Call_Restart_Game, False, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'("Save"), Call_Save_Game, False, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'("Other"), Call_Other, True, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'("Hint"), Call_Hints, False, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'(""), Call_Null, False, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'("Restore"), Call_Restore_Game, False, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'("Quit"), Call_Game_Exit, False, False, 0, 0, 0, 0, (others => (0, 0)))), (new Button_Rec'(new X_String'("Redraw"), Call_Redraw_All, False, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'("Sides"), Call_Sides, False, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'("Samples"), Call_Show_Samples, True, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'("Other"), Call_Other, True, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'("Cheat"), Call_Cheat, True, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'("Sync"), Call_Sync_All, True, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'(""), Call_Null, False, False, 0, 0, 0, 0, (others => (0, 0))), new Button_Rec'(new X_String'(""), Call_Null, False, False, 0, 0, 0, 0, (others => (0, 0))))); All_Buttons : S_Long := 1; Buttons1 : Button_Array renames All_Buttons_Array (1); Buttons2 : Button_Array renames All_Buttons_Array (2); Button_Width : S_Short := 0; Button_Height : S_Short := 0; Letter_Indent : S_Short := 0; Letter_Height : S_Short := 0; Letter_Width : S_Short := 0; Onoff : Boolean := False; procedure New_Game (Event : X_Button_Press_Event); procedure Restore_Game (Event : X_Button_Press_Event); --\f procedure Call (What : Action_Enum; Event : X_Button_Press_Event) is begin case What is when Call_Null => raise Program_Error; when Call_New_Game => New_Game (Event); when Call_Restart_Game => Restart_Game (Event); when Call_Save_Game => Save_Game (Event); when Call_Other => Other (Event); when Call_Hints => Hints (Event); when Call_Restore_Game => Restore_Game (Event); when Call_Game_Exit => Game_Exit (Event); when Call_Redraw_All => Redraw_All (Event); when Call_Sides => Sides (Event); when Call_Show_Samples => Show_Samples (Event); when Call_Cheat => Cheat (Event); when Call_Sync_All => Sync_All (Event); end case; end Call; --\f procedure Cheat (Event : X_Button_Press_Event) is begin Cheating := not Cheating; end Cheat; --\f procedure Game_Exit (Event : X_Button_Press_Event) is ------------------------------------------------------------------------------ -- Called when we want to exit. ------------------------------------------------------------------------------ Event2 : X_Event; begin loop X_Next_Event (Dpy, Event2); if Event2.Kind = Xlbt_Event.Button_Release then exit; end if; end loop; raise Quit; end Game_Exit; --\f procedure New_Game (Event : X_Button_Press_Event) is begin Setup_New_Game; X_Clear_Area (Dpy, Main.Board, 0, 0, 0, 0, True); end New_Game; --\f procedure Other (Event : X_Button_Press_Event) is ------------------------------------------------------------------------------ -- Called to change button menus. ------------------------------------------------------------------------------ Expose : X_Expose_Event; begin if All_Buttons = 1 then All_Buttons := 2; else -- --Turn off Samples mode if we are changing menus. if Buttons2 (Samples_Button).Hilite then Call ((Buttons2 (Samples_Button).Action), Event); Buttons2 (Samples_Button).Hilite := False; end if; All_Buttons := 1; end if; All_Buttons_Array (All_Buttons) (Other_Button).Hilite := not All_Buttons_Array (All_Buttons) (Other_Button).Hilite; X_Clear_Area (Dpy, Main.Board, 0, 0, 0, U_Short (2 * Tile_Height - Side_Y - Shadow_Y - 1), False); Button_Expose; end Other; --\f procedure Redraw_All (Event : X_Button_Press_Event) is begin X_Clear_Area (Dpy, Main.Board, 0, 0, 0, 0, True); end Redraw_All; --\f procedure Restore_Game (Event : X_Button_Press_Event) is ------------------------------------------------------------------------------ -- Called to restore a previous game. ------------------------------------------------------------------------------ --/ if R1000 then Name : constant X_String := X_Env_Concat_Dir_File (X_Env_Get_Home_Dir, "dragon_save"); --/ else --// Name : constant X_String := --// X_Env_Concat_Dir_File (X_Env_Get_Home_Dir, ".dragon-save"); --/ end if; File : Text_Io.File_Type; begin begin Text_Io.Open (File, Text_Io.In_File, To_String (Name)); exception when others => Text_Io.Put_Line ("Cannot open the " & To_String (Name) & " file for reading."); X_Bell (Dpy, 100); return; end; Read_Game (File); Text_Io.Close (File); Redraw_All (Event); end Restore_Game; --\f procedure Save_Game (Event : X_Button_Press_Event) is ------------------------------------------------------------------------------ -- Called to save the current game. ------------------------------------------------------------------------------ --/ if R1000 then Name : constant X_String := X_Env_Concat_Dir_File (X_Env_Get_Home_Dir, "dragon_save"); --/ else --// Name : constant X_String := --// X_Env_Concat_Dir_File (X_Env_Get_Home_Dir, ".dragon-save"); --/ end if; File : Text_Io.File_Type; begin begin Text_Io.Open (File, Text_Io.Out_File, To_String (Name)); exception when others => begin Text_Io.Create (File, Text_Io.Out_File, To_String (Name)); exception when others => Text_Io.Put_Line ("Cannot open the " & To_String (Name) & " file for writing."); X_Bell (Dpy, 100); return; end; end; Write_Game (File); Text_Io.Close (File); end Save_Game; --\f procedure Sides (Event : X_Button_Press_Event) is begin if (Tile_Control and Shadow) /= 0 then if (Tile_Control and Blackside) /= 0 then if (Tile_Control and Grayside) /= 0 then Tile_Control := Tile_Control and not (Shadow or Blackside or Grayside); else Tile_Control := Tile_Control and not Shadow; Tile_Control := Tile_Control or Grayside; end if; else Tile_Control := Tile_Control and not Shadow; Tile_Control := Tile_Control or Blackside; end if; else Tile_Control := Tile_Control or Shadow; end if; X_Clear_Area (Dpy, Main.Board, 0, 0, 0, 0, True); end Sides; -- \f procedure Sync_All (Event : X_Button_Press_Event) is Void : Proc_Var_X_Synchandler.Pv; begin Onoff := not Onoff; Dragon_Resources.Debug := Onoff; Void := X_Synchronize (Dpy, Onoff); end Sync_All; --\f procedure Do_Button_Configuration is ------------------------------------------------------------------------------ -- Called when the Board changes Tile sizes. ------------------------------------------------------------------------------ Buttons_Per_Line : constant := 4; Indent : S_Short; X, Dx : S_Short; Y, Dy : S_Short; I, J : S_Short; F, S, T : S_Short; L : S_Short; Pnti : S_Natural; But : Button; procedure Pnt (X, Y : S_Short) is begin But.Border (Pnti).X := X; But.Border (Pnti).Y := Y; Pnti := Pnti + 1; end Pnt; begin ----Buttons will be three tiles wide and 2/3'rd of a tile high. Button_Width := 3 * Tile_Width; Dx := Button_Width + Tile_Width / 2; Button_Height := 5 * Tile_Height / 9; Dy := Tile_Height * 8 / 10; ----Letters are as large as can fit within the buttons. Indent := Button_Height / 5; Letter_Indent := Indent + 2; S := Letter_Indent * 3 / 4; T := S / 2; F := Indent - S + T; Letter_Height := Button_Height - (2 * Indent) - 2; if (Letter_Height rem 2) = 0 then Letter_Height := Letter_Height - 1; end if; Letter_Width := (Button_Width - (2 * Indent) - 2) / 8 - 2; if (Letter_Width rem 2) = 0 then Letter_Width := Letter_Width - 1; end if; ----Now place the buttons. for J in S_Natural range 1 .. 2 loop X := Indent + 12; Y := Indent + 4; for I in All_Buttons_Array (J)'Range loop But := All_Buttons_Array (J) (I); if But.Text.all = "" then goto Next_Button; end if; L := But.Text'Length; if L > 8 then Text_Io.Put_Line ("Button name too long: " & To_String (But.Text.all)); L := 8; end if; But.X := X; But.Y := Y; But.Text_X := (Button_Width - L * (Letter_Width + 2) + 2) / 2; But.Text_Y := Indent + 1; Pnti := 0; Pnt (X, Y + Indent); Pnt (F, 0); Pnt (0, -S); Pnt (-T, 0); Pnt (0, T); Pnt (S, 0); Pnt (0, -F); Pnt (Button_Width - 2 * Indent, 0); Pnt (0, F); Pnt (S, 0); Pnt (0, -T); Pnt (-T, 0); Pnt (0, S); Pnt (F, 0); Pnt (0, Button_Height - 2 * Indent); Pnt (-F, 0); Pnt (0, S); Pnt (T, 0); Pnt (0, -T); Pnt (-S, 0); Pnt (0, F); Pnt (-(Button_Width - 2 * Indent), 0); Pnt (0, -F); Pnt (-S, 0); Pnt (0, T); Pnt (T, 0); Pnt (0, -S); Pnt (-F, 0); Pnt (0, -Button_Height + 2 * Indent); <<Next_Button>> null; if I rem Buttons_Per_Line + 1 = Buttons_Per_Line then X := Indent + 12; Y := Y + Dy; else X := X + Dx; end if; end loop; end loop; end Do_Button_Configuration; --\f procedure Draw_Text (Str : X_String; Px : S_Short; Py : S_Short) is ------------------------------------------------------------------------------ -- Called to draw the vector text in some button. ------------------------------------------------------------------------------ X : S_Short := Px; Y : S_Short := Py; Pnts : X_Point_Array (0 .. 49); Pnti : S_Long; H1 : S_Short; W1 : S_Short; procedure Pnt (X, Y : S_Short) is begin Pnts (Pnti).X := X; Pnts (Pnti).Y := Y; Pnti := Pnti + 1; end Pnt; begin ----Position ourselves for the first letter. H1 := Letter_Height - 1; W1 := Letter_Width - 1; ----Loop over all letters in the text. for Stri in Str'Range loop Pnti := 0; case Str (Stri) is ----The letters we have. when '0' => declare W6, H6, H26 : S_Short; begin H6 := H1 / 6; H26 := H1 - 4 * H6; W6 := W1 / 6; Pnt (X, Y + H6 + H6); Pnt (0, H26); Pnt (W6, H6); Pnt (W6, H6); Pnt (W1 - 4 * W6, 0); Pnt (W6, -H6); Pnt (W6, -H6); Pnt (0, -H26); Pnt (-W6, -H6); Pnt (-W6, -H6); Pnt (-(W1 - 4 * W6), 0); Pnt (-W6, H6); Pnt (-W6, H6); end; when '1' => Pnt (X + (W1 + 1) / 2, Y); Pnt (0, H1); when '2' => declare W6, W46, H6, H6r : S_Short; begin W6 := W1 / 6; W46 := W1 - W6 - W6; H6 := H1 / 6; H6r := (H1 - H6 * 6) / 2; Pnt (X, Y + H6); Pnt (W6, -H6); Pnt (W46, 0); Pnt (W6, H6); Pnt (0, H6 + H6r); Pnt (-W6, H6); Pnt (-W46, 0); Pnt (-W6, H6); Pnt (0, H1 - 5 * H6 - H6r); Pnt (0, H6); Pnt (W1, 0); end; when '3' => declare W6, W46, H6, H6r : S_Short; begin W6 := W1 / 6; W46 := W1 - W6 - W6; H6 := H1 / 6; H6r := (H1 - H6 * 6) / 2; Pnt (X, Y + H6); Pnt (W6, -H6); Pnt (W46, 0); Pnt (W6, H6); Pnt (0, H6 + H6r); Pnt (-W6, H6); Pnt (-W46 / 2, 0); Pnt (W46 / 2, 0); Pnt (W6, H6); Pnt (0, H1 - 5 * H6 - H6r); Pnt (-W6, H6); Pnt (-W46, 0); Pnt (-W6, -H6); end; when '4' => declare W23, H23 : S_Short; begin W23 := W1 * 2 / 3; H23 := H1 * 2 / 3; Pnt (X + W1, Y + H23); Pnt (-W1, 0); Pnt (W23, -H23); Pnt (0, H1); end; when '5' => declare W6, W46, H6, H6r : S_Short; begin W6 := W1 / 6; W46 := W1 - W6 - W6; H6 := H1 / 6; H6r := (H1 - H6 * 6) / 2; Pnt (X + W1, Y); Pnt (-W1, 0); Pnt (0, H1 - 3 * H6 - H6r); Pnt (W1 - W6, 0); Pnt (W6, H6); Pnt (0, H6 + H6r); Pnt (-W6, H6); Pnt (-W46, 0); Pnt (-W6, -H6); end; when '6' => declare W6, W46, H6, H6r : S_Short; begin W6 := W1 / 6; W46 := W1 - W6 - W6; H6 := H1 / 6; if ((H6 - W6) rem 2) = 1 then H6 := H6 - 1; end if; H6r := (H1 - H6 * 6) / 2; Pnt (X + W1, Y + H6); Pnt (-W6, -H6); Pnt (-W46, 0); Pnt (-W6, H6); Pnt (0, H1 - 2 * H6); Pnt (W6, H6); Pnt (W46, 0); Pnt (W6, -H6); Pnt (0, -H6 - H6r); Pnt (-W6, -H6); Pnt (-W46, 0); Pnt (-W6, H6); end; when '7' => Pnt (X, Y); Pnt (W1, 0); Pnt (-W1, H1); when '8' => declare W6, W46, H6, H6r : S_Short; begin W6 := W1 / 6; W46 := W1 - W6 - W6; H6 := H1 / 6; if ((H6 - W6) rem 2) = 1 then H6 := H6 - 1; end if; H6r := (H1 - H6 * 6) / 2; Pnt (X + W1, Y + H6); Pnt (-W6, -H6); Pnt (-W46, 0); Pnt (-W6, H6); Pnt (0, H6 + H6r); Pnt (W6, H6); Pnt (W46, 0); Pnt (W6, H6); Pnt (0, H1 - 5 * H6 - H6r); Pnt (-W6, H6); Pnt (-W46, 0); Pnt (-W6, -H6); Pnt (0, -H1 + 5 * H6 + H6r); Pnt (W6, -H6); Pnt (W46, 0); Pnt (W6, -H6); Pnt (0, -H6 - H6r); end; when '9' => declare W6, W46, H6, H6r : S_Short; begin W6 := W1 / 6; W46 := W1 - W6 - W6; H6 := H1 / 6; H6r := (H1 - H6 * 6) / 2; Pnt (X, Y + H1 - H6); Pnt (W6, H6); Pnt (W46, 0); Pnt (W6, -H6); Pnt (0, -H1 + 2 * H6); Pnt (-W6, -H6); Pnt (-W46, 0); Pnt (-W6, H6); Pnt (0, H6 + H6r); Pnt (W6, H6); Pnt (W46, 0); Pnt (W6, -H6); end; when 'a' | 'A' => declare H2, W2, W5l, W5r : S_Short; begin H2 := H1 * 12 / 20; W2 := (W1 + 1) / 2; W5l := W1 / 5; W5r := W1 - W5l; Pnt (X, Y + H1); Pnt (W5l, -(H1 - H2)); Pnt (W5r - W5l, 0); Pnt (W2 - W5r, -H2); Pnt (W5l - W2, H2); Pnt (W5r - W5l, 0); Pnt (W5l, H1 - H2); end; when 'b' | 'B' => declare W6, H6 : S_Short; H2 : S_Short; begin H2 := (H1 + 1) / 2; W6 := W1 / 6; H6 := H1 / 6; Pnt (X, Y + H1); Pnt (0, -H1); Pnt (W1 - W6, 0); Pnt (W6, H6); Pnt (0, H2 - H6 - H6); Pnt (-W6, H6); Pnt (-(W1 - W6), 0); Pnt (W1 - W6, 0); Pnt (W6, H6); Pnt (0, H1 - H2 - H6 - H6); Pnt (-W6, H6); Pnt (-(W1 - W6), 0); end; when 'c' | 'C' => declare W6, W46, H6, H46 : S_Short; begin W6 := W1 / 6; W46 := W1 - W6 - W6; H6 := H1 / 6; H46 := H1 - H6 - H6; Pnt (X + W1, Y + H6); Pnt (-W6, -H6); Pnt (-W46, 0); Pnt (-W6, H6); Pnt (0, H46); Pnt (W6, H6); Pnt (W46, 0); Pnt (W6, -H6); end; when 'd' | 'D' => declare W6, W56, H6, H46 : S_Short; begin W6 := W1 / 6; W56 := W1 - W6; H6 := H1 / 6; H46 := H1 - H6 - H6; Pnt (X, Y); Pnt (W56, 0); Pnt (W6, H6); Pnt (0, H46); Pnt (-W6, H6); Pnt (-W56, 0); Pnt (0, -H1); end; when 'e' | 'E' => declare H2, W2 : S_Short; begin H2 := (H1 + 1) / 2; W2 := (W1 + 1) / 2; Pnt (X + W1, Y); Pnt (-W1, 0); Pnt (0, H2); Pnt (W2, 0); Pnt (-W2, 0); Pnt (0, H1 - H2); Pnt (W1, 0); end; when 'f' | 'F' => declare H2, W2 : S_Short; begin H2 := (H1 + 1) / 2; W2 := (W1 + 1) / 2; Pnt (X + W1, Y); Pnt (-W1, 0); Pnt (0, H2); Pnt (W2, 0); Pnt (-W2, 0); Pnt (0, H1 - H2); end; when 'g' | 'G' => declare W6, W46, H6, H46 : S_Short; begin W6 := W1 / 6; W46 := W1 - W6 - W6; H6 := H1 / 6; H46 := H1 - H6 - H6; Pnt (X + W1, Y + H6); Pnt (-W6, -H6); Pnt (-W46, 0); Pnt (-W6, H6); Pnt (0, H46); Pnt (W6, H6); Pnt (W46, 0); Pnt (W6, -H6); Pnt (0, H6 - (H1 + 1) / 2); Pnt (-(W1 + 1) / 2, 0); end; when 'h' | 'H' => declare H2 : S_Short := (H1 + 1) / 2; begin Pnt (X, Y); Pnt (0, H1); Pnt (0, -H2); Pnt (W1, 0); Pnt (0, H2); Pnt (0, -H1); end; when 'i' | 'I' => declare W2 : S_Short := (W1 + 1) / 2; begin Pnt (X, Y); Pnt (W1, 0); Pnt (-W2, 0); Pnt (0, H1); Pnt (-W2, 0); Pnt (W1, 0); end; when 'k' | 'K' => declare H2 : S_Short := (H1 + 1) / 2; begin Pnt (X, Y); Pnt (0, H1); Pnt (0, -H2); Pnt (W1, -(H1 - H2)); Pnt (-W1, H1 - H2); Pnt (W1, H2); end; when 'l' | 'L' => Pnt (X, Y); Pnt (0, H1); Pnt (W1, 0); when 'm' | 'M' => declare W2 : S_Short := (W1 + 1) / 2; begin Pnt (X, Y + H1); Pnt (0, -H1); Pnt (W2, H1); Pnt (W1 - W2, -H1); Pnt (0, H1); end; when 'n' | 'N' => Pnt (X, Y + H1); Pnt (0, -H1); Pnt (W1, H1); Pnt (0, -H1); when 'o' | 'O' => declare W6, W46, H6, H46 : S_Short; begin W6 := W1 / 6; W46 := W1 - W6 - W6; H6 := H1 / 6; H46 := H1 - H6 - H6; Pnt (X + W1, Y + H6); Pnt (-W6, -H6); Pnt (-W46, 0); Pnt (-W6, H6); Pnt (0, H46); Pnt (W6, H6); Pnt (W46, 0); Pnt (W6, -H6); Pnt (0, -H46); end; when 'p' | 'P' => declare W6, H6 : S_Short; H2 : S_Short; begin H2 := (H1 + 1) / 2; W6 := W1 / 6; H6 := H1 / 6; Pnt (X, Y + H1); Pnt (0, -H1); Pnt (W1 - W6, 0); Pnt (W6, H6); Pnt (0, H2 - H6 - H6); Pnt (-W6, H6); Pnt (-(W1 - W6), 0); end; when 'q' | 'Q' => declare W6, W46, H6, H46 : S_Short; begin W6 := W1 / 6; W46 := W1 - W6 - W6; H6 := H1 / 6; H46 := H1 - H6 - H6; Pnt (X + W1, Y + H6); Pnt (-W6, -H6); Pnt (-W46, 0); Pnt (-W6, H6); Pnt (0, H46); Pnt (W6, H6); Pnt (W46, 0); Pnt (-W6 - W6, -H6); Pnt (W6 + W6, H6); Pnt (W6, H6); Pnt (-W6, -H6); Pnt (W6, -H6); Pnt (0, -H46); end; when 'r' | 'R' => declare W6, H6 : S_Short; H2 : S_Short; begin H2 := (H1 + 1) / 2; W6 := W1 / 6; H6 := H1 / 6; Pnt (X, Y + H1); Pnt (0, -H1); Pnt (W1 - W6, 0); Pnt (W6, H6); Pnt (0, H2 - H6 - H6); Pnt (-W6, H6); Pnt (-(W1 - W6), 0); Pnt (W1 - W6, 0); Pnt (W6, H2); end; when 's' | 'S' => declare W6, W46, H6, H6r : S_Short; begin W6 := W1 / 6; W46 := W1 - W6 - W6; H6 := H1 / 6; H6r := (H1 - H6 * 6) / 2; Pnt (X + W1, Y + H6); Pnt (-W6, -H6); Pnt (-W46, 0); Pnt (-W6, H6); Pnt (0, H6 + H6r); Pnt (W6, H6); Pnt (W46, 0); Pnt (W6, H6); Pnt (0, H6 + H6r); Pnt (-W6, H6); Pnt (-W46, 0); Pnt (-W6, -H6); end; when 't' | 'T' => declare W2 : S_Short := (W1 + 1) / 2; begin Pnt (X, Y); Pnt (W1, 0); Pnt (-W2, 0); Pnt (0, H1); end; when 'u' | 'U' => declare W6, H6, H56 : S_Short; begin W6 := W1 / 6; H6 := H1 / 6; H56 := H1 - H6; Pnt (X, Y); Pnt (0, H56); Pnt (W6, H6); Pnt (W1 - W6 - W6, 0); Pnt (W6, -H6); Pnt (0, -H56); end; when 'v' | 'V' => declare W2 : S_Short; begin W2 := (W1 + 1) / 2; Pnt (X, Y); Pnt (W2, H1); Pnt (W1 - W2, -H1); end; when 'w' | 'W' => declare W4, W2 : S_Short; begin W4 := W1 / 4; W2 := (W1 + 1) / 2; Pnt (X, Y); Pnt (W4, H1); Pnt (W2 - W4, -H1); Pnt (W1 - W2 - W4, H1); Pnt (W4, -H1); end; when 'y' | 'Y' => declare H2, W2 : S_Short; begin H2 := (H1 + 1) / 2; W2 := (W1 + 1) / 2; Pnt (X, Y); Pnt (W2, H2); Pnt (W1 - W2, -H2); Pnt (-(W1 - W2), H2); Pnt (-W2, H1 - H2); end; ----Letters we don't have, and also blank. when others => null; -- do nothing end case; ----Draw the letter. if Pnti > 0 then X_Draw_Lines (Dpy, Main.Board.Drawable, Normal_Gc, Pnts (0 .. Pnti - 1), Coord_Mode_Previous); end if; X := X + Letter_Width + 2; end loop; end Draw_Text; --\f procedure Draw_Score (Score : S_Long; Px : S_Short; Py : S_Short) is ------------------------------------------------------------------------------ -- Called to draw the score at x/y. ------------------------------------------------------------------------------ X : S_Short := Px; Y : S_Short := Py; Scr : X_String (1 .. 4); W : S_Short := (Letter_Width + 2) * 3 + 4; H : S_Short := Letter_Height + 6; I, Lx, Ly : S_Short; begin if Score = 0 then Letter_Height := Letter_Height * 3; Letter_Width := Letter_Width * 3; Lx := Board_Width / 6; Ly := Board_Height / 2 - 2 * Letter_Height; for I in reverse 1 .. 5 loop Draw_Text ("You Win", Lx, Ly); Lx := Lx + 2 * Letter_Width + 2; Ly := Ly + Letter_Height + 5; end loop; Letter_Height := Letter_Height / 3; Letter_Width := Letter_Width / 3; end if; Y := Y - H + 2; X_Fill_Rectangle (Dpy, Main.Board.Drawable, Reverse_Gc, X, Y, U_Short (W), U_Short (H)); X_Draw_Rectangle (Dpy, Main.Board.Drawable, Normal_Gc, X - 2, Y - 2, U_Short (W + 4), U_Short (H + 4)); X_Draw_Rectangle (Dpy, Main.Board.Drawable, Normal_Gc, X - 1, Y - 1, U_Short (W + 2), U_Short (H + 2)); X_Draw_Rectangle (Dpy, Main.Board.Drawable, Normal_Gc, X, Y, U_Short (W), U_Short (H)); if Score > 99 then Scr (1) := X_Character'Val (X_Character'Pos ('0') + Score / 100); else Scr (1) := ' '; end if; if Score > 9 then Scr (2) := X_Character'Val (X_Character'Pos ('0') + Score / 10 rem 10); else Scr (2) := ' '; end if; Scr (3) := X_Character'Val (X_Character'Pos ('0') + Score rem 10); Scr (4) := X_Character'Val (8#000#); Draw_Text (Scr, X + 3, Y + 3); end Draw_Score; --\f procedure Hilite (But : Button) is ------------------------------------------------------------------------------ -- Xor the hilite pattern on the button indicated. ------------------------------------------------------------------------------ begin X_Fill_Rectangle (Dpy, Main.Board.Drawable, Xor_Gc, But.X + 1, But.Y + 1, U_Short (Button_Width - 1), U_Short (Button_Height - 1)); end Hilite; --\f procedure Button_Expose is ------------------------------------------------------------------------------ -- Called when the Board receives an Expose event. ------------------------------------------------------------------------------ begin ----Loop over all buttons and display all "real" buttons. for I in All_Buttons_Array (All_Buttons)'Range loop if All_Buttons_Array (All_Buttons) (I).Text.all = "" then goto Continue; end if; ----Clear the space for the button and then draw the outline. X_Fill_Rectangle (Dpy, Main.Board.Drawable, Reverse_Gc, All_Buttons_Array (All_Buttons) (I).X, All_Buttons_Array (All_Buttons) (I).Y, U_Short (Button_Width + 1), U_Short (Button_Height + 1)); X_Draw_Lines (Dpy, Main.Board.Drawable, Normal_Gc, All_Buttons_Array (All_Buttons) (I).Border, Coord_Mode_Previous); ----Draw the text of the button and then do hiliting if we need it. Draw_Text (All_Buttons_Array (All_Buttons) (I).Text.all, All_Buttons_Array (All_Buttons) (I).X + All_Buttons_Array (All_Buttons) (I).Text_X, All_Buttons_Array (All_Buttons) (I).Y + All_Buttons_Array (All_Buttons) (I).Text_Y); if All_Buttons_Array (All_Buttons) (I).Hilite then Hilite (All_Buttons_Array (All_Buttons) (I)); end if; <<Continue>> null; end loop; end Button_Expose; --\f procedure De_Hilite_All is ------------------------------------------------------------------------------ -- Called to take the hilite off of any and all buttons everywhere. ------------------------------------------------------------------------------ begin for I in All_Buttons_Array (All_Buttons)'Range loop if All_Buttons_Array (All_Buttons) (I).Text.all = "" then goto Continue; end if; if All_Buttons_Array (All_Buttons) (I).Hilite and then not All_Buttons_Array (All_Buttons) (I).Toggle then All_Buttons_Array (All_Buttons) (I).Hilite := False; Hilite (All_Buttons_Array (All_Buttons) (I)); X_Flush (Dpy); end if; <<Continue>> null; end loop; end De_Hilite_All; --\f procedure Button_Press (Event : X_Button_Press_Event) is ------------------------------------------------------------------------------ -- Called when the Board receives a BtnDown event. ------------------------------------------------------------------------------ begin ----First we make sure that nobody is hilited. De_Hilite_All; ----See if some button just got clicked. for I in All_Buttons_Array (All_Buttons)'Range loop if All_Buttons_Array (All_Buttons) (I).Text.all = "" then goto Continue; end if; if Event.Button.X >= All_Buttons_Array (All_Buttons) (I).X and then Event.Button.X <= All_Buttons_Array (All_Buttons) (I).X + Button_Width and then Event.Button.Y >= All_Buttons_Array (All_Buttons) (I).Y and then Event.Button.Y <= All_Buttons_Array (All_Buttons) (I).Y + Button_Height then ----Hilite this button and then do whatever it is supposed to do. All_Buttons_Array (All_Buttons) (I).Hilite := not All_Buttons_Array (All_Buttons) (I).Hilite; Hilite (All_Buttons_Array (All_Buttons) (I)); X_Flush (Dpy); Call (All_Buttons_Array (All_Buttons) (I).Action, Event); exit; end if; <<Continue>> null; end loop; end Button_Press; --\f procedure Button_Release (Event : X_Button_Release_Event) is ------------------------------------------------------------------------------ -- Called when the Board receives a BtnUp event. ------------------------------------------------------------------------------ begin ----Turn off any and all button hilites. De_Hilite_All; end Button_Release; --\f end Button;