将地图统一为python内容
This commit is contained in:
parent
280d8c2a57
commit
7c50a29f9e
@ -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"}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"background_type": 7,
|
|
||||||
"init_sun_value": 150,
|
|
||||||
"shovel": 1,
|
|
||||||
"spawn_zombies":"auto",
|
|
||||||
"included_zombies":["Zombie"],
|
|
||||||
"num_flags":1
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"background_type": 8,
|
|
||||||
"init_sun_value": 50,
|
|
||||||
"shovel": 1,
|
|
||||||
"spawn_zombies":"auto",
|
|
||||||
"included_zombies":["Zombie"],
|
|
||||||
"num_flags":1
|
|
||||||
}
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"background_type": 0,
|
|
||||||
"init_sun_value": 50,
|
|
||||||
"shovel": 1,
|
|
||||||
"spawn_zombies":"auto",
|
|
||||||
"included_zombies":["Zombie"],
|
|
||||||
"num_flags":2
|
|
||||||
}
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"background_type":0,
|
|
||||||
"init_sun_value":50,
|
|
||||||
"shovel":1,
|
|
||||||
"spawn_zombies":"auto",
|
|
||||||
"included_zombies":["Zombie", "ConeheadZombie", "PoleVaultingZombie"],
|
|
||||||
"num_flags":3
|
|
||||||
}
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"background_type":1,
|
|
||||||
"init_sun_value":50,
|
|
||||||
"shovel":1,
|
|
||||||
"spawn_zombies":"auto",
|
|
||||||
"included_zombies":["Zombie", "ConeheadZombie", "ScreenDoorZombie"],
|
|
||||||
"num_flags":2
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"background_type":2,
|
|
||||||
"init_sun_value":50,
|
|
||||||
"shovel":1,
|
|
||||||
"spawn_zombies":"auto",
|
|
||||||
"included_zombies":["Zombie", "ConeheadZombie", "BucketheadZombie"],
|
|
||||||
"num_flags":2
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
BIN
resources/graphics/Screen/AwardScreen.jpg
Normal file
BIN
resources/graphics/Screen/AwardScreen.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 156 KiB |
BIN
resources/graphics/Screen/universalButton.png
Normal file
BIN
resources/graphics/Screen/universalButton.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.5 KiB |
BIN
resources/sound/cannotChooseWarning.ogg
Normal file
BIN
resources/sound/cannotChooseWarning.ogg
Normal file
Binary file not shown.
BIN
resources/sound/finalfanfare.ogg
Normal file
BIN
resources/sound/finalfanfare.ogg
Normal file
Binary file not shown.
@ -1,6 +1,7 @@
|
|||||||
import random
|
import random
|
||||||
from .. import constants as c
|
from .. import constants as c
|
||||||
|
|
||||||
|
# 记录植物种植情况的地图管理工具
|
||||||
class Map():
|
class Map():
|
||||||
def __init__(self, background_type):
|
def __init__(self, background_type):
|
||||||
self.background_type = 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):
|
if self.isValid(map_x, map_y) and self.isAvailable(map_x, map_y, plantName):
|
||||||
pos = self.getMapGridPos(map_x, map_y)
|
pos = self.getMapGridPos(map_x, map_y)
|
||||||
return pos
|
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)
|
||||||
|
|||||||
@ -165,6 +165,9 @@ class MenuBar():
|
|||||||
if card.checkMouseClick(mouse_pos):
|
if card.checkMouseClick(mouse_pos):
|
||||||
if card.canClick(self.sun_value, self.current_time):
|
if card.canClick(self.sun_value, self.current_time):
|
||||||
result = (c.PLANT_CARD_INFO[card.index][c.PLANT_NAME_INDEX], card)
|
result = (c.PLANT_CARD_INFO[card.index][c.PLANT_NAME_INDEX], card)
|
||||||
|
else:
|
||||||
|
# 播放无法使用该卡片的警告音
|
||||||
|
c.SOUND_CANNOT_CHOOSE_WARNING.play()
|
||||||
break
|
break
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|||||||
@ -118,6 +118,7 @@ MAIN_MENU_IMAGE = 'MainMenu'
|
|||||||
OPTION_ADVENTURE = 'Adventure'
|
OPTION_ADVENTURE = 'Adventure'
|
||||||
GAME_LOSE_IMAGE = 'GameLose'
|
GAME_LOSE_IMAGE = 'GameLose'
|
||||||
GAME_VICTORY_IMAGE = 'GameVictory'
|
GAME_VICTORY_IMAGE = 'GameVictory'
|
||||||
|
AWARD_SCREEN_IMAGE = 'AwardScreen'
|
||||||
|
|
||||||
# 地图相关内容
|
# 地图相关内容
|
||||||
BACKGROUND_NAME = 'Background'
|
BACKGROUND_NAME = 'Background'
|
||||||
@ -206,7 +207,7 @@ MAP_POOL_FRONT_X = SCREEN_WIDTH - 15
|
|||||||
CHOOSEBAR_TYPE = 'choosebar_type'
|
CHOOSEBAR_TYPE = 'choosebar_type'
|
||||||
CHOOSEBAR_STATIC = 0
|
CHOOSEBAR_STATIC = 0
|
||||||
CHOOSEBAR_MOVE = 1
|
CHOOSEBAR_MOVE = 1
|
||||||
CHOSSEBAR_BOWLING = 2
|
CHOOSEBAR_BOWLING = 2
|
||||||
MENUBAR_BACKGROUND = 'ChooserBackground'
|
MENUBAR_BACKGROUND = 'ChooserBackground'
|
||||||
MOVEBAR_BACKGROUND = 'MoveBackground'
|
MOVEBAR_BACKGROUND = 'MoveBackground'
|
||||||
PANEL_BACKGROUND = 'PanelBackground'
|
PANEL_BACKGROUND = 'PanelBackground'
|
||||||
@ -649,6 +650,7 @@ SOUNDS = ( # 程序交互等
|
|||||||
SOUND_LOSE := _getSound("lose.ogg"),
|
SOUND_LOSE := _getSound("lose.ogg"),
|
||||||
SOUND_WIN := _getSound("win.ogg"),
|
SOUND_WIN := _getSound("win.ogg"),
|
||||||
SOUND_SCREAM := _getSound("scream.ogg"),
|
SOUND_SCREAM := _getSound("scream.ogg"),
|
||||||
|
SOUND_CANNOT_CHOOSE_WARNING := _getSound("cannotChooseWarning.ogg"),
|
||||||
)
|
)
|
||||||
|
|
||||||
# 记录本地存储文件初始值
|
# 记录本地存储文件初始值
|
||||||
|
|||||||
@ -40,32 +40,30 @@ class Level(tool.State):
|
|||||||
f.write(dataToSave)
|
f.write(dataToSave)
|
||||||
|
|
||||||
def loadMap(self):
|
def loadMap(self):
|
||||||
if self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME:
|
# 冒险模式
|
||||||
map_file = f'littleGame_{self.game_info[c.LITTLEGAME_NUM]}.json'
|
if self.game_info[c.GAME_MODE] == c.MODE_ADVENTURE:
|
||||||
# 设置标题
|
if self.game_info[c.LEVEL_NUM] < map.TOTAL_LEVEL:
|
||||||
pg.display.set_caption(f"pypvz: 玩玩小游戏 第{self.game_info[c.LITTLEGAME_NUM]}关")
|
self.map_data = map.LEVEL_MAP_DATA[self.game_info[c.LEVEL_NUM]]
|
||||||
elif self.game_info[c.GAME_MODE] == c.MODE_ADVENTURE:
|
else:
|
||||||
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:
|
|
||||||
print("成功通关冒险模式!")
|
print("成功通关冒险模式!")
|
||||||
self.game_info[c.LEVEL_NUM] = 1
|
self.game_info[c.LEVEL_NUM] = 1
|
||||||
self.game_info[c.LEVEL_COMPLETIONS] += 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("成功通关玩玩小游戏!")
|
print("成功通关玩玩小游戏!")
|
||||||
self.game_info[c.LITTLEGAME_NUM] = 1
|
self.game_info[c.LITTLEGAME_NUM] = 1
|
||||||
self.game_info[c.LITTLEGAME_COMPLETIONS] += 1
|
self.game_info[c.LITTLEGAME_COMPLETIONS] += 1
|
||||||
self.done = True
|
self.done = True
|
||||||
self.next = c.MAIN_MENU
|
self.next = c.MAIN_MENU
|
||||||
self.saveUserData()
|
self.saveUserData()
|
||||||
return
|
return
|
||||||
# 是否有铲子的信息:无铲子时为0,有铲子时为1,故直接赋值即可
|
# 是否有铲子的信息:无铲子时为0,有铲子时为1,故直接赋值即可
|
||||||
self.hasShovel = self.map_data[c.SHOVEL]
|
self.hasShovel = self.map_data[c.SHOVEL]
|
||||||
|
|
||||||
@ -73,7 +71,7 @@ class Level(tool.State):
|
|||||||
# 缺省音乐为进入的音乐,方便发现错误
|
# 缺省音乐为进入的音乐,方便发现错误
|
||||||
self.bgm = 'intro.opus'
|
self.bgm = 'intro.opus'
|
||||||
if c.CHOOSEBAR_TYPE in self.map_data: # 指定了choosebar_type的传送带关
|
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'
|
self.bgm = 'bowling.opus'
|
||||||
elif self.map_data[c.CHOOSEBAR_TYPE] == c.CHOOSEBAR_MOVE: # 传送带
|
elif self.map_data[c.CHOOSEBAR_TYPE] == c.CHOOSEBAR_MOVE: # 传送带
|
||||||
self.bgm = 'battle.opus'
|
self.bgm = 'battle.opus'
|
||||||
@ -147,7 +145,7 @@ class Level(tool.State):
|
|||||||
if (self.bar_type != c.CHOOSEBAR_STATIC):
|
if (self.bar_type != c.CHOOSEBAR_STATIC):
|
||||||
volume += 2
|
volume += 2
|
||||||
|
|
||||||
if inevitableZombieDict and (str(wave) in inevitableZombieDict):
|
if inevitableZombieDict and (wave in inevitableZombieDict):
|
||||||
for newZombie in inevitableZombieDict[str(wave)]:
|
for newZombie in inevitableZombieDict[str(wave)]:
|
||||||
zombieList.append(newZombie)
|
zombieList.append(newZombie)
|
||||||
volume -= c.CREATE_ZOMBIE_DICT[newZombie][0]
|
volume -= c.CREATE_ZOMBIE_DICT[newZombie][0]
|
||||||
@ -368,7 +366,7 @@ class Level(tool.State):
|
|||||||
else:
|
else:
|
||||||
card_pool = menubar.getCardPool(self.map_data[c.CARD_POOL])
|
card_pool = menubar.getCardPool(self.map_data[c.CARD_POOL])
|
||||||
self.initPlay(card_pool)
|
self.initPlay(card_pool)
|
||||||
if self.bar_type == c.CHOSSEBAR_BOWLING:
|
if self.bar_type == c.CHOOSEBAR_BOWLING:
|
||||||
self.initBowlingMap()
|
self.initBowlingMap()
|
||||||
|
|
||||||
self.setupLittleMenu()
|
self.setupLittleMenu()
|
||||||
@ -969,7 +967,7 @@ class Level(tool.State):
|
|||||||
else:
|
else:
|
||||||
self.menubar.deleateCard(self.select_plant)
|
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.map.addMapPlant(map_x, map_y, self.plant_name, sleep=mushroomSleep)
|
||||||
self.removeMouseImage()
|
self.removeMouseImage()
|
||||||
|
|
||||||
@ -1263,7 +1261,7 @@ class Level(tool.State):
|
|||||||
c.SOUND_PLANT.play()
|
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)
|
self.map.removeMapPlant(map_x, map_y, targetPlant.name)
|
||||||
# 将睡眠植物移除后更新睡眠状态
|
# 将睡眠植物移除后更新睡眠状态
|
||||||
if targetPlant.state == c.SLEEP:
|
if targetPlant.state == c.SLEEP:
|
||||||
|
|||||||
@ -74,3 +74,11 @@ class GameLoseScreen(Screen):
|
|||||||
# 播放失败音效
|
# 播放失败音效
|
||||||
c.SOUND_LOSE.play()
|
c.SOUND_LOSE.play()
|
||||||
c.SOUND_SCREAM.play()
|
c.SOUND_SCREAM.play()
|
||||||
|
|
||||||
|
class AwardScreen(Screen):
|
||||||
|
def __init__(self):
|
||||||
|
Screen.__init__()
|
||||||
|
|
||||||
|
def getImageName(self):
|
||||||
|
return c.AWARD_SCREEN_IMAGE
|
||||||
|
|
||||||
|
|||||||
@ -17,7 +17,8 @@ class State():
|
|||||||
# 当从其他状态进入这个状态时,需要进行的初始化操作
|
# 当从其他状态进入这个状态时,需要进行的初始化操作
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def startup(self, current_time, persist):
|
def startup(self, current_time, persist):
|
||||||
'''abstract method'''
|
# abstract method
|
||||||
|
pass
|
||||||
# 当从这个状态退出时,需要进行的清除操作
|
# 当从这个状态退出时,需要进行的清除操作
|
||||||
def cleanup(self):
|
def cleanup(self):
|
||||||
self.done = False
|
self.done = False
|
||||||
@ -25,7 +26,8 @@ class State():
|
|||||||
# 在这个状态运行时进行的更新操作
|
# 在这个状态运行时进行的更新操作
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def update(self, surface, keys, current_time):
|
def update(self, surface, keys, current_time):
|
||||||
'''abstract method'''
|
# abstract method
|
||||||
|
pass
|
||||||
|
|
||||||
# control this game. do event loops
|
# control this game. do event loops
|
||||||
class Control():
|
class Control():
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user