ページ 11

【済】メモ欄を参照してステータスに反映

Posted: 2024年7月27日(土) 11:53
by KTY
お世話になります。スプリクトの使い手KTYです。此度はステータスに”性別”を追加する方法について知恵をお借りしたくお邪魔しました。まぁそれも実は通過点で、最終目標は「性別による装備の分類」なのですが、それはまた別のお話。


現時点でまず行いたいことは「アクターのメモ欄から特定の数値を取得して、オリジナル要素をステータス画面に反映させたい」ですね。
このパートで言えば、できるならもっと他項目も増やして、ステータス画面に設置している“プロフ”にいろいろ書きたいな、との思いもあります(例えば「血液型」「星座」など)。

これがうまく実装出来たら、その値を利用して今のジェンダーレス社会に逆行しそうな仕様ですが、性別による装備差を導入したいのです。「別のお話」と言いつつここまで書くのは「情報を出し惜しみしてエスパー回答を待つ」ことにならぬためです。予めご了承ください。



以下、ちょっと長文になります。


さて、現状どの程度の進捗具合なのか、と申しますと
某〇ホー!ホニャ袋的な”アレ”において、別の方が行った過去投稿へ寄せられた回答(他人のふんどし)を参考に、一応性別を描画するには至りました。
いろんな意味で「人様の情報」なのでオリジナルソースは一先ず避けますが、とりあえず「それ」を参考に組んだ「改悪」ソースを記します。

module ABC *モジュール名は仮です

#性別
GEN_TYPE[3] = "?" *本当は0だけど諸事情で3に
GEN_TYPE[1] = "女"
GEN_TYPE[2] = "男"
V_GEN_TYPE = [3,1,2]


class Window_Base
#--------------------------------------------------------------------------
# ● 性別の描画
#--------------------------------------------------------------------------
def draw_actor_gender(actor, x, y, width = 112)
change_color(normal_color)
draw_text(x, y, width, line_height, actor.gender)
end


class Game_Actor
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :gender
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
def setup(actor_id)
@actor_id = actor_id
@name = actor.name
@nickname = actor.nickname
@gender = Gender.get(gender_id) * actor_idだとアクター順・actor.class_idだとジョブ順で参照
init_graphics
@class_id = actor.class_id
@level = actor.initial_level
@exp = {}
@equips = []
init_exp
init_skills
init_equips(actor.equips)
clear_param_plus
recover_all
end
#--------------------------------------------------------------------------
# ● 性別の追加
#--------------------------------------------------------------------------
def gender_id
@note.scan(/<性別\s?(\d+)>/)
return $1 ? $1.to_i: @gender_id
end


class Gender
#--------------------------------------------------------------------------
# ● 性別の追加
#--------------------------------------------------------------------------
def self.get(gender_id)
pers = ABC::GEN_TYPE[gende_id]
return pers != nil ? pers : ""
end
end


一応「元ネタ」では「@gender = Gender.get()」の中身は「actor_id」を参照するようになっており、「class Gender」の()及び[]内も「actor_id」です。

それに従って実行すると描画は成功しました。つまり「class Gender」の部分も生きているっぽいです。その状態だと「ABC::GEN_TYPE[]」にactor_idが入って「1番のアクターは“女”」ね、といった具合になっているようです。

因みに上の「GEN_TYPE[3]」が0から3になったのは0番目のアクターがいないためで、確認用の仕様ですね。この場合だと3番アクターが「?」になっていました。

「@gender = Gender.get()」の()の中身(参照場所)を「actor.class_id」に変えると職業IDが入り、同様にIDとリンクして描画されるのも確認しました。

ただ、「class Gender」の()や[]の内容がどのように反映されているのかがいまいちつかみきれてないのですが(ダメじゃん)。


と、いうことは「アクターIDで管理すればできるんじゃない?」とも思うのですが、その場合アクター数だけ「GEN_TYPE」を手動で準備せねばならず

GEN_TYPE[1]=女
GEN_TYPE[2]=女
GEN_TYPE[3]=男

GEN_TYPE[11]=男
GEN_TYPE[12]=?

的な具合で現実的じゃないし、いろいろとやさしくない。


そこで、「gender_id」を読込んで表示させようとしているのですが、うまくいっていません。上記のコードで実行するとTypeError「no implicit conversion from nil to integer」を吐きます。場所は「 pers = ABC::GEN_TYPE[gende_id]」の位置です。

ボクが解説するのもおこがましい気もしますが(間違ってるかもしれんし)、このエラーは「nilは整数に変換できません」を意味している、というのは発見しました。
nilはたしか「なにもない」という要素で、「なにもないという要素」だから整数にできないよ~。ていうことでよろしいのでしょうか?


