From 5f150901e1a62c6b06fb9497fb270adda304aa73 Mon Sep 17 00:00:00 2001 From: Steve Date: Mon, 12 Feb 2018 22:40:15 +0000 Subject: [PATCH] Radar map updates. --- src/defs.h | 3 + src/structs.h | 7 ++- src/system/draw.c | 15 +++++ src/test/atlasTest.c | 4 +- src/world/map.c | 10 ++-- src/world/map.h | 3 - src/world/radar.c | 135 +++++++++++++++++++++++++++++++++++++------ src/world/radar.h | 26 +++++++-- 8 files changed, 169 insertions(+), 34 deletions(-) diff --git a/src/defs.h b/src/defs.h index 43080af..1a8b4d3 100644 --- a/src/defs.h +++ b/src/defs.h @@ -61,6 +61,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define MAP_WIDTH 200 #define MAP_HEIGHT 200 +#define MAP_RENDER_WIDTH ((SCREEN_WIDTH / MAP_TILE_SIZE) + 1) +#define MAP_RENDER_HEIGHT ((SCREEN_HEIGHT / MAP_TILE_SIZE) + 1) + #define MAP_TILE_SIZE 64 #define MAP_TILE_AIR 0 #define MAP_TILE_WATER 1 diff --git a/src/structs.h b/src/structs.h index c1e5301..1d4a542 100644 --- a/src/structs.h +++ b/src/structs.h @@ -316,6 +316,8 @@ typedef struct { int musicVolume; int keyControls[CONTROL_MAX]; int joypadControls[CONTROL_MAX]; + int hudInventory; + int blood; } Config; typedef struct { @@ -367,8 +369,11 @@ typedef struct { struct Marker { Sprite *sprite; + float x, y; float value; - float y; + int angle; + int visible; + int type; Marker *next; }; diff --git a/src/system/draw.c b/src/system/draw.c index 81bffa0..e46739c 100644 --- a/src/system/draw.c +++ b/src/system/draw.c @@ -104,6 +104,21 @@ void blitRect(SDL_Texture *texture, int x, int y, SDL_Rect *srcRect, int center) SDL_RenderCopy(app.renderer, texture, srcRect, &dstRect); } +void blitRectRotated(SDL_Texture *texture, int x, int y, SDL_Rect *srcRect, float angle) +{ + SDL_Rect dstRect; + + dstRect.x = x; + dstRect.y = y; + dstRect.w = srcRect->w; + dstRect.h = srcRect->h; + + dstRect.x -= (srcRect->w / 2); + dstRect.y -= (srcRect->h / 2); + + SDL_RenderCopyEx(app.renderer, texture, srcRect, &dstRect, angle, NULL, SDL_FLIP_NONE); +} + void blitScaled(SDL_Texture *texture, int x, int y, int w, int h, int center) { SDL_Rect dstRect; diff --git a/src/test/atlasTest.c b/src/test/atlasTest.c index 8975a8c..0dd72ef 100644 --- a/src/test/atlasTest.c +++ b/src/test/atlasTest.c @@ -24,7 +24,7 @@ void initAtlasTest(void) { dev.cheatStatic = 0; dev.cheatBlind = 0; - dev.cheatNoEnemies = 0; + dev.cheatNoEnemies = 1; dev.cheatKeys = 1; dev.cheatPower = 1; dev.cheatHealth = 1; @@ -33,7 +33,7 @@ void initAtlasTest(void) initHub(); - loadWorld("beachApproach"); + loadWorld("beachFront1"); initWorld(); diff --git a/src/world/map.c b/src/world/map.c index 6ecbeee..f63bc61 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -57,11 +57,11 @@ void drawMap(void) mx = camera.x / MAP_TILE_SIZE; x1 = (camera.x % MAP_TILE_SIZE) * -1; - x2 = x1 + RENDER_WIDTH * MAP_TILE_SIZE + (x1 == 0 ? 0 : MAP_TILE_SIZE); + x2 = x1 + MAP_RENDER_WIDTH * MAP_TILE_SIZE + (x1 == 0 ? 0 : MAP_TILE_SIZE); my = camera.y / MAP_TILE_SIZE; y1 = (camera.y % MAP_TILE_SIZE) * -1; - y2 = y1 + RENDER_HEIGHT * MAP_TILE_SIZE + (y1 == 0 ? 0 : MAP_TILE_SIZE); + y2 = y1 + MAP_RENDER_HEIGHT * MAP_TILE_SIZE + (y1 == 0 ? 0 : MAP_TILE_SIZE); tile = 0; decal = 0; @@ -201,13 +201,13 @@ static void calculateMapBounds(void) } } - if (world.map.bounds.h - RENDER_HEIGHT < world.map.bounds.y) + if (world.map.bounds.h - MAP_RENDER_HEIGHT < world.map.bounds.y) { world.map.bounds.y = 0; } - world.map.bounds.x = (int) limit(world.map.bounds.x, 0, MAP_WIDTH - RENDER_WIDTH); - world.map.bounds.y = (int) limit(world.map.bounds.y, 0, MAP_HEIGHT - RENDER_HEIGHT); + world.map.bounds.x = (int) limit(world.map.bounds.x, 0, MAP_WIDTH - MAP_RENDER_WIDTH); + world.map.bounds.y = (int) limit(world.map.bounds.y, 0, MAP_HEIGHT - MAP_RENDER_HEIGHT); world.map.bounds.x *= MAP_TILE_SIZE; world.map.bounds.y *= MAP_TILE_SIZE; diff --git a/src/world/map.h b/src/world/map.h index e86c0ba..9fe3140 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -20,9 +20,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "../common.h" -#define RENDER_WIDTH ((SCREEN_WIDTH / MAP_TILE_SIZE) + 1) -#define RENDER_HEIGHT ((SCREEN_HEIGHT / MAP_TILE_SIZE) + 1) - extern float limit(float i, float a, float b); extern int rrnd(int low, int high); extern char *readCompressedFile(const char *filename); diff --git a/src/world/radar.c b/src/world/radar.c index 02eec9c..8ddaee8 100644 --- a/src/world/radar.c +++ b/src/world/radar.c @@ -27,35 +27,92 @@ static void drawMap(void); static void drawEntities(void); static int isValidBlip(Entity *e); static void getBlipColor(Entity *e, SDL_Color *c); +static void drawMarkers(void); +static void initMarker(int i, int x, int y, int angle, int type); static SDL_Rect viewRect; +static Texture *atlasTexture; +static Atlas *background; +static Atlas *arrow; +static int blinkTimer; +static Marker marker[M_MAX * 4]; void initRadar(void) { + SDL_Rect limits; + app.delegate.logic = logic; app.delegate.draw = draw; - viewRect.x = (world.bob->x / MAP_TILE_SIZE) - (VIEW_SIZE / 2); - viewRect.y = (world.bob->y / MAP_TILE_SIZE) - (VIEW_SIZE / 2); - viewRect.w = VIEW_SIZE; - viewRect.h = VIEW_SIZE; + viewRect.x = (world.bob->x / MAP_TILE_SIZE) - (VIEW_SIZE_X / 2); + viewRect.y = (world.bob->y / MAP_TILE_SIZE) - (VIEW_SIZE_Y / 2); + viewRect.w = VIEW_SIZE_X; + viewRect.h = VIEW_SIZE_Y; + + limits.x = world.map.bounds.x / MAP_TILE_SIZE; + limits.y = world.map.bounds.y / MAP_TILE_SIZE; + limits.w = (world.map.bounds.w / MAP_TILE_SIZE) - MAP_RENDER_WIDTH; + limits.h = (world.map.bounds.h / MAP_TILE_SIZE) - MAP_RENDER_HEIGHT; + + viewRect.x = limit(viewRect.x, limits.x, limits.w); + viewRect.y = limit(viewRect.y, limits.y, limits.h); + + blinkTimer = 0; + + atlasTexture = getTexture("gfx/atlas/atlas.png"); + + background = getImageFromAtlas("gfx/radar/background.png"); + arrow = getImageFromAtlas("gfx/radar/arrow.png"); + + /* top */ + initMarker(0, SCREEN_WIDTH / 2 - 275, SCREEN_HEIGHT / 2 - 275, 0, M_MIA); + initMarker(1, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 - 275, 0, M_ITEM); + initMarker(2, SCREEN_WIDTH / 2 + 275, SCREEN_HEIGHT / 2 - 275, 0, M_ENEMY); + + /* bottom */ + initMarker(3, SCREEN_WIDTH / 2 - 275, SCREEN_HEIGHT / 2 + 275, 180, M_MIA); + initMarker(4, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 + 275, 180, M_ITEM); + initMarker(5, SCREEN_WIDTH / 2 + 275, SCREEN_HEIGHT / 2 + 275, 180, M_ENEMY); + + /* left */ + initMarker(6, SCREEN_WIDTH / 2 - 450, SCREEN_HEIGHT / 2 - 200, 270, M_MIA); + initMarker(7, SCREEN_WIDTH / 2 - 450, SCREEN_HEIGHT / 2, 270, M_ITEM); + initMarker(8, SCREEN_WIDTH / 2 - 450, SCREEN_HEIGHT / 2 + 200, 270, M_ENEMY); + + /* right */ + initMarker(9, SCREEN_WIDTH / 2 + 450, SCREEN_HEIGHT / 2 - 200, 90, M_MIA); + initMarker(10, SCREEN_WIDTH / 2 + 450, SCREEN_HEIGHT / 2, 90, M_ITEM); + initMarker(11, SCREEN_WIDTH / 2 + 450, SCREEN_HEIGHT / 2 + 200, 90, M_ENEMY); +} + +static void initMarker(int i, int x, int y, int angle, int type) +{ + marker[i].x = x; + marker[i].y = y; + marker[i].angle = angle; + marker[i].type = type; } static void logic(void) { - + blinkTimer++; + blinkTimer %= 60; } static void draw(void) { + blitRectScaled(atlasTexture->texture, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, &background->rect, 0); + drawMap(); drawEntities(); + + drawMarkers(); } static void drawMap(void) { - int x, y, mx, my; + int x, y, mx, my, i; SDL_Color c; for (x = 0 ; x < viewRect.w ; x++) @@ -65,17 +122,23 @@ static void drawMap(void) mx = viewRect.x + x; my = viewRect.y + y; + drawRect(OFFSET_X + (x * RADAR_TILE_SIZE), OFFSET_Y + (y * RADAR_TILE_SIZE), RADAR_TILE_SIZE - 1, RADAR_TILE_SIZE - 1, 0, 0, 0, 255); + if (isWithinMap(mx, my)) { - if (world.map.data[mx][my] > MAP_TILE_AIR) + i = world.map.data[mx][my]; + + if (i > MAP_TILE_AIR && i < MAP_TILE_NON_SOLID) { - getMapTileColor(world.map.data[mx][my], &c); + getMapTileColor(i, &c); drawRect(OFFSET_X + (x * RADAR_TILE_SIZE), OFFSET_Y + (y * RADAR_TILE_SIZE), RADAR_TILE_SIZE - 1, RADAR_TILE_SIZE - 1, c.r, c.g, c.b, 255); } } - } + } } + + drawOutlineRect(OFFSET_X, OFFSET_Y, viewRect.w * RADAR_TILE_SIZE, viewRect.h * RADAR_TILE_SIZE, 0, 128, 0, 255); } static void getMapTileColor(int i, SDL_Color *c) @@ -85,17 +148,15 @@ static void getMapTileColor(int i, SDL_Color *c) switch (i) { case MAP_TILE_WATER: - c->r = c->g = c->b = 128; c->b = 255; break; case MAP_TILE_SLIME: - c->r = c->g = c->b = 128; c->g = 255; break; case MAP_TILE_LAVA: - c->r = c->g = c->b = 128; + c->g = 128; c->r = 255; break; @@ -143,17 +204,19 @@ static int isValidBlip(Entity *e) switch (e->type) { case ET_BOB: - return 1; + case ET_MIA: + case ET_TEEKA: + return blinkTimer < 30; case ET_ENEMY: - case ET_TEEKA: case ET_BOSS: case ET_HEART_CELL: case ET_KEY: + return e->isMissionTarget ? blinkTimer < 30 : 1; + case ET_ITEM: - case ET_MIA: case ET_DESTRUCTABLE: - return 1; + return e->isMissionTarget && blinkTimer < 30; default: return 0; @@ -169,18 +232,27 @@ static void getBlipColor(Entity *e, SDL_Color *c) switch (e->type) { case ET_BOB: + c->r = c->g = c->b = 255; break; case ET_ENEMY: + case ET_BOSS: c->r = 255; break; case ET_TEEKA: - case ET_BOSS: + case ET_MIA: + c->r = c->g = 255; + break; + + case ET_HEART_CELL: case ET_KEY: case ET_ITEM: - case ET_MIA: + c->g = 168; + c->b = 255; + break; + case ET_DESTRUCTABLE: c->r = c->b = 255; break; @@ -189,3 +261,30 @@ static void getBlipColor(Entity *e, SDL_Color *c) break; } } + +static void drawMarkers(void) +{ + int i; + + for (i = 0 ; i < M_MAX * 4 ; i++) + { + switch (i % M_MAX) + { + case M_MIA: + SDL_SetTextureColorMod(atlasTexture->texture, 255, 255, 0); + break; + + case M_ITEM: + SDL_SetTextureColorMod(atlasTexture->texture, 0, 192, 255); + break; + + case M_ENEMY: + SDL_SetTextureColorMod(atlasTexture->texture, 255, 0, 0); + break; + } + + blitRectRotated(atlasTexture->texture, marker[i].x, marker[i].y, &arrow->rect, marker[i].angle); + } + + SDL_SetTextureColorMod(atlasTexture->texture, 255, 255, 255); +} diff --git a/src/world/radar.h b/src/world/radar.h index 4c5a571..b411e7f 100644 --- a/src/world/radar.h +++ b/src/world/radar.h @@ -18,16 +18,32 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define RADAR_TILE_SIZE 16 -#define VIEW_SIZE 40 -#define OFFSET_X ((SCREEN_WIDTH - (RADAR_TILE_SIZE * VIEW_SIZE)) / 2) -#define OFFSET_Y ((SCREEN_HEIGHT - (RADAR_TILE_SIZE * VIEW_SIZE)) / 2) - #include "../common.h" +#define RADAR_TILE_SIZE 16 +#define VIEW_SIZE_X 50 +#define VIEW_SIZE_Y 30 +#define OFFSET_X ((SCREEN_WIDTH - (RADAR_TILE_SIZE * VIEW_SIZE_X)) / 2) +#define OFFSET_Y ((SCREEN_HEIGHT - (RADAR_TILE_SIZE * VIEW_SIZE_Y)) / 2) + +enum +{ + M_MIA, + M_ITEM, + M_ENEMY, + M_MAX +}; + extern int isWithinMap(int x, int y); extern Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore); extern void drawRect(int x, int y, int w, int h, int r, int g, int b, int a); +extern float limit(float i, float low, float high); +extern Texture *getTexture(const char *filename); +extern Atlas *getImageFromAtlas(char *filename); +extern void blitRectScaled(SDL_Texture *texture, int x, int y, int w, int h, SDL_Rect *srcRect, int center); +extern void drawOutlineRect(int x, int y, int w, int h, int r, int g, int b, int a); +extern void blitRect(SDL_Texture *texture, int x, int y, SDL_Rect *srcRect, int center); +extern void blitRectRotated(SDL_Texture *texture, int x, int y, SDL_Rect *srcRect, float angle); extern App app; extern World world;