shapes.shar2 (of 2)
cadp02 at vaxa.strath.ac.uk
cadp02 at vaxa.strath.ac.uk
Sat Sep 8 02:47:24 AEST 1990
This is part two of a two part poting of tetris for VAX's
Delete everything above the line showing "$Part4:", concatenate part 2 onto
the end of part one and then "@shapes.shar1" to unarchive it
!-----------------------------------------------------------------------------
$Part4:
$File_is="SHAPES.PAS"
$Check_Sum_is=573653758
$Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
Xprogram Shapes(input,output,Htable,Save);
X
X
V{*****************************************************************************
X**
X Copyright 1989,1990 by Colin Cowie, Glasgow, Scotland.
X
X All Rights Reserved
X
X Permission to use, copy, modify, and distribute this software and its
X documentation for any purpose and without fee is hereby granted,
X provided that the above copyright notice appear in all copies and that
X both that copyright notice and this permission notice appear in
X supporting documentation.
V******************************************************************************
X*}
X
X
X
Xconst
X Htablefile='disk18:[cadp02.pascal.shapes]Htable.dat';
X Savefile='disk18:[cadp02.pascal.shapes]save.dat';
X
Xtype
X string = packed array[1..8] of char;
X scorerec = record
X num:integer;
X name:packed array[1..40] of char;
X level:integer;
X id:string;
X end;
X recfile = file of scorerec;
X scorearray = array[1..10] of scorerec;
X screenarray = array[1..22,1..10] of integer;
X timearray = packed array[1..11] of char;
X datestr = packed array [1..11] of char;
X saverec = record
X num:integer;
X level:integer;
X outp:screenarray;
X x:integer;
X y:integer;
X shape:integer;
X position:integer;
X lines:integer;
X user:string;
X current:datestr;
X end;
X saverecfile = file of saverec;
X savearray = array[1..100] of saverec;
X
Xvar
X restored:boolean;
X blank:saverec;
X peeps:savearray;
X HP:boolean;
X factor:real;
X curr:timearray;
X flag,
X flag2:boolean;
X answer:char;
X del:boolean;
X userid:string;
X flagA,
X flagB,
X flagC,
X flagD:boolean;
X chan:integer;
X key:integer;
X xchrhigh,
X xchrlow,
X ychrhigh,
X ychrlow:char;
X score,
X shape,
X position:integer;
X cheat:boolean;
X currd:datestr;
X I,J,A:integer;
X x,y:integer;
X scores:scorearray;
X OTT:boolean;
X Htable:recfile;
X Save,
X Saver:saverecfile;
X level:integer;
X levelmin:integer;
X screen:screenarray;
X left,
X right,
X rotleft,
X rotright,
X speed,
X redraw,
X quitkey:char;
X lines:integer;
X
X{*****************************************************************}
Xprocedure CLS;
Xbegin {CLS}
Xwrite(chr(27),'[H');
Xwriteln(chr(27),'[2J');
Xend; {CLS}
X{*****************************************************************}
X
X{*****************************************************************}
V{*****************************************************************************
X}
Xprocedure makechan(%REF chan:integer);external;
X
Xprocedure readkey(%REF key,chan:integer);external;
X
Xprocedure waitkey(%REF key,chan:integer);external;
X
Xprocedure waitx(%REF factor:real);external;
X
Xprocedure spawn;external;
X
Xprocedure RANDOMISE;fortran;
X
Xfunction RANDOM(min,max:integer):integer;fortran;
X
Xprocedure USERNUM(%stdescr userid:string);fortran;
X{*****************************************************************}
X
X
X{******************************************************************}
Xprocedure highscores(score:integer; bit:integer; var Htable:recfile;
X var scores:scorearray; var gotin:boolean);
X
X
Xvar
X I,J:integer;
X newscore:scorerec;
X A:integer;
X two:boolean;
X
Xbegin
X gotin:=false;
X cls;
X writeln('You scored: ',score,' points!!');
X I:=1;
X open (Htable, Htablefile,
X history:=readonly);
X reset(Htable);
X while (not eof(Htable)) and (I <=10) do
X begin
X read(Htable,scores[I]);
X I:=I+1;
X end;
X close(Htable);
X for A:= I to 10 do
X begin
X scores[A].num:=0;
X scores[A].name:=' ';
X scores[A].level:=1;
X scores[A].id:=' ';
X end;
X if score > scores[10].num then
X begin
X two := true;
X usernum(userid);
X if (userid='CADP03 ') or
X (userid='CADP02 ') or
X (userid='CRAA30 ') or
X (userid='CRAA38 ') then
X begin
X writeln('Enter usernum, maximum 8 chars (RETURN for default):');
X write(':');
X userid:=' ';
X readln(userid);
X if userid[1]=' ' then usernum(userid);
X end;
X
X for I := 10 downto 1 do
X begin
X if userid = scores[I].id then
X begin
X if score > scores[I].num then
X begin
X for J := I to 9 do
X scores[J] := scores[J+1];
X if I = 9 then
X scores[9] := scores[10];
X scores[10].num:=0;
X scores[10].name:=' ';
X scores[10].level:=1;
X scores[10].id:=' ';
X end
X else
X begin
X two := false;
X end;
X end;
X end;
X if two = true then
X begin
X gotin:=true;
X writeln('Well done, yu have made it into the top ten!!');
X for A:=1 to 20 do
X newscore.name[A]:=' ';
X Writeln('Enter name, maximum 40 chars:');
X write(':');
X readln(newscore.name);
X usernum(userid);
X if (userid='CADP03 ') or
X (userid='CADP02 ') or
X (userid='CRAA30 ') or
X (userid='CHBS08 ') then
X begin
X writeln('Enter usernum, maximum 8 chars (RETURN for default):');
X write(':');
X userid:=' ';
X readln(userid);
X if userid[1]=' ' then usernum(userid);
X end;
X newscore.num:=score;
X newscore.level:=bit;
X newscore.id:=userid;
X I:=1;
X while newscore.num < scores[I].num do
X I:=I+1;
X for A:=10 downto I+1 do
X scores[A]:=scores[A-1];
X scores[I]:=newscore;
X open (Htable , Htablefile ,
X `009history := old);
X rewrite(Htable);
X for I:=1 to 10 do
X write(Htable,scores[I]);
X close (Htable);
X writeln('Press any key to view high-score table');
X end
X else
X begin
X writeln('One entry only per usernum in the high score table!!');
X writeln('Press any key to return to main menu');
X end;
X end
X else
X begin
X writeln('Sorry, yu didnt make the high score table!!!!!!');
X writeln('Press any key to return to main menu');
X end;
X waitkey(key,chan);
Xend;
X{*************************************************************}
X
X
X{*************************************************************}
Xprocedure viewscores(var Htable:recfile; scores:scorearray; key,chan:integer);
X
Xvar
X score:scorerec;
X I,
X A:integer;
X
Xbegin
X cls;
X open (Htable, Htablefile,
X history:=readonly);
X reset(Htable);
X I:=1;
X while (not eof(Htable)) and (I <=10) do
X begin
X read(Htable,score);
X scores[I]:=score;
X I:=I+1;
X end;
X close (Htable);
X for A:= I to 10 do
X begin
X scores[I].num:=0;
X scores[I].name:=' ';
X scores[I].level:=1;
X scores[I].id:=' ';
X end;
X Writeln(' Shapes HIGH SCORE TABLE');
X writeln;writeln;
V writeln(' score name level
Xuserid');
X for I:=1 to 10 do
X begin
X writeln(I:2,'. ',scores[I].num,' ',scores[I].name,' ',
X scores[I].level:2,' ',scores[I].id);
X end;
Xwriteln;writeln;
Xwriteln(' Press any key to return to main menu');
Xwaitkey(key,chan);
Xend;
X
X{***********************************************************}
X
X
X{************************************************************}
Xprocedure INTOCHAR(var xchrhigh,xchrlow,
X ychrhigh,ychrlow:char; x,y:integer);
X
Xbegin {INTOCHAR}
X xchrhigh`009:= chr(ord('0') + x div 10) ;
X xchrlow`009:= chr(ord('0') + x mod 10) ;
X
X ychrhigh`009:= chr(ord('0') + y div 10) ;
X ychrlow`009:= chr(ord('0') + y mod 10) ;
X
Xend; {INTOCHAR}
X{*********************************************************************}
X
X
X{*****************************************************************}
Xprocedure MENUPRINT;
X
Xbegin
X CLS;
X writeln(chr(27),'#3 Shapes');
X writeln(chr(27),'#4 Shapes');
X writeln(chr(27),'[22;25HCopyright 1989,1990 LokiSoft Ltd.');
X writeln(chr(27),'[09;31H1. Play Shapes');
X writeln(chr(27),'[10;31H2. Redefine Keys');
X writeln(chr(27),'[11;31H3. View Score Board');
X writeln(chr(27),'[12;31H4. Instructions');
X write(chr(27),'[13;31H5. Print Next Shape');
X if flag then writeln(' (YES)') else writeln(' (NO) ');
X write(chr(27),'[14;31H6. Slow Down Game');
X if flag2 then writeln(' (YES)') else writeln(' (NO) ');
X writeln(chr(27),'[15;31H7. Restore Saved Game');
X writeln(chr(27),'[17;31H0. Exit from game');
X writeln(chr(27),'[19;31HEnter choice from options above');
X writeln;
Xend;
X{**********************************************************************}
X{*****************************}
Xprocedure Instructions;
Xbegin
Xcls;
Xwriteln('Hi Guys, here''s another offering from the LokiSoft label,');
Xwriteln('except this one''s good!!!!');
Xwriteln;
Xwriteln('This game is based on a certain arcade game which you may have ');
Xwriteln('played at sometime or other, but I aint mentioning which one cos');
Xwriteln('this is a blatant rip-off of it so its really dead obvious!!');
Xwriteln;
Xwriteln('Anyway, its like this: there are these seven different shapes:-');
Xwriteln;
Xwriteln('@@ @ @ @ @ @ @');
Xwriteln('@@ @ @ @@ @@ @@ @');
Xwriteln(' @@ @@ @ @ @ @');
Xwriteln(' @');
Xwriteln('And these shapes fall from the top of the screen to the bottom,');
Xwriteln('piling on top of one another.');
Xwriteln('You can rotate each shape, and move it left or right, the ');
Xwriteln('object being to get complete unbroken lines of "@@@@@@@@@@" at ');
Xwriteln('the bottom of the screen.');
Xwriteln('when this happens, that line is deleted, and the pile drops down');
Xwriteln('and you are given points depending on which level you are on');
Xwriteln;
Xwriteln(' Press any key for next page');
Xwaitkey(key,chan);
Xcls;
Xwriteln;
Xwriteln('If you are fortunate enough to get more than one completed line at');
Vwriteln('a time, you receive a bonus dependent on the level you are on and the
X');
Xwriteln('number of lines completed.');
Xwriteln('After completing 5 lines, you move on to level 2 where you have to');
Xwriteln('complete 10 lines,..15 for level 3, and so on.');
Xwriteln('There is a bonus at the end of each level depending on which level');
Vwriteln('you are on, and how low the pile of bricks is,..the lower the pile,')
X;
Xwriteln('the higher the bonus');
Vwriteln('For each level, the number of points per completed line, and potentia
Xl');
Xwriteln('bonus per level is increased, and there are an infinite number');
Xwriteln('of levels in the game.');
Xwriteln;
Xwriteln('The default keys are: z - left, x - right,');
Xwriteln(' o - rotate left, p - rotate right,');
Xwriteln(' [ - move shape to bottom, r - redraw screen, q - quit');
Xwriteln(' ! - to spawn to dcl, @ - to save game');
Xwriteln;
Xwriteln(' Press any key for next page');
Xwaitkey(key,chan);
Xcls;
Xwriteln('Note on Saving game:-');
Xwriteln;
Xwriteln('It is only possible for any user to have one saved game at a time,');
Vwriteln('and if you attempt to save a game when you already have one stored,')
X;
Xwriteln('the stored game will be written over!!!');
Xwriteln('Stored games will automatically be deleted when restored.');
Xwriteln;
Vwriteln('There is total space on the save-file for 100 games, and when it is')
X;
Vwriteln('full, whenever anyone attempts to save their game, the oldest previou
Xs');
Xwriteln('saved game is written over!');
Xwriteln;
Xwriteln('Note on Slowing down game option:-');
Xwriteln;
Vwriteln('This option is intended only for people using workstations or similar
X');
Xwriteln('which vastly speed up the screen printing, thereby making the game');
Xwriteln('unplayable. The slow down option negates this problem.');
Xwriteln;
Xwriteln('Now I''ll take this opportunity to wish you happy playing and good');
Xwriteln('luck, you''ll need it!!!!');
Xwriteln(chr(27),'[22;30HPress any key for main menu');
Xwaitkey(key,chan);
Xend;
X{*****************************}
X
X
X
X{*******************************************************************}
Vprocedure KEYDEFINE(var left,right,rotleft,rotright,speed,quitkey,redraw:char)
X;
X
Xvar
X
X redrawint,
X null,
X leftint,
X rightint,
X rotleftint,
X rotrightint,
X speedint,
X stopint:integer;
X quitint:integer;
X
Xbegin {KEYDEFINE}
X CLS;
X writeln(' Defining Keys For SHAPES ');
X writeln;
X writeln;
X writeln;
X writeln;
X writeln('Press key for movement LEFT: ');
X waitkey(leftint,chan);
X left:=chr(leftint);
X writeln(left);
X writeln('press key for movement RIGHT: ');
X waitkey(rightint,chan);
X while (rightint=leftint) do
X waitkey(rightint,chan);
X right:=chr(rightint);
X writeln(right);
X writeln('Press key for rotation ANTICLOCKWISE: ');
X waitkey(rotleftint,chan);
X while (rotleftint=leftint) or
X (rotleftint=rightint) do
X waitkey(rotleftint,chan);
X rotleft:=chr(rotleftint);
X writeln(rotleft);
X writeln('press key for rotation CLOCKWISE: ');
X waitkey(rotrightint,chan);
X while (rotrightint=rightint) or
X (rotrightint=rotleftint) or
X (rotrightint=leftint) do
X waitkey(rotrightint,chan);
X rotright:=chr(rotrightint);
X writeln(rotright);
X writeln('press key to move shape to bottom: ');
X waitkey(speedint,chan);
X while (speedint=rightint) or
X (speedint=leftint) or
X (speedint=rotleftint) or
X (speedint=rotrightint) do
X waitkey(speedint,chan);
X speed:=chr(speedint);
X writeln(speed);
X writeln('press key to quit game: ');
X waitkey(quitint,chan);
X while (quitint=rightint) or
X (quitint=leftint) or
X (quitint=rotleftint) or
X (quitint=rotrightint) or
X (quitint=speedint) do
X waitkey(quitint,chan);
X quitkey:=chr(quitint);
X writeln(quitkey);
X writeln('press key to redraw screen');
X waitkey(redrawint,chan);
X while (redrawint=rightint) or
X (redrawint=leftint) or
X (redrawint=rotrightint) or
X (redrawint=rotleftint) or
X (redrawint=quitint) do
X waitkey(redrawint,chan);
X redraw:=chr(redrawint);
X writeln(redraw);
X writeln;
X writeln;
X writeln;
X writeln(' Press any key to continue ');
X waitkey(null,chan);
Xend; {KEYDEFINE}
X{*******************************************************************}
X
X
X
X{***********************************************************************}
Xprocedure Shapestuff(shape,position,y,x:integer; var screen:screenarray;
X n:integer);
Xbegin
X screen[y,x]:=n;
X if shape = 1 then
X begin
X screen[y,x+1]:=n;
X screen[y+1,x]:=n;
X screen[y+1,x+1]:=n;
X end
X else
X if shape = 2 then
X begin
X if position = 1 then
X begin
X screen[y-1,x]:=n;
X screen[y+1,x]:=n;
X screen[y+1,x+1]:=n;
X end
X else
X if position = 2 then
X begin
X screen[y,x+1]:=n;
X screen[y,x-1]:=n;
X screen[y+1,x-1]:=n;
X end
X else
X if position = 3 then
X begin
X screen[y+1,x]:=n;
X screen[y-1,x]:=n;
X screen[y-1,x-1]:=n;
X end
X else
X if position = 4 then
X begin
X screen[y,x-1]:=n;
X screen[y,x+1]:=n;
X screen[y-1,x+1]:=n;
X end;
X end
X else
X if shape = 3 then
X begin
X if position = 1 then
X begin
X screen[y-1,x]:=n;
X screen[y+1,x]:=n;
X screen[y+1,x-1]:=n;
X end
X else
X if position = 2 then
X begin
X screen[y,x+1]:=n;
X screen[y,x-1]:=n;
X screen[y-1,x-1]:=n;
X end
X else
X if position = 3 then
X begin
X screen[y-1,x]:=n;
X screen[y+1,x]:=n;
X screen[y-1,x+1]:=n;
X end
X else
X if position = 4 then
X begin
X screen[y,x-1]:=n;
X screen[y,x+1]:=n;
X screen[y+1,x+1]:=n;
X end;
X end
X else
X if shape = 4 then
X begin
X if position = 1 then
X begin
X screen[y-1,x]:=n;
X screen[y+1,x]:=n;
X screen[y,x+1]:=n;
X end
X else
X if position = 2 then
X begin
X screen[y+1,x]:=n;
X screen[y,x-1]:=n;
X screen[y,x+1]:=n;
X end
X else
X if position = 3 then
X begin
X screen[y-1,x]:=n;
X screen[y+1,x]:=n;
X screen[y,x-1]:=n;
X end
X else
X if position = 4 then
X begin
X screen[y-1,x]:=n;
X screen[y,x-1]:=n;
X screen[y,x+1]:=n;
X end;
X end
X else
X if shape = 5 then
X begin
X if (position = 1) or (position = 3) then
X begin
X screen[y+1,x]:=n;
X screen[y,x+1]:=n;
X screen[y-1,x+1]:=n;
X end
X else
X if (position = 2) or (position = 4) then
X begin
X screen[y,x-1]:=n;
X screen[y+1,x]:=n;
X screen[y+1,x+1]:=n;
X end;
X end
X else
X if shape = 6 then
X begin
X if (position = 1) or (position = 3) then
X begin
X screen[y-1,x]:=n;
X screen[y,x+1]:=n;
X screen[y+1,x+1]:=n;
X end
X else
X if (position = 2) or (position = 4) then
X begin
X screen[y,x+1]:=n;
X screen[y+1,x]:=n;
X screen[y+1,x-1]:=n;
X end;
X end
X else
X if shape = 7 then
X begin
X if (position = 1) or (position = 3) then
X begin
X screen[y-1,x]:=n;
X screen[y+1,x]:=n;
X screen[y+2,x]:=n;
X end
X else
X if (position = 2) or (position = 4) then
X begin
X screen[y,x-2]:=n;
X screen[y,x-1]:=n;
X screen[y,x+1]:=n;
X end;
X end;
Xend;
X{****************************************************************************}
X
X
X{***********************************************************************}
Xprocedure Check(shape,position,y,x:integer; var change:boolean);
X
Xbegin
X change:=true;
X if shape = 2 then
X begin
X if position = 1 then
X begin
X if screen[y-1,x]=1 then change:= false
X else
X if screen[y+1,x]=1 then change:= false
X else
X if screen[y+1,x+1]=1 then change:= false;
X end
X else
X if position = 2 then
X begin
X if screen[y,x+1]=1 then change:= false else
X if screen[y,x-1]=1 then change:= false else
X if screen[y+1,x-1]=1 then change:= false;
X end
X else
X if position = 3 then
X begin
X if screen[y+1,x]=1 then change:= false else
X if screen[y-1,x]=1 then change:= false else
X if screen[y-1,x-1]=1 then change:= false;
X end
X else
X if position = 4 then
X begin
X if screen[y,x-1]=1 then change:= false else
X if screen[y,x+1]=1 then change:= false else
X if screen[y-1,x+1]=1 then change:= false;
X end;
X end
X else
X if shape = 3 then
X begin
X if position = 1 then
X begin
X if screen[y-1,x]=1 then change:= false else
X if screen[y+1,x]=1 then change:= false else
X if screen[y+1,x-1]=1 then change:= false;
X end
X else
X if position = 2 then
X begin
X if screen[y,x+1]=1 then change:= false else
X if screen[y,x-1]=1 then change:= false else
X if screen[y-1,x-1]=1 then change:= false;
X end
X else
X if position = 3 then
X begin
X if screen[y-1,x]=1 then change:= false else
X if screen[y+1,x]=1 then change:= false else
X if screen[y-1,x+1]=1 then change:= false;
X end
X else
X if position = 4 then
X begin
X if screen[y,x-1]=1 then change:= false else
X if screen[y,x+1]=1 then change:= false else
X if screen[y+1,x+1]=1 then change:= false;
X end;
X end
X else
X if shape = 4 then
X begin
X if position = 1 then
X begin
X if screen[y-1,x]=1 then change:= false else
X if screen[y+1,x]=1 then change:= false else
X if screen[y,x+1]=1 then change:= false;
X end
X else
X if position = 2 then
X begin
X if screen[y+1,x]=1 then change:= false else
X if screen[y,x-1]=1 then change:= false else
X if screen[y,x+1]=1 then change:= false;
X end
X else
X if position = 3 then
X begin
X if screen[y-1,x]=1 then change:= false else
X if screen[y+1,x]=1 then change:= false else
X if screen[y,x-1]=1 then change:= false;
X end
X else
X if position = 4 then
X begin
X if screen[y-1,x]=1 then change:= false else
X if screen[y,x-1]=1 then change:= false else
X if screen[y,x+1]=1 then change:= false;
X end;
X end
X else
X if shape = 5 then
X begin
X if (position = 1) or (position = 3) then
X begin
X if screen[y+1,x]=1 then change:= false else
X if screen[y,x+1]=1 then change:= false else
X if screen[y-1,x+1]=1 then change:= false;
X end
X else
X if (position = 2) or (position = 4) then
X begin
X if screen[y,x-1]=1 then change:= false else
X if screen[y+1,x]=1 then change:= false else
X if screen[y+1,x+1]=1 then change:= false;
X end;
X end
X else
X if shape = 6 then
X begin
X if (position = 1) or (position = 3) then
X begin
X if screen[y-1,x]=1 then change:= false else
X if screen[y,x+1]=1 then change:= false else
X if screen[y+1,x+1]=1 then change:= false;
X end
X else
X if (position = 2) or (position = 4) then
X begin
X if screen[y,x+1]=1 then change:= false else
X if screen[y+1,x]=1 then change:= false else
X if screen[y+1,x-1]=1 then change:= false;
X end;
X end
X else
X if shape = 7 then
X begin
X if (position = 1) or (position = 3) then
X begin
X if screen[y-1,x]=1 then change:= false else
X if screen[y+1,x]=1 then change:= false else
X if screen[y+2,x]=1 then change:= false;
X end
X else
X if (position = 2) or (position = 4) then
X begin
X if screen[y,x-2]=1 then change:= false else
X if screen[y,x-1]=1 then change:= false else
X if screen[y,x+1]=1 then change:= false;
X end;
X end;
Xend;
X{****************************************************************************}
X
X
X{****************************************************************************}
Xprocedure Create(var shape,position,y,x:integer);
X
Xvar
X shapenum:integer;
X
Xbegin
X shapenum:=random(1,23);
X if shapenum < 4 then shape:=1
X else
X if shapenum < 7 then shape:=2
X else
X if shapenum < 11 then shape:=3
X else
X if shapenum < 14 then shape:=4
X else
X if shapenum < 17 then shape:=5
X else
X if shapenum < 20 then shape:=6
X else
X if shapenum < 23 then shape:=7
X else
X shape:=8;
X position:=1;
X y:=2;
X x:=5;
Xend;
X{**************************************************************************}
X
X
X{***********************************************}
Xprocedure PrintLines(screen:screenarray; b:integer);
X
Xvar
X a,
X c:integer;
X noline:boolean;
X
Xbegin
X a:=b;
X repeat
X noline:=true;
X for c:=1 to 10 do
X begin
X if screen[a,c] = 1 then noline:=false;
X intochar(xchrhigh,xchrlow,ychrhigh,ychrlow,c+30,a);
X if screen[a,c] = 1 then
X writeln(chr(27),'[',ychrhigh,ychrlow,';',xchrhigh,xchrlow,'H#');
X if screen[a,c] = 0 then
X writeln(chr(27),'[',ychrhigh,ychrlow,';',xchrhigh,xchrlow,'H ');
X end;
X a:=a-1;
X until (noline) or (a = 1);
Xend;
X{************************************************}
X{******************************************************}
Xprocedure LineDelete(var screen:screenarray; b:integer; var score:integer;
X level:integer; var lines:integer);
X
Xvar
X a,
X c:integer;
X
Xbegin
X for a:= b downto 2 do
X for c:=1 to 10 do
X screen[a,c]:=screen[a-1,c];
X printlines(screen,b);
X if not(flag) then
X score:=score+(150*level)
X else
X score:=score+(100*level);
X lines:=lines+1;
X writeln(chr(27),'[14;7H',((5*level)-lines):2);
X writeln(chr(27),'[10;7H',score:1);
Xend;
X{***************************************************}
X{****************************************************************************}
Xprocedure LineStuff(var screen:screenarray; var lines:integer;
X level:integer; var score:integer);
X
Xvar
X A,
X B:integer;
X line,
X nothing:boolean;
X linenum:integer;
X bounty:integer;
X
Xbegin
X linenum:=lines;
X b:=22;
X bounty:=0;
X repeat
X line:=true;
X for a:=1 to 10 do
X if screen[b,a]=0 then line:=false;
X nothing:=true;
X for a:=1 to 10 do
X if screen[b,a]=1 then nothing:=false;
X if line then
X begin
X LineDelete(screen,b,score,level,lines);
X b:=b+1;
X end;
X b:=b-1;
X until (nothing = true) or (b = 0);
X linenum:=lines-linenum;
X if linenum > 1 then bounty:=((linenum-1) * 200 * level);
X score:=score+bounty;
X writeln(chr(27),'[10;7H',score:1);
Xend;
X{**********************************************************************}
X
X
X{**********************************************************************}
Xprocedure bonus(var score:integer; screen:screenarray; level:integer);
X
Xvar
X a,
X b:integer;
X noline:boolean;
X
X
Xbegin
X a:=22;
X b:=1;
X repeat
X noline:=true;
X for b:=1 to 10 do
X if screen[a,b] = 1 then noline:=false;
X a:=a-1;
X until (a = 0) or (noline = true);
X
X if noline then
X score:=score+(100*a*level);
Xend;
X{******************************************************************}
X
X{*************************************}
Xprocedure Printshape(screen:screenarray; y,x:integer);
X
Xvar
X a,
X b,
X i,
X j:integer;
X stuff:packed array[1..10] of char;
X
Xbegin
X if flag2 = TRUE then
X begin
X waitx(factor);
X end;
X for a:= y-2 to y+3 do
X begin
X if (a < 23) and (a > 1) then
X begin
X intochar(xchrhigh,xchrlow,ychrhigh,ychrlow,31,a);
X for b:=1 to 10 do
X begin
X if screen[a,b] = 1 then stuff[b]:='#'
X else
X if screen[a,b] = 2 then stuff[b]:='@'
X else
X stuff[b]:=' ';
X end;
X writeln(chr(27),'[',ychrhigh,ychrlow,';31H',stuff)
X end;
X end;
Xend;
X{*************************************}
X
X{**********************************************************************}
Xprocedure printnext(shape:integer);
X
Xbegin
X writeln(chr(27),'[07;50H ');
X writeln(chr(27),'[08;50H ');
X if shape = 1 then
X begin
X writeln(chr(27),'[05;50H@@');
X writeln(chr(27),'[06;50H@@');
X end
X else
X if shape = 2 then
X begin
X writeln(chr(27),'[05;50H@ ');
X writeln(chr(27),'[06;50H@ ');
X writeln(chr(27),'[07;50H@@');
X end
X else
X if shape = 3 then
X begin
X writeln(chr(27),'[05;50H @');
X writeln(chr(27),'[06;50H @');
X writeln(chr(27),'[07;50H@@');
X end
X else
X if shape = 4 then
X begin
X writeln(chr(27),'[05;50H@ ');
X writeln(chr(27),'[06;50H@@');
X writeln(chr(27),'[07;50H@ ');
X end
X else
X if shape = 5 then
X begin
X writeln(chr(27),'[05;50H @');
X writeln(chr(27),'[06;50H@@');
X writeln(chr(27),'[07;50H@ ');
X end
X else
X if shape = 6 then
X begin
X writeln(chr(27),'[05;50H@ ');
X writeln(chr(27),'[06;50H@@');
X writeln(chr(27),'[07;50H @');
X end
X else
X if shape = 7 then
X begin
X writeln(chr(27),'[05;50H@ ');
X writeln(chr(27),'[06;50H@ ');
X writeln(chr(27),'[07;50H@ ');
X writeln(chr(27),'[08;50H@ ');
X end;
Xend;
X{**********************************************************************}
X
X
X{**********************************************************************}
Vprocedure Rotation(var screen:screenarray; shape:integer; var position:integer
X;
X rotint:integer; var y,x:integer);
X
Xvar
X newposition:integer;
X ax:integer;
X change:boolean;
X
Xbegin
X if shape = 7 then
X begin
X ax:=x;
X if x = 10 then ax:=9;
X if x = 1 then ax:=3;
X if x = 2 then ax:=3;
X end
X else
X if x =1 then ax:=2
X else
X if x =10 then ax:=9
X else
X ax:=x;
X
X
X if rotint = -1 then
X begin
X if position = 1 then newposition:=4
X else
X newposition:=position -1;
X end
X else
X if rotint = 1 then
X begin
X if position = 4 then newposition:=1
X else
X newposition:=position +1;
X end;
X
X
X check(shape,newposition,y,ax,change);
X if change = true then
X begin
X shapestuff(shape,position,y,x,screen,0);
X position:=newposition;
X x:=ax;
X shapestuff(shape,position,y,x,screen,2);
X printshape(screen,y,x);
X end;
Xend;
V{*****************************************************************************
X}
X
X
V{*****************************************************************************
X}
Xprocedure Movement(var screen:screenarray; shape,position:integer;
X var y,x:integer; d:integer);
X
X
Xvar
X move:boolean;
X a,
X b:integer;
Xbegin
X move:=true;
X if d = 1 then
X begin
X for a:= x+2 downto x-2 do
X for b:=y+2 downto y-1 do
X if (a >1) and (a<11) and (b > 1) and (b < 23) then
X begin
X if (a = 10) and (screen[b,a] = 2) then move:=false;
X if (screen[b,a] = 1) and (screen[b,a-1] = 2) then move:=false;
X end;
X end
X else
X if d = -1 then
X begin
X for a:=x-3 to x+1 do
X for b:=y-1 to y+2 do
X if (a >0) and (a<9) and (b>1) and (b<23) then
X begin
X if (a = 1) and (screen[b,a] = 2) then move:=false;
X if (screen[b,a] = 1) and (screen[b,a+1] = 2) then move:=false;
X end;
X end;
X if move = true then
X begin
X shapestuff(shape,position,y,x,screen,0);
X x:=x+d;
X shapestuff(shape,position,y,x,screen,2);
X printshape(screen,y,x);
X end;
Xend;
X{************************************************************************}
V{*****************************************************************************
X}
Vprocedure Down(var screen:screenarray; shape,position:integer; var y,x:integer
X;
X var fast:boolean);
X
X
Xvar
X move:boolean;
X a,
X b:integer;
X
Xbegin
X move:=true;
X for b:=y+3 downto y-1 do
X for a:= x+2 downto x-2 do
X if (a >0) and (a<11) and (b > 1) and (b < 23) then
X begin
X if (b = 22) and (screen[b,a] = 2) then move:=false;
X if (screen[b,a] = 1) and (screen[b-1,a] = 2) then move:=false;
X end;
X if move = true then
X begin
X if fast = true then
X begin
X y:=y+1;
X shapestuff(shape,position,y-1,x,screen,0);
X printshape(screen,y,x);
X shapestuff(shape,position,y,x,screen,2);
X repeat
X move:=true;
X for b:=y+3 downto y-1 do
X for a:= x+2 downto x-2 do
X if (a >0) and (a<11) and (b > 1) and (b < 23) then
X begin
X if (b = 22) and (screen[b,a] = 2) then move:=false;
X if (screen[b,a] = 1) and (screen[b-1,a] = 2 ) then move:=false;
X end;
X if move = true then
X begin
X y:=y+1;
X shapestuff(shape,position,y-1,x,screen,0);
X shapestuff(shape,position,y,x,screen,2);
X end;
X until move=false;
X printshape(screen,y,x);
X end
X else
X begin
X y:=y+1;
X screen[y-1,x]:=0;
X screen[y,x]:=2;
X shapestuff(shape,position,y-1,x,screen,0);
X shapestuff(shape,position,y,x,screen,2);
X printshape(screen,y,x);
X end;
X end;
X fast:=false;
Xend;
X{************************************************************************}
X
Xprocedure printall(screen:screenarray; score,lines,level:integer);
X
X
Xvar
X a,
X b:integer;
X g,
X h,
X xchrhigh,
X xchrlow,
X ychrhigh,
X ychrlow:char;
X stuff:packed array[1..10] of char;
X
Xbegin
X
X cls;
X for I:=1 to 22 do
X begin
X intochar(g,h,ychrhigh,ychrlow,1,I);
X writeln(chr(27),'[',ychrhigh,ychrlow,';30H| |');
X end;
X writeln(chr(27),'[23;30H------------');
X if flag then writeln(chr(27),'[03;49HNEXT');
X writeln(chr(27),'[10;1HSCORE:',score:1);
X writeln(chr(27),'[12;1HLEVEL:',level:1);
X writeln(chr(27),'[14;1HLINES:',((5*level)-lines):2);
X for a:=1 to 22 do
X begin
X intochar(xchrhigh,xchrlow,ychrhigh,ychrlow,31,a);
X for b:=1 to 10 do
X begin
X if screen[a,b] = 1 then stuff[b]:='#'
X else
X stuff[b]:=' ';
X end;
X writeln(chr(27),'[',ychrhigh,ychrlow,';31H',stuff);
X end;
Xend;
V{*****************************************************************************
X*}
X
V{*****************************************************************************
X*}
Xprocedure editshape(key:integer; var nshape:integer);
X
X
Xbegin
X nshape:=key-48;
X printnext(nshape);
Xend;
V{*****************************************************************************
X*}
X{***********************************************}
Xprocedure getyearday(inp:datestr; var year,day:integer);
X
Xvar
X digit1,
X digit2,
X digit3,
X digit4:integer;
X offset:integer;
X
Xbegin
X offset:= ord('1') + 1;
X digit1:= ord(inp[8]) - offset;
X digit2:= ord(inp[9]) - offset;
X digit3:= ord(inp[10]) - offset;
X digit4:= ord(inp[11]) - offset;
X year:= digit4 + (10*digit3) + (100*digit2) + (1000*digit1);
X digit1:= ord(inp[1]) - offset;
X digit2:= ord(inp[2]) - offset;
X day:= digit2 + (10*digit1);
Xend;
X{************************************************}
X
X{**********************************************}
Xprocedure getmonth(inp:datestr; var month:integer);
X
Xbegin
X
X if (inp[4] = 'J') and (inp[5] = 'A') then month:=1
X else
X if (inp[4] = 'F') then month:=2
X else
X if (inp[4] = 'M') and (inp[6] = 'R') then month:=3
X else
X if (inp[4] = 'A') and (inp[5] = 'P') then month:=4
X else
X if (inp[4] = 'M') and (inp[6] = 'Y') then month:=5
X else
X if (inp[4] = 'J') and (inp[6] = 'N') then month:=7
X else
X if (inp[4] = 'J') then month:=6
X else
X if (inp[4] = 'A') and (inp[5] = 'U') then month:=8
X else
X if (inp[4] = 'S') then month:=9
X else
X if (inp[4] = 'O') then month:=10
X else
X if (inp[4] = 'N') then month:=11
X else
X if (inp[4] = 'D') then month:=12;
Xend;
X
V{*****************************************************************************
X*}
V{*****************************************************************************
X*}
Xfunction older(one,two:datestr):boolean;
X
X
Xvar
X oneyear,
X twoyear,
X onemonth,
X twomonth,
X oneday,
X twoday:integer;
X
Xbegin
X getyearday(one,oneyear,oneday);
X getyearday(two,twoyear,twoday);
X getmonth(one,onemonth);
X getmonth(two,twomonth);
X if oneyear < twoyear then older:=true
X else
X if onemonth < twomonth then older:=true
X else
X if oneday < twoday then older:=true
X else
X older:=false;
Xend;
V{*****************************************************************************
X*}
V{*****************************************************************************
X*}
X
X
V{*****************************************************************************
X*}
V{*****************************************************************************
X*}
XProcedure MainGame(left,right,rotleft,rotright,speed,quitkey,redraw:char;
X level:integer; cheat:boolean);
X
Xvar
X oldest:integer;
X saved,
X saving:saverec;
X count:integer;
X quit:boolean;
X a,b:integer;
X height:integer;
X choice:char;
X nx,
X ny,
X nshape,
X nposition:integer;
X fast:boolean;
X gotin:boolean;
X
Xbegin
X
Xrandomise;
Xif restored = false then
Xbegin
X for a:=1 to 22 do
X for b:=1 to 10 do
X screen[a,b]:=0;
X score:=0;
X position:=1;
X create(shape,position,y,x);
X lines:=0;
X shapestuff(shape,position,y,x,screen,2);
Xend;
Xcreate(nshape,nposition,ny,nx);
Xcount:=0;
Xfast:=false;
Xquit:=false;
Xott:=false;
Xcls;
X
Xprintshape(screen,y,x);
Xprintall(screen,score,lines,level);
Xif restored then
X writeln(chr(27),'[10;49HPress any key to continue game')
Xelse
X writeln(chr(27),'[10;49HPress any key to play game');
Xwaitkey(key,chan);
Xwriteln(chr(27),'[10;49H ');
Xrestored:=false;
Xif flag then printnext(nshape);
Xrepeat
X readkey(key,chan);
X choice:=chr(key);
X if choice = left then Movement(screen,shape,position,y,x,-1)
X else
X if choice = right then movement(screen,shape,position,y,x,1)
X else
X if choice = rotleft then Rotation(screen,shape,position,-1,y,x)
X else
X if choice = rotright then Rotation(screen,shape,position,1,y,x)
X else
X if choice = speed then fast:=true
X else
X if (choice in ['1'..'7']) and (cheat = true) then editshape(key,nshape)
X else
X if choice = redraw then
X begin
X printall(screen,score,lines,level);
X if flag then printnext(nshape);
X end
X else
X if choice = quitkey then ott:=true
X else
X if choice = '!' then
X begin
X cls;
X writeln('%DCL-I-SPAWN, Type eoj to return to Shapes');
X spawn;
X printall(screen,score,lines,level);
X if flag then printnext(nshape);
X writeln(chr(27),'[10;49HPress any key to continue Shapes');
X waitkey(key,chan);
X writeln(chr(27),'[10;49H ');
X end
X else
X if choice = '@' then
X begin
X cls;
X Writeln( 'Save game option');
X usernum(userid);
X if (userid = 'CADP02 ') or
X (userid = 'CADP03 ') then
X begin
X write('Enter username, MAX 8 letters, RETURN for default: ');
X userid:=' ';
X readln(userid);
X if userid[1] = ' ' then usernum(userid);
X end;
X saving.num:=score;
X saving.level:=level;
X saving.outp:=screen;
X saving.lines:=lines;
X saving.x:=x;
X saving.y:=y;
X saving.shape:=shape;
X saving.position:=position;
X saving.user:=userid;
X DATE(saving.current);
X open(Save,Savefile,history:=readonly);
X reset(save);
X del:=false;
X for I:=1 to 100 do
X begin
X read(save,peeps[I]);
X if (del = true) and (peeps[I].user = saving.user) then
X peeps[I].user:='UNUSED ';
X if (del = false) and (peeps[I].user = 'UNUSED ') then
X begin
X peeps[I]:=saving;
X del:=true;
X end;
X if (del = false) and (peeps[I].user = saving.user) then
X begin
X del:=true;
X peeps[I]:=saving;
X end;
X end;
X if del = false then
X begin
X reset(save);
X read(save,peeps[1]);
X oldest:=1;
X for I:=2 to 100 do
X begin
X read(save,peeps[I]);
X if older(peeps[I-1].current,peeps[I].current) = false then
X oldest:=I;
X end;
X peeps[oldest]:=saving;
X end;
X close(save);
X open(Save,Savefile,history:=old);
X rewrite(save);
X for I:=1 to 100 do
X write(save,peeps[I]);
X close(save);
X ott:=true;
X del:=false;
X writeln('Game saved.');
X writeln('Press any key for main menu.');
X waitkey(key,chan);
X end;
X if count = 3 then
X begin
X height:=y;
X Down(screen,shape,position,y,x,fast);
X if height = y then
X begin
X for a:=1 to 10 do
X if screen[1,a]=2 then ott:=true;
X shapestuff(shape,position,y,x,screen,1);
X printshape(screen,y,x);
X linestuff(screen,lines,level,score);
X shape:=Nshape;
X position:=Nposition;
X y:=Ny;
X x:=Nx;
X create(nshape,nposition,ny,nx);
X if flag then printnext(nshape);
X shapestuff(shape,position,y,x,screen,2);
X if lines >= 5*level then
X begin
X level:=level+1;
X bonus(score,screen,level);
X lines:=0;
X printall(screen,score,lines,level);
X if flag then printnext(nshape);
X end;
X end;
X count:=0;
X end;
X count:=count+1;
Xuntil OTT = true;
X
Xif choice <> '@' then
Xbegin
X highscores(score,level,Htable,scores,gotin);
X if gotin then viewscores(Htable,scores,key,chan)
Xend
Xend;
V{*****************************************************************************
X*}
V{*****************************************************************************
X*}
X
V{*****************************************************************************
X*}
V{*****************************************************************************
X*}
XProcedure RESTORE;
X
Xvar
X I:integer;
X
Xbegin
X cls;
X writeln(' Restore saved game option');
X usernum(userid);
X if (userid = 'CADP02 ') or
X (userid = 'CADP03 ') then
X begin
X write('Enter username, MAX 8 letters, RETURN for default: ');
X userid:=' ';
X readln(userid);
X if userid[1] = ' ' then usernum(userid);
X end;
X restored:=false;
X open(Save,Savefile,history:=readonly);
X reset(save);
X for I:=1 to 100 do
X begin
X read(save,peeps[I]);
X if peeps[I].user = userid then
X begin
X cls;
X writeln('Restoring...');
X lines:=peeps[I].lines;
X position:=peeps[I].position;
X x:=peeps[I].x;
X y:=peeps[I].y;
X shape:=peeps[I].shape;
X screen:=peeps[I].outp;
X score:=peeps[I].num;
X level:=peeps[I].level;
X peeps[I].user:='UNUSED ';
X restored:=true;
X end;
X end;
X close(save);
X open(save,savefile,history:=old);
X rewrite(save);
X for I:=1 to 100 do
X write(save,peeps[I]);
X close(save);
X if restored = true then
X begin
X writeln('Restored.');
X writeln('Press any key for main screen');
X waitkey(key,chan);
X MAINGAME(left,right,rotleft,rotright,speed,quitkey,redraw,level,cheat);
X end
X else
X begin
X writeln('Data file not found.');
X writeln('Press any key to return to main menu.');
X waitkey(key,chan);
X end;
Xend;
X
V{*****************************************************************************
X*}
V{*****************************************************************************
X*}
X
X{*******************************************************************}
Xbegin {SHAPES}
X cls;
X MAKECHAN(chan);
X HP := FALSE;
X flag:=true;
X flag2:=false;
X cheat:=false;
X left:='z';right:='x';rotleft:='o';rotright:='p';speed:='[';quitkey:='q';
X factor:=0.15;
X redraw:='r';
X levelmin:=1;
X for I:=1 to 22 do
X begin {for}
X for J:=1 to 10 do
X screen[I,J]:=0;
X end; {for}
X repeat
X MENUPRINT;
X repeat
X if chr(key) = 'c' then flagA:=true;
X if chr(key) = 'a' then
X begin
X if flagA = true then flagB:=true
X else flagB:=false;
X end;
X if chr(key) = 'd' then
X begin
X if flagB = true then flagC:=true
X else flagC:=false;
X end;
X if chr(key) = 'p' then
X begin
X if flagC = true then flagD:=true
X else flagD:=false;
X end;
X if (chr(key) <> 'c') and (chr(key) <> 'a') and
X (chr(key) <> 'd') and (chr(key) <> 'p') then
X begin
X flagA:=false;
X flagB:=false;
X flagC:=false;
X flagD:=false;
X end;
X waitkey(key,chan);
X until chr(key) in ['0'..'8'];
X level:=levelmin;
X if chr(key) <> '8' then flagD:=false;
X if chr(key)='1' then
X MAINGAME(left,right,rotleft,rotright,speed,quitkey,redraw,level,cheat);
V if chr(key)='2' then KEYDEFINE(left,right,rotleft,rotright,speed,quitkey,r
Xedraw);
X if chr(key)='3' then VIEWSCORES(Htable,scores,key,chan);
X if chr(key)='4' then INSTRUCTIONS;
X if chr(key)='5' then flag:=not(flag);
X if chr(key)='6' then flag2:=not(flag2);
X if chr(key)='7' then RESTORE;
X if flagD then
X begin
X cheat:=true;
X write('level??: ');
X readln(levelmin);
X write('reset savefile??: ');
X readln(answer);
X if (answer = 'y') or (answer = 'Y') then
X begin
X blank.user:='UNUSED ';
X open(Save,Savefile,history:=unknown);
X rewrite(save);
X for I:=1 to 100 do
X write(save,blank);
X close(save);
X end;
X write('reset scoreboard??: ');
X readln(answer);
X if (answer='y') or (answer ='Y') then
X begin
X open (Htable , Htablefile ,
X`009 history := unknown);
X rewrite(Htable);
X for A:= 1 to 10 do
X begin
X scores[A].num:=0;
X scores[A].name:=' ';
X scores[A].level:=1;
X scores[A].id:=' ';
X end;
X for A:=1 to 10 do
X write(Htable,scores[A]);
X close(Htable);
X end;
X end;
X until (chr(key)='0');
X cls;
X writeln('There now, that didn''t hurt much did it??');
X writeln('Byeeeeeeeeee........');
Xend. {SHAPES}
X{*******************************************************************}
X
$GoSub Convert_File
$Exit
More information about the Alt.sources
mailing list