ドラクエウォークのこころの特殊効果に「耐性」があり、メラ属性耐性+5%とかデイン属性耐性+10%とか、該当する属性の攻撃を受けた際のダメージを軽減してくれる、敵が強くなればなるほどありがたい特殊効果です。中でもドラゴスライムの「全属性耐性+10%」は大変重宝し、ヒーラーにセットしているプレイヤーも多いのではないでしょうか。ダメージ耐性だけではなく、「眠り耐性」や「怯え耐性」などの「状態異常耐性」、「攻撃減耐性」や「すばやさ減耐性」などの「悪い状態変化耐性」もあり、さらにはオルゴ・デミーラ(メガ)のように「すべての状態異常耐性+3%」「悪い状態変化耐性+3%」など、なんか凄そうな特殊能力もあって、これらをどのように「こころマクロ」で表現しようかと悩んでいました。この耐性、実に49種類もありまして、これらをこころセットの横にズラーと並べたらさすがに見づらいと思ったわけです。そこで、各耐性を取得し、それらを文字列として取得、さらに同じ%の場合は耐性名を括りだして表示すると言うのが、短くなって良いのではないかと思い付き、実装してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
'耐性 For j = 74 To 122 TotalV = 0 For h = 1 To 4 If Dmg(i, h) <> 0 Then '空でなければ TempV = d(Dmg(i, h), j) If TempV > 0 Then TotalV = TotalV + TempV End If End If Next h If TotalV > 0 Then If StrV <> "" Then StrV = StrV & "、" StrV = StrV & Replace(列名(j), "耐性", "") & ":" & Format(TotalV, "#%") End If Next j Kekka(r, 26) = StrV |
配列d()にはこころの全データが格納されていて、耐性に該当する列を一つずつ走査し、0より大きければTotalVに加算するロジックで、カウンター変数hでこころ1~4つまで見終わるとループを抜けて、加算結果TotalVが0より大きかった、つまり当該耐性が存在した場合は、ステータスの項目名文字列が格納されている列名()と耐性値を&で繋げて文字列型変数StrVに格納する仕組みです。
さらに、連結した文字列を短くしたく、
ギラ属性耐性:3%、デイン属性耐性:3%、メラ属性耐性:10%、麻痺耐性:3%
↓
ギラ属性,デイン属性,麻痺耐性:3%、メラ属性:10%
となるような処理も行いました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
'耐性の文字列をまとめ Dim StrT Dim StrT2 Dim ArrT(1 To 50, 1 To 3) r = 1 Do StrV = "" StrT = Split(Kekka(r, 26), "、") Erase ArrT For i = 0 To UBound(StrT) h = 1 StrT2 = Split(StrT(i), ":") Do If ArrT(h, 1) = "" Then ArrT(h, 1) = StrT2(0) ArrT(h, 2) = StrT2(1) ArrT(h, 3) = Val(StrT2(1)) '並べ替え用 Exit Do Else If ArrT(h, 2) = StrT2(1) Then ArrT(h, 1) = ArrT(h, 1) & "," & StrT2(0) Exit Do End If End If h = h + 1 Loop Next i '率の多い順に並べ替え Call ArraySort(ArrT, 1, 50, 3) For i = 50 To 1 Step -1 If ArrT(i, 1) = "" Then Exit For If StrV = "" Then StrV = ArrT(i, 1) & ":" & ArrT(i, 2) Else StrV = StrV & "、" & ArrT(i, 1) & ":" & ArrT(i, 2) End If Next i Kekka(r, 26) = StrV r = r + 1 If r > 100 Then Exit Do If Kekka(r, 9) = "" Then Exit Do Loop Range("B5:AA104") = Kekka |
先ほどの文字列StrVを、「、」と「:」で2段階で分解、二次元配列ArrT()に格納します。
ギラ属性耐性:3%
デイン属性耐性:3%
メラ属性耐性:10%
麻痺耐性:3%
これを、2列目の値でソートすると
ギラ属性耐性:3%
デイン属性耐性:3%
麻痺耐性:3%
メラ属性耐性:10%
さらに、下から順に走査し、%部分が同じだったら耐性項目名をまとめるという処理で、出来上がります。
ギラ属性,デイン属性,麻痺耐性:3%、メラ属性:10%
こんな処理を出来上がった耐性表示はこちら
うーん、お世辞にも見やすいとは言えないですね。まあ、でも、いろいろ工夫して文字列操作のプログラムもちゃんと動いているし、まあ、いいか、と改善を後回しにしていたところ、当Blogにさまざまな改善要望をコメントをしてくださるでーびーさんから次のご指摘が!
・AA列は付帯効果を文字列結合されていますが、これを生データと同じフォーマットで分離して表記
・流石に数が多い割に実際に必要なのは1個から数個、必要なものを二行目にフラグ付け
・フラグのたったものだけ、別途圧縮ボタン(併せてリセットボタン)を実装
具体的には眠り耐性や転び耐性、全状態異常などをソート込みで、火力とのバランスを見極めるのに有効かなと思います。
仰る通りです! 耐性を文字列で表示していた理由、それは、どれくらいの列数になるのか見当もつかなく、特にオルゴデミーラ(メガ)の「すべての状態異常耐性+3%」「悪い状態変化耐性+3%」が横いっぱいに耐性項目が広がる光景が怖かったからです!私は逃げていました・・・。そして、でーびーさんのコメントのおかげで耐性表示の改善を行おうと決意することができたのです!(続く)
コメント