改造方法まとめ2

2chなどで紹介された改造方法を、初心者に優しくまとめておくページです。
まとめる際は、Nativeへの改造なのか、対象としているModを明記するようにしましょう。

基本的な改造方法はほとんど無印wikiに載ってます。



アイテムの追加(ソースファイル)

基本的にはNMC_MyLiteへの改造を想定していますが、他modでも大筋は変わらないと思います。

ソースファイルにアイテムを追加する場合は、まずmodule_constants.pyを参照して、
そのアイテム種類の開始と終了を宣言した変数がないか確認する。
もし設定があった場合、module_items.pyの最後尾ではなくその範囲内に追加したほうが無難。

例)
NMC_MyLiteでは以下の変数が定義されている。

  • trade_goods_begin/end
  • food_begin/end
  • reference_books_begin/end
  • readable_books_begin/end
  • books_begin/end
  • horses_begin/end
  • weapons_begin/end
  • ranged_weapons_begin/end
  • armors_begin/end
  • shields_begin/end

これらは、主にCustom Commanderの自動ルートや自動売買で参照している。
なので例えば武器を追加する場合は、wooden_stick~wooden_shieldの間に追加する。
(片手、両手、長柄は混合しても問題はない)

なお、module_items.pyの中間に記述を追加すると、ID_items.pyの連番もずれるので
合わせて修正が必要。

scripts に処理を追加する場合は、既存アイテムのIDや上記のxxx_begin で検索すると漏れがないと思います。
コンパニオンなど、総数をソースに直接書いている場合もあるので注意。

本(所持するとスキル上昇するタイプ)

例)所持すると略奪が+1される book_looting_reference (所持にはINT10が必要)を追加する。

  • module_items.pyに本の記述を追加する
["book_looting_reference","New book", [("book_b",0)], itp_type_book, 0, 3500,weight(2)|abundance(100),imodbits_none],
  • ID_items.pyに新規本のIDと連番を追加する。
  • item_kinds.csvに新規本の日本語読みを追加する

ここまでで全アイテムには表示されるが、所持の効果はまだ未設定。

  • module_scripts.py内のgame_get_skill_modifier_for_troopを探し、新規本の記述を追加する
   (else_try),
     (eq, ":skill_no", "skl_looting"),←上昇させたいスキル
     (call_script, "script_get_troop_item_amount", ":troop_no", "itm_book_looting_reference"),←新規本
     (gt, reg0, 0),
     (val_add, ":modifier_value", 1),←上昇値を変えたい場合は「1」の部分を変更

なお、一人に同じスキルを上昇させる本を複数持たせた場合は、ここの記述で一番上に書かれた本の効果が優先される。

例)
   (else_try),
     (eq, ":skill_no", "skl_trainer"),
     (call_script, "script_get_troop_item_amount", ":troop_no", "itm_book_training_reference"),
     (gt, reg0, 0),
     (val_add, ":modifier_value", 1),  ←こちらが使用される
   (else_try),
     (eq, ":skill_no", "skl_trainer"),
     (call_script, "script_get_troop_item_amount", ":troop_no", "itm_book_training_reference_1"),
     (gt, reg0, 0),
     (val_add, ":modifier_value", 3),  ←無視される

  • (本の所持に制限を加える場合)module_scripts.py内のinitialize_item_infoを探し、新規本の記述を追加する
(item_set_slot, "itm_book_looting_reference", slot_item_intelligence_requirement, 10),
  • module_scripts.py内のgame_get_item_extra_textを探し、所持時の効果テキストを追加する。
         (else_try),
           (eq, ":item_no", "itm_book_looting_reference"),  ←追加した本
           (str_store_string, s1, "@looting"),  ←上昇するスキル

上昇するスキルの日本語がquick_strings.csvにない場合は記述を追加
qstr_looting|略奪

