2.1. Lua 설치 및 셋팅 ¶
알아야 할것 : Eclipse Plugin깔기
다음에 할것 : 초성 뽑기 연습, 와우 애드온 문법, 와우 애드온 설치, 루아 문법, 와우 루아 연동
다음에 할것 : 초성 뽑기 연습, 와우 애드온 문법, 와우 애드온 설치, 루아 문법, 와우 루아 연동
WOW의 애드온은 Lua나 Ruby와 같은 스크립트 언어를 사용하는것으로 알고있다.
그래서 Programming in Lua라는 책을 도서관에서 빌려왔다. 아마 빌려온지 1주일은 됬겠지.
Lua 개발환경을 셋팅하는데 좀 걸렸다.
Lua-Eclipse를 받아서 깔고. (LunarEclipse라는 것도 있단다)
Eclipse에서 Java외의 다른것을 돌리려면 당연 인터프리터나 컴파일러를 설치해주어야 한다. 그래서 Lua를 설치하려했다. LuaProfiler나 LuaInterpreter를 설치해야한다는데 도통 영어를 못읽겠다 나의 무식함이 드러났다.
여튼 어찌어찌해서
5.1.4-35 2010-04-07 13:09
LuaForWindows_v5.1.4-35.exe
LuaForWindows_v5.1.4-35.exe
얏호. 설치.
설치된경로를 따라 Eclipse의 Profiler말고 Interpreter로 lua.exe로 path를 설정해주면 Eclipse에서 Project를 만든뒤 출력되는 Lua파일을 볼수 있다.
2.2. 초성 뽑기 연습 in 자바 ¶
알아야 할것 : Java Project 만들기, 기본 자바 코딩
다음에 할것 : 와우 애드온 문법 배우기, 와우 애드온 설치, 루아 문법, 와우 루아 연동
다음에 할것 : 와우 애드온 문법 배우기, 와우 애드온 설치, 루아 문법, 와우 루아 연동
WOW애드온 초성퀴즈를 만들기위함이기 때문에.
당연히 한글의 초성을 빼올수 있어야한다.
그래서 찾아봤더니 UTF-8방식으로 빼올수 있다고 한다.
근데 이상한데 UNICODE에서 계산해서 빼오더구만.
추가 : 알고보니 UNICODE를 포함하는 방식중 하나라고한다. 근데 더 모르겠는데... U-00000800 - U-0000FFFF 범위에 들어간다고 하는데??
아악 모르겠어!! 그래서 추가로 링크를 걸어본다.
추가 : 알고보니 UNICODE를 포함하는 방식중 하나라고한다. 근데 더 모르겠는데... U-00000800 - U-0000FFFF 범위에 들어간다고 하는데??
아악 모르겠어!! 그래서 추가로 링크를 걸어본다.
http://blog.naver.com/declspec?Redirect=Log&logNo=10092640244
http://divestudy.tistory.com/8
링크가 안없어지길.
http://divestudy.tistory.com/8
링크가 안없어지길.
우선 자바 코드는 다음과 같다.
~java package utfencoding; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class UtfEncoding { final static char[] first = { 'ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','o','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ' }; final static char[] middle = { 'ㅏ','ㅐ','ㅑ','ㅒ','ㅓ','ㅔ','ㅕ','ㅖ','ㅗ','ㅠ','ㅘ','ㅛ','ㅙ','ㅚ','ㅜ','ㅝ','ㅞ','ㅟ','ㅡ','ㅢ','ㅣ' }; final static char[] last = { '\0','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄽ','ㄾ','ㄿ','ㅀ','ㅁ','ㅂ','ㅄ','ㅅ','ㅆ','o','ㅈ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ' }; /** * @param args */ public static void main(String[] args) { String temp = "바"; char a = temp.charAt(0); a = (char) (a - 0xAC00); int cho = a/21/28; int joong = ( (a %(21*28))/28); int jong = (a%28); System.out.println(""+ (char)first[cho] + (char)middle[joong] + (char)last[jong]); } }
보면 알겠지만 자바에서 작성되는건 UNICoDE이다(아마도?)
현재 Eclipse개발환경중 문자 Encoding은 UTF-8방식이다.
거기서 한글을 빼온후 UTF-8에 따라 0xACC00 (<- UTF-8시작) 을 빼고 초성 중성 종성을 다음으로 빼온다
거기서 한글을 빼온후 UTF-8에 따라 0xACC00 (<- UTF-8시작) 을 빼고 초성 중성 종성을 다음으로 빼온다
초성 = (원문자 /21 /28)
중성 = ( (원문자%(21*28))/28)
종성 = ( a%28)
중성 = ( (원문자%(21*28))/28)
종성 = ( a%28)
이렇게 하고 문자 규칙에 따라 빼온다.
규칙은 위의 코드를 보면 알수 있다.
규칙은 위의 코드를 보면 알수 있다.
2.3. 첫 와우 AddOn Hello WOW! ¶
알아야 할것 : 와우 애드온 폴더 위치, 애드온 설치법, 애드온 만들때 기본 설정, 와우 API 문법, Lua 기본 문법
다음에 할것 : 샘플 lua 파일로 아이템 이름 불러오기, 애드온 명령어 실행, 초성 퀴즈 시나리오, 초성 분리
다음에 할것 : 샘플 lua 파일로 아이템 이름 불러오기, 애드온 명령어 실행, 초성 퀴즈 시나리오, 초성 분리
천리길도 Hello World!부터라는 지론에 따라
어떻게 연동되는지를 살펴보겠다.
어떻게 연동되는지를 살펴보겠다.
기본 프로그램 정보를 담고있는 *.toc파일.
그리고 UI와 LUA를 Mapping 시켜주는 *.xml
그리고 연산을 해주는 *.lua
그리고 UI와 LUA를 Mapping 시켜주는 *.xml
그리고 연산을 해주는 *.lua
작성을 해보자
기본적으로 "/World of Warcraft/interface/addons/애드온명" 으로 폴더가 만들어져있어야한다.
그리고 HelloWoW.toc으로 기본설정을 잡아야하고
toc에 정보를 넣어주어야한다.
http://www.wowwiki.com/Getting_the_current_interface_number
로 현재 인터페이스 정보를 알아볼수 있다.
내가 작성하는건 4.2니까 40200이겠지 인터페이스 정보를 갱신안해놓으면 와우 애드온 로드시 '구버전'으로 제대로 로드가 안될 수 있다.
toc에 정보를 넣어주어야한다.
HelloWoW.toc ---------------------------- ##Interface:40200 ##Title:HelloWOW ##Notes:Example HelloWoW.xml HelloWoW.lua ---------------------------Interface에는 현재 버전 정보가 들어가있다.
http://www.wowwiki.com/Getting_the_current_interface_number
로 현재 인터페이스 정보를 알아볼수 있다.
내가 작성하는건 4.2니까 40200이겠지 인터페이스 정보를 갱신안해놓으면 와우 애드온 로드시 '구버전'으로 제대로 로드가 안될 수 있다.
Title은 짐작대로고
노트는 그냥 설명이고
Author도 있음.
노트는 그냥 설명이고
Author도 있음.
HelloWoW.xml ---------------------------------------- <UI xmlns="http://www.blizzard.com/wow/ui" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui"> <script file="HelloWoW.lua"/> <Frame name="HelloWoWFrame"> <Scripts> <OnLoad> HelloWoW_ShowMessage(); </OnLoad> </Scripts> </Frame> </UI> ---------------------------------
HelloWoW.lua --------------------------------- function HelloWoW_ShowMessage() message("Hello WOW!"); end ---------------------------------Lua 기본문법이다. 위는 함수만들기 예제. message("")는 와우에서 제공하는 API
이렇게 작성하고 와우 인터페이스를 실행시키면 Hello WOW!가 뜬다.
2.4. WOW에서 API를 이용한 Item 불러오기 연습 ¶
WOW는 WOW API를 소개해주는 wiki를 가지고 있고 API를 가보면 다양한것들이 있다.
http://www.wowwiki.com/World_of_Warcraft_API
또한 Widget과 LuaFunction의 사용정보를 볼수 있다.
http://www.wowwiki.com/World_of_Warcraft_API
또한 Widget과 LuaFunction의 사용정보를 볼수 있다.
여기서 아이템 초성 퀴즈의 기본은 아이템 이름 DB를 검색할수 있어야한다. 근데 WOW아이템은 현재 아이템 넘버만 7만을 넘는다. 중간중간 비어있는 index도 있다. 이게 뭥미. 아마 suffix때문일것으로 예상된다. suffix란 아이템에 부가적으로 붙은 옵션을 item index에수치화 한것을 부르는 말인데 그것에 따라 아이템의 index가 결정되는것 같더라. (아직 정확히는 모른다)
그리고 아이템 리스트를 한꺼번에 뽑는것을 지원해주는 것이 아니라서 누구드랍, 블루아이템 같은 애드온은 심지어 아이템 ID와 캐시 정보까지 구해놓고 있더만.. 까보고 놀랐네.
와우 게임정보 공식 사이트에 가면 아이템은 50760개라고 나와있다.
4.2 전율하는 불의땅의 아이템이 공개 후에 업데이트 된것이다.
4.2 전율하는 불의땅의 아이템이 공개 후에 업데이트 된것이다.
저 번호에 아이템 넘버를 넣으면 해당 아이템 정보가 들어가있는 페이지로 이동하게 된다. DB를 WOW안에서와 웹페이지 똑같이 관리 하는것 같은데 이렇게 똑같이 되있으니까 좋다. 사실 Addon에서 페이지에서 하나 빼오는걸로 생각했지만 가장 좋다고 생각하는것은 블루아이템과 누구드랍처럼 아이템 이름을 보관해놓고 Addon을 돌려보는것이 정신건강에 이로울것이라고 생각했다.
아직 WOW addon에 대해서 모르는것도 있고. WOW에서 사용하는 몇몇 자료구조가 특이한건 알겠다. 젠장. Item에 뭔 부가정보가 그렇게 많이 붙어!! 여튼 그것에 대해서는 한번 다시 다루어보아야겠다.
HelloWoW를 수정해서 만든것을 한번 다시 보자
--------------------------------------- function HelloWoW_ShowMessage() local baseName local count = 1 local base = {} baseName = GetItemInfo(25) for i=25, 70000 do baseName = GetItemInfo(i) if count > 10000 then break end if baseName ~= nil then base[count] = baseName count = count+1 end end for i = 1, #base do print(base[i]) end end --------------------------우선 일단 아직 아이템 번호는 7만을 넘지 않는다 wow아이템정보에 관한건 나중에 조사하기로 하고 그래서 i 는 와우 일반 item의 최소 시작값인 '낡은쇼트단검' 25부터 시작해서 1만개의 아이템을 검색해서 base테이블에 한개씩 저장해서 출력한다.
결과는 잘된다. 조금 느리겠지만 이걸 DB화해서 저장해놓았다가 해도 좋을듯 한다. 최적화따윈 우선 버리고 해보자.
수정 했다
아이템 정보 25번 부터 7만 사이의 랜덤변수를 불러와서
아이템 정보가 나온다면 출력!
아이템들을 모두 가져오는것 보단 빠르다. 안전하진 않지만..
아이템 정보가 나온다면 출력!
아이템들을 모두 가져오는것 보단 빠르다. 안전하진 않지만..
----------------------------------------- function HelloWoW_ShowMessage() local baseName = nil repeat i = random(25,70000) baseName = GetItemInfo(i) until baseName ~= nil print(baseName) end ----------------------------------
2.5. Lua에서 초성 빼오기 ¶
Lua에서 초성을 빼오게 되었다
황현이 준 UTF-8로 첫 바이트로 뒤에 몇바이트를 차지하는 문자인지 보여주는 도표를 가지고 Lua로 바꾸어보았다.
황현이 준 UTF-8로 첫 바이트로 뒤에 몇바이트를 차지하는 문자인지 보여주는 도표를 가지고 Lua로 바꾸어보았다.
헤더 바이트의 값의 범위로 한 UTF-8 글자의 바이트 수 알아내기 00000000 ~ 01111111 : 1 byte (0 ~ 127) 11000000 ~ 11011111 : 2 bytes (192 ~ 223) 11100000 ~ 11101111 : 3 bytes (224 ~ 239) 11110000 ~ 11110111 : 4 bytes (240 ~ 247) 11111000 ~ 11111011 : 5 bytes (248 ~ 251) 11111100 ~ 11111101 : 6 bytes (252 ~ 253)
아래 함수는 문자열이 들어오면 몇 byte 문자인지 알려주는 함수이다
~lua function charLen(str) calc = string.byte(str:sub(1,1)) --lua에서 byte로 char형을 변환하면 0이상이 나온다. if(calc >= 0 and calc <= 127) then return 1 elseif(calc >= 192 and calc <= 223) then return 2 elseif(calc >= 224 and calc <= 239) then return 3 elseif(calc >= 240 and calc <= 247) then return 4 elseif(calc >= 248 and calc <= 251) then return 5 elseif(calc >= 252 and calc <= 253) then return 6 else return 0 end end
다시한번 말하자면 한글은 3byte이다.
이제 3byte를 찾을수 있으니 영문과 특수문자가 섞여있어도 초성만 뽑아내는데는 아무 문제 없을것이다.
자 이제 한글을 받아와서 초성만 뽑아 보자.
이제 3byte를 찾을수 있으니 영문과 특수문자가 섞여있어도 초성만 뽑아내는데는 아무 문제 없을것이다.
자 이제 한글을 받아와서 초성만 뽑아 보자.
~lua Chosung = {"ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","ㅁ","ㅂ","ㅃ","ㅅ","ㅆ","o","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"}; Middle = {"ㅏ","ㅐ","ㅑ","ㅒ","ㅓ","ㅔ","ㅕ","ㅖ","ㅗ","ㅠ","ㅘ","ㅛ","ㅙ","ㅚ","ㅜ","ㅝ","ㅞ","ㅟ","ㅡ","ㅢ","ㅣ"}; Last = { "\0","ㄱ","ㄲ","ㄳ","ㄴ","ㄵ","ㄶ","ㄷ","ㄹ","ㄺ","ㄻ","ㄽ","ㄾ","ㄿ","ㅀ","ㅁ","ㅂ","ㅄ","ㅅ","ㅆ","o","ㅈ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"}; function samplingFirst(str) -- 1110xxxx 10yyyyzz 10zzwwww local first = string.byte(str:sub(1,1)) - 224 -- 1110xxxx local second = math.floor((string.byte(str:sub(2,2)) - 128)/4) local third = math.floor((string.byte(str:sub(2,2))%4)*4 + (string.byte(str:sub(3,3)) - 128)/16) local fourth = math.floor(string.byte(str:sub(3,3))%16) local unicode = first * 16* 16* 16 + second * 16 * 16 + third * 16 + fourth unicode = unicode - 0xAC00 local cho = math.floor(unicode / 21/ 28) local goong = math.floor((unicode % (21*28))/28) local jong = math.floor((unicode % 28)) return Chosung[cho+1]; end
이제 한글 문자열을 집어넣는다면 초성만 빼와주는것을 발견할수 있다. Lua에서 초성 ㄱ은 3byte로 인식되기 때문에 캐릭터형 'ㄱ'으로 감싸면 환경에 따라 에러가 날수 있다. 따라서 문자열 " "로 감싸주었다.
이제 이것을 이용하여 "카르가스\:얼라이언스\:Aldiana"를 한글은 초성만 뽑고 그 외는 그냥 보존해서 출력해 보는것을 연습해보자
~lua function cstc(len, str) return {type = len, body = str}; end function makingTable(str) stringtable = {} for i = 1, #str do len = charLen(str:sub(i,i)) if len ~= 0 then -- 이거 안좋은데.. stringtable[#stringtable+1] = cstc(len, str:sub(i,i+len-1)) end end chosungtable = {} for i, v in ipairs(stringtable) do if v.type == 3 then chosungtable[#chosungtable+1] = cstc(v.type, samplingFirst(v.body)) else chosungtable[#chosungtable+1] = cstc(v.type, v.body) end end return stringtable, chosungtable end local a = "카르가스\:얼라이언스\:Aldiana" t,x = makingTable(a) for i, v in ipairs(t) do print(v.type .. " " .. v.body) end for i, v in ipairs(x) do print(v.type .. " " .. v.body) end 출력결과 : 카르가스:얼라이언스:Aldiana ㅋㄹㄱㅅ:ㅇㄹㅇㅇㅅ:Aldiana
자 아이템 목록도 불러왔고 초성도 빼왔으니 합치는걸로 가보자
2.6. WOW SlashCommand 작성 ¶
와우 애드온을 lua와 합치는 작업중에 하나.
Addon에게 명령내리기를 해보자.
와우에는 SlashCommand란 것이 있다. 그게 뭐냐면..
/명령어 이렇게 생겼다.
해당 명령어를 실행하면 Command창에서 해당 명령어를 실행하게 된다.
Addon을 만들고 초성퀴즈는 SlashCommand로 시작하게 할려고한다.
/초성퀴즈 시작 30
하면 30개의 문제가 진행된다.
하면 30개의 문제가 진행된다.
이외에도 기본셋팅이 필요하기도 하고 진행 시나리오도 짜야하지만 우선 SlashCommand로 작동시켜보자.
SlashCommand에 등록시키는것을 알아보자.
SLASH_애드온명# = '/명칭'으로 변수를 설정해주면
WOW에서 '/명칭' 명령어는 msg를 들고 function으로 들어가게 된다.
~lua function HelloWoW_ShowMessage(self) SLASH_HelloWoW1 = '/hiw'; SLASH_HelloWoW2 = '/hellow'; SLASH_HelloWoW3 = '/HelloWOW'; SlashCmdList["HelloWoW"] = function (msg) HelloWoWF(msg) end end function HelloWoWF(msg, editbox) -- 4. print("Hello WOW") end 와우 입력 :/hiw 와우 시스템 출력 : Hello WOW
SlashCmdList["애드온명"]
= function(msg) 를 하고 SLASH_애드온명# = '/명칭'으로 변수를 설정해주면
WOW에서 '/명칭' 명령어는 msg를 들고 function으로 들어가게 된다.
위의 예제에서는 3개의 명칭이 있는것이다
각각 실행하면 같은 결과가 나오는것을 알수 있다.
다음에 할일은 String 파싱으로 시나리오를 꾸며보자.