Various fixes

This commit is contained in:
Mind Rapist
2026-02-15 21:42:17 +02:00
parent d61c0dc0dd
commit 74c416e9ed
41 changed files with 233 additions and 127 deletions

View File

@@ -7,12 +7,13 @@ This repository contains all client-side data, including locale files, configura
## 📋 Changelog ## 📋 Changelog
### 🐛 Bug Fixes ### 🐛 Bug Fixes
- **Python 3 division compatibility**: Migrated a lot of divisions in a lot of files to `int` divisions instead of `floats` for Python 3 compatibility. This will be fixing a lot of bugs caused by the upgrade such as target board button centering, Dragon stones Grade in tooltip and more. - **Refining**: The window now sorts empty slots (from broken stones) to the end of the list, displaying an exact preview of how the item will look like after successful attaching.
- **Completed the map names dictionary**: This improves functionality for all maps within the client, and fixes **the "invisible affects in dungeon" bug! - **Affects**: Added affect shower support for Mall Attack Speed.
- **Dragon stone countdown in tooltip**: The countdown auto-starts and responds perfectly to all situations without waiting for the "first hover" from the player. - **Dragonsoul Alchemy**:
- **Quest refreshing**: Prevented the quest letters from appearing on top of the dialog curtain (if currently chatting with an NPC or item). - Fixed the deck affect countdown not auto-updating when time is increased in one of the equipped items.
- **Minor translation improvements** - Fixed the affect countdown requiring a check for remaining time in 500ms-intervals.
- **Several missing item icons added** - The window now opens without the player being qualified (consistency with the official).
- **Spirit stone attachment**: The window now displays the item's existing attributes.
<br> <br>
<br> <br>

Binary file not shown.

View File

@@ -802,6 +802,7 @@ TOOLTIP_MAGIC_ATT_GRADE قيمة الهجوم السحري +%d SA
TOOLTIP_MAGIC_DEF_GRADE دفاع سحري +%d SA TOOLTIP_MAGIC_DEF_GRADE دفاع سحري +%d SA
TOOLTIP_MALL_ATTBONUS قيمة الهجوم +%d%% SA TOOLTIP_MALL_ATTBONUS قيمة الهجوم +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC قيمة الهجوم SNA TOOLTIP_MALL_ATTBONUS_STATIC قيمة الهجوم SNA
TOOLTIP_MALL_ATT_SPEED ارتفاع سرعة الهجوم +%d%% SA
TOOLTIP_MALL_AUTOLOOT سيتم تلقائياً تسجيل اليانغ. SNA TOOLTIP_MALL_AUTOLOOT سيتم تلقائياً تسجيل اليانغ. SNA
TOOLTIP_MALL_DEFBONUS الدفاع +%d%% SA TOOLTIP_MALL_DEFBONUS الدفاع +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC دفاع SNA TOOLTIP_MALL_DEFBONUS_STATIC دفاع SNA

View File

@@ -710,6 +710,7 @@ TOOLTIP_MAGIC_ATT_GRADE Ataque Mágico: +%d SA
TOOLTIP_MAGIC_DEF_GRADE Proteção Mágica: +%d SA TOOLTIP_MAGIC_DEF_GRADE Proteção Mágica: +%d SA
TOOLTIP_MALL_ATTBONUS Ataque: +%d%% SA TOOLTIP_MALL_ATTBONUS Ataque: +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Ataque: +20% SNA TOOLTIP_MALL_ATTBONUS_STATIC Ataque: +20% SNA
TOOLTIP_MALL_ATT_SPEED Bônus na Velocidade de Ataque +%d%% SA
TOOLTIP_MALL_AUTOLOOT Adquire Gold automaticamente SNA TOOLTIP_MALL_AUTOLOOT Adquire Gold automaticamente SNA
TOOLTIP_MALL_DEFBONUS Defesa:+%d%% SA TOOLTIP_MALL_DEFBONUS Defesa:+%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Defesa: +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Defesa: +12~15% SNA

Binary file not shown.

View File

@@ -710,6 +710,7 @@ TOOLTIP_MAGIC_ATT_GRADE Magická hodnota útoku +%d SA
TOOLTIP_MAGIC_DEF_GRADE Magická obrana +%d SA TOOLTIP_MAGIC_DEF_GRADE Magická obrana +%d SA
TOOLTIP_MALL_ATTBONUS Hodnota útoku +%d%% SA TOOLTIP_MALL_ATTBONUS Hodnota útoku +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Hodnota útoku +12~15 % SNA TOOLTIP_MALL_ATTBONUS_STATIC Hodnota útoku +12~15 % SNA
TOOLTIP_MALL_ATT_SPEED Rychlost útoku zvýšena +%d%% SA
TOOLTIP_MALL_AUTOLOOT Yangy se automaticky sesbírají. SNA TOOLTIP_MALL_AUTOLOOT Yangy se automaticky sesbírají. SNA
TOOLTIP_MALL_DEFBONUS Obrana +%d%% SA TOOLTIP_MALL_DEFBONUS Obrana +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Obrana +12~15 % SNA TOOLTIP_MALL_DEFBONUS_STATIC Obrana +12~15 % SNA

Binary file not shown.

View File

@@ -708,6 +708,7 @@ TOOLTIP_MAGIC_ATT_GRADE Magischer Angriffswert +%d SA
TOOLTIP_MAGIC_DEF_GRADE Magische Verteidigung +%d SA TOOLTIP_MAGIC_DEF_GRADE Magische Verteidigung +%d SA
TOOLTIP_MALL_ATTBONUS Angriffswert +%d%% SA TOOLTIP_MALL_ATTBONUS Angriffswert +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Angriffswert +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Angriffswert +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Angriffsgeschwindigkeit erhöht +%d%% SA
TOOLTIP_MALL_AUTOLOOT Autom. wird das Yang aufgenommen. SNA TOOLTIP_MALL_AUTOLOOT Autom. wird das Yang aufgenommen. SNA
TOOLTIP_MALL_DEFBONUS Verteidigung +%d%% SA TOOLTIP_MALL_DEFBONUS Verteidigung +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Verteidigung +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Verteidigung +12~15% SNA

Binary file not shown.

View File

@@ -710,6 +710,7 @@ TOOLTIP_MAGIC_ATT_GRADE Magisk angrebsværdi +%d SA
TOOLTIP_MAGIC_DEF_GRADE Magisk forsvar +%d SA TOOLTIP_MAGIC_DEF_GRADE Magisk forsvar +%d SA
TOOLTIP_MALL_ATTBONUS Angrebsværdi +%d%% SA TOOLTIP_MALL_ATTBONUS Angrebsværdi +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Angrebsværdi +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Angrebsværdi +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Angrebshastighed øges +%d%% SA
TOOLTIP_MALL_AUTOLOOT Automatisk samles alt Yang. SNA TOOLTIP_MALL_AUTOLOOT Automatisk samles alt Yang. SNA
TOOLTIP_MALL_DEFBONUS Forsvar +%d%% SA TOOLTIP_MALL_DEFBONUS Forsvar +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Forsvar +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Forsvar +12~15% SNA

Binary file not shown.

View File

@@ -708,6 +708,7 @@ TOOLTIP_MAGIC_ATT_GRADE Magical Attack Value +%d SA
TOOLTIP_MAGIC_DEF_GRADE Magical Defence +%d SA TOOLTIP_MAGIC_DEF_GRADE Magical Defence +%d SA
TOOLTIP_MALL_ATTBONUS Attack Value +%d%% SA TOOLTIP_MALL_ATTBONUS Attack Value +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Attack Value +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Attack Value +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Attack speed raised +%d%% SA
TOOLTIP_MALL_AUTOLOOT A hand that picks up dropped Yang automatically SNA TOOLTIP_MALL_AUTOLOOT A hand that picks up dropped Yang automatically SNA
TOOLTIP_MALL_DEFBONUS Defence +%d%% SA TOOLTIP_MALL_DEFBONUS Defence +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Defence +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Defence +12~15% SNA

Binary file not shown.

View File

@@ -710,6 +710,7 @@ TOOLTIP_MAGIC_ATT_GRADE Valor de Ataque Mágico +%d SA
TOOLTIP_MAGIC_DEF_GRADE Defensa Mágica +%d SA TOOLTIP_MAGIC_DEF_GRADE Defensa Mágica +%d SA
TOOLTIP_MALL_ATTBONUS Valor de Ataque +%d%% SA TOOLTIP_MALL_ATTBONUS Valor de Ataque +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Valor de Ataque +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Valor de Ataque +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Velocidad de ataque aumentada +%d%% SA
TOOLTIP_MALL_AUTOLOOT Una mano que recoge automáticamente el Yang tirado SNA TOOLTIP_MALL_AUTOLOOT Una mano que recoge automáticamente el Yang tirado SNA
TOOLTIP_MALL_DEFBONUS Defensa +%d%% SA TOOLTIP_MALL_DEFBONUS Defensa +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Defensa +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Defensa +12~15% SNA

