|
|
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 s
Length: 25565 (0x63dd)
Types: TextFile
Names: »sid_main.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/Sun/Sidtool/sid_main.c«
/* sid_main.c
*
* Sid Tool - the Sun Interactive Debugger program.
*
* Written by Rich Burridge - Sun Microsystems Australia (Melbourne).
* Joystick interface and various bug fixes by Dan Heller.
*
* Version 2.1. - April 1987.
*
* No responsibility is taken for any errors inherent either to the code
* or the comments of this program, but if reported to me then an attempt
* will be made to fix them.
*/
#include <stdio.h>
#include <strings.h>
#include <setjmp.h>
#include <fcntl.h>
#include "bltstuff.h"
#include "patchlevel.h"
#include "sidtool.h"
#include <suntool/sunview.h>
#include <suntool/canvas.h>
Canvas canvas ;
Frame base_frame ;
struct pixwin *pw ;
jmp_buf exception ;
int val ;
extern etext() ;
extern restore_screen() ;
Notify_value main_loop() ;
void event_proc() ;
int ms_x, ms_y ;
/* Joystick (really, arrow) symbols */
short left_arrow_dat[] = {
#include "left_arrow.icon"
} ;
mpr_static(joystick_left,64,64,1,left_arrow_dat) ;
short right_arrow_dat[] = {
#include "right_arrow.icon"
} ;
mpr_static(joystick_right,64,64,1,right_arrow_dat) ;
short up_arrow_dat[] = {
#include "up_arrow.icon"
} ;
mpr_static(joystick_up,64,64,1,up_arrow_dat) ;
short down_arrow_dat[] = {
#include "down_arrow.icon"
} ;
mpr_static(joystick_down,64,64,1,down_arrow_dat) ;
short sid_image[] = {
#include "sidtool.icon"
} ;
DEFINE_ICON_FROM_IMAGE(sid_icon,sid_image) ;
struct scorerec allhighscores[11] ;
struct startrec startpos[4] ;
struct bugrec bugs[4] ;
char but_names[7][8] = /* Control panel stuff. */
{
" Auto ",
" Help ",
" Level ",
"Players",
" Quit ",
" Scores",
" Start "
} ;
char names[4][MAXLINE] =
{
"Time Dependencies",
"Uninitialized Variables",
"Fence Posts",
"Multiple Process Interaction"
} ;
char old_key_vals[4][MAXLINE] ; /* Function key string values to save. */
char new_key_vals[4][MAXLINE] = /* Function key values used by sidtool. */
{
"u", /* R8 - UPARROW. */
"d", /* R14 - DOWNARROW. */
"l", /* R10 - LEFTARROW. */
"r", /* R12 - RIGHTARROW. */
} ;
char maze[XSIZE+2][YSIZE+2] ;
char sc,buffer[MAXLINE] ;
char s_name[MAXLINE] ; /* Score file name. */
char a_name[MAXLINE] ; /* Animate file name. */
char h_name[MAXLINE] ; /* Help file name. */
char m_name[MAXLINE] ; /* Maze file name. */
char thisscore[MAXLINE] ; /* User name for new high score. */
char titlestring[MAXLINE] ;
int blueblink,blueincblink,boxx,boxy,fruittime,fruitx,fruity,numplayers ;
int skilllevel,circatchup,pausetime,highplayer,autoscore,lastnumplayers ;
int curbluetime[MAXNUMPLAYERS+1],score[MAXNUMPLAYERS+1] ;
int numcir[MAXNUMPLAYERS+1],fruitmaze[MAXNUMPLAYERS+1] ;
int numdots[MAXNUMPLAYERS+1],fruitchances[MAXNUMPLAYERS+1] ;
int fruitsgotten[MAXNUMPLAYERS+1][9] ;
int highscore,player,cirmx,cirmy,bugssincedot ;
int walls[XSIZE+6][YSIZE+1] ;
int dots[MAXNUMPLAYERS+1][XSIZE+4][YSIZE+2] ;
int tunnel[XSIZE+4][YSIZE+2] ;
int key_stations[9] = {69, 113, 91, 93} ;
int button ; /* Indicates users selection from control panel. */
int c ; /* Contains latest mouse or keyboard interaction. */
int canvasfd ; /* File descriptor for canvas subwindow. */
int curdir ; /* Current direction of the screen. */
int oldcurdir ; /* Old direction of the screen. */
int g,newdir,posx,posy,x,y,nx,ny,count,inc ;
int orgx,orgy,width,height ; /* Position and dimension of window. */
int oldcx,oldcy ; /* Old position of the screen. */
int on = 0 ; /* Current blinking state of score. */
int canvasflags ; /* Used to setup no delay for canvas. */
int credits ; /* Direction of credits if on. */
int cirx ; /* X position of screen during credits. */
int ciry ; /* Y position of screen during credits. */
int dotx ; /* X position of BIGDOT during credits. */
int doty ; /* Y position of BIGDOT during credits. */
int movei,movej,movex ; /* Used to animate screen during credits. */
int progstate ; /* State machine for main loop. */
int redraw; /* If non-zero, then screen should be redrawn. */
int savedstate ; /* State machine value after Ctrl S. */
int scorei ; /* No of chars in high score user name. */
int speed ; /* Class (speed) of this Sun machine. */
int started ; /* Indicates if we have started a game. */
BOOLEAN autoplay ;
BOOLEAN demomode ;
BOOLEAN fruiton ;
BOOLEAN gamestate ; /* State of the game, 1 = remove circle. */
BOOLEAN remove ; /* Whether Sun screen should be removed. */
FILE *fopen() ;
extern int sfunc ; /* Used by SCHRFUNC for cursor function. */
extern struct pixfont *pf ;
drawbox(mx,my)
int mx,my ;
/* Draws a box starting at maze position mx, my. Mx, my should be an
* s or S position in maze. Travels around path until reach x or s.
*/
{
int last ;
last = 'r' ;
PPAUSE(pausetime*10) ;
walls[mx+2][my] = 1 ;
if (maze[mx][my] == 's') drawcorner(mx,my,UR) ;
else if (maze[mx][my] == 'S') ddrawline(mx,my,'r') ;
else if (maze[mx][my] == 'T')
{
ddrawline(mx,my,'l') ;
mx -= 2 ;
last = 'l' ;
}
mx++ ;
for (;;)
{
PPAUSE(pausetime) ;
walls[mx+2][my] = 1 ;
switch (maze[mx][my])
{
case 's' :
case 'S' :
case 'T' : return ;
case 'd' : if (last == 'r') drawcorner(mx,my,RD) ;
else if (last == 'l') drawcorner(mx,my,UR) ;
else ddrawline(mx,my,'d') ;
last = 'd' ;
my++ ;
break ;
case 'l' : if (last == 'd') drawcorner(mx,my,DL) ;
else if (last == 'u') drawcorner(mx,my,RD) ;
else ddrawline(mx,my,'l') ;
last = 'l' ;
mx-- ;
break ;
case 'r' :
case 'R' : if (last == 'u') drawcorner(mx,my,UR) ;
else if (last == 'd') drawcorner(mx,my,LU) ;
else ddrawline(mx,my,maze[mx][my]) ;
last = 'r' ;
mx++ ;
break ;
case 'u' : if (last == 'l') drawcorner(mx,my,LU) ;
else if (last == 'r') drawcorner(mx,my,DL) ;
else ddrawline(mx,my,'u') ;
last = 'u' ;
my-- ;
break ;
case 'x' : ddrawline(mx,my,last) ;
return ;
}
}
}
draw_joystick(dir)
{
pw_rop(canvas_pixwin(canvas), 375, 110, 44, 44, PIX_SRC,
(dir == UP) ? &joystick_up :
(dir == DOWN) ? &joystick_down :
(dir == RIGHT) ? &joystick_right :
&joystick_left, 0, 0) ;
}
setdots(player)
int player ;
{
int x,y ;
for (y = 1; y <= YSIZE; y++)
{
dots[player][0][y] = NODOT ;
dots[player][1][y] = NODOT ;
dots[player][XSIZE+2][y] = NODOT ;
dots[player][XSIZE+3][y] = NODOT ;
for (x = 1; x <= XSIZE; x++)
if (maze[x][y] == '.')
{
dots[player][x+1][y] = SMALLDOT ;
numdots[player]++ ;
}
else if (maze[x][y] == '*')
{
dots[player][x+1][y] = BIGDOT ;
numdots[player]++ ;
}
else dots[player][x+1][y] = NODOT ;
}
}
readallhighscores()
/* Reads all high scores and names into the global table allhighscores.
* If file not found, then sets all high scores to zero.
*/
{
int hsfile,level ;
if ((hsfile = open(s_name,2)) == -1)
{
if ((hsfile = creat(s_name,0777)) == -1)
{
FPRINTF(stderr,"sidtool: unable to create highscores file.\n") ;
return ;
}
for (level = 0; level <= 10; level++)
{
allhighscores[level].score = 0 ;
STRCPY(allhighscores[level].who," ") ;
puths(hsfile,allhighscores[level]) ;
}
}
else
for (level = 1; level <= 10; level++) geths(hsfile,&allhighscores[level]) ;
CLOSE(hsfile) ;
}
writehighscore()
/* If highscore is better than old high score for this skill level then
* asks for player's name and enters name and score into table and writes file.
*/
{
if ((highscore >= allhighscores[skilllevel].score) &&
(highplayer != -1) && (!demomode))
{
clear_screen() ;
SPRINTF(buffer,"Player %1d has beaten the high score for skill level %1d.",
highplayer,skilllevel) ;
WRITELN(100,140,buffer) ;
if (allhighscores[skilllevel].score)
{
SPRINTF(buffer,"The old record was %1d0 held by: %s.",
allhighscores[skilllevel].score,
allhighscores[skilllevel].who) ;
WRITELN(100,160,buffer) ;
}
SPRINTF(buffer,"Type player %1d's name or initials: ",highplayer) ;
WRITELN(100,200,buffer) ;
scorei = 0 ;
c = 0 ;
thisscore[scorei] = '_' ;
thisscore[scorei+1] = '\0' ;
WRITELN(370,200,thisscore) ;
progstate = NEXTLINE ;
}
else progstate = DOCREDIT ;
}
getnewscore(x,y) /* Get new user name for highscore. */
int x,y ;
{
if (c)
{
switch (c)
{
case BSPACE :
case DEL : if (scorei)
{
scorei-- ;
thisscore[scorei] = ' ' ;
thisscore[scorei+1] = '\0' ;
WRITELN(x,y,thisscore) ;
thisscore[scorei] = '\0' ;
}
break ;
case CR : thisscore[scorei] = '\0' ;
if (!scorei) WRITELN(100,220," ** No name given. **") ;
else
{
STRCPY(allhighscores[skilllevel].who,thisscore) ;
savescorefile() ;
progstate = DOCREDIT ;
}
break ;
default : if (c < ' ') break ;
thisscore[scorei++] = c ;
thisscore[scorei] = '\0' ;
WRITELN(x,y,thisscore) ;
}
c = 0 ;
}
}
savescorefile() /* Write away new highscore values. */
{
int fd,level ;
allhighscores[skilllevel].score = highscore ;
if ((fd = open(s_name,1)) == -1)
FPRINTF(stderr,"sidtool: unable to open highscores file.\n") ;
else
{
for (level = 1; level <= 10; level++) puths(fd,allhighscores[level]) ;
CLOSE(fd) ;
}
}
initgame()
{
int i,j ;
if (autoplay) autoscore = 0 ;
pausetime = -skilllevel * 20 + (speed * 100) ;
circatchup = -skilllevel * 4 + 46 ;
highplayer = -1 ;
ms_x = (int) window_get(canvas,WIN_WIDTH) / 2 ;
ms_y = (int) window_get(canvas,WIN_HEIGHT) / 2 ;
for (j = 1; j < MAXNUMPLAYERS; j++)
{
numdots[j] = 0 ;
numcir[j] = 3 ;
fruitchances[j] = 0 ;
setdots(j) ;
curbluetime[j] = 1 + (-skilllevel * 60 + 900) ;
if (!autoplay)
{
score[j] = 0 ;
if (demomode) fruitmaze[j] = 8 ;
else fruitmaze[j] = 1 ;
for (i = 1; i < 8; i++)
if (demomode) fruitsgotten[j][i] = 1 ;
else fruitsgotten[j][i] = 0 ;
}
}
}
showplayerscore(player)
int player ;
{
int x,y ;
SCHRFUNC(RXOR) ;
x = (player % 2) ? 190 : 570 ;
y = (player < 3) ? 25 : 65 ;
SPRINTF(buffer," Player %1d ",player) ;
WRITELN(x,y,buffer) ;
if (!score[player]) WRITELN(x+27,y+15,"0") ;
else
{
SPRINTF(buffer,"%1d0",score[player]) ;
WRITELN(x+27,y+15,buffer) ;
}
SCHRFUNC(RRPL) ;
}
blinkpause()
/* Wait a while and check keyboard for commands while blinking current players score. */
{
int i,j ;
on = 1 ;
if (autoplay) LONGPAUSE()
else
for (i = 1; i <= 16; i++)
{
showplayerscore(player) ;
on = !on ;
for (j = 0; j < 10; j++) LONGPAUSE() ;
}
}
doinc(dir,posx,posy,mx,my,x,y,nx,ny)
int dir,posx,posy,mx,my,*x,*y,*nx,*ny ;
{
register int status,tx,ty ;
*x = posx ;
*y = posy ;
tx = mx ;
ty = my ;
switch (dir)
{
case UP : *y = posy - 2 ;
ty = my - 1 ;
break ;
case DOWN : *y = posy + 2 ;
ty = my + 1 ;
break ;
case LEFT : *x = posx - 2 ;
tx = mx - 1 ;
break ;
case RIGHT : *x = posx + 2 ;
tx = mx + 1 ;
break ;
}
UNTRANSPT(*x,*y,*nx,*ny) ;
if (tx == -2) tx = XSIZE + 2 ;
else if (tx == XSIZE + 3) tx = -1 ;
status = 1 ;
if ((*nx == -2) && (dir == LEFT))
{
*nx = XSIZE + 2 ;
TRANSPT(*nx,*ny,*x,*y) ;
}
else if ((*nx == XSIZE + 3) && (dir == RIGHT))
{
*nx = -1 ;
TRANSPT(*nx,*ny,*x,*y) ;
}
else if (!(walls[*nx+2][*ny] ||
(GCENTERED(posx,posy) && walls[tx+2][ty]))) /* do nothing. */ ;
else status = 0 ;
return(status) ;
}
headto(destx,desty,scrx,scry,mx,my,dir,x,y,nx,ny) /* Only called when GCENTERED. */
int *dir,destx,desty,scrx,scry,mx,my,*x,*y,*nx,*ny ;
{
int dirar[5],rev,i,s,xinc,yinc ;
rev = REVERSEDIR(*dir) ;
xinc = mx - destx ;
yinc = my - desty ;
if (abs(xinc) > abs(yinc)) s = 2 ;
else s = 1 ;
if (xinc < 0)
{
dirar[3-s] = RIGHT ;
dirar[s+2] = LEFT ;
}
else
{
dirar[3-s] = LEFT ;
dirar[s+2] = RIGHT ;
}
if (yinc < 0)
{
dirar[s] = DOWN ;
dirar[5-s] = UP ;
}
else
{
dirar[s] = UP ;
dirar[5-s] = DOWN ;
}
for (i = 1; i <= 4; i++) /* Adjust so reverse is last choice. */
if (dirar[i] == rev)
{
for (s = i; s <= 3; s++) dirar[s] = dirar[s+1] ;
dirar[4] = rev ;
break ;
}
for (s = 1; s <= 4; s++)
{
if (checkinc(dirar[s],mx,my))
{
*dir = dirar[s] ;
DOINC(*dir,scrx,scry,mx,my,x,y,nx,ny) ;
return ;
}
}
}
dorandomdir(dir,scrx,scry,mx,my,x,y,nx,ny,ranrange)
int dir,scrx,scry,mx,my,*x,*y,*nx,*ny,ranrange ;
{
int i,test,newdir,rev,status ;
test = randomrange(1,ranrange) ;
rev = REVERSEDIR(dir) ;
if ((test == 1) || (!checkinc(dir,mx,my)))
{
newdir = randomrange(0,3) ;
for (i = 0; i <= 3; i++)
{
if (newdir != rev)
if (checkinc(newdir,mx,my))
{
status = newdir ;
DOINC(newdir,scrx,scry,mx,my,x,y,nx,ny) ;
return(status) ;
}
newdir = (newdir + 1) % 4 ;
}
}
else
{
DOINC(dir,scrx,scry,mx,my,x,y,nx,ny) ;
status = dir ;
}
return(status) ;
}
updatebugs()
/* Move each bug one bit in appropriate direction; change direction if appropriate. */
{
register struct bugrec *g ;
int bemean ;
for (g = &bugs[POKEY]; g <= &bugs[SHADOW]; g++)
{
g->count++ ;
if (g->inbox || g->intunnel)
if (g->count % 2 == 0) return ; /* Slow in box. */
if (g->bluetime > 0)
{
if (g->count % CATCHUP == 0) return ; /* Go slower if blue. */
drawbug(g) ; /* Erase old before change blueTime. */
g->bluetime-- ;
}
else drawbug(g) ; /* Erase old. */
if (g->count % 7 == 0) g->pic = (g->pic + 1) % 2 ;
if (GCENTERED(g->scrx,g->scry))
{
g->intunnel = tunnel[g->mx+1][g->my] ;
if (!g->bluetime)
if (skilllevel < 5)
bemean = randomrange(0,10-skilllevel-GIND(g)) == 0 ;
else bemean = randomrange(0,skilllevel-5+GIND(g)) != 0 ;
else bemean = FALSE ;
if (g->inbox)
if ((g->mx == boxx) && (g->my == boxy)) g->inbox = FALSE ;
if (g->eyesonly)
{
if ((!g->enteringbox) && (g->mx == boxx) && (g->my == boxy))
{
g->dir = DOWN ;
g->enteringbox = TRUE ;
DOINC(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny) ;
}
else if (g->enteringbox)
if ((g->my > boxy + 2) &&
(!doinc(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny)))
{
g->dir = UP ;
g->enteringbox = FALSE ;
g->inbox = TRUE ;
g->eyesonly = FALSE ;
DOINC(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny) ;
}
else DOINC(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny) ;
else headto(boxx,boxy,g->scrx,g->scry,g->mx,g->my,&g->dir,&x,&y,&nx,&ny) ;
}
else if (g->boxtime) /* Inbox should be true also. */
{
g->boxtime-- ;
if (g->boxtime < 0) /* Heading to exit. */
{
if (g->mx == boxx) /* Found exit. */
{
g->boxtime = 0 ;
g->dir = UP ;
DOINC(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny) ;
}
else headto(boxx,boxy,g->scrx,g->scry,g->mx,g->my,&g->dir,&x,&y,&nx,&ny) ;
}
else if (!g->boxtime) /* Start heading to exit. */
{
g->boxtime = -1 ;
headto(boxx,boxy,g->scrx,g->scry,g->mx,g->my,&g->dir,&x,&y,&nx,&ny) ;
}
else if (!doinc(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny))
{
g->dir = REVERSEDIR(g->dir) ; /* Bounce up a down a while. */
DOINC(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny) ;
}
}
else if (g->inbox) /* Must be leaving the box; just keep going. */
DOINC(g->dir,g->scrx,g->scry,
g->mx,g->my,&x,&y,&nx,&ny) ;
else if (bemean) /* Chase the circle. */
headto(cirmx,cirmy,g->scrx,g->scry,g->mx,g->my,&g->dir,&x,&y,&nx,&ny) ;
else g->dir = dorandomdir(g->dir,g->scrx,g->scry,
g->mx,g->my,&x,&y,&nx,&ny,3) ;
}
else DOINC(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny) ;
g->scrx = x ;
g->scry = y ;
g->mx = nx ;
g->my = ny ;
drawbug(g) ; /* Draw new. */
}
}
main(argc,argv)
int argc ;
char *argv[] ;
{
get_options(argc,argv) ; /* Get command line options. */
function_keys(KEY_SET) ; /* Set direction arrow function keys. */
if (!(pf = pf_open("/usr/lib/fonts/fixedwidthfonts/screen.r.14")) &&
!(pf = pf_default()))
{
FPRINTF("Can't open screen.r.14 font.\n") ;
function_keys(KEY_RESET) ;
exit(1) ;
}
base_frame = window_create(NULL, FRAME,
FRAME_LABEL, titlestring,
FRAME_ICON, &sid_icon,
WIN_X, orgx,
WIN_Y, orgy,
WIN_WIDTH, width,
WIN_HEIGHT, height,
WIN_FONT, pf,
FRAME_ARGS, argc, argv,
0) ;
canvas = window_create(base_frame, CANVAS,
CANVAS_RETAINED, FALSE,
CANVAS_REPAINT_PROC, restore_screen,
WIN_EVENT_PROC, event_proc,
0) ;
window_set(canvas, WIN_CONSUME_PICK_EVENTS, WIN_MOUSE_BUTTONS,
WIN_UP_EVENTS,
0,
WIN_CONSUME_KBD_EVENTS, WIN_ASCII_EVENTS,
KEY_RIGHT(8),
KEY_RIGHT(10),
KEY_RIGHT(12),
KEY_RIGHT(14),
WIN_UP_EVENTS,
0) ;
pw = canvas_pixwin(canvas) ;
/* Set up no delay for events within the canvas. */
canvasfd = (int) window_get(canvas,WIN_FD) ;
canvasflags = fcntl(canvasfd,F_GETFL,0) ;
canvasflags |= FNDELAY ;
FCNTL(canvasfd,F_SETFL,canvasflags) ;
sfunc = PIX_SRC ; /* Used by WRITELN. */
iocursormode(OFFCURSOR) ;
initrandom() ;
numplayers = 1 ;
skilllevel = 5 ;
lastnumplayers = 1 ;
autoplay = FALSE ;
initgame() ;
initialize() ;
redraw = 0 ; /* Don't redraw the screen, the first time. */
started = 1 ;
autoplay = 1 ;
progstate = STARTUP ;
(void) notify_set_itimer_func(base_frame, main_loop, ITIMER_REAL,
&NOTIFY_POLLING_ITIMER, ((struct itimerval *) 0)) ;
window_main_loop(base_frame) ;
function_keys(KEY_RESET) ; /* Restore direction arrow function keys. */
exit(0) ;
}
/*ARGSUSED*/
void
event_proc(window,event,arg)
Window *window ;
Event *event ;
caddr_t arg ;
{
int x,y ; /* Position of mouse when button pressed. */
int i ;
if (event_is_ascii(event) ||
!autoplay && (event->ie_code == MS_RIGHT || event->ie_code == LOC_MOVE))
{
c = event_id(event) ;
if (progstate == NEXTLINE) return ;
if ((c == DEL) && !demomode)
{
c = 0 ;
started = 0 ;
progstate = DELHIT ;
return ;
}
else if (c == CTRLS || progstate != CTRLSHIT &&
event_is_down(event) && c == MS_RIGHT)
{
savedstate = progstate ;
progstate = CTRLSHIT ;
return ;
}
else if (c == CTRLQ || progstate == CTRLSHIT &&
event_is_down(event) && c == MS_RIGHT)
{
progstate = savedstate ;
return ;
}
else if (!autoplay && progstate != CTRLSHIT)
{
if (c == LOC_MOVE)
{
x = event_x(event) - ms_x ;
y = event_y(event) - ms_y ;
if (abs(x) <= 4 && abs(y) <= 4) /* Move at least 4 pixels */
return ;
if (abs(x) > abs(y))
if (x > 0) c = 'r' ;
else c = 'l' ;
else
if (y > 0) c = 'd' ;
else c = 'u' ;
/* Return the mouse to the middle of the playing board */
if (progstate == MAKEPLAY && !autoplay &&
(event_x(event) != ms_x || event_y(event) != ms_y))
window_set(canvas, WIN_MOUSE_XY, ms_x, ms_y, 0) ;
}
sc = c ;
}
}
else if (event_is_down(event) && event_is_button(event))
{
x = event_x(event) ;
y = event_y(event) ;
if (y > BUTYOFF && y < BUTYOFF+2*SQUARE)
for (i = BUT_AUTO; i <= BUT_START; i++)
if (x > BUTXOFF+i*100 && x < BUTXOFF+i*100+120) c = i+2 ;
}
}
/*ARGSUSED*/
static Notify_value
main_loop(client, itimer_type)
Notify_client client ;
int itimer_type ;
{
int i ;
switch (progstate)
{
case STARTUP : SETJMP(exception) ;
if (progstate) break ;
else progstate = INITGAME ;
break ;
case INITGAME : initgame() ;
progstate = PLAY ;
break ;
case PLAY : play() ;
progstate = DOPLAY ;
break ;
case DOPLAY : doplay() ;
progstate = MAKEPLAY ;
break ;
case MAKEPLAY : make_play() ;
break ;
case DOREST : numplayers = 1 ;
progstate = HIGHSCORE ;
break ;
case HIGHSCORE : writehighscore() ;
break ;
case NEXTLINE : getnewscore(365,200) ;
break ;
case DOCREDIT : if (!demomode)
{
dohighscores() ;
WRITELN(5,860,"Type DEL to begin") ;
for (i = 1; i <= 200; i++) LONGPAUSE() ;
}
docredits() ;
break ;
case MOVELEFT : move_left() ;
break ;
case MOVERIGHT : move_right() ;
break ;
case DELHIT : autoplay = FALSE ;
iocursormode(TRACKCURSOR) ;
make_control_panel() ;
display_settings() ;
progstate = GETBUT ;
break ;
case GETBUT : get_button_option() ;
break ;
case MAKESEL : make_selection() ;
break ;
case DOLEAVE : SCHRFUNC(RRPL) ;
autoplay = TRUE ;
progstate = DOREST ;
break ;
case RESETGAME : remove = gamestate ;
progstate = DOPLAY ;
break ;
case CTRLSHIT : break ;
}
}