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 # Misc
.DS_Store .DS_Store
/.errors /.errors
tools

View File

@ -4,7 +4,7 @@
![Alt text](dev/screenshots/v0.6-06.png?raw=true "Screenshot") ![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 Website: www.battleforthesolarsystem.com
Email: stephenjsweeney@battleforthesolarsystem.com Email: stephenjsweeney@battleforthesolarsystem.com

View File

@ -99,7 +99,7 @@
"number" : 12, "number" : 12,
"scatter" : 5000, "scatter" : 5000,
"aiFlags" : "+AIF_UNLIMITED_RANGE", "aiFlags" : "+AIF_UNLIMITED_RANGE",
"flags" : "+EF_AI_LEADER" "flags" : "+EF_AI_LEADER+EF_MUST_DISABLE"
}, },
{ {
"types" : "Sphinx;Thunderhead", "types" : "Sphinx;Thunderhead",
@ -158,7 +158,9 @@
"lines" : [ "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 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 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 += `sdl2-config --cflags` -DVERSION=$(VERSION) -DREVISION=$(REVISION) -DDATA_DIR=\"$(DATA_DIR)\" -DLOCALE_DIR=\"$(LOCALE_DIR)\"
CXXFLAGS += -ansi -pedantic CXXFLAGS += -ansi -pedantic
CXXFLAGS += -g -lefence CXXFLAGS += -g -lefence
ifneq ("$(wildcard .errors)","")
CXXFLAGS += -Wall -Wempty-body -Werror -Wstrict-prototypes -Werror=maybe-uninitialized -Warray-bounds CXXFLAGS += -Wall -Wempty-body -Werror -Wstrict-prototypes -Werror=maybe-uninitialized -Warray-bounds
endif
LDFLAGS += `sdl2-config --libs` -lSDL2_mixer -lSDL2_image -lSDL2_ttf -lm 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 cp -p icons/$(PROG)-128x128.png $(INST_ICON_DIR)/128x128/apps/$(PROG).png
mkdir -p $(INST_DESKTOP_DIR) mkdir -p $(INST_DESKTOP_DIR)
cp -p icons/$(PROG).desktop $(INST_DESKTOP_DIR) cp -p icons/$(PROG).desktop $(INST_DESKTOP_DIR)
@for f in $(LOCALE_MO); do \ @for f in $(LOCALE_MO); do \
lang=`echo $$f | sed -e 's/^locale\///;s/\.mo$$//'`; \ lang=`echo $$f | sed -e 's/^locale\///;s/\.mo$$//'`; \
mkdir -p $(INST_LOCALE_DIR)/$$lang/LC_MESSAGES; \ mkdir -p $(INST_LOCALE_DIR)/$$lang/LC_MESSAGES; \
cp -v $$f $(INST_LOCALE_DIR)/$$lang/LC_MESSAGES/$(PROG).mo; \ cp -v $$f $(INST_LOCALE_DIR)/$$lang/LC_MESSAGES/$(PROG).mo; \
done done
uninstall: uninstall:
$(RM) $(BIN_DIR)/$(PROG) $(RM) $(BIN_DIR)/$(PROG)
$(RM) -rf $(DATA_DIR) $(RM) -rf $(DATA_DIR)
@ -69,10 +67,10 @@ uninstall:
$(RM) $(ICON_DIR)/64x64/apps/$(PROG).png $(RM) $(ICON_DIR)/64x64/apps/$(PROG).png
$(RM) $(ICON_DIR)/128x128/apps/$(PROG).png $(RM) $(ICON_DIR)/128x128/apps/$(PROG).png
$(RM) $(DESKTOP_DIR)/$(PROG).desktop $(RM) $(DESKTOP_DIR)/$(PROG).desktop
@for f in $(LOCALE_MO); do \ @for f in $(LOCALE_MO); do \
lang=`echo $$f | sed -e 's/^locale\///;s/\.mo$$//'`; \ lang=`echo $$f | sed -e 's/^locale\///;s/\.mo$$//'`; \
$(RM) -v $(LOCALE_DIR)/$$lang/LC_MESSAGES/$(PROG).mo; \ $(RM) -v $(LOCALE_DIR)/$$lang/LC_MESSAGES/$(PROG).mo; \
done done
.PHONY: dist .PHONY: dist

View File

@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<style> <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;} 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;} h4 {background-color:#000; padding:0.25em; color:#fff; margin-top:3em; border: 1px solid #5ad;}
h5 {border-bottom: 1px solid #5ad; width: 50%;} 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>"); toc.append("&blacksquare; <a href='#" + link + "'>" + e.innerText + "</a><br>");
} }
if (e.tagName == 'H4') if (e.tagName == 'H4')
{ {
toc.append("<span style='text-indent: 2em; display: inline-block'>&#9643 <a href='#" + link + "'>" + e.innerText + "</a></span><br>"); 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 void faceTarget(Entity *e);
static int isInFOV(Entity *e, int fov); static int isInFOV(Entity *e, int fov);
static void preAttack(void); static void preAttack(void);
static void huntTarget(void); static void huntTarget(void);
static void huntAndAttackTarget(void); static void huntAndAttackTarget(void);
static void moveToTargetLocation(void); static void moveToTargetLocation(void);
static void nextAction(void); static void nextAction(void);
static void findTarget(void); static void findTarget(void);
static int hasClearShot(void); static int hasClearShot(void);
static void fallback(void); static void fallback(void);
static void moveToPlayer(void); static void moveToPlayer(void);
static int canAttack(Entity *e); static int canAttack(Entity *e);
static int selectWeapon(int type); static int selectWeapon(int type);
static int nearJumpgate(void); static int nearJumpgate(void);
static void moveToJumpgate(void); static void moveToJumpgate(void);
static int nearEnemies(void); static int nearEnemies(void);
static int nearItems(void); static int nearItems(void);
static int nearMines(void); static int nearMines(void);
static void moveToItem(void); static void moveToItem(void);
static int nearTowableCraft(void); static int nearTowableCraft(void);
static void moveToTowableCraft(void); static void moveToTowableCraft(void);
static int lookForPlayer(void); static int lookForPlayer(void);
static int lookForLeader(void); static int lookForLeader(void);
static void fleeEnemies(void); static void fleeEnemies(void);
static int isRetreating(void); static int isRetreating(void);
static int getActionChance(int type); static int getActionChance(int type);
static void doFighterAI(void); static void doFighterAI(void);
static void doGunAI(void); static void doGunAI(void);
static void moveToLeader(void); static void moveToLeader(void);
static void wander(void); static void wander(void);
static void doWander(void); static void doWander(void);
static int selectWeaponForTarget(Entity *e); static int selectWeaponForTarget(Entity *e);
static void deployMine(void); static void deployMine(void);
static int isSurrendering(void); static int isSurrendering(void);
static void doSurrender(void); static void doSurrender(void);
static void fleeWithinBattleArea(int x, int y, int numEnemies); static void fleeWithinBattleArea(int x, int y, int numEnemies);
static int evadeNonKillTargets(void); static int evadeNonKillTargets(void);
void doAI(void) void doAI(void)
{ {
@ -131,7 +152,7 @@ void doAI(void)
return; return;
} }
if ((self->aiFlags & (AIF_FOLLOWS_PLAYER|AIF_MOVES_TO_PLAYER)) && lookForPlayer()) if ((self->aiFlags & (AIF_FOLLOWS_PLAYER | AIF_MOVES_TO_PLAYER)) && lookForPlayer())
{ {
return; return;
} }
@ -320,8 +341,8 @@ static void huntAndAttackTarget(void)
static void findTarget(void) static void findTarget(void)
{ {
int i; int i;
Entity *e, **candidates; Entity *e, **candidates;
unsigned int dist, closest; unsigned int dist, closest;
dist = closest = (battle.isEpic || (self->aiFlags & AIF_UNLIMITED_RANGE)) ? MAX_TARGET_RANGE : SCREEN_WIDTH; 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; 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)) if (canAttack(e) && selectWeaponForTarget(e))
{ {
@ -417,7 +438,7 @@ static int selectWeapon(int type)
{ {
int i; int i;
for (i = 0 ; i < MAX_FIGHTER_GUNS ; i++) for (i = 0; i < MAX_FIGHTER_GUNS; i++)
{ {
if (self->guns[i].type == type) if (self->guns[i].type == type)
{ {
@ -461,14 +482,14 @@ static int isInFOV(Entity *e, int fov)
static int hasClearShot(void) static int hasClearShot(void)
{ {
int dist; int dist;
Entity *e; Entity *e;
if (isInFOV(self->target, 4)) if (isInFOV(self->target, 4))
{ {
dist = getDistance(self->x, self->y, self->target->x, self->target->y); 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) if (self->owner != NULL && self->owner == e->owner)
{ {
@ -503,7 +524,7 @@ static void preAttack(void)
{ {
fireGuns(self); 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); fireMissile(self);
@ -655,7 +676,7 @@ static void doSurrender(void)
static int nearEnemies(void) static int nearEnemies(void)
{ {
int i, numEnemies, x, y; int i, numEnemies, x, y;
Entity *e, **candidates; Entity *e, **candidates;
candidates = getAllEntsInRadius(self->x, self->y, SCREEN_WIDTH, self); candidates = getAllEntsInRadius(self->x, self->y, SCREEN_WIDTH, self);
@ -665,7 +686,7 @@ static int nearEnemies(void)
numEnemies = 0; 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)) 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) static int evadeNonKillTargets(void)
{ {
int i, numEnemies, x, y; int i, numEnemies, x, y;
Entity *e, **candidates; Entity *e, **candidates;
candidates = getAllEntsInRadius(self->x, self->y, SCREEN_WIDTH, self); candidates = getAllEntsInRadius(self->x, self->y, SCREEN_WIDTH, self);
@ -705,7 +726,7 @@ static int evadeNonKillTargets(void)
numEnemies = 0; 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))) 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) static int nearMines(void)
{ {
int i, numMines, x, y; int i, numMines, x, y;
Entity *e, **candidates; Entity *e, **candidates;
candidates = getAllEntsInRadius(self->x, self->y, SCREEN_HEIGHT, self); candidates = getAllEntsInRadius(self->x, self->y, SCREEN_HEIGHT, self);
@ -795,7 +816,7 @@ static int nearMines(void)
numMines = 0; 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) 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) static int nearItems(void)
{ {
int i; int i;
long closest, distance; long closest, distance;
Entity *e, **candidates; Entity *e, **candidates;
closest = MAX_TARGET_RANGE; closest = MAX_TARGET_RANGE;
@ -903,7 +924,7 @@ static int nearItems(void)
self->target = NULL; 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) if (e->type == ET_ITEM)
{ {
@ -941,8 +962,8 @@ static void moveToItem(void)
static int nearTowableCraft(void) static int nearTowableCraft(void)
{ {
int i; int i;
long closest, dist; long closest, dist;
Entity *e, **candidates; Entity *e, **candidates;
dist = closest = (battle.isEpic || (self->aiFlags & AIF_UNLIMITED_RANGE)) ? MAX_TARGET_RANGE : 2000; dist = closest = (battle.isEpic || (self->aiFlags & AIF_UNLIMITED_RANGE)) ? MAX_TARGET_RANGE : 2000;
@ -951,9 +972,9 @@ static int nearTowableCraft(void)
self->target = NULL; 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); dist = getDistance(self->x, self->y, e->x, e->y);
@ -998,13 +1019,13 @@ static int lookForPlayer(void)
static int lookForLeader(void) static int lookForLeader(void)
{ {
long closest, distance; long closest, distance;
Entity *e; Entity *e;
self->leader = NULL; self->leader = NULL;
closest = 0; 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) 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void checkZackariaSuspicionLevel(void);
void checkSuspicionLevel(void);
#define AI_EVADE 0 void doAI(void);
#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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 logic(void);
static void draw(void); static void draw(void);
static void handleKeyboard(void); static void handleKeyboard(void);
static void postBattle(void); static void postBattle(void);
void destroyBattle(void);
static void doBattle(void); static void doBattle(void);
static void optQuitBattle(void); static void optQuitBattle(void);
static void quitBattle(void); static void quitBattle(void);
@ -40,7 +83,7 @@ static void checkSuspicionLevel(void);
static void doTorelliFireStorm(void); static void doTorelliFireStorm(void);
static void endCampaign(void); static void endCampaign(void);
static int show; static int show;
static float ssx, ssy; static float ssx, ssy;
void initBattle(void) void initBattle(void)
@ -434,7 +477,7 @@ static void postBattle(void)
{ {
int i; 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) if (i != STAT_TIME && i != STAT_EPIC_KILL_STREAK)
{ {
@ -486,13 +529,13 @@ static void endCampaign(void)
void destroyBattle(void) void destroyBattle(void)
{ {
Entity *ent; Entity *ent;
Bullet *b; Bullet *b;
Debris *d; Debris *d;
Effect *e; Effect *e;
Objective *o; Objective *o;
Location *l; Location *l;
Spawner *s; Spawner *s;
while (battle.entityHead.next) 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void destroyBattle(void);
void initBattle(void);
#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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 huntTarget(Bullet *b);
static void checkCollisions(Bullet *b); static void checkCollisions(Bullet *b);
static void resizeDrawList(void); static void resizeDrawList(void);
static void selectNewTarget(Bullet *b); static void selectNewTarget(Bullet *b);
static void doBulletHitEffect(Bullet *b); static void doBulletHitEffect(Bullet *b);
static Bullet bulletDef[BT_MAX]; static Bullet bulletDef[BT_MAX];
static Bullet **bulletsToDraw; static Bullet **bulletsToDraw;
static int drawCapacity; static int drawCapacity;
void initBullets(void) void initBullets(void)
{ {
drawCapacity = INITIAL_BULLET_DRAW_CAPACITY; drawCapacity = INITIAL_BULLET_DRAW_CAPACITY;
bulletsToDraw = malloc(sizeof(Bullet*) * drawCapacity); bulletsToDraw = malloc(sizeof(Bullet *) * drawCapacity);
memset(bulletsToDraw, 0, sizeof(Bullet*) * drawCapacity); memset(bulletsToDraw, 0, sizeof(Bullet *) * drawCapacity);
} }
void initBulletDefs(void) void initBulletDefs(void)
{ {
cJSON *root, *node; cJSON *root, *node;
char *text; char *text;
int type; int type;
Bullet *def; Bullet *def;
memset(&bulletDef, 0, sizeof(Bullet) * BT_MAX); memset(&bulletDef, 0, sizeof(Bullet) * BT_MAX);
@ -51,7 +73,7 @@ void initBulletDefs(void)
root = cJSON_Parse(text); 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); type = lookup(cJSON_GetObjectItem(node, "type")->valuestring);
@ -72,15 +94,15 @@ void initBulletDefs(void)
void doBullets(void) void doBullets(void)
{ {
int i = 0; int i = 0;
Bullet *b; Bullet *b;
Bullet *prev = &battle.bulletHead; Bullet *prev = &battle.bulletHead;
battle.incomingMissile = 0; 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->x += b->dx;
b->y += b->dy; 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); 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; drawCapacity = n;
} }
@ -150,11 +172,11 @@ static void resizeDrawList(void)
static void checkCollisions(Bullet *b) static void checkCollisions(Bullet *b)
{ {
Entity *e, **candidates; Entity *e, **candidates;
int i; int i;
candidates = getAllEntsWithin(b->x - (b->w / 2), b->y - (b->h / 2), b->w, b->h, NULL); 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) if (e->flags & EF_TAKES_DAMAGE)
{ {
@ -182,7 +204,7 @@ static void checkCollisions(Bullet *b)
if (battle.hasSuspicionLevel) 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); 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) switch (b->type)
{ {
@ -289,12 +311,12 @@ void doBulletHitEffect(Bullet *b)
void drawBullets(void) void drawBullets(void)
{ {
int i; int i;
Bullet *b; Bullet *b;
setAtlasColor(255, 255, 255, 255); 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); 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) static void applyMissileThrust(Bullet *b)
{ {
int maxSpeed; int maxSpeed;
float v, thrust; float v, thrust;
b->dx += sin(TO_RAIDANS(b->angle)); b->dx += sin(TO_RAIDANS(b->angle));
@ -376,7 +398,7 @@ static void huntTarget(Bullet *b)
static void selectNewTarget(Bullet *b) static void selectNewTarget(Bullet *b)
{ {
int i; int i;
Entity *e, **candidates; Entity *e, **candidates;
if (app.gameplay.missileReTarget) if (app.gameplay.missileReTarget)
@ -385,7 +407,7 @@ static void selectNewTarget(Bullet *b)
candidates = getAllEntsInRadius(b->x, b->y, SCREEN_HEIGHT, NULL); 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) 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) void fireGuns(Entity *owner)
{ {
Bullet *b; Bullet *b;
int i; int i;
float x, y; float x, y;
float c, s; float c, s;
b = NULL; 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)) 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void destroyBullets(void);
void destroyBulletDefs(void);
#include "../json/cJSON.h" void fireMissile(Entity *owner);
void fireRocket(Entity *owner);
#define INITIAL_BULLET_DRAW_CAPACITY 32 void fireGuns(Entity *owner);
#define MISSILE_LIFE (FPS * 30) void drawBullets(void);
#define TURN_SPEED 2 void doBullets(void);
#define TURN_THRESHOLD 3 void initBulletDefs(void);
void initBullets(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 think(void);
static void gunThink(void); static void gunThink(void);
static void gunDie(void); static void gunDie(void);
@ -46,7 +70,7 @@ Entity *spawnCapitalShip(char *name, int x, int y, int side)
capitalShip = NULL; 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)) 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) static void think(void)
{ {
float dir; float dir;
int wantedAngle; int wantedAngle;
if (--self->aiActionTime <= 0) if (--self->aiActionTime <= 0)
{ {
@ -145,13 +169,13 @@ static void think(void)
static void findAITarget(void) static void findAITarget(void)
{ {
Entity *e; Entity *e;
unsigned int dist, closest; unsigned int dist, closest;
self->target = NULL; self->target = NULL;
dist = closest = MAX_TARGET_RANGE; 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) if (e->active && e->side != self->side && e->flags & EF_AI_TARGET)
{ {
@ -183,13 +207,13 @@ static void findAITarget(void)
static int steer(void) static int steer(void)
{ {
int wantedAngle; int wantedAngle;
int angle; int angle;
int distance; int distance;
float dx, dy, force; float dx, dy, force;
int count; int count;
Entity *e, **candidates; Entity *e, **candidates;
int i; int i;
dx = dy = 0; dx = dy = 0;
count = 0; count = 0;
@ -197,7 +221,7 @@ static int steer(void)
candidates = getAllEntsInRadius(self->x, self->y, 2000, self); 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) if (e->type == ET_CAPITAL_SHIP)
{ {
@ -276,7 +300,7 @@ static void gunDie(void)
playBattleSound(SND_EXPLOSION_1 + rand() % 4, self->x, self->y); playBattleSound(SND_EXPLOSION_1 + rand() % 4, self->x, self->y);
addDebris(self->x, self->y, 3 + rand() % 4); 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) 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); playBattleSound(SND_EXPLOSION_1 + rand() % 4, self->x, self->y);
addDebris(self->x, self->y, 4 + rand() % 9); 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) 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); 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) if (e->owner == self)
{ {
@ -387,7 +411,7 @@ static void disable(void)
runScriptFunction("CAP_DISABLED %s", self->owner->name); 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) if (e->owner == self->owner || e == self->owner)
{ {
@ -403,15 +427,15 @@ static void disable(void)
void loadCapitalShipDefs(void) void loadCapitalShipDefs(void)
{ {
char **filenames; char **filenames;
char path[MAX_FILENAME_LENGTH]; char path[MAX_FILENAME_LENGTH];
int count, i; int count, i;
memset(&defHead, 0, sizeof(Entity)); memset(&defHead, 0, sizeof(Entity));
defTail = &defHead; defTail = &defHead;
filenames = getFileList("data/capitalShips", &count); filenames = getFileList("data/capitalShips", &count);
for (i = 0 ; i < count ; i++) for (i = 0; i < count; i++)
{ {
sprintf(path, "data/capitalShips/%s", filenames[i]); sprintf(path, "data/capitalShips/%s", filenames[i]);
@ -425,8 +449,8 @@ void loadCapitalShipDefs(void)
static void loadCapitalShipDef(char *filename) static void loadCapitalShipDef(char *filename)
{ {
cJSON *root; cJSON *root;
char *text; char *text;
Entity *e; Entity *e;
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename); 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) static void loadComponents(Entity *parent, cJSON *components)
{ {
Entity *e; Entity *e;
cJSON *component; cJSON *component;
parent->health = 0; parent->health = 0;
@ -535,7 +559,7 @@ static void loadComponents(Entity *parent, cJSON *components)
static void loadGuns(Entity *parent, cJSON *guns) static void loadGuns(Entity *parent, cJSON *guns)
{ {
Entity *e; Entity *e;
cJSON *gun; cJSON *gun;
if (guns) if (guns)
{ {
@ -587,7 +611,7 @@ static void loadGuns(Entity *parent, cJSON *guns)
static void loadEngines(Entity *parent, cJSON *engines) static void loadEngines(Entity *parent, cJSON *engines)
{ {
Entity *e; Entity *e;
cJSON *engine; cJSON *engine;
if (engines) if (engines)
{ {
@ -637,7 +661,7 @@ void updateCapitalShipComponentProperties(Entity *parent, long flags)
flags &= ~EF_AI_LEADER; 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) if (e->owner == parent)
{ {
@ -675,11 +699,11 @@ void updateCapitalShipComponentProperties(Entity *parent, long flags)
void loadCapitalShips(cJSON *node) void loadCapitalShips(cJSON *node)
{ {
Entity *e; Entity *e;
char **types, *name, *groupName, *type; char **types, *name, *groupName, *type;
int side, scatter, number, active; int side, scatter, number, active;
int i, numTypes, addFlags; int i, numTypes, addFlags;
long flags; long flags;
float x, y; float x, y;
if (node) if (node)
{ {
@ -706,7 +730,7 @@ void loadCapitalShips(cJSON *node)
flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags);
} }
for (i = 0 ; i < number ; i++) for (i = 0; i < number; i++)
{ {
type = types[rand() % numTypes]; type = types[rand() % numTypes];
@ -751,7 +775,7 @@ void loadCapitalShips(cJSON *node)
node = node->next; node = node->next;
for (i = 0 ; i < numTypes ; i++) for (i = 0; i < numTypes; i++)
{ {
free(types[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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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.
*/ */
void destroyCapitalShipDefs(void);
#include "../common.h" void loadCapitalShips(struct cJSON *node);
void updateCapitalShipComponentProperties(Entity *parent, long flags);
#include "../json/cJSON.h" void loadCapitalShipDefs(void);
void doCapitalShip(void);
#define TURN_SPEED 0.1 Entity *spawnCapitalShip(char *name, int x, int y, int side);
#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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "debris.h"
#define INITIAL_DEBRIS_DRAW_CAPACITY 32
#define MAX_DEBRIS_TEXTURES 6
extern Battle battle;
static void changeCourse(Debris *d); static void changeCourse(Debris *d);
static void resizeDrawList(void); static void resizeDrawList(void);
static Debris **debrisToDraw; static Debris **debrisToDraw;
static AtlasImage *debrisTexture[MAX_DEBRIS_TEXTURES]; static AtlasImage *debrisTexture[MAX_DEBRIS_TEXTURES];
static int drawCapacity; static int drawCapacity;
void initDebris(void) void initDebris(void)
{ {
@ -38,16 +50,16 @@ void initDebris(void)
drawCapacity = INITIAL_DEBRIS_DRAW_CAPACITY; drawCapacity = INITIAL_DEBRIS_DRAW_CAPACITY;
debrisToDraw = malloc(sizeof(Bullet*) * drawCapacity); debrisToDraw = malloc(sizeof(Bullet *) * drawCapacity);
memset(debrisToDraw, 0, sizeof(Bullet*) * drawCapacity); memset(debrisToDraw, 0, sizeof(Bullet *) * drawCapacity);
} }
void addDebris(int x, int y, int amount) void addDebris(int x, int y, int amount)
{ {
int i; int i;
Debris *d; Debris *d;
for (i = 0 ; i < amount ; i++) for (i = 0; i < amount; i++)
{ {
d = malloc(sizeof(Debris)); d = malloc(sizeof(Debris));
memset(d, 0, sizeof(Debris)); memset(d, 0, sizeof(Debris));
@ -68,16 +80,16 @@ void addDebris(int x, int y, int amount)
void doDebris(void) void doDebris(void)
{ {
int i; int i;
Debris *d, *prev; Debris *d, *prev;
memset(debrisToDraw, 0, sizeof(Debris*) * drawCapacity); memset(debrisToDraw, 0, sizeof(Debris *) * drawCapacity);
prev = &battle.debrisHead; prev = &battle.debrisHead;
i = 0; 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->x += d->dx;
d->y += d->dy; 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); 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; drawCapacity = n;
} }
@ -148,10 +160,10 @@ static void changeCourse(Debris *d)
void drawDebris(void) void drawDebris(void)
{ {
int i; int i;
Debris *d; 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); 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void destroyDebris(void);
void drawDebris(void);
#include "../json/cJSON.h" void doDebris(void);
void addDebris(int x, int y, int amount);
#define INITIAL_DEBRIS_DRAW_CAPACITY 32 void initDebris(void);
#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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 setRandomFlameHue(Effect *e);
static void setRandomShieldHue(Effect *e); static void setRandomShieldHue(Effect *e);
static void resizeDrawList(void); static void resizeDrawList(void);
static int pointOnScreen(float x, float y); static int pointOnScreen(float x, float y);
static AtlasImage *explosionTexture; static AtlasImage *explosionTexture;
static AtlasImage *shieldHitTexture; static AtlasImage *shieldHitTexture;
static AtlasImage *haloTexture; static AtlasImage *haloTexture;
static Effect **effectsToDraw; static Effect **effectsToDraw;
static int drawCapacity; static int drawCapacity;
void initEffects(void) void initEffects(void)
{ {
@ -39,21 +50,21 @@ void initEffects(void)
drawCapacity = INITIAL_EFFECT_DRAW_CAPACITY; drawCapacity = INITIAL_EFFECT_DRAW_CAPACITY;
effectsToDraw = malloc(sizeof(Effect*) * drawCapacity); effectsToDraw = malloc(sizeof(Effect *) * drawCapacity);
memset(effectsToDraw, 0, sizeof(Effect*) * drawCapacity); memset(effectsToDraw, 0, sizeof(Effect *) * drawCapacity);
} }
void doEffects(void) void doEffects(void)
{ {
int i, onScreen; int i, onScreen;
Effect *e; Effect *e;
Effect *prev = &battle.effectHead; Effect *prev = &battle.effectHead;
i = 0; 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->x += e->dx;
e->y += e->dy; 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); 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; drawCapacity = n;
} }
void drawEffects(void) void drawEffects(void)
{ {
int i; int i;
Effect *e; Effect *e;
SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND); 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); 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) void addBulletHitEffect(int x, int y, int r, int g, int b)
{ {
Effect *e; Effect *e;
int i; int i;
for (i = 0 ; i < 4 ; i++) for (i = 0; i < 4; i++)
{ {
e = malloc(sizeof(Effect)); e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect)); memset(e, 0, sizeof(Effect));
@ -271,10 +282,10 @@ void addDebrisFire(int x, int y)
void addSmallExplosion(void) void addSmallExplosion(void)
{ {
int i; int i;
Effect *e; Effect *e;
for (i = 0 ; i < 32 ; i++) for (i = 0; i < 32; i++)
{ {
e = malloc(sizeof(Effect)); e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect)); memset(e, 0, sizeof(Effect));
@ -302,7 +313,7 @@ void addSmallExplosion(void)
e->y -= e->size / 2; e->y -= e->size / 2;
} }
for (i = 0 ; i < 96 ; i++) for (i = 0; i < 96; i++)
{ {
e = malloc(sizeof(Effect)); e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect)); memset(e, 0, sizeof(Effect));
@ -326,10 +337,10 @@ void addSmallExplosion(void)
void addMineExplosion(void) void addMineExplosion(void)
{ {
int i; int i;
Effect *e; Effect *e;
for (i = 0 ; i < 64 ; i++) for (i = 0; i < 64; i++)
{ {
e = malloc(sizeof(Effect)); e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect)); memset(e, 0, sizeof(Effect));
@ -376,10 +387,10 @@ void addMineExplosion(void)
void addLargeExplosion(void) void addLargeExplosion(void)
{ {
int i; int i;
Effect *e; Effect *e;
for (i = 0 ; i < 64 ; i++) for (i = 0; i < 64; i++)
{ {
e = malloc(sizeof(Effect)); e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect)); memset(e, 0, sizeof(Effect));
@ -430,10 +441,10 @@ void addLargeExplosion(void)
void addMissileExplosion(Bullet *b) void addMissileExplosion(Bullet *b)
{ {
int i; int i;
Effect *e; Effect *e;
for (i = 0 ; i < 8 ; i++) for (i = 0; i < 8; i++)
{ {
e = malloc(sizeof(Effect)); e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect)); memset(e, 0, sizeof(Effect));
@ -461,7 +472,7 @@ void addMissileExplosion(Bullet *b)
e->y -= e->size / 2; e->y -= e->size / 2;
} }
for (i = 0 ; i < 24 ; i++) for (i = 0; i < 24; i++)
{ {
e = malloc(sizeof(Effect)); e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect)); memset(e, 0, sizeof(Effect));
@ -486,8 +497,8 @@ void addMissileExplosion(Bullet *b)
void addEngineEffect(void) void addEngineEffect(void)
{ {
Effect *e; Effect *e;
float c, s; float c, s;
int h; int h;
e = malloc(sizeof(Effect)); e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect)); memset(e, 0, sizeof(Effect));
@ -585,10 +596,10 @@ void addMissileEngineEffect(Bullet *b)
void addShieldSplinterEffect(Entity *ent) void addShieldSplinterEffect(Entity *ent)
{ {
int i; int i;
Effect *e; Effect *e;
for (i = 0 ; i < 48 ; i++) for (i = 0; i < 48; i++)
{ {
e = malloc(sizeof(Effect)); e = malloc(sizeof(Effect));
memset(e, 0, sizeof(Effect)); memset(e, 0, sizeof(Effect));
@ -612,10 +623,10 @@ void addShieldSplinterEffect(Entity *ent)
void addECMEffect(Entity *ent) void addECMEffect(Entity *ent)
{ {
int i; int i;
Effect *e; Effect *e;
for (i = 0 ; i < 3 ; i++) for (i = 0; i < 3; i++)
{ {
e = malloc(sizeof(Effect)); 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void destroyEffects(void);
void addECMEffect(Entity *ent);
#define INITIAL_EFFECT_DRAW_CAPACITY 128 void addShieldSplinterEffect(Entity *ent);
void addMissileEngineEffect(Bullet *b);
extern void blitScaled(AtlasImage *atlasImage, int x, int y, int w, int h, int center); void addLargeEngineEffect(void);
extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2); void addEngineEffect(void);
extern AtlasImage *getAtlasImage(char *name); void addMissileExplosion(Bullet *b);
extern int isOnBattleScreen(int x, int y, int w, int h); void addLargeExplosion(void);
extern void *resize(void *array, int oldSize, int newSize); void addMineExplosion(void);
extern void setAtlasColor(int r, int g, int b, int a); void addSmallExplosion(void);
void addDebrisFire(int x, int y);
extern App app; void addSmallFighterExplosion(void);
extern Battle battle; void addBulletHitEffect(int x, int y, int r, int g, int b);
extern Entity *self; 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 drawEntity(Entity *e);
static void doEntity(void); static void doEntity(void);
static void alignComponents(void); static void alignComponents(void);
@ -27,14 +48,14 @@ static void activateEpicFighters(int side);
static void restrictToBattleArea(Entity *e); static void restrictToBattleArea(Entity *e);
static void drawTargetRects(Entity *e); static void drawTargetRects(Entity *e);
static void drawHealthBar(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 void notifyNewArrivals(void);
static int isComponent(Entity *e); static int isComponent(Entity *e);
static Entity deadHead; static Entity deadHead;
static Entity *deadTail; static Entity *deadTail;
static int disabledGlow; static int disabledGlow;
static int disabledGlowDir; static int disabledGlowDir;
void initEntities(void) void initEntities(void)
{ {
@ -60,9 +81,9 @@ Entity *spawnEntity(void)
void doEntities(void) void doEntities(void)
{ {
int numAllies, numEnemies; int numAllies, numEnemies;
int numActiveAllies, numActiveEnemies; int numActiveAllies, numActiveEnemies;
int numSpawnedEnemies; int numSpawnedEnemies;
Entity *e, *prev; Entity *e, *prev;
prev = &battle.entityHead; prev = &battle.entityHead;
@ -75,7 +96,7 @@ void doEntities(void)
player->shield = player->maxShield; 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); removeFromQuadtree(e, &battle.quadtree);
@ -178,7 +199,7 @@ void doEntities(void)
if (e->killedBy == player && battle.hasSuspicionLevel) 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); battle.suspicionLevel -= (MAX_SUSPICION_LEVEL * 0.5);
} }
@ -349,10 +370,10 @@ static void doEntity(void)
static void alignComponents(void) static void alignComponents(void)
{ {
Entity *e; Entity *e;
float x, y; float x, y;
float c, s; 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)) if (isComponent(e))
{ {
@ -387,17 +408,19 @@ static int isComponent(Entity *e)
void drawEntities(void) void drawEntities(void)
{ {
int i; int i;
Entity *e, **candidates; Entity *e, **candidates;
candidates = getAllEntsWithin(battle.camera.x, battle.camera.y, app.winWidth, app.winHeight, NULL); candidates = getAllEntsWithin(battle.camera.x, battle.camera.y, app.winWidth, app.winHeight, NULL);
/* counting entities to draw */ /* 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; self = e;
@ -525,13 +548,13 @@ static void drawTargetRects(Entity *e)
void activateEntities(char *names) void activateEntities(char *names)
{ {
Entity *e; Entity *e;
char *name; char *name;
name = strtok(names, ";"); name = strtok(names, ";");
while (name) 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) if (strcmp(e->name, name) == 0)
{ {
@ -553,13 +576,13 @@ void activateEntities(char *names)
void activateEntityGroups(char *groupNames) void activateEntityGroups(char *groupNames)
{ {
Entity *e; Entity *e;
char *groupName; char *groupName;
groupName = strtok(groupNames, ";"); groupName = strtok(groupNames, ";");
while (groupName) 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) if (strcmp(e->groupName, groupName) == 0)
{ {
@ -588,7 +611,7 @@ static void notifyNewArrivals(void)
{ {
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 (e->active && (e->type == ET_FIGHTER || e->type == ET_CAPITAL_SHIP)) if (e->active && (e->type == ET_FIGHTER || e->type == ET_CAPITAL_SHIP))
{ {
@ -601,7 +624,7 @@ static void activateEpicFighters(int side)
{ {
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 (!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))) 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; 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))) 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; 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) if (e->active)
{ {
@ -652,8 +675,8 @@ void addAllToQuadtree(void)
static int drawComparator(const void *a, const void *b) static int drawComparator(const void *a, const void *b)
{ {
Entity *e1 = *((Entity**)a); Entity *e1 = *((Entity **)a);
Entity *e2 = *((Entity**)b); Entity *e2 = *((Entity **)b);
return e2->type - e1->type; return e2->type - e1->type;
} }
@ -662,7 +685,7 @@ void killEntity(char *name)
{ {
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, name) == 0) if (strcmp(e->name, name) == 0)
{ {
@ -679,11 +702,11 @@ void killEntity(char *name)
void updateEntitySide(char *sideStr, char *name) void updateEntitySide(char *sideStr, char *name)
{ {
Entity *e; Entity *e;
int side; int side;
side = lookup(sideStr); 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) if (strcmp(e->name, name) == 0)
{ {
@ -701,7 +724,7 @@ void awardPandoranCraftTrophy(void)
{ {
Entity *e; 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) 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void destroyEntities(void);
void awardPandoranCraftTrophy(void);
#define DISABLED_GLOW_MAX 255 void updateEntitySide(char *sideStr, char *name);
#define DISABLED_GLOW_MIN 128 void killEntity(char *name);
#define DISABLED_GLOW_SPEED 3 void addAllToQuadtree(void);
void countNumEnemies(void);
extern void addToQuadtree(Entity *e, Quadtree *root); void activateEntityGroups(char *groupNames);
extern void awardTrophy(char *id); void activateEntities(char *names);
extern void blitRotated(AtlasImage *atlasImage, int x, int y, float angle); void drawEntities(void);
extern void cutRope(Entity *e); void doEntities(void);
extern void doCapitalShip(void); Entity *spawnEntity(void);
extern void doFighter(void); void initEntities(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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "fighters.h"
static void separate(void); extern Battle battle;
static void die(void); extern Colors colors;
static void immediateDie(void); extern Entity *player;
static void spinDie(void); extern Entity *self;
static void straightDie(void); extern Game game;
static void simpleDie(void);
static void randomizeDart(Entity *dart); static void separate(void);
static void randomizeDartGuns(Entity *dart); static void die(void);
static void loadFighterDef(char *filename); static void immediateDie(void);
static void loadFighterDefList(char *filename); 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 Entity *getFighterDef(char *name);
static void addFighterStat(char *name); static void addFighterStat(char *name);
static void incFighterStat(char *key); static void incFighterStat(char *key);
static Entity defHead, *defTail; static Entity defHead, *defTail;
@ -151,7 +176,7 @@ static void randomizeDartGuns(Entity *dart)
dart->guns[0].type = BT_PLASMA; dart->guns[0].type = BT_PLASMA;
dart->guns[0].x = dart->guns[0].y = 0; 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) if (dart->guns[i].type)
{ {
@ -172,7 +197,6 @@ static void randomizeDartGuns(Entity *dart)
dart->guns[2].y = -10; dart->guns[2].y = -10;
break; break;
/* Plasma / Laser cannons */ /* Plasma / Laser cannons */
case 3: case 3:
dart->guns[0].type = BT_PLASMA; dart->guns[0].type = BT_PLASMA;
@ -385,12 +409,12 @@ void doFighter(void)
static void separate(void) static void separate(void)
{ {
int angle; int angle;
int distance; int distance;
float dx, dy, force; float dx, dy, force;
int count; int count;
Entity *e, **candidates; Entity *e, **candidates;
int i; int i;
dx = dy = 0; dx = dy = 0;
count = 0; count = 0;
@ -398,7 +422,7 @@ static void separate(void)
candidates = getAllEntsInRadius(self->x, self->y, self->separationRadius, self); 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))) if ((e->flags & EF_TAKES_DAMAGE) && (!(e->flags & EF_NON_SOLID)))
{ {
@ -683,7 +707,7 @@ void retreatEnemies(void)
{ {
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 (e->type == ET_FIGHTER && e->side != player->side) if (e->type == ET_FIGHTER && e->side != player->side)
{ {
@ -708,7 +732,7 @@ void retreatAllies(void)
{ {
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 (e->type == ET_FIGHTER && e->side == player->side) if (e->type == ET_FIGHTER && e->side == player->side)
{ {
@ -735,7 +759,7 @@ static Entity *getFighterDef(char *name)
{ {
Entity *e; 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) if (strcmp(e->name, name) == 0)
{ {
@ -750,11 +774,11 @@ static Entity *getFighterDef(char *name)
Entity **getDBFighters(int *num) Entity **getDBFighters(int *num)
{ {
Entity *e, **dbFighters; Entity *e, **dbFighters;
int i; int i;
i = *num = 0; 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) 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) if (e->description != NULL)
{ {
@ -790,12 +814,12 @@ void loadFighterDefs(void)
static void loadFighterDefList(char *dir) static void loadFighterDefList(char *dir)
{ {
char **filenames; char **filenames;
char path[MAX_FILENAME_LENGTH]; char path[MAX_FILENAME_LENGTH];
int count, i; int count, i;
filenames = getFileList(dir, &count); filenames = getFileList(dir, &count);
for (i = 0 ; i < count ; i++) for (i = 0; i < count; i++)
{ {
sprintf(path, "%s/%s", dir, filenames[i]); sprintf(path, "%s/%s", dir, filenames[i]);
@ -809,10 +833,10 @@ static void loadFighterDefList(char *dir)
static void loadFighterDef(char *filename) static void loadFighterDef(char *filename)
{ {
cJSON *root, *node; cJSON *root, *node;
char *text; char *text;
Entity *e; Entity *e;
int i, len; int i, len;
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename);
@ -854,7 +878,7 @@ static void loadFighterDef(char *filename)
{ {
i = 0; 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].type = lookup(cJSON_GetObjectItem(node, "type")->valuestring);
e->guns[i].x = cJSON_GetObjectItem(node, "x")->valueint; e->guns[i].x = cJSON_GetObjectItem(node, "x")->valueint;
@ -916,7 +940,7 @@ static void addFighterStat(char *key)
tail = &game.fighterStatHead; 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) if (strcmp(t->key, key) == 0)
{ {
@ -940,7 +964,7 @@ static void incFighterStat(char *key)
{ {
Tuple *t; 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) if (strcmp(t->key, key) == 0)
{ {
@ -953,11 +977,11 @@ static void incFighterStat(char *key)
void loadFighters(cJSON *node) void loadFighters(cJSON *node)
{ {
Entity *e; Entity *e;
char **types, *name, *groupName, *type, *strpos; char **types, *name, *groupName, *type, *strpos;
int side, scatter, number, active; int side, scatter, number, active;
int i, numTypes, addFlags, addAIFlags, id; int i, numTypes, addFlags, addAIFlags, id;
long flags, aiFlags; long flags, aiFlags;
float x, y; float x, y;
if (node) if (node)
{ {
@ -992,7 +1016,7 @@ void loadFighters(cJSON *node)
aiFlags = flagsToLong(cJSON_GetObjectItem(node, "aiFlags")->valuestring, &addAIFlags); aiFlags = flagsToLong(cJSON_GetObjectItem(node, "aiFlags")->valuestring, &addAIFlags);
} }
for (i = 0 ; i < number ; i++) for (i = 0; i < number; i++)
{ {
type = types[rand() % numTypes]; type = types[rand() % numTypes];
@ -1060,7 +1084,7 @@ void loadFighters(cJSON *node)
node = node->next; node = node->next;
for (i = 0 ; i < numTypes ; i++) for (i = 0; i < numTypes; i++)
{ {
free(types[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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void destroyFighterStats(void);
void destroyFighterDefs(void);
#include "../json/cJSON.h" void loadFighters(struct cJSON *node);
void loadFighterDefs(void);
extern void addDebris(int x, int y, int amount); Entity **getDBFighters(int *num);
extern void addEngineEffect(void); void retreatAllies(void);
extern void addHudMessage(SDL_Color c, char *format, ...); void retreatEnemies(void);
extern void addRandomItem(int x, int y); void damageFighter(Entity *e, int amount, long flags);
extern void addShieldSplinterEffect(Entity *ent); void applyFighterBrakes(void);
extern void addSmallExplosion(void); void applyFighterThrust(void);
extern void addSmallFighterExplosion(void); void doFighter(void);
extern void adjustObjectiveTargetValue(char *name, int type, int amount); void resetFighter(Entity *fighter);
extern void attachRope(void); Entity *spawnFighter(char *name, int x, int y, int side);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 drawPlayerTargeter(void);
static void drawNumFighters(void); static void drawNumFighters(void);
static void drawHealthBars(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 drawSuspicionLevel(void);
static void drawMissileWarning(void); static void drawMissileWarning(void);
static HudMessage hudMessageHead; static HudMessage hudMessageHead;
static HudMessage *hudMessageTail; static HudMessage *hudMessageTail;
static AtlasImage *targetPointer; static AtlasImage *targetPointer;
static AtlasImage *targetCircle; static AtlasImage *targetCircle;
@ -48,21 +65,21 @@ static AtlasImage *boost;
static AtlasImage *nextGun; static AtlasImage *nextGun;
static AtlasImage *clockIcon; static AtlasImage *clockIcon;
static AtlasImage *objectives; static AtlasImage *objectives;
static int numMessages; static int numMessages;
static const char *gunName[BT_MAX]; static const char *gunName[BT_MAX];
static char *MISSILES_TEXT; static char *MISSILES_TEXT;
static char *TARGET_TEXT; static char *TARGET_TEXT;
static char *NONE_TEXT; static char *NONE_TEXT;
static char *COMBINED_TEXT; static char *COMBINED_TEXT;
static char *SYSTEM_POWER_TEXT; static char *SYSTEM_POWER_TEXT;
static char *LEADER_DIST_TEXT; static char *LEADER_DIST_TEXT;
static char *TARGET_DIST_TEXT; static char *TARGET_DIST_TEXT;
static char *OBJECTIVE_DIST_TEXT; static char *OBJECTIVE_DIST_TEXT;
static char *JUMPGATE_DIST_TEXT; static char *JUMPGATE_DIST_TEXT;
static char *NEW_FIGHTER_TEXT; static char *NEW_FIGHTER_TEXT;
static char *SUSPICION_TEXT; static char *SUSPICION_TEXT;
static char *REMAINING_PILOTS_TEXT; static char *REMAINING_PILOTS_TEXT;
static char *WARNING_TEXT; static char *WARNING_TEXT;
void initHud(void) void initHud(void)
{ {
@ -113,7 +130,7 @@ void doHud(void)
prev = &hudMessageHead; prev = &hudMessageHead;
for (hudMessage = hudMessageHead.next ; hudMessage != NULL ; hudMessage = hudMessage->next) for (hudMessage = hudMessageHead.next; hudMessage != NULL; hudMessage = hudMessage->next)
{ {
hudMessage->life--; hudMessage->life--;
@ -203,7 +220,7 @@ void drawHud(void)
static void drawHealthBars(void) static void drawHealthBars(void)
{ {
float p; float p;
int r, g, b; int r, g, b;
r = g = b = 0; r = g = b = 0;
p = player->health; 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) static void drawHealthShieldBar(int current, int max, int x, int y, int r, int g, int b, int flashLow)
{ {
SDL_Rect rect; SDL_Rect rect;
float percent = 0; float percent = 0;
if (max > 0) if (max > 0)
{ {
@ -332,7 +349,7 @@ static void drawWeaponInfo(void)
{ {
y = 70; y = 70;
for (i = 0 ; i < BT_MAX ; i++) for (i = 0; i < BT_MAX; i++)
{ {
if (playerHasGun(i)) if (playerHasGun(i))
{ {
@ -367,7 +384,7 @@ static void drawWeaponInfo(void)
static void drawPlayerTargeter(void) static void drawPlayerTargeter(void)
{ {
float angle; float angle;
int x, y; int x, y;
if (player->target || battle.missionTarget || jumpgateEnabled() || battle.messageSpeaker) 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) static void drawDistancesInfo(void)
{ {
int y; int y;
float distance; float distance;
y = 11; y = 11;
@ -599,9 +616,9 @@ static void drawDistancesInfo(void)
static void drawHudMessages(void) static void drawHudMessages(void)
{ {
HudMessage *hudMessage; 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); 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void resetHud(void);
void drawHud(void);
#define MAX_HUD_MESSAGES 6 void addHudMessage(SDL_Color c, char *format, ...);
void doHud(void);
extern void blit(AtlasImage *atlasImage, int x, int y, int center); void initHud(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 *getItemDef(char *name);
static Entity defHead, *defTail; static Entity defHead, *defTail;
void loadItemDefs(void) void loadItemDefs(void)
{ {
cJSON *root, *node; cJSON *root, *node;
char *text; char *text;
Entity *e; Entity *e;
text = readFile("data/battle/items.json"); text = readFile("data/battle/items.json");
@ -38,7 +55,7 @@ void loadItemDefs(void)
memset(&defHead, 0, sizeof(Entity)); memset(&defHead, 0, sizeof(Entity));
defTail = &defHead; defTail = &defHead;
for (node = root->child ; node != NULL ; node = node->next) for (node = root->child; node != NULL; node = node->next)
{ {
e = malloc(sizeof(Entity)); e = malloc(sizeof(Entity));
memset(e, 0, sizeof(Entity)); memset(e, 0, sizeof(Entity));
@ -76,7 +93,7 @@ Entity *spawnItem(char *name)
} }
else else
{ {
for (e = defHead.next ; e != NULL ; e = e->next) for (e = defHead.next; e != NULL; e = e->next)
{ {
if (!def || rand() % 2) if (!def || rand() % 2)
{ {
@ -113,7 +130,7 @@ static Entity *getItemDef(char *defName)
{ {
Entity *e; 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) if (strcmp(e->defName, defName) == 0)
{ {
@ -128,11 +145,11 @@ static Entity *getItemDef(char *defName)
static void action(void) static void action(void)
{ {
Entity *e, **candidates; Entity *e, **candidates;
int i; int i;
candidates = getAllEntsInRadius(self->x, self->y, MAX(self->w, self->h), self); 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)) 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) void loadItems(cJSON *node)
{ {
Entity *e; Entity *e;
char *name, *groupName, *type; char *name, *groupName, *type;
int i, scatter, number, active, addFlags; int i, scatter, number, active, addFlags;
long flags; long flags;
float x, y; float x, y;
flags = -1; flags = -1;
scatter = 1; scatter = 1;
@ -190,7 +207,7 @@ void loadItems(cJSON *node)
flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags);
} }
for (i = 0 ; i < number ; i++) for (i = 0; i < number; i++)
{ {
e = spawnItem(type); 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void destroyItemDefs(void);
void loadItems(struct cJSON *node);
#include "../json/cJSON.h" void addRandomItem(int x, int y);
Entity *spawnItem(char *name);
extern void addHudMessage(SDL_Color c, char *format, ...); void loadItemDefs(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "jumpgate.h"
#define ESCAPE_DISTANCE 256
extern Battle battle;
extern Entity *self;
static void think(void); static void think(void);
static void draw(void); static void draw(void);
static void handleFleeingEntities(void); static void handleFleeingEntities(void);
@ -28,7 +45,7 @@ static void addNodes(Entity *jumpgate, long flags);
static void nodeDie(void); static void nodeDie(void);
static AtlasImage *portal; static AtlasImage *portal;
static float portalAngle; static float portalAngle;
Entity *spawnJumpgate(int side, long flags) Entity *spawnJumpgate(int side, long flags)
{ {
@ -47,7 +64,7 @@ Entity *spawnJumpgate(int side, long flags)
jumpgate->action = think; jumpgate->action = think;
jumpgate->draw = draw; jumpgate->draw = draw;
jumpgate->side = side; 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) if (flags != -1 && flags & EF_DISABLED)
{ {
@ -69,13 +86,13 @@ Entity *spawnJumpgate(int side, long flags)
static void addNodes(Entity *jumpgate, long flags) static void addNodes(Entity *jumpgate, long flags)
{ {
Entity *node; Entity *node;
AtlasImage *nodeTexture; AtlasImage *nodeTexture;
int i; int i;
nodeTexture = getAtlasImage("gfx/entities/jumpgateNode.png"); nodeTexture = getAtlasImage("gfx/entities/jumpgateNode.png");
for (i = 0 ; i < 360 ; i += 36) for (i = 0; i < 360; i += 36)
{ {
node = spawnEntity(); node = spawnEntity();
STRNCPY(node->name, _("Jumpgate System Node"), MAX_NAME_LENGTH); STRNCPY(node->name, _("Jumpgate System Node"), MAX_NAME_LENGTH);
@ -86,7 +103,7 @@ static void addNodes(Entity *jumpgate, long flags)
node->owner = jumpgate; node->owner = jumpgate;
node->side = jumpgate->side; node->side = jumpgate->side;
node->texture = nodeTexture; node->texture = nodeTexture;
node->flags = EF_TAKES_DAMAGE+EF_AI_IGNORE; node->flags = EF_TAKES_DAMAGE + EF_AI_IGNORE;
node->die = nodeDie; node->die = nodeDie;
node->w = node->texture->rect.w; node->w = node->texture->rect.w;
node->h = node->texture->rect.h; node->h = node->texture->rect.h;
@ -136,7 +153,7 @@ void activateJumpgate(int activate)
if (battle.jumpgate && battle.jumpgate->health > 1) 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) if (e == battle.jumpgate || e->owner == battle.jumpgate)
{ {
@ -180,11 +197,11 @@ static void think(void)
static void handleFleeingEntities(void) static void handleFleeingEntities(void)
{ {
Entity *e, **candidates; Entity *e, **candidates;
int i; int i;
candidates = getAllEntsInRadius(self->x, self->y, ESCAPE_DISTANCE * 2, self); 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) 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) static void addEscapeEffect(Entity *ent)
{ {
Effect *e; Effect *e;
int i, n, speed; int i, n, speed;
n = ent->w * ent->h; n = ent->w * ent->h;
for (i = 0 ; i < n ; i++) for (i = 0; i < n; i++)
{ {
e = malloc(sizeof(Effect)); e = malloc(sizeof(Effect));
memset(e, 0, 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void activateJumpgate(int activate);
int jumpgateEnabled(void);
#define ESCAPE_DISTANCE 256 Entity *spawnJumpgate(int side, long flags);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "locations.h"
extern Battle battle;
extern Entity *player;
void doLocations(void) void doLocations(void)
{ {
Location *l, *prev; Location *l, *prev;
prev = &battle.locationHead; 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) if (l->active && getDistance(player->x, player->y, l->x, l->y) <= l->size)
{ {
@ -45,7 +54,7 @@ void drawLocations(void)
{ {
Location *l; 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) if (l->active)
{ {
@ -56,14 +65,14 @@ void drawLocations(void)
void activateLocations(char *locations) void activateLocations(char *locations)
{ {
char *token; char *token;
Location *l; Location *l;
token = strtok(locations, ";"); token = strtok(locations, ";");
while (token) 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) if (strcmp(token, l->name) == 0)
{ {
@ -81,9 +90,9 @@ void activateLocations(char *locations)
void createChristabelLocation(void) void createChristabelLocation(void)
{ {
Location *l; 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) if (strcmp(e->name, "Christabel") == 0)
{ {
@ -108,7 +117,7 @@ void createChristabelLocation(void)
void loadLocations(cJSON *node) void loadLocations(cJSON *node)
{ {
int active; int active;
Location *l; Location *l;
if (node) if (node)
@ -131,7 +140,6 @@ void loadLocations(cJSON *node)
l->x += (SCREEN_WIDTH / 2); l->x += (SCREEN_WIDTH / 2);
l->y += (SCREEN_HEIGHT / 2); l->y += (SCREEN_HEIGHT / 2);
node = node->next; 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void loadLocations(struct cJSON *node);
void createChristabelLocation(void);
#include "../json/cJSON.h" void activateLocations(char *locations);
void drawLocations(void);
extern void drawCircle(int cx, int cy, int radius, int r, int g, int b, int a); void doLocations(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 calculateMessageBoxHeight(MessageBox *msg);
static void nextMessage(void); static void nextMessage(void);
static MessageBox head; static MessageBox head;
static MessageBox *tail; static MessageBox *tail;
static Entity *lastWingmate; static Entity *lastWingmate;
void initMessageBox(void) void initMessageBox(void)
{ {
@ -38,8 +49,8 @@ void initMessageBox(void)
void addMessageBox(char *title, char *body, int type) void addMessageBox(char *title, char *body, int type)
{ {
MessageBox *msg; MessageBox *msg;
int isFirst; int isFirst;
float time; float time;
isFirst = (tail == &head); isFirst = (tail == &head);
@ -119,7 +130,7 @@ int showingMessageBoxes(void)
void drawMessageBox(void) void drawMessageBox(void)
{ {
MessageBox *msg = head.next; MessageBox *msg = head.next;
SDL_Rect r; SDL_Rect r;
if (msg && msg->time > 0) if (msg && msg->time > 0)
{ {
@ -173,7 +184,7 @@ void drawMessageBox(void)
static void nextMessage(void) static void nextMessage(void)
{ {
Entity *e, *wingmate; Entity *e, *wingmate;
int isWingmate; int isWingmate;
wingmate = NULL; wingmate = NULL;
@ -181,7 +192,7 @@ static void nextMessage(void)
playSound(SND_RADIO); 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) if (e->active && e != player)
{ {
@ -191,7 +202,7 @@ static void nextMessage(void)
return; 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; 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void resetMessageBox(void);
void drawMessageBox(void);
#define MSG_BOX_TEXT_WIDTH 600 int showingMessageBoxes(void);
void doMessageBox(void);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...); void addMessageBox(char *title, char *body, int type);
extern int getWrappedTextHeight(char *text, int size); void initMessageBox(void);
extern void playSound(int sound);
extern void useFont(char *name);
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *player;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 think(void);
static void die(void); static void die(void);
static void lookForFighters(void); static void lookForFighters(void);
@ -49,7 +69,7 @@ Entity *spawnMine(int type)
mine->texture = (type == ET_MINE) ? mineNormal : shadowMine; mine->texture = (type == ET_MINE) ? mineNormal : shadowMine;
mine->action = think; mine->action = think;
mine->die = die; 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) if (type == ET_SHADOW_MINE)
{ {
@ -98,11 +118,11 @@ static void think(void)
static void lookForFighters(void) static void lookForFighters(void)
{ {
Entity *e, **candidates; Entity *e, **candidates;
int i; int i;
candidates = getAllEntsInRadius(self->x, self->y, DAMAGE_RANGE, self); 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) 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) static void lookForPlayer(void)
{ {
float dx, dy, norm; float dx, dy, norm;
int distance; int distance;
if (player->alive == ALIVE_ALIVE) if (player->alive == ALIVE_ALIVE)
{ {
@ -197,14 +217,14 @@ static void die(void)
static void doSplashDamage(void) static void doSplashDamage(void)
{ {
Entity *e, **candidates; Entity *e, **candidates;
int i, dist, kills; int i, dist, kills;
float damage, percent; float damage, percent;
candidates = getAllEntsInRadius(self->x, self->y, DAMAGE_RANGE, self); candidates = getAllEntsInRadius(self->x, self->y, DAMAGE_RANGE, self);
kills = 0; 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)) 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" Entity *spawnMine(int type);
#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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "missionInfo.h"
extern App app;
extern Battle battle;
extern Colors colors;
extern Game game;
static void drawMissionSummary(AtlasImage *title); static void drawMissionSummary(AtlasImage *title);
static void drawObjectives(void); static void drawObjectives(void);
static void drawChallenges(void); static void drawChallenges(void);
@ -30,9 +43,9 @@ static AtlasImage *missionCompleteTexture;
static AtlasImage *missionFailedTexture; static AtlasImage *missionFailedTexture;
static AtlasImage *timeUpTexture; static AtlasImage *timeUpTexture;
static const char *objectiveStatus[OS_MAX]; static const char *objectiveStatus[OS_MAX];
static char *OBJECTIVES_TEXT; static char *OBJECTIVES_TEXT;
static char *NONE_TEXT; static char *NONE_TEXT;
static char *TIME_LIMIT_TEXT; static char *TIME_LIMIT_TEXT;
void initMissionInfo(void) void initMissionInfo(void)
{ {
@ -126,14 +139,14 @@ static void drawMissionSummary(AtlasImage *header)
static void drawObjectives(void) static void drawObjectives(void)
{ {
Objective *o; Objective *o;
SDL_Color color; SDL_Color color;
int y = 215; int y = 215;
drawText(UI_WIDTH / 2, y, 28, TA_CENTER, colors.white, OBJECTIVES_TEXT); drawText(UI_WIDTH / 2, y, 28, TA_CENTER, colors.white, OBJECTIVES_TEXT);
y += 10; 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) if (o->active)
{ {
@ -177,24 +190,24 @@ static void drawObjectives(void)
static void drawChallenges(void) static void drawChallenges(void)
{ {
int i; int i;
Challenge *c; Challenge *c;
char *challengeStatus; char *challengeStatus;
SDL_Color color; SDL_Color color;
int y = 215; int y = 215;
drawText(UI_WIDTH / 2, y, 24, TA_CENTER, colors.white, game.currentMission->description); drawText(UI_WIDTH / 2, y, 24, TA_CENTER, colors.white, game.currentMission->description);
if (battle.status == MS_START && game.currentMission->challengeData.timeLimit) 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)); drawText(UI_WIDTH / 2, y, 20, TA_CENTER, colors.white, TIME_LIMIT_TEXT, timeToString(game.currentMission->challengeData.timeLimit, 0));
} }
y += 25; y += 25;
for (i = 0 ; i < MAX_CHALLENGES ; i++) for (i = 0; i < MAX_CHALLENGES; i++)
{ {
c = game.currentMission->challengeData.challenges[i]; c = game.currentMission->challengeData.challenges[i];
@ -212,7 +225,7 @@ static void drawChallenges(void)
challengeStatus = _("Complete"); 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; 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void drawMissionInfo(void);
void initMissionInfo(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "objectives.h"
extern Battle battle;
extern Colors colors;
static int fireObjectivesComplete; static int fireObjectivesComplete;
void doObjectives(void) void doObjectives(void)
{ {
int objectiveFailed; int objectiveFailed;
int hasHidden; int hasHidden;
Objective *o; Objective *o;
battle.numObjectivesComplete = battle.numObjectivesTotal = battle.numConditions = 0; battle.numObjectivesComplete = battle.numObjectivesTotal = battle.numConditions = 0;
objectiveFailed = 0; objectiveFailed = 0;
hasHidden = 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) if (o->active)
{ {
@ -105,7 +117,7 @@ void doObjectives(void)
void updateObjective(char *name, int type) void updateObjective(char *name, int type)
{ {
Objective *o; Objective *o;
int completed, hasHidden; int completed, hasHidden;
if (strlen(name)) if (strlen(name))
{ {
@ -113,7 +125,7 @@ void updateObjective(char *name, int type)
hasHidden = 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 && o->status != OS_COMPLETE) if (o->active && o->status != OS_COMPLETE)
{ {
@ -167,7 +179,7 @@ void adjustObjectiveTargetValue(char *name, int type, int amount)
{ {
Objective *o; 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) 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)) 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) 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; 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; o->status = OS_COMPLETE;
} }
@ -227,7 +239,7 @@ void completeConditions(void)
{ {
Objective *o; 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) if (o->isCondition)
{ {
@ -238,12 +250,11 @@ void completeConditions(void)
} }
} }
void failIncompleteObjectives(void) void failIncompleteObjectives(void)
{ {
Objective *o; 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) if (o->status != OS_COMPLETE)
{ {
@ -254,9 +265,9 @@ void failIncompleteObjectives(void)
void activateObjectives(char *objectives) void activateObjectives(char *objectives)
{ {
char *token; char *token;
Objective *o; Objective *o;
int activated; int activated;
activated = 0; activated = 0;
@ -264,7 +275,7 @@ void activateObjectives(char *objectives)
while (token) 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) if (strcmp(token, o->id) == 0)
{ {
@ -333,7 +344,7 @@ void loadObjectives(cJSON *node)
void addEpicLivesObjective(void) void addEpicLivesObjective(void)
{ {
Objective *o; Objective *o;
char id[MAX_DESCRIPTION_LENGTH]; char id[MAX_DESCRIPTION_LENGTH];
o = malloc(sizeof(Objective)); o = malloc(sizeof(Objective));
memset(o, 0, sizeof(Objective)); memset(o, 0, sizeof(Objective));
@ -354,7 +365,7 @@ void addEpicLivesObjective(void)
void addEpicKillsObjective(void) void addEpicKillsObjective(void)
{ {
Objective *o; Objective *o;
char id[MAX_DESCRIPTION_LENGTH]; char id[MAX_DESCRIPTION_LENGTH];
o = malloc(sizeof(Objective)); o = malloc(sizeof(Objective));
memset(o, 0, 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void addEpicKillsObjective(void);
#include "../json/cJSON.h" void addEpicLivesObjective(void);
void loadObjectives(struct cJSON *node);
extern void addHudMessage(SDL_Color c, char *format, ...); void activateObjectives(char *objectives);
extern void completeMission(void); void failIncompleteObjectives(void);
extern void failMission(void); void completeConditions(void);
extern int getJSONValue(cJSON *node, char *name, int defValue); void completeAllObjectives(void);
extern long lookup(char *name); void updateCondition(char *name, int type);
extern void playSound(int id); void adjustObjectiveTargetValue(char *name, int type, int amount);
extern void runScriptFunction(char *format, ...); void updateObjective(char *name, int type);
void doObjectives(void);
extern Battle battle;
extern Colors colors;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 selectTarget(void);
static void switchGuns(void); static void switchGuns(void);
static void cycleRadarZoom(void); static void cycleRadarZoom(void);
@ -34,15 +59,15 @@ static void faceMouse(void);
static void handleMouse(void); static void handleMouse(void);
static void preFireMissile(void); static void preFireMissile(void);
static void applyRestrictions(void); static void applyRestrictions(void);
static int isPriorityMissionTarget(Entity *e, int dist, int closest); static int isPriorityMissionTarget(Entity *e, int dist, int closest);
static int targetOutOfRange(void); static int targetOutOfRange(void);
static void rechargeBoostECM(void); static void rechargeBoostECM(void);
static void setPilotName(void); static void setPilotName(void);
static void updateDeathStats(void); static void updateDeathStats(void);
static void handleSuspicionLevel(void); static void handleSuspicionLevel(void);
static int selectedPlayerIndex; static int selectedPlayerIndex;
static int availableGuns[BT_MAX]; static int availableGuns[BT_MAX];
static Entity *availablePlayerUnits[MAX_SELECTABLE_PLAYERS]; static Entity *availablePlayerUnits[MAX_SELECTABLE_PLAYERS];
void initPlayer(void) void initPlayer(void)
@ -57,7 +82,7 @@ void initPlayer(void)
if (!player->combinedGuns) if (!player->combinedGuns)
{ {
for (i = 0 ; i < MAX_FIGHTER_GUNS ; i++) for (i = 0; i < MAX_FIGHTER_GUNS; i++)
{ {
n = player->guns[i].type; n = player->guns[i].type;
@ -105,7 +130,7 @@ static void setPilotName(void)
pos = -1; 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] == ' ') if (game.currentMission->pilot[i] == ' ')
{ {
@ -441,13 +466,13 @@ static void initPlayerSelect(void)
{ {
Entity *e; Entity *e;
memset(&availablePlayerUnits, 0, sizeof(Entity*) * MAX_SELECTABLE_PLAYERS); memset(&availablePlayerUnits, 0, sizeof(Entity *) * MAX_SELECTABLE_PLAYERS);
selectedPlayerIndex = 0; selectedPlayerIndex = 0;
if (battle.epicLives == 0 || (battle.epicLives > 0 && --battle.epicLives > 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) 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); selectedPlayerIndex = mod(selectedPlayerIndex, MAX_SELECTABLE_PLAYERS);
player = availablePlayerUnits[selectedPlayerIndex]; player = availablePlayerUnits[selectedPlayerIndex];
} } while (player == NULL);
while (player == NULL);
battle.camera.x = player->x - (app.winWidth / 2); battle.camera.x = player->x - (app.winWidth / 2);
battle.camera.y = player->y - (app.winHeight / 2); battle.camera.y = player->y - (app.winHeight / 2);
@ -572,8 +596,7 @@ static void switchGuns(void)
do do
{ {
i = (i + 1) % BT_MAX; i = (i + 1) % BT_MAX;
} } while (!availableGuns[i]);
while (!availableGuns[i]);
} }
if (player->selectedGunType != i) if (player->selectedGunType != i)
@ -587,20 +610,20 @@ static void selectTarget(void)
{ {
unsigned int closest = MAX_TARGET_RANGE; unsigned int closest = MAX_TARGET_RANGE;
unsigned int dist = MAX_TARGET_RANGE; unsigned int dist = MAX_TARGET_RANGE;
int i, total; int i, total;
Entity *e, *near; Entity *e, *near;
Entity *targets[MAX_SELECTABLE_TARGETS]; Entity *targets[MAX_SELECTABLE_TARGETS];
i = 0; i = 0;
near = NULL; 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)) if (player->target && (!player->target->health || !player->target->systemPower))
{ {
player->target = NULL; 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) 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; total = i;
for (i = 0 ; i < total ; i++) for (i = 0; i < total; i++)
{ {
if (targets[i] == player->target) if (targets[i] == player->target)
{ {
@ -651,11 +674,11 @@ static void selectMissionTarget(void)
{ {
unsigned int closest = MAX_TARGET_RANGE; unsigned int closest = MAX_TARGET_RANGE;
unsigned int dist = MAX_TARGET_RANGE; unsigned int dist = MAX_TARGET_RANGE;
Entity *e; Entity *e;
battle.missionTarget = NULL; 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) 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) if (e->side == player->side)
{ {
@ -764,8 +787,8 @@ static void handleSuspicionLevel(void)
void loadPlayer(cJSON *node) void loadPlayer(cJSON *node)
{ {
char *type; char *type;
int side, addFlags; int side, addFlags;
long flags; long flags;
type = cJSON_GetObjectItem(node, "type")->valuestring; type = cJSON_GetObjectItem(node, "type")->valuestring;
side = lookup(cJSON_GetObjectItem(node, "side")->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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void loadPlayer(struct cJSON *node);
#include "../json/cJSON.h" int playerHasGun(int type);
void setInitialPlayerAngle(void);
#define MAX_SELECTABLE_PLAYERS 8 void doPlayerSelect(void);
#define MAX_SELECTABLE_TARGETS 8 void doPlayer(void);
void initPlayer(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "quadtree.h"
static Entity **candidates; #define QT_INITIAL_CAPACITY 8
static int cIndex; #define QT_MAX_DEPTH 5
static int cCapacity;
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 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 getAllEntsWithinNode(int x, int y, int w, int h, Entity *ignore, Quadtree *root);
static void destroyQuadtreeNode(Quadtree *root); static void destroyQuadtreeNode(Quadtree *root);
static void resizeQTEntCapacity(Quadtree *root); static void resizeQTEntCapacity(Quadtree *root);
@ -35,7 +43,7 @@ static void resizeCandidates(void);
void initQuadtree(Quadtree *root) void initQuadtree(Quadtree *root)
{ {
Quadtree *node; Quadtree *node;
int i, w, h; int i, w, h;
/* entire battlefield */ /* entire battlefield */
if (root->depth == 0) if (root->depth == 0)
@ -43,13 +51,13 @@ void initQuadtree(Quadtree *root)
root->w = BATTLE_AREA_WIDTH; root->w = BATTLE_AREA_WIDTH;
root->h = BATTLE_AREA_HEIGHT; root->h = BATTLE_AREA_HEIGHT;
root->capacity = QT_INITIAL_CAPACITY; root->capacity = QT_INITIAL_CAPACITY;
root->ents = malloc(sizeof(Entity*) * root->capacity); root->ents = malloc(sizeof(Entity *) * root->capacity);
memset(root->ents, 0, sizeof(Entity*) * root->capacity); memset(root->ents, 0, sizeof(Entity *) * root->capacity);
cIndex = 0; cIndex = 0;
cCapacity = QT_INITIAL_CAPACITY; cCapacity = QT_INITIAL_CAPACITY;
candidates = malloc(sizeof(Entity*) * cCapacity); candidates = malloc(sizeof(Entity *) * cCapacity);
memset(candidates, 0, sizeof(Entity*) * cCapacity); memset(candidates, 0, sizeof(Entity *) * cCapacity);
} }
w = root->w / 2; w = root->w / 2;
@ -57,7 +65,7 @@ void initQuadtree(Quadtree *root)
if (root->depth + 1 < QT_MAX_DEPTH) if (root->depth + 1 < QT_MAX_DEPTH)
{ {
for (i = 0 ; i < 4 ; i++) for (i = 0; i < 4; i++)
{ {
node = malloc(sizeof(Quadtree)); node = malloc(sizeof(Quadtree));
memset(node, 0, sizeof(Quadtree)); memset(node, 0, sizeof(Quadtree));
@ -65,8 +73,8 @@ void initQuadtree(Quadtree *root)
node->depth = root->depth + 1; node->depth = root->depth + 1;
node->capacity = QT_INITIAL_CAPACITY; node->capacity = QT_INITIAL_CAPACITY;
node->ents = malloc(sizeof(Entity*) * node->capacity); node->ents = malloc(sizeof(Entity *) * node->capacity);
memset(node->ents, 0, sizeof(Entity*) * node->capacity); memset(node->ents, 0, sizeof(Entity *) * node->capacity);
if (i == 0) 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); 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; root->capacity = n;
} }
@ -211,7 +219,7 @@ static void removeEntity(Entity *e, Quadtree *root)
n = root->numEnts; n = root->numEnts;
for (i = 0 ; i < root->capacity ; i++) for (i = 0; i < root->capacity; i++)
{ {
if (root->ents[i] == e) 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) Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore)
{ {
cIndex = 0; cIndex = 0;
memset(candidates, 0, sizeof(Entity*) * cCapacity); memset(candidates, 0, sizeof(Entity *) * cCapacity);
getAllEntsWithinNode(x, y, w, h, ignore, &battle.quadtree); 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 else
{ {
for (i = 0 ; i < 4 ; i++) for (i = 0; i < 4; i++)
{ {
getAllEntsWithinNode(x, y, w, h, ignore, root->node[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]; 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); 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; cCapacity = n;
} }
@ -307,7 +315,7 @@ static void destroyQuadtreeNode(Quadtree *root)
if (root->node[0]) if (root->node[0])
{ {
for (i = 0 ; i < 4 ; i++) for (i = 0; i < 4; i++)
{ {
destroyQuadtreeNode(root->node[i]); destroyQuadtreeNode(root->node[i]);
@ -320,18 +328,18 @@ static void destroyQuadtreeNode(Quadtree *root)
static int candidatesComparator(const void *a, const void *b) static int candidatesComparator(const void *a, const void *b)
{ {
Entity *e1 = *((Entity**)a); Entity *e1 = *((Entity **)a);
Entity *e2 = *((Entity**)b); Entity *e2 = *((Entity **)b);
if (!e1) if (!e1)
{ {
return 1; return 1;
} }
else if (!e2) else if (!e2)
{ {
return -1; return -1;
} }
else else
{ {
return 0; 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void destroyQuadtree(void);
Entity **getAllEntsInRadius(int x, int y, int radius, Entity *ignore);
#define QT_INITIAL_CAPACITY 8 Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore);
#define QT_MAX_DEPTH 5 void removeFromQuadtree(Entity *e, Quadtree *root);
void addToQuadtree(Entity *e, Quadtree *root);
extern void *resize(void *array, int oldSize, int newSize); void initQuadtree(Quadtree *root);
extern Battle battle;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "radar.h"
extern App app;
extern Battle battle;
extern Colors colors;
extern Entity *player;
static AtlasImage *radarTexture; static AtlasImage *radarTexture;
static AtlasImage *radarWarningTexture; static AtlasImage *radarWarningTexture;
static int radarRanges[] = {20, 40, 60}; static int radarRanges[] = {20, 40, 60};
static char *CAUTION_TEXT; static char *CAUTION_TEXT;
void initRadar(void) void initRadar(void)
{ {
@ -39,8 +50,8 @@ void initRadar(void)
void drawRadar(void) void drawRadar(void)
{ {
SDL_Rect r; SDL_Rect r;
Entity *e; Entity *e;
int dist, inRange, blink; int dist, inRange, blink;
blit(radarTexture, app.winWidth - 85, app.winHeight - 85, 1); blit(radarTexture, app.winWidth - 85, app.winHeight - 85, 1);
@ -50,7 +61,7 @@ void drawRadar(void)
blink = battle.stats[STAT_TIME] % 60 < 30; 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); 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void drawRadarRangeWarning(void);
void drawRadar(void);
extern void blit(AtlasImage *atlasImage, int x, int y, int center); void initRadar(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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) void attachRope(void)
{ {
int i, distance; int i, distance;
Entity *e, **candidates; Entity *e, **candidates;
if ((self->flags & EF_HAS_ROPE) && self->towing == NULL) if ((self->flags & EF_HAS_ROPE) && self->towing == NULL)
{ {
candidates = getAllEntsInRadius(self->x, self->y, self->separationRadius, self); 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) 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) void doRope(Entity *owner)
{ {
float dx, dy, angle, force; float dx, dy, angle, force;
int distance; int distance;
if (owner->towing) 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void cutRope(Entity *e);
void drawRope(Entity *e);
#define ROPE_DISTANCE 128 void doRope(Entity *owner);
void attachRope(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "script.h"
static void executeNextLine(ScriptRunner *runner); extern Battle battle;
void destroyScript(void); extern Colors colors;
static cJSON *scriptJSON, *rootJSON; static void executeNextLine(ScriptRunner *runner);
static ScriptRunner head;
static cJSON *scriptJSON, *rootJSON;
static ScriptRunner head;
static ScriptRunner *tail; static ScriptRunner *tail;
static int runScript; static int runScript;
void initScript(cJSON *root) void initScript(cJSON *root)
{ {
@ -64,7 +79,7 @@ void doScript(void)
{ {
prev = &head; 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); runner->delay = MAX(0, runner->delay - 1);
@ -98,10 +113,10 @@ void doScript(void)
void runScriptFunction(const char *format, ...) void runScriptFunction(const char *format, ...)
{ {
ScriptRunner *scriptRunner; ScriptRunner *scriptRunner;
cJSON *function; cJSON *function;
char *functionName; char *functionName;
char funcNameBuffer[MAX_NAME_LENGTH]; char funcNameBuffer[MAX_NAME_LENGTH];
va_list args; va_list args;
if (scriptJSON && runScript) if (scriptJSON && runScript)
{ {
@ -140,9 +155,9 @@ void runScriptFunction(const char *format, ...)
static void executeNextLine(ScriptRunner *runner) static void executeNextLine(ScriptRunner *runner)
{ {
char *line; char *line;
char command[32]; char command[32];
char strParam[3][256]; char strParam[3][256];
int intParam[2]; int intParam[2];
line = runner->line->valuestring; 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void destroyScript(void);
void cancelScript(void);
#include "../json/cJSON.h" void runScriptFunction(const char *format, ...);
void doScript(void);
extern void activateEntities(char *name); void initScript(struct cJSON *root);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "spawners.h"
extern Battle battle;
extern Entity *player;
void doSpawners(void) void doSpawners(void)
{ {
Entity *e; Entity *e;
Spawner *s; Spawner *s;
char *type; char *type;
int i, num, addFlags, addAIFlags; int i, num, addFlags, addAIFlags;
long flags, aiFlags; 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) if (s->active && --s->time <= 0)
{ {
@ -58,7 +67,7 @@ void doSpawners(void)
aiFlags = flagsToLong(s->aiFlags, &addAIFlags); aiFlags = flagsToLong(s->aiFlags, &addAIFlags);
} }
for (i = 0 ; i < num ; i++) for (i = 0; i < num; i++)
{ {
type = s->types[rand() % s->numTypes]; type = s->types[rand() % s->numTypes];
@ -114,7 +123,7 @@ void activateSpawner(char *name, int active)
{ {
Spawner *s; 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) if (strcmp(s->name, name) == 0)
{ {
@ -126,7 +135,7 @@ void activateSpawner(char *name, int active)
void activateTrespasserSpawner(void) void activateTrespasserSpawner(void)
{ {
Spawner *s; Spawner *s;
char types[MAX_DESCRIPTION_LENGTH]; char types[MAX_DESCRIPTION_LENGTH];
s = malloc(sizeof(Spawner)); s = malloc(sizeof(Spawner));
memset(s, 0, 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void loadSpawners(struct cJSON *node);
void activateTrespasserSpawner(void);
#include "../json/cJSON.h" void activateSpawner(char *name, int active);
void doSpawners(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "starfield.h"
extern App app;
static Star stars[MAX_STARS]; static Star stars[MAX_STARS];
void initStars(void) void initStars(void)
@ -28,7 +33,7 @@ void initStars(void)
memset(stars, 0, sizeof(Star) * MAX_STARS); 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].x = rand() % app.winWidth;
stars[i].y = rand() % app.winHeight; stars[i].y = rand() % app.winHeight;
@ -42,7 +47,7 @@ void doStars(float dx, float dy)
{ {
int i; 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].x -= (dx * stars[i].speed);
stars[i].y -= (dy * stars[i].speed); stars[i].y -= (dy * stars[i].speed);
@ -57,7 +62,7 @@ void drawStars(void)
int i; int i;
int c; int c;
for (i = 0 ; i < MAX_STARS ; i++) for (i = 0; i < MAX_STARS; i++)
{ {
c = 64 * stars[i].speed; 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void drawStars(void);
void doStars(float dx, float dy);
extern float mod(float n, float x); void initStars(void);
extern App app;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "waypoints.h"
extern Battle battle;
extern Colors colors;
extern Entity *player;
extern Entity *self;
extern Game game;
static void think(void); static void think(void);
static int teamMatesClose(void); static int teamMatesClose(void);
static int isCurrentObjective(void); static int isCurrentObjective(void);
void activateNextWaypoint(void);
static int waypointId; static int waypointId;
static int currentWaypointId; static int currentWaypointId;
@ -44,7 +58,7 @@ Entity *spawnWaypoint(void)
waypoint->active = 0; waypoint->active = 0;
waypoint->health = waypoint->maxHealth = FPS; waypoint->health = waypoint->maxHealth = FPS;
waypoint->texture = getAtlasImage("gfx/entities/waypoint.png"); 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->action = think;
waypoint->w = waypoint->texture->rect.w; waypoint->w = waypoint->texture->rect.w;
@ -115,7 +129,7 @@ static int teamMatesClose(void)
if (player->side != SIDE_PANDORAN) 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) if (e->active && e->type == ET_FIGHTER && e->side == SIDE_ALLIES)
{ {
@ -139,7 +153,7 @@ void activateNextWaypoint(void)
currentWaypointId++; 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) 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void activateNextWaypoint(void);
Entity *spawnWaypoint(void);
extern void addHudMessage(SDL_Color c, char *format, ...); void resetWaypoints(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "challengeHome.h"
static void logic(void); #define CHALLENGES_PER_PAGE 14
static void draw(void); #define SHOW_CHALLENGES 0
static void handleKeyboard(void); #define SHOW_FIGHTER_DB 5
static void drawChallenges(void); #define SHOW_MENU 1
static void doChallenges(void); #define SHOW_OPTIONS 2
static void startChallengeMission(void); #define SHOW_STATS 3
static void drawMenu(void); #define SHOW_TROPHIES 4
static void resume(void);
static void stats(void); extern App app;
static void trophies(void); extern Battle battle;
static void options(void); extern Colors colors;
static void ok(void); extern Dev dev;
static void returnFromOptions(void); extern Game game;
static void unlockChallenges(void);
static void quit(void); static void logic(void);
static void updateChallengeMissionData(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 char *listRestrictions(void);
static void prevPage(void); static void prevPage(void);
static void nextPage(void); static void nextPage(void);
static void fighterDatabase(void); static void fighterDatabase(void);
static SDL_Texture *background; static SDL_Texture *background;
static AtlasImage *planetTexture; static AtlasImage *planetTexture;
static AtlasImage *challengeIcon; static AtlasImage *challengeIcon;
static AtlasImage *challengeIconHighlight; static AtlasImage *challengeIconHighlight;
static Widget *start; static Widget *start;
static PointF planet; static PointF planet;
static int show; static int show;
static int page; static int page;
static float maxPages; static float maxPages;
static char timeLimit[MAX_DESCRIPTION_LENGTH]; static char timeLimit[MAX_DESCRIPTION_LENGTH];
static char restrictions[MAX_DESCRIPTION_LENGTH]; static char restrictions[MAX_DESCRIPTION_LENGTH];
static int hasRestrictions; static int hasRestrictions;
static Widget *prev; static Widget *prev;
static Widget *next; static Widget *next;
static char *CHALLENGES_TEXT; static char *CHALLENGES_TEXT;
static char *COMPLETED_TEXT; static char *COMPLETED_TEXT;
static char *PAGE_TEXT; static char *PAGE_TEXT;
static char *LOCKED_TEXT; static char *LOCKED_TEXT;
static char *CRAFT_TEXT; static char *CRAFT_TEXT;
static char *TIME_TEXT; static char *TIME_TEXT;
static char *RESTRICTIONS_TEXT; static char *RESTRICTIONS_TEXT;
void initChallengeHome(void) void initChallengeHome(void)
{ {
@ -98,14 +133,14 @@ void initChallengeHome(void)
challengeIcon = getAtlasImage("gfx/challenges/challengeIcon.png"); challengeIcon = getAtlasImage("gfx/challenges/challengeIcon.png");
challengeIconHighlight = getAtlasImage("gfx/challenges/challengeIconHighlight.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.x = rand() % app.winWidth;
planet.y = rand() % app.winHeight; planet.y = rand() % app.winHeight;
maxPages = page = 0; maxPages = page = 0;
for (m = game.challengeMissionHead.next ; m != NULL ; m = m->next) for (m = game.challengeMissionHead.next; m != NULL; m = m->next)
{ {
maxPages++; maxPages++;
} }
@ -179,7 +214,7 @@ static void unlockChallenges(void)
prevCompleted = 1; 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); m->available = (prevCompleted > 0 || dev.debug);
@ -209,7 +244,7 @@ static void logic(void)
switch (show) switch (show)
{ {
case SHOW_CHALLENGES: case SHOW_CHALLENGES:
doChallenges(); doChallengeList();
break; break;
case SHOW_MENU: case SHOW_MENU:
@ -232,16 +267,16 @@ static void logic(void)
app.doTrophyAlerts = 1; app.doTrophyAlerts = 1;
} }
static void doChallenges(void) static void doChallengeList(void)
{ {
Mission *c; Mission *c;
int i, startIndex, end; int i, startIndex, end;
i = 0; i = 0;
startIndex = page * CHALLENGES_PER_PAGE; startIndex = page * CHALLENGES_PER_PAGE;
end = startIndex + 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)) 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.noBoost, _("No Boost"));
addRestriction(textBuffer, game.currentMission->challengeData.noGuns, _("No Guns")); addRestriction(textBuffer, game.currentMission->challengeData.noGuns, _("No Guns"));
return strlen(textBuffer) > 0 ? textBuffer : "-"; return strlen(textBuffer) > 0 ? textBuffer : "-";
} }
static void draw(void) static void draw(void)
@ -356,10 +391,10 @@ static void draw(void)
static void drawChallenges(void) static void drawChallenges(void)
{ {
Mission *m; Mission *m;
Challenge *c; Challenge *c;
SDL_Rect r; SDL_Rect r;
int i, start, end; int i, start, end;
r.x = 135; r.x = 135;
r.y = 165; r.y = 165;
@ -370,7 +405,7 @@ static void drawChallenges(void)
i = 0; 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; 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void initChallengeHome(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 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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "challenges.h"
static void updateTimeChallenge(Challenge *c); extern Battle battle;
static void updateSurvivalChallenge(Challenge *c); extern Dev dev;
static void updateAccuracyChallenge(Challenge *c); extern Entity *player;
static void updateArmourChallenge(Challenge *c); extern Game game;
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);
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]; static const char *challengeDescription[CHALLENGE_MAX];
void initChallenges(void) void initChallenges(void)
{ {
Mission *mission, *tail; Mission *mission, *tail;
char **filenames; char **filenames;
char path[MAX_FILENAME_LENGTH]; char path[MAX_FILENAME_LENGTH];
int count, i; int count, i;
challengeDescription[CHALLENGE_ARMOUR] = _("Retain at least %d%% armour"); challengeDescription[CHALLENGE_ARMOUR] = _("Retain at least %d%% armour");
challengeDescription[CHALLENGE_TIME] = _("Complete challenge in %d seconds or less"); challengeDescription[CHALLENGE_TIME] = _("Complete challenge in %d seconds or less");
@ -71,7 +86,7 @@ void initChallenges(void)
filenames = getFileList("data/challenges", &count); filenames = getFileList("data/challenges", &count);
for (i = 0 ; i < count ; i++) for (i = 0; i < count; i++)
{ {
sprintf(path, "data/challenges/%s", filenames[i]); sprintf(path, "data/challenges/%s", filenames[i]);
@ -91,7 +106,7 @@ void initChallenges(void)
void loadChallenge(Mission *mission, cJSON *node) void loadChallenge(Mission *mission, cJSON *node)
{ {
int i; int i;
Challenge *challenge; Challenge *challenge;
mission->challengeData.isChallenge = 1; mission->challengeData.isChallenge = 1;
@ -234,14 +249,14 @@ static int challengeFinished(void)
static int updateChallenges(void) static int updateChallenges(void)
{ {
int i, numPassed; int i, numPassed;
Challenge *c; Challenge *c;
updateAccuracyStats(battle.stats); updateAccuracyStats(battle.stats);
numPassed = 0; numPassed = 0;
for (i = 0 ; i < MAX_CHALLENGES ; i++) for (i = 0; i < MAX_CHALLENGES; i++)
{ {
c = game.currentMission->challengeData.challenges[i]; c = game.currentMission->challengeData.challenges[i];
@ -321,7 +336,7 @@ static void printStats(void)
{ {
int i; int i;
for (i = 0 ; i < STAT_MAX ; i++) for (i = 0; i < STAT_MAX; i++)
{ {
if (battle.stats[i]) if (battle.stats[i])
{ {
@ -478,10 +493,10 @@ char *getChallengeDescription(Challenge *c)
Challenge *getChallenge(Mission *mission, int type, int value) Challenge *getChallenge(Mission *mission, int type, int value)
{ {
int i; int i;
Challenge *c; Challenge *c;
for (i = 0 ; i < MAX_CHALLENGES ; i++) for (i = 0; i < MAX_CHALLENGES; i++)
{ {
c = mission->challengeData.challenges[i]; c = mission->challengeData.challenges[i];
@ -509,15 +524,15 @@ static char *getFormattedChallengeDescription(const char *format, ...)
void updateChallengeMissions(void) void updateChallengeMissions(void)
{ {
int i; int i;
Mission *m; Mission *m;
Challenge *c; 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; m->totalChallenges = m->completedChallenges = 0;
for (i = 0 ; i < MAX_CHALLENGES ; i++) for (i = 0; i < MAX_CHALLENGES; i++)
{ {
c = m->challengeData.challenges[i]; c = m->challengeData.challenges[i];
@ -581,10 +596,10 @@ static void failChallenge(void)
static int alreadyPassed(void) static int alreadyPassed(void)
{ {
int i; int i;
Challenge *c; Challenge *c;
for (i = 0 ; i < MAX_CHALLENGES ; i++) for (i = 0; i < MAX_CHALLENGES; i++)
{ {
c = game.currentMission->challengeData.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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void updateChallengeMissions(void);
#include "../json/cJSON.h" Challenge *getChallenge(Mission *mission, int type, int value);
char *getChallengeDescription(Challenge *c);
extern void awardCraftTrophy(void); void doChallenges(void);
extern void awardStatsTrophies(void); void loadChallenge(Mission *mission, struct cJSON *node);
extern char **getFileList(char *dir, int *count); void initChallenges(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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 "ctype.h"
#include "SDL2/SDL.h"
#include "defs.h" #include "defs.h"
#include "math.h"
#include "SDL2/SDL.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "structs.h" #include "structs.h"
extern char *getTranslatedString(char *string); 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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 _(string) getTranslatedString(string)
#define PI 3.14159265358979323846 #define PI 3.14159265358979323846
#define MIN(a,b) (((a)<(b))?(a):(b)) #define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a)>(b))?(a):(b)) #define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define CAROLINE(a,b) MIN(a,b) #define CAROLINE(a, b) MIN(a, b)
#define STRNCPY(dest, src, n) strncpy(dest, src, n); dest[n - 1] = '\0' #define STRNCPY(dest, src, n) \
strncpy(dest, src, n); \
dest[n - 1] = '\0'
#define TO_RAIDANS(angleDegrees) (angleDegrees * PI / 180.0) #define TO_RAIDANS(angleDegrees) (angleDegrees * PI / 180.0)
#define TO_DEGREES(angleRadians) (angleRadians * 180.0 / PI) #define TO_DEGREES(angleRadians) (angleRadians * 180.0 / PI)
#define SAVE_FILENAME "game.save" #define SAVE_FILENAME "game.save"
#define CONFIG_FILENAME "config.json" #define CONFIG_FILENAME "config.json"
#define SCREEN_WIDTH 1280 #define SCREEN_WIDTH 1280
#define SCREEN_HEIGHT 720 #define SCREEN_HEIGHT 720
#define UI_WIDTH 1280 #define UI_WIDTH 1280
#define UI_HEIGHT 720 #define UI_HEIGHT 720
#define MAX_KEYBOARD_KEYS 350 #define MAX_KEYBOARD_KEYS 350
#define MAX_MOUSE_BUTTONS 6 #define MAX_MOUSE_BUTTONS 6
#define FPS 60 #define FPS 60
#define MAX_NAME_LENGTH 32 #define MAX_NAME_LENGTH 32
#define MAX_DESCRIPTION_LENGTH 512 #define MAX_DESCRIPTION_LENGTH 512
#define MAX_LINE_LENGTH 1024 #define MAX_LINE_LENGTH 1024
#define MAX_FILENAME_LENGTH 1024 #define MAX_FILENAME_LENGTH 1024
#define MAX_PATH_LENGTH 4096 #define MAX_PATH_LENGTH 4096
#define NUM_TEXTURE_BUCKETS 32 #define NUM_TEXTURE_BUCKETS 32
#define NUM_ATLAS_BUCKETS 64 #define NUM_ATLAS_BUCKETS 64
#define NUM_GLYPH_BUCKETS 128
#define MAX_STARS 500 #define MAX_GLYPHS 400
#define MAX_CHALLENGES 3 #define MAX_STARS 500
#define MAX_FIGHTER_GUNS 12 #define MAX_CHALLENGES 3
#define MAX_TARGET_RANGE 65536
#define MAX_SYSTEM_POWER 100
#define BATTLE_AREA_CELLS 50 #define MAX_FIGHTER_GUNS 12
#define BATTLE_AREA_WIDTH (640 * BATTLE_AREA_CELLS) #define MAX_TARGET_RANGE 65536
#define BATTLE_AREA_HEIGHT (360 * BATTLE_AREA_CELLS) #define MAX_SYSTEM_POWER 100
#define BATTLE_AREA_EDGE 250
#define BF_NONE 0 #define BATTLE_AREA_CELLS 50
#define BF_ENGINE (2 << 0) #define BATTLE_AREA_WIDTH (640 * BATTLE_AREA_CELLS)
#define BF_SYSTEM_DAMAGE (2 << 1) #define BATTLE_AREA_HEIGHT (360 * BATTLE_AREA_CELLS)
#define BF_SHIELD_DAMAGE (2 << 2) #define BATTLE_AREA_EDGE 250
#define BF_EXPLODES (2 << 3)
#define EF_NONE 0 #define BF_NONE 0
#define EF_NO_KILL (2 << 0) #define BF_ENGINE (2 << 0)
#define EF_DISABLED (2 << 1) #define BF_SYSTEM_DAMAGE (2 << 1)
#define EF_IMMORTAL (2 << 2) #define BF_SHIELD_DAMAGE (2 << 2)
#define EF_MISSION_TARGET (2 << 3) #define BF_EXPLODES (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 EF_NONE 0
#define AIF_FOLLOWS_PLAYER (2 << 0) #define EF_NO_KILL (2 << 0)
#define AIF_MOVES_TO_PLAYER (2 << 1) #define EF_DISABLED (2 << 1)
#define AIF_UNLIMITED_RANGE (2 << 2) #define EF_IMMORTAL (2 << 2)
#define AIF_COLLECTS_ITEMS (2 << 3) #define EF_MISSION_TARGET (2 << 3)
#define AIF_TOWS (2 << 4) #define EF_NO_MT_BOX (2 << 4)
#define AIF_RETREATS (2 << 5) #define EF_HAS_ROPE (2 << 5)
#define AIF_GOAL_JUMPGATE (2 << 6) #define EF_COLLECTS_ITEMS (2 << 6)
#define AIF_AVOIDS_COMBAT (2 << 7) #define EF_MUST_DISABLE (2 << 7)
#define AIF_DEFENSIVE (2 << 8) #define EF_RETREATING (2 << 8)
#define AIF_MISSILE_BOAT (2 << 9) #define EF_NO_EPIC (2 << 9)
#define AIF_AGGRESSIVE (2 << 10) #define EF_STATIC (2 << 10)
#define AIF_LONG_RANGE_FIRE (2 << 11) #define EF_TAKES_DAMAGE (2 << 11)
#define AIF_MOVES_TO_LEADER (2 << 12) #define EF_SECONDARY_TARGET (2 << 12)
#define AIF_EVADE (2 << 13) #define EF_AI_TARGET (2 << 13)
#define AIF_WANDERS (2 << 14) #define EF_AI_LEADER (2 << 14)
#define AIF_COVERS_RETREAT (2 << 15) #define EF_ROPED_ATTACHED (2 << 15)
#define AIF_TARGET_FOCUS (2 << 16) #define EF_NO_KILL_INC (2 << 16)
#define AIF_DROPS_MINES (2 << 17) #define EF_SHORT_RADAR_RANGE (2 << 17)
#define AIF_ASSASSIN (2 << 18) #define EF_NO_PLAYER_TARGET (2 << 18)
#define AIF_SUSPICIOUS (2 << 19) #define EF_AI_IGNORE (2 << 19)
#define AIF_ZAK_SUSPICIOUS (2 << 20) #define EF_NON_SOLID (2 << 20)
#define AIF_SURRENDERS (2 << 21) #define EF_NO_HEALTH_BAR (2 << 21)
#define AIF_SURRENDERING (2 << 22) #define EF_FRIENDLY_HEALTH_BAR (2 << 22)
#define AIF_SURRENDERED (2 << 23) #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 */ /* player abilities */
#define BOOST_RECHARGE_TIME (FPS * 7) #define BOOST_RECHARGE_TIME (FPS * 7)
#define BOOST_FINISHED_TIME (FPS * 0.75) #define BOOST_FINISHED_TIME (FPS * 0.75)
#define ECM_RECHARGE_TIME (FPS * 7) #define ECM_RECHARGE_TIME (FPS * 7)
#define MB_NORMAL 0 #define MB_NORMAL 0
#define MB_IMPORTANT 1 #define MB_IMPORTANT 1
#define MB_PANDORAN 2 #define MB_PANDORAN 2
#define SS_NORMAL 0 #define SS_NORMAL 0
#define SS_SOL 1 #define SS_SOL 1
#define SS_PANDORAN 2 #define SS_PANDORAN 2
#define MAX_SUSPICION_LEVEL 1500.0 #define MAX_SUSPICION_LEVEL 1500.0
#define MAX_ZAK_SUSPICION_LEVEL (FPS * 30) #define MAX_ZAK_SUSPICION_LEVEL (FPS * 30)
enum 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "galacticMap.h"
static void logic(void); #define MAX_LISTED_MISSIONS 9
static void draw(void); #define SHOW_FIGHTER_DB 6
static void handleKeyboard(void); #define SHOW_GALAXY 0
static void handleMouse(void); #define SHOW_MENU 2
static void scrollGalaxy(void); #define SHOW_OPTIONS 3
static void drawStarSystemDetail(void); #define SHOW_STAR_SYSTEM 1
static void selectStarSystem(void); #define SHOW_STATS 4
static void drawGalaxy(void); #define SHOW_TROPHIES 5
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);
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 SDL_Texture *background;
static AtlasImage *starSystemTexture; static AtlasImage *starSystemTexture;
static AtlasImage *arrowTexture; static AtlasImage *arrowTexture;
static SDL_Point camera; static SDL_Point camera;
static Pulse pulseHead = {0}; static Pulse pulseHead = {0};
static Pulse *pulseTail; static Pulse *pulseTail;
static int pulseTimer; static int pulseTimer;
static float ssx, ssy; static float ssx, ssy;
static float arrowPulse; static float arrowPulse;
static int show; static int show;
static int scrollingMap; static int scrollingMap;
static int campaignComplete = 0; static int campaignComplete = 0;
static PointF cameraMin, cameraMax; static PointF cameraMin, cameraMax;
static Widget *startMissionButton; static Widget *startMissionButton;
static Mission *hoverMission; static Mission *hoverMission;
static char *MISSIONS_TEXT; static char *MISSIONS_TEXT;
static char *PILOT_TEXT; static char *PILOT_TEXT;
static char *CRAFT_TEXT; static char *CRAFT_TEXT;
static char *SQUADRON_TEXT; static char *SQUADRON_TEXT;
static char *COMPLETED_TEXT; static char *COMPLETED_TEXT;
static char *EPIC_TEXT; static char *EPIC_TEXT;
static char *OPTIONAL_TEXT; static char *OPTIONAL_TEXT;
void initGalacticMap(void) void initGalacticMap(void)
{ {
@ -161,7 +194,7 @@ static void updateCampaignProgress(void)
if (!campaignComplete && game.completedMissions == game.totalMissions) 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) if (starSystem->missionHead.next && starSystem->missionHead.next->available)
{ {
@ -181,7 +214,7 @@ static void updatePandoranAdvance(void)
fallenStarSystem = NULL; 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) 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) static void doStarSystems(void)
{ {
StarSystem *starSystem; StarSystem *starSystem;
int cx, cy; int cx, cy;
if (!scrollingMap) if (!scrollingMap)
{ {
@ -254,7 +287,7 @@ static void doStarSystems(void)
selectedStarSystem = NULL; 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.x = MIN(cameraMin.x, starSystem->x);
cameraMin.y = MIN(cameraMin.y, starSystem->y); cameraMin.y = MIN(cameraMin.y, starSystem->y);
@ -325,7 +358,7 @@ static void doStarSystemView(void)
{ {
Mission *mission; 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)) 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) static void addPulses(void)
{ {
Pulse *pulse; Pulse *pulse;
StarSystem *starSystem; 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)) if (starSystem->completedMissions < starSystem->availableMissions || (campaignComplete && starSystem->activeMission))
{ {
@ -407,7 +440,7 @@ static void doPulses(void)
prev = &pulseHead; 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->size += 0.5;
pulse->life--; pulse->life--;
@ -472,7 +505,7 @@ static void drawPulses(void)
{ {
Pulse *pulse; 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); 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) static void drawGalaxy(void)
{ {
SDL_Rect r; SDL_Rect r;
StarSystem *starSystem; StarSystem *starSystem;
SDL_Color color; SDL_Color color;
float ax, ay, aa; 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.x = starSystem->x - camera.x;
r.y = starSystem->y - camera.y; r.y = starSystem->y - camera.y;
@ -619,7 +652,7 @@ static Mission *nextAvailableMission(StarSystem *starSystem)
{ {
Mission *m; 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) if (m->available && !m->completed)
{ {
@ -632,7 +665,7 @@ static Mission *nextAvailableMission(StarSystem *starSystem)
static void drawStarSystemDetail(void) static void drawStarSystemDetail(void)
{ {
int y; int y;
Mission *mission; Mission *mission;
SDL_Rect r; SDL_Rect r;
@ -662,7 +695,7 @@ static void drawStarSystemDetail(void)
y += 80; 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.x = 200;
mission->rect.y = y - 2; 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void destroyGalacticMap(void);
void initGalacticMap(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
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "mission.h"
static void loadEntities(cJSON *node); extern App app;
static unsigned long hashcode(const char *str); extern Battle battle;
static void loadEpicData(cJSON *node); 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 *getAutoBackground(char *filename);
static char *getAutoPlanet(char *filename); static char *getAutoPlanet(char *filename);
static char *getAutoMusic(char *filename); static char *getAutoMusic(char *filename);
@ -30,8 +65,8 @@ static char *getAutoMusic(char *filename);
Mission *loadMissionMeta(char *filename) Mission *loadMissionMeta(char *filename)
{ {
Mission *mission; Mission *mission;
cJSON *root, *node; cJSON *root, *node;
char *text; char *text;
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename); 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) void loadMission(char *filename)
{ {
cJSON *root; cJSON *root;
char *text, music[MAX_DESCRIPTION_LENGTH], *background, *planet; char *text, music[MAX_DESCRIPTION_LENGTH], *background, *planet;
float planetScale; float planetScale;
startSectionTransition(); startSectionTransition();
@ -313,10 +348,10 @@ void failMission(void)
static void loadEntities(cJSON *node) static void loadEntities(cJSON *node)
{ {
Entity *e; Entity *e;
char *name, *groupName; char *name, *groupName;
int i, type, scatter, number, active, addFlags, side; int i, type, scatter, number, active, addFlags, side;
float x, y; float x, y;
long flags; long flags;
if (node) if (node)
{ {
@ -344,7 +379,7 @@ static void loadEntities(cJSON *node)
flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags);
} }
for (i = 0 ; i < number ; i++) for (i = 0; i < number; i++)
{ {
switch (type) switch (type)
{ {
@ -414,7 +449,7 @@ static void loadEntities(cJSON *node)
static void loadEpicData(cJSON *node) static void loadEpicData(cJSON *node)
{ {
Entity *e; Entity *e;
int numFighters[SIDE_MAX]; int numFighters[SIDE_MAX];
memset(numFighters, 0, sizeof(int) * SIDE_MAX); memset(numFighters, 0, sizeof(int) * SIDE_MAX);
battle.isEpic = 1; battle.isEpic = 1;
@ -434,7 +469,7 @@ static void loadEpicData(cJSON *node)
addEpicKillsObjective(); 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) 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) Mission *getMission(char *filename)
{ {
StarSystem *starSystem; StarSystem *starSystem;
Mission *mission; Mission *mission;
/* First, search the star systems */ /* 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) if (strcmp(mission->filename, filename) == 0)
{ {
@ -461,7 +496,7 @@ Mission *getMission(char *filename)
} }
/* now search the challenges */ /* 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) if (strcmp(mission->filename, filename) == 0)
{ {
@ -489,27 +524,6 @@ int isMissionAvailable(Mission *mission, Mission *prev)
} }
else else
{ {
return mission->completed || ( return mission->completed || (game.completedMissions >= mission->requires && game.stats[STAT_OPTIONAL_COMPLETED] >= mission->requiresOptional && game.completedMissions < mission->expires) || dev.debug;
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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" int isMissionAvailable(Mission *mission, Mission *prev);
#include "../json/cJSON.h" void updateAllMissions(void);
Mission *getMission(char *filename);
#include "time.h" void failMission(void);
void completeMission(void);
extern void activateNextWaypoint(void); void loadMission(char *filename);
extern void addAllToQuadtree(void); Mission *loadMissionMeta(char *filename);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "starSystems.h"
static void loadMissions(StarSystem *starSystem); extern Game game;
static void loadMissions(StarSystem *starSystem);
static StarSystem *loadStarSystem(cJSON *starSystemJSON); static StarSystem *loadStarSystem(cJSON *starSystemJSON);
void initStarSystems(void) void initStarSystems(void)
{ {
cJSON *root, *node; cJSON *root, *node;
char *text; char *text;
StarSystem *starSystem, *tail; StarSystem *starSystem, *tail;
tail = &game.starSystemHead; tail = &game.starSystemHead;
@ -34,7 +43,7 @@ void initStarSystems(void)
text = readFile("data/galaxy/starSystems.json"); text = readFile("data/galaxy/starSystems.json");
root = cJSON_Parse(text); 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); starSystem = loadStarSystem(node);
tail->next = starSystem; tail->next = starSystem;
@ -77,17 +86,17 @@ static StarSystem *loadStarSystem(cJSON *starSystemJSON)
static void loadMissions(StarSystem *starSystem) static void loadMissions(StarSystem *starSystem)
{ {
int i, count; int i, count;
char name[MAX_NAME_LENGTH]; char name[MAX_NAME_LENGTH];
char path[MAX_FILENAME_LENGTH]; char path[MAX_FILENAME_LENGTH];
char **filenames; char **filenames;
Mission *mission, *tail; Mission *mission, *tail;
tail = &starSystem->missionHead; tail = &starSystem->missionHead;
STRNCPY(name, starSystem->name, MAX_NAME_LENGTH); STRNCPY(name, starSystem->name, MAX_NAME_LENGTH);
for (i = 0 ; name[i] ; i++) for (i = 0; name[i]; i++)
{ {
name[i] = tolower(name[i]); name[i] = tolower(name[i]);
} }
@ -96,7 +105,7 @@ static void loadMissions(StarSystem *starSystem)
filenames = getFileList(path, &count); 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]); sprintf(path, "data/missions/%s/%s", name, filenames[i]);
@ -118,7 +127,7 @@ StarSystem *getStarSystem(char *name)
{ {
StarSystem *starSystem; 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) if (strcmp(starSystem->name, name) == 0)
{ {
@ -132,15 +141,15 @@ StarSystem *getStarSystem(char *name)
void updateStarSystemMissions(void) void updateStarSystemMissions(void)
{ {
StarSystem *starSystem; StarSystem *starSystem;
Mission *mission, *prev; Mission *mission, *prev;
game.completedMissions = game.totalMissions = game.availableMissions = 0; 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; 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++; 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; 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); mission->available = starSystem->type == SS_SOL || isMissionAvailable(mission, prev);
@ -194,7 +203,7 @@ void updateStarSystemMissions(void)
void destroyStarSystems(void) void destroyStarSystems(void)
{ {
StarSystem *starSystem; StarSystem *starSystem;
Mission *mission; Mission *mission;
while (game.starSystemHead.next) 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void destroyStarSystems(void);
void updateStarSystemMissions(void);
#include "../json/cJSON.h" StarSystem *getStarSystem(char *name);
void initStarSystems(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "credits.h"
#define CREDIT_LINE_LIMIT (UI_WIDTH - 300)
extern App app;
extern Colors colors;
static void loadCredits(void); static void loadCredits(void);
static void logic(void); static void logic(void);
static void draw(void); static void draw(void);
static void handleKeyboard(void); static void handleKeyboard(void);
void destroyCredits(void);
static SDL_Texture *background; static SDL_Texture *background;
static AtlasImage *earthTexture; static AtlasImage *earthTexture;
static Credit head; static Credit head;
static Credit *tail; static Credit *tail;
static float creditSpeed; static float creditSpeed;
static int timeout; static int timeout;
void initCredits(void) void initCredits(void)
{ {
@ -65,7 +80,7 @@ static void logic(void)
handleKeyboard(); handleKeyboard();
for (c = head.next ; c != NULL ; c = c->next) for (c = head.next; c != NULL; c = c->next)
{ {
c->y -= creditSpeed; c->y -= creditSpeed;
@ -95,7 +110,7 @@ static void draw(void)
app.textWidth = CREDIT_LINE_LIMIT; 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) if (c->y > -c->h && c->y < app.winHeight)
{ {
@ -108,9 +123,9 @@ static void draw(void)
static void loadCredits(void) static void loadCredits(void)
{ {
cJSON *root, *node; cJSON *root, *node;
int y, dist; int y, dist;
char *text; char *text;
Credit *c; Credit *c;
y = app.winHeight + 100; y = app.winHeight + 100;
@ -120,7 +135,7 @@ static void loadCredits(void)
app.textWidth = CREDIT_LINE_LIMIT; 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)); c = malloc(sizeof(Credit));
memset(c, 0, 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void destroyCredits(void);
#include "../json/cJSON.h" void initCredits(void);
#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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "fighterDatabase.h"
extern App app;
extern Colors colors;
extern Game game;
static void prevFighter(void); static void prevFighter(void);
static void nextFighter(void); static void nextFighter(void);
static int countFighterGuns(Entity *fighter, int type); static int countFighterGuns(Entity *fighter, int type);
static void setNumDestroyed(void); static void setNumDestroyed(void);
static int page; static int page;
static int maxPages; static int maxPages;
static int numDestroyed; static int numDestroyed;
static Widget *prev; static Widget *prev;
static Widget *next; static Widget *next;
static char *DB_TEXT; static char *DB_TEXT;
static char *PAGE_TEXT; static char *PAGE_TEXT;
static char *COMMON_TEXT; static char *COMMON_TEXT;
static char *DESTROYED_TEXT; static char *DESTROYED_TEXT;
static char *AFFILIATION_TEXT; static char *AFFILIATION_TEXT;
static char *ARMOUR_TEXT; static char *ARMOUR_TEXT;
static char *SHIELD_TEXT; static char *SHIELD_TEXT;
static char *SPEED_TEXT; static char *SPEED_TEXT;
static char *MISSILES_TEXT; static char *MISSILES_TEXT;
static char *MISSILE_NUM_TEXT; static char *MISSILE_NUM_TEXT;
static const char *gunName[BT_MAX]; static const char *gunName[BT_MAX];
static Entity **dbFighters; static Entity **dbFighters;
static float rotation; static float rotation;
void initFighterDatabase(void) void initFighterDatabase(void)
{ {
@ -97,8 +108,8 @@ void doFighterDatabase(void)
void drawFighterDatabase(void) void drawFighterDatabase(void)
{ {
SDL_Rect r; SDL_Rect r;
Entity *fighter; Entity *fighter;
int i, y, numCannons; int i, y, numCannons;
SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND);
SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 128); SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 128);
@ -141,7 +152,7 @@ void drawFighterDatabase(void)
y = 200; y = 200;
for (i = 1 ; i < BT_MAX ; i++) for (i = 1; i < BT_MAX; i++)
{ {
numCannons = countFighterGuns(fighter, i); numCannons = countFighterGuns(fighter, i);
if (numCannons > 0) if (numCannons > 0)
@ -176,7 +187,7 @@ static int countFighterGuns(Entity *fighter, int type)
num = 0; num = 0;
for (i = 0 ; i < MAX_FIGHTER_GUNS ; i++) for (i = 0; i < MAX_FIGHTER_GUNS; i++)
{ {
if (fighter->guns[i].type == type) if (fighter->guns[i].type == type)
{ {
@ -203,14 +214,14 @@ static void nextFighter(void)
static void setNumDestroyed(void) static void setNumDestroyed(void)
{ {
Tuple *t; Tuple *t;
Entity *fighter; Entity *fighter;
fighter = dbFighters[page]; fighter = dbFighters[page];
numDestroyed = 0; 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) 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void drawFighterDatabase(void);
void doFighterDatabase(void);
extern void blitRotated(AtlasImage *atlasImage, int x, int y, float angle); void initFighterDatabaseDisplay(void);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...); void destroyFighterDatabase(void);
extern void drawWidgets(char *groupName); void initFighterDatabase(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "game.h"
extern Game game;
void initGame(void) void initGame(void)
{ {
memset(&game, 0, sizeof(Game)); 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void destroyGame(void);
void initGame(void);
extern Game 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "load.h"
extern Game game;
static void loadStats(cJSON *statsJSON); static void loadStats(cJSON *statsJSON);
static void loadStarSystems(cJSON *starSystemsJSON); static void loadStarSystems(cJSON *starSystemsJSON);
static void loadMissions(cJSON *missionsCJSON); static void loadMissions(cJSON *missionsCJSON);
@ -30,7 +42,7 @@ static void loadFighterStats(cJSON *fighterStatsJSON);
void loadGame(void) void loadGame(void)
{ {
cJSON *root, *gameJSON; cJSON *root, *gameJSON;
char *text; char *text;
text = readFile(getSaveFilePath(SAVE_FILENAME)); text = readFile(getSaveFilePath(SAVE_FILENAME));
root = cJSON_Parse(text); root = cJSON_Parse(text);
@ -56,9 +68,9 @@ void loadGame(void)
static void loadStarSystems(cJSON *starSystemsJSON) static void loadStarSystems(cJSON *starSystemsJSON)
{ {
StarSystem *starSystem; 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); starSystem = getStarSystem(cJSON_GetObjectItem(starSystemJSON, "name")->valuestring);
@ -71,9 +83,9 @@ static void loadStarSystems(cJSON *starSystemsJSON)
static void loadMissions(cJSON *missionsJSON) static void loadMissions(cJSON *missionsJSON)
{ {
Mission *mission; 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); mission = getMission(cJSON_GetObjectItem(missionJSON, "filename")->valuestring);
@ -86,18 +98,18 @@ static void loadMissions(cJSON *missionsJSON)
static void loadChallenges(cJSON *missionsJSON) static void loadChallenges(cJSON *missionsJSON)
{ {
Mission *mission; Mission *mission;
Challenge *challenge; Challenge *challenge;
cJSON *missionJSON, *challengeJSON; cJSON *missionJSON, *challengeJSON;
int type, value; int type, value;
if (missionsJSON) 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); 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); type = lookup(cJSON_GetObjectItem(challengeJSON, "type")->valuestring);
value = cJSON_GetObjectItem(challengeJSON, "value")->valueint; value = cJSON_GetObjectItem(challengeJSON, "value")->valueint;
@ -115,10 +127,10 @@ static void loadChallenges(cJSON *missionsJSON)
static void loadStats(cJSON *statsJSON) static void loadStats(cJSON *statsJSON)
{ {
int i; int i;
char *statName; char *statName;
for (i = 0 ; i < STAT_MAX ; i++) for (i = 0; i < STAT_MAX; i++)
{ {
statName = getLookupName("STAT_", i); statName = getLookupName("STAT_", i);
@ -132,11 +144,11 @@ static void loadStats(cJSON *statsJSON)
static void loadTrophies(cJSON *trophiesJSON) static void loadTrophies(cJSON *trophiesJSON)
{ {
Trophy *t; Trophy *t;
cJSON *trophyJSON; cJSON *trophyJSON;
if (trophiesJSON) 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); t = getTrophy(cJSON_GetObjectItem(trophyJSON, "id")->valuestring);
@ -160,7 +172,7 @@ static void loadFighterStats(cJSON *fighterStatsJSON)
if (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)); t = malloc(sizeof(Tuple));
memset(t, 0, 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void loadGame(void);
#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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "options.h"
#define SHOW_CONTROLS 1
#define SHOW_MAIN 0
extern App app;
extern Colors colors;
static void changeWindowSize(char *value); static void changeWindowSize(char *value);
static void changeSoundVolume(char *value); static void changeSoundVolume(char *value);
static void changeMusicVolume(char *value); static void changeMusicVolume(char *value);
@ -30,7 +46,7 @@ static void drawMain(void);
static void controls(void); static void controls(void);
static void (*returnFromOptions)(void); static void (*returnFromOptions)(void);
static int show; static int show;
static char *OPTIONS_TEXT; static char *OPTIONS_TEXT;
static char *RESOLUTION_TEXT; static char *RESOLUTION_TEXT;
@ -62,11 +78,11 @@ void initOptions(void (*rtn)(void))
OPTIONS_TEXT = _("Options"); OPTIONS_TEXT = _("Options");
RESOLUTION_TEXT = _("Note: you must restart the game for window size and fullscreen options to take effect."); 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("windowSize", "options")->enabled = 0;
getWidget("fullscreen", "options")->enabled = 0; getWidget("fullscreen", "options")->enabled = 0;
RESOLUTION_TEXT = _("Note: this device does not support changing the screen resolution."); RESOLUTION_TEXT = _("Note: this device does not support changing the screen resolution.");
#endif #endif
returnFromOptions = rtn; returnFromOptions = rtn;
@ -127,14 +143,14 @@ static void drawMain(void)
void updateCustomResolutionOption(void) void updateCustomResolutionOption(void)
{ {
Widget *w; Widget *w;
char value[MAX_NAME_LENGTH]; char value[MAX_NAME_LENGTH];
int i; int i;
sprintf(value, "%d x %d", app.winWidth, app.winHeight); sprintf(value, "%d x %d", app.winWidth, app.winHeight);
w = getWidget("windowSize", "options"); 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) if (strcmp(w->options[i], value) == 0)
{ {
@ -190,7 +206,7 @@ static void changeFullscreen(char *value)
{ {
app.fullscreen = strcmp(value, "On") == 0; 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) 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void updateCustomResolutionOption(void);
void drawOptions(void);
#include "SDL2/SDL_mixer.h" void initOptions(void (*rtn)(void));
#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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "save.h"
static void saveStarSystems(cJSON *gameJSON); extern Game game;
static void saveChallenges(cJSON *gameJSON);
static void saveStarSystems(cJSON *gameJSON);
static void saveChallenges(cJSON *gameJSON);
static cJSON *getMissionsJSON(StarSystem *starSystem); static cJSON *getMissionsJSON(StarSystem *starSystem);
static void saveStats(cJSON *gameJSON); static void saveStats(cJSON *gameJSON);
static void saveTrophies(cJSON *gameJSON); static void saveTrophies(cJSON *gameJSON);
static void saveFighterStats(cJSON *gameJSON); static void saveFighterStats(cJSON *gameJSON);
void saveGame(void) void saveGame(void)
{ {
char *out; char *out;
cJSON *root, *gameJSON; cJSON *root, *gameJSON;
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Saving Game ..."); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Saving Game ...");
@ -60,12 +67,12 @@ void saveGame(void)
static void saveStarSystems(cJSON *gameJSON) static void saveStarSystems(cJSON *gameJSON)
{ {
cJSON *starSystemJSON, *starSystemsJSON; cJSON *starSystemJSON, *starSystemsJSON;
StarSystem *starSystem; StarSystem *starSystem;
starSystemsJSON = cJSON_CreateArray(); 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) if (starSystem->totalMissions > 0)
{ {
@ -84,12 +91,12 @@ static void saveStarSystems(cJSON *gameJSON)
static cJSON *getMissionsJSON(StarSystem *starSystem) static cJSON *getMissionsJSON(StarSystem *starSystem)
{ {
cJSON *missionJSON, *missionsJSON; cJSON *missionJSON, *missionsJSON;
Mission *mission; Mission *mission;
missionsJSON = cJSON_CreateArray(); 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(); missionJSON = cJSON_CreateObject();
@ -104,14 +111,14 @@ static cJSON *getMissionsJSON(StarSystem *starSystem)
static void saveChallenges(cJSON *gameJSON) static void saveChallenges(cJSON *gameJSON)
{ {
int i; int i;
Mission *mission; Mission *mission;
Challenge *c; Challenge *c;
cJSON *missionsJSON, *missionJSON, *challengesJSON, *challengeJSON; cJSON *missionsJSON, *missionJSON, *challengesJSON, *challengeJSON;
missionsJSON = cJSON_CreateArray(); 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(); missionJSON = cJSON_CreateObject();
@ -119,7 +126,7 @@ static void saveChallenges(cJSON *gameJSON)
challengesJSON = cJSON_CreateArray(); challengesJSON = cJSON_CreateArray();
for (i = 0 ; i < MAX_CHALLENGES ; i++) for (i = 0; i < MAX_CHALLENGES; i++)
{ {
c = mission->challengeData.challenges[i]; c = mission->challengeData.challenges[i];
@ -148,7 +155,7 @@ static void saveStats(cJSON *gameJSON)
cJSON *stats = cJSON_CreateObject(); 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]); cJSON_AddNumberToObject(stats, getLookupName("STAT_", i), game.stats[i]);
} }
@ -159,11 +166,11 @@ static void saveStats(cJSON *gameJSON)
static void saveTrophies(cJSON *gameJSON) static void saveTrophies(cJSON *gameJSON)
{ {
Trophy *t; Trophy *t;
cJSON *trophiesJSON, *trophyJSON; cJSON *trophiesJSON, *trophyJSON;
trophiesJSON = cJSON_CreateArray(); 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) if (t->awarded)
{ {
@ -186,7 +193,7 @@ static void saveFighterStats(cJSON *gameJSON)
fighterStatsJSON = cJSON_CreateArray(); 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(); 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void saveGame(void);
#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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "stats.h"
#define STATS_PER_PAGE 9
extern App app;
extern Colors colors;
extern Game game;
static void prevPage(void); static void prevPage(void);
static void nextPage(void); static void nextPage(void);
static void calculatePercentComplete(void); static void calculatePercentComplete(void);
void updateAccuracyStats(unsigned int *stats);
static char *statDescription[STAT_MAX]; static char *statDescription[STAT_MAX];
static int page; static int page;
static float maxPages; static float maxPages;
static Widget *prev; static Widget *prev;
static Widget *next; static Widget *next;
static char *STATS_TEXT; static char *STATS_TEXT;
static char *PAGE_TEXT; static char *PAGE_TEXT;
void initStats(void) void initStats(void)
{ {
@ -103,12 +113,12 @@ void initStatsDisplay(void)
static void calculatePercentComplete(void) static void calculatePercentComplete(void)
{ {
StarSystem *starSystem; StarSystem *starSystem;
Mission *mission; Mission *mission;
int completed, total; int completed, total;
completed = total = 0; 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) 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; completed += mission->completedChallenges;
total += mission->totalChallenges; total += mission->totalChallenges;
@ -128,7 +138,7 @@ static void calculatePercentComplete(void)
void drawStats(void) void drawStats(void)
{ {
int i, y, startIndex; int i, y, startIndex;
SDL_Rect r; SDL_Rect r;
SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND);
@ -159,7 +169,7 @@ void drawStats(void)
startIndex = (page * STATS_PER_PAGE); 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) 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void updateAccuracyStats(unsigned int *stats);
void drawStats(void);
#define STATS_PER_PAGE 9 void initStatsDisplay(void);
void initStats(void);
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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 logic(void);
static void draw(void); static void draw(void);
static void handleKeyboard(void); static void handleKeyboard(void);
@ -38,13 +72,13 @@ static void quit(void);
static void returnFromOptions(void); static void returnFromOptions(void);
static SDL_Texture *background; static SDL_Texture *background;
static AtlasImage *logo[2]; static AtlasImage *logo[2];
static AtlasImage *pandoranWar; static AtlasImage *pandoranWar;
static AtlasImage *earthTexture; static AtlasImage *earthTexture;
static PointF earth; static PointF earth;
static Entity fighters[NUM_FIGHTERS]; 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 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 int show;
void initTitle(void) void initTitle(void)
{ {
@ -56,7 +90,7 @@ void initTitle(void)
app.delegate.draw = &draw; app.delegate.draw = &draw;
memset(&app.keyboard, 0, sizeof(int) * MAX_KEYBOARD_KEYS); memset(&app.keyboard, 0, sizeof(int) * MAX_KEYBOARD_KEYS);
battle.camera.x = battle.camera.y = 0; battle.camera.x = battle.camera.y = 0;
destroyBattle(); destroyBattle();
@ -104,11 +138,11 @@ static void initFighters(void)
{ {
int i, numTextures; int i, numTextures;
numTextures = sizeof(fighterTextures) / sizeof(char*); numTextures = sizeof(fighterTextures) / sizeof(char *);
memset(&fighters, 0, sizeof(Entity) * NUM_FIGHTERS); 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].x = rand() % (app.winWidth - 32);
fighters[i].y = app.winHeight + (rand() % app.winHeight); fighters[i].y = app.winHeight + (rand() % app.winHeight);
@ -151,9 +185,9 @@ static void doFighters(void)
{ {
int i, numTextures; 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]; self = &fighters[i];
@ -195,7 +229,7 @@ static void draw(void)
blit(pandoranWar, app.winWidth / 2, 110, 1); 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); drawText(app.winWidth - 10, app.winHeight - 25, 14, TA_RIGHT, colors.white, "Version %.2f.%d", VERSION, REVISION);
switch (show) switch (show)
@ -230,7 +264,7 @@ static void drawFighters(void)
setAtlasColor(255, 255, 255, 255); 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); 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void initTitle(void);
#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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 prevPage(void);
static void nextPage(void); static void nextPage(void);
static void loadTrophyData(char *filename); static void loadTrophyData(char *filename);
@ -27,24 +49,24 @@ static void resetAlert(void);
static void setSparkleColor(Trophy *t); static void setSparkleColor(Trophy *t);
static void nextAlert(void); static void nextAlert(void);
static Trophy *alertTrophy; static Trophy *alertTrophy;
static AtlasImage *trophyIcons[TROPHY_MAX]; static AtlasImage *trophyIcons[TROPHY_MAX];
static AtlasImage *sparkle; static AtlasImage *sparkle;
static AtlasImage *alertSphere; static AtlasImage *alertSphere;
static SDL_Rect alertRect; static SDL_Rect alertRect;
static int alertTimer; static int alertTimer;
static int page; static int page;
static int awarded; static int awarded;
static int total; static int total;
static int boxWidth; static int boxWidth;
static float sparkleAngle; static float sparkleAngle;
static float maxPages; static float maxPages;
static Widget *prev; static Widget *prev;
static Widget *next; static Widget *next;
static char *TROPHIES_TEXT; static char *TROPHIES_TEXT;
static char *AWARDED_TEXT; static char *AWARDED_TEXT;
static char *PAGE_TEXT; static char *PAGE_TEXT;
static char *HIDDEN_TEXT; static char *HIDDEN_TEXT;
void initTrophies(void) void initTrophies(void)
{ {
@ -73,12 +95,12 @@ void initTrophies(void)
void initTrophiesDisplay(void) void initTrophiesDisplay(void)
{ {
int w, h; int w, h;
Trophy *t; Trophy *t;
boxWidth = total = awarded = 0; 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++; total++;
@ -129,9 +151,9 @@ static void prevPage(void)
void drawTrophies(void) void drawTrophies(void)
{ {
Trophy *t; Trophy *t;
SDL_Rect r; SDL_Rect r;
int start, end, i, x, y; int start, end, i, x, y;
SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND);
SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 128); SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 128);
@ -163,7 +185,7 @@ void drawTrophies(void)
end = start + TROPHIES_PER_PAGE; end = start + TROPHIES_PER_PAGE;
i = 0; 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) if (i >= start && i < end)
{ {
@ -210,11 +232,11 @@ void drawTrophies(void)
void awardTrophy(char *id) void awardTrophy(char *id)
{ {
Trophy *t; Trophy *t;
int numRemaining; int numRemaining;
numRemaining = 0; 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) if (!t->awarded && strcmp(t->id, id) == 0)
{ {
@ -270,10 +292,10 @@ void doTrophyAlerts(void)
static void nextAlert(void) static void nextAlert(void)
{ {
int w, h; int w, h;
Trophy *t; 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) if (t->notify)
{ {
@ -336,7 +358,7 @@ Trophy *getTrophy(char *id)
{ {
Trophy *t; 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) if (strcmp(t->id, id) == 0)
{ {
@ -349,10 +371,10 @@ Trophy *getTrophy(char *id)
static void loadTrophyData(char *filename) static void loadTrophyData(char *filename)
{ {
cJSON *root, *node; cJSON *root, *node;
char *text; char *text;
Trophy *t, *tail; Trophy *t, *tail;
int count[TROPHY_MAX]; int count[TROPHY_MAX];
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename); 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); 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] != '_') if (cJSON_GetObjectItem(node, "id")->valuestring[0] != '_')
{ {
@ -402,9 +424,9 @@ static void loadTrophyData(char *filename)
void awardStatsTrophies(void) void awardStatsTrophies(void)
{ {
Trophy *t; 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) 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 */ /* 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) if (tp->value == 0)
{ {
@ -426,9 +448,9 @@ void awardStatsTrophies(void)
void awardCampaignTrophies(void) void awardCampaignTrophies(void)
{ {
char trophyId[MAX_NAME_LENGTH]; char trophyId[MAX_NAME_LENGTH * 2];
char name[MAX_NAME_LENGTH]; char name[MAX_NAME_LENGTH];
int i, len; int i, len;
StarSystem *starSystem; StarSystem *starSystem;
if (game.completedMissions) if (game.completedMissions)
@ -437,7 +459,7 @@ void awardCampaignTrophies(void)
} }
/* check if all star system missions are completed */ /* 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) if (starSystem->totalMissions && starSystem->completedMissions == starSystem->totalMissions)
{ {
@ -445,7 +467,7 @@ void awardCampaignTrophies(void)
len = strlen(starSystem->name); len = strlen(starSystem->name);
for (i = 0 ; i < len ; i++) for (i = 0; i < len; i++)
{ {
name[i] = toupper(starSystem->name[i]); name[i] = toupper(starSystem->name[i]);
} }
@ -459,7 +481,7 @@ void awardCampaignTrophies(void)
void awardChallengeTrophies(void) void awardChallengeTrophies(void)
{ {
char trophyId[MAX_NAME_LENGTH]; char trophyId[MAX_NAME_LENGTH];
int completed; int completed;
/* check % of challenges completed - 25% increments*/ /* check % of challenges completed - 25% increments*/
completed = (getPercent(game.completedChallenges, game.totalChallenges) / 25) * 25; 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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.
*/ */
void awardCraftTrophy(void);
#include "../common.h" void awardPostMissionTrophies(void);
#include "../json/cJSON.h" void awardChallengeTrophies(void);
void awardCampaignTrophies(void);
#include "time.h" void awardStatsTrophies(void);
Trophy *getTrophy(char *id);
#define TROPHIES_PER_PAGE 4 void drawTrophyAlert(void);
void doTrophyAlerts(void);
extern void awardPandoranCraftTrophy(void); void awardTrophy(char *id);
extern void blit(AtlasImage *atlasImage, int x, int y, int centered); void drawTrophies(void);
extern void blitRotated(AtlasImage *atlasImage, int x, int y, float angle); void initTrophiesDisplay(void);
extern void blitScaled(AtlasImage *atlasImage, int x, int y, int w, int h, int center); void initTrophies(void);
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;

File diff suppressed because it is too large Load Diff

View File

@ -29,118 +29,119 @@ extern "C"
#endif #endif
/* cJSON Types: */ /* cJSON Types: */
#define cJSON_False 0 #define cJSON_False 0
#define cJSON_True 1 #define cJSON_True 1
#define cJSON_NULL 2 #define cJSON_NULL 2
#define cJSON_Number 3 #define cJSON_Number 3
#define cJSON_String 4 #define cJSON_String 4
#define cJSON_Array 5 #define cJSON_Array 5
#define cJSON_Object 6 #define cJSON_Object 6
#define cJSON_IsReference 256 #define cJSON_IsReference 256
#define cJSON_StringIsConst 512 #define cJSON_StringIsConst 512
/* The cJSON structure: */ /* The cJSON structure: */
typedef struct cJSON { 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. */ 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 */ char *valuestring; /* The item's string, if type==cJSON_String */
int valueint; /* The item's number, if type==cJSON_Number */ int valueint; /* The item's number, if type==cJSON_Number */
double valuedouble; /* 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. */ 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; } cJSON;
typedef struct cJSON_Hooks { typedef struct cJSON_Hooks
void *(*malloc_fn)(size_t sz); {
void (*free_fn)(void *ptr); void *(*malloc_fn)(size_t sz);
} cJSON_Hooks; void (*free_fn)(void *ptr);
} cJSON_Hooks;
/* Supply malloc, realloc and free functions to cJSON */ /* Supply malloc, realloc and free functions to cJSON */
extern void cJSON_InitHooks(cJSON_Hooks* hooks); 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. */ /* Returns the number of items in an array (or object). */
extern cJSON *cJSON_Parse(const char *value); extern int cJSON_GetArraySize(cJSON *array);
/* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */ /* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */
extern char *cJSON_Print(cJSON *item); extern cJSON *cJSON_GetArrayItem(cJSON *array, int item);
/* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */ /* Get item "string" from object. Case insensitive. */
extern char *cJSON_PrintUnformatted(cJSON *item); extern cJSON *cJSON_GetObjectItem(cJSON *object, const char *string);
/* 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). */ /* 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 int cJSON_GetArraySize(cJSON *array); extern const char *cJSON_GetErrorPtr(void);
/* 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. */ /* These calls create a cJSON item of the appropriate type. */
extern const char *cJSON_GetErrorPtr(void); 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. */ /* These utilities create an Array of count items. */
extern cJSON *cJSON_CreateNull(void); extern cJSON *cJSON_CreateIntArray(const int *numbers, int count);
extern cJSON *cJSON_CreateTrue(void); extern cJSON *cJSON_CreateFloatArray(const float *numbers, int count);
extern cJSON *cJSON_CreateFalse(void); extern cJSON *cJSON_CreateDoubleArray(const double *numbers, int count);
extern cJSON *cJSON_CreateBool(int b); extern cJSON *cJSON_CreateStringArray(const char **strings, int count);
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. */ /* Append item to the specified array/object. */
extern cJSON *cJSON_CreateIntArray(const int *numbers,int count); extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
extern cJSON *cJSON_CreateFloatArray(const float *numbers,int count); extern void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
extern cJSON *cJSON_CreateDoubleArray(const double *numbers,int count); 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 */
extern cJSON *cJSON_CreateStringArray(const char **strings,int count); /* 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. */ /* Remove/Detatch items from Arrays/Objects. */
extern void cJSON_AddItemToArray(cJSON *array, cJSON *item); extern cJSON *cJSON_DetachItemFromArray(cJSON *array, int which);
extern void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item); extern void cJSON_DeleteItemFromArray(cJSON *array, int which);
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 */ extern cJSON *cJSON_DetachItemFromObject(cJSON *object, const char *string);
/* 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_DeleteItemFromObject(cJSON *object, const char *string);
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. */ /* Update array items. */
extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which); extern void cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */
extern void cJSON_DeleteItemFromArray(cJSON *array,int which); extern void cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string); extern void cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem);
extern void cJSON_DeleteItemFromObject(cJSON *object,const char *string);
/* Update array items. */ /* Duplicate a cJSON item */
extern void cJSON_InsertItemInArray(cJSON *array,int which,cJSON *newitem); /* Shifts pre-existing items to the right. */ extern cJSON *cJSON_Duplicate(cJSON *item, int recurse);
extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem); /* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); 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 */ /* 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_Duplicate(cJSON *item,int recurse); extern cJSON *cJSON_ParseWithOpts(const char *value, const char **return_parse_end, int require_null_terminated);
/* 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 void cJSON_Minify(char *json);
extern cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated);
extern void cJSON_Minify(char *json);
/* Macros for creating things quickly. */ /* Macros for creating things quickly. */
#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) #define cJSON_AddNullToObject(object, name) cJSON_AddItemToObject(object, name, cJSON_CreateNull())
#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) #define cJSON_AddTrueToObject(object, name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) #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_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_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_AddStringToObject(object, name, s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
/* When assigning an integer value, it needs to be propagated to valuedouble too. */ /* 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_SetIntValue(object, val) ((object) ? (object)->valueint = (object)->valuedouble = (val) : (val))
#define cJSON_SetNumberValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val)) #define cJSON_SetNumberValue(object, val) ((object) ? (object)->valueint = (object)->valuedouble = (val) : (val))
#ifdef __cplusplus #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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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 "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 handleMissionArgs(int argc, char *argv[]);
static void handleLoggingArgs(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[]) int main(int argc, char *argv[])
{ {
long then, lastFrameTime, frames; long then, lastFrameTime, frames;
float remainder; float remainder;
memset(&app, 0, sizeof(App)); 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); 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) if (strcmp(argv[i], "-debug") == 0)
{ {
@ -188,7 +215,7 @@ static void handleMissionArgs(int argc, char *argv[])
showCredits = testingMission = 0; showCredits = testingMission = 0;
for (i = 1 ; i < argc ; i++) for (i = 1; i < argc; i++)
{ {
/* assume this is filename for testing */ /* assume this is filename for testing */
if (strcmp(argv[i], "-mission") == 0) 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" int main(int argc, char *argv[]);
#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;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "unixInit.h"
extern App app;
extern Dev dev;
void createSaveFolder(void) void createSaveFolder(void)
{ {
char *userHome; char *userHome;
char dir[MAX_FILENAME_LENGTH]; char dir[MAX_FILENAME_LENGTH];
userHome = getenv("HOME"); userHome = getenv("HOME");
@ -36,7 +46,7 @@ void createSaveFolder(void)
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "User home = %s", userHome); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "User home = %s", userHome);
sprintf(dir, "%s/.local/share/tbftss", 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); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Failed to create save dir '%s'. Will save to current dir.", dir);
return; return;
@ -47,7 +57,7 @@ void createSaveFolder(void)
void createScreenshotFolder(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"; 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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> void createScreenshotFolder(void);
#include <pwd.h> void createSaveFolder(void);
#include <unistd.h>
#include <errno.h>
#include "../../common.h"
extern App app;
extern Dev dev;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "win32Init.h"
extern App app;
extern Dev dev;
void createSaveFolder(void) void createSaveFolder(void)
{ {
char *userHome; char *userHome;
char dir[MAX_FILENAME_LENGTH]; char dir[MAX_FILENAME_LENGTH];
userHome = getenv("USERPROFILE"); 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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> void createScreenshotFolder(void);
#include <unistd.h> void createSaveFolder(void);
#include <errno.h>
#include "../../common.h"
extern App app;
extern Dev dev;

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

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "controls.h"
extern App app;
extern Colors colors;
static void restoreDefaults(void); static void restoreDefaults(void);
static const char *controlName[CONTROL_MAX]; static const char *controlName[CONTROL_MAX];
static Widget *controlWidget[CONTROL_MAX]; static Widget *controlWidget[CONTROL_MAX];
static char *CONTROLS_TEXT; static char *CONTROLS_TEXT;
static char *HELP_TEXT; static char *HELP_TEXT;
static char *BACKSPACE_TEXT; static char *BACKSPACE_TEXT;
static char *ESCAPE_TEXT; static char *ESCAPE_TEXT;
void initControls(void) void initControls(void)
{ {
@ -46,11 +56,11 @@ void initControls(void)
controlName[CONTROL_PREV_FIGHTER] = _("Previous Fighter"); controlName[CONTROL_PREV_FIGHTER] = _("Previous Fighter");
controlName[CONTROL_SCREENSHOT] = _("Screenshot"); 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] = getWidget(getLookupName("CONTROL_", i), "controls");
controlWidget[i]->numOptions = 2; 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[0] = malloc(sizeof(char) * MAX_NAME_LENGTH);
controlWidget[i]->options[1] = malloc(sizeof(char) * MAX_NAME_LENGTH); controlWidget[i]->options[1] = malloc(sizeof(char) * MAX_NAME_LENGTH);
strcpy(controlWidget[i]->options[0], ""); strcpy(controlWidget[i]->options[0], "");
@ -67,7 +77,7 @@ void initControlsDisplay(void)
{ {
int i; 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[0], "");
strcpy(controlWidget[i]->options[1], ""); strcpy(controlWidget[i]->options[1], "");
@ -96,7 +106,7 @@ int isControl(int type)
int isAcceptControl(void) 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) void clearControl(int type)
@ -149,7 +159,7 @@ void clearControlConfig(char *name)
void drawControls(void) void drawControls(void)
{ {
int i; int i;
SDL_Rect r; SDL_Rect r;
SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND);
@ -177,7 +187,7 @@ void drawControls(void)
r.x += 25; r.x += 25;
r.y = 125; 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]); drawText(r.x, r.y + 2, 20, TA_LEFT, colors.white, controlName[i]);
@ -209,11 +219,11 @@ void drawControls(void)
static void restoreDefaults(void) static void restoreDefaults(void)
{ {
int i; int i;
cJSON *root, *controlsJSON, *node; cJSON *root, *controlsJSON, *node;
char *text; char *text;
text = readFile("data/app/"CONFIG_FILENAME); text = readFile("data/app/" CONFIG_FILENAME);
root = cJSON_Parse(text); 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void drawControls(void);
#include "../json/cJSON.h" void clearControlConfig(char *name);
void updateControlButton(char *name);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...); void updateControlKey(char *name);
extern void drawWidgets(char *groupName); void resetAcceptControls(void);
extern char *getLookupName(char *prefix, long num); void clearControl(int type);
extern Widget *getWidget(const char *name, const char *group); int isAcceptControl(void);
extern long lookup(char *name); int isControl(int type);
extern char *readFile(char *filename); void initControlsDisplay(void);
void initControls(void);
extern App app;
extern Colors colors;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #include "dev.h"
extern App app;
extern Battle battle;
extern Dev dev;
void doDevKeys(void) void doDevKeys(void)
{ {
if (dev.debug) 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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" void doDevKeys(void);
extern void completeMission(void);
extern App app;
extern Battle battle;
extern Dev dev;

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 This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License 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" #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 void initColor(SDL_Color *c, int r, int g, int b);
static PointF backgroundPoint[4]; 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) void drawCircle(int cx, int cy, int radius, int r, int g, int b, int a)
{ {
int x = radius; int x = radius;
int y = 0; int y = 0;
int radiusError = 1 - x; int radiusError = 1 - x;
SDL_Point p[8]; SDL_Point p[8];
SDL_SetRenderDrawColor(app.renderer, r, g, b, a); 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) while (x >= y)
{ {
p[0].x = x + cx; p[0].y = y + cy; p[0].x = x + cx;
p[1].x = y + cx; p[1].y = x + cy; p[0].y = y + cy;
p[2].x = -x + cx; p[2].y = y + cy; p[1].x = y + cx;
p[3].x = -y + cx; p[3].y = x + cy; p[1].y = x + cy;
p[4].x = -x + cx; p[4].y = -y + cy; p[2].x = -x + cx;
p[5].x = -y + cx; p[5].y = -x + cy; p[2].y = y + cy;
p[6].x = x + cx; p[6].y = -y + cy; p[3].x = -y + cx;
p[7].x = y + cx; p[7].y = -x + cy; 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); SDL_RenderDrawPoints(app.renderer, p, 8);
y++; y++;
@ -193,7 +211,7 @@ void scrollBackground(float x, float y)
{ {
int i; int i;
for (i = 0 ; i < 4 ; i++) for (i = 0; i < 4; i++)
{ {
backgroundPoint[i].x += x; backgroundPoint[i].x += x;
backgroundPoint[i].y += y; backgroundPoint[i].y += y;
@ -222,10 +240,10 @@ void scrollBackground(float x, float y)
void drawBackground(SDL_Texture *texture) void drawBackground(SDL_Texture *texture)
{ {
int i; int i;
SDL_Rect dstRect; SDL_Rect dstRect;
for (i = 0 ; i < 4 ; i++) for (i = 0; i < 4; i++)
{ {
dstRect.x = backgroundPoint[i].x; dstRect.x = backgroundPoint[i].x;
dstRect.y = backgroundPoint[i].y; dstRect.y = backgroundPoint[i].y;
@ -257,8 +275,8 @@ int isOnBattleScreen(int x, int y, int w, int h)
void saveScreenshot(void) void saveScreenshot(void)
{ {
static int i = 0; static int i = 0;
char filename[MAX_NAME_LENGTH]; char filename[MAX_NAME_LENGTH];
SDL_Surface *sshot; SDL_Surface *sshot;
sprintf(filename, "/tmp/tbftss/%d.bmp", ++i); sprintf(filename, "/tmp/tbftss/%d.bmp", ++i);

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