class Robot(pygame.sprite.Sprite): def __init__(self, location): pygame.sprite.Sprite.__init__(self) self.image = load_image("Images/miner2-run/miner2-running0001.png") self.rect = self.image.get_rect() self.rect.center = location self.rect[2] += 15 self.start_location = location self.run = [] self.stand = [] self.jump = [] self.frame_ID = 0 self.running = False self.active = False self.boulder = [] self.destruction_timer = 0 self.speed = 8 self.x_direction = 0 self.facing = -1 self.y_speed = 0 self.jumping = False self.pick_sfx = Play_Music("//sfx//robots-picking-at-rocks.ogg", -1) self.walk_sfx = Play_Music("//sfx//robot-walk.ogg", -1) self.boom_sfx = Play_Music("//sfx//boulder-explode.ogg", -1) self.walking = False self.picking = False self.type = "robot" self.pre_buffer() def pre_buffer(self): for i in range(1,13): self.run.append(load_image("Images/miner2-run/miner2-running" + str(10000 + i)[1:] + ".png")) for i in range(1,13): self.stand.append(load_image("Images/miner2/miner2" + str(10000 + i)[1:] + ".png")) for i in range(1,13): self.jump.append(load_image("Images/miner/miner-" + str(10000 + i)[1:] + ".png")) def update(self, map_location, map, players): if self.active == True: if self.boulder.rect.colliderect(self.rect) and self.rect[0] - self.boulder.rect[0] < 100 and self.boulder.rect[0] - self.rect[0] < 100 : self.walk_sfx.stop() self.walking = False if self.picking == False: self.pick_sfx.play() self.picking = True self.x_direction = 0 if self.rect[0] < self.boulder.rect[0]: self.facing = -1 self.image = pygame.transform.flip(self.stand[self.frame_ID], 1, 0) else: self.facing = 1 self.image = self.stand[self.frame_ID] self.destruction_timer += 1 self.boulder.health -= 1 self.boulder.show_health = True if self.destruction_timer > 450: self.boulder.health = 450 self.boulder.show_health = False self.boom_sfx.play_once() self.boulder.dead = True self.boulder.respawn = True self.active = False self.boulder = [] self.destruction_timer = 0 self.pick_sfx.stop() if self.frame_ID > 10: self.frame_ID = 0 else: if self.walking == False: self.walk_sfx.play() self.walking = True self.pick_sfx.stop() self.picking = False if self.rect[0] < self.boulder.rect[0]: self.x_direction = 1 self.facing = 1 self.image = pygame.transform.flip(self.run[self.frame_ID], 1, 0) else: self.x_direction = -1 self.facing = -1 self.image = self.run[self.frame_ID] if self.frame_ID > 10: self.frame_ID = 0 self.rect[0] += self.x_direction * self.speed else: if abs(self.rect[0] - self.start_location[0]) > 100: if self.walking == False: self.walk_sfx.play() self.walking = True self.pick_sfx.stop() self.picking = False if self.rect[0] < self.start_location[0]: self.x_direction = 1 self.facing = 1 self.image = pygame.transform.flip(self.run[self.frame_ID], 1, 0) else: self.x_direction = -1 self.facing = -1 self.image = self.run[self.frame_ID] if self.frame_ID > 10: self.frame_ID = 0 self.rect[0] += self.x_direction * self.speed else: self.image = self.jump[self.frame_ID] self.walk_sfx.stop() if self.frame_ID > 10: self.frame_ID = 0 if map.ground_collision(self, [0,422]) == False: self.y_speed += 1 self.rect[1] += self.y_speed else: self.y_speed = 0 self.frame_ID += 1 test_rect = [self.rect[0] + map_location[0], self.rect[1] + map_location[1] - 832, self.rect[2], self.rect[3]] for player in players: if player.player_ID == player.ID: self.walk_sfx.locate(test_rect[0] - player.rect[0], test_rect[1] - player.rect[1]) self.pick_sfx.locate(test_rect[0] - player.rect[0], test_rect[1] - player.rect[1]) self.boom_sfx.locate(test_rect[0] - player.rect[0], test_rect[1] - player.rect[1]) def test_landed(self, player, offset): return(False)
class Gate(pygame.sprite.Sprite): def __init__(self, location, ID): pygame.sprite.Sprite.__init__(self) if ID != 0 and ID != 4: self.gate = load_image("Images\\gate.png") self.base = load_image("Images\\gate-portal.png") self.image = pygame.Surface((135,430), pygame.SRCALPHA, 32) self.image.blit(self.gate, (35,0)) self.image.blit(self.base, (0, 390)) elif ID == 0: self.gate = load_image("Images\\lift.png") self.base = load_image("Images\\lift-wall.png") self.gate_sfx = Play_Music("\\sfx\\crane-lifting.ogg", -1) self.image = pygame.Surface((319, 550), pygame.SRCALPHA, 32) self.image.blit(self.gate, (40,0)) self.image.blit(self.base, (0,330)) location[1] -= 70 else: self.image = pygame.Surface((250,750), pygame.SRCALPHA, 32) self.image.blit(load_image("Images\\crumbly-wall.png"), (0,0)) self.boom = [] for i in range(1, 25): self.boom.append(load_image("Images\\crumble-wall\\cumble-wall-" + str(10000 + i)[1:] + ".png")) self.rect = self.image.get_rect() self.rect.center = location self.gate_timer = -1 self.ID = ID self.activation_confirmation = 0 self.transition_counter = 0 self.type = "gate" self.open = False self.animating = 0 self.frame_ID = 0 def update(self, players, map_location): if self.activation_confirmation == 10 and (self.transition_counter > 300 or self.ID == 0): self.open = True else: self.open = False test_rect = [self.rect[0] + map_location[0], self.rect[1] + map_location[1] - 832, self.rect[2], self.rect[3]] for player in players: if player.hit_rect.colliderect(test_rect): if player.hit_rect[0] < test_rect[0]: player.rect[0] -= player.speed else: player.rect[0] += player.speed if self.ID == 0: for player in players: if player.player_ID == player.ID: test_rect = [self.rect[0] + map_location[0], self.rect[1] + map_location[1] - 832, self.rect[2], self.rect[3]] self.gate_sfx.locate(test_rect[0] - player.rect[0], test_rect[1] - player.rect[1] / 2) if self.animating == 1: self.open_gate() elif self.animating == -1: self.close_gate() def trigger(self, trigger_code): print trigger_code if trigger_code == 10: self.activation_confirmation = 10 self.gate_timer = 99999 self.animating = 1 self.transition_counter = 0 if self.ID == 0: self.gate_sfx.play_once() elif trigger_code > 0: self.activation_confirmation += trigger_code print self.activation_confirmation if self.activation_confirmation >= 10: self.activation_confirmation = 10 self.gate_timer = 99999 self.animating = 1 self.transition_counter = 0 else: self.activation_confirmation += trigger_code print self.activation_confirmation if self.activation_confirmation < 10: self.gate_timer = 0 if self.activation_confirmation - trigger_code == 10 or trigger_code == -10: self.animating = -1 self.transition_counter = 0 elif self.activation_confirmation == 10: self.activation_confirmation = 10 self.gate_timer = 99999 self.animating = 1 self.transition_counter = 0 def open_gate(self): if self.ID != 0 and self.ID != 4: self.image = pygame.Surface((135,430), pygame.SRCALPHA, 32) self.image.blit(self.gate, (35, self.transition_counter)) self.image.blit(self.base, (0, 390)) self.transition_counter += 10 if self.transition_counter > 400: self.animating = 0 elif self.ID != 4: self.image = pygame.Surface((319, 550), pygame.SRCALPHA, 32) self.image.blit(self.gate, (40,0)) self.image.blit(self.base, (0,330 - self.transition_counter)) self.transition_counter += 3.25 if self.transition_counter > 330: self.animating = 0 else: self.image.fill(0) self.image = pygame.Surface((250, 750), pygame.SRCALPHA, 32) self.transition_counter = 500 self.image.blit(self.boom[self.frame_ID], (10,0)) self.frame_ID += 1 if self.frame_ID > 23: self.animating = 0 self.frame_ID = 0 def close_gate(self): if self.ID != 0: print "Closing" self.image = pygame.Surface((135,430), pygame.SRCALPHA, 32) self.image.blit(self.gate, (35, 400 - self.transition_counter)) self.image.blit(self.base, (0, 390)) self.transition_counter += 10 if self.transition_counter > 400: self.animating = 0 elif self.ID != 4: self.image = pygame.Surface((319, 550), pygame.SRCALPHA, 32) self.image.blit(self.gate, (40,0)) self.image.blit(self.base, (0,self.transition_counter)) self.transition_counter += 10 if self.transition_counter > 330: self.animating = 0 else: self.animating = 0 def test_landed(self, player, offset): return(False)
class Block(pygame.sprite.Sprite): def __init__(self, location, map): pygame.sprite.Sprite.__init__(self) self.image = load_image("Images/block.png") self.block_image = self.image self.explode_img = [] for i in range(1,15): self.explode_img.append(load_image("Images/expload/boulder-explosion-" + str(10000 + i)[1:] + ".png")) self.rect = self.image.get_rect() self.rect.center = location self.start_location = location self.respawn = False self.roll = [] self.x_direction = 0 for i in range(1, 32): self.roll.append(load_image("Images/roll/roll-" + str(10000 + i)[1:] + ".png")) self.loc = self.rect self.map = 0#map self.type = "block" self.jumping = False self.y_speed = 0 self.speed = 0 self.angle = 0 self.active = False self.dead = False self.dead_count = 0 self.boom_timer = 0 self.health = 450.0 self.show_health = False self.health_image = pygame.Surface((169, 45), pygame.SRCALPHA, 32) self.health_background = load_image("Images/healthbar-background.png") self.health_foreground = load_image("Images/healthbar-bar.png") self.roll_sfx = Play_Music("//sfx//boulder-rolling.ogg", -1) self.boom_sfx = Play_Music("//sfx//rock-crumble.ogg", -1) def update(self, player_list, map, map_location, objects, robots): #self.rect[1] -= map_location[2] if self.dead == False: if map[0].ground_collision(self, [0,422]) == False: self.y_speed += 1 self.rect[1] += self.y_speed else: self.y_speed = 0 moving = 0 test_rect = [self.rect[0] + map_location[0], self.rect[1] + map_location[1] - 832, self.rect[2], self.rect[3]] active = 0 for object in objects: if object.type == "block" and object.active == True: active += 1 if active == 1 and self.active == True: active = 0 for player in player_list: if player.ID == 1: if player.hit_rect.colliderect(test_rect): if player.interacting == True: if player.hit_rect[1] > test_rect[1] + 40 and active < 1: if player.animation_type != "push": self.roll_sfx.play() player.animation_type = "push" player.frame_ID = 0 if player.x_direction == -1: if test_rect[0] < player.hit_rect[0] - 100: self.speed = 10 * player.x_direction self.angle += 1 self.active = True elif player.x_direction == 1: if test_rect[0] > player.rect[0] + 100: self.speed = 10 * player.x_direction self.angle -= 1 self.active = True ping = [] for robot in robots: if robot.boulder == []: ping = robot elif robot.boulder == self: ping = [] break; if ping != []: ping.boulder = self ping.active = True else: for object in objects: if object.type == "block": object.active = False object.roll_sfx.stop() else: self.speed = 0 self.roll_sfx.stop() elif player.ID == 1: self.active = False if player.animation_type == "push" and active == 0 and self.active == False: if player.x_direction != 0: player.animation_type = "run" else: player.animation_type = "idle" player.frame_ID = 0 if self.show_health == True: self.health_image.blit(self.health_background, (0,0)) overlay = pygame.Surface((169, 45), pygame.SRCALPHA, 32) overlay.blit(self.health_foreground, (0,0)) overlay.fill(0, (0, 0, ( 1- self.health / 450.0) * 169 ,45)) print self.health / 450 self.health_image.blit(overlay, (0,0)) #self.image.blit(self.health_image, (0,0)) if self.active == False: self.speed = 0 if self.angle > 30: self.angle = 0 if self.angle < 0: self.angle = 30 self.image = self.roll[self.angle] self.rect[0] += self.speed else: self.explode(map_location, player_list) def spawner_update(self, map_location, map, players): if self.dead == True: self.rect[1] = 1950 self.explode(map_location, players) elif self.rect[1] < 1950: self.y_speed += 1 self.rect[1] += self.y_speed self.boom_timer += 1 else: self.y_speed = 0 self.dead = True def explode(self, map_location, players): if self.dead_count > 14: self.dead = False if self.respawn == False: self.rect[1] = -1000000 else: self.rect.center = self.start_location self.image = self.block_image self.dead_count = 0 self.boom_timer = 0 elif self.dead_count == 1: self.show_health = False self.boom_sfx.play_once() self.image = self.explode_img[self.dead_count - 1] self.dead_count += 1 test_rect = [self.rect[0] + map_location[0], self.rect[1] + map_location[1] - 832, self.rect[2], self.rect[3]] for player in players: if player.player_ID == player.ID: self.boom_sfx.locate(test_rect[0] - player.rect[0], test_rect[1] - player.rect[1]) else: self.image = self.explode_img[self.dead_count - 1] self.dead_count += 1 def test_landed(self, player, offset): return False ## Corrected rect for floating blocks # collide_rect = [self.rect[0] + offset[0], self.rect[1] + offset[1], self.rect[2], self.rect[3]] ##Check the player is within the hitbox and is colliding with the block (first check is for air, second for ground) # if player.rect[1] >= self.rect[1] - 100 + offset[1] and player.rect[1] < self.rect[1] - 50 + offset[1] and player.dropping == 10: # if (player.hit_rect.colliderect(collide_rect) or player.hit_rect.colliderect(self.rect)): # if player.y_speed < 0: # player.rect[1] = self.rect[1] - 100 + offset[1] # player.jumping = False # player.animation_type = "land" # player.y_speed = 0 # player.frame_ID = 0 # return(True) # else: # return(False)
class Water(pygame.sprite.Sprite): def __init__(self, location, width, ID): pygame.sprite.Sprite.__init__(self) self.image = load_image("Images\\pipe.png") self.rect = self.image.get_rect() self.water = pygame.Surface((1350 * width, 450), pygame.SRCALPHA, 32) water_image = load_image("Images\\maps\\water\\WATER-0001.png") self.water_rect = self.water.get_rect() self.rect.center = location self.water_rect[0] = self.rect[0] - 500 self.plank = load_image("Images\\plank.png") self.plank_rect = self.plank.get_rect() for i in range(0, width): self.water.blit(water_image, (1350 * i, 0)) self.type = "water" self.ID = ID self.on = False self.water_height = 0 self.frame_ID = 17 self.water_ID = 0 self.start = [] self.flow = [] self.stop = [] self.pipe = load_image("Images\\pipe.png") self.water_animation = [] self.blit_rect = [] self.water_pouring = Play_Music("//sfx//water-flow.ogg", -1) self.prebuffer() def update(self, players, map_location): if self.on and self.water_height < 90: self.water_height += 2 elif self.on == False and self.water_height > 0: self.water_height -= 2 self.water_rect[1] = self.rect[1] + 50 - self.water_height if self.on and self.frame_ID < 16: self.image = self.start[self.frame_ID] if self.on == False and self.frame_ID < 16: self.image = self.stop[self.frame_ID] if self.on and self.frame_ID >= 16: self.image = self.flow[self.frame_ID - 16] if self.frame_ID >= 31: self.frame_ID = 16 if self.on == False and self.frame_ID >= 16: self.image = self.pipe self.water = self.water_animation[int(self.water_ID)] if self.water_ID >= 22: self.water_ID = 0 self.frame_ID += 1 self.water_ID += 0.5 self.blit_rect = [self.rect[0], 490 - self.water_height + self.rect[1], 321, 300] self.plank_rect = [self.rect[0] - 320, self.rect[1] + 490 - self.water_height, self.plank_rect[2], self.plank_rect[3]] test_rect = [self.plank_rect[0] + map_location[0] + self.rect[3] / 2, self.plank_rect[1] + map_location[1] - 832, self.plank_rect[2], self.plank_rect[3]] for player in players: if player.player_ID == player.ID: self.water_pouring.locate(test_rect[0] - player.rect[0], test_rect[1] - player.rect[1]) def trigger(self, trigger_code): self.on = not self.on if self.frame_ID >= 16: self.frame_ID = 0 if self.on: self.water_pouring.play() else: self.water_pouring.stop() def prebuffer(self): for i in range(1, 17): self.start.append(load_image("Images\\begin-flow\\start-flow-" + str(10000 + i)[1:] + ".png")) for i in range(1, 17): self.flow.append(load_image("Images\\flowing\\flowing-" + str(10000 + i)[1:] + ".png")) for i in range(1, 17): self.stop.append(load_image("Images\\stopping\\stopping-" + str(10000 + i)[1:] + ".png")) for i in range(1, 24): self.water_animation.append(load_image("Images\\Maps\\water\\water-" + str(10000 + i)[1:] + ".png")) def test_landed(self, player, offset): # Corrected rect for floating blocks collide_rect = [self.plank_rect[0] + offset[0], self.plank_rect[1] + offset[1] + 30, self.plank_rect[2], self.plank_rect[3] + 500] # Check the player is within the hitbox and is colliding with the block (first check is for air, second for ground) if (player.hit_rect.colliderect(collide_rect)): if player.y_speed < 0: player.rect[1] = self.rect[1] + 490 - self.water_height + offset[1] - 150 + 30 player.jumping = False player.animation_type = "land" player.y_speed = 0 player.frame_ID = 0 if player.rect[1] > self.rect[1] + 490 - self.water_height + offset[1] - 150 + 30 and player.jumping == False: player.rect[1] = self.rect[1] + 490 - self.water_height + offset[1] - 150 + 30 if self.on and self.water_height > 0 and self.water_height < 90: player.rect[1] -= 2 if not self.on and self.water_height != 0: player.rect[1] += 2 return(True) else: return(False)
class Button(pygame.sprite.Sprite): def __init__(self, location, type, gate, trigger, gates): pygame.sprite.Sprite.__init__(self) for item in gates: if item.ID == gate: self.gate = item break; self.trigger_ID = trigger self.activated = False self.activation_delay = 0 self.type = "button" self.float = False self.float_hit = 0 self.button_type = type self.plugged = [] self.unplugged = [] self.frame_ID = 0 self.img_type = "unplugged" self.prebuffer() if type == 2: self.geyser = Play_Music("//sfx//geyser-flow.ogg", -1) self.geyser.play() self.plugged_sfx = Play_Music("//sfx//plugged-geyser.ogg", -1) else: self.switch_sfx = Play_Music("//sfx//switch.ogg", -1) if type != 2: self.image = load_image("Images\\button" + str(type) + ".png") else: self.image = self.unplugged[0] self.rect = self.image.get_rect() self.rect.center = location def update(self, players, objects, map_location): test_rect = [self.rect[0] + map_location[0], self.rect[1] + map_location[1] - 832, self.rect[2], self.rect[3]] # Standard wall button if self.button_type == 0: for player in players: if player.rect.colliderect(test_rect): if player.interacting == True: self.button_pressed() # Floor button else: hit = False for player in players: if player.hit_rect.colliderect(test_rect) and player.rect[0] - test_rect[0] > -150 and player.rect[0] - test_rect[0] < 50 and self.button_type != 2: hit = True if self.activated == False: self.button_pressed() for object in objects: if object.type == "block": if object.rect.colliderect(self.rect) and object.rect[0] - self.rect[0] > -150 and object.rect[0] - self.rect[0] < 50: hit = True if self.activated == False: if self.button_type != 2: self.switch_sfx.play_once() else: self.geyser.stop() self.plugged_sfx.play() self.button_pressed() if hit == False and self.activated == True: self.float_hit += 1 if self.float_hit > 20: if self.button_type == 2: self.plugged_sfx.stop() self.geyser.play() self.button_pressed() self.float_hit = 0 self.float = False self.activation_delay += 1 if self.button_type == 2: self.run_animation() for player in players: if player.player_ID == player.ID: self.geyser.locate(test_rect[0] - player.rect[0], test_rect[1] - player.rect[1]) self.plugged_sfx.locate(test_rect[0] - player.rect[0], test_rect[1] - player.rect[1]) def button_pressed(self): if self.activated == False and self.activation_delay > 10: self.gate.trigger(self.trigger_ID) self.activation_delay = 0 if self.button_type != 2: self.switch_sfx.play_once() self.image = load_image("Images\\button" + str(self.button_type) + "-pressed.png") self.frame_ID = 0 self.activated = True elif self.activated == True and self.activation_delay > 10: self.gate.trigger(self.trigger_ID * -1) if self.button_type != 2: #self.switch_sfx.play_once() self.image = load_image("Images\\button" + str(self.button_type) + ".png") self.frame_ID = 0 self.activated = False self.activation_delay = 0 def run_animation(self): if self.activated == True: self.image = self.plugged[self.frame_ID] self.frame_ID += 1 if self.frame_ID > 7: self.frame_ID = 0 else: self.float = False self.image = self.unplugged[self.frame_ID] self.frame_ID += 1 if self.frame_ID > 9: self.frame_ID = 0 def prebuffer(self): for i in range(1, 9): self.plugged.append(load_image("Images//plugged//plugged-" + str(10000 + i)[1:] + ".png")) for i in range(1, 11): self.unplugged.append(load_image("Images//unplugged//geyser-" + str(10000 + i)[1:] + ".png")) def test_landed(self, player, offset): return(False)