Show and hide radar arrows. Integrate radar access into game.
This commit is contained in:
parent
f108627c5b
commit
f4190a5ccd
|
@ -48,7 +48,7 @@ _OBJS += particles.o player.o plasmaBlob.o plasmaDroid.o pistolBlob.o pistolDroi
|
|||
_OBJS += quadtree.o
|
||||
_OBJS += radar.o
|
||||
_OBJS += shotgunBlob.o shotgunDroid.o sound.o spreadGunBlob.o spreadGunDroid.o sprites.o structures.o
|
||||
_OBJS += tankCommander.o tankTrack.o teeka.o teleporter.o text.o textures.o title.o triggers.o
|
||||
_OBJS += tankCommander.o tankTrack.o teeka.o teleporter.o text.o textures.o title.o transition.o triggers.o
|
||||
_OBJS += unit.o util.o
|
||||
_OBJS += weapons.o weaponPickup.o widgets.o world.o worldLoader.o worldSaver.o
|
||||
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
Copyright (C) 2018 Parallel Realities
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
#include "transition.h"
|
||||
|
||||
static long transitionStartTime;
|
||||
|
||||
void startSectionTransition(void)
|
||||
{
|
||||
transitionStartTime = SDL_GetTicks();
|
||||
|
||||
prepareScene();
|
||||
|
||||
clearInput();
|
||||
|
||||
presentScene();
|
||||
|
||||
expireTexts(1);
|
||||
}
|
||||
|
||||
void endSectionTransition(void)
|
||||
{
|
||||
long elasped = 250 - (SDL_GetTicks() - transitionStartTime);
|
||||
|
||||
if (elasped > 0)
|
||||
{
|
||||
SDL_Delay(elasped);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
Copyright (C) 2015-2017 Parallel Realities
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
extern void prepareScene(void);
|
||||
extern void presentScene(void);
|
||||
extern void clearInput(void);
|
||||
extern void expireTexts(int all);
|
||||
|
||||
extern App app;
|
|
@ -24,7 +24,7 @@ void initAtlasTest(void)
|
|||
{
|
||||
dev.cheatStatic = 0;
|
||||
dev.cheatBlind = 0;
|
||||
dev.cheatNoEnemies = 1;
|
||||
dev.cheatNoEnemies = 0;
|
||||
dev.cheatKeys = 1;
|
||||
dev.cheatPower = 1;
|
||||
dev.cheatHealth = 1;
|
||||
|
@ -33,13 +33,11 @@ void initAtlasTest(void)
|
|||
|
||||
initHub();
|
||||
|
||||
loadWorld("beachFront1");
|
||||
loadWorld("greenlands1");
|
||||
|
||||
initWorld();
|
||||
|
||||
initMap();
|
||||
|
||||
initEntities();
|
||||
|
||||
initRadar();
|
||||
}
|
||||
|
|
|
@ -29,18 +29,26 @@ 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 void initBlips(void);
|
||||
static void enableMarker(int type, int i);
|
||||
|
||||
static SDL_Rect viewRect;
|
||||
static Texture *atlasTexture;
|
||||
static Atlas *background;
|
||||
static Atlas *arrow;
|
||||
static int blinkTimer;
|
||||
static Marker marker[M_MAX * 4];
|
||||
static Marker marker[MAX_MARKERS];
|
||||
static Entity *blips[MAX_BLIPS];
|
||||
|
||||
void initRadar(void)
|
||||
{
|
||||
SDL_Rect limits;
|
||||
|
||||
startSectionTransition();
|
||||
|
||||
memset(blips, 0, sizeof(Entity*) * MAX_BLIPS);
|
||||
memset(marker, 0, sizeof(Marker) * MAX_MARKERS);
|
||||
|
||||
app.delegate.logic = logic;
|
||||
app.delegate.draw = draw;
|
||||
|
||||
|
@ -51,8 +59,8 @@ void initRadar(void)
|
|||
|
||||
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;
|
||||
limits.w = (world.map.bounds.w / MAP_TILE_SIZE) - (VIEW_SIZE_X - MAP_RENDER_WIDTH) - 1;
|
||||
limits.h = (world.map.bounds.h / MAP_TILE_SIZE) - (VIEW_SIZE_Y - MAP_RENDER_HEIGHT);
|
||||
|
||||
viewRect.x = limit(viewRect.x, limits.x, limits.w);
|
||||
viewRect.y = limit(viewRect.y, limits.y, limits.h);
|
||||
|
@ -83,6 +91,10 @@ void initRadar(void)
|
|||
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);
|
||||
|
||||
initBlips();
|
||||
|
||||
endSectionTransition();
|
||||
}
|
||||
|
||||
static void initMarker(int i, int x, int y, int angle, int type)
|
||||
|
@ -93,10 +105,107 @@ static void initMarker(int i, int x, int y, int angle, int type)
|
|||
marker[i].type = type;
|
||||
}
|
||||
|
||||
static void initBlips(void)
|
||||
{
|
||||
Entity *e;
|
||||
int i, x, y;
|
||||
|
||||
i = 0;
|
||||
|
||||
for (e = world.entityHead.next ; e != NULL ; e = e->next)
|
||||
{
|
||||
if (isValidBlip(e))
|
||||
{
|
||||
x = (e->x / MAP_TILE_SIZE);
|
||||
y = (e->y / MAP_TILE_SIZE);
|
||||
|
||||
if (y < viewRect.y)
|
||||
{
|
||||
enableMarker(e->type, M_MIA);
|
||||
}
|
||||
else if (y > viewRect.y + viewRect.h)
|
||||
{
|
||||
enableMarker(e->type, M_MIA + (M_MAX));
|
||||
}
|
||||
else if (x < viewRect.x)
|
||||
{
|
||||
enableMarker(e->type, M_MIA + (M_MAX * 2));
|
||||
}
|
||||
else if (x > viewRect.x + viewRect.w)
|
||||
{
|
||||
enableMarker(e->type, M_MIA + (M_MAX * 3));
|
||||
}
|
||||
else if (i < MAX_BLIPS)
|
||||
{
|
||||
blips[i++] = e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void enableMarker(int type, int i)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case ET_BOB:
|
||||
case ET_MIA:
|
||||
case ET_TEEKA:
|
||||
marker[i].visible = 1;
|
||||
break;
|
||||
|
||||
case ET_HEART_CELL:
|
||||
case ET_KEY:
|
||||
case ET_ITEM:
|
||||
case ET_DESTRUCTABLE:
|
||||
marker[i + 1].visible = 1;
|
||||
break;
|
||||
|
||||
case ET_ENEMY:
|
||||
case ET_BOSS:
|
||||
marker[i + 2].visible = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void logic(void)
|
||||
{
|
||||
int i;
|
||||
Marker *m;
|
||||
|
||||
blinkTimer++;
|
||||
blinkTimer %= 60;
|
||||
|
||||
for (i = 0 ; i < MAX_MARKERS ; i++)
|
||||
{
|
||||
m = &marker[i];
|
||||
|
||||
if (i / 3 % 2 == 0)
|
||||
{
|
||||
m->value += 0.1;
|
||||
}
|
||||
else
|
||||
{
|
||||
m->value -= 0.1;
|
||||
}
|
||||
|
||||
if (i < 6)
|
||||
{
|
||||
m->y += (float) sin(m->value);
|
||||
}
|
||||
else
|
||||
{
|
||||
m->x += (float) sin(m->value);
|
||||
}
|
||||
}
|
||||
|
||||
if (isControl(CONTROL_MAP))
|
||||
{
|
||||
clearControl(CONTROL_MAP);
|
||||
exitRadar();
|
||||
}
|
||||
}
|
||||
|
||||
static void draw(void)
|
||||
|
@ -108,6 +217,15 @@ static void draw(void)
|
|||
drawEntities();
|
||||
|
||||
drawMarkers();
|
||||
|
||||
drawRect((SCREEN_WIDTH / 2) - 230, SCREEN_HEIGHT - 58, 14, 14, 255, 255, 0, 255);
|
||||
drawText((SCREEN_WIDTH / 2) - 200, SCREEN_HEIGHT - 65, 20, TA_LEFT, colors.yellow, "MIAs");
|
||||
|
||||
drawRect((SCREEN_WIDTH / 2) - 30, SCREEN_HEIGHT - 58, 14, 14, 0, 255, 255, 255);
|
||||
drawText((SCREEN_WIDTH / 2), SCREEN_HEIGHT - 65, 20, TA_LEFT, colors.cyan, "Items");
|
||||
|
||||
drawRect((SCREEN_WIDTH / 2) + 170, SCREEN_HEIGHT - 58, 14, 14, 255, 0, 0, 255);
|
||||
drawText((SCREEN_WIDTH / 2) + 200, SCREEN_HEIGHT - 65, 20, TA_LEFT, colors.red, "Targets");
|
||||
}
|
||||
|
||||
static void drawMap(void)
|
||||
|
@ -173,15 +291,14 @@ static void getMapTileColor(int i, SDL_Color *c)
|
|||
static void drawEntities(void)
|
||||
{
|
||||
Entity *e;
|
||||
Entity **candidates;
|
||||
int i, x, y;
|
||||
SDL_Color c;
|
||||
|
||||
candidates = getAllEntsWithin(viewRect.x * MAP_TILE_SIZE, viewRect.y * MAP_TILE_SIZE, viewRect.w * MAP_TILE_SIZE, viewRect.h * MAP_TILE_SIZE, NULL);
|
||||
|
||||
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
|
||||
for (i = 0 ; i < MAX_BLIPS ; i++)
|
||||
{
|
||||
if (isValidBlip(e))
|
||||
e = blips[i];
|
||||
|
||||
if (e != NULL)
|
||||
{
|
||||
x = (e->x / MAP_TILE_SIZE);
|
||||
y = (e->y / MAP_TILE_SIZE);
|
||||
|
@ -193,11 +310,14 @@ static void drawEntities(void)
|
|||
|
||||
getBlipColor(e, &c);
|
||||
|
||||
if (blinkTimer < 30)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int isValidBlip(Entity *e)
|
||||
{
|
||||
|
@ -206,17 +326,15 @@ static int isValidBlip(Entity *e)
|
|||
case ET_BOB:
|
||||
case ET_MIA:
|
||||
case ET_TEEKA:
|
||||
return blinkTimer < 30;
|
||||
return 1;
|
||||
|
||||
case ET_ENEMY:
|
||||
case ET_BOSS:
|
||||
case ET_HEART_CELL:
|
||||
case ET_KEY:
|
||||
return e->isMissionTarget ? blinkTimer < 30 : 1;
|
||||
|
||||
case ET_ITEM:
|
||||
case ET_DESTRUCTABLE:
|
||||
return e->isMissionTarget && blinkTimer < 30;
|
||||
return e->isMissionTarget;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
|
@ -266,7 +384,9 @@ static void drawMarkers(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < M_MAX * 4 ; i++)
|
||||
for (i = 0 ; i < MAX_MARKERS ; i++)
|
||||
{
|
||||
if (marker[i].visible)
|
||||
{
|
||||
switch (i % M_MAX)
|
||||
{
|
||||
|
@ -285,6 +405,7 @@ static void drawMarkers(void)
|
|||
|
||||
blitRectRotated(atlasTexture->texture, marker[i].x, marker[i].y, &arrow->rect, marker[i].angle);
|
||||
}
|
||||
}
|
||||
|
||||
SDL_SetTextureColorMod(atlasTexture->texture, 255, 255, 255);
|
||||
}
|
||||
|
|
|
@ -25,6 +25,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#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)
|
||||
#define MAX_MARKERS 12
|
||||
#define MAX_BLIPS 32
|
||||
|
||||
enum
|
||||
{
|
||||
|
@ -43,6 +45,13 @@ 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 blitRectRotated(SDL_Texture *texture, int x, int y, SDL_Rect *srcRect, float angle);
|
||||
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
|
||||
extern void exitRadar(void);
|
||||
extern int isControl(int type);
|
||||
extern void clearControl(int type);
|
||||
extern void startSectionTransition(void);
|
||||
extern void endSectionTransition(void);
|
||||
|
||||
extern App app;
|
||||
extern Colors colors;
|
||||
extern World world;
|
||||
|
|
|
@ -239,12 +239,6 @@ static void doWorldInProgress(void)
|
|||
|
||||
doLocationTriggers();
|
||||
|
||||
if (isControl(CONTROL_PAUSE))
|
||||
{
|
||||
world.state = WS_PAUSED;
|
||||
clearControl(CONTROL_PAUSE);
|
||||
}
|
||||
|
||||
if (world.allObjectivesComplete && world.state != WS_COMPLETE)
|
||||
{
|
||||
world.bob->flags |= EF_IMMUNE;
|
||||
|
@ -262,6 +256,18 @@ static void doWorldInProgress(void)
|
|||
|
||||
stopMusic();
|
||||
}
|
||||
|
||||
if (isControl(CONTROL_PAUSE))
|
||||
{
|
||||
world.state = WS_PAUSED;
|
||||
clearControl(CONTROL_PAUSE);
|
||||
}
|
||||
|
||||
if (isControl(CONTROL_MAP))
|
||||
{
|
||||
initRadar();
|
||||
clearControl(CONTROL_MAP);
|
||||
}
|
||||
}
|
||||
|
||||
if (world.observationTimer > 0)
|
||||
|
@ -572,3 +578,13 @@ void observeActivation(Entity *e)
|
|||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
void exitRadar(void)
|
||||
{
|
||||
startSectionTransition();
|
||||
|
||||
app.delegate.logic = logic;
|
||||
app.delegate.draw = draw;
|
||||
|
||||
endSectionTransition();
|
||||
}
|
||||
|
|
|
@ -69,6 +69,9 @@ extern void clearControls(void);
|
|||
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
|
||||
extern void loadMusic(char *filename);
|
||||
extern void playMusic(int loop);
|
||||
extern void initRadar(void);
|
||||
extern void startSectionTransition(void);
|
||||
extern void endSectionTransition(void);
|
||||
|
||||
extern App app;
|
||||
extern Colors colors;
|
||||
|
|
Loading…
Reference in New Issue