|
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: 13746 (0x35b2) Types: TextFile Names: »sid_stuff.c.orig«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/Sun/Sidtool/sid_stuff.c.orig«
/* sid_stuff.c * * Various functions and procedures used by Sid Tool. * * 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 <sundev/kbd.h> #include "bltstuff.h" #include "sidtool.h" #include <suntool/sunview.h> #include <suntool/canvas.h> extern Pixfont *pf ; extern Pixrect *circles[4][4] ; extern Pixwin *pw ; extern jmp_buf exception ; extern int val ; extern long random() ; extern char *getenv() ; /* For descriptions of these external variables, see sid_main.c */ extern BOOLEAN autoplay,changed,demomode,gamestate,remove ; extern char a_name[MAXLINE],buffer[MAXLINE],h_name[MAXLINE] ; extern char m_name[MAXLINE], new_key_vals[4][MAXLINE] ; extern char old_key_vals[4][MAXLINE],s_name[MAXLINE],titlestring[MAXLINE] ; extern int blueblink,blueincblink,button,c,cirx,ciry,credits ; extern int curbluetime[MAXNUMPLAYERS+1],curdir,dotx,doty ; extern int fruitmaze[MAXNUMPLAYERS+1],fruiton,fruitsgotten[MAXNUMPLAYERS+1][9] ; extern int fruitx,fruity,bugssincedot,height,highscore,inc,key_stations[9] ; extern int lastnumplayers,numcir[MAXNUMPLAYERS+1],numplayers ; extern int orgx,orgy,player,posx,posy,progstate,redraw,sfunc,skilllevel,speed ; extern int started,walls[XSIZE+6][YSIZE+1],width ; extern struct bugrec bugs[4] ; extern struct scorerec allhighscores[11] ; extern struct startrec startpos[4] ; changebugs() { register struct bugrec *p ; bugssincedot = 0 ; for (p = &bugs[POKEY]; p <= &bugs[SHADOW]; p++) if (!p->eyesonly) { drawbug(p) ; p->bluetime = curbluetime[player] ; if ((!p->boxtime) && (!p->inbox)) p->dir = REVERSEDIR(p->dir) ; drawbug(p) ; /* Will be blue now. */ } } changeplayers(startgame) int startgame ; { int cnt,i ; if (numplayers == 1) { if (fruiton) updatefruit() ; gamestate = TRUE ; progstate = RESETGAME ; longjmp(exception,val) ; } cnt = 0 ; do { cnt++ ; player = 1 + (player % numplayers) ; if (cnt > 5) /* Game all over. */ { progstate = DOLEAVE ; longjmp(exception,val) ; } } while (!numcir[player]) ; clear_screen() ; SPRINTF(buffer,"Player %1d",player) ; write_bold(348,500,buffer) ; LONGPAUSE() ; drawmaze() ; blinkpause() ; if (!startgame) { gamestate = TRUE ; progstate = RESETGAME ; longjmp(exception,val) ; } } checkcollision(nx,ny,g) register int nx,ny ; int *g ; { register struct bugrec *tg ; for (tg = &bugs[POKEY]; tg <= &bugs[SHADOW]; tg++) if (tg->mx == nx) if (tg->my == ny) if (!tg->eyesonly) { *g = GIND(tg) ; return(1) ; } return(0) ; } checkinc(dir,mx,my) int dir,mx,my ; { switch (dir) { case UP : return(!walls[mx+2][my-1]) ; case RIGHT : return(!walls[mx+3][my]) ; case DOWN : return(!walls[mx+2][my+1]) ; case LEFT : return(!walls[mx+1][my]) ; } return(0) ; } destroyblue(g) register struct bugrec *g ; { int i,inc,x ; drawbug(g) ; /* Turn off. */ g->eyesonly = 1 ; g->bluetime = 0 ; inc = 20 ; for (i = 1; i <= bugssincedot; i++) inc *= 2 ; bugssincedot++ ; x = g->scrx + 10 ; if (x > 740) x = 740 ; else if (x < 5) x = 5 ; SCHRFUNC(RXOR) ; SPRINTF(buffer,"%1d0",inc) ; WRITELN(x,g->scry+10,buffer) ; LONGPAUSE() ; SPRINTF(buffer,"%1d0",inc) ; WRITELN(x,g->scry+10,buffer) ; SCHRFUNC(RRPL) ; drawbug(g) ; /* Turn on as eyesonly. */ updatescore(inc) ; } destroyfruit() { int i,inc ; fruitsgotten[player][fruitmaze[player]]++ ; updatefruit() ; /* Turn fruit off. */ inc = fruitscore(fruitmaze[player]) ; updatescore(inc) ; SCHRFUNC(RXOR) ; SPRINTF(buffer,"%1d0",inc) ; WRITELN(fruitx+10,fruity+10,buffer) ; LONGPAUSE() ; SPRINTF(buffer,"%1d0",inc) ; WRITELN(fruitx+10,fruity+10,buffer) ; SCHRFUNC(RRPL) ; } display_settings() /* Display current skill level and number of players. */ { int x,y ; char buffer[MAXLINE] ; x = 50 ; y = 70 ; write_bold(x,y,"Current skill level:") ; SPRINTF(buffer,"%1d ",skilllevel) ; WRITELN(x+190,y,buffer) ; x = 430 ; write_bold(x,y,"Number of players:") ; SPRINTF(buffer,"%1d ",numplayers) ; WRITELN(x+180,y,buffer) ; } dohighscores() /* Display high scores on the screen. */ { char skillc ; int level ; clear_screen() ; write_bold(334,200,"High Scores") ; SCHRFUNC(ROR) ; WRITELN(334,201,"___________") ; WRITELN(200,300,"Skill level Score Who") ; WRITELN(200,301,"___________ _____ ___"); SCHRFUNC(RRPL) ; for (level = 1; level <= 10; level++) { skillc = (level == skilllevel) ? '*' : ' ' ; if (allhighscores[level].score) SPRINTF(buffer,"%c %2d = %5d0 %s", skillc,level,allhighscores[level].score,allhighscores[level].who) ; else SPRINTF(buffer,"%c %2d = - %s", skillc,level,allhighscores[level].who) ; WRITELN(200,330+level*30,buffer) ; } if (!autoplay) make_control_panel() ; if (!autoplay) display_settings() ; } make_selection() /* Get user selection after DEL press. */ { switch (button) { case BUT_AUTO : numplayers = 1 ; autoplay = TRUE ; started = TRUE ; iocursormode(OFFCURSOR) ; break ; case BUT_HELP : clear_screen() ; dohelp() ; break ; case BUT_LEVEL : skilllevel = skilllevel % 10 + 1 ; display_settings() ; highscore = allhighscores[skilllevel].score ; break ; case BUT_PLAYERS : numplayers = numplayers % 4 + 1 ; display_settings() ; break ; case BUT_QUIT : function_keys(KEY_RESET) ; exit(0) ; case BUT_SCORES : dohighscores() ; break ; case BUT_START : autoplay = FALSE ; started = TRUE ; iocursormode(OFFCURSOR) ; lastnumplayers = numplayers ; } if (button == BUT_AUTO || button == BUT_START) progstate = INITGAME ; else progstate = GETBUT ; } restore_screen() /* Called when window needs to be drawn. */ { int g ; if (!redraw++) return ; clear_screen() ; if (!started) { iocursormode(TRACKCURSOR) ; make_control_panel() ; display_settings() ; dohelp() ; } else if (credits) { dohelp() ; BLT_SCRN(3,ciry-37,762,100,RSET) ; if (credits == 1) { drawdot(dotx,doty,BIGDOT) ; drawcir(circles[LEFT][inc],cirx,ciry) ; } else drawcir(circles[RIGHT][inc],cirx,ciry) ; for (g = POKEY; g <= SHADOW; g++) if (!bugs[g].eyesonly) drawbug(&bugs[g]) ; } else { iocursormode(OFFCURSOR) ; drawmaze() ; for (g = POKEY; g <= SHADOW; g++) drawbug(&bugs[g]) ; drawcir(circles[curdir][inc],posx,posy) ; } } erasebugs() /* Erase all bugs from the screen. */ { int g ; for (g = POKEY; g <= SHADOW; g++) drawbug(&bugs[g]) ; /* Erase all bugs. */ } fruitscore(fruit) /* Returns the score for the fruit specified. */ int fruit ; { switch (fruit) { case 1 : return(10) ; case 2 : return(30) ; case 3 : return(50) ; case 4 : return(70) ; case 5 : return(100) ; case 6 : return(200) ; case 7 : return(300) ; case 8 : return(500) ; } return(0) ; } geths(fd,record) /* Get one high score record in. */ struct scorerec *record ; int fd ; { char buffer[32],valuestr[7] ; int i ; i = read(fd,buffer,23) ; for (i = 0; i < 16; i++) record->who[i] = buffer[i] ^ ENKEY ; record->who[i] = '\0' ; for (i = 0; i < 7; i++) valuestr[i] = buffer[i+16] ^ ENKEY ; record->score = atoi(valuestr) ; } get_options(argc,argv) int argc ; char *argv[] ; { char *arg,*env ; char *p ; /* Pointer to string following argument flag. */ orgx = 0 ; /* X origin of SUN SID window. */ orgy = 0 ; /* Y origin of SUN SID window. */ width = SWIDTH ; /* Width of SUN SID window. */ height = SHEIGHT ; /* Height of SUN SID window. */ speed = SPEED ; /* Default speed of Sun machine that this game is on.*/ STRCPY(titlestring,"sidtool - Sun Interactive Debugger V2.1. Rich Burridge") ; STRCPY(m_name,M_NAME) ; /* Default sidtool maze filename. */ STRCPY(a_name,A_NAME) ; /* Default sidtool animate filename. */ STRCPY(s_name,S_NAME) ; /* Default sidtool highscore filename. */ STRCPY(h_name,H_NAME) ; /* Default sidtool help filename. */ demomode = FALSE ; if ((env = getenv("SID_MAZE")) != NULL) STRCPY(m_name,env) ; if ((env = getenv("SID_ANIMATE")) != NULL) STRCPY(a_name,env) ; if ((env = getenv("SID_SCORE")) != NULL) STRCPY(s_name,env) ; if ((env = getenv("SID_HELP")) != NULL) STRCPY(h_name,env) ; while (argc > 1 && (arg = argv[1])[0] == '-') { p = arg + 2 ; switch (arg[1]) { case 'a' : STRCPY(a_name,p) ; /* New animate filename. */ break ; case 'c' : speed = atoi(p) ; /* New class (speed) of machine. */ break ; case 'd' : demomode = TRUE ; /* Run in self demonstration mode. */ break ; case 'h' : STRCPY(h_name,p) ; /* New help filename. */ break ; case 'm' : STRCPY(m_name,p) ; /* New maze filename. */ break ; case 's' : STRCPY(s_name,p) ; /* New high score filename. */ } argc-- ; argv++ ; } } get_string(fd,s) /* Get next line from specified file. */ FILE *fd ; char s[MAXLINE] ; { int c,i ; i = 0 ; while (i < MAXLINE-1 && (c = getc(fd)) != EOF && c != '\n') if (c != '\0') s[i++] = c ; if (c == EOF) return(-1) ; s[i] = '\0' ; return(i) ; } handlecollision(g) register struct bugrec *g ; { int i ; struct bugrec *tg ; if (g->bluetime > 0) destroyblue(g) ; else { drawbug(g) ; /* Erase one that ate screen. */ explodecircle(posx,posy) ; for (tg = &bugs[POKEY]; tg <= &bugs[SHADOW]; tg++) if (tg != g) drawbug(tg) ; if (autoplay) { progstate = DOLEAVE ; longjmp(exception,val) ; } else if (!numcir[player]) { SCHRFUNC(RXOR) ; WRITELN(339,YBASE+SQUARE*16,"GAME OVER!") ; LONGPAUSE() ; WRITELN(339,YBASE+SQUARE*16,"GAME OVER!") ; SCHRFUNC(RRPL) ; if (numplayers == 1) { progstate = DOLEAVE ; longjmp(exception,val) ; } } else LONGPAUSE() ; changeplayers(0) ; } } newbugs(drawthem) int drawthem ; { register struct bugrec *p ; for (p = &bugs[POKEY]; p <= &bugs[SHADOW]; p++) { p->dir = UP ; p->mx = startpos[GIND(p)].x ; p->my = startpos[GIND(p)].y ; TRANSPT(p->mx,p->my,p->scrx,p->scry) ; p->bluetime = 0 ; p->eyesonly = 0 ; p->boxtime = ((-2*skilllevel+25) / 5) * startpos[GIND(p)].time ; if (!p->boxtime) p->inbox = 0 ; else p->inbox = 1 ; p->enteringbox = 0 ; p->count = 0 ; p->delay = 5 ; p->pic = GIND(p) % 2 ; p->intunnel = 0 ; if (drawthem) drawbug(p) ; } } play() /* Initialise for next player to play. */ { fruiton = 0 ; blueblink = 200 ; blueincblink = 25 ; if (numplayers == 1) { player = 1 ; drawmaze() ; blinkpause() ; } else { player = numplayers ; changeplayers(1) ; } remove = TRUE ; } puths(fd,record) /* Put one high score record out. */ struct scorerec record ; int fd ; { char buffer[32],valuestr[7] ; int i,value ; for (i = 0; i < 16; i++) buffer[i] = record.who[i] ^ ENKEY ; value = record.score ; SPRINTF(valuestr,"%d",value) ; for (i = 0; i < 7; i++) buffer[i+16] = valuestr[i] ^ ENKEY ; WRITE(fd,buffer,23) ; } randomrange(low,high) /* Return a random number between low and high. */ int low,high ; { return((((int) random() & 077777) % (high-low+1)) + low) ; } function_keys(state) /* Set or reset the function keys. */ int state ; { int count = STRING ; /* 0xB0 -- the starting entry for strings. */ int fd,i ; if ((fd = open("/dev/kbd",0,0)) < 0) { perror("/dev/kbd") ; exit(1) ; } for (i = 0; i < 4; i++) /* Set up function keys R8, R10, R12 and R14. */ { /* Saving old values. */ if (state == KEY_SET) { get_key(fd,key_stations[i],old_key_vals[i],STRING + 1 + i) ; set_key(fd,key_stations[i],new_key_vals[i],STRING + 1 + i) ; } else set_key(fd,key_stations[i],old_key_vals[i],STRING + 1 + i) ; } CLOSE(fd) ; }