Binary file not shown.

View File

@@ -708,6 +708,7 @@ TOOLTIP_MAGIC_ATT_GRADE Valeur d'attaque magique +%d SA
TOOLTIP_MAGIC_DEF_GRADE Défense magique +%d SA TOOLTIP_MAGIC_DEF_GRADE Défense magique +%d SA
TOOLTIP_MALL_ATTBONUS Valeur d'attaque +%d%% SA TOOLTIP_MALL_ATTBONUS Valeur d'attaque +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Valeur d'attaque +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Valeur d'attaque +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Vitesse d'attaque augmentée +%d%% SA
TOOLTIP_MALL_AUTOLOOT Une main qui ramasse les Yangs automatiquement. SNA TOOLTIP_MALL_AUTOLOOT Une main qui ramasse les Yangs automatiquement. SNA
TOOLTIP_MALL_DEFBONUS Défense +%d%% SA TOOLTIP_MALL_DEFBONUS Défense +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Défense +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Défense +12~15% SNA

Binary file not shown.

View File

@@ -710,6 +710,7 @@ TOOLTIP_MAGIC_ATT_GRADE Αξία Μαγικής άμυνας +%d SA
TOOLTIP_MAGIC_DEF_GRADE Μαγική άμυνα +%d SA TOOLTIP_MAGIC_DEF_GRADE Μαγική άμυνα +%d SA
TOOLTIP_MALL_ATTBONUS Αξία Επίθεσης +%d%% SA TOOLTIP_MALL_ATTBONUS Αξία Επίθεσης +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Αξία Επίθεσης +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Αξία Επίθεσης +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Αυξημένη ταχύτητα επίθεσης +%d%% SA
TOOLTIP_MALL_AUTOLOOT Χέρι που μαζεύει αυτόματα τα πεσμένα Yang SNA TOOLTIP_MALL_AUTOLOOT Χέρι που μαζεύει αυτόματα τα πεσμένα Yang SNA
TOOLTIP_MALL_DEFBONUS Άμυνα +%d%% SA TOOLTIP_MALL_DEFBONUS Άμυνα +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Άμυνα +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Άμυνα +12~15% SNA

Binary file not shown.

View File

@@ -708,6 +708,7 @@ TOOLTIP_MAGIC_ATT_GRADE Mágikus támadó érték +%d SA
TOOLTIP_MAGIC_DEF_GRADE Mágikus védelem +%d SA TOOLTIP_MAGIC_DEF_GRADE Mágikus védelem +%d SA
TOOLTIP_MALL_ATTBONUS Támadó érték +%d%% SA TOOLTIP_MALL_ATTBONUS Támadó érték +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Támadó érték +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Támadó érték +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Megnövelt támadósebesség +%d%% SA
TOOLTIP_MALL_AUTOLOOT Automatikusan felszedi a Yangokat. SNA TOOLTIP_MALL_AUTOLOOT Automatikusan felszedi a Yangokat. SNA
TOOLTIP_MALL_DEFBONUS Védekezés +%d%% SA TOOLTIP_MALL_DEFBONUS Védekezés +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Védekezés +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Védekezés +12~15% SNA

Binary file not shown.

View File

@@ -710,6 +710,7 @@ TOOLTIP_MAGIC_ATT_GRADE Valore d'attacco magico +%d SA
TOOLTIP_MAGIC_DEF_GRADE Difesa magica +%d SA TOOLTIP_MAGIC_DEF_GRADE Difesa magica +%d SA
TOOLTIP_MALL_ATTBONUS Valore d'attacco +%d%% SA TOOLTIP_MALL_ATTBONUS Valore d'attacco +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Valore d'attacco +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Valore d'attacco +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Velocità di attacco aumentata +%d%% SA
TOOLTIP_MALL_AUTOLOOT Drop di Yang vengono raccolti automaticamete. SNA TOOLTIP_MALL_AUTOLOOT Drop di Yang vengono raccolti automaticamete. SNA
TOOLTIP_MALL_DEFBONUS Difesa +%d%% SA TOOLTIP_MALL_DEFBONUS Difesa +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Difesa +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Difesa +12~15% SNA

Binary file not shown.

View File

@@ -710,6 +710,7 @@ TOOLTIP_MAGIC_ATT_GRADE Magische Aanvals Waarde +%d SA
TOOLTIP_MAGIC_DEF_GRADE Magische Verdediging +%d SA TOOLTIP_MAGIC_DEF_GRADE Magische Verdediging +%d SA
TOOLTIP_MALL_ATTBONUS Aanvals Waarde +%d%% SA TOOLTIP_MALL_ATTBONUS Aanvals Waarde +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Aanvals Waarde +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Aanvals Waarde +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Aanvals snelheid verhoogd +%d%% SA
TOOLTIP_MALL_AUTOLOOT Een hand die automatisch gevallen Yang opraapt. SNA TOOLTIP_MALL_AUTOLOOT Een hand die automatisch gevallen Yang opraapt. SNA
TOOLTIP_MALL_DEFBONUS Verdediging +%d%% SA TOOLTIP_MALL_DEFBONUS Verdediging +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Verdediging +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Verdediging +12~15% SNA

Binary file not shown.

View File

@@ -710,6 +710,7 @@ TOOLTIP_MAGIC_ATT_GRADE Wartość Magicznego Ataku: +%d SA
TOOLTIP_MAGIC_DEF_GRADE Magiczna Obrona: +%d SA TOOLTIP_MAGIC_DEF_GRADE Magiczna Obrona: +%d SA
TOOLTIP_MALL_ATTBONUS Wartość Ataku: +%d%% SA TOOLTIP_MALL_ATTBONUS Wartość Ataku: +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Wartość Ataku: +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Wartość Ataku: +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Zwiększona Szybkość Ataku +%d%% SA
TOOLTIP_MALL_AUTOLOOT Ręka, która automatycznie podnosi upuszczone Yang. SNA TOOLTIP_MALL_AUTOLOOT Ręka, która automatycznie podnosi upuszczone Yang. SNA
TOOLTIP_MALL_DEFBONUS Obrona: +%d%% SA TOOLTIP_MALL_DEFBONUS Obrona: +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Obrona +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Obrona +12~15% SNA

Binary file not shown.

View File

@@ -722,6 +722,7 @@ TOOLTIP_MAGIC_ATT_GRADE Valor de Ataque Mágico: +%d SA
TOOLTIP_MAGIC_DEF_GRADE Defesa vs Magias: +%d SA TOOLTIP_MAGIC_DEF_GRADE Defesa vs Magias: +%d SA
TOOLTIP_MALL_ATTBONUS Valor de Ataque: +%d SA TOOLTIP_MALL_ATTBONUS Valor de Ataque: +%d SA
TOOLTIP_MALL_ATTBONUS_STATIC Valor de Ataque: +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Valor de Ataque: +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Aumento da Velocidade de Ataque +%d%% SA
TOOLTIP_MALL_AUTOLOOT Mão que apanha automaticamente o Yang caído. SNA TOOLTIP_MALL_AUTOLOOT Mão que apanha automaticamente o Yang caído. SNA
TOOLTIP_MALL_DEFBONUS Defesa: +%d%% SA TOOLTIP_MALL_DEFBONUS Defesa: +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Defesa: +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Defesa: +12~15% SNA

Binary file not shown.

View File

@@ -710,6 +710,7 @@ TOOLTIP_MAGIC_ATT_GRADE Valoarea atacului magic +%d SA
TOOLTIP_MAGIC_DEF_GRADE Apărare magică +%d SA TOOLTIP_MAGIC_DEF_GRADE Apărare magică +%d SA
TOOLTIP_MALL_ATTBONUS Valoarea atacului +%d%% SA TOOLTIP_MALL_ATTBONUS Valoarea atacului +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Valoarea atacului +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Valoarea atacului +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Viteza de atac a crescut +%d%% SA
TOOLTIP_MALL_AUTOLOOT Yang este însușit automat. SNA TOOLTIP_MALL_AUTOLOOT Yang este însușit automat. SNA
TOOLTIP_MALL_DEFBONUS Apărare +%d%% SA TOOLTIP_MALL_DEFBONUS Apărare +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Apărare +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Apărare +12~15% SNA

Binary file not shown.

View File

@@ -710,6 +710,7 @@ TOOLTIP_MAGIC_ATT_GRADE Показатель магической атаки +%d
TOOLTIP_MAGIC_DEF_GRADE Магическая защита +%d SA TOOLTIP_MAGIC_DEF_GRADE Магическая защита +%d SA
TOOLTIP_MALL_ATTBONUS Показатель атаки +%d%% SA TOOLTIP_MALL_ATTBONUS Показатель атаки +%d%% SA
TOOLTIP_MALL_ATTBONUS_STATIC Показатель атаки +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Показатель атаки +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Скорость атаки повышена +%d%% SA
TOOLTIP_MALL_AUTOLOOT Янг принимается автом. SNA TOOLTIP_MALL_AUTOLOOT Янг принимается автом. SNA
TOOLTIP_MALL_DEFBONUS Защита +%d%% SA TOOLTIP_MALL_DEFBONUS Защита +%d%% SA
TOOLTIP_MALL_DEFBONUS_STATIC Защита +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Защита +12~15% SNA

