Jump to content
SubSpace Forum Network

Recommended Posts

Posted

Been working on an AI bot by having a bot send in keystrokes to a continuum client.

 

Problem 1:

Getting it to turn correctly to an angle. Here's the code I'm currently using:

 

#include "ExternalPrgController.h"



StartPriority(); // sets thread to high priority



for (count=0; count < turnangle; count++)

	 {

   keybd_event (VK_RIGHT,0,0,0);

   Sleep (29);

   keybd_event (VK_RIGHT,0,KEYEVENTF_KEYUP,0);



EndPriority(); // ends high priority

	 }

 

The problem is it turns inconsistently, sometimes several angles off. Without high priority its even worse, real time priority isn't noticably different. Need a way to match something to the time it takes to turn 1 angle in SS. Sleep(29) is the closest thing I've found, large for() loops, using windows time ticker, etc are all more inaccurate. Anyone know a better way than Sleep(29)?

 

Problem 2:

Getting the angle to turn to fire at an enemy. Current code:

 

BYTE fireangle = TriangulateFireAngle(bot->work - p->work, p->vel - bot->vel, settings->ships[bot->ship].BombSpeed / 1000); // bot = me, p = enemy



BYTE TriangulateFireAngle2(Vector &rel)

{

double	dx = -rel.x,

	 dy = rel.y;



if (dy == 0)

 if (dx > 0)

	 return 10;

 else

	 return 30;



double angle = atan(dx / dy) + PI;



if (dy >= 0)

{

 if (dx >= 0)

	 angle -= PI;

 else

	 angle += PI;

}



return BYTE(angle * 40.0 / TwoPI);

}



BYTE TriangulateFireAngle(Vector &pos, Vector &vel, Sint32 scalar)

{

// pos = relative positions

// vel = relative velocities

// scalar = velocity of bullets



double a = vel.x * vel.x + vel.y * vel.y - scalar;

double b = 2 * (pos.x * vel.x + pos.y * vel.y);

double c = pos.x * pos.x + pos.y * pos.y;

double time = (-b - sqrt((b * b) - (a * c * 2))) / (2.0 * a);

if (time <= 0.0)

 time = (-b + sqrt((b * b) - (a * c * 2))) / (2.0 * a);



return TriangulateFireAngle2(Vector(pos.x + Sint32(double(vel.y) * time), pos.y + Sint32(double(vel.y) * time)));

}

 

Thats mostly copy/paste of the built in merv code used to autofire when put in a ship. Can anyone explain it in physics/trig? Does it work when both ships are in motion? If not thats what I need.

 

Problem 3:

Need more physics formulas to calculate non-linear flight paths. Example: ship is flying along and wants to fly to some point. How to map that path without making the bot stop and then fly in a line to that point.

 

Problem 4:

During movements mervbot doesn't get any incoming information, which is usually .5 - 1.5 seconds. There an easy way to fix that? Add another thread? Pipe information to another bot?

 

Problem 5:

Takes too long to calculate fire angles, etc.. by the time its calculated and the ship has moved inches and the angle is off. Need a faster way to calculate angles or someway to compensate.

 

source code:

http://www.hardwerk.net/dueling/bots/ai2

(use !fly x (secs) or uncomment sections out of spawn.cpp (player move, weaponfire, ball move) etc.. still heavily in testing, bot needs sysop or lags out, settings.ini = first line = continuum window name, second line = player name to control)

Posted
Sleep() is only as accurate as the granularity of the system thread switching timer PLUS the responsiveness of all threads currently running. If your machine's granularity is 10ms and all threads are behaving, then Sleep(29) will not return for a minimum of 30ms, maybe longer. If there's a thread that is not giving up it's time slice regularly, it may take up to 20ms before Windows forcibly switches it out. If this occurs starting at 28ms into the Sleep(), then it won't return for 48ms. The bottom line is that you can't control/predict those intervals.
Guest
This topic is now closed to further replies.
×
×
  • Create New...