Basicbot 0.2.2: Added "static variables" (no, not a contradiction ;) and "static random variables" (I won't even try...)
This commit is contained in:
parent
dd126e30e5
commit
24288cd015
|
@ -37,7 +37,7 @@
|
||||||
// go up each time something is released to the public, so you'll
|
// go up each time something is released to the public, so you'll
|
||||||
// know your version is the latest or whatever. Version will be
|
// know your version is the latest or whatever. Version will be
|
||||||
// put in the project as well.
|
// put in the project as well.
|
||||||
static char BBversion[] = "0.2.1";
|
static char BBversion[] = "0.2.2";
|
||||||
|
|
||||||
static HWND hwndBasicBot = 0; // qfox: GUI handle
|
static HWND hwndBasicBot = 0; // qfox: GUI handle
|
||||||
static bool BotRunning = false; // qfox: Is the bot computing or not? I think...
|
static bool BotRunning = false; // qfox: Is the bot computing or not? I think...
|
||||||
|
@ -131,6 +131,19 @@ float AverageScore[4]; // qfox: keep the average scores in here. to prevent
|
||||||
// this is not a total, but the average is computed after
|
// this is not a total, but the average is computed after
|
||||||
// every attempt and put back in here. this shouldn't
|
// every attempt and put back in here. this shouldn't
|
||||||
// affect accuracy.
|
// affect accuracy.
|
||||||
|
int X,Y,Z,P,Prand,Q,Qrand; // qfox: static variables (is this a contradiction?) and
|
||||||
|
// probabilities. XYZ remain the same, PQ return randomly a
|
||||||
|
// number in the range of 0-P or 0-Q. They can be used in
|
||||||
|
// the code like any other command ("5+X echo"). The button
|
||||||
|
// above their input fields will update these values only (!)
|
||||||
|
// The rand values are updated after each frame. This results
|
||||||
|
// in all the P and Q values being equal in every usage, but
|
||||||
|
// random for each frame.
|
||||||
|
// The values are only evaluated when reading them from the
|
||||||
|
// GUI (so when starting a new run or when refreshing). This
|
||||||
|
// means you can use any code here, but the static won't be
|
||||||
|
// updated every frame. This is the intention of the variable.
|
||||||
|
|
||||||
|
|
||||||
static void SeedRandom(uint32 seed)
|
static void SeedRandom(uint32 seed)
|
||||||
{
|
{
|
||||||
|
@ -152,7 +165,14 @@ static unsigned int NextRandom(void)
|
||||||
rand3 = (((rand3 & 4294967280U) << 17) ^ b);
|
rand3 = (((rand3 & 4294967280U) << 17) ^ b);
|
||||||
return (rand1 ^ rand2 ^ rand3);
|
return (rand1 ^ rand2 ^ rand3);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* qfox: this is the way we use it anyways
|
||||||
|
*/
|
||||||
|
static int GetRandom(int n)
|
||||||
|
{
|
||||||
|
if (n == 0) return n; // qfox: zero devision exception catch :)
|
||||||
|
return (int) (NextRandom() % n);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qfox: All syntax-errors lead here. Some gui notification should be
|
* qfox: All syntax-errors lead here. Some gui notification should be
|
||||||
|
@ -233,6 +253,15 @@ static int EvaluateFormula(char * formula)
|
||||||
return ParseFormula(false);
|
return ParseFormula(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qfox: fetch the contents of a textfield, evaluated it, return the result
|
||||||
|
*/
|
||||||
|
static int EvaluateTextfield(int fieldID)
|
||||||
|
{
|
||||||
|
char TempCode[BOT_MAXCODE];
|
||||||
|
GetDlgItemText(hwndBasicBot, fieldID, TempCode, BOT_MAXCODE);
|
||||||
|
return EvaluateFormula(TempCode);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Parse one level of a string, return the value of the right most number
|
* Parse one level of a string, return the value of the right most number
|
||||||
* - ret indicates whether the function should return as soon as it determines a number,
|
* - ret indicates whether the function should return as soon as it determines a number,
|
||||||
|
@ -991,6 +1020,25 @@ static int ParseFormula(bool ret)
|
||||||
}
|
}
|
||||||
if (ret) return value;
|
if (ret) return value;
|
||||||
break;
|
break;
|
||||||
|
case 'P':
|
||||||
|
case 'Q':
|
||||||
|
// qfox:these values will not change for each usage
|
||||||
|
// but be changed to a random number in 0-P and
|
||||||
|
// 0-Q after each frame. This way you can vary
|
||||||
|
// the value of some number while using this
|
||||||
|
// number more then once.
|
||||||
|
value = (*GlobalCurrentChar == 'P') ? Prand : Qrand;
|
||||||
|
++GlobalCurrentChar;
|
||||||
|
if (ret) return value;
|
||||||
|
break;
|
||||||
|
case 'X':
|
||||||
|
case 'Y':
|
||||||
|
case 'Z':
|
||||||
|
// qfox: the XYZ makes using statics easier.
|
||||||
|
value = (*GlobalCurrentChar == 'X') ? X : ((*GlobalCurrentChar == 'Y') ? Y : Z);
|
||||||
|
++GlobalCurrentChar;
|
||||||
|
if (ret) return value;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// qfox: Unknown characters should error out from now on. You can use spaces.
|
// qfox: Unknown characters should error out from now on. You can use spaces.
|
||||||
BotSyntaxError(12001);
|
BotSyntaxError(12001);
|
||||||
|
@ -1059,6 +1107,9 @@ void UpdateBasicBot()
|
||||||
memset(BotCounter, 0, BOT_MAXCOUNTERS*4); // qfox: sets all the counters to 0. *4 because
|
memset(BotCounter, 0, BOT_MAXCOUNTERS*4); // qfox: sets all the counters to 0. *4 because
|
||||||
// memset writes bytes and the counters are
|
// memset writes bytes and the counters are
|
||||||
// ints (4 bytes! :)
|
// ints (4 bytes! :)
|
||||||
|
// qfox: update the P and Q values to something new
|
||||||
|
Prand = GetRandom(P);
|
||||||
|
Qrand = GetRandom(Q);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1203,7 +1254,7 @@ void UpdateBasicBot()
|
||||||
// random number, the button is pressed :)
|
// random number, the button is pressed :)
|
||||||
for(i=0;i<16;i++)
|
for(i=0;i<16;i++)
|
||||||
{
|
{
|
||||||
if((int) (NextRandom() % 1000) < EvaluateFormula(Formula[i]))
|
if(GetRandom(1000) < EvaluateFormula(Formula[i]))
|
||||||
{
|
{
|
||||||
// qfox: button flags:
|
// qfox: button flags:
|
||||||
// button - player 1 - player 2
|
// button - player 1 - player 2
|
||||||
|
@ -1501,6 +1552,8 @@ static void FromGUI()
|
||||||
GetDlgItemText(hwndBasicBot, 1009, Formula[CODE_STOP], BOT_MAXCODE);
|
GetDlgItemText(hwndBasicBot, 1009, Formula[CODE_STOP], BOT_MAXCODE);
|
||||||
|
|
||||||
GetDlgItemText(hwndBasicBot, GUI_BOT_EXTRA, ExtraCode, BOT_MAXCODE);
|
GetDlgItemText(hwndBasicBot, GUI_BOT_EXTRA, ExtraCode, BOT_MAXCODE);
|
||||||
|
|
||||||
|
UpdateStatics();
|
||||||
}
|
}
|
||||||
UpdateFromGUI = false;
|
UpdateFromGUI = false;
|
||||||
}
|
}
|
||||||
|
@ -1525,6 +1578,13 @@ static void ToGUI()
|
||||||
SetDlgItemText(hwndBasicBot, 1009, Formula[CODE_STOP]);
|
SetDlgItemText(hwndBasicBot, 1009, Formula[CODE_STOP]);
|
||||||
|
|
||||||
SetDlgItemText(hwndBasicBot, GUI_BOT_EXTRA, ExtraCode);
|
SetDlgItemText(hwndBasicBot, GUI_BOT_EXTRA, ExtraCode);
|
||||||
|
|
||||||
|
SetDlgItemInt(hwndBasicBot, GUI_BOT_X, X, TRUE);
|
||||||
|
SetDlgItemInt(hwndBasicBot, GUI_BOT_Y, Y, TRUE);
|
||||||
|
SetDlgItemInt(hwndBasicBot, GUI_BOT_Z, Z, TRUE);
|
||||||
|
SetDlgItemInt(hwndBasicBot, GUI_BOT_P, P, TRUE);
|
||||||
|
SetDlgItemInt(hwndBasicBot, GUI_BOT_Q, Q, TRUE);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1549,6 +1609,21 @@ static void InitVars()
|
||||||
Formula[CODE_STOP][4] = 'e';
|
Formula[CODE_STOP][4] = 'e';
|
||||||
Formula[CODE_STOP][5] = '=';
|
Formula[CODE_STOP][5] = '=';
|
||||||
Formula[CODE_STOP][6] = '1';
|
Formula[CODE_STOP][6] = '1';
|
||||||
|
X = Y = Z = P = Prand = Q = Qrand = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qfox: behaves like FromGUI(), except only for XYZPQ
|
||||||
|
*/
|
||||||
|
static void UpdateStatics()
|
||||||
|
{
|
||||||
|
// qfox: these "statics" are only evaluated once
|
||||||
|
// (this also saves me looking up stringtoint functions ;)
|
||||||
|
X = EvaluateTextfield(GUI_BOT_X);
|
||||||
|
Y = EvaluateTextfield(GUI_BOT_Y);
|
||||||
|
Z = EvaluateTextfield(GUI_BOT_Z);
|
||||||
|
P = EvaluateTextfield(GUI_BOT_P);
|
||||||
|
Q = EvaluateTextfield(GUI_BOT_Q);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1623,9 +1698,15 @@ static BOOL CALLBACK BasicBotCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
|
||||||
break;
|
break;
|
||||||
case GUI_BOT_RUN:
|
case GUI_BOT_RUN:
|
||||||
if(BotRunning)
|
if(BotRunning)
|
||||||
|
{
|
||||||
StopBasicBot();
|
StopBasicBot();
|
||||||
|
FCEU_SetBotMode(0);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
FCEU_SetBotMode(1);
|
||||||
StartBasicBot();
|
StartBasicBot();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case GUI_BOT_CLEAR:
|
case GUI_BOT_CLEAR:
|
||||||
StopSound();
|
StopSound();
|
||||||
|
@ -1655,6 +1736,10 @@ static BOOL CALLBACK BasicBotCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
|
||||||
// refresh the variables with the data from gui, without stopping.
|
// refresh the variables with the data from gui, without stopping.
|
||||||
UpdateFromGUI = true;
|
UpdateFromGUI = true;
|
||||||
break;
|
break;
|
||||||
|
case GUI_BOT_U:
|
||||||
|
// qfox: the small update button above the static variables ("U"),
|
||||||
|
// only update the statics.
|
||||||
|
UpdateStatics();
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,12 +4,13 @@
|
||||||
void UpdateBasicBot();
|
void UpdateBasicBot();
|
||||||
void CreateBasicBot();
|
void CreateBasicBot();
|
||||||
extern char *BasicBotDir;
|
extern char *BasicBotDir;
|
||||||
static int EvaluateFormula(char * formula, char **nextposition, bool ret);
|
static int EvaluateFormula(char * formula);
|
||||||
static int ParseFormula(bool ret);
|
static int ParseFormula(bool ret);
|
||||||
static void StopBasicBot();
|
static void StopBasicBot();
|
||||||
static void StartBasicBot();
|
static void StartBasicBot();
|
||||||
static void debug(int n);
|
static void debug(int n);
|
||||||
static void error(int n);
|
static void error(int n);
|
||||||
static void FromGUI();\
|
static void FromGUI();
|
||||||
|
static void UpdateStatics();
|
||||||
void UpdateExternalButton();
|
void UpdateExternalButton();
|
||||||
#endif // _BASICBOT_H_
|
#endif // _BASICBOT_H_
|
||||||
|
|
Binary file not shown.
|
@ -5,15 +5,20 @@
|
||||||
#define GUI_BOT_CLOSE 1
|
#define GUI_BOT_CLOSE 1
|
||||||
#define IDI_ICON1 101
|
#define IDI_ICON1 101
|
||||||
#define IDI_ICON2 102
|
#define IDI_ICON2 102
|
||||||
|
#define GUI_BOT_X 1010
|
||||||
#define GUI_BOT_SAVE 1014
|
#define GUI_BOT_SAVE 1014
|
||||||
#define GUI_BOT_LOAD 1015
|
#define GUI_BOT_LOAD 1015
|
||||||
#define GUI_BOT_RUN 1016
|
#define GUI_BOT_RUN 1016
|
||||||
|
#define GUI_BOT_Y 1018
|
||||||
#define GUI_BOT_KEYS 1019
|
#define GUI_BOT_KEYS 1019
|
||||||
#define GUI_BOT_EXTRA 1020
|
#define GUI_BOT_EXTRA 1020
|
||||||
#define GUI_BOT_BEST 1021
|
#define GUI_BOT_BEST 1021
|
||||||
|
#define GUI_BOT_Z 1022
|
||||||
#define GUI_BOT_CHECK 1023
|
#define GUI_BOT_CHECK 1023
|
||||||
#define GUI_BOT_UPDATE 1024
|
#define GUI_BOT_UPDATE 1024
|
||||||
#define GUI_BOT_BOTMODE 1025
|
#define GUI_BOT_BOTMODE 1025
|
||||||
|
#define GUI_BOT_P 1026
|
||||||
|
#define GUI_BOT_Q 1027
|
||||||
#define GUI_BOT_P1 1035
|
#define GUI_BOT_P1 1035
|
||||||
#define GUI_BOT_CLEAR 1036
|
#define GUI_BOT_CLEAR 1036
|
||||||
#define GUI_BOT_ATTEMPTS 1037
|
#define GUI_BOT_ATTEMPTS 1037
|
||||||
|
@ -21,6 +26,7 @@
|
||||||
#define GUI_BOT_FRAMES 1049
|
#define GUI_BOT_FRAMES 1049
|
||||||
#define GUI_BOT_BESTRESULT 1050
|
#define GUI_BOT_BESTRESULT 1050
|
||||||
#define GUI_BOT_LAST 1051
|
#define GUI_BOT_LAST 1051
|
||||||
|
#define GUI_BOT_U 1052
|
||||||
#define GUI_BOT_AVGMAX 1053
|
#define GUI_BOT_AVGMAX 1053
|
||||||
#define GUI_BOT_AVGTIE1 1054
|
#define GUI_BOT_AVGTIE1 1054
|
||||||
#define GUI_BOT_AVGTIE2 1056
|
#define GUI_BOT_AVGTIE2 1056
|
||||||
|
@ -41,7 +47,7 @@
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 103
|
#define _APS_NEXT_RESOURCE_VALUE 103
|
||||||
#define _APS_NEXT_COMMAND_VALUE 40013
|
#define _APS_NEXT_COMMAND_VALUE 40013
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1050
|
#define _APS_NEXT_CONTROL_VALUE 1053
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue