MCM - FISS 스크립트 소스
2015. 7. 24. 20:29 - renn* 특징 *
FISS 설치 여부, FISS 사용자설정 xml 파일 존재 여부 체크 기능
FISS 설정 여러개 지원
새게임 시작시/모드 첫 설치시 FISS 0번 설정 자동 적용
FISS 항목그룹 선택적 로딩 가능
저장된 FISS 파일에 없는 항목은 로딩 스킵 기능 (초기화 방지)
대부분의 모드에 적용 가능
Import FISSFactory
; -----------------------renn FISS
string[] _FISS
int i_FISS = 0
int fissflag = 1 ; 1 = FISS 설치 안됨 / 0 = 설치됨
int fissloadflag = 1 ; 1 = 이 번호에 저장된 FISS 파일 없음 / 0 = 파일 있음
int savedfiss = 0 ; 0 = 선택한 설정에 아직 저장 안함 / 1 = 완료
int loadedfiss = 0 ; 0 = 선택한 설정에서 아직 로딩 안함 / 1 = 완료
bool fissExtra = false ; FISS 로딩시 제외하고 싶은 항목
float FISS_EXTRA_1 = 숫자1 ; FISS 항목 1 새로 추가된 시점
float FISS_EXTRA_2 = 숫자2 ; FISS 항목 2 새로 추가된 시점
; -----------------------
; 현재 스크립트 최신버전
int function GetVersion()
return 버전넘버 ;
endFunction
; 모드가 처음 설치되었을 때 (MCM이 처음 인식될 때)
; 0번에 저장된 FISS 설정이 있으면 적용. 무거운 모드일 경우 패스
event OnConfigInit()
if CheckFISS()
loadedfiss = 1
LoadFISS()
endif
endEvent
; MCM 스크립트가 업데이트되었을 때. 스트링을 다시 읽어들임
event OnVersionUpdate(int a_version)
if (a_version >= 버전넘버 && CurrentVersion < 버전넘버)
refreshPages()
endif
endEvent
; MCM이 열릴 때
event OnConfigOpen()
savedfiss = 0
loadedfiss = 0
endEvent
; 모드에 따라 다름. MCM이 닫힐 때 적용되는 function이 있다면 추가해줌
;event OnConfigClose()
; if loadedfiss == 1
;
; endif
;endEvent
; 페이지 이름과 메뉴 옵션 이름은 스크립트 내에서 번역하지 않고 $로 빼야 영문->한글 번역이 제대로 적용됨
function refreshPages()
Pages = New String[4]
Pages[0] = "$"
Pages[1] = "$"
Pages[2] = "$"
Pages[3] = "$"
; 저장가능한 FISS 설정 개수. 스트링 뒤에 숫자가 0 ~ 9까지 붙음
_FISS = new String[10]
int renn = 0
While renn < 10
_FISS[renn] = "$ _FISS" + renn as string
renn += 1
endWhile
endFunction
;-----------------------------------------------------
event OnPageReset(String a_page) ; MCM 페이지 화면
SetCursorFillMode(TOP_TO_BOTTOM)
SetCursorPosition(1) ; 0 ~ 23 ; 줄 위치
; --------------------------
; renn FISS
CheckFISS() ; FISS가 설치되었는지, FISS 사용자설정 파일이 있는지 체크
AddHeaderOption("FISS User Settings", fissflag)
; AddEmptyOption()
AddMenuOptionST("FISSPresetState", "Select Preset", _FISS[i_FISS], fissflag) ; FISS 파일 선택 메뉴
string s_savedfiss
string s_loadedfiss
if savedfiss == 1 ; 실행 완료시 버튼 바뀜
s_savedfiss = " Done"
else
s_savedfiss = " Do it"
endif
if loadedfiss == 1 ; 실행 완료시 버튼 바뀜
s_loadedfiss = " Done"
else
s_loadedfiss = " Do it"
endif
AddTextOptionST("FISSSaveState", "Save Current User Settings", s_savedfiss, fissflag)
AddTextOptionST("FISSLoadState", "Load Custom User Settings", s_loadedfiss, fissloadflag)
AddToggleOptionST("FISSLoadExtraState", "Load Extra Settings", fissExtra, fissflag) ; 로딩시 제외 토글 옵션
if fissflag == 1
AddTextOption("FISS must be installed to use this.", "" ,1)
endif
; -----------------------------------------------------------------------------------------------
; FISS
state FISSPresetState
event OnMenuOpenST()
SetMenuDialogOptions(_FISS)
SetMenuDialogStartIndex(i_FISS)
SetMenuDialogDefaultIndex(0)
endEvent
event OnMenuAcceptST(int index)
if i_FISS != index ; 메뉴에서 다른 FISS 파일 선택하면 버튼 '실행'으로 바뀜
savedfiss = 0
loadedfiss = 0
endif
i_FISS = index
SetMenuOptionValueST(_FISS[i_FISS])
ForcePageReset()
endEvent
event OnHighlightST()
SetInfoText("Select a preset your configuration will saved or loaded." + "\n\nPath: Data/SKSE/Plugins/FISS\nMO: ModOrganizer/Overwrite/SKSE/Plugins/FISS")
endEvent
endState
state FISSSaveState
event OnSelectST()
string s_fissfile
if fissloadflag == 0 ; 이미 저장된 FISS 파일 있음
s_fissfile = "There are already settings saved.\nDo you want to overwrite them?"
else ; 저장된 FISS 파일 없음
s_fissfile = "Do you want to save current configuration?"
endif
if !ShowMessage(s_fissfile, true)
return
endif
if SaveFISS() ; 저장 성공
savedfiss = 1
ShowMessage("Current configuration was saved successfully.", false)
ForcePageReset()
else ; 저장 실패
ShowMessage("Couldn't save current configuration.", false)
endif
endEvent
event OnHighlightST()
SetInfoText("Saves the current settings for all configuration options so they can be loaded later.")
endEvent
endState
state FISSLoadState
event OnSelectST()
if ShowMessage("Do you really want to load the previously saved settings?\nThe current configuration will be overwritten.", true)
if LoadFISS() ; 로딩 성공
loadedfiss = 1
ShowMessage("The configuration was loaded successfully.", false)
ForcePageReset()
else ; 로딩 일부(추가된 항목) 실패. 파일 자체가 없으면 버튼이 비활성화되므로 전체 실패는 아님(FISS가 제대로 설치되어 있는 한)
ShowMessage("Couldn't load some settings.", false)
endif
endif
endEvent
event OnHighlightST()
SetInfoText("Loads the previously saved settings for all configuration options.")
endEvent
endState
; -----------------------------------------------------------------------------------------------
; FISS Function
bool function CheckFISS()
FISSInterface fiss = FISSFactory.getFISS()
if fiss
fissflag = 0
if i_FISS == 0
fiss.beginLoad("XXX.xml")
else
fiss.beginLoad("XXX" + "_" + i_FISS + ".xml")
endif
if fiss.endLoad() == "" ; 로딩 성공
fissloadflag = 0 ; 버튼 활성화
else
fissloadflag = 1 ; 버튼 비활성화
endif
else ; FISS 미설치시 버튼 비활성화
fissflag = 1
fissloadflag = 1
return false
endif
return true
endFunction
bool function SaveFISS()
FISSInterface fiss = FISSFactory.getFISS()
if fiss
if i_FISS == 0
fiss.beginSave("XXX" + "_UserSettings" + ".xml", "XXX")
else
fiss.beginSave("XXX" + "_UserSettings" + i_FISS + ".xml", "XXX")
endif
fiss.saveInt("AAA", AAA)
fiss.saveBool("BBB", BBB)
fiss.saveFloat("CCC", CCC)
fiss.saveFloat("DDD", DDD.GetValue())
;-------------------------------------------fiss.saveFloat("FISS_EXTRA_1", FISS_EXTRA_1) ; 항목 1 추가된 시점 정보 저장
fiss.saveInt("EXTRA_1A", EXTRA_1A)
fiss.saveInt("EXTRA_1B", EXTRA_1B)
fiss.saveFloat("FISS_EXTRA_2", FISS_EXTRA_2) ; 항목 2 추가된 시점 정보 저장
fiss.saveInt("EXTRA_2A", EXTRA_2A)
fiss.saveInt("EXTRA_2B", EXTRA_2B)
;-------------------------------------------
string _result = fiss.endSave()
if _result != ""
Debug.Trace(_result)
savedfiss = 0
endif
endif
return true
endFunction
bool function LoadFISS()
FISSInterface fiss = FISSFactory.getFISS()
if fiss
if i_FISS == 0
fiss.beginLoad("XXX" + "_UserSettings" + ".xml")
else
fiss.beginLoad("XXX" + "_UserSettings" + i_FISS + ".xml")
endif
AAA = fiss.loadInt("AAA")
BBB = fiss.loadBool("BBB")
CCC = fiss.loadFloat("CCC")
DDD.SetValue(fiss.loadFloat("DDD"))
;-------------------------------------------
float tempFISS_EXTRA_1 = fiss.loadFloat("FISS_EXTRA_1") ; FISS가 저장된 시점과 현재 시점 비교
if tempFISS_EXTRA_1 == FISS_EXTRA_1 && fissExtra == true ; 항목 로딩 가능 & 제외항목 로딩 선택
EXTRA_1A = fiss.loadFloat("EXTRA_1A")
EXTRA_1B = fiss.loadInt("EXTRA_1B")
endif
float tempFISS_EXTRA_2 = fiss.loadFloat("FISS_EXTRA_2") ; FISS가 저장된 시점과 현재 시점 비교
if tempFISS_EXTRA_2 == FISS_EXTRA_2 ; 항목 로딩 가능
EXTRA_2A = fiss.loadFloat("EXTRA_2A")
EXTRA_2B = fiss.loadInt("EXTRA_2B")
endif
;-------------------------------------------
;-------------------------------------------; 다른 방식으로 대체됨. 폐기
; 원본모드에 없는 추가 항목이 있을 경우, 추가 항목이 저장되지 않은 구버전 xml을 로딩하면 해당 항목은 값이 0이 되므로 로딩 전 현재값을 임시저장
float tempEXTRA1
float tempEXTRA2
int tempEXTRA3
if fissExtra == true
tempEXTRA1 = PlayerRef.GetBaseAV("EXTRA1")
tempEXTRA2 = EXTRA2
tempEXTRA3 = EXTRA3
endif
; 원본모드에 없는 추가 항목이 있을 경우, 추가 항목이 저장된 xml인지 아닌지의 여부 확인 후 해당 항목이 없으면 임시저장값 로딩
if fissExtra == true
if !LoadFISSExtra()
PlayerRef.SetAV("EXTRA1", tempEXTRA1)
EXTRA2 = tempEXTRA2
EXTRA3 = tempEXTRA3
loadedfiss = 0
return false
endif
endif
;-------------------------------------------string _result = fiss.endLoad()
if _result != ""
Debug.Trace(_result)
loadedfiss = 0
return false
endif
endif
return true
endFunction
bool function LoadFISSExtra() ; 다른 방식으로 대체됨. 폐기
FISSInterface fiss = FISSFactory.getFISS()
if fiss
if i_FISS == 0
fiss.beginLoad("XXX" + "_UserSettings" + ".xml")
else
fiss.beginLoad("XXX" + "_UserSettings" + i_FISS + ".xml")
endif
PlayerRef.SetAV("EXTRA1", fiss.loadFloat("EXTRA1"))
EXTRA2 = fiss.loadFloat("EXTRA2")
EXTRA3 = fiss.loadInt("EXTRA3")
string loadExtraResult = fiss.endLoad()
if loadExtraResult != ""
return false
endif
endif
return true
endFunction