Binary file not shown.

View File

@@ -710,6 +710,7 @@ TOOLTIP_MAGIC_ATT_GRADE Büyülü Saldırı Değeri +%d SA
TOOLTIP_MAGIC_DEF_GRADE Büyü Savunması +%d SA TOOLTIP_MAGIC_DEF_GRADE Büyü Savunması +%d SA
TOOLTIP_MALL_ATTBONUS Saldırı Değeri +%%%d SA TOOLTIP_MALL_ATTBONUS Saldırı Değeri +%%%d SA
TOOLTIP_MALL_ATTBONUS_STATIC Saldırı Değeri +12~15% SNA TOOLTIP_MALL_ATTBONUS_STATIC Saldırı Değeri +12~15% SNA
TOOLTIP_MALL_ATT_SPEED Saldırı hızı arttırıldı +%d%% SA
TOOLTIP_MALL_AUTOLOOT Yerdeki mevcut Yang`ın otomatik olarak toplanmasını sağlayan el. SNA TOOLTIP_MALL_AUTOLOOT Yerdeki mevcut Yang`ın otomatik olarak toplanmasını sağlayan el. SNA
TOOLTIP_MALL_DEFBONUS Savunma +%%%d SA TOOLTIP_MALL_DEFBONUS Savunma +%%%d SA
TOOLTIP_MALL_DEFBONUS_STATIC Savunma +12~15% SNA TOOLTIP_MALL_DEFBONUS_STATIC Savunma +12~15% SNA

View File

@@ -758,7 +758,6 @@ class GameWindow(ui.ScriptWindow):
if chr.NEW_AFFECT_DRAGON_SOUL_DECK1 == type or chr.NEW_AFFECT_DRAGON_SOUL_DECK2 == type: if chr.NEW_AFFECT_DRAGON_SOUL_DECK1 == type or chr.NEW_AFFECT_DRAGON_SOUL_DECK2 == type:
self.interface.DragonSoulActivate(type - chr.NEW_AFFECT_DRAGON_SOUL_DECK1) self.interface.DragonSoulActivate(type - chr.NEW_AFFECT_DRAGON_SOUL_DECK1)
elif chr.NEW_AFFECT_DRAGON_SOUL_QUALIFIED == type: elif chr.NEW_AFFECT_DRAGON_SOUL_QUALIFIED == type:
self.BINARY_DragonSoulGiveQuilification() self.BINARY_DragonSoulGiveQuilification()

View File

@@ -996,20 +996,21 @@ class Interface(object):
self.DRAGON_SOUL_IS_QUALIFIED = True self.DRAGON_SOUL_IS_QUALIFIED = True
self.wndExpandedTaskBar.SetToolTipText(uiTaskBar.ExpandedTaskBar.BUTTON_DRAGON_SOUL, uiScriptLocale.TASKBAR_DRAGON_SOUL) self.wndExpandedTaskBar.SetToolTipText(uiTaskBar.ExpandedTaskBar.BUTTON_DRAGON_SOUL, uiScriptLocale.TASKBAR_DRAGON_SOUL)
# MR-12: Enable Dragon Soul window opening without completing the quest
def ToggleDragonSoulWindow(self): def ToggleDragonSoulWindow(self):
if False == player.IsObserverMode(): if False == player.IsObserverMode():
if app.ENABLE_DRAGON_SOUL_SYSTEM: if app.ENABLE_DRAGON_SOUL_SYSTEM:
if False == self.wndDragonSoul.IsShow(): if False == self.wndDragonSoul.IsShow():
if self.DRAGON_SOUL_IS_QUALIFIED: # if self.DRAGON_SOUL_IS_QUALIFIED:
self.wndDragonSoul.Show() self.wndDragonSoul.Show()
else: # else:
try: # try:
self.wndPopupDialog.SetText(localeInfo.DRAGON_SOUL_UNQUALIFIED) # self.wndPopupDialog.SetText(localeInfo.DRAGON_SOUL_UNQUALIFIED)
self.wndPopupDialog.Open() # self.wndPopupDialog.Open()
except: # except:
self.wndPopupDialog = uiCommon.PopupDialog() # self.wndPopupDialog = uiCommon.PopupDialog()
self.wndPopupDialog.SetText(localeInfo.DRAGON_SOUL_UNQUALIFIED) # self.wndPopupDialog.SetText(localeInfo.DRAGON_SOUL_UNQUALIFIED)
self.wndPopupDialog.Open() # self.wndPopupDialog.Open()
else: else:
self.wndDragonSoul.Close() self.wndDragonSoul.Close()
@@ -1017,10 +1018,11 @@ class Interface(object):
if False == player.IsObserverMode(): if False == player.IsObserverMode():
if app.ENABLE_DRAGON_SOUL_SYSTEM: if app.ENABLE_DRAGON_SOUL_SYSTEM:
if False == self.wndDragonSoul.IsShow(): if False == self.wndDragonSoul.IsShow():
if self.DRAGON_SOUL_IS_QUALIFIED: # if self.DRAGON_SOUL_IS_QUALIFIED:
self.wndDragonSoul.Show() self.wndDragonSoul.Show()
else: else:
self.wndDragonSoul.Close() self.wndDragonSoul.Close()
# MR-12: -- END OF -- Enable Dragon Soul window opening without completing the quest
def FailDragonSoulRefine(self, reason, inven_type, inven_pos): def FailDragonSoulRefine(self, reason, inven_type, inven_pos):
if False == player.IsObserverMode(): if False == player.IsObserverMode():

View File

