code:
;-------------------------------------------------
; ショップメニュー画面
; SHOP_NAME 在庫情報を定義した関数名
; SHOP_MESSAGE 画面に表示する商店の名称
; SHOP_STOCK_ARRAY 購入後の在庫情報を保持するための配列
;                  在庫をセーブデータとして保持したい場合指定
;                  指定する変数はERHファイルに定義したセーブデータ型広域変数である必要がある
;                  (ex.QUEST_14_DIC_SHOP_STOCK_0,フォルメンの露店)
;-------------------------------------------------
@HO_SHOP_MENU(SHOP_NAME, SHOP_MESSAGE = "アイテムの購入", SHOP_STOCK_ARRAY = "")
#DIMS SHOP_NAME
#DIMS SHOP_MESSAGE
#DIMS SHOP_STOCK_ARRAY
#DIM CONST WINDOW_ID = 0
#DIM DYNAMIC LINE_NUM

;初期処理
HO_SHOP_MENU_PAGE_LEFT = 0
HO_SHOP_MENU_SELECT_ITEM_STOCK_IDX = -1
HO_SHOP_MENU_CATEGORY = 0
HO_SHOP_MENU_BUY_AMOUNT = 1
HO_SHOP_MENU_STOCK_ARRAY = %SHOP_STOCK_ARRAY%

HO_SHOP_NAME = %SHOP_NAME%

LINE_NUM = LINECOUNT

WHILE 1
    LINE_NUM = LINECOUNT
    REDRAW 0
    CALL WndMgr_DestroyWindow(-1)
    CALL HO_DRAW_SHOP_MENU_WINDOW_PARENT(SHOP_MESSAGE)
    CALL WndMgr_DisplayAll()
    REDRAW 1
    CALL HO_SHOP_MENU_WINDOW_INPUT()
    IF RESULT == -1
        CLEARLINE LINECOUNT - LINE_NUM
        RETURN -1
    ELSEIF RESULT == 1
        CLEARLINE LINECOUNT - LINE_NUM
        RETURN 1
    ENDIF
    CLEARLINE LINECOUNT - LINE_NUM
WEND

@HO_DRAW_SHOP_MENU_WINDOW_PARENT(SHOP_MESSAGE)
#DIMS SHOP_MESSAGE
#DIM CONST WINDOW_ID = 0
#DIM CONST WND_WIDTH  = 170
#DIM CONST WND_HEIGHT = 44
#DIM DYNAMIC L_CNT
#DIM DYNAMIC BTN_ID

#DIMS DYNAMIC _LIST_MEMBER
#DIM DYNAMIC MEMBER_NUM
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC F_COL, 10

#DIMS DYNAMIC ITEM_NAME
#DIM DYNAMIC ITEM_NUM
#DIM DYNAMIC MATERIAL_NEEDS, ITEM_LENGTH
#DIM DYNAMIC WPN_MATERIAL_NEEDS, WPN_材質種類数, ITEM_LENGTH
#DIMS DYNAMIC WEAPON_NAME
#DIM DYNAMIC 材質種類
#DIM DYNAMIC アイテム種類
#DIM DYNAMIC IS_CRAFTABLE

BTN_ID = HO_アイテムクラフトボタンID

CALL WndMgr_CheckExistWindow()
FINDELEMENT RESULT, WINDOW_ID, 1
IF RESULT == -1
    CALL WndMgr_CreateWindow(WINDOW_ID, 0, 1, WND_WIDTH, WND_HEIGHT, 2)
ELSE
    CALL WndMgr_ResetWindow(WINDOW_ID)
ENDIF

;CATEGORYタブの文字色
VARSET F_COL, カラー_白
F_COL:HO_SHOP_MENU_CATEGORY = カラー_選択中

CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@S:1@@C:{カラー_注釈}@◇　%SHOP_MESSAGE%　◇@/C@@/S@")
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_白}@所持金:%TOSTR(MONEY, "###,###,##0")%　名誉点:%TOSTR(QST_PRESTIGE_POINT, "###,##0")%　淫堕点:%TOSTR(QST_LEWD_POINT, "###,##0")%@/C@")

CALL HO_DRAW_SHOP_MENU_WINDOW_LEFT()
SELECTCASE HO_SHOP_MENU_CATEGORY
    CASE 0
        CALL HO_DRAW_SHOP_MENU_WINDOW_RIGHT()
    CASEELSE
ENDSELECT

;フッター出力
;-------------------------------------------------
L_CNT = WND_HEIGHT - 4
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@B:9999999@@C:{カラー_白}@[キャンセル]@/C@@/B@")

RETURN

@HO_DRAW_SHOP_MENU_WINDOW_LEFT(MODULE_ID)
#DIM MODULE_ID
#DIM CONST WINDOW_ID = 1
#DIM CONST WND_WIDTH  = 64
#DIM CONST WND_HEIGHT = 37
#DIM DYNAMIC L_CNT
#DIM DYNAMIC F_COL, 10

;CATEGORYタブの文字色
VARSET F_COL, カラー_白
F_COL:HO_SHOP_MENU_CATEGORY = カラー_選択中

;ウィンドウ作成
CALL WndMgr_CreateWindow(WINDOW_ID, 2, 5, WND_WIDTH, WND_HEIGHT, 2)
CALL WndMgr_Attribute(WINDOW_ID, "BorderColor", カラー_選択不可)

;ヘッダー
;-------------------------------------------------
;SHOP_ID = 1はギルドの名誉点引き換え用
IF HO_SHOP_NAME == "ギルドショップ"
    LOCALS '= @"@C:{F_COL:0}@@B:0@[Item]@/B@@/C@"
    ;LOCALS += @"@C:{F_COL:1}@@B:1@　[Area]@/B@@/C@"
    ;LOCALS += @"@C:{F_COL:2}@@B:2@　[Equipment]@/B@@/C@"
    ;LOCALS += @"@C:{カラー_選択不可}@　[Quest]@/C@"
ENDIF
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, LOCALS)
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
;-------------------------------------------------

SELECTCASE HO_SHOP_MENU_CATEGORY
        ;アイテム
    CASE 0 TO 2,5
        CALL HO_DRAW_SHOP_MENU_WINDOW_PRINT_DETAIL_ITEM(WINDOW_ID)
        ;武器
    CASEELSE
ENDSELECT

@HO_DRAW_SHOP_MENU_WINDOW_RIGHT(MODULE_ID)
#DIM MODULE_ID
#DIM CONST WINDOW_ID = 2
#DIM CONST WND_WIDTH  = 102
#DIM CONST WND_HEIGHT = 37
#DIM CONST ヘッダー行数 = 2
#DIM CONST BTN_ID = 2000
#DIM DYNAMIC L_CNT
#DIM DYNAMIC F_COL
#DIM DYNAMIC ERR_FLG

;アイテム関連
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC ITEM_ID
#DIM  DYNAMIC ASSET
#DIM  DYNAMIC PRICE
#DIMS DYNAMIC STR_ITEM_PRICE
#DIM  DYNAMIC SELL_TYPE
#DIMS DYNAMIC DICS_SHOP_STOCK, MAX_SHOP_STOCKNUM
#DIM  DYNAMIC STOCK_IDX
#DIM  DYNAMIC ITEM_NUM
#DIM  DYNAMIC ITEM_CAN_BUY = 0
#DIM  DYNAMIC SHOP_STOCK
#DIM  DYNAMIC STOCK_LIMITED_FLAG
;武器関連
#DIM  DYNAMIC WEAPON_RANK
#DIM  DYNAMIC MATERIAL
#DIM  DYNAMIC EQUIP_TYPE
#DIM  DYNAMIC CLOTH_PART
;スキル関連
#DIMS DYNAMIC LIST_SKILL
#DIMS DYNAMIC SKILL_DEF_NAME
#DIM  DYNAMIC SKILL_LV
#DIMS DYNAMIC TOOLTIP
#DIMS DYNAMIC STR_SKILL
#DIM  DYNAMIC SKILL_GENRE

;ウィンドウ作成
CALL WndMgr_CreateWindow(WINDOW_ID, 66, 5, WND_WIDTH, WND_HEIGHT, 2)
CALL WndMgr_Attribute(WINDOW_ID, "BorderColor", カラー_選択不可)
SIF HO_SHOP_MENU_SELECT_ITEM_STOCK_IDX == -1
    RETURN

STOCK_IDX = HO_SHOP_MENU_SELECT_ITEM_STOCK_IDX
IF STOCK_IDX >= 1000000
    STOCK_IDX -= 1000000
ENDIF

CALL HO_SHOP_MANAGE_GET_STOCK(HO_SHOP_NAME, DICS_SHOP_STOCK)
ITEM_ID = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "ITEM_ID"))
;価格,ショップ側で定義していればそちらを優先する
IF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "ITEM_PRICE")
    PRICE = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "ITEM_PRICE"))
ELSE
    CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
    PRICE = RESULT
ENDIF

IF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "ITEM_ID")
    CALL GET_ITEM_NAME(ITEM_ID)
    ITEM_NAME = %RESULTS%
ELSEIF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "CLOTH_ID")
    ITEM_ID = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "CLOTH_ID"))
    CLOTH_PART = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "CLOTH_PART"))
    CALL GET_CLOTH_NAME(CLOTH_PART, ITEM_ID)
    ITEM_NAME = %RESULTS%
ELSEIF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "WEAPON_ID")
    ITEM_ID = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "WEAPON_ID"))
    WEAPON_RANK = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "WEAPON_RANK"))
    EQUIP_TYPE = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "EQUIP_TYPE"))
    MATERIAL = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "MATERIAL"))
    ITEM_NAME = %DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "WEAPON_NAME")%%WEAPON_RANK > 0 ? @" +{WEAPON_RANK}" # ""%
    CALL GET_WEAPON_STATUS(ITEM_ID, MATERIAL, EQUIP_TYPE, WEAPON_RANK)
ELSEIF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "RUNE_ID")
    SKILL_DEF_NAME = %DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "RUNE_ID")%
    SKILL_LV = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "RUNE_LV"))
    SKILL_GENRE = WPN_SKILL_GET_GENRE(SKILL_DEF_NAME)
    CALL SKILL_GET_NAME(SKILL_GENRE, SKILL_DEF_NAME, 1)
    ITEM_NAME = %RESULTS%
    ITEM_NAME '= @"付呪のルーン:<%ITEM_NAME%Lv{SKILL_LV}>"
ENDIF

;ヘッダー
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@S:1@@C:{カラー_注釈}@◇　%ITEM_NAME%　◇@/C@@/S@")
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))

IF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "ITEM_ID")
    ;概要欄
    VARSET RESULTS
    FOR LOCAL, 0, 10
        TRYCALLFORM GET_ITEM_DESCRIPTION_{ITEM_ID}
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"　%RESULTS:LOCAL%")
    NEXT
    ;備考欄
    L_CNT++
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@S:1@@C:{カラー_注釈}@◇　備考　◇@/S@@/C@")
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))

    VARSET RESULTS
    FOR LOCAL, 0, 10
        TRYCALLFORM GET_ITEM_SUBDESCRIPTION_{ITEM_ID}
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"　%RESULTS:LOCAL%")
    NEXT
    ;販売タイプ取得
    CALL GET_ITEM_INFO(ITEM_ID,ITEM_SELL_TYPE)
    SELL_TYPE = RESULT
    ;販売物が衣装の場合
ELSEIF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "CLOTH_ID")
    ;概要欄
    VARSET RESULTS
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_注釈}@・【衣装】@/C@")
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_白}@　衣装装着部位:%CLOTH_PART_NAME:CLOTH_PART%@/C@")
    ;販売物が武器、レリックの場合
ELSEIF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "WEAPON_ID")
    ;ステータス欄
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_注釈}@・%EQUIP_TYPE == 0 ? "【武器】" # "【レリック】"%@/C@")
    L_CNT ++
    LOCALS '= ""
    FOR LOCAL, 0, WPN_MAX_STATUSNUM
        IF LOCAL != WPN_脅威選定
            LOCALS += TAG_PRINT_SHAPE(@"@C:{カラー_白}@%WPN_STATUS_NAME:LOCAL%:{WPN_STATUS:LOCAL}@/C@", 16, 1)
        ELSE
            SIF !EQUIP_TYPE
                LOCALS += TAG_PRINT_SHAPE(@"@C:{カラー_白}@%WPN_STATUS_NAME:LOCAL%:%WPN_脅威選定文字列:(WPN_STATUS:LOCAL)%@/C@", 16, 1)
        ENDIF
    NEXT
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"　%LOCALS%")
    L_CNT ++
    ;付与されているスキル
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_注釈}@・【装備スキル】@/C@")
    ;パッシブスキル
    LIST_SKILL = %DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "PASSIVE_WEAPON_SKILL")%
    IF LIST_SKILL != ""
        LOCALS '= ""
        FOR LOCAL, 0, LIST_COUNT(LIST_SKILL)
            IF LOCAL == 0 || LOCAL % 2 == 0
                SKILL_DEF_NAME = %LIST_GET(LIST_SKILL, LOCAL)%
            ELSE
                SKILL_LV = TOINT(LIST_GET(LIST_SKILL, LOCAL))
                CALL GET_SKILL_DESC(SKILL_DEF_NAME, 武器スキル_パッシブ, SKILL_LV, 1)
                TOOLTIP = %RESULTS%
                LOCALS += @"@B:DUMMY$%TOOLTIP%@<%GET_WPN_SKILL_NAME(SKILL_DEF_NAME, 武器スキル_パッシブ)%Lv{SKILL_LV}> @/B@"
            ENDIF
        NEXT
        STR_SKILL '= @"@C:{カラー_黄緑}@%LOCALS%@/C@"
    ENDIF
    ;アクティブスキル
    LIST_SKILL = %DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "ACTIVE_WEAPON_SKILL")%
    IF LIST_SKILL != ""
        LOCALS '= ""
        FOR LOCAL, 0, LIST_COUNT(LIST_SKILL)
            IF LOCAL == 0 || LOCAL % 2 == 0
                SKILL_DEF_NAME = %LIST_GET(LIST_SKILL, LOCAL)%
            ELSE
                SKILL_LV = TOINT(LIST_GET(LIST_SKILL, LOCAL))
                CALL GET_SKILL_DESC(SKILL_DEF_NAME, 武器スキル_アクティブ, SKILL_LV, 1)
                TOOLTIP = %RESULTS%
                LOCALS += @"@B:DUMMY$%TOOLTIP%@<%GET_WPN_SKILL_NAME(SKILL_DEF_NAME, 武器スキル_アクティブ)%Lv{SKILL_LV}> @/B@"
            ENDIF
        NEXT
        STR_SKILL += @"@C:{カラー_オレンジ}@%LOCALS%@/C@"
    ENDIF
    ;販売タイプ取得
    SELL_TYPE = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "ITEM_SELL_TYPE"))
ELSEIF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "RUNE_ID")
    ;概要欄
    VARSET RESULTS
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_注釈}@・【付呪のルーン】@/C@")
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_白}@　クラフト時に付呪枠がある武器に対して用いることでスキルを付与することが出来る@/C@")
    L_CNT++
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_注釈}@・【スキル効果】@/C@")
    CALL GET_SKILL_DESC(SKILL_DEF_NAME, SKILL_GENRE, SKILL_LV, 1)
    LOCALS = %HTML_TOPLAINTEXT(RESULTS)%
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"%LOCALS%")
    ;アクティブスキルならクールタイムも表示
    IF SKILL_GENRE == 武器スキル_アクティブ
        CALL WPN_SKILL_GET_COOLTIME(SKILL_DEF_NAME, SKILL_LV)
        LOCALS = %TOSTR(RESULT)%
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_白}@・クールタイム:%LOCALS%@/C@")
    ENDIF
ENDIF
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"　%STR_SKILL%")

;フッター
;-------------------------------------------------
;アイテムデータ取得
IF SELL_TYPE == 0
    ASSET = MONEY
ELSEIF SELL_TYPE == 1
    ASSET = QST_PRESTIGE_POINT
ELSEIF SELL_TYPE == 2
    ASSET = QST_LEWD_POINT
ENDIF
HO_SHOP_MENU_SUM_PRICE = PRICE * HO_SHOP_MENU_BUY_AMOUNT
IF HO_SHOP_MENU_STOCK_ARRAY != ""
    IF DIC_CONTAINSKEY(GETVARS(HO_SHOP_MENU_STOCK_ARRAY + @":{STOCK_IDX}"), "SHOP_STOCK")
        SHOP_STOCK = TOINT(DIC_GET(GETVARS(HO_SHOP_MENU_STOCK_ARRAY + @":{STOCK_IDX}"), "SHOP_STOCK"))
        STOCK_LIMITED_FLAG = 1
    ENDIF
ENDIF

;購入情報出力
L_CNT = WND_HEIGHT - 9
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_選択不可}@―@/C@" * ((WND_WIDTH / 2) - 2))
LOCALS '= ""
IF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "ITEM_ID")
    LOCALS '= "所持数: "
    LOCALS += @" %TOSTR(HO_ITEM_STOCK:ITEM_ID, "#0")%　　　"
ELSEIF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "CLOTH_ID")
    LOCALS '= "所持数: "
    LOCALS += @" %TOSTR(HAVE_CLOTH:CLOTH_PART:ITEM_ID, "#0")%　　　"
ENDIF
LOCALS += "商店在庫: "
IF SHOP_STOCK >= 0 && STOCK_LIMITED_FLAG
    LOCALS += @" %TOSTR(SHOP_STOCK, "#0")%"
ELSEIF !STOCK_LIMITED_FLAG
    LOCALS += @" 無制限"
ENDIF
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@C:{カラー_注釈}@%LOCALS%@/C@")
LOCALS '= "購入数: "
LOCALS += @" %TOSTR(HO_SHOP_MENU_BUY_AMOUNT, "##")% "
LOCALS = %TAG_PRINT_SHAPE(LOCALS, 15, 1, 0)%
IF HO_SHOP_MENU_BUY_AMOUNT > 1
    LOCALS += @"@B:20@[-5]@/B@"
ELSE
    LOCALS += @"@C:{カラー_選択不可}@[-5]@/C@"
ENDIF
IF HO_SHOP_MENU_BUY_AMOUNT > 1
    LOCALS += @"@B:21@[-1]@/B@"
ELSE
    LOCALS += @"@C:{カラー_選択不可}@[-1]@/C@"
ENDIF
IF ASSET >= (HO_SHOP_MENU_BUY_AMOUNT + 1) * PRICE && ((STOCK_LIMITED_FLAG && SHOP_STOCK > 0) || !STOCK_LIMITED_FLAG)
    LOCALS += @"@B:22@[+1]@/B@"
ELSE
    LOCALS += @"@C:{カラー_選択不可}@[+1]@/C@"
ENDIF
IF ASSET >= (HO_SHOP_MENU_BUY_AMOUNT + 5) * PRICE && ((STOCK_LIMITED_FLAG && SHOP_STOCK > 0) || !STOCK_LIMITED_FLAG)
    LOCALS += @"@B:23@[+5]@/B@"
ELSE
    LOCALS += @"@C:{カラー_選択不可}@[+5]@/C@"
ENDIF
CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"%LOCALS%")

IF STOCK_LIMITED_FLAG && SHOP_STOCK <= 0
    L_CNT ++
    CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"在庫がありません")
ELSE
    IF SELL_TYPE == 0
        IF ASSET >= HO_SHOP_MENU_SUM_PRICE
            L_CNT ++
            CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"　所持金:%TOSTR(MONEY,"###,###,##0")%　→　@C:{カラー_オレンジ}@%TOSTR(MONEY - HO_SHOP_MENU_SUM_PRICE,"###,###,##0")% (-%TOSTR(HO_SHOP_MENU_SUM_PRICE, "#,##0")%)@/C@")
            L_CNT ++
            CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@B:{BTN_ID + ITEM_ID}@@C:{カラー_白}@[購入する]@/C@@/B@")
        ELSE
            L_CNT ++
            CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"所持金が足りません")
        ENDIF
    ELSEIF SELL_TYPE == 1
        IF ASSET >= HO_SHOP_MENU_SUM_PRICE
            L_CNT ++
            CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"　名誉点:%TOSTR(QST_PRESTIGE_POINT,"###,###,##0")%　→　@C:{カラー_オレンジ}@%TOSTR(QST_PRESTIGE_POINT - HO_SHOP_MENU_SUM_PRICE,"###,###,##0")% (-%TOSTR(HO_SHOP_MENU_SUM_PRICE, "#,##0")%)@/C@")
            L_CNT ++
            CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@B:{BTN_ID + ITEM_ID}@@C:{カラー_白}@[購入する]@/C@@/B@")
        ELSE
            L_CNT ++
            CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"名誉点が足りません")
        ENDIF
    ELSEIF SELL_TYPE == 2
        IF ASSET >= HO_SHOP_MENU_SUM_PRICE
            L_CNT ++
            CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"　淫堕点:%TOSTR(QST_LEWD_POINT,"###,###,##0")%　→　@C:{カラー_オレンジ}@%TOSTR(QST_LEWD_POINT - HO_SHOP_MENU_SUM_PRICE,"###,###,##0")% (-%TOSTR(HO_SHOP_MENU_SUM_PRICE, "#,##0")%)@/C@")
            L_CNT ++
            CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"@B:{BTN_ID + ITEM_ID}@@C:{カラー_白}@[購入する]@/C@@/B@")
        ELSE
            L_CNT ++
            CALL WndMgr_TextSet(WINDOW_ID, L_CNT++, @"淫堕点が足りません")
        ENDIF
    ENDIF
