forked from metin2/client
1
0
Fork 0

add: Owsap quest renewal and GetTextLength + GetTextWindow.

This commit is contained in:
WildEgo 2024-06-01 18:46:41 +01:00
parent 13496016cf
commit 16e75e310c
63 changed files with 3427 additions and 1188 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1004 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1,7 @@
title subImage
version 1.0
image "form_lang_01.dds"
left 0
top 32
right 210
bottom 48

View File

@ -0,0 +1,7 @@
title subImage
version 1.0
image "form_lang_01.dds"
left 0
top 16
right 210
bottom 32

View File

@ -0,0 +1,7 @@
title subImage
version 1.0
image "form_lang_01.dds"
left 0
top 68
right 210
bottom 84

View File

@ -0,0 +1,7 @@
title subImage
version 1.0
image "form_lang_01.dds"
left 0
top 50
right 210
bottom 66

View File

@ -0,0 +1,7 @@
title subImage
version 1.0
image "form_lang_01.dds"
left 0
top 0
right 210
bottom 16

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -343,3 +343,11 @@ WHISPER_REPORT
WHISPER_SEND Poslat WHISPER_SEND Poslat
YES Ano YES Ano
ZONE_MAP Velká mapa ZONE_MAP Velká mapa
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -324,3 +324,11 @@ WHISPER_REPORT report
WHISPER_SEND Senden WHISPER_SEND Senden
YES Ja YES Ja
ZONE_MAP Übersichtskarte ZONE_MAP Übersichtskarte
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -343,3 +343,11 @@ WHISPER_REPORT
WHISPER_SEND Send WHISPER_SEND Send
YES Ja YES Ja
ZONE_MAP Stort kort ZONE_MAP Stort kort
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -324,3 +324,11 @@ WHISPER_REPORT
WHISPER_SEND Send WHISPER_SEND Send
YES Yes YES Yes
ZONE_MAP Large Map ZONE_MAP Large Map
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -343,3 +343,11 @@ WHISPER_REPORT
WHISPER_SEND Enviar WHISPER_SEND Enviar
YES Sí YES Sí
ZONE_MAP Mapa grande ZONE_MAP Mapa grande
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -810,3 +810,11 @@ UPLOAD_MARK_CHECK_NEED_RECONNECT Le t
UPLOAD_MARK_UPLOAD_NEED_RECONNECT Le téléchargement doit être recommencer. UPLOAD_MARK_UPLOAD_NEED_RECONNECT Le téléchargement doit être recommencer.
USE_ITEM_FAILURE_PRIVATE_SHOP Vous ne pouvez pas utiliser d'objet tant que votre magasin privé est ouvert. USE_ITEM_FAILURE_PRIVATE_SHOP Vous ne pouvez pas utiliser d'objet tant que votre magasin privé est ouvert.
USE_SKILL_ERROR_UNKNOWN Erreur compétence inconnue: %s USE_SKILL_ERROR_UNKNOWN Erreur compétence inconnue: %s
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -343,3 +343,11 @@ WHISPER_REPORT
WHISPER_SEND Αποστολή WHISPER_SEND Αποστολή
YES Ναι YES Ναι
ZONE_MAP Μεγάλος Χάρτης ZONE_MAP Μεγάλος Χάρτης
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -324,3 +324,11 @@ WHISPER_REPORT
WHISPER_SEND Küld WHISPER_SEND Küld
YES Igen YES Igen
ZONE_MAP Nagy térkép ZONE_MAP Nagy térkép
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -343,3 +343,11 @@ WHISPER_REPORT
WHISPER_SEND Invia WHISPER_SEND Invia
YES Sì. YES Sì.
ZONE_MAP Mappa grande ZONE_MAP Mappa grande
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -343,3 +343,11 @@ WHISPER_REPORT Report
WHISPER_SEND Stuur WHISPER_SEND Stuur
YES Ja YES Ja
ZONE_MAP Grote Map ZONE_MAP Grote Map
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -343,3 +343,11 @@ WHISPER_REPORT
WHISPER_SEND Wyœlij WHISPER_SEND Wyœlij
YES Tak YES Tak
ZONE_MAP Podgl¹d Mapy ZONE_MAP Podgl¹d Mapy
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -343,3 +343,11 @@ WHISPER_REPORT
WHISPER_SEND Enviar WHISPER_SEND Enviar
YES Sim YES Sim
ZONE_MAP Mapa Grande ZONE_MAP Mapa Grande
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -343,3 +343,11 @@ WHISPER_REPORT
WHISPER_SEND Trimite WHISPER_SEND Trimite
YES Da YES Da
ZONE_MAP Hartã mare ZONE_MAP Hartã mare
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -343,3 +343,11 @@ WHISPER_REPORT
WHISPER_SEND Îòïðàâèòü WHISPER_SEND Îòïðàâèòü
YES äà YES äà
ZONE_MAP Áîëüøàÿ êàðòà ZONE_MAP Áîëüøàÿ êàðòà
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -343,3 +343,11 @@ WHISPER_REPORT
WHISPER_SEND Gönder WHISPER_SEND Gönder
YES Evet YES Evet
ZONE_MAP Genel Görünüm Haritasý ZONE_MAP Genel Görünüm Haritasý
QUEST_UI_TEXT_COLLECTION Biologist Quests
QUEST_UI_TEXT_DAILY Daily Quest
QUEST_UI_TEXT_EVENT Event Missions
QUEST_UI_TEXT_LEVELUP Hunting Mission
QUEST_UI_TEXT_MAIN Main Quests
QUEST_UI_TEXT_SCROLL Mission Book Quests
QUEST_UI_TEXT_SUB Side Quests
QUEST_UI_TEXT_SYSTEM Game Missions

View File

@ -117,7 +117,7 @@ class GameWindow(ui.ScriptWindow):
self.playerGauge = uiPlayerGauge.PlayerGauge(self) self.playerGauge = uiPlayerGauge.PlayerGauge(self)
self.playerGauge.Hide() self.playerGauge.Hide()
#wj 2014.1.2. ESC키를 누를 시 우선적으로 DropQuestionDialog를 끄도록 만들었다. 하지만 처음에 itemDropQuestionDialog가 선언되어 있지 않아 ERROR가 발생하여 init에서 선언과 동시에 초기화 시킴. #wj 2014.1.2. ESCŰ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><EFBFBD><ECBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DropQuestionDialog<6F><67> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> itemDropQuestionDialog<6F><67> <20><><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾ<EFBFBD> ERROR<4F><52> <20>߻<EFBFBD><DFBB>Ͽ<EFBFBD> init<69><74><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ÿ<EFBFBD> <20>ʱ<EFBFBD>ȭ <20><>Ŵ.
self.itemDropQuestionDialog = None self.itemDropQuestionDialog = None
self.__SetQuickSlotMode() self.__SetQuickSlotMode()
@ -226,7 +226,7 @@ class GameWindow(ui.ScriptWindow):
exception.Abort("GameWindow.Open") exception.Abort("GameWindow.Open")
# END_OF_START_GAME_ERROR_EXIT # END_OF_START_GAME_ERROR_EXIT
# NPC가 큐브시스템으로 만들 수 있는 아이템들의 목록을 캐싱 # NPC<EFBFBD><EFBFBD> ť<><C5A5>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><DBB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3>
# ex) cubeInformation[20383] = [ {"rewordVNUM": 72723, "rewordCount": 1, "materialInfo": "101,1&102,2", "price": 999 }, ... ] # ex) cubeInformation[20383] = [ {"rewordVNUM": 72723, "rewordCount": 1, "materialInfo": "101,1&102,2", "price": 999 }, ... ]
self.cubeInformation = {} self.cubeInformation = {}
self.currentCubeNPC = 0 self.currentCubeNPC = 0
@ -314,10 +314,10 @@ class GameWindow(ui.ScriptWindow):
def __BuildKeyDict(self): def __BuildKeyDict(self):
onPressKeyDict = {} onPressKeyDict = {}
##PressKey 는 누르고 있는 동안 계속 적용되는 키이다. ##PressKey <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>Ǵ<EFBFBD> Ű<>̴<EFBFBD>.
## 숫자 단축키 퀵슬롯에 이용된다.(이후 숫자들도 퀵 슬롯용 예약) ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ű <20><><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD> <20>̿<EFBFBD>ȴ<EFBFBD>.(<28><><EFBFBD><EFBFBD> <20><><EFBFBD>ڵ鵵 <20><> <20><><EFBFBD>Կ<EFBFBD> <20><><EFBFBD><EFBFBD>)
## F12 는 클라 디버그용 키이므로 쓰지 않는 게 좋다. ## F12 <EFBFBD><EFBFBD> Ŭ<><C5AC> <20><><EFBFBD><EFBFBD>׿<EFBFBD> Ű<>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
onPressKeyDict[app.DIK_1] = lambda : self.__PressNumKey(1) onPressKeyDict[app.DIK_1] = lambda : self.__PressNumKey(1)
onPressKeyDict[app.DIK_2] = lambda : self.__PressNumKey(2) onPressKeyDict[app.DIK_2] = lambda : self.__PressNumKey(2)
onPressKeyDict[app.DIK_3] = lambda : self.__PressNumKey(3) onPressKeyDict[app.DIK_3] = lambda : self.__PressNumKey(3)
@ -337,7 +337,7 @@ class GameWindow(ui.ScriptWindow):
onPressKeyDict[app.DIK_SYSRQ] = lambda : self.SaveScreen() onPressKeyDict[app.DIK_SYSRQ] = lambda : self.SaveScreen()
onPressKeyDict[app.DIK_SPACE] = lambda : self.StartAttack() onPressKeyDict[app.DIK_SPACE] = lambda : self.StartAttack()
#캐릭터 이동키 #ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>Ű
onPressKeyDict[app.DIK_UP] = lambda : self.MoveUp() onPressKeyDict[app.DIK_UP] = lambda : self.MoveUp()
onPressKeyDict[app.DIK_DOWN] = lambda : self.MoveDown() onPressKeyDict[app.DIK_DOWN] = lambda : self.MoveDown()
onPressKeyDict[app.DIK_LEFT] = lambda : self.MoveLeft() onPressKeyDict[app.DIK_LEFT] = lambda : self.MoveLeft()
@ -564,12 +564,12 @@ class GameWindow(ui.ScriptWindow):
self.TextureNum.SetFontName(localeInfo.UI_DEF_FONT) self.TextureNum.SetFontName(localeInfo.UI_DEF_FONT)
self.TextureNum.SetPosition(wndMgr.GetScreenWidth() - 270, 100) self.TextureNum.SetPosition(wndMgr.GetScreenWidth() - 270, 100)
# 오브젝트 그리는 개수 # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>׸<EFBFBD><D7B8><EFBFBD> <20><><EFBFBD><EFBFBD>
self.ObjectNum = ui.TextLine() self.ObjectNum = ui.TextLine()
self.ObjectNum.SetFontName(localeInfo.UI_DEF_FONT) self.ObjectNum.SetFontName(localeInfo.UI_DEF_FONT)
self.ObjectNum.SetPosition(wndMgr.GetScreenWidth() - 270, 120) self.ObjectNum.SetPosition(wndMgr.GetScreenWidth() - 270, 120)
# 시야거리 # <EFBFBD>þ߰Ÿ<EFBFBD>
self.ViewDistance = ui.TextLine() self.ViewDistance = ui.TextLine()
self.ViewDistance.SetFontName(localeInfo.UI_DEF_FONT) self.ViewDistance.SetFontName(localeInfo.UI_DEF_FONT)
self.ViewDistance.SetPosition(0, 0) self.ViewDistance.SetPosition(0, 0)
@ -659,8 +659,15 @@ class GameWindow(ui.ScriptWindow):
if self.interface: if self.interface:
self.interface.RefreshSkill() self.interface.RefreshSkill()
def RefreshQuest(self): if app.ENABLE_QUEST_RENEWAL:
self.interface.RefreshQuest() def RefreshQuest(self, quest_type, quest_index):
self.interface.RefreshQuest(quest_type, quest_index)
def DeleteQuest(self, quest_type, quest_index):
self.interface.DeleteQuest(quest_type, quest_index)
else:
def RefreshQuest(self):
self.interface.RefreshQuest()
def RefreshMessenger(self): def RefreshMessenger(self):
self.interface.RefreshMessenger() self.interface.RefreshMessenger()
@ -1302,7 +1309,7 @@ class GameWindow(ui.ScriptWindow):
self.__DropMoney(attachedType, attachedMoney) self.__DropMoney(attachedType, attachedMoney)
def __DropMoney(self, attachedType, attachedMoney): def __DropMoney(self, attachedType, attachedMoney):
# PRIVATESHOP_DISABLE_ITEM_DROP - 개인상점 열고 있는 동안 아이템 버림 방지 # PRIVATESHOP_DISABLE_ITEM_DROP - <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if uiPrivateShopBuilder.IsBuildingPrivateShop(): if uiPrivateShopBuilder.IsBuildingPrivateShop():
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP)
return return
@ -1324,7 +1331,7 @@ class GameWindow(ui.ScriptWindow):
self.itemDropQuestionDialog = itemDropQuestionDialog self.itemDropQuestionDialog = itemDropQuestionDialog
def __DropItem(self, attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount): def __DropItem(self, attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount):
# PRIVATESHOP_DISABLE_ITEM_DROP - 개인상점 열고 있는 동안 아이템 버림 방지 # PRIVATESHOP_DISABLE_ITEM_DROP - <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if uiPrivateShopBuilder.IsBuildingPrivateShop(): if uiPrivateShopBuilder.IsBuildingPrivateShop():
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP)
return return
@ -1456,7 +1463,7 @@ class GameWindow(ui.ScriptWindow):
def UpdateDebugInfo(self): def UpdateDebugInfo(self):
# #
# 캐릭터 좌표 및 FPS 출력 # ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ <20><> FPS <20><><EFBFBD>
(x, y, z) = player.GetMainCharacterPosition() (x, y, z) = player.GetMainCharacterPosition()
nUpdateTime = app.GetUpdateTime() nUpdateTime = app.GetUpdateTime()
nUpdateFPS = app.GetUpdateFPS() nUpdateFPS = app.GetUpdateFPS()
@ -1619,22 +1626,22 @@ class GameWindow(ui.ScriptWindow):
def BINARY_Cube_Close(self): def BINARY_Cube_Close(self):
self.interface.CloseCubeWindow() self.interface.CloseCubeWindow()
# 제작에 필요한 골드, 예상되는 완성품의 VNUM과 개수 정보 update # <EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>ϼ<EFBFBD>ǰ<EFBFBD><C7B0> VNUM<55><4D> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> update
def BINARY_Cube_UpdateInfo(self, gold, itemVnum, count): def BINARY_Cube_UpdateInfo(self, gold, itemVnum, count):
self.interface.UpdateCubeInfo(gold, itemVnum, count) self.interface.UpdateCubeInfo(gold, itemVnum, count)
def BINARY_Cube_Succeed(self, itemVnum, count): def BINARY_Cube_Succeed(self, itemVnum, count):
print "큐브 제작 성공" print "ť<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
self.interface.SucceedCubeWork(itemVnum, count) self.interface.SucceedCubeWork(itemVnum, count)
pass pass
def BINARY_Cube_Failed(self): def BINARY_Cube_Failed(self):
print "큐브 제작 실패" print "ť<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
self.interface.FailedCubeWork() self.interface.FailedCubeWork()
pass pass
def BINARY_Cube_ResultList(self, npcVNUM, listText): def BINARY_Cube_ResultList(self, npcVNUM, listText):
# ResultList Text Format : 72723,1/72725,1/72730.1/50001,5 이런식으로 "/" 문자로 구분된 리스트를 줌 # ResultList Text Format : 72723,1/72725,1/72730.1/50001,5 <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "/" <20><><EFBFBD>ڷ<EFBFBD> <20><><EFBFBD>е<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>
#print listText #print listText
if npcVNUM == 0: if npcVNUM == 0:
@ -1735,7 +1742,7 @@ class GameWindow(ui.ScriptWindow):
# END_OF_CUBE # END_OF_CUBE
# 용혼석 # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>
def BINARY_Highlight_Item(self, inven_type, inven_pos): def BINARY_Highlight_Item(self, inven_type, inven_pos):
self.interface.Highligt_Item(inven_type, inven_pos) self.interface.Highligt_Item(inven_type, inven_pos)

View File

@ -45,6 +45,9 @@ import uiScriptLocale
import event import event
import localeInfo import localeInfo
if app.ENABLE_QUEST_RENEWAL:
import quest
IsQBHide = 0 IsQBHide = 0
class Interface(object): class Interface(object):
CHARACTER_STATUS_TAB = 1 CHARACTER_STATUS_TAB = 1
@ -295,12 +298,13 @@ class Interface(object):
self.__MakeCubeWindow() self.__MakeCubeWindow()
self.__MakeCubeResultWindow() self.__MakeCubeResultWindow()
# ACCESSORY_REFINE_ADD_METIN_STONE # ACCESSORY_REFINE_ADD_METIN_STONE
self.__MakeItemSelectWindow() self.__MakeItemSelectWindow()
# END_OF_ACCESSORY_REFINE_ADD_METIN_STONE # END_OF_ACCESSORY_REFINE_ADD_METIN_STONE
self.questButtonList = [] self.questButtonList = []
if app.ENABLE_QUEST_RENEWAL:
self.__MakeQuestButton()
self.whisperButtonList = [] self.whisperButtonList = []
self.whisperDialogDict = {} self.whisperDialogDict = {}
self.privateShopAdvertisementBoardDict = {} self.privateShopAdvertisementBoardDict = {}
@ -564,12 +568,13 @@ class Interface(object):
if app.ENABLE_DRAGON_SOUL_SYSTEM: if app.ENABLE_DRAGON_SOUL_SYSTEM:
self.wndDragonSoul.RefreshItemSlot() self.wndDragonSoul.RefreshItemSlot()
def RefreshCharacter(self): ## Character 페이지의 얼굴, Inventory 페이지의 전신 그림 등의 Refresh def RefreshCharacter(self): ## Character <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, Inventory <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׸<EFBFBD> <20><><EFBFBD><EFBFBD> Refresh
self.wndCharacter.RefreshCharacter() self.wndCharacter.RefreshCharacter()
self.wndTaskBar.RefreshQuickSlot() self.wndTaskBar.RefreshQuickSlot()
def RefreshQuest(self): if not app.ENABLE_QUEST_RENEWAL:
self.wndCharacter.RefreshQuest() def RefreshQuest(self):
self.wndCharacter.RefreshQuest()
def RefreshSafebox(self): def RefreshSafebox(self):
self.wndSafebox.RefreshSafebox() self.wndSafebox.RefreshSafebox()
@ -690,7 +695,7 @@ class Interface(object):
def RemovePartyMember(self, pid): def RemovePartyMember(self, pid):
self.wndParty.RemovePartyMember(pid) self.wndParty.RemovePartyMember(pid)
##!! 20061026.levites.퀘스트_위치_보정 ##!! 20061026.levites.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ_<EFBFBD><EFBFBD>ġ_<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
self.__ArrangeQuestButton() self.__ArrangeQuestButton()
def LinkPartyMember(self, pid, vid): def LinkPartyMember(self, pid, vid):
@ -705,7 +710,7 @@ class Interface(object):
def ExitParty(self): def ExitParty(self):
self.wndParty.ExitParty() self.wndParty.ExitParty()
##!! 20061026.levites.퀘스트_위치_보정 ##!! 20061026.levites.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ_<EFBFBD><EFBFBD>ġ_<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
self.__ArrangeQuestButton() self.__ArrangeQuestButton()
def PartyHealReady(self): def PartyHealReady(self):
@ -868,7 +873,7 @@ class Interface(object):
if True == self.wndChat.IsEditMode(): if True == self.wndChat.IsEditMode():
self.wndChat.CloseChat() self.wndChat.CloseChat()
else: else:
# 웹페이지가 열렸을때는 채팅 입력이 안됨 # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4> <20>Է<EFBFBD><D4B7><EFBFBD> <20>ȵ<EFBFBD>
if self.wndWeb and self.wndWeb.IsShow(): if self.wndWeb and self.wndWeb.IsShow():
pass pass
else: else:
@ -969,7 +974,7 @@ class Interface(object):
else: else:
self.wndExpandedTaskBar.Close() self.wndExpandedTaskBar.Close()
# 용혼석 # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>
def DragonSoulActivate(self, deck): def DragonSoulActivate(self, deck):
if app.ENABLE_DRAGON_SOUL_SYSTEM: if app.ENABLE_DRAGON_SOUL_SYSTEM:
self.wndDragonSoul.ActivateDragonSoulByExtern(deck) self.wndDragonSoul.ActivateDragonSoulByExtern(deck)
@ -1040,7 +1045,7 @@ class Interface(object):
if True == self.wndDragonSoulRefine.IsShow(): if True == self.wndDragonSoulRefine.IsShow():
self.wndDragonSoulRefine.Close() self.wndDragonSoulRefine.Close()
# 용혼석 끝 # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><>
def ToggleGuildWindow(self): def ToggleGuildWindow(self):
if not self.wndGuild.IsShow(): if not self.wndGuild.IsShow():
@ -1090,7 +1095,7 @@ class Interface(object):
def OpenWebWindow(self, url): def OpenWebWindow(self, url):
self.wndWeb.Open(url) self.wndWeb.Open(url)
# 웹페이지를 열면 채팅을 닫는다 # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20>ݴ´<DDB4>
self.wndChat.CloseChat() self.wndChat.CloseChat()
# show GIFT # show GIFT
@ -1118,9 +1123,9 @@ class Interface(object):
def SucceedCubeWork(self, itemVnum, count): def SucceedCubeWork(self, itemVnum, count):
self.wndCube.Clear() self.wndCube.Clear()
print "큐브 제작 성공! [%d:%d]" % (itemVnum, count) print "ť<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>! [%d:%d]" % (itemVnum, count)
if 0: # 결과 메시지 출력은 생략 한다 if 0: # <EFBFBD><EFBFBD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>
self.wndCubeResult.SetPosition(*self.wndCube.GetGlobalPosition()) self.wndCubeResult.SetPosition(*self.wndCube.GetGlobalPosition())
self.wndCubeResult.SetCubeResultItem(itemVnum, count) self.wndCubeResult.SetCubeResultItem(itemVnum, count)
self.wndCubeResult.Open() self.wndCubeResult.Open()
@ -1264,118 +1269,196 @@ class Interface(object):
##################################################################################### #####################################################################################
### Quest ### ### Quest ###
def BINARY_ClearQuest(self, index): if app.ENABLE_QUEST_RENEWAL:
btn = self.__FindQuestButton(index) def RefreshQuest(self, quest_type, quest_index):
if 0 != btn: self.wndCharacter.RefreshQuest(quest_type, quest_index)
self.__DestroyQuestButton(btn)
def RecvQuest(self, index, name): # Refresh quest button.
# QUEST_LETTER_IMAGE self.__RefreshQuestButton()
self.BINARY_RecvQuest(index, name, "file", localeInfo.GetLetterImageName())
# END_OF_QUEST_LETTER_IMAGE
def BINARY_RecvQuest(self, index, name, iconType, iconName): def DeleteQuest(self, quest_type, quest_index):
self.wndCharacter.DeleteQuest(quest_type, quest_index)
btn = self.__FindQuestButton(index) # Unused.
if 0 != btn: def ShowQuestButton(self):
self.__DestroyQuestButton(btn) pass
btn = uiWhisper.WhisperButton() def __OnClickQuestLetterButton(self, btn):
self.OpenCharacterWindowWithState("QUEST")
# QUEST_LETTER_IMAGE if btn.type == quest.QUEST_TYPE_EVENT:
##!! 20061026.levites.퀘스트_이미지_교체 self.wndCharacter.OpenQuestCategory(quest.QUEST_TYPE_EVENT, True)
import item
if "item"==iconType:
item.SelectItem(int(iconName))
buttonImageFileName=item.GetIconImageFileName()
else:
buttonImageFileName=iconName
if localeInfo.IsEUROPE(): self.HideAllQuestButton()
if "highlight" == iconType:
btn.SetUpVisual("locale/ymir_ui/highlighted_quest.tga")
btn.SetOverVisual("locale/ymir_ui/highlighted_quest_r.tga")
btn.SetDownVisual("locale/ymir_ui/highlighted_quest_r.tga")
else:
btn.SetUpVisual(localeInfo.GetLetterCloseImageName())
btn.SetOverVisual(localeInfo.GetLetterOpenImageName())
btn.SetDownVisual(localeInfo.GetLetterOpenImageName())
else:
btn.SetUpVisual(buttonImageFileName)
btn.SetOverVisual(buttonImageFileName)
btn.SetDownVisual(buttonImageFileName)
btn.Flash()
# END_OF_QUEST_LETTER_IMAGE
if localeInfo.IsARABIC():
btn.SetToolTipText(name, 0, 35)
btn.ToolTipText.SetHorizontalAlignCenter()
else:
btn.SetToolTipText(name, -20, 35)
btn.ToolTipText.SetHorizontalAlignLeft()
btn.SetEvent(ui.__mem_func__(self.__StartQuest), btn)
btn.Show()
btn.index = index
btn.name = name
self.questButtonList.insert(0, btn)
self.__ArrangeQuestButton()
#chat.AppendChat(chat.CHAT_TYPE_NOTICE, localeInfo.QUEST_APPEND)
def __ArrangeQuestButton(self):
screenWidth = wndMgr.GetScreenWidth()
screenHeight = wndMgr.GetScreenHeight()
##!! 20061026.levites.퀘스트_위치_보정
if self.wndParty.IsShow():
xPos = 100 + 30
else:
xPos = 20
if localeInfo.IsARABIC():
xPos = xPos + 15
yPos = 170 * screenHeight / 600
yCount = (screenHeight - 330) / 63
count = 0
for btn in self.questButtonList:
btn.SetPosition(xPos + (int(count/yCount) * 100), yPos + (count%yCount * 63))
count += 1
global IsQBHide global IsQBHide
if IsQBHide: IsQBHide = 1
btn.Hide()
def __MakeQuestButton(self):
btn = uiWhisper.WhisperButton()
btn.SetUpVisual(localeInfo.GetLetterCloseImageName())
btn.SetOverVisual(localeInfo.GetLetterOpenImageName())
btn.SetDownVisual(localeInfo.GetLetterOpenImageName())
btn.SetEvent(ui.__mem_func__(self.__OnClickQuestLetterButton), btn)
btn.Hide()
btn.type = quest.QUEST_TYPE_MAX
btn.count = 0
self.questButtonList.append(btn)
# Used for event quests in order to highlight it.
btn = uiWhisper.WhisperButton()
btn.SetUpVisual(localeInfo.GetBlueLetterImageName())
btn.SetOverVisual(localeInfo.GetBlueLetterOpenImageName())
btn.SetDownVisual(localeInfo.GetBlueLetterOpenImageName())
btn.SetEvent(ui.__mem_func__(self.__OnClickQuestLetterButton), btn)
btn.Hide()
btn.type = quest.QUEST_TYPE_EVENT
btn.count = 0
self.questButtonList.append(btn)
self.__ArrangeQuestButton()
def __ArrangeQuestButton(self):
screen_width = wndMgr.GetScreenWidth()
screen_height = wndMgr.GetScreenHeight()
x = 100 + 30 if self.wndParty.IsShow() else 20
if localeInfo.IsARABIC():
x += 15
y = 170 * screen_height / 600
y_count = (screen_height - 330) / 63
for count, btn in enumerate(self.questButtonList):
btn.SetPosition(x + (int(count / y_count) * 100), y + (count % y_count * 63))
btn.SetToolTipText(str(btn.count), 0, 35)
global IsQBHide
if IsQBHide:
btn.Hide()
else:
if btn.count > 0:
btn.Show()
def __RefreshQuestButton(self):
for btn in self.questButtonList:
btn.count = quest.GetQuestButtonNoticeCount(btn.type)
self.__ArrangeQuestButton()
else:
def BINARY_ClearQuest(self, index):
btn = self.__FindQuestButton(index)
if 0 != btn:
self.__DestroyQuestButton(btn)
def RecvQuest(self, index, name):
# QUEST_LETTER_IMAGE
self.BINARY_RecvQuest(index, name, "file", localeInfo.GetLetterImageName())
# END_OF_QUEST_LETTER_IMAGE
def BINARY_RecvQuest(self, index, name, iconType, iconName):
btn = self.__FindQuestButton(index)
if 0 != btn:
self.__DestroyQuestButton(btn)
btn = uiWhisper.WhisperButton()
# QUEST_LETTER_IMAGE
## !! 20061026.levites.Äù½ºÆ®_À̹ÌÁö_±³Ã¼
import item
if "item" == iconType:
item.SelectItem(int(iconName))
buttonImageFileName = item.GetIconImageFileName()
else: else:
btn.Show() buttonImageFileName = iconName
def __StartQuest(self, btn): if localeInfo.IsEUROPE():
event.QuestButtonClick(btn.index) if "highlight" == iconType:
self.__DestroyQuestButton(btn) btn.SetUpVisual("locale/ymir_ui/highlighted_quest.tga")
btn.SetOverVisual("locale/ymir_ui/highlighted_quest_r.tga")
btn.SetDownVisual("locale/ymir_ui/highlighted_quest_r.tga")
else:
btn.SetUpVisual(localeInfo.GetLetterCloseImageName())
btn.SetOverVisual(localeInfo.GetLetterOpenImageName())
btn.SetDownVisual(localeInfo.GetLetterOpenImageName())
else:
btn.SetUpVisual(buttonImageFileName)
btn.SetOverVisual(buttonImageFileName)
btn.SetDownVisual(buttonImageFileName)
btn.Flash()
# END_OF_QUEST_LETTER_IMAGE
def __FindQuestButton(self, index): if localeInfo.IsARABIC():
for btn in self.questButtonList: btn.SetToolTipText(name, 0, 35)
if btn.index == index: btn.ToolTipText.SetHorizontalAlignCenter()
return btn else:
btn.SetToolTipText(name, -20, 35)
btn.ToolTipText.SetHorizontalAlignLeft()
return 0 btn.SetEvent(ui.__mem_func__(self.__StartQuest), btn)
btn.Show()
def __DestroyQuestButton(self, btn): btn.index = index
btn.SetEvent(0) btn.name = name
self.questButtonList.remove(btn)
self.__ArrangeQuestButton() self.questButtonList.insert(0, btn)
self.__ArrangeQuestButton()
#chat.AppendChat(chat.CHAT_TYPE_NOTICE, localeInfo.QUEST_APPEND)
def __ArrangeQuestButton(self):
screenWidth = wndMgr.GetScreenWidth()
screenHeight = wndMgr.GetScreenHeight()
## !! 20061026.levites.Äù½ºÆ®_À§Ä¡_º¸Á¤
if self.wndParty.IsShow():
xPos = 100 + 30
else:
xPos = 20
if localeInfo.IsARABIC():
xPos = xPos + 15
yPos = 170 * screenHeight / 600
yCount = (screenHeight - 330) / 63
count = 0
for btn in self.questButtonList:
btn.SetPosition(xPos + (int(count / yCount) * 100), yPos + (count % yCount * 63))
count += 1
global IsQBHide
if IsQBHide:
btn.Hide()
else:
btn.Show()
def __StartQuest(self, btn):
event.QuestButtonClick(btn.index)
self.__DestroyQuestButton(btn)
def __FindQuestButton(self, index):
for btn in self.questButtonList:
if btn.index == index:
return btn
return 0
def __DestroyQuestButton(self, btn):
btn.SetEvent(0)
self.questButtonList.remove(btn)
self.__ArrangeQuestButton()
def HideAllQuestButton(self): def HideAllQuestButton(self):
for btn in self.questButtonList: for btn in self.questButtonList:
btn.Hide() btn.Hide()
def ShowAllQuestButton(self): def ShowAllQuestButton(self):
for btn in self.questButtonList: if app.ENABLE_QUEST_RENEWAL:
btn.Show() for btn in self.questButtonList:
if btn.count > 0:
btn.Show()
else:
for btn in self.questButtonList:
btn.Show()
##################################################################################### #####################################################################################
##################################################################################### #####################################################################################
@ -1384,8 +1467,8 @@ class Interface(object):
def __InitWhisper(self): def __InitWhisper(self):
chat.InitWhisper(self) chat.InitWhisper(self)
## 채팅창의 "메시지 보내기"를 눌렀을때 이름 없는 대화창을 여는 함수 ## ä<EFBFBD><EFBFBD>â<EFBFBD><EFBFBD> "<22>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<22><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȭâ<C8AD><C3A2> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
## 이름이 없기 때문에 기존의 WhisperDialogDict 와 별도로 관리된다. ## <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WhisperDialogDict <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
def OpenWhisperDialogWithoutTarget(self): def OpenWhisperDialogWithoutTarget(self):
if not self.dlgWhisperWithoutTarget: if not self.dlgWhisperWithoutTarget:
dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog) dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog)
@ -1402,7 +1485,7 @@ class Interface(object):
self.dlgWhisperWithoutTarget.SetTop() self.dlgWhisperWithoutTarget.SetTop()
self.dlgWhisperWithoutTarget.OpenWithoutTarget(self.RegisterTemporaryWhisperDialog) self.dlgWhisperWithoutTarget.OpenWithoutTarget(self.RegisterTemporaryWhisperDialog)
## 이름 없는 대화창에서 이름을 결정했을때 WhisperDialogDict에 창을 넣어주는 함수 ## <EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȭâ<C8AD><C3A2><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WhisperDialogDict<63><74> â<><C3A2> <20>־<EFBFBD><D6BE>ִ<EFBFBD> <20>Լ<EFBFBD>
def RegisterTemporaryWhisperDialog(self, name): def RegisterTemporaryWhisperDialog(self, name):
if not self.dlgWhisperWithoutTarget: if not self.dlgWhisperWithoutTarget:
return return
@ -1421,7 +1504,7 @@ class Interface(object):
self.dlgWhisperWithoutTarget = None self.dlgWhisperWithoutTarget = None
self.__CheckGameMaster(name) self.__CheckGameMaster(name)
## 캐릭터 메뉴의 1:1 대화 하기를 눌렀을때 이름을 가지고 바로 창을 여는 함수 ## ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޴<EFBFBD><DEB4><EFBFBD> 1:1 <20><>ȭ <20>ϱ<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
def OpenWhisperDialog(self, name): def OpenWhisperDialog(self, name):
if not self.whisperDialogDict.has_key(name): if not self.whisperDialogDict.has_key(name):
dlg = self.__MakeWhisperDialog(name) dlg = self.__MakeWhisperDialog(name)
@ -1434,7 +1517,7 @@ class Interface(object):
if 0 != btn: if 0 != btn:
self.__DestroyWhisperButton(btn) self.__DestroyWhisperButton(btn)
## 다른 캐릭터로부터 메세지를 받았을때 일단 버튼만 띄워 두는 함수 ## <EFBFBD>ٸ<EFBFBD> ij<><C4B3><EFBFBD>ͷκ<CDB7><CEBA><EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20>޾<EFBFBD><DEBE><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><>ư<EFBFBD><C6B0> <20><><EFBFBD> <20>δ<EFBFBD> <20>Լ<EFBFBD>
def RecvWhisper(self, name): def RecvWhisper(self, name):
if not self.whisperDialogDict.has_key(name): if not self.whisperDialogDict.has_key(name):
btn = self.__FindWhisperButton(name) btn = self.__FindWhisperButton(name)
@ -1453,7 +1536,7 @@ class Interface(object):
def MakeWhisperButton(self, name): def MakeWhisperButton(self, name):
self.__MakeWhisperButton(name) self.__MakeWhisperButton(name)
## 버튼을 눌렀을때 창을 여는 함수 ## <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
def ShowWhisperDialog(self, btn): def ShowWhisperDialog(self, btn):
try: try:
self.__MakeWhisperDialog(btn.name) self.__MakeWhisperDialog(btn.name)
@ -1465,11 +1548,11 @@ class Interface(object):
import dbg import dbg
dbg.TraceError("interface.ShowWhisperDialog - Failed to find key") dbg.TraceError("interface.ShowWhisperDialog - Failed to find key")
## 버튼 초기화 ## <EFBFBD><EFBFBD>ư <20>ʱ<EFBFBD>ȭ
self.__DestroyWhisperButton(btn) self.__DestroyWhisperButton(btn)
## WhisperDialog 창에서 최소화 명령을 수행했을때 호출되는 함수 ## WhisperDialog â<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3>Ǵ<EFBFBD> <20>Լ<EFBFBD>
## 창을 최소화 합니다. ## â<EFBFBD><EFBFBD> <20>ּ<EFBFBD>ȭ <20>մϴ<D5B4>.
def MinimizeWhisperDialog(self, name): def MinimizeWhisperDialog(self, name):
if 0 != name: if 0 != name:
@ -1477,8 +1560,8 @@ class Interface(object):
self.CloseWhisperDialog(name) self.CloseWhisperDialog(name)
## WhisperDialog 창에서 닫기 명령을 수행했을때 호출되는 함수 ## WhisperDialog â<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3>Ǵ<EFBFBD> <20>Լ<EFBFBD>
## 창을 지웁니다. ## â<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϴ<EFBFBD>.
def CloseWhisperDialog(self, name): def CloseWhisperDialog(self, name):
if 0 == name: if 0 == name:
@ -1497,7 +1580,7 @@ class Interface(object):
import dbg import dbg
dbg.TraceError("interface.CloseWhisperDialog - Failed to find key") dbg.TraceError("interface.CloseWhisperDialog - Failed to find key")
## 버튼의 개수가 바뀌었을때 버튼을 재정렬 하는 함수 ## <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ư<EFBFBD><C6B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20>Լ<EFBFBD>
def __ArrangeWhisperButton(self): def __ArrangeWhisperButton(self):
screenWidth = wndMgr.GetScreenWidth() screenWidth = wndMgr.GetScreenWidth()
@ -1514,9 +1597,9 @@ class Interface(object):
button.SetPosition(xPos + (int(count/yCount) * -50), yPos + (count%yCount * 63)) button.SetPosition(xPos + (int(count/yCount) * -50), yPos + (count%yCount * 63))
count += 1 count += 1
## 이름으로 Whisper 버튼을 찾아 리턴해 주는 함수 ## <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Whisper <20><>ư<EFBFBD><C6B0> ã<><C3A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>Լ<EFBFBD>
## 버튼은 딕셔너리로 하지 않는 것은 정렬 되어 버려 순서가 유지 되지 않으며 ## <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> <20><>ųʸ<C5B3><CAB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
## 이로 인해 ToolTip들이 다른 버튼들에 의해 가려지기 때문이다. ## <EFBFBD>̷<EFBFBD> <20><><EFBFBD><EFBFBD> ToolTip<69><70><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><>ư<EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
def __FindWhisperButton(self, name): def __FindWhisperButton(self, name):
for button in self.whisperButtonList: for button in self.whisperButtonList:
if button.name == name: if button.name == name:
@ -1524,7 +1607,7 @@ class Interface(object):
return 0 return 0
## 창을 만듭니다. ## â<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϴ<EFBFBD>.
def __MakeWhisperDialog(self, name): def __MakeWhisperDialog(self, name):
dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog) dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog)
dlgWhisper.BindInterface(self) dlgWhisper.BindInterface(self)
@ -1536,7 +1619,7 @@ class Interface(object):
return dlgWhisper return dlgWhisper
## 버튼을 만듭니다. ## <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϴ<EFBFBD>.
def __MakeWhisperButton(self, name): def __MakeWhisperButton(self, name):
whisperButton = uiWhisper.WhisperButton() whisperButton = uiWhisper.WhisperButton()
whisperButton.SetUpVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") whisperButton.SetUpVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub")

View File

@ -1,9 +1,9 @@
import app import app
import constInfo import constInfo
MAP_TRENT02 = "MAP_TRENT02" # 烙矫 MAP_TRENT02 = "MAP_TRENT02" # <EFBFBD>ӽ<EFBFBD>
MAP_WL = "MAP_WL" # 烙矫 MAP_WL = "MAP_WL" # <EFBFBD>ӽ<EFBFBD>
MAP_NUSLUCK = "MAP_NUSLUCK" # 烙矫 MAP_NUSLUCK = "MAP_NUSLUCK" # <EFBFBD>ӽ<EFBFBD>
MAP_TREE2 = "MAP_TREE2" MAP_TREE2 = "MAP_TREE2"
BLEND_POTION_NO_TIME = "BLEND_POTION_NO_TIME" BLEND_POTION_NO_TIME = "BLEND_POTION_NO_TIME"
@ -23,7 +23,7 @@ CHANNEL_NOTIFY_FULL = "CHANNEL_NOTIFY_FULL"
GUILD_BUILDING_LIST_TXT = app.GetLocalePath() + "/GuildBuildingList.txt" GUILD_BUILDING_LIST_TXT = app.GetLocalePath() + "/GuildBuildingList.txt"
GUILD_MARK_MIN_LEVEL = "3" GUILD_MARK_MIN_LEVEL = "3"
GUILD_MARK_NOT_ENOUGH_LEVEL = "辨靛饭骇 3捞惑 何磐 啊瓷钦聪促." GUILD_MARK_NOT_ENOUGH_LEVEL = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3<>̻<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."
ERROR_MARK_UPLOAD_NEED_RECONNECT = "UploadMark: Reconnect to game" ERROR_MARK_UPLOAD_NEED_RECONNECT = "UploadMark: Reconnect to game"
ERROR_MARK_CHECK_NEED_RECONNECT = "CheckMark: Reconnect to game" ERROR_MARK_CHECK_NEED_RECONNECT = "CheckMark: Reconnect to game"
@ -32,7 +32,7 @@ VIRTUAL_KEY_ALPHABET_LOWERS = r"[1234567890]/qwertyuiop\=asdfghjkl;`'zxcvbnm.,"
VIRTUAL_KEY_ALPHABET_UPPERS = r'{1234567890}?QWERTYUIOP|+ASDFGHJKL:~"ZXCVBNM<>' VIRTUAL_KEY_ALPHABET_UPPERS = r'{1234567890}?QWERTYUIOP|+ASDFGHJKL:~"ZXCVBNM<>'
VIRTUAL_KEY_SYMBOLS = '!@#$%^&*()_+|{}:"<>?~' VIRTUAL_KEY_SYMBOLS = '!@#$%^&*()_+|{}:"<>?~'
VIRTUAL_KEY_NUMBERS = "1234567890-=\[];',./`" VIRTUAL_KEY_NUMBERS = "1234567890-=\[];',./`"
VIRTUAL_KEY_SYMBOLS_BR = '!@#$%^&*()_+|{}:"<>?~徉汊殍觏祗螋斛<EFBFBD>' VIRTUAL_KEY_SYMBOLS_BR = '!@#$%^&*()_+|{}:"<>?~<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>'
__IS_ENGLISH = "ENGLISH" == app.GetLocaleServiceName() __IS_ENGLISH = "ENGLISH" == app.GetLocaleServiceName()
__IS_HONGKONG = "HONGKONG" == app.GetLocaleServiceName() __IS_HONGKONG = "HONGKONG" == app.GetLocaleServiceName()
@ -106,7 +106,7 @@ def IsWE_KOREA():
def LoadLocaleData(): def LoadLocaleData():
if IsYMIR(): if IsYMIR():
import net import net
SERVER = "蔫档 辑滚" SERVER = "<EFBFBD><20><><EFBFBD><EFBFBD>"
if SERVER == net.GetServerInfo()[:len(SERVER)]: if SERVER == net.GetServerInfo()[:len(SERVER)]:
app.SetCHEONMA(0) app.SetCHEONMA(0)
app.LoadLocaleData("locale/we_korea") app.LoadLocaleData("locale/we_korea")
@ -119,7 +119,7 @@ def LoadLocaleData():
app.LoadLocaleData(app.GetLocalePath()) app.LoadLocaleData(app.GetLocalePath())
def IsCHEONMA(): def IsCHEONMA():
return IsYMIR() # 捞力 YMIR 肺纳老篮 公炼扒 玫付辑滚烙. 玫付辑滚啊 巩阑 摧扁 傈鳖瘤 函且 老 绝澜. return IsYMIR() # <EFBFBD><EFBFBD><EFBFBD><EFBFBD> YMIR <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> õ<><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. õ<><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
# END_OF_SUPPORT_NEW_KOREA_SERVER # END_OF_SUPPORT_NEW_KOREA_SERVER
@ -181,13 +181,13 @@ elif IsSINGAPORE() :
LOCALE_FILE_NAME = "%s/locale_game.txt" % app.GetLocalePath() LOCALE_FILE_NAME = "%s/locale_game.txt" % app.GetLocalePath()
constInfo.IN_GAME_SHOP_ENABLE = 0 constInfo.IN_GAME_SHOP_ENABLE = 0
elif IsNEWCIBN() : elif IsNEWCIBN() :
##霸烙疙捞柄柳促. ##<EFBFBD><EFBFBD><EFBFBD>Ӹ<EFBFBD><EFBFBD>̱<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
APP_TITLE = "新倚天2" APP_TITLE = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2"
FN_GM_MARK = "%s/effect/gm.mse" % app.GetLocalePath() FN_GM_MARK = "%s/effect/gm.mse" % app.GetLocalePath()
LOCALE_FILE_NAME = "%s/locale_game.txt" % app.GetLocalePath() LOCALE_FILE_NAME = "%s/locale_game.txt" % app.GetLocalePath()
constInfo.IN_GAME_SHOP_ENABLE = 1 constInfo.IN_GAME_SHOP_ENABLE = 1
elif IsTAIWAN(): elif IsTAIWAN():
APP_TITLE = "矮III瓣" APP_TITLE = "<EFBFBD><EFBFBD>III<EFBFBD><EFBFBD>"
FN_GM_MARK = "%s/effect/gm.mse" % app.GetLocalePath() FN_GM_MARK = "%s/effect/gm.mse" % app.GetLocalePath()
LOCALE_FILE_NAME = "%s/locale_game.txt" % app.GetLocalePath() LOCALE_FILE_NAME = "%s/locale_game.txt" % app.GetLocalePath()
@ -202,31 +202,31 @@ else:
LoadLocaleFile(LOCALE_FILE_NAME, locals()) LoadLocaleFile(LOCALE_FILE_NAME, locals())
######################################################################################################## ########################################################################################################
## NOTE : 酒捞袍阑 滚副锭 "公均阑/甫 滚府矫摆嚼聪鳖?" 巩磊凯狼 炼荤 急琶阑 困茄 内靛 ## NOTE : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><> <20><><EFBFBD><EFBFBD><EFBFBD>ðڽ<C3B0><DABD>ϱ<EFBFBD>?" <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>
dictSingleWord = { dictSingleWord = {
"m":1, "n":1, "r":1, "M":1, "N":1, "R":1, "l":1, "L":1, "1":1, "3":1, "6":1, "7":1, "8":1, "0":1, "m":1, "n":1, "r":1, "M":1, "N":1, "R":1, "l":1, "L":1, "1":1, "3":1, "6":1, "7":1, "8":1, "0":1,
} }
dictDoubleWord = { dictDoubleWord = {
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "簿":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1,
"":1, "":1, "":1, "":1, "":1, "":1, "穿":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>v":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>R":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>x":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>m":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>O":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>l":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "贿":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>u":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1,
"轿":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>X":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>o":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>y":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>p":1,
"":1, "鹿":1, "":1, "":1, "":1, "<EFBFBD>":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD>":1, "":1, "<EFBFBD>":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "¥":1, "¹":1, "¼":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>c":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "°":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>R":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>n":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "í":1, "ó":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "ġ":1, "ä":1, "<EFBFBD><EFBFBD>":1, "ü":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>M":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "ī":1, "ļ":1, "Ŀ":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "ť":1, "ũ":1, "Ű":1, "ij":1, "<EFBFBD>m":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "Ÿ":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "Ʃ":1, "Ʈ":1, "Ƽ":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD>O":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "ơ":1, "<EFBFBD><EFBFBD>":1, "Ƣ":1, "Ʒ":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "ǥ":1, "Ǫ":1, "ǻ":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "ǡ":1, "<EFBFBD><EFBFBD>":1, "Ǵ":1, "<EFBFBD>R":1, "ǣ":1, "Ƕ":1, "<EFBFBD>c":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "ȣ":1, "ȿ":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "ȭ":1, "ȳ":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1, "ȸ":1, "<EFBFBD><EFBFBD>":1, "<EFBFBD><EFBFBD>":1,
} }
locale = mapping( locale = mapping(
@ -415,129 +415,129 @@ JOBINFO_TITLE = [
JOBINFO_DATA_LIST = [ JOBINFO_DATA_LIST = [
[ [
["鸥绊抄 侩竿苞 绷洒瘤 臼绰 公荤狼", ["Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"扁俺甫 荤恩甸篮 老拿绢 [侩磊]扼绊", "<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>þ<EFBFBD> [<5B><><EFBFBD><EFBFBD>]<5D><><EFBFBD>",
"何弗促. 绢栋茄 困扁俊辑档 弊甸篮 ", "<EFBFBD>θ<EFBFBD><EFBFBD><EFBFBD>. <20><EFBFBD><EEB6B0> <20><><EFBFBD><EFBFBD><E2BFA1><EFBFBD><EFBFBD> <20>׵<EFBFBD><D7B5><EFBFBD> ",
"第肺 拱矾辑瘤 臼栏哥, 促摹绊 框流", "<EFBFBD>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>",
"捞扁 塞电 悼丰甫 困秦 窜脚栏肺", "<EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD><EFBFBD>",
"利甸苞 付林 轿快扁档 茄促. 捞甸篮", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ο<EFBFBD><20>Ѵ<EFBFBD>. <20>̵<EFBFBD><CCB5><EFBFBD>",
"肋 窜访等 辟腊苞 塞, 碍仿茄 傍拜仿", "<EFBFBD><EFBFBD> <20>ܷõ<DCB7> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD>",
"栏肺 傈厘 弥急滴俊辑 傍拜柳栏肺", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ּ<EFBFBD><D6BC>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"劝距茄促. ",], "Ȱ<EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. ",],
["啊厘 老馆利牢 傍拜屈 公荤肺, ", ["<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, ",
"利立傈俊 蝶弗 流立 傍拜栏肺 傈厘", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
"俊辑 劝距茄促. 焙流 漂己惑 辟仿阑", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȱ<><C8B0><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD> <20>ٷ<EFBFBD><D9B7><EFBFBD>",
"皋牢栏肺 胶泡 器牢飘甫 捧磊窍登, ", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>, ",
"利立傈俊 蝶弗 积疙仿 / 规绢仿", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD>",
"犬焊甫 困秦 眉仿阑 棵赴促. 肚茄", "Ȯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ü<><C3BC><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD>. <20><><EFBFBD><EFBFBD>",
"傍拜狼 沥犬己阑 臭捞扁 困秦 刮酶", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ø",
"俊档 器牢飘甫 捧磊且 鞘夸啊 乐促.",], "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ䰡 <20>ִ<EFBFBD>.",],
["惑寸 荐霖狼 沥脚仿阑 捞侩窍绰", ["<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD> <20>̿<EFBFBD><CCBF>ϴ<EFBFBD>",
"吝/辟芭府 立傈屈 公荤肺, 阿 扁贱", "<EFBFBD><EFBFBD>/<2F>ٰŸ<D9B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD>",
"窍唱窍唱狼 臭篮 傍拜仿栏肺 傈厘俊辑", "<EFBFBD>ϳ<EFBFBD><EFBFBD>ϳ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5BFA1>",
"劝距茄促. 焙流 漂己惑 辟仿阑 皋牢", "Ȱ<EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD> <20>ٷ<EFBFBD><D9B7><EFBFBD> <20><><EFBFBD><EFBFBD>",
"栏肺 胶湃 器牢飘甫 捧磊窍登, ", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>, ",
"吝/辟芭府 傍拜狼 沥犬己苞 疙吝伏阑", "<EFBFBD><EFBFBD>/<2F>ٰŸ<D9B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD>߷<EFBFBD><DFB7><EFBFBD>",
"困秦 刮酶阑 棵赴促. 肚茄 立傈 矫 ", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ø<EFBFBD><C3B8> <20>ø<EFBFBD><C3B8><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> ",
"利 傍拜俊 蝶弗 积疙仿 / 规绢仿", "<EFBFBD><EFBFBD> <20><><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD>",
"犬焊甫 困秦 眉仿俊档 器牢飘甫", "Ȯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ü<>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>",
"捧磊且 鞘夸啊 乐促. ",], "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ䰡 <20>ִ<EFBFBD>. ",],
], ],
[ [
["磊按篮 绢栋茄 惑炔俊辑档 磊脚狼", ["<EFBFBD>ڰ<EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EEB6B0> <20><>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD>",
"个阑 见扁绊 篮剐茄 绢狄狼 烙公甫", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>ӹ<EFBFBD><D3B9><EFBFBD>",
"荐青窍搁辑 傈厘狼 饶困甫 瘤盔窍绰", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ鼭 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>",
"磊甸捞促. 捞甸篮 酒林 狐福绊 脚加", "<EFBFBD>ڵ<EFBFBD><EFBFBD>̴<EFBFBD>. <20>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ż<EFBFBD>",
"窍哥, 厚且 单 绝捞 苞皑窍绊 例力等", "<EFBFBD>ϸ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"青悼栏肺 利狼 鞭家俊 摹疙鸥甫 朝府", "<EFBFBD>ൿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>޼ҿ<DEBC> ġ<><C4A1>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD>",
"登, 傈厘俊急 利柳阑 氢秦 公荐茄", "<EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><E5BFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"拳混阑 郴徽栏哥 磊脚狼 侩竿阑", "ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>",
"急焊牢促. "], "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>. "],
["滴颊 窜八阑 林公扁肺 促风哥, 脚加", ["<EFBFBD>μ<EFBFBD> <20>ܰ<EFBFBD><DCB0><EFBFBD> <20>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD> <20>ٷ<EFBFBD><D9B7>, <20>ż<EFBFBD>",
"窍霸 摹绊 狐瘤绰 磊按 漂蜡狼 框流烙", "<EFBFBD>ϰ<EFBFBD> ġ<><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڰ<EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"栏肺 傈厘俊辑 劝距茄促. 焙流 漂己惑", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5BFA1> Ȱ<><C8B0><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD>",
"刮酶阑 皋牢栏肺 胶泡 器牢飘甫 捧磊", "<EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>",
"窍登, 辟仿阑 棵妨 傍拜仿阑 臭牢促.", "<EFBFBD>ϵ<EFBFBD>, <20>ٷ<EFBFBD><D9B7><EFBFBD> <20>÷<EFBFBD> <20><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD> <20><><EFBFBD>δ<EFBFBD>.",
"肚茄 辟立傈俊 蝶弗 积疙仿/规绢仿 ", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> ",
"惑铰阑 困秦 眉仿俊档 器牢飘甫", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ü<>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>",
"捧磊且 鞘夸啊 乐促. ",], "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ䰡 <20>ִ<EFBFBD>. ",],
["劝阑 林公扁肺 促风哥, 变 矫具客", ["Ȱ<EFBFBD><EFBFBD> <20>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD> <20>ٷ<EFBFBD><D9B7>, <20><> <20>þ߿<C3BE>",
"荤沥芭府俊 蝶弗 盔芭府 傍拜栏肺", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"傈厘俊辑 劝距茄促. 焙流 漂己惑", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȱ<><C8B0><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD>",
"傍拜 己傍伏狼 刘啊甫 困秦 刮酶阑", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ø<EFBFBD><C3B8>",
"皋牢栏肺 棵妨具 窍哥, 盔芭府", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20>ϸ<EFBFBD>, <20><><EFBFBD>Ÿ<EFBFBD>",
"傍拜狼 单固瘤 刘啊甫 困秦 辟仿阑", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٷ<EFBFBD><D9B7><EFBFBD>",
"棵副 鞘夸啊 乐促. 肚茄 利甸俊霸", "<EFBFBD>ø<EFBFBD> <20>ʿ䰡 <20>ִ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E9BFA1>",
"器困登菌阑 矫, 利 傍拜俊 滚萍扁", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD> <20><>, <20><> <20><><EFBFBD>ݿ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC>",
"困茄 积疙仿/规绢仿 惑铰阑 困秦", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
"眉仿俊档 器牢飘甫 捧磊且 鞘夸啊", "ü<EFBFBD>¿<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ䰡",
"乐促. ", ], "<EFBFBD>ִ<EFBFBD>. ", ],
], ],
[ [
["荐扼绰 [刀篮 刀栏肺]狼 加己栏肺", ["<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> [<5B><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]<5D><> <20>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD>",
"芒汲等 漂荐 加己狼 焙流捞促. ", "â<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ư<><C6AF> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. ",
"弊甸篮 傈厘俊辑 利甸狼 荤扁甫 历窍", "<EFBFBD>׵<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5BFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><20><><EFBFBD><EFBFBD>",
"矫虐绊, 厩付狼 塞阑 角篮 付藕栏肺", "<EFBFBD><EFBFBD>Ű<EFBFBD><EFBFBD>, <20>Ǹ<EFBFBD><C7B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ź<EFBFBD><C5BA><EFBFBD><EFBFBD>",
"利狼 康去苞 腊脚阑 窿苟暗促. 锭肺", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD>",
"捞甸篮 磊脚狼 八苞 癌渴俊 绢狄狼", "<EFBFBD>̵<EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20>˰<EFBFBD> <20><><EFBFBD>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>",
"塞阑 角绢, 傈厘俊辑 公荤 给瘤 臼篮", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD>, <20><><EFBFBD><EFBFBD><E5BFA1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
"傍拜仿阑 惯戎窍扁档 窍绰单, 利甸阑", "<EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<20>ϴµ<CFB4>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"磷咯措绰弊 葛嚼捞 况倡俊 阐嘛秦", "<EFBFBD>׿<EFBFBD><EFBFBD><EFBFBD>±<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"荤恩甸篮 荐扼甫 老拿绢 [付脚]捞扼", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>þ<EFBFBD> [<5B><><EFBFBD><EFBFBD>]<5D>̶<EFBFBD>",
"何福扁甫 林历 旧绰促."], "<EFBFBD>θ<EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20>ɴ´<C9B4>."],
["券公焙狼 荐扼绰 厩付狼 揪俊辑", ["ȯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD><C7B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"掘绢瘤绰 付仿阑 公扁唱 规绢备俊", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EEB1B8>",
"角绢 公荤 给瘤 臼篮 傈捧仿栏肺", "<EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"傈厘俊辑 劝距茄促. 焙流 漂己惑", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȱ<><C8B0><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD>",
"瘤瓷捞 臭酒龙荐废 馒侩 厘厚俊", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>",
"角府绰 付仿狼 困仿捞 刘措登骨肺,", "<EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ǹǷ<C7B9>,",
"瘤瓷苞 辟仿阑 皋牢栏肺 胶湃", "<EFBFBD><EFBFBD><EFBFBD>ɰ<EFBFBD> <20>ٷ<EFBFBD><D9B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
"器牢飘甫 捧磊窍登, 立傈俊 蝶弗", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
"积疙仿/规绢仿 犬焊甫 困秦 眉仿阑", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ü<><C3BC><EFBFBD><EFBFBD>",
"棵赴促. 肚茄 傍拜狼 沥犬己苞", "<EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE><EFBFBD><EFBFBD>",
"雀乔甫 困秦辑 刮酶俊档 器牢飘甫", "ȸ<EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> <20><>ø<EFBFBD><C3B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>",
"捧磊且 鞘夸啊 乐促. ",], "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ䰡 <20>ִ<EFBFBD>. ",],
["孺付焙狼 荐扼甸篮 阿辆 绢狄狼", ["<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>",
"林巩苞 厩付狼 付过栏肺 傈厘俊辑", "<EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD><C7B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5BFA1>",
"劝距茄促. 焙流 漂己惑 付过 傍拜捞", "Ȱ<EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"林捞骨肺 瘤瓷阑 皋牢栏肺 胶泡", "<EFBFBD><EFBFBD><EFBFBD>̹Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
"器牢飘甫 捧磊窍登, 盔芭府 付过", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>, <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD>",
"傍拜狼 沥犬己阑 困秦 刮酶阑 棵赴促.", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ø<EFBFBD><C3B8> <20>ø<EFBFBD><C3B8><EFBFBD>.",
"肚茄 器困 登菌阑矫, 利 傍拜俊 蝶弗", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD>",
"积疙仿 / 规绢仿 犬焊甫 困秦 眉仿俊档", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ü<>¿<EFBFBD><C2BF><EFBFBD>",
"器牢飘甫 捧磊且 鞘夸啊 乐促. ",], "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ䰡 <20>ִ<EFBFBD>. ",],
], ],
[ [
["公寸篮 侩脚苞 磊楷, 滴 绊措狼", ["<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ű<EFBFBD> <20>ڿ<EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"塞阑 促逢 荐 乐绰 蜡老茄 流辆捞促.", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.",
"弊甸篮 饶规俊辑 酒焙阑 焊炼窍绊", "<EFBFBD>׵<EFBFBD><EFBFBD><EFBFBD> <20>Ĺ濡<C4B9><E6BFA1> <20>Ʊ<EFBFBD><C6B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>",
"促模 悼丰狼 何惑阑 雀汗 矫虐哥", "<EFBFBD><EFBFBD>ģ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>λ<EFBFBD><CEBB><EFBFBD> ȸ<><C8B8> <20><>Ű<EFBFBD><C5B0>",
"冻绢柳 荤扁甫 惑铰矫挪促. 弊甸篮", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><20><>½<EFBFBD>Ų<EFBFBD><C5B2>. <20>׵<EFBFBD><D7B5><EFBFBD>",
"酒焙狼 荐搁苞 绒侥阑 规秦窍绰 磊甫 ", "<EFBFBD>Ʊ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ڸ<EFBFBD> ",
"例措 侩辑窍瘤 臼栏哥, 弊繁 磊甸", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBBCAD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>׷<EFBFBD> <20>ڵ<EFBFBD>",
"俊霸绰 茄 痢 林历 绝捞 林巩阑", "<EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ֹ<EFBFBD><D6B9><EFBFBD>",
"磐飘妨 弊 厚疤窃阑 决洒 隆拌茄促.",], "<EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ¡<><C2A1><EFBFBD>Ѵ<EFBFBD>.",],
["玫锋焙狼 公寸甸篮 阿辆 何利贱苞", ["õ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"焊炼林巩俊 瓷窍哥, 利狼 流 / 埃立", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϸ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><> / <20><><EFBFBD><EFBFBD>",
"傍拜栏肺何磐 酒焙阑 瘤挪促. 焙流", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD> <20>Ʊ<EFBFBD><C6B1><EFBFBD> <20><>Ų<EFBFBD><C5B2>. <20><><EFBFBD><EFBFBD>",
"漂己惑 付过 瓷仿捞 林捞骨肺 瘤瓷阑", "Ư<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"皋牢栏肺 胶泡 器牢飘甫 捧磊窍登,", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>,",
"器困登菌阑 矫, 利 傍拜俊 蝶弗", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD> <20><>, <20><> <20><><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD>",
"积疙仿 / 规绢仿 犬焊甫 困秦 眉仿阑", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ü<><C3BC><EFBFBD><EFBFBD>",
"棵赴促. 肚茄 盔芭府 付过 傍拜狼", "<EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"沥犬己阑 困俊 刮酶俊档 器牢飘甫", "<EFBFBD><EFBFBD>Ȯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ø<EFBFBD><C3B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>",
"捧磊且 鞘夸啊 乐促. ",], "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ䰡 <20>ִ<EFBFBD>. ",],
["堡汾焙狼 公寸甸篮 磊楷狼 塞阑", ["<EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD>",
"呼妨 酒焙阑 雀汗窍绊, 锄脚狼 ", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ʊ<EFBFBD><C6B1><EFBFBD> ȸ<><C8B8><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ",
"塞栏肺 剐笼茄 利甸俊霸 奴 面拜阑", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E9BFA1> ū <20><><EFBFBD><EFBFBD><EFBFBD>",
"涝鳃 荐 乐绰 捞甸捞促. 焙流狼", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>̵<EFBFBD><CCB5>̴<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"漂己惑 付过 瓷仿捞 林捞骨肺 瘤瓷阑", "Ư<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"皋牢栏肺 胶泡 器牢飘甫 捧磊窍登,", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>,",
"器困登菌阑矫, 利 傍拜俊 蝶弗", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD>",
"积疙仿 / 规绢仿 犬焊甫 困秦 眉仿阑", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ü<><C3BC><EFBFBD><EFBFBD>",
"棵赴促. 肚茄 盔芭府 付过 傍拜狼", "<EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"沥犬己阑 困俊 刮酶俊档 器牢飘甫", "<EFBFBD><EFBFBD>Ȯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ø<EFBFBD><C3B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>",
"捧磊且 鞘夸啊 乐促. "], "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ䰡 <20>ִ<EFBFBD>. "],
], ],
] ]
@ -628,140 +628,148 @@ def GetLetterOpenImageName():
def GetLetterCloseImageName(): def GetLetterCloseImageName():
return "season1/icon/scroll_close.tga" return "season1/icon/scroll_close.tga"
if app.ENABLE_QUEST_RENEWAL:
def GetBlueLetterImageName():
return "icon/item/scroll_close_blue.tga"
def GetBlueLetterOpenImageName():
return "icon/item/scroll_open_blue.tga"
def GetBlueLetterCloseImageName():
return "icon/item/scroll_close_blue.tga"
if 949 == app.GetDefaultCodePage(): if 949 == app.GetDefaultCodePage():
def EUL(name): def EUL(name):
if GetAuxiliaryWordType(name): if GetAuxiliaryWordType(name):
return "" return "<EFBFBD><EFBFBD> "
else: else:
return "" return "<EFBFBD><EFBFBD> "
def I(name): def I(name):
if GetAuxiliaryWordType(name): if GetAuxiliaryWordType(name):
return " " return "<EFBFBD><EFBFBD> "
else: else:
return " " return "<EFBFBD><EFBFBD> "
def DO_YOU_SELL_ITEM(sellItemName, sellItemCount, sellItemPrice): def DO_YOU_SELL_ITEM(sellItemName, sellItemCount, sellItemPrice):
name = sellItemName name = sellItemName
if sellItemCount > 1: if sellItemCount > 1:
name += " " name += " "
name += str(sellItemCount) name += str(sellItemCount)
name += "" name += "<EFBFBD><EFBFBD>"
return name + EUL(name) + str(sellItemPrice) + "成俊 颇矫摆嚼聪鳖?" return name + EUL(name) + str(sellItemPrice) + "<EFBFBD>ɿ<EFBFBD> <20>Ľðڽ<C3B0><DABD>ϱ<EFBFBD>?"
def DO_YOU_BUY_ITEM(sellItemName, sellItemCount, sellItemPrice): def DO_YOU_BUY_ITEM(sellItemName, sellItemCount, sellItemPrice):
name = sellItemName name = sellItemName
if sellItemCount > 1: if sellItemCount > 1:
name += " " name += " "
name += str(sellItemCount) name += str(sellItemCount)
name += "" name += "<EFBFBD><EFBFBD>"
return name + EUL(name) + str(sellItemPrice) + "俊 荤矫摆嚼聪鳖?" return name + EUL(name) + str(sellItemPrice) + "<EFBFBD><EFBFBD> <20><>ðڽ<C3B0><DABD>ϱ<EFBFBD>?"
def REFINE_FAILURE_CAN_NOT_ATTACH(attachedItemName): def REFINE_FAILURE_CAN_NOT_ATTACH(attachedItemName):
return attachedItemName+EUL(attachedItemName)+"何馒且 荐 绝绰 酒捞袍涝聪促" return attachedItemName+EUL(attachedItemName)+"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>"
def REFINE_FAILURE_NO_SOCKET(attachedItemName): def REFINE_FAILURE_NO_SOCKET(attachedItemName):
return attachedItemName+EUL(attachedItemName)+"何馒且 荐 乐绰 家南捞 绝嚼聪促" return attachedItemName+EUL(attachedItemName)+"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>"
def REFINE_FAILURE_NO_GOLD_SOCKET(attachedItemName): def REFINE_FAILURE_NO_GOLD_SOCKET(attachedItemName):
return attachedItemName+EUL(attachedItemName)+"何馒且 荐 乐绰 炔陛 家南捞 绝嚼聪促" return attachedItemName+EUL(attachedItemName)+"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> Ȳ<><C8B2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>"
def HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, dropItemCount): def HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, dropItemCount):
name = dropItemName name = dropItemName
if dropItemCount > 1: if dropItemCount > 1:
name += " " name += " "
name += str(dropItemCount) name += str(dropItemCount)
name += "" name += "<EFBFBD><EFBFBD>"
return name+EUL(name)+"滚府矫摆嚼聪鳖?" return name+EUL(name)+"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ðڽ<EFBFBD><EFBFBD>ϱ<EFBFBD>?"
def NumberToMoneyString(number): def NumberToMoneyString(number):
if number <= 0: if number <= 0:
return "0" return "0<EFBFBD><EFBFBD>"
number = str(number) number = str(number)
result = CutMoneyString(number, 0, 4, "", "") result = CutMoneyString(number, 0, 4, "", "")
result = CutMoneyString(number, 4, 8, "", result) result = CutMoneyString(number, 4, 8, "<EFBFBD><EFBFBD>", result)
result = CutMoneyString(number, 8, 12, "", result) result = CutMoneyString(number, 8, 12, "<EFBFBD><EFBFBD>", result)
result = result + "" result = result + "<EFBFBD><EFBFBD>"
return result return result
def NumberToSecondaryCoinString(number): def NumberToSecondaryCoinString(number):
if number <= 0: if number <= 0:
return "0" return "0<EFBFBD><EFBFBD>"
number = str(number) number = str(number)
result = CutMoneyString(number, 0, 4, "", "") result = CutMoneyString(number, 0, 4, "", "")
result = CutMoneyString(number, 4, 8, "", result) result = CutMoneyString(number, 4, 8, "<EFBFBD><EFBFBD>", result)
result = CutMoneyString(number, 8, 12, "", result) result = CutMoneyString(number, 8, 12, "<EFBFBD><EFBFBD>", result)
result = result + "" result = result + "<EFBFBD><EFBFBD>"
return result return result
def FISHING_NOTIFY(isFish, fishName): def FISHING_NOTIFY(isFish, fishName):
if isFish: if isFish:
return fishName + I(fishName) + "巩 淀 钦聪促." return fishName + I(fishName) + "<EFBFBD><EFBFBD> <20><> <20>մϴ<D5B4>."
else: else:
return fishName + I(fishName) + "吧赴淀 钦聪促." return fishName + I(fishName) + "<EFBFBD>ɸ<EFBFBD><EFBFBD><EFBFBD> <20>մϴ<D5B4>."
def FISHING_SUCCESS(isFish, fishName): def FISHING_SUCCESS(isFish, fishName):
if isFish: if isFish:
return fishName + EUL(fishName) + "棱疽嚼聪促!" return fishName + EUL(fishName) + "<EFBFBD><EFBFBD>ҽ<EFBFBD><EFBFBD>ϴ<EFBFBD>!"
else: else:
return fishName + EUL(fishName) + "掘菌嚼聪促!" return fishName + EUL(fishName) + "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>!"
elif 932 == app.GetDefaultCodePage(): elif 932 == app.GetDefaultCodePage():
def DO_YOU_SELL_ITEM(sellItemName, sellItemCount, sellItemPrice): def DO_YOU_SELL_ITEM(sellItemName, sellItemCount, sellItemPrice):
if sellItemCount > 1 : if sellItemCount > 1 :
return "%s %s 屄傪 %s偵攧傝傑偡偐丠" % ( sellItemName, sellItemCount, NumberToMoneyString(sellItemPrice) ) return "%s %s <EFBFBD>‚<EFBFBD> %s<EFBFBD>ɔ<EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>H" % ( sellItemName, sellItemCount, NumberToMoneyString(sellItemPrice) )
else: else:
return "%s %s偱攧傝傑偡偐丠" % (sellItemName, NumberToMoneyString(sellItemPrice) ) return "%s <EFBFBD><EFBFBD> %s<EFBFBD>Ŕ<EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>H" % (sellItemName, NumberToMoneyString(sellItemPrice) )
def DO_YOU_BUY_ITEM(buyItemName, buyItemCount, buyItemPrice) : def DO_YOU_BUY_ITEM(buyItemName, buyItemCount, buyItemPrice) :
if buyItemCount > 1 : if buyItemCount > 1 :
return "%s %s屄傪 %s偱攦偄傑偡偐丠" % ( buyItemName, buyItemCount, buyItemPrice ) return "%s %s<EFBFBD>‚<EFBFBD> %s<EFBFBD>Ŕ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>H" % ( buyItemName, buyItemCount, buyItemPrice )
else: else:
return "%s%s偱攦偄傑偡偐丠" % ( buyItemName, buyItemPrice ) return "%s<EFBFBD><EFBFBD> %s<EFBFBD>Ŕ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>H" % ( buyItemName, buyItemPrice )
def REFINE_FAILURE_CAN_NOT_ATTACH(attachedItemName) : def REFINE_FAILURE_CAN_NOT_ATTACH(attachedItemName) :
return "%s傪憰拝偱偒側偄傾僀僥?偱偡丅" % (attachedItemName) return "%s<EFBFBD>𑕒<EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD>Ȃ<EFBFBD><EFBFBD>A<EFBFBD>C<EFBFBD>e?<3F>ł<EFBFBD><C582>B" % (attachedItemName)
def REFINE_FAILURE_NO_SOCKET(attachedItemName) : def REFINE_FAILURE_NO_SOCKET(attachedItemName) :
return "%s傪憰拝偡傞?働僢僩偑偁傝傑偣傫丅" % (attachedItemName) return "%s<EFBFBD>𑕒<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>P<EFBFBD>b<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD>B" % (attachedItemName)
def REFINE_FAILURE_NO_GOLD_SOCKET(attachedItemName) : def REFINE_FAILURE_NO_GOLD_SOCKET(attachedItemName) :
return "%s傪憰拝偱偒傞墿嬥?働僢僩偑偁傝傑偣傫丅" % (attachedItemName) return "%s<EFBFBD>𑕒<EFBFBD><EFBFBD>ł<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>P<EFBFBD>b<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD>B" % (attachedItemName)
def HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, dropItemCount) : def HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, dropItemCount) :
if dropItemCount > 1 : if dropItemCount > 1 :
return "%s %d 屄傪幪偰傑偡偐丠" % (dropItemName, dropItemCount) return "%s %d <EFBFBD>‚<EFBFBD><EFBFBD>̂Ă܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>H" % (dropItemName, dropItemCount)
else : else :
return "%s傪幪偰傑偡偐丠" % (dropItemName) return "%s<EFBFBD><EFBFBD><EFBFBD>̂Ă܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>H" % (dropItemName)
def FISHING_NOTIFY(isFish, fishName) : def FISHING_NOTIFY(isFish, fishName) :
if isFish : if isFish :
return "%s 偑怘偄偮偄偨傛偆偱偡" % ( fishName ) return "%s <EFBFBD><EFBFBD><EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>‚<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD>" % ( fishName )
else : else :
return "%s 偑偐偐偭偨傛偆偱偡" % ( fishName ) return "%s <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD>" % ( fishName )
def FISHING_SUCCESS(isFish, fishName) : def FISHING_SUCCESS(isFish, fishName) :
if isFish : if isFish :
return "%s 傪曔傑偊傑偟偨両" % (fishName) return "%s <EFBFBD><EFBFBD>߂܂<EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>I" % (fishName)
else : else :
return "%s 傪庤偵擖傟傑偟偨両" % (fishName) return "%s <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɓ<EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>I" % (fishName)
def NumberToMoneyString(number) : def NumberToMoneyString(number) :
if number <= 0 : if number <= 0 :
return "0" return "0<EFBFBD><EFBFBD>"
number = str(number) number = str(number)
result = CutMoneyString(number, 0, 4, "", "") result = CutMoneyString(number, 0, 4, "", "")
result = CutMoneyString(number, 4, 8, "", result) result = CutMoneyString(number, 4, 8, "<EFBFBD><EFBFBD>", result)
result = CutMoneyString(number, 8, 12, "", result) result = CutMoneyString(number, 8, 12, "<EFBFBD><EFBFBD>", result)
result = result + "" result = result + "<EFBFBD><EFBFBD>"
return result return result
def NumberToSecondaryCoinString(number) : def NumberToSecondaryCoinString(number) :
@ -770,8 +778,8 @@ elif 932 == app.GetDefaultCodePage():
number = str(number) number = str(number)
result = CutMoneyString(number, 0, 4, "", "") result = CutMoneyString(number, 0, 4, "", "")
result = CutMoneyString(number, 4, 8, "", result) result = CutMoneyString(number, 4, 8, "<EFBFBD><EFBFBD>", result)
result = CutMoneyString(number, 8, 12, "", result) result = CutMoneyString(number, 8, 12, "<EFBFBD><EFBFBD>", result)
result = result + "jun" result = result + "jun"
return result return result
@ -842,53 +850,53 @@ elif IsHONGKONG():
elif IsNEWCIBN() or IsCIBN10(): elif IsNEWCIBN() or IsCIBN10():
def DO_YOU_SELL_ITEM(sellItemName, sellItemCount, sellItemPrice): def DO_YOU_SELL_ITEM(sellItemName, sellItemCount, sellItemPrice):
if sellItemCount>1: if sellItemCount>1:
return "确定要把%s%s%s金币卖掉吗?" % (str(sellItemCount), sellItemName, str(sellItemPrice)) return "ȷ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>%s<EFBFBD><EFBFBD>%s<EFBFBD><EFBFBD>%s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" % (str(sellItemCount), sellItemName, str(sellItemPrice))
else: else:
return "确定要把%s%s金币卖掉吗?" % (sellItemName, str(sellItemPrice)) return "ȷ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>%s<EFBFBD><EFBFBD>%s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" % (sellItemName, str(sellItemPrice))
def DO_YOU_BUY_ITEM(sellItemName, sellItemCount, sellItemPrice): def DO_YOU_BUY_ITEM(sellItemName, sellItemCount, sellItemPrice):
if sellItemCount>1: if sellItemCount>1:
return "确定要把%s%s%s金币买进吗?" % (str(sellItemCount), sellItemName, str(sellItemPrice)) return "ȷ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>%s<EFBFBD><EFBFBD>%s<EFBFBD><EFBFBD>%s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" % (str(sellItemCount), sellItemName, str(sellItemPrice))
else: else:
return "确定要把%s%s金币买进吗?" % (sellItemName, str(sellItemPrice)) return "ȷ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>%s<EFBFBD><EFBFBD>%s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" % (sellItemName, str(sellItemPrice))
def REFINE_FAILURE_CAN_NOT_ATTACH(attachedItemName): def REFINE_FAILURE_CAN_NOT_ATTACH(attachedItemName):
return "无法镶嵌%s 的装备" % (attachedItemName) return "<EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD>Ƕ%s <20><>װ<EFBFBD><D7B0>" % (attachedItemName)
def REFINE_FAILURE_NO_SOCKET(attachedItemName): def REFINE_FAILURE_NO_SOCKET(attachedItemName):
return "没有可以镶嵌%s 的孔" % (attachedItemName) return "û<EFBFBD>п<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ%s <20>Ŀ<EFBFBD>" % (attachedItemName)
def REFINE_FAILURE_NO_GOLD_SOCKET(attachedItemName): def REFINE_FAILURE_NO_GOLD_SOCKET(attachedItemName):
return "没有可以镶嵌%s 的黄金孔" % (attachedItemName) return "û<EFBFBD>п<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ%s <20>Ļƽ<C4BB><C6BD>" % (attachedItemName)
def HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, dropItemCount): def HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, dropItemCount):
if dropItemCount>1: if dropItemCount>1:
return "确定要扔掉%d%s?" % (dropItemCount, dropItemName) return "ȷ<EFBFBD><EFBFBD>Ҫ<EFBFBD>ӵ<EFBFBD>%d<EFBFBD><EFBFBD>%s<EFBFBD><EFBFBD>?" % (dropItemCount, dropItemName)
else: else:
return "确定要扔掉%s?" % (dropItemName) return "ȷ<EFBFBD><EFBFBD>Ҫ<EFBFBD>ӵ<EFBFBD>%s<EFBFBD><EFBFBD>?" % (dropItemName)
def FISHING_NOTIFY(isFish, fishName): def FISHING_NOTIFY(isFish, fishName):
if isFish: if isFish:
return fishName # 夯贰 咯扁俊 绢恫 富捞 嘿绢乐绰单, 牢内爹捞 柄廉乐绢辑 汗盔且 荐啊 绝促 ばば... cython俊辑 牢内爹 俊矾 唱辑 瘤况滚覆... return fishName # <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><20><><EFBFBD><EFBFBD> <20>پ<EFBFBD><D9BE>ִµ<D6B4>, <20><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>־ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ф<EFBFBD>... cython<6F><6E><EFBFBD><EFBFBD> <20><><EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
else: else:
return "钓着" + fishName + "了。" return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" + fishName + "<EFBFBD>ˡ<EFBFBD>"
def FISHING_SUCCESS(isFish, fishName): def FISHING_SUCCESS(isFish, fishName):
if isFish: if isFish:
return "钓着" + fishName + "了。" return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" + fishName + "<EFBFBD>ˡ<EFBFBD>"
else: else:
return "获得" + fishName + "了。" return "<EFBFBD><EFBFBD><EFBFBD>" + fishName + "<EFBFBD>ˡ<EFBFBD>"
def NumberToMoneyString(number): def NumberToMoneyString(number):
if number <= 0: if number <= 0:
return "0" return "0<EFBFBD><EFBFBD>"
number = str(number) number = str(number)
result = CutMoneyString(number, 0, 4, "", "") result = CutMoneyString(number, 0, 4, "", "")
result = CutMoneyString(number, 4, 8, "", result) result = CutMoneyString(number, 4, 8, "<EFBFBD><EFBFBD>", result)
result = CutMoneyString(number, 8, 12, "亿", result) result = CutMoneyString(number, 8, 12, "<EFBFBD><EFBFBD>", result)
result = result + "" result = result + "<EFBFBD><EFBFBD>"
return result return result
@ -899,8 +907,8 @@ elif IsNEWCIBN() or IsCIBN10():
number = str(number) number = str(number)
result = CutMoneyString(number, 0, 4, "", "") result = CutMoneyString(number, 0, 4, "", "")
result = CutMoneyString(number, 4, 8, "", result) result = CutMoneyString(number, 4, 8, "<EFBFBD><EFBFBD>", result)
result = CutMoneyString(number, 8, 12, "亿", result) result = CutMoneyString(number, 8, 12, "<EFBFBD><EFBFBD>", result)
result = result + "JUN" result = result + "JUN"
return result return result

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,7 @@
#define ENABLE_NEW_EQUIPMENT_SYSTEM #define ENABLE_NEW_EQUIPMENT_SYSTEM
#define __BL_CLIP_MASK__ #define __BL_CLIP_MASK__
#define __BL_MOUSE_WHEEL_TOP_WINDOW__ #define __BL_MOUSE_WHEEL_TOP_WINDOW__
#define ENABLE_QUEST_RENEWAL // Quest Page Renewal by Owsap
bool LocaleService_IsYMIR(); bool LocaleService_IsYMIR();
bool LocaleService_IsJAPAN(); bool LocaleService_IsJAPAN();

View File

@ -1979,6 +1979,11 @@ typedef struct packet_quest_info
BYTE flag; BYTE flag;
} TPacketGCQuestInfo; } TPacketGCQuestInfo;
#if defined(ENABLE_QUEST_RENEWAL)
BYTE type;
bool is_confirmed;
#endif
typedef struct packet_quest_confirm typedef struct packet_quest_confirm
{ {
BYTE header; BYTE header;

View File

@ -1188,6 +1188,56 @@ PyObject* appLogoClose(PyObject* poSelf, PyObject* poArgs)
return Py_BuildNone(); return Py_BuildNone();
} }
#if defined(ENABLE_QUEST_RENEWAL)
PyObject* appGetTextLength(PyObject* poSelf, PyObject* poArgs)
{
int iLength = 0;
char* szString;
if (PyTuple_GetString(poArgs, 0, &szString))
iLength = MultiByteToWideChar(GetDefaultCodePage(), 0, szString, -1, nullptr, 0);
return Py_BuildValue("i", iLength);
}
PyObject* appGetTextWidth(PyObject* poSelf, PyObject* poArgs)
{
char* szString;
if (!PyTuple_GetString(poArgs, 0, &szString))
return Py_BuildValue("i", 0);
const DWORD dwDefaultCodePage = GetDefaultCodePage();
int iLength = MultiByteToWideChar(dwDefaultCodePage, 0, szString, -1, nullptr, 0);
wchar_t* wText = (wchar_t*)_alloca(2 * iLength);
iLength = MultiByteToWideChar(dwDefaultCodePage, 0, szString, -1, wText, iLength);
CGraphicText* pkDefaultFont = static_cast<CGraphicText*>(DefaultFont_GetResource());
if (!pkDefaultFont)
return Py_BuildValue("i", 0);
CGraphicFontTexture* pFont = pkDefaultFont->GetFontTexturePointer();
if (!pFont)
return Py_BuildValue("i", 0);
float fWidth = 0.0f;
for (int i = 0; i < iLength; ++i)
{
if (!wText[i])
continue;
CGraphicFontTexture::TCharacterInfomation* pCharacterInfomation = pFont->GetCharacterInfomation(dwDefaultCodePage, wText[i]);
if (!pCharacterInfomation)
continue;
fWidth += pCharacterInfomation->advance;
}
return Py_BuildValue("i", (int)ceilf(fWidth));
}
#endif
void initapp() void initapp()
{ {
static PyMethodDef s_methods[] = static PyMethodDef s_methods[] =
@ -1328,6 +1378,10 @@ void initapp()
{ "OnLogoOpen", appLogoOpen, METH_VARARGS }, { "OnLogoOpen", appLogoOpen, METH_VARARGS },
{ "OnLogoClose", appLogoClose, METH_VARARGS }, { "OnLogoClose", appLogoClose, METH_VARARGS },
#if defined(ENABLE_QUEST_RENEWAL)
{ "GetTextLength", appGetTextLength, METH_VARARGS },
{ "GetTextWidth", appGetTextWidth, METH_VARARGS },
#endif
{ NULL, NULL }, { NULL, NULL },
}; };
@ -1507,6 +1561,12 @@ void initapp()
PyModule_AddIntConstant(poModule, "ENABLE_DRAGON_SOUL_SYSTEM", 0); PyModule_AddIntConstant(poModule, "ENABLE_DRAGON_SOUL_SYSTEM", 0);
#endif #endif
#if defined(ENABLE_QUEST_RENEWAL)
PyModule_AddIntConstant(poModule, "ENABLE_QUEST_RENEWAL", 1);
#else
PyModule_AddIntConstant(poModule, "ENABLE_QUEST_RENEWAL", 0);
#endif
#if defined(__BL_CLIP_MASK__) #if defined(__BL_CLIP_MASK__)
PyModule_AddIntConstant(poModule, "__BL_CLIP_MASK__", true); PyModule_AddIntConstant(poModule, "__BL_CLIP_MASK__", true);
#else #else
@ -1519,6 +1579,12 @@ void initapp()
PyModule_AddIntConstant(poModule, "__BL_MOUSE_WHEEL_TOP_WINDOW__", false); PyModule_AddIntConstant(poModule, "__BL_MOUSE_WHEEL_TOP_WINDOW__", false);
#endif #endif
#if defined(ENABLE_CONQUEROR_LEVEL)
PyModule_AddIntConstant(poModule, "ENABLE_CONQUEROR_LEVEL", 1);
#else
PyModule_AddIntConstant(poModule, "ENABLE_CONQUEROR_LEVEL", 0);
#endif
#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM #ifdef ENABLE_NEW_EQUIPMENT_SYSTEM
PyModule_AddIntConstant(poModule, "ENABLE_NEW_EQUIPMENT_SYSTEM", 1); PyModule_AddIntConstant(poModule, "ENABLE_NEW_EQUIPMENT_SYSTEM", 1);
#else #else

View File

@ -145,7 +145,7 @@ int CPythonEventManager::RegisterEventSetFromString(const std::string& strScript
if (!pEventSet) if (!pEventSet)
return -1; return -1;
// SCRIPT_PARSING_FAILURE_CLEAR_BUG 스크립트 파싱 실패시 __ClearEventSetp 에서 에러 발생 // SCRIPT_PARSING_FAILURE_CLEAR_BUG <EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD>Ʈ <20>Ľ<EFBFBD> <20><><EFBFBD>н<EFBFBD> __ClearEventSetp <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>
pEventSet->pCurrentTextLine = NULL; pEventSet->pCurrentTextLine = NULL;
// END_OF_SCRIPT_PARSING_FAILURE_CLEAR_BUG // END_OF_SCRIPT_PARSING_FAILURE_CLEAR_BUG
@ -159,7 +159,7 @@ int CPythonEventManager::RegisterEventSetFromString(const std::string& strScript
pEventSet->poEventHandler = NULL; pEventSet->poEventHandler = NULL;
__InitEventSet(*pEventSet); __InitEventSet(*pEventSet);
// NOTE : 만약 단순한 스크립트 이벤트 실행 커맨드라면 다시 만든다. // NOTE : <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܼ<EFBFBD><DCBC><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
script::TCmd ScriptCommand; script::TCmd ScriptCommand;
int pEventPosition; int pEventPosition;
int iEventType; int iEventType;
@ -468,7 +468,7 @@ void CPythonEventManager::ProcessEventSet(TEventSet * pEventSet)
case EVENT_TYPE_WAIT: case EVENT_TYPE_WAIT:
{ {
//캐틱터 만들기 제국 설명등에서 설명 밑으로 쳐지는 버그 수정/EVENT_TYPE_WAIT 관련해서 테스트 필요. //ijƽ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEBFA1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>/EVENT_TYPE_WAIT <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>׽<EFBFBD>Ʈ <20>ʿ<EFBFBD>.
pEventSet->iyLocal = 0; pEventSet->iyLocal = 0;
pEventSet->isLock = true; pEventSet->isLock = true;
break; break;
@ -567,6 +567,7 @@ void CPythonEventManager::ProcessEventSet(TEventSet * pEventSet)
break; break;
} }
#if !defined(ENABLE_QUEST_RENEWAL)
// HIDE_QUEST_LETTER // HIDE_QUEST_LETTER
case EVENT_TYPE_QUEST_BUTTON_CLOSE: case EVENT_TYPE_QUEST_BUTTON_CLOSE:
{ {
@ -575,6 +576,7 @@ void CPythonEventManager::ProcessEventSet(TEventSet * pEventSet)
break; break;
} }
// END_OF_HIDE_QUEST_LETTER // END_OF_HIDE_QUEST_LETTER
#endif
case EVENT_TYPE_QUEST_BUTTON: case EVENT_TYPE_QUEST_BUTTON:
{ {
@ -584,8 +586,8 @@ void CPythonEventManager::ProcessEventSet(TEventSet * pEventSet)
int idx = atoi(GetArgument("idx", ScriptCommand.argList)); int idx = atoi(GetArgument("idx", ScriptCommand.argList));
const char * name = GetArgument("name", ScriptCommand.argList); const char * name = GetArgument("name", ScriptCommand.argList);
// 퀘스트 UI 리뉴얼이 되면 해결 되므로 일단 용혼석만 땜빵 by chrislee // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ UI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> <20>ذ<EFBFBD> <20>ǹǷ<C7B9> <20>ϴ<EFBFBD> <20><>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> by chrislee
if (!strcmp(name, "조각난 용혼석?....")) { if (!strcmp(name, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5>?....")) {
PyCallClassMemberFunc(m_poInterface, "BINARY_RecvQuest", Py_BuildValue("(isss)", idx, name, "highlight", "")); PyCallClassMemberFunc(m_poInterface, "BINARY_RecvQuest", Py_BuildValue("(isss)", idx, name, "highlight", ""));
} }
else { else {
@ -1146,7 +1148,7 @@ void CPythonEventManager::SetLeftTimeString(const char * c_szString)
} }
CPythonEventManager::CPythonEventManager() CPythonEventManager::CPythonEventManager()
: m_poInterface(0), m_strLeftTimeString("남은 시간 : %d초") : m_poInterface(0), m_strLeftTimeString("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> : %d<><64>")
{ {
EventTypeMap["LETTER"]=EVENT_TYPE_LETTER; EventTypeMap["LETTER"]=EVENT_TYPE_LETTER;
EventTypeMap["COLOR"]=EVENT_TYPE_COLOR; EventTypeMap["COLOR"]=EVENT_TYPE_COLOR;

View File

@ -212,7 +212,7 @@ void CPythonNetworkStream::GamePhase()
while (ret) while (ret)
{ {
if(dwRecvCount++ >= MAX_RECV_COUNT-1 && GetRecvBufferSize() < SAFE_RECV_BUFSIZE if(dwRecvCount++ >= MAX_RECV_COUNT-1 && GetRecvBufferSize() < SAFE_RECV_BUFSIZE
&& m_strPhase == "Game") //phase_game 이 아니어도 여기로 들어오는 경우가 있다. && m_strPhase == "Game") //phase_game <EFBFBD><EFBFBD> <20>ƴϾ <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><20>ִ<EFBFBD>.
break; break;
if (!CheckPacket(&header)) if (!CheckPacket(&header))
@ -239,7 +239,7 @@ void CPythonNetworkStream::GamePhase()
case HEADER_GC_PHASE: case HEADER_GC_PHASE:
ret = RecvPhasePacket(); ret = RecvPhasePacket();
return; // 도중에 Phase 가 바뀌면 일단 무조건 GamePhase 탈출 - [levites] return; // <EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> Phase <20><> <20>ٲ<EFBFBD><D9B2> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GamePhase Ż<><C5BB> - [levites]
break; break;
case HEADER_GC_PVP: case HEADER_GC_PVP:
@ -807,9 +807,9 @@ void CPythonNetworkStream::Warp(LONG lGlobalX, LONG lGlobalY)
//rkBgMgr.SetShadowLevel(CPythonBackground::SHADOW_ALL); //rkBgMgr.SetShadowLevel(CPythonBackground::SHADOW_ALL);
rkBgMgr.RefreshShadowLevel(); rkBgMgr.RefreshShadowLevel();
// NOTE : Warp 했을때 CenterPosition의 Height가 0이기 때문에 카메라가 땅바닥에 박혀있게 됨 // NOTE : Warp <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CenterPosition<6F><6E> Height<68><74> 0<>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<>޶<EFBFBD> <20><><EFBFBD>ٴڿ<D9B4> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD> <20><>
// 움직일때마다 Height가 갱신 되기 때문이므로 맵을 이동하면 Position을 강제로 한번 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Height<68><74> <20><><EFBFBD><EFBFBD> <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>ϸ<EFBFBD> Position<6F><6E> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD>
// 셋팅해준다 - [levites] // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD> - [levites]
LONG lLocalX = lGlobalX; LONG lLocalX = lGlobalX;
LONG lLocalY = lGlobalY; LONG lLocalY = lGlobalY;
__GlobalPositionToLocalPosition(lLocalX, lLocalY); __GlobalPositionToLocalPosition(lLocalX, lLocalY);
@ -857,7 +857,7 @@ void CPythonNetworkStream::SetGamePhase()
m_phaseProcessFunc.Set(this, &CPythonNetworkStream::GamePhase); m_phaseProcessFunc.Set(this, &CPythonNetworkStream::GamePhase);
m_phaseLeaveFunc.Set(this, &CPythonNetworkStream::__LeaveGamePhase); m_phaseLeaveFunc.Set(this, &CPythonNetworkStream::__LeaveGamePhase);
// Main Character 등록O // Main Character <EFBFBD><EFBFBD><EFBFBD>O
IAbstractPlayer & rkPlayer = IAbstractPlayer::GetSingleton(); IAbstractPlayer & rkPlayer = IAbstractPlayer::GetSingleton();
rkPlayer.SetMainCharacterIndex(GetMainActorVID()); rkPlayer.SetMainCharacterIndex(GetMainActorVID());
@ -972,11 +972,11 @@ bool CPythonNetworkStream::RecvPVPPacket()
case PVP_MODE_AGREE: case PVP_MODE_AGREE:
rkChrMgr.RemovePVPKey(kPVPPacket.dwVIDSrc, kPVPPacket.dwVIDDst); rkChrMgr.RemovePVPKey(kPVPPacket.dwVIDSrc, kPVPPacket.dwVIDDst);
// 상대가 나(Dst)에게 동의를 구했을때 // <EFBFBD><EFBFBD><20><>(Dst)<29><><EFBFBD><EFBFBD> <20><><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (rkPlayer.IsMainCharacterIndex(kPVPPacket.dwVIDDst)) if (rkPlayer.IsMainCharacterIndex(kPVPPacket.dwVIDDst))
rkPlayer.RememberChallengeInstance(kPVPPacket.dwVIDSrc); rkPlayer.RememberChallengeInstance(kPVPPacket.dwVIDSrc);
// 상대에게 동의를 구한 동안에는 대결 불능 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD> <20><><EFBFBD> <20>Ҵ<EFBFBD>
if (rkPlayer.IsMainCharacterIndex(kPVPPacket.dwVIDSrc)) if (rkPlayer.IsMainCharacterIndex(kPVPPacket.dwVIDSrc))
rkPlayer.RememberCantFightInstance(kPVPPacket.dwVIDDst); rkPlayer.RememberCantFightInstance(kPVPPacket.dwVIDDst);
break; break;
@ -987,11 +987,11 @@ bool CPythonNetworkStream::RecvPVPPacket()
DWORD dwKiller = kPVPPacket.dwVIDSrc; DWORD dwKiller = kPVPPacket.dwVIDSrc;
DWORD dwVictim = kPVPPacket.dwVIDDst; DWORD dwVictim = kPVPPacket.dwVIDDst;
// 내(victim)가 상대에게 복수할 수 있을때 // <EFBFBD><EFBFBD>(victim)<29><> <20><><EFBFBD><EBBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (rkPlayer.IsMainCharacterIndex(dwVictim)) if (rkPlayer.IsMainCharacterIndex(dwVictim))
rkPlayer.RememberRevengeInstance(dwKiller); rkPlayer.RememberRevengeInstance(dwKiller);
// 상대(victim)가 나에게 복수하는 동안에는 대결 불능 // <EFBFBD><EFBFBD><EFBFBD>(victim)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD> <20><><EFBFBD> <20>Ҵ<EFBFBD>
if (rkPlayer.IsMainCharacterIndex(dwKiller)) if (rkPlayer.IsMainCharacterIndex(dwKiller))
rkPlayer.RememberCantFightInstance(dwVictim); rkPlayer.RememberCantFightInstance(dwVictim);
break; break;
@ -1009,7 +1009,7 @@ bool CPythonNetworkStream::RecvPVPPacket()
break; break;
} }
// NOTE : PVP 토글시 TargetBoard 를 업데이트 합니다. // NOTE : PVP <EFBFBD><EFBFBD>۽<EFBFBD> TargetBoard <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>մϴ<D5B4>.
__RefreshTargetBoardByVID(kPVPPacket.dwVIDSrc); __RefreshTargetBoardByVID(kPVPPacket.dwVIDSrc);
__RefreshTargetBoardByVID(kPVPPacket.dwVIDDst); __RefreshTargetBoardByVID(kPVPPacket.dwVIDDst);
@ -1072,7 +1072,7 @@ bool CPythonNetworkStream::SendMessengerAddByNamePacket(const char * c_szName)
return false; return false;
char szName[CHARACTER_NAME_MAX_LEN]; char szName[CHARACTER_NAME_MAX_LEN];
strncpy(szName, c_szName, CHARACTER_NAME_MAX_LEN-1); strncpy(szName, c_szName, CHARACTER_NAME_MAX_LEN-1);
szName[CHARACTER_NAME_MAX_LEN-1] = '\0'; // #720: 메신저 이름 관련 버퍼 오버플로우 버그 수정 szName[CHARACTER_NAME_MAX_LEN-1] = '\0'; // #720: <EFBFBD>޽<EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>÷ο<C3B7> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (!Send(sizeof(szName), &szName)) if (!Send(sizeof(szName), &szName))
return false; return false;
@ -1106,7 +1106,7 @@ bool CPythonNetworkStream::SendCharacterStatePacket(const TPixelPosition& c_rkPP
else if (fDstRot > 360.0f) else if (fDstRot > 360.0f)
fDstRot = fmodf(fDstRot, 360.0f); fDstRot = fmodf(fDstRot, 360.0f);
// TODO: 나중에 패킷이름을 바꾸자 // TODO: <EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> <20><>Ŷ<EFBFBD≯<EFBFBD><CCB8><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD>
TPacketCGMove kStatePacket; TPacketCGMove kStatePacket;
kStatePacket.bHeader = HEADER_CG_CHARACTER_MOVE; kStatePacket.bHeader = HEADER_CG_CHARACTER_MOVE;
kStatePacket.bFunc = eFunc; kStatePacket.bFunc = eFunc;
@ -1135,7 +1135,7 @@ bool CPythonNetworkStream::SendCharacterStatePacket(const TPixelPosition& c_rkPP
return SendSequence(); return SendSequence();
} }
// NOTE : SlotIndex는 임시 // NOTE : SlotIndex<EFBFBD><EFBFBD> <20>ӽ<EFBFBD>
bool CPythonNetworkStream::SendUseSkillPacket(DWORD dwSkillIndex, DWORD dwTargetVID) bool CPythonNetworkStream::SendUseSkillPacket(DWORD dwSkillIndex, DWORD dwTargetVID)
{ {
TPacketCGUseSkill UseSkillPacket; TPacketCGUseSkill UseSkillPacket;
@ -1277,9 +1277,9 @@ bool CPythonNetworkStream::RecvChatPacket()
buf[uChatSize]='\0'; buf[uChatSize]='\0';
// 유럽 아랍 버전 처리 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƶ<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>
// "이름: 내용" 입력을 "내용: 이름" 순서로 출력하기 위해 탭(0x08)을 넣음 // "<EFBFBD≯<EFBFBD>: <20><><EFBFBD><EFBFBD>" <20>Է<EFBFBD><D4B7><EFBFBD> "<22><><EFBFBD><EFBFBD>: <20≯<EFBFBD>" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>(0x08)<29><> <20><><EFBFBD><EFBFBD>
// 탭을 아랍어 기호로 처리해 (영어1) : (영어2) 로 입력되어도 (영어2) : (영어1) 로 출력하게 만든다 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> <20><>ȣ<EFBFBD><C8A3> ó<><C3B3><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>1) : (<28><><EFBFBD><EFBFBD>2) <20><> <20>ԷµǾ (<28><><EFBFBD><EFBFBD>2) : (<28><><EFBFBD><EFBFBD>1) <20><> <20><><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
if (LocaleService_IsEUROPE() && GetDefaultCodePage() == 1256) if (LocaleService_IsEUROPE() && GetDefaultCodePage() == 1256)
{ {
char * p = strchr(buf, ':'); char * p = strchr(buf, ':');
@ -1305,11 +1305,11 @@ bool CPythonNetworkStream::RecvChatPacket()
switch (kChat.type) switch (kChat.type)
{ {
case CHAT_TYPE_TALKING: /* 그냥 채팅 */ case CHAT_TYPE_TALKING: /* <EFBFBD>׳<EFBFBD> ä<><C3A4> */
case CHAT_TYPE_PARTY: /* 파티말 */ case CHAT_TYPE_PARTY: /* <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> */
case CHAT_TYPE_GUILD: /* 길드말 */ case CHAT_TYPE_GUILD: /* <EFBFBD><EFBFBD> */
case CHAT_TYPE_SHOUT: /* 외치기 */ case CHAT_TYPE_SHOUT: /* <EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> */
case CHAT_TYPE_WHISPER: // 서버와는 연동되지 않는 Only Client Enum case CHAT_TYPE_WHISPER: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> Only Client Enum
{ {
char * p = strchr(buf, ':'); char * p = strchr(buf, ':');
@ -1347,9 +1347,9 @@ bool CPythonNetworkStream::RecvChatPacket()
} }
} }
break; break;
case CHAT_TYPE_COMMAND: /* 명령 */ case CHAT_TYPE_COMMAND: /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
case CHAT_TYPE_INFO: /* 정보 (아이템을 집었다, 경험치를 얻었다. 등) */ case CHAT_TYPE_INFO: /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>. <20><>) */
case CHAT_TYPE_NOTICE: /* 공지사항 */ case CHAT_TYPE_NOTICE: /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
case CHAT_TYPE_BIG_NOTICE: case CHAT_TYPE_BIG_NOTICE:
case CHAT_TYPE_MAX_NUM: case CHAT_TYPE_MAX_NUM:
default: default:
@ -1461,7 +1461,7 @@ bool CPythonNetworkStream::RecvPointChange()
CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetMainInstancePtr(); CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetMainInstancePtr();
// 자신의 Point가 변경되었을 경우.. // <EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD> Point<6E><74> <20><><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD>..
if (pInstance) if (pInstance)
if (PointChange.dwVID == pInstance->GetVirtualID()) if (PointChange.dwVID == pInstance->GetVirtualID())
{ {
@ -1558,7 +1558,7 @@ bool CPythonNetworkStream::RecvDeadPacket()
CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr(); CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr();
if (pkInstMain==pkChrInstSel) if (pkInstMain==pkChrInstSel)
{ {
Tracenf("주인공 사망"); Tracenf("<EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD> <20><><EFBFBD>");
if (false == pkInstMain->GetDuelMode()) if (false == pkInstMain->GetDuelMode())
{ {
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnGameOver", Py_BuildValue("()")); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnGameOver", Py_BuildValue("()"));
@ -1953,12 +1953,19 @@ bool CPythonNetworkStream::RecvQuestInfoPacket()
if (QUEST_PACKET_TYPE_END == byQuestPacketType) if (QUEST_PACKET_TYPE_END == byQuestPacketType)
{ {
rkQuest.DeleteQuestInstance(QuestInfo.index); rkQuest.DeleteQuestInstance(QuestInfo.index);
#if defined(ENABLE_QUEST_RENEWAL)
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "DeleteQuest", Py_BuildValue("(ii)", QuestInfo.type, QuestInfo.index));
#endif
} }
else if (QUEST_PACKET_TYPE_UPDATE == byQuestPacketType) else if (QUEST_PACKET_TYPE_UPDATE == byQuestPacketType)
{ {
if (!rkQuest.IsQuest(QuestInfo.index)) if (!rkQuest.IsQuest(QuestInfo.index))
{ {
#if defined(ENABLE_QUEST_RENEWAL)
rkQuest.MakeQuest(QuestInfo.index, QuestInfo.type, QuestInfo.is_confirmed);
#else
rkQuest.MakeQuest(QuestInfo.index); rkQuest.MakeQuest(QuestInfo.index);
#endif
} }
if (strlen(szTitle) > 0) if (strlen(szTitle) > 0)
@ -1974,6 +1981,9 @@ bool CPythonNetworkStream::RecvQuestInfoPacket()
rkQuest.SetQuestClockValue(QuestInfo.index, iClockValue); rkQuest.SetQuestClockValue(QuestInfo.index, iClockValue);
if (c_rFlag & QUEST_SEND_COUNTER_VALUE) if (c_rFlag & QUEST_SEND_COUNTER_VALUE)
rkQuest.SetQuestCounterValue(QuestInfo.index, iCounterValue); rkQuest.SetQuestCounterValue(QuestInfo.index, iCounterValue);
#if defined(ENABLE_QUEST_RENEWAL)
rkQuest.SetQuestIsConfirmed(QuestInfo.index, QuestInfo.is_confirmed);
#endif
} }
else if (QUEST_PACKET_TYPE_BEGIN == byQuestPacketType) else if (QUEST_PACKET_TYPE_BEGIN == byQuestPacketType)
{ {
@ -1989,7 +1999,12 @@ bool CPythonNetworkStream::RecvQuestInfoPacket()
} }
// Process Start End // Process Start End
#if defined(ENABLE_QUEST_RENEWAL)
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshQuest", Py_BuildValue("(ii)", QuestInfo.type, QuestInfo.index));
#else
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshQuest", Py_BuildValue("()")); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshQuest", Py_BuildValue("()"));
#endif
return true; return true;
} }
@ -2149,7 +2164,7 @@ bool CPythonNetworkStream::SendExchangeExitPacket()
return SendSequence(); return SendSequence();
} }
// PointReset 개임시 // PointReset <EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD>
bool CPythonNetworkStream::SendPointResetPacket() bool CPythonNetworkStream::SendPointResetPacket()
{ {
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "StartPointReset", Py_BuildValue("()")); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "StartPointReset", Py_BuildValue("()"));
@ -2303,7 +2318,7 @@ bool CPythonNetworkStream::RecvSkillCoolTimeEnd()
bool CPythonNetworkStream::RecvSkillLevel() bool CPythonNetworkStream::RecvSkillLevel()
{ {
assert(!"CPythonNetworkStream::RecvSkillLevel - 사용하지 않는 함수"); assert(!"CPythonNetworkStream::RecvSkillLevel - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20>Լ<EFBFBD>");
TPacketGCSkillLevel packet; TPacketGCSkillLevel packet;
if (!Recv(sizeof(TPacketGCSkillLevel), &packet)) if (!Recv(sizeof(TPacketGCSkillLevel), &packet))
{ {
@ -2529,7 +2544,7 @@ bool CPythonNetworkStream::RecvAddFlyTargetingPacket()
__GlobalPositionToLocalPosition(kPacket.lX, kPacket.lY); __GlobalPositionToLocalPosition(kPacket.lX, kPacket.lY);
Tracef("VID [%d]가 타겟을 추가 설정\n",kPacket.dwShooterVID); Tracef("VID [%d]<EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>\n",kPacket.dwShooterVID);
CPythonCharacterManager & rpcm = CPythonCharacterManager::Instance(); CPythonCharacterManager & rpcm = CPythonCharacterManager::Instance();
@ -2927,7 +2942,7 @@ bool CPythonNetworkStream::RecvPartyUpdate()
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "UpdatePartyMemberInfo", Py_BuildValue("(i)", kPartyUpdatePacket.pid)); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "UpdatePartyMemberInfo", Py_BuildValue("(i)", kPartyUpdatePacket.pid));
// 만약 리더가 바뀌었다면, TargetBoard 의 버튼을 업데이트 한다. // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD>ٸ<EFBFBD>, TargetBoard <20><> <20><>ư<EFBFBD><C6B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ѵ<EFBFBD>.
DWORD dwVID; DWORD dwVID;
if (CPythonPlayer::Instance().PartyMemberPIDToVID(kPartyUpdatePacket.pid, &dwVID)) if (CPythonPlayer::Instance().PartyMemberPIDToVID(kPartyUpdatePacket.pid, &dwVID))
if (byOldState != kPartyUpdatePacket.state) if (byOldState != kPartyUpdatePacket.state)
@ -3291,7 +3306,7 @@ bool CPythonNetworkStream::RecvGuild()
if (!Recv(sizeof(dwPID), &dwPID)) if (!Recv(sizeof(dwPID), &dwPID))
return false; return false;
// Main Player 일 경우 DeleteGuild // Main Player <EFBFBD><EFBFBD> <20><><EFBFBD> DeleteGuild
if (CPythonGuild::Instance().IsMainPlayer(dwPID)) if (CPythonGuild::Instance().IsMainPlayer(dwPID))
{ {
CPythonGuild::Instance().Destroy(); CPythonGuild::Instance().Destroy();
@ -4110,7 +4125,7 @@ bool CPythonNetworkStream::SendClientVersionPacket()
TPacketCGClientVersion2 kVersionPacket; TPacketCGClientVersion2 kVersionPacket;
kVersionPacket.header = HEADER_CG_CLIENT_VERSION2; kVersionPacket.header = HEADER_CG_CLIENT_VERSION2;
strncpy(kVersionPacket.filename, filename.c_str(), sizeof(kVersionPacket.filename)-1); strncpy(kVersionPacket.filename, filename.c_str(), sizeof(kVersionPacket.filename)-1);
strncpy(kVersionPacket.timestamp, "1215955205", sizeof(kVersionPacket.timestamp)-1); // # python time.time 앞자리 strncpy(kVersionPacket.timestamp, "1215955205", sizeof(kVersionPacket.timestamp)-1); // # python time.time <EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>
//strncpy(kVersionPacket.timestamp, __TIMESTAMP__, sizeof(kVersionPacket.timestamp)-1); // old_string_ver //strncpy(kVersionPacket.timestamp, __TIMESTAMP__, sizeof(kVersionPacket.timestamp)-1); // old_string_ver
//strncpy(kVersionPacket.timestamp, "1218055205", sizeof(kVersionPacket.timestamp)-1); // new_future //strncpy(kVersionPacket.timestamp, "1218055205", sizeof(kVersionPacket.timestamp)-1); // new_future
//strncpy(kVersionPacket.timestamp, "1214055205", sizeof(kVersionPacket.timestamp)-1); // old_past //strncpy(kVersionPacket.timestamp, "1214055205", sizeof(kVersionPacket.timestamp)-1); // old_past
@ -4251,7 +4266,7 @@ bool CPythonNetworkStream::RecvTargetCreatePacket()
//#ifdef _DEBUG //#ifdef _DEBUG
// char szBuf[256+1]; // char szBuf[256+1];
// _snprintf(szBuf, sizeof(szBuf), "타겟이 생성 되었습니다 [%d:%s]", kTargetCreate.lID, kTargetCreate.szTargetName); // _snprintf(szBuf, sizeof(szBuf), "Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD> [%d:%s]", kTargetCreate.lID, kTargetCreate.szTargetName);
// CPythonChat::Instance().AppendChat(CHAT_TYPE_NOTICE, szBuf); // CPythonChat::Instance().AppendChat(CHAT_TYPE_NOTICE, szBuf);
// Tracef(" >> RecvTargetCreatePacket %d : %s\n", kTargetCreate.lID, kTargetCreate.szTargetName); // Tracef(" >> RecvTargetCreatePacket %d : %s\n", kTargetCreate.lID, kTargetCreate.szTargetName);
//#endif //#endif
@ -4280,7 +4295,7 @@ bool CPythonNetworkStream::RecvTargetCreatePacketNew()
//#ifdef _DEBUG //#ifdef _DEBUG
// char szBuf[256+1]; // char szBuf[256+1];
// _snprintf(szBuf, sizeof(szBuf), "캐릭터 타겟이 생성 되었습니다 [%d:%s:%d]", kTargetCreate.lID, kTargetCreate.szTargetName, kTargetCreate.dwVID); // _snprintf(szBuf, sizeof(szBuf), "ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD> [%d:%s:%d]", kTargetCreate.lID, kTargetCreate.szTargetName, kTargetCreate.dwVID);
// CPythonChat::Instance().AppendChat(CHAT_TYPE_NOTICE, szBuf); // CPythonChat::Instance().AppendChat(CHAT_TYPE_NOTICE, szBuf);
// Tracef(" >> RecvTargetCreatePacketNew %d : %d/%d\n", kTargetCreate.lID, kTargetCreate.byType, kTargetCreate.dwVID); // Tracef(" >> RecvTargetCreatePacketNew %d : %d/%d\n", kTargetCreate.lID, kTargetCreate.byType, kTargetCreate.dwVID);
//#endif //#endif
@ -4303,7 +4318,7 @@ bool CPythonNetworkStream::RecvTargetUpdatePacket()
//#ifdef _DEBUG //#ifdef _DEBUG
// char szBuf[256+1]; // char szBuf[256+1];
// _snprintf(szBuf, sizeof(szBuf), "타겟의 위치가 갱신 되었습니다 [%d:%d/%d]", kTargetUpdate.lID, kTargetUpdate.lX, kTargetUpdate.lY); // _snprintf(szBuf, sizeof(szBuf), "Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD> [%d:%d/%d]", kTargetUpdate.lID, kTargetUpdate.lX, kTargetUpdate.lY);
// CPythonChat::Instance().AppendChat(CHAT_TYPE_NOTICE, szBuf); // CPythonChat::Instance().AppendChat(CHAT_TYPE_NOTICE, szBuf);
// Tracef(" >> RecvTargetUpdatePacket %d : %d, %d\n", kTargetUpdate.lID, kTargetUpdate.lX, kTargetUpdate.lY); // Tracef(" >> RecvTargetUpdatePacket %d : %d, %d\n", kTargetUpdate.lID, kTargetUpdate.lX, kTargetUpdate.lY);
//#endif //#endif
@ -4382,7 +4397,7 @@ bool CPythonNetworkStream::RecvDigMotionPacket()
} }
// 용혼석 강화 // <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><>ȭ
bool CPythonNetworkStream::SendDragonSoulRefinePacket(BYTE bRefineType, TItemPos* pos) bool CPythonNetworkStream::SendDragonSoulRefinePacket(BYTE bRefineType, TItemPos* pos)
{ {
TPacketCGDragonSoulRefine pk; TPacketCGDragonSoulRefine pk;

View File

@ -37,7 +37,12 @@ bool CPythonQuest::IsQuest(DWORD dwIndex)
return itor != m_QuestInstanceContainer.end(); return itor != m_QuestInstanceContainer.end();
} }
void CPythonQuest::MakeQuest(DWORD dwIndex) void CPythonQuest::MakeQuest(DWORD dwIndex
#if defined(ENABLE_QUEST_RENEWAL)
, BYTE bType
, bool bIsConfirmed
#endif
)
{ {
DeleteQuestInstance(dwIndex); DeleteQuestInstance(dwIndex);
m_QuestInstanceContainer.push_back(SQuestInstance()); m_QuestInstanceContainer.push_back(SQuestInstance());
@ -47,6 +52,10 @@ void CPythonQuest::MakeQuest(DWORD dwIndex)
SQuestInstance & rQuestInstance = *m_QuestInstanceContainer.rbegin(); SQuestInstance & rQuestInstance = *m_QuestInstanceContainer.rbegin();
rQuestInstance.dwIndex = dwIndex; rQuestInstance.dwIndex = dwIndex;
rQuestInstance.iStartTime = int(CTimer::Instance().GetCurrentSecond()); rQuestInstance.iStartTime = int(CTimer::Instance().GetCurrentSecond());
#if defined(ENABLE_QUEST_RENEWAL)
rQuestInstance.bType = bType;
rQuestInstance.bIsConfirmed = bIsConfirmed;
#endif
} }
void CPythonQuest::SetQuestTitle(DWORD dwIndex, const char * c_szTitle) void CPythonQuest::SetQuestTitle(DWORD dwIndex, const char * c_szTitle)
@ -104,12 +113,51 @@ void CPythonQuest::SetQuestIconFileName(DWORD dwIndex, const char * c_szIconFile
pQuestInstance->strIconFileName = c_szIconFileName; pQuestInstance->strIconFileName = c_szIconFileName;
} }
#if defined(ENABLE_QUEST_RENEWAL)
void CPythonQuest::SetQuestIsConfirmed(DWORD dwIndex, bool bIsConfirmed)
{
SQuestInstance* pQuestInstance;
if (!__GetQuestInstancePtr(dwIndex, &pQuestInstance))
return;
pQuestInstance->bIsConfirmed = bIsConfirmed;
}
#endif
int CPythonQuest::GetQuestCount() int CPythonQuest::GetQuestCount()
{ {
return m_QuestInstanceContainer.size(); return m_QuestInstanceContainer.size();
} }
bool CPythonQuest::GetQuestInstancePtr(DWORD dwArrayIndex, SQuestInstance ** ppQuestInstance) #if defined(ENABLE_QUEST_RENEWAL)
int CPythonQuest::GetQuestButtonNoticeCount(BYTE bQuestType)
{
int count = 0;
for (TQuestInstanceContainer::iterator::value_type& it : m_QuestInstanceContainer)
{
if (bQuestType == QUEST_TYPE_MAX)
count += 1;
else
if (it.bType == bQuestType)
count += 1;
}
return count;
}
#endif
#if defined(ENABLE_QUEST_RENEWAL)
bool CPythonQuest::GetQuestInstancePtr(DWORD dwQuestIndex, SQuestInstance** ppQuestInstance)
{
TQuestInstanceContainer::iterator itor = std::find_if(m_QuestInstanceContainer.begin(), m_QuestInstanceContainer.end(), FQuestInstanceCompare(dwQuestIndex));
if (itor == m_QuestInstanceContainer.end())
return false;
const DWORD dwVectorIndex = std::distance(m_QuestInstanceContainer.begin(), itor);
*ppQuestInstance = &m_QuestInstanceContainer[dwVectorIndex];
return true;
}
#else
bool CPythonQuest::GetQuestInstancePtr(DWORD dwArrayIndex, SQuestInstance** ppQuestInstance)
{ {
if (dwArrayIndex >= m_QuestInstanceContainer.size()) if (dwArrayIndex >= m_QuestInstanceContainer.size())
return false; return false;
@ -118,6 +166,7 @@ bool CPythonQuest::GetQuestInstancePtr(DWORD dwArrayIndex, SQuestInstance ** ppQ
return true; return true;
} }
#endif
bool CPythonQuest::__GetQuestInstancePtr(DWORD dwQuestIndex, SQuestInstance ** ppQuestInstance) bool CPythonQuest::__GetQuestInstancePtr(DWORD dwQuestIndex, SQuestInstance ** ppQuestInstance)
{ {
@ -140,8 +189,8 @@ void CPythonQuest::__Initialize()
test.dwIndex = i; test.dwIndex = i;
test.strIconFileName = ""; test.strIconFileName = "";
test.strTitle = _getf("test%d", i); test.strTitle = _getf("test%d", i);
test.strClockName = "남은 시간"; test.strClockName = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD>";
test.strCounterName = "남은 마리수"; test.strCounterName = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
test.iClockValue = 1000; test.iClockValue = 1000;
test.iCounterValue = 1000; test.iCounterValue = 1000;
test.iStartTime = 0; test.iStartTime = 0;
@ -196,16 +245,27 @@ PyObject * questGetQuestData(PyObject * poSelf, PyObject * poArgs)
else else
{ {
{ {
// 비어있을 경우 디폴트 이미지를 넣는다. // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>̹<EFBFBD><CCB9><EFBFBD><EFBFBD><EFBFBD> <20>ִ´<D6B4>.
std::string strIconFileName = "season1/icon/scroll_open.tga"; std::string strIconFileName = "season1/icon/scroll_open.tga";
pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(strIconFileName.c_str()); pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(strIconFileName.c_str());
} }
} }
return Py_BuildValue("sisi", pQuestInstance->strTitle.c_str(), #if defined(ENABLE_QUEST_RENEWAL)
pImage, return Py_BuildValue("ibsisi",
pQuestInstance->strCounterName.c_str(), pQuestInstance->bType,
pQuestInstance->iCounterValue); pQuestInstance->bIsConfirmed,
pQuestInstance->strTitle.c_str(),
pImage,
pQuestInstance->strCounterName.c_str(),
pQuestInstance->iCounterValue);
#else
return Py_BuildValue("sisi",
pQuestInstance->strTitle.c_str(),
pImage,
pQuestInstance->strCounterName.c_str(),
pQuestInstance->iCounterValue);
#endif
} }
PyObject * questGetQuestIndex(PyObject * poSelf, PyObject * poArgs) PyObject * questGetQuestIndex(PyObject * poSelf, PyObject * poArgs)
@ -238,7 +298,7 @@ PyObject * questGetQuestLastTime(PyObject * poSelf, PyObject * poArgs)
iLastTime = (pQuestInstance->iStartTime + pQuestInstance->iClockValue) - int(CTimer::Instance().GetCurrentSecond()); iLastTime = (pQuestInstance->iStartTime + pQuestInstance->iClockValue) - int(CTimer::Instance().GetCurrentSecond());
} }
// 시간 증가 처리 코드 // <EFBFBD>ð<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3> <20>ڵ<EFBFBD>
// else // else
// { // {
// iLastTime = int(CTimer::Instance().GetCurrentSecond()) - pQuestInstance->iStartTime; // iLastTime = int(CTimer::Instance().GetCurrentSecond()) - pQuestInstance->iStartTime;
@ -253,6 +313,18 @@ PyObject * questClear(PyObject * poSelf, PyObject * poArgs)
return Py_BuildNone(); return Py_BuildNone();
} }
#if defined(ENABLE_QUEST_RENEWAL)
PyObject* questGetQuestCounterData(PyObject* poSelf, PyObject* poArgs) { return Py_BuildNone(); }
PyObject* questGetQuestButtonNoticeCount(PyObject* poSelf, PyObject* poArgs)
{
BYTE bType;
if (!PyTuple_GetInteger(poArgs, 0, &bType))
return Py_BadArgument();
return Py_BuildValue("i", CPythonQuest::Instance().GetQuestButtonNoticeCount(bType));
}
#endif
void initquest() void initquest()
{ {
static PyMethodDef s_methods[] = static PyMethodDef s_methods[] =
@ -262,9 +334,29 @@ void initquest()
{ "GetQuestIndex", questGetQuestIndex, METH_VARARGS }, { "GetQuestIndex", questGetQuestIndex, METH_VARARGS },
{ "GetQuestLastTime", questGetQuestLastTime, METH_VARARGS }, { "GetQuestLastTime", questGetQuestLastTime, METH_VARARGS },
{ "Clear", questClear, METH_VARARGS }, { "Clear", questClear, METH_VARARGS },
#if defined(ENABLE_QUEST_RENEWAL)
{ "GetQuestCounterData", questGetQuestCounterData, METH_VARARGS },
{ "GetQuestButtonNoticeCount", questGetQuestButtonNoticeCount, METH_VARARGS },
#endif
{ NULL, NULL, NULL }, { NULL, NULL, NULL },
}; };
PyObject * poModule = Py_InitModule("quest", s_methods); PyObject * poModule = Py_InitModule("quest", s_methods);
PyModule_AddIntConstant(poModule, "QUEST_MAX_NUM", 5); PyModule_AddIntConstant(poModule, "QUEST_MAX_NUM", 5);
#if defined(ENABLE_QUEST_RENEWAL)
PyModule_AddIntConstant(poModule, "QUEST_TYPE_MAIN", CPythonQuest::QUEST_TYPE_MAIN);
PyModule_AddIntConstant(poModule, "QUEST_TYPE_SUB", CPythonQuest::QUEST_TYPE_SUB);
PyModule_AddIntConstant(poModule, "QUEST_TYPE_LEVELUP", CPythonQuest::QUEST_TYPE_LEVELUP);
PyModule_AddIntConstant(poModule, "QUEST_TYPE_EVENT", CPythonQuest::QUEST_TYPE_EVENT);
PyModule_AddIntConstant(poModule, "QUEST_TYPE_COLLECTION", CPythonQuest::QUEST_TYPE_COLLECTION);
PyModule_AddIntConstant(poModule, "QUEST_TYPE_SYSTEM", CPythonQuest::QUEST_TYPE_SYSTEM);
PyModule_AddIntConstant(poModule, "QUEST_TYPE_SCROLL", CPythonQuest::QUEST_TYPE_SCROLL);
PyModule_AddIntConstant(poModule, "QUEST_TYPE_DAILY", CPythonQuest::QUEST_TYPE_DAILY);
PyModule_AddIntConstant(poModule, "QUEST_TYPE_UNEXPOSED", CPythonQuest::QUEST_TYPE_UNEXPOSED);
PyModule_AddIntConstant(poModule, "QUEST_TYPE_MAX", CPythonQuest::QUEST_TYPE_MAX);
PyModule_AddIntConstant(poModule, "QUEST_STRING_TYPE_NORMAL", CPythonQuest::QUEST_STRING_TYPE_NORMAL);
PyModule_AddIntConstant(poModule, "QUEST_STRING_TYPE_CLOCK", CPythonQuest::QUEST_STRING_TYPE_CLOCK);
PyModule_AddIntConstant(poModule, "QUEST_STRING_TYPE_COUNT", CPythonQuest::QUEST_STRING_TYPE_COUNT);
#endif
} }

View File

@ -25,9 +25,50 @@ class CPythonQuest : public CSingleton<CPythonQuest>
int iCounterValue; int iCounterValue;
int iStartTime; int iStartTime;
#if defined(ENABLE_QUEST_RENEWAL)
BYTE bType;
bool bIsConfirmed;
#endif
}; };
typedef std::vector<SQuestInstance> TQuestInstanceContainer; typedef std::vector<SQuestInstance> TQuestInstanceContainer;
#if defined(ENABLE_QUEST_RENEWAL)
enum EQuestStringType
{
QUEST_STRING_TYPE_NORMAL,
QUEST_STRING_TYPE_CLOCK,
QUEST_STRING_TYPE_COUNT,
QUEST_STRING_TYPE_MAX
};
enum EQuestType
{
QUEST_TYPE_MAIN,
QUEST_TYPE_SUB,
QUEST_TYPE_LEVELUP,
QUEST_TYPE_EVENT,
QUEST_TYPE_COLLECTION,
QUEST_TYPE_SYSTEM,
QUEST_TYPE_SCROLL,
QUEST_TYPE_DAILY,
QUEST_TYPE_UNEXPOSED,
QUEST_TYPE_MAX
};
enum EQuestSkin
{
QUEST_SKIN_NOWINDOW,
QUEST_SKIN_NORMAL,
QUEST_SKIN_UNKOWN1,
QUEST_SKIN_UNKOWN2,
QUEST_SKIN_SCROLL,
QUEST_SKIN_CINEMATIC,
QUEST_SKIN_COUNT,
QUEST_SKIN_MAX
};
#endif
public: public:
CPythonQuest(); CPythonQuest();
virtual ~CPythonQuest(); virtual ~CPythonQuest();
@ -38,7 +79,12 @@ class CPythonQuest : public CSingleton<CPythonQuest>
void DeleteQuestInstance(DWORD dwIndex); void DeleteQuestInstance(DWORD dwIndex);
bool IsQuest(DWORD dwIndex); bool IsQuest(DWORD dwIndex);
void MakeQuest(DWORD dwIndex); void MakeQuest(DWORD dwIndex
#if defined(ENABLE_QUEST_RENEWAL)
, BYTE bIndex
, bool bIsConfirmed
#endif
);
void SetQuestTitle(DWORD dwIndex, const char * c_szTitle); void SetQuestTitle(DWORD dwIndex, const char * c_szTitle);
void SetQuestClockName(DWORD dwIndex, const char * c_szClockName); void SetQuestClockName(DWORD dwIndex, const char * c_szClockName);
@ -46,9 +92,17 @@ class CPythonQuest : public CSingleton<CPythonQuest>
void SetQuestClockValue(DWORD dwIndex, int iClockValue); void SetQuestClockValue(DWORD dwIndex, int iClockValue);
void SetQuestCounterValue(DWORD dwIndex, int iCounterValue); void SetQuestCounterValue(DWORD dwIndex, int iCounterValue);
void SetQuestIconFileName(DWORD dwIndex, const char * c_szIconFileName); void SetQuestIconFileName(DWORD dwIndex, const char * c_szIconFileName);
#if defined(ENABLE_QUEST_RENEWAL)
void SetQuestIsConfirmed(DWORD dwIndex, bool bIsConfirmed);
#endif
int GetQuestCount(); int GetQuestCount();
#if defined(ENABLE_QUEST_RENEWAL)
int GetQuestButtonNoticeCount(BYTE bQuestType);
bool GetQuestInstancePtr(DWORD dwQuestIndex, SQuestInstance ** ppQuestInstance);
#else
bool GetQuestInstancePtr(DWORD dwArrayIndex, SQuestInstance ** ppQuestInstance); bool GetQuestInstancePtr(DWORD dwArrayIndex, SQuestInstance ** ppQuestInstance);
#endif
protected: protected:
void __Initialize(); void __Initialize();