|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 16143 (0x3f0f)
Types: TextFile
Names: »board.mod.pas«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Pm/Apollo/board.mod.pas«
MODULE pacman_board;
{ Written January, 1985 by Geoffrey Cooper }
{ program for creating a pacman board
needed improvements:
- ability to save a board for later re-editing
- ability to better define size of board - middle button?
- ability to set SDOTS as well as dots.}
{ Copyright (C) 1985, IMAGEN Corporation }
{ This software may be duplicated in part of in whole so long as [1] this }
{ notice is preserved in the copy, and [2] no financial gain is derived }
{ from the copy. Copies of this software other than as restricted above }
{ may be made only with the consent of the author. }
%include '/sys/ins/base.ins.pas';
%include '/sys/ins/error.ins.pas';
%include '/sys/ins/kbd.ins.pas';
%include '/sys/ins/gpr.ins.pas';
%include '/sys/ins/vfmt.ins.pas';
%include '/sys/ins/pgm.ins.pas';
%include '/sys/ins/pad.ins.pas';
DEFINE
board_$init, board_$reinit,
board_$get_num_dots, board_$draw_board, board_$try_pac_position,
board_$can_turn, board_$clear_dot, board_$show_score;
%include 'fig.ins.pas';
%include 'board.ins.pas';
CONST
board_width_x = 31;
board_width_y = 34;
halfguage = guage div 2;
score_x = guage;
score_y = (board_width_y+1) * guage;
pac_x = guage;
pac_y = score_y + 16;
TYPE
board_$config = array [0..board_width_x-1, 0..board_width_y-1]
of board_$elt;
VAR
wall_bm : gpr_$bitmap_desc_t;
dot_bm : gpr_$bitmap_desc_t;
sdot_bm : gpr_$bitmap_desc_t;
board_numdcor: integer;
board_numscor: integer;
score : integer;
numpacs : integer;
w : gpr_$window_t;
status : status_$t;
board : board_$config;
board_init : board_$config := [
[ wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall],
[ wall, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, wall],
[ wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, wall, wall, dcor, wall],
[ wall, dcor, dcor, dcor, wall, dcor, dcor, dcor, wall, dcor, dcor, dcor, wall, dcor, dcor, dcor, wall, dcor, dcor, dcor, wall, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, wall, wall, dcor, wall],
[ wall, dcor, wall, dcor, wall, dcor, wall, dcor, wall, dcor, wall, dcor, wall, dcor, wall, dcor, wall, dcor, wall, dcor, wall, dcor, wall, wall, wall, wall, wall, wall, dcor, dcor, wall, wall, dcor, wall],
[ wall, dcor, wall, dcor, dcor, dcor, wall, dcor, dcor, dcor, wall, dcor, dcor, dcor, wall, dcor, dcor, dcor, wall, dcor, dcor, dcor, wall, dcor, dcor, dcor, dcor, dcor, dcor, dcor, wall, wall, dcor, wall],
[ wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, wall, dcor, scor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, wall, wall, dcor, wall],
[ wall, dcor, wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, wall, wall, dcor, wall, wall, wall, dcor, wall, wall, wall, dcor, wall, wall, dcor, wall],
[ wall, dcor, wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, wall, wall, dcor, wall, wall, wall, wall, wall, wall, wall, dcor, wall, wall, dcor, wall],
[ wall, dcor, wall, dcor, scor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, wall, wall, dcor, wall],
[ wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, wall, wall, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, wall],
[ wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, dcor, wall],
[ wall, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, scor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, wall],
[ wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, wall, wall, dcor, wall, wall, wall, dcor, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, wall, dcor, wall, wall, wall, dcor, wall, wall, wall, dcor, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, dcor, wall, wall, wall, dcor, wall, dcor, wall, wall, wall, dcor, wall, wall, wall, dcor, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, dcor, dcor, wall, wall, dcor, wall, dcor, wall, dcor, dcor, dcor, wall, wall, wall, dcor, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, wall, wall, wall, wall, wall, dcor, wall, dcor, wall, dcor, wall, dcor, dcor, dcor, dcor, dcor, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, wall, wall, wall, wall, wall, wall, dcor, wall, wall, dcor, wall, wall, wall, wall, wall, dcor, wall, dcor, wall, dcor, wall, dcor, wall, wall, wall, dcor, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, wall, wall, wall, wall, wall, wall, dcor, wall, wall, dcor, dcor, dcor, dcor, dcor, dcor, dcor, wall, dcor, wall, dcor, wall, dcor, wall, wall, wall, dcor, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, wall, wall, wall, wall, wall, wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, dcor, wall, dcor, wall, dcor, wall, wall, wall, dcor, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, wall, dcor, wall, dcor, wall, dcor, wall, dcor, dcor, dcor, dcor, dcor, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, wall, wall, wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, dcor, wall, dcor, wall, dcor, wall, wall, wall, dcor, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, wall, wall, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, wall, dcor, wall, dcor, dcor, dcor, wall, wall, wall, dcor, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, dcor, wall, dcor, wall, wall, wall, wall, wall, dcor, wall, wall, wall, wall, dcor, wall],
[ wall, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, dcor, wall],
[ wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall, wall]
];
PROCEDURE board_$fail(r: integer);
begin
gpr_$terminate(false, status);
writeln('board_$fail(', r:0, ')');
pgm_$exit;
end;
PROCEDURE board_$print_integer(n: integer; IN ctl: string; x, y: integer);
VAR
text: string;
nlong: integer32;
textlen: integer;
status: status_$t;
dummy: integer32;
BEGIN
nlong := n;
vfmt_$encode2(ctl, text, 80, textlen, nlong, dummy);
gpr_$move(x, y, status);
gpr_$text(text, textlen, status);
END;
PROCEDURE board_$draw_board;
VAR
x, y: INTEGER;
bm: gpr_$bitmap_desc_t;
pos: gpr_$position_t;
BEGIN
gpr_$set_raster_op(0, 3, status);
gpr_$clear(0, status);
for x := 0 to board_width_x - 1 do
begin
pos.x_coord := x * guage;
for y := 0 to board_width_y -1 do
begin
if board[x, y] <> ecor then
begin
case board[x, y] of
wall: bm := wall_bm;
dcor: bm := dot_bm;
scor: bm := sdot_bm
end;
pos.y_coord := y * guage;
gpr_$bit_blt(bm, w, 0, pos, 0, status);
end
end
end;
board_$print_integer(score, 'score: %5sd%$', score_x, score_y);
board_$print_integer(numpacs, 'pacs left: %5sd%$', pac_x, pac_y);
gpr_$set_raster_op(0, 6, status);
END;
PROCEDURE board_$reinit;
BEGIN
score := 0;
board := board_init;
board_$draw_board;
END;
PROCEDURE board_$get_num_dots(* OUT dots, sdots: Integer *);
BEGIN
dots := board_numdcor;
sdots := board_numscor;
END;
PROCEDURE board_$init(* screen: gpr_$bitmap_desc_t;
screen_size: gpr_$offset_t,
pacs: integer *);
VAR
attr: gpr_$attribute_desc_t;
size: gpr_$offset_t;
point: gpr_$position_t;
x, y: integer;
BEGIN
board_numscor := 0;
board_numdcor := 0;
for x := 0 to board_width_x-1 do
for y := 0 to board_width_y-1 do
case board_init[x, y] of
scor: board_numscor := board_numscor + 1;
dcor: board_numdcor := board_numdcor + 1;
wall:;
ecor:
end;
screen_size.x_size := screen_size.x_size div guage;
screen_size.y_size := screen_size.y_size div guage;
if screen_size.x_size < board_width_x then
{board_$fail(1)};
if screen_size.y_size < board_width_y then
{board_$fail(2)};
gpr_$allocate_attribute_block(attr, status);
size.x_size := guage;
size.y_size := guage;
w.window_base.x_coord := 0;
w.window_base.y_coord := 0;
w.window_size := size;
gpr_$allocate_bitmap(size, 0, attr, wall_bm, status);
gpr_$set_bitmap(wall_bm, status);
gpr_$clear(1, status);
gpr_$allocate_bitmap(size, 0, attr, dot_bm, status);
gpr_$set_bitmap(dot_bm, status);
point.x_coord := halfguage;
point.y_coord := halfguage;
x := guage div 8;
if x = 0 then x := 1;
gpr_$circle_filled(point, x, status);
gpr_$allocate_bitmap(size, 0, attr, sdot_bm, status);
gpr_$set_bitmap(sdot_bm, status);
gpr_$set_raster_op(0, 6, status);
x := guage div 3;
if x = 0 then x := 1;
gpr_$circle_filled(point, x, status);
gpr_$set_fill_value(0, status);
x := guage div 5;
if x = 0 then x := 1;
gpr_$circle_filled(point, x, status);
gpr_$set_fill_value(1, status);
gpr_$set_bitmap(screen, status);
score := 0;
numpacs := pacs;
board := board_init
END;
FUNCTION board_$entierGuage(i: integer): integer;
BEGIN
board_$entierGuage := i - (i mod guage);
END;
{ modifies a position to avoid hitting a wall }
PROCEDURE board_$try_pac_position(* IN OUT pos: gpr_$position_t *);
VAR
x, y: integer;
x0, y0: integer;
test: integer;
extrem: integer;
BEGIN
if pos.x_coord < 0 then pos.x_coord := 0;
if pos.y_coord < 0 then pos.y_coord := 0;
if pos.x_coord > ((board_width_x-1)*guage) then
pos.x_coord := ((board_width_x-1)*guage);
if pos.y_coord > ((board_width_y-1)*guage) then
pos.y_coord := ((board_width_y-1)*guage);
x := pos.x_coord div guage;
y := pos.y_coord div guage;
{ find constraints in each direction }
if board[x, y] = wall then
begin
if x < (board_width_x-1) and then board[x+1, y] <> wall then
begin
x := x + 1;
pos.x_coord := x*guage;
end
else if y < (board_width_y-1) and then board[x, y+1] <> wall then
begin
y := y + 1;
pos.y_coord := y*guage;
end
end;
extrem := (pos.x_coord + (guage-1)) div guage;
if extrem >= board_width_x then extrem := board_width_x-1;
if extrem > x AND THEN board[extrem, y] = wall then
pos.x_coord := x*guage;
extrem := (pos.y_coord + (guage-1)) div guage;
if extrem >= board_width_y then extrem := board_width_y-1;
if extrem > y AND THEN board[x, extrem] = wall then
pos.y_coord := y*guage;
END;
{ called to make a figure execute a saved turn }
PROCEDURE board_$can_turn(* IN OUT pos: gpr_$position_t;
IN new_dir: board_$direction;
OUT turn: boolean *);
VAR
elt: board_$elt;
x_inc, y_inc: integer;
x, y: integer;
spos: gpr_$position_t;
BEGIN
spos.x_coord := (pos.x_coord+halfguage) div guage;
spos.y_coord := (pos.y_coord+halfguage) div guage;
x_inc := 0;
y_inc := 0;
case new_dir of
or$up : y_inc := -1;
or$down : y_inc := 1;
or$right : x_inc := 1;
or$left : x_inc := -1;
end;
x := spos.x_coord + x_inc;
y := spos.y_coord + y_inc;
if x < 0 OR ELSE x > board_width_x-1 or else
y < 0 OR ELSE y > board_width_y-1 then turn := false
else begin
elt := board[x, y];
if elt = wall
then turn := false
else begin
pos.x_coord := spos.x_coord * guage;
pos.y_coord := spos.y_coord * guage;
turn := true
end
end
END;
{ called after above to clear a dot in a square of the board }
PROCEDURE board_$clear_dot(* IN pos: gpr_$position_t;
OUT wasdot, special: boolean *);
VAR
x, y: integer;
bm: gpr_$bitmap_desc_t;
draw: boolean;
drawpos: gpr_$position_t;
BEGIN
x := (pos.x_coord+(halfguage)) div guage;
y := (pos.y_coord+(halfguage)) div guage;
draw := true;
case board[x, y] of
wall: {board_$fail(100);} draw := false;
ecor: begin
draw := false;
wasdot := false;
special := false;
end;
dcor: begin
bm := dot_bm;
wasdot := true;
special := false;
end;
scor: begin
bm := sdot_bm;
wasdot := true;
special := true;
end
end;
board[x, y] := ecor; { erase the dot if there was one}
if draw then
begin
drawpos.x_coord := x * guage;
drawpos.y_coord := y * guage;
gpr_$bit_blt(bm, w, 0, drawpos, 0, status);
end
END;
PROCEDURE board_$show_score(* newscore: integer, newnumpacs: integer *);
BEGIN
if score <> newscore then begin
board_$print_integer(score, 'score: %5sd%$', score_x, score_y);
board_$print_integer(newscore, 'score: %5sd%$', score_x, score_y);
score := newscore
end;
if numpacs <> newnumpacs then begin
board_$print_integer(numpacs, 'pacs left: %5sd%$', pac_x, pac_y);
board_$print_integer(newnumpacs, 'pacs left: %5sd%$', pac_x, pac_y);
numpacs := newnumpacs
end
END;