ENDIF

;-------------------------------------------------
;アイテム明細リスト
;-------------------------------------------------
@HO_DRAW_SHOP_MENU_WINDOW_PRINT_DETAIL_ITEM(WINDOW_ID)
#DIM WINDOW_ID
#DIM CONST HEADER_NUM = 2
#DIM CONST MAX_ROW = 20
#DIM CONST BTN_ID = 1000000

#DIM  DYNAMIC WND_WIDTH
#DIMS DYNAMIC DETAIL_LIST, ITEM_LENGTH
#DIM  DYNAMIC ITEM_NUM
#DIMS DYNAMIC STR_ITEM_NUM
#DIM  DYNAMIC L_CNT
#DIM  DYNAMIC PAGE_NUM
#DIMS DYNAMIC STR_FOOTER
#DIM  DYNAMIC DETAIL_LINECOUNT
;アイテム関連
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC ITEM_ID
#DIM  DYNAMIC STOCK_IDX
#DIM  DYNAMIC PRICE
#DIMS DYNAMIC STR_ITEM_PRICE
#DIM  DYNAMIC SELL_TYPE
#DIMS DYNAMIC DICS_SHOP_STOCK, MAX_SHOP_STOCKNUM
;武器関連
#DIM  DYNAMIC WEAPON_RANK
#DIM  DYNAMIC MATERIAL
#DIM  DYNAMIC EQUIP_TYPE
;衣装
#DIM  DYNAMIC CLOTH_PART

;明細リスト作成
;-------------------------------------------------
DETAIL_LINECOUNT = 0
L_CNT = 0
FOR STOCK_IDX, 0, MAX_SHOP_STOCKNUM
    ;商店在庫取得
    VARSET DICS_SHOP_STOCK
    CALL HO_SHOP_MANAGE_GET_STOCK(HO_SHOP_NAME, DICS_SHOP_STOCK)
    SIF DICS_SHOP_STOCK:STOCK_IDX == ""
        CONTINUE

    IF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "SHOP_STOCK")
        SIF !TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "SHOP_STOCK"))
            CONTINUE
    ENDIF
    ;アイテムデータ取得
    IF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "ITEM_ID")
        ITEM_ID = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "ITEM_ID"))
        CALL GET_ITEM_INFO(ITEM_ID, ITEM_SELL_TYPE)
        SELL_TYPE = RESULT
        CALL GET_ITEM_NAME(ITEM_ID)
        ITEM_NAME = %RESULTS%
    ELSEIF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "CLOTH_ID")
        ITEM_ID =  TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "CLOTH_ID"))
        CLOTH_PART = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "CLOTH_PART"))
        CALL GET_CLOTH_NAME(CLOTH_PART, ITEM_ID)
        ITEM_NAME = %RESULTS%
    ELSEIF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "WEAPON_ID")
        ITEM_ID   = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "WEAPON_ID"))
        SELL_TYPE = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "SELL_TYPE"))
        WEAPON_RANK = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "WEAPON_RANK"))
        ITEM_NAME = %DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "WEAPON_NAME")%%WEAPON_RANK > 0 ? @" +{WEAPON_RANK}" # ""%
    ELSEIF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "RUNE_ID")
        VARS SKILL_DEF_NAME
        VARS SKILL_NAME
        VARI SKILL_LV
        VARI GENRE

        SKILL_DEF_NAME = %DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "RUNE_ID")%
        SKILL_LV = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "RUNE_LV"))
        GENRE = WPN_SKILL_GET_GENRE(SKILL_DEF_NAME)
        CALL SKILL_GET_NAME(GENRE, SKILL_DEF_NAME, 1)
        SKILL_NAME = %RESULTS%
        ITEM_NAME '= @"ﾙｰﾝ:<%SKILL_NAME%Lv{SKILL_LV}>"

    ENDIF
    ITEM_NAME = %TAG_PRINT_SHAPE(ITEM_NAME, 15, 1, 0)%
    ;価格,ショップ側で定義していればそちらを優先する
    IF DIC_CONTAINSKEY(DICS_SHOP_STOCK:STOCK_IDX, "ITEM_PRICE")
        PRICE = TOINT(DIC_GET(DICS_SHOP_STOCK:STOCK_IDX, "ITEM_PRICE"))
    ELSE
        CALL GET_ITEM_INFO(ITEM_ID, ITEM_PRICE)
        PRICE = RESULT
    ENDIF

    STR_ITEM_PRICE = %TAG_PRINT_SHAPE(TOSTR(PRICE, "###,##0"), 8, 1, 0)%
    ;明細出力
    DETAIL_LIST:DETAIL_LINECOUNT '= @"@B:{BTN_ID + STOCK_IDX}@@C:{カラー_白}@[%ITEM_NAME%] … %STR_ITEM_PRICE%@/C@@/B@"
    DETAIL_LIST:DETAIL_LINECOUNT = %TAG_PRINT_SHAPE(DETAIL_LIST:DETAIL_LINECOUNT, 28, 1, 0)%
    DETAIL_LINECOUNT ++
NEXT
PAGE_NUM = DETAIL_LINECOUNT / MAX_ROW

;明細リスト出力
;-------------------------------------------------
L_CNT = 0
FOR LOCAL, MAX_ROW * HO_SHOP_MENU_PAGE_LEFT, MAX_ROW * (HO_SHOP_MENU_PAGE_LEFT + 1)
    IF  L_CNT / MAX_ROW <= 0
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT + HEADER_NUM, DETAIL_LIST:LOCAL)
        L_CNT++
    ELSE
        CALL WndMgr_TextAdd(WINDOW_ID, (L_CNT % MAX_ROW) + HEADER_NUM, DETAIL_LIST:LOCAL)
        L_CNT ++
    ENDIF
    L_CNT ++
NEXT

;フッター
;-------------------------------------------------
CALL WndMgr_GetRectangle(WINDOW_ID)
WND_WIDTH = RESULT:2

IF PAGE_NUM > 0
    STR_FOOTER += HO_SHOP_MENU_PAGE_LEFT > 0 ? @"@B:9000@<<@/B@ " # "   "
    STR_FOOTER += @"%TOSTR(HO_SHOP_MENU_PAGE_LEFT + 1, "..")% "
    STR_FOOTER += HO_SHOP_MENU_PAGE_LEFT != PAGE_NUM ? @"@B:9001@>>@/B@" # "  "
    CALLF TAG_PRINT_SHAPE(STR_FOOTER, WND_WIDTH - 8, 1, 2)
    CALL WndMgr_TextSet(WINDOW_ID, MAX_ROW + 2, @"@C:{カラー_注釈}@%RESULTS%@/C@")
ENDIF

@HO_SHOP_MENU_WINDOW_INPUT(MODULE_ID)
#DIM MODULE_ID
#DIM DYNAMIC ITEM_ID
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC SELL_TYPE
#DIM  DYNAMIC STOCK_IDX
#DIM  DYNAMIC SHOP_STOCK
#DIM  DYNAMIC MATERIAL_NEEDS, ITEM_LENGTH
#DIM  DYNAMIC WEAPON_ID
#DIM  DYNAMIC WEAPON_RANK
#DIM  DYNAMIC WPN_MATERIAL_NEEDS, WPN_材質種類数, ITEM_LENGTH
#DIMS DYNAMIC STOCK_ARRAY
#DIMS DYNAMIC DIC_STOCK_DATA
#DIM  DYNAMIC CLOTH_PART
#DIMS DYNAMIC DICS_SHOP_STOCK, MAX_SHOP_STOCKNUM

STOCK_IDX = HO_SHOP_MENU_SELECT_ITEM_STOCK_IDX
SHOP_STOCK = -1
;商店在庫取得
IF HO_SHOP_MENU_STOCK_ARRAY != "" && STOCK_IDX != -1
    STOCK_ARRAY '= @"%HO_SHOP_MENU_STOCK_ARRAY%:{STOCK_IDX}"
    DIC_STOCK_DATA = %GETVARS(STOCK_ARRAY)%
    IF DIC_CONTAINSKEY(DIC_STOCK_DATA, "SHOP_STOCK")
        SHOP_STOCK = TOINT(DIC_GET(DIC_STOCK_DATA, "SHOP_STOCK"))
    ENDIF
ELSEIF STOCK_IDX != -1
    ;セーブされる有限の在庫がない場合は通常の在庫情報を読み出し
    CALL HO_SHOP_MANAGE_GET_STOCK(HO_SHOP_NAME, DICS_SHOP_STOCK)
    DIC_STOCK_DATA = %DICS_SHOP_STOCK:STOCK_IDX%
ENDIF

;入力受付
ONEINPUT
CLEARLINE 1
PRINTL

;キャンセルボタン
IF RESULT == 9999999
    RETURN -1
ELSEIF INRANGE(RESULT, 0, 6)
    STOCK_IDX = -1
    HO_SHOP_MENU_CATEGORY = RESULT
    ;購入数増減
ELSEIF INRANGE(RESULT, 20,23)
    SELECTCASE RESULT
        CASE 20
            HO_SHOP_MENU_BUY_AMOUNT = MAX(1, HO_SHOP_MENU_BUY_AMOUNT - 5)
        CASE 21
            HO_SHOP_MENU_BUY_AMOUNT = MAX(1, HO_SHOP_MENU_BUY_AMOUNT - 1)
        CASE 22
            HO_SHOP_MENU_BUY_AMOUNT = MIN(99, HO_SHOP_MENU_BUY_AMOUNT + 1)
        CASE 23
            HO_SHOP_MENU_BUY_AMOUNT = MIN(99, HO_SHOP_MENU_BUY_AMOUNT + 5)
    ENDSELECT
    IF HO_SHOP_MENU_BUY_AMOUNT > SHOP_STOCK && SHOP_STOCK != -1
        HO_SHOP_MENU_BUY_AMOUNT = SHOP_STOCK
    ENDIF
    ;購入アイテム選択
ELSEIF INRANGE(RESULT, 2000, 2999)
    ITEM_ID = RESULT - 2000
    IF DIC_CONTAINSKEY(DIC_STOCK_DATA, "ITEM_ID")
        CALL GET_ITEM_INFO(ITEM_ID,ITEM_SELL_TYPE)
        SELL_TYPE = RESULT
        CALL GET_ITEM_NAME(ITEM_ID)
        ITEM_NAME = %RESULTS%
        CALL CHANGE_ITEM_STOCK(ITEM_ID, HO_SHOP_MENU_BUY_AMOUNT)
    ELSEIF DIC_CONTAINSKEY(DIC_STOCK_DATA, "CLOTH_ID")
        CLOTH_PART = TOINT(DIC_GET(DIC_STOCK_DATA, "CLOTH_PART"))
        CALL GET_CLOTH_NAME(CLOTH_PART, ITEM_ID)
        ITEM_NAME = %RESULTS%
        SELL_TYPE = TOINT(DIC_GET(DIC_STOCK_DATA, "ITEM_SELL_TYPE"))
        CALL CHANGE_CLOTH_STOCK(CLOTH_PART, ITEM_ID, HO_SHOP_MENU_BUY_AMOUNT)
    ELSEIF DIC_CONTAINSKEY(DIC_STOCK_DATA, "WEAPON_ID")
        WEAPON_RANK = TOINT(DIC_GET(DIC_STOCK_DATA, "WEAPON_RANK"))
        ITEM_NAME = %DIC_GET(DIC_STOCK_DATA, "WEAPON_NAME")%%WEAPON_RANK > 0 ? @" +{WEAPON_RANK}" # ""%
        FOR LOCAL, 0, HO_SHOP_MENU_BUY_AMOUNT
            CALL QST_GET_EQUIP(DIC_STOCK_DATA, 0)
        NEXT
        SELL_TYPE = TOINT(DIC_GET(DIC_STOCK_DATA, "ITEM_SELL_TYPE"))
    ELSEIF DIC_CONTAINSKEY(DIC_STOCK_DATA, "RUNE_ID")
        VARS SKILL_DEF_NAME
        VARS SKILL_NAME
        VARI SKILL_GENRE
        VARI SKILL_LV
        SKILL_DEF_NAME = %DIC_GET(DIC_STOCK_DATA, "RUNE_ID")%
        SKILL_LV = TOINT(DIC_GET(DIC_STOCK_DATA, "RUNE_LV"))
        SKILL_GENRE = WPN_SKILL_GET_GENRE(SKILL_DEF_NAME)
        CALL SKILL_GET_NAME(SKILL_GENRE, SKILL_DEF_NAME, 1)
        ITEM_NAME '= @"ルーン:<%RESULTS%Lv{SKILL_LV}>"
        CALL RUNE_STOCK_CHANGE(SKILL_DEF_NAME, SKILL_LV, HO_SHOP_MENU_BUY_AMOUNT)
        SELL_TYPE = TOINT(DIC_GET(DIC_STOCK_DATA, "ITEM_SELL_TYPE"))
    ENDIF
    IF SELL_TYPE == 0
        MONEY -= HO_SHOP_MENU_SUM_PRICE
    ELSEIF SELL_TYPE == 1
        QST_PRESTIGE_POINT -= HO_SHOP_MENU_SUM_PRICE
    ELSEIF SELL_TYPE == 2
        QST_LEWD_POINT -= HO_SHOP_MENU_SUM_PRICE
    ENDIF
    ;参照元変数に変更した商店在庫を格納
    IF SHOP_STOCK != -1
        DIC_STOCK_DATA = %DIC_SET(DIC_STOCK_DATA, "SHOP_STOCK", TOSTR(SHOP_STOCK - HO_SHOP_MENU_BUY_AMOUNT))%
        SETVAR STOCK_ARRAY, DIC_STOCK_DATA
    ENDIF
    CALL FL_PLAYSE("Money_0.mp3")
    CALLF TAG_PRINT(@"%ITEM_NAME%を@C:{カラー_緑}@{HO_SHOP_MENU_BUY_AMOUNT}@/C@入手しました", 1)
    WAIT
    CLEARLINE 1
    ;商店在庫が有限で、購入した結果現在の購入数が在庫を上回る場合は購入数を調整
    IF SHOP_STOCK != -1
        SIF SHOP_STOCK - HO_SHOP_MENU_BUY_AMOUNT < HO_SHOP_MENU_BUY_AMOUNT
            HO_SHOP_MENU_BUY_AMOUNT = SHOP_STOCK - HO_SHOP_MENU_BUY_AMOUNT
    ENDIF
    ;衣装部位タブ切り替え
ELSEIF  HO_SHOP_MENU_CATEGORY == 2 && INRANGE(RESULT, 1000, 1999)
    HO_ITEM_CRAFT_SELECT_CLOTH_PARTS = RESULT - 1000
    HO_SHOP_MENU_PAGE_LEFT = 0
    RETURN
    ;ページ処理
ELSEIF INRANGE(RESULT, 9000, 9001)
    IF RESULT == 9000
        HO_SHOP_MENU_PAGE_LEFT --
    ELSE
        HO_SHOP_MENU_PAGE_LEFT ++
    ENDIF
ELSEIF INRANGE(RESULT, 1000000, 2999999)
    ;クラフト可能なアイテム ITEM_ID + 1000000, クラフト不可能なアイテム ITEM_ID + 2000000
    HO_SHOP_MENU_BUY_AMOUNT = 1
    HO_SHOP_MENU_SELECT_ITEM_STOCK_IDX = (RESULT - 1000000)
    RETURN
ENDIF

@HO_DRAW_SHOP_MENU_WINDOW_PRINT_DETAIL(WINDOW_ID, MODULE_ID)
#DIM WINDOW_ID
#DIM MODULE_ID
#DIM CONST HEADER_NUM = 2
#DIM CONST MAX_ROW = 20
#DIM CONST BTN_ID = 1000000

#DIM  DYNAMIC WND_WIDTH
#DIMS DYNAMIC DETAIL_LIST, ITEM_LENGTH
#DIM  DYNAMIC ITEM_NUM
#DIM  DYNAMIC L_CNT
#DIM  DYNAMIC PAGE_NUM
#DIMS DYNAMIC STR_FOOTER
#DIM  DYNAMIC DETAIL_LINECOUNT
;アイテム関連
#DIMS DYNAMIC ITEM_NAME
#DIM DYNAMIC WPN_MATERIAL_NEEDS, WPN_材質種類数, ITEM_LENGTH
#DIM  DYNAMIC ITEM_ID
#DIM  DYNAMIC IS_CRAFTABLE
#DIM  DYNAMIC 材質種類
#DIM  DYNAMIC 素材アイテム

;明細リスト作成
DETAIL_LINECOUNT = 0
L_CNT = 0
FOR ITEM_ID, 0, WPN_MAX_WEAPONNUM
    CALL CHECK_WEAPON_CRAFTABLE(ITEM_ID, MODULE_ID)
    SIF RESULT == -1
        CONTINUE
    FOR 材質種類, 0, WPN_材質種類数
        CALL GET_WEAPON_MATERIAL_NEEDS(ITEM_ID, 材質種類, WPN_MATERIAL_NEEDS)
        IF RESULT != -1
            IS_CRAFTABLE = -1
            FOR 素材アイテム, 0, ITEM_LENGTH
                ;アイテム在庫が要求を満たさない場合、表示はするが作成は不可に
                IF WPN_MATERIAL_NEEDS:材質種類:素材アイテム > 0 && (HO_ITEM_STOCK:素材アイテム < WPN_MATERIAL_NEEDS:材質種類:素材アイテム)
                    IS_CRAFTABLE = 0
                ENDIF
            NEXT
            CALL GET_WEAPON_NAME(ITEM_ID)
            ITEM_NAME = %RESULTS%
            IF IS_CRAFTABLE
                DETAIL_LIST:DETAIL_LINECOUNT '= @"@B:{BTN_ID + ITEM_ID + (材質種類 * 1000)}@@C:{カラー_白}@[%WPN_材質別接頭文字:材質種類%の%ITEM_NAME%]@/C@@/B@"
            ELSE
                DETAIL_LIST:DETAIL_LINECOUNT '= @"@B:{BTN_ID + ITEM_ID + (材質種類 * 1000) + 1000000}@@C:{カラー_選択不可}@[%WPN_材質別接頭文字:材質種類%の%ITEM_NAME%]@/C@@/B@"
            ENDIF
            DETAIL_LIST:DETAIL_LINECOUNT = %TAG_PRINT_SHAPE(DETAIL_LIST:DETAIL_LINECOUNT, 28, 1, 0)%
            DETAIL_LINECOUNT ++
        ELSE
            CONTINUE
        ENDIF
    NEXT
NEXT

PAGE_NUM = DETAIL_LINECOUNT / MAX_ROW

;明細リスト出力
L_CNT = 0
FOR LOCAL, MAX_ROW * HO_SHOP_MENU_PAGE_LEFT, MAX_ROW * (HO_SHOP_MENU_PAGE_LEFT + 1)
    IF  L_CNT / MAX_ROW <= 0
        CALL WndMgr_TextSet(WINDOW_ID, L_CNT + HEADER_NUM, DETAIL_LIST:LOCAL)
        L_CNT++
    ELSE
        CALL WndMgr_TextAdd(WINDOW_ID, (L_CNT % MAX_ROW) + HEADER_NUM, DETAIL_LIST:LOCAL)
        L_CNT ++
    ENDIF
    L_CNT ++
NEXT

;フッター
CALL WndMgr_GetRectangle(WINDOW_ID)
WND_WIDTH = RESULT:2

IF PAGE_NUM > 0
    STR_FOOTER += HO_SHOP_MENU_PAGE_LEFT > 0 ? @"@B:9000@<<@/B@ " # "   "
    STR_FOOTER += @"%TOSTR(HO_SHOP_MENU_PAGE_LEFT + 1, "..")% "
    STR_FOOTER += HO_SHOP_MENU_PAGE_LEFT != PAGE_NUM ? @"@B:9001@>>@/B@" # "  "
    CALLF TAG_PRINT_SHAPE(STR_FOOTER, WND_WIDTH - 8, 1, 2)
    CALL WndMgr_TextSet(WINDOW_ID, MAX_ROW + 2, @"@C:{カラー_注釈}@%RESULTS%@/C@")
ENDIF


code:
;-------------------------------------------------
; ショップ在庫管理
;-------------------------------------------------
@HO_SHOP_MANAGE_GET_STOCK(SHOP_NAME, DICS_SHOP_STOCK)
#DIMS SHOP_NAME
#DIMS REF DICS_SHOP_STOCK
VARSET DICS_SHOP_STOCK
TRYCCALLFORM HO_SHOP_MANAGE_SHOP_%SHOP_NAME%(DICS_SHOP_STOCK)
CATCH
    DEBUGPRINTFORML (警告@HO_SHOP_MANAGE):SHOP_ID%SHOP_NAME%に対応する在庫定義関数が存在しません
