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:
gerstrong
2009-07-27 20:39:31 +00:00
parent f0aea07261
commit 4e714eab46
9 changed files with 161 additions and 51 deletions

View File

@@ -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
View 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_ */

View File

@@ -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;
}
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);

View File

@@ -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

View File

@@ -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++)