설치 애드온 만들기 - 기초 중급편 IV -

 

해상도 1280x1024, 1920x1080 캐릭터 추가 애드온 만들기

 

-- WTF에 해상도 캐릭터를 추가 하고 싶을때

 

2button.ini의 화면

 

 

 

 

설치 애드온을 만들기 위해서는 항상 바이러스 체크를 함으로써 타 유저가 안전하게 사용할 수 있도록 해야합니다.

설치 애드온을 받았을때는 사용전에 바이러스 테스트를 한 후에 게임을 실행 하는것이 좋습니다.

 

설치화면

 

 

 

 

 

 

설치 애드온 만들기



다운로드 :

 

nsis ; 중급 이상 사용자는 해당 사이트에서 다운로드

http://nsis.sourceforge.net/

http://nsis.sourceforge.net/Download

 

HM NIS Edit ; 중급 이상 사용자는 해당 사이트에서 다운로드

http://hmne.sourceforge.net/index.php#Download


HM NIS Edit ; 초급 이상 사용자는 해당사이트에서 다운로드 ( 한글화 버전 받기 )

http://jgh0721.tistory.com/attachment/dk39.exe



-- 목록 --


Character.nsi ; 스크립트가 있는 데이터 ;(초급 사용자는 HM NIS Edit, Venis IX 로 Open 사용 권장)

AccountInf.ini ; 캐릭터 ini

2button.ini ; 해상도 ini (1280x1024 , 1920x1080의 해상도) 

wow.ico ; 설치 애드온이 만들어 지고 나서 생기는 설치 아이콘 (개인이 선택 가능, 권장 크기 48 X 48)

RIGHT Head.bmp : 설치 애드온의 오른쪽 상단 일부 화면 (권장 크기 : 167 X 47)

wow_welcome.bmp ; 설치 애드온의 설치 화면의 일부 화면 (권장 크기 : 200 X 300, 164 X 314)

License.txt ; 설치 애드온의 설치 화면에서 나오는 라이센스 항목 (본인에 맞게 설정 가능)



 

- 컴파일 방법 -


Venis IX -> Tools -> Comfile

HM NIS Edit -> NSIS(N) -> 스크립트 컴파일(C) -> Ctrl + 9
HM NIS Edit -> NSIS(N) -> 컴파일 및 실행(O) -> Shift + 9

해당파일.nsi -> 마우스 오른쪽 버튼 클릭 -> Compile NSIS Script -> 클릭



설명

 

2button.ini의 필드 값 


; Ini file generated by the HM NIS Edit IO designer.
[Settings]
NumFields=4

 

[Field 1]
Type=Label
Left=12
Top=1
Right=188
Bottom=12
Flags=NOTABSTOP
Text=원하는 레이아웃과 해상도를 선택하세요.

 

[Field 2]
Type=Groupbox
Text=표준
Left=10
Right=243
Top=48
Bottom=86

 

[Field 3] ; 해상도 1280 : 1024의 필드 값
Type=RadioButton
Text=4:3
State=0
Left=49
Right=76
Top=59
Bottom=78

 

[Field 4] ; 해상도 1920 : 1080 의 필드 값 / 1920 : 1080 고정 값
Type=RadioButton
Text=16:10
State=1
Left=157
Right=189
Top=59
Bottom=78


1280:1024, 1920:1080 해상도 캐릭터 설정


Page custom viewpage viewinf ; 해상도 정보 페이지
  
 Function viewpage ; 해상도 정보 보여주기
    !insertmacro MUI_HEADER_TEXT "$(TEXT_IO_TITLE)" "$(TEXT_IO_SUBTITLE)"
    !insertmacro MUI_INSTALLOPTIONS_EXTRACT "2button.ini"
    !insertmacro MUI_INSTALLOPTIONS_DISPLAY "2button.ini"
  FunctionEnd

 

## 입력된 레이아웃 지정 정보 변수에 저장

  Function viewInf ; 해상도 정보 페이지에 삽입될 함수
  
  !insertmacro MUI_INSTALLOPTIONS_READ $R1 "2button.ini" "Field 3" "state" ; 해상도 1280:1024 버튼 필드 값
  !insertmacro MUI_INSTALLOPTIONS_READ $R2 "2button.ini" "Field 4" "state" ; 해상도 1920:1080 버튼 필드 값
  
  StrCmp $R1 "1" 0 +3
  StrCpy $INI_VIEW "STANDARD"
  goto end
  StrCmp $R2 "1" 0 +3
  StrCpy $INI_VIEW "STANDARDW"
  goto end
  
  StrCpy $INI_VK "none"
  end:
  Functionend



