The following commit has been merged in the master branch:
commit 7434fe1f4a7c8e6fa8fe9169c3a5c2fe11016817
Author: Marco Amadori <[email protected]>
Date:   Mon Oct 26 01:02:26 2009 +0100

    Imported Upstream version 0.80.5.1

diff --git a/AI/SConscript b/AI/SConscript
index 311cb6b..e598118 100644
--- a/AI/SConscript
+++ b/AI/SConscript
@@ -781,7 +781,7 @@ for baseName in skirmishais_toBuild:
                                objs += skirmishAIObjsLegacyCPP
 
                if needCPP:
-                       buildList += wrapp_cppWrapper_cmd
+                       buildList += wrap_cppWrapper_cmd
                        myEnv.AppendUnique(CPPPATH = ['Wrappers'])
                        objs += skirmishAIObjsCpp
 
diff --git a/AI/Skirmish/AAI/data/AIOptions.lua 
b/AI/Skirmish/AAI/data/AIOptions.lua
index 52bb3fc..d435d62 100644
--- a/AI/Skirmish/AAI/data/AIOptions.lua
+++ b/AI/Skirmish/AAI/data/AIOptions.lua
@@ -1,37 +1,14 @@
 --
---  Custom Options Definition Table format
+-- Custom Options Definition Table format
 --
---  NOTES:
---  - using an enumerated table lets you specify the options order
---
---  These keywords must be lowercase for LuaParser to read them.
---
---  key:      the string used in the script.txt
---  name:     the displayed name
---  desc:     the description (could be used as a tooltip)
---  type:     the option type
---  def:      the default value;
---  min:      minimum value for number options
---  max:      maximum value for number options
---  step:     quantization step, aligned to the def value
---  maxlen:   the maximum string length for string options
---  items:    array of item strings for list options
---  scope:    'all', 'player', 'team', 'allyteam'      <<< not supported yet 
>>>
+-- A detailed example of how this format works can be found
+-- in the spring source under:
+-- AI/Skirmish/NullAI/data/AIOptions.lua
 --
 
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
 
 local options = {
-       {
-               key="difficulty",
-               name="AI Difficulty Level",
-               desc="1 means, the AI plays very poor, 5 means, it gives its 
best",
-               type   = 'number',
-               def    = 3,
-               min    = 1,
-               max    = 5,
-               step   = 1,
-       },
 }
 
 return options