ENDCATCH

;-------------------------------------------------
;各ショップの在庫定義
;-------------------------------------------------
;ギルドの名誉点引換ショップ
@HO_SHOP_MANAGE_SHOP_ギルドショップ(DICS_SHOP_STOCK)
#DIMS REF DICS_SHOP_STOCK
QUEST_MENU_DIC_SHOP_STOCK_0:0 '= @"[ITEM_ID:{ITEM_技巧の宝玉}]"
QUEST_MENU_DIC_SHOP_STOCK_0:1 '= @"[ITEM_ID:{ITEM_求人書類}]"
QUEST_MENU_DIC_SHOP_STOCK_0:2 '= @"[ITEM_ID:{ITEM_調合技能書}]"
QUEST_MENU_DIC_SHOP_STOCK_0:3 '= @"[ITEM_ID:{ITEM_工作技能書}]"
QUEST_MENU_DIC_SHOP_STOCK_0:4 '= @"[ITEM_ID:{ITEM_淫堕の宝玉}]"
QUEST_MENU_DIC_SHOP_STOCK_0:6 '= @"[ITEM_ID:{ITEM_栄誉勲章}]"
QUEST_MENU_DIC_SHOP_STOCK_0:7 '= @"[ITEM_ID:{ITEM_淫魔の刻印}]"
;在庫をセーブデータに持つので初回のみ読み込み
IF QUEST_MENU_DIC_SHOP_STOCK_0:10 == ""
    {
        QUEST_MENU_DIC_SHOP_STOCK_0:10 '= @"
            [WEAPON_ID:1][EQUIP_TYPE:1][WEAPON_NAME:淫魔の導印]
            [WEAPON_RANK:0][MATERIAL:{WPN_材質_鉄}]
            [PASSIVE_WEAPON_SKILL:WPN_SEXUAL_INITIATIVE,1,]
            [ITEM_PRICE:300][ITEM_SELL_TYPE:2][SHOP_STOCK:1]
            "
    }
    {
        QUEST_MENU_DIC_SHOP_STOCK_0:11 '= @"
            [WEAPON_ID:3][EQUIP_TYPE:1][WEAPON_NAME:淫魔の首枷]
            [WEAPON_RANK:0][MATERIAL:{WPN_材質_鋼}]
            [PASSIVE_WEAPON_SKILL:WPN_SEXUAL_FOLLOWER,1,]
            [ITEM_PRICE:300][ITEM_SELL_TYPE:2][SHOP_STOCK:1]
            "
    }
ENDIF
ARRAYCOPY "QUEST_MENU_DIC_SHOP_STOCK_0", "DICS_SHOP_STOCK"

repo_name: pervysquirrelz/erafl

license: unknown


code:
;-------------------------------------------------
;アイテム使用時の汎用処理関数
;-------------------------------------------------
@ITEM_USING_COMMON(DICS_ITEM_EFFECT)
#DIMS DICS_ITEM_EFFECT
#DIM  DYNAMIC ITEM_ID
#DIMS DYNAMIC EFFECT_CATEGORY

ITEM_ID = TOINT(DIC_GET(DICS_ITEM_EFFECT, "ITEM_ID"))
CALL GET_ITEM_NAME(ITEM_ID)
EFFECT_CATEGORY = %DIC_GET(DICS_ITEM_EFFECT, "EFFECT_CATEGORY")%

TRYCCALLFORM ITEM_USING_COMMON_%EFFECT_CATEGORY%(DICS_ITEM_EFFECT)
    RETURN 1
CATCH
    DEBUGPRINTFORML ITEM_ID:{ITEM_ID}のEFFECT_CATEGORY:%EFFECT_CATEGORY%は無効なカテゴリ指定です
    THROW
ENDCATCH

;-------------------------------------------------------------------------------
;アイテム使用時の処理関数@ITEM_USING_COMMONから呼ばれるアイテム使用時処理
;[EFFECT_CATEGORY:QUEST_MEDICAL_CARE] クエスト中の体力回復
;-------------------------------------------------------------------------------
@ITEM_USING_COMMON_QUEST_MEDICAL_CARE(DICS_ITEM_EFFECT)
#DIMS DICS_ITEM_EFFECT

;DICS_ITEM_EFFECT関連変数
#DIM  DYNAMIC ITEM_ID
#DIM  DYNAMIC TARGET_NUM
#DIMS DYNAMIC TARGET_CLASS
;#DIMS DYNAMIC EFFECT_CATEGORY
;#DIMS DYNAMIC LIST_EFFECT_CLASS
#DIMS DYNAMIC LIST_EFFECT_RATE
#DIMS DYNAMIC DESCRIPTION_BEFORE_USING

;DICS_ITEM_EFFECT派生変数
#DIMS DYNAMIC ITEM_NAME

#DIM  DYNAMIC SELECTED_CHARA_ID
#DIM  DYNAMIC HEAL_AMOUNT
#DIM  FIRST_LINE

;DICS_ITEM_EFFECTから各種情報を取得
ITEM_ID           = TOINT(DIC_GET(DICS_ITEM_EFFECT, "ITEM_ID"))
TARGET_NUM        = TOINT(DIC_GET(DICS_ITEM_EFFECT, "TARGET_NUM"))
TARGET_CLASS      = %DIC_GET(DICS_ITEM_EFFECT, "TARGET_CLASS")%
;EFFECT_CATEGORY   = %DIC_GET(DICS_ITEM_EFFECT, "EFFECT_CATEGORY")%
;LIST_EFFECT_CLASS = %DIC_GET(DICS_ITEM_EFFECT, "LIST_EFFECT_CLASS")%
LIST_EFFECT_RATE  = %DIC_GET(DICS_ITEM_EFFECT, "LIST_EFFECT_RATE")%
DESCRIPTION_BEFORE_USING = %DIC_GET(DICS_ITEM_EFFECT, "DESCRIPTION_BEFORE_USING")%

;DICS_ITEM_EFFECTの情報から派生情報を取得
CALL GET_ITEM_NAME(ITEM_ID)
ITEM_NAME     = %RESULTS%

;アイテム使用前のメッセージ表示
;-------------------------------------------------
FIRST_LINE = LINECOUNT
WHILE 1
    IF HO_ITEM_STOCK:ITEM_ID == 0 || QST_応急治療点 == 0
        RETURN
    ENDIF
    REDRAW 0
    CLEARLINE LINECOUNT - FIRST_LINE
    CALLF TAG_PRINT(@"%STRFORM(DESCRIPTION_BEFORE_USING)%", 1)
    CALLF TAG_PRINT(@"　%ITEM_NAME%({HO_ITEM_STOCK:ITEM_ID} → @C:{カラー_オレンジ}@{HO_ITEM_STOCK:ITEM_ID -1}@/C@) 応急治療点({QST_応急治療点} → @C:{カラー_オレンジ}@{QST_応急治療点 - 1}@/C@)", 1)
    PRINTL

    CALL CHARA_SELECT_LIST_HEALTH(TARGET_CLASS, TARGET_NUM)
    SELECTED_CHARA_ID = RESULT
    IF SELECTED_CHARA_ID == -1
        RETURN
    ELSE
        HEAL_AMOUNT = (MAXBASE:SELECTED_CHARA_ID:体力 * TOINT(LIST_GET(LIST_EFFECT_RATE, 0))) / 100
        CALL QST_CHANGE_HP(SELECTED_CHARA_ID, HEAL_AMOUNT)
        HO_ITEM_STOCK:ITEM_ID --
        QST_応急治療点 --
        WAIT
    ENDIF
WEND

;アイテム使用処理 / 回復アイテム使用対象選択
@CHARA_SELECT_LIST_HEALTH(TARGET_CLASS, TARGET_NUM)
#DIM  TARGET_NUM
#DIMS TARGET_CLASS
#DIM CONST BTN_ID = 100
#DIM DYNAMIC F_COL
#DIM DYNAMIC CHARA_ID
#DIM HEAL_AMOUNT

FOR LOCAL, 0, QST_PARTYNUM
    CHARA_ID = TOINT((LIST_GET(_LIST_QST_PARTY, LOCAL)))
    LOCALS:0 '= @"@B:{CHARA_ID + BTN_ID}@%ANAME(CHARA_ID)%@/B@"
    LOCALS:0 = %TAG_PRINT_SHAPE(@"%LOCALS:0%", 15, 1, 0)%
    LOCALS:1 = 体力:%FuncTagSetText_CreateColorBarText(BASE:CHARA_ID:体力, MAXBASE:CHARA_ID:体力, 16, カラー_オレンジ, カラー_緑, 0x000000, 1, "▰")%
    LOCALS:2 = %TAG_PRINT_SHAPE("", 15, 1, 0)%
    LOCALS:3 = 気力:%FuncTagSetText_CreateColorBarText(BASE:CHARA_ID:気力, MAXBASE:CHARA_ID:気力, 16, カラー_シアン, カラー_白, 0x000000, 1, "▰")%
    CALLF TAG_PRINT(@"%LOCALS:0%%LOCALS:1%", 5)
    CALLF TAG_PRINT(@"%LOCALS:2%%LOCALS:3%", 5)
    PRINTL
NEXT
PRINTL
CALLF TAG_PRINT(@"@B:9999@[キャンセル]@/C@", 5)

;入力ループ
;-------------------------------------------------
WHILE 1
    REDRAW 1
    ONEINPUT
    CLEARLINE 1
    SELECTCASE RESULT
        CASE 9999
            RETURN -1
        CASEELSE
            CHARA_ID = RESULT - BTN_ID
            IF LIST_INDEXOF(_LIST_QST_PARTY, TOSTR(CHARA_ID)) == -1
                CONTINUE
            ENDIF
            IF MAXBASE:CHARA_ID:体力 == BASE:CHARA_ID:体力
                PRINTFORMW %ANAME(CHARA_ID)%は治療の必要がなさそうだ
                CLEARLINE 1
                CONTINUE
            ENDIF
            RETURN CHARA_ID
    ENDSELECT
WEND

;-------------------------------------------------------------------------------
;アイテム使用時の処理関数@ITEM_USING_COMMONから呼ばれるアイテム使用時処理
;[EFFECT_CATEGORY:QUEST_INSTANT_BUFF] クエスト中の各種食事バフ
;応急治療点から空腹度による判定に変更
;-------------------------------------------------------------------------------
@ITEM_USING_COMMON_QUEST_INSTANT_BUFF(DICS_ITEM_EFFECT)
#DIMS DICS_ITEM_EFFECT

;DICS_ITEM_EFFECT関連変数
#DIM  DYNAMIC ITEM_ID
#DIM  DYNAMIC TARGET_NUM
#DIMS DYNAMIC TARGET_CLASS
#DIMS DYNAMIC EFFECT_CATEGORY
;#DIMS DYNAMIC LIST_EFFECT_CLASS
;#DIMS DYNAMIC LIST_EFFECT_RATE
#DIMS DYNAMIC DESCRIPTION_BEFORE_USING

;DICS_ITEM_EFFECT派生変数
#DIMS DYNAMIC ITEM_NAME

#DIM  DYNAMIC SELECTED_CHARA_ID
#DIM  DYNAMIC HEAL_AMOUNT
#DIM  FIRST_LINE

#DIM DYNAMIC L_CNT
#DIM DYNAMIC C_ID

;DICS_ITEM_EFFECTから各種情報を取得
ITEM_ID           = TOINT(DIC_GET(DICS_ITEM_EFFECT, "ITEM_ID"))
TARGET_NUM        = TOINT(DIC_GET(DICS_ITEM_EFFECT, "TARGET_NUM"))
TARGET_CLASS      = %DIC_GET(DICS_ITEM_EFFECT, "TARGET_CLASS")%
EFFECT_CATEGORY   = %DIC_GET(DICS_ITEM_EFFECT, "EFFECT_CATEGORY")%
DESCRIPTION_BEFORE_USING = %DIC_GET(DICS_ITEM_EFFECT, "DESCRIPTION_BEFORE_USING")%

;DICS_ITEM_EFFECTの情報から派生情報を取得
CALL GET_ITEM_NAME(ITEM_ID)
ITEM_NAME     = %RESULTS%

;アイテム使用前のメッセージ表示
;-------------------------------------------------
FIRST_LINE = LINECOUNT
WHILE 1
    IF HO_ITEM_STOCK:ITEM_ID == 0
        RETURN
    ENDIF
    REDRAW 0
    CLEARLINE LINECOUNT - FIRST_LINE
    CALLF TAG_PRINT(@"%STRFORM(DESCRIPTION_BEFORE_USING)%", 1)
    CALLF TAG_PRINT(@"　%ITEM_NAME%({HO_ITEM_STOCK:ITEM_ID} → @C:{カラー_オレンジ}@{HO_ITEM_STOCK:ITEM_ID -1}@/C@)    ※食事後、２戦ほどで再度の食事が可能です", 1)
    PRINTL

    CALL CHARA_SELECT_LIST_INSTANT_BUFF(TARGET_CLASS, TARGET_NUM)
    SELECTED_CHARA_ID = RESULT
    IF SELECTED_CHARA_ID == -1
        RETURN
        ;パーティ全体対象の場合の処理
    ELSEIF SELECTED_CHARA_ID == 99999
        FOR L_CNT, 0, QST_PARTYNUM
            C_ID = TOINT(LIST_GET(_LIST_QST_PARTY, L_CNT))
            SIF TCVAR:C_ID:空腹度 < 300 ||  CFLAG:C_ID:QST食事
                CONTINUE
            CFLAG:C_ID:QST食事 = ITEM_ID
            IF HAS_SKILL(C_ID, "VORACITY", スキル_大分類_冒険)
                TCVAR:C_ID:空腹度 = 200
            ELSE
                TCVAR:C_ID:空腹度 = 0
            ENDIF
        NEXT
        HO_ITEM_STOCK:ITEM_ID --
        CALL FL_PLAYSE("Charge_0.mp3")
        PRINTL
        PRINTFORM みんなでおいしく
        SETCOLOR COLOR("イエロー")
        PRINTFORM %ITEM_NAME%
        RESETCOLOR
        PRINTFORMW をいただいた！
        RETURN
    ELSE
        ;食事バフフラグを立てる
        CFLAG:SELECTED_CHARA_ID:QST食事 = ITEM_ID
        ;スキル「健啖」を持っている場合は１戦での空腹状態を維持する
        IF HAS_SKILL(SELECTED_CHARA_ID, "VORACITY", スキル_大分類_冒険)
            TCVAR:SELECTED_CHARA_ID:空腹度 = 200
        ELSE
            ;満腹にする
            TCVAR:SELECTED_CHARA_ID:空腹度 = 0
        ENDIF
        HO_ITEM_STOCK:ITEM_ID --
        CALL FL_PLAYSE("Charge_0.mp3")
    ENDIF
WEND

;アイテム使用処理 / アイテム使用対象選択
@CHARA_SELECT_LIST_INSTANT_BUFF(TARGET_CLASS, TARGET_NUM)
#DIM  TARGET_NUM
#DIMS TARGET_CLASS
#DIM CONST BTN_ID = 100
#DIM DYNAMIC F_COL
#DIM DYNAMIC CHARA_ID
#DIM DYNAMIC HUNGRY_AMOUNT

FOR LOCAL, 0, QST_PARTYNUM
    CHARA_ID = TOINT((LIST_GET(_LIST_QST_PARTY, LOCAL)))
    LOCALS:0 '= @"@B:{CHARA_ID + BTN_ID}@%ANAME(CHARA_ID)%@/B@"
    LOCALS:0 = %TAG_PRINT_SHAPE(@"%LOCALS:0%", 15, 1, 0)%
    LOCALS:1 = 体力:%FuncTagSetText_CreateColorBarText(BASE:CHARA_ID:体力, MAXBASE:CHARA_ID:体力, 16, カラー_オレンジ, カラー_緑, 0x000000, 1, "▰")%
    LOCALS:2 = %TAG_PRINT_SHAPE("", 15, 1, 0)%
    LOCALS:3 = 気力:%FuncTagSetText_CreateColorBarText(BASE:CHARA_ID:気力, MAXBASE:CHARA_ID:気力, 16, カラー_シアン, カラー_白, 0x000000, 1, "▰")%
    IF CFLAG:CHARA_ID:QST食事
        TRYCALLFORM GET_ITEM_NAME_{CFLAG:CHARA_ID:QST食事}()
        LOCALS:4 = [★食事済: %RESULTS%]
    ELSEIF TCVAR:CHARA_ID:空腹度 <= 100
        LOCALS:4 = [×さっき食べたばかりだ]
    ELSEIF TCVAR:CHARA_ID:空腹度 <= 200
        LOCALS:4 = [△少し食事を取るには早い]
    ELSE
        LOCALS:4 =
    ENDIF
    CALLF TAG_PRINT(@"%LOCALS:0%%LOCALS:1%", 5)
    CALLF TAG_PRINT(@"%LOCALS:2%%LOCALS:3%  %LOCALS:4%", 5)
    PRINTL
NEXT
PRINTL
;パーティ全体対象の場合
;-------------------------------------------------
IF TARGET_NUM == 99
    ;全員が空腹でない、あるいは食事直後の場合
    FOR LOCAL, 0, QST_PARTYNUM
        CHARA_ID = TOINT((LIST_GET(_LIST_QST_PARTY, LOCAL)))
        SIF CFLAG:CHARA_ID:QST食事 || TCVAR:CHARA_ID:空腹度 < 300
            HUNGRY_AMOUNT ++
    NEXT
    IF HUNGRY_AMOUNT == QST_PARTYNUM
        PRINTFORMW 既にみんな食事を取っている
        CLEARLINE 1
        RETURN -1
    ENDIF
    PRINTFORML この食事をパーティ全体で取りますか？（既に食事をしている・満腹であるキャラは除外されます）
    CALL ASK_YN("パーティ全体で食事にする", "やめる")
    IF RESULT
        CLEARLINE 1
        RETURN -1
    ENDIF
    CLEARLINE 2
    RETURN 99999
ENDIF

CALLF TAG_PRINT(@"@B:9999@[キャンセル]@/C@", 5)

;単数対象の場合の入力ループ
;-------------------------------------------------
WHILE 1
    REDRAW 1
    ONEINPUT
    CLEARLINE 1
    SELECTCASE RESULT
        CASE 9999
            RETURN -1
        CASEELSE
            CHARA_ID = RESULT - BTN_ID
            IF LIST_INDEXOF(_LIST_QST_PARTY, TOSTR(CHARA_ID)) == -1
                CONTINUE
            ENDIF
            IF CFLAG:CHARA_ID:QST食事
                PRINTFORMW %ANAME(CHARA_ID)%は既に食事を摂っている
                CLEARLINE 1
                CONTINUE
            ENDIF
            ;空腹度300以上でないと食事不可
            IF TCVAR:CHARA_ID:空腹度 < 300
                PRINTFORMW %ANAME(CHARA_ID)%はまだ空腹になっていない　腹ごなしをしよう
                CLEARLINE 1
                CONTINUE
            ENDIF
            RETURN CHARA_ID
    ENDSELECT
WEND
;-------------------------------------------------------------------------------
;アイテム使用時の処理関数@ITEM_USING_COMMONから呼ばれるアイテム使用時処理
;[EFFECT_CATEGORY:QUEST_CHANGE_CHARA_EFFECT] クエスト中の各種キャラクター効果の変更
;-------------------------------------------------------------------------------
@ITEM_USING_COMMON_QUEST_CHANGE_CHARA_EFFECT(DICS_ITEM_EFFECT)
#DIMS DICS_ITEM_EFFECT

;DICS_ITEM_EFFECT関連変数
#DIM  DYNAMIC ITEM_ID
#DIM  DYNAMIC TARGET_NUM
#DIMS DYNAMIC TARGET_CLASS
#DIMS DYNAMIC EFFECT_CATEGORY
#DIMS DYNAMIC LIST_EFFECT_CLASS
#DIMS DYNAMIC LIST_EFFECT_RATE
#DIMS DYNAMIC DESCRIPTION_BEFORE_USING

;DICS_ITEM_EFFECT派生変数
#DIMS DYNAMIC ITEM_NAME

#DIM  DYNAMIC SELECTED_CHARA_ID
#DIM  DYNAMIC HEAL_AMOUNT
#DIM  FIRST_LINE

;DICS_ITEM_EFFECTから各種情報を取得
ITEM_ID           = TOINT(DIC_GET(DICS_ITEM_EFFECT, "ITEM_ID"))
TARGET_NUM        = TOINT(DIC_GET(DICS_ITEM_EFFECT, "TARGET_NUM"))
TARGET_CLASS      = %DIC_GET(DICS_ITEM_EFFECT, "TARGET_CLASS")%
EFFECT_CATEGORY   = %DIC_GET(DICS_ITEM_EFFECT, "EFFECT_CATEGORY")%
LIST_EFFECT_CLASS = %DIC_GET(DICS_ITEM_EFFECT, "LIST_EFFECT_CLASS")%
LIST_EFFECT_RATE  = %DIC_GET(DICS_ITEM_EFFECT, "LIST_EFFECT_RATE")%
DESCRIPTION_BEFORE_USING = %DIC_GET(DICS_ITEM_EFFECT, "DESCRIPTION_BEFORE_USING")%