-- 스크립트 --


## 배포할 프로그램의 정보

!define PRODUCT_NAME "Character Addition" ;프로그램의 이름
!define PRODUCT_VERSION " 1.0_a " ;프로그램의 버전
!define PRODUCT_PUBLISHER "MONK" ;프로그램을 배포하는 사람
!define PRODUCT_DIR_ROOT_REGKEY "HKLM" ;프로그램의 설치 정보를 넣을 레지스트리의 최상위 경로
!define PRODUCT_DIR_REGKEY "SoftwareCharacter Addition" ;프로그램의 설치 정보를 넣을 레지스트리의 하위 경로

## 설치 프로그램의 아이콘과 배경 삽입

!define MUI_ICON "wow.ico" ;설치 프로그램의 아이콘
!define MUI_HEADERIMAGE ; 설치 페이지의 오른쪽 상단 이미지 배경
!define MUI_HEADERIMAGE_BITMAP "RIGHT Head.BMP" ; 오른쪽 상단 이미지 배경 (167 X 47)
!define MUI_HEADERIMAGE_RIGHT
!define MUI_WELCOMEFINISHPAGE_BITMAP "wow_welcome.bmp" ;환영 페이지의 배경 (200 X 300)
!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH ;환영 페이지의 배경을 늘리지 않음
!define MUI_LICENSEPAGE_BGCOLOR /gray ; 라이센스의 화면색

## 설치 프로그램의 정보 설정

OutFile "Character Addition ${PRODUCT_VERSION}.exe" ;설치 프로그램의 이름
InstallDirRegKey HKLM "SOFTWAREBlizzard EntertainmentWorld of Warcraft" "InstallPath" ;프로그램을 설치할 경로를 와우의 레지스트리에서 가져오기
InstallDir $INSTDIR ;프로그램을 설치할 경로 설정
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" ;설치 프로그램의 상위에 주로 나올 제목
BrandingText /TRIMRIGHT "${PRODUCT_NAME}" ;설치 프로그램의 하부에 가로줄과 함께 나올 텍스트
ShowInstDetails show ;설치 페이지에서 설치 과정 보이기

# MUI 1.67 compatible : 매크로 삽입 ------------------------------------------------------------

!include "MUI.nsh"
!include "WordFunc.nsh"
!insertmacro StrFilter
!insertmacro WordFind
!include "FileFunc.nsh"


# Reserve Files : 사용자페이지의 정보파일 삽입 ------------------------------------------------------------

ReserveFile "AccountInf.ini"
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS


# 전역 변수 선언 ------------------------------------------------------------

Var VER
Var INI_ACCOUNT
Var INI_SERVER
Var INI_CHARACTER
Var RE_ACCOUNT_TOTAL
Var RE_ACCOUNT_NUM
Var INI_VIEW
Var INI_VK


# 설치 프로그램이 나타나기 전에 수행할 함수 ------------------------------------------------------------

Function .onInit
 
## Extract InstallOptions INI files
  !insertmacro MUI_INSTALLOPTIONS_EXTRACT "AccountInf.ini" ;사용자 페이지 정보 파일 풀어놓기
  Pop $VER
  Pop $5

## 기존 버전이 있는지 확인
  StrCmp "$5" "${PRODUCT_VERSION}" initA
    StrCpy "$VER" "0"
  Goto end
initA:
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON1 "$(^Name) 가(이) 이미 설치되었습니다.$n$n다른 케릭터에 대한 설치를 진행하시겠습니까?" IDYES +2
  Abort
 StrCpy "$VER" "1"
  Goto end

end:
  Push $5
  Push $VER
FunctionEnd


# 페이지 삽입 ------------------------------------------------------------

!insertmacro MUI_PAGE_WELCOME ;환영 페이지
!insertmacro MUI_PAGE_LICENSE "License.txt" ;라이센스 페이지

 

Page custom viewpage viewinf ; 해상도 정보 페이지
  
 Function viewpage ; 해상도 정보 보여주기
    !insertmacro MUI_HEADER_TEXT "$(TEXT_IO_TITLE)" "$(TEXT_IO_SUBTITLE)"
    !insertmacro MUI_INSTALLOPTIONS_EXTRACT "2button.ini"
    !insertmacro MUI_INSTALLOPTIONS_DISPLAY "2button.ini"
  FunctionEnd

 

## 입력된 레이아웃 지정 정보 변수에 저장

  Function viewInf ; 해상도 정보 페이지에 삽입될 함수
  
  !insertmacro MUI_INSTALLOPTIONS_READ $R1 "2button.ini" "Field 3" "state"
  !insertmacro MUI_INSTALLOPTIONS_READ $R2 "2button.ini" "Field 4" "state"
  
  StrCmp $R1 "1" 0 +3
  StrCpy $INI_VIEW "STANDARD"
  goto end
  StrCmp $R2 "1" 0 +3
  StrCpy $INI_VIEW "STANDARDW"
  goto end
  
  StrCpy $INI_VK "none"
  end:
  Functionend
 
Page custom AccountInfPage AccountInf ;사용자 정보 입력페이지


  Function AccountInfPage ;사용자 정보 입력페이지 보여주기
    !insertmacro MUI_HEADER_TEXT "$(TEXT_IO_TITLE)" "$(TEXT_IO_SUBTITLE)"
  !insertmacro MUI_INSTALLOPTIONS_EXTRACT "AccountInf.ini"
    !insertmacro MUI_INSTALLOPTIONS_DISPLAY "AccountInf.ini"
  FunctionEnd

  Function AccountInf ;사용자 정보 입력페이지에 삽입될 함수
  
  ### 입력된 사용자 정보 읽어와서 변수에 저장
 
    !insertmacro MUI_INSTALLOPTIONS_READ $INI_ACCOUNT "AccountInf.ini" "Field 3" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $INI_SERVER "AccountInf.ini" "Field 5" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $INI_CHARACTER "AccountInf.ini" "Field 7" "State"
   
  ### 변수에 저장된 계정명 대문자로 변환
 
    ${StrFilter} "$INI_ACCOUNT" "+" "" "" $INI_ACCOUNT

  ### 레지스트리 경로에 필요한 변수 저장
 
    StrCpy $1 "${PRODUCT_DIR_REGKEY}$INI_ACCOUNT$INI_SERVER$INI_CHARACTER"
    StrCpy $2 "${PRODUCT_DIR_REGKEY}$INI_ACCOUNT$INI_SERVER"
    StrCpy $3 "${PRODUCT_DIR_REGKEY}$INI_ACCOUNT"

  ### 레지스트리에서 입력한 케릭터와 동일한 케릭터가 있을 경우 재설치 여부
 
    ReadRegStr "$0" "${PRODUCT_DIR_ROOT_REGKEY}" "$1" "설치여부"
    StrCmp $0 "" toReg
    StrCmp $0 "no" 0 seekRe
    MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "해당 케릭터는 이미 설치 예정입니다.$n$n예정을 취소하시겠습니까?" IDYES +2
    abort
  
    DeleteRegKey "${PRODUCT_DIR_ROOT_REGKEY}" "$1"
    EnumRegKey "$9" "${PRODUCT_DIR_ROOT_REGKEY}" "$2" 0
    StrCmp "$9" "" 0 clear
    DeleteRegKey "${PRODUCT_DIR_ROOT_REGKEY}" "$2"
    EnumRegKey "$9" "${PRODUCT_DIR_ROOT_REGKEY}" "$3" 0
    StrCmp "$9" "" 0 clear
    DeleteRegKey "${PRODUCT_DIR_ROOT_REGKEY}" "$3"
    EnumRegKey "$9" "${PRODUCT_DIR_ROOT_REGKEY}" "${PRODUCT_DIR_REGKEY}" 0
    StrCmp "$9" "" 0 clear
    DeleteRegKey "${PRODUCT_DIR_ROOT_REGKEY}" "${PRODUCT_DIR_REGKEY}"
  Goto clear
  
  seekRe:
    StrCmp $0 "re" +2
    MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "해당 케릭터는 이미 설치 되었습니다.$n$n같은 케릭터를 재설치 하시게습니까?" IDNO +3
    WriteRegExpandStr "${PRODUCT_DIR_ROOT_REGKEY}" "$1" "설치여부" "re"
    Goto reReg
    abort
  
  ### 입력된 사용자 정보를 레지스트리로 만들기
 
  toReg:
    WriteRegExpandStr "${PRODUCT_DIR_ROOT_REGKEY}" "$1" "설치여부" "no"
  
  reReg:
    WriteRegExpandStr "${PRODUCT_DIR_ROOT_REGKEY}" "$1" "케릭" "$INI_CHARACTER"
  
  ### "설치할 케릭이 더 있는습니까"를 확인하고 있을 경우 기존 케릭 정보 삭제하고 페이지에 머무르기
    MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "설치할 케릭이 더 있습니까?" IDNO end
  
  clear:
    !insertmacro MUI_INSTALLOPTIONS_READ $INI_CHARACTER "AccountInf.ini" "Field 7" "HWND"
    SendMessage $INI_CHARACTER ${WM_SETTEXT} 0 "STR:"
    abort
  end:
  FunctionEnd

