ゲーム作ってます4.5

投稿者:User icon mini taki 投稿日:2016/10/23 01:33

絶賛寄り道中
(試作1号完成)
#_/_/_/_/_/通常攻撃の場合のダメージ計算_/_/_/_/_/
def attack(a)
  case getVariable("プレイヤーかどうか")
  when 0
    ii=1
  when 1
    ii=0
  end
  h_old=getVariable("ステータス")[ii][a][1]
  getVariable("ステータス")[ii][a][1]=getVariable("ステータス")[ii][a][1]-floor(getVariable("行動キャラ")[2]*0.5)
  if getVariable("ステータス")[ii][a][1]<0
    getVariable("ステータス")[ii][a][1]=0
  end
  speak(getVariable("ステータス")[ii][a][0],"に",h_old-getVariable("ステータス")[ii][a][1],"のダメージ")
  if getVariable("ステータス")[ii][a][1]==0
    getVariable("ステータス")[ii][a][5]=1
    speak(getVariable("ステータス")[ii][a][0],"はたおれた")
  end
  return
end
#_/_/_/_/_/通常攻撃の場合のダメージ計算ここまで_/_/_/_/_/

#_/_/_/_/_/回復の関数_/_/_/_/_/
def heal(a)
  case getVariable("プレイヤーかどうか")
  when 0
    ii=0
  when 1
    ii=1
  end
  h_old=getVariable("ステータス")[ii][a][1]
  getVariable("ステータス")[ii][a][1]=getVariable("ステータス")[ii][a][1]+20
  if getVariable("ステータス")[ii][a][1]>getVariable("ステータス")[ii][a][2]
    getVariable("ステータス")[ii][a][1]=getVariable("ステータス")[ii][a][2]
  end
  speak(getVariable("ステータス")[ii][a][0],"は",getVariable("ステータス")[ii][a][1]-h_old,"回復した")
  return
end
#_/_/_/_/_/回復の関数ここまで_/_/_/_/_/

#_/_/_/_/_/RPGの戦闘を行う自作関数_/_/_/_/_/
#  1ターンに1回ずつ各キャラに順番が回ってくるタイプの
#  戦闘になっているはず
def battle()
#=====パーティや敵キャラのデータをコピーする配列の準備======
#    敵キャラなどデータを事前に作っておいて配列変数に読み込んで使用する
#    今回はサボってますが
setVariable("ステータス",createArray())
i=0
while i<2
  getVariable("ステータス")[i]=createArray()
  j=0
  while j<2 
    getVariable("ステータス")[i][j]=createArray()
    j=j+1
  end
  i=i+1
end
#=====配列の準備をする部分ここまで======

#=====配列にデータを入れていく部分======
#   ちなみに配列の中身はこんな感じ
#   a[A][B][C]
#   A. 味方パーティか敵かを判断する部分
#       0→味方、1→敵 今回はこのように決めた
#   B. パーティ内の誰かを表すための数字
#       とりあえず今回は0→プレイヤーキャラ、1→助っ人
#   C. キャラのステータスと状態を表す数字
#       0:名前
#       1:HP
#       2:HPの最大値
#       3:攻撃力
#       4:素早さ
#       5:行動可能かどうか
getVariable("ステータス")[0][0][0]=getValueFromCharacterParam(getPlayerParam(), 2)
getVariable("ステータス")[0][0][1]=getValueFromCharacterParam(getPlayerParam(), 6)
getVariable("ステータス")[0][0][2]=getValueFromCharacterParam(getPlayerParam(), 5)
getVariable("ステータス")[0][0][3]=getValueFromCharacterParam(getPlayerParam(), 9)
getVariable("ステータス")[0][0][4]=getValueFromCharacterParam(getPlayerParam(), 13)
getVariable("ステータス")[0][0][5]=0

getVariable("ステータス")[0][1][0]="助っ人"
getVariable("ステータス")[0][1][1]=50
getVariable("ステータス")[0][1][2]=50
getVariable("ステータス")[0][1][3]=10
getVariable("ステータス")[0][1][4]=1
getVariable("ステータス")[0][1][5]=0

getVariable("ステータス")[1][0][0]="スライムA"
getVariable("ステータス")[1][0][1]=floor(getValueFromCharacterParam(getPlayerParam(), 6)*0.7)
getVariable("ステータス")[1][0][2]=floor(getValueFromCharacterParam(getPlayerParam(), 5)*0.7)
getVariable("ステータス")[1][0][3]=floor(getValueFromCharacterParam(getPlayerParam(), 9)*0.5)
getVariable("ステータス")[1][0][4]=floor(getValueFromCharacterParam(getPlayerParam(), 13)*0.9)+1
getVariable("ステータス")[1][0][5]=0

