WoT のクライアントはその大部分が Python で書かれていて、 フロントエンドとなる swf のコンポーネントを制御する形になっています。 それらのコントローラは Python のインスタンスとして提供されますが、 ここではガレージを例にとってコントローラ取得の手順を紹介します。

(この文書は WoT 0.9.19.0.2 での実装に基づいています)

APP_NAME_SPACE

WoT アプリケーションの名前空間が scripts/client/gui/app_loader/settings.py に定義されています。

定義されているのは scaleform/lobbyscaleform/battle の2つで、 それぞれロビーと戦闘時に対応します。 これらは APP_NAME_SPACE.SF_LOBBY, APP_NAME_SPACE.SF_BATLE として参照できます。

ログインした後のクライアントの状態は、 ロビーと戦闘という、2つの状態を切り替えながら動作することになります。

ロビーのコントローラの取得

g_appLoader のメソッド getApp を使ってロビーのコントローラを取得することができます。

g_appLoader はクラス _AppLoader のシングルトンで scripts/client/gui/app_loader/loader.py で定義されています。

from gui.app_loader import g_appLoader

lobby = g_appLoader.getApp()

ここで得られるロビーのコントローラは クラス gui.Scaleform.lobby_entry.LobbyEntry のインスタンスです。

ロビーの画面構成とコントローラ

ロビーの画面は大きく3つの部分に別れており、 上部のメニュー欄 (lobbyHeader)、下部のチャットや通知などのボタン欄 (messengerBar)、 そして中央表示欄となります。 中央の表示欄はガレージを表示しているときであれば hangar が対応します。

ロビー画面構成

それぞれ以下のように取得できます。lobby は先程取得したものを参照します。

from gui.Scaleform.framework import ViewTypes
from gui.Scaleform.daapi.settings.views import VIEW_ALIAS

lobbyView = lobby.containerManager.getView(ViewTypes.VIEW)
lobbyHeader = lobbyView.components[VIEW_ALIAS.LOBBY_HEADER]
messengerBar = lobbyView.components[VIEW_ALIAS.MESSENGER_BAR]

lobbyView は クラス gui.Scaleform.daapi.view.lobby.LobbyView.LobbyView のインスタンス、 lobbyHeader は クラス gui.Scaleform.daapi.view.lobby.header.LobbyHeader.LobbyHeader のインスタンス、 messengerBar は クラス gui.Scaleform.daapi.view.lobby.messengerBar.messenger_bar.MessengerBar のインスタンスです。

中央の表示欄は、現在表示しているものが取得できます。 ガレージを表示しているときはガレージのコントローラが取得できます。

# ガレージを表示している場合
hangar = lobby.containerManager.getView(ViewTypes.LOBBY_SUB)

hangar は クラス gui.Scaleform.daapi.view.lobby.hangar.Hangar.Hangar のインスタンスです。

# ショップを表示している場合
storeView = lobby.containerManager.getView(ViewTypes.LOBBY_SUB)

storeView は クラス gui.Scaleform.daapi.view.lobby.store.StoreView.StoreView のインスタンスです。

ガレージのコントローラ

ガレージ (hangar) には幾つかの部品が含まれています。

それらは hangar のプロパティ components に辞書として格納されています。

hangar.components.keys()  # ['tmenXpPanel', 'header', 'tankCarousel', 'crew', 'questsControl', 'switchModePanel', 'params', 'ammunitionPanel', 'researchPanel']

たとえば、車輌選択メニュー (carousel) であれば、以下のように取得できます。

from gui.Scaleform.genConsts.HANGAR_ALIASES import HANGAR_ALIASES

tankCarousel = hangar.components[HANGAR_ALIAS.TANK_CAROUSEL]

tankCarousel は クラス gui.Scaleform.daapi.view.lobby.hangar.carousels.basic.tank_carousel.TankCarousel のインスタンスです。

コントローラの操作

ここで示したコントローラの多くは swf と関連付けられており、 プロパティ flashObject を通じて操作が可能です。 flashObject にはプロパティ visible があり、 表示のON/OFFが可能ですが、コントローラによっては ON→OFF→ON にした後、元の状態に戻らない場合がありました。

tankCarousel.flashObject.visible = False # 初期状態は True。False を代入で表示されなくなる
tankCarousel.flashObject.visible = True  # True に戻すと表示されるが、車輌を選択しても反映されない

表示については他にもプロパティ alpha があり、 この値を 0 にすると完全透過になって表示されなくなります。 ただし UI 自体は操作可能です。 このプロパティも操作すると UI が動作しなくなるケースがありました。

tankCarousel.flashObject.alpha = 0.0 # 初期状態は 1.0。 0 を代入で見えなくなるが UI 操作は可能
tankCarousel.flashObject.alpha = 1.0 # 1.0 にすると通常の表示。副作用はなさそう

以下は hangar.flashObject.alpha = 0.0 に設定した状態です。

ロビーUI透明化