Пример #1
0
class TheEnd(State):
    def __init__(self):
        State.__init__(self)
        self.bg_image = GLOBALS["backgrounds"]["the_end.png"]
        self.overlay = StaticWidget((638, 169))
        self.overlay.set_pos((2, 160))
        self.overlay.set_alpha(255)
        self.overlay.fill((0, 0, 0))
        self.wait = Timer(50)

    def main_start(self):
        pygame.mouse.set_visible(0)
        GLOBALS["jb"].stop()

    def update_screen(self):
        self.background.fill((0, 0, 0))
        self.background.blit(self.bg_image, (0, 0))

        if not self.wait.active:
            alpha = self.overlay.get_alpha()
            if alpha > 0:
                self.overlay.set_alpha(alpha - 10)
            if alpha < 20:
                self.add_kbevent(KEYDOWN, K_ESCAPE, self.quit)
        elif self.wait.update():
            self.wait.deactivate()

        self.overlay.draw(self.background)
        State.update_screen(self)
    def show_signet(self, clans):
        #show recently gained signet(s)
        self.cur_blending = []
        self.cur_blinking = []
        for clan in clans:
            #signet
            signet = self.signets[clan][0]
            blend = StaticWidget(signet.get_size())
            blend.fill((255, 0, 255))
            blend.set_colorkey((255, 0, 255))
            blend.blit(signet, (0, 0))
            blend.set_pos(self.signet_pos[clan])
            blend.set_alpha(0)
            self.cur_blending.append(blend)

            #green light
            img = self.light
            blink = StaticWidget(img.get_size())
            blink.fill((255, 0, 255))
            blink.set_colorkey((255, 0, 255))
            blink.blit(img, (0, 0))
            blink.set_pos(self.light_pos[clan])
            self.cur_blinking.append(blink)
            self.blink_timer.set_interval(3)