diff --git a/AI/Skirmish/CppTestAI/data/AIOptions.lua 
b/AI/Skirmish/CppTestAI/data/AIOptions.lua
new file mode 100644
index 0000000..d435d62
--- /dev/null
+++ b/AI/Skirmish/CppTestAI/data/AIOptions.lua
@@ -0,0 +1,15 @@
+--
+-- Custom Options Definition Table format
+--
+-- A detailed example of how this format works can be found
+-- in the spring source under:
+-- AI/Skirmish/NullAI/data/AIOptions.lua
+--
+--------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
+
+local options = {
+}
+
+return options
+
diff --git a/AI/Skirmish/KAIK/Containers.cpp b/AI/Skirmish/KAIK/Containers.cpp
index 177412a..70e5780 100644
--- a/AI/Skirmish/KAIK/Containers.cpp
+++ b/AI/Skirmish/KAIK/Containers.cpp
@@ -45,7 +45,6 @@ CR_REG_METADATA(BuilderTracker, (
        CR_MEMBER(buildTaskId),
        CR_MEMBER(taskPlanId),
        CR_MEMBER(factoryId),
-       CR_MEMBER(customOrderId),
        CR_MEMBER(stuckCount),
        CR_MEMBER(idleStartFrame),
        CR_MEMBER(commandOrderPushFrame),
diff --git a/AI/Skirmish/KAIK/Containers.h b/AI/Skirmish/KAIK/Containers.h
index b960340..4dcafeb 100644
--- a/AI/Skirmish/KAIK/Containers.h
+++ b/AI/Skirmish/KAIK/Containers.h
@@ -118,8 +118,6 @@ struct BuilderTracker {
        int taskPlanId;
        // if not NULL then this worker belongs to this Factory.
        int factoryId;
-       // if not NULL then this worker is on reclaim job or something, not 
tracked until it gets idle
-       int customOrderId;
 
        // if not NULL then this worker is stuck or something
        int stuckCount;
diff --git a/AI/Skirmish/KAIK/DefenseMatrix.cpp 
b/AI/Skirmish/KAIK/DefenseMatrix.cpp
index 2d8138d..88a62cd 100644
--- a/AI/Skirmish/KAIK/DefenseMatrix.cpp
+++ b/AI/Skirmish/KAIK/DefenseMatrix.cpp
@@ -42,11 +42,13 @@ void CDefenseMatrix::Init() {
 }
 
 void CDefenseMatrix::MaskBadBuildSpot(float3 pos) {
-       int f3multiplier = 8 * THREATRES;
-       int x = (int) (pos.x / f3multiplier);
-       int y = (int) (pos.z / f3multiplier);
+       if (pos.IsInBounds()) {
+               const int f3multiplier = 8 * THREATRES;
+               const int x = (int) (pos.x / f3multiplier);
+               const int y = (int) (pos.z / f3multiplier);
 
-       BuildMaskArray[y * ai->pather->PathMapXSize + x] = 1;
+               BuildMaskArray[y * ai->pather->PathMapXSize + x] = 1;
+       }
 }
 
 float3 CDefenseMatrix::GetDefensePos(const UnitDef* def, float3 builderpos) {
diff --git a/AI/Skirmish/KAIK/UnitHandler.cpp b/AI/Skirmish/KAIK/UnitHandler.cpp
index 16f5b77..71c1dd2 100644
--- a/AI/Skirmish/KAIK/UnitHandler.cpp
+++ b/AI/Skirmish/KAIK/UnitHandler.cpp
@@ -146,7 +146,6 @@ void CUnitHandler::UnitCreated(int unitID) {
                        builderTracker->taskPlanId     = 0;
                        builderTracker->factoryId      = 0;
                        builderTracker->stuckCount     = 0;
-                       builderTracker->customOrderId  = 0;
                        // under construction
                        builderTracker->commandOrderPushFrame = -2;
                        builderTracker->categoryMaker = CAT_LAST;
@@ -278,7 +277,7 @@ bool CUnitHandler::VerifyOrder(BuilderTracker* 
builderTracker) {
        bool commandFound = false;
        bool hit = false;
 
-       if (mycommands->size() > 0) {
+       if (!mycommands->empty()) {
                // it has orders
                const Command* c = &mycommands->front();
 
@@ -328,16 +327,9 @@ bool CUnitHandler::VerifyOrder(BuilderTracker* 
builderTracker) {
                                return false;
                }
 
-               if (builderTracker->customOrderId != 0) {
-                       assert(!hit);
+               if (!commandFound) {
                        hit = true;
-                       // CMD_MOVE is for human control stuff, CMD_REPAIR is 
for repairs of just made stuff
-                       // CMD_GUARD... ?
-                       if (c->id == CMD_RECLAIM || c->id == CMD_MOVE || c->id 
== CMD_REPAIR)
-                               commandFound = true;
-                       else {
-                               return false;
-                       }
+                       commandFound = (c->id == CMD_RECLAIM || c->id == 
CMD_MOVE || c->id == CMD_REPAIR);
                }
 
                if (hit && commandFound) {
@@ -430,22 +422,9 @@ void CUnitHandler::ClearOrder(BuilderTracker* 
builderTracker, bool reportError)
                FactoryBuilderRemove(builderTracker);
        }
 
-       if (builderTracker->customOrderId != 0) {
-               assert(!hit);
-               hit = true;
-               // why is this builder idle?
-               // no tracking of custom orders yet
-               //SNPRINTF(logMsg, logMsg_maxSize,
-               //              "builder %i: was idle, but it is on 
customOrderId: %i (removing the builder from the job)",
-               //              unit, builderTracker->customOrderId);
-               //PRINTF("%s", logMsg);
-               builderTracker->customOrderId = 0;
-       }
-
        assert(builderTracker->buildTaskId == 0);
        assert(builderTracker->taskPlanId == 0);
        assert(builderTracker->factoryId == 0);
-       assert(builderTracker->customOrderId == 0);
 }
 
 
@@ -538,11 +517,7 @@ void CUnitHandler::DecodeOrder(BuilderTracker* 
builderTracker, bool reportError)
                                                hit = true;
                                                
FactoryBuilderRemove(builderTracker);
                                        }
-                                       if (builderTracker->customOrderId != 0) 
{
-                                               assert(!hit);
-                                               hit = true;
-                                               builderTracker->customOrderId = 
0;
-                                       }
+
                                        BuildTask* bt = &*i;
                                        BuildTaskAddBuilder(bt, builderTracker);
                                        found = true;
@@ -550,7 +525,6 @@ void CUnitHandler::DecodeOrder(BuilderTracker* 
builderTracker, bool reportError)
                        }
                        if (!found) {
                                // not found, just make a custom order
-                               builderTracker->customOrderId = 
taskPlanCounter++;
                                builderTracker->idleStartFrame = -1;
                        }
                }
@@ -738,9 +712,6 @@ void CUnitHandler::BuildTaskCreate(int id) {
                                                if (builderTracker->factoryId 
!= 0) {
                                                        
FactoryBuilderRemove(builderTracker);
                                                }
-                                               if 
(builderTracker->customOrderId != 0) {
-                                                       
builderTracker->customOrderId = 0;
-                                               }
 
                                                // this builder is now free
                                                if 
(builderTracker->idleStartFrame == -2) {
@@ -832,8 +803,7 @@ void CUnitHandler::BuildTaskRemove(BuilderTracker* 
builderTracker) {
        assert(builderTracker->buildTaskId != 0);
        assert(builderTracker->taskPlanId == 0);
        assert(builderTracker->factoryId == 0);
-       assert(builderTracker->customOrderId == 0);
-       // std::list<BuildTask>::iterator killtask;
+
        bool found = false;
        bool found2 = false;
 
@@ -877,7 +847,7 @@ void CUnitHandler::BuildTaskAddBuilder(BuildTask* 
buildTask, BuilderTracker* bui
        assert(builderTracker->buildTaskId == 0);
        assert(builderTracker->taskPlanId == 0);
        assert(builderTracker->factoryId == 0);
-       assert(builderTracker->customOrderId == 0);
+
        builderTracker->buildTaskId = buildTask->id;
 }
 
@@ -928,12 +898,11 @@ bool CUnitHandler::BuildTaskAddBuilder(int builderID, 
UnitCategory category) {
        const bool b1 = (builderTracker->taskPlanId == 0);
        const bool b2 = (builderTracker->buildTaskId == 0);
        const bool b3 = (builderTracker->factoryId == 0);
-       const bool b4 = (builderTracker->customOrderId == 0);
-       const bool b5 = builderDef->canAssist;
-       const bool b6 = (category == CAT_FACTORY && frame >= 18000);
+       const bool b4 = builderDef->canAssist;
+       const bool b5 = (category == CAT_FACTORY && frame >= 18000);
 
-       if (!b1 || !b2 || !b3 || !b4 || !b5) {
-               if (b6) {
+       if (!b1 || !b2 || !b3 || !b4) {
+               if (b5) {
                        // note that FactoryBuilderAdd() asserts b1 through b4
                        // immediately after BuildTaskAddBuilder() is tried and
                        // fails in BuildUp(), so at least those must be true
@@ -943,9 +912,10 @@ bool CUnitHandler::BuildTaskAddBuilder(int builderID, 
UnitCategory category) {
                                msg << "[CUnitHandler::BuildTaskAddBuilder()] 
frame " << frame << "\n";
                                msg << "\tbuilder " << builderID << " not able 
to be added to CAT_FACTORY build-task\n";
                                msg << "\tb1: " << b1 << ", b2: " << b2 << ", 
b3: " << b3;
-                               msg << ", b4: " << b4 << ", b5: " << b5 << ", 
b6: " << b6;
+                               msg << ", b4: " << b4 << ", b5: " << b5;
                        L(ai, msg.str());
                }
+
                return false;
        }
 
@@ -1006,7 +976,7 @@ bool CUnitHandler::BuildTaskAddBuilder(int builderID, 
UnitCategory category) {
                }
        }
 
-       if (b6) {
+       if (b5) {
                std::stringstream msg;
                        msg << "[CUnitHandler::BuildTaskAddBuilder()] frame " 
<< frame << "\n";
                        msg << "\tno joinable CAT_FACTORY build-tasks or 
task-plans for builder " << builderID;
@@ -1031,15 +1001,11 @@ void CUnitHandler::TaskPlanCreate(int builder, float3 
pos, const UnitDef* builtd
        BuilderTracker* builderTracker = GetBuilderTracker(builder);
 
        // make sure this builder is free
-       // KLOOTNOTE: no longer use assertions
-       // since new code for extractor upgrading
-       // (in CBuildUp) seems to trigger them?
        bool b1 = (builderTracker->taskPlanId == 0);
        bool b2 = (builderTracker->buildTaskId == 0);
        bool b3 = (builderTracker->factoryId == 0);
-       bool b4 = (builderTracker->customOrderId == 0);
 
-       if (!b1 || !b2 || !b3 || !b4) {
+       if (!b1 || !b2 || !b3) {
                return;
        }
 
@@ -1083,7 +1049,7 @@ void CUnitHandler::TaskPlanAdd(TaskPlan* taskPlan, 
BuilderTracker* builderTracke
        assert(builderTracker->buildTaskId == 0);
        assert(builderTracker->taskPlanId == 0);
        assert(builderTracker->factoryId == 0);
-       assert(builderTracker->customOrderId == 0);
+
        builderTracker->taskPlanId = taskPlan->id;
 }
 
@@ -1094,7 +1060,7 @@ void CUnitHandler::TaskPlanRemove(BuilderTracker* 
builderTracker) {
        assert(builderTracker->buildTaskId == 0);
        assert(builderTracker->taskPlanId != 0);
        assert(builderTracker->factoryId == 0);
-       assert(builderTracker->customOrderId == 0);
+
        builderTracker->taskPlanId = 0;
        int builder = builderTracker->builderID;
        bool found = false;
@@ -1285,7 +1251,6 @@ bool CUnitHandler::FactoryBuilderAdd(BuilderTracker* 
builderTracker) {
        assert(builderTracker->buildTaskId == 0);
        assert(builderTracker->taskPlanId == 0);
        assert(builderTracker->factoryId == 0);
-       assert(builderTracker->customOrderId == 0);
 
        for (std::list<Factory>::iterator i = Factories.begin(); i != 
Factories.end(); i++) {
                CUNIT* u = ai->MyUnits[i->id];
@@ -1328,7 +1293,7 @@ void CUnitHandler::FactoryBuilderRemove(BuilderTracker* 
builderTracker) {
        assert(builderTracker->buildTaskId == 0);
        assert(builderTracker->taskPlanId == 0);
        assert(builderTracker->factoryId != 0);
-       assert(builderTracker->customOrderId == 0);
+
        std::list<Factory>::iterator killfactory;
 
        for (std::list<Factory>::iterator i = Factories.begin(); i != 
Factories.end(); i++) {
@@ -1351,9 +1316,8 @@ void CUnitHandler::BuilderReclaimOrder(int builderId, 
const float3&) {
        assert(builderTracker->buildTaskId == 0);
        assert(builderTracker->taskPlanId == 0);
        assert(builderTracker->factoryId == 0);
-       assert(builderTracker->customOrderId == 0);
-       // Just use taskPlanCounter for the id.
-       builderTracker->customOrderId = taskPlanCounter++;
+
+       taskPlanCounter++;
 }
 
 
diff --git a/AI/Skirmish/KAIK/data/AIOptions.lua 
b/AI/Skirmish/KAIK/data/AIOptions.lua
index c9c1dac..d435d62 100644
--- a/AI/Skirmish/KAIK/data/AIOptions.lua
+++ b/AI/Skirmish/KAIK/data/AIOptions.lua
@@ -1,37 +1,15 @@
 --
---  Custom Options Definition Table format
+-- Custom Options Definition Table format
 --
---  NOTES:
---  - using an enumerated table lets you specify the options order
---
---  These keywords must be lowercase for LuaParser to read them.
---
---  key:      the string used in the script.txt
---  name:     the displayed name
---  desc:     the description (could be used as a tooltip)
---  type:     the option type
---  def:      the default value;
---  min:      minimum value for number options
---  max:      maximum value for number options
---  step:     quantization step, aligned to the def value
---  maxlen:   the maximum string length for string options
---  items:    array of item strings for list options
---  scope:    'all', 'player', 'team', 'allyteam'      <<< not supported yet 
>>>
+-- A detailed example of how this format works can be found
+-- in the spring source under:
+-- AI/Skirmish/NullAI/data/AIOptions.lua
 --
 
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
 
 local options = {
-       {
-               key="difficulty",
-               name="AI Difficulty Level",
-               desc="1 means, the AI plays very poor, 5 means, it gives its 
best",
-               type   = 'number',
-               def    = 3,
-               min    = 1,
-               max    = 5,
-               step   = 1,
-       },
 }
 
 return options
+
diff --git a/AI/Skirmish/NullAI/data/AIOptions.lua 
b/AI/Skirmish/NullAI/data/AIOptions.lua
new file mode 100644
index 0000000..8d5fb79
--- /dev/null
+++ b/AI/Skirmish/NullAI/data/AIOptions.lua
@@ -0,0 +1,123 @@
+--
+-- Example AIOptions.lua
+--
+--------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
+-- Custom Options Definition Table format
+--
+-- NOTES:
+-- - using an enumerated table lets you specify the options order
+--
+-- These keywords must be lowercase for LuaParser to read them.
+--
+-- key:      the string used in the script.txt
+-- name:     the displayed name
+-- desc:     the description (could be used as a tooltip)
+-- type:     the option type (bool|number|string|list|section)
+-- section:  can be used to group this option with others (optional)
+-- def:      the default value
+-- min:      minimum value for type=number options
+-- max:      maximum value for type=number options
+-- step:     quantization step, aligned to the def value
+-- maxlen:   the maximum string length for type=string options
+-- items:    array of item strings for type=list options
+-- scope:    'all', 'player', 'team', 'allyteam'      <<< not supported yet >>>
+--
+-- This is an example file, show-casting all the possibilities of this format.
+-- It contains one example for option types bool, string and list, and two
+-- for number and section.
+--
+--------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
+
+
+local options = {
+
+
+       { -- section
+               key    = 'cheats',
+               name   = 'Cheats',
+               desc   = 'Fine-Grained settings specifying which kind of cheats 
\nthe AI is allowed to use.',
+               type   = 'section',
+       },
+
+       { -- section
+               key    = 'performance',
+               name   = 'Performance Relevant Settings',
+               desc   = 'These settings may be relevant for both CPU usage and 
AI difficulty.',
+               type   = 'section',
+       },
+
+       { -- list
+               key     = 'aggressiveness',
+               name    = 'Level Of Aggressivity',
+               desc    = 'How aggressive the AI should act.\nkey: 
aggressiveness',
+               type    = 'list',
+               section = 'performance',
+               def     = 'normal',
+               items   = {
+                       {
+                               key  = 'deffensive',
+                               name = 'Deffensive',
+                               desc = 'The AI will hardly ever attack.',
+                       },
+                       { 
+                               key  = 'normal',
+                               name = 'Normal',
+                               desc = 'The AI will try to keep a balance 
between defensive and aggressive play styles.',
+                       },
+                       {
+                               key  = 'aggressive',
+                               name = 'Aggressive',
+                               desc = 'The AI will put most of its resources 
into building attack forces.',
+                       },
+               },
+       },
+
+       { -- number (decimal)
+               key     = 'maxgroupsize',
+               name    = 'Max Group Size',
+               desc    = 'Maximum number of units per group, which the AI 
tries to keep together.\nkey: maxgroupsize',
+               type    = 'number',
+               section = 'performance',
+               def     = 10,
+               min     = 2,
+               max     = 50,
+               step    = 1.0,
+       },
+
+       { -- number (float)
+               key     = 'resourcebonous',
+               name    = 'Resource Bonous',
+               desc    = 'The AI will get 1+[this-value] times as muhc 
resources as a normal player.\nkey: resourcebonous',
+               type    = 'number',
+               section = 'cheats',
+               def     = 0.0,
+               min     = 0.0,
+               max     = 20.0,
+               -- quantization is aligned to the def value
+               -- (step <= 0) -> there is no quantization
+               step    = 0.1,
+       },
+
+       { -- bool
+               key     = 'maphack',
+               name    = 'Map Hack',
+               desc    = 'Whether the AI can see everything on the map, 
always, or is bount to LOS & Radar usage.\nkey: maphack',
+               type    = 'bool',
+               section = 'cheats',
+               def     = false,
+       },
+
+       { -- string
+               key     = 'reporturl',
+               name    = 'Report URL',
+               desc    = 'Statistics and learning data will be sent ot this 
URL every 5 minutes.\nkey: reporturl',
+               type    = 'string',
+               def     = 'http://myAIStats.myDomain.com/statsReceiver.cgi',
+       },
+
+}
+
+return options
+
diff --git a/AI/Skirmish/NullJavaAI/data/AIOptions.lua 
b/AI/Skirmish/NullJavaAI/data/AIOptions.lua
index c9c1dac..d435d62 100644
--- a/AI/Skirmish/NullJavaAI/data/AIOptions.lua
+++ b/AI/Skirmish/NullJavaAI/data/AIOptions.lua
@@ -1,37 +1,15 @@
 --
---  Custom Options Definition Table format
+-- Custom Options Definition Table format
 --
---  NOTES:
---  - using an enumerated table lets you specify the options order
---
---  These keywords must be lowercase for LuaParser to read them.
---
---  key:      the string used in the script.txt
---  name:     the displayed name
---  desc:     the description (could be used as a tooltip)
---  type:     the option type
---  def:      the default value;
---  min:      minimum value for number options
---  max:      maximum value for number options
---  step:     quantization step, aligned to the def value
---  maxlen:   the maximum string length for string options
---  items:    array of item strings for list options
---  scope:    'all', 'player', 'team', 'allyteam'      <<< not supported yet 
>>>
+-- A detailed example of how this format works can be found
+-- in the spring source under:
+-- AI/Skirmish/NullAI/data/AIOptions.lua
 --
 
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
 
 local options = {
-       {
-               key="difficulty",
-               name="AI Difficulty Level",
-               desc="1 means, the AI plays very poor, 5 means, it gives its 
best",
-               type   = 'number',
-               def    = 3,
-               min    = 1,
-               max    = 5,
-               step   = 1,
-       },
 }
 
 return options
+
diff --git a/AI/Skirmish/NullLegacyCppAI/data/AIOptions.lua 
b/AI/Skirmish/NullLegacyCppAI/data/AIOptions.lua
index c9c1dac..d435d62 100644
--- a/AI/Skirmish/NullLegacyCppAI/data/AIOptions.lua
+++ b/AI/Skirmish/NullLegacyCppAI/data/AIOptions.lua
@@ -1,37 +1,15 @@
 --
---  Custom Options Definition Table format
+-- Custom Options Definition Table format
 --
---  NOTES:
---  - using an enumerated table lets you specify the options order
---
---  These keywords must be lowercase for LuaParser to read them.
---
---  key:      the string used in the script.txt
---  name:     the displayed name
---  desc:     the description (could be used as a tooltip)
---  type:     the option type
---  def:      the default value;
---  min:      minimum value for number options
---  max:      maximum value for number options
---  step:     quantization step, aligned to the def value
---  maxlen:   the maximum string length for string options
---  items:    array of item strings for list options
---  scope:    'all', 'player', 'team', 'allyteam'      <<< not supported yet 
>>>
+-- A detailed example of how this format works can be found
+-- in the spring source under:
+-- AI/Skirmish/NullAI/data/AIOptions.lua
 --
 
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
 
 local options = {
-       {
-               key="difficulty",
-               name="AI Difficulty Level",
-               desc="1 means, the AI plays very poor, 5 means, it gives its 
best",
-               type   = 'number',
-               def    = 3,
-               min    = 1,
-               max    = 5,
-               step   = 1,
-       },
 }
 
 return options
+
diff --git a/AI/Skirmish/NullOOJavaAI/data/AIOptions.lua 
b/AI/Skirmish/NullOOJavaAI/data/AIOptions.lua
index c9c1dac..d435d62 100644
--- a/AI/Skirmish/NullOOJavaAI/data/AIOptions.lua
+++ b/AI/Skirmish/NullOOJavaAI/data/AIOptions.lua
@@ -1,37 +1,15 @@
 --
---  Custom Options Definition Table format
+-- Custom Options Definition Table format
 --
---  NOTES:
---  - using an enumerated table lets you specify the options order
---
---  These keywords must be lowercase for LuaParser to read them.
---
---  key:      the string used in the script.txt
---  name:     the displayed name
---  desc:     the description (could be used as a tooltip)
---  type:     the option type
---  def:      the default value;
---  min:      minimum value for number options
---  max:      maximum value for number options
---  step:     quantization step, aligned to the def value
---  maxlen:   the maximum string length for string options
---  items:    array of item strings for list options
---  scope:    'all', 'player', 'team', 'allyteam'      <<< not supported yet 
>>>
+-- A detailed example of how this format works can be found
+-- in the spring source under:
+-- AI/Skirmish/NullAI/data/AIOptions.lua
 --
 
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
 
 local options = {
-       {
-               key="difficulty",
-               name="AI Difficulty Level",
-               desc="1 means, the AI plays very poor, 5 means, it gives its 
best",
-               type   = 'number',
-               def    = 3,
-               min    = 1,
-               max    = 5,
-               step   = 1,
-       },
 }
 
 return options
+
diff --git a/AI/Skirmish/RAI/data/AIOptions.lua 
b/AI/Skirmish/RAI/data/AIOptions.lua
index c9c1dac..d435d62 100644
--- a/AI/Skirmish/RAI/data/AIOptions.lua
+++ b/AI/Skirmish/RAI/data/AIOptions.lua
@@ -1,37 +1,15 @@
 --
---  Custom Options Definition Table format
+-- Custom Options Definition Table format
 --
---  NOTES:
---  - using an enumerated table lets you specify the options order
---
---  These keywords must be lowercase for LuaParser to read them.
---
---  key:      the string used in the script.txt
---  name:     the displayed name
---  desc:     the description (could be used as a tooltip)
---  type:     the option type
---  def:      the default value;
---  min:      minimum value for number options
---  max:      maximum value for number options
---  step:     quantization step, aligned to the def value
---  maxlen:   the maximum string length for string options
---  items:    array of item strings for list options
---  scope:    'all', 'player', 'team', 'allyteam'      <<< not supported yet 
>>>
+-- A detailed example of how this format works can be found
+-- in the spring source under:
+-- AI/Skirmish/NullAI/data/AIOptions.lua
 --
 
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
 
 local options = {
-       {
-               key="difficulty",
-               name="AI Difficulty Level",
-               desc="1 means, the AI plays very poor, 5 means, it gives its 
best",
-               type   = 'number',
-               def    = 3,
-               min    = 1,
-               max    = 5,
-               step   = 1,
-       },
 }
 
 return options
+
diff --git a/Documentation/changelog.txt b/Documentation/changelog.txt
index ffe3c3b..5b6e077 100644
--- a/Documentation/changelog.txt
+++ b/Documentation/changelog.txt
@@ -1,4 +1,10 @@
 Spring change log
+0.80.5.1:
+Bugfixes:
+ - fix a bug where empty network packets were spammed (eating bandwith and 
demo space)
+ - fix a possible desync in the pathfinder
+ - fix mouse jumping in windowed mode (windows)
+ - fixed crash in KAIK
 
 0.80.5:
 Bugfixes:
@@ -11,7 +17,7 @@ Bugfixes:
 Gui:
  - joystick support
  - some bugs resolved which could lead to crashes when using ogg samples or 
music
- - properly hande dds textures
+ - properly handle dds textures
  - fix some mouse-jumping in windows
 
 Sim:
diff --git a/rts/Game/Camera.cpp b/rts/Game/Camera.cpp
index c286ad8..0eab778 100644
--- a/rts/Game/Camera.cpp
+++ b/rts/Game/Camera.cpp
@@ -148,7 +148,10 @@ static bool CalculateInverse4x4(const double m[4][4], 
double inv[4][4])
 void CCamera::Update(bool freeze)
 {
        pos2 = pos;
-       up.UnsafeANormalize();
+       
+       up.x = 0.0f;
+       up.y = 1.0f;
+       up.z = 0.0f;
 
        right = forward.cross(up);
        right.UnsafeANormalize();
diff --git a/rts/Game/Camera.h b/rts/Game/Camera.h
index 38d0f25..f42ca61 100644
--- a/rts/Game/Camera.h
+++ b/rts/Game/Camera.h
@@ -24,13 +24,6 @@ public:
        void Roll(float rad);
        void Pitch(float rad);
 
-       void RestoreUp()
-       {
-               up.x = 0.0f;
-               up.y = 1.0f;
-               up.z = 0.0f;
-       };
-
        float3 pos;
        float3 pos2;            //use this for calculating orthodirections 
(might differ from pos when calcing shadows)
        float3 rot;                     //varning inte alltid uppdaterad
diff --git a/rts/Game/Camera/FPSController.cpp 
b/rts/Game/Camera/FPSController.cpp
index ce3d9ea..71d2054 100644
--- a/rts/Game/Camera/FPSController.cpp
+++ b/rts/Game/Camera/FPSController.cpp
@@ -39,7 +39,6 @@ void CFPSController::MouseMove(float3 move)
 {
        camera->rot.y -= mouseScale*move.x;
        camera->rot.x -= mouseScale*move.y*move.z;
-       camera->RestoreUp();
        if(camera->rot.x>PI*0.4999f)
                camera->rot.x=PI*0.4999f;
        if(camera->rot.x<-PI*0.4999f)
diff --git a/rts/Game/Camera/FreeController.cpp 
b/rts/Game/Camera/FreeController.cpp
index c009150..958601f 100644
--- a/rts/Game/Camera/FreeController.cpp
+++ b/rts/Game/Camera/FreeController.cpp
@@ -94,8 +94,6 @@ void CFreeController::SetTrackingInfo(const float3& target, 
float radius)
 
 void CFreeController::Update()
 {
-       camera->RestoreUp();
-
        if (!gu->active) {
                vel  = ZeroVector;
                avel = ZeroVector;
diff --git a/rts/Game/Camera/OverheadController.cpp 
b/rts/Game/Camera/OverheadController.cpp
index 1b97015..5e54a07 100644
--- a/rts/Game/Camera/OverheadController.cpp
+++ b/rts/Game/Camera/OverheadController.cpp
@@ -114,7 +114,6 @@ void COverheadController::MouseWheelMove(float move)
 
 void COverheadController::Update()
 {
-       camera->RestoreUp();
 }
 
 float3 COverheadController::GetPos()
diff --git a/rts/Game/Camera/RotOverheadController.cpp 
b/rts/Game/Camera/RotOverheadController.cpp
index af4ad01..92fb7da 100644
--- a/rts/Game/Camera/RotOverheadController.cpp
+++ b/rts/Game/Camera/RotOverheadController.cpp
@@ -61,7 +61,6 @@ void CRotOverheadController::MouseWheelMove(float move)
 
 void CRotOverheadController::Update()
 {
-       camera->RestoreUp();
 }
 
 float3 CRotOverheadController::GetPos()
diff --git a/rts/Game/Camera/SmoothController.cpp 
b/rts/Game/Camera/SmoothController.cpp
index b8bd6d7..83889e5 100644
--- a/rts/Game/Camera/SmoothController.cpp
+++ b/rts/Game/Camera/SmoothController.cpp
@@ -164,7 +164,6 @@ void SmoothController::MouseWheelMove(float move)
 
 void SmoothController::Update()
 {
-       camera->RestoreUp();
 }
 
 float3 SmoothController::GetPos()
diff --git a/rts/Game/Camera/TWController.cpp b/rts/Game/Camera/TWController.cpp
index 2632814..834d340 100644
--- a/rts/Game/Camera/TWController.cpp
+++ b/rts/Game/Camera/TWController.cpp
@@ -66,7 +66,6 @@ void CTWController::MouseWheelMove(float move)
 
 void CTWController::Update()
 {
-       camera->RestoreUp();
 }
 
 float3 CTWController::GetPos()
diff --git a/rts/Game/GameServer.cpp b/rts/Game/GameServer.cpp
index faa8afd..1c1d03a 100644
--- a/rts/Game/GameServer.cpp
+++ b/rts/Game/GameServer.cpp
@@ -706,8 +706,7 @@ void CGameServer::ProcessPacket(const unsigned playernum, 
boost::shared_ptr<cons
                case NETMSG_QUIT: {
                        Message(str(format(PlayerLeft) %players[a].GetType() 
%players[a].name %" normal quit"));
                        Broadcast(CBaseNetProtocol::Get().SendPlayerLeft(a, 1));
-                       players[a].myState = GameParticipant::DISCONNECTED;
-                       players[a].link.reset();
+                       players[a].Kill();
                        if (hostif)
                        {
                                hostif->SendPlayerLeft(a, 1);
@@ -1266,9 +1265,8 @@ void CGameServer::ServerReadNet()
                if (players[a].link->CheckTimeout())
                {
                        Message(str(format(PlayerLeft) %players[a].GetType() 
%players[a].name %" timeout")); //this must happen BEFORE the reset!
-                       players[a].myState = GameParticipant::DISCONNECTED;
-                       players[a].link.reset();
                        Broadcast(CBaseNetProtocol::Get().SendPlayerLeft(a, 0));
+                       players[a].Kill();
                        if (hostif)
                        {
                                hostif->SendPlayerLeft(a, 0);
diff --git a/rts/Game/GameVersion.cpp b/rts/Game/GameVersion.cpp
index f8fae13..041d0d0 100644
--- a/rts/Game/GameVersion.cpp
+++ b/rts/Game/GameVersion.cpp
@@ -16,7 +16,7 @@ namespace SpringVersion
        
 const char* const Major = "0.80";
 const char* const Minor = "5";
-const char* const Patchset = "0";
+const char* const Patchset = "1";
 const char* const Additional = "";
 
 /** Build date and time. */
diff --git a/rts/Game/SelectMenu.cpp b/rts/Game/SelectMenu.cpp
index 6e5735a..64a3ac7 100644
--- a/rts/Game/SelectMenu.cpp
+++ b/rts/Game/SelectMenu.cpp
@@ -306,15 +306,8 @@ bool SelectMenu::HandleEventSelf(const SDL_Event& ev)
                case SDL_KEYDOWN: {
                        if (ev.key.keysym.sym == SDLK_ESCAPE)
                        {
-                               if(keys[SDLK_LSHIFT])
-                               {
-                                       logOutput.Print("User exited");
-                                       globalQuit=true;
-                               }
-                               else
-                               {
-                                       logOutput.Print("Use shift-esc to 
quit");
-                               }
+                               logOutput.Print("User exited");
+                               globalQuit=true;
                        }
                        else if (ev.key.keysym.sym == SDLK_RETURN)
                        {
diff --git a/rts/Game/UI/MouseHandler.cpp b/rts/Game/UI/MouseHandler.cpp
index 58b23f6..6084d54 100644
--- a/rts/Game/UI/MouseHandler.cpp
+++ b/rts/Game/UI/MouseHandler.cpp
@@ -689,7 +689,6 @@ void CMouseHandler::ToggleState()
        if (locked) {
                locked = false;
                ShowMouse();
-               mouseInput->SetPos(int2(lastx, lasty)); //! workarounds a mouse 
jump caused by the combination of SDL_WM_GrabInput (done in wsdl) + 
SDL_ShowCursor
        } else {
                locked = true;
                HideMouse();
diff --git a/rts/Sim/Path/PathFinder.cpp b/rts/Sim/Path/PathFinder.cpp
index bbb5ae3..ee0bab1 100644
--- a/rts/Sim/Path/PathFinder.cpp
+++ b/rts/Sim/Path/PathFinder.cpp
@@ -686,7 +686,7 @@ void CPathFinder::InitHeatMap()
 {
        heatmap.resize(gs->mapx);
        for (int i = 0; i<gs->mapx; ++i) {
-               heatmap[i].resize(gs->mapy);
+               heatmap[i].resize(gs->mapy, HeatMapValue());
        }
        heatMapOffset = 0;
 }
diff --git a/rts/Sim/Path/PathFinder.h b/rts/Sim/Path/PathFinder.h
index 5f9449b..5e8cf03 100644
--- a/rts/Sim/Path/PathFinder.h
+++ b/rts/Sim/Path/PathFinder.h
@@ -216,6 +216,8 @@ private:
 
        // Heat mapping
        struct HeatMapValue {
+               HeatMapValue(): value(0), ownerId(0) {
+               }
                int value;
                int ownerId;
        };
diff --git a/rts/System/Net/UDPConnection.cpp b/rts/System/Net/UDPConnection.cpp
index 9417dbb..0740b05 100644
--- a/rts/System/Net/UDPConnection.cpp
+++ b/rts/System/Net/UDPConnection.cpp
@@ -47,12 +47,12 @@ public:
 
        unsigned Remaining() const
        {
-               return length - pos;
+               return length - std::min(pos, length);
        };
 private:
        const unsigned char* data;
        unsigned length;
-       size_t pos;
+       unsigned pos;
 };
 
 class Packer
@@ -87,10 +87,13 @@ Packet::Packet(const unsigned char* data, unsigned length)
        
        if (nakType > 0)
        {
-               naks.resize(nakType);
+               naks.reserve(nakType);
                for (int i = 0; i != nakType; ++i)
                {
-                       buf.Unpack(naks[i]);
+                       if (buf.Remaining() >= sizeof(naks[i]))
+                               buf.Unpack(naks[i]);
+                       else
+                               break;
                }
        }
 
@@ -515,7 +518,7 @@ void UDPConnection::SendIfNecessary(bool flushed)
                lastUnackResent = curTime;
        }
 
-       if (flushed || !newChunks.empty() || !resendRequested.empty() || nak < 
0 || lastSendTime + spring_msecs(200) < curTime)
+       if (flushed || !newChunks.empty() || !resendRequested.empty() || nak > 
0 || lastSendTime + spring_msecs(200) < curTime)
        {
                bool todo = true;
                while (todo)
diff --git a/rts/System/Net/UDPListener.cpp b/rts/System/Net/UDPListener.cpp
index fa1687c..63b4cb1 100644
--- a/rts/System/Net/UDPListener.cpp
+++ b/rts/System/Net/UDPListener.cpp
@@ -22,7 +22,6 @@
 #include "ProtocolDef.h"
 #include "UDPConnection.h"
 #include "Socket.h"
-#include "LogOutput.h"
 
 namespace netcode
 {
@@ -81,7 +80,7 @@ void UDPListener::Update()
                if (bytesReceived < Packet::headerSize)
                        continue;
 
-               Packet data(&buffer[0], buffer.size());
+               Packet data(&buffer[0], bytesReceived);
 
                bool processed = false;
                for (std::list< boost::weak_ptr<UDPConnection> >::iterator i = 
conn.begin(); i != conn.end(); ++i)
diff --git a/rts/System/Platform/Win/wsdl.cpp b/rts/System/Platform/Win/wsdl.cpp
index a4f3ad3..6983b37 100644
--- a/rts/System/Platform/Win/wsdl.cpp
+++ b/rts/System/Platform/Win/wsdl.cpp
@@ -285,10 +285,11 @@ LRESULT OnMouseButton(HWND hWnd, UINT uMsg, int client_x, 
int client_y, UINT fla
                                        oldMode = 
SDL_WM_GrabInput(SDL_GRAB_QUERY);
                                        saveMode = true;
                                }
-#ifndef DEBUG
+
+                               POINT pt;
+                               GetCursorPos(&pt); //! SDL_WM_GrabInput 
sometimes moves the cursor, so we have to reset it afterwards
                                SDL_WM_GrabInput(SDL_GRAB_ON);
-                               //SetCursorPos(screen_pt.x, screen_pt.y);
-#endif
+                               SetCursorPos(pt.x, pt.y);
                        }
                } else {
                        //! release after all up events received
@@ -296,8 +297,10 @@ LRESULT OnMouseButton(HWND hWnd, UINT uMsg, int client_x, 
int client_y, UINT fla
                        {
                                if (saveMode)
                                {
+                                       POINT pt;
+                                       GetCursorPos(&pt); //! SDL_WM_GrabInput 
sometimes moves the cursor, so we have to reset it afterwards
                                        SDL_WM_GrabInput(oldMode);
-                                       //SetCursorPos(screen_pt.x, 
screen_pt.y);
+                                       SetCursorPos(pt.x, pt.y);
                                        saveMode = false;
                                }
                                outstanding_press_events = 0;
diff --git a/rts/aGui/Window.cpp b/rts/aGui/Window.cpp
index d0a062d..f12a841 100644
--- a/rts/aGui/Window.cpp
+++ b/rts/aGui/Window.cpp
@@ -85,7 +85,10 @@ bool Window::HandleEventSelf(const SDL_Event& ev)
                }
                case SDL_KEYDOWN: {
                        if (ev.key.keysym.sym == SDLK_ESCAPE)
+                       {
                                WantClose();
+                               return true;
+                       }
                        break;
                }
        }
diff --git a/rts/build/scons/rts.py b/rts/build/scons/rts.py
index ae67c38..1c2b885 100644
--- a/rts/build/scons/rts.py
+++ b/rts/build/scons/rts.py
@@ -452,6 +452,8 @@ def generate(env):
                else:
                        print 'Precompiled header disabled'
 
+               spring_defines += ['_WIN32_WINNT=0x500']
+
                # gml library
                if env['gml']:
                        env.AppendUnique(CCFLAGS = 
['-mno-tls-direct-seg-refs'], CXXFLAGS = ['-mno-tls-direct-seg-refs'], 
LINKFLAGS = ['-mno-tls-direct-seg-refs'])             
diff --git a/rts/lib/liblobby/Connection.cpp b/rts/lib/liblobby/Connection.cpp
index 5af2732..d952eea 100644
--- a/rts/lib/liblobby/Connection.cpp
+++ b/rts/lib/liblobby/Connection.cpp
@@ -1,5 +1,5 @@
 #ifdef _MSC_VER
-#include "StdAfx.h"
+#include "lib/streflop/streflop_cond.h"
 #endif
 
 #include "Connection.h"
@@ -7,21 +7,23 @@
 #include <boost/asio.hpp>
 #include <boost/bind.hpp>
 
+
 #if BOOST_VERSION < 103600
 using namespace boost::system::posix_error;
 #else
 using namespace boost::system::errc;
 #endif
-
+using namespace boost::asio;
 boost::asio::io_service netservice;
 
-
 Connection::Connection() : sock(netservice)
 {
 }
 
 Connection::~Connection()
 {
+       sock.close();
+       netservice.poll();
 }
 
 void Connection::Connect(const std::string& server, int port)
@@ -36,12 +38,17 @@ void Connection::Connect(const std::string& server, int 
port)
                std::ostringstream portbuf;
                portbuf << port;
                ip::tcp::resolver::query query(server, portbuf.str());
-               ip::tcp::resolver::iterator iter = resolver.resolve(query);
+               ip::tcp::resolver::iterator iter = resolver.resolve(query, err);
+               if (err)
+               {
+                       DoneConnecting(false, err.message());
+                       return;
+               }
                tempAddr = iter->endpoint().address();
        }
 
        ip::tcp::endpoint serverep(tempAddr, port);
-       sock.async_connect(serverep, boost::bind(&Connection::ConnectCallback, 
this, _1));
+       sock.async_connect(serverep, boost::bind(&Connection::ConnectCallback, 
this, placeholders::error));
 }
 
 void Connection::SendData(const std::string& msg)
@@ -65,7 +72,7 @@ void Connection::ConnectCallback(const 
boost::system::error_code& error)
        if (!error)
        {
                DoneConnecting(true, "");
-               boost::asio::async_read_until(sock, incomeBuffer, "\n", 
boost::bind(&Connection::ReceiveCallback, this, _1, _2));
+               boost::asio::async_read_until(sock, incomeBuffer, "\n", 
boost::bind(&Connection::ReceiveCallback, this, placeholders::error, 
placeholders::bytes_transferred));
        }
        else
        {
@@ -88,7 +95,7 @@ void Connection::ReceiveCallback(const 
boost::system::error_code& error, size_t
        }
        else
        {
-               if (error.value() == connection_reset || error.value() == 
boost::asio::error::eof )
+               if (error.value() == connection_reset || error.value() == 
boost::asio::error::eof)
                {
                        sock.close();
                        Disconnected();
@@ -100,7 +107,7 @@ void Connection::ReceiveCallback(const 
boost::system::error_code& error, size_t
        }
        if (sock.is_open())
        {
-               boost::asio::async_read_until(sock, incomeBuffer, "\n", 
boost::bind(&Connection::ReceiveCallback, this, _1, _2));
+               boost::asio::async_read_until(sock, incomeBuffer, "\n", 
boost::bind(&Connection::ReceiveCallback, this, placeholders::error, 
placeholders::bytes_transferred));
        }
 }
 

-- 
advanced 3D real time strategy game engine

_______________________________________________
Pkg-games-commits mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/pkg-games-commits

Reply via email to