# 페이지 설정 -------------------------------------------------------------------------------

!insertmacro MUI_PAGE_COMPONENTS ;설치 항목 선택 페이지
!insertmacro MUI_PAGE_DIRECTORY ;설치할 경로 선택 페이지
!insertmacro MUI_PAGE_INSTFILES ;설치 페이지
!define MUI_FINISHPAGE_RUN "$INSTDIRWorld of Warcraft Launcher.exe" ;마지막페이지에서 실행할 프로그램
!define MUI_FINISHPAGE_RUN_TEXT "월드오브워크래프트 실행하기" ;마지막페이지에서 실행할 프로그램의 설명
!insertmacro MUI_PAGE_FINISH ;마지막 페이지

# 언어 파일 설정 ------------------------------------------------------------
; 본 항목은 반드시 페이지 삽입 보다 뒤에 와야 합니다.
!insertmacro MUI_LANGUAGE "Korean"


# 사용자 정보 입력 페이지의 제목 ------------------------------------------------------------
; 본 항목은 반드시 언어 파일 설정 보다 뒤에 와야 합니다.
LangString TEXT_IO_TITLE ${LANG_KOREAN} "사용자 정보 입력"
LangString TEXT_IO_SUBTITLE ${LANG_KOREAN} "올바른 설치를 위해 사용자 정보를 입력하십시요."


# 섹션 삽입 함수 ------------------------------------------------------------

Function WTFyn ;설치된 것과 중복되는 계정명이 있는지 검사
Pop "$RE_ACCOUNT_TOTAL"
StrCpy $1 0
account:
  EnumRegKey "$3" "${PRODUCT_DIR_ROOT_REGKEY}" "${PRODUCT_DIR_REGKEY}" $1
  StrCmp "$3" "" end
  IntOp $1 $1 + 1
  StrCpy "$INI_ACCOUNT" "$3"
StrCpy $4 0
server:
  StrCpy "$5" "${PRODUCT_DIR_REGKEY}$INI_ACCOUNT"
  EnumRegKey "$6" "${PRODUCT_DIR_ROOT_REGKEY}" "$5" $4
  StrCmp "$6" "" account
  IntOp $4 $4 + 1
  StrCpy "$INI_SERVER" "$6"
StrCpy $7 0
character:
  StrCpy "$8" "$5$INI_SERVER"
  EnumRegKey "$9" "${PRODUCT_DIR_ROOT_REGKEY}" "$8" $7
  StrCmp "$9" "" server
  IntOp $7 $7 + 1
  StrCpy "$INI_CHARACTER" "$9"
  StrCpy "$2" "$8$INI_CHARACTER"
  ReadRegStr "$0" "${PRODUCT_DIR_ROOT_REGKEY}" "$2" "설치여부"
  StrCmp "$0" "yes" 0 +2
  StrCpy "$RE_ACCOUNT_TOTAL" "$RE_ACCOUNT_TOTAL$n$INI_ACCOUNT"
  Goto character
end:
  Push "$RE_ACCOUNT_TOTAL"
FunctionEnd

Function WTFLoop ;레지스트리에 생성된 사용자 정보에 따라 WTF폴더내 내용의 생성과 복사
Pop "$RE_ACCOUNT_TOTAL"
StrCpy $1 0

CopyFiles "$INSTDIRvar$INI_VIEW*.*" "$INSTDIR"


account:
  EnumRegKey "$3" "${PRODUCT_DIR_ROOT_REGKEY}" "${PRODUCT_DIR_REGKEY}" $1
  StrCmp "$3" "" end
  IntOp $1 $1 + 1
  StrCpy "$INI_ACCOUNT" "$3"
StrCpy $4 0

server:
  StrCpy "$5" "${PRODUCT_DIR_REGKEY}$INI_ACCOUNT"
  EnumRegKey "$6" "${PRODUCT_DIR_ROOT_REGKEY}" "$5" $4
  StrCmp "$6" "" account
  IntOp $4 $4 + 1
  StrCpy "$INI_SERVER" "$6"
StrCpy $7 0

character:
  ClearErrors
  StrCpy "$8" "$5$INI_SERVER"
  EnumRegKey "$9" "${PRODUCT_DIR_ROOT_REGKEY}" "$8" $7
  StrCmp "$9" "" server
  IntOp $7 $7 + 1
  StrCpy "$INI_CHARACTER" "$9"
  StrCpy "$2" "$8$INI_CHARACTER"
  ReadRegStr "$0" "${PRODUCT_DIR_ROOT_REGKEY}" "$2" "설치여부"
  StrCmp "$0" "yes" character install
 
install:
  StrCmp "$0" "re" installAccount
  ${WordFind} "$RE_ACCOUNT_TOTAL" "$INI_ACCOUNT" "#" $RE_ACCOUNT_NUM
  StrCmp $RE_ACCOUNT_NUM "no" installAccount installServer
 
installAccount:
  CreateDirectory "$INSTDIRWTFAccount$INI_ACCOUNT"
  CreateDirectory "$INSTDIRWTFAccount$INI_ACCOUNTSavedVariables"
  CopyFiles /FILESONLY "$INSTDIRWTFAccount계정명*.*" "$INSTDIRWTFAccount$INI_ACCOUNT"
  CopyFiles "$INSTDIRWTFAccount계정명SavedVariables" "$INSTDIRWTFAccount$INI_ACCOUNTSavedVariables"
 
## 단축키,매크로 설정 복사
#  CopyFiles /FILESONLY "$INSTDIROldWTFAccount$INI_ACCOUNTbindings-cache.wtf" "$INSTDIRWTFAccount$INI_ACCOUNTbindings-cache.wtf"
#  CopyFiles /FILESONLY "$INSTDIROldWTFAccount$INI_ACCOUNTmacros-cache.txt" "$INSTDIRWTFAccount$INI_ACCOUNTmacros-cache.txt"
 goto installserver
 
installServer:
  CreateDirectory "$INSTDIRWTFAccount$INI_ACCOUNT$INI_SERVER"
 CopyFiles "$INSTDIRWTFAccount계정명서버명케릭명" "$INSTDIRWTFAccount$INI_ACCOUNT$INI_SERVER$INI_CHARACTER"
 
  ## 개인매크로,단축키 설정 복사
#  CopyFiles /FILESONLY "$INSTDIROldWTFAccount$INI_ACCOUNT$INI_SERVER$INI_CHARACTERmacros-cache.txt" "$INSTDIRWTFAccount$INI_ACCOUNT$INI_SERVER$INI_CHARACTERmacros-cache.txt"
#  CopyFiles /FILESONLY "$INSTDIROldWTFAccount$INI_ACCOUNT$INI_SERVER$INI_CHARACTERbindings-cache.wtf" "$INSTDIRWTFAccount$INI_ACCOUNT$INI_SERVER$INI_CHARACTERbindings-cache.wtf"
#  CopyFiles /FILESONLY "$INSTDIROldWTFAccount$INI_ACCOUNT$INI_SERVER$INI_CHARACTERchat-cache.txt" "$INSTDIRWTFAccount$INI_ACCOUNT$INI_SERVER$INI_CHARACTERchat-cache.txt"

  CreateDirectory "$INSTDIRWTFAccount$INI_ACCOUNT$INI_SERVER$INI_CHARACTERSavedVariables"
#  CopyFiles /FILESONLY "$INSTDIROldWTFAccount$INI_ACCOUNT$INI_SERVER$INI_CHARACTERSavedVariablesBlinkChatHead.lua" "$INSTDIRWTFAccount$INI_ACCOUNT$INI_SERVER$INI_CHARACTERSavedVariablesBlinkChatHead.lua"

  WriteRegExpandStr "${PRODUCT_DIR_ROOT_REGKEY}" "$2" "설치여부" "yes"
  goto character

end:
  Push "$RE_ACCOUNT_TOTAL"

FunctionEnd


# 기본 섹션 ------------------------------------------------------------

Section "!캐릭터 추가" Basic_SEC
  SectionIn RO
  SetOverwrite on
  SetOutPath "$INSTDIR"
  SetOverwrite on

  Call WTFyn

  StrCmp $VER 1 copy

  copy:
  ## 파일 복사
  File /a /r "C:UsersAdministratorDesktopCharacterBasic" ;필수 항목으로 집어넣을 파일이 위치한 경로입니다. 개인에 맞게 수정 !! (기본 섹션)

  ## 여러 케릭의 WTF폴더 설치 함수
  Call WTFLoop
 
SectionEnd


# 섹션에 대한 설명 ------------------------------------------------------------
; 개인에 맞게 수정해야 하는 부분 !!
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${Basic_SEC} "캐릭터에 대한 추가 설치"
!insertmacro MUI_FUNCTION_DESCRIPTION_END