Skip to content
poslog edited this page Jun 13, 2025 · 8 revisions

FIN実装に伴い動きが悪くなったので修正中のメモ

game.pyのPlayer.put_instance_id_in_zone()のcurrent_zone.transfer_card_to(card, zone)行でエラーが出るようになった。
これは、current_zoneがset.pyで定義されているPoolインスタンスではなく、ただのdictであるために発生する。
current_zoneはself.get_location_of_instance(instance_id, messages_zones)で取得しており、
instance_idに一致するcardがself.all_zoneに見つからなければ、messages_zoneリストの各dictのobjectInstanceIdsリストから一致するIDを探す。
見つかった場合、IDが見つかったdictをそのままcurrent_zoneとして返す。
この場合、当然current_zoneは単なるdictなので、前述のエラーが発生する。
むしろ何で今まで動いてたんですかね?

仮説①: 新しくzoneが追加されたことで、今までは参照されていなかったmessages_zonesが参照されるようになった

既存のzoneは以下。

  • Private Zone
    • ZoneType_Library
    • ZoneType_Hand
    • ZoneType_Graveyard
  • Shared Zone
    • ZoneType_Stack
    • ZoneType_Battlefield
    • ZoneType_Exile
    • ZoneType_Limbo

ZoneType_Limboは、ゲーム中のオブジェクトが最後に行きつく領域。
例えば戦場のクリーチャーをブリンクさせた場合、ブリンク後のクリーチャーは別のオブジェクトとなる。
ブリンク前のクリーチャーというオブジェクトは戦場にも追放領域にも無いが、最後の情報を参照するためにどこかに情報が残っている必要がある。
そのためのZoneがZoneType_Limbo。ルール上は存在しない、mtgatrackerのための概念。

というわけでログチェック。

  • ZoneType_Command
  • ZoneType_Pending
  • ZoneType_Revealed
  • ZoneType_Sideboard
  • ZoneType_Suppressed

んんんんんんんんん
ZoneType_PendingとZoneType_Suppressedって何よ?????? PrivateかSharedかの区分けもせんと...

zoneを増やしたよ

別のエラーが発生するようになった。
message_zonesにはobjectInstanceIdsリストしかないのにCard型を返そうとしているのだから、それはそう。
util.pyで定義されているid_to_card()を使えばCard型を返せないか?

WebSocketで送信するメッセージ作成の流れ

  • parsers.build_event_texts_from_iid_or_grpid(iid, game, grpid=None)
    • parsers.build_card_event_texts(card, game)
      • parsers.build_event_text(text, event_type, hover_text=None)

parsers.build_event_texts_from_iid_or_grpidを呼び出す関数は以下。

  • parsers.parse_mulligan_req_message(message, timestamp=None)
  • parsers.parse_game_state_message(message, timestamp=None)

バージョン管理

  • 1.0.0
    • 新規作成
  • 1.0.1
    • requestsのインポートをやめたりとか色々
  • 1.1.0
    • MTGA.exe起動確認テキスト修正とか色々
  • 1.2.0
    • ゆかりねっとコネクター Neo対応

Clone this wiki locally