コード例 #1
0
    def spawn_bomb(self):
        if self.player.bomb_timer <= 0 and self.player.data.bombs > 0:
            original = self.player.data.bombs
            self.player.data.bombs -= 1
            self.player.event_bus.send.append(
                Event(
                    {
                        'type': PlayerEventType.BOMBS_CHANGED,
                        'original': original,
                        'amount': -1,
                        'new': self.player.data.bombs
                    }, EventType.PLAYER))

            self.player.bomb_timer = constants.BOMB_COOLDOWN
            bomb = self.player.world.create_entity_with(
                *loader.load("entity", "bomb")[0])

            transform = self.player.world.component_for_entity(bomb, Transform)
            transform.position.x = self.player.transform.position.x
            transform.position.y = self.player.transform.position.y

            script = self.player.world.component_for_entity(
                bomb, ScriptComponent).script
            script.damage_data = self.player.data.get_explosion_damage(
                transform.position)
コード例 #2
0
    def hurt(self, amount, knockback):
        if self.hurt_cooldown > 0:
            return
        self.hurt_cooldown = constants.HURT_COOLDOWN

        original = self.data.health

        self.data.health -= amount
        if self.data.health <= 0:
            gameover = self.world.create_entity_with(
                *loader.load("entity", "gameover")[0])

            script = self.world.component_for_entity(gameover,
                                                     ScriptComponent).script
            script.player_pos = self.transform.position

            self.data = PlayerData()
        else:
            self.collision.velocity.x += knockback.x
            self.collision.velocity.y += knockback.y

            self.sound_hurt.play()

        self.event_bus.send.append(
            Event(
                {
                    'type': PlayerEventType.HEALTH_CHANGED,
                    'original': original,
                    'amount': amount,
                    'new': self.data.health
                }, EventType.PLAYER))
コード例 #3
0
    def on_death(self):
        drop = self.world.create_entity_with(
            *loader.load("entity", "drops/arrow")[0])

        transform = self.world.component_for_entity(drop, Transform)
        transform.position.x = self.transform.position.x
        transform.position.y = self.transform.position.y
コード例 #4
0
ファイル: hearts.py プロジェクト: ShoaibSyed1/triforce_trials
    def draw_hearts(self, amount):
        self.clear_hearts()

        for i in range(amount):
            heart_entity = self.world.create_entity_with(*loader.load("entity", "ui/overworld/heart")[0])
            transform = self.world.component_for_entity(heart_entity, Transform)
            transform.position.x = 5 + i * 17
            transform.position.y = 5
            self._hearts.append(heart_entity)
コード例 #5
0
    def start(self, entity, world):
        self.entity = entity
        self.world = world

        self.sprite = self.world.component_for_entity(self.entity, Sprite)

        self.load_circle = self.world.create_entity_with(
            *loader.load("entity", "load_circle")[0])
        self.load_circle_sprite = self.world.component_for_entity(
            self.load_circle, Sprite)
コード例 #6
0
    def __init__(self, player):
        super().__init__(player)

        self.sound = pygame.mixer.Sound(paths.SOUNDS +
                                        "player/sword_attack.wav")

        self.timer = 0

        dir = self.player.facer.get_dir()
        if dir == None:
            dir = Direction.DOWN

        self.real_sword_entity = self.player.world.create_entity_with(
            *loader.load("entity", "sword_collision")[0])
        sword_script = SwordScript(self.player.data.get_sword_damage(dir),
                                   self.player)
        self.player.world.add_component(self.real_sword_entity,
                                        ScriptComponent(sword_script))
        self.sword_entity = self.player.world.create_entity_with(
            *loader.load("entity", "sword")[0])
コード例 #7
0
    def create_player(self):
        self.player_gameover = self.world.create_entity_with(
            *loader.load("entity", "player_gameover")[0])

        transform = self.world.component_for_entity(self.player_gameover,
                                                    Transform)

        transform.position.x = self.player_pos.x
        transform.position.y = self.player_pos.y

        animation = self.world.component_for_entity(self.player_gameover,
                                                    AnimationSets)

        animation.current = "still"
