hexen2/H2W/HCode/Fish.hc
2000-11-10 00:00:00 +00:00

259 lines
5.6 KiB
C++

/*
* $Header: /HexenWorld/HCode/Fish.hc 1 2/04/98 1:59p Rjohnson $
*/
/*
==============================================================================
Q:\art\models\monsters\FISH\FISH1.hc
==============================================================================
*/
// For building the model
$cd Q:\art\models\monsters\FISH
$origin 0 0 0
$base BASE SKIN
$skin SKIN
$skin SKIN2
$flags 0
//
$frame SWIM01 SWIM02 SWIM03 SWIM04 SWIM05
$frame SWIM06 SWIM07 SWIM08 SWIM09 SWIM10
$frame SWIM11 SWIM12 SWIM13 SWIM14 SWIM15
$frame SWIM16 SWIM17 SWIM18 SWIM19 SWIM20
$frame SWIM21 SWIM22 SWIM23 SWIM24 SWIM25
$frame SWIM26 SWIM27 SWIM28 SWIM29 SWIM30
$frame SWIM31 SWIM32 SWIM33 SWIM34 SWIM35
$frame SWIM36 SWIM37 SWIM38 SWIM39 SWIM40
// Frame Code
float FISH_STAGE_MOVE = 1;
float FISH_STAGE_FOLLOW = 2;
float FISH_STAGE_BORED = 3;
void fish_hover(void);
void fish_move(void);
float fish_friends(void)
{
entity item,test;
float bad;
item = findradius(self.origin, 100);
while (item)
{
if (item.classname == "monster_fish" && item != self)
{
test = item.goalentity;
bad = FALSE;
while(test != world && bad != TRUE)
{
if (test == self) bad = TRUE;
test = test.goalentity;
}
if (!bad)
{
self.goalentity = item;
self.goalentity.fish_leader_count += 1;
return TRUE;
}
}
item = item.chain;
}
return FALSE;
}
void fish_follow(void)
{
thinktime self : HX_FRAME_TIME;
AdvanceFrame($SWIM01,$SWIM40);
if (random() > 0.1)
return;
if (random() < .05)
{
self.monster_duration = random(250,450);
self.monster_stage = FISH_STAGE_BORED;
self.think = fish_hover;
self.goalentity.fish_leader_count -= 1;
self.goalentity = world;
//dprint("Fish got bored\n");
// self.drawflags (-) MLS_ABSLIGHT;
}
self.movedir = self.monster_last_seen - self.origin + randomv('-20 -20 -25', '20 20 25');
if (self.goalentity.goalentity)
{
self.goalentity.fish_leader_count -= 1;
self.goalentity = self.goalentity.goalentity;
self.goalentity.fish_leader_count += 1;
}
self.monster_last_seen = self.goalentity.origin;
self.count = 80 + random(20);
self.movedir_x /= self.count;
self.movedir_y /= self.count;
self.movedir_z /= self.count;
self.fish_speed = vhlen(self.movedir);
self.think = fish_move;
}
void fish_move(void)
{
float retval;
thinktime self : HX_FRAME_TIME;
AdvanceFrame($SWIM01,$SWIM40);
self.ideal_yaw = vectoyaw(self.movedir);
ChangeYaw();
retval = walkmove(self.angles_y, self.fish_speed, FALSE);
retval = movestep(0, 0, self.movedir_z, FALSE);
/* if (retval != 2)
{
self.goalentity = world;
self.monster_stage = FISH_STAGE_MOVE;
}
*/
if (self.count >= 170)
self.fish_speed *= 1.05;
else if (self.count < 30)
self.fish_speed *= .9;
self.count -= 1;
if (self.count < 1)
{
self.count = 0;
if (self.monster_stage == FISH_STAGE_MOVE)
{
if (fish_friends())
{
self.monster_stage = FISH_STAGE_FOLLOW;
self.think = fish_follow;
self.monster_last_seen = self.goalentity.origin;
//self.drawflags (+) MLS_ABSLIGHT;
//self.abslight = 0;
//self.goalentity.drawflags (+) MLS_ABSLIGHT;
//self.goalentity.abslight = 2.5;
//dprint("Following!\n");
}
else
self.think = fish_hover;
}
else if (self.monster_stage == FISH_STAGE_FOLLOW)
self.think = fish_follow;
else if (self.monster_stage == FISH_STAGE_BORED)
self.think = fish_hover;
}
}
void fish_hover(void)
{
float try;
thinktime self : HX_FRAME_TIME;
AdvanceFrame($SWIM01,$SWIM40);
if (self.monster_stage == FISH_STAGE_BORED)
{
self.monster_duration -= 1;
if (self.monster_duration <= 0)
self.monster_stage = FISH_STAGE_MOVE;
}
if (random() < 0.02)
{
try = 0;
while (try < 10)
{
self.movedir = randomv('-100 -100 -30', '100 100 30');
tracearea(self.origin, self.origin + self.movedir, self.mins, self.maxs, FALSE, self);
if (trace_fraction == 1)
{
self.think = fish_move;
self.count = 170 + random(30);
self.movedir_x /= 400;
self.movedir_y /= 400;
self.movedir_z /= 400;
self.fish_speed = vhlen(self.movedir);
try = 999;
}
try += 1;
}
}
}
void fish_die(void)
{
remove(self);
}
/*QUAKED monster_fish (1 0 0) (-16 -16 -8) (16 16 8)
Ambient Fish
-------------------------FIELDS-------------------------
skin: 0 = bright colored, 1 = darker colored
--------------------------------------------------------
*/
void monster_fish(void)
{
precache_model2 ("models/fish.mdl");
self.takedamage = DAMAGE_YES;
self.solid = SOLID_SLIDEBOX;
self.movetype = MOVETYPE_FLY;
self.flags (+) FL_SWIM | FL_MONSTER;
self.yaw_speed = 2;
self.hull = HULL_PLAYER;
self.monster_stage = FISH_STAGE_MOVE;
self.mass = 99999; // Big fishies!
// self.drawflags (+) MLS_POWERMODE;
setmodel (self, "models/fish.mdl");
self.skin = 0;
setsize (self, '-10 -10 -8', '10 10 8');
self.health = 1;
self.th_die = fish_die;
self.think = fish_hover;
thinktime self : HX_FRAME_TIME;
}
/*
* $Log: /HexenWorld/HCode/Fish.hc $
*
* 1 2/04/98 1:59p Rjohnson
*
* 4 8/16/97 5:46p Mgummelt
*
* 3 7/22/97 10:52a Rjohnson
* Fix a return type value
*
* 2 7/08/97 5:10p Rjohnson
* Update
*
* 1 7/07/97 12:01p Rjohnson
* Initial Version
*/