Merge from develop.

This commit is contained in:
Steve 2016-03-27 11:21:23 +01:00
parent 675d051011
commit e278374490
66 changed files with 1459 additions and 619 deletions

View File

@ -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

View File

@ -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
}

View File

@ -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
}

View File

@ -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"
}
]

View File

@ -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"
}
]
}

View File

@ -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"
}
]

View File

@ -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"
}
]

View File

@ -1,6 +1,6 @@
{
"name" : "Defend Jumpgate Point",
"description" : "Defend Jumpgate Point",
"name" : "Defend Jumpgate",
"description" : "Defend Jumpgate",
"background" : "AUTO",
"planet" : "AUTO",
"music" : "AUTO",

View File

@ -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
}
]
}

49
data/challenges/11.json Normal file
View File

@ -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
}
]
}

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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",

View File

@ -1,10 +1,8 @@
{
"name" : "Tug",
"health" : 50,
"shield" : 0,
"speed" : 1.85,
"reloadTime" : 10,
"shieldRechargeRate" : 0,
"texture" : "gfx/craft/tug.png",
"guns" : [
{

View File

@ -1,10 +1,8 @@
{
"name" : "CannonDart",
"health" : 15,
"shield" : 0,
"speed" : 2.1,
"reloadTime" : 24,
"shieldRechargeRate" : 0,
"texture" : "gfx/fighters/dart01.png",
"guns" : [
{

View File

@ -1,10 +1,8 @@
{
"name" : "Dart",
"health" : 15,
"shield" : 0,
"speed" : 2.1,
"reloadTime" : 24,
"shieldRechargeRate" : 0,
"texture" : "gfx/fighters/dart01.png",
"guns" : [
{

View File

@ -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"

View File

@ -1,10 +1,8 @@
{
"name" : "SimpleDart",
"health" : 15,
"shield" : 0,
"speed" : 2.1,
"reloadTime" : 24,
"shieldRechargeRate" : 0,
"texture" : "gfx/fighters/dart01.png",
"guns" : [
{

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -151,7 +151,8 @@
"name": "Clarke",
"side" : "SIDE_UNF",
"x": 398,
"y": 84
"y": 84,
"fallsToPandorans" : 1
},
{
"name": "Adetton",

View File

@ -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",

View File

@ -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"
]
}
]
}

View File

@ -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."
]
}
]
}

View File

@ -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."
]
}
]

View File

@ -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",

View File

@ -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",

View File

@ -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"

BIN
gfx/fighters/swarmer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -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 ""

View File

@ -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);

View File

@ -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)
{
@ -437,6 +441,14 @@ void destroyBattle(void)
}
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);
resetHud();

View File

@ -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;

View File

@ -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]++;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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,9 +492,10 @@ 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);
}
}

View File

@ -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);
@ -556,9 +564,12 @@ void addAllEntsToQuadtree(void)
Entity *e;
for (e = battle.entityHead.next ; e != NULL ; e = e->next)
{
if (e->active)
{
addToQuadtree(e, &battle.quadtree);
}
}
}
static int drawComparator(const void *a, const void *b)

View File

@ -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];
@ -326,11 +291,14 @@ void doFighter(void)
if (player->alive == ALIVE_ALIVE)
{
if (self->side != SIDE_ALLIES)
{
if (!(self->flags & EF_NO_KILL_INC))
{
battle.stats[STAT_ENEMIES_KILLED]++;
runScriptFunction("ENEMIES_KILLED %d", battle.stats[STAT_ENEMIES_KILLED]);
}
}
else
{
if (strcmp(self->name, "Civilian") == 0)
@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;
}
}
}

View File

@ -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);

View File

@ -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);
}

View File

@ -88,6 +88,8 @@ void updateObjective(char *name, int type)
{
o->currentValue++;
if (!o->hideNumbers)
{
if (o->targetValue - o->currentValue <= 10)
{
addHudMessage(colors.cyan, "%s - %d / %d", o->description, o->currentValue, o->targetValue);
@ -96,6 +98,7 @@ void updateObjective(char *name, int type)
{
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;
}
}
}

View File

@ -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;

View File

@ -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]++;
}
}

View File

@ -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;

View File

@ -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);

View File

@ -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;

128
src/battle/spawners.c Normal file
View File

@ -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;
}
}
}

31
src/battle/spawners.h Normal file
View File

@ -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;

View File

@ -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;
}

View File

@ -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

View File

@ -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);
@ -161,6 +155,8 @@ void loadMission(char *filename)
loadLocations(cJSON_GetObjectItem(root, "locations"));
loadSpawners(cJSON_GetObjectItem(root, "spawners"));
if (cJSON_GetObjectItem(root, "epic"))
{
loadEpicData(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)

View File

@ -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;

View File

@ -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);

View File

@ -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));

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -109,6 +109,10 @@ function extractJSON($filename)
}
}
}
else if (strpos($filename, "challenges") !== false)
{
addString($json->{"description"});
}
}
function recurseDir($dir)