예제 #1
0
def draw_dungeon_layer(g_obj, name, wmap=None):
    dung = g_obj.dungeon

    for room in dung.get_rooms():
        gx, gy = room.grid_pos

        tw, th = room.tilesets.tw, room.tilesets.th

        rw, rh = g_obj.rw, g_obj.rh
        raw, rah = rw * tw, rh * th

        rx, ry = gx * raw, gy * rah

        sw, sh = g_obj.w, g_obj.h

        buffer = max((2 * tw, 2 * th))
        screen_rect = Rect(-buffer, -buffer, sw + buffer * 2, sh + buffer * 2)

        ox, oy = g_obj.cam.get()

        room_rect = Rect(rx + ox, ry + oy, raw, rah)
        # print(room_rect.topleft)

        if not (screen_rect.colliderect(room_rect)):
            continue

        layer = room.layout.get_layer(name)

        in_this_room = dung.get_room().room_id == room.room_id

        x, y = ox, oy
        nx, ny = 0, 0

        mw, mh = room.layout.w, room.layout.h

        somesurf_red = g_obj.nwsurf
        somesurf_green = g_obj.wsurf

        for tx, ty, n in product(range(mw), range(mh),
                                 room.layout.layers.keys()):
            if n != name:  # draw only specified layer
                continue
            tile_index = room.layout.get_tile_index(n, tx, ty)
            if tile_index == None:  # transparent tile
                continue
            tile = room.tilesets.get_tile(*tile_index)
            x, y = tx * tw + ox + rx, ty * th + oy + ry
            cr = Rect(x, y, tw, th)
            if not screen_rect.colliderect(cr):
                continue
            # g_obj.swin.blit(tile.image, (x, y))
            tx, ty = tx + rw, ty + rh
            if wmap != None:
                if 0 <= tx < len(wmap) and 0 <= ty < len(wmap[0]):
                    walkable = wmap[tx][ty]
                    if walkable:
                        g_obj.swin.blit(somesurf_green, (x, y))
                    else:
                        g_obj.swin.blit(somesurf_red, (x, y))
예제 #2
0
def draw_dungeon_nlayers(g_obj, nlayers):
    rl = g_obj.renderlogic

    pre = rl.prerendered

    pr = pre.rooms

    dung = g_obj.dungeon

    for room in dung.get_rooms():
        gx, gy = room.grid_pos

        tw, th = room.tilesets.tw, room.tilesets.th

        rw, rh = g_obj.rw, g_obj.rh
        raw, rah = rw * tw, rh * th

        ox, oy = g_obj.cam.get()

        rx, ry = gx * raw + ox, gy * rah + oy

        sw, sh = g_obj.w, g_obj.h

        buffer = max((2 * tw, 2 * th))
        screen_rect = Rect(-buffer, -buffer, sw + buffer * 2, sh + buffer * 2)

        room_rect = Rect(rx, ry, raw, rah)
        # print(room_rect.topleft)

        if not (screen_rect.colliderect(room_rect)):
            continue

        in_this_room = dung.get_room().room_id == room.room_id

        x, y = ox, oy
        nx, ny = 0, 0

        mw, mh = room.layout.w, room.layout.h

        floors_img = pr[room.room_id][nlayers]

        g_obj.swin.blit(floors_img, (rx, ry))
예제 #3
0
def prerender_room(g_obj, room, layers):
    rw, rh = g_obj.rw, g_obj.rh
    tw, th = g_obj.tw, g_obj.th
    sw, sh = tw * rw, th * rh
    new_surf = pygame.Surface((sw, sh), flags=pygame.HWSURFACE)
    new_surf.set_colorkey((0, 0, 0))
    new_surf.fill((0, 0, 0))
    for name in layers:
        dung = g_obj.dungeon

        gx, gy = room.grid_pos

        tw, th = room.tilesets.tw, room.tilesets.th

        # rw, rh = g_obj.rw, g_obj.rh
        # raw, rah = rw * tw, rh * th

        # rx, ry = gx * raw, gy * rah

        sw, sh = g_obj.w, g_obj.h

        buffer = max((2 * tw, 2 * th))
        screen_rect = Rect(-buffer, -buffer, sw + buffer * 2, sh + buffer * 2)

        ox, oy = 0, 0

        # room_rect = Rect(rx+ox, ry+oy, raw, rah)

        # layer = room.layout.get_layer(name)

        # in_this_room = dung.get_room().room_id == room.room_id

        # x, y = ox, oy
        # nx, ny = 0, 0

        mw, mh = room.layout.w, room.layout.h

        for tx, ty, n in product(range(mw), range(mh),
                                 room.layout.layers.keys()):
            if n != name:  # draw only specified layer
                continue
            tile_index = room.layout.get_tile_index(n, tx, ty)
            tile_orient = room.layout.get_tile_orient(n, tx, ty)
            if tile_index == None:  # transparent tile
                continue
            tile = room.tilesets.get_tile(*tile_index)
            x, y = tx * tw + ox, ty * th + oy
            cr = Rect(x, y, tw, th)
            if not screen_rect.colliderect(cr):
                continue
            img = tile.image
            if tile_orient[0] == 1:
                img = pygame.transform.flip(img, 1, 0)
            if tile_orient[1] == 1:
                img = pygame.transform.flip(img, 0, 1)
            if tile_orient[2] == 1:
                # img = pygame.transform.flip(img, 1, 1)
                img = pygame.transform.rotate(img, 270)

            # img = tile.image
            new_surf.blit(img, (x, y))

    return new_surf
