You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.4 KiB
102 lines
2.4 KiB
#ifndef __KSD_AI_H |
|
#define __KSD_AI_H |
|
|
|
#include <krandomsequence.h> |
|
|
|
#include <tqptrlist.h> |
|
#include <tqmemarray.h> |
|
|
|
#include "sprites.h" |
|
#include "dialogs.h" |
|
#include "options.h" |
|
|
|
enum Rotation {RLEFT,RNONE,RRIGHT}; |
|
|
|
struct MineHit |
|
{ |
|
int mineNumber,hitTime; |
|
double distance; |
|
}; |
|
|
|
enum HitObject {HSHIP,HMINE,HSHOT,HNOTHING}; |
|
|
|
struct Hit |
|
{ |
|
HitObject object; |
|
int playerNumber,objectNumber,hitTime; |
|
double distance; //distance^2 |
|
}; |
|
|
|
struct Shot |
|
{ |
|
Hit hit; |
|
Rotation rotation; |
|
int rotationFrames; |
|
double score; |
|
}; |
|
|
|
|
|
class Ai |
|
{ |
|
public: |
|
Ai(int pn,ShipSprite* s[2],TQPtrList<BulletSprite> *b[2], |
|
TQPtrList<MineSprite> *m[2],SConfig *c); |
|
void newRound(); |
|
void think(); |
|
bool rotateLeft(){return rotation==RLEFT;} |
|
bool rotateRight(){return rotation==RRIGHT;} |
|
bool accelerate(){return acc;} |
|
bool shootBullet(){return bullet;} |
|
bool layMine(){return mine;} |
|
private: |
|
AiSprite nextPosition(AiSprite sp,double mult); |
|
void nextPositions(AiSprite sp,TQMemArray<AiSprite> *a,int frames); |
|
Hit firstObject(AiSprite shot,int shotframes,int frames); |
|
void shotScores(); |
|
void calculateNextPositions(); |
|
void setSpriteFieldSize(); |
|
void testForHits(); |
|
void tryShots(); |
|
void chooseAction(); |
|
|
|
SConfig *cfg; |
|
|
|
KRandomSequence random; |
|
|
|
//actions |
|
Rotation rotation; |
|
bool acc; |
|
bool bullet,mine; |
|
//what to do when |
|
int rotateFramesNumber,accelerateFramesNumber; |
|
bool shoot; |
|
double score; |
|
//sprites |
|
int playerNumber,opponentNumber; |
|
ShipSprite *ship[2]; |
|
TQPtrList<BulletSprite> *bullets[2]; |
|
TQPtrList<MineSprite> *mines[2]; |
|
TQMemArray<AiSprite> *shipsNextPositions[2]; |
|
TQMemArray<AiSprite> *aiMines[2]; |
|
int mineNumber[2]; |
|
//possible Hits |
|
TQPtrList<Shot> myShots; |
|
TQPtrList<Hit> objectsHitByShip; |
|
TQPtrList<Hit> minesHitByShot; |
|
int borderTime; |
|
int sunTime; |
|
//SpriteField width and height |
|
double sfwidth,sfheight,sfwidth_2,sfheight_2; |
|
//Difficulty |
|
static int calcFrameIncrement[Options::EnumAiDifficulty::COUNT]; |
|
static int calcPositionNumber[Options::EnumAiDifficulty::COUNT]; |
|
static int calcShotDirections[Options::EnumAiDifficulty::COUNT]; |
|
static int calcCollisions[Options::EnumAiDifficulty::COUNT]; |
|
static int calcNextShot[Options::EnumAiDifficulty::COUNT]; |
|
static double calcShotRandom[Options::EnumAiDifficulty::COUNT]; |
|
|
|
int calculateCollisions; |
|
int waitShot; |
|
}; |
|
|
|
#endif
|
|
|