;DICS_ITEM_EFFECTの情報から派生情報を取得
CALL GET_ITEM_NAME(ITEM_ID)
ITEM_NAME     = %RESULTS%

;アイテム使用前のメッセージ表示
;-------------------------------------------------
FIRST_LINE = LINECOUNT
WHILE 1
    IF HO_ITEM_STOCK:ITEM_ID == 0
        RETURN
    ENDIF
    REDRAW 0
    CLEARLINE LINECOUNT - FIRST_LINE
    CALLF TAG_PRINT(@"%STRFORM(DESCRIPTION_BEFORE_USING)%", 1)
    CALLF TAG_PRINT(@"　%ITEM_NAME%({HO_ITEM_STOCK:ITEM_ID} → @C:{カラー_オレンジ}@{HO_ITEM_STOCK:ITEM_ID -1}@/C@)", 1)
    PRINTL
    CALL ITEM_USING_COMMON_QUEST_CHANGE_CHARA_EFFECT_SELECT_LIST(TARGET_CLASS, TARGET_NUM, LIST_EFFECT_CLASS)
    SELECTED_CHARA_ID = RESULT
    IF SELECTED_CHARA_ID == -1
        RETURN
    ENDIF
    IF LIST_INDEXOF(LIST_EFFECT_CLASS, "REDUCE_ESTRUS") != -1
        IF TCVAR:SELECTED_CHARA_ID:媚薬 > 0
            TCVAR:SELECTED_CHARA_ID:媚薬 --
            HO_ITEM_STOCK:ITEM_ID --
            PRINTFORMW %ANAME(SELECTED_CHARA_ID)%は冷静さを取り戻したようだ
        ENDIF
    ENDIF
WEND

;アイテム使用処理 / 回復アイテム使用対象選択
@ITEM_USING_COMMON_QUEST_CHANGE_CHARA_EFFECT_SELECT_LIST(TARGET_CLASS, TARGET_NUM, LIST_EFFECT_CLASS)
#DIM  TARGET_NUM
#DIMS TARGET_CLASS
#DIMS LIST_EFFECT_CLASS
#DIM CONST BTN_ID = 100
#DIM DYNAMIC F_COL
#DIM DYNAMIC CHARA_ID
#DIM HEAL_AMOUNT

FOR LOCAL, 0, QST_PARTYNUM
    CHARA_ID = TOINT((LIST_GET(_LIST_QST_PARTY, LOCAL)))
    LOCALS:0 '= @"@B:{CHARA_ID + BTN_ID}@%ANAME(CHARA_ID)%@/B@"
    LOCALS:0 = %TAG_PRINT_SHAPE(@"%LOCALS:0%", 15, 1, 0)%
    LOCALS:1 = 体力:%FuncTagSetText_CreateColorBarText(BASE:CHARA_ID:体力, MAXBASE:CHARA_ID:体力, 16, カラー_オレンジ, カラー_緑, 0x000000, 1, "▰")%
    LOCALS:2 = %TAG_PRINT_SHAPE("", 15, 1, 0)%
    LOCALS:3 = 気力:%FuncTagSetText_CreateColorBarText(BASE:CHARA_ID:気力, MAXBASE:CHARA_ID:気力, 16, カラー_シアン, カラー_白, 0x000000, 1, "▰")%
    CALLF TAG_PRINT(@"%LOCALS:0%%LOCALS:1%", 5)
    CALLF TAG_PRINT(@"%LOCALS:2%%LOCALS:3%", 5)
    LOCALS:4 '= ""
    IF TCVAR:CHARA_ID:媚薬 > 0
        LOCALS:4 '= @"%TAG_PRINT_SHAPE(@"", 15, 1, 0)%"
        LOCALS:4 += @"@C:{カラー_ピンク}@発情Lv:{TCVAR:CHARA_ID:媚薬}@/C@"
    ENDIF
    IF LOCALS:4 != ""
        CALLF TAG_PRINT(@"%LOCALS:4%", 5)
    ENDIF
    PRINTL
NEXT
PRINTL
CALLF TAG_PRINT(@"@B:9999@[キャンセル]@/C@", 5)

;入力ループ
;-------------------------------------------------
WHILE 1
    REDRAW 1
    ONEINPUT
    CLEARLINE 1
    SELECTCASE RESULT
        CASE 9999
            RETURN -1
        CASEELSE
            CHARA_ID = RESULT - BTN_ID
            IF LIST_INDEXOF(_LIST_QST_PARTY, TOSTR(CHARA_ID)) == -1
                CONTINUE
            ENDIF
            IF LIST_INDEXOF(LIST_EFFECT_CLASS, "REDUCE_ESTRUS") != -1
                IF TCVAR:CHARA_ID:媚薬 < 1
                    PRINTFORMW %ANAME(CHARA_ID)%は治療の必要がなさそうだ
                    CLEARLINE 1
                    CONTINUE
                ENDIF
            ENDIF
            RETURN CHARA_ID
    ENDSELECT
WEND


code:
;-------------------------------------------------------------------------------
;アイテム使用時の処理関数@ITEM_USING_COMMONから呼ばれるアイテム使用時処理
;[EFFECT_CATEGORY:ADD_BASE_POINT] ステータス基礎値操作
;-------------------------------------------------------------------------------
@ITEM_USING_COMMON_ADD_BASE_POINT(DICS_ITEM_EFFECT)
#DIMS DICS_ITEM_EFFECT
CALL _ITEM_USING_COMMON_BASE_POINT(DICS_ITEM_EFFECT)

;-------------------------------------------------------------------------------
;アイテム使用時の処理関数@ITEM_USING_COMMONから呼ばれるアイテム使用時処理
;[EFFECT_CATEGORY:EXTEND_BASE_POINT] ステータス基礎値操作
;-------------------------------------------------------------------------------
@ITEM_USING_COMMON_EXTEND_BASE_POINT(DICS_ITEM_EFFECT)
#DIMS DICS_ITEM_EFFECT
CALL _ITEM_USING_COMMON_BASE_POINT(DICS_ITEM_EFFECT)

;-------------------------------------------------------------------------------
;内部処理：スキルポイント関連処理
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_BASE_POINT(DICS_ITEM_EFFECT)
#DIMS DICS_ITEM_EFFECT

;DICS_ITEM_EFFECT関連変数
#DIM  DYNAMIC ITEM_ID
;#DIM  DYNAMIC TARGET_NUM
;#DIMS DYNAMIC TARGET_CLASS
;#DIMS DYNAMIC EFFECT_CATEGORY
;#DIMS DYNAMIC LIST_EFFECT_CLASS
;#DIMS DYNAMIC LIST_EFFECT_RATE
#DIMS DYNAMIC DESCRIPTION_BEFORE_USING

;DICS_ITEM_EFFECT派生変数
#DIMS DYNAMIC ITEM_NAME

;その他
#DIM  DYNAMIC SELECTED_CHARA_ID
#DIM  DYNAMIC TARGET_TEMP
#DIM  DYNAMIC FIRST_LINE

;-------------------------------------------------
;DICS_ITEM_EFFECTから各種情報を取得
;-------------------------------------------------
ITEM_ID           = TOINT(DIC_GET(DICS_ITEM_EFFECT, "ITEM_ID"))
;TARGET_NUM        = TOINT(DIC_GET(DICS_ITEM_EFFECT, "TARGET_NUM"))
;TARGET_CLASS      = %DIC_GET(DICS_ITEM_EFFECT, "TARGET_CLASS")%
;EFFECT_CATEGORY   = %DIC_GET(DICS_ITEM_EFFECT, "EFFECT_CATEGORY")%
;LIST_EFFECT_CLASS = %DIC_GET(DICS_ITEM_EFFECT, "LIST_EFFECT_CLASS")%
;LIST_EFFECT_RATE  = %DIC_GET(DICS_ITEM_EFFECT, "LIST_EFFECT_RATE")%
DESCRIPTION_BEFORE_USING = %DIC_GET(DICS_ITEM_EFFECT, "DESCRIPTION_BEFORE_USING")%

;DICS_ITEM_EFFECTの情報から派生情報を取得
CALL GET_ITEM_NAME(ITEM_ID)
ITEM_NAME     = %RESULTS%

;-------------------------------------------------
;キャラ選択ループ
;-------------------------------------------------
FIRST_LINE = LINECOUNT
WHILE 1
	REDRAW 0
	CLEARLINE LINECOUNT - FIRST_LINE
	;アイテムが0個になったら終了
	SIF HO_ITEM_STOCK:ITEM_ID == 0
		RETURN

	;アイテム効果/個数表示
	CALLF TAG_PRINT(@"%STRFORM(DESCRIPTION_BEFORE_USING)%", 1)
	CALLF TAG_PRINT(@"　%ITEM_NAME%({HO_ITEM_STOCK:ITEM_ID})", 1)
	PRINTL

	;リストを表示してキャラ選択
	CALL SELECT_CHARA_LIST_ONLY_LOGIC_SLG("SAME_FACTION", ITEM_NAME)
	CLEARLINE 1
	SELECTED_CHARA_ID = RESULT
	;キャラが選択されなかった場合は終了
	SIF SELECTED_CHARA_ID == -1
		RETURN
	PRINTL

	;TARGET情報の退避＆設定
	TARGET_TEMP = TARGET
	TARGET = SELECTED_CHARA_ID
	;スキルポイント操作画面を表示
	CALL _ITEM_USING_COMMON_BASE_POINT_CHANGE_OPERATION(DICS_ITEM_EFFECT)
	;TARGET情報の復元
	TARGET = TARGET_TEMP
WEND

;-------------------------------------------------------------------------------
;内部処理：ポイント操作画面呼び出し処理
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_BASE_POINT_CHANGE_OPERATION(DICS_ITEM_EFFECT)
#DIMS DICS_ITEM_EFFECT

;DICS_ITEM_EFFECT関連変数
#DIM  DYNAMIC ITEM_ID
;#DIM  DYNAMIC TARGET_NUM
;#DIMS DYNAMIC TARGET_CLASS
#DIMS DYNAMIC EFFECT_CATEGORY
#DIMS DYNAMIC LIST_EFFECT_CLASS
#DIMS DYNAMIC LIST_EFFECT_RATE
;#DIMS DYNAMIC DESCRIPTION_BEFORE_USING

;DICS_ITEM_EFFECT派生変数
#DIMS DYNAMIC ITEM_NAME
#DIMS DYNAMIC ADDABLE_GENRES

;POINT_OPERATE用変数
;#DIMS DYNAMIC ITEM_NAME
#DIMS DYNAMIC LIST_SUBJECT_NAME
#DIMS DYNAMIC LIST_BASE_POINT
#DIMS DYNAMIC LIST_LIMIT_POINT
#DIM  DYNAMIC CHANGE_RATE
#DIM  DYNAMIC ITEM_STOCK
#DIM  DYNAMIC LARGE_CHANGE_VALUE
#DIMS DYNAMIC LIST_CHANGE_VALUE
#DIMS DYNAMIC LIST_ITEM_USE_NUM

;その他
#DIMS CONST ARRAY_POINT_NAME = "HP"
#DIM  DYNAMIC L_CNT
#DIM  DYNAMIC BASE_POINT
#DIM  DYNAMIC LIMIT_POINT

;-------------------------------------------------
;DICS_ITEM_EFFECTから各種情報を取得
;-------------------------------------------------
ITEM_ID           = TOINT(DIC_GET(DICS_ITEM_EFFECT, "ITEM_ID"))
;TARGET_NUM        = TOINT(DIC_GET(DICS_ITEM_EFFECT, "TARGET_NUM"))
;TARGET_CLASS      = %DIC_GET(DICS_ITEM_EFFECT, "TARGET_CLASS")%
EFFECT_CATEGORY   = %DIC_GET(DICS_ITEM_EFFECT, "EFFECT_CATEGORY")%
LIST_EFFECT_CLASS = %DIC_GET(DICS_ITEM_EFFECT, "LIST_EFFECT_CLASS")%
LIST_EFFECT_RATE  = %DIC_GET(DICS_ITEM_EFFECT, "LIST_EFFECT_RATE")%
;DESCRIPTION_BEFORE_USING = %DIC_GET(DICS_ITEM_EFFECT, "DESCRIPTION_BEFORE_USING")%

;DICS_ITEM_EFFECTの情報から派生情報を取得
CALL GET_ITEM_NAME(ITEM_ID)
ITEM_NAME     = %RESULTS%
ADDABLE_GENRES = %_ITEM_USING_COMMON_BASE_POINT_GET_ADDABLE_GENRE(LIST_EFFECT_CLASS)%

;ポイント操作関数に渡す情報の作成
VARSET LIST_SUBJECT_NAME
VARSET LIST_BASE_POINT
VARSET LIST_LIMIT_POINT

;1個当たり変更量
CHANGE_RATE = TOINT(LIST_GET(LIST_EFFECT_RATE, 0))
;最大変更回数＝アイテムの所持数
ITEM_STOCK = HO_ITEM_STOCK:ITEM_ID
;変更ボタン(大)の操作量
LARGE_CHANGE_VALUE = 5
;大分類ごとの情報設定
FOR L_CNT, 0, 1
	IF GROUPMATCH(ADDABLE_GENRES, ARRAY_POINT_NAME:L_CNT)
		;項目名
		LIST_SUBJECT_NAME '= LIST_ADD(LIST_SUBJECT_NAME, ARRAY_POINT_NAME:L_CNT)
		;ポイントの初期状態と上限値(効果カテゴリから判定して設定)
		CALL _ITEM_USING_COMMON_BASE_POINT_GET_TARGET_POINT(L_CNT, LIST_GET(LIST_EFFECT_CLASS, 0))
		BASE_POINT  = RESULT:0
		LIMIT_POINT = RESULT:1
		LIST_BASE_POINT   '= LIST_ADD(LIST_BASE_POINT  , TOSTR(BASE_POINT))
		LIST_LIMIT_POINT  '= LIST_ADD(LIST_LIMIT_POINT , TOSTR(LIMIT_POINT))
	ENDIF
NEXT

;ポイント操作関数呼び出し
CALL _ITEM_USING_COMMON_BASE_POINT_OPERATE(ITEM_NAME, LIST_SUBJECT_NAME, LIST_BASE_POINT, LIST_LIMIT_POINT, CHANGE_RATE, ITEM_STOCK, LARGE_CHANGE_VALUE)
LIST_CHANGE_VALUE '= RESULTS:0
LIST_ITEM_USE_NUM '= RESULTS:1

;変更した内容を反映する
IF RESULT
	CALL _ITEM_USING_COMMON_BASE_POINT_CHANGE_CONFIRM(ITEM_ID, EFFECT_CATEGORY, LIST_EFFECT_CLASS, LIST_CHANGE_VALUE, LIST_ITEM_USE_NUM)
ENDIF

;-------------------------------------------------------------------------------
;内部処理：操作するステータスの種類を取得
;現在はHPのみ
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_BASE_POINT_GET_ADDABLE_GENRE(LIST_EFFECT_CLASS)
#FUNCTIONS
#DIMS LIST_EFFECT_CLASS
#DIMS DYNAMIC ADDABLE_GENRES

;ADD_BASE_HP：基礎HP増加
IF LIST_INDEXOF(LIST_EFFECT_CLASS, "ADD_BASE_HP") != -1
	ADDABLE_GENRES '= "HP"
ENDIF

RETURNF ADDABLE_GENRES

;-------------------------------------------------------------------------------
;内部処理：基礎値変更確定変更確定
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_BASE_POINT_CHANGE_CONFIRM(ITEM_ID, EFFECT_CATEGORY, LIST_EFFECT_CLASS, LIST_CHANGE_POINT, LIST_ITEM_USE_NUM)
#DIM  ITEM_ID
#DIMS EFFECT_CATEGORY
#DIMS LIST_EFFECT_CLASS
#DIMS LIST_CHANGE_POINT
#DIMS LIST_ITEM_USE_NUM

#DIM  DYNAMIC CHANGE_POINT
#DIM  DYNAMIC ITEM_USE_NUM
#DIM  DYNAMIC GENRE_NO
#DIM  DYNAMIC L_CNT

#DIMS DYNAMIC CONFIRM_MESSAGE

;　対象：体力
IF LIST_INDEXOF(LIST_EFFECT_CLASS, "ADD_BASE_HP") != -1
	CONFIRM_MESSAGE '= @"@C:{カラー_注意}@%ANAME(TARGET)%の体力が上昇しました@/@"
	GENRE_NO = 0
ENDIF

;変更情報の取得
CHANGE_POINT = TOINT(LIST_GET(LIST_CHANGE_POINT, 0))
ITEM_USE_NUM = TOINT(LIST_GET(LIST_ITEM_USE_NUM, 0))
;メッセージ表示
CALLF TAG_PRINT(CONFIRM_MESSAGE, 1)
;ポイント更新処理
CALL _ITEM_USING_COMMON_BASE_POINT_CHANGE_CONFIRM_POINT(ITEM_ID, GENRE_NO, LIST_GET(LIST_EFFECT_CLASS, 0), CHANGE_POINT, ITEM_USE_NUM)
WAIT

;-------------------------------------------------------------------------------
;内部処理：ポイント更新
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_BASE_POINT_CHANGE_CONFIRM_POINT(ITEM_ID, GENRE_NO, EFFECT_CATEGORY, CHANGE_POINT, ITEM_USE_NUM)
#DIM  ITEM_ID
#DIM  GENRE_NO
#DIMS EFFECT_CATEGORY
#DIM  CHANGE_POINT
#DIM  ITEM_USE_NUM

#DIMS CONST ARRAY_POINT_NAME = "体力"
#DIMS CONFIRM_MESSAGE
#DIM  BASE_POINT_BEFORE
#DIM  BASE_POINT_AFTER
#DIM  LIMIT_POINT

;変更前のポイント情報を取得
CALL _ITEM_USING_COMMON_BASE_POINT_GET_TARGET_POINT(GENRE_NO, EFFECT_CATEGORY)
BASE_POINT_BEFORE = RESULT:0
LIMIT_POINT       = RESULT:1

;ポイントを加算
CALL _ITEM_USING_COMMON_BASE_POINT_ADD_TARGET_POINT(GENRE_NO, EFFECT_CATEGORY, CHANGE_POINT)

;変更後のポイント情報を取得
CALL _ITEM_USING_COMMON_BASE_POINT_GET_TARGET_POINT(GENRE_NO, EFFECT_CATEGORY)
BASE_POINT_AFTER = RESULT:0
LIMIT_POINT      = RESULT:1

;アイテム数を減らす
HO_ITEM_STOCK:ITEM_ID -= ITEM_USE_NUM

;メッセージ表示
CONFIRM_MESSAGE '= @"　@C:{カラー_注意}@%ARRAY_POINT_NAME:GENRE_NO% :{BASE_POINT_BEFORE, 2} → {BASE_POINT_AFTER, 2}@/@"
CALLF TAG_PRINT(CONFIRM_MESSAGE, 1)

;-------------------------------------------------------------------------------
;内部処理：指定した効果カテゴリのポイント情報を取得
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_BASE_POINT_GET_TARGET_POINT(GENRE_NO, EFFECT_CATEGORY)
#DIM GENRE_NO
#DIMS EFFECT_CATEGORY
#DIM DYNAMIC BASE_POINT
#DIM DYNAMIC LIMIT_POINT

SELECTCASE EFFECT_CATEGORY
	CASE "ADD_BASE_HP"
		;カテゴリ：スキルポイント増加
		;取得内容：スキルポイント/スキルポイント上限
		BASE_POINT  = MAXBASE:TARGET:体力
		LIMIT_POINT = 3000
ENDSELECT

RETURN BASE_POINT, LIMIT_POINT

;-------------------------------------------------------------------------------
;内部処理：指定した効果カテゴリのポイントを加算
;-------------------------------------------------------------------------------
;・広域変数を直接変更する。
;　[EFFECT_CATEGORY:ADD_BASE_POINT]    BASE_SKILL_POINT, HO_ITEM_STOCK
;　[EFFECT_CATEGORY:EXTEND_SKILL_POINT] CFLAG:＊＊スキル拡張上限, HO_ITEM_STOCK
@_ITEM_USING_COMMON_BASE_POINT_ADD_TARGET_POINT(GENRE_NO, EFFECT_CATEGORY, CHANGE_POINT)
#DIM  GENRE_NO
#DIMS EFFECT_CATEGORY
#DIM  CHANGE_POINT

SELECTCASE EFFECT_CATEGORY
	CASE "ADD_BASE_HP"
		;体力を加算
		MAXBASE:TARGET:体力 += CHANGE_POINT
		BASE:TARGET:体力 += CHANGE_POINT
ENDSELECT


code:
;===============================================================================
;スキルポイント操作関数
;===============================================================================
@_ITEM_USING_COMMON_BASE_POINT_OPERATE(ITEM_NAME, LIST_SUBJECT_NAME, LIST_INIT_POINT, LIST_LIMIT_POINT, CHANGE_RATE, ITEM_STOCK, LARGE_CHANGE_VALUE)
#DIMS ITEM_NAME
#DIMS LIST_SUBJECT_NAME
#DIMS LIST_INIT_POINT
#DIMS LIST_LIMIT_POINT
#DIM  CHANGE_RATE
#DIM  ITEM_STOCK
#DIM  LARGE_CHANGE_VALUE