@@ -7,6 +7,7 @@ import skill
import player import player
import uiToolTip import uiToolTip
import math import math
import dbg
# WEDDING # WEDDING
class LovePointImage(ui.ExpandedImageBox): class LovePointImage(ui.ExpandedImageBox):
@@ -378,9 +379,13 @@ class AffectImage(ui.ExpandedImageBox):
# MR-10: Add toolTip support and real-time countdown for affects # MR-10: Add toolTip support and real-time countdown for affects
def UpdateDescription(self): def UpdateDescription(self):
# MR-12: Fix realtime countdown auto-start
if self.__IsDragonSoulAffect(): if self.__IsDragonSoulAffect():
minRemain = self.__GetDragonSoulMinRemainSec()
if self.isHover: if self.isHover:
self.__UpdateDragonSoulDescription() self.__UpdateDragonSoulDescription(minRemain)
# MR-12: -- END OF -- Fix realtime countdown auto-start
if self.toolTip: if self.toolTip:
self.toolTip.ShowToolTip() self.toolTip.ShowToolTip()
@@ -481,11 +486,13 @@ class AffectImage(ui.ExpandedImageBox):
return minRemain return minRemain
def __UpdateDragonSoulDescription(self): # MR-12: Fix realtime countdown auto-start
def __UpdateDragonSoulDescription(self, minRemain = None):
if not self.description: if not self.description:
return return
minRemain = self.__GetDragonSoulMinRemainSec() if minRemain is None:
minRemain = self.__GetDragonSoulMinRemainSec()
self.__EnsureToolTip() self.__EnsureToolTip()
self.toolTip.ClearToolTip() self.toolTip.ClearToolTip()
@@ -495,7 +502,7 @@ class AffectImage(ui.ExpandedImageBox):
self.toolTip.AppendTextLine("(%s : %s)" % (localeInfo.LEFT_TIME, localeInfo.RTSecondToDHMS(minRemain))) self.toolTip.AppendTextLine("(%s : %s)" % (localeInfo.LEFT_TIME, localeInfo.RTSecondToDHMS(minRemain)))
self.toolTip.ResizeToolTip() self.toolTip.ResizeToolTip()
# MR-10: -- END OF -- Add toolTip support and real-time countdown for affects # MR-12: -- END OF -- Fix realtime countdown auto-start
def SetSkillAffectFlag(self, flag): def SetSkillAffectFlag(self, flag):
self.isSkillAffect = flag self.isSkillAffect = flag
@@ -548,67 +555,71 @@ class AffectShower(ui.Window):
INFINITE_AFFECT_DURATION = 0x1FFFFFFF INFINITE_AFFECT_DURATION = 0x1FFFFFFF
AFFECT_DATA_DICT = { AFFECT_DATA_DICT = {
chr.AFFECT_POISON : (localeInfo.SKILL_TOXICDIE, "d:/ymir work/ui/skill/common/affect/poison.sub"), chr.AFFECT_POISON : (localeInfo.SKILL_TOXICDIE, "d:/ymir work/ui/skill/common/affect/poison.sub"),
chr.AFFECT_SLOW : (localeInfo.SKILL_SLOW, "d:/ymir work/ui/skill/common/affect/slow.sub"), chr.AFFECT_SLOW : (localeInfo.SKILL_SLOW, "d:/ymir work/ui/skill/common/affect/slow.sub"),
chr.AFFECT_STUN : (localeInfo.SKILL_STUN, "d:/ymir work/ui/skill/common/affect/stun.sub"), chr.AFFECT_STUN : (localeInfo.SKILL_STUN, "d:/ymir work/ui/skill/common/affect/stun.sub"),
chr.AFFECT_ATT_SPEED_POTION : (localeInfo.SKILL_INC_ATKSPD, "d:/ymir work/ui/skill/common/affect/Increase_Attack_Speed.sub"), chr.AFFECT_ATT_SPEED_POTION : (localeInfo.SKILL_INC_ATKSPD, "d:/ymir work/ui/skill/common/affect/Increase_Attack_Speed.sub"),
chr.AFFECT_MOV_SPEED_POTION : (localeInfo.SKILL_INC_MOVSPD, "d:/ymir work/ui/skill/common/affect/Increase_Move_Speed.sub"), chr.AFFECT_MOV_SPEED_POTION : (localeInfo.SKILL_INC_MOVSPD, "d:/ymir work/ui/skill/common/affect/Increase_Move_Speed.sub"),
chr.AFFECT_FISH_MIND : (localeInfo.SKILL_FISHMIND, "d:/ymir work/ui/skill/common/affect/fishmind.sub"), chr.AFFECT_FISH_MIND : (localeInfo.SKILL_FISHMIND, "d:/ymir work/ui/skill/common/affect/fishmind.sub"),
chr.AFFECT_JEONGWI : (localeInfo.SKILL_JEONGWI, "d:/ymir work/ui/skill/warrior/jeongwi_03.sub",), chr.AFFECT_JEONGWI : (localeInfo.SKILL_JEONGWI, "d:/ymir work/ui/skill/warrior/jeongwi_03.sub",),
chr.AFFECT_GEOMGYEONG : (localeInfo.SKILL_GEOMGYEONG, "d:/ymir work/ui/skill/warrior/geomgyeong_03.sub",), chr.AFFECT_GEOMGYEONG : (localeInfo.SKILL_GEOMGYEONG, "d:/ymir work/ui/skill/warrior/geomgyeong_03.sub",),
chr.AFFECT_CHEONGEUN : (localeInfo.SKILL_CHEONGEUN, "d:/ymir work/ui/skill/warrior/cheongeun_03.sub",), chr.AFFECT_CHEONGEUN : (localeInfo.SKILL_CHEONGEUN, "d:/ymir work/ui/skill/warrior/cheongeun_03.sub",),
chr.AFFECT_GYEONGGONG : (localeInfo.SKILL_GYEONGGONG, "d:/ymir work/ui/skill/assassin/gyeonggong_03.sub",), chr.AFFECT_GYEONGGONG : (localeInfo.SKILL_GYEONGGONG, "d:/ymir work/ui/skill/assassin/gyeonggong_03.sub",),
chr.AFFECT_EUNHYEONG : (localeInfo.SKILL_EUNHYEONG, "d:/ymir work/ui/skill/assassin/eunhyeong_03.sub",), chr.AFFECT_EUNHYEONG : (localeInfo.SKILL_EUNHYEONG, "d:/ymir work/ui/skill/assassin/eunhyeong_03.sub",),
chr.AFFECT_GWIGEOM : (localeInfo.SKILL_GWIGEOM, "d:/ymir work/ui/skill/sura/gwigeom_03.sub",), chr.AFFECT_GWIGEOM : (localeInfo.SKILL_GWIGEOM, "d:/ymir work/ui/skill/sura/gwigeom_03.sub",),
chr.AFFECT_GONGPO : (localeInfo.SKILL_GONGPO, "d:/ymir work/ui/skill/sura/gongpo_03.sub",), chr.AFFECT_GONGPO : (localeInfo.SKILL_GONGPO, "d:/ymir work/ui/skill/sura/gongpo_03.sub",),
chr.AFFECT_JUMAGAP : (localeInfo.SKILL_JUMAGAP, "d:/ymir work/ui/skill/sura/jumagap_03.sub"), chr.AFFECT_JUMAGAP : (localeInfo.SKILL_JUMAGAP, "d:/ymir work/ui/skill/sura/jumagap_03.sub"),
chr.AFFECT_HOSIN : (localeInfo.SKILL_HOSIN, "d:/ymir work/ui/skill/shaman/hosin_03.sub",), chr.AFFECT_HOSIN : (localeInfo.SKILL_HOSIN, "d:/ymir work/ui/skill/shaman/hosin_03.sub",),
chr.AFFECT_BOHO : (localeInfo.SKILL_BOHO, "d:/ymir work/ui/skill/shaman/boho_03.sub",), chr.AFFECT_BOHO : (localeInfo.SKILL_BOHO, "d:/ymir work/ui/skill/shaman/boho_03.sub",),
chr.AFFECT_KWAESOK : (localeInfo.SKILL_KWAESOK, "d:/ymir work/ui/skill/shaman/kwaesok_03.sub",), chr.AFFECT_KWAESOK : (localeInfo.SKILL_KWAESOK, "d:/ymir work/ui/skill/shaman/kwaesok_03.sub",),
chr.AFFECT_HEUKSIN : (localeInfo.SKILL_HEUKSIN, "d:/ymir work/ui/skill/sura/heuksin_03.sub",), chr.AFFECT_HEUKSIN : (localeInfo.SKILL_HEUKSIN, "d:/ymir work/ui/skill/sura/heuksin_03.sub",),
chr.AFFECT_MUYEONG : (localeInfo.SKILL_MUYEONG, "d:/ymir work/ui/skill/sura/muyeong_03.sub",), chr.AFFECT_MUYEONG : (localeInfo.SKILL_MUYEONG, "d:/ymir work/ui/skill/sura/muyeong_03.sub",),
chr.AFFECT_GICHEON : (localeInfo.SKILL_GICHEON, "d:/ymir work/ui/skill/shaman/gicheon_03.sub",), chr.AFFECT_GICHEON : (localeInfo.SKILL_GICHEON, "d:/ymir work/ui/skill/shaman/gicheon_03.sub",),
chr.AFFECT_JEUNGRYEOK : (localeInfo.SKILL_JEUNGRYEOK, "d:/ymir work/ui/skill/shaman/jeungryeok_03.sub",), chr.AFFECT_JEUNGRYEOK : (localeInfo.SKILL_JEUNGRYEOK, "d:/ymir work/ui/skill/shaman/jeungryeok_03.sub",),
chr.AFFECT_PABEOP : (localeInfo.SKILL_PABEOP, "d:/ymir work/ui/skill/sura/pabeop_03.sub",), chr.AFFECT_PABEOP : (localeInfo.SKILL_PABEOP, "d:/ymir work/ui/skill/sura/pabeop_03.sub",),
chr.AFFECT_FALLEN_CHEONGEUN : (localeInfo.SKILL_CHEONGEUN, "d:/ymir work/ui/skill/warrior/cheongeun_03.sub",), chr.AFFECT_FALLEN_CHEONGEUN : (localeInfo.SKILL_CHEONGEUN, "d:/ymir work/ui/skill/warrior/cheongeun_03.sub",),
28 : (localeInfo.SKILL_FIRE, "d:/ymir work/ui/skill/sura/hwayeom_03.sub",), 28 : (localeInfo.SKILL_FIRE, "d:/ymir work/ui/skill/sura/hwayeom_03.sub",),
chr.AFFECT_CHINA_FIREWORK : (localeInfo.SKILL_POWERFUL_STRIKE, "d:/ymir work/ui/skill/common/affect/powerfulstrike.sub",), chr.AFFECT_CHINA_FIREWORK : (localeInfo.SKILL_POWERFUL_STRIKE, "d:/ymir work/ui/skill/common/affect/powerfulstrike.sub",),
#64 - END #64 - END
chr.NEW_AFFECT_EXP_BONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/exp_bonus.sub",), chr.NEW_AFFECT_EXP_BONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/exp_bonus.sub",),
chr.NEW_AFFECT_ITEM_BONUS : (localeInfo.TOOLTIP_MALL_ITEMBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/item_bonus.sub",), chr.NEW_AFFECT_ITEM_BONUS : (localeInfo.TOOLTIP_MALL_ITEMBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/item_bonus.sub",),
chr.NEW_AFFECT_SAFEBOX : (localeInfo.TOOLTIP_MALL_SAFEBOX, "d:/ymir work/ui/skill/common/affect/safebox.sub",), chr.NEW_AFFECT_SAFEBOX : (localeInfo.TOOLTIP_MALL_SAFEBOX, "d:/ymir work/ui/skill/common/affect/safebox.sub",),
chr.NEW_AFFECT_AUTOLOOT : (localeInfo.TOOLTIP_MALL_AUTOLOOT, "d:/ymir work/ui/skill/common/affect/autoloot.sub",), chr.NEW_AFFECT_AUTOLOOT : (localeInfo.TOOLTIP_MALL_AUTOLOOT, "d:/ymir work/ui/skill/common/affect/autoloot.sub",),
chr.NEW_AFFECT_FISH_MIND : (localeInfo.TOOLTIP_MALL_FISH_MIND, "d:/ymir work/ui/skill/common/affect/fishmind.sub",), chr.NEW_AFFECT_FISH_MIND : (localeInfo.TOOLTIP_MALL_FISH_MIND, "d:/ymir work/ui/skill/common/affect/fishmind.sub",),
chr.NEW_AFFECT_MARRIAGE_FAST : (localeInfo.TOOLTIP_MALL_MARRIAGE_FAST, "d:/ymir work/ui/skill/common/affect/marriage_fast.sub",), chr.NEW_AFFECT_MARRIAGE_FAST : (localeInfo.TOOLTIP_MALL_MARRIAGE_FAST, "d:/ymir work/ui/skill/common/affect/marriage_fast.sub",),
chr.NEW_AFFECT_GOLD_BONUS : (localeInfo.TOOLTIP_MALL_GOLDBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/gold_bonus.sub",), chr.NEW_AFFECT_GOLD_BONUS : (localeInfo.TOOLTIP_MALL_GOLDBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/gold_bonus.sub",),
chr.NEW_AFFECT_NO_DEATH_PENALTY : (localeInfo.TOOLTIP_APPLY_NO_DEATH_PENALTY, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"), chr.NEW_AFFECT_NO_DEATH_PENALTY : (localeInfo.TOOLTIP_APPLY_NO_DEATH_PENALTY, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"),
chr.NEW_AFFECT_SKILL_BOOK_BONUS : (localeInfo.TOOLTIP_APPLY_SKILL_BOOK_BONUS, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"), chr.NEW_AFFECT_SKILL_BOOK_BONUS : (localeInfo.TOOLTIP_APPLY_SKILL_BOOK_BONUS, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"),
chr.NEW_AFFECT_SKILL_BOOK_NO_DELAY : (localeInfo.TOOLTIP_APPLY_SKILL_BOOK_NO_DELAY, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"), chr.NEW_AFFECT_SKILL_BOOK_NO_DELAY : (localeInfo.TOOLTIP_APPLY_SKILL_BOOK_NO_DELAY, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"),
# <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> hp, sp # <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> hp, sp
chr.NEW_AFFECT_AUTO_HP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/ui/pattern/auto_hpgauge/05.dds"), chr.NEW_AFFECT_AUTO_HP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/ui/pattern/auto_hpgauge/05.dds"),
chr.NEW_AFFECT_AUTO_SP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/ui/pattern/auto_spgauge/05.dds"), chr.NEW_AFFECT_AUTO_SP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/ui/pattern/auto_spgauge/05.dds"),
#chr.NEW_AFFECT_AUTO_HP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"), #chr.NEW_AFFECT_AUTO_HP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"),
#chr.NEW_AFFECT_AUTO_SP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/ui/skill/common/affect/gold_bonus.sub"), #chr.NEW_AFFECT_AUTO_SP_RECOVERY : (localeInfo.TOOLTIP_AUTO_POTION_REST, "d:/ymir work/ui/skill/common/affect/gold_bonus.sub"),
MALL_DESC_IDX_START+player.POINT_MALL_ATTBONUS : (localeInfo.TOOLTIP_MALL_ATTBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/att_bonus.sub",), MALL_DESC_IDX_START + player.POINT_MALL_ATTBONUS : (localeInfo.TOOLTIP_MALL_ATTBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/att_bonus.sub",),
MALL_DESC_IDX_START+player.POINT_MALL_DEFBONUS : (localeInfo.TOOLTIP_MALL_DEFBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/def_bonus.sub",), MALL_DESC_IDX_START + player.POINT_MALL_DEFBONUS : (localeInfo.TOOLTIP_MALL_DEFBONUS_STATIC, "d:/ymir work/ui/skill/common/affect/def_bonus.sub",),
MALL_DESC_IDX_START+player.POINT_MALL_EXPBONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS, "d:/ymir work/ui/skill/common/affect/exp_bonus.sub",), MALL_DESC_IDX_START + player.POINT_MALL_EXPBONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS, "d:/ymir work/ui/skill/common/affect/exp_bonus.sub",),
MALL_DESC_IDX_START+player.POINT_MALL_ITEMBONUS : (localeInfo.TOOLTIP_MALL_ITEMBONUS, "d:/ymir work/ui/skill/common/affect/item_bonus.sub",), MALL_DESC_IDX_START + player.POINT_MALL_ITEMBONUS : (localeInfo.TOOLTIP_MALL_ITEMBONUS, "d:/ymir work/ui/skill/common/affect/item_bonus.sub",),
MALL_DESC_IDX_START+player.POINT_MALL_GOLDBONUS : (localeInfo.TOOLTIP_MALL_GOLDBONUS, "d:/ymir work/ui/skill/common/affect/gold_bonus.sub",), MALL_DESC_IDX_START + player.POINT_MALL_GOLDBONUS : (localeInfo.TOOLTIP_MALL_GOLDBONUS, "d:/ymir work/ui/skill/common/affect/gold_bonus.sub",),
MALL_DESC_IDX_START+player.POINT_CRITICAL_PCT : (localeInfo.TOOLTIP_APPLY_CRITICAL_PCT,"d:/ymir work/ui/skill/common/affect/critical.sub"), MALL_DESC_IDX_START + player.POINT_CRITICAL_PCT : (localeInfo.TOOLTIP_APPLY_CRITICAL_PCT,"d:/ymir work/ui/skill/common/affect/critical.sub"),
MALL_DESC_IDX_START+player.POINT_PENETRATE_PCT : (localeInfo.TOOLTIP_APPLY_PENETRATE_PCT, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"), MALL_DESC_IDX_START + player.POINT_PENETRATE_PCT : (localeInfo.TOOLTIP_APPLY_PENETRATE_PCT, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"),
MALL_DESC_IDX_START+player.POINT_MAX_HP_PCT : (localeInfo.TOOLTIP_MAX_HP_PCT, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"), MALL_DESC_IDX_START + player.POINT_MAX_HP_PCT : (localeInfo.TOOLTIP_MAX_HP_PCT, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"),
MALL_DESC_IDX_START+player.POINT_MAX_SP_PCT : (localeInfo.TOOLTIP_MAX_SP_PCT, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"), MALL_DESC_IDX_START + player.POINT_MAX_SP_PCT : (localeInfo.TOOLTIP_MAX_SP_PCT, "d:/ymir work/ui/skill/common/affect/gold_premium.sub"),
MALL_DESC_IDX_START+player.POINT_PC_BANG_EXP_BONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS_P_STATIC, "d:/ymir work/ui/skill/common/affect/EXP_Bonus_p_on.sub",), MALL_DESC_IDX_START + player.POINT_PC_BANG_EXP_BONUS : (localeInfo.TOOLTIP_MALL_EXPBONUS_P_STATIC, "d:/ymir work/ui/skill/common/affect/EXP_Bonus_p_on.sub",),
MALL_DESC_IDX_START+player.POINT_PC_BANG_DROP_BONUS: (localeInfo.TOOLTIP_MALL_ITEMBONUS_P_STATIC, "d:/ymir work/ui/skill/common/affect/Item_Bonus_p_on.sub",), MALL_DESC_IDX_START + player.POINT_PC_BANG_DROP_BONUS: (localeInfo.TOOLTIP_MALL_ITEMBONUS_P_STATIC, "d:/ymir work/ui/skill/common/affect/Item_Bonus_p_on.sub",),
# MR-12: Add Mall Attack speed affect
MALL_DESC_IDX_START + player.POINT_ATT_SPEED : (localeInfo.TOOLTIP_MALL_ATT_SPEED, "d:/ymir work/ui/skill/common/affect/Increase_Attack_Speed.sub",),
# MR-12: -- END OF -- Add Mall Attack speed affect
} }
if app.ENABLE_DRAGON_SOUL_SYSTEM: if app.ENABLE_DRAGON_SOUL_SYSTEM:
# <20><>ȥ<EFBFBD><C8A5> õ, <20><> <20><>. # <20><>ȥ<EFBFBD><C8A5> õ, <20><> <20><>.
AFFECT_DATA_DICT[chr.NEW_AFFECT_DRAGON_SOUL_DECK1] = (localeInfo.TOOLTIP_DRAGON_SOUL_DECK1, "d:/ymir work/ui/dragonsoul/buff_ds_sky1.tga") AFFECT_DATA_DICT[chr.NEW_AFFECT_DRAGON_SOUL_DECK1] = (localeInfo.TOOLTIP_DRAGON_SOUL_DECK1, "d:/ymir work/ui/dragonsoul/buff_ds_sky1.tga")
@@ -617,22 +628,24 @@ class AffectShower(ui.Window):
def __init__(self): def __init__(self):
ui.Window.__init__(self) ui.Window.__init__(self)
self.serverPlayTime=0 self.serverPlayTime = 0
self.clientPlayTime=0 self.clientPlayTime = 0
self.lastUpdateTime=0 self.lastUpdateTime = 0
self.affectImageDict={} self.affectImageDict = {}
self.horseImage=None self.horseImage = None
self.lovePointImage=None self.lovePointImage = None
self.autoPotionImageHP = AutoPotionImage() self.autoPotionImageHP = AutoPotionImage()
self.autoPotionImageSP = AutoPotionImage() self.autoPotionImageSP = AutoPotionImage()
self.SetPosition(10, 10) self.SetPosition(10, 10)
self.Show() self.Show()
def ClearAllAffects(self): def ClearAllAffects(self):
self.horseImage=None self.horseImage = None
self.lovePointImage=None self.lovePointImage = None
self.affectImageDict={} self.affectImageDict = {}
self.__ArrangeImageList() self.__ArrangeImageList()
def ClearAffects(self): ## <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>۴ϴ<DBB4>. def ClearAffects(self): ## <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>۴ϴ<DBB4>.
@@ -644,7 +657,6 @@ class AffectShower(ui.Window):
self.__ArrangeImageList() self.__ArrangeImageList()
def BINARY_NEW_AddAffect(self, type, pointIdx, value, duration): def BINARY_NEW_AddAffect(self, type, pointIdx, value, duration):
print(("BINARY_NEW_AddAffect", type, pointIdx, value, duration)) print(("BINARY_NEW_AddAffect", type, pointIdx, value, duration))
if type < 500: if type < 500:
@@ -678,6 +690,7 @@ class AffectShower(ui.Window):
value = 1 + float(value) / 100.0 value = 1 + float(value) / 100.0
trashValue = 123 trashValue = 123
#if affect == chr.NEW_AFFECT_AUTO_SP_RECOVERY or affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY: #if affect == chr.NEW_AFFECT_AUTO_SP_RECOVERY or affect == chr.NEW_AFFECT_AUTO_HP_RECOVERY:
if trashValue == 1: if trashValue == 1:
try: try:
@@ -699,24 +712,26 @@ class AffectShower(ui.Window):
image.OnUpdateAutoPotionImage() image.OnUpdateAutoPotionImage()
self.affectImageDict[affect] = image self.affectImageDict[affect] = image
self.__ArrangeImageList() self.__ArrangeImageList()
except Exception as e: except Exception as e:
print(("except Aff auto potion affect ", e)) print(("except Aff auto potion affect ", e))
pass pass
else: else:
if affect != chr.NEW_AFFECT_AUTO_SP_RECOVERY and affect != chr.NEW_AFFECT_AUTO_HP_RECOVERY: if affect != chr.NEW_AFFECT_AUTO_SP_RECOVERY and affect != chr.NEW_AFFECT_AUTO_HP_RECOVERY:
description = description(float(value)) description = description(float(value))
try: try:
print(("Add affect %s" % affect)) print(("Add affect %s" % affect))
image = AffectImage() image = AffectImage()
image.SetParent(self) image.SetParent(self)
image.LoadImage(filename) image.LoadImage(filename)
image.SetDescription(description) image.SetDescription(description)
image.SetDuration(duration) image.SetDuration(duration)
image.SetAffect(affect) image.SetAffect(affect)
if affect == chr.NEW_AFFECT_EXP_BONUS_EURO_FREE or\ if affect == chr.NEW_AFFECT_EXP_BONUS_EURO_FREE or\
affect == chr.NEW_AFFECT_EXP_BONUS_EURO_FREE_UNDER_15 or\ affect == chr.NEW_AFFECT_EXP_BONUS_EURO_FREE_UNDER_15 or\
self.INFINITE_AFFECT_DURATION < duration: self.INFINITE_AFFECT_DURATION < duration:
@@ -731,6 +746,7 @@ class AffectShower(ui.Window):
image.SetScale(1, 1) image.SetScale(1, 1)
else: else:
image.SetScale(0.7, 0.7) image.SetScale(0.7, 0.7)
image.SetSkillAffectFlag(False) image.SetSkillAffectFlag(False)
image.Show() image.Show()
self.affectImageDict[affect] = image self.affectImageDict[affect] = image
@@ -873,26 +889,17 @@ class AffectShower(ui.Window):
image.SetPosition(xPos, 0) image.SetPosition(xPos, 0)
xPos += self.IMAGE_STEP xPos += self.IMAGE_STEP
# MR-12: Fix realtime countdown auto-start
def OnUpdate(self): def OnUpdate(self):
try: try:
# MR-10: Add toolTip support and real-time countdown for affects for image in list(self.affectImageDict.values()):
curTime = app.GetGlobalTime() if image.GetAffect() == chr.NEW_AFFECT_AUTO_HP_RECOVERY or image.GetAffect() == chr.NEW_AFFECT_AUTO_SP_RECOVERY:
image.UpdateAutoPotionDescription()
if curTime < self.lastUpdateTime: continue
self.lastUpdateTime = 0
if not image.IsSkillAffect():
if curTime - self.lastUpdateTime > 500: image.UpdateDescription()
#if 0 < app.GetGlobalTime():
self.lastUpdateTime = curTime
# MR-10: -- END OF -- Add toolTip support and real-time countdown for affects
for image in list(self.affectImageDict.values()):
if image.GetAffect() == chr.NEW_AFFECT_AUTO_HP_RECOVERY or image.GetAffect() == chr.NEW_AFFECT_AUTO_SP_RECOVERY:
image.UpdateAutoPotionDescription()
continue
if not image.IsSkillAffect():
image.UpdateDescription()
except Exception as e: except Exception as e:
print(("AffectShower::OnUpdate error : ", e)) print(("AffectShower::OnUpdate error : ", e))
# MR-12: -- END OF -- Fix realtime countdown auto-start

