雑記

Omni-bot関連

下記の内容は全て Omni-bot 0.71 においてのものです。

Links

Omni-bot wiki http://www.omni-bot.com/wiki/index.php?title=Main_Page
ほとんどの情報はここから得ることができます。
この記事ではここで扱っていないTipsを主に載せていますが、
Waypointingについて等は翻訳するかもしれません。

Linux-AZ.com http://linux-az.com/forum/news.php
Waypointが幾らか公開されています。

Omni-bot Files

omni-bot/global_scripts/

テスト用スクリプト置き場?

  • makegm.gm
    Omni-botのマップスクリプトを自動生成するコマンド(/bot makegm)の正体。
  • server_manager.gm
    BOTの自動join辺りを司っている模様。BOTのオーバーフローはこれのせい?

omni-bot/et/user/

  • omni-bot.cfg
    omni-botのサーバ用設定ファイル。
    [Script] 項の Debug はfalseにしておくと無駄な出力をさせずに済みます(即ち負荷軽減)。
    [Downloader] 項は0.7から導入されたwaypointの自動DL機能についてです。
    DownloadMissingNav? をtrueにすると、omni-bot/et/user/download/ディレクトリ内に、まだ導入されていない
    waypointのzip(本家のWaypoint Filesにある分のみ?)を自動で落としてくるみたいです。
    • [ServerManager?]項以下の解説:
      MinBots? は常に配置するBOTの数。-1で無効。
      MaxBots? はBOTの最大配置数で、プレイヤーが入るとMinBots?の設定値までは自動で減っていく。-1で無効。
      BalanceTeams? はBOTのチーム移動で人数調整を行うか。 1=有効,0=無効
      CountSpectators?MaxBots?の実行時にSpectをプレイヤーとしてカウントするか。 1=有効,0=無効
      CurrentDifficulty? は0~6まで設定可能(大きいほどBOTが強くなる)。
      AdjustAim? は omni-bot/et/scripts/difficulty.gm 内の設定(CurrentDifficulty?に依存)でAim誤差を決定するか。1=有効,0=無効
      moveskill はレレレ撃ちの設定。0=無効,1=Easy,2=Medium,3=Hard,4=Random(1~3からランダムで選択)

omni-bot/et/nav/

  • et_official.zip
    基本6マップ用のWaypoint及びスクリプトが格納されている。
  • et_custom.zip
    こちらはカスタムマップ用。WinRARやLhazで中身を閲覧できます。

ここにないカスタムマップのWaypointは、Omni-bot公式及びLinux-AZ.comの Waypoint Filesや、
http://msks.servegame.com/etfiles/omnibot_WPs/ にもわずかながら置いてあります。
落としてきた way,gm ファイルはこのディレクトリに放り込むだけで構いません。

omni-bot/et/scripts/

  • et_autoexec.gm
    真先に読み込まれるスクリプト。
    Names["^4[BOT]^7NoAmmo"] = "botprofile.gm";
    は、maxbotsが有効のときに scripts/botprofile.gm がプロフィール(デフォルトはdef_bot.gm)の
    ^4[BOT]^7NoAmmo? が名前のBOTをjoinさせるもの。自動joinするBOTはNamesテーブルにこうして登録されているものからランダムで選択される。
  • def_bot.gm
    BOT別プロフィールを指定しなかった場合使用されるデフォルトのプロフィール。
    チーム(this.SelectTeam?)・クラス(this.SelectClass?)選択と
    リスポン時の武器選択(ClassPrimaryWeaponChoice?/ClassSecondaryWeaponChoice?)を行う。
    デフォルトでは、チームとクラスは特に指定しない(nullを返している)ので結局ランダムになる。

BOTの蘇生後に礼を言わせる

omni-bot/et/scripts/goals/goals.zip内のテスト用スクリプト goal_testevents.gm を改造します。

  • goals/goals.zip を解凍後、goal_testevents.gmをgoalsディレクトリに設置
  • スクリプトをテキストエディタ等で開き、
    this.RunTests = false;
    false を true に修正。
    	this.TestRevived = false;
    同様に true に修正。
    this.Events[EVENT.REVIVED] = function(whoDoneIt?) 関数を以下のように改造。
    {
    	if ( this.TestAll == true || this.TestRevived == true )
    	{
    		sleep(0.5);
    		this.Bot.SayVoice(VOICE.THANKS);
    	}
    };

