タイトルに限らず、戦闘結果系のログを記録したい場合、

 

BattleManager::battle_end

 

 だと、敵情報を格納した$game_troopがnilなので、その手前の

 

BattleManager::process_victory

 

 で、集計を行う。

 倒した敵の数をカウントしたい場合は、こんな感じで、

 

    $game_troop.members.each do |value|
      if $killboard.has_key?(value.enemy_id) 
         $killboard[value.enemy_id] += 1
      else
         $killboard[value.enemy_id] = 1
      end
    end

 

 $killboardは別の場所で宣言されている前提です。

 

 enemy_idが敵を表すID。

 $game_troopが敵の集団を表すクラスですね。

 


 2016年7月23日の.NETラボ勉強会のスライドを公開します。

 今回はWindows Mobile回ということで、UWPのXAMLについて調べて発表してみました。

 

 画面定義する仕組みとしてのXAMLはよく出来ているなぁと感じました。同時に色々出来るための複雑さもあります。

 デザイナーが触るという視点だとHTMLはよくバランスが取れているなぁと、セッションで話したのは上記のような感想からでした。

 

Uwpでみるxaml入門 from Makoto Nishimura

 


 RGSS3の組み込みクラスだけでは、できない処理がある。

 例えばマウスの座標を取得したいなど。

 

 その場合、dllを作成してRubyからそれを叩く必要がある。

 

dllの作成

 

 プロジェクトはC++の「Win32プロジェクト」。

 C#でdllを作成したいところだが、Rubyからマネージドなdllはコールできないので、C++を選択。

 

004

 

 特定のウィンドウのマウス座標の取得は少し面倒だが、今回の趣旨ではないので、割愛。需要があったら別途書きます。

 dllは以下のように2つのメソッドを持つものとします。

 

EXPORT int getMouseXpos();
EXPORT int getMouseYpos();

 

 ビルドで生成したdllをRPGツクール側のSystemフォルダ以下に配置します。

 

dllを呼び出す

 

 RGSS3側でdllの読み込みと、メソッドの呼び出しを記述します。dllはhoge.dllというファイル名とします。

 

#dll読み込み
xPosAPI = Win32API.new('System/hoge', 'getMouseXpos', nil, 'i')
yPosAPI = Win32API.new('System/hoge', 'getMouseYpos', nil, 'i')

#メソッド呼び出しのサンプル
while 1 do
    x = xPosAPI.call()
    y = yPosAPI.call()
    p "X = " + x.to_s + "/ Y = " + y.to_s
end

 

 サンプルはループを抜けずにずっとマウス座標を取り続けるので、実際に使う場合は用途に合わせて修正してください。

 


 タイトルの通り、RPGではよくある洞窟や街の壁を通り抜けるあれの実装方法について。

 RPG Maker VX Aceのマップは実質2層なので、キャラクターの上に壁を配置して、その下を抜けるということができない。

 というわけで、一工夫を考えてみた。

 

イベントでプレイヤーの座標を移動させる

 

 イベントでプレイヤーの座標を移動させる方法。

002

 壁の手前から「場所移動」イベントで、壁の向うに移動させる。

 ちょっと、よくあるRPGとは違う動きになるが、楽なのはこの方法。

 

透明なハシゴを移動させる方法

 

 マップタイルを工夫して、通りぬけ可能な壁を追加する方法を考えたが、これだと、壁の種類ごとに通り抜けれる壁を用意しないといけないので、壁の上に配置できるハシゴの仕様で透明なタイルを用意することを考えた。

 下画像のタイル右下にある透明なタイルの一つに梯子属性をつけた。ちょうどダウンロード購入したマップセットに透明な空きタイルがあったので、利用したが、そうでない場合はタイルセットをカスタマイズして、透明なタイルを用意しなければいけない。デフォルトのタイルにも透明なタイルがあるが、それは使い道があるので、残して置いたほうが良い。

 これを壁の上に接地すれば、その位置は通過できる。ただし、キャラクターは壁の上を移動するので、通過時にキャラクターを透明にして、壁から抜けたときに透明を解除する必要がある。

