DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T a

⟦3d67e237e⟧ TextFile

    Length: 7892 (0x1ed4)
    Types: TextFile
    Names: »ast_stuff.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/Sun/Asteroids/ast_stuff.c« 

TextFile

 
/*  ast_stuff.c
 *
 *  Various functions and procedures used by the asteroids game.
 *  Written by Rich Burridge - SUN Microsystems Australia (Melbourne).
 *
 *  Version 3.0.  -  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 "bltstuff.h"
#include "asteroids.h"
#include <sys/types.h>
#include <sys/timeb.h>
#include <suntool/sunview.h>
#include <suntool/canvas.h>

extern Pixfont *pf ;
extern Pixwin *pw ;

/* For descriptions of these external variables, see ast_main.c */

extern char bonusstr[MAXLINE],new_key_vals[3][MAXLINE] ;
extern char old_key_vals[3][MAXLINE],path[MAXLINE],progname[MAXLINE] ;
extern char titlestring[MAXLINE],thisscore[MAXLINE] ;

extern struct hscore highscore[MAXHS] ;
extern struct timeb tstartflash,tlastflash ;

extern int basecount,bonusship,bonusshown,c,csi,csj,flashbonus,fuel ;
extern int fuellength,fuelmaxlength,fuelxoffset,givehelp,height ;
extern int key_stations[3],orgx,orgy,progstate,rr,score,scorei,scorethistank ;
extern int sfunc,width ;


addscore(s)       /* Add up current total score. */
int s ;

{
  int s10 ;
 
  s10 = s*10 ;
  score += s10 ;
  scorethistank += s10 ;
 
  if (score > bonusship)
    {
      SPRINTF(bonusstr," ** Bonus Spaceship **    ") ;
      startflashbonus() ;
      basecount += 1 ;
      bonusship *= 2 ;   /* double it. */
    }
  SPRINTF(titlestring," Score : %6d                Ships : %6d  ",score,basecount) ;
  showtitle() ;
}
 
 
clear_screen()

{
  BLT_SCRN(orgx,orgy,width,height,RCLR) ;
}


do_help_screen()
 
{
  int x,y ;
  int length = 0 ;         /* Length of longest help line. */
  int nolines = 0 ;        /* Number of lines in help file. */
  char line[MAXLINE] ;     /* Current line read from help file. */
  FILE *tf ;               /* File descripter for help file. */
  int texty = 20 ;         /* Initial y coordinate for help message. */
  char helpname[MAXLINE] ; /* Full help file pathname. */
 
  SPRINTF(helpname,"%s%s",path,HELPNAME) ;
  if ((tf = fopen(helpname,"r")) == NULL)
    {
      FPRINTF(stderr,"%s: can't open %s for help information.\n",
              progname,helpname) ;
      return ;
    }
  while (fgets(line,MAXLINE,tf) != NULL)
    {
      if (strlen(line) > length) length = strlen(line) ;
      nolines++ ;
    }
  FCLOSE(tf) ;

  x = (width - length*FONT_WIDTH - 20) / 2 ;
  y = (height - nolines*15+texty) / 2 ;
  draw_frame(x,y,length*FONT_WIDTH+20,nolines*15+texty) ;

  tf = fopen(helpname,"r") ;
  while (fgets(line,MAXLINE,tf) != NULL)
    {
      line[strlen(line)-1] = '\0' ;
      SCHRFUNC(PIX_SRC) ;
      WRITELN(x+10,y+texty,line) ;
      texty += 15 ;
    }
  FCLOSE(tf) ;
}


doflashbonus()

{
  struct timeb tnow ;

  ftime(&tnow) ;
  if (numticks(&tnow,&tlastflash) > FLICKERTIME)
    {
      bonusshown = !bonusshown ;   /* on off on off every second. */
      SCHRFUNC(RXOR) ;
      WRITELN(orgx+6,orgy+FONT_HEIGHT-2,bonusstr) ;
      tlastflash.time = tnow.time ;
      tlastflash.millitm = tnow.millitm ;
    }
 
/* See if time out, if so stop flash */
  if (((tnow.time - tstartflash.time) > FLASHTIME) && !bonusshown)
    {
      flashbonus = 0 ;
      addscore(0) ;      /* to put score back on screen. */
    }
}
 

draw_frame(x,y,fr_width,fr_height)
int x,y,fr_width,fr_height ;