リスポン直後の "… for everyone!" 発言を無効にする

  • scripts/goals/goals.zip を解凍後、goal_dispensehealth.gm goal_dispenseammo.gm をgoalsディレクトリに設置
  • goal_dispensehealth.gm をテキストエディタ等で開き、以下の文をコメントアウトします
    this.Bot.SayTeam("Health for everyone!");
  • goal_dispenseammo.gm をテキストエディタ等で開き、以下の文をコメントアウトします
    this.Bot.SayTeam("Ammo for everyone!");

空爆缶の使用を控えさせる

  • scripts/weapons/weapons.zip を解凍後、weapon_smoke_marker.gm をweaponsディレクトリに設置
  • weapon_smoke_marker.gm をテキストエディタ等で開き、
    this.PrimaryFire.SetDesirabilityRange(500, 2600, 0.45);
    0.45 を 0.0 に変更します。

server_manager.gm の修正

NQ 1.2.5 でのSpectBOT対策

def_bot.gm の修正

NQ 1.2.3 以前のバグに適応する

Waypointing用に使用している場合であれば、この作業を行ってはいけない。
次期バージョンの 1.2.5 では修正済みなので導入の際には元に戻しておく。

global ClassPrimaryWeaponChoice = function(bot, excludeweapons)
{
	myteam = bot.GetTeam();
	myclass = bot.GetClass();
	
	weaponChoice = 0;
	
	while(1)
	{
	 	if(GetModName() == "noquarter")
		{

if(GetModName?() == "noquarter")をコメントアウトして、
代わりに

	 	if(GetModName() == "etmain")

にする。NQのバグで、GetModName?()にetmainを返してしまう問題に対応。

Panzerの使用を自重させる

NQの場合、

				if ( myteam == TEAM.ALLIES )
				{
					wpns = 
					{
						WEAPON.BAR,
						WEAPON.VENOM,
						WEAPON.BAZOOKA,
						WEAPON.MOBILE_BROWNING,
						WEAPON.FLAMETHROWER,
					};
					weaponChoice = wpns[ RandInt( 0, 4 ) ];
				}
				else
				{
					wpns = 
					{
						WEAPON.STG44,
						WEAPON.VENOM,
						WEAPON.PANZERFAUST,
						WEAPON.MOBILE_MG42,
						WEAPON.FLAMETHROWER,
					};
					weaponChoice = wpns[ RandInt( 0, 4 ) ];
				}

WEAPON.BAZOOKA,WEAPON.PANZERFAUST, をコメントアウトして
wpns[ RandInt?( 0, 4 ) ]; を wpns[ RandInt?( 0, 3 ) ]; に修正。 (RandInt?(x,y)はx~yの間で乱数を生成する関数。テーブルから1つ値がなくなるのでyから1引く)

Jaymodなら、

		else if(GetModName() == "jaymod")
		{
			if ( myclass == CLASS.SOLDIER )
			{
				wpns = 
				{
					WEAPON.PANZERFAUST,
					WEAPON.MOBILE_MG42,
					WEAPON.FLAMETHROWER,
					WEAPON.MORTAR,
				};
				weaponChoice = wpns[ RandInt( 0, 3 ) ];
			}
		}

etpubなら

		else // etmain
		{
			if ( myclass == CLASS.SOLDIER )
			{
				wpns = 
				{
					WEAPON.PANZERFAUST,
					WEAPON.MOBILE_MG42,
					WEAPON.FLAMETHROWER,
					WEAPON.MORTAR,
				};
				weaponChoice = wpns[ RandInt( 0, 3 ) ];
			}
		}

を同様に修正する。

Cleanup

global saySkills = function()

関数から

team_chatmsg_func = function( WhoSaidIt, Message )

関数の終わりまでは必要ないのでまとめてコメントアウト。安定化を図る。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-10-31 (土) 18:56:08 (21d)