|
|
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 - metrics - downloadIndex: B T
Length: 19072 (0x4a80)
Types: TextFile
Names: »B«
└─⟦85b835f43⟧ Bits:30000549 8mm tape, Rational 1000, Xlib rev 6.00
└─⟦0c20f784e⟧ »DATA«
└─⟦1abbe589f⟧
└─⟦306851c02⟧
└─⟦this⟧
with Text_Io;
with Puz_Puzzle;
use Puz_Puzzle;
with Xlbt_Arithmetic;
use Xlbt_Arithmetic;
with Xlbt_Atom_Defs;
use Xlbt_Atom_Defs;
with Xlbt_Basic;
use Xlbt_Basic;
with Xlbt_Color;
use Xlbt_Color;
with Xlbt_Event;
use Xlbt_Event;
with Xlbt_Event2;
use Xlbt_Event2;
with Xlbt_Font;
use Xlbt_Font;
with Xlbt_Hint;
use Xlbt_Hint;
with Xlbt_Gc;
use Xlbt_Gc;
with Xlbt_Geometry;
use Xlbt_Geometry;
with Xlbt_Graphics;
use Xlbt_Graphics;
with Xlbt_Key;
use Xlbt_Key;
with Xlbt_Pointer;
use Xlbt_Pointer;
with Xlbt_Rm;
use Xlbt_Rm;
with Xlbt_String;
use Xlbt_String;
with Xlbt_Visual;
use Xlbt_Visual;
with Xlbt_Window;
use Xlbt_Window;
with Xlbp_Bitmap;
use Xlbp_Bitmap;
with Xlbp_Color;
use Xlbp_Color;
with Xlbp_Cursor;
use Xlbp_Cursor;
with Xlbp_Display;
use Xlbp_Display;
with Xlbp_Event;
use Xlbp_Event;
with Xlbp_Font;
use Xlbp_Font;
with Xlbp_Gc;
use Xlbp_Gc;
with Xlbp_Geometry;
use Xlbp_Geometry;
with Xlbp_Graphics;
use Xlbp_Graphics;
with Xlbp_Hint;
use Xlbp_Hint;
with Xlbp_Rm;
use Xlbp_Rm;
with Xlbp_Sync;
use Xlbp_Sync;
with Xlbp_Text;
use Xlbp_Text;
with Xlbp_Window;
use Xlbp_Window;
with Xlbp_Window_Information;
use Xlbp_Window_Information;
with Xlbp_Window_Property;
use Xlbp_Window_Property;
package body Puz_Main is
------------------------------------------------------------------------------
-- Originally: main.c
------------------------------------------------------------------------------
-- Puzzle - (C) Copyright 1987, 1988 Don Bennett.
--
-- Permission to use, copy, modify, and distribute this software and its
-- documentation for any purpose and without fee is hereby granted,
-- provided that the above copyright notice appear in all copies and that
-- both that copyright notice and this permission notice appear in
-- supporting documentation.
------------------------------------------------------------------------------
Server_Bug : constant Boolean := True;
Geb_Server_Bug : constant Boolean := True;
------------------------------------------------------------------------------
-- Puzzle
--
-- Don Bennett, HP Labs
--
-- this is the interface code for the puzzle program.
------------------------------------------------------------------------------
------------------------------------------------------------------------------
-- #include "ac.cursor"
------------------------------------------------------------------------------
Ac_Width : constant := 16;
Ac_Height : constant := 16;
Ac_X_Hot : constant := 8;
Ac_Y_Hot : constant := 8;
Ac_Bits : constant U_Char_Array :=
(16#00#, 16#00#, 16#80#, 16#01#, 16#C0#, 16#03#, 16#E0#, 16#07#,
16#80#, 16#01#, 16#88#, 16#11#, 16#8C#, 16#31#, 16#FE#, 16#7F#,
16#FE#, 16#7F#, 16#8C#, 16#31#, 16#88#, 16#11#, 16#80#, 16#01#,
16#E0#, 16#07#, 16#C0#, 16#03#, 16#80#, 16#01#, 16#00#, 16#00#);
------------------------------------------------------------------------------
-- #include "ac_mask"
------------------------------------------------------------------------------
Ac_Mask_Width : constant := 16;
Ac_Mask_Height : constant := 16;
Ac_Mask_Bits : constant U_Char_Array :=
(16#C0#, 16#03#, 16#C0#, 16#03#, 16#E0#, 16#07#, 16#F0#, 16#0F#,
16#E8#, 16#17#, 16#DC#, 16#3B#, 16#FF#, 16#FF#, 16#FF#, 16#FF#,
16#FF#, 16#FF#, 16#FF#, 16#FF#, 16#DC#, 16#3B#, 16#E8#, 16#17#,
16#F0#, 16#0F#, 16#E0#, 16#07#, 16#C0#, 16#03#, 16#C0#, 16#03#);
Terminate_Program : exception;
Puzzle_Border_Width : constant := 2;
Title_Window_Height : constant := 25;
C_Boundary_Height : constant := 3;
C_Box_Width : constant := 10;
C_Box_Height : constant := 10;
Min_Tile_Height : constant := 32;
Min_Tile_Width : constant := 32;
Max_Steps : constant := 1000;
Default_Speed : constant := 2;
First_Call : Boolean := True;
type Title_Method is (Title_Tiles, Title_Text, Title_Animated);
Box_Width : S_Long := C_Box_Width;
Box_Height : S_Long := C_Box_Height;
Tile_Height : S_Long;
Tile_Width : S_Long;
Text_X_Start : S_Long;
Title_Win_Height : S_Long;
Boundary_Height : S_Long;
Tile_Win_Height : S_Long;
Fg_Pixel : X_Pixel;
Bg_Pixel : X_Pixel;
type Window_Geom is
record
Root : X_Window;
X : S_Long;
Y : S_Long;
Width : S_Long;
Height : S_Long;
Border_Width : S_Long;
Depth : S_Long;
end record;
Puzzle_Win_Info : Window_Geom;
Puzzle_Root : X_Window;
Title_Window : X_Window := None_X_Window;
Tile_Window : X_Window;
Scramble_Window : X_Window;
Solve_Window : X_Window;
Title_Font_Name : constant X_String := "fixed-screen-r-13";
Tile_Font_Name : constant X_String := "fixed-screen-b-13";
Title_Font_Info : X_Font_Struct;
Tile_Font_Info : X_Font_Struct;
Puzzle_On_Top : Boolean := True;
Use_Display : Boolean := False;
type S_Short_Array is array (S_Natural range <>) of S_Short;
Tiles_Per_Second : S_Natural;
Move_Steps : S_Natural;
Vert_Step_Size : U_Short_Array (0 .. Max_Steps - 1);
Hori_Step_Size : U_Short_Array (0 .. Max_Steps - 1);
Old_Height : S_Long := S_Long (U_Short'Last);
Old_Width : S_Long := S_Long (U_Short'Last);
function Indx (X, Y : S_Long) return S_Long is
-- #define indx(x,y) (((y)*Puzzle_Width) + (x))
begin
return Y * Puzzle_Width + X;
end Indx;
function Is_Digit (X : Character) return Boolean is
-- #define isdigit(x) ((x)>= '0' && (x) <= '9')
begin
return X in '0' .. '9';
end Is_Digit;
function Ulx (X, Y : S_Long) return S_Long is
-- #define ulx(x,y) ((x)*Tile_Width)
begin
return X * Tile_Width;
end Ulx;
function Llx (X, Y : S_Long) return S_Long is
-- #define llx(x,y) ((x)*Tile_Width)
begin
return X * Tile_Width;
end Llx;
function Urx (X, Y : S_Long) return S_Long is
-- #define urx(x,y) (((x)+1)*Tile_Width - 1)
begin
return (X + 1) * Tile_Width - 1;
end Urx;
function Lrx (X, Y : S_Long) return S_Long is
-- #define lrx(x,y) (((x)+1)*Tile_Width - 1)
begin
return (X + 1) * Tile_Width - 1;
end Lrx;
function Uly (X, Y : S_Long) return S_Long is
-- #define uly(x,y) ((y)*Tile_Height)
begin
return Y * Tile_Height;
end Uly;
function Ury (X, Y : S_Long) return S_Long is
-- #define ury(x,y) ((y)*Tile_Height)
begin
return Y * Tile_Height;
end Ury;
function Lly (X, Y : S_Long) return S_Long is
-- #define lly(x,y) (((y)+1)*Tile_Height - 1)
begin
return (Y + 1) * Tile_Height - 1;
end Lly;
function Lry (X, Y : S_Long) return S_Long is
-- #define lry(x,y) (((y)+1)*Tile_Height - 1)
begin
return (Y + 1) * Tile_Height - 1;
end Lry;
function Max (A, B : S_Long) return S_Long is
begin
if A > B then
return A;
else
return B;
end if;
end Max;
function Min (A, B : S_Long) return S_Long is
begin
if A < B then
return A;
else
return B;
end if;
end Min;
--\f
------------------------------------------------------------------------------
-- PuzzlePending - XPending entry point for the other module.
------------------------------------------------------------------------------
function Puzzle_Pending return S_Natural is
begin
return X_Pending (Dpy);
end Puzzle_Pending;
--\f
------------------------------------------------------------------------------
-- SetupDisplay - eastablish the connection to the X server.
------------------------------------------------------------------------------
procedure Setup_Display (Server : X_String) is
Error : X_Error_String;
Env : constant X_String :=
X_Display_Name (Server);
begin
X_Open_Display (Env, Dpy, Error);
if "=" (Dpy, None_X_Display) then
Text_Io.Put_Line ("Unable to open display: " & To_String (Server) &
": " & To_String (Err (Error)));
raise Program_Error;
end if;
Screen := X_Default_Screen (Dpy);
end Setup_Display;
--\f
procedure X_Query_Window (Window : X_Window;
Frame : in out Window_Geom) is
Succ : X_Status;
begin
X_Get_Geometry (Dpy, Window.Drawable, Frame.Root,
S_Short (Frame.X), S_Short (Frame.Y),
U_Short (Frame.Width), U_Short (Frame.Height),
U_Short (Frame.Border_Width),
U_Char (Frame.Depth),
Succ);
end X_Query_Window;
--\f
procedure Rect_Set (W : X_Window;
X : S_Long;
Y : S_Long;
Width : S_Long;
Height : S_Long;
Pixel : X_Pixel) is
begin
X_Set_Foreground (Dpy, Rect_Gc, Pixel);
X_Fill_Rectangle (Dpy, W.Drawable, Rect_Gc, S_Short (X),
S_Short (Y), U_Short (Width), U_Short (Height));
end Rect_Set;
--\f
procedure Move_Area (W : X_Window;
Src_X : S_Long;
Src_Y : S_Long;
Dst_X : S_Long;
Dst_Y : S_Long;
Width : S_Long;
Height : S_Long) is
begin
X_Copy_Area (Dpy, W.Drawable, W.Drawable, Gc, S_Short (Src_X),
S_Short (Src_Y), U_Short (Width), U_Short (Height),
S_Short (Dst_X), S_Short (Dst_Y));
end Move_Area;
--\f
----RepaintTitle - puts the program title in the title bar
procedure Repaint_Title (Method : Title_Method) is separate;
--\f
------------------------------------------------------------------------------
-- RepaintBar - Repaint the bar between the title window and
-- the tile window;
------------------------------------------------------------------------------
procedure Repaint_Bar is
Pixel : X_Pixel;
begin
X_Fill_Rectangle (Dpy, Puzzle_Root.Drawable, Gc,
0, S_Short (Title_Win_Height),
U_Short (Puzzle_Win_Info.Width),
U_Short (Boundary_Height));
end Repaint_Bar;
--\f
------------------------------------------------------------------------------
-- RepaintTiles - draw the numbers in the tiles to match the
-- locations array;
------------------------------------------------------------------------------
procedure Repaint_Number_Tiles;
procedure Repaint_Tiles is
begin
Repaint_Number_Tiles;
end Repaint_Tiles;
--\f
procedure Repaint_Number_Tiles is separate;
--\f
------------------------------------------------------------------------------
-- Setup - Perform initial window creation, etc.
------------------------------------------------------------------------------
procedure Setup (Display : X_String; Geometry : X_String) is separate;
--\f
function Sizechanged return Boolean is
begin
X_Query_Window (Puzzle_Root, Puzzle_Win_Info);
if Puzzle_Win_Info.Width = Old_Width and then
Puzzle_Win_Info.Height = Old_Height then
return False;
else
return True;
end if;
end Sizechanged;
--\f
procedure Calculate_Speed;
procedure Calculate_Stepsize;
procedure Reset is separate;
--\f
------------------------------------------------------------------------------
-- Sets the global variable Move_Steps based on speed
-- specified on the command line;
------------------------------------------------------------------------------
procedure Calculate_Speed is separate;
--\f
procedure Calculate_Stepsize is
Remain : S_Long;
Sum : S_Long;
Error : S_Long;
begin
Sum := Tile_Height / Move_Steps;
Remain := Tile_Height rem Move_Steps;
for I in 0 .. Move_Steps - 1 loop
Vert_Step_Size (I) := U_Short (Sum);
if Remain > 0 then
Vert_Step_Size (I) := Vert_Step_Size (I) + 1;
Remain := Remain - 1;
end if;
end loop;
Sum := Tile_Width / Move_Steps;
Remain := Tile_Width rem Move_Steps;
for I in 0 .. Move_Steps - 1 loop
Hori_Step_Size (I) := U_Short (Sum);
if Remain > 0 then
Hori_Step_Size (I) := Hori_Step_Size (I) + 1;
Remain := Remain - 1;
end if;
end loop;
end Calculate_Stepsize;
--\f
procedure Reset_Logging;
procedure Save_Logging_State;
procedure Slide_Pieces (Event : X_Event) is
X : S_Long;
Y : S_Long;
begin
X := S_Long (Event.Button.X) / Tile_Width;
Y := S_Long (Event.Button.Y) / Tile_Height;
if X = Space_X or else Y = Space_Y then
Move_Space_To (Indx (X, Y));
end if;
Flush_Logging;
end Slide_Pieces;
--\f
procedure Process_Visibility (Event : X_Event) is
begin
if "=" (Event.Visibility.State, Visibility_Unobscured) then
Puzzle_On_Top := True;
else
Puzzle_On_Top := False;
Abort_Solving;
end if;
end Process_Visibility;
--\f
procedure Process_Expose (Event : in out X_Event) is separate;
--\f
procedure Process_Button (Event : X_Event) is
W : X_Window;
begin
W := Event.Window;
if "=" (W, Tile_Window) then
if Solving_Status then
Abort_Solving;
else
Slide_Pieces (Event);
end if;
elsif "=" (W, Scramble_Window) then
Abort_Solving;
Scramble;
Repaint_Tiles;
elsif "=" (W, Solve_Window) then
Solve;
elsif "=" (W, Title_Window) and then
"=" (Event.Button.Button, Button_2) then
raise Terminate_Program;
end if;
end Process_Button;
--\f
procedure Get_Next_Event (Event : in out X_Event);
procedure Process_Event (Event : in out X_Event);
procedure Process_Input is
Event : X_Event;
begin
loop
Get_Next_Event (Event);
Process_Event (Event);
end loop;
end Process_Input;
--\f
procedure Process_Events is
Event : X_Event;
begin
while X_Pending (Dpy) /= 0 loop
Get_Next_Event (Event);
Process_Event (Event);
end loop;
end Process_Events;
--\f
procedure Get_Next_Event (Event : in out X_Event) is
Succ : X_Status;
begin
X_Check_Mask_Event
(Dpy, (Visibility_Change_Mask => True, others => False),
Event, Succ);
if Succ = Failed then
X_Check_Mask_Event
(Dpy, (Exposure_Mask => True, others => False), Event, Succ);
if Succ = Failed then
X_Next_Event (Dpy, Event);
end if;
end if;
end Get_Next_Event;
--\f
procedure Process_Event (Event : in out X_Event) is
begin
case Event.Kind is
when Button_Press =>
if not Puzzle_On_Top then
X_Raise_Window (Dpy, Puzzle_Root);
X_Put_Back_Event (Dpy, Event);
else
Process_Button (Event);
end if;
when Expose =>
Process_Expose (Event);
when Visibility_Notify =>
Process_Visibility (Event);
when others =>
null;
end case;
end Process_Event;
--\f
procedure Figure_Puzzle_Size (Size : String) is separate;
--\f
procedure Main (Display : X_String := "";
Geometry : X_String := "";
Size : String := "";
Speed : Natural := 0;
New_Colormap : Boolean := False) is separate;
--\f
------------------------------------------------------------------------------
-- Output Routines -
------------------------------------------------------------------------------
procedure Display_Log_Move_Space (First_X, First_Y, Last_X, Last_Y : S_Long;
Dir : Direction);
procedure Reset_Logging is
begin
null;
end Reset_Logging;
procedure Flush_Logging is
begin
null;
end Flush_Logging;
procedure Save_Logging_State is
begin
null;
end Save_Logging_State;
procedure Log_Move_Space
(First_X, First_Y, Last_X, Last_Y : S_Long; Dir : Direction) is
begin
Display_Log_Move_Space (First_X, First_Y, Last_X, Last_Y, Dir);
end Log_Move_Space;
-- #ifdef UNDEFINED
-- /** this stuff really isn't worth it; **/
--
-- static int prevDir := -1;
-- static int prevFirstX, prevFirstY, prevLastX, prevLastY;
--
-- resetLogging()
-- {
-- prevDir := -1;
-- }
--
-- flushLogging()
-- {
-- if (prevDir !:= -1)
-- displayLogMoveSpace(prevFirstX,prevFirstY,prevLastX,prevLastY,prevDir);
-- prevDir := -1;
-- }
--
-- saveLoggingState(fx,fy,lx,ly,dir)
-- int fx,fy,lx,ly,dir;
-- {
-- prevDir := dir;
-- prevFirstX := fx;
-- prevFirstY := fy;
-- prevLastX := lx;
-- prevLastY := ly;
-- }
--
-- LogMoveSpace(first_x,first_y,last_x,last_y,dir)
-- int first_x,first_y,last_x,last_y,dir;
-- {
-- if (prevDir = -1)
-- /** we don't already have something to move **/
-- saveLoggingState(first_x,first_y,last_x,last_y,dir);
-- else if (prevDir = dir) {
-- /** we're going in the same direction **/
-- prevLastX := last_x;
-- prevLastY := last_y;
-- }
-- else {
-- flushLogging();
-- saveLoggingState(first_x,first_y,last_x,last_y,dir);
-- }
-- }
-- #endif /* UNDEFINED */
procedure Display_Log_Move_Space (First_X, First_Y, Last_X, Last_Y : S_Long;
Dir : Direction) is separate;
end Puz_Main;