/* Copyright (C) 2015-2019 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 "controls.h" static void restoreDefaults(void); static const char *controlName[CONTROL_MAX]; static Widget *controlWidget[CONTROL_MAX]; static char *CONTROLS_TEXT; static char *HELP_TEXT; static char *BACKSPACE_TEXT; static char *ESCAPE_TEXT; void initControls(void) { int i; controlName[CONTROL_FIRE] = _("Fire"); controlName[CONTROL_ACCELERATE] = _("Accelerate"); controlName[CONTROL_BOOST] = _("Boost"); controlName[CONTROL_ECM] = _("ECM"); controlName[CONTROL_BRAKE] = _("Brake"); controlName[CONTROL_TARGET] = _("Select Target"); controlName[CONTROL_MISSILE] = _("Fire Missile"); controlName[CONTROL_GUNS] = _("Cycle Guns"); controlName[CONTROL_RADAR] = _("Cycle Radar"); controlName[CONTROL_NEXT_FIGHTER] = _("Next Fighter"); controlName[CONTROL_PREV_FIGHTER] = _("Previous Fighter"); controlName[CONTROL_SCREENSHOT] = _("Screenshot"); for (i = 0 ; i < CONTROL_MAX ; i++) { controlWidget[i] = getWidget(getLookupName("CONTROL_", i), "controls"); controlWidget[i]->numOptions = 2; controlWidget[i]->options = malloc(2 * sizeof(char*)); controlWidget[i]->options[0] = malloc(sizeof(char) * MAX_NAME_LENGTH); controlWidget[i]->options[1] = malloc(sizeof(char) * MAX_NAME_LENGTH); strcpy(controlWidget[i]->options[0], ""); strcpy(controlWidget[i]->options[1], ""); } CONTROLS_TEXT = _("Controls"); HELP_TEXT = _("Click a control to change it, and then the key or mouse button you want to use."); BACKSPACE_TEXT = _("[BACKSPACE] - Clear"); ESCAPE_TEXT = _("[ESCAPE] - Cancel"); } void initControlsDisplay(void) { int i; for (i = 0 ; i < CONTROL_MAX ; i++) { strcpy(controlWidget[i]->options[0], ""); strcpy(controlWidget[i]->options[1], ""); if (app.keyControls[i] != 0) { sprintf(controlWidget[i]->options[0], "%s", SDL_GetScancodeName(app.keyControls[i])); } if (app.mouseControls[i] != 0) { sprintf(controlWidget[i]->options[1], "Btn %d", app.mouseControls[i]); } } getWidget("restore", "controls")->action = restoreDefaults; } int isControl(int type) { int key = app.keyControls[type]; int btn = app.mouseControls[type]; return ((key != 0 && app.keyboard[key]) || (btn != 0 && app.mouse.button[btn])); } int isAcceptControl(void) { return (app.keyboard[SDL_SCANCODE_SPACE] ||app.keyboard[SDL_SCANCODE_RETURN] || isControl(CONTROL_FIRE)); } void clearControl(int type) { int key = app.keyControls[type]; int btn = app.mouseControls[type]; if (key != 0) { app.keyboard[key] = 0; } if (btn != 0) { app.mouse.button[btn] = 0; } } void resetAcceptControls(void) { app.keyboard[SDL_SCANCODE_SPACE] = app.keyboard[SDL_SCANCODE_RETURN] = 0; clearControl(CONTROL_FIRE); } void updateControlKey(char *name) { app.keyControls[lookup(name)] = app.lastKeyPressed; initControlsDisplay(); } void updateControlButton(char *name) { app.mouseControls[lookup(name)] = app.lastButtonPressed; initControlsDisplay(); } void clearControlConfig(char *name) { int i; i = lookup(name); app.keyControls[i] = app.mouseControls[i] = 0; initControlsDisplay(); } void drawControls(void) { int i; SDL_Rect r; SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 128); SDL_RenderFillRect(app.renderer, NULL); SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_NONE); SDL_SetRenderTarget(app.renderer, app.uiBuffer); r.w = 800; r.h = 650; r.x = (UI_WIDTH / 2) - r.w / 2; r.y = (UI_HEIGHT / 2) - r.h / 2; SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 255); SDL_RenderFillRect(app.renderer, &r); SDL_SetRenderDrawColor(app.renderer, 200, 200, 200, 255); SDL_RenderDrawRect(app.renderer, &r); drawText(UI_WIDTH / 2, 50, 28, TA_CENTER, colors.white, CONTROLS_TEXT); SDL_SetRenderDrawColor(app.renderer, 128, 128, 128, 255); SDL_RenderDrawLine(app.renderer, r.x, r.y + 65, r.x + r.w, r.y + 65); r.x += 25; r.y = 125; for (i = 0 ; i < CONTROL_MAX ; i++) { drawText(r.x, r.y + 2, 20, TA_LEFT, colors.white, controlName[i]); controlWidget[i]->rect.x = r.x + 175; controlWidget[i]->rect.y = r.y; r.y += 65; if (r.y > 500) { r.y = 125; r.x += 400; } } drawText((UI_WIDTH / 2) - 50, 525, 16, TA_RIGHT, colors.white, BACKSPACE_TEXT); drawText((UI_WIDTH / 2) + 50, 525, 16, TA_LEFT, colors.white, ESCAPE_TEXT); app.textWidth = r.w - 100; drawText(UI_WIDTH / 2, 560, 16, TA_CENTER, colors.white, HELP_TEXT); app.textWidth = 0; drawWidgets("controls"); SDL_SetRenderTarget(app.renderer, app.backBuffer); } static void restoreDefaults(void) { int i; cJSON *root, *controlsJSON, *node; char *text; text = readFile("data/app/"CONFIG_FILENAME); root = cJSON_Parse(text); controlsJSON = cJSON_GetObjectItem(root, "controls"); if (controlsJSON) { node = cJSON_GetObjectItem(controlsJSON, "keys")->child; while (node) { i = lookup(node->string); app.keyControls[i] = node->valueint; node = node->next; } node = cJSON_GetObjectItem(controlsJSON, "mouse")->child; while (node) { i = lookup(node->string); app.mouseControls[i] = node->valueint; node = node->next; } } cJSON_Delete(root); free(text); initControlsDisplay(); }