diff --git a/README.md b/README.md
index c5a4a6b2..9a6312c3 100644
--- a/README.md
+++ b/README.md
@@ -6,10 +6,13 @@ This repository contains all client-side data, including locale files, configura
## 📋 Changelog
-### ⬆️ Feature Improvements
-* **Snow mountain and Snow Dungeon updated:** Updated Snow mountain and Snow Dungeon terrain, environment and textures
-* **Protos updated:** Updated protos for all locales with the new items and mobs/NPCs for the Snow Dungeon (some translations may be incomplete)
-* **Item icons and descriptions updated:** Updated item icons and descriptions for new items for all locales (some translations may be incomplete)
+### 🐛 Bug Fixes
+ - **Python 3 division compatibility**: Migrated a lot of divisions in a lot of files to `int` divisions instead of `floats` for Python 3 compatibility. This will be fixing a lot of bugs caused by the upgrade such as target board button centering, Dragon stones Grade in tooltip and more.
+ - **Completed the map names dictionary**: This improves functionality for all maps within the client, and fixes **the "invisible affects in dungeon" bug!
+ - **Dragon stone countdown in tooltip**: The countdown auto-starts and responds perfectly to all situations without waiting for the "first hover" from the player.
+ - **Quest refreshing**: Prevented the quest letters from appearing on top of the dialog curtain (if currently chatting with an NPC or item).
+ - **Minor translation improvements**
+ - **Several missing item icons added**
diff --git a/assets/icon/icon/item/70063.tga b/assets/icon/icon/item/70063.tga
new file mode 100644
index 00000000..0002023f
Binary files /dev/null and b/assets/icon/icon/item/70063.tga differ
diff --git a/assets/icon/icon/item/70064.tga b/assets/icon/icon/item/70064.tga
new file mode 100644
index 00000000..ca5fc177
Binary files /dev/null and b/assets/icon/icon/item/70064.tga differ
diff --git a/assets/icon/icon/item/70065.tga b/assets/icon/icon/item/70065.tga
new file mode 100644
index 00000000..4a5475a2
Binary files /dev/null and b/assets/icon/icon/item/70065.tga differ
diff --git a/assets/icon/icon/item/70067.tga b/assets/icon/icon/item/70067.tga
new file mode 100644
index 00000000..9394c8d4
Binary files /dev/null and b/assets/icon/icon/item/70067.tga differ
diff --git a/assets/icon/icon/item/70068.tga b/assets/icon/icon/item/70068.tga
new file mode 100644
index 00000000..a8638b32
Binary files /dev/null and b/assets/icon/icon/item/70068.tga differ
diff --git a/assets/icon/icon/item/70069.tga b/assets/icon/icon/item/70069.tga
new file mode 100644
index 00000000..c3d40d18
Binary files /dev/null and b/assets/icon/icon/item/70069.tga differ
diff --git a/assets/icon/icon/item/71095.tga b/assets/icon/icon/item/71095.tga
new file mode 100644
index 00000000..41ba50c0
Binary files /dev/null and b/assets/icon/icon/item/71095.tga differ
diff --git a/assets/icon/icon/item/71096.tga b/assets/icon/icon/item/71096.tga
new file mode 100644
index 00000000..0ae755a6
Binary files /dev/null and b/assets/icon/icon/item/71096.tga differ
diff --git a/assets/icon/icon/item/72053.tga b/assets/icon/icon/item/72053.tga
new file mode 100644
index 00000000..3b917638
Binary files /dev/null and b/assets/icon/icon/item/72053.tga differ
diff --git a/assets/icon/icon/item/72054.tga b/assets/icon/icon/item/72054.tga
new file mode 100644
index 00000000..e04996c3
Binary files /dev/null and b/assets/icon/icon/item/72054.tga differ
diff --git a/assets/icon/icon/item/72059.tga b/assets/icon/icon/item/72059.tga
new file mode 100644
index 00000000..80a1a297
Binary files /dev/null and b/assets/icon/icon/item/72059.tga differ
diff --git a/assets/icon/icon/item/72060.tga b/assets/icon/icon/item/72060.tga
new file mode 100644
index 00000000..a434b358
Binary files /dev/null and b/assets/icon/icon/item/72060.tga differ
diff --git a/assets/icon/icon/item/72061.tga b/assets/icon/icon/item/72061.tga
new file mode 100644
index 00000000..78d6e605
Binary files /dev/null and b/assets/icon/icon/item/72061.tga differ
diff --git a/assets/icon/icon/item/72062.tga b/assets/icon/icon/item/72062.tga
new file mode 100644
index 00000000..fcfc616f
Binary files /dev/null and b/assets/icon/icon/item/72062.tga differ
diff --git a/assets/icon/icon/item/72064.tga b/assets/icon/icon/item/72064.tga
new file mode 100644
index 00000000..8dd0fb68
Binary files /dev/null and b/assets/icon/icon/item/72064.tga differ
diff --git a/assets/icon/icon/item/72068.tga b/assets/icon/icon/item/72068.tga
new file mode 100644
index 00000000..01c7ffae
Binary files /dev/null and b/assets/icon/icon/item/72068.tga differ
diff --git a/assets/icon/icon/item/72069.tga b/assets/icon/icon/item/72069.tga
new file mode 100644
index 00000000..a465cb42
Binary files /dev/null and b/assets/icon/icon/item/72069.tga differ
diff --git a/assets/icon/icon/item/72070.tga b/assets/icon/icon/item/72070.tga
new file mode 100644
index 00000000..e72b3451
Binary files /dev/null and b/assets/icon/icon/item/72070.tga differ
diff --git a/assets/icon/icon/item/72071.tga b/assets/icon/icon/item/72071.tga
new file mode 100644
index 00000000..56a28217
Binary files /dev/null and b/assets/icon/icon/item/72071.tga differ
diff --git a/assets/icon/icon/item/72072.tga b/assets/icon/icon/item/72072.tga
new file mode 100644
index 00000000..74a5fb9f
Binary files /dev/null and b/assets/icon/icon/item/72072.tga differ
diff --git a/assets/icon/icon/item/72319.tga b/assets/icon/icon/item/72319.tga
new file mode 100644
index 00000000..08ad1594
Binary files /dev/null and b/assets/icon/icon/item/72319.tga differ
diff --git a/assets/icon/icon/item/72320.tga b/assets/icon/icon/item/72320.tga
new file mode 100644
index 00000000..6874183c
Binary files /dev/null and b/assets/icon/icon/item/72320.tga differ
diff --git a/assets/icon/icon/item/72321.tga b/assets/icon/icon/item/72321.tga
new file mode 100644
index 00000000..f4eaaa53
Binary files /dev/null and b/assets/icon/icon/item/72321.tga differ
diff --git a/assets/icon/icon/item/72322.tga b/assets/icon/icon/item/72322.tga
new file mode 100644
index 00000000..e1de84da
Binary files /dev/null and b/assets/icon/icon/item/72322.tga differ
diff --git a/assets/icon/icon/item/72323.tga b/assets/icon/icon/item/72323.tga
new file mode 100644
index 00000000..d8c6790d
Binary files /dev/null and b/assets/icon/icon/item/72323.tga differ
diff --git a/assets/icon/icon/item/72325.tga b/assets/icon/icon/item/72325.tga
new file mode 100644
index 00000000..850a52c8
Binary files /dev/null and b/assets/icon/icon/item/72325.tga differ
diff --git a/assets/icon/icon/item/72326.tga b/assets/icon/icon/item/72326.tga
new file mode 100644
index 00000000..507c8f1b
Binary files /dev/null and b/assets/icon/icon/item/72326.tga differ
diff --git a/assets/icon/icon/item/72327.tga b/assets/icon/icon/item/72327.tga
new file mode 100644
index 00000000..e7cf0bb9
Binary files /dev/null and b/assets/icon/icon/item/72327.tga differ
diff --git a/assets/icon/icon/item/72328.tga b/assets/icon/icon/item/72328.tga
new file mode 100644
index 00000000..404b4c78
Binary files /dev/null and b/assets/icon/icon/item/72328.tga differ
diff --git a/assets/icon/icon/item/72340.tga b/assets/icon/icon/item/72340.tga
new file mode 100644
index 00000000..da9579a3
Binary files /dev/null and b/assets/icon/icon/item/72340.tga differ
diff --git a/assets/icon/icon/item/72343.tga b/assets/icon/icon/item/72343.tga
new file mode 100644
index 00000000..788f7e7c
Binary files /dev/null and b/assets/icon/icon/item/72343.tga differ
diff --git a/assets/icon/icon/item/72344.tga b/assets/icon/icon/item/72344.tga
new file mode 100644
index 00000000..746e2a23
Binary files /dev/null and b/assets/icon/icon/item/72344.tga differ
diff --git a/assets/icon/icon/item/72346.tga b/assets/icon/icon/item/72346.tga
new file mode 100644
index 00000000..80a28f2d
Binary files /dev/null and b/assets/icon/icon/item/72346.tga differ
diff --git a/assets/icon/icon/item/72347.tga b/assets/icon/icon/item/72347.tga
new file mode 100644
index 00000000..bed57de3
Binary files /dev/null and b/assets/icon/icon/item/72347.tga differ
diff --git a/assets/icon/icon/item/72350.tga b/assets/icon/icon/item/72350.tga
new file mode 100644
index 00000000..daaf5943
Binary files /dev/null and b/assets/icon/icon/item/72350.tga differ
diff --git a/assets/icon/icon/item/72351.tga b/assets/icon/icon/item/72351.tga
new file mode 100644
index 00000000..9f7ce158
Binary files /dev/null and b/assets/icon/icon/item/72351.tga differ
diff --git a/assets/icon/icon/item/72352.tga b/assets/icon/icon/item/72352.tga
new file mode 100644
index 00000000..c8b8bd84
Binary files /dev/null and b/assets/icon/icon/item/72352.tga differ
diff --git a/assets/icon/icon/item/72353.tga b/assets/icon/icon/item/72353.tga
new file mode 100644
index 00000000..93039ef8
Binary files /dev/null and b/assets/icon/icon/item/72353.tga differ
diff --git a/assets/icon/icon/item/72355.tga b/assets/icon/icon/item/72355.tga
new file mode 100644
index 00000000..af42477f
Binary files /dev/null and b/assets/icon/icon/item/72355.tga differ
diff --git a/assets/icon/icon/item/72359.tga b/assets/icon/icon/item/72359.tga
new file mode 100644
index 00000000..1c71f7dc
Binary files /dev/null and b/assets/icon/icon/item/72359.tga differ
diff --git a/assets/icon/icon/item/72360.tga b/assets/icon/icon/item/72360.tga
new file mode 100644
index 00000000..b69b242b
Binary files /dev/null and b/assets/icon/icon/item/72360.tga differ
diff --git a/assets/icon/icon/item/90000.tga b/assets/icon/icon/item/90000.tga
new file mode 100644
index 00000000..f5efc3b5
Binary files /dev/null and b/assets/icon/icon/item/90000.tga differ
diff --git a/assets/icon/icon/item/dummy.tga b/assets/icon/icon/item/dummy.tga
new file mode 100644
index 00000000..4a5a76e7
Binary files /dev/null and b/assets/icon/icon/item/dummy.tga differ
diff --git a/assets/locale/locale/ae/locale_game.txt b/assets/locale/locale/ae/locale_game.txt
index 3a1dd4a5..4dd0553a 100644
--- a/assets/locale/locale/ae/locale_game.txt
+++ b/assets/locale/locale/ae/locale_game.txt
@@ -822,7 +822,7 @@ TOOLTIP_MAX_SP نقاط الأسلوب القصوى +%d SA
TOOLTIP_MAX_SP_PCT نقاط الأسلوب القصوى +%d%% SA
TOOLTIP_MAX_STAMINA مدة التحمل القصوى +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER هجوم سحري/قتال عن قرب +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d، %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d، %d)
TOOLTIP_MEMORIZED_POSITION_ERROR خطأ GPS(%d, %d)
TOOLTIP_MOV_SPEED سرعة التحرك %d%% SA
TOOLTIP_NECK قلادة
diff --git a/assets/locale/locale/common/item_list.txt b/assets/locale/locale/common/item_list.txt
index 715ab3fb..299b84bd 100644
--- a/assets/locale/locale/common/item_list.txt
+++ b/assets/locale/locale/common/item_list.txt
@@ -1,4 +1,5 @@
1 ETC icon/item/money.tga d:/ymir work/item/etc/money.gr2
+2 ETC icon/item/dummy.tga
10 WEAPON icon/item/00010.tga d:/ymir work/item/weapon/00010.gr2
11 WEAPON icon/item/00010.tga d:/ymir work/item/weapon/00010.gr2
12 WEAPON icon/item/00010.tga d:/ymir work/item/weapon/00010.gr2
@@ -1410,6 +1411,21 @@
9505 WEAPON icon/item/07000.tga d:/ymir work/item/weapon/07000.gr2
50201 WEAPON icon/item/50201.tga d:/ymir work/item/weapon/buke.gr2
50202 WEAPON icon/item/50201.tga d:/ymir work/item/weapon/buke.gr2
+29001 ETC icon/item/dummy.tga
+29002 ETC icon/item/dummy.tga
+29003 ETC icon/item/dummy.tga
+29004 ETC icon/item/dummy.tga
+29005 ETC icon/item/dummy.tga
+29006 ETC icon/item/dummy.tga
+29007 ETC icon/item/dummy.tga
+29008 ETC icon/item/dummy.tga
+29009 ETC icon/item/dummy.tga
+29010 ETC icon/item/dummy.tga
+29011 ETC icon/item/dummy.tga
+29012 ETC icon/item/dummy.tga
+29013 ETC icon/item/dummy.tga
+29014 ETC icon/item/dummy.tga
+29015 ETC icon/item/dummy.tga
29101 WEAPON icon/item/29101.tga d:/ymir work/item/etc/digger_1.gr2
29102 WEAPON icon/item/29101.tga d:/ymir work/item/etc/digger_1.gr2
29103 WEAPON icon/item/29101.tga d:/ymir work/item/etc/digger_1.gr2
@@ -2296,6 +2312,16 @@
13167 ARMOR icon/item/13160.tga
13168 ARMOR icon/item/13160.tga
13169 ARMOR icon/item/13160.tga
+13180 ARMOR icon/item/dummy.tga
+13181 ARMOR icon/item/dummy.tga
+13182 ARMOR icon/item/dummy.tga
+13183 ARMOR icon/item/dummy.tga
+13184 ARMOR icon/item/dummy.tga
+13185 ARMOR icon/item/dummy.tga
+13186 ARMOR icon/item/dummy.tga
+13187 ARMOR icon/item/dummy.tga
+13188 ARMOR icon/item/dummy.tga
+13189 ARMOR icon/item/dummy.tga
14000 ARMOR icon/item/14000.tga
14001 ARMOR icon/item/14000.tga
14002 ARMOR icon/item/14000.tga
@@ -3380,6 +3406,10 @@
22000 ETC icon/item/22000.tga
22010 ETC icon/item/22000.tga
22011 ETC icon/item/22000.tga
+22020 ETC icon/item/dummy.tga
+22030 ETC icon/item/dummy.tga
+22040 ETC icon/item/dummy.tga
+22050 ETC icon/item/dummy.tga
25040 ETC icon/item/25040.tga
25041 ETC icon/item/30064.tga
25100 ETC icon/item/25000.tga
@@ -3890,7 +3920,24 @@
30097 ETC icon/item/30096.tga
30101 ETC season1/icon/item/30101.tga
30102 ETC season1/icon/item/30102.tga
+30101 ETC icon/item/30101.tga
+30102 ETC icon/item/30102.tga
+30103 ETC icon/item/dummy.tga
+30104 ETC icon/item/dummy.tga
+30105 ETC icon/item/dummy.tga
+30106 ETC icon/item/dummy.tga
+30107 ETC icon/item/dummy.tga
+30108 ETC icon/item/dummy.tga
+30109 ETC icon/item/dummy.tga
+30110 ETC icon/item/dummy.tga
+30111 ETC icon/item/dummy.tga
+30112 ETC icon/item/dummy.tga
+30113 ETC icon/item/dummy.tga
+30114 ETC season1/icon/item/30152.tga
+30115 ETC icon/item/dummy.tga
30116 ETC season1/icon/item/30116.tga
+30117 ETC icon/item/dummy.tga
+30118 ETC icon/item/dummy.tga
30129 ETC icon/item/30129.tga
30130 ETC icon/item/30130.tga
30131 ETC icon/item/30131.tga
@@ -4013,6 +4060,9 @@
40002 ETC icon/item/40002.tga
40003 ETC icon/item/40003.tga
40004 ETC icon/item/40004.tga
+40005 ETC icon/item/dummy.tga
+40006 ETC icon/item/dummy.tga
+40007 ETC icon/item/dummy.tga
41311 ETC icon/item/41311.tga
41312 ETC icon/item/41312.tga
41313 ETC icon/item/41311.tga
@@ -4057,6 +4107,7 @@
50038 ETC season1/icon/item/50038.tga
50039 ETC season1/icon/item/50039.tga
50040 ETC season1/icon/item/50040.tga
+50041 ETC season1/icon/item/50040.tga
50042 ETC icon/item/50042.tga
50050 ETC icon/item/50050.tga
50051 ETC icon/item/50051.tga
@@ -4070,6 +4121,7 @@
50059 ETC icon/item/50059.tga
50060 ETC icon/item/book_44.tga
50061 ETC season1/icon/item/50061.tga
+50062 ETC icon/item/dummy.tga
50070 ETC icon/item/boss_box.tga d:/ymir work/item/etc/boss_box.gr2
50071 ETC icon/item/boss_box.tga d:/ymir work/item/etc/boss_box.gr2
50072 ETC icon/item/boss_box.tga d:/ymir work/item/etc/boss_box.gr2
@@ -4298,6 +4350,14 @@
50802 ETC season1/icon/item/50802.tga
50803 ETC season1/icon/item/50803.tga
50804 ETC season1/icon/item/50804.tga
+50805 ETC icon/item/dummy.tga
+50806 ETC icon/item/dummy.tga
+50807 ETC icon/item/dummy.tga
+50808 ETC icon/item/dummy.tga
+50809 ETC icon/item/dummy.tga
+50810 ETC icon/item/dummy.tga
+50811 ETC icon/item/dummy.tga
+50812 ETC icon/item/dummy.tga
50813 ETC season1/icon/item/50813.tga
50814 ETC season1/icon/item/50814.tga
50815 ETC season1/icon/item/50815.tga
@@ -4309,6 +4369,12 @@
50902 ETC season1/icon/item/50902.tga
50903 ETC season1/icon/item/50903.tga
50904 ETC season1/icon/item/50904.tga
+50905 ETC icon/item/dummy.tga
+50906 ETC icon/item/dummy.tga
+50907 ETC icon/item/dummy.tga
+50908 ETC icon/item/dummy.tga
+50909 ETC icon/item/dummy.tga
+50910 ETC icon/item/dummy.tga
53001 ETC icon/item/53001.tga
53003 ETC icon/item/53003.tga
53501 ETC icon/item/53501.tga
@@ -4388,6 +4454,7 @@
70054 ETC icon/item/30007.tga
70101 ETC icon/item/70101.tga
70102 ETC icon/item/70102.tga
+70103 ETC icon/item/dummy.tga
70104 ETC icon/item/70104.tga
70105 ETC icon/item/70105.tga
70106 ETC icon/item/70106.tga
@@ -4421,6 +4488,7 @@
71032 ETC icon/item/71032.tga
71011 ETC icon/item/70002.tga
71034 ETC icon/item/27102.tga
+71035 ETC icon/item/71035.tga
71036 ETC icon/item/71036.tga
71037 ETC icon/item/71036.tga
71038 ETC icon/item/71036.tga
@@ -4430,7 +4498,6 @@
71042 ETC icon/item/71036.tga
71043 ETC icon/item/71036.tga
71046 ETC icon/item/25000.tga
-71048 ETC icon/item/22000.tga
71051 ETC icon/item/71051.tga
71052 ETC icon/item/71052.tga
71053 ETC icon/item/70050.tga
@@ -4460,9 +4527,12 @@
71028 ETC icon/item/71028.tga
71029 ETC icon/item/71029.tga
71030 ETC icon/item/71030.tga
+71031 ETC icon/item/71030.tga
+71033 ETC icon/item/71011.tga
71035 ETC season1/icon/item/71035.tga
71044 ETC icon/item/71044.tga
71045 ETC icon/item/71045.tga
+71047 ETC icon/item/dummy.tga
71048 ETC icon/item/71048.tga
71049 ETC icon/item/71049.tga
71050 ETC icon/item/27103.tga
@@ -4490,6 +4560,7 @@
71083 ETC icon/item/71083.tga
71084 ETC icon/item/71084.tga
71085 ETC icon/item/71085.tga
+71091 ETC icon/item/dummy.tga
71094 ETC icon/item/71094.tga
71095 ETC season1/icon/item/71095.tga
71096 ETC season1/icon/item/71096.tga
@@ -4552,6 +4623,9 @@
72007 ETC icon/item/71049.tga
72008 ETC icon/item/71049.tga
72009 ETC icon/item/71049.tga
+72010 ETC icon/item/dummy.tga
+72011 ETC icon/item/dummy.tga
+72012 ETC icon/item/dummy.tga
72013 ETC icon/item/71008.tga
72014 ETC icon/item/71008.tga
72015 ETC icon/item/71008.tga
@@ -4592,6 +4666,70 @@
72048 ETC icon/item/71044.tga
72049 ETC season1/icon/item/72049.tga
72050 ETC season1/icon/item/72049.tga
+72051 ETC icon/item/71036.tga
+72052 ETC icon/item/71036.tga
+72053 ETC icon/item/72053.tga
+72054 ETC icon/item/72054.tga
+72057 ETC icon/item/70005.tga
+72058 ETC icon/item/27999.tga
+72059 ETC icon/item/72059.tga
+72060 ETC icon/item/72060.tga
+72061 ETC icon/item/72061.tga
+72062 ETC icon/item/72062.tga
+72063 ETC icon/item/71080.tga
+72064 ETC icon/item/72064.tga
+72065 ETC icon/item/72064.tga
+72066 ETC icon/item/72064.tga
+72067 ETC icon/item/72064.tga
+72068 ETC icon/item/72068.tga
+72069 ETC icon/item/72069.tga
+72070 ETC icon/item/72070.tga
+72071 ETC icon/item/72071.tga
+72072 ETC icon/item/27999.tga
+72301 ETC icon/item/25040.tga
+72302 ETC icon/item/70003.tga
+72303 ETC icon/item/70005.tga
+72304 ETC icon/item/70024.tga
+72305 ETC icon/item/70026.tga
+72306 ETC icon/item/70027.tga
+72307 ETC icon/item/70028.tga
+72308 ETC icon/item/70035.tga
+72309 ETC icon/item/70039.tga
+72310 ETC icon/item/71001.tga
+72311 ETC icon/item/71020.tga
+72312 ETC icon/item/71028.tga
+72313 ETC icon/item/71030.tga
+72314 ETC icon/item/76009.tga
+72319 ETC icon/item/72319.tga
+72320 ETC icon/item/72320.tga
+72321 ETC icon/item/72321.tga
+72322 ETC icon/item/72322.tga
+72323 ETC icon/item/72323.tga
+72325 ETC icon/item/72325.tga
+72326 ETC icon/item/72326.tga
+72327 ETC icon/item/72327.tga
+72328 ETC icon/item/72328.tga
+72329 ETC icon/item/72327.tga
+72339 ETC icon/item/71080.tga
+72340 ETC icon/item/72340.tga
+72341 ETC icon/item/72326.tga
+72342 ETC icon/item/71095.tga
+72343 ETC icon/item/72343.tga
+72344 ETC icon/item/72344.tga
+72346 ETC icon/item/72346.tga
+72347 ETC icon/item/72347.tga
+72348 ETC icon/item/72347.tga
+72349 ETC icon/item/72347.tga
+72350 ETC icon/item/72350.tga
+72351 ETC icon/item/72351.tga
+72352 ETC icon/item/72352.tga
+72353 ETC icon/item/72353.tga
+72354 ETC icon/item/70068.tga
+72355 ETC icon/item/72355.tga
+72356 ETC icon/item/72355.tga
+72359 ETC icon/item/72359.tga
+72360 ETC icon/item/72360.tga
+72361 ETC icon/item/71080.tga
72701 ETC season1/icon/item/72701.tga
72702 ETC season1/icon/item/72701.tga
72703 ETC icon/item/72703.tga
@@ -4825,9 +4963,18 @@
75618 ETC icon/item/73751.tga
75619 ETC icon/item/73751.tga
75620 ETC icon/item/73751.tga
+80002 ETC icon/item/dummy.tga
80003 ETC icon/item/80003.tga
80004 ETC icon/item/80004.tga
80008 ETC icon/item/80008.tga
+9000 ETC icon/item/809000010.tga
+90001 ETC icon/item/dummy.tga
+90002 ETC icon/item/dummy.tga
+90003 ETC icon/item/dummy.tga
+90004 ETC icon/item/dummy.tga
+90005 ETC icon/item/dummy.tga
+90006 ETC icon/item/dummy.tga
+90007 ETC icon/item/dummy.tga
90008 ETC icon/item/70010.tga
90009 ETC icon/item/90009.tga
90010 ETC icon/item/90010.tga
@@ -5022,6 +5169,15 @@
38100 ETC season1/icon/item/50709.tga
38101 ETC season1/icon/item/50709.tga
38102 ETC season1/icon/item/50709.tga
+38001 ETC icon/item/dummy.tga
+38002 ETC icon/item/dummy.tga
+38003 ETC icon/item/dummy.tga
+38004 ETC icon/item/dummy.tga
+38005 ETC icon/item/dummy.tga
+38006 ETC icon/item/dummy.tga
+38007 ETC icon/item/80016.tga
+38008 ETC icon/item/38008.tga
+38009 ETC icon/item/38009.tga
38010 ETC icon/item/money.tga d:/ymir work/item/etc/money.gr2
38011 ETC icon/item/money.tga d:/ymir work/item/etc/money.gr2
41003 ARMOR icon/item/41003.tga
@@ -5151,6 +5307,18 @@
76024 ETC icon/item/76024.tga
53005 ETC icon/item/53005.tga
53505 ETC icon/item/53501.tga
+53506 ETC icon/item/53501.tga
+53507 ETC icon/item/53501.tga
+53508 ETC icon/item/53501.tga
+53509 ETC icon/item/53501.tga
+53510 ETC icon/item/53501.tga
+53511 ETC icon/item/53501.tga
+53512 ETC icon/item/53501.tga
+53513 ETC icon/item/53501.tga
+53514 ETC icon/item/53501.tga
+53515 ETC icon/item/53501.tga
+53516 ETC icon/item/53501.tga
+53517 ETC icon/item/53501.tga
70058 ETC icon/item/70058.tga
71151 ETC icon/item/71151.tga
71152 ETC icon/item/71152.tga
@@ -6225,6 +6393,11 @@
41308 ETC icon/item/41308.tga
41309 ETC icon/item/41307.tga
41310 ETC icon/item/41308.tga
+41315 ETC icon/item/41315.tga
+41316 ETC icon/item/41316.tga
+41317 ETC icon/item/41315.tga
+41318 ETC icon/item/41316.tga
+41319 ETC icon/item/41308.tga
41320 ETC icon/item/41320.tga
41321 ETC icon/item/41321.tga
41322 ETC icon/item/41320.tga
diff --git a/assets/locale/locale/cz/locale_game.txt b/assets/locale/locale/cz/locale_game.txt
index 9cc6575d..18cf4057 100644
--- a/assets/locale/locale/cz/locale_game.txt
+++ b/assets/locale/locale/cz/locale_game.txt
@@ -730,7 +730,7 @@ TOOLTIP_MAX_SP Max. MB +%d SA
TOOLTIP_MAX_SP_PCT Max. MB +%d%% SA
TOOLTIP_MAX_STAMINA Max. vytrvalost +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Magický útok/útok zbraní +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR Chyba v GPS(%d, %d)
TOOLTIP_MOV_SPEED Rychlost pohybu %d%% SA
TOOLTIP_NECK Náhrdelník
diff --git a/assets/locale/locale/de/locale_game.txt b/assets/locale/locale/de/locale_game.txt
index 323dbd8c..d522a70d 100644
--- a/assets/locale/locale/de/locale_game.txt
+++ b/assets/locale/locale/de/locale_game.txt
@@ -728,7 +728,7 @@ TOOLTIP_MAX_SP Max. MP +%d SA
TOOLTIP_MAX_SP_PCT Max. MP +%d%% SA
TOOLTIP_MAX_STAMINA Max. Ausdauer +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Magie-/Nahkampfangriff +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR GPS-FEHLER(%d, %d)
TOOLTIP_MOV_SPEED Bewegungsgeschw. %d%% SA
TOOLTIP_NECK Halskette
diff --git a/assets/locale/locale/dk/locale_game.txt b/assets/locale/locale/dk/locale_game.txt
index 15dd44ac..a95125f0 100644
--- a/assets/locale/locale/dk/locale_game.txt
+++ b/assets/locale/locale/dk/locale_game.txt
@@ -730,7 +730,7 @@ TOOLTIP_MAX_SP Max. MP +%d SA
TOOLTIP_MAX_SP_PCT Max. MP +%d%% SA
TOOLTIP_MAX_STAMINA Max. udholdenhed +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Magisk/nærkamps angreb +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR GPS-FEJL (%d, %d)
TOOLTIP_MOV_SPEED Bevægelseshastighed %d%% SA
TOOLTIP_NECK Halskæde
diff --git a/assets/locale/locale/en/locale_game.txt b/assets/locale/locale/en/locale_game.txt
index 17c58c5d..aa18f526 100644
--- a/assets/locale/locale/en/locale_game.txt
+++ b/assets/locale/locale/en/locale_game.txt
@@ -728,7 +728,7 @@ TOOLTIP_MAX_SP Max. SP +%d SA
TOOLTIP_MAX_SP_PCT Max. SP +%d%% SA
TOOLTIP_MAX_STAMINA Max. Endurance +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Magic/melee attack +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR GPS ERROR(%d, %d)
TOOLTIP_MOV_SPEED Moving Speed %d%% SA
TOOLTIP_NECK Necklace
diff --git a/assets/locale/locale/es/locale_game.txt b/assets/locale/locale/es/locale_game.txt
index 234f5eff..4fc8cd9a 100644
--- a/assets/locale/locale/es/locale_game.txt
+++ b/assets/locale/locale/es/locale_game.txt
@@ -730,7 +730,7 @@ TOOLTIP_MAX_SP Max. SP +%d SA
TOOLTIP_MAX_SP_PCT Max. SP +%d%% SA
TOOLTIP_MAX_STAMINA Max. Resistencia +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Ataque mágico/cuerpo a cuerpo +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR GPS ERROR(%d, %d)
TOOLTIP_MOV_SPEED Veloc. Movim. %d%% SA
TOOLTIP_NECK Collar
diff --git a/assets/locale/locale/fr/locale_game.txt b/assets/locale/locale/fr/locale_game.txt
index 449c74fa..a9377ac8 100644
--- a/assets/locale/locale/fr/locale_game.txt
+++ b/assets/locale/locale/fr/locale_game.txt
@@ -728,7 +728,7 @@ TOOLTIP_MAX_SP PM max. +%d SA
TOOLTIP_MAX_SP_PCT PM max. +%d%% SA
TOOLTIP_MAX_STAMINA Max. Endurance +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Attaque au corps à corps/magique +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR GPS Erreur (%d, %d)
TOOLTIP_MOV_SPEED Vit. de déplt %d%% SA
TOOLTIP_NECK Collier
diff --git a/assets/locale/locale/gr/locale_game.txt b/assets/locale/locale/gr/locale_game.txt
index 35e15a63..64786502 100644
--- a/assets/locale/locale/gr/locale_game.txt
+++ b/assets/locale/locale/gr/locale_game.txt
@@ -94,7 +94,7 @@ EMOTION_CHEERS_1 Αγαλλίαση 1
EMOTION_CHEERS_2 Αγαλλίαση 2
EMOTION_CHEERUP Ευθυμία
EMOTION_CHOOSE_ONE Διάλεξε στόχο
-EMOTION_CLAP Claps
+EMOTION_CLAP Παλαμάκια
EMOTION_CLAP_KISS Φιλί
EMOTION_CONGRATULATION Αποδοχή
EMOTION_DANCE_1 Χορός 1
@@ -416,16 +416,16 @@ PARTY_HEAL_ALL_MEMBER Αποκατάσταση όλων.
PARTY_INCREASE_AREA_150 Η ακτίνας ομάδας αναβαθμίστηκε κατά παράγοντα 1,5. SNA
PARTY_INCREASE_AREA_200 Η ακτίνας ομάδας αναβαθμίστηκε κατά παράγοντα 2. SNA
PARTY_LEAVE Έξοδος από ομάδα
-PARTY_MEMBER_OFFLINE [Offline]
+PARTY_MEMBER_OFFLINE [Εκτός σύνδεσης]
PARTY_RECALL_MEMBER Κλήση μελών ομάδας.
PARTY_REQUEST_DENIED Η αίτηση σου απορρίφθηκε.
-PARTY_SET_ATTACKER Constitute as Επιτιθέμενος.
-PARTY_SET_BERSERKER Constitute as Berserker.
-PARTY_SET_BUFFER Constitute as Blocker.
-PARTY_SET_DEFENDER Constitute as Αμυνόμενος.
+PARTY_SET_ATTACKER Ορισμός ως Επιτιθέμενος.
+PARTY_SET_BERSERKER Ορισμός ως Berserker.
+PARTY_SET_BUFFER Ορισμός ως Blocker.
+PARTY_SET_DEFENDER Ορισμός ως Αμυνόμενος.
PARTY_SET_NORMAL Ρυθμίσεις υποχώρησης.
PARTY_SET_SKILL_MASTER Επιλογή ώς βασικής ικανότητας.
-PARTY_SET_TANKER Σύνταξη μαχητή Σώμα με Σώμα
+PARTY_SET_TANKER Ορισμός ως Μαχητής Σώμα με Σώμα
PARTY_SKILL_ATTACKER Base Attack Value Attacker +%.0f
PARTY_SKILL_BERSERKER Attack Speed Berserker +%.0f
PARTY_SKILL_BUFFER Διάρκεια Ικανότητας Μπλοκ +%.0f
@@ -730,7 +730,7 @@ TOOLTIP_MAX_SP Μεγ. SP +%d SA
TOOLTIP_MAX_SP_PCT Μεγ. SP +%d%% SA
TOOLTIP_MAX_STAMINA Μεγ. Αντοχή +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Μαγική επίθεση/εξ επαφής +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR GPS ERROR(%d, %d)
TOOLTIP_MOV_SPEED Ταχύτητα %d%% SA
TOOLTIP_NECK Περιδέραιο
diff --git a/assets/locale/locale/gr/locale_interface.txt b/assets/locale/locale/gr/locale_interface.txt
index e9eec01e..ed40919e 100644
--- a/assets/locale/locale/gr/locale_interface.txt
+++ b/assets/locale/locale/gr/locale_interface.txt
@@ -175,7 +175,7 @@ LOGIN_CONNECTING Θα συνδεθείτε στο Server
LOGIN_DEFAULT_SERVERADDR Servername, Κανάλι 1
LOGIN_EXIT Έξοδος
LOGIN_ID Όνομα χρήστη
-LOGIN_PASSWORD Σύνθημα
+LOGIN_PASSWORD Συνθηματικό
LOGIN_SELECT_BUTTON Επιλογή
LOGIN_SELECT_EXIT Έξοδος
LOGIN_SELECT_TITLE Επιλογή Server
diff --git a/assets/locale/locale/hu/locale_game.txt b/assets/locale/locale/hu/locale_game.txt
index aec6f9cc..0bfde340 100644
--- a/assets/locale/locale/hu/locale_game.txt
+++ b/assets/locale/locale/hu/locale_game.txt
@@ -728,7 +728,7 @@ TOOLTIP_MAX_SP Max. MP +%d SA
TOOLTIP_MAX_SP_PCT Max. MP +%d%% SA
TOOLTIP_MAX_STAMINA Max. Kitartás +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Mágikus/közelharci támadás +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR GPS HIBA(%d, %d)
TOOLTIP_MOV_SPEED Mozgási sebesség %d%% SA
TOOLTIP_NECK Nyaklánc
diff --git a/assets/locale/locale/it/locale_game.txt b/assets/locale/locale/it/locale_game.txt
index 61574ec0..79244d58 100644
--- a/assets/locale/locale/it/locale_game.txt
+++ b/assets/locale/locale/it/locale_game.txt
@@ -730,7 +730,7 @@ TOOLTIP_MAX_SP Max. MP +%d SA
TOOLTIP_MAX_SP_PCT Max. MP +%d%% SA
TOOLTIP_MAX_STAMINA Max. resistenza +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Attacco/magico Attacco/corpo a corpo +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR GPS-ERRORE(%d, %d)
TOOLTIP_MOV_SPEED Velocità movimento %d%% SA
TOOLTIP_NECK Collana
diff --git a/assets/locale/locale/nl/locale_game.txt b/assets/locale/locale/nl/locale_game.txt
index aeb92451..75779953 100644
--- a/assets/locale/locale/nl/locale_game.txt
+++ b/assets/locale/locale/nl/locale_game.txt
@@ -730,7 +730,7 @@ TOOLTIP_MAX_SP Max. TP +%d SA
TOOLTIP_MAX_SP_PCT Max. TP +%d%% SA
TOOLTIP_MAX_STAMINA Max. Uithoudingsvermogen +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Magische/fysieke aanval +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR GPS ERROR(%d, %d)
TOOLTIP_MOV_SPEED Beweeg Snelheid %d%% SA
TOOLTIP_NECK Ketting
diff --git a/assets/locale/locale/pt/locale_game.txt b/assets/locale/locale/pt/locale_game.txt
index 81e34eb3..a289d84c 100644
--- a/assets/locale/locale/pt/locale_game.txt
+++ b/assets/locale/locale/pt/locale_game.txt
@@ -742,7 +742,7 @@ TOOLTIP_MAX_SP Máx. MN: +%d SA
TOOLTIP_MAX_SP_PCT Máx. MN: +%d%% SA
TOOLTIP_MAX_STAMINA Máx. Resistência: +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Ataque Mágico/Corpo-a-Corpo +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR GPS ERROR(%d, %d)
TOOLTIP_MOV_SPEED Rapidez de Movimento %d%% SA
TOOLTIP_NECK Colar
diff --git a/assets/locale/locale/ro/locale_game.txt b/assets/locale/locale/ro/locale_game.txt
index 81850267..8952c95c 100644
--- a/assets/locale/locale/ro/locale_game.txt
+++ b/assets/locale/locale/ro/locale_game.txt
@@ -730,7 +730,7 @@ TOOLTIP_MAX_SP Max. PM +%d SA
TOOLTIP_MAX_SP_PCT Max. PM +%d%% SA
TOOLTIP_MAX_STAMINA Rezistență max. +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Atac cu arma/magic +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR EROARE-GPS(%d, %d)
TOOLTIP_MOV_SPEED Viteza de mișcare %d%% SA
TOOLTIP_NECK Colier
diff --git a/assets/locale/locale/ru/locale_game.txt b/assets/locale/locale/ru/locale_game.txt
index 44b4a911..55943104 100644
--- a/assets/locale/locale/ru/locale_game.txt
+++ b/assets/locale/locale/ru/locale_game.txt
@@ -730,7 +730,7 @@ TOOLTIP_MAX_SP Максим. МП +%d SA
TOOLTIP_MAX_SP_PCT Максим. МП +%d%% SA
TOOLTIP_MAX_STAMINA Максим. выносливость +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Магическая, ближняя атака +%d%% SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR GPS-ошибка(%d, %d)
TOOLTIP_MOV_SPEED Скорость движения %d%% SA
TOOLTIP_NECK Ожерелье
diff --git a/assets/locale/locale/tr/locale_game.txt b/assets/locale/locale/tr/locale_game.txt
index f1186ae0..4647c58c 100644
--- a/assets/locale/locale/tr/locale_game.txt
+++ b/assets/locale/locale/tr/locale_game.txt
@@ -730,7 +730,7 @@ TOOLTIP_MAX_SP Max. SP +%d SA
TOOLTIP_MAX_SP_PCT Max. SP +%%%d SA
TOOLTIP_MAX_STAMINA Max. Dayanıklılık +%d SA
TOOLTIP_MELEE_MAGIC_ATTBONUS_PER Büyü Saldırı / Yakın Dövüş Saldırı +%%%d SA
-TOOLTIP_MEMORIZED_POSITION %s(%d, %d)
+TOOLTIP_MEMORIZED_POSITION %s (%d, %d)
TOOLTIP_MEMORIZED_POSITION_ERROR GPS ERROR(%d, %d)
TOOLTIP_MOV_SPEED Hareket Hızı %%%d SA
TOOLTIP_NECK Kolye
diff --git a/assets/root/game.py b/assets/root/game.py
index d286ccef..79c89cba 100644
--- a/assets/root/game.py
+++ b/assets/root/game.py
@@ -81,7 +81,7 @@ class GameWindow(ui.ScriptWindow):
self.affectShower = None
self.playerGauge = None
- self.stream=stream
+ self.stream = stream
self.interface = interfaceModule.Interface()
self.interface.MakeInterface()
self.interface.ShowDefaultWindows()
@@ -226,7 +226,7 @@ class GameWindow(ui.ScriptWindow):
(cameraDistance, cameraPitch, cameraRotation, cameraHeight) = app.GetCamera()
if musicInfo.fieldMusic != "":
- snd.FadeOutMusic("BGM/"+ musicInfo.fieldMusic)
+ snd.FadeOutMusic("BGM/" + musicInfo.fieldMusic)
self.onPressKeyDict = None
self.onClickKeyDict = None
@@ -306,43 +306,43 @@ class GameWindow(ui.ScriptWindow):
## Used for number shortcut quickslots (subsequent numbers also reserved for quickslots)
## F12 is client debug key, should not be used here.
- onPressKeyDict[app.DIK_1] = lambda : self.__PressNumKey(1)
- onPressKeyDict[app.DIK_2] = lambda : self.__PressNumKey(2)
- onPressKeyDict[app.DIK_3] = lambda : self.__PressNumKey(3)
- onPressKeyDict[app.DIK_4] = lambda : self.__PressNumKey(4)
- onPressKeyDict[app.DIK_5] = lambda : self.__PressNumKey(5)
- onPressKeyDict[app.DIK_6] = lambda : self.__PressNumKey(6)
- onPressKeyDict[app.DIK_7] = lambda : self.__PressNumKey(7)
- onPressKeyDict[app.DIK_8] = lambda : self.__PressNumKey(8)
- onPressKeyDict[app.DIK_9] = lambda : self.__PressNumKey(9)
- onPressKeyDict[app.DIK_F1] = lambda : self.__PressQuickSlot(4)
- onPressKeyDict[app.DIK_F2] = lambda : self.__PressQuickSlot(5)
- onPressKeyDict[app.DIK_F3] = lambda : self.__PressQuickSlot(6)
- onPressKeyDict[app.DIK_F4] = lambda : self.__PressQuickSlot(7)
+ onPressKeyDict[app.DIK_1] = lambda: self.__PressNumKey(1)
+ onPressKeyDict[app.DIK_2] = lambda: self.__PressNumKey(2)
+ onPressKeyDict[app.DIK_3] = lambda: self.__PressNumKey(3)
+ onPressKeyDict[app.DIK_4] = lambda: self.__PressNumKey(4)
+ onPressKeyDict[app.DIK_5] = lambda: self.__PressNumKey(5)
+ onPressKeyDict[app.DIK_6] = lambda: self.__PressNumKey(6)
+ onPressKeyDict[app.DIK_7] = lambda: self.__PressNumKey(7)
+ onPressKeyDict[app.DIK_8] = lambda: self.__PressNumKey(8)
+ onPressKeyDict[app.DIK_9] = lambda: self.__PressNumKey(9)
+ onPressKeyDict[app.DIK_F1] = lambda: self.__PressQuickSlot(4)
+ onPressKeyDict[app.DIK_F2] = lambda: self.__PressQuickSlot(5)
+ onPressKeyDict[app.DIK_F3] = lambda: self.__PressQuickSlot(6)
+ onPressKeyDict[app.DIK_F4] = lambda: self.__PressQuickSlot(7)
- onPressKeyDict[app.DIK_LALT] = lambda : self.ShowName()
- onPressKeyDict[app.DIK_LCONTROL] = lambda : self.ShowMouseImage()
- onPressKeyDict[app.DIK_SYSRQ] = lambda : self.SaveScreen()
- onPressKeyDict[app.DIK_SPACE] = lambda : self.StartAttack()
+ onPressKeyDict[app.DIK_LALT] = lambda: self.ShowName()
+ onPressKeyDict[app.DIK_LCONTROL] = lambda: self.ShowMouseImage()
+ onPressKeyDict[app.DIK_SYSRQ] = lambda: self.SaveScreen()
+ onPressKeyDict[app.DIK_SPACE] = lambda: self.StartAttack()
#Character movement keys
- onPressKeyDict[app.DIK_UP] = lambda : self.MoveUp()
- onPressKeyDict[app.DIK_DOWN] = lambda : self.MoveDown()
- onPressKeyDict[app.DIK_LEFT] = lambda : self.MoveLeft()
- onPressKeyDict[app.DIK_RIGHT] = lambda : self.MoveRight()
- onPressKeyDict[app.DIK_W] = lambda : self.MoveUp()
- onPressKeyDict[app.DIK_S] = lambda : self.MoveDown()
- onPressKeyDict[app.DIK_A] = lambda : self.MoveLeft()
+ onPressKeyDict[app.DIK_UP] = lambda: self.MoveUp()
+ onPressKeyDict[app.DIK_DOWN] = lambda: self.MoveDown()
+ onPressKeyDict[app.DIK_LEFT] = lambda: self.MoveLeft()
+ onPressKeyDict[app.DIK_RIGHT] = lambda: self.MoveRight()
+ onPressKeyDict[app.DIK_W] = lambda: self.MoveUp()
+ onPressKeyDict[app.DIK_S] = lambda: self.MoveDown()
+ onPressKeyDict[app.DIK_A] = lambda: self.MoveLeft()
# MR-3: Keyboard-enabled deck toggling
- onPressKeyDict[app.DIK_D] = lambda : self.__PressDKey()
+ onPressKeyDict[app.DIK_D] = lambda: self.__PressDKey()
# MR-3: -- END OF -- Keyboard-enabled deck toggling
onPressKeyDict[app.DIK_E] = lambda: app.RotateCamera(app.CAMERA_TO_POSITIVE)
onPressKeyDict[app.DIK_R] = lambda: app.ZoomCamera(app.CAMERA_TO_NEGATIVE)
#onPressKeyDict[app.DIK_F] = lambda: app.ZoomCamera(app.CAMERA_TO_POSITIVE)
onPressKeyDict[app.DIK_T] = lambda: app.PitchCamera(app.CAMERA_TO_NEGATIVE)
- onPressKeyDict[app.DIK_G] = self.__PressGKey
- onPressKeyDict[app.DIK_Q] = self.__PressQKey
+ onPressKeyDict[app.DIK_G] = lambda: self.__PressGKey()
+ onPressKeyDict[app.DIK_Q] = lambda: self.__PressQKey()
onPressKeyDict[app.DIK_NUMPAD9] = lambda: app.MovieResetCamera()
onPressKeyDict[app.DIK_NUMPAD4] = lambda: app.MovieRotateCamera(app.CAMERA_TO_NEGATIVE)
@@ -351,28 +351,28 @@ class GameWindow(ui.ScriptWindow):
onPressKeyDict[app.DIK_PGDN] = lambda: app.MovieZoomCamera(app.CAMERA_TO_POSITIVE)
onPressKeyDict[app.DIK_NUMPAD8] = lambda: app.MoviePitchCamera(app.CAMERA_TO_NEGATIVE)
onPressKeyDict[app.DIK_NUMPAD2] = lambda: app.MoviePitchCamera(app.CAMERA_TO_POSITIVE)
- onPressKeyDict[app.DIK_GRAVE] = lambda : self.PickUpItem()
- onPressKeyDict[app.DIK_Z] = lambda : self.PickUpItem()
+ onPressKeyDict[app.DIK_GRAVE] = lambda: self.PickUpItem()
+ onPressKeyDict[app.DIK_Z] = lambda: self.PickUpItem()
# MR-3: Keyboard-enabled deck toggling
- onPressKeyDict[app.DIK_C] = lambda : self.__PressCKey()
+ onPressKeyDict[app.DIK_C] = lambda: self.__PressCKey()
# MR-3: -- END OF -- Keyboard-enabled deck toggling
onPressKeyDict[app.DIK_V] = lambda state = "SKILL": self.interface.ToggleCharacterWindow(state)
#onPressKeyDict[app.DIK_B] = lambda state = "EMOTICON": self.interface.ToggleCharacterWindow(state)
onPressKeyDict[app.DIK_N] = lambda state = "QUEST": self.interface.ToggleCharacterWindow(state)
- onPressKeyDict[app.DIK_I] = lambda : self.interface.ToggleInventoryWindow()
- onPressKeyDict[app.DIK_O] = lambda : self.interface.ToggleDragonSoulWindowWithNoInfo()
- onPressKeyDict[app.DIK_M] = lambda : self.interface.PressMKey()
- #onPressKeyDict[app.DIK_H] = lambda : self.interface.OpenHelpWindow()
- onPressKeyDict[app.DIK_ADD] = lambda : self.interface.MiniMapScaleUp()
- onPressKeyDict[app.DIK_SUBTRACT] = lambda : self.interface.MiniMapScaleDown()
- onPressKeyDict[app.DIK_L] = lambda : self.interface.ToggleChatLogWindow()
- onPressKeyDict[app.DIK_COMMA] = lambda : self.ShowConsole() # "`" key
- onPressKeyDict[app.DIK_LSHIFT] = lambda : self.__SetQuickPageMode()
+ onPressKeyDict[app.DIK_I] = lambda: self.interface.ToggleInventoryWindow()
+ onPressKeyDict[app.DIK_O] = lambda: self.interface.ToggleDragonSoulWindowWithNoInfo()
+ onPressKeyDict[app.DIK_M] = lambda: self.interface.PressMKey()
+ #onPressKeyDict[app.DIK_H] = lambda: self.interface.OpenHelpWindow()
+ onPressKeyDict[app.DIK_ADD] = lambda: self.interface.MiniMapScaleUp()
+ onPressKeyDict[app.DIK_SUBTRACT] = lambda: self.interface.MiniMapScaleDown()
+ onPressKeyDict[app.DIK_L] = lambda: self.interface.ToggleChatLogWindow()
+ onPressKeyDict[app.DIK_COMMA] = lambda: self.ShowConsole() # "`" key
+ onPressKeyDict[app.DIK_LSHIFT] = lambda: self.__SetQuickPageMode()
- onPressKeyDict[app.DIK_J] = lambda : self.__PressJKey()
- onPressKeyDict[app.DIK_H] = lambda : self.__PressHKey()
- onPressKeyDict[app.DIK_B] = lambda : self.__PressBKey()
- onPressKeyDict[app.DIK_F] = lambda : self.__PressFKey()
+ onPressKeyDict[app.DIK_J] = lambda: self.__PressJKey()
+ onPressKeyDict[app.DIK_H] = lambda: self.__PressHKey()
+ onPressKeyDict[app.DIK_B] = lambda: self.__PressBKey()
+ onPressKeyDict[app.DIK_F] = lambda: self.__PressFKey()
# CUBE_TEST
#onPressKeyDict[app.DIK_K] = lambda : self.interface.OpenCubeWindow()
@@ -1483,30 +1483,33 @@ class GameWindow(ui.ScriptWindow):
#
# Output character coordinates and FPS
(x, y, z) = player.GetMainCharacterPosition()
+
nUpdateTime = app.GetUpdateTime()
nUpdateFPS = app.GetUpdateFPS()
nRenderFPS = app.GetRenderFPS()
nFaceCount = app.GetFaceCount()
fFaceSpeed = app.GetFaceSpeed()
- nST=background.GetRenderShadowTime()
+ nST = background.GetRenderShadowTime()
+
(fAveRT, nCurRT) = app.GetRenderTime()
(iNum, fFogStart, fFogEnd, fFarCilp) = background.GetDistanceSetInfo()
(iPatch, iSplat, fSplatRatio, sTextureNum) = background.GetRenderedSplatNum()
+
if iPatch == 0:
iPatch = 1
#(dwRenderedThing, dwRenderedCRC) = background.GetRenderedGraphicThingInstanceNum()
- self.PrintCoord.SetText("Coordinate: %.2f %.2f %.2f ATM: %d" % (x, y, z, app.GetAvailableTextureMemory()/(1024*1024)))
+ self.PrintCoord.SetText("Coordinate: %.2f %.2f %.2f ATM: %d" % (x, y, z, app.GetAvailableTextureMemory() / (1024 * 1024)))
xMouse, yMouse = wndMgr.GetMousePosition()
self.PrintMousePos.SetText("MousePosition: %d %d" % (xMouse, yMouse))
self.FrameRate.SetText("UFPS: %3d UT: %3d FS %.2f" % (nUpdateFPS, nUpdateTime, fFaceSpeed))
- if fAveRT>1.0:
- self.Pitch.SetText("RFPS: %3d RT:%.2f(%3d) FC: %d(%.2f) " % (nRenderFPS, fAveRT, nCurRT, nFaceCount, nFaceCount/fAveRT))
+ if fAveRT > 1.0:
+ self.Pitch.SetText("RFPS: %3d RT: %.2f(%3d) FC: %d(%.2f) " % (nRenderFPS, fAveRT, nCurRT, nFaceCount, nFaceCount / fAveRT))
- self.Splat.SetText("PATCH: %d SPLAT: %d BAD(%.2f)" % (iPatch, iSplat, fSplatRatio))
+ self.Splat.SetText("PATCH: %d SPLAT: %d BAD (%.2f)" % (iPatch, iSplat, fSplatRatio))
#self.Pitch.SetText("Pitch: %.2f" % (app.GetCameraPitch())
#self.TextureNum.SetText("TN : %s" % (sTextureNum))
#self.ObjectNum.SetText("GTI : %d, CRC : %d" % (dwRenderedThing, dwRenderedCRC))
@@ -1552,6 +1555,7 @@ class GameWindow(ui.ScriptWindow):
textTail.UpdateShowingTextTail()
textTail.ArrangeTextTail()
+
if -1 != self.PickingItemIndex:
textTail.SelectItemName(self.PickingItemIndex)
@@ -1669,7 +1673,7 @@ class GameWindow(ui.ScriptWindow):
try:
for eachInfoText in listText.split("/"):
- eachInfo = eachInfoText.split(",")
+ eachInfo = eachInfoText.split(",")
itemVnum = int(eachInfo[0])
itemCount = int(eachInfo[1])
@@ -1679,7 +1683,8 @@ class GameWindow(ui.ScriptWindow):
resultCount = len(self.cubeInformation[npcVNUM])
requestCount = 7
modCount = resultCount % requestCount
- splitCount = resultCount / requestCount
+ splitCount = resultCount // requestCount
+
for i in range(splitCount):
#print("/cube r_info %d %d" % (i * requestCount, requestCount))
net.SendChatPacket("/cube r_info %d %d" % (i * requestCount, requestCount))
@@ -2131,7 +2136,7 @@ class GameWindow(ui.ScriptWindow):
randX = app.GetRandom(-150, 150)
randY = app.GetRandom(-150, 150)
- snd.PlaySound3D(x+randX, -y+randY, z, "sound/common/etc/salute.mp3")
+ snd.PlaySound3D(x + randX, -y + randY, z, "sound/common/etc/salute.mp3")
def __PartyRequestQuestion(self, vid):
vid = int(vid)
diff --git a/assets/root/interfacemodule.py b/assets/root/interfacemodule.py
index 839eccd3..498b6f2d 100644
--- a/assets/root/interfacemodule.py
+++ b/assets/root/interfacemodule.py
@@ -57,6 +57,9 @@ class Interface(object):
self.inputDialog = None
self.tipBoard = None
self.bigBoard = None
+ # MR-11: Suppress quest button when quest dialog is open to prevent quest button flashing
+ self.questButtonSuppressed = False
+ # MR-11: -- END OF -- Suppress quest button when quest dialog is open to prevent quest button flashing
# ITEM_MALL
self.mallPageDlg = None
@@ -107,11 +110,10 @@ class Interface(object):
self.wndGuild = uiGuild.GuildWindow()
def __MakeChatWindow(self):
-
wndChat = uiChat.ChatWindow()
wndChat.SetSize(wndChat.CHAT_WINDOW_WIDTH, 0)
- wndChat.SetPosition(wndMgr.GetScreenWidth()/2 - wndChat.CHAT_WINDOW_WIDTH/2, wndMgr.GetScreenHeight() - wndChat.EDIT_LINE_HEIGHT - 37)
+ wndChat.SetPosition(wndMgr.GetScreenWidth() // 2 - wndChat.CHAT_WINDOW_WIDTH // 2, wndMgr.GetScreenHeight() - wndChat.EDIT_LINE_HEIGHT - 37)
wndChat.SetHeight(200)
wndChat.Refresh()
wndChat.Show()
@@ -1155,9 +1157,15 @@ class Interface(object):
self.wndDragonSoulRefine,
hideWindows = [x for x in hideWindows if x.IsShow()]
+
list([x.Hide() for x in hideWindows])
+
import sys
+ # MR-11: Suppress quest button when quest dialog is open to prevent quest button flashing
+ self.questButtonSuppressed = True
+ # MR-11: -- END OF -- Suppress quest button when quest dialog is open to prevent quest button flashing
+
self.HideAllQuestButton()
self.HideAllWhisperButton()
@@ -1168,8 +1176,15 @@ class Interface(object):
def __ShowWindows(self, wnds):
import sys
+
list([x.Show() for x in wnds])
+
+ # MR-11: Suppress quest button when quest dialog is open to prevent quest button flashing
+ self.questButtonSuppressed = False
+ # MR-11: -- END OF -- Suppress quest button when quest dialog is open to prevent quest button flashing
+
global IsQBHide
+
if not IsQBHide:
self.ShowAllQuestButton()
else:
@@ -1273,6 +1288,7 @@ class Interface(object):
### Quest ###
def BINARY_ClearQuest(self, index):
btn = self.__FindQuestButton(index)
+
if 0 != btn:
self.__DestroyQuestButton(btn)
@@ -1321,7 +1337,13 @@ class Interface(object):
btn.ToolTipText.SetHorizontalAlignLeft()
btn.SetEvent(ui.__mem_func__(self.__StartQuest), btn)
- btn.Show()
+
+ # MR-1: Hide quest button when quest dialog is open to prevent quest button flashing
+ if IsQBHide or self.questButtonSuppressed:
+ btn.Hide()
+ else:
+ btn.Show()
+ # MR-1: -- END OF -- Hide quest button when quest dialog is open to prevent quest button flashing
btn.index = index
btn.name = name
@@ -1332,7 +1354,6 @@ class Interface(object):
#chat.AppendChat(chat.CHAT_TYPE_NOTICE, localeInfo.QUEST_APPEND)
def __ArrangeQuestButton(self):
-
screenWidth = wndMgr.GetScreenWidth()
screenHeight = wndMgr.GetScreenHeight()
@@ -1345,19 +1366,23 @@ class Interface(object):
if app.IsRTL():
xPos = xPos + 15
- yPos = 170 * screenHeight / 600
- yCount = (screenHeight - 330) / 63
-
+ yPos = 170 * screenHeight // 600
+ yCount = (screenHeight - 330) // 63
count = 0
- for btn in self.questButtonList:
- btn.SetPosition(xPos + (int(count/yCount) * 100), yPos + (count%yCount * 63))
+ for btn in self.questButtonList:
+ btn.SetPosition(xPos + (int(count // yCount) * 100), yPos + (count % yCount * 63))
+
count += 1
+
global IsQBHide
- if IsQBHide:
+
+ # MR-1: Hide quest button when quest dialog is open to prevent quest button flashing
+ if IsQBHide or self.questButtonSuppressed:
btn.Hide()
else:
btn.Show()
+ # MR-1: -- END OF -- Hide quest button when quest dialog is open to prevent quest button flashing
def __StartQuest(self, btn):
event.QuestButtonClick(btn.index)
@@ -1505,19 +1530,19 @@ class Interface(object):
## Rearranges buttons when button count changes
def __ArrangeWhisperButton(self):
-
screenWidth = wndMgr.GetScreenWidth()
screenHeight = wndMgr.GetScreenHeight()
-
+
xPos = screenWidth - 70
- yPos = 170 * screenHeight / 600
- yCount = (screenHeight - 330) / 63
- #yCount = (screenHeight - 285) / 63
+ yPos = 170 * screenHeight // 600
+ yCount = (screenHeight - 330) // 63
+ #yCount = (screenHeight - 285) // 63
count = 0
- for button in self.whisperButtonList:
- button.SetPosition(xPos + (int(count/yCount) * -50), yPos + (count%yCount * 63))
+ for button in self.whisperButtonList:
+ button.SetPosition(xPos + (int(count // yCount) * -50), yPos + (count % yCount * 63))
+
count += 1
## Finds and returns Whisper button by name
diff --git a/assets/root/localeinfo.py b/assets/root/localeinfo.py
index 965c0dcd..721a9240 100644
--- a/assets/root/localeinfo.py
+++ b/assets/root/localeinfo.py
@@ -241,6 +241,7 @@ STAT_MINUS_DESCRIPTION = {
'DEX-': STAT_MINUS_DEX,
}
+# MR-11: Complete map name list
# Map names
MINIMAP_ZONE_NAME_DICT = {
'metin2_map_a1': MAP_A1,
@@ -256,20 +257,42 @@ MINIMAP_ZONE_NAME_DICT = {
'metin2_map_n_flame_01': MAP_FLAME,
'metin2_map_n_desert_01': MAP_DESERT,
'metin2_map_milgyo': MAP_TEMPLE,
+ 'metin2_map_monkeydungeon': MAP_MONKEY_DUNGEON,
+ 'metin2_map_monkeydungeon_02': MAP_MONKEY_DUNGEON2,
+ 'metin2_map_monkeydungeon_03': MAP_MONKEY_DUNGEON3,
'metin2_map_spiderdungeon': MAP_SPIDER,
- 'metin2_map_deviltower1': MAP_SKELTOWER,
- 'metin2_map_guild_01': MAP_AG,
- 'metin2_map_guild_02': MAP_BG,
- 'metin2_map_guild_03': MAP_CG,
+ 'metin2_map_spiderdungeon_02': MAP_SPIDERDUNGEON_02,
+ 'metin2_map_spiderdungeon_03': MAP_SPIDERDUNGEON_03,
+ 'metin2_map_deviltower1': MAP_DEVILTOWER1,
+ 'metin2_map_devilsCatacomb': MAP_DEVILCATACOMB,
+ 'metin2_map_guild_01': MAP_GUILD_01,
+ 'metin2_map_guild_02': MAP_GUILD_02,
+ 'metin2_map_guild_03': MAP_GUILD_03,
+ 'metin2_guild_village_01': GUILD_VILLAGE_01,
+ 'metin2_guild_village_02': GUILD_VILLAGE_02,
+ 'metin2_guild_village_03': GUILD_VILLAGE_03,
'metin2_map_trent': MAP_TREE,
'metin2_map_trent02': MAP_TREE2,
'season1/metin2_map_WL_01': MAP_WL,
'season1/metin2_map_nusluck01': MAP_NUSLUCK,
+ 'season1/metin2_map_oxevent': MAP_OXEVENT,
+ 'metin2_map_wedding_01': MAP_WEDDING_01,
+ 'metin2_map_bf': MAP_BATTLE_FIELD,
+ 'metin2_map_bf_02': MAP_BATTLE_FIELD,
+ 'metin2_map_bf_03': MAP_BATTLE_FIELD,
'Metin2_map_CapeDragonHead': MAP_CAPE,
'metin2_map_Mt_Thunder': MAP_THUNDER,
'metin2_map_dawnmistwood': MAP_DAWN,
'metin2_map_BayBlackSand': MAP_BAY,
+ 'metin2_map_n_flame_dungeon_01': MAP_N_FLAME_DUNGEON_01,
+ 'metin2_map_n_snow_dungeon_01': MAP_N_SNOW_DUNGEON_01,
+ 'metin2_map_duel': MAP_DUEL,
+ 'season2/metin2_map_skipia_dungeon_01': MAP_SKIPIA_DUNGEON_01,
+ 'metin2_map_skipia_dungeon_02': MAP_SKIPIA_DUNGEON_02,
+ 'metin2_map_skipia_dungeon_boss': MAP_SKIPIA_DUNGEON_BOSS,
+ 'metin2_map_skipia_dungeon_boss2': MAP_SKIPIA_DUNGEON_BOSS_2,
}
+# MR-11: -- END OF -- Complete map name list
# Path of quest icon file
def GetLetterImageName():
@@ -351,6 +374,7 @@ def SecondToDHM(time):
day = ((time // 60) // 60) // 24
text = ''
+
if day > 0:
text += str(day) + DAY
text += ' '
@@ -394,18 +418,18 @@ def RTSecondToDHMS(time):
if d or not text:
if d:
- text += "%dd " % d
+ text += str(d) + " " + DAY + (", " if h or m or s else "")
if h or not text:
if h:
- text += "%dh " % h
+ text += str(h) + " " + HOUR + (", " if m or s else "")
if m or not text:
if m:
- text += "%dm " % m
+ text += str(m) + " " + MINUTE + (", " if s else "")
if s or not text:
if s:
- text += "%ds " % s
+ text += str(s) + " " + SECOND
return text.strip()
diff --git a/assets/root/uiaffectshower.py b/assets/root/uiaffectshower.py
index 7e506199..af49942f 100644
--- a/assets/root/uiaffectshower.py
+++ b/assets/root/uiaffectshower.py
@@ -49,7 +49,7 @@ class LovePointImage(ui.ExpandedImageBox):
if 0 == self.lovePoint:
loveGrade = 0
else:
- loveGrade = self.lovePoint // 25 + 1
+ loveGrade = self.lovePoint / 25 + 1
fileName = self.FILE_DICT.get(loveGrade, self.FILE_PATH+"00.dds")
try:
@@ -79,9 +79,9 @@ class HorseImage(ui.ExpandedImageBox):
FILE_DICT = {
00 : FILE_PATH+"00.dds",
- 1 : FILE_PATH+"00.dds",
- 2 : FILE_PATH+"00.dds",
- 3 : FILE_PATH+"00.dds",
+ 0o1 : FILE_PATH+"00.dds",
+ 0o2 : FILE_PATH+"00.dds",
+ 0o3 : FILE_PATH+"00.dds",
10 : FILE_PATH+"10.dds",
11 : FILE_PATH+"11.dds",
12 : FILE_PATH+"12.dds",
@@ -107,7 +107,7 @@ class HorseImage(ui.ExpandedImageBox):
if 0 == level:
return 0
- return (level-1)//10 + 1
+ return (level-1)/10 + 1
def SetState(self, level, health, battery):
#self.textLineList=[]
@@ -305,7 +305,7 @@ class AffectImage(ui.ExpandedImageBox):
self.toolTipText.SetText(text)
w, h = self.toolTipText.GetTextSize()
- self.toolTipText.SetPosition(max(0, x + self.GetWidth()//2 - w//2), y)
+ self.toolTipText.SetPosition(max(0, x + self.GetWidth()/2 - w/2), y)
def SetDescription(self, description):
self.description = description
diff --git a/assets/root/uicharacter.py b/assets/root/uicharacter.py
index d6b0e5f0..acf1dc8a 100644
--- a/assets/root/uicharacter.py
+++ b/assets/root/uicharacter.py
@@ -572,7 +572,7 @@ class CharacterWindow(ui.ScriptWindow):
self.toolTipAlignment.ClearToolTip()
self.toolTipAlignment.AutoAppendTextLine(localeInfo.TITLE_NAME_LIST[grade], gradeColor)
- self.toolTipAlignment.AutoAppendTextLine(localeInfo.ALIGNMENT_NAME + str(point))
+ self.toolTipAlignment.AutoAppendTextLine(localeInfo.ALIGNMENT_NAME + ": " + str(point))
self.toolTipAlignment.AlignHorizonalCenter()
def __ShowStatusMinusButtonList(self):
@@ -695,21 +695,22 @@ class CharacterWindow(ui.ScriptWindow):
for i in range(min(quest.GetQuestCount(), quest.QUEST_MAX_NUM)):
# END_OF_QUEST_LIMIT_COUNT_BUG_FIX
(lastName, lastTime) = quest.GetQuestLastTime(i)
-
clockText = localeInfo.QUEST_UNLIMITED_TIME
+
if len(lastName) > 0:
if lastTime <= 0:
clockText = localeInfo.QUEST_TIMEOVER
else:
- questLastMinute = lastTime / 60
+ questLastMinute = lastTime // 60
questLastSecond = lastTime % 60
clockText = lastName + " : "
if questLastMinute > 0:
clockText += str(questLastMinute) + localeInfo.QUEST_MIN
+
if questLastSecond > 0:
clockText += " "
@@ -1327,7 +1328,7 @@ class CharacterWindow(ui.ScriptWindow):
return realSkillSlot % skill.SKILL_GRADE_STEP_COUNT
def __GetSkillGradeFromSlot(self, skillSlot):
- return int(skillSlot / skill.SKILL_GRADE_STEP_COUNT)
+ return int(skillSlot // skill.SKILL_GRADE_STEP_COUNT)
def SelectSkillGroup(self, index):
self.__SelectSkillGroup(index)
diff --git a/assets/root/uidragonsoul.py b/assets/root/uidragonsoul.py
index c1099677..52efa1dc 100644
--- a/assets/root/uidragonsoul.py
+++ b/assets/root/uidragonsoul.py
@@ -192,6 +192,7 @@ class DragonSoulWindow(ui.ScriptWindow):
def Close(self):
if None != self.tooltipItem:
self.tooltipItem.HideToolTip()
+
self.Hide()
def __DeckButtonDown(self, deck):
@@ -200,18 +201,27 @@ class DragonSoulWindow(ui.ScriptWindow):
def SetInventoryPage(self, page):
if self.inventoryPageIndex != page:
self.__HighlightSlot_ClearCurrentPage()
+
self.inventoryPageIndex = page
- self.inventoryTab[(page+1)%5].SetUp()
- self.inventoryTab[(page+2)%5].SetUp()
- self.inventoryTab[(page+3)%5].SetUp()
- self.inventoryTab[(page+4)%5].SetUp()
+
+ self.inventoryTab[(page + 1) % 5].SetUp()
+ self.inventoryTab[(page + 2) % 5].SetUp()
+ self.inventoryTab[(page + 3) % 5].SetUp()
+ self.inventoryTab[(page + 4) % 5].SetUp()
+
self.RefreshBagSlotWindow()
def SetItemToolTip(self, tooltipItem):
self.tooltipItem = tooltipItem
+
if tooltipItem:
tooltipItem.SetDragonSoulWindow(self)
+ # MR-11: Fix Dragon stones timer auto-start
+ if self.isActivated:
+ self.__WarmDragonSoulTimeCache()
+ # MR-11: -- END OF -- Fix Dragon stones timer auto-start
+
def RefreshItemSlot(self):
self.RefreshBagSlotWindow()
self.RefreshEquipSlotWindow()
@@ -400,9 +410,9 @@ class DragonSoulWindow(ui.ScriptWindow):
itemPrice = item.GetISellItemPrice()
if item.Is1GoldItem():
- itemPrice = itemCount / itemPrice / 5
+ itemPrice = itemCount // itemPrice // 5
else:
- itemPrice = itemPrice * itemCount / 5
+ itemPrice = itemPrice * itemCount // 5
item.GetItemName(itemIndex)
itemName = item.GetItemName()
@@ -547,6 +557,7 @@ class DragonSoulWindow(ui.ScriptWindow):
if mouseModule.mouseController.isAttached():
attachedSlotType = mouseModule.mouseController.GetAttachedType()
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
+
# Case of dragging item onto itself
if player.SLOT_TYPE_INVENTORY == attachedSlotType and itemSlotIndex == attachedSlotPos:
return
@@ -561,6 +572,7 @@ class DragonSoulWindow(ui.ScriptWindow):
else:
selectedItemVNum = player.GetItemIndex(player.INVENTORY, itemSlotIndex)
itemCount = player.GetItemCount(player.INVENTORY, itemSlotIndex)
+
mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_INVENTORY, itemSlotIndex, selectedItemVNum, itemCount)
self.wndItem.SetUseMode(False)
snd.PlaySound("sound/ui/pick.wav")
@@ -581,10 +593,12 @@ class DragonSoulWindow(ui.ScriptWindow):
if 0 == player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, attachedSlotPos, 0):
self.wndPopupDialog.SetText(localeInfo.DRAGON_SOUL_EXPIRED)
self.wndPopupDialog.Open()
+
return
item.SelectItem(attachedItemIndex)
subType = item.GetItemSubType()
+
if subType != (selectedSlot - player.DRAGON_SOUL_EQUIPMENT_SLOT_START):
self.wndPopupDialog.SetText(localeInfo.DRAGON_SOUL_UNMATCHED_SLOT)
self.wndPopupDialog.Open()
@@ -618,11 +632,13 @@ class DragonSoulWindow(ui.ScriptWindow):
net.SendItemUsePacket(*self.srcItemPos)
else:
self.__SendMoveItemPacket(*(self.srcItemPos + self.dstItemPos + (0,)))
+
self.dlgQuestion.Close()
def __Cancel(self):
self.srcItemPos = (0, 0)
self.dstItemPos = (0, 0)
+
self.dlgQuestion.Close()
# Warning dialog related end
@@ -652,9 +668,11 @@ class DragonSoulWindow(ui.ScriptWindow):
if self.isActivated:
self.DeactivateDragonSoul()
net.SendChatPacket("/dragon_soul deactivate")
+
self.deckPageIndex = page
+
self.deckTab[page].Down()
- self.deckTab[(page+1)%2].SetUp()
+ self.deckTab[(page + 1) % 2].SetUp()
self.RefreshEquipSlotWindow()
@@ -663,13 +681,17 @@ class DragonSoulWindow(ui.ScriptWindow):
self.isActivated = True
self.activateButton.Down()
self.deckPageIndex = deck
+
self.deckTab[deck].Down()
- self.deckTab[(deck+1)%2].SetUp()
+ self.deckTab[(deck + 1) % 2].SetUp()
+
self.RefreshEquipSlotWindow()
+ self.__WarmDragonSoulTimeCache(deck)
def DeactivateDragonSoul(self):
self.isActivated = False
self.activateButton.SetUp()
+
if self.tooltipItem:
self.tooltipItem.ClearDragonSoulTimeCache()
@@ -682,8 +704,11 @@ class DragonSoulWindow(ui.ScriptWindow):
if not self.isActivated or self.deckPageIndex != deckIndex:
if self.__CanActivateDeck():
net.SendChatPacket("/dragon_soul activate " + str(deckIndex))
+
self.isActivated = True
+
self.activateButton.Down()
+ self.__WarmDragonSoulTimeCache(deckIndex)
else:
self.isActivated = False
self.activateButton.SetUp()
@@ -695,13 +720,16 @@ class DragonSoulWindow(ui.ScriptWindow):
def __CanActivateDeck(self):
canActiveNum = 0
+
for i in range(6):
slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)
itemVnum = player.GetItemIndex(slotNumber)
if itemVnum != 0:
item.SelectItem(itemVnum)
+
isNoLimit = True
+
for i in range(item.LIMIT_MAX_NUM):
(limitType, limitValue) = item.GetLimit(i)
@@ -711,14 +739,34 @@ class DragonSoulWindow(ui.ScriptWindow):
if item.LIMIT_TIMER_BASED_ON_WEAR == limitType:
isNoLimit = False
remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0)
+
if 0 != remain_time:
canActiveNum += 1
break
+
# Dragon soul can be activated if it has no timer
if isNoLimit:
canActiveNum += 1
return canActiveNum > 0
+
+ # MR-11: Fix Dragon stones timer auto-start
+ def __WarmDragonSoulTimeCache(self, deckIndex = None):
+ if not self.tooltipItem:
+ return
+
+ if not self.isActivated:
+ return
+
+ if deckIndex is None:
+ deckIndex = self.deckPageIndex
+
+ deckStart = deckIndex * player.DRAGON_SOUL_EQUIPMENT_FIRST_SIZE
+ deckStart += player.DRAGON_SOUL_EQUIPMENT_SLOT_START
+ slotNumbers = [deckStart + i for i in range(6)]
+
+ self.tooltipItem.WarmDragonSoulTimeCache(slotNumbers)
+ # MR-11: -- END OF -- Fix Dragon stones timer auto-start
# Activation related end
@@ -1136,10 +1184,10 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
def __GetDragonSoulTypeInfo(self, vnum):
if not self.__IsDragonSoul(vnum):
return DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO
- ds_type = vnum / 10000
- grade = vnum % 10000 /1000
- step = vnum % 1000 / 100
- strength = vnum % 100 / 10
+ ds_type = vnum // 10000
+ grade = vnum % 10000 //1000
+ step = vnum % 1000 // 100
+ strength = vnum % 100 // 10
return (ds_type, grade, step, strength)
diff --git a/assets/root/uiguild.py b/assets/root/uiguild.py
index 573a498c..fc11e168 100644
--- a/assets/root/uiguild.py
+++ b/assets/root/uiguild.py
@@ -605,7 +605,7 @@ class ChangeGradeNameDialog(ui.ScriptWindow):
self.gradeNameSlot.SetText("")
self.gradeNameSlot.SetFocus()
xMouse, yMouse = wndMgr.GetMousePosition()
- self.SetPosition(xMouse - self.GetWidth()/2, yMouse + 50)
+ self.SetPosition(xMouse - self.GetWidth() / 2, yMouse + 50)
self.SetTop()
self.Show()
def Close(self):
@@ -1194,7 +1194,7 @@ class GuildWindow(ui.ScriptWindow):
## Passive
"""
- for i in xrange(len(playerSettingModule.PASSIVE_GUILD_SKILL_INDEX_LIST)):
+ for i in range(len(playerSettingModule.PASSIVE_GUILD_SKILL_INDEX_LIST)):
slotIndex = page.passiveSlot.GetStartIndex()+i
skillIndex = playerSettingModule.PASSIVE_GUILD_SKILL_INDEX_LIST[i]
@@ -1398,21 +1398,26 @@ class GuildWindow(ui.ScriptWindow):
return
global DISABLE_DECLARE_WAR
+
page = self.pageWindow["GUILD_INFO"]
+
page.nameSlot.SetText(guild.GetGuildName())
page.masterNameSlot.SetText(guild.GetGuildMasterName())
page.guildLevelSlot.SetText(str(guild.GetGuildLevel()))
+
if page.guildMoneySlot:
page.guildMoneySlot.SetText(str(guild.GetGuildMoney()))
curExp, lastExp = guild.GetGuildExperience()
curExp *= 100
lastExp *= 100
+
page.curExpSlot.SetText(str(curExp))
page.lastExpSlot.SetText(str(lastExp))
curMemberCount, maxMemberCount = guild.GetGuildMemberCount()
- if maxMemberCount== 0xffff:
+
+ if maxMemberCount == 0xffff:
page.memberCountSlot.SetText("%d / %s " % (curMemberCount, localeInfo.GUILD_MEMBER_COUNT_INFINITY))
else:
page.memberCountSlot.SetText("%d / %d" % (curMemberCount, maxMemberCount))
@@ -2668,6 +2673,7 @@ if __name__ == "__main__":
material = tokens[TOKEN_MATERIAL]
folderName = ""
+
if "HEADQUARTER" == type:
folderName = "headquarter"
elif "FACILITY" == type:
@@ -2677,14 +2683,19 @@ if __name__ == "__main__":
##"BuildIn" Is made by exist instance.
materialList = ["0", "0", "0"]
+
if material[0] == "\"":
material = material[1:]
+
if material[-1] == "\"":
material = material[:-1]
+
for one in material.split("/"):
data = one.split(",")
+
if 2 != len(data):
continue
+
itemID = int(data[0])
count = data[1]
@@ -2717,7 +2728,7 @@ if __name__ == "__main__":
app.CloseTextFile(handle)
- LoadGuildBuildingList(app.GetLocalePath()+"/GuildBuildingList.txt")
+ LoadGuildBuildingList(app.GetLocalePath() + "/GuildBuildingList.txt")
class TestGame(ui.Window):
def __init__(self):
diff --git a/assets/root/uiinventory.py b/assets/root/uiinventory.py
index 67974c68..949f6518 100644
--- a/assets/root/uiinventory.py
+++ b/assets/root/uiinventory.py
@@ -797,9 +797,9 @@ class InventoryWindow(ui.ScriptWindow):
itemPrice = item.GetISellItemPrice()
if item.Is1GoldItem():
- itemPrice = itemCount / itemPrice / 5
+ itemPrice = itemCount // itemPrice // 5
else:
- itemPrice = itemPrice * itemCount / 5
+ itemPrice = itemPrice * itemCount // 5
item.GetItemName(itemIndex)
itemName = item.GetItemName()
@@ -1036,6 +1036,7 @@ class InventoryWindow(ui.ScriptWindow):
# MR-10: Add belt support for accessory sockets
def __CanPutBeltSocket(self, dstSlotPos, mtrlVnum):
dstItemVNum = player.GetItemIndex(dstSlotPos)
+
if dstItemVNum == 0:
return False
diff --git a/assets/root/uimessenger.py b/assets/root/uimessenger.py
index cc5ff9f4..16fd9db6 100644
--- a/assets/root/uimessenger.py
+++ b/assets/root/uimessenger.py
@@ -108,8 +108,9 @@ class MessengerItem(ui.Window):
def OnRender(self):
if self.isSelected:
x, y = self.GetGlobalPosition()
+
grp.SetColor(grp.GenerateColor(0.0, 0.0, 0.7, 0.7))
- grp.RenderBar(x+16, y, self.GetWidth()-16, self.GetHeight())
+ grp.RenderBar(x + 16, y, self.GetWidth() - 16, self.GetHeight())
class MessengerMemberItem(MessengerItem):
@@ -444,12 +445,12 @@ class MessengerWindow(ui.ScriptWindow):
if self.isLoaded==0:
return
- if self.showingPageSize/20 >= len(self.showingItemList):
+ if self.showingPageSize / 20 >= len(self.showingItemList):
self.scrollBar.Hide()
self.startLine = 0
else:
if self.showingItemList:
- self.scrollBar.SetMiddleBarSize(float(self.showingPageSize/20) / float(len(self.showingItemList)))
+ self.scrollBar.SetMiddleBarSize(float(self.showingPageSize / 20) / float(len(self.showingItemList)))
self.scrollBar.Show()
#####
@@ -465,6 +466,7 @@ class MessengerWindow(ui.ScriptWindow):
item.Show()
yPos += 20
+
if yPos > heightLimit:
break
@@ -547,7 +549,7 @@ class MessengerWindow(ui.ScriptWindow):
self.OnCloseQuestionDialog()
def OnScroll(self):
- scrollLineCount = len(self.showingItemList) - (self.showingPageSize/20)
+ scrollLineCount = len(self.showingItemList) - (self.showingPageSize / 20)
startLine = int(scrollLineCount * self.scrollBar.GetPos())
if startLine != self.startLine:
diff --git a/assets/root/uiminimap.py b/assets/root/uiminimap.py
index bb5a7910..b6c5a2c9 100644
--- a/assets/root/uiminimap.py
+++ b/assets/root/uiminimap.py
@@ -177,7 +177,7 @@ class AtlasWindow(ui.ScriptWindow):
ui.ScriptWindow.Show(self)
def SetCenterPositionAdjust(self, x, y):
- self.SetPosition((wndMgr.GetScreenWidth() - self.GetWidth()) / 2 + x, (wndMgr.GetScreenHeight() - self.GetHeight()) / 2 + y)
+ self.SetPosition((wndMgr.GetScreenWidth() - self.GetWidth()) // 2 + x, (wndMgr.GetScreenHeight() - self.GetHeight()) // 2 + y)
def OnPressEscapeKey(self):
self.Hide()
@@ -385,24 +385,26 @@ class MiniMap(ui.ScriptWindow):
(x, y, z) = player.GetMainCharacterPosition()
miniMap.Update(x, y)
- self.positionInfo.SetText("(%.0f, %.0f)" % (x/100, y/100))
+ self.positionInfo.SetText("(%.0f, %.0f)" % (x // 100, y // 100))
if self.tooltipInfo:
if True == self.MiniMapWindow.IsIn():
(mouseX, mouseY) = wndMgr.GetMousePosition()
(bFind, sName, iPosX, iPosY, dwTextColor) = miniMap.GetInfo(mouseX, mouseY)
+
if bFind == 0:
self.tooltipInfo.Hide()
elif not self.canSeeInfo:
- self.tooltipInfo.SetText("%s(%s)" % (sName, localeInfo.UI_POS_UNKNOWN))
+ self.tooltipInfo.SetText("%s (%s)" % (sName, localeInfo.UI_POS_UNKNOWN))
self.tooltipInfo.SetTooltipPosition(mouseX - 5, mouseY)
self.tooltipInfo.SetTextColor(dwTextColor)
self.tooltipInfo.Show()
else:
if app.IsRTL() and sName[-1].isalnum():
- self.tooltipInfo.SetText("(%s)%d, %d" % (sName, iPosX, iPosY))
+ self.tooltipInfo.SetText("(%s) %d, %d" % (sName, iPosX, iPosY))
else:
- self.tooltipInfo.SetText("%s(%d, %d)" % (sName, iPosX, iPosY))
+ self.tooltipInfo.SetText("%s (%d, %d)" % (sName, iPosX, iPosY))
+
self.tooltipInfo.SetTooltipPosition(mouseX - 5, mouseY)
self.tooltipInfo.SetTextColor(dwTextColor)
self.tooltipInfo.Show()
diff --git a/assets/root/uiplayergauge.py b/assets/root/uiplayergauge.py
index 40068de6..2e73bda2 100644
--- a/assets/root/uiplayergauge.py
+++ b/assets/root/uiplayergauge.py
@@ -4,7 +4,6 @@ import chr
import textTail
class PlayerGauge(ui.Gauge):
-
def __init__(self, parent):
ui.Gauge.__init__(self)
self.SetParent(parent)
@@ -29,7 +28,7 @@ class PlayerGauge(ui.Gauge):
(x, y, z)=textTail.GetPosition(playerIndex)
isChat = textTail.IsChat(playerIndex)
- ui.Gauge.SetPosition(self, int(x - self.GetWidth()/2), int(y + 5) + isChat*17)
+ ui.Gauge.SetPosition(self, int(x - self.GetWidth() // 2), int(y + 5) + isChat * 17)
def RefreshGauge(self):
@@ -43,11 +42,11 @@ class PlayerGauge(ui.Gauge):
else:
if self.IsShow():
- if self.curHP > self.maxHP / 2:
+ if self.curHP > self.maxHP // 2:
self.Hide()
else:
- if self.curHP < self.maxHP / 2:
+ if self.curHP < self.maxHP // 2:
self.OnUpdate()
self.Show()
diff --git a/assets/root/uisafebox.py b/assets/root/uisafebox.py
index d9e4fb0b..9c22a9bf 100644
--- a/assets/root/uisafebox.py
+++ b/assets/root/uisafebox.py
@@ -312,9 +312,11 @@ class SafeboxWindow(ui.ScriptWindow):
self.pageButtonList = []
text = "I"
- pos = -int(float(pageCount-1)/2 * 52)
+ pos = -int(float(pageCount-1) / 2 * 52)
+
for i in range(pageCount):
button = ui.RadioButton()
+
button.SetParent(self)
button.SetUpVisual("d:/ymir work/ui/game/windows/tab_button_middle_01.sub")
button.SetOverVisual("d:/ymir work/ui/game/windows/tab_button_middle_02.sub")
@@ -325,6 +327,7 @@ class SafeboxWindow(ui.ScriptWindow):
button.SetText(text)
button.SetEvent(lambda arg=i: self.SelectPage(arg))
button.Show()
+
self.pageButtonList.append(button)
pos += 52
@@ -343,11 +346,11 @@ class SafeboxWindow(ui.ScriptWindow):
self.RefreshSafebox()
def __LocalPosToGlobalPos(self, local):
- return self.curPageIndex*safebox.SAFEBOX_PAGE_SIZE + local
+ return self.curPageIndex * safebox.SAFEBOX_PAGE_SIZE + local
def SetTableSize(self, size):
- pageCount = max(1, size / safebox.SAFEBOX_SLOT_Y_COUNT)
+ pageCount = max(1, size // safebox.SAFEBOX_SLOT_Y_COUNT)
pageCount = min(3, pageCount)
size = safebox.SAFEBOX_SLOT_Y_COUNT
@@ -358,6 +361,7 @@ class SafeboxWindow(ui.ScriptWindow):
self.wndItem.SetSlotBaseImage("d:/ymir work/ui/public/Slot_Base.sub", 1.0, 1.0, 1.0, 1.0)
wnd_height = 130 + 32 * size
+
self.wndBoard.SetSize(self.BOX_WIDTH, wnd_height)
self.SetSize(self.BOX_WIDTH, wnd_height)
self.UpdateRect()
@@ -422,6 +426,7 @@ class SafeboxWindow(ui.ScriptWindow):
#snd.PlaySound("sound/ui/drop.wav")
else:
attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)
+
if player.RESERVED_WINDOW == attachedInvenType:
return
@@ -429,18 +434,15 @@ class SafeboxWindow(ui.ScriptWindow):
net.SendSafeboxSaveMoneyPacket(mouseModule.mouseController.GetAttachedItemCount())
snd.PlaySound("sound/ui/money.wav")
else:
- chat
net.SendSafeboxCheckinPacket(attachedInvenType, attachedSlotPos, selectedSlotPos)
#snd.PlaySound("sound/ui/drop.wav")
mouseModule.mouseController.DeattachObject()
def SelectItemSlot(self, selectedSlotPos):
-
selectedSlotPos = self.__LocalPosToGlobalPos(selectedSlotPos)
if mouseModule.mouseController.isAttached():
-
attachedSlotType = mouseModule.mouseController.GetAttachedType()
if player.SLOT_TYPE_INVENTORY == attachedSlotType:
@@ -459,6 +461,7 @@ class SafeboxWindow(ui.ScriptWindow):
else:
curCursorNum = app.GetCursor()
+
if app.SELL == curCursorNum:
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SAFEBOX_SELL_DISABLE_SAFEITEM)
@@ -580,7 +583,7 @@ class MallWindow(ui.ScriptWindow):
def SetTableSize(self, size):
- pageCount = max(1, size / safebox.SAFEBOX_SLOT_Y_COUNT)
+ pageCount = max(1, size // safebox.SAFEBOX_SLOT_Y_COUNT)
pageCount = min(3, pageCount)
size = safebox.SAFEBOX_SLOT_Y_COUNT
@@ -588,20 +591,22 @@ class MallWindow(ui.ScriptWindow):
self.wndItem.RefreshSlot()
self.wndItem.SetSlotBaseImage("d:/ymir work/ui/public/Slot_Base.sub", 1.0, 1.0, 1.0, 1.0)
- self.wndBoard.SetSize(self.BOX_WIDTH, 82 + 32*size)
- self.SetSize(self.BOX_WIDTH, 85 + 32*size)
+ self.wndBoard.SetSize(self.BOX_WIDTH, 82 + 32 * size)
+ self.SetSize(self.BOX_WIDTH, 85 + 32 * size)
self.UpdateRect()
def RefreshMall(self):
- getItemID=safebox.GetMallItemID
- getItemCount=safebox.GetMallItemCount
- setItemID=self.wndItem.SetItemSlot
+ getItemID = safebox.GetMallItemID
+ getItemCount = safebox.GetMallItemCount
+ setItemID = self.wndItem.SetItemSlot
for i in range(safebox.GetMallSize()):
itemID = getItemID(i)
itemCount = getItemCount(i)
+
if itemCount <= 1:
itemCount = 0
+
setItemID(i, itemID, itemCount)
self.wndItem.RefreshSlot()
diff --git a/assets/root/uiselectitem.py b/assets/root/uiselectitem.py
index 85aa1c47..55896738 100644
--- a/assets/root/uiselectitem.py
+++ b/assets/root/uiselectitem.py
@@ -84,6 +84,7 @@ class SelectItemWindow(ui.ScriptWindow):
slotNumber = i
itemVNum = getItemVNum(slotNumber)
+
if 0 == itemVNum:
continue
@@ -91,6 +92,7 @@ class SelectItemWindow(ui.ScriptWindow):
continue
itemGrade = player.GetItemGrade(slotNumber)
+
if itemGrade > 2:
continue
@@ -102,14 +104,17 @@ class SelectItemWindow(ui.ScriptWindow):
break
itemCount = len(self.inventorySlotPosDict)
+
if itemCount < 15:
self.SetTableSize(3)
else:
lineCount = 3
- lineCount += (itemCount - 15) / 5
+ lineCount += (itemCount - 15) // 5
+
if itemCount % 5:
lineCount += 1
+
self.SetTableSize(lineCount)
for selectWndPos, inventoryPos in list(self.inventorySlotPosDict.items()):
diff --git a/assets/root/uishop.py b/assets/root/uishop.py
index 8feb6b14..361b73fa 100644
--- a/assets/root/uishop.py
+++ b/assets/root/uishop.py
@@ -310,9 +310,9 @@ class ShopDialog(ui.ScriptWindow):
itemPrice = item.GetISellItemPrice()
if item.Is1GoldItem():
- itemPrice = attachedCount / itemPrice / 5
+ itemPrice = attachedCount // itemPrice // 5
else:
- itemPrice = itemPrice * max(1, attachedCount) / 5
+ itemPrice = itemPrice * max(1, attachedCount) // 5
itemName = item.GetItemName()
diff --git a/assets/root/uisystemoption.py b/assets/root/uisystemoption.py
index 2e76e380..0c5efe49 100644
--- a/assets/root/uisystemoption.py
+++ b/assets/root/uisystemoption.py
@@ -192,7 +192,7 @@ class OptionDialog(ui.ScriptWindow):
self.selectMusicFile.SetText(fileName[:MUSIC_FILENAME_MAX_LEN])
if musicInfo.fieldMusic != "":
- snd.FadeOutMusic("BGM/"+ musicInfo.fieldMusic)
+ snd.FadeOutMusic("BGM/" + musicInfo.fieldMusic)
if fileName==uiSelectMusic.DEFAULT_THEMA:
musicInfo.fieldMusic=musicInfo.METIN2THEMA
diff --git a/assets/root/uitarget.py b/assets/root/uitarget.py
index a6627906..a4a8512d 100644
--- a/assets/root/uitarget.py
+++ b/assets/root/uitarget.py
@@ -77,6 +77,7 @@ class TargetBoard(ui.ThinBoard):
self.buttonDict = {}
self.showingButtonList = []
+
for buttonName in self.BUTTON_NAME_LIST:
button = ui.Button()
button.SetParent(self)
@@ -223,7 +224,7 @@ class TargetBoard(ui.ThinBoard):
self.eventWhisper = event
def UpdatePosition(self):
- self.SetPosition(wndMgr.GetScreenWidth()/2 - self.GetWidth()/2, 10)
+ self.SetPosition(wndMgr.GetScreenWidth() // 2 - self.GetWidth() // 2, 10)
def ResetTargetBoard(self):
@@ -270,7 +271,7 @@ class TargetBoard(ui.ThinBoard):
def SetHP(self, hpPercentage):
if not self.hpGauge.IsShow():
- self.SetSize(200 + 7*self.nameLength, self.GetHeight())
+ self.SetSize(200 + 7 * self.nameLength, self.GetHeight())
if app.IsRTL():
self.name.SetPosition( self.GetWidth()-23, 13)
@@ -376,7 +377,6 @@ class TargetBoard(ui.ThinBoard):
return self.isShowButton
def RefreshButton(self):
-
self.HideAllButton()
if chr.INSTANCE_TYPE_BUILDING == chr.GetInstanceType(self.vid):
@@ -386,7 +386,7 @@ class TargetBoard(ui.ThinBoard):
if player.IsPVPInstance(self.vid) or player.IsObserverMode():
# PVP_INFO_SIZE_BUG_FIX
- self.SetSize(200 + 7*self.nameLength, 40)
+ self.SetSize(200 + 7 * self.nameLength, 40)
self.UpdatePosition()
# END_OF_PVP_INFO_SIZE_BUG_FIX
return
@@ -444,7 +444,8 @@ class TargetBoard(ui.ThinBoard):
def __ArrangeButtonPosition(self):
showingButtonCount = len(self.showingButtonList)
- pos = -(showingButtonCount / 2) * 68
+ pos = -(showingButtonCount // 2) * 68
+
if 0 == showingButtonCount % 2:
pos += 34
diff --git a/assets/root/uitaskbar.py b/assets/root/uitaskbar.py
index b4d1bdd2..064aec4b 100644
--- a/assets/root/uitaskbar.py
+++ b/assets/root/uitaskbar.py
@@ -173,7 +173,7 @@ class EnergyBar(ui.ScriptWindow):
if leftTime == 0:
self.energyEmpty.Show()
- elif ((leftTime * 100) / maxTime) < 15:
+ elif ((leftTime * 100) // maxTime) < 15:
self.energyHungry.Show()
else:
self.energyFull.Show()
@@ -461,12 +461,14 @@ class TaskBar(ui.ScriptWindow):
if app.IsRTL():
systemButton = toggleButtonDict[TaskBar.BUTTON_SYSTEM]
+
if systemButton.ToolTipText:
tx, ty = systemButton.ToolTipText.GetLocalPosition()
tw = systemButton.ToolTipText.GetWidth()
- systemButton.ToolTipText.SetPosition(-tw/2, ty)
+ systemButton.ToolTipText.SetPosition(-tw // 2, ty)
expGauge = []
+
expGauge.append(self.GetChild("EXPGauge_01"))
expGauge.append(self.GetChild("EXPGauge_02"))
expGauge.append(self.GetChild("EXPGauge_03"))
@@ -726,6 +728,7 @@ class TaskBar(ui.ScriptWindow):
def SetST(self, curPoint, maxPoint):
curPoint = min(curPoint, maxPoint)
+
if maxPoint > 0:
self.stGauge.SetPercentage(curPoint, maxPoint)
self.tooltipST.SetText("%s : %d / %d" % (localeInfo.TASKBAR_ST, curPoint, maxPoint))
diff --git a/assets/root/uitooltip.py b/assets/root/uitooltip.py
index 61477f4a..b7672628 100644
--- a/assets/root/uitooltip.py
+++ b/assets/root/uitooltip.py
@@ -167,8 +167,9 @@ class ToolTip(ui.ThinBoard):
def AlignHorizonalCenter(self):
for child in self.childrenList:
- (x, y)=child.GetLocalPosition()
- child.SetPosition(self.toolTipWidth/2, y)
+ (x, y) = child.GetLocalPosition()
+
+ child.SetPosition(self.toolTipWidth // 2, y)
self.ResizeToolTip()
@@ -177,13 +178,15 @@ class ToolTip(ui.ThinBoard):
# MR-10: Fix element centering in tooltips
if type(child).__name__ == "TextLine" and getattr(child, "_centerAlign", False):
(x, y) = child.GetLocalPosition()
- child.SetPosition(self.toolTipWidth / 2, y)
+
+ child.SetPosition(self.toolTipWidth // 2, y)
# MR-10: -- END OF -- Fix element centering in tooltips
self.ResizeToolTip()
def AutoAppendTextLine(self, text, color = FONT_COLOR, centerAlign = True):
textLine = ui.TextLine()
+
textLine.SetParent(self)
textLine.SetFontName(self.defFontName)
textLine.SetPackedFontColor(color)
@@ -197,7 +200,7 @@ class ToolTip(ui.ThinBoard):
# MR-10: -- END OF -- Fix element centering in tooltips
if centerAlign:
- textLine.SetPosition(self.toolTipWidth/2, self.toolTipHeight)
+ textLine.SetPosition(self.toolTipWidth // 2, self.toolTipHeight)
textLine.SetHorizontalAlignCenter()
else:
@@ -242,7 +245,7 @@ class ToolTip(ui.ThinBoard):
if centerAlign:
textLine.SetHorizontalAlignCenter()
- textLine.SetPosition(self.toolTipWidth / 2, self.toolTipHeight)
+ textLine.SetPosition(self.toolTipWidth // 2, self.toolTipHeight)
else:
textLine.SetPosition(10, self.toolTipHeight)
@@ -335,16 +338,16 @@ class ToolTip(ui.ThinBoard):
else:
y = mouseY - height - 30
- x = mouseX - width/2
+ x = mouseX - width // 2
else:
- x = self.xPos - width/2
+ x = self.xPos - width // 2
y = self.yPos - height
x = max(x, 0)
y = max(y, 0)
- x = min(x + width/2, wndMgr.GetScreenWidth() - width/2) - width/2
+ x = min(x + width // 2, wndMgr.GetScreenWidth() - width // 2) - width // 2
y = min(y + self.GetHeight(), wndMgr.GetScreenHeight()) - self.GetHeight()
parentWindow = self.GetParentProxy()
@@ -356,7 +359,6 @@ class ToolTip(ui.ThinBoard):
self.SetPosition(x, y)
class ItemToolTip(ToolTip):
-
CHARACTER_NAMES = (
localeInfo.TOOLTIP_WARRIOR,
localeInfo.TOOLTIP_ASSASSIN,
@@ -503,6 +505,7 @@ class ItemToolTip(ToolTip):
def __init__(self, *args, **kwargs):
ToolTip.__init__(self, *args, **kwargs)
+
self.itemVnum = 0
self.metinSlot = []
self.isShopItem = False
@@ -514,14 +517,19 @@ class ItemToolTip(ToolTip):
self.wndDragonSoul = None
self.dsActivatedTimeCache = {}
# MR-10: Add accessorySocketTimeCache for real-time remaining time display of accessory sockets.
+
cache = getattr(app, "_accessorySocketTimeCache", None)
+
if cache is None:
cache = getattr(player, "_accessorySocketTimeCache", None)
if cache is None:
cache = constInfo.ACCESSORY_SOCKET_TIME_CACHE
+
app._accessorySocketTimeCache = cache
player._accessorySocketTimeCache = cache
+
constInfo.ACCESSORY_SOCKET_TIME_CACHE = cache
+
self.accessorySocketTimeCache = cache
# MR-10: -- END OF -- Add accessorySocketTimeCache for real-time remaining time display of accessory sockets.
self.hairIcon = None
@@ -536,6 +544,38 @@ class ItemToolTip(ToolTip):
def ClearDragonSoulTimeCache(self):
self.dsActivatedTimeCache = {}
+ # MR-11: Fix Dragon stones timer auto-start
+ def WarmDragonSoulTimeCache(self, slotNumbers):
+ if not slotNumbers:
+ return
+
+ now = app.GetGlobalTimeStamp()
+
+ for slotNumber in slotNumbers:
+ itemVnum = player.GetItemIndex(slotNumber)
+
+ if itemVnum == 0:
+ continue
+
+ item.SelectItem(itemVnum)
+
+ remainSec = None
+
+ for i in range(item.LIMIT_MAX_NUM):
+ (limitType, limitValue) = item.GetLimit(i)
+
+ if item.LIMIT_TIMER_BASED_ON_WEAR == limitType:
+ remainSec = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0)
+
+ break
+
+ if remainSec is None or remainSec <= 0:
+ continue
+
+ key = (itemVnum, slotNumber)
+ self.dsActivatedTimeCache[key] = { "remainSec": remainSec, "endTime": now + remainSec }
+ # MR-11: -- END OF -- Fix Dragon stones timer auto-start
+
def SetCannotUseItemForceSetDisableColor(self, enable):
self.bCannotUseItemForceSetDisableColor = enable
@@ -593,6 +633,7 @@ class ItemToolTip(ToolTip):
def AppendTextLineTime(self, endTime, getLimit):
color = self.FONT_COLOR
+
if not self.CanEquip() and self.bCannotUseItemForceSetDisableColor:
color = self.DISABLE_COLOR
@@ -1075,7 +1116,7 @@ class ItemToolTip(ToolTip):
## Rod ##
elif item.ITEM_TYPE_ROD == itemType:
if 0 != metinSlot:
- curLevel = item.GetValue(0) / 10
+ curLevel = item.GetValue(0) // 10
curEXP = metinSlot[0]
maxEXP = item.GetValue(2)
self.__AppendLimitInformation()
@@ -1085,7 +1126,7 @@ class ItemToolTip(ToolTip):
elif item.ITEM_TYPE_PICK == itemType:
if 0 != metinSlot:
- curLevel = item.GetValue(0) / 10
+ curLevel = item.GetValue(0) // 10
curEXP = metinSlot[0]
maxEXP = item.GetValue(2)
self.__AppendLimitInformation()
@@ -1126,7 +1167,7 @@ class ItemToolTip(ToolTip):
self.AppendTextLine(affectText, self.NORMAL_COLOR)
if time > 0:
- minute = (time / 60)
+ minute = (time // 60)
second = (time % 60)
timeString = localeInfo.TOOLTIP_POTION_TIME
@@ -1227,9 +1268,9 @@ class ItemToolTip(ToolTip):
self.AppendSpace(5)
if localeMapName!="":
- self.AppendTextLine(localeInfo.TOOLTIP_MEMORIZED_POSITION % (localeMapName, int(xPos-xBase)/100, int(yPos-yBase)/100), self.NORMAL_COLOR)
+ self.AppendTextLine(localeInfo.TOOLTIP_MEMORIZED_POSITION % (localeMapName, int(xPos-xBase) // 100, int(yPos-yBase) // 100), self.NORMAL_COLOR)
else:
- self.AppendTextLine(localeInfo.TOOLTIP_MEMORIZED_POSITION_ERROR % (int(xPos)/100, int(yPos)/100), self.NORMAL_COLOR)
+ self.AppendTextLine(localeInfo.TOOLTIP_MEMORIZED_POSITION_ERROR % (int(xPos) // 100, int(yPos) // 100), self.NORMAL_COLOR)
dbg.TraceError("NOT_EXIST_IN_MINIMAP_ZONE_NAME_DICT: %s" % mapName)
#####
@@ -1327,8 +1368,9 @@ class ItemToolTip(ToolTip):
self.ShowToolTip()
def __DragonSoulInfoString (self, dwVnum):
- step = (dwVnum / 100) % 10
- refine = (dwVnum / 10) % 10
+ step = (dwVnum // 100) % 10
+ refine = (dwVnum // 10) % 10
+
if 0 == step:
return localeInfo.DRAGON_SOUL_STEP_LEVEL1 + " " + localeInfo.DRAGON_SOUL_STRENGTH(refine)
elif 1 == step:
@@ -1377,11 +1419,11 @@ class ItemToolTip(ToolTip):
itemImage.Show()
if self.__IsOldHair(itemVnum):
- itemImage.LoadImage("d:/ymir work/item/quest/"+str(itemVnum)+".tga")
+ itemImage.LoadImage("d:/ymir work/item/quest/" + str(itemVnum) + ".tga")
elif self.__IsNewHair3(itemVnum):
itemImage.LoadImage("icon/hair/%d.sub" % (itemVnum))
elif self.__IsNewHair(itemVnum): # Use by linking to existing hair numbers. New items have numbers increased by 1000.
- itemImage.LoadImage("d:/ymir work/item/quest/"+str(itemVnum-1000)+".tga")
+ itemImage.LoadImage("d:/ymir work/item/quest/" + str(itemVnum - 1000) + ".tga")
elif self.__IsNewHair2(itemVnum):
itemImage.LoadImage("icon/hair/%d.sub" % (itemVnum))
elif self.__IsCostumeHair(itemVnum):
@@ -1389,7 +1431,7 @@ class ItemToolTip(ToolTip):
# MR-10: Fix element centering in tooltips
self.hairIcon = itemImage
- xPos = max(0, (self.toolTipWidth - itemImage.GetWidth()) / 2)
+ xPos = max(0, (self.toolTipWidth - itemImage.GetWidth()) // 2)
itemImage.SetPosition(xPos, self.toolTipHeight)
# MR-10: -- END OF -- Fix element centering in tooltips
@@ -1407,7 +1449,7 @@ class ItemToolTip(ToolTip):
return
(xPos, yPos) = self.hairIcon.GetLocalPosition()
- xPos = max(0, (self.toolTipWidth - self.hairIcon.GetWidth()) / 2)
+ xPos = max(0, (self.toolTipWidth - self.hairIcon.GetWidth()) // 2)
self.hairIcon.SetPosition(xPos, yPos)
# MR-10: -- END OF -- Fix element centering in tooltips
@@ -1658,21 +1700,22 @@ class ItemToolTip(ToolTip):
self.AppendTextLine(localeInfo.TOOLTIP_POTION_PLUS_MOVING_SPEED % point, self.GetChangeTextLineColor(point))
if time > 0:
- minute = (time / 60)
+ minute = (time // 60)
second = (time % 60)
timeString = localeInfo.TOOLTIP_POTION_TIME
if minute > 0:
- timeString += str(minute) + localeInfo.TOOLTIP_POTION_MIN
+ timeString += " " + str(minute) + localeInfo.TOOLTIP_POTION_MIN
if second > 0:
timeString += " " + str(second) + localeInfo.TOOLTIP_POTION_SEC
self.AppendTextLine(timeString)
def GetPriceColor(self, price):
- if price>=constInfo.HIGH_PRICE:
+ if price >= constInfo.HIGH_PRICE:
return self.HIGH_PRICE_COLOR
- if price>=constInfo.MIDDLE_PRICE:
+
+ if price >= constInfo.MIDDLE_PRICE:
return self.MIDDLE_PRICE_COLOR
else:
return self.LOW_PRICE_COLOR
@@ -1733,7 +1776,7 @@ class ItemToolTip(ToolTip):
textLine = ui.TextLine()
textLine.SetParent(self)
textLine.SetFontName(self.defFontName)
- textLine.SetPosition(self.toolTipWidth/2, self.toolTipHeight)
+ textLine.SetPosition(self.toolTipWidth // 2, self.toolTipHeight)
textLine.SetHorizontalAlignCenter()
textLine.SetPackedFontColor(self.NORMAL_COLOR)
textLine.SetText(wearNames)
@@ -1776,27 +1819,30 @@ class ItemToolTip(ToolTip):
def __AppendAccessoryMetinSlotInfo(self, metinSlot, mtrlVnum):
ACCESSORY_SOCKET_MAX_SIZE = 3
- cur=min(metinSlot[0], ACCESSORY_SOCKET_MAX_SIZE)
- end=min(metinSlot[1], ACCESSORY_SOCKET_MAX_SIZE)
+ cur = min(metinSlot[0], ACCESSORY_SOCKET_MAX_SIZE)
+ end = min(metinSlot[1], ACCESSORY_SOCKET_MAX_SIZE)
affectType1, affectValue1 = item.GetAffect(0)
- affectList1=[0, max(1, affectValue1*10/100), max(2, affectValue1*20/100), max(3, affectValue1*40/100)]
+ affectList1=[0, max(1, affectValue1 * 10 // 100), max(2, affectValue1 * 20 // 100), max(3, affectValue1 * 40 // 100)]
affectType2, affectValue2 = item.GetAffect(1)
- affectList2=[0, max(1, affectValue2*10/100), max(2, affectValue2*20/100), max(3, affectValue2*40/100)]
+ affectList2 = [0, max(1, affectValue2 * 10 // 100), max(2, affectValue2 * 20 // 100), max(3, affectValue2 * 40 // 100)]
+
+ mtrlPos = 0
+ mtrlList = [mtrlVnum] * cur + [player.METIN_SOCKET_TYPE_SILVER] * (end-cur)
- mtrlPos=0
- mtrlList=[mtrlVnum]*cur+[player.METIN_SOCKET_TYPE_SILVER]*(end-cur)
for mtrl in mtrlList:
- affectString1 = self.__GetAffectString(affectType1, affectList1[mtrlPos+1]-affectList1[mtrlPos])
- affectString2 = self.__GetAffectString(affectType2, affectList2[mtrlPos+1]-affectList2[mtrlPos])
+ affectString1 = self.__GetAffectString(affectType1, affectList1[mtrlPos + 1] - affectList1[mtrlPos])
+ affectString2 = self.__GetAffectString(affectType2, affectList2[mtrlPos + 1] - affectList2[mtrlPos])
leftTime = 0
- if cur == mtrlPos+1:
- leftTime=metinSlot[2]
+
+ if cur == mtrlPos + 1:
+ leftTime = metinSlot[2]
self.__AppendMetinSlotInfo_AppendMetinSocketData(mtrlPos, mtrl, affectString1, affectString2, leftTime)
- mtrlPos+=1
+
+ mtrlPos += 1
def __AppendMetinSlotInfo(self, metinSlot):
if self.__AppendMetinSlotInfo_IsEmptySlotList(metinSlot):
@@ -1964,6 +2010,7 @@ class ItemToolTip(ToolTip):
def AppendUniqueItemLastTime(self, restMin):
if restMin > 0:
restSecond = restMin * 60
+
self.AppendSpace(5)
self.AppendTextLine(localeInfo.LEFT_TIME + " : " + localeInfo.RTSecondToDHMS(restSecond), self.NORMAL_COLOR)
@@ -1972,7 +2019,7 @@ class ItemToolTip(ToolTip):
self.AppendSpace(5)
self.AppendTextLineTime(endTime, getLimit)
- def AppendTextLineTime(self, endTime, getLimit, color=FONT_COLOR):
+ def AppendTextLineTime(self, endTime, getLimit, color = FONT_COLOR):
leftSec = max(0, endTime - app.GetGlobalTimeStamp())
timeTextLine = ui.TextLine()
@@ -1985,7 +2032,7 @@ class ItemToolTip(ToolTip):
timeTextLine.SetOutline()
timeTextLine.SetFeather(False)
- timeTextLine.SetPosition(self.toolTipWidth / 2, self.toolTipHeight)
+ timeTextLine.SetPosition(self.toolTipWidth // 2, self.toolTipHeight)
timeTextLine.SetHorizontalAlignCenter()
timeTextLine.Show()
@@ -2002,6 +2049,7 @@ class ItemToolTip(ToolTip):
if remainSec <= 0:
self.AppendSpace(5)
self.AppendTextLine(localeInfo.CANNOT_USE, self.DISABLE_COLOR)
+
return
isTimerActive = self.__IsTimerBasedOnWearActive()
@@ -2009,9 +2057,11 @@ class ItemToolTip(ToolTip):
if not isTimerActive:
self.AppendSpace(5)
self.AppendTextLine(localeInfo.LEFT_TIME + ": " + localeInfo.RTSecondToDHMS(remainSec), self.NORMAL_COLOR)
+
return
endTime = self.__GetOrCreateCachedEndTime(remainSec)
+
self.AppendMallItemLastTime(endTime, getLimit)
def __IsTimerBasedOnWearActive(self):
@@ -2067,7 +2117,8 @@ class ItemToolTip(ToolTip):
(limitType, limitValue) = item.GetLimit(limitIndex)
endTime = limitValue
- self.AppendUniqueItemLastTime(endTime / 60)
+ self.AppendUniqueItemLastTime(endTime // 60)
+
return
endTime += app.GetGlobalTimeStamp()
@@ -2334,17 +2385,20 @@ class SkillToolTip(ToolTip):
conditionDataCount = skill.GetSkillConditionDescriptionCount(skillIndex)
if conditionDataCount > 0:
self.AppendSpace(5)
+
for i in range(conditionDataCount):
self.AppendTextLine(skill.GetSkillConditionDescription(skillIndex, i), self.CONDITION_COLOR)
def AppendGuildSkillData(self, skillIndex, skillLevel):
skillMaxLevel = 7
skillCurrentPercentage = float(skillLevel) / float(skillMaxLevel)
- skillNextPercentage = float(skillLevel+1) / float(skillMaxLevel)
+ skillNextPercentage = float(skillLevel + 1) / float(skillMaxLevel)
+
## Current Level
if skillLevel > 0:
if self.HasSkillLevelDescription(skillIndex, skillLevel):
self.AppendSpace(5)
+
if skillLevel == skillMaxLevel:
self.AppendTextLine(localeInfo.TOOLTIP_SKILL_LEVEL_MASTER % (skillLevel), self.NORMAL_COLOR)
else:
@@ -2357,6 +2411,7 @@ class SkillToolTip(ToolTip):
## Cooltime
coolTime = skill.GetSkillCoolTime(skillIndex, skillCurrentPercentage)
+
if coolTime > 0:
self.AppendTextLine(localeInfo.TOOLTIP_SKILL_COOL_TIME + str(coolTime), self.ENABLE_COLOR)
@@ -2569,23 +2624,24 @@ class SkillToolTip(ToolTip):
slotIndex = player.GetSkillSlotIndex(skillIndex)
skillPower = player.GetSkillCurrentEfficientPercentage(slotIndex)
k = player.GetSkillLevel(skillIndex) / 100.0
+
self.AppendSpace(5)
self.AutoAppendTextLine(localeInfo.TOOLTIP_PARTY_SKILL_LEVEL % skillLevel, self.NORMAL_COLOR)
- if skillLevel>=10:
+ if skillLevel >= 10:
self.AutoAppendTextLine(localeInfo.PARTY_SKILL_ATTACKER % chop( 10 + 60 * k ))
- if skillLevel>=20:
+ if skillLevel >= 20:
self.AutoAppendTextLine(localeInfo.PARTY_SKILL_BERSERKER % chop(1 + 5 * k))
self.AutoAppendTextLine(localeInfo.PARTY_SKILL_TANKER % chop(50 + 1450 * k))
- if skillLevel>=25:
+ if skillLevel >= 25:
self.AutoAppendTextLine(localeInfo.PARTY_SKILL_BUFFER % chop(5 + 45 * k ))
- if skillLevel>=35:
+ if skillLevel >= 35:
self.AutoAppendTextLine(localeInfo.PARTY_SKILL_SKILL_MASTER % chop(25 + 600 * k ))
- if skillLevel>=40:
+ if skillLevel >= 40:
self.AutoAppendTextLine(localeInfo.PARTY_SKILL_DEFENDER % chop( 5 + 30 * k ))
self.AlignHorizonalCenter()