Rise of Nations という Microsoft から発売された名作 RTS ゲームがあります。
このゲームには Big Huge Script という、ゲーム内でシナリオやルールを作るための言語があり、
今回はこの Script で使える関数の中から、 set_object_health という関数の挙動について説明します。
set_object_health とは
ゲーム内の Script Editor では次のように表示されます。
指定した ID の object の HP を 0-100 % の範囲で指定することができます。
tl;dr
- 3 人 1 unit の場合、0-68% までは HP - math.floor(HP / 3)
挙動
この set_object_health は歩兵などの 3 人 1 unit の場合に不思議な挙動をします。
なお、ここでは Slingers を使用して確認しています。
どういうことかというと、単純に % 指定してそのとおりに動くとは限らないということです。
まず、ターゲットの HP を 0 に設定する場合を考えてみます。
set_object_health(who, id, 0);
これを騎兵に適用すると正常に行われます。
これは想定通りの挙動と言えます。
では、歩兵に適用してみます。
これは 3 人で 1 unit という扱いであるものの set_object_health は 1 人に対して適用される場合がある、ということの気がしています。
様々な数値で試してみると判るのですが、0-68% までは HP は 57 です。必ずしも指定する値と HP は一致しません。
なぜ 57 なのかは、1 人減っていることから
85 - (85 / 3) = 57
と考えられます。(より正確には 85.0 - math.floor(85.0 / 3.0))
さて、先程 1 人に対して適用される場合がありそうと書きましたが、では 80% など 69% 以上を設定する場合を見てみます。
set_object_health(who, id, 80);
この結果は以下のようになります。
すなわち、
85 * 0.8 = 68
で、1 人ではなく、1 unit に対して適用されていそうなことがわかります。
以上のように、歩兵などの unit に適用する場合は指定 % に対して HP が比例しないため、注意が必要です。
確認に使用した Script は以下にあります。