NPC をコーディングして領地経営するゲーム開発(Python 対応の仕様を確認する)
前回、1行ずつ Python スクリプトを実行できるのが確認できたので、それ以外の仕様とか必要な実装とかを確認します。
やりたいこと
タスクの確認
最終的には Python 対応するのが目的です。そこまでに必要そうな実装を列挙してみると、
- VSCode で Python の API が補完ができるかを確認する。
- ゲーム用の API をどうやって呼び出させるか決める。
- Python 用のドキュメントを追加する。
- Lua スクリプト前提のチュートリアルになっているのをどうするか決める。
- チュートリアル用の Python スクリプトを用意するのか、とか。
- Lua と Python のモードを切り替えるボタンを用意するのか、とかも。
- Python を実際に処理するあたりを実装する。
とかです。
書き出してみると、検討が不足しているのがわかります。
ここまでで、Python 用のドキュメント作業とゲーム中で Python を処理するための作業の大きく2つのタスクなのがわかります。
Python スクリプトが実行されるまでのルール
現状では、ゲーム側から edict.lua(布告)が実行されるというルールになっています。
例えば、edict.lua でキャラクターを作成して、そのキャラクタ制御を farmer.lua で行わせる場合の記述は以下になります。
return function()
local farmer = Character:new(edict)
farmer:setScript('farmer')
end
まず、farmer.lua と farmer.py があれば、farmer.py の方が上記のコードで起動される仕様にします。
また、この edict.lua 自体を edict.py で置き換えるなら下記のようなコードにしたいです。
farmer = Character(edict)
farmer.set_script('farmer')
edict を使うための処理や、Character クラスのインポートなどの前処理はプレイヤーに書かせずにこのファイルを読み込んで実行する際にどうにかしようと思っています。
NPC を制御する Python スクリプトについて
例えば、畑のタスクカードを実行するコードを Python で書いてみると、
cropField = world.buildings(Buildings.CropField)[0]
character.move(cropField)
character:work()
こんな感じになります。
そして、character.work() などのゲーム用の API 呼び出しにおいては、TCP/IP 通信経由で引数を JSON でエンコードしたものを渡して結果を受け取る仕組みにしようと思います。
TCP/IP より名前付きパイプの方がいいとか、JSON でなくて Google Protocol Buffer の方がいいとかは気にしないことにします。
ここまでが実装できれば、とりあえず Python スクリプトでゲームがプレイできるようになると思います。
まとめと今後の予定
Python 対応するために、どういう実装が必要になりそうかを検討して、どういうコードにするかも書き出して検討しました。よいです。
Python 対応の作業としては、ここまでの処理を試行錯誤しながら実装して動かしていこうと思います。がんばります。