ショップスクリプトで色んな店を作ろう(伺か・伺的Advent Calendar 2025)
この記事は 伺か・伺的Advent Calendar 2025 の 20 日目の記事です。前日はZichqecさんの「 Summary of 2025 in the Ukagaka Dream Team」でした。初めまして、瑞樹ユラです。普段はサイトでゴーストを配布しています。 ゴースト内で買物がしたい、またはポイントとアイテムを交換したい場面が出てきた時に役立つスクリプトを紹介します。
はじめに
里々で項目を設定するだけで色んなショップを作れるスクリプトを用意しました。改変可能ですのでゴーストに合わせて調整してお使いください。スクリプトのみが欲しい方は目次から飛べます。
-+-- 2
このショップスクリプトでできること
- ユーザ項目を設定するだけ
- ショップ部分は触らなくてOK
簡単な編集をするだけでショップが作れます。コンビニやRPGに登場する道具屋もできますし、アイテムとポイント交換するのもいいでしょう。スクリプトは改変可能ですので、ゴーストに合わせて使用していだだければと思います。
使用例

導入方法
1. 辞書ファイルの作成
里々の辞書ファイルを作成してスクリプトをコピペします。
2. アイテムの登録
アイテム_初期化の中身を編集してアイテムを登録しましょう。 一つのアイテムに必要な項目は: - アイテムID - 表示名 - 価格 - 説明
(call、アイテム_登録、health_potion、体力回復薬、50、HPを50回復する薬)
3. 商品リストの設定
$商品リストに並べたい順にアイテムIDを半角コロン : で区切って記述します。
$商品リスト health_potion:mana_potion:bread
4. カート最大数の設定
$カート最大数にショップで使用するアイテムの上限数を入れます。
$カート最大数 20
5. 初期化処理の追加(重要)
OnFirstBoot、OnBootに以下を記述します。ゴーストにOnGhostChanged、OnGhostCallingがあれば同様にしてください。
*OnFirstBoot (call、アイテム_初期化) (call、プレイヤー_初期化) (call、カート_初期化)
起動2回目以降とゴースト切り替えでは
*OnBoot (call、アイテム_初期化) (call、カート_初期化)
6. ショップの呼び出し
メニューから呼び出す場合のイベント名は Onショップ開始 です。
\q[お店に行く,Onショップ開始]
改変例
例1:通貨単位を変える
@設定_通貨 円
例2:メッセージをカスタマイズ
@設定_メッセージ_挨拶 \s[0]毎度!
例3:ボタンの表記を変える
@増ボタン ➕ @減ボタン ➖
スクリプト
#────────────────────────────────── # 里々ショップシステム(最小構成版) #────────────────────────────────── # # 【使い方】 # 1. アイテム_初期化 の中身を編集してアイテムを登録 # 2. プレイヤー_初期化 で初期所持金を設定 # 3. ダブルクリックでショップを開く # #────────────────────────────────── #@設定_前括弧と@設定_後括弧を組み合わせた【】、設定_メッセージは削除しても動作します。 # #???????????????????????????????????? # アイテム登録(ここを編集してください) #???????????????????????????????????? *アイテム_初期化 #(call、アイテム_登録、アイテムID、表示名、価格、説明) (call、アイテム_登録、health_potion、体力回復薬、50、HPを50回復する薬) (call、アイテム_登録、mana_potion、魔力回復薬、80、MPを30回復する薬) (call、アイテム_登録、bread、パン、10、お腹を満たす基本的な食べ物) (call、アイテム_登録、iron_sword、鉄の剣、300、攻撃力+15の基本的な剣) (call、アイテム_登録、steel_armor、鋼の鎧、500、防御力+20の頑丈な鎧) $商品リスト health_potion:mana_potion:bread:iron_sword:steel_armor $カート最大数 20 @アイテム_登録 (set、アイテム_(A0)_name、(A1))(set、アイテム_(A0)_price、(A2))(set、アイテム_(A0)_desc、(A3)) @設定_通貨 G @設定_個数表示 個 @設定_前括弧 【 @設定_後括弧 】 @増ボタン + @減ボタン - @設定_メッセージ_購入金不足 (お金が足りません) @設定_メッセージ_挨拶 \s[0]いらっしゃいませ! @設定メッセージ_購入 ありがとうございました! #???????????????????????????????????? # プレイヤー設定 #???????????????????????????????????? @プレイヤー_初期化 (set、プレイヤー_G、1000) @プレイヤー_取得_所持金 (when、(is_empty,(プレイヤー_G))==1、0、(プレイヤー_G)) @プレイヤー_支払い可能 (when、(call,プレイヤー_取得_所持金)>=(A0)、1、0) @プレイヤー_支払い (set、現在額、(call,プレイヤー_取得_所持金))(when,(call、プレイヤー_支払い可能、(A0))==1,(set、プレイヤー_G、(calc,(現在額)-(A0)))1,0) @プレイヤー_アイテム追加 (set,現在数,(when、(is_empty,(アイテム_(A0)_持ち数))==1、0、(アイテム_(A0)_持ち数)))(set、アイテム_(A0)_持ち数、(calc,(現在数)+(A1))) #???????????????????????????????????? # カート管理 #???????????????????????????????????? @カート_初期化 (set、カート_アイテム数、0) @カート_クリア (set、終了値、(calc,(カート最大数)-1))(for、0、(終了値)、(set,カート_(C0)_key,)(set,カート_(C0)_quantity,0))(set、カート_アイテム数、0) @カート_検索 (when、(カート_アイテム数)==0、-1、(call,カート_検索_実行,(A0))) @カート_検索_実行 (set,終了値,(calc、(カート_アイテム数)-1))(set,検索結果,-1)(for,0,(終了値),(call、カート_検索_比較、(C0)、(A0)))(検索結果) @カート_検索_比較 (when、(equal,(カート_(A0)_key),(A1))、(set,検索結果,(A0))、) @カート_追加 (set、既存、(call,カート_検索,(A0)))(when、(既存)==-1、(set、カート_(カート_アイテム数)_key、(A0))(set、カート_(カート_アイテム数)_quantity、1)(set、カート_アイテム数、(calc、(カート_アイテム数)+1))、(set、カート_(既存)_quantity、(calc、(カート_(既存)_quantity)+1))) @カート_減少 (set、既存、(call,カート_検索,(A0)))(when、(既存)!=-1、(set,カート_(既存)_quantity,(calc(sprintf,%c,1)(カート_(既存)_quantity)-1))) @カート_取得_数量 (set、idx、(call,カート_検索,(A0)))(when、(idx)==-1、0、(when,(is_empty(sprintf,%c,1)(カート_(idx)_quantity))==1,0,(カート_(idx)_quantity))) @カート_計算_合計 (set、合計金額、0)(when、(カート_アイテム数)>0、(call,カート_計算_合計_実行))(合計金額) @カート_計算_合計_実行 (set、終了値、(calc,(カート_アイテム数)-1))(for、0、(終了値)、(call,カート_合計加算,(C0))) @カート_合計加算 (set、数量、(カート_(A0)_quantity))(when、(数量)>0、(set,価格,(アイテム_(カート_(A0)_key)_price))(set,合計金額,(calc(sprintf,%c,1)(合計金額)+(価格)*(数量)))、) @カート_空確認 (when、(カート_アイテム数)==0、1、(call,カート_空確認_実行)) @カート_空確認_実行 (set,終了値,(calc、(カート_アイテム数)-1))(set,有効数,0)(for,0,(終了値),(call、カート_有効数カウント、(C0)))(when,(有効数)==0,1,0) @カート_有効数カウント (when,(カート_(A0)_quantity)>0,(set,有効数,(calc、(有効数)+1)),) #???????????????????????????????????? # UI表示 #???????????????????????????????????? @UI_ショップ表示 \0\b[2]\\n\n所持金: (call,プレイヤー_取得_所持金)G\n\n(call,UI_商品一覧生成)(call,UI_カート表示)\n\q[店を出る,OnCancel] @UI_商品一覧生成 (nop、(split,(商品リスト),:))(set、終了値、(calc,(Sの数)-1))(set、商品出力、|)(for,0,(終了値),(call、UI_商品行追加、(S(C0))))(erase、(商品出力)、|) @UI_商品行追加 (set、商品出力、(商品出力)(call,UI_商品行生成,(A0))) @UI_商品行生成 (set,カート数,(call、カート_取得_数量、(A0)))\q[(減ボタン),On商品減少,(A0)] \q[(増ボタン),On商品追加,(A0)] (アイテム_(A0)_name) (アイテム_(A0)_price)(設定_通貨)(when、(カート数)>0、(call、判定_ユーザー設定単語群、前括弧)(カート数)(call、判定_ユーザー設定単語群、個数表示)(call、判定_ユーザー設定単語群、後括弧)、)\n @UI_カート表示 (when、(call,カート_空確認)==1、、(call,UI_カート内容表示)) @UI_カート内容表示 (set,合計,(call、カート_計算_合計))\n────────\n合計: (合計)G(when,(call、プレイヤー_支払い可能、(合計))==0,(call、判定_ユーザー設定単語群、メッセージ_購入金不足))\n\n(when,(call、プレイヤー_支払い可能、(合計))==1,\q[購入する,On購入実行]\n,)\q[カートを空にする,Onカートクリア]\n @判定_ユーザー設定単語群 (when、(単語群「設定_(A0)」の存在)==1、(call,単語群_空文字判定,設定_(A0))、) @単語群_空文字判定 (when,(length、設定_(A0))==0,,((A0))) #???????????????????????????????????? # イベント処理 #???????????????????????????????????? @On商品追加 (call、カート_追加、(R0))(UI_ショップ表示) @On商品減少 (call、カート_減少、(R0))(UI_ショップ表示) @Onカートクリア (call、カート_クリア)(UI_ショップ表示) @On購入実行 (set、合計、(call,カート_計算_合計))(when、(call,プレイヤー_支払い,(合計))==1、(call,購入完了処理)、(UI_ショップ表示)) @購入完了処理 (for、0、(calc,(カート_アイテム数)-1)、(call,購入アイテム処理,(C0)))(call、判定_ユーザー設定単語群、メッセージ_購入)\n\n(call、購入内容表示)\n\q[続けて買い物,Onショップ開始]\n\q[店を出る,OnCancel] @購入アイテム処理 (set、数量、(カート_(A0)_quantity))(when、(数量)>0、(call,プレイヤー_アイテム追加,(カート_(A0)_key),(数量))、) @購入内容表示 (set、出力、\0\b[2]\![quicksection,true]購入したもの:\n)(for、0、(calc,(カート_アイテム数)-1)、(when,(カート_(C0)_quantity)>0,(set,出力,(出力)\_u[0x30FB](アイテム_(カート_(C0)_key)_name) (カート_(C0)_quantity)個\n),))(call、カート_クリア)(出力) #???????????????????????????????????? # 起動・メニュー #???????????????????????????????????? *OnFirstBoot (call、アイテム_初期化) (call、プレイヤー_初期化) (call、カート_初期化) \0\s[0]こんにちは!\nダブルクリックでショップを開けるよ。 *OnBoot (call、アイテム_初期化) (call、カート_初期化) \0\s[0]こんにちは!\nダブルクリックでショップを開けるよ。 *OnMouseDoubleClick (call、カート_クリア)(UI_ショップ表示) @Onショップ開始 (call、カート_クリア)(UI_ショップ表示) *OnCancel \s[0]またね。
終わりに
簡単な紹介でしたが、このスクリプトがゴースト作成の一助になれば幸いです。 明日21日目は淀橋さんの「のびのびになってるゴースト設定資料集をなんとかする。」です。ゴーストの設定資料の進捗になります。お楽しみに! それでは、ここまで読んでくださり、ありがとうございました。