getVariable("ステータス")[1][1][0]="スライムB"
getVariable("ステータス")[1][1][1]=floor(getValueFromCharacterParam(getPlayerParam(), 6)*0.7)
getVariable("ステータス")[1][1][2]=floor(getValueFromCharacterParam(getPlayerParam(), 5)*0.7)
getVariable("ステータス")[1][1][3]=floor(getValueFromCharacterParam(getPlayerParam(), 9)*0.7)
getVariable("ステータス")[1][1][4]=floor(getValueFromCharacterParam(getPlayerParam(), 13)*0.5)+1
getVariable("ステータス")[1][1][5]=0
#=====配列にデータを入れていく部分ここまで======

#=====ターンが回ってきたキャラのステータスをコピーする配列の作成=====
setVariable("行動キャラ",createArray())

#=====戦闘が続いているか終了するかを判定するフラグの設定=====
setFlag("戦闘継続",true)

#XXXXX戦闘のループここからXXXXX
#    フラグ"戦闘継続"がtrueの間ループが続く
while getFlag("戦闘継続")
  #=====味方パーティを表す配列の中身を素早さ順にならべかえる部分======
  setFlag("交換の有無",true)
  a=createArray()
  while getFlag("交換の有無")
    i=0
    setFlag("交換の有無",false)
    while i<getArrayLength(getVariable("ステータス")[0])-1
      if getVariable("ステータス")[0][i][4]<getVariable("ステータス")[0][i+1][4]
        j=0
        while j<getArrayLength(getVariable("ステータス")[0][i])
          a[j]=getVariable("ステータス")[0][i][j]
          getVariable("ステータス")[0][i][j]=getVariable("ステータス")[0][i+1][j]
          getVariable("ステータス")[0][i+1][j]=a[j]
          j=j+1
        end
        setFlag("交換の有無",true)
      end
      i=i+1
    end
  end
  #=====味方パーティを表す配列の中身を素早さ順にならべかえる部分ここまで======

  #=====敵を表す配列の中身を素早さ順にならべかえる部分======
  #            と言いつつやっていることは味方と同じなので
  #             一つのループにまとめた方が良いかも
  setFlag("交換の有無",true)
  a=createArray()
  while getFlag("交換の有無")
    i=0
    setFlag("交換の有無",false)
    while i<getArrayLength(getVariable("ステータス")[1])-1
      if getVariable("ステータス")[1][i][4]<getVariable("ステータス")[1][i+1][4]
        j=0
        while j<getArrayLength(getVariable("ステータス")[1][i])
          a[j]=getVariable("ステータス")[1][i][j]
          getVariable("ステータス")[1][i][j]=getVariable("ステータス")[1][i+1][j]
          getVariable("ステータス")[1][i+1][j]=a[j]
          j=j+1
        end
        setFlag("交換の有無",true)
      end
      i=i+1
    end
  end
  #=====敵を表す配列の中身を素早さ順にならべかえる部分ここまで======

  #=====味方パーティでどのキャラにターンが回ってきたかを決める部分======
  #     pp_activeはキャラのステータスを一時的に記憶するための配列
  #      後で敵と比較して素早さの高い方にターンが回るようにする
  pp_active=createArray()
  i=0
  while i<getArrayLength(getVariable("ステータス")[0])
    #    素早さの高いキャラから順番に行動可能かどうかを調べる
    #    行動可能なキャラがいた時点でpp_activeにステータスをコピーして
    #    ループから抜け出す
    if getVariable("ステータス")[0][i][5]==0
      j=0
      while j<getArrayLength(getVariable("ステータス")[0][i])
        pp_active[j]=getVariable("ステータス")[0][i][j]
        j=j+1
      end
      nacp=i
      i=getArrayLength(getVariable("ステータス")[0])
    end
    i=i+1
    #    もしもパーティの中に行動可能なキャラが残っていなかった場合に
    #    ターンが終了しているかの判定に関するフラグを立てる
    if i==getArrayLength(getVariable("ステータス")[0])
      setFlag("ターン終了1",true)
      j=0
      while j<getArrayLength(getVariable("ステータス")[0][i-1])
        pp_active[j]=0
        j=j+1
      end
    end
  end
  #=====味方パーティでどのキャラにターンが回ってきたかを決める部分ここまで======

  #=====敵パーティでどのキャラにターンが回ってきたかを決める部分======
  #            と言いつつやっていることは味方と同じなので
  #             一つのループにまとめた方が良いかも
  ep_active=createArray()
  i=0
  while i<getArrayLength(getVariable("ステータス")[1])
    if getVariable("ステータス")[1][i][5]==0
      j=0
      while j<getArrayLength(getVariable("ステータス")[1][i])
        ep_active[j]=getVariable("ステータス")[1][i][j]
        j=j+1
      end
      nace=i
      i=getArrayLength(getVariable("ステータス")[1])
    end
    i=i+1
    if i==getArrayLength(getVariable("ステータス")[1])
      setFlag("ターン終了2",true)
      j=0
      while j<getArrayLength(getVariable("ステータス")[1][i-1])
        ep_active[j]=0
        j=j+1
      end
    end
  end
  #=====敵パーティでどのキャラにターンが回ってきたかを決める部分ここまで======

  #=====敵と味方で素早さを比較する部分======
  #            素早さが同じ場合にはプレイヤー側のキャラを優先する
  #            同時に行動するのがプレイヤー側かNPCかを判断するための
  #            変数の設定も行っている
  if ep_active[4]>pp_active[4]
    i=0
    while i<getArrayLength(ep_active)
      getVariable("行動キャラ")[i]=ep_active[i]
      i=i+1
    end
    setVariable("プレイヤーかどうか",1)
  else
    i=0
    while i<getArrayLength(pp_active)
      getVariable("行動キャラ")[i]=pp_active[i]
      i=i+1
    end
    setVariable("プレイヤーかどうか",0)
  end
  #=====敵と味方で素早さを比較する部分ここまで======
 
  #=====行動可能かどうかに関する変数をリセットする部分======
  #            敵と味方のどちらにも行動可能なキャラがいない場合には
  #            ここで行動可能かどうかの変数をリセットする
  #            行動可能なキャラがいる場合には行動を選択するための
  #            ルーチンを実行する
  if getFlag("ターン終了1")&&getFlag("ターン終了2")
    i=0
    while i<2
      j=0
      while j<getArrayLength(getVariable("ステータス")[i])
         #     HPが0より大きければ行動可能に戻す
         #     HPが0以下の場合には行動不能のままにしておく
         if getVariable("ステータス")[i][j][1]>0
           getVariable("ステータス")[i][j][5]=0
         end
         j=j+1
      end
      i=i+1
    end
    setFlag("ターン終了1",false)
    setFlag("ターン終了2",false)
  else
    #******ここからキャラクタの行動を決める部分になる******
    if getVariable("プレイヤーかどうか")==0
      #  プレイヤーにターンが回った場合
      #=====攻撃対象の配列を作る部分=====
      #            敵単体に攻撃する場合に選択肢を示すため
      #            HPが0でないキャラの名前をリストにする
      a=createArray()
      aa=createArray()
      i=0
      ii=0
      while i<getArrayLength(getVariable("ステータス")[1])
        if getVariable("ステータス")[1][i][1]!=0
          a[ii]=getVariable("ステータス")[1][i][0]
          aa[ii]=i
          ii=ii+1
        end
        i=i+1
      end
      #=====攻撃対象の配列を作る部分ここまで=====

      #=====回復対象の配列を作る部分=====
      #            味方単体を回復する場合に選択肢を示すため
      #            HPが0でないキャラの名前をリストにする
      b=createArray()
      bb=createArray ()
      i=0
      ii=0
      while i<getArrayLength(getVariable("ステータス")[0])
        if getVariable("ステータス")[0][i][1]!=0
          b[ii]=getVariable("ステータス")[0][i][0]
          bb[ii]=i
          ii=ii+1
        end
        i=i+1
      end
      #=====回復対象の配列を作る部分ここまで=====

      #=====プレイヤーに選択肢を示す部分=====
      s=getVariable("行動キャラ")[0]+"のターン"
      case speakWithSelect(4,"攻撃","全体攻撃","回復","全体回復",s)
        when 0
          case speakWithSelectArray(a,"どの敵を攻撃しますか?")
            when 0
              ii=0
            else
              ii=1
          end
          attack(aa[ii])
         when 1
          ii=0
          while ii<getArrayLength(a)
             attack(aa[ii])
             ii=ii+1
          end
         when 2
          case speakWithSelectArray(b,"誰を回復しますか?")
            when 0
              ii=0
            else
              ii=1
          end
          heal(bb[ii])
         when 3
          ii=0
          while ii<getArrayLength(b)
             heal(bb[ii])
             ii=ii+1
          end
       end
       getVariable("ステータス")[0][nacp][5]=1
    else
      #  NPCにターンが回った場合
      #=====攻撃対象の配列を作る部分=====
      #            敵単体に攻撃する場合に選択肢を示すため
      #            HPが0でないキャラの名前をリストにする
      a=createArray()
      aa=createArray()
      i=0
      ii=0
      while i<getArrayLength(getVariable("ステータス")[0])
        if getVariable("ステータス")[0][i][1]!=0
          aa[ii]=i
          ii=ii+1
        end
        i=i+1
      end
      #=====攻撃対象の配列を作る部分ここまで=====

      #=====ランダムにキャラを選んで攻撃=====
      case rand(getArrayLength(aa))
        when 0
          ii=0
        else
          ii=1
      end
      s=getVariable("行動キャラ")[0]+"の攻撃"
      speak(s)
      attack(aa[ii])
      getVariable("ステータス")[1][nace][5]=1
    end

  end

  #=====戦闘が終了していないか判定する部分======
  #            プレイヤーとNPCのパーティでそれぞれHPの合計を調べ
  #            どちらか片方でも0だった場合にフラグ"戦闘継続"をfalseにする
  #            互いに全滅していた場合にはプレイヤーの負けとして扱う
  #            変数"結果"が0ならばプレイヤーの勝利1ならば負け
  sum_hp_e=0
  i=0
  while i<getArrayLength(getVariable("ステータス")[1])
    sum_hp_e=sum_hp_e+getVariable("ステータス")[1][i][1]
    i=i+1
  end
  if sum_hp_e==0
    setFlag("戦闘継続",false)
    setVariable("結果",0)
  end

  sum_hp_p=0
  i=0
  while i<getArrayLength(getVariable("ステータス")[0])
    sum_hp_p=sum_hp_p+getVariable("ステータス")[0][i][1]
    i=i+1
  end
  if sum_hp_p==0
    setFlag("戦闘継続",false)
    setVariable("結果",1)
  end
    
