diff --git a/.gitignore b/.gitignore index 6928ad6a..b6f2317f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,65 @@ ErrorLog.txt /*.exe !/config.exe !/Metin2.exe + +# ======================================================= +# FULLY CASE-INSENSITIVE BACKUP EXCLUSIONS +# Matches all files and folders ending in: +# _BK, _BAK, .BK, .BAK (and all case permutations) +# ======================================================= + +# ------------------------------------------------------- +# 1. EXCLUSIONS ENDING IN .BK / _BK +# ------------------------------------------------------- + +# Files/Folders ending in _BK (e.g., File_Bk, Folder_bK) +*_BK +*_Bk +*_bK +*_bk + +# Files ending in .BK (e.g., File.BK, File.bK) +*.BK +*.Bk +*.bK +*.bk + +# Files ending in "double extension" .X.BK (e.g., File.txt.Bk) +*.*.BK +*.*.Bk +*.*.bK +*.*.bk + +# ------------------------------------------------------- +# 2. EXCLUSIONS ENDING IN .BAK / _BAK +# ------------------------------------------------------- + +# Files/Folders ending in _BAK (e.g., File_BAK, Folder_bak) +*_BAK +*_BAk +*_BaK +*_Bak +*_bAK +*_bAk +*_baK +*_bak + +# Files ending in .BAK (e.g., File.BAK, File.bak) +*.BAK +*.BAk +*.BaK +*.Bak +*.bAK +*.bAk +*.baK +*.bak + +# Files ending in "double extension" .X.BAK (e.g., File.txt.Bak) +*.*.BAK +*.*.BAk +*.*.BaK +*.*.Bak +*.*.bAK +*.*.bAk +*.*.baK +*.*.bak diff --git a/README.md b/README.md index fe3d65eb..06dcefaf 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,28 @@ This repository contains all client-side data, including locale files, configurations, and descriptive text used by the game client. -## ✨ Critical Fix: Skill 19 Speed Sync +## Changelog 📋 -Sync with the fix in the server's `skill_proto` to resolve an issue where characters became unable to move after being affected by Strong Body (due to an incorrect `MOV_SPEED` value). +### 🐛 Bug Fixes +* **Skill 19:** Applied the correct `MOV_SPEED` value fix for Skill 19 across all locales. +* **Messenger - UI:** Fixed a critical UI issue where the name of a recently removed friend would sometimes appear on top of the next name in the list, or the "Empty" string, if it was selected during the removal process. -This client repository contains the necessary sync fix: - -* **Fixed `MOV_SPEED` value for Skill 19** in `locale/en/skilldesc.txt` and `locale/en/skilltable.txt`. - -### ⚠️ IMPORTANT: Locale Synchronization - -The fix listed above has **only been applied to the `locale/en` (English) files.** - -**If you use any other locale (e.g., German, French, etc.), you must manually update the `MOV_SPEED` value for Skill 19 in your respective `skilldesc.txt` and `skilltable.txt` files to match the change.** \ No newline at end of file +### ⬆️ Feature Improvements +* **Messenger System:** + * **Live Status Updates:** Live updates for adding/removing friend for both parties. + * **Auto-Deselect:** When a player removes a friend, or is removed by one, the entry is automatically deselected in the Messenger window. + * **Early Initialization:** The Messenger window is now automatically initialized (without visually opening the window) upon starting the game phase, allowing it to receive real-time updates from the very beginning. + * **Request Handling:** Pressing the `Escape` key while the request dialog is open now denies the request normally. + * **Button State:** The Whisper and Delete buttons are automatically disabled when removing/getting removed by a friend with the Messenger window open. + * **Target board:** The "Friend" button dynamically updates upon adding/removing a friend for both parties, if target is focused. +* **Inventory Management:** Inventory calculations are now correctly designed to handle togglable item activation effects across any number of inventory pages by calculating `page total slots * total pages`. +* **Skill Cooldowns and States:** A massive update to ensure reliability across various scenarios: + * **Window/Taskbar Persistence:** Cooldowns and active slot effects are now correctly maintained and updated in the Character Window and Taskbar during actions such as: repositioning skills, leveling up, changing skill grades (including Perfect), mounting/unmounting, changing Character Window pages, switching Skill View tabs, closing/reopening the window, and relogging. Supports togglable, non-togglable, and togglable-with-cooldown skills. + * **Level Reset Clearing:** Skill cooldowns and active slot states are properly cleared when the skill level is reset to 0. + * **Support togglables:** Combo automatically deactivates if its level is changed to 0 (e.g., via `/setsk`). + * **Horse Skill Cooldowns:** Horse skill cooldowns are cleared if their level is changed to 0. + * **Horse Skill View Logic:** The Horse skills page now correctly appears when the riding skill (Skill 130) reaches **level 21+** (not 20+). + * **Taskbar Sync:** Horse skills are automatically removed from the Taskbar, and the Skill View switches pages automatically, if the riding skill level drops below 21 (e.g., via `/setsk`). + * **Skill group 0 support for Horse page:** The Horse skill page is now visible even if there are no skills assigned to that group, provided the riding skill level is high enough. + * **Support skill levels:** Support and Horse skill states are correctly maintained when the character's skill group is reset. +* **.gitignore file:** Ignoring all files and directories ending in `_BAK` or `.BAK` (case-insensitive) diff --git a/assets/locale_cz/locale/cz/skilldesc.txt b/assets/locale_cz/locale/cz/skilldesc.txt index 484b5ec7..6a757a07 100644 --- a/assets/locale_cz/locale/cz/skilldesc.txt +++ b/assets/locale_cz/locale/cz/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR Prraz Tlakov vlna tok Tsunami Napad neptele frontln. eln prorec tok ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Hodnota toku %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 17 WARRIOR Prudk rna Prudk tyg rna Prudk dra rna Napad neptele frontln Prorec tok tok na vcero cl ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Hodnota toku %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 18 WARRIOR Dupnut Dupnut lva Dupnut nosoroce Poval nkolik neptel Prorec tok ance na bezvdom ATTACK_SKILL|STANDING_SKILL daejin 18 4 Hodnota toku %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint ance na bezvdom: %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR Siln tlo Tlo ze eleza Tlo z oceli Tvoje obrana se doasn zlep a nebude padat k zemi. Obrana se zlep Sniuje rychlost pohybu Neskcet se STANDING_SKILL cheongeun 19 4 Obrana: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Rychlost pohyb: -%.0f 1 + 9*SkillPoint +19 WARRIOR Siln tlo Tlo ze eleza Tlo z oceli Tvoje obrana se doasn zlep a nebude padat k zemi. Obrana se zlep Sniuje rychlost pohybu Neskcet se STANDING_SKILL cheongeun 19 4 Obrana: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Rychlost pohyb: -%.0f -(0.375*SkillPoint) 2 WARRIOR Smr mee avlov tanec Cykln Rozvi me, aby napadl vce neptel Prorec tok tok na vcero cl ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Hodnota toku: %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR Rna meem Bodnut meem Vrh meem Napad neptele frontln. tok na dlku tok na vcero cl Bezvdom pevrhne cl ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Hodnota toku %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k ance na bezvdom: %.0f%% (100+k*1000/6)/10 3 WARRIOR Bojov zuen Vztek Zbsilost Sousted se pouze na toen. Rychlost toku se zvyuje Zvyuje rychlost pohybu Zvyuje nchylnost k pokozen STANDING_SKILL jeongwi 3 4 Rychlost toku +%.0f%% 50 * SkillPoint Rychlost pohybu +%.0f%% 20 * SkillPoint diff --git a/assets/locale_de/locale/de/skilldesc.txt b/assets/locale_de/locale/de/skilldesc.txt index 6e7c22e6..7a44344f 100644 --- a/assets/locale_de/locale/de/skilldesc.txt +++ b/assets/locale_de/locale/de/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR Durchschlag Druckwelle Tsunami-Angriff Du greifst die Feinde frontal an. Frontaler Durchschlag-Angriff ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Angriffswert %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 17 WARRIOR Heftiges Schlagen Heftiger Tigerschlag Heftiger Drachenschlag Du greifst die Feinde frontal an. Durchschlag-Angriff Angriff auf mehrere Ziele ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Angriffswert %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 18 WARRIOR Stampfer Lwenstampfer Rhinozerosstampfer Wirf mehrere Feinde um. Durchschlag-Angriff Ohnmachtschance ATTACK_SKILL|STANDING_SKILL daejin 18 4 Angriffswert %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Ohnmachtschance %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR Starker Krper Krper aus Eisen Krper aus Stahl Deine Verteidigung wird eine Zeit lang besser und du fllst nicht zu Boden. Verteidigung wird verbessert Verringert die Bewegungsgeschwindigkeit Kein Umfallen STANDING_SKILL cheongeun 19 4 Verteidigung: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Bewegungsgeschwindigkeit: -%.0f 1 + 9*SkillPoint +19 WARRIOR Starker Krper Krper aus Eisen Krper aus Stahl Deine Verteidigung wird eine Zeit lang besser und du fllst nicht zu Boden. Verteidigung wird verbessert Verringert die Bewegungsgeschwindigkeit Kein Umfallen STANDING_SKILL cheongeun 19 4 Verteidigung: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Bewegungsgeschwindigkeit: -%.0f -(0.375*SkillPoint) 2 WARRIOR Schwertwirbel Schwerttanz Zyklon Wirbel das Schwert herum, um mehrere Feinde anzugreifen. Durchschlag-Angriff Angriff auf mehrere Ziele ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Angriffswert %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR Schwertschlag Schwertsto Schwertwurf Du greifst die Feinde frontal an. Fern-Angriff Angriff auf mehrere Ziele Ohnmacht Schlgt das Ziel zu Boden ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Angriffswert %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Ohnmachtschance %.0f%% (100+k*1000/6)/10 3 WARRIOR Kampfrausch Wut Raserei Du konzentrierst dich ausschlielich auf das Angreifen. Angriffsgeschwindigkeit wird erhht Erhht die Bewegungsgeschwindigkeit Erhht die Schadensanflligkeit STANDING_SKILL jeongwi 3 4 Angriffsgeschwindigkeit +%.0f%% 50 * SkillPoint Bewegungsgeschwindigkeit +%.0f%% 20 * SkillPoint diff --git a/assets/locale_dk/locale/dk/skilldesc.txt b/assets/locale_dk/locale/dk/skilldesc.txt index f85b3c8b..7f72aaa8 100644 --- a/assets/locale_dk/locale/dk/skilldesc.txt +++ b/assets/locale_dk/locale/dk/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR Gennemgende slag Trykblge Tsunami-angreb Du angriber fjenden frontalt. Frontalt angreb ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Angrebsvrdi %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 17 WARRIOR Voldsomme std Voldsomme tigerstd Voldsomme dragestd Du angriber fjenden frontalt Gennembruds angreb Angreb p flere fjender ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Angrebsvrdi %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 18 WARRIOR Trampning Lvens trampning Rhinoceros trampning Std mod flere fjender Gennembruds-angreb Sandsynlighed for besvimelse ATTACK_SKILL|STANDING_SKILL daejin 18 4 Angrebsstyrke %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Sandsynlighed for besvimelses %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR Strk krop Krop af jern Krop af stl Dit forsvar forges, og du kan ikke vltes. Forsvar forges Bevgelseshastigheden snkes Ingen vltning STANDING_SKILL cheongeun 19 4 Forsvar: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Bevgelseshastighed: -%.0f 1 + 9*SkillPoint +19 WARRIOR Strk krop Krop af jern Krop af stl Dit forsvar forges, og du kan ikke vltes. Forsvar forges Bevgelseshastigheden snkes Ingen vltning STANDING_SKILL cheongeun 19 4 Forsvar: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Bevgelseshastighed: -%.0f -(0.375*SkillPoint) 2 WARRIOR Svrd-hvirvel Svrd-dans Zyklon Hvirvler omkring med svrdet Gennemslagssangreb Angreb p flere fjender ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Angrebsvrdi %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR Svrdstdet Forbedret svrdstd Svrdkast Du angriber fjenden frontalt. Distance-angreb Angreb p flere fjender Besvimelse Vlter mlet ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Angrebsstyrke %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Sandsynlighed for besvimelse: %.0f%% (100+k*1000/6)/10 3 WARRIOR Berserk Vrede Raseri Du koncentrerer dig udelukkende om angrebet Angrebshastigheden forges Bevgelseshastigheden forges Forger modtaget skade STANDING_SKILL jeongwi 3 4 Angrebshastighed +%.0f%% 50 * SkillPoint Bevgelseshastighed +%.0f%% 20 * SkillPoint diff --git a/assets/locale_es/locale/es/skilldesc.txt b/assets/locale_es/locale/es/skilldesc.txt index c7630220..f23b1394 100644 --- a/assets/locale_es/locale/es/skilldesc.txt +++ b/assets/locale_es/locale/es/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR Pulso Espiritual Onda de Choque Ataque Tsunami Ataca directamente a los enemigos. Ataque frontal ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Fuerza de ataque %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 17 WARRIOR Golpe Golpe de Tigre Golpe de Dragn Ataca directamente a los enemigos Ataque fuerte Ataque a mltiples objetivos ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Fuerza de ataque %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 18 WARRIOR Tocn Tocn de Leon Tocn de Rinoceronte Derriba a varios enemigos. Ataque fuerte Probabilidad de desmayo ATTACK_SKILL|STANDING_SKILL daejin 18 4 Fuerza de ataque %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Probabilidad de desmayo %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR Cuerpo fuerte Cuerpo de hierro Cuerpo de acero Aumenta tu defensa por un perodo de tiempo y no caes al suelo. Incrementa defensa Disminuye velocidad de movimiento No caes STANDING_SKILL cheongeun 19 4 Defensa : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Velocidad de movimiento : -%.0f 1 + 9*SkillPoint +19 WARRIOR Cuerpo fuerte Cuerpo de hierro Cuerpo de acero Aumenta tu defensa por un perodo de tiempo y no caes al suelo. Incrementa defensa Disminuye velocidad de movimiento No caes STANDING_SKILL cheongeun 19 4 Defensa : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Velocidad de movimiento : -%.0f -(0.375*SkillPoint) 2 WARRIOR Giro de espada Danza de la espada Cicln Gira la espada para atacar a varios enemigos Ataque frontal Ataque de mltiples objetivos ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Fuerza de ataque %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR Golpe de espada Rayo de espada Lanzamiento de espada Atacas de frente al enemigo. Ataque de largo alcance Ataque a mltiples objetivos Efecto de desmayo Derriba al objetivo al suelo ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Fuerza de ataque %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Probabilidad de desmayo %.0f%% (100+k*1000/6)/10 3 WARRIOR Berserk Furia Frenes Solo concentracin en el ataque Incrementa velocidad de ataque Incrementa velocidad de movimiento Incrementa dao recibido STANDING_SKILL jeongwi 3 4 Velocidad de Ataque +%.0f%% 50 * SkillPoint Velocidad de Movimiento +%.0f%% 20 * SkillPoint diff --git a/assets/locale_fr/locale/fr/skilldesc.txt b/assets/locale_fr/locale/fr/skilldesc.txt index 91d8c8c3..2b2c3298 100644 --- a/assets/locale_fr/locale/fr/skilldesc.txt +++ b/assets/locale_fr/locale/fr/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR Attaque de l'Esprit Onde de choc Attaque Tsunami Attaque directement les ennemis. Attaque frontale violente ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Puissance de l'attaque %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 17 WARRIOR Attaque de la paume Paume du Tigre Paume du Dragon Attaque directement les ennemis. Attaque directe violente Attaque plusieurs cibles ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Puissance de l'attaque %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 18 WARRIOR Charge Charge du lion Charge du rhino Renverse plusieurs ennemis. Attaque directe violente Chance de provoquer un vanouissement ATTACK_SKILL|STANDING_SKILL daejin 18 4 Puissance de l'attaque %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Chance d'vanouissament : %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR Corps puissant Corps de fer Corps d'acier Augmente temporairement votre dfense et empche que vous soyez renvers Augmente la Dfense Diminue la vitesse de dplacement Empche que vous soyez renvers STANDING_SKILL cheongeun 19 4 Dfense : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Vitesse de dplacement : -%.0f 1 + 9*SkillPoint +19 WARRIOR Corps puissant Corps de fer Corps d'acier Augmente temporairement votre dfense et empche que vous soyez renvers Augmente la Dfense Diminue la vitesse de dplacement Empche que vous soyez renvers STANDING_SKILL cheongeun 19 4 Dfense : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Vitesse de dplacement : -%.0f -(0.375*SkillPoint) 2 WARRIOR Moulinet l'pe Danse de l'pe Cyclone Effectue des moulinets de l'pe pour attaquer plusieurs ennemis. Attaque frontale violente Attaque plusieurs cibles ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Puissance de l'attaque %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR Coup d'pe Coup d'pe foudroyant Jet d'pe Attaque frontalement les ennemis. Attaque distance Attaque plusieurs cibles Attaque assomante Fait chuter vos ennemis ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Valeur d'attaque %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Chance d'assomer : %.0f%% (100+k*1000/6)/10 3 WARRIOR Berserk Furie Frnsie Uniquement concentr sur l'attaque. Augmente la vitesse d'attaque Augmente la vitesse de dplacement Augmente les dommages reus STANDING_SKILL jeongwi 3 4 Vitesse d'attaque +%.0f%% 50 * SkillPoint Vitesse de dplacement +%.0f%% 20 * SkillPoint diff --git a/assets/locale_gr/locale/gr/skilldesc.txt b/assets/locale_gr/locale/gr/skilldesc.txt index f198d102..365a9ae7 100644 --- a/assets/locale_gr/locale/gr/skilldesc.txt +++ b/assets/locale_gr/locale/gr/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR (W) Tsunami ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 17 WARRIOR ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 18 WARRIOR . ATTACK_SKILL|STANDING_SKILL daejin 18 4 %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint : %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR STANDING_SKILL cheongeun 19 4 : +%.0f 7+(40 + 0.2*str + 0.4*con)*k : -%.0f 1 + 9*SkillPoint +19 WARRIOR STANDING_SKILL cheongeun 19 4 : +%.0f 7+(40 + 0.2*str + 0.4*con)*k : -%.0f -(0.375*SkillPoint) 2 WARRIOR . ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR . . ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k : %.0f%% (100+k*1000/6)/10 3 WARRIOR STANDING_SKILL jeongwi 3 4 +%.0f%% 50 * SkillPoint +%.0f%% 20 * SkillPoint diff --git a/assets/locale_hu/locale/hu/skilldesc.txt b/assets/locale_hu/locale/hu/skilldesc.txt index f9b6e53b..d4fdbe35 100644 --- a/assets/locale_hu/locale/hu/skilldesc.txt +++ b/assets/locale_hu/locale/hu/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR thatols Nyoms hullm Cunami tmads Szembl tmadsz az ellensgre. Frontlis tt tmads ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Tmad er %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 17 WARRIOR Heves csaps Heves tigris csaps Heves srkny csaps Frontlisan tmadsz az ellensgre tt tmads Tmads tbb cl ellen ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Tmad er %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 18 WARRIOR Dbrgs Oroszln dbrgs Orrszarv dbrgs Terts le tbb ellensget. tt tmads juls esly ATTACK_SKILL|STANDING_SKILL daejin 18 4 Tmad rtk %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint juls esly: %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR Ers test Test jgbl Test aclbl A vdekezsed egy idre javul s nem vesztesz. A vdekezs javul Cskken a mozgsi sebessg Nincs sszeomls STANDING_SKILL cheongeun 19 4 Vdekezs : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Mozgsi sebessg: -%.0f 1 + 9*SkillPoint +19 WARRIOR Ers test Test jgbl Test aclbl A vdekezsed egy idre javul s nem vesztesz. A vdekezs javul Cskken a mozgsi sebessg Nincs sszeomls STANDING_SKILL cheongeun 19 4 Vdekezs : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Mozgsi sebessg: -%.0f -(0.375*SkillPoint) 2 WARRIOR Forg kard Kard tnc Ciklon Forgasd krbe a kardot, hogy tbb ellensget tmad meg. tt tmads Tbb cl tmadsa ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Tmad rtk %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR Kard ts Kard szrs Kard dobs Szembl tmadsz az ellensgre. Tvoli tmads Tbb cl tmadsa juls Puszttsd el a clt ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Tmad rtk %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k juls esly: %.0f%% (100+k*1000/6)/10 3 WARRIOR Harci mmor Dh Vgtzs Kizrlag a tmadsra koncentrlj. Tmad sebessg nvekedik Nveli a mozgsi sebessget Nveli az elszenvedett vesztesgeket STANDING_SKILL jeongwi 3 4 Tmad sebessg +%.0f%% 50 * SkillPoint Mozgsi sebessg +%.0f%% 20 * SkillPoint diff --git a/assets/locale_it/locale/it/skilldesc.txt b/assets/locale_it/locale/it/skilldesc.txt index 4aaeb0c0..3001e5a1 100644 --- a/assets/locale_it/locale/it/skilldesc.txt +++ b/assets/locale_it/locale/it/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR Penetrazione Ondata di pressione Attacco Tsunami Attacchi i nemici frontalmente. Attacco trafiggente frontale ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Valore di attacco %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 17 WARRIOR Colpire duramente Potente colpo di tigre Potente colpo del drago Attacchi i nemici frontalmente. Attacco trafiggente Attacco a pi bersagli ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Valore di attacco %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 18 WARRIOR Pestone Pestone di leone Pestone di rinoceronte Fai cadere pi nemici. Attacco trafiggente Possibilit di svenimento ATTACK_SKILL|STANDING_SKILL daejin 18 4 Valore di attacco %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Probabilit di svenimento: %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR Corpo forte Corpo di ferro Corpo di acciaio La tua difesa migliora temporaneamente e non cadi a terra. La difesa viene migliorata Diminuisce la velocit di movimento Non si cade STANDING_SKILL cheongeun 19 4 Difesa +%.0f 7+(40 + 0.2*str + 0.4*con)*k Velocit di movimento -%.0f 1 + 9*SkillPoint +19 WARRIOR Corpo forte Corpo di ferro Corpo di acciaio La tua difesa migliora temporaneamente e non cadi a terra. La difesa viene migliorata Diminuisce la velocit di movimento Non si cade STANDING_SKILL cheongeun 19 4 Difesa +%.0f 7+(40 + 0.2*str + 0.4*con)*k Velocit di movimento -%.0f -(0.375*SkillPoint) 2 WARRIOR Vortice della spada Danza della spada Ciclone Fai girare vorticosamente la spada per attaccare pi nemici. Attacco trafiggente Attacco a pi bersagli ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Valore di attacco %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR Colpo di spada Stoccata di spada Lancio della spada Attacchi i nemici frontalmente. Attacco da lontano Attacco a pi bersagli Svenimento Fa cadere il bersaglio ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Valore di attacco %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Probabilit di svenimento: %.0f%% (100+k*1000/6)/10 3 WARRIOR Estasi da combattimento Rabbia Frenesia Ti concentri esclusivamente sull'attaccare Aumenta la velocit d'attacco Aumenta la velocit di movimento Aumenta la vulnerabilit al danno STANDING_SKILL jeongwi 3 4 Velocit di attacco +%.0f%% 50 * SkillPoint Velocit di movimento +%.0f%% 20 * SkillPoint diff --git a/assets/locale_nl/locale/nl/skilldesc.txt b/assets/locale_nl/locale/nl/skilldesc.txt index f9b6e53b..d4fdbe35 100644 --- a/assets/locale_nl/locale/nl/skilldesc.txt +++ b/assets/locale_nl/locale/nl/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR thatols Nyoms hullm Cunami tmads Szembl tmadsz az ellensgre. Frontlis tt tmads ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Tmad er %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 17 WARRIOR Heves csaps Heves tigris csaps Heves srkny csaps Frontlisan tmadsz az ellensgre tt tmads Tmads tbb cl ellen ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Tmad er %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 18 WARRIOR Dbrgs Oroszln dbrgs Orrszarv dbrgs Terts le tbb ellensget. tt tmads juls esly ATTACK_SKILL|STANDING_SKILL daejin 18 4 Tmad rtk %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint juls esly: %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR Ers test Test jgbl Test aclbl A vdekezsed egy idre javul s nem vesztesz. A vdekezs javul Cskken a mozgsi sebessg Nincs sszeomls STANDING_SKILL cheongeun 19 4 Vdekezs : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Mozgsi sebessg: -%.0f 1 + 9*SkillPoint +19 WARRIOR Ers test Test jgbl Test aclbl A vdekezsed egy idre javul s nem vesztesz. A vdekezs javul Cskken a mozgsi sebessg Nincs sszeomls STANDING_SKILL cheongeun 19 4 Vdekezs : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Mozgsi sebessg: -%.0f -(0.375*SkillPoint) 2 WARRIOR Forg kard Kard tnc Ciklon Forgasd krbe a kardot, hogy tbb ellensget tmad meg. tt tmads Tbb cl tmadsa ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Tmad rtk %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR Kard ts Kard szrs Kard dobs Szembl tmadsz az ellensgre. Tvoli tmads Tbb cl tmadsa juls Puszttsd el a clt ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Tmad rtk %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k juls esly: %.0f%% (100+k*1000/6)/10 3 WARRIOR Harci mmor Dh Vgtzs Kizrlag a tmadsra koncentrlj. Tmad sebessg nvekedik Nveli a mozgsi sebessget Nveli az elszenvedett vesztesgeket STANDING_SKILL jeongwi 3 4 Tmad sebessg +%.0f%% 50 * SkillPoint Mozgsi sebessg +%.0f%% 20 * SkillPoint diff --git a/assets/locale_pl/locale/pl/skilldesc.txt b/assets/locale_pl/locale/pl/skilldesc.txt index 67cce5a5..23db14c8 100644 --- a/assets/locale_pl/locale/pl/skilldesc.txt +++ b/assets/locale_pl/locale/pl/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR Duchowe Uderzenie Fala Uderzeniowa Atak Tsunami Atakuje centralnie wrogw Frontalny atak rozpryskowy ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Sia Ataku %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 17 WARRIOR Walnicie Tygrysie walnicie Smocze Powalenie Atakuje centralnie wrogw Prosty rozpryskowy atak Atak skierowany w kilka celw ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Sia Ataku %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 18 WARRIOR Tpnicie Tpnicia Lwa Tpnicie Nosoroca Zwal z ng kilku wrogw. Frontalny atak rozpryskowy Szansa na Omdlenie ATTACK_SKILL|STANDING_SKILL daejin 18 4 Sia Ataku %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Szansa na Omdlenie %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR Silne Ciao elazne Ciao Stalowe Ciao Zwiksza Obron i pomaga wygra Zwiksza Obron Zmniejsza Szybko Ruchu Nigdy nie upadasz STANDING_SKILL cheongeun 19 4 Obrona: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Szybko Ruchu: -%.0f 1 + 9*SkillPoint +19 WARRIOR Silne Ciao elazne Ciao Stalowe Ciao Zwiksza Obron i pomaga wygra Zwiksza Obron Zmniejsza Szybko Ruchu Nigdy nie upadasz STANDING_SKILL cheongeun 19 4 Obrona: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Szybko Ruchu: -%.0f -(0.375*SkillPoint) 2 WARRIOR Wir Miecza Taniec Miecza Cyklon Wiruj mieczem aby atakowa wielu przeciwnikw Frontalny atak rozpryskowy Atak w kilka celw ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Sia Ataku %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR Uderzenie Miecza Pchnicie Miecza Rzut Miecza atakujesz wrogw bezporednio Atak z dystansu Atak skierowany na kilka celw Omdlenie Powala cel na ziemi ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Sia Ataku %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Szansa na Omdlenie %.0f%% (100+k*1000/6)/10 3 WARRIOR Berserk Furia Sza Koncentracja tylko na ataku Zwiksza Szybko Ataku Zwiksza Szybko Ruchu Zwiksza otrzymywane obraenia STANDING_SKILL jeongwi 3 4 Szybko Ataku +%.0f%% 50 * SkillPoint Szybko Ruchu +%.0f%% 20 * SkillPoint diff --git a/assets/locale_pt/locale/pt/skilldesc.txt b/assets/locale_pt/locale/pt/skilldesc.txt index d67081ca..09049886 100644 --- a/assets/locale_pt/locale/pt/skilldesc.txt +++ b/assets/locale_pt/locale/pt/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR Fora do Golpe Onda de Choque Ataque Tsunami Ataca inimigos directamente. Ataque Residual Frontal ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Poder de Ataque %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 17 WARRIOR Ataque Destrutivo Garra do Tigre Garra do Drago Ataca inimigos directamente. Ataque Residual Directo Ataque a Mltiplos Alvos ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Poder de Ataque %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 18 WARRIOR Terramoto Terramoto Leo Terramoto Rinoceronte Derruba vrios inimigos. Ataque Residual Directo Probabilidade de Efeito Atordoante ATTACK_SKILL|STANDING_SKILL daejin 18 4 Poder de Ataque %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Probabilidade de Atordoamento %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR Corpo Forte Corpo de Ferro Corpo de Ao Aumenta a Defesa e no cais ao cho. Aumenta a Defesa Reduz a Rapidez de Movimento No cais ao cho STANDING_SKILL cheongeun 19 4 Defesa: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Rapidez de Movimento: -%.0f 1 + 9*SkillPoint +19 WARRIOR Corpo Forte Corpo de Ferro Corpo de Ao Aumenta a Defesa e no cais ao cho. Aumenta a Defesa Reduz a Rapidez de Movimento No cais ao cho STANDING_SKILL cheongeun 19 4 Defesa: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Rapidez de Movimento: -%.0f -(0.375*SkillPoint) 2 WARRIOR Espada Rotativa Espada Danante Ciclone Gira a espada para atacares vrios inimigos. Ataque Residual Frontal Ataque a Mltiplos Alvos ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Poder de Ataque %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR Ataque de Espada Raio de Espada Tempestade de Espada Ataca inimigos directamente. Ataque de Longo Alcance Ataque a Mltiplos Alvos Probabilidade de Atordar Atira o alvo ao cho ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Poder de Ataque %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Probabilidade de Atordoar %.0f%% (100+k*1000/6)/10 3 WARRIOR Raiva Fria Clera Concentras-te apenas no ataque. Aumenta a Rapidez de Ataque Aumenta a Rapidez de Movimento Aumenta o Dano Recebido STANDING_SKILL jeongwi 3 4 Rapidez de Ataque +%.0f%% 50 * SkillPoint Rapidez de Movimento +%.0f%% 20 * SkillPoint diff --git a/assets/locale_ro/locale/ro/skilldesc.txt b/assets/locale_ro/locale/ro/skilldesc.txt index 8178c8ef..9809cf6c 100644 --- a/assets/locale_ro/locale/ro/skilldesc.txt +++ b/assets/locale_ro/locale/ro/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR Atacul Spiritului Unda de Soc Atac Tsunami Ataci dumanii frontal. Atac de ptrundere frontal ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Atac %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 17 WARRIOR Zdrobire Zdrobirea Tigrului Zdrobirea Dragonului Ataci dusmanii frontal. Atac de patrundere Atac asupra mai multor inte ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Atac %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 18 WARRIOR Zdruncinare Zdruncinarea Leului Zdruncinarea Rinocerului Rasturnarea mai multor oponenti. Atac Direct Frontal Sansa de Confuzie ATTACK_SKILL|STANDING_SKILL daejin 18 4 Putere Atac %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Sansa Confuzie %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR Corp Rezistent Corp de Fier Corp de Otel Aprarea ta se mbuntete pentru un timp iar tu nu cazi la pmnt. mbuntirea aprrii Scade viteza de micare Nu cazi la pmnt STANDING_SKILL cheongeun 19 4 Aprare : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Vitez de micare: -%.0f 1 + 9*SkillPoint +19 WARRIOR Corp Rezistent Corp de Fier Corp de Otel Aprarea ta se mbuntete pentru un timp iar tu nu cazi la pmnt. mbuntirea aprrii Scade viteza de micare Nu cazi la pmnt STANDING_SKILL cheongeun 19 4 Aprare : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Vitez de micare: -%.0f -(0.375*SkillPoint) 2 WARRIOR Vartejul Sabiei Dansul Sabiei Ciclon nvrte sabia pentru a ataca mai muli dumani. Atac ptrunztor Atac asupra mai multor inte ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Atac %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR Atacul Sabiei Fulgerul Sabiei Traznetul Sabiei Ataca inamicii direct. Atac de Raza Lunga Atac pe tinte multiple Efect de Confuzie Arunca oponentul la pamant ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Putere Atac %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Sansa Confuzie %.0f%% (100+k*1000/6)/10 3 WARRIOR Iures Furie Turbare Te concentrezi doar asupra atacului. Viteza de atac crete Crete viteza de micare Crete expunerea la pagube STANDING_SKILL jeongwi 3 4 Viteza de atac +%.0f%% 50 * SkillPoint Viteza de micare +%.0f%% 20 * SkillPoint diff --git a/assets/locale_ru/locale/ru/skilldesc.txt b/assets/locale_ru/locale/ru/skilldesc.txt index dee6be3c..57dd32ae 100644 --- a/assets/locale_ru/locale/ru/skilldesc.txt +++ b/assets/locale_ru/locale/ru/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR . ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 :%.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 17 WARRIOR . ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 : %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 18 WARRIOR . ATTACK_SKILL|STANDING_SKILL daejin 18 4 %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR STANDING_SKILL cheongeun 19 4 : +%.0f 7+(40 + 0.2*str + 0.4*con)*k : -%.0f 1 + 9*SkillPoint +19 WARRIOR STANDING_SKILL cheongeun 19 4 : +%.0f 7+(40 + 0.2*str + 0.4*con)*k : -%.0f -(0.375*SkillPoint) 2 WARRIOR . ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 : %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR . ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k %.0f%% (100+k*1000/6)/10 3 WARRIOR . STANDING_SKILL jeongwi 3 4 : +%.0f%% 50 * SkillPoint : +%.0f%% 20 * SkillPoint diff --git a/assets/locale_tr/locale/tr/skilldesc.txt b/assets/locale_tr/locale/tr/skilldesc.txt index eb30b15a..1273e729 100644 --- a/assets/locale_tr/locale/tr/skilldesc.txt +++ b/assets/locale_tr/locale/tr/skilldesc.txt @@ -30,7 +30,7 @@ 16 WARRIOR Ruh Vuruu ok Dalgas Tsunami-saldrs Dmana dorudan saldr. nden Srama Saldrs ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Saldr Gc %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*G + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*G + CON)*SkillPoint 17 WARRIOR iddetli Vuru Kaplan vuruu Ejderha Vuruu Dmana dorudan saldr. Gl Srama Saldrs oklu Hedefe Saldr ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Saldr Gc %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*G + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*G + 3*CON)*SkillPoint 18 WARRIOR Gl Vuru Aslan Vuruu Rhino Vuruu Birden ok dman uzaklatran vuru. Gl Srama Saldrs Baylma olasl ATTACK_SKILL|STANDING_SKILL daejin 18 4 Saldr Gc %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Baylma ans: %.0f%% (100 + 1000*SkillPoint/6)/10 -19 WARRIOR Gl Beden Demir Beden elik Beden Savunmay arttrr ve kazanrsnz. Savunmay arttrr Hareket Hzn Drr Asla dmez. STANDING_SKILL cheongeun 19 4 Savunma : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Hareket Hz : -%.0f 1 + 9*SkillPoint +19 WARRIOR Gl Beden Demir Beden elik Beden Savunmay arttrr ve kazanrsnz. Savunmay arttrr Hareket Hzn Drr Asla dmez. STANDING_SKILL cheongeun 19 4 Savunma : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Hareket Hz : -%.0f -(0.375*SkillPoint) 2 WARRIOR Kl evirme Kl Dans Siklon Klc evirerek birden ok dmana saldrma. nden Srama Saldrs oklu Hedefe Saldr ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Saldr gc %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 20 WARRIOR Kl Darbesi Kl Yldrm Kl Frlatmak Dmana Dorudan Saldr. Uzun Menzilli Saldr oklu Hedefe Saldr Baylma Hedefi indirir ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Saldr Gc %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Baylma ans: %.0f%% (100+k*1000/6)/10 3 WARRIOR fke Korkun fke lgnlk Sadece Saldrya konsantre olmak. Saldr Hzn Arttrr Hareket Hzn Arttrr Alnan zarar artrr STANDING_SKILL jeongwi 3 4 Saldr Hz +%.0f%% 50 * SkillPoint Hareket Hz +%.0f%% 20 * SkillPoint diff --git a/assets/root/game.py b/assets/root/game.py index 3693febc..895f6ae3 100644 --- a/assets/root/game.py +++ b/assets/root/game.py @@ -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Ű�� ���� �� �켱������ DropQuestionDialog�� ������ �������. ������ ó���� itemDropQuestionDialog�� ����Ǿ� ���� �ʾ� ERROR�� �߻��Ͽ� init���� ����� ���ÿ� �ʱ�ȭ ��Ŵ. self.itemDropQuestionDialog = None self.__SetQuickSlotMode() @@ -226,7 +226,7 @@ class GameWindow(ui.ScriptWindow): exception.Abort("GameWindow.Open") # END_OF_START_GAME_ERROR_EXIT - # NPC ťý ִ ۵ ij + # NPC�� ť��ý������� ���� �� �ִ� �����۵��� ����� ij�� # 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 �� ������ �ִ� ���� ��� ����Ǵ� Ű�̴�. - ## Ű Կ ̿ȴ.( ڵ鵵 Կ ) - ## F12 Ŭ ׿ Ű̹Ƿ ʴ . + ## ���� ����Ű �����Կ� �̿�ȴ�.(���� ���ڵ鵵 �� ���Կ� ����) + ## F12 �� Ŭ�� ����׿� Ű�̹Ƿ� ���� �ʴ� �� ����. 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 ̵Ű + #ij���� �̵�Ű 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) - # Ʈ ׸ + # ������Ʈ �׸��� ���� self.ObjectNum = ui.TextLine() self.ObjectNum.SetFontName(localeInfo.UI_DEF_FONT) self.ObjectNum.SetPosition(wndMgr.GetScreenWidth() - 270, 120) - # þ߰Ÿ + # �þ߰Ÿ� self.ViewDistance = ui.TextLine() self.ViewDistance.SetFontName(localeInfo.UI_DEF_FONT) self.ViewDistance.SetPosition(0, 0) @@ -1016,6 +1016,9 @@ class GameWindow(ui.ScriptWindow): messengerAddFriendQuestion.SetText2(localeInfo.MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND_2) messengerAddFriendQuestion.SetAcceptEvent(ui.__mem_func__(self.OnAcceptAddFriend)) messengerAddFriendQuestion.SetCancelEvent(ui.__mem_func__(self.OnDenyAddFriend)) + + messengerAddFriendQuestion.OnPressEscapeKey = ui.__mem_func__(self.OnDenyAddFriend) # ESC �� deny + messengerAddFriendQuestion.Open() messengerAddFriendQuestion.name = name self.messengerAddFriendQuestion = messengerAddFriendQuestion @@ -1309,7 +1312,7 @@ class GameWindow(ui.ScriptWindow): self.__DropMoney(attachedType, attachedMoney) def __DropMoney(self, attachedType, attachedMoney): - # PRIVATESHOP_DISABLE_ITEM_DROP - λ ִ + # PRIVATESHOP_DISABLE_ITEM_DROP - ���λ��� ���� �ִ� ���� ������ ���� ���� if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) return @@ -1331,7 +1334,7 @@ class GameWindow(ui.ScriptWindow): self.itemDropQuestionDialog = itemDropQuestionDialog def __DropItem(self, attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount): - # PRIVATESHOP_DISABLE_ITEM_DROP - λ ִ + # PRIVATESHOP_DISABLE_ITEM_DROP - ���λ��� ���� �ִ� ���� ������ ���� ���� if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) return @@ -1463,7 +1466,7 @@ class GameWindow(ui.ScriptWindow): def UpdateDebugInfo(self): # - # ij ǥ FPS + # ij���� ��ǥ �� FPS ��� (x, y, z) = player.GetMainCharacterPosition() nUpdateTime = app.GetUpdateTime() nUpdateFPS = app.GetUpdateFPS() @@ -1626,22 +1629,22 @@ class GameWindow(ui.ScriptWindow): def BINARY_Cube_Close(self): self.interface.CloseCubeWindow() - # ۿ ʿ , Ǵ ϼǰ VNUM update + # ���ۿ� �ʿ��� ���, ����Ǵ� �ϼ�ǰ�� VNUM�� ���� ���� update def BINARY_Cube_UpdateInfo(self, gold, itemVnum, count): self.interface.UpdateCubeInfo(gold, itemVnum, count) def BINARY_Cube_Succeed(self, itemVnum, count): - print "ť " + print "ť�� ���� ����" self.interface.SucceedCubeWork(itemVnum, count) pass def BINARY_Cube_Failed(self): - print "ť " + print "ť�� ���� ����" 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 �̷������� "/" ���ڷ� ���е� ����Ʈ�� �� #print listText if npcVNUM == 0: @@ -1742,7 +1745,7 @@ class GameWindow(ui.ScriptWindow): # END_OF_CUBE - # ȥ + # ��ȥ�� def BINARY_Highlight_Item(self, inven_type, inven_pos): self.interface.Highligt_Item(inven_type, inven_pos) @@ -2180,4 +2183,6 @@ class GameWindow(ui.ScriptWindow): # END_OF_WEDDING + def SkillClearCoolTime(self, slotIndex): + self.interface.SkillClearCoolTime(slotIndex) diff --git a/assets/root/interfacemodule.py b/assets/root/interfacemodule.py index 64b13d0a..73b3c8ad 100644 --- a/assets/root/interfacemodule.py +++ b/assets/root/interfacemodule.py @@ -305,10 +305,14 @@ class Interface(object): self.whisperDialogDict = {} self.privateShopAdvertisementBoardDict = {} + self.wndMessenger.InitializeHandler() + self.wndInventory.SetItemToolTip(self.tooltipItem) + if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.SetItemToolTip(self.tooltipItem) self.wndDragonSoulRefine.SetItemToolTip(self.tooltipItem) + self.wndSafebox.SetItemToolTip(self.tooltipItem) self.wndCube.SetItemToolTip(self.tooltipItem) self.wndCubeResult.SetItemToolTip(self.tooltipItem) @@ -535,6 +539,10 @@ class Interface(object): def OnChangeCurrentSkill(self, skillSlotNumber): self.wndTaskBar.OnChangeCurrentSkill(skillSlotNumber) + def SkillClearCoolTime(self, slotIndex): + self.wndCharacter.SkillClearCoolTime(slotIndex) + self.wndTaskBar.SkillClearCoolTime(slotIndex) + def SelectMouseButtonEvent(self, dir, event): self.wndTaskBar.SelectMouseButtonEvent(dir, event) @@ -564,7 +572,7 @@ class Interface(object): if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.RefreshItemSlot() - def RefreshCharacter(self): ## Character , Inventory ׸ Refresh + def RefreshCharacter(self): ## Character �������� ��, Inventory �������� ���� �׸� ���� Refresh self.wndCharacter.RefreshCharacter() self.wndTaskBar.RefreshQuickSlot() @@ -696,7 +704,7 @@ class Interface(object): def RemovePartyMember(self, pid): self.wndParty.RemovePartyMember(pid) - ##!! 20061026.levites.Ʈ_ġ_ + ##!! 20061026.levites.����Ʈ_��ġ_���� self.__ArrangeQuestButton() def LinkPartyMember(self, pid, vid): @@ -711,7 +719,7 @@ class Interface(object): def ExitParty(self): self.wndParty.ExitParty() - ##!! 20061026.levites.Ʈ_ġ_ + ##!! 20061026.levites.����Ʈ_��ġ_���� self.__ArrangeQuestButton() def PartyHealReady(self): @@ -874,7 +882,7 @@ class Interface(object): if True == self.wndChat.IsEditMode(): self.wndChat.CloseChat() else: - # ä Է ȵ + # ���������� ���������� ä�� �Է��� �ȵ� if self.wndWeb and self.wndWeb.IsShow(): pass else: @@ -975,7 +983,7 @@ class Interface(object): else: self.wndExpandedTaskBar.Close() - # ȥ + # ��ȥ�� def DragonSoulActivate(self, deck): if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.ActivateDragonSoulByExtern(deck) @@ -1046,7 +1054,7 @@ class Interface(object): if True == self.wndDragonSoulRefine.IsShow(): self.wndDragonSoulRefine.Close() - # ȥ + # ��ȥ�� �� def ToggleGuildWindow(self): if not self.wndGuild.IsShow(): @@ -1096,7 +1104,7 @@ class Interface(object): def OpenWebWindow(self, url): self.wndWeb.Open(url) - # ä ݴ´ + # ���������� ���� ä���� �ݴ´� self.wndChat.CloseChat() # show GIFT @@ -1124,9 +1132,9 @@ class Interface(object): def SucceedCubeWork(self, itemVnum, count): self.wndCube.Clear() - print "ť ! [%d:%d]" % (itemVnum, count) + print "ť�� ���� ����! [%d:%d]" % (itemVnum, count) - if 0: # ޽ Ѵ + if 0: # ��� �޽��� ����� ���� �Ѵ� self.wndCubeResult.SetPosition(*self.wndCube.GetGlobalPosition()) self.wndCubeResult.SetCubeResultItem(itemVnum, count) self.wndCubeResult.Open() @@ -1289,7 +1297,7 @@ class Interface(object): btn = uiWhisper.WhisperButton() # QUEST_LETTER_IMAGE - ##!! 20061026.levites.Ʈ_̹_ü + ##!! 20061026.levites.����Ʈ_�̹���_��ü import item if "item"==iconType: item.SelectItem(int(iconName)) @@ -1336,7 +1344,7 @@ class Interface(object): screenWidth = wndMgr.GetScreenWidth() screenHeight = wndMgr.GetScreenHeight() - ##!! 20061026.levites.Ʈ_ġ_ + ##!! 20061026.levites.����Ʈ_��ġ_���� if self.wndParty.IsShow(): xPos = 100 + 30 else: @@ -1390,8 +1398,8 @@ class Interface(object): def __InitWhisper(self): chat.InitWhisper(self) - ## äâ "޽ " ̸ ȭâ Լ - ## ̸ WhisperDialogDict ȴ. + ## ä��â�� "�޽��� ������"�� �������� �̸� ���� ��ȭâ�� ���� �Լ� + ## �̸��� ���� ������ ������ WhisperDialogDict �� ������ �����ȴ�. def OpenWhisperDialogWithoutTarget(self): if not self.dlgWhisperWithoutTarget: dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog) @@ -1408,7 +1416,7 @@ class Interface(object): self.dlgWhisperWithoutTarget.SetTop() self.dlgWhisperWithoutTarget.OpenWithoutTarget(self.RegisterTemporaryWhisperDialog) - ## ̸ ȭâ ̸ WhisperDialogDict â ־ִ Լ + ## �̸� ���� ��ȭâ���� �̸��� ���������� WhisperDialogDict�� â�� �־��ִ� �Լ� def RegisterTemporaryWhisperDialog(self, name): if not self.dlgWhisperWithoutTarget: return @@ -1427,7 +1435,7 @@ class Interface(object): self.dlgWhisperWithoutTarget = None self.__CheckGameMaster(name) - ## ij ޴ 1:1 ȭ ϱ⸦ ̸ ٷ â Լ + ## ij���� �޴��� 1:1 ��ȭ �ϱ⸦ �������� �̸��� ������ �ٷ� â�� ���� �Լ� def OpenWhisperDialog(self, name): if not self.whisperDialogDict.has_key(name): dlg = self.__MakeWhisperDialog(name) @@ -1440,7 +1448,7 @@ class Interface(object): if 0 != btn: self.__DestroyWhisperButton(btn) - ## ٸ ijͷκ ޼ ޾ ϴ ư δ Լ + ## �ٸ� ij���ͷκ��� �޼����� �޾����� �ϴ� ��ư�� ��� �δ� �Լ� def RecvWhisper(self, name): if not self.whisperDialogDict.has_key(name): btn = self.__FindWhisperButton(name) @@ -1459,7 +1467,7 @@ class Interface(object): def MakeWhisperButton(self, name): self.__MakeWhisperButton(name) - ## ư â Լ + ## ��ư�� �������� â�� ���� �Լ� def ShowWhisperDialog(self, btn): try: self.__MakeWhisperDialog(btn.name) @@ -1471,11 +1479,11 @@ class Interface(object): import dbg dbg.TraceError("interface.ShowWhisperDialog - Failed to find key") - ## ư ʱȭ + ## ��ư �ʱ�ȭ self.__DestroyWhisperButton(btn) - ## WhisperDialog â ּȭ ȣǴ Լ - ## â ּȭ մϴ. + ## WhisperDialog â���� �ּ�ȭ ������ ���������� ȣ��Ǵ� �Լ� + ## â�� �ּ�ȭ �մϴ�. def MinimizeWhisperDialog(self, name): if 0 != name: @@ -1483,8 +1491,8 @@ class Interface(object): self.CloseWhisperDialog(name) - ## WhisperDialog â ݱ ȣǴ Լ - ## â ϴ. + ## WhisperDialog â���� �ݱ� ������ ���������� ȣ��Ǵ� �Լ� + ## â�� ����ϴ�. def CloseWhisperDialog(self, name): if 0 == name: @@ -1503,7 +1511,7 @@ class Interface(object): import dbg dbg.TraceError("interface.CloseWhisperDialog - Failed to find key") - ## ư ٲ ư ϴ Լ + ## ��ư�� ������ �ٲ������ ��ư�� ������ �ϴ� �Լ� def __ArrangeWhisperButton(self): screenWidth = wndMgr.GetScreenWidth() @@ -1520,9 +1528,9 @@ class Interface(object): button.SetPosition(xPos + (int(count/yCount) * -50), yPos + (count%yCount * 63)) count += 1 - ## ̸ Whisper ư ã ִ Լ - ## ư ųʸ ʴ Ǿ - ## ̷ ToolTip ٸ ư鿡 ̴. + ## �̸����� Whisper ��ư�� ã�� ������ �ִ� �Լ� + ## ��ư�� ��ųʸ��� ���� �ʴ� ���� ���� �Ǿ� ���� ������ ���� ���� ������ + ## �̷� ���� ToolTip���� �ٸ� ��ư�鿡 ���� �������� �����̴�. def __FindWhisperButton(self, name): for button in self.whisperButtonList: if button.name == name: @@ -1530,7 +1538,7 @@ class Interface(object): return 0 - ## â ϴ. + ## â�� ����ϴ�. def __MakeWhisperDialog(self, name): dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog) dlgWhisper.BindInterface(self) @@ -1542,7 +1550,7 @@ class Interface(object): return dlgWhisper - ## ư ϴ. + ## ��ư�� ����ϴ�. def __MakeWhisperButton(self, name): whisperButton = uiWhisper.WhisperButton() whisperButton.SetUpVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") diff --git a/assets/root/playersettingmodule.py b/assets/root/playersettingmodule.py index 1a39a85e..2013614a 100644 --- a/assets/root/playersettingmodule.py +++ b/assets/root/playersettingmodule.py @@ -105,30 +105,40 @@ def DefineSkillIndexDict(): }, } -def RegisterSkill(race, group, empire=0): - +def RegisterSkill(race, group, empire = 0): DefineSkillIndexDict() job = chr.RaceToJob(race) + # Ensure group 0 exists (horse-only) when cooldown fix is on + if not SKILL_INDEX_DICT[job].has_key(0): + # Assassin has 140 as well; others only 137-139 + SKILL_INDEX_DICT[job][0] = (0, 0, 0, 0, 0, 0, 0, 0, + 137, 0, 138, 0, 139, 0) + ((140,) if job == JOB_ASSASSIN else ()) + + ## Support Skills (Always register regardless of skill group) + if SKILL_INDEX_DICT.has_key(job): + supportSkillList = SKILL_INDEX_DICT[job].get("SUPPORT", ()) + + for i in xrange(len(supportSkillList)): + player.SetSkill(i + 100 + 1, supportSkillList[i]) + ## Character Skill if SKILL_INDEX_DICT.has_key(job): - if SKILL_INDEX_DICT[job].has_key(group): - activeSkillList = SKILL_INDEX_DICT[job][group] for i in xrange(len(activeSkillList)): skillIndex = activeSkillList[i] - ## 7 8 ų ⼭ ϸ ȵ + ## 7�� 8�� ��ų�� ���⼭ �����ϸ� �ȵ� if i != 6 and i != 7: - player.SetSkill(i+1, skillIndex) + player.SetSkill(i + 1, skillIndex) supportSkillList = SKILL_INDEX_DICT[job]["SUPPORT"] for i in xrange(len(supportSkillList)): - player.SetSkill(i+100+1, supportSkillList[i]) + player.SetSkill(i + 100 + 1, supportSkillList[i]) ## Language Skill if 0 != empire: @@ -211,20 +221,20 @@ def __InitData(): chrmgr.RegisterCacheEffect(chrmgr.EFFECT_SPEEDUP_GREEN, "", "d:/ymir work/effect/etc/recuperation/drugup_green.mse") chrmgr.RegisterCacheEffect(chrmgr.EFFECT_DXUP_PURPLE, "", "d:/ymir work/effect/etc/recuperation/drugup_purple.mse") - #ڵ HP, SP + #�ڵ����� HP, SP chrmgr.RegisterCacheEffect(chrmgr.EFFECT_AUTO_HPUP, "", "d:/ymir work/effect/etc/recuperation/autodrugup_red.mse") chrmgr.RegisterCacheEffect(chrmgr.EFFECT_AUTO_SPUP, "", "d:/ymir work/effect/etc/recuperation/autodrugup_blue.mse") - #󸶴 ʽ´ (71135) ߵ Ʈ + #�󸶴� �ʽ´��� ����(71135) ������� �ߵ� ����Ʈ chrmgr.RegisterCacheEffect(chrmgr.EFFECT_RAMADAN_RING_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item1.mse") - #ҷ ߵ Ʈ + #�ҷ��� ���� ������� �ߵ� ����Ʈ chrmgr.RegisterCacheEffect(chrmgr.EFFECT_HALLOWEEN_CANDY_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item2.mse") - #ູ ߵ Ʈ + #�ູ�� ���� ������� �ߵ� ����Ʈ chrmgr.RegisterCacheEffect(chrmgr.EFFECT_HAPPINESS_RING_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item3.mse") - # ҴƮ ߵ Ʈ + #����� �Ҵ�Ʈ ������� �ߵ� ����Ʈ chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LOVE_PENDANT_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item4.mse") chrmgr.RegisterCacheEffect(chrmgr.EFFECT_PENETRATE, "Bip01", "d:/ymir work/effect/hit/gwantong.mse") @@ -251,8 +261,8 @@ def __InitData(): #chrmgr.RegisterCacheEffect(chrmgr.EFFECT_SUCCESS, "", "season1/effect/success.mse") #chrmgr.RegisterCacheEffect(chrmgr.EFFECT_FAIL, "", "season1/effect/fail.mse") - chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_ON_14_FOR_GERMANY, "","season1/effect/paymessage_warning.mse") # 14϶ ( ) - chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_UNDER_15_FOR_GERMANY, "", "season1/effect/paymessage_decide.mse" )# 15϶ ( ) + chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_ON_14_FOR_GERMANY, "","season1/effect/paymessage_warning.mse") #������ 14�϶� ( �������� ) + chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_UNDER_15_FOR_GERMANY, "", "season1/effect/paymessage_decide.mse" )#������ 15�϶� ( �������� ) chrmgr.RegisterCacheEffect(chrmgr.EFFECT_PERCENT_DAMAGE1, "", "d:/ymir work/effect/hit/percent_damage1.mse") chrmgr.RegisterCacheEffect(chrmgr.EFFECT_PERCENT_DAMAGE2, "", "d:/ymir work/effect/hit/percent_damage2.mse") @@ -361,28 +371,28 @@ def __LoadGameEffect(): chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+0, "Bip01", localeInfo.FN_GM_MARK) # END_OF_LOCALE - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+3, "Bip01", "d:/ymir work/effect/hit/blow_poison/poison_loop.mse") ## ߵ + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+3, "Bip01", "d:/ymir work/effect/hit/blow_poison/poison_loop.mse") ## �ߵ� chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+4, "", "d:/ymir work/effect/affect/slow.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+5, "Bip01 Head", "d:/ymir work/effect/etc/stun/stun_loop.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+6, "", "d:/ymir work/effect/etc/ready/ready.mse") #chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+8, "", "d:/ymir work/guild/effect/10_construction.mse") #chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+9, "", "d:/ymir work/guild/effect/20_construction.mse") #chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+10, "", "d:/ymir work/guild/effect/20_upgrade.mse") - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+16, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse") ## õ (ؿ ֵ-_-) - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+17, "", "d:/ymir work/pc/assassin/effect/gyeonggong_loop.mse") ## ڰ - + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+16, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse") ## õ���� (�ؿ��� �ֵ�-_-) + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+17, "", "d:/ymir work/pc/assassin/effect/gyeonggong_loop.mse") ## �ڰ� - ��� chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+19, "Bip01 R Finger2", "d:/ymir work/pc/sura/effect/gwigeom_loop.mse") - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+20, "", "d:/ymir work/pc/sura/effect/fear_loop.mse") ## - - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+21, "", "d:/ymir work/pc/sura/effect/jumagap_loop.mse") ## - ָ - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+22, "", "d:/ymir work/pc/shaman/effect/3hosin_loop.mse") ## - ȣ - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+23, "", "d:/ymir work/pc/shaman/effect/boho_loop.mse") ## - ȣ - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+24, "", "d:/ymir work/pc/shaman/effect/10kwaesok_loop.mse") ## - + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+20, "", "d:/ymir work/pc/sura/effect/fear_loop.mse") ## ���� - ���� + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+21, "", "d:/ymir work/pc/sura/effect/jumagap_loop.mse") ## ���� - �ָ��� + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+22, "", "d:/ymir work/pc/shaman/effect/3hosin_loop.mse") ## ���� - ȣ�� + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+23, "", "d:/ymir work/pc/shaman/effect/boho_loop.mse") ## ���� - ��ȣ + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+24, "", "d:/ymir work/pc/shaman/effect/10kwaesok_loop.mse") ## ���� - ��� chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+25, "", "d:/ymir work/pc/sura/effect/heuksin_loop.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+26, "", "d:/ymir work/pc/sura/effect/muyeong_loop.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+28, "Bip01", "d:/ymir work/effect/hit/blow_flame/flame_loop.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+29, "Bip01 R Hand", "d:/ymir work/pc/shaman/effect/6gicheon_hand.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+30, "Bip01 L Hand", "d:/ymir work/pc/shaman/effect/jeungryeok_hand.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+32, "Bip01 Head", "d:/ymir work/pc/sura/effect/pabeop_loop.mse") - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+33, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse") ## õ (Fallen) + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+33, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse") ## õ���� (Fallen) ## 34 Polymoph chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+35, "", "d:/ymir work/effect/etc/guild_war_flag/flag_red.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+36, "", "d:/ymir work/effect/etc/guild_war_flag/flag_blue.mse") @@ -416,53 +426,53 @@ def __LoadGameEffect(): chrmgr.RegisterEffect(chrmgr.EFFECT_REFINED+20, "Bip01", "D:/ymir work/pc/common/effect/armor/armor-4-2-2.mse") ## FlyData - effect.RegisterIndexedFlyData(effect.FLY_EXP, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_yellow_small2.msf") ## (EXP) - effect.RegisterIndexedFlyData(effect.FLY_HP_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_small.msf") ## (HP) - effect.RegisterIndexedFlyData(effect.FLY_HP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_big.msf") ## (HP) ū - effect.RegisterIndexedFlyData(effect.FLY_SP_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_warrior_small.msf") ## Ķ ִ° - effect.RegisterIndexedFlyData(effect.FLY_SP_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_small.msf") ## Ķ - effect.RegisterIndexedFlyData(effect.FLY_SP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_big.msf") ## Ķ ū - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK1, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_1.msf") ## 1 - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK2, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_2.msf") ## 2 - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK3, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_3.msf") ## 3 - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK4, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_4.msf") ## 4 - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK5, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_5.msf") ## 5 - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK6, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_6.msf") ## 6 - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK_XMAS, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_xmas.msf") ## X-Mas - effect.RegisterIndexedFlyData(effect.FLY_CHAIN_LIGHTNING, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/pc/shaman/effect/pokroe.msf") ## ڰ - effect.RegisterIndexedFlyData(effect.FLY_HP_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_smallest.msf") ## ſ - effect.RegisterIndexedFlyData(effect.FLY_SKILL_MUYEONG, effect.INDEX_FLY_TYPE_AUTO_FIRE, "d:/ymir work/pc/sura/effect/muyeong_fly.msf") ## + effect.RegisterIndexedFlyData(effect.FLY_EXP, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_yellow_small2.msf") ## ����� (EXP) + effect.RegisterIndexedFlyData(effect.FLY_HP_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_small.msf") ## ������ (HP) ������ + effect.RegisterIndexedFlyData(effect.FLY_HP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_big.msf") ## ������ (HP) ū�� + effect.RegisterIndexedFlyData(effect.FLY_SP_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_warrior_small.msf") ## �Ķ��� ������ �ִ°� + effect.RegisterIndexedFlyData(effect.FLY_SP_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_small.msf") ## �Ķ��� ������ + effect.RegisterIndexedFlyData(effect.FLY_SP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_big.msf") ## �Ķ��� ū�� + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK1, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_1.msf") ## ���� 1 + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK2, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_2.msf") ## ���� 2 + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK3, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_3.msf") ## ���� 3 + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK4, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_4.msf") ## ���� 4 + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK5, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_5.msf") ## ���� 5 + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK6, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_6.msf") ## ���� 6 + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK_XMAS, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_xmas.msf") ## ���� X-Mas + effect.RegisterIndexedFlyData(effect.FLY_CHAIN_LIGHTNING, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/pc/shaman/effect/pokroe.msf") ## ���ڰ� + effect.RegisterIndexedFlyData(effect.FLY_HP_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_smallest.msf") ## ������ �ſ� ������ + effect.RegisterIndexedFlyData(effect.FLY_SKILL_MUYEONG, effect.INDEX_FLY_TYPE_AUTO_FIRE, "d:/ymir work/pc/sura/effect/muyeong_fly.msf") ## ������ ######################################################################################### ## Emoticon EmoticonStr = "d:/ymir work/effect/etc/emoticon/" chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+0, "", EmoticonStr+"sweat.mse") - net.RegisterEmoticonString("(Ȳ)") + net.RegisterEmoticonString("(Ȳ��)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+1, "", EmoticonStr+"money.mse") - net.RegisterEmoticonString("()") + net.RegisterEmoticonString("(��)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+2, "", EmoticonStr+"happy.mse") - net.RegisterEmoticonString("()") + net.RegisterEmoticonString("(���)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+3, "", EmoticonStr+"love_s.mse") - net.RegisterEmoticonString("()") + net.RegisterEmoticonString("(����)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+4, "", EmoticonStr+"love_l.mse") - net.RegisterEmoticonString("()") + net.RegisterEmoticonString("(���)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+5, "", EmoticonStr+"angry.mse") - net.RegisterEmoticonString("(г)") + net.RegisterEmoticonString("(�г�)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+6, "", EmoticonStr+"aha.mse") - net.RegisterEmoticonString("()") + net.RegisterEmoticonString("(����)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+7, "", EmoticonStr+"gloom.mse") - net.RegisterEmoticonString("()") + net.RegisterEmoticonString("(���)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+8, "", EmoticonStr+"sorry.mse") - net.RegisterEmoticonString("(˼)") + net.RegisterEmoticonString("(�˼�)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+9, "", EmoticonStr+"!_mix_back.mse") net.RegisterEmoticonString("(!)") @@ -1128,7 +1138,7 @@ def __LoadGameShamanEx(race, path): #chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_GENERAL, chr.MOTION_SKILL+10, "budong.msa") START_INDEX = 0 - #skill.SKILL_EFFECT_COUNT // + #skill.SKILL_EFFECT_COUNT ����// for i in (1, 2, 3): END_STRING = "" if i != 0: END_STRING = "_%d" % (i+1) @@ -1335,7 +1345,7 @@ def LoadGuildBuildingList(filename): elif itemID == uiGuild.MATERIAL_PLYWOOD_ID: materialList[uiGuild.MATERIAL_PLYWOOD_INDEX] = count - ## GuildSymbol Ϲ NPC Բ Ѵ. + ## GuildSymbol �� �Ϲ� NPC ��� �Բ� ����Ѵ�. import chrmgr chrmgr.RegisterRaceSrcName(name, folderName) chrmgr.RegisterRaceName(vnum, name) diff --git a/assets/root/serverinfo.py b/assets/root/serverinfo.py index 1126516b..3f314e0a 100644 --- a/assets/root/serverinfo.py +++ b/assets/root/serverinfo.py @@ -1,6 +1,6 @@ SERVER_NAME = "Metin2" SERVER_NAME_TEST = "Test" -SERVER_IP = "10.246.140.76" +SERVER_IP = "10.122.201.77" SERVER_IP_TEST = "127.0.0.1" CH1_NAME = "CH1" CH2_NAME = "CH2" diff --git a/assets/root/ui.py b/assets/root/ui.py index d4732156..915631c5 100644 --- a/assets/root/ui.py +++ b/assets/root/ui.py @@ -885,7 +885,7 @@ class ExpandedImageBox(ImageBox): def SetRenderingMode(self, mode): wndMgr.SetRenderingMode(self.hWnd, mode) - # [0.0, 1.0] ŭ ۼƮ ׸ ʴ´. + # [0.0, 1.0] ������ ����ŭ �ۼ�Ʈ�� �׸��� �ʴ´�. def SetRenderingRect(self, left, top, right, bottom): wndMgr.SetRenderingRect(self.hWnd, left, top, right, bottom) @@ -1374,17 +1374,29 @@ class SlotWindow(Window): return wndMgr.GetSlotCount(self.hWnd) def SetUseMode(self, flag): - "True϶ ItemToItem ش" + "True�϶��� ItemToItem �� �������� �����ش�" wndMgr.SetUseMode(self.hWnd, flag) def SetUsableItem(self, flag): - "True Ų ItemToItem ϴ" + "True�� ���� ����Ų �������� ItemToItem ���� �����ϴ�" wndMgr.SetUsableItem(self.hWnd, flag) ## Slot def SetSlotCoolTime(self, slotIndex, coolTime, elapsedTime = 0.0): wndMgr.SetSlotCoolTime(self.hWnd, slotIndex, coolTime, elapsedTime) + def StoreSlotCoolTime(self, key, slotIndex, coolTime, elapsedTime = 0.0): + wndMgr.StoreSlotCoolTime(self.hWnd, key, slotIndex, coolTime, elapsedTime) + + def RestoreSlotCoolTime(self, key): + wndMgr.RestoreSlotCoolTime(self.hWnd, key) + + def TransferSlotCoolTime(self, slotIndex1, slotIndex2): + wndMgr.TransferSlotCoolTime(self.hWnd, slotIndex1, slotIndex2) + + def ClearSlotCoolTime(self, slotIndex): + wndMgr.ClearSlotCoolTime(self.hWnd, slotIndex) + def DisableSlot(self, slotIndex): wndMgr.DisableSlot(self.hWnd, slotIndex) @@ -1536,7 +1548,7 @@ class TitleBar(Window): def MakeTitleBar(self, width, color): - ## Color ϰ + ## ���� Color�� ����ϰ� ���� ���� width = max(64, width) @@ -2767,8 +2779,8 @@ class PythonScriptLoader(object): print "===== Load Script File : %s" % (FileName) try: - # chr, player sandbox import ʱ ,( ǿ ſ ŭ.) - # ̸ script dictionary ʿ ־´. + # chr, player ���� sandbox ������ import�� ������ �ʱ� ������,(���� �ǿ��� ������ �ſ� ŭ.) + # �̸� script dictionary�� �ʿ��� ����� �־���´�. import chr import player import app diff --git a/assets/root/uicharacter.py b/assets/root/uicharacter.py index 0e6b92c8..d3a771cc 100644 --- a/assets/root/uicharacter.py +++ b/assets/root/uicharacter.py @@ -50,7 +50,11 @@ class CharacterWindow(ui.ScriptWindow): SUPPORT_PAGE_SLOT_COUNT = 12 PAGE_SLOT_COUNT = 12 - PAGE_HORSE = 2 + + if app.FIX_HORSE_SKILLS_TAB: + PAGE_HORSE = 3 + else: + PAGE_HORSE = 2 SKILL_GROUP_NAME_DICT = { playerSettingModule.JOB_WARRIOR : { 1 : localeInfo.SKILL_GROUP_WARRIOR_1, 2 : localeInfo.SKILL_GROUP_WARRIOR_2, }, @@ -131,6 +135,10 @@ class CharacterWindow(ui.ScriptWindow): self.supportSkillPointValue = None self.skillGroupButton1 = None self.skillGroupButton2 = None + + if app.FIX_HORSE_SKILLS_TAB: + self.skillGroupButton3 = None + self.activeSkillGroupName = None self.guildNameSlot = None @@ -178,6 +186,10 @@ class CharacterWindow(ui.ScriptWindow): self.supportSkillPointValue = self.GetChild("Support_Skill_Point_Value") self.skillGroupButton1 = self.GetChild("Skill_Group_Button_1") self.skillGroupButton2 = self.GetChild("Skill_Group_Button_2") + + if app.FIX_HORSE_SKILLS_TAB: + self.skillGroupButton3 = self.GetChild("Skill_Group_Button_3") + self.activeSkillGroupName = self.GetChild("Active_Skill_Group_Name") self.tabDict = { @@ -237,11 +249,12 @@ class CharacterWindow(ui.ScriptWindow): self.skillGroupButton = ( self.GetChild("Skill_Group_Button_1"), self.GetChild("Skill_Group_Button_2"), - ) + ) + ((self.GetChild("Skill_Group_Button_3"),) if app.FIX_HORSE_SKILLS_TAB else ()) global SHOW_ONLY_ACTIVE_SKILL global HIDE_SUPPORT_SKILL_POINT + if SHOW_ONLY_ACTIVE_SKILL or HIDE_SUPPORT_SKILL_POINT: self.GetChild("Support_Skill_Point_Label").Hide() @@ -253,6 +266,7 @@ class CharacterWindow(ui.ScriptWindow): self.questScrollBar = self.GetChild("Quest_ScrollBar") self.questScrollBar.SetScrollEvent(ui.__mem_func__(self.OnQuestScroll)) self.questSlot = self.GetChild("Quest_Slot") + for i in xrange(quest.QUEST_MAX_NUM): self.questSlot.HideSlotBaseImage(i) self.questSlot.SetCoverButton(i,\ @@ -264,6 +278,7 @@ class CharacterWindow(ui.ScriptWindow): self.questNameList = [] self.questLastTimeList = [] self.questLastCountList = [] + for i in xrange(quest.QUEST_MAX_NUM): self.questNameList.append(self.GetChild("Quest_Name_0" + str(i))) self.questLastTimeList.append(self.GetChild("Quest_LastTime_0" + str(i))) @@ -284,7 +299,6 @@ class CharacterWindow(ui.ScriptWindow): "d:/ymir work/ui/game/windows/btn_plus_down.sub") def __SetEmotionSlot(self): - self.emotionToolTip = uiToolTip.ToolTip() for slot in (self.soloEmotionSlot, self.dualEmotionSlot): @@ -302,6 +316,7 @@ class CharacterWindow(ui.ScriptWindow): emotionIdx = slotIdx slot = self.soloEmotionSlot + if slotIdx > 50: slot = self.dualEmotionSlot @@ -314,16 +329,19 @@ class CharacterWindow(ui.ScriptWindow): if app.IsPressed(app.DIK_LCONTROL): player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_EMOTION, slotIndex) + return mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_EMOTION, slotIndex, slotIndex) def __ClickEmotionSlot(self, slotIndex): print "click emotion" + if not slotIndex in emotion.EMOTION_DICT: return print "check acting" + if player.IsActingEmotion(): return @@ -336,6 +354,7 @@ class CharacterWindow(ui.ScriptWindow): if 0 == vid or vid == player.GetMainCharacterIndex() or chr.IsNPC(vid) or chr.IsEnemy(vid): import chat chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.EMOTION_CHOOSE_ONE) + return command += " " + chr.GetNameByVID(vid) @@ -521,7 +540,7 @@ class CharacterWindow(ui.ScriptWindow): except: #import exception #exception.Abort("CharacterWindow.RefreshStatus.BindObject") - ## ƨ + ## ������ ƨ�� ���� pass self.__RefreshStatusPlusButtonList() @@ -595,25 +614,21 @@ class CharacterWindow(ui.ScriptWindow): statusPlusButton.Hide() def SelectSkill(self, skillSlotIndex): - mouseController = mouseModule.mouseController if False == mouseController.isAttached(): - srcSlotIndex = self.__RealSkillSlotToSourceSlot(skillSlotIndex) selectedSkillIndex = player.GetSkillIndex(srcSlotIndex) if skill.CanUseSkill(selectedSkillIndex): - if app.IsPressed(app.DIK_LCONTROL): - player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_SKILL, srcSlotIndex) + return mouseController.AttachObject(self, player.SLOT_TYPE_SKILL, srcSlotIndex, selectedSkillIndex) else: - mouseController.DeattachObject() def SelectEmptySlot(self, SlotIndex): @@ -621,7 +636,6 @@ class CharacterWindow(ui.ScriptWindow): ## ToolTip def OverInItem(self, slotNumber): - if mouseModule.mouseController.isAttached(): return @@ -728,6 +742,7 @@ class CharacterWindow(ui.ScriptWindow): def __GetStatMinusPoint(self): POINT_STAT_RESET_COUNT = 112 + return player.GetStatus(POINT_STAT_RESET_COUNT) def __OverInStatMinusButton(self, stat): @@ -761,6 +776,7 @@ class CharacterWindow(ui.ScriptWindow): def OnPressEscapeKey(self): self.Close() + return True def OnUpdate(self): @@ -771,20 +787,20 @@ class CharacterWindow(ui.ScriptWindow): global SHOW_LIMIT_SUPPORT_SKILL_LIST skillPage = self.skillPageDict[name] - startSlotIndex = skillPage.GetStartIndex() + if "ACTIVE" == name: if self.PAGE_HORSE == self.curSelectedSkillGroup: startSlotIndex += slotCount - getSkillType=skill.GetSkillType - getSkillIndex=player.GetSkillIndex - getSkillGrade=player.GetSkillGrade - getSkillLevel=player.GetSkillLevel - getSkillLevelUpPoint=skill.GetSkillLevelUpPoint - getSkillMaxLevel=skill.GetSkillMaxLevel - for i in xrange(slotCount+1): + getSkillType = skill.GetSkillType + getSkillIndex = player.GetSkillIndex + getSkillGrade = player.GetSkillGrade + getSkillLevel = player.GetSkillLevel + getSkillLevelUpPoint = skill.GetSkillLevelUpPoint + getSkillMaxLevel = skill.GetSkillMaxLevel + for i in xrange(slotCount + 1): slotIndex = i + startSlotIndex skillIndex = getSkillIndex(slotIndex) @@ -798,7 +814,7 @@ class CharacterWindow(ui.ScriptWindow): skillLevel = getSkillLevel(slotIndex) skillType = getSkillType(skillIndex) - ## ¸ ų ó + ## �¸� ��ų ���� ó�� if player.SKILL_INDEX_RIDING == skillIndex: if 1 == skillGrade: skillLevel += 19 @@ -807,48 +823,116 @@ class CharacterWindow(ui.ScriptWindow): elif 3 == skillGrade: skillLevel = 40 - skillPage.SetSkillSlotNew(slotIndex, skillIndex, max(skillLevel-1, 0), skillLevel) + skillPage.SetSkillSlotNew(slotIndex, skillIndex, max(skillLevel - 1, 0), skillLevel) skillPage.SetSlotCount(slotIndex, skillLevel) ## ACTIVE elif skill.SKILL_TYPE_ACTIVE == skillType: for j in xrange(skill.SKILL_GRADE_COUNT): realSlotIndex = self.__GetRealSkillSlot(j, slotIndex) + skillPage.SetSkillSlotNew(realSlotIndex, skillIndex, j, skillLevel) skillPage.SetCoverButton(realSlotIndex) - if (skillGrade == skill.SKILL_GRADE_COUNT) and j == (skill.SKILL_GRADE_COUNT-1): + if (skillGrade == skill.SKILL_GRADE_COUNT) and j == (skill.SKILL_GRADE_COUNT - 1): skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel) elif (not self.__CanUseSkillNow()) or (skillGrade != j): skillPage.SetSlotCount(realSlotIndex, 0) skillPage.DisableCoverButton(realSlotIndex) + + if not player.IsSkillActive(slotIndex): + skillPage.DeactivateSlot(realSlotIndex) + + if player.IsSkillCoolTime(slotIndex) and skillGrade != j: + skillPage.TransferSlotCoolTime(realSlotIndex, self.__GetRealSkillSlot(skillGrade, i)) + else: + self.SkillClearCoolTime(realSlotIndex) else: skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel) - ## ׿ + # Check if this is the active slot + # Grade 3 appears in slot 2, so check both conditions + isActiveSlot = (skillGrade == j) or ((skillGrade == skill.SKILL_GRADE_COUNT) and j == (skill.SKILL_GRADE_COUNT - 1)) + + if player.IsSkillActive(slotIndex) and isActiveSlot: + skillPage.ActivateSlot(realSlotIndex) + else: + skillPage.DeactivateSlot(realSlotIndex) else: if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST: realSlotIndex = self.__GetETCSkillRealSlotIndex(slotIndex) + skillPage.SetSkillSlot(realSlotIndex, skillIndex, skillLevel) skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel) if skill.CanUseSkill(skillIndex): skillPage.SetCoverButton(realSlotIndex) + # Clear storage for horse skills at level 0 BEFORE restore runs + if skillType == skill.SKILL_TYPE_HORSE and skillLevel == 0: + player.ResetHorseSkillCoolTime(skillIndex, realSlotIndex) + skillPage.SetSlotCoolTime(realSlotIndex, 0) + + if player.IsSkillActive(slotIndex): + skillPage.ActivateSlot(realSlotIndex) + else: + skillPage.DeactivateSlot(realSlotIndex) + skillPage.RefreshSlot() + self.__RestoreSlotCoolTime(skillPage) + + def __RestoreSlotCoolTime(self, skillPage): + restoreType = skill.SKILL_TYPE_NONE + + if self.PAGE_HORSE == self.curSelectedSkillGroup: + restoreType = skill.SKILL_TYPE_HORSE + else: + restoreType = skill.SKILL_TYPE_ACTIVE + + skillPage.RestoreSlotCoolTime(restoreType) + + def __ClearHorseSkillQuickSlots(self): + HORSE_SKILL_SET = (137, 138, 139, 140) + + quick_slot_per_page = 8 # two quick_slot windows * 4 slots + quick_page_count = 4 # matches QUICKPAGE_NUMBER_FILENAME + current_page = player.GetQuickPage() + + for page in xrange(quick_page_count): + player.SetQuickPage(page) + + for local_slot in xrange(quick_slot_per_page): + slotType, position = player.GetLocalQuickSlot(local_slot) + + if slotType != player.SLOT_TYPE_SKILL: + continue + + skillIndex = player.GetSkillIndex(position) + + if skillIndex in HORSE_SKILL_SET: + player.RequestDeleteGlobalQuickSlot(page * quick_slot_per_page + local_slot) + + player.SetQuickPage(current_page) def RefreshSkill(self): - - if self.isLoaded==0: + if self.isLoaded == 0: return if self.__IsChangedHorseRidingSkillLevel(): + if app.FIX_HORSE_SKILLS_TAB: + if not self.__CanUseHorseSkill(): + if self.curSelectedSkillGroup == self.PAGE_HORSE: + self.__SelectSkillGroup(0) # fall back to first active tab + + self.__ClearHorseSkillQuickSlots() # remove horse skills from taskbar + self.RefreshCharacter() + return - global SHOW_ONLY_ACTIVE_SKILL + if SHOW_ONLY_ACTIVE_SKILL: self.__RefreshSkillPage("ACTIVE", self.ACTIVE_PAGE_SLOT_COUNT) else: @@ -858,12 +942,11 @@ class CharacterWindow(ui.ScriptWindow): self.RefreshSkillPlusButtonList() def CanShowPlusButton(self, skillIndex, skillLevel, curStatPoint): - - ## ų + ## ��ų�� ������ if 0 == skillIndex: return False - ## Ѵٸ + ## ������ ������ �����Ѵٸ� if not skill.CanLevelUpSkill(skillIndex, skillLevel): return False @@ -871,6 +954,7 @@ class CharacterWindow(ui.ScriptWindow): def __RefreshSkillPlusButton(self, name): global HIDE_SUPPORT_SKILL_POINT + if HIDE_SUPPORT_SKILL_POINT and "SUPPORT" == name: return @@ -878,11 +962,13 @@ class CharacterWindow(ui.ScriptWindow): slotWindow.HideAllSlotButton() slotStatType = self.skillPageStatDict[name] + if 0 == slotStatType: return statPoint = player.GetStatus(slotStatType) startSlotIndex = slotWindow.GetStartIndex() + if "HORSE" == name: startSlotIndex += self.ACTIVE_PAGE_SLOT_COUNT @@ -904,7 +990,7 @@ class CharacterWindow(ui.ScriptWindow): slotWindow.ShowSlotButton(self.__GetETCSkillRealSlotIndex(slotIndex)) else: - if "SUPPORT" == name: + if "SUPPORT" == name: if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST: if self.CanShowPlusButton(skillIndex, skillLevel, statPoint): slotWindow.ShowSlotButton(slotIndex) @@ -914,7 +1000,6 @@ class CharacterWindow(ui.ScriptWindow): def RefreshSkillPlusButtonList(self): - if self.isLoaded==0: return @@ -933,6 +1018,7 @@ class CharacterWindow(ui.ScriptWindow): except: import exception + exception.Abort("CharacterWindow.RefreshSkillPlusButtonList.BindObject") def RefreshSkillPlusPointLabel(self): @@ -979,10 +1065,9 @@ class CharacterWindow(ui.ScriptWindow): mouseModule.mouseController.DeattachObject() - ## FIXME : ų ȣ ش ãƼ Ʈ Ѵ. - ## ſ ո. ü ؾ ҵ. + ## FIXME : ��ų�� ��������� ���� ��ȣ�� ������ �ش� ������ ã�Ƽ� ������Ʈ �Ѵ�. + ## �ſ� ���ո�. ���� ��ü�� �����ؾ� �ҵ�. def OnUseSkill(self, slotIndex, coolTime): - skillIndex = player.GetSkillIndex(slotIndex) skillType = skill.GetSkillType(skillIndex) @@ -996,32 +1081,69 @@ class CharacterWindow(ui.ScriptWindow): for slotWindow in self.skillPageDict.values(): if slotWindow.HasSlot(slotIndex): - slotWindow.SetSlotCoolTime(slotIndex, coolTime) + slotWindow.StoreSlotCoolTime(skillType, slotIndex, coolTime) + self.__RestoreSlotCoolTime(slotWindow) + return def OnActivateSkill(self, slotIndex): - - skillGrade = player.GetSkillGrade(slotIndex) - slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex) + skillIndex = player.GetSkillIndex(slotIndex) + skillType = skill.GetSkillType(skillIndex) + + ## ACTIVE + if skill.SKILL_TYPE_ACTIVE == skillType: + skillGrade = player.GetSkillGrade(slotIndex) + slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex) + ## ETC + else: + slotIndex = self.__GetETCSkillRealSlotIndex(slotIndex) for slotWindow in self.skillPageDict.values(): if slotWindow.HasSlot(slotIndex): slotWindow.ActivateSlot(slotIndex) + return def OnDeactivateSkill(self, slotIndex): - - skillGrade = player.GetSkillGrade(slotIndex) - slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex) + skillIndex = player.GetSkillIndex(slotIndex) + skillType = skill.GetSkillType(skillIndex) + + ## ACTIVE + if skill.SKILL_TYPE_ACTIVE == skillType: + skillGrade = player.GetSkillGrade(slotIndex) + slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex) + ## ETC + else: + slotIndex = self.__GetETCSkillRealSlotIndex(slotIndex) for slotWindow in self.skillPageDict.values(): if slotWindow.HasSlot(slotIndex): slotWindow.DeactivateSlot(slotIndex) + return def __ShowJobToolTip(self): self.toolTipJob.ShowToolTip() + def SkillClearCoolTime(self, slotIndex): + skillIndex = player.GetSkillIndex(slotIndex) + + if skillIndex < 1: + return + + skillType = skill.GetSkillType(skillIndex) + + ## ACTIVE + # Map to the correct visual slot based on skill type + if skill.SKILL_TYPE_ACTIVE == skillType: + slotIndex = self.__GetRealSkillSlot(player.GetSkillGrade(slotIndex), slotIndex) + else: + slotIndex = self.__GetETCSkillRealSlotIndex(slotIndex) + + for slotWindow in self.skillPageDict.values(): + if slotWindow.HasSlot(slotIndex): + slotWindow.SetSlotCoolTime(slotIndex, 0) + def __HideJobToolTip(self): self.toolTipJob.HideToolTip() @@ -1037,6 +1159,7 @@ class CharacterWindow(ui.ScriptWindow): jobInfoData=localeInfo.JOBINFO_DATA_LIST[mainJob][subJob] except IndexError: print "uiCharacter.CharacterWindow.__SetJobText(mainJob=%d, subJob=%d)" % (mainJob, subJob) + return self.toolTipJob.AutoAppendTextLine(jobInfoTitle) @@ -1105,18 +1228,16 @@ class CharacterWindow(ui.ScriptWindow): ## GroupName self.__SetSkillGroupName(race, group) + self.__SetSkillSlotData(race, group, empire) + ## Skill if 0 == group: self.__SelectSkillGroup(0) - else: - self.__SetSkillSlotData(race, group, empire) - if self.__CanUseHorseSkill(): self.__SelectSkillGroup(0) def __SetSkillGroupName(self, race, group): - job = chr.RaceToJob(race) if not self.SKILL_GROUP_NAME_DICT.has_key(job): @@ -1127,27 +1248,43 @@ class CharacterWindow(ui.ScriptWindow): if 0 == group: self.skillGroupButton1.SetText(nameList[1]) self.skillGroupButton2.SetText(nameList[2]) + + if app.FIX_HORSE_SKILLS_TAB: + if self.__CanUseHorseSkill(): + self.skillGroupButton3.SetText(localeInfo.SKILL_GROUP_HORSE) + self.skillGroupButton3.Show() + self.skillGroupButton3.SetPosition(95, 2) + else: + self.skillGroupButton3.Hide() + self.skillGroupButton1.Show() self.skillGroupButton2.Show() self.activeSkillGroupName.Hide() - else: - if self.__CanUseHorseSkill(): self.activeSkillGroupName.Hide() self.skillGroupButton1.SetText(nameList.get(group, "Noname")) - self.skillGroupButton2.SetText(localeInfo.SKILL_GROUP_HORSE) - self.skillGroupButton1.Show() - self.skillGroupButton2.Show() + if app.FIX_HORSE_SKILLS_TAB: + self.skillGroupButton3.SetText(localeInfo.SKILL_GROUP_HORSE) + self.skillGroupButton1.Show() + self.skillGroupButton2.Hide() + self.skillGroupButton3.Show() + self.skillGroupButton3.SetPosition(50, 2) + else: + self.skillGroupButton2.SetText(localeInfo.SKILL_GROUP_HORSE) + self.skillGroupButton1.Show() + self.skillGroupButton2.Show() else: self.activeSkillGroupName.SetText(nameList.get(group, "Noname")) self.activeSkillGroupName.Show() self.skillGroupButton1.Hide() self.skillGroupButton2.Hide() - def __SetSkillSlotData(self, race, group, empire=0): + if app.FIX_HORSE_SKILLS_TAB: + self.skillGroupButton3.Hide() + def __SetSkillSlotData(self, race, group, empire=0): ## SkillIndex playerSettingModule.RegisterSkill(race, group, empire) @@ -1157,19 +1294,26 @@ class CharacterWindow(ui.ScriptWindow): ## Refresh self.RefreshSkill() - def __SelectSkillGroup(self, index): - for btn in self.skillGroupButton: - btn.SetUp() - self.skillGroupButton[index].Down() + def __SelectSkillGroup(self, pageIndex, (PAGE_SKILL_1, PAGE_SKILL_2, PAGE_SKILL_HORSE) = range(3)): + for pageButton in self.skillGroupButton: + pageButton.SetUp() - if self.__CanUseHorseSkill(): - if 0 == index: - index = net.GetMainActorSkillGroup()-1 - elif 1 == index: - index = self.PAGE_HORSE + self.skillGroupButton[pageIndex].Down() - self.curSelectedSkillGroup = index - self.__SetSkillSlotData(net.GetMainActorRace(), index+1, net.GetMainActorEmpire()) + if pageIndex in (PAGE_SKILL_1, PAGE_SKILL_2): + skillGroupIndex = net.GetMainActorSkillGroup() + + if bool(skillGroupIndex): + (tmpCurSkillGroup, tmpSkillGroup) = (skillGroupIndex - 1, skillGroupIndex) + else: + (tmpCurSkillGroup, tmpSkillGroup) = (pageIndex, pageIndex + 1) + + self.curSelectedSkillGroup = tmpCurSkillGroup + self.__SetSkillSlotData(net.GetMainActorRace(), tmpSkillGroup, net.GetMainActorEmpire()) + elif pageIndex == PAGE_SKILL_HORSE and self.__CanUseHorseSkill(): + self.curSelectedSkillGroup = self.PAGE_HORSE + + self.RefreshSkill() def __CanUseSkillNow(self): if 0 == net.GetMainActorSkillGroup(): @@ -1178,7 +1322,6 @@ class CharacterWindow(ui.ScriptWindow): return True def __CanUseHorseSkill(self): - slotIndex = player.GetSkillSlotIndex(player.SKILL_INDEX_RIDING) if not slotIndex: @@ -1186,12 +1329,27 @@ class CharacterWindow(ui.ScriptWindow): grade = player.GetSkillGrade(slotIndex) level = player.GetSkillLevel(slotIndex) + if level < 0: level *= -1 - if grade >= 1 and level >= 1: - return True - return False + # Map to UI-displayed riding level (matches __RefreshSkillPage logic) + # grade 1: base 1..20 shown as 20..39 (offset +19) + # grade 2: base 1..10 shown as 30..39 (offset +29) + # grade 3: shown as 40 + effective = 0 + + if grade >= 3: + effective = 40 + elif grade == 2: + effective = level + 29 + elif grade == 1: + effective = level + 19 + else: + effective = level + + # Require displayed riding level >= 21 to enable the horse page + return effective >= 21 def __IsChangedHorseRidingSkillLevel(self): ret = False diff --git a/assets/root/uiinventory.py b/assets/root/uiinventory.py index 2e47eadf..b7e1a2a2 100644 --- a/assets/root/uiinventory.py +++ b/assets/root/uiinventory.py @@ -13,7 +13,7 @@ import uiRefine import uiAttachMetin import uiPickMoney import uiCommon -import uiPrivateShopBuilder # λ ItemMove +import uiPrivateShopBuilder # ���λ��� ������ ItemMove ���� import localeInfo import constInfo import ime @@ -41,7 +41,7 @@ class CostumeWindow(ui.ScriptWindow): ui.ScriptWindow.__init__(self) self.isLoaded = 0 - self.wndInventory = wndInventory; + self.wndInventory = wndInventory self.__LoadWindow() @@ -113,7 +113,7 @@ class BeltInventoryWindow(ui.ScriptWindow): ui.ScriptWindow.__init__(self) self.isLoaded = 0 - self.wndInventory = wndInventory; + self.wndInventory = wndInventory self.wndBeltInventoryLayer = None self.wndBeltInventorySlot = None @@ -156,7 +156,7 @@ class BeltInventoryWindow(ui.ScriptWindow): if localeInfo.IsARABIC() == 0: self.AdjustPositionAndSize() - ## κ丮 ġ BASE ġ , .. ϵڵϱ .. + ## ���� �κ��丮 ��ġ�� �������� BASE ��ġ�� ���, ����.. ���� �ϵ��ڵ��ϱ� ���� ������ ����� ����.. def GetBasePosition(self): x, y = self.wndInventory.GetGlobalPosition() return x - 148, y + 241 @@ -169,7 +169,7 @@ class BeltInventoryWindow(ui.ScriptWindow): self.SetSize(self.ORIGINAL_WIDTH, self.GetHeight()) else: - self.SetPosition(bx + 138, by); + self.SetPosition(bx + 138, by) self.SetSize(10, self.GetHeight()) def __LoadWindow(self): @@ -251,13 +251,13 @@ class InventoryWindow(ui.ScriptWindow): sellingSlotNumber = -1 isLoaded = 0 - isOpenedCostumeWindowWhenClosingInventory = 0 # κ丮 ڽ ־ -_-; ̹ - isOpenedBeltWindowWhenClosingInventory = 0 # κ丮 Ʈ κ丮 ־ -_-; ̹ + isOpenedCostumeWindowWhenClosingInventory = 0 # �κ��丮 ���� �� �ڽ����� �����־����� ����-_-; ���̹� ���� + isOpenedBeltWindowWhenClosingInventory = 0 # �κ��丮 ���� �� ��Ʈ �κ��丮�� �����־����� ����-_-; ���̹� ���� def __init__(self): ui.ScriptWindow.__init__(self) - self.isOpenedBeltWindowWhenClosingInventory = 0 # κ丮 Ʈ κ丮 ־ -_-; ̹ + self.isOpenedBeltWindowWhenClosingInventory = 0 # �κ��丮 ���� �� ��Ʈ �κ��丮�� �����־����� ����-_-; ���̹� ���� self.__LoadWindow() @@ -269,11 +269,11 @@ class InventoryWindow(ui.ScriptWindow): ui.ScriptWindow.Show(self) - # κ丮 ڽ ־ٸ κ丮 ڽ . + # �κ��丮�� ���� �� �ڽ����� �����־��ٸ� �κ��丮�� �� �� �ڽ����� ���� ������ ��. if self.isOpenedCostumeWindowWhenClosingInventory and self.wndCostume: self.wndCostume.Show() - # κ丮 Ʈ κ丮 ־ٸ . + # �κ��丮�� ���� �� ��Ʈ �κ��丮�� �����־��ٸ� ���� ������ ��. if self.wndBelt: self.wndBelt.Show(self.isOpenedBeltWindowWhenClosingInventory) @@ -439,11 +439,11 @@ class InventoryWindow(ui.ScriptWindow): self.tooltipItem.HideToolTip() if self.wndCostume: - self.isOpenedCostumeWindowWhenClosingInventory = self.wndCostume.IsShow() # κ丮 â ڽ ־°? + self.isOpenedCostumeWindowWhenClosingInventory = self.wndCostume.IsShow() # �κ��丮 â�� ���� �� �ڽ����� ���� �־��°�? self.wndCostume.Close() if self.wndBelt: - self.isOpenedBeltWindowWhenClosingInventory = self.wndBelt.IsOpeningInventory() # κ丮 â Ʈ κ丮 ־°? + self.isOpenedBeltWindowWhenClosingInventory = self.wndBelt.IsOpeningInventory() # �κ��丮 â�� ���� �� ��Ʈ �κ��丮�� ���� �־��°�? print "Is Opening Belt Inven?? ", self.isOpenedBeltWindowWhenClosingInventory self.wndBelt.Close() @@ -508,7 +508,7 @@ class InventoryWindow(ui.ScriptWindow): self.dlgPickMoney.SetTitleName(localeInfo.PICK_MONEY_TITLE) self.dlgPickMoney.SetAcceptEvent(ui.__mem_func__(self.OnPickMoney)) self.dlgPickMoney.Open(curMoney) - self.dlgPickMoney.SetMax(7) # κ丮 990000 + self.dlgPickMoney.SetMax(7) # �κ��丮 990000 ���� ���� ���� def OnPickMoney(self, money): mouseModule.mouseController.AttachMoney(self, player.SLOT_TYPE_INVENTORY, money) @@ -533,7 +533,7 @@ class InventoryWindow(ui.ScriptWindow): slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(i) itemCount = getItemCount(slotNumber) - # itemCount == 0̸ . + # itemCount == 0�̸� ������ ����. if 0 == itemCount: self.wndItem.ClearSlot(i) continue @@ -543,19 +543,19 @@ class InventoryWindow(ui.ScriptWindow): itemVnum = getItemVNum(slotNumber) setItemVNum(i, itemVnum, itemCount) - ## ڵ (HP: #72723 ~ #72726, SP: #72727 ~ #72730) Ưó - ε Կ Ȱȭ/Ȱȭ ǥø ۾ - [hyo] + ## �ڵ����� (HP: #72723 ~ #72726, SP: #72727 ~ #72730) Ư��ó�� - �������ε��� ���Կ� Ȱ��ȭ/��Ȱ��ȭ ǥ�ø� ���� �۾��� - [hyo] if constInfo.IS_AUTO_POTION(itemVnum): - # metinSocket - [0] : Ȱȭ , [1] : , [2] : ִ 뷮 + # metinSocket - [0] : Ȱ��ȭ ����, [1] : ����� ��, [2] : �ִ� �뷮 metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)] - if slotNumber >= player.INVENTORY_PAGE_SIZE: - slotNumber -= player.INVENTORY_PAGE_SIZE + if slotNumber >= player.INVENTORY_PAGE_SIZE * self.inventoryPageIndex: + slotNumber -= player.INVENTORY_PAGE_SIZE * self.inventoryPageIndex isActivated = 0 != metinSocket[0] if isActivated: self.wndItem.ActivateSlot(slotNumber) - potionType = 0; + potionType = 0 if constInfo.IS_AUTO_POTION_HP(itemVnum): potionType = player.AUTO_POTION_TYPE_HP elif constInfo.IS_AUTO_POTION_SP(itemVnum): @@ -614,7 +614,7 @@ class InventoryWindow(ui.ScriptWindow): def SellItem(self): if self.sellingSlotitemIndex == player.GetItemIndex(self.sellingSlotNumber): if self.sellingSlotitemCount == player.GetItemCount(self.sellingSlotNumber): - ## ȥ ȸ ϴ ߰ϸ鼭 type ߰ + ## ��ȥ���� �ȸ��� �ϴ� ��� �߰��ϸ鼭 ���� type �߰� net.SendShopSellPacketNew(self.sellingSlotNumber, self.questionDialog.count, player.INVENTORY) snd.PlaySound("sound/ui/money.wav") self.OnCloseQuestionDialog() @@ -764,10 +764,10 @@ class InventoryWindow(ui.ScriptWindow): else: #snd.PlaySound("sound/ui/drop.wav") - ## ̵Ų ؼ Ų - [levites] + ## �̵���Ų ���� ���� ������ ��� �������� ����ؼ� ���� ��Ų�� - [levites] if player.IsEquipmentSlot(dstItemSlotPos): - ## ִ ϶ + ## ��� �ִ� �������� ����϶��� if item.IsEquipmentVID(srcItemVID): self.__UseItem(srcItemSlotPos) @@ -786,7 +786,7 @@ class InventoryWindow(ui.ScriptWindow): self.sellingSlotitemCount = itemCount item.SelectItem(itemIndex) - ## Ƽ ÷ ˻ ߰ + ## ��Ƽ �÷��� �˻� ������ �߰� ## 20140220 if item.IsAntiFlag(item.ANTIFLAG_SELL): popup = uiCommon.PopupDialog() @@ -932,7 +932,7 @@ class InventoryWindow(ui.ScriptWindow): def __IsUsableItemToItem(self, srcItemVNum, srcSlotPos): - "ٸ ۿ ִ ΰ?" + "�ٸ� �����ۿ� ����� �� �ִ� �������ΰ�?" if item.IsRefineScroll(srcItemVNum): return True @@ -951,7 +951,7 @@ class InventoryWindow(ui.ScriptWindow): return False def __CanUseSrcItemToDstItem(self, srcItemVNum, srcSlotPos, dstSlotPos): - " ۿ ִ°?" + "��� �����ۿ� ����� �� �ִ°�?" if srcSlotPos == dstSlotPos: return False @@ -992,7 +992,7 @@ class InventoryWindow(ui.ScriptWindow): return True elif "USE_PUT_INTO_ACCESSORY_SOCKET" == useType: if self.__CanPutAccessorySocket(dstSlotPos, srcItemVNum): - return TRUE; + return TRUE elif "USE_PUT_INTO_BELT_SOCKET" == useType: dstItemVNum = player.GetItemIndex(dstSlotPos) print "USE_PUT_INTO_BELT_SOCKET", srcItemVNum, dstItemVNum @@ -1158,7 +1158,7 @@ class InventoryWindow(ui.ScriptWindow): self.OnCloseQuestionDialog() def __SendUseItemToItemPacket(self, srcSlotPos, dstSlotPos): - # λ ִ + # ���λ��� ���� �ִ� ���� ������ ��� ���� if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_ITEM_FAILURE_PRIVATE_SHOP) return @@ -1166,7 +1166,7 @@ class InventoryWindow(ui.ScriptWindow): net.SendItemUseToItemPacket(srcSlotPos, dstSlotPos) def __SendUseItemPacket(self, slotPos): - # λ ִ + # ���λ��� ���� �ִ� ���� ������ ��� ���� if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_ITEM_FAILURE_PRIVATE_SHOP) return @@ -1174,7 +1174,7 @@ class InventoryWindow(ui.ScriptWindow): net.SendItemUsePacket(slotPos) def __SendMoveItemPacket(self, srcSlotPos, dstSlotPos, srcItemCount): - # λ ִ + # ���λ��� ���� �ִ� ���� ������ ��� ���� if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP) return diff --git a/assets/root/uimessenger.py b/assets/root/uimessenger.py index dd7cea9f..3d18c0dd 100644 --- a/assets/root/uimessenger.py +++ b/assets/root/uimessenger.py @@ -42,6 +42,7 @@ class MessengerItem(ui.Window): def SetName(self, name): self.name = name + if name: self.text.SetText(name) self.SetSize(20 + 6*len(name) + 4, 16) @@ -377,6 +378,14 @@ class MessengerWindow(ui.ScriptWindow): self.__AddGroup() messenger.RefreshGuildMember() + def InitializeHandler(self): + """Load UI and register packet handlers without showing window""" + if self.isLoaded == 0: + self.isLoaded = 1 + self.__LoadWindow() + self.OnRefreshList() + self.OnResizeDialog() + def Show(self): if self.isLoaded==0: self.isLoaded=1 @@ -390,7 +399,7 @@ class MessengerWindow(ui.ScriptWindow): def __LoadWindow(self): pyScrLoader = ui.PythonScriptLoader() - pyScrLoader.LoadScriptFile(self, "UIScript/MessengerWindow.py") + pyScrLoader.LoadScriptFile(self, "UIScript/MessengerWindow.py") try: self.board = self.GetChild("board") @@ -669,6 +678,11 @@ class MessengerWindow(ui.ScriptWindow): self.selectedItem.OnRemove() self.selectedItem.UnSelect() self.selectedItem = None + + self.whisperButton.Disable() + self.mobileButton.Disable() + self.removeButton.Disable() + self.OnRefreshList() self.OnCloseQuestionDialog() @@ -770,7 +784,24 @@ class MessengerWindow(ui.ScriptWindow): def OnRemoveList(self, groupIndex, key): group = self.groupList[groupIndex] - group.RemoveMember(group.FindMember(key)) + + member = group.FindMember(key) + + if not member: + return + + if self.selectedItem is member or member.IsSameKey(key): + member.UnSelect() + self.selectedItem = None + + # Optional: also disable buttons to mirror local delete flow + self.whisperButton.Disable() + self.mobileButton.Disable() + self.removeButton.Disable() + + member.Hide() + group.RemoveMember(member) + self.OnRefreshList() def OnRemoveAllList(self, groupIndex): diff --git a/assets/root/uitaskbar.py b/assets/root/uitaskbar.py index c146323f..3c45bb5a 100644 --- a/assets/root/uitaskbar.py +++ b/assets/root/uitaskbar.py @@ -152,7 +152,7 @@ class EnergyBar(ui.ScriptWindow): def RefreshStatus(self): pointEnergy = player.GetStatus (player.ENERGY) leftTimeEnergy = player.GetStatus (player.ENERGY_END_TIME) - app.GetGlobalTimeStamp() - # ȯ ð = 2ð. + # ���ȯ ���� �ð� = 2�ð�. self.SetEnergy (pointEnergy, leftTimeEnergy, 7200) def SetEnergy (self, point, leftTime, maxTime): @@ -336,7 +336,7 @@ class TaskBar(ui.ScriptWindow): (coolTime, elapsedTime) = player.GetSkillCoolTime(skillSlotNumber) self.SetSlotCoolTime(slotNumber, coolTime, elapsedTime) - ## NOTE : Activate Ǿ ִٸ ܵ Ʈ + ## NOTE : Activate �Ǿ� �ִٸ� �����ܵ� ������Ʈ if player.IsSkillActive(skillSlotNumber): self.ActivateSlot(slotNumber) @@ -439,7 +439,7 @@ class TaskBar(ui.ScriptWindow): toggleButtonDict[TaskBar.BUTTON_MESSENGER]=self.GetChild("MessengerButton") toggleButtonDict[TaskBar.BUTTON_SYSTEM]=self.GetChild("SystemButton") - # ChatButton, ExpandButton ϳ ݵ Ѵ. + # ChatButton, ExpandButton �� �� �ϳ��� �ݵ�� �����Ѵ�. try: toggleButtonDict[TaskBar.BUTTON_CHAT]=self.GetChild("ChatButton") except: @@ -672,6 +672,22 @@ class TaskBar(ui.ScriptWindow): for button in self.selectSkillButtonList: button.RefreshSkill() + def SkillClearCoolTime(self, usedSlotIndex): + QUICK_SLOT_SLOT_COUNT = 4 + slotIndex = 0 + + for slotWindow in self.quickslot: + for i in xrange(QUICK_SLOT_SLOT_COUNT): + (Type, Position) = player.GetLocalQuickSlot(slotIndex) + + if Type == player.SLOT_TYPE_SKILL: + if usedSlotIndex == Position: + slotWindow.SetSlotCoolTime(slotIndex, 0) + + return + + slotIndex += 1 + def SetHP(self, curPoint, recoveryPoint, maxPoint): curPoint = min(curPoint, maxPoint) if maxPoint > 0: @@ -765,9 +781,9 @@ class TaskBar(ui.ScriptWindow): if itemCount <= 1: itemCount = 0 - ## ڵ (#72723, #72724) Ưó - ε Կ Ȱȭ/Ȱȭ ǥø ۾ - [hyo] + ## �ڵ����� (#72723, #72724) Ư��ó�� - �������ε��� ���Կ� Ȱ��ȭ/��Ȱ��ȭ ǥ�ø� ���� �۾��� - [hyo] if constInfo.IS_AUTO_POTION(itemIndex): - # metinSocket - [0] : Ȱȭ , [1] : , [2] : ִ 뷮 + # metinSocket - [0] : Ȱ��ȭ ����, [1] : ����� ��, [2] : �ִ� �뷮 metinSocket = [player.GetItemMetinSocket(Position, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)] if 0 != int(metinSocket[0]): @@ -776,17 +792,19 @@ class TaskBar(ui.ScriptWindow): slot.DeactivateSlot(slotNumber) slot.SetItemSlot(slotNumber, itemIndex, itemCount) - elif player.SLOT_TYPE_SKILL == Type: - skillIndex = player.GetSkillIndex(Position) + if 0 == skillIndex: slot.ClearSlot(slotNumber) + continue skillType = skill.GetSkillType(skillIndex) + if skill.SKILL_TYPE_GUILD == skillType: import guild + skillGrade = 0 skillLevel = guild.GetSkillLevel(Position) @@ -799,13 +817,19 @@ class TaskBar(ui.ScriptWindow): slot.SetCoverButton(slotNumber) ## NOTE : CoolTime üũ - if player.IsSkillCoolTime(Position): + if player.IsSkillCoolTime(Position) and skillLevel > 0: (coolTime, elapsedTime) = player.GetSkillCoolTime(Position) - slot.SetSlotCoolTime(slotNumber, coolTime, elapsedTime) - ## NOTE : Activate Ǿ ִٸ ܵ Ʈ + slot.SetSlotCoolTime(slotNumber, coolTime, elapsedTime) + else: + if skillType != skill.SKILL_TYPE_GUILD and skillLevel <= 0: + slot.SetSlotCoolTime(slotNumber, 0, 0) + + ## NOTE : Activate �Ǿ� �ִٸ� �����ܵ� ������Ʈ if player.IsSkillActive(Position): slot.ActivateSlot(slotNumber) + else: + slot.DeactivateSlot(slotNumber) elif player.SLOT_TYPE_EMOTION == Type: @@ -1047,8 +1071,8 @@ class TaskBar(ui.ScriptWindow): if skill.IsStandingSkill(skillIndex): continue - ## FIXME : ų ϳ ϳ Ҵϴ° ƹ ϰ ũ. - ## κ ð ġ. - [levites] + ## FIXME : ��ų �ϳ��� ���� �ϳ��� �Ҵ��ϴ°� �ƹ��� ���� ���ϰ� ũ��. + ## �� �κ��� �ð��� ���� ��ġ����. - [levites] skillButton = self.SkillButton() skillButton.SetSkill(startNumber+i) skillButton.SetPosition(x, y) diff --git a/assets/uiscript/uiscript/characterwindow.py b/assets/uiscript/uiscript/characterwindow.py index d5f04433..626d38e1 100644 --- a/assets/uiscript/uiscript/characterwindow.py +++ b/assets/uiscript/uiscript/characterwindow.py @@ -556,6 +556,22 @@ window = { "down_image" : "d:/ymir work/ui/game/windows/skill_tab_button_03.sub", }, + ##horse skill page + { + "name" : "Skill_Group_Button_3", + "type" : "radio_button", + + "x" : 95, + "y" : 2, + + "text" : "Group3", + "text_color" : 0xFFFFE3AD, + + "default_image" : "d:/ymir work/ui/game/windows/skill_tab_button_01.sub", + "over_image" : "d:/ymir work/ui/game/windows/skill_tab_button_02.sub", + "down_image" : "d:/ymir work/ui/game/windows/skill_tab_button_03.sub", + }, + { "name" : "Active_Skill_Group_Name", "type" : "text",