Welcome to Marine Bot homepage
a bot for Firearms mod

NEWS
FILES
INFO
SUPPORT
LINKS

13 July 2020

Three months later and the development is still going. Truth is that now when things returned to somewhat normal state I have less time to work on Marine Bot. Since last update I've found two game crashing bugs in the source codes. Both were related to waypointing commands. Both did crash the game with 'Overload on netchan -> message' error. One was probably present since last MB version 0.93b. The other one was a result of extending the feedback for one of the waypoints checking function. Simply put too much data has been sent into console at one moment. Both cases resulted in a change how the feedback is printed into console for both commands. This will probably lead to yet another change related to this in the future MB version. Because I don't want to do bigger changes in the code now when is current MB version close to public release.

The next thing that happened in those three months was that I have finally installed Linux OS on old laptop. It's a Ubuntu 20.04 LTS. So Marine Bot has finally been correctly ported to work on Linux the same way it does on Windows. I mean that I've been able to experience the issues that a Linux user can have when he/she is trying to use Marine Bot on that system. Expect updated support once the version 0.94b will go public. I've been updating the whole MB website with info related to using MB on Linux system. So with the release of MB0.94b this whole web will be updated as well. Together with that, MB waypointing guide (manual if you wish) has also received an update to match changes made to MB0.94b. That means it'll also be made public when the version 0.94b is released.

After figuring out how to use Marine Bot on Linux I've made sure to make it compile successfully there too. As I've said in the last news MB source codes have been reworked and cleaned a lot. That means many unused things have been removed including whole files. On the other hand some new files have been added to the project. Thus the 'makefile' was totally out of sync and Linux users were not able to build 'marine_bot.so' at all. This is fixed now. MB0.94b source codes allow the Dedicated Server admin to build the shared object library (.so) right out of the box. I've also added an option to use the '-static-libstdc++' linker flag to link the 'libstdc++.so.6' statically into 'marine_bot.so' in order to deal with SteamCMD HLDS bug that results in 'libstdc++.so.6: version CXXABI_1.3.9 not found' error. My Linux skills are below basic level. I know nearly nothing about building programs in Linux environment. But with the help of Google I was able to find this static linking solution. I mean not everyone is able to do symbolic link to system library to deal with the outdated 'libstdc++.so.6' inside SteamCMD HLDS folder. I certainly wasn't able to overcome that problem for like 2 weeks. Until one random burst of my mad mind suggested to try such crazy thing. Well first I had to read through many web pages about Linux to be able to have such idea. On the other hand this is part of the fun when one is trying out new things.

Finally I've made Marine Bot source codes compatible with the three probably most used versions of HL SDKs. The source codes have always been compatible with the original HL SDK v2.3 where I'm doing all the work. Year or two ago RoboCop from AGP clan asked me to help him with moving Marine Bot source codes to new HL SDK that Valve released in year 2013. He also suggested to do the same with my main MB source codes. I don't really want to do it, because from what I have read the SDK v 2.3 has still best compatibility with the old WON Half-Life version. And Marine Bot is meant for offline gaming so it should be available even to people who never moved to Steam. But I understand that people who want to compile MB on their own, for whatever reason they have for it, will probably use newer HL SDKs. Thus as of version 0.94b Marine Bot source codes will be compatible with Valve's HL SDK 2013. Then the modified version of that SDK done by Allied Modders. And also with Metamod's patched version of HL SDK v2.3. I'm using the preprocessor directives for this. So all one has to do is set the flag matching the SDK version and things will work just fine. I've added this option even into the 'makefile'. I compiled the .dll in all three SDKs and tested them in game. All three worked. I did the same on Linux. Dedicated Server always started and a few bots joined it. So far all seems to be okay. Also there has been added new simple text file into the project that has all the info related to this feature. Basically if you aren't using the original HL SDK v2.3, but one of those three, you'll edit just one file to set the appropriate flag on and you're ready to go.

To summarize it. Things are moving forward. There is still some work needed to be done, but as of now it seems that the public release of Marine Bot 0.94b is close.

13 April 2020

This year Easter bunny isn't going to hide stuff on your garden. But he's going to reveal a few things from Marine Bot kitchen. This winter for almost four full months I've been home because of problems with my hip joint. So I was able to work on new Marine Bot version. Now there's a covid-19 crisis and the company I work for has stopped production for a few weeks so I'm home again. And I can continue working on Marine Bot 0.94b.
Here's current change log. It's a work in progress log. In the order how did the things happen.

