From c66b734e7e862f9b56042705b8cae39ff165b471 Mon Sep 17 00:00:00 2001 From: Steve Date: Fri, 11 Mar 2016 23:43:50 +0000 Subject: [PATCH 01/51] Added interval-based script events. --- src/battle/battle.c | 6 ++-- src/battle/battle.h | 1 + src/battle/script.c | 80 ++++++++++++++++++++++++++++++++++++++++++++- src/battle/script.h | 1 + 4 files changed, 83 insertions(+), 5 deletions(-) diff --git a/src/battle/battle.c b/src/battle/battle.c index 79c0692..62149b9 100644 --- a/src/battle/battle.c +++ b/src/battle/battle.c @@ -159,11 +159,9 @@ static void doBattle(void) { doScript(); - battle.stats[STAT_TIME]++; - - if (battle.stats[STAT_TIME] % FPS == 0) + if (battle.stats[STAT_TIME]++ % FPS == 0) { - runScriptFunction("TIME %d", battle.stats[STAT_TIME] / 60); + runScriptTimeFunctions(); } } } diff --git a/src/battle/battle.h b/src/battle/battle.h index c507df1..0662b49 100644 --- a/src/battle/battle.h +++ b/src/battle/battle.h @@ -84,6 +84,7 @@ extern void destroyEffects(void); extern void initChallengeHome(void); extern void updateAccuracyStats(unsigned int *stats); extern void clearInput(void); +extern void runScriptTimeFunctions(void); extern App app; extern Battle battle; diff --git a/src/battle/script.c b/src/battle/script.c index 6aafdb4..4cb3252 100644 --- a/src/battle/script.c +++ b/src/battle/script.c @@ -28,10 +28,24 @@ static ScriptRunner *tail; void initScript(cJSON *scriptNode) { + cJSON *function; + memset(&head, 0, sizeof(ScriptRunner)); tail = &head; scriptJSON = scriptNode; + + if (scriptJSON) + { + function = scriptJSON->child; + + while (function) + { + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Script Function: '%s'", cJSON_GetObjectItem(function, "function")->valuestring); + + function = function->next; + } + } } void doScript(void) @@ -110,11 +124,65 @@ void runScriptFunction(const char *format, ...) } } +void runScriptTimeFunctions(void) +{ + ScriptRunner *scriptRunner; + cJSON *function; + char *functionName; + char funcNameBuffer[MAX_NAME_LENGTH]; + int intParam; + + if (scriptJSON) + { + function = scriptJSON->child; + + sprintf(funcNameBuffer, "TIME %d", battle.stats[STAT_TIME] / 60); + + while (function) + { + functionName = cJSON_GetObjectItem(function, "function")->valuestring; + + if (strcmp(functionName, funcNameBuffer) == 0) + { + scriptRunner = malloc(sizeof(ScriptRunner)); + memset(scriptRunner, 0, sizeof(ScriptRunner)); + + scriptRunner->line = cJSON_GetObjectItem(function, "lines")->child; + + tail->next = scriptRunner; + tail = scriptRunner; + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Running script '%s'", funcNameBuffer); + } + + if (strstr(functionName, "INTERVAL")) + { + sscanf(functionName, "%*s %d", &intParam); + + if ((battle.stats[STAT_TIME] / 60) % intParam == 0) + { + scriptRunner = malloc(sizeof(ScriptRunner)); + memset(scriptRunner, 0, sizeof(ScriptRunner)); + + scriptRunner->line = cJSON_GetObjectItem(function, "lines")->child; + + tail->next = scriptRunner; + tail = scriptRunner; + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Running script '%s'", funcNameBuffer); + } + } + + function = function->next; + } + } +} + static void executeNextLine(ScriptRunner *runner) { char *line; char command[24]; - char strParam[2][256]; + char strParam[3][256]; int intParam[2]; line = runner->line->valuestring; @@ -183,6 +251,11 @@ static void executeNextLine(ScriptRunner *runner) battle.isEpic = 0; retreatEnemies(); } + else if (strcmp(command, "SPAWN_FIGHTERS") == 0) + { + sscanf(line, "%*s %s %s %d %s", strParam[0], strParam[1], &intParam[0], strParam[2]); + spawnScriptFighter(strParam[0], strParam[1], intParam[0], strParam[2]); + } else { printf("ERROR: Unrecognised script command '%s'\n", command); @@ -196,6 +269,11 @@ static void executeNextLine(ScriptRunner *runner) void destroyScript(void) { ScriptRunner *scriptRunner; + + if (scriptJSON) + { + cJSON_Delete(scriptJSON); + } while (head.next) { diff --git a/src/battle/script.h b/src/battle/script.h index aadcba0..acbceb6 100644 --- a/src/battle/script.h +++ b/src/battle/script.h @@ -34,6 +34,7 @@ extern void activateLocations(char *locations); void activateObjectives(char *objectives); extern int showingMessageBoxes(void); extern char *getTranslatedString(char *string); +extern void spawnScriptFighter(char *fighters, char *side, int num, char *location); extern Battle battle; extern Colors colors; From 3bd78dbd20ee3aac29903ec7ca78ff370f637006 Mon Sep 17 00:00:00 2001 From: Steve Date: Fri, 11 Mar 2016 23:45:12 +0000 Subject: [PATCH 02/51] Spawn fighters offscreen or off map. --- src/battle/fighters.c | 36 ++++++++++++++++++++++++++++++++++++ src/battle/fighters.h | 1 + src/system/util.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/src/battle/fighters.c b/src/battle/fighters.c index 4cf275a..11b1339 100644 --- a/src/battle/fighters.c +++ b/src/battle/fighters.c @@ -99,6 +99,42 @@ Entity *spawnFighter(char *name, int x, int y, int side) return e; } +void spawnScriptFighter(char *fighterTypes, char *sideStr, int num, char *location) +{ + Entity *e; + int i, numTypes, side, offscreen; + char **types, *type; + + types = toTypeArray(fighterTypes, &numTypes); + side = lookup(sideStr); + offscreen = strcmp(location, "OFFSCREEN") == 0; + + for (i = 0 ; i < num ; i++) + { + type = types[rand() % numTypes]; + + e = spawnFighter(type, 0, 0, side); + + if (offscreen) + { + e->x = player->x; + e->y = player->y; + } + else + { + e->x = rand() % 2 ? 0 : BATTLE_AREA_WIDTH; + e->y = rand() % 2 ? 0 : BATTLE_AREA_HEIGHT; + } + + e->x += (rand() % 2) ? -SCREEN_WIDTH : SCREEN_WIDTH; + e->y += (rand() % 2) ? -SCREEN_HEIGHT : SCREEN_HEIGHT; + + e->aiFlags |= AIF_UNLIMITED_RANGE; + } + + free(types); +} + static void randomizeDart(Entity *dart) { char texture[MAX_DESCRIPTION_LENGTH]; diff --git a/src/battle/fighters.h b/src/battle/fighters.h index 11c3600..c6394d5 100644 --- a/src/battle/fighters.h +++ b/src/battle/fighters.h @@ -47,6 +47,7 @@ extern void addDebris(int x, int y, int amount); extern char **getFileList(char *dir, int *count); extern char *getTranslatedString(char *string); extern int getJSONValue(cJSON *node, char *name, int defValue); +extern char **toTypeArray(char *types, int *numTypes); extern App app; extern Battle battle; diff --git a/src/system/util.c b/src/system/util.c index 982b45f..2d9f409 100644 --- a/src/system/util.c +++ b/src/system/util.c @@ -73,6 +73,38 @@ void getSlope(int x1, int y1, int x2, int y2, float *dx, float *dy) *dy /= steps; } +char **toTypeArray(char *types, int *numTypes) +{ + int i; + char **typeArray, *type; + + *numTypes = 1; + + for (i = 0 ; i < strlen(types) ; i++) + { + if (types[i] == ';') + { + *numTypes = *numTypes + 1; + } + } + + typeArray = malloc(*numTypes * sizeof(char*)); + + i = 0; + type = strtok(types, ";"); + while (type) + { + typeArray[i] = malloc(strlen(type) + 1); + strcpy(typeArray[i], type); + + type = strtok(NULL, ";"); + + i++; + } + + return typeArray; +} + char *timeToString(long millis, int showHours) { static char TIME[MAX_NAME_LENGTH]; From 4f27b40d97a201eb1dd42eccf3ff7d7358bb64ca Mon Sep 17 00:00:00 2001 From: Steve Date: Fri, 11 Mar 2016 23:45:47 +0000 Subject: [PATCH 03/51] Added rescue challenges --- src/battle/hud.c | 4 ++++ src/challenges/challenges.c | 6 ++++++ src/defs.h | 1 + src/galaxy/mission.c | 36 +----------------------------------- src/galaxy/mission.h | 1 + src/structs.h | 1 + src/system/lookup.c | 1 + 7 files changed, 15 insertions(+), 35 deletions(-) diff --git a/src/battle/hud.c b/src/battle/hud.c index 9fbdc0b..b98ffac 100644 --- a/src/battle/hud.c +++ b/src/battle/hud.c @@ -422,6 +422,10 @@ static void drawObjectives(void) { drawText(SCREEN_WIDTH / 2, 35, 14, TA_CENTER, colors.white, "%d / %d", battle.stats[STAT_ITEMS_COLLECTED] + battle.stats[STAT_ITEMS_COLLECTED_PLAYER], game.currentMission->challengeData.itemLimit); } + else if (game.currentMission->challengeData.rescueLimit) + { + drawText(SCREEN_WIDTH / 2, 35, 14, TA_CENTER, colors.white, "%d / %d", battle.stats[STAT_CIVILIANS_RESCUED], game.currentMission->challengeData.rescueLimit); + } } else { diff --git a/src/challenges/challenges.c b/src/challenges/challenges.c index 61180ee..27082ad 100644 --- a/src/challenges/challenges.c +++ b/src/challenges/challenges.c @@ -57,6 +57,7 @@ void initChallenges(void) challengeDescription[CHALLENGE_PLAYER_KILLS] = _("Take down %d enemy targets"); challengeDescription[CHALLENGE_DISABLE] = _("Disable %d or more enemy fighters"); challengeDescription[CHALLENGE_ITEMS] = _("Collect %d packages"); + challengeDescription[CHALLENGE_RESCUE] = _("Rescue %d civilians"); tail = &game.challengeMissionHead; @@ -128,6 +129,11 @@ static int challengeFinished(void) return 1; } + if (game.currentMission->challengeData.rescueLimit > 0 && (battle.stats[STAT_CIVILIANS_RESCUED] + battle.stats[STAT_CIVILIANS_KILLED]) >= game.currentMission->challengeData.rescueLimit) + { + return 1; + } + if (game.currentMission->challengeData.scriptedEnd) { return 1; diff --git a/src/defs.h b/src/defs.h index c92d365..eed8c23 100644 --- a/src/defs.h +++ b/src/defs.h @@ -292,6 +292,7 @@ enum CHALLENGE_PLAYER_KILLS, CHALLENGE_DISABLE, CHALLENGE_ITEMS, + CHALLENGE_RESCUE, CHALLENGE_MAX }; diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index b4789ee..ee89fb9 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -28,7 +28,6 @@ static void loadEntities(cJSON *node); static void loadItems(cJSON *node); static void loadLocations(cJSON *node); static unsigned long hashcode(const char *str); -static char **toTypeArray(char *types, int *numTypes); static void loadEpicData(cJSON *node); static char *getAutoBackground(char *filename); static char *getAutoPlanet(char *filename); @@ -87,6 +86,7 @@ Mission *loadMissionMeta(char *filename) mission->challengeData.escapeLimit = getJSONValue(node, "escapeLimit", 0); mission->challengeData.waypointLimit = getJSONValue(node, "waypointLimit", 0); mission->challengeData.itemLimit = getJSONValue(node, "itemLimit", 0); + mission->challengeData.rescueLimit = getJSONValue(node, "rescueLimit", 0); /* restrictions */ mission->challengeData.noMissiles = getJSONValue(node, "noMissiles", 0); @@ -197,8 +197,6 @@ void loadMission(char *filename) battle.planetHeight *= planetScale; srand(time(NULL)); - - cJSON_Delete(root); free(text); @@ -761,38 +759,6 @@ static void loadLocations(cJSON *node) } } -static char **toTypeArray(char *types, int *numTypes) -{ - int i; - char **typeArray, *type; - - *numTypes = 1; - - for (i = 0 ; i < strlen(types) ; i++) - { - if (types[i] == ';') - { - *numTypes = *numTypes + 1; - } - } - - typeArray = malloc(*numTypes * sizeof(char*)); - - i = 0; - type = strtok(types, ";"); - while (type) - { - typeArray[i] = malloc(strlen(type) + 1); - strcpy(typeArray[i], type); - - type = strtok(NULL, ";"); - - i++; - } - - return typeArray; -} - static void loadEpicData(cJSON *node) { Entity *e; diff --git a/src/galaxy/mission.h b/src/galaxy/mission.h index af2a4d9..998712e 100644 --- a/src/galaxy/mission.h +++ b/src/galaxy/mission.h @@ -55,6 +55,7 @@ extern char *getMusicFilename(int n); extern int getJSONValue(cJSON *node, char *name, int defValue); extern char *getJSONValueStr(cJSON *node, char *name, char *defValue); extern void addAllEntsToQuadtree(void); +extern char **toTypeArray(char *types, int *numTypes); extern Battle battle; extern Entity *player; diff --git a/src/structs.h b/src/structs.h index 2473231..334d792 100644 --- a/src/structs.h +++ b/src/structs.h @@ -251,6 +251,7 @@ typedef struct { int itemLimit; int escapeLimit; int waypointLimit; + int rescueLimit; int noMissiles; int noBoost; int noECM; diff --git a/src/system/lookup.c b/src/system/lookup.c index 3edf355..b2810b9 100644 --- a/src/system/lookup.c +++ b/src/system/lookup.c @@ -132,6 +132,7 @@ void initLookups(void) addLookup("CHALLENGE_PLAYER_KILLS", CHALLENGE_PLAYER_KILLS); addLookup("CHALLENGE_DISABLE", CHALLENGE_DISABLE); addLookup("CHALLENGE_ITEMS", CHALLENGE_ITEMS); + addLookup("CHALLENGE_RESCUE", CHALLENGE_RESCUE); addLookup("STAT_PERCENT_COMPLETE", STAT_PERCENT_COMPLETE); addLookup("STAT_MISSIONS_STARTED", STAT_MISSIONS_STARTED); From 4f19dcb9a58b5d0e6212fb302398ad0dc2686379 Mon Sep 17 00:00:00 2001 From: Steve Date: Fri, 11 Mar 2016 23:46:00 +0000 Subject: [PATCH 04/51] Added challenge #10. --- data/challenges/10.json | 60 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 data/challenges/10.json diff --git a/data/challenges/10.json b/data/challenges/10.json new file mode 100644 index 0000000..53e2535 --- /dev/null +++ b/data/challenges/10.json @@ -0,0 +1,60 @@ +{ + "name" : "Rescue Civilians", + "description" : "Rescue Civilians", + "background" : "AUTO", + "planet" : "AUTO", + "music" : "AUTO", + "player" : { + "type" : "Tug", + "side" : "SIDE_ALLIES", + "pilot" : "-", + "squadron" : "-", + "x" : 25, + "y" : 25 + }, + "challenge" : { + "rescueLimit" : 8, + "timeLimit" : 300, + "challenges" : [ + { + "type" : "CHALLENGE_RESCUE", + "value" : 4 + }, + { + "type" : "CHALLENGE_RESCUE", + "value" : 5 + }, + { + "type" : "CHALLENGE_RESCUE", + "value" : 8 + } + ] + }, + "fighters" : [ + { + "types" : "Civilian", + "x" : 25, + "y" : 25, + "side" : "SIDE_ALLIES", + "flags" : "+EF_DISABLED", + "number" : 8, + "scatter" : 5000 + } + ], + "entities" : [ + { + "name" : "Jumpgate", + "type" : "ET_JUMPGATE", + "x" : 25, + "y" : 25 + } + ], + "script" : [ + { + "function" : "INTERVAL 30", + "lines" : [ + "SPAWN_FIGHTERS Dart SIDE_PIRATE 1 OFFSCREEN" + ] + } + ] +} From ae6e2ede09cb2fce9853ec9871f09117217f0b4a Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 12 Mar 2016 12:09:42 +0000 Subject: [PATCH 05/51] Control waypoints from script. --- data/missions/alba/01 - patrol #1.json | 8 +++++++- data/missions/alba/02 - patrol #2.json | 6 ++++++ data/missions/alba/03 - patrol #3.json | 6 ++++++ data/missions/granada/02 - suspect packages #2.json | 6 ++++++ data/missions/granada/03 - suspect packages #3.json | 6 ++++++ src/battle/script.c | 6 ++++++ src/battle/script.h | 1 + src/galaxy/mission.c | 2 -- src/galaxy/mission.h | 1 - 9 files changed, 38 insertions(+), 4 deletions(-) diff --git a/data/missions/alba/01 - patrol #1.json b/data/missions/alba/01 - patrol #1.json index 8fcb918..206968b 100644 --- a/data/missions/alba/01 - patrol #1.json +++ b/data/missions/alba/01 - patrol #1.json @@ -8,7 +8,7 @@ "manualComplete" : 1, "objectives" : [ { - "description" : "Check all wayponts", + "description" : "Check all waypoints", "targetName" : "Waypoint", "targetValue" : 5, "targetType" : "TT_WAYPOINT" @@ -42,6 +42,12 @@ } ], "script" : [ + { + "function" : "TIME 0", + "lines" : [ + "ACTIVATE_NEXT_WAYPOINT" + ] + } { "function" : "Waypoint #2", "lines" : [ diff --git a/data/missions/alba/02 - patrol #2.json b/data/missions/alba/02 - patrol #2.json index f586241..74a8b56 100644 --- a/data/missions/alba/02 - patrol #2.json +++ b/data/missions/alba/02 - patrol #2.json @@ -59,6 +59,12 @@ } ], "script" : [ + { + "function" : "TIME 0", + "lines" : [ + "ACTIVATE_NEXT_WAYPOINT" + ] + }, { "function" : "Waypoint #3", "lines" : [ diff --git a/data/missions/alba/03 - patrol #3.json b/data/missions/alba/03 - patrol #3.json index fe1ccb2..32e6290 100644 --- a/data/missions/alba/03 - patrol #3.json +++ b/data/missions/alba/03 - patrol #3.json @@ -45,6 +45,12 @@ } ], "script" : [ + { + "function" : "TIME 0", + "lines" : [ + "ACTIVATE_NEXT_WAYPOINT" + ] + }, { "function" : "TIME 3", "lines" : [ diff --git a/data/missions/granada/02 - suspect packages #2.json b/data/missions/granada/02 - suspect packages #2.json index 5e6a208..8c83f4e 100644 --- a/data/missions/granada/02 - suspect packages #2.json +++ b/data/missions/granada/02 - suspect packages #2.json @@ -126,6 +126,12 @@ } ], "script" : [ + { + "function" : "TIME 0", + "lines" : [ + "ACTIVATE_NEXT_WAYPOINT" + ] + }, { "function" : "Waypoint #2", "lines" : [ diff --git a/data/missions/granada/03 - suspect packages #3.json b/data/missions/granada/03 - suspect packages #3.json index 87663cf..ef8e8e5 100644 --- a/data/missions/granada/03 - suspect packages #3.json +++ b/data/missions/granada/03 - suspect packages #3.json @@ -126,6 +126,12 @@ } ], "script" : [ + { + "function" : "TIME 0", + "lines" : [ + "ACTIVATE_NEXT_WAYPOINT" + ] + }, { "function" : "Waypoint #1", "lines" : [ diff --git a/src/battle/script.c b/src/battle/script.c index 4cb3252..73e195c 100644 --- a/src/battle/script.c +++ b/src/battle/script.c @@ -213,6 +213,10 @@ static void executeNextLine(ScriptRunner *runner) { battle.jumpgate->systemPower = MAX_SYSTEM_POWER; } + else if (strcmp(command, "ACTIVATE_NEXT_WAYPOINT") == 0) + { + activateNextWaypoint(0); + } else if (strcmp(command, "MSG_BOX") == 0) { sscanf(line, "%*s %255[^;]%*c%255[^\n]", strParam[0], strParam[1]); @@ -273,6 +277,8 @@ void destroyScript(void) if (scriptJSON) { cJSON_Delete(scriptJSON); + + scriptJSON = NULL; } while (head.next) diff --git a/src/battle/script.h b/src/battle/script.h index acbceb6..2f05ea9 100644 --- a/src/battle/script.h +++ b/src/battle/script.h @@ -35,6 +35,7 @@ void activateObjectives(char *objectives); extern int showingMessageBoxes(void); extern char *getTranslatedString(char *string); extern void spawnScriptFighter(char *fighters, char *side, int num, char *location); +extern void activateNextWaypoint(int id); extern Battle battle; extern Colors colors; diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index ee89fb9..6529aaa 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -216,8 +216,6 @@ void loadMission(char *filename) battle.status = MS_IN_PROGRESS; } - activateNextWaypoint(); - countNumEnemies(); initPlayer(); diff --git a/src/galaxy/mission.h b/src/galaxy/mission.h index 998712e..c6a8647 100644 --- a/src/galaxy/mission.h +++ b/src/galaxy/mission.h @@ -35,7 +35,6 @@ extern void stopMusic(void); extern void initPlayer(void); extern long flagsToLong(char *flags, int *add); extern Entity *spawnWaypoint(void); -extern void activateNextWaypoint(void); extern void selectWidget(const char *name, const char *group); extern Entity *spawnJumpgate(void); extern Entity *spawnItem(char *type); From 96556bc0dfb8e0c2f1f7553d40fbc8b8dce1731b Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 12 Mar 2016 12:09:50 +0000 Subject: [PATCH 06/51] Increased Rook firepower. --- data/fighters/rook.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/data/fighters/rook.json b/data/fighters/rook.json index 40d9295..f1974e4 100644 --- a/data/fighters/rook.json +++ b/data/fighters/rook.json @@ -7,6 +7,11 @@ "shieldRechargeRate" : 45, "texture" : "gfx/fighters/rook.png", "guns" : [ + { + "type" : "BT_PLASMA", + "x" : 0, + "y" : 0 + }, { "type" : "BT_PLASMA", "x" : -9, From ed6b0ae37618e98f859927f1697e86ffafc51620 Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 12 Mar 2016 12:10:14 +0000 Subject: [PATCH 07/51] Don't point to jumpgate on HUD if it's inactive. --- src/battle/hud.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/battle/hud.c b/src/battle/hud.c index b98ffac..85eda92 100644 --- a/src/battle/hud.c +++ b/src/battle/hud.c @@ -330,7 +330,7 @@ static void drawPlayerTargeter(void) float angle; int x, y; - if (player->target || battle.missionTarget || battle.jumpgate) + if (player->target || battle.missionTarget || (battle.jumpgate && battle.jumpgate->systemPower)) { if (player->target) { @@ -376,7 +376,7 @@ static void drawPlayerTargeter(void) blitRotated(targetPointer, x - battle.camera.x, y - battle.camera.y, angle); } - if (battle.jumpgate) + if (battle.jumpgate && battle.jumpgate->systemPower) { angle = getAngle(player->x, player->y, battle.jumpgate->x, battle.jumpgate->y); x = player->x; @@ -456,7 +456,7 @@ static void drawDistancesInfo(void) y = 11; - if (player->target != NULL) + if (player->target) { drawText(SCREEN_WIDTH - 15, y, 18, TA_RIGHT, colors.red, player->target->name); @@ -469,7 +469,7 @@ static void drawDistancesInfo(void) y += 25; } - if (battle.missionTarget != NULL) + if (battle.missionTarget) { distance = distanceToKM(player->x, player->y, battle.missionTarget->x, battle.missionTarget->y); @@ -478,7 +478,7 @@ static void drawDistancesInfo(void) y += 25; } - if (battle.jumpgate != NULL) + if (battle.jumpgate && battle.jumpgate->systemPower) { distance = distanceToKM(player->x, player->y, battle.jumpgate->x, battle.jumpgate->y); From b235a11f3d6157e17313bf4ebf95cad3d6d60bc2 Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 12 Mar 2016 12:10:50 +0000 Subject: [PATCH 08/51] Updated waypoint graphics. --- gfx/entities/waypoint.png | Bin 15204 -> 17675 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gfx/entities/waypoint.png b/gfx/entities/waypoint.png index e84fa0ecd3d7e30df776e1e485794ba6302c3fc9..7a8fee7904d7ba37f188fd5d8e53fd04d69f20fc 100644 GIT binary patch literal 17675 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 Date: Sat, 12 Mar 2016 12:11:06 +0000 Subject: [PATCH 09/51] Rothan mission #2 --- .../rothan/02 - rothan defence #2.json | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 data/missions/rothan/02 - rothan defence #2.json diff --git a/data/missions/rothan/02 - rothan defence #2.json b/data/missions/rothan/02 - rothan defence #2.json new file mode 100644 index 0000000..2960b49 --- /dev/null +++ b/data/missions/rothan/02 - rothan defence #2.json @@ -0,0 +1,156 @@ +{ + "name" : "Rothan Defence #2", + "description" : "", + "requires" : 29, + "background" : "gfx/backgrounds/background05.jpg", + "planet" : "gfx/planets/bluePlanet.png", + "music" : "music/battle/determination.mp3", + "objectives" : [ + { + "description" : "Rendezvous with Irregular Nomads", + "targetName" : "Waypoint", + "targetValue" : 1, + "targetType" : "TT_WAYPOINT" + }, + { + "description" : "Eliminate UNF fighters", + "targetName" : "Enemy", + "targetValue" : 1, + "targetType" : "TT_DESTROY", + "isEliminateAll" : 1, + "active" : 0 + }, + { + "description" : "Retreat to jumpgate", + "targetName" : "Player", + "targetValue" : 1, + "targetType" : "TT_ESCAPED", + "active" : 0 + } + ], + "player" : { + "type" : "Rook", + "side" : "SIDE_ALLIES", + "pilot" : "Julian Spencer", + "squadron" : "Blue Jesters", + "x" : 10, + "y" : 5 + }, + "fighters" : [ + { + "name" : "CSN Pilot", + "types" : "TAF;Ray;Kingfisher;Hammerhead;Rook", + "side" : "SIDE_ALLIES", + "x" : 10, + "y" : 5, + "number" : 3, + "scatter" : 500 + }, + { + "name" : "CSN Pilot", + "groupName" : "Irregular Nomads", + "types" : "TAF;Ray;Kingfisher;Hammerhead;Rook", + "side" : "SIDE_ALLIES", + "x" : 30, + "y" : 1, + "number" : 4, + "active" : 0 + }, + { + "name" : "Rebel", + "groupName" : "Rebels", + "types" : "Nymph;Firefly", + "side" : "SIDE_REBEL", + "x" : -1, + "y" : -1, + "number" : 5, + "aiFlags" : "+AIF_UNLIMITED_RANGE", + "active" : 0 + }, + { + "name" : "Rebel", + "groupName" : "Rebels", + "types" : "Nymph;Firefly", + "side" : "SIDE_REBEL", + "x" : 15, + "y" : -1, + "number" : 5, + "aiFlags" : "+AIF_UNLIMITED_RANGE", + "active" : 0 + }, + { + "name" : "Rebel", + "groupName" : "Rebels", + "types" : "Nymph;Firefly", + "side" : "SIDE_REBEL", + "x" : -1, + "y" : 15, + "number" : 5, + "aiFlags" : "+AIF_UNLIMITED_RANGE", + "active" : 0 + } + ], + "entities" : [ + { + "type" : "ET_WAYPOINT", + "x" : 15, + "y" : 15, + "active" : 0 + }, + { + "type" : "ET_JUMPGATE", + "x" : 30, + "y" : 1, + "systemPower" : 0 + } + ], + "script" : [ + { + "function" : "TIME 1", + "lines" : [ + "MSG_BOX Spencer;Control, we're in position. Awaiting the Irregular Nomads.", + "MSG_BOX Control;Irregular Nomads have just exited the jumpgate. They'll be with you shortly.", + "ACTIVATE_ENTITY_GROUPS Irregular Nomads" + ] + }, + { + "function" : "TIME 15", + "lines" : [ + "MSG_BOX Fox;Commander Spencer, we're on our way. We'll join you at the waypoint.", + "WAIT_MSG_BOX", + "ACTIVATE_NEXT_WAYPOINT", + "MSG_BOX Fox;Acknowledged, Lieutenant, we'll see you in a bit." + ] + }, + { + "function" : "Waypoint #1", + "lines" : [ + "MSG_BOX Spencer;Control, we're ready to--", + "MSG_BOX Control;Commander, be advised that we are detecting UNF fighters advancing on your position, several Nymphs and Fireflies. They are not responding to requests to identify presence or purpose.", + "MSG_BOX Spencer;Pandorans?", + "MSG_BOX Control;Their signatures don't suggest so.", + "WAIT_MSG_BOX", + "WAIT 4,", + "ACTIVATE_ENTITY_GROUPS Rebels", + "ACTIVATE_OBJECTIVES Eliminate UNF fighters", + "MSG_BOX Control;Commander, incoming fighters are hostile. Suggest you prepare to engage or fallback to the jumpgate.", + "MSG_BOX Spencer;Acknowledged, moving to engage." + ] + }, + { + "function" : "OBJECTIVES_COMPLETE 2", + "lines" : [ + "MSG_BOX Spencer;Control, enemy targets have been eliminated.", + "MSG_BOX Control;Any survivors?", + "MSG_BOX Spencer;Negative, I didn't see anyone eject from those fighters.", + "MSG_BOX Control;Commander, your current missions has been aborted. Return to the jumpgate. We need a full report as to what just happened out there.", + "MSG_BOX Spencer;Got it, coming home.", + "WAIT_MSG_BOX", + "ACTIVATE_JUMPGATE", + "ACTIVATE_OBJECTIVES Retreat to jumpgate", + "RETREAT_ALLIES" + ] + } + ] +} + From e9c43f3d603f0b7360ae76ffcba4479ef756d1d1 Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 12 Mar 2016 12:11:30 +0000 Subject: [PATCH 10/51] Flocking tweak. --- src/battle/ai.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/battle/ai.c b/src/battle/ai.c index 1d3c0a0..074f221 100644 --- a/src/battle/ai.c +++ b/src/battle/ai.c @@ -607,9 +607,11 @@ static void moveToPlayer(void) { if (fabs(player->dx) >= 1 && fabs(player->dy) >= 1) { - wantedAngle = getAngle(player->x, player->y, player->x + (player->dx * 10), player->y + (player->dy * 10)); + wantedAngle = getAngle(player->x, player->y, player->x + (player->dx * 100), player->y + (player->dy * 100)); turnToFace(wantedAngle); + + applyFighterThrust(); } if (dist <= 250) @@ -806,6 +808,8 @@ static void moveToLeader(void) wantedAngle = getAngle(self->leader->x, self->leader->y, self->leader->x + (self->leader->dx * 10), self->leader->y + (self->leader->dy * 10)); turnToFace(wantedAngle); + + applyFighterThrust(); } if (dist <= 250) From bdced9c00f27727a1e3510855a0c076785796885 Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 12 Mar 2016 12:11:56 +0000 Subject: [PATCH 11/51] Use aiActionTime, instead of thinkTime, to allow waypoint to continue to spin. --- src/battle/waypoints.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/battle/waypoints.c b/src/battle/waypoints.c index cd87001..70226d4 100644 --- a/src/battle/waypoints.c +++ b/src/battle/waypoints.c @@ -50,25 +50,29 @@ Entity *spawnWaypoint(void) static void think(void) { - self->thinkTime = 4; + self->angle += 0.25; - self->angle++; if (self->angle >= 360) { self->angle -= 360; } - if (player != NULL && getDistance(player->x, player->y, self->x, self->y) <= 64 && isCurrentObjective() && teamMatesClose()) + if (--self->aiActionTime <= 0) { - self->health = 0; + self->aiActionTime = 0; - updateObjective("Waypoint", TT_WAYPOINT); - - runScriptFunction(self->name); - - activateNextWaypoint(self->id); - - battle.stats[STAT_WAYPOINTS_VISITED]++; + if (self->health && player != NULL && getDistance(player->x, player->y, self->x, self->y) <= 128 && isCurrentObjective() && teamMatesClose()) + { + self->health = 0; + + updateObjective("Waypoint", TT_WAYPOINT); + + runScriptFunction(self->name); + + activateNextWaypoint(self->id); + + battle.stats[STAT_WAYPOINTS_VISITED]++; + } } } @@ -79,7 +83,7 @@ static int isCurrentObjective(void) if (numActiveObjectives > 1) { addHudMessage(colors.cyan, _("Cannot activate waypoint - outstanding objectives not yet complete")); - self->thinkTime = FPS; + self->aiActionTime = FPS; return 0; } @@ -97,7 +101,7 @@ static int teamMatesClose(void) if (getDistance(player->x, player->y, e->x, e->y) > 350) { addHudMessage(colors.cyan, _("Cannot activate waypoint - team mates too far away")); - self->thinkTime = FPS; + self->aiActionTime = FPS; return 0; } } From 5d38abcbebdaedd254dcef49eef5358a62c3e508 Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 12 Mar 2016 12:12:12 +0000 Subject: [PATCH 12/51] Use EF_DISABLED, instead of system power. --- data/missions/rothan/01 - rothan defence #1.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/data/missions/rothan/01 - rothan defence #1.json b/data/missions/rothan/01 - rothan defence #1.json index d762c03..ea40cb3 100644 --- a/data/missions/rothan/01 - rothan defence #1.json +++ b/data/missions/rothan/01 - rothan defence #1.json @@ -75,8 +75,7 @@ "y" : 25, "number" : 12, "scatter" : 5000, - "systemPower" : 0, - "flags" : "+EF_NO_KILL+EF_MISSION_TARGET" + "flags" : "+EF_DISABLED+EF_NO_KILL+EF_MISSION_TARGET" }, { "name" : "CSN Tug", From 71b0a00689df9f3baf08230a126b4f335b8531f8 Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 12 Mar 2016 12:35:05 +0000 Subject: [PATCH 13/51] Use EF_DISABLED for jumpgates, rather than systemPower. --- .../coyote/03 - coyote assault #3.json | 4 +-- .../granada/02 - suspect packages #2.json | 4 +-- .../rothan/02 - rothan defence #2.json | 4 +-- src/battle/hud.c | 6 ++-- src/battle/hud.h | 1 + src/battle/jumpgate.c | 24 +++++++++++-- src/battle/script.c | 3 +- src/battle/script.h | 1 + src/galaxy/mission.c | 34 ++++++++++++------- 9 files changed, 57 insertions(+), 24 deletions(-) diff --git a/data/missions/coyote/03 - coyote assault #3.json b/data/missions/coyote/03 - coyote assault #3.json index 1d71700..74e6198 100644 --- a/data/missions/coyote/03 - coyote assault #3.json +++ b/data/missions/coyote/03 - coyote assault #3.json @@ -74,7 +74,7 @@ "type" : "ET_JUMPGATE", "x" : 25, "y" : 25, - "systemPower" : 0 + "flags" : "+EF_DISABLED" } ], "script" : [ @@ -99,7 +99,7 @@ "MSG_BOX Dodds;Estelle, we've got this. We can take them.", "MSG_BOX de Winter;We're taking too many losses, Dodds. Fall back now, that's an order.", "WAIT_MSG_BOX", - "ACTIVATE_JUMPGATE", + "ACTIVATE_JUMPGATE 1", "RETREAT_ALLIES" ] } diff --git a/data/missions/granada/02 - suspect packages #2.json b/data/missions/granada/02 - suspect packages #2.json index 8c83f4e..2f76c94 100644 --- a/data/missions/granada/02 - suspect packages #2.json +++ b/data/missions/granada/02 - suspect packages #2.json @@ -110,7 +110,7 @@ "type" : "ET_JUMPGATE", "x" : 10, "y" : 8, - "systemPower" : 0 + "flags" : "+EF_DISABLED" } ], "items" : [ @@ -159,7 +159,7 @@ "WAIT 2", "MSG_BOX Tug;Tow cable attached. Ready to head home.", "MSG_BOX Carr;We're done here. Let's bring our mystery guest in.", - "ACTIVATE_JUMPGATE", + "ACTIVATE_JUMPGATE 1", "WAIT 20", "ACTIVATE_ENTITIES Dart", "ACTIVATE_OBJECTIVES Destroy intercepting Darts", diff --git a/data/missions/rothan/02 - rothan defence #2.json b/data/missions/rothan/02 - rothan defence #2.json index 2960b49..42b580d 100644 --- a/data/missions/rothan/02 - rothan defence #2.json +++ b/data/missions/rothan/02 - rothan defence #2.json @@ -101,7 +101,7 @@ "type" : "ET_JUMPGATE", "x" : 30, "y" : 1, - "systemPower" : 0 + "flags" : "+EF_DISABLED" } ], "script" : [ @@ -146,7 +146,7 @@ "MSG_BOX Control;Commander, your current missions has been aborted. Return to the jumpgate. We need a full report as to what just happened out there.", "MSG_BOX Spencer;Got it, coming home.", "WAIT_MSG_BOX", - "ACTIVATE_JUMPGATE", + "ACTIVATE_JUMPGATE 1", "ACTIVATE_OBJECTIVES Retreat to jumpgate", "RETREAT_ALLIES" ] diff --git a/src/battle/hud.c b/src/battle/hud.c index 85eda92..eca800b 100644 --- a/src/battle/hud.c +++ b/src/battle/hud.c @@ -330,7 +330,7 @@ static void drawPlayerTargeter(void) float angle; int x, y; - if (player->target || battle.missionTarget || (battle.jumpgate && battle.jumpgate->systemPower)) + if (player->target || battle.missionTarget || jumpgateEnabled()) { if (player->target) { @@ -376,7 +376,7 @@ static void drawPlayerTargeter(void) blitRotated(targetPointer, x - battle.camera.x, y - battle.camera.y, angle); } - if (battle.jumpgate && battle.jumpgate->systemPower) + if (jumpgateEnabled()) { angle = getAngle(player->x, player->y, battle.jumpgate->x, battle.jumpgate->y); x = player->x; @@ -478,7 +478,7 @@ static void drawDistancesInfo(void) y += 25; } - if (battle.jumpgate && battle.jumpgate->systemPower) + if (jumpgateEnabled()) { distance = distanceToKM(player->x, player->y, battle.jumpgate->x, battle.jumpgate->y); diff --git a/src/battle/hud.h b/src/battle/hud.h index 832fc6e..b67c9b8 100644 --- a/src/battle/hud.h +++ b/src/battle/hud.h @@ -34,6 +34,7 @@ extern int getPercent(float current, float total); extern int playerHasGun(int type); extern char *getTranslatedString(char *string); extern char *timeToString(long millis, int showHours); +extern int jumpgateEnabled(void); extern App app; extern Battle battle; diff --git a/src/battle/jumpgate.c b/src/battle/jumpgate.c index 5dec983..64c6365 100644 --- a/src/battle/jumpgate.c +++ b/src/battle/jumpgate.c @@ -45,6 +45,26 @@ Entity *spawnJumpgate(void) return jumpgate; } +int jumpgateEnabled(void) +{ + return (battle.jumpgate && (!(battle.jumpgate->flags & EF_DISABLED))); +} + +void activateJumpgate(int activate) +{ + if (battle.jumpgate) + { + if (activate) + { + battle.jumpgate->flags &= ~EF_DISABLED; + } + else + { + battle.jumpgate->flags |= EF_DISABLED; + } + } +} + static void think(void) { self->thinkTime = 4; @@ -55,7 +75,7 @@ static void think(void) self->angle -= 360; } - if (self->systemPower) + if (jumpgateEnabled()) { handleFleeingEntities(); } @@ -128,7 +148,7 @@ static void addEscapeEffect(Entity *ent) static void draw(void) { - if (self->systemPower) + if (jumpgateEnabled()) { blitRotated(portal, self->x - battle.camera.x, self->y - battle.camera.y, portalAngle); } diff --git a/src/battle/script.c b/src/battle/script.c index 73e195c..91b58c4 100644 --- a/src/battle/script.c +++ b/src/battle/script.c @@ -211,7 +211,8 @@ static void executeNextLine(ScriptRunner *runner) } else if (strcmp(command, "ACTIVATE_JUMPGATE") == 0) { - battle.jumpgate->systemPower = MAX_SYSTEM_POWER; + sscanf(line, "%*s %d", &intParam[0]); + activateJumpgate(intParam[0]); } else if (strcmp(command, "ACTIVATE_NEXT_WAYPOINT") == 0) { diff --git a/src/battle/script.h b/src/battle/script.h index 2f05ea9..b2c98c1 100644 --- a/src/battle/script.h +++ b/src/battle/script.h @@ -36,6 +36,7 @@ extern int showingMessageBoxes(void); extern char *getTranslatedString(char *string); extern void spawnScriptFighter(char *fighters, char *side, int num, char *location); extern void activateNextWaypoint(int id); +extern void activateJumpgate(int activate); extern Battle battle; extern Colors colors; diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index 6529aaa..1f5150c 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -374,7 +374,7 @@ static void loadFighters(cJSON *node) Entity *e; char **types, *name, *groupName, *type; int side, scatter, number, active; - int i, numTypes, addFlags, addAIFlags, systemPower; + int i, numTypes, addFlags, addAIFlags; long flags, aiFlags; float x, y; @@ -398,7 +398,6 @@ static void loadFighters(cJSON *node) number = getJSONValue(node, "number", 1); scatter = getJSONValue(node, "scatter", 1); active = getJSONValue(node, "active", 1); - systemPower = getJSONValue(node, "systemPower", MAX_SYSTEM_POWER); if (cJSON_GetObjectItem(node, "flags")) { @@ -461,12 +460,6 @@ static void loadFighters(cJSON *node) { STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); } - - e->systemPower = systemPower; - if (!e->systemPower) - { - e->flags |= EF_DISABLED; - } } node = node->next; @@ -572,8 +565,9 @@ static void loadEntities(cJSON *node) { Entity *e; char *name, *groupName; - int i, type, scatter, number, active, systemPower; + int i, type, scatter, number, active, addFlags; float x, y; + long flags; if (node) { @@ -593,7 +587,11 @@ static void loadEntities(cJSON *node) number = getJSONValue(node, "number", 1); active = getJSONValue(node, "active", 1); scatter = getJSONValue(node, "scatter", 1); - systemPower = getJSONValue(node, "systemPower", MAX_SYSTEM_POWER); + + if (cJSON_GetObjectItem(node, "flags")) + { + flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); + } for (i = 0 ; i < number ; i++) { @@ -622,6 +620,20 @@ static void loadEntities(cJSON *node) { STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); } + + if (flags != -1) + { + if (addFlags) + { + e->flags |= flags; + } + else + { + e->flags = flags; + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); + } + } e->x = x; e->y = y; @@ -634,8 +646,6 @@ static void loadEntities(cJSON *node) e->active = active; - e->systemPower = systemPower; - SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); } From a5509b5bcdd558e2ffa0c8d064eea6ff138c7dcc Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 12 Mar 2016 15:12:52 +0000 Subject: [PATCH 14/51] Logging updates. --- src/battle/capitalShips.c | 4 ++++ src/battle/fighters.c | 4 ++++ src/battle/script.c | 2 +- src/galaxy/mission.c | 4 ++++ src/main.c | 5 ++++- src/system/i18n.c | 2 +- src/system/init.c | 4 ++-- src/system/widgets.c | 4 ++++ 8 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/battle/capitalShips.c b/src/battle/capitalShips.c index b5910cd..12f0aed 100644 --- a/src/battle/capitalShips.c +++ b/src/battle/capitalShips.c @@ -379,6 +379,10 @@ static void loadCapitalShipDef(char *filename) cJSON_Delete(root); } + else + { + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Failed to load '%s'", filename); + } free(text); } diff --git a/src/battle/fighters.c b/src/battle/fighters.c index 11b1339..7c8ec45 100644 --- a/src/battle/fighters.c +++ b/src/battle/fighters.c @@ -764,6 +764,10 @@ static void loadFighterDef(char *filename) cJSON_Delete(root); } + else + { + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Failed to load '%s'", filename); + } free(text); } diff --git a/src/battle/script.c b/src/battle/script.c index 91b58c4..929422b 100644 --- a/src/battle/script.c +++ b/src/battle/script.c @@ -41,7 +41,7 @@ void initScript(cJSON *scriptNode) while (function) { - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Script Function: '%s'", cJSON_GetObjectItem(function, "function")->valuestring); + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Found script function: '%s'", cJSON_GetObjectItem(function, "function")->valuestring); function = function->next; } diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index 1f5150c..69700eb 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -121,6 +121,10 @@ Mission *loadMissionMeta(char *filename) cJSON_Delete(root); } + else + { + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Failed to load '%s'", filename); + } free(text); diff --git a/src/main.c b/src/main.c index c1d08d7..6617833 100644 --- a/src/main.c +++ b/src/main.c @@ -27,9 +27,10 @@ int main(int argc, char *argv[]) float td; long then, lastFrameTime, frames; long expireTextTimer; - SDL_Event event; + SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN); + memset(&app, 0, sizeof(App)); memset(&dev, 0, sizeof(Dev)); @@ -169,6 +170,8 @@ static void handleArguments(int argc, char *argv[]) dev.debug = 1; createScreenshotFolder(); + + SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG); } } } diff --git a/src/system/i18n.c b/src/system/i18n.c index 6f17493..7283929 100644 --- a/src/system/i18n.c +++ b/src/system/i18n.c @@ -79,7 +79,7 @@ void setLanguage(char *applicationName, char *languageCode) STRNCPY(language, lang, MAX_LINE_LENGTH); } - printf("Locale is %s\n", language); + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Locale is %s", language); sprintf(c, "%s/%s/LC_MESSAGES/%s.mo", LOCALE_DIR, language, applicationName); diff --git a/src/system/init.c b/src/system/init.c index e9651c6..2d04920 100644 --- a/src/system/init.c +++ b/src/system/init.c @@ -338,10 +338,10 @@ void cleanup(void) destroyWidgets(); destroyResources(); + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Done"); TTF_Quit(); SDL_Quit(); - - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Done"); } diff --git a/src/system/widgets.c b/src/system/widgets.c index 67690b0..d8fa666 100644 --- a/src/system/widgets.c +++ b/src/system/widgets.c @@ -427,6 +427,10 @@ static void loadWidgetSet(char *filename) cJSON_Delete(root); } + else + { + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Failed to load '%s'", filename); + } free(text); } From 0d074eaa222e14dc8e7985ca8e0affc0037fd143 Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 12 Mar 2016 15:13:04 +0000 Subject: [PATCH 15/51] JSON bug fix. --- data/missions/alba/01 - patrol #1.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/missions/alba/01 - patrol #1.json b/data/missions/alba/01 - patrol #1.json index 206968b..34495c5 100644 --- a/data/missions/alba/01 - patrol #1.json +++ b/data/missions/alba/01 - patrol #1.json @@ -47,7 +47,7 @@ "lines" : [ "ACTIVATE_NEXT_WAYPOINT" ] - } + }, { "function" : "Waypoint #2", "lines" : [ From cca080e88f420668882a36686fde286338e4cce2 Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 12 Mar 2016 15:13:12 +0000 Subject: [PATCH 16/51] Updated i18n. --- locale/tbftss.pot | 52 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/locale/tbftss.pot b/locale/tbftss.pot index d349a58..1eea83f 100644 --- a/locale/tbftss.pot +++ b/locale/tbftss.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: TBFTSS: The Pandoran War\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-03-10 15:44:08+0000\n" +"POT-Creation-Date: 2016-03-12 15:00:11+0000\n" "PO-Revision-Date: ???\n" "Last-Translator: ???\n" "Language-Team: ???\n" @@ -190,6 +190,9 @@ msgstr "" msgid "Collect %d packages" msgstr "" +msgid "Rescue %d civilians" +msgstr "" + msgid "%s has fallen to the Pandorans" msgstr "" @@ -934,7 +937,7 @@ msgstr "" msgid "Can you disable the gate remotely?" msgstr "" -msgid "Negative, the Pandorans have control. We're working take back command function. Stand by." +msgid "Negative, the Pandorans have control. We're working take back command functions. Stand by." msgstr "" msgid "Griffin, all enemy tugs have been dispatched." @@ -955,6 +958,51 @@ msgstr "" msgid "I knew I could count on you, de Winter. Head back to Griffin." msgstr "" +msgid "Control, we're in position. Awaiting the Irregular Nomads." +msgstr "" + +msgid "Irregular Nomads have just exited the jumpgate. They'll be with you shortly." +msgstr "" + +msgid "Commander Spencer, we're on our way. We'll join you at the waypoint." +msgstr "" + +msgid "Acknowledged, Lieutenant, we'll see you in a bit." +msgstr "" + +msgid "Control, we're ready to--" +msgstr "" + +msgid "Commander, be advised that we are detecting UNF fighters advancing on your position, several Nymphs and Fireflies. They are not responding to requests to identify presence or purpose." +msgstr "" + +msgid "Pandorans?" +msgstr "" + +msgid "Their signatures don't suggest so." +msgstr "" + +msgid "Commander, incoming fighters are hostile. Suggest you prepare to engage or fallback to the jumpgate." +msgstr "" + +msgid "Acknowledged, moving to engage." +msgstr "" + +msgid "Control, enemy targets have been eliminated." +msgstr "" + +msgid "Any survivors?" +msgstr "" + +msgid "Negative, I didn't see anyone eject from those fighters." +msgstr "" + +msgid "Commander, your current missions has been aborted. Return to the jumpgate. We need a full report as to what just happened out there." +msgstr "" + +msgid "Got it, coming home." +msgstr "" + msgid "A simple test flight. Get used to piloting your fighter, without threat of attack or any other dangers to face. There are no objectives to complete in this mission, so you may quit it at any time and move on to the next one." msgstr "" From 160f65a15bdd7ae968eed506da6ee58324b76690 Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 13 Mar 2016 10:50:32 +0000 Subject: [PATCH 17/51] Added EF_NO_KILL_INC to prevent kill count increment. --- data/capitalShips/csnCorvette01.json | 38 ++++++++++++------------- data/capitalShips/csnCorvette02.json | 38 ++++++++++++------------- data/capitalShips/infCorvette01.json | 34 +++++++++++----------- data/capitalShips/infCorvette02.json | 40 +++++++++++++------------- data/capitalShips/unfCorvette01.json | 42 ++++++++++++++-------------- data/capitalShips/unfCorvette02.json | 40 +++++++++++++------------- src/battle/bullets.c | 2 +- src/battle/fighters.c | 7 +++-- src/defs.h | 1 + 9 files changed, 123 insertions(+), 119 deletions(-) diff --git a/data/capitalShips/csnCorvette01.json b/data/capitalShips/csnCorvette01.json index fe36e4c..afc1ee4 100644 --- a/data/capitalShips/csnCorvette01.json +++ b/data/capitalShips/csnCorvette01.json @@ -10,56 +10,56 @@ "texture" : "gfx/capitalShips/csnCorvette01/core.png", "x" : 0, "y" : -140, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component1.png", "x" : 0, "y" : -200, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component2.png", "x" : -34, "y" : 25, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component2.png", "x" : 34, "y" : 25, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component2.png", "x" : -16, "y" : 25, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component2.png", "x" : 16, "y" : 25, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component3.png", "x" : -23, "y" : 242, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component3.png", "x" : 23, "y" : 242, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "engines" : [ @@ -68,35 +68,35 @@ "texture" : "gfx/capitalShips/csnCorvette01/engine1.png", "x" : -150, "y" : 293, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette01/engine1.png", "x" : 150, "y" : 293, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette01/engine1.png", "x" : -90, "y" : 293, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette01/engine1.png", "x" : 90, "y" : 293, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette01/engine1.png", "x" : 0, "y" : 296, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "guns" : [ @@ -107,7 +107,7 @@ "y" : 200, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -118,7 +118,7 @@ "y" : 200, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -129,7 +129,7 @@ "y" : 100, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -140,7 +140,7 @@ "y" : 100, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -151,7 +151,7 @@ "y" : -50, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -162,7 +162,7 @@ "y" : 175, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 } diff --git a/data/capitalShips/csnCorvette02.json b/data/capitalShips/csnCorvette02.json index f19b6e1..96fe100 100644 --- a/data/capitalShips/csnCorvette02.json +++ b/data/capitalShips/csnCorvette02.json @@ -10,49 +10,49 @@ "texture" : "gfx/capitalShips/csnCorvette02/core.png", "x" : 0, "y" : -140, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette02/component1.png", "x" : -105, "y" : 195, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette02/component1.png", "x" : 105, "y" : 195, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette02/component2.png", "x" : -25, "y" : 18, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette02/component3.png", "x" : 25, "y" : 18, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette02/component4.png", "x" : -67, "y" : -117, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette02/component5.png", "x" : 67, "y" : -117, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "engines" : [ @@ -61,28 +61,28 @@ "texture" : "gfx/capitalShips/csnCorvette02/engine1.png", "x" : -70, "y" : 253, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette02/engine2.png", "x" : -25, "y" : 247, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette02/engine2.png", "x" : 25, "y" : 247, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette02/engine1.png", "x" : 70, "y" : 253, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "guns" : [ @@ -93,7 +93,7 @@ "y" : -225, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -104,7 +104,7 @@ "y" : -60, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -115,7 +115,7 @@ "y" : -60, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -126,7 +126,7 @@ "y" : 70, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -137,7 +137,7 @@ "y" : 110, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -148,7 +148,7 @@ "y" : 110, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -159,7 +159,7 @@ "y" : 240, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -170,7 +170,7 @@ "y" : 240, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 } diff --git a/data/capitalShips/infCorvette01.json b/data/capitalShips/infCorvette01.json index dcc575e..3076e2a 100644 --- a/data/capitalShips/infCorvette01.json +++ b/data/capitalShips/infCorvette01.json @@ -10,56 +10,56 @@ "texture" : "gfx/capitalShips/infCorvette01/component1.png", "x" : -27, "y" : 100, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component2.png", "x" : 27, "y" : 100, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component3.png", "x" : 20, "y" : -17, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component3.png", "x" : -20, "y" : -17, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component4.png", "x" : -21, "y" : -64, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component5.png", "x" : 21, "y" : -64, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component6.png", "x" : -22, "y" : -243, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component6.png", "x" : 22, "y" : -243, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "engines" : [ @@ -68,21 +68,21 @@ "texture" : "gfx/capitalShips/infCorvette01/engine1.png", "x" : -50, "y" : 285, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/engine1.png", "x" : 50, "y" : 285, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/engine2.png", "x" : 0, "y" : 280, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "guns" : [ @@ -93,7 +93,7 @@ "y" : 170, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -104,7 +104,7 @@ "y" : -150, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -115,7 +115,7 @@ "y" : 50, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -125,7 +125,7 @@ "y" : 50, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -135,7 +135,7 @@ "y" : -60, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -145,7 +145,7 @@ "y" : -60, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" } ] diff --git a/data/capitalShips/infCorvette02.json b/data/capitalShips/infCorvette02.json index da38ba1..b240440 100644 --- a/data/capitalShips/infCorvette02.json +++ b/data/capitalShips/infCorvette02.json @@ -10,63 +10,63 @@ "texture" : "gfx/capitalShips/infCorvette02/core.png", "x" : 0, "y" : -80, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component1.png", "x" : -32, "y" : -75, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component1.png", "x" : 32, "y" : -75, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component2.png", "x" : -95, "y" : 195, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component2.png", "x" : 95, "y" : 195, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component3.png", "x" : -30, "y" : 210, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component3.png", "x" : 30, "y" : 210, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component4.png", "x" : -24, "y" : -20, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component4.png", "x" : 24, "y" : -20, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "guns" : [ @@ -77,7 +77,7 @@ "y" : 200, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -88,7 +88,7 @@ "y" : 200, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -99,7 +99,7 @@ "y" : 200, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -110,7 +110,7 @@ "y" : 0, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -121,7 +121,7 @@ "y" : 100, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -132,7 +132,7 @@ "y" : -125, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -143,7 +143,7 @@ "y" : -125, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 } @@ -154,28 +154,28 @@ "texture" : "gfx/capitalShips/infCorvette02/engine1.png", "x" : -75, "y" : 275, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/engine2.png", "x" : -20, "y" : 275, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/engine3.png", "x" : 20, "y" : 275, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/engine4.png", "x" : 75, "y" : 275, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ] } diff --git a/data/capitalShips/unfCorvette01.json b/data/capitalShips/unfCorvette01.json index bf5eb3d..f5f6011 100644 --- a/data/capitalShips/unfCorvette01.json +++ b/data/capitalShips/unfCorvette01.json @@ -10,63 +10,63 @@ "texture" : "gfx/capitalShips/unfCorvette01/core.png", "x" : 0, "y" : -100, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component1.png", "x" : -42, "y" : -36, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component1.png", "x" : 42, "y" : -36, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component2.png", "x" : -40, "y" : -8, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component2.png", "x" : 40, "y" : -8, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component3.png", "x" : -40, "y" : 68, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component4.png", "x" : 40, "y" : 68, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component5.png", "x" : -40, "y" : 128, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component5.png", "x" : 40, "y" : 128, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "engines" : [ @@ -75,28 +75,28 @@ "texture" : "gfx/capitalShips/unfCorvette01/engine1.png", "x" : -112, "y" : 281, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/unfCorvette01/engine1.png", "x" : 112, "y" : 281, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/unfCorvette01/engine2.png", "x" : -34, "y" : 268, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/unfCorvette01/engine2.png", "x" : 34, "y" : 268, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "guns" : [ @@ -107,7 +107,7 @@ "y" : -250, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -118,7 +118,7 @@ "y" : -250, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -129,7 +129,7 @@ "y" : 20, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -139,7 +139,7 @@ "y" : 20, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -149,7 +149,7 @@ "y" : 100, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -160,7 +160,7 @@ "y" : 100, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -171,7 +171,7 @@ "y" : 180, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -181,7 +181,7 @@ "y" : 180, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" } ] diff --git a/data/capitalShips/unfCorvette02.json b/data/capitalShips/unfCorvette02.json index 911a837..5ce4d6e 100644 --- a/data/capitalShips/unfCorvette02.json +++ b/data/capitalShips/unfCorvette02.json @@ -10,49 +10,49 @@ "texture" : "gfx/capitalShips/unfCorvette01/core.png", "x" : 0, "y" : -100, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette02/component1.png", "x" : -22, "y" : -24, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette02/component1.png", "x" : 22, "y" : -24, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette02/component2.png", "x" : -86, "y" : 188, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette02/component2.png", "x" : 86, "y" : 188, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette02/component3.png", "x" : -43, "y" : 151, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette02/component3.png", "x" : 43, "y" : 151, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "engines" : [ @@ -61,28 +61,28 @@ "texture" : "gfx/capitalShips/unfCorvette02/engine1.png", "x" : -100, "y" : 286, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/unfCorvette02/engine1.png", "x" : 100, "y" : 286, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/unfCorvette02/engine2.png", "x" : -35, "y" : 289, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/unfCorvette02/engine2.png", "x" : 35, "y" : 289, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "guns" : [ @@ -93,7 +93,7 @@ "y" : -250, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -104,7 +104,7 @@ "y" : 30, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -115,7 +115,7 @@ "y" : 30, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -126,7 +126,7 @@ "y" : 30, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -136,7 +136,7 @@ "y" : -70, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -146,7 +146,7 @@ "y" : -70, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -156,7 +156,7 @@ "y" : 170, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -166,7 +166,7 @@ "y" : 210, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -176,7 +176,7 @@ "y" : 210, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" } ] diff --git a/src/battle/bullets.c b/src/battle/bullets.c index d7e233f..ef11737 100644 --- a/src/battle/bullets.c +++ b/src/battle/bullets.c @@ -203,7 +203,7 @@ static void checkCollisions(Bullet *b) } /* assuming that health <= 0 will always mean killed */ - if (e->health <= 0 && b->owner == player) + if (e->health <= 0 && b->owner == player && (!(e->flags & EF_NO_KILL_INC))) { battle.stats[STAT_ENEMIES_KILLED_PLAYER]++; battle.stats[STAT_EPIC_KILL_STREAK]++; diff --git a/src/battle/fighters.c b/src/battle/fighters.c index 7c8ec45..01fb800 100644 --- a/src/battle/fighters.c +++ b/src/battle/fighters.c @@ -321,9 +321,12 @@ void doFighter(void) { if (self->side != SIDE_ALLIES) { - battle.stats[STAT_ENEMIES_KILLED]++; + if (!(self->flags & EF_NO_KILL_INC)) + { + battle.stats[STAT_ENEMIES_KILLED]++; - runScriptFunction("ENEMIES_KILLED %d", battle.stats[STAT_ENEMIES_KILLED]); + runScriptFunction("ENEMIES_KILLED %d", battle.stats[STAT_ENEMIES_KILLED]); + } } else { diff --git a/src/defs.h b/src/defs.h index eed8c23..0006108 100644 --- a/src/defs.h +++ b/src/defs.h @@ -96,6 +96,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define EF_AI_TARGET (2 << 13) #define EF_AI_LEADER (2 << 14) #define EF_ROPED_ATTACHED (2 << 15) +#define EF_NO_KILL_INC (2 << 16) #define AIF_NONE 0 #define AIF_FOLLOWS_PLAYER (2 << 0) From 34e48805352c052127128652a123014b61474466 Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 13 Mar 2016 10:50:41 +0000 Subject: [PATCH 18/51] Added challenge #11. --- data/challenges/11.json | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 data/challenges/11.json diff --git a/data/challenges/11.json b/data/challenges/11.json new file mode 100644 index 0000000..a4f4293 --- /dev/null +++ b/data/challenges/11.json @@ -0,0 +1,49 @@ +{ + "name" : "Destroy INF Klondike and INF Canfield", + "description" : "Destroy INF Klondike and INF Canfield", + "background" : "AUTO", + "planet" : "AUTO", + "music" : "AUTO", + "player" : { + "type" : "ATAF", + "side" : "SIDE_ALLIES", + "pilot" : "-", + "squadron" : "-", + "x" : 25, + "y" : 25 + }, + "challenge" : { + "killLimit" : 2, + "timeLimit" : 90, + "challenges" : [ + { + "type" : "CHALLENGE_TIME", + "value" : 50 + }, + { + "type" : "CHALLENGE_TIME", + "value" : 90 + }, + { + "type" : "CHALLENGE_SHOT_ACCURACY", + "value" : 88 + } + ] + }, + "capitalShips" : [ + { + "name" : "INF Klondike", + "types" : "INF Corvette 01", + "side" : "SIDE_PANDORAN", + "x" : 23, + "y" : 23 + }, + { + "name" : "INF Canfield", + "types" : "INF Corvette 01", + "side" : "SIDE_PANDORAN", + "x" : 27, + "y" : 27 + } + ] +} From b37a2681695501ecc5e5e2d131fdb7d210dcea10 Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 13 Mar 2016 10:51:48 +0000 Subject: [PATCH 19/51] Added capital ships to challenge killLimit check. --- src/challenges/challenges.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/challenges/challenges.c b/src/challenges/challenges.c index 27082ad..fcedc30 100644 --- a/src/challenges/challenges.c +++ b/src/challenges/challenges.c @@ -109,7 +109,7 @@ static int challengeFinished(void) } /* disabled enemies count as killed during challenges - not player exclusive, but no need to worry about AI contributions here */ - if (game.currentMission->challengeData.killLimit > 0 && (battle.stats[STAT_ENEMIES_KILLED_PLAYER] + battle.stats[STAT_ENEMIES_DISABLED]) >= game.currentMission->challengeData.killLimit) + if (game.currentMission->challengeData.killLimit > 0 && (battle.stats[STAT_ENEMIES_KILLED_PLAYER] + battle.stats[STAT_CAPITAL_SHIPS_DESTROYED] + battle.stats[STAT_ENEMIES_DISABLED]) >= game.currentMission->challengeData.killLimit) { return 1; } From 7b0c70005f410d9f127b6d304fb056a7fd0ddb98 Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 13 Mar 2016 10:52:02 +0000 Subject: [PATCH 20/51] Lookup updates. --- src/system/lookup.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/system/lookup.c b/src/system/lookup.c index b2810b9..c72bbcb 100644 --- a/src/system/lookup.c +++ b/src/system/lookup.c @@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. static Lookup head; static Lookup *tail; -static void addLookup(char *name, long value); +static void addLookup(char *name, long value); void initLookups(void) { @@ -60,6 +60,7 @@ void initLookups(void) addLookup("EF_SECONDARY_TARGET", EF_SECONDARY_TARGET); addLookup("EF_AI_TARGET", EF_AI_TARGET); addLookup("EF_AI_LEADER", EF_AI_LEADER); + addLookup("EF_NO_KILL_INC", EF_NO_KILL_INC); addLookup("AIF_NONE", AIF_NONE); addLookup("AIF_MOVES_TO_PLAYER", AIF_MOVES_TO_PLAYER); From 35b5e4a1c65a3cc71d8700779691820d45fd2e34 Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 13 Mar 2016 10:52:12 +0000 Subject: [PATCH 21/51] Misc cleanup. --- data/challenges/08.json | 4 ++-- src/battle/ai.c | 2 +- src/battle/battle.h | 1 - src/system/init.h | 1 - 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/data/challenges/08.json b/data/challenges/08.json index c88db75..38997bd 100644 --- a/data/challenges/08.json +++ b/data/challenges/08.json @@ -1,6 +1,6 @@ { - "name" : "Defend Jumpgate Point", - "description" : "Defend Jumpgate Point", + "name" : "Defend Jumpgate", + "description" : "Defend Jumpgate", "background" : "AUTO", "planet" : "AUTO", "music" : "AUTO", diff --git a/src/battle/ai.c b/src/battle/ai.c index 074f221..8cbdf27 100644 --- a/src/battle/ai.c +++ b/src/battle/ai.c @@ -65,7 +65,7 @@ void doAI(void) if ((self->aiFlags & AIF_GOAL_JUMPGATE) && nearJumpgate()) { - /* near jumpgate point, but you might decide to continue to fight, anyway */ + /* near jumpgate, but you might decide to continue to fight, anyway */ if ((self->aiFlags & AIF_COVERS_RETREAT) && rand() % 3) { return; diff --git a/src/battle/battle.h b/src/battle/battle.h index 0662b49..975a5bb 100644 --- a/src/battle/battle.h +++ b/src/battle/battle.h @@ -67,7 +67,6 @@ extern void initQuadtree(Quadtree *root); extern void initEffects(void); extern void doScript(void); extern void destroyScript(void); -extern void runScriptFunction(char *format, ...); extern void initMessageBox(void); extern void doMessageBox(void); extern void drawMessageBox(void); diff --git a/src/system/init.h b/src/system/init.h index 6d6dd05..5c14532 100644 --- a/src/system/init.h +++ b/src/system/init.h @@ -40,7 +40,6 @@ extern void loadCapitalShipDefs(void); extern void loadItemDefs(void); extern void initFonts(void); extern void initBulletDefs(void); -extern void initBattle(void); extern void initGame(void); extern void initStats(void); extern void initStarSystems(void); From ad96a70b0a6eb33f019fd9c2379473c13d4bd1bf Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 13 Mar 2016 10:54:50 +0000 Subject: [PATCH 22/51] i18n updates. --- locale/tbftss.pot | 29 ++++++++++++++++++++++++++++- tools/updateI18N.sh | 4 ++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/locale/tbftss.pot b/locale/tbftss.pot index 1eea83f..3467b9a 100644 --- a/locale/tbftss.pot +++ b/locale/tbftss.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: TBFTSS: The Pandoran War\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-03-12 15:00:11+0000\n" +"POT-Creation-Date: 2016-03-13 10:54:24+0000\n" "PO-Revision-Date: ???\n" "Last-Translator: ???\n" "Language-Team: ???\n" @@ -1216,3 +1216,30 @@ msgstr "" msgid "Likewise. Maybe we'll get it do it again some day, though a part of me really hopes we won't need to ...." msgstr "" +msgid "Destroy all Darts" +msgstr "" + +msgid "Destroy all Lynxes" +msgstr "" + +msgid "Disable all targets" +msgstr "" + +msgid "60 second battle" +msgstr "" + +msgid "Pass all Waypoints" +msgstr "" + +msgid "Defend Jumpgate" +msgstr "" + +msgid "Collect Packages" +msgstr "" + +msgid "Rescue Civilians" +msgstr "" + +msgid "Destroy INF Klondike and INF Canfield" +msgstr "" + diff --git a/tools/updateI18N.sh b/tools/updateI18N.sh index 4163840..d570a60 100755 --- a/tools/updateI18N.sh +++ b/tools/updateI18N.sh @@ -101,6 +101,10 @@ function extractJSON($filename) } } } + else if (strpos($filename, "challenges") !== false) + { + addString($json->{"description"}); + } } function recurseDir($dir) From 35e23e84505d65b13944df96603c4e8a7606e79a Mon Sep 17 00:00:00 2001 From: Steve Date: Mon, 14 Mar 2016 08:30:19 +0000 Subject: [PATCH 23/51] Added large explosions, for capital ships. --- src/battle/capitalShips.c | 6 ++++-- src/battle/capitalShips.h | 1 + src/battle/effects.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/battle/capitalShips.c b/src/battle/capitalShips.c index 12f0aed..7e351e9 100644 --- a/src/battle/capitalShips.c +++ b/src/battle/capitalShips.c @@ -297,13 +297,15 @@ static void die(void) self->alive = ALIVE_DEAD; - addDebris(self->x, self->y, 50); + addLargeExplosion(); + + addDebris(self->x, self->y, 12); for (e = battle.entityHead.next ; e != NULL ; e = e->next) { if (e->owner == self) { - e->health = 0; + e->alive = ALIVE_DEAD; } } diff --git a/src/battle/capitalShips.h b/src/battle/capitalShips.h index 88fd79a..61102e1 100644 --- a/src/battle/capitalShips.h +++ b/src/battle/capitalShips.h @@ -48,6 +48,7 @@ extern void updateObjective(char *name, int type); extern char **getFileList(char *dir, int *count); extern int getJSONValue(cJSON *node, char *name, int defValue); extern char *getTranslatedString(char *string); +extern void addLargeExplosion(void); extern Battle battle; extern Entity *self; diff --git a/src/battle/effects.c b/src/battle/effects.c index 8c67054..9fb123b 100644 --- a/src/battle/effects.c +++ b/src/battle/effects.c @@ -284,6 +284,40 @@ void addSmallExplosion(void) } } +void addLargeExplosion(void) +{ + int i; + Effect *e; + + for (i = 0 ; i < 64 ; i++) + { + e = malloc(sizeof(Effect)); + memset(e, 0, sizeof(Effect)); + battle.effectTail->next = e; + battle.effectTail = e; + + e->type = EFFECT_TEXTURE; + + e->x = self->x + rand() % 255 - rand() % 255; + e->y = self->y + rand() % 255 - rand() % 255; + e->dx = (rand() % 25) - (rand() % 25); + e->dx *= 0.01; + e->dy = (rand() % 25) - (rand() % 25); + e->dy *= 0.01; + e->texture = explosionTexture; + e->size = 128 + (rand() % 512); + e->r = 255; + + setRandomFlameHue(e); + + e->a = 128 + (rand() % 128); + e->health = e->a; + + e->x -= e->size / 2; + e->y -= e->size / 2; + } +} + void addMissileExplosion(Bullet *b) { int i; From 380ca3e26aae761dba7515f5e5cf634ee7a3539d Mon Sep 17 00:00:00 2001 From: Steve Date: Mon, 14 Mar 2016 08:30:34 +0000 Subject: [PATCH 24/51] Tweaked accuracy threshold. --- data/challenges/11.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/challenges/11.json b/data/challenges/11.json index a4f4293..3bebd5a 100644 --- a/data/challenges/11.json +++ b/data/challenges/11.json @@ -26,7 +26,7 @@ }, { "type" : "CHALLENGE_SHOT_ACCURACY", - "value" : 88 + "value" : 90 } ] }, From edc18579ec9e0d9c00add5eeec6568cb689f7f2f Mon Sep 17 00:00:00 2001 From: Steve Date: Mon, 14 Mar 2016 11:12:22 +0000 Subject: [PATCH 25/51] Added support for spawners. --- common.mk | 2 +- src/battle/battle.c | 12 ++++++++ src/battle/battle.h | 1 + src/battle/spawners.c | 69 +++++++++++++++++++++++++++++++++++++++++++ src/battle/spawners.h | 26 ++++++++++++++++ src/galaxy/mission.c | 40 ++++++++++++++++++++++--- src/structs.h | 17 +++++++++++ 7 files changed, 162 insertions(+), 5 deletions(-) create mode 100644 src/battle/spawners.c create mode 100644 src/battle/spawners.h diff --git a/common.mk b/common.mk index ebd2cba..84a8ad0 100644 --- a/common.mk +++ b/common.mk @@ -24,7 +24,7 @@ OBJS += objectives.o options.o OBJS += player.o OBJS += quadtree.o OBJS += radar.o resources.o rope.o -OBJS += save.o script.o sound.o starfield.o starSystems.o stats.o +OBJS += save.o script.o sound.o spawners.o starfield.o starSystems.o stats.o OBJS += testMission.o textures.o text.o title.o transition.o trophies.o OBJS += util.o OBJS += waypoints.o widgets.o diff --git a/src/battle/battle.c b/src/battle/battle.c index 62149b9..2607f15 100644 --- a/src/battle/battle.c +++ b/src/battle/battle.c @@ -47,6 +47,7 @@ void initBattle(void) battle.effectTail = &battle.effectHead; battle.objectiveTail = &battle.objectiveHead; battle.locationTail = &battle.locationHead; + battle.spawnerTail = &battle.spawnerHead; app.delegate.logic = &logic; app.delegate.draw = &draw; @@ -140,6 +141,8 @@ static void doBattle(void) doStars(ssx, ssy); doBullets(); + + doSpawners(); doEntities(); @@ -383,6 +386,7 @@ void destroyBattle(void) Effect *e; Objective *o; Location *l; + Spawner *s; while (battle.entityHead.next) { @@ -431,6 +435,14 @@ void destroyBattle(void) free(l); } battle.locationTail = &battle.locationHead; + + while (battle.spawnerHead.next) + { + s = battle.spawnerHead.next; + battle.spawnerHead.next = s->next; + free(s); + } + battle.spawnerTail = &battle.spawnerHead; cJSON_Delete(battle.missionJSON); diff --git a/src/battle/battle.h b/src/battle/battle.h index 975a5bb..3464db7 100644 --- a/src/battle/battle.h +++ b/src/battle/battle.h @@ -84,6 +84,7 @@ extern void initChallengeHome(void); extern void updateAccuracyStats(unsigned int *stats); extern void clearInput(void); extern void runScriptTimeFunctions(void); +extern void doSpawners(void); extern App app; extern Battle battle; diff --git a/src/battle/spawners.c b/src/battle/spawners.c new file mode 100644 index 0000000..326f161 --- /dev/null +++ b/src/battle/spawners.c @@ -0,0 +1,69 @@ +/* +Copyright (C) 2015-2016 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 "spawners.h" + +void doSpawners(void) +{ + Entity *e; + Spawner *s; + char *type; + int i, num; + + for (s = battle.spawnerHead.next ; s != NULL ; s = s->next) + { + if (s->active && --s->time <= 0) + { + num = s->step; + + if (s->limit) + { + num = MIN(s->step, s->total); + + s->total -= num; + } + + for (i = 0 ; i < num ; i++) + { + type = s->types[rand() % s->numTypes]; + + e = spawnFighter(type, 0, 0, s->side); + + if (s->offscreen) + { + e->x = player->x; + e->y = player->y; + } + else + { + e->x = rand() % 2 ? 0 : BATTLE_AREA_WIDTH; + e->y = rand() % 2 ? 0 : BATTLE_AREA_HEIGHT; + } + + e->x += (rand() % 2) ? -SCREEN_WIDTH : SCREEN_WIDTH; + e->y += (rand() % 2) ? -SCREEN_HEIGHT : SCREEN_HEIGHT; + + e->aiFlags |= AIF_UNLIMITED_RANGE; + } + + s->time = s->interval; + } + } +} diff --git a/src/battle/spawners.h b/src/battle/spawners.h new file mode 100644 index 0000000..f6f44b9 --- /dev/null +++ b/src/battle/spawners.h @@ -0,0 +1,26 @@ +/* +Copyright (C) 2015-2016 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 "../common.h" + +extern Entity *spawnFighter(char *name, int x, int y, int side); + +extern Battle battle; +extern Entity *player; diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index 69700eb..9f761ea 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -27,6 +27,7 @@ static void loadCapitalShips(cJSON *node); static void loadEntities(cJSON *node); static void loadItems(cJSON *node); static void loadLocations(cJSON *node); +static void loadSpawners(cJSON *node); static unsigned long hashcode(const char *str); static void loadEpicData(cJSON *node); static char *getAutoBackground(char *filename); @@ -160,6 +161,8 @@ void loadMission(char *filename) loadItems(cJSON_GetObjectItem(root, "items")); loadLocations(cJSON_GetObjectItem(root, "locations")); + + loadSpawners(cJSON_GetObjectItem(root, "spawners")); if (cJSON_GetObjectItem(root, "epic")) { @@ -757,14 +760,43 @@ static void loadLocations(cJSON *node) STRNCPY(l->name, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); l->x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; l->y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; - l->size = cJSON_GetObjectItem(node, "size")->valueint; - - active = getJSONValue(node, "active", 1); + l->active = active = getJSONValue(node, "active", 1); l->x += (SCREEN_WIDTH / 2); l->y += (SCREEN_HEIGHT / 2); - l->active = active; + + + node = node->next; + } + } +} + +static void loadSpawners(cJSON *node) +{ + int active; + Spawner *s; + + if (node) + { + node = node->child; + + while (node) + { + s = malloc(sizeof(Spawner)); + memset(s, 0, sizeof(Spawner)); + battle.spawnerTail->next = s; + battle.spawnerTail = s; + + STRNCPY(s->name, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); + s->types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &s->numTypes); + s->side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); + s->interval = cJSON_GetObjectItem(node, "interval")->valueint * FPS; + s->limit = cJSON_GetObjectItem(node, "limit")->valueint; + s->total = cJSON_GetObjectItem(node, "total")->valueint; + s->step = cJSON_GetObjectItem(node, "step")->valueint; + s->offscreen = getJSONValue(node, "offscreen", 0); + s->active = active = getJSONValue(node, "active", 1); node = node->next; } diff --git a/src/structs.h b/src/structs.h index 334d792..9bbc0f8 100644 --- a/src/structs.h +++ b/src/structs.h @@ -26,6 +26,7 @@ typedef struct Entity Entity; typedef struct Bullet Bullet; typedef struct Debris Debris; typedef struct Effect Effect; +typedef struct Spawner Spawner; typedef struct Objective Objective; typedef struct StarSystem StarSystem; typedef struct Challenge Challenge; @@ -303,6 +304,21 @@ struct Quadtree { Quadtree *node[4]; }; +struct Spawner { + char name[MAX_NAME_LENGTH]; + char **types; + int numTypes; + int side; + int time; + int interval; + int limit; + int total; + int step; + int offscreen; + int active; + Spawner *next; +}; + typedef struct { int entId; SDL_Point camera; @@ -332,6 +348,7 @@ typedef struct { Effect effectHead, *effectTail; Objective objectiveHead, *objectiveTail; Location locationHead, *locationTail; + Spawner spawnerHead, *spawnerTail; struct cJSON *missionJSON; unsigned int stats[STAT_MAX]; Quadtree quadtree; From 4e8b85b6a126bf849c9ca279ffe8672180db588c Mon Sep 17 00:00:00 2001 From: Steve Date: Mon, 14 Mar 2016 11:28:01 +0000 Subject: [PATCH 26/51] Removed script-based spawner. Redundant. --- data/challenges/10.json | 14 ++++++---- src/battle/battle.c | 2 +- src/battle/battle.h | 2 +- src/battle/fighters.c | 36 ------------------------- src/battle/script.c | 59 ----------------------------------------- src/battle/script.h | 1 - 6 files changed, 11 insertions(+), 103 deletions(-) diff --git a/data/challenges/10.json b/data/challenges/10.json index 53e2535..3303f3f 100644 --- a/data/challenges/10.json +++ b/data/challenges/10.json @@ -49,12 +49,16 @@ "y" : 25 } ], - "script" : [ + "spawners" : [ { - "function" : "INTERVAL 30", - "lines" : [ - "SPAWN_FIGHTERS Dart SIDE_PIRATE 1 OFFSCREEN" - ] + "name" : "spawner", + "types" : "Dart", + "side" : "SIDE_PIRATE", + "interval" : 30, + "limit" : 0, + "total" : 0, + "step" : 1, + "offscreen" : 1 } ] } diff --git a/src/battle/battle.c b/src/battle/battle.c index 2607f15..522964c 100644 --- a/src/battle/battle.c +++ b/src/battle/battle.c @@ -164,7 +164,7 @@ static void doBattle(void) if (battle.stats[STAT_TIME]++ % FPS == 0) { - runScriptTimeFunctions(); + runScriptFunction("TIME %d", battle.stats[STAT_TIME]); } } } diff --git a/src/battle/battle.h b/src/battle/battle.h index 3464db7..6825177 100644 --- a/src/battle/battle.h +++ b/src/battle/battle.h @@ -83,7 +83,7 @@ extern void destroyEffects(void); extern void initChallengeHome(void); extern void updateAccuracyStats(unsigned int *stats); extern void clearInput(void); -extern void runScriptTimeFunctions(void); +extern void runScriptFunction(const char *format, ...); extern void doSpawners(void); extern App app; diff --git a/src/battle/fighters.c b/src/battle/fighters.c index 01fb800..081a352 100644 --- a/src/battle/fighters.c +++ b/src/battle/fighters.c @@ -99,42 +99,6 @@ Entity *spawnFighter(char *name, int x, int y, int side) return e; } -void spawnScriptFighter(char *fighterTypes, char *sideStr, int num, char *location) -{ - Entity *e; - int i, numTypes, side, offscreen; - char **types, *type; - - types = toTypeArray(fighterTypes, &numTypes); - side = lookup(sideStr); - offscreen = strcmp(location, "OFFSCREEN") == 0; - - for (i = 0 ; i < num ; i++) - { - type = types[rand() % numTypes]; - - e = spawnFighter(type, 0, 0, side); - - if (offscreen) - { - e->x = player->x; - e->y = player->y; - } - else - { - e->x = rand() % 2 ? 0 : BATTLE_AREA_WIDTH; - e->y = rand() % 2 ? 0 : BATTLE_AREA_HEIGHT; - } - - e->x += (rand() % 2) ? -SCREEN_WIDTH : SCREEN_WIDTH; - e->y += (rand() % 2) ? -SCREEN_HEIGHT : SCREEN_HEIGHT; - - e->aiFlags |= AIF_UNLIMITED_RANGE; - } - - free(types); -} - static void randomizeDart(Entity *dart) { char texture[MAX_DESCRIPTION_LENGTH]; diff --git a/src/battle/script.c b/src/battle/script.c index 929422b..fd22259 100644 --- a/src/battle/script.c +++ b/src/battle/script.c @@ -124,60 +124,6 @@ void runScriptFunction(const char *format, ...) } } -void runScriptTimeFunctions(void) -{ - ScriptRunner *scriptRunner; - cJSON *function; - char *functionName; - char funcNameBuffer[MAX_NAME_LENGTH]; - int intParam; - - if (scriptJSON) - { - function = scriptJSON->child; - - sprintf(funcNameBuffer, "TIME %d", battle.stats[STAT_TIME] / 60); - - while (function) - { - functionName = cJSON_GetObjectItem(function, "function")->valuestring; - - if (strcmp(functionName, funcNameBuffer) == 0) - { - scriptRunner = malloc(sizeof(ScriptRunner)); - memset(scriptRunner, 0, sizeof(ScriptRunner)); - - scriptRunner->line = cJSON_GetObjectItem(function, "lines")->child; - - tail->next = scriptRunner; - tail = scriptRunner; - - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Running script '%s'", funcNameBuffer); - } - - if (strstr(functionName, "INTERVAL")) - { - sscanf(functionName, "%*s %d", &intParam); - - if ((battle.stats[STAT_TIME] / 60) % intParam == 0) - { - scriptRunner = malloc(sizeof(ScriptRunner)); - memset(scriptRunner, 0, sizeof(ScriptRunner)); - - scriptRunner->line = cJSON_GetObjectItem(function, "lines")->child; - - tail->next = scriptRunner; - tail = scriptRunner; - - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Running script '%s'", funcNameBuffer); - } - } - - function = function->next; - } - } -} - static void executeNextLine(ScriptRunner *runner) { char *line; @@ -256,11 +202,6 @@ static void executeNextLine(ScriptRunner *runner) battle.isEpic = 0; retreatEnemies(); } - else if (strcmp(command, "SPAWN_FIGHTERS") == 0) - { - sscanf(line, "%*s %s %s %d %s", strParam[0], strParam[1], &intParam[0], strParam[2]); - spawnScriptFighter(strParam[0], strParam[1], intParam[0], strParam[2]); - } else { printf("ERROR: Unrecognised script command '%s'\n", command); diff --git a/src/battle/script.h b/src/battle/script.h index b2c98c1..1c92b56 100644 --- a/src/battle/script.h +++ b/src/battle/script.h @@ -34,7 +34,6 @@ extern void activateLocations(char *locations); void activateObjectives(char *objectives); extern int showingMessageBoxes(void); extern char *getTranslatedString(char *string); -extern void spawnScriptFighter(char *fighters, char *side, int num, char *location); extern void activateNextWaypoint(int id); extern void activateJumpgate(int activate); From 634d914bd9076dd97d00046ce709f9367db98a81 Mon Sep 17 00:00:00 2001 From: Steve Date: Mon, 14 Mar 2016 11:28:19 +0000 Subject: [PATCH 27/51] Jumpgate initial state fix. --- src/galaxy/mission.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index 9f761ea..14844eb 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -588,6 +588,7 @@ static void loadEntities(cJSON *node) y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; name = NULL; groupName = NULL; + flags = -1; name = getJSONValueStr(node, "name", NULL); groupName = getJSONValueStr(node, "groupName", NULL); From 612e76fe0431516bcbe5baeff4ce4df28cd400be Mon Sep 17 00:00:00 2001 From: Steve Date: Mon, 14 Mar 2016 17:54:56 +0000 Subject: [PATCH 28/51] Added INF Swarmer. --- data/fighters/swarmer.json | 15 +++++++++++++++ gfx/fighters/swarmer.png | Bin 0 -> 1459 bytes 2 files changed, 15 insertions(+) create mode 100644 data/fighters/swarmer.json create mode 100644 gfx/fighters/swarmer.png diff --git a/data/fighters/swarmer.json b/data/fighters/swarmer.json new file mode 100644 index 0000000..5979ef2 --- /dev/null +++ b/data/fighters/swarmer.json @@ -0,0 +1,15 @@ +{ + "name" : "Swarmer", + "health" : 5, + "speed" : 2, + "reloadTime" : 8, + "texture" : "gfx/fighters/swarmer.png", + "guns" : [ + { + "type" : "BT_PARTICLE", + "x" : 0, + "y" : 0 + } + ], + "flags" : "EF_TAKES_DAMAGE" +} diff --git a/gfx/fighters/swarmer.png b/gfx/fighters/swarmer.png new file mode 100644 index 0000000000000000000000000000000000000000..34a9285feb4d7f5797412c8bd5b8cb83182927a8 GIT binary patch literal 1459 zcmV;k1x)&hP)X1^@s6D=Y3@00006VoOIv00000 z008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~$d3Cn@-RUylF)02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00kRKL_t(Y$CZ|SXjXL;$3OSw zx%YY5v$i?hqo%e^ab}^kbiPc&mf}mkG)6dIkVWQ@DWoW6K}I5?LB+qo8EL5z zX{iw@=ZpaIG>*!XfC0)mgM097jH_3%f!ee*^6ve_GDbZuPOsqd!_uYFQX^8gVuj>h z>Xh6|o$}f2+0s%Yva+C{E0bQcQ6C4|BGer@NbcmR08DVXFm;`2Z+;EHN{@%NUhhA! z9@b6(KJt3W8abqdqoBPXU-(!<4i3%{yFzA<)!>#uAZoM>B#ng3lRi#se3oR`? zIQ|QDhxQ{PXo^C6BtrB3`!ofE-G1$%5E&CE^1VZ%0+>KJ9_O!E41mqMJ!pzTTR2Q> zC`8;Lv?HAiA3Tsd?d^m`@S7$+(1Vk(gTZEtY?j6mBAF#uHKl zYlmtY6XF}Vcx4U;nwu#yP4Y@h88Uo0seu4jE?;Kr*|WS3qyTFg8_CsmW)&CHFDr|* zL4)|Sv5_X*Mm<+W&YjhqP`~1;Z6_r1C<5}fKbqatBmPN3mgO&#m2wN5nB?;qO zfb9@8ln8zOeln7i$x2VBznbXT%FCBgfb*8sQ-e8%L27gz!GYz}T)Re#ZSzHCC6)-L zqA<4#s7L^Z9Du$99Dq3RLViBB z2+yXZaBFV@G!-x$f?Inbuw)6g2+skBw`~I;;PEh&DO^`S?2*U-imFGFW|{z)ih|cL zNHR@KU1z=XkE=kZLr}5D%k}&Bxe^Q#?C9WzQ@=i@Nm2Dk`Z_hy0a8?zs=|7rnF*t~ z2ws;9MNx3OT)60w=dSa8DIO=KxfuccrrBLoT~VkitS8l@KGbMH(~AqSL|BxaO-(e) zsl$g!Pf8+?oJ^*s@#C^(40IxTXTk(-+BVl(Te;WK!Tx>wsES0`nwN)1*BLl@6#=Iv zO4nsK!!YQVnTcZC1Uw!-X=vbWx0{8frKEbjoGULU*4Bm%RJvUFb8;{>jpp;`IUb9# zDL0n^UN3!oK7z-NF|X%F?HLwR4MPOvX0^zcF=OPBA=2x+dc+91SuG+U-}wE#PB{Uj z$Ta24{Cp{4qii2H?n%R4%7zV-5;n?~@#AHg$MY|6{gDMgsv;4dKYf}R1ty`e`ozJV zmYhC$2t4(jVe*;7cE?eDkx^w^l N002ovPDHLkV1kTZn$G|L literal 0 HcmV?d00001 From 1fbf31e56c535d71d3047ade43c75be1ead9a7ea Mon Sep 17 00:00:00 2001 From: Steve Date: Mon, 14 Mar 2016 17:55:09 +0000 Subject: [PATCH 29/51] Don't check spawners if player is dead. --- src/battle/battle.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle/battle.c b/src/battle/battle.c index 522964c..bde30ff 100644 --- a/src/battle/battle.c +++ b/src/battle/battle.c @@ -141,8 +141,6 @@ static void doBattle(void) doStars(ssx, ssy); doBullets(); - - doSpawners(); doEntities(); @@ -154,6 +152,8 @@ static void doBattle(void) if (player != NULL) { + doSpawners(); + doLocations(); doMessageBox(); From 13344ddc06f091faf20390efbcfd246cc2b0a126 Mon Sep 17 00:00:00 2001 From: Steve Date: Mon, 14 Mar 2016 17:55:34 +0000 Subject: [PATCH 30/51] Made many attributes optional. --- data/craft/civilian.json | 3 --- data/craft/infTug.json | 2 -- data/craft/munitionsTransport.json | 1 - data/craft/shuttle.json | 1 - data/craft/tug.json | 2 -- data/fighters/cannonDart.json | 2 -- data/fighters/dart.json | 2 -- data/fighters/missileDart.json | 2 -- data/fighters/simpleDart.json | 2 -- data/fighters/staticDart.json | 2 -- data/fighters/unarmedDart.json | 2 -- .../clarke/05 - clarke defence #5.json | 26 +++++++++++++++++++ data/missions/mace/01 - rebel assault #1.json | 2 +- src/battle/fighters.c | 6 ++--- 14 files changed, 30 insertions(+), 25 deletions(-) create mode 100644 data/missions/clarke/05 - clarke defence #5.json diff --git a/data/craft/civilian.json b/data/craft/civilian.json index 8e81ac6..8e9e449 100644 --- a/data/craft/civilian.json +++ b/data/craft/civilian.json @@ -1,10 +1,7 @@ { "name" : "Civilian", "health" : 15, - "shield" : 0, "speed" : 2, - "reloadTime" : 0, - "shieldRechargeRate" : 0, "texture" : "gfx/craft/civilian01.png", "flags" : "EF_MISSION_TARGET+EF_RETREATING+EF_TAKES_DAMAGE", "aiFlags" : "AIF_GOAL_JUMPGATE+AIF_AVOIDS_COMBAT+AIF_FOLLOWS_PLAYER" diff --git a/data/craft/infTug.json b/data/craft/infTug.json index 473ad61..2e406b5 100644 --- a/data/craft/infTug.json +++ b/data/craft/infTug.json @@ -1,10 +1,8 @@ { "name" : "INF Tug", "health" : 50, - "shield" : 0, "speed" : 1.85, "reloadTime" : 10, - "shieldRechargeRate" : 0, "texture" : "gfx/craft/infTug.png", "flags" : "EF_HAS_ROPE+EF_TAKES_DAMAGE", "aiFlags" : "AIF_AVOIDS_COMBAT+AIF_TOWS" diff --git a/data/craft/munitionsTransport.json b/data/craft/munitionsTransport.json index 9998c16..d5fcbcc 100644 --- a/data/craft/munitionsTransport.json +++ b/data/craft/munitionsTransport.json @@ -4,7 +4,6 @@ "shield" : 50, "speed" : 1.5, "reloadTime" : 10, - "shieldRechargeRate" : 0, "texture" : "gfx/craft/munitionsTransport.png", "flags" : "EF_TAKES_DAMAGE", "aiFlags" : "AIF_AVOIDS_COMBAT" diff --git a/data/craft/shuttle.json b/data/craft/shuttle.json index c415548..931bb22 100644 --- a/data/craft/shuttle.json +++ b/data/craft/shuttle.json @@ -3,7 +3,6 @@ "health" : 15, "shield" : 15, "speed" : 2, - "reloadTime" : 0, "shieldRechargeRate" : 60, "texture" : "gfx/craft/shuttle.png", "flags" : "EF_COLLECTS_ITEMS+EF_TAKES_DAMAGE+EF_NO_EPIC", diff --git a/data/craft/tug.json b/data/craft/tug.json index b8392d5..88302c9 100644 --- a/data/craft/tug.json +++ b/data/craft/tug.json @@ -1,10 +1,8 @@ { "name" : "Tug", "health" : 50, - "shield" : 0, "speed" : 1.85, "reloadTime" : 10, - "shieldRechargeRate" : 0, "texture" : "gfx/craft/tug.png", "guns" : [ { diff --git a/data/fighters/cannonDart.json b/data/fighters/cannonDart.json index 8da3cb8..9f4c0f4 100644 --- a/data/fighters/cannonDart.json +++ b/data/fighters/cannonDart.json @@ -1,10 +1,8 @@ { "name" : "CannonDart", "health" : 15, - "shield" : 0, "speed" : 2.1, "reloadTime" : 24, - "shieldRechargeRate" : 0, "texture" : "gfx/fighters/dart01.png", "guns" : [ { diff --git a/data/fighters/dart.json b/data/fighters/dart.json index 3862aec..d1a4d94 100644 --- a/data/fighters/dart.json +++ b/data/fighters/dart.json @@ -1,10 +1,8 @@ { "name" : "Dart", "health" : 15, - "shield" : 0, "speed" : 2.1, "reloadTime" : 24, - "shieldRechargeRate" : 0, "texture" : "gfx/fighters/dart01.png", "guns" : [ { diff --git a/data/fighters/missileDart.json b/data/fighters/missileDart.json index 8088334..52f41c1 100644 --- a/data/fighters/missileDart.json +++ b/data/fighters/missileDart.json @@ -1,10 +1,8 @@ { "name" : "MissileDart", "health" : 15, - "shield" : 0, "speed" : 2.1, "reloadTime" : 24, - "shieldRechargeRate" : 0, "texture" : "gfx/fighters/dart01.png", "missiles" : 999, "flags" : "EF_TAKES_DAMAGE" diff --git a/data/fighters/simpleDart.json b/data/fighters/simpleDart.json index a1d4e9d..53eec64 100644 --- a/data/fighters/simpleDart.json +++ b/data/fighters/simpleDart.json @@ -1,10 +1,8 @@ { "name" : "SimpleDart", "health" : 15, - "shield" : 0, "speed" : 2.1, "reloadTime" : 24, - "shieldRechargeRate" : 0, "texture" : "gfx/fighters/dart01.png", "guns" : [ { diff --git a/data/fighters/staticDart.json b/data/fighters/staticDart.json index b427114..57fd6d7 100644 --- a/data/fighters/staticDart.json +++ b/data/fighters/staticDart.json @@ -1,10 +1,8 @@ { "name" : "StaticDart", "health" : 15, - "shield" : 0, "speed" : 0, "reloadTime" : 24, - "shieldRechargeRate" : 0, "texture" : "gfx/fighters/dart01.png", "flags" : "EF_TAKES_DAMAGE" } diff --git a/data/fighters/unarmedDart.json b/data/fighters/unarmedDart.json index 42e81ed..97d6269 100644 --- a/data/fighters/unarmedDart.json +++ b/data/fighters/unarmedDart.json @@ -1,10 +1,8 @@ { "name" : "UnarmedDart", "health" : 15, - "shield" : 0, "speed" : 2.1, "reloadTime" : 24, - "shieldRechargeRate" : 0, "texture" : "gfx/fighters/dart01.png", "flags" : "EF_TAKES_DAMAGE" } diff --git a/data/missions/clarke/05 - clarke defence #5.json b/data/missions/clarke/05 - clarke defence #5.json new file mode 100644 index 0000000..859c28c --- /dev/null +++ b/data/missions/clarke/05 - clarke defence #5.json @@ -0,0 +1,26 @@ +{ + "name" : "Clarke Defence #5", + "description" : "", + "requires" : 28, + "background" : "gfx/backgrounds/background06.jpg", + "planet" : "gfx/planets/bluePlanet.png", + "music" : "music/battle/heroism.ogg", + "unwinnable" : 1, + "objectives" : [ + { + "description" : "Eliminate all enemy forces", + "targetName" : "Enemy", + "targetValue" : 1, + "targetType" : "TT_DESTROY", + "isEliminateAll" : 1 + } + ], + "player" : { + "type" : "Lynx", + "side" : "SIDE_ALLIES", + "pilot" : "-", + "squadron" : "-", + "x" : 25, + "y" : 45 + } +} diff --git a/data/missions/mace/01 - rebel assault #1.json b/data/missions/mace/01 - rebel assault #1.json index d119150..a797ac0 100644 --- a/data/missions/mace/01 - rebel assault #1.json +++ b/data/missions/mace/01 - rebel assault #1.json @@ -1,7 +1,7 @@ { "name" : "Rebel Assault #1", "description" : "", - "requires" : 28, + "requires" : 99, "background" : "gfx/backgrounds/background03.jpg", "planet" : "gfx/planets/spirit.png", "music" : "music/battle/InnerCore_Low.ogg", diff --git a/src/battle/fighters.c b/src/battle/fighters.c index 081a352..359183b 100644 --- a/src/battle/fighters.c +++ b/src/battle/fighters.c @@ -676,10 +676,10 @@ static void loadFighterDef(char *filename) STRNCPY(e->name, cJSON_GetObjectItem(root, "name")->valuestring, MAX_NAME_LENGTH); STRNCPY(e->defName, e->name, MAX_NAME_LENGTH); e->health = e->maxHealth = cJSON_GetObjectItem(root, "health")->valueint; - e->shield = e->maxShield = cJSON_GetObjectItem(root, "shield")->valueint; + e->shield = e->maxShield = getJSONValue(root, "shield", 0); e->speed = cJSON_GetObjectItem(root, "speed")->valuedouble; - e->reloadTime = cJSON_GetObjectItem(root, "reloadTime")->valueint; - e->shieldRechargeRate = cJSON_GetObjectItem(root, "shieldRechargeRate")->valueint; + e->reloadTime = getJSONValue(root, "reloadTime", 0); + e->shieldRechargeRate = getJSONValue(root, "shieldRechargeRate", 0); e->texture = getTexture(cJSON_GetObjectItem(root, "texture")->valuestring); SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); From 09e676d7134e497c3e2bb91faeac50a547d0823f Mon Sep 17 00:00:00 2001 From: Steve Date: Wed, 16 Mar 2016 06:53:07 +0000 Subject: [PATCH 31/51] Added simple die, to prevent swarmers spreading debris everywhere. --- data/fighters/swarmer.json | 4 +++- src/battle/fighters.c | 16 ++++++++++++++-- src/defs.h | 3 ++- src/system/lookup.c | 1 + 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/data/fighters/swarmer.json b/data/fighters/swarmer.json index 5979ef2..28ba13e 100644 --- a/data/fighters/swarmer.json +++ b/data/fighters/swarmer.json @@ -11,5 +11,7 @@ "y" : 0 } ], - "flags" : "EF_TAKES_DAMAGE" + "deathType" : "DT_SIMPLE", + "flags" : "EF_TAKES_DAMAGE", + "aiFlags" : "AIF_UNLIMITED_RANGE" } diff --git a/src/battle/fighters.c b/src/battle/fighters.c index 359183b..12eca9f 100644 --- a/src/battle/fighters.c +++ b/src/battle/fighters.c @@ -25,6 +25,7 @@ static void die(void); static void immediateDie(void); static void spinDie(void); static void straightDie(void); +static void simpleDie(void); static void randomizeDart(Entity *dart); static void randomizeDartGuns(Entity *dart); static void loadFighterDef(char *filename); @@ -495,6 +496,9 @@ static void die(void) case DT_INSTANT: n = 2; break; + case DT_SIMPLE: + n = 3; + break; } if (self == player && battle.isEpic) @@ -507,14 +511,15 @@ static void die(void) case 0: self->action = spinDie; break; - case 1: self->action = straightDie; break; - case 2: self->action = immediateDie; break; + case 3: + self->action = simpleDie; + break; } } @@ -572,6 +577,13 @@ static void straightDie(void) } } +static void simpleDie(void) +{ + self->alive = ALIVE_DEAD; + addSmallExplosion(); + playBattleSound(SND_EXPLOSION_1 + rand() % 4, self->x, self->y); +} + void retreatEnemies(void) { Entity *e; diff --git a/src/defs.h b/src/defs.h index 0006108..1ac1255 100644 --- a/src/defs.h +++ b/src/defs.h @@ -199,7 +199,8 @@ enum { DT_ANY, DT_NO_SPIN, - DT_INSTANT + DT_INSTANT, + DT_SIMPLE }; enum diff --git a/src/system/lookup.c b/src/system/lookup.c index c72bbcb..e818fd2 100644 --- a/src/system/lookup.c +++ b/src/system/lookup.c @@ -82,6 +82,7 @@ void initLookups(void) addLookup("DT_ANY", DT_ANY); addLookup("DT_NO_SPIN", DT_NO_SPIN); addLookup("DT_INSTANT", DT_INSTANT); + addLookup("DT_SIMPLE", DT_SIMPLE); addLookup("TT_DESTROY", TT_DESTROY); addLookup("TT_DISABLE", TT_DISABLE); From 604526611acc1855778cfdccf224d35d7c860d0e Mon Sep 17 00:00:00 2001 From: Steve Date: Wed, 16 Mar 2016 06:53:20 +0000 Subject: [PATCH 32/51] Increased flock leading distance. --- src/battle/ai.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle/ai.c b/src/battle/ai.c index 8cbdf27..2fc03d9 100644 --- a/src/battle/ai.c +++ b/src/battle/ai.c @@ -607,7 +607,7 @@ static void moveToPlayer(void) { if (fabs(player->dx) >= 1 && fabs(player->dy) >= 1) { - wantedAngle = getAngle(player->x, player->y, player->x + (player->dx * 100), player->y + (player->dy * 100)); + wantedAngle = getAngle(player->x, player->y, player->x + (player->dx * 1000), player->y + (player->dy * 1000)); turnToFace(wantedAngle); @@ -805,7 +805,7 @@ static void moveToLeader(void) { if (fabs(self->leader->dx) >= 1 && fabs(self->leader->dy) >= 1) { - wantedAngle = getAngle(self->leader->x, self->leader->y, self->leader->x + (self->leader->dx * 10), self->leader->y + (self->leader->dy * 10)); + wantedAngle = getAngle(self->leader->x, self->leader->y, self->leader->x + (self->leader->dx * 1000), self->leader->y + (self->leader->dy * 1000)); turnToFace(wantedAngle); From 0332e2fe20696cc5f7699ad41a052c9ec1292f09 Mon Sep 17 00:00:00 2001 From: Steve Date: Wed, 16 Mar 2016 06:53:30 +0000 Subject: [PATCH 33/51] Fixed time script bug. --- src/battle/battle.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle/battle.c b/src/battle/battle.c index bde30ff..a1c58ba 100644 --- a/src/battle/battle.c +++ b/src/battle/battle.c @@ -164,7 +164,7 @@ static void doBattle(void) if (battle.stats[STAT_TIME]++ % FPS == 0) { - runScriptFunction("TIME %d", battle.stats[STAT_TIME]); + runScriptFunction("TIME %d", battle.stats[STAT_TIME] / FPS); } } } From 30fa446006e56488bcab9c6922d6d60d3d281c4e Mon Sep 17 00:00:00 2001 From: Steve Date: Wed, 16 Mar 2016 06:53:49 +0000 Subject: [PATCH 34/51] Allow script to activate spawners. --- src/battle/script.c | 5 +++++ src/battle/script.h | 1 + src/battle/spawners.c | 25 ++++++++++++++++++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/battle/script.c b/src/battle/script.c index fd22259..8cd4a4b 100644 --- a/src/battle/script.c +++ b/src/battle/script.c @@ -164,6 +164,11 @@ static void executeNextLine(ScriptRunner *runner) { activateNextWaypoint(0); } + else if (strcmp(command, "ACTIVATE_SPAWNERS") == 0) + { + sscanf(line, "%*s %[^;] %d", strParam[0], &intParam[0]); + activateSpawner(strParam[0], intParam[0]); + } else if (strcmp(command, "MSG_BOX") == 0) { sscanf(line, "%*s %255[^;]%*c%255[^\n]", strParam[0], strParam[1]); diff --git a/src/battle/script.h b/src/battle/script.h index 1c92b56..7fb5f4c 100644 --- a/src/battle/script.h +++ b/src/battle/script.h @@ -36,6 +36,7 @@ extern int showingMessageBoxes(void); extern char *getTranslatedString(char *string); extern void activateNextWaypoint(int id); extern void activateJumpgate(int activate); +extern void activateSpawner(char *name, int active); extern Battle battle; extern Colors colors; diff --git a/src/battle/spawners.c b/src/battle/spawners.c index 326f161..82a0ecd 100644 --- a/src/battle/spawners.c +++ b/src/battle/spawners.c @@ -33,13 +33,15 @@ void doSpawners(void) { num = s->step; - if (s->limit) + if (s->total != -1) { num = MIN(s->step, s->total); s->total -= num; } + battle.numInitialEnemies += num; + for (i = 0 ; i < num ; i++) { type = s->types[rand() % s->numTypes]; @@ -67,3 +69,24 @@ void doSpawners(void) } } } + +void activateSpawner(char *names, int active) +{ + Spawner *s; + char *name; + + name = strtok(names, ";"); + + while (name) + { + for (s = battle.spawnerHead.next ; s != NULL ; s = s->next) + { + if (strcmp(s->name, name) == 0) + { + s->active = active; + } + } + + name = strtok(NULL, ";"); + } +} From 4ef796bf9235a915f0e95aa82d25cf7ef49a7f94 Mon Sep 17 00:00:00 2001 From: Steve Date: Wed, 16 Mar 2016 06:54:34 +0000 Subject: [PATCH 35/51] Added id to objective, to allow script to function in non-English languages. --- src/battle/objectives.c | 2 +- src/galaxy/mission.c | 5 +++-- src/structs.h | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/battle/objectives.c b/src/battle/objectives.c index c3d57a5..8fd3c39 100644 --- a/src/battle/objectives.c +++ b/src/battle/objectives.c @@ -205,7 +205,7 @@ void activateObjectives(char *objectives) { for (o = battle.objectiveHead.next ; o != NULL ; o = o->next) { - if (strcmp(token, o->description) == 0) + if (strcmp(token, o->id) == 0) { addHudMessage(colors.cyan, _("New Objective : %s"), o->description); o->active = 1; diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index 14844eb..88099cc 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -329,6 +329,7 @@ static void loadObjectives(cJSON *node) battle.objectiveTail->next = o; battle.objectiveTail = o; + STRNCPY(o->id, cJSON_GetObjectItem(node, "description")->valuestring, MAX_DESCRIPTION_LENGTH); 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; @@ -793,8 +794,8 @@ static void loadSpawners(cJSON *node) s->types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &s->numTypes); s->side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); s->interval = cJSON_GetObjectItem(node, "interval")->valueint * FPS; - s->limit = cJSON_GetObjectItem(node, "limit")->valueint; - s->total = cJSON_GetObjectItem(node, "total")->valueint; + s->limit = getJSONValue(node, "limit", 0); + s->total = getJSONValue(node, "total", 0); s->step = cJSON_GetObjectItem(node, "step")->valueint; s->offscreen = getJSONValue(node, "offscreen", 0); s->active = active = getJSONValue(node, "active", 1); diff --git a/src/structs.h b/src/structs.h index 9bbc0f8..9ddee64 100644 --- a/src/structs.h +++ b/src/structs.h @@ -226,6 +226,7 @@ struct Location { struct Objective { int active; + char id[MAX_DESCRIPTION_LENGTH]; char description[MAX_DESCRIPTION_LENGTH]; char targetName[MAX_NAME_LENGTH]; int targetType; From 50cde212f4014c3695d0e1e44c9cae053db67af5 Mon Sep 17 00:00:00 2001 From: Steve Date: Wed, 16 Mar 2016 06:55:07 +0000 Subject: [PATCH 36/51] Clark mission #5 tweaks. --- .../clarke/05 - clarke defence #5.json | 178 +++++++++++++++++- 1 file changed, 168 insertions(+), 10 deletions(-) diff --git a/data/missions/clarke/05 - clarke defence #5.json b/data/missions/clarke/05 - clarke defence #5.json index 859c28c..2433849 100644 --- a/data/missions/clarke/05 - clarke defence #5.json +++ b/data/missions/clarke/05 - clarke defence #5.json @@ -5,22 +5,180 @@ "background" : "gfx/backgrounds/background06.jpg", "planet" : "gfx/planets/bluePlanet.png", "music" : "music/battle/heroism.ogg", - "unwinnable" : 1, "objectives" : [ { - "description" : "Eliminate all enemy forces", - "targetName" : "Enemy", + "description" : "Eliminate support group #1", + "targetName" : "group-1", + "targetValue" : 5, + "targetType" : "TT_DESTROY" + }, + { + "description" : "Eliminate support group #2", + "targetName" : "group-2", + "targetValue" : 5, + "targetType" : "TT_DESTROY", + "active" : 0 + }, + { + "description" : "Destroy INF Alysha's Calling", + "targetName" : "Alysha's Calling", "targetValue" : 1, "targetType" : "TT_DESTROY", - "isEliminateAll" : 1 + "active" : 0 + }, + { + "description" : "Destroy incoming threat", + "targetName" : "swarmers-1", + "targetValue" : 24, + "targetType" : "TT_DESTROY", + "active" : 0 + }, + { + "description" : "Eliminate Swarmers", + "targetName" : "Swarmer", + "targetValue" : 50, + "targetType" : "TT_DESTROY", + "active" : 0 } ], "player" : { - "type" : "Lynx", + "type" : "Rook", "side" : "SIDE_ALLIES", - "pilot" : "-", - "squadron" : "-", - "x" : 25, - "y" : 45 - } + "pilot" : "Jessica Welch", + "squadron" : "Twilight Lancers", + "x" : 5, + "y" : 5 + }, + "fighters" : [ + { + "types" : "TAF;Ray;Kingfisher;Hammerhead", + "side" : "SIDE_ALLIES", + "x" : 5, + "y" : 5, + "number" : 7, + "scatter" : 600 + }, + { + "name" : "Pandoran", + "groupName" : "group-1", + "types" : "Jackal;Mantis", + "side" : "SIDE_PANDORAN", + "x" : 12, + "y" : 12, + "number" : 5, + "scatter" : 600 + }, + { + "name" : "Pandoran", + "groupName" : "group-2", + "types" : "Jackal;Mantis", + "side" : "SIDE_PANDORAN", + "x" : 12, + "y" : -1, + "number" : 5, + "scatter" : 0, + "active" : 0 + }, + { + "name" : "Unknown", + "groupName" : "swarmers-1", + "types" : "Swarmer", + "side" : "SIDE_PANDORAN", + "x" : -1, + "y" : 12, + "number" : 8, + "scatter" : 0, + "active" : 0 + }, + { + "name" : "Unknown", + "groupName" : "swarmers-1", + "types" : "Swarmer", + "side" : "SIDE_PANDORAN", + "x" : -1, + "y" : 18, + "number" : 8, + "scatter" : 0, + "active" : 0 + }, + { + "name" : "Unknown", + "groupName" : "swarmers-1", + "types" : "Swarmer", + "side" : "SIDE_PANDORAN", + "x" : -1, + "y" : 24, + "number" : 8, + "scatter" : 0, + "active" : 0 + } + ], + "spawners" : [ + { + "name" : "SwarmerSpawner", + "types" : "Swarmer", + "side" : "SIDE_PANDORAN", + "interval" : 1, + "total" : 50, + "step" : 1, + "offscreen" : 1, + "active" : 0 + } + ], + "script" : [ + { + "function" : "TIME 2", + "lines" : [ + "MSG_BOX Welch;First squadron sighted. Moving to intercept." + ] + }, + { + "function" : "ENEMIES_KILLED 5", + "lines" : [ + "WAIT 1", + "ACTIVATE_OBJECTIVES Eliminate support group #2", + "ACTIVATE_ENTITY_GROUPS group-2", + "MSG_BOX Welch;First squadron taken down, preparing to engage second." + ] + }, + { + "function" : "ENEMIES_KILLED 10", + "lines" : [ + "WAIT 1", + "MSG_BOX Welch;Second squadron down. Moving up the field to engage Alysha's Calling.", + "ACTIVATE_OBJECTIVES Destroy INF Alysha's Calling", + "WAIT_MSG_BOX", + "ACTIVATE_ENTITY_GROUPS swarmers-1", + "MSG_BOX CSN Thunderbird;Welch, we are tracking a large number of fast-moving heading your way. IDs don't match anything we currently have on record.", + "MSG_BOX Welch;Missiles?", + "MSG_BOX CSN Thunderbird;Too large. We'll relay more information as we get it. Be prepared to engage.", + "ACTIVATE_OBJECTIVES Destroy incoming threat" + ] + }, + { + "function" : "ENEMIES_KILLED 25", + "lines" : [ + "MSG_BOX Wingmate;Whatever these things are, they're not hard to dispatch.", + "MSG_BOX Welch;No, but there's a lot of them ...", + "WAIT_MSG_BOX", + "ACTIVATE_OBJECTIVES Eliminate Swarmers", + "ACTIVATE_SPAWNERS SwarmerSpawner", + "MSG_BOX CSN Thunderbird;Welch, we're detecting more of the swarmer things heading your way.", + "MSG_BOX Welch;How many more?", + "MSG_BOX CSN Thunderbird;Tracking around three dozen, and the numbers are rising." + ] + }, + { + "function" : "OBJECTIVES_COMPLETE 4", + "lines" : [ + "MSG_BOX Welch;Thunderbird, this is Welch. Swarmers have been taken care of.", + "MSG_BOX CSN Thunderbird;Good to hear, Commander. We're pulling you out there, to assist the other squadrons.", + "MSG_BOX Welch;What about Alysha?", + "MSG_BOX CSN Thunderbird;The target is no longer a priority. Clarke's frontline is collapsing. They need reinforcement, ASAP.", + "MSG_BOX Welch;Understood. Heading there now.", + "WAIT_MSG_BOX", + "COMPLETE_MISSION" + ] + } + ] } From 1b43e4908ceb00640575545aed9acd0591f557d5 Mon Sep 17 00:00:00 2001 From: Steve Date: Wed, 16 Mar 2016 19:24:41 +0000 Subject: [PATCH 37/51] Added ability to hide objective numbers. --- data/missions/clarke/05 - clarke defence #5.json | 10 ++++++---- src/battle/missionInfo.c | 2 +- src/battle/objectives.c | 15 +++++++++------ src/galaxy/mission.c | 3 ++- src/structs.h | 1 + 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/data/missions/clarke/05 - clarke defence #5.json b/data/missions/clarke/05 - clarke defence #5.json index 2433849..15588ed 100644 --- a/data/missions/clarke/05 - clarke defence #5.json +++ b/data/missions/clarke/05 - clarke defence #5.json @@ -31,13 +31,15 @@ "targetName" : "swarmers-1", "targetValue" : 24, "targetType" : "TT_DESTROY", + "hideNumbers" : 1, "active" : 0 }, { "description" : "Eliminate Swarmers", "targetName" : "Swarmer", - "targetValue" : 50, + "targetValue" : 80, "targetType" : "TT_DESTROY", + "hideNumbers" : 1, "active" : 0 } ], @@ -118,9 +120,9 @@ "name" : "SwarmerSpawner", "types" : "Swarmer", "side" : "SIDE_PANDORAN", - "interval" : 1, - "total" : 50, - "step" : 1, + "interval" : 2, + "total" : 80, + "step" : 3, "offscreen" : 1, "active" : 0 } diff --git a/src/battle/missionInfo.c b/src/battle/missionInfo.c index 62970a9..6fa8e90 100644 --- a/src/battle/missionInfo.c +++ b/src/battle/missionInfo.c @@ -142,7 +142,7 @@ static void drawObjectives(void) } drawText(SCREEN_WIDTH / 2 - 100, y, 22, TA_RIGHT, colors.white, o->description); - if (o->targetValue > 1 && !o->isCondition) + if (o->targetValue > 1 && !o->isCondition && !o->hideNumbers) { drawText(SCREEN_WIDTH / 2, y, 22, TA_CENTER, colors.white, "%d / %d", o->currentValue, o->targetValue); } diff --git a/src/battle/objectives.c b/src/battle/objectives.c index 8fd3c39..8a1acff 100644 --- a/src/battle/objectives.c +++ b/src/battle/objectives.c @@ -88,13 +88,16 @@ void updateObjective(char *name, int type) { o->currentValue++; - if (o->targetValue - o->currentValue <= 10) + if (!o->hideNumbers) { - addHudMessage(colors.cyan, "%s - %d / %d", o->description, o->currentValue, o->targetValue); - } - else if (o->currentValue % 10 == 0) - { - addHudMessage(colors.cyan, "%s - %d / %d", o->description, o->currentValue, o->targetValue); + if (o->targetValue - o->currentValue <= 10) + { + addHudMessage(colors.cyan, "%s - %d / %d", o->description, o->currentValue, o->targetValue); + } + else if (o->currentValue % 10 == 0) + { + addHudMessage(colors.cyan, "%s - %d / %d", o->description, o->currentValue, o->targetValue); + } } if (o->currentValue == o->targetValue) diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index 88099cc..fe62e7d 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -336,8 +336,9 @@ static void loadObjectives(cJSON *node) o->targetType = lookup(cJSON_GetObjectItem(node, "targetType")->valuestring); o->active = getJSONValue(node, "active", 1); o->isCondition = getJSONValue(node, "isCondition", 0); - o->isEliminateAll = getJSONValue(node, "isEliminateAll", 0); + o->hideNumbers = getJSONValue(node, "hideNumbers", 0); + if (o->isEliminateAll) { o->targetValue = 1; diff --git a/src/structs.h b/src/structs.h index 9ddee64..c909afd 100644 --- a/src/structs.h +++ b/src/structs.h @@ -235,6 +235,7 @@ struct Objective { int status; int isCondition; int isEliminateAll; + int hideNumbers; Objective *next; }; From 73a3c0c78a3817d49d0eba33fcac216724c3d8ab Mon Sep 17 00:00:00 2001 From: Steve Date: Wed, 16 Mar 2016 21:54:08 +0000 Subject: [PATCH 38/51] Fixed shield splinter effect. --- src/battle/effects.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/battle/effects.c b/src/battle/effects.c index 9fb123b..eb63469 100644 --- a/src/battle/effects.c +++ b/src/battle/effects.c @@ -492,8 +492,9 @@ void addShieldSplinterEffect(Entity *ent) e->dx *= 0.1; e->dy = rand() % 64 - rand() % 64; e->dy *= 0.1; - - e->a = 255; + e->a = 128; + + e->health = e->a; setRandomShieldHue(e); } From 175b7e5ca0a63825238156a930ceaba21909e7c2 Mon Sep 17 00:00:00 2001 From: Steve Date: Thu, 17 Mar 2016 08:11:52 +0000 Subject: [PATCH 39/51] Moved entity loading code out of mission.c, and into appropriate c files. --- src/battle/capitalShips.c | 87 ++++++++ src/battle/capitalShips.h | 2 + src/battle/fighters.c | 105 ++++++++++ src/battle/fighters.h | 1 + src/battle/items.c | 80 ++++++++ src/battle/items.h | 3 + src/battle/locations.c | 31 +++ src/battle/locations.h | 3 + src/battle/objectives.c | 35 ++++ src/battle/objectives.h | 3 + src/battle/player.c | 29 +++ src/battle/player.h | 3 + src/battle/spawners.c | 31 +++ src/battle/spawners.h | 5 + src/galaxy/mission.c | 405 -------------------------------------- src/galaxy/mission.h | 12 +- src/main.c | 2 +- 17 files changed, 426 insertions(+), 411 deletions(-) diff --git a/src/battle/capitalShips.c b/src/battle/capitalShips.c index 7e351e9..aa3b981 100644 --- a/src/battle/capitalShips.c +++ b/src/battle/capitalShips.c @@ -564,6 +564,93 @@ void updateCapitalShipComponentProperties(Entity *parent) } } +void loadCapitalShips(cJSON *node) +{ + Entity *e; + char **types, *name, *groupName, *type; + int side, scatter, number, active; + int i, numTypes, addFlags; + long flags; + float x, y; + + if (node) + { + node = node->child; + + while (node) + { + name = NULL; + groupName = NULL; + 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 = getJSONValueStr(node, "name", NULL); + groupName = getJSONValueStr(node, "groupName", NULL); + 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); + } + + for (i = 0 ; i < number ; i++) + { + type = types[rand() % numTypes]; + + e = spawnCapitalShip(type, x, y, side); + + if (scatter > 1) + { + e->x += (rand() % scatter) - (rand() % scatter); + e->y += (rand() % scatter) - (rand() % scatter); + } + + e->active = active; + + if (name) + { + STRNCPY(e->name, name, MAX_NAME_LENGTH); + } + + if (groupName) + { + STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); + } + + if (flags != -1) + { + if (addFlags) + { + e->flags |= flags; + } + else + { + e->flags = flags; + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); + } + } + + updateCapitalShipComponentProperties(e); + } + + node = node->next; + + for (i = 0 ; i < numTypes ; i++) + { + free(types[i]); + } + + free(types); + } + } +} + void destroyCapitalShipDefs(void) { Entity *e; diff --git a/src/battle/capitalShips.h b/src/battle/capitalShips.h index 61102e1..a40c954 100644 --- a/src/battle/capitalShips.h +++ b/src/battle/capitalShips.h @@ -47,8 +47,10 @@ extern void runScriptFunction(char *format, ...); extern void updateObjective(char *name, int type); extern char **getFileList(char *dir, int *count); extern int getJSONValue(cJSON *node, char *name, int defValue); +extern char *getJSONValueStr(cJSON *node, char *name, char *defValue); extern char *getTranslatedString(char *string); extern void addLargeExplosion(void); +extern char **toTypeArray(char *types, int *numTypes); extern Battle battle; extern Entity *self; diff --git a/src/battle/fighters.c b/src/battle/fighters.c index 12eca9f..b02f3ee 100644 --- a/src/battle/fighters.c +++ b/src/battle/fighters.c @@ -751,6 +751,111 @@ static void loadFighterDef(char *filename) free(text); } +void loadFighters(cJSON *node) +{ + Entity *e; + char **types, *name, *groupName, *type; + int side, scatter, number, active; + int i, numTypes, addFlags, addAIFlags; + long flags, aiFlags; + float x, y; + + if (node) + { + node = node->child; + + while (node) + { + name = NULL; + groupName = NULL; + flags = -1; + aiFlags = -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 = getJSONValueStr(node, "name", NULL); + groupName = getJSONValueStr(node, "groupName", NULL); + 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); + } + + if (cJSON_GetObjectItem(node, "aiFlags")) + { + aiFlags = flagsToLong(cJSON_GetObjectItem(node, "aiFlags")->valuestring, &addAIFlags); + } + + for (i = 0 ; i < number ; i++) + { + type = types[rand() % numTypes]; + + e = spawnFighter(type, x, y, side); + + if (scatter > 1) + { + e->x += (rand() % scatter) - (rand() % scatter); + e->y += (rand() % scatter) - (rand() % scatter); + } + + e->active = active; + + if (flags != -1) + { + if (addFlags) + { + e->flags |= flags; + } + else + { + e->flags = flags; + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); + } + } + + if (aiFlags != -1) + { + if (addAIFlags) + { + e->aiFlags |= aiFlags; + } + else + { + e->aiFlags = aiFlags; + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "AI Flags for '%s' (%s) replaced", e->name, e->defName); + } + } + + if (name) + { + STRNCPY(e->name, name, MAX_NAME_LENGTH); + } + + if (groupName) + { + STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); + } + } + + node = node->next; + + for (i = 0 ; i < numTypes ; i++) + { + free(types[i]); + } + + free(types); + } + } +} + void destroyFighterDefs(void) { Entity *e; diff --git a/src/battle/fighters.h b/src/battle/fighters.h index c6394d5..144973a 100644 --- a/src/battle/fighters.h +++ b/src/battle/fighters.h @@ -48,6 +48,7 @@ extern char **getFileList(char *dir, int *count); extern char *getTranslatedString(char *string); extern int getJSONValue(cJSON *node, char *name, int defValue); extern char **toTypeArray(char *types, int *numTypes); +extern char *getJSONValueStr(cJSON *node, char *name, char *defValue); extern App app; extern Battle battle; diff --git a/src/battle/items.c b/src/battle/items.c index 1d9931e..fdec377 100644 --- a/src/battle/items.c +++ b/src/battle/items.c @@ -127,6 +127,86 @@ static void action(void) } } +void loadItems(cJSON *node) +{ + Entity *e; + char *name, *groupName, *type; + int i, scatter, number, active, addFlags; + long flags; + float x, y; + + flags = -1; + scatter = 1; + + if (node) + { + node = node->child; + + while (node) + { + type = cJSON_GetObjectItem(node, "type")->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 = NULL; + groupName = NULL; + + name = getJSONValueStr(node, "name", NULL); + groupName = getJSONValueStr(node, "groupName", NULL); + 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); + } + + for (i = 0 ; i < number ; i++) + { + e = spawnItem(type); + + if (name) + { + STRNCPY(e->name, name, MAX_NAME_LENGTH); + } + + if (groupName) + { + STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); + } + + if (flags != -1) + { + if (addFlags) + { + e->flags |= flags; + } + else + { + e->flags = flags; + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); + } + } + + e->x = x; + e->y = y; + e->active = active; + + if (scatter > 1) + { + e->x += (rand() % scatter) - (rand() % scatter); + e->y += (rand() % scatter) - (rand() % scatter); + } + + SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); + } + + node = node->next; + } + } +} + void destroyItemDefs(void) { Entity *e; diff --git a/src/battle/items.h b/src/battle/items.h index bc1c79e..5d54998 100644 --- a/src/battle/items.h +++ b/src/battle/items.h @@ -31,6 +31,9 @@ extern void playBattleSound(int id, int x, int y); extern void addHudMessage(SDL_Color c, char *format, ...); extern void updateObjective(char *name, int type); extern char *getTranslatedString(char *string); +extern int getJSONValue(cJSON *node, char *name, int defValue); +extern char *getJSONValueStr(cJSON *node, char *name, char *defValue); +extern long flagsToLong(char *flags, int *add); extern Battle battle; extern Entity *self; diff --git a/src/battle/locations.c b/src/battle/locations.c index 5636371..c01d0c9 100644 --- a/src/battle/locations.c +++ b/src/battle/locations.c @@ -74,3 +74,34 @@ void activateLocations(char *locations) token = strtok(NULL, ";"); } } + +void loadLocations(cJSON *node) +{ + int active; + Location *l; + + if (node) + { + node = node->child; + + while (node) + { + l = malloc(sizeof(Location)); + memset(l, 0, sizeof(Location)); + battle.locationTail->next = l; + battle.locationTail = l; + + STRNCPY(l->name, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); + l->x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; + l->y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; + l->size = cJSON_GetObjectItem(node, "size")->valueint; + l->active = active = getJSONValue(node, "active", 1); + + l->x += (SCREEN_WIDTH / 2); + l->y += (SCREEN_HEIGHT / 2); + + + node = node->next; + } + } +} diff --git a/src/battle/locations.h b/src/battle/locations.h index f20b58b..38b6a00 100644 --- a/src/battle/locations.h +++ b/src/battle/locations.h @@ -20,9 +20,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "../common.h" +#include "../json/cJSON.h" + extern Battle battle; extern Entity *player; extern int getDistance(int x1, int y1, int x2, int y2); extern void runScriptFunction(char *format, ...); extern void drawCircle(int cx, int cy, int radius, int r, int g, int b, int a); +extern int getJSONValue(cJSON *node, char *name, int defValue); diff --git a/src/battle/objectives.c b/src/battle/objectives.c index 8a1acff..122b7e0 100644 --- a/src/battle/objectives.c +++ b/src/battle/objectives.c @@ -223,3 +223,38 @@ void activateObjectives(char *objectives) token = strtok(NULL, ";"); } } + +void loadObjectives(cJSON *node) +{ + Objective *o; + + if (node) + { + node = node->child; + + while (node) + { + o = malloc(sizeof(Objective)); + memset(o, 0, sizeof(Objective)); + battle.objectiveTail->next = o; + battle.objectiveTail = o; + + STRNCPY(o->id, cJSON_GetObjectItem(node, "description")->valuestring, MAX_DESCRIPTION_LENGTH); + 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", 1); + o->isCondition = getJSONValue(node, "isCondition", 0); + o->isEliminateAll = getJSONValue(node, "isEliminateAll", 0); + o->hideNumbers = getJSONValue(node, "hideNumbers", 0); + + if (o->isEliminateAll) + { + o->targetValue = 1; + } + + node = node->next; + } + } +} diff --git a/src/battle/objectives.h b/src/battle/objectives.h index c7c5579..5d75820 100644 --- a/src/battle/objectives.h +++ b/src/battle/objectives.h @@ -19,12 +19,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "../common.h" +#include "../json/cJSON.h" extern void addHudMessage(SDL_Color c, char *format, ...); extern void runScriptFunction(char *format, ...); extern void completeMission(void); extern void failMission(void); extern char *getTranslatedString(char *string); +extern int getJSONValue(cJSON *node, char *name, int defValue); +extern long lookup(char *name); extern Battle battle; extern Colors colors; diff --git a/src/battle/player.c b/src/battle/player.c index ff8262b..7bf2ca0 100644 --- a/src/battle/player.c +++ b/src/battle/player.c @@ -591,3 +591,32 @@ int playerHasGun(int type) { return availableGuns[type]; } + +void loadPlayer(cJSON *node) +{ + char *type; + int side; + + type = cJSON_GetObjectItem(node, "type")->valuestring; + side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); + + player = spawnFighter(type, 0, 0, side); + player->x = BATTLE_AREA_WIDTH / 2; + player->y = BATTLE_AREA_HEIGHT / 2; + + if (cJSON_GetObjectItem(node, "x")) + { + player->x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; + player->y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; + } + + if (strcmp(type, "Tug") == 0) + { + battle.stats[STAT_TUG]++; + } + + if (strcmp(type, "Shuttle") == 0) + { + battle.stats[STAT_SHUTTLE]++; + } +} diff --git a/src/battle/player.h b/src/battle/player.h index 15d6dc4..aedfc9f 100644 --- a/src/battle/player.h +++ b/src/battle/player.h @@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "../common.h" +#include "../json/cJSON.h" #define MAX_SELECTABLE_PLAYERS 8 #define MAX_SELECTABLE_TARGETS 8 @@ -39,6 +40,8 @@ extern char *getTranslatedString(char *string); extern void addECMEffect(Entity *ent); extern int isControl(int type); extern void clearControl(int type); +extern long lookup(char *name); +extern Entity *spawnFighter(char *name, int x, int y, int side); extern App app; extern Battle battle; diff --git a/src/battle/spawners.c b/src/battle/spawners.c index 82a0ecd..b25c053 100644 --- a/src/battle/spawners.c +++ b/src/battle/spawners.c @@ -90,3 +90,34 @@ void activateSpawner(char *names, int active) name = strtok(NULL, ";"); } } + +void loadSpawners(cJSON *node) +{ + int active; + Spawner *s; + + if (node) + { + node = node->child; + + while (node) + { + s = malloc(sizeof(Spawner)); + memset(s, 0, sizeof(Spawner)); + battle.spawnerTail->next = s; + battle.spawnerTail = s; + + STRNCPY(s->name, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); + s->types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &s->numTypes); + s->side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); + s->interval = cJSON_GetObjectItem(node, "interval")->valueint * FPS; + s->limit = getJSONValue(node, "limit", 0); + s->total = getJSONValue(node, "total", 0); + s->step = cJSON_GetObjectItem(node, "step")->valueint; + s->offscreen = getJSONValue(node, "offscreen", 0); + s->active = active = getJSONValue(node, "active", 1); + + node = node->next; + } + } +} diff --git a/src/battle/spawners.h b/src/battle/spawners.h index f6f44b9..cead7c8 100644 --- a/src/battle/spawners.h +++ b/src/battle/spawners.h @@ -20,7 +20,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "../common.h" +#include "../json/cJSON.h" + +extern long lookup(char *name); extern Entity *spawnFighter(char *name, int x, int y, int side); +extern int getJSONValue(cJSON *node, char *name, int defValue); +extern char **toTypeArray(char *types, int *numTypes); extern Battle battle; extern Entity *player; diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index fe62e7d..ea140c8 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -20,14 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "mission.h" -static void loadObjectives(cJSON *node); -static void loadPlayer(cJSON *node); -static void loadFighters(cJSON *node); -static void loadCapitalShips(cJSON *node); static void loadEntities(cJSON *node); -static void loadItems(cJSON *node); -static void loadLocations(cJSON *node); -static void loadSpawners(cJSON *node); static unsigned long hashcode(const char *str); static void loadEpicData(cJSON *node); static char *getAutoBackground(char *filename); @@ -314,262 +307,6 @@ void failMission(void) } } -static void loadObjectives(cJSON *node) -{ - Objective *o; - - if (node) - { - node = node->child; - - while (node) - { - o = malloc(sizeof(Objective)); - memset(o, 0, sizeof(Objective)); - battle.objectiveTail->next = o; - battle.objectiveTail = o; - - STRNCPY(o->id, cJSON_GetObjectItem(node, "description")->valuestring, MAX_DESCRIPTION_LENGTH); - 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", 1); - o->isCondition = getJSONValue(node, "isCondition", 0); - o->isEliminateAll = getJSONValue(node, "isEliminateAll", 0); - o->hideNumbers = getJSONValue(node, "hideNumbers", 0); - - if (o->isEliminateAll) - { - o->targetValue = 1; - } - - node = node->next; - } - } -} - -static void loadPlayer(cJSON *node) -{ - char *type; - int side; - - type = cJSON_GetObjectItem(node, "type")->valuestring; - side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); - - player = spawnFighter(type, 0, 0, side); - player->x = BATTLE_AREA_WIDTH / 2; - player->y = BATTLE_AREA_HEIGHT / 2; - - if (cJSON_GetObjectItem(node, "x")) - { - player->x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; - player->y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; - } - - if (strcmp(type, "Tug") == 0) - { - battle.stats[STAT_TUG]++; - } - - if (strcmp(type, "Shuttle") == 0) - { - battle.stats[STAT_SHUTTLE]++; - } -} - -static void loadFighters(cJSON *node) -{ - Entity *e; - char **types, *name, *groupName, *type; - int side, scatter, number, active; - int i, numTypes, addFlags, addAIFlags; - long flags, aiFlags; - float x, y; - - if (node) - { - node = node->child; - - while (node) - { - name = NULL; - groupName = NULL; - flags = -1; - aiFlags = -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 = getJSONValueStr(node, "name", NULL); - groupName = getJSONValueStr(node, "groupName", NULL); - 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); - } - - if (cJSON_GetObjectItem(node, "aiFlags")) - { - aiFlags = flagsToLong(cJSON_GetObjectItem(node, "aiFlags")->valuestring, &addAIFlags); - } - - for (i = 0 ; i < number ; i++) - { - type = types[rand() % numTypes]; - - e = spawnFighter(type, x, y, side); - - if (scatter > 1) - { - e->x += (rand() % scatter) - (rand() % scatter); - e->y += (rand() % scatter) - (rand() % scatter); - } - - e->active = active; - - if (flags != -1) - { - if (addFlags) - { - e->flags |= flags; - } - else - { - e->flags = flags; - - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); - } - } - - if (aiFlags != -1) - { - if (addAIFlags) - { - e->aiFlags |= aiFlags; - } - else - { - e->aiFlags = aiFlags; - - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "AI Flags for '%s' (%s) replaced", e->name, e->defName); - } - } - - if (name) - { - STRNCPY(e->name, name, MAX_NAME_LENGTH); - } - - if (groupName) - { - STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); - } - } - - node = node->next; - - for (i = 0 ; i < numTypes ; i++) - { - free(types[i]); - } - - free(types); - } - } -} - -static void loadCapitalShips(cJSON *node) -{ - Entity *e; - char **types, *name, *groupName, *type; - int side, scatter, number, active; - int i, numTypes, addFlags; - long flags; - float x, y; - - if (node) - { - node = node->child; - - while (node) - { - name = NULL; - groupName = NULL; - 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 = getJSONValueStr(node, "name", NULL); - groupName = getJSONValueStr(node, "groupName", NULL); - 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); - } - - for (i = 0 ; i < number ; i++) - { - type = types[rand() % numTypes]; - - e = spawnCapitalShip(type, x, y, side); - - if (scatter > 1) - { - e->x += (rand() % scatter) - (rand() % scatter); - e->y += (rand() % scatter) - (rand() % scatter); - } - - e->active = active; - - if (name) - { - STRNCPY(e->name, name, MAX_NAME_LENGTH); - } - - if (groupName) - { - STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); - } - - if (flags != -1) - { - if (addFlags) - { - e->flags |= flags; - } - else - { - e->flags = flags; - - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); - } - } - - updateCapitalShipComponentProperties(e); - } - - node = node->next; - - for (i = 0 ; i < numTypes ; i++) - { - free(types[i]); - } - - free(types); - } - } -} - static void loadEntities(cJSON *node) { Entity *e; @@ -664,148 +401,6 @@ static void loadEntities(cJSON *node) } } -static void loadItems(cJSON *node) -{ - Entity *e; - char *name, *groupName, *type; - int i, scatter, number, active, addFlags; - long flags; - float x, y; - - flags = -1; - scatter = 1; - - if (node) - { - node = node->child; - - while (node) - { - type = cJSON_GetObjectItem(node, "type")->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 = NULL; - groupName = NULL; - - name = getJSONValueStr(node, "name", NULL); - groupName = getJSONValueStr(node, "groupName", NULL); - 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); - } - - for (i = 0 ; i < number ; i++) - { - e = spawnItem(type); - - if (name) - { - STRNCPY(e->name, name, MAX_NAME_LENGTH); - } - - if (groupName) - { - STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); - } - - if (flags != -1) - { - if (addFlags) - { - e->flags |= flags; - } - else - { - e->flags = flags; - - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); - } - } - - e->x = x; - e->y = y; - e->active = active; - - if (scatter > 1) - { - e->x += (rand() % scatter) - (rand() % scatter); - e->y += (rand() % scatter) - (rand() % scatter); - } - - SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); - } - - node = node->next; - } - } -} - -static void loadLocations(cJSON *node) -{ - int active; - Location *l; - - if (node) - { - node = node->child; - - while (node) - { - l = malloc(sizeof(Location)); - memset(l, 0, sizeof(Location)); - battle.locationTail->next = l; - battle.locationTail = l; - - STRNCPY(l->name, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); - l->x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; - l->y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; - l->size = cJSON_GetObjectItem(node, "size")->valueint; - l->active = active = getJSONValue(node, "active", 1); - - l->x += (SCREEN_WIDTH / 2); - l->y += (SCREEN_HEIGHT / 2); - - - node = node->next; - } - } -} - -static void loadSpawners(cJSON *node) -{ - int active; - Spawner *s; - - if (node) - { - node = node->child; - - while (node) - { - s = malloc(sizeof(Spawner)); - memset(s, 0, sizeof(Spawner)); - battle.spawnerTail->next = s; - battle.spawnerTail = s; - - STRNCPY(s->name, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); - s->types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &s->numTypes); - s->side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); - s->interval = cJSON_GetObjectItem(node, "interval")->valueint * FPS; - s->limit = getJSONValue(node, "limit", 0); - s->total = getJSONValue(node, "total", 0); - s->step = cJSON_GetObjectItem(node, "step")->valueint; - s->offscreen = getJSONValue(node, "offscreen", 0); - s->active = active = getJSONValue(node, "active", 1); - - node = node->next; - } - } -} - static void loadEpicData(cJSON *node) { Entity *e; diff --git a/src/galaxy/mission.h b/src/galaxy/mission.h index c6a8647..aa4b002 100644 --- a/src/galaxy/mission.h +++ b/src/galaxy/mission.h @@ -26,8 +26,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern long lookup(char *name); extern char *readFile(char *filename); extern SDL_Texture *getTexture(char *filename); -extern Entity *spawnFighter(char *name, int x, int y, int side); -extern Entity *spawnCapitalShip(char *name, int x, int y, int side); extern void startSectionTransition(void); extern void endSectionTransition(void); extern void playMusic(char *filename); @@ -37,12 +35,10 @@ extern long flagsToLong(char *flags, int *add); extern Entity *spawnWaypoint(void); extern void selectWidget(const char *name, const char *group); extern Entity *spawnJumpgate(void); -extern Entity *spawnItem(char *type); extern void failIncompleteObjectives(void); extern void completeConditions(void); extern void retreatEnemies(void); extern void initScript(cJSON *missionJSON); -extern void updateCapitalShipComponentProperties(Entity *parent); extern void countNumEnemies(void); extern void initMissionInfo(void); extern char *getTranslatedString(char *string); @@ -54,7 +50,13 @@ extern char *getMusicFilename(int n); extern int getJSONValue(cJSON *node, char *name, int defValue); extern char *getJSONValueStr(cJSON *node, char *name, char *defValue); extern void addAllEntsToQuadtree(void); -extern char **toTypeArray(char *types, int *numTypes); +extern void loadObjectives(cJSON *node); +extern void loadPlayer(cJSON *node); +extern void loadCapitalShips(cJSON *node); +extern void loadFighters(cJSON *node); +extern void loadItems(cJSON *node); +extern void loadLocations(cJSON *node); +extern void loadSpawners(cJSON *node); extern Battle battle; extern Entity *player; diff --git a/src/main.c b/src/main.c index 6617833..19bbf79 100644 --- a/src/main.c +++ b/src/main.c @@ -29,7 +29,7 @@ int main(int argc, char *argv[]) long expireTextTimer; SDL_Event event; - SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN); + SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); memset(&app, 0, sizeof(App)); memset(&dev, 0, sizeof(Dev)); From f82f5c6d0451dd6de3dc8f1f75a98676019cd0d4 Mon Sep 17 00:00:00 2001 From: Steve Date: Thu, 17 Mar 2016 08:11:58 +0000 Subject: [PATCH 40/51] i18n updates. --- locale/tbftss.pot | 50 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/locale/tbftss.pot b/locale/tbftss.pot index 3467b9a..e54e8b0 100644 --- a/locale/tbftss.pot +++ b/locale/tbftss.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: TBFTSS: The Pandoran War\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-03-13 10:54:24+0000\n" +"POT-Creation-Date: 2016-03-17 08:09:49+0000\n" "PO-Revision-Date: ???\n" "Last-Translator: ???\n" "Language-Team: ???\n" @@ -670,6 +670,54 @@ msgstr "" msgid "Okay, let's get back to Leviathan, and wait for Kelly and Estelle to rejoin us." msgstr "" +msgid "First squadron sighted. Moving to intercept." +msgstr "" + +msgid "First squadron taken down, preparing to engage second." +msgstr "" + +msgid "Second squadron down. Moving up the field to engage Alysha's Calling." +msgstr "" + +msgid "Welch, we are tracking a large number of fast-moving heading your way. IDs don't match anything we currently have on record." +msgstr "" + +msgid "Missiles?" +msgstr "" + +msgid "Too large. We'll relay more information as we get it. Be prepared to engage." +msgstr "" + +msgid "Whatever these things are, they're not hard to dispatch." +msgstr "" + +msgid "No, but there's a lot of them ..." +msgstr "" + +msgid "Welch, we're detecting more of the swarmer things heading your way." +msgstr "" + +msgid "How many more?" +msgstr "" + +msgid "Tracking around three dozen, and the numbers are rising." +msgstr "" + +msgid "Thunderbird, this is Welch. Swarmers have been taken care of." +msgstr "" + +msgid "Good to hear, Commander. We're pulling you out there, to assist the other squadrons." +msgstr "" + +msgid "What about Alysha?" +msgstr "" + +msgid "The target is no longer a priority. Clarke's frontline is collapsing. They need reinforcement, ASAP." +msgstr "" + +msgid "Understood. Heading there now." +msgstr "" + msgid "Though we suffered heavy losses at Coyote, it is still important that we attempt to prevent, or at least slow, the Pandoran war machine's advance. Admiral Jenkins has ordered that the White Knights lead an attack on the enemy forces gathered in the system. The weight of the opposing forces remains tremendous, though the ATAFs should help to give us the edge in battle. Be advised that the enemy are now in possession of UNF fighter craft." msgstr "" From ca043f171c53e40bbfc5e050ab174c5a4b703bc1 Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 26 Mar 2016 18:15:52 +0000 Subject: [PATCH 41/51] Only initially add active entities to quadtree. --- src/battle/entities.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/battle/entities.c b/src/battle/entities.c index 914bdb5..f3a7155 100644 --- a/src/battle/entities.c +++ b/src/battle/entities.c @@ -557,7 +557,10 @@ void addAllEntsToQuadtree(void) for (e = battle.entityHead.next ; e != NULL ; e = e->next) { - addToQuadtree(e, &battle.quadtree); + if (e->active) + { + addToQuadtree(e, &battle.quadtree); + } } } From 8c639a9cb5b6b740dfca5bc030d900a4be36e6bb Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 26 Mar 2016 18:16:05 +0000 Subject: [PATCH 42/51] Clarke now falls to the Pandorans. --- data/galaxy/starSystems.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/galaxy/starSystems.json b/data/galaxy/starSystems.json index 61459c5..2939a2e 100644 --- a/data/galaxy/starSystems.json +++ b/data/galaxy/starSystems.json @@ -151,7 +151,8 @@ "name": "Clarke", "side" : "SIDE_UNF", "x": 398, - "y": 84 + "y": 84, + "fallsToPandorans" : 1 }, { "name": "Adetton", From 743a2d73d45df546d1dfca5cc7ff99e3513d3e6b Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 26 Mar 2016 18:16:17 +0000 Subject: [PATCH 43/51] Start of final Clarke mission. --- .../clarke/06 - clarke defence #6.json | 174 ++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 data/missions/clarke/06 - clarke defence #6.json diff --git a/data/missions/clarke/06 - clarke defence #6.json b/data/missions/clarke/06 - clarke defence #6.json new file mode 100644 index 0000000..9426c5f --- /dev/null +++ b/data/missions/clarke/06 - clarke defence #6.json @@ -0,0 +1,174 @@ +{ + "name" : "Clarke Defence #6", + "description" : "", + "requires" : 30, + "background" : "gfx/backgrounds/background06.jpg", + "planet" : "gfx/planets/bluePlanet.png", + "music" : "music/battle/DST-RailJet-LongSeamlessLoop.ogg", + "unwinnable" : 1, + "objectives" : [ + { + "description" : "Destroy all enemy targets", + "targetName" : "Pandoran", + "targetValue" : 200, + "targetType" : "TT_DESTROY" + } + ], + "epic" : { + "fighterLimit" : 24 + }, + "player" : { + "type" : "Rook", + "side" : "SIDE_ALLIES", + "pilot" : "(Multiple)", + "squadron" : "(Multiple)" + }, + "fighters" : [ + { + "name" : "ALLIES", + "types" : "TAF;Ray;Kingfisher;Hammerhead;Firefly;Nymph;Lynx;Hyena-A;Hyena-B", + "side" : "SIDE_ALLIES", + "x" : 25, + "y" : 25, + "number" : 200, + "scatter" : 10000 + }, + { + "name" : "Pandoran", + "types" : "Jackal;Mantis;Sphinx;Scarab;Thunderhead", + "side" : "SIDE_PANDORAN", + "x" : 25, + "y" : 18, + "number" : 150, + "scatter" : 10000, + "flags" : "+EF_AI_TARGET" + }, + { + "groupName" : "twilightLancers", + "types" : "TAF;Ray;Kingfisher;Hammerhead", + "side" : "SIDE_ALLIES", + "x" : -1, + "y" : -1, + "number" : 7, + "scatter" : 600, + "active" : 0 + } + ], + "capitalShips" : [ + { + "name" : "UNF Cleopatra", + "types" : "UNF Corvette 01", + "side" : "SIDE_ALLIES", + "x" : 22, + "y" : 22, + "flags" : "+EF_AI_LEADER+EF_AI_TARGET" + }, + { + "name" : "UNF Artemis", + "types" : "UNF Corvette 02", + "side" : "SIDE_ALLIES", + "x" : 28, + "y" : 28, + "flags" : "+EF_AI_LEADER+EF_AI_TARGET" + } + ], + "spawners" : [ + { + "name" : "SwarmerSpawner", + "types" : "Swarmer", + "side" : "SIDE_PANDORAN", + "interval" : 1, + "total" : -1, + "step" : 1, + "active" : 0 + } + ], + "script" : [ + { + "function" : "TIME 2", + "lines" : [ + "MSG_BOX Wing Commander;The Twilight Lancers are on their way.", + "MSG_BOX Wingmate #62;Eight whole extra fighters? They outnumber and outgun us!", + "MSG_BOX Wing Commander;At this point, any additional support is welcome. And we still have the support of Cleopatra and Artemis." + ] + }, + { + "function" : "ALLIES_KILLED 25", + "lines" : [ + "ACTIVATE_ENTITY_GROUPS twilightLancers", + "MSG_BOX Welch;Welch here, engaging targets.", + "MSG_BOX Wing Commander;Not a moment too soon, Commander." + ] + }, + { + "function" : "ENEMIES_KILLED 50", + "lines" : [ + "MSG_BOX Wing Commander;We're wearing them down. Keep up the pressure.", + "MSG_BOX Wingmate #31;Think they're pull back if we hit them hard enough?", + "MSG_BOX Wing Commander;Just concentrate on take down their fighters." + ] + }, + { + "function" : "ENEMIES_KILLED 75", + "lines" : [ + "MSG_BOX Wingmate #88;I've just been tailed by something I've never seen before! Small, highly maneuverable, rapid fire particle cannon.", + "MSG_BOX Welch;Swarmers! The enemy have deployed them here, too!", + "MSG_BOX Wing Commander;How many?", + "MSG_BOX Wingmate #82;Tracking a dozen, but the numbers are growing rapidly", + "WAIT_MSG_BOX", + "ACTIVATE_SPAWNERS SwarmerSpawner" + ] + }, + { + "function" : "ALLIES_KILLED 150", + "lines" : [ + "MSG_BOX Wingmate #88;I've lost count how many of these damn swarmers I've taken down.", + "MSG_BOX Wingmate #120;It's like fighting a hydra! You cut off one head, and two more spring up!" + ] + }, + { + "function" : "ALLIES_KILLED 195", + "lines" : [ + "MSG_BOX Wingmate #181;There's too many of them!", + "MSG_BOX Wingmate #31;Keep fighting, we can still win this!", + "MSG_BOX Wingmate #111;They're everywhere! I--" + ] + }, + { + "function" : "CAP_ENGINES_DESTROYED UNF Cleopatra", + "lines" : [ + "MSG_BOX UNF Cleopatra;This is UNF Cleopatra. We are engine crippled. Please provide cover support!" + ] + }, + { + "function" : "CAP_HEALTH UNF Cleopatra 3", + "lines" : [ + "MSG_BOX UNF Cleopatra;Mayday! Mayday! We are taking heavy damage! Please assist ASAP!" + ] + }, + { + "function" : "CAP_ENGINES_DESTROYED UNF Artemis", + "lines" : [ + "MSG_BOX Wing Commander;Artemis has lost her engines. We need to keep those Pandorans off her!" + ] + }, + { + "function" : "CAP_HEALTH UNF Artemis 3", + "lines" : [ + "MSG_BOX UNF Artemis;All fighters, we're taking a pounding here, we don't know how much longer we can survive this." + ] + }, + { + "function" : "CAPITAL_SHIPS_LOST 1", + "lines" : [ + "MSG_BOX Wing Commander;People, we are down one capital ship! We need to step things up!" + ] + }, + { + "function" : "CAPITAL_SHIPS_LOST 2", + "lines" : [ + "MSG_BOX Wing Commander;Both caps are down, all hands lost. Let's not let this go to waste." + ] + } + ] +} From 6ca888d7754331139d1ace741ee6855c4d171955 Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 26 Mar 2016 18:16:28 +0000 Subject: [PATCH 44/51] Misc. mission clean up. --- .../clarke/05 - clarke defence #5.json | 2 +- .../missions/iliad/05 - iliad defence #5.json | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/data/missions/clarke/05 - clarke defence #5.json b/data/missions/clarke/05 - clarke defence #5.json index 15588ed..d4aa139 100644 --- a/data/missions/clarke/05 - clarke defence #5.json +++ b/data/missions/clarke/05 - clarke defence #5.json @@ -164,7 +164,7 @@ "MSG_BOX Welch;No, but there's a lot of them ...", "WAIT_MSG_BOX", "ACTIVATE_OBJECTIVES Eliminate Swarmers", - "ACTIVATE_SPAWNERS SwarmerSpawner", + "ACTIVATE_SPAWNERS SwarmerSpawner", "MSG_BOX CSN Thunderbird;Welch, we're detecting more of the swarmer things heading your way.", "MSG_BOX Welch;How many more?", "MSG_BOX CSN Thunderbird;Tracking around three dozen, and the numbers are rising." diff --git a/data/missions/iliad/05 - iliad defence #5.json b/data/missions/iliad/05 - iliad defence #5.json index d3f9789..990f1eb 100644 --- a/data/missions/iliad/05 - iliad defence #5.json +++ b/data/missions/iliad/05 - iliad defence #5.json @@ -82,34 +82,34 @@ { "function" : "TIME 2", "lines" : [ - "MSG_BOX UNF Wing Commander;Stay sharp, people. We need to hold the line here!", - "MSG_BOX UNF Wingmate #31;Oh my God, there's a lot of them ...", - "MSG_BOX UNF Wingmate #82;Pair up, and take them down together. We stand a much better chance that way." + "MSG_BOX Wing Commander;Stay sharp, people. We need to hold the line here!", + "MSG_BOX Wingmate #31;Oh my God, there's a lot of them ...", + "MSG_BOX Wingmate #82;Pair up, and take them down together. We stand a much better chance that way." ] }, { "function" : "ALLIES_KILLED 30", "lines" : [ "ACTIVATE_ENTITIES INF Qama;INF Seax;INF Mora;INF Sharpfinger", - "MSG_BOX UNF Wing Commander;Heads up, people. Four INF corvettes just entered the area.", - "MSG_BOX UNF Wingmate #41;What's happened to all our own capital ships?!", - "MSG_BOX UNF Wing Commander;They've been scratched." + "MSG_BOX Wing Commander;Heads up, people. Four INF corvettes just entered the area.", + "MSG_BOX Wingmate #41;What's happened to all our own capital ships?!", + "MSG_BOX Wing Commander;They've been scratched." ] }, { "function" : "ALLIES_KILLED 60", "lines" : [ - "MSG_BOX UNF Wingmate #63;That Dust Brothers have been flagged." + "MSG_BOX Wingmate #63;That Dust Brothers have been flagged." ] }, { "function" : "ALLIES_KILLED 90", "lines" : [ - "MSG_BOX UNF Wingmate #94;We have to sound the retreat!", - "MSG_BOX UNF Wing Commander;Mister, you remain where you are! We're not abando--", + "MSG_BOX Wingmate #94;We have to sound the retreat!", + "MSG_BOX Wing Commander;Mister, you remain where you are! We're not abando--", "WAIT_MSG_BOX", "WAIT 3", - "MSG_BOX UNF Wingmate #98;The wing commander's dead." + "MSG_BOX Wingmate #98;The wing commander's dead." ] } ] From d33bcf94148f6738d41540009d364daae23a503d Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 27 Mar 2016 08:55:25 +0100 Subject: [PATCH 45/51] In epic battles, spawned in entities (such as swarmers) don't count towards the epicLimit. --- src/battle/entities.c | 8 ++++++++ src/battle/spawners.c | 7 ++++++- src/structs.h | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/battle/entities.c b/src/battle/entities.c index f3a7155..3a163c2 100644 --- a/src/battle/entities.c +++ b/src/battle/entities.c @@ -63,6 +63,7 @@ void doEntities(void) { int numAllies, numEnemies; int numActiveAllies, numActiveEnemies; + int numSpawnedEnemies; Entity *e, *prev; prev = &battle.entityHead; @@ -217,6 +218,11 @@ void doEntities(void) if (e->health > 0 && e->active) { numActiveEnemies++; + + if (e->spawned) + { + numSpawnedEnemies++; + } } } } @@ -229,6 +235,8 @@ void doEntities(void) if (battle.isEpic && battle.stats[STAT_TIME] % FPS == 0) { + numActiveEnemies -= numSpawnedEnemies; + if (numAllies > battle.epicFighterLimit) { activateEpicFighters(battle.epicFighterLimit - numActiveAllies, SIDE_ALLIES); diff --git a/src/battle/spawners.c b/src/battle/spawners.c index b25c053..fda46dd 100644 --- a/src/battle/spawners.c +++ b/src/battle/spawners.c @@ -40,7 +40,10 @@ void doSpawners(void) s->total -= num; } - battle.numInitialEnemies += num; + if (s->side != SIDE_ALLIES) + { + battle.numInitialEnemies += num; + } for (i = 0 ; i < num ; i++) { @@ -48,6 +51,8 @@ void doSpawners(void) e = spawnFighter(type, 0, 0, s->side); + e->spawned = 1; + if (s->offscreen) { e->x = player->x; diff --git a/src/structs.h b/src/structs.h index c909afd..65a9e74 100644 --- a/src/structs.h +++ b/src/structs.h @@ -100,6 +100,7 @@ struct Entity { char defName[MAX_NAME_LENGTH]; char groupName[MAX_NAME_LENGTH]; int active; + int spawned; int id; int side; float x; From 06f7867013be12f2a6680cff4f2302bcf88e5bea Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 27 Mar 2016 08:55:58 +0100 Subject: [PATCH 46/51] Use CONTROL_NEXT_FIGHTER / CONTROL_PREV_FIGHTER to select fighters during epic missions. --- src/battle/player.c | 12 ++++++------ src/battle/player.h | 2 ++ src/system/controls.c | 12 ++++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/battle/player.c b/src/battle/player.c index 7bf2ca0..a47e192 100644 --- a/src/battle/player.c +++ b/src/battle/player.c @@ -362,27 +362,27 @@ void initPlayerSelect(void) void doPlayerSelect(void) { - if (app.keyboard[SDL_SCANCODE_A] || app.mouse.button[SDL_BUTTON_X1]) + if (isControl(CONTROL_PREV_FIGHTER)) { selectNewPlayer(-1); - app.mouse.button[SDL_BUTTON_X1] = app.keyboard[SDL_SCANCODE_A] = 0; + clearControl(CONTROL_PREV_FIGHTER); } - if (app.keyboard[SDL_SCANCODE_D] || app.mouse.button[SDL_BUTTON_X2]) + if (isControl(CONTROL_NEXT_FIGHTER)) { selectNewPlayer(1); - app.mouse.button[SDL_BUTTON_X2] = app.keyboard[SDL_SCANCODE_D] = 0; + clearControl(CONTROL_NEXT_FIGHTER); } - if (player->health > 0 && app.mouse.button[SDL_BUTTON_LEFT]) + if (player->health > 0 && isAcceptControl()) { battle.playerSelect = 0; initPlayer(); - app.mouse.button[SDL_BUTTON_LEFT] = 0; + resetAcceptControls(); } } diff --git a/src/battle/player.h b/src/battle/player.h index aedfc9f..ace2b8c 100644 --- a/src/battle/player.h +++ b/src/battle/player.h @@ -42,6 +42,8 @@ extern int isControl(int type); extern void clearControl(int type); extern long lookup(char *name); extern Entity *spawnFighter(char *name, int x, int y, int side); +extern int isAcceptControl(void); +extern void resetAcceptControls(void); extern App app; extern Battle battle; diff --git a/src/system/controls.c b/src/system/controls.c index 1120e37..b4a150d 100644 --- a/src/system/controls.c +++ b/src/system/controls.c @@ -80,6 +80,11 @@ int isControl(int type) return ((key != -1 && app.keyboard[key]) || (btn != -1 && 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]; @@ -96,6 +101,13 @@ void clearControl(int type) } } +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; From aadb4f6949e9c5c19e5b968cd792db913d96b889 Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 27 Mar 2016 08:56:09 +0100 Subject: [PATCH 47/51] Make shield splinter effects more visible. --- src/battle/effects.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle/effects.c b/src/battle/effects.c index eb63469..8b71890 100644 --- a/src/battle/effects.c +++ b/src/battle/effects.c @@ -492,7 +492,7 @@ void addShieldSplinterEffect(Entity *ent) e->dx *= 0.1; e->dy = rand() % 64 - rand() % 64; e->dy *= 0.1; - e->a = 128; + e->a = 255; e->health = e->a; From fe9c49244f8552d40d5cb9e850d0aa0b5db28d0f Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 27 Mar 2016 08:56:18 +0100 Subject: [PATCH 48/51] Final Clarke mission tweaks. --- data/missions/clarke/06 - clarke defence #6.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/data/missions/clarke/06 - clarke defence #6.json b/data/missions/clarke/06 - clarke defence #6.json index 9426c5f..640b3c2 100644 --- a/data/missions/clarke/06 - clarke defence #6.json +++ b/data/missions/clarke/06 - clarke defence #6.json @@ -10,7 +10,7 @@ { "description" : "Destroy all enemy targets", "targetName" : "Pandoran", - "targetValue" : 200, + "targetValue" : 150, "targetType" : "TT_DESTROY" } ], @@ -79,6 +79,7 @@ "side" : "SIDE_PANDORAN", "interval" : 1, "total" : -1, + "offscreen" : 1, "step" : 1, "active" : 0 } @@ -88,7 +89,7 @@ "function" : "TIME 2", "lines" : [ "MSG_BOX Wing Commander;The Twilight Lancers are on their way.", - "MSG_BOX Wingmate #62;Eight whole extra fighters? They outnumber and outgun us!", + "MSG_BOX Wingmate #62;Eight whole extra fighters? We might outnumber the enemy, but they still outgun us!", "MSG_BOX Wing Commander;At this point, any additional support is welcome. And we still have the support of Cleopatra and Artemis." ] }, @@ -105,7 +106,7 @@ "lines" : [ "MSG_BOX Wing Commander;We're wearing them down. Keep up the pressure.", "MSG_BOX Wingmate #31;Think they're pull back if we hit them hard enough?", - "MSG_BOX Wing Commander;Just concentrate on take down their fighters." + "MSG_BOX Wing Commander;Too early to speculate. Just concentrate on taking down their fighters." ] }, { From c00c134b7014f61ac26fbb11545da4f4e4c9e1f8 Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 27 Mar 2016 11:08:44 +0100 Subject: [PATCH 49/51] Allow access to all missions when using -debug. --- src/galaxy/mission.c | 2 +- src/galaxy/mission.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index ea140c8..4da86a0 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -460,7 +460,7 @@ void updateAllMissions(void) int isMissionAvailable(Mission *mission, Mission *prev) { - return prev->completed && mission->requires <= game.completedMissions; + return (prev->completed && mission->requires <= game.completedMissions) || dev.debug; } static unsigned long hashcode(const char *str) diff --git a/src/galaxy/mission.h b/src/galaxy/mission.h index aa4b002..420bafd 100644 --- a/src/galaxy/mission.h +++ b/src/galaxy/mission.h @@ -59,5 +59,6 @@ extern void loadLocations(cJSON *node); extern void loadSpawners(cJSON *node); extern Battle battle; +extern Dev dev; extern Entity *player; extern Game game; From b07beab755457e8f8fd6691d6a421810af2618ed Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 27 Mar 2016 11:09:01 +0100 Subject: [PATCH 50/51] Added missing mission descriptions. --- data/missions/clarke/04 - clarke defence #4.json | 2 +- data/missions/clarke/05 - clarke defence #5.json | 12 ++++++++++-- data/missions/clarke/06 - clarke defence #6.json | 2 +- data/missions/rothan/01 - rothan defence #1.json | 2 +- data/missions/rothan/02 - rothan defence #2.json | 4 ++-- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/data/missions/clarke/04 - clarke defence #4.json b/data/missions/clarke/04 - clarke defence #4.json index 812de5d..3c93dc7 100644 --- a/data/missions/clarke/04 - clarke defence #4.json +++ b/data/missions/clarke/04 - clarke defence #4.json @@ -1,6 +1,6 @@ { "name" : "Clarke Defence #4", - "description" : "", + "description" : "White Knights, Commodore Parks has identified three enemy corvettes are high level targets. He wants Dodds, Koonan and Todd to take them down, as quickly as possible. There won't be any additional fighter support, but three ATAFs should be more than enough to get the job done. de Winter and Taylor are currently on another assignment. Dodds will lead the attack.", "requires" : 28, "background" : "gfx/backgrounds/background06.jpg", "planet" : "gfx/planets/bluePlanet.png", diff --git a/data/missions/clarke/05 - clarke defence #5.json b/data/missions/clarke/05 - clarke defence #5.json index d4aa139..d06583c 100644 --- a/data/missions/clarke/05 - clarke defence #5.json +++ b/data/missions/clarke/05 - clarke defence #5.json @@ -1,6 +1,6 @@ { "name" : "Clarke Defence #5", - "description" : "", + "description" : "We have discovered that Alysha's Calling, one of the highest profile enemy frigates, is currently in the system. We are preparing a strike team of Hammerheads, led by the Twilight Lancers, to engage and destroy it. It is unknown what effects, if any, the destruction of this ship will have on enemy morale, however it can only have a positive infact on ours. The frigate's support groups will need to be destroyed first.", "requires" : 28, "background" : "gfx/backgrounds/background06.jpg", "planet" : "gfx/planets/bluePlanet.png", @@ -53,13 +53,21 @@ }, "fighters" : [ { - "types" : "TAF;Ray;Kingfisher;Hammerhead", + "types" : "TAF;Ray;Kingfisher", "side" : "SIDE_ALLIES", "x" : 5, "y" : 5, "number" : 7, "scatter" : 600 }, + { + "types" : "Hammerhead", + "side" : "SIDE_ALLIES", + "x" : 5, + "y" : 5, + "number" : 5, + "scatter" : 600 + }, { "name" : "Pandoran", "groupName" : "group-1", diff --git a/data/missions/clarke/06 - clarke defence #6.json b/data/missions/clarke/06 - clarke defence #6.json index 640b3c2..c715ad8 100644 --- a/data/missions/clarke/06 - clarke defence #6.json +++ b/data/missions/clarke/06 - clarke defence #6.json @@ -1,6 +1,6 @@ { "name" : "Clarke Defence #6", - "description" : "", + "description" : "The enemy are beginning to overrun our frontline. Your objective is simple: engage and destroy all hostile forces. We cannot afford to lose any more ground here. To do so would mean conceding defeat and Clarke falling to the Pandoran fleet. This must not happen.", "requires" : 30, "background" : "gfx/backgrounds/background06.jpg", "planet" : "gfx/planets/bluePlanet.png", diff --git a/data/missions/rothan/01 - rothan defence #1.json b/data/missions/rothan/01 - rothan defence #1.json index ea40cb3..3e1e0ff 100644 --- a/data/missions/rothan/01 - rothan defence #1.json +++ b/data/missions/rothan/01 - rothan defence #1.json @@ -1,6 +1,6 @@ { "name" : "Rothan Defence #1", - "description" : "", + "description" : "A distress call from a CSN squadron has been issued, who were engaging Pandoran targets. It appears as though the enemy have magged the fighters, rather than destroy them. INF tugs are preparing to lead them out of the system, via the jumpgate. We need to destroy those tugs, and get those men and women to safety. We cannot allow the Pandorans to get hold of any of our technology.", "requires" : 28, "background" : "gfx/backgrounds/background05.jpg", "planet" : "gfx/planets/bluePlanet.png", diff --git a/data/missions/rothan/02 - rothan defence #2.json b/data/missions/rothan/02 - rothan defence #2.json index 42b580d..36120a7 100644 --- a/data/missions/rothan/02 - rothan defence #2.json +++ b/data/missions/rothan/02 - rothan defence #2.json @@ -1,13 +1,13 @@ { "name" : "Rothan Defence #2", - "description" : "", + "description" : "The Pandorans are preparing for a major push into Rothan, so we need to shore up defences as quickly as possible. Command have selected a number of positions that will give us a strategic advantage in the early stages of battle when the enemy arrives. The Blue Jesters are to link up with the Irregular Nomads near to one Rothan's inner jumpgates, and await further instructions.", "requires" : 29, "background" : "gfx/backgrounds/background05.jpg", "planet" : "gfx/planets/bluePlanet.png", "music" : "music/battle/determination.mp3", "objectives" : [ { - "description" : "Rendezvous with Irregular Nomads", + "description" : "Rendezvous with the Irregular Nomads", "targetName" : "Waypoint", "targetValue" : 1, "targetType" : "TT_WAYPOINT" From 005ecce9e448391841be0ccbdbf5237b2d2645f6 Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 27 Mar 2016 11:09:47 +0100 Subject: [PATCH 51/51] Updated i18n. --- locale/tbftss.pot | 86 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/locale/tbftss.pot b/locale/tbftss.pot index e54e8b0..e3de4ed 100644 --- a/locale/tbftss.pot +++ b/locale/tbftss.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: TBFTSS: The Pandoran War\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-03-17 08:09:49+0000\n" +"POT-Creation-Date: 2016-03-27 11:09:14+0100\n" "PO-Revision-Date: ???\n" "Last-Translator: ???\n" "Language-Team: ???\n" @@ -625,6 +625,9 @@ msgstr "" msgid "Maybe not, if we continue to lose ground the way we are already ..." msgstr "" +msgid "White Knights, Commodore Parks has identified three enemy corvettes are high level targets. He wants Dodds, Koonan and Todd to take them down, as quickly as possible. There won't be any additional fighter support, but three ATAFs should be more than enough to get the job done. de Winter and Taylor are currently on another assignment. Dodds will lead the attack." +msgstr "" + msgid "Targets sighted: three capital ships, five escorts apiece." msgstr "" @@ -670,6 +673,9 @@ msgstr "" msgid "Okay, let's get back to Leviathan, and wait for Kelly and Estelle to rejoin us." msgstr "" +msgid "We have discovered that Alysha's Calling, one of the highest profile enemy frigates, is currently in the system. We are preparing a strike team of Hammerheads, led by the Twilight Lancers, to engage and destroy it. It is unknown what effects, if any, the destruction of this ship will have on enemy morale, however it can only have a positive infact on ours. The frigate's support groups will need to be destroyed first." +msgstr "" + msgid "First squadron sighted. Moving to intercept." msgstr "" @@ -718,6 +724,78 @@ msgstr "" msgid "Understood. Heading there now." msgstr "" +msgid "The enemy are beginning to overrun our frontline. Your objective is simple: engage and destroy all hostile forces. We cannot afford to lose any more ground here. To do so would mean conceding defeat and Clarke falling to the Pandoran fleet. This must not happen." +msgstr "" + +msgid "The Twilight Lancers are on their way." +msgstr "" + +msgid "Eight whole extra fighters? We might outnumber the enemy, but they still outgun us!" +msgstr "" + +msgid "At this point, any additional support is welcome. And we still have the support of Cleopatra and Artemis." +msgstr "" + +msgid "Welch here, engaging targets." +msgstr "" + +msgid "Not a moment too soon, Commander." +msgstr "" + +msgid "We're wearing them down. Keep up the pressure." +msgstr "" + +msgid "Think they're pull back if we hit them hard enough?" +msgstr "" + +msgid "Too early to speculate. Just concentrate on taking down their fighters." +msgstr "" + +msgid "I've just been tailed by something I've never seen before! Small, highly maneuverable, rapid fire particle cannon." +msgstr "" + +msgid "Swarmers! The enemy have deployed them here, too!" +msgstr "" + +msgid "How many?" +msgstr "" + +msgid "Tracking a dozen, but the numbers are growing rapidly" +msgstr "" + +msgid "I've lost count how many of these damn swarmers I've taken down." +msgstr "" + +msgid "It's like fighting a hydra! You cut off one head, and two more spring up!" +msgstr "" + +msgid "There's too many of them!" +msgstr "" + +msgid "Keep fighting, we can still win this!" +msgstr "" + +msgid "They're everywhere! I--" +msgstr "" + +msgid "This is UNF Cleopatra. We are engine crippled. Please provide cover support!" +msgstr "" + +msgid "Mayday! Mayday! We are taking heavy damage! Please assist ASAP!" +msgstr "" + +msgid "Artemis has lost her engines. We need to keep those Pandorans off her!" +msgstr "" + +msgid "All fighters, we're taking a pounding here, we don't know how much longer we can survive this." +msgstr "" + +msgid "People, we are down one capital ship! We need to step things up!" +msgstr "" + +msgid "Both caps are down, all hands lost. Let's not let this go to waste." +msgstr "" + msgid "Though we suffered heavy losses at Coyote, it is still important that we attempt to prevent, or at least slow, the Pandoran war machine's advance. Admiral Jenkins has ordered that the White Knights lead an attack on the enemy forces gathered in the system. The weight of the opposing forces remains tremendous, though the ATAFs should help to give us the edge in battle. Be advised that the enemy are now in possession of UNF fighter craft." msgstr "" @@ -979,6 +1057,9 @@ msgstr "" msgid "We're taking a lot of damage here. Please assist." msgstr "" +msgid "A distress call from a CSN squadron has been issued, who were engaging Pandoran targets. It appears as though the enemy have magged the fighters, rather than destroy them. INF tugs are preparing to lead them out of the system, via the jumpgate. We need to destroy those tugs, and get those men and women to safety. We cannot allow the Pandorans to get hold of any of our technology." +msgstr "" + msgid "White Knights, the enemy tugs are already in position and are attaching tow ropes. They must not be allowed to get those fighters and pilots to the jumpgate." msgstr "" @@ -1006,6 +1087,9 @@ msgstr "" msgid "I knew I could count on you, de Winter. Head back to Griffin." msgstr "" +msgid "The Pandorans are preparing for a major push into Rothan, so we need to shore up defences as quickly as possible. Command have selected a number of positions that will give us a strategic advantage in the early stages of battle when the enemy arrives. The Blue Jesters are to link up with the Irregular Nomads near to one Rothan's inner jumpgates, and await further instructions." +msgstr "" + msgid "Control, we're in position. Awaiting the Irregular Nomads." msgstr ""