⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawing.c

📁 经典的老游戏digger的源代码.提起digger相信很多人会回忆起曾经为了它挑灯夜战的时光
💻 C
字号:
/* Digger Remastered
   Copyright (c) Andrew Jenner 1998-2004 */

#include <stdio.h>
#include <string.h>
#include "def.h"
#include "drawing.h"
#include "main.h"
#include "hardware.h"
#include "sprite.h"
#include "digger.h"
#include "sound.h"

Sint4 field1[MSIZE],field2[MSIZE],field[MSIZE];

#ifdef _WINDOWS
Uint3 monbufs[MONSTERS][960],bagbufs[BAGS][960],bonusbufs[BONUSES][960],
      diggerbufs[DIGGERS][960],firebufs[FIREBALLS][256];
#else
Uint3 monbufs[MONSTERS][480],bagbufs[BAGS][480],bonusbufs[BONUSES][480],
      diggerbufs[DIGGERS][480],firebufs[FIREBALLS][128];
#endif

Uint4 bitmasks[12]={0xfffe,0xfffd,0xfffb,0xfff7,0xffef,0xffdf,0xffbf,0xff7f,
                    0xfeff,0xfdff,0xfbff,0xf7ff};

Sint4 monspr[MONSTERS];
Sint4 monspd[MONSTERS];

Sint4 digspr[DIGGERS],digspd[DIGGERS],firespr[FIREBALLS];

void drawlife(Sint4 t,Sint4 x,Sint4 y);
void createdbfspr(void);
void initdbfspr(void);
void drawbackg(Sint4 l);
void drawfield(void);

void outtext(char *p,Sint4 x,Sint4 y,Sint4 c)
{
  Sint4 i;
  for (i=0;p[i];i++) {
    gwrite(x,y,p[i],c);
    x+=12;
  }
}

void makefield(void)
{
  Sint4 c,x,y;
  for (x=0;x<MWIDTH;x++)
    for (y=0;y<MHEIGHT;y++) {
      field[y*MWIDTH+x]=-1;
      c=getlevch(x,y,levplan());
      if (c=='S' || c=='V')
        field[y*MWIDTH+x]&=0xd03f;
      if (c=='S' || c=='H')
        field[y*MWIDTH+x]&=0xdfe0;
      if (curplayer==0)
        field1[y*MWIDTH+x]=field[y*MWIDTH+x];
      else
        field2[y*MWIDTH+x]=field[y*MWIDTH+x];
    }
}

void drawstatics(void)
{
  Sint4 x,y;
  for (x=0;x<MWIDTH;x++)
    for (y=0;y<MHEIGHT;y++)
      if (curplayer==0)
        field[y*MWIDTH+x]=field1[y*MWIDTH+x];
      else
        field[y*MWIDTH+x]=field2[y*MWIDTH+x];
  setretr(TRUE);
  gpal(0);
  ginten(0);
  drawbackg(levplan());
  drawfield();
}

void savefield(void)
{
  Sint4 x,y;
  for (x=0;x<MWIDTH;x++)
    for (y=0;y<MHEIGHT;y++)
      if (curplayer==0)
        field1[y*MWIDTH+x]=field[y*MWIDTH+x];
      else
        field2[y*MWIDTH+x]=field[y*MWIDTH+x];
}

void drawfield(void)
{
  Sint4 x,y,xp,yp;
  for (x=0;x<MWIDTH;x++)
    for (y=0;y<MHEIGHT;y++)
      if ((field[y*MWIDTH+x]&0x2000)==0) {
        xp=x*20+12;
        yp=y*18+18;
        if ((field[y*MWIDTH+x]&0xfc0)!=0xfc0) {
          field[y*MWIDTH+x]&=0xd03f;
          drawbottomblob(xp,yp-15);
          drawbottomblob(xp,yp-12);
          drawbottomblob(xp,yp-9);
          drawbottomblob(xp,yp-6);
          drawbottomblob(xp,yp-3);
          drawtopblob(xp,yp+3);
        }
        if ((field[y*MWIDTH+x]&0x1f)!=0x1f) {
          field[y*MWIDTH+x]&=0xdfe0;
          drawrightblob(xp-16,yp);
          drawrightblob(xp-12,yp);
          drawrightblob(xp-8,yp);
          drawrightblob(xp-4,yp);
          drawleftblob(xp+4,yp);
        }
        if (x<14)
          if ((field[y*MWIDTH+x+1]&0xfdf)!=0xfdf)
            drawrightblob(xp,yp);
        if (y<9)
          if ((field[(y+1)*MWIDTH+x]&0xfdf)!=0xfdf)
            drawbottomblob(xp,yp);
      }
}