003

 

 注意:壁を通る際、通過可能にした部分の上下左右の壁に移動できることがあるので、意図しない位置に移動できてします場合は、逆に通行不能な透明なタイルを重ねると良い。

 


クラスの継承関係

 

 RPG Maker VX Aceのアイテムは親クラスが、RPG::BaseItemクラスです。

 RPG::BaseItemは、広義のアイテムでスキル(RPG::Skill)や、職業(RPG::Class)、キャラクターを表すRPG::ActorなどもRPG:BaseItemを継承しています。

 

 そこから更に派生して、使用することができるアイテムはRPG::UsableItemを持ちます。これはポーションなどの利用できるアイテムに加えて、スキルも含まれます。

 もう一つ装備可能なアイテムとしてRPG::EquipItemを親とするものもあります。

 

 今回、アイテムとして調べるクラスは、メニューの「アイテム」から表示することができる以下の3つとします。

 

RPG::Item

RPG::Weapon

RPG::Armor

 

 メニューのアイテムにはもう一つ「大事なもの」がありますが、これはItemクラスのitype_idが2のものを「大事なもの」として分類するので、クラスとしては3つです。

001

 

アイテムのデータベース

 

 ゲームに登録されているアイテム(データベースに登録されているもの)は、以下のグローバル変数でアクセスできます。

 

$data_items         = load_data("Data/Items.rvdata2")
$data_weapons       = load_data("Data/Weapons.rvdata2")
$data_armors        = load_data("Data/Armors.rvdata2")

 

 $data_itemsはRPG::Itemsクラスの配列で、0番めはnilです。

 

アイテムの判別

 

 それぞれのアイテムにアイテムか武器か、それとも防具かを判定するIDのようなものが欲しかったのですが、実際のコードを見ると以下のように判定していました。

 

Window_ItemList::include?

 

    case @category
    when :item
      item.is_a?(RPG::Item) && !item.key_item?
    when :weapon
      item.is_a?(RPG::Weapon)
    when :armor
      item.is_a?(RPG::Armor)
    when :key_item
      item.is_a?(RPG::Item) && item.key_item?
    else
      false
    end

 

 クラスを見てチェックしているんですね。

 データベースを拡張する際にメモ欄にCSVで拡張情報持たす場合にちょっと工夫が必要になりそう。

 

プレイヤーの所持アイテムは?

 

 上記、include?メソッドはプレイヤーの所持アイテムをループさせて、アイテムで表示するのか、武器で表示するのかという判定で利用しています。

 該当箇所は以下。

 

  def make_item_list
    @data = $game_party.all_items.select {|item| include?(item) }
    @data.push(nil) if include?(nil)
  end

 

 所持アイテムは「$game_party.all_items」で取得可能ということがわかります。

 

 ということで、アイテム周りのコードをざっと見てみました。

 RPGツクール VX Aceのアイテムの扱いがわかってきたのではないでしょうか?

 


 ゲームのデバッグをしていると、一つ一つクリックしてメッセージを進めるのが億劫になってきます・・・。

 ということで、楽をするためにメッセージをスキップする方法を調べてみました。

 

 SHIFTキー押しっぱなしで、メッセージをスキップする機能を想定します。

 処理自体はシンプルで、以下のメソッドを即座にreturnしてしまえばOK。

 

