#include #include #include "init.h" #include "logging.h" #include "resources/image.h" #include "resources/map.h" #include "viewport.h" #include "area.h" #define CYCLE_LINEAR(t_max, r1, g1, b1, r2, g2, b2) \ do { \ x = (double) t / (double) t_max; \ y_end = (i % 8) * 36; \ y_start = y_end * r1; \ y_end = y_end * r2; \ colors[i].r = x * (y_end - y_start) + y_start; \ y_end = (i % 64 / 8) * 36; \ y_start = y_end * g1; \ y_end = y_end * g2; \ colors[i].g = x * (y_end - y_start) + y_start; \ y_end = (i / 64) * 85; \ y_start = y_end * b1; \ y_end = y_end * b2; \ colors[i].b = x * (y_end - y_start) + y_start; \ } while (0) #define CYCLE_COS(t_max, r1, g1, b1, r2, g2, b2) \ do { \ x = t * 3.14159 / t_max; \ y_end = (i % 8) * 36; \ y_start = y_end * r2; \ y_end = y_end * r1; \ colors[i].r = ((cos(x) + 1) / 2) * \ (y_end - y_start) + y_start; \ y_end = (i % 64 / 8) * 36; \ y_start = y_end * g2; \ y_end = y_end * g1; \ colors[i].g = ((cos(x) + 1) / 2) * \ (y_end - y_start) + y_start; \ y_end = (i / 64) * 85; \ y_start = y_end * b2; \ y_end = y_end * b1; \ colors[i].b = ((cos(x) + 1) / 2) * \ (y_end - y_start) + y_start; \ } while (0) #define DEMO() \ do { \ vp->x = x + map->tilewidth / 2 - vp->w / 2; \ vp->y = y + map->tileheight / 2 - vp->h / 2; \ render_area_to_viewport(a, vp); \ SDL_Flip(vp->screen); \ SDL_Delay(10); \ ++i; \ } while (0) int main(void) { struct viewport *vp; struct map *map; struct area *a; SDL_Color colors[256]; int i; struct map_exit *e; init(); vp = init_viewport(240, 160, 8); map = map_get(MAPSDIR "/forest1-8bit.tmx"); if (map == NULL) { map = map_get("data/maps/forest1-8bit.tmx"); } if (map == NULL) { err(1, "Where's the map, George?"); } for (i = 0; i < 256; ++i) { colors[i].r = (i % 8) * 36; colors[i].g = (i % 64 / 8) * 36; colors[i].b = (i / 64) * 85; } if (!SDL_SetPalette(vp->screen, SDL_LOGPAL, colors, 0, 256)) { warn("Failed to set palette"); } a = area_new(map, vp); 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); } render_area_to_viewport(a, vp); { Uint32 d, t; double x; int y_start, y_end; for (d = 0; d < 4; ++d) { /* morn -> day */ for (t = 0; t < 360; t += 1) { for (i = 0; i < 256; ++i) { CYCLE_COS(360, 1.000, 0.875, 0.625, 1.000, 1.000, 1.000 ); } if (!SDL_SetPalette(vp->screen, SDL_LOGPAL, colors, 0, 256)) { warn("Failed to set palette"); } SDL_Flip(vp->screen); SDL_Delay(10); } /* day -> eve */ for (t = 0; t < 360; t += 1) { for (i = 0; i < 256; ++i) { CYCLE_COS(360, 1.000, 1.000, 1.000, 0.875, 0.625, 0.625 ); } if (!SDL_SetPalette(vp->screen, SDL_LOGPAL, colors, 0, 256)) { warn("Failed to set palette"); } SDL_Flip(vp->screen); SDL_Delay(10); } /* eve -> night */ for (t = 0; t < 360; t += 1) { for (i = 0; i < 256; ++i) { CYCLE_COS(360, 0.875, 0.625, 0.625, 0.250, 0.250, 0.500 ); } if (!SDL_SetPalette(vp->screen, SDL_LOGPAL, colors, 0, 256)) { warn("Failed to set palette"); } SDL_Flip(vp->screen); SDL_Delay(10); } /* night -> morn */ for (t = 0; t < 360; t += 1) { for (i = 0; i < 256; ++i) { CYCLE_COS(360, 0.250, 0.250, 0.500, 1.000, 0.875, 0.625 ); } if (!SDL_SetPalette(vp->screen, SDL_LOGPAL, colors, 0, 256)) { warn("Failed to set palette"); } SDL_Flip(vp->screen); SDL_Delay(10); } } } quit(0); /* Demo */ for (i = 0; i < 256; ++i) { colors[i].r = (i % 8) * 36; colors[i].g = (i % 64 / 8) * 36; colors[i].b = (i / 64) * 85; } if (!SDL_SetPalette(vp->screen, SDL_LOGPAL, colors, 0, 256)) { warn("Failed to set palette"); } { Uint32 start, end; int x, y; i = 0; start = SDL_GetTicks(); x = 19 * map->tilewidth ; y = 38 * map->tileheight; for (; y > 34 * map->tileheight; y -= 2) DEMO(); /* Up */ for (; x < 23 * map->tilewidth ; x += 2) DEMO(); /* Right */ for (; y > 16 * map->tileheight; y -= 2) DEMO(); /* Up */ for (; x > 15 * map->tilewidth ; x -= 2) DEMO(); /* Left */ for (; y < 25 * map->tileheight; y += 2) DEMO(); /* Down */ for (; x > 4 * map->tilewidth ; x -= 2) DEMO(); /* Left */ for (; y > 18 * map->tileheight; y -= 2) DEMO(); /* Up */ for (; x < 9 * map->tilewidth ; x += 2) DEMO(); /* Right */ for (; y > 5 * map->tileheight; y -= 2) DEMO(); /* Up */ for (; x < 15 * map->tilewidth ; x += 2) DEMO(); /* Right */ for (; y > 1 * map->tileheight; y -= 2) DEMO(); /* Up */ end = SDL_GetTicks(); debug("Rendered %d frames in %d milliseconds", i, end - start); } quit(0); /* Control doesn't actually reach here. */ return 0; }