diff --git a/README.md b/README.md index 1111b77..cf1df9a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![GitHub Logo](/bw-assets/bw-logo.png) # IW2 Bot Warfare -Bot Warfare is a GSC mod for [libcod](https://github.com/ibuddieat/zk_libcod/) / [CoD2rev Server](https://github.com/voron00/CoD2rev_Server). +Bot Warfare is a GSC mod for [CoD2rev Server](https://github.com/voron00/CoD2rev_Server)'s implementation of [libcod](https://znation.nl/cod2script/)'s bot functions. It aims to add playable AI to the multiplayer games of CoD2. diff --git a/maps/mp/gametypes/_clientids.gsc b/maps/mp/gametypes/_clientids.gsc index d48805e..f723bcd 100644 --- a/maps/mp/gametypes/_clientids.gsc +++ b/maps/mp/gametypes/_clientids.gsc @@ -5,7 +5,7 @@ init() level thread onPlayerConnect(); // bootstrap - level thread scripts\mp\bots_adapter_libcod::init(); + level thread scripts\mp\bots_adapter_znation_libcod::init(); level thread scripts\mp\bots_wp_editor::init(); level thread scripts\mp\bots::init(); level thread scripts\mp\bots_chat::init(); diff --git a/scripts/mp/bots_adapter_libcod.gsc b/scripts/mp/bots_adapter_libcod.gsc deleted file mode 100644 index 0bd86f1..0000000 --- a/scripts/mp/bots_adapter_libcod.gsc +++ /dev/null @@ -1,262 +0,0 @@ -init() -{ - level.bot_builtins[ "printconsole" ] = ::do_printconsole; - level.bot_builtins[ "botaction" ] = ::do_botaction; - level.bot_builtins[ "botstop" ] = ::do_botstop; - level.bot_builtins[ "botmovement" ] = ::do_botmovement; - level.bot_builtins[ "isbot" ] = ::do_isbot; - level.bot_builtins[ "botangles" ] = ::do_botangles; - level.bot_builtins[ "botweapon" ] = ::do_botweapon; - - thread setup_weaponid_map(); -} - -register_weaponid( weap ) -{ - if ( !isdefined( level.bot_weaponids[ weap ] ) ) - { - level.bot_weaponids[ weap ] = level.bot_weaponids.size; - } -} - -setup_weaponid_map() -{ - waittillframeend; - - level.bot_weaponids = []; - register_weaponid( "none" ); - register_weaponid( "defaultweapon_mp" ); - - turrets = getentarray( "misc_turret", "classname" ); - - for ( i = 0; i < turrets.size; i++ ) - { - if ( !isdefined( turrets[i].weaponinfo ) ) - { - continue; - } - - register_weaponid( turrets[i].weaponinfo ); - } - - // in the order of precache - switch ( game[ "allies" ] ) - { - case "american": - register_weaponid( "frag_grenade_american_mp" ); - register_weaponid( "smoke_grenade_american_mp" ); - register_weaponid( "colt_mp" ); - register_weaponid( "m1carbine_mp" ); - register_weaponid( "m1garand_mp" ); - register_weaponid( "thompson_mp" ); - register_weaponid( "bar_mp" ); - register_weaponid( "springfield_mp" ); - register_weaponid( "greasegun_mp" ); - register_weaponid( "shotgun_mp" ); - break; - - case "british": - register_weaponid( "frag_grenade_british_mp" ); - register_weaponid( "smoke_grenade_british_mp" ); - register_weaponid( "webley_mp" ); - register_weaponid( "enfield_mp" ); - register_weaponid( "sten_mp" ); - register_weaponid( "bren_mp" ); - register_weaponid( "enfield_scope_mp" ); - register_weaponid( "m1garand_mp" ); - register_weaponid( "thompson_mp" ); - register_weaponid( "shotgun_mp" ); - break; - - case "russian": - register_weaponid( "frag_grenade_russian_mp" ); - register_weaponid( "smoke_grenade_russian_mp" ); - register_weaponid( "TT30_mp" ); - register_weaponid( "mosin_nagant_mp" ); - register_weaponid( "SVT40_mp" ); - register_weaponid( "PPS42_mp" ); - register_weaponid( "ppsh_mp" ); - register_weaponid( "mosin_nagant_sniper_mp" ); - register_weaponid( "shotgun_mp" ); - break; - } - - register_weaponid( "frag_grenade_german_mp" ); - register_weaponid( "smoke_grenade_german_mp" ); - register_weaponid( "luger_mp" ); - register_weaponid( "kar98k_mp" ); - register_weaponid( "g43_mp" ); - register_weaponid( "mp40_mp" ); - register_weaponid( "mp44_mp" ); - register_weaponid( "kar98k_sniper_mp" ); - register_weaponid( "shotgun_mp" ); - register_weaponid( "binoculars_mp" ); -} - -get_weaponid_for_string( weap ) -{ - ans = level.bot_weaponids[ weap ]; - - if ( !isdefined( ans ) ) - { - return 1; - } - - return ans; -} - -do_printconsole( s ) -{ - println( s ); -} - -do_botaction( action ) -{ - switch ( action ) - { - case "+fire": - self fireweapon( true ); - break; - - case "-fire": - self fireweapon( false ); - break; - - case "+ads": - self adsaim( true ); - break; - - case "-ads": - self adsaim( false ); - break; - - case "-reload": - self reloadweapon( false ); - break; - - case "+reload": - self reloadweapon( true ); - break; - - case "-melee": - self meleeweapon( false ); - break; - - case "+melee": - self meleeweapon( true ); - break; - - case "+frag": - self thrownade( true ); - break; - - case "-frag": - self thrownade( false ); - break; - - case "-gocrouch": - case "-goprone": - case "-gostand": - self setbotstance( "stand" ); - break; - - case "+gocrouch": - self setbotstance( "crouch" ); - break; - - case "+goprone": - self setbotstance( "prone" ); - break; - - case "+gostand": - self setbotstance( "jump" ); - break; - - case "-activate": - self activate( false ); // no equal in libcod - break; - - case "+activate": - self activate( true ); - break; - - case "+smoke": - // self throwsmoke( true ); - break; - - case "-smoke": - // self throwsmoke( false ); - break; - - case "+holdbreath": - // self holdbreath( true ); - break; - - case "-holdbreath": - // self holdbreath( false ); - break; - } - - // self botaction( action ); -} - -do_botstop() -{ - self adsaim( false ); - self reloadweapon( false ); - self meleeweapon( false ); - self fireweapon( false ); - self thrownade( false ); - self setbotstance( "stand" ); - self setlean( "none" ); - self setwalkdir( "none" ); - self switchtoweaponid( get_weaponid_for_string( self getcurrentweapon() ) ); - - // self botstop(); -} - -do_botmovement( forward, right ) -{ - // best i can do for libcod... - self setwalkdir( "none" ); - - if ( forward > 63 ) - { - self setwalkdir( "forward" ); - } - - if ( forward < -63 ) - { - self setwalkdir( "back" ); - } - - if ( right > 63 ) - { - self setwalkdir( "right" ); - } - - if ( right < -63 ) - { - self setwalkdir( "left" ); - } - - // self botmovement( forward, right ); -} - -do_isbot() -{ - return false; // no equal in libcod - // self isbot(); -} - -do_botangles( angles ) -{ - self setplayerangles( angles ); - // self botangles( angles[ 0 ], angles[ 1 ], angles[ 2 ] ); -} - -do_botweapon( weapon ) -{ - self switchtoweaponid( get_weaponid_for_string( weapon ) ); - // self switchtoweapon( weapon ); -} diff --git a/scripts/mp/bots_adapter_znation_libcod.gsc b/scripts/mp/bots_adapter_znation_libcod.gsc new file mode 100644 index 0000000..5644bac --- /dev/null +++ b/scripts/mp/bots_adapter_znation_libcod.gsc @@ -0,0 +1,179 @@ +init() +{ + level.bot_builtins[ "printconsole" ] = ::do_printconsole; + level.bot_builtins[ "botaction" ] = ::do_botaction; + level.bot_builtins[ "botstop" ] = ::do_botstop; + level.bot_builtins[ "botmovement" ] = ::do_botmovement; + level.bot_builtins[ "isbot" ] = ::do_isbot; + level.bot_builtins[ "botangles" ] = ::do_botangles; + level.bot_builtins[ "botweapon" ] = ::do_botweapon; +} + +do_printconsole( s ) +{ + println( s ); +} + +do_botaction( action ) +{ + switch ( action ) + { + case "+fire": + self fireweapon( true ); + break; + + case "-fire": + self fireweapon( false ); + break; + + case "+ads": + self adsaim( true ); + break; + + case "-ads": + self adsaim( false ); + break; + + case "-reload": + self reloadweapon( false ); + break; + + case "+reload": + self reloadweapon( true ); + break; + + case "-melee": + self meleeweapon( false ); + break; + + case "+melee": + self meleeweapon( true ); + break; + + case "+frag": + self thrownade( true ); + break; + + case "-frag": + self thrownade( false ); + break; + + case "-gocrouch": + case "-goprone": + case "-gostand": + self setbotstance( "stand" ); + break; + + case "+gocrouch": + self setbotstance( "crouch" ); + break; + + case "+goprone": + self setbotstance( "prone" ); + break; + + case "+gostand": + self setbotstance( "jump" ); + break; + + case "-activate": + // self activate( false ); // no equal in libcod + break; + + case "+activate": + // self activate( true ); + break; + + case "+smoke": + // self throwsmoke( true ); + break; + + case "-smoke": + // self throwsmoke( false ); + break; + + case "+holdbreath": + // self holdbreath( true ); + break; + + case "-holdbreath": + // self holdbreath( false ); + break; + } + + // self botaction( action ); +} + +do_botstop() +{ + self adsaim( false ); + self reloadweapon( false ); + self meleeweapon( false ); + self fireweapon( false ); + self thrownade( false ); + self setbotstance( "stand" ); + self setlean( "none" ); + self setwalkdir( "none" ); + self do_botweapon( self getcurrentweapon() ); + + // self botstop(); +} + +do_botmovement( forward, right ) +{ + // best i can do for libcod... + self setwalkdir( "none" ); + + if ( forward > 63 ) + { + self setwalkdir( "forward" ); + } + + if ( forward < -63 ) + { + self setwalkdir( "back" ); + } + + if ( right > 63 ) + { + self setwalkdir( "right" ); + } + + if ( right < -63 ) + { + self setwalkdir( "left" ); + } + + // self botmovement( forward, right ); +} + +do_isbot() +{ + return self isbot(); +} + +do_botangles( angles ) +{ + self setplayerangles( angles ); + + // self botangles( angles[ 0 ], angles[ 1 ], angles[ 2 ] ); +} + +do_botweapon( weapon ) +{ + if ( !isdefined( level.bot_weaponids ) ) + { + level.bot_weaponids = []; + + weaps = getloadedweapons(); + + for ( i = 0; i < weaps.size; i++ ) + { + level.bot_weaponids[ weaps[ i ] ] = i; + } + } + + self switchtoweaponid( level.bot_weaponids[ weapon ] ); + + // self switchtoweapon( weapon ); +}