%20WL_ACT2.C
////////////////////////////////////////////////////////
//
// A_MechaSound
// A_Slurpie
//
////////////////////////////////////////////////////////
void A_MechaSound (objtype *ob)
{
if (areabyplayer[ob->areanumber])
PlaySoundLocActor (MECHSTEPSND,ob);
}
#pragma argsused
void A_Slurpie (objtype *ob)
{
SD_PlaySound(SLURPIESND);
}
/*
=================
=
= T_FakeFire
=
=================
*/
void T_FakeFire (objtype *ob)
{
long deltax,deltay;
float angle;
int iangle;
deltax = player->x - ob->x;
deltay = ob->y - player->y;
angle = atan2 (deltay,deltax);
if (angle<0)
angle = M_PI*2+angle;
iangle = angle/(M_PI*2)*ANGLES;
GetNewActor ();
new->state = &s_fire1;
new->ticcount = 1;
new->tilex = ob->tilex;
new->tiley = ob->tiley;
new->x = ob->x;
new->y = ob->y;
new->dir = nodir;
new->angle = iangle;
new->obclass = fireobj;
new->speed = 0x1200l;
new->flags = FL_NEVERMARK;
new->active = true;
PlaySoundLocActor (FLAMETHROWERSND,new);
}
/*
=================
=
= T_Fake
=
=================
*/
void T_Fake (objtype *ob)
{
long move;
int dx,dy,dist;
boolean dodge;
if (CheckLine(ob)) // got a shot at player?
{
if ( US_RndT() < (tics<<1) )
{
//
// go into attack frame
//
NewState (ob,&s_fakeshoot1);
return;
}
}
if (ob->dir == nodir)
{
SelectDodgeDir (ob);
if (ob->dir == nodir)
return; // object is blocked in
}
move = ob->speed*tics;
while (move)
{
if (move < ob->distance)
{
MoveObj (ob,move);
break;
}
//
// reached goal tile, so select another one
//
//
// fix position to account for round off during moving
//
ob->x = ((long)ob->tilex<y = ((long)ob->tiley<distance;
SelectDodgeDir (ob);
if (ob->dir == nodir)
return; // object is blocked in
}
}
#endif
/*
=========================================================================
===
STAND
=========================================================================
===
*/
/*
===============
=
= T_Stand
=
===============
*/
void T_Stand (objtype *ob)
{
SightPlayer (ob);
}
/*
=========================================================================
===
CHASE
=========================================================================
===
*/
/*
=================
=
= T_Chase
=
=================
*/
void T_Chase (objtype *ob)
{
long move;
int dx,dy,dist,chance;
boolean dodge;
if (gamestate.victoryflag)
return;
dodge = false;
if (CheckLine(ob)) // got a shot at player?
{
dx = abs(ob->tilex - player->tilex);
dy = abs(ob->tiley - player->tiley);
dist = dx>dy ? dx : dy;
if (!dist || (dist==1 && ob->distance<0x4000) )
chance = 300;
else
chance = (tics<<4)/dist;
if ( US_RndT()obclass)
{
case guardobj:
NewState (ob,&s_grdshoot1);
break;
case officerobj:
NewState (ob,&s_ofcshoot1);
break;
case mutantobj:
NewState (ob,&s_mutshoot1);
break;
case ssobj:
NewState (ob,&s_ssshoot1);
break;
#ifndef SPEAR
case bossobj:
NewState (ob,&s_bossshoot1);
break;
case gretelobj:
NewState (ob,&s_gretelshoot1);
break;
case mechahitlerobj:
NewState (ob,&s_mechashoot1);
break;
case realhitlerobj:
NewState (ob,&s_hitlershoot1);
break;
#else
case angelobj:
NewState (ob,&s_angelshoot1);
break;
case transobj:
NewState (ob,&s_transshoot1);
break;
case uberobj:
NewState (ob,&s_ubershoot1);
break;
case willobj:
NewState (ob,&s_willshoot1);
break;
case deathobj:
NewState (ob,&s_deathshoot1);
break;
#endif
}
return;
}
dodge = true;
}
if (ob->dir == nodir)
{
if (dodge)
SelectDodgeDir (ob);
else
SelectChaseDir (ob);
if (ob->dir == nodir)
return; // object is blocked in
}
move = ob->speed*tics;
while (move)
{
if (ob->distance < 0)
{
//
// waiting for a door to open
//
OpenDoor (-ob->distance-1);
if (doorobjlist[-ob->distance-1].action != dr_open)
return;
ob->distance = TILEGLOBAL; // go ahead, the door is now
opoen
}
if (move < ob->distance)
{
MoveObj (ob,move);
break;
}
//
// reached goal tile, so select another one
//
//
// fix position to account for round off during moving
//
ob->x = ((long)ob->tilex<y = ((long)ob->tiley<distance;
if (dodge)
SelectDodgeDir (ob);
else
SelectChaseDir (ob);
if (ob->dir == nodir)
return; // object is blocked in
}
}
/*
=================
=
= T_Ghosts
=
=================
*/
void T_Ghosts (objtype *ob)
{
long move;
if (ob->dir == nodir)
{
SelectChaseDir (ob);
if (ob->dir == nodir)
return; // object is blocked in
}
move = ob->speed*tics;
while (move)
{
if (move < ob->distance)
{
MoveObj (ob,move);
break;
}
//
// reached goal tile, so select another one
//
//
// fix position to account for round off during moving
//
ob->x = ((long)ob->tilex<y = ((long)ob->tiley<distance;
SelectChaseDir (ob);
if (ob->dir == nodir)
return; // object is blocked in
}
}
/*
=================
=
= T_DogChase
=
=================
*/
void T_DogChase (objtype *ob)
{
long move;
int dist,chance;
long dx,dy;
if (ob->dir == nodir)
{
SelectDodgeDir (ob);
if (ob->dir == nodir)
return; // object is blocked in
}
move = ob->speed*tics;
while (move)
{
//
// check for byte range
//
dx = player->x - ob->x;
if (dx<0)
dx = -dx;
dx -= move;
if (dx <= MINACTORDIST)
{
dy = player->y - ob->y;
if (dy<0)
dy = -dy;
dy -= move;
if (dy <= MINACTORDIST)
{
NewState (ob,&s_dogjump1);
return;
}
}
if (move < ob->distance)
{
MoveObj (ob,move);
break;
}
//
// reached goal tile, so select another one
//
//
// fix position to account for round off during moving
//
ob->x = ((long)ob->tilex<y = ((long)ob->tiley<distance;
SelectDodgeDir (ob);
if (ob->dir == nodir)
return; // object is blocked in
}
}
/*
=========================================================================
===
PATH
=========================================================================
===
*/
/*
===============
=
= SelectPathDir
=
===============
*/
void SelectPathDir (objtype *ob)
{
unsigned spot;
spot = MAPSPOT(ob->tilex,ob->tiley,1)-ICONARROWS;
if (spot<8)
{
// new direction
ob->dir = spot;
}
ob->distance = TILEGLOBAL;
if (!TryWalk (ob))
ob->dir = nodir;
}
/*
===============
=
= T_Path
=
===============
*/
void T_Path (objtype *ob)
{
long move;
long deltax,deltay,size;
if (SightPlayer (ob))
return;
if (ob->dir == nodir)
{
SelectPathDir (ob);
if (ob->dir == nodir)
return; // all movement is blocked
}
move = ob->speed*tics;
while (move)
{
if (ob->distance < 0)
{
//
// waiting for a door to open
//
OpenDoor (-ob->distance-1);
if (doorobjlist[-ob->distance-1].action != dr_open)
return;
ob->distance = TILEGLOBAL; // go ahead, the door is now
opoen
}
if (move < ob->distance)
{
MoveObj (ob,move);
break;
}
if (ob->tilex>MAPSIZE || ob->tiley>MAPSIZE)
{
sprintf (str,"T_Path hit a wall at %u,%u, dir %u"
,ob->tilex,ob->tiley,ob->dir);
Quit (str);
}
ob->x = ((long)ob->tilex<y = ((long)ob->tiley<distance;
SelectPathDir (ob);
if (ob->dir == nodir)
return; // all movement is blocked
}
}
/*
=========================================================================
====
FIGHT
=========================================================================
====
*/
/*
===============
=
= T_Shoot
=
= Try to damage the player, based on skill level and player's speed
=
===============
*/
void T_Shoot (objtype *ob)
{
int dx,dy,dist;
int hitchance,damage;
hitchance = 128;
if (!areabyplayer[ob->areanumber])
return;
if (!CheckLine (ob)) // player is behind a wall
return;
dx = abs(ob->tilex - player->tilex);
dy = abs(ob->tiley - player->tiley);
dist = dx>dy ? dx:dy;
if (ob->obclass == ssobj || ob->obclass == bossobj)
dist = dist*2/3; // ss are better shots
if (thrustspeed >= RUNSPEED)
{
if (ob->flags&FL_VISABLE)
hitchance = 160-dist*16; // player can see to dodge
else
hitchance = 160-dist*8;
}
else
{
if (ob->flags&FL_VISABLE)
hitchance = 256-dist*16; // player can see to dodge
else
hitchance = 256-dist*8;
}
// see if the shot was a hit
if (US_RndT()>2;
else if (dist<4)
damage = US_RndT()>>3;
else
damage = US_RndT()>>4;
TakeDamage (damage,ob);
}
switch(ob->obclass)
{
case ssobj:
PlaySoundLocActor(SSFIRESND,ob);
break;
#ifndef SPEAR
case giftobj:
case fatobj:
PlaySoundLocActor(MISSILEFIRESND,ob);
break;
case mechahitlerobj:
case realhitlerobj:
case bossobj:
PlaySoundLocActor(BOSSFIRESND,ob);
break;
case schabbobj:
PlaySoundLocActor(SCHABBSTHROWSND,ob);
break;
case fakeobj:
PlaySoundLocActor(FLAMETHROWERSND,ob);
break;
#endif
default:
PlaySoundLocActor(NAZIFIRESND,ob);
}
}
/*
===============
=
= T_Bite
=
===============
*/
void T_Bite (objtype *ob)
{
long dx,dy;
int hitchance,damage;
PlaySoundLocActor(DOGATTACKSND,ob); // JAB
dx = player->x - ob->x;
if (dx<0)
dx = -dx;
dx -= TILEGLOBAL;
if (dx <= MINACTORDIST)
{
dy = player->y - ob->y;
if (dy<0)
dy = -dy;
dy -= TILEGLOBAL;
if (dy <= MINACTORDIST)
{
if (US_RndT()<180)
{
TakeDamage (US_RndT()>>4,ob);
return;
}
}
}
return;
}
#ifndef SPEAR
/*
=========================================================================
===
BJ VICTORY
=========================================================================
===
*/
//
// BJ victory
//
void T_BJRun (objtype *ob);
void T_BJJump (objtype *ob);
void T_BJDone (objtype *ob);
void T_BJYell (objtype *ob);
void T_DeathCam (objtype *ob);
extern statetype s_bjrun1;
extern statetype s_bjrun1s;
extern statetype s_bjrun2;
extern statetype s_bjrun3;
extern statetype s_bjrun3s;
extern statetype s_bjrun4;
extern statetype s_bjjump1;
extern statetype s_bjjump2;
extern statetype s_bjjump3;
extern statetype s_bjjump4;
statetype s_bjrun1 = {false,SPR_BJ_W1,12,T_BJRun,NULL,&s_bjrun1s};
statetype s_bjrun1s = {false,SPR_BJ_W1,3, NULL,NULL,&s_bjrun2};
statetype s_bjrun2 = {false,SPR_BJ_W2,8,T_BJRun,NULL,&s_bjrun3};
statetype s_bjrun3 = {false,SPR_BJ_W3,12,T_BJRun,NULL,&s_bjrun3s};
statetype s_bjrun3s = {false,SPR_BJ_W3,3, NULL,NULL,&s_bjrun4};
statetype s_bjrun4 = {false,SPR_BJ_W4,8,T_BJRun,NULL,&s_bjrun1};
statetype s_bjjump1 = {false,SPR_BJ_JUMP1,14,T_BJJump,NULL,&s_bjjump2};
statetype s_bjjump2 =
{false,SPR_BJ_JUMP2,14,T_BJJump,T_BJYell,&s_bjjump3};
statetype s_bjjump3 = {false,SPR_BJ_JUMP3,14,T_BJJump,NULL,&s_bjjump4};
statetype s_bjjump4 = {false,SPR_BJ_JUMP4,300,NULL,T_BJDone,&s_bjjump4};
statetype s_deathcam = {false,0,0,NULL,NULL,NULL};
/*
===============
=
= SpawnBJVictory
=
===============
*/
void SpawnBJVictory (void)
{
unsigned far *map,tile;
SpawnNewObj (player->tilex,player->tiley+1,&s_bjrun1);
new->x = player->x;
new->y = player->y;
new->obclass = bjobj;
new->dir = north;
new->temp1 = 6; // tiles to run forward
}
/*
===============
=
= T_BJRun
=
===============
*/
void T_BJRun (objtype *ob)
{
long move;
move = BJRUNSPEED*tics;
while (move)
{
if (move < ob->distance)
{
MoveObj (ob,move);
break;
}
ob->x = ((long)ob->tilex<y = ((long)ob->tiley<distance;
SelectPathDir (ob);
if ( !(--ob->temp1) )
{
NewState (ob,&s_bjjump1);
return;
}
}
}
/*
===============
=
= T_BJJump
=
===============
*/
void T_BJJump (objtype *ob)
{
long move;
move = BJJUMPSPEED*tics;
MoveObj (ob,move);
}
/*
===============
=
= T_BJYell
=
===============
*/
void T_BJYell (objtype *ob)
{
PlaySoundLocActor(YEAHSND,ob); // JAB
}
/*
===============
=
= T_BJDone
=
===============
*/
#pragma argsused
void T_BJDone (objtype *ob)
{
playstate = ex_victorious; // exit castle tile
}
//=======================================================================
====
/*
===============
=
= CheckPosition
=
===============
*/
boolean CheckPosition (objtype *ob)
{
int x,y,xl,yl,xh,yh;
objtype *check;
xl = (ob->x-PLAYERSIZE) >>TILESHIFT;
yl = (ob->y-PLAYERSIZE) >>TILESHIFT;
xh = (ob->x+PLAYERSIZE) >>TILESHIFT;
yh = (ob->y+PLAYERSIZE) >>TILESHIFT;
//
// check for solid walls
//
for (y=yl;y<=yh;y++)
for (x=xl;x<=xh;x++)
{
check = actorat[x][y];
if (check && checkx = gamestate.killx;
player->y = gamestate.killy;
dx = ob->x - player->x;
dy = player->y - ob->y;
fangle = atan2(dy,dx); // returns -pi to pi
if (fangle<0)
fangle = M_PI*2+fangle;
player->angle = fangle/(M_PI*2)*ANGLES;
//
// try to position as close as possible without being in a wall
//
dist = 0x14000l;
do
{
xmove = FixedByFrac(dist,costable[player->angle]);
ymove = -FixedByFrac(dist,sintable[player->angle]);
player->x = ob->x - xmove;
player->y = ob->y - ymove;
dist += 0x1000;
} while (!CheckPosition (player));
plux = player->x >> UNSIGNEDSHIFT; // scale to fit in
unsigned
pluy = player->y >> UNSIGNEDSHIFT;
player->tilex = player->x >> TILESHIFT; // scale to tile values
player->tiley = player->y >> TILESHIFT;
//
// go back to the game
//
temp = bufferofs;
for (i=0;i<3;i++)
{
bufferofs = screenloc[i];
DrawPlayBorder ();
}
bufferofs = temp;
fizzlein = true;
switch (ob->obclass)
{
#ifndef SPEAR
case schabbobj:
NewState (ob,&s_schabbdeathcam);
break;
case realhitlerobj:
NewState (ob,&s_hitlerdeathcam);
break;
case giftobj:
NewState (ob,&s_giftdeathcam);
break;
case fatobj:
NewState (ob,&s_fatdeathcam);
break;
#endif
}
}
#endif