diff options
6 files changed, 744 insertions, 0 deletions
diff --git a/keyboards/gmmk/pro/ansi/keymaps/paddlegame/config.h b/keyboards/gmmk/pro/ansi/keymaps/paddlegame/config.h new file mode 100644 index 000000000..a1fe42765 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/paddlegame/config.h | |||
@@ -0,0 +1,24 @@ | |||
1 | /* Copyright 2021 Tomas Guinan | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #pragma once | ||
18 | |||
19 | #ifdef RGB_MATRIX_ENABLE | ||
20 | #define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_COLOR | ||
21 | #define RGB_DISABLE_WHEN_USB_SUSPENDED true | ||
22 | #endif | ||
23 | |||
24 | #define FORCE_NKRO | ||
diff --git a/keyboards/gmmk/pro/ansi/keymaps/paddlegame/keymap.c b/keyboards/gmmk/pro/ansi/keymaps/paddlegame/keymap.c new file mode 100644 index 000000000..5c702b168 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/paddlegame/keymap.c | |||
@@ -0,0 +1,471 @@ | |||
1 | /* Copyright 2021 Glorious, LLC <salman@pcgamingrace.com> | ||
2 | Copyright 2021 Tomas Guinan | ||
3 | |||
4 | This program is free software: you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Public License as published by | ||
6 | the Free Software Foundation, either version 2 of the License, or | ||
7 | (at your option) any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | */ | ||
17 | |||
18 | #include QMK_KEYBOARD_H | ||
19 | #include "rgb_matrix_map.h" | ||
20 | #include "paddlegame.h" | ||
21 | #include <math.h> | ||
22 | |||
23 | enum custom_layers { | ||
24 | _BASE, | ||
25 | _FN1, | ||
26 | _MO2, | ||
27 | _MO3, | ||
28 | }; | ||
29 | |||
30 | enum custom_keycodes { | ||
31 | KC_00 = SAFE_RANGE, | ||
32 | KC_WINLK, //Toggles Win key on and off | ||
33 | }; | ||
34 | |||
35 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
36 | switch (keycode) { | ||
37 | case KC_00: | ||
38 | if (record->event.pressed) { | ||
39 | // when keycode KC_00 is pressed | ||
40 | SEND_STRING("00"); | ||
41 | } else { | ||
42 | // when keycode KC_00 is released | ||
43 | } | ||
44 | break; | ||
45 | |||
46 | case KC_WINLK: | ||
47 | if (record->event.pressed) { | ||
48 | if(!keymap_config.no_gui) { | ||
49 | process_magic(GUI_OFF, record); | ||
50 | } else { | ||
51 | process_magic(GUI_ON, record); | ||
52 | } | ||
53 | } else unregister_code16(keycode); | ||
54 | break; | ||
55 | } | ||
56 | return true; | ||
57 | }; | ||
58 | |||
59 | |||
60 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
61 | |||
62 | // ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 Del Rotary(Mute) | ||
63 | // ~ 1 2 3 4 5 6 7 8 9 0 - (=) BackSpc Home | ||
64 | // Tab Q W E R T Y U I O P [ ] \ PgUp | ||
65 | // Caps A S D F G H J K L ; " Enter PgDn | ||
66 | // Sh_L Z X C V B N M , . ? Sh_R Up End | ||
67 | // Ct_L Win_L Alt_L SPACE Alt_R FN Ct_R Left Down Right | ||
68 | |||
69 | |||
70 | [_BASE] = LAYOUT( | ||
71 | KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_MUTE, | ||
72 | KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME, | ||
73 | KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, | ||
74 | KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, | ||
75 | KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, | ||
76 | KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT | ||
77 | ), | ||
78 | |||
79 | [_FN1] = LAYOUT( | ||
80 | KC_SLEP, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_INS, _______, | ||
81 | RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_HUI, _______, RGB_M_P, | ||
82 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TO(_MO2), RGB_SAD, RGB_SAI, RESET, RGB_M_B, | ||
83 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_RMOD, RGB_MOD, _______, RGB_M_R, | ||
84 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, RGB_M_SW, | ||
85 | _______, KC_WINLK, _______, _______, _______, _______, _______, RGB_SPD, RGB_VAD, RGB_SPI | ||
86 | ), | ||
87 | |||
88 | [_MO2] = LAYOUT( | ||
89 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
90 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
91 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
92 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
93 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
94 | _______, _______, _______, _______, _______, TG(_MO2), _______, _______, _______, _______ | ||
95 | ), | ||
96 | |||
97 | [_MO3] = LAYOUT( | ||
98 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
99 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
100 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
101 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
102 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | ||
103 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ | ||
104 | ), | ||
105 | |||
106 | }; | ||
107 | |||
108 | #ifdef ENCODER_ENABLE // Encoder Functionality | ||
109 | |||
110 | bool encoder_update_user(uint8_t index, bool clockwise) { | ||
111 | |||
112 | switch(get_highest_layer(layer_state)) { | ||
113 | case _FN1: | ||
114 | if ( clockwise ) { | ||
115 | tap_code16(KC_PGDN); | ||
116 | } else { | ||
117 | tap_code16(KC_PGUP); | ||
118 | } | ||
119 | break; | ||
120 | |||
121 | case _MO2: | ||
122 | // Game: Paddle movement | ||
123 | if (damage_count == 0) { | ||
124 | if ( clockwise ) { | ||
125 | if (paddle_pos_full < 15) ++paddle_pos_full; | ||
126 | } else { | ||
127 | if (paddle_pos_full > 0) --paddle_pos_full; | ||
128 | } | ||
129 | } | ||
130 | break; | ||
131 | |||
132 | case _BASE: | ||
133 | default: | ||
134 | if ( clockwise ) { | ||
135 | tap_code(KC_VOLU); | ||
136 | } else { | ||
137 | tap_code(KC_VOLD); | ||
138 | } | ||
139 | break; | ||
140 | } | ||
141 | return true; | ||
142 | } | ||
143 | #endif | ||
144 | |||
145 | #ifdef RGB_MATRIX_ENABLE | ||
146 | void init_ball(uint8_t i) { | ||
147 | i &= 1; | ||
148 | ball[i].on = true; | ||
149 | ball[i].up = false; | ||
150 | ball[i].y = 0; | ||
151 | ball[i].x = rand() % 16; | ||
152 | |||
153 | // Set initial ball state | ||
154 | if (ball[i].x < 8) { | ||
155 | ball[i].left = false; | ||
156 | } else { | ||
157 | ball[i].x -= 4; | ||
158 | ball[i].left = true; | ||
159 | } | ||
160 | |||
161 | // 1/4 chance of being an enemy ball after level 6 | ||
162 | if (level_number > 3) { | ||
163 | ball[i].enemy = ((rand() % 4) == 0); | ||
164 | } else { | ||
165 | ball[i].enemy = false; | ||
166 | } | ||
167 | } | ||
168 | |||
169 | void hurt_paddle(void) { | ||
170 | if (paddle_lives > 0) { | ||
171 | --paddle_lives; | ||
172 | } | ||
173 | damage_timer = timer_read(); | ||
174 | damage_count = 10; | ||
175 | |||
176 | // Reset board | ||
177 | init_ball(0); | ||
178 | ball[1].on = false; | ||
179 | } | ||
180 | |||
181 | // Capslock, Scroll lock and Numlock indicator on Left side lights. | ||
182 | void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { | ||
183 | switch(get_highest_layer(layer_state)) { | ||
184 | case _FN1: | ||
185 | // Light up FN layer keys | ||
186 | if (!fn_active) { | ||
187 | fn_active = true; | ||
188 | rgb_value.r = 0xff; | ||
189 | rgb_value.g = 0x00; | ||
190 | rgb_value.b = 0x00; | ||
191 | } | ||
192 | |||
193 | if (rgb_value.r == 0xff && rgb_value.g < 0xff) { | ||
194 | if (rgb_value.b > 0) { --rgb_value.b; } | ||
195 | else { ++rgb_value.g; } | ||
196 | } else if (rgb_value.g == 0xff && rgb_value.b < 0xff) { | ||
197 | if (rgb_value.r > 0) { --rgb_value.r; } | ||
198 | else { ++rgb_value.b; } | ||
199 | } else if (rgb_value.b == 0xff && rgb_value.r < 0xff) { | ||
200 | if (rgb_value.g > 0) { --rgb_value.g; } | ||
201 | else { ++rgb_value.r; } | ||
202 | } | ||
203 | |||
204 | for (uint8_t i=0; i<sizeof(LED_RGB)/sizeof(LED_RGB[0]); i++) { | ||
205 | rgb_matrix_set_color(LED_RGB[i], rgb_value.r, rgb_value.g, rgb_value.b); | ||
206 | } | ||
207 | |||
208 | for (uint8_t i=0; i<sizeof(LED_WHITE)/sizeof(LED_WHITE[0]); i++) { | ||
209 | rgb_matrix_set_color(LED_WHITE[i], RGB_WHITE); | ||
210 | } | ||
211 | |||
212 | for (uint8_t i=0; i<sizeof(LED_GREEN)/sizeof(LED_GREEN[0]); i++) { | ||
213 | rgb_matrix_set_color(LED_GREEN[i], RGB_GREEN); | ||
214 | } | ||
215 | |||
216 | rgb_matrix_set_color(LED_ESC, RGB_RED); | ||
217 | |||
218 | rgb_matrix_set_color(LED_LWIN, RGB_BLUE); | ||
219 | break; | ||
220 | |||
221 | case _MO2: | ||
222 | // Paddle game | ||
223 | if (!game_start) { | ||
224 | srand((unsigned int)timer_read()); | ||
225 | |||
226 | // Store user light settings | ||
227 | last_hsv = rgb_matrix_get_hsv(); | ||
228 | rgb_matrix_sethsv_noeeprom(0, 0, 0); | ||
229 | |||
230 | rgb_value.r = 0xff; | ||
231 | rgb_value.g = 0x00; | ||
232 | rgb_value.b = 0x00; | ||
233 | |||
234 | paddle_pos_full = 8; | ||
235 | paddle_lives = 4; | ||
236 | bounce_count = 0; | ||
237 | level_number = 0; | ||
238 | damage_count = 0; | ||
239 | |||
240 | init_ball(0); | ||
241 | ball[1].on = false; | ||
242 | ball_timer = timer_read(); | ||
243 | |||
244 | game_start = true; | ||
245 | } | ||
246 | |||
247 | // Set level indicator | ||
248 | if (level_number < 12) { | ||
249 | rgb_matrix_set_color(GAME_R0[level_number], RGB_BLUE); | ||
250 | } | ||
251 | |||
252 | // Set life bar | ||
253 | for (uint8_t i=0; i < paddle_lives ; i++) { | ||
254 | rgb_matrix_set_color(GAME_LIVES[i], RGB_GREEN); | ||
255 | } | ||
256 | |||
257 | uint8_t paddle_pos = paddle_pos_full >> 1; | ||
258 | |||
259 | if (damage_count > 0) { | ||
260 | // Flash paddle when receiving damage | ||
261 | if (timer_elapsed(damage_timer) > 500) { | ||
262 | --damage_count; | ||
263 | damage_timer = timer_read(); | ||
264 | } | ||
265 | if ((damage_count & 1) == 0) { | ||
266 | for (uint8_t i=0; i < 3 ; i++) { | ||
267 | rgb_matrix_set_color(GAME_PADDLE[paddle_pos + i], RGB_RED); | ||
268 | } | ||
269 | } | ||
270 | if (damage_count == 0) { | ||
271 | ball_timer = timer_read(); | ||
272 | } | ||
273 | |||
274 | |||
275 | } else if (paddle_lives == 0) { | ||
276 | // Game over | ||
277 | for (uint8_t i=0; i<sizeof(LED_GAME_OVER)/sizeof(LED_GAME_OVER[0]); i++) { | ||
278 | rgb_matrix_set_color(LED_GAME_OVER[i], RGB_RED); | ||
279 | } | ||
280 | |||
281 | } else if (level_number >= 12) { | ||
282 | // You win | ||
283 | if (rgb_value.r == 0xff && rgb_value.g < 0xff) { | ||
284 | if (rgb_value.b > 0) { --rgb_value.b; } | ||
285 | else { ++rgb_value.g; } | ||
286 | } else if (rgb_value.g == 0xff && rgb_value.b < 0xff) { | ||
287 | if (rgb_value.r > 0) { --rgb_value.r; } | ||
288 | else { ++rgb_value.b; } | ||
289 | } else if (rgb_value.b == 0xff && rgb_value.r < 0xff) { | ||
290 | if (rgb_value.g > 0) { --rgb_value.g; } | ||
291 | else { ++rgb_value.r; } | ||
292 | } | ||
293 | |||
294 | for (uint8_t i=0; i < 3 ; i++) { | ||
295 | rgb_matrix_set_color(GAME_PADDLE[paddle_pos + i], rgb_value.r, rgb_value.g, rgb_value.b); | ||
296 | } | ||
297 | rgb_matrix_set_color(GAME_SMILE1[paddle_pos], rgb_value.r, rgb_value.g, rgb_value.b); | ||
298 | rgb_matrix_set_color(GAME_SMILE1[paddle_pos + 3], rgb_value.r, rgb_value.g, rgb_value.b); | ||
299 | rgb_matrix_set_color(GAME_SMILE2[paddle_pos], rgb_value.r, rgb_value.g, rgb_value.b); | ||
300 | rgb_matrix_set_color(GAME_SMILE2[paddle_pos + 3], rgb_value.r, rgb_value.g, rgb_value.b); | ||
301 | |||
302 | } else { | ||
303 | // normal game loop | ||
304 | |||
305 | // Set paddle position | ||
306 | for (uint8_t i=0; i < 3 ; i++) { | ||
307 | rgb_matrix_set_color(GAME_PADDLE[paddle_pos + i], RGB_GREEN); | ||
308 | } | ||
309 | |||
310 | // Ball movement logic happens at intervals | ||
311 | if (timer_elapsed(ball_timer) > GAME_TIMER[level_number]) { | ||
312 | for (int i=0; i<2; ++i) { | ||
313 | if (ball[i].on) { | ||
314 | // Ball movement | ||
315 | if (ball[i].up) { | ||
316 | if (ball[i].y > 0) { | ||
317 | --ball[i].y; | ||
318 | if (!ball[i].left) ++ball[i].x; | ||
319 | } else { | ||
320 | // Count reflections. If > 10, increase level | ||
321 | ++bounce_count; | ||
322 | if (bounce_count >= 10) { | ||
323 | bounce_count = 0; | ||
324 | ++level_number; | ||
325 | } | ||
326 | ball[i].on = false; | ||
327 | } | ||
328 | } else { | ||
329 | ++ball[i].y; | ||
330 | if (ball[i].left) --ball[i].x; | ||
331 | if (ball[i].y > 4) { | ||
332 | // Remove a life if ball isn't returned and isn't enemy | ||
333 | if (!ball[i].enemy) { | ||
334 | hurt_paddle(); | ||
335 | i = 2; | ||
336 | } else { | ||
337 | ball[i].on = false; | ||
338 | } | ||
339 | } | ||
340 | } | ||
341 | } | ||
342 | } | ||
343 | if (ball[0].y == 4 && !ball[1].on) { | ||
344 | init_ball(1); | ||
345 | } | ||
346 | if (ball[1].y == 4 && !ball[0].on) { | ||
347 | init_ball(0); | ||
348 | } | ||
349 | if (!ball[0].on && !ball[1].on) { | ||
350 | init_ball(0); | ||
351 | } | ||
352 | ball_timer = timer_read(); | ||
353 | } | ||
354 | |||
355 | // Other ball stuff | ||
356 | for (int i=0; i<2; ++i) { | ||
357 | if (ball[i].on) { | ||
358 | // Ball deflection logic | ||
359 | if (!ball[i].up && ball[i].y == 4 && (ball[i].x == paddle_pos || ball[i].x == paddle_pos - 1 || ball[i].x == paddle_pos + 1)) { | ||
360 | if (!ball[i].enemy) { | ||
361 | --ball[i].y; | ||
362 | if (!ball[i].left) { ++ball[i].x; } | ||
363 | ball[i].up = true; | ||
364 | } else { | ||
365 | hurt_paddle(); | ||
366 | i = 2; | ||
367 | } | ||
368 | } | ||
369 | |||
370 | // Ball display | ||
371 | switch (ball[i].y) { | ||
372 | case 0: | ||
373 | if (ball[i].enemy) { | ||
374 | rgb_matrix_set_color(GAME_R0[ball[i].x], RGB_RED); | ||
375 | } else { | ||
376 | rgb_matrix_set_color(GAME_R0[ball[i].x], RGB_WHITE); | ||
377 | } | ||
378 | break; | ||
379 | |||
380 | case 1: | ||
381 | if (ball[i].enemy) { | ||
382 | rgb_matrix_set_color(GAME_R1[ball[i].x], RGB_RED); | ||
383 | } else { | ||
384 | rgb_matrix_set_color(GAME_R1[ball[i].x], RGB_WHITE); | ||
385 | } | ||
386 | break; | ||
387 | |||
388 | case 2: | ||
389 | if (ball[i].enemy) { | ||
390 | rgb_matrix_set_color(GAME_R2[ball[i].x], RGB_RED); | ||
391 | } else { | ||
392 | rgb_matrix_set_color(GAME_R2[ball[i].x], RGB_WHITE); | ||
393 | } | ||
394 | break; | ||
395 | |||
396 | case 3: | ||
397 | if (ball[i].enemy) { | ||
398 | rgb_matrix_set_color(GAME_R3[ball[i].x], RGB_RED); | ||
399 | } else { | ||
400 | rgb_matrix_set_color(GAME_R3[ball[i].x], RGB_WHITE); | ||
401 | } | ||
402 | break; | ||
403 | |||
404 | case 4: | ||
405 | if (ball[i].enemy) { | ||
406 | rgb_matrix_set_color(GAME_R4[ball[i].x], RGB_RED); | ||
407 | } else { | ||
408 | rgb_matrix_set_color(GAME_R4[ball[i].x], RGB_WHITE); | ||
409 | } | ||
410 | break; | ||
411 | } | ||
412 | } | ||
413 | } | ||
414 | } | ||
415 | |||
416 | |||
417 | break; | ||
418 | |||
419 | default: | ||
420 | fn_active = false; | ||
421 | if (game_start) { | ||
422 | // Reset lighting settings | ||
423 | game_start = false; | ||
424 | rgb_matrix_sethsv_noeeprom(last_hsv.h, last_hsv.s, last_hsv.v); | ||
425 | } | ||
426 | break; | ||
427 | } | ||
428 | |||
429 | if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) { | ||
430 | if (!caps_active) { | ||
431 | caps_active = true; | ||
432 | caps_flash_on = true; | ||
433 | caps_flasher = timer_read(); | ||
434 | } | ||
435 | if (timer_elapsed(caps_flasher) > 500) { | ||
436 | caps_flasher = timer_read(); | ||
437 | caps_flash_on = !caps_flash_on; | ||
438 | } | ||
439 | |||
440 | rgb_matrix_set_color(LED_CAPS, RGB_WHITE); | ||
441 | if (caps_flash_on) { | ||
442 | for (uint8_t i=0; i<sizeof(LED_SIDE_LEFT)/sizeof(LED_SIDE_LEFT[0]); i++) { | ||
443 | rgb_matrix_set_color(LED_SIDE_LEFT[i], RGB_RED); | ||
444 | rgb_matrix_set_color(LED_SIDE_RIGHT[i], RGB_RED); | ||
445 | } | ||
446 | } else { | ||
447 | for (uint8_t i=0; i<sizeof(LED_SIDE_LEFT)/sizeof(LED_SIDE_LEFT[0]); i++) { | ||
448 | rgb_matrix_set_color(LED_SIDE_LEFT[i], 0, 0, 0); | ||
449 | rgb_matrix_set_color(LED_SIDE_RIGHT[i], 0, 0, 0); | ||
450 | } | ||
451 | } | ||
452 | } else { | ||
453 | caps_active = false; | ||
454 | } | ||
455 | if (IS_HOST_LED_ON(USB_LED_SCROLL_LOCK)) { | ||
456 | rgb_matrix_set_color(LED_F10, RGB_WHITE); | ||
457 | } | ||
458 | if (keymap_config.no_gui) { | ||
459 | rgb_matrix_set_color(LED_LWIN, RGB_RED); //light up Win key when disabled | ||
460 | } | ||
461 | } | ||
462 | |||
463 | #endif | ||
464 | |||
465 | void keyboard_post_init_user(void) { | ||
466 | |||
467 | #ifdef RGB_MATRIX_ENABLE | ||
468 | rgb_matrix_set_color_all(RGB_RED); // Default startup colour | ||
469 | #endif | ||
470 | |||
471 | } | ||
diff --git a/keyboards/gmmk/pro/ansi/keymaps/paddlegame/paddlegame.h b/keyboards/gmmk/pro/ansi/keymaps/paddlegame/paddlegame.h new file mode 100644 index 000000000..27df2dd70 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/paddlegame/paddlegame.h | |||
@@ -0,0 +1,46 @@ | |||
1 | /* Copyright 2021 Glorious, LLC <salman@pcgamingrace.com> | ||
2 | Copyright 2021 Tomas Guinan | ||
3 | |||
4 | This program is free software: you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Public License as published by | ||
6 | the Free Software Foundation, either version 2 of the License, or | ||
7 | (at your option) any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | */ | ||
17 | |||
18 | |||
19 | const uint16_t GAME_TIMER[] = { | ||
20 | 400, 350, 300, 250, 400, 350, 300, 250, 225, 200, 175, 150 | ||
21 | }; | ||
22 | |||
23 | bool game_start = false; | ||
24 | HSV last_hsv; | ||
25 | static uint8_t paddle_pos_full; | ||
26 | static uint8_t paddle_lives; | ||
27 | static uint8_t level_number; | ||
28 | static uint8_t bounce_count; | ||
29 | static uint8_t damage_count; | ||
30 | static uint16_t damage_timer; | ||
31 | static uint16_t ball_timer; | ||
32 | |||
33 | struct BallStruct | ||
34 | { | ||
35 | uint8_t x; | ||
36 | uint8_t y; | ||
37 | bool on; | ||
38 | bool up; | ||
39 | bool left; | ||
40 | bool enemy; | ||
41 | }; | ||
42 | |||
43 | struct BallStruct ball[2]; | ||
44 | |||
45 | void init_ball(uint8_t i); | ||
46 | void hurt_paddle(void); \ No newline at end of file | ||
diff --git a/keyboards/gmmk/pro/ansi/keymaps/paddlegame/readme.md b/keyboards/gmmk/pro/ansi/keymaps/paddlegame/readme.md new file mode 100644 index 000000000..c6da7f5f4 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/paddlegame/readme.md | |||
@@ -0,0 +1,18 @@ | |||
1 |  | ||
2 | |||
3 | # Paddle Game GMMK Pro layout by Tomas Guinan | ||
4 | |||
5 | - Add Print Screen, Scroll Lock, Pause/Break, Insert to Fn layer | ||
6 | - Toggle backlight using Fn+` | ||
7 | - If you don't like using a backlight but wnat to play the paddle game or | ||
8 | use other RGB features, turn RGB on and set brightness to 0 | ||
9 | - Usable Fn layer keys are backlit | ||
10 | - Implement Win key lock using Fn+Win like in Glorious Core firmware | ||
11 | - Caps Lock and Scroll Lock keys light up white when active | ||
12 | - Caps Lock has red flashing side lights like in Glorious Core firmware | ||
13 | - Layer 2 includes Paddle Game, playable by pressing Fn+P | ||
14 | - Use rotary encoder to control paddle | ||
15 | - Contains 12 levels, indicated by blue LED on F row | ||
16 | - Player has 4 lives, indicated by nav cluster | ||
17 | - Deflect white balls while avoiding red ones | ||
18 | - Press Fn to quit game | ||
diff --git a/keyboards/gmmk/pro/ansi/keymaps/paddlegame/rgb_matrix_map.h b/keyboards/gmmk/pro/ansi/keymaps/paddlegame/rgb_matrix_map.h new file mode 100644 index 000000000..06d34ba6c --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/paddlegame/rgb_matrix_map.h | |||
@@ -0,0 +1,181 @@ | |||
1 | /* Copyright 2021 Tomas Guinan | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 2 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | |||
18 | #ifdef RGB_MATRIX_ENABLE | ||
19 | |||
20 | bool fn_active = false; | ||
21 | bool caps_active = false; | ||
22 | bool caps_flash_on = false; | ||
23 | |||
24 | static uint16_t caps_flasher = 0; | ||
25 | RGB rgb_value; | ||
26 | |||
27 | // RGB LED locations | ||
28 | enum led_location_map { | ||
29 | LED_ESC, // 0, ESC, k13 | ||
30 | LED_GRV, // 1, ~, k16 | ||
31 | LEB_TAB, // 2, Tab, k11 | ||
32 | LED_CAPS, // 3, Caps, k21 | ||
33 | LED_LSFT, // 4, Sh_L, k00 | ||
34 | LED_LCTL, // 5, Ct_L, k06 | ||
35 | LED_F1, // 6, F1, k26 | ||
36 | LED_1, // 7, 1, k17 | ||
37 | LED_Q, // 8, Q, k10 | ||
38 | LED_A, // 9, A, k12 | ||
39 | LED_Z, // 10, Z, k14 | ||
40 | LED_LWIN, // 11, Win_L, k90 | ||
41 | LED_F2, // 12, F2, k36 | ||
42 | LED_2, // 13, 2, k27 | ||
43 | LED_W, // 14, W, k20 | ||
44 | LED_S, // 15, S, k22 | ||
45 | LED_X, // 16, X, k24 | ||
46 | LED_LALT, // 17, Alt_L, k93 | ||
47 | LED_F3, // 18, F3, k31 | ||
48 | LED_3, // 19, 3, k37 | ||
49 | LED_E, // 20, E, k30 | ||
50 | LED_D, // 21, D, k32 | ||
51 | LED_C, // 22, C, k34 | ||
52 | LED_F4, // 23, F4, k33 | ||
53 | LED_4, // 24, 4, k47 | ||
54 | LED_R, // 25, R, k40 | ||
55 | LED_F, // 26, F, k42 | ||
56 | LED_V, // 27, V, k44 | ||
57 | LED_F5, // 28, F5, k07 | ||
58 | LED_5, // 29, 5, k46 | ||
59 | LED_T, // 30, T, k41 | ||
60 | LED_G, // 31, G, k43 | ||
61 | LED_B, // 32, B, k45 | ||
62 | LED_SPC, // 33, SPACE, k94 | ||
63 | LED_F6, // 34, F6, k63 | ||
64 | LED_6, // 35, 6, k56 | ||
65 | LED_Y, // 36, Y, k51 | ||
66 | LED_H, // 37, H, k53 | ||
67 | LED_N, // 38, N, k55 | ||
68 | LED_F7, // 39, F7, k71 | ||
69 | LED_7, // 40, 7, k57 | ||
70 | LED_U, // 41, U, k50 | ||
71 | LED_J, // 42, J, k52 | ||
72 | LED_M, // 43, M, k54 | ||
73 | LED_F8, // 44, F8, k76 | ||
74 | LED_8, // 45, 8, k67 | ||
75 | LED_I, // 46, I, k60 | ||
76 | LED_K, // 47, K, k62 | ||
77 | LED_COMM, // 48, ,, k64 | ||
78 | LED_RALT, // 49, Alt_R, k95 | ||
79 | LED_F9, // 50, F9, ka6 | ||
80 | LED_9, // 51, 9, k77 | ||
81 | LED_O, // 52, O, k70 | ||
82 | LED_L, // 53, L, k72 | ||
83 | LED_DOT, // 54, ., k74 | ||
84 | LED_FN, // 55, FN, k92 | ||
85 | LED_F10, // 56, F10, ka7 | ||
86 | LED_0, // 57, 0, k87 | ||
87 | LED_P, // 58, P, k80 | ||
88 | LED_SCLN, // 59, ;, k82 | ||
89 | LED_SLSH, // 60, ?, k85 | ||
90 | LED_F11, // 61, F11, ka3 | ||
91 | LED_MINS, // 62, -, k86 | ||
92 | LED_LBRC, // 63, [, k81 | ||
93 | LED_QUOT, // 64, ", k83 | ||
94 | LED_RCTL, // 65, Ct_R, k04 | ||
95 | LED_F12, // 66, F12, ka5 | ||
96 | LED_L1, // 67, LED, l01 | ||
97 | LED_R1, // 68, LED, l11 | ||
98 | LED_DEL, // 69, Del, k97 | ||
99 | LED_L2, // 70, LED, l02 | ||
100 | LED_R2, // 71, LED, l12 | ||
101 | LED_HOME, // 72, Home, k65 | ||
102 | LED_L3, // 73, LED, l03 | ||
103 | LED_R3, // 74, LED, l13 | ||
104 | LED_PGUP, // 75, PgUp, k15 | ||
105 | LED_L4, // 76, LED, l04 | ||
106 | LED_R4, // 77, LED, l14 | ||
107 | LED_EQL, // 78, =, k66 | ||
108 | LED_RIGHT, // 79, Right, k05 | ||
109 | LED_L5, // 80, LED, l05 | ||
110 | LED_R5, // 81, LED, l15 | ||
111 | LED_END, // 82, End, k75 | ||
112 | LED_L6, // 83, LED, l06 | ||
113 | LED_R6, // 84, LED, l16 | ||
114 | LED_BSPC, // 85, BSpc, ka1 | ||
115 | LED_PGDN, // 86, PgDn, k25 | ||
116 | LED_L7, // 87, LED, l07 | ||
117 | LED_R7, // 88, LED, l17 | ||
118 | LED_RBRC, // 89, ], k61 | ||
119 | LED_RSFT, // 90, Sh_R, k91 | ||
120 | LED_L8, // 91, LED, l08 | ||
121 | LED_R8, // 92, LED, l18 | ||
122 | LED_BSLS, // 93, \, ka2 | ||
123 | LED_UP, // 94, Up, k35 | ||
124 | LED_LEFT, // 95, Left, k03 | ||
125 | LED_ENT, // 96, Enter, ka4 | ||
126 | LED_DOWN // 97, Down, k73 | ||
127 | }; | ||
128 | |||
129 | const uint8_t LED_RGB[] = { | ||
130 | LED_MINS, LED_EQL, | ||
131 | LED_LBRC, LED_RBRC, | ||
132 | LED_SCLN, LED_QUOT, | ||
133 | LED_HOME, LED_PGUP, LED_PGDN, LED_END, | ||
134 | LED_UP, LED_DOWN, LED_LEFT, LED_RIGHT | ||
135 | }; | ||
136 | |||
137 | const uint8_t LED_GREEN[] = { | ||
138 | LED_F1, LED_F2, LED_F3, LED_F4, | ||
139 | LED_F5, LED_F6, LED_F7, LED_F8 | ||
140 | }; | ||
141 | |||
142 | const uint8_t LED_WHITE[] = { | ||
143 | LED_F9, LED_F10, LED_F11, LED_DEL | ||
144 | }; | ||
145 | |||
146 | const uint8_t LED_SIDE_LEFT[] = { LED_L1, LED_L2, LED_L3, LED_L4, LED_L5, LED_L6, LED_L7, LED_L8}; | ||
147 | |||
148 | const uint8_t LED_SIDE_RIGHT[] = { LED_R1, LED_R2, LED_R3, LED_R4, LED_R5, LED_R6, LED_R7, LED_R8}; | ||
149 | |||
150 | // Breakout LED rules | ||
151 | |||
152 | const uint8_t GAME_LIVES[] = { LED_HOME, LED_PGUP, LED_PGDN, LED_END }; | ||
153 | const uint8_t GAME_PADDLE[] = { | ||
154 | LED_Z, LED_X, LED_C, LED_V, LED_B, LED_N, LED_M, LED_COMM, LED_DOT, LED_SLSH | ||
155 | }; | ||
156 | const uint8_t GAME_SMILE1[] = { | ||
157 | LED_A, LED_S, LED_D, LED_F, LED_G, LED_H, LED_J, LED_K, LED_L, LED_SCLN, LED_QUOT | ||
158 | }; | ||
159 | const uint8_t GAME_SMILE2[] = { | ||
160 | LED_2, LED_3, LED_4, LED_5, LED_6, LED_7, LED_8, LED_9, LED_0, LED_MINS, LED_EQL | ||
161 | }; | ||
162 | const uint8_t GAME_R4[] = { | ||
163 | LED_X, LED_C, LED_V, LED_B, LED_N, LED_M, LED_COMM, LED_DOT | ||
164 | }; | ||
165 | const uint8_t GAME_R3[] = { | ||
166 | LED_S, LED_D, LED_F, LED_G, LED_H, LED_J, LED_K, LED_L, LED_SCLN | ||
167 | }; | ||
168 | const uint8_t GAME_R2[] = { | ||
169 | LED_W, LED_E, LED_R, LED_T, LED_Y, LED_U, LED_I, LED_O, LED_P, LED_LBRC | ||
170 | }; | ||
171 | const uint8_t GAME_R1[] = { | ||
172 | LED_2, LED_3, LED_4, LED_5, LED_6, LED_7, LED_8, LED_9, LED_0, LED_MINS, LED_EQL | ||
173 | }; | ||
174 | const uint8_t GAME_R0[] = { | ||
175 | LED_F1, LED_F2, LED_F3, LED_F4, LED_F5, LED_F6, LED_F7, LED_F8, LED_F9, LED_F10, LED_F11, LED_F12 | ||
176 | }; | ||
177 | |||
178 | const uint8_t LED_GAME_OVER[] = { LED_5, LED_8, LED_F, LED_G, LED_H, LED_J, LED_C, LED_M }; | ||
179 | |||
180 | |||
181 | #endif \ No newline at end of file | ||
diff --git a/keyboards/gmmk/pro/ansi/keymaps/paddlegame/rules.mk b/keyboards/gmmk/pro/ansi/keymaps/paddlegame/rules.mk new file mode 100644 index 000000000..925d8a5a5 --- /dev/null +++ b/keyboards/gmmk/pro/ansi/keymaps/paddlegame/rules.mk | |||
@@ -0,0 +1,4 @@ | |||
1 | MOUSEKEY_ENABLE = no | ||
2 | BOOTMAGIC_ENABLE = lite | ||
3 | RGB_MATRIX_ENABLE = yes | ||
4 | ENCODER_ENABLE = yes | ||