なお、+2や+3上昇する本を追加したい場合は、テキスト文を作る処理にも変更が必要。

         (else_try),
           (eq, ":item_no", "itm_book_looting_reference"),←本の種類
           (str_store_string, s1, "@looting"),  ←代入したいスキル名
            ~
         (try_end),
         (set_result_string, "@+1 to {s1} while in inventory"),
         (else_try),
           (eq, ":item_no", "itm_book_looting_reference"),←本の種類
           (str_store_string, s1, "@looting"),  ←代入したいスキル名
           (set_result_string, "@+2 to {s1} while in inventory"), ←最終的に表示する文字列(既存の本も全部この形式に変更)
         (try_end),
# (set_result_string, "@+1 to {s1} while in inventory"), ←else_try内で処理するので消す

quick_strings.csvにも記述を追加
qstr_+2_to_{s1}_while_in_|所持中は{s1}スキル+2

  • (他の本と同様に商人から買いたい場合)module_troops.pyの書物商人の所持品に本を追加する。


本(読み終えるとスキル上昇するタイプ)

基本的には所持するとスキル上昇するタイプと同様に、既存の処理に追記。
それだけだと実際に読む処理が抜けているので、module_simple_triggers.pyに記述を追加する。

  • module_simple_triggers.pyの # Read books if player is resting.を検索するか、既存の本名で検索、記述を追加する。
      (else_try),
        (eq, "$g_player_reading_book", "itm_book_tactics_1"),←読んでいる本が新規本かどうか
        (troop_raise_skill, "trp_player", "skl_tactics", 3),←どのスキルがいくつ上昇するか
        (str_store_string, s2, "@ Your tactics skill has increased by 3."),←画面に表示する文字列


食べ物


  • module_items.pyに食物の記述を追加する
["oranges","Orange", [("orange_inventory",0)], itp_merchandise|itp_type_goods|itp_consumable|itp_food, 0, 88,weight(20)|abundance(110)|food_quality(40)|max_ammo(100),imodbits_none],
  • ID_items.pyに新規食物のIDと連番を追加する。
  • item_kinds.csvに新規食物の日本語読みを追加する

  • module_scripts.py内のinitialize_item_infoを探し、新規食物の記述を追加する

     (item_set_slot, "itm_apples", slot_item_food_bonus, 4),  ←所持時の士気ボーナス

     (item_set_slot, "itm_oranges", slot_item_urban_demand, 4),  ←各都市ごとの需要?(要検証)
     (item_set_slot, "itm_oranges", slot_item_rural_demand, 4),  ←
     (item_set_slot, "itm_oranges", slot_item_desert_demand, 0),  ←
     (item_set_slot, "itm_oranges", slot_item_production_slot, slot_center_acres_vineyard),  ←種類
     (item_set_slot, "itm_oranges", slot_item_production_string, "str_acres_orchard"),  ←名称
     (item_set_slot, "itm_oranges", slot_item_base_price, 44),  ←基本価格(module_items.pyの販売価格と同一)

※slot_item_production_slot/stringはチートメニューでのみ使われる変数。

  • module_simple_triggers.py内のSetting food bonuses in ~を検索し、新規食物の記述を追加する
     (item_set_slot, "itm_oranges", slot_item_food_bonus, 4), ←士気の上昇量

以下は腐る食べ物を追加する場合
  • module_scripts.py内のgame_get_item_extra_textを探し、新規食物の記述を追加する
         (try_begin),
           (this_or_next|eq, ":item_no", "itm_cattle_meat"),
           (this_or_next|eq, ":item_no", "itm_pork"),
# (eq, ":item_no", "itm_chicken"),
	(this_or_next|eq, ":item_no", "itm_chicken"),
	(eq, ":item_no", "itm_milk"),#Add

  • module_simple_triggers.py内のSetting item modifiers for food を探し、新規食物の記述を追加する
      (troop_get_inventory_slot, ":item_id", "trp_player", ":i_slot"),
      (this_or_next|eq, ":item_id", "itm_cattle_meat"),
      (this_or_next|eq, ":item_id", "itm_chicken"),
