🌐
@@ -100,7 +120,7 @@ input.savePath {
align-items: center;
background-color: #34353a;
height: 1.8rem;
- width: 40vw;
+ max-width: 30vw;
margin: .2rem;
padding: .2rem .4rem;
border-radius: .5rem;
diff --git a/frontend/palworld-pal-editor-webui/src/stores/paleditor.js b/frontend/palworld-pal-editor-webui/src/stores/paleditor.js
index 6d109b1..a7f7b3d 100644
--- a/frontend/palworld-pal-editor-webui/src/stores/paleditor.js
+++ b/frontend/palworld-pal-editor-webui/src/stores/paleditor.js
@@ -251,6 +251,7 @@ export const usePalEditorStore = defineStore("paleditor", () => {
const UPDATE_PAL_RESELECT_CTR = ref(0);
const SHOW_UNREF_PAL_FLAG = ref(false);
const SHOW_OOB_PAL_FLAG = ref(true);
+ const HIDE_INVALID_OPTIONS = ref(true)
const PAL_LIST_SEARCH_KEYWORD = ref("")
@@ -1167,7 +1168,8 @@ export const usePalEditorStore = defineStore("paleditor", () => {
UPDATE_PAL_RESELECT_CTR,
SHOW_UNREF_PAL_FLAG,
SHOW_OOB_PAL_FLAG,
-
+ HIDE_INVALID_OPTIONS,
+
PAL_LIST_SEARCH_KEYWORD,
IS_LOCKED,
diff --git a/src/palworld_pal_editor/api/save.py b/src/palworld_pal_editor/api/save.py
index 3f8fff9..371f044 100644
--- a/src/palworld_pal_editor/api/save.py
+++ b/src/palworld_pal_editor/api/save.py
@@ -152,6 +152,7 @@ def get_pal_data():
"I18n": DataProvider.get_pal_i18n(pal["InternalName"])
or pal["InternalName"],
"SortingKey": DataProvider.get_pal_sorting_key(pal["InternalName"]),
+ "IsHuman": DataProvider.is_pal_human(pal["InternalName"]) or False
}
pal_dict[pal["InternalName"]] = data
pal_arr.append(data)
diff --git a/src/palworld_pal_editor/utils/data_provider.py b/src/palworld_pal_editor/utils/data_provider.py
index c6b7d81..2433555 100644
--- a/src/palworld_pal_editor/utils/data_provider.py
+++ b/src/palworld_pal_editor/utils/data_provider.py
@@ -116,6 +116,7 @@ def get_sorted_pals() -> list[dict]:
DataProvider.get_pal_sorting_key(item["InternalName"])
or DataProvider.get_pal_i18n(item["InternalName"])
),
+ len(item["InternalName"])
),
)
return sorted_list
From c1fe7c5089436ea505e5dc3ac76cf4bc42fadc18 Mon Sep 17 00:00:00 2001
From: connlost <4348524953.h@gmail.com>
Date: Fri, 5 Apr 2024 23:02:26 +0800
Subject: [PATCH 09/12] Fix a bug that prevents setting pal species to be human
---
src/palworld_pal_editor/core/pal_entity.py | 29 ++++++++++++++--------
1 file changed, 19 insertions(+), 10 deletions(-)
diff --git a/src/palworld_pal_editor/core/pal_entity.py b/src/palworld_pal_editor/core/pal_entity.py
index a891dcd..5a1268e 100644
--- a/src/palworld_pal_editor/core/pal_entity.py
+++ b/src/palworld_pal_editor/core/pal_entity.py
@@ -157,7 +157,8 @@ def CharacterID(self, value: str) -> None:
self.heal_pal()
self.clear_worker_sick()
# self.MaxHP = self.ComputedMaxHP
- self.HP = self.ComputedMaxHP
+ if maxHP := self.ComputedMaxHP:
+ self.HP = maxHP
@property
def _RawSpecieKey(self) -> Optional[str]:
@@ -284,7 +285,8 @@ def IsTower(self, value: bool) -> None:
else:
self.CharacterID = f"GYM_{self._RawSpecieKey}"
# self.MaxHP = self.ComputedMaxHP
- self.HP = self.ComputedMaxHP
+ if maxHP := self.ComputedMaxHP:
+ self.HP = maxHP
@property
def _IsBOSS(self) -> bool:
@@ -325,7 +327,8 @@ def IsBOSS(self, value: bool) -> None:
self._IsBOSS = value
# Update MaxHP
# self.MaxHP = self.ComputedMaxHP
- self.HP = self.ComputedMaxHP
+ if maxHP := self.ComputedMaxHP:
+ self.HP = maxHP
@property
def IsRarePal(self) -> Optional[bool]:
@@ -383,7 +386,8 @@ def Level(self, value: int) -> None:
self.Exp = DataProvider.get_level_xp(self.Level)
# Update MaxHP
# self.MaxHP = self.ComputedMaxHP
- self.HP = self.ComputedMaxHP
+ if maxHP := self.ComputedMaxHP:
+ self.HP = maxHP
# Learn Attacks
self.learn_attacks()
@@ -422,7 +426,8 @@ def Rank(self, rank: PalRank | int) -> None:
PalObjects.set_BaseType(self._pal_param["Rank"], pal_rank.value)
# self.MaxHP = self.ComputedMaxHP
- self.HP = self.ComputedMaxHP
+ if maxHP := self.ComputedMaxHP:
+ self.HP = maxHP
if self.Rank == PalRank.Rank0:
self._pal_param.pop("Rank", None)
@@ -449,7 +454,8 @@ def Rank_CraftSpeed(self) -> Optional[int]:
def Rank_HP(self, rank: int) -> None:
self._set_soul_rank('Rank_HP', rank)
# self.MaxHP = self.ComputedMaxHP
- self.HP = self.ComputedMaxHP
+ if maxHP := self.ComputedMaxHP:
+ self.HP = maxHP
@Rank_Attack.setter
@LOGGER.change_logger('Rank_Attack')
@@ -470,7 +476,7 @@ def Rank_CraftSpeed(self, rank: int) -> None:
self._set_soul_rank('Rank_CraftSpeed', rank)
@property
- def ComputedMaxHP(self) -> int:
+ def ComputedMaxHP(self) -> Optional[int]:
"""
Credit to https://www.reddit.com/r/Palworld/comments/1afyau4/pal_stat_mechanics_hidden_ivs_levelup_stats_and/
"""
@@ -583,7 +589,8 @@ def add_PassiveSkillList(self, skill: str) -> bool:
LOGGER.info(f"Added {DataProvider.get_passive_i18n(skill)[0]} to PassiveSkillList")
# Update MaxHP, but no such skill atm.
# self.MaxHP = self.ComputedMaxHP
- # self.HP = self.ComputedMaxHP
+ # if maxHP := self.ComputedMaxHP:
+ # self.HP = maxHP
return True
@LOGGER.change_logger('PassiveSkillList')
@@ -722,7 +729,8 @@ def Talent_Defense(self) -> Optional[int]:
def Talent_HP(self, value: int):
self._set_iv("Talent_HP", value)
# self.MaxHP = self.ComputedMaxHP
- self.HP = self.ComputedMaxHP
+ if maxHP := self.ComputedMaxHP:
+ self.HP = maxHP
@Talent_Melee.setter
@LOGGER.change_logger("Talent_Melee")
@@ -847,7 +855,8 @@ def heal_pal(self):
self._pal_param.pop("PhysicalHealth", None)
# if not self.MaxHP:
# self.MaxHP = self.ComputedMaxHP
- self.HP = self.ComputedMaxHP
+ if maxHP := self.ComputedMaxHP:
+ self.HP = maxHP
@property
def FoodWithStatusEffect(self) -> Optional[str]:
From 5113ed9601929e982071f034057a1b45fbf6eece Mon Sep 17 00:00:00 2001
From: connlost <4348524953.h@gmail.com>
Date: Sat, 6 Apr 2024 00:12:56 +0800
Subject: [PATCH 10/12] Add / Remove Human_Punch skill on CharacterID change
---
.../assets/data/pal_attacks.json | 8 ++++----
src/palworld_pal_editor/core/pal_entity.py | 18 ++++++++++++------
2 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/src/palworld_pal_editor/assets/data/pal_attacks.json b/src/palworld_pal_editor/assets/data/pal_attacks.json
index 6d6be9e..8693e05 100644
--- a/src/palworld_pal_editor/assets/data/pal_attacks.json
+++ b/src/palworld_pal_editor/assets/data/pal_attacks.json
@@ -2397,19 +2397,19 @@
"Power": 12,
"I18n": {
"en": {
- "Name": "Punch",
+ "Name": "Punch [Human]",
"Description": "Punch with conviction; believe in the power of the fist."
},
"zh-CN": {
- "Name": "击打",
+ "Name": "击打 [人类]",
"Description": "相信自己的拳头,出拳攻击。"
},
"ja": {
- "Name": "パンチ",
+ "Name": "パンチ [人間]",
"Description": "己の拳を信じて、パンチする。"
}
},
- "Invalid": true
+ "UniqueSkill": true
},
"EPalWazaID::Throw": {
"InternalName": "EPalWazaID::Throw",
diff --git a/src/palworld_pal_editor/core/pal_entity.py b/src/palworld_pal_editor/core/pal_entity.py
index 5a1268e..178c4ca 100644
--- a/src/palworld_pal_editor/core/pal_entity.py
+++ b/src/palworld_pal_editor/core/pal_entity.py
@@ -688,8 +688,9 @@ def add_MasteredWaza(self, waza: str) -> bool:
# PalObjects.add_ArrayProperty(self._pal_param["MasteredWaza"], waza)
LOGGER.info(f"Added {DataProvider.get_attack_i18n(waza)[0]} to MasteredWaza")
- # if self.num_EmptyEquipWaza > 0:
- # self.add_EquipWaza(waza)
+ if self.num_EmptyEquipWaza > 0:
+ self.add_EquipWaza(waza)
+
return True
@LOGGER.change_logger('MasteredWaza')
@@ -886,9 +887,12 @@ def Timer_FoodWithStatusEffect(self, val: int) -> bool:
PalObjects.set_BaseType(self._pal_param['Tiemr_FoodWithStatusEffect'], val)
def learn_attacks(self):
- for atk in DataProvider.get_attacks_to_learn(self.DataAccessKey, self.Level or 1):
- if atk not in (self.MasteredWaza or []):
- self.add_MasteredWaza(atk)
+ if self.IsHuman:
+ self.add_MasteredWaza("EPalWazaID::Human_Punch")
+ else:
+ for atk in DataProvider.get_attacks_to_learn(self.DataAccessKey, self.Level or 1):
+ if atk not in (self.MasteredWaza or []):
+ self.add_MasteredWaza(atk)
# for atk in DataProvider.get_attacks_to_forget(self.DataAccessKey, self.Level):
# if atk in self.MasteredWaza:
# self.pop_MasteredWaza(atk)
@@ -899,7 +903,9 @@ def remove_unique_attacks(self):
atks = self.MasteredWaza.copy()
if not atks: return
for atk in atks:
- if DataProvider.is_unique_attacks(atk):
+ if self.IsHuman:
+ self.pop_MasteredWaza(item=atk)
+ elif DataProvider.is_unique_attacks(atk):
self.pop_MasteredWaza(item=atk)
@LOGGER.change_logger("WorkerSick")
From f5cde5d5979bc8902e205c10862825c562609aa0 Mon Sep 17 00:00:00 2001
From: connlost <4348524953.h@gmail.com>
Date: Sat, 6 Apr 2024 00:16:57 +0800
Subject: [PATCH 11/12] Update Pal Data (PalDeck ID, i18n, Invalid Pal)
---
.../assets/data/pal_data.json | 99 ++++++++++---------
1 file changed, 55 insertions(+), 44 deletions(-)
diff --git a/src/palworld_pal_editor/assets/data/pal_data.json b/src/palworld_pal_editor/assets/data/pal_data.json
index 6a63e83..0dcb01e 100644
--- a/src/palworld_pal_editor/assets/data/pal_data.json
+++ b/src/palworld_pal_editor/assets/data/pal_data.json
@@ -416,11 +416,11 @@
},
"I18n": {
"en": "Gumoss (Special)",
- "zh-CN": "叶泥泥 (Special)",
+ "zh-CN": "叶泥泥 (特殊)",
"ja": "ナエモチ (特殊)"
},
"SortingKey": {
- "paldeck": "13S"
+ "paldeck": "13"
}
},
"CuteFox": {
@@ -3605,7 +3605,7 @@
"ja": "ゾーイ & エレパンダ"
},
"SortingKey": {
- "paldeck": "103T"
+ "paldeck": "103"
},
"Scaling": {
"HP": 6000,
@@ -3690,7 +3690,7 @@
"ja": "リリィ & リリクイン"
},
"SortingKey": {
- "paldeck": "104T"
+ "paldeck": "104"
},
"Scaling": {
"HP": 5500,
@@ -3751,7 +3751,7 @@
"ja": "マーカス & ホルス"
},
"SortingKey": {
- "paldeck": "105T"
+ "paldeck": "105"
},
"Scaling": {
"HP": 6500,
@@ -3812,7 +3812,7 @@
"ja": "アクセル & ボルゼクス"
},
"SortingKey": {
- "paldeck": "106T"
+ "paldeck": "106"
},
"Scaling": {
"HP": 6500,
@@ -3873,7 +3873,7 @@
"ja": "ヴィクター & ゼノグリフ"
},
"SortingKey": {
- "paldeck": "107T"
+ "paldeck": "107"
},
"Scaling": {
"HP": 8000,
@@ -4080,7 +4080,7 @@
"ja": "狂乱の淑女 ベラノワール"
},
"SortingKey": {
- "paldeck": "112R"
+ "paldeck": "112"
}
},
"NightLady_Dark": {
@@ -4138,7 +4138,7 @@
"ja": "幽玄の魔女 ベラルージュ"
},
"SortingKey": {
- "paldeck": "112R1"
+ "paldeck": "112B"
}
},
"RAID_NightLady_Dark_2": {
@@ -4168,7 +4168,7 @@
"ja": "幽玄の魔女【極】 ベラルージュ"
},
"SortingKey": {
- "paldeck": "112R2"
+ "paldeck": "112B"
}
},
@@ -4241,7 +4241,8 @@
"I18n": {
"en": "Boltmane"
},
- "SortingKey": {}
+ "SortingKey": {},
+ "Invalid": true
},
"FeatherOstrich": {
"InternalName": "FeatherOstrich",
@@ -4445,7 +4446,8 @@
"I18n": {
"en": "Dragostrophe"
},
- "SortingKey": {}
+ "SortingKey": {},
+ "Invalid": true
},
"DarkMutant": {
"InternalName": "DarkMutant",
@@ -4462,7 +4464,8 @@
"I18n": {
"en": "DarkMutant"
},
- "SortingKey": {}
+ "SortingKey": {},
+ "Invalid": true
},
@@ -4704,10 +4707,10 @@
"Attacks": {},
"Human": true,
"I18n": {
- "en": "Believer_Fat_GatlingGun",
- "zh-CN": "Believer_Fat_GatlingGun"
+ "en": "Name_Believer_BOSS"
},
- "SortingKey": {}
+ "SortingKey": {},
+ "Invalid": true
},
"Female_DesertPeople02": {
"InternalName": "Female_DesertPeople02",
@@ -4784,7 +4787,8 @@
"en": "Villager (Male_Trader01)",
"zh-CN": "村民 (Male_Trader01)"
},
- "SortingKey": {}
+ "SortingKey": {},
+ "Invalid": true
},
"Male_Trader02": {
"InternalName": "Male_Trader02",
@@ -4795,7 +4799,8 @@
"en": "Villager (Male_Trader02)",
"zh-CN": "村民 (Male_Trader02)"
},
- "SortingKey": {}
+ "SortingKey": {},
+ "Invalid": true
},
"Male_Trader03": {
"InternalName": "Male_Trader03",
@@ -4806,7 +4811,8 @@
"en": "Villager (Male_Trader03)",
"zh-CN": "村民 (Male_Trader03)"
},
- "SortingKey": {}
+ "SortingKey": {},
+ "Invalid": true
},
"MobuVillager": {
"InternalName": "MobuVillager",
@@ -4869,8 +4875,8 @@
"Attacks": {},
"Human": true,
"I18n": {
- "en": "Islander (Soldier01)",
- "zh-CN": "岛民 (Soldier01)"
+ "en": "Islander (Female_Soldier01)",
+ "zh-CN": "岛民 (Female_Soldier01)"
},
"SortingKey": {}
},
@@ -4880,8 +4886,8 @@
"Attacks": {},
"Human": true,
"I18n": {
- "en": "Islander (Soldier02)",
- "zh-CN": "岛民 (Soldier02)"
+ "en": "Islander (Female_Soldier02)",
+ "zh-CN": "岛民 (Female_Soldier02)"
},
"SortingKey": {}
},
@@ -4891,8 +4897,8 @@
"Attacks": {},
"Human": true,
"I18n": {
- "en": "Islander (Soldier03)",
- "zh-CN": "岛民 (Soldier03)"
+ "en": "Islander (Female_Soldier03)",
+ "zh-CN": "岛民 (Female_Soldier03)"
},
"SortingKey": {}
},
@@ -4902,8 +4908,8 @@
"Attacks": {},
"Human": true,
"I18n": {
- "en": "Islander (Soldier04)",
- "zh-CN": "岛民 (Soldier04)"
+ "en": "Islander (Female_Soldier04)",
+ "zh-CN": "岛民 (Female_Soldier04)"
},
"SortingKey": {}
},
@@ -4990,8 +4996,8 @@
"Attacks": {},
"Human": true,
"I18n": {
- "en": "Weapons Dealer",
- "zh-CN": "武器商人"
+ "en": "(Not a Merchant) Weapons Dealer",
+ "zh-CN": "(不是商人) 武器商人"
},
"SortingKey": {}
},
@@ -5001,8 +5007,8 @@
"Attacks": {},
"Human": true,
"I18n": {
- "en": "Pal Merchant (GoodwillAmbassador)",
- "zh-CN": "帕鲁商人 (GoodwillAmbassador)"
+ "en": "(Not a Merchant) Pal Merchant (GoodwillAmbassador)",
+ "zh-CN": "(不是商人) 帕鲁商人 (GoodwillAmbassador)"
},
"SortingKey": {}
},
@@ -5012,8 +5018,8 @@
"Attacks": {},
"Human": true,
"I18n": {
- "en": "Pal Merchant (Inspector)",
- "zh-CN": "帕鲁商人 (Inspector)"
+ "en": "(Not a Merchant) Pal Merchant (Inspector)",
+ "zh-CN": "(不是商人) 帕鲁商人 (Inspector)"
},
"SortingKey": {}
},
@@ -5056,8 +5062,8 @@
"Attacks": {},
"Human": true,
"I18n": {
- "en": "Pal Merchant (PalTrader)",
- "zh-CN": "帕鲁商人 (PalTrader)"
+ "en": "(Not a Merchant) Pal Merchant (PalTrader)",
+ "zh-CN": "(不是商人) 帕鲁商人 (PalTrader)"
},
"SortingKey": {}
},
@@ -5078,8 +5084,8 @@
"Attacks": {},
"Human": true,
"I18n": {
- "en": "Pal Merchant (Robbery_Leader)",
- "zh-CN": "帕鲁商人 (Robbery_Leader)"
+ "en": "(Not a Merchant) Pal Merchant (Robbery_Leader)",
+ "zh-CN": "(不是商人) 帕鲁商人 (Robbery_Leader)"
},
"SortingKey": {}
},
@@ -5089,8 +5095,8 @@
"Attacks": {},
"Human": true,
"I18n": {
- "en": "Pal Merchant (Robbery_Minion)",
- "zh-CN": "帕鲁商人 (Robbery_Minion)"
+ "en": "(Not a Merchant) Pal Merchant (Robbery_Minion)",
+ "zh-CN": "(不是商人) 帕鲁商人 (Robbery_Minion)"
},
"SortingKey": {}
},
@@ -5169,7 +5175,8 @@
"en": "Wandering Merchant (Visitor_Present)",
"zh-CN": "流浪商人 (Visitor_Present)"
},
- "SortingKey": {}
+ "SortingKey": {},
+ "Invalid": true
},
"Guard_Rifle": {
"InternalName": "Guard_Rifle",
@@ -5295,7 +5302,8 @@
"I18n": {
"en": "InternalName: QuestMan"
},
- "SortingKey": {}
+ "SortingKey": {},
+ "Invalid": true
},
"TestAssassin": {
"InternalName": "TestAssassin",
@@ -5305,7 +5313,8 @@
"I18n": {
"en": "InternalName: TestAssassin"
},
- "SortingKey": {}
+ "SortingKey": {},
+ "Invalid": true
},
"TestNPC": {
"InternalName": "TestNPC",
@@ -5315,7 +5324,8 @@
"I18n": {
"en": "InternalName: TestNPC"
},
- "SortingKey": {}
+ "SortingKey": {},
+ "Invalid": true
},
"SecurityDrone": {
"InternalName": "SecurityDrone",
@@ -5326,7 +5336,8 @@
"en": "Drone",
"zh-CN": "监视无人机"
},
- "SortingKey": {}
+ "SortingKey": {},
+ "Invalid": true
},
"VisitingMerchant": {
"InternalName": "VisitingMerchant",
From 093a233c5c6650e3116f2572f8f4aae03b2886b5 Mon Sep 17 00:00:00 2001
From: connlost <4348524953.h@gmail.com>
Date: Sat, 6 Apr 2024 00:21:01 +0800
Subject: [PATCH 12/12] [release 0.4.3] Avoid Adding Cut Content
---
pyproject.toml | 2 +-
src/palworld_pal_editor/config.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 963cfc4..8da5aa6 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -12,7 +12,7 @@ keywords = ["palworld", "editor", "pal"]
license = {file = "LICENSE"}
requires-python = ">=3.11"
readme = "README.md"
-version = "0.4.2"
+version = "0.4.3"
dependencies = [
"setuptools==69.1.0",
"palworld_save_tools==0.19.0",
diff --git a/src/palworld_pal_editor/config.py b/src/palworld_pal_editor/config.py
index 3c6379d..2f58b86 100644
--- a/src/palworld_pal_editor/config.py
+++ b/src/palworld_pal_editor/config.py
@@ -11,7 +11,7 @@
else:
ASSETS_PATH = Path(__file__).parent
-VERSION = "0.4.2"
+VERSION = "0.4.3"
class Config:
i18n: str = "en"