void eatfield(Sint4 x,Sint4 y,Sint4 dir)
{
  Sint4 h=(x-12)/20,xr=((x-12)%20)/4,v=(y-18)/18,yr=((y-18)%18)/3;
  incpenalty();
  switch (dir) {
    case DIR_RIGHT:
      h++;
      field[v*MWIDTH+h]&=bitmasks[xr];
      if (field[v*MWIDTH+h]&0x1f)
        break;
      field[v*MWIDTH+h]&=0xdfff;
      break;
    case DIR_UP:
      yr--;
      if (yr<0) {
        yr+=6;
        v--;
      }
      field[v*MWIDTH+h]&=bitmasks[6+yr];
      if (field[v*MWIDTH+h]&0xfc0)
        break;
      field[v*MWIDTH+h]&=0xdfff;
      break;
    case DIR_LEFT:
      xr--;
      if (xr<0) {
        xr+=5;
        h--;
      }
      field[v*MWIDTH+h]&=bitmasks[xr];
      if (field[v*MWIDTH+h]&0x1f)
        break;
      field[v*MWIDTH+h]&=0xdfff;
      break;
    case DIR_DOWN:
      v++;
      field[v*MWIDTH+h]&=bitmasks[6+yr];
      if (field[v*MWIDTH+h]&0xfc0)
        break;
      field[v*MWIDTH+h]&=0xdfff;
  }
}

void creatembspr(void)
{
  Sint4 i;
  for (i=0;i<BAGS;i++)
    createspr(FIRSTBAG+i,62,bagbufs[i],4,15,0,0);
  for (i=0;i<MONSTERS;i++)
    createspr(FIRSTMONSTER+i,71,monbufs[i],4,15,0,0);
  createdbfspr();
  for (i=0;i<MONSTERS;i++) {
    monspr[i]=0;
    monspd[i]=1;
  }
}

void initmbspr(void)
{
  int i;
  for (i=0;i<BAGS;i++)
    initspr(FIRSTBAG+i,62,4,15,0,0);
  for (i=0;i<MONSTERS;i++)
    initspr(FIRSTMONSTER+i,71,4,15,0,0);
  initdbfspr();
}

void drawmon(Sint4 n,bool nobf,Sint4 dir,Sint4 x,Sint4 y)
{
  monspr[n]+=monspd[n];
  if (monspr[n]==2 || monspr[n]==0)
    monspd[n]=-monspd[n];
  if (monspr[n]>2)
    monspr[n]=2;
  if (monspr[n]<0)
    monspr[n]=0;
  if (nobf)
    initspr(FIRSTMONSTER+n,monspr[n]+69,4,15,0,0);
  else
    switch (dir) {
      case DIR_RIGHT:
        initspr(FIRSTMONSTER+n,monspr[n]+73,4,15,0,0);
        break;
      case DIR_LEFT:
        initspr(FIRSTMONSTER+n,monspr[n]+77,4,15,0,0);
    }
  drawspr(FIRSTMONSTER+n,x,y);
}

void drawmondie(Sint4 n,bool nobf,Sint4 dir,Sint4 x,Sint4 y)
{
  if (nobf)
    initspr(FIRSTMONSTER+n,72,4,15,0,0);
  else
    switch(dir) {
      case DIR_RIGHT:
        initspr(FIRSTMONSTER+n,76,4,15,0,0);
        break;
      case DIR_LEFT:
        initspr(FIRSTMONSTER+n,80,4,14,0,0);
    }
  drawspr(FIRSTMONSTER+n,x,y);
}

void drawgold(Sint4 n,Sint4 t,Sint4 x,Sint4 y)
{
  initspr(FIRSTBAG+n,t+62,4,15,0,0);
  drawspr(FIRSTBAG+n,x,y);
}

void drawlife(Sint4 t,Sint4 x,Sint4 y)
{
  drawmiscspr(x,y,t+110,4,12);
}

void drawemerald(Sint4 x,Sint4 y)
{
  initmiscspr(x,y,4,10);
  drawmiscspr(x,y,108,4,10);
  getis();
}

void eraseemerald(Sint4 x,Sint4 y)
{
  initmiscspr(x,y,4,10);
  drawmiscspr(x,y,109,4,10);
  getis();
}

void createdbfspr(void)
{
  int i;
  for (i=0;i<DIGGERS;i++) {
    digspd[i]=1;
    digspr[i]=0;
  }
  for (i=0;i<FIREBALLS;i++)
    firespr[i]=0;
  for (i=FIRSTDIGGER;i<LASTDIGGER;i++)
    createspr(i,0,diggerbufs[i-FIRSTDIGGER],4,15,0,0);
  for (i=FIRSTBONUS;i<LASTBONUS;i++)
    createspr(i,81,bonusbufs[i-FIRSTBONUS],4,15,0,0);
  for (i=FIRSTFIREBALL;i<LASTFIREBALL;i++)
    createspr(i,82,firebufs[i-FIRSTFIREBALL],2,8,0,0);
}