예제 #4
0
def lighting_pass_old(g_obj):
    dung = g_obj.dungeon

    for room in dung.get_rooms():
        gx, gy = room.grid_pos

        tw, th = room.tilesets.tw, room.tilesets.th

        rw, rh = g_obj.rw, g_obj.rh
        raw, rah = rw * tw, rh * th

        rx, ry = gx * raw, gy * rah

        sw, sh = g_obj.w, g_obj.h

        buffer = max((2 * tw, 2 * th))
        screen_rect = Rect(-buffer, -buffer, sw + buffer * 2, sh + buffer * 2)

        ox, oy = g_obj.cam.get()

        room_rect = Rect(rx + ox, ry + oy, raw, rah)
        # print(room_rect.topleft)

        if not (screen_rect.colliderect(room_rect)):
            continue

        in_this_room = dung.get_room().room_id == room.room_id

        x, y = ox, oy
        nx, ny = 0, 0

        mw, mh = room.layout.w, room.layout.h

        tindx_x_l = [8, 9, 10, 11, 12, 13, 14, 15]
        tindx_y = 9

        torches = []

        for tx, ty, n in product(range(mw), range(mh),
                                 room.layout.layers.keys()):
            add_torch = False
            if n == "Torches":
                tile_index = room.layout.get_tile_index(n, tx, ty)
                if tile_index != None:  # transparent tile
                    tile = room.tilesets.get_tile(*tile_index)
                    tilex, tiley = tile_index[1:]
                    # print(tilex, tiley)
                    if tindx_y == tiley and tilex in tindx_x_l:
                        add_torch = True

            x, y = tx * tw + ox + rx, ty * th + oy + ry
            cr = Rect(x, y, tw, th)
            if not screen_rect.colliderect(cr):
                continue
            if not in_this_room:
                g_obj.swin.blit(g_obj.darktile, (x, y))

            if add_torch:
                torches.append((x, y))

        td = 6

        wtr = td
        htr = td

        tcx, tcy = 2.5, 2.5

        for t in torches:
            for xtr, ytr in product(range(wtr), range(htr)):
                if not in_range((tcx, tcy), (xtr, ytr), int(td / 2)):
                    continue
                dist = get_distance((tcx, tcy), (xtr, ytr))
                xt, yt = t[0] + (xtr - tcx) * tw, t[1] + (ytr - tcy) * th
                intensity = 0
                for i in range(3):
                    if i > dist:
                        break
                    intensity += 1
                tseed = (t[0], t[1])
                tintensity = g_obj.renderlogic.torches.get_torch_intensity(
                    tseed)
                g_obj.lighttile.set_alpha(
                    int((60 - intensity * 20) * tintensity))
                g_obj.swin.blit(g_obj.lighttile, (xt, yt))
예제 #5
0
def lighting_pass(g_obj):
    dung = g_obj.dungeon

    for room in dung.get_rooms():
        gx, gy = room.grid_pos

        tw, th = room.tilesets.tw, room.tilesets.th

        rw, rh = g_obj.rw, g_obj.rh
        raw, rah = rw * tw, rh * th

        rx, ry = gx * raw, gy * rah

        sw, sh = g_obj.w, g_obj.h

        buffer = max((2 * tw, 2 * th))
        screen_rect = Rect(-buffer, -buffer, sw + buffer * 2, sh + buffer * 2)

        ox, oy = g_obj.cam.get()

        room_rect = Rect(rx + ox, ry + oy, raw, rah)
        # print(room_rect.topleft)

        if not (screen_rect.colliderect(room_rect)):
            continue

        in_this_room = dung.get_room().room_id == room.room_id

        x, y = ox, oy
        nx, ny = 0, 0

        mw, mh = room.layout.w, room.layout.h

        if not in_this_room:
            g_obj.swin.blit(g_obj.renderlogic.prerendered.darkness,
                            (rx + ox, ry + oy))

        tindx_x_l = [8, 9, 10, 11, 12, 13, 14, 15]
        tindx_y = 9

        torches = []

        for tx, ty, n in product(range(mw), range(mh),
                                 room.layout.layers.keys()):
            add_torch = False
            if n == "Torches":
                tile_index = room.layout.get_tile_index(n, tx, ty)
                if tile_index != None:  # transparent tile
                    # tile = room.tilesets.get_tile(*tile_index)
                    tilex, tiley = tile_index[1:]
                    # print(tilex, tiley)
                    if tindx_y == tiley and tilex in tindx_x_l:
                        add_torch = True
            x, y = tx * tw + ox + rx, ty * th + oy + ry
            if add_torch:
                torches.append((x, y))

        for t in torches:
            xt, yt = t
            tseed = (t[0], t[1])
            tintensity = g_obj.renderlogic.torches.get_torch_intensity(tseed)

            actual_intensity = int(tintensity * 60)

            torch_img = g_obj.renderlogic.prerendered.torches[actual_intensity]

            g_obj.swin.blit(torch_img, (int(xt - tw * 2.5), int(yt - th * 2)))