diff options
author | Franklin Wei <git@fwei.tk> | 2017-11-21 19:28:16 -0500 |
---|---|---|
committer | Franklin Wei <git@fwei.tk> | 2017-11-21 19:29:45 -0500 |
commit | e8e85c5762da65ef7fa6e49ee8cc61f132be6d34 (patch) | |
tree | 1fb2c9724e61d121fe0b4460e3e626908f94fcea /apps/plugins/puzzles/src/grid.c | |
parent | f4c42213062170ddfcc706b3c5ed19f47517c253 (diff) | |
download | rockbox-e8e85c5762da65ef7fa6e49ee8cc61f132be6d34.tar.gz rockbox-e8e85c5762da65ef7fa6e49ee8cc61f132be6d34.zip |
puzzles: resync with upstream; add Loopy and Palisade, mouse mode
This brings a various small changes to the drawing and input code,
as well as a brand new "mouse mode", where input goes to a virtual
mouse cursor. Only Loopy has this mouse mode enabled by default,
while other games have it hidden away under the debug menu. Some
changes by me to Palisade were required to make it playable; those
are included here as well. Right now, sgt-net is pushing the c200v2's
upper limit on size and may have to be dropped in a future commit.
Change-Id: I495d2a2125462c2985aec1ffbc54bbe3fe5133bd
Diffstat (limited to 'apps/plugins/puzzles/src/grid.c')
-rw-r--r-- | apps/plugins/puzzles/src/grid.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/apps/plugins/puzzles/src/grid.c b/apps/plugins/puzzles/src/grid.c index 52648e5a92..b5e6bb0937 100644 --- a/apps/plugins/puzzles/src/grid.c +++ b/apps/plugins/puzzles/src/grid.c | |||
@@ -2060,6 +2060,102 @@ static grid *grid_new_greathexagonal(int width, int height, const char *desc) | |||
2060 | return g; | 2060 | return g; |
2061 | } | 2061 | } |
2062 | 2062 | ||
2063 | #define KAGOME_TILESIZE 18 | ||
2064 | /* Vector for side of triangle - ratio is close to sqrt(3) */ | ||
2065 | #define KAGOME_A 15 | ||
2066 | #define KAGOME_B 26 | ||
2067 | |||
2068 | static void grid_size_kagome(int width, int height, | ||
2069 | int *tilesize, int *xextent, int *yextent) | ||
2070 | { | ||
2071 | int a = KAGOME_A; | ||
2072 | int b = KAGOME_B; | ||
2073 | |||
2074 | *tilesize = KAGOME_TILESIZE; | ||
2075 | *xextent = (4*a) * (width-1) + 6*a; | ||
2076 | *yextent = (2*b) * (height-1) + 2*b; | ||
2077 | } | ||
2078 | |||
2079 | static grid *grid_new_kagome(int width, int height, const char *desc) | ||
2080 | { | ||
2081 | int x, y; | ||
2082 | int a = KAGOME_A; | ||
2083 | int b = KAGOME_B; | ||
2084 | |||
2085 | /* Upper bounds - don't have to be exact */ | ||
2086 | int max_faces = 6 * (width + 1) * (height + 1); | ||
2087 | int max_dots = 6 * width * height; | ||
2088 | |||
2089 | tree234 *points; | ||
2090 | |||
2091 | grid *g = grid_empty(); | ||
2092 | g->tilesize = KAGOME_TILESIZE; | ||
2093 | g->faces = snewn(max_faces, grid_face); | ||
2094 | g->dots = snewn(max_dots, grid_dot); | ||
2095 | |||
2096 | points = newtree234(grid_point_cmp_fn); | ||
2097 | |||
2098 | for (y = 0; y < height; y++) { | ||
2099 | for (x = 0; x < width; x++) { | ||
2100 | grid_dot *d; | ||
2101 | /* centre of hexagon */ | ||
2102 | int px = (4*a) * x; | ||
2103 | int py = (2*b) * y; | ||
2104 | if (y % 2) | ||
2105 | px += 2*a; | ||
2106 | |||
2107 | /* hexagon */ | ||
2108 | grid_face_add_new(g, 6); | ||
2109 | d = grid_get_dot(g, points, px + a, py - b); grid_face_set_dot(g, d, 0); | ||
2110 | d = grid_get_dot(g, points, px + 2*a, py ); grid_face_set_dot(g, d, 1); | ||
2111 | d = grid_get_dot(g, points, px + a, py + b); grid_face_set_dot(g, d, 2); | ||
2112 | d = grid_get_dot(g, points, px - a, py + b); grid_face_set_dot(g, d, 3); | ||
2113 | d = grid_get_dot(g, points, px - 2*a, py ); grid_face_set_dot(g, d, 4); | ||
2114 | d = grid_get_dot(g, points, px - a, py - b); grid_face_set_dot(g, d, 5); | ||
2115 | |||
2116 | /* Triangle above right */ | ||
2117 | if ((x < width - 1) || (!(y % 2) && y)) { | ||
2118 | grid_face_add_new(g, 3); | ||
2119 | d = grid_get_dot(g, points, px + 3*a, py - b); grid_face_set_dot(g, d, 0); | ||
2120 | d = grid_get_dot(g, points, px + 2*a, py ); grid_face_set_dot(g, d, 1); | ||
2121 | d = grid_get_dot(g, points, px + a, py - b); grid_face_set_dot(g, d, 2); | ||
2122 | } | ||
2123 | |||
2124 | /* Triangle below right */ | ||
2125 | if ((x < width - 1) || (!(y % 2) && (y < height - 1))) { | ||
2126 | grid_face_add_new(g, 3); | ||
2127 | d = grid_get_dot(g, points, px + 3*a, py + b); grid_face_set_dot(g, d, 0); | ||
2128 | d = grid_get_dot(g, points, px + a, py + b); grid_face_set_dot(g, d, 1); | ||
2129 | d = grid_get_dot(g, points, px + 2*a, py ); grid_face_set_dot(g, d, 2); | ||
2130 | } | ||
2131 | |||
2132 | /* Left triangles */ | ||
2133 | if (!x && (y % 2)) { | ||
2134 | /* Triangle above left */ | ||
2135 | grid_face_add_new(g, 3); | ||
2136 | d = grid_get_dot(g, points, px - a, py - b); grid_face_set_dot(g, d, 0); | ||
2137 | d = grid_get_dot(g, points, px - 2*a, py ); grid_face_set_dot(g, d, 1); | ||
2138 | d = grid_get_dot(g, points, px - 3*a, py - b); grid_face_set_dot(g, d, 2); | ||
2139 | |||
2140 | /* Triangle below left */ | ||
2141 | if (y < height - 1) { | ||
2142 | grid_face_add_new(g, 3); | ||
2143 | d = grid_get_dot(g, points, px - a, py + b); grid_face_set_dot(g, d, 0); | ||
2144 | d = grid_get_dot(g, points, px - 3*a, py + b); grid_face_set_dot(g, d, 1); | ||
2145 | d = grid_get_dot(g, points, px - 2*a, py ); grid_face_set_dot(g, d, 2); | ||
2146 | } | ||
2147 | } | ||
2148 | } | ||
2149 | } | ||
2150 | |||
2151 | freetree234(points); | ||
2152 | assert(g->num_faces <= max_faces); | ||
2153 | assert(g->num_dots <= max_dots); | ||
2154 | |||
2155 | grid_make_consistent(g); | ||
2156 | return g; | ||
2157 | } | ||
2158 | |||
2063 | #define OCTAGONAL_TILESIZE 40 | 2159 | #define OCTAGONAL_TILESIZE 40 |
2064 | /* b/a approx sqrt(2) */ | 2160 | /* b/a approx sqrt(2) */ |
2065 | #define OCTAGONAL_A 29 | 2161 | #define OCTAGONAL_A 29 |