AI of Ball and Jack has been improved. Ported the code of CK version 8.4
git-svn-id: https://clonekeenplus.svn.sourceforge.net/svnroot/clonekeenplus/cgenius/trunk@189 4df4b0f3-56ce-47cb-b001-ed939b7d65a6
This commit is contained in:
@@ -1,63 +1,96 @@
|
||||
// ai for the ball and the jack in ep3
|
||||
#include "../keen.h"
|
||||
|
||||
#include "../include/enemyai.h"
|
||||
|
||||
#include "../include/game.h"
|
||||
|
||||
#define BALL_FRAME 109
|
||||
#define JACK_FRAME 110
|
||||
#include "balljack.h"
|
||||
|
||||
#define BALL_SPEED 15
|
||||
#define JACK_SPEED 10
|
||||
#define JACK_ANIM_RATE 50
|
||||
|
||||
#define BALLPUSHAMOUNT 20
|
||||
#define BALLPUSHAMOUNT 30
|
||||
|
||||
char BJ_BlockedD(int o);
|
||||
|
||||
void ballandjack_ai(int o, stCloneKeenPlus *pCKP)
|
||||
void ballandjack_ai(int o)
|
||||
{
|
||||
if (objects[o].needinit)
|
||||
{
|
||||
objects[o].ai.bj.dir = DUPLEFT;
|
||||
objects[o].ai.bj.animframe = 0;
|
||||
objects[o].ai.bj.animtimer = 0;
|
||||
objects[o].blockedl = 0;
|
||||
objects[o].blockedr = 0;
|
||||
objects[o].blockedu = 0;
|
||||
objects[o].blockedd = 0;
|
||||
objects[o].inhibitfall = 1;
|
||||
int i = rnd()%4;
|
||||
switch(i)
|
||||
{
|
||||
case 0: objects[o].ai.bj.dir = DUPLEFT; break;
|
||||
case 1: objects[o].ai.bj.dir = DUPRIGHT; break;
|
||||
case 2: objects[o].ai.bj.dir = DDOWNLEFT; break;
|
||||
case 3: objects[o].ai.bj.dir = DDOWNRIGHT; break;
|
||||
}
|
||||
|
||||
objects[o].ai.bj.animframe = 0;
|
||||
objects[o].ai.bj.animtimer = 0;
|
||||
objects[o].blockedl = 0;
|
||||
objects[o].blockedr = 0;
|
||||
objects[o].blockedu = 0;
|
||||
objects[o].blockedd = 0;
|
||||
objects[o].inhibitfall = 1;
|
||||
|
||||
if (objects[o].type==OBJ_BALL)
|
||||
{
|
||||
objects[o].sprite = BALL_FRAME;
|
||||
objects[o].ai.bj.speed = BALL_SPEED;
|
||||
objects[o].canbezapped = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
objects[o].sprite = JACK_FRAME;
|
||||
objects[o].ai.bj.speed = JACK_SPEED;
|
||||
objects[o].canbezapped = 0;
|
||||
}
|
||||
objects[o].needinit = 0;
|
||||
}
|
||||
|
||||
if (objects[o].touchPlayer)
|
||||
if (objects[o].touchPlayer)
|
||||
{
|
||||
if (objects[o].type==OBJ_BALL)
|
||||
{
|
||||
if (player[objects[o].touchedBy].x < objects[o].x)
|
||||
{
|
||||
bumpplayer(objects[o].touchedBy, -BALLPUSHAMOUNT, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
bumpplayer(objects[o].touchedBy, BALLPUSHAMOUNT, true);
|
||||
}
|
||||
|
||||
switch(objects[o].ai.bj.dir)
|
||||
{
|
||||
case DUPRIGHT: objects[o].ai.bj.dir = DUPLEFT; break;
|
||||
case DUPLEFT: objects[o].ai.bj.dir = DUPRIGHT; break;
|
||||
case DDOWNRIGHT: objects[o].ai.bj.dir = DDOWNLEFT; break;
|
||||
case DDOWNLEFT: objects[o].ai.bj.dir = DDOWNRIGHT; break;
|
||||
}
|
||||
}
|
||||
else killplayer(objects[o].touchedBy);
|
||||
}
|
||||
|
||||
if (objects[o].zapped)
|
||||
{
|
||||
if (objects[o].type==OBJ_BALL)
|
||||
{
|
||||
if (player[objects[o].touchedBy].x < objects[o].x)
|
||||
{
|
||||
player[objects[o].touchedBy].playpushed_x = -BALLPUSHAMOUNT;
|
||||
player[objects[o].touchedBy].playpushed_decreasetimer = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
player[objects[o].touchedBy].playpushed_x = BALLPUSHAMOUNT;
|
||||
player[objects[o].touchedBy].playpushed_decreasetimer = 0;
|
||||
}
|
||||
}
|
||||
else killplayer(objects[o].touchedBy);
|
||||
// have ball change direction when zapped
|
||||
if (objects[o].zapd==LEFT)
|
||||
{
|
||||
switch(objects[o].ai.bj.dir)
|
||||
{
|
||||
case DUPRIGHT: objects[o].ai.bj.dir = DUPLEFT; break;
|
||||
case DDOWNRIGHT: objects[o].ai.bj.dir = DDOWNLEFT; break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(objects[o].ai.bj.dir)
|
||||
{
|
||||
case DUPLEFT: objects[o].ai.bj.dir = DUPRIGHT; break;
|
||||
case DDOWNLEFT: objects[o].ai.bj.dir = DDOWNRIGHT; break;
|
||||
}
|
||||
}
|
||||
objects[o].zapped = 0;
|
||||
}
|
||||
|
||||
switch(objects[o].ai.bj.dir)
|
||||
@@ -94,11 +127,11 @@ void ballandjack_ai(int o, stCloneKeenPlus *pCKP)
|
||||
|
||||
if (objects[o].type==OBJ_BALL)
|
||||
{
|
||||
objects[o].sprite = BALL_FRAME;
|
||||
objects[o].sprite = OBJ_BALL_DEFSPRITE;
|
||||
}
|
||||
else
|
||||
{
|
||||
objects[o].sprite = JACK_FRAME + objects[o].ai.bj.animframe;
|
||||
objects[o].sprite = OBJ_JACK_DEFSPRITE + objects[o].ai.bj.animframe;
|
||||
if (objects[o].ai.bj.animtimer > JACK_ANIM_RATE)
|
||||
{
|
||||
objects[o].ai.bj.animframe++;
|
||||
@@ -119,13 +152,11 @@ char BJ_BlockedD(int o)
|
||||
{
|
||||
// ensure that the tile common_enemy_ai said we hit also has
|
||||
// solid l/r set
|
||||
|
||||
if (TileProperty[getmaptileat((objects[o].x>>CSF)+2, (objects[o].y>>CSF)+sprites[objects[o].sprite].ysize)][BLEFT])
|
||||
//if (tiles[getmaptileat((objects[o].x>>CSF)+2, (objects[o].y>>CSF)+sprites[objects[o].sprite].ysize)].solidl)
|
||||
{ return 1; }
|
||||
if (TileProperty[getmaptileat((objects[o].x>>CSF)+(sprites[objects[o].sprite].xsize-2), (objects[o].y>>CSF)+sprites[objects[o].sprite].ysize)][BLEFT])
|
||||
//if (tiles[getmaptileat((objects[o].x>>CSF)+(sprites[objects[o].sprite].xsize-2), (objects[o].y>>CSF)+sprites[objects[o].sprite].ysize)].solidl)
|
||||
{ return 1; }
|
||||
|
||||
}
|
||||
|
||||
// ensure it's not a ball no-pass point
|
||||
|
||||
37
src/ai/balljack.h
Normal file
37
src/ai/balljack.h
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* balljack.h
|
||||
*
|
||||
* Created on: 27.07.2009
|
||||
* Author: gerstrong
|
||||
*/
|
||||
|
||||
#ifndef BALLJACK_H_
|
||||
#define BALLJACK_H_
|
||||
|
||||
/* located in game.cpp */
|
||||
|
||||
//-------------------[referenced from ai/balljack.cpp]-----------------//
|
||||
void bumpplayer(int p, int pushamt, bool solid);
|
||||
void killplayer(int theplayer);
|
||||
|
||||
|
||||
/* located in map.cpp */
|
||||
|
||||
//-------------------[referenced from ai/balljack.cpp]-----------------//
|
||||
unsigned int getmaptileat(unsigned int x, unsigned int y);
|
||||
unsigned int getlevelat(unsigned int xpx, unsigned int ypx);
|
||||
|
||||
|
||||
/* located in misc.cpp */
|
||||
|
||||
//-------------------[referenced from ai/balljack.cpp]-----------------//
|
||||
uint rnd(void);
|
||||
|
||||
|
||||
/* located in ai/balljack.c */
|
||||
|
||||
//-------------------[referenced from ai/balljack.cpp]-----------------//
|
||||
void ballandjack_ai(int o);
|
||||
char BJ_BlockedD(int o);
|
||||
|
||||
#endif /* BALLJACK_H_ */
|
||||
@@ -55,6 +55,14 @@ int hitlethal;
|
||||
{
|
||||
objects[o].ai.ray.state = RAY_STATE_SETZAPZOT;
|
||||
objects[i].zapped++;
|
||||
objects[i].zapx = objects[o].x;
|
||||
objects[i].zapy = objects[o].y;
|
||||
objects[i].zapd = objects[o].ai.ray.direction;
|
||||
if (objects[o].sprite==ENEMYRAY || objects[o].sprite==ENEMYRAYEP2 || objects[o].sprite==ENEMYRAYEP3)
|
||||
objects[i].zappedbyenemy = 1;
|
||||
else
|
||||
objects[i].zappedbyenemy = 0;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,8 +57,8 @@ int eseq2_TantalusRay(stCloneKeenPlus *pCKP)
|
||||
{
|
||||
char enter,lastenterstate;
|
||||
int x, y, t, o, i;
|
||||
int tantalus_animframe, tantalus_animtimer;
|
||||
int state, timer, spawnedcount;
|
||||
int tantalus_animframe, tantalus_animtimer=0;
|
||||
int state, timer, spawnedcount=0;
|
||||
|
||||
o=0;
|
||||
|
||||
|
||||
32
src/game.cpp
32
src/game.cpp
@@ -505,8 +505,8 @@ unsigned int i;
|
||||
objdefsprites[OBJ_NINJA] = OBJ_NINJA_DEFSPRITE;
|
||||
objdefsprites[OBJ_MOTHER] = OBJ_MOTHER_DEFSPRITE;
|
||||
objdefsprites[OBJ_MEEP] = OBJ_MEEP_DEFSPRITE;
|
||||
objdefsprites[OBJ_BALL] = OBJ_BJ_DEFSPRITE;
|
||||
objdefsprites[OBJ_JACK] = OBJ_BJ_DEFSPRITE;
|
||||
objdefsprites[OBJ_BALL] = OBJ_BALL_DEFSPRITE;
|
||||
objdefsprites[OBJ_JACK] = OBJ_BALL_DEFSPRITE;
|
||||
|
||||
objdefsprites[OBJ_RAY] = OBJ_RAY_DEFSPRITE_EP3;
|
||||
objdefsprites[OBJ_VORT] = OBJ_VORT_DEFSPRITE_EP3;
|
||||
@@ -1355,6 +1355,34 @@ void procgoodie(int t, int mpx, int mpy, int theplayer, stCloneKeenPlus *pCKP)
|
||||
|
||||
}
|
||||
|
||||
// yorp/walker etc "bump".
|
||||
// if solid = 0, player can possibly force his way through.
|
||||
// if solid = 1, object acts like a solid "wall".
|
||||
void bumpplayer(int p, int pushamt, bool solid)
|
||||
{
|
||||
player[p].playpushed_x = pushamt;
|
||||
|
||||
if (solid)
|
||||
{
|
||||
if (pushamt > 0)
|
||||
{
|
||||
if (player[p].pinertia_x < 0)
|
||||
player[p].pinertia_x = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (player[p].pinertia_x > 0)
|
||||
player[p].pinertia_x = 0;
|
||||
}
|
||||
}
|
||||
|
||||
player[p].playpushed_decreasetimer = 0;
|
||||
if (!player[p].pjumping)
|
||||
{
|
||||
player[p].pdir = player[p].pshowdir = (pushamt<0)?LEFT:RIGHT;
|
||||
}
|
||||
}
|
||||
|
||||
void GiveAnkh(int cp)
|
||||
{
|
||||
int o;
|
||||
|
||||
@@ -42,7 +42,7 @@ unsigned char oldctrlkey = 5;
|
||||
unsigned char oldaltkey = 5;
|
||||
void gamedo_getInput(stCloneKeenPlus *pCKP)
|
||||
{
|
||||
int i;
|
||||
int i=0;
|
||||
int byt;
|
||||
unsigned int msb, lsb;
|
||||
|
||||
@@ -280,8 +280,8 @@ int i;
|
||||
case OBJ_SNDWAVE: sndwave_ai(i, pCKP); break;
|
||||
case OBJ_MOTHER: mother_ai(i, pCKP->Control.levelcontrol); break;
|
||||
case OBJ_FIREBALL: fireball_ai(i, pCKP); break;
|
||||
case OBJ_BALL: ballandjack_ai(i, pCKP); break;
|
||||
case OBJ_JACK: ballandjack_ai(i, pCKP); break;
|
||||
case OBJ_BALL: ballandjack_ai(i); break;
|
||||
case OBJ_JACK: ballandjack_ai(i); break;
|
||||
case OBJ_PLATVERT: platvert_ai(i); break;
|
||||
case OBJ_NESSIE: nessie_ai(i); break;
|
||||
|
||||
@@ -402,7 +402,7 @@ int xa,ya;
|
||||
|
||||
void gamedo_render_drawdebug(void)
|
||||
{
|
||||
int tl,y;
|
||||
int tl=0,y;
|
||||
/*int h;*/
|
||||
std::string debugmsg;
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ void meep_ai(int o, stLevelControl levelcontrol);
|
||||
void sndwave_ai(int o, stCloneKeenPlus *pCKP);
|
||||
void mother_ai(int o, stLevelControl levelcontrol);
|
||||
void fireball_ai(int o, stCloneKeenPlus *pCKP);
|
||||
void ballandjack_ai(int o, stCloneKeenPlus *pCKP);
|
||||
void ballandjack_ai(int o);
|
||||
void platvert_ai(int o);
|
||||
void nessie_ai(int o);
|
||||
|
||||
|
||||
16
src/keen.h
16
src/keen.h
@@ -476,6 +476,9 @@ typedef struct stObject
|
||||
|
||||
char canbezapped; // if 0 ray will not stop on hitdetect
|
||||
char zapped; // number of times got hit by keen's raygun
|
||||
int zapx, zapy, zapd; // x,y, and direction of last shot at time of impact
|
||||
char zappedbyenemy; // if 1, it was an ENEMYRAY and not keen that shot it
|
||||
|
||||
|
||||
char inhibitfall; // if 1 common_enemy_ai will not do falling
|
||||
char cansupportplayer[MAX_PLAYERS];
|
||||
@@ -603,13 +606,16 @@ typedef struct stAnimTile
|
||||
#define OBJ_PLATFORM_DEFSPRITE_EP3 107
|
||||
#define OBJ_WALKER_DEFSPRITE 102
|
||||
#define OBJ_TANKEP2_DEFSPRITE 112
|
||||
|
||||
#define OBJ_VORTELITE_DEFSPRITE 88
|
||||
|
||||
#define OBJ_FOOB_DEFSPRITE 95
|
||||
#define OBJ_NINJA_DEFSPRITE 77
|
||||
#define OBJ_MOTHER_DEFSPRITE 87
|
||||
#define OBJ_BJ_DEFSPRITE 109
|
||||
#define OBJ_MEEP_DEFSPRITE 118
|
||||
#define OBJ_FOOB_DEFSPRITE 95
|
||||
#define OBJ_NINJA_DEFSPRITE 77
|
||||
#define OBJ_MOTHER_DEFSPRITE 87
|
||||
#define OBJ_BALL_DEFSPRITE 109
|
||||
#define OBJ_JACK_DEFSPRITE 110
|
||||
#define OBJ_MEEP_DEFSPRITE 118
|
||||
#define OBJ_NESSIE_DEFSPRITE 132
|
||||
|
||||
#define OBJ_BABY_DEFSPRITE_EP2 52
|
||||
#define OBJ_BABY_DEFSPRITE_EP3 51
|
||||
|
||||
@@ -235,7 +235,7 @@ void VorticonElder(int mpx, int mpy, stCloneKeenPlus *pCKP)
|
||||
{
|
||||
int twirlframe, twirltimer;
|
||||
int dlgX,dlgY,dlgW,dlgH,twirlX,twirlY;
|
||||
const char *strName;
|
||||
const char *strName="";
|
||||
const int twirl_speed = 100;
|
||||
|
||||
for(int i=0; i < 4 ; i++)
|
||||
|
||||
Reference in New Issue
Block a user