# (eq, ":item_id", "itm_pork"),
	(this_or_next|eq, ":item_id", "itm_pork"),
	(eq, ":item_id", "itm_milk"),#Add

以下は必須ではなさそうだが、既存食べ物を処理している箇所に追加する場合
  • module_scripts.py内のcenter_get_productionを探し、新規食物の記述を追加する
	(else_try),
		(eq, ":cur_good", "itm_oranges"), 	 #Demand = 7
		(party_get_slot, ":base_production", ":center_no", slot_center_household_gardens),
		(val_mul, ":base_production", 10),

生産量の設定?(要検証)

  • module_scripts.py内のtown_walker_occupation_string_to_s14を探し、新規食物の記述を追加する
(else_try),
	(eq, ":item", "itm_oranges"),
	(str_store_string, s14, "str_trade_explanation_oranges"),
	(assign, ":check_for_good_price", 1),

町人に「あなたの仕事は?」と訪ねたときの回答

コンパニオンの追加

既存コンパニオンの処理では、1~最後まで連続して記述されていることを想定している処理が多いので、
npc16の後に追加するのを推奨。
ただしその場合、ID_xxx.py の連番もずれるので修正が必要。

例)カトリンをベースにした男性コンパニオン「Alvin」を追加する
  • module_troops.py内のnpc16を探し、その下に新規コンパニオンの記述を追加する
 ["npc11","Alvin","Alvin",←左からID、名前、名前
   tf_hero|tf_unmoveable_in_party_window, 0, reserved,  fac_commoners,←ほぼ固定文、女性なら「tf_female」を追加する
   [itm_javelin,itm_tab_shield_round_a,itm_fighting_axe,itm_nomad_vest,itm_leather_boots],←初期所持品
    str_11|agi_11|int_6|cha_8|level(2),wp(100),knows_warrior_npc|←初期ステータス、初期レベル、熟練度、所持スキル
    knows_weapon_master_2|knows_shield_2|knows_athletics_3|knows_ironflesh_3|knows_power_throw_2,←所持スキル(個別指定)
    0x00000007ff0c15ca3524b1c52b6526c100000000001d5ad60000000000000000],←顔グラ設定
※wp()は数字を全ての武器の熟練度として設定する関数
※knows_warrior_npcは兵士の平均的なスキル設定

  • module_scripts.py内のinitialize_npcsを探し、その下に新規コンパニオンの記述を追加する
       (troop_set_slot, "trp_npc17", slot_troop_morality_type, tmt_egalitarian),←モラルのタイプ ※1
       (troop_set_slot, "trp_npc17", slot_troop_morality_value, 3),←違反行為で溜まる不満
       (troop_set_slot, "trp_npc17", slot_troop_2ary_morality_type, -1),←第2モラルのタイプ、設定なしの場合は-1
       (troop_set_slot, "trp_npc17", slot_troop_2ary_morality_value, 0),←第2モラルの違反行為で溜まる不満
       (troop_set_slot, "trp_npc17", slot_troop_personalityclash_object, "trp_npc6"),←相性の悪いコンパニオン
       (troop_set_slot, "trp_npc17", slot_troop_personalityclash2_object, "trp_npc5"),←相性の悪いコンパニオン
       (troop_set_slot, "trp_npc17", slot_troop_personalitymatch_object, "trp_npc10"),←相性の良いコンパニオン
       (troop_set_slot, "trp_npc17", slot_troop_home, "p_town_2"),←生まれ故郷
       (troop_set_slot, "trp_npc17", slot_troop_payment_request, 100),←雇用に必要な代金
       (troop_set_slot, "trp_npc17", slot_troop_kingsupport_argument, argument_claim),
       (troop_set_slot, "trp_npc17", slot_troop_kingsupport_opponent, "trp_npc15"),←使者になったとき不快に思われるコンパニオン ※2
       (troop_set_slot, "trp_npc17", slot_troop_town_with_contacts, "p_town_2"),←利益をもたらす人物~で使われる街
       (troop_set_slot, "trp_npc17", slot_troop_original_faction, 0), 
       (troop_set_slot, "trp_npc17", slot_lord_reputation_type, lrep_upstanding), ←コンパニオンが諸侯になったときの性格 ※3
