스카이림 번역보관소

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