Set and save control options.

This commit is contained in:
Steve 2018-02-20 19:24:17 +00:00
parent f5bf3ddcaa
commit 59e8b08fdc
3 changed files with 152 additions and 59 deletions

View File

@ -73,27 +73,27 @@ static void setGeneralOptions(void)
{ {
soundVolumeWidget = getWidget("soundVolume", "options"); soundVolumeWidget = getWidget("soundVolume", "options");
soundVolumeWidget->action = soundVolume; soundVolumeWidget->action = soundVolume;
soundVolumeWidget->value = app.config.soundVolume; soundVolumeWidget->value[0] = app.config.soundVolume;
musicVolumeWidget = getWidget("musicVolume", "options"); musicVolumeWidget = getWidget("musicVolume", "options");
musicVolumeWidget->action = musicVolume; musicVolumeWidget->action = musicVolume;
musicVolumeWidget->value = app.config.musicVolume; musicVolumeWidget->value[0] = app.config.musicVolume;
bloodGoreWidget = getWidget("bloodGore", "options"); bloodGoreWidget = getWidget("bloodGore", "options");
bloodGoreWidget->action = bloodGore; bloodGoreWidget->action = bloodGore;
bloodGoreWidget->value = app.config.blood; bloodGoreWidget->value[0] = app.config.blood;
trophyScreenshotWidget = getWidget("trophyScreenshot", "options"); trophyScreenshotWidget = getWidget("trophyScreenshot", "options");
trophyScreenshotWidget->action = trophyScreenshot; trophyScreenshotWidget->action = trophyScreenshot;
trophyScreenshotWidget->value = app.config.trophyScreenshot; trophyScreenshotWidget->value[0] = app.config.trophyScreenshot;
trophyAlertWidget = getWidget("trophyAlert", "options"); trophyAlertWidget = getWidget("trophyAlert", "options");
trophyAlertWidget->action = trophyAlert; trophyAlertWidget->action = trophyAlert;
trophyAlertWidget->value = app.config.trophyAlert; trophyAlertWidget->value[0] = app.config.trophyAlert;
inventoryWidget = getWidget("inventory", "options"); inventoryWidget = getWidget("inventory", "options");
inventoryWidget->action = inventory; inventoryWidget->action = inventory;
inventoryWidget->value = app.config.inventory; inventoryWidget->value[0] = app.config.inventory;
controlsWidget = getWidget("controls", "options"); controlsWidget = getWidget("controls", "options");
controlsWidget->action = controls; controlsWidget->action = controls;
@ -104,15 +104,25 @@ static void setGeneralOptions(void)
static void setControlOptions(void) static void setControlOptions(void)
{ {
getWidget("left", "controls")->value = app.config.keyControls[CONTROL_LEFT]; getWidget("left", "controls")->value[0] = app.config.keyControls[CONTROL_LEFT];
getWidget("right", "controls")->value = app.config.keyControls[CONTROL_RIGHT]; getWidget("right", "controls")->value[0] = app.config.keyControls[CONTROL_RIGHT];
getWidget("up", "controls")->value = app.config.keyControls[CONTROL_UP]; getWidget("up", "controls")->value[0] = app.config.keyControls[CONTROL_UP];
getWidget("down", "controls")->value = app.config.keyControls[CONTROL_DOWN]; getWidget("down", "controls")->value[0] = app.config.keyControls[CONTROL_DOWN];
getWidget("jump", "controls")->value = app.config.keyControls[CONTROL_JUMP]; getWidget("jump", "controls")->value[0] = app.config.keyControls[CONTROL_JUMP];
getWidget("fire", "controls")->value = app.config.keyControls[CONTROL_FIRE]; getWidget("fire", "controls")->value[0] = app.config.keyControls[CONTROL_FIRE];
getWidget("jetpack", "controls")->value = app.config.keyControls[CONTROL_JETPACK]; getWidget("jetpack", "controls")->value[0] = app.config.keyControls[CONTROL_JETPACK];
getWidget("pause", "controls")->value = app.config.keyControls[CONTROL_PAUSE]; getWidget("pause", "controls")->value[0] = app.config.keyControls[CONTROL_PAUSE];
getWidget("map", "controls")->value = app.config.keyControls[CONTROL_MAP]; getWidget("map", "controls")->value[0] = app.config.keyControls[CONTROL_MAP];
getWidget("left", "controls")->value[1] = app.config.joypadControls[CONTROL_LEFT];
getWidget("right", "controls")->value[1] = app.config.joypadControls[CONTROL_RIGHT];
getWidget("up", "controls")->value[1] = app.config.joypadControls[CONTROL_UP];
getWidget("down", "controls")->value[1] = app.config.joypadControls[CONTROL_DOWN];
getWidget("jump", "controls")->value[1] = app.config.joypadControls[CONTROL_JUMP];
getWidget("fire", "controls")->value[1] = app.config.joypadControls[CONTROL_FIRE];
getWidget("jetpack", "controls")->value[1] = app.config.joypadControls[CONTROL_JETPACK];
getWidget("pause", "controls")->value[1] = app.config.joypadControls[CONTROL_PAUSE];
getWidget("map", "controls")->value[1] = app.config.joypadControls[CONTROL_MAP];
} }
static void logic(void) static void logic(void)
@ -135,36 +145,36 @@ static void draw(void)
static void soundVolume(void) static void soundVolume(void)
{ {
app.config.soundVolume = soundVolumeWidget->value; app.config.soundVolume = soundVolumeWidget->value[0];
Mix_Volume(-1, app.config.soundVolume); Mix_Volume(-1, app.config.soundVolume);
} }
static void musicVolume(void) static void musicVolume(void)
{ {
app.config.musicVolume = musicVolumeWidget->value; app.config.musicVolume = musicVolumeWidget->value[0];
Mix_VolumeMusic(app.config.musicVolume); Mix_VolumeMusic(app.config.musicVolume);
} }
static void bloodGore(void) static void bloodGore(void)
{ {
app.config.blood = bloodGoreWidget->value; app.config.blood = bloodGoreWidget->value[0];
} }
static void trophyScreenshot(void) static void trophyScreenshot(void)
{ {
app.config.trophyScreenshot = trophyScreenshotWidget->value; app.config.trophyScreenshot = trophyScreenshotWidget->value[0];
} }
static void trophyAlert(void) static void trophyAlert(void)
{ {
app.config.trophyAlert = trophyAlertWidget->value; app.config.trophyAlert = trophyAlertWidget->value[0];
} }
static void inventory(void) static void inventory(void)
{ {
app.config.inventory = inventoryWidget->value; app.config.inventory = inventoryWidget->value[0];
} }
static void controls(void) static void controls(void)
@ -176,6 +186,27 @@ static void controls(void)
showWidgetGroup("controls"); showWidgetGroup("controls");
} }
static void updateControlConfig(void)
{
app.config.keyControls[CONTROL_LEFT] = getWidget("left", "controls")->value[0];
app.config.keyControls[CONTROL_RIGHT] = getWidget("right", "controls")->value[0];
app.config.keyControls[CONTROL_UP] = getWidget("up", "controls")->value[0];
app.config.keyControls[CONTROL_DOWN] = getWidget("down", "controls")->value[0];
app.config.keyControls[CONTROL_JUMP] = getWidget("jump", "controls")->value[0];
app.config.keyControls[CONTROL_FIRE] = getWidget("fire", "controls")->value[0];
app.config.keyControls[CONTROL_MAP] = getWidget("map", "controls")->value[0];
app.config.keyControls[CONTROL_PAUSE] = getWidget("pause", "controls")->value[0];
app.config.joypadControls[CONTROL_LEFT] = getWidget("left", "controls")->value[1];
app.config.joypadControls[CONTROL_RIGHT] = getWidget("right", "controls")->value[1];
app.config.joypadControls[CONTROL_UP] = getWidget("up", "controls")->value[1];
app.config.joypadControls[CONTROL_DOWN] = getWidget("down", "controls")->value[1];
app.config.joypadControls[CONTROL_JUMP] = getWidget("jump", "controls")->value[1];
app.config.joypadControls[CONTROL_FIRE] = getWidget("fire", "controls")->value[1];
app.config.joypadControls[CONTROL_MAP] = getWidget("map", "controls")->value[1];
app.config.joypadControls[CONTROL_PAUSE] = getWidget("pause", "controls")->value[1];
}
static void back(void) static void back(void)
{ {
switch (section) switch (section)
@ -189,6 +220,7 @@ static void back(void)
break; break;
case SECTION_CONTROLS: case SECTION_CONTROLS:
updateControlConfig();
playSound(SND_MENU_BACK, 0); playSound(SND_MENU_BACK, 0);
section = SECTION_MAIN; section = SECTION_MAIN;
showWidgetGroup("options"); showWidgetGroup("options");

View File

@ -487,7 +487,7 @@ struct Widget {
int y; int y;
int w; int w;
int h; int h;
int value; int value[2];
int minValue; int minValue;
int maxValue; int maxValue;
int visible; int visible;

View File

@ -25,6 +25,7 @@ static void loadWidgets(void);
static void createWidgetOptions(Widget *w, char *options); static void createWidgetOptions(Widget *w, char *options);
static void selectWidget(int dir); static void selectWidget(int dir);
static void updateWidgetValue(int dir); static void updateWidgetValue(int dir);
static void handleInputWidget(void);
static Widget widgets[MAX_WIDGETS]; static Widget widgets[MAX_WIDGETS];
static Widget *selectedWidget; static Widget *selectedWidget;
@ -51,41 +52,54 @@ void initWidgets(void)
void doWidgets(void) void doWidgets(void)
{ {
if (isControl(CONTROL_UP) || app.keyboard[SDL_SCANCODE_UP]) if (!app.awaitingWidgetInput)
{ {
selectWidget(-1); if (isControl(CONTROL_UP) || app.keyboard[SDL_SCANCODE_UP])
app.keyboard[SDL_SCANCODE_UP] = 0;
clearControl(CONTROL_UP);
}
if (isControl(CONTROL_DOWN) || app.keyboard[SDL_SCANCODE_DOWN])
{
selectWidget(1);
app.keyboard[SDL_SCANCODE_DOWN] = 0;
clearControl(CONTROL_DOWN);
}
if (isControl(CONTROL_LEFT) || app.keyboard[SDL_SCANCODE_LEFT])
{
updateWidgetValue(-1);
}
if (isControl(CONTROL_RIGHT) || app.keyboard[SDL_SCANCODE_RIGHT])
{
updateWidgetValue(1);
}
if (isControl(CONTROL_FIRE) || app.keyboard[SDL_SCANCODE_RETURN] || app.keyboard[SDL_SCANCODE_SPACE])
{
if (selectedWidget->type != WT_INPUT)
{ {
selectedWidget->action(); selectWidget(-1);
app.keyboard[SDL_SCANCODE_UP] = 0;
clearControl(CONTROL_UP);
} }
app.keyboard[SDL_SCANCODE_SPACE] = app.keyboard[SDL_SCANCODE_RETURN] = 0; if (isControl(CONTROL_DOWN) || app.keyboard[SDL_SCANCODE_DOWN])
clearControl(CONTROL_FIRE); {
selectWidget(1);
app.keyboard[SDL_SCANCODE_DOWN] = 0;
clearControl(CONTROL_DOWN);
}
if (isControl(CONTROL_LEFT) || app.keyboard[SDL_SCANCODE_LEFT])
{
updateWidgetValue(-1);
}
if (isControl(CONTROL_RIGHT) || app.keyboard[SDL_SCANCODE_RIGHT])
{
updateWidgetValue(1);
}
if (isControl(CONTROL_FIRE) || app.keyboard[SDL_SCANCODE_RETURN] || app.keyboard[SDL_SCANCODE_SPACE])
{
if (selectedWidget->type != WT_INPUT)
{
selectedWidget->action();
}
else if (!isControl(CONTROL_FIRE))
{
app.awaitingWidgetInput = 1;
app.lastKeyPressed = 0;
app.lastButtonPressed = -1;
}
app.keyboard[SDL_SCANCODE_SPACE] = app.keyboard[SDL_SCANCODE_RETURN] = 0;
clearControl(CONTROL_FIRE);
}
}
else
{
handleInputWidget();
} }
} }
@ -93,12 +107,12 @@ static void updateWidgetValue(int dir)
{ {
if (selectedWidget->type == WT_SLIDER) if (selectedWidget->type == WT_SLIDER)
{ {
selectedWidget->value = limit(selectedWidget->value + dir, selectedWidget->minValue, selectedWidget->maxValue); selectedWidget->value[0] = limit(selectedWidget->value[0] + dir, selectedWidget->minValue, selectedWidget->maxValue);
selectedWidget->action(); selectedWidget->action();
} }
else if (selectedWidget->type == WT_SPINNER) else if (selectedWidget->type == WT_SPINNER)
{ {
selectedWidget->value = limit(selectedWidget->value + dir, 0, selectedWidget->numOptions - 1); selectedWidget->value[0] = limit(selectedWidget->value[0] + dir, 0, selectedWidget->numOptions - 1);
selectedWidget->action(); selectedWidget->action();
app.keyboard[SDL_SCANCODE_LEFT] = app.keyboard[SDL_SCANCODE_RIGHT] = 0; app.keyboard[SDL_SCANCODE_LEFT] = app.keyboard[SDL_SCANCODE_RIGHT] = 0;
clearControl(CONTROL_LEFT); clearControl(CONTROL_LEFT);
@ -107,6 +121,35 @@ static void updateWidgetValue(int dir)
} }
} }
static void handleInputWidget(void)
{
if (app.keyboard[SDL_SCANCODE_ESCAPE])
{
app.awaitingWidgetInput = 0;
}
else if (app.keyboard[SDL_SCANCODE_BACKSPACE])
{
selectedWidget->value[0] = 0;
selectedWidget->value[1] = -1;
app.awaitingWidgetInput = 0;
}
else if (app.lastKeyPressed != 0 || app.lastButtonPressed != -1)
{
if (app.lastKeyPressed != 0)
{
selectedWidget->value[0] = app.lastKeyPressed;
}
if (app.lastButtonPressed != -1)
{
selectedWidget->value[1] = app.lastButtonPressed;
}
app.awaitingWidgetInput = 0;
}
}
void drawWidgets(void) void drawWidgets(void)
{ {
int i, j, x, tw, th, outline; int i, j, x, tw, th, outline;
@ -136,7 +179,7 @@ void drawWidgets(void)
switch (w->type) switch (w->type)
{ {
case WT_SLIDER: case WT_SLIDER:
drawRect(w->x + w->w + 25, w->y, 500 * (w->value * 1.0 / w->maxValue), 40, 0, 128, 0, 255); drawRect(w->x + w->w + 25, w->y, 500 * (w->value[0] * 1.0 / w->maxValue), 40, 0, 128, 0, 255);
drawOutlineRect(w->x + w->w + 25, w->y, 500, 40, 0, outline, 0, 255); drawOutlineRect(w->x + w->w + 25, w->y, 500, 40, 0, outline, 0, 255);
break; break;
@ -148,7 +191,7 @@ void drawWidgets(void)
tw += 25; tw += 25;
if (j == w->value) if (j == w->value[0])
{ {
drawRect(x, w->y, tw, w->h, 0, 128, 0, 255); drawRect(x, w->y, tw, w->h, 0, 128, 0, 255);
drawOutlineRect(x, w->y, tw, w->h, 0, outline, 0, 255); drawOutlineRect(x, w->y, tw, w->h, 0, outline, 0, 255);
@ -164,7 +207,22 @@ void drawWidgets(void)
x = w->x + w->w + 25; x = w->x + w->w + 25;
drawRect(x, w->y, 200, w->h, 0, 0, 0, 255); drawRect(x, w->y, 200, w->h, 0, 0, 0, 255);
drawOutlineRect(x, w->y, 200, w->h, 0, outline, 0, 255); drawOutlineRect(x, w->y, 200, w->h, 0, outline, 0, 255);
drawText(x + 100, w->y + 2, 24, TA_CENTER, colors.white, "%s", SDL_GetScancodeName(w->value)); if (app.awaitingWidgetInput && w == selectedWidget)
{
drawText(x + 100, w->y + 2, 24, TA_CENTER, colors.white, "...");
}
else if (w->value[0] != -1 && w->value[1] != -1)
{
drawText(x + 100, w->y + 2, 24, TA_CENTER, colors.white, "%s or Btn %d", SDL_GetScancodeName(w->value[0]), w->value[1]);
}
else if (w->value[0] != -1)
{
drawText(x + 100, w->y + 2, 24, TA_CENTER, colors.white, "%s", SDL_GetScancodeName(w->value[0]));
}
else if (w->value[1] != -1)
{
drawText(x + 100, w->y + 2, 24, TA_CENTER, colors.white, "Btn %d", w->value[1]);
}
break; break;
} }
} }
@ -348,6 +406,9 @@ static void loadWidgetGroup(char *filename)
w->minValue = cJSON_GetObjectItem(node, "minValue")->valueint; w->minValue = cJSON_GetObjectItem(node, "minValue")->valueint;
w->maxValue = cJSON_GetObjectItem(node, "maxValue")->valueint; w->maxValue = cJSON_GetObjectItem(node, "maxValue")->valueint;
break; break;
case WT_INPUT:
break;
default: default:
break; break;