diff --git a/resources/data/map/level_0.json b/resources/data/map/level_0.json deleted file mode 100644 index 5dfd1e8..0000000 --- a/resources/data/map/level_0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "background_type":2, - "init_sun_value":5000, - "shovel":1, - "spawn_zombies":"list", - "zombie_list":[ - {"time":0, "map_y":5, "name":"Zomboni"}, - {"time":1000, "map_y":4, "name":"ScreenDoorZombie"}, - {"time":2000, "map_y":4, "name":"ScreenDoorZombie"}, - {"time":3100, "map_y":4, "name":"ScreenDoorZombie"}, - {"time":4500, "map_y":4, "name":"ScreenDoorZombie"}, - {"time":5000, "map_y":4, "name":"ScreenDoorZombie"}, - {"time":6000, "map_y":4, "name":"ScreenDoorZombie"}, - {"time":7000, "map_y":4, "name":"ScreenDoorZombie"}, - {"time":8000, "map_y":4, "name":"ScreenDoorZombie"}, - {"time":0, "map_y":1, "name":"NewspaperZombie"}, - {"time":0, "map_y":0, "name":"PoleVaultingZombie"}, - {"time":6000, "map_y":0, "name":"FootballZombie"}, - {"time":0, "map_y":3, "name":"ConeheadDuckyTubeZombie"}, - {"time":0, "map_y":2, "name":"SnorkelZombie"}, - {"time":90000, "map_y":2, "name":"ConeheadDuckyTubeZombie"} - ] -} diff --git a/resources/data/map/level_1.json b/resources/data/map/level_1.json deleted file mode 100644 index 6dddaa1..0000000 --- a/resources/data/map/level_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "background_type": 7, - "init_sun_value": 150, - "shovel": 1, - "spawn_zombies":"auto", - "included_zombies":["Zombie"], - "num_flags":1 -} diff --git a/resources/data/map/level_10.json b/resources/data/map/level_10.json deleted file mode 100644 index 6e87a73..0000000 --- a/resources/data/map/level_10.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "background_type":3, - "init_sun_value":50, - "shovel":1, - "spawn_zombies":"auto", - "included_zombies":["Zombie", "ConeheadZombie", "BucketheadZombie", "FootballZombie"], - "inevitable_zombie_list":{"20":["BucketheadZombie"], "30":["FootballZombie"]}, - "num_flags":4 -} diff --git a/resources/data/map/level_2.json b/resources/data/map/level_2.json deleted file mode 100644 index 69c793b..0000000 --- a/resources/data/map/level_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "background_type": 8, - "init_sun_value": 50, - "shovel": 1, - "spawn_zombies":"auto", - "included_zombies":["Zombie"], - "num_flags":1 -} diff --git a/resources/data/map/level_3.json b/resources/data/map/level_3.json deleted file mode 100644 index d2c13ec..0000000 --- a/resources/data/map/level_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "background_type": 0, - "init_sun_value": 50, - "shovel": 1, - "spawn_zombies":"auto", - "included_zombies":["Zombie"], - "num_flags":2 -} diff --git a/resources/data/map/level_4.json b/resources/data/map/level_4.json deleted file mode 100644 index f16411a..0000000 --- a/resources/data/map/level_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "background_type":0, - "init_sun_value":50, - "shovel":1, - "spawn_zombies":"auto", - "included_zombies":["Zombie", "ConeheadZombie", "PoleVaultingZombie"], - "num_flags":3 -} diff --git a/resources/data/map/level_5.json b/resources/data/map/level_5.json deleted file mode 100644 index 7d1e4fa..0000000 --- a/resources/data/map/level_5.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "background_type":1, - "init_sun_value":50, - "shovel":1, - "spawn_zombies":"auto", - "included_zombies":["Zombie", "ConeheadZombie", "ScreenDoorZombie"], - "num_flags":2 -} diff --git a/resources/data/map/level_6.json b/resources/data/map/level_6.json deleted file mode 100644 index f7ab623..0000000 --- a/resources/data/map/level_6.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "background_type":1, - "init_sun_value":50, - "shovel":1, - "spawn_zombies":"auto", - "included_zombies":["Zombie", "ConeheadZombie", "ScreenDoorZombie", "BucketheadZombie", "FootballZombie"], - "inevitable_zombie_list":{"20":["ScreenDoorZombie"], "30":["FootballZombie"]}, - "num_flags":4, - "grade_graves":2 -} diff --git a/resources/data/map/level_7.json b/resources/data/map/level_7.json deleted file mode 100644 index 2a35a9c..0000000 --- a/resources/data/map/level_7.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "background_type":2, - "init_sun_value":50, - "shovel":1, - "spawn_zombies":"auto", - "included_zombies":["Zombie", "ConeheadZombie", "BucketheadZombie"], - "num_flags":2 -} diff --git a/resources/data/map/level_8.json b/resources/data/map/level_8.json deleted file mode 100644 index 6098cf3..0000000 --- a/resources/data/map/level_8.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "background_type":2, - "init_sun_value":50, - "shovel":1, - "spawn_zombies":"auto", - "included_zombies":["Zombie", "ConeheadZombie", "BucketheadZombie", "SnorkelZombie"], - "inevitable_zombie_list":{"20":["BucketheadZombie"], "30":["SnorkelZombie"]}, - "num_flags":3 -} diff --git a/resources/data/map/level_9.json b/resources/data/map/level_9.json deleted file mode 100644 index 54ee331..0000000 --- a/resources/data/map/level_9.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "background_type":2, - "init_sun_value":50, - "shovel":1, - "spawn_zombies":"auto", - "included_zombies":["Zombie", "Zomboni"], - "inevitable_zombie_list":{"30":["Zomboni"]}, - "num_flags":3 -} diff --git a/resources/data/map/littleGame_1.json b/resources/data/map/littleGame_1.json deleted file mode 100644 index 38be2eb..0000000 --- a/resources/data/map/littleGame_1.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "background_type":6, - "choosebar_type":2, - "shovel":0, - "spawn_zombies":"auto", - "included_zombies":["Zombie", "ConeheadZombie", "BucketheadZombie", "NewspaperZombie", "PoleVaultingZombie"], - "num_flags":3, - "inevitable_zombie_list":{"20":["BucketheadZombie"]}, - "card_pool":{ "WallNutBowling":300, - "RedWallNutBowling":100 - } -} diff --git a/resources/data/map/littleGame_2.json b/resources/data/map/littleGame_2.json deleted file mode 100644 index b672269..0000000 --- a/resources/data/map/littleGame_2.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "background_type":0, - "choosebar_type":1, - "shovel":1, - "spawn_zombies":"auto", - "num_flags":3, - "included_zombies":["Zombie", "ConeheadZombie", "BucketheadZombie", "PoleVaultingZombie"], - "inevitable_zombie_list":{"20":["BucketheadZombie"]}, - "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 deleted file mode 100644 index c852fbf..0000000 --- a/resources/data/map/littleGame_3.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "background_type":1, - "choosebar_type":1, - "shovel":1, - "spawn_zombies":"auto", - "num_flags":3, - "included_zombies":["Zombie", "ConeheadZombie", - "BucketheadZombie", "NewspaperZombie", - "FootballZombie", "ScreenDoorZombie"], - "inevitable_zombie_list":{"30":["FootballZombie"]}, - "card_pool":{ "PuffShroom":100, - "ScaredyShroom":100, - "IceShroom":100, - "HypnoShroom":100, - "DoomShroom":100, - "GraveBuster":100, - "FumeShroom":200 - }, - "grade_graves":3 -} diff --git a/resources/data/map/littleGame_4.json b/resources/data/map/littleGame_4.json deleted file mode 100644 index 5f3ff0a..0000000 --- a/resources/data/map/littleGame_4.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "background_type":2, - "choosebar_type":1, - "shovel":1, - "spawn_zombies":"auto", - "num_flags":4, - "included_zombies":["Zombie", "ConeheadZombie", - "BucketheadZombie", "SnorkelZombie", - "Zomboni"], - "inevitable_zombie_list":{"30":["BucketheadZombie"]}, - "card_pool":{ "LilyPad":300, - "TorchWood":100, - "TallNut":100, - "TangleKlep":100, - "Spikeweed":100, - "Squash":100, - "Jalapeno":50, - "Threepeater":400 - } -} diff --git a/resources/graphics/Screen/AwardScreen.jpg b/resources/graphics/Screen/AwardScreen.jpg new file mode 100644 index 0000000..f275c9e Binary files /dev/null and b/resources/graphics/Screen/AwardScreen.jpg differ diff --git a/resources/graphics/Screen/universalButton.png b/resources/graphics/Screen/universalButton.png new file mode 100644 index 0000000..66ff976 Binary files /dev/null and b/resources/graphics/Screen/universalButton.png differ diff --git a/resources/sound/cannotChooseWarning.ogg b/resources/sound/cannotChooseWarning.ogg new file mode 100644 index 0000000..8796aa9 Binary files /dev/null and b/resources/sound/cannotChooseWarning.ogg differ diff --git a/resources/sound/finalfanfare.ogg b/resources/sound/finalfanfare.ogg new file mode 100644 index 0000000..a600124 Binary files /dev/null and b/resources/sound/finalfanfare.ogg differ diff --git a/source/component/map.py b/source/component/map.py index 3a24c42..b1e571d 100755 --- a/source/component/map.py +++ b/source/component/map.py @@ -1,6 +1,7 @@ import random from .. import constants as c +# 记录植物种植情况的地图管理工具 class Map(): def __init__(self, background_type): self.background_type = background_type @@ -163,3 +164,252 @@ class Map(): if self.isValid(map_x, map_y) and self.isAvailable(map_x, map_y, plantName): pos = self.getMapGridPos(map_x, map_y) return pos + + + +# 保存具体关卡地图信息常数 +# 冒险模式地图 +LEVEL_MAP_DATA = ( +# 第0关:测试模式地图 +{ + c.BACKGROUND_TYPE: 2, + c.INIT_SUN_NAME: 5000, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES: c.SPAWN_ZOMBIES_LIST, + c.ZOMBIE_LIST:[ + {"time":0, "map_y":5, "name":"Zomboni"}, + {"time":1000, "map_y":4, "name":"ScreenDoorZombie"}, + {"time":2000, "map_y":4, "name":"ScreenDoorZombie"}, + {"time":3100, "map_y":4, "name":"ScreenDoorZombie"}, + {"time":4500, "map_y":4, "name":"ScreenDoorZombie"}, + {"time":5000, "map_y":4, "name":"ScreenDoorZombie"}, + {"time":6000, "map_y":4, "name":"ScreenDoorZombie"}, + {"time":7000, "map_y":4, "name":"ScreenDoorZombie"}, + {"time":8000, "map_y":4, "name":"ScreenDoorZombie"}, + {"time":0, "map_y":1, "name":"NewspaperZombie"}, + {"time":0, "map_y":0, "name":"PoleVaultingZombie"}, + {"time":6000, "map_y":0, "name":"FootballZombie"}, + {"time":0, "map_y":3, "name":"ConeheadDuckyTubeZombie"}, + {"time":0, "map_y":2, "name":"SnorkelZombie"}, + {"time":90000, "map_y":2, "name":"ConeheadDuckyTubeZombie"} + ] +}, +# 第1关:单行草皮 +{ + c.BACKGROUND_TYPE: 7, + c.INIT_SUN_NAME: 150, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES:(c.NORMAL_ZOMBIE,), + c.NUM_FLAGS:1 +}, +# 第2关:三行草皮 +{ + c.BACKGROUND_TYPE: 8, + c.INIT_SUN_NAME: 150, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES:(c.NORMAL_ZOMBIE,), + c.NUM_FLAGS:1 +}, +# 第3关 +{ + c.BACKGROUND_TYPE: 0, + c.INIT_SUN_NAME: 50, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES:(c.NORMAL_ZOMBIE,), + c.NUM_FLAGS:2 +}, +# 第4关 +{ + c.BACKGROUND_TYPE: 0, + c.INIT_SUN_NAME: 50, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: (c.NORMAL_ZOMBIE, c.CONEHEAD_ZOMBIE, c.POLE_VAULTING_ZOMBIE), + c.NUM_FLAGS:2 +}, +# 第5关 目前白天最后一关 +{ + c.BACKGROUND_TYPE: 0, + c.INIT_SUN_NAME: 50, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: (c.NORMAL_ZOMBIE, c.CONEHEAD_ZOMBIE, c.POLE_VAULTING_ZOMBIE, c.BUCKETHEAD_ZOMBIE), + c.NUM_FLAGS:3 +}, +# 第6关 目前夜晚第一关 +{ + c.BACKGROUND_TYPE: 1, + c.INIT_SUN_NAME: 50, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, + c.NEWSPAPER_ZOMBIE), + c.NUM_FLAGS:2 +}, +# 第7关 +{ + c.BACKGROUND_TYPE: 1, + c.INIT_SUN_NAME: 50, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, + c.SCREEN_DOOR_ZOMBIE,), + c.NUM_FLAGS: 2, + c.GRADE_GRAVES: 2, +}, +# 第8关 目前为夜晚最后一关 +{ + c.BACKGROUND_TYPE: 1, + c.INIT_SUN_NAME: 50, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, c.NEWSPAPER_ZOMBIE, + c.CONEHEAD_ZOMBIE, c.BUCKETHEAD_ZOMBIE, + c.SCREEN_DOOR_ZOMBIE, c.FOOTBALL_ZOMBIE), + c.INEVITABLE_ZOMBIE_DICT: { # 这里改用python实现了以后,键不再用字符串,改用数字 + # 仍然要注意字典值是元组 + 10: (c.NEWSPAPER_ZOMBIE,), + 20: (c.SCREEN_DOOR_ZOMBIE,), + 30: (c.FOOTBALL_ZOMBIE,), + }, + c.NUM_FLAGS: 3, + c.GRADE_GRAVES: 3, +}, +# 第9关 目前为泳池模式第一关 +{ + c.BACKGROUND_TYPE: 2, + c.INIT_SUN_NAME: 50, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, c.BUCKETHEAD_ZOMBIE, + c.CONEHEAD_ZOMBIE,), + c.NUM_FLAGS:2 +}, +# 第10关 +{ + c.BACKGROUND_TYPE: 2, + c.INIT_SUN_NAME: 50, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, c.BUCKETHEAD_ZOMBIE, + c.CONEHEAD_ZOMBIE, c.SNORKELZOMBIE), + c.INEVITABLE_ZOMBIE_DICT: {30: (c.SNORKELZOMBIE,)}, + c.NUM_FLAGS:3 +}, +# 第11关 +{ + c.BACKGROUND_TYPE: 2, + c.INIT_SUN_NAME: 50, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: (c.NORMAL_ZOMBIE, c.ZOMBONI), + c.INEVITABLE_ZOMBIE_DICT: {30: (c.ZOMBONI,)}, + c.NUM_FLAGS:3 +}, +# 第12关 目前为泳池最后一关 +{ + c.BACKGROUND_TYPE: 2, + c.INIT_SUN_NAME: 50, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, c.ZOMBONI, + c.BUCKETHEAD_ZOMBIE, + c.CONEHEAD_ZOMBIE, c.SNORKELZOMBIE), + c.INEVITABLE_ZOMBIE_DICT: {40: (c.ZOMBONI,)}, + c.NUM_FLAGS:4 +}, +# 第13关 目前为浓雾第一关 尚未完善 +{ + c.BACKGROUND_TYPE: 2, + c.INIT_SUN_NAME: 50, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, c.NEWSPAPER_ZOMBIE, + c.ZOMBONI, c.FOOTBALL_ZOMBIE, + c.CONEHEAD_ZOMBIE, c.BUCKETHEAD_HEALTH), + c.NUM_FLAGS:4 +}, +) + + + +# 玩玩小游戏地图 +LITTLE_GAME_MAP_DATA = ( +# 第0关 测试 目前空缺 +{}, +# 第1关 坚果保龄球 +{ + c.BACKGROUND_TYPE: 6, + c.CHOOSEBAR_TYPE: c.CHOOSEBAR_BOWLING, + c.SHOVEL: 0, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, c.CONEHEAD_ZOMBIE, + c.POLE_VAULTING_ZOMBIE, c.BUCKETHEAD_ZOMBIE, + c.NEWSPAPER_ZOMBIE), + c.NUM_FLAGS:3, + c.CARD_POOL: { c.WALLNUTBOWLING: 300, + c.REDWALLNUTBOWLING: 100,} +}, +# 第2关 白天 大决战 +{ + c.BACKGROUND_TYPE: 0, + c.CHOOSEBAR_TYPE: c.CHOOSEBAR_MOVE, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, c.CONEHEAD_ZOMBIE, + c.POLE_VAULTING_ZOMBIE, c.BUCKETHEAD_ZOMBIE,), + c.NUM_FLAGS:3, + c.CARD_POOL: { c.PEASHOOTER: 200, + c.SNOWPEASHOOTER: 100, + c.WALLNUT: 100, + c.CHERRYBOMB: 100, + c.REPEATERPEA: 200, + c.CHOMPER: 100, + c.POTATOMINE: 100,} +}, +# 第3关 夜晚 大决战 +{ + c.BACKGROUND_TYPE: 1, + c.CHOOSEBAR_TYPE: c.CHOOSEBAR_MOVE, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, c.CONEHEAD_ZOMBIE, + c.FOOTBALL_ZOMBIE, c.BUCKETHEAD_ZOMBIE, + c.NEWSPAPER_ZOMBIE, c.SCREEN_DOOR_ZOMBIE), + c.NUM_FLAGS:3, + c.CARD_POOL: { c.PUFFSHROOM: 100, + c.SCAREDYSHROOM: 100, + c.ICESHROOM: 100, + c.HYPNOSHROOM: 100, + c.DOOMSHROOM: 100, + c.GRAVEBUSTER: 100, + c.FUMESHROOM: 200}, + c.GRADE_GRAVES:3 +}, +# 第4关 泳池 大决战 +{ + c.BACKGROUND_TYPE: 2, + c.CHOOSEBAR_TYPE: c.CHOOSEBAR_MOVE, + c.SHOVEL: 1, + c.SPAWN_ZOMBIES:c.SPAWN_ZOMBIES_AUTO, + c.INCLUDED_ZOMBIES: ( c.NORMAL_ZOMBIE, c.CONEHEAD_ZOMBIE, + c.SNORKELZOMBIE, c.BUCKETHEAD_ZOMBIE, + c.ZOMBONI,), + c.NUM_FLAGS:4, + c.CARD_POOL: { c.LILYPAD: 300, + c.TORCHWOOD: 100, + c.TALLNUT: 100, + c.TANGLEKLEP: 100, + c.SPIKEWEED: 100, + c.SQUASH: 100, + c.JALAPENO: 50, + c.THREEPEASHOOTER: 400,} +}, +) + +# 总关卡数 +TOTAL_LEVEL = len(LEVEL_MAP_DATA) +TOTAL_LITTLE_GAME = len(LITTLE_GAME_MAP_DATA) diff --git a/source/component/menubar.py b/source/component/menubar.py index 6eb4330..1f1b4b6 100755 --- a/source/component/menubar.py +++ b/source/component/menubar.py @@ -165,6 +165,9 @@ class MenuBar(): if card.checkMouseClick(mouse_pos): if card.canClick(self.sun_value, self.current_time): result = (c.PLANT_CARD_INFO[card.index][c.PLANT_NAME_INDEX], card) + else: + # 播放无法使用该卡片的警告音 + c.SOUND_CANNOT_CHOOSE_WARNING.play() break return result diff --git a/source/constants.py b/source/constants.py index 3204b57..c2edcc6 100755 --- a/source/constants.py +++ b/source/constants.py @@ -118,6 +118,7 @@ MAIN_MENU_IMAGE = 'MainMenu' OPTION_ADVENTURE = 'Adventure' GAME_LOSE_IMAGE = 'GameLose' GAME_VICTORY_IMAGE = 'GameVictory' +AWARD_SCREEN_IMAGE = 'AwardScreen' # 地图相关内容 BACKGROUND_NAME = 'Background' @@ -206,7 +207,7 @@ MAP_POOL_FRONT_X = SCREEN_WIDTH - 15 CHOOSEBAR_TYPE = 'choosebar_type' CHOOSEBAR_STATIC = 0 CHOOSEBAR_MOVE = 1 -CHOSSEBAR_BOWLING = 2 +CHOOSEBAR_BOWLING = 2 MENUBAR_BACKGROUND = 'ChooserBackground' MOVEBAR_BACKGROUND = 'MoveBackground' PANEL_BACKGROUND = 'PanelBackground' @@ -649,6 +650,7 @@ SOUNDS = ( # 程序交互等 SOUND_LOSE := _getSound("lose.ogg"), SOUND_WIN := _getSound("win.ogg"), SOUND_SCREAM := _getSound("scream.ogg"), + SOUND_CANNOT_CHOOSE_WARNING := _getSound("cannotChooseWarning.ogg"), ) # 记录本地存储文件初始值 diff --git a/source/state/level.py b/source/state/level.py index 4fd2c9b..30363ac 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -40,32 +40,30 @@ class Level(tool.State): f.write(dataToSave) def loadMap(self): - if self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME: - map_file = f'littleGame_{self.game_info[c.LITTLEGAME_NUM]}.json' - # 设置标题 - pg.display.set_caption(f"pypvz: 玩玩小游戏 第{self.game_info[c.LITTLEGAME_NUM]}关") - elif self.game_info[c.GAME_MODE] == c.MODE_ADVENTURE: - map_file = f'level_{self.game_info[c.LEVEL_NUM]}.json' - # 设置标题 - pg.display.set_caption(f"pypvz: 冒险模式 第{self.game_info[c.LEVEL_NUM]}关") - file_path = os.path.join(c.PATH_MAP_DIR, map_file) - # 最后一关之后应该结束了 - try: - with open(file_path) as f: - self.map_data = json.load(f) - except FileNotFoundError: - if self.game_info[c.GAME_MODE] == c.MODE_ADVENTURE: + # 冒险模式 + if self.game_info[c.GAME_MODE] == c.MODE_ADVENTURE: + if self.game_info[c.LEVEL_NUM] < map.TOTAL_LEVEL: + self.map_data = map.LEVEL_MAP_DATA[self.game_info[c.LEVEL_NUM]] + else: print("成功通关冒险模式!") self.game_info[c.LEVEL_NUM] = 1 self.game_info[c.LEVEL_COMPLETIONS] += 1 - elif self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME: + self.done = True + self.next = c.MAIN_MENU + self.saveUserData() + return + # 小游戏模式 + elif self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME: + if self.game_info[c.LITTLEGAME_NUM] < map.TOTAL_LITTLE_GAME: + self.map_data = map.LITTLE_GAME_MAP_DATA[self.game_info[c.LITTLEGAME_NUM]] + else: print("成功通关玩玩小游戏!") self.game_info[c.LITTLEGAME_NUM] = 1 self.game_info[c.LITTLEGAME_COMPLETIONS] += 1 - self.done = True - self.next = c.MAIN_MENU - self.saveUserData() - return + self.done = True + self.next = c.MAIN_MENU + self.saveUserData() + return # 是否有铲子的信息:无铲子时为0,有铲子时为1,故直接赋值即可 self.hasShovel = self.map_data[c.SHOVEL] @@ -73,7 +71,7 @@ class Level(tool.State): # 缺省音乐为进入的音乐,方便发现错误 self.bgm = 'intro.opus' if c.CHOOSEBAR_TYPE in self.map_data: # 指定了choosebar_type的传送带关 - if self.map_data[c.CHOOSEBAR_TYPE] == c.CHOSSEBAR_BOWLING: # 坚果保龄球 + if self.map_data[c.CHOOSEBAR_TYPE] == c.CHOOSEBAR_BOWLING: # 坚果保龄球 self.bgm = 'bowling.opus' elif self.map_data[c.CHOOSEBAR_TYPE] == c.CHOOSEBAR_MOVE: # 传送带 self.bgm = 'battle.opus' @@ -147,7 +145,7 @@ class Level(tool.State): if (self.bar_type != c.CHOOSEBAR_STATIC): volume += 2 - if inevitableZombieDict and (str(wave) in inevitableZombieDict): + if inevitableZombieDict and (wave in inevitableZombieDict): for newZombie in inevitableZombieDict[str(wave)]: zombieList.append(newZombie) volume -= c.CREATE_ZOMBIE_DICT[newZombie][0] @@ -368,7 +366,7 @@ class Level(tool.State): else: card_pool = menubar.getCardPool(self.map_data[c.CARD_POOL]) self.initPlay(card_pool) - if self.bar_type == c.CHOSSEBAR_BOWLING: + if self.bar_type == c.CHOOSEBAR_BOWLING: self.initBowlingMap() self.setupLittleMenu() @@ -969,7 +967,7 @@ class Level(tool.State): else: self.menubar.deleateCard(self.select_plant) - if self.bar_type != c.CHOSSEBAR_BOWLING: # 坚果保龄球关卡无需考虑格子被占用的情况 + if self.bar_type != c.CHOOSEBAR_BOWLING: # 坚果保龄球关卡无需考虑格子被占用的情况 self.map.addMapPlant(map_x, map_y, self.plant_name, sleep=mushroomSleep) self.removeMouseImage() @@ -1263,7 +1261,7 @@ class Level(tool.State): c.SOUND_PLANT.play() # 整理地图信息 - if self.bar_type != c.CHOSSEBAR_BOWLING: + if self.bar_type != c.CHOOSEBAR_BOWLING: self.map.removeMapPlant(map_x, map_y, targetPlant.name) # 将睡眠植物移除后更新睡眠状态 if targetPlant.state == c.SLEEP: diff --git a/source/state/screen.py b/source/state/screen.py index ebf0883..ff6632f 100644 --- a/source/state/screen.py +++ b/source/state/screen.py @@ -74,3 +74,11 @@ class GameLoseScreen(Screen): # 播放失败音效 c.SOUND_LOSE.play() c.SOUND_SCREAM.play() + +class AwardScreen(Screen): + def __init__(self): + Screen.__init__() + + def getImageName(self): + return c.AWARD_SCREEN_IMAGE + diff --git a/source/tool.py b/source/tool.py index 3705a34..60693ef 100755 --- a/source/tool.py +++ b/source/tool.py @@ -17,7 +17,8 @@ class State(): # 当从其他状态进入这个状态时,需要进行的初始化操作 @abstractmethod def startup(self, current_time, persist): - '''abstract method''' + # abstract method + pass # 当从这个状态退出时,需要进行的清除操作 def cleanup(self): self.done = False @@ -25,7 +26,8 @@ class State(): # 在这个状态运行时进行的更新操作 @abstractmethod def update(self, surface, keys, current_time): - '''abstract method''' + # abstract method + pass # control this game. do event loops class Control():