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))
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))
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
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))
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)))