{
  BLT_SCRN(x,y,fr_width,fr_height,RSET) ;
  BLT_SCRN(x+1,y+1,fr_width-2,fr_height-2,RCLR) ;
  BLT_SCRN(x+3,y+3,fr_width-6,fr_height-6,RSET) ;
  BLT_SCRN(x+5,y+5,fr_width-10,fr_height-10,RCLR) ;
}


function_keys(state)        /*  Set or reset the function keys. */
int state ;

{
  int count = 176 ;         /* 0xB0 -- the starting entry for strings. */
  int fd,i ;

  if ((fd = open("/dev/kbd",0,0)) < 0)
    {
      FPRINTF(stderr,"sidtool: can't open /dev/kbd\n") ;
      exit(1) ;
    }
  for (i = 0; i < 3; i++)      /* Set up function keys. */
    {
      if (state == KEY_SET)
        {
          get_key(fd,key_stations[i],old_key_vals[i],count) ;
          set_key(fd,key_stations[i],new_key_vals[i],count++) ;
        }
      else set_key(fd,key_stations[i],old_key_vals[i],count++) ;
    }
  CLOSE(fd) ;
}


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
                          { 
                            csj = MAXHS - 1 ;
                            while (--csj >= csi)
                              {
                                highscore[csj+1].score = highscore[csj].score ;
                                STRCPY(highscore[csj+1].who,highscore[csj].who) ;
                              } 
                            highscore[csi].score = score ;
                            STRCPY(highscore[csi].who,thisscore) ;
                            puthighscore() ;
                            progstate = DOEND ;
                          }
                        break ;
          default     : if (c < ' ') break ;
                        thisscore[scorei++] = c ;
                        thisscore[scorei] = '\0' ;
                        WRITELN(x,y,thisscore) ;
        }
      c = 0 ;
    }
}
 
 
get_options(argc,argv)
int argc ;
char *argv[] ;

{
  char *arg ;
  char *p ;      /* Pointer to string following argument flag. */

/* Changed--PLAY
  STRCPY(path,progname) ;         /* Extract full path name for asteroid files. */
  STRCPY(path,"/ufs/play/lib.sun");
  if ((arg = rindex(path,'/')) == NULL) path[0] = '\0' ;
  else *(++arg) = '\0' ;
  STRCPY(titlestring,"  Asteroids  V3.0.              Rich Burridge.") ;

  orgx = 0 ;
  orgy = 0 ;
  width = SWIDTH ;
  height = SHEIGHT ;
  givehelp = 1 ;
  while (argc > 1 && (arg = argv[1])[0] == '-')
    {
      p = arg + 2 ;
      switch (arg[1])
        {
          case 'h' : givehelp = 0 ;        /* Don't display help message. */
                     break ;
          case 'x' : width = atoi(p) ;     /* Width of asteroids window. */
                     if (width < 500) width = 500 ;
                     break ;
          case 'y' : height = atoi(p) ;    /* Height of asteroids window. */
                     if (height < 500) height = 500 ;
                     break ;
        }
      argc-- ;
      argv++ ;
    }
}


rint(r)
int r ;
 
{
  rr = ((rr*4705 + 1) & 32767) ;
  if (!r) r = 1 ;
  return(rr % r) ;
}


showfuel()         /* Show how much fuel is left. */

{
  int howmuch ;

  howmuch = (int)(fuelmaxlength * ((double)fuel / (double)FULLTANK)) ;
  if (howmuch != fuellength)
    {
      BLT_SCRN(fuelxoffset,height-FONT_HEIGHT,fuelmaxlength,FONT_HEIGHT-2,RCLR) ;
      fuellength = howmuch ;
      BLT_SCRN(fuelxoffset,height-FONT_HEIGHT,fuellength,FONT_HEIGHT-2,RXNOR) ;
    }
}


showtitle()      /* Display titlestring or bonus message. */

{
  if (!flashbonus)
    {
      SCHRFUNC(RRPL) ;
      WRITELN(orgx+6,orgy+FONT_HEIGHT-2,titlestring) ;
    }
}


startflashbonus()   /* start bonus flashing. */

{
  flashbonus = 1 ;
  bonusshown = 1 ;
  SCHRFUNC(RRPL) ;
  WRITELN(orgx+6,orgy+FONT_HEIGHT-2,bonusstr) ;  /* Don't XOR the first one. */
  ftime(&tstartflash) ;                          /* Get the time start. */
  tlastflash.time = tstartflash.time ;
  tlastflash.millitm = tstartflash.millitm ;
}