diff options
Diffstat (limited to 'src/demo.c')
-rw-r--r-- | src/demo.c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/src/demo.c b/src/demo.c new file mode 100644 index 0000000..24ebfc5 --- /dev/null +++ b/src/demo.c @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2013 Patrick "P. J." McDermott + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/>. + */ + +#include <SDL.h> +#include "logging.h" +#include "resources/image.h" +#include "resources/map.h" +#include "viewport.h" +#include "area.h" +#include "palettes.h" +#include "demo.h" + +#define DEMO() \ + do { \ + vp->x = x + map->tilewidth / 2 - vp->w / 2; \ + vp->y = y + map->tileheight / 2 - vp->h / 2; \ + /* \ + * See the following resources when computing realistic \ + * daylight cycles: \ + * * <https://en.wikipedia.org/wiki/Sunrise_equation> \ + * * <http://www.esrl.noaa.gov/gmd/grad/solcalc/sunrise.html>\ + */ \ + if (i % i_max < i_max / 6 * 2) { \ + /* 00:00 - 04:00 */ \ + t_max = i_max / 6 * 2; \ + pal_start = map->palettes[MAP_PALETTE_MORN] \ + .palette->palette; \ + pal_end = map->palettes[MAP_PALETTE_DAY] \ + .palette->palette; \ + } else if (i % i_max < i_max / 6 * 4) { \ + /* 04:00 - 12:00 */ \ + t_max = i_max / 6 * 2; \ + pal_start = map->palettes[MAP_PALETTE_DAY] \ + .palette->palette; \ + pal_end = map->palettes[MAP_PALETTE_EVE] \ + .palette->palette; \ + } else if (i % i_max < i_max / 6 * 5) { \ + /* 12:00 - 20:00 */ \ + t_max = i_max / 6 * 1; \ + pal_start = map->palettes[MAP_PALETTE_EVE] \ + .palette->palette; \ + pal_end = map->palettes[MAP_PALETTE_NIGHT] \ + .palette->palette; \ + } else { \ + /* 04:00 - 12:00 */ \ + t_max = i_max / 6 * 1; \ + pal_start = map->palettes[MAP_PALETTE_NIGHT] \ + .palette->palette; \ + pal_end = map->palettes[MAP_PALETTE_MORN] \ + .palette->palette; \ + } \ + if (!cycle_palettes_cosine(i, t_max, \ + pal_start, pal_end, pal)) { \ + warn("Failed to cycle palettes"); \ + } \ + set_area_palette(a, pal); \ + if (!SDL_SetPalette(vp->screen, SDL_LOGPAL, \ + pal->colors, 0, pal->ncolors)) { \ + warn("Failed to set palette"); \ + } \ + render_area_to_viewport(a, vp); \ + SDL_Flip(vp->screen); \ + SDL_Delay(10); \ + ++i; \ + } while (0) + +void +demo(void) +{ + struct viewport *vp; + struct map *map; + struct area *a; + SDL_Palette *pal; + struct map_exit *e; + + vp = init_viewport(320, 240, 8); + + map = map_get(MAPSDIR "/db16-route.tmx"); + if (map == NULL) { + map = map_get("data/maps/db16-route.tmx"); + } + if (map == NULL) { + err(1, "Where's the map, George?"); + } + pal = map->palettes[MAP_PALETTE_DAY].palette->palette; + if (!SDL_SetPalette(vp->screen, SDL_LOGPAL, pal->colors, + 0, pal->ncolors)) { + warn("Failed to set palette"); + } + a = area_new(map, vp->screen->format->palette); + + for (e = map->map_exits_head; e != NULL; e = e->next) { + debug("Map exit (size %dx%d) at (%d,%d) " + "to map %s (size %dx%d) at (%d,%d)", + e->width, e->height, + e->x, e->y, + e->target_map_name, + e->target_map->width, e->target_map->height, + e->target_x_coord, e->target_y_coord); + } + + /* Demo */ + { + Uint32 start, end; + int i, i_max, t_max; + int x, y; + SDL_Palette *pal_start, *pal_end; + + pal = malloc(sizeof(*pal)); + pal->colors = calloc(64, sizeof(*pal->colors)); + pal->ncolors = 64; + + i = 0; + i_max = 1440; + start = SDL_GetTicks(); + x = 9 * map->tilewidth ; + y = 58 * map->tileheight; + for (; y > 50 * map->tileheight; y -= 1) DEMO(); /* Up */ + for (; x < 12 * map->tilewidth ; x += 1) DEMO(); /* Right */ + for (; y > 43 * map->tileheight; y -= 1) DEMO(); /* Up */ + for (; x > 5 * map->tilewidth ; x -= 1) DEMO(); /* Left */ + for (; y > 32 * map->tileheight; y -= 1) DEMO(); /* Up */ + for (; x < 13 * map->tilewidth ; x += 1) DEMO(); /* Right */ + for (; y > 31 * map->tileheight; y -= 1) DEMO(); /* Up */ + for (; x < 16 * map->tilewidth ; x += 1) DEMO(); /* Right */ + for (; y < 34 * map->tileheight; y += 1) DEMO(); /* Down */ + for (; x < 24 * map->tilewidth ; x += 1) DEMO(); /* Right */ + for (; y > 15 * map->tileheight; y -= 1) DEMO(); /* Up */ + for (; x > 11 * map->tilewidth ; x -= 1) DEMO(); /* Left */ + for (; y > 5 * map->tileheight; y -= 1) DEMO(); /* Up */ + for (; x < 17 * map->tilewidth ; x += 1) DEMO(); /* Right */ + for (; y > 1 * map->tileheight; y -= 1) DEMO(); /* Up */ + end = SDL_GetTicks(); + debug("Rendered %d frames in %d milliseconds", i, end - start); + } +} |