home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 12 / CD_ASCQ_12_0294.iso / maj / 678 / example.c < prev    next >
Text File  |  1993-10-29  |  4KB  |  221 lines

  1. #include <stdlib.h>;
  2. #include <stdio.h>;
  3. #include <dos.h>;
  4. #include <stdarg.h>
  5. #include "mcgalib.h";
  6.  
  7. #define ulong unsigned long
  8. #define uchar unsigned char
  9. #define VGA256 19
  10. #define TEXTMODE 3
  11.  
  12. FILE *FP;
  13. int *AUTOMATON;              /* Pointer on buffer for automaton */
  14. char *BLOCKSAVE;             /* Pointer on buffer for screen block */
  15. int AUTMAX;                  /* Number of entries in automaton */
  16. int SPRMAX;                  /* Number of sprites in table */
  17.  
  18. void changext(char *name,char *ext);
  19. void outtextf(int x,int y,char *fmt, ... );
  20. int bload(char *fname,char *adr,int siz);
  21. int getcode(int n);
  22. void putpic(int num,int x,int y);
  23. void putscenery(int num,int x,int y);
  24. int autload(char *name);
  25. int sprload(char *name);
  26. int spralloc();
  27.  
  28. /* Function to add or replace extension of filenames */
  29.  
  30. void changext(char *name,char *ext)
  31. {
  32. int l;
  33.  
  34. l=min( strcspn(name,".") , 8);
  35. *(name+l)=0;
  36. strcat(name,ext);
  37. }
  38.  
  39. /* Displays a formatted text string */
  40.  
  41. void outtextf(int x,int y,char *fmt, ... )
  42. {
  43.  char STRBUF19[160];
  44.  
  45.  va_list  argptr;
  46.  va_start( argptr, format );
  47.  vsprintf(STRBUF19, fmt, argptr );
  48.  outtext(x,y,STRBUF19);
  49.  va_end( argptr );
  50. }
  51.  
  52. /* Function to read automaton */
  53.  
  54. int autread(int i)
  55. {
  56. return ( *(AUTOMATON+i));
  57. }
  58.  
  59. /* Function to get sprite type code */
  60.  
  61. int getcode(int n)
  62. {
  63. char *adr=getspadr(n);  return((int)*(adr+4));
  64. }
  65.  
  66. /* Puts a sprite on screen with OVERWRITING mode */
  67.  
  68. void overpic(int num,int x,int y)
  69. {
  70. if(num)
  71.  if(num <= SPRMAX)
  72.    sprite256(x,y,getspadr(num));
  73. }
  74.  
  75. /* Puts a sprite on screen with COPY mode */
  76.  
  77. void putscenery(int num,int x,int y)
  78. {
  79. if(num)
  80.  if(num <= SPRMAX)
  81.    csprite256(x,y,getspadr(num));
  82. }
  83.  
  84. /* Error message for loading function */
  85.  
  86. int puterr(char *name)
  87. {
  88. outtextf(5,5,">>> Disk error #:%d, File %s",ferror(FP),name);
  89. return(0);
  90. }
  91.  
  92. /* Function for loading any binary file */
  93.  
  94. int bload(char *fname,char *adr,int siz)
  95. {
  96.  if((FP=fopen(fname,"rb"))==0L) return( puterr(fname)) ;
  97.  fread((char *)adr,siz,1,FP);
  98.  fclose(FP);
  99.  return(1);
  100. }
  101.  
  102. /* Function for loading an automaton */
  103.  
  104. int autload(char *aname)
  105. {
  106. int ret;
  107. char name[80];
  108.  
  109. strcpy(name,aname);changext(name,".AUT");
  110. ret=bload(name,(char *) AUTOMATON,2048);
  111. AUTMAX=*AUTOMATON;
  112.  
  113. return(ret);
  114. }
  115.  
  116.  
  117. /* Function for loading a file of sprites into memory.
  118.    This unregistered version allows only 64Kb data!     */
  119.  
  120. int sprload(char *spname)
  121. {
  122. int i,res;
  123. ulong lvar;
  124. char name[80];
  125.  
  126. strcpy(name,spname);changext(name,".spr");
  127.  
  128. res=bload(name,(char *) SPVECTOR,65520);
  129. if(!res) return(0);
  130.  
  131. SPRMAX=(int) *SPVECTOR;
  132.  
  133. lvar =  (ulong) SPVECTOR + SPRMAX * 4 + 8;
  134. SPCODE = (char *) lvar;
  135.  
  136. /* Convert relative addresses to absolute ones */
  137.  
  138. for(i = 1; i <= SPRMAX; i++)
  139. {
  140.  lvar=  *(SPVECTOR+i) + (ulong) SPCODE;
  141.  *(SPVECTOR+i)= lvar;
  142. }
  143.  
  144. fclose(FP);
  145. return(1);
  146. }
  147.  
  148. /* Allocate memory for all buffers */
  149.  
  150. int spralloc()
  151. {
  152. AUTOMATON = (int *)   malloc(2048);
  153. BLOCKSAVE = (char *)  malloc(6406);
  154. SPVECTOR  = (ulong *) malloc(65520);
  155. if(!SPVECTOR) { printf("Alloc error..."); exit(0);}
  156. }
  157.  
  158. void main()
  159. {
  160. int i,j,num,x,y,y2,yold;
  161.  
  162. /* First, allocation of memory buffer */
  163.  
  164. spralloc();
  165.  
  166. /* Loading sprites  */
  167.  
  168. printf("Loading sprites...");
  169. sprload("demo2");
  170.  
  171. /* loading automaton */
  172.  
  173. printf("Loading automaton...");
  174. autload("demo2");
  175.  
  176.  /* Setting VGA 256 colors screen */
  177.  
  178. selectscreen(VGA256);
  179.  
  180. /* Setting a full screen window */
  181.  
  182. window19(0,0,319,199);
  183.  
  184. /* Drawing the scenery */
  185.  
  186. for(y=0;y<2;y++)
  187.  for(x=0;x<4;x++)
  188.   putscenery(9,x*80,y*80+20);
  189.  
  190. /* Now, setting window's limits left, top, right, bottom */
  191.  
  192.  window19(40,20,280,180);
  193.  
  194. /* Animation example */
  195.  
  196. i=1;
  197. x=140;
  198. y=5; yold = y;
  199. getblock(x,yold,x+31,y+49,BLOCKSAVE);    /* Saving background */
  200.  
  201. while(y < 180)
  202. {
  203.  num=autread(i);
  204.  i++;
  205.  if(i > AUTMAX) i=1;
  206.  
  207.  putblock(x,yold,BLOCKSAVE);          /* Restoring background */
  208.  getblock(x,y,x+31,y+49,BLOCKSAVE);   /* Saving new area */
  209.  sprite256(x,y,getspadr(num));        /* Sprite display */
  210.  
  211.  delay(40);        /* to slow down and set all computers same speed */
  212.  yold = y;
  213.  y++;
  214. }
  215.  
  216. /* Restores DOS text screen and exits */
  217.  
  218. selectscreen(TEXTMODE);
  219. exit(0);
  220. }
  221.