git-svn-id: https://clonekeenplus.svn.sourceforge.net/svnroot/clonekeenplus/cgenius/trunk@5 4df4b0f3-56ce-47cb-b001-ed939b7d65a6
141 lines
5.3 KiB
C++
141 lines
5.3 KiB
C++
#include "../keen.h"
|
|
|
|
#include "../include/game.h"
|
|
|
|
#include "../include/enemyai.h"
|
|
|
|
#include "../sdl/sound/CSound.h"
|
|
|
|
// AI for "butler" robot (ep1)
|
|
|
|
#define BUTLER_TURN 0
|
|
#define BUTLER_WALK 1
|
|
|
|
#define BUTLER_WALK_SPEED 7
|
|
#define BUTLER_WALK_SPEED_FAST 11
|
|
#define BUTLER_WALK_ANIM_TIME 35
|
|
#define BUTLER_WALK_ANIM_TIME_FAST 25
|
|
#define BUTLER_TURN_TIME 50
|
|
|
|
#define BUTLERPUSHAMOUNT 22
|
|
#define BUTLERPUSHAMOUNTFAST 15
|
|
|
|
// distance in pixels butler should look ahead to avoid falling
|
|
// off an edge
|
|
#define BUTLER_LOOK_AHEAD_DIST 1
|
|
|
|
// frames
|
|
#define BUTLER_WALK_LEFT_FRAME 92
|
|
#define BUTLER_WALK_RIGHT_FRAME 88
|
|
#define BUTLER_TURNLEFT_FRAME 96
|
|
#define BUTLER_TURNRIGHT_FRAME 97
|
|
|
|
void butler_ai(int o)
|
|
{
|
|
char not_about_to_fall;
|
|
if (objects[o].needinit)
|
|
{
|
|
objects[o].ai.butler.state = BUTLER_WALK;
|
|
objects[o].ai.butler.movedir = RIGHT;
|
|
objects[o].ai.butler.animtimer = 0;
|
|
objects[o].canbezapped = 1; // will stop bullets but are not harmed
|
|
objects[o].needinit = 0;
|
|
objects[o].x -= 16;
|
|
}
|
|
// push keen
|
|
if (objects[o].touchPlayer && !player[objects[o].touchedBy].pdie)
|
|
{
|
|
if(!((player[primaryplayer].pdir == objects[o].ai.butler.movedir) && (player[primaryplayer].pwalking)))
|
|
{
|
|
g_pSound->playStereofromCoord(SOUND_YORP_BUMP, PLAY_NORESTART, objects[o].scrx);
|
|
|
|
short butlerpushamount;
|
|
|
|
butlerpushamount = BUTLERPUSHAMOUNT;
|
|
|
|
if(player[primaryplayer].pwalking) butlerpushamount = 3*BUTLERPUSHAMOUNT/2;
|
|
|
|
if (player[primaryplayer].x < objects[o].x)
|
|
{
|
|
player[objects[o].touchedBy].playpushed_x = -butlerpushamount;
|
|
if (options[OPT_MEAN].value) player[objects[o].touchedBy].playpushed_x -= BUTLERPUSHAMOUNTFAST;
|
|
player[objects[o].touchedBy].playpushed_decreasetimer = 0;
|
|
player[objects[o].touchedBy].pdir = player[objects[o].touchedBy].pshowdir = LEFT;
|
|
}
|
|
else
|
|
{
|
|
player[objects[o].touchedBy].playpushed_x = butlerpushamount;
|
|
if (options[OPT_MEAN].value) player[objects[o].touchedBy].playpushed_x += BUTLERPUSHAMOUNTFAST;
|
|
player[objects[o].touchedBy].playpushed_decreasetimer = 0;
|
|
player[objects[o].touchedBy].pdir = player[objects[o].touchedBy].pshowdir = RIGHT;
|
|
}
|
|
}
|
|
}
|
|
|
|
switch(objects[o].ai.butler.state)
|
|
{
|
|
case BUTLER_TURN:
|
|
if (objects[o].ai.butler.timer > BUTLER_TURN_TIME)
|
|
{
|
|
objects[o].ai.butler.movedir ^= 1;
|
|
objects[o].ai.butler.animtimer = 0;
|
|
objects[o].ai.butler.state = BUTLER_WALK;
|
|
} else objects[o].ai.butler.timer++;
|
|
break;
|
|
case BUTLER_WALK:
|
|
if (objects[o].ai.butler.movedir==LEFT)
|
|
{ // move left
|
|
|
|
not_about_to_fall = TileProperty[getmaptileat((objects[o].x>>CSF)-BUTLER_LOOK_AHEAD_DIST, (objects[o].y>>CSF)+sprites[BUTLER_WALK_LEFT_FRAME].ysize)][BUP];
|
|
//not_about_to_fall = tiles[getmaptileat((objects[o].x>>CSF)-BUTLER_LOOK_AHEAD_DIST, (objects[o].y>>CSF)+sprites[BUTLER_WALK_LEFT_FRAME].ysize)].solidfall;
|
|
objects[o].sprite = BUTLER_WALK_LEFT_FRAME + objects[o].ai.butler.frame;
|
|
if (!objects[o].blockedl && not_about_to_fall)
|
|
{
|
|
if (options[OPT_MEAN].value)
|
|
objects[o].x -= BUTLER_WALK_SPEED_FAST;
|
|
else
|
|
objects[o].x -= BUTLER_WALK_SPEED;
|
|
}
|
|
else
|
|
{
|
|
objects[o].sprite = BUTLER_TURNRIGHT_FRAME;
|
|
objects[o].ai.butler.frame = 0;
|
|
objects[o].ai.butler.timer = 0;
|
|
objects[o].ai.butler.animtimer = 0;
|
|
objects[o].ai.butler.state = BUTLER_TURN;
|
|
}
|
|
}
|
|
else
|
|
{ // move right
|
|
|
|
not_about_to_fall = TileProperty[getmaptileat((objects[o].x>>CSF)+sprites[BUTLER_WALK_RIGHT_FRAME].xsize+BUTLER_LOOK_AHEAD_DIST, (objects[o].y>>CSF)+sprites[BUTLER_WALK_RIGHT_FRAME].ysize)][BUP];
|
|
//not_about_to_fall = tiles[getmaptileat((objects[o].x>>CSF)+sprites[BUTLER_WALK_RIGHT_FRAME].xsize+BUTLER_LOOK_AHEAD_DIST, (objects[o].y>>CSF)+sprites[BUTLER_WALK_RIGHT_FRAME].ysize)].solidfall;
|
|
objects[o].sprite = BUTLER_WALK_RIGHT_FRAME + objects[o].ai.butler.frame;
|
|
if (!objects[o].blockedr && not_about_to_fall)
|
|
{
|
|
if (options[OPT_MEAN].value)
|
|
objects[o].x += BUTLER_WALK_SPEED_FAST;
|
|
else
|
|
objects[o].x += BUTLER_WALK_SPEED;
|
|
}
|
|
else
|
|
{
|
|
objects[o].sprite = BUTLER_TURNLEFT_FRAME;
|
|
objects[o].ai.butler.frame = 0;
|
|
objects[o].ai.butler.timer = 0;
|
|
objects[o].ai.butler.animtimer = 0;
|
|
objects[o].ai.butler.state = BUTLER_TURN;
|
|
}
|
|
}
|
|
// walk animation
|
|
if (objects[o].ai.butler.animtimer > BUTLER_WALK_ANIM_TIME || \
|
|
(objects[o].ai.butler.animtimer > BUTLER_WALK_ANIM_TIME_FAST && options[OPT_MEAN].value))
|
|
{
|
|
if (objects[o].ai.butler.frame>=3) objects[o].ai.butler.frame=0;
|
|
else objects[o].ai.butler.frame++;
|
|
objects[o].ai.butler.animtimer = 0;
|
|
} else objects[o].ai.butler.animtimer++;
|
|
break;
|
|
}
|
|
}
|