From f634a28127d22da10e0e1b4ed9db449057f45f7f Mon Sep 17 00:00:00 2001 From: Steve Date: Fri, 2 Mar 2018 22:21:45 +0000 Subject: [PATCH] Scroll to observing entity. --- src/defs.h | 1 + src/structs.h | 1 - src/world/entities.c | 2 -- src/world/world.c | 73 +++++++++++++++++++++++++++++--------------- src/world/world.h | 2 ++ 5 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/defs.h b/src/defs.h index a2de553..1cc82ca 100644 --- a/src/defs.h +++ b/src/defs.h @@ -140,6 +140,7 @@ enum #define EF_KILL_OFFSCREEN (2 << 15) #define EF_ALWAYS_PROCESS (2 << 16) #define EF_NO_TELEPORT (2 << 17) +#define EF_NO_OBSERVE (2 << 18) #define GRAVITY_POWER 0.5f #define FRICTION 0.75f diff --git a/src/structs.h b/src/structs.h index 0422eb8..9b7c0c0 100644 --- a/src/structs.h +++ b/src/structs.h @@ -134,7 +134,6 @@ struct Entity { int isOnGround; int isVisible; int isMissionTarget; - int observationTime; Entity *riding; Entity *owner; unsigned long flags; diff --git a/src/world/entities.c b/src/world/entities.c index 8f0378e..5335150 100644 --- a/src/world/entities.c +++ b/src/world/entities.c @@ -170,8 +170,6 @@ void doEntities(void) } self->tick(); - - self->observationTime = limit(self->observationTime - 1, 0, FPS * 5); self->isOnGround = 0; diff --git a/src/world/world.c b/src/world/world.c index 2aa0ba3..32b4749 100644 --- a/src/world/world.c +++ b/src/world/world.c @@ -376,7 +376,7 @@ static void doWorldInProgress(void) if (world.observationTimer > 0) { - if (--world.observationTimer == FPS * 1.5) + if (--world.observationTimer == FPS) { world.entityToTrack = world.entitiesToObserve[0]; @@ -435,35 +435,58 @@ static void handleWidgets(void) static void doWorldObserving(void) { - int i; + int tx, ty; + float diffX, diffY; - cameraTrack(world.entityToTrack); + tx = world.entityToTrack->x - (SCREEN_WIDTH / 2); + ty = world.entityToTrack->y - (SCREEN_HEIGHT / 2); doEntitiesStatic(); - if (--world.observationTimer == 0) + diffX = abs(camera.x - tx) / 20; + diffY = abs(camera.y - ty) / 20; + + diffX = MAX(3, MIN(50, diffX)); + diffY = MAX(3, MIN(50, diffY)); + + if (camera.x > tx) { - if (++observationIndex < MAX_ENTS_TO_OBSERVE && world.entitiesToObserve[observationIndex] != NULL) - { - world.entityToTrack = world.entitiesToObserve[observationIndex]; + camera.x -= diffX; + } - world.observationTimer = FPS * 1.5; - } - else + if (camera.x < tx) + { + camera.x += diffX; + } + + if (camera.y > ty) + { + camera.y -= diffY; + } + + if (camera.y < ty) + { + camera.y += diffY; + } + + if (collision(camera.x, camera.y, MAP_TILE_SIZE, MAP_TILE_SIZE, tx, ty, MAP_TILE_SIZE, MAP_TILE_SIZE)) + { + if (--world.observationTimer <= 0) { - for (i = 0 ; i < MAX_ENTS_TO_OBSERVE ; i++) + if (++observationIndex < MAX_ENTS_TO_OBSERVE && world.entitiesToObserve[observationIndex] != NULL) { - if (world.entitiesToObserve[i] != NULL) - { - world.entitiesToObserve[i]->observationTime = FPS * 5; - } - } - - memset(world.entitiesToObserve, 0, sizeof(Entity*) * MAX_ENTS_TO_OBSERVE); - world.entityToTrack = (Entity*)world.bob; - world.state = WS_IN_PROGRESS; + world.entityToTrack = world.entitiesToObserve[observationIndex]; - observationIndex = 0; + world.observationTimer = FPS; + } + else + { + memset(world.entitiesToObserve, 0, sizeof(Entity*) * MAX_ENTS_TO_OBSERVE); + world.entityToTrack = (Entity*)world.bob; + world.state = WS_IN_PROGRESS; + + observationIndex = 0; + } } } } @@ -695,15 +718,17 @@ static int canAdd(Unit *u, int mx, int my) void observeActivation(Entity *e) { int i; - - if (e->observationTime == 0 && !isOnScreen(e)) + + if (!isOnScreen(e) && (!(e->flags & EF_NO_OBSERVE))) { + e->flags |= EF_NO_OBSERVE; + for (i = 0 ; i < MAX_ENTS_TO_OBSERVE ; i++) { if (world.entitiesToObserve[i] == NULL) { world.entitiesToObserve[i] = e; - world.observationTimer = FPS * 2; + world.observationTimer = FPS * 1.5; return; } else if (getDistance(e->x, e->y, world.entitiesToObserve[i]->x, world.entitiesToObserve[i]->y) < SCREEN_HEIGHT - 50) diff --git a/src/world/world.h b/src/world/world.h index 040a3dd..c19f0cb 100644 --- a/src/world/world.h +++ b/src/world/world.h @@ -114,8 +114,10 @@ extern int rrnd(int low, int high); extern void showWidgetGroup(char *group); extern void startSectionTransition(void); extern void stopMusic(void); +extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2); extern App app; +extern Camera camera; extern Colors colors; extern Dev dev; extern Entity *self;