📄 game.c
字号:
setanimation(&wall[i].x,wall[i].x+dax2,4L,0L); setanimation(&wall[wall[wallfind[j]].point2].x,wall[wall[wallfind[j]].point2].x+dax2,4L,0L); } else if (day2 != 0) { day2 = wall[wall[wall[wallfind[j]].point2].point2].y; day2 -= wall[wall[wallfind[j]].point2].y; setanimation(&wall[wallfind[j]].y,wall[wallfind[j]].y+day2,4L,0L); setanimation(&wall[i].y,wall[i].y+day2,4L,0L); setanimation(&wall[wall[wallfind[j]].point2].y,wall[wall[wallfind[j]].point2].y+day2,4L,0L); } } else { i = wallfind[j]-1; if (i < startwall) i = endwall-1; dax2 = ((wall[i].x+wall[wall[wallfind[j]].point2].x)>>1)-wall[wallfind[j]].x; day2 = ((wall[i].y+wall[wall[wallfind[j]].point2].y)>>1)-wall[wallfind[j]].y; if (dax2 != 0) { setanimation(&wall[wallfind[j]].x,centx,4L,0L); setanimation(&wall[i].x,centx+dax2,4L,0L); setanimation(&wall[wall[wallfind[j]].point2].x,centx+dax2,4L,0L); } else if (day2 != 0) { setanimation(&wall[wallfind[j]].y,centy,4L,0L); setanimation(&wall[i].y,centy+day2,4L,0L); setanimation(&wall[wall[wallfind[j]].point2].y,centy+day2,4L,0L); } } } wsayfollow("updowndr.wav",4096L-256L,256L,¢x,¢y,0); wsayfollow("updowndr.wav",4096L+256L,256L,¢x,¢y,0); } if (datag == 13) /* Swinging door */ { for(i=0;i<swingcnt;i++) { if (swingsector[i] == dasector) { if (swinganginc[i] == 0) { if (swingang[i] == swingangclosed[i]) { swinganginc[i] = swingangopendir[i]; wsayfollow("opendoor.wav",4096L+(krand()&511)-256,256L,¢x,¢y,0); } else swinganginc[i] = -swingangopendir[i]; } else swinganginc[i] = -swinganginc[i]; for(j=1;j<=3;j++) { setinterpolation(&wall[swingwall[i][j]].x); setinterpolation(&wall[swingwall[i][j]].y); } } } } if (datag == 16) /* True sideways double-sliding door */ { /* get 2 closest line segments to center (dax, day) */ wallfind[0] = -1; wallfind[1] = -1; for(i=startwall;i<endwall;i++) if (wall[i].lotag == 6) { if (wallfind[0] == -1) wallfind[0] = i; else wallfind[1] = i; } for(j=0;j<2;j++) { if ((((wall[wallfind[j]].x+wall[wall[wallfind[j]].point2].x)>>1) == centx) && (((wall[wallfind[j]].y+wall[wall[wallfind[j]].point2].y)>>1) == centy)) { /* door was closed */ /* find what direction door should open */ i = wallfind[j]-1; if (i < startwall) i = endwall-1; dax2 = wall[i].x-wall[wallfind[j]].x; day2 = wall[i].y-wall[wallfind[j]].y; if (dax2 != 0) { dax2 = wall[wall[wall[wall[wallfind[j]].point2].point2].point2].x; dax2 -= wall[wall[wall[wallfind[j]].point2].point2].x; setanimation(&wall[wallfind[j]].x,wall[wallfind[j]].x+dax2,4L,0L); setanimation(&wall[i].x,wall[i].x+dax2,4L,0L); setanimation(&wall[wall[wallfind[j]].point2].x,wall[wall[wallfind[j]].point2].x+dax2,4L,0L); setanimation(&wall[wall[wall[wallfind[j]].point2].point2].x,wall[wall[wall[wallfind[j]].point2].point2].x+dax2,4L,0L); } else if (day2 != 0) { day2 = wall[wall[wall[wall[wallfind[j]].point2].point2].point2].y; day2 -= wall[wall[wall[wallfind[j]].point2].point2].y; setanimation(&wall[wallfind[j]].y,wall[wallfind[j]].y+day2,4L,0L); setanimation(&wall[i].y,wall[i].y+day2,4L,0L); setanimation(&wall[wall[wallfind[j]].point2].y,wall[wall[wallfind[j]].point2].y+day2,4L,0L); setanimation(&wall[wall[wall[wallfind[j]].point2].point2].y,wall[wall[wall[wallfind[j]].point2].point2].y+day2,4L,0L); } } else { /* door was not closed */ i = wallfind[j]-1; if (i < startwall) i = endwall-1; dax2 = wall[i].x-wall[wallfind[j]].x; day2 = wall[i].y-wall[wallfind[j]].y; if (dax2 != 0) { setanimation(&wall[wallfind[j]].x,centx,4L,0L); setanimation(&wall[i].x,centx+dax2,4L,0L); setanimation(&wall[wall[wallfind[j]].point2].x,centx,4L,0L); setanimation(&wall[wall[wall[wallfind[j]].point2].point2].x,centx+dax2,4L,0L); } else if (day2 != 0) { setanimation(&wall[wallfind[j]].y,centy,4L,0L); setanimation(&wall[i].y,centy+day2,4L,0L); setanimation(&wall[wall[wallfind[j]].point2].y,centy,4L,0L); setanimation(&wall[wall[wall[wallfind[j]].point2].point2].y,centy+day2,4L,0L); } } } wsayfollow("updowndr.wav",4096L-64L,256L,¢x,¢y,0); wsayfollow("updowndr.wav",4096L+64L,256L,¢x,¢y,0); }} /* * New movesprite using getzrange. Note that I made the getzrange * parameters global (&globhiz,&globhihit,&globloz,&globlohit) so they * don't need to be passed everywhere. Also this should make this * movesprite function compatible with the older movesprite functions. */short movesprite(short spritenum, long dx, long dy, long dz, long ceildist, long flordist, long clipmask){ long daz, zoffs; short retval, dasectnum, datempshort; spritetype *spr; spr = &sprite[spritenum]; if ((spr->cstat&128) == 0) zoffs = -((tilesizy[spr->picnum]*spr->yrepeat)<<1); else zoffs = 0; dasectnum = spr->sectnum; /* Can't modify sprite sectors directly becuase of linked lists */ daz = spr->z+zoffs; /* Must do this if not using the new centered centering (of course) */ retval = clipmove(&spr->x,&spr->y,&daz,&dasectnum,dx,dy, ((long)spr->clipdist)<<2,ceildist,flordist,clipmask); if (dasectnum < 0) retval = -1; if ((dasectnum != spr->sectnum) && (dasectnum >= 0)) changespritesect(spritenum,dasectnum); /* * Set the blocking bit to 0 temporarly so getzrange doesn't pick up * its own sprite */ datempshort = spr->cstat; spr->cstat &= ~1; getzrange(spr->x,spr->y,spr->z-1,spr->sectnum, &globhiz,&globhihit,&globloz,&globlohit, ((long)spr->clipdist)<<2,clipmask); spr->cstat = datempshort; daz = spr->z+zoffs + dz; if ((daz <= globhiz) || (daz > globloz)) { if (retval != 0) return(retval); return(16384+dasectnum); } spr->z = daz-zoffs; return(retval);}void shootgun(short snum, long x, long y, long z, short daang, long dahoriz, short dasectnum, char guntype){ short hitsect, hitwall, hitsprite, daang2; long j, daz2, hitx, hity, hitz; switch(guntype) { case 0: /* Shoot chain gun */ daang2 = ((daang + (krand()&31)-16)&2047); daz2 = ((100-dahoriz)*2000) + ((krand()-32768)>>1); hitscan(x,y,z,dasectnum, /* Start position */ sintable[(daang2+512)&2047], /* X vector of 3D ang */ sintable[daang2&2047], /* Y vector of 3D ang */ daz2, /* Z vector of 3D ang */ &hitsect,&hitwall,&hitsprite,&hitx,&hity,&hitz,CLIPMASK1); if (wall[hitwall].picnum == KENPICTURE) { if (waloff[MAXTILES-1] != 0) wall[hitwall].picnum = MAXTILES-1; wsayfollow("hello.wav",4096L+(krand()&127)-64,256L,&wall[hitwall].x,&wall[hitwall].y,0); } else if (((hitwall < 0) && (hitsprite < 0) && (hitz >= z) && ((sector[hitsect].floorpicnum == SLIME) || (sector[hitsect].floorpicnum == FLOORMIRROR))) || ((hitwall >= 0) && (wall[hitwall].picnum == SLIME))) { /* If you shoot slime, make a splash */ wsayfollow("splash.wav",4096L+(krand()&511)-256,256L,&hitx,&hity,0); spawnsprite(j,hitx,hity,hitz,2,0,0,32,64,64,0,0,SPLASH,daang, 0,0,0,snum+4096,hitsect,4,63,0,0); /* 63=time left for splash */ } else { wsayfollow("shoot.wav",4096L+(krand()&127)-64,256L,&hitx,&hity,0); if ((hitsprite >= 0) && (sprite[hitsprite].statnum < MAXSTATUS)) switch(sprite[hitsprite].picnum) { case BROWNMONSTER: if (sprite[hitsprite].lotag > 0) sprite[hitsprite].lotag -= 10; if (sprite[hitsprite].lotag > 0) { wsayfollow("hurt.wav",4096L+(krand()&511)-256,256L,&hitx,&hity,0); if (sprite[hitsprite].lotag <= 25) sprite[hitsprite].cstat |= 2; } else { wsayfollow("mondie.wav",4096L+(krand()&127)-64,256L,&hitx,&hity,0); sprite[hitsprite].z += ((tilesizy[sprite[hitsprite].picnum]*sprite[hitsprite].yrepeat)<<1); sprite[hitsprite].picnum = GIFTBOX; sprite[hitsprite].cstat &= ~0x83; /* Should not clip, foot-z */ changespritestat(hitsprite,12); spawnsprite(j,hitx,hity,hitz+(32<<8),0,-4,0,32,64,64, 0,0,EXPLOSION,daang,0,0,0,snum+4096, hitsect,5,31,0,0); } break; case EVILAL: wsayfollow("blowup.wav",4096L+(krand()&127)-64,256L,&hitx,&hity,0); sprite[hitsprite].picnum = EVILALGRAVE; sprite[hitsprite].cstat = 0; sprite[hitsprite].xvel = (krand()&255)-128; sprite[hitsprite].yvel = (krand()&255)-128; sprite[hitsprite].zvel = (krand()&4095)-3072; changespritestat(hitsprite,9); spawnsprite(j,hitx,hity,hitz+(32<<8),0,-4,0,32,64,64,0, 0,EXPLOSION,daang,0,0,0,snum+4096,hitsect,5,31,0,0); /* 31=time left for explosion */ break; case PLAYER: for(j=connecthead;j>=0;j=connectpoint2[j]) if (playersprite[j] == hitsprite) { wsayfollow("ouch.wav",4096L+(krand()&127)-64,256L,&hitx,&hity,0); changehealth(j,-10); break; } break; } spawnsprite(j,hitx,hity,hitz+(8<<8),2,-4,0,32,16,16,0,0, EXPLOSION,daang,0,0,0,snum+4096,hitsect,3,63,0,0); /* * Sprite starts out with center exactly on wall. * This moves it back enough to see it at all angles. */ movesprite((short)j,-(((long)sintable[(512+daang)&2047]*TICSPERFRAME)<<4),-(((long)sintable[daang]*TICSPERFRAME)<<4),0L,4L<<8,4L<<8,CLIPMASK1); } break; case 1: /* Shoot silver sphere bullet */ spawnsprite(j,x,y,z,1+128,0,0,16,64,64,0,0,BULLET,daang, sintable[(daang+512)&2047]>>5,sintable[daang&2047]>>5, (100-dahoriz)<<6,snum+4096,dasectnum,6,0,0,0); wsayfollow("shoot2.wav",4096L+(krand()&127)-64,128L,&sprite[j].x,&sprite[j].y,1); break; case 2: /* Shoot bomb */ spawnsprite(j,x,y,z,128,0,0,12,16,16,0,0,BOMB,daang, sintable[(daang+512)&2047]*5>>8,sintable[daang&2047]*5>>8, (80-dahoriz)<<6,snum+4096,dasectnum,6,0,0,0); wsayfollow("shoot3.wav",4096L+(krand()&127)-64,192L,&sprite[j].x,&sprite[j].y,1); break; case 3: /* Shoot missile (Andy did this) */ spawnsprite(j,x,y,z,1+128,0,0,16,32,32,0,0,MISSILE,daang, sintable[(daang+512)&2047]>>4,sintable[daang&2047]>>4, (100-dahoriz)<<7,snum+4096,dasectnum,6,0,0,0); wsayfollow("shoot3.wav",4096L+(krand()&127)-64,192L,&sprite[j].x,&sprite[j].y,1); break; case 4: /* Shoot grabber (Andy did this) */ spawnsprite(j,x,y,z,1+128,0,0,16,64,64,0,0,GRABBER,daang, sintable[(daang+512)&2047]>>5,sintable[daang&2047]>>5, (100-dahoriz)<<6,snum+4096,dasectnum,6,0,0,0); wsayfollow("shoot4.wav",4096L+(krand()&127)-64,128L,&sprite[j].x,&sprite[j].y,1); break; }}void operatesprite(short dasprite){ long datag; datag = sprite[dasprite].lotag; if (datag == 2) /* A sprite that shoots a bomb */ { shootgun(dasprite, sprite[dasprite].x,sprite[dasprite].y,sprite[dasprite].z, sprite[dasprite].ang,100L,sprite[dasprite].sectnum,2); }}void checktouchsprite(short snum, short sectnum){ long i, nexti; if ((sectnum < 0) || (sectnum >= numsectors)) return; for(i=headspritesect[sectnum];i>=0;i=nexti) { nexti = nextspritesect[i]; if (sprite[i].cstat&0x8000) continue; if ((klabs(posx[snum]-sprite[i].x)+klabs(posy[snum]-sprite[i].y) < 512) && (klabs((posz[snum]>>8)-((sprite[i].z>>8)-(tilesizy[sprite[i].picnum]>>1))) <= 40)) { switch(sprite[i].picnum) { case COIN: wsayfollow("getstuff.wav",4096L+(krand()&127)-64,192L,&sprite[i].x,&sprite[i].y,0); changehealth(snum,5); if (sprite[i].statnum == 12) deletesprite((short)i); else { sprite[i].cstat |= 0x8000; sprite[i].extra = 120*60; changespritestat((short)i,11); } break; case DIAMONDS: wsayfollow("getstuff.wav",4096L+(krand()&127)-64,256L,&sprite[i].x,&sprite[i].y,0); changehealth(snum,15); if (sprite[i].statnum == 12) deletesprite((short)i); else { sprite[i].cstat |= 0x8000; sprite[i].extra = 120*120; changespritestat((short)i,11); } break; case COINSTACK: wsayfollow("getstuff.wav",4096L+(krand()&127)-64,256L,&sprite[i].x,&sprite[i].y,0); changehealth(snum,25); if (sprite[i].statnum == 12) deletesprite((short)i); else { sprite[i].cstat |= 0x8000; sprite[i].extra = 120*180; changespritestat((short)i,11); } break; case GIFTBOX: wsayfollow("getstuff.wav",4096L+(krand()&127)+256-mulscale4(sprite[i].xrepeat,sprite[i].yrepeat),208L,&sprite[i].x,&sprite[i].y,0); changehealth(snum,max(mulscale8(sprite[i].xrepeat,sprite[i].yrepeat),1)); if (sprite[i].statnum == 12) deletesprite((short)i); else { sprite[i].cstat |= 0x8000; sprite[i].extra = 90*(sprite[i].xrepeat+sprite[i].yrepeat); changespritestat((short)i,11); } break; case CANNON: wsayfollow("getstuff.wav",3584L+(krand()&127)-64,256L,&sprite[i].x,&sprite[i].y,0); if (snum == myconnectindex) keystatus[4] = 1; changenumbombs(snum,((sprite[i].xrepeat+sprite[i].yrepeat)>>1)); if (sprite[i].statnum == 12) deletesprite((short)i); else { sprite[i].cstat |= 0x8000; sprite[i].extra = 60*(sprite[i].xrepeat+sprite[i].yrepeat); changespritestat((short)i,11); } break; case LAUNCHER: wsayfollow("getstuff.wav",3584L+(krand()&127)-64,256L,&sprite[i].x,&sprite[i].y,0); if (snum == myconnectindex) keystatus[5] = 1; changenummissiles(snum,((sprite[i].xrepeat+sprite[i].yrepeat)>>1)); if (sprite[i].statnum == 12) deletesprite((short)i); else { sprite[i].cstat |= 0x8000; sprite[i].extra = 90*(sprite[i].xrepeat+sprite[i].yrepeat); changespritestat((short)i,11); } break; case GRABCANNON: wsayfollow("getstuff.wav",3584L+(krand()&127)-64,256L,&sprite[i].x,&sprite[i].y,0); if (snum == myconnectindex) keystatus[6] = 1; changenumgrabbers(snum,((sprite[i].xrepeat+sprite[i].yrepeat)>>1)); if (sprite[i].statnum == 12) deletesprite((short)i); else { sprite[i].cstat |= 0x8000; sprite[i].extra = 120*(sprite[i].xrepeat+sprite[i].yrepeat); changespritestat((short)i,11); } break; case AIRPLANE: wsayfollow("getstuff.wav",4096L+(krand()&127)-64,256L,&sprite[i].x,&sprite[i].y,0); if (flytime[snum] < lockclock) flytime[snum] = lockclock; flytime[snum] += 60*(sprite[i].xrepeat+sprite[i].yrepeat); drawstatusflytime(snum); if (sprite[i].statnum == 12) deletesprite((short)i); else { sprite[i].cstat |= 0x8000; sprite[i].extra = 120*(sprite[i].xrepeat+sprite[i].yrepeat); changespritestat((short)i,11);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -