diff --git a/CHANGELOG b/CHANGELOG index dd64e54..718009b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,7 +2,7 @@ Changelog 0.6 - * Added new game mode: Challenges + * New game mode: Challenges * Add i18n support 0.51 diff --git a/README.md b/README.md index 4fad778..0595634 100644 --- a/README.md +++ b/README.md @@ -66,3 +66,4 @@ CC BY-NC-SA 3.0, with the following attribution: Copyright 2015-2016, Stephen J * track-3.mp3, by Alexandr Zhelanov - https://soundcloud.com/alexandr-zhelanov * track-4.mp3, by Alexandr Zhelanov - https://soundcloud.com/alexandr-zhelanov * DST-RailJet-LongSeamlessLoop.ogg, by Deceased Superior Technician - http://opengameart.org/content/railjet-long-seamless-loop +* covert_operations.mp3, by artisticdude - http://opengameart.org/content/covert-operations diff --git a/src/defs.h b/src/defs.h index 8c5b117..56c4005 100644 --- a/src/defs.h +++ b/src/defs.h @@ -270,7 +270,9 @@ enum WT_BUTTON, WT_IMG_BUTTON, WT_SELECT, - WT_SELECT_BUTTON + WT_SELECT_BUTTON, + WT_KEY_CONFIG, + WT_MOUSE_CONFIG }; enum diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index 1338273..33e254c 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -311,16 +311,15 @@ static void loadObjectives(cJSON *node) battle.objectiveTail->next = o; battle.objectiveTail = o; - o->active = 1; STRNCPY(o->description, _(cJSON_GetObjectItem(node, "description")->valuestring), MAX_DESCRIPTION_LENGTH); STRNCPY(o->targetName, cJSON_GetObjectItem(node, "targetName")->valuestring, MAX_NAME_LENGTH); o->targetValue = cJSON_GetObjectItem(node, "targetValue")->valueint; o->targetType = lookup(cJSON_GetObjectItem(node, "targetType")->valuestring); - o->active = getJSONValue(node, "active", 0); + o->active = getJSONValue(node, "active", 1); o->isCondition = getJSONValue(node, "isCondition", 0); o->isEliminateAll = getJSONValue(node, "isEliminateAll", 0); - if (isEliminateAll) + if (o->isEliminateAll) { o->targetValue = 1; } @@ -378,9 +377,6 @@ static void loadFighters(cJSON *node) groupName = NULL; flags = -1; aiFlags = -1; - scatter = 1; - active = 1; - number = 1; types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &numTypes); side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); @@ -388,9 +384,9 @@ static void loadFighters(cJSON *node) y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; name = getJSONValueStr(node, "name", NULL); groupName = getJSONValueStr(node, "groupName", NULL); - number = getJSONValue(node, "number", 0); - scatter = getJSONValue(node, "scatter", 0); - active = getJSONValue(node, "active", 0); + number = getJSONValue(node, "number", 1); + scatter = getJSONValue(node, "scatter", 1); + active = getJSONValue(node, "active", 1); if (cJSON_GetObjectItem(node, "flags")) { @@ -484,20 +480,17 @@ static void loadCapitalShips(cJSON *node) { name = NULL; groupName = NULL; - scatter = 1; - active = 1; - number = 1; flags = -1; types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &numTypes); side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; - name = cJSON_GetObjectItem(node, "name", NULL); + name = getJSONValueStr(node, "name", NULL); groupName = getJSONValueStr(node, "groupName", NULL); - number = getJSONValueStr(node, "number", 0); - scatter = getJSONValueStr(node, "scatter", 0); - active = getJSONValue(node, "active", 0); + number = getJSONValue(node, "number", 1); + scatter = getJSONValue(node, "scatter", 1); + active = getJSONValue(node, "active", 1); if (cJSON_GetObjectItem(node, "flags")) { @@ -576,19 +569,12 @@ static void loadEntities(cJSON *node) y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; name = NULL; groupName = NULL; - number = 1; - active = 1; - scatter = 1; name = getJSONValueStr(node, "name", NULL); - groupName = getJSONValueStr(node, "groupName", NULL); - - number = getJSONValue(node, "number", 0); - - active = getJSONValue(node, "active", 0); - - scatter = getJSONValue(node, "scatter", 0); + number = getJSONValue(node, "number", 1); + active = getJSONValue(node, "active", 1); + scatter = getJSONValue(node, "scatter", 1); for (i = 0 ; i < number ; i++) { @@ -659,24 +645,18 @@ static void loadItems(cJSON *node) y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; name = NULL; groupName = NULL; - number = 1; - active = 1; name = getJSONValueStr(node, "name", NULL); - groupName = getJSONValueStr(node, "groupName", NULL); - - number = getJSONValue(node, "number", 0); - - scatter = getJSONValue(node, "scatter", 0); + number = getJSONValue(node, "number", 1); + scatter = getJSONValue(node, "scatter", 1); + active = getJSONValue(node, "active", 1); if (cJSON_GetObjectItem(node, "flags")) { flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); } - active = getJSONValue(node, "active", 0); - for (i = 0 ; i < number ; i++) { e = spawnItem(type); @@ -734,8 +714,6 @@ static void loadLocations(cJSON *node) while (node) { - active = 1; - l = malloc(sizeof(Location)); memset(l, 0, sizeof(Location)); battle.locationTail->next = l; @@ -747,7 +725,7 @@ static void loadLocations(cJSON *node) l->size = cJSON_GetObjectItem(node, "size")->valueint; - active = getJSONValue(node, "active", 0); + active = getJSONValue(node, "active", 1); l->x += (SCREEN_WIDTH / 2); l->y += (SCREEN_HEIGHT / 2); diff --git a/src/game/controls.c b/src/game/controls.c index 79cab7b..fc6a176 100644 --- a/src/game/controls.c +++ b/src/game/controls.c @@ -29,3 +29,43 @@ void clearControl(int type) { app.keyboard[app.keyControls[type]] = 0; } + +void initControlsDisplay(void) +{ + getWidget("keyMissile", "controls")->value = app.keyControls[CONTROL_MISSILE]; + getWidget("keyBoost", "controls")->value = app.keyControls[CONTROL_BOOST]; + getWidget("keyECM", "controls")->value = app.keyControls[CONTROL_ECM]; + getWidget("keyBrake", "controls")->value = app.keyControls[CONTROL_BRAKE]; + getWidget("keyRadar", "controls")->value = app.keyControls[CONTROL_RADAR]; + getWidget("keyTarget", "controls")->value = app.keyControls[CONTROL_TARGET]; + getWidget("keyGuns", "controls")->value = app.keyControls[CONTROL_GUNS]; + getWidget("keyPrevFighter", "controls")->value = app.keyControls[CONTROL_PREV_FIGHTER]; + getWidget("keyNextFighter", "controls")->value = app.keyControls[CONTROL_NEXT_FIGHTER]; +} + +void drawControls(void) +{ + 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); + + r.w = 800; + r.h = 650; + r.x = (SCREEN_WIDTH / 2) - r.w / 2; + r.y = (SCREEN_HEIGHT / 2) - r.h / 2; + + SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 0); + SDL_RenderFillRect(app.renderer, &r); + SDL_SetRenderDrawColor(app.renderer, 200, 200, 200, 255); + SDL_RenderDrawRect(app.renderer, &r); + + drawText(SCREEN_WIDTH / 2, 50, 28, TA_CENTER, colors.white, _("Controls")); + + SDL_SetRenderDrawColor(app.renderer, 128, 128, 128, 255); + SDL_RenderDrawLine(app.renderer, r.x, r.y + 65, r.x + r.w, r.y + 65); + + drawWidgets("controls"); +} diff --git a/src/game/controls.h b/src/game/controls.h index 5db7e31..27c5e13 100644 --- a/src/game/controls.h +++ b/src/game/controls.h @@ -20,5 +20,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "../common.h" +extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...); +extern char *getTranslatedString(char *string); +extern Widget *getWidget(const char *name, const char *group); +extern void drawWidgets(char *groupName); + extern App app; +extern Colors colors; extern Game game; diff --git a/src/system/lookup.c b/src/system/lookup.c index 00d7c62..ce6ed44 100644 --- a/src/system/lookup.c +++ b/src/system/lookup.c @@ -91,6 +91,8 @@ void initLookups(void) addLookup("WT_BUTTON", WT_BUTTON); addLookup("WT_SELECT", WT_SELECT); addLookup("WT_IMG_BUTTON", WT_IMG_BUTTON); + addLookup("WT_KEY_CONFIG", WT_KEY_CONFIG); + addLookup("WT_MOUSE_CONFIG", WT_MOUSE_CONFIG); addLookup("SIDE_ALLIES", SIDE_ALLIES); addLookup("SIDE_PIRATE", SIDE_PIRATE); diff --git a/src/system/modalDialog.c b/src/system/modalDialog.c index 76e142c..c59efee 100644 --- a/src/system/modalDialog.c +++ b/src/system/modalDialog.c @@ -60,7 +60,7 @@ void showOKDialog(void (*callback)(void), const char *format, ...) ok->action = callback; enableTimer = FPS; - ok->enabled = okCancelOK = okCancelCancel = 0; + ok->enabled = okCancelOK->enabled = okCancelCancel->enabled = 0; } void showOKCancelDialog(void (*okCallback)(void), void (*cancelCallback)(void), const char *format, ...) @@ -81,7 +81,7 @@ void showOKCancelDialog(void (*okCallback)(void), void (*cancelCallback)(void), okCancelCancel->action = cancelCallback; enableTimer = FPS; - ok->enabled = okCancelOK = okCancelCancel = 0; + ok->enabled = okCancelOK->enabled = okCancelCancel->enabled = 0; } void doModalDialog(void) @@ -93,7 +93,7 @@ void doModalDialog(void) enableTimer = MAX(enableTimer - 1, 0); if (!enableTimer) { - ok->enabled = okCancelOK = okCancelCancel = 1; + ok->enabled = okCancelOK->enabled = okCancelCancel->enabled = 1; } } diff --git a/src/system/options.c b/src/system/options.c index 481e70c..fa1690e 100644 --- a/src/system/options.c +++ b/src/system/options.c @@ -25,8 +25,12 @@ static void changeSoundVolume(char *value); static void changeMusicVolume(char *value); static void changeFullscreen(char *value); static void ok(void); +static void controlsOK(void); +static void drawMain(void); +static void controls(void); static void (*returnFromOptions)(void); +static int show; void initOptions(void (*rtn)(void)) { @@ -38,7 +42,9 @@ void initOptions(void (*rtn)(void)) getWidget("soundVolume", "options")->onChange = changeSoundVolume; getWidget("musicVolume", "options")->onChange = changeMusicVolume; getWidget("fullscreen", "options")->onChange = changeFullscreen; + getWidget("controls", "options")->action = controls; getWidget("ok", "options")->action = ok; + getWidget("ok", "controls")->action = controlsOK; sprintf(optionStr, "%d x %d", app.winWidth, app.winHeight); setWidgetOption("windowSize", "options", optionStr); @@ -57,9 +63,25 @@ void initOptions(void (*rtn)(void)) #endif returnFromOptions = rtn; + + show = SHOW_MAIN; } void drawOptions(void) +{ + switch (show) + { + case SHOW_MAIN: + drawMain(); + break; + + case SHOW_CONTROLS: + drawControls(); + break; + } +} + +static void drawMain(void) { SDL_Rect r; @@ -95,6 +117,13 @@ void drawOptions(void) limitTextWidth(0); } +static void controls(void) +{ + initControlsDisplay(); + + show = SHOW_CONTROLS; +} + static void changeWindowSize(char *value) { sscanf(value, "%d x %d", &app.winWidth, &app.winHeight); @@ -125,3 +154,8 @@ static void ok(void) returnFromOptions(); } + +static void controlsOK(void) +{ + show = SHOW_MAIN; +} diff --git a/src/system/options.h b/src/system/options.h index 2778066..ee599c4 100644 --- a/src/system/options.h +++ b/src/system/options.h @@ -22,6 +22,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "SDL2/SDL_mixer.h" +#define SHOW_MAIN 0 +#define SHOW_CONTROLS 1 + extern void selectWidget(const char *name, const char *group); extern Widget *getWidget(const char *name, const char *group); extern void drawWidgets(char *groupName); @@ -30,6 +33,8 @@ extern void drawText(int x, int y, int size, int align, SDL_Color c, const char extern void saveConfig(void); extern void limitTextWidth(int width); extern char *getTranslatedString(char *string); +extern void drawControls(void); +extern void initControlsDisplay(void); extern App app; extern Colors colors; diff --git a/src/system/resources.c b/src/system/resources.c index fb5348f..d4b5ef1 100644 --- a/src/system/resources.c +++ b/src/system/resources.c @@ -42,8 +42,8 @@ void initResources(void) backgrounds[i] = malloc(sizeof(char) * MAX_FILENAME_LENGTH); sprintf(backgrounds[i], "gfx/backgrounds/%s", filenames[i]); - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "'%s' added to AUTO resources list", filenames[i]); - + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Adding AUTO %s", filenames[i]); + free(filenames[i]); } @@ -56,9 +56,9 @@ void initResources(void) { planets[i] = malloc(sizeof(char) * MAX_FILENAME_LENGTH); sprintf(planets[i], "gfx/planets/%s", filenames[i]); - - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "'%s' added to AUTO resources list", filenames[i]); - + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Adding AUTO %s", filenames[i]); + free(filenames[i]); } @@ -72,9 +72,9 @@ void initResources(void) { musicFiles[i] = malloc(sizeof(char) * MAX_FILENAME_LENGTH); sprintf(musicFiles[i], "music/battle/%s", filenames[i]); - - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "'%s' added to AUTO resources list", filenames[i]); - + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Adding AUTO %s", filenames[i]); + free(filenames[i]); } diff --git a/src/system/sound.h b/src/system/sound.h index fb82d09..f6b911f 100644 --- a/src/system/sound.h +++ b/src/system/sound.h @@ -25,5 +25,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define MAX_BATTLE_SOUND_DISTANCE 1500 extern int getDistance(int x1, int y1, int x2, int y2); +extern char *getFileLocation(char *filename); extern Entity *player; diff --git a/src/system/util.c b/src/system/util.c index 534c4f3..949d779 100644 --- a/src/system/util.c +++ b/src/system/util.c @@ -115,10 +115,17 @@ char *getJSONValueStr(cJSON *node, char *name, char *defValue) int getJSONValue(cJSON *node, char *name, int defValue) { - char *result = getJSONValueStr(node, name, defValue); + cJSON *child; - if (result) + if (node) { - return aoti(result); + child = cJSON_GetObjectItem(node, name); + + if (child) + { + return child->valueint; + } } + + return defValue; } diff --git a/src/system/util.h b/src/system/util.h index 43b6747..667646c 100644 --- a/src/system/util.h +++ b/src/system/util.h @@ -19,3 +19,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "../common.h" +#include "../json/cJSON.h" diff --git a/src/system/widgets.c b/src/system/widgets.c index 62e9360..68a8c90 100644 --- a/src/system/widgets.c +++ b/src/system/widgets.c @@ -146,6 +146,18 @@ void drawWidgets(const char *group) drawText(w->rect.x + 10, w->rect.y + 2, 20, TA_LEFT, colors.white, w->text); drawText(w->rect.x + w->rect.w - 10, w->rect.y + 2, 20, TA_RIGHT, colors.white, w->options[w->currentOption]); break; + + case WT_KEY_CONFIG: + SDL_RenderDrawRect(app.renderer, &w->rect); + drawText(w->rect.x + 25, w->rect.y + 2, 20, TA_LEFT, colors.white, w->text); + drawText(w->rect.x + w->rect.w - 25, w->rect.y + 2, 20, TA_RIGHT, colors.white, "%d", w->value); + break; + + case WT_MOUSE_CONFIG: + SDL_RenderDrawRect(app.renderer, &w->rect); + drawText(w->rect.x + 25, w->rect.y + 2, 20, TA_LEFT, colors.white, w->text); + drawText(w->rect.x + w->rect.w - 25, w->rect.y + 2, 20, TA_RIGHT, colors.white, "%d", w->value); + break; } if (!w->enabled) @@ -322,6 +334,18 @@ static void loadWidgetSet(char *filename) createSelectButtons(w); createOptions(w, cJSON_GetObjectItem(node, "options")->valuestring); break; + + case WT_KEY_CONFIG: + case WT_MOUSE_CONFIG: + STRNCPY(w->text, _(cJSON_GetObjectItem(node, "text")->valuestring), MAX_NAME_LENGTH); + w->rect.w = cJSON_GetObjectItem(node, "w")->valueint; + w->rect.h = cJSON_GetObjectItem(node, "h")->valueint; + break; + + default: + printf("Widget type %d not handled\n", w->type); + exit(1); + break; } tail->next = w;