class Editor(State):
    def __init__(self):
        State.__init__(self)
        self.buttons = {}

        #tileset area
        self.tileset_area = StaticWidget((1020, 280))
        self.tileset_area.set_pos((2, 485))
        self.tileset_area.pos = (2, 485)
        ca = ClickArea(pygame.Rect([2, 485, 1024, 280]), self.choose_tiletype)
        self.widgets.append(ca)
        self.tileset_id = "ts_tileset"
        self.marked_type = None
        self.load_tileset()

        #set clan
        buttons = [
            "wood", "day", "fire", "life", "earth", "night", "metal", "water",
            "death"
        ]

        x, y = 900, 50
        for clan in buttons:
            btn = ImgButton(GLOBALS["signets"][clan][1], \
                self.set_clan, clan=clan)
            btn.set_pos((x, y))
            self.widgets.append(btn)
            self.buttons[clan] = btn
            btn.draw(self.background)
            y = y + btn.get_size()[1] + 5
        self.clan = "fire"

        #Camera
        self.camera = Camera(None)

        #load empty map
        self.filename = ""
        self.load_map(new=True)

        #map area
        self.map_area = StaticWidget((640, 480))
        self.map_area.set_pos((0, 0))
        self.map_area_rect = pygame.Rect([0, 0, 640, 480])
        self.widgets.append(ca)

        #grid overlay for map area
        w, h = self.map_area.get_size()
        self.grid = StaticWidget((w, h))
        self.grid.fill((255, 0, 255))
        self.grid.set_colorkey((255, 0, 255))
        self.grid.set_alpha(100)
        for row in xrange(h / tsize):
            for col in xrange(w / tsize):
                pygame.draw.line(self.grid, (255, 255, 255), (col * 32, 0),
                                 (col * 32, h))
                pygame.draw.line(self.grid, (255, 255, 255), (0, row * 32),
                                 (w, row * 32))
        self.grid.set_pos(self.map_area.get_pos())

        #buttons
        buttons = [(" NEW ", self.new_map), (" LOAD ", self.open_file),
                   (" SAVE AS ", self.save_file), (" SAVE ", self.save_map)]

        x, y = 650, 1
        for b in buttons:
            name, callback = b
            btn = ImgButton(TextLine(name), callback)
            btn.set_pos((x, y))
            btn.draw_border((255, 255, 255))
            self.widgets.append(btn)
            btn.draw(self.background)
            x = x + btn.get_size()[0] + 4

        #add objects
        buttons = [
            (" delete obj", "delete"),
            (" add start ", "start"),
            (" add exit ", "exit"),
            (" add enemy ", "enemy"),
            (" add dialog-trigger ", "dtrigger"),
        ]

        x, y = 650, 50
        for b in buttons:
            name, cmd = b
            btn = ImgButton(TextLine(name, fontsize=15), \
                self.select_add_object, cmd=cmd)
            btn.set_pos((x, y))
            self.widgets.append(btn)
            btn.draw(self.background)
            y = y + btn.get_size()[1] + 5
            self.buttons[cmd] = btn

        #TEST button :)
        btn = ImgButton(TextLine(" TEST ", fontsize=25), self.test)
        btn.set_pos((900, 420))
        btn.draw_border((255, 255, 255))
        self.widgets.append(btn)
        btn.draw(self.background)

        #keyboard events
        pygame.key.set_repeat(10, 20)

        #scroll map
        self.add_kbevent(KEYDOWN, K_UP, self.scroll_map, vy=-1)
        self.add_kbevent(KEYDOWN, K_DOWN, self.scroll_map, vy=1)
        self.add_kbevent(KEYDOWN, K_LEFT, self.scroll_map, vx=-1)
        self.add_kbevent(KEYDOWN, K_RIGHT, self.scroll_map, vx=1)

    def update_screen(self):
        #draw map
        self.lvl_layer.set_colorkey(None)
        self.lvl_layer.fill((255, 0, 255))
        self.lvl_layer.blit(self.lvl_img, (0, 0))
        self.lvl_layer.set_colorkey((255, 0, 255))
        self.map_area.fill((0, 0, 0))
        self.map_area.blit(self.lvl_layer, (0, 0),
                           area=[self.camera.pos, GLOBALS["screen_size"]])
        self.map_area.draw_border((255, 255, 255))

        #draw map area
        self.map_area.draw(self.background)
        self.grid.draw(self.background)

        State.update_screen(self)

    def test(self):
        self.save_map()
        if self.filename:
            self.pause()
            self.next = Level(self.filename, testing=True)
            self.quit()

    def set_clan(self, clan):
        #unmark previous selection
        self.buttons[self.clan].draw_border((0, 0, 0))
        self.buttons[self.clan].draw(self.background)
        #mark current selection
        self.clan = clan
        self.buttons[self.clan].draw_border((255, 255, 255))
        self.map["options"]["clan"] = self.clan
        self.buttons[self.clan].draw(self.background)

    def set_option(self, param):
        old_value = ""
        if self.map["options"].has_key(param):
            old_value = self.map["options"][param]

        entry = tkSimpleDialog.askstring(title="Set " + param,
                                         prompt="Enter " + param + ":",
                                         initialvalue=old_value)
        print param, ":", entry
        if entry is not None:
            self.map["options"][param] = entry

    def select_add_object(self, cmd):
        #dehighlight old button
        if self.buttons.has_key(self.marked_type):
            self.buttons[self.marked_type].draw_border((0, 0, 0))
            self.buttons[self.marked_type].draw(self.background)
        elif self.marked_type:
            self.mark_tile(None)  #deselect tile

        #highlight button
        self.buttons[cmd].draw_border((255, 255, 255))
        self.buttons[cmd].draw(self.background)
        self.marked_type = cmd

    def load_map(self, filename="", new=False):
        if not new:
            try:
                new_map = Map(filename)
            except:
                print "Could not load map"
                return
        else:
            new_map = Map()

        self.filename = filename
        pygame.display.set_caption(filename)
        self.map = new_map
        self.lvl_map = self.map["tilemap"]
        self.lvl_img, blocks = self.map.draw(editing=True)
        self.lvl_layer = pygame.Surface(self.lvl_img.get_size())
        self.camera.set_pos((0, tsize * 20))
        self.load_tileset(self.map["tset"])
        self.set_clan(self.map["options"]["clan"])

    def scroll_map(self, vx=0, vy=0):
        x, y = self.camera.pos
        self.camera.set_pos((x + vx * tsize, y + vy * tsize))

    def open_file(self):
        filename = tkFileDialog.askopenfilename(title="Open",
                                                initialfile=map_path)
        if filename:
            self.load_map(filename)

    def save_file(self):
        self.asksaveasfilename()
        if self.filename:
            self.save_map()

    def asksaveasfilename(self):
        filename = tkFileDialog.asksaveasfilename(title="Save as",
                                                  initialfile=map_path)
        if filename:
            self.filename = filename

    def save_map(self):
        if not self.filename:
            self.asksaveasfilename()
            if self.filename:
                self.map.save_map(path=self.filename)
        else:
            self.map.save_map(path=self.filename)

    def new_map(self):
        ok = tkMessageBox.askyesno(title="Just asking..",
                                   message="Really create a new map?")
        if ok:
            self.load_map(new=True)
            self.load_tileset()

    def choose_tiletype(self):
        x, y = pygame.mouse.get_pos()
        off_x, off_y = self.tileset_area.pos
        x, y = (x - off_x) / (tsize + 2), (y - off_y) / (tsize + 2)
        if GLOBALS[self.tileset_id].has_key((x, y)):
            self.mark_tile((x, y))

    def mark_tile(self, coord):
        def draw_tile_border(coord, color=(255, 255, 255)):
            x, y = coord[0] * (tsize + 2), coord[1] * (tsize + 2)
            r = pygame.Rect([x - 1, y - 1, tsize + 2, tsize + 2])
            pygame.draw.rect(self.tileset_area, color, r, 1)

        if self.marked_type:
            if GLOBALS[self.tileset_id].has_key(self.marked_type):
                draw_tile_border(self.marked_type, (0, 0, 0))
            elif self.buttons.has_key(self.marked_type):
                self.buttons[self.marked_type].draw_border((0, 0, 0))
                self.buttons[self.marked_type].draw(self.background)

        if coord:
            draw_tile_border(coord)
        self.marked_type = coord
        self.tileset_area.draw(self.background)

    def load_tileset(self, tset="tileset"):
        ts_id = "ts_" + tset
        if not GLOBALS.has_key(ts_id):
            ts_id = "ts_tileset"
        self.marked_type = None
        self.tileset_area.fill((0, 0, 0))
        self.tileset_id = ts_id
        tiles = GLOBALS[ts_id]
        keys = tiles.keys()
        keys.sort()
        for k in keys:
            x, y = k[0] * (tsize + 2), k[1] * (tsize + 2)
            self.tileset_area.blit(tiles[k], (x, y))
        self.tileset_area.draw(self.background)

    def check_collisions(self):
        #check if map was clicked -> put tiles on map
        mpos = pygame.mouse.get_pos()
        pressed = pygame.mouse.get_pressed()
        lbutton, rbutton = pressed[0], pressed[2]

        if not self.map_area_rect.collidepoint(mpos) or \
            (not rbutton and not (lbutton and self.marked_type)):
            return

        #calculate map coordinates
        off_x, off_y = self.camera.pos
        x, y = (mpos[0] + off_x) / tsize, (mpos[1] + off_y) / tsize

        #set tile info
        if rbutton and self.lvl_map.has_key((x, y)):
            self.lvl_map.pop((x, y))
        elif lbutton and GLOBALS[self.tileset_id].has_key(self.marked_type):
            #place tile
            self.lvl_map[x, y] = self.marked_type
        elif lbutton and self.buttons.has_key(self.marked_type):
            #place object
            if self.marked_type == "delete" and self.map["objects"].has_key(
                (x, y)):
                self.map["objects"].pop((x, y))
            else:
                params = None
                t = self.marked_type
                if t == "dtrigger":
                    params = tkSimpleDialog.askstring(
                        title="Set dialog id",
                        prompt="Enter dialog ID:",
                    )
                    if params is None:  #didn't want to add that trigger anyway
                        return
                    if not dialog.has_key(params):
                        print "Warning: Dialog id not found... just for your information. ^^"
                self.map["objects"][x, y] = (self.marked_type, params)

                if params:
                    self.mark_tile(None)

        self.lvl_img, blocks = self.map.draw(editing=True)
        self.lvl_layer = pygame.Surface(self.lvl_img.get_size())