Window_Message::input_pause

  #--------------------------------------------------------------------------
  # ● 入力待ち処理
  #--------------------------------------------------------------------------
  def input_pause
    # SHIFTキーでメッセージスキップ
    if Input.press?(:SHIFT)
      return
    end
    
    self.pause = true
    wait(10)
    Fiber.yield until Input.trigger?(:B) || Input.trigger?(:C)
    Input.update
    self.pause = false
  end

 

 ちなみにInput.pressでキーが押されているかを判定します。

 Input.pressはキーコンフィグ機能などでも使えそうですね。

 

 実際にスキップ機能としてゲームに提供するには、もう少しカスタマイズが必要になりそうですが、修正ポイントの紹介ということで・・・。

 


 RPGツクール VX Aceのスクリプトを追いかけてみました。

 

 結論から書くと、上部メニューの「ツール」→「データベース」→「スキル」タブの「攻撃」の以下に定義があることを知っているとすぐにわかる。

001

 

 a.atk * 4 – b.def * 2

 

 というのが、ダメージ計算の式。

 攻撃者の攻撃力の4倍から被攻撃者の防御力の2倍というのが基本計算式。

 そこから、クリティカルとか防御中とかの計算が続く。

 ソースコードは以下(コメントは解説用に追加したもの)、

 

Game_Battler::make_damage_value

 

# user = 攻撃者
# item = スキル(通常攻撃の場合はスキルの[001:攻撃])
def make_damage_value(user, item)
    # selfは攻撃された側を表すクラス

    # 基本計算
    value = item.damage.eval(user, self, $game_variables)

    value *= item_element_rate(user, item)              # 属性による補正
    value *= pdr if item.physical?                      # 物理ダメージ率による補正
    value *= mdr if item.magical?                       # 魔法ダメージ率による補正
    value *= rec if item.damage.recover?                # 回復率による補正
    value = apply_critical(value) if @result.critical   # クリティカルなら補正
    value = apply_variance(value, item.damage.variance) # 分散度による補正
    value = apply_guard(value)                          # ガード状態なら補正
    @result.make_damage(value.to_i, item)

 

 evalで評価して、先述のデータベースのスキルで指定した「計算式」で算出し、各種補正を重ねて行くという流れですね。

 

 ちなみに$game_variablesは、ゲームで設定できる「変数」が入る。

 計算式で利用したい場合はcではなくv[1](変数の一番目の意味)という書式で指定します。

 

 例えば、計算式でダメージから変数0001の値を引きたい場合は以下のように記述します(v[0]はnilなので注意)。

 

a.atk * 4 – b.def * 2 – v[1]

 

 カスタマイズするなら、計算式の部分をデータベースから修正するか、make_damage_valueメソッドに手をいれれば良さそう。

 


 牛タンを食べに・・・もとい、.NETラボ仙台開催に参加するために人生初の東北、仙台に行ってきました。

 

早速牛タン話

IMG_2437

 もとい・・・とか言いながら、早速牛タンの話ですが、仙台駅前にはたくさんの牛タン屋がありますが、お店によって味が異なるので、地元の方に聞くか、事前に評判を調べておくのがよいですね。

 上画像は勉強会の次の日に松島で食べた利久というお店、とても美味しかったです(関東にもあるようですが、やはり本場で食べると気分が違いますよね)。

 

勉強会前にグレープシティ社を見学

 

 当日の午前中に「仙台のIT会社といえば」ということで.NETコンポーネントで有名なグレープシティ社を見学させていただきました。

IMG_2423

IMG_2411

 

 オシャレな会社で、ピアノがあったり、大きな庭があったりと、仙台に住むことになったらぜひ働かせていただきたい職場環境でした。

IMG_2416

 休日にもかかわらず、会社を公開していただきましたグレープシティ様、案内をしてくださいました八巻様ありがとうございました。

 

勉強会ではLTをさせていただきました

 

 勉強会は会場でのセッションと、オンラインでのセッションがあり、充実した内容でした。

IMG_2431

スマフォで撮った画像なので、画質がいまいちですみません・・・

 

 私も「初心者目線でIoT」というタイトルでLTをさせていただきました。

 IoT普及に尽力されている先達の皆様、初心者の悲哀を暖かく受領くださいませ。

初心者目線でIo t from Makoto Nishimura