end
#XXXXX戦闘のループここまでXXXXX
end
#_/_/_/_/_/RPGの戦闘を行う自作関数ここまで_/_/_/_/_/

battle()
if getVariable("結果")==0
  speak("victory")
end

コメントする

コメントするには、ログインする必要があります。

コメント一覧

User icon mini taki(投稿日:2016/10/30 00:05, 履歴)
一区切りついたのでサンプルを公開します
http://rmake.jp/games/26167/limited_play
ID:asdf
パスワード:asdf
スタート地点近くの木に話しかけてください
            mini mosmoss(投稿日:2016/10/24 17:13, 履歴)
うまくできたらtaki神社たちますね。
アイテム関係のデータ(装備・魔法含む)をRPGエディタのまま使う場合、
アイテムパラメータ配列の中身が必要になってくると思いますが、
配列の中身の検証を前にしてブログ記事を書きました。
多少の時短に役に立つこともあるかもしれません。
http://blog.rmake.jp/mosmoss/7607/
User icon mini taki(投稿日:2016/10/26 02:15, 履歴)
情報のご提供ありがとうございます

アイテムだけでなくキャラクターの情報もまとまっていて
とてもありがたいです。
mosmoss大明神様のおかげで巫女さんを探す時間ができました。
taki神社の建設はまだまだ遠いですが頑張ってみます。
         mini mifa(投稿日:2016/10/24 14:19, 履歴)
こんにちは、コメント失礼します。

いつも、高度過ぎてコメントできずにいますが、
どんなゲームになっていくのか、わくわくしております。

戦闘の中身を変えられると、もっとやりたいことができるユーザーが増えそうですね。
User icon mini taki(投稿日:2016/10/26 02:05, 履歴)
コメントありがとうございます

戦闘中に敵が無駄話をしたり、必殺技に特別な演出があったり
夢だけは膨らみます。

戦闘システムはゲームの個性が出しやすいところなので
作るハードルを下げればきっと変化球のゲームも増えると思います。
Cdv30200 aoi icon mini aoihikawa(投稿日:2016/10/23 10:45, 履歴)
オリジナルの戦闘関数でしょうか
 
ゲーム上でどういった動きを発揮するのか
楽しみです
User icon mini taki(投稿日:2016/10/24 00:07, 履歴)
コメントありがとうございます

御察しの通り戦闘の関数になります(なって欲しい)

Rmakeの2DRPGと同じような仕様で
さらにユーザーが自由に機能を改変できるものを提供できたら
崇め奉ってもらえるに違いないという思想で作り始めました。

実際につくってみると動かすのがやっとで
解読が困難なスクリプトになってしまいました。