home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
M.u.C.S. Disc 2000
/
MUCS2000.iso
/
spiele
/
puzzle
/
puzzle.4th
< prev
next >
Wrap
Text File
|
1999-02-26
|
9KB
|
337 lines
\
-1 CONSTANT APP IMMEDIATE
APP [IF] system automark on [THEN]
mforth [ifndef] ARRAY INCLUDE science\fsl_util.seq [THEN]
mforth INCLUDE system\file.4th
mforth XBIOS 0= [IF] INCLUDE system\xbios.4th [THEN]
mforth INCLUDE xgem\xgem.4th
gemdefs ALSO
INCLUDE puzzle\puzzle.h
APP [IF]
CREATE rscName ," puzzle.rsc"
CREATE picName ," puzzle.pic"
[ELSE]
CREATE rscName ," e:\.\forth\puzzle\puzzle.rsc"
CREATE picName ," e:\.\forth\puzzle\puzzle.pic"
[THEN]
CREATE InfoString 32 ALLOT
#define ROWS 5
#define COLS 5
#define WIDTH 64
0 VALUE mainWin
WNAME INFO + MOVER + SMALLER +
VALUE WIN_TYPE
0 VALUE fh
VARIABLE status
2VARIABLE frei
2VARIABLE clicked
VARIABLE richtig
VARIABLE schwierig
MFDB picMFDB
MFDB oriMFDB
MFDB mixMFDB
ROWS COLS DOUBLE MATRIX crc{{
\ --------------------------------------------------------
: calc_window_size ( -- x y w h )
WC_BORDER WIN_TYPE 16 48
[ ROWS WIDTH q* ] LITERAL
[ COLS WIDTH q* ] LITERAL gl_hattr w@ + wind_calc ;
\ --------------------------------------------------------
: change ( a1 a2 -- ) DUP @ >R >R DUP @ R> ! R> SWAP ! ;
\ --------------------------------------------------------
: random.RC ( -- r c ) [ xbios ]
random ROWS MOD
random COLS MOD ;
: rc>xy ( r c -- x y ) WIDTH WIDTH xy* ;
: rc>wxy ( x y -- wx wy ) rc>xy mainWin work 2w@ pair+ ;
: xy>rec ( x y -- x y x' y' ) WIDTH DUP >xyxy ;
\ --------------------------------------------------------
: allocateMFDBs ( -- flag )
ROWS COLS WIDTH DUP xy* oriMFDB allocMFDB
ROWS COLS WIDTH DUP xy* mixMFDB allocMFDB AND
WIDTH DUP picMFDB allocMFDB AND ;
\ --------------------------------------------------------
: fertig ( -- flag )
richtig off
ROWS 0 DO
COLS 0 DO
crc{{ J I }} 2@ = IF richtig inc THEN
LOOP
LOOP
richtig @ COLS ROWS q* =
C" Richtig: " InfoString strcpy
richtig @ 0 <# #S #> DROP InfoString strcat
mainWin w@ InfoString wind_info ;
\ --------------------------------------------------------
: blackbar ( x y -- ) 1 sf_color
rc>xy
mainWin work 2w@ pair+ 2DUP >R >R
WIDTH WIDTH >xyxy bar
0 sl_color R> R> 2DUP
WIDTH WIDTH >xyxy line
WIDTH 0 pair+ 2DUP WIDTH NEGATE WIDTH pair+ line ;
\ --------------------------------------------------------
: swapMFDB ( x y x' y' -- )
hide_mouse
rc>wxy xy>rec \ Screenkoordinaten
4dup 4>r \ scr 2 scr
0 0 WIDTH 1- WIDTH 1- \ Ziel in picMFDB
scrMFDB picMFDB 3 ro_cpyfm
2DUP \ source
rc>wxy xy>rec \ ... Koordinaten
4r> \ Zielkoordinaten
scrMFDB scrMFDB 3 ro_cpyfm
>R >R \ source
0 0 WIDTH 1- WIDTH 1- R> R>
rc>wxy xy>rec \ ... Koordinaten
picMFDB scrMFDB 3 ro_cpyfm
show_mouse ;
\ --------------------------------------------------------
: >original ( -- )
hide_mouse
mainWin work 4w@ 2DUP >R >R
>xyxy 0 0 R> R> 1 1 pair-
scrMFDB oriMFDB 3 ro_cpyfm
show_mouse ;
\ --------------------------------------------------------
: original> ( -- )
hide_mouse
0 0 mainWin work.w 2w@
mainWin work 4w@ >xyxy
oriMFDB scrMFDB 3 ro_cpyfm
show_mouse ;
\ --------------------------------------------------------
: >picture ( -- )
hide_mouse
mainWin work 4w@ 2DUP >R >R
>xyxy 0 0 R> R> 1 1 pair-
scrMFDB mixMFDB 3 ro_cpyfm
show_mouse ;
\ --------------------------------------------------------
: picture> ( -- )
hide_mouse
0 0 mainWin work.w 2w@
mainWin work 4w@ >xyxy
mixMFDB scrMFDB 3 ro_cpyfm
show_mouse ;
\ --------------------------------------------------------
: mouse2rc ( w h mx my ox oy -- r c )
pair- \ Koordinaten normalisieren
ROT q/ >R \ y/h
SWAP q/ R> ; \ x/w
\ --------------------------------------------------------
: ?frei ( -- flag ) clicked 2@ pair+ frei 2@ D= ;
: feldfrei ( -- flag )
FALSE
-1 0 ?frei IF 0= EXIT THEN
1 0 ?frei IF 0= EXIT THEN
0 -1 ?frei IF 0= EXIT THEN
0 1 ?frei IF 0= THEN ;
\ --------------------------------------------------------
: raster ( -- )
schwierig @ IF EXIT THEN
1 sl_color
1 sl_width
1 sl_type
ROWS 1 DO
mainWin work 2w@ I WIDTH q* + OVER
mainWin work.w w@ + OVER line
LOOP
COLS 1 DO
mainWin work.x w@ WIDTH I q* +
mainWin work.y w@ 2DUP
mainWin work.h w@ + line
LOOP ;
\ --------------------------------------------------------
: mischen ( -- )
ROWS 1- COLS 1- frei 2!
0 0
ROWS 0 DO
COLS 0 DO
2DUP 2DUP crc{{ J I }} 4w!
1+
LOOP
DROP 1+ 0
LOOP 2DROP
ROWS COLS q* 2* 0 DO
random.RC frei 2@ 2OVER D=
random.RC frei 2@ 2OVER D= OR
IF
4drop
ELSE
crc{{ 4 PICK 4 PICK }} >R
crc{{ 2pick 2pick }} R> change
swapMFDB
THEN
LOOP
frei 2@ blackbar
raster
>picture ;
\ --------------------------------------------------------
: CreatePicture ( -- )
30 0 DO [ xbios ]
random [ ROWS WIDTH q* ] LITERAL MOD
random [ ROWS WIDTH q* ] LITERAL MOD
mainWin work 4w@ >xyxy 1 s_clip
mainWin work 2w@ pair+
I sf_color
random WIDTH DUP 2/ + MOD 10 MAX circle
LOOP ;
\ --------------------------------------------------------
: LoadPuzzlePic ( -- flag )
picName COUNT R/O OPEN-FILE 0=
IF
TO fh
oriMFDB @ 20 fh READ-FILE 2DROP
oriMFDB @ [ 320 320 * ] LITERAL fh READ-FILE 2DROP
fh CLOSE-FILE DROP
original> \ Bild zeigen
>picture \ zum Zerlegen
TRUE
ELSE
2DROP
FALSE
THEN ;
\ --------------------------------------------------------
: LoadPicture ( -- )
LoadPuzzlePic
IF
original>
ELSE
CreatePicture
>original
THEN
raster
mischen
fertig DROP
1 status !
WRedraw ;
\ --------------------------------------------------------
: DrawPicture ( -- ) picture> raster ;
\ --------------------------------------------------------
: Click ( -- )
WIDTH WIDTH mousexy mainWin work 2w@ mouse2rc clicked 2!
feldfrei
IF
frei 2@ clicked 2@ swapMFDB
crc{{ frei 2@ }}
crc{{ clicked 2@ }} change
clicked 2@ frei 2!
fertig
IF
4 status !
ELSE
raster >picture
THEN
THEN ;
\ --------------------------------------------------------
: Ende ( -- ) RSC_QUIT Alert 1 = IF Die THEN ;
\ --------------------------------------------------------
: NewGame ( -- )
NEWGAME Alert 1 =
IF
0 sf_color [ HIDDEN ]
mainWin work 4w@
4dup >xyxy 1 s_clip clr_area
LoadPicture
ELSE
Ende
THEN ;
\ --------------------------------------------------------
: juhuu ( -- ) DUWIN Alert DROP status off ;
\ --------------------------------------------------------
: Draw ( -- )
status @
CASE
0 OF LoadPicture ENDOF
1 OF DrawPicture ENDOF
3 OF original> 2000 0 evnt_timer 1 status ! WRedraw ENDOF
4 OF juhuu ENDOF
ENDCASE ;
\ --------------------------------------------------------
: help ( -- ) 3 status ! WRedraw ;
\ --------------------------------------------------------
: PrgInfo ( -- )
BG_INFO DIAL_CT WI_DEFDIAL 0 CreateDial
IF
C" Programinfo Puzzle " NULL ROT OpenWindow
THEN ;
\ --------------------------------------------------------
: OpenMainWindow ( -- )
calc_window_size \ max. Size
2DUP \ min w,h
[ WI_DATA WI_FULLED OR WI_CENTER OR ] LITERAL
WIN_TYPE
CreateWindow
IF
TO mainWin
status off
MAINMENU 1 mainWin IsWindowMenu
0 ENDE $1011 mainWin WMenuAction: Ende
0 INFORMATION -1 mainWin WMenuAction: PrgInfo
0 HELP -1 mainWin WMenuAction: help
0 CVH -1 mainWin WMenuAction: NewGame
C" Puzzle " NULL mainWin OpenWindow
['] noop mainWin *move !
['] Draw mainWin *draw !
['] Click mainWin *click !
['] noop mainWin *close !
\ ['] noop mainWin *key !
THEN ;
: main ( -- )
rscName -1 OpenApp \ No Global Menu
IF
InitWindows \ Initialize windows
RC OpenVWork \ Needs a VDI-Workstation
[ MU_KEYBD MU_BUTTON OR MU_MESAG OR ] LITERAL
1 1 1 WatchEvents \ Watch these events
500 0 WatchTimer: noop
allocateMFDBs
IF
OpenMainWindow
HandleEvents
oriMFDB freeMFDB
picMFDB freeMFDB
mixMFDB freeMFDB
THEN
CloseVWork
KillWindows
CloseApp
THEN
APP [IF] return \ Leave programm
[ system ]
mark \ compile marked words
[THEN] ;
APP [IF]
system make puzzle.app
[THEN]