コード例 #8
0
    def start(self):
        from game import loader
        from game.system import AnimationSystem, CollisionSystem, EventBusSystem, EventSystem, MusicSystem, RenderSystem, ScriptSystem, UiSystem

        for entity_info in loader.load("scene", "overworld"):
            self.world.create_entity_with(*entity_info)

        self.world.add_system(AnimationSystem(), 1)
        self.world.add_system(CollisionSystem())
        self.world.add_system(EventBusSystem())
        self.world.add_system(EventSystem())
        self.world.add_system(MusicSystem())
        self.world.add_system(RenderSystem(self.game.window))
        self.world.add_system(ScriptSystem())
        self.world.add_system(UiSystem())
コード例 #9
0
    def load(loot_name):
        loot_data = loader.load("data", "loot/" + loot_name)

        items = []

        for item_data in loot_data.get('item', []):
            drop = Drop.from_data(item_data['drop'])

            chance = item_data['chance']
            level_factor = item_data.get('level_factor', 1)
            level_add = item_data.get('level_add', 0)

            items.append(LootItem(drop, chance, level_factor, level_add))

        return LootData(items)
コード例 #10
0
    def create_text(self):
        self.notify.text_entity = self.notify.world.create_entity_with(
            *loader.load("entity", "ui/overworld/notification_text")[0])

        self.notify.world.remove_component(self.notify.text_entity, Sprite)
        sprite = Sprite.new_text(self.notify.queue[0].text, (255, 255, 255),
                                 16)
        self.notify.world.add_component(self.notify.text_entity, sprite)

        self.text_transform = self.notify.world.component_for_entity(
            self.notify.text_entity, Transform)

        self.text_transform.position.x = constants.WIDTH / 2 - (
            sprite.texture.get_width() * self.text_transform.scale.x) / 2
        self.text_transform.position.y = self.notify.transform.position.y + constants.NOTIFY_TEXT_DISTANCE
コード例 #11
0
ファイル: enemy.py プロジェクト: ShoaibSyed1/triforce_trials
    def die(self):
        if self.enemy._dead:
            return
        
        self.enemy.on_death()
        
        self.enemy._dead = True
        self.enemy.event_bus.send.append(Event({
            'type': PlayerEventType.ADD_XP,
            'amount': self.enemy.xp_amount
        }, EventType.PLAYER, True))

        poof_entity = self.enemy.world.create_entity_with(*loader.load("entity", "poof")[0])
        poof_transform = self.enemy.world.component_for_entity(poof_entity, Transform)

        poof_transform.position = self.enemy.transform.position
コード例 #12
0
    def update_action(self):
        if self.text_entity != None:
            self.world.delete_entity(self.text_entity)
            self.text_entity = None

        self.sprite.visible = True

        self.text_entity = self.world.create_entity_with(
            *loader.load("entity", "ui/overworld/action_text")[0])
        sprite = Sprite.new_text(self.cur_text, (255, 255, 255), 20)
        self.world.add_component(self.text_entity, sprite)
        transform = self.world.component_for_entity(self.text_entity,
                                                    Transform)
        transform.position.x = constants.WIDTH / 2 - sprite.texture.get_width(
        ) / 2
        transform.position.y = 320
コード例 #13
0
    def update_text(self, new):
        if self.text_entity != None:
            self.world.delete_entity(self.text_entity)
            self.text_entity = None
        
        self.text_entity = self.world.create_entity_with(*loader.load("entity", "ui/overworld/arrow_text")[0])
        
        transform = self.world.component_for_entity(self.text_entity, Transform)

        transform.position.x = self.transform.position.x + 16
        transform.position.y = self.transform.position.y + 18

        self.world.remove_component(self.text_entity, Sprite)
        
        new_sprite = Sprite.new_text(str(new), (255, 255, 255), 14)

        self.world.add_component(self.text_entity, new_sprite)
