code:
@SHOW_INFO_SHOW_SKILL(CHARA_ID)
#DIM CHARA_ID
IF SHOP_SKILL_MODE == "" || FLAG:クエストモード
    SHOP_SKILL_MODE '= "SHOW_SKILL"
    SHOP_SKILL_LEARN_MODE '= ""
ENDIF
CALL SHOW_INFO_SHOW_SKILL_LIST(CHARA_ID)

;-------------------------------------------------
;習得済スキル描画
;-------------------------------------------------
@SHOW_INFO_SHOW_SKILL_LIST(CHARA_ID)
#DIM  CHARA_ID
#DIMS MODE
#DIM  DYNAMIC GENRE
#DIM  DYNAMIC PRINT_SKILL_NUM
#DIM  DYNAMIC HIDE_SKILL_NUM
#DIMS DYNAMIC STR_GENRE
#DIMS DYNAMIC STR_TITLE
#DIMS DYNAMIC FILTER
#DIMS DYNAMIC _XML_SKILL
#DIM  DYNAMIC F_COL
#DIMS DYNAMIC HTML
#DIMS DYNAMIC ROWS_PER_ITEM, MAX_SKILLS, 3
#DIM  CONST   MAX_ROW = 12

;UIコンテナの作成
VARI UIC_ID
VARI WIDTH  = UI_MAXWIDTH * 100
VARI HEIGHT = UI_MAXHEIGHT * 100
CALL UIC_INIT()
UIC_ID = RESULT

CALL UIC_ADD(UIC_ID, "UIC_PARENT", "", @"[BORDER:0PX][SIZE:{WIDTH},{HEIGHT}]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_PARENT", "[TARGET:LINE_LEFT][ANCHOR:LEFT_TOP][TARGET_PIVOT:LEFT_TOP][PADDING:50,0]")
CALL UIC_ADD(UIC_ID, "UIC_TITLE", "", @"[BORDER:1PX][SIZE:{WIDTH},200][PADDING:25][COLOR:%C2H(カラー_ダークグレー)%]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_TITLE", "[TARGET:UIC_PARENT][ANCHOR:TOP][TARGET_PIVOT:TOP]")
CALL UIC_ADD(UIC_ID, "UIC_TAB", "", @"[BORDER:1PX][SIZE:{WIDTH},400][PADDING:25]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_TAB", "[TARGET:UIC_TITLE][ANCHOR:TOP][TARGET_PIVOT:BOTTOM]")
CALL UIC_ADD(UIC_ID, "UIC_MAIN", "", @"[BORDER:1PX][SIZE:{WIDTH},{HEIGHT - 600}][PADDING:25]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_MAIN", "[TARGET:UIC_TAB][ANCHOR:TOP][TARGET_PIVOT:BOTTOM]")
CALL UIC_ADD(UIC_ID, "UIC_FOOTER", "", @"[BORDER:0PX][SIZE:{WIDTH},150][PADDING:0]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_FOOTER", "[TARGET:UIC_MAIN][ANCHOR:BOTTOM][TARGET_PIVOT:BOTTOM]")
CALL UIC_ADD(UIC_ID, "UIC_INFO", "", @"[BORDER:1PX][SIZE:{WIDTH / 6},200][PADDING:25]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_INFO", "[TARGET:UIC_MAIN][ANCHOR:RIGHT_BOTTOM][TARGET_PIVOT:RIGHT_BOTTOM]")

;タブとスキルジャンルの初期設定
IF SKILL_SELECT_TAB == ""
    SKILL_SELECT_TAB = %SKILL_GENRE_ENG:スキル_ジャンル_戦闘%
    SHOP_SKILL_FILTER '= "ALL"
ENDIF
GENRE = FINDELEMENT(SKILL_GENRE_ENG, SKILL_SELECT_TAB)
SIF GENRE == -1
    GENRE = 0
IF SHOP_SKILL_MODE == "LEARN_SKILL" && SHOP_SKILL_LEARN_MODE == "EDIT_SKILL_SLOT"
    GENRE = スキル_ジャンル_戦闘
ENDIF

;フィルターの設定
FILTER '= ""
IF SHOP_SKILL_FILTER != "ALL" && GENRE == スキル_ジャンル_戦闘
    FILTER '= @"[.//subcategory[(text()='%SHOP_SKILL_FILTER%')]]"
ENDIF
;タブで選択されたGENREのスキルXML定義を読み込み
IF SHOP_SKILL_MODE == "LEARN_SKILL" && SHOP_SKILL_LEARN_MODE == "EDIT_SKILL_SLOT"
    STR_GENRE = %SKILL_GENRE_ENG:GENRE%
    XML_DOCUMENT XMLID_SKILL:GENRE, RESULTS
    {
        XML_GET XMLID_SKILL:GENRE
            , @"//defname[.//category[(text()='%STR_GENRE%')]]"
            + @"[.//subcategory[(text()='ACTIVE')]]/@parentname"
            , SKILL_DEF_LIST
    }
    SKILL_NUM = RESULT
ELSE
    STR_GENRE = %SKILL_SELECT_TAB%
    XML_DOCUMENT XMLID_SKILL:GENRE, RESULTS
    {
        XML_GET XMLID_SKILL:GENRE
            , @"//defname[.//category[(text()='%STR_GENRE%')]]%FILTER%"
            + @"[.//skillrank[(text()='UNIQUE')]][.//reqchara[@name='%CSTR:(CHARA_ID):99%']]/@parentname"
            + @"| //defname[.//category[(text()='%STR_GENRE%')]]%FILTER%"
            + @"[.//skillrank[(text()='COMMON')]]/@parentname"
            , SKILL_DEF_LIST
    }
    SKILL_NUM = RESULT
ENDIF

;実際に出力可能なレコードを集計
FOR LOCAL, 0, SKILL_NUM
    ;;スキル定義のOUTER_XML取得
    XML_GET XMLID_SKILL:GENRE, @"//defname[@parentname='%SKILL_DEF_LIST:LOCAL%']", _XML_SKILL, 3
    IF SHOP_SKILL_MODE == "LEARN_SKILL" && SHOP_SKILL_LEARN_MODE == "EDIT_SKILL_SLOT"
        IF !HAS_SKILL(CHARA_ID, SKILL_DEF_LIST:LOCAL)
            CONTINUE
        ENDIF
        CALL SKILL_PRINT_LINE(GENRE, CHARA_ID, _XML_SKILL, "EDIT_SKILL_SLOT")
        SIF !RESULT
            CONTINUE
    ELSE
        CALL SKILL_PRINT_LINE(GENRE, CHARA_ID, _XML_SKILL, MODE)
        SIF !RESULT
            CONTINUE
    ENDIF
    ROWS_PER_ITEM:PRINT_SKILL_NUM:0 = %RESULTS:0%
    ROWS_PER_ITEM:PRINT_SKILL_NUM:1 = %RESULTS:1%
    ROWS_PER_ITEM:PRINT_SKILL_NUM:2 = %RESULTS:2%
    PRINT_SKILL_NUM ++
NEXT

;ページ数算出
SHOP_SKILL_PAGE_NUM = (PRINT_SKILL_NUM - 1) / MAX_ROW
SHOP_SKILL_CURRENT_PAGE = SHOP_SKILL_CURRENT_PAGE > SHOP_SKILL_PAGE_NUM ? SHOP_SKILL_PAGE_NUM # SHOP_SKILL_CURRENT_PAGE

;■ 印字処理
;タイトル
IF SHOP_SKILL_MODE == "SHOW_SKILL"
    STR_TITLE '= @"@S:1@◆　%ANAME(CHARA_ID)%の習得済スキル・習得可能スキル@/S@"
ELSEIF SHOP_SKILL_MODE == "LEARN_SKILL" && SHOP_SKILL_LEARN_MODE == "EDIT_SKILL_SLOT"
    STR_TITLE '= @"@S:1@◆　%ANAME(CHARA_ID)%のスキルスロット編集@/S@　　習得済みのアクティブスキルの中から、戦闘時に発動可能なスキルを3つまでセットできます"
ELSEIF SHOP_SKILL_MODE == "LEARN_SKILL" && SHOP_SKILL_LEARN_MODE == "RESET_SKILL"
    STR_TITLE '= @"@S:1@◆　%ANAME(CHARA_ID)%のスキルリセット@/S@"
ELSEIF SHOP_SKILL_MODE == "LEARN_SKILL"
    STR_TITLE '= @"@S:1@◆　%ANAME(CHARA_ID)%のスキル習得・リセット@/S@"
ENDIF
CALL UIC_SET_TEXT(UIC_ID, "UIC_TITLE", CONV_TAG2H(STR_TITLE))

;スキルタブ ジャンル
HTML '= ""
FOR LOCAL, 0, SKILL_GENRE_NUM
    IF SKILL_GENRE_ENG:LOCAL == SKILL_SELECT_TAB
        F_COL = カラー_選択中
    ELSE
        F_COL = カラー_白
    ENDIF
    HTML += @"@B:[SHOW_SKILL_SELECT_TAB:%SKILL_GENRE_ENG:LOCAL%]@@C:{F_COL}@[%SKILL_GENRE_JP:LOCAL%]  @/C@@/B@"
NEXT
IF FLAG:クエストモード
    HTML += @"@C:{カラー_選択不可}@[習得・リセット]  ※クエスト中は習得・リセット不可@/C@"
ELSE
    IF SHOP_SKILL_MODE == "LEARN_SKILL"
        HTML += @"@B:[SHOP_SKILL_MODE:SHOW_SKILL]@@C:{カラー_選択中}@[習得・リセット]  @/C@@/B@"
    ELSEIF SHOP_SKILL_MODE == "SHOW_SKILL"
        HTML += @"@B:[SHOP_SKILL_MODE:LEARN_SKILL]@[習得・リセット]  @/B@"
    ENDIF
ENDIF

;習得モード
IF SHOP_SKILL_MODE == "LEARN_SKILL"
    HTML += @"@B:[SHOP_SKILL_LEARN_MODE:EDIT_SKILL_SLOT]@@C:{SHOP_SKILL_LEARN_MODE == "EDIT_SKILL_SLOT" ? カラー_選択中 # カラー_白}@[スキルスロット編集]  @/C@@/B@"
    HTML += @"@B:[RESET_SKILL:1]@@C:{SHOP_SKILL_LEARN_MODE == "RESET_SKILL" ? カラー_選択中 # カラー_白}@[スキルリセット]  @/C@@/B@"
    HTML += @"@B:[SHOW_ITEM_MENU:1]@[アイテム確認]  @/B@"
    IF SHOP_SKILL_LEARN_OMIT_CONFIRM_FLAG
        HTML += @"@B:[OMIT_CONFIRM:1]@@C:{カラー_選択中}@☑　習得確認を省略  @/C@@/B@"
    ELSE
        HTML += @"@B:[OMIT_CONFIRM:0]@@C:{カラー_選択不可}@□　習得確認を省略  @/C@@/B@"
    ENDIF
ENDIF

HTML += @"
"
HTML += DRAW_LINEH(UI_MAXWIDTH - 1)
HTML += @"
"

;戦闘スキルタブ フィルター
IF GENRE == スキル_ジャンル_戦闘 && SHOP_SKILL_LEARN_MODE != "EDIT_SKILL_SLOT"
    HTML += @"@B:[FILTER:ALL]@@C:{SHOP_SKILL_FILTER == "ALL" ? カラー_選択中 # カラー_白}@[ALL]  @/C@@/B@"
    HTML += @"@B:[FILTER:ACTIVE]@@C:{SHOP_SKILL_FILTER == "ACTIVE" ? カラー_選択中 # カラー_白}@[ACTIVE]  @/C@@/B@"
    HTML += @"@B:[FILTER:PASSIVE]@@C:{SHOP_SKILL_FILTER == "PASSIVE" ? カラー_選択中 # カラー_白}@[PASSIVE]  @/C@@/B@"
ENDIF
HTML = %CONV_TAG2H(HTML)%
CALL UIC_SET_TEXT(UIC_ID, "UIC_TAB", HTML)

;スキルポイント表示
HTML '= ""
F_COL = カラー_白
SELECTCASE GENRE
    CASE スキル_ジャンル_生活
        CALL SKILL_CHECK_USED_SKILL_POINT(CHARA_ID, スキル_大分類_生活)
        USED_SKILL_POINT:CHARA_ID:スキル_大分類_生活 = RESULT
        SIF USED_SKILL_POINT:CHARA_ID:スキル_大分類_生活 == BASE_SKILL_POINT:CHARA_ID:スキル_大分類_生活
            F_COL = カラー_注意
        HTML += @"@C:{F_COL}@◆　生活SP({USED_SKILL_POINT:CHARA_ID:スキル_大分類_生活}/{BASE_SKILL_POINT:CHARA_ID:スキル_大分類_生活})@/C@"
    CASE スキル_ジャンル_戦闘, スキル_ジャンル_クエスト
        CALL SKILL_CHECK_USED_SKILL_POINT(CHARA_ID, スキル_大分類_冒険)
        USED_SKILL_POINT:CHARA_ID:スキル_大分類_冒険 = RESULT
        SIF USED_SKILL_POINT:CHARA_ID:スキル_大分類_冒険 == BASE_SKILL_POINT:CHARA_ID:スキル_大分類_冒険
            F_COL = カラー_注意
        HTML += @"@C:{F_COL}@◆　冒険SP({USED_SKILL_POINT:CHARA_ID:スキル_大分類_冒険}/{BASE_SKILL_POINT:CHARA_ID:スキル_大分類_冒険})@/C@"
    CASE スキル_ジャンル_性技
        CALL SKILL_CHECK_USED_SKILL_POINT(CHARA_ID, スキル_大分類_性技)
        USED_SKILL_POINT:CHARA_ID:スキル_大分類_性技 = RESULT
        SIF USED_SKILL_POINT:CHARA_ID:スキル_大分類_性技 == BASE_SKILL_POINT:CHARA_ID:スキル_大分類_性技
            F_COL = カラー_注意
        HTML += @"@C:{F_COL}@◆　性技SP({USED_SKILL_POINT:CHARA_ID:スキル_大分類_性技}/{BASE_SKILL_POINT:CHARA_ID:スキル_大分類_性技})@/C@"
ENDSELECT
HTML = %CONV_TAG2H(HTML)%
CALL UIC_SET_TEXT(UIC_ID, "UIC_INFO", HTML)

;スキル一覧
HTML '= ""
FOR LOCAL, SHOP_SKILL_CURRENT_PAGE * MAX_ROW, MIN(PRINT_SKILL_NUM, (SHOP_SKILL_CURRENT_PAGE + 1) * MAX_ROW)
    HTML += @"%CONV_TAG2H(HTML_ESCAPE(ROWS_PER_ITEM:LOCAL:0))%
"
    HTML += @"%CONV_TAG2H(HTML_ESCAPE(ROWS_PER_ITEM:LOCAL:1))%
"
    HTML += @"%CONV_TAG2H(HTML_ESCAPE(ROWS_PER_ITEM:LOCAL:2))%
"
NEXT
CALL UIC_SET_TEXT(UIC_ID, "UIC_MAIN", HTML)

;ページコントロール用の領域
HTML '= ""
HTML += @"%SHOP_SKILL_CURRENT_PAGE > 0 ? "@B:[PREV_PAGE:1]@＜―@/B@" # @"@C:{カラー_選択不可}@＜―@/C@"%"
HTML += @" {SHOP_SKILL_CURRENT_PAGE + 1} "
HTML += @"%SHOP_SKILL_CURRENT_PAGE < SHOP_SKILL_PAGE_NUM ? "@B:[NEXT_PAGE:1]@―＞@/B@" # @"@C:{カラー_選択不可}@―＞@/C@"%"
HTML = %CONV_TAG2H(TAG_PRINT_SHAPE(HTML, UI_MAXWIDTH * 2, 1, 2))%
CALL UIC_SET_TEXT(UIC_ID, "UIC_FOOTER", HTML)

CALL UIC_SHOW(UIC_ID)
CALL NEWLINE(UI_MAXHEIGHT)

;-------------------------------------------------
;スキル一覧入力受付
;-------------------------------------------------
@SHOW_INFO_SHOW_SKILL_INPUT(INPUT_VALUES, CHARA_ID)
#DIMS INPUT_VALUES
#DIM  CHARA_ID
#DIM DYNAMIC NOW_GENRE

IF DIC_CONTAINSKEY(INPUT_VALUES, "SHOW_SKILL_SELECT_TAB")
    INPUT_VALUES = %DIC_GET(INPUT_VALUES, "SHOW_SKILL_SELECT_TAB")%
    SKILL_SELECT_TAB = %INPUT_VALUES%
