Compare commits

...

17 Commits

Author SHA1 Message Date
Steve 118b99ccf6 Format with clang. 2022-07-31 10:43:20 +01:00
Steve 5e82c957cd Moved #includes, #defines, enums into c files, from h files. 2022-07-30 16:10:02 +01:00
Steve fc09a7d598 Set trophyId array size to MAX_NAME_LENGTH * 2. 2021-12-06 21:44:12 +00:00
Stephen J Sweeney 7023a48723
Merge pull request #55 from oglinuk/develop-trophyId-fix
`tophyId` fix
2021-12-06 21:41:23 +00:00
oglinuk 793b1b95a8 `trophyId` fix
When compiling, it would throw `src/game/trophies.c:455:32: error: ‘%s’
directive writing up to 31 bytes into a region of size 23`. Fixed by
adding 9 to `MAX_NAME_LENGTH` to account for "CAMPAIGN_".
2021-12-06 12:25:54 -08:00
Stephen J Sweeney 40cb97049c
Merge pull request #54 from smcameron/develop
Prevent readFile from returning uninitialized pointer on fopen() failure.
2021-10-01 07:36:26 +01:00
Stephen M. Cameron 2d3856d3ad Prevent readFile from returning uninitialized pointer on fopen() failure.
Signed-off-by: Stephen M. Cameron <stephenmcameron@gmail.com>
2021-10-01 02:24:07 -04:00
Steve ef46a97a67 Minor text rendering code tweaks. 2021-05-01 16:00:35 +01:00
Steve 786df47e09 Misc. tidying. 2021-05-01 13:35:52 +01:00
Steve 732a86aefd Use indexed array for text glyphs, instead of hashmap. 2021-05-01 13:35:33 +01:00
Steve 69c2fdf680 Source tidying. 2021-05-01 13:32:57 +01:00
Steve b145541ed4 Only use mags against Pandoran tugs. 2021-03-06 07:59:57 +00:00
Steve 6b89d7e8e7 Tidy #defines 2020-03-28 13:56:49 +00:00
Steve 7e14550cc1 Revert to while loop for nextCharacter() 2020-03-28 13:52:17 +00:00
Steve f3bb77ca81 Use Arial as default font. 2020-03-28 13:51:53 +00:00
Steve 10eca1eb60 Releases are now stable. 2020-01-22 07:27:46 +00:00
Steve a7a3cdb567 Small unicode optimization. 2020-01-22 07:27:35 +00:00
133 changed files with 3753 additions and 4105 deletions

230
.clang-format Normal file
View File

@ -0,0 +1,230 @@
---
Language: Cpp
# BasedOnStyle: Google
AccessModifierOffset: -1
AlignAfterOpenBracket: Align
AlignArrayOfStructures: None
AlignConsecutiveMacros: Consecutive
AlignConsecutiveAssignments: None
AlignConsecutiveBitFields: None
AlignConsecutiveDeclarations: Consecutive
AlignEscapedNewlines: Left
AlignOperands: Align
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortEnumsOnASingleLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: WithoutElse
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
AttributeMacros:
- __capability
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeConceptDeclarations: true
BreakBeforeBraces: Allman
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 1024
CommentPragmas: '^ IWYU pragma:'
QualifierAlignment: Leave
CompactNamespaces: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: true
DisableFormat: false
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
PackConstructorInitializers: NextLine
BasedOnStyle: ''
ConstructorInitializerAllOnOneLineOrOnePerLine: false
AllowAllConstructorInitializersOnNextLine: true
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IfMacros:
- KJ_IF_MAYBE
IncludeBlocks: Regroup
IncludeCategories:
- Regex: '^<ext/.*\.h>'
Priority: 2
SortPriority: 0
CaseSensitive: false
- Regex: '^<.*\.h>'
Priority: 1
SortPriority: 0
CaseSensitive: false
- Regex: '^<.*'
Priority: 2
SortPriority: 0
CaseSensitive: false
- Regex: '.*common.h'
Priority: 2
SortPriority: 0
CaseSensitive: false
- Regex: '.*'
Priority: 3
SortPriority: 0
CaseSensitive: false
IncludeIsMainRegex: 'common.h'
IncludeIsMainSourceRegex: 'common.h'
IndentAccessModifiers: false
IndentCaseLabels: true
IndentCaseBlocks: false
IndentGotoLabels: true
IndentPPDirectives: None
IndentExternBlock: AfterExternBlock
IndentRequires: false
IndentWidth: 4
IndentWrappedFunctionNames: false
InsertTrailingCommas: None
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
LambdaBodyIndentation: Signature
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Never
ObjCBlockIndentWidth: 2
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakOpenParenthesis: 0
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PenaltyIndentedWhitespace: 0
PointerAlignment: Left
PPIndentWidth: -1
RawStringFormats:
- Language: Cpp
Delimiters:
- cc
- CC
- cpp
- Cpp
- CPP
- 'c++'
- 'C++'
CanonicalDelimiter: ''
BasedOnStyle: google
- Language: TextProto
Delimiters:
- pb
- PB
- proto
- PROTO
EnclosingFunctions:
- EqualsProto
- EquivToProto
- PARSE_PARTIAL_TEXT_PROTO
- PARSE_TEST_PROTO
- PARSE_TEXT_PROTO
- ParseTextOrDie
- ParseTextProtoOrDie
- ParseTestProto
- ParsePartialTestProto
CanonicalDelimiter: pb
BasedOnStyle: google
ReferenceAlignment: Pointer
ReflowComments: true
RemoveBracesLLVM: false
SeparateDefinitionBlocks: Leave
ShortNamespaceLines: 1
SortIncludes: CaseInsensitive
SortJavaStaticImport: Before
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: true
AfterFunctionDefinitionName: false
AfterFunctionDeclarationName: false
AfterIfMacros: true
AfterOverloadedOperator: false
BeforeNonEmptyParentheses: false
SpaceAroundPointerQualifiers: Default
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: Never
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
BitFieldColonSpacing: Both
Standard: Auto
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 4
UseCRLF: false
UseTab: Always
WhitespaceSensitiveMacros:
- STRINGIZE
- PP_STRINGIZE
- BOOST_PP_STRINGIZE
- NS_SWIFT_NAME
- CF_SWIFT_NAME
...

2
.gitignore vendored
View File

