Ver2.24
内容はアイテムドロップについてですが、
武器・防具のドロップも一緒です。
今回使うユーザーDBの設定
- タイプ9:敵キャラ個体データ
- データ1 ID1:スライム
- 項目0:敵キャラ名 スライム
- 項目14:入手アイテム 1:薬草
- 項目15:入手率[アイテム] 10(%)
<ご注意>
ウディタ公式とは一切関係ありません。
私自身ただのウディタユーザーです。
知ってる方には当たり前!という部分も、
なるべく触れていきます。
ですので知ってる部分・不要な部分は、
ガンガン読み飛ばしてください。
基本的な流れを理解しやすくするため、
コマンド文などの一部省略してあります。
戦闘開始時
144:X[戦]敵DB→戦闘DBコピーで、
ユーザーDBから可変DBへ。
ユーザーDB
- タイプ9:敵キャラ個体データ
- データ1 ID1:スライム
- 項目0:敵キャラ名 スライム
- 項目14:入手アイテム 1:薬草
- 項目15:入手率[アイテム] 10(%)
↓コピー
可変DB
- タイプ10:×┏ 戦闘一時ステータス[基]
- データ10:敵1ステータス
- 項目0:キャラ名
- 項目72:[敵専用]入手アイテム
- 項目73:[敵専用]アイテム入手率
コピー後の可変DB
- タイプ10:×┏ 戦闘一時ステータス[基]
- データ10:敵1ステータス
- 項目0 スライム
- 項目72 1:薬草
- 項目73 10(%)
144:X[戦]敵DB→戦闘DBコピー
■DB読込(ユーザ): CSelf80[入手アイテム] = ユーザDB[ 敵キャラ個体データ : CSelf1[読込敵個体ID] : 入手アイテム ] (9 : – : 14)
■DB読込(ユーザ): CSelf81[アイテム入手率] = ユーザDB[ 敵キャラ個体データ : CSelf1[読込敵個体ID] : ┗入手率[アイテム] [%] ] (9 : – : 15)省略
■可変DB書込:DB[ ×┏ 戦闘一時ステータス[基] : CSelf0[入力先戦闘DB] : [敵専用]入手アイテム ] (10 : – : 72) = CSelf80[入手アイテム]
■可変DB書込:DB[ ×┏ 戦闘一時ステータス[基] : CSelf0[入力先戦闘DB] : [敵専用]アイテム入手率] (10 : – : 73) = CSelf81[アイテム入手率]
イメージ
わかりづらいという方は、
スライムに薬草を持たせる、
というイメージでOKです!
実際は違うのですが、
イメージをつかむためです。
敵がスライム×2の場合、
それぞれのスライムに薬草を持たせます。
2体目のスライム
- タイプ10:×┏ 戦闘一時ステータス[基]
- データ11:敵2ステータス
- 項目0 スライム
- 項目72 1:薬草
- 項目73 10(%)
となります。
補足 実際の処理
※難しかったら飛ばしてください
全体を掴んで余裕があれば…。
戦闘スロットからモンスターのIDを特定し、
可変DBの対応箇所に格納しています。
- 戦闘スロット10 → データ10:敵1ステータス
- 戦闘スロット11 → データ11:敵2ステータス
例えば、敵グループが
敵1なし・敵2スライム・敵3スライム・敵4567なし
だとすると、
- 戦闘スロット10 → なし
- 戦闘スロット11 → データ10:敵2ステータス スライム
- 戦闘スロット12 → データ10:敵3ステータス スライム
のようになります。
データ10:敵1ステータスから、
埋めていくわけではありません。
敵撃破時
ドロップ判定処理
戦闘中に敵を倒すと、
171:X[戦]敵撃破処理で、
ドロップ判定が行われます。
可変DB
- タイプ10:×┏ 戦闘一時ステータス[基]
- データ10:敵1ステータス
- 項目0:スライム
- 項目72 1:薬草
- 項目73 10(%)
撃破したモンスターの、
ドロップアイテムとドロップ率を、
CSelf30[入手アイテム]、
CSelf31[アイテム入手率[%]へ。
- CSelf30=1:薬草
- CSelf31=10(%)
171:X[戦]敵撃破処理
|■DB読込(可変): CSelf30[入手アイテム] = 可変DB[ ×┏ 戦闘一時ステータス[基] : CSelf0[対象戦闘スロット] : [敵専用]入手アイテム ] (10 : – : 72)
|■DB読込(可変): CSelf31[アイテム入手率[%]] = 可変DB[ ×┏ 戦闘一時ステータス[基] : CSelf0[対象戦闘スロット] : [敵専用]アイテム入手率 ] (10 : – : 73)
ドロップ判定の仕組み
CSelf31から0~99を引いた値が、
1以上ならドロップ。
171:X[戦]敵撃破処理
|■変数操作: CSelf31[アイテム入手率[%]] -= 0 ~ 99
例
- CSelf30=1:薬草
- CSelf31=10(%)
CSelf31 -= 0 ~ 99
引く数字が0~9ならドロップし、
10~99ならドロップなしです。
0~9で10個、0~99で100個、
10/100で入手率10%という感じです!
入手率を100(%)にすると、
最大の99を引いても絶対に1残るため、
必ずドロップするわけです。
ドロップ後
判定後ドロップしたアイテムは、
可変DB15:お宝リストに格納されます。
171:X[戦]敵撃破処理
| | | | |■可変DB書込:DB[ ×┗ お宝リスト : 0 : CSelf21[一時格納位置] ] (15 : : -) = CSelf30[入手アイテム]
| | | | |■可変DB書込:DB[ ×┗ お宝リスト : 0 : CSelf21[一時格納位置] ] (15 : : -) += 10000
最後に+10000しているのは、
アイテム・武器・防具を区別するためです。
※詳しくは後ほど!
イメージ
スライムを倒したときに、
持っている薬草のドロップ判定を行う!
判定のタイミングは戦闘終了後ではなく、
個々のモンスター撃破時!
くどいようですが、
- スライムAを倒す
→スライムAのドロップ判定 - スライムBを倒す
→スライムBのドロップ判定
です!
ドロップありなら、
下記のドロップアイテム入手処理へ!
余談 モンスター逃走時
- スライムCが逃走した場合…?
→タイプ10:×┏ 戦闘一時ステータス[基]を初期化
171:X[戦]敵撃破処理
|▼ 対象の戦闘スロットをカラにする
|■可変DB書込:[タイプ ×┏ 戦闘一時ステータス[基](10) : データ CSelf0[対象戦闘スロット]を初期化]
スライムCが持っていた薬草もキレイに消滅!
ここを改造すれば、
逃走時に確率でアイテムドロップ!
みたいなモンスターも作れそう?
勝敗判定後
ドロップアイテムの入手処理
200:X┣◆戦利品獲得処理
可変DB15:お宝リストからCSelf11へ、
CSelf11を10000で除した値をCSelf12へ。
50:X[共]アイテム増減で、
CSelf12の所持数を1増やす。
200:X┣◆戦利品獲得処理
| |■DB読込(可変): CSelf11[一時変数B] = 可変DB[ ×┗ お宝リスト : 0 : CSelf10[一時変数A] ] (15 : : -)
省略
| | | |▼ アイテムの場合
| | | |■変数操作: CSelf12[一時変数C] = CSelf11[一時変数B] % 10000
| | | |■イベントの挿入[名]: [“X[共]アイテム増減”] <コモンEv 50> / CSelf12[一時変数C] / 1
10000で除した値
薬草のIDが1だとすると、
可変DBの10:お宝リストには、
10001で格納されています。
CSelf12 = 10001 % 10000
10001を10000で割って残った値を、
CSelf12に入れる、という意味です。
なのでCSelf12はID1、薬草です!
→薬草の所持数+1
補足 +10000は何のため?
基本システムに慣れれば、
当たり前!なお話なんですが、
一応説明しておきます。
基本システムではよく見かけるので、
理解しておくと色々捗りますが、
難しい!不要!なら飛ばしてください。
お宝リストに格納する際に、
+10000したのは、
アイテムかどうかを区別するためです。
武器なら+20000、
防具なら+30000しています。
こうしておくことで、
ドロップアイテムが何のID1なのか、
区別できるわけです。
…アイテムだけだと、
イメージしづらいですが。
例えばユーザーDBの設定が、
- アイテムID 1 薬草
- 武器ID 1 こんぼう
- 防具ID 1 木の盾
となっていた場合、
お宝リストに格納する数字が1だけだと、
区別がつかなくなってしまいます。
ウディタ「…どの1なのさ?」
なのでアイテムなら+10000しておき、
条件分岐で判別できるようにしてあります。
↓CSelf11が10000以上で、
19999以下ならアイテムとなっています。
200:X┣◆戦利品獲得処理
| |■条件分岐(変数): 【1】 CSelf11[一時変数B] が 10000 以上
| |-◇分岐: 【1】 [ CSelf11[一時変数B] が 10000 以上 ]の場合↓
| | |■条件分岐(変数): 【1】 CSelf11[一時変数B] が 19999 以下 【2】 CSelf11[一時変数B] が 29999 以下 【3】 CSelf11[一時変数B] が 39999 以下
| | |-◇分岐: 【1】 [ CSelf11[一時変数B] が 19999 以下 ]の場合↓
| | | |▼ アイテムの場合
| | | |■変数操作: CSelf12[一時変数C] = CSelf11[一時変数B] % 10000
| | | |■イベントの挿入[名]: [“X[共]アイテム増減”] <コモンEv 50> / CSelf12[一時変数C] / 1
| | | |■
| | |-◇分岐: 【2】 [ CSelf11[一時変数B] が 29999 以下 ]の場合↓
| | | |▼ 武器の場合
| | | |■変数操作: CSelf12[一時変数C] = CSelf11[一時変数B] % 20000
| | | |■イベントの挿入[名]: [“X[共]武器増減”] <コモンEv 51> / CSelf12[一時変数C] / 1
| | | |■
| | |-◇分岐: 【3】 [ CSelf11[一時変数B] が 39999 以下 ]の場合↓
| | | |▼ 防具の場合
| | | |■変数操作: CSelf12[一時変数C] = CSelf11[一時変数B] % 30000
| | | |■イベントの挿入[名]: [“X[共]防具増減”] <コモンEv 52> / CSelf12[一時変数C] / 1
| | | |■
| | |◇分岐終了◇
| | |■変数操作: CSelf15[アイテム入手個数] += 1 + 0
| | |■
| |◇分岐終了◇
戦利品獲得画面
186:X[戦]戦利品獲得画面
可変DB15:お宝リストに格納された数値から、
アイテム名と獲得数を取得し表示します。
【入手アイテム】
薬草 × 1
ピローン♪
ここは説明することが特に…?
ということで、
アイテムドロップの構造についてでした!