コード例 #14
0
    def update(self, dt):
        self.timer += dt

        if self.timer >= constants.BOMB_TIME:
            self.world.delete_entity(self.entity)

            explosion = self.world.create_entity_with(
                *loader.load("entity", "explosion")[0])
            sprite = self.world.component_for_entity(explosion, Sprite)
            transform = self.world.component_for_entity(explosion, Transform)

            transform.position.x = (self.transform.position.x + 16) - (
                sprite.frame_width * transform.scale.x) / 2
            transform.position.y = (self.transform.position.y + 16) - (
                sprite.frame_height * transform.scale.y) / 2

            self.world.component_for_entity(
                explosion,
                ScriptComponent).script.damage_data = self.damage_data
コード例 #15
0
    def do_gen(self):
        for went in self.world.get_all_entities():
            if went == self.entity:
                continue

            if self.world.has_component(went, Tag):
                tag = self.world.component_for_entity(went, Tag)
                if not "system" in tag.tags:
                    self.world.delete_entity(went)
            else:
                self.world.delete_entity(went)

        for components in loader.load("entity", "OVERWORLD"):
            self.world.create_entity_with(*components)

        ld = loader.load_entities_into("loading", self.world)
        self.world.add_component(ld,
                                 ScriptComponent(LoadScript(self.generate())))

        pygame.mixer.Sound(paths.SOUNDS + "player/climb.wav").play()
コード例 #16
0
    def setup_bow(self):
        self.bow_entity = self.player.world.create_entity_with(
            *loader.load("entity", "bow")[0])

        animation = self.player.world.component_for_entity(
            self.bow_entity, AnimationSets)
        script = self.player.world.component_for_entity(
            self.bow_entity, ScriptComponent)
        transform = self.player.world.component_for_entity(
            self.bow_entity, Transform)

        dir = self.player.facer.get_dir()
        if dir == None:
            dir = Direction.DOWN

        script.script.damage_data = self.player.data.get_bow_damage(dir)
        script.script.player = self.player

        dir = self.player.facer.get_dir()

        if dir == Direction.UP:
            transform.position.x = self.player.transform.position.x
            transform.position.y = self.player.transform.position.y
            transform.layer = 9
            animation.current = "up"
            script.script.dir = Direction.UP
        elif dir == Direction.LEFT:
            transform.position.x = self.player.transform.position.x - 8
            transform.position.y = self.player.transform.position.y
            animation.current = "left"
            script.script.dir = Direction.LEFT
        elif dir == Direction.RIGHT:
            transform.position.x = self.player.transform.position.x + self.player.sprite.bounds.width + 4
            transform.position.y = self.player.transform.position.y
            animation.current = "right"
            script.script.dir = Direction.RIGHT
        else:
            transform.position.x = self.player.transform.position.x
            transform.position.y = self.player.transform.position.y + self.player.sprite.bounds.height
            animation.current = "down"
            script.script.dir = Direction.DOWN
