diff --git a/README.md b/README.md index 8c89457..94d4374 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ * 支持“关卡进程”进度条显示 * 夜晚模式支持墓碑以及从墓碑生成僵尸 * 含有泳池的模式也支持在最后一波时从泳池中自动冒出僵尸 +* 支持保存进度 ## 环境要求 @@ -79,7 +80,7 @@ python main.py ### 使用Nuitka进行构建 编译依赖: -- `Python` >= 3.7,最好使用最新版 +- `Python` >= 3.10,最好使用最新版 - `Python-Pygame` >= 1.9,最好使用最新版 - `Nuitka` - `MinGW-w64`(或其他C编译器) @@ -95,14 +96,14 @@ python main.py - 对于`opus`编码,需要添加`libogg-0.dll`,`libopus-0.dll`和`libopusfile-0.dll` - 以添加`opus`和`vorbis`编码的背景音乐支持为例,编译需执行以下命令: -``` powershell +``` cmd git clone https://github.com/wszqkzqk/pypvz.git cd pypvz nuitka --mingw64 --standalone ` --onefile ` --show-progress ` --show-memory ` - --output-dir=out ` + --output-dir=release ` --windows-icon-from-ico=pypvz.ico ` --include-data-dir=resources=resources ` --include-data-file=C:\Users\17265\AppData\Local\Programs\Python\Python310\Lib\site-packages\pygame\libogg-0.dll=libogg-0.dll ` @@ -119,12 +120,30 @@ nuitka --mingw64 --standalone ` main.py ``` -* 其中`C:\Users\17265\AppData\Local\Programs\Python\Python310\Lib\site-packages\pygame\xxx.dll`应当替换为`xxx.dll`实际所在路径 +* 其中`C:\Users\17265\AppData\Local\Programs\Python\Python310\Lib\site-packages\pygame\xxx.dll`应当替换为`xxx.dll`实际所在路径,`--output-dir=`后应当跟实际需要输出的路径,绝对路径或者相对路径均可 * 由于仅复制了`opus`与`vorbis`的解码器,故要求所有背景音乐都要以opus或vorbis编码 * `--windows-product-version=`表示版本号信息,所跟内容格式必须为`x.x.x.x` * 建议开启`--lto=yes`选项优化链接,如果编译失败可以关闭此选项 -可执行文件生成路径为`./out/main.exe` +可执行文件生成路径为`./release/main.exe` + +如果只需要在本地生成编译文件测试,则只需要执行: + +``` cmd +nuitka --mingw64 ` + --follow-imports ` + --show-progress ` + --output-dir=test-build ` + --windows-icon-from-ico=pypvz.ico ` + --windows-product-name=pypvz ` + --windows-company-name=null ` + --windows-file-description=pypvz ` + --windows-disable-console ` + --windows-product-version=0.7.33.0 ` + main.py +``` + +这样生成的程序只能在有python环境的机器上运行 ### 使用pyinstaller进行构建 @@ -145,6 +164,7 @@ nuitka --mingw64 --standalone ` * 增加关卡进程进度条 * 该功能自0.5.4已实现 * 增加保存数据文件以存储用户进度的功能 + * 该功能自0.8.0.0已实现 * 增加调整音量的功能 * `pg.mixer.music.set_volume()` * 可以用`音量+`、`音量-`按钮实现 diff --git a/resources/data/map/littleGame_1.json b/resources/data/map/littleGame_1.json index 700df65..2a774a0 100644 --- a/resources/data/map/littleGame_1.json +++ b/resources/data/map/littleGame_1.json @@ -6,7 +6,7 @@ "included_zombies":["Zombie", "ConeheadZombie", "BucketheadZombie", "NewspaperZombie", "PoleVaultingZombie"], "num_flags":4, "inevitable_zombie_list":{"20":["BucketheadZombie"]}, - "card_pool":[ "WallNutBowling", - "RedWallNutBowling" - ] + "card_pool":{ "WallNutBowling":300, + "RedWallNutBowling":100 + } } diff --git a/resources/data/map/littleGame_2.json b/resources/data/map/littleGame_2.json index 5252f4b..b672269 100644 --- a/resources/data/map/littleGame_2.json +++ b/resources/data/map/littleGame_2.json @@ -6,12 +6,12 @@ "num_flags":3, "included_zombies":["Zombie", "ConeheadZombie", "BucketheadZombie", "PoleVaultingZombie"], "inevitable_zombie_list":{"20":["BucketheadZombie"]}, - "card_pool":[ "Peashooter", - "SnowPea", - "WallNut", - "CherryBomb", - "RepeaterPea", - "Chomper", - "PotatoMine" - ] + "card_pool":{ "Peashooter":200, + "SnowPea":200, + "WallNut":100, + "CherryBomb":100, + "RepeaterPea":200, + "Chomper":100, + "PotatoMine":100 + } } diff --git a/resources/data/map/littleGame_3.json b/resources/data/map/littleGame_3.json index a1927c5..f12a22d 100644 --- a/resources/data/map/littleGame_3.json +++ b/resources/data/map/littleGame_3.json @@ -8,12 +8,12 @@ "BucketheadZombie", "NewspaperZombie", "FootballZombie", "ScreenDoorZombie"], "inevitable_zombie_list":{"30":["FootballZombie"]}, - "card_pool":[ "PuffShroom", - "ScaredyShroom", - "IceShroom", - "HypnoShroom", - "DoomShroom", - "GraveBuster", - "FumeShroom" - ] + "card_pool":{ "PuffShroom":200, + "ScaredyShroom":100, + "IceShroom":100, + "HypnoShroom":100, + "DoomShroom":100, + "GraveBuster":100, + "FumeShroom":200 + } } diff --git a/resources/data/map/littleGame_4.json b/resources/data/map/littleGame_4.json index a1600e1..9c0ed0c 100644 --- a/resources/data/map/littleGame_4.json +++ b/resources/data/map/littleGame_4.json @@ -8,13 +8,13 @@ "BucketheadZombie", "SnorkelZombie", "Zomboni"], "inevitable_zombie_list":{"30":["BucketheadZombie"]}, - "card_pool":[ "Lilypad", "Lilypad", - "TorchWood", - "TallNut", - "TangleKlep", - "Spikeweed", - "Squash", - "Jalapeno", - "Threepeater", "Threepeater", "Threepeater", "Threepeater", "Threepeater" - ] + "card_pool":{ "Lilypad":200, + "TorchWood":100, + "TallNut":100, + "TangleKlep":100, + "Spikeweed":100, + "Squash":100, + "Jalapeno":100, + "Threepeater":400 + } } diff --git a/resources/graphics/Plants/Garlic/Garlic/Garlic_0.png b/resources/graphics/Plants/Garlic/Garlic/Garlic_0.png index d28ace9..11e0d86 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic/Garlic_0.png and b/resources/graphics/Plants/Garlic/Garlic/Garlic_0.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic/Garlic_1.png b/resources/graphics/Plants/Garlic/Garlic/Garlic_1.png index 2e301a2..f05d338 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic/Garlic_1.png and b/resources/graphics/Plants/Garlic/Garlic/Garlic_1.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic/Garlic_10.png b/resources/graphics/Plants/Garlic/Garlic/Garlic_10.png index 9baad3e..50c8532 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic/Garlic_10.png and b/resources/graphics/Plants/Garlic/Garlic/Garlic_10.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic/Garlic_11.png b/resources/graphics/Plants/Garlic/Garlic/Garlic_11.png index ccecfaa..714e0fc 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic/Garlic_11.png and b/resources/graphics/Plants/Garlic/Garlic/Garlic_11.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic/Garlic_2.png b/resources/graphics/Plants/Garlic/Garlic/Garlic_2.png index 7a75811..3691daf 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic/Garlic_2.png and b/resources/graphics/Plants/Garlic/Garlic/Garlic_2.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic/Garlic_3.png b/resources/graphics/Plants/Garlic/Garlic/Garlic_3.png index 1d98e4e..7f2a78d 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic/Garlic_3.png and b/resources/graphics/Plants/Garlic/Garlic/Garlic_3.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic/Garlic_4.png b/resources/graphics/Plants/Garlic/Garlic/Garlic_4.png index b9b5306..89dad70 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic/Garlic_4.png and b/resources/graphics/Plants/Garlic/Garlic/Garlic_4.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic/Garlic_5.png b/resources/graphics/Plants/Garlic/Garlic/Garlic_5.png index 3d8584d..7bff13d 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic/Garlic_5.png and b/resources/graphics/Plants/Garlic/Garlic/Garlic_5.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic/Garlic_6.png b/resources/graphics/Plants/Garlic/Garlic/Garlic_6.png index 12dc513..883180c 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic/Garlic_6.png and b/resources/graphics/Plants/Garlic/Garlic/Garlic_6.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic/Garlic_7.png b/resources/graphics/Plants/Garlic/Garlic/Garlic_7.png index 0f2789f..b45cfb0 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic/Garlic_7.png and b/resources/graphics/Plants/Garlic/Garlic/Garlic_7.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic/Garlic_8.png b/resources/graphics/Plants/Garlic/Garlic/Garlic_8.png index dd27bc3..9487390 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic/Garlic_8.png and b/resources/graphics/Plants/Garlic/Garlic/Garlic_8.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic/Garlic_9.png b/resources/graphics/Plants/Garlic/Garlic/Garlic_9.png index 68b8ccb..99cd6c3 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic/Garlic_9.png and b/resources/graphics/Plants/Garlic/Garlic/Garlic_9.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_0.png b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_0.png index ea442d7..28ff85c 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_0.png and b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_0.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_1.png b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_1.png index 7768392..5289ed3 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_1.png and b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_1.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_10.png b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_10.png index 94f46a4..5b9a3c0 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_10.png and b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_10.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_11.png b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_11.png index fb0323e..1268641 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_11.png and b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_11.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_2.png b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_2.png index 146e24b..0334969 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_2.png and b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_2.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_3.png b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_3.png index 1035f2b..a534ab8 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_3.png and b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_3.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_4.png b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_4.png index c1aa561..c1ddb28 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_4.png and b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_4.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_5.png b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_5.png index 9c82a23..de5925a 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_5.png and b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_5.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_6.png b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_6.png index 46edfd0..683cac8 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_6.png and b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_6.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_7.png b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_7.png index f541ee4..a734a79 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_7.png and b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_7.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_8.png b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_8.png index 0cdb12a..679da73 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_8.png and b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_8.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_9.png b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_9.png index 453b0e1..b996929 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_9.png and b/resources/graphics/Plants/Garlic/Garlic_cracked1/Garlic_cracked1_9.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_0.png b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_0.png index 4390f67..75ea48c 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_0.png and b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_0.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_1.png b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_1.png index 983b1ed..46cadaa 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_1.png and b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_1.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_10.png b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_10.png index 8686baa..9e5dc7a 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_10.png and b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_10.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_11.png b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_11.png index 247c046..c5f6dd4 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_11.png and b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_11.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_2.png b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_2.png index 6461627..20498e7 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_2.png and b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_2.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_3.png b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_3.png index 0f4ce27..662d7d2 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_3.png and b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_3.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_4.png b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_4.png index 7eadf2b..f976125 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_4.png and b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_4.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_5.png b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_5.png index 7826f8c..b187597 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_5.png and b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_5.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_6.png b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_6.png index ac06bd4..13c95b5 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_6.png and b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_6.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_7.png b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_7.png index 59185f4..a015fcf 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_7.png and b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_7.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_8.png b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_8.png index fa6e3fc..1f49f1f 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_8.png and b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_8.png differ diff --git a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_9.png b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_9.png index 2c76998..7a3ef3e 100644 Binary files a/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_9.png and b/resources/graphics/Plants/Garlic/Garlic_cracked2/Garlic_cracked2_9.png differ diff --git a/source/component/menubar.py b/source/component/menubar.py index 8c1af82..187ab6b 100755 --- a/source/component/menubar.py +++ b/source/component/menubar.py @@ -1,5 +1,6 @@ import os import random +from select import select import pygame as pg from .. import tool from .. import constants as c @@ -23,12 +24,9 @@ def getSunValueImage(sun_value): return image def getCardPool(data): - card_pool = [] - for card in data: - for i,name in enumerate(c.PLANT_CARD_INFO): - if name[c.PLANT_NAME_INDEX] == card: - card_pool.append(i) - break + card_pool = {} + for cardName in data: + card_pool[c.PLANT_CARD_INFO[c.PLANT_CARD_INDEX[cardName]]] = data[cardName] return card_pool class Card(): @@ -40,7 +38,7 @@ class Card(): self.index = index self.sun_cost = c.PLANT_CARD_INFO[index][c.SUN_INDEX] - self.frozen_time = c.PLANT_CARD_INFO[index][c.FROZEN_INDEX] + self.frozen_time = c.PLANT_CARD_INFO[index][c.FROZEN_TIME_INDEX] self.frozen_timer = -self.frozen_time self.refresh_timer = 0 self.select = True @@ -382,6 +380,8 @@ class MoveBar(): self.card_start_x = self.rect.x + 8 self.card_end_x = self.rect.right - 5 self.card_pool = card_pool + self.card_pool_name = tuple(self.card_pool.keys()) + self.card_pool_weight = tuple(self.card_pool.values()) self.card_list = [] self.create_timer = -c.MOVEBAR_CARD_FRESH_TIME @@ -397,11 +397,8 @@ class MoveBar(): return False x = self.card_end_x y = 6 - index = random.randint(0, len(self.card_pool) - 1) - card_index = self.card_pool[index] - card_name = c.PLANT_CARD_INFO[card_index][c.CARD_INDEX] + '_move' - plant_name = c.PLANT_CARD_INFO[card_index][c.PLANT_NAME_INDEX] - self.card_list.append(MoveCard(x, y, card_name, plant_name)) + selected_card = random.choices(self.card_pool_name, self.card_pool_weight)[0] + self.card_list.append(MoveCard(x, y, selected_card[c.CARD_INDEX] + "_move", selected_card[c.PLANT_NAME_INDEX])) return True def update(self, current_time): diff --git a/source/constants.py b/source/constants.py index 71550f7..fba31bf 100755 --- a/source/constants.py +++ b/source/constants.py @@ -1,7 +1,16 @@ -# 冒险模式起始关卡 +import os +# 用户数据存储路径 +if os.name == 'nt': # Windows系统存储路径 + USERDATA_PATH = os.path.expandvars(os.path.join("%APPDATA%", "wszqkzqk.dev", "pypvz", "userdata.json")) +else: # 非Windows系统存储路径 + USERDATA_PATH = os.path.expanduser(os.path.join("~", ".config", "wszqkzqk.dev", "pypvz", "userdata.json")) + +# 游戏起始关卡 START_LEVEL_NUM = 1 -# 小游戏模式起始关卡 START_LITTLE_GAME_NUM = 1 +# 游戏模式完成次数 +START_LEVEL_COMPLETIONS = 0 +START_LITTLEGAME_COMPLETIONS = 0 # 游戏速度倍率(调试用) GAME_RATE = 1 @@ -79,6 +88,8 @@ LEVEL_PROGRESS_FLAG = 'LevelProgressFlag' CURRENT_TIME = 'current time' LEVEL_NUM = 'level num' LITTLEGAME_NUM = 'littleGame num' +LEVEL_COMPLETIONS = 'level completions' +LITTLEGAME_COMPLETIONS = 'littleGame completions' # 整个游戏的状态 MAIN_MENU = 'main menu' @@ -198,7 +209,7 @@ BAR_CARD_X_INTERNAL = 51 PLANT_NAME_INDEX = 0 CARD_INDEX = 1 SUN_INDEX = 2 -FROZEN_INDEX = 3 +FROZEN_TIME_INDEX = 3 # 传送带模式中的刷新间隔和移动速率 MOVEBAR_CARD_FRESH_TIME = 6000 @@ -503,6 +514,11 @@ PLANT_CARD_INFO = (# 元组 (植物名称, 卡片名称, 阳光, 冷却时间) 0), ) +# 卡片中的植物名称与索引序号的对应关系,指定名称以得到索引值 +PLANT_CARD_INDEX={} +for i, item in enumerate(PLANT_CARD_INFO): + PLANT_CARD_INDEX[item[PLANT_NAME_INDEX]] = i + # 指定了哪些卡可选(排除坚果保龄球特殊植物) CARDS_TO_CHOOSE = range(len(PLANT_CARD_INFO) - 2) @@ -638,5 +654,11 @@ SLEEP = 'sleep' CHOOSE = 'choose' PLAY = 'play' +# 记录本地存储文件需要记录哪些内容 +USERDATA_KEYS = { LEVEL_NUM, LITTLEGAME_NUM, + LEVEL_COMPLETIONS, + LITTLEGAME_COMPLETIONS, + } + # 无穷大常量 INF = float("inf") # python传递字符串性能较低,故在这里对inf声明一次,以后仅需调用即可 diff --git a/source/state/level.py b/source/state/level.py index febdad2..bc0e406 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -45,20 +45,28 @@ class Level(tool.State): file_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))),'resources' , 'data', 'map', map_file) # 最后一关之后应该结束了 try: - f = open(file_path) - self.map_data = json.load(f) - f.close() - except: + with open(file_path) as f: + self.map_data = json.load(f) + except FileNotFoundError: print("成功通关!") if self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME: self.game_info[c.LEVEL_NUM] = c.START_LEVEL_NUM + self.game_info[c.LEVEL_COMPLETIONS] += 1 elif self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME: self.game_info[c.LITTLEGAME_NUM] = c.START_LITTLE_GAME_NUM + self.game_info[c.LITTLEGAME_COMPLETIONS] += 1 self.done = True self.next = c.MAIN_MENU pg.mixer.music.stop() pg.mixer.music.load(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "music", "intro.opus")) pg.mixer.music.play(-1, 0) + with open(c.USERDATA_PATH, "w") as f: + userdata = {} + for i in self.game_info: + if i in c.USERDATA_KEYS: + userdata[i] = self.game_info[i] + savedata = json.dumps(userdata, sort_keys=True, indent=4) + f.write(savedata) return # 是否有铲子的信息:无铲子时为0,有铲子时为1,故直接赋值即可 self.hasShovel = self.map_data[c.SHOVEL] @@ -542,7 +550,6 @@ class Level(tool.State): elif self.checkMainMenuClick(mouse_pos): self.done = True self.next = c.MAIN_MENU - #self.persist = {c.CURRENT_TIME:0, c.LEVEL_NUM:c.START_LEVEL_NUM} # 应该不能用c.LEVEL_NUM:c.START_LEVEL_NUM self.persist = {c.CURRENT_TIME:0, c.LEVEL_NUM:self.persist[c.LEVEL_NUM], c.LITTLEGAME_NUM:self.persist[c.LITTLEGAME_NUM]} pg.mixer.music.stop() pg.mixer.music.load(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "music", "intro.opus")) @@ -917,9 +924,9 @@ class Level(tool.State): new_plant = plant.TangleKlep(x, y) case c.DOOMSHROOM: if self.map.gridHeightSize == c.GRID_Y_SIZE: - new_plant = plant.DoomShroom(x, y, self.map.map[map_y][map_x][c.MAP_PLANT], explode_y_range=3) - else: new_plant = plant.DoomShroom(x, y, self.map.map[map_y][map_x][c.MAP_PLANT], explode_y_range=2) + else: + new_plant = plant.DoomShroom(x, y, self.map.map[map_y][map_x][c.MAP_PLANT], explode_y_range=3) case c.GRAVEBUSTER: new_plant = plant.GraveBuster(x, y, self.plant_groups[map_y], self.map, map_x) case c.FUMESHROOM: @@ -928,6 +935,7 @@ class Level(tool.State): new_plant = plant.Garlic(x, y) + if new_plant.can_sleep and self.background_type in c.DAYTIME_BACKGROUNDS: new_plant.setSleep() mushroomSleep = True @@ -1418,6 +1426,13 @@ class Level(tool.State): self.done = True # 播放胜利音效 pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "win.ogg")).play() + with open(c.USERDATA_PATH, "w") as f: + userdata = {} + for i in self.game_info: + if i in c.USERDATA_KEYS: + userdata[i] = self.game_info[i] + savedata = json.dumps(userdata, sort_keys=True, indent=4) + f.write(savedata) elif self.checkLose(): self.next = c.GAME_LOSE self.done = True diff --git a/source/tool.py b/source/tool.py index 4c1aea6..cbebcf6 100755 --- a/source/tool.py +++ b/source/tool.py @@ -42,9 +42,28 @@ class Control(): self.state_dict = {} self.state_name = None self.state = None - self.game_info = {c.CURRENT_TIME:0, - c.LEVEL_NUM:c.START_LEVEL_NUM, - c.LITTLEGAME_NUM:c.START_LITTLE_GAME_NUM} + try: + # 存在存档即导入 + with open(c.USERDATA_PATH) as f: + userdata = json.load(f) + # 导入数据 + self.game_info = {c.CURRENT_TIME:0} # 时间信息需要新建 + self.game_info.update(userdata) + except FileNotFoundError: + # 不存在存档即新建 + userdata = {c.LEVEL_NUM:c.START_LEVEL_NUM, + c.LITTLEGAME_NUM:c.START_LITTLE_GAME_NUM, + c.LEVEL_COMPLETIONS:c.START_LEVEL_COMPLETIONS, + c.LITTLEGAME_COMPLETIONS:c.START_LITTLEGAME_COMPLETIONS + } + if not os.path.exists(os.path.dirname(c.USERDATA_PATH)): + os.makedirs(os.path.dirname(c.USERDATA_PATH)) + with open(c.USERDATA_PATH, "w") as f: + savedata = json.dumps(userdata, sort_keys=True, indent=4) + f.write(savedata) + self.game_info = userdata + self.game_info[c.CURRENT_TIME] = 0 # 时间信息需要新建 + def setup_states(self, state_dict, start_state): self.state_dict = state_dict @@ -69,7 +88,8 @@ class Control(): if self.state.next == c.EXIT: pg.quit() os._exit(0) - previous, self.state_name = self.state_name, self.state.next + # previous, self.state_name = self.state_name, self.state.next + self.state_name = self.state.next persist = self.state.cleanup() self.state = self.state_dict[self.state_name] self.state.startup(self.current_time, persist)