@ -43,5 +43,5 @@ build/*
# Misc
.DS_Store
/.errors
tools

View File

@ -4,7 +4,7 @@
![Alt text](dev/screenshots/v0.6-06.png?raw=true "Screenshot")
The develop branch on GitHub (https://github.com/stephenjsweeney/tbftss/tree/develop) is where all the dev work happens. Stable(ish) releases will go in to master (https://github.com/stephenjsweeney/tbftss/tree/master).
The develop branch on GitHub (https://github.com/stephenjsweeney/tbftss/tree/develop) is where all the dev work happens. Stable releases will go in to master (https://github.com/stephenjsweeney/tbftss/tree/master).
Website: www.battleforthesolarsystem.com
Email: stephenjsweeney@battleforthesolarsystem.com

View File

@ -99,7 +99,7 @@
"number" : 12,
"scatter" : 5000,
"aiFlags" : "+AIF_UNLIMITED_RANGE",
"flags" : "+EF_AI_LEADER"
"flags" : "+EF_AI_LEADER+EF_MUST_DISABLE"
},
{
"types" : "Sphinx;Thunderhead",
@ -158,7 +158,9 @@
"lines" : [
"MSG_BOX CSN Griffin;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.",
"MSG_BOX de Winter;Can you disable the gate remotely?",
"MSG_BOX CSN Griffin;Negative, the Pandorans have control. We're working take back command functions. Stand by."
"MSG_BOX CSN Griffin;Negative, the Pandorans have control. We're working take back command functions. Stand by.",
"MSG_BOX de Winter;Understood. Kelly, we should mag the tugs first and destroy them when its safe. Stray plasma fire could hit our pilots.",
"MSG_BOX Taylor;Agreed."
]
},
{
@ -189,4 +191,4 @@
}
]
}

View File

@ -25,9 +25,7 @@ MAKEFLAGS += -j$(NPROCS)
CXXFLAGS += `sdl2-config --cflags` -DVERSION=$(VERSION) -DREVISION=$(REVISION) -DDATA_DIR=\"$(DATA_DIR)\" -DLOCALE_DIR=\"$(LOCALE_DIR)\"
CXXFLAGS += -ansi -pedantic
CXXFLAGS += -g -lefence
ifneq ("$(wildcard .errors)","")
CXXFLAGS += -Wall -Wempty-body -Werror -Wstrict-prototypes -Werror=maybe-uninitialized -Warray-bounds
endif
LDFLAGS += `sdl2-config --libs` -lSDL2_mixer -lSDL2_image -lSDL2_ttf -lm
@ -54,13 +52,13 @@ install:
cp -p icons/$(PROG)-128x128.png $(INST_ICON_DIR)/128x128/apps/$(PROG).png
mkdir -p $(INST_DESKTOP_DIR)
cp -p icons/$(PROG).desktop $(INST_DESKTOP_DIR)
@for f in $(LOCALE_MO); do \
lang=`echo $$f | sed -e 's/^locale\///;s/\.mo$$//'`; \
mkdir -p $(INST_LOCALE_DIR)/$$lang/LC_MESSAGES; \
cp -v $$f $(INST_LOCALE_DIR)/$$lang/LC_MESSAGES/$(PROG).mo; \
done
uninstall:
$(RM) $(BIN_DIR)/$(PROG)
$(RM) -rf $(DATA_DIR)
@ -69,10 +67,10 @@ uninstall:
$(RM) $(ICON_DIR)/64x64/apps/$(PROG).png
$(RM) $(ICON_DIR)/128x128/apps/$(PROG).png
$(RM) $(DESKTOP_DIR)/$(PROG).desktop
@for f in $(LOCALE_MO); do \
lang=`echo $$f | sed -e 's/^locale\///;s/\.mo$$//'`; \
$(RM) -v $(LOCALE_DIR)/$$lang/LC_MESSAGES/$(PROG).mo; \
done
.PHONY: dist

View File

@ -2,7 +2,7 @@
<html>
<head>
<style>
body {background-color:#000; color: #fff; font-family: "sans"; background-image: url("background02.jpg");}
body {background-color:#000; color: #fff; font-family: Arial; font-size: 18px; background-image: url("background02.jpg");}
h3 {background-color:#47c; padding:0.25em; color:#fff; margin-top:3em; border: 1px solid #fff;}
h4 {background-color:#000; padding:0.25em; color:#fff; margin-top:3em; border: 1px solid #5ad;}
h5 {border-bottom: 1px solid #5ad; width: 50%;}
@ -513,7 +513,7 @@ $('h3,h4').each(function(i, e) {
{
toc.append("&blacksquare; <a href='#" + link + "'>" + e.innerText + "</a><br>");
}
if (e.tagName == 'H4')
{
toc.append("<span style='text-indent: 2em; display: inline-block'>&#9643 <a href='#" + link + "'>" + e.innerText + "</a></span><br>");

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,45 +18,66 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/bullets.h"
#include "../battle/fighters.h"
#include "../battle/hud.h"
#include "../battle/mine.h"
#include "../battle/quadtree.h"
#include "../battle/script.h"
#include "../system/util.h"
#include "ai.h"
#define AI_EVADE 0
#define AI_FALLBACK 1
#define AI_HUNT 2
#define TURN_SPEED 4
#define TURN_THRESHOLD 2
extern Battle battle;
extern Colors colors;
extern Dev dev;
extern Entity *player;
extern Entity *self;
static void faceTarget(Entity *e);
static int isInFOV(Entity *e, int fov);
static int isInFOV(Entity *e, int fov);
static void preAttack(void);
static void huntTarget(void);
static void huntAndAttackTarget(void);
static void moveToTargetLocation(void);
static void nextAction(void);
static void findTarget(void);
static int hasClearShot(void);
static int hasClearShot(void);
static void fallback(void);
static void moveToPlayer(void);
static int canAttack(Entity *e);
static int selectWeapon(int type);
static int nearJumpgate(void);
static int canAttack(Entity *e);
static int selectWeapon(int type);
static int nearJumpgate(void);
static void moveToJumpgate(void);
static int nearEnemies(void);
static int nearItems(void);
static int nearMines(void);
static int nearEnemies(void);
static int nearItems(void);
static int nearMines(void);
static void moveToItem(void);
static int nearTowableCraft(void);
static int nearTowableCraft(void);
static void moveToTowableCraft(void);
static int lookForPlayer(void);
static int lookForLeader(void);
static int lookForPlayer(void);
static int lookForLeader(void);
static void fleeEnemies(void);
static int isRetreating(void);
static int getActionChance(int type);
static int isRetreating(void);
static int getActionChance(int type);
static void doFighterAI(void);
static void doGunAI(void);
static void moveToLeader(void);
static void wander(void);
static void doWander(void);
static int selectWeaponForTarget(Entity *e);
static int selectWeaponForTarget(Entity *e);
static void deployMine(void);
static int isSurrendering(void);
static int isSurrendering(void);
static void doSurrender(void);
static void fleeWithinBattleArea(int x, int y, int numEnemies);
static int evadeNonKillTargets(void);
static int evadeNonKillTargets(void);
void doAI(void)
{
@ -131,7 +152,7 @@ void doAI(void)
return;
}
if ((self->aiFlags & (AIF_FOLLOWS_PLAYER|AIF_MOVES_TO_PLAYER)) && lookForPlayer())
if ((self->aiFlags & (AIF_FOLLOWS_PLAYER | AIF_MOVES_TO_PLAYER)) && lookForPlayer())
{
return;
}
@ -320,8 +341,8 @@ static void huntAndAttackTarget(void)
static void findTarget(void)
{
int i;
Entity *e, **candidates;
int i;
Entity *e, **candidates;
unsigned int dist, closest;
dist = closest = (battle.isEpic || (self->aiFlags & AIF_UNLIMITED_RANGE)) ? MAX_TARGET_RANGE : SCREEN_WIDTH;
@ -330,7 +351,7 @@ static void findTarget(void)
self->target = NULL;
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if (canAttack(e) && selectWeaponForTarget(e))
{
@ -417,7 +438,7 @@ static int selectWeapon(int type)
{
int i;
for (i = 0 ; i < MAX_FIGHTER_GUNS ; i++)
for (i = 0; i < MAX_FIGHTER_GUNS; i++)
{
if (self->guns[i].type == type)
{
@ -461,14 +482,14 @@ static int isInFOV(Entity *e, int fov)
static int hasClearShot(void)
{
int dist;
int dist;
Entity *e;
if (isInFOV(self->target, 4))
{
dist = getDistance(self->x, self->y, self->target->x, self->target->y);
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (self->owner != NULL && self->owner == e->owner)
{
@ -503,7 +524,7 @@ static void preAttack(void)
{
fireGuns(self);
}
else if (self->missiles && (!(self->target->flags & (EF_NO_KILL|EF_MUST_DISABLE|EF_FRIENDLY_HEALTH_BAR))) && getDistance(self->x, self->y, self->target->x, self->target->y) >= 350)
else if (self->missiles && (!(self->target->flags & (EF_NO_KILL | EF_MUST_DISABLE | EF_FRIENDLY_HEALTH_BAR))) && getDistance(self->x, self->y, self->target->x, self->target->y) >= 350)
{
fireMissile(self);
@ -655,7 +676,7 @@ static void doSurrender(void)
static int nearEnemies(void)
{
int i, numEnemies, x, y;
int i, numEnemies, x, y;
Entity *e, **candidates;
candidates = getAllEntsInRadius(self->x, self->y, SCREEN_WIDTH, self);
@ -665,7 +686,7 @@ static int nearEnemies(void)
numEnemies = 0;
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if ((e->flags & EF_TAKES_DAMAGE) && e->side != SIDE_NONE && e->side != self->side && !(e->flags & EF_DISABLED))
{
@ -695,7 +716,7 @@ static int nearEnemies(void)
static int evadeNonKillTargets(void)
{
int i, numEnemies, x, y;
int i, numEnemies, x, y;
Entity *e, **candidates;
candidates = getAllEntsInRadius(self->x, self->y, SCREEN_WIDTH, self);
@ -705,7 +726,7 @@ static int evadeNonKillTargets(void)
numEnemies = 0;
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if ((e->flags & EF_TAKES_DAMAGE) && e->side != SIDE_NONE && e->side != self->side && (!(e->flags & EF_DISABLED)))
{
@ -786,7 +807,7 @@ static void deployMine(void)
static int nearMines(void)
{
int i, numMines, x, y;
int i, numMines, x, y;
Entity *e, **candidates;
candidates = getAllEntsInRadius(self->x, self->y, SCREEN_HEIGHT, self);
@ -795,7 +816,7 @@ static int nearMines(void)
numMines = 0;
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if (e->side != self->side && e->type == ET_MINE && getDistance(e->x, e->y, self->x, self->y) <= SCREEN_HEIGHT)
{
@ -893,8 +914,8 @@ static void moveToJumpgate(void)
static int nearItems(void)
{
int i;
long closest, distance;
int i;
long closest, distance;
Entity *e, **candidates;
closest = MAX_TARGET_RANGE;
@ -903,7 +924,7 @@ static int nearItems(void)
self->target = NULL;
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if (e->type == ET_ITEM)
{
@ -941,8 +962,8 @@ static void moveToItem(void)
static int nearTowableCraft(void)
{
int i;
long closest, dist;
int i;
long closest, dist;
Entity *e, **candidates;
dist = closest = (battle.isEpic || (self->aiFlags & AIF_UNLIMITED_RANGE)) ? MAX_TARGET_RANGE : 2000;
@ -951,9 +972,9 @@ static int nearTowableCraft(void)
self->target = NULL;
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if (!e->owner && (e->flags & (EF_DISABLED|EF_MISSION_TARGET)) == (EF_DISABLED|EF_MISSION_TARGET) && (e->flags & EF_ROPED_ATTACHED) == 0)
if (!e->owner && (e->flags & (EF_DISABLED | EF_MISSION_TARGET)) == (EF_DISABLED | EF_MISSION_TARGET) && (e->flags & EF_ROPED_ATTACHED) == 0)
{
dist = getDistance(self->x, self->y, e->x, e->y);
@ -998,13 +1019,13 @@ static int lookForPlayer(void)
static int lookForLeader(void)
{
long closest, distance;
long closest, distance;
Entity *e;
self->leader = NULL;
closest = 0;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->active && e->flags & EF_AI_LEADER && e->side == self->side)
{

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,29 +18,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#define AI_EVADE 0
#define AI_FALLBACK 1
#define AI_HUNT 2
#define TURN_SPEED 4
#define TURN_THRESHOLD 2
extern void addHudMessage(SDL_Color c, char *format, ...);
extern void applyFighterBrakes(void);
extern void applyFighterThrust(void);
extern void fireGuns(Entity *owner);
extern void fireMissile(Entity *owner);
extern void fireRocket(Entity *owner);
extern Entity **getAllEntsInRadius(int x, int y, int radius, Entity *ignore);
extern float getAngle(int x1, int y1, int x2, int y2);
extern int getDistance(int x1, int y1, int x2, int y2);
extern float mod(float n, float x);
extern void runScriptFunction(char *format, ...);
extern Entity *spawnMine(int type);
extern Battle battle;
extern Colors colors;
extern Dev dev;
extern Entity *player;
extern Entity *self;
void checkZackariaSuspicionLevel(void);
void checkSuspicionLevel(void);
void doAI(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,13 +18,56 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/bullets.h"
#include "../battle/debris.h"
#include "../battle/effects.h"
#include "../battle/entities.h"
#include "../battle/hud.h"
#include "../battle/locations.h"
#include "../battle/messageBox.h"
#include "../battle/missionInfo.h"
#include "../battle/objectives.h"
#include "../battle/player.h"
#include "../battle/quadtree.h"
#include "../battle/radar.h"
#include "../battle/script.h"
#include "../battle/spawners.h"
#include "../battle/starfield.h"
#include "../battle/waypoints.h"
#include "../challenges/challengeHome.h"
#include "../challenges/challenges.h"
#include "../galaxy/galacticMap.h"
#include "../galaxy/mission.h"
#include "../game/credits.h"
#include "../game/options.h"
#include "../game/stats.h"
#include "../game/trophies.h"
#include "../json/cJSON.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/input.h"
#include "../system/modalDialog.h"
#include "../system/sound.h"
#include "../system/widgets.h"
#include "battle.h"
#define SHOW_BATTLE 0
#define SHOW_MENU 1
#define SHOW_OBJECTIVES 2
#define SHOW_OPTIONS 3
extern App app;
extern Battle battle;
extern Dev dev;
extern Entity *player;
extern Game game;
static void logic(void);
static void draw(void);
static void handleKeyboard(void);
static void postBattle(void);
void destroyBattle(void);
static void doBattle(void);
static void optQuitBattle(void);
static void quitBattle(void);
@ -40,7 +83,7 @@ static void checkSuspicionLevel(void);
static void doTorelliFireStorm(void);
static void endCampaign(void);
static int show;
static int show;
static float ssx, ssy;
void initBattle(void)
@ -434,7 +477,7 @@ static void postBattle(void)
{
int i;
for (i = 0 ; i < STAT_MAX ; i++)
for (i = 0; i < STAT_MAX; i++)
{
if (i != STAT_TIME && i != STAT_EPIC_KILL_STREAK)
{
@ -486,13 +529,13 @@ static void endCampaign(void)
void destroyBattle(void)
{
Entity *ent;
Bullet *b;
Debris *d;
Effect *e;
Entity *ent;
Bullet *b;
Debris *d;
Effect *e;
Objective *o;
Location *l;
Spawner *s;
Location *l;
Spawner *s;
while (battle.entityHead.next)
{

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,80 +18,5 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
#define SHOW_BATTLE 0
#define SHOW_MENU 1
#define SHOW_OBJECTIVES 2
#define SHOW_OPTIONS 3
extern void awardTrophy(char *id);
extern void blitScaled(AtlasImage *atlasImage, int x, int y, int w, int h, int center);
extern void cancelScript(void);
extern void clearInput(void);
extern void destroyBullets(void);
extern void destroyDebris(void);
extern void destroyEffects(void);
extern void destroyEntities(void);
extern void destroyQuadtree(void);
extern void destroyScript(void);
extern void doBullets(void);
extern void doChallenges(void);
extern void doDebris(void);
extern void doEffects(void);
extern void doEntities(void);
extern void doHud(void);
extern void doLocations(void);
extern void doMessageBox(void);
extern void doObjectives(void);
extern void doPlayer(void);
extern void doPlayerSelect(void);
extern void doScript(void);
extern void doSpawners(void);
extern void doStars(float dx, float dy);
extern void doWidgets(void);
extern void drawBackground(SDL_Texture *texture);
extern void drawBullets(void);
extern void drawDebris(void);
extern void drawEffects(void);
extern void drawEntities(void);
extern void drawHud(void);
extern void drawLocations(void);
extern void drawMessageBox(void);
extern void drawMissionInfo(void);
extern void drawOptions(void);
extern void drawStars(void);
extern void drawWidgets(char *groupName);
extern Widget *getWidget(const char *name, const char *group);
extern void initBullets(void);
extern void initChallengeHome(void);
extern void initCredits(void);
extern void initDebris(void);
extern void initEffects(void);
extern void initEntities(void);
extern void initGalacticMap(void);
extern void initHud(void);
extern void initMessageBox(void);
extern void initOptions(void (*returnFromOptions)(void));
extern void initQuadtree(Quadtree *root);
extern void initRadar(void);
extern void initStars(void);
extern void loadMission(char *filename);
extern void playSound(int id);
extern void resetHud(void);
extern void resetMessageBox(void);
extern void resetWaypoints(void);
extern void runScriptFunction(const char *format, ...);
extern void scrollBackground(float x, float y);
extern void selectWidget(const char *name, const char *group);
extern void setAtlasColor(int r, int g, int b, int a);
extern void showOKCancelDialog(void (*okCallback)(void), void (*cancelCallback)(void), const char *format, ...);
extern void updateAccuracyStats(unsigned int *stats);
extern App app;
extern Battle battle;
extern Dev dev;
extern Entity *player;
extern Game game;
void destroyBattle(void);
void initBattle(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,31 +18,53 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/effects.h"
#include "../battle/fighters.h"
#include "../battle/quadtree.h"
#include "../game/trophies.h"
#include "../json/cJSON.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/io.h"
#include "../system/lookup.h"
#include "../system/sound.h"
#include "../system/util.h"
#include "bullets.h"
#define INITIAL_BULLET_DRAW_CAPACITY 32
#define MISSILE_LIFE (FPS * 30)
#define TURN_SPEED 2
#define TURN_THRESHOLD 3
extern App app;
extern Battle battle;
extern Entity *player;
static void huntTarget(Bullet *b);
static void checkCollisions(Bullet *b);
static void resizeDrawList(void);
static void selectNewTarget(Bullet *b);
static void doBulletHitEffect(Bullet *b);
static Bullet bulletDef[BT_MAX];
static Bullet bulletDef[BT_MAX];
static Bullet **bulletsToDraw;
static int drawCapacity;
static int drawCapacity;
void initBullets(void)
{
drawCapacity = INITIAL_BULLET_DRAW_CAPACITY;
bulletsToDraw = malloc(sizeof(Bullet*) * drawCapacity);
memset(bulletsToDraw, 0, sizeof(Bullet*) * drawCapacity);
bulletsToDraw = malloc(sizeof(Bullet *) * drawCapacity);
memset(bulletsToDraw, 0, sizeof(Bullet *) * drawCapacity);
}
void initBulletDefs(void)
{
cJSON *root, *node;
char *text;
int type;
cJSON *root, *node;
char *text;
int type;
Bullet *def;
memset(&bulletDef, 0, sizeof(Bullet) * BT_MAX);
@ -51,7 +73,7 @@ void initBulletDefs(void)
root = cJSON_Parse(text);
for (node = root->child ; node != NULL ; node = node->next)
for (node = root->child; node != NULL; node = node->next)
{
type = lookup(cJSON_GetObjectItem(node, "type")->valuestring);
@ -72,15 +94,15 @@ void initBulletDefs(void)
void doBullets(void)
{
int i = 0;
int i = 0;
Bullet *b;
Bullet *prev = &battle.bulletHead;
battle.incomingMissile = 0;
memset(bulletsToDraw, 0, sizeof(Bullet*) * drawCapacity);
memset(bulletsToDraw, 0, sizeof(Bullet *) * drawCapacity);
for (b = battle.bulletHead.next ; b != NULL ; b = b->next)
for (b = battle.bulletHead.next; b != NULL; b = b->next)
{
b->x += b->dx;
b->y += b->dy;
@ -142,7 +164,7 @@ static void resizeDrawList(void)
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "Resizing bullet draw capacity: %d -> %d", drawCapacity, n);
bulletsToDraw = resize(bulletsToDraw, sizeof(Bullet*) * drawCapacity, sizeof(Bullet*) * n);
bulletsToDraw = resize(bulletsToDraw, sizeof(Bullet *) * drawCapacity, sizeof(Bullet *) * n);
drawCapacity = n;
}
@ -150,11 +172,11 @@ static void resizeDrawList(void)
static void checkCollisions(Bullet *b)
{
Entity *e, **candidates;
int i;
int i;
candidates = getAllEntsWithin(b->x - (b->w / 2), b->y - (b->h / 2), b->w, b->h, NULL);
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if (e->flags & EF_TAKES_DAMAGE)
{
@ -182,7 +204,7 @@ static void checkCollisions(Bullet *b)
if (battle.hasSuspicionLevel)
{
if (e->aiFlags & (AIF_AVOIDS_COMBAT|AIF_DEFENSIVE))
if (e->aiFlags & (AIF_AVOIDS_COMBAT | AIF_DEFENSIVE))
{
battle.suspicionLevel -= (MAX_SUSPICION_LEVEL * 0.1);
}
@ -261,7 +283,7 @@ static void checkCollisions(Bullet *b)
}
}
void doBulletHitEffect(Bullet *b)
static void doBulletHitEffect(Bullet *b)
{
switch (b->type)
{
@ -289,12 +311,12 @@ void doBulletHitEffect(Bullet *b)
void drawBullets(void)
{
int i;
int i;
Bullet *b;
setAtlasColor(255, 255, 255, 255);
for (i = 0, b = bulletsToDraw[i] ; b != NULL ; b = bulletsToDraw[++i])
for (i = 0, b = bulletsToDraw[i]; b != NULL; b = bulletsToDraw[++i])
{
blitRotated(b->texture, b->x - battle.camera.x, b->y - battle.camera.y, b->angle);
}
@ -335,7 +357,7 @@ static void faceTarget(Bullet *b)
static void applyMissileThrust(Bullet *b)
{
int maxSpeed;
int maxSpeed;
float v, thrust;
b->dx += sin(TO_RAIDANS(b->angle));
@ -376,7 +398,7 @@ static void huntTarget(Bullet *b)
static void selectNewTarget(Bullet *b)
{
int i;
int i;
Entity *e, **candidates;
if (app.gameplay.missileReTarget)
@ -385,7 +407,7 @@ static void selectNewTarget(Bullet *b)
candidates = getAllEntsInRadius(b->x, b->y, SCREEN_HEIGHT, NULL);
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if (e->type == ET_FIGHTER && e->side != b->owner->side && e->health > 0)
{
@ -435,13 +457,13 @@ static Bullet *createBullet(int type, int x, int y, Entity *owner)
void fireGuns(Entity *owner)
{
Bullet *b;
int i;
float x, y;
float c, s;
int i;
float x, y;
float c, s;
b = NULL;
for (i = 0 ; i < MAX_FIGHTER_GUNS ; i++)
for (i = 0; i < MAX_FIGHTER_GUNS; i++)
{
if (owner->guns[i].type != BT_NONE && (owner->guns[i].type == owner->selectedGunType || owner->combinedGuns))
{

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,37 +18,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
#define INITIAL_BULLET_DRAW_CAPACITY 32
#define MISSILE_LIFE (FPS * 30)
#define TURN_SPEED 2
#define TURN_THRESHOLD 3
extern void addBulletHitEffect(int x, int y, int r, int g, int b);
extern void addMissileEngineEffect(Bullet *b);
extern void addMissileExplosion(Bullet *b);
extern void awardTrophy(char *id);
extern void blitRotated(AtlasImage *atlasImage, int x, int y, float angle);
extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
extern void damageFighter(Entity *e, int damage, long flags);
extern long flagsToLong(char *flags, int *add);
extern Entity **getAllEntsInRadius(int x, int y, int radius, Entity *ignore);
extern Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore);
extern float getAngle(int x1, int y1, int x2, int y2);
extern AtlasImage *getAtlasImage(char *filename);
extern int getDistance(int x1, int y1, int x2, int y2);
extern int isOnBattleScreen(int x, int y, int w, int h);
extern long lookup(char *name);
extern float mod(float n, float x);
extern void playBattleSound(int id, int x, int y);
extern void playSound(int id);
extern char *readFile(char *filename);
extern void *resize(void *array, int oldSize, int newSize);
extern void setAtlasColor(int r, int g, int b, int a);
extern App app;
extern Battle battle;
extern Entity *player;
void destroyBullets(void);
void destroyBulletDefs(void);
void fireMissile(Entity *owner);
void fireRocket(Entity *owner);
void fireGuns(Entity *owner);
void drawBullets(void);
void doBullets(void);
void initBulletDefs(void);
void initBullets(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,9 +18,33 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/ai.h"
#include "../battle/debris.h"
#include "../battle/effects.h"
#include "../battle/entities.h"
#include "../battle/fighters.h"
#include "../battle/messageBox.h"
#include "../battle/objectives.h"
#include "../battle/quadtree.h"
#include "../battle/script.h"
#include "../json/cJSON.h"
#include "../system/atlas.h"
#include "../system/io.h"
#include "../system/lookup.h"
#include "../system/sound.h"
#include "../system/util.h"
#include "capitalShips.h"
static int steer(void);
#define TURN_SPEED 0.1
#define TURN_THRESHOLD 2
extern Battle battle;
extern Entity *player;
extern Entity *self;
static int steer(void);
static void think(void);
static void gunThink(void);
static void gunDie(void);
@ -46,7 +70,7 @@ Entity *spawnCapitalShip(char *name, int x, int y, int side)
capitalShip = NULL;
for (def = defHead.next ; def != NULL ; def = def->next)
for (def = defHead.next; def != NULL; def = def->next)
{
if ((strcmp(def->name, name) == 0) || (def->owner != NULL && strcmp(def->owner->name, name) == 0))
{
@ -120,7 +144,7 @@ void doCapitalShip(void)
static void think(void)
{
float dir;
int wantedAngle;
int wantedAngle;
if (--self->aiActionTime <= 0)
{
@ -145,13 +169,13 @@ static void think(void)
static void findAITarget(void)
{
Entity *e;
Entity *e;
unsigned int dist, closest;
self->target = NULL;
dist = closest = MAX_TARGET_RANGE;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->active && e->side != self->side && e->flags & EF_AI_TARGET)
{
@ -183,13 +207,13 @@ static void findAITarget(void)
static int steer(void)
{
int wantedAngle;
int angle;
int distance;
float dx, dy, force;
int count;
int wantedAngle;
int angle;
int distance;
float dx, dy, force;
int count;
Entity *e, **candidates;
int i;
int i;
dx = dy = 0;
count = 0;
@ -197,7 +221,7 @@ static int steer(void)
candidates = getAllEntsInRadius(self->x, self->y, 2000, self);
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if (e->type == ET_CAPITAL_SHIP)
{
@ -276,7 +300,7 @@ static void gunDie(void)
playBattleSound(SND_EXPLOSION_1 + rand() % 4, self->x, self->y);
addDebris(self->x, self->y, 3 + rand() % 4);
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e != self && e->health > 0 && e->owner == self->owner && e->type == ET_COMPONENT_GUN)
{
@ -313,7 +337,7 @@ static void engineDie(void)
playBattleSound(SND_EXPLOSION_1 + rand() % 4, self->x, self->y);
addDebris(self->x, self->y, 4 + rand() % 9);
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e != self && e->health > 0 && e->owner == self->owner && e->type == ET_COMPONENT_ENGINE)
{
@ -354,7 +378,7 @@ static void die(void)
addDebris(self->x, self->y, 12);
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->owner == self)
{
@ -387,7 +411,7 @@ static void disable(void)
runScriptFunction("CAP_DISABLED %s", self->owner->name);
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->owner == self->owner || e == self->owner)
{
@ -403,15 +427,15 @@ static void disable(void)
void loadCapitalShipDefs(void)
{
char **filenames;
char path[MAX_FILENAME_LENGTH];
int count, i;
char path[MAX_FILENAME_LENGTH];
int count, i;
memset(&defHead, 0, sizeof(Entity));
defTail = &defHead;
filenames = getFileList("data/capitalShips", &count);
for (i = 0 ; i < count ; i++)
for (i = 0; i < count; i++)
{
sprintf(path, "data/capitalShips/%s", filenames[i]);
@ -425,8 +449,8 @@ void loadCapitalShipDefs(void)
static void loadCapitalShipDef(char *filename)
{
cJSON *root;
char *text;
cJSON *root;
char *text;
Entity *e;
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename);
@ -481,7 +505,7 @@ static void loadCapitalShipDef(char *filename)
static void loadComponents(Entity *parent, cJSON *components)
{
Entity *e;
cJSON *component;
cJSON *component;
parent->health = 0;
@ -535,7 +559,7 @@ static void loadComponents(Entity *parent, cJSON *components)
static void loadGuns(Entity *parent, cJSON *guns)
{
Entity *e;
cJSON *gun;
cJSON *gun;
if (guns)
{
@ -587,7 +611,7 @@ static void loadGuns(Entity *parent, cJSON *guns)
static void loadEngines(Entity *parent, cJSON *engines)
{
Entity *e;
cJSON *engine;
cJSON *engine;
if (engines)
{
@ -637,7 +661,7 @@ void updateCapitalShipComponentProperties(Entity *parent, long flags)
flags &= ~EF_AI_LEADER;
}
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->owner == parent)
{
@ -675,11 +699,11 @@ void updateCapitalShipComponentProperties(Entity *parent, long flags)
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;
char **types, *name, *groupName, *type;
int side, scatter, number, active;
int i, numTypes, addFlags;
long flags;
float x, y;
if (node)
{
@ -706,7 +730,7 @@ void loadCapitalShips(cJSON *node)
flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags);
}
for (i = 0 ; i < number ; i++)
for (i = 0; i < number; i++)
{
type = types[rand() % numTypes];
@ -751,7 +775,7 @@ void loadCapitalShips(cJSON *node)
node = node->next;
for (i = 0 ; i < numTypes ; i++)
for (i = 0; i < numTypes; i++)
{
free(types[i]);
}

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,39 +18,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
#define TURN_SPEED 0.1
#define TURN_THRESHOLD 2
extern void addDebris(int x, int y, int amount);
extern void addLargeEngineEffect(void);
extern void addLargeExplosion(void);
extern void addMessageBox(char *title, char *body, int type);
extern void addSmallExplosion(void);
extern void applyFighterThrust(void);
extern void doAI(void);
extern long flagsToLong(char *flags, int *add);
extern Entity **getAllEntsInRadius(int x, int y, int radius, Entity *ignore);
extern float getAngle(int x1, int y1, int x2, int y2);
extern AtlasImage *getAtlasImage(char *filename);
extern int getDistance(int x1, int y1, int x2, int y2);
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 long lookup(char *name);
extern float mod(float n, float x);
extern void playBattleSound(int id, int x, int y);
extern char *readFile(char *filename);
extern void runScriptFunction(char *format, ...);
extern Entity *spawnEntity(void);
extern char **toTypeArray(char *types, int *numTypes);
extern void updateCondition(char *name, int type);
extern void updateObjective(char *name, int type);
extern Battle battle;
extern Entity *player;
extern Entity *self;
void destroyCapitalShipDefs(void);
void loadCapitalShips(struct cJSON *node);
void updateCapitalShipComponentProperties(Entity *parent, long flags);
void loadCapitalShipDefs(void);
void doCapitalShip(void);
Entity *spawnCapitalShip(char *name, int x, int y, int side);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,14 +18,26 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/effects.h"
#include "../json/cJSON.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/util.h"
#include "debris.h"
#define INITIAL_DEBRIS_DRAW_CAPACITY 32
#define MAX_DEBRIS_TEXTURES 6
extern Battle battle;
static void changeCourse(Debris *d);
static void resizeDrawList(void);
static Debris **debrisToDraw;
static Debris **debrisToDraw;
static AtlasImage *debrisTexture[MAX_DEBRIS_TEXTURES];
static int drawCapacity;
static int drawCapacity;
void initDebris(void)
{
@ -38,16 +50,16 @@ void initDebris(void)
drawCapacity = INITIAL_DEBRIS_DRAW_CAPACITY;
debrisToDraw = malloc(sizeof(Bullet*) * drawCapacity);
memset(debrisToDraw, 0, sizeof(Bullet*) * drawCapacity);
debrisToDraw = malloc(sizeof(Bullet *) * drawCapacity);
memset(debrisToDraw, 0, sizeof(Bullet *) * drawCapacity);
}
void addDebris(int x, int y, int amount)
{
int i;
int i;
Debris *d;
for (i = 0 ; i < amount ; i++)
for (i = 0; i < amount; i++)
{
d = malloc(sizeof(Debris));
memset(d, 0, sizeof(Debris));
@ -68,16 +80,16 @@ void addDebris(int x, int y, int amount)
void doDebris(void)
{
int i;
int i;
Debris *d, *prev;
memset(debrisToDraw, 0, sizeof(Debris*) * drawCapacity);
memset(debrisToDraw, 0, sizeof(Debris *) * drawCapacity);
prev = &battle.debrisHead;
i = 0;
for (d = battle.debrisHead.next ; d != NULL ; d = d->next)
for (d = battle.debrisHead.next; d != NULL; d = d->next)
{
d->x += d->dx;
d->y += d->dy;
@ -127,7 +139,7 @@ static void resizeDrawList(void)
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "Resizing debris draw capacity: %d -> %d", drawCapacity, n);
debrisToDraw = resize(debrisToDraw, sizeof(Debris*) * drawCapacity, sizeof(Debris*) * n);
debrisToDraw = resize(debrisToDraw, sizeof(Debris *) * drawCapacity, sizeof(Debris *) * n);
drawCapacity = n;
}
@ -148,10 +160,10 @@ static void changeCourse(Debris *d)
void drawDebris(void)
{
int i;
int i;
Debris *d;
for (i = 0, d = debrisToDraw[i] ; d != NULL ; d = debrisToDraw[++i])
for (i = 0, d = debrisToDraw[i]; d != NULL; d = debrisToDraw[++i])
{
blitRotated(d->texture, d->x - battle.camera.x, d->y - battle.camera.y, d->angle);
}

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,18 +18,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
#define INITIAL_DEBRIS_DRAW_CAPACITY 32
#define MAX_DEBRIS_TEXTURES 6
extern void addDebrisFire(int x, int y);
extern void blitRotated(AtlasImage *atlasImage, int x, int y, float angle);
extern AtlasImage *getAtlasImage(char *filename);
extern int isOnBattleScreen(int x, int y, int w, int h);
extern float mod(float n, float x);
extern void *resize(void *array, int oldSize, int newSize);
extern Battle battle;
void destroyDebris(void);
void drawDebris(void);
void doDebris(void);
void addDebris(int x, int y, int amount);
void initDebris(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,18 +18,29 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/util.h"
#include "effects.h"
#define INITIAL_EFFECT_DRAW_CAPACITY 128
extern App app;
extern Battle battle;
extern Entity *self;
static void setRandomFlameHue(Effect *e);
static void setRandomShieldHue(Effect *e);
static void resizeDrawList(void);
static int pointOnScreen(float x, float y);
static int pointOnScreen(float x, float y);
static AtlasImage *explosionTexture;
static AtlasImage *shieldHitTexture;
static AtlasImage *haloTexture;
static Effect **effectsToDraw;
static int drawCapacity;
static Effect **effectsToDraw;
static int drawCapacity;
void initEffects(void)
{
@ -39,21 +50,21 @@ void initEffects(void)
drawCapacity = INITIAL_EFFECT_DRAW_CAPACITY;
effectsToDraw = malloc(sizeof(Effect*) * drawCapacity);
memset(effectsToDraw, 0, sizeof(Effect*) * drawCapacity);
effectsToDraw = malloc(sizeof(Effect *) * drawCapacity);
memset(effectsToDraw, 0, sizeof(Effect *) * drawCapacity);
}
void doEffects(void)
{
int i, onScreen;
int i, onScreen;
Effect *e;
Effect *prev = &battle.effectHead;
i = 0;
memset(effectsToDraw, 0, sizeof(Effect*) * drawCapacity);
memset(effectsToDraw, 0, sizeof(Effect *) * drawCapacity);
for (e = battle.effectHead.next ; e != NULL ; e = e->next)
for (e = battle.effectHead.next; e != NULL; e = e->next)
{
e->x += e->dx;
e->y += e->dy;
@ -123,19 +134,19 @@ static void resizeDrawList(void)
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "Resizing effect draw capacity: %d -> %d", drawCapacity, n);
effectsToDraw = resize(effectsToDraw, sizeof(Effect*) * drawCapacity, sizeof(Effect*) * n);
effectsToDraw = resize(effectsToDraw, sizeof(Effect *) * drawCapacity, sizeof(Effect *) * n);
drawCapacity = n;
}
void drawEffects(void)
{
int i;
int i;
Effect *e;
SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND);
for (i = 0, e = effectsToDraw[i] ; e != NULL ; e = effectsToDraw[++i])
for (i = 0, e = effectsToDraw[i]; e != NULL; e = effectsToDraw[++i])
{
SDL_SetRenderDrawColor(app.renderer, e->r, e->g, e->b, e->a);
@ -191,9 +202,9 @@ void drawShieldHitEffect(Entity *e)
void addBulletHitEffect(int x, int y, int r, int g, int b)
{
Effect *e;
int i;
int i;
for (i = 0 ; i < 4 ; i++)
for (i = 0; i < 4; i++)
{
e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect));
@ -271,10 +282,10 @@ void addDebrisFire(int x, int y)
void addSmallExplosion(void)
{
int i;
int i;
Effect *e;
for (i = 0 ; i < 32 ; i++)
for (i = 0; i < 32; i++)
{
e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect));
@ -302,7 +313,7 @@ void addSmallExplosion(void)
e->y -= e->size / 2;
}
for (i = 0 ; i < 96 ; i++)
for (i = 0; i < 96; i++)
{
e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect));
@ -326,10 +337,10 @@ void addSmallExplosion(void)
void addMineExplosion(void)
{
int i;
int i;
Effect *e;
for (i = 0 ; i < 64 ; i++)
for (i = 0; i < 64; i++)
{
e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect));
@ -376,10 +387,10 @@ void addMineExplosion(void)
void addLargeExplosion(void)
{
int i;
int i;
Effect *e;
for (i = 0 ; i < 64 ; i++)
for (i = 0; i < 64; i++)
{
e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect));
@ -430,10 +441,10 @@ void addLargeExplosion(void)
void addMissileExplosion(Bullet *b)
{
int i;
int i;
Effect *e;
for (i = 0 ; i < 8 ; i++)
for (i = 0; i < 8; i++)
{
e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect));
@ -461,7 +472,7 @@ void addMissileExplosion(Bullet *b)
e->y -= e->size / 2;
}
for (i = 0 ; i < 24 ; i++)
for (i = 0; i < 24; i++)
{
e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect));
@ -486,8 +497,8 @@ void addMissileExplosion(Bullet *b)
void addEngineEffect(void)
{
Effect *e;
float c, s;
int h;
float c, s;
int h;
e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect));
@ -585,10 +596,10 @@ void addMissileEngineEffect(Bullet *b)
void addShieldSplinterEffect(Entity *ent)
{
int i;
int i;
Effect *e;
for (i = 0 ; i < 48 ; i++)
for (i = 0; i < 48; i++)
{
e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect));
@ -612,10 +623,10 @@ void addShieldSplinterEffect(Entity *ent)
void addECMEffect(Entity *ent)
{
int i;
int i;
Effect *e;
for (i = 0 ; i < 3 ; i++)
for (i = 0; i < 3; i++)
{
e = malloc(sizeof(Effect));

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,17 +18,20 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#define INITIAL_EFFECT_DRAW_CAPACITY 128
extern void blitScaled(AtlasImage *atlasImage, int x, int y, int w, int h, int center);
extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
extern AtlasImage *getAtlasImage(char *name);
extern int isOnBattleScreen(int x, int y, int w, int h);
extern void *resize(void *array, int oldSize, int newSize);
extern void setAtlasColor(int r, int g, int b, int a);
extern App app;
extern Battle battle;
extern Entity *self;
void destroyEffects(void);
void addECMEffect(Entity *ent);
void addShieldSplinterEffect(Entity *ent);
void addMissileEngineEffect(Bullet *b);
void addLargeEngineEffect(void);
void addEngineEffect(void);
void addMissileExplosion(Bullet *b);
void addLargeExplosion(void);
void addMineExplosion(void);
void addSmallExplosion(void);
void addDebrisFire(int x, int y);
void addSmallFighterExplosion(void);
void addBulletHitEffect(int x, int y, int r, int g, int b);
void drawShieldHitEffect(Entity *e);
void drawEffects(void);
void doEffects(void);
void initEffects(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,29 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/capitalShips.h"
#include "../battle/effects.h"
#include "../battle/fighters.h"
#include "../battle/quadtree.h"
#include "../battle/rope.h"
#include "../game/trophies.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/lookup.h"
#include "entities.h"
#define DISABLED_GLOW_MAX 255
#define DISABLED_GLOW_MIN 128
#define DISABLED_GLOW_SPEED 3
extern App app;
extern Battle battle;
extern Dev dev;
extern Entity *player;
extern Entity *self;
static void drawEntity(Entity *e);
static void doEntity(void);
static void alignComponents(void);
@ -27,14 +48,14 @@ static void activateEpicFighters(int side);
static void restrictToBattleArea(Entity *e);
static void drawTargetRects(Entity *e);
static void drawHealthBar(Entity *e);
static int drawComparator(const void *a, const void *b);
static int drawComparator(const void *a, const void *b);
static void notifyNewArrivals(void);
static int isComponent(Entity *e);
static int isComponent(Entity *e);
static Entity deadHead;
static Entity deadHead;
static Entity *deadTail;
static int disabledGlow;
static int disabledGlowDir;
static int disabledGlow;
static int disabledGlowDir;
void initEntities(void)
{
@ -60,9 +81,9 @@ Entity *spawnEntity(void)
void doEntities(void)
{
int numAllies, numEnemies;
int numActiveAllies, numActiveEnemies;
int numSpawnedEnemies;
int numAllies, numEnemies;
int numActiveAllies, numActiveEnemies;
int numSpawnedEnemies;
Entity *e, *prev;
prev = &battle.entityHead;
@ -75,7 +96,7 @@ void doEntities(void)
player->shield = player->maxShield;
}
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
removeFromQuadtree(e, &battle.quadtree);
@ -178,7 +199,7 @@ void doEntities(void)
if (e->killedBy == player && battle.hasSuspicionLevel)
{
if (e->aiFlags & (AIF_AVOIDS_COMBAT|AIF_DEFENSIVE))
if (e->aiFlags & (AIF_AVOIDS_COMBAT | AIF_DEFENSIVE))
{
battle.suspicionLevel -= (MAX_SUSPICION_LEVEL * 0.5);
}
@ -349,10 +370,10 @@ static void doEntity(void)
static void alignComponents(void)
{
Entity *e;
float x, y;
float c, s;
float x, y;
float c, s;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (isComponent(e))
{
@ -387,17 +408,19 @@ static int isComponent(Entity *e)
void drawEntities(void)
{
int i;
int i;
Entity *e, **candidates;
candidates = getAllEntsWithin(battle.camera.x, battle.camera.y, app.winWidth, app.winHeight, NULL);
/* counting entities to draw */
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i]) {};
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
};
qsort(candidates, i, sizeof(Entity*), drawComparator);
qsort(candidates, i, sizeof(Entity *), drawComparator);
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
self = e;
@ -525,13 +548,13 @@ static void drawTargetRects(Entity *e)
void activateEntities(char *names)
{
Entity *e;
char *name;
char *name;
name = strtok(names, ";");
while (name)
{
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (strcmp(e->name, name) == 0)
{
@ -553,13 +576,13 @@ void activateEntities(char *names)
void activateEntityGroups(char *groupNames)
{
Entity *e;
char *groupName;
char *groupName;
groupName = strtok(groupNames, ";");
while (groupName)
{
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (strcmp(e->groupName, groupName) == 0)
{
@ -588,7 +611,7 @@ static void notifyNewArrivals(void)
{
Entity *e;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->active && (e->type == ET_FIGHTER || e->type == ET_CAPITAL_SHIP))
{
@ -601,7 +624,7 @@ static void activateEpicFighters(int side)
{
Entity *e;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (!e->active && e->type == ET_FIGHTER && !(e->flags & EF_NO_EPIC) && ((side == SIDE_ALLIES && e->side == SIDE_ALLIES) || (side != SIDE_ALLIES && e->side != SIDE_ALLIES)))
{
@ -626,7 +649,7 @@ void countNumEnemies(void)
{
Entity *e;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->side != SIDE_ALLIES && (e->type == ET_FIGHTER || e->type == ET_CAPITAL_SHIP) && (!(e->flags & EF_NO_THREAT)))
{
@ -641,7 +664,7 @@ void addAllToQuadtree(void)
{
Entity *e;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->active)
{
@ -652,8 +675,8 @@ void addAllToQuadtree(void)
static int drawComparator(const void *a, const void *b)
{
Entity *e1 = *((Entity**)a);
Entity *e2 = *((Entity**)b);
Entity *e1 = *((Entity **)a);
Entity *e2 = *((Entity **)b);
return e2->type - e1->type;
}
@ -662,7 +685,7 @@ void killEntity(char *name)
{
Entity *e;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (strcmp(e->name, name) == 0)
{
@ -679,11 +702,11 @@ void killEntity(char *name)
void updateEntitySide(char *sideStr, char *name)
{
Entity *e;
int side;
int side;
side = lookup(sideStr);
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (strcmp(e->name, name) == 0)
{
@ -701,7 +724,7 @@ void awardPandoranCraftTrophy(void)
{
Entity *e;
for (e = deadHead.next ; e != NULL ; e = e->next)
for (e = deadHead.next; e != NULL; e = e->next)
{
if (e->killedBy == player && e->side == SIDE_PANDORAN)
{

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,31 +18,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#define DISABLED_GLOW_MAX 255
#define DISABLED_GLOW_MIN 128
#define DISABLED_GLOW_SPEED 3
extern void addToQuadtree(Entity *e, Quadtree *root);
extern void awardTrophy(char *id);
extern void blitRotated(AtlasImage *atlasImage, int x, int y, float angle);
extern void cutRope(Entity *e);
extern void doCapitalShip(void);
extern void doFighter(void);
extern void doRope(Entity *e);
extern void drawRope(Entity *e);
extern void drawShieldHitEffect(Entity *e);
extern Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore);
extern int isOnBattleScreen(int x, int y, int w, int h);
extern long lookup(char *name);
extern void removeFromQuadtree(Entity *e, Quadtree *root);
extern void resetFighter(Entity *e);
extern void setAtlasColor(int r, int g, int b, int a);
extern void updateCapitalShipComponentProperties(Entity *parent, long flags);
extern App app;
extern Battle battle;
extern Dev dev;
extern Entity *player;
extern Entity *self;
void destroyEntities(void);
void awardPandoranCraftTrophy(void);
void updateEntitySide(char *sideStr, char *name);
void killEntity(char *name);
void addAllToQuadtree(void);
void countNumEnemies(void);
void activateEntityGroups(char *groupNames);
void activateEntities(char *names);
void drawEntities(void);
void doEntities(void);
Entity *spawnEntity(void);
void initEntities(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,21 +18,46 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/ai.h"
#include "../battle/debris.h"
#include "../battle/effects.h"
#include "../battle/entities.h"
#include "../battle/hud.h"
#include "../battle/items.h"
#include "../battle/objectives.h"
#include "../battle/quadtree.h"
#include "../battle/rope.h"
#include "../battle/script.h"
#include "../galaxy/mission.h"
#include "../json/cJSON.h"
#include "../system/atlas.h"
#include "../system/io.h"
#include "../system/lookup.h"
#include "../system/sound.h"
#include "../system/util.h"
#include "fighters.h"
static void separate(void);
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);
static void loadFighterDefList(char *filename);
extern Battle battle;
extern Colors colors;
extern Entity *player;
extern Entity *self;
extern Game game;
static void separate(void);
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);
static void loadFighterDefList(char *filename);
static Entity *getFighterDef(char *name);
static void addFighterStat(char *name);
static void incFighterStat(char *key);
static void addFighterStat(char *name);
static void incFighterStat(char *key);
static Entity defHead, *defTail;
@ -151,7 +176,7 @@ static void randomizeDartGuns(Entity *dart)
dart->guns[0].type = BT_PLASMA;
dart->guns[0].x = dart->guns[0].y = 0;
for (i = 1 ; i < MAX_FIGHTER_GUNS ; i++)
for (i = 1; i < MAX_FIGHTER_GUNS; i++)
{
if (dart->guns[i].type)
{
@ -172,7 +197,6 @@ static void randomizeDartGuns(Entity *dart)
dart->guns[2].y = -10;
break;
/* Plasma / Laser cannons */
case 3:
dart->guns[0].type = BT_PLASMA;
@ -385,12 +409,12 @@ void doFighter(void)
static void separate(void)
{
int angle;
int distance;
float dx, dy, force;
int count;
int angle;
int distance;
float dx, dy, force;
int count;
Entity *e, **candidates;
int i;
int i;
dx = dy = 0;
count = 0;
@ -398,7 +422,7 @@ static void separate(void)
candidates = getAllEntsInRadius(self->x, self->y, self->separationRadius, self);
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if ((e->flags & EF_TAKES_DAMAGE) && (!(e->flags & EF_NON_SOLID)))
{
@ -683,7 +707,7 @@ void retreatEnemies(void)
{
Entity *e;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->type == ET_FIGHTER && e->side != player->side)
{
@ -708,7 +732,7 @@ void retreatAllies(void)
{
Entity *e;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->type == ET_FIGHTER && e->side == player->side)
{
@ -735,7 +759,7 @@ static Entity *getFighterDef(char *name)
{
Entity *e;
for (e = defHead.next ; e != NULL ; e = e->next)
for (e = defHead.next; e != NULL; e = e->next)
{
if (strcmp(e->name, name) == 0)
{
@ -750,11 +774,11 @@ static Entity *getFighterDef(char *name)
Entity **getDBFighters(int *num)
{
Entity *e, **dbFighters;
int i;
int i;
i = *num = 0;
for (e = defHead.next ; e != NULL ; e = e->next)
for (e = defHead.next; e != NULL; e = e->next)
{
if (e->description != NULL)
{
@ -762,9 +786,9 @@ Entity **getDBFighters(int *num)
}
}
dbFighters = malloc(sizeof(Entity*) * *num);
dbFighters = malloc(sizeof(Entity *) * *num);
for (e = defHead.next ; e != NULL ; e = e->next)
for (e = defHead.next; e != NULL; e = e->next)
{
if (e->description != NULL)
{
@ -790,12 +814,12 @@ void loadFighterDefs(void)
static void loadFighterDefList(char *dir)
{
char **filenames;
char path[MAX_FILENAME_LENGTH];
int count, i;
char path[MAX_FILENAME_LENGTH];
int count, i;
filenames = getFileList(dir, &count);
for (i = 0 ; i < count ; i++)
for (i = 0; i < count; i++)
{
sprintf(path, "%s/%s", dir, filenames[i]);
@ -809,10 +833,10 @@ static void loadFighterDefList(char *dir)
static void loadFighterDef(char *filename)
{
cJSON *root, *node;
char *text;
cJSON *root, *node;
char *text;
Entity *e;
int i, len;
int i, len;
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename);
@ -854,7 +878,7 @@ static void loadFighterDef(char *filename)
{
i = 0;
for (node = cJSON_GetObjectItem(root, "guns")->child ; node != NULL ; node = node->next)
for (node = cJSON_GetObjectItem(root, "guns")->child; node != NULL; node = node->next)
{
e->guns[i].type = lookup(cJSON_GetObjectItem(node, "type")->valuestring);
e->guns[i].x = cJSON_GetObjectItem(node, "x")->valueint;
@ -916,7 +940,7 @@ static void addFighterStat(char *key)
tail = &game.fighterStatHead;
for (t = game.fighterStatHead.next ; t != NULL ; t = t->next)
for (t = game.fighterStatHead.next; t != NULL; t = t->next)
{
if (strcmp(t->key, key) == 0)
{
@ -940,7 +964,7 @@ static void incFighterStat(char *key)
{
Tuple *t;
for (t = game.fighterStatHead.next ; t != NULL ; t = t->next)
for (t = game.fighterStatHead.next; t != NULL; t = t->next)
{
if (strcmp(t->key, key) == 0)
{
@ -953,11 +977,11 @@ static void incFighterStat(char *key)
void loadFighters(cJSON *node)
{
Entity *e;
char **types, *name, *groupName, *type, *strpos;
int side, scatter, number, active;
int i, numTypes, addFlags, addAIFlags, id;
long flags, aiFlags;
float x, y;
char **types, *name, *groupName, *type, *strpos;
int side, scatter, number, active;
int i, numTypes, addFlags, addAIFlags, id;
long flags, aiFlags;
float x, y;
if (node)
{
@ -992,7 +1016,7 @@ void loadFighters(cJSON *node)
aiFlags = flagsToLong(cJSON_GetObjectItem(node, "aiFlags")->valuestring, &addAIFlags);
}
for (i = 0 ; i < number ; i++)
for (i = 0; i < number; i++)
{
type = types[rand() % numTypes];
@ -1060,7 +1084,7 @@ void loadFighters(cJSON *node)
node = node->next;
for (i = 0 ; i < numTypes ; i++)
for (i = 0; i < numTypes; i++)
{
free(types[i]);
}

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,42 +18,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
extern void addDebris(int x, int y, int amount);
extern void addEngineEffect(void);
extern void addHudMessage(SDL_Color c, char *format, ...);
extern void addRandomItem(int x, int y);
extern void addShieldSplinterEffect(Entity *ent);
extern void addSmallExplosion(void);
extern void addSmallFighterExplosion(void);
extern void adjustObjectiveTargetValue(char *name, int type, int amount);
extern void attachRope(void);
extern void checkSuspicionLevel(void);
extern void checkZackariaSuspicionLevel(void);
extern void completeMission(void);
extern void doAI(void);
extern long flagsToLong(char *flags, int *add);
extern Entity **getAllEntsInRadius(int x, int y, int radius, Entity *ignore);
extern float getAngle(int x1, int y1, int x2, int y2);
extern AtlasImage *getAtlasImage(char *filename);
extern int getDistance(int x1, int y1, int x2, int y2);
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 long lookup(char *name);
extern void playBattleSound(int id, int x, int y);
extern char *readFile(char *filename);
extern void runScriptFunction(char *format, ...);
extern Entity *spawnEntity(void);
extern char **toTypeArray(char *types, int *numTypes);
extern void updateCondition(char *name, int type);
extern void updateObjective(char *name, int type);
extern Battle battle;
extern Colors colors;
extern Entity *player;
extern Entity *self;
extern Game game;
void destroyFighterStats(void);
void destroyFighterDefs(void);
void loadFighters(struct cJSON *node);
void loadFighterDefs(void);
Entity **getDBFighters(int *num);
void retreatAllies(void);
void retreatEnemies(void);
void damageFighter(Entity *e, int amount, long flags);
void applyFighterBrakes(void);
void applyFighterThrust(void);
void doFighter(void);
void resetFighter(Entity *fighter);
Entity *spawnFighter(char *name, int x, int y, int side);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,25 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/jumpgate.h"
#include "../battle/player.h"
#include "../battle/radar.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/text.h"
#include "../system/util.h"
#include "hud.h"
#define MAX_HUD_MESSAGES 6
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *player;
extern Game game;
static void drawPlayerTargeter(void);
static void drawNumFighters(void);
static void drawHealthBars(void);
@ -34,7 +51,7 @@ static void drawHealthShieldBar(int current, int max, int x, int y, int r, int g
static void drawSuspicionLevel(void);
static void drawMissileWarning(void);
static HudMessage hudMessageHead;
static HudMessage hudMessageHead;
static HudMessage *hudMessageTail;
static AtlasImage *targetPointer;
static AtlasImage *targetCircle;
@ -48,21 +65,21 @@ static AtlasImage *boost;
static AtlasImage *nextGun;
static AtlasImage *clockIcon;
static AtlasImage *objectives;
static int numMessages;
static int numMessages;
static const char *gunName[BT_MAX];
static char *MISSILES_TEXT;
static char *TARGET_TEXT;
static char *NONE_TEXT;
static char *COMBINED_TEXT;
static char *SYSTEM_POWER_TEXT;
static char *LEADER_DIST_TEXT;
static char *TARGET_DIST_TEXT;
static char *OBJECTIVE_DIST_TEXT;
static char *JUMPGATE_DIST_TEXT;
static char *NEW_FIGHTER_TEXT;
static char *SUSPICION_TEXT;
static char *REMAINING_PILOTS_TEXT;
static char *WARNING_TEXT;
static char *MISSILES_TEXT;
static char *TARGET_TEXT;
static char *NONE_TEXT;
static char *COMBINED_TEXT;
static char *SYSTEM_POWER_TEXT;
static char *LEADER_DIST_TEXT;
static char *TARGET_DIST_TEXT;
static char *OBJECTIVE_DIST_TEXT;
static char *JUMPGATE_DIST_TEXT;
static char *NEW_FIGHTER_TEXT;
static char *SUSPICION_TEXT;
static char *REMAINING_PILOTS_TEXT;
static char *WARNING_TEXT;
void initHud(void)
{
@ -113,7 +130,7 @@ void doHud(void)
prev = &hudMessageHead;
for (hudMessage = hudMessageHead.next ; hudMessage != NULL ; hudMessage = hudMessage->next)
for (hudMessage = hudMessageHead.next; hudMessage != NULL; hudMessage = hudMessage->next)
{
hudMessage->life--;
@ -203,7 +220,7 @@ void drawHud(void)
static void drawHealthBars(void)
{
float p;
int r, g, b;
int r, g, b;
r = g = b = 0;
p = player->health;
@ -235,7 +252,7 @@ static void drawHealthBars(void)
static void drawHealthShieldBar(int current, int max, int x, int y, int r, int g, int b, int flashLow)
{
SDL_Rect rect;
float percent = 0;
float percent = 0;
if (max > 0)
{
@ -332,7 +349,7 @@ static void drawWeaponInfo(void)
{
y = 70;
for (i = 0 ; i < BT_MAX ; i++)
for (i = 0; i < BT_MAX; i++)
{
if (playerHasGun(i))
{
@ -367,7 +384,7 @@ static void drawWeaponInfo(void)
static void drawPlayerTargeter(void)
{
float angle;
int x, y;
int x, y;
if (player->target || battle.missionTarget || jumpgateEnabled() || battle.messageSpeaker)
{
@ -543,7 +560,7 @@ static float distanceToKM(int x1, int y1, int x2, int y2)
static void drawDistancesInfo(void)
{
int y;
int y;
float distance;
y = 11;
@ -599,9 +616,9 @@ static void drawDistancesInfo(void)
static void drawHudMessages(void)
{
HudMessage *hudMessage;
int y = app.winHeight - 25;
int y = app.winHeight - 25;
for (hudMessage = hudMessageHead.next ; hudMessage != NULL ; hudMessage = hudMessage->next)
for (hudMessage = hudMessageHead.next; hudMessage != NULL; hudMessage = hudMessage->next)
{
drawText(10, y, 14, TA_LEFT, hudMessage->color, hudMessage->message);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,26 +18,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#define MAX_HUD_MESSAGES 6
extern void blit(AtlasImage *atlasImage, int x, int y, int center);
extern void blitRotated(AtlasImage *atlasImage, int x, int y, float angle);
extern void drawRadar(void);
extern void drawRadarRangeWarning(void);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern float getAngle(int x1, int y1, int x2, int y2);
extern AtlasImage *getAtlasImage(char *filename);
extern int getDistance(int x1, int y1, int x2, int y2);
extern int getPercent(float current, float total);
extern int jumpgateEnabled(void);
extern int playerHasGun(int type);
extern void setAtlasColor(int r, int g, int b, int a);
extern char *timeToString(long millis, int showHours);
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *player;
extern Game game;
void resetHud(void);
void drawHud(void);
void addHudMessage(SDL_Color c, char *format, ...);
void doHud(void);
void initHud(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,17 +18,34 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/entities.h"
#include "../battle/hud.h"
#include "../battle/objectives.h"
#include "../battle/quadtree.h"
#include "../json/cJSON.h"
#include "../system/atlas.h"
#include "../system/io.h"
#include "../system/lookup.h"
#include "../system/sound.h"
#include "../system/util.h"
#include "items.h"
static void action(void);
extern Battle battle;
extern Colors colors;
extern Entity *player;
extern Entity *self;
static void action(void);
static Entity *getItemDef(char *name);
static Entity defHead, *defTail;
void loadItemDefs(void)
{
cJSON *root, *node;
char *text;
cJSON *root, *node;
char *text;
Entity *e;
text = readFile("data/battle/items.json");
@ -38,7 +55,7 @@ void loadItemDefs(void)
memset(&defHead, 0, sizeof(Entity));
defTail = &defHead;
for (node = root->child ; node != NULL ; node = node->next)
for (node = root->child; node != NULL; node = node->next)
{
e = malloc(sizeof(Entity));
memset(e, 0, sizeof(Entity));
@ -76,7 +93,7 @@ Entity *spawnItem(char *name)
}
else
{
for (e = defHead.next ; e != NULL ; e = e->next)
for (e = defHead.next; e != NULL; e = e->next)
{
if (!def || rand() % 2)
{
@ -113,7 +130,7 @@ static Entity *getItemDef(char *defName)
{
Entity *e;
for (e = defHead.next ; e != NULL ; e = e->next)
for (e = defHead.next; e != NULL; e = e->next)
{
if (strcmp(e->defName, defName) == 0)
{
@ -128,11 +145,11 @@ static Entity *getItemDef(char *defName)
static void action(void)
{
Entity *e, **candidates;
int i;
int i;
candidates = getAllEntsInRadius(self->x, self->y, MAX(self->w, self->h), self);
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if (e->alive == ALIVE_ALIVE && (e->flags & EF_COLLECTS_ITEMS) && collision(self->x - (self->w / 2), self->y - (self->h / 2), self->w, self->h, e->x - (e->w / 2), e->y - (e->h / 2), e->w, e->h))
{
@ -159,10 +176,10 @@ 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;
char *name, *groupName, *type;
int i, scatter, number, active, addFlags;
long flags;
float x, y;
flags = -1;
scatter = 1;
@ -190,7 +207,7 @@ void loadItems(cJSON *node)
flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags);
}
for (i = 0 ; i < number ; i++)
for (i = 0; i < number; i++)
{
e = spawnItem(type);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,23 +18,8 @@ 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 int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
extern long flagsToLong(char *flags, int *add);
extern Entity **getAllEntsInRadius(int x, int y, int radius, Entity *ignore);
extern AtlasImage *getAtlasImage(char *filename);
extern int getJSONValue(cJSON *node, char *name, int defValue);
extern char *getJSONValueStr(cJSON *node, char *name, char *defValue);
extern void playBattleSound(int id, int x, int y);
extern char *readFile(char *filename);
extern Entity *spawnEntity(void);
extern void updateObjective(char *name, int type);
extern Battle battle;
extern Colors colors;
extern Entity *player;
extern Entity *self;
void destroyItemDefs(void);
void loadItems(struct cJSON *node);
void addRandomItem(int x, int y);
Entity *spawnItem(char *name);
void loadItemDefs(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,25 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/debris.h"
#include "../battle/effects.h"
#include "../battle/entities.h"
#include "../battle/objectives.h"
#include "../battle/quadtree.h"
#include "../battle/script.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/sound.h"
#include "../system/util.h"
#include "jumpgate.h"
#define ESCAPE_DISTANCE 256
extern Battle battle;
extern Entity *self;
static void think(void);
static void draw(void);
static void handleFleeingEntities(void);
@ -28,7 +45,7 @@ static void addNodes(Entity *jumpgate, long flags);
static void nodeDie(void);
static AtlasImage *portal;
static float portalAngle;
static float portalAngle;
Entity *spawnJumpgate(int side, long flags)
{
@ -47,7 +64,7 @@ Entity *spawnJumpgate(int side, long flags)
jumpgate->action = think;
jumpgate->draw = draw;
jumpgate->side = side;
jumpgate->flags = EF_NO_MT_BOX+EF_IMMORTAL+EF_AI_IGNORE+EF_NON_SOLID+EF_NO_HEALTH_BAR;
jumpgate->flags = EF_NO_MT_BOX + EF_IMMORTAL + EF_AI_IGNORE + EF_NON_SOLID + EF_NO_HEALTH_BAR;
if (flags != -1 && flags & EF_DISABLED)
{
@ -69,13 +86,13 @@ Entity *spawnJumpgate(int side, long flags)
static void addNodes(Entity *jumpgate, long flags)
{
Entity *node;
Entity *node;
AtlasImage *nodeTexture;
int i;
int i;
nodeTexture = getAtlasImage("gfx/entities/jumpgateNode.png");
for (i = 0 ; i < 360 ; i += 36)
for (i = 0; i < 360; i += 36)
{
node = spawnEntity();
STRNCPY(node->name, _("Jumpgate System Node"), MAX_NAME_LENGTH);
@ -86,7 +103,7 @@ static void addNodes(Entity *jumpgate, long flags)
node->owner = jumpgate;
node->side = jumpgate->side;
node->texture = nodeTexture;
node->flags = EF_TAKES_DAMAGE+EF_AI_IGNORE;
node->flags = EF_TAKES_DAMAGE + EF_AI_IGNORE;
node->die = nodeDie;
node->w = node->texture->rect.w;
node->h = node->texture->rect.h;
@ -136,7 +153,7 @@ void activateJumpgate(int activate)
if (battle.jumpgate && battle.jumpgate->health > 1)
{
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e == battle.jumpgate || e->owner == battle.jumpgate)
{
@ -180,11 +197,11 @@ static void think(void)
static void handleFleeingEntities(void)
{
Entity *e, **candidates;
int i;
int i;
candidates = getAllEntsInRadius(self->x, self->y, ESCAPE_DISTANCE * 2, self);
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if (e->health > 0 && (e->flags & EF_RETREATING) && getDistance(self->x, self->y, e->x, e->y) <= ESCAPE_DISTANCE)
{
@ -200,11 +217,11 @@ static void handleFleeingEntities(void)
static void addEscapeEffect(Entity *ent)
{
Effect *e;
int i, n, speed;
int i, n, speed;
n = ent->w * ent->h;
for (i = 0 ; i < n ; i++)
for (i = 0; i < n; i++)
{
e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect));

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,21 +18,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#define ESCAPE_DISTANCE 256
extern void addDebris(int x, int y, int amount);
extern void addSmallExplosion(void);
extern void blitRotated(AtlasImage *atlasImage, int x, int y, float angle);
extern Entity **getAllEntsInRadius(int x, int y, int radius, Entity *ignore);
extern AtlasImage *getAtlasImage(char *filename);
extern int getDistance(int x1, int y1, int x2, int y2);
extern void playBattleSound(int id, int x, int y);
extern void runScriptFunction(char *format, ...);
extern Entity *spawnEntity(void);
extern void updateCondition(char *name, int type);
extern void updateObjective(char *name, int type);
extern Battle battle;
extern Entity *self;
void activateJumpgate(int activate);
int jumpgateEnabled(void);
Entity *spawnJumpgate(int side, long flags);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,15 +18,24 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/script.h"
#include "../json/cJSON.h"
#include "../system/draw.h"
#include "../system/util.h"
#include "locations.h"
extern Battle battle;
extern Entity *player;
void doLocations(void)
{
Location *l, *prev;
prev = &battle.locationHead;
for (l = battle.locationHead.next ; l != NULL ; l = l->next)
for (l = battle.locationHead.next; l != NULL; l = l->next)
{
if (l->active && getDistance(player->x, player->y, l->x, l->y) <= l->size)
{
@ -45,7 +54,7 @@ void drawLocations(void)
{
Location *l;
for (l = battle.locationHead.next ; l != NULL ; l = l->next)
for (l = battle.locationHead.next; l != NULL; l = l->next)
{
if (l->active)
{
@ -56,14 +65,14 @@ void drawLocations(void)
void activateLocations(char *locations)
{
char *token;
char *token;
Location *l;
token = strtok(locations, ";");
while (token)
{
for (l = battle.locationHead.next ; l != NULL ; l = l->next)
for (l = battle.locationHead.next; l != NULL; l = l->next)
{
if (strcmp(token, l->name) == 0)
{
@ -81,9 +90,9 @@ void activateLocations(char *locations)
void createChristabelLocation(void)
{
Location *l;
Entity *e;
Entity *e;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (strcmp(e->name, "Christabel") == 0)
{
@ -108,7 +117,7 @@ void createChristabelLocation(void)
void loadLocations(cJSON *node)
{
int active;
int active;
Location *l;
if (node)
@ -131,7 +140,6 @@ void loadLocations(cJSON *node)
l->x += (SCREEN_WIDTH / 2);
l->y += (SCREEN_HEIGHT / 2);
node = node->next;
}
}

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,14 +18,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
extern void drawCircle(int cx, int cy, int radius, int r, int g, int b, int a);
extern int getDistance(int x1, int y1, int x2, int y2);
extern int getJSONValue(cJSON *node, char *name, int defValue);
extern void runScriptFunction(char *format, ...);
extern Battle battle;
extern Entity *player;
void loadLocations(struct cJSON *node);
void createChristabelLocation(void);
void activateLocations(char *locations);
void drawLocations(void);
void doLocations(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,14 +18,25 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../system/sound.h"
#include "../system/text.h"
#include "messageBox.h"
#define MSG_BOX_TEXT_WIDTH 600
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *player;
static void calculateMessageBoxHeight(MessageBox *msg);
static void nextMessage(void);
static MessageBox head;
static MessageBox head;
static MessageBox *tail;
static Entity *lastWingmate;
static Entity *lastWingmate;
void initMessageBox(void)
{
@ -38,8 +49,8 @@ void initMessageBox(void)
void addMessageBox(char *title, char *body, int type)
{
MessageBox *msg;
int isFirst;
float time;
int isFirst;
float time;
isFirst = (tail == &head);
@ -119,7 +130,7 @@ int showingMessageBoxes(void)
void drawMessageBox(void)
{
MessageBox *msg = head.next;
SDL_Rect r;
SDL_Rect r;
if (msg && msg->time > 0)
{
@ -173,7 +184,7 @@ void drawMessageBox(void)
static void nextMessage(void)
{
Entity *e, *wingmate;
int isWingmate;
int isWingmate;
wingmate = NULL;
@ -181,7 +192,7 @@ static void nextMessage(void)
playSound(SND_RADIO);
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->active && e != player)
{
@ -191,7 +202,7 @@ static void nextMessage(void)
return;
}
if (isWingmate && e->side == player->side && e->type == ET_FIGHTER && e->speed > 0)
if (isWingmate && e->side == player->side && e->type == ET_FIGHTER && e->speed > 0)
{
wingmate = e;

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,16 +18,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#define MSG_BOX_TEXT_WIDTH 600
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern int getWrappedTextHeight(char *text, int size);
extern void playSound(int sound);
extern void useFont(char *name);
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *player;
void resetMessageBox(void);
void drawMessageBox(void);
int showingMessageBoxes(void);
void doMessageBox(void);
void addMessageBox(char *title, char *body, int type);
void initMessageBox(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,28 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/effects.h"
#include "../battle/entities.h"
#include "../battle/fighters.h"
#include "../battle/objectives.h"
#include "../battle/quadtree.h"
#include "../battle/script.h"
#include "../game/trophies.h"
#include "../system/atlas.h"
#include "../system/sound.h"
#include "../system/util.h"
#include "mine.h"
#define DAMAGE_RANGE 250
#define SYSTEM_POWER 50
#define TRIGGER_RANGE 150
extern Battle battle;
extern Entity *player;
extern Entity *self;
static void think(void);
static void die(void);
static void lookForFighters(void);
@ -49,7 +69,7 @@ Entity *spawnMine(int type)
mine->texture = (type == ET_MINE) ? mineNormal : shadowMine;
mine->action = think;
mine->die = die;
mine->flags = EF_TAKES_DAMAGE+EF_NO_PLAYER_TARGET+EF_SHORT_RADAR_RANGE+EF_NON_SOLID+EF_NO_HEALTH_BAR;
mine->flags = EF_TAKES_DAMAGE + EF_NO_PLAYER_TARGET + EF_SHORT_RADAR_RANGE + EF_NON_SOLID + EF_NO_HEALTH_BAR;
if (type == ET_SHADOW_MINE)
{
@ -98,11 +118,11 @@ static void think(void)
static void lookForFighters(void)
{
Entity *e, **candidates;
int i;
int i;
candidates = getAllEntsInRadius(self->x, self->y, DAMAGE_RANGE, self);
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if (e->side != self->side && e->health > 0 && e->type == ET_FIGHTER && getDistance(self->x, self->y, e->x, e->y) <= TRIGGER_RANGE)
{
@ -123,7 +143,7 @@ static void lookForFighters(void)
static void lookForPlayer(void)
{
float dx, dy, norm;
int distance;
int distance;
if (player->alive == ALIVE_ALIVE)
{
@ -197,14 +217,14 @@ static void die(void)
static void doSplashDamage(void)
{
Entity *e, **candidates;
int i, dist, kills;
float damage, percent;
int i, dist, kills;
float damage, percent;
candidates = getAllEntsInRadius(self->x, self->y, DAMAGE_RANGE, self);
kills = 0;
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if (e->health > 0 && (e->type == ET_FIGHTER || e->type == ET_MINE) && !(e->flags & EF_IMMORTAL))
{

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,23 +18,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#define DAMAGE_RANGE 250
#define SYSTEM_POWER 50
#define TRIGGER_RANGE 150
extern void addMineExplosion(void);
extern void awardTrophy(char *id);
extern void damageFighter(Entity *e, int amount, long flags);
extern Entity **getAllEntsInRadius(int x, int y, int radius, Entity *ignore);
extern AtlasImage *getAtlasImage(char *filename);
extern int getDistance(int x1, int y1, int x2, int y2);
extern void playBattleSound(int id, int x, int y);
extern void runScriptFunction(const char *format, ...);
extern Entity *spawnEntity(void);
extern void updateObjective(char *name, int type);
extern Battle battle;
extern Entity *player;
extern Entity *self;
Entity *spawnMine(int type);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,21 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../challenges/challenges.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/text.h"
#include "../system/util.h"
#include "../system/widgets.h"
#include "missionInfo.h"
extern App app;
extern Battle battle;
extern Colors colors;
extern Game game;
static void drawMissionSummary(AtlasImage *title);
static void drawObjectives(void);
static void drawChallenges(void);
@ -30,9 +43,9 @@ static AtlasImage *missionCompleteTexture;
static AtlasImage *missionFailedTexture;
static AtlasImage *timeUpTexture;
static const char *objectiveStatus[OS_MAX];
static char *OBJECTIVES_TEXT;
static char *NONE_TEXT;
static char *TIME_LIMIT_TEXT;
static char *OBJECTIVES_TEXT;
static char *NONE_TEXT;
static char *TIME_LIMIT_TEXT;
void initMissionInfo(void)
{
@ -126,14 +139,14 @@ static void drawMissionSummary(AtlasImage *header)
static void drawObjectives(void)
{
Objective *o;
SDL_Color color;
int y = 215;
SDL_Color color;
int y = 215;
drawText(UI_WIDTH / 2, y, 28, TA_CENTER, colors.white, OBJECTIVES_TEXT);
y += 10;
for (o = battle.objectiveHead.next ; o != NULL ; o = o->next)
for (o = battle.objectiveHead.next; o != NULL; o = o->next)
{
if (o->active)
{
@ -177,24 +190,24 @@ static void drawObjectives(void)
static void drawChallenges(void)
{
int i;
int i;
Challenge *c;
char *challengeStatus;
SDL_Color color;
int y = 215;
char *challengeStatus;
SDL_Color color;
int y = 215;
drawText(UI_WIDTH / 2, y, 24, TA_CENTER, colors.white, game.currentMission->description);
if (battle.status == MS_START && game.currentMission->challengeData.timeLimit)
{
y+= 50;
y += 50;
drawText(UI_WIDTH / 2, y, 20, TA_CENTER, colors.white, TIME_LIMIT_TEXT, timeToString(game.currentMission->challengeData.timeLimit, 0));
}
y += 25;
for (i = 0 ; i < MAX_CHALLENGES ; i++)
for (i = 0; i < MAX_CHALLENGES; i++)
{
c = game.currentMission->challengeData.challenges[i];
@ -212,7 +225,7 @@ static void drawChallenges(void)
challengeStatus = _("Complete");
}
else if (battle.status == MS_COMPLETE ||battle.status == MS_FAILED)
else if (battle.status == MS_COMPLETE || battle.status == MS_FAILED)
{
color = colors.red;
@ -224,4 +237,3 @@ static void drawChallenges(void)
}
}
}

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,17 +18,5 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
extern void blit(AtlasImage *atlasImage, int x, int y, int center);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern void drawWidgets(char *groupName);
extern AtlasImage *getAtlasImage(char *filename);
extern char *getChallengeDescription(Challenge *c);
extern void setAtlasColor(int r, int g, int b, int a);
extern char *timeToString(long millis, int showHours);
extern App app;
extern Battle battle;
extern Colors colors;
extern Game game;
void drawMissionInfo(void);
void initMissionInfo(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,21 +18,33 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/hud.h"
#include "../battle/script.h"
#include "../galaxy/mission.h"
#include "../json/cJSON.h"
#include "../system/lookup.h"
#include "../system/sound.h"
#include "../system/util.h"
#include "objectives.h"
extern Battle battle;
extern Colors colors;
static int fireObjectivesComplete;
void doObjectives(void)
{
int objectiveFailed;
int hasHidden;
int objectiveFailed;
int hasHidden;
Objective *o;
battle.numObjectivesComplete = battle.numObjectivesTotal = battle.numConditions = 0;
objectiveFailed = 0;
hasHidden = 0;
for (o = battle.objectiveHead.next ; o != NULL ; o = o->next)
for (o = battle.objectiveHead.next; o != NULL; o = o->next)
{
if (o->active)
{
@ -105,7 +117,7 @@ void doObjectives(void)
void updateObjective(char *name, int type)
{
Objective *o;
int completed, hasHidden;
int completed, hasHidden;
if (strlen(name))
{
@ -113,7 +125,7 @@ void updateObjective(char *name, int type)
hasHidden = 0;
for (o = battle.objectiveHead.next ; o != NULL ; o = o->next)
for (o = battle.objectiveHead.next; o != NULL; o = o->next)
{
if (o->active && o->status != OS_COMPLETE)
{
@ -167,7 +179,7 @@ void adjustObjectiveTargetValue(char *name, int type, int amount)
{
Objective *o;
for (o = battle.objectiveHead.next ; o != NULL ; o = o->next)
for (o = battle.objectiveHead.next; o != NULL; o = o->next)
{
if (o->active && !o->isCondition && o->targetType == type && o->currentValue < o->targetValue && strcmp(o->targetName, name) == 0)
{
@ -192,7 +204,7 @@ void updateCondition(char *name, int type)
if (strlen(name))
{
for (o = battle.objectiveHead.next ; o != NULL ; o = o->next)
for (o = battle.objectiveHead.next; o != NULL; o = o->next)
{
if (o->active && o->isCondition && o->targetType == type && o->currentValue < o->targetValue && strcmp(o->targetName, name) == 0)
{
@ -217,7 +229,7 @@ void completeAllObjectives(void)
{
Objective *o;
for (o = battle.objectiveHead.next ; o != NULL ; o = o->next)
for (o = battle.objectiveHead.next; o != NULL; o = o->next)
{
o->status = OS_COMPLETE;
}
@ -227,7 +239,7 @@ void completeConditions(void)
{
Objective *o;
for (o = battle.objectiveHead.next ; o != NULL ; o = o->next)
for (o = battle.objectiveHead.next; o != NULL; o = o->next)
{
if (o->isCondition)
{
@ -238,12 +250,11 @@ void completeConditions(void)
}
}
void failIncompleteObjectives(void)
{
Objective *o;
for (o = battle.objectiveHead.next ; o != NULL ; o = o->next)
for (o = battle.objectiveHead.next; o != NULL; o = o->next)
{
if (o->status != OS_COMPLETE)
{
@ -254,9 +265,9 @@ void failIncompleteObjectives(void)
void activateObjectives(char *objectives)
{
char *token;
char *token;
Objective *o;
int activated;
int activated;
activated = 0;
@ -264,7 +275,7 @@ void activateObjectives(char *objectives)
while (token)
{
for (o = battle.objectiveHead.next ; o != NULL ; o = o->next)
for (o = battle.objectiveHead.next; o != NULL; o = o->next)
{
if (strcmp(token, o->id) == 0)
{
@ -333,7 +344,7 @@ void loadObjectives(cJSON *node)
void addEpicLivesObjective(void)
{
Objective *o;
char id[MAX_DESCRIPTION_LENGTH];
char id[MAX_DESCRIPTION_LENGTH];
o = malloc(sizeof(Objective));
memset(o, 0, sizeof(Objective));
@ -354,7 +365,7 @@ void addEpicLivesObjective(void)
void addEpicKillsObjective(void)
{
Objective *o;
char id[MAX_DESCRIPTION_LENGTH];
char id[MAX_DESCRIPTION_LENGTH];
o = malloc(sizeof(Objective));
memset(o, 0, sizeof(Objective));

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,16 +18,14 @@ 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 completeMission(void);
extern void failMission(void);
extern int getJSONValue(cJSON *node, char *name, int defValue);
extern long lookup(char *name);
extern void playSound(int id);
extern void runScriptFunction(char *format, ...);
extern Battle battle;
extern Colors colors;
void addEpicKillsObjective(void);
void addEpicLivesObjective(void);
void loadObjectives(struct cJSON *node);
void activateObjectives(char *objectives);
void failIncompleteObjectives(void);
void completeConditions(void);
void completeAllObjectives(void);
void updateCondition(char *name, int type);
void adjustObjectiveTargetValue(char *name, int type, int amount);
void updateObjective(char *name, int type);
void doObjectives(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,33 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/bullets.h"
#include "../battle/effects.h"
#include "../battle/fighters.h"
#include "../battle/hud.h"
#include "../battle/objectives.h"
#include "../galaxy/mission.h"
#include "../game/trophies.h"
#include "../json/cJSON.h"
#include "../system/controls.h"
#include "../system/lookup.h"
#include "../system/sound.h"
#include "../system/util.h"
#include "player.h"
#define MAX_SELECTABLE_PLAYERS 8
#define MAX_SELECTABLE_TARGETS 8
extern App app;
extern Battle battle;
extern Colors colors;
extern Dev dev;
extern Entity *player;
extern Entity *self;
extern Game game;
static void selectTarget(void);
static void switchGuns(void);
static void cycleRadarZoom(void);
@ -34,15 +59,15 @@ static void faceMouse(void);
static void handleMouse(void);
static void preFireMissile(void);
static void applyRestrictions(void);
static int isPriorityMissionTarget(Entity *e, int dist, int closest);
static int targetOutOfRange(void);
static int isPriorityMissionTarget(Entity *e, int dist, int closest);
static int targetOutOfRange(void);
static void rechargeBoostECM(void);
static void setPilotName(void);
static void updateDeathStats(void);
static void handleSuspicionLevel(void);
static int selectedPlayerIndex;
static int availableGuns[BT_MAX];
static int selectedPlayerIndex;
static int availableGuns[BT_MAX];
static Entity *availablePlayerUnits[MAX_SELECTABLE_PLAYERS];
void initPlayer(void)
@ -57,7 +82,7 @@ void initPlayer(void)
if (!player->combinedGuns)
{
for (i = 0 ; i < MAX_FIGHTER_GUNS ; i++)
for (i = 0; i < MAX_FIGHTER_GUNS; i++)
{
n = player->guns[i].type;
@ -105,7 +130,7 @@ static void setPilotName(void)
pos = -1;
for (i = 0 ; i < strlen(game.currentMission->pilot) ; i++)
for (i = 0; i < strlen(game.currentMission->pilot); i++)
{
if (game.currentMission->pilot[i] == ' ')
{
@ -441,13 +466,13 @@ static void initPlayerSelect(void)
{
Entity *e;
memset(&availablePlayerUnits, 0, sizeof(Entity*) * MAX_SELECTABLE_PLAYERS);
memset(&availablePlayerUnits, 0, sizeof(Entity *) * MAX_SELECTABLE_PLAYERS);
selectedPlayerIndex = 0;
if (battle.epicLives == 0 || (battle.epicLives > 0 && --battle.epicLives > 0))
{
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->active && e->type == ET_FIGHTER && e->health > 0 && e->side == SIDE_ALLIES && selectedPlayerIndex < MAX_SELECTABLE_PLAYERS)
{
@ -512,8 +537,7 @@ static void selectNewPlayer(int dir)
selectedPlayerIndex = mod(selectedPlayerIndex, MAX_SELECTABLE_PLAYERS);
player = availablePlayerUnits[selectedPlayerIndex];
}
while (player == NULL);
} while (player == NULL);
battle.camera.x = player->x - (app.winWidth / 2);
battle.camera.y = player->y - (app.winHeight / 2);
@ -572,8 +596,7 @@ static void switchGuns(void)
do
{
i = (i + 1) % BT_MAX;
}
while (!availableGuns[i]);
} while (!availableGuns[i]);
}
if (player->selectedGunType != i)
@ -587,20 +610,20 @@ static void selectTarget(void)
{
unsigned int closest = MAX_TARGET_RANGE;
unsigned int dist = MAX_TARGET_RANGE;
int i, total;
Entity *e, *near;
Entity *targets[MAX_SELECTABLE_TARGETS];
int i, total;
Entity *e, *near;
Entity *targets[MAX_SELECTABLE_TARGETS];
i = 0;
near = NULL;
memset(targets, 0, sizeof(Entity*) * MAX_SELECTABLE_TARGETS);
memset(targets, 0, sizeof(Entity *) * MAX_SELECTABLE_TARGETS);
if (player->target && (!player->target->health || !player->target->systemPower))
{
player->target = NULL;
}
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->active && e != player && (e->flags & EF_TAKES_DAMAGE) && (!(e->flags & EF_NO_PLAYER_TARGET)) && e->side != player->side && e->alive == ALIVE_ALIVE && e->systemPower > 0 && i < MAX_SELECTABLE_TARGETS)
{
@ -625,7 +648,7 @@ static void selectTarget(void)
total = i;
for (i = 0 ; i < total ; i++)
for (i = 0; i < total; i++)
{
if (targets[i] == player->target)
{
@ -651,11 +674,11 @@ static void selectMissionTarget(void)
{
unsigned int closest = MAX_TARGET_RANGE;
unsigned int dist = MAX_TARGET_RANGE;
Entity *e;
Entity *e;
battle.missionTarget = NULL;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->active && e->flags & EF_MISSION_TARGET && e->alive == ALIVE_ALIVE)
{
@ -731,7 +754,7 @@ void setInitialPlayerAngle(void)
}
}
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->side == player->side)
{
@ -764,8 +787,8 @@ static void handleSuspicionLevel(void)
void loadPlayer(cJSON *node)
{
char *type;
int side, addFlags;
long flags;
int side, addFlags;
long flags;
type = cJSON_GetObjectItem(node, "type")->valuestring;
side = lookup(cJSON_GetObjectItem(node, "side")->valuestring);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,39 +18,9 @@ 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
extern void addECMEffect(Entity *ent);
extern void addHudMessage(SDL_Color c, char *format, ...);
extern void applyFighterBrakes(void);
extern void applyFighterThrust(void);
extern void awardTrophy(char *id);
extern void clearControl(int type);
extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
extern void failMission(void);
extern void fireGuns(Entity *owner);
extern void fireMissile(Entity *owner);
extern void fireRocket(Entity *owner);
extern long flagsToLong(char *flags, int *add);
extern float getAngle(int x1, int y1, int x2, int y2);
extern int getDistance(int x1, int y1, int x2, int y2);
extern int isAcceptControl(void);
extern int isControl(int type);
extern long lookup(char *name);
extern float mod(float n, float x);
extern void playSound(int id);
extern void resetAcceptControls(void);
extern Entity *spawnFighter(char *name, int x, int y, int side);
extern void updateCondition(char *name, int type);
extern App app;
extern Battle battle;
extern Colors colors;
extern Dev dev;
extern Entity *player;
extern Entity *self;
extern Game game;
void loadPlayer(struct cJSON *node);
int playerHasGun(int type);
void setInitialPlayerAngle(void);
void doPlayerSelect(void);
void doPlayer(void);
void initPlayer(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,15 +18,23 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../system/util.h"
#include "quadtree.h"
static Entity **candidates;
static int cIndex;
static int cCapacity;
#define QT_INITIAL_CAPACITY 8
#define QT_MAX_DEPTH 5
static int getIndex(Quadtree *root, int x, int y, int w, int h);
extern Battle battle;
static Entity **candidates;
static int cIndex;
static int cCapacity;
static int getIndex(Quadtree *root, int x, int y, int w, int h);
static void removeEntity(Entity *e, Quadtree *root);
static int candidatesComparator(const void *a, const void *b);
static int candidatesComparator(const void *a, const void *b);
static void getAllEntsWithinNode(int x, int y, int w, int h, Entity *ignore, Quadtree *root);
static void destroyQuadtreeNode(Quadtree *root);
static void resizeQTEntCapacity(Quadtree *root);
@ -35,7 +43,7 @@ static void resizeCandidates(void);
void initQuadtree(Quadtree *root)
{
Quadtree *node;
int i, w, h;
int i, w, h;
/* entire battlefield */
if (root->depth == 0)
@ -43,13 +51,13 @@ void initQuadtree(Quadtree *root)
root->w = BATTLE_AREA_WIDTH;
root->h = BATTLE_AREA_HEIGHT;
root->capacity = QT_INITIAL_CAPACITY;
root->ents = malloc(sizeof(Entity*) * root->capacity);
memset(root->ents, 0, sizeof(Entity*) * root->capacity);
root->ents = malloc(sizeof(Entity *) * root->capacity);
memset(root->ents, 0, sizeof(Entity *) * root->capacity);
cIndex = 0;
cCapacity = QT_INITIAL_CAPACITY;
candidates = malloc(sizeof(Entity*) * cCapacity);
memset(candidates, 0, sizeof(Entity*) * cCapacity);
candidates = malloc(sizeof(Entity *) * cCapacity);
memset(candidates, 0, sizeof(Entity *) * cCapacity);
}
w = root->w / 2;
@ -57,7 +65,7 @@ void initQuadtree(Quadtree *root)
if (root->depth + 1 < QT_MAX_DEPTH)
{
for (i = 0 ; i < 4 ; i++)
for (i = 0; i < 4; i++)
{
node = malloc(sizeof(Quadtree));
memset(node, 0, sizeof(Quadtree));
@ -65,8 +73,8 @@ void initQuadtree(Quadtree *root)
node->depth = root->depth + 1;
node->capacity = QT_INITIAL_CAPACITY;
node->ents = malloc(sizeof(Entity*) * node->capacity);
memset(node->ents, 0, sizeof(Entity*) * node->capacity);
node->ents = malloc(sizeof(Entity *) * node->capacity);
memset(node->ents, 0, sizeof(Entity *) * node->capacity);
if (i == 0)
{
@ -135,7 +143,7 @@ static void resizeQTEntCapacity(Quadtree *root)
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "Resizing QT node: %d -> %d", root->capacity, n);
root->ents = resize(root->ents, sizeof(Entity*) * root->capacity, sizeof(Entity*) * n);
root->ents = resize(root->ents, sizeof(Entity *) * root->capacity, sizeof(Entity *) * n);
root->capacity = n;
}
@ -211,7 +219,7 @@ static void removeEntity(Entity *e, Quadtree *root)
n = root->numEnts;
for (i = 0 ; i < root->capacity ; i++)
for (i = 0; i < root->capacity; i++)
{
if (root->ents[i] == e)
{
@ -220,13 +228,13 @@ static void removeEntity(Entity *e, Quadtree *root)
}
}
qsort(root->ents, n, sizeof(Entity*), candidatesComparator);
qsort(root->ents, n, sizeof(Entity *), candidatesComparator);
}
Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore)
{
cIndex = 0;
memset(candidates, 0, sizeof(Entity*) * cCapacity);
memset(candidates, 0, sizeof(Entity *) * cCapacity);
getAllEntsWithinNode(x, y, w, h, ignore, &battle.quadtree);
@ -254,14 +262,14 @@ static void getAllEntsWithinNode(int x, int y, int w, int h, Entity *ignore, Qua
}
else
{
for (i = 0 ; i < 4 ; i++)
for (i = 0; i < 4; i++)
{
getAllEntsWithinNode(x, y, w, h, ignore, root->node[i]);
}
}
}
for (i = 0 ; i < root->numEnts ; i++)
for (i = 0; i < root->numEnts; i++)
{
candidates[cIndex++] = root->ents[i];
@ -281,7 +289,7 @@ static void resizeCandidates(void)
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_DEBUG, "Resizing candidates: %d -> %d", cCapacity, n);
candidates = resize(candidates, sizeof(Entity*) * cCapacity, sizeof(Entity*) * n);
candidates = resize(candidates, sizeof(Entity *) * cCapacity, sizeof(Entity *) * n);
cCapacity = n;
}
@ -307,7 +315,7 @@ static void destroyQuadtreeNode(Quadtree *root)
if (root->node[0])
{
for (i = 0 ; i < 4 ; i++)
for (i = 0; i < 4; i++)
{
destroyQuadtreeNode(root->node[i]);
@ -320,18 +328,18 @@ static void destroyQuadtreeNode(Quadtree *root)
static int candidatesComparator(const void *a, const void *b)
{
Entity *e1 = *((Entity**)a);
Entity *e2 = *((Entity**)b);
Entity *e1 = *((Entity **)a);
Entity *e2 = *((Entity **)b);
if (!e1)
{
return 1;
}
else if (!e2)
{
return 1;
}
else if (!e2)
{
return -1;
}
else
else
{
return 0;
}

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,11 +18,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#define QT_INITIAL_CAPACITY 8
#define QT_MAX_DEPTH 5
extern void *resize(void *array, int oldSize, int newSize);
extern Battle battle;
void destroyQuadtree(void);
Entity **getAllEntsInRadius(int x, int y, int radius, Entity *ignore);
Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore);
void removeFromQuadtree(Entity *e, Quadtree *root);
void addToQuadtree(Entity *e, Quadtree *root);
void initQuadtree(Quadtree *root);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,12 +18,23 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/text.h"
#include "../system/util.h"
#include "radar.h"
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *player;
static AtlasImage *radarTexture;
static AtlasImage *radarWarningTexture;
static int radarRanges[] = {20, 40, 60};
static char *CAUTION_TEXT;
static int radarRanges[] = {20, 40, 60};
static char *CAUTION_TEXT;
void initRadar(void)
{
@ -39,8 +50,8 @@ void initRadar(void)
void drawRadar(void)
{
SDL_Rect r;
Entity *e;
int dist, inRange, blink;
Entity *e;
int dist, inRange, blink;
blit(radarTexture, app.winWidth - 85, app.winHeight - 85, 1);
@ -50,7 +61,7 @@ void drawRadar(void)
blink = battle.stats[STAT_TIME] % 60 < 30;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
dist = getDistance(e->x, e->y, player->x, player->y);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,15 +18,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
extern void blit(AtlasImage *atlasImage, int x, int y, int center);
extern void blitRotated(AtlasImage *atlasImage, int x, int y, float angle);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern AtlasImage *getAtlasImage(char *filename);
extern int getDistance(int x1, int y1, int x2, int y2);
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *player;
void drawRadarRangeWarning(void);
void drawRadar(void);
void initRadar(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,18 +18,33 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/hud.h"
#include "../battle/quadtree.h"
#include "../battle/script.h"
#include "../system/sound.h"
#include "../system/util.h"
#include "rope.h"
#define ROPE_DISTANCE 128
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *player;
extern Entity *self;
void attachRope(void)
{
int i, distance;
int i, distance;
Entity *e, **candidates;
if ((self->flags & EF_HAS_ROPE) && self->towing == NULL)
{
candidates = getAllEntsInRadius(self->x, self->y, self->separationRadius, self);
for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i])
for (i = 0, e = candidates[i]; e != NULL; e = candidates[++i])
{
if (!e->owner && e->type == ET_FIGHTER && (e->flags & EF_DISABLED) && (e->flags & EF_ROPED_ATTACHED) == 0 && e->alive == ALIVE_ALIVE)
{
@ -63,7 +78,7 @@ void attachRope(void)
void doRope(Entity *owner)
{
float dx, dy, angle, force;
int distance;
int distance;
if (owner->towing)
{

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,19 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#define ROPE_DISTANCE 128
extern void addHudMessage(SDL_Color c, char *format, ...);
extern Entity **getAllEntsInRadius(int x, int y, int radius, Entity *ignore);
extern float getAngle(int x1, int y1, int x2, int y2);
extern int getDistance(int x1, int y1, int x2, int y2);
extern void playBattleSound(int id, int x, int y);
extern void runScriptFunction(char *format, ...);
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *player;
extern Entity *self;
void cutRope(Entity *e);
void drawRope(Entity *e);
void doRope(Entity *owner);
void attachRope(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,15 +18,30 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/entities.h"
#include "../battle/fighters.h"
#include "../battle/hud.h"
#include "../battle/jumpgate.h"
#include "../battle/locations.h"
#include "../battle/messageBox.h"
#include "../battle/objectives.h"
#include "../battle/spawners.h"
#include "../battle/waypoints.h"
#include "../galaxy/mission.h"
#include "../json/cJSON.h"
#include "script.h"
static void executeNextLine(ScriptRunner *runner);
void destroyScript(void);
extern Battle battle;
extern Colors colors;
static cJSON *scriptJSON, *rootJSON;
static ScriptRunner head;
static void executeNextLine(ScriptRunner *runner);
static cJSON *scriptJSON, *rootJSON;
static ScriptRunner head;
static ScriptRunner *tail;
static int runScript;
static int runScript;
void initScript(cJSON *root)
{
@ -64,7 +79,7 @@ void doScript(void)
{
prev = &head;
for (runner = head.next ; runner != NULL ; runner = runner->next)
for (runner = head.next; runner != NULL; runner = runner->next)
{
runner->delay = MAX(0, runner->delay - 1);
@ -98,10 +113,10 @@ void doScript(void)
void runScriptFunction(const char *format, ...)
{
ScriptRunner *scriptRunner;
cJSON *function;
char *functionName;
char funcNameBuffer[MAX_NAME_LENGTH];
va_list args;
cJSON *function;
char *functionName;
char funcNameBuffer[MAX_NAME_LENGTH];
va_list args;
if (scriptJSON && runScript)
{
@ -140,9 +155,9 @@ void runScriptFunction(const char *format, ...)
static void executeNextLine(ScriptRunner *runner)
{
char *line;
char command[32];
char strParam[3][256];
int intParam[2];
char command[32];
char strParam[3][256];
int intParam[2];
line = runner->line->valuestring;

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,29 +18,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
extern void activateEntities(char *name);
extern void activateEntityGroups(char *groupName);
extern void activateJumpgate(int activate);
extern void activateLocations(char *locations);
extern void activateNextWaypoint(void);
extern void activateObjectives(char *objectives);
extern void activateSpawner(char *name, int active);
extern void activateTrespasserSpawner(void);
extern void addHudMessage(SDL_Color c, char *format, ...);
extern void addMessageBox(char *title, char *body, int type);
extern void completeAllObjectives(void);
extern void completeMission(void);
extern void createChristabelLocation(void);
extern void failMission(void);
extern void killEntity(char *name);
extern void retreatAllies(void);
extern void retreatEnemies(void);
extern int showingMessageBoxes(void);
extern void updateEntitySide(char *side, char *entity);
extern Battle battle;
extern Colors colors;
void destroyScript(void);
void cancelScript(void);
void runScriptFunction(const char *format, ...);
void doScript(void);
void initScript(struct cJSON *root);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,17 +18,26 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/fighters.h"
#include "../json/cJSON.h"
#include "../system/lookup.h"
#include "../system/util.h"
#include "spawners.h"
extern Battle battle;
extern Entity *player;
void doSpawners(void)
{
Entity *e;
Entity *e;
Spawner *s;
char *type;
int i, num, addFlags, addAIFlags;
long flags, aiFlags;
char *type;
int i, num, addFlags, addAIFlags;
long flags, aiFlags;
for (s = battle.spawnerHead.next ; s != NULL ; s = s->next)
for (s = battle.spawnerHead.next; s != NULL; s = s->next)
{
if (s->active && --s->time <= 0)
{
@ -58,7 +67,7 @@ void doSpawners(void)
aiFlags = flagsToLong(s->aiFlags, &addAIFlags);
}
for (i = 0 ; i < num ; i++)
for (i = 0; i < num; i++)
{
type = s->types[rand() % s->numTypes];
@ -114,7 +123,7 @@ void activateSpawner(char *name, int active)
{
Spawner *s;
for (s = battle.spawnerHead.next ; s != NULL ; s = s->next)
for (s = battle.spawnerHead.next; s != NULL; s = s->next)
{
if (strcmp(s->name, name) == 0)
{
@ -126,7 +135,7 @@ void activateSpawner(char *name, int active)
void activateTrespasserSpawner(void)
{
Spawner *s;
char types[MAX_DESCRIPTION_LENGTH];
char types[MAX_DESCRIPTION_LENGTH];
s = malloc(sizeof(Spawner));
memset(s, 0, sizeof(Spawner));

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,16 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
extern long flagsToLong(char *flags, int *add);
extern int getJSONValue(cJSON *node, char *name, int defValue);
extern char *getJSONValueStr(cJSON *node, char *name, char *defValue);
extern long lookup(char *name);
extern Entity *spawnFighter(char *name, int x, int y, int side);
extern char **toTypeArray(char *types, int *numTypes);
extern Battle battle;
extern Entity *player;
void loadSpawners(struct cJSON *node);
void activateTrespasserSpawner(void);
void activateSpawner(char *name, int active);
void doSpawners(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../system/util.h"
#include "starfield.h"
extern App app;
static Star stars[MAX_STARS];
void initStars(void)
@ -28,7 +33,7 @@ void initStars(void)
memset(stars, 0, sizeof(Star) * MAX_STARS);
for (i = 0 ; i < MAX_STARS ; i++)
for (i = 0; i < MAX_STARS; i++)
{
stars[i].x = rand() % app.winWidth;
stars[i].y = rand() % app.winHeight;
@ -42,7 +47,7 @@ void doStars(float dx, float dy)
{
int i;
for (i = 0 ; i < MAX_STARS ; i++)
for (i = 0; i < MAX_STARS; i++)
{
stars[i].x -= (dx * stars[i].speed);
stars[i].y -= (dy * stars[i].speed);
@ -57,7 +62,7 @@ void drawStars(void)
int i;
int c;
for (i = 0 ; i < MAX_STARS ; i++)
for (i = 0; i < MAX_STARS; i++)
{
c = 64 * stars[i].speed;

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
extern float mod(float n, float x);
extern App app;
void drawStars(void);
void doStars(float dx, float dy);
void initStars(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,12 +18,26 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/entities.h"
#include "../battle/hud.h"
#include "../battle/objectives.h"
#include "../battle/script.h"
#include "../system/atlas.h"
#include "../system/sound.h"
#include "../system/util.h"
#include "waypoints.h"
extern Battle battle;
extern Colors colors;
extern Entity *player;
extern Entity *self;
extern Game game;
static void think(void);
static int teamMatesClose(void);
static int isCurrentObjective(void);
void activateNextWaypoint(void);
static int teamMatesClose(void);
static int isCurrentObjective(void);
static int waypointId;
static int currentWaypointId;
@ -44,7 +58,7 @@ Entity *spawnWaypoint(void)
waypoint->active = 0;
waypoint->health = waypoint->maxHealth = FPS;
waypoint->texture = getAtlasImage("gfx/entities/waypoint.png");
waypoint->flags = EF_NO_MT_BOX+EF_MISSION_TARGET+EF_NO_HEALTH_BAR;
waypoint->flags = EF_NO_MT_BOX + EF_MISSION_TARGET + EF_NO_HEALTH_BAR;
waypoint->action = think;
waypoint->w = waypoint->texture->rect.w;
@ -115,7 +129,7 @@ static int teamMatesClose(void)
if (player->side != SIDE_PANDORAN)
{
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->active && e->type == ET_FIGHTER && e->side == SIDE_ALLIES)
{
@ -139,7 +153,7 @@ void activateNextWaypoint(void)
currentWaypointId++;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->type == ET_WAYPOINT && e->id == currentWaypointId)
{

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,18 +18,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
extern void addHudMessage(SDL_Color c, char *format, ...);
extern AtlasImage *getAtlasImage(char *filename);
extern int getDistance(int x1, int y1, int x2, int y2);
extern void playSound(int id);
extern void runScriptFunction(char *format, ...);
extern Entity *spawnEntity(void);
extern void updateObjective(char *name, int type);
extern Battle battle;
extern Colors colors;
extern Entity *player;
extern Entity *self;
extern Game game;
void activateNextWaypoint(void);
Entity *spawnWaypoint(void);
void resetWaypoints(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,50 +18,85 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/battle.h"
#include "../battle/starfield.h"
#include "../challenges/challenges.h"
#include "../galaxy/mission.h"
#include "../game/fighterDatabase.h"
#include "../game/options.h"
#include "../game/stats.h"
#include "../game/title.h"
#include "../game/trophies.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/input.h"
#include "../system/resources.h"
#include "../system/sound.h"
#include "../system/text.h"
#include "../system/textures.h"
#include "../system/transition.h"
#include "../system/util.h"
#include "../system/widgets.h"
#include "challengeHome.h"
static void logic(void);
static void draw(void);
static void handleKeyboard(void);
static void drawChallenges(void);
static void doChallenges(void);
static void startChallengeMission(void);
static void drawMenu(void);
static void resume(void);
static void stats(void);
static void trophies(void);
static void options(void);
static void ok(void);
static void returnFromOptions(void);
static void unlockChallenges(void);
static void quit(void);
static void updateChallengeMissionData(void);
#define CHALLENGES_PER_PAGE 14
#define SHOW_CHALLENGES 0
#define SHOW_FIGHTER_DB 5
#define SHOW_MENU 1
#define SHOW_OPTIONS 2
#define SHOW_STATS 3
#define SHOW_TROPHIES 4
extern App app;
extern Battle battle;
extern Colors colors;
extern Dev dev;
extern Game game;
static void logic(void);
static void draw(void);
static void handleKeyboard(void);
static void drawChallenges(void);
static void doChallengeList(void);
static void startChallengeMission(void);
static void drawMenu(void);
static void resume(void);
static void stats(void);
static void trophies(void);
static void options(void);
static void ok(void);
static void returnFromOptions(void);
static void unlockChallenges(void);
static void quit(void);
static void updateChallengeMissionData(void);
static char *listRestrictions(void);
static void prevPage(void);
static void nextPage(void);
static void fighterDatabase(void);
static void prevPage(void);
static void nextPage(void);
static void fighterDatabase(void);
static SDL_Texture *background;
static AtlasImage *planetTexture;
static AtlasImage *challengeIcon;
static AtlasImage *challengeIconHighlight;
static Widget *start;
static PointF planet;
static int show;
static int page;
static float maxPages;
static char timeLimit[MAX_DESCRIPTION_LENGTH];
static char restrictions[MAX_DESCRIPTION_LENGTH];
static int hasRestrictions;
static Widget *prev;
static Widget *next;
static char *CHALLENGES_TEXT;
static char *COMPLETED_TEXT;
static char *PAGE_TEXT;
static char *LOCKED_TEXT;
static char *CRAFT_TEXT;
static char *TIME_TEXT;
static char *RESTRICTIONS_TEXT;
static AtlasImage *planetTexture;
static AtlasImage *challengeIcon;
static AtlasImage *challengeIconHighlight;
static Widget *start;
static PointF planet;
static int show;
static int page;
static float maxPages;
static char timeLimit[MAX_DESCRIPTION_LENGTH];
static char restrictions[MAX_DESCRIPTION_LENGTH];
static int hasRestrictions;
static Widget *prev;
static Widget *next;
static char *CHALLENGES_TEXT;
static char *COMPLETED_TEXT;
static char *PAGE_TEXT;
static char *LOCKED_TEXT;
static char *CRAFT_TEXT;
static char *TIME_TEXT;
static char *RESTRICTIONS_TEXT;
void initChallengeHome(void)
{
@ -98,14 +133,14 @@ void initChallengeHome(void)
challengeIcon = getAtlasImage("gfx/challenges/challengeIcon.png");
challengeIconHighlight = getAtlasImage("gfx/challenges/challengeIconHighlight.png");
battle.camera.x = battle.camera.y = 0;
battle.camera.x = battle.camera.y = 0;
planet.x = rand() % app.winWidth;
planet.y = rand() % app.winHeight;
maxPages = page = 0;
for (m = game.challengeMissionHead.next ; m != NULL ; m = m->next)
for (m = game.challengeMissionHead.next; m != NULL; m = m->next)
{
maxPages++;
}
@ -179,7 +214,7 @@ static void unlockChallenges(void)
prevCompleted = 1;
for (m = game.challengeMissionHead.next ; m != NULL ; m = m->next)
for (m = game.challengeMissionHead.next; m != NULL; m = m->next)
{
m->available = (prevCompleted > 0 || dev.debug);
@ -209,7 +244,7 @@ static void logic(void)
switch (show)
{
case SHOW_CHALLENGES:
doChallenges();
doChallengeList();
break;
case SHOW_MENU:
@ -232,16 +267,16 @@ static void logic(void)
app.doTrophyAlerts = 1;
}
static void doChallenges(void)
static void doChallengeList(void)
{
Mission *c;
int i, startIndex, end;
int i, startIndex, end;
i = 0;
startIndex = page * CHALLENGES_PER_PAGE;
end = startIndex + CHALLENGES_PER_PAGE;
for (c = game.challengeMissionHead.next ; c != NULL ; c = c->next)
for (c = game.challengeMissionHead.next; c != NULL; c = c->next)
{
if (i >= startIndex && i < end && app.mouse.button[SDL_BUTTON_LEFT] && collision(app.uiMouse.x, app.uiMouse.y, 3, 3, c->rect.x, c->rect.y, c->rect.w, c->rect.h))
{
@ -297,7 +332,7 @@ static char *listRestrictions(void)
addRestriction(textBuffer, game.currentMission->challengeData.noBoost, _("No Boost"));
addRestriction(textBuffer, game.currentMission->challengeData.noGuns, _("No Guns"));
return strlen(textBuffer) > 0 ? textBuffer : "-";
return strlen(textBuffer) > 0 ? textBuffer : "-";
}
static void draw(void)
@ -356,10 +391,10 @@ static void draw(void)
static void drawChallenges(void)
{
Mission *m;
Mission *m;
Challenge *c;
SDL_Rect r;
int i, start, end;
SDL_Rect r;
int i, start, end;
r.x = 135;
r.y = 165;
@ -370,7 +405,7 @@ static void drawChallenges(void)
i = 0;
for (m = game.challengeMissionHead.next ; m != NULL ; m = m->next)
for (m = game.challengeMissionHead.next; m != NULL; m = m->next)
{
m->rect = r;

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,58 +18,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#define CHALLENGES_PER_PAGE 14
#define SHOW_CHALLENGES 0
#define SHOW_FIGHTER_DB 5
#define SHOW_MENU 1
#define SHOW_OPTIONS 2
#define SHOW_STATS 3
#define SHOW_TROPHIES 4
extern void autoSizeWidgetButtons(char *group, int recenter);
extern void awardChallengeTrophies(void);
extern void awardStatsTrophies(void);
extern void blit(AtlasImage *atlasImage, int x, int y, int centered);
extern void clearInput(void);
extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
extern void doFighterDatabase(void);
extern void doStars(float dx, float dy);
extern void doWidgets(void);
extern void drawBackground(SDL_Texture *texture);
extern void drawFighterDatabase(void);
extern void drawOptions(void);
extern void drawStars(void);
extern void drawStats(void);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern void drawTrophies(void);
extern void drawWidgets(char *groupName);
extern void endSectionTransition(void);
extern AtlasImage *getAtlasImage(const char *filename);
extern char *getBackgroundTextureName(int n);
extern char *getChallengeDescription(Challenge *c);
extern char *getPlanetTextureName(int n);
extern SDL_Texture *getTexture(char *filename);
extern Widget *getWidget(const char *name, const char *group);
extern void initBattle(void);
extern void initFighterDatabaseDisplay(void);
extern void initOptions(void (*returnFromOptions)(void));
extern void initStatsDisplay(void);
extern void initTitle(void);
extern void initTrophiesDisplay(void);
extern void loadMission(char *filename);
extern void playMusic(char *filename, int loop);
extern void playSound(int sound);
extern void scrollBackground(float x, float y);
extern void selectWidget(const char *name, const char *group);
extern void startSectionTransition(void);
extern void stopMusic(void);
extern char *timeToString(long millis, int showHours);
extern void updateAllMissions(void);
extern App app;
extern Battle battle;
extern Colors colors;
extern Dev dev;
extern Game game;
void initChallengeHome(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,37 +18,52 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/fighters.h"
#include "../galaxy/mission.h"
#include "../game/stats.h"
#include "../game/trophies.h"
#include "../json/cJSON.h"
#include "../system/io.h"
#include "../system/lookup.h"
#include "../system/util.h"
#include "../system/widgets.h"
#include "challenges.h"
static void updateTimeChallenge(Challenge *c);
static void updateSurvivalChallenge(Challenge *c);
static void updateAccuracyChallenge(Challenge *c);
static void updateArmourChallenge(Challenge *c);
static void updateLossesChallenge(Challenge *c);
static void updatePlayerKillsChallenge(Challenge *c);
static void updateDisabledChallenge(Challenge *c);
static void updateItemsChallenge(Challenge *c);
static void updateSurrenderChallenge(Challenge *c);
static void updateWaypointChallenge(Challenge *c);
static void updateRescueChallenge(Challenge *c);
static void completeChallenge(void);
static void failChallenge(void);
static int updateChallenges(void);
static char *getFormattedChallengeDescription(const char *format, ...);
char *getChallengeDescription(Challenge *c);
static int challengeFinished(void);
static int alreadyPassed(void);
static void printStats(void);
extern Battle battle;
extern Dev dev;
extern Entity *player;
extern Game game;
static char descriptionBuffer[MAX_DESCRIPTION_LENGTH];
static void updateTimeChallenge(Challenge *c);
static void updateSurvivalChallenge(Challenge *c);
static void updateAccuracyChallenge(Challenge *c);
static void updateArmourChallenge(Challenge *c);
static void updateLossesChallenge(Challenge *c);
static void updatePlayerKillsChallenge(Challenge *c);
static void updateDisabledChallenge(Challenge *c);
static void updateItemsChallenge(Challenge *c);
static void updateSurrenderChallenge(Challenge *c);
static void updateWaypointChallenge(Challenge *c);
static void updateRescueChallenge(Challenge *c);
static void completeChallenge(void);
static void failChallenge(void);
static int updateChallenges(void);
static char *getFormattedChallengeDescription(const char *format, ...);
static int challengeFinished(void);
static int alreadyPassed(void);
static void printStats(void);
static char descriptionBuffer[MAX_DESCRIPTION_LENGTH];
static const char *challengeDescription[CHALLENGE_MAX];
void initChallenges(void)
{
Mission *mission, *tail;
char **filenames;
char path[MAX_FILENAME_LENGTH];
int count, i;
char **filenames;
char path[MAX_FILENAME_LENGTH];
int count, i;
challengeDescription[CHALLENGE_ARMOUR] = _("Retain at least %d%% armour");
challengeDescription[CHALLENGE_TIME] = _("Complete challenge in %d seconds or less");
@ -71,7 +86,7 @@ void initChallenges(void)
filenames = getFileList("data/challenges", &count);
for (i = 0 ; i < count ; i++)
for (i = 0; i < count; i++)
{
sprintf(path, "data/challenges/%s", filenames[i]);
@ -91,7 +106,7 @@ void initChallenges(void)
void loadChallenge(Mission *mission, cJSON *node)
{
int i;
int i;
Challenge *challenge;
mission->challengeData.isChallenge = 1;
@ -234,14 +249,14 @@ static int challengeFinished(void)
static int updateChallenges(void)
{
int i, numPassed;
int i, numPassed;
Challenge *c;
updateAccuracyStats(battle.stats);
numPassed = 0;
for (i = 0 ; i < MAX_CHALLENGES ; i++)
for (i = 0; i < MAX_CHALLENGES; i++)
{
c = game.currentMission->challengeData.challenges[i];
@ -321,7 +336,7 @@ static void printStats(void)
{
int i;
for (i = 0 ; i < STAT_MAX ; i++)
for (i = 0; i < STAT_MAX; i++)
{
if (battle.stats[i])
{
@ -478,10 +493,10 @@ char *getChallengeDescription(Challenge *c)
Challenge *getChallenge(Mission *mission, int type, int value)
{
int i;
int i;
Challenge *c;
for (i = 0 ; i < MAX_CHALLENGES ; i++)
for (i = 0; i < MAX_CHALLENGES; i++)
{
c = mission->challengeData.challenges[i];
@ -509,15 +524,15 @@ static char *getFormattedChallengeDescription(const char *format, ...)
void updateChallengeMissions(void)
{
int i;
Mission *m;
int i;
Mission *m;
Challenge *c;
for (m = game.challengeMissionHead.next ; m != NULL ; m = m->next)
for (m = game.challengeMissionHead.next; m != NULL; m = m->next)
{
m->totalChallenges = m->completedChallenges = 0;
for (i = 0 ; i < MAX_CHALLENGES ; i++)
for (i = 0; i < MAX_CHALLENGES; i++)
{
c = m->challengeData.challenges[i];
@ -581,10 +596,10 @@ static void failChallenge(void)
static int alreadyPassed(void)
{
int i;
int i;
Challenge *c;
for (i = 0 ; i < MAX_CHALLENGES ; i++)
for (i = 0; i < MAX_CHALLENGES; i++)
{
c = game.currentMission->challengeData.challenges[i];

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,23 +18,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
extern void awardCraftTrophy(void);
extern void awardStatsTrophies(void);
extern char **getFileList(char *dir, int *count);
extern int getJSONValue(cJSON *node, char *name, int defValue);
extern char *getLookupName(char *prefix, long num);
extern Mission *loadMissionMeta(char *filename);
extern long lookup(char *name);
extern void retreatAllies(void);
extern void retreatEnemies(void);
extern void selectWidget(const char *name, const char *group);
extern char *timeToString(long millis, int showHours);
extern void updateAccuracyStats(unsigned int *stats);
extern Battle battle;
extern Dev dev;
extern Entity *player;
extern Game game;
void updateChallengeMissions(void);
Challenge *getChallenge(Mission *mission, int type, int value);
char *getChallengeDescription(Challenge *c);
void doChallenges(void);
void loadChallenge(Mission *mission, struct cJSON *node);
void initChallenges(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,15 +18,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "math.h"
#include "ctype.h"
#include "SDL2/SDL.h"
#include "defs.h"
#include "math.h"
#include "SDL2/SDL.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "structs.h"
extern char *getTranslatedString(char *string);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -48,126 +48,129 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define _(string) getTranslatedString(string)
#define PI 3.14159265358979323846
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
#define CAROLINE(a,b) MIN(a,b)
#define STRNCPY(dest, src, n) strncpy(dest, src, n); dest[n - 1] = '\0'
#define PI 3.14159265358979323846
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define CAROLINE(a, b) MIN(a, b)
#define STRNCPY(dest, src, n) \
strncpy(dest, src, n); \
dest[n - 1] = '\0'
#define TO_RAIDANS(angleDegrees) (angleDegrees * PI / 180.0)
#define TO_DEGREES(angleRadians) (angleRadians * 180.0 / PI)
#define SAVE_FILENAME "game.save"
#define SAVE_FILENAME "game.save"
#define CONFIG_FILENAME "config.json"
#define SCREEN_WIDTH 1280
#define SCREEN_HEIGHT 720
#define SCREEN_WIDTH 1280
#define SCREEN_HEIGHT 720
#define UI_WIDTH 1280
#define UI_HEIGHT 720
#define UI_WIDTH 1280
#define UI_HEIGHT 720
#define MAX_KEYBOARD_KEYS 350
#define MAX_MOUSE_BUTTONS 6
#define MAX_KEYBOARD_KEYS 350
#define MAX_MOUSE_BUTTONS 6
#define FPS 60
#define FPS 60
#define MAX_NAME_LENGTH 32
#define MAX_DESCRIPTION_LENGTH 512
#define MAX_LINE_LENGTH 1024
#define MAX_FILENAME_LENGTH 1024
#define MAX_PATH_LENGTH 4096
#define MAX_NAME_LENGTH 32
#define MAX_DESCRIPTION_LENGTH 512
#define MAX_LINE_LENGTH 1024
#define MAX_FILENAME_LENGTH 1024
#define MAX_PATH_LENGTH 4096
#define NUM_TEXTURE_BUCKETS 32
#define NUM_ATLAS_BUCKETS 64
#define NUM_GLYPH_BUCKETS 128
#define NUM_TEXTURE_BUCKETS 32
#define NUM_ATLAS_BUCKETS 64
#define MAX_STARS 500
#define MAX_GLYPHS 400
#define MAX_CHALLENGES 3
#define MAX_STARS 500
#define MAX_FIGHTER_GUNS 12
#define MAX_TARGET_RANGE 65536
#define MAX_SYSTEM_POWER 100
#define MAX_CHALLENGES 3
#define BATTLE_AREA_CELLS 50
#define BATTLE_AREA_WIDTH (640 * BATTLE_AREA_CELLS)
#define BATTLE_AREA_HEIGHT (360 * BATTLE_AREA_CELLS)
#define BATTLE_AREA_EDGE 250
#define MAX_FIGHTER_GUNS 12
#define MAX_TARGET_RANGE 65536
#define MAX_SYSTEM_POWER 100
#define BF_NONE 0
#define BF_ENGINE (2 << 0)
#define BF_SYSTEM_DAMAGE (2 << 1)
#define BF_SHIELD_DAMAGE (2 << 2)
#define BF_EXPLODES (2 << 3)
#define BATTLE_AREA_CELLS 50
#define BATTLE_AREA_WIDTH (640 * BATTLE_AREA_CELLS)
#define BATTLE_AREA_HEIGHT (360 * BATTLE_AREA_CELLS)
#define BATTLE_AREA_EDGE 250
#define EF_NONE 0
#define EF_NO_KILL (2 << 0)
#define EF_DISABLED (2 << 1)
#define EF_IMMORTAL (2 << 2)
#define EF_MISSION_TARGET (2 << 3)
#define EF_NO_MT_BOX (2 << 4)
#define EF_HAS_ROPE (2 << 5)
#define EF_COLLECTS_ITEMS (2 << 6)
#define EF_MUST_DISABLE (2 << 7)
#define EF_RETREATING (2 << 8)
#define EF_NO_EPIC (2 << 9)
#define EF_STATIC (2 << 10)
#define EF_TAKES_DAMAGE (2 << 11)
#define EF_SECONDARY_TARGET (2 << 12)
#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 EF_SHORT_RADAR_RANGE (2 << 17)
#define EF_NO_PLAYER_TARGET (2 << 18)
#define EF_AI_IGNORE (2 << 19)
#define EF_NON_SOLID (2 << 20)
#define EF_NO_HEALTH_BAR (2 << 21)
#define EF_FRIENDLY_HEALTH_BAR (2 << 22)
#define EF_NO_THREAT (2 << 23)
#define EF_DROPS_ITEMS (2 << 24)
#define EF_COMMON_FIGHTER (2 << 25)
#define BF_NONE 0
#define BF_ENGINE (2 << 0)
#define BF_SYSTEM_DAMAGE (2 << 1)
#define BF_SHIELD_DAMAGE (2 << 2)
#define BF_EXPLODES (2 << 3)
#define AIF_NONE 0
#define AIF_FOLLOWS_PLAYER (2 << 0)
#define AIF_MOVES_TO_PLAYER (2 << 1)
#define AIF_UNLIMITED_RANGE (2 << 2)
#define AIF_COLLECTS_ITEMS (2 << 3)
#define AIF_TOWS (2 << 4)
#define AIF_RETREATS (2 << 5)
#define AIF_GOAL_JUMPGATE (2 << 6)
#define AIF_AVOIDS_COMBAT (2 << 7)
#define AIF_DEFENSIVE (2 << 8)
#define AIF_MISSILE_BOAT (2 << 9)
#define AIF_AGGRESSIVE (2 << 10)
#define AIF_LONG_RANGE_FIRE (2 << 11)
#define AIF_MOVES_TO_LEADER (2 << 12)
#define AIF_EVADE (2 << 13)
#define AIF_WANDERS (2 << 14)
#define AIF_COVERS_RETREAT (2 << 15)
#define AIF_TARGET_FOCUS (2 << 16)
#define AIF_DROPS_MINES (2 << 17)
#define AIF_ASSASSIN (2 << 18)
#define AIF_SUSPICIOUS (2 << 19)
#define AIF_ZAK_SUSPICIOUS (2 << 20)
#define AIF_SURRENDERS (2 << 21)
#define AIF_SURRENDERING (2 << 22)
#define AIF_SURRENDERED (2 << 23)
#define EF_NONE 0
#define EF_NO_KILL (2 << 0)
#define EF_DISABLED (2 << 1)
#define EF_IMMORTAL (2 << 2)
#define EF_MISSION_TARGET (2 << 3)
#define EF_NO_MT_BOX (2 << 4)
#define EF_HAS_ROPE (2 << 5)
#define EF_COLLECTS_ITEMS (2 << 6)
#define EF_MUST_DISABLE (2 << 7)
#define EF_RETREATING (2 << 8)
#define EF_NO_EPIC (2 << 9)
#define EF_STATIC (2 << 10)
#define EF_TAKES_DAMAGE (2 << 11)
#define EF_SECONDARY_TARGET (2 << 12)
#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 EF_SHORT_RADAR_RANGE (2 << 17)
#define EF_NO_PLAYER_TARGET (2 << 18)
#define EF_AI_IGNORE (2 << 19)
#define EF_NON_SOLID (2 << 20)
#define EF_NO_HEALTH_BAR (2 << 21)
#define EF_FRIENDLY_HEALTH_BAR (2 << 22)
#define EF_NO_THREAT (2 << 23)
#define EF_DROPS_ITEMS (2 << 24)
#define EF_COMMON_FIGHTER (2 << 25)
#define AIF_NONE 0
#define AIF_FOLLOWS_PLAYER (2 << 0)
#define AIF_MOVES_TO_PLAYER (2 << 1)
#define AIF_UNLIMITED_RANGE (2 << 2)
#define AIF_COLLECTS_ITEMS (2 << 3)
#define AIF_TOWS (2 << 4)
#define AIF_RETREATS (2 << 5)
#define AIF_GOAL_JUMPGATE (2 << 6)
#define AIF_AVOIDS_COMBAT (2 << 7)
#define AIF_DEFENSIVE (2 << 8)
#define AIF_MISSILE_BOAT (2 << 9)
#define AIF_AGGRESSIVE (2 << 10)
#define AIF_LONG_RANGE_FIRE (2 << 11)
#define AIF_MOVES_TO_LEADER (2 << 12)
#define AIF_EVADE (2 << 13)
#define AIF_WANDERS (2 << 14)
#define AIF_COVERS_RETREAT (2 << 15)
#define AIF_TARGET_FOCUS (2 << 16)
#define AIF_DROPS_MINES (2 << 17)
#define AIF_ASSASSIN (2 << 18)
#define AIF_SUSPICIOUS (2 << 19)
#define AIF_ZAK_SUSPICIOUS (2 << 20)
#define AIF_SURRENDERS (2 << 21)
#define AIF_SURRENDERING (2 << 22)
#define AIF_SURRENDERED (2 << 23)
/* player abilities */
#define BOOST_RECHARGE_TIME (FPS * 7)
#define BOOST_FINISHED_TIME (FPS * 0.75)
#define ECM_RECHARGE_TIME (FPS * 7)
#define BOOST_RECHARGE_TIME (FPS * 7)
#define BOOST_FINISHED_TIME (FPS * 0.75)
#define ECM_RECHARGE_TIME (FPS * 7)
#define MB_NORMAL 0
#define MB_IMPORTANT 1
#define MB_PANDORAN 2
#define MB_NORMAL 0
#define MB_IMPORTANT 1
#define MB_PANDORAN 2
#define SS_NORMAL 0
#define SS_SOL 1
#define SS_PANDORAN 2
#define SS_NORMAL 0
#define SS_SOL 1
#define SS_PANDORAN 2
#define MAX_SUSPICION_LEVEL 1500.0
#define MAX_ZAK_SUSPICION_LEVEL (FPS * 30)
#define MAX_SUSPICION_LEVEL 1500.0
#define MAX_ZAK_SUSPICION_LEVEL (FPS * 30)
enum
{

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,63 +18,96 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/battle.h"
#include "../battle/starfield.h"
#include "../galaxy/mission.h"
#include "../galaxy/starSystems.h"
#include "../game/fighterDatabase.h"
#include "../game/options.h"
#include "../game/stats.h"
#include "../game/title.h"
#include "../game/trophies.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/input.h"
#include "../system/modalDialog.h"
#include "../system/sound.h"
#include "../system/text.h"
#include "../system/textures.h"
#include "../system/transition.h"
#include "../system/util.h"
#include "../system/widgets.h"
#include "galacticMap.h"
static void logic(void);
static void draw(void);
static void handleKeyboard(void);
static void handleMouse(void);
static void scrollGalaxy(void);
static void drawStarSystemDetail(void);
static void selectStarSystem(void);
static void drawGalaxy(void);
static void centerOnSelectedStarSystem(void);
static void doStarSystems(void);
void destroyGalacticMap(void);
static void drawPulses(void);
static void drawInfoBars(void);
static void doPulses(void);
static void addPulses(void);
static void drawMenu(void);
static void resume(void);
static void stats(void);
static void trophies(void);
static void options(void);
static void ok(void);
static void quit(void);
static void startMission(void);
static void returnFromOptions(void);
static void doStarSystemView(void);
static void updatePandoranAdvance(void);
static void fallenOK(void);
static void updateCampaignProgress(void);
static void campaignCompleteOK(void);
static Mission *nextAvailableMission(StarSystem *starSystem);
static void fighterDatabase(void);
#define MAX_LISTED_MISSIONS 9
#define SHOW_FIGHTER_DB 6
#define SHOW_GALAXY 0
#define SHOW_MENU 2
#define SHOW_OPTIONS 3
#define SHOW_STAR_SYSTEM 1
#define SHOW_STATS 4
#define SHOW_TROPHIES 5
static StarSystem *selectedStarSystem;
extern App app;
extern Colors colors;
extern Game game;
static void logic(void);
static void draw(void);
static void handleKeyboard(void);
static void handleMouse(void);
static void scrollGalaxy(void);
static void drawStarSystemDetail(void);
static void selectStarSystem(void);
static void drawGalaxy(void);
static void centerOnSelectedStarSystem(void);
static void doStarSystems(void);
static void drawPulses(void);
static void drawInfoBars(void);
static void doPulses(void);
static void addPulses(void);
static void drawMenu(void);
static void resume(void);
static void stats(void);
static void trophies(void);
static void options(void);
static void ok(void);
static void quit(void);
static void startMission(void);
static void returnFromOptions(void);
static void doStarSystemView(void);
static void updatePandoranAdvance(void);
static void fallenOK(void);
static void updateCampaignProgress(void);
static void campaignCompleteOK(void);
static Mission *nextAvailableMission(StarSystem *starSystem);
static void fighterDatabase(void);
static StarSystem *selectedStarSystem;
static SDL_Texture *background;
static AtlasImage *starSystemTexture;
static AtlasImage *arrowTexture;
static SDL_Point camera;
static Pulse pulseHead = {0};
static Pulse *pulseTail;
static int pulseTimer;
static float ssx, ssy;
static float arrowPulse;
static int show;
static int scrollingMap;
static int campaignComplete = 0;
static PointF cameraMin, cameraMax;
static Widget *startMissionButton;
static Mission *hoverMission;
static char *MISSIONS_TEXT;
static char *PILOT_TEXT;
static char *CRAFT_TEXT;
static char *SQUADRON_TEXT;
static char *COMPLETED_TEXT;
static char *EPIC_TEXT;
static char *OPTIONAL_TEXT;
static AtlasImage *starSystemTexture;
static AtlasImage *arrowTexture;
static SDL_Point camera;
static Pulse pulseHead = {0};
static Pulse *pulseTail;
static int pulseTimer;
static float ssx, ssy;
static float arrowPulse;
static int show;
static int scrollingMap;
static int campaignComplete = 0;
static PointF cameraMin, cameraMax;
static Widget *startMissionButton;
static Mission *hoverMission;
static char *MISSIONS_TEXT;
static char *PILOT_TEXT;
static char *CRAFT_TEXT;
static char *SQUADRON_TEXT;
static char *COMPLETED_TEXT;
static char *EPIC_TEXT;
static char *OPTIONAL_TEXT;
void initGalacticMap(void)
{
@ -161,7 +194,7 @@ static void updateCampaignProgress(void)
if (!campaignComplete && game.completedMissions == game.totalMissions)
{
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
for (starSystem = game.starSystemHead.next; starSystem != NULL; starSystem = starSystem->next)
{
if (starSystem->missionHead.next && starSystem->missionHead.next->available)
{
@ -181,7 +214,7 @@ static void updatePandoranAdvance(void)
fallenStarSystem = NULL;
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
for (starSystem = game.starSystemHead.next; starSystem != NULL; starSystem = starSystem->next)
{
if (starSystem->side != SIDE_PANDORAN && starSystem->fallsToPandorans && starSystem->completedMissions == starSystem->totalMissions && starSystem->totalMissions > 0)
{
@ -242,7 +275,7 @@ static void logic(void)
static void doStarSystems(void)
{
StarSystem *starSystem;
int cx, cy;
int cx, cy;
if (!scrollingMap)
{
@ -254,7 +287,7 @@ static void doStarSystems(void)
selectedStarSystem = NULL;
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
for (starSystem = game.starSystemHead.next; starSystem != NULL; starSystem = starSystem->next)
{
cameraMin.x = MIN(cameraMin.x, starSystem->x);
cameraMin.y = MIN(cameraMin.y, starSystem->y);
@ -325,7 +358,7 @@ static void doStarSystemView(void)
{
Mission *mission;
for (mission = selectedStarSystem->missionHead.next ; mission != NULL ; mission = mission->next)
for (mission = selectedStarSystem->missionHead.next; mission != NULL; mission = mission->next)
{
if (mission->available && collision(app.uiMouse.x - app.mouse.w / 2, app.uiMouse.y - app.mouse.h / 2, app.mouse.w, app.mouse.h, mission->rect.x, mission->rect.y, mission->rect.w, mission->rect.h))
{
@ -355,10 +388,10 @@ static void doStarSystemView(void)
static void addPulses(void)
{
Pulse *pulse;
Pulse *pulse;
StarSystem *starSystem;
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
for (starSystem = game.starSystemHead.next; starSystem != NULL; starSystem = starSystem->next)
{
if (starSystem->completedMissions < starSystem->availableMissions || (campaignComplete && starSystem->activeMission))
{
@ -407,7 +440,7 @@ static void doPulses(void)
prev = &pulseHead;
for (pulse = pulseHead.next ; pulse != NULL ; pulse = pulse->next)
for (pulse = pulseHead.next; pulse != NULL; pulse = pulse->next)
{
pulse->size += 0.5;
pulse->life--;
@ -472,7 +505,7 @@ static void drawPulses(void)
{
Pulse *pulse;
for (pulse = pulseHead.next ; pulse != NULL ; pulse = pulse->next)
for (pulse = pulseHead.next; pulse != NULL; pulse = pulse->next)
{
drawCircle(pulse->x - camera.x, pulse->y - camera.y, pulse->size, pulse->r, pulse->g, pulse->b, pulse->life);
}
@ -489,12 +522,12 @@ static void centerOnSelectedStarSystem(void)
static void drawGalaxy(void)
{
SDL_Rect r;
SDL_Rect r;
StarSystem *starSystem;
SDL_Color color;
float ax, ay, aa;
SDL_Color color;
float ax, ay, aa;
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
for (starSystem = game.starSystemHead.next; starSystem != NULL; starSystem = starSystem->next)
{
r.x = starSystem->x - camera.x;
r.y = starSystem->y - camera.y;
@ -619,7 +652,7 @@ static Mission *nextAvailableMission(StarSystem *starSystem)
{
Mission *m;
for (m = starSystem->missionHead.next ; m != NULL ; m = m->next)
for (m = starSystem->missionHead.next; m != NULL; m = m->next)
{
if (m->available && !m->completed)
{
@ -632,7 +665,7 @@ static Mission *nextAvailableMission(StarSystem *starSystem)
static void drawStarSystemDetail(void)
{
int y;
int y;
Mission *mission;
SDL_Rect r;
@ -662,7 +695,7 @@ static void drawStarSystemDetail(void)
y += 80;
for (mission = selectedStarSystem->missionHead.next ; mission != NULL ; mission = mission->next)
for (mission = selectedStarSystem->missionHead.next; mission != NULL; mission = mission->next)
{
mission->rect.x = 200;
mission->rect.y = y - 2;

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,59 +18,5 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#define MAX_LISTED_MISSIONS 9
#define SHOW_FIGHTER_DB 6
#define SHOW_GALAXY 0
#define SHOW_MENU 2
#define SHOW_OPTIONS 3
#define SHOW_STAR_SYSTEM 1
#define SHOW_STATS 4
#define SHOW_TROPHIES 5
extern void autoSizeWidgetButtons(char *group, int recenter);
extern void awardCampaignTrophies(void);
extern void awardStatsTrophies(void);
extern void blit(AtlasImage *atlasImage, int x, int y, int centered);
extern void blitRotated(AtlasImage *atlasImage, int x, int y, float angle);
extern void clearInput(void);
extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
extern void doFighterDatabase(void);
extern void doStars(float dx, float dy);
extern void doWidgets(void);
extern void drawBackground(SDL_Texture *texture);
extern void drawCircle(int cx, int cy, int radius, int r, int g, int b, int a);
extern void drawFighterDatabase(void);
extern void drawOptions(void);
extern void drawStars(void);
extern void drawStats(void);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern void drawTrophies(void);
extern void drawWidgets(char *groupName);
extern void endSectionTransition(void);
extern AtlasImage *getAtlasImage(char *filename);
extern StarSystem *getStarSystem(char *name);
extern SDL_Texture *getTexture(char *filename);
extern Widget *getWidget(const char *name, const char *group);
extern void initBattle(void);
extern void initFighterDatabaseDisplay(void);
extern void initOptions(void (*returnFromOptions)(void));
extern void initStatsDisplay(void);
extern void initTitle(void);
extern void initTrophiesDisplay(void);
extern void loadMission(char *filename);
extern void playMusic(char *filename, int loop);
extern void playSound(int id);
extern void scrollBackground(float x, float y);
extern void selectWidget(const char *name, const char *group);
extern void setAtlasColor(int r, int g, int b, int a);
extern void setMouseCursor(int isDrag);
extern void showOKDialog(void (*callback)(void), const char *format, ...);
extern void startSectionTransition(void);
extern void stopMusic(void);
extern void updateAllMissions(void);
extern App app;
extern Colors colors;
extern Game game;
void destroyGalacticMap(void);
void initGalacticMap(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,11 +18,46 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <time.h>
#include "../common.h"
#include "../battle/capitalShips.h"
#include "../battle/entities.h"
#include "../battle/fighters.h"
#include "../battle/items.h"
#include "../battle/jumpgate.h"
#include "../battle/locations.h"
#include "../battle/mine.h"
#include "../battle/missionInfo.h"
#include "../battle/objectives.h"
#include "../battle/player.h"
#include "../battle/script.h"
#include "../battle/spawners.h"
#include "../battle/waypoints.h"
#include "../challenges/challenges.h"
#include "../galaxy/starSystems.h"
#include "../game/trophies.h"
#include "../json/cJSON.h"
#include "../system/atlas.h"
#include "../system/io.h"
#include "../system/lookup.h"
#include "../system/resources.h"
#include "../system/sound.h"
#include "../system/textures.h"
#include "../system/transition.h"
#include "../system/util.h"
#include "../system/widgets.h"
#include "mission.h"
static void loadEntities(cJSON *node);
static unsigned long hashcode(const char *str);
static void loadEpicData(cJSON *node);
extern App app;
extern Battle battle;
extern Dev dev;
extern Entity *player;
extern Game game;
static void loadEntities(cJSON *node);
static void loadEpicData(cJSON *node);
static char *getAutoBackground(char *filename);
static char *getAutoPlanet(char *filename);
static char *getAutoMusic(char *filename);
@ -30,8 +65,8 @@ static char *getAutoMusic(char *filename);
Mission *loadMissionMeta(char *filename)
{
Mission *mission;
cJSON *root, *node;
char *text;
cJSON *root, *node;
char *text;
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename);
@ -93,8 +128,8 @@ Mission *loadMissionMeta(char *filename)
void loadMission(char *filename)
{
cJSON *root;
char *text, music[MAX_DESCRIPTION_LENGTH], *background, *planet;
float planetScale;
char *text, music[MAX_DESCRIPTION_LENGTH], *background, *planet;
float planetScale;
startSectionTransition();
@ -313,10 +348,10 @@ void failMission(void)
static void loadEntities(cJSON *node)
{
Entity *e;
char *name, *groupName;
int i, type, scatter, number, active, addFlags, side;
float x, y;
long flags;
char *name, *groupName;
int i, type, scatter, number, active, addFlags, side;
float x, y;
long flags;
if (node)
{
@ -344,7 +379,7 @@ static void loadEntities(cJSON *node)
flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags);
}
for (i = 0 ; i < number ; i++)
for (i = 0; i < number; i++)
{
switch (type)
{
@ -414,7 +449,7 @@ static void loadEntities(cJSON *node)
static void loadEpicData(cJSON *node)
{
Entity *e;
int numFighters[SIDE_MAX];
int numFighters[SIDE_MAX];
memset(numFighters, 0, sizeof(int) * SIDE_MAX);
battle.isEpic = 1;
@ -434,7 +469,7 @@ static void loadEpicData(cJSON *node)
addEpicKillsObjective();
}
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
for (e = battle.entityHead.next; e != NULL; e = e->next)
{
if (e->active && e->type == ET_FIGHTER && numFighters[e->side]++ >= battle.epicFighterLimit)
{
@ -446,12 +481,12 @@ static void loadEpicData(cJSON *node)
Mission *getMission(char *filename)
{
StarSystem *starSystem;
Mission *mission;
Mission *mission;
/* First, search the star systems */
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
for (starSystem = game.starSystemHead.next; starSystem != NULL; starSystem = starSystem->next)
{
for (mission = starSystem->missionHead.next ; mission != NULL ; mission = mission->next)
for (mission = starSystem->missionHead.next; mission != NULL; mission = mission->next)
{
if (strcmp(mission->filename, filename) == 0)
{
@ -461,7 +496,7 @@ Mission *getMission(char *filename)
}
/* now search the challenges */
for (mission = game.challengeMissionHead.next ; mission != NULL ; mission = mission->next)
for (mission = game.challengeMissionHead.next; mission != NULL; mission = mission->next)
{
if (strcmp(mission->filename, filename) == 0)
{
@ -489,27 +524,6 @@ int isMissionAvailable(Mission *mission, Mission *prev)
}
else
{
return mission->completed || (
game.completedMissions >= mission->requires &&
game.stats[STAT_OPTIONAL_COMPLETED] >= mission->requiresOptional &&
game.completedMissions < mission->expires
) || dev.debug;
return mission->completed || (game.completedMissions >= mission->requires && game.stats[STAT_OPTIONAL_COMPLETED] >= mission->requiresOptional && game.completedMissions < mission->expires) || dev.debug;
}
}
static unsigned long hashcode(const char *str)
{
unsigned long hash = 5381;
int c;
c = *str;
while (c)
{
hash = ((hash << 5) + hash) + c;
c = *str++;
}
return hash;
}

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,57 +18,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
#include "time.h"
extern void activateNextWaypoint(void);
extern void addAllToQuadtree(void);
extern void addEpicKillsObjective(void);
extern void addEpicLivesObjective(void);
extern void awardCraftTrophy(void);
extern void awardPostMissionTrophies(void);
extern void awardStatsTrophies(void);
extern void completeConditions(void);
extern void countNumEnemies(void);
extern void endSectionTransition(void);
extern void failIncompleteObjectives(void);
extern long flagsToLong(char *flags, int *add);
extern AtlasImage *getAtlasImage(char *filename);
extern char *getBackgroundTextureName(unsigned long n);
extern int getJSONValue(cJSON *node, char *name, int defValue);
extern char *getJSONValueStr(cJSON *node, char *name, char *defValue);
extern char *getMusicFilename(unsigned long n);
extern char *getPlanetTextureName(unsigned long n);
extern SDL_Texture *getTexture(char *filename);
extern void initMissionInfo(void);
extern void initPlayer(void);
extern void initScript(cJSON *missionJSON);
extern void loadCapitalShips(cJSON *node);
extern void loadChallenge(Mission *mission, cJSON *node);
extern void loadFighters(cJSON *node);
extern void loadItems(cJSON *node);
extern void loadLocations(cJSON *node);
extern void loadObjectives(cJSON *node);
extern void loadPlayer(cJSON *node);
extern void loadSpawners(cJSON *node);
extern long lookup(char *name);
extern void playMusic(char *filename, int loop);
extern char *readFile(char *filename);
extern void retreatEnemies(void);
extern void selectWidget(const char *name, const char *group);
extern void setInitialPlayerAngle(void);
extern Entity *spawnJumpgate(int side, long flags);
extern Entity *spawnMine(int type);
extern Entity *spawnWaypoint(void);
extern void startSectionTransition(void);
extern void stopMusic(void);
extern void updateChallengeMissions(void);
extern void updateStarSystemMissions(void);
extern App app;
extern Battle battle;
extern Dev dev;
extern Entity *player;
extern Game game;
int isMissionAvailable(Mission *mission, Mission *prev);
void updateAllMissions(void);
Mission *getMission(char *filename);
void failMission(void);
void completeMission(void);
void loadMission(char *filename);
Mission *loadMissionMeta(char *filename);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,15 +18,24 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../galaxy/mission.h"
#include "../json/cJSON.h"
#include "../system/io.h"
#include "../system/lookup.h"
#include "../system/util.h"
#include "starSystems.h"
static void loadMissions(StarSystem *starSystem);
extern Game game;
static void loadMissions(StarSystem *starSystem);
static StarSystem *loadStarSystem(cJSON *starSystemJSON);
void initStarSystems(void)
{
cJSON *root, *node;
char *text;
cJSON *root, *node;
char *text;
StarSystem *starSystem, *tail;
tail = &game.starSystemHead;
@ -34,7 +43,7 @@ void initStarSystems(void)
text = readFile("data/galaxy/starSystems.json");
root = cJSON_Parse(text);
for (node = cJSON_GetObjectItem(root, "starSystems")->child ; node != NULL ; node = node->next)
for (node = cJSON_GetObjectItem(root, "starSystems")->child; node != NULL; node = node->next)
{
starSystem = loadStarSystem(node);
tail->next = starSystem;
@ -77,17 +86,17 @@ static StarSystem *loadStarSystem(cJSON *starSystemJSON)
static void loadMissions(StarSystem *starSystem)
{
int i, count;
char name[MAX_NAME_LENGTH];
char path[MAX_FILENAME_LENGTH];
char **filenames;
int i, count;
char name[MAX_NAME_LENGTH];
char path[MAX_FILENAME_LENGTH];
char **filenames;
Mission *mission, *tail;
tail = &starSystem->missionHead;
STRNCPY(name, starSystem->name, MAX_NAME_LENGTH);
for (i = 0 ; name[i] ; i++)
for (i = 0; name[i]; i++)
{
name[i] = tolower(name[i]);
}
@ -96,7 +105,7 @@ static void loadMissions(StarSystem *starSystem)
filenames = getFileList(path, &count);
for (i = 0 ; i < count ; i++)
for (i = 0; i < count; i++)
{
sprintf(path, "data/missions/%s/%s", name, filenames[i]);
@ -118,7 +127,7 @@ StarSystem *getStarSystem(char *name)
{
StarSystem *starSystem;
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
for (starSystem = game.starSystemHead.next; starSystem != NULL; starSystem = starSystem->next)
{
if (strcmp(starSystem->name, name) == 0)
{
@ -132,15 +141,15 @@ StarSystem *getStarSystem(char *name)
void updateStarSystemMissions(void)
{
StarSystem *starSystem;
Mission *mission, *prev;
Mission *mission, *prev;
game.completedMissions = game.totalMissions = game.availableMissions = 0;
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
for (starSystem = game.starSystemHead.next; starSystem != NULL; starSystem = starSystem->next)
{
starSystem->completedMissions = starSystem->availableMissions = starSystem->totalMissions = 0;
for (mission = starSystem->missionHead.next ; mission != NULL ; mission = mission->next)
for (mission = starSystem->missionHead.next; mission != NULL; mission = mission->next)
{
starSystem->totalMissions++;
@ -161,11 +170,11 @@ void updateStarSystemMissions(void)
}
}
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
for (starSystem = game.starSystemHead.next; starSystem != NULL; starSystem = starSystem->next)
{
prev = &starSystem->missionHead;
for (mission = starSystem->missionHead.next ; mission != NULL ; mission = mission->next)
for (mission = starSystem->missionHead.next; mission != NULL; mission = mission->next)
{
mission->available = starSystem->type == SS_SOL || isMissionAvailable(mission, prev);
@ -194,7 +203,7 @@ void updateStarSystemMissions(void)
void destroyStarSystems(void)
{
StarSystem *starSystem;
Mission *mission;
Mission *mission;
while (game.starSystemHead.next)
{

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,15 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
extern char **getFileList(char *dir, int *count);
extern int getJSONValue(cJSON *node, char *name, int defValue);
extern int isMissionAvailable(Mission *mission, Mission *prev);
extern Mission *loadMissionMeta(char *filename);
extern long lookup(char *name);
extern char *readFile(char *filename);
extern Game game;
void destroyStarSystems(void);
void updateStarSystemMissions(void);
StarSystem *getStarSystem(char *name);
void initStarSystems(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,20 +18,35 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../game/title.h"
#include "../json/cJSON.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/io.h"
#include "../system/sound.h"
#include "../system/text.h"
#include "../system/textures.h"
#include "../system/transition.h"
#include "credits.h"
#define CREDIT_LINE_LIMIT (UI_WIDTH - 300)
extern App app;
extern Colors colors;
static void loadCredits(void);
static void logic(void);
static void draw(void);
static void handleKeyboard(void);
void destroyCredits(void);
static SDL_Texture *background;
static AtlasImage *earthTexture;
static Credit head;
static Credit *tail;
static float creditSpeed;
static int timeout;
static AtlasImage *earthTexture;
static Credit head;
static Credit *tail;
static float creditSpeed;
static int timeout;
void initCredits(void)
{
@ -65,7 +80,7 @@ static void logic(void)
handleKeyboard();
for (c = head.next ; c != NULL ; c = c->next)
for (c = head.next; c != NULL; c = c->next)
{
c->y -= creditSpeed;
@ -95,7 +110,7 @@ static void draw(void)
app.textWidth = CREDIT_LINE_LIMIT;
for (c = head.next ; c != NULL ; c = c->next)
for (c = head.next; c != NULL; c = c->next)
{
if (c->y > -c->h && c->y < app.winHeight)
{
@ -108,9 +123,9 @@ static void draw(void)
static void loadCredits(void)
{
cJSON *root, *node;
int y, dist;
char *text;
cJSON *root, *node;
int y, dist;
char *text;
Credit *c;
y = app.winHeight + 100;
@ -120,7 +135,7 @@ static void loadCredits(void)
app.textWidth = CREDIT_LINE_LIMIT;
for (node = root->child ; node != NULL ; node = node->next)
for (node = root->child; node != NULL; node = node->next)
{
c = malloc(sizeof(Credit));
memset(c, 0, sizeof(Credit));

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,23 +18,5 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
#define CREDIT_LINE_LIMIT (UI_WIDTH - 300)
extern void blit(AtlasImage *atlasImage, int x, int y, int centered);
extern void drawBackground(SDL_Texture *texture);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern void endSectionTransition(void);
extern AtlasImage *getAtlasImage(const char *filename);
extern SDL_Texture *getTexture(const char *filename);
extern int getWrappedTextHeight(char *text, int size);
extern void initTitle(void);
extern void playMusic(char *filename, int loop);
extern char *readFile(char *filename);
extern void startSectionTransition(void);
extern void stopMusic(void);
extern App app;
extern Colors colors;
void destroyCredits(void);
void initCredits(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,31 +18,42 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/fighters.h"
#include "../system/draw.h"
#include "../system/text.h"
#include "../system/util.h"
#include "../system/widgets.h"
#include "fighterDatabase.h"
extern App app;
extern Colors colors;
extern Game game;
static void prevFighter(void);
static void nextFighter(void);
static int countFighterGuns(Entity *fighter, int type);
static int countFighterGuns(Entity *fighter, int type);
static void setNumDestroyed(void);
static int page;
static int maxPages;
static int numDestroyed;
static Widget *prev;
static Widget *next;
static char *DB_TEXT;
static char *PAGE_TEXT;
static char *COMMON_TEXT;
static char *DESTROYED_TEXT;
static char *AFFILIATION_TEXT;
static char *ARMOUR_TEXT;
static char *SHIELD_TEXT;
static char *SPEED_TEXT;
static char *MISSILES_TEXT;
static char *MISSILE_NUM_TEXT;
static int page;
static int maxPages;
static int numDestroyed;
static Widget *prev;
static Widget *next;
static char *DB_TEXT;
static char *PAGE_TEXT;
static char *COMMON_TEXT;
static char *DESTROYED_TEXT;
static char *AFFILIATION_TEXT;
static char *ARMOUR_TEXT;
static char *SHIELD_TEXT;
static char *SPEED_TEXT;
static char *MISSILES_TEXT;
static char *MISSILE_NUM_TEXT;
static const char *gunName[BT_MAX];
static Entity **dbFighters;
static float rotation;
static Entity **dbFighters;
static float rotation;
void initFighterDatabase(void)
{
@ -97,8 +108,8 @@ void doFighterDatabase(void)
void drawFighterDatabase(void)
{
SDL_Rect r;
Entity *fighter;
int i, y, numCannons;
Entity *fighter;
int i, y, numCannons;
SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND);
SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 128);
@ -141,7 +152,7 @@ void drawFighterDatabase(void)
y = 200;
for (i = 1 ; i < BT_MAX ; i++)
for (i = 1; i < BT_MAX; i++)
{
numCannons = countFighterGuns(fighter, i);
if (numCannons > 0)
@ -176,7 +187,7 @@ static int countFighterGuns(Entity *fighter, int type)
num = 0;
for (i = 0 ; i < MAX_FIGHTER_GUNS ; i++)
for (i = 0; i < MAX_FIGHTER_GUNS; i++)
{
if (fighter->guns[i].type == type)
{
@ -203,14 +214,14 @@ static void nextFighter(void)
static void setNumDestroyed(void)
{
Tuple *t;
Tuple *t;
Entity *fighter;
fighter = dbFighters[page];
numDestroyed = 0;
for (t = game.fighterStatHead.next ; t != NULL ; t = t->next)
for (t = game.fighterStatHead.next; t != NULL; t = t->next)
{
if (strcmp(t->key, fighter->name) == 0)
{

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,15 +18,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
extern void blitRotated(AtlasImage *atlasImage, int x, int y, float angle);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern void drawWidgets(char *groupName);
extern Entity **getDBFighters(int *num);
extern Widget *getWidget(const char *name, const char *group);
extern float mod(float n, float x);
extern App app;
extern Colors colors;
extern Game game;
void drawFighterDatabase(void);
void doFighterDatabase(void);
void initFighterDatabaseDisplay(void);
void destroyFighterDatabase(void);
void initFighterDatabase(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "game.h"
extern Game game;
void initGame(void)
{
memset(&game, 0, sizeof(Game));

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,6 +18,5 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
extern Game game;
void destroyGame(void);
void initGame(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,20 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/fighters.h"
#include "../challenges/challenges.h"
#include "../galaxy/mission.h"
#include "../galaxy/starSystems.h"
#include "../game/trophies.h"
#include "../json/cJSON.h"
#include "../system/io.h"
#include "../system/lookup.h"
#include "load.h"
extern Game game;
static void loadStats(cJSON *statsJSON);
static void loadStarSystems(cJSON *starSystemsJSON);
static void loadMissions(cJSON *missionsCJSON);
@ -30,7 +42,7 @@ static void loadFighterStats(cJSON *fighterStatsJSON);
void loadGame(void)
{
cJSON *root, *gameJSON;
char *text;
char *text;
text = readFile(getSaveFilePath(SAVE_FILENAME));
root = cJSON_Parse(text);
@ -56,9 +68,9 @@ void loadGame(void)
static void loadStarSystems(cJSON *starSystemsJSON)
{
StarSystem *starSystem;
cJSON *starSystemJSON;
cJSON *starSystemJSON;
for (starSystemJSON = starSystemsJSON->child ; starSystemJSON != NULL ; starSystemJSON = starSystemJSON->next)
for (starSystemJSON = starSystemsJSON->child; starSystemJSON != NULL; starSystemJSON = starSystemJSON->next)
{
starSystem = getStarSystem(cJSON_GetObjectItem(starSystemJSON, "name")->valuestring);
@ -71,9 +83,9 @@ static void loadStarSystems(cJSON *starSystemsJSON)
static void loadMissions(cJSON *missionsJSON)
{
Mission *mission;
cJSON *missionJSON;
cJSON *missionJSON;
for (missionJSON = missionsJSON->child ; missionJSON != NULL ; missionJSON = missionJSON->next)
for (missionJSON = missionsJSON->child; missionJSON != NULL; missionJSON = missionJSON->next)
{
mission = getMission(cJSON_GetObjectItem(missionJSON, "filename")->valuestring);
@ -86,18 +98,18 @@ static void loadMissions(cJSON *missionsJSON)
static void loadChallenges(cJSON *missionsJSON)
{
Mission *mission;
Mission *mission;
Challenge *challenge;
cJSON *missionJSON, *challengeJSON;
int type, value;
cJSON *missionJSON, *challengeJSON;
int type, value;
if (missionsJSON)
{
for (missionJSON = missionsJSON->child ; missionJSON != NULL ; missionJSON = missionJSON->next)
for (missionJSON = missionsJSON->child; missionJSON != NULL; missionJSON = missionJSON->next)
{
mission = getMission(cJSON_GetObjectItem(missionJSON, "filename")->valuestring);
for (challengeJSON = cJSON_GetObjectItem(missionJSON, "challenges")->child ; challengeJSON != NULL ; challengeJSON = challengeJSON->next)
for (challengeJSON = cJSON_GetObjectItem(missionJSON, "challenges")->child; challengeJSON != NULL; challengeJSON = challengeJSON->next)
{
type = lookup(cJSON_GetObjectItem(challengeJSON, "type")->valuestring);
value = cJSON_GetObjectItem(challengeJSON, "value")->valueint;
@ -115,10 +127,10 @@ static void loadChallenges(cJSON *missionsJSON)
static void loadStats(cJSON *statsJSON)
{
int i;
int i;
char *statName;
for (i = 0 ; i < STAT_MAX ; i++)
for (i = 0; i < STAT_MAX; i++)
{
statName = getLookupName("STAT_", i);
@ -132,11 +144,11 @@ static void loadStats(cJSON *statsJSON)
static void loadTrophies(cJSON *trophiesJSON)
{
Trophy *t;
cJSON *trophyJSON;
cJSON *trophyJSON;
if (trophiesJSON)
{
for (trophyJSON = trophiesJSON->child ; trophyJSON != NULL ; trophyJSON = trophyJSON->next)
for (trophyJSON = trophiesJSON->child; trophyJSON != NULL; trophyJSON = trophyJSON->next)
{
t = getTrophy(cJSON_GetObjectItem(trophyJSON, "id")->valuestring);
@ -160,7 +172,7 @@ static void loadFighterStats(cJSON *fighterStatsJSON)
if (fighterStatsJSON)
{
for (fighterStatJSON = fighterStatsJSON->child ; fighterStatJSON != NULL ; fighterStatJSON = fighterStatJSON->next)
for (fighterStatJSON = fighterStatsJSON->child; fighterStatJSON != NULL; fighterStatJSON = fighterStatJSON->next)
{
t = malloc(sizeof(Tuple));
memset(t, 0, sizeof(Tuple));

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,18 +18,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
extern void destroyFighterStats(void);
extern Challenge *getChallenge(Mission *mission, int type, int value);
extern char *getLookupName(char *prefix, long num);
extern Mission *getMission(char *filename);
extern char *getSaveFilePath(char *filename);
extern StarSystem *getStarSystem(char *name);
extern Trophy *getTrophy(char *id);
extern int lookup(char *lookup);
extern char *readFile(char *filename);
extern Game game;
void loadGame(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,24 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <SDL2/SDL_mixer.h>
#include "../common.h"
#include "../battle/starfield.h"
#include "../system/controls.h"
#include "../system/draw.h"
#include "../system/init.h"
#include "../system/text.h"
#include "../system/widgets.h"
#include "options.h"
#define SHOW_CONTROLS 1
#define SHOW_MAIN 0
extern App app;
extern Colors colors;
static void changeWindowSize(char *value);
static void changeSoundVolume(char *value);
static void changeMusicVolume(char *value);
@ -30,7 +46,7 @@ static void drawMain(void);
static void controls(void);
static void (*returnFromOptions)(void);
static int show;
static int show;
static char *OPTIONS_TEXT;
static char *RESOLUTION_TEXT;
@ -62,11 +78,11 @@ void initOptions(void (*rtn)(void))
OPTIONS_TEXT = _("Options");
RESOLUTION_TEXT = _("Note: you must restart the game for window size and fullscreen options to take effect.");
#if FIXED_RESOLUTION
#if FIXED_RESOLUTION
getWidget("windowSize", "options")->enabled = 0;
getWidget("fullscreen", "options")->enabled = 0;
RESOLUTION_TEXT = _("Note: this device does not support changing the screen resolution.");
#endif
#endif
returnFromOptions = rtn;
@ -127,14 +143,14 @@ static void drawMain(void)
void updateCustomResolutionOption(void)
{
Widget *w;
char value[MAX_NAME_LENGTH];
int i;
char value[MAX_NAME_LENGTH];
int i;
sprintf(value, "%d x %d", app.winWidth, app.winHeight);
w = getWidget("windowSize", "options");
for (i = 0 ; i < w->numOptions - 1 ; i++)
for (i = 0; i < w->numOptions - 1; i++)
{
if (strcmp(w->options[i], value) == 0)
{
@ -190,7 +206,7 @@ static void changeFullscreen(char *value)
{
app.fullscreen = strcmp(value, "On") == 0;
SDL_SetWindowFullscreen(app.window, app.fullscreen? SDL_WINDOW_FULLSCREEN : 0);
SDL_SetWindowFullscreen(app.window, app.fullscreen ? SDL_WINDOW_FULLSCREEN : 0);
}
static void ok(void)

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,23 +18,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "SDL2/SDL_mixer.h"
#define SHOW_CONTROLS 1
#define SHOW_MAIN 0
extern void drawControls(void);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern void drawWidgets(char *groupName);
extern Widget *getWidget(const char *name, const char *group);
extern void initControlsDisplay(void);
extern void initGraphics(void);
extern void initStars(void);
extern void saveConfig(void);
extern void selectWidget(const char *name, const char *group);
extern void setWidgetOption(const char *name, const char *group, const char *value);
extern App app;
extern Colors colors;
void updateCustomResolutionOption(void);
void drawOptions(void);
void initOptions(void (*rtn)(void));

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,18 +18,25 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
#include "../system/io.h"
#include "../system/lookup.h"
#include "save.h"
static void saveStarSystems(cJSON *gameJSON);
static void saveChallenges(cJSON *gameJSON);
extern Game game;
static void saveStarSystems(cJSON *gameJSON);
static void saveChallenges(cJSON *gameJSON);
static cJSON *getMissionsJSON(StarSystem *starSystem);
static void saveStats(cJSON *gameJSON);
static void saveTrophies(cJSON *gameJSON);
static void saveFighterStats(cJSON *gameJSON);
static void saveStats(cJSON *gameJSON);
static void saveTrophies(cJSON *gameJSON);
static void saveFighterStats(cJSON *gameJSON);
void saveGame(void)
{
char *out;
char *out;
cJSON *root, *gameJSON;
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Saving Game ...");
@ -60,12 +67,12 @@ void saveGame(void)
static void saveStarSystems(cJSON *gameJSON)
{
cJSON *starSystemJSON, *starSystemsJSON;
cJSON *starSystemJSON, *starSystemsJSON;
StarSystem *starSystem;
starSystemsJSON = cJSON_CreateArray();
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
for (starSystem = game.starSystemHead.next; starSystem != NULL; starSystem = starSystem->next)
{
if (starSystem->totalMissions > 0)
{
@ -84,12 +91,12 @@ static void saveStarSystems(cJSON *gameJSON)
static cJSON *getMissionsJSON(StarSystem *starSystem)
{
cJSON *missionJSON, *missionsJSON;
cJSON *missionJSON, *missionsJSON;
Mission *mission;
missionsJSON = cJSON_CreateArray();
for (mission = starSystem->missionHead.next ; mission != NULL ; mission = mission->next)
for (mission = starSystem->missionHead.next; mission != NULL; mission = mission->next)
{
missionJSON = cJSON_CreateObject();
@ -104,14 +111,14 @@ static cJSON *getMissionsJSON(StarSystem *starSystem)
static void saveChallenges(cJSON *gameJSON)
{
int i;
Mission *mission;
int i;
Mission *mission;
Challenge *c;
cJSON *missionsJSON, *missionJSON, *challengesJSON, *challengeJSON;
cJSON *missionsJSON, *missionJSON, *challengesJSON, *challengeJSON;
missionsJSON = cJSON_CreateArray();
for (mission = game.challengeMissionHead.next ; mission != NULL ; mission = mission->next)
for (mission = game.challengeMissionHead.next; mission != NULL; mission = mission->next)
{
missionJSON = cJSON_CreateObject();
@ -119,7 +126,7 @@ static void saveChallenges(cJSON *gameJSON)
challengesJSON = cJSON_CreateArray();
for (i = 0 ; i < MAX_CHALLENGES ; i++)
for (i = 0; i < MAX_CHALLENGES; i++)
{
c = mission->challengeData.challenges[i];
@ -148,7 +155,7 @@ static void saveStats(cJSON *gameJSON)
cJSON *stats = cJSON_CreateObject();
for (i = 0 ; i < STAT_MAX ; i++)
for (i = 0; i < STAT_MAX; i++)
{
cJSON_AddNumberToObject(stats, getLookupName("STAT_", i), game.stats[i]);
}
@ -159,11 +166,11 @@ static void saveStats(cJSON *gameJSON)
static void saveTrophies(cJSON *gameJSON)
{
Trophy *t;
cJSON *trophiesJSON, *trophyJSON;
cJSON *trophiesJSON, *trophyJSON;
trophiesJSON = cJSON_CreateArray();
for (t = game.trophyHead.next ; t != NULL ; t = t->next)
for (t = game.trophyHead.next; t != NULL; t = t->next)
{
if (t->awarded)
{
@ -186,7 +193,7 @@ static void saveFighterStats(cJSON *gameJSON)
fighterStatsJSON = cJSON_CreateArray();
for (t = game.fighterStatHead.next ; t != NULL ; t = t->next)
for (t = game.fighterStatHead.next; t != NULL; t = t->next)
{
fighterStatJSON = cJSON_CreateObject();

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,12 +18,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
extern char *getLookupName(char *prefix, long num);
extern char *getSaveFilePath(char *filename);
extern int writeFile(char *filename, char *data);
extern Game game;
void saveGame(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,20 +18,30 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../system/text.h"
#include "../system/util.h"
#include "../system/widgets.h"
#include "stats.h"
#define STATS_PER_PAGE 9
extern App app;
extern Colors colors;
extern Game game;
static void prevPage(void);
static void nextPage(void);
static void calculatePercentComplete(void);
void updateAccuracyStats(unsigned int *stats);
static char *statDescription[STAT_MAX];
static int page;
static float maxPages;
static char *statDescription[STAT_MAX];
static int page;
static float maxPages;
static Widget *prev;
static Widget *next;
static char *STATS_TEXT;
static char *PAGE_TEXT;
static char *STATS_TEXT;
static char *PAGE_TEXT;
void initStats(void)
{
@ -103,12 +113,12 @@ void initStatsDisplay(void)
static void calculatePercentComplete(void)
{
StarSystem *starSystem;
Mission *mission;
int completed, total;
Mission *mission;
int completed, total;
completed = total = 0;
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
for (starSystem = game.starSystemHead.next; starSystem != NULL; starSystem = starSystem->next)
{
if (starSystem->type == SS_NORMAL)
{
@ -117,7 +127,7 @@ static void calculatePercentComplete(void)
}
}
for (mission = game.challengeMissionHead.next ; mission != NULL ; mission = mission->next)
for (mission = game.challengeMissionHead.next; mission != NULL; mission = mission->next)
{
completed += mission->completedChallenges;
total += mission->totalChallenges;
@ -128,7 +138,7 @@ static void calculatePercentComplete(void)
void drawStats(void)
{
int i, y, startIndex;
int i, y, startIndex;
SDL_Rect r;
SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND);
@ -159,7 +169,7 @@ void drawStats(void)
startIndex = (page * STATS_PER_PAGE);
for (i = startIndex ; i < startIndex + STATS_PER_PAGE ; i++)
for (i = startIndex; i < startIndex + STATS_PER_PAGE; i++)
{
if (i < STAT_TIME)
{

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,16 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#define STATS_PER_PAGE 9
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern void drawWidgets(char *groupName);
extern int getPercent(float current, float total);
extern Widget *getWidget(const char *name, const char *group);
extern char *timeToString(long millis, int showHours);
extern App app;
extern Colors colors;
extern Game game;
void updateAccuracyStats(unsigned int *stats);
void drawStats(void);
void initStatsDisplay(void);
void initStats(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,42 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../battle/battle.h"
#include "../battle/effects.h"
#include "../battle/starfield.h"
#include "../challenges/challengeHome.h"
#include "../galaxy/galacticMap.h"
#include "../galaxy/mission.h"
#include "../game/credits.h"
#include "../game/fighterDatabase.h"
#include "../game/options.h"
#include "../game/stats.h"
#include "../game/trophies.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/input.h"
#include "../system/sound.h"
#include "../system/text.h"
#include "../system/textures.h"
#include "../system/transition.h"
#include "../system/widgets.h"
#include "title.h"
#define NUM_FIGHTERS 12
#define SHOW_FIGHTER_DB 4
#define SHOW_OPTIONS 2
#define SHOW_STATS 1
#define SHOW_TITLE 0
#define SHOW_TROPHIES 3
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *self;
extern Game game;
static void logic(void);
static void draw(void);
static void handleKeyboard(void);
@ -38,13 +72,13 @@ static void quit(void);
static void returnFromOptions(void);
static SDL_Texture *background;
static AtlasImage *logo[2];
static AtlasImage *pandoranWar;
static AtlasImage *earthTexture;
static PointF earth;
static Entity fighters[NUM_FIGHTERS];
static const char *fighterTextures[] = {"gfx/fighters/firefly.png", "gfx/fighters/hammerhead.png", "gfx/fighters/hyena.png", "gfx/fighters/lynx.png", "gfx/fighters/kingfisher.png", "gfx/fighters/leopard.png", "gfx/fighters/nymph.png", "gfx/fighters/ray.png", "gfx/fighters/rook.png", "gfx/fighters/taf.png"};
static int show;
static AtlasImage *logo[2];
static AtlasImage *pandoranWar;
static AtlasImage *earthTexture;
static PointF earth;
static Entity fighters[NUM_FIGHTERS];
static const char *fighterTextures[] = {"gfx/fighters/firefly.png", "gfx/fighters/hammerhead.png", "gfx/fighters/hyena.png", "gfx/fighters/lynx.png", "gfx/fighters/kingfisher.png", "gfx/fighters/leopard.png", "gfx/fighters/nymph.png", "gfx/fighters/ray.png", "gfx/fighters/rook.png", "gfx/fighters/taf.png"};
static int show;
void initTitle(void)
{
@ -56,7 +90,7 @@ void initTitle(void)
app.delegate.draw = &draw;
memset(&app.keyboard, 0, sizeof(int) * MAX_KEYBOARD_KEYS);
battle.camera.x = battle.camera.y = 0;
battle.camera.x = battle.camera.y = 0;
destroyBattle();
@ -104,11 +138,11 @@ static void initFighters(void)
{
int i, numTextures;
numTextures = sizeof(fighterTextures) / sizeof(char*);
numTextures = sizeof(fighterTextures) / sizeof(char *);
memset(&fighters, 0, sizeof(Entity) * NUM_FIGHTERS);
for (i = 0 ; i < NUM_FIGHTERS ; i++)
for (i = 0; i < NUM_FIGHTERS; i++)
{
fighters[i].x = rand() % (app.winWidth - 32);
fighters[i].y = app.winHeight + (rand() % app.winHeight);
@ -151,9 +185,9 @@ static void doFighters(void)
{
int i, numTextures;
numTextures = sizeof(fighterTextures) / sizeof(char*);
numTextures = sizeof(fighterTextures) / sizeof(char *);
for (i = 0 ; i < NUM_FIGHTERS ; i++)
for (i = 0; i < NUM_FIGHTERS; i++)
{
self = &fighters[i];
@ -195,7 +229,7 @@ static void draw(void)
blit(pandoranWar, app.winWidth / 2, 110, 1);
drawText(10, app.winHeight - 25, 14, TA_LEFT, colors.white, "Copyright Parallel Realities, 2015-2019");
drawText(10, app.winHeight - 25, 14, TA_LEFT, colors.white, "Copyright,2022 Parallel Realities, 2015-2019,2022");
drawText(app.winWidth - 10, app.winHeight - 25, 14, TA_RIGHT, colors.white, "Version %.2f.%d", VERSION, REVISION);
switch (show)
@ -230,7 +264,7 @@ static void drawFighters(void)
setAtlasColor(255, 255, 255, 255);
for (i = 0 ; i < NUM_FIGHTERS ; i++)
for (i = 0; i < NUM_FIGHTERS; i++)
{
blit(fighters[i].texture, fighters[i].x, fighters[i].y, 1);
}

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,56 +18,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#define NUM_FIGHTERS 12
#define SHOW_FIGHTER_DB 4
#define SHOW_OPTIONS 2
#define SHOW_STATS 1
#define SHOW_TITLE 0
#define SHOW_TROPHIES 3
extern void addEngineEffect(void);
extern void autoSizeWidgetButtons(char *group, int recenter);
extern void blit(AtlasImage *atlasImage, int x, int y, int centered);
extern void clearInput(void);
extern void destroyBattle(void);
extern void doEffects(void);
extern void doFighterDatabase(void);
extern void doStars(float dx, float dy);
extern void doWidgets(void);
extern void drawBackground(SDL_Texture *texture);
extern void drawEffects(void);
extern void drawFighterDatabase(void);
extern void drawOptions(void);
extern void drawStars(void);
extern void drawStats(void);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern void drawTrophies(void);
extern void drawWidgets(char *groupName);
extern void endSectionTransition(void);
extern AtlasImage *getAtlasImage(const char *filename);
extern SDL_Texture *getTexture(const char *filename);
extern Widget *getWidget(const char *name, const char *group);
extern void initChallengeHome(void);
extern void initCredits(void);
extern void initEffects(void);
extern void initFighterDatabaseDisplay(void);
extern void initGalacticMap(void);
extern void initOptions(void (*returnFromOptions)(void));
extern void initStatsDisplay(void);
extern void initTrophiesDisplay(void);
extern void playMusic(char *filename, int loop);
extern void playSound(int id);
extern void scrollBackground(float x, float y);
extern void selectWidget(const char *name, const char *group);
extern void setAtlasColor(int r, int g, int b, int a);
extern void startSectionTransition(void);
extern void stopMusic(void);
extern void updateAllMissions(void);
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *self;
extern Game game;
void initTitle(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,30 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <time.h>
#include "../common.h"
#include "../battle/entities.h"
#include "../json/cJSON.h"
#include "../system/atlas.h"
#include "../system/draw.h"
#include "../system/io.h"
#include "../system/lookup.h"
#include "../system/sound.h"
#include "../system/text.h"
#include "../system/util.h"
#include "../system/widgets.h"
#include "trophies.h"
#define TROPHIES_PER_PAGE 4
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *player;
extern Game game;
static void prevPage(void);
static void nextPage(void);
static void loadTrophyData(char *filename);
@ -27,24 +49,24 @@ static void resetAlert(void);
static void setSparkleColor(Trophy *t);
static void nextAlert(void);
static Trophy *alertTrophy;
static Trophy *alertTrophy;
static AtlasImage *trophyIcons[TROPHY_MAX];
static AtlasImage *sparkle;
static AtlasImage *alertSphere;
static SDL_Rect alertRect;
static int alertTimer;
static int page;
static int awarded;
static int total;
static int boxWidth;
static float sparkleAngle;
static float maxPages;
static Widget *prev;
static Widget *next;
static char *TROPHIES_TEXT;
static char *AWARDED_TEXT;
static char *PAGE_TEXT;
static char *HIDDEN_TEXT;
static SDL_Rect alertRect;
static int alertTimer;
static int page;
static int awarded;
static int total;
static int boxWidth;
static float sparkleAngle;
static float maxPages;
static Widget *prev;
static Widget *next;
static char *TROPHIES_TEXT;
static char *AWARDED_TEXT;
static char *PAGE_TEXT;
static char *HIDDEN_TEXT;
void initTrophies(void)
{
@ -73,12 +95,12 @@ void initTrophies(void)
void initTrophiesDisplay(void)
{
int w, h;
int w, h;
Trophy *t;
boxWidth = total = awarded = 0;
for (t = game.trophyHead.next ; t != NULL ; t = t->next)
for (t = game.trophyHead.next; t != NULL; t = t->next)
{
total++;
@ -129,9 +151,9 @@ static void prevPage(void)
void drawTrophies(void)
{
Trophy *t;
Trophy *t;
SDL_Rect r;
int start, end, i, x, y;
int start, end, i, x, y;
SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND);
SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 128);
@ -163,7 +185,7 @@ void drawTrophies(void)
end = start + TROPHIES_PER_PAGE;
i = 0;
for (t = game.trophyHead.next ; t != NULL ; t = t->next)
for (t = game.trophyHead.next; t != NULL; t = t->next)
{
if (i >= start && i < end)
{
@ -210,11 +232,11 @@ void drawTrophies(void)
void awardTrophy(char *id)
{
Trophy *t;
int numRemaining;
int numRemaining;
numRemaining = 0;
for (t = game.trophyHead.next ; t != NULL ; t = t->next)
for (t = game.trophyHead.next; t != NULL; t = t->next)
{
if (!t->awarded && strcmp(t->id, id) == 0)
{
@ -270,10 +292,10 @@ void doTrophyAlerts(void)
static void nextAlert(void)
{
int w, h;
int w, h;
Trophy *t;
for (t = game.trophyHead.next ; t != NULL ; t = t->next)
for (t = game.trophyHead.next; t != NULL; t = t->next)
{
if (t->notify)
{
@ -336,7 +358,7 @@ Trophy *getTrophy(char *id)
{
Trophy *t;
for (t = game.trophyHead.next ; t != NULL ; t = t->next)
for (t = game.trophyHead.next; t != NULL; t = t->next)
{
if (strcmp(t->id, id) == 0)
{
@ -349,10 +371,10 @@ Trophy *getTrophy(char *id)
static void loadTrophyData(char *filename)
{
cJSON *root, *node;
char *text;
cJSON *root, *node;
char *text;
Trophy *t, *tail;
int count[TROPHY_MAX];
int count[TROPHY_MAX];
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename);
@ -363,7 +385,7 @@ static void loadTrophyData(char *filename)
memset(count, 0, sizeof(int) * TROPHY_MAX);
for (node = root->child ; node != NULL ; node = node->next)
for (node = root->child; node != NULL; node = node->next)
{
if (cJSON_GetObjectItem(node, "id")->valuestring[0] != '_')
{
@ -402,9 +424,9 @@ static void loadTrophyData(char *filename)
void awardStatsTrophies(void)
{
Trophy *t;
Tuple *tp;
Tuple *tp;
for (t = game.trophyHead.next ; t != NULL ; t = t->next)
for (t = game.trophyHead.next; t != NULL; t = t->next)
{
if (t->stat != -1 && !t->awarded && (game.stats[t->stat] + battle.stats[t->stat]) >= t->statValue)
{
@ -413,7 +435,7 @@ void awardStatsTrophies(void)
}
/* check to see if we've destroyed one of each common starfighter */
for (tp = game.fighterStatHead.next ; tp != NULL ; tp = tp->next)
for (tp = game.fighterStatHead.next; tp != NULL; tp = tp->next)
{
if (tp->value == 0)
{
@ -426,9 +448,9 @@ void awardStatsTrophies(void)
void awardCampaignTrophies(void)
{
char trophyId[MAX_NAME_LENGTH];
char name[MAX_NAME_LENGTH];
int i, len;
char trophyId[MAX_NAME_LENGTH * 2];
char name[MAX_NAME_LENGTH];
int i, len;
StarSystem *starSystem;
if (game.completedMissions)
@ -437,7 +459,7 @@ void awardCampaignTrophies(void)
}
/* check if all star system missions are completed */
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
for (starSystem = game.starSystemHead.next; starSystem != NULL; starSystem = starSystem->next)
{
if (starSystem->totalMissions && starSystem->completedMissions == starSystem->totalMissions)
{
@ -445,7 +467,7 @@ void awardCampaignTrophies(void)
len = strlen(starSystem->name);
for (i = 0 ; i < len ; i++)
for (i = 0; i < len; i++)
{
name[i] = toupper(starSystem->name[i]);
}
@ -459,7 +481,7 @@ void awardCampaignTrophies(void)
void awardChallengeTrophies(void)
{
char trophyId[MAX_NAME_LENGTH];
int completed;
int completed;
/* check % of challenges completed - 25% increments*/
completed = (getPercent(game.completedChallenges, game.totalChallenges) / 25) * 25;

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,34 +18,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
#include "time.h"
#define TROPHIES_PER_PAGE 4
extern void awardPandoranCraftTrophy(void);
extern void blit(AtlasImage *atlasImage, int x, int y, int centered);
extern void blitRotated(AtlasImage *atlasImage, int x, int y, float angle);
extern void blitScaled(AtlasImage *atlasImage, int x, int y, int w, int h, int center);
extern void calcTextDimensions(char *text, int size, int *w, int *h);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern void drawWidgets(char *groupName);
extern AtlasImage *getAtlasImage(char *filename);
extern int getJSONValue(cJSON *node, char *name, int defValue);
extern int getPercent(float current, float total);
extern Widget *getWidget(const char *name, const char *group);
extern long lookup(char *name);
extern float mod(float n, float x);
extern void playSound(int id);
extern char *readFile(char *filename);
extern void setAtlasColor(int r, int g, int b, int a);
extern char *timeToDate(long millis);
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *player;
extern Game game;
void awardCraftTrophy(void);
void awardPostMissionTrophies(void);
void awardChallengeTrophies(void);
void awardCampaignTrophies(void);
void awardStatsTrophies(void);
Trophy *getTrophy(char *id);
void drawTrophyAlert(void);
void doTrophyAlerts(void);
void awardTrophy(char *id);
void drawTrophies(void);
void initTrophiesDisplay(void);
void initTrophies(void);

File diff suppressed because it is too large Load Diff

View File

@ -29,118 +29,119 @@ extern "C"
#endif
/* cJSON Types: */
#define cJSON_False 0
#define cJSON_True 1
#define cJSON_NULL 2
#define cJSON_False 0
#define cJSON_True 1
#define cJSON_NULL 2
#define cJSON_Number 3
#define cJSON_String 4
#define cJSON_Array 5
#define cJSON_Array 5
#define cJSON_Object 6
#define cJSON_IsReference 256
#define cJSON_IsReference 256
#define cJSON_StringIsConst 512
/* The cJSON structure: */
typedef struct cJSON {
struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
/* The cJSON structure: */
typedef struct cJSON
{
struct cJSON *next, *prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
int type; /* The type of the item, as above. */
int type; /* The type of the item, as above. */
char *valuestring; /* The item's string, if type==cJSON_String */
int valueint; /* The item's number, if type==cJSON_Number */
double valuedouble; /* The item's number, if type==cJSON_Number */
char *valuestring; /* The item's string, if type==cJSON_String */
int valueint; /* The item's number, if type==cJSON_Number */
double valuedouble; /* The item's number, if type==cJSON_Number */
char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
} cJSON;
char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
} cJSON;
typedef struct cJSON_Hooks {
void *(*malloc_fn)(size_t sz);
void (*free_fn)(void *ptr);
} cJSON_Hooks;
typedef struct cJSON_Hooks
{
void *(*malloc_fn)(size_t sz);
void (*free_fn)(void *ptr);
} cJSON_Hooks;
/* Supply malloc, realloc and free functions to cJSON */
extern void cJSON_InitHooks(cJSON_Hooks* hooks);
/* Supply malloc, realloc and free functions to cJSON */
extern void cJSON_InitHooks(cJSON_Hooks *hooks);
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */
extern cJSON *cJSON_Parse(const char *value);
/* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */
extern char *cJSON_Print(cJSON *item);
/* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */
extern char *cJSON_PrintUnformatted(cJSON *item);
/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
extern char *cJSON_PrintBuffered(cJSON *item, int prebuffer, int fmt);
/* Delete a cJSON entity and all subentities. */
extern void cJSON_Delete(cJSON *c);
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */
extern cJSON *cJSON_Parse(const char *value);
/* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */
extern char *cJSON_Print(cJSON *item);
/* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */
extern char *cJSON_PrintUnformatted(cJSON *item);
/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
extern char *cJSON_PrintBuffered(cJSON *item,int prebuffer,int fmt);
/* Delete a cJSON entity and all subentities. */
extern void cJSON_Delete(cJSON *c);
/* Returns the number of items in an array (or object). */
extern int cJSON_GetArraySize(cJSON *array);
/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */
extern cJSON *cJSON_GetArrayItem(cJSON *array, int item);
/* Get item "string" from object. Case insensitive. */
extern cJSON *cJSON_GetObjectItem(cJSON *object, const char *string);
/* Returns the number of items in an array (or object). */
extern int cJSON_GetArraySize(cJSON *array);
/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */
extern cJSON *cJSON_GetArrayItem(cJSON *array,int item);
/* Get item "string" from object. Case insensitive. */
extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
extern const char *cJSON_GetErrorPtr(void);
/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
extern const char *cJSON_GetErrorPtr(void);
/* These calls create a cJSON item of the appropriate type. */
extern cJSON *cJSON_CreateNull(void);
extern cJSON *cJSON_CreateTrue(void);
extern cJSON *cJSON_CreateFalse(void);
extern cJSON *cJSON_CreateBool(int b);
extern cJSON *cJSON_CreateNumber(double num);
extern cJSON *cJSON_CreateString(const char *string);
extern cJSON *cJSON_CreateArray(void);
extern cJSON *cJSON_CreateObject(void);
/* These calls create a cJSON item of the appropriate type. */
extern cJSON *cJSON_CreateNull(void);
extern cJSON *cJSON_CreateTrue(void);
extern cJSON *cJSON_CreateFalse(void);
extern cJSON *cJSON_CreateBool(int b);
extern cJSON *cJSON_CreateNumber(double num);
extern cJSON *cJSON_CreateString(const char *string);
extern cJSON *cJSON_CreateArray(void);
extern cJSON *cJSON_CreateObject(void);
/* These utilities create an Array of count items. */
extern cJSON *cJSON_CreateIntArray(const int *numbers, int count);
extern cJSON *cJSON_CreateFloatArray(const float *numbers, int count);
extern cJSON *cJSON_CreateDoubleArray(const double *numbers, int count);
extern cJSON *cJSON_CreateStringArray(const char **strings, int count);
/* These utilities create an Array of count items. */
extern cJSON *cJSON_CreateIntArray(const int *numbers,int count);
extern cJSON *cJSON_CreateFloatArray(const float *numbers,int count);
extern cJSON *cJSON_CreateDoubleArray(const double *numbers,int count);
extern cJSON *cJSON_CreateStringArray(const char **strings,int count);
/* Append item to the specified array/object. */
extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
extern void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
extern void cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item); /* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object */
/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
extern void cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);
/* Append item to the specified array/object. */
extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
extern void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
extern void cJSON_AddItemToObjectCS(cJSON *object,const char *string,cJSON *item); /* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object */
/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
extern void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item);
/* Remove/Detatch items from Arrays/Objects. */
extern cJSON *cJSON_DetachItemFromArray(cJSON *array, int which);
extern void cJSON_DeleteItemFromArray(cJSON *array, int which);
extern cJSON *cJSON_DetachItemFromObject(cJSON *object, const char *string);
extern void cJSON_DeleteItemFromObject(cJSON *object, const char *string);
/* Remove/Detatch items from Arrays/Objects. */
extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which);
extern void cJSON_DeleteItemFromArray(cJSON *array,int which);
extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string);
extern void cJSON_DeleteItemFromObject(cJSON *object,const char *string);
/* Update array items. */
extern void cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */
extern void cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
extern void cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem);
/* Update array items. */
extern void cJSON_InsertItemInArray(cJSON *array,int which,cJSON *newitem); /* Shifts pre-existing items to the right. */
extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem);
extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
/* Duplicate a cJSON item */
extern cJSON *cJSON_Duplicate(cJSON *item, int recurse);
/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
need to be released. With recurse!=0, it will duplicate any children connected to the item.
The item->next and ->prev pointers are always zero on return from Duplicate. */
/* Duplicate a cJSON item */
extern cJSON *cJSON_Duplicate(cJSON *item,int recurse);
/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
need to be released. With recurse!=0, it will duplicate any children connected to the item.
The item->next and ->prev pointers are always zero on return from Duplicate. */
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
extern cJSON *cJSON_ParseWithOpts(const char *value, const char **return_parse_end, int require_null_terminated);
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
extern cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated);
extern void cJSON_Minify(char *json);
extern void cJSON_Minify(char *json);
/* Macros for creating things quickly. */
#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull())
#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
#define cJSON_AddNullToObject(object, name) cJSON_AddItemToObject(object, name, cJSON_CreateNull())
#define cJSON_AddTrueToObject(object, name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
#define cJSON_AddFalseToObject(object, name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
#define cJSON_AddBoolToObject(object, name, b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
#define cJSON_AddNumberToObject(object, name, n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
#define cJSON_AddStringToObject(object, name, s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
/* When assigning an integer value, it needs to be propagated to valuedouble too. */
#define cJSON_SetIntValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val))
#define cJSON_SetNumberValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val))
#define cJSON_SetIntValue(object, val) ((object) ? (object)->valueint = (object)->valuedouble = (val) : (val))
#define cJSON_SetNumberValue(object, val) ((object) ? (object)->valueint = (object)->valuedouble = (val) : (val))
#ifdef __cplusplus
}

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,7 +18,34 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <time.h>
#include "common.h"
#include "game/credits.h"
#include "game/load.h"
#include "game/save.h"
#include "game/title.h"
#include "game/trophies.h"
#include "main.h"
#include "plat/win32/win32Init.h"
#include "system/controls.h"
#include "system/dev.h"
#include "system/draw.h"
#include "system/init.h"
#include "system/input.h"
#include "system/io.h"
#include "system/lookup.h"
#include "system/modalDialog.h"
#include "test/testMission.h"
App app;
Battle battle;
Colors colors;
Dev dev;
Entity *player;
Entity *self;
Game game;
static void handleMissionArgs(int argc, char *argv[]);
static void handleLoggingArgs(int argc, char *argv[]);
@ -26,7 +53,7 @@ static void capFrameRate(long *then, float *remainder);
int main(int argc, char *argv[])
{
long then, lastFrameTime, frames;
long then, lastFrameTime, frames;
float remainder;
memset(&app, 0, sizeof(App));
@ -166,7 +193,7 @@ static void handleLoggingArgs(int argc, char *argv[])
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN);
for (i = 1 ; i < argc ; i++)
for (i = 1; i < argc; i++)
{
if (strcmp(argv[i], "-debug") == 0)
{
@ -188,7 +215,7 @@ static void handleMissionArgs(int argc, char *argv[])
showCredits = testingMission = 0;
for (i = 1 ; i < argc ; i++)
for (i = 1; i < argc; i++)
{
/* assume this is filename for testing */
if (strcmp(argv[i], "-mission") == 0)

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,41 +18,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "SDL2/SDL.h"
#include "time.h"
#include "defs.h"
#include "structs.h"
extern void cleanup(void);
extern void clearControl(int type);
extern void createScreenshotFolder(void);
extern void doDevKeys(void);
extern void doInput(void);
extern void doModalDialog(void);
extern void doTrophyAlerts(void);
extern void drawModalDialog(void);
extern void drawTrophyAlert(void);
extern int fileExists(char *filename);
extern char *getSaveFilePath(char *filename);
extern void init18N(int argc, char *argv[]);
extern void initCredits(void);
extern void initGameSystem(void);
extern void initLookups(void);
extern void initSDL(int argc, char *argv[]);
extern void initTitle(void);
extern int isControl(int type);
extern void loadGame(void);
extern void loadTestMission(char *filename);
extern void prepareScene(void);
extern void presentScene(void);
extern void saveGame(void);
extern void saveScreenshot(void);
App app;
Battle battle;
Colors colors;
Dev dev;
Entity *player;
Entity *self;
Game game;
int main(int argc, char *argv[]);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,12 +18,22 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <errno.h>
#include <pwd.h>
#include <sys/stat.h>
#include <unistd.h>
#include "../../common.h"
#include "unixInit.h"
extern App app;
extern Dev dev;
void createSaveFolder(void)
{
char *userHome;
char dir[MAX_FILENAME_LENGTH];
char dir[MAX_FILENAME_LENGTH];
userHome = getenv("HOME");
@ -36,7 +46,7 @@ void createSaveFolder(void)
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "User home = %s", userHome);
sprintf(dir, "%s/.local/share/tbftss", userHome);
if (mkdir(dir, S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH) != 0 && errno != EEXIST)
if (mkdir(dir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0 && errno != EEXIST)
{
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Failed to create save dir '%s'. Will save to current dir.", dir);
return;
@ -47,7 +57,7 @@ void createSaveFolder(void)
void createScreenshotFolder(void)
{
mkdir("/tmp/tbftss", S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH);
mkdir("/tmp/tbftss", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
dev.screenshotFolder = "/tmp/tbftss";
}

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,12 +18,5 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <sys/stat.h>
#include <pwd.h>
#include <unistd.h>
#include <errno.h>
#include "../../common.h"
extern App app;
extern Dev dev;
void createScreenshotFolder(void);
void createSaveFolder(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,12 +18,21 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
#include "../../common.h"
#include "win32Init.h"
extern App app;
extern Dev dev;
void createSaveFolder(void)
{
char *userHome;
char dir[MAX_FILENAME_LENGTH];
char dir[MAX_FILENAME_LENGTH];
userHome = getenv("USERPROFILE");

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,11 +18,5 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include "../../common.h"
extern App app;
extern Dev dev;
void createScreenshotFolder(void);
void createSaveFolder(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,67 +18,71 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
typedef struct Texture Texture;
typedef struct Lookup Lookup;
typedef struct Weapon Weapon;
typedef struct Quadtree Quadtree;
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;
typedef struct Mission Mission;
typedef struct Pulse Pulse;
typedef struct Widget Widget;
typedef struct HudMessage HudMessage;
typedef struct MessageBox MessageBox;
typedef struct Texture Texture;
typedef struct Lookup Lookup;
typedef struct Weapon Weapon;
typedef struct Quadtree Quadtree;
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;
typedef struct Mission Mission;
typedef struct Pulse Pulse;
typedef struct Widget Widget;
typedef struct HudMessage HudMessage;
typedef struct MessageBox MessageBox;
typedef struct ScriptRunner ScriptRunner;
typedef struct Location Location;
typedef struct Bucket Bucket;
typedef struct Trophy Trophy;
typedef struct Tuple Tuple;
typedef struct Credit Credit;
typedef struct AtlasImage AtlasImage;
typedef struct Font Font;
typedef struct Glyph Glyph;
typedef struct Location Location;
typedef struct Bucket Bucket;
typedef struct Trophy Trophy;
typedef struct Tuple Tuple;
typedef struct Credit Credit;
typedef struct AtlasImage AtlasImage;
typedef struct Font Font;
typedef struct {
int debug;
int takeScreenshots;
typedef struct
{
int debug;
int takeScreenshots;
char *screenshotFolder;
int noAIWeapons;
int showFPS;
int playerImmortal;
int playerUnlimitedMissiles;
int noEntityActions;
int allImmortal;
int fps;
int noAIWeapons;
int showFPS;
int playerImmortal;
int playerUnlimitedMissiles;
int noEntityActions;
int allImmortal;
int fps;
} Dev;
typedef struct {
typedef struct
{
float x;
float y;
} PointF;
struct Texture {
char name[MAX_DESCRIPTION_LENGTH];
long hash;
long ttl;
struct Texture
{
char name[MAX_DESCRIPTION_LENGTH];
long hash;
long ttl;
SDL_Texture *texture;
Texture *next;
Texture *next;
};
struct AtlasImage {
char filename[MAX_FILENAME_LENGTH];
SDL_Rect rect;
struct AtlasImage
{
char filename[MAX_FILENAME_LENGTH];
SDL_Rect rect;
SDL_Texture *texture;
AtlasImage *next;
AtlasImage *next;
};
typedef struct {
typedef struct
{
void (*logic)(void);
void (*draw)(void);
void (*handleClick)(int x, int y, int btn);
@ -86,18 +90,21 @@ typedef struct {
void (*handleMouseUp)(int x, int y, int btn);
} Delegate;
typedef struct {
int type;
typedef struct
{
int type;
char message[MAX_DESCRIPTION_LENGTH];
} ModalDialog;
struct Lookup {
char name[MAX_NAME_LENGTH];
long value;
struct Lookup
{
char name[MAX_NAME_LENGTH];
long value;
Lookup *next;
};
struct Weapon {
struct Weapon
{
int type;
int ammo;
int maxAmmo;
@ -105,361 +112,382 @@ struct Weapon {
int y;
};
struct Entity {
int type;
char name[MAX_NAME_LENGTH];
char defName[MAX_NAME_LENGTH];
char groupName[MAX_NAME_LENGTH];
char *description;
char affiliation[MAX_NAME_LENGTH];
int active;
int spawned;
int id;
int side;
float x;
float y;
int offsetX;
int offsetY;
int w;
int h;
float dx;
float dy;
float thrust;
float speed;
float angle;
int alive;
int health;
int maxHealth;
int shield;
int maxShield;
int reload;
int reloadTime;
int selectedGunType;
int combinedGuns;
int shieldRecharge;
int shieldRechargeRate;
int systemPower;
int armourHit;
int shieldHit;
int systemHit;
int thinkTime;
int aiActionTime;
int aiAggression;
int aiDamagePerSec;
int aiDamageTimer;
int aiEvadeTimer;
int separationRadius;
int deathType;
Weapon guns[MAX_FIGHTER_GUNS];
int missiles;
long flags;
long aiFlags;
struct Entity
{
int type;
char name[MAX_NAME_LENGTH];
char defName[MAX_NAME_LENGTH];
char groupName[MAX_NAME_LENGTH];
char *description;
char affiliation[MAX_NAME_LENGTH];
int active;
int spawned;
int id;
int side;
float x;
float y;
int offsetX;
int offsetY;
int w;
int h;
float dx;
float dy;
float thrust;
float speed;
float angle;
int alive;
int health;
int maxHealth;
int shield;
int maxShield;
int reload;
int reloadTime;
int selectedGunType;
int combinedGuns;
int shieldRecharge;
int shieldRechargeRate;
int systemPower;
int armourHit;
int shieldHit;
int systemHit;
int thinkTime;
int aiActionTime;
int aiAggression;
int aiDamagePerSec;
int aiDamageTimer;
int aiEvadeTimer;
int separationRadius;
int deathType;
Weapon guns[MAX_FIGHTER_GUNS];
int missiles;
long flags;
long aiFlags;
SDL_Point targetLocation;
Entity *towing;
Entity *target;
Entity *leader;
Entity *owner;
Entity *killedBy;
Entity *towing;
Entity *target;
Entity *leader;
Entity *owner;
Entity *killedBy;
void (*action)(void);
void (*draw)(void);
void (*die)(void);
AtlasImage *texture;
Entity *next;
Entity *next;
};
struct Bullet {
int type;
float x;
float y;
int w;
int h;
float dx;
float dy;
int sound;
int life;
int damage;
int angle;
long flags;
struct Bullet
{
int type;
float x;
float y;
int w;
int h;
float dx;
float dy;
int sound;
int life;
int damage;
int angle;
long flags;
AtlasImage *texture;
Entity *owner;
Entity *target;
Bullet *next;
Entity *owner;
Entity *target;
Bullet *next;
};
struct Debris {
float x;
float y;
float dx;
float dy;
int health;
int thinkTime;
float angle;
struct Debris
{
float x;
float y;
float dx;
float dy;
int health;
int thinkTime;
float angle;
AtlasImage *texture;
Debris *next;
Debris *next;
};
typedef struct {
typedef struct
{
float x;
float y;
float speed;
} Star;
struct Pulse {
int x;
int y;
float size;
int life;
int r, g, b;
struct Pulse
{
int x;
int y;
float size;
int life;
int r, g, b;
Pulse *next;
};
struct Effect {
int type;
float x;
float y;
float dx;
float dy;
float health;
float size;
float scaleAmount;
int r;
int g;
int b;
int a;
struct Effect
{
int type;
float x;
float y;
float dx;
float dy;
float health;
float size;
float scaleAmount;
int r;
int g;
int b;
int a;
AtlasImage *texture;
Effect *next;
Effect *next;
};
struct Location {
int active;
char name[MAX_NAME_LENGTH];
int x;
int y;
int size;
struct Location
{
int active;
char name[MAX_NAME_LENGTH];
int x;
int y;
int size;
Location *next;
};
struct Objective {
int active;
char id[MAX_DESCRIPTION_LENGTH];
char description[MAX_DESCRIPTION_LENGTH];
char targetName[MAX_NAME_LENGTH];
int targetType;
int currentValue;
int targetValue;
int status;
int isCondition;
int isEliminateAll;
int hideNumbers;
struct Objective
{
int active;
char id[MAX_DESCRIPTION_LENGTH];
char description[MAX_DESCRIPTION_LENGTH];
char targetName[MAX_NAME_LENGTH];
int targetType;
int currentValue;
int targetValue;
int status;
int isCondition;
int isEliminateAll;
int hideNumbers;
Objective *next;
};
struct Challenge {
int type;
int value;
int passed;
struct Challenge
{
int type;
int value;
int passed;
Challenge *next;
};
typedef struct {
int isChallenge;
int timeLimit;
int killLimit;
int lossLimit;
int itemLimit;
int playerItemLimit;
int escapeLimit;
int waypointLimit;
int rescueLimit;
int disableLimit;
int surrenderLimit;
int noMissiles;
int noBoost;
int noECM;
int noGuns;
int allowPlayerDeath;
int clearWaypointEnemies;
int eliminateThreats;
int isDeathMatch;
typedef struct
{
int isChallenge;
int timeLimit;
int killLimit;
int lossLimit;
int itemLimit;
int playerItemLimit;
int escapeLimit;
int waypointLimit;
int rescueLimit;
int disableLimit;
int surrenderLimit;
int noMissiles;
int noBoost;
int noECM;
int noGuns;
int allowPlayerDeath;
int clearWaypointEnemies;
int eliminateThreats;
int isDeathMatch;
Challenge *challenges[MAX_CHALLENGES];
} ChallengeData;
struct Mission {
struct Mission
{
char name[MAX_NAME_LENGTH];
char description[MAX_DESCRIPTION_LENGTH];
char filename[MAX_DESCRIPTION_LENGTH];
int requires;
int requiresOptional;
int expires;
char pilot[MAX_NAME_LENGTH];
char squadron[MAX_NAME_LENGTH];
char craft[MAX_NAME_LENGTH];
int available;
int completed;
int completedChallenges;
int totalChallenges;
int epic;
int isOptional;
int requiresOptional;
int expires;
char pilot[MAX_NAME_LENGTH];
char squadron[MAX_NAME_LENGTH];
char craft[MAX_NAME_LENGTH];
int available;
int completed;
int completedChallenges;
int totalChallenges;
int epic;
int isOptional;
ChallengeData challengeData;
SDL_Rect rect;
Mission *next;
SDL_Rect rect;
Mission *next;
};
struct StarSystem {
char name[MAX_NAME_LENGTH];
char description[MAX_DESCRIPTION_LENGTH];
int side;
int x;
int y;
int completedMissions;
int totalMissions;
int availableMissions;
int fallsToPandorans;
int type;
Mission *activeMission;
Mission missionHead;
struct StarSystem
{
char name[MAX_NAME_LENGTH];
char description[MAX_DESCRIPTION_LENGTH];
int side;
int x;
int y;
int completedMissions;
int totalMissions;
int availableMissions;
int fallsToPandorans;
int type;
Mission *activeMission;
Mission missionHead;
StarSystem *next;
};
struct Quadtree {
int depth;
int x, y, w, h;
Entity **ents;
int capacity;
int numEnts;
int addedTo;
struct Quadtree
{
int depth;
int x, y, w, h;
Entity **ents;
int capacity;
int numEnts;
int addedTo;
Quadtree *node[4];
};
struct Spawner {
char name[MAX_NAME_LENGTH];
char **types;
int numTypes;
int side;
int time;
int interval;
int total;
int step;
int offscreen;
int active;
char flags[MAX_DESCRIPTION_LENGTH];
char aiFlags[MAX_DESCRIPTION_LENGTH];
struct Spawner
{
char name[MAX_NAME_LENGTH];
char **types;
int numTypes;
int side;
int time;
int interval;
int total;
int step;
int offscreen;
int active;
char flags[MAX_DESCRIPTION_LENGTH];
char aiFlags[MAX_DESCRIPTION_LENGTH];
Spawner *next;
};
typedef struct {
SDL_Point camera;
int numAllies;
int numEnemies;
int numInitialEnemies;
int status;
int isEpic;
int unlimitedEnemies;
int epicFighterLimit;
int epicLives;
int epicKills;
int playerSelect;
int manualComplete;
int unwinnable;
int waypointAutoAdvance;
int missionFinishedTimer;
int boostTimer;
int ecmTimer;
int radarRange;
int numPlayerGuns;
int numObjectivesComplete, numObjectivesTotal, numConditions;
int scriptedEnd;
int hasThreats;
int hasSuspicionLevel;
int suspicionLevel;
int suspicionCoolOff;
int zackariaSuspicionLevel;
int incomingMissile;
int destroyTorelli;
float torelliFireStormAlpha;
int campaignFinished;
Entity *missionTarget;
Entity *jumpgate;
Entity *messageSpeaker;
Entity *lastKilledPlayer;
SDL_Texture *background;
AtlasImage *planetTexture, *fireStormTexture;
PointF planet;
int planetWidth, planetHeight;
Entity entityHead, *entityTail;
Bullet bulletHead, *bulletTail;
Debris debrisHead, *debrisTail;
Effect effectHead, *effectTail;
Objective objectiveHead, *objectiveTail;
Location locationHead, *locationTail;
Spawner spawnerHead, *spawnerTail;
typedef struct
{
SDL_Point camera;
int numAllies;
int numEnemies;
int numInitialEnemies;
int status;
int isEpic;
int unlimitedEnemies;
int epicFighterLimit;
int epicLives;
int epicKills;
int playerSelect;
int manualComplete;
int unwinnable;
int waypointAutoAdvance;
int missionFinishedTimer;
int boostTimer;
int ecmTimer;
int radarRange;
int numPlayerGuns;
int numObjectivesComplete, numObjectivesTotal, numConditions;
int scriptedEnd;
int hasThreats;
int hasSuspicionLevel;
int suspicionLevel;
int suspicionCoolOff;
int zackariaSuspicionLevel;
int incomingMissile;
int destroyTorelli;
float torelliFireStormAlpha;
int campaignFinished;
Entity *missionTarget;
Entity *jumpgate;
Entity *messageSpeaker;
Entity *lastKilledPlayer;
SDL_Texture *background;
AtlasImage *planetTexture, *fireStormTexture;
PointF planet;
int planetWidth, planetHeight;
Entity entityHead, *entityTail;
Bullet bulletHead, *bulletTail;
Debris debrisHead, *debrisTail;
Effect effectHead, *effectTail;
Objective objectiveHead, *objectiveTail;
Location locationHead, *locationTail;
Spawner spawnerHead, *spawnerTail;
struct cJSON *missionJSON;
unsigned int stats[STAT_MAX];
Quadtree quadtree;
unsigned int stats[STAT_MAX];
Quadtree quadtree;
} Battle;
struct ScriptRunner {
struct ScriptRunner
{
struct cJSON *line;
long delay;
int waitForMessageBox;
long delay;
int waitForMessageBox;
ScriptRunner *next;
};
struct Trophy {
char id[MAX_NAME_LENGTH];
char title[MAX_DESCRIPTION_LENGTH];
char description[MAX_DESCRIPTION_LENGTH];
char awardDateStr[MAX_NAME_LENGTH];
int value;
int hidden;
int stat;
int statValue;
int awarded;
struct Trophy
{
char id[MAX_NAME_LENGTH];
char title[MAX_DESCRIPTION_LENGTH];
char description[MAX_DESCRIPTION_LENGTH];
char awardDateStr[MAX_NAME_LENGTH];
int value;
int hidden;
int stat;
int statValue;
int awarded;
unsigned long awardDate;
int notify;
Trophy *next;
int notify;
Trophy *next;
};
typedef struct {
typedef struct
{
int friendlyFire;
int autoSwitchPlayerTarget;
int missileReTarget;
int healthBars;
} Gameplay;
struct Tuple {
char key[MAX_NAME_LENGTH];
int value;
struct Tuple
{
char key[MAX_NAME_LENGTH];
int value;
Tuple *next;
};
typedef struct {
StarSystem starSystemHead;
Mission challengeMissionHead;
Mission *currentMission;
char selectedStarSystem[MAX_NAME_LENGTH];
int completedMissions;
int availableMissions;
int totalMissions;
int completedChallenges;
int totalChallenges;
typedef struct
{
StarSystem starSystemHead;
Mission challengeMissionHead;
Mission *currentMission;
char selectedStarSystem[MAX_NAME_LENGTH];
int completedMissions;
int availableMissions;
int totalMissions;
int completedChallenges;
int totalChallenges;
unsigned int stats[STAT_MAX];
Trophy trophyHead;
Tuple fighterStatHead;
Trophy trophyHead;
Tuple fighterStatHead;
} Game;
struct Widget {
char name[MAX_NAME_LENGTH];
char group[MAX_NAME_LENGTH];
int type;
int value;
char text[MAX_NAME_LENGTH];
char **options;
int numOptions;
int visible;
int enabled;
int isModal;
SDL_Rect rect;
struct Widget
{
char name[MAX_NAME_LENGTH];
char group[MAX_NAME_LENGTH];
int type;
int value;
char text[MAX_NAME_LENGTH];
char **options;
int numOptions;
int visible;
int enabled;
int isModal;
SDL_Rect rect;
AtlasImage *texture;
void (*action)(void);
void (*onChange)(char *value);
@ -467,23 +495,26 @@ struct Widget {
Widget *next;
};
struct HudMessage {
char message[MAX_DESCRIPTION_LENGTH];
SDL_Color color;
int life;
struct HudMessage
{
char message[MAX_DESCRIPTION_LENGTH];
SDL_Color color;
int life;
HudMessage *next;
};
struct MessageBox {
char title[MAX_NAME_LENGTH];
char body[MAX_DESCRIPTION_LENGTH];
int time;
int height;
int type;
struct MessageBox
{
char title[MAX_NAME_LENGTH];
char body[MAX_DESCRIPTION_LENGTH];
int time;
int height;
int type;
MessageBox *next;
};
typedef struct {
typedef struct
{
int x;
int y;
int w;
@ -493,37 +524,39 @@ typedef struct {
int button[MAX_MOUSE_BUTTONS];
} Mouse;
typedef struct {
char saveDir[MAX_FILENAME_LENGTH];
int saveGame;
int winWidth;
int winHeight;
SDL_Point uiOffset;
int fullscreen;
int musicVolume;
int soundVolume;
int vSync;
int doTrophyAlerts;
int hideMouse;
Gameplay gameplay;
Mouse mouse;
PointF uiMouse;
int keyboard[MAX_KEYBOARD_KEYS];
SDL_Texture *backBuffer;
SDL_Texture *uiBuffer;
typedef struct
{
char saveDir[MAX_FILENAME_LENGTH];
int saveGame;
int winWidth;
int winHeight;
SDL_Point uiOffset;
int fullscreen;
int musicVolume;
int soundVolume;
int vSync;
int doTrophyAlerts;
int hideMouse;
Gameplay gameplay;
Mouse mouse;
PointF uiMouse;
int keyboard[MAX_KEYBOARD_KEYS];
SDL_Texture *backBuffer;
SDL_Texture *uiBuffer;
SDL_Renderer *renderer;
SDL_Window *window;
Delegate delegate;
ModalDialog modalDialog;
int awaitingWidgetInput;
int lastKeyPressed;
int lastButtonPressed;
int keyControls[CONTROL_MAX];
int mouseControls[CONTROL_MAX];
int textWidth;
SDL_Window *window;
Delegate delegate;
ModalDialog modalDialog;
int awaitingWidgetInput;
int lastKeyPressed;
int lastButtonPressed;
int keyControls[CONTROL_MAX];
int mouseControls[CONTROL_MAX];
int textWidth;
} App;
typedef struct {
typedef struct
{
SDL_Color red;
SDL_Color orange;
SDL_Color yellow;
@ -537,42 +570,42 @@ typedef struct {
SDL_Color darkGrey;
} Colors;
struct Credit {
char *text;
float y;
int size;
int h;
struct Credit
{
char *text;
float y;
int size;
int h;
Credit *next;
};
struct Glyph {
char character[MAX_NAME_LENGTH];
SDL_Rect rect;
Glyph *next;
};
struct Font {
char name[MAX_NAME_LENGTH];
struct Font
{
char name[MAX_NAME_LENGTH];
SDL_Texture *texture;
Glyph glyphHead[NUM_GLYPH_BUCKETS];
Font *next;
SDL_Rect glyphs[MAX_GLYPHS];
Font *next;
};
struct Bucket {
char *key, *value;
struct Bucket
{
char *key, *value;
Bucket *next;
};
typedef struct {
typedef struct
{
Bucket **bucket;
int *bucketCount;
int *bucketCount;
} HashTable;
typedef struct {
typedef struct
{
int32_t magicNumber, version, stringCount;
int32_t originalOffset, translationOffset;
} MOHeader;
typedef struct {
typedef struct
{
int32_t length, offset;
} MOEntry;

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2018-2019 Parallel Realities
Copyright (C) 2018-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,11 +18,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
#include "../system/io.h"
#include "../system/textures.h"
#include "../system/util.h"
#include "atlas.h"
static void loadAtlasData(void);
static AtlasImage atlases[NUM_ATLAS_BUCKETS];
static AtlasImage atlases[NUM_ATLAS_BUCKETS];
static SDL_Texture *atlasTexture;
void initAtlas(void)
@ -40,14 +46,14 @@ void setAtlasColor(int r, int g, int b, int a)
SDL_SetTextureAlphaMod(atlasTexture, a);
}
AtlasImage *getAtlasImage(char *filename)
AtlasImage *getAtlasImage(const char *filename)
{
AtlasImage *a;
AtlasImage *a;
unsigned long i;
i = hashcode(filename) % NUM_ATLAS_BUCKETS;
for (a = atlases[i].next ; a != NULL ; a = a->next)
for (a = atlases[i].next; a != NULL; a = a->next)
{
if (strcmp(a->filename, filename) == 0)
{
@ -64,15 +70,15 @@ AtlasImage *getAtlasImage(char *filename)
char **getAtlasFileList(char *dir, int *count)
{
AtlasImage *a;
int i, bucket;
char **filenames;
int i, bucket;
char **filenames;
i = 0;
filenames = NULL;
for (bucket = 0 ; bucket < NUM_ATLAS_BUCKETS ; bucket++)
for (bucket = 0; bucket < NUM_ATLAS_BUCKETS; bucket++)
{
for (a = atlases[bucket].next ; a != NULL ; a = a->next)
for (a = atlases[bucket].next; a != NULL; a = a->next)
{
if (strncmp(dir, a->filename, strlen(dir)) == 0)
{
@ -83,14 +89,14 @@ char **getAtlasFileList(char *dir, int *count)
if (i > 0)
{
filenames = malloc(sizeof(char*) * i);
memset(filenames, 0, sizeof(char*) * i);
filenames = malloc(sizeof(char *) * i);
memset(filenames, 0, sizeof(char *) * i);
i = 0;
for (bucket = 0 ; bucket < NUM_ATLAS_BUCKETS ; bucket++)
for (bucket = 0; bucket < NUM_ATLAS_BUCKETS; bucket++)
{
for (a = atlases[bucket].next ; a != NULL ; a = a->next)
for (a = atlases[bucket].next; a != NULL; a = a->next)
{
if (strncmp(dir, a->filename, strlen(dir)) == 0)
{
@ -108,7 +114,7 @@ char **getAtlasFileList(char *dir, int *count)
if (filenames)
{
qsort(filenames, i, sizeof(char*), stringComparator);
qsort(filenames, i, sizeof(char *), stringComparator);
}
return filenames;
@ -116,17 +122,17 @@ char **getAtlasFileList(char *dir, int *count)
static void loadAtlasData(void)
{
AtlasImage *atlasImage, *a;
int x, y, w, h;
cJSON *root, *node;
char *text, *filename;
AtlasImage *atlasImage, *a;
int x, y, w, h;
cJSON *root, *node;
char *text, *filename;
unsigned long i;
text = readFile("data/atlas/atlas.json");
root = cJSON_Parse(text);
for (node = root->child ; node != NULL ; node = node->next)
for (node = root->child; node != NULL; node = node->next)
{
filename = cJSON_GetObjectItem(node, "filename")->valuestring;
x = cJSON_GetObjectItem(node, "x")->valueint;

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2018-2019 Parallel Realities
Copyright (C) 2018-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,10 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
extern SDL_Texture *getTexture(const char *filename);
extern unsigned long hashcode(const char *str);
extern char *readFile(const char *filename);
extern int stringComparator(const void *a, const void *b);
char **getAtlasFileList(char *dir, int *count);
AtlasImage *getAtlasImage(const char *filename);
void setAtlasColor(int r, int g, int b, int a);
void initAtlas(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,16 +18,26 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
#include "../system/io.h"
#include "../system/lookup.h"
#include "../system/text.h"
#include "../system/widgets.h"
#include "controls.h"
extern App app;
extern Colors colors;
static void restoreDefaults(void);
static const char *controlName[CONTROL_MAX];
static Widget *controlWidget[CONTROL_MAX];
static char *CONTROLS_TEXT;
static char *HELP_TEXT;
static char *BACKSPACE_TEXT;
static char *ESCAPE_TEXT;
static Widget *controlWidget[CONTROL_MAX];
static char *CONTROLS_TEXT;
static char *HELP_TEXT;
static char *BACKSPACE_TEXT;
static char *ESCAPE_TEXT;
void initControls(void)
{
@ -46,11 +56,11 @@ void initControls(void)
controlName[CONTROL_PREV_FIGHTER] = _("Previous Fighter");
controlName[CONTROL_SCREENSHOT] = _("Screenshot");
for (i = 0 ; i < CONTROL_MAX ; i++)
for (i = 0; i < CONTROL_MAX; i++)
{
controlWidget[i] = getWidget(getLookupName("CONTROL_", i), "controls");
controlWidget[i]->numOptions = 2;
controlWidget[i]->options = malloc(2 * sizeof(char*));
controlWidget[i]->options = malloc(2 * sizeof(char *));
controlWidget[i]->options[0] = malloc(sizeof(char) * MAX_NAME_LENGTH);
controlWidget[i]->options[1] = malloc(sizeof(char) * MAX_NAME_LENGTH);
strcpy(controlWidget[i]->options[0], "");
@ -67,7 +77,7 @@ void initControlsDisplay(void)
{
int i;
for (i = 0 ; i < CONTROL_MAX ; i++)
for (i = 0; i < CONTROL_MAX; i++)
{
strcpy(controlWidget[i]->options[0], "");
strcpy(controlWidget[i]->options[1], "");
@ -96,7 +106,7 @@ int isControl(int type)
int isAcceptControl(void)
{
return (app.keyboard[SDL_SCANCODE_SPACE] ||app.keyboard[SDL_SCANCODE_RETURN] || isControl(CONTROL_FIRE));
return (app.keyboard[SDL_SCANCODE_SPACE] || app.keyboard[SDL_SCANCODE_RETURN] || isControl(CONTROL_FIRE));
}
void clearControl(int type)
@ -149,7 +159,7 @@ void clearControlConfig(char *name)
void drawControls(void)
{
int i;
int i;
SDL_Rect r;
SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND);
@ -177,7 +187,7 @@ void drawControls(void)
r.x += 25;
r.y = 125;
for (i = 0 ; i < CONTROL_MAX ; i++)
for (i = 0; i < CONTROL_MAX; i++)
{
drawText(r.x, r.y + 2, 20, TA_LEFT, colors.white, controlName[i]);
@ -209,11 +219,11 @@ void drawControls(void)
static void restoreDefaults(void)
{
int i;
int i;
cJSON *root, *controlsJSON, *node;
char *text;
char *text;
text = readFile("data/app/"CONFIG_FILENAME);
text = readFile("data/app/" CONFIG_FILENAME);
root = cJSON_Parse(text);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,15 +18,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern void drawWidgets(char *groupName);
extern char *getLookupName(char *prefix, long num);
extern Widget *getWidget(const char *name, const char *group);
extern long lookup(char *name);
extern char *readFile(char *filename);
extern App app;
extern Colors colors;
void drawControls(void);
void clearControlConfig(char *name);
void updateControlButton(char *name);
void updateControlKey(char *name);
void resetAcceptControls(void);
void clearControl(int type);
int isAcceptControl(void);
int isControl(int type);
void initControlsDisplay(void);
void initControls(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../galaxy/mission.h"
#include "dev.h"
extern App app;
extern Battle battle;
extern Dev dev;
void doDevKeys(void)
{
if (dev.debug)

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,10 +18,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
extern void completeMission(void);
extern App app;
extern Battle battle;
extern Dev dev;
void doDevKeys(void);

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2015-2019 Parallel Realities
Copyright (C) 2015-2019,2022 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@ -18,8 +18,18 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../system/input.h"
#include "../system/text.h"
#include "../system/util.h"
#include "draw.h"
extern App app;
extern Battle battle;
extern Colors colors;
extern Dev dev;
static void initColor(SDL_Color *c, int r, int g, int b);
static PointF backgroundPoint[4];
@ -153,9 +163,9 @@ void blitRotated(AtlasImage *atlasImage, int x, int y, float angle)
void drawCircle(int cx, int cy, int radius, int r, int g, int b, int a)
{
int x = radius;
int y = 0;
int radiusError = 1 - x;
int x = radius;
int y = 0;
int radiusError = 1 - x;
SDL_Point p[8];
SDL_SetRenderDrawColor(app.renderer, r, g, b, a);
@ -163,14 +173,22 @@ void drawCircle(int cx, int cy, int radius, int r, int g, int b, int a)
while (x >= y)
{
p[0].x = x + cx; p[0].y = y + cy;
p[1].x = y + cx; p[1].y = x + cy;
p[2].x = -x + cx; p[2].y = y + cy;
p[3].x = -y + cx; p[3].y = x + cy;
p[4].x = -x + cx; p[4].y = -y + cy;
p[5].x = -y + cx; p[5].y = -x + cy;
p[6].x = x + cx; p[6].y = -y + cy;
p[7].x = y + cx; p[7].y = -x + cy;
p[0].x = x + cx;
p[0].y = y + cy;
p[1].x = y + cx;
p[1].y = x + cy;
p[2].x = -x + cx;
p[2].y = y + cy;
p[3].x = -y + cx;
p[3].y = x + cy;
p[4].x = -x + cx;
p[4].y = -y + cy;
p[5].x = -y + cx;
p[5].y = -x + cy;
p[6].x = x + cx;
p[6].y = -y + cy;
p[7].x = y + cx;
p[7].y = -x + cy;
SDL_RenderDrawPoints(app.renderer, p, 8);
y++;
@ -193,7 +211,7 @@ void scrollBackground(float x, float y)
{
int i;
for (i = 0 ; i < 4 ; i++)
for (i = 0; i < 4; i++)
{
backgroundPoint[i].x += x;
backgroundPoint[i].y += y;
@ -222,10 +240,10 @@ void scrollBackground(float x, float y)
void drawBackground(SDL_Texture *texture)
{
int i;
int i;
SDL_Rect dstRect;
for (i = 0 ; i < 4 ; i++)
for (i = 0; i < 4; i++)
{
dstRect.x = backgroundPoint[i].x;
dstRect.y = backgroundPoint[i].y;
@ -257,8 +275,8 @@ int isOnBattleScreen(int x, int y, int w, int h)
void saveScreenshot(void)
{
static int i = 0;
char filename[MAX_NAME_LENGTH];
static int i = 0;
char filename[MAX_NAME_LENGTH];
SDL_Surface *sshot;
sprintf(filename, "/tmp/tbftss/%d.bmp", ++i);

Some files were not shown because too many files have changed in this diff Show More