#DIM CONST BTN_OFFSET = 100

#DIMS DYNAMIC ARGUMENT_DATA
#DIMS DYNAMIC BUTTON_TEXT
#DIM  DYNAMIC LIST_SIZE
#DIMS DYNAMIC LIST_CHANGE_VALUE
#DIMS DYNAMIC LIST_CURT_CHG_POINT		;List Current Change Point
#DIMS DYNAMIC LIST_CURT_ITEM_USE_NUM	;List Current Item Used Number
#DIM  DYNAMIC TOTAL_CURT_CHG_POINT		;Total Current Change Point
#DIM  DYNAMIC TOTAL_CURT_ITEM_USE_NUM	;Total Current Item Used Number
#DIM  DYNAMIC BUTTON_NO_BASE
#DIM  DYNAMIC L_CNT
#DIM  DYNAMIC INPUT_VALUE
#DIM  DYNAMIC SUBJECT_NO
#DIM  DYNAMIC CHANGE_NO
#DIM  DYNAMIC REST_ITEM_STOCK
#DIM  DYNAMIC CONFIRM_ANSWER
#DIM  DYNAMIC EXIT_FLAG
#DIM  DYNAMIC FIRST_LINE

;--------------
;-- 事前処理
;--------------
;表示開始行を記憶
FIRST_LINE = LINECOUNT
;リストの要素数の取得
LIST_SIZE =LIST_COUNT(LIST_SUBJECT_NAME)
;各ボタンを押した際の変更量を設定
LIST_CHANGE_VALUE '= ""
LIST_CHANGE_VALUE '= LIST_ADD(LIST_CHANGE_VALUE, TOSTR(-1 * LARGE_CHANGE_VALUE))
LIST_CHANGE_VALUE '= LIST_ADD(LIST_CHANGE_VALUE, TOSTR(-1))
LIST_CHANGE_VALUE '= LIST_ADD(LIST_CHANGE_VALUE, TOSTR( 1))
LIST_CHANGE_VALUE '= LIST_ADD(LIST_CHANGE_VALUE, TOSTR( 1 * LARGE_CHANGE_VALUE))
;終了判定フラグ
EXIT_FLAG = -1

;--------------
;-- 表示処理
;--------------
REDRAW 0
;1.残数表示
TOTAL_CURT_CHG_POINT = 0
TOTAL_CURT_ITEM_USE_NUM = 0
FOR L_CNT, 0, LIST_SIZE
	TOTAL_CURT_CHG_POINT    += TOINT(LIST_GET(LIST_CURT_CHG_POINT   , L_CNT))
	TOTAL_CURT_ITEM_USE_NUM += TOINT(LIST_GET(LIST_CURT_ITEM_USE_NUM, L_CNT))
NEXT
REST_ITEM_STOCK = ITEM_STOCK - TOTAL_CURT_ITEM_USE_NUM
CALLF TAG_PRINT(@"　%ITEM_NAME% ({ITEM_STOCK} → @C:{カラー_オレンジ}@{REST_ITEM_STOCK}@/C@)", 1)
PRINTL
;2.項目ごとのボタンを作成
FOR L_CNT, 0, LIST_SIZE
	BUTTON_NO_BASE = BTN_OFFSET * (L_CNT + 1)
	{
		CALL _ITEM_USING_COMMON_BASE_POINT_OPERATE_CREATE_BUTTON(
			BUTTON_NO_BASE,
			LIST_GET(LIST_SUBJECT_NAME  , L_CNT),
			TOINT(LIST_GET(LIST_INIT_POINT    , L_CNT)),
			TOINT(LIST_GET(LIST_LIMIT_POINT   , L_CNT)),
			LIST_CHANGE_VALUE,
			TOINT(LIST_GET(LIST_CURT_CHG_POINT, L_CNT)),
			REST_ITEM_STOCK
			)
	}
NEXT
;3.決定/キャンセルボタン作成
PRINTL
IF TOTAL_CURT_CHG_POINT
	BUTTON_TEXT '= @"@B:9998@[決定]@/B@ @B:9999@[キャンセル]@/B@"
	;変更なしの場合は決定ボタンを押せない
ELSE
	BUTTON_TEXT '= @"@C:{カラー_選択不可}@[決定]@/C@ @B:9999@[キャンセル]@/B@"
ENDIF
CALLF TAG_PRINT(BUTTON_TEXT, 5)
REDRAW 1

;--------------
;-- 入力処理
;--------------
BINPUT
INPUT_VALUE = RESULT
CLEARLINE 1
;PRINTFORMW INPUT_VALUE:{INPUT_VALUE}

;--------------------------
;-- 入力ごとの処理実行部
;--------------------------
SELECTCASE INPUT_VALUE
		;増減ボタン
	CASE BTN_OFFSET * 1 TO ((BTN_OFFSET * (LIST_SIZE + 1)) - 1)
		SUBJECT_NO = INPUT_VALUE / BTN_OFFSET - 1
		CHANGE_NO  = INPUT_VALUE % BTN_OFFSET
		;ポイント変更処理(スキルポイント処理と共通)
		{
			CALL _ITEM_USING_COMMON_SKILL_POINT_OPERATE_CALCULATION(
				CHANGE_NO,
				TOINT(LIST_GET(LIST_INIT_POINT    , SUBJECT_NO)),
				TOINT(LIST_GET(LIST_LIMIT_POINT   , SUBJECT_NO)),
				LIST_CHANGE_VALUE,
				CHANGE_RATE,
				ITEM_STOCK,
				TOINT(LIST_GET(LIST_CURT_ITEM_USE_NUM, SUBJECT_NO)),
				TOTAL_CURT_CHG_POINT
				)
		}
		LIST_CURT_CHG_POINT    '= LIST_SET(LIST_CURT_CHG_POINT   , SUBJECT_NO, TOSTR(RESULT:0))
		LIST_CURT_ITEM_USE_NUM '= LIST_SET(LIST_CURT_ITEM_USE_NUM, SUBJECT_NO, TOSTR(RESULT:1))
		;決定ボタン
	CASE 9998
		;ポイント変更確定処理
		;確認メッセージを表示
		;・個別の確認メッセージが設定されている場合は表示
		TRYCCALLFORM ITEM_USING_COMMON_CONFIRM_MESSAGE_%ITEM_NAME%(ITEM_NAME, TOTAL_CURT_ITEM_USE_NUM)
			;・個別の確認メッセージが設定されていない場合は汎用メッセージを表示
		CATCH
			CALL ITEM_USING_COMMON_CONFIRM_MESSAGE(ITEM_NAME, TOTAL_CURT_ITEM_USE_NUM)
		ENDCATCH
		PRINTL
		CALL ASK_YN()
		CONFIRM_ANSWER = RESULT

		;変更確定時
		IF !CONFIRM_ANSWER
			;結果を格納
			RESULTS:0 '= LIST_CURT_CHG_POINT
			RESULTS:1 '= LIST_CURT_ITEM_USE_NUM
			;終了判定ON(1:変更)
			EXIT_FLAG = 1
		ENDIF
		;変更キャンセルした場合は何もしない(ループする)
		;キャンセルボタン
	CASE 9999
		;キャンセルメッセージを表示
		;変更内容は使用しないで終了する
		VARSET RESULTS
		PRINTW キャンセルしました
		;終了判定ON(0:キャンセル)
		EXIT_FLAG = 0
		;その他
	CASEELSE
		;処理なし
ENDSELECT

;--------------
;-- 終了処理
;--------------
IF EXIT_FLAG != -1
	;次回実行時用に変更内容を初期化
	VARSET LIST_CURT_CHG_POINT
	VARSET LIST_CURT_ITEM_USE_NUM
	;変更/キャンセル結果を返す
	RETURN EXIT_FLAG
ENDIF

;------------------
;-- ループ前処理
;------------------
REDRAW 0
;表示開始行までを消去する
CLEARLINE LINECOUNT - FIRST_LINE
;関数の最初に戻ってループする
RESTART

;-------------------------------------------------------------------------------
;内部処理：ポイント変更ボタン表示
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_BASE_POINT_OPERATE_CREATE_BUTTON(BUTTON_NO_BASE, SUBJECT_NAME, INIT_POINT, LIMIT_POINT, LIST_CHANGE_VALUE, CURT_CHG_POINT, REST_ITEM_STOCK)
#DIM  BUTTON_NO_BASE
#DIMS SUBJECT_NAME
#DIM  INIT_POINT
#DIM  LIMIT_POINT
#DIMS LIST_CHANGE_VALUE
#DIM  CURT_CHG_POINT
#DIM  REST_ITEM_STOCK

#DIM  DYNAMIC BUTTON_NO
#DIM  DYNAMIC NOW_POINT
#DIM  DYNAMIC L_CNT
#DIM  DYNAMIC CHANGE_VALUE
#DIMS DYNAMIC NUM_SYMBOL
#DIMS DYNAMIC BUTTON_TEXT
#DIMS DYNAMIC PRINT_TEXT
#DIMS DYNAMIC LIMIT_TEXT

;------------------------
;-- 表示テキストの作成
;------------------------
PRINT_TEXT '= ""

;項目名
PRINT_TEXT += @"　%SUBJECT_NAME% "

;ポイント現在値
;・変更中の場合は色を変更
NOW_POINT = INIT_POINT + CURT_CHG_POINT
IF CURT_CHG_POINT
	PRINT_TEXT += @"@C:{カラー_緑}@{NOW_POINT, 2}@/C@"
ELSE
	PRINT_TEXT += @"{NOW_POINT, 2}"
ENDIF

;ポイント変更量
;・プラス/ゼロの場合は＋記号を追加(マイナスは最初から付いてるので不要)
IF CURT_CHG_POINT >= 0
	NUM_SYMBOL '= "+"
ELSE
	NUM_SYMBOL '= ""
ENDIF

;・変更中の場合は色を変更
IF CURT_CHG_POINT > 0
	PRINT_TEXT += @" (@C:{カラー_緑}@%NUM_SYMBOL%{CURT_CHG_POINT, 2}@/C@)"
ELSE
	PRINT_TEXT += @" (%NUM_SYMBOL%{CURT_CHG_POINT, 2})"
ENDIF

;ポイント上限値
PRINT_TEXT += @" @C:{カラー_注釈}@上限:{LIMIT_POINT, 2}@/C@"

;ポイント増減ボタン
FOR L_CNT, 0, 4
	CHANGE_VALUE = TOINT(LIST_GET(LIST_CHANGE_VALUE, L_CNT))
	BUTTON_NO    = BUTTON_NO_BASE + L_CNT
	PRINT_TEXT += " "

	;ボタンのテキストを設定
	;・プラス/ゼロの場合は＋記号を追加(マイナスは最初から付いてるので不要)
	IF CHANGE_VALUE >= 0
		NUM_SYMBOL '= "+"
	ELSE
		NUM_SYMBOL '= ""
	ENDIF

	BUTTON_TEXT '= @"[%NUM_SYMBOL%{CHANGE_VALUE}]"

	;変更ボタン表示
	;・押せない(押す必要がない)ボタンは選択不可で表示
	;マイナスボタン：これ以上減らせない場合は×
	IF (CHANGE_VALUE < 0) && (CURT_CHG_POINT <= 0)
		PRINT_TEXT += @"@C:{カラー_選択不可}@%BUTTON_TEXT%@/C@"
		;プラスボタン：これ以上増やせない場合は×
	ELSEIF (CHANGE_VALUE > 0) && ((NOW_POINT >= LIMIT_POINT) || (REST_ITEM_STOCK <= 0))
		PRINT_TEXT += @"@C:{カラー_選択不可}@%BUTTON_TEXT%@/C@"
	ELSE
		PRINT_TEXT += @"@B:{BUTTON_NO}@%BUTTON_TEXT%@/B@"
	ENDIF
NEXT

;----------------------------
;-- 作成したテキストを表示
;----------------------------
;PRINTFORML %PRINT_TEXT%
CALLF TAG_PRINT(PRINT_TEXT, 5)


code:
;-------------------------------------------------------------------------------
;アイテム使用時の処理関数@ITEM_USING_COMMONから呼ばれるアイテム使用時処理
;[EFFECT_CATEGORY:ADD_SKILL_POINT] スキルポイント増加
;-------------------------------------------------------------------------------
@ITEM_USING_COMMON_ADD_SKILL_POINT(DICS_ITEM_EFFECT)
#DIMS DICS_ITEM_EFFECT
CALL _ITEM_USING_COMMON_SKILL_POINT(DICS_ITEM_EFFECT)

;-------------------------------------------------------------------------------
;アイテム使用時の処理関数@ITEM_USING_COMMONから呼ばれるアイテム使用時処理
;[EFFECT_CATEGORY:EXTEND_SKILL_POINT] スキルポイント拡張限界増加
;-------------------------------------------------------------------------------
@ITEM_USING_COMMON_EXTEND_SKILL_POINT(DICS_ITEM_EFFECT)
#DIMS DICS_ITEM_EFFECT
CALL _ITEM_USING_COMMON_SKILL_POINT(DICS_ITEM_EFFECT)

;-------------------------------------------------------------------------------
;内部処理：スキルポイント関連処理
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_SKILL_POINT(DICS_ITEM_EFFECT)
#DIMS DICS_ITEM_EFFECT

;DICS_ITEM_EFFECT関連変数
#DIM  DYNAMIC ITEM_ID
;#DIM  DYNAMIC TARGET_NUM
;#DIMS DYNAMIC TARGET_CLASS
;#DIMS DYNAMIC EFFECT_CATEGORY
;#DIMS DYNAMIC LIST_EFFECT_CLASS
;#DIMS DYNAMIC LIST_EFFECT_RATE
#DIMS DYNAMIC DESCRIPTION_BEFORE_USING

;DICS_ITEM_EFFECT派生変数
#DIMS DYNAMIC ITEM_NAME

;その他
#DIM  DYNAMIC SELECTED_CHARA_ID
#DIM  DYNAMIC TARGET_TEMP
#DIM  DYNAMIC FIRST_LINE

;-------------------------------------------------
;DICS_ITEM_EFFECTから各種情報を取得
;-------------------------------------------------
ITEM_ID           = TOINT(DIC_GET(DICS_ITEM_EFFECT, "ITEM_ID"))
;TARGET_NUM        = TOINT(DIC_GET(DICS_ITEM_EFFECT, "TARGET_NUM"))
;TARGET_CLASS      = %DIC_GET(DICS_ITEM_EFFECT, "TARGET_CLASS")%
;EFFECT_CATEGORY   = %DIC_GET(DICS_ITEM_EFFECT, "EFFECT_CATEGORY")%
;LIST_EFFECT_CLASS = %DIC_GET(DICS_ITEM_EFFECT, "LIST_EFFECT_CLASS")%
;LIST_EFFECT_RATE  = %DIC_GET(DICS_ITEM_EFFECT, "LIST_EFFECT_RATE")%
DESCRIPTION_BEFORE_USING = %DIC_GET(DICS_ITEM_EFFECT, "DESCRIPTION_BEFORE_USING")%

;DICS_ITEM_EFFECTの情報から派生情報を取得
CALL GET_ITEM_NAME(ITEM_ID)
ITEM_NAME     = %RESULTS%

;-------------------------------------------------
;キャラ選択ループ
;-------------------------------------------------
FIRST_LINE = LINECOUNT
WHILE 1
	REDRAW 0
	CLEARLINE LINECOUNT - FIRST_LINE
	;アイテムが0個になったら終了
	SIF HO_ITEM_STOCK:ITEM_ID == 0
		RETURN

	;アイテム効果/個数表示
	CALLF TAG_PRINT(@"%STRFORM(DESCRIPTION_BEFORE_USING)%", 1)
	CALLF TAG_PRINT(@"　%ITEM_NAME%({HO_ITEM_STOCK:ITEM_ID})", 1)
	PRINTL

	;リストを表示してキャラ選択
	CALL SELECT_CHARA_LIST_ONLY_LOGIC_SLG("SAME_FACTION", ITEM_NAME)
	CLEARLINE 1
	SELECTED_CHARA_ID = RESULT
	;キャラが選択されなかった場合は終了
	SIF SELECTED_CHARA_ID == -1
		RETURN
	PRINTL

	;TARGET情報の退避＆設定
	TARGET_TEMP = TARGET
	TARGET = SELECTED_CHARA_ID
	;スキルポイント操作画面を表示
	CALL _ITEM_USING_COMMON_SKILL_POINT_CHANGE_OPERATION(DICS_ITEM_EFFECT)
	;TARGET情報の復元
	TARGET = TARGET_TEMP
WEND

;-------------------------------------------------------------------------------
;内部処理：スキルポイント操作画面呼び出し処理
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_SKILL_POINT_CHANGE_OPERATION(DICS_ITEM_EFFECT)
#DIMS DICS_ITEM_EFFECT

;DICS_ITEM_EFFECT関連変数
#DIM  DYNAMIC ITEM_ID
;#DIM  DYNAMIC TARGET_NUM
;#DIMS DYNAMIC TARGET_CLASS
#DIMS DYNAMIC EFFECT_CATEGORY
#DIMS DYNAMIC LIST_EFFECT_CLASS
#DIMS DYNAMIC LIST_EFFECT_RATE
;#DIMS DYNAMIC DESCRIPTION_BEFORE_USING

;DICS_ITEM_EFFECT派生変数
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC ADDABLE_GENRE

;POINT_OPERATE用変数
;#DIMS DYNAMIC ITEM_NAME
#DIMS DYNAMIC LIST_SUBJECT_NAME
#DIMS DYNAMIC LIST_BASE_POINT
#DIMS DYNAMIC LIST_LIMIT_POINT
#DIM  DYNAMIC CHANGE_RATE
#DIM  DYNAMIC ITEM_STOCK
#DIM  DYNAMIC LARGE_CHANGE_VALUE
#DIMS DYNAMIC LIST_CHANGE_VALUE
#DIMS DYNAMIC LIST_ITEM_USE_NUM

;その他
#DIMS CONST ARRAY_POINT_NAME = "生活SP", "冒険SP", "性技SP"
#DIM DYNAMIC L_CNT
#DIM DYNAMIC BASE_POINT
#DIM DYNAMIC LIMIT_POINT

;-------------------------------------------------
;DICS_ITEM_EFFECTから各種情報を取得
;-------------------------------------------------
ITEM_ID           = TOINT(DIC_GET(DICS_ITEM_EFFECT, "ITEM_ID"))
;TARGET_NUM        = TOINT(DIC_GET(DICS_ITEM_EFFECT, "TARGET_NUM"))
;TARGET_CLASS      = %DIC_GET(DICS_ITEM_EFFECT, "TARGET_CLASS")%
EFFECT_CATEGORY   = %DIC_GET(DICS_ITEM_EFFECT, "EFFECT_CATEGORY")%
LIST_EFFECT_CLASS = %DIC_GET(DICS_ITEM_EFFECT, "LIST_EFFECT_CLASS")%
LIST_EFFECT_RATE  = %DIC_GET(DICS_ITEM_EFFECT, "LIST_EFFECT_RATE")%
;DESCRIPTION_BEFORE_USING = %DIC_GET(DICS_ITEM_EFFECT, "DESCRIPTION_BEFORE_USING")%

;DICS_ITEM_EFFECTの情報から派生情報を取得
CALL GET_ITEM_NAME(ITEM_ID)
ITEM_NAME     = %RESULTS%
ADDABLE_GENRE = _ITEM_USING_COMMON_SKILL_POINT_GET_ADDABLE_GENRE(LIST_EFFECT_CLASS)

;ポイント操作関数に渡す情報の作成
VARSET LIST_SUBJECT_NAME
VARSET LIST_BASE_POINT
VARSET LIST_LIMIT_POINT

;1個当たり変更量
CHANGE_RATE = TOINT(LIST_GET(LIST_EFFECT_RATE, 0))
;最大変更回数＝アイテムの所持数
ITEM_STOCK = HO_ITEM_STOCK:ITEM_ID
;変更ボタン(大)の操作量
LARGE_CHANGE_VALUE = 5
;大分類ごとの情報設定
FOR L_CNT, 0, 3
	IF GROUPMATCH(ADDABLE_GENRE, -1, L_CNT)
		;項目名
		LIST_SUBJECT_NAME '= LIST_ADD(LIST_SUBJECT_NAME, ARRAY_POINT_NAME:L_CNT)
		;ポイントの初期状態と上限値(効果カテゴリから判定して設定)
		CALL _ITEM_USING_COMMON_SKILL_POINT_GET_TARGET_POINT(L_CNT, EFFECT_CATEGORY)
		BASE_POINT  = RESULT:0
		LIMIT_POINT = RESULT:1
		LIST_BASE_POINT   '= LIST_ADD(LIST_BASE_POINT  , TOSTR(BASE_POINT))
		LIST_LIMIT_POINT  '= LIST_ADD(LIST_LIMIT_POINT , TOSTR(LIMIT_POINT))
	ENDIF
NEXT

