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

  1. // DUNE.CPP /////////////////////////////////////////////////////////////////
  2.  
  3. // Thomas H.
  4.  
  5. // INCLUDES /////////////////////////////////////////////////////////////////
  6.  
  7. #include <math.h>
  8. #include <dos.h>
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11.  
  12. #include "template.h"
  13. #include "dune.h"
  14. #include "seg.h"
  15. #include "timer.h"
  16. #include "global.h"
  17. #include "xgraf.h"
  18.  
  19. // DEFINES //////////////////////////////////////////////////////////////////
  20.  
  21. //#define EQUAL
  22.  
  23. // EXTERNALS ////////////////////////////////////////////////////////////////
  24.  
  25. // FUNCTIONS
  26.  
  27. extern "C" void makeplasma(void);
  28. extern "C" void drawrelieff(void);
  29.  
  30. // VARS
  31.  
  32. extern timer_C timer;
  33. extern int relspeed;
  34. extern long far dune_map,
  35.        far dune_buffer,
  36.        far dune_light;
  37. extern ulong musicstart;
  38. extern byte *pressed,
  39.        rgb[768];;
  40. extern word far dunepl1,
  41.        far dunepl2,
  42.        far dunepl3;
  43. extern far word duneplus;
  44.  
  45. // FUNCTIONS ////////////////////////////////////////////////////////////////
  46.  
  47. // MODE13
  48.  
  49. void mode13(void)
  50. {
  51.   _AX=0x13;
  52.   VGAINT;
  53. }
  54.  
  55. // FINDRELSPEED
  56.  
  57. void findrelspeed(void)
  58. {
  59.   mode13();
  60.     long end,start=timer.readtimer();
  61.   relspeed=0;
  62.     do
  63.     {
  64.         asm xor di,di
  65.         asm mov ax,0xa000
  66.         asm mov es,ax
  67.         asm xor ax,ax
  68.         asm mov cx,15430
  69. next_test:
  70.         asm mov [es:di],ax
  71.         asm add di,2
  72.         asm dec cx
  73.         asm jnz next_test
  74.         relspeed++;
  75.         end=timer.readtimer();
  76.     }while (timer.elapsed(start,end)<1000.0);
  77. }
  78.  
  79. // SETRGBDEFAULT
  80.  
  81. void setrgbdefault(void)
  82. {
  83.     FILE *infile=fopen(DUNEPAL,"rb");
  84.     for (int count=0; count<768; count++)
  85.     {
  86.         byte temp;
  87.         fread(&temp,1,1,infile);
  88.         rgb[count]=temp;
  89.     }
  90.     fclose(infile);
  91. }
  92.  
  93. // SETPAL
  94.  
  95. void setpal(int no)
  96. {
  97.     byte null=0;
  98.     outportb(0x3c8,0);
  99.     if (!no)
  100.         for (int tell=0; tell<192; tell++)
  101.             outportb(0x3c9,null);
  102.  
  103.     frame();
  104.     outportb(0x3c8,64);
  105.     for (int count=0; count<192; count++)
  106.     {
  107.         byte here=rgb[count+192*(1+no)];
  108.         outportb(0x3c9,here);
  109.     }
  110. }
  111.  
  112.  
  113. // FIXLIGHT
  114.  
  115. void fixlight(byte *ptr)
  116. {
  117.     for (int x=0; x<256; x++)
  118.     for (int y=0; y<256; y++)
  119.     {
  120.         int res=(x-y);
  121.         res+=((x+y)>>3)+128;
  122.     fit(0,res,255);
  123.         if (!(x+y))
  124.             res-=5;
  125.         *(ptr++)=res>>2;
  126.     }
  127. }
  128.  
  129. // FLIP
  130.  
  131. void flip(byte *data)
  132. {
  133.     asm pusha
  134.     asm push ds
  135.  
  136.     asm lds si,data
  137.     asm mov cx,400
  138. l1:
  139.     asm mov dx,256
  140. l2:
  141.     asm not word ptr[si]
  142.  
  143.     asm add si,2
  144.     asm dec dx
  145.     asm jnz l2
  146.  
  147.     asm mov dx,ds
  148.     asm add dx,512/16
  149.     asm mov ds,dx
  150.     asm xor si,si
  151.     asm dec cx
  152.     asm jnz l1
  153.  
  154.     asm pop ds
  155.     asm popa
  156. }
  157.  
  158. // LOADPLASMA
  159.  
  160. void loadplasma(byte *ptr,char *filnavn,int sym)
  161. {
  162.     FILE *infile=fopen(filnavn,"rb");
  163.     long l2,l=(long)ptr;
  164.     if (!sym)
  165.         l2=l+(65536l*32*200l);
  166.     else
  167.         l2=l+(65536l*32l*399l);
  168.     byte *ptr2=(byte*)l2;
  169.     for (int y=0; y<200; y++)
  170.     {
  171.         for (int x=0; x<256; x++)
  172.         {
  173.             byte temp;
  174.             fread(&temp,1,1,infile);
  175.             ptr[x]=ptr2[x]=temp;
  176.             if (!sym)
  177.             {
  178.                 ptr[x+256]=temp;
  179.                 ptr2[x+256]=temp;
  180.             }
  181.             else
  182.             {
  183.                 ptr[511-x]=temp;
  184.                 ptr2[511-x]=temp;
  185.             }
  186.         }
  187.         l+=65536l*32l;
  188.         if (!sym)
  189.             l2+=65536l*32;
  190.         else
  191.             l2-=65536l*32;
  192.         ptr=(byte*)l;
  193.         ptr2=(byte*)l2;
  194.     }
  195.     fclose(infile);
  196. }
  197.  
  198. // DRAWALL
  199.  
  200. void drawall(float count)
  201. {
  202.     dunepl1=
  203.         64.0*(1+sin(count*1.0)*0.4+sin(count*1.5)*0.6);
  204.     dunepl2=
  205.         64.0*(1+sin(count*1.3)*0.7+sin(count*1.9)*0.3);
  206.     dunepl3=
  207.         64.0*(1+sin(count*0.6)*0.5+sin(count*1.3)*0.5);
  208.  
  209.     dunepl1<<=9;
  210.     dunepl2<<=9;
  211.     dunepl3<<=9;
  212.  
  213.     dunepl1+=
  214.         32+64.0*(1+sin(count*0.8)*0.5+sin(count*2.0)*0.5);
  215.     dunepl2+=
  216.         32+64.0*(1+sin(count*1.9)*0.3+sin(count*1.3)*0.7);
  217.     dunepl3+=
  218.         32+64.0*(1+sin(count*1.6)*0.8+sin(count*2.4)*0.2);
  219.  
  220. #ifdef EQUAL
  221.     dunepl2=dunepl3=dunepl1;
  222. #endif
  223.  
  224.     makeplasma();
  225.     drawrelieff();
  226. }
  227.  
  228. // GOMORPH
  229.  
  230. void gomorph(long msek, long start)
  231. {
  232.     long diff=timer.elapsed(start,timer.readtimer());
  233.     msek-=diff;
  234.     int fadin=msek/5;
  235.     int fadout=0.8*msek;
  236.     long now;
  237.     do
  238.     {
  239.         now=timer.elapsed(start,timer.readtimer());
  240.         now-=diff;
  241.         if (now<=fadin)
  242.         {
  243.             duneplus=now*64.0/fadin;
  244.             duneplus*=257;
  245.         }
  246.         if (now>=fadout)
  247.         {
  248.             duneplus=(msek-now)*64.0/fadin;
  249.             duneplus*=257;
  250.         }
  251.         float count=45.0+now/3000.0;
  252.         drawall(count);
  253.         count+=0.03;
  254.     }while (now<msek);
  255. }
  256.  
  257. // DUNE
  258.  
  259. void dune(void)
  260. {
  261.     setrgbdefault();
  262.  
  263.     seg_C map(512l*400l);
  264.     seg_C buffer;
  265.     seg_C lighting;
  266.  
  267.     dune_map=(long)map.ptr;
  268.     dune_buffer=(long)buffer.ptr;
  269.     dune_light=(long)lighting.ptr;
  270.  
  271.     mode13();
  272.     fixlight(lighting.ptr);
  273.  
  274.     ulong start=timer.readtimer();
  275.     ulong gone=timer.elapsed(musicstart,timer.readtimer());
  276.     ulong left=END_DUNE-gone;
  277.     left/=3;
  278.  
  279.     setpal(0);
  280.  
  281.     loadplasma(map.ptr,DUNEMAP1,0);
  282.     flip(map.ptr);
  283.     gomorph(left,start);
  284.  
  285.     setpal(1);
  286.     flip(map.ptr);
  287.     gomorph(left*2,start);
  288.  
  289.     setpal(2);
  290.     loadplasma(map.ptr,DUNEMAP2,1);
  291.     gomorph(left*3,start);
  292. }
  293.