※1…
tmt_aristocratic=貴族(戦場からの撤退を嫌う)
tmt_egalitarian=平等主義(多数の死傷者、賃金不足、飢えを嫌う)
tmt_humanitarian=人道主義(農村からの略奪、商人暗殺クエスト、逃亡した農奴を連れ戻すクエストを嫌う)
tmt_honest=正直(借金取り立てクエストで金をくすねる、クエストの失敗全般を嫌う)
モラルタイプごとの不満の蓄積は script_objectionable_action で設定しているので、そちらも参照

※2…slot_troop_kingsupport_opponentは「コンパニオン」が使者になったとき「誰」が不満に思うかの設定であることに注意。
上記例なら「Alvin」が使者になると「Artimenner」が不満に思うが、「Artimenner」が使者になっても「Alvin」は特に不満に思わない。

※3…貴族のコンパニオンは以下から設定
lrep_martial=好戦的
lrep_debauched=残虐
lrep_selfrighteous(pitiless)=無慈悲
lrep_cunning(calculating)=打算的
lrep_quarrelsome=短気
lrep_goodnatured=善良
lrep_upstanding=竹を割ったようにまっすぐ

平民のコンパニオンは以下から設定
lrep_roguish
lrep_benefactor
lrep_custodian

さらに、initialize_npcsの中で下記の記述を探し『16』の部分にコンパニオンを追加した分だけ加算する。
ここを忘れると、コンパニオン勧誘時の字幕がずれてしまう。

   (store_mul, ":string_addition", ":slot_addition", 16),
 ↓
   (store_mul, ":string_addition", ":slot_addition", 17),

  • module_strings.py内のnpc16_xxxを探し、その下に新規コンパニオンの記述を追加する。
文字列の追加が必要なのは下記。(game_strings.csv にも対応する文字列を追加)
str_npc1_intro
str_npc1_intro_response_1
str_npc1_intro_response_2
str_npc1_backstory_a
str_npc1_backstory_b
str_npc1_backstory_c
str_npc1_backstory_later
str_npc1_backstory_response_1
str_npc1_backstory_response_2
str_npc1_signup
str_npc1_signup_2
str_npc1_signup_response_1
str_npc1_signup_response_2
str_npc1_payment
str_npc1_payment_response
str_npc1_morality_speech
str_npc1_2ary_morality_speech
str_npc1_personalityclash_speech
str_npc1_personalityclash_speech_b
str_npc1_personalityclash2_speech
str_npc1_personalityclash2_speech_b
str_npc1_personalitymatch_speech
str_npc1_personalitymatch_speech_b
str_npc1_retirement_speech
str_npc1_rehire_speech
str_npc1_home_intro
str_npc1_home_description
str_npc1_home_description_2
str_npc1_home_recap
str_npc1_honorific
str_npc1_kingsupport_1
str_npc1_kingsupport_2
str_npc1_kingsupport_2a
str_npc1_kingsupport_2b
str_npc1_kingsupport_3
str_npc1_kingsupport_objection
str_npc1_intel_mission
str_npc1_fief_acceptance
str_npc1_woman_to_woman
str_npc1_turn_against 

既存コンパニオンの処理では、まず「str_npc1_xxx」を探してから、その位置から何行下のコンパニオン…という探し方をする。
なので、文字列はソースファイルの最後ではなく、必ず既存コンパニオンの直後に順番どおりに追加する。
ID_xxx.py の連番もずれるので修正が必要。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2016年01月23日 17:04