「def gender_id」の部分は、お名前を出して大変申し訳ないのですが、へぷたなすくろーる/奈々(なな)さまの神スクリプト「装備タイプ拡張」の一部をマネしきれず撃沈したもようです。

そしてあわよくば同氏の逸品「装備条件の追加」をうまいこと改悪できれば・・・と目論んでいたりします。
でないと同氏の傑作「装備スロットカスタム」&「装備タイプ拡張」も勉強させていただく中、装備数がえらいことになりそうでw


スクリプトに頼らずとも、別のアプローチとしてデフォ機能の「防具タイプ」で仕分ける方法もありますが、それも膨大な数になってしまいそう。

たとえば「大型楯一般」と「大型楯魔法」などと作っていけば問題ないようですが、これを「服」「兜」等々それぞれにつくり、さらに性差を考えると・・・・ねぇ?wってかんじです。

そこでそれらを、メモに<性別 1>など書くことでできないかなぁ、というのが最終的な目標なのですよ。


最終目的を履行できるか、については、この「防具タイプ」を複数付与できる(例「大型楯」兼「魔法防具」)でも可ですね、たぶん。2つ以上設定できるのかは不明ですが。





と、いうわけで、話が横道に逸れまくりですが、改めてお伺いします。現状まずやりたいこと。

アクターのメモ欄から特定の数値を取得して、オリジナル要素をステータス画面に反映させるにはどのようにすればよいですか?仕様ツールはVXAceです。

そして現在のソースに不備があることはわかっていますが、改善点をご教示していただければありがたいです。
まぁ、そもそも使い物にならないのかもしれませんが^^;



分かりづらい説明で申し訳ないです。こんなんじゃいつまでたっても“スプリクト”だよ・・・Orz
長文乱文、そして駄文ですみません。たぶん自分でも理解できてない部分も多いのでごめんなさい。

なかなかうまくはこなせませんが、ご助言いただければ幸いです。宜しくお願い致します。

Re: メモ欄を参照してステータスに反映

Posted: 2024年7月27日(土) 14:50
by 名無し蛙
随分紆余曲折していますね。
KTY さんが書きました:そこで、「gender_id」を読込んで表示させようとしているのですが、うまくいっていません。上記のコードで実行するとTypeError「no implicit conversion from nil to integer」を吐きます。場所は「 pers = ABC::GEN_TYPE[gende_id]」の位置です。

ボクが解説するのもおこがましい気もしますが(間違ってるかもしれんし)、このエラーは「nilは整数に変換できません」を意味している、というのは発見しました。
nilはたしか「なにもない」という要素で、「なにもないという要素」だから整数にできないよ~。ていうことでよろしいのでしょうか?
基本的にメモ欄から値を取得する場合はこの方法を使うんですけど
エラーが出る理由はメモ欄(@note)を持っているのはGame_ActorではなくRPG::Actorだからです。
actor.noteとする事でメモ欄を取得する事が出来ます。

本格的にシステムを組むならデータベースのロード直後に事前解析処理でも入れるべきでしょうけど
とりあえず単発で組むならこんな感じですかね。
タグを作る場合はミスタイプを避ける為にもスペースではなく:(半角コロン)で統一した方が良いです。
というか記号英数字は半角でかなカナ漢字は全角と明確に使い分けてください。
×<性別 1>
〇<性別:1>
また正規表現は基本的に重いため
最初の一回だけ使用して2回目以降は変数に保存した値を取得した方が良いです。
未設定の場合はとりあえず0を返します。

コード: 全て選択

class RPG::Actor < RPG::BaseItem
  attr_reader :gender
  def gender
    return @gender if @gender
    @gender = (@note =~ /<性別:(\d+)>/) ? $1.to_i : 0
  end
end

class Game_Actor < Game_Battler
  def gender
    actor.gender
  end
end

Re: メモ欄を参照してステータスに反映

Posted: 2024年7月28日(日) 16:32
by KTY
名無し蛙さま、ご回答ありがとうございます。

まず、細やかな部分の指摘ありがとうございます。気を付けますね。

さて、教えていただいたコードですが、とりあえずコピペして「入力した数字」を読込むことはできました。
<性別:1>と入力して「1」がでる状態ですね。

ちょっとアホなのでもう一息の「男」と表記させる、には至っていませんがとりあえず報告まで。

そして名無し蛙さまは以前もご助言いただいて感謝感謝です。本当にありがとうございます。

Re: メモ欄を参照してステータスに反映

Posted: 2024年8月03日(土) 21:32
by KTY
名無し蛙さま

教えていただいたコードを基に自身の駄コードを混ぜたところ、なんとか思っていた動きができそうです。
ありがとうございました。

また何かありましたらよろしくおねがいします。