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
YES Ano
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
YES Ja
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
YES Ja
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
YES Yes
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
YES Sí
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.
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
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 Αποστολή
YES Ναι
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
YES Igen
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
YES Sì.
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
YES Ja
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
YES Tak
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
YES Sim
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
YES Da
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 Îòïðàâèòü
YES äà
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
YES Evet
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.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.__SetQuickSlotMode()
@ -226,7 +226,7 @@ class GameWindow(ui.ScriptWindow):
exception.Abort("GameWindow.Open")
# 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 }, ... ]
self.cubeInformation = {}
self.currentCubeNPC = 0
@ -314,10 +314,10 @@ class GameWindow(ui.ScriptWindow):
def __BuildKeyDict(self):
onPressKeyDict = {}
##PressKey 는 누르고 있는 동안 계속 적용되는 키이다.
##PressKey <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>Ǵ<EFBFBD> Ű<>̴<EFBFBD>.
## 숫자 단축키 퀵슬롯에 이용된다.(이후 숫자들도 퀵 슬롯용 예약)
## F12 는 클라 디버그용 키이므로 쓰지 않는 게 좋다.
## <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 <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_2] = lambda : self.__PressNumKey(2)
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_SPACE] = lambda : self.StartAttack()
#캐릭터 이동키
#ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>Ű
onPressKeyDict[app.DIK_UP] = lambda : self.MoveUp()
onPressKeyDict[app.DIK_DOWN] = lambda : self.MoveDown()
onPressKeyDict[app.DIK_LEFT] = lambda : self.MoveLeft()
@ -564,12 +564,12 @@ class GameWindow(ui.ScriptWindow):
self.TextureNum.SetFontName(localeInfo.UI_DEF_FONT)
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.SetFontName(localeInfo.UI_DEF_FONT)
self.ObjectNum.SetPosition(wndMgr.GetScreenWidth() - 270, 120)
# 시야거리
# <EFBFBD>þ߰Ÿ<EFBFBD>
self.ViewDistance = ui.TextLine()
self.ViewDistance.SetFontName(localeInfo.UI_DEF_FONT)
self.ViewDistance.SetPosition(0, 0)
@ -659,8 +659,15 @@ class GameWindow(ui.ScriptWindow):
if self.interface:
self.interface.RefreshSkill()
def RefreshQuest(self):
self.interface.RefreshQuest()
if app.ENABLE_QUEST_RENEWAL:
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):
self.interface.RefreshMessenger()
@ -1302,7 +1309,7 @@ class GameWindow(ui.ScriptWindow):
self.__DropMoney(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():
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP)
return
@ -1324,7 +1331,7 @@ class GameWindow(ui.ScriptWindow):
self.itemDropQuestionDialog = itemDropQuestionDialog
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():
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP)
return
@ -1456,7 +1463,7 @@ class GameWindow(ui.ScriptWindow):
def UpdateDebugInfo(self):
#
# 캐릭터 좌표 및 FPS 출력
# ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ <20><> FPS <20><><EFBFBD>
(x, y, z) = player.GetMainCharacterPosition()
nUpdateTime = app.GetUpdateTime()
nUpdateFPS = app.GetUpdateFPS()
@ -1619,22 +1626,22 @@ class GameWindow(ui.ScriptWindow):
def BINARY_Cube_Close(self):
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):
self.interface.UpdateCubeInfo(gold, itemVnum, count)
def BINARY_Cube_Succeed(self, itemVnum, count):
print "큐브 제작 성공"
print "ť<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
self.interface.SucceedCubeWork(itemVnum, count)
pass
def BINARY_Cube_Failed(self):
print "큐브 제작 실패"
print "ť<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
self.interface.FailedCubeWork()
pass
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
if npcVNUM == 0:
@ -1735,7 +1742,7 @@ class GameWindow(ui.ScriptWindow):
# END_OF_CUBE
# 용혼석
# <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>
def BINARY_Highlight_Item(self, inven_type, inven_pos):
self.interface.Highligt_Item(inven_type, inven_pos)

View File

@ -45,6 +45,9 @@ import uiScriptLocale
import event
import localeInfo
if app.ENABLE_QUEST_RENEWAL:
import quest
IsQBHide = 0
class Interface(object):
CHARACTER_STATUS_TAB = 1
@ -277,7 +280,7 @@ class Interface(object):
self.wndItemSelect = uiselectitem.SelectItemWindow()
self.wndItemSelect.Hide()
# END_OF_ACCESSORY_REFINE_ADD_METIN_STONE
def MakeInterface(self):
self.__MakeMessengerWindow()
self.__MakeGuildWindow()
@ -294,13 +297,14 @@ class Interface(object):
self.__MakeWebWindow()
self.__MakeCubeWindow()
self.__MakeCubeResultWindow()
# ACCESSORY_REFINE_ADD_METIN_STONE
self.__MakeItemSelectWindow()
# END_OF_ACCESSORY_REFINE_ADD_METIN_STONE
self.questButtonList = []
if app.ENABLE_QUEST_RENEWAL:
self.__MakeQuestButton()
self.whisperButtonList = []
self.whisperDialogDict = {}
self.privateShopAdvertisementBoardDict = {}
@ -564,12 +568,13 @@ class Interface(object):
if app.ENABLE_DRAGON_SOUL_SYSTEM:
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.wndTaskBar.RefreshQuickSlot()
def RefreshQuest(self):
self.wndCharacter.RefreshQuest()
if not app.ENABLE_QUEST_RENEWAL:
def RefreshQuest(self):
self.wndCharacter.RefreshQuest()
def RefreshSafebox(self):
self.wndSafebox.RefreshSafebox()
@ -690,7 +695,7 @@ class Interface(object):
def RemovePartyMember(self, pid):
self.wndParty.RemovePartyMember(pid)
##!! 20061026.levites.퀘스트_위치_보정
##!! 20061026.levites.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ_<EFBFBD><EFBFBD>ġ_<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
self.__ArrangeQuestButton()
def LinkPartyMember(self, pid, vid):
@ -705,7 +710,7 @@ class Interface(object):
def ExitParty(self):
self.wndParty.ExitParty()
##!! 20061026.levites.퀘스트_위치_보정
##!! 20061026.levites.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ_<EFBFBD><EFBFBD>ġ_<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
self.__ArrangeQuestButton()
def PartyHealReady(self):
@ -868,7 +873,7 @@ class Interface(object):
if True == self.wndChat.IsEditMode():
self.wndChat.CloseChat()
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():
pass
else:
@ -969,7 +974,7 @@ class Interface(object):
else:
self.wndExpandedTaskBar.Close()
# 용혼석
# <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>
def DragonSoulActivate(self, deck):
if app.ENABLE_DRAGON_SOUL_SYSTEM:
self.wndDragonSoul.ActivateDragonSoulByExtern(deck)
@ -1040,7 +1045,7 @@ class Interface(object):
if True == self.wndDragonSoulRefine.IsShow():
self.wndDragonSoulRefine.Close()
# 용혼석 끝
# <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><>
def ToggleGuildWindow(self):
if not self.wndGuild.IsShow():
@ -1090,7 +1095,7 @@ class Interface(object):
def OpenWebWindow(self, 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()
# show GIFT
@ -1118,9 +1123,9 @@ class Interface(object):
def SucceedCubeWork(self, itemVnum, count):
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.SetCubeResultItem(itemVnum, count)
self.wndCubeResult.Open()
@ -1263,119 +1268,197 @@ class Interface(object):
#####################################################################################
#####################################################################################
### Quest ###
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
### Quest ###
if app.ENABLE_QUEST_RENEWAL:
def RefreshQuest(self, quest_type, quest_index):
self.wndCharacter.RefreshQuest(quest_type, quest_index)
def BINARY_RecvQuest(self, index, name, iconType, iconName):
# Refresh quest button.
self.__RefreshQuestButton()
btn = self.__FindQuestButton(index)
if 0 != btn:
def DeleteQuest(self, quest_type, quest_index):
self.wndCharacter.DeleteQuest(quest_type, quest_index)
# Unused.
def ShowQuestButton(self):
pass
def __OnClickQuestLetterButton(self, btn):
self.OpenCharacterWindowWithState("QUEST")
if btn.type == quest.QUEST_TYPE_EVENT:
self.wndCharacter.OpenQuestCategory(quest.QUEST_TYPE_EVENT, True)
self.HideAllQuestButton()
global IsQBHide
IsQBHide = 1
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:
buttonImageFileName = iconName
if localeInfo.IsEUROPE():
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
if IsQBHide:
btn.Hide()
else:
btn.Show()
def __StartQuest(self, btn):
event.QuestButtonClick(btn.index)
self.__DestroyQuestButton(btn)
btn = uiWhisper.WhisperButton()
def __FindQuestButton(self, index):
for btn in self.questButtonList:
if btn.index == index:
return btn
# QUEST_LETTER_IMAGE
##!! 20061026.levites.퀘스트_이미지_교체
import item
if "item"==iconType:
item.SelectItem(int(iconName))
buttonImageFileName=item.GetIconImageFileName()
else:
buttonImageFileName=iconName
return 0
if localeInfo.IsEUROPE():
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
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 __DestroyQuestButton(self, btn):
btn.SetEvent(0)
self.questButtonList.remove(btn)
self.__ArrangeQuestButton()
def HideAllQuestButton(self):
for btn in self.questButtonList:
btn.Hide()
def ShowAllQuestButton(self):
for btn in self.questButtonList:
btn.Show()
if app.ENABLE_QUEST_RENEWAL:
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):
chat.InitWhisper(self)
## 채팅창의 "메시지 보내기"를 눌렀을때 이름 없는 대화창을 여는 함수
## 이름이 없기 때문에 기존의 WhisperDialogDict 와 별도로 관리된다.
## ä<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>
## <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):
if not self.dlgWhisperWithoutTarget:
dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog)
@ -1402,7 +1485,7 @@ class Interface(object):
self.dlgWhisperWithoutTarget.SetTop()
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):
if not self.dlgWhisperWithoutTarget:
return
@ -1421,7 +1504,7 @@ class Interface(object):
self.dlgWhisperWithoutTarget = None
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):
if not self.whisperDialogDict.has_key(name):
dlg = self.__MakeWhisperDialog(name)
@ -1434,7 +1517,7 @@ class Interface(object):
if 0 != 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):
if not self.whisperDialogDict.has_key(name):
btn = self.__FindWhisperButton(name)
@ -1453,7 +1536,7 @@ class Interface(object):
def MakeWhisperButton(self, 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):
try:
self.__MakeWhisperDialog(btn.name)
@ -1465,11 +1548,11 @@ class Interface(object):
import dbg
dbg.TraceError("interface.ShowWhisperDialog - Failed to find key")
## 버튼 초기화
## <EFBFBD><EFBFBD>ư <20>ʱ<EFBFBD>ȭ
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):
if 0 != name:
@ -1477,8 +1560,8 @@ class Interface(object):
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):
if 0 == name:
@ -1497,7 +1580,7 @@ class Interface(object):
import dbg
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):
screenWidth = wndMgr.GetScreenWidth()
@ -1514,9 +1597,9 @@ class Interface(object):
button.SetPosition(xPos + (int(count/yCount) * -50), yPos + (count%yCount * 63))
count += 1
## 이름으로 Whisper 버튼을 찾아 리턴해 주는 함수
## 버튼은 딕셔너리로 하지 않는 것은 정렬 되어 버려 순서가 유지 되지 않으며
## 이로 인해 ToolTip들이 다른 버튼들에 의해 가려지기 때문이다.
## <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>
## <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):
for button in self.whisperButtonList:
if button.name == name:
@ -1524,7 +1607,7 @@ class Interface(object):
return 0
## 창을 만듭니다.
## â<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϴ<EFBFBD>.
def __MakeWhisperDialog(self, name):
dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog)
dlgWhisper.BindInterface(self)
@ -1536,7 +1619,7 @@ class Interface(object):
return dlgWhisper
## 버튼을 만듭니다.
## <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϴ<EFBFBD>.
def __MakeWhisperButton(self, name):
whisperButton = uiWhisper.WhisperButton()
whisperButton.SetUpVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub")

View File

@ -1,9 +1,9 @@
import app
import constInfo
MAP_TRENT02 = "MAP_TRENT02" # 烙矫
MAP_WL = "MAP_WL" # 烙矫
MAP_NUSLUCK = "MAP_NUSLUCK" # 烙矫
MAP_TRENT02 = "MAP_TRENT02" # <EFBFBD>ӽ<EFBFBD>
MAP_WL = "MAP_WL" # <EFBFBD>ӽ<EFBFBD>
MAP_NUSLUCK = "MAP_NUSLUCK" # <EFBFBD>ӽ<EFBFBD>
MAP_TREE2 = "MAP_TREE2"
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_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_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_SYMBOLS = '!@#$%^&*()_+|{}:"<>?~'
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_HONGKONG = "HONGKONG" == app.GetLocaleServiceName()
@ -106,7 +106,7 @@ def IsWE_KOREA():
def LoadLocaleData():
if IsYMIR():
import net
SERVER = "蔫档 辑滚"
SERVER = "<EFBFBD><20><><EFBFBD><EFBFBD>"
if SERVER == net.GetServerInfo()[:len(SERVER)]:
app.SetCHEONMA(0)
app.LoadLocaleData("locale/we_korea")
@ -119,7 +119,7 @@ def LoadLocaleData():
app.LoadLocaleData(app.GetLocalePath())
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
@ -181,13 +181,13 @@ elif IsSINGAPORE() :
LOCALE_FILE_NAME = "%s/locale_game.txt" % app.GetLocalePath()
constInfo.IN_GAME_SHOP_ENABLE = 0
elif IsNEWCIBN() :
##霸烙疙捞柄柳促.
APP_TITLE = "新倚天2"
##<EFBFBD><EFBFBD><EFBFBD>Ӹ<EFBFBD><EFBFBD>̱<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
APP_TITLE = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2"
FN_GM_MARK = "%s/effect/gm.mse" % app.GetLocalePath()
LOCALE_FILE_NAME = "%s/locale_game.txt" % app.GetLocalePath()
constInfo.IN_GAME_SHOP_ENABLE = 1
elif IsTAIWAN():
APP_TITLE = "矮III瓣"
APP_TITLE = "<EFBFBD><EFBFBD>III<EFBFBD><EFBFBD>"
FN_GM_MARK = "%s/effect/gm.mse" % app.GetLocalePath()
LOCALE_FILE_NAME = "%s/locale_game.txt" % app.GetLocalePath()
@ -202,31 +202,31 @@ else:
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 = {
"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 = {
"":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, "":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, "":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, "":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, "":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, "":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, "":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, "":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, "":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, "":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, "":1, "":1,
"":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "":1, "<EFBFBD>":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, "":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, "":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, "":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, "":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, "":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,
"<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,
"<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,
"<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,
"<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,
"<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,
"<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,
"<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,
"<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,
"<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,
"<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,
"<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,
"<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, "<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,
"<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, "<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, "<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,
"<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,
"<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(
@ -415,129 +415,129 @@ JOBINFO_TITLE = [
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():
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():
def EUL(name):
if GetAuxiliaryWordType(name):
return ""
return "<EFBFBD><EFBFBD> "
else:
return ""
return "<EFBFBD><EFBFBD> "
def I(name):
if GetAuxiliaryWordType(name):
return " "
return "<EFBFBD><EFBFBD> "
else:
return " "
return "<EFBFBD><EFBFBD> "
def DO_YOU_SELL_ITEM(sellItemName, sellItemCount, sellItemPrice):
name = sellItemName
if sellItemCount > 1:
name += " "
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):
name = sellItemName
if sellItemCount > 1:
name += " "
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):
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):
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):
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):
name = dropItemName
if dropItemCount > 1:
name += " "
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):
if number <= 0:
return "0"
return "0<EFBFBD><EFBFBD>"
number = str(number)
result = CutMoneyString(number, 0, 4, "", "")
result = CutMoneyString(number, 4, 8, "", result)
result = CutMoneyString(number, 8, 12, "", result)
result = result + ""
result = CutMoneyString(number, 4, 8, "<EFBFBD><EFBFBD>", result)
result = CutMoneyString(number, 8, 12, "<EFBFBD><EFBFBD>", result)
result = result + "<EFBFBD><EFBFBD>"
return result
def NumberToSecondaryCoinString(number):
if number <= 0:
return "0"
return "0<EFBFBD><EFBFBD>"
number = str(number)
result = CutMoneyString(number, 0, 4, "", "")
result = CutMoneyString(number, 4, 8, "", result)
result = CutMoneyString(number, 8, 12, "", result)
result = result + ""
result = CutMoneyString(number, 4, 8, "<EFBFBD><EFBFBD>", result)
result = CutMoneyString(number, 8, 12, "<EFBFBD><EFBFBD>", result)
result = result + "<EFBFBD><EFBFBD>"
return result
def FISHING_NOTIFY(isFish, fishName):
if isFish:
return fishName + I(fishName) + "巩 淀 钦聪促."
return fishName + I(fishName) + "<EFBFBD><EFBFBD> <20><> <20>մϴ<D5B4>."
else:
return fishName + I(fishName) + "吧赴淀 钦聪促."
return fishName + I(fishName) + "<EFBFBD>ɸ<EFBFBD><EFBFBD><EFBFBD> <20>մϴ<D5B4>."
def FISHING_SUCCESS(isFish, fishName):
if isFish:
return fishName + EUL(fishName) + "棱疽嚼聪促!"
return fishName + EUL(fishName) + "<EFBFBD><EFBFBD>ҽ<EFBFBD><EFBFBD>ϴ<EFBFBD>!"
else:
return fishName + EUL(fishName) + "掘菌嚼聪促!"
return fishName + EUL(fishName) + "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>!"
elif 932 == app.GetDefaultCodePage():
def DO_YOU_SELL_ITEM(sellItemName, sellItemCount, sellItemPrice):
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:
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) :
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:
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) :
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) :
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) :
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) :
if dropItemCount > 1 :
return "%s %d 屄傪幪偰傑偡偐丠" % (dropItemName, dropItemCount)
return "%s %d <EFBFBD>‚<EFBFBD><EFBFBD>̂Ă܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>H" % (dropItemName, dropItemCount)
else :
return "%s傪幪偰傑偡偐丠" % (dropItemName)
return "%s<EFBFBD><EFBFBD><EFBFBD>̂Ă܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>H" % (dropItemName)
def FISHING_NOTIFY(isFish, fishName) :
if isFish :
return "%s 偑怘偄偮偄偨傛偆偱偡" % ( fishName )
return "%s <EFBFBD><EFBFBD><EFBFBD>H<EFBFBD><EFBFBD><EFBFBD>‚<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ł<EFBFBD>" % ( fishName )
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) :
if isFish :
return "%s 傪曔傑偊傑偟偨両" % (fishName)
return "%s <EFBFBD><EFBFBD>߂܂<EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>I" % (fishName)
else :
return "%s 傪庤偵擖傟傑偟偨両" % (fishName)
return "%s <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɓ<EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>I" % (fishName)
def NumberToMoneyString(number) :
if number <= 0 :
return "0"
return "0<EFBFBD><EFBFBD>"
number = str(number)
result = CutMoneyString(number, 0, 4, "", "")
result = CutMoneyString(number, 4, 8, "", result)
result = CutMoneyString(number, 8, 12, "", result)
result = result + ""
result = CutMoneyString(number, 4, 8, "<EFBFBD><EFBFBD>", result)
result = CutMoneyString(number, 8, 12, "<EFBFBD><EFBFBD>", result)
result = result + "<EFBFBD><EFBFBD>"
return result
def NumberToSecondaryCoinString(number) :
@ -770,8 +778,8 @@ elif 932 == app.GetDefaultCodePage():
number = str(number)
result = CutMoneyString(number, 0, 4, "", "")
result = CutMoneyString(number, 4, 8, "", result)
result = CutMoneyString(number, 8, 12, "", result)
result = CutMoneyString(number, 4, 8, "<EFBFBD><EFBFBD>", result)
result = CutMoneyString(number, 8, 12, "<EFBFBD><EFBFBD>", result)
result = result + "jun"
return result
@ -842,53 +850,53 @@ elif IsHONGKONG():
elif IsNEWCIBN() or IsCIBN10():
def DO_YOU_SELL_ITEM(sellItemName, sellItemCount, sellItemPrice):
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:
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):
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:
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):
return "无法镶嵌%s 的装备" % (attachedItemName)
return "<EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD>Ƕ%s <20><>װ<EFBFBD><D7B0>" % (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):
return "没有可以镶嵌%s 的黄金孔" % (attachedItemName)
return "û<EFBFBD>п<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ%s <20>Ļƽ<C4BB><C6BD>" % (attachedItemName)
def HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, dropItemCount):
if dropItemCount>1:
return "确定要扔掉%d%s?" % (dropItemCount, dropItemName)
return "ȷ<EFBFBD><EFBFBD>Ҫ<EFBFBD>ӵ<EFBFBD>%d<EFBFBD><EFBFBD>%s<EFBFBD><EFBFBD>?" % (dropItemCount, dropItemName)
else:
return "确定要扔掉%s?" % (dropItemName)
return "ȷ<EFBFBD><EFBFBD>Ҫ<EFBFBD>ӵ<EFBFBD>%s<EFBFBD><EFBFBD>?" % (dropItemName)
def FISHING_NOTIFY(isFish, fishName):
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:
return "钓着" + fishName + "了。"
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" + fishName + "<EFBFBD>ˡ<EFBFBD>"
def FISHING_SUCCESS(isFish, fishName):
if isFish:
return "钓着" + fishName + "了。"
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" + fishName + "<EFBFBD>ˡ<EFBFBD>"
else:
return "获得" + fishName + "了。"
return "<EFBFBD><EFBFBD><EFBFBD>" + fishName + "<EFBFBD>ˡ<EFBFBD>"
def NumberToMoneyString(number):
if number <= 0:
return "0"
return "0<EFBFBD><EFBFBD>"
number = str(number)
result = CutMoneyString(number, 0, 4, "", "")
result = CutMoneyString(number, 4, 8, "", result)
result = CutMoneyString(number, 8, 12, "亿", result)
result = result + ""
result = CutMoneyString(number, 4, 8, "<EFBFBD><EFBFBD>", result)
result = CutMoneyString(number, 8, 12, "<EFBFBD><EFBFBD>", result)
result = result + "<EFBFBD><EFBFBD>"
return result
@ -899,8 +907,8 @@ elif IsNEWCIBN() or IsCIBN10():
number = str(number)
result = CutMoneyString(number, 0, 4, "", "")
result = CutMoneyString(number, 4, 8, "", result)
result = CutMoneyString(number, 8, 12, "亿", result)
result = CutMoneyString(number, 4, 8, "<EFBFBD><EFBFBD>", result)
result = CutMoneyString(number, 8, 12, "<EFBFBD><EFBFBD>", result)
result = result + "JUN"
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 __BL_CLIP_MASK__
#define __BL_MOUSE_WHEEL_TOP_WINDOW__
#define ENABLE_QUEST_RENEWAL // Quest Page Renewal by Owsap
bool LocaleService_IsYMIR();
bool LocaleService_IsJAPAN();

View File

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

View File

@ -1188,6 +1188,56 @@ PyObject* appLogoClose(PyObject* poSelf, PyObject* poArgs)
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()
{
static PyMethodDef s_methods[] =
@ -1327,7 +1377,11 @@ void initapp()
{ "OnLogoRender", appLogoRender, METH_VARARGS },
{ "OnLogoOpen", appLogoOpen, METH_VARARGS },
{ "OnLogoClose", appLogoClose, METH_VARARGS },
#if defined(ENABLE_QUEST_RENEWAL)
{ "GetTextLength", appGetTextLength, METH_VARARGS },
{ "GetTextWidth", appGetTextWidth, METH_VARARGS },
#endif
{ NULL, NULL },
};
@ -1507,6 +1561,12 @@ void initapp()
PyModule_AddIntConstant(poModule, "ENABLE_DRAGON_SOUL_SYSTEM", 0);
#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__)
PyModule_AddIntConstant(poModule, "__BL_CLIP_MASK__", true);
#else
@ -1519,6 +1579,12 @@ void initapp()
PyModule_AddIntConstant(poModule, "__BL_MOUSE_WHEEL_TOP_WINDOW__", false);
#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
PyModule_AddIntConstant(poModule, "ENABLE_NEW_EQUIPMENT_SYSTEM", 1);
#else

View File

@ -145,7 +145,7 @@ int CPythonEventManager::RegisterEventSetFromString(const std::string& strScript
if (!pEventSet)
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;
// END_OF_SCRIPT_PARSING_FAILURE_CLEAR_BUG
@ -159,7 +159,7 @@ int CPythonEventManager::RegisterEventSetFromString(const std::string& strScript
pEventSet->poEventHandler = NULL;
__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;
int pEventPosition;
int iEventType;
@ -468,7 +468,7 @@ void CPythonEventManager::ProcessEventSet(TEventSet * pEventSet)
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->isLock = true;
break;
@ -567,6 +567,7 @@ void CPythonEventManager::ProcessEventSet(TEventSet * pEventSet)
break;
}
#if !defined(ENABLE_QUEST_RENEWAL)
// HIDE_QUEST_LETTER
case EVENT_TYPE_QUEST_BUTTON_CLOSE:
{
@ -575,7 +576,8 @@ void CPythonEventManager::ProcessEventSet(TEventSet * pEventSet)
break;
}
// END_OF_HIDE_QUEST_LETTER
#endif
case EVENT_TYPE_QUEST_BUTTON:
{
const std::string& c_rstType = GetArgumentString("icon_type", ScriptCommand.argList);
@ -584,8 +586,8 @@ void CPythonEventManager::ProcessEventSet(TEventSet * pEventSet)
int idx = atoi(GetArgument("idx", ScriptCommand.argList));
const char * name = GetArgument("name", ScriptCommand.argList);
// 퀘스트 UI 리뉴얼이 되면 해결 되므로 일단 용혼석만 땜빵 by chrislee
if (!strcmp(name, "조각난 용혼석?....")) {
// <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, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5>?....")) {
PyCallClassMemberFunc(m_poInterface, "BINARY_RecvQuest", Py_BuildValue("(isss)", idx, name, "highlight", ""));
}
else {
@ -1146,7 +1148,7 @@ void CPythonEventManager::SetLeftTimeString(const char * c_szString)
}
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["COLOR"]=EVENT_TYPE_COLOR;

View File

@ -212,7 +212,7 @@ void CPythonNetworkStream::GamePhase()
while (ret)
{
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;
if (!CheckPacket(&header))
@ -239,7 +239,7 @@ void CPythonNetworkStream::GamePhase()
case HEADER_GC_PHASE:
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;
case HEADER_GC_PVP:
@ -807,9 +807,9 @@ void CPythonNetworkStream::Warp(LONG lGlobalX, LONG lGlobalY)
//rkBgMgr.SetShadowLevel(CPythonBackground::SHADOW_ALL);
rkBgMgr.RefreshShadowLevel();
// NOTE : Warp 했을때 CenterPosition의 Height가 0이기 때문에 카메라가 땅바닥에 박혀있게 됨
// 움직일때마다 Height가 갱신 되기 때문이므로 맵을 이동하면 Position을 강제로 한번
// 셋팅해준다 - [levites]
// 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><>
// <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>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD> - [levites]
LONG lLocalX = lGlobalX;
LONG lLocalY = lGlobalY;
__GlobalPositionToLocalPosition(lLocalX, lLocalY);
@ -857,7 +857,7 @@ void CPythonNetworkStream::SetGamePhase()
m_phaseProcessFunc.Set(this, &CPythonNetworkStream::GamePhase);
m_phaseLeaveFunc.Set(this, &CPythonNetworkStream::__LeaveGamePhase);
// Main Character 등록O
// Main Character <EFBFBD><EFBFBD><EFBFBD>O
IAbstractPlayer & rkPlayer = IAbstractPlayer::GetSingleton();
rkPlayer.SetMainCharacterIndex(GetMainActorVID());
@ -972,11 +972,11 @@ bool CPythonNetworkStream::RecvPVPPacket()
case PVP_MODE_AGREE:
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))
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))
rkPlayer.RememberCantFightInstance(kPVPPacket.dwVIDDst);
break;
@ -987,11 +987,11 @@ bool CPythonNetworkStream::RecvPVPPacket()
DWORD dwKiller = kPVPPacket.dwVIDSrc;
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))
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))
rkPlayer.RememberCantFightInstance(dwVictim);
break;
@ -1009,7 +1009,7 @@ bool CPythonNetworkStream::RecvPVPPacket()
break;
}
// NOTE : PVP 토글시 TargetBoard 를 업데이트 합니다.
// NOTE : PVP <EFBFBD><EFBFBD>۽<EFBFBD> TargetBoard <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>մϴ<D5B4>.
__RefreshTargetBoardByVID(kPVPPacket.dwVIDSrc);
__RefreshTargetBoardByVID(kPVPPacket.dwVIDDst);
@ -1072,7 +1072,7 @@ bool CPythonNetworkStream::SendMessengerAddByNamePacket(const char * c_szName)
return false;
char szName[CHARACTER_NAME_MAX_LEN];
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))
return false;
@ -1106,7 +1106,7 @@ bool CPythonNetworkStream::SendCharacterStatePacket(const TPixelPosition& c_rkPP
else if (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;
kStatePacket.bHeader = HEADER_CG_CHARACTER_MOVE;
kStatePacket.bFunc = eFunc;
@ -1135,7 +1135,7 @@ bool CPythonNetworkStream::SendCharacterStatePacket(const TPixelPosition& c_rkPP
return SendSequence();
}
// NOTE : SlotIndex는 임시
// NOTE : SlotIndex<EFBFBD><EFBFBD> <20>ӽ<EFBFBD>
bool CPythonNetworkStream::SendUseSkillPacket(DWORD dwSkillIndex, DWORD dwTargetVID)
{
TPacketCGUseSkill UseSkillPacket;
@ -1277,9 +1277,9 @@ bool CPythonNetworkStream::RecvChatPacket()
buf[uChatSize]='\0';
// 유럽 아랍 버전 처리
// "이름: 내용" 입력을 "내용: 이름" 순서로 출력하기 위해 탭(0x08)을 넣음
// 탭을 아랍어 기호로 처리해 (영어1) : (영어2) 로 입력되어도 (영어2) : (영어1) 로 출력하게 만든다
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƶ<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>
// "<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>
// <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)
{
char * p = strchr(buf, ':');
@ -1305,11 +1305,11 @@ bool CPythonNetworkStream::RecvChatPacket()
switch (kChat.type)
{
case CHAT_TYPE_TALKING: /* 그냥 채팅 */
case CHAT_TYPE_PARTY: /* 파티말 */
case CHAT_TYPE_GUILD: /* 길드말 */
case CHAT_TYPE_SHOUT: /* 외치기 */
case CHAT_TYPE_WHISPER: // 서버와는 연동되지 않는 Only Client Enum
case CHAT_TYPE_TALKING: /* <EFBFBD>׳<EFBFBD> ä<><C3A4> */
case CHAT_TYPE_PARTY: /* <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> */
case CHAT_TYPE_GUILD: /* <EFBFBD><EFBFBD> */
case CHAT_TYPE_SHOUT: /* <EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> */
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, ':');
@ -1347,9 +1347,9 @@ bool CPythonNetworkStream::RecvChatPacket()
}
}
break;
case CHAT_TYPE_COMMAND: /* 명령 */
case CHAT_TYPE_INFO: /* 정보 (아이템을 집었다, 경험치를 얻었다. 등) */
case CHAT_TYPE_NOTICE: /* 공지사항 */
case CHAT_TYPE_COMMAND: /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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: /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
case CHAT_TYPE_BIG_NOTICE:
case CHAT_TYPE_MAX_NUM:
default:
@ -1461,7 +1461,7 @@ bool CPythonNetworkStream::RecvPointChange()
CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetMainInstancePtr();
// 자신의 Point가 변경되었을 경우..
// <EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD> Point<6E><74> <20><><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD>..
if (pInstance)
if (PointChange.dwVID == pInstance->GetVirtualID())
{
@ -1558,7 +1558,7 @@ bool CPythonNetworkStream::RecvDeadPacket()
CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr();
if (pkInstMain==pkChrInstSel)
{
Tracenf("주인공 사망");
Tracenf("<EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD> <20><><EFBFBD>");
if (false == pkInstMain->GetDuelMode())
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnGameOver", Py_BuildValue("()"));
@ -1953,12 +1953,19 @@ bool CPythonNetworkStream::RecvQuestInfoPacket()
if (QUEST_PACKET_TYPE_END == byQuestPacketType)
{
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)
{
if (!rkQuest.IsQuest(QuestInfo.index))
{
#if defined(ENABLE_QUEST_RENEWAL)
rkQuest.MakeQuest(QuestInfo.index, QuestInfo.type, QuestInfo.is_confirmed);
#else
rkQuest.MakeQuest(QuestInfo.index);
#endif
}
if (strlen(szTitle) > 0)
@ -1974,6 +1981,9 @@ bool CPythonNetworkStream::RecvQuestInfoPacket()
rkQuest.SetQuestClockValue(QuestInfo.index, iClockValue);
if (c_rFlag & QUEST_SEND_COUNTER_VALUE)
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)
{
@ -1989,7 +1999,12 @@ bool CPythonNetworkStream::RecvQuestInfoPacket()
}
// 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("()"));
#endif
return true;
}
@ -2149,7 +2164,7 @@ bool CPythonNetworkStream::SendExchangeExitPacket()
return SendSequence();
}
// PointReset 개임시
// PointReset <EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD>
bool CPythonNetworkStream::SendPointResetPacket()
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "StartPointReset", Py_BuildValue("()"));
@ -2303,7 +2318,7 @@ bool CPythonNetworkStream::RecvSkillCoolTimeEnd()
bool CPythonNetworkStream::RecvSkillLevel()
{
assert(!"CPythonNetworkStream::RecvSkillLevel - 사용하지 않는 함수");
assert(!"CPythonNetworkStream::RecvSkillLevel - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20>Լ<EFBFBD>");
TPacketGCSkillLevel packet;
if (!Recv(sizeof(TPacketGCSkillLevel), &packet))
{
@ -2529,7 +2544,7 @@ bool CPythonNetworkStream::RecvAddFlyTargetingPacket()
__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();
@ -2927,7 +2942,7 @@ bool CPythonNetworkStream::RecvPartyUpdate()
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;
if (CPythonPlayer::Instance().PartyMemberPIDToVID(kPartyUpdatePacket.pid, &dwVID))
if (byOldState != kPartyUpdatePacket.state)
@ -3291,7 +3306,7 @@ bool CPythonNetworkStream::RecvGuild()
if (!Recv(sizeof(dwPID), &dwPID))
return false;
// Main Player 일 경우 DeleteGuild
// Main Player <EFBFBD><EFBFBD> <20><><EFBFBD> DeleteGuild
if (CPythonGuild::Instance().IsMainPlayer(dwPID))
{
CPythonGuild::Instance().Destroy();
@ -4110,7 +4125,7 @@ bool CPythonNetworkStream::SendClientVersionPacket()
TPacketCGClientVersion2 kVersionPacket;
kVersionPacket.header = HEADER_CG_CLIENT_VERSION2;
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, "1218055205", sizeof(kVersionPacket.timestamp)-1); // new_future
//strncpy(kVersionPacket.timestamp, "1214055205", sizeof(kVersionPacket.timestamp)-1); // old_past
@ -4251,7 +4266,7 @@ bool CPythonNetworkStream::RecvTargetCreatePacket()
//#ifdef _DEBUG
// 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);
// Tracef(" >> RecvTargetCreatePacket %d : %s\n", kTargetCreate.lID, kTargetCreate.szTargetName);
//#endif
@ -4280,7 +4295,7 @@ bool CPythonNetworkStream::RecvTargetCreatePacketNew()
//#ifdef _DEBUG
// 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);
// Tracef(" >> RecvTargetCreatePacketNew %d : %d/%d\n", kTargetCreate.lID, kTargetCreate.byType, kTargetCreate.dwVID);
//#endif
@ -4303,7 +4318,7 @@ bool CPythonNetworkStream::RecvTargetUpdatePacket()
//#ifdef _DEBUG
// 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);
// Tracef(" >> RecvTargetUpdatePacket %d : %d, %d\n", kTargetUpdate.lID, kTargetUpdate.lX, kTargetUpdate.lY);
//#endif
@ -4382,7 +4397,7 @@ bool CPythonNetworkStream::RecvDigMotionPacket()
}
// 용혼석 강화
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><>ȭ
bool CPythonNetworkStream::SendDragonSoulRefinePacket(BYTE bRefineType, TItemPos* pos)
{
TPacketCGDragonSoulRefine pk;

View File

@ -37,7 +37,12 @@ bool CPythonQuest::IsQuest(DWORD dwIndex)
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);
m_QuestInstanceContainer.push_back(SQuestInstance());
@ -47,6 +52,10 @@ void CPythonQuest::MakeQuest(DWORD dwIndex)
SQuestInstance & rQuestInstance = *m_QuestInstanceContainer.rbegin();
rQuestInstance.dwIndex = dwIndex;
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)
@ -104,12 +113,51 @@ void CPythonQuest::SetQuestIconFileName(DWORD dwIndex, const char * c_szIconFile
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()
{
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())
return false;
@ -118,6 +166,7 @@ bool CPythonQuest::GetQuestInstancePtr(DWORD dwArrayIndex, SQuestInstance ** ppQ
return true;
}
#endif
bool CPythonQuest::__GetQuestInstancePtr(DWORD dwQuestIndex, SQuestInstance ** ppQuestInstance)
{
@ -140,8 +189,8 @@ void CPythonQuest::__Initialize()
test.dwIndex = i;
test.strIconFileName = "";
test.strTitle = _getf("test%d", i);
test.strClockName = "남은 시간";
test.strCounterName = "남은 마리수";
test.strClockName = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD>";
test.strCounterName = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
test.iClockValue = 1000;
test.iCounterValue = 1000;
test.iStartTime = 0;
@ -196,16 +245,27 @@ PyObject * questGetQuestData(PyObject * poSelf, PyObject * poArgs)
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";
pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(strIconFileName.c_str());
}
}
return Py_BuildValue("sisi", pQuestInstance->strTitle.c_str(),
pImage,
pQuestInstance->strCounterName.c_str(),
pQuestInstance->iCounterValue);
#if defined(ENABLE_QUEST_RENEWAL)
return Py_BuildValue("ibsisi",
pQuestInstance->bType,
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)
@ -238,7 +298,7 @@ PyObject * questGetQuestLastTime(PyObject * poSelf, PyObject * poArgs)
iLastTime = (pQuestInstance->iStartTime + pQuestInstance->iClockValue) - int(CTimer::Instance().GetCurrentSecond());
}
// 시간 증가 처리 코드
// <EFBFBD>ð<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3> <20>ڵ<EFBFBD>
// else
// {
// iLastTime = int(CTimer::Instance().GetCurrentSecond()) - pQuestInstance->iStartTime;
@ -253,6 +313,18 @@ PyObject * questClear(PyObject * poSelf, PyObject * poArgs)
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()
{
static PyMethodDef s_methods[] =
@ -262,9 +334,29 @@ void initquest()
{ "GetQuestIndex", questGetQuestIndex, METH_VARARGS },
{ "GetQuestLastTime", questGetQuestLastTime, METH_VARARGS },
{ "Clear", questClear, METH_VARARGS },
#if defined(ENABLE_QUEST_RENEWAL)
{ "GetQuestCounterData", questGetQuestCounterData, METH_VARARGS },
{ "GetQuestButtonNoticeCount", questGetQuestButtonNoticeCount, METH_VARARGS },
#endif
{ NULL, NULL, NULL },
};
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 iStartTime;
#if defined(ENABLE_QUEST_RENEWAL)
BYTE bType;
bool bIsConfirmed;
#endif
};
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:
CPythonQuest();
virtual ~CPythonQuest();
@ -38,7 +79,12 @@ class CPythonQuest : public CSingleton<CPythonQuest>
void DeleteQuestInstance(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 SetQuestClockName(DWORD dwIndex, const char * c_szClockName);
@ -46,9 +92,17 @@ class CPythonQuest : public CSingleton<CPythonQuest>
void SetQuestClockValue(DWORD dwIndex, int iClockValue);
void SetQuestCounterValue(DWORD dwIndex, int iCounterValue);
void SetQuestIconFileName(DWORD dwIndex, const char * c_szIconFileName);
#if defined(ENABLE_QUEST_RENEWAL)
void SetQuestIsConfirmed(DWORD dwIndex, bool bIsConfirmed);
#endif
int GetQuestCount();
#if defined(ENABLE_QUEST_RENEWAL)
int GetQuestButtonNoticeCount(BYTE bQuestType);
bool GetQuestInstancePtr(DWORD dwQuestIndex, SQuestInstance ** ppQuestInstance);
#else
bool GetQuestInstancePtr(DWORD dwArrayIndex, SQuestInstance ** ppQuestInstance);
#endif
protected:
void __Initialize();