View File

@@ -36,17 +36,21 @@ class AttachMetinDialog(ui.ScriptWindow):
exception.Abort("AttachStoneDialog.__LoadScript.BindObject") exception.Abort("AttachStoneDialog.__LoadScript.BindObject")
oldToolTip = uiToolTip.ItemToolTip() oldToolTip = uiToolTip.ItemToolTip()
oldToolTip.SetParent(self) oldToolTip.SetParent(self)
oldToolTip.SetPosition(15, 38) oldToolTip.SetPosition(15, 38)
oldToolTip.SetFollow(False) oldToolTip.SetFollow(False)
oldToolTip.Show() oldToolTip.Show()
self.oldToolTip = oldToolTip self.oldToolTip = oldToolTip
newToolTip = uiToolTip.ItemToolTip() newToolTip = uiToolTip.ItemToolTip()
newToolTip.SetParent(self) newToolTip.SetParent(self)
newToolTip.SetPosition(230 + 20, 38) newToolTip.SetPosition(230 + 20, 38)
newToolTip.SetFollow(False) newToolTip.SetFollow(False)
newToolTip.Show() newToolTip.Show()
self.newToolTip = newToolTip self.newToolTip = newToolTip
self.titleBar.SetCloseEvent(ui.__mem_func__(self.Close)) self.titleBar.SetCloseEvent(ui.__mem_func__(self.Close))
@@ -88,24 +92,37 @@ class AttachMetinDialog(ui.ScriptWindow):
except: except:
dbg.TraceError("AttachMetinDialog.Open.LoadImage - Failed to find item data") dbg.TraceError("AttachMetinDialog.Open.LoadImage - Failed to find item data")
# MR-12: Fix attribute and metin socket order display in tooltip
# Get actual item attributes/bonuses for display
attrSlot = []
for i in range(player.ATTRIBUTE_SLOT_MAX_NUM):
attrSlot.append(player.GetItemAttribute(targetItemPos, i))
metinSlot = [] metinSlot = []
for i in range(player.METIN_SOCKET_MAX_NUM): for i in range(player.METIN_SOCKET_MAX_NUM):
metinSlot.append(player.GetItemMetinSocket(targetItemPos, i)) metinSlot.append(player.GetItemMetinSocket(targetItemPos, i))
for i in range(player.METIN_SOCKET_MAX_NUM): for i in range(player.METIN_SOCKET_MAX_NUM):
slotData = metinSlot[i] slotData = metinSlot[i]
if self.CanAttachMetin(slotData, metinSubType): if self.CanAttachMetin(slotData, metinSubType):
metinSlot[i] = metinIndex metinSlot[i] = metinIndex
break
self.newToolTip.AddItemData(itemIndex, metinSlot)
break
self.newToolTip.AddItemData(itemIndex, metinSlot, attrSlot)
item.SelectItem(metinIndex) item.SelectItem(metinIndex)
metinSlot = [] metinSlot = []
for i in range(player.METIN_SOCKET_MAX_NUM): for i in range(player.METIN_SOCKET_MAX_NUM):
metinSlot.append(player.GetItemMetinSocket(targetItemPos, i)) metinSlot.append(player.GetItemMetinSocket(targetItemPos, i))
self.oldToolTip.ResizeToolTipWidth(self.newToolTip.GetWidth()) self.oldToolTip.ResizeToolTipWidth(self.newToolTip.GetWidth())
self.oldToolTip.AddItemData(itemIndex, metinSlot) self.oldToolTip.AddItemData(itemIndex, metinSlot, attrSlot)
# MR-12: -- END OF -- Fix attribute and metin socket order display in tooltip
self.UpdateDialog() self.UpdateDialog()
self.SetTop() self.SetTop()

