思考の断片。
Unitクラスは
BaseParameters(何も装備していない素のステータス)
と
RevisedParameters(武器とか装備した状態の素のステータス。戦闘開始時や終了時に書き戻す予定。)
と
CurrentParameters(ダメージを受けたりして戦闘中に刻々と変化するステータス。
ある意味戦闘中どうにでも使っていい。)
の3つを保持するようにしている。
構造体が嫌いなので、全部UnitParameterクラスにしてnewでインスタンスを生成している。(継承してクラスを作ってたりはしない)
UnitParameterクラスはHPやLPやWPやJP等のpublicなプロパティを持ち、
それら用のprivateな変数は別途宣言されている。
====================================
★各種のコマンドはPuntch,DoubleHitなど独自のクラスであるが、
BattleCommandクラスを継承するようにしてある。BattleCommandクラスはRuncommandメソッドを持ち、
★各キャラのターン中に一度決定されたコマンドは即座に実行してはならない。
全員の入力が終了するまではキャンセルが可能なはずだから。ターンの途中でモンスターが死んだりはせず、
プレイヤーによってキーボード等によって入力されたコマンドはSystem.Collections.Generic.Listに蓄積され、
最後のキャラを入力完了した地点で溜めてきたものを一気に吐き出して実行していく
コマンドに指定する対象も別途2個ずつまで保管している[あくまで現状]。(Arg1 As Unit,Arg2 As Unit)
Arg1にコマンド実行者、Arg2にコマンドの実行対象を指定している。
コレクション系は自動であいたところを埋めてくれるので、
Dim hoge As New System.Collections.Generic.List(Of BattleCommand)
Dim hoge As New System.Collections.Generic.List(Of Unit)
Dim hoge As New System.Collections.Generic.List(Of Unit)
Dim fuga As New Puntch
RegisterTask(Unit1.fuga,Unit1,Unit2)
とかやって
Sub RegisterTask(A As BattleCommand,B As Unit,C As Unit)
hoge.Add(A)
Arg1.Add(B)
Arg2.Add(C)
End Sub
みたいなことやって
コレクション系は削除したところ埋めてくれるので
Do
hoge.item(0).RunCommand(Arg1,Arg2)
hoge.RemoveAt(0)
Arg1.RemoveAt(0)
Arg2.RemoveAt(0)
Loop Until hoge.count = 0
のような形で対応している。
☆現段階ではパーティ全員などを引数にすることを考えられていない。
引数をObject型にして
スタックマシンみたいな設計にすればいいのかなぁ・・・・よく理解してないけど。
★コマンドを実行した時にモンスターのHPが0になっていたら自動的に別なモンスターに切り替えるのが普通だが、
最後に実行してみるまでモンスターのHPが0を下回って死ぬかはわからない。
なったときに別なモンスターを支給してもらう必要がある。
できないことはない、というか、HPが0になったモンスターがいる地点で特定の値を自分(BattleCommandクラス)を変数として持つ
管理側のクラスに返すようにして、管理側が返ってきた値から新たに支給が必要だと知ると、
乱数によって決定されたモンスター(モンスターの立場ではプレイヤー側のキャラだが)をBattleCommandクラスの補給用メソッドを実行して
補う、という形をとっている。
味方側はLPが0になるまで支給は必要にならないけど。(厳密には多分生きている奴中心に攻撃してきていると思う)
設計がエレガントじゃないなぁ・・・・
かといって、全部管理するクラスをMeとして引数に渡すのもおおげさなんだよなぁ・・・
★今は直接UnitクラスにUnitStatusというプロパティを用意しちゃっているけど
UnitParameter型に含めてHPプロパティのSetで、0以下になったらHPを0にセットして
同時にUnitStatusに死亡フラグ立てようかな・・・・(以下のソースではここまで完了)
★厳密には毒・麻痺・混乱という分類ではなく
ターンのコマンド入力が出来るか、というシステム的な分類で列挙型を用意していて
'ターン後に起こること
If (PP.MemberList.Item(PP.SelectedMemberNumber).CurrentParameters.status And Process.BeforeCommand) = Process.BeforeCommand Then
'ターン前に起こること。沈黙・暗闇・硝子の盾等などのコマンドを実行
End If
If (PP.MemberList.Item(PP.SelectedMemberNumber).CurrentParameters.status And Process.SkipTurn) = Process.SkipTurn Then
'麻痺・睡眠・気絶・昏睡など、動けないとき
PP.SelectedMemberNumber = PP.SelectedMemberNumber + 1
Else
If (PP.MemberList.Item(PP.SelectedMemberNumber).CurrentParameters.status And Process.NotCommandable) = Process.NotCommandable Then
'魅了・混乱・バーサーカー等、行動を制御できないとき
'魅了・混乱LV3
Dim Random As New System.Random
BTM.RegisterTask(PP.MemberList.Item(PP.SelectedMemberNumber).BattleCommandsList.Item(Random.Next(0, PP.MemberList.Item(PP.SelectedMemberNumber).BattleCommandsList.Count)), PP.MemberList.Item(PP.SelectedMemberNumber), PP.MemberList.Item(Random.Next(0, PP.MemberList.Count - 1)))
If PP.SelectedMemberNumber = PP.MemberList.Count - 1 Then
RunAllTheTask() '新たに作り直した
Else
PP.SelectNextMember()
End If
Else
'コマンド入力を登録()
・・・・
って感じでやってる
Unitクラスは
BaseParameters(何も装備していない素のステータス)
と
RevisedParameters(武器とか装備した状態の素のステータス。戦闘開始時や終了時に書き戻す予定。)
と
CurrentParameters(ダメージを受けたりして戦闘中に刻々と変化するステータス。
ある意味戦闘中どうにでも使っていい。)
の3つを保持するようにしている。
構造体が嫌いなので、全部UnitParameterクラスにしてnewでインスタンスを生成している。(継承してクラスを作ってたりはしない)
UnitParameterクラスはHPやLPやWPやJP等のpublicなプロパティを持ち、
それら用のprivateな変数は別途宣言されている。
====================================
★各種のコマンドはPuntch,DoubleHitなど独自のクラスであるが、
BattleCommandクラスを継承するようにしてある。BattleCommandクラスはRuncommandメソッドを持ち、
★各キャラのターン中に一度決定されたコマンドは即座に実行してはならない。
全員の入力が終了するまではキャンセルが可能なはずだから。ターンの途中でモンスターが死んだりはせず、
プレイヤーによってキーボード等によって入力されたコマンドはSystem.Collections.Generic.Listに蓄積され、
最後のキャラを入力完了した地点で溜めてきたものを一気に吐き出して実行していく
コマンドに指定する対象も別途2個ずつまで保管している[あくまで現状]。(Arg1 As Unit,Arg2 As Unit)
Arg1にコマンド実行者、Arg2にコマンドの実行対象を指定している。
コレクション系は自動であいたところを埋めてくれるので、
Dim hoge As New System.Collections.Generic.List(Of BattleCommand)
Dim hoge As New System.Collections.Generic.List(Of Unit)
Dim hoge As New System.Collections.Generic.List(Of Unit)
Dim fuga As New Puntch
RegisterTask(Unit1.fuga,Unit1,Unit2)
とかやって
Sub RegisterTask(A As BattleCommand,B As Unit,C As Unit)
hoge.Add(A)
Arg1.Add(B)
Arg2.Add(C)
End Sub
みたいなことやって
コレクション系は削除したところ埋めてくれるので
Do
hoge.item(0).RunCommand(Arg1,Arg2)
hoge.RemoveAt(0)
Arg1.RemoveAt(0)
Arg2.RemoveAt(0)
Loop Until hoge.count = 0
のような形で対応している。
☆現段階ではパーティ全員などを引数にすることを考えられていない。
引数をObject型にして
スタックマシンみたいな設計にすればいいのかなぁ・・・・よく理解してないけど。
★コマンドを実行した時にモンスターのHPが0になっていたら自動的に別なモンスターに切り替えるのが普通だが、
最後に実行してみるまでモンスターのHPが0を下回って死ぬかはわからない。
なったときに別なモンスターを支給してもらう必要がある。
できないことはない、というか、HPが0になったモンスターがいる地点で特定の値を自分(BattleCommandクラス)を変数として持つ
管理側のクラスに返すようにして、管理側が返ってきた値から新たに支給が必要だと知ると、
乱数によって決定されたモンスター(モンスターの立場ではプレイヤー側のキャラだが)をBattleCommandクラスの補給用メソッドを実行して
補う、という形をとっている。
味方側はLPが0になるまで支給は必要にならないけど。(厳密には多分生きている奴中心に攻撃してきていると思う)
設計がエレガントじゃないなぁ・・・・
かといって、全部管理するクラスをMeとして引数に渡すのもおおげさなんだよなぁ・・・
★今は直接UnitクラスにUnitStatusというプロパティを用意しちゃっているけど
UnitParameter型に含めてHPプロパティのSetで、0以下になったらHPを0にセットして
同時にUnitStatusに死亡フラグ立てようかな・・・・(以下のソースではここまで完了)
★厳密には毒・麻痺・混乱という分類ではなく
ターンのコマンド入力が出来るか、というシステム的な分類で列挙型を用意していて
'ターン後に起こること
If (PP.MemberList.Item(PP.SelectedMemberNumber).CurrentParameters.status And Process.BeforeCommand) = Process.BeforeCommand Then
'ターン前に起こること。沈黙・暗闇・硝子の盾等などのコマンドを実行
End If
If (PP.MemberList.Item(PP.SelectedMemberNumber).CurrentParameters.status And Process.SkipTurn) = Process.SkipTurn Then
'麻痺・睡眠・気絶・昏睡など、動けないとき
PP.SelectedMemberNumber = PP.SelectedMemberNumber + 1
Else
If (PP.MemberList.Item(PP.SelectedMemberNumber).CurrentParameters.status And Process.NotCommandable) = Process.NotCommandable Then
'魅了・混乱・バーサーカー等、行動を制御できないとき
'魅了・混乱LV3
Dim Random As New System.Random
BTM.RegisterTask(PP.MemberList.Item(PP.SelectedMemberNumber).BattleCommandsList.Item(Random.Next(0, PP.MemberList.Item(PP.SelectedMemberNumber).BattleCommandsList.Count)), PP.MemberList.Item(PP.SelectedMemberNumber), PP.MemberList.Item(Random.Next(0, PP.MemberList.Count - 1)))
If PP.SelectedMemberNumber = PP.MemberList.Count - 1 Then
RunAllTheTask() '新たに作り直した
Else
PP.SelectNextMember()
End If
Else
'コマンド入力を登録()
・・・・
って感じでやってる
※コメント投稿者のブログIDはブログ作成者のみに通知されます