📄 gamedef.c
字号:
case 20:
case 21:
case 22:
case 23:
case 24:
if(j == 24)
max_ammo_amount[11] = *scriptptr;
else max_ammo_amount[j-14] = *scriptptr;
break;
case 25:
camerashitable = *scriptptr;
break;
case 26:
numfreezebounces = *scriptptr;
break;
case 27:
freezerhurtowner = *scriptptr;
break;
case 28:
spriteqamount = *scriptptr;
if(spriteqamount > 1024) spriteqamount = 1024;
else if(spriteqamount < 0) spriteqamount = 0;
break;
case 29:
lasermode = *scriptptr;
break;
}
j++;
}
scriptptr++;
return 0;
}
return 0;
}
void passone(void)
{
while( parsecommand() == 0 );
if( (error+warning) > 12)
puts( " * ERROR! Too many warnings or errors.");
}
char *defaultcons[3] =
{
{"GAME.CON"},
{"USER.CON"},
{"DEFS.CON"}
};
void copydefaultcons(void)
{
long i, fs, fpi;
FILE *fpo;
for(i=0;i<3;i++)
{
fpi = kopen4load( defaultcons[i] , 1 );
fpo = fopen( defaultcons[i],"wb");
if(fpi == 0)
{
if(fpo == -1) fclose(fpo);
continue;
}
if(fpo == -1)
{
if(fpi == 0) kclose(fpi);
continue;
}
fs = kfilelength(fpi);
kread(fpi,&hittype[0],fs);
fwrite(&hittype[0],fs,1,fpo);
kclose(fpi);
fclose(fpo);
}
}
void loadefs(char *filenam,char *mptr)
{
int i;
long fs,fp;
if(!SafeFileExists(filenam) && loadfromgrouponly == 0)
{
puts("Missing external con file(s).");
puts("COPY INTERNAL DEFAULTS TO DIRECTORY(Y/n)?");
KB_FlushKeyboardQueue();
while( KB_KeyWaiting() );
i = KB_Getch();
if(i == 'y' || i == 'Y' )
{
puts(" Yes");
copydefaultcons();
}
}
fp = kopen4load(filenam,loadfromgrouponly);
if( fp == 0 )
{
if( loadfromgrouponly == 1 )
gameexit("\nMissing con file(s).");
loadfromgrouponly = 1;
return; //Not there
}
else
{
printf("Compiling: '%s'.\n",filenam);
fs = kfilelength(fp);
last_used_text = textptr = (char *) mptr;
last_used_size = fs;
kread(fp,(char *)textptr,fs);
kclose(fp);
}
textptr[fs - 2] = 0;
clearbuf(actorscrptr,MAXSPRITES,0L);
clearbufbyte(actortype,MAXSPRITES,0L);
labelcnt = 0;
scriptptr = script+1;
warning = 0;
error = 0;
line_number = 1;
total_lines = 0;
passone(); //Tokenize
*script = (long) scriptptr;
if(warning|error)
printf("Found %ld warning(s), %ld error(s).\n",warning,error);
if( error == 0 && warning != 0)
{
if( groupfile != -1 && loadfromgrouponly == 0 )
{
printf("\nWarnings found in %s file. You should backup the original copies before\n",filenam);
puts("before attempting to modify them. Do you want to use the");
puts("INTERNAL DEFAULTS (y/N)?");
KB_FlushKeyboardQueue();
while( KB_KeyWaiting() );
i = KB_Getch();
if(i == 'y' || i == 'Y' )
{
loadfromgrouponly = 1;
puts(" Yes");
return;
}
}
}
if(error)
{
if( loadfromgrouponly )
{
sprintf(buf,"\nError in %s.",filenam);
gameexit(buf);
}
else
{
if( groupfile != -1 && loadfromgrouponly == 0 )
{
printf("\nErrors found in %s file. You should backup the original copies\n",filenam);
puts("before attempting to modify them. Do you want to use the");
puts("internal defaults (Y/N)?");
KB_FlushKeyboardQueue();
while( !KB_KeyWaiting() );
i = KB_Getch();
if( i == 'y' || i == 'Y' )
{
puts(" Yes");
loadfromgrouponly = 1;
return;
}
else gameexit("");
}
}
}
else
{
total_lines += line_number;
printf("Code Size:%ld bytes(%ld labels).\n",(long)((scriptptr-script)<<2)-4,labelcnt);
}
}
char dodge(spritetype *s)
{
short i;
long bx,by,mx,my,bxvect,byvect,mxvect,myvect,d;
mx = s->x;
my = s->y;
mxvect = sintable[(s->ang+512)&2047]; myvect = sintable[s->ang&2047];
for(i=headspritestat[4];i>=0;i=nextspritestat[i]) //weapons list
{
if( OW == i || SECT != s->sectnum)
continue;
bx = SX-mx;
by = SY-my;
bxvect = sintable[(SA+512)&2047]; byvect = sintable[SA&2047];
if (mxvect*bx + myvect*by >= 0)
if (bxvect*bx + byvect*by < 0)
{
d = bxvect*by - byvect*bx;
if (klabs(d) < 65536*64)
{
s->ang -= 512+(TRAND&1024);
return 1;
}
}
}
return 0;
}
short furthestangle(short i,short angs)
{
short j, hitsect,hitwall,hitspr,furthest_angle, angincs;
long hx, hy, hz, d, greatestd;
spritetype *s = &sprite[i];
greatestd = -(1<<30);
angincs = 2048/angs;
if(s->picnum != APLAYER)
if( (g_t[0]&63) > 2 ) return( s->ang + 1024 );
for(j=s->ang;j<(2048+s->ang);j+=angincs)
{
hitscan(s->x, s->y, s->z-(8<<8), s->sectnum,
sintable[(j+512)&2047],
sintable[j&2047],0,
&hitsect,&hitwall,&hitspr,&hx,&hy,&hz,CLIPMASK1);
d = klabs(hx-s->x) + klabs(hy-s->y);
if(d > greatestd)
{
greatestd = d;
furthest_angle = j;
}
}
return (furthest_angle&2047);
}
short furthestcanseepoint(short i,spritetype *ts,long *dax,long *day)
{
short j, hitsect,hitwall,hitspr, angincs, tempang;
long hx, hy, hz, d, da;//, d, cd, ca,tempx,tempy,cx,cy;
spritetype *s = &sprite[i];
if( (g_t[0]&63) ) return -1;
if(ud.multimode < 2 && ud.player_skill < 3)
angincs = 2048/2;
else angincs = 2048/(1+(TRAND&1));
for(j=ts->ang;j<(2048+ts->ang);j+=(angincs-(TRAND&511)))
{
hitscan(ts->x, ts->y, ts->z-(16<<8), ts->sectnum,
sintable[(j+512)&2047],
sintable[j&2047],16384-(TRAND&32767),
&hitsect,&hitwall,&hitspr,&hx,&hy,&hz,CLIPMASK1);
d = klabs(hx-ts->x)+klabs(hy-ts->y);
da = klabs(hx-s->x)+klabs(hy-s->y);
if( d < da )
if(cansee(hx,hy,hz,hitsect,s->x,s->y,s->z-(16<<8),s->sectnum))
{
*dax = hx;
*day = hy;
return hitsect;
}
}
return -1;
}
void alterang(short a)
{
short aang, angdif, goalang,j;
long ticselapsed, *moveptr;
moveptr = (long *)g_t[1];
ticselapsed = (g_t[0])&31;
aang = g_sp->ang;
g_sp->xvel += (*moveptr-g_sp->xvel)/5;
if(g_sp->zvel < 648) g_sp->zvel += ((*(moveptr+1)<<4)-g_sp->zvel)/5;
if(a&seekplayer)
{
j = ps[g_p].holoduke_on;
if(j >= 0 && cansee(sprite[j].x,sprite[j].y,sprite[j].z,sprite[j].sectnum,g_sp->x,g_sp->y,g_sp->z,g_sp->sectnum) )
g_sp->owner = j;
else g_sp->owner = ps[g_p].i;
if(sprite[g_sp->owner].picnum == APLAYER)
goalang = getangle(hittype[g_i].lastvx-g_sp->x,hittype[g_i].lastvy-g_sp->y);
else
goalang = getangle(sprite[g_sp->owner].x-g_sp->x,sprite[g_sp->owner].y-g_sp->y);
if(g_sp->xvel && g_sp->picnum != DRONE)
{
angdif = getincangle(aang,goalang);
if(ticselapsed < 2)
{
if( klabs(angdif) < 256)
{
j = 128-(TRAND&256);
g_sp->ang += j;
if( hits(g_i) < 844 )
g_sp->ang -= j;
}
}
else if(ticselapsed > 18 && ticselapsed < 26) // choose
{
if(klabs(angdif>>2) < 128) g_sp->ang = goalang;
else g_sp->ang += angdif>>2;
}
}
else g_sp->ang = goalang;
}
if(ticselapsed < 1)
{
j = 2;
if(a&furthestdir)
{
goalang = furthestangle(g_i,j);
g_sp->ang = goalang;
g_sp->owner = ps[g_p].i;
}
if(a&fleeenemy)
{
goalang = furthestangle(g_i,j);
g_sp->ang = goalang; // += angdif; // = getincangle(aang,goalang)>>1;
}
}
}
void move()
{
long l, *moveptr;
short j, a, goalang, angdif;
long daxvel;
a = g_sp->hitag;
if(a == -1) a = 0;
g_t[0]++;
if(a&face_player)
{
if(ps[g_p].newowner >= 0)
goalang = getangle(ps[g_p].oposx-g_sp->x,ps[g_p].oposy-g_sp->y);
else goalang = getangle(ps[g_p].posx-g_sp->x,ps[g_p].posy-g_sp->y);
angdif = getincangle(g_sp->ang,goalang)>>2;
if(angdif > -8 && angdif < 0) angdif = 0;
g_sp->ang += angdif;
}
if(a&spin)
g_sp->ang += sintable[ ((g_t[0]<<3)&2047) ]>>6;
if(a&face_player_slow)
{
if(ps[g_p].newowner >= 0)
goalang = getangle(ps[g_p].oposx-g_sp->x,ps[g_p].oposy-g_sp->y);
else goalang = getangle(ps[g_p].posx-g_sp->x,ps[g_p].posy-g_sp->y);
angdif = ksgn(getincangle(g_sp->ang,goalang))<<5;
if(angdif > -32 && angdif < 0)
{
angdif = 0;
g_sp->ang = goalang;
}
g_sp->ang += angdif;
}
if((a&jumptoplayer) == jumptoplayer)
{
if(g_t[0] < 16)
g_sp->zvel -= (sintable[(512+(g_t[0]<<4))&2047]>>5);
}
if(a&face_player_smart)
{
long newx,newy;
newx = ps[g_p].posx+(ps[g_p].posxv/768);
newy = ps[g_p].posy+(ps[g_p].posyv/768);
goalang = getangle(newx-g_sp->x,newy-g_sp->y);
angdif = getincangle(g_sp->ang,goalang)>>2;
if(angdif > -8 && angdif < 0) angdif = 0;
g_sp->ang += angdif;
}
if( g_t[1] == 0 || a == 0 )
{
if( ( badguy(g_sp) && g_sp->extra <= 0 ) || (hittype[g_i].bposx != g_sp->x) || (hittype[g_i].bposy != g_sp->y) )
{
hittype[g_i].bposx = g_sp->x;
hittype[g_i].bposy = g_sp->y;
setsprite(g_i,g_sp->x,g_sp->y,g_sp->z);
}
return;
}
moveptr = (long *)g_t[1];
if(a&geth) g_sp->xvel += (*moveptr-g_sp->xvel)>>1;
if(a&getv) g_sp->zvel += ((*(moveptr+1)<<4)-g_sp->zvel)>>1;
if(a&dodgebullet)
dodge(g_sp);
if(g_sp->picnum != APLAYER)
alterang(a);
if(g_sp->xvel > -6 && g_sp->xvel < 6 ) g_sp->xvel = 0;
a = badguy(g_sp);
if(g_sp->xvel || g_sp->zvel)
{
if(a && g_sp->picnum != ROTATEGUN)
{
if( (g_sp->picnum == DRONE || g_sp->picnum == COMMANDER) && g_sp->extra > 0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -