home *** CD-ROM | disk | FTP | other *** search
/ HOT Scene Stuff / hotscenestuffzyklop1996.iso / demos / sunknown / ifs.cpp < prev    next >
C/C++ Source or Header  |  1994-04-07  |  6KB  |  300 lines

  1. // IFS.CPP //////////////////////////////////////////////////////////////////
  2.  
  3. // Thomas H.
  4.  
  5. // INCLUDES /////////////////////////////////////////////////////////////////
  6.  
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9.  
  10. #include "template.h"
  11. #include "ifs.h"
  12. #include "xgraf.h"
  13. #include "seg.h"
  14. #include "keyscan.h"
  15. #include "timer.h"
  16. #include "math.h"
  17. #include "xgraf.h"
  18.  
  19. // DEFINES  /////////////////////////////////////////////////////////////////
  20.  
  21. #define HITIT 204900
  22. #define MAXLEV  7
  23.  
  24. // EXTERNALS ////////////////////////////////////////////////////////////////
  25.  
  26. // FUNCTIONS
  27.  
  28. extern "C"
  29. {
  30.   void asmifs(void);
  31.   void blanker(void);
  32.   void farmove(void);
  33.   void farmove320(void);
  34.   void onestrip(void);
  35.   void movebak32(void);
  36.   drawpage32(void);
  37.   void onestrip(void);
  38. }
  39.  
  40. // VARS
  41.  
  42. extern timer_C timer;
  43. extern byte *pressed;
  44. extern byte rgb[768];
  45. extern long far farfrom, far farto;
  46. extern long far fardotpage;
  47. extern word far skheight;
  48. extern ulong musicstart;
  49. extern byte far ifslev;
  50. extern word far ifsx, far ifsy;
  51. extern int far ifsdx, far ifsdy;
  52. extern word far ifslen;
  53. extern long far writepage32;
  54.  
  55. // VARS /////////////////////////////////////////////////////////////////////
  56.  
  57. // SCALARS
  58.  
  59. int frameno,
  60.     *sintab,
  61.     *costab,
  62.     number;
  63. long segptr;
  64. float sizefac=1,
  65.       async=0,
  66.       rfac1,
  67.       rfac2;
  68.  
  69. // ARRAYS
  70.  
  71. int lbend[MAXLEV]    ={-20,-20,-20,-20,-20},
  72.         rbend[MAXLEV]    ={20,20,20,20,20};
  73. word lfac[MAXLEV]    ={192*256,192*256,192*256,192*256,192*256},
  74.          rfac[MAXLEV]    ={192*256,192*256,192*256,192*256,192*256};
  75.  
  76. // FUNCTIONS ////////////////////////////////////////////////////////////////
  77.  
  78. // SCALE
  79.  
  80. void scale(byte *ptr, byte *to,int number)
  81. {
  82.     long lptr=(long)ptr;
  83.     number&=~1;
  84.     word blanks=(200-number)/2;
  85.     if (blanks)
  86.     {
  87.         writepage32=(long)to;
  88.         _DX=blanks;
  89.         blanker();
  90.     }
  91.     long lto=blanks<<8;
  92.     lto+=(long)to;
  93.     word first=0;
  94.     if (number)
  95.     {
  96.         long jump=(256*200l);
  97.         jump/=number;
  98.         for (int count=0; count<number; count++)
  99.         {
  100.             word line=first>>8;
  101.             first+=jump;
  102.             long from=lptr+line*320;
  103.  
  104.             asm pusha
  105.             asm push ds
  106.             asm les di,lto
  107.             asm lds si,from
  108.             onestrip();
  109.             asm pop ds
  110.             asm popa
  111.  
  112.             lto+=256;
  113.         }
  114.     }
  115.     if (blanks)
  116.     {
  117.         writepage32=(long)to+256*(200-blanks);
  118.         _DX=blanks;
  119.         blanker();
  120.     }
  121. }
  122.  
  123. // DRAWPAGE
  124.  
  125. void drawpage(byte *orig)
  126. {
  127.     long from=(long)orig;
  128.     long to=0xa0000020;
  129.     asm pusha
  130.     asm push ds
  131.     asm les di,to
  132.     asm lds si,from
  133.     drawpage32();
  134.     asm pop ds
  135.     asm popa
  136. }
  137.  
  138. // SETPARAMETERS
  139.  
  140. void setparameters(float pro)
  141. {
  142.     sizefac=pow(pro,0.05);
  143.     async=pro/40.0;
  144.     pro=pow(pro,1.2);
  145.     float sfac=1;
  146.     for (int count=0; count<MAXLEV; count++)
  147.     {
  148.         float pro2=pro+count*async;
  149.         lbend[count]=130*sin(pro2*rfac1)/number;
  150.         rbend[count]=-100*sin(pro2*rfac2)/number;
  151.         lfac[count]=(52768l+6000*sin(pro2*57))*sfac;
  152.         rfac[count]=(52768l+6000*sin(pro2*39))*sfac;
  153.         sfac*=sizefac;
  154.     }
  155. }
  156.  
  157. // DRAWIFS
  158.  
  159. void drawifs(word xp,word yp,word vin,word leng,byte level)
  160. {
  161.     vin&=255;
  162.     ifsx=xp;
  163.     ifsy=yp;
  164.     ifsdx=costab[vin];
  165.     ifsdy=sintab[vin];
  166.     ifslen=leng;
  167.     ifslev=level;
  168.     asm pusha
  169.     asm push ds
  170.     asm lds si,segptr
  171.     asmifs();
  172.     asm pop ds
  173.     asm popa
  174.     if (level==MAXLEV)
  175.         return;
  176.     xp=ifsx;
  177.     yp=ifsy;
  178.     unsigned long l2=(unsigned long)leng*lfac[level];
  179.     l2>>=16;
  180.     int v2=vin+lbend[level];
  181.     level++;
  182.     drawifs(ifsx,ifsy,v2,l2,level);
  183.     l2=(unsigned long)leng*rfac[level];
  184.     l2>>=16;
  185.     v2=vin+rbend[level];
  186.     drawifs(xp,yp,v2,l2,level);
  187. }
  188.  
  189. // TURN
  190.  
  191. int turn(float pro)
  192. {
  193.     if (pro<0.4)
  194.         pro-=0.1;
  195.     if (pro<0)
  196.         pro=0;
  197.     if (pro>0.5)
  198.         pro=1-pro;
  199.     if (pro<0.05)
  200.         return 0;
  201.     if (pro>0.10)
  202.         return 200;
  203.     pro-=0.05;
  204.     pro*=10*M_PI;
  205.     return 200*sin(pro);
  206. }
  207.  
  208. // IFS
  209.  
  210. void ifs(void)
  211. {
  212.     seg_C orig(64000);
  213.     seg_C buffer;
  214.     seg_C sint(512);
  215.     seg_C cost(512);
  216.  
  217.     sintab=(int*)sint.ptr;
  218.     costab=(int*)cost.ptr;
  219.  
  220.     for (long count=0; count<256; count++)
  221.     {
  222.         sintab[count]=256*sin(count*2*M_PI/256);
  223.         costab[count]=256*cos(count*2*M_PI/256);
  224.     }
  225.  
  226.     FILE *infile=fopen(MARBLEBMP,"rb");
  227.     for (long o=0; o<64000l; o++)
  228.     {
  229.         byte temp;
  230.         fread(&temp,1,1,infile);
  231.  
  232.         if (o<320 || o>=63680l)
  233.             temp=0;
  234.         orig.ptr[o]=temp;
  235.     }
  236.     fclose(infile);
  237.  
  238.     _AX=0x13;
  239.     asm int 0x10
  240.  
  241.     setpalette(IFSPAL);
  242.  
  243.     count=0;
  244.     float frames=0;
  245.     int done=0;
  246.     number=3+2*(random(100)>80);
  247.     if (random(100)>95)
  248.         number=random(8)+1;
  249.  
  250.     while (timer.elapsed(musicstart,timer.readtimer())<HITIT);
  251.  
  252.     long vstart=timer.readtimer();
  253.     long left=timer.elapsed(musicstart,vstart);
  254.     left=(float)END_IFS-left-1000;
  255.  
  256.     rfac1=31+random(100)/20.0;
  257.     rfac2=41+random(100)/20.0;
  258.  
  259.     do
  260.     {
  261.         long now=timer.readtimer();
  262.         float pro=timer.elapsed(vstart,now);
  263.         pro/=left;
  264.         fit((float)0,pro,(float)1);
  265.         frames++;
  266.  
  267.         scale(orig.ptr,buffer.ptr,turn(pro));
  268.  
  269.         int height=pro*250-70;
  270.         fit(0,height,7);
  271.  
  272.         skheight=257*height;
  273.         float slen=pro*10*20.0*256;
  274.         slen=min(slen,(float)27*256);
  275.         if (pro>0.9)
  276.             slen*=10*(1-pro);
  277.  
  278.         for (int io=0; io<10; io++)
  279.             if(pressed[59+io])
  280.                 number=io+1;
  281.  
  282.         setparameters(pro);
  283.         static float dv=0,ddv=0;
  284.         segptr=(long)buffer.ptr;
  285.         float v=pro*pro*1800+dv;
  286.         dv+=ddv;
  287.         ddv+=(pressed[77]-pressed[75])/3.0;
  288.         float plfac=256/number;
  289.         for (int no=0; no<number; no++)
  290.             drawifs((128-skheight)*256l,(100-skheight)*256l,v+plfac*no,slen,0);
  291.  
  292.         drawpage(buffer.ptr);
  293.  
  294.         count++;
  295.         frameno++;
  296.         if (pro>=1)
  297.             done=1;
  298.     } while (!done);
  299. }
  300.