home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_progs
/
prog_oth
/
m2amiga.lzh
/
M2AMIGA
/
DEMOS
/
HITME.MOD
< prev
next >
Wrap
Text File
|
1991-08-16
|
5KB
|
189 lines
MODULE hitMe;
(* This is the program published in AmigaWorld's March/April 1987 Issue.
* Playing with Intuition by William B. Catchings and mark L. Van Name.
* Ported to M2Amiga by Markus Schaub and Rene Degen.
*)
(* Sorry, the program is too big for the demo compiler, I removed all
* inits to 0 of global data, done by Amiga Loader and switch all checks
* off $R- range check $V- overflow check $S- stack check $F- function return
*)
FROM SYSTEM IMPORT
ADDRESS,ADR,INLINE,LONGSET,SHIFT;
FROM Exec IMPORT
GetMsg,ReplyMsg,Wait;
FROM Graphics IMPORT
Move,PolyDraw,SetAPen,Text;
FROM Intuition IMPORT
selectUp,
IDCMPFlagSet,IDCMPFlags,IntuiMessagePtr,NewWindow,ScreenFlags,ScreenFlagSet,
WindowPtr,WindowFlags,WindowFlagSet,
ClearPointer,CloseWindow,CurrentTime,ModifyIDCMP,OpenWindow,
SetPointer,SetWindowTitles;
CONST
accuracy=3;
VAR
myWindow: WindowPtr;
message: IntuiMessagePtr;
class: IDCMPFlagSet;
code: CARDINAL;
ptrX, ptrY, boxX, boxY: INTEGER;
rand: INTEGER;
millis, oldMillis, score, total: LONGINT;
numHit: INTEGER;
corners: ARRAY [0..7] OF INTEGER;
waitMask, wom: LONGSET;
defWindow: NewWindow;
PROCEDURE WindCreate(VAR w: WindowPtr): BOOLEAN;
BEGIN
WITH defWindow DO
leftEdge:=40; topEdge:=40;
width:=300; height:=100;
(*detailPen:=0;*) blockPen:=1;
(*title:=NIL;*)
flags:=WindowFlagSet{activate,windowClose,windowDrag,
windowSizing,windowDepth};
idcmpFlags:=IDCMPFlagSet{closeWindow};
type:=ScreenFlagSet{wbenchScreen};
(*firstGadget:=NIL;
checkMark:=NIL;
screen:=NIL;
bitMap:=NIL; *)
minWidth:=100;
minHeight:=40;
maxWidth:=640;
maxHeight:=200
END;
w:=OpenWindow(defWindow);
RETURN w#NIL;
END WindCreate;
PROCEDURE PtrData;
(* $E- no Entry/Exit Code (of course not) *)
BEGIN
INLINE(
0,0,
0FFFEH,0FFFEH,
0E10EH,0E00EH,
0E10EH,0E00EH,
0E10EH,0E00EH,
0E10EH,0E00EH,
0E10EH,0E00EH,
0FFFEH,0E00EH,
0E10EH,0E00EH,
0E10EH,0E00EH,
0E10EH,0E00EH,
0E10EH,0E00EH,
0E10EH,0E00EH,
0FFFEH,0FFFEH,
0,0)
END PtrData;
PROCEDURE WriteScore(w: WindowPtr; total,score,hits: LONGINT);
VAR
st: ARRAY [0..15] OF CHAR;
i,l: INTEGER;
BEGIN
st:="Hits: "; i:=15; l:=hits;
IF l<0 THEN st[i]:="-"; DEC(i); l:=-l END;
REPEAT
st[i]:=CHR(l MOD 10+48); l:=l DIV 10; DEC(i)
UNTIL (i=6) OR (l=0);
Move(w^.rPort, 10, 20);
Text(w^.rPort, ADR(st), 16);
st:="Score: "; i:=15; l:=total;
IF l<0 THEN st[i]:="-"; DEC(i); l:=-l END;
REPEAT
st[i]:=CHR(l MOD 10+48); l:=l DIV 10; DEC(i)
UNTIL (i=6) OR (l=0);
Move(w^.rPort, 10, 29);
Text(w^.rPort, ADR(st), 16);
END WriteScore;
PROCEDURE Rand(): INTEGER;
CONST
m=1024; a=57; c=6999;
BEGIN
rand:=INTEGER((CARDINAL(a)*CARDINAL(rand)+CARDINAL(c)) MOD CARDINAL(m));
RETURN rand
END Rand;
PROCEDURE PutBox(w: WindowPtr; VAR x,y: INTEGER; VAR millis: LONGINT);
VAR
mic,sec: LONGCARD;
tmp: INTEGER;
BEGIN
WITH w^ DO
IF millis=0 THEN
CurrentTime(ADR(sec),ADR(mic));
rand:=mic MOD 1024;
ELSE
SetAPen(rPort,0);
Move(rPort,corners[6],corners[7]);
PolyDraw(rPort,4,ADR(corners))
END;
SetAPen(rPort, 1);
REPEAT tmp:=Rand() UNTIL (tmp+20<width); x:=tmp+10;
REPEAT tmp:=Rand() UNTIL (tmp+30<height); y:=tmp+20;
corners[0]:=x-4; corners[6]:=corners[0];
corners[1]:=y-3; corners[3]:=corners[1];
corners[2]:=x+4; corners[4]:=corners[2];
corners[5]:=y+3; corners[7]:=corners[5];
Move(rPort, corners[6], corners[7]);
PolyDraw(rPort,4,ADR(corners));
CurrentTime(ADR(sec), ADR(mic));
millis:=SHIFT(sec,10)+SHIFT(mic,-10)
END
END PutBox;
PROCEDURE Hit(x1,y1,x2,y2: INTEGER): BOOLEAN;
BEGIN
RETURN (ABS(x1-x2)<accuracy) & (ABS(y1-y2)<accuracy)
END Hit;
BEGIN (*
millis:=0; oldMillis:=0; score:=0; total:=0; numHit:=0; *)
boxX:=50; boxY:=50;
IF WindCreate(myWindow) THEN
SetWindowTitles(myWindow, ADR('hitMe'), ADR('hitMe, 2.1, 4-Nov-87'));
ModifyIDCMP(myWindow, IDCMPFlagSet{mouseButtons, closeWindow, newSize});
SetPointer(myWindow, ADR(PtrData), 13, 16, -8, -6);
PutBox(myWindow, boxX, boxY, oldMillis);
WriteScore(myWindow, total, score, numHit);
waitMask:=LONGSET{myWindow^.userPort^.sigBit};
LOOP
wom:=Wait(waitMask);
message:=IntuiMessagePtr(GetMsg(myWindow^.userPort));
WHILE message#NIL DO
class:=message^.class;
code:=message^.code;
ptrX:=message^.mouseX;
ptrY:=message^.mouseY;
millis:=SHIFT(message^.seconds,10)+SHIFT(message^.micros,-10);
ReplyMsg(ADDRESS(message));
IF closeWindow IN class THEN
ClearPointer(myWindow);
CloseWindow(myWindow);
EXIT
ELSIF newSize IN class THEN
PutBox(myWindow,boxX,boxY,oldMillis);
ELSIF mouseButtons IN class THEN
IF code=selectUp THEN
IF Hit(ptrX,ptrY,boxX,boxY) THEN
score:=6000-(millis-oldMillis);
IF score<0 THEN score:=0 END;
score:=SHIFT(score,-4);
INC(total,score); INC(numHit);
WriteScore(myWindow,total,score,numHit);
PutBox(myWindow,boxX,boxY,oldMillis)
END
END
END;
message:=IntuiMessagePtr(GetMsg(myWindow^.userPort));
END
END
END
END hitMe.