summaryrefslogtreecommitdiffstats
path: root/src/demo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/demo.c')
-rw-r--r--src/demo.c151
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);
+ }
+}