ELSEIF  DIC_CONTAINSKEY(INPUT_VALUES, "SHOW_SKILL_LIST")
    INPUT_VALUES = %DIC_GET(INPUT_VALUES, "SHOW_SKILL_LIST")%
    NOW_GENRE = FINDELEMENT(SKILL_GENRE_ENG, SKILL_SELECT_TAB)
    SIF NOW_GENRE == -1
        NOW_GENRE = 0
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "SKILL_DEF_NAME")
    IF SHOP_SKILL_MODE == "LEARN_SKILL"
        INPUT_VALUES = %DIC_GET(INPUT_VALUES, "SKILL_DEF_NAME")%
        SELECTCASE SHOP_SKILL_LEARN_MODE
                ;スキル習得・忘却
            CASE "LEARN_SKILL"
                VARI GENRE
                GENRE = FINDELEMENT(SKILL_GENRE_ENG, SKILL_SELECT_TAB)
                CALL SHOP_LEARN_SKILL(CHARA_ID, INPUT_VALUES, GENRE)
                ;アクティブスキルスロット編集
            CASE "EDIT_SKILL_SLOT"
                CALL SKILL_EDIT_ACTIVE_SKILL_SLOT(CHARA_ID, INPUT_VALUES)
        ENDSELECT
    ENDIF
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "SHOP_SKILL_MODE")
    INPUT_VALUES = %DIC_GET(INPUT_VALUES, "SHOP_SKILL_MODE")%
    SHOP_SKILL_MODE = %INPUT_VALUES%
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "SHOP_SKILL_LEARN_MODE")
    INPUT_VALUES = %DIC_GET(INPUT_VALUES, "SHOP_SKILL_LEARN_MODE")%
    IF SHOP_SKILL_LEARN_MODE != "LEARN_SKILL" && SHOP_SKILL_LEARN_MODE == INPUT_VALUES
        SHOP_SKILL_LEARN_MODE '= "LEARN_SKILL"
    ELSE
        SHOP_SKILL_LEARN_MODE = %INPUT_VALUES%
    ENDIF
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "FILTER")
    INPUT_VALUES = %DIC_GET(INPUT_VALUES, "FILTER")%
    SHOP_SKILL_FILTER = %INPUT_VALUES%
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "RESET_SKILL")
    CALL SHOP_LIFE_SKILL_RESET(CHARA_ID)
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "OMIT_CONFIRM")
    SHOP_SKILL_LEARN_OMIT_CONFIRM_FLAG = !SHOP_SKILL_LEARN_OMIT_CONFIRM_FLAG
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "PREV_PAGE")
    SHOP_SKILL_CURRENT_PAGE = SHOP_SKILL_CURRENT_PAGE > 0 ? SHOP_SKILL_CURRENT_PAGE - 1 # 0
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "NEXT_PAGE") && SHOP_SKILL_CURRENT_PAGE < SHOP_SKILL_PAGE_NUM
    SHOP_SKILL_CURRENT_PAGE++
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "SHOW_ITEM_MENU")
    CALL HO_ITEM_MENU
ENDIF


code:
;情報表示に関わる関数
;-------------------------------------------------
;ARG:0番のキャラの情報を表示
;-------------------------------------------------
@SHOW_INFO_STATUS(CHARA_ID, 調教中 = 0)
#DIM CHARA_ID
#DIM 調教中
#DIM DYNAMIC FIRST_LINE
FIRST_LINE = LINECOUNT

CALL SHOW_HEADER(CHARA_ID)
; CALL SMALL_TITLE("基礎", 100)
; CALL SHOW_BASE(CHARA_ID)
PRINTL
CALL NEW_PRINT_BASE_INFO(CHARA_ID)
CALL NEW_PRINT_STATUS(CHARA_ID)
CALL NEW_PRINT_CLOTH(CHARA_ID)
CALL NEW_PRINT_SKILL(CHARA_ID)
CALL NEW_PRINT_EQUIP(CHARA_ID)

FOR LOCAL, 0, 42
	PRINTL
NEXT

;-------------------------------------------------
; ポートレイト、体力などの基礎情報
;-------------------------------------------------
@NEW_PRINT_BASE_INFO(CHARA_ID)
#DIM CHARA_ID
#DIMS ATR_DIV
ATR_DIV '=  @"rect = '5200, 0, 3250, 2800' border = '1px' bcolor='#%CVH(カラー_白)%' padding='2px'"
;顔グラ表示
CALL SHOW_PORTRAIT(CHARA_ID)
LOCALS '= ""
LOCALS += @"◆ %ANAME(CHARA_ID)%"
LOCALS += "
"
LOCALS += @"%DRAW_LINEH(17)%
"
LOCALS += @"体力：%COLOR_BAR_H(BASE:CHARA_ID:体力, MAXBASE:CHARA_ID:体力, 12, カラー_黄, カラー_黄緑, カラー_ダークグレー, 1, @"%UNICODE(0x2588)%")%"
LOCALS += "

"
LOCALS += @"気力：%COLOR_BAR_H(BASE:CHARA_ID:気力, MAXBASE:CHARA_ID:気力, 12, カラー_レッド, カラー_オレンジ, カラー_ダークグレー, 1, @"%UNICODE(0x2588)%")%"
LOCALS += "

"
LOCALS += @"精神：%COLOR_BAR_H(BASE:CHARA_ID:精神力, MAXBASE:CHARA_ID:精神力, 12, カラー_ブルー, カラー_シアン, カラー_ダークグレー, 1, @"%UNICODE(0x2588)%")%"
LOCALS += "

"

HTML_PRINT @"
%LOCALS%
", 1

;-------------------------------------------------
; 能力の情報
;-------------------------------------------------
@NEW_PRINT_STATUS(CHARA_ID)
#DIM CHARA_ID
#DIMS ATR_DIV

ATR_DIV '=  @"rect = '200, 0, 2600, 1600' border = '1px' bcolor='#%CVH(カラー_白)%' padding='2px'"
LOCALS '= ""
LOCALS += "・ステータス"
LOCALS += "
"
LOCALS += @"%DRAW_LINEH(25)%
"
HTML_PRINT @"
%LOCALS%
", 1
CALL NEW_PRINT_STATUS_ABL(CHARA_ID)
CALL NEW_PRINT_STATUS_COMBAT(CHARA_ID)