void initdbfspr(void)
{
  int i;
  for (i=0;i<DIGGERS;i++) {
    digspd[i]=1;
    digspr[i]=0;
  }
  for (i=0;i<FIREBALLS;i++)
    firespr[i]=0;
  for (i=FIRSTDIGGER;i<LASTDIGGER;i++)
    initspr(i,0,4,15,0,0);
  for (i=FIRSTBONUS;i<LASTBONUS;i++)
    initspr(i,81,4,15,0,0);
  for (i=FIRSTFIREBALL;i<LASTFIREBALL;i++)
    initspr(i,82,2,8,0,0);
}

void drawrightblob(Sint4 x,Sint4 y)
{
  initmiscspr(x+16,y-1,2,18);
  drawmiscspr(x+16,y-1,102,2,18);
  getis();
}

void drawleftblob(Sint4 x,Sint4 y)
{
  initmiscspr(x-8,y-1,2,18);
  drawmiscspr(x-8,y-1,104,2,18);
  getis();
}

void drawtopblob(Sint4 x,Sint4 y)
{
  initmiscspr(x-4,y-6,6,6);
  drawmiscspr(x-4,y-6,103,6,6);
  getis();
}

void drawbottomblob(Sint4 x,Sint4 y)
{
  initmiscspr(x-4,y+15,6,6);
  drawmiscspr(x-4,y+15,105,6,6);
  getis();
}

void drawfurryblob(Sint4 x,Sint4 y)
{
  initmiscspr(x-4,y+15,6,8);
  drawmiscspr(x-4,y+15,107,6,8);
  getis();
}

void drawsquareblob(Sint4 x,Sint4 y)
{
  initmiscspr(x-4,y+17,6,6);
  drawmiscspr(x-4,y+17,106,6,6);
  getis();
}

void drawbackg(Sint4 l)
{
  Sint4 x,y;
  for (y=14;y<200;y+=4) {
    fillbuffer();
    for (x=0;x<320;x+=20)
      drawmiscspr(x,y,93+l,5,4);
  }
}

void drawfire(int n,Sint4 x,Sint4 y,Sint4 t)
{
  int nn=(n==0) ? 0 : 32;
  if (t==0) {
    firespr[n]++;
    if (firespr[n]>2)
      firespr[n]=0;
    initspr(FIRSTFIREBALL+n,82+firespr[n]+nn,2,8,0,0);
  }
  else
    initspr(FIRSTFIREBALL+n,84+t+nn,2,8,0,0);
  drawspr(FIRSTFIREBALL+n,x,y);
}

void drawbonus(Sint4 x,Sint4 y)
{
  int n=0;
  initspr(FIRSTBONUS+n,81,4,15,0,0);
  movedrawspr(FIRSTBONUS+n,x,y);
}

void drawdigger(int n,Sint4 t,Sint4 x,Sint4 y,bool f)
{
  int nn=(n==0) ? 0 : 31;
  digspr[n]+=digspd[n];
  if (digspr[n]==2 || digspr[n]==0)
    digspd[n]=-digspd[n];
  if (digspr[n]>2)
    digspr[n]=2;
  if (digspr[n]<0)
    digspr[n]=0;
  if (t>=0 && t<=6 && !(t&1)) {
    initspr(FIRSTDIGGER+n,(t+(f ? 0 : 1))*3+digspr[n]+1+nn,4,15,0,0);
    drawspr(FIRSTDIGGER+n,x,y);
    return;
  }
  if (t>=10 && t<=15) {
    initspr(FIRSTDIGGER+n,40+nn-t,4,15,0,0);
    drawspr(FIRSTDIGGER+n,x,y);
    return;
  }
  first[0]=first[1]=first[2]=first[3]=first[4]=-1;
}

void drawlives(void)
{
  Sint4 l,n,g;
  char buf[10];
  if (gauntlet) {
    g=(Sint4)(cgtime/1193181l);
    sprintf(buf,"%3i:%02i",g/60,g%60);
    outtext(buf,124,0,3);
    return;
  }
  n=getlives(0)-1;
  outtext("     ",96,0,2);
  if (n>4) {
    drawlife(0,80,0);
    sprintf(buf,"X%i",n);
    outtext(buf,100,0,2);
  }
  else
    for (l=1;l<5;l++) {
      drawlife(n>0 ? 0 : 2,l*20+60,0);
      n--;
    }
  if (nplayers==2) {
    outtext("     ",164,0,2);
    n=getlives(1)-1;
    if (n>4) {
      sprintf(buf,"%iX",n);
      outtext(buf,220-strlen(buf)*12,0,2);
      drawlife(1,224,0);
    }
    else
      for (l=1;l<5;l++) {
        drawlife(n>0 ? 1 : 2,244-l*20,0);
        n--;
      }
  }
  if (diggers==2) {
    outtext("     ",164,0,1);
    n=getlives(1)-1;
    if (n>4) {
      sprintf(buf,"%iX",n);
      outtext(buf,220-strlen(buf)*12,0,1);
      drawlife(3,224,0);
    }
    else
      for (l=1;l<5;l++) {
        drawlife(n>0 ? 3 : 2,244-l*20,0);
        n--;
      }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -