스카이림 번역보관소

MCM - FISS 스크립트 소스

2015.07.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


  • 신성한로맨스 2015.07.25 00:37 신고

    이게 뭔가요? 저도 FISS깔려있긴한데 ;;

    1. BlogIcon renn 2015.07.25 14:06 신고

      모더용 소스니까 신경쓰지 않으셔도 됩니다.

  • BlogIcon 윈드송 2015.07.25 20:57 신고

    몇몇 fomod가 제대로 작동하지 않는 것 같습니다. 설치 도중 누락되는 파일들이 생기네요.

    기억나는 것은 FLP 말미르판 밖에 없는데 다른 것도 두 세개 쯤 제대로 설치되지 않더라구요.
    모드매니저 v1.38 버전을 사용하고 있고 여러 번 재설치해봤지만 동일한 증상이 나타나네요.

    fomod 원본을 설치하고 한글 fomod를 또 설치하는게 오히려 불편한 감도 있네요.
    이건 비난하려는 의도가 아니라 순전히 개인적인 의견일 뿐입니다 :')

  • BlogIcon 윈드송 2015.07.25 21:33 신고

    제대로 기억나질 않지만 최근에 올리신 fomod가 몇 개 그렇더군요. 정확하지 못한 제보 죄송합니다.

    1. BlogIcon renn 2015.07.25 22:32 신고

      FLP는 확인해보니까 경로 문법이 잘못돼 있었네요, 수정해서 올릴게요 감사합니다. fomod로 만든 게 많아서 다 확인하기가 어려운데 다른 것도 생각나면 다시 말씀해주세요.

  • 지나가다 2016.12.26 01:17 신고

    안녕하세요. 자료들 항상 감사히 쓰고 있습니다. 얼마 전에 FISS 라는 모드가 다른 모드에도 적용할 수 있다고 해서 넥서스 설명을 읽어봤는데, 뭔 소린지 도무지 알 수가 없어서 못 쓰고 있습니다. 구글링을 해봐도 마땅한 포스트가 없더군요. 혹시 거기에 대해서 포스팅 가능할까요?
    여기 있는 소스가 무엇이며 어떻게 다른 모드에 적용하는지 알고 싶습니다.
    감사합니다.