Skip to content

Commit

Permalink
Implement city zoom (Keriew#39)
Browse files Browse the repository at this point in the history
* Implement city zoom

Use the mouse wheel to zoom in or out.
Click the mouse wheel to restore the zoom.

You can also pinch to zoom when using touch.

Zoom must be enabled in the settings.

* Fix videos not displaying
  • Loading branch information
crudelios authored May 7, 2020
1 parent 00dfc6d commit 7432767
Show file tree
Hide file tree
Showing 51 changed files with 831 additions and 169 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,7 @@ set(INPUT_FILES
${PROJECT_SOURCE_DIR}/src/input/mouse.c
${PROJECT_SOURCE_DIR}/src/input/scroll.c
${PROJECT_SOURCE_DIR}/src/input/touch.c
${PROJECT_SOURCE_DIR}/src/input/zoom.c
)
set(MAP_FILES
${PROJECT_SOURCE_DIR}/src/map/aqueduct.c
Expand Down
54 changes: 49 additions & 5 deletions src/city/view.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#include "view.h"

#include "core/calc.h"
#include "core/config.h"
#include "core/direction.h"
#include "graphics/menu.h"
#include "map/grid.h"
Expand All @@ -16,6 +18,7 @@ static struct {
int screen_height;
int sidebar_collapsed;
int orientation;
int scale;
struct {
view_tile tile;
pixel_offset pixel;
Expand Down Expand Up @@ -154,7 +157,7 @@ static void adjust_camera_position_for_pixels(void)
void city_view_init(void)
{
calculate_lookup();
check_camera_boundaries();
city_view_set_scale(100);
widget_minimap_invalidate();
}

Expand All @@ -169,6 +172,11 @@ void city_view_reset_orientation(void)
calculate_lookup();
}

int city_view_get_scale(void)
{
return data.scale;
}

void city_view_get_camera(int *x, int *y)
{
*x = data.camera.tile.x;
Expand Down Expand Up @@ -245,6 +253,13 @@ void city_view_get_selected_tile_pixels(int *x_pixels, int *y_pixels)

int city_view_pixels_to_view_tile(int x_pixels, int y_pixels, view_tile *tile)
{
if (config_get(CONFIG_UI_ZOOM)) {
y_pixels -= TOP_MENU_HEIGHT;
}

x_pixels = calc_adjust_with_percentage(x_pixels, data.scale);
y_pixels = calc_adjust_with_percentage(y_pixels, data.scale);

if (x_pixels < data.viewport.x ||
x_pixels >= data.viewport.x + data.viewport.width_pixels ||
y_pixels < data.viewport.y ||
Expand Down Expand Up @@ -352,22 +367,40 @@ void city_view_rotate_right(void)

static void set_viewport(int x_offset, int y_offset, int width, int height)
{
width = calc_adjust_with_percentage(width, data.scale);
height = calc_adjust_with_percentage(height, data.scale);
data.viewport.x = x_offset;
data.viewport.y = y_offset;
data.viewport.width_pixels = width - 2;
data.viewport.width_pixels = width - calc_adjust_with_percentage(2, data.scale);
data.viewport.height_pixels = height;
data.viewport.width_tiles = width / TILE_WIDTH_PIXELS;
data.viewport.height_tiles = height / HALF_TILE_HEIGHT_PIXELS;
}

static void set_viewport_with_sidebar(void)
{
set_viewport(0, TOP_MENU_HEIGHT, data.screen_width - 160, data.screen_height - TOP_MENU_HEIGHT);
set_viewport(0, config_get(CONFIG_UI_ZOOM) ? 0 : TOP_MENU_HEIGHT, data.screen_width - 160, data.screen_height - TOP_MENU_HEIGHT);
}

static void set_viewport_without_sidebar(void)
{
set_viewport(0, TOP_MENU_HEIGHT, data.screen_width - 40, data.screen_height - TOP_MENU_HEIGHT);
set_viewport(0, config_get(CONFIG_UI_ZOOM) ? 0 : TOP_MENU_HEIGHT, data.screen_width - 40, data.screen_height - TOP_MENU_HEIGHT);
}

void city_view_set_scale(int scale)
{
if (config_get(CONFIG_UI_ZOOM)) {
scale = calc_bound(scale, 50, 200);
} else {
scale = 100;
}
data.scale = scale;
if (data.sidebar_collapsed) {
set_viewport_without_sidebar();
} else {
set_viewport_with_sidebar();
}
check_camera_boundaries();
}

void city_view_set_viewport(int screen_width, int screen_height)
Expand All @@ -382,14 +415,25 @@ void city_view_set_viewport(int screen_width, int screen_height)
check_camera_boundaries();
}

void city_view_get_viewport(int *x, int *y, int *width, int *height)
void city_view_get_scaled_viewport(int *x, int *y, int *width, int *height)
{
*x = data.viewport.x;
*y = data.viewport.y;
*width = data.viewport.width_pixels;
*height = data.viewport.height_pixels;
}

void city_view_get_unscaled_viewport(int *x, int *y, int *width, int *height)
{
*x = data.viewport.x;
*y = data.viewport.y;
if (!data.scale) {
data.scale = 100;
}
*width = (int) ((data.viewport.width_pixels / (float) data.scale) * 100);
*height = (int) ((data.viewport.height_pixels / (float) data.scale) * 100);
}

void city_view_get_viewport_size_tiles(int *width, int *height)
{
*width = data.viewport.width_tiles;
Expand Down
6 changes: 5 additions & 1 deletion src/city/view.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ int city_view_orientation(void);

void city_view_reset_orientation(void);

int city_view_get_scale(void);
void city_view_set_scale(int scale);

void city_view_get_camera(int *x, int *y);
void city_view_get_pixel_offset(int *x, int *y);
void city_view_get_camera_in_pixels(int *x, int *y);
Expand Down Expand Up @@ -50,7 +53,8 @@ void city_view_rotate_right(void);

void city_view_set_viewport(int screen_width, int screen_height);

void city_view_get_viewport(int *x, int *y, int *width, int *height);
void city_view_get_scaled_viewport(int *x, int *y, int *width, int *height);
void city_view_get_unscaled_viewport(int *x, int *y, int *width, int *height);
void city_view_get_viewport_size_tiles(int *width, int *height);

int city_view_is_sidebar_collapsed(void);
Expand Down
2 changes: 2 additions & 0 deletions src/city/warning.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "core/string.h"
#include "core/time.h"
#include "game/settings.h"
#include "graphics/window.h"

#define MAX_WARNINGS 5
#define MAX_TEXT 100
Expand Down Expand Up @@ -78,6 +79,7 @@ void city_warning_clear_outdated(void)
for (int i = 0; i < MAX_WARNINGS; i++) {
if (warnings[i].in_use && time_get_millis() - warnings[i].time > TIMEOUT_MS) {
warnings[i].in_use = 0;
window_request_refresh();
}
}
}
1 change: 1 addition & 0 deletions src/core/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ static const char *ini_keys[] = {
"ui_visual_feedback_on_delete",
"ui_show_water_structure_range",
"ui_show_construction_size",
"ui_zoom",
"gameplay_change_grandfestival",
"gameplay_change_jealous_gods",
"gameplay_change_global_labour",
Expand Down
1 change: 1 addition & 0 deletions src/core/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ typedef enum {
CONFIG_UI_VISUAL_FEEDBACK_ON_DELETE,
CONFIG_UI_SHOW_WATER_STRUCTURE_RANGE,
CONFIG_UI_SHOW_CONSTRUCTION_SIZE,
CONFIG_UI_ZOOM,
CONFIG_GP_CH_GRANDFESTIVAL,
CONFIG_GP_CH_JEALOUS_GODS,
CONFIG_GP_CH_GLOBAL_LABOUR,
Expand Down
3 changes: 2 additions & 1 deletion src/core/image.c
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,8 @@ static void read_header(buffer *buf)

static color_t to_32_bit(uint16_t c)
{
return ((c & 0x7c00) << 9) | ((c & 0x7000) << 4) |
return ALPHA_OPAQUE |
((c & 0x7c00) << 9) | ((c & 0x7000) << 4) |
((c & 0x3e0) << 6) | ((c & 0x380) << 1) |
((c & 0x1f) << 3) | ((c & 0x1c) >> 2);
}
Expand Down
12 changes: 12 additions & 0 deletions src/game/system.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,18 @@ const char *system_version(void);
*/
void system_resize(int width, int height);

/**
* Reload game textures
*/
void system_reload_textures(void);

/**
* Saves the screen buffer to memory
* Even though it is set to "void", uses "color_t" format
* @return true if saving was successful, false otherwise
*/
int system_save_screen_buffer(void *pixels);

/**
* Center window
*/
Expand Down
60 changes: 30 additions & 30 deletions src/graphics/color.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,46 +5,46 @@

typedef uint32_t color_t;

#define COLOR_BLACK 0x000000
#define COLOR_BLUE 0x0055ff
#define COLOR_RED 0xff0000
#define COLOR_WHITE 0xffffff
#define COLOR_BLACK 0xff000000
#define COLOR_BLUE 0xff0055ff
#define COLOR_RED 0xffff0000
#define COLOR_WHITE 0xffffffff

#define COLOR_SG2_TRANSPARENT 0xf700ff
#define COLOR_TOOLTIP 0x424242
#define COLOR_SIDEBAR 0xbdb592
#define COLOR_SG2_TRANSPARENT 0xfff700ff
#define COLOR_TOOLTIP 0xff424242
#define COLOR_SIDEBAR 0xffbdb592

#define COLOR_FONT_RED COLOR_RED
#define COLOR_FONT_BLUE 0x0055ff
#define COLOR_FONT_YELLOW 0xe7e75a
#define COLOR_FONT_ORANGE 0xff5a08
#define COLOR_FONT_ORANGE_LIGHT 0xffa500
#define COLOR_FONT_LIGHT_GRAY 0xb3b3b3

#define COLOR_INSET_LIGHT 0xffffff
#define COLOR_INSET_DARK 0x848484

#define COLOR_MASK_NONE 0xffffff
#define COLOR_MASK_RED 0xff0818
#define COLOR_MASK_GREEN 0x18ff18
#define COLOR_FONT_BLUE 0xff0055ff
#define COLOR_FONT_YELLOW 0xffe7e75a
#define COLOR_FONT_ORANGE 0xffff5a08
#define COLOR_FONT_ORANGE_LIGHT 0xffffa500
#define COLOR_FONT_LIGHT_GRAY 0xffb3b3b3

#define COLOR_INSET_LIGHT 0xffffffff
#define COLOR_INSET_DARK 0xff848484

#define COLOR_MASK_NONE 0xffffffff
#define COLOR_MASK_RED 0xffff0818
#define COLOR_MASK_GREEN 0xff18ff18
#define COLOR_MASK_BLUE 0x663377ff

#define COLOR_MINIMAP_VIEWPORT 0xe7e75a
#define COLOR_MINIMAP_DARK 0x424242
#define COLOR_MINIMAP_LIGHT 0xc6c6c6
#define COLOR_MINIMAP_SOLDIER 0xf70000
#define COLOR_MINIMAP_ENEMY_CENTRAL 0x7b0000
#define COLOR_MINIMAP_ENEMY_NORTHERN 0x1800ff
#define COLOR_MINIMAP_ENEMY_DESERT 0x08007b
#define COLOR_MINIMAP_VIEWPORT 0xffe7e75a
#define COLOR_MINIMAP_DARK 0xff424242
#define COLOR_MINIMAP_LIGHT 0xffc6c6c6
#define COLOR_MINIMAP_SOLDIER 0xfff70000
#define COLOR_MINIMAP_ENEMY_CENTRAL 0xff7b0000
#define COLOR_MINIMAP_ENEMY_NORTHERN 0xff1800ff
#define COLOR_MINIMAP_ENEMY_DESERT 0xff08007b
#define COLOR_MINIMAP_WOLF COLOR_BLACK

#define COLOR_MOUSE_DARK_GRAY 0x3f3f3f
#define COLOR_MOUSE_MEDIUM_GRAY 0x737373
#define COLOR_MOUSE_LIGHT_GRAY 0xb3b3b3
#define COLOR_MOUSE_DARK_GRAY 0xff3f3f3f
#define COLOR_MOUSE_MEDIUM_GRAY 0xff737373
#define COLOR_MOUSE_LIGHT_GRAY 0xffb3b3b3

#define ALPHA_OPAQUE 0xff000000
#define ALPHA_FONT_SEMI_TRANSPARENT 0x99000000
#define ALPHA_MASK_SEMI_TRANSPARENT 0x48000000
#define ALPHA_MASK_SEMI_TRANSPARENT 0x48ffffff
#define ALPHA_TRANSPARENT 0x00000000

#endif // GRAPHICS_COLOR_H
Loading

0 comments on commit 7432767

Please sign in to comment.