30歩動いたら30%でエンカウントというのが、
30歩毎に30%の判定がされてエンカウントしないなら次の30歩までしないのか
それとも大体30歩で30%になるくらいに一歩ごとにエンカウント確率が増えるのかによって大分違う
上の方法はランダム性強すぎて正直オススメしない

歩いたかどうかの判定は並列処理で
現在値のXY座標取得→1フレーム前の座標と違うか判定→1フレームウェイト
をループして座標違うときだけ変数+1すればいい
プレイヤー接触イベントを拡張してもまあいいけど

30%の判定は変数=0〜99にして結果が30未満のときで条件分岐すればいい

あとは戦闘が並列で呼び出されるとまずいから戦闘発生のコモンは予約実行で呼び出すことくらい