As you can see this time it's quite a big pack of changes, fixes and also new features. Plus as I've had a lot of time to work with the source code I was also able to do a big clean up and finally finish the part that allows me to debug (watch) one particular bot and filter out all other bots that are needed for testing. This allows me to do much better testing. That is basically what I'm doing now. I'm testing all new features and all the fixes one by one to confirm that they are really working the way they should. In order to release as bug free version as possible. I'll show you two recent logs so you can see how does it work 'in real world'.

This is a log from test of ability to handle unexpected interruption of weapon switching. I've modified obj_thanatos waypoints where is one sniper bot (ssg3000+ber92f) holding one of the buildings near blue spawn area against 3 or 4 red bots with ber92f. The goal is to test how well does the sniper bot handle weapon switching and weapon reloading in cases when his enemies are showing and hiding and even hitting him. I'm his teammate, but in observer mode, and I'm the one who did interrupt his weapon switch with a medical treatment. I'll only add that not every action is logged. I'm logging just the actions that are necessary for the test otherwise the log would have been hard to read and basically pointless.


***new record(time:824.278381)(map:obj_thanatos)***
([MB]Charles O'Neil)***FindEnemy() -> Got NEW ENEMY!!!


***new record(time:825.662903)(map:obj_thanatos)***
([MB]Charles O'Neil)FireWeapon() -> going to change current weapon


***new record(time:825.662903)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:827.064270)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> changed to BACKUP weapon


***new record(time:827.081116)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:827.264404)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> WEAPON is READY now!


***new record(time:827.281189)(map:obj_thanatos)***
([MB]Charles O'Neil)Select MainWeapon() called @ DontSeeEnemy Actions() -> time to switch back to MAIN WEAPON


***new record(time:827.281189)(map:obj_thanatos)***
([MB]Charles O'Neil)is trying to switch back to MAIN weapon


***new record(time:827.281189)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:828.982849)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> changed to MAIN weapon


***new record(time:829.000061)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:829.182922)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> WEAPON is READY now!


***new record(time:829.201660)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil SET DONTGOPRONE behaviour @ Check Stance()|enemydistance < 800 && bot NOT proned


***new record(time:829.216309)(map:obj_thanatos)***
([MB]Charles O'Neil)FireWeapon() -> going to change current weapon


***new record(time:829.216309)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:830.617676)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> changed to BACKUP weapon


***new record(time:830.634583)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:830.818298)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> WEAPON is READY now!


***new record(time:832.219421)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil SET DONTGOPRONE behaviour @ Check Stance()|enemydistance < 800 && bot NOT proned


***new record(time:833.003662)(map:obj_thanatos)***
[MB]Charles O'Neil called ForgetEnemy()


***new record(time:833.003662)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil REMOVED behaviour BOT DONTGOPRONE @ BotThink() -> clearing section


