home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 10
/
Fresh_Fish_10_2352.bin
/
new
/
dev
/
obero
/
oberon
/
demos
/
mines.mod
(
.txt
)
< prev
next >
Wrap
Oberon Text
|
2002-10-03
|
38KB
|
1,221 lines
Syntax10.Scn.Fnt
Syntax10b.Scn.Fnt
FoldElems
Syntax10.Scn.Fnt
(* standard colors *)
Syntax10.Scn.Fnt
(* the colors of Mines for Windows *)
(*black=Display.white; red=1; yellow=10; lightgray=11; midgray=12; darkgray=14;
Col1=3; Col2=5; Col3=red; Col4=6; Col5=4; Col6=8; Col7=7; Col8=black;*)
MODULE Mines; (* Oberon-Mines V1.31 (C) 1 Oct 94 by Ralf Degner *)
IMPORT
Oberon, Texts, Display, MenuViewers, TextFrames, Input, Fonts, Viewers, SYSTEM, Files;
CONST
(* the colors of Mines with Mines.Pal *)
black=Display.white; red=1; yellow=4; lightgray=12; midgray=13; darkgray=14;
Col1=3; Col2=2; Col3=red; Col4=9; Col5=7; Col6=5; Col7=6; Col8=black;
(*MS-Windows Colors*)
Menu = "System.Close System.Copy System.Grow Mines.Pause Mines.Beginner Mines.Advanced Mines.Expert Mines.Max Mines.Score";
KastenBreite=16;ObenPlatz=25;
UntenPlatz=4;SeitenPlatz=4;
KastenPlatz*=KastenBreite+1;KB=KastenBreite;
MinKastenAnz=7;CharBreite=8;
TYPE
FeldPtr* = POINTER TO ARRAY OF ARRAY OF SHORTINT;
String = ARRAY 32 OF CHAR;
HiScoreType = RECORD
Name: String;
Time: LONGINT;
END;
HiScoreArrayType = ARRAY 3 OF HiScoreType;
Data* = POINTER TO DataDesc;
DataDesc* = RECORD
XKastenAnz*,YKastenAnz*: INTEGER;
Aktiv*, Pause*, StartPlay*: BOOLEAN;
Feld*: FeldPtr;
Time*, Count*, Mines*: LONGINT;
Quote*, Mode*: INTEGER;
END;
Frame* = POINTER TO FrameDesc;
FrameDesc* = RECORD(Display.FrameDesc)
SeitenOffset*, UntenOffset*: INTEGER;
LastModMsg: BOOLEAN;
d*: Data;
END;
MinerMsg = RECORD(Display.FrameMsg)
d*: Data;
END;
PlotNewMsg = RECORD(MinerMsg)
END;
PlotKastenMsg* = RECORD(MinerMsg)
x*, y*: INTEGER;
END;
NeuesFeldMsg = RECORD(MinerMsg)
Change: BOOLEAN;
END;
RePlotMsg = RECORD(MinerMsg)
All: BOOLEAN;
END;
TimeMsg = RECORD(MinerMsg)
id: LONGINT;
Count: INTEGER;
END;
UsedFont: Fonts.Font;
W: Texts.Writer;
TimeTask: Oberon.Task;
seed, StartTime, LastTime: LONGINT;
HiScore: HiScoreArrayType;
Name: String;
ScoreFile: Files.File;
ScoreRider: Files.Rider;
Color, UseTimeTask, TimeTaskRuns, PauseFlag: BOOLEAN;
Colors: ARRAY 8 OF INTEGER;
Dummy: INTEGER;
(* data for patterns *)
HappyData, SadData, BackData, GotItData, PauseData: ARRAY 17 OF SET;
HappyPat, SadPat, BackPat, GotItPat, PausePat: LONGINT;
Data1, Data2, Data3, Data4: ARRAY 13 OF SET;
Pat: ARRAY 5 OF LONGINT;
(* clear HiScore *)
PROCEDURE ClearHi;
VAR Dummy: INTEGER;
BEGIN
FOR Dummy:=0 TO 2 DO
HiScore[Dummy].Time:=999999;
HiScore[Dummy].Name:="Amiga";
END;
END ClearHi;
(* store HiScore *)
PROCEDURE SaveHi(Register: BOOLEAN);
VAR Dum: INTEGER;
BEGIN
Files.Set(ScoreRider, ScoreFile, 0);
Files.WriteBool(ScoreRider, Color);
Files.WriteBool(ScoreRider, UseTimeTask);
FOR Dum:=0 TO 2 DO
Files.WriteLInt(ScoreRider, HiScore[Dum].Time);
Files.WriteBytes(ScoreRider, HiScore[Dum].Name, 32);
END;
IF Register THEN
Files.Register(ScoreFile);
ELSE
Files.Close(ScoreFile);
END;
END SaveHi;
(* load HiScore *)
PROCEDURE LoadHi;
VAR Dum: INTEGER;
BEGIN
ClearHi();
ScoreFile:=Files.Old("Mines.Score");
IF ScoreFile=NIL THEN
ScoreFile:=Files.New("Mines.Score");
SaveHi(TRUE);
ELSE
Files.Set(ScoreRider, ScoreFile, 0);
Files.ReadBool(ScoreRider, Color);
Files.ReadBool(ScoreRider, UseTimeTask);
FOR Dum:=0 TO 2 DO
Files.ReadLInt(ScoreRider, HiScore[Dum].Time);
Files.ReadBytes(ScoreRider, HiScore[Dum].Name, 32);
END;
END;
END LoadHi;
(* produces random numbers *)
PROCEDURE Random(Ein: INTEGER):INTEGER;
VAR
Max, Wert: INTEGER;
Gerade: BOOLEAN;
BEGIN
IF (Ein MOD 2)=0 THEN
Max:=Ein+1;
Gerade:=TRUE;
ELSE
Max:=Ein;
Gerade:=FALSE;
END;
seed:=SYSTEM.ROT(ASH(Input.Time(), -1)+ASH(seed, -1), 13);
seed:=SYSTEM.ROT(seed, seed MOD 32);
seed:=SYSTEM.ROT(2147483647+ASH(seed, -1), 13);
seed:=SYSTEM.ROT(seed, seed DIV 01000000H);
Wert:=SHORT(seed MOD Max);
IF Gerade THEN
IF Wert=Ein THEN
RETURN Random(Ein);
END;
END;
RETURN Wert;
END Random;
(* stop the TimeTask *)
PROCEDURE StopTask*;
BEGIN
IF TimeTaskRuns THEN
Oberon.Remove(TimeTask);
TimeTaskRuns:=FALSE;
END;
END StopTask;
(* the task, that sends every second a TimeMsg *)
PROCEDURE TheTimeTask;
VAR timsg: TimeMsg;
BEGIN
IF Input.Time()>LastTime THEN
LastTime:=LastTime+Input.TimeUnit;
timsg.id:=StartTime;
timsg.Count:=0;
Viewers.Broadcast(timsg);
IF timsg.Count=0 THEN StopTask();END;
END;
END TheTimeTask;
(* start the TimeTask *)
PROCEDURE StartTask;
BEGIN
IF ~TimeTaskRuns THEN
NEW(TimeTask);
TimeTask.safe:=FALSE;
TimeTask.handle:=TheTimeTask;
Oberon.Install(TimeTask);
LastTime:=Input.Time();
TimeTaskRuns:=TRUE;
END;
END StartTask;
(* draw box at top of the field *)
PROCEDURE PlotSmily(f: Frame; Smile: BOOLEAN);
VAR XPos, YPos, Col: INTEGER;
BEGIN
IF f.H>ObenPlatz THEN
IF f.W>30 THEN
YPos:=f.Y+f.H-ObenPlatz+3;
XPos:=f.W DIV 2-10+f.X;
IF Color THEN
Display.ReplConst(lightgray, XPos, YPos, 20, 20, Display.replace);
Display.ReplConst(darkgray, XPos+1, YPos, 19, 19, Display.replace);
Display.ReplConst(midgray, XPos+1, YPos+1, 18, 18, Display.replace);
Display.CopyPattern(yellow, BackPat, XPos+2, YPos+2, Display.paint);
Col:=black;
ELSE
Display.ReplConst(Display.white, XPos, YPos, 20, 20, Display.replace);
Display.ReplConst(Display.black, XPos+1, YPos+1, 18, 18, Display.replace);
Col:=Display.white;
END;
IF f.d.Pause THEN
Display.CopyPattern(Col, PausePat, XPos+2, YPos+2, Display.paint);
ELSE
IF Smile THEN
Display.CopyPattern(Col, HappyPat, XPos+2, YPos+2, Display.paint);
ELSE
Display.CopyPattern(Col, SadPat, XPos+2, YPos+2, Display.paint);
END;
END;
END;
END;
END PlotSmily;
(* clear a frame *)
PROCEDURE ClearFrame(f: Frame; Smile: BOOLEAN);
BEGIN
Oberon.RemoveMarks(f.X, f.Y, f.W, f.H);
Display.ReplConst(Display.black, f.X, f.Y, f.W, f.H, Display.replace);
f.SeitenOffset:=(f.W-f.d.XKastenAnz*KastenPlatz) DIV 2 +f.X;
f.UntenOffset:=f.Y+f.H-ObenPlatz-f.d.YKastenAnz*KastenPlatz;
PlotSmily(f, Smile);
END ClearFrame;
(* copy frame with same data *)
PROCEDURE CopyMe(f: Frame): Frame;
VAR nf: Frame;
BEGIN
NEW(nf);IF nf=NIL THEN RETURN NIL;END;
nf.handle:=f.handle;
nf.d:=f.d;nf.LastModMsg:=TRUE;
RETURN nf;
END CopyMe;
(* clear a box *)
PROCEDURE ClearKasten(f: Frame; x, y: INTEGER; Color: BOOLEAN);
VAR dumx, dumy: INTEGER;
BEGIN
dumx:=f.SeitenOffset+x*KastenPlatz-KastenBreite;
dumy:=f.UntenOffset+y*KastenPlatz-KastenBreite;
IF Color THEN
Display.ReplConst(darkgray, dumx, dumy, KB, KB, Display.replace);
Display.ReplConst(lightgray, dumx+1, dumy, KB-1, KB-1, Display.replace);
Display.ReplConst(midgray, dumx+1, dumy+1, KB-2, KB-2, Display.replace);
ELSE
Display.ReplConst(Display.black, dumx, dumy, KB, KB, Display.replace);
END;
END ClearKasten;
(* draw not selected box *)
PROCEDURE BlockKasten(f: Frame; x, y: INTEGER; Color: BOOLEAN; col: INTEGER);
VAR dumx, dumy: INTEGER;
BEGIN
dumx:=f.SeitenOffset+x*KastenPlatz-KastenBreite;
dumy:=f.UntenOffset+y*KastenPlatz-KastenBreite;
IF Color THEN
Display.ReplConst(lightgray, dumx, dumy, KB, KB, Display.replace);
Display.ReplConst(darkgray, dumx+1, dumy, KB-1, KB-1, Display.replace);
Display.ReplConst(midgray, dumx+1, dumy+1, KB-2, KB-2, Display.replace);
ELSE
Display.ReplConst(Display.black, dumx, dumy, KB, KB, Display.replace);
Display.ReplConst(col, dumx+1, dumy+1, KB-2, KB-2, Display.replace);
END;
END BlockKasten;
(* draw char at box *)
PROCEDURE DrawChar(f: Frame; ch: CHAR; XKasten, YKasten: INTEGER; Color: BOOLEAN; col: INTEGER);
VAR
Pat: Display.Pattern;
dx, x, y, w, h: INTEGER;
dumx, dumy: INTEGER;
BEGIN
Display.GetChar(UsedFont.raster, ch, dx, x, y, w, h, Pat);
ClearKasten(f, XKasten, YKasten, Color);
dumx:=f.SeitenOffset+XKasten*KastenPlatz-KastenBreite+(KB-w) DIV 2;
dumy:=f.UntenOffset+YKasten*KastenPlatz-KastenBreite+(KB-h) DIV 2;
IF Color THEN
col:=Colors[ORD(ch)-49];
END;
Displ