summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/demo.c151
-rw-r--r--src/demo.h24
-rw-r--r--src/local.mk2
-rw-r--r--src/main.c142
4 files changed, 197 insertions, 122 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);
+ }
+}
diff --git a/src/demo.h b/src/demo.h
new file mode 100644
index 0000000..ca577dd
--- /dev/null
+++ b/src/demo.h
@@ -0,0 +1,24 @@
+/*
+ * 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/>.
+ */
+
+#ifndef DEMO_H
+#define DEMO_H
+
+void demo(void);
+
+#endif
diff --git a/src/local.mk b/src/local.mk
index 571b907..76b986d 100644
--- a/src/local.mk
+++ b/src/local.mk
@@ -7,6 +7,8 @@ sdlex_SOURCES += \
src/base64.h \
src/compression.c \
src/compression.h \
+ src/demo.c \
+ src/demo.h \
src/init.c \
src/init.h \
src/logging.c \
diff --git a/src/main.c b/src/main.c
index c4ec5ea..93ac007 100644
--- a/src/main.c
+++ b/src/main.c
@@ -16,138 +16,29 @@
* <http://www.gnu.org/licenses/>.
*/
-#include <SDL.h>
+#include <string.h>
+#include <stdio.h>
#include "init.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)
+static void usage(const char *program_name, FILE *stream);
int
-main(void)
+main(int argc, char **argv)
{
- struct viewport *vp;
- struct map *map;
- struct area *a;
- SDL_Palette *pal;
- struct map_exit *e;
+ const char *game;
- init();
- 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);
+ if (argc != 2) {
+ usage(argv[0], stderr);
+ exit(1);
}
+ game = argv[1];
- /* 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;
+ init();
- 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);
+ if (strcmp(game, "demo") == 0) {
+ demo();
}
quit(0);
@@ -155,3 +46,10 @@ main(void)
/* Control doesn't actually reach here. */
return 0;
}
+
+void
+usage(const char *program_name, FILE *stream)
+{
+ fprintf(stream, "Usage: %s <game>\n", program_name);
+ fputs("<game> can be \"demo\".\n", stream);
+}