Пример #1
0
    def newgame(self, level):
        logger.info("Starting new game...")

        self.window.flush()

        # for i in range(100):
        #     print(str(i) + ": " + self.generate_name("surname"))

        dungeon_cfg = load_cfg("Dungeon2")
        self.dungeon = DungeonGenerator(
            logger,
            dungeon_cfg
        )

        self.game_size = (
            dungeon_cfg["dungeon_size"][0] * 32,
            dungeon_cfg["dungeon_size"][1] * 32
        )

        self.space = pymunk.Space()

        self.dungeon.generate()

        self.spatial_hash = spatial.SpatialHash()
        for w in self.dungeon.walls:
            self.spatial_hash.insert_object_for_rect(
                w.p1,
                w.p2,
                w
            )
        for c in self.dungeon.collidable:
            self.spatial_hash.insert_object_for_rect(
                c.p1,
                c.p2,
                c
            )

        logger.info("Generating dungeon graphics...")
        img_grid = self.dungeon.get_tilemap()

        grid_to_image(
            img_grid, "dungeon", self.game_size
        )

        dungeon_texture = self.window.load_single_texture(
            "dungeon"
        )
        dungeon_overlay_texture = self.window.load_single_texture(
            "dungeon_overlay"
        )

        self.dungeon_sprite = pyglet.sprite.Sprite(
                dungeon_texture,
                x=0, y=0,
                batch=self.window.batches["dungeon"]
            )
        self.dungeon_overlay_sprite = pyglet.sprite.Sprite(
                dungeon_overlay_texture,
                x=0, y=0,
                batch=self.window.batches["dungeon_overlay"]
            )

        logger.info("Done.")

        start = self.window.grid_to_window(*self.dungeon.startroom.center)
        # self.tiles = tiles.TiledRenderer(self.window, level)
        self.spawn_player(start)

        # Add a static square for every dungeon wall
        for w in self.dungeon.walls:
            body = pymunk.Body()
            body.position = w.center
            box_points = [(-16, -16), (-16, 16), (16, 16), (16, -16)]
            shape = pymunk.Poly(body, box_points, (0, 0))
            shape.group = 1
            self.space.add(shape)
            w.body = body
        for c in self.dungeon.collidable:
            body = pymunk.Body()
            body.position = c.center
            box_points = [(-16, -16), (-16, 16), (16, 16), (16, -16)]
            shape = pymunk.Poly(body, box_points, (0, 0))
            shape.group = 1
            self.space.add(shape)
            c.body = body

        # self.space.add_collision_handler(1, 1, post_solve=smack)
        self.space.damping = 0.001

        itemlist = items.L1_Sword(), items.L1_Armor(), items.L1_Ring()
        for i in itemlist:
            self.player.equip_item(i)
        self.player.update_stats()
        self.player.restore_stats()

        logger.info("Spawning enemies...")
        self.enemies = []
        for r in self.dungeon.enemy_rooms:
            for spawn in r.spawn_locations:
                x, y = self.window.grid_to_window(*spawn)
                self.add_enemy(x, y)

        i = 0
        for e in self.enemies:
            e.modifiers["str"] += i
            e.update_stats()
            e.reset()
            i += 3
        logger.info("Done.")

        if self.window.ui:
            self.window.ui.add_stats(
                self.player, 0, self.window.height, 120, 240
            )

        logger.info("Game successfully loaded.")
Пример #2
0
    def new_game(self, load=False):
        super().__init__()
        self.start_systems()
        # self.components = {}
        self.window.offset_x, self.window.offset_y = 640, 360
        # Create batches and load textures
        logger.info("Loading textures...")
        start = time.clock()
        self.batches = OrderedDict()
        self.load_textures()
        end = time.clock()
        logger.info("Done, {:.3f}s.".format(end - start))
        # Setup dungeon configuration
        logger.info("Building dungeon...")
        start = time.clock()
        dungeon_cfg = load_cfg("Dungeon2")
        self.dungeon = DungeonGenerator(
            logger,
            dungeon_cfg
        )

        self.game_size = (
            dungeon_cfg["dungeon_size"][0] * 32,
            dungeon_cfg["dungeon_size"][1] * 32
        )

        if load:
            self.dungeon.load("saved.json")
        else:
            self.dungeon.generate()
        end = time.clock()
        logger.info("Done, {:.3f}s.".format(end - start))

        if not load:
            self.dungeon.save("saved.json")

        logger.info("Generating dungeon graphics...")
        start = time.clock()
        if load:
            pass
        else:
            img_grid = self.dungeon.get_tilemap()

            grid_to_image(
                img_grid, "dungeon", self.game_size
            )

        dungeon_texture = self.load_single_texture(
            "dungeon"
        )
        dungeon_overlay_texture = self.load_single_texture(
            "dungeon_overlay"
        )

        self.bg = BG(self, dungeon_texture)
        self.fg = FG(self, dungeon_overlay_texture)
        self.bg.batch = Batch("dungeon")
        self.bg.batch.group = 0
        self.bg.position.set(0, 0)
        self.fg.batch = Batch("dungeon")
        self.fg.batch.group = 1
        self.fg.position.set(0, 0)
        end = time.clock()
        logger.info("Done, {:.3f}s.".format(end - start))

        # Make physical space for physics engine
        logger.info("Setup physics space...")
        start = time.clock()
        self.phys_space = pymunk.Space()
        self.phys_space.damping = 0.001
        end = time.clock()
        logger.info("Done, {:.3f}s.".format(end - start))

        # Add entities to the world
        logger.info("Spawning enemies...")
        start = time.clock()
        self.enemies = []
        for r in self.dungeon.enemy_rooms:
            for spawn in r.spawn_locations:
                x, y = spawn[0] * 32, spawn[1] * 32
                e = Enemy(self)
                e.position.set(x, y)
                self.enemies.append(e)
        end = time.clock()
        logger.info("Done, {:.3f}s.".format(end - start))

        logger.info("Generating wall rectangles...")
        start = time.clock()
        wall_rects = self.dungeon.wall_rects
        self.walls = []
        for w in wall_rects:
            p1, p2 = w
            x = (p1[0] * 32)
            y = (p1[1] * 32)
            w = p2[0] * 32 - p1[0] * 32 + 32
            h = p2[1] * 32 - p1[1] * 32 + 32
            # print(p1, p2, x, y, w, h)
            wa = Wall(self)
            wa.physbody = PhysBody(shape="square", width=w, height=h)
            wa.position.set(x, y)
            self.walls.append(wa)
        end = time.clock()
        logger.info("Done, {:.3f}s.".format(end - start))

        logger.info("Placing collidable items...")
        # self.collidable = []
        # for c in self.dungeon.collidable:
        #     print(c.p1)
        #     co = Wall(self)
        #     co.physbody = PhysBody(shape="square", width=32, height=32)
        #     co.position.set(*c.p1)
        #     self.collidable.append(co)

        logger.info("Spawning player...")
        self.spawn_player()
        # self.e = Enemy(self)
        # self.e.position.set(self.p.position.x + 32, self.p.position.y)
        # self.e.followtarget.who = self.p
        # self.e.lightsource = LightSource()

        self.viewlines = []