From 9fa8fbb8474d47bf986663869d9a85431f16ecac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Tue, 2 Aug 2022 12:52:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=9D=9A=E6=9E=9C=E4=BF=9D?= =?UTF-8?q?=E9=BE=84=E7=90=832?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../graphics/Cards/card_giantwallnut.png | Bin 0 -> 38203 bytes .../WallNut/GiantWallNut/GiantWallNut_0.png | Bin 0 -> 15758 bytes source/component/map.py | 33 +++++- source/component/plant.py | 65 ++++++----- source/component/zombie.py | 18 +-- source/constants.py | 16 ++- source/state/level.py | 106 +++++++++--------- 7 files changed, 145 insertions(+), 93 deletions(-) create mode 100644 resources/graphics/Cards/card_giantwallnut.png create mode 100644 resources/graphics/Plants/WallNut/GiantWallNut/GiantWallNut_0.png diff --git a/resources/graphics/Cards/card_giantwallnut.png b/resources/graphics/Cards/card_giantwallnut.png new file mode 100644 index 0000000000000000000000000000000000000000..ee80111c8f112fa1d33184b71ad4c82b7556e758 GIT binary patch literal 38203 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 Y3oJ>m3L5}~o&W#<07*qoM6N<$g0e&l$N&HU literal 0 HcmV?d00001 diff --git a/resources/graphics/Plants/WallNut/GiantWallNut/GiantWallNut_0.png b/resources/graphics/Plants/WallNut/GiantWallNut/GiantWallNut_0.png new file mode 100644 index 0000000000000000000000000000000000000000..878834739f89f6f8ff20219bbd08780baeafd1bc GIT binary patch literal 15758 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 c.SCREEN_WIDTH + 60: + if self.rect.x > c.SCREEN_WIDTH + 25: self.dead = True def setWalk(self): @@ -39,7 +39,7 @@ class Car(pg.sprite.Sprite): class Bullet(pg.sprite.Sprite): def __init__( self, x, start_y, dest_y, name, damage, effect=None, passed_torchwood_x=None, - damageType=c.ZOMBIE_DEAFULT_DAMAGE): + damage_type=c.ZOMBIE_DEAFULT_DAMAGE): pg.sprite.Sprite.__init__(self) self.name = name @@ -56,7 +56,7 @@ class Bullet(pg.sprite.Sprite): self.y_vel = 15 if (dest_y > start_y) else -15 self.x_vel = 10 self.damage = damage - self.damageType = damageType + self.damage_type = damage_type self.effect = effect self.state = c.FLY self.current_time = 0 @@ -82,14 +82,8 @@ class Bullet(pg.sprite.Sprite): self.explode_frames = [] fly_name = self.name - if self.name == c.BULLET_MUSHROOM: - explode_name = "BulletMushRoomExplode" - elif self.name == c.BULLET_PEA_ICE: - explode_name = "PeaIceExplode" - elif self.name == c.BULLET_SEASHROOM: - explode_name = "BulletSeaShroomExplode" - elif self.name == c.BULLET_STAR: - explode_name = "StarBulletExplode" + if self.name in c.BULLET_INDEPENDENT_BOOM_IMG: + explode_name = f"{self.name}Explode" else: explode_name = "PeaNormalExplode" @@ -184,8 +178,8 @@ class Fume(pg.sprite.Sprite): # 杨桃的子弹 class StarBullet(Bullet): - def __init__(self, x, start_y, damage, direction, level, damageType = c.ZOMBIE_DEAFULT_DAMAGE): # direction指星星飞行方向 - Bullet.__init__(self, x, start_y, start_y, c.BULLET_STAR, damage, damageType = damageType) + def __init__(self, x, start_y, damage, direction, level, damage_type = c.ZOMBIE_DEAFULT_DAMAGE): # direction指星星飞行方向 + Bullet.__init__(self, x, start_y, start_y, c.BULLET_STAR, damage, damage_type = damage_type) self.level = level self.map_y = self.level.map.getMapIndex(self.rect.x, self.rect.centery)[1] @@ -819,7 +813,7 @@ class Squash(Plant): if (self.frame_index + 1) == self.frame_num: for zombie in self.zombie_group: if self.canAttack(zombie): - zombie.setDamage(1800, damageType=c.ZOMBIE_RANGE_DAMAGE) + zombie.setDamage(1800, damage_type=c.ZOMBIE_RANGE_DAMAGE) self.health = 0 # 避免僵尸在原位啃食 self.map_plant_set.remove(c.SQUASH) self.kill() @@ -878,7 +872,7 @@ class Spikeweed(Plant): zombie.health = zombie.losthead_health killSelf = True else: - zombie.setDamage(20, damageType=c.ZOMBIE_COMMON_DAMAGE) + zombie.setDamage(20, damage_type=c.ZOMBIE_COMMON_DAMAGE) if killSelf: self.health = 0 # 播放攻击音效,同子弹打击 @@ -1161,7 +1155,7 @@ class WallNutBowling(Plant): self.handleMapYPosition() if self.shouldChangeDirection(): self.changeDirection(-1) - if self.init_rect.x > c.SCREEN_WIDTH + 60: + if self.init_rect.x > c.SCREEN_WIDTH + 25: self.health = 0 self.move_timer += self.move_interval @@ -1203,12 +1197,6 @@ class WallNutBowling(Plant): self.disable_hit_y = map_y def animation(self): - if (self.current_time - self.animate_timer) > self.animate_interval: - self.frame_index += 1 - if self.frame_index >= self.frame_num: - self.frame_index = 0 - self.animate_timer = self.current_time - image = self.frames[self.frame_index] self.image = pg.transform.rotate(image, self.rotate_degree) self.mask = pg.mask.from_surface(self.image) @@ -1249,7 +1237,7 @@ class RedWallNutBowling(Plant): elif (self.current_time - self.move_timer) >= self.move_interval: self.rotate_degree = (self.rotate_degree - 30) % 360 self.init_rect.x += self.vel_x - if self.init_rect.x > c.SCREEN_WIDTH + 60: + if self.init_rect.x > c.SCREEN_WIDTH + 25: self.health = 0 self.move_timer += self.move_interval @@ -1336,7 +1324,7 @@ class StarFruit(Plant): self.shoot_timer = self.current_time - 700 elif (self.current_time - self.shoot_timer) >= 1400: # 向后打的杨桃子弹无视铁门与报纸防具 - self.bullet_group.add(StarBullet(self.rect.left - 10, self.rect.y + 15, c.BULLET_DAMAGE_NORMAL, c.STAR_BACKWARD, self.level, damageType = c.ZOMBIE_COMMON_DAMAGE)) + self.bullet_group.add(StarBullet(self.rect.left - 10, self.rect.y + 15, c.BULLET_DAMAGE_NORMAL, c.STAR_BACKWARD, self.level, damage_type = c.ZOMBIE_COMMON_DAMAGE)) # 其他方向的杨桃子弹伤害效果与豌豆等同 self.bullet_group.add(StarBullet(self.rect.centerx - 20, self.rect.bottom - self.rect.h - 15, c.BULLET_DAMAGE_NORMAL, c.STAR_UPWARD, self.level)) self.bullet_group.add(StarBullet(self.rect.centerx - 20, self.rect.bottom - 5, c.BULLET_DAMAGE_NORMAL, c.STAR_DOWNWARD, self.level)) @@ -1740,7 +1728,7 @@ class FumeShroom(Plant): # 烟雾只是个动画,实际伤害由本身完成 for target_zombie in self.zombie_group: if self.canAttack(target_zombie): - target_zombie.setDamage(c.BULLET_DAMAGE_NORMAL, damageType=c.ZOMBIE_RANGE_DAMAGE) + target_zombie.setDamage(c.BULLET_DAMAGE_NORMAL, damage_type=c.ZOMBIE_RANGE_DAMAGE) self.shoot_timer = self.current_time self.show_attack_frames = True # 播放发射音效 @@ -1829,3 +1817,30 @@ class PumpkinHead(Plant): elif not self.cracked2 and self.health <= c.WALLNUT_CRACKED2_HEALTH: self.changeFrames(self.cracked2_frames) self.cracked2 = True + +class GiantWallNut(Plant): + def __init__(self, x, y): + Plant.__init__(self, x, y, c.GIANTWALLNUT, 1, None) + self.init_rect = self.rect.copy() + self.rotate_degree = 0 + self.animate_interval = 200 + self.move_timer = 0 + self.move_interval = 70 + self.vel_x = random.randint(12, 15) + + def idling(self): + if self.move_timer == 0: + self.move_timer = self.current_time + elif (self.current_time - self.move_timer) >= self.move_interval: + self.rotate_degree = (self.rotate_degree - 30) % 360 + self.init_rect.x += self.vel_x + if self.init_rect.x > c.SCREEN_WIDTH: + self.health = 0 + self.move_timer += self.move_interval + + def animation(self): + image = self.frames[self.frame_index] + self.image = pg.transform.rotate(image, self.rotate_degree) + self.mask = pg.mask.from_surface(self.image) + # must keep the center postion of image when rotate + self.rect = self.image.get_rect(center=self.init_rect.center) diff --git a/source/component/zombie.py b/source/component/zombie.py index 07c816e..7513812 100755 --- a/source/component/zombie.py +++ b/source/component/zombie.py @@ -346,23 +346,23 @@ class Zombie(pg.sprite.Sprite): if (self.current_time - self.ice_slow_timer) > c.ICE_SLOW_TIME: self.ice_slow_ratio = 1 - def setDamage(self, damage, effect=None, damageType=c.ZOMBIE_COMMON_DAMAGE): + def setDamage(self, damage, effect=None, damage_type=c.ZOMBIE_COMMON_DAMAGE): # 冰冻减速效果 if effect == c.BULLET_EFFECT_ICE: - if damageType == c.ZOMBIE_DEAFULT_DAMAGE: # 寒冰射手不能穿透二类防具进行减速 + if damage_type == c.ZOMBIE_DEAFULT_DAMAGE: # 寒冰射手不能穿透二类防具进行减速 if not self.helmet_type2: self.setIceSlow() else: self.setIceSlow() # 解冻 elif effect == c.BULLET_EFFECT_UNICE: - if damageType == c.ZOMBIE_DEAFULT_DAMAGE: # 寒冰射手不能穿透二类防具进行减速 + if damage_type == c.ZOMBIE_DEAFULT_DAMAGE: # 寒冰射手不能穿透二类防具进行减速 if not self.helmet_type2: self.ice_slow_ratio = 1 else: self.ice_slow_ratio = 1 - if damageType == c.ZOMBIE_DEAFULT_DAMAGE: # 不穿透二类防具的攻击 + if damage_type == c.ZOMBIE_DEAFULT_DAMAGE: # 不穿透二类防具的攻击 # 从第二类防具开始逐级传递 if self.helmet_type2: self.helmet_type2_health -= damage @@ -383,7 +383,7 @@ class Zombie(pg.sprite.Sprite): self.helmet_health = 0 # 注意合并后清零 else: # 没有防具 self.health -= damage - elif damageType == c.ZOMBIE_COMMON_DAMAGE: # 无视二类防具,将攻击一类防具与本体视为整体的攻击 + elif damage_type == c.ZOMBIE_COMMON_DAMAGE: # 无视二类防具,将攻击一类防具与本体视为整体的攻击 if self.helmet: # 存在一类防具 self.helmet_health -= damage if self.helmet_health <= 0: @@ -391,7 +391,7 @@ class Zombie(pg.sprite.Sprite): self.helmet_health = 0 # 注意合并后清零 else: # 没有一类防具 self.health -= damage - elif damageType == c.ZOMBIE_RANGE_DAMAGE: + elif damage_type == c.ZOMBIE_RANGE_DAMAGE: # 从第二类防具开始逐级传递 if self.helmet_type2: self.helmet_type2_health -= damage @@ -422,9 +422,9 @@ class Zombie(pg.sprite.Sprite): self.helmet_health = 0 # 注意合并后清零 else: # 没有防具 self.health -= damage - elif damageType == c.ZOMBIE_ASH_DAMAGE: + elif damage_type == c.ZOMBIE_ASH_DAMAGE: self.health -= damage # 无视任何防具 - elif damageType == c.ZOMBIE_WALLNUT_BOWLING_DANMAGE: + elif damage_type == c.ZOMBIE_WALLNUT_BOWLING_DANMAGE: # 逻辑:对防具的多余伤害不传递 if self.helmet_type2: # 对二类防具伤害较一般情况低,拟合铁门需要砸3次的设定 @@ -435,7 +435,7 @@ class Zombie(pg.sprite.Sprite): self.health -= damage else: print("警告:植物攻击类型错误,现在默认进行类豌豆射手型攻击") - self.setDamage(damage, effect=effect, damageType=c.ZOMBIE_DEAFULT_DAMAGE) + self.setDamage(damage, effect=effect, damage_type=c.ZOMBIE_DEAFULT_DAMAGE) # 记录攻击时间 self.hit_timer = self.current_time diff --git a/source/constants.py b/source/constants.py index dc38fc5..5cad5da 100755 --- a/source/constants.py +++ b/source/constants.py @@ -359,7 +359,7 @@ PLANT_CARD_INFO = (# 元组 (植物名称, 卡片名称, 阳光, 冷却时间) CARD_GARLIC := "card_garlic", 50, 7500), - # 应当保证这两个在一般模式下不可选的特殊植物恒在最后 + # 应当保证这3个在一般模式下不可选的特殊植物恒在最后 (WALLNUTBOWLING := "WallNutBowling", CARD_WALLNUT := "card_wallnut", 0, @@ -368,6 +368,10 @@ PLANT_CARD_INFO = (# 元组 (植物名称, 卡片名称, 阳光, 冷却时间) CARD_REDWALLNUT := "card_redwallnut", 0, 0), + (GIANTWALLNUT := "GiantWallNut", + CARD_GIANTWALLNUT := "card_giantwallnut", + 0, + 0), ) # 卡片中的植物名称与索引序号的对应关系,指定名称以得到索引值 @@ -376,7 +380,7 @@ 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) +CARDS_TO_CHOOSE = range(len(PLANT_CARD_INFO) - 3) # 植物集体属性集合 @@ -408,6 +412,7 @@ PLANT_DIE_SOUND_EXCEPTIONS = { ICEFROZENPLOT, HOLE, GRAVE, JALAPENO, REDWALLNUTBOWLING, CHERRYBOMB, + GIANTWALLNUT, } # 直接水生植物 @@ -426,7 +431,7 @@ PLANT_NON_CHECK_ATTACK_STATE = ( # 这里运用了集合运算 SUNSHROOM, COFFEEBEAN, GRAVEBUSTER, LILYPAD, HYPNOSHROOM, GARLIC, - PUMPKINHEAD, + PUMPKINHEAD, GIANTWALLNUT, } | # 非植物类 NON_PLANT_OBJECTS @@ -492,6 +497,11 @@ STAR_BACKWARD = "backward" #向后 STAR_UPWARD = "upward" # 向上 STAR_DOWNWARD = "downward" # 向下 +# 有爆炸图片的子弹 +BULLET_INDEPENDENT_BOOM_IMG = { BULLET_PEA, BULLET_PEA_ICE, + BULLET_MUSHROOM, BULLET_SEASHROOM, + BULLET_STAR, } + # 僵尸信息 ZOMBIE_IMAGE_RECT = "zombie_image_rect" ZOMBIE_HEAD = "ZombieHead" diff --git a/source/state/level.py b/source/state/level.py index c647e3a..91c4647 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -102,28 +102,28 @@ class Level(tool.State): # 可以考虑将波刷新和一波中的僵尸生成分开 # useableZombie是指可用的僵尸种类的元组 # inevitableZombie指在本轮必然出现的僵尸,输入形式为字典: {波数1:(僵尸1, 僵尸2……), 波数2:(僵尸1, 僵尸2……)……} - def createWaves(self, useableZombies, numFlags, survivalRounds=0, inevitable_zombie_dict=None): + def createWaves(self, useable_zombies, num_flags, survival_rounds=0, inevitable_zombie_dict=None): waves = [] - self.numFlags = numFlags + self.num_flags = num_flags # 权重值 weights = [] - for zombie in useableZombies: + for zombie in useable_zombies: weights.append(c.CREATE_ZOMBIE_DICT[zombie][1]) # 按照原版pvz设计的僵尸容量函数,是从无尽解析的,但是普通关卡也可以遵循 - for wave in range(1, 10 * numFlags + 1): - volume = int(int((wave + survivalRounds*20)*0.8)/2) + 1 - zombieList = [] + for wave in range(1, 10 * num_flags + 1): + volume = int(int((wave + survival_rounds*20)*0.8)/2) + 1 + zombie_list = [] # 大波僵尸情况 if wave % 10 == 0: # 容量增大至2.5倍 volume = int(volume*2.5) # 先生成旗帜僵尸 - zombieList.append(c.FLAG_ZOMBIE) + zombie_list.append(c.FLAG_ZOMBIE) volume -= c.CREATE_ZOMBIE_DICT[c.FLAG_ZOMBIE][0] # 传送带模式应当增大僵尸容量 @@ -132,23 +132,23 @@ class Level(tool.State): if inevitable_zombie_dict and (wave in inevitable_zombie_dict): for new_zombie in inevitable_zombie_dict[wave]: - zombieList.append(new_zombie) + zombie_list.append(new_zombie) volume -= c.CREATE_ZOMBIE_DICT[new_zombie][0] if volume < 0: logger.warning(f"第{wave}波中手动设置的僵尸级别总数超过上限!") # 防止因为僵尸最小等级过大,使得总容量无法完全利用,造成死循环的检查机制 - minCost = c.CREATE_ZOMBIE_DICT[min(useableZombies, key=lambda x:c.CREATE_ZOMBIE_DICT[x][0])][0] + min_cost = c.CREATE_ZOMBIE_DICT[min(useable_zombies, key=lambda x:c.CREATE_ZOMBIE_DICT[x][0])][0] - while (volume >= minCost) and (len(zombieList) < 50): - new_zombie = random.choices(useableZombies, weights)[0] + while (volume >= min_cost) and (len(zombie_list) < 50): + new_zombie = random.choices(useable_zombies, weights)[0] # 普通僵尸、路障僵尸、铁桶僵尸有概率生成水中变种 if self.background_type in c.POOL_EQUIPPED_BACKGROUNDS: # 有泳池第一轮的第四波设定上生成水生僵尸 - if survivalRounds == 0 and wave == 4: + if survival_rounds == 0 and wave == 4: if new_zombie in c.CONVERT_ZOMBIE_IN_POOL: new_zombie = c.CONVERT_ZOMBIE_IN_POOL[new_zombie] - elif survivalRounds > 0 or wave > 4: + elif survival_rounds > 0 or wave > 4: if random.randint(1, 3) == 1: # 1/3概率水上,暂时人为设定 if new_zombie in c.CONVERT_ZOMBIE_IN_POOL: new_zombie = c.CONVERT_ZOMBIE_IN_POOL[new_zombie] @@ -156,22 +156,22 @@ class Level(tool.State): elif new_zombie in c.WATER_ZOMBIE: continue if c.CREATE_ZOMBIE_DICT[new_zombie][0] <= volume: - zombieList.append(new_zombie) + zombie_list.append(new_zombie) volume -= c.CREATE_ZOMBIE_DICT[new_zombie][0] - waves.append(zombieList) - # print(wave, zombieList, len(zombieList)) + waves.append(zombie_list) + # print(wave, zombie_list, len(zombie_list)) self.waves = waves # 针对有泳池的关卡 # 表示尚未生成最后一波中从水里冒出来的僵尸 - self.createdZombieFromPool = False + self.created_zombie_from_pool = False # 僵尸的刷新机制 - def refreshWaves(self, current_time, survivalRounds=0): + def refreshWaves(self, current_time, survival_rounds=0): # 最后一波或者大于最后一波 - # 如果在夜晚按需从墓碑生成僵尸 + # 如果在夜晚按需从墓碑生成僵尸 有泳池时从水中生成僵尸 # 否则直接return if self.wave_num >= self.map_data[c.NUM_FLAGS] * 10: if self.map_data[c.BACKGROUND_TYPE] == c.BACKGROUND_NIGHT: @@ -227,7 +227,7 @@ class Level(tool.State): self.zombie_groups[item[1]].add(zombie.ConeHeadZombie(item_x, item_y, self.head_group)) self.grave_zombie_created = True elif self.map_data[c.BACKGROUND_TYPE] in c.POOL_EQUIPPED_BACKGROUNDS: - if not self.createdZombieFromPool: + if not self.created_zombie_from_pool: if current_time - self.wave_time > 1500: for i in range(3): # 水中倒数四列内可以在此时产生僵尸。共产生3个 @@ -235,14 +235,14 @@ class Level(tool.State): item_x, item_y = self.map.getMapGridPos(map_x, map_y) # 用随机数指定产生的僵尸类型 # 暂时设定为生成概率相同 - zombieType = random.randint(1, 3) - if zombieType == 1: + zombie_type = random.randint(1, 3) + if zombie_type == 1: self.zombie_groups[map_y].add(zombie.BucketHeadDuckyTubeZombie(item_x, item_y, self.head_group)) - elif zombieType == 2: + elif zombie_type == 2: self.zombie_groups[map_y].add(zombie.ConeHeadDuckyTubeZombie(item_x, item_y, self.head_group)) else: self.zombie_groups[map_y].add(zombie.DuckyTubeZombie(item_x, item_y, self.head_group)) - self.createdZombieFromPool = True + self.created_zombie_from_pool = True return # 还未开始出现僵尸 @@ -250,7 +250,7 @@ class Level(tool.State): if (self.wave_time == 0): # 表明刚刚开始游戏 self.wave_time = current_time else: - if (survivalRounds == 0) and (self.bar_type == c.CHOOSEBAR_STATIC): # 首次选卡等待时间较长 + if (survival_rounds == 0) and (self.bar_type == c.CHOOSEBAR_STATIC): # 首次选卡等待时间较长 if current_time - self.wave_time >= 18000: self.wave_num += 1 self.wave_time = current_time @@ -404,6 +404,7 @@ class Level(tool.State): if self.background_type in c.DAYTIME_BACKGROUNDS and self.bar_type == c.CHOOSEBAR_STATIC: self.produce_sun = True + self.fallen_sun = 0 # 已掉落的阳光 else: self.produce_sun = False self.sun_timer = self.current_time @@ -419,16 +420,16 @@ class Level(tool.State): self.wave_zombies = [] self.zombie_num = 0 - # 暂时没有生存模式,所以 survivalRounds = 0 + # 暂时没有生存模式,所以 survival_rounds = 0 if c.INEVITABLE_ZOMBIE_DICT in self.map_data: - self.createWaves( useableZombies=self.map_data[c.INCLUDED_ZOMBIES], - numFlags=self.map_data[c.NUM_FLAGS], - survivalRounds=0, + self.createWaves( useable_zombies=self.map_data[c.INCLUDED_ZOMBIES], + num_flags=self.map_data[c.NUM_FLAGS], + survival_rounds=0, inevitable_zombie_dict=self.map_data[c.INEVITABLE_ZOMBIE_DICT]) else: - self.createWaves( useableZombies=self.map_data[c.INCLUDED_ZOMBIES], - numFlags=self.map_data[c.NUM_FLAGS], - survivalRounds=0) + self.createWaves( useable_zombies=self.map_data[c.INCLUDED_ZOMBIES], + num_flags=self.map_data[c.NUM_FLAGS], + survival_rounds=0) self.setupCars() # 地图有铲子才添加铲子 @@ -458,9 +459,9 @@ class Level(tool.State): else: grade_graves = 1 - graveVolume = c.GRAVES_GRADE_INFO[grade_graves] + grave_volume = c.GRAVES_GRADE_INFO[grade_graves] self.grave_set = set() - while len(self.grave_set) < graveVolume: + while len(self.grave_set) < grave_volume: map_x = random.randint(4, 8) # 注意是从0开始编号 map_y = random.randint(0, 4) self.grave_set.add((map_x, map_y)) @@ -654,10 +655,6 @@ class Level(tool.State): return def play(self, mouse_pos, mouse_click): - # 原版阳光掉落机制需要 - # 已掉落的阳光 - self.fallen_sun = 0 - # 如果暂停 if self.show_game_menu: self.pauseAndCheckMenuOptions(mouse_pos, mouse_click) @@ -703,14 +700,13 @@ class Level(tool.State): x, y = self.map.getMapGridPos(map_x, map_y) self.sun_group.add(plant.Sun(x, 0, x, y)) self.fallen_sun += 1 - - # wcb 添加 + # 检查有没有捡到阳光 clicked_sun = False clicked_cards_or_map = False if not self.drag_plant and not self.drag_shovel and mouse_pos and mouse_click[0]: for sun in self.sun_group: - if sun.checkCollision(mouse_pos[0], mouse_pos[1]): + if sun.checkCollision(*mouse_pos): self.menubar.increaseSunValue(sun.sun_value) clicked_sun = True # 播放收集阳光的音效 @@ -767,7 +763,7 @@ class Level(tool.State): self.menubar.update(self.current_time) - # 检查碰撞啥的 + # 检查碰撞 self.checkBulletCollisions() self.checkZombieCollisions() self.checkPlants() @@ -925,6 +921,8 @@ class Level(tool.State): new_plant = plant.Garlic(x, y) elif self.plant_name == c.PUMPKINHEAD: new_plant = plant.PumpkinHead(x, y) + elif self.plant_name == c.GIANTWALLNUT: + new_plant = plant.GiantWallNut(x, y) if new_plant.can_sleep and self.background_type in c.DAYTIME_BACKGROUNDS: @@ -1016,13 +1014,13 @@ class Level(tool.State): continue if collided_func(zombie, bullet): if zombie.state != c.DIE: - zombie.setDamage(bullet.damage, effect=bullet.effect, damageType=bullet.damageType) + zombie.setDamage(bullet.damage, effect=bullet.effect, damage_type=bullet.damage_type) bullet.setExplode() # 火球有溅射伤害 if bullet.name == c.BULLET_FIREBALL: for rangeZombie in self.zombie_groups[i]: if abs(rangeZombie.rect.x - bullet.rect.x) <= (c.GRID_X_SIZE // 2): - rangeZombie.setDamage(c.BULLET_DAMAGE_FIREBALL_RANGE, effect=None, damageType=c.ZOMBIE_DEAFULT_DAMAGE) + rangeZombie.setDamage(c.BULLET_DAMAGE_FIREBALL_RANGE, effect=None, damage_type=c.ZOMBIE_DEAFULT_DAMAGE) break @@ -1105,7 +1103,9 @@ class Level(tool.State): zombie.prey_map_x, zombie.prey_map_y = self.map.getMapIndex(target_plant.rect.centerx, target_plant.rect.centery) # 撑杆跳的特殊情况 if zombie.name in {c.POLE_VAULTING_ZOMBIE} and (not zombie.jumped): - if not zombie.jumping: + if target_plant.name == c.GIANTWALLNUT: + zombie.health = 0 + elif not zombie.jumping: zombie.jump_map_x, zombie.jump_map_y = min(c.GRID_X_LEN - 1, zombie.prey_map_x), min(self.map_y_len - 1, zombie.prey_map_y) jump_x = target_plant.rect.x - c.GRID_X_SIZE * 0.6 if c.TALLNUT in self.map.map[zombie.jump_map_y][zombie.jump_map_x][c.MAP_PLANT]: @@ -1123,15 +1123,17 @@ class Level(tool.State): if target_plant.canHit(i): # target_plant.vel_y不为0,有纵向速度,表明已经发生过碰撞,对铁门秒杀(这里实现为忽略二类防具攻击) if target_plant.vel_y and zombie.name == c.SCREEN_DOOR_ZOMBIE: - zombie.setDamage(c.WALLNUT_BOWLING_DAMAGE, damageType=c.ZOMBIE_COMMON_DAMAGE) + zombie.setDamage(c.WALLNUT_BOWLING_DAMAGE, damage_type=c.ZOMBIE_COMMON_DAMAGE) else: - zombie.setDamage(c.WALLNUT_BOWLING_DAMAGE, damageType=c.ZOMBIE_WALLNUT_BOWLING_DANMAGE) + zombie.setDamage(c.WALLNUT_BOWLING_DAMAGE, damage_type=c.ZOMBIE_WALLNUT_BOWLING_DANMAGE) target_plant.changeDirection(i) # 播放撞击音效 c.SOUND_BOWLING_IMPACT.play() elif target_plant.name == c.REDWALLNUTBOWLING: if target_plant.state == c.IDLE: target_plant.setAttack() + elif target_plant.name == c.GIANTWALLNUT: + zombie.health = 0 elif zombie.target_y_change: # 大蒜作用正在生效的僵尸不进行传递 continue @@ -1194,7 +1196,7 @@ class Level(tool.State): ((zombie.rect.right - (x-x_range) > 20) or (zombie.rect.right - (x-x_range))/zombie.rect.width > 0.2, ((x+x_range) - zombie.rect.left > 20) or ((x+x_range) - zombie.rect.left)/zombie.rect.width > 0.2)[zombie.rect.x > x]): # 这代码不太好懂,后面是一个判断僵尸在左还是在右,前面是一个元组,[0]是在左边的情况,[1]是在右边的情况 if effect == c.BULLET_EFFECT_UNICE: zombie.ice_slow_ratio = 1 - zombie.setDamage(1800, damageType=c.ZOMBIE_ASH_DAMAGE) + zombie.setDamage(1800, damage_type=c.ZOMBIE_ASH_DAMAGE) if zombie.health <= 0: zombie.setBoomDie() @@ -1205,7 +1207,7 @@ class Level(tool.State): for i in range(self.map_y_len): for zombie in self.zombie_groups[i]: zombie.setFreeze(plant.trap_frames[0]) - zombie.setDamage(20, damageType=c.ZOMBIE_RANGE_DAMAGE) # 寒冰菇还有全场20的伤害 + zombie.setDamage(20, damage_type=c.ZOMBIE_RANGE_DAMAGE) # 寒冰菇还有全场20的伤害 def killPlant(self, target_plant, shovel=False): x, y = target_plant.getPosition() @@ -1284,7 +1286,7 @@ class Level(tool.State): # 双判断:发生碰撞或在攻击范围内 if ((pg.sprite.collide_mask(zombie, target_plant)) or (abs(zombie.rect.centerx - target_plant.rect.centerx) <= target_plant.explode_x_range)): - zombie.setDamage(1800, damageType=c.ZOMBIE_RANGE_DAMAGE) + zombie.setDamage(1800, damage_type=c.ZOMBIE_RANGE_DAMAGE) target_plant.boomed = True elif target_plant.name == c.SQUASH: for zombie in self.zombie_groups[i]: @@ -1494,8 +1496,8 @@ class Level(tool.State): pg.draw.rect(surface, c.YELLOWGREEN, filledBarRect) # 画旗帜 - for i in range(self.numFlags): - self.level_progress_flag_rect.x = self.level_progress_bar_image_rect.x + int((150*i)/self.numFlags) + 5 # 常数是猜的 + for i in range(self.num_flags): + self.level_progress_flag_rect.x = self.level_progress_bar_image_rect.x + int((150*i)/self.num_flags) + 5 # 常数是猜的 # 当指示进度的僵尸头在旗帜左侧时升高旗帜 if self.level_progress_flag_rect.x - 7 >= self.level_progress_zombie_head_image_rect.x: self.level_progress_flag_rect.y = self.level_progress_bar_image_rect.y - 15 # 常数是猜的