Merge pull request #12 from MindRapist/mr-2

MR-2
This commit is contained in:
d1str4ught
2025-12-20 01:32:27 +01:00
committed by GitHub
26 changed files with 572 additions and 234 deletions

62
.gitignore vendored
View File

@@ -8,3 +8,65 @@ ErrorLog.txt
/*.exe /*.exe
!/config.exe !/config.exe
!/Metin2.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

View File

@@ -2,16 +2,28 @@
This repository contains all client-side data, including locale files, configurations, and descriptive text used by the game client. 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: ### ⬆️ Feature Improvements
* **Messenger System:**
* **Fixed `MOV_SPEED` value for Skill 19** in `locale/en/skilldesc.txt` and `locale/en/skilltable.txt`. * **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.
### ⚠️ IMPORTANT: Locale Synchronization * **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.
The fix listed above has **only been applied to the `locale/en` (English) files.** * **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.
**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.** * **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)

View File

@@ -30,7 +30,7 @@
16 WARRIOR Průraz Tlaková vlna Útok Tsunami Napadáš nepřítele frontálně. Čelní prorážecí ú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 16 WARRIOR Průraz Tlaková vlna Útok Tsunami Napadáš nepřítele frontálně. Čelní prorážecí ú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á rána Prudká tygří rána Prudká dračí rána Napadáš nepřítele frontálně Prorážecí útok Útok na vícero cílů 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 17 WARRIOR Prudká rána Prudká tygří rána Prudká dračí rána Napadáš nepřítele frontálně Prorážecí útok Útok na vícero cílů 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í nosorožce Poval několik nepřátel Prorážecí útok Šance na bezvědomí 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 bezvědomí: %.0f%% (100 + 1000*SkillPoint/6)/10 18 WARRIOR Dupnutí Dupnutí lva Dupnutí nosorožce Poval několik nepřátel Prorážecí útok Šance na bezvědomí 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 bezvědomí: %.0f%% (100 + 1000*SkillPoint/6)/10
19 WARRIOR Silné tělo Tělo ze železa Tělo z oceli Tvoje obrana se dočasně zlepší a nebudeš padat k zemi. Obrana se zlepší Snižuje rychlost pohybu Neskácet 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é tělo Tělo ze železa Tělo z oceli Tvoje obrana se dočasně zlepší a nebudeš padat k zemi. Obrana se zlepší Snižuje rychlost pohybu Neskácet 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šť meče Šavlový tanec Cyklón Rozvíři meč, aby napadl více nepřátel Prorážecí útok Útok na vícero cílů 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 2 WARRIOR Smršť meče Šavlový tanec Cyklón Rozvíři meč, aby napadl více nepřátel Prorážecí útok Útok na vícero cílů 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 Rána mečem Bodnutí mečem Vrh mečem Napadáš nepřítele frontálně. Útok na dálku Útok na vícero cílů Bezvědomí převrhne cíl 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 bezvědomí: %.0f%% (100+k*1000/6)/10 20 WARRIOR Rána mečem Bodnutí mečem Vrh mečem Napadáš nepřítele frontálně. Útok na dálku Útok na vícero cílů Bezvědomí převrhne cíl 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 bezvědomí: %.0f%% (100+k*1000/6)/10
3 WARRIOR Bojové zuření Vztek Zběsilost Soustředíš se pouze na útočení. Rychlost útoku se zvyšuje Zvyšuje rychlost pohybu Zvyšuje náchylnost k poškození STANDING_SKILL jeongwi 3 4 Rychlost útoku +%.0f%% 50 * SkillPoint Rychlost pohybu +%.0f%% 20 * SkillPoint 3 WARRIOR Bojové zuření Vztek Zběsilost Soustředíš se pouze na útočení. Rychlost útoku se zvyšuje Zvyšuje rychlost pohybu Zvyšuje náchylnost k poškození STANDING_SKILL jeongwi 3 4 Rychlost útoku +%.0f%% 50 * SkillPoint Rychlost pohybu +%.0f%% 20 * SkillPoint

View File

@@ -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 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 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 Löwenstampfer 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 18 WARRIOR Stampfer Löwenstampfer 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 Körper Körper aus Eisen Körper aus Stahl Deine Verteidigung wird eine Zeit lang besser und du fällst 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 Körper Körper aus Eisen Körper aus Stahl Deine Verteidigung wird eine Zeit lang besser und du fällst 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 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 Schlägt 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 20 WARRIOR Schwertschlag Schwertstoß Schwertwurf Du greifst die Feinde frontal an. Fern-Angriff Angriff auf mehrere Ziele Ohnmacht Schlägt 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 ausschließlich auf das Angreifen. Angriffsgeschwindigkeit wird erhöht Erhöht die Bewegungsgeschwindigkeit Erhöht die Schadensanfälligkeit STANDING_SKILL jeongwi 3 4 Angriffsgeschwindigkeit +%.0f%% 50 * SkillPoint Bewegungsgeschwindigkeit +%.0f%% 20 * SkillPoint 3 WARRIOR Kampfrausch Wut Raserei Du konzentrierst dich ausschließlich auf das Angreifen. Angriffsgeschwindigkeit wird erhöht Erhöht die Bewegungsgeschwindigkeit Erhöht die Schadensanfälligkeit STANDING_SKILL jeongwi 3 4 Angriffsgeschwindigkeit +%.0f%% 50 * SkillPoint Bewegungsgeschwindigkeit +%.0f%% 20 * SkillPoint

View File

@@ -30,7 +30,7 @@
16 WARRIOR Gennemgående slag Trykbølge Tsunami-angreb Du angriber fjenden frontalt. Frontalt angreb ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Angrebsværdi %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 16 WARRIOR Gennemgående slag Trykbølge Tsunami-angreb Du angriber fjenden frontalt. Frontalt angreb ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Angrebsværdi %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
17 WARRIOR Voldsomme stød Voldsomme tigerstød Voldsomme dragestød Du angriber fjenden frontalt Gennembruds angreb Angreb på flere fjender ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Angrebsværdi %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 17 WARRIOR Voldsomme stød Voldsomme tigerstød Voldsomme dragestød Du angriber fjenden frontalt Gennembruds angreb Angreb på flere fjender ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Angrebsværdi %.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 Løvens trampning Rhinoceros trampning Stød 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 18 WARRIOR Trampning Løvens trampning Rhinoceros trampning Stød 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 Stærk krop Krop af jern Krop af stål Dit forsvar forøges, og du kan ikke væltes. Forsvar forøges Bevægelseshastigheden sænkes Ingen væltning STANDING_SKILL cheongeun 19 4 Forsvar: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Bevægelseshastighed: -%.0f 1 + 9*SkillPoint 19 WARRIOR Stærk krop Krop af jern Krop af stål Dit forsvar forøges, og du kan ikke væltes. Forsvar forøges Bevægelseshastigheden sænkes Ingen væltning STANDING_SKILL cheongeun 19 4 Forsvar: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Bevægelseshastighed: -%.0f -(0.375*SkillPoint)
2 WARRIOR Sværd-hvirvel Sværd-dans Zyklon Hvirvler omkring med sværdet Gennemslagssangreb Angreb på flere fjender ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Angrebsværdi %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 2 WARRIOR Sværd-hvirvel Sværd-dans Zyklon Hvirvler omkring med sværdet Gennemslagssangreb Angreb på flere fjender ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Angrebsværdi %.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 Sværdstødet Forbedret sværdstød Sværdkast Du angriber fjenden frontalt. Distance-angreb Angreb på flere fjender Besvimelse Vælter målet 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 20 WARRIOR Sværdstødet Forbedret sværdstød Sværdkast Du angriber fjenden frontalt. Distance-angreb Angreb på flere fjender Besvimelse Vælter målet 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 forøges Bevægelseshastigheden forøges Forøger modtaget skade STANDING_SKILL jeongwi 3 4 Angrebshastighed +%.0f%% 50 * SkillPoint Bevægelseshastighed +%.0f%% 20 * SkillPoint 3 WARRIOR Berserk Vrede Raseri Du koncentrerer dig udelukkende om angrebet Angrebshastigheden forøges Bevægelseshastigheden forøges Forøger modtaget skade STANDING_SKILL jeongwi 3 4 Angrebshastighed +%.0f%% 50 * SkillPoint Bevægelseshastighed +%.0f%% 20 * SkillPoint

View File

@@ -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 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 Dragón Ataca directamente a los enemigos Ataque fuerte Ataque a múltiples 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 17 WARRIOR Golpe Golpe de Tigre Golpe de Dragón Ataca directamente a los enemigos Ataque fuerte Ataque a múltiples 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 Tocón Tocón de Leon Tocón 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 18 WARRIOR Tocón Tocón de Leon Tocón 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 período 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 período 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 Ciclón Gira la espada para atacar a varios enemigos Ataque frontal Ataque de múltiples 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 2 WARRIOR Giro de espada Danza de la espada Ciclón Gira la espada para atacar a varios enemigos Ataque frontal Ataque de múltiples 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 múltiples 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 20 WARRIOR Golpe de espada Rayo de espada Lanzamiento de espada Atacas de frente al enemigo. Ataque de largo alcance Ataque a múltiples 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 concentración en el ataque Incrementa velocidad de ataque Incrementa velocidad de movimiento Incrementa daño recibido STANDING_SKILL jeongwi 3 4 Velocidad de Ataque +%.0f%% 50 * SkillPoint Velocidad de Movimiento +%.0f%% 20 * SkillPoint 3 WARRIOR Berserk Furia Frenesí Solo concentración en el ataque Incrementa velocidad de ataque Incrementa velocidad de movimiento Incrementa daño recibido STANDING_SKILL jeongwi 3 4 Velocidad de Ataque +%.0f%% 50 * SkillPoint Velocidad de Movimiento +%.0f%% 20 * SkillPoint

View File

@@ -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 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 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 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 défense et empêche que vous soyez renversé Augmente la Défense Diminue la vitesse de déplacement Empêche que vous soyez renversé STANDING_SKILL cheongeun 19 4 Défense : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Vitesse de déplacement : -%.0f 1 + 9*SkillPoint 19 WARRIOR Corps puissant Corps de fer Corps d'acier Augmente temporairement votre défense et empêche que vous soyez renversé Augmente la Défense Diminue la vitesse de déplacement Empêche que vous soyez renversé STANDING_SKILL cheongeun 19 4 Défense : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Vitesse de déplacement : -%.0f -(0.375*SkillPoint)
2 WARRIOR Moulinet à l'épée Danse de l'épée Cyclone Effectue des moulinets de l'épée 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 2 WARRIOR Moulinet à l'épée Danse de l'épée Cyclone Effectue des moulinets de l'épée 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'épée Coup d'épée foudroyant Jet d'épée 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 20 WARRIOR Coup d'épée Coup d'épée foudroyant Jet d'épée 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 Frénésie Uniquement concentré sur l'attaque. Augmente la vitesse d'attaque Augmente la vitesse de déplacement Augmente les dommages reçus STANDING_SKILL jeongwi 3 4 Vitesse d'attaque +%.0f%% 50 * SkillPoint Vitesse de déplacement +%.0f%% 20 * SkillPoint 3 WARRIOR Berserk Furie Frénésie Uniquement concentré sur l'attaque. Augmente la vitesse d'attaque Augmente la vitesse de déplacement Augmente les dommages reçus STANDING_SKILL jeongwi 3 4 Vitesse d'attaque +%.0f%% 50 * SkillPoint Vitesse de déplacement +%.0f%% 20 * SkillPoint

View File

@@ -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 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 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 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 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 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 3 WARRIOR Έξαλλος Οργισμένος Μανιακός Επικέντρωση στην Επίθεση Αυξάνει την Ταχύτητα της Επίθεσης Αυξάνει την ταχύτητα Κίνησης Αυξάνει την ζημιά που δέχεσε STANDING_SKILL jeongwi 3 4 Ταχύτητα Επίθεσης +%.0f%% 50 * SkillPoint Ταχύτητα Κίνησης +%.0f%% 20 * SkillPoint

View File

@@ -30,7 +30,7 @@
16 WARRIOR Áthatolás Nyomás hullám Cunami támadás Szemből támadsz az ellenségre. Frontális átütő támadás ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Támadó erő %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 16 WARRIOR Áthatolás Nyomás hullám Cunami támadás Szemből támadsz az ellenségre. Frontális átütő támadás ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Támadó erő %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
17 WARRIOR Heves csapás Heves tigris csapás Heves sárkány csapás Frontálisan támadsz az ellenségre Átütő támadás Támadás több cél ellen ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Támadó erő %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 17 WARRIOR Heves csapás Heves tigris csapás Heves sárkány csapás Frontálisan támadsz az ellenségre Átütő támadás Támadás több cél ellen ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Támadó 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 Dübörgés Oroszlán dübörgés Orrszarvú dübörgés Teríts le több ellenséget. Átütő támadás Ájulás esély ATTACK_SKILL|STANDING_SKILL daejin 18 4 Támadó érték %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Ájulás esély: %.0f%% (100 + 1000*SkillPoint/6)/10 18 WARRIOR Dübörgés Oroszlán dübörgés Orrszarvú dübörgés Teríts le több ellenséget. Átütő támadás Ájulás esély ATTACK_SKILL|STANDING_SKILL daejin 18 4 Támadó érték %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Ájulás esély: %.0f%% (100 + 1000*SkillPoint/6)/10
19 WARRIOR Erős test Test jégből Test acélból A védekezésed egy időre javul és nem veszítesz. A védekezés javul Csökken a mozgási sebesség Nincs összeomlás STANDING_SKILL cheongeun 19 4 Védekezés : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Mozgási sebesség: -%.0f 1 + 9*SkillPoint 19 WARRIOR Erős test Test jégből Test acélból A védekezésed egy időre javul és nem veszítesz. A védekezés javul Csökken a mozgási sebesség Nincs összeomlás STANDING_SKILL cheongeun 19 4 Védekezés : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Mozgási sebesség: -%.0f -(0.375*SkillPoint)
2 WARRIOR Forgó kard Kard tánc Ciklon Forgasd körbe a kardot, hogy több ellenséget támad meg. Átütő támadás Több cél támadása ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Támadó érték %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 2 WARRIOR Forgó kard Kard tánc Ciklon Forgasd körbe a kardot, hogy több ellenséget támad meg. Átütő támadás Több cél támadása ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Támadó érték %.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 ütés Kard szúrás Kard dobás Szemből támadsz az ellenségre. Távoli támadás Több cél támadása Ájulás Pusztítsd el a célt ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Támadó érték %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Ájulás esély: %.0f%% (100+k*1000/6)/10 20 WARRIOR Kard ütés Kard szúrás Kard dobás Szemből támadsz az ellenségre. Távoli támadás Több cél támadása Ájulás Pusztítsd el a célt ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Támadó érték %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Ájulás esély: %.0f%% (100+k*1000/6)/10
3 WARRIOR Harci mámor Düh Vágtázás Kizárólag a támadásra koncentrálj. Támadó sebesség növekedik Növeli a mozgási sebességet Növeli az elszenvedett veszteségeket STANDING_SKILL jeongwi 3 4 Támadó sebesség +%.0f%% 50 * SkillPoint Mozgási sebesség +%.0f%% 20 * SkillPoint 3 WARRIOR Harci mámor Düh Vágtázás Kizárólag a támadásra koncentrálj. Támadó sebesség növekedik Növeli a mozgási sebességet Növeli az elszenvedett veszteségeket STANDING_SKILL jeongwi 3 4 Támadó sebesség +%.0f%% 50 * SkillPoint Mozgási sebesség +%.0f%% 20 * SkillPoint

View File

@@ -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 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 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 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 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 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 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

View File

@@ -30,7 +30,7 @@
16 WARRIOR Áthatolás Nyomás hullám Cunami támadás Szemből támadsz az ellenségre. Frontális átütő támadás ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Támadó erő %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 16 WARRIOR Áthatolás Nyomás hullám Cunami támadás Szemből támadsz az ellenségre. Frontális átütő támadás ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Támadó erő %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
17 WARRIOR Heves csapás Heves tigris csapás Heves sárkány csapás Frontálisan támadsz az ellenségre Átütő támadás Támadás több cél ellen ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Támadó erő %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 17 WARRIOR Heves csapás Heves tigris csapás Heves sárkány csapás Frontálisan támadsz az ellenségre Átütő támadás Támadás több cél ellen ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Támadó 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 Dübörgés Oroszlán dübörgés Orrszarvú dübörgés Teríts le több ellenséget. Átütő támadás Ájulás esély ATTACK_SKILL|STANDING_SKILL daejin 18 4 Támadó érték %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Ájulás esély: %.0f%% (100 + 1000*SkillPoint/6)/10 18 WARRIOR Dübörgés Oroszlán dübörgés Orrszarvú dübörgés Teríts le több ellenséget. Átütő támadás Ájulás esély ATTACK_SKILL|STANDING_SKILL daejin 18 4 Támadó érték %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Ájulás esély: %.0f%% (100 + 1000*SkillPoint/6)/10
19 WARRIOR Erős test Test jégből Test acélból A védekezésed egy időre javul és nem veszítesz. A védekezés javul Csökken a mozgási sebesség Nincs összeomlás STANDING_SKILL cheongeun 19 4 Védekezés : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Mozgási sebesség: -%.0f 1 + 9*SkillPoint 19 WARRIOR Erős test Test jégből Test acélból A védekezésed egy időre javul és nem veszítesz. A védekezés javul Csökken a mozgási sebesség Nincs összeomlás STANDING_SKILL cheongeun 19 4 Védekezés : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Mozgási sebesség: -%.0f -(0.375*SkillPoint)
2 WARRIOR Forgó kard Kard tánc Ciklon Forgasd körbe a kardot, hogy több ellenséget támad meg. Átütő támadás Több cél támadása ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Támadó érték %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 2 WARRIOR Forgó kard Kard tánc Ciklon Forgasd körbe a kardot, hogy több ellenséget támad meg. Átütő támadás Több cél támadása ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Támadó érték %.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 ütés Kard szúrás Kard dobás Szemből támadsz az ellenségre. Távoli támadás Több cél támadása Ájulás Pusztítsd el a célt ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Támadó érték %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Ájulás esély: %.0f%% (100+k*1000/6)/10 20 WARRIOR Kard ütés Kard szúrás Kard dobás Szemből támadsz az ellenségre. Távoli támadás Több cél támadása Ájulás Pusztítsd el a célt ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Támadó érték %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Ájulás esély: %.0f%% (100+k*1000/6)/10
3 WARRIOR Harci mámor Düh Vágtázás Kizárólag a támadásra koncentrálj. Támadó sebesség növekedik Növeli a mozgási sebességet Növeli az elszenvedett veszteségeket STANDING_SKILL jeongwi 3 4 Támadó sebesség +%.0f%% 50 * SkillPoint Mozgási sebesség +%.0f%% 20 * SkillPoint 3 WARRIOR Harci mámor Düh Vágtázás Kizárólag a támadásra koncentrálj. Támadó sebesség növekedik Növeli a mozgási sebességet Növeli az elszenvedett veszteségeket STANDING_SKILL jeongwi 3 4 Támadó sebesség +%.0f%% 50 * SkillPoint Mozgási sebesség +%.0f%% 20 * SkillPoint

View File

@@ -30,7 +30,7 @@
16 WARRIOR Duchowe Uderzenie Fala Uderzeniowa Atak Tsunami Atakuje centralnie wrogów Frontalny atak rozpryskowy ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Siła Ataku %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint 16 WARRIOR Duchowe Uderzenie Fala Uderzeniowa Atak Tsunami Atakuje centralnie wrogów Frontalny atak rozpryskowy ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Siła Ataku %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
17 WARRIOR Walnięcie Tygrysie walnięcie Smocze Powalenie Atakuje centralnie wrogów Prosty rozpryskowy atak Atak skierowany w kilka celów ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Siła Ataku %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint 17 WARRIOR Walnięcie Tygrysie walnięcie Smocze Powalenie Atakuje centralnie wrogów Prosty rozpryskowy atak Atak skierowany w kilka celów ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Siła 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 Tąpnięcie Tąpnięcia Lwa Tąpnięcie Nosorożca Zwal z nóg kilku wrogów. Frontalny atak rozpryskowy Szansa na Omdlenie ATTACK_SKILL|STANDING_SKILL daejin 18 4 Siła 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 18 WARRIOR Tąpnięcie Tąpnięcia Lwa Tąpnięcie Nosorożca Zwal z nóg kilku wrogów. Frontalny atak rozpryskowy Szansa na Omdlenie ATTACK_SKILL|STANDING_SKILL daejin 18 4 Siła 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 Ciało Żelazne Ciało Stalowe Ciało Zwiększa Obronę i pomaga wygrać Zwiększa 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 Ciało Żelazne Ciało Stalowe Ciało Zwiększa Obronę i pomaga wygrać Zwiększa 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 przeciwników Frontalny atak rozpryskowy Atak w kilka celów ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Siła 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 2 WARRIOR Wir Miecza Taniec Miecza Cyklon Wiruj mieczem aby atakować wielu przeciwników Frontalny atak rozpryskowy Atak w kilka celów ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Siła 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 Pchnięcie Miecza Rzut Miecza atakujesz wrogów bezpośrednio Atak z dystansu Atak skierowany na kilka celów Omdlenie Powala cel na ziemię ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Siła 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 20 WARRIOR Uderzenie Miecza Pchnięcie Miecza Rzut Miecza atakujesz wrogów bezpośrednio Atak z dystansu Atak skierowany na kilka celów Omdlenie Powala cel na ziemię ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Siła 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 Zwiększa Szybkość Ataku Zwiększa Szybkość Ruchu Zwiększa otrzymywane obrażenia STANDING_SKILL jeongwi 3 4 Szybkość Ataku +%.0f%% 50 * SkillPoint Szybkość Ruchu +%.0f%% 20 * SkillPoint 3 WARRIOR Berserk Furia Szał Koncentracja tylko na ataku Zwiększa Szybkość Ataku Zwiększa Szybkość Ruchu Zwiększa otrzymywane obrażenia STANDING_SKILL jeongwi 3 4 Szybkość Ataku +%.0f%% 50 * SkillPoint Szybkość Ruchu +%.0f%% 20 * SkillPoint

View File

@@ -30,7 +30,7 @@
16 WARRIOR Força 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 16 WARRIOR Força 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 Dragão Ataca inimigos directamente. Ataque Residual Directo Ataque a Múltiplos 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 17 WARRIOR Ataque Destrutivo Garra do Tigre Garra do Dragão Ataca inimigos directamente. Ataque Residual Directo Ataque a Múltiplos 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 Leão Terramoto Rinoceronte Derruba vários 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 18 WARRIOR Terramoto Terramoto Leão Terramoto Rinoceronte Derruba vários 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 Aço Aumenta a Defesa e não cais ao chão. Aumenta a Defesa Reduz a Rapidez de Movimento Não cais ao chão 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 Aço Aumenta a Defesa e não cais ao chão. Aumenta a Defesa Reduz a Rapidez de Movimento Não cais ao chão 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 Dançante Ciclone Gira a espada para atacares vários inimigos. Ataque Residual Frontal Ataque a Múltiplos 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 2 WARRIOR Espada Rotativa Espada Dançante Ciclone Gira a espada para atacares vários inimigos. Ataque Residual Frontal Ataque a Múltiplos 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 Múltiplos Alvos Probabilidade de Atordar Atira o alvo ao chão 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 20 WARRIOR Ataque de Espada Raio de Espada Tempestade de Espada Ataca inimigos directamente. Ataque de Longo Alcance Ataque a Múltiplos Alvos Probabilidade de Atordar Atira o alvo ao chão 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 Fúria Cólera 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 3 WARRIOR Raiva Fúria Cólera 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

View File

@@ -30,7 +30,7 @@
16 WARRIOR Atacul Spiritului Unda de Soc Atac Tsunami Ataci duşmanii frontal. Atac de pătrundere 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 16 WARRIOR Atacul Spiritului Unda de Soc Atac Tsunami Ataci duşmanii frontal. Atac de pătrundere 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 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 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 Apărarea ta se îmbunătăţeşte pentru un timp iar tu nu cazi la pământ. Îmbunătăţirea apărării Scade viteza de mişcare Nu cazi la pământ STANDING_SKILL cheongeun 19 4 Apărare : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Viteză de mişcare: -%.0f 1 + 9*SkillPoint 19 WARRIOR Corp Rezistent Corp de Fier Corp de Otel Apărarea ta se îmbunătăţeşte pentru un timp iar tu nu cazi la pământ. Îmbunătăţirea apărării Scade viteza de mişcare Nu cazi la pământ STANDING_SKILL cheongeun 19 4 Apărare : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Viteză de mişcare: -%.0f -(0.375*SkillPoint)
2 WARRIOR Vartejul Sabiei Dansul Sabiei Ciclon Învârte sabia pentru a ataca mai mulţi duşmani. Atac pătrunzător 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 2 WARRIOR Vartejul Sabiei Dansul Sabiei Ciclon Învârte sabia pentru a ataca mai mulţi duşmani. Atac pătrunzător 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 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 creşte Creşte viteza de mişcare Creşte expunerea la pagube STANDING_SKILL jeongwi 3 4 Viteza de atac +%.0f%% 50 * SkillPoint Viteza de mişcare +%.0f%% 20 * SkillPoint 3 WARRIOR Iures Furie Turbare Te concentrezi doar asupra atacului. Viteza de atac creşte Creşte viteza de mişcare Creşte expunerea la pagube STANDING_SKILL jeongwi 3 4 Viteza de atac +%.0f%% 50 * SkillPoint Viteza de mişcare +%.0f%% 20 * SkillPoint

View File

@@ -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 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 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 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 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 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 3 WARRIOR Берсерк Ярость Безумие Концентрация на атаке. Увеличение скорости атаки Увеличение скорости передвижения Увеличение получаемых повреждений STANDING_SKILL jeongwi 3 4 Скорость атаки: +%.0f%% 50 * SkillPoint Скорость передвижения: +%.0f%% 20 * SkillPoint

View File

@@ -30,7 +30,7 @@
16 WARRIOR Ruh Vuruşu Şok Dalgası Tsunami-saldırısı Düşmana doğrudan saldırı. Önden Sıçrama Saldırısı ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Saldırı Gücü %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*GÜÇ + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*GÜÇ + CON)*SkillPoint 16 WARRIOR Ruh Vuruşu Şok Dalgası Tsunami-saldırısı Düşmana doğrudan saldırı. Önden Sıçrama Saldırısı ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Saldırı Gücü %.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 vuruşu Ejderha Vuruşu Düşmana doğrudan saldırı. Güçlü Sıçrama Saldırısı Çoklu Hedefe Saldırı ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Saldırı Gücü %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*GÜÇ + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*GÜÇ + 3*CON)*SkillPoint 17 WARRIOR Şiddetli Vuruş Kaplan vuruşu Ejderha Vuruşu Düşmana doğrudan saldırı. Güçlü Sıçrama Saldırısı Çoklu Hedefe Saldırı ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Saldırı Gücü %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*GÜÇ + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*GÜÇ + 3*CON)*SkillPoint
18 WARRIOR Güçlü Vuruş Aslan Vuruşu Rhino Vuruşu Birden çok düşmanı uzaklaştıran vuruş. Güçlü Sıçrama Saldırısı Bayılma olasılığı ATTACK_SKILL|STANDING_SKILL daejin 18 4 Saldırı Gücü %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Bayılma şansı: %.0f%% (100 + 1000*SkillPoint/6)/10 18 WARRIOR Güçlü Vuruş Aslan Vuruşu Rhino Vuruşu Birden çok düşmanı uzaklaştıran vuruş. Güçlü Sıçrama Saldırısı Bayılma olasılığı ATTACK_SKILL|STANDING_SKILL daejin 18 4 Saldırı Gücü %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Bayılma şansı: %.0f%% (100 + 1000*SkillPoint/6)/10
19 WARRIOR Güçlü Beden Demir Beden Çelik Beden Savunmayı arttırır ve kazanırsınız. Savunmayı arttırır Hareket Hızını Düşürür Asla düşmez. STANDING_SKILL cheongeun 19 4 Savunma : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Hareket Hızı : -%.0f 1 + 9*SkillPoint 19 WARRIOR Güçlü Beden Demir Beden Çelik Beden Savunmayı arttırır ve kazanırsınız. Savunmayı arttırır Hareket Hızını Düşürür Asla düşmez. STANDING_SKILL cheongeun 19 4 Savunma : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Hareket Hızı : -%.0f -(0.375*SkillPoint)
2 WARRIOR Kılıç Çevirme Kılıç Dansı Siklon Kılıcı çevirerek birden çok düşmana saldırma. Önden Sıçrama Saldırısı Çoklu Hedefe Saldırı ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Saldırı gücü %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint 2 WARRIOR Kılıç Çevirme Kılıç Dansı Siklon Kılıcı çevirerek birden çok düşmana saldırma. Önden Sıçrama Saldırısı Çoklu Hedefe Saldırı ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Saldırı gücü %.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 Kılıç Darbesi Kılıç Yıldırımı Kılıç Fırlatmak Düşmana Doğrudan Saldırı. Uzun Menzilli Saldırı Çoklu Hedefe Saldırı Bayılma Hedefi indirir ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Saldırı Gücü %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Bayılma şansı: %.0f%% (100+k*1000/6)/10 20 WARRIOR Kılıç Darbesi Kılıç Yıldırımı Kılıç Fırlatmak Düşmana Doğrudan Saldırı. Uzun Menzilli Saldırı Çoklu Hedefe Saldırı Bayılma Hedefi indirir ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Saldırı Gücü %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Bayılma şansı: %.0f%% (100+k*1000/6)/10
3 WARRIOR Öfke Korkunç Öfke Çılgınlık Sadece Saldırıya konsantre olmak. Saldırı Hızını Arttırır Hareket Hızını Arttırır Alınan zararı artırır STANDING_SKILL jeongwi 3 4 Saldırı Hızı +%.0f%% 50 * SkillPoint Hareket Hızı +%.0f%% 20 * SkillPoint 3 WARRIOR Öfke Korkunç Öfke Çılgınlık Sadece Saldırıya konsantre olmak. Saldırı Hızını Arttırır Hareket Hızını Arttırır Alınan zararı artırır STANDING_SKILL jeongwi 3 4 Saldırı Hızı +%.0f%% 50 * SkillPoint Hareket Hızı +%.0f%% 20 * SkillPoint

View File

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

View File

@@ -305,10 +305,14 @@ class Interface(object):
self.whisperDialogDict = {} self.whisperDialogDict = {}
self.privateShopAdvertisementBoardDict = {} self.privateShopAdvertisementBoardDict = {}
self.wndMessenger.InitializeHandler()
self.wndInventory.SetItemToolTip(self.tooltipItem) self.wndInventory.SetItemToolTip(self.tooltipItem)
if app.ENABLE_DRAGON_SOUL_SYSTEM: if app.ENABLE_DRAGON_SOUL_SYSTEM:
self.wndDragonSoul.SetItemToolTip(self.tooltipItem) self.wndDragonSoul.SetItemToolTip(self.tooltipItem)
self.wndDragonSoulRefine.SetItemToolTip(self.tooltipItem) self.wndDragonSoulRefine.SetItemToolTip(self.tooltipItem)
self.wndSafebox.SetItemToolTip(self.tooltipItem) self.wndSafebox.SetItemToolTip(self.tooltipItem)
self.wndCube.SetItemToolTip(self.tooltipItem) self.wndCube.SetItemToolTip(self.tooltipItem)
self.wndCubeResult.SetItemToolTip(self.tooltipItem) self.wndCubeResult.SetItemToolTip(self.tooltipItem)
@@ -535,6 +539,10 @@ class Interface(object):
def OnChangeCurrentSkill(self, skillSlotNumber): def OnChangeCurrentSkill(self, skillSlotNumber):
self.wndTaskBar.OnChangeCurrentSkill(skillSlotNumber) self.wndTaskBar.OnChangeCurrentSkill(skillSlotNumber)
def SkillClearCoolTime(self, slotIndex):
self.wndCharacter.SkillClearCoolTime(slotIndex)
self.wndTaskBar.SkillClearCoolTime(slotIndex)
def SelectMouseButtonEvent(self, dir, event): def SelectMouseButtonEvent(self, dir, event):
self.wndTaskBar.SelectMouseButtonEvent(dir, event) self.wndTaskBar.SelectMouseButtonEvent(dir, event)
@@ -564,7 +572,7 @@ class Interface(object):
if app.ENABLE_DRAGON_SOUL_SYSTEM: if app.ENABLE_DRAGON_SOUL_SYSTEM:
self.wndDragonSoul.RefreshItemSlot() self.wndDragonSoul.RefreshItemSlot()
def RefreshCharacter(self): ## Character 페이지의 얼굴, Inventory 페이지의 전신 그림 등의 Refresh def RefreshCharacter(self): ## Character <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, Inventory <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׸<EFBFBD> <20><><EFBFBD><EFBFBD> Refresh
self.wndCharacter.RefreshCharacter() self.wndCharacter.RefreshCharacter()
self.wndTaskBar.RefreshQuickSlot() self.wndTaskBar.RefreshQuickSlot()
@@ -696,7 +704,7 @@ class Interface(object):
def RemovePartyMember(self, pid): def RemovePartyMember(self, pid):
self.wndParty.RemovePartyMember(pid) self.wndParty.RemovePartyMember(pid)
##!! 20061026.levites.퀘스트_위치_보정 ##!! 20061026.levites.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ_<EFBFBD><EFBFBD>ġ_<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
self.__ArrangeQuestButton() self.__ArrangeQuestButton()
def LinkPartyMember(self, pid, vid): def LinkPartyMember(self, pid, vid):
@@ -711,7 +719,7 @@ class Interface(object):
def ExitParty(self): def ExitParty(self):
self.wndParty.ExitParty() self.wndParty.ExitParty()
##!! 20061026.levites.퀘스트_위치_보정 ##!! 20061026.levites.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ_<EFBFBD><EFBFBD>ġ_<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
self.__ArrangeQuestButton() self.__ArrangeQuestButton()
def PartyHealReady(self): def PartyHealReady(self):
@@ -874,7 +882,7 @@ class Interface(object):
if True == self.wndChat.IsEditMode(): if True == self.wndChat.IsEditMode():
self.wndChat.CloseChat() self.wndChat.CloseChat()
else: else:
# 웹페이지가 열렸을때는 채팅 입력이 안됨 # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4> <20>Է<EFBFBD><D4B7><EFBFBD> <20>ȵ<EFBFBD>
if self.wndWeb and self.wndWeb.IsShow(): if self.wndWeb and self.wndWeb.IsShow():
pass pass
else: else:
@@ -975,7 +983,7 @@ class Interface(object):
else: else:
self.wndExpandedTaskBar.Close() self.wndExpandedTaskBar.Close()
# 용혼석 # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>
def DragonSoulActivate(self, deck): def DragonSoulActivate(self, deck):
if app.ENABLE_DRAGON_SOUL_SYSTEM: if app.ENABLE_DRAGON_SOUL_SYSTEM:
self.wndDragonSoul.ActivateDragonSoulByExtern(deck) self.wndDragonSoul.ActivateDragonSoulByExtern(deck)
@@ -1046,7 +1054,7 @@ class Interface(object):
if True == self.wndDragonSoulRefine.IsShow(): if True == self.wndDragonSoulRefine.IsShow():
self.wndDragonSoulRefine.Close() self.wndDragonSoulRefine.Close()
# 용혼석 끝 # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><>
def ToggleGuildWindow(self): def ToggleGuildWindow(self):
if not self.wndGuild.IsShow(): if not self.wndGuild.IsShow():
@@ -1096,7 +1104,7 @@ class Interface(object):
def OpenWebWindow(self, url): def OpenWebWindow(self, url):
self.wndWeb.Open(url) self.wndWeb.Open(url)
# 웹페이지를 열면 채팅을 닫는다 # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20>ݴ´<DDB4>
self.wndChat.CloseChat() self.wndChat.CloseChat()
# show GIFT # show GIFT
@@ -1124,9 +1132,9 @@ class Interface(object):
def SucceedCubeWork(self, itemVnum, count): def SucceedCubeWork(self, itemVnum, count):
self.wndCube.Clear() self.wndCube.Clear()
print "큐브 제작 성공! [%d:%d]" % (itemVnum, count) print "ť<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>! [%d:%d]" % (itemVnum, count)
if 0: # 결과 메시지 출력은 생략 한다 if 0: # <EFBFBD><EFBFBD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>
self.wndCubeResult.SetPosition(*self.wndCube.GetGlobalPosition()) self.wndCubeResult.SetPosition(*self.wndCube.GetGlobalPosition())
self.wndCubeResult.SetCubeResultItem(itemVnum, count) self.wndCubeResult.SetCubeResultItem(itemVnum, count)
self.wndCubeResult.Open() self.wndCubeResult.Open()
@@ -1289,7 +1297,7 @@ class Interface(object):
btn = uiWhisper.WhisperButton() btn = uiWhisper.WhisperButton()
# QUEST_LETTER_IMAGE # QUEST_LETTER_IMAGE
##!! 20061026.levites.퀘스트_이미지_교체 ##!! 20061026.levites.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ_<EFBFBD>̹<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD><EFBFBD>ü
import item import item
if "item"==iconType: if "item"==iconType:
item.SelectItem(int(iconName)) item.SelectItem(int(iconName))
@@ -1336,7 +1344,7 @@ class Interface(object):
screenWidth = wndMgr.GetScreenWidth() screenWidth = wndMgr.GetScreenWidth()
screenHeight = wndMgr.GetScreenHeight() screenHeight = wndMgr.GetScreenHeight()
##!! 20061026.levites.퀘스트_위치_보정 ##!! 20061026.levites.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ_<EFBFBD><EFBFBD>ġ_<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if self.wndParty.IsShow(): if self.wndParty.IsShow():
xPos = 100 + 30 xPos = 100 + 30
else: else:
@@ -1390,8 +1398,8 @@ class Interface(object):
def __InitWhisper(self): def __InitWhisper(self):
chat.InitWhisper(self) chat.InitWhisper(self)
## 채팅창의 "메시지 보내기"를 눌렀을때 이름 없는 대화창을 여는 함수 ## ä<EFBFBD><EFBFBD>â<EFBFBD><EFBFBD> "<22>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<22><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȭâ<C8AD><C3A2> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
## 이름이 없기 때문에 기존의 WhisperDialogDict 와 별도로 관리된다. ## <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WhisperDialogDict <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
def OpenWhisperDialogWithoutTarget(self): def OpenWhisperDialogWithoutTarget(self):
if not self.dlgWhisperWithoutTarget: if not self.dlgWhisperWithoutTarget:
dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog) dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog)
@@ -1408,7 +1416,7 @@ class Interface(object):
self.dlgWhisperWithoutTarget.SetTop() self.dlgWhisperWithoutTarget.SetTop()
self.dlgWhisperWithoutTarget.OpenWithoutTarget(self.RegisterTemporaryWhisperDialog) self.dlgWhisperWithoutTarget.OpenWithoutTarget(self.RegisterTemporaryWhisperDialog)
## 이름 없는 대화창에서 이름을 결정했을때 WhisperDialogDict에 창을 넣어주는 함수 ## <EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȭâ<C8AD><C3A2><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WhisperDialogDict<EFBFBD><EFBFBD> â<><C3A2> <20>־<EFBFBD><D6BE>ִ<EFBFBD> <20>Լ<EFBFBD>
def RegisterTemporaryWhisperDialog(self, name): def RegisterTemporaryWhisperDialog(self, name):
if not self.dlgWhisperWithoutTarget: if not self.dlgWhisperWithoutTarget:
return return
@@ -1427,7 +1435,7 @@ class Interface(object):
self.dlgWhisperWithoutTarget = None self.dlgWhisperWithoutTarget = None
self.__CheckGameMaster(name) self.__CheckGameMaster(name)
## 캐릭터 메뉴의 1:1 대화 하기를 눌렀을때 이름을 가지고 바로 창을 여는 함수 ## ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޴<EFBFBD><DEB4><EFBFBD> 1:1 <20><>ȭ <20>ϱ<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
def OpenWhisperDialog(self, name): def OpenWhisperDialog(self, name):
if not self.whisperDialogDict.has_key(name): if not self.whisperDialogDict.has_key(name):
dlg = self.__MakeWhisperDialog(name) dlg = self.__MakeWhisperDialog(name)
@@ -1440,7 +1448,7 @@ class Interface(object):
if 0 != btn: if 0 != btn:
self.__DestroyWhisperButton(btn) self.__DestroyWhisperButton(btn)
## 다른 캐릭터로부터 메세지를 받았을때 일단 버튼만 띄워 두는 함수 ## <EFBFBD>ٸ<EFBFBD> ij<><C4B3><EFBFBD>ͷκ<CDB7><CEBA><EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20>޾<EFBFBD><DEBE><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><>ư<EFBFBD><C6B0> <20><><EFBFBD> <20>δ<EFBFBD> <20>Լ<EFBFBD>
def RecvWhisper(self, name): def RecvWhisper(self, name):
if not self.whisperDialogDict.has_key(name): if not self.whisperDialogDict.has_key(name):
btn = self.__FindWhisperButton(name) btn = self.__FindWhisperButton(name)
@@ -1459,7 +1467,7 @@ class Interface(object):
def MakeWhisperButton(self, name): def MakeWhisperButton(self, name):
self.__MakeWhisperButton(name) self.__MakeWhisperButton(name)
## 버튼을 눌렀을때 창을 여는 함수 ## <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
def ShowWhisperDialog(self, btn): def ShowWhisperDialog(self, btn):
try: try:
self.__MakeWhisperDialog(btn.name) self.__MakeWhisperDialog(btn.name)
@@ -1471,11 +1479,11 @@ class Interface(object):
import dbg import dbg
dbg.TraceError("interface.ShowWhisperDialog - Failed to find key") dbg.TraceError("interface.ShowWhisperDialog - Failed to find key")
## 버튼 초기화 ## <EFBFBD><EFBFBD>ư <20>ʱ<EFBFBD>ȭ
self.__DestroyWhisperButton(btn) self.__DestroyWhisperButton(btn)
## WhisperDialog 창에서 최소화 명령을 수행했을때 호출되는 함수 ## WhisperDialog â<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3>Ǵ<EFBFBD> <20>Լ<EFBFBD>
## 창을 최소화 합니다. ## â<EFBFBD><EFBFBD> <20>ּ<EFBFBD>ȭ <20>մϴ<D5B4>.
def MinimizeWhisperDialog(self, name): def MinimizeWhisperDialog(self, name):
if 0 != name: if 0 != name:
@@ -1483,8 +1491,8 @@ class Interface(object):
self.CloseWhisperDialog(name) self.CloseWhisperDialog(name)
## WhisperDialog 창에서 닫기 명령을 수행했을때 호출되는 함수 ## WhisperDialog â<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3>Ǵ<EFBFBD> <20>Լ<EFBFBD>
## 창을 지웁니다. ## â<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϴ<EFBFBD>.
def CloseWhisperDialog(self, name): def CloseWhisperDialog(self, name):
if 0 == name: if 0 == name:
@@ -1503,7 +1511,7 @@ class Interface(object):
import dbg import dbg
dbg.TraceError("interface.CloseWhisperDialog - Failed to find key") dbg.TraceError("interface.CloseWhisperDialog - Failed to find key")
## 버튼의 개수가 바뀌었을때 버튼을 재정렬 하는 함수 ## <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ư<EFBFBD><C6B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20>Լ<EFBFBD>
def __ArrangeWhisperButton(self): def __ArrangeWhisperButton(self):
screenWidth = wndMgr.GetScreenWidth() screenWidth = wndMgr.GetScreenWidth()
@@ -1520,9 +1528,9 @@ class Interface(object):
button.SetPosition(xPos + (int(count/yCount) * -50), yPos + (count%yCount * 63)) button.SetPosition(xPos + (int(count/yCount) * -50), yPos + (count%yCount * 63))
count += 1 count += 1
## 이름으로 Whisper 버튼을 찾아 리턴해 주는 함수 ## <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Whisper <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> ã<><C3A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>Լ<EFBFBD>
## 버튼은 딕셔너리로 하지 않는 것은 정렬 되어 버려 순서가 유지 되지 않으며 ## <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> <20><>ųʸ<C5B3><CAB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
## 이로 인해 ToolTip들이 다른 버튼들에 의해 가려지기 때문이다. ## <EFBFBD>̷<EFBFBD> <20><><EFBFBD><EFBFBD> ToolTip<69><70><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><>ư<EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
def __FindWhisperButton(self, name): def __FindWhisperButton(self, name):
for button in self.whisperButtonList: for button in self.whisperButtonList:
if button.name == name: if button.name == name:
@@ -1530,7 +1538,7 @@ class Interface(object):
return 0 return 0
## 창을 만듭니다. ## â<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϴ<EFBFBD>.
def __MakeWhisperDialog(self, name): def __MakeWhisperDialog(self, name):
dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog) dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog)
dlgWhisper.BindInterface(self) dlgWhisper.BindInterface(self)
@@ -1542,7 +1550,7 @@ class Interface(object):
return dlgWhisper return dlgWhisper
## 버튼을 만듭니다. ## <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϴ<EFBFBD>.
def __MakeWhisperButton(self, name): def __MakeWhisperButton(self, name):
whisperButton = uiWhisper.WhisperButton() whisperButton = uiWhisper.WhisperButton()
whisperButton.SetUpVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") whisperButton.SetUpVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub")

View File

@@ -105,30 +105,40 @@ def DefineSkillIndexDict():
}, },
} }
def RegisterSkill(race, group, empire=0): def RegisterSkill(race, group, empire = 0):
DefineSkillIndexDict() DefineSkillIndexDict()
job = chr.RaceToJob(race) 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 ## Character Skill
if SKILL_INDEX_DICT.has_key(job): if SKILL_INDEX_DICT.has_key(job):
if SKILL_INDEX_DICT[job].has_key(group): if SKILL_INDEX_DICT[job].has_key(group):
activeSkillList = SKILL_INDEX_DICT[job][group] activeSkillList = SKILL_INDEX_DICT[job][group]
for i in xrange(len(activeSkillList)): for i in xrange(len(activeSkillList)):
skillIndex = activeSkillList[i] skillIndex = activeSkillList[i]
## 7번 8번 스킬은 여기서 설정하면 안됨 ## 7<EFBFBD><EFBFBD> 8<><38> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȵ<EFBFBD>
if i != 6 and i != 7: if i != 6 and i != 7:
player.SetSkill(i+1, skillIndex) player.SetSkill(i + 1, skillIndex)
supportSkillList = SKILL_INDEX_DICT[job]["SUPPORT"] supportSkillList = SKILL_INDEX_DICT[job]["SUPPORT"]
for i in xrange(len(supportSkillList)): for i in xrange(len(supportSkillList)):
player.SetSkill(i+100+1, supportSkillList[i]) player.SetSkill(i + 100 + 1, supportSkillList[i])
## Language Skill ## Language Skill
if 0 != empire: 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_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") chrmgr.RegisterCacheEffect(chrmgr.EFFECT_DXUP_PURPLE, "", "d:/ymir work/effect/etc/recuperation/drugup_purple.mse")
#자동물약 HP, SP #<EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> HP, SP
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_AUTO_HPUP, "", "d:/ymir work/effect/etc/recuperation/autodrugup_red.mse") 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") chrmgr.RegisterCacheEffect(chrmgr.EFFECT_AUTO_SPUP, "", "d:/ymir work/effect/etc/recuperation/autodrugup_blue.mse")
#라마단 초승달의 반지(71135) 착용순간 발동 이펙트 #<EFBFBD>󸶴<EFBFBD> <20>ʽ´<CABD><C2B4><EFBFBD> <20><><EFBFBD><EFBFBD>(71135) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_RAMADAN_RING_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item1.mse") chrmgr.RegisterCacheEffect(chrmgr.EFFECT_RAMADAN_RING_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item1.mse")
#할로윈 사탕 착용순간 발동 이펙트 #<EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_HALLOWEEN_CANDY_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item2.mse") chrmgr.RegisterCacheEffect(chrmgr.EFFECT_HALLOWEEN_CANDY_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item2.mse")
#행복의 반지 착용순간 발동 이펙트 #<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_HAPPINESS_RING_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item3.mse") chrmgr.RegisterCacheEffect(chrmgr.EFFECT_HAPPINESS_RING_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item3.mse")
#사랑의 팬던트 착용순간 발동 이펙트 #<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LOVE_PENDANT_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item4.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") 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_SUCCESS, "", "season1/effect/success.mse")
#chrmgr.RegisterCacheEffect(chrmgr.EFFECT_FAIL, "", "season1/effect/fail.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_ON_14_FOR_GERMANY, "","season1/effect/paymessage_warning.mse") #<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 14<31>϶<EFBFBD> ( <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> )
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_UNDER_15_FOR_GERMANY, "", "season1/effect/paymessage_decide.mse" )#레벨업 15일때 ( 독일전용 ) chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_UNDER_15_FOR_GERMANY, "", "season1/effect/paymessage_decide.mse" )#<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 15<31>϶<EFBFBD> ( <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> )
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_PERCENT_DAMAGE1, "", "d:/ymir work/effect/hit/percent_damage1.mse") 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") 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) chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+0, "Bip01", localeInfo.FN_GM_MARK)
# END_OF_LOCALE # 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") ## <EFBFBD>ߵ<EFBFBD>
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+4, "", "d:/ymir work/effect/affect/slow.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+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+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+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+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+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+16, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse") ## õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>ؿ<EFBFBD><D8BF><EFBFBD> <20>ֵ<EFBFBD>-_-)
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+17, "", "d:/ymir work/pc/assassin/effect/gyeonggong_loop.mse") ## 자객 - 경공 chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+17, "", "d:/ymir work/pc/assassin/effect/gyeonggong_loop.mse") ## <EFBFBD>ڰ<EFBFBD> - <20><><EFBFBD>
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+19, "Bip01 R Finger2", "d:/ymir work/pc/sura/effect/gwigeom_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+20, "", "d:/ymir work/pc/sura/effect/fear_loop.mse") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD>
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+21, "", "d:/ymir work/pc/sura/effect/jumagap_loop.mse") ## 수라 - 주마갑 chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+21, "", "d:/ymir work/pc/sura/effect/jumagap_loop.mse") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20>ָ<EFBFBD><D6B8><EFBFBD>
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+22, "", "d:/ymir work/pc/shaman/effect/3hosin_loop.mse") ## 무당 - 호신 chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+22, "", "d:/ymir work/pc/shaman/effect/3hosin_loop.mse") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> - ȣ<><C8A3>
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+23, "", "d:/ymir work/pc/shaman/effect/boho_loop.mse") ## 무당 - 보호 chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+23, "", "d:/ymir work/pc/shaman/effect/boho_loop.mse") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><>ȣ
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+24, "", "d:/ymir work/pc/shaman/effect/10kwaesok_loop.mse") ## 무당 - 쾌속 chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+24, "", "d:/ymir work/pc/shaman/effect/10kwaesok_loop.mse") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD>
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+25, "", "d:/ymir work/pc/sura/effect/heuksin_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+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+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+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+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+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") ## õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Fallen)
## 34 Polymoph ## 34 Polymoph
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+35, "", "d:/ymir work/effect/etc/guild_war_flag/flag_red.mse") 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") 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") chrmgr.RegisterEffect(chrmgr.EFFECT_REFINED+20, "Bip01", "D:/ymir work/pc/common/effect/armor/armor-4-2-2.mse")
## FlyData ## 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_EXP, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_yellow_small2.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (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_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_small.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (HP) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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_HP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_big.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (HP) ū<EFBFBD><EFBFBD>
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_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_warrior_small.msf") ## <EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ°<D6B4>
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_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_small.msf") ## <EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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_SP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_big.msf") ## <EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD> ū<><C5AB>
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_FIREWORK1, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_1.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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_FIREWORK2, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_2.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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_FIREWORK3, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_3.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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_FIREWORK4, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_4.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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_FIREWORK5, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_5.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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_FIREWORK6, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_6.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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_FIREWORK_XMAS, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_xmas.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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_CHAIN_LIGHTNING, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/pc/shaman/effect/pokroe.msf") ## <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD>
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_HP_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_smallest.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ſ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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_SKILL_MUYEONG, effect.INDEX_FLY_TYPE_AUTO_FIRE, "d:/ymir work/pc/sura/effect/muyeong_fly.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
######################################################################################### #########################################################################################
## Emoticon ## Emoticon
EmoticonStr = "d:/ymir work/effect/etc/emoticon/" EmoticonStr = "d:/ymir work/effect/etc/emoticon/"
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+0, "", EmoticonStr+"sweat.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+0, "", EmoticonStr+"sweat.mse")
net.RegisterEmoticonString("(황당)") net.RegisterEmoticonString("(Ȳ<EFBFBD><EFBFBD>)")
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+1, "", EmoticonStr+"money.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+1, "", EmoticonStr+"money.mse")
net.RegisterEmoticonString("()") net.RegisterEmoticonString("(<EFBFBD><EFBFBD>)")
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+2, "", EmoticonStr+"happy.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+2, "", EmoticonStr+"happy.mse")
net.RegisterEmoticonString("(기쁨)") net.RegisterEmoticonString("(<EFBFBD><EFBFBD><EFBFBD>)")
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+3, "", EmoticonStr+"love_s.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+3, "", EmoticonStr+"love_s.mse")
net.RegisterEmoticonString("(좋아)") net.RegisterEmoticonString("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)")
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+4, "", EmoticonStr+"love_l.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+4, "", EmoticonStr+"love_l.mse")
net.RegisterEmoticonString("(사랑)") net.RegisterEmoticonString("(<EFBFBD><EFBFBD><EFBFBD>)")
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+5, "", EmoticonStr+"angry.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+5, "", EmoticonStr+"angry.mse")
net.RegisterEmoticonString("(분노)") net.RegisterEmoticonString("(<EFBFBD>г<EFBFBD>)")
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+6, "", EmoticonStr+"aha.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+6, "", EmoticonStr+"aha.mse")
net.RegisterEmoticonString("(아하)") net.RegisterEmoticonString("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)")
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+7, "", EmoticonStr+"gloom.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+7, "", EmoticonStr+"gloom.mse")
net.RegisterEmoticonString("(우울)") net.RegisterEmoticonString("(<EFBFBD><EFBFBD><EFBFBD>)")
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+8, "", EmoticonStr+"sorry.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+8, "", EmoticonStr+"sorry.mse")
net.RegisterEmoticonString("(죄송)") net.RegisterEmoticonString("(<EFBFBD>˼<EFBFBD>)")
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+9, "", EmoticonStr+"!_mix_back.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+9, "", EmoticonStr+"!_mix_back.mse")
net.RegisterEmoticonString("(!)") net.RegisterEmoticonString("(!)")
@@ -1128,7 +1138,7 @@ def __LoadGameShamanEx(race, path):
#chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_GENERAL, chr.MOTION_SKILL+10, "budong.msa") #chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_GENERAL, chr.MOTION_SKILL+10, "budong.msa")
START_INDEX = 0 START_INDEX = 0
#skill.SKILL_EFFECT_COUNT 까지// #skill.SKILL_EFFECT_COUNT <EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
for i in (1, 2, 3): for i in (1, 2, 3):
END_STRING = "" END_STRING = ""
if i != 0: END_STRING = "_%d" % (i+1) if i != 0: END_STRING = "_%d" % (i+1)
@@ -1335,7 +1345,7 @@ def LoadGuildBuildingList(filename):
elif itemID == uiGuild.MATERIAL_PLYWOOD_ID: elif itemID == uiGuild.MATERIAL_PLYWOOD_ID:
materialList[uiGuild.MATERIAL_PLYWOOD_INDEX] = count materialList[uiGuild.MATERIAL_PLYWOOD_INDEX] = count
## GuildSymbol 은 일반 NPC 들과 함께 등록한다. ## GuildSymbol <EFBFBD><EFBFBD> <20>Ϲ<EFBFBD> NPC <20><><EFBFBD> <20>Բ<EFBFBD> <20><><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
import chrmgr import chrmgr
chrmgr.RegisterRaceSrcName(name, folderName) chrmgr.RegisterRaceSrcName(name, folderName)
chrmgr.RegisterRaceName(vnum, name) chrmgr.RegisterRaceName(vnum, name)

View File

@@ -1,6 +1,6 @@
SERVER_NAME = "Metin2" SERVER_NAME = "Metin2"
SERVER_NAME_TEST = "Test" SERVER_NAME_TEST = "Test"
SERVER_IP = "10.246.140.76" SERVER_IP = "10.122.201.77"
SERVER_IP_TEST = "127.0.0.1" SERVER_IP_TEST = "127.0.0.1"
CH1_NAME = "CH1" CH1_NAME = "CH1"
CH2_NAME = "CH2" CH2_NAME = "CH2"

View File

@@ -885,7 +885,7 @@ class ExpandedImageBox(ImageBox):
def SetRenderingMode(self, mode): def SetRenderingMode(self, mode):
wndMgr.SetRenderingMode(self.hWnd, mode) wndMgr.SetRenderingMode(self.hWnd, mode)
# [0.0, 1.0] 사이의 값만큼 퍼센트로 그리지 않는다. # [0.0, 1.0] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ŭ <20>ۼ<EFBFBD>Ʈ<EFBFBD><C6AE> <20>׸<EFBFBD><D7B8><EFBFBD> <20>ʴ´<CAB4>.
def SetRenderingRect(self, left, top, right, bottom): def SetRenderingRect(self, left, top, right, bottom):
wndMgr.SetRenderingRect(self.hWnd, left, top, right, bottom) wndMgr.SetRenderingRect(self.hWnd, left, top, right, bottom)
@@ -1374,17 +1374,29 @@ class SlotWindow(Window):
return wndMgr.GetSlotCount(self.hWnd) return wndMgr.GetSlotCount(self.hWnd)
def SetUseMode(self, flag): def SetUseMode(self, flag):
"True일때만 ItemToItem 이 가능한지 보여준다" "True<EFBFBD>϶<EFBFBD><EFBFBD><EFBFBD> ItemToItem <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>"
wndMgr.SetUseMode(self.hWnd, flag) wndMgr.SetUseMode(self.hWnd, flag)
def SetUsableItem(self, flag): def SetUsableItem(self, flag):
"True면 현재 가리킨 아이템이 ItemToItem 적용 가능하다" "True<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ItemToItem <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>"
wndMgr.SetUsableItem(self.hWnd, flag) wndMgr.SetUsableItem(self.hWnd, flag)
## Slot ## Slot
def SetSlotCoolTime(self, slotIndex, coolTime, elapsedTime = 0.0): def SetSlotCoolTime(self, slotIndex, coolTime, elapsedTime = 0.0):
wndMgr.SetSlotCoolTime(self.hWnd, slotIndex, coolTime, elapsedTime) 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): def DisableSlot(self, slotIndex):
wndMgr.DisableSlot(self.hWnd, slotIndex) wndMgr.DisableSlot(self.hWnd, slotIndex)
@@ -1536,7 +1548,7 @@ class TitleBar(Window):
def MakeTitleBar(self, width, color): def MakeTitleBar(self, width, color):
## 현재 Color는 사용하고 있지 않음 ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Color<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
width = max(64, width) width = max(64, width)
@@ -2767,8 +2779,8 @@ class PythonScriptLoader(object):
print "===== Load Script File : %s" % (FileName) print "===== Load Script File : %s" % (FileName)
try: try:
# chr, player 등은 sandbox 내에서 import가 허용되지 않기 때문에,(봇이 악용할 여지가 매우 큼.) # chr, player <EFBFBD><EFBFBD><EFBFBD><EFBFBD> sandbox <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> import<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,(<28><><EFBFBD><EFBFBD> <20>ǿ<EFBFBD><C7BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ſ<EFBFBD> ŭ.)
# 미리 script dictionary에 필요한 상수를 넣어놓는다. # <EFBFBD≯<EFBFBD> script dictionary<EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD>´<EFBFBD>.
import chr import chr
import player import player
import app import app

View File

@@ -50,7 +50,11 @@ class CharacterWindow(ui.ScriptWindow):
SUPPORT_PAGE_SLOT_COUNT = 12 SUPPORT_PAGE_SLOT_COUNT = 12
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 = { SKILL_GROUP_NAME_DICT = {
playerSettingModule.JOB_WARRIOR : { 1 : localeInfo.SKILL_GROUP_WARRIOR_1, 2 : localeInfo.SKILL_GROUP_WARRIOR_2, }, 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.supportSkillPointValue = None
self.skillGroupButton1 = None self.skillGroupButton1 = None
self.skillGroupButton2 = None self.skillGroupButton2 = None
if app.FIX_HORSE_SKILLS_TAB:
self.skillGroupButton3 = None
self.activeSkillGroupName = None self.activeSkillGroupName = None
self.guildNameSlot = None self.guildNameSlot = None
@@ -178,6 +186,10 @@ class CharacterWindow(ui.ScriptWindow):
self.supportSkillPointValue = self.GetChild("Support_Skill_Point_Value") self.supportSkillPointValue = self.GetChild("Support_Skill_Point_Value")
self.skillGroupButton1 = self.GetChild("Skill_Group_Button_1") self.skillGroupButton1 = self.GetChild("Skill_Group_Button_1")
self.skillGroupButton2 = self.GetChild("Skill_Group_Button_2") 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.activeSkillGroupName = self.GetChild("Active_Skill_Group_Name")
self.tabDict = { self.tabDict = {
@@ -237,11 +249,12 @@ class CharacterWindow(ui.ScriptWindow):
self.skillGroupButton = ( self.skillGroupButton = (
self.GetChild("Skill_Group_Button_1"), self.GetChild("Skill_Group_Button_1"),
self.GetChild("Skill_Group_Button_2"), 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 SHOW_ONLY_ACTIVE_SKILL
global HIDE_SUPPORT_SKILL_POINT global HIDE_SUPPORT_SKILL_POINT
if SHOW_ONLY_ACTIVE_SKILL or HIDE_SUPPORT_SKILL_POINT: if SHOW_ONLY_ACTIVE_SKILL or HIDE_SUPPORT_SKILL_POINT:
self.GetChild("Support_Skill_Point_Label").Hide() self.GetChild("Support_Skill_Point_Label").Hide()
@@ -253,6 +266,7 @@ class CharacterWindow(ui.ScriptWindow):
self.questScrollBar = self.GetChild("Quest_ScrollBar") self.questScrollBar = self.GetChild("Quest_ScrollBar")
self.questScrollBar.SetScrollEvent(ui.__mem_func__(self.OnQuestScroll)) self.questScrollBar.SetScrollEvent(ui.__mem_func__(self.OnQuestScroll))
self.questSlot = self.GetChild("Quest_Slot") self.questSlot = self.GetChild("Quest_Slot")
for i in xrange(quest.QUEST_MAX_NUM): for i in xrange(quest.QUEST_MAX_NUM):
self.questSlot.HideSlotBaseImage(i) self.questSlot.HideSlotBaseImage(i)
self.questSlot.SetCoverButton(i,\ self.questSlot.SetCoverButton(i,\
@@ -264,6 +278,7 @@ class CharacterWindow(ui.ScriptWindow):
self.questNameList = [] self.questNameList = []
self.questLastTimeList = [] self.questLastTimeList = []
self.questLastCountList = [] self.questLastCountList = []
for i in xrange(quest.QUEST_MAX_NUM): for i in xrange(quest.QUEST_MAX_NUM):
self.questNameList.append(self.GetChild("Quest_Name_0" + str(i))) self.questNameList.append(self.GetChild("Quest_Name_0" + str(i)))
self.questLastTimeList.append(self.GetChild("Quest_LastTime_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") "d:/ymir work/ui/game/windows/btn_plus_down.sub")
def __SetEmotionSlot(self): def __SetEmotionSlot(self):
self.emotionToolTip = uiToolTip.ToolTip() self.emotionToolTip = uiToolTip.ToolTip()
for slot in (self.soloEmotionSlot, self.dualEmotionSlot): for slot in (self.soloEmotionSlot, self.dualEmotionSlot):
@@ -302,6 +316,7 @@ class CharacterWindow(ui.ScriptWindow):
emotionIdx = slotIdx emotionIdx = slotIdx
slot = self.soloEmotionSlot slot = self.soloEmotionSlot
if slotIdx > 50: if slotIdx > 50:
slot = self.dualEmotionSlot slot = self.dualEmotionSlot
@@ -314,16 +329,19 @@ class CharacterWindow(ui.ScriptWindow):
if app.IsPressed(app.DIK_LCONTROL): if app.IsPressed(app.DIK_LCONTROL):
player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_EMOTION, slotIndex) player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_EMOTION, slotIndex)
return return
mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_EMOTION, slotIndex, slotIndex) mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_EMOTION, slotIndex, slotIndex)
def __ClickEmotionSlot(self, slotIndex): def __ClickEmotionSlot(self, slotIndex):
print "click emotion" print "click emotion"
if not slotIndex in emotion.EMOTION_DICT: if not slotIndex in emotion.EMOTION_DICT:
return return
print "check acting" print "check acting"
if player.IsActingEmotion(): if player.IsActingEmotion():
return return
@@ -336,6 +354,7 @@ class CharacterWindow(ui.ScriptWindow):
if 0 == vid or vid == player.GetMainCharacterIndex() or chr.IsNPC(vid) or chr.IsEnemy(vid): if 0 == vid or vid == player.GetMainCharacterIndex() or chr.IsNPC(vid) or chr.IsEnemy(vid):
import chat import chat
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.EMOTION_CHOOSE_ONE) chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.EMOTION_CHOOSE_ONE)
return return
command += " " + chr.GetNameByVID(vid) command += " " + chr.GetNameByVID(vid)
@@ -521,7 +540,7 @@ class CharacterWindow(ui.ScriptWindow):
except: except:
#import exception #import exception
#exception.Abort("CharacterWindow.RefreshStatus.BindObject") #exception.Abort("CharacterWindow.RefreshStatus.BindObject")
## 게임이 튕겨 버림 ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƨ<><C6A8> <20><><EFBFBD><EFBFBD>
pass pass
self.__RefreshStatusPlusButtonList() self.__RefreshStatusPlusButtonList()
@@ -595,25 +614,21 @@ class CharacterWindow(ui.ScriptWindow):
statusPlusButton.Hide() statusPlusButton.Hide()
def SelectSkill(self, skillSlotIndex): def SelectSkill(self, skillSlotIndex):
mouseController = mouseModule.mouseController mouseController = mouseModule.mouseController
if False == mouseController.isAttached(): if False == mouseController.isAttached():
srcSlotIndex = self.__RealSkillSlotToSourceSlot(skillSlotIndex) srcSlotIndex = self.__RealSkillSlotToSourceSlot(skillSlotIndex)
selectedSkillIndex = player.GetSkillIndex(srcSlotIndex) selectedSkillIndex = player.GetSkillIndex(srcSlotIndex)
if skill.CanUseSkill(selectedSkillIndex): if skill.CanUseSkill(selectedSkillIndex):
if app.IsPressed(app.DIK_LCONTROL): if app.IsPressed(app.DIK_LCONTROL):
player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_SKILL, srcSlotIndex) player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_SKILL, srcSlotIndex)
return return
mouseController.AttachObject(self, player.SLOT_TYPE_SKILL, srcSlotIndex, selectedSkillIndex) mouseController.AttachObject(self, player.SLOT_TYPE_SKILL, srcSlotIndex, selectedSkillIndex)
else: else:
mouseController.DeattachObject() mouseController.DeattachObject()
def SelectEmptySlot(self, SlotIndex): def SelectEmptySlot(self, SlotIndex):
@@ -621,7 +636,6 @@ class CharacterWindow(ui.ScriptWindow):
## ToolTip ## ToolTip
def OverInItem(self, slotNumber): def OverInItem(self, slotNumber):
if mouseModule.mouseController.isAttached(): if mouseModule.mouseController.isAttached():
return return
@@ -728,6 +742,7 @@ class CharacterWindow(ui.ScriptWindow):
def __GetStatMinusPoint(self): def __GetStatMinusPoint(self):
POINT_STAT_RESET_COUNT = 112 POINT_STAT_RESET_COUNT = 112
return player.GetStatus(POINT_STAT_RESET_COUNT) return player.GetStatus(POINT_STAT_RESET_COUNT)
def __OverInStatMinusButton(self, stat): def __OverInStatMinusButton(self, stat):
@@ -761,6 +776,7 @@ class CharacterWindow(ui.ScriptWindow):
def OnPressEscapeKey(self): def OnPressEscapeKey(self):
self.Close() self.Close()
return True return True
def OnUpdate(self): def OnUpdate(self):
@@ -771,20 +787,20 @@ class CharacterWindow(ui.ScriptWindow):
global SHOW_LIMIT_SUPPORT_SKILL_LIST global SHOW_LIMIT_SUPPORT_SKILL_LIST
skillPage = self.skillPageDict[name] skillPage = self.skillPageDict[name]
startSlotIndex = skillPage.GetStartIndex() startSlotIndex = skillPage.GetStartIndex()
if "ACTIVE" == name: if "ACTIVE" == name:
if self.PAGE_HORSE == self.curSelectedSkillGroup: if self.PAGE_HORSE == self.curSelectedSkillGroup:
startSlotIndex += slotCount startSlotIndex += slotCount
getSkillType=skill.GetSkillType getSkillType = skill.GetSkillType
getSkillIndex=player.GetSkillIndex getSkillIndex = player.GetSkillIndex
getSkillGrade=player.GetSkillGrade getSkillGrade = player.GetSkillGrade
getSkillLevel=player.GetSkillLevel getSkillLevel = player.GetSkillLevel
getSkillLevelUpPoint=skill.GetSkillLevelUpPoint getSkillLevelUpPoint = skill.GetSkillLevelUpPoint
getSkillMaxLevel=skill.GetSkillMaxLevel getSkillMaxLevel = skill.GetSkillMaxLevel
for i in xrange(slotCount+1):
for i in xrange(slotCount + 1):
slotIndex = i + startSlotIndex slotIndex = i + startSlotIndex
skillIndex = getSkillIndex(slotIndex) skillIndex = getSkillIndex(slotIndex)
@@ -798,7 +814,7 @@ class CharacterWindow(ui.ScriptWindow):
skillLevel = getSkillLevel(slotIndex) skillLevel = getSkillLevel(slotIndex)
skillType = getSkillType(skillIndex) skillType = getSkillType(skillIndex)
## 승마 스킬 예외 처리 ## <EFBFBD>¸<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> ó<><C3B3>
if player.SKILL_INDEX_RIDING == skillIndex: if player.SKILL_INDEX_RIDING == skillIndex:
if 1 == skillGrade: if 1 == skillGrade:
skillLevel += 19 skillLevel += 19
@@ -807,48 +823,116 @@ class CharacterWindow(ui.ScriptWindow):
elif 3 == skillGrade: elif 3 == skillGrade:
skillLevel = 40 skillLevel = 40
skillPage.SetSkillSlotNew(slotIndex, skillIndex, max(skillLevel-1, 0), skillLevel) skillPage.SetSkillSlotNew(slotIndex, skillIndex, max(skillLevel - 1, 0), skillLevel)
skillPage.SetSlotCount(slotIndex, skillLevel) skillPage.SetSlotCount(slotIndex, skillLevel)
## ACTIVE ## ACTIVE
elif skill.SKILL_TYPE_ACTIVE == skillType: elif skill.SKILL_TYPE_ACTIVE == skillType:
for j in xrange(skill.SKILL_GRADE_COUNT): for j in xrange(skill.SKILL_GRADE_COUNT):
realSlotIndex = self.__GetRealSkillSlot(j, slotIndex) realSlotIndex = self.__GetRealSkillSlot(j, slotIndex)
skillPage.SetSkillSlotNew(realSlotIndex, skillIndex, j, skillLevel) skillPage.SetSkillSlotNew(realSlotIndex, skillIndex, j, skillLevel)
skillPage.SetCoverButton(realSlotIndex) 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) skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)
elif (not self.__CanUseSkillNow()) or (skillGrade != j): elif (not self.__CanUseSkillNow()) or (skillGrade != j):
skillPage.SetSlotCount(realSlotIndex, 0) skillPage.SetSlotCount(realSlotIndex, 0)
skillPage.DisableCoverButton(realSlotIndex) 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: else:
skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel) 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: else:
if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST: if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST:
realSlotIndex = self.__GetETCSkillRealSlotIndex(slotIndex) realSlotIndex = self.__GetETCSkillRealSlotIndex(slotIndex)
skillPage.SetSkillSlot(realSlotIndex, skillIndex, skillLevel) skillPage.SetSkillSlot(realSlotIndex, skillIndex, skillLevel)
skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel) skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)
if skill.CanUseSkill(skillIndex): if skill.CanUseSkill(skillIndex):
skillPage.SetCoverButton(realSlotIndex) 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() 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): def RefreshSkill(self):
if self.isLoaded == 0:
if self.isLoaded==0:
return return
if self.__IsChangedHorseRidingSkillLevel(): 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() self.RefreshCharacter()
return return
global SHOW_ONLY_ACTIVE_SKILL global SHOW_ONLY_ACTIVE_SKILL
if SHOW_ONLY_ACTIVE_SKILL: if SHOW_ONLY_ACTIVE_SKILL:
self.__RefreshSkillPage("ACTIVE", self.ACTIVE_PAGE_SLOT_COUNT) self.__RefreshSkillPage("ACTIVE", self.ACTIVE_PAGE_SLOT_COUNT)
else: else:
@@ -858,12 +942,11 @@ class CharacterWindow(ui.ScriptWindow):
self.RefreshSkillPlusButtonList() self.RefreshSkillPlusButtonList()
def CanShowPlusButton(self, skillIndex, skillLevel, curStatPoint): def CanShowPlusButton(self, skillIndex, skillLevel, curStatPoint):
## <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
## 스킬이 있으면
if 0 == skillIndex: if 0 == skillIndex:
return False return False
## 레벨업 조건을 만족한다면 ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵٸ<D1B4>
if not skill.CanLevelUpSkill(skillIndex, skillLevel): if not skill.CanLevelUpSkill(skillIndex, skillLevel):
return False return False
@@ -871,6 +954,7 @@ class CharacterWindow(ui.ScriptWindow):
def __RefreshSkillPlusButton(self, name): def __RefreshSkillPlusButton(self, name):
global HIDE_SUPPORT_SKILL_POINT global HIDE_SUPPORT_SKILL_POINT
if HIDE_SUPPORT_SKILL_POINT and "SUPPORT" == name: if HIDE_SUPPORT_SKILL_POINT and "SUPPORT" == name:
return return
@@ -878,11 +962,13 @@ class CharacterWindow(ui.ScriptWindow):
slotWindow.HideAllSlotButton() slotWindow.HideAllSlotButton()
slotStatType = self.skillPageStatDict[name] slotStatType = self.skillPageStatDict[name]
if 0 == slotStatType: if 0 == slotStatType:
return return
statPoint = player.GetStatus(slotStatType) statPoint = player.GetStatus(slotStatType)
startSlotIndex = slotWindow.GetStartIndex() startSlotIndex = slotWindow.GetStartIndex()
if "HORSE" == name: if "HORSE" == name:
startSlotIndex += self.ACTIVE_PAGE_SLOT_COUNT startSlotIndex += self.ACTIVE_PAGE_SLOT_COUNT
@@ -904,7 +990,7 @@ class CharacterWindow(ui.ScriptWindow):
slotWindow.ShowSlotButton(self.__GetETCSkillRealSlotIndex(slotIndex)) slotWindow.ShowSlotButton(self.__GetETCSkillRealSlotIndex(slotIndex))
else: else:
if "SUPPORT" == name: if "SUPPORT" == name:
if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST: if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST:
if self.CanShowPlusButton(skillIndex, skillLevel, statPoint): if self.CanShowPlusButton(skillIndex, skillLevel, statPoint):
slotWindow.ShowSlotButton(slotIndex) slotWindow.ShowSlotButton(slotIndex)
@@ -914,7 +1000,6 @@ class CharacterWindow(ui.ScriptWindow):
def RefreshSkillPlusButtonList(self): def RefreshSkillPlusButtonList(self):
if self.isLoaded==0: if self.isLoaded==0:
return return
@@ -933,6 +1018,7 @@ class CharacterWindow(ui.ScriptWindow):
except: except:
import exception import exception
exception.Abort("CharacterWindow.RefreshSkillPlusButtonList.BindObject") exception.Abort("CharacterWindow.RefreshSkillPlusButtonList.BindObject")
def RefreshSkillPlusPointLabel(self): def RefreshSkillPlusPointLabel(self):
@@ -979,10 +1065,9 @@ class CharacterWindow(ui.ScriptWindow):
mouseModule.mouseController.DeattachObject() mouseModule.mouseController.DeattachObject()
## FIXME : 스킬을 사용했을때 슬롯 번호를 가지고 해당 슬롯을 찾아서 업데이트 한다. ## FIXME : <EFBFBD><EFBFBD>ų<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ѵ<EFBFBD>.
## 매우 불합리. 구조 자체를 개선해야 할듯. ## <EFBFBD>ſ<EFBFBD> <20><><EFBFBD>ո<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>ҵ<EFBFBD>.
def OnUseSkill(self, slotIndex, coolTime): def OnUseSkill(self, slotIndex, coolTime):
skillIndex = player.GetSkillIndex(slotIndex) skillIndex = player.GetSkillIndex(slotIndex)
skillType = skill.GetSkillType(skillIndex) skillType = skill.GetSkillType(skillIndex)
@@ -996,32 +1081,69 @@ class CharacterWindow(ui.ScriptWindow):
for slotWindow in self.skillPageDict.values(): for slotWindow in self.skillPageDict.values():
if slotWindow.HasSlot(slotIndex): if slotWindow.HasSlot(slotIndex):
slotWindow.SetSlotCoolTime(slotIndex, coolTime) slotWindow.StoreSlotCoolTime(skillType, slotIndex, coolTime)
self.__RestoreSlotCoolTime(slotWindow)
return return
def OnActivateSkill(self, slotIndex): def OnActivateSkill(self, slotIndex):
skillIndex = player.GetSkillIndex(slotIndex)
skillGrade = player.GetSkillGrade(slotIndex) skillType = skill.GetSkillType(skillIndex)
slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)
## 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(): for slotWindow in self.skillPageDict.values():
if slotWindow.HasSlot(slotIndex): if slotWindow.HasSlot(slotIndex):
slotWindow.ActivateSlot(slotIndex) slotWindow.ActivateSlot(slotIndex)
return return
def OnDeactivateSkill(self, slotIndex): def OnDeactivateSkill(self, slotIndex):
skillIndex = player.GetSkillIndex(slotIndex)
skillGrade = player.GetSkillGrade(slotIndex) skillType = skill.GetSkillType(skillIndex)
slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)
## 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(): for slotWindow in self.skillPageDict.values():
if slotWindow.HasSlot(slotIndex): if slotWindow.HasSlot(slotIndex):
slotWindow.DeactivateSlot(slotIndex) slotWindow.DeactivateSlot(slotIndex)
return return
def __ShowJobToolTip(self): def __ShowJobToolTip(self):
self.toolTipJob.ShowToolTip() 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): def __HideJobToolTip(self):
self.toolTipJob.HideToolTip() self.toolTipJob.HideToolTip()
@@ -1037,6 +1159,7 @@ class CharacterWindow(ui.ScriptWindow):
jobInfoData=localeInfo.JOBINFO_DATA_LIST[mainJob][subJob] jobInfoData=localeInfo.JOBINFO_DATA_LIST[mainJob][subJob]
except IndexError: except IndexError:
print "uiCharacter.CharacterWindow.__SetJobText(mainJob=%d, subJob=%d)" % (mainJob, subJob) print "uiCharacter.CharacterWindow.__SetJobText(mainJob=%d, subJob=%d)" % (mainJob, subJob)
return return
self.toolTipJob.AutoAppendTextLine(jobInfoTitle) self.toolTipJob.AutoAppendTextLine(jobInfoTitle)
@@ -1105,18 +1228,16 @@ class CharacterWindow(ui.ScriptWindow):
## GroupName ## GroupName
self.__SetSkillGroupName(race, group) self.__SetSkillGroupName(race, group)
self.__SetSkillSlotData(race, group, empire)
## Skill ## Skill
if 0 == group: if 0 == group:
self.__SelectSkillGroup(0) self.__SelectSkillGroup(0)
else: else:
self.__SetSkillSlotData(race, group, empire)
if self.__CanUseHorseSkill(): if self.__CanUseHorseSkill():
self.__SelectSkillGroup(0) self.__SelectSkillGroup(0)
def __SetSkillGroupName(self, race, group): def __SetSkillGroupName(self, race, group):
job = chr.RaceToJob(race) job = chr.RaceToJob(race)
if not self.SKILL_GROUP_NAME_DICT.has_key(job): if not self.SKILL_GROUP_NAME_DICT.has_key(job):
@@ -1127,27 +1248,43 @@ class CharacterWindow(ui.ScriptWindow):
if 0 == group: if 0 == group:
self.skillGroupButton1.SetText(nameList[1]) self.skillGroupButton1.SetText(nameList[1])
self.skillGroupButton2.SetText(nameList[2]) 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.skillGroupButton1.Show()
self.skillGroupButton2.Show() self.skillGroupButton2.Show()
self.activeSkillGroupName.Hide() self.activeSkillGroupName.Hide()
else: else:
if self.__CanUseHorseSkill(): if self.__CanUseHorseSkill():
self.activeSkillGroupName.Hide() self.activeSkillGroupName.Hide()
self.skillGroupButton1.SetText(nameList.get(group, "Noname")) 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: else:
self.activeSkillGroupName.SetText(nameList.get(group, "Noname")) self.activeSkillGroupName.SetText(nameList.get(group, "Noname"))
self.activeSkillGroupName.Show() self.activeSkillGroupName.Show()
self.skillGroupButton1.Hide() self.skillGroupButton1.Hide()
self.skillGroupButton2.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 ## SkillIndex
playerSettingModule.RegisterSkill(race, group, empire) playerSettingModule.RegisterSkill(race, group, empire)
@@ -1157,19 +1294,26 @@ class CharacterWindow(ui.ScriptWindow):
## Refresh ## Refresh
self.RefreshSkill() self.RefreshSkill()
def __SelectSkillGroup(self, index): def __SelectSkillGroup(self, pageIndex, (PAGE_SKILL_1, PAGE_SKILL_2, PAGE_SKILL_HORSE) = range(3)):
for btn in self.skillGroupButton: for pageButton in self.skillGroupButton:
btn.SetUp() pageButton.SetUp()
self.skillGroupButton[index].Down()
if self.__CanUseHorseSkill(): self.skillGroupButton[pageIndex].Down()
if 0 == index:
index = net.GetMainActorSkillGroup()-1
elif 1 == index:
index = self.PAGE_HORSE
self.curSelectedSkillGroup = index if pageIndex in (PAGE_SKILL_1, PAGE_SKILL_2):
self.__SetSkillSlotData(net.GetMainActorRace(), index+1, net.GetMainActorEmpire()) 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): def __CanUseSkillNow(self):
if 0 == net.GetMainActorSkillGroup(): if 0 == net.GetMainActorSkillGroup():
@@ -1178,7 +1322,6 @@ class CharacterWindow(ui.ScriptWindow):
return True return True
def __CanUseHorseSkill(self): def __CanUseHorseSkill(self):
slotIndex = player.GetSkillSlotIndex(player.SKILL_INDEX_RIDING) slotIndex = player.GetSkillSlotIndex(player.SKILL_INDEX_RIDING)
if not slotIndex: if not slotIndex:
@@ -1186,12 +1329,27 @@ class CharacterWindow(ui.ScriptWindow):
grade = player.GetSkillGrade(slotIndex) grade = player.GetSkillGrade(slotIndex)
level = player.GetSkillLevel(slotIndex) level = player.GetSkillLevel(slotIndex)
if level < 0: if level < 0:
level *= -1 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): def __IsChangedHorseRidingSkillLevel(self):
ret = False ret = False

View File

@@ -13,7 +13,7 @@ import uiRefine
import uiAttachMetin import uiAttachMetin
import uiPickMoney import uiPickMoney
import uiCommon import uiCommon
import uiPrivateShopBuilder # 개인상점 열동안 ItemMove 방지 import uiPrivateShopBuilder # <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ItemMove <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
import localeInfo import localeInfo
import constInfo import constInfo
import ime import ime
@@ -41,7 +41,7 @@ class CostumeWindow(ui.ScriptWindow):
ui.ScriptWindow.__init__(self) ui.ScriptWindow.__init__(self)
self.isLoaded = 0 self.isLoaded = 0
self.wndInventory = wndInventory; self.wndInventory = wndInventory
self.__LoadWindow() self.__LoadWindow()
@@ -113,7 +113,7 @@ class BeltInventoryWindow(ui.ScriptWindow):
ui.ScriptWindow.__init__(self) ui.ScriptWindow.__init__(self)
self.isLoaded = 0 self.isLoaded = 0
self.wndInventory = wndInventory; self.wndInventory = wndInventory
self.wndBeltInventoryLayer = None self.wndBeltInventoryLayer = None
self.wndBeltInventorySlot = None self.wndBeltInventorySlot = None
@@ -156,7 +156,7 @@ class BeltInventoryWindow(ui.ScriptWindow):
if localeInfo.IsARABIC() == 0: if localeInfo.IsARABIC() == 0:
self.AdjustPositionAndSize() self.AdjustPositionAndSize()
## 현재 인벤토리 위치를 기준으로 BASE 위치를 계산, 리턴.. 숫자 하드코딩하기 정말 싫지만 방법이 없다.. ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BASE <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD>, <20><><EFBFBD><EFBFBD>.. <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5>ڵ<EFBFBD><DAB5>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
def GetBasePosition(self): def GetBasePosition(self):
x, y = self.wndInventory.GetGlobalPosition() x, y = self.wndInventory.GetGlobalPosition()
return x - 148, y + 241 return x - 148, y + 241
@@ -169,7 +169,7 @@ class BeltInventoryWindow(ui.ScriptWindow):
self.SetSize(self.ORIGINAL_WIDTH, self.GetHeight()) self.SetSize(self.ORIGINAL_WIDTH, self.GetHeight())
else: else:
self.SetPosition(bx + 138, by); self.SetPosition(bx + 138, by)
self.SetSize(10, self.GetHeight()) self.SetSize(10, self.GetHeight())
def __LoadWindow(self): def __LoadWindow(self):
@@ -251,13 +251,13 @@ class InventoryWindow(ui.ScriptWindow):
sellingSlotNumber = -1 sellingSlotNumber = -1
isLoaded = 0 isLoaded = 0
isOpenedCostumeWindowWhenClosingInventory = 0 # 인벤토리 닫을 때 코스츔이 열려있었는지 여부-_-; 네이밍 ㅈㅅ isOpenedCostumeWindowWhenClosingInventory = 0 # <EFBFBD>κ<EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><> <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-_-; <20><><EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD>
isOpenedBeltWindowWhenClosingInventory = 0 # 인벤토리 닫을 때 벨트 인벤토리가 열려있었는지 여부-_-; 네이밍 ㅈㅅ isOpenedBeltWindowWhenClosingInventory = 0 # <EFBFBD>κ<EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><> <20><>Ʈ <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-_-; <20><><EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD>
def __init__(self): def __init__(self):
ui.ScriptWindow.__init__(self) ui.ScriptWindow.__init__(self)
self.isOpenedBeltWindowWhenClosingInventory = 0 # 인벤토리 닫을 때 벨트 인벤토리가 열려있었는지 여부-_-; 네이밍 ㅈㅅ self.isOpenedBeltWindowWhenClosingInventory = 0 # <EFBFBD>κ<EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><> <20><>Ʈ <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-_-; <20><><EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD>
self.__LoadWindow() self.__LoadWindow()
@@ -269,11 +269,11 @@ class InventoryWindow(ui.ScriptWindow):
ui.ScriptWindow.Show(self) ui.ScriptWindow.Show(self)
# 인벤토리를 닫을 때 코스츔이 열려있었다면 인벤토리를 열 때 코스츔도 같이 열도록 함. # <EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>ٸ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><> <20><> <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
if self.isOpenedCostumeWindowWhenClosingInventory and self.wndCostume: if self.isOpenedCostumeWindowWhenClosingInventory and self.wndCostume:
self.wndCostume.Show() self.wndCostume.Show()
# 인벤토리를 닫을 때 벨트 인벤토리가 열려있었다면 같이 열도록 함. # <EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>Ʈ <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
if self.wndBelt: if self.wndBelt:
self.wndBelt.Show(self.isOpenedBeltWindowWhenClosingInventory) self.wndBelt.Show(self.isOpenedBeltWindowWhenClosingInventory)
@@ -439,11 +439,11 @@ class InventoryWindow(ui.ScriptWindow):
self.tooltipItem.HideToolTip() self.tooltipItem.HideToolTip()
if self.wndCostume: if self.wndCostume:
self.isOpenedCostumeWindowWhenClosingInventory = self.wndCostume.IsShow() # 인벤토리 창이 닫힐 때 코스츔이 열려 있었는가? self.isOpenedCostumeWindowWhenClosingInventory = self.wndCostume.IsShow() # <EFBFBD>κ<EFBFBD><EFBFBD>丮 â<><C3A2> <20><><EFBFBD><EFBFBD> <20><> <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE>°<EFBFBD>?
self.wndCostume.Close() self.wndCostume.Close()
if self.wndBelt: if self.wndBelt:
self.isOpenedBeltWindowWhenClosingInventory = self.wndBelt.IsOpeningInventory() # 인벤토리 창이 닫힐 때 벨트 인벤토리도 열려 있었는가? self.isOpenedBeltWindowWhenClosingInventory = self.wndBelt.IsOpeningInventory() # <EFBFBD>κ<EFBFBD><EFBFBD>丮 â<><C3A2> <20><><EFBFBD><EFBFBD> <20><> <20><>Ʈ <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE>°<EFBFBD>?
print "Is Opening Belt Inven?? ", self.isOpenedBeltWindowWhenClosingInventory print "Is Opening Belt Inven?? ", self.isOpenedBeltWindowWhenClosingInventory
self.wndBelt.Close() self.wndBelt.Close()
@@ -508,7 +508,7 @@ class InventoryWindow(ui.ScriptWindow):
self.dlgPickMoney.SetTitleName(localeInfo.PICK_MONEY_TITLE) self.dlgPickMoney.SetTitleName(localeInfo.PICK_MONEY_TITLE)
self.dlgPickMoney.SetAcceptEvent(ui.__mem_func__(self.OnPickMoney)) self.dlgPickMoney.SetAcceptEvent(ui.__mem_func__(self.OnPickMoney))
self.dlgPickMoney.Open(curMoney) self.dlgPickMoney.Open(curMoney)
self.dlgPickMoney.SetMax(7) # 인벤토리 990000 제한 버그 수정 self.dlgPickMoney.SetMax(7) # <EFBFBD>κ<EFBFBD><EFBFBD> 990000 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
def OnPickMoney(self, money): def OnPickMoney(self, money):
mouseModule.mouseController.AttachMoney(self, player.SLOT_TYPE_INVENTORY, money) mouseModule.mouseController.AttachMoney(self, player.SLOT_TYPE_INVENTORY, money)
@@ -533,7 +533,7 @@ class InventoryWindow(ui.ScriptWindow):
slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(i) slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(i)
itemCount = getItemCount(slotNumber) itemCount = getItemCount(slotNumber)
# itemCount == 0이면 소켓을 비운다. # itemCount == 0<EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if 0 == itemCount: if 0 == itemCount:
self.wndItem.ClearSlot(i) self.wndItem.ClearSlot(i)
continue continue
@@ -543,19 +543,19 @@ class InventoryWindow(ui.ScriptWindow):
itemVnum = getItemVNum(slotNumber) itemVnum = getItemVNum(slotNumber)
setItemVNum(i, itemVnum, itemCount) setItemVNum(i, itemVnum, itemCount)
## 자동물약 (HP: #72723 ~ #72726, SP: #72727 ~ #72730) 특수처리 - 아이템인데도 슬롯에 활성화/비활성화 표시를 위한 작업임 - [hyo] ## <EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (HP: #72723 ~ #72726, SP: #72727 ~ #72730) Ư<EFBFBD><EFBFBD>ó<EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD>Կ<EFBFBD> Ȱ<><C8B0>ȭ/<2F><>Ȱ<EFBFBD><C8B0>ȭ ǥ<>ø<EFBFBD> <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD> - [hyo]
if constInfo.IS_AUTO_POTION(itemVnum): if constInfo.IS_AUTO_POTION(itemVnum):
# metinSocket - [0] : 활성화 여부, [1] : 사용한 양, [2] : 최대 용량 # metinSocket - [0] : Ȱ<EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD>, [1] : <20><><EFBFBD><EFBFBD><EFBFBD> <20><>, [2] : <EFBFBD>ִ<EFBFBD> <20>
metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)] metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]
if slotNumber >= player.INVENTORY_PAGE_SIZE: if slotNumber >= player.INVENTORY_PAGE_SIZE * self.inventoryPageIndex:
slotNumber -= player.INVENTORY_PAGE_SIZE slotNumber -= player.INVENTORY_PAGE_SIZE * self.inventoryPageIndex
isActivated = 0 != metinSocket[0] isActivated = 0 != metinSocket[0]
if isActivated: if isActivated:
self.wndItem.ActivateSlot(slotNumber) self.wndItem.ActivateSlot(slotNumber)
potionType = 0; potionType = 0
if constInfo.IS_AUTO_POTION_HP(itemVnum): if constInfo.IS_AUTO_POTION_HP(itemVnum):
potionType = player.AUTO_POTION_TYPE_HP potionType = player.AUTO_POTION_TYPE_HP
elif constInfo.IS_AUTO_POTION_SP(itemVnum): elif constInfo.IS_AUTO_POTION_SP(itemVnum):
@@ -614,7 +614,7 @@ class InventoryWindow(ui.ScriptWindow):
def SellItem(self): def SellItem(self):
if self.sellingSlotitemIndex == player.GetItemIndex(self.sellingSlotNumber): if self.sellingSlotitemIndex == player.GetItemIndex(self.sellingSlotNumber):
if self.sellingSlotitemCount == player.GetItemCount(self.sellingSlotNumber): if self.sellingSlotitemCount == player.GetItemCount(self.sellingSlotNumber):
## 용혼석도 팔리게 하는 기능 추가하면서 인자 type 추가 ## <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȸ<EFBFBD><C8B8><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD> <20>߰<EFBFBD><DFB0>ϸ鼭 <20><><EFBFBD><EFBFBD> type <EFBFBD>߰<EFBFBD>
net.SendShopSellPacketNew(self.sellingSlotNumber, self.questionDialog.count, player.INVENTORY) net.SendShopSellPacketNew(self.sellingSlotNumber, self.questionDialog.count, player.INVENTORY)
snd.PlaySound("sound/ui/money.wav") snd.PlaySound("sound/ui/money.wav")
self.OnCloseQuestionDialog() self.OnCloseQuestionDialog()
@@ -764,10 +764,10 @@ class InventoryWindow(ui.ScriptWindow):
else: else:
#snd.PlaySound("sound/ui/drop.wav") #snd.PlaySound("sound/ui/drop.wav")
## 이동시킨 곳이 장착 슬롯일 경우 아이템을 사용해서 장착 시킨다 - [levites] ## <EFBFBD>̵<EFBFBD><EFBFBD><EFBFBD>Ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ų<EFBFBD><C5B2> - [levites]
if player.IsEquipmentSlot(dstItemSlotPos): if player.IsEquipmentSlot(dstItemSlotPos):
## 들고 있는 아이템이 장비일때만 ## <EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD>
if item.IsEquipmentVID(srcItemVID): if item.IsEquipmentVID(srcItemVID):
self.__UseItem(srcItemSlotPos) self.__UseItem(srcItemSlotPos)
@@ -786,7 +786,7 @@ class InventoryWindow(ui.ScriptWindow):
self.sellingSlotitemCount = itemCount self.sellingSlotitemCount = itemCount
item.SelectItem(itemIndex) item.SelectItem(itemIndex)
## 안티 플레그 검사 빠져서 추가 ## <EFBFBD><EFBFBD>Ƽ <20>÷<EFBFBD><C3B7><EFBFBD> <20>˻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>
## 20140220 ## 20140220
if item.IsAntiFlag(item.ANTIFLAG_SELL): if item.IsAntiFlag(item.ANTIFLAG_SELL):
popup = uiCommon.PopupDialog() popup = uiCommon.PopupDialog()
@@ -932,7 +932,7 @@ class InventoryWindow(ui.ScriptWindow):
def __IsUsableItemToItem(self, srcItemVNum, srcSlotPos): def __IsUsableItemToItem(self, srcItemVNum, srcSlotPos):
"다른 아이템에 사용할 수 있는 아이템인가?" "<EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?"
if item.IsRefineScroll(srcItemVNum): if item.IsRefineScroll(srcItemVNum):
return True return True
@@ -951,7 +951,7 @@ class InventoryWindow(ui.ScriptWindow):
return False return False
def __CanUseSrcItemToDstItem(self, srcItemVNum, srcSlotPos, dstSlotPos): def __CanUseSrcItemToDstItem(self, srcItemVNum, srcSlotPos, dstSlotPos):
"대상 아이템에 사용할 수 있는가?" "<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ°<D6B4>?"
if srcSlotPos == dstSlotPos: if srcSlotPos == dstSlotPos:
return False return False
@@ -992,7 +992,7 @@ class InventoryWindow(ui.ScriptWindow):
return True return True
elif "USE_PUT_INTO_ACCESSORY_SOCKET" == useType: elif "USE_PUT_INTO_ACCESSORY_SOCKET" == useType:
if self.__CanPutAccessorySocket(dstSlotPos, srcItemVNum): if self.__CanPutAccessorySocket(dstSlotPos, srcItemVNum):
return TRUE; return TRUE
elif "USE_PUT_INTO_BELT_SOCKET" == useType: elif "USE_PUT_INTO_BELT_SOCKET" == useType:
dstItemVNum = player.GetItemIndex(dstSlotPos) dstItemVNum = player.GetItemIndex(dstSlotPos)
print "USE_PUT_INTO_BELT_SOCKET", srcItemVNum, dstItemVNum print "USE_PUT_INTO_BELT_SOCKET", srcItemVNum, dstItemVNum
@@ -1158,7 +1158,7 @@ class InventoryWindow(ui.ScriptWindow):
self.OnCloseQuestionDialog() self.OnCloseQuestionDialog()
def __SendUseItemToItemPacket(self, srcSlotPos, dstSlotPos): def __SendUseItemToItemPacket(self, srcSlotPos, dstSlotPos):
# 개인상점 열고 있는 동안 아이템 사용 방지 # <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
if uiPrivateShopBuilder.IsBuildingPrivateShop(): if uiPrivateShopBuilder.IsBuildingPrivateShop():
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_ITEM_FAILURE_PRIVATE_SHOP) chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_ITEM_FAILURE_PRIVATE_SHOP)
return return
@@ -1166,7 +1166,7 @@ class InventoryWindow(ui.ScriptWindow):
net.SendItemUseToItemPacket(srcSlotPos, dstSlotPos) net.SendItemUseToItemPacket(srcSlotPos, dstSlotPos)
def __SendUseItemPacket(self, slotPos): def __SendUseItemPacket(self, slotPos):
# 개인상점 열고 있는 동안 아이템 사용 방지 # <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
if uiPrivateShopBuilder.IsBuildingPrivateShop(): if uiPrivateShopBuilder.IsBuildingPrivateShop():
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_ITEM_FAILURE_PRIVATE_SHOP) chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_ITEM_FAILURE_PRIVATE_SHOP)
return return
@@ -1174,7 +1174,7 @@ class InventoryWindow(ui.ScriptWindow):
net.SendItemUsePacket(slotPos) net.SendItemUsePacket(slotPos)
def __SendMoveItemPacket(self, srcSlotPos, dstSlotPos, srcItemCount): def __SendMoveItemPacket(self, srcSlotPos, dstSlotPos, srcItemCount):
# 개인상점 열고 있는 동안 아이템 사용 방지 # <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
if uiPrivateShopBuilder.IsBuildingPrivateShop(): if uiPrivateShopBuilder.IsBuildingPrivateShop():
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP) chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)
return return

View File

@@ -42,6 +42,7 @@ class MessengerItem(ui.Window):
def SetName(self, name): def SetName(self, name):
self.name = name self.name = name
if name: if name:
self.text.SetText(name) self.text.SetText(name)
self.SetSize(20 + 6*len(name) + 4, 16) self.SetSize(20 + 6*len(name) + 4, 16)
@@ -377,6 +378,14 @@ class MessengerWindow(ui.ScriptWindow):
self.__AddGroup() self.__AddGroup()
messenger.RefreshGuildMember() 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): def Show(self):
if self.isLoaded==0: if self.isLoaded==0:
self.isLoaded=1 self.isLoaded=1
@@ -390,7 +399,7 @@ class MessengerWindow(ui.ScriptWindow):
def __LoadWindow(self): def __LoadWindow(self):
pyScrLoader = ui.PythonScriptLoader() pyScrLoader = ui.PythonScriptLoader()
pyScrLoader.LoadScriptFile(self, "UIScript/MessengerWindow.py") pyScrLoader.LoadScriptFile(self, "UIScript/MessengerWindow.py")
try: try:
self.board = self.GetChild("board") self.board = self.GetChild("board")
@@ -669,6 +678,11 @@ class MessengerWindow(ui.ScriptWindow):
self.selectedItem.OnRemove() self.selectedItem.OnRemove()
self.selectedItem.UnSelect() self.selectedItem.UnSelect()
self.selectedItem = None self.selectedItem = None
self.whisperButton.Disable()
self.mobileButton.Disable()
self.removeButton.Disable()
self.OnRefreshList() self.OnRefreshList()
self.OnCloseQuestionDialog() self.OnCloseQuestionDialog()
@@ -770,7 +784,24 @@ class MessengerWindow(ui.ScriptWindow):
def OnRemoveList(self, groupIndex, key): def OnRemoveList(self, groupIndex, key):
group = self.groupList[groupIndex] 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() self.OnRefreshList()
def OnRemoveAllList(self, groupIndex): def OnRemoveAllList(self, groupIndex):

View File

@@ -152,7 +152,7 @@ class EnergyBar(ui.ScriptWindow):
def RefreshStatus(self): def RefreshStatus(self):
pointEnergy = player.GetStatus (player.ENERGY) pointEnergy = player.GetStatus (player.ENERGY)
leftTimeEnergy = player.GetStatus (player.ENERGY_END_TIME) - app.GetGlobalTimeStamp() leftTimeEnergy = player.GetStatus (player.ENERGY_END_TIME) - app.GetGlobalTimeStamp()
# 충기환 지속 시간 = 2시간. # <EFBFBD><EFBFBD><EFBFBD>ȯ <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> = 2<EFBFBD>ð<EFBFBD>.
self.SetEnergy (pointEnergy, leftTimeEnergy, 7200) self.SetEnergy (pointEnergy, leftTimeEnergy, 7200)
def SetEnergy (self, point, leftTime, maxTime): def SetEnergy (self, point, leftTime, maxTime):
@@ -336,7 +336,7 @@ class TaskBar(ui.ScriptWindow):
(coolTime, elapsedTime) = player.GetSkillCoolTime(skillSlotNumber) (coolTime, elapsedTime) = player.GetSkillCoolTime(skillSlotNumber)
self.SetSlotCoolTime(slotNumber, coolTime, elapsedTime) self.SetSlotCoolTime(slotNumber, coolTime, elapsedTime)
## NOTE : Activate 되어 있다면 아이콘도 업데이트 ## NOTE : Activate <EFBFBD>Ǿ<EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
if player.IsSkillActive(skillSlotNumber): if player.IsSkillActive(skillSlotNumber):
self.ActivateSlot(slotNumber) self.ActivateSlot(slotNumber)
@@ -439,7 +439,7 @@ class TaskBar(ui.ScriptWindow):
toggleButtonDict[TaskBar.BUTTON_MESSENGER]=self.GetChild("MessengerButton") toggleButtonDict[TaskBar.BUTTON_MESSENGER]=self.GetChild("MessengerButton")
toggleButtonDict[TaskBar.BUTTON_SYSTEM]=self.GetChild("SystemButton") toggleButtonDict[TaskBar.BUTTON_SYSTEM]=self.GetChild("SystemButton")
# ChatButton, ExpandButton 둘 중 하나는 반드시 존재한다. # ChatButton, ExpandButton <EFBFBD><EFBFBD> <20><> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ݵ<EFBFBD><DDB5> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
try: try:
toggleButtonDict[TaskBar.BUTTON_CHAT]=self.GetChild("ChatButton") toggleButtonDict[TaskBar.BUTTON_CHAT]=self.GetChild("ChatButton")
except: except:
@@ -672,6 +672,22 @@ class TaskBar(ui.ScriptWindow):
for button in self.selectSkillButtonList: for button in self.selectSkillButtonList:
button.RefreshSkill() 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): def SetHP(self, curPoint, recoveryPoint, maxPoint):
curPoint = min(curPoint, maxPoint) curPoint = min(curPoint, maxPoint)
if maxPoint > 0: if maxPoint > 0:
@@ -765,9 +781,9 @@ class TaskBar(ui.ScriptWindow):
if itemCount <= 1: if itemCount <= 1:
itemCount = 0 itemCount = 0
## 자동물약 (#72723, #72724) 특수처리 - 아이템인데도 슬롯에 활성화/비활성화 표시를 위한 작업임 - [hyo] ## <EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (#72723, #72724) Ư<EFBFBD><EFBFBD>ó<EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD>Կ<EFBFBD> Ȱ<><C8B0>ȭ/<2F><>Ȱ<EFBFBD><C8B0>ȭ ǥ<>ø<EFBFBD> <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD> - [hyo]
if constInfo.IS_AUTO_POTION(itemIndex): if constInfo.IS_AUTO_POTION(itemIndex):
# metinSocket - [0] : 활성화 여부, [1] : 사용한 양, [2] : 최대 용량 # metinSocket - [0] : Ȱ<EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD>, [1] : <20><><EFBFBD><EFBFBD><EFBFBD> <20><>, [2] : <EFBFBD>ִ<EFBFBD> <20>
metinSocket = [player.GetItemMetinSocket(Position, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)] metinSocket = [player.GetItemMetinSocket(Position, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]
if 0 != int(metinSocket[0]): if 0 != int(metinSocket[0]):
@@ -776,17 +792,19 @@ class TaskBar(ui.ScriptWindow):
slot.DeactivateSlot(slotNumber) slot.DeactivateSlot(slotNumber)
slot.SetItemSlot(slotNumber, itemIndex, itemCount) slot.SetItemSlot(slotNumber, itemIndex, itemCount)
elif player.SLOT_TYPE_SKILL == Type: elif player.SLOT_TYPE_SKILL == Type:
skillIndex = player.GetSkillIndex(Position) skillIndex = player.GetSkillIndex(Position)
if 0 == skillIndex: if 0 == skillIndex:
slot.ClearSlot(slotNumber) slot.ClearSlot(slotNumber)
continue continue
skillType = skill.GetSkillType(skillIndex) skillType = skill.GetSkillType(skillIndex)
if skill.SKILL_TYPE_GUILD == skillType: if skill.SKILL_TYPE_GUILD == skillType:
import guild import guild
skillGrade = 0 skillGrade = 0
skillLevel = guild.GetSkillLevel(Position) skillLevel = guild.GetSkillLevel(Position)
@@ -799,13 +817,19 @@ class TaskBar(ui.ScriptWindow):
slot.SetCoverButton(slotNumber) slot.SetCoverButton(slotNumber)
## NOTE : CoolTime üũ ## NOTE : CoolTime üũ
if player.IsSkillCoolTime(Position): if player.IsSkillCoolTime(Position) and skillLevel > 0:
(coolTime, elapsedTime) = player.GetSkillCoolTime(Position) (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 <20>Ǿ<EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
if player.IsSkillActive(Position): if player.IsSkillActive(Position):
slot.ActivateSlot(slotNumber) slot.ActivateSlot(slotNumber)
else:
slot.DeactivateSlot(slotNumber)
elif player.SLOT_TYPE_EMOTION == Type: elif player.SLOT_TYPE_EMOTION == Type:
@@ -1047,8 +1071,8 @@ class TaskBar(ui.ScriptWindow):
if skill.IsStandingSkill(skillIndex): if skill.IsStandingSkill(skillIndex):
continue continue
## FIXME : 스킬 하나당 슬롯 하나씩 할당하는건 아무리 봐도 부하가 크다. ## FIXME : <EFBFBD><EFBFBD>ų <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>Ҵ<EFBFBD><D2B4>ϴ°<CFB4> <20>ƹ<EFBFBD><C6B9><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> ũ<><C5A9>.
## 이 부분은 시간을 나면 고치도록. - [levites] ## <EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD>. - [levites]
skillButton = self.SkillButton() skillButton = self.SkillButton()
skillButton.SetSkill(startNumber+i) skillButton.SetSkill(startNumber+i)
skillButton.SetPosition(x, y) skillButton.SetPosition(x, y)

View File

@@ -556,6 +556,22 @@ window = {
"down_image" : "d:/ymir work/ui/game/windows/skill_tab_button_03.sub", "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", "name" : "Active_Skill_Group_Name",
"type" : "text", "type" : "text",