From e278374490a25ed833c4789e79ca17167b86cc40 Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 27 Mar 2016 11:21:23 +0100 Subject: [PATCH] Merge from develop. --- common.mk | 2 +- data/capitalShips/csnCorvette01.json | 38 +- data/capitalShips/csnCorvette02.json | 38 +- data/capitalShips/infCorvette01.json | 34 +- data/capitalShips/infCorvette02.json | 40 +- data/capitalShips/unfCorvette01.json | 42 +- data/capitalShips/unfCorvette02.json | 40 +- data/challenges/08.json | 4 +- data/challenges/10.json | 14 +- data/challenges/11.json | 49 +++ data/craft/civilian.json | 3 - data/craft/infTug.json | 2 - data/craft/munitionsTransport.json | 1 - data/craft/shuttle.json | 1 - data/craft/tug.json | 2 - data/fighters/cannonDart.json | 2 - data/fighters/dart.json | 2 - data/fighters/missileDart.json | 2 - data/fighters/simpleDart.json | 2 - data/fighters/staticDart.json | 2 - data/fighters/swarmer.json | 17 + data/fighters/unarmedDart.json | 2 - data/galaxy/starSystems.json | 3 +- .../clarke/04 - clarke defence #4.json | 2 +- .../clarke/05 - clarke defence #5.json | 194 +++++++++ .../clarke/06 - clarke defence #6.json | 175 ++++++++ .../missions/iliad/05 - iliad defence #5.json | 20 +- data/missions/mace/01 - rebel assault #1.json | 2 +- .../rothan/01 - rothan defence #1.json | 2 +- .../rothan/02 - rothan defence #2.json | 4 +- gfx/fighters/swarmer.png | Bin 0 -> 1459 bytes locale/tbftss.pot | 161 +++++++- src/battle/ai.c | 6 +- src/battle/battle.c | 14 +- src/battle/battle.h | 3 +- src/battle/bullets.c | 2 +- src/battle/bullets.h | 1 + src/battle/capitalShips.c | 93 ++++- src/battle/capitalShips.h | 3 + src/battle/effects.c | 37 +- src/battle/entities.c | 13 +- src/battle/fighters.c | 170 ++++++-- src/battle/fighters.h | 2 + src/battle/items.c | 80 ++++ src/battle/items.h | 3 + src/battle/locations.c | 31 ++ src/battle/locations.h | 3 + src/battle/missionInfo.c | 2 +- src/battle/objectives.c | 52 ++- src/battle/objectives.h | 3 + src/battle/player.c | 41 +- src/battle/player.h | 5 + src/battle/script.c | 10 +- src/battle/script.h | 2 +- src/battle/spawners.c | 128 ++++++ src/battle/spawners.h | 31 ++ src/challenges/challenges.c | 2 +- src/defs.h | 4 +- src/galaxy/mission.c | 378 +----------------- src/galaxy/mission.h | 13 +- src/game/trophies.c | 2 +- src/main.c | 2 +- src/structs.h | 20 + src/system/controls.c | 12 + src/system/lookup.c | 4 +- tools/updateI18N.sh | 4 + 66 files changed, 1459 insertions(+), 619 deletions(-) create mode 100644 data/challenges/11.json create mode 100644 data/fighters/swarmer.json create mode 100644 data/missions/clarke/05 - clarke defence #5.json create mode 100644 data/missions/clarke/06 - clarke defence #6.json create mode 100644 gfx/fighters/swarmer.png create mode 100644 src/battle/spawners.c create mode 100644 src/battle/spawners.h diff --git a/common.mk b/common.mk index ebd2cba..84a8ad0 100644 --- a/common.mk +++ b/common.mk @@ -24,7 +24,7 @@ OBJS += objectives.o options.o OBJS += player.o OBJS += quadtree.o OBJS += radar.o resources.o rope.o -OBJS += save.o script.o sound.o starfield.o starSystems.o stats.o +OBJS += save.o script.o sound.o spawners.o starfield.o starSystems.o stats.o OBJS += testMission.o textures.o text.o title.o transition.o trophies.o OBJS += util.o OBJS += waypoints.o widgets.o diff --git a/data/capitalShips/csnCorvette01.json b/data/capitalShips/csnCorvette01.json index fe36e4c..afc1ee4 100644 --- a/data/capitalShips/csnCorvette01.json +++ b/data/capitalShips/csnCorvette01.json @@ -10,56 +10,56 @@ "texture" : "gfx/capitalShips/csnCorvette01/core.png", "x" : 0, "y" : -140, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component1.png", "x" : 0, "y" : -200, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component2.png", "x" : -34, "y" : 25, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component2.png", "x" : 34, "y" : 25, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component2.png", "x" : -16, "y" : 25, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component2.png", "x" : 16, "y" : 25, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component3.png", "x" : -23, "y" : 242, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette01/component3.png", "x" : 23, "y" : 242, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "engines" : [ @@ -68,35 +68,35 @@ "texture" : "gfx/capitalShips/csnCorvette01/engine1.png", "x" : -150, "y" : 293, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette01/engine1.png", "x" : 150, "y" : 293, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette01/engine1.png", "x" : -90, "y" : 293, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette01/engine1.png", "x" : 90, "y" : 293, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette01/engine1.png", "x" : 0, "y" : 296, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "guns" : [ @@ -107,7 +107,7 @@ "y" : 200, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -118,7 +118,7 @@ "y" : 200, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -129,7 +129,7 @@ "y" : 100, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -140,7 +140,7 @@ "y" : 100, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -151,7 +151,7 @@ "y" : -50, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -162,7 +162,7 @@ "y" : 175, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 } diff --git a/data/capitalShips/csnCorvette02.json b/data/capitalShips/csnCorvette02.json index f19b6e1..96fe100 100644 --- a/data/capitalShips/csnCorvette02.json +++ b/data/capitalShips/csnCorvette02.json @@ -10,49 +10,49 @@ "texture" : "gfx/capitalShips/csnCorvette02/core.png", "x" : 0, "y" : -140, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette02/component1.png", "x" : -105, "y" : 195, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette02/component1.png", "x" : 105, "y" : 195, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette02/component2.png", "x" : -25, "y" : 18, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette02/component3.png", "x" : 25, "y" : 18, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette02/component4.png", "x" : -67, "y" : -117, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 100, "texture" : "gfx/capitalShips/csnCorvette02/component5.png", "x" : 67, "y" : -117, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "engines" : [ @@ -61,28 +61,28 @@ "texture" : "gfx/capitalShips/csnCorvette02/engine1.png", "x" : -70, "y" : 253, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette02/engine2.png", "x" : -25, "y" : 247, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette02/engine2.png", "x" : 25, "y" : 247, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/csnCorvette02/engine1.png", "x" : 70, "y" : 253, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "guns" : [ @@ -93,7 +93,7 @@ "y" : -225, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -104,7 +104,7 @@ "y" : -60, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -115,7 +115,7 @@ "y" : -60, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -126,7 +126,7 @@ "y" : 70, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -137,7 +137,7 @@ "y" : 110, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -148,7 +148,7 @@ "y" : 110, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -159,7 +159,7 @@ "y" : 240, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -170,7 +170,7 @@ "y" : 240, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 } diff --git a/data/capitalShips/infCorvette01.json b/data/capitalShips/infCorvette01.json index dcc575e..3076e2a 100644 --- a/data/capitalShips/infCorvette01.json +++ b/data/capitalShips/infCorvette01.json @@ -10,56 +10,56 @@ "texture" : "gfx/capitalShips/infCorvette01/component1.png", "x" : -27, "y" : 100, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component2.png", "x" : 27, "y" : 100, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component3.png", "x" : 20, "y" : -17, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component3.png", "x" : -20, "y" : -17, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component4.png", "x" : -21, "y" : -64, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component5.png", "x" : 21, "y" : -64, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component6.png", "x" : -22, "y" : -243, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/component6.png", "x" : 22, "y" : -243, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "engines" : [ @@ -68,21 +68,21 @@ "texture" : "gfx/capitalShips/infCorvette01/engine1.png", "x" : -50, "y" : 285, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/engine1.png", "x" : 50, "y" : 285, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette01/engine2.png", "x" : 0, "y" : 280, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "guns" : [ @@ -93,7 +93,7 @@ "y" : 170, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -104,7 +104,7 @@ "y" : -150, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -115,7 +115,7 @@ "y" : 50, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -125,7 +125,7 @@ "y" : 50, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -135,7 +135,7 @@ "y" : -60, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -145,7 +145,7 @@ "y" : -60, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" } ] diff --git a/data/capitalShips/infCorvette02.json b/data/capitalShips/infCorvette02.json index da38ba1..b240440 100644 --- a/data/capitalShips/infCorvette02.json +++ b/data/capitalShips/infCorvette02.json @@ -10,63 +10,63 @@ "texture" : "gfx/capitalShips/infCorvette02/core.png", "x" : 0, "y" : -80, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component1.png", "x" : -32, "y" : -75, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component1.png", "x" : 32, "y" : -75, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component2.png", "x" : -95, "y" : 195, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component2.png", "x" : 95, "y" : 195, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component3.png", "x" : -30, "y" : 210, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component3.png", "x" : 30, "y" : 210, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component4.png", "x" : -24, "y" : -20, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/component4.png", "x" : 24, "y" : -20, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "guns" : [ @@ -77,7 +77,7 @@ "y" : 200, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -88,7 +88,7 @@ "y" : 200, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -99,7 +99,7 @@ "y" : 200, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -110,7 +110,7 @@ "y" : 0, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -121,7 +121,7 @@ "y" : 100, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -132,7 +132,7 @@ "y" : -125, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -143,7 +143,7 @@ "y" : -125, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 } @@ -154,28 +154,28 @@ "texture" : "gfx/capitalShips/infCorvette02/engine1.png", "x" : -75, "y" : 275, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/engine2.png", "x" : -20, "y" : 275, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/engine3.png", "x" : 20, "y" : 275, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/infCorvette02/engine4.png", "x" : 75, "y" : 275, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ] } diff --git a/data/capitalShips/unfCorvette01.json b/data/capitalShips/unfCorvette01.json index bf5eb3d..f5f6011 100644 --- a/data/capitalShips/unfCorvette01.json +++ b/data/capitalShips/unfCorvette01.json @@ -10,63 +10,63 @@ "texture" : "gfx/capitalShips/unfCorvette01/core.png", "x" : 0, "y" : -100, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component1.png", "x" : -42, "y" : -36, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component1.png", "x" : 42, "y" : -36, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component2.png", "x" : -40, "y" : -8, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component2.png", "x" : 40, "y" : -8, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component3.png", "x" : -40, "y" : 68, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component4.png", "x" : 40, "y" : 68, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component5.png", "x" : -40, "y" : 128, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette01/component5.png", "x" : 40, "y" : 128, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "engines" : [ @@ -75,28 +75,28 @@ "texture" : "gfx/capitalShips/unfCorvette01/engine1.png", "x" : -112, "y" : 281, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/unfCorvette01/engine1.png", "x" : 112, "y" : 281, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/unfCorvette01/engine2.png", "x" : -34, "y" : 268, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/unfCorvette01/engine2.png", "x" : 34, "y" : 268, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "guns" : [ @@ -107,7 +107,7 @@ "y" : -250, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -118,7 +118,7 @@ "y" : -250, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -129,7 +129,7 @@ "y" : 20, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -139,7 +139,7 @@ "y" : 20, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -149,7 +149,7 @@ "y" : 100, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -160,7 +160,7 @@ "y" : 100, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -171,7 +171,7 @@ "y" : 180, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -181,7 +181,7 @@ "y" : 180, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" } ] diff --git a/data/capitalShips/unfCorvette02.json b/data/capitalShips/unfCorvette02.json index 911a837..5ce4d6e 100644 --- a/data/capitalShips/unfCorvette02.json +++ b/data/capitalShips/unfCorvette02.json @@ -10,49 +10,49 @@ "texture" : "gfx/capitalShips/unfCorvette01/core.png", "x" : 0, "y" : -100, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette02/component1.png", "x" : -22, "y" : -24, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette02/component1.png", "x" : 22, "y" : -24, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette02/component2.png", "x" : -86, "y" : 188, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette02/component2.png", "x" : 86, "y" : 188, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette02/component3.png", "x" : -43, "y" : 151, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 50, "texture" : "gfx/capitalShips/unfCorvette02/component3.png", "x" : 43, "y" : 151, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "engines" : [ @@ -61,28 +61,28 @@ "texture" : "gfx/capitalShips/unfCorvette02/engine1.png", "x" : -100, "y" : 286, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/unfCorvette02/engine1.png", "x" : 100, "y" : 286, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/unfCorvette02/engine2.png", "x" : -35, "y" : 289, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" }, { "health" : 150, "texture" : "gfx/capitalShips/unfCorvette02/engine2.png", "x" : 35, "y" : 289, - "flags" : "EF_TAKES_DAMAGE+EF_STATIC" + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC" } ], "guns" : [ @@ -93,7 +93,7 @@ "y" : -250, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -104,7 +104,7 @@ "y" : 30, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -115,7 +115,7 @@ "y" : 30, "reloadTime" : 40, "type" : "BT_ROCKET", - "flags" : "EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_STATIC+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE", "missiles" : 9999 }, @@ -126,7 +126,7 @@ "y" : 30, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -136,7 +136,7 @@ "y" : -70, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -146,7 +146,7 @@ "y" : -70, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -156,7 +156,7 @@ "y" : 170, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -166,7 +166,7 @@ "y" : 210, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" }, { @@ -176,7 +176,7 @@ "y" : 210, "reloadTime" : 10, "type" : "BT_PLASMA", - "flags" : "EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", + "flags" : "EF_NO_KILL_INC+EF_TAKES_DAMAGE+EF_SECONDARY_TARGET", "aiFlags" : "AIF_AGGRESSIVE+AIF_LONG_RANGE_FIRE" } ] diff --git a/data/challenges/08.json b/data/challenges/08.json index c88db75..38997bd 100644 --- a/data/challenges/08.json +++ b/data/challenges/08.json @@ -1,6 +1,6 @@ { - "name" : "Defend Jumpgate Point", - "description" : "Defend Jumpgate Point", + "name" : "Defend Jumpgate", + "description" : "Defend Jumpgate", "background" : "AUTO", "planet" : "AUTO", "music" : "AUTO", diff --git a/data/challenges/10.json b/data/challenges/10.json index 53e2535..3303f3f 100644 --- a/data/challenges/10.json +++ b/data/challenges/10.json @@ -49,12 +49,16 @@ "y" : 25 } ], - "script" : [ + "spawners" : [ { - "function" : "INTERVAL 30", - "lines" : [ - "SPAWN_FIGHTERS Dart SIDE_PIRATE 1 OFFSCREEN" - ] + "name" : "spawner", + "types" : "Dart", + "side" : "SIDE_PIRATE", + "interval" : 30, + "limit" : 0, + "total" : 0, + "step" : 1, + "offscreen" : 1 } ] } diff --git a/data/challenges/11.json b/data/challenges/11.json new file mode 100644 index 0000000..3bebd5a --- /dev/null +++ b/data/challenges/11.json @@ -0,0 +1,49 @@ +{ + "name" : "Destroy INF Klondike and INF Canfield", + "description" : "Destroy INF Klondike and INF Canfield", + "background" : "AUTO", + "planet" : "AUTO", + "music" : "AUTO", + "player" : { + "type" : "ATAF", + "side" : "SIDE_ALLIES", + "pilot" : "-", + "squadron" : "-", + "x" : 25, + "y" : 25 + }, + "challenge" : { + "killLimit" : 2, + "timeLimit" : 90, + "challenges" : [ + { + "type" : "CHALLENGE_TIME", + "value" : 50 + }, + { + "type" : "CHALLENGE_TIME", + "value" : 90 + }, + { + "type" : "CHALLENGE_SHOT_ACCURACY", + "value" : 90 + } + ] + }, + "capitalShips" : [ + { + "name" : "INF Klondike", + "types" : "INF Corvette 01", + "side" : "SIDE_PANDORAN", + "x" : 23, + "y" : 23 + }, + { + "name" : "INF Canfield", + "types" : "INF Corvette 01", + "side" : "SIDE_PANDORAN", + "x" : 27, + "y" : 27 + } + ] +} diff --git a/data/craft/civilian.json b/data/craft/civilian.json index 8e81ac6..8e9e449 100644 --- a/data/craft/civilian.json +++ b/data/craft/civilian.json @@ -1,10 +1,7 @@ { "name" : "Civilian", "health" : 15, - "shield" : 0, "speed" : 2, - "reloadTime" : 0, - "shieldRechargeRate" : 0, "texture" : "gfx/craft/civilian01.png", "flags" : "EF_MISSION_TARGET+EF_RETREATING+EF_TAKES_DAMAGE", "aiFlags" : "AIF_GOAL_JUMPGATE+AIF_AVOIDS_COMBAT+AIF_FOLLOWS_PLAYER" diff --git a/data/craft/infTug.json b/data/craft/infTug.json index 473ad61..2e406b5 100644 --- a/data/craft/infTug.json +++ b/data/craft/infTug.json @@ -1,10 +1,8 @@ { "name" : "INF Tug", "health" : 50, - "shield" : 0, "speed" : 1.85, "reloadTime" : 10, - "shieldRechargeRate" : 0, "texture" : "gfx/craft/infTug.png", "flags" : "EF_HAS_ROPE+EF_TAKES_DAMAGE", "aiFlags" : "AIF_AVOIDS_COMBAT+AIF_TOWS" diff --git a/data/craft/munitionsTransport.json b/data/craft/munitionsTransport.json index 9998c16..d5fcbcc 100644 --- a/data/craft/munitionsTransport.json +++ b/data/craft/munitionsTransport.json @@ -4,7 +4,6 @@ "shield" : 50, "speed" : 1.5, "reloadTime" : 10, - "shieldRechargeRate" : 0, "texture" : "gfx/craft/munitionsTransport.png", "flags" : "EF_TAKES_DAMAGE", "aiFlags" : "AIF_AVOIDS_COMBAT" diff --git a/data/craft/shuttle.json b/data/craft/shuttle.json index c415548..931bb22 100644 --- a/data/craft/shuttle.json +++ b/data/craft/shuttle.json @@ -3,7 +3,6 @@ "health" : 15, "shield" : 15, "speed" : 2, - "reloadTime" : 0, "shieldRechargeRate" : 60, "texture" : "gfx/craft/shuttle.png", "flags" : "EF_COLLECTS_ITEMS+EF_TAKES_DAMAGE+EF_NO_EPIC", diff --git a/data/craft/tug.json b/data/craft/tug.json index b8392d5..88302c9 100644 --- a/data/craft/tug.json +++ b/data/craft/tug.json @@ -1,10 +1,8 @@ { "name" : "Tug", "health" : 50, - "shield" : 0, "speed" : 1.85, "reloadTime" : 10, - "shieldRechargeRate" : 0, "texture" : "gfx/craft/tug.png", "guns" : [ { diff --git a/data/fighters/cannonDart.json b/data/fighters/cannonDart.json index 8da3cb8..9f4c0f4 100644 --- a/data/fighters/cannonDart.json +++ b/data/fighters/cannonDart.json @@ -1,10 +1,8 @@ { "name" : "CannonDart", "health" : 15, - "shield" : 0, "speed" : 2.1, "reloadTime" : 24, - "shieldRechargeRate" : 0, "texture" : "gfx/fighters/dart01.png", "guns" : [ { diff --git a/data/fighters/dart.json b/data/fighters/dart.json index 3862aec..d1a4d94 100644 --- a/data/fighters/dart.json +++ b/data/fighters/dart.json @@ -1,10 +1,8 @@ { "name" : "Dart", "health" : 15, - "shield" : 0, "speed" : 2.1, "reloadTime" : 24, - "shieldRechargeRate" : 0, "texture" : "gfx/fighters/dart01.png", "guns" : [ { diff --git a/data/fighters/missileDart.json b/data/fighters/missileDart.json index 8088334..52f41c1 100644 --- a/data/fighters/missileDart.json +++ b/data/fighters/missileDart.json @@ -1,10 +1,8 @@ { "name" : "MissileDart", "health" : 15, - "shield" : 0, "speed" : 2.1, "reloadTime" : 24, - "shieldRechargeRate" : 0, "texture" : "gfx/fighters/dart01.png", "missiles" : 999, "flags" : "EF_TAKES_DAMAGE" diff --git a/data/fighters/simpleDart.json b/data/fighters/simpleDart.json index a1d4e9d..53eec64 100644 --- a/data/fighters/simpleDart.json +++ b/data/fighters/simpleDart.json @@ -1,10 +1,8 @@ { "name" : "SimpleDart", "health" : 15, - "shield" : 0, "speed" : 2.1, "reloadTime" : 24, - "shieldRechargeRate" : 0, "texture" : "gfx/fighters/dart01.png", "guns" : [ { diff --git a/data/fighters/staticDart.json b/data/fighters/staticDart.json index b427114..57fd6d7 100644 --- a/data/fighters/staticDart.json +++ b/data/fighters/staticDart.json @@ -1,10 +1,8 @@ { "name" : "StaticDart", "health" : 15, - "shield" : 0, "speed" : 0, "reloadTime" : 24, - "shieldRechargeRate" : 0, "texture" : "gfx/fighters/dart01.png", "flags" : "EF_TAKES_DAMAGE" } diff --git a/data/fighters/swarmer.json b/data/fighters/swarmer.json new file mode 100644 index 0000000..28ba13e --- /dev/null +++ b/data/fighters/swarmer.json @@ -0,0 +1,17 @@ +{ + "name" : "Swarmer", + "health" : 5, + "speed" : 2, + "reloadTime" : 8, + "texture" : "gfx/fighters/swarmer.png", + "guns" : [ + { + "type" : "BT_PARTICLE", + "x" : 0, + "y" : 0 + } + ], + "deathType" : "DT_SIMPLE", + "flags" : "EF_TAKES_DAMAGE", + "aiFlags" : "AIF_UNLIMITED_RANGE" +} diff --git a/data/fighters/unarmedDart.json b/data/fighters/unarmedDart.json index 42e81ed..97d6269 100644 --- a/data/fighters/unarmedDart.json +++ b/data/fighters/unarmedDart.json @@ -1,10 +1,8 @@ { "name" : "UnarmedDart", "health" : 15, - "shield" : 0, "speed" : 2.1, "reloadTime" : 24, - "shieldRechargeRate" : 0, "texture" : "gfx/fighters/dart01.png", "flags" : "EF_TAKES_DAMAGE" } diff --git a/data/galaxy/starSystems.json b/data/galaxy/starSystems.json index 61459c5..2939a2e 100644 --- a/data/galaxy/starSystems.json +++ b/data/galaxy/starSystems.json @@ -151,7 +151,8 @@ "name": "Clarke", "side" : "SIDE_UNF", "x": 398, - "y": 84 + "y": 84, + "fallsToPandorans" : 1 }, { "name": "Adetton", diff --git a/data/missions/clarke/04 - clarke defence #4.json b/data/missions/clarke/04 - clarke defence #4.json index 812de5d..3c93dc7 100644 --- a/data/missions/clarke/04 - clarke defence #4.json +++ b/data/missions/clarke/04 - clarke defence #4.json @@ -1,6 +1,6 @@ { "name" : "Clarke Defence #4", - "description" : "", + "description" : "White Knights, Commodore Parks has identified three enemy corvettes are high level targets. He wants Dodds, Koonan and Todd to take them down, as quickly as possible. There won't be any additional fighter support, but three ATAFs should be more than enough to get the job done. de Winter and Taylor are currently on another assignment. Dodds will lead the attack.", "requires" : 28, "background" : "gfx/backgrounds/background06.jpg", "planet" : "gfx/planets/bluePlanet.png", diff --git a/data/missions/clarke/05 - clarke defence #5.json b/data/missions/clarke/05 - clarke defence #5.json new file mode 100644 index 0000000..d06583c --- /dev/null +++ b/data/missions/clarke/05 - clarke defence #5.json @@ -0,0 +1,194 @@ +{ + "name" : "Clarke Defence #5", + "description" : "We have discovered that Alysha's Calling, one of the highest profile enemy frigates, is currently in the system. We are preparing a strike team of Hammerheads, led by the Twilight Lancers, to engage and destroy it. It is unknown what effects, if any, the destruction of this ship will have on enemy morale, however it can only have a positive infact on ours. The frigate's support groups will need to be destroyed first.", + "requires" : 28, + "background" : "gfx/backgrounds/background06.jpg", + "planet" : "gfx/planets/bluePlanet.png", + "music" : "music/battle/heroism.ogg", + "objectives" : [ + { + "description" : "Eliminate support group #1", + "targetName" : "group-1", + "targetValue" : 5, + "targetType" : "TT_DESTROY" + }, + { + "description" : "Eliminate support group #2", + "targetName" : "group-2", + "targetValue" : 5, + "targetType" : "TT_DESTROY", + "active" : 0 + }, + { + "description" : "Destroy INF Alysha's Calling", + "targetName" : "Alysha's Calling", + "targetValue" : 1, + "targetType" : "TT_DESTROY", + "active" : 0 + }, + { + "description" : "Destroy incoming threat", + "targetName" : "swarmers-1", + "targetValue" : 24, + "targetType" : "TT_DESTROY", + "hideNumbers" : 1, + "active" : 0 + }, + { + "description" : "Eliminate Swarmers", + "targetName" : "Swarmer", + "targetValue" : 80, + "targetType" : "TT_DESTROY", + "hideNumbers" : 1, + "active" : 0 + } + ], + "player" : { + "type" : "Rook", + "side" : "SIDE_ALLIES", + "pilot" : "Jessica Welch", + "squadron" : "Twilight Lancers", + "x" : 5, + "y" : 5 + }, + "fighters" : [ + { + "types" : "TAF;Ray;Kingfisher", + "side" : "SIDE_ALLIES", + "x" : 5, + "y" : 5, + "number" : 7, + "scatter" : 600 + }, + { + "types" : "Hammerhead", + "side" : "SIDE_ALLIES", + "x" : 5, + "y" : 5, + "number" : 5, + "scatter" : 600 + }, + { + "name" : "Pandoran", + "groupName" : "group-1", + "types" : "Jackal;Mantis", + "side" : "SIDE_PANDORAN", + "x" : 12, + "y" : 12, + "number" : 5, + "scatter" : 600 + }, + { + "name" : "Pandoran", + "groupName" : "group-2", + "types" : "Jackal;Mantis", + "side" : "SIDE_PANDORAN", + "x" : 12, + "y" : -1, + "number" : 5, + "scatter" : 0, + "active" : 0 + }, + { + "name" : "Unknown", + "groupName" : "swarmers-1", + "types" : "Swarmer", + "side" : "SIDE_PANDORAN", + "x" : -1, + "y" : 12, + "number" : 8, + "scatter" : 0, + "active" : 0 + }, + { + "name" : "Unknown", + "groupName" : "swarmers-1", + "types" : "Swarmer", + "side" : "SIDE_PANDORAN", + "x" : -1, + "y" : 18, + "number" : 8, + "scatter" : 0, + "active" : 0 + }, + { + "name" : "Unknown", + "groupName" : "swarmers-1", + "types" : "Swarmer", + "side" : "SIDE_PANDORAN", + "x" : -1, + "y" : 24, + "number" : 8, + "scatter" : 0, + "active" : 0 + } + ], + "spawners" : [ + { + "name" : "SwarmerSpawner", + "types" : "Swarmer", + "side" : "SIDE_PANDORAN", + "interval" : 2, + "total" : 80, + "step" : 3, + "offscreen" : 1, + "active" : 0 + } + ], + "script" : [ + { + "function" : "TIME 2", + "lines" : [ + "MSG_BOX Welch;First squadron sighted. Moving to intercept." + ] + }, + { + "function" : "ENEMIES_KILLED 5", + "lines" : [ + "WAIT 1", + "ACTIVATE_OBJECTIVES Eliminate support group #2", + "ACTIVATE_ENTITY_GROUPS group-2", + "MSG_BOX Welch;First squadron taken down, preparing to engage second." + ] + }, + { + "function" : "ENEMIES_KILLED 10", + "lines" : [ + "WAIT 1", + "MSG_BOX Welch;Second squadron down. Moving up the field to engage Alysha's Calling.", + "ACTIVATE_OBJECTIVES Destroy INF Alysha's Calling", + "WAIT_MSG_BOX", + "ACTIVATE_ENTITY_GROUPS swarmers-1", + "MSG_BOX CSN Thunderbird;Welch, we are tracking a large number of fast-moving heading your way. IDs don't match anything we currently have on record.", + "MSG_BOX Welch;Missiles?", + "MSG_BOX CSN Thunderbird;Too large. We'll relay more information as we get it. Be prepared to engage.", + "ACTIVATE_OBJECTIVES Destroy incoming threat" + ] + }, + { + "function" : "ENEMIES_KILLED 25", + "lines" : [ + "MSG_BOX Wingmate;Whatever these things are, they're not hard to dispatch.", + "MSG_BOX Welch;No, but there's a lot of them ...", + "WAIT_MSG_BOX", + "ACTIVATE_OBJECTIVES Eliminate Swarmers", + "ACTIVATE_SPAWNERS SwarmerSpawner", + "MSG_BOX CSN Thunderbird;Welch, we're detecting more of the swarmer things heading your way.", + "MSG_BOX Welch;How many more?", + "MSG_BOX CSN Thunderbird;Tracking around three dozen, and the numbers are rising." + ] + }, + { + "function" : "OBJECTIVES_COMPLETE 4", + "lines" : [ + "MSG_BOX Welch;Thunderbird, this is Welch. Swarmers have been taken care of.", + "MSG_BOX CSN Thunderbird;Good to hear, Commander. We're pulling you out there, to assist the other squadrons.", + "MSG_BOX Welch;What about Alysha?", + "MSG_BOX CSN Thunderbird;The target is no longer a priority. Clarke's frontline is collapsing. They need reinforcement, ASAP.", + "MSG_BOX Welch;Understood. Heading there now.", + "WAIT_MSG_BOX", + "COMPLETE_MISSION" + ] + } + ] +} diff --git a/data/missions/clarke/06 - clarke defence #6.json b/data/missions/clarke/06 - clarke defence #6.json new file mode 100644 index 0000000..c715ad8 --- /dev/null +++ b/data/missions/clarke/06 - clarke defence #6.json @@ -0,0 +1,175 @@ +{ + "name" : "Clarke Defence #6", + "description" : "The enemy are beginning to overrun our frontline. Your objective is simple: engage and destroy all hostile forces. We cannot afford to lose any more ground here. To do so would mean conceding defeat and Clarke falling to the Pandoran fleet. This must not happen.", + "requires" : 30, + "background" : "gfx/backgrounds/background06.jpg", + "planet" : "gfx/planets/bluePlanet.png", + "music" : "music/battle/DST-RailJet-LongSeamlessLoop.ogg", + "unwinnable" : 1, + "objectives" : [ + { + "description" : "Destroy all enemy targets", + "targetName" : "Pandoran", + "targetValue" : 150, + "targetType" : "TT_DESTROY" + } + ], + "epic" : { + "fighterLimit" : 24 + }, + "player" : { + "type" : "Rook", + "side" : "SIDE_ALLIES", + "pilot" : "(Multiple)", + "squadron" : "(Multiple)" + }, + "fighters" : [ + { + "name" : "ALLIES", + "types" : "TAF;Ray;Kingfisher;Hammerhead;Firefly;Nymph;Lynx;Hyena-A;Hyena-B", + "side" : "SIDE_ALLIES", + "x" : 25, + "y" : 25, + "number" : 200, + "scatter" : 10000 + }, + { + "name" : "Pandoran", + "types" : "Jackal;Mantis;Sphinx;Scarab;Thunderhead", + "side" : "SIDE_PANDORAN", + "x" : 25, + "y" : 18, + "number" : 150, + "scatter" : 10000, + "flags" : "+EF_AI_TARGET" + }, + { + "groupName" : "twilightLancers", + "types" : "TAF;Ray;Kingfisher;Hammerhead", + "side" : "SIDE_ALLIES", + "x" : -1, + "y" : -1, + "number" : 7, + "scatter" : 600, + "active" : 0 + } + ], + "capitalShips" : [ + { + "name" : "UNF Cleopatra", + "types" : "UNF Corvette 01", + "side" : "SIDE_ALLIES", + "x" : 22, + "y" : 22, + "flags" : "+EF_AI_LEADER+EF_AI_TARGET" + }, + { + "name" : "UNF Artemis", + "types" : "UNF Corvette 02", + "side" : "SIDE_ALLIES", + "x" : 28, + "y" : 28, + "flags" : "+EF_AI_LEADER+EF_AI_TARGET" + } + ], + "spawners" : [ + { + "name" : "SwarmerSpawner", + "types" : "Swarmer", + "side" : "SIDE_PANDORAN", + "interval" : 1, + "total" : -1, + "offscreen" : 1, + "step" : 1, + "active" : 0 + } + ], + "script" : [ + { + "function" : "TIME 2", + "lines" : [ + "MSG_BOX Wing Commander;The Twilight Lancers are on their way.", + "MSG_BOX Wingmate #62;Eight whole extra fighters? We might outnumber the enemy, but they still outgun us!", + "MSG_BOX Wing Commander;At this point, any additional support is welcome. And we still have the support of Cleopatra and Artemis." + ] + }, + { + "function" : "ALLIES_KILLED 25", + "lines" : [ + "ACTIVATE_ENTITY_GROUPS twilightLancers", + "MSG_BOX Welch;Welch here, engaging targets.", + "MSG_BOX Wing Commander;Not a moment too soon, Commander." + ] + }, + { + "function" : "ENEMIES_KILLED 50", + "lines" : [ + "MSG_BOX Wing Commander;We're wearing them down. Keep up the pressure.", + "MSG_BOX Wingmate #31;Think they're pull back if we hit them hard enough?", + "MSG_BOX Wing Commander;Too early to speculate. Just concentrate on taking down their fighters." + ] + }, + { + "function" : "ENEMIES_KILLED 75", + "lines" : [ + "MSG_BOX Wingmate #88;I've just been tailed by something I've never seen before! Small, highly maneuverable, rapid fire particle cannon.", + "MSG_BOX Welch;Swarmers! The enemy have deployed them here, too!", + "MSG_BOX Wing Commander;How many?", + "MSG_BOX Wingmate #82;Tracking a dozen, but the numbers are growing rapidly", + "WAIT_MSG_BOX", + "ACTIVATE_SPAWNERS SwarmerSpawner" + ] + }, + { + "function" : "ALLIES_KILLED 150", + "lines" : [ + "MSG_BOX Wingmate #88;I've lost count how many of these damn swarmers I've taken down.", + "MSG_BOX Wingmate #120;It's like fighting a hydra! You cut off one head, and two more spring up!" + ] + }, + { + "function" : "ALLIES_KILLED 195", + "lines" : [ + "MSG_BOX Wingmate #181;There's too many of them!", + "MSG_BOX Wingmate #31;Keep fighting, we can still win this!", + "MSG_BOX Wingmate #111;They're everywhere! I--" + ] + }, + { + "function" : "CAP_ENGINES_DESTROYED UNF Cleopatra", + "lines" : [ + "MSG_BOX UNF Cleopatra;This is UNF Cleopatra. We are engine crippled. Please provide cover support!" + ] + }, + { + "function" : "CAP_HEALTH UNF Cleopatra 3", + "lines" : [ + "MSG_BOX UNF Cleopatra;Mayday! Mayday! We are taking heavy damage! Please assist ASAP!" + ] + }, + { + "function" : "CAP_ENGINES_DESTROYED UNF Artemis", + "lines" : [ + "MSG_BOX Wing Commander;Artemis has lost her engines. We need to keep those Pandorans off her!" + ] + }, + { + "function" : "CAP_HEALTH UNF Artemis 3", + "lines" : [ + "MSG_BOX UNF Artemis;All fighters, we're taking a pounding here, we don't know how much longer we can survive this." + ] + }, + { + "function" : "CAPITAL_SHIPS_LOST 1", + "lines" : [ + "MSG_BOX Wing Commander;People, we are down one capital ship! We need to step things up!" + ] + }, + { + "function" : "CAPITAL_SHIPS_LOST 2", + "lines" : [ + "MSG_BOX Wing Commander;Both caps are down, all hands lost. Let's not let this go to waste." + ] + } + ] +} diff --git a/data/missions/iliad/05 - iliad defence #5.json b/data/missions/iliad/05 - iliad defence #5.json index d3f9789..990f1eb 100644 --- a/data/missions/iliad/05 - iliad defence #5.json +++ b/data/missions/iliad/05 - iliad defence #5.json @@ -82,34 +82,34 @@ { "function" : "TIME 2", "lines" : [ - "MSG_BOX UNF Wing Commander;Stay sharp, people. We need to hold the line here!", - "MSG_BOX UNF Wingmate #31;Oh my God, there's a lot of them ...", - "MSG_BOX UNF Wingmate #82;Pair up, and take them down together. We stand a much better chance that way." + "MSG_BOX Wing Commander;Stay sharp, people. We need to hold the line here!", + "MSG_BOX Wingmate #31;Oh my God, there's a lot of them ...", + "MSG_BOX Wingmate #82;Pair up, and take them down together. We stand a much better chance that way." ] }, { "function" : "ALLIES_KILLED 30", "lines" : [ "ACTIVATE_ENTITIES INF Qama;INF Seax;INF Mora;INF Sharpfinger", - "MSG_BOX UNF Wing Commander;Heads up, people. Four INF corvettes just entered the area.", - "MSG_BOX UNF Wingmate #41;What's happened to all our own capital ships?!", - "MSG_BOX UNF Wing Commander;They've been scratched." + "MSG_BOX Wing Commander;Heads up, people. Four INF corvettes just entered the area.", + "MSG_BOX Wingmate #41;What's happened to all our own capital ships?!", + "MSG_BOX Wing Commander;They've been scratched." ] }, { "function" : "ALLIES_KILLED 60", "lines" : [ - "MSG_BOX UNF Wingmate #63;That Dust Brothers have been flagged." + "MSG_BOX Wingmate #63;That Dust Brothers have been flagged." ] }, { "function" : "ALLIES_KILLED 90", "lines" : [ - "MSG_BOX UNF Wingmate #94;We have to sound the retreat!", - "MSG_BOX UNF Wing Commander;Mister, you remain where you are! We're not abando--", + "MSG_BOX Wingmate #94;We have to sound the retreat!", + "MSG_BOX Wing Commander;Mister, you remain where you are! We're not abando--", "WAIT_MSG_BOX", "WAIT 3", - "MSG_BOX UNF Wingmate #98;The wing commander's dead." + "MSG_BOX Wingmate #98;The wing commander's dead." ] } ] diff --git a/data/missions/mace/01 - rebel assault #1.json b/data/missions/mace/01 - rebel assault #1.json index d119150..a797ac0 100644 --- a/data/missions/mace/01 - rebel assault #1.json +++ b/data/missions/mace/01 - rebel assault #1.json @@ -1,7 +1,7 @@ { "name" : "Rebel Assault #1", "description" : "", - "requires" : 28, + "requires" : 99, "background" : "gfx/backgrounds/background03.jpg", "planet" : "gfx/planets/spirit.png", "music" : "music/battle/InnerCore_Low.ogg", diff --git a/data/missions/rothan/01 - rothan defence #1.json b/data/missions/rothan/01 - rothan defence #1.json index ea40cb3..3e1e0ff 100644 --- a/data/missions/rothan/01 - rothan defence #1.json +++ b/data/missions/rothan/01 - rothan defence #1.json @@ -1,6 +1,6 @@ { "name" : "Rothan Defence #1", - "description" : "", + "description" : "A distress call from a CSN squadron has been issued, who were engaging Pandoran targets. It appears as though the enemy have magged the fighters, rather than destroy them. INF tugs are preparing to lead them out of the system, via the jumpgate. We need to destroy those tugs, and get those men and women to safety. We cannot allow the Pandorans to get hold of any of our technology.", "requires" : 28, "background" : "gfx/backgrounds/background05.jpg", "planet" : "gfx/planets/bluePlanet.png", diff --git a/data/missions/rothan/02 - rothan defence #2.json b/data/missions/rothan/02 - rothan defence #2.json index 42b580d..36120a7 100644 --- a/data/missions/rothan/02 - rothan defence #2.json +++ b/data/missions/rothan/02 - rothan defence #2.json @@ -1,13 +1,13 @@ { "name" : "Rothan Defence #2", - "description" : "", + "description" : "The Pandorans are preparing for a major push into Rothan, so we need to shore up defences as quickly as possible. Command have selected a number of positions that will give us a strategic advantage in the early stages of battle when the enemy arrives. The Blue Jesters are to link up with the Irregular Nomads near to one Rothan's inner jumpgates, and await further instructions.", "requires" : 29, "background" : "gfx/backgrounds/background05.jpg", "planet" : "gfx/planets/bluePlanet.png", "music" : "music/battle/determination.mp3", "objectives" : [ { - "description" : "Rendezvous with Irregular Nomads", + "description" : "Rendezvous with the Irregular Nomads", "targetName" : "Waypoint", "targetValue" : 1, "targetType" : "TT_WAYPOINT" diff --git a/gfx/fighters/swarmer.png b/gfx/fighters/swarmer.png new file mode 100644 index 0000000000000000000000000000000000000000..34a9285feb4d7f5797412c8bd5b8cb83182927a8 GIT binary patch literal 1459 zcmV;k1x)&hP)X1^@s6D=Y3@00006VoOIv00000 z008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~$d3Cn@-RUylF)02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00kRKL_t(Y$CZ|SXjXL;$3OSw zx%YY5v$i?hqo%e^ab}^kbiPc&mf}mkG)6dIkVWQ@DWoW6K}I5?LB+qo8EL5z zX{iw@=ZpaIG>*!XfC0)mgM097jH_3%f!ee*^6ve_GDbZuPOsqd!_uYFQX^8gVuj>h z>Xh6|o$}f2+0s%Yva+C{E0bQcQ6C4|BGer@NbcmR08DVXFm;`2Z+;EHN{@%NUhhA! z9@b6(KJt3W8abqdqoBPXU-(!<4i3%{yFzA<)!>#uAZoM>B#ng3lRi#se3oR`? zIQ|QDhxQ{PXo^C6BtrB3`!ofE-G1$%5E&CE^1VZ%0+>KJ9_O!E41mqMJ!pzTTR2Q> zC`8;Lv?HAiA3Tsd?d^m`@S7$+(1Vk(gTZEtY?j6mBAF#uHKl zYlmtY6XF}Vcx4U;nwu#yP4Y@h88Uo0seu4jE?;Kr*|WS3qyTFg8_CsmW)&CHFDr|* zL4)|Sv5_X*Mm<+W&YjhqP`~1;Z6_r1C<5}fKbqatBmPN3mgO&#m2wN5nB?;qO zfb9@8ln8zOeln7i$x2VBznbXT%FCBgfb*8sQ-e8%L27gz!GYz}T)Re#ZSzHCC6)-L zqA<4#s7L^Z9Du$99Dq3RLViBB z2+yXZaBFV@G!-x$f?Inbuw)6g2+skBw`~I;;PEh&DO^`S?2*U-imFGFW|{z)ih|cL zNHR@KU1z=XkE=kZLr}5D%k}&Bxe^Q#?C9WzQ@=i@Nm2Dk`Z_hy0a8?zs=|7rnF*t~ z2ws;9MNx3OT)60w=dSa8DIO=KxfuccrrBLoT~VkitS8l@KGbMH(~AqSL|BxaO-(e) zsl$g!Pf8+?oJ^*s@#C^(40IxTXTk(-+BVl(Te;WK!Tx>wsES0`nwN)1*BLl@6#=Iv zO4nsK!!YQVnTcZC1Uw!-X=vbWx0{8frKEbjoGULU*4Bm%RJvUFb8;{>jpp;`IUb9# zDL0n^UN3!oK7z-NF|X%F?HLwR4MPOvX0^zcF=OPBA=2x+dc+91SuG+U-}wE#PB{Uj z$Ta24{Cp{4qii2H?n%R4%7zV-5;n?~@#AHg$MY|6{gDMgsv;4dKYf}R1ty`e`ozJV zmYhC$2t4(jVe*;7cE?eDkx^w^l N002ovPDHLkV1kTZn$G|L literal 0 HcmV?d00001 diff --git a/locale/tbftss.pot b/locale/tbftss.pot index 1eea83f..e3de4ed 100644 --- a/locale/tbftss.pot +++ b/locale/tbftss.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: TBFTSS: The Pandoran War\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-03-12 15:00:11+0000\n" +"POT-Creation-Date: 2016-03-27 11:09:14+0100\n" "PO-Revision-Date: ???\n" "Last-Translator: ???\n" "Language-Team: ???\n" @@ -625,6 +625,9 @@ msgstr "" msgid "Maybe not, if we continue to lose ground the way we are already ..." msgstr "" +msgid "White Knights, Commodore Parks has identified three enemy corvettes are high level targets. He wants Dodds, Koonan and Todd to take them down, as quickly as possible. There won't be any additional fighter support, but three ATAFs should be more than enough to get the job done. de Winter and Taylor are currently on another assignment. Dodds will lead the attack." +msgstr "" + msgid "Targets sighted: three capital ships, five escorts apiece." msgstr "" @@ -670,6 +673,129 @@ msgstr "" msgid "Okay, let's get back to Leviathan, and wait for Kelly and Estelle to rejoin us." msgstr "" +msgid "We have discovered that Alysha's Calling, one of the highest profile enemy frigates, is currently in the system. We are preparing a strike team of Hammerheads, led by the Twilight Lancers, to engage and destroy it. It is unknown what effects, if any, the destruction of this ship will have on enemy morale, however it can only have a positive infact on ours. The frigate's support groups will need to be destroyed first." +msgstr "" + +msgid "First squadron sighted. Moving to intercept." +msgstr "" + +msgid "First squadron taken down, preparing to engage second." +msgstr "" + +msgid "Second squadron down. Moving up the field to engage Alysha's Calling." +msgstr "" + +msgid "Welch, we are tracking a large number of fast-moving heading your way. IDs don't match anything we currently have on record." +msgstr "" + +msgid "Missiles?" +msgstr "" + +msgid "Too large. We'll relay more information as we get it. Be prepared to engage." +msgstr "" + +msgid "Whatever these things are, they're not hard to dispatch." +msgstr "" + +msgid "No, but there's a lot of them ..." +msgstr "" + +msgid "Welch, we're detecting more of the swarmer things heading your way." +msgstr "" + +msgid "How many more?" +msgstr "" + +msgid "Tracking around three dozen, and the numbers are rising." +msgstr "" + +msgid "Thunderbird, this is Welch. Swarmers have been taken care of." +msgstr "" + +msgid "Good to hear, Commander. We're pulling you out there, to assist the other squadrons." +msgstr "" + +msgid "What about Alysha?" +msgstr "" + +msgid "The target is no longer a priority. Clarke's frontline is collapsing. They need reinforcement, ASAP." +msgstr "" + +msgid "Understood. Heading there now." +msgstr "" + +msgid "The enemy are beginning to overrun our frontline. Your objective is simple: engage and destroy all hostile forces. We cannot afford to lose any more ground here. To do so would mean conceding defeat and Clarke falling to the Pandoran fleet. This must not happen." +msgstr "" + +msgid "The Twilight Lancers are on their way." +msgstr "" + +msgid "Eight whole extra fighters? We might outnumber the enemy, but they still outgun us!" +msgstr "" + +msgid "At this point, any additional support is welcome. And we still have the support of Cleopatra and Artemis." +msgstr "" + +msgid "Welch here, engaging targets." +msgstr "" + +msgid "Not a moment too soon, Commander." +msgstr "" + +msgid "We're wearing them down. Keep up the pressure." +msgstr "" + +msgid "Think they're pull back if we hit them hard enough?" +msgstr "" + +msgid "Too early to speculate. Just concentrate on taking down their fighters." +msgstr "" + +msgid "I've just been tailed by something I've never seen before! Small, highly maneuverable, rapid fire particle cannon." +msgstr "" + +msgid "Swarmers! The enemy have deployed them here, too!" +msgstr "" + +msgid "How many?" +msgstr "" + +msgid "Tracking a dozen, but the numbers are growing rapidly" +msgstr "" + +msgid "I've lost count how many of these damn swarmers I've taken down." +msgstr "" + +msgid "It's like fighting a hydra! You cut off one head, and two more spring up!" +msgstr "" + +msgid "There's too many of them!" +msgstr "" + +msgid "Keep fighting, we can still win this!" +msgstr "" + +msgid "They're everywhere! I--" +msgstr "" + +msgid "This is UNF Cleopatra. We are engine crippled. Please provide cover support!" +msgstr "" + +msgid "Mayday! Mayday! We are taking heavy damage! Please assist ASAP!" +msgstr "" + +msgid "Artemis has lost her engines. We need to keep those Pandorans off her!" +msgstr "" + +msgid "All fighters, we're taking a pounding here, we don't know how much longer we can survive this." +msgstr "" + +msgid "People, we are down one capital ship! We need to step things up!" +msgstr "" + +msgid "Both caps are down, all hands lost. Let's not let this go to waste." +msgstr "" + msgid "Though we suffered heavy losses at Coyote, it is still important that we attempt to prevent, or at least slow, the Pandoran war machine's advance. Admiral Jenkins has ordered that the White Knights lead an attack on the enemy forces gathered in the system. The weight of the opposing forces remains tremendous, though the ATAFs should help to give us the edge in battle. Be advised that the enemy are now in possession of UNF fighter craft." msgstr "" @@ -931,6 +1057,9 @@ msgstr "" msgid "We're taking a lot of damage here. Please assist." msgstr "" +msgid "A distress call from a CSN squadron has been issued, who were engaging Pandoran targets. It appears as though the enemy have magged the fighters, rather than destroy them. INF tugs are preparing to lead them out of the system, via the jumpgate. We need to destroy those tugs, and get those men and women to safety. We cannot allow the Pandorans to get hold of any of our technology." +msgstr "" + msgid "White Knights, the enemy tugs are already in position and are attaching tow ropes. They must not be allowed to get those fighters and pilots to the jumpgate." msgstr "" @@ -958,6 +1087,9 @@ msgstr "" msgid "I knew I could count on you, de Winter. Head back to Griffin." msgstr "" +msgid "The Pandorans are preparing for a major push into Rothan, so we need to shore up defences as quickly as possible. Command have selected a number of positions that will give us a strategic advantage in the early stages of battle when the enemy arrives. The Blue Jesters are to link up with the Irregular Nomads near to one Rothan's inner jumpgates, and await further instructions." +msgstr "" + msgid "Control, we're in position. Awaiting the Irregular Nomads." msgstr "" @@ -1216,3 +1348,30 @@ msgstr "" msgid "Likewise. Maybe we'll get it do it again some day, though a part of me really hopes we won't need to ...." msgstr "" +msgid "Destroy all Darts" +msgstr "" + +msgid "Destroy all Lynxes" +msgstr "" + +msgid "Disable all targets" +msgstr "" + +msgid "60 second battle" +msgstr "" + +msgid "Pass all Waypoints" +msgstr "" + +msgid "Defend Jumpgate" +msgstr "" + +msgid "Collect Packages" +msgstr "" + +msgid "Rescue Civilians" +msgstr "" + +msgid "Destroy INF Klondike and INF Canfield" +msgstr "" + diff --git a/src/battle/ai.c b/src/battle/ai.c index 074f221..2fc03d9 100644 --- a/src/battle/ai.c +++ b/src/battle/ai.c @@ -65,7 +65,7 @@ void doAI(void) if ((self->aiFlags & AIF_GOAL_JUMPGATE) && nearJumpgate()) { - /* near jumpgate point, but you might decide to continue to fight, anyway */ + /* near jumpgate, but you might decide to continue to fight, anyway */ if ((self->aiFlags & AIF_COVERS_RETREAT) && rand() % 3) { return; @@ -607,7 +607,7 @@ static void moveToPlayer(void) { if (fabs(player->dx) >= 1 && fabs(player->dy) >= 1) { - wantedAngle = getAngle(player->x, player->y, player->x + (player->dx * 100), player->y + (player->dy * 100)); + wantedAngle = getAngle(player->x, player->y, player->x + (player->dx * 1000), player->y + (player->dy * 1000)); turnToFace(wantedAngle); @@ -805,7 +805,7 @@ static void moveToLeader(void) { if (fabs(self->leader->dx) >= 1 && fabs(self->leader->dy) >= 1) { - wantedAngle = getAngle(self->leader->x, self->leader->y, self->leader->x + (self->leader->dx * 10), self->leader->y + (self->leader->dy * 10)); + wantedAngle = getAngle(self->leader->x, self->leader->y, self->leader->x + (self->leader->dx * 1000), self->leader->y + (self->leader->dy * 1000)); turnToFace(wantedAngle); diff --git a/src/battle/battle.c b/src/battle/battle.c index 71c2cc8..040f395 100644 --- a/src/battle/battle.c +++ b/src/battle/battle.c @@ -47,6 +47,7 @@ void initBattle(void) battle.effectTail = &battle.effectHead; battle.objectiveTail = &battle.objectiveHead; battle.locationTail = &battle.locationHead; + battle.spawnerTail = &battle.spawnerHead; app.delegate.logic = &logic; app.delegate.draw = &draw; @@ -151,6 +152,8 @@ static void doBattle(void) if (player != NULL) { + doSpawners(); + doLocations(); doMessageBox(); @@ -161,7 +164,7 @@ static void doBattle(void) if (battle.stats[STAT_TIME]++ % FPS == 0) { - runScriptTimeFunctions(); + runScriptFunction("TIME %d", battle.stats[STAT_TIME] / FPS); } } } @@ -388,6 +391,7 @@ void destroyBattle(void) Effect *e; Objective *o; Location *l; + Spawner *s; while (battle.entityHead.next) { @@ -436,6 +440,14 @@ void destroyBattle(void) free(l); } battle.locationTail = &battle.locationHead; + + while (battle.spawnerHead.next) + { + s = battle.spawnerHead.next; + battle.spawnerHead.next = s->next; + free(s); + } + battle.spawnerTail = &battle.spawnerHead; cJSON_Delete(battle.missionJSON); diff --git a/src/battle/battle.h b/src/battle/battle.h index b744dff..96bfbb6 100644 --- a/src/battle/battle.h +++ b/src/battle/battle.h @@ -83,7 +83,8 @@ extern void destroyEffects(void); extern void initChallengeHome(void); extern void updateAccuracyStats(unsigned int *stats); extern void clearInput(void); -extern void runScriptTimeFunctions(void); +extern void runScriptFunction(const char *format, ...); +extern void doSpawners(void); extern void awardPostMissionTrophies(void); extern App app; diff --git a/src/battle/bullets.c b/src/battle/bullets.c index 6c3648b..ebe7008 100644 --- a/src/battle/bullets.c +++ b/src/battle/bullets.c @@ -203,7 +203,7 @@ static void checkCollisions(Bullet *b) } /* assuming that health <= 0 will always mean killed */ - if (e->health <= 0 && b->owner == player) + if (e->health <= 0 && b->owner == player && (!(e->flags & EF_NO_KILL_INC))) { battle.stats[STAT_ENEMIES_KILLED_PLAYER]++; battle.stats[STAT_EPIC_KILL_STREAK]++; diff --git a/src/battle/bullets.h b/src/battle/bullets.h index e859ad6..34327d0 100644 --- a/src/battle/bullets.h +++ b/src/battle/bullets.h @@ -43,6 +43,7 @@ extern void drawText(int x, int y, int size, int align, SDL_Color c, const char extern void playSound(int id); extern char *getTranslatedString(char *string); extern void *resize(void *array, int oldSize, int newSize); +extern void awardTrophy(char *id); extern Battle battle; extern Colors colors; diff --git a/src/battle/capitalShips.c b/src/battle/capitalShips.c index 12f0aed..aa3b981 100644 --- a/src/battle/capitalShips.c +++ b/src/battle/capitalShips.c @@ -297,13 +297,15 @@ static void die(void) self->alive = ALIVE_DEAD; - addDebris(self->x, self->y, 50); + addLargeExplosion(); + + addDebris(self->x, self->y, 12); for (e = battle.entityHead.next ; e != NULL ; e = e->next) { if (e->owner == self) { - e->health = 0; + e->alive = ALIVE_DEAD; } } @@ -562,6 +564,93 @@ void updateCapitalShipComponentProperties(Entity *parent) } } +void loadCapitalShips(cJSON *node) +{ + Entity *e; + char **types, *name, *groupName, *type; + int side, scatter, number, active; + int i, numTypes, addFlags; + long flags; + float x, y; + + if (node) + { + node = node->child; + + while (node) + { + name = NULL; + groupName = NULL; + flags = -1; + + types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &numTypes); + side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); + x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; + y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; + name = getJSONValueStr(node, "name", NULL); + groupName = getJSONValueStr(node, "groupName", NULL); + number = getJSONValue(node, "number", 1); + scatter = getJSONValue(node, "scatter", 1); + active = getJSONValue(node, "active", 1); + + if (cJSON_GetObjectItem(node, "flags")) + { + flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); + } + + for (i = 0 ; i < number ; i++) + { + type = types[rand() % numTypes]; + + e = spawnCapitalShip(type, x, y, side); + + if (scatter > 1) + { + e->x += (rand() % scatter) - (rand() % scatter); + e->y += (rand() % scatter) - (rand() % scatter); + } + + e->active = active; + + if (name) + { + STRNCPY(e->name, name, MAX_NAME_LENGTH); + } + + if (groupName) + { + STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); + } + + if (flags != -1) + { + if (addFlags) + { + e->flags |= flags; + } + else + { + e->flags = flags; + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); + } + } + + updateCapitalShipComponentProperties(e); + } + + node = node->next; + + for (i = 0 ; i < numTypes ; i++) + { + free(types[i]); + } + + free(types); + } + } +} + void destroyCapitalShipDefs(void) { Entity *e; diff --git a/src/battle/capitalShips.h b/src/battle/capitalShips.h index 88fd79a..a40c954 100644 --- a/src/battle/capitalShips.h +++ b/src/battle/capitalShips.h @@ -47,7 +47,10 @@ extern void runScriptFunction(char *format, ...); extern void updateObjective(char *name, int type); extern char **getFileList(char *dir, int *count); extern int getJSONValue(cJSON *node, char *name, int defValue); +extern char *getJSONValueStr(cJSON *node, char *name, char *defValue); extern char *getTranslatedString(char *string); +extern void addLargeExplosion(void); +extern char **toTypeArray(char *types, int *numTypes); extern Battle battle; extern Entity *self; diff --git a/src/battle/effects.c b/src/battle/effects.c index 8c67054..8b71890 100644 --- a/src/battle/effects.c +++ b/src/battle/effects.c @@ -284,6 +284,40 @@ void addSmallExplosion(void) } } +void addLargeExplosion(void) +{ + int i; + Effect *e; + + for (i = 0 ; i < 64 ; i++) + { + e = malloc(sizeof(Effect)); + memset(e, 0, sizeof(Effect)); + battle.effectTail->next = e; + battle.effectTail = e; + + e->type = EFFECT_TEXTURE; + + e->x = self->x + rand() % 255 - rand() % 255; + e->y = self->y + rand() % 255 - rand() % 255; + e->dx = (rand() % 25) - (rand() % 25); + e->dx *= 0.01; + e->dy = (rand() % 25) - (rand() % 25); + e->dy *= 0.01; + e->texture = explosionTexture; + e->size = 128 + (rand() % 512); + e->r = 255; + + setRandomFlameHue(e); + + e->a = 128 + (rand() % 128); + e->health = e->a; + + e->x -= e->size / 2; + e->y -= e->size / 2; + } +} + void addMissileExplosion(Bullet *b) { int i; @@ -458,8 +492,9 @@ void addShieldSplinterEffect(Entity *ent) e->dx *= 0.1; e->dy = rand() % 64 - rand() % 64; e->dy *= 0.1; - e->a = 255; + + e->health = e->a; setRandomShieldHue(e); } diff --git a/src/battle/entities.c b/src/battle/entities.c index 914bdb5..3a163c2 100644 --- a/src/battle/entities.c +++ b/src/battle/entities.c @@ -63,6 +63,7 @@ void doEntities(void) { int numAllies, numEnemies; int numActiveAllies, numActiveEnemies; + int numSpawnedEnemies; Entity *e, *prev; prev = &battle.entityHead; @@ -217,6 +218,11 @@ void doEntities(void) if (e->health > 0 && e->active) { numActiveEnemies++; + + if (e->spawned) + { + numSpawnedEnemies++; + } } } } @@ -229,6 +235,8 @@ void doEntities(void) if (battle.isEpic && battle.stats[STAT_TIME] % FPS == 0) { + numActiveEnemies -= numSpawnedEnemies; + if (numAllies > battle.epicFighterLimit) { activateEpicFighters(battle.epicFighterLimit - numActiveAllies, SIDE_ALLIES); @@ -557,7 +565,10 @@ void addAllEntsToQuadtree(void) for (e = battle.entityHead.next ; e != NULL ; e = e->next) { - addToQuadtree(e, &battle.quadtree); + if (e->active) + { + addToQuadtree(e, &battle.quadtree); + } } } diff --git a/src/battle/fighters.c b/src/battle/fighters.c index 9d91703..e1e219b 100644 --- a/src/battle/fighters.c +++ b/src/battle/fighters.c @@ -25,6 +25,7 @@ static void die(void); static void immediateDie(void); static void spinDie(void); static void straightDie(void); +static void simpleDie(void); static void randomizeDart(Entity *dart); static void randomizeDartGuns(Entity *dart); static void loadFighterDef(char *filename); @@ -99,42 +100,6 @@ Entity *spawnFighter(char *name, int x, int y, int side) return e; } -void spawnScriptFighter(char *fighterTypes, char *sideStr, int num, char *location) -{ - Entity *e; - int i, numTypes, side, offscreen; - char **types, *type; - - types = toTypeArray(fighterTypes, &numTypes); - side = lookup(sideStr); - offscreen = strcmp(location, "OFFSCREEN") == 0; - - for (i = 0 ; i < num ; i++) - { - type = types[rand() % numTypes]; - - e = spawnFighter(type, 0, 0, side); - - if (offscreen) - { - e->x = player->x; - e->y = player->y; - } - else - { - e->x = rand() % 2 ? 0 : BATTLE_AREA_WIDTH; - e->y = rand() % 2 ? 0 : BATTLE_AREA_HEIGHT; - } - - e->x += (rand() % 2) ? -SCREEN_WIDTH : SCREEN_WIDTH; - e->y += (rand() % 2) ? -SCREEN_HEIGHT : SCREEN_HEIGHT; - - e->aiFlags |= AIF_UNLIMITED_RANGE; - } - - free(types); -} - static void randomizeDart(Entity *dart) { char texture[MAX_DESCRIPTION_LENGTH]; @@ -327,9 +292,12 @@ void doFighter(void) { if (self->side != SIDE_ALLIES) { - battle.stats[STAT_ENEMIES_KILLED]++; + if (!(self->flags & EF_NO_KILL_INC)) + { + battle.stats[STAT_ENEMIES_KILLED]++; - runScriptFunction("ENEMIES_KILLED %d", battle.stats[STAT_ENEMIES_KILLED]); + runScriptFunction("ENEMIES_KILLED %d", battle.stats[STAT_ENEMIES_KILLED]); + } } else { @@ -534,6 +502,9 @@ static void die(void) case DT_INSTANT: n = 2; break; + case DT_SIMPLE: + n = 3; + break; } if (self == player && battle.isEpic) @@ -546,14 +517,15 @@ static void die(void) case 0: self->action = spinDie; break; - case 1: self->action = straightDie; break; - case 2: self->action = immediateDie; break; + case 3: + self->action = simpleDie; + break; } } @@ -611,6 +583,13 @@ static void straightDie(void) } } +static void simpleDie(void) +{ + self->alive = ALIVE_DEAD; + addSmallExplosion(); + playBattleSound(SND_EXPLOSION_1 + rand() % 4, self->x, self->y); +} + void retreatEnemies(void) { Entity *e; @@ -715,10 +694,10 @@ static void loadFighterDef(char *filename) STRNCPY(e->name, cJSON_GetObjectItem(root, "name")->valuestring, MAX_NAME_LENGTH); STRNCPY(e->defName, e->name, MAX_NAME_LENGTH); e->health = e->maxHealth = cJSON_GetObjectItem(root, "health")->valueint; - e->shield = e->maxShield = cJSON_GetObjectItem(root, "shield")->valueint; + e->shield = e->maxShield = getJSONValue(root, "shield", 0); e->speed = cJSON_GetObjectItem(root, "speed")->valuedouble; - e->reloadTime = cJSON_GetObjectItem(root, "reloadTime")->valueint; - e->shieldRechargeRate = cJSON_GetObjectItem(root, "shieldRechargeRate")->valueint; + e->reloadTime = getJSONValue(root, "reloadTime", 0); + e->shieldRechargeRate = getJSONValue(root, "shieldRechargeRate", 0); e->texture = getTexture(cJSON_GetObjectItem(root, "texture")->valuestring); SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); @@ -778,6 +757,111 @@ static void loadFighterDef(char *filename) free(text); } +void loadFighters(cJSON *node) +{ + Entity *e; + char **types, *name, *groupName, *type; + int side, scatter, number, active; + int i, numTypes, addFlags, addAIFlags; + long flags, aiFlags; + float x, y; + + if (node) + { + node = node->child; + + while (node) + { + name = NULL; + groupName = NULL; + flags = -1; + aiFlags = -1; + + types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &numTypes); + side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); + x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; + y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; + name = getJSONValueStr(node, "name", NULL); + groupName = getJSONValueStr(node, "groupName", NULL); + number = getJSONValue(node, "number", 1); + scatter = getJSONValue(node, "scatter", 1); + active = getJSONValue(node, "active", 1); + + if (cJSON_GetObjectItem(node, "flags")) + { + flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); + } + + if (cJSON_GetObjectItem(node, "aiFlags")) + { + aiFlags = flagsToLong(cJSON_GetObjectItem(node, "aiFlags")->valuestring, &addAIFlags); + } + + for (i = 0 ; i < number ; i++) + { + type = types[rand() % numTypes]; + + e = spawnFighter(type, x, y, side); + + if (scatter > 1) + { + e->x += (rand() % scatter) - (rand() % scatter); + e->y += (rand() % scatter) - (rand() % scatter); + } + + e->active = active; + + if (flags != -1) + { + if (addFlags) + { + e->flags |= flags; + } + else + { + e->flags = flags; + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); + } + } + + if (aiFlags != -1) + { + if (addAIFlags) + { + e->aiFlags |= aiFlags; + } + else + { + e->aiFlags = aiFlags; + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "AI Flags for '%s' (%s) replaced", e->name, e->defName); + } + } + + if (name) + { + STRNCPY(e->name, name, MAX_NAME_LENGTH); + } + + if (groupName) + { + STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); + } + } + + node = node->next; + + for (i = 0 ; i < numTypes ; i++) + { + free(types[i]); + } + + free(types); + } + } +} + void destroyFighterDefs(void) { Entity *e; diff --git a/src/battle/fighters.h b/src/battle/fighters.h index c6394d5..c263834 100644 --- a/src/battle/fighters.h +++ b/src/battle/fighters.h @@ -48,6 +48,8 @@ extern char **getFileList(char *dir, int *count); extern char *getTranslatedString(char *string); extern int getJSONValue(cJSON *node, char *name, int defValue); extern char **toTypeArray(char *types, int *numTypes); +extern char *getJSONValueStr(cJSON *node, char *name, char *defValue); +extern void awardTrophy(char *id); extern App app; extern Battle battle; diff --git a/src/battle/items.c b/src/battle/items.c index 1d9931e..fdec377 100644 --- a/src/battle/items.c +++ b/src/battle/items.c @@ -127,6 +127,86 @@ static void action(void) } } +void loadItems(cJSON *node) +{ + Entity *e; + char *name, *groupName, *type; + int i, scatter, number, active, addFlags; + long flags; + float x, y; + + flags = -1; + scatter = 1; + + if (node) + { + node = node->child; + + while (node) + { + type = cJSON_GetObjectItem(node, "type")->valuestring; + x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; + y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; + name = NULL; + groupName = NULL; + + name = getJSONValueStr(node, "name", NULL); + groupName = getJSONValueStr(node, "groupName", NULL); + number = getJSONValue(node, "number", 1); + scatter = getJSONValue(node, "scatter", 1); + active = getJSONValue(node, "active", 1); + + if (cJSON_GetObjectItem(node, "flags")) + { + flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); + } + + for (i = 0 ; i < number ; i++) + { + e = spawnItem(type); + + if (name) + { + STRNCPY(e->name, name, MAX_NAME_LENGTH); + } + + if (groupName) + { + STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); + } + + if (flags != -1) + { + if (addFlags) + { + e->flags |= flags; + } + else + { + e->flags = flags; + + SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); + } + } + + e->x = x; + e->y = y; + e->active = active; + + if (scatter > 1) + { + e->x += (rand() % scatter) - (rand() % scatter); + e->y += (rand() % scatter) - (rand() % scatter); + } + + SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); + } + + node = node->next; + } + } +} + void destroyItemDefs(void) { Entity *e; diff --git a/src/battle/items.h b/src/battle/items.h index bc1c79e..5d54998 100644 --- a/src/battle/items.h +++ b/src/battle/items.h @@ -31,6 +31,9 @@ extern void playBattleSound(int id, int x, int y); extern void addHudMessage(SDL_Color c, char *format, ...); extern void updateObjective(char *name, int type); extern char *getTranslatedString(char *string); +extern int getJSONValue(cJSON *node, char *name, int defValue); +extern char *getJSONValueStr(cJSON *node, char *name, char *defValue); +extern long flagsToLong(char *flags, int *add); extern Battle battle; extern Entity *self; diff --git a/src/battle/locations.c b/src/battle/locations.c index 5636371..c01d0c9 100644 --- a/src/battle/locations.c +++ b/src/battle/locations.c @@ -74,3 +74,34 @@ void activateLocations(char *locations) token = strtok(NULL, ";"); } } + +void loadLocations(cJSON *node) +{ + int active; + Location *l; + + if (node) + { + node = node->child; + + while (node) + { + l = malloc(sizeof(Location)); + memset(l, 0, sizeof(Location)); + battle.locationTail->next = l; + battle.locationTail = l; + + STRNCPY(l->name, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); + l->x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; + l->y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; + l->size = cJSON_GetObjectItem(node, "size")->valueint; + l->active = active = getJSONValue(node, "active", 1); + + l->x += (SCREEN_WIDTH / 2); + l->y += (SCREEN_HEIGHT / 2); + + + node = node->next; + } + } +} diff --git a/src/battle/locations.h b/src/battle/locations.h index f20b58b..38b6a00 100644 --- a/src/battle/locations.h +++ b/src/battle/locations.h @@ -20,9 +20,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "../common.h" +#include "../json/cJSON.h" + extern Battle battle; extern Entity *player; extern int getDistance(int x1, int y1, int x2, int y2); extern void runScriptFunction(char *format, ...); extern void drawCircle(int cx, int cy, int radius, int r, int g, int b, int a); +extern int getJSONValue(cJSON *node, char *name, int defValue); diff --git a/src/battle/missionInfo.c b/src/battle/missionInfo.c index 62970a9..6fa8e90 100644 --- a/src/battle/missionInfo.c +++ b/src/battle/missionInfo.c @@ -142,7 +142,7 @@ static void drawObjectives(void) } drawText(SCREEN_WIDTH / 2 - 100, y, 22, TA_RIGHT, colors.white, o->description); - if (o->targetValue > 1 && !o->isCondition) + if (o->targetValue > 1 && !o->isCondition && !o->hideNumbers) { drawText(SCREEN_WIDTH / 2, y, 22, TA_CENTER, colors.white, "%d / %d", o->currentValue, o->targetValue); } diff --git a/src/battle/objectives.c b/src/battle/objectives.c index c3d57a5..122b7e0 100644 --- a/src/battle/objectives.c +++ b/src/battle/objectives.c @@ -88,13 +88,16 @@ void updateObjective(char *name, int type) { o->currentValue++; - if (o->targetValue - o->currentValue <= 10) + if (!o->hideNumbers) { - addHudMessage(colors.cyan, "%s - %d / %d", o->description, o->currentValue, o->targetValue); - } - else if (o->currentValue % 10 == 0) - { - addHudMessage(colors.cyan, "%s - %d / %d", o->description, o->currentValue, o->targetValue); + if (o->targetValue - o->currentValue <= 10) + { + addHudMessage(colors.cyan, "%s - %d / %d", o->description, o->currentValue, o->targetValue); + } + else if (o->currentValue % 10 == 0) + { + addHudMessage(colors.cyan, "%s - %d / %d", o->description, o->currentValue, o->targetValue); + } } if (o->currentValue == o->targetValue) @@ -205,7 +208,7 @@ void activateObjectives(char *objectives) { for (o = battle.objectiveHead.next ; o != NULL ; o = o->next) { - if (strcmp(token, o->description) == 0) + if (strcmp(token, o->id) == 0) { addHudMessage(colors.cyan, _("New Objective : %s"), o->description); o->active = 1; @@ -220,3 +223,38 @@ void activateObjectives(char *objectives) token = strtok(NULL, ";"); } } + +void loadObjectives(cJSON *node) +{ + Objective *o; + + if (node) + { + node = node->child; + + while (node) + { + o = malloc(sizeof(Objective)); + memset(o, 0, sizeof(Objective)); + battle.objectiveTail->next = o; + battle.objectiveTail = o; + + STRNCPY(o->id, cJSON_GetObjectItem(node, "description")->valuestring, MAX_DESCRIPTION_LENGTH); + STRNCPY(o->description, _(cJSON_GetObjectItem(node, "description")->valuestring), MAX_DESCRIPTION_LENGTH); + STRNCPY(o->targetName, cJSON_GetObjectItem(node, "targetName")->valuestring, MAX_NAME_LENGTH); + o->targetValue = cJSON_GetObjectItem(node, "targetValue")->valueint; + o->targetType = lookup(cJSON_GetObjectItem(node, "targetType")->valuestring); + o->active = getJSONValue(node, "active", 1); + o->isCondition = getJSONValue(node, "isCondition", 0); + o->isEliminateAll = getJSONValue(node, "isEliminateAll", 0); + o->hideNumbers = getJSONValue(node, "hideNumbers", 0); + + if (o->isEliminateAll) + { + o->targetValue = 1; + } + + node = node->next; + } + } +} diff --git a/src/battle/objectives.h b/src/battle/objectives.h index c7c5579..5d75820 100644 --- a/src/battle/objectives.h +++ b/src/battle/objectives.h @@ -19,12 +19,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "../common.h" +#include "../json/cJSON.h" extern void addHudMessage(SDL_Color c, char *format, ...); extern void runScriptFunction(char *format, ...); extern void completeMission(void); extern void failMission(void); extern char *getTranslatedString(char *string); +extern int getJSONValue(cJSON *node, char *name, int defValue); +extern long lookup(char *name); extern Battle battle; extern Colors colors; diff --git a/src/battle/player.c b/src/battle/player.c index ff8262b..a47e192 100644 --- a/src/battle/player.c +++ b/src/battle/player.c @@ -362,27 +362,27 @@ void initPlayerSelect(void) void doPlayerSelect(void) { - if (app.keyboard[SDL_SCANCODE_A] || app.mouse.button[SDL_BUTTON_X1]) + if (isControl(CONTROL_PREV_FIGHTER)) { selectNewPlayer(-1); - app.mouse.button[SDL_BUTTON_X1] = app.keyboard[SDL_SCANCODE_A] = 0; + clearControl(CONTROL_PREV_FIGHTER); } - if (app.keyboard[SDL_SCANCODE_D] || app.mouse.button[SDL_BUTTON_X2]) + if (isControl(CONTROL_NEXT_FIGHTER)) { selectNewPlayer(1); - app.mouse.button[SDL_BUTTON_X2] = app.keyboard[SDL_SCANCODE_D] = 0; + clearControl(CONTROL_NEXT_FIGHTER); } - if (player->health > 0 && app.mouse.button[SDL_BUTTON_LEFT]) + if (player->health > 0 && isAcceptControl()) { battle.playerSelect = 0; initPlayer(); - app.mouse.button[SDL_BUTTON_LEFT] = 0; + resetAcceptControls(); } } @@ -591,3 +591,32 @@ int playerHasGun(int type) { return availableGuns[type]; } + +void loadPlayer(cJSON *node) +{ + char *type; + int side; + + type = cJSON_GetObjectItem(node, "type")->valuestring; + side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); + + player = spawnFighter(type, 0, 0, side); + player->x = BATTLE_AREA_WIDTH / 2; + player->y = BATTLE_AREA_HEIGHT / 2; + + if (cJSON_GetObjectItem(node, "x")) + { + player->x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; + player->y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; + } + + if (strcmp(type, "Tug") == 0) + { + battle.stats[STAT_TUG]++; + } + + if (strcmp(type, "Shuttle") == 0) + { + battle.stats[STAT_SHUTTLE]++; + } +} diff --git a/src/battle/player.h b/src/battle/player.h index 15d6dc4..ace2b8c 100644 --- a/src/battle/player.h +++ b/src/battle/player.h @@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "../common.h" +#include "../json/cJSON.h" #define MAX_SELECTABLE_PLAYERS 8 #define MAX_SELECTABLE_TARGETS 8 @@ -39,6 +40,10 @@ extern char *getTranslatedString(char *string); extern void addECMEffect(Entity *ent); extern int isControl(int type); extern void clearControl(int type); +extern long lookup(char *name); +extern Entity *spawnFighter(char *name, int x, int y, int side); +extern int isAcceptControl(void); +extern void resetAcceptControls(void); extern App app; extern Battle battle; diff --git a/src/battle/script.c b/src/battle/script.c index 929422b..e7c8a67 100644 --- a/src/battle/script.c +++ b/src/battle/script.c @@ -218,6 +218,11 @@ static void executeNextLine(ScriptRunner *runner) { activateNextWaypoint(0); } + else if (strcmp(command, "ACTIVATE_SPAWNERS") == 0) + { + sscanf(line, "%*s %[^;] %d", strParam[0], &intParam[0]); + activateSpawner(strParam[0], intParam[0]); + } else if (strcmp(command, "MSG_BOX") == 0) { sscanf(line, "%*s %255[^;]%*c%255[^\n]", strParam[0], strParam[1]); @@ -256,11 +261,6 @@ static void executeNextLine(ScriptRunner *runner) battle.isEpic = 0; retreatEnemies(); } - else if (strcmp(command, "SPAWN_FIGHTERS") == 0) - { - sscanf(line, "%*s %s %s %d %s", strParam[0], strParam[1], &intParam[0], strParam[2]); - spawnScriptFighter(strParam[0], strParam[1], intParam[0], strParam[2]); - } else { printf("ERROR: Unrecognised script command '%s'\n", command); diff --git a/src/battle/script.h b/src/battle/script.h index b2c98c1..7fb5f4c 100644 --- a/src/battle/script.h +++ b/src/battle/script.h @@ -34,9 +34,9 @@ extern void activateLocations(char *locations); void activateObjectives(char *objectives); extern int showingMessageBoxes(void); extern char *getTranslatedString(char *string); -extern void spawnScriptFighter(char *fighters, char *side, int num, char *location); extern void activateNextWaypoint(int id); extern void activateJumpgate(int activate); +extern void activateSpawner(char *name, int active); extern Battle battle; extern Colors colors; diff --git a/src/battle/spawners.c b/src/battle/spawners.c new file mode 100644 index 0000000..fda46dd --- /dev/null +++ b/src/battle/spawners.c @@ -0,0 +1,128 @@ +/* +Copyright (C) 2015-2016 Parallel Realities + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#include "spawners.h" + +void doSpawners(void) +{ + Entity *e; + Spawner *s; + char *type; + int i, num; + + for (s = battle.spawnerHead.next ; s != NULL ; s = s->next) + { + if (s->active && --s->time <= 0) + { + num = s->step; + + if (s->total != -1) + { + num = MIN(s->step, s->total); + + s->total -= num; + } + + if (s->side != SIDE_ALLIES) + { + battle.numInitialEnemies += num; + } + + for (i = 0 ; i < num ; i++) + { + type = s->types[rand() % s->numTypes]; + + e = spawnFighter(type, 0, 0, s->side); + + e->spawned = 1; + + if (s->offscreen) + { + e->x = player->x; + e->y = player->y; + } + else + { + e->x = rand() % 2 ? 0 : BATTLE_AREA_WIDTH; + e->y = rand() % 2 ? 0 : BATTLE_AREA_HEIGHT; + } + + e->x += (rand() % 2) ? -SCREEN_WIDTH : SCREEN_WIDTH; + e->y += (rand() % 2) ? -SCREEN_HEIGHT : SCREEN_HEIGHT; + + e->aiFlags |= AIF_UNLIMITED_RANGE; + } + + s->time = s->interval; + } + } +} + +void activateSpawner(char *names, int active) +{ + Spawner *s; + char *name; + + name = strtok(names, ";"); + + while (name) + { + for (s = battle.spawnerHead.next ; s != NULL ; s = s->next) + { + if (strcmp(s->name, name) == 0) + { + s->active = active; + } + } + + name = strtok(NULL, ";"); + } +} + +void loadSpawners(cJSON *node) +{ + int active; + Spawner *s; + + if (node) + { + node = node->child; + + while (node) + { + s = malloc(sizeof(Spawner)); + memset(s, 0, sizeof(Spawner)); + battle.spawnerTail->next = s; + battle.spawnerTail = s; + + STRNCPY(s->name, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); + s->types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &s->numTypes); + s->side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); + s->interval = cJSON_GetObjectItem(node, "interval")->valueint * FPS; + s->limit = getJSONValue(node, "limit", 0); + s->total = getJSONValue(node, "total", 0); + s->step = cJSON_GetObjectItem(node, "step")->valueint; + s->offscreen = getJSONValue(node, "offscreen", 0); + s->active = active = getJSONValue(node, "active", 1); + + node = node->next; + } + } +} diff --git a/src/battle/spawners.h b/src/battle/spawners.h new file mode 100644 index 0000000..cead7c8 --- /dev/null +++ b/src/battle/spawners.h @@ -0,0 +1,31 @@ +/* +Copyright (C) 2015-2016 Parallel Realities + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#include "../common.h" + +#include "../json/cJSON.h" + +extern long lookup(char *name); +extern Entity *spawnFighter(char *name, int x, int y, int side); +extern int getJSONValue(cJSON *node, char *name, int defValue); +extern char **toTypeArray(char *types, int *numTypes); + +extern Battle battle; +extern Entity *player; diff --git a/src/challenges/challenges.c b/src/challenges/challenges.c index 27082ad..fcedc30 100644 --- a/src/challenges/challenges.c +++ b/src/challenges/challenges.c @@ -109,7 +109,7 @@ static int challengeFinished(void) } /* disabled enemies count as killed during challenges - not player exclusive, but no need to worry about AI contributions here */ - if (game.currentMission->challengeData.killLimit > 0 && (battle.stats[STAT_ENEMIES_KILLED_PLAYER] + battle.stats[STAT_ENEMIES_DISABLED]) >= game.currentMission->challengeData.killLimit) + if (game.currentMission->challengeData.killLimit > 0 && (battle.stats[STAT_ENEMIES_KILLED_PLAYER] + battle.stats[STAT_CAPITAL_SHIPS_DESTROYED] + battle.stats[STAT_ENEMIES_DISABLED]) >= game.currentMission->challengeData.killLimit) { return 1; } diff --git a/src/defs.h b/src/defs.h index 2feb4bd..76884b2 100644 --- a/src/defs.h +++ b/src/defs.h @@ -96,6 +96,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define EF_AI_TARGET (2 << 13) #define EF_AI_LEADER (2 << 14) #define EF_ROPED_ATTACHED (2 << 15) +#define EF_NO_KILL_INC (2 << 16) #define AIF_NONE 0 #define AIF_FOLLOWS_PLAYER (2 << 0) @@ -198,7 +199,8 @@ enum { DT_ANY, DT_NO_SPIN, - DT_INSTANT + DT_INSTANT, + DT_SIMPLE }; enum diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index 69700eb..4da86a0 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -20,13 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "mission.h" -static void loadObjectives(cJSON *node); -static void loadPlayer(cJSON *node); -static void loadFighters(cJSON *node); -static void loadCapitalShips(cJSON *node); static void loadEntities(cJSON *node); -static void loadItems(cJSON *node); -static void loadLocations(cJSON *node); static unsigned long hashcode(const char *str); static void loadEpicData(cJSON *node); static char *getAutoBackground(char *filename); @@ -160,6 +154,8 @@ void loadMission(char *filename) loadItems(cJSON_GetObjectItem(root, "items")); loadLocations(cJSON_GetObjectItem(root, "locations")); + + loadSpawners(cJSON_GetObjectItem(root, "spawners")); if (cJSON_GetObjectItem(root, "epic")) { @@ -311,260 +307,6 @@ void failMission(void) } } -static void loadObjectives(cJSON *node) -{ - Objective *o; - - if (node) - { - node = node->child; - - while (node) - { - o = malloc(sizeof(Objective)); - memset(o, 0, sizeof(Objective)); - battle.objectiveTail->next = o; - battle.objectiveTail = o; - - STRNCPY(o->description, _(cJSON_GetObjectItem(node, "description")->valuestring), MAX_DESCRIPTION_LENGTH); - STRNCPY(o->targetName, cJSON_GetObjectItem(node, "targetName")->valuestring, MAX_NAME_LENGTH); - o->targetValue = cJSON_GetObjectItem(node, "targetValue")->valueint; - o->targetType = lookup(cJSON_GetObjectItem(node, "targetType")->valuestring); - o->active = getJSONValue(node, "active", 1); - o->isCondition = getJSONValue(node, "isCondition", 0); - - o->isEliminateAll = getJSONValue(node, "isEliminateAll", 0); - if (o->isEliminateAll) - { - o->targetValue = 1; - } - - node = node->next; - } - } -} - -static void loadPlayer(cJSON *node) -{ - char *type; - int side; - - type = cJSON_GetObjectItem(node, "type")->valuestring; - side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); - - player = spawnFighter(type, 0, 0, side); - player->x = BATTLE_AREA_WIDTH / 2; - player->y = BATTLE_AREA_HEIGHT / 2; - - if (cJSON_GetObjectItem(node, "x")) - { - player->x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; - player->y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; - } - - if (strcmp(type, "Tug") == 0) - { - battle.stats[STAT_TUG]++; - } - - if (strcmp(type, "Shuttle") == 0) - { - battle.stats[STAT_SHUTTLE]++; - } -} - -static void loadFighters(cJSON *node) -{ - Entity *e; - char **types, *name, *groupName, *type; - int side, scatter, number, active; - int i, numTypes, addFlags, addAIFlags; - long flags, aiFlags; - float x, y; - - if (node) - { - node = node->child; - - while (node) - { - name = NULL; - groupName = NULL; - flags = -1; - aiFlags = -1; - - types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &numTypes); - side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); - x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; - y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; - name = getJSONValueStr(node, "name", NULL); - groupName = getJSONValueStr(node, "groupName", NULL); - number = getJSONValue(node, "number", 1); - scatter = getJSONValue(node, "scatter", 1); - active = getJSONValue(node, "active", 1); - - if (cJSON_GetObjectItem(node, "flags")) - { - flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); - } - - if (cJSON_GetObjectItem(node, "aiFlags")) - { - aiFlags = flagsToLong(cJSON_GetObjectItem(node, "aiFlags")->valuestring, &addAIFlags); - } - - for (i = 0 ; i < number ; i++) - { - type = types[rand() % numTypes]; - - e = spawnFighter(type, x, y, side); - - if (scatter > 1) - { - e->x += (rand() % scatter) - (rand() % scatter); - e->y += (rand() % scatter) - (rand() % scatter); - } - - e->active = active; - - if (flags != -1) - { - if (addFlags) - { - e->flags |= flags; - } - else - { - e->flags = flags; - - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); - } - } - - if (aiFlags != -1) - { - if (addAIFlags) - { - e->aiFlags |= aiFlags; - } - else - { - e->aiFlags = aiFlags; - - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "AI Flags for '%s' (%s) replaced", e->name, e->defName); - } - } - - if (name) - { - STRNCPY(e->name, name, MAX_NAME_LENGTH); - } - - if (groupName) - { - STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); - } - } - - node = node->next; - - for (i = 0 ; i < numTypes ; i++) - { - free(types[i]); - } - - free(types); - } - } -} - -static void loadCapitalShips(cJSON *node) -{ - Entity *e; - char **types, *name, *groupName, *type; - int side, scatter, number, active; - int i, numTypes, addFlags; - long flags; - float x, y; - - if (node) - { - node = node->child; - - while (node) - { - name = NULL; - groupName = NULL; - flags = -1; - - types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &numTypes); - side = lookup(cJSON_GetObjectItem(node, "side")->valuestring); - x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; - y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; - name = getJSONValueStr(node, "name", NULL); - groupName = getJSONValueStr(node, "groupName", NULL); - number = getJSONValue(node, "number", 1); - scatter = getJSONValue(node, "scatter", 1); - active = getJSONValue(node, "active", 1); - - if (cJSON_GetObjectItem(node, "flags")) - { - flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); - } - - for (i = 0 ; i < number ; i++) - { - type = types[rand() % numTypes]; - - e = spawnCapitalShip(type, x, y, side); - - if (scatter > 1) - { - e->x += (rand() % scatter) - (rand() % scatter); - e->y += (rand() % scatter) - (rand() % scatter); - } - - e->active = active; - - if (name) - { - STRNCPY(e->name, name, MAX_NAME_LENGTH); - } - - if (groupName) - { - STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); - } - - if (flags != -1) - { - if (addFlags) - { - e->flags |= flags; - } - else - { - e->flags = flags; - - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); - } - } - - updateCapitalShipComponentProperties(e); - } - - node = node->next; - - for (i = 0 ; i < numTypes ; i++) - { - free(types[i]); - } - - free(types); - } - } -} - static void loadEntities(cJSON *node) { Entity *e; @@ -585,6 +327,7 @@ static void loadEntities(cJSON *node) y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; name = NULL; groupName = NULL; + flags = -1; name = getJSONValueStr(node, "name", NULL); groupName = getJSONValueStr(node, "groupName", NULL); @@ -658,119 +401,6 @@ static void loadEntities(cJSON *node) } } -static void loadItems(cJSON *node) -{ - Entity *e; - char *name, *groupName, *type; - int i, scatter, number, active, addFlags; - long flags; - float x, y; - - flags = -1; - scatter = 1; - - if (node) - { - node = node->child; - - while (node) - { - type = cJSON_GetObjectItem(node, "type")->valuestring; - x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; - y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; - name = NULL; - groupName = NULL; - - name = getJSONValueStr(node, "name", NULL); - groupName = getJSONValueStr(node, "groupName", NULL); - number = getJSONValue(node, "number", 1); - scatter = getJSONValue(node, "scatter", 1); - active = getJSONValue(node, "active", 1); - - if (cJSON_GetObjectItem(node, "flags")) - { - flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring, &addFlags); - } - - for (i = 0 ; i < number ; i++) - { - e = spawnItem(type); - - if (name) - { - STRNCPY(e->name, name, MAX_NAME_LENGTH); - } - - if (groupName) - { - STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); - } - - if (flags != -1) - { - if (addFlags) - { - e->flags |= flags; - } - else - { - e->flags = flags; - - SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "Flags for '%s' (%s) replaced", e->name, e->defName); - } - } - - e->x = x; - e->y = y; - e->active = active; - - if (scatter > 1) - { - e->x += (rand() % scatter) - (rand() % scatter); - e->y += (rand() % scatter) - (rand() % scatter); - } - - SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); - } - - node = node->next; - } - } -} - -static void loadLocations(cJSON *node) -{ - int active; - Location *l; - - if (node) - { - node = node->child; - - while (node) - { - l = malloc(sizeof(Location)); - memset(l, 0, sizeof(Location)); - battle.locationTail->next = l; - battle.locationTail = l; - - STRNCPY(l->name, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); - l->x = (cJSON_GetObjectItem(node, "x")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_WIDTH; - l->y = (cJSON_GetObjectItem(node, "y")->valuedouble / BATTLE_AREA_CELLS) * BATTLE_AREA_HEIGHT; - - l->size = cJSON_GetObjectItem(node, "size")->valueint; - - active = getJSONValue(node, "active", 1); - - l->x += (SCREEN_WIDTH / 2); - l->y += (SCREEN_HEIGHT / 2); - l->active = active; - - node = node->next; - } - } -} - static void loadEpicData(cJSON *node) { Entity *e; @@ -830,7 +460,7 @@ void updateAllMissions(void) int isMissionAvailable(Mission *mission, Mission *prev) { - return prev->completed && mission->requires <= game.completedMissions; + return (prev->completed && mission->requires <= game.completedMissions) || dev.debug; } static unsigned long hashcode(const char *str) diff --git a/src/galaxy/mission.h b/src/galaxy/mission.h index c6a8647..420bafd 100644 --- a/src/galaxy/mission.h +++ b/src/galaxy/mission.h @@ -26,8 +26,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern long lookup(char *name); extern char *readFile(char *filename); extern SDL_Texture *getTexture(char *filename); -extern Entity *spawnFighter(char *name, int x, int y, int side); -extern Entity *spawnCapitalShip(char *name, int x, int y, int side); extern void startSectionTransition(void); extern void endSectionTransition(void); extern void playMusic(char *filename); @@ -37,12 +35,10 @@ extern long flagsToLong(char *flags, int *add); extern Entity *spawnWaypoint(void); extern void selectWidget(const char *name, const char *group); extern Entity *spawnJumpgate(void); -extern Entity *spawnItem(char *type); extern void failIncompleteObjectives(void); extern void completeConditions(void); extern void retreatEnemies(void); extern void initScript(cJSON *missionJSON); -extern void updateCapitalShipComponentProperties(Entity *parent); extern void countNumEnemies(void); extern void initMissionInfo(void); extern char *getTranslatedString(char *string); @@ -54,8 +50,15 @@ extern char *getMusicFilename(int n); extern int getJSONValue(cJSON *node, char *name, int defValue); extern char *getJSONValueStr(cJSON *node, char *name, char *defValue); extern void addAllEntsToQuadtree(void); -extern char **toTypeArray(char *types, int *numTypes); +extern void loadObjectives(cJSON *node); +extern void loadPlayer(cJSON *node); +extern void loadCapitalShips(cJSON *node); +extern void loadFighters(cJSON *node); +extern void loadItems(cJSON *node); +extern void loadLocations(cJSON *node); +extern void loadSpawners(cJSON *node); extern Battle battle; +extern Dev dev; extern Entity *player; extern Game game; diff --git a/src/game/trophies.c b/src/game/trophies.c index 43befcd..e8ea045 100644 --- a/src/game/trophies.c +++ b/src/game/trophies.c @@ -246,7 +246,7 @@ void awardPostMissionTrophies(void) static void awardCraftTrophy(void) { char trophyId[MAX_NAME_LENGTH]; - int len; + int len, i; memset(trophyId, '\0', MAX_NAME_LENGTH); diff --git a/src/main.c b/src/main.c index 6617833..19bbf79 100644 --- a/src/main.c +++ b/src/main.c @@ -29,7 +29,7 @@ int main(int argc, char *argv[]) long expireTextTimer; SDL_Event event; - SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN); + SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); memset(&app, 0, sizeof(App)); memset(&dev, 0, sizeof(Dev)); diff --git a/src/structs.h b/src/structs.h index bf62ed5..f3cbbe2 100644 --- a/src/structs.h +++ b/src/structs.h @@ -26,6 +26,7 @@ typedef struct Entity Entity; typedef struct Bullet Bullet; typedef struct Debris Debris; typedef struct Effect Effect; +typedef struct Spawner Spawner; typedef struct Objective Objective; typedef struct StarSystem StarSystem; typedef struct Challenge Challenge; @@ -99,6 +100,7 @@ struct Entity { char defName[MAX_NAME_LENGTH]; char groupName[MAX_NAME_LENGTH]; int active; + int spawned; int id; int side; float x; @@ -225,6 +227,7 @@ struct Location { struct Objective { int active; + char id[MAX_DESCRIPTION_LENGTH]; char description[MAX_DESCRIPTION_LENGTH]; char targetName[MAX_NAME_LENGTH]; int targetType; @@ -233,6 +236,7 @@ struct Objective { int status; int isCondition; int isEliminateAll; + int hideNumbers; Objective *next; }; @@ -302,6 +306,21 @@ struct Quadtree { Quadtree *node[4]; }; +struct Spawner { + char name[MAX_NAME_LENGTH]; + char **types; + int numTypes; + int side; + int time; + int interval; + int limit; + int total; + int step; + int offscreen; + int active; + Spawner *next; +}; + typedef struct { int entId; SDL_Point camera; @@ -331,6 +350,7 @@ typedef struct { Effect effectHead, *effectTail; Objective objectiveHead, *objectiveTail; Location locationHead, *locationTail; + Spawner spawnerHead, *spawnerTail; struct cJSON *missionJSON; unsigned int stats[STAT_MAX]; Quadtree quadtree; diff --git a/src/system/controls.c b/src/system/controls.c index 1120e37..b4a150d 100644 --- a/src/system/controls.c +++ b/src/system/controls.c @@ -80,6 +80,11 @@ int isControl(int type) return ((key != -1 && app.keyboard[key]) || (btn != -1 && app.mouse.button[btn])); } +int isAcceptControl(void) +{ + return (app.keyboard[SDL_SCANCODE_SPACE] ||app.keyboard[SDL_SCANCODE_RETURN] || isControl(CONTROL_FIRE)); +} + void clearControl(int type) { int key = app.keyControls[type]; @@ -96,6 +101,13 @@ void clearControl(int type) } } +void resetAcceptControls(void) +{ + app.keyboard[SDL_SCANCODE_SPACE] = app.keyboard[SDL_SCANCODE_RETURN] = 0; + + clearControl(CONTROL_FIRE); +} + void updateControlKey(char *name) { app.keyControls[lookup(name)] = app.lastKeyPressed; diff --git a/src/system/lookup.c b/src/system/lookup.c index f205f21..35d86ae 100644 --- a/src/system/lookup.c +++ b/src/system/lookup.c @@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. static Lookup head; static Lookup *tail; -static void addLookup(char *name, long value); +static void addLookup(char *name, long value); void initLookups(void) { @@ -60,6 +60,7 @@ void initLookups(void) addLookup("EF_SECONDARY_TARGET", EF_SECONDARY_TARGET); addLookup("EF_AI_TARGET", EF_AI_TARGET); addLookup("EF_AI_LEADER", EF_AI_LEADER); + addLookup("EF_NO_KILL_INC", EF_NO_KILL_INC); addLookup("AIF_NONE", AIF_NONE); addLookup("AIF_MOVES_TO_PLAYER", AIF_MOVES_TO_PLAYER); @@ -81,6 +82,7 @@ void initLookups(void) addLookup("DT_ANY", DT_ANY); addLookup("DT_NO_SPIN", DT_NO_SPIN); addLookup("DT_INSTANT", DT_INSTANT); + addLookup("DT_SIMPLE", DT_SIMPLE); addLookup("TT_DESTROY", TT_DESTROY); addLookup("TT_DISABLE", TT_DISABLE); diff --git a/tools/updateI18N.sh b/tools/updateI18N.sh index 4d43b4b..5f895ca 100755 --- a/tools/updateI18N.sh +++ b/tools/updateI18N.sh @@ -109,6 +109,10 @@ function extractJSON($filename) } } } + else if (strpos($filename, "challenges") !== false) + { + addString($json->{"description"}); + } } function recurseDir($dir)