コード例 #17
0
    def generate(self):
        # TODO
        gen = Generator(32, 32)
        basicmap = gen.create_dungeon()
        yield
        tilemap = [0 for i in range(len(basicmap))]
        for y in range(0, 32):
            for x in range(0, 32):
                if gen.get_tile(x, y) == 1:
                    tilemap[x + y * 32] = -1
                    continue
                n = gen.get_tile(x, y - 1)
                ne = gen.get_tile(x + 1, y - 1)
                e = gen.get_tile(x + 1, y)
                se = gen.get_tile(x + 1, y + 1)
                s = gen.get_tile(x, y + 1)
                sw = gen.get_tile(x - 1, y + 1)
                w = gen.get_tile(x - 1, y)
                nw = gen.get_tile(x - 1, y - 1)
                sprite_number = 0
                if n == 0:
                    sprite_number += 1
                if ne == 0:
                    sprite_number += 2
                if e == 0:
                    sprite_number += 4
                if se == 0:
                    sprite_number += 8
                if s == 0:
                    sprite_number += 16
                if sw == 0:
                    sprite_number += 32
                if w == 0:
                    sprite_number += 64
                if nw == 0:
                    sprite_number += 128

                tilemap[x + y * 32] = tilemappings.get(sprite_number)

            yield

        populator = Populator(tilemap, 32, 32)
        tilemap = populator.populate(5, True)

        yield

        tile_mappings = loader.load("data", "tiles")

        for y in range(0, 32):
            for x in range(0, 32):
                tile_type = type(tilemap[x + y * 32])
                if tile_type == int:
                    if tilemap[x + y * 32] > -1:
                        collision = CollisionComponent(
                            size=pygame.math.Vector2(16, 16), solid=True)
                        sprite = loader.load("sprite", "bricks")
                        transform = Transform(position=pygame.math.Vector2(
                            x * 16 * 2, y * 16 * 2),
                                              scale=pygame.math.Vector2(2, 2))
                        sprite.start = tilemap[x + y * 32]
                        sprite.end = sprite.start + 1

                        self.world.create_entity_with(collision, sprite,
                                                      transform)
                else:
                    chance_list = tile_mappings[tilemap[x + y * 32]]
                    weights = list(
                        map(lambda x: x.get('chance', 1), chance_list))
                    choice = random.choices(chance_list, weights)
                    entity_path = choice[0]['entity']
                    entities = loader.load("entity", entity_path)

                    for components in entities:
                        for component in components:
                            if type(component) == Transform:
                                component.position.x = x * 16 * 2
                                component.position.y = y * 16 * 2
                                component.scale.x = 2
                                component.scale.y = 2

                        self.world.create_entity_with(*components)

            yield

        floor_sprite = loader.load("sprite", "tiles/floor").repeated(32, 32)
        floor_transform = Transform(scale=pygame.math.Vector2(2, 2), layer=-1)
        self.world.create_entity_with(floor_sprite, floor_transform)

        yield

        self.event_bus.send.append(
            Event(
                {
                    'type': CameraEventType.SET_BOUNDS,
                    'x': 0,
                    'y': 0,
                    'width': 16 * 2 * 32,
                    'height': 16 * 2 * 32 + 80
                }, EventType.CAMERA))

        self.event_bus.send.append(
            Event(
                {
                    'type': MusicEventType.PLAY,
                    'path': "background/background",
                    'id': constants.MUSIC_BG
                }, EventType.MUSIC))

        raise StopIteration
コード例 #18
0
def main():
    print("Hello from your game's main()")
    print(loader.load("sample.txt").read())

    pygame.init()
    pygame.freetype.init()

    pygame.display.set_caption("Amazing Game 10/10")  # changes name of pygame window

    screen = pygame.display.set_mode((width, height))
    clock = pygame.time.Clock()

    manager = pygame_gui.UIManager((width, height))

    newspaper = popups.Newspaper(
        "Ant Colony Overruns Granary! City Officials Scramble."
    )

    food = 50
    population = 50
    territory = 50

    # creates the Resources object, which can be accessed from anywhere as Resources.instance
    Resources(manager, food, population, territory)

    # example decisions
    theft_decision = events.Decision("theft")
    theft_decision.text = (
        "An ant was found stealing from the colony's food supply! How do you respond?"
    )
    theft_decision.options = ["Banish the ant", "Do nothing"]
    theft_decision.outcomes = [
        "Angry at your decision, several of the banished ant's friends leave with them",
        "Seeing there are no conequences, more ants begin to steal food",
    ]
    theft_decision.impacts = [[0, -5, 0], [-10, 0, 0]]
    theft_decision.ready()  # builds the UI stuff

    war_decision = events.Decision("war")
    war_decision.text = "The beetles have been encroaching on your territory recently. Should we go to war to teach them a lesson?"
    war_decision.options = ["Yes, war!", "No, peace"]
    war_decision.outcomes = [
        "Your soldiers attack the beetles, sucessfully pushing them back and gaining territory. You do face some losses though",
        "The beetles continue to take your land",
    ]
    war_decision.impacts = [[0, -10, 5], [0, 0, -20]]
    war_decision.ready()  # builds the UI stuff


    #example events
    spoiled_food_event = events.Event("spoiled food")
    spoiled_food_event.text = (
        "Some food in storage has spoiled!"
    )
    spoiled_food_event.impacts = [-5, 0, 0]
    spoiled_food_event.ready()

    new_land_event = events.Event("new land")
    new_land_event.text = (
        "Your scouts have found some new uninhabitaded land!"
    )
    new_land_event.impacts = [0, 0, 5]
    new_land_event.ready()

    event_queue = [war_decision, spoiled_food_event, newspaper, theft_decision, new_land_event]

    current_decision = event_queue.pop(0)
    # displayDecision(manager, decision_textbox, decision_buttons, current_decision)

    image = pygame.image.load (loader.filepath("Queen's room.png"))
    image = pygame.transform.scale(image,(1280,720))

    sounds = Sound.Sound(manager, width, height)
    sounds.displayVolumeButton()
    sounds.playMusic()
                                                       
    while True:
        
        time_delta = clock.tick(60) / 1000

        if sounds.volumeButton.check_pressed() and sounds.slidesDisplayed == False:
            sounds.displayVolumeSlides()
        if sounds.volumeButton.check_pressed() and sounds.slidesDisplayed:
            sounds.killVolumeSlides()
            sounds.displayVolumeButton()
        if sounds.slidesDisplayed:
            sounds.updateVolume()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                raise SystemExit

            if event.type == pygame.USEREVENT:
                pass

            manager.process_events(event)
            current_decision.process_events(event, sounds)

        manager.update(time_delta)

        screen.fill(bgcolor)
        screen.blit(image,(0,0))

        if current_decision.display(time_delta):
            if len(event_queue) > 0:
                current_decision = event_queue.pop(0)
            else:
                current_decision = events.NoDecision()
                print("no more decisions")

        manager.draw_ui(screen)

        pygame.display.flip()
