diff --git a/src/ai/balljack.cpp b/src/ai/balljack.cpp index e58acbd67..c156f60c3 100644 --- a/src/ai/balljack.cpp +++ b/src/ai/balljack.cpp @@ -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 diff --git a/src/ai/balljack.h b/src/ai/balljack.h new file mode 100644 index 000000000..d7e81f368 --- /dev/null +++ b/src/ai/balljack.h @@ -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_ */ diff --git a/src/ai/ray.cpp b/src/ai/ray.cpp index 56dd4c230..15bd41056 100644 --- a/src/ai/ray.cpp +++ b/src/ai/ray.cpp @@ -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; + } } } diff --git a/src/eseq_ep2.cpp b/src/eseq_ep2.cpp index 167040c4d..1a61f2afc 100644 --- a/src/eseq_ep2.cpp +++ b/src/eseq_ep2.cpp @@ -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; diff --git a/src/game.cpp b/src/game.cpp index 1150efdff..24aef7858 100644 --- a/src/game.cpp +++ b/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; diff --git a/src/gamedo.cpp b/src/gamedo.cpp index faee91dc8..2df4c453d 100644 --- a/src/gamedo.cpp +++ b/src/gamedo.cpp @@ -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; diff --git a/src/include/enemyai.h b/src/include/enemyai.h index 15d8569ef..432f26278 100644 --- a/src/include/enemyai.h +++ b/src/include/enemyai.h @@ -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); diff --git a/src/keen.h b/src/keen.h index cfed6c83e..f74441bf9 100644 --- a/src/keen.h +++ b/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 diff --git a/src/misc.cpp b/src/misc.cpp index 22a965263..edc042ae9 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -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++)