home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Gamer 5.14
/
2000-11_-_Disc_5.14.iso
/
Goodies
/
3DGameStudio
/
Mission
/
war.wdl
< prev
next >
Wrap
Text File
|
2000-02-08
|
9KB
|
360 lines
//////////////////////////////////////////////////////////////////////
// WAR.WDL - fighting behaviour
///////////////////////////////////////////////////////////////////////
IFNDEF WAR_DEFS;
DEFINE ACTOR_EXPLO,<explo+7.pcx>;
DEFINE ACTOR_EXPLO_FRAMES,7;
ENDIF;
///////////////////////////////////////////////////////////////////////
SKILL freeze_actors { VAL 0; } // 1,2 for testing purposes
///////////////////////////////////////////////////////////////////////
DEFINE _STATE_WAIT,1;
DEFINE _STATE_ATTACK,2;
DEFINE _STATE_ESCAPE,3;
DEFINE _STATE_DIE,4;
DEFINE _STATE_FREEZE,4;
///////////////////////////////////////////////////////////////////////
SYNONYM test_actor { TYPE entity; }
ACTION robot_test {
IFNDEF test;
REMOVE ME;
RETURN;
ENDIF;
SET test_actor,ME;
MY._WALKFRAMES = 8.030;
MY._RUNFRAMES = 4.050;
MY._ATTACKFRAMES = 6;
MY._DIEFRAMES = 1;
MY._FORCE = 2;
MY._FIREMODE = DAMAGE_SHOOT+FIRE_PARTICLE+HIT_FLASH+0.05;
MY._HITMODE = HIT_EXPLO;
MY._WALKSOUND = _SOUND_ROBOT;
CALL drop_shadow;
CALL anim_init;
CALL actor_fight;
}
ACTION robot1 {
MY._WALKFRAMES = 7.020;
MY._RUNFRAMES = 4.050;
MY._ATTACKFRAMES = 3;
MY._DIEFRAMES = 5;
MY._FORCE = 0.7;
MY._FIREMODE = DAMAGE_EXPLODE+FIRE_BALL+HIT_EXPLO+BULLET_SMOKETRAIL+0.20;
MY._HITMODE = 0;
MY._WALKSOUND = _SOUND_ROBOT;
CALL drop_shadow;
CALL anim_init;
CALL actor_fight;
// IF (MY.FLAG4 == ON) { CALL patrol; }
}
ACTION robot2 {
MY._WALKFRAMES = 8.030;
MY._RUNFRAMES = 4.050;
MY._ATTACKFRAMES = 6;
MY._DIEFRAMES = 1;
MY._FORCE = 2;
MY._FIREMODE = DAMAGE_SHOOT+FIRE_PARTICLE+HIT_FLASH+0.05;
MY._HITMODE = HIT_EXPLO;
MY._WALKSOUND = _SOUND_ROBOT;
CALL drop_shadow;
CALL anim_init;
CALL actor_fight;
// IF (MY.FLAG4 == ON) { CALL patrol; }
}
ACTION robot3 {
REMOVE ME;
RETURN;
MY._WALKFRAMES = 7.030;
MY._RUNFRAMES = 4.050;
MY._ATTACKFRAMES = 3;
MY._DIEFRAMES = 5;
MY._FORCE = 0.7;
MY._FIREMODE = DAMAGE_EXPLODE+FIRE_BALL+HIT_EXPLO+BULLET_SMOKETRAIL+0.20;
CALL drop_shadow;
CALL anim_init;
CALL actor_fight;
// IF (MY.FLAG4 == ON) { CALL patrol; }
}
///////////////////////////////////////////////////////////////////////
ACTION actor_fight
{
// IF (MY._ARMOR == 0) { MY._ARMOR = 100; }
IF (MY._HEALTH == 0) { MY._HEALTH = 100; }
IF (MY._FORCE == 0) { MY._FORCE = 1; }
IF (freeze_actors > 1) { SET MY.PASSABLE,ON; }
MY._SIGNAL = 0;
SET MY.ENABLE_SCAN,ON;
SET MY.ENABLE_SHOOT,ON;
SET MY.ENABLE_DETECT,ON;
SET MY.EVENT,fight_event;
BRANCH state_wait;
}
ACTION state_wait
{
MY._STATE = _STATE_WAIT;
WHILE (MY._STATE == _STATE_WAIT) {
IF (MY._HEALTH <= 0) { BRANCH state_die; }
IF (MY._HEALTH <= 30) { BRANCH state_escape; }
// scan for the player coming near
temp.PAN = 180;
temp.TILT = 180;
temp.Z = 1000;
indicator = _WATCH;
SCAN MY.POS,MY.ANGLE,temp;
IF (MY._SIGNAL == _DETECTED) {
MY._SIGNAL = 0;
BRANCH state_attack;
}
WAITT 4;
}
}
ACTION state_attack
{
MY._STATE = _STATE_ATTACK;
MY._MOVEMODE = _MODE_ATTACK; // stop patroilling etc.
CALL attack_transitions;
WHILE (MY._STATE == _STATE_ATTACK)
{
// fire two or three times
MY._COUNTER = 1.5 + RANDOM(1);
CALL attack_fire;
WHILE (MY._COUNTER > 0) { WAIT 1; }
// walk towards player for one to three seconds
MY._COUNTER = 16 + RANDOM(32);
CALL attack_approach;
WHILE (MY._COUNTER > 0) { WAIT 1; }
}
}
ACTION attack_transitions
{
WHILE (MY._STATE == _STATE_ATTACK) {
IF (MY._HEALTH <= 0) { BRANCH state_die; }
IF (MY._HEALTH <= 30) { BRANCH state_escape; }
IF (freeze_actors > 0) { BRANCH state_freeze; }
WAIT 1;
}
}
ACTION attack_fire
{
MY.FRAME = 1 + MY._WALKFRAMES + MY._RUNFRAMES + 1;
IFDEF ACKNEX_VERSION412;
MY.NEXT_FRAME = 0; // inbetween to the real next frame
ENDIF;
WHILE ((MY._STATE == _STATE_ATTACK) && (MY._COUNTER > 0))
{
// turn towards player
temp.X = player.X - MY.X;
temp.Y = player.Y - MY.Y;
temp.Z = player.Z - MY.Z;
TO_ANGLE MY_ANGLE,temp;
force = MY._FORCE * 2;
CALL actor_turn;
// play attack animation
MY.FRAME += 0.4 * TIME;
IF (MY.FRAME > 1 + MY._WALKFRAMES + MY._RUNFRAMES + MY._ATTACKFRAMES) {
MY.FRAME = 1 + MY._WALKFRAMES + MY._RUNFRAMES + 1;
// watch out if player visible. If yes, then shoot at him
indicator = _WATCH;
SHOOT MY.POS,player.POS;
IF ((RESULT > 0) && (YOU == player)) // spotted him!
{
// fire at player
damage = FRC(MY._FIREMODE) * 100;
fire_mode = MY._FIREMODE;
IF ((fire_mode & MODE_DAMAGE) == DAMAGE_SHOOT) {
shot_speed.X = 500;
} ELSE {
shot_speed.X = 100;
}
shot_speed.Y = 0;
shot_speed.Z = 0;
MY_ANGLE.PAN = MY.PAN; // TILT is already set from TO_ANGLE
VECROTATE shot_speed,MY_ANGLE;
// now shot_speed points ahead
gun_muzzle.X = MY.X;
gun_muzzle.Y = MY.Y;
gun_muzzle.Z = MY.Z;
PLAY_ENTSOUND ME,gun_wham,150;
CALL gun_shot;
MY._COUNTER -= 1;
}
}
WAIT 1;
}
}
ACTION attack_approach
{
// calculate a direction to walk into
temp.X = player.X - MY.X;
temp.Y = player.Y - MY.Y;
temp.Z = 0;
TO_ANGLE MY_ANGLE,temp;
// ADD random deviation angle
MY._TARGET_PAN = MY_ANGLE.PAN - 15 + RANDOM(30);
WHILE ((MY._STATE == _STATE_ATTACK) && (MY._COUNTER > 0))
{
// turn towards player
MY_ANGLE.PAN = MY._TARGET_PAN;
MY_ANGLE.TILT = 0;
MY_ANGLE.ROLL = 0;
force = MY._FORCE * 2;
CALL actor_turn;
// walk towards him if not too close
temp = (player.X - MY.X)*(player.X - MY.X)+(player.Y - MY.Y)*(player.Y - MY.Y);
if (temp > 0) { //$$$10000) {
force = MY._FORCE;
MY._MOVEMODE = _MODE_WALKING;
CALL actor_move;
}
WAIT 1;
MY._COUNTER -= TIME;
}
}
// few health => try to run away
ACTION state_escape
{
MY._STATE = _STATE_ESCAPE;
WHILE (MY._STATE == _STATE_ESCAPE) {
IF (MY._HEALTH <= 0) { BRANCH state_die; }
// turn away from player
temp.X = MY.X - player.X;
temp.Y = MY.Y - player.Y;
temp.Z = MY.Z - player.Z;
TO_ANGLE MY_ANGLE,temp;
force = MY._FORCE * 6;
CALL actor_turn;
force = MY._FORCE * 4;
MY._MOVEMODE = _MODE_WALKING;
CALL actor_move;
WAIT 1;
}
}
// no health anymore => die animation
ACTION state_die
{
MY._MOVEMODE = 0; // don't move anymore
MY._STATE = _STATE_DIE;
SET MY.ENABLE_SCAN,OFF; // get deaf and blind
SET MY.ENABLE_SHOOT,OFF;
SET MY.EVENT,NULL; // and don't react anymore
MY.FRAME = 1 + MY._WALKFRAMES + MY._RUNFRAMES + MY._ATTACKFRAMES + 1;
IFDEF ACKNEX_VERSION412;
MY.NEXT_FRAME = 0; // inbetween to the real next frame
ENDIF;
WHILE (MY.FRAME <= (1 + MY._WALKFRAMES + MY._RUNFRAMES + MY._ATTACKFRAMES + MY._DIEFRAMES))
{
WAIT 1;
MY.FRAME += 0.7 * TIME;
// MY.Z -= TIME; // sink into ground a little
}
IF ((ME != player) && (MY._HITMODE & HIT_EXPLO)) {
MORPH ACTOR_EXPLO,ME;
MY._DIEFRAMES = ACTOR_EXPLO_FRAMES;
BRANCH actor_explode;
}
SET MY.PASSABLE,ON;
}
ACTION state_freeze
{
MY._STATE = _STATE_FREEZE;
MY._MOVEMODE = _MODE_STILL; // stop patroilling etc.
WHILE (MY._STATE == _STATE_FREEZE) {
IF (freeze_actors > 1) { SET MY.PASSABLE,ON; }
IF (freeze_actors == 0) { BRANCH state_wait; }
WAIT 1;
}
}
////////////////////////////////////////////////////////////////////////
ACTION fight_event {
IF ((EVENT_TYPE == EVENT_SCAN && indicator == _EXPLODE)
|| (EVENT_TYPE == EVENT_SHOOT && indicator == _GUNFIRE))
{
MY._SIGNAL = _DETECTED; // by shooting, player gives away his position
if (indicator == _EXPLODE) { // reduce damage according to distance
damage *= ABS(range - RESULT)/range;
}
IF (MY._ARMOR <= 0) {
MY._HEALTH -= damage;
} ELSE {
MY._ARMOR -= damage;
}
RETURN;
}
IF (EVENT_TYPE == EVENT_DETECT && YOU == player) {
indicator = _WATCH;
SHOOT MY.POS,YOUR.POS; // can player be seen from here?
IF ((RESULT > 0) && (YOU == player)) { // yes
MY._SIGNAL = _DETECTED;
}
RETURN;
}
}
///////////////////////////////////////////////////////////////////////
ACTION player_fight
{
IF (MY._HEALTH == 0) { MY._HEALTH = 100; }
SET MY.ENABLE_SCAN,ON;
SET MY.ENABLE_SHOOT,ON;
SET MY.EVENT,fight_event;
WHILE (MY._HEALTH > 0)
{
IF (MY._SIGNAL == _DETECTED) { // Hit received?
MY._SIGNAL = 0; // reset the _signal skill
IF (person_3rd == 0) {
CALL player_shake; }
}
WAIT 1;
}
// Dead
MY._HEALTH = 0;
IF (person_3rd == 0)
{ // 1st person die action
MY._MOVEMODE = 0; // don't move anymore
MY.EVENT = NULL; // prevent health counting down
CALL player_tip;
WAITT 8;
CALL weapon_remove; // let weapon disappear
} ELSE {
CALL weapon_remove; // prevent dead player firing
BRANCH state_die;
}
}