;ポイント操作関数呼び出し
CALL _ITEM_USING_COMMON_SKILL_POINT_OPERATE(ITEM_NAME, LIST_SUBJECT_NAME, LIST_BASE_POINT, LIST_LIMIT_POINT, CHANGE_RATE, ITEM_STOCK, LARGE_CHANGE_VALUE)
LIST_CHANGE_VALUE '= RESULTS:0
LIST_ITEM_USE_NUM '= RESULTS:1

;変更した内容を反映する
IF RESULT
	CALL _ITEM_USING_COMMON_SKILL_POINT_CHANGE_CONFIRM(ITEM_ID, EFFECT_CATEGORY, LIST_EFFECT_CLASS, LIST_CHANGE_VALUE, LIST_ITEM_USE_NUM)
ENDIF

;-------------------------------------------------------------------------------
;内部処理：対象のスキル大分類の取得
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_SKILL_POINT_GET_ADDABLE_GENRE(LIST_EFFECT_CLASS)
#FUNCTION
#DIMS LIST_EFFECT_CLASS

#DIM  DYNAMIC ADDABLE_GENRE

;ADD_SKILL_POINT：スキルポイント増加
;　対象：全スキル
IF LIST_INDEXOF(LIST_EFFECT_CLASS, "ADD_SKILL_POINT") != -1
	ADDABLE_GENRE = -1

	;ADD_LEWD_SKILL_POINT：性技スキルポイント増加
	;　対象：性技スキル
ELSEIF LIST_INDEXOF(LIST_EFFECT_CLASS, "ADD_LEWD_SKILL_POINT") != -1
	ADDABLE_GENRE = スキル_大分類_性技

	;EXTEND_SKILL_POINT：冒険スキルポイント拡張上限増加
	;　対象：冒険スキル
ELSEIF LIST_INDEXOF(LIST_EFFECT_CLASS, "EXTEND_SKILL_POINT") != -1
	ADDABLE_GENRE = スキル_大分類_冒険

	;EXTEND_LEWD_SKILL_POINT：性技スキルポイント拡張上限増加
	;　対象：性技スキル
ELSEIF LIST_INDEXOF(LIST_EFFECT_CLASS, "EXTEND_LEWD_SKILL_POINT") != -1
	ADDABLE_GENRE = スキル_大分類_性技
ENDIF

RETURNF ADDABLE_GENRE

;-------------------------------------------------------------------------------
;内部処理：スキルポイント変更確定
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_SKILL_POINT_CHANGE_CONFIRM(ITEM_ID, EFFECT_CATEGORY, LIST_EFFECT_CLASS, LIST_CHANGE_POINT, LIST_ITEM_USE_NUM)
#DIM  ITEM_ID
#DIMS EFFECT_CATEGORY
#DIMS LIST_EFFECT_CLASS
#DIMS LIST_CHANGE_POINT
#DIMS LIST_ITEM_USE_NUM

#DIM DYNAMIC CHANGE_POINT
#DIM DYNAMIC ITEM_USE_NUM
#DIM DYNAMIC GENRE_NO
#DIM DYNAMIC L_CNT

#DIMS DYNAMIC CONFIRM_MESSAGE

;--------------------
;-- 変更対象：全部
;--------------------
;ADD_SKILL_POINT : スキルポイント増加
;　対象：全スキル
IF LIST_INDEXOF(LIST_EFFECT_CLASS, "ADD_SKILL_POINT") != -1
	CONFIRM_MESSAGE '= @"@C:{カラー_注意}@%ANAME(TARGET)%のスキルポイントが上昇しました@/@"
	CALLF TAG_PRINT(CONFIRM_MESSAGE, 1)
	;変更を反映
	FOR L_CNT, 0, 3
		;変更情報の取得
		CHANGE_POINT = TOINT(LIST_GET(LIST_CHANGE_POINT, L_CNT))
		ITEM_USE_NUM = TOINT(LIST_GET(LIST_ITEM_USE_NUM, L_CNT))
		IF ITEM_USE_NUM
			CALL _ITEM_USING_COMMON_SKILL_POINT_CHANGE_CONFIRM_POINT(ITEM_ID, L_CNT, EFFECT_CATEGORY, CHANGE_POINT, ITEM_USE_NUM)
		ENDIF
	NEXT
	WAIT
	RETURN
ENDIF

;---------------------
;-- 変更対象：1種類
;---------------------
;ADD_LEWD_SKILL_POINT : 性技スキルポイント増加
;　対象：性技スキル
IF LIST_INDEXOF(LIST_EFFECT_CLASS, "ADD_LEWD_SKILL_POINT") != -1
	CONFIRM_MESSAGE '= @"@C:{カラー_注意}@%ANAME(TARGET)%のスキルポイントが上昇しました@/@"
	GENRE_NO = スキル_大分類_性技

	;EXTEND_SKILL_POINT : 冒険スキルポイント拡張上限増加
	;　対象：冒険スキル
ELSEIF LIST_INDEXOF(LIST_EFFECT_CLASS, "EXTEND_SKILL_POINT") != -1
	CONFIRM_MESSAGE '= @"@C:{カラー_注意}@%ANAME(TARGET)%のスキル拡張限界が上昇しました@/@"
	GENRE_NO = スキル_大分類_冒険

	;EXTEND_LEWD_SKILL_POINT : 性技スキルポイント拡張上限増加
	;　対象：性技スキル
ELSEIF LIST_INDEXOF(LIST_EFFECT_CLASS, "EXTEND_LEWD_SKILL_POINT") != -1
	CONFIRM_MESSAGE '= @"@C:{カラー_注意}@%ANAME(TARGET)%のスキル拡張限界が上昇しました@/@"
	GENRE_NO = スキル_大分類_性技
ENDIF

;変更情報の取得
CHANGE_POINT = TOINT(LIST_GET(LIST_CHANGE_POINT, 0))
ITEM_USE_NUM = TOINT(LIST_GET(LIST_ITEM_USE_NUM, 0))
;メッセージ表示
CALLF TAG_PRINT(CONFIRM_MESSAGE, 1)
;ポイント更新処理
CALL _ITEM_USING_COMMON_SKILL_POINT_CHANGE_CONFIRM_POINT(ITEM_ID, GENRE_NO, EFFECT_CATEGORY, CHANGE_POINT, ITEM_USE_NUM)
WAIT

;-------------------------------------------------------------------------------
;内部処理：スキルポイント更新
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_SKILL_POINT_CHANGE_CONFIRM_POINT(ITEM_ID, GENRE_NO, EFFECT_CATEGORY, CHANGE_POINT, ITEM_USE_NUM)
#DIM  ITEM_ID
#DIM  GENRE_NO
#DIMS EFFECT_CATEGORY
#DIM  CHANGE_POINT
#DIM  ITEM_USE_NUM

#DIMS CONST ARRAY_POINT_NAME = "生活SP", "冒険SP", "性技SP"
#DIMS CONFIRM_MESSAGE
#DIM  BASE_POINT_BEFORE
#DIM  BASE_POINT_AFTER
#DIM  LIMIT_POINT

;変更前のポイント情報を取得
CALL _ITEM_USING_COMMON_SKILL_POINT_GET_TARGET_POINT(GENRE_NO, EFFECT_CATEGORY)
BASE_POINT_BEFORE = RESULT:0
LIMIT_POINT       = RESULT:1

;ポイントを加算
CALL _ITEM_USING_COMMON_SKILL_POINT_ADD_TARGET_POINT(GENRE_NO, EFFECT_CATEGORY, CHANGE_POINT)

;変更後のポイント情報を取得
CALL _ITEM_USING_COMMON_SKILL_POINT_GET_TARGET_POINT(GENRE_NO, EFFECT_CATEGORY)
BASE_POINT_AFTER = RESULT:0
LIMIT_POINT      = RESULT:1

;アイテム数を減らす
HO_ITEM_STOCK:ITEM_ID -= ITEM_USE_NUM

;メッセージ表示
CONFIRM_MESSAGE '= @"　@C:{カラー_注意}@%ARRAY_POINT_NAME:GENRE_NO% :{BASE_POINT_BEFORE, 2}/{LIMIT_POINT, 2} → {BASE_POINT_AFTER, 2}/{LIMIT_POINT, 2}@/@"
CALLF TAG_PRINT(CONFIRM_MESSAGE, 1)

;-------------------------------------------------------------------------------
;内部処理：指定した効果カテゴリのポイント情報を取得
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_SKILL_POINT_GET_TARGET_POINT(GENRE_NO, EFFECT_CATEGORY)
#DIM GENRE_NO
#DIMS EFFECT_CATEGORY

;スキルポイント上限の格納先リスト(CFLAG)
#DIM CONST ARRAY_CFLAG_NO_LIMIT = GETNUM(CFLAG, "生活スキル拡張上限"), GETNUM(CFLAG, "冒険スキル拡張上限"), GETNUM(CFLAG, "性技スキル拡張上限")
;スキルポイント上限拡張最大値(定義元が見当たらないので暫定で定義)
#DIM CONST ARRAY_EXTED_LIMIT = 0, 18, 18

#DIM DYNAMIC BASE_POINT
#DIM DYNAMIC LIMIT_POINT
#DIM DYNAMIC CFLAG_NO_LIMIT

CFLAG_NO_LIMIT = ARRAY_CFLAG_NO_LIMIT:GENRE_NO
SELECTCASE EFFECT_CATEGORY
	CASE "ADD_SKILL_POINT"
		;カテゴリ：スキルポイント増加
		;取得内容：スキルポイント/スキルポイント上限
		BASE_POINT  = BASE_SKILL_POINT:TARGET:GENRE_NO
		LIMIT_POINT = SKILL_GET_BASE_SP_EXTEND_LIMIT(TARGET, GENRE_NO)
	CASE "EXTEND_SKILL_POINT"
		;カテゴリ：スキルポイント上限拡張
		;取得内容：スキルポイント上限/スキルポイント上限拡張最大値
		BASE_POINT  = SKILL_GET_BASE_SP_EXTEND_LIMIT(TARGET, GENRE_NO)
		LIMIT_POINT = SKILL_GET_BASE_SP_EXTEND_LIMIT(TARGET, GENRE_NO) - CFLAG:TARGET:CFLAG_NO_LIMIT + ARRAY_EXTED_LIMIT:GENRE_NO
ENDSELECT

RETURN BASE_POINT, LIMIT_POINT

;-------------------------------------------------------------------------------
;内部処理：指定した効果カテゴリのポイントを加算
;-------------------------------------------------------------------------------
;・広域変数を直接変更する。
;　[EFFECT_CATEGORY:ADD_SKILL_POINT]    BASE_SKILL_POINT, HO_ITEM_STOCK
;　[EFFECT_CATEGORY:EXTEND_SKILL_POINT] CFLAG:＊＊スキル拡張上限, HO_ITEM_STOCK
@_ITEM_USING_COMMON_SKILL_POINT_ADD_TARGET_POINT(GENRE_NO, EFFECT_CATEGORY, CHANGE_POINT)
#DIM  GENRE_NO
#DIMS EFFECT_CATEGORY
#DIM  CHANGE_POINT

#DIM  CONST ARRAY_CFLAG_NO_LIMIT = GETNUM(CFLAG, "生活スキル拡張上限"), GETNUM(CFLAG, "冒険スキル拡張上限"), GETNUM(CFLAG, "性技スキル拡張上限")
#DIM  CFLAG_NO_LIMIT

SELECTCASE EFFECT_CATEGORY
	CASE "ADD_SKILL_POINT"
		;スキルポイントを加算
		BASE_SKILL_POINT:TARGET:GENRE_NO += CHANGE_POINT
	CASE "EXTEND_SKILL_POINT"
		;スキルポイント拡張上限を増加
		CFLAG_NO_LIMIT = ARRAY_CFLAG_NO_LIMIT:GENRE_NO
		CFLAG:TARGET:CFLAG_NO_LIMIT += CHANGE_POINT
ENDSELECT


code:
;===============================================================================
;スキルポイント操作関数
;===============================================================================
@_ITEM_USING_COMMON_SKILL_POINT_OPERATE(ITEM_NAME, LIST_SUBJECT_NAME, LIST_INIT_POINT, LIST_LIMIT_POINT, CHANGE_RATE, ITEM_STOCK, LARGE_CHANGE_VALUE)
#DIMS ITEM_NAME
#DIMS LIST_SUBJECT_NAME
#DIMS LIST_INIT_POINT
#DIMS LIST_LIMIT_POINT
#DIM  CHANGE_RATE
#DIM  ITEM_STOCK
#DIM  LARGE_CHANGE_VALUE

#DIM CONST BTN_OFFSET = 100

#DIMS DYNAMIC ARGUMENT_DATA
#DIMS DYNAMIC BUTTON_TEXT
#DIM  DYNAMIC LIST_SIZE
#DIMS DYNAMIC LIST_CHANGE_VALUE
#DIMS DYNAMIC LIST_CURT_CHG_POINT		;List Current Change Point
#DIMS DYNAMIC LIST_CURT_ITEM_USE_NUM	;List Current Item Used Number
#DIM  DYNAMIC TOTAL_CURT_CHG_POINT		;Total Current Change Point
#DIM  DYNAMIC TOTAL_CURT_ITEM_USE_NUM	;Total Current Item Used Number
#DIM  DYNAMIC BUTTON_NO_BASE
#DIM  DYNAMIC L_CNT
#DIM  DYNAMIC INPUT_VALUE
#DIM  DYNAMIC SUBJECT_NO
#DIM  DYNAMIC CHANGE_NO
#DIM  DYNAMIC REST_ITEM_STOCK
#DIM  DYNAMIC CONFIRM_ANSWER
#DIM  DYNAMIC EXIT_FLAG
#DIM  DYNAMIC FIRST_LINE

;--------------
;-- 事前処理
;--------------
;表示開始行を記憶
FIRST_LINE = LINECOUNT
;リストの要素数の取得
LIST_SIZE =LIST_COUNT(LIST_SUBJECT_NAME)
;各ボタンを押した際の変更量を設定
LIST_CHANGE_VALUE '= ""
LIST_CHANGE_VALUE '= LIST_ADD(LIST_CHANGE_VALUE, TOSTR(-1 * LARGE_CHANGE_VALUE))
LIST_CHANGE_VALUE '= LIST_ADD(LIST_CHANGE_VALUE, TOSTR(-1))
LIST_CHANGE_VALUE '= LIST_ADD(LIST_CHANGE_VALUE, TOSTR( 1))
LIST_CHANGE_VALUE '= LIST_ADD(LIST_CHANGE_VALUE, TOSTR( 1 * LARGE_CHANGE_VALUE))
;終了判定フラグ
EXIT_FLAG = -1

;--------------
;-- 表示処理
;--------------
REDRAW 0
;1.残数表示
TOTAL_CURT_CHG_POINT = 0
TOTAL_CURT_ITEM_USE_NUM = 0
FOR L_CNT, 0, LIST_SIZE
	TOTAL_CURT_CHG_POINT    += TOINT(LIST_GET(LIST_CURT_CHG_POINT   , L_CNT))
	TOTAL_CURT_ITEM_USE_NUM += TOINT(LIST_GET(LIST_CURT_ITEM_USE_NUM, L_CNT))
NEXT
REST_ITEM_STOCK = ITEM_STOCK - TOTAL_CURT_ITEM_USE_NUM
CALLF TAG_PRINT(@"　%ITEM_NAME% ({ITEM_STOCK} → @C:{カラー_オレンジ}@{REST_ITEM_STOCK}@/C@)", 1)
PRINTL
;2.項目ごとのボタンを作成
FOR L_CNT, 0, LIST_SIZE
	BUTTON_NO_BASE = BTN_OFFSET * (L_CNT + 1)
	{
		CALL _ITEM_USING_COMMON_SKILL_POINT_OPERATE_CREATE_BUTTON(
			BUTTON_NO_BASE,
			LIST_GET(LIST_SUBJECT_NAME  , L_CNT),
			TOINT(LIST_GET(LIST_INIT_POINT    , L_CNT)),
			TOINT(LIST_GET(LIST_LIMIT_POINT   , L_CNT)),
			LIST_CHANGE_VALUE,
			TOINT(LIST_GET(LIST_CURT_CHG_POINT, L_CNT)),
			REST_ITEM_STOCK
			)
	}
NEXT
;3.決定/キャンセルボタン作成
PRINTL
IF TOTAL_CURT_CHG_POINT
	BUTTON_TEXT '= @"@B:9998@[決定]@/B@ @B:9999@[キャンセル]@/B@"
	;変更なしの場合は決定ボタンを押せない
ELSE
	BUTTON_TEXT '= @"@C:{カラー_選択不可}@[決定]@/C@ @B:9999@[キャンセル]@/B@"
ENDIF
CALLF TAG_PRINT(BUTTON_TEXT, 5)
REDRAW 1

;--------------
;-- 入力処理
;--------------
BINPUT
INPUT_VALUE = RESULT
CLEARLINE 1
;PRINTFORMW INPUT_VALUE:{INPUT_VALUE}

;--------------------------
;-- 入力ごとの処理実行部
;--------------------------
SELECTCASE INPUT_VALUE
		;増減ボタン
	CASE BTN_OFFSET * 1 TO ((BTN_OFFSET * (LIST_SIZE + 1)) - 1)
		SUBJECT_NO = INPUT_VALUE / BTN_OFFSET - 1
		CHANGE_NO  = INPUT_VALUE % BTN_OFFSET
		;ポイント変更処理
		{
			CALL _ITEM_USING_COMMON_SKILL_POINT_OPERATE_CALCULATION(
				CHANGE_NO,
				TOINT(LIST_GET(LIST_INIT_POINT    , SUBJECT_NO)),
				TOINT(LIST_GET(LIST_LIMIT_POINT   , SUBJECT_NO)),
				LIST_CHANGE_VALUE,
				CHANGE_RATE,
				ITEM_STOCK,
				TOINT(LIST_GET(LIST_CURT_ITEM_USE_NUM, SUBJECT_NO)),
				TOTAL_CURT_CHG_POINT
				)
		}
		LIST_CURT_CHG_POINT    '= LIST_SET(LIST_CURT_CHG_POINT   , SUBJECT_NO, TOSTR(RESULT:0))
		LIST_CURT_ITEM_USE_NUM '= LIST_SET(LIST_CURT_ITEM_USE_NUM, SUBJECT_NO, TOSTR(RESULT:1))
		;決定ボタン
	CASE 9998
		;ポイント変更確定処理
		;確認メッセージを表示
		;・個別の確認メッセージが設定されている場合は表示
		TRYCCALLFORM ITEM_USING_COMMON_CONFIRM_MESSAGE_%ITEM_NAME%(ITEM_NAME, TOTAL_CURT_ITEM_USE_NUM)
			;・個別の確認メッセージが設定されていない場合は汎用メッセージを表示
		CATCH
			CALL ITEM_USING_COMMON_CONFIRM_MESSAGE(ITEM_NAME, TOTAL_CURT_ITEM_USE_NUM)
		ENDCATCH
		PRINTL
		CALL ASK_YN()
		CONFIRM_ANSWER = RESULT

		;変更確定時
		IF !CONFIRM_ANSWER
			;結果を格納
			RESULTS:0 '= LIST_CURT_CHG_POINT
			RESULTS:1 '= LIST_CURT_ITEM_USE_NUM
			;終了判定ON(1:変更)
			EXIT_FLAG = 1
		ENDIF
		;変更キャンセルした場合は何もしない(ループする)
		;キャンセルボタン
	CASE 9999
		;キャンセルメッセージを表示
		;変更内容は使用しないで終了する
		VARSET RESULTS
		PRINTW キャンセルしました
		;終了判定ON(0:キャンセル)
		EXIT_FLAG = 0
		;その他
	CASEELSE
		;処理なし
ENDSELECT

;--------------
;-- 終了処理
;--------------
IF EXIT_FLAG != -1
	;次回実行時用に変更内容を初期化
	VARSET LIST_CURT_CHG_POINT
	VARSET LIST_CURT_ITEM_USE_NUM
	;変更/キャンセル結果を返す
	RETURN EXIT_FLAG
ENDIF

;------------------
;-- ループ前処理
;------------------
REDRAW 0
;表示開始行までを消去する
CLEARLINE LINECOUNT - FIRST_LINE
;関数の最初に戻ってループする
RESTART

;-------------------------------------------------------------------------------
;内部処理：ポイント変更ボタン表示
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_SKILL_POINT_OPERATE_CREATE_BUTTON(BUTTON_NO_BASE, SUBJECT_NAME, INIT_POINT, LIMIT_POINT, LIST_CHANGE_VALUE, CURT_CHG_POINT, REST_ITEM_STOCK)
#DIM  BUTTON_NO_BASE
#DIMS SUBJECT_NAME
#DIM  INIT_POINT
#DIM  LIMIT_POINT
#DIMS LIST_CHANGE_VALUE
#DIM  CURT_CHG_POINT
#DIM  REST_ITEM_STOCK

#DIM  DYNAMIC BUTTON_NO
#DIM  DYNAMIC NOW_POINT
#DIM  DYNAMIC L_CNT
#DIM  DYNAMIC CHANGE_VALUE
#DIMS DYNAMIC NUM_SYMBOL
#DIMS DYNAMIC BUTTON_TEXT
#DIMS DYNAMIC PRINT_TEXT