View File

@@ -702,7 +702,15 @@ class DragonSoulWindow(ui.ScriptWindow):
deckIndex = self.deckPageIndex deckIndex = self.deckPageIndex
if not self.isActivated or self.deckPageIndex != deckIndex: if not self.isActivated or self.deckPageIndex != deckIndex:
if self.__CanActivateDeck(): # MR-12: Improve keyboard shortcut functionality for deck toggling
if self.deckPageIndex != deckIndex:
self.deckPageIndex = deckIndex
self.deckTab[deckIndex].Down()
self.deckTab[(deckIndex + 1) % 2].SetUp()
self.RefreshEquipSlotWindow()
# Now validate the deck we switched to
if self.__CanActivateDeck(deckIndex):
net.SendChatPacket("/dragon_soul activate " + str(deckIndex)) net.SendChatPacket("/dragon_soul activate " + str(deckIndex))
self.isActivated = True self.isActivated = True
@@ -712,18 +720,31 @@ class DragonSoulWindow(ui.ScriptWindow):
else: else:
self.isActivated = False self.isActivated = False
self.activateButton.SetUp() self.activateButton.SetUp()
# MR-12: -- END OF -- Improve keyboard shortcut functionality for deck toggling
else: else:
net.SendChatPacket("/dragon_soul deactivate") net.SendChatPacket("/dragon_soul deactivate")
self.isActivated = False self.isActivated = False
self.activateButton.SetUp() self.activateButton.SetUp()
# Clear the tooltip cache when deactivating
if self.tooltipItem:
self.tooltipItem.ClearDragonSoulTimeCache()
# MR-3: -- END OF -- Keyboard-enabled deck toggling # MR-3: -- END OF -- Keyboard-enabled deck toggling
def __CanActivateDeck(self): # MR-12: Fix activation of decks with expired dragon souls
def __CanActivateDeck(self, deckIndex = None):
# If deckIndex not specified, check the current deck page
if deckIndex is None:
deckIndex = self.deckPageIndex
canActiveNum = 0 canActiveNum = 0
for i in range(6): for i in range(6):
slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i) # Calculate the slot number for the specified deck
itemVnum = player.GetItemIndex(slotNumber) equipSlotPos = player.DRAGON_SOUL_EQUIPMENT_SLOT_START + deckIndex * player.DRAGON_SOUL_EQUIPMENT_FIRST_SIZE + i
slotNumber = equipSlotPos
itemVnum = player.GetItemIndex(player.INVENTORY, slotNumber)
# MR-12: -- END OF -- Fix activation of decks with expired dragon souls
if itemVnum != 0: if itemVnum != 0:
item.SelectItem(itemVnum) item.SelectItem(itemVnum)

View File

@@ -10,7 +10,6 @@ import uiCommon
import constInfo import constInfo
class RefineDialog(ui.ScriptWindow): class RefineDialog(ui.ScriptWindow):
makeSocketSuccessPercentage = ( 100, 33, 20, 15, 10, 5, 0 ) makeSocketSuccessPercentage = ( 100, 33, 20, 15, 10, 5, 0 )
upgradeStoneSuccessPercentage = ( 30, 29, 28, 27, 26, 25, 24, 23, 22 ) upgradeStoneSuccessPercentage = ( 30, 29, 28, 27, 26, 25, 24, 23, 22 )
upgradeArmorSuccessPercentage = ( 99, 66, 33, 33, 33, 33, 33, 33, 33 ) upgradeArmorSuccessPercentage = ( 99, 66, 33, 33, 33, 33, 33, 33, 33 )
@@ -89,24 +88,21 @@ class RefineDialog(ui.ScriptWindow):
self.dlgQuestion = 0 self.dlgQuestion = 0
def GetRefineSuccessPercentage(self, scrollSlotIndex, itemSlotIndex): def GetRefineSuccessPercentage(self, scrollSlotIndex, itemSlotIndex):
if -1 != scrollSlotIndex: if -1 != scrollSlotIndex:
if player.IsRefineGradeScroll(scrollSlotIndex): if player.IsRefineGradeScroll(scrollSlotIndex):
curGrade = player.GetItemGrade(itemSlotIndex) curGrade = player.GetItemGrade(itemSlotIndex)
itemIndex = player.GetItemIndex(itemSlotIndex) itemIndex = player.GetItemIndex(itemSlotIndex)
item.SelectItem(itemIndex) item.SelectItem(itemIndex)
itemType = item.GetItemType() itemType = item.GetItemType()
itemSubType = item.GetItemSubType() itemSubType = item.GetItemSubType()
if item.ITEM_TYPE_METIN == itemType: if item.ITEM_TYPE_METIN == itemType:
if curGrade >= len(self.upgradeStoneSuccessPercentage): if curGrade >= len(self.upgradeStoneSuccessPercentage):
return 0 return 0
return self.upgradeStoneSuccessPercentage[curGrade] return self.upgradeStoneSuccessPercentage[curGrade]
elif item.ITEM_TYPE_ARMOR == itemType: elif item.ITEM_TYPE_ARMOR == itemType:
if item.ARMOR_BODY == itemSubType: if item.ARMOR_BODY == itemSubType:
if curGrade >= len(self.upgradeArmorSuccessPercentage): if curGrade >= len(self.upgradeArmorSuccessPercentage):
return 0 return 0
@@ -115,11 +111,10 @@ class RefineDialog(ui.ScriptWindow):
if curGrade >= len(self.upgradeAccessorySuccessPercentage): if curGrade >= len(self.upgradeAccessorySuccessPercentage):
return 0 return 0
return self.upgradeAccessorySuccessPercentage[curGrade] return self.upgradeAccessorySuccessPercentage[curGrade]
else: else:
if curGrade >= len(self.upgradeSuccessPercentage): if curGrade >= len(self.upgradeSuccessPercentage):
return 0 return 0
return self.upgradeSuccessPercentage[curGrade] return self.upgradeSuccessPercentage[curGrade]
for i in range(player.METIN_SOCKET_MAX_NUM+1): for i in range(player.METIN_SOCKET_MAX_NUM+1):
@@ -133,15 +128,19 @@ class RefineDialog(ui.ScriptWindow):
self.targetItemPos = targetItemPos self.targetItemPos = targetItemPos
percentage = self.GetRefineSuccessPercentage(scrollItemPos, targetItemPos) percentage = self.GetRefineSuccessPercentage(scrollItemPos, targetItemPos)
if 0 == percentage: if 0 == percentage:
return return
self.successPercentage.SetText(localeInfo.REFINE_SUCCESS_PROBALITY % (percentage)) self.successPercentage.SetText(localeInfo.REFINE_SUCCESS_PROBALITY % (percentage))
itemIndex = player.GetItemIndex(targetItemPos) itemIndex = player.GetItemIndex(targetItemPos)
self.toolTip.ClearToolTip() self.toolTip.ClearToolTip()
metinSlot = [] metinSlot = []
for i in range(player.METIN_SOCKET_MAX_NUM): for i in range(player.METIN_SOCKET_MAX_NUM):
metinSlot.append(player.GetItemMetinSocket(targetItemPos, i)) metinSlot.append(player.GetItemMetinSocket(targetItemPos, i))
self.toolTip.AddItemData(itemIndex, metinSlot) self.toolTip.AddItemData(itemIndex, metinSlot)
self.UpdateDialog() self.UpdateDialog()
@@ -151,17 +150,21 @@ class RefineDialog(ui.ScriptWindow):
def UpdateDialog(self): def UpdateDialog(self):
newWidth = self.toolTip.GetWidth() + 30 newWidth = self.toolTip.GetWidth() + 30
newHeight = self.toolTip.GetHeight() + 98 newHeight = self.toolTip.GetHeight() + 98
self.board.SetSize(newWidth, newHeight) self.board.SetSize(newWidth, newHeight)
self.titleBar.SetWidth(newWidth-15) self.titleBar.SetWidth(newWidth-15)
self.SetSize(newWidth, newHeight) self.SetSize(newWidth, newHeight)
(x, y) = self.GetLocalPosition() (x, y) = self.GetLocalPosition()
self.SetPosition(x, y) self.SetPosition(x, y)
def OpenQuestionDialog(self): def OpenQuestionDialog(self):
percentage = self.GetRefineSuccessPercentage(-1, self.targetItemPos) percentage = self.GetRefineSuccessPercentage(-1, self.targetItemPos)
if 100 == percentage: if 100 == percentage:
self.Accept() self.Accept()
return return
self.dlgQuestion.SetTop() self.dlgQuestion.SetTop()
@@ -197,11 +200,9 @@ class RefineDialogNew(ui.ScriptWindow):
self.type = 0 self.type = 0
def __LoadScript(self): def __LoadScript(self):
try: try:
pyScrLoader = ui.PythonScriptLoader() pyScrLoader = ui.PythonScriptLoader()
pyScrLoader.LoadScriptFile(self, "uiscript/refinedialog.py") pyScrLoader.LoadScriptFile(self, "uiscript/refinedialog.py")
except: except:
import exception import exception
exception.Abort("RefineDialog.__LoadScript.LoadObject") exception.Abort("RefineDialog.__LoadScript.LoadObject")
@@ -228,8 +229,10 @@ class RefineDialogNew(ui.ScriptWindow):
self.toolTip = toolTip self.toolTip = toolTip
self.slotList = [] self.slotList = []
for i in range(3): for i in range(3):
slot = self.__MakeSlot() slot = self.__MakeSlot()
slot.SetParent(toolTip) slot.SetParent(toolTip)
slot.SetWindowVerticalAlignCenter() slot.SetWindowVerticalAlignCenter()
self.slotList.append(slot) self.slotList.append(slot)
@@ -248,26 +251,33 @@ class RefineDialogNew(ui.ScriptWindow):
def __MakeSlot(self): def __MakeSlot(self):
slot = ui.ImageBox() slot = ui.ImageBox()
slot.LoadImage("d:/ymir work/ui/public/slot_base.sub") slot.LoadImage("d:/ymir work/ui/public/slot_base.sub")
slot.Show() slot.Show()
self.children.append(slot) self.children.append(slot)
return slot return slot
def __MakeItemImage(self): def __MakeItemImage(self):
itemImage = ui.ImageBox() itemImage = ui.ImageBox()
itemImage.Show() itemImage.Show()
self.children.append(itemImage) self.children.append(itemImage)
return itemImage return itemImage
def __MakeThinBoard(self): def __MakeThinBoard(self):
thinBoard = ui.ThinBoard() thinBoard = ui.ThinBoard()
thinBoard.SetParent(self) thinBoard.SetParent(self)
thinBoard.Show() thinBoard.Show()
self.children.append(thinBoard) self.children.append(thinBoard)
return thinBoard return thinBoard
def Destroy(self): def Destroy(self):
self.ClearDictionary() self.ClearDictionary()
self.dlgQuestion = None self.dlgQuestion = None
self.board = 0 self.board = 0
self.probText = 0 self.probText = 0
@@ -279,7 +289,6 @@ class RefineDialogNew(ui.ScriptWindow):
self.children = [] self.children = []
def Open(self, targetItemPos, nextGradeItemVnum, cost, prob, type): def Open(self, targetItemPos, nextGradeItemVnum, cost, prob, type):
if False == self.isLoaded: if False == self.isLoaded:
self.__LoadScript() self.__LoadScript()
@@ -296,12 +305,15 @@ class RefineDialogNew(ui.ScriptWindow):
self.toolTip.ClearToolTip() self.toolTip.ClearToolTip()
metinSlot = [] metinSlot = []
for i in range(player.METIN_SOCKET_MAX_NUM): for i in range(player.METIN_SOCKET_MAX_NUM):
metinSlot.append(player.GetItemMetinSocket(targetItemPos, i)) metinSlot.append(player.GetItemMetinSocket(targetItemPos, i))
attrSlot = [] attrSlot = []
for i in range(player.ATTRIBUTE_SLOT_MAX_NUM): for i in range(player.ATTRIBUTE_SLOT_MAX_NUM):
attrSlot.append(player.GetItemAttribute(targetItemPos, i)) attrSlot.append(player.GetItemAttribute(targetItemPos, i))
self.toolTip.AddRefineItemData(nextGradeItemVnum, metinSlot, attrSlot) self.toolTip.AddRefineItemData(nextGradeItemVnum, metinSlot, attrSlot)
item.SelectItem(nextGradeItemVnum) item.SelectItem(nextGradeItemVnum)
@@ -309,6 +321,7 @@ class RefineDialogNew(ui.ScriptWindow):
xSlotCount, ySlotCount = item.GetItemSize() xSlotCount, ySlotCount = item.GetItemSize()
for slot in self.slotList: for slot in self.slotList:
slot.Hide() slot.Hide()
for i in range(min(3, ySlotCount)): for i in range(min(3, ySlotCount)):
self.slotList[i].SetPosition(-35, i*32 - (ySlotCount-1)*16) self.slotList[i].SetPosition(-35, i*32 - (ySlotCount-1)*16)
self.slotList[i].Show() self.slotList[i].Show()
@@ -325,19 +338,23 @@ class RefineDialogNew(ui.ScriptWindow):
def AppendMaterial(self, vnum, count): def AppendMaterial(self, vnum, count):
slot = self.__MakeSlot() slot = self.__MakeSlot()
slot.SetParent(self) slot.SetParent(self)
slot.SetPosition(15, self.dialogHeight) slot.SetPosition(15, self.dialogHeight)
itemImage = self.__MakeItemImage() itemImage = self.__MakeItemImage()
itemImage.SetParent(slot) itemImage.SetParent(slot)
item.SelectItem(vnum) item.SelectItem(vnum)
itemImage.LoadImage(item.GetIconImageFileName()) itemImage.LoadImage(item.GetIconImageFileName())
thinBoard = self.__MakeThinBoard() thinBoard = self.__MakeThinBoard()
thinBoard.SetPosition(50, self.dialogHeight) thinBoard.SetPosition(50, self.dialogHeight)
thinBoard.SetSize(self.toolTip.GetWidth(), 20) thinBoard.SetSize(self.toolTip.GetWidth(), 20)
textLine = ui.TextLine() textLine = ui.TextLine()
textLine.SetParent(thinBoard) textLine.SetParent(thinBoard)
textLine.SetFontName(localeInfo.UI_DEF_FONT) textLine.SetFontName(localeInfo.UI_DEF_FONT)
textLine.SetPackedFontColor(0xffdddddd) textLine.SetPackedFontColor(0xffdddddd)

