void _drawLight(light *lght) { int x, y; int distMod; TCOD_console_t itemConsole = getItemConsole(); drawChar(itemConsole, lght->x, lght->y, (int)'i', TCOD_color_RGB(255, 255, 155), TCOD_color_RGB(0, 0, 0)); for (y = lght->y - 64; y < lght->y + 64; y++) { for (x = lght->x - 64; x < lght->x + 64; x++) { if (TCOD_map_is_in_fov(lght->fov, x, y)) { distMod = 64 - distanceFloat(lght->x, lght->y, x, y); lightMap[x][y] = (int)distMod; } } } }
bool TCODMap::isInFov(int x, int y) const { return TCOD_map_is_in_fov(data,x,y) != 0; }
void _drawDynamicLight(light *lght) { int x, y, penalty, r_tint, g_tint, b_tint; float distMod, alpha; character *player = getPlayer(); TCOD_map_t levelMap = getLevelMap(); if (!lght->lightMap) { return; } TCOD_map_clear(lght->lightMap, 0, 0); if (!lght->fuel) { return; } for (y = lght->y - 32; y < lght->y + 32; y++) { for (x = lght->x - 32; x < lght->x + 32; x++) { if (x < 0 || x >= WINDOW_WIDTH || y < 0 || y >= WINDOW_HEIGHT) { continue; } if (TCOD_map_is_in_fov(lght->fov, x, y)) { if (lght->fuel < lght->size) { penalty = lght->size - lght->fuel; } else { penalty = 0; } distMod = lght->size - (distanceFloat(lght->x, lght->y, x, y) + penalty); if (distMod <= 0) { TCOD_map_set_properties(lght->lightMap, x, y, 0, 0); } else { TCOD_map_set_properties(lght->lightMap, x, y, 1, 1); } if (isPositionWalkable(x, y)) { distMod -= getRandomFloat(0, lght->flickerRate); } if (distMod < 0) { distMod = 0; } else if (distMod > lght->size / 2) { distMod = lght->size / 2; } alpha = (distMod / (float) lght->size); alpha *= lght->sizeMod; if (lght->noTint) { r_tint = 1; g_tint = 1; b_tint = 1; } else { if (!TCOD_map_is_walkable(levelMap, x, y)) { r_tint = 55 + RED_SHIFT; g_tint = 55; b_tint = 55; if (alpha > .45) { alpha = .45; } } else { r_tint = lght->r_tint + RED_SHIFT; g_tint = lght->g_tint; b_tint = lght->b_tint; alpha = clipFloat(alpha, 0, lght->brightness); } } if (!player || TCOD_map_is_in_fov(player->fov, x, y)) { drawCharBackEx(DYNAMIC_LIGHT_CONSOLE, x, y, TCOD_color_RGB(r_tint, g_tint, b_tint), TCOD_BKGND_ADDALPHA(alpha)); } } } } }
/* The main game loop */ void play(void) { int playing = 1; int x, y, vpx, vpy; /* A messy way to do the map, works for now */ map_t *map = map_new(50, 50); generate_cave(map); map_fov_build(map); /* Set up the offscreen consoles */ map_layer = TCOD_console_new(ui_viewport_width, ui_viewport_height); psion_layer = TCOD_console_new(ui_viewport_width, ui_viewport_height); TCOD_console_set_key_color(psion_layer, C_KEY); bgcolor(psion_layer, C_KEY); /* Set up the player */ init_player(); rename_player("Gu the Cabeboy"); blink_player(map); /* Initialize the inventory */ /* Enter the main game loop! */ while (playing) { /* Prepare the screen for drawing */ clear(NULL); /* Calculate the position of the viewport */ vpx = player->x - ui_viewport_width/2 > 0 ? player->x - ui_viewport_width/2 : 0; vpy = player->y - ui_viewport_height/2 > 0 ? player->y - ui_viewport_height/2 : 0; if ((vpx + ui_viewport_width) > map->width) { vpx = map->width - ui_viewport_width; } if ((vpy + ui_viewport_height) > map->height) { vpy = map->height - ui_viewport_height; } if (ui_viewport_width > map->width) { vpx = 0; } if (ui_viewport_height > map->height) { vpy = 0; } /* Calculate the field of view */ map_fov_do(map, player->x, player->y); /* Only display the part of the map inside the viewport */ for (y = 0; y < ui_viewport_height; y++) { for (x = 0; x < ui_viewport_width; x++) { if (((vpy+y) < map->height) && ((vpx+x) < map->width)) { tile_t *tile = tile_at(map, vpx+x, vpy+y); if (TCOD_map_is_in_fov(map->fov, vpx+x, vpy+y)) { fgcolor(map_layer, tile->fg_lit); } else { fgcolor(map_layer, tile->fg_dark); } putch(map_layer, x, y, tile->glyph); } } } TCOD_console_blit(map_layer, 0, 0, ui_viewport_width, ui_viewport_height, NULL, ui_viewport_x, ui_viewport_y, 255); /* Draw the player and status */ fgcolor(NULL, C_WHITE); putch(NULL, ui_viewport_x+player->x-vpx, ui_viewport_y+player->y-vpy, '@'); fgcolor(NULL, C_MSG); putstr(NULL, 1, 23, player->name); /* Redraw the screen */ update(); /* Handle keypress */ TCOD_key_t k = getkey(); if (k.c == 0) { switch (k.vk) { /* Move around */ case TCODK_KP7: /* up left */ attempt_move(map, player->x-1, player->y-1); break; case TCODK_KP8: /* up */ case TCODK_UP: attempt_move(map, player->x, player->y-1); break; case TCODK_KP9: /* up right */ attempt_move(map, player->x+1, player->y-1); break; case TCODK_KP1: /* down left */ attempt_move(map, player->x-1, player->y+1); break; case TCODK_KP2: /* down */ case TCODK_DOWN: attempt_move(map, player->x, player->y+1); break; case TCODK_KP3: /* down right */ attempt_move(map, player->x+1, player->y+1); break; case TCODK_KP4: /* left */ case TCODK_LEFT: attempt_move(map, player->x-1, player->y); break; case TCODK_KP6: /* right */ case TCODK_RIGHT: attempt_move(map, player->x+1, player->y); break; /* View character summary */ case TCODK_TAB: character(); break; default: printf("%d %d\n", TCODK_TAB, k.vk); break; } } else { switch (k.c) { /* Quit the game */ case 'Q': playing = quit(); break; /* Open up the inventory */ case 'i': inventory(); break; /* View character summary */ case 'c': character(); break; /* Use scan ability */ case 's': psion_scan(map); break; default: break; } } } /* Clean up, the game is over */ map_destroy(map); }