;------------------------
;-- 表示テキストの作成
;------------------------
PRINT_TEXT '= ""

;項目名
PRINT_TEXT += @"　%SUBJECT_NAME% "

;ポイント現在値
;・変更中の場合は色を変更
NOW_POINT = INIT_POINT + CURT_CHG_POINT
IF CURT_CHG_POINT
	PRINT_TEXT += @"@C:{カラー_緑}@{NOW_POINT, 2}@/C@"
ELSE
	PRINT_TEXT += @"{NOW_POINT, 2}"
ENDIF

;ポイント上限値
PRINT_TEXT += @"/{LIMIT_POINT, 2}"

;ポイント変更量
;・プラス/ゼロの場合は＋記号を追加(マイナスは最初から付いてるので不要)
IF CURT_CHG_POINT >= 0
	NUM_SYMBOL '= "+"
ELSE
	NUM_SYMBOL '= ""
ENDIF

;・変更中の場合は色を変更
IF CURT_CHG_POINT > 0
	PRINT_TEXT += @" (@C:{カラー_緑}@%NUM_SYMBOL%{CURT_CHG_POINT, 2}@/C@)"
ELSE
	PRINT_TEXT += @" (%NUM_SYMBOL%{CURT_CHG_POINT, 2})"
ENDIF

;ポイント増減ボタン
FOR L_CNT, 0, 4
	CHANGE_VALUE = TOINT(LIST_GET(LIST_CHANGE_VALUE, L_CNT))
	BUTTON_NO    = BUTTON_NO_BASE + L_CNT
	PRINT_TEXT += " "

	;ボタンのテキストを設定
	;・プラス/ゼロの場合は＋記号を追加(マイナスは最初から付いてるので不要)
	IF CHANGE_VALUE >= 0
		NUM_SYMBOL '= "+"
	ELSE
		NUM_SYMBOL '= ""
	ENDIF

	BUTTON_TEXT '= @"[%NUM_SYMBOL%{CHANGE_VALUE}]"

	;変更ボタン表示
	;・押せない(押す必要がない)ボタンは選択不可で表示
	;マイナスボタン：これ以上減らせない場合は×
	IF (CHANGE_VALUE < 0) && (CURT_CHG_POINT <= 0)
		PRINT_TEXT += @"@C:{カラー_選択不可}@%BUTTON_TEXT%@/C@"
		;プラスボタン：これ以上増やせない場合は×
	ELSEIF (CHANGE_VALUE > 0) && ((NOW_POINT >= LIMIT_POINT) || (REST_ITEM_STOCK <= 0))
		PRINT_TEXT += @"@C:{カラー_選択不可}@%BUTTON_TEXT%@/C@"
	ELSE
		PRINT_TEXT += @"@B:{BUTTON_NO}@%BUTTON_TEXT%@/B@"
	ENDIF
NEXT

;----------------------------
;-- 作成したテキストを表示
;----------------------------
;PRINTFORML %PRINT_TEXT%
CALLF TAG_PRINT(PRINT_TEXT, 5)

;-------------------------------------------------------------------------------
;内部処理：ポイント変更量計算処理
;-------------------------------------------------------------------------------
@_ITEM_USING_COMMON_SKILL_POINT_OPERATE_CALCULATION(CHANGE_NO, INIT_POINT, LIMIT_POINT, LIST_CHANGE_VALUE, CHANGE_RATE, ITEM_STOCK, CURT_ITEM_USE_NUM, TOTAL_CURT_CHG_POINT)
#DIM  CHANGE_NO
#DIM  INIT_POINT
#DIM  LIMIT_POINT
#DIMS LIST_CHANGE_VALUE
#DIM  CHANGE_RATE
#DIM  ITEM_STOCK
#DIM  CURT_ITEM_USE_NUM
#DIM  TOTAL_CURT_CHG_POINT

#DIM DYNAMIC CHANGE_VALUE
#DIM DYNAMIC POINT_BEFORE
#DIM DYNAMIC POINT_AFTER
#DIM DYNAMIC ITEM_USE_NUM
#DIM DYNAMIC REST_ITEM_STOCK
#DIM DYNAMIC RESULT_CHANGE_POINT
#DIM DYNAMIC RESULT_ITEM_USE_NUM

;押したボタンに対応する変化量を決定
CHANGE_VALUE = TOINT(LIST_GET(LIST_CHANGE_VALUE, CHANGE_NO))

;変更前のポイントを取得
POINT_BEFORE = INIT_POINT + CURT_ITEM_USE_NUM * CHANGE_RATE

;変更後のポイント算出 (下限:基本値, 上限:上限値)
POINT_AFTER = LIMIT(POINT_BEFORE + (CHANGE_VALUE * CHANGE_RATE), INIT_POINT, LIMIT_POINT)

;変化回数がアイテム数を越えないように補正
ITEM_USE_NUM    = (POINT_AFTER - POINT_BEFORE + TOTAL_CURT_CHG_POINT) / CHANGE_RATE
REST_ITEM_STOCK = ITEM_STOCK - ITEM_USE_NUM

IF REST_ITEM_STOCK < 0
	POINT_AFTER = POINT_AFTER + (REST_ITEM_STOCK * CHANGE_RATE)
	ITEM_USE_NUM -= REST_ITEM_STOCK
ENDIF

;現在ポイントとの差分をポイント変更量として格納
RESULT_CHANGE_POINT = POINT_AFTER - INIT_POINT
;ポイント変更量と変更率から変更回数を算出(切り上げ除算)
RESULT_ITEM_USE_NUM = (RESULT_CHANGE_POINT + CHANGE_RATE - 1) / CHANGE_RATE

;不具合修正:算出された変更回数が在庫を超えている場合、再算出
IF RESULT_ITEM_USE_NUM > ITEM_STOCK
	;変更後ポイントの再算出
	POINT_AFTER = LIMIT(POINT_BEFORE + (ITEM_USE_NUM * CHANGE_RATE), INIT_POINT, LIMIT_POINT)
	;現在ポイントとの差分をポイント変更量として格納
	RESULT_CHANGE_POINT = POINT_AFTER - INIT_POINT
	;使用回数補正
	RESULT_ITEM_USE_NUM = ITEM_USE_NUM
ENDIF

; DEBUGPRINTFORM "----------------------------------------"
; DEBUGPRINTFORML CHANGE_NO:{CHANGE_NO}
; DEBUGPRINTFORML CHANGE_VALUE:{CHANGE_VALUE}
; DEBUGPRINTFORML CHANGE_RATE:{CHANGE_RATE}
; DEBUGPRINTFORML LIMIT_POINT:{LIMIT_POINT}
; DEBUGPRINTFORML INIT_POINT:{INIT_POINT}
; DEBUGPRINTFORML POINT_BEFORE:{POINT_BEFORE}
; DEBUGPRINTFORML POINT_AFTER:{POINT_AFTER}
; DEBUGPRINTFORML ITEM_USE_NUM:{ITEM_USE_NUM}
; DEBUGPRINTFORML REST_ITEM_STOCK:{REST_ITEM_STOCK}
; DEBUGPRINTFORML RESULT_CHANGE_POINT:{RESULT_CHANGE_POINT}
; DEBUGPRINTFORML RESULT_ITEM_USE_NUM:{RESULT_ITEM_USE_NUM}
; DEBUGPRINTFORML "----------------------------------------"

RETURN RESULT_CHANGE_POINT, RESULT_ITEM_USE_NUM

;-------------------------------------------------------------------------------
;内部処理：ポイント確定確認メッセージ(汎用)
;-------------------------------------------------------------------------------
@ITEM_USING_COMMON_CONFIRM_MESSAGE(ITEM_NAME, ITEM_USE_NUM)
#DIMS ITEM_NAME
#DIM  ITEM_USE_NUM

PRINTL
CALLF TAG_PRINT(@"1x %ITEM_NAME%を{ITEM_USE_NUM} will be used. Continue?", 1)


code:
;-----------------------------------
;アイテム名を取得
;-----------------------------------
@GET_ITEM_NAME(ITEM_ID)
#DIM ITEM_ID
TRYCCALLFORM GET_ITEM_NAME_{ITEM_ID}
    RETURN 0
CATCH
    RESULTS '= ""
ENDCATCH
RETURN -1
;-----------------------------------
;アイテムの分類を取得
;-----------------------------------
@GET_ITEM_CATEGORY(ITEM_ID)
#DIM ITEM_ID
TRYCCALLFORM GET_ITEM_CATEGORY_{ITEM_ID}
    RETURN 0
CATCH
    RESULTS:0 = ""
    RESULTS:1 = ""
ENDCATCH
RETURN -1

;-----------------------------------
;アイテムの説明を取得
;-----------------------------------
@GET_ITEM_DESCRIPTION(ITEM_ID)
#DIM ITEM_ID
TRYCCALLFORM GET_ITEM_DESCRIPTION_{ITEM_ID}
    RETURN 0
CATCH
    RESULTS:0 = ""
    RESULTS:1 = ""
ENDCATCH
RETURN -1

;-----------------------------------
;アイテムに関する情報をSTATUS配列に取得
;-----------------------------------
@GET_ITEM_INFO_ALL(ITEM_ID, STATUS)
#DIM ITEM_ID
#DIM REF STATUS
VARSET STATUS, 0
TRYCCALLFORM GET_ITEM_INFO_{ITEM_ID}(STATUS)
    RETURN 0
CATCH
ENDCATCH
RETURN -1

;-----------------------------------
;アイテムに関する情報のうち、STATUS_IDで指定したものを返す
;-----------------------------------
@GET_ITEM_INFO(ITEM_ID, STATUS_ID)
#DIM ITEM_ID
#DIM STATUS_ID
#DIM STATUS, STATUS_LENGTH
VARSET STATUS
CALL GET_ITEM_INFO_ALL(ITEM_ID, STATUS)
SIF RESULT == -1
    RETURN -1
RETURN STATUS:STATUS_ID

;-----------------------------------
;アイテムが作成可能なモジュールか確認
;-----------------------------------
@CHECK_ITEM_CRAFTABLE(ITEM_ID, MODULE_ID)
#DIM ITEM_ID
#DIM MODULE_ID
TRYCCALLFORM CHECK_ITEM_CRAFTABLE_{ITEM_ID}(MODULE_ID)
    IF RESULT
        RETURN 1
    ELSE
        RETURN -1
    ENDIF
CATCH
ENDCATCH
RETURN -1

;-----------------------------------
;アイテムの素材を取得
;-----------------------------------
@GET_ITEM_MATERIAL_NEEDS(ITEM_ID, MATERIAL_NEEDS, RECIPE_ID = 0)
#DIM ITEM_ID
#DIM REF MATERIAL_NEEDS
#DIM RECIPE_ID
VARSET MATERIAL_NEEDS, 0
IF !RECIPE_ID
    TRYCCALLFORM GET_ITEM_MATERIAL_{ITEM_ID}(MATERIAL_NEEDS)
        IF RESULT
            RETURN 1
        ELSE
            RETURN -1
        ENDIF
    CATCH
    ENDCATCH
ELSE
    ;代替レシピ用関数
    TRYCCALLFORM GET_ITEM_MATERIAL_{ITEM_ID}_{RECIPE_ID}(MATERIAL_NEEDS)
        IF RESULT
            RETURN 1
        ELSE
            RETURN -1
        ENDIF
    CATCH
    ENDCATCH
ENDIF
RETURN -1

;-----------------------------------
;アイテムが店に並ぶか
;-----------------------------------
@IS_MARKET_AVAILABLE_ITEM(ITEM_ID)
#DIM ITEM_ID
TRYCCALLFORM IS_MARKET_AVAILABLE_ITEM_{ITEM_ID}
    RETURN RESULT
CATCH
ENDCATCH
RETURN -1

;-----------------------------------
;アイテムが敵からドロップするか
;-----------------------------------
@IS_DROPPABLE_ITEM(ITEM_ID)
#DIM ITEM_ID
TRYCCALLFORM IS_DROPPABLE_ITEM_{ITEM_ID}
    RETURN RESULT
CATCH
ENDCATCH
RETURN -1

;-----------------------------------
;指定した分類のアイテムを探し、ITEM_LIST配列に格納する。
;小分類(LOWER_CLASS)は省略可能
;返り値として、該当するアイテムの数を返す
;-----------------------------------
@GET_ITEM_LIST_BY_CATEGORY(ITEM_LIST, UPPER_CLASS, LOWER_CLASS = "")
#DIM REF ITEM_LIST, 0
#DIMS UPPER_CLASS
#DIMS LOWER_CLASS
#DIM ITEM_NUM

VARSET ITEM_LIST, -1
ITEM_NUM = 0

IF LOWER_CLASS == ""
    FOR LOCAL, 0, ITEM_LENGTH
        CALL GET_ITEM_CATEGORY(LOCAL)
        SIF RESULT == -1
            CONTINUE
        IF RESULTS:0 == UPPER_CLASS
            ITEM_LIST:ITEM_NUM = LOCAL
            ITEM_NUM += 1
        ENDIF
    NEXT
ELSE
    FOR LOCAL, 0, ITEM_LENGTH
        CALL GET_ITEM_CATEGORY(LOCAL)
        SIF RESULT == -1
            CONTINUE
        IF RESULTS:0 == UPPER_CLASS && RESULTS:1 == LOWER_CLASS
            ITEM_LIST:ITEM_NUM = LOCAL
            ITEM_NUM += 1
        ENDIF
    NEXT
ENDIF

RETURN ITEM_NUM

;保持しているアイテムの量を返す
@GET_ITEM_STOCK(ITEM_ID)
#FUNCTION
#DIM ITEM_ID
#DIM AMOUNT
AMOUNT = HO_ITEM_STOCK:ITEM_ID

RETURNF AMOUNT

;MATERIAL_NEEDS配列の格納数だけ在庫からアイテムを減らす。
@USE_MATERIAL(MATERIAL_NEEDS, COUNT_TIMES = 1)
#DIM REF MATERIAL_NEEDS
#DIM COUNT_TIMES
FOR LOCAL, 0, ITEM_LENGTH
    IF MATERIAL_NEEDS:LOCAL > 0
        CALL SYNC_AND_CHANGE_STOCK(LOCAL, -(MATERIAL_NEEDS:LOCAL) * COUNT_TIMES)
    ENDIF
NEXT
; 1つのアイテムの在庫を増減
@CHANGE_ITEM_STOCK(ITEM_ID, AMOUNT)
#DIM ITEM_ID
#DIM AMOUNT
CALL SYNC_AND_CHANGE_STOCK(ITEM_ID, AMOUNT)
RETURN

; 増減をセットした配列を渡して複数のアイテムの在庫を増減
@CHANGE_ITEM_STOCK_M(CHANGE_ITEM_AMOUNT_ARRAY)
#DIM REF CHANGE_ITEM_AMOUNT_ARRAY
FOR LOCAL, 0, ITEM_LENGTH
    IF CHANGE_ITEM_AMOUNT_ARRAY:LOCAL != 0
        CALL SYNC_AND_CHANGE_STOCK(LOCAL, CHANGE_ITEM_AMOUNT_ARRAY:LOCAL)
    ENDIF
NEXT
RETURN

; 在庫数を増減する共通の処理
@SYNC_AND_CHANGE_STOCK(ITEM_ID, AMOUNT)
#DIM ITEM_ID
#DIM AMOUNT
RESULT = 0
TRYCALLFORM CHECK_ITEM_STOCK_SYNCED_WITH_TRAIN_ITEM_{ITEM_ID}()
IF RESULT
    ITEM:RESULT = MAX(0, ITEM:RESULT + AMOUNT)
ENDIF

SELECTCASE ITEM_ID
    CASE ITEM_ディナリ
        MONEY = MAX(0, MONEY + AMOUNT)
    CASE ITEM_名誉点
        QST_PRESTIGE_POINT = MAX(0, QST_PRESTIGE_POINT + AMOUNT)
    CASE ITEM_淫堕点
        QST_LEWD_POINT = MAX(0, QST_LEWD_POINT + AMOUNT)
    CASEELSE
        HO_ITEM_STOCK:ITEM_ID = MAX(0, HO_ITEM_STOCK:ITEM_ID + AMOUNT)
ENDSELECT

RETURN

;食事効果
@GET_MEAL_INSTANT_BUFF(MEAL_EFFECT_ID, STATUS)
#FUNCTION
#DIM  MEAL_EFFECT_ID
#DIMS STATUS

SIF MEAL_EFFECT_ID == -1
    RETURNF 0

TRYCALLFORMF GET_INFO_INSTANT_BUFF_{MEAL_EFFECT_ID}(STATUS)
RETURNF RESULT


code:
;-------------------------
; アイテム、アイテムクラフト関連
;-------------------------
#DIM CONST ITEM_LENGTH = 1000
#DIM SAVEDATA HO_ITEM_STOCK, ITEM_LENGTH
#DIM SAVEDATA HO_ITEM_TRADE_STOCK, ITEM_LENGTH
#DIM HO_アイテム変化量, ITEM_LENGTH ;コマンド実行時のアイテム変化量を地の文出力用に保持する用途で使用

;ITEM_ID定義
;-------------------------------------------------
#DIM CONST ITEM_木材 = 0
#DIM CONST ITEM_石材 = 1
#DIM CONST ITEM_銅鉱石 = 2
#DIM CONST ITEM_鉄鉱石 = 3
#DIM CONST ITEM_銀鉱石 = 4
#DIM CONST ITEM_金鉱石 = 5
#DIM CONST ITEM_銅インゴット = 6
#DIM CONST ITEM_鉄インゴット = 7
#DIM CONST ITEM_銀インゴット = 8
#DIM CONST ITEM_金インゴット = 9
#DIM CONST ITEM_マナ結晶 = 10
#DIM CONST ITEM_マナ触媒 = 11
#DIM CONST ITEM_動物の革 = 12
#DIM CONST ITEM_動物の肉 = 13
#DIM CONST ITEM_乳 = 14
#DIM CONST ITEM_骨 = 15
#DIM CONST ITEM_薬草 = 16
#DIM CONST ITEM_香草 = 17
#DIM CONST ITEM_植物性オイル = 18
#DIM CONST ITEM_植物性繊維 = 19
#DIM CONST ITEM_プラントラバー = 20
#DIM CONST ITEM_薬草粉末 = 21
#DIM CONST ITEM_布 = 22
#DIM CONST ITEM_マナグラス = 23
#DIM CONST ITEM_精液 = 24
#DIM CONST ITEM_媚薬 = 25
#DIM CONST ITEM_ポーション = 26
#DIM CONST ITEM_蒸留酒 = 27
#DIM CONST ITEM_肥料 = 30
#DIM CONST ITEM_小麦 = 31
#DIM CONST ITEM_パン = 35
#DIM CONST ITEM_サンドウィッチ = 36
#DIM CONST ITEM_動物の卵 = 37
#DIM CONST ITEM_動物性油 = 38
#DIM CONST ITEM_鳥の羽 = 39
#DIM CONST ITEM_魔獣の肉片 = 40
#DIM CONST ITEM_魔獣の心核 = 41
#DIM CONST ITEM_動物の糞 = 44
#DIM CONST ITEM_石炭 = 45
#DIM CONST ITEM_硫黄 = 46
#DIM CONST ITEM_火薬 = 47
#DIM CONST ITEM_高効率魔導触媒 = 48
#DIM CONST ITEM_岩塩 = 49
#DIM CONST ITEM_鋼インゴット = 50
#DIM CONST ITEM_バター = 51
#DIM CONST ITEM_ホワイトソース = 52
#DIM CONST ITEM_パスタ = 53
#DIM CONST ITEM_トマトソース = 54
#DIM CONST ITEM_金属細工 = 55
#DIM CONST ITEM_宝石 = 56
#DIM CONST ITEM_竜の牙 = 57
#DIM CONST ITEM_精霊石 = 58
#DIM CONST ITEM_ウーツ鋼インゴット = 59
#DIM CONST ITEM_建築資材 = 60
#DIM CONST ITEM_川エビ = 61
#DIM CONST ITEM_ザリガニ = 62
#DIM CONST ITEM_カニの肉 = 63
#DIM CONST ITEM_スッポン = 64
#DIM CONST ITEM_東方スパイス = 65
#DIM CONST ITEM_カレールー = 66
#DIM CONST ITEM_鮮肉の大塊 = 67
#DIM CONST ITEM_竜の肉 = 68
#DIM CONST ITEM_キャベツ = 70
#DIM CONST ITEM_ニンニク = 71
#DIM CONST ITEM_トマト = 72
#DIM CONST ITEM_カボチャ = 73
#DIM CONST ITEM_ニンジン = 74
#DIM CONST ITEM_タマネギ = 75
#DIM CONST ITEM_カブ = 76
#DIM CONST ITEM_ネギ = 77
#DIM CONST ITEM_レッドペッパー = 78
#DIM CONST ITEM_石油 = 90
#DIM CONST ITEM_鞭 = 100
#DIM CONST ITEM_縄 = 101
#DIM CONST ITEM_ローション = 102
#DIM CONST ITEM_コンドーム = 103
#DIM CONST ITEM_使用済みコンドーム = 104
#DIM CONST ITEM_搾乳機 = 105
#DIM CONST ITEM_オナホール = 106
#DIM CONST ITEM_ローター = 107
#DIM CONST ITEM_バイブ = 108
#DIM CONST ITEM_アナルバイブ = 109
#DIM CONST ITEM_目隠し = 111
#DIM CONST ITEM_首輪 = 112
#DIM CONST ITEM_口枷 = 113
#DIM CONST ITEM_パシパエの小箱 = 114
#DIM CONST ITEM_キルケの小箱 = 115
#DIM CONST ITEM_ニプルキャップ = 116
#DIM CONST ITEM_クリキャップ = 117
#DIM CONST ITEM_サルマキス薬 = 120
#DIM CONST ITEM_アンスロープ薬 = 121
#DIM CONST ITEM_母乳促進剤 = 122
#DIM CONST ITEM_ヴェスパの薬 = 123
#DIM CONST ITEM_ティレシアスの秘薬 = 124
#DIM CONST ITEM_樹華結晶 = 125
#DIM CONST ITEM_鎮静剤 = 127
#DIM CONST ITEM_スキュラのフェロモン = 128
#DIM CONST ITEM_メイガスの夜 =129
#DIM CONST ITEM_セモリナス粉 =130
#DIM CONST ITEM_豊穣のパンケーキ = 131
#DIM CONST ITEM_清貧のクッキー = 132
#DIM CONST ITEM_成熟のマフィン = 133
#DIM CONST ITEM_無垢のスコーン = 134
#DIM CONST ITEM_プリアポスの恵み = 135
#DIM CONST ITEM_ディナリア銀貨 = 150
#DIM CONST ITEM_ミルク = 200
#DIM CONST ITEM_チーズ = 201
#DIM CONST ITEM_干し肉 = 202
#DIM CONST ITEM_ゆで卵 = 203
#DIM CONST ITEM_魔獣肉団子 = 204
#DIM CONST ITEM_オムレツ = 205
#DIM CONST ITEM_トラハナ = 206
#DIM CONST ITEM_ミートパイ = 207
#DIM CONST ITEM_キッシュ = 208
#DIM CONST ITEM_ゆでエビ = 209
#DIM CONST ITEM_ゆでザリガニ = 210
#DIM CONST ITEM_ゆでカニ = 211
#DIM CONST ITEM_ザリガニグラタン = 212
#DIM CONST ITEM_カニクリームコロッケ = 213
#DIM CONST ITEM_スッポンの生き血 = 214
#DIM CONST ITEM_カツレツ = 220
#DIM CONST ITEM_魔の合挽ハンバーグ = 221
#DIM CONST ITEM_カレーフリカッセ = 222
#DIM CONST ITEM_魔のタンドリーハツ = 223
#DIM CONST ITEM_ステーキ = 224
#DIM CONST ITEM_ドラゴンステーキ = 225
#DIM CONST ITEM_野菜いため = 230
#DIM CONST ITEM_カボチャいため = 231
#DIM CONST ITEM_彩りサラダ = 232
#DIM CONST ITEM_薬膳サラダ = 233
#DIM CONST ITEM_リーキグラタン = 234
#DIM CONST ITEM_パンプキンスープ = 235
#DIM CONST ITEM_ポモドーロ = 240
#DIM CONST ITEM_ペペロンチーノ = 241
#DIM CONST ITEM_カルボナーラ = 242
#DIM CONST ITEM_アラビアータ = 243
#DIM CONST ITEM_ボロネーゼ = 244
#DIM CONST ITEM_オルトラーナ = 245
#DIM CONST ITEM_ラザニア = 246
#DIM CONST ITEM_クリームシチュー = 250
#DIM CONST ITEM_スッポン鍋 = 251
#DIM CONST ITEM_カレー = 252
#DIM CONST ITEM_ビスク = 253
#DIM CONST ITEM_焼肉 = 254
#DIM CONST ITEM_竜のダンプリング鍋 = 255
#DIM CONST ITEM_八草のエルフ風スープ = 256
#DIM CONST ITEM_グラットン汁 = 257
#DIM CONST ITEM_マカロニグラタン = 260
#DIM CONST ITEM_技巧の宝玉 = 300
#DIM CONST ITEM_淫堕の宝玉 = 303
#DIM CONST ITEM_求人書類 = 310
#DIM CONST ITEM_調合技能書 = 311
#DIM CONST ITEM_工作技能書 = 312
#DIM CONST ITEM_栄誉勲章 = 350
#DIM CONST ITEM_淫魔の刻印 = 351
#DIM CONST ITEM_体力増強剤 = 400
#DIM CONST ITEM_スペシャルべこ人形 = 800
;ダミーアイテム
#DIM CONST ITEM_ディナリ = 950
#DIM CONST ITEM_名誉点 = 951
#DIM CONST ITEM_淫堕点 = 952


code:
;-----------------------------------
;アイテム名
;-----------------------------------
@GET_ITEM_NAME_107()
RESULTS '= "Rotor"
RETURN 0
;-----------------------------------
;アイテムの分類
;-----------------------------------
@GET_ITEM_CATEGORY_107()
RESULTS:0 '= "調教,"
RESULTS:1 '= ""
RETURN 0
;-----------------------------------
;アイテムの説明
;-----------------------------------
@GET_ITEM_DESCRIPTION_107()
RESULTS:0 '= "内蔵された振動機構によって性的快楽を得る性具"
RESULTS:1 '= "コマンド「ローター」が使用可能になる"
RESULTS:2 '= "人類種の体液、特に愛液や精液には多量のマナが含まれているとされている"
RESULTS:3 '= "そのため、一部の魔物はマナの摂取を目的に、人間の性感に訴える行動をとるものが存在する"
RESULTS:4 '= "この性具は硬貨に扮して人間の冒険者に辱めを与えるクリーピングコインに着想を得て作られたようだ"
RETURN 1
;-----------------------------------
;アイテムの情報
;-----------------------------------
@GET_ITEM_INFO_107(ITEM_DATA)
#DIM REF ITEM_DATA
ITEM_DATA:ITEM_PRICE = 7000
ITEM_DATA:ITEM_基準生産量 = 1
RETURN 0
;-----------------------------------
;アイテムの素材
;-----------------------------------
@GET_ITEM_MATERIAL_107(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
MATERIAL_NEEDS:ITEM_プラントラバー = 10
MATERIAL_NEEDS:ITEM_ローション = 6
MATERIAL_NEEDS:ITEM_マナ触媒 = 4
RETURN 1

;-----------------------------------
;アイテムがクラフト可能なモジュールの情報
;-----------------------------------
@CHECK_ITEM_CRAFTABLE_107(MODULE_ID)
#DIM MODULE_ID
; SELECTCASE MODULE_ID
;     CASE 300    ;作業台
;         RETURN 1
;     CASEELSE
;         RETURN 0
; ENDSELECT
RETURN 0

;-----------------------------------
;往来の調教用アイテムと在庫の同期をとる場合定義
;-----------------------------------
@CHECK_ITEM_STOCK_SYNCED_WITH_TRAIN_ITEM_107
;ITEM:ローターと同期
RETURN 200


code:
;-----------------------------------
;アイテム名
;-----------------------------------
@GET_ITEM_NAME_108()
RESULTS '= "Vibe"
RETURN 0
;-----------------------------------
;アイテムの分類
;-----------------------------------
@GET_ITEM_CATEGORY_108()
RESULTS:0 '= "調教,"
RESULTS:1 '= ""
RETURN 0
;-----------------------------------
;アイテムの説明
;-----------------------------------
@GET_ITEM_DESCRIPTION_108()
RESULTS:0 '= "局部に挿入し、内蔵された振動機構によって性的快楽を得る性具"
RESULTS:1 '= "コマンド「バイブ」が使用可能になる"
RESULTS:3 '= "振動機構を有しない張形の歴史は驚くほど古く、木製や石製の張形は太古から存在していたようだ"
RESULTS:4 '= "近年の材料工学、魔導工学の進展は人間の性への飽くなき探究心と相まって性具にも進化をもたらしている"
RESULTS:5 '= @"@C:{カラー_選択不可}@振動する自身の杖で性的快楽を得たことがあるか？　大衆紙によって行われたこの奇妙な調査の結果は@/C@"
RESULTS:6 '= @"@C:{カラー_選択不可}@はい:4、いいえ:10、無回答:256、国家の名誉と伝統の毀損による差止請求:1という結果に終わっている@/C@"
RESULTS:7 '= @"@C:{カラー_選択不可}@フロリア法院は請求に基づき大衆紙の差止めを行ったが、この結果に確信を得た商人が振動子を内蔵した@/C@"
RESULTS:8 '= @"@C:{カラー_選択不可}@張形を販売すると、生産が追いつかない程の売上を記録したようだ@/C@"
RETURN 1
;-----------------------------------
;アイテムの情報
;-----------------------------------
@GET_ITEM_INFO_108(ITEM_DATA)
#DIM REF ITEM_DATA
ITEM_DATA:ITEM_PRICE = 7000
ITEM_DATA:ITEM_基準生産量 = 1
RETURN 0
;-----------------------------------
;アイテムの素材
;-----------------------------------
@GET_ITEM_MATERIAL_108(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
MATERIAL_NEEDS:ITEM_プラントラバー = 10
MATERIAL_NEEDS:ITEM_ローション = 6
MATERIAL_NEEDS:ITEM_マナ触媒 = 4
RETURN 1

;-----------------------------------
;アイテムがクラフト可能なモジュールの情報
;-----------------------------------
@CHECK_ITEM_CRAFTABLE_108(MODULE_ID)
#DIM MODULE_ID
; SELECTCASE MODULE_ID
;     CASE 300    ;作業台
;         RETURN 1
;     CASEELSE
;         RETURN 0
; ENDSELECT
RETURN 0

;-----------------------------------
;往来の調教用アイテムと在庫の同期をとる場合定義
;-----------------------------------
@CHECK_ITEM_STOCK_SYNCED_WITH_TRAIN_ITEM_108
;ITEM:バイブと同期
RETURN 201


code:
;-----------------------------------
;アイテム名
;-----------------------------------
@GET_ITEM_NAME_109()
RESULTS '= "Anal vibe"
RETURN 0
;-----------------------------------
;アイテムの分類
;-----------------------------------
@GET_ITEM_CATEGORY_109()
RESULTS:0 '= "調教,"
RESULTS:1 '= ""
RETURN 0
;-----------------------------------
;アイテムの説明
;-----------------------------------
@GET_ITEM_DESCRIPTION_109()
RESULTS:0 '= "局部に挿入し、内蔵された振動機構によって性的快楽を得る性具"
RESULTS:1 '= "コマンド「アナルバイブ」が使用可能になる"
RESULTS:3 '= @"@C:{カラー_選択不可}@正教の教義は処女性を重んじ、生殖以外での目的の性交と肛門性交を禁じている@/C@"
RESULTS:4 '= @"@C:{カラー_選択不可}@しかし、器具を使用し快楽を得ることへの教義上の言及はなく、しばしば抜け穴として利用されてきた@/C@"
RESULTS:5 '= @"@C:{カラー_選択不可}@ノルディア大修道院が移築される際、代々の聖職者たちが秘蔵してきた張形が大量に発見されるという@/C@"
RESULTS:6 '= @"@C:{カラー_選択不可}@スキャンダルが報じられた。これには教皇庁も苦言を呈さざるを得なかったが、それはそれとして@/C@"
RESULTS:7 '= @"@C:{カラー_選択不可}@人類史における性具の変遷をたどる貴重な史料として、今日も共和国博物館に陳列されている@/C@"
RETURN 1
;-----------------------------------
;アイテムの情報
;-----------------------------------
@GET_ITEM_INFO_109(ITEM_DATA)
#DIM REF ITEM_DATA
ITEM_DATA:ITEM_PRICE = 7000
ITEM_DATA:ITEM_基準生産量 = 1
RETURN 0
;-----------------------------------
;アイテムの素材
;-----------------------------------
@GET_ITEM_MATERIAL_109(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
MATERIAL_NEEDS:ITEM_プラントラバー = 10
MATERIAL_NEEDS:ITEM_ローション = 6
MATERIAL_NEEDS:ITEM_マナ触媒 = 4
RETURN 1

;-----------------------------------
;アイテムがクラフト可能なモジュールの情報
;-----------------------------------
@CHECK_ITEM_CRAFTABLE_109(MODULE_ID)
#DIM MODULE_ID
; SELECTCASE MODULE_ID
;     CASE 300    ;作業台
;         RETURN 1
;     CASEELSE
;         RETURN 0
; ENDSELECT
RETURN 0

;-----------------------------------
;往来の調教用アイテムと在庫の同期をとる場合定義
;-----------------------------------
@CHECK_ITEM_STOCK_SYNCED_WITH_TRAIN_ITEM_109
;ITEM:アナルバイブと同期
RETURN 202


code:
;-----------------------------------
;アイテム名
;-----------------------------------
@GET_ITEM_NAME_112()
RESULTS '= "First round"
RETURN 0
;-----------------------------------
;アイテムの分類
;-----------------------------------
@GET_ITEM_CATEGORY_112()
RESULTS:0 '= "調教,"
RETURN 0
;-----------------------------------
;アイテムの説明
;-----------------------------------
@GET_ITEM_DESCRIPTION_112()
RESULTS:0 '= "奴隷を拘束するための首輪"
RESULTS:1 '= "相手の自由を奪い恐怖と不安を煽る隷属の証"
RESULTS:2 '= "コマンド「首輪をはめる」が使用可能になる"
RESULTS:4 '= @"@C:{カラー_選択不可}@大戦の終結に際し、獣人たちは自らの人類社会への貢献を声高に主張し隷属と抑圧からの解放を求めた@/C@"
RESULTS:5 '= @"@C:{カラー_選択不可}@この汎人族の権利請願は彼らとともに戦列を並べ戦った諸種族の後押しも相まって広い支持を集め、@/C@"
RESULTS:6 '= @"@C:{カラー_選択不可}@中央世界における獣人の権利獲得の最初にして大きな一歩となった@/C@"
RESULTS:7 '= @"@C:{カラー_選択不可}@しかしながら彼らに対する偏見や差別は未だ根深く残り、彼らの社会への完全な参入を妨げ、@/C@"
RESULTS:8 '= @"@C:{カラー_選択不可}@その大部分を経済的・社会的地位の低い層に押し留めて続けている@/C@"
RESULTS:9 '= @"@C:{カラー_選択不可}@彼らを繋ぎ止める見えない軛は未だ強固で重いようだ@/C@"
RETURN 0
;-----------------------------------
;アイテムの情報
;-----------------------------------
@GET_ITEM_INFO_112(ITEM_DATA)
#DIM REF ITEM_DATA
ITEM_DATA:ITEM_PRICE = 8000
ITEM_DATA:ITEM_基準生産量 = 1
RETURN 0
;-----------------------------------
;アイテムの素材
;-----------------------------------
@GET_ITEM_MATERIAL_112(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
MATERIAL_NEEDS:ITEM_動物の革 = 12
MATERIAL_NEEDS:ITEM_鋼インゴット = 3
RETURN 1

;-----------------------------------
;アイテムがクラフト可能なモジュールの情報
;-----------------------------------
@CHECK_ITEM_CRAFTABLE_112(MODULE_ID)
#DIM MODULE_ID
SELECTCASE MODULE_ID
    CASE 305    ;織り機
        RETURN 1
    CASEELSE
        RETURN 0
ENDSELECT

;-----------------------------------
;市販品か否か
;0=ショップに並ばない 1=ショップに並ぶ
;-----------------------------------
@IS_MARKET_AVAILABLE_ITEM_112()
RETURN 1
;-----------------------------------
;敵がドロップするか否か
;0=ドロップしない 1=ドロップする
;-----------------------------------
@IS_DROPPABLE_ITEM_112()
RETURN 1


code:
;-----------------------------------
;アイテム名
;-----------------------------------
@GET_ITEM_NAME_114()
RESULTS '= "Tattoo box"
RETURN 0
;-----------------------------------
;アイテムの分類
;-----------------------------------
@GET_ITEM_CATEGORY_114()
RESULTS:0 '= "調教,"
RETURN 0
;-----------------------------------
;アイテムの説明
;-----------------------------------
@GET_ITEM_DESCRIPTION_114()
RESULTS:0 '= "A small box containing tools that can be engraved and removed by tattoo."
RESULTS:1 '= ""
RESULTS:2 '= "マナ触媒を肌に彫り込むことで様々なタトゥーを刻印することができる。"
RESULTS:3 '= "色はもちろん自在で、特定の条件で発光させることも可能。"
RESULTS:4 '= "除去のための道具も入っており、これがなければ決して消すことは適わないだろう。"
RESULTS:5 '= ""
RESULTS:6 '= "元々はタトゥーから蛇やサソリを召喚するための魔術師の技術だったという。"
RESULTS:7 '= "かつての力は失われ、今日ではただ罪人や奴隷を貶めるためだけに用いられている。"
RETURN 0
@GET_ITEM_SUBDESCRIPTION_114()
RESULTS:0 '= @"ホームメニューで使用可能"
RESULTS:1 '= "タトゥーの刻印と除去が自由に可能"
RETURN 0
;-----------------------------------
;アイテムの情報
;-----------------------------------
@GET_ITEM_INFO_114(ITEM_DATA)
#DIM REF ITEM_DATA
ITEM_DATA:ITEM_PRICE = 20000
ITEM_DATA:ITEM_基準生産量 = 1
ITEM_DATA:ITEM_CAN_USE_AT_HOME = 1

RETURN 0
;-----------------------------------
;アイテムの素材
;-----------------------------------
@GET_ITEM_MATERIAL_114(MATERIAL_NEEDS)
#DIM REF MATERIAL_NEEDS
MATERIAL_NEEDS:ITEM_薬草 = 10
MATERIAL_NEEDS:ITEM_マナ触媒 = 10
MATERIAL_NEEDS:ITEM_高効率魔導触媒 = 2
RETURN 1

;-----------------------------------
;アイテムが作成可能なモジュールか確認
;-----------------------------------
@CHECK_ITEM_CRAFTABLE_114(MODULE_ID)
#DIM MODULE_ID
#DIM DYNAMIC CRAFTABLE
SELECTCASE MODULE_ID
    CASE 300    ;作業台
        FOR LOCAL, 0, MPLY_NUM
            SIF HAS_TALENT(MPLY:LOCAL, "技師")
                CRAFTABLE = 1
        NEXT
        FOR LOCAL, 0, MTAR_NUM
            SIF HAS_TALENT(MTAR:LOCAL, "技師")
                CRAFTABLE = 1
        NEXT
        SIF !CRAFTABLE
            RETURN 0
        RETURN 1
    CASEELSE
        RETURN 0
ENDSELECT

@GET_ITEM_INFO_AT_USING_114()
#DIMS DICS_ITEM_EFFECT
{
    DICS_ITEM_EFFECT '= "
        [ITEM_ID:114]
        [TARGET_NUM:1]
        [TARGET_CLASS:FOLLOWER]
        [EFFECT_CATEGORY:パシパエの小箱]
        "
}
RESULTS = %DICS_ITEM_EFFECT%

;-------------------------------------------------
; アイテム使用時の処理関数@ITEM_USING_COMMONから呼ばれるアイテム使用時処理
; 共通化できない・する必要がない固有処理はここに記述
; ITEM_USING_COMMON
;-------------------------------------------------
@ITEM_USING_COMMON_パシパエの小箱(DICS_ITEM_EFFECT)
#DIMS DICS_ITEM_EFFECT
#DIM  DYNAMIC ITEM_ID
#DIMS DYNAMIC ITEM_NAME
#DIM  DYNAMIC SELECTED_CHARA_ID
#DIM  DYNAMIC INPUT_VALUE
#DIM  DYNAMIC FIRST_LINE

ITEM_ID = TOINT(DIC_GET(DICS_ITEM_EFFECT, "ITEM_ID"))
CALL GET_ITEM_NAME(ITEM_ID)
ITEM_NAME           = %RESULTS%

;アイテム使用前のメッセージ表示
;-------------------------------------------------
FIRST_LINE = LINECOUNT
WHILE 1
    IF HO_ITEM_STOCK:ITEM_ID == 0
        RETURN
    ENDIF
    REDRAW 0
    CLEARLINE LINECOUNT - FIRST_LINE
    CALLF TAG_PRINT(@"対象キャラクタを選択してください", 1)
    CALLF TAG_PRINT(@"　%ITEM_NAME%({HO_ITEM_STOCK:ITEM_ID} → @C:{カラー_オレンジ}@{HO_ITEM_STOCK:ITEM_ID -1}@/C@)", 1)
    PRINTL
    CALL SELECT_CHARA_LIST_ONLY_LOGIC_SEX("SAME_FACTION", "NONE")
    CLEARLINE 1
    SELECTED_CHARA_ID = RESULT
    IF SELECTED_CHARA_ID == -1
        RETURN
    ELSE
        CALL TATTOO_MENU(SELECTED_CHARA_ID, 1)
    ENDIF
WEND