View File

@@ -918,16 +918,41 @@ class ItemToolTip(ToolTip):
for i in range(player.ATTRIBUTE_SLOT_MAX_NUM): for i in range(player.ATTRIBUTE_SLOT_MAX_NUM):
type = attrSlot[i][0] type = attrSlot[i][0]
if 0 != type: if 0 != type:
return True return True
return False return False
# MR-12: Fix broken metin stones showing as empty sockets in item tooltip
def AddRefineItemData(self, itemVnum, metinSlot, attrSlot = 0): def AddRefineItemData(self, itemVnum, metinSlot, attrSlot = 0):
# Separate metin slots into filled (non-broken) and empty slots
filledSlots = []
emptySlots = []
for i in range(player.METIN_SOCKET_MAX_NUM): for i in range(player.METIN_SOCKET_MAX_NUM):
metinSlotData=metinSlot[i] metinSlotData = metinSlot[i]
if self.GetMetinItemIndex(metinSlotData) == constInfo.ERROR_METIN_STONE: metin_index = self.GetMetinItemIndex(metinSlotData)
metinSlot[i]=player.METIN_SOCKET_TYPE_SILVER
if metin_index == constInfo.ERROR_METIN_STONE:
# Broken stone - convert to empty silver socket
emptySlots.append(player.METIN_SOCKET_TYPE_SILVER)
elif metin_index == 0:
# Empty slot
emptySlots.append(metinSlotData)
else:
# Valid metin stone
filledSlots.append(metinSlotData)
# Rebuild metinSlot with filled slots first, then empty slots
newSlots = filledSlots + emptySlots
for i in range(player.METIN_SOCKET_MAX_NUM):
if i < len(newSlots):
metinSlot[i] = newSlots[i]
else:
metinSlot[i] = 0
# MR-12: -- END OF -- Fix broken metin stones showing as empty sockets in item tooltip
self.AddItemData(itemVnum, metinSlot, attrSlot) self.AddItemData(itemVnum, metinSlot, attrSlot)