|
General Bot Coding See what a pain it is to get those little mechs shooting around
|
|
Summoner
Status: Offline
Posts: 1,499
Join Date: Feb 2004
Location: Mist Village
|
an idea of selecting weapons to buy -
26-12-2004
PHP Code:
// choose a weapon to buy and returns the weapon ID
// emotion: 0 (defensive) - 100 (aggressive)
// type: 0 - primary, 1 - secondary
int CCSBuyManager::ChooseWeapon(int iEmotion, int iMoney, int iTeam, int iType)
{
int iPersonality = 1; // personality: 0 - defensive, 1 - normal, 2 - aggressive
int iRandom = RandomLong(0, 100); // choose a random value
int delta = iRandom - iEmotion;
if (abs(delta) > 33) {
if (delta > 0) {
iPersonality = 0; // defensive
} else {
iPersonality = 2; // aggressive
}
}
std::vector<int> *p;
if (iTeam == CS_TEAM_TERRORIST) {
if (iPersonality == 0)
p = &defensive_t;
else if (iPersonality == 1)
p = &normal_t;
else
p = &aggressive_t;
} else {
if (iPersonality == 0)
p = &defensive_ct;
else if (iPersonality == 1)
p = &normal_ct;
else
p = &aggressive_ct;
}
int iSize = p->size();
std::vector<int> chosen; // weapons which has been chosen
for (int i = 0; i < iSize; i++) {
int iId = (*p)[i];
// see if this weapon can be bought
// if we're NOT using CS 1.6 and this weapon is only for CS 1.6
if (((CServerCS *)g_pServer)->GetCSVersion() == CS_VERSION_WON &&
(iId == CS_WEAPON_GALIL || iId == CS_WEAPON_FAMAS || iId == CS_WEAPON_SHIELDGUN))
continue; // skip this weapon
// are we on an assasssination map?
if (((CServerCS *)g_pServer)->GetMapType() & MAP_AS) {
// skip certain weapons which is not available on as_* maps
if (iTeam == CS_TEAM_TERRORIST) {
if (iId == CS_WEAPON_M3 || iId == CS_WEAPON_XM1014 ||
iId == CS_WEAPON_MP5NAVY || iId == CS_WEAPON_P90 ||
iId == CS_WEAPON_M249)
continue; // skip this weapon
} else {
if (iId == CS_WEAPON_AWP)
continue; // skip this weapon
}
}
cs_weapontable_s *pWeapon = get_weapon(iId);
if (!pWeapon) // check if this weapon is in our list
continue; // skip this weapon if not
// check if we have enough money
if (iMoney < pWeapon->iPrice + RandomLong(100, 200))
continue; // skip this weapon if not
if ((iType == 1 && (UtilCS::WeaponIsPrimary(iId) || iId == CS_WEAPON_SHIELDGUN)) ||
(iType == 0 && UtilCS::WeaponIsPistol(iId)))
continue; // skip this weapon
// this is a good weapon, add it to our chosen list
chosen.push_back(iId);
}
if (chosen.empty())
return 0; // no weapon is chosen, can't buy weapon
// select the weapon to buy in the table
float flFactor = (iMoney - 3000.0) / (16000 - 3000) * 3;
if (flFactor < 1)
flFactor = 1;
float f = log10(RandomFloat(1, pow(10, flFactor)));
return chosen[(int)((float)(chosen.size() - 1) * f / flFactor + 0.5)];
}
|
|
|
|
|
Council Member / E[POD]bot developer
Status: Offline
Posts: 1,620
Join Date: Jul 2004
Location: Bulgaria
|
Re: an idea of selecting weapons to buy -
26-12-2004
This is great. You are include personality.
I like that but I don't see any menuselect code .
Can you explain.
|
|
|
|
|
Council Member, Author of JoeBOT
Status: Offline
Posts: 1,381
Join Date: Nov 2003
Location: Germany
|
Re: an idea of selecting weapons to buy -
26-12-2004
well, it just returns the index of the weapon you wanna buy ... actual buying has to be done elsewhere and since it's everywhere in CS the same, no need to post this here
nice idea to put the weapons prizes on a logarithmic scale and then select them via random function on this scale ... does that give good results ?
and why do you use this RANDOM_LONG with the prize ? I think one should avoid this here for the sake of clear code, since you already have a random function later on, so why here ?
the data structures to which the p points are updated when the actual weapon is bought ?
|
|
|
|
|
Roi de France
Status: Offline
Posts: 5,049
Join Date: Nov 2003
Location: 46°43'60N 0°43'0W 0.187A
|
Re: an idea of selecting weapons to buy -
26-12-2004
I make all my weapon pickups/dropping/buying/handling decisions through a BotRateWeapon() function...
Code:
int BotRateWeapon (player_t *pPlayer, weaponspec_t *weapon_spec)
{
// this function returns an integer value describing how much a particular weapon (passed by
// the "weapon" pointer) is interesting for the bot whose player structure is pointed to by
// pPlayer. The more interesting the weapon, the higher the number this function returns.
// FIXME: quick and dirty, empirical. Redo this right.
int score;
// does the bot already have this weapon ?
if (pPlayer->weapons[weapon_spec->index].is_present)
return (0); // then this weapon is of no interest for the bot
// first reset the weapon score
score = 0;
// rate the interest regarding the weapon class
// is weapon primary AND has bot no primary weapon yet ?
if ((weapon_spec->weapon_class == WEAPON_CLASS_PRIMARY)
&& !PlayerHasWeaponOfClass (pPlayer, WEAPON_CLASS_PRIMARY))
score += 500; // then weapon is highly interesting, add 500 in a row
// else is weapon secondary AND has bot no secondary weapon yet ?
else if ((weapon_spec->weapon_class == WEAPON_CLASS_SECONDARY)
&& !PlayerHasWeaponOfClass (pPlayer, WEAPON_CLASS_SECONDARY))
score += 500; // then weapon is highly interesting, add 500 in a row
// else is weapon grenade AND has bot no grenade yet ?
else if ((weapon_spec->weapon_class == WEAPON_CLASS_GRENADE)
&& !PlayerHasWeaponOfClass (pPlayer, WEAPON_CLASS_GRENADE))
score += 500; // then weapon is highly interesting, add 500 in a row
// rate the interest regarding the bot's personal weapon preference
// is this weapon the bot's preferred weapon AND the bot doesn't own that weapon yet ?
if ((strcmp (weapon_spec->classname, pPlayer->Bot.pProfile->preferred_weapon) == 0)
&& !PlayerHasWeapon (pPlayer, weapon_spec))
score += 500; // then weapon is highly interesting, add 500 in a row
// now rate the interest regarding the weapon range
// does this weapon work best in melee AND has bot no melee weapon yet ?
if ((((weapon_spec->primary.range > 0) && (weapon_spec->primary.range == WEAPONRAIL_RANGE_MELEE))
|| ((weapon_spec->secondary.range > 0) && (weapon_spec->secondary.range == WEAPONRAIL_RANGE_MELEE)))
&& !PlayerHasWeaponOfRange (pPlayer, WEAPONRAIL_RANGE_MELEE))
score += 10; // interesting, add 10
// else does this weapon work best at close range AND has bot no close range weapon yet ?
else if ((((weapon_spec->primary.range > 0) && (weapon_spec->primary.range == WEAPONRAIL_RANGE_CLOSE))
|| ((weapon_spec->secondary.range > 0) && (weapon_spec->secondary.range == WEAPONRAIL_RANGE_CLOSE)))
&& !PlayerHasWeaponOfRange (pPlayer, WEAPONRAIL_RANGE_CLOSE))
score += 10; // interesting, add 10
// else does this weapon work best at medium range AND has bot no medium range weapon yet ?
else if ((((weapon_spec->primary.range > 0) && (weapon_spec->primary.range == WEAPONRAIL_RANGE_MEDIUM))
|| ((weapon_spec->secondary.range > 0) && (weapon_spec->secondary.range == WEAPONRAIL_RANGE_MEDIUM)))
&& !PlayerHasWeaponOfRange (pPlayer, WEAPONRAIL_RANGE_MEDIUM))
score += 10; // interesting, add 10
// else does this weapon work best at long range AND has bot no long range weapon yet ?
else if ((((weapon_spec->primary.range > 0) && (weapon_spec->primary.range == WEAPONRAIL_RANGE_FAR))
|| ((weapon_spec->secondary.range > 0) && (weapon_spec->secondary.range == WEAPONRAIL_RANGE_FAR)))
&& !PlayerHasWeaponOfRange (pPlayer, WEAPONRAIL_RANGE_FAR))
score += 10; // interesting, add 10
// now parse each parameter individually
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_DISABLER)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_DISABLER))
score -= 2;
else
score += 11;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_WATERPROOF)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_MISSILE))
score += 1;
else
score += 12;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_LIGHTDAMAGE)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_LIGHTDAMAGE))
score -= 49;
else
score -= 16;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_MEDIUMDAMAGE)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_MEDIUMDAMAGE))
score -= 6;
else
score += 7;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_HEAVYDAMAGE)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_HEAVYDAMAGE))
score += 5;
else
score += 31;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_RADIUSEFFECT)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_RADIUSEFFECT))
score -= 5;
else
score += 15;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_AUTOMATIC)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_AUTOMATIC))
score += 17;
else
score += 33;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_BUCKSHOT)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_BUCKSHOT))
score -= 9;
else
score += 16;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_SCOPED)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_SCOPED))
score += 5;
else
score += 17;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_SNIPER)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_LIGHTDAMAGE))
score -= 22;
else
score += 14;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_SILENCED)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_SILENCED))
score += 10;
else
score += 28;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_MISSILE)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_MISSILE))
score -= 2;
else
score += 10;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_HOMING)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_HOMING))
score += 5;
else
score += 20;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_TOSS)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_TOSS))
score += 2;
else
score += 10;
}
if (weapon_spec->primary.properties & WEAPONRAIL_PROPERTY_PLACE)
{
if (PlayerHasWeaponOfType (pPlayer, WEAPONRAIL_PROPERTY_PLACE))
score -= 5;
else
score += 5;
}
return (score); // return the overall score for this weapon
}
RACC home - Bots-United: beer, babies & bots (especially the latter)
"Learn to think by yourself, else others will do it for you."
|
|
|
|
|
Summoner
Status: Offline
Posts: 1,499
Join Date: Feb 2004
Location: Mist Village
|
Re: an idea of selecting weapons to buy -
29-12-2004
using the log10() to select the weapon can ensure that there are higher possibility to select "better" weapon and lower possibility to select "worse" weapon
the possibility is also depending on money
also the "p" points to a std::vector<int> which is a table similar to POD-Bot. it just chooses one of them depending on current bot's aggression value.
|
|
|
|
|
RealBot Author
Status: Offline
Posts: 3,088
Join Date: Nov 2003
Location: Netherlands
|
Re: an idea of selecting weapons to buy -
29-12-2004
RB is open source, but since we like to paste code here is mine:
Code:
void BotBuyStuff (cBot * pBot)
{
int money = pBot->bot_money; // Money
int team = pBot->iTeam; // Team
int buy_weapon = -1;
// What to buy?
if (pBot->buy_primary == true)
{
// Buy primary
bool bBuyOther = true;
// Personality related:
// Check if we can buy our favorite weapon
if (pBot->ipFavoPriWeapon > -1)
{
if (FUNC_BotHasWeapon (pBot, pBot->ipFavoPriWeapon) == false)
{
if (GoodWeaponForTeam (pBot->ipFavoPriWeapon, pBot->iTeam))
if (PriceWeapon (pBot->ipFavoPriWeapon) <= money)
{
// Buy favorite weapon
buy_weapon = pBot->ipFavoPriWeapon;
bBuyOther=false;
}
else
{
// We do here something to 'save' for our favorite weapon
if (RANDOM_LONG (0, 100) < pBot->ipSaveForWeapon)
{ // 31.08.04 Frashman forgotten brace
pBot->buy_primary = false;
bBuyOther = false;
pBot->buy_secondary = false; // don't buy a secondary
return; // get out of function, don't buy anything
}
}
}
else
{
pBot->buy_primary=false; // already have our favorite weapon
bBuyOther=false;
return; // get out of function, go buy a secondary weapon or something?
}
}
// Normal buy code
if (bBuyOther)
{
// Find weapon we can buy in the list of weapons
for (int i = 0; i < MAX_WEAPONS; i++)
{
// 31.08.04 Frashman Filter Out all except PRIMARY and SHIELD
// SHIELD is used as primary weapon
if ((UTIL_GiveWeaponType (weapons_table[i].iId) != PRIMARY)
&& (UTIL_GiveWeaponType (weapons_table[i].iId) !=SHIELD))
continue;
if (GoodWeaponForTeam (weapons_table[i].iId, team) == false)
continue;
if (weapons_table[i].price <= money)
{
if (pBot->iPrimaryWeapon > -1) // has a primary weapon
if (weapons_table[ListIdWeapon(pBot->iPrimaryWeapon)].priority >=
weapons_table[i].priority)
continue;
if (buy_weapon == -1)
buy_weapon = weapons_table[i].iId;
else
{
if (RANDOM_LONG (0, 100) < weapons_table[i].priority)
buy_weapon = weapons_table[i].iId; // randomly buy a different weapon
}
// 30.8.04 Frashman fixed from 150 to 100
if (RANDOM_LONG (0, 100) < weapons_table[i].priority)
break;
}
}
} // Buy a primary weapon
if (buy_weapon != -1)
{
pBot->buy_primary = false;
// depending on amount of money we have left buy a secondary weapon
int iMoneyLeft = money - PriceWeapon (buy_weapon);
// TODO: this should be dependant on something else... not only money
// 01.09.04 Frashman if buyed a Shield, try to buy a good Pistol
if (iMoneyLeft >= 600)
if ((RANDOM_LONG (0, 100) < 15) || (pBot->iPrimaryWeapon == CS_WEAPON_SHIELD))
pBot->buy_secondary = true;
}
}
else if (pBot->buy_secondary == true)
{
// Buy secondary
bool bBuyOther = true;
// Personality related:
// Check if we can buy our favorite weapon
if (pBot->ipFavoSecWeapon > -1)
{
if (FUNC_BotHasWeapon (pBot, pBot->ipFavoSecWeapon) == false)
{
if (GoodWeaponForTeam (pBot->ipFavoSecWeapon, pBot->iTeam))
if (PriceWeapon (pBot->ipFavoSecWeapon) < money)
{
// Buy favorite weapon
buy_weapon = pBot->ipFavoPriWeapon;
bBuyOther=false;
}
else
{
// We do here something to 'save' for our favorite weapon
if (RANDOM_LONG (0, 100) < pBot->ipSaveForWeapon)
{ // 31.08.04 Frashman forgotten brace
bBuyOther = false;
pBot->buy_secondary = false; // don't buy a secondary
return; // get out of function, don't buy anything
}
}
}
else
{
bBuyOther=false;
return; // get out of function, go buy a secondary weapon or something?
}
}
// Normal buy code
if (bBuyOther)
{
// Buy secondary
// Find weapon we can buy in the list of weapons
for (int i = 0; i < MAX_WEAPONS; i++)
{
// When enough money and the priority is high enough..
// Filter out Secondary and Grenades
if (UTIL_GiveWeaponType (weapons_table[i].iId) != SECONDARY)
continue;
if (GoodWeaponForTeam (weapons_table[i].iId, team) == false)
continue;
if (weapons_table[i].price <= money)
{
if (pBot->iSecondaryWeapon > -1) {
int index = weapons_table[pBot->iSecondaryWeapon].iIdIndex;
// 31.08.04 Frashman > corrected to >= ,
// else the bot will buy another weapon with the same priority
if (weapons_table[index].priority >= weapons_table[i].priority)
continue;
}
if (buy_weapon == -1)
buy_weapon = weapons_table[i].iId;
else
{
if (RANDOM_LONG (0, 100) < weapons_table[i].priority)
buy_weapon = weapons_table[i].iId;
}
if (RANDOM_LONG (0, 100) < weapons_table[i].priority)
break;
}
}
}
if (buy_weapon != -1)
pBot->buy_secondary = false;
}
else if (pBot->buy_ammo_primary == true)
{
// Buy primary ammo
BuyWeapon (pBot, "6", NULL);
pBot->buy_ammo_primary = false;
return;
}
else if (pBot->buy_ammo_secondary == true)
{
// Buy secondary ammo
BuyWeapon (pBot, "7", NULL);
pBot->buy_ammo_secondary = false;
return;
}
else if (pBot->buy_defusekit)
{
if (money >= 200)
{
buy_weapon = CS_DEFUSEKIT;
pBot->buy_defusekit = false;
}
}
else if (pBot->buy_armor)
{
if (money < 1000 && money >= 650)
{
// Buy light armor
buy_weapon = CS_WEAPON_ARMOR_LIGHT;
}
else if (money >= 1000)
{
// Buy heavy armor
buy_weapon = CS_WEAPON_ARMOR_HEAVY;
}
pBot->buy_armor = false;
}
else if (pBot->buy_grenade)
{
// Buy grenade
if (money >= weapons_table[ListIdWeapon (CS_WEAPON_HEGRENADE)].price)
buy_weapon = CS_WEAPON_HEGRENADE;
pBot->buy_grenade = false;
}
else if (pBot->buy_flashbang > 0)
{
// Buy flashbang
if (money >= weapons_table[ListIdWeapon (CS_WEAPON_FLASHBANG)].price)
{
buy_weapon = CS_WEAPON_FLASHBANG;
pBot->buy_flashbang--;
}
else
pBot->buy_flashbang = 0; // do not buy
}
else if (pBot->buy_smokegrenade) //31.08.04 Frashman added Smoke Grenade support
{
// Buy SmokeGrenade
if (money >= weapons_table[ListIdWeapon (CS_WEAPON_SMOKEGRENADE)].price)
buy_weapon = CS_WEAPON_SMOKEGRENADE;
pBot->buy_smokegrenade = false;
}
if (buy_weapon != -1)
{
// Buy...
// TODO
// FRASHMAN 30.08.04 haven't changed the cs 1.5 buycode, maybe there are also errors
// CS 1.5 only
if (counterstrike == 0)
{
switch (buy_weapon)
{
case CS_WEAPON_AK47: BuyWeapon (pBot, "4", "1"); break;
case CS_WEAPON_DEAGLE: BuyWeapon (pBot, "1", "3"); break;
case CS_WEAPON_P228: BuyWeapon (pBot, "1", "4"); break;
case CS_WEAPON_SG552: BuyWeapon (pBot, "4", "2"); break;
case CS_WEAPON_SG550: BuyWeapon (pBot, "4", "8"); break;
case CS_WEAPON_SCOUT: BuyWeapon (pBot, "4", "5"); break;
case CS_WEAPON_AWP: BuyWeapon (pBot, "4", "6"); break;
case CS_WEAPON_MP5NAVY: BuyWeapon (pBot, "3", "1"); break;
case CS_WEAPON_UMP45: BuyWeapon (pBot, "3", "5"); break;
case CS_WEAPON_ELITE: BuyWeapon (pBot, "1", "5"); break; // T only
case CS_WEAPON_MAC10: BuyWeapon (pBot, "3", "4"); break; // T only
case CS_WEAPON_AUG: BuyWeapon (pBot, "4", "4"); break; // CT Only
case CS_WEAPON_FIVESEVEN: BuyWeapon(pBot, "1", "6"); break; // CT only
case CS_WEAPON_M4A1: BuyWeapon(pBot, "4", "3"); break; // CT Only
case CS_WEAPON_TMP: BuyWeapon(pBot, "3", "2"); break; // CT only
case CS_WEAPON_HEGRENADE: BuyWeapon(pBot, "8", "4"); break;
case CS_WEAPON_XM1014: BuyWeapon(pBot, "2", "2"); break;
case CS_WEAPON_SMOKEGRENADE: BuyWeapon(pBot, "8", "5"); break;
case CS_WEAPON_USP: BuyWeapon(pBot, "1", "1"); break;
case CS_WEAPON_GLOCK18: BuyWeapon(pBot, "1", "2"); break;
case CS_WEAPON_M249: BuyWeapon(pBot, "5", "1"); break;
case CS_WEAPON_M3: BuyWeapon(pBot, "2", "1"); break;
case CS_WEAPON_G3SG1: BuyWeapon (pBot, "4", "7"); break;
case CS_WEAPON_FLASHBANG: BuyWeapon (pBot, "8", "3"); break;
case CS_WEAPON_P90: BuyWeapon (pBot, "3", "3"); break;
// Armor
case CS_WEAPON_ARMOR_LIGHT: BuyWeapon (pBot, "8", "1"); break;
case CS_WEAPON_ARMOR_HEAVY: BuyWeapon (pBot, "8", "2"); break;
// Defuse kit
case CS_DEFUSEKIT: BuyWeapon (pBot, "8", "6"); break;
}
}
// CS 1.6 only
if (counterstrike == 1)
{ // FRASHMAN 30/08/04: redone switch block, it was full of errors
switch (buy_weapon)
{
//Pistols
case CS_WEAPON_GLOCK18: BuyWeapon (pBot, "1", "1"); break;
case CS_WEAPON_USP: BuyWeapon (pBot, "1", "2"); break;
case CS_WEAPON_P228: BuyWeapon (pBot, "1", "3"); break;
case CS_WEAPON_DEAGLE: BuyWeapon (pBot, "1", "4"); break;
case CS_WEAPON_ELITE: BuyWeapon (pBot, "1", "5"); break;
//ShotGUNS
case CS_WEAPON_M3: BuyWeapon (pBot, "2", "1"); break;
case CS_WEAPON_XM1014: BuyWeapon (pBot, "2", "2"); break;
//SMG
case CS_WEAPON_MAC10: BuyWeapon (pBot, "3", "1"); break;
case CS_WEAPON_TMP: BuyWeapon (pBot, "3", "1"); break;
case CS_WEAPON_MP5NAVY: BuyWeapon (pBot, "3", "2"); break;
case CS_WEAPON_UMP45: BuyWeapon (pBot, "3", "3"); break;
case CS_WEAPON_P90: BuyWeapon (pBot, "3", "4"); break;
//rifles
case CS_WEAPON_GALIL: BuyWeapon (pBot, "4", "1"); break;
case CS_WEAPON_FAMAS: BuyWeapon (pBot, "4", "1"); break;
case CS_WEAPON_AK47: BuyWeapon (pBot, "4", "2"); break;
case CS_WEAPON_M4A1: BuyWeapon (pBot, "4", "3"); break;
case CS_WEAPON_SG552: BuyWeapon (pBot, "4", "4"); break;
case CS_WEAPON_AUG: BuyWeapon (pBot, "4", "4"); break;
case CS_WEAPON_SG550: BuyWeapon (pBot, "4", "5"); break;
case CS_WEAPON_G3SG1: BuyWeapon (pBot, "4", "6"); break;
//machinegun
case CS_WEAPON_M249: BuyWeapon (pBot, "5", "1"); break;
// equipment
case CS_WEAPON_ARMOR_LIGHT: BuyWeapon (pBot, "8", "1"); break;
case CS_WEAPON_ARMOR_HEAVY: BuyWeapon (pBot, "8", "2"); break;
case CS_WEAPON_FLASHBANG: BuyWeapon (pBot, "8", "3"); break;
case CS_WEAPON_HEGRENADE: BuyWeapon (pBot, "8", "4"); break;
case CS_WEAPON_SMOKEGRENADE: BuyWeapon (pBot, "8", "5"); break;
case CS_WEAPON_SHIELD: BuyWeapon (pBot, "8", "8"); break;
case CS_DEFUSEKIT: BuyWeapon (pBot, "8", "6"); break;
}
// This differs per team
// FRASHMAN 30/08/04: all into one ifthen block
if (pBot->iTeam == 2) // counter
{
switch(buy_weapon)
{
case CS_WEAPON_SCOUT: BuyWeapon(pBot,"4","2"); break;
case CS_WEAPON_AWP: BuyWeapon(pBot,"4","6"); break;
//whats about nightvision? BuyWeapon (pBot, "8", "7")
}
}
else // terror
{
switch(buy_weapon)
{
case CS_WEAPON_SCOUT: BuyWeapon(pBot,"4","3"); break;
case CS_WEAPON_AWP: BuyWeapon(pBot,"4","5"); break;
//whats about nightvision? BuyWeapon (pBot, "8", "6")
}
}
} // end of cs 1.6 part
} // We actually gonna buy this weapon
}
its personality related (favorite weapon, etc)
its cs 1.5/1.6 compatible
its not _as and _es compatible (maps)
it has some sort of scoring system
its output relies on the ini parsed information from buytable.ini
piece of buytable.ini
Quote:
#======
#CS 1.6
#======
; Counter-Terrorist weapon; not as good as Galil
[FAMAS]
Price=2250
Priority=15
; Terrorist Weapon; pretty accurate
[GALIL]
Price=2000
Priority=30
|
|
|
|
|
|
Council Member, Author of JoeBOT
Status: Offline
Posts: 1,381
Join Date: Nov 2003
Location: Germany
|
Re: an idea of selecting weapons to buy -
29-12-2004
[ hey stefan, we had already a general "let's post my über leet buyfunction thread" ]
|
|
|
|
|
RealBot Author
Status: Offline
Posts: 3,088
Join Date: Nov 2003
Location: Netherlands
|
Re: an idea of selecting weapons to buy -
30-12-2004
rofl really? let me double post on there!
|
|
|
|
|
Ex-Council Member
Status: Offline
Posts: 1,090
Join Date: Nov 2003
Location: Canada
|
Re: an idea of selecting weapons to buy -
02-01-2005
An effective but low tech way of having bots select good weapons for a given map, is to have a map "scenario" file which can specify which weapons are most effective for the type of map in use. A scenario file can specify much more, such as which personalities are best, weapon type distribution (eg 2 snipers, 3 shotgun, etc), and so on.
Maker of the (mEAn) Bot.Admin Manager
"In theory, there is no difference between theory and practice. But, in practice, there is." - Jan L.A. van de Snepscheut
|
|
|
|
|
Roi de France
Status: Offline
Posts: 5,049
Join Date: Nov 2003
Location: 46°43'60N 0°43'0W 0.187A
|
Re: an idea of selecting weapons to buy -
02-01-2005
good point, but this can be done automatically if the bots keep track themselves of which weapons are useful for which map. Let's let them discover it by themselves, it's always funnier
RACC home - Bots-United: beer, babies & bots (especially the latter)
"Learn to think by yourself, else others will do it for you."
|
|
|
Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
Powered by vBulletin® Version 3.8.2 Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
vBulletin Skin developed by: vBStyles.com
|
|