コード例 #19
0
    def update(self, dt):
        for event in self.event_bus.get_events():
            if event.ty == EventType.MUSIC:
                if event.data['type'] == MusicEventType.PLAY:
                    if self.cur_slot == None or event.data[
                            'id'] != self.cur_slot.id:
                        info = loader.load("music", event.data['path'])
                        self.cur_slot = MusicSlot(
                            event.data['id'], info,
                            event.data.get('lifetime', None))
                        self.cur_slot.play()
                    elif self.cur_slot != None and event.data[
                            'id'] == self.cur_slot.id:
                        if event.data.get('lifetime', None) != None:
                            self.cur_slot.lifetime = event.data.get(
                                'lifetime', None)

                elif event.data['type'] == MusicEventType.PUSH:
                    if self.cur_slot == None or event.data[
                            'id'] != self.cur_slot.id:
                        info = loader.load("music", event.data['path'])
                        if self.cur_slot != None:
                            self.cur_slot.stamp = pygame.mixer.music.get_pos()

                        self.cur_slot = MusicSlot(
                            event.data['id'], info,
                            event.data.get('lifetime', None), self.cur_slot)
                        self.cur_slot.play()
                    elif self.cur_slot != None and event.data[
                            'id'] == self.cur_slot.id:
                        if event.data.get('lifetime', None) != None:
                            self.cur_slot.lifetime = event.data.get(
                                'lifetime', None)

                elif event.data['type'] == MusicEventType.POP:
                    self.stopping = True
                    if event.data.get('fade', False):
                        pygame.mixer.music.fadeout(event.data['fade_time'])
                    else:
                        pygame.mixer.music.stop()

                    if self.cur_slot != None:
                        self.cur_slot = self.cur_slot.prev
                        if self.cur_slot != None:
                            self.cur_slot.play()

                            if self.cur_slot.stamp != None:
                                pygame.mixer.music.rewind()
                                pygame.mixer.music.set_pos(
                                    self.cur_slot.stamp / 1000)

                elif event.data['type'] == MusicEventType.CLEAR:
                    pygame.mixer.music.stop()
                    self.cur_slot = None

            elif event.ty == EventType.PYGAME:
                if event.data.type == 32:
                    if self.cur_slot != None and not self.stopping:
                        self.cur_slot.next()
                        self.cur_slot.play()

        if self.stopping:
            self.stop_counter -= dt
            if self.stop_counter <= 0:
                self.stopping = False
                self.stop_counter = 1
        else:
            self.stop_counter = 1

        if self.cur_slot != None and self.cur_slot.lifetime != None:
            self.cur_slot.lifetime -= dt

            if self.cur_slot.lifetime <= 0:
                self.event_bus.send.append(
                    Event({
                        'type': MusicEventType.POP,
                        'id': self.cur_slot.id
                    }, EventType.MUSIC))