CORDEA blog

Android application engineer

【RoN BHS】set_object_health の挙動

Rise of Nations という Microsoft から発売された名作 RTS ゲームがあります。

このゲームには Big Huge Script という、ゲーム内でシナリオやルールを作るための言語があり、
今回はこの Script で使える関数の中から、 set_object_health という関数の挙動について説明します。

set_object_health とは

ゲーム内の Script Editor では次のように表示されます。

f:id:CORDEA:20190518122404j:plain

指定した 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);

これを騎兵に適用すると正常に行われます。
これは想定通りの挙動と言えます。

では、歩兵に適用してみます。

f:id:CORDEA:20190518122433j:plain

これは 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 は以下にあります。

RoN_rules/Example at master · CORDEA/RoN_rules · GitHub