***new record(time:833.020386)(map:obj_thanatos)***
([MB]Charles O'Neil)SetDontCheckStuck() called @ bot think() -> facing pItem or AimWpt


***new record(time:833.303894)(map:obj_thanatos)***
([MB]Charles O'Neil)Select MainWeapon() called @ DontSeeEnemy Actions() -> time to switch back to MAIN WEAPON


***new record(time:833.303894)(map:obj_thanatos)***
([MB]Charles O'Neil)is trying to switch back to MAIN weapon


***new record(time:833.303894)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:833.804382)(map:obj_thanatos)***
(bot_client.cpp) [MB]Charles O'Neil is being healed by a teammate!


***new record(time:833.804382)(map:obj_thanatos)***
(bot_client.cpp) [MB]Charles O'Neil invalidated weapon change, because of being healed by a teammate!
pause time needed to finish the treatment will end at 838.347


***new record(time:833.837830)(map:obj_thanatos)***
([MB]Charles O'Neil)SetDontCheckStuck() called @ bot think() -> pause time


***new record(time:833.837830)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil Called SetStance() @ BotThink()|PauseTime -> GOTO crouch


***new record(time:836.790527)(map:obj_thanatos)***
([MB]Charles O'Neil)SetDontCheckStuck() called @ bot think() -> pause time


***new record(time:838.358887)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil Called SetStance() @ WaitHere()|Bot in crouch but NOT at crouch wpt -> GOTO standing


***new record(time:838.358887)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:838.358887)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> weapon change has been invalidated -> resetting the action!


***new record(time:838.358887)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil - CheckAmmoReserves() called @ BotThink() -> is task AND is time for it)


***new record(time:838.358887)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> ammunition was checked ...


***new record(time:838.358887)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> need ammo flag has been set


***new record(time:838.375427)(map:obj_thanatos)***
([MB]Charles O'Neil)bot_combat.cpp|DontSeeEnemy Actions() -> bandaging ALLOWED again


***new record(time:838.375427)(map:obj_thanatos)***
([MB]Charles O'Neil)SetDontCheckStuck() called @ bot think() -> facing pItem or AimWpt


***new record(time:838.392151)(map:obj_thanatos)***
([MB]Charles O'Neil)Reload Weapon() called @ weapon is empty while waiting at wait-timed waypoint>


***new record(time:838.392151)(map:obj_thanatos)***
[MB]Charles O'Neil SET DONTGOPRONE behaviour @ Reload Weapon()


***new record(time:838.392151)(map:obj_thanatos)***
([MB]Charles O'Neil)SetDontCheckStuck() called @ bot think() -> reloading weapon


***new record(time:838.392151)(map:obj_thanatos)***
[MB]Charles O'Neil's weapon reloading will be finished at 842.392


***new record(time:838.392151)(map:obj_thanatos)***
([MB]Charles O'Neil)(botthink()|in reload) -> reload button pressed


***new record(time:838.859253)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil Called SetStance() @ BotThink()|In_Reload -> GOTO crouch


***new record(time:842.396606)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil Called SetStance() @ WaitHere()|Bot in crouch but NOT at crouch wpt -> GOTO standing


***new record(time:842.396606)(map:obj_thanatos)***
([MB]Charles O'Neil)(botthink()|in reload) weapon fully loaded -> WEAPON is READY


***new record(time:842.396606)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil REMOVED behaviour BOT DONTGOPRONE @ BotThink() -> clearing section


***new record(time:842.412720)(map:obj_thanatos)***
([MB]Charles O'Neil)SetDontCheckStuck() called @ bot think() -> facing pItem or AimWpt


***new record(time:842.429565)(map:obj_thanatos)***
([MB]Charles O'Neil)is trying to switch to the KNIFE


***new record(time:842.429565)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:843.630615)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> changed to KNIFE


***new record(time:843.647339)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:843.830750)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> WEAPON is READY now!


***new record(time:843.847595)(map:obj_thanatos)***
([MB]Charles O'Neil)Select MainWeapon() called @ DontSeeEnemy Actions() -> time to switch back to MAIN WEAPON


***new record(time:843.847595)(map:obj_thanatos)***
([MB]Charles O'Neil)is trying to switch back to MAIN weapon


***new record(time:843.847595)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:845.549255)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> changed to MAIN weapon


***new record(time:845.566223)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:845.749512)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> WEAPON is READY now!


***new record(time:846.550293)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil - CheckAmmoReserves() called @ BotThink() -> is task AND is time for it)


***new record(time:846.550293)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> ammunition was checked ...


***new record(time:846.550293)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> need ammo flag has been set

What happened there is that when the weapon switching was interrupted it was flagged as invalid. Bot paused himself for the medical treatment. Then he did reset the variables and the weapon switch action was canceled. It doesn't matter whether FA mod finished that action or not. As you probably know FA mod has sometimes issues with weapon selection. Medical treatment or going prone sometimes break it. Therefore bot simply canceled his previous decision. After a while the first code that caught recent events was 'weapon reload routine'. So the bot let the weapon reload. Again it doesn't matter whether it was the original weapon or the weapon the bot wanted to use. Once that action finished the bot simply switched to a knife, because that one is always present. Finally standard code figured that the bot has better weapon than a knife and allowed him to select the best available weapon ... which is of course the main weapon ... ssg3000 in this case. Previously if there wasn't the invalidation action and the safety switching to a knife then there used to be cases where the bot was stuck in the middle of weapon switching and was unable to act.

Next log is a test of ignoring waypoint actions under certain circumstances. This time it's a moment when the bot runs out of ammo for his main weapon. He must ignore waypoints with wait time. You know he can't effectively kill enemies from a sniper position if he has no ammo for a sniper rifle. The test is done under the same condition as previous example i.e. a sniper bot holding a building against 3 or 4 enemies. Basically I let the game continue after the first test until a moment when the sniper bot reached low level of ammunition.


***new record(time:1060.713989)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil - CheckAmmoReserves() called @ BotThink() -> is task AND is time for it)


***new record(time:1060.713989)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> ammunition was checked ...


***new record(time:1060.713989)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> need ammo flag has been set


***new record(time:1060.747314)(map:obj_thanatos)***
([MB]Charles O'Neil)SetDontCheckStuck() called @ bot think() -> facing pItem or AimWpt


***new record(time:1060.780884)(map:obj_thanatos)***
([MB]Charles O'Neil)***FindEnemy() -> Got NEW ENEMY!!!


***new record(time:1064.651367)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil SET DONTGOPRONE behaviour @ Check Stance()|enemydistance < 800 && bot NOT proned


***new record(time:1065.068726)(map:obj_thanatos)***
([MB]Charles O'Neil)Decide NextWeapon() called @ ShootAtEnemy() -> FireWeapon() returned NO AMMO


***new record(time:1065.085449)(map:obj_thanatos)***
([MB]Charles O'Neil)FireWeapon() -> going to change current weapon


***new record(time:1065.085449)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:1066.486450)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> changed to BACKUP weapon


***new record(time:1066.503540)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:1066.686646)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> WEAPON is READY now!


***new record(time:1066.720703)(map:obj_thanatos)***
[MB]Charles O'Neil called ForgetEnemy()


***new record(time:1066.720703)(map:obj_thanatos)***
Ran OUT OF AMMO for main weapon! Breaking the wait at my current waypoint (index=183)!


***new record(time:1066.720703)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil breaking the wait at wait-timed wpt -> ran OUT OF AMMO for main weapon!


***new record(time:1066.720703)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil REMOVED behaviour BOT DONTGOPRONE @ BotThink() -> clearing section


***new record(time:1066.737061)(map:obj_thanatos)***
([MB]Charles O'Neil)SetDontCheckStuck() called @ bot think() -> facing pItem or AimWpt


***new record(time:1066.753662)(map:obj_thanatos)***
([MB]Charles O'Neil)***Now moving again (dontmove cleared)


***new record(time:1067.203857)(map:obj_thanatos)***
([MB]Charles O'Neil)bot_combat.cpp|DontSeeEnemy Actions() -> bandaging ALLOWED again


***new record(time:1067.670898)(map:obj_thanatos)***
([MB]Charles O'Neil)***Start bandage treatment


***new record(time:1067.687988)(map:obj_thanatos)***
([MB]Charles O'Neil)SetDontCheckStuck() called @ bot think() -> bandage time


***new record(time:1067.687988)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil Called SetStance() @ BotThink()|BandageTime -> GOTO crouch


***new record(time:1068.022217)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil - CheckAmmoReserves() called @ BotThink() -> is task AND is time for it)


***new record(time:1068.022217)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> ammunition was checked ...


***new record(time:1068.022217)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> need ammo flag has been set


***new record(time:1072.175537)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil Called SetStance() @ bot_navigate.cpp|HeadTowardWpt() -> GOTO standing because NOT at crouch wpt


***new record(time:1085.855713)(map:obj_thanatos)***
([MB]Charles O'Neil)ResetAims() called @ HeadTowardWpt() -> Reached wpt with WAIT TIME


***new record(time:1085.855713)(map:obj_thanatos)***
([MB]Charles O'Neil)*** aiming marks were cleared (curr wpt index 199)


***new record(time:1085.872314)(map:obj_thanatos)***
Ran OUT OF AMMO for main weapon! Breaking the wait at my current waypoint (index=199)!


***new record(time:1085.872314)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil breaking the wait at wait-timed wpt -> ran OUT OF AMMO for main weapon!


***new record(time:1085.872314)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil - CheckAmmoReserves() called @ BotThink() -> is task AND is time for it)


***new record(time:1085.872314)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> ammunition was checked ...


***new record(time:1085.872314)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> need ammo flag has been set


***new record(time:1085.889282)(map:obj_thanatos)***
([MB]Charles O'Neil)***Now moving again (dontmove cleared)


***new record(time:1086.806519)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil - CheckAmmoReserves() called @ HeadTowardWpt() -> current wpt is AMMOBOX)


***new record(time:1086.806519)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> ammunition was checked ...


***new record(time:1086.806519)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> need ammo flag has been set


***new record(time:1086.823242)(map:obj_thanatos)***
([MB]Charles O'Neil)SetDontCheckStuck() called @ bot think() -> wpt action time


***new record(time:1086.823242)(map:obj_thanatos)***
([MB]Charles O'Neil)Bot has no item yet. Going to check for it now...


***new record(time:1086.823242)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil - UTIL_CheckForUsables() called


***new record(time:1086.823242)(map:obj_thanatos)***
([MB]Charles O'Neil)Found ammobox


***new record(time:1086.823242)(map:obj_thanatos)***
([MB]Charles O'Neil)ResetAims() called @ BotThink() -> WptActionTime


***new record(time:1086.823242)(map:obj_thanatos)***
([MB]Charles O'Neil)*** aiming marks were cleared (curr wpt index 934)


***new record(time:1086.840088)(map:obj_thanatos)***
([MB]Charles O'Neil)SetDontCheckStuck() called @ bot think() -> facing pItem or AimWpt


***new record(time:1086.890381)(map:obj_thanatos)***
([MB]Charles O'Neil)SetDontCheckStuck() called @ bot think() -> wpt action time


***new record(time:1097.517456)(map:obj_thanatos)***
([MB]Charles O'Neil)***Use waypoint action time over - (actions cleared)


***new record(time:1097.517456)(map:obj_thanatos)***
([MB]Charles O'Neil)BotThink()|ClearingSection -> (curr wpt #199) Task WptAction RESET (wpt action Time is OVER)


***new record(time:1098.034546)(map:obj_thanatos)***
([MB]Charles O'Neil)ResetAims() called @ HeadTowardWpt() -> Reached wpt with WAIT TIME


***new record(time:1098.034546)(map:obj_thanatos)***
([MB]Charles O'Neil)*** aiming marks were cleared (curr wpt index 199)


***new record(time:1098.051514)(map:obj_thanatos)***
Ran OUT OF AMMO for main weapon! Breaking the wait at my current waypoint (index=199)!


***new record(time:1098.051514)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil breaking the wait at wait-timed wpt -> ran OUT OF AMMO for main weapon!


***new record(time:1098.051514)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil - CheckAmmoReserves() called @ BotThink() -> is task AND is time for it)


***new record(time:1098.051514)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> ammunition was checked ...


***new record(time:1098.051514)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> main weapon is usable again


***new record(time:1098.051514)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> need ammo flag has been set


***new record(time:1098.067993)(map:obj_thanatos)***
([MB]Charles O'Neil)Select MainWeapon() called @ DontSeeEnemy Actions() -> time to switch back to MAIN WEAPON


***new record(time:1098.067993)(map:obj_thanatos)***
([MB]Charles O'Neil)is trying to switch back to MAIN weapon


***new record(time:1098.067993)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:1098.067993)(map:obj_thanatos)***
([MB]Charles O'Neil)***Now moving again (dontmove cleared)


***new record(time:1098.084473)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:1099.769897)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> changed to MAIN weapon


***new record(time:1099.786255)(map:obj_thanatos)***
([MB]Charles O'Neil)bot think() -> weaponaction == takeother or inchange


***new record(time:1099.987305)(map:obj_thanatos)***
([MB]Charles O'Neil)ChangeWeapon() -> WEAPON is READY now!


***new record(time:1100.003296)(map:obj_thanatos)***
([MB]Charles O'Neil)Reload Weapon() called @ NO enemy>


***new record(time:1100.003296)(map:obj_thanatos)***
[MB]Charles O'Neil SET DONTGOPRONE behaviour @ Reload Weapon()


***new record(time:1100.003296)(map:obj_thanatos)***
([MB]Charles O'Neil)Going to reload current weapon


***new record(time:1100.003296)(map:obj_thanatos)***
([MB]Charles O'Neil)SetDontCheckStuck() called @ bot think() -> reloading weapon


***new record(time:1100.003296)(map:obj_thanatos)***
[MB]Charles O'Neil's weapon reloading will be finished at 1104.003


***new record(time:1100.003296)(map:obj_thanatos)***
([MB]Charles O'Neil)(botthink()|in reload) -> reload button pressed


***new record(time:1100.003296)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil Called SetStance() @ BotThink()|In_Reload -> GOTO crouch


***new record(time:1104.006958)(map:obj_thanatos)***
([MB]Charles O'Neil)Checking ammunition after weapon reload


***new record(time:1104.006958)(map:obj_thanatos)***
([MB]Charles O'Neil)(botthink()|in reload) weapon fully loaded -> WEAPON is READY


***new record(time:1104.006958)(map:obj_thanatos)***
([MB]Charles O'Neil)[MB]Charles O'Neil - CheckAmmoReserves() called @ BotThink() -> is task AND is time for it)


***new record(time:1104.006958)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> ammunition was checked ...


***new record(time:1104.006958)(map:obj_thanatos)***
([MB]Charles O'Neil)CheckAmmoReserves() -> need ammo flag has been removed

The 'check ammo reserves' routine, which gets called periodically unless the bot is in combat, already says 'go get some ammo' right at the beginning of the log. But the bot is tasked to wait at his current waypoint and hold that position. It's a window in the basement of one of the houses on obj_thanatos. Then he sees new enemy and starts a firefight. Soon after he's completely out of ammo for the ssg3000. He's forced to switch to backup weapon. Meanwhile the enemy is lost ... enemy is out of sight. Bot correctly reacts and stops holding this position, because he has no ammo for main weapon. He detects bleeding so he must apply bandages first. Then he can finally move on. He reached next sniper position upstairs. He again correctly ignores it due to inability to shoot at enemies from empty gun. Right next to that sniper position is finally the ammobox. He spends quite a while refilling the ammo. His next waypoint is the previously visited window upstairs right next to the ammobox. However he didn't have time to reload his weapon yet. Thus he's ignoring it yet again. Right after that decision 'check ammo reserves' routine tells him he has enough ammo for main gun and marks it usable again. Bot switches to main weapon and reloads it. Then continues in patrolling the house so he moves towards the sniper position in the basement. The 'check ammo reserves' routine that was forced after bot reloaded his gun finally says 'you have enough ammo'. I'm only going to add that I don't force the bot to reload the weapon right by the ammobox, because if there were more bots there then they would get stuck there pretty often. This way they leave the ammobox as fast as possible and things work fairly well in my opinion. Same logic is used even when it comes to the sniper spot decision. If the bot isn't ready to start a firefight right away ... he would have had to prepare (select & reload) his gun first ... it's better to leave that position for other bot.

As always I can't promise a release date, because I have no idea how long will the testing take. It's a slow process. And if I find some bugs it will take even more time to finish it. Next task is to update the documents that come with each release and there's also the waypointing guide. Which still needs some work to bring it closer to a useful manual that will answer most questions and allow people create decent waypoints for their favourite custom maps that are available for firearms mod. Well have fun if it's possible in these days and stay safe.

22 February 2019

Again it took me a few years to put together new version of Marine Bot for those of you who still play Firearms. Let's see what is new.
Marine Bot 0.93b change log:

Yet another bug fixing release. This is the way how it is now. It really is just a hobby that I can't dedicate much time in anymore. The download link can be found in the files section.

I've also done some digging in my backups and I found two interesting things. Both are Marine Bot ports to different Half-Life 1 mods. First one might be quite known. It's a port for The Battle Grounds 1.2.1 mod. Second one's just a test version of Marine Bot port for the Global Warfare 1.5 mod. Both are based on Marine Bot 0.9b so many new features aren't available there. Yet the bots can play those mods to a degree. If there's anyone who still have either of the two and want to have some fun in it feel free to try it. But it really is on your own risk. I'm not able to give any support there. Both are available for download at the files section.

Finally I've also done some work on the waypointing guide. Basically I rewrote most of it. I've also added missing things like the triggers, the way how you can work with paths, and full command list. There's a lot of pictures there now. Hopefully it will make things clear. Anyways you can check it in the support section. And I've added direct link to this manual to the links section as well.

8 March 2013

Today is a good time for a little teaser update. Nah really. Here's a little something for those who still play Firearms ...
Marine Bot 0.92b change log:

As you can see there was a lot of fixing done. Not many new features added. Please do not take this as a new start. It's just that I had some free time especially over the Christmas time and I dedicated it to this project. I mean I've been playing with the code on and off since the end of November to the end of February. The list of changes is in exact order of how things happened during that period of time.
The release date is unclear as of now. The winter time is almost over and I'll be returning to my real life tasks. I'm in process of getting my own house. I'm building it on my own so that takes basically all my time. Anyways I already compiled the release .dll and let it ran for over 8 hours. No crashes or other bad events. So that's the positive part. However the Linux .so will be problem again, because I don't have Linux installed and I never really did well in this operating system. Finally the documents aren't updated yet either. Wish me luck and stay tuned! Marine Bot 0.92b will be released sooner or later. Let's hope it'll be sooner rather than later.

4 March 2013

The whole site launched. You can download the last Marine Bot beta release in 'FILES' section of the left hand menu. Many Thanks to Drek for digging the Linux and the source code packages from his backups, because I didn't have those files on my HDD nor in any of my poorly managed backups. You may find some additional files and support in the other sections too. Hopefully there isn't many errors and/or misleading info there. I'll try to add more stuff whenever I have a free while. But for now have fun and thanks for using Marine Bot!

by Frank McNeil 2005-2020


end of file