@NEW_PRINT_STATUS_ABL(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC SHOW_LIST, 30
#DIM  DYNAMIC ABL_NUM
#DIMS DYNAMIC RANK
#DIMS ATR_DIV

ATR_DIV '=  @"rect = '400, 100, 2600, 1600' border = '0px' bcolor='#%CVH(カラー_白)%' padding='2px'"

VARSET SHOW_LIST, -1
SHOW_LIST:0 = GETNUM(ABL, "戦闘")
SHOW_LIST:1 = GETNUM(ABL, "魔術")
SHOW_LIST:2 = GETNUM(ABL, "身体")
SHOW_LIST:3 = GETNUM(ABL, "器用")
SHOW_LIST:4 = GETNUM(ABL, "知識")
SHOW_LIST:5 = GETNUM(ABL, "観察")
SHOW_LIST:6 = GETNUM(ABL, "歌唱")
SHOW_LIST:7 = GETNUM(ABL, "料理")
SHOW_LIST:8 = GETNUM(ABL, "社交")
SHOW_LIST:9 = GETNUM(ABL, "話術")

LOCALS '= ""
LOCALS += "
"
FOR LOCAL, 0, VARSIZE("SHOW_LIST")
	SIF SHOW_LIST:LOCAL < 0
		CONTINUE
	ABL_NUM = SHOW_LIST:LOCAL
	RANK = %ALPHABET_RANK(ランク_ＳＬＧ, ABL:CHARA_ID:ABL_NUM)%
	LOCALS += @"%ABLNAME:ABL_NUM, 6, LEFT%："
	LOCALS += @"{ABL:CHARA_ID:ABL_NUM, 4, RIGHT}"
	LOCALS += @" %RANK%"
	LOCALS += "
"
NEXT
HTML_PRINT @"
%LOCALS%
", 1

@NEW_PRINT_STATUS_COMBAT(CHARA_ID)
#DIM CHARA_ID
#DIM  DYNAMIC ATK
#DIM  DYNAMIC MAG
#DIM  DYNAMIC DEF
#DIM  DYNAMIC ARMOR
#DIM  DYNAMIC AGL
#DIM  DYNAMIC HATE
#DIM  DYNAMIC CRT
#DIM  DYNAMIC CRT_D
#DIM  DYNAMIC TGT

#DIMS ATR_DIV
ATR_DIV '=  @"rect = '1600, 100, 2400, 1600' border = '0px' bcolor='#%CVH(カラー_白)%' padding='2px'"

CALL CC_CALC_CHARA_STATUS(CHARA_ID)
ATK = DT_CELL_GET("CHARA_STATUS",0 , "ATTACK")
MAG = DT_CELL_GET("CHARA_STATUS",0 , "MAG")
DEF = DT_CELL_GET("CHARA_STATUS",0 , "DEFENCE")
ARMOR = DT_CELL_GET("CHARA_STATUS",0 , "ARMOR")
AGL = DT_CELL_GET("CHARA_STATUS",0 , "AGILITY")
HATE = DT_CELL_GET("CHARA_STATUS",0 , "HATE_RATE")
CRT = DT_CELL_GET("CHARA_STATUS",0 , "CRITICAL_RATE")
CRT_D = DT_CELL_GET("CHARA_STATUS",0 , "CRITICAL_DAMAGE_RATE")
TGT = DT_CELL_GET("CHARA_STATUS",0 , "TARGETING")

LOCALS '= ""
LOCALS += "
"
LOCALS += @"攻撃力　：{ATK, 6, RIGHT}
"
LOCALS += @"魔力　　：{MAG, 6, RIGHT}
"
LOCALS += @"防御力　：{DEF, 6, RIGHT}
"
LOCALS += @"軽減値　：{ARMOR, 6, RIGHT}
"
LOCALS += @"行動力　：{AGL, 6, RIGHT}
"
LOCALS += @"敵視　　：{HATE, 6, RIGHT}
"
LOCALS += @"CRT率　 ：%TOSTR(CRT)+ "%", 6, RIGHT%
"
LOCALS += @"CRT倍率 ：%TOSTR(CRT_D)+ "%", 6, RIGHT%
"
LOCALS += @"脅威選定：%WPN_脅威選定文字列:TGT, 6, RIGHT%
"
HTML_PRINT @"
%LOCALS%
", 1

;-------------------------------------------------
; 衣装の情報
;-------------------------------------------------
@NEW_PRINT_CLOTH(CHARA_ID)
#DIM CHARA_ID
#DIMS ATR_DIV

ATR_DIV '=  @"rect = '2800, 0, 2400, 1600' border = '1px' bcolor='#%CVH(カラー_白)%' padding='2px'"
LOCALS '= ""
LOCALS += "・衣装"
LOCALS += "
"
LOCALS += @"%DRAW_LINEH(23)%
"
FOR LOCAL, 0, CLOTH_PART_NUM - 1
	IF FLAG:ハウジングモード
		CALL GET_CLOTH_NAME(LOCAL, 調教用衣装:CHARA_ID:LOCAL)
	ELSE
		CALL GET_CLOTH_NAME(LOCAL, CLOTH:CHARA_ID:LOCAL)
	ENDIF
	IF RESULTS != "なし"
		LOCALS += @"%CLOTH_PART_NAME:LOCAL, 10, LEFT% - %RESULTS%
"
	ELSE
		LOCALS += @"%CLOTH_PART_NAME:LOCAL, 10, LEFT% ---
"
	ENDIF
NEXT
HTML_PRINT @"
%LOCALS%
", 1

;-------------------------------------------------
; スキルの情報
;-------------------------------------------------
@NEW_PRINT_SKILL(CHARA_ID)
#DIM CHARA_ID
#DIMS ATR_DIV

ATR_DIV '=  @"rect = '200, 1600, 5000, 1200' border = '1px' bcolor='#%CVH(カラー_白)%' padding='2px'"
LOCALS '= ""
LOCALS += "・戦闘スキル"
LOCALS += "
"
LOCALS += @"%DRAW_LINEH(49)%
"
CALL NEW_PRINT_SKILL_PASSIVE(CHARA_ID)
CALL NEW_PRINT_SKILL_ACTIVE(CHARA_ID)
HTML_PRINT @"
%LOCALS%
", 1

@NEW_PRINT_SKILL_PASSIVE(CHARA_ID)
#DIM CHARA_ID
#DIMS ATR_DIV
#DIM  DYNAMIC SKILL_LV
#DIMS DYNAMIC SKILL_STR
#DIM  CONST GENRE = スキル_ジャンル_戦闘
#DIM  CONST MAJOR_GENRE = スキル_大分類_冒険

VARI L_CNT = 1
VARSET SKILL_DEF_LIST
ATR_DIV '=  @"rect = '200, 1800, 5000, 1200' border = '0px' bcolor='#%CVH(カラー_白)%' padding='2px'"
LOCALS '= ""
LOCALS += @"・PASSIVE"
LOCALS += "
"
XML_GET XMLID_SKILL:GENRE, @"//defname[.//category[(text()='BATTLE')]][not(.//subcategory[(text()='ACTIVE')])]/@parentname", SKILL_DEF_LIST
FOR LOCAL ,0 ,RESULT
	SKILL_LV = HAS_SKILL(CHARA_ID, SKILL_DEF_LIST:LOCAL, MAJOR_GENRE)
	IF SKILL_LV
		SKILL_STR += TOHALF(@"<%GET_SKILL_NAME(SKILL_DEF_LIST:LOCAL, MAJOR_GENRE)%Lv{SKILL_LV}> ")
		IF STRLENS(SKILL_STR) > 120 * L_CNT
			SKILL_STR += "
"
			L_CNT ++
		ENDIF
	ENDIF
NEXT
LOCALS += SKILL_STR
HTML_PRINT @"
%LOCALS%
", 1

@NEW_PRINT_SKILL_ACTIVE(CHARA_ID)
#DIM CHARA_ID
#DIMS ATR_DIV
#DIM  DYNAMIC SKILL_LV
#DIMS DYNAMIC SKILL_STR
#DIM  CONST GENRE = スキル_ジャンル_戦闘
#DIM  CONST MAJOR_GENRE = スキル_大分類_冒険

VARI L_CNT = 1
VARSET SKILL_DEF_LIST
ATR_DIV '=  @"rect = '200, 2200, 5000, 1200' border = '0px' bcolor='#%CVH(カラー_白)%' padding='2px'"
LOCALS '= ""
LOCALS += @"・ACTIVE"
LOCALS += "
"
XML_GET XMLID_SKILL:GENRE, @"//defname[.//category[(text()='BATTLE')]][.//subcategory[(text()='ACTIVE')]]/@parentname", SKILL_DEF_LIST
FOR LOCAL ,0 ,RESULT
	;スキルスロットにセットされていないアクティブスキルは表示しない
	SIF LIST_INDEXOF(_LIST_ACTIVE_SKILL_SLOT:CHARA_ID:0, SKILL_DEF_LIST:LOCAL) == -1
		CONTINUE
	SKILL_LV = HAS_SKILL(CHARA_ID, SKILL_DEF_LIST:LOCAL, MAJOR_GENRE)
	IF SKILL_LV
		SKILL_STR += TOHALF(@"<%GET_SKILL_NAME(SKILL_DEF_LIST:LOCAL, MAJOR_GENRE)%Lv{SKILL_LV}> ")
		IF STRLENS(SKILL_STR) > 120 * L_CNT
			SKILL_STR += "
"
			L_CNT ++
		ENDIF
	ENDIF
NEXT
LOCALS += SKILL_STR
HTML_PRINT @"
%LOCALS%
", 1

;-------------------------------------------------
; 装備の情報
;-------------------------------------------------
@NEW_PRINT_EQUIP(CHARA_ID)
#DIM CHARA_ID
#DIMS ATR_DIV
#DIM  DYNAMIC STATUS_IDX
#DIM  DYNAMIC WEAPON_DID
#DIM  DYNAMIC SLOT_ID
#DIMS DYNAMIC WEAPON_NAME
#DIMS DYNAMIC SKILL_NAME
#DIMS DYNAMIC SKILL_DEF_NAME
#DIMS DYNAMIC WPN_SKILL_DEF_LIST, VARSIZE("SKILL_DEF_LIST")
#DIMS DYNAMIC DIC_WPN_SKILL
#DIMS DYNAMIC TOOLTIP
#DIM  DYNAMIC SKILL_LV
#DIMS CONST  WPN_STATUS_NAME_SHORT = "攻撃", "防御", "軽減", "魔力", "行動", "敵視", "選敵"
;ステータスの表示順序
{
	#DIMS CONST COLUMN_ORDER =
		"ATTACK"
		, "DEFENCE"
		, "ARMOR"
		, "MAG"
		, "AGILITY"
		, "HATE_RATE"
		, "TARGETING"
}

ATR_DIV '=  @"rect = '200, 2800, 8250, 1200' border = '1px' bcolor='#%CVH(カラー_白)%' padding='2px'"
LOCALS '= ""
LOCALS += @"・%"武器", 34, LEFT%"

;ステータスヘッダ
LOCALS += @""
FOR LOCAL, 0, WPN_MAX_STATUSNUM
	LOCALS += @"%WPN_STATUS_NAME_SHORT:LOCAL, 8, LEFT%"
NEXT
LOCALS += "スキル"
LOCALS += ""

LOCALS += "
"
LOCALS += @"%DRAW_LINEH(80)%
"
DT_SELECT "WEAPON_STOCK", @"EQUIP_CHARA_ID = {CHARA_ID} AND EQUIP_TYPE = 0"
IF RESULT
	WEAPON_DID = RESULT:1
	CALL GET_WEAPON_PRINT_NAME(WEAPON_DID)
	WEAPON_NAME = %RESULTS%
	LOCALS += @"<button value = '[CHANGE_WEAPON:{WEAPON_DID}][EDIT_SLOT_ID:0]'>・%WEAPON_NAME, 30, LEFT%</button>"
	CALL GET_WEAPON_STATUS_FROM_STOCK_TABLE(,WEAPON_DID)
	FOR LOCAL, 0, WPN_MAX_STATUSNUM
		STATUS_IDX = FINDELEMENT(WPN_STATUS_NAME_ENG, COLUMN_ORDER:LOCAL)
		IF COLUMN_ORDER:LOCAL != "TARGETING"
			LOCALS += @"{WPN_STATUS:STATUS_IDX, 8, RIGHT}"
		ELSE
			LOCALS += @"%WPN_脅威選定文字列:(WPN_STATUS:STATUS_IDX), 8, RIGHT%"
		ENDIF
	NEXT
	LOCALS += "　　"
	;武器スキル_アクティブ
	CALL GET_EQUIP_SKILL_LIST_STR(WEAPON_DID, 武器スキル_アクティブ)
	LOCALS += CONV_TAG2H(RESULTS)

	;武器スキル_パッシブ
	CALL GET_EQUIP_SKILL_LIST_STR(WEAPON_DID, 武器スキル_パッシブ)
	LOCALS += CONV_TAG2H(RESULTS)

	LOCALS += "
"
ELSE
	LOCALS += @"<button value = '[CHANGE_WEAPON:{0}][EDIT_SLOT_ID:0]'>・ ---</button>
"
ENDIF
LOCALS += "
"

;レリック
LOCALS += "・レリック"
LOCALS += "
"
LOCALS += @"%DRAW_LINEH(80)%
"
FOR SLOT_ID, 0, 2
	DT_SELECT "WEAPON_STOCK", @"EQUIP_CHARA_ID = {CHARA_ID} AND EQUIP_TYPE = 1 AND EQUIP_SLOT_ID = {衣装部位_ﾚﾘｯｸ1 + SLOT_ID}"
	IF RESULT
		WEAPON_DID = RESULT:1
		CALL GET_WEAPON_PRINT_NAME(WEAPON_DID)
		WEAPON_NAME = %RESULTS%
		LOCALS += @"・<button value = '[CHANGE_RELIC:{WEAPON_DID}][EDIT_SLOT_ID:{衣装部位_ﾚﾘｯｸ1 + SLOT_ID}]'>%WEAPON_NAME, 30, LEFT%</button>"
		CALL GET_WEAPON_STATUS_FROM_STOCK_TABLE(,WEAPON_DID)
		FOR LOCAL, 0, WPN_MAX_STATUSNUM
			STATUS_IDX = FINDELEMENT(WPN_STATUS_NAME_ENG, COLUMN_ORDER:LOCAL)
			IF COLUMN_ORDER:LOCAL != "TARGETING"
				LOCALS += @"{WPN_STATUS:STATUS_IDX, 8, RIGHT}"
			ELSE
				LOCALS += TOSTR_SPACE(8)
			ENDIF
		NEXT
		LOCALS += "　　"
		;武器スキル_アクティブ
		CALL GET_EQUIP_SKILL_LIST_STR(WEAPON_DID, 武器スキル_アクティブ)
		LOCALS += CONV_TAG2H(RESULTS)

		;武器スキル_パッシブ
		CALL GET_EQUIP_SKILL_LIST_STR(WEAPON_DID, 武器スキル_パッシブ)
		LOCALS += CONV_TAG2H(RESULTS)
		LOCALS += "
"
	ELSE
		LOCALS += @"・<button value = '[CHANGE_RELIC:{0}][EDIT_SLOT_ID:{衣装部位_ﾚﾘｯｸ1 + SLOT_ID}]'> ---</button>
"
	ENDIF
NEXT

HTML_PRINT @"
%LOCALS%
", 1

repo_name: napo/erafl

license: unknown


code:
;-------------------------------------------------
;;; 関係性の改善チェック
;;; - RETURN
;;;      - RESULT:0 {bool} :関係性の変化があったか
;;;      - RESULT:1 {int} :変化後の関係性
;;;      - RESULT:2 {int} :変化前の関係性
;-------------------------------------------------
@RELATION_CHECK(REL_FROM_ID, REL_TO_ID)
#DIM REL_FROM_ID
#DIM REL_TO_ID

VARI CURRENT_RELATION_FROM
VARI CURRENT_RELATION_TO
VARI DID
VARI 好感度_FROM
VARI 依存度_FROM
VARI 従属度_FROM
VARI 支配度_FROM
VARI ALLOW_UFUFU_FROM
VARI ALLOW_LOVER_FROM
VARI ALLOW_SUBORDINATE_FROM
VARI ALLOW_DOMINANCE_FROM
VARI 好感度_TO
VARI 依存度_TO
VARI 従属度_TO
VARI 支配度_TO
VARI ALLOW_UFUFU_TO
VARI ALLOW_LOVER_TO
VARI ALLOW_SUBORDINATE_TO
VARI ALLOW_DOMINANCE_TO

DT_SELECT "CHARA_RELATION", @"REL_FROM_ID = {REL_FROM_ID} AND REL_TO_ID = {REL_TO_ID}",, DID
CURRENT_RELATION_FROM = DT_CELL_GET("CHARA_RELATION", DID, "RELATION", 1)
好感度_FROM = DT_CELL_GET("CHARA_RELATION", DID, "LIKE", 1)
依存度_FROM = DT_CELL_GET("CHARA_RELATION", DID, "DEPENDENCE", 1)
従属度_FROM = DT_CELL_GET("CHARA_RELATION", DID, "SUBORDINATE", 1)
支配度_FROM = DT_CELL_GET("CHARA_RELATION", DID, "DOMINANCE", 1)
ALLOW_UFUFU_FROM = DT_CELL_GET("CHARA_RELATION", DID, "ALLOW_UFUFU", 1)
ALLOW_LOVER_FROM = DT_CELL_GET("CHARA_RELATION", DID, "ALLOW_LOVER", 1)
ALLOW_SUBORDINATE_FROM = DT_CELL_GET("CHARA_RELATION", DID, "ALLOW_SUBORDINATE", 1)
ALLOW_DOMINANCE_FROM = DT_CELL_GET("CHARA_RELATION", DID, "ALLOW_DOMINANCE", 1)

DT_SELECT "CHARA_RELATION", @"REL_FROM_ID = {REL_TO_ID} AND REL_TO_ID = {REL_FROM_ID}",, DID
CURRENT_RELATION_TO = DT_CELL_GET("CHARA_RELATION", DID, "RELATION", 1)
好感度_TO = DT_CELL_GET("CHARA_RELATION", DID, "LIKE", 1)
依存度_TO = DT_CELL_GET("CHARA_RELATION", DID, "DEPENDENCE", 1)
従属度_TO = DT_CELL_GET("CHARA_RELATION", DID, "SUBORDINATE", 1)
支配度_TO = DT_CELL_GET("CHARA_RELATION", DID, "DOMINANCE", 1)
ALLOW_UFUFU_TO = DT_CELL_GET("CHARA_RELATION", DID, "ALLOW_UFUFU", 1)
ALLOW_LOVER_TO = DT_CELL_GET("CHARA_RELATION", DID, "ALLOW_LOVER", 1)
ALLOW_SUBORDINATE_TO = DT_CELL_GET("CHARA_RELATION", DID, "ALLOW_SUBORDINATE", 1)
ALLOW_DOMINANCE_TO = DT_CELL_GET("CHARA_RELATION", DID, "ALLOW_DOMINANCE", 1)

;デバッグ用
;-------------------------------------------------
; IF REL_FROM_ID == 1
;     DEBUGPRINTFORML @関係性チェック:%ANAME(REL_FROM_ID)% -> %ANAME(REL_TO_ID)%
;     DEBUGPRINTFORML CURRENT_RELATION_FROM = {CURRENT_RELATION_FROM}, CURRENT_RELATION_TO = {CURRENT_RELATION_TO}
;     DEBUGPRINTFORML 好感度_FROM = {好感度_FROM}, 好感度_TO = {好感度_TO}
;     DEBUGPRINTFORML 依存度_FROM = {依存度_FROM}, 依存度_TO = {依存度_TO}
;     DEBUGPRINTFORML 従属度_FROM = {従属度_FROM}, 従属度_TO = {従属度_TO}
;     DEBUGPRINTFORML 支配度_FROM = {支配度_FROM}, 支配度_TO = {支配度_TO}
;     DEBUGPRINTFORML ALLOW_UFUFU_FROM = {ALLOW_UFUFU_FROM}, ALLOW_LOVER_FROM = {ALLOW_LOVER_FROM}, ALLOW_SUBORDINATE_FROM = {ALLOW_SUBORDINATE_FROM}, ALLOW_DOMINANCE_FROM = {ALLOW_DOMINANCE_FROM}
;     DEBUGPRINTFORML ALLOW_UFUFU_TO = {ALLOW_UFUFU_TO}, ALLOW_LOVER_TO = {ALLOW_LOVER_TO}, ALLOW_SUBORDINATE_TO = {ALLOW_SUBORDINATE_TO}, ALLOW_DOMINANCE_TO = {ALLOW_DOMINANCE_TO}
; ENDIF
;-------------------------------------------------

;恋慕・親愛ルート
;-------------------------------------------------
IF ALLOW_LOVER_FROM
    ;恋慕への変化
    ;友人、親友から恋慕へ変化
    IF GROUPMATCH(CURRENT_RELATION_FROM, 関係性_友人, 関係性_親友)
        {
            IF 好感度_FROM >= 1500 && 好感度_TO >= 1500
                && (依存度_FROM >= 300 && 依存度_TO >= 300)
                && (IS_SEXUAL(REL_FROM_ID, REL_TO_ID))
        }
            RESULT:1 = 関係性_恋慕
            RETURN 1
        ENDIF
    ENDIF

    ;恋慕から恋人への変化
    IF GROUPMATCH(CURRENT_RELATION_FROM, 関係性_恋慕)
        IF CURRENT_RELATION_TO == 関係性_恋慕 && ALLOW_LOVER_TO
            RESULT:1 = 関係性_恋人
            RETURN 1
        ENDIF
    ENDIF

    ;恋人から親愛への変化
    IF GROUPMATCH(CURRENT_RELATION_FROM, 関係性_恋人)
        {
            IF 好感度_FROM >= 10000 && 好感度_TO >= 10000
                && (依存度_FROM >= 3000 && 依存度_TO >= 3000)
                && ALLOW_LOVER_TO
        }
            RESULT:1 = 関係性_親愛
            RETURN 1
        ENDIF
    ENDIF
ENDIF

;依存・服従・隷属ルート
;支配・主人・所有者ルート
;-------------------------------------------------
IF ALLOW_SUBORDINATE_FROM
    ;知人、友人、親友から依存へ変化
    IF GROUPMATCH(CURRENT_RELATION_FROM, 関係性_知人, 関係性_友人, 関係性_親友)
        {
            IF 従属度_FROM >= 1500
                && 依存度_FROM >= 300
        }
            RESULT:1 = 関係性_依存
            RETURN 1
        ENDIF
    ENDIF
ENDIF

IF ALLOW_DOMINANCE_FROM
    ;知人、友人、親友から支配へ変化
    IF GROUPMATCH(CURRENT_RELATION_FROM, 関係性_知人, 関係性_友人, 関係性_親友)
        {
            IF 支配度_FROM >= 1500
                && 依存度_FROM >= 300
        }
            RESULT:1 = 関係性_支配
            RETURN 1
        ENDIF
    ENDIF
ENDIF

;依存と支配の関係性が成立した場合、服従と主人の関係に変化
IF ALLOW_SUBORDINATE_FROM && ALLOW_DOMINANCE_TO
    IF CURRENT_RELATION_FROM == 関係性_依存 && CURRENT_RELATION_TO == 関係性_支配
        RESULT:1 = 関係性_服従
        RETURN 1
        ;服従と主人の関係が条件を満たした場合、隷属と所有の関係に変化
    ELSEIF CURRENT_RELATION_FROM == 関係性_服従 && CURRENT_RELATION_TO == 関係性_主人
        IF (従属度_FROM >= 10000 && 依存度_FROM >= 3000) && (支配度_TO >= 10000 && 依存度_TO >= 3000)
            RESULT:1 = 関係性_隷属
            RETURN 1
        ENDIF
    ENDIF
ENDIF

;;; 友情ルート
;-------------------------------------------------
;友人への変化
;知人から友人へ変化
IF GROUPMATCH(CURRENT_RELATION_FROM, 関係性_知人)
    IF 好感度_FROM > 600
        RESULT:1 = 関係性_友人
        RETURN 1
    ENDIF
ENDIF

;親友への変化
;友人から親友へ変化
IF GROUPMATCH(CURRENT_RELATION_FROM, 関係性_友人)
    {
        IF 好感度_FROM >= 1500 && 好感度_TO >= 1500
            && (依存度_FROM >= 300 && 依存度_TO >= 300)
            && (!ALLOW_LOVER_FROM || !IS_SEXUAL(REL_FROM_ID, REL_TO_ID))
    }
        RESULT:1 = 関係性_親友
        RETURN 1
    ENDIF
ENDIF

RETURN 0

;-------------------------------------------------
;;; 配列に指定した関係性を持つキャラの数と登録番号を取得する
;;;  - ARGS
;;;     - CHARA_ID {int} :関係性を持つ元キャラ登録番号
;;;     - RELATION_ARRAY {array} :チェック対象の関係性値を格納した配列
;;;  - RETURN
;;;     - RESULT:0 {int} :合致した関係性を持つ先キャラの数
;;;     - RESULT:1-n {int} :合致した関係性を持つ先キャラの登録番号
;-------------------------------------------------
@REL_GET_RELATION(CHARA_ID, RELATION_ARRAY)
#FUNCTION
#DIM CHARA_ID
#DIM REF RELATION_ARRAY
#DIM DYNAMIC DID, MAX_CHARANUM
#DIM DYNAMIC ITER_I
#DIM DYNAMIC ITER_J
#DIM DYNAMIC MATCH_COUNT
#DIM DYNAMIC RELATION_VALUE
VARSET RESULT

DT_SELECT "CHARA_RELATION", @"REL_FROM_ID = {CHARA_ID}",, DID
IF RESULT
    FOR ITER_I, 0, RESULT
        RELATION_VALUE = DT_CELL_GET("CHARA_RELATION", DID:ITER_I, "RELATION", 1)
        FOR ITER_J, 0, VARSIZE("RELATION_ARRAY")
            IF RELATION_ARRAY:ITER_J == RELATION_VALUE
                MATCH_COUNT++
                RESULT:MATCH_COUNT = DT_CELL_GET("CHARA_RELATION", DID:ITER_I, "REL_TO_ID", 1)
                BREAK
            ENDIF
        NEXT
    NEXT
ENDIF
RETURNF MATCH_COUNT

;-------------------------------------------------
;;; 恋慕系関係を持つキャラの数を取得する
;-------------------------------------------------
@REL_COUNT_LOVER(REL_FROM_ID, INCLUDE_MASTER = 1)
#FUNCTION
#DIM REL_FROM_ID
#DIM INCLUDE_MASTER
#DIM DYNAMIC MATCH_COUNT
{
    #DIM DYNAMIC RELATION_ARRAY =
        関係性_恋慕,
        関係性_恋人,
        関係性_親愛,
        関係性_夫婦
}
IF INCLUDE_MASTER && IS_LOVER(REL_FROM_ID)
    MATCH_COUNT++
ENDIF
MATCH_COUNT = REL_GET_RELATION(REL_FROM_ID, RELATION_ARRAY)
RETURNF MATCH_COUNT

;-------------------------------------------------
;;; 従属系関係を持つキャラの数を取得する
;-------------------------------------------------
@REL_COUNT_SUBORDINATE(REL_FROM_ID, INCLUDE_MASTER = 1)
#FUNCTION
#DIM REL_FROM_ID
#DIM INCLUDE_MASTER
#DIM DYNAMIC MATCH_COUNT
{
    #DIM DYNAMIC RELATION_ARRAY =
        関係性_服従,
        関係性_隷属
}
MATCH_COUNT = REL_GET_RELATION(REL_FROM_ID, RELATION_ARRAY)
IF INCLUDE_MASTER && IS_SLAVE(REL_FROM_ID)
    MATCH_COUNT++
ENDIF
RETURNF MATCH_COUNT

;-------------------------------------------------
;;; 支配系関係を持つキャラの数を取得する
;-------------------------------------------------
@REL_COUNT_DOMINANCE(REL_FROM_ID, INCLUDE_MASTER = 1)
#FUNCTION
#DIM REL_FROM_ID
#DIM INCLUDE_MASTER
#DIM DYNAMIC MATCH_COUNT
{
    #DIM DYNAMIC RELATION_ARRAY =
        関係性_主人,
        関係性_所有
}
MATCH_COUNT = REL_GET_RELATION(REL_FROM_ID, RELATION_ARRAY)
IF INCLUDE_MASTER && IS_SLAVED_BY(REL_FROM_ID)
    MATCH_COUNT++
ENDIF
RETURNF MATCH_COUNT

;-------------------------------------------------
;;; 関係性の許可の変更
;-------------------------------------------------
@CHARA_RELATION_SET_PERMISSION(REL_FROM_ID, REL_TO_ID, PERMISSION_NAME, PERMISSION_VALUE)
#DIM  REL_FROM_ID
#DIM  REL_TO_ID
#DIMS PERMISSION_NAME
#DIM  PERMISSION_VALUE

VARI DID
DT_SELECT "CHARA_RELATION", @"REL_FROM_ID = {REL_FROM_ID} AND REL_TO_ID = {REL_TO_ID}",, DID
IF RESULT
    DT_CELL_SET "CHARA_RELATION", DID, PERMISSION_NAME, PERMISSION_VALUE, 1
ENDIF

@CHARA_RELATION_TOGGLE_PERMISSION(DID, PERMISSION_NAME)
#DIM  DID
#DIMS PERMISSION_NAME
#DIM  PERMISSION_VALUE

PERMISSION_VALUE = DT_CELL_GET("CHARA_RELATION", DID, PERMISSION_NAME, 1)
DT_CELL_SET "CHARA_RELATION", DID, PERMISSION_NAME, !PERMISSION_VALUE, 1
RETURN

@CHARA_RELATION_SET_PERMISSION_ALL(REL_FROM_ID, PERMISSION_NAME, PERMISSION_VALUE)
#DIM  REL_FROM_ID
#DIM  REL_TO_ID
#DIMS PERMISSION_NAME
#DIM  PERMISSION_VALUE
#DIM  DYNAMIC MEM_CNT
#DIM  DYNAMIC DID, MAX_FIXED_CHARA

MEM_CNT = DT_SELECT("CHARA_RELATION", @"REL_FROM_ID = {REL_FROM_ID}",, DID)
SIF MEM_CNT == 0
    RETURN

FOR LOCAL, 0, MEM_CNT
    DT_CELL_SET "CHARA_RELATION", DID:LOCAL, PERMISSION_NAME, PERMISSION_VALUE, 1
NEXT


code:
;-------------------------------------------------
;;; 関係性の改善チェック
;;; @ TALENT_CHECK_RELATIONから呼び出される
;-------------------------------------------------
@CHARA_RELATION_IMPROVE_CHECK(REL_FROM_ID, SHOW_MESSAGE = 1)
#DIM REL_FROM_ID
#DIM SHOW_MESSAGE
#DIM DYNAMIC DID, MAX_CHARA_NUM

VARI REL_TO_ID
VARI RECORD_NUM
VARI I
VARI REL_BEFORE
VARI REL_AFTER

IF TALENT:(REL_FROM_ID):虚ろ || TALENT:(REL_FROM_ID):崩壊
    RETURN 0
ENDIF
RECORD_NUM = DT_SELECT("CHARA_RELATION", @"REL_FROM_ID = {REL_FROM_ID}",, DID)
FOR I, 0, RECORD_NUM
    REL_TO_ID = DT_CELL_GET("CHARA_RELATION", DID:I, "REL_TO_ID", 1)
    VARSET RESULT
    CALL RELATION_CHECK(REL_FROM_ID, REL_TO_ID)
    IF !RESULT
        CONTINUE
    ENDIF
    REL_AFTER = RESULT:1
    REL_BEFORE = RESULT:2
    SELECTCASE REL_AFTER
        CASE 関係性_友人
            CALL CHARA_RELATION_SET_RELATION(REL_FROM_ID, REL_TO_ID, REL_AFTER)
            IF SHOW_MESSAGE
                PRINTFORMW %ANAME(REL_FROM_ID)%は%ANAME(REL_TO_ID)%に友情を感じているようだ
                PRINTL
            ENDIF
        CASE 関係性_親友
            CALL CHARA_RELATION_SET_RELATION(REL_FROM_ID, REL_TO_ID, REL_AFTER)
            CALL CHARA_RELATION_SET_RELATION(REL_TO_ID, REL_FROM_ID, REL_AFTER)
            IF SHOW_MESSAGE
                PRINTFORMW %ANAME(REL_FROM_ID)%と%ANAME(REL_TO_ID)%は互いを親友と認め合っているようだ
                PRINTL
            ENDIF
        CASE 関係性_恋慕
            CALL CHARA_RELATION_IMPROVE_EVENT_恋慕(REL_FROM_ID, REL_TO_ID)
            PRINTL
        CASE 関係性_恋人
            CALL CHARA_RELATION_IMPROVE_EVENT_恋人(REL_FROM_ID, REL_TO_ID)
            PRINTL
        CASE 関係性_親愛
            CALL CHARA_RELATION_IMPROVE_EVENT_親愛(REL_FROM_ID, REL_TO_ID)
            PRINTL
        CASE 関係性_依存
            CALL CHARA_RELATION_IMPROVE_EVENT_依存(REL_FROM_ID, REL_TO_ID)
            PRINTL
        CASE 関係性_支配
            CALL CHARA_RELATION_IMPROVE_EVENT_支配(REL_FROM_ID, REL_TO_ID)
            PRINTL
        CASE 関係性_服従
            CALL CHARA_RELATION_IMPROVE_EVENT_主人と服従(REL_FROM_ID, REL_TO_ID)
            PRINTL
        CASE 関係性_隷属
            CALL CHARA_RELATION_IMPROVE_EVENT_所有と隷属(REL_FROM_ID, REL_TO_ID)
            PRINTL
    ENDSELECT
NEXT

;-------------------------------------------------
;;; 関係性変化時のイベント
;-------------------------------------------------
@CHARA_RELATION_IMPROVE_EVENT_恋慕(REL_FROM_ID, REL_TO_ID)
#DIM  REL_FROM_ID
#DIM  REL_TO_ID

VARI LEWD_POINT
VARI LOVER_ID
CALLF REL_COUNT_LOVER(REL_FROM_ID, 0)
LOVER_ID = RESULT:1

CALL DRAW_PORTRAIT(REL_FROM_ID, "[目:閉じ(緩)][眉:リラックス][OVL_表情:赤面][サイズ:180px][POS_X:25]",,1)
PRINTFORMW %ANAME(REL_FROM_ID)%の様子がおかしい……
PRINTFORMW %ANAME(REL_FROM_ID)%は%ANAME(REL_TO_ID)%に対して思慕を募らせているようだ
PRINTL
IF IS_LOVER(REL_FROM_ID) || LOVER_ID
    IF IS_LOVER(REL_FROM_ID)
        PRINTFORML ……だが%ANAME(REL_FROM_ID)%は既に%ANAME(MASTER)%と深い関係を築いている
    ELSE
        PRINTFORML ……だが%ANAME(REL_FROM_ID)%は既に%ANAME(LOVER_ID)%と深い関係を築いている
    ENDIF
    PRINTFORMW このうえさらに%ANAME(REL_TO_ID)%との関係性を進めてもよいものだろうか？
    PRINTL
    {
        CALL ASK_MULTI_ANNOTATION(
            "欲望に従う　　", "浮気経験+1,淫堕点+25"
            ,"判断を留保する", "今は関係を変えない(後日イベント再発の可能性あり)"
            ,"頭から振り払う", @"%ANAME(REL_FROM_ID)%から%ANAME(REL_TO_ID)%への恋慕関係の許容を\"禁止\"にセット"
            )
    }
    SELECTCASE RESULT
        CASE 0
            PRINTFORMW %ANAME(REL_FROM_ID)%は欲望に身を委ね%ANAME(REL_TO_ID)%とも関係を深めることにした……
            EXP:REL_FROM_ID:浮気経験 += 1
            LEWD_POINT += 25
            CALL CHARA_RELATION_SET_RELATION(REL_FROM_ID, REL_TO_ID, 関係性_恋慕)
        CASE 1
            PRINTFORMW ……軽々に考えるべきではない。%ANAME(REL_FROM_ID)%は今は判断を保留することにした……
            CFLAG:REL_FROM_ID:陥落イベントクールタイム += RAND(3, 5)
            RETURN 0
        CASE 2
            PRINTFORMW 不義理を犯すべきではない……%ANAME(REL_FROM_ID)%は%ANAME(REL_TO_ID)%との関係を頭から振り払った……
            CALL CHARA_RELATION_SET_PERMISSION(REL_FROM_ID, REL_TO_ID, "ALLOW_LOVER", 0)
            RETURN 0
    ENDSELECT
ELSE
    CALL CHARA_RELATION_SET_RELATION(REL_FROM_ID, REL_TO_ID, 関係性_恋慕)
ENDIF
CALLF TAG_PRINT(@"%ANAME(REL_FROM_ID)%は%ANAME(REL_TO_ID)%に対して@C:{カラー_ピンク}@<恋慕>@C@を抱くようになった！", 1)
LEWD_POINT += 25
CALL QST_CHANGE_ITEM(@"淫堕点,{LEWD_POINT},")
RETURN 1

;-------------------------------------------------
;;; 関係性変化イベント・恋人
;-------------------------------------------------
@CHARA_RELATION_IMPROVE_EVENT_恋人(REL_FROM_ID, REL_TO_ID)
#DIM  REL_FROM_ID
#DIM  REL_TO_ID

CALL CHARA_RELATION_SET_RELATION(REL_FROM_ID, REL_TO_ID, 関係性_恋人)
CALL CHARA_RELATION_SET_RELATION(REL_TO_ID, REL_FROM_ID, 関係性_恋人)

CALL DRAW_PORTRAIT(REL_FROM_ID, "[目:閉じ(緩)][眉:リラックス][OVL_表情:赤面][サイズ:180px][POS_X:25PX]",,0)
CALL DRAW_PORTRAIT(REL_TO_ID, "[目:閉じ(緩)][眉:リラックス][OVL_表情:赤面][サイズ:180px][POS_X:250PX]",,1)
PRINTFORML %ANAME(REL_FROM_ID)%と%ANAME(REL_TO_ID)%の様子がおかしい……
PRINTFORMW %ANAME(REL_FROM_ID)%と%ANAME(REL_TO_ID)%は互いの恋心を自覚したようだ
PRINTL
CALLF TAG_PRINT(@"%ANAME(REL_FROM_ID)%と%ANAME(REL_TO_ID)%は@C:{カラー_ピンク}@<恋人>@C@になった！", 1)
CALL QST_CHANGE_ITEM("淫堕点,50,")
RETURN 1

@CHARA_RELATION_IMPROVE_EVENT_親愛(REL_FROM_ID, REL_TO_ID)
#DIM  REL_FROM_ID
#DIM  REL_TO_ID

CALL CHARA_RELATION_SET_RELATION(REL_FROM_ID, REL_TO_ID, 関係性_親愛)
CALL CHARA_RELATION_SET_RELATION(REL_TO_ID, REL_FROM_ID, 関係性_親愛)

CALL DRAW_PORTRAIT(REL_FROM_ID, "[目:閉じ(緩)][眉:リラックス][OVL_表情:赤面][サイズ:180px][POS_X:25PX]",,0)
CALL DRAW_PORTRAIT(REL_TO_ID, "[目:閉じ(緩)][眉:リラックス][OVL_表情:赤面][サイズ:180px][POS_X:250PX]",,1)
PRINTFORML %ANAME(REL_FROM_ID)%と%ANAME(REL_TO_ID)%の様子がおかしい……
PRINTFORMW %ANAME(REL_FROM_ID)%と%ANAME(REL_TO_ID)%は互いを、離れることのできないかけがえない存在として認識しているようだ
PRINTL
CALLF TAG_PRINT(@"%ANAME(REL_FROM_ID)%と%ANAME(REL_TO_ID)%は@C:{カラー_ピンク}@<親愛>@C@になった！", 1)
CALL QST_CHANGE_ITEM("淫堕点,100,")
RETURN 1

;-------------------------------------------------
;;; 関係性変化時のイベント_依存
;-------------------------------------------------
@CHARA_RELATION_IMPROVE_EVENT_依存(REL_FROM_ID, REL_TO_ID)
#DIM  REL_FROM_ID
#DIM  REL_TO_ID

VARI LEWD_POINT
VARI SLAVE_ID
CALLF REL_COUNT_SUBORDINATE(REL_FROM_ID, 0)
SLAVE_ID = RESULT:1

CALL DRAW_PORTRAIT(REL_FROM_ID, "[目:閉じ(緩)][眉:リラックス][OVL_表情:赤面][サイズ:180px][POS_X:25PX]",,1)
PRINTFORMW %ANAME(REL_FROM_ID)%の様子がおかしい……
PRINTFORMW %ANAME(REL_FROM_ID)%の心は%ANAME(REL_TO_ID)%に深く依存しつつつあるようだ
PRINTL
IF IS_SLAVE(REL_FROM_ID) || SLAVE_ID
    IF IS_SLAVE(REL_FROM_ID)
        PRINTFORML ……だが%ANAME(REL_FROM_ID)%は既に%ANAME(MASTER)%を自身の主人と認めている
    ELSE
        PRINTFORML ……だが%ANAME(REL_FROM_ID)%は既に%ANAME(SLAVE_ID)%を自身の主人と認めている
    ENDIF
    PRINTFORMW このうえさらに%ANAME(REL_TO_ID)%との関係性を進めてもよいものだろうか？
    PRINTL
    {
        CALL ASK_MULTI_ANNOTATION_P(
            "意のままになる", "浮気経験+1,淫堕点+25"
            ,"判断を留保する", "今は関係を変えない(後日イベント再発の可能性あり)"
            ,"懸命に抗う", @"%ANAME(REL_FROM_ID)%から%ANAME(REL_TO_ID)%への恋慕関係の許容を\"禁止\"にセット"
            )
    }
    SELECTCASE RESULT
        CASE 0
            PRINTFORMW %ANAME(REL_FROM_ID)%は欲望に身を委ね%ANAME(REL_TO_ID)%にも身を委ねることにした……
            EXP:REL_FROM_ID:浮気経験 += 1
            LEWD_POINT += 25
            CALL CHARA_RELATION_SET_RELATION(REL_FROM_ID, REL_TO_ID, 関係性_依存)
        CASE 1
            PRINTFORMW ……軽々に考えるべきではない。%ANAME(REL_FROM_ID)%は今は判断を保留することにした……
            CFLAG:REL_FROM_ID:陥落イベントクールタイム += RAND(3, 5)
            RETURN 0
        CASE 2
            PRINTFORMW はなけなしの気力を振り絞って%ANAME(REL_FROM_ID)%は%ANAME(REL_TO_ID)%との関係を拒んだ……
            CALL CHARA_RELATION_SET_PERMISSION(REL_FROM_ID, REL_TO_ID, "ALLOW_SUBORDINATE", 0)
            RETURN 0
    ENDSELECT
ELSE
    CALL CHARA_RELATION_SET_RELATION(REL_FROM_ID, REL_TO_ID, 関係性_依存)
ENDIF
CALLF TAG_PRINT(@"%ANAME(REL_FROM_ID)%は%ANAME(REL_TO_ID)%に対して@C:{カラー_ピンク}@<依存>@C@を抱くようになった！", 1)
LEWD_POINT += 25
CALL QST_CHANGE_ITEM(@"淫堕点,{LEWD_POINT},")
RETURN 1

;-------------------------------------------------
;;; 関係性変化イベント・主人と服従
;-------------------------------------------------
@CHARA_RELATION_IMPROVE_EVENT_支配(REL_FROM_ID, REL_TO_ID)
#DIM  REL_FROM_ID
#DIM  REL_TO_ID

CALL CHARA_RELATION_SET_RELATION(REL_FROM_ID, REL_TO_ID, 関係性_支配)

CALL DRAW_PORTRAIT(REL_FROM_ID, "[目:閉じ(緩)][眉:リラックス][OVL_表情:赤面][サイズ:180px][POS_X:25PX]",,1)
PRINTFORML %ANAME(REL_FROM_ID)%の様子がおかしい……
PRINTFORMW %ANAME(REL_FROM_ID)%は%ANAME(REL_TO_ID)%に対する支配欲を隠し切れなくなっているようだ
PRINTL
CALLF TAG_PRINT(@"%ANAME(REL_FROM_ID)%は%ANAME(REL_FROM_ID)%に対して@C:{カラー_ピンク}@<支配>@C@の関係を抱いた！", 1)
CALL QST_CHANGE_ITEM("淫堕点,25,")
RETURN 1

@CHARA_RELATION_IMPROVE_EVENT_主人と服従(REL_FROM_ID, REL_TO_ID)
#DIM  REL_FROM_ID
#DIM  REL_TO_ID

CALL CHARA_RELATION_SET_RELATION(REL_FROM_ID, REL_TO_ID, 関係性_服従)
CALL CHARA_RELATION_SET_RELATION(REL_TO_ID, REL_FROM_ID, 関係性_主人)

CALL DRAW_PORTRAIT(REL_FROM_ID, "[目:閉じ(緩)][眉:リラックス][OVL_表情:赤面][サイズ:180px][POS_X:25PX]",,0)
CALL DRAW_PORTRAIT(REL_TO_ID, "[目:閉じ(緩)][眉:リラックス][OVL_表情:赤面][サイズ:180px][POS_X:250PX]",,1)
PRINTFORML %ANAME(REL_FROM_ID)%と%ANAME(REL_TO_ID)%の様子がおかしい……
PRINTFORMW %ANAME(REL_FROM_ID)%の心は%ANAME(REL_TO_ID)%に深く依存し、%IS_MALE(REL_TO_ID) ? "彼" # "彼女"%に服従しているようだ
PRINTFORMW 対する%ANAME(REL_TO_ID)%もこれを認め、%ANAME(REL_FROM_ID)%の主人として振る舞っている
PRINTL
CALLF TAG_PRINT(@"%ANAME(REL_FROM_ID)%は%ANAME(REL_TO_ID)%と@C:{カラー_ピンク}@<服従>/<主人>@C@の関係になった！", 1)
CALL QST_CHANGE_ITEM("淫堕点,50,")
RETURN 1

@CHARA_RELATION_IMPROVE_EVENT_所有と隷属(REL_FROM_ID, REL_TO_ID)
#DIM  REL_FROM_ID
#DIM  REL_TO_ID

CALL CHARA_RELATION_SET_RELATION(REL_FROM_ID, REL_TO_ID, 関係性_隷属)
CALL CHARA_RELATION_SET_RELATION(REL_TO_ID, REL_FROM_ID, 関係性_所有)

CALL DRAW_PORTRAIT(REL_FROM_ID, "[目:閉じ(緩)][眉:リラックス][OVL_表情:赤面][サイズ:180px][POS_X:25PX]",,0)
CALL DRAW_PORTRAIT(REL_TO_ID, "[目:閉じ(緩)][眉:リラックス][OVL_表情:赤面][サイズ:180px][POS_X:250PX]",,1)
PRINTFORML %ANAME(REL_FROM_ID)%と%ANAME(REL_TO_ID)%の様子がおかしい……
PRINTFORMW %ANAME(REL_FROM_ID)%の心は%ANAME(REL_TO_ID)%に完全に依存し、%IS_MALE(REL_TO_ID) ? "彼" # "彼女"%に全てを委ねているようだ
PRINTFORMW 対する%ANAME(REL_TO_ID)%も%ANAME(REL_FROM_ID)%の一挙手一投足を支配し、自身の所有物の如く扱っている
PRINTL
CALLF TAG_PRINT(@"%ANAME(REL_FROM_ID)%は%ANAME(REL_TO_ID)%と@C:{カラー_ピンク}@<隷属>/<所有>@C@の関係になった！", 1)
CALL QST_CHANGE_ITEM("淫堕点,100,")
RETURN 1


code:
;SLG関数の中でも、特に高速化用の特殊変数
;状況次第で意図した結果が得られないことも多いため、取り扱いは控えるのが無難
;-----------------------------
;星評価を表示
;TMP_CREATE_STARS_MAPとセット
;-----------------------------
@TMP_PRINT_COUNTRY_STARS(勢力番号)
#DIM 勢力番号
SELECTCASE TMP_COUNTRY_STARS:勢力番号
	CASE 5
		LOCAL:1 = カラー_ピンク
	CASE 4
		LOCAL:1 = カラー_オレンジ
	CASE 3
		LOCAL:1 = カラー_緑
	CASE 2
		LOCAL:1 = カラー_シアン
	CASE 1
		LOCAL:1 = カラー_灰色
	CASEELSE
		LOCAL:1 = 0X000000
ENDSELECT
FOR LOCAL, 0, 5
	IF LOCAL < TMP_COUNTRY_STARS:勢力番号
		CALL COLOR_PRINT("★", LOCAL:1)
	ELSE
		PRINT ☆
	ENDIF
NEXT

;-----------------------------
;キャラの星評価を用意
;-----------------------------
@TMP_PREPARE_CHARA_STARS()
#DIM 合計ポイント, MAX_CHARA_NUM
#DIM キャラ数
#DIM 能力 = GETNUM(ABL, "身体"), GETNUM(ABL, "器用"), GETNUM(ABL, "魔術"), GETNUM(ABL, "料理"), GETNUM(ABL, "歌唱"), GETNUM(ABL, "話術"), GETNUM(ABL, "戦闘")
VARSET 合計ポイント, __INT_MAX__

;値合計用意
FOR LOCAL, 0, CHARANUM
	合計ポイント:LOCAL = 0
	SIF CFLAG:LOCAL:特殊状態 == 特殊状態_死亡
		CONTINUE
	合計ポイント:LOCAL += ABL:LOCAL:身体
	合計ポイント:LOCAL += ABL:LOCAL:器用
	合計ポイント:LOCAL += ABL:LOCAL:知識
	合計ポイント:LOCAL += ABL:LOCAL:社交
	合計ポイント:LOCAL += ABL:LOCAL:魔術 * 3 / 2
	合計ポイント:LOCAL += MAX(ABL:LOCAL:料理 - 50, 0)
	合計ポイント:LOCAL += MAX(ABL:LOCAL:歌唱 - 50, 0)
	FOR LOCAL:1, 0, VARSIZE("能力")
		SELECTCASE 能力:(LOCAL:1)
			CASE GETNUM(ABL, "身体"), GETNUM(ABL, "器用"), GETNUM(ABL, "知識"), GETNUM(ABL, "社交")
				SELECTCASE ALPHABET_RANK(ABL:LOCAL:(能力:(LOCAL:1)), 0)
					CASE "S"
						合計ポイント:LOCAL += 15
					CASE "A"
						合計ポイント:LOCAL += 10
					CASE "B"
						合計ポイント:LOCAL += 5
				ENDSELECT
			CASE GETNUM(ABL, "魔術")
				SELECTCASE ALPHABET_RANK(ABL:LOCAL:(能力:(LOCAL:1)), 1)
					CASE "S"
						合計ポイント:LOCAL += 30
					CASE "A"
						合計ポイント:LOCAL += 25
					CASE "B"
						合計ポイント:LOCAL += 20
					CASE "C"
						合計ポイント:LOCAL += 15
					CASE "D"
						合計ポイント:LOCAL += 10
					CASE "E"
						合計ポイント:LOCAL += 5
				ENDSELECT
			CASE GETNUM(ABL, "料理"), GETNUM(ABL, "歌唱")
				SELECTCASE ALPHABET_RANK(ABL:LOCAL:(能力:(LOCAL:1)), 2)
					CASE "S"
						合計ポイント:LOCAL += 20
					CASE "A"
						合計ポイント:LOCAL += 15
					CASE "B"
						合計ポイント:LOCAL += 10
					CASE "C"
						合計ポイント:LOCAL += 5
				ENDSELECT
		ENDSELECT
	NEXT
	FOR LOCAL:1, 0, SKILL_GENRE_NUM
		FOR LOCAL:2, 0, MAX_SKILL_SLOT
			LOCALS = SKILL_{SKILL_NO_SLOT:(LOCAL):(LOCAL:1):(LOCAL:2)}_%SKILL_GENRE_ENG:(LOCAL:1)%_{SKILL_ID_SLOT:(LOCAL):(LOCAL:1):(LOCAL:2)}
			TRYCCALLFORM %LOCALS%_EXIST
				CALLFORM %LOCALS%_LEVEL
				SELECTCASE RESULT
					CASE 2
						合計ポイント:LOCAL += 3
					CASE 3
						合計ポイント:LOCAL += 7
					CASE 4
						合計ポイント:LOCAL += 10
					CASE 5
						合計ポイント:LOCAL += 15
				ENDSELECT
			CATCH
			ENDCATCH
		NEXT
	NEXT
NEXT

;TMP_CHARA_STARSの数
LOCAL:2 = 1
;このTMP_CHARA_STARS数でのTMP_CHARA_STARS付与回数
LOCAL:3 = 0

;TMP_CHARA_STARSを小さい順に付与
FOR LOCAL, 0, CHARANUM
	LOCAL:1 = FINDELEMENT(合計ポイント, MINARRAY(合計ポイント))
	合計ポイント:(LOCAL:1) = __INT_MAX__
	TMP_CHARA_STARS:(LOCAL:1) = LOCAL:2
	LOCAL:3 ++
	IF LOCAL:2 <= CHARANUM % 10
		IF CHARANUM / 10 + 1 <= LOCAL:3
			LOCAL:3 = 0
			LOCAL:2 ++
		ENDIF
	ELSEIF CHARANUM / 10 <= LOCAL:3
		LOCAL:3 = 0
		LOCAL:2 ++
	ENDIF
	;そのTMP_CHARA_STARS数でTMP_CHARA_STARSを与えた回数が勢力数の1/10より大きい、ないしそのTMP_CHARA_STARS数が総数の10で割ったあまりなら継続
NEXT

;-----------------------------
;キャラの星評価を表示
;TMP_CREATE_STARS_MAPとセット
;-----------------------------
@TMP_PRINT_CHARA_STARS(対象)
#DIM 対象
FOR LOCAL, 0, 10
	IF LOCAL < TMP_CHARA_STARS:対象
		CALL COLOR_PRINT("★", GET_CHARA_STARS_COLOR(対象))
	ELSE
		PRINT ☆
	ENDIF
NEXT
;-----------------------------
;キャラの星評価をシンプルに表示
;-----------------------------
@TMP_PRINT_CHARA_STARS_NUM(対象)
#DIM 対象
CALL COLOR_PRINT(@"★{TMP_CHARA_STARS:対象, 2, RIGHT}", GET_CHARA_STARS_COLOR(対象))

;-----------------------------
;キャラの星評価用の色を取得
;-----------------------------
@GET_CHARA_STARS_COLOR(対象)
#FUNCTION
#DIM 対象
SELECTCASE TMP_CHARA_STARS:対象
	CASE 1
		RETURNF カラー_灰色
	CASE 2
		RETURNF カラー_明灰色
	CASE 3
		RETURNF カラー_青
	CASE 4
		RETURNF カラー_シアン
	CASE 5
		RETURNF カラー_緑
	CASE 6
		RETURNF カラー_黄
	CASE 7
		RETURNF カラー_オレンジ
	CASE 8
		RETURNF カラー_赤
	CASE 9
		RETURNF カラー_ピンク
	CASE 10
		RETURNF カラー_パ紫
ENDSELECT
RETURNF 0x000000


code:
;SLG部分に使用する変数を定義(全般的に使用する変数は VARIABLE.ERH へ)

;-------------------------------------------------
;■定数
;-------------------------------------------------
;都市の最大数
#DIM CONST MAX_CITY = 170

;各勢力が持つ部隊の最大数
#DIM CONST MAX_UNIT = 10

;各部隊につける武将の最大数
;全部がきちんと定数化されてる保証はないからこれだけを変更しても武将の最大数を増やせたりしないよ 定数関係は全部同じだよ
#DIM CONST MAX_UNIT_COMMANDER = 3

;各都市につける武将の最大数
#DIM CONST MAX_CITY_COMMANDER = 2

;同盟条約の最大数
#DIM CONST MAX_TREATY_A = 70

;連合の最大数
#DIM CONST MAX_TREATY_U = 5

;停戦条約の最大数
#DIM CONST MAX_TREATY_C = 100

;条約に含まれる国家の最大数
#DIM CONST MAX_TREATY_COUNTRY = MAX_COUNTRY

;シナリオの最大数
#DIM CONST SCENARIO_NUMBER = 20

;-------------------------------------------------
;■システムに関する変数
;-------------------------------------------------
;情報表示の対象となっている都市
#DIM SHOWN_CITY

;開始からの外交・編成禁止期間
#DIM CONST SLG_PP = 3, 7, 10

;使用するマップ
#DIMS SAVEDATA MAPID = "DEFAULT"

;現在のシナリオID
#DIMS SAVEDATA SCENARIOID = ""

;マップ準備済み
#DIM MAPREADY = 0

;シナリオのIDと選択用数値
#DIMS SCENARIO_ID,     SCENARIO_NUMBER
#DIM  SCENARIO_SELECT, SCENARIO_NUMBER

;そのターンの投資回数
#DIM SAVEDATA NOW_INVEST

;-------------------------------------------------
;■都市に関する変数 ※0番の都市は未定義で固定
;-------------------------------------------------
;都市から直接繋がる他の都市・中継点を設定する変数
#DIM CITY_ROUTE, MAX_CITY, 10

;都市のタイプ 0=都市 1=中継点
#DIM CITY_TYPE, MAX_CITY

;都市の経済規模(内部数値・表示の100倍の値)
#DIM SAVEDATA CITY_ECONOMY, MAX_CITY

;都市の経済規模の上限値(内部数値・表示の100倍の値)
#DIM SAVEDATA CITY_ECONOMY_LIMIT, MAX_CITY

;都市の防衛兵力
#DIM SAVEDATA CITY_SOLDIER,      MAX_CITY
#DIM SAVEDATA CITY_SOLDIER_PREV, MAX_CITY

;都市の防御倍率(内部数値・表示の100倍の値)
#DIM SAVEDATA CITY_GUARD, MAX_CITY

;都市を所持する勢力
#DIM SAVEDATA CITY_OWNER, MAX_CITY

;都市の守将ID(16bitずつ2人まで)
#DIM SAVEDATA CITY_COMMANDER, MAX_CITY

;都市の建造物
#DIM SAVEDATA CITY_DEVELOPMENT, MAX_CITY
;都市のカラー設定(一時的なもの)
#DIM CITY_COLOR, MAX_CITY

;都市の疲労度。都市上での戦闘・攻撃で増える
#DIM SAVEDATA CITY_TIRED_COUNT, MAX_CITY

;都市がこのターン攻撃を受けたか
#DIM CITY_IS_ATTACKED, MAX_CITY

;都市上で直前までのターンの疲労度。
#DIM SAVEDATA PAST_CITY_TIRED_COUNT, MAX_CITY

;都市の名前
#DIMS CITY_NAME, MAX_CITY
#DIMS CITY_NAME_SHORT, MAX_CITY

;都市（非抜け道）の数
#DIM CITY_NUM

;そのターン都市に投資したフラグ
#DIM CITY_INVESTED, MAX_CITY

;建造物の建造物ID
#DIM CONST 建造物_兵舎 = 1
#DIM CONST 建造物_独占市場 = 2
#DIM CONST 建造物_弓櫓 = 3
#DIM CONST 建造物_武芸塾 = 4
#DIM CONST 建造物_戦略塾 = 5
#DIM CONST 建造物_知識塾 = 6
#DIM CONST 建造物_湯治場 = 7
#DIM CONST 建造物_研究所 = 8
#DIM CONST 建造物_本拠地 = 9
#DIM CONST 建造物_忍びの里 = 10
#DIM CONST 建造物_集積所 = 11
#DIM CONST 建造物_税務署 = 12
#DIM CONST 建造物_大宴会場 = 13
#DIM CONST 建造物_醸造所 = 14

;-------------------------------------------------
;■勢力に関する変数 ※0番の勢力は無所属で固定
;-------------------------------------------------
;頭首のキャラID(勢力の存在判定にも使用)
#DIM SAVEDATA COUNTRY_BOSS, MAX_COUNTRY

;勢力のカラー
#DIM SAVEDATA COUNTRY_COLOR, MAX_COUNTRY

;勢力の政策
#DIM SAVEDATA COUNTRY_POLICY, MAX_COUNTRY

;遊撃兵力
#DIM SAVEDATA COUNTRY_SOLDIER, MAX_COUNTRY

;連合の討伐対象にならない期間
#DIM SAVEDATA COUNTRY_NOTARGET_TERM, MAX_COUNTRY

;防衛部隊を作成したことを示すフラグ
#DIM IS_PROTECTED

;外交禁止フラグ。このフラグを立てると互いに一切の外交が不可能になる
;放浪状態での士官も不可。統一後のエンディングメッセージも表示されない
#DIM SAVEDATA COUNTRY_IS_CLOSED, MAX_COUNTRY

;イベント国家の識別フラグ
#DIM SAVEDATA COUNTRY_EVENT_ID, MAX_COUNTRY

;部隊兵力
#DIM SAVEDATA UNIT_SOLDIER,      MAX_COUNTRY, MAX_UNIT
#DIM SAVEDATA UNIT_SOLDIER_PREV, MAX_COUNTRY, MAX_UNIT

;部隊の所在都市番号
#DIM SAVEDATA UNIT_POSITION, MAX_COUNTRY, MAX_UNIT

;部隊の移動目標都市番号
#DIM SAVEDATA UNIT_TARGET, MAX_COUNTRY, MAX_UNIT

;部隊の将ID(16bitずつ3人まで)
#DIM SAVEDATA UNIT_COMMANDER, MAX_COUNTRY, MAX_UNIT

;部隊の連戦カウント
#DIM SAVEDATA UNIT_TIRED_COUNT, MAX_COUNTRY, MAX_UNIT

;部隊の都市占領フラグ
#DIM SAVEDATA UNIT_CAPTURE_CITY, MAX_COUNTRY, MAX_UNIT

;対象国家を選択するための一時的なフラグ
#DIM COUNTRY_IS_SELECTED, MAX_COUNTRY

;連合に参加する予定の勢力の記録用
#DIM COUNTRY_IS_UNION, MAX_COUNTRY

;各国家の同盟候補勢力の記録用
#DIM COUNTRY_PROSPECT_A, MAX_COUNTRY, MAX_COUNTRY

;各国家の停戦候補勢力の記録用
#DIM COUNTRY_PROSPECT_C, MAX_COUNTRY, MAX_COUNTRY

;同盟成否判定。成否の理由と必要な要求の重さも記録
;0=不成立、1=無条件、2=要求(軽)、3=要求(中)、4=要求(重)、5=無条件(友好)、6=不成立(非隣接)
#DIM COUNTRY_REQUEST_RATE_A, MAX_COUNTRY, MAX_COUNTRY

;停戦成否判定。成否の理由と必要な要求の重さも記録
;0=不成立、1=無条件、2=要求(軽)、3=要求(中)、4=要求(重)、5=無条件(友好)、6=不成立(非隣接)
#DIM COUNTRY_REQUEST_RATE_C, MAX_COUNTRY, MAX_COUNTRY

;主人公友好系コマンド実行フラグ
#DIM SAVEDATA DONE_DIPLOMACY_FRIENDSHIP, MAX_COUNTRY

;主人公要求系コマンド実行フラグ
#DIM SAVEDATA DONE_DIPLOMACY_REQUEST, MAX_COUNTRY

;主人公醜聞流すコマンド実行フラグ
#DIM SAVEDATA DONE_DIPLOMACY_SCANDAL, MAX_COUNTRY

;主人公内部工作コマンド実行フラグ
#DIM SAVEDATA DONE_DIPLOMACY_SABOTAGE, MAX_COUNTRY

#DIM DIPLOMACY_DIPLOMAT

;自動送金の額を記録する変数
#DIM SAVEDATA AUTO_INVEST_PRICE, MAX_COUNTRY

;部隊がその期に既に戦闘を行ったかどうかのフラグ
#DIM UNIT_FBATTLE, MAX_COUNTRY, MAX_UNIT

;蜂起・謀反で成立した勢力につくカウンター。
;要求が通りにくくなる処理に使用
#DIM INDEPENDENCE_COUNTER, MAX_COUNTRY

;-------------------------------------------------
;■条約に関する変数
;-------------------------------------------------
;同盟参加国
#DIM SAVEDATA TREATY_A_COUNTRY, MAX_TREATY_A, MAX_TREATY_COUNTRY

;同盟期限(9999で無期限同盟扱い)
#DIM SAVEDATA TREATY_A_TERM, MAX_TREATY_A

;連合参加国
#DIM SAVEDATA TREATY_U_COUNTRY, MAX_TREATY_U, MAX_TREATY_COUNTRY

;連合期限
#DIM SAVEDATA TREATY_U_TERM, MAX_TREATY_U

;連合の討伐対象
#DIM SAVEDATA TREATY_U_TARGET, MAX_TREATY_U

;停戦条約参加国
#DIM SAVEDATA TREATY_C_COUNTRY, MAX_TREATY_C, MAX_TREATY_COUNTRY

;停戦期限(9999で無期限扱い)
#DIM SAVEDATA TREATY_C_TERM, MAX_TREATY_C

;外交チャンネル封鎖期間
#DIM SAVEDATA COUNTRY_NOTDIPLOMACY_TERM, MAX_COUNTRY

;勢力ごとの条約締結数
#DIM SAVEDATA COUNTRY_TREATY_NO, MAX_COUNTRY, 2
;-------------------------------------------------
;■シナリオ専用の変数
;-------------------------------------------------
;当然ながら、２つ以上のシナリオが同時進行することはないので各シナリオで共通する変数を使う
;周回時にリセットされる
#DIM SAVEDATA SCVAR, 1000

;野盗出現停止期間
#DIM SAVEDATA BANDIT_POP_SUSPENDED

;-------------------------------------------------
;■戦闘計算に関する変数
;-------------------------------------------------
#DIM BATTLE_COMMANDER, 2, 3
#DIM BATTLE_COMMANDER_NUM, 2
#DIM BATTLE_身体, 2, 3
#DIM BATTLE_器用, 2, 3
#DIM BATTLE_知識, 2, 3
#DIM BATTLE_社交, 2, 3
#DIM BATTLE_歌唱, 2, 3
#DIM BATTLE_料理, 2, 3
#DIM BATTLE_魔術, 2, 3
#DIM BATTLE_素質, 2, 3
#DIM BATTLE_身体パワー, 2, 3
#DIM BATTLE_器用パワー, 2, 3
#DIM BATTLE_知識パワー, 2, 3
#DIM BATTLE_魔術パワー, 2, 3
#DIM BATTLE_歌唱パワー, 2, 3
#DIM BATTLE_料理パワー, 2, 3
#DIM BATTLE_SKILL_RATE, 2, 3
#DIM BATTLE_SKILL_SEALED, 2, 3
#DIM BATTLE_SUMMONED_CHARA, 2, 3
;上から順にダメージ値、兵数、攻撃、防御、知識、魔術、遊撃部隊かどうかのフラグ、勢力名称
#DIM BATTLE_DMG, 2
#DIM BATTLE_SOL, 2
#DIM BATTLE_ATK, 2
#DIM BATTLE_DEF, 2
#DIM BATTLE_INT, 2
#DIM BATTLE_MAG, 2
#DIM BATTLE_F_UNIT, 2
#DIMS BATTLE_NAME, 2

;上から順に与割合ダメージ(%)、与被害倍率(%)、被害軽減率(%)
#DIM BATTLE_RATE_DMG, 2
#DIM BATTLE_RATE_ATC, 2
#DIM BATTLE_RATE_GRD, 2

;被害軽減率(最後に適用、割合ダメージも軽減)
#DIM BATTLE_RATE_GRD_B, 2

;強制計略発動フラグ(発動側)
#DIM BATTLE_FORCE_SCHEME

;捕縛率
#DIM CAPTURE_RATE, MAX_UNIT_COMMANDER

;成長能力、成長量
#DIM GROW_ABL, MAX_UNIT_COMMANDER
#DIM GROW_AMOUNT, MAX_UNIT_COMMANDER

;-------------------------------------------------
;■AIに関する変数
;-------------------------------------------------
;部隊に配置する将の組み合わせ候補
#DIM UNIT_COMMANDER_LIST, MAX_UNIT, MAX_UNIT_COMMANDER

;作成可能な部隊のうち能力が最強となる将の組み合わせ
#DIM BEST_COMMANDER, MAX_UNIT_COMMANDER

;将を分散配置した場合に作成可能な部隊の数
#DIM UNIT_CREATE_MAX

;AIタイプ 0=通常 1=好戦 2=防衛 3=外交 4=内政
#DIM SAVEDATA COUNTRY_AI_TYPE, MAX_COUNTRY

#DIM CONST AI_通常 = 0
#DIM CONST AI_好戦 = 1
#DIM CONST AI_防衛 = 2
#DIM CONST AI_外交 = 3
#DIM CONST AI_内政 = 4
#DIM CONST AI_蛮行 = 5
#DIM CONST AI_ゴブリン = 6

;AI同士の相性、外交で利用
#DIM AI_RELATION, 7, 7

;AI毎の重要視する能力の重さ（比較時の倍率）及び社交が突出したキャラを引き止める割合（単独でこの値以上を占めているキャラは除外）
#DIM AI_PRIORITY, 10, 5
#DIM AI_POLITICAL_LIMIT, 10

;AIの侵攻判断と編成する兵数に関する配列
#DIM AI_ARMY_PROPERTY, 7, 4
;AIの社交判断に関する配列
#DIM AI_DIPLOMACY_PROPERTY, 7, 5

;AIの投資に関する配列
#DIM AI_INVEST_PROPERTY,7, 5

;AIの開発に関する配列
#DIM AI_DEVELOPMENT_PROPERTY,7, 3

;AIによる緊急動員
#DIM AI_DEPLOY, 7, 3

;AIの政策優先度
#DIM AI_POLICY_PRIORITY, 7, 3

;AIのテクノロジーの好き嫌い
#DIM AI_TECHNOLOGY_PREFERENCE, 7, TECHNOLOGY_MAX_GENRE

#DIM CONST AI_攻防バランス = 0
#DIM CONST AI_最低兵数 = 1
#DIM CONST AI_確定兵数 = 2
#DIM CONST AI_許容疲労度 = 3
#DIM CONST AI_外交_行動回数 = 0
#DIM CONST AI_外交_会談支払額 = 1
#DIM CONST AI_外交_停戦支払額 = 2
#DIM CONST AI_外交_同盟支払額 = 3
#DIM CONST AI_外交計画_会談 = 0
#DIM CONST AI_外交計画_停戦 = 1
#DIM CONST AI_外交計画_同盟 = 2
#DIM CONST AI_外交計画_悪評 = 3
#DIM CONST AI_外交計画_連合 = 4
#DIM CONST AI_外交計画_要求 = 5
#DIM CONST 政策_防衛 = 0
#DIM CONST 政策_経済 = 1
#DIM CONST 政策_徴兵 = 2

#DIM CONST AI_DIPLOMACY_MAX_PLAN = 5
#DIM SAVEDATA AI_DIPLOMACY_PLAN, MAX_COUNTRY, AI_DIPLOMACY_MAX_PLAN
#DIM SAVEDATA AI_DIPLOMACY_TARGET, MAX_COUNTRY, AI_DIPLOMACY_MAX_PLAN
#DIM SAVEDATA AI_DIPLOMACY_TERM, MAX_COUNTRY

#DIM CONST AI_PERSUASION_MAX_TAREGET = 3
#DIM SAVEDATA AI_PERSUASION_TARGET, MAX_COUNTRY, AI_PERSUASION_MAX_TAREGET
#DIM SAVEDATA AI_PERSUASION_TERM, MAX_COUNTRY

#DIM CONST AI_TRAIN_MAX_TARGET = 3

#DIM SAVEDATA AI_TRAIN_TARGET, MAX_COUNTRY, AI_TRAIN_MAX_TARGET
#DIM SAVEDATA AI_TRAIN_TERM, MAX_COUNTRY

;-------------------------------------------------
;■会談に関する変数
;-------------------------------------------------
;会話内容の選択リスト
#DIM TALK_LIST, 100
;次に記録する配列番号
#DIM TALK_ADDRESS

;相手君主のアクションを示す文
#DIMS TALK_ACTION

;選択肢の文
#DIMS TALK_SELECT, 3

;各選択肢の好感度上昇量
#DIM TALK_UP_LIKE, 3

;各選択肢の敵対値上昇量
#DIM TALK_UP_HATE, 3

;交渉における反感値、強要行為などによって加算（勢力ごとに設定し、ペナルティの前回適用値も記録予定）
#DIM SAVEDATA DIPLOMACY_HATE, MAX_COUNTRY

;上のは製作中なので現状こっちを仕様（ぉ
#DIM SAVEDATA DIPLOMACY_REQUEST_SUCCESS_COUNT

;逆調教要求の残り期間 正数にてMASTER調教、負数にて君主調教を表す
#DIM SAVEDATA DIPLOMACY_TRAINED_DAY
;逆調教する相手君主のキャラ番号
#DIM SAVEDATA DIPLOMACY_TRAINING_CHARA

;-------------------------------------------------
;■高速化用のマッピング変数
;-------------------------------------------------
;国家間の関係を展開して記録する変数
#DIM TMP_COUNTRY_RELATION, MAX_COUNTRY, MAX_COUNTRY

;国家関係において最も優先度の高い関係の継続期間を記録する変数
#DIM TMP_COUNTRY_RELATION_TERM, MAX_COUNTRY, MAX_COUNTRY

;国家同士が隣接しているかどうかを記録するフラグ
#DIM TMP_COUNTRY_IS_NEIBORING, MAX_COUNTRY, MAX_COUNTRY

;各君主のキャラ番号を記録する変数
#DIM TMP_COUNTRY_BOSS_NUMBER, MAX_COUNTRY

;各君主の名前の最初の２文字を記録する変数
#DIMS TMP_COUNTRY_BOSS_NAME_SHORT, MAX_COUNTRY

;各国家の連合による討伐対象を記録する変数
#DIM TMP_COUNTRY_UNION_TARGET, MAX_COUNTRY

;各都市上にいる部隊の勢力を記録する変数
#DIM TMP_UNIT_ONCITY_CNT, MAX_CITY, 20

;各都市上にいる部隊の番号を記録する変数
#DIM TMP_UNIT_ONCITY_NUM, MAX_CITY, 20

;士官が部隊に所属しているかどうかを記録する変数(0=フリー、1=遊撃、2=防衛、-1=その他特殊状態)
#DIM CHARADATA TMP_IS_FREE, 1
#DIM TMP_SUM_POLITICS_POWER, MAX_COUNTRY
#DIM TMP_SUM_COOKING_POWER, MAX_COUNTRY

;勢力評価の星の数
#DIM TMP_COUNTRY_STARS, MAX_COUNTRY

#DIM TMP_CHARA_STARS, 2000

;その都市が自国都市と接続されているか？
;AIによる侵攻判断で使用
#DIM TMP_CONNECTED_TO_US, MAX_COUNTRY, MAX_CITY
#DIM TMP_CONNECTED_TO_US_ONLY, MAX_COUNTRY, MAX_CITY
#DIM TMP_CONNECTED_TO_ENEMY, MAX_COUNTRY, MAX_CITY

;その勢力の勢力がいくつに分かれているかを判断する
#DIM TMP_ENCLAVE_NUM, MAX_COUNTRY
;その都市を含む飛び地のサイズ
#DIM TMP_ENCLAVE_SIZE, MAX_COUNTRY, MAX_CITY
;その勢力における最大の飛び地サイズ
;MAXARRAYいちいち打つよりは早かろ
#DIM TMP_MAX_ENCLAVE_SIZE, MAX_COUNTRY

#DIM TMP_OFFENSIVE_IMPORTANCE, MAX_COUNTRY, MAX_CITY
#DIM TMP_DEFFENSIVE_IMPORTANCE, MAX_COUNTRY, MAX_CITY

#DIM TMP_CITY_RISK, MAX_COUNTRY, MAX_CITY
#DIM TMP_IS_INVADABLE, MAX_COUNTRY, MAX_CITY
#DIM TMP_IS_BYPASS, MAX_COUNTRY, MAX_CITY

;その勢力の所持都市数
#DIM TMP_OWN_CITY, MAX_COUNTRY
;その勢力の現在の経済合計と、経済限界の合計
#DIM TMP_SUM_ECONOMY, MAX_COUNTRY
#DIM TMP_SUM_ECONOMY_LIMIT, MAX_COUNTRY
;その勢力の兵力合計
#DIM TMP_SUM_SOLDIER, MAX_COUNTRY
;-------------------------------------------------
;■個人に関する変数
;-------------------------------------------------
;クールタイムを記録する変数
#DIM SAVEDATA CHARADATA COOLTIME

#DIM SAVEDATA CHARADATA ASSIGNED_THIS_TURN

;主人公用　以前所属していた勢力（野に下ると発生）
#DIM SAVEDATA COUNTRY_PLAYER_BELONGED, 5
;主人公用　以前所属していた勢力を削除するカウンタ
#DIM SAVEDATA COUNTRY_PLAYER_BELONGED_COUNTER

;主人公用　雇用されてからのカウンタ 0になるまでは野に下れない
#DIM SAVEDATA PLAYER_HIRED_COUNTER

;そのターン、特別訓練実施済み
#DIM SAVEDATA DONE_SPECIAL_TRAIN

;そのターン、領地探索実施済み
#DIM SAVEDATA DONE_TERRITORYSEARCH

;-------------------------------------------------
;■奴隷市場に関する変数
;-------------------------------------------------
;奴隷市場用、最大商品数
#DIM CONST SLAVEMARKET_MAX_GOODS = 10
;奴隷市場用、そのターンの商品(IDで格納)
#DIM SAVEDATA SLAVEMARKET_GOODS, SLAVEMARKET_MAX_GOODS
#DIM SAVEDATA SLAVEMARKET_PRICE, SLAVEMARKET_MAX_GOODS
;奴隷市場用、そのターンの「特売品」
#DIM SAVEDATA SLAVEMARKET_SPECIALGOODS

;-------------------------------------------------
;■スカウトに関する変数
;-------------------------------------------------
;スカウト用、最大候補数
#DIM CONST SCOUT_MAX_CANDIDATES = 15
;スカウト用、そのターンのスカウト対象(IDで格納)
#DIM SAVEDATA SCOUT_CANDIDATES, SCOUT_MAX_CANDIDATES
;スカウト用、その対象の提示額
#DIM SAVEDATA SCOUT_PRICE, SCOUT_MAX_CANDIDATES
;スカウト用、その周回で何回目の訓練か
#DIM SAVEDATA SCOUT_COUNT

;-------------------------------------------------
;■特別訓練に関する変数
;-------------------------------------------------
;特別訓練用 そのターンの特別訓練額
#DIM SAVEDATA SPECIAL_TRAIN_PRICE
;特別訓練用 その周回で何回目の訓練か
#DIM SAVEDATA SPECIAL_TRAIN_COUNT
;特別訓練用 そのターンで何回目の訓練か
#DIM SAVEDATA SPECIAL_TRAIN_COUNT_THIS_TURN

;-------------------------------------------------
;■リグル式戦術AI用変数
;-------------------------------------------------
#DIM TEMP_ANT, MAX_CITY
#DIM ANT, MAX_COUNTRY, MAX_CITY

#DIM TEMP_PHEROMONE, MAX_CITY
#DIM SAVEDATA PHEROMONE, MAX_COUNTRY, MAX_CITY

;-------------------------------------------------
;■SHOP_SLG
;-------------------------------------------------
;SHOP_LIFE_VARIABLE.ERHと同じSHOP画面の表示用
#DIM FIRST_COLUMN_RIGHT_LINE_SLG
#DIMS COLUMN_LEFT_CATEGORY_NAME_SLG, 10
#DIM COLUMN_LEFT_CATEGORY_NUM_SLG, 40
#DIM COLUMN_LEFT_MENU_NUM_SLG, 40
#DIM CONST SHOP_SLG_LIST1_PAGE_BACK = 98
#DIM CONST SHOP_SLG_LIST1_PAGE_NEXT = 99
#DIM CONST SHOP_SLG_LIST1_PAGE_RESET = 96
#DIM CONST SHOP_SLG_LIST1_PAGE_MAX = 97
#DIM SHOP_SLG_LIST1_MAXPAGE


code:
;統計情報に関する処理

;-------------------------------------------------
;統計情報を生で出力する。デバッグ用。
;-------------------------------------------------
@STATS_OUTPUT_RAW
CALL SINGLE_DRAWLINE
;読み書き位置
PRINTFORML STATS_TIME = {STATS_TIME}
PRINTFORML STATS_STOPPED = {STATS_STOPPED}

;君主ID配列
FOR LOCAL:0, 0, STATS_COUNTRIES
	PRINTFORM {STATS_BOSS_ID_LIST:(LOCAL:0)},
NEXT
PRINTL
;経済力データ
FOR LOCAL:0, 0, STATS_DURATION
	FOR LOCAL:1, 0, STATS_COUNTRIES
		PRINTFORM {STATS_GDP:(LOCAL:1):(LOCAL:0)},
	NEXT
	PRINTL
NEXT
CALL SINGLE_DRAWLINE

;-------------------------------------------------
;統計情報を整形して出力する。
;グラフ化の方法が思いつかなかったので、せめてエクセルに貼れる形式で。
;呼び出しは CALL STATS_OUTPUT(STATS_GDP) というように、表示するデータを引数にとる。
;-------------------------------------------------
@STATS_OUTPUT(DATA_ARR)
#DIM REF DATA_ARR,0,0
#DIM COUNTRY_COUNT

IF STATS_STOPPED
	PRINTL 統計関係の処理が停止されています。
	RETURN
ENDIF

CALL SINGLE_DRAWLINE

;出力する勢力数をカウントする
COUNTRY_COUNT = 0
FOR LOCAL:0, 1, STATS_COUNTRIES
	IF STATS_BOSS_ID_LIST:(LOCAL:0) <= 0
		BREAK
	ENDIF
	COUNTRY_COUNT++
NEXT

;勢力名を出力(1列目は期数なので飛ばす)
PRINT  ,
FOR LOCAL:0, 1, 1 + COUNTRY_COUNT
	;ID_TO_CHARAの影響がよく分かってないまま書いてるので
	;もしかしたらココでNAME:(-1)になるかもしれない
	PRINTFORM %ANAME(ID_TO_CHARA( STATS_BOSS_ID_LIST:(LOCAL:0) ) )%,
NEXT
PRINTL

;データを記録期間1周ぶん出力
FOR LOCAL:1, 0, STATS_DURATION
	;ゼロ期以前なら出力しない
	IF DATA_ARR:0:(STATS_TIME) < 1
		CALL STATS_TIME_PLUS
		CONTINUE
	ENDIF
	FOR LOCAL:0, 0, COUNTRY_COUNT + 1
		PRINTFORM {DATA_ARR:(LOCAL:0):(STATS_TIME)},
	NEXT
	PRINTL
	CALL STATS_TIME_PLUS
NEXT

;-------------------------------------------------
;統計情報の記憶
;毎期終了時に呼び出す。
;-------------------------------------------------
@STATS_SAVE
#DIM POS

IF STATS_STOPPED
	RETURN
ENDIF

;書き込み先の1行の準備処理
CALL STATS_SAVE_PREPROCESS(STATS_GDP)
CALL STATS_SAVE_PREPROCESS(STATS_ARMY)
CALL STATS_SAVE_PREPROCESS(STATS_WEALTH)

;どの列に書き込むか探す
FOR LOCAL:0, 1, MAX_COUNTRY
	;勢力がなければCONTINUE
	SIF !IS_COUNTRY(LOCAL:0)
		CONTINUE
	;君主ID配列に検索をかける
	POS = FINDELEMENT(STATS_BOSS_ID_LIST, COUNTRY_BOSS:(LOCAL:0), 1, VARSIZE("STATS_BOSS_ID_LIST"))

	;見つからなかったら君主ID配列への新規登録を試みる
	IF POS < 0
		POS = STATS_ENLIST_BOSS_ID(COUNTRY_BOSS:(LOCAL:0))
		;それでも書き込み先が得られないならCONTINUE
		IF POS < 0
			CONTINUE
		ENDIF
;		DEBUGPRINTFORML 【統計追加】 %NAME:ID_TO_CHARA(COUNTRY_BOSS:(LOCAL:0))%
	ENDIF
	;統計データの書き込み
	STATS_GDP:(POS):(STATS_TIME) = GET_SUM_ECONOMY(LOCAL:0)
	STATS_ARMY:(POS):(STATS_TIME) = GET_SUM_SOLDIER(LOCAL:0)
	STATS_WEALTH:(POS):(STATS_TIME) = MONEY:(LOCAL:0)
NEXT
;書き込み先の行を1つ進める
CALL STATS_TIME_PLUS

;-------------------------------------------------
;統計情報を書き込む前処理
;-------------------------------------------------
@STATS_SAVE_PREPROCESS(ARR)
#DIM REF ARR,0,0
;行頭に期数を記録
ARR:0:(STATS_TIME) = DAY+1
;行の残りをゼロで埋める
FOR LOCAL:0, 1, STATS_COUNTRIES
	ARR:(LOCAL:0):(STATS_TIME) = 0
NEXT

;-------------------------------------------------
;[各勢力の君主のIDの配列]の空きを探して(ARG:0)を登録する
;0番要素は期数の記録に使うので触らない。
;成功したらその位置を、失敗したら-1を返す
;-------------------------------------------------
@STATS_ENLIST_BOSS_ID(ARG:0)
#FUNCTION
FOR LOCAL:0, 1, STATS_COUNTRIES
	IF STATS_BOSS_ID_LIST:(LOCAL:0) <= 0
		STATS_BOSS_ID_LIST:(LOCAL:0) = ARG:0
		RETURNF LOCAL:0
	ENDIF
NEXT
RETURNF -1

;-------------------------------------------------
;読み書き先の移動
;-------------------------------------------------
@STATS_TIME_PLUS(ARG:0 = 1)
STATS_TIME += ARG:0
;範囲の上に出た
IF STATS_TIME >= STATS_DURATION
	STATS_TIME %= STATS_DURATION
ENDIF
;範囲の下に出た
WHILE STATS_TIME < 0
	STATS_TIME += STATS_DURATION
WEND

;------------------------------------------------
;条約関係の出力
;------------------------------------------------
@TREATY_OUTPUT(ARG:0)

SELECTCASE ARG:0
CASE 0
	PRINTL 【期間】　【対象】
	FOR LOCAL:0, 0, MAX_TREATY_C
		SIF !TREATY_C_TERM:(LOCAL:0)
			CONTINUE
		PRINTFORM {TREATY_C_TERM:(LOCAL:0), 8, RIGHT}
		FOR LOCAL:1, 0, MAX_TREATY_COUNTRY
			SIF TREATY_C_COUNTRY:(LOCAL:0):(LOCAL:1) >= 1
			PRINTFORM %ANAME(ID_TO_CHARA(COUNTRY_BOSS:(TREATY_C_COUNTRY:(LOCAL:0):(LOCAL:1))))%
		NEXT
		PRINTL
	NEXT
CASE 1
	PRINTL 【期間】　【対象】
	FOR LOCAL:0, 0, MAX_TREATY_A
		SIF !TREATY_A_TERM:(LOCAL:0)
			CONTINUE
		PRINTFORM {TREATY_A_TERM:(LOCAL:0), 8, RIGHT}
		FOR LOCAL:1, 0, MAX_TREATY_COUNTRY
			SIF TREATY_A_COUNTRY:(LOCAL:0):(LOCAL:1) >= 1
			PRINTFORM %ANAME(ID_TO_CHARA(COUNTRY_BOSS:(TREATY_A_COUNTRY:(LOCAL:0):(LOCAL:1))))%
		NEXT
		PRINTL
	NEXT

ENDSELECT


code:
;統計情報のコンフィグに関する処理

;-------------------------------------------------
;統計の設定と出力
;-------------------------------------------------
@STATS_CONFIG
CALL SINGLE_DRAWLINE
PRINTL ●統計の設定と出力●
CALL SINGLE_DRAWLINE
PRINTFORM [ 0] %"統計関係の処理", 40, LEFT%
PRINTFORML %STATS_STOPPED ? "停止" # "行う"%
CALL SINGLE_DRAWLINE
PRINTFORML [11] 経済力 の記録を出力する
PRINTFORML [12] 国庫 の記録を出力する
PRINTFORML [13] 兵数 の記録を出力する
PRINTFORML [21] 同盟 の記録を出力する
PRINTFORML [22] 停戦 の記録を出力する
CALL SINGLE_DRAWLINE
PRINTL [99] 決定

$INPUT_LOOP
INPUT

IF RESULT == 99
	RETURN
ELSEIF RESULT == 0
	STATS_STOPPED = !STATS_STOPPED
ELSEIF RESULT == 11
	PRINTFORML 統計情報(経済力)を出力します。
	CALL STATS_OUTPUT(STATS_GDP)
	WAIT
ELSEIF RESULT == 12
	PRINTFORML 統計情報(国庫)を出力します。
	CALL STATS_OUTPUT(STATS_WEALTH)
	WAIT
ELSEIF RESULT == 13
	PRINTFORML 統計情報(兵数)を出力します。
	CALL STATS_OUTPUT(STATS_ARMY)
	WAIT
ELSEIF RESULT == 21
	PRINTFORML 現在の同盟状況を出力します。
	CALL TREATY_OUTPUT(1)
	WAIT
ELSEIF RESULT == 22
	PRINTFORML 現在の停戦状況を出力します。
	CALL TREATY_OUTPUT(0)
	WAIT
ELSE
	GOTO INPUT_LOOP
ENDIF
RESTART


code:
;統計データに関する変数を定義

;-------------------------------------------------
;■統計情報の操作に使う変数
;-------------------------------------------------
;書き込み位置
;書込毎に末尾に進めて、末尾(下の記憶期数で決める)に達したら先頭に戻す。
#DIM SAVEDATA STATS_TIME = 0

;記憶する勢力数(-1)と記憶期数
#DIM STATS_COUNTRIES = 51
#DIM STATS_DURATION = 500
;先頭列は期数を記憶するのに使うので(-1)がつく
;下の各項目もこれに合わせて変える必要がある

;統計関係の処理を停止するかどうか
#DIM SAVEDATA STATS_STOPPED = 0

;-------------------------------------------------
;■統計情報の記憶に使う変数
;-------------------------------------------------
;各勢力の君主のIDを記憶する配列と、その要素数
;[STATS_COUNTRIES]に揃える
#DIM SAVEDATA STATS_BOSS_ID_LIST, 51

;以下は種類別にデータを記憶するための２次元配列
;[STATS_COUNTRIES][STATS_DURATION]に揃える

;経済力
#DIM SAVEDATA STATS_GDP, 51, 500

;国庫
#DIM SAVEDATA STATS_WEALTH, 51, 500

;兵数
#DIM SAVEDATA STATS_ARMY, 51, 500


code:
#DIM CONST TECHNOLOGY_MAX_GENRE = 6
#DIM CONST TECHNOLOGY_MAX_STAGE = 8

#DIMS TECHNOLOGY_NAME, TECHNOLOGY_MAX_GENRE, TECHNOLOGY_MAX_STAGE
#DIMS TECHNOLOGY_DESC, TECHNOLOGY_MAX_GENRE, TECHNOLOGY_MAX_STAGE

;技術研究の進行度合い
#DIM SAVEDATA TECHNOLOGY_STATUS, MAX_COUNTRY, TECHNOLOGY_MAX_GENRE

;技術研究の進捗
#DIM SAVEDATA TECHNOLOGY_RESEARCH_TARGET, MAX_COUNTRY
#DIM SAVEDATA TECHNOLOGY_RESEARCH_PROGRESS, MAX_COUNTRY

;研究関連の定数
#DIM CONST TECHNOLOGY_BATTLE_SKILL   = 0
#DIM CONST TECHNOLOGY_BATTLE_PASSIVE = 1
#DIM CONST TECHNOLOGY_DIPLOMACY      = 2
#DIM CONST TECHNOLOGY_CONSCRIPTION   = 3
#DIM CONST TECHNOLOGY_TAX            = 4
#DIM CONST TECHNOLOGY_EMPLOYMENT     = 5

;技術研究の進捗状況
#DIM SAVEDATA CHARADATA TECHNOLOGY_STATUS_CHARA, TECHNOLOGY_MAX_GENRE


code:
;各種定義値(ABL, EXP, SOURCE)の並び設定を行う

;-------------------------------------------------
;ABLの並び設定
;並び替えたABLの中から、ARG:0番目に対応するABLの実際の番号を返す
;-------------------------------------------------
@GET_SORTED_ABL(ARG:0)
#FUNCTION
SELECTCASE ARG:0
	CASE 0
		RETURNF 12
	CASE 1
		RETURNF 13
	CASE 2
		RETURNF 14
	CASE 3
		RETURNF 0
	CASE 4
		RETURNF 1
	CASE 5
		RETURNF 2
	CASE 6
		RETURNF 3
	CASE 7
		RETURNF 4
	CASE 8
		RETURNF 20
	CASE 9
		RETURNF 21
	CASE 10
		RETURNF 22
	CASE 11
		RETURNF 23
	CASE 12
		RETURNF 24
	CASE 13
		RETURNF 33
	CASE 14
		RETURNF 34
	CASE 15
		RETURNF 25
	CASE 16
		RETURNF 26
	CASE 17
		RETURNF 27
	CASE 18
		RETURNF 28
	CASE 19
		RETURNF 29
	CASE 20
		RETURNF 30
ENDSELECT
RETURNF -1

;-------------------------------------------------
;ABLの並び設定
;並び替えたABLの中から、ARG:0番目に対応するExの実際の番号を返す
;-------------------------------------------------
@GET_SORTED_ABL_H(ARG:0)
#FUNCTION
SELECTCASE ARG:0
	CASE 0
		RETURNF 0
	CASE 1
		RETURNF 1
	CASE 2
		RETURNF 2
	CASE 3
		RETURNF 3
	CASE 4
		RETURNF 4
	CASE 5
		RETURNF 8
	CASE 6
		RETURNF 5
	CASE 7
		RETURNF 6
	CASE 8
		RETURNF 7
	CASE 9 TO 1000
		RETURNF (ARG:0)
ENDSELECT
RETURNF -1

;-------------------------------------------------
;EXPの並び設定
;並び替えたEXPの中から、ARG:0番目に対応するEXPの実際の番号を返す
;-------------------------------------------------
@GET_SORTED_EXP(ARG:0)
#FUNCTION
SELECTCASE ARG:0
	CASE 0
		RETURNF 40
	CASE 1
		RETURNF 41
	CASE 2
		RETURNF 42
	CASE 3
		RETURNF 43
	CASE 4
		RETURNF 44
	CASE 5
		RETURNF 45
	CASE 6
		RETURNF 46
	CASE 7
		RETURNF 47
	CASE 8
		RETURNF 48
	CASE 9
		RETURNF 50
	CASE 10
		RETURNF 51
	CASE 11
		RETURNF 52
	CASE 12
		RETURNF 90
	CASE 13
		RETURNF 91
	CASE 14
		RETURNF 92
	CASE 15
		RETURNF 93
	CASE 16
		RETURNF 94
	CASE 17
		RETURNF 97
	CASE 18
		RETURNF 55
	CASE 19
		RETURNF 56
	CASE 20
		RETURNF GETNUM(EXP, "孕ませ経験")
	CASE 21
		RETURNF GETNUM(EXP, "妊娠経験")
	CASE 22
		RETURNF 57
	CASE 23
		RETURNF 58
	CASE 24
		RETURNF 59
	CASE 25
		RETURNF 61
	CASE 26
		RETURNF 62
	CASE 27
		RETURNF 63
	CASE 28
		RETURNF 64
	CASE 29
		RETURNF 65
	CASE 30
		RETURNF 66
	CASE 31
		RETURNF GETNUM(EXP, "催眠絶頂経験")
	CASE 32
		RETURNF GETNUM(EXP, "浮気経験")
ENDSELECT
RETURNF -1

;-------------------------------------------------
;SOURCEの並び設定
;並び替えたSOURCEの中から、ARG:0番目に対応するSOURCEの実際の番号を返す
;-------------------------------------------------
@GET_SORTED_SOURCE(ARG:0)
#FUNCTION
SELECTCASE ARG:0
	CASE 0
		RETURNF 0
	CASE 1
		RETURNF 1
	CASE 2
		RETURNF 2
	CASE 3
		RETURNF 3
	CASE 4
		RETURNF 4
	CASE 5
		RETURNF 9
	CASE 6
		RETURNF 8
	CASE 7
		RETURNF 10
	CASE 8
		RETURNF 11
	CASE 9
		RETURNF 12
	CASE 10
		RETURNF 13
	CASE 11
		RETURNF 14
	CASE 12
		RETURNF 15
	CASE 13
		RETURNF 16
	CASE 14
		RETURNF 17
	CASE 15
		RETURNF 18
	CASE 16
		RETURNF 19
	CASE 17
		RETURNF 20
	CASE 18
		RETURNF 21
	CASE 19
		RETURNF 22
	CASE 20
		RETURNF 23
	CASE 21
		RETURNF 24
	CASE 22
		RETURNF 25
	CASE 23
		RETURNF 26
	CASE 24
		RETURNF 27
	CASE 25
		RETURNF 28
	CASE 26
		RETURNF 29
	CASE 27
		RETURNF 31
	CASE 28
		RETURNF 32
	CASE 29
		RETURNF 33
	CASE 30
		RETURNF 30
	CASE 31
		RETURNF 40
	CASE 32
		RETURNF 41
	CASE 33
		RETURNF 50
	CASE 34
		RETURNF 51
ENDSELECT
RETURNF -1

;Fisher-Yatesアルゴリズムによるシャッフル配列の作成
;専用配列SHAFFLE_ARRAYを使用
;引数 0:配列の長さ（0～ARG:0-1までのシャッフル）
@FISHER_YATES_SHAFFLE(ARG:0)

SIF !INRANGE(ARG:0, 1, 5000)
	THROW 引数が異常です。1～5000の範囲で指定してください。

;SHAFFLE_ARRAYの初期化
VARSET SHAFFLE_ARRAY , 0
FOR LOCAL:0 , 0, ARG:0
	SHAFFLE_ARRAY:(LOCAL:0) = LOCAL:0
NEXT
;シャッフル処理
;先頭から順番に「自身以降のいずれかと入れ替えて固定する」を行う
FOR LOCAL:0 , 0 , ARG:0 - 1
	LOCAL:1 = RAND(LOCAL:0 , ARG:0)
	SWAP SHAFFLE_ARRAY:(LOCAL:0), SHAFFLE_ARRAY:(LOCAL:1)
NEXT

;終端フラグセット
SHAFFLE_ARRAY:(ARG:0) = -1
RETURN 0

;@FISHER_YATES_SHAFFLEの短縮ラッパ
@ARRAY_SHAFFLE(ARG:0)
CALL FISHER_YATES_SHAFFLE(ARG:0)
RETURN RESULT


code:
;-------------------------------------------------
;■特殊勢力に関する変数と定数
;-------------------------------------------------
;特殊勢力数の最大数
#DIM CONST MAX_SP_COUNTRY = 8

;調教で堕ちるまでの期間
#DIM CONST TRAIN_FALLEN_TERM = 2, 4, 5, 7

;汎用的な定数割り当て
;陥落素質（ビット管理）もこれで管理するため、0番をダミーにしておかないとちょっとマズい
#DIM CONST 特殊勢力_ダミー = 0
#DIM CONST 特殊勢力_野盗 = 1
#DIM CONST 特殊勢力_ゴブリン = 2
#DIM CONST 特殊勢力_外来人 = 3
#DIM CONST 特殊勢力_触手 = 4
#DIM CONST 特殊勢力_自警団 = 5
#DIM CONST 特殊勢力_サキュバス = 6
#DIM CONST 特殊勢力_狂信者 = 7
#DIM CONST SP_COUNTRY_ID = -1, 300, 301, 302, 303, 304, 305, 306

#DIM CONST SKILL_SP_COUNTRY_NO = 10000, 10001, 10002, 10003, 10004, 10005, 10006, 10007

;特殊勢力が蜂起するまでのクールタイム
#DIM SAVEDATA SP_COUNTRY_RISE_COOLTIME

;強さ 0~5 0なら出現無し
#DIM SAVEDATA SP_COUNTRY_RANK, MAX_SP_COUNTRY

;特殊勢力の性別
#DIM SAVEDATA SP_COUNTRY_GENDER, MAX_SP_COUNTRY

;名前をどれにしたか 0勢力名 1固有名 2ランダム, 3手入力
#DIM SAVEDATA SP_COUNTRY_BOSSNAME, MAX_SP_COUNTRY

;手入力時の名前
#DIMS SAVEDATA SP_COUNTRY_BOSSNAME_LAST_NAME, MAX_SP_COUNTRY
#DIMS SAVEDATA SP_COUNTRY_BOSSNAME_FIRST_NAME, MAX_SP_COUNTRY

;出現したか 0未出現 1出現済み 2滅んだ
#DIM SAVEDATA SP_COUNTRY_APPEARED, MAX_SP_COUNTRY

;特殊勢力スタートでどれを選んだか
#DIM SAVEDATA SP_COUNTRY_START, MAX_SP_COUNTRY
#DIM SP_COUNTRY_START_CHANGE_BOSS
;陥落
#DIM SAVEDATA CHARADATA SP_TRAIN_COUNT, MAX_SP_COUNTRY

;特殊勢力が初期から蜂起するか
#DIM SAVEDATA SP_COUNTRY_INITIAL_RISE, MAX_SP_COUNTRY

;野盗の最初の蜂起で都市を奪うか
#DIM SAVEDATA BANDIT_HAS_INITIAL_CITIES

#DIM CONST 特殊勢力スタート_士官 = 1
#DIM CONST 特殊勢力スタート_奴隷 = 2
#DIM CONST 特殊勢力スタート_捕虜 = 3
#DIM CONST 特殊勢力スタート_君主 = 4

#DIMS CONST SP_COUNTRY_NAME = "", "野盗", "ゴブリン", "外来人", "触手", "自警団", "サキュバス", "狂信者"
#DIMS CONST SP_COUNTRY_NAME_ENG = "", "BANDIT", "GOBLIN", "GAIRAI", "TENTACLE", "VIGILANTE", "SUCCUBUS", "CULTIST"
#DIMS CONST SP_FALLEN_TALENT_NAME = "", "野盗の性奴隷", "ゴブリンの孕み袋", "実験動物", "触手による寄生", "自警団員", "淫魔", "狂信者"


code:
;---------------------------
;対象キャラが対象勢力による調教でFORCE_FUCKされたときに、CFLAGが減少するか
;---------------------------
@SP_TRAIN_IS_DECREASE_CFLAG(対象, 勢力番号)
#FUNCTION
#DIM 対象
#DIM 勢力番号
SIF !IS_SP_COUNTRY(勢力番号)
	RETURNF 0
LOCAL = SP_COUNTRY_TO_CONST(勢力番号)

SIF 対象 == MASTER || FLAG:観戦モード
	RETURNF 0
;士官か奴隷としてスタートし、対象が堕ちている
SIF GROUPMATCH(SP_COUNTRY_START:LOCAL, 特殊勢力スタート_士官, 特殊勢力スタート_奴隷) && GETBIT(TALENT:対象:特殊勢力陥落系, LOCAL)
	RETURNF 0
;MASTERが対象勢力に所属している、または捕虜で対象が堕ちている
SIF CFLAG:MASTER:所属 == 勢力番号 || (CFLAG:MASTER:捕虜先 == 勢力番号 && GETBIT(TALENT:対象:特殊勢力陥落系, LOCAL))
	RETURNF 0

RETURNF 1

;-------------------------------------------------
;渡されたIDのキャラの特殊勢力素質に対応する特殊精液を返す
;-------------------------------------------------
@SP_CHARA_TO_SPERM_ID(ID)
#FUNCTION
#DIM ID
;SP_COUNTRY_NAMEの各インデックスと、各特殊勢力素質の値が、同じ特殊勢力を示していることを利用する
RETURNF GET_SPERM_ID(SP_COUNTRY_NAME:(TALENT:ID_TO_CHARA(ID):特殊勢力素質))

;-------------------------------------------------
;渡された勢力番号が特殊勢力であるかを判断する
;-------------------------------------------------
@IS_SP_COUNTRY(勢力)
#FUNCTION
#DIM 勢力
SIF 勢力 < 0 || 勢力 >= MAX_COUNTRY
	RETURNF 0
RETURNF (FINDELEMENT(SP_COUNTRY_ID, COUNTRY_EVENT_ID:勢力) != -1 ? 1 # 0)

;-------------------------------------------------
;対象が渡された勢力に調教されうるかを判断する
;-------------------------------------------------
@IS_TRAIN_BY_SP_COUNTRY(対象, 勢力番号)
#FUNCTION
#DIM 対象
#DIM 勢力番号
;その勢力所属でも、その勢力の捕虜でもないキャラは駄目（あたりまえ）
SIF CFLAG:対象:所属 != 勢力番号 && CFLAG:対象:捕虜先 != 勢力番号
	RETURNF 0
;その勢力に所属はしているが、その勢力以外に捕虜にされているなら駄目
SIF CFLAG:対象:所属 == 勢力番号 && !GROUPMATCH(CFLAG:対象:捕虜先, 勢力番号, 0)
	RETURNF 0
;特殊勢力のキャラは駄目
SIF TALENT:対象:特殊勢力素質
	RETURNF 0
SIF IS_ANIMAL(対象)
	RETURNF 0
SIF CFLAG:対象:行動不能状態 == 行動不能_子供
	RETURNF 0
;MASTERは士官スタートなら抜ける
SIF 対象 == MASTER && GROUPMATCH(SP_COUNTRY_START:SP_COUNTRY_TO_CONST(勢力番号), 特殊勢力スタート_士官, 特殊勢力スタート_君主)
	RETURNF 0
;軟禁中はスキップ
SIF CFLAG:対象:捕虜先 == 勢力番号 && CFLAG:対象:軟禁中
	RETURNF 0
;自勢力以外をはじく設定
SIF CONFIG:81 == 1 && CFLAG:MASTER:所属 != 勢力番号
	RETURNF 0
;自勢力をはじく設定
SIF CONFIG:81 == 2 && CFLAG:MASTER:所属 == 勢力番号
	RETURNF 0
;テキスト非表示な設定ならスキップ
SIF	!SP_COUNTRY_IS_TRAINED(対象)
	RETURNF 0
;その勢力に所属するMASTER以外の堕ちていないキャラはスキップ
;綺麗なまま捕らえておきたい人向け
;	SIF !GETBIT(TALENT:対象:特殊勢力陥落系, COUNTRY_TO_CONST(勢力番号)) && CFLAG:対象:所属 == 勢力番号 && 対象 != MASTER
;		RETURNF 0
;対象勢力に所属して、しかも堕ちているキャラは2/3でカット（いちいち出るとうっとうしいので）
SIF CFLAG:対象:所属 == 勢力番号 && GETBIT(TALENT:対象:特殊勢力陥落系, SP_COUNTRY_TO_CONST(勢力番号)) && RAND:3
	RETURNF 0
RETURNF 1

;-------------------------------------------------
;対象が渡された勢力に寝返るかどうか判断する
;-------------------------------------------------
@IS_BETRAY_TO_SP_COUNTRY(対象, 勢力番号)
#FUNCTION
#DIM 対象
#DIM 勢力番号
#DIM 勢力定数

勢力定数 = SP_COUNTRY_TO_CONST(勢力番号)

;堕ちていないなら、ターン数不足なら駄目
LOCAL = TRAIN_FALLEN_TERM:3 - (CFLAG:対象:所属 == 勢力番号)
SIF !GETBIT(TALENT:対象:特殊勢力陥落系, 勢力定数) && SP_TRAIN_COUNT:対象:勢力定数 < LOCAL
	RETURNF 0
;堕ちていて、その勢力に士官しているならスキップ（既に寝返っているので。士官でない場合、一度よそに登用されるかなにかしているので例外）
SIF CFLAG:対象:所属 == 勢力番号 && GETBIT(TALENT:対象:特殊勢力陥落系, 勢力定数)
	RETURNF 0
RETURNF 1

;-------------------------------------------------
;渡されたキャラが特殊勢力の陥落系素質を持っているかを判断する
;-------------------------------------------------
@IS_FALLEN_TO_SP_COUNTRY(対象)
#FUNCTION
#DIM 対象
RETURNF (TALENT:対象:特殊勢力陥落系 != 0)

;-------------------------------------------------
;主人公が特殊勢力に陥落した場合の処理
;-------------------------------------------------
@PLAYER_FALLEN_TO_SP_COUNTRY(勢力)
#DIM 勢力
FOR LOCAL, 1, CHARANUM
	IF CFLAG:LOCAL:所属 == 勢力
		TALENT:LOCAL:合意 = 1
		CFLAG:LOCAL:好感度 = MAX(CFLAG:LOCAL:好感度, 500)
		CFLAG:LOCAL:従属度 = MAX(CFLAG:LOCAL:従属度, 500)
		CFLAG:LOCAL:依存度 = MAX(CFLAG:LOCAL:依存度, 500)
		CFLAG:LOCAL:支配度 = MAX(CFLAG:LOCAL:支配度, 1000)
	ENDIF
NEXT

;-------------------------------------------------
;渡されたキャラが特殊勢力のキャラであるかどうかを判断する
;-------------------------------------------------
@IS_SP_COUNTRY_CHARA(対象)
#FUNCTION
#DIM 対象
RETURNF TALENT:対象:特殊勢力素質

;---------------------------------------------------
;与えられた勢力番号を、対応する定数割り当てに変換する
;勢力番号だけ分かる状態で定数割り当てが拾いたいときに
;---------------------------------------------------
@SP_COUNTRY_TO_CONST(勢力番号)
#FUNCTION
#DIM 勢力番号
SIF 勢力番号 < 0 || 勢力番号 >= MAX_COUNTRY
	RETURNF 0
RETURNF (FINDELEMENT(SP_COUNTRY_ID, COUNTRY_EVENT_ID:勢力番号) != -1 ? FINDELEMENT(SP_COUNTRY_ID, COUNTRY_EVENT_ID:勢力番号) # 0)

;---------------------------------------------------
;与えられたEVENTIDを、対応する定数割り当てに変換する
;おそらく使わない
;---------------------------------------------------
@SP_COUNTRY_ID_TO_COSNT(EVENTID)
#FUNCTION
#DIM EVENTID
SIF GET_COUNTRY_FROM_ID(EVENTID) != -1
	RETURNF SP_COUNTRY_TO_CONST(GET_COUNTRY_FROM_ID(EVENTID))
RETURNF 0


code:
@SP_COUNTRY_REV_TRAIN()
#DIM 知り合い参加者, 4
#DIM 知り合い参加数
#DIM 特殊勢力定数
#DIMS 特殊勢力英名
VARSET 知り合い参加者
VARSET 知り合い参加数
;全員の調教参加フラグを解除
CVARSET CFLAG, 6, 0

特殊勢力定数 = SP_COUNTRY_TO_CONST(CFLAG:MASTER:捕虜先)
特殊勢力英名 = %SP_COUNTRY_NAME_ENG:特殊勢力定数%

;勢力ごとの特殊なイベント
;発生したなら1を戻す　その後の調教は発生しない
TRYCCALLFORM %特殊勢力英名%_REV_TRAIN_SP_EVENT(CFLAG:MASTER:捕虜先)
	SIF RESULT
		RETURN 0
CATCH
ENDCATCH

;勢力ごとの定期的イベントとして使う
;その後の調教をキャンセルするなら1を返す
TRYCCALLFORM %特殊勢力英名%_REV_TRAIN_REGULAR_EVENT(CFLAG:MASTER:捕虜先)
	SIF RESULT
		RETURN 0
CATCH
ENDCATCH

;知り合いの参加数を決定する 4人まで
CALL FISHER_YATES_SHAFFLE(CHARANUM)
FOR LOCAL:0, 0, CHARANUM
	LOCAL:1 = SHAFFLE_ARRAY:(LOCAL:0)
	{
		IF CFLAG:(LOCAL:1):面識 &&
			!IS_SP_CHARA(LOCAL:1) &&
			(CFLAG:(LOCAL:1):所属 == CFLAG:MASTER:捕虜先 ||	CFLAG:(LOCAL:1):捕虜先 == CFLAG:MASTER:捕虜先) &&
			RAND:2
	}
		知り合い参加者:知り合い参加数 = LOCAL:1
		知り合い参加数 ++
		CFLAG:(LOCAL:1):調教参加フラグ = 1
		SIF 知り合い参加数 == 4
			BREAK
	ENDIF
NEXT

;特殊勢力に堕ちたキャラが参加するイベント
;第二引数は#DIM REFすること
SIF 知り合い参加数 > 0
	TRYCALLFORM %特殊勢力英名%_REV_TRAIN_MSG(CFLAG:MASTER:捕虜先, 知り合い参加者, 知り合い参加数)

;参加者決定アルゴリズム(犬豚を参加させるための処置)
TRYCCALLFORM %特殊勢力英名%_REV_TRAIN_CHOOSE_PARTICIPANT(CFLAG:MASTER:捕虜先)
CATCH
	FOR LOCAL, 0, 4
		FOR LOCAL:1, 0, CHARANUM
			IF TALENT:(LOCAL:1):特殊勢力素質 == 特殊勢力定数 && !CFLAG:(LOCAL:1):調教参加フラグ && CFLAG:(LOCAL:1):所属 == CFLAG:MASTER:捕虜先
				CFLAG:(LOCAL:1):調教参加フラグ = 1
				CFLAG:(LOCAL:1):TEXT_LAST非表示 = 1
				BREAK
			ENDIF
		NEXT
	NEXT
ENDCATCH

;逆調教開始前のなんやかや
FLAG:調教モード = 調教_逆調教特殊
FLAG:ウフフフラグ = 1
FLAG:逆調教回数 ++
ITEM:A_ローター = 1
ITEM:A_バイブ = 1
ITEM:A_アナルバイブ = 1
ITEM:A_ペニスバンド = 1
ITEM:A_オナホール = 1
ITEM:A_クリキャップ = 1
ITEM:A_ニプルキャップ = 1
ITEM:A_搾乳機 = 1
ITEM:A_針 = 1
ITEM:A_鞭 = 1
ITEM:A_媚薬 = 99
ITEM:A_排卵誘発剤 = 99
ITEM:A_ローション = 99
ITEM:A_ペニスバンド = 1

CFLAG:MASTER:解放カウンタ = 0

RETURN 1


code:
;-------------------------------------------------
;特殊勢力による調教
;-------------------------------------------------
@SP_TRAIN(勢力)
#DIM 勢力
#DIM 対象
#DIM 表示フラグ
#DIM 勢力定数
#DIMS 勢力名

勢力定数 = SP_COUNTRY_TO_CONST(勢力)

SIF !勢力定数
	RETURN 0

勢力名 = %SP_COUNTRY_NAME_ENG:勢力定数%

SIF 勢力名 == ""
	RETURN 0

表示フラグ = 0

TRYCCALLFORM %勢力名%_DOES_TRAIN
CATCH
	RETURN
ENDCATCH

FOR 対象, 0, CHARANUM
	SIF !IS_TRAIN_BY_SP_COUNTRY(対象, 勢力)
		CONTINUE
	IF !表示フラグ
		CALL SINGLE_DRAWLINE("-", カラー_選択不可)
		RESETCOLOR
		PRINTFORMW %SP_COUNTRY_NAME:勢力定数%に囚われた各国の仕官が調教されているようです……
		PRINTFORML
		表示フラグ = 1
	ENDIF
	TRYCALLFORM %勢力名%_TRAIN_MSG(対象, GETBIT(TALENT:対象:特殊勢力陥落系, 勢力定数) || SP_TRAIN_COUNT:対象:勢力定数 >= (TRAIN_FALLEN_TERM:2 - (CFLAG:対象:所属 == 勢力)))
	SP_TRAIN_COUNT:対象:勢力定数 ++

	IF IS_BETRAY_TO_SP_COUNTRY(対象, 勢力)
		PRINTFORML
		SETCOLOR カラー_警告
		TRYCALLFORM %勢力名%_FALLEN_MSG(対象)
		RESETCOLOR
		SIF CFLAG:対象:所属 != 勢力
			CALL CHANGE_COUNTRY(対象, 勢力, 1)
		SETBIT TALENT:対象:特殊勢力陥落系, 勢力定数
		SIF SP_TRAIN_IS_DECREASE_CFLAG(対象, 勢力)
			CALL LOSE_RELATION_TALENT(対象)
		TRYCALLFORM %勢力名%_FALLEN_LEAVE_MARK(対象)
		SIF 対象 == MASTER
			CALL PLAYER_FALLEN_TO_SP_COUNTRY(勢力)
		CALL CLOTH_RESET(対象)
		CALL SET_CLOTH_BY_NAME(対象, 衣装部位_首, "奴隷の首輪")

		IF 対象 != MASTER && CFLAG:対象:所属 == CFLAG:MASTER:所属
			CFLAG:対象:好感度 = MAX(CFLAG:対象:好感度, 500)
			CFLAG:対象:従属度 = MAX(CFLAG:対象:従属度, 1000)
			CFLAG:対象:依存度 = MAX(CFLAG:対象:依存度, 500)
			CFLAG:対象:支配度 = MAX(CFLAG:対象:支配度, 0)
			TALENT:対象:合意 = 1
		ENDIF
	ENDIF
	PRINTL
	WAIT
NEXT