;---------------------------------------------
;ARG = キャラ登録番号
;ARGS:0 = 形態の指定
;ARGS:1 = 追加/変更可能素質リスト
;ARGS:2 = 除外素質リスト
;ARGS:3 = 戻る不可
;---------------------------------------------
@ENHANCE_ROLE, ARG, ARGS, ARGS:1, ARGS:2, ARGS:3
#DIM LCOUNT, 2
#DIM L_LINE
#DIM L_COST
#DIM L_REDRAW
#DIMS L_TALENT
#DIM L_TALENT_NUM
#DIM L_TALENT_LV
#DIM L_RESULT
#DIM STCOK_CHARA
#DIM TEMP
#DIMS TEMPS, 2
#DIMS SHOW_LINE
#DIM TALENT_ABLE, SUB_ROLENUM
#DIMS L_TRANS
#DIM L_CAP;キャパシティー最大値
#DIMS L_TALENTS, SUB_ROLENUM
#DIM L_LV_FIXED, SUB_ROLENUM
#DIMS L_TALENTS_FIXED, SUB_ROLENUM
#DIM L_SKILL_CHANGEABLE_RANK
L_REDRAW = CURRENTREDRAW()
REDRAW 0
;リセット用にコピーキャラを作っておく
ADDCOPYCHARA ARG
STCOK_CHARA = CHARANUM - 1
L_SKILL_CHANGEABLE_RANK = GET_SKILL_CHANGEABLE_RANK(ARG)
RESULTS =
L_TRANS = %ARGS%
L_CAP = GET_ROLE_PROP("CAPACITY", ARG, ,L_TRANS)
;固定素質の付与
TRYCCALLFORM ROLE_FIXED_BTL_TALENT_\@L_TRANS == "変身形態" ? TRANS_ # \@%CSTR:ARG:ロール%
IF RESULTS != ""
SPLIT RESULTS, "/", L_TALENTS_FIXED
FOR LCOUNT, 0, RESULT
L_LV_FIXED:LCOUNT = TOINT(AUTO_SPLIT(L_TALENTS_FIXED:LCOUNT, "_", 1))
L_TALENTS_FIXED:LCOUNT = %AUTO_SPLIT(L_TALENTS_FIXED:LCOUNT, "_", 0)%
IF L_TRANS == "変身形態"
TRANS_BTL_TALENT:ARG:GET_SUB_ROLE_NUM(L_TALENTS_FIXED:LCOUNT) = L_LV_FIXED:LCOUNT
ELSE
TALENT:ARG:(L_TALENTS_FIXED:LCOUNT) = L_LV_FIXED:LCOUNT
ENDIF
NEXT
ENDIF
CATCH
ENDCATCH
;追加/変更の可能リストを作る
VARSET TALENT_ABLE, -1
;引数で指定されている場合は引数からリストを作る
IF ARGS:1 != ""
FOR LCOUNT, 0, STRCOUNT(ARGS:1, "/") + 1
TEMPS = %AUTO_SPLIT(ARGS:1, "/", LCOUNT)%
SIF TEMPS == ""
CONTINUE
TEMPS:1 = %AUTO_SPLIT(TEMPS, "_", 0)%
;取得可能な素質でないなら弾く
SIF GET_ROLE_PROP("CAN_USE_" + TEMPS:1, ARG, , L_TRANS) != 2
CONTINUE
;固定素質なら弾く
SIF FINDELEMENT(L_TALENTS_FIXED, TEMPS:1) >= 0
CONTINUE
IF STRCOUNT(TEMPS, "_")
TALENT_ABLE:GET_SUB_ROLE_NUM(TEMPS:1) = MAX(TOINT(AUTO_SPLIT(TEMPS, "_", 1)), TALENT_ABLE:GET_SUB_ROLE_NUM(TEMPS:1))
ELSE
TALENT_ABLE:GET_SUB_ROLE_NUM(TEMPS:1) = GET_SUB_ROLE_PROP("MAXLV", TEMPS)
ENDIF
NEXT
ENDIF
L_LINE = LINECOUNT
$START
CALL SET_ROLE_CP, ARG
CLEARLINE LINECOUNT - L_LINE
;セット中のサブ素質を表示
CALL ROLE_EXPLAIN_ABILITY, ARG, , ,"サブ"
WHILE LINECOUNT < L_LINE + 24
PRINTL
WEND
DRAWLINE
PRINTFORML Capacity 【{L_CAP - GET_ROLE_CP(ARG, L_TRANS),2} / {L_CAP,2}】
DRAWLINE
PRINTFORML %"Talent", 24, LEFT%[ - ] Lv [ + ] Lv1 Lv2 Lv3 Lv4 Lv5
CUSTOMDRAWLINE ―
FOR LCOUNT, 0, SUB_ROLENUM
;付与可能リストに入っておらずかつ所持していない素質は弾く
SIF TALENT_ABLE:LCOUNT < 0 && !GET_BTL_TALENT_LV(GET_SUB_ROLE_NAME(LCOUNT), ARG, ARGS)
CONTINUE
;固定で得ている素質は弾く
SIF FINDELEMENT(L_TALENTS_FIXED, GET_SUB_ROLE_NAME(LCOUNT)) >= 0
CONTINUE
L_TALENT = %GET_SUB_ROLE_NAME(LCOUNT)%
SHOW_LINE =
TEMPS = %GETS_SUB_ROLE_PROP("NAME", L_TALENT), 24, LEFT%
RESULTS =
TRYCALLFORM SUB_ROLE_EXPLAIN_TOOLTIP_%L_TALENT%
TEMPS = %TEMPS%
SHOW_LINE += TEMPS
IF TALENT_ABLE:LCOUNT >= 0
SHOW_LINE += @""
ELSE
SHOW_LINE += " " * 5
ENDIF
SHOW_LINE += @" 《Lv{GET_BTL_TALENT_LV(L_TALENT, ARG, ARGS), 2}》 "
IF TALENT_ABLE:LCOUNT >= 0
SHOW_LINE += @""
ELSE
SHOW_LINE += " " * 5
ENDIF
SHOW_LINE += " " * 10
FOR LCOUNT:1, 1, 6
L_COST = GET_SUB_ROLE_PROP("COST", L_TALENT, , , LCOUNT:1)
SIF (L_COST > L_CAP) && GET_BTL_TALENT_LV(L_TALENT, ARG, ARGS) < LCOUNT:1
CONTINUE
IF L_COST > 0 && ((LCOUNT:1 <= TALENT_ABLE:LCOUNT) || GET_BTL_TALENT_LV(L_TALENT, ARG, ARGS) == LCOUNT:1)
IF GET_BTL_TALENT_LV(L_TALENT, ARG, ARGS) == LCOUNT:1
TEMPS = 【{L_COST, 2}pt】
TEMPS = %TEMPS%
ELSE
TEMPS = {L_COST, 2}pt
ENDIF
ELSE
TEMPS = %" " * 10%
ENDIF
SHOW_LINE += TEMPS
NEXT
HTML_PRINT SHOW_LINE
NEXT
DRAWLINE
CALL PRINT_COLOR, "[0] Accept ", GET_ROLE_CP(ARG, L_TRANS) < 0 ? COLOR("DARK-GRAY") # GETDEFCOLOR()
SIF !STRCOUNT(ARGS:3, "戻る不可")
PRINT [99] Return
PRINTL
INPUTS
IF RESULTS == "0" && GET_ROLE_CP(ARG, L_TRANS) >= 0
;スキルの調整
CALL FIX_ROLE_HAVESKILL, ARG, \@L_SKILL_CHANGEABLE_RANK < GET_SKILL_CHANGEABLE_RANK(ARG) ? "スキル使用能力/枠数" # "枠数"\@
;潜在素質の調整
IF CSTR:ARG:潜在戦闘素質 != ""
TEMPS:1 =
FOR LCOUNT, 0, STRCOUNT(CSTR:ARG:潜在戦闘素質, "/") + 1
TEMPS = %AUTO_SPLIT(CSTR:ARG:潜在戦闘素質, "/", LCOUNT)%
TEMPS '= REPLACE(TEMPS, "不浄の手", "バステブースタ") ;bugfix
L_TALENT = %AUTO_SPLIT(TEMPS, "_", 0)%
SIF !TALENT:ARG:L_TALENT
CONTINUE
TEMPS:1 = %ADD_SPLIT(TEMPS:1, "/", L_TALENT + "_" + TOSTR(TALENT:ARG:L_TALENT))%
NEXT
ENDIF
CSTR:ARG:潜在戦闘素質 = %TEMPS:1%
REDRAW L_REDRAW
DELCHARA STCOK_CHARA
RETURN 1
ELSEIF RESULTS == "99"
IF !STRCOUNT(ARGS:3, "戻る不可")
;キャンセルの場合は関数突入時に生成しておいたストックに差し戻して終わる
SWAPCHARA ARG, STCOK_CHARA
DELCHARA STCOK_CHARA
REDRAW L_REDRAW
RETURN 0
ENDIF
ELSE
IF CHARATU(RESULTS, 0) == "-"
L_RESULT = -TOINT(SUBSTRING(RESULTS, 1))
ELSE
L_RESULT = TOINT(RESULTS)
ENDIF
IF INRANGE(ABS(L_RESULT) -1, 0, SUB_ROLENUM)
L_TALENT_NUM = ABS(L_RESULT) -1
IF TALENT_ABLE:L_TALENT_NUM > 0
L_TALENT = %GET_SUB_ROLE_NAME(L_TALENT_NUM)%
IF TALENT_ABLE:L_TALENT_NUM
L_TALENT_LV = GET_BTL_TALENT_LV(L_TALENT, ARG, L_TRANS)
IF L_RESULT > 0
L_COST = GET_SUB_ROLE_PROP("COST", L_TALENT, , , L_TALENT_LV)
L_TALENT_LV++
SIF L_TALENT_LV > TALENT_ABLE:L_TALENT_NUM
GOTO START
;コストがマイナス指定されている場合は飛ばす
WHILE GET_SUB_ROLE_PROP("COST", L_TALENT, , , L_TALENT_LV) < 0
L_TALENT_LV++
SIF L_TALENT_LV > TALENT_ABLE:L_TALENT_NUM
GOTO START
WEND
SIF GET_SUB_ROLE_PROP("COST", L_TALENT, , , L_TALENT_LV) < 0
GOTO START
L_COST = GET_SUB_ROLE_PROP("COST", L_TALENT, , , L_TALENT_LV) - L_COST
IF L_COST <= GET_ROLE_CP(ARG, L_TRANS)
IF L_TRANS == "変身形態"
TRANS_BTL_TALENT:ARG:L_TALENT_NUM = L_TALENT_LV
ELSE
TALENT:ARG:L_TALENT = L_TALENT_LV
ENDIF
ENDIF
ELSE
IF L_TALENT_LV > 0
;コストがマイナス指定されている場合は飛ばす
DO
L_TALENT_LV--
SIF !L_TALENT_LV
BREAK
LOOP GET_SUB_ROLE_PROP("COST", L_TALENT, , , L_TALENT_LV) < 0
IF L_TRANS == "変身形態"
TRANS_BTL_TALENT:ARG:L_TALENT_NUM = L_TALENT_LV
ELSE
TALENT:ARG:L_TALENT = L_TALENT_LV
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
GOTO START
;========================================================================
;戦闘素質の重複によるランクアップ処理など
;========================================================================
@MIX_BTL_TALENT_LIST, TALENT_LIST
#DIMS REF TALENT_LIST
#DIM LCOUNT
#DIMS L_TALENTS
#DIM L_LV
#DIM L_TALENT, SUB_ROLENUM
VARSET L_TALENT
FOR LCOUNT, 0, STRCOUNT(TALENT_LIST, "/") + 1
L_TALENTS = %AUTO_SPLIT(AUTO_SPLIT(TALENT_LIST, "/", LCOUNT), "_", 0)%
L_LV = MAX(TOINT(AUTO_SPLIT(AUTO_SPLIT(TALENT_LIST, "/", LCOUNT), "_", 1)), 1)
L_TALENT:GET_SUB_ROLE_NUM(L_TALENTS) += L_LV
IF L_TALENT:GET_SUB_ROLE_NUM(L_TALENTS) > GET_SUB_ROLE_PROP("MAXLV", L_TALENTS)
;道具知識が上限を超えてた場合は選択肢にアイテム習熟を加える
SELECTCASE L_TALENTS
CASE "道具知識"
L_TALENT:GET_SUB_ROLE_NUM("アイテム習熟") = 1
ENDSELECT
L_TALENT:GET_SUB_ROLE_NUM(L_TALENTS) = GET_SUB_ROLE_PROP("MAXLV", L_TALENTS)
ENDIF
NEXT
TALENT_LIST =
FOR LCOUNT, 0, SUB_ROLENUM
SIF !L_TALENT:LCOUNT
CONTINUE
SIF TALENT_LIST != ""
TALENT_LIST += "/"
TALENT_LIST += GET_SUB_ROLE_NAME(LCOUNT) + "_" + TOSTR(L_TALENT:LCOUNT)
NEXT
RETURN 1