Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!utgpu!water!watnot!watmath!clyde!rutgers!lll-lcc!seismo!munnari!moncskermit!trldeity!trlamct!sunk!richb From: richb@sunk.UUCP Newsgroups: net.sources.games Subject: Sid Tool (Pacman) Part 5 of 5. Message-ID: <126@sunk.oz> Date: Sun, 12-Apr-87 01:13:54 EST Article-I.D.: sunk.126 Posted: Sun Apr 12 01:13:54 1987 Date-Received: Tue, 14-Apr-87 23:36:19 EST Organization: Sun Microsystems Australia Lines: 855 Keywords: Sun O/S v3.2 or later. ----------CUT HERE-----------CUT HERE------- #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh sid_main.c <<'END_OF_sid_main.c' X X/* sid_main.c X * X * Sid Tool - the Sun Interactive Debugger program. X * X * Written by Rich Burridge - Sun Microsystems Australia (Melbourne). X * X * Version 2.1. - April 1987. X * X * No responsibility is taken for any errors inherent either to the code X * or the comments of this program, but if reported to me then an attempt X * will be made to fix them. X */ X X#include X#include X#include X#include X#include "bltstuff.h" X#include "patchlevel.h" X#include "sidtool.h" X#include X#include X XCanvas canvas ; XFrame base_frame ; XPixwin *pw ; X Xjmp_buf exception ; Xint val ; X Xextern etext() ; Xextern restore_screen() ; X XNotify_value main_loop() ; Xvoid event_proc() ; X Xshort sid_image[] = { X#include "sidtool.icon" X} ; XDEFINE_ICON_FROM_IMAGE(sid_icon,sid_image) ; X Xstruct scorerec allhighscores[11] ; Xstruct startrec startpos[4] ; Xstruct bugrec bugs[4] ; X Xchar but_names[7][8] = /* Control panel stuff. */ X { X " Auto ", X " Help ", X " Level ", X "Players", X " Quit ", X " Scores", X " Start " X } ; X Xchar names[4][MAXLINE] = X { X "Time Dependencies", X "Uninitialized Variables", X "Fence Posts", X "Multiple Process Interaction" X } ; X Xchar old_key_vals[9][MAXLINE] ; /* Function key string values to save. */ Xchar new_key_vals[9][MAXLINE] = /* Function key values used by SIDtool. */ X { X "", /* R7 */ X "u", /* R8 */ X "", /* R9 */ X "l", /* R10 */ X "", /* R11 */ X "r", /* R12 */ X "", /* R13 */ X "d", /* R14 */ X "" /* R15 */ X } ; X Xchar maze[XSIZE+2][YSIZE+2] ; Xchar sc,buffer[MAXLINE] ; Xchar s_name[MAXLINE] ; /* Score file name. */ Xchar a_name[MAXLINE] ; /* Animate file name. */ Xchar h_name[MAXLINE] ; /* Help file name. */ Xchar m_name[MAXLINE] ; /* Maze file name. */ Xchar thisscore[MAXLINE] ; /* User name for new high score. */ Xchar titlestring[MAXLINE] ; X Xint blueblink,blueincblink,boxx,boxy,fruittime,fruitx,fruity,numplayers ; Xint skilllevel,circatchup,pausetime,highplayer,autoscore,lastnumplayers ; Xint curbluetime[MAXNUMPLAYERS+1],score[MAXNUMPLAYERS+1] ; Xint numcir[MAXNUMPLAYERS+1],fruitmaze[MAXNUMPLAYERS+1] ; Xint numdots[MAXNUMPLAYERS+1],fruitchances[MAXNUMPLAYERS+1] ; Xint fruitsgotten[MAXNUMPLAYERS+1][9] ; Xint highscore,player,cirmx,cirmy,bugssincedot ; Xint walls[XSIZE+6][YSIZE+1] ; Xint dots[MAXNUMPLAYERS+1][XSIZE+4][YSIZE+2] ; Xint tunnel[XSIZE+4][YSIZE+2] ; X Xint key_stations[9] = {68, 69, 70, 91, 92, 93, 112, 113, 114} ; X Xint button ; /* Indicates users selection from control panel. */ Xint c ; /* Contains latest mouse or keyboard interaction. */ Xint canvasfd ; /* File descriptor for canvas subwindow. */ Xint curdir ; /* Current direction of the screen. */ Xint oldcurdir ; /* Old direction of the screen. */ Xint g,newdir,posx,posy,x,y,nx,ny,count,inc ; Xint orgx,orgy,width,height ; /* Position and dimension of window. */ Xint oldcx,oldcy ; /* Old position of the screen. */ Xint on = 0 ; /* Current blinking state of score. */ Xint canvasflags ; /* Used to setup no delay for canvas. */ Xint credits ; /* Direction of credits if on. */ Xint cirx ; /* X position of screen during credits. */ Xint ciry ; /* Y position of screen during credits. */ Xint dotx ; /* X position of BIGDOT during credits. */ Xint doty ; /* Y position of BIGDOT during credits. */ Xint movei,movej,movex ; /* Used to animate screen during credits. */ Xint progstate ; /* State machine for main loop. */ Xint redraw; /* If non-zero, then screen should be redrawn. */ Xint savedstate ; /* State machine value after Ctrl S. */ Xint scorei ; /* No of chars in high score user name. */ Xint speed ; /* Class (speed) of this Sun machine. */ Xint started ; /* Indicates if we have started a game. */ X XBOOLEAN autoplay ; XBOOLEAN demomode ; XBOOLEAN fruiton ; XBOOLEAN gamestate ; /* State of the game, 1 = remove circle. */ XBOOLEAN remove ; /* Whether Sun screen should be removed. */ X XFILE *fopen() ; X Xextern int sfunc ; /* Used by SCHRFUNC for cursor function. */ Xextern Pixfont *pf ; X X Xdrawbox(mx,my) Xint mx,my ; X X/* Draws a box starting at maze position mx, my. Mx, my should be an X * s or S position in maze. Travels around path until reach x or s. X */ X X{ X int last ; X X last = 'r' ; X PPAUSE(pausetime*20) ; X walls[mx+2][my] = 1 ; X if (maze[mx][my] == 's') drawcorner(mx,my,UR) ; X else if (maze[mx][my] == 'S') ddrawline(mx,my,'r') ; X else if (maze[mx][my] == 'T') X { X ddrawline(mx,my,'l') ; X mx -= 2 ; X last = 'l' ; X } X mx++ ; X for (;;) X { X PPAUSE(2*pausetime) ; X walls[mx+2][my] = 1 ; X switch (maze[mx][my]) X { X case 's' : X case 'S' : X case 'T' : return ; X case 'd' : if (last == 'r') drawcorner(mx,my,RD) ; X else if (last == 'l') drawcorner(mx,my,UR) ; X else ddrawline(mx,my,'d') ; X last = 'd' ; X my++ ; X break ; X case 'l' : if (last == 'd') drawcorner(mx,my,DL) ; X else if (last == 'u') drawcorner(mx,my,RD) ; X else ddrawline(mx,my,'l') ; X last = 'l' ; X mx-- ; X break ; X case 'r' : X case 'R' : if (last == 'u') drawcorner(mx,my,UR) ; X else if (last == 'd') drawcorner(mx,my,LU) ; X else ddrawline(mx,my,maze[mx][my]) ; X last = 'r' ; X mx++ ; X break ; X case 'u' : if (last == 'l') drawcorner(mx,my,LU) ; X else if (last == 'r') drawcorner(mx,my,DL) ; X else ddrawline(mx,my,'u') ; X last = 'u' ; X my-- ; X break ; X case 'x' : ddrawline(mx,my,last) ; X return ; X } X } X} X X Xsetdots(player) Xint player ; X X{ X int x,y ; X X for (y = 1; y <= YSIZE; y++) X { X dots[player][0][y] = NODOT ; X dots[player][1][y] = NODOT ; X dots[player][XSIZE+2][y] = NODOT ; X dots[player][XSIZE+3][y] = NODOT ; X for (x = 1; x <= XSIZE; x++) X if (maze[x][y] == '.') X { X dots[player][x+1][y] = SMALLDOT ; X numdots[player]++ ; X } X else if (maze[x][y] == '*') X { X dots[player][x+1][y] = BIGDOT ; X numdots[player]++ ; X } X else dots[player][x+1][y] = NODOT ; X } X} X X Xreadallhighscores() X X/* Reads all high scores and names into the global table allhighscores. X * If file not found, then sets all high scores to zero. X */ X X{ X int hsfile,level ; X X if ((hsfile = open(s_name,2)) == -1) X { X if ((hsfile = creat(s_name,0777)) == -1) X { X FPRINTF(stderr,"sidtool: unable to create highscores file.\n") ; X return ; X } X X for (level = 0; level <= 10; level++) X { X allhighscores[level].score = 0 ; X STRCPY(allhighscores[level].who," ") ; X puths(hsfile,allhighscores[level]) ; X } X } X else X for (level = 1; level <= 10; level++) geths(hsfile,&allhighscores[level]) ; X CLOSE(hsfile) ; X} X X Xwritehighscore() X X/* If highscore is better than old high score for this skill level then X * asks for player's name and enters name and score into table and writes file. X */ X X{ X if ((highscore >= allhighscores[skilllevel].score) && X (highplayer != -1) && (!demomode)) X { X clear_screen() ; X SPRINTF(buffer,"Player %1d has beaten the high score for skill level %1d.", X highplayer,skilllevel) ; X WRITELN(100,140,buffer) ; X if (allhighscores[skilllevel].score) X { X SPRINTF(buffer,"The old record was %1d0 held by: %s.", X allhighscores[skilllevel].score, X allhighscores[skilllevel].who) ; X WRITELN(100,160,buffer) ; X } X SPRINTF(buffer,"Type player %1d's name or initials: ",highplayer) ; X WRITELN(100,200,buffer) ; X scorei = 0 ; X c = 0 ; X thisscore[scorei] = '_' ; X thisscore[scorei+1] = '\0' ; X WRITELN(370,200,thisscore) ; X progstate = NEXTLINE ; X } X else progstate = DOCREDIT ; X} X X Xgetnewscore(x,y) /* Get new user name for highscore. */ Xint x,y ; X X{ X if (c) X { X switch (c) X { X case BSPACE : X case DEL : if (scorei) X { X scorei-- ; X thisscore[scorei] = ' ' ; X thisscore[scorei+1] = '\0' ; X WRITELN(x,y,thisscore) ; X thisscore[scorei] = '\0' ; X } X break ; X case CR : thisscore[scorei] = '\0' ; X if (!scorei) WRITELN(100,220," ** No name given. **") ; X else X { X STRCPY(allhighscores[skilllevel].who,thisscore) ; X savescorefile() ; X progstate = DOCREDIT ; X } X break ; X default : if (c < ' ') break ; X thisscore[scorei++] = c ; X thisscore[scorei] = '\0' ; X WRITELN(x,y,thisscore) ; X } X c = 0 ; X } X} X X Xsavescorefile() /* Write away new highscore values. */ X X{ X int fd,level ; X X allhighscores[skilllevel].score = highscore ; X if ((fd = open(s_name,1)) == -1) X FPRINTF(stderr,"sidtool: unable to open highscores file.\n") ; X else X { X for (level = 1; level <= 10; level++) puths(fd,allhighscores[level]) ; X CLOSE(fd) ; X } X} X X Xinitgame() X X{ X int i,j ; X X if (autoplay) autoscore = 0 ; X pausetime = -skilllevel * 20 + (speed * 100) ; X circatchup = -skilllevel * 4 + 46 ; X highplayer = -1 ; X for (j = 1; j < MAXNUMPLAYERS; j++) X { X numdots[j] = 0 ; X numcir[j] = 3 ; X fruitchances[j] = 0 ; X setdots(j) ; X curbluetime[j] = 1 + (-skilllevel * 60 + 900) ; X if (!autoplay) X { X score[j] = 0 ; X if (demomode) fruitmaze[j] = 8 ; X else fruitmaze[j] = 1 ; X for (i = 1; i < 8; i++) X if (demomode) fruitsgotten[j][i] = 1 ; X else fruitsgotten[j][i] = 0 ; X } X } X} X X Xshowplayerscore(player) Xint player ; X X{ X int x,y ; X X SCHRFUNC(RXOR) ; X x = (player % 2) ? 190 : 570 ; X y = (player < 3) ? 25 : 65 ; X SPRINTF(buffer," Player %1d ",player) ; X WRITELN(x,y,buffer) ; X if (!score[player]) WRITELN(x+27,y+15,"0") ; X else X { X SPRINTF(buffer,"%1d0",score[player]) ; X WRITELN(x+27,y+15,buffer) ; X } X SCHRFUNC(RRPL) ; X} X X Xblinkpause() X X/* Wait a while and check keyboard for commands while blinking current players score. */ X X{ X int i,j ; X X on = 1 ; X if (!autoplay) X for (i = 1; i <= 16; i++) X { X showplayerscore(player) ; X on = !on ; X for (j = 0; j < 10; j++) LONGPAUSE() ; X } X} X X Xdoinc(dir,posx,posy,mx,my,x,y,nx,ny) Xint dir,posx,posy,mx,my,*x,*y,*nx,*ny ; X X{ X register int status,tx,ty ; X X *x = posx ; X *y = posy ; X tx = mx ; X ty = my ; X X switch (dir) X { X case UP : *y = posy - 2 ; X ty = my - 1 ; X break ; X case DOWN : *y = posy + 2 ; X ty = my + 1 ; X break ; X case LEFT : *x = posx - 2 ; X tx = mx - 1 ; X break ; X case RIGHT : *x = posx + 2 ; X tx = mx + 1 ; X break ; X } X UNTRANSPT(*x,*y,*nx,*ny) ; X if (tx == -2) tx = XSIZE + 2 ; X else if (tx == XSIZE + 3) tx = -1 ; X status = 1 ; X X if ((*nx == -2) && (dir == LEFT)) X { X *nx = XSIZE + 2 ; X TRANSPT(*nx,*ny,*x,*y) ; X } X else if ((*nx == XSIZE + 3) && (dir == RIGHT)) X { X *nx = -1 ; X TRANSPT(*nx,*ny,*x,*y) ; X } X else if (!(walls[*nx+2][*ny] || X (GCENTERED(posx,posy) && walls[tx+2][ty]))) /* do nothing. */ ; X else status = 0 ; X return(status) ; X} X X Xheadto(destx,desty,scrx,scry,mx,my,dir,x,y,nx,ny) /* Only called when GCENTERED. */ Xint *dir,destx,desty,scrx,scry,mx,my,*x,*y,*nx,*ny ; X X{ X int dirar[5],rev,i,s,xinc,yinc ; X X rev = REVERSEDIR(*dir) ; X xinc = mx - destx ; X yinc = my - desty ; X if (abs(xinc) > abs(yinc)) s = 2 ; X else s = 1 ; X if (xinc < 0) X { X dirar[3-s] = RIGHT ; X dirar[s+2] = LEFT ; X } X else X { X dirar[3-s] = LEFT ; X dirar[s+2] = RIGHT ; X } X if (yinc < 0) X { X dirar[s] = DOWN ; X dirar[5-s] = UP ; X } X else X { X dirar[s] = UP ; X dirar[5-s] = DOWN ; X } X X for (i = 1; i <= 4; i++) /* Adjust so reverse is last choice. */ X if (dirar[i] == rev) X { X for (s = i; s <= 3; s++) dirar[s] = dirar[s+1] ; X dirar[4] = rev ; X break ; X } X X for (s = 1; s <= 4; s++) X { X if (checkinc(dirar[s],mx,my)) X { X *dir = dirar[s] ; X DOINC(*dir,scrx,scry,mx,my,x,y,nx,ny) ; X return ; X } X } X} X X Xdorandomdir(dir,scrx,scry,mx,my,x,y,nx,ny,ranrange) Xint dir,scrx,scry,mx,my,*x,*y,*nx,*ny,ranrange ; X X{ X int i,test,newdir,rev,status ; X X test = randomrange(1,ranrange) ; X rev = REVERSEDIR(dir) ; X if ((test == 1) || (!checkinc(dir,mx,my))) X { X newdir = randomrange(0,3) ; X for (i = 0; i <= 3; i++) X { X if (newdir != rev) X if (checkinc(newdir,mx,my)) X { X status = newdir ; X DOINC(newdir,scrx,scry,mx,my,x,y,nx,ny) ; X return(status) ; X } X newdir = (newdir + 1) % 4 ; X } X } X else X { X DOINC(dir,scrx,scry,mx,my,x,y,nx,ny) ; X status = dir ; X } X return(status) ; X} X X Xupdatebugs() X X/* Move each bug one bit in appropriate direction; change direction if appropriate. */ X X{ X register struct bugrec *g ; X int bemean ; X X for (g = &bugs[POKEY]; g <= &bugs[SHADOW]; g++) X { X g->count++ ; X if (g->inbox || g->intunnel) X if (g->count % 2 == 0) return ; /* Slow in box. */ X X if (g->bluetime > 0) X { X if (g->count % CATCHUP == 0) return ; /* Go slower if blue. */ X drawbug(g) ; /* Erase old before change blueTime. */ X g->bluetime-- ; X } X else drawbug(g) ; /* Erase old. */ X X if (g->count % 7 == 0) g->pic = (g->pic + 1) % 2 ; X X if (GCENTERED(g->scrx,g->scry)) X { X g->intunnel = tunnel[g->mx+1][g->my] ; X X if (!g->bluetime) X if (skilllevel < 5) X bemean = randomrange(0,10-skilllevel-GIND(g)) == 0 ; X else bemean = randomrange(0,skilllevel-5+GIND(g)) != 0 ; X else bemean = FALSE ; X X if (g->inbox) X if ((g->mx == boxx) && (g->my == boxy)) g->inbox = FALSE ; X X if (g->eyesonly) X { X if ((!g->enteringbox) && (g->mx == boxx) && (g->my == boxy)) X { X g->dir = DOWN ; X g->enteringbox = TRUE ; X DOINC(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny) ; X } X else if (g->enteringbox) X if ((g->my > boxy + 2) && X (!doinc(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny))) X { X g->dir = UP ; X g->enteringbox = FALSE ; X g->inbox = TRUE ; X g->eyesonly = FALSE ; X DOINC(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny) ; X } X else DOINC(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny) ; X else headto(boxx,boxy,g->scrx,g->scry,g->mx,g->my,&g->dir,&x,&y,&nx,&ny) ; X } X else if (g->boxtime) /* Inbox should be true also. */ X { X g->boxtime-- ; X if (g->boxtime < 0) /* Heading to exit. */ X { X if (g->mx == boxx) /* Found exit. */ X { X g->boxtime = 0 ; X g->dir = UP ; X DOINC(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny) ; X } X else headto(boxx,boxy,g->scrx,g->scry,g->mx,g->my,&g->dir,&x,&y,&nx,&ny) ; X } X else if (!g->boxtime) /* Start heading to exit. */ X { X g->boxtime = -1 ; X headto(boxx,boxy,g->scrx,g->scry,g->mx,g->my,&g->dir,&x,&y,&nx,&ny) ; X } X else if (!doinc(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny)) X { X g->dir = REVERSEDIR(g->dir) ; /* Bounce up a down a while. */ X DOINC(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny) ; X } X } X else if (g->inbox) /* Must be leaving the box; just keep going. */ X DOINC(g->dir,g->scrx,g->scry, X g->mx,g->my,&x,&y,&nx,&ny) ; X else if (bemean) /* Chase the circle. */ X headto(cirmx,cirmy,g->scrx,g->scry,g->mx,g->my,&g->dir,&x,&y,&nx,&ny) ; X else g->dir = dorandomdir(g->dir,g->scrx,g->scry, X g->mx,g->my,&x,&y,&nx,&ny,3) ; X } X else DOINC(g->dir,g->scrx,g->scry,g->mx,g->my,&x,&y,&nx,&ny) ; X X g->scrx = x ; X g->scry = y ; X g->mx = nx ; X g->my = ny ; X drawbug(g) ; /* Draw new. */ X } X} X X Xmain(argc,argv) Xint argc ; Xchar *argv[] ; X X{ X get_options(argc,argv) ; /* Get command line options. */ X function_keys(KEY_SET) ; /* Set direction arrow function keys. */ X X base_frame = window_create(NULL, FRAME, X FRAME_LABEL, titlestring, X FRAME_ICON, &sid_icon, X WIN_X, orgx, X WIN_Y, orgy, X WIN_WIDTH, width, X WIN_HEIGHT, height, X FRAME_ARGS, argc, argv, X 0) ; X canvas = window_create(base_frame, CANVAS, X CANVAS_RETAINED, FALSE, X CANVAS_FAST_MONO, TRUE, X CANVAS_REPAINT_PROC, restore_screen, X WIN_EVENT_PROC, event_proc, X 0) ; X X window_set(canvas, WIN_CONSUME_KBD_EVENTS, WIN_ASCII_EVENTS, 0) ; X window_set(canvas, WIN_CONSUME_KBD_EVENTS, WIN_LEFT_KEYS, 0) ; X window_set(canvas,WIN_IGNORE_PICK_EVENT,LOC_MOVE,0) ; X X pf = pf_default() ; X pw = canvas_pixwin(canvas) ; X X/* Set up no delay for events within the canvas. */ X canvasfd = (int) window_get(canvas,WIN_FD) ; X canvasflags = fcntl(canvasfd,F_GETFL,0) ; X canvasflags |= FNDELAY ; X FCNTL(canvasfd,F_SETFL,canvasflags) ; X X sfunc = PIX_SRC ; /* Used by WRITELN. */ X iocursormode(OFFCURSOR) ; X X initrandom() ; X numplayers = 1 ; X skilllevel = 5 ; X lastnumplayers = 1 ; X autoplay = FALSE ; X initgame() ; X initialize() ; X redraw = 0 ; /* Don't redraw the screen, the first time. */ X started = 1 ; X autoplay = 1 ; X progstate = STARTUP ; X X (void) notify_set_itimer_func(base_frame, main_loop, ITIMER_REAL, X &NOTIFY_POLLING_ITIMER, ((struct itimerval *) 0)) ; X window_main_loop(base_frame) ; X function_keys(KEY_RESET) ; /* Restore direction arrow function keys. */ X exit(0) ; X} X X X/*ARGSUSED*/ Xvoid Xevent_proc(window,event,arg) XWindow *window ; XEvent *event ; Xcaddr_t arg ; X X{ X int x,y ; /* Position of mouse when button pressed. */ X int i ; X X if (event_is_ascii(event)) X { X c = event_id(event) ; X if (progstate == NEXTLINE) return ; X if ((c == DEL) && !demomode) X { X c = 0 ; X started = 0 ; X progstate = DELHIT ; X return ; X } X else if (c == CTRLS) X { X savedstate = progstate ; X progstate = CTRLSHIT ; X return ; X } X else if (c == CTRLQ) X { X progstate = savedstate ; X return ; X } X else if (!autoplay) sc = c ; X } X else if (event_is_down(event) && event_is_button(event)) X { X x = event_x(event) ; X y = event_y(event) ; X if (y > BUTYOFF && y < BUTYOFF+2*SQUARE) X for (i = BUT_AUTO; i <= BUT_START; i++) X if (x > BUTXOFF+i*100 && x < BUTXOFF+i*100+120) c = i+2 ; X } X} X X X/*ARGSUSED*/ Xstatic Notify_value Xmain_loop(client, itimer_type) XNotify_client client ; Xint itimer_type ; X X{ X int i ; X X switch (progstate) X { X case STARTUP : SETJMP(exception) ; X if (progstate) break ; X else progstate = INITGAME ; X break ; X case INITGAME : initgame() ; X progstate = PLAY ; X break ; X case PLAY : play() ; X progstate = DOPLAY ; X break ; X case DOPLAY : doplay() ; X progstate = MAKEPLAY ; X break ; X case MAKEPLAY : make_play() ; X break ; X case DOREST : numplayers = 1 ; X progstate = HIGHSCORE ; X break ; X case HIGHSCORE : writehighscore() ; X break ; X case NEXTLINE : getnewscore(365,200) ; X break ; X case DOCREDIT : if (!demomode) X { X dohighscores() ; X WRITELN(5,860,"Type DEL to begin") ; X for (i = 1; i <= 200; i++) LONGPAUSE() ; X } X docredits() ; X break ; X case MOVELEFT : move_left() ; X break ; X case MOVERIGHT : move_right() ; X break ; X case DELHIT : autoplay = FALSE ; X iocursormode(TRACKCURSOR) ; X make_control_panel() ; X display_settings() ; X progstate = GETBUT ; X break ; X case GETBUT : get_button_option() ; X break ; X case MAKESEL : make_selection() ; X break ; X case DOLEAVE : SCHRFUNC(RRPL) ; X autoplay = TRUE ; X progstate = DOREST ; X break ; X case RESETGAME : remove = gamestate ; X progstate = DOPLAY ; X break ; X case CTRLSHIT : break ; X } X} END_OF_sid_main.c if test 23374 -ne `wc -c