summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDidier Raboud <odyx@debian.org>2013-06-09 19:01:36 +0200
committerDidier Raboud <odyx@debian.org>2013-06-09 19:01:36 +0200
commit1275a702cd9dfecf44affa9372578a0efed70346 (patch)
tree6fe240a3f315c599a1e009e93ea82c556ad56ebd
parente60a610f013f75c4ca54768b756348d6a37ae2d2 (diff)
parentb22d852b4c4aa89e0394397a703ecfa442b0a928 (diff)
downloadcolobot-1275a702cd9dfecf44affa9372578a0efed70346.tar.gz
colobot-1275a702cd9dfecf44affa9372578a0efed70346.tar.bz2
colobot-1275a702cd9dfecf44affa9372578a0efed70346.zip
New snapshot of dev branch (376-gb22d852)
-rw-r--r--CMakeLists.txt19
m---------data0
-rw-r--r--debian/changelog4
-rw-r--r--src/CBot/CBot.cpp60
-rw-r--r--src/CBot/CBot.h49
-rw-r--r--src/CBot/CBotAddExpr.cpp3
-rw-r--r--src/CBot/CBotClass.cpp40
-rw-r--r--src/CBot/CBotCompExpr.cpp2
-rw-r--r--src/CBot/CBotDll.h46
-rw-r--r--src/CBot/CBotFunction.cpp43
-rw-r--r--src/CBot/CBotIf.cpp4
-rw-r--r--src/CBot/CBotProgram.cpp48
-rw-r--r--src/CBot/CBotStack.cpp56
-rw-r--r--src/CBot/CBotString.cpp10
-rw-r--r--src/CBot/CBotToken.cpp8
-rw-r--r--src/CBot/CBotToken.h1
-rw-r--r--src/CBot/CBotTwoOpExpr.cpp15
-rw-r--r--src/CBot/CBotVar.cpp35
-rw-r--r--src/CBot/CBotWhile.cpp66
-rw-r--r--src/CBot/CMakeLists.txt1
-rw-r--r--src/CBot/ClassFILE.cpp6
-rw-r--r--src/CBot/StringFunctions.cpp7
-rw-r--r--src/CBot/idees.txt1
-rw-r--r--src/CBot/resource.h1
-rw-r--r--src/CMakeLists.txt5
-rw-r--r--src/app/README.txt1
-rw-r--r--src/app/app.cpp214
-rw-r--r--src/app/app.h68
-rw-r--r--src/app/main.cpp1
-rw-r--r--src/app/system.cpp9
-rw-r--r--src/app/system.h5
-rw-r--r--src/app/system_linux.cpp31
-rw-r--r--src/app/system_linux.h5
-rw-r--r--src/app/system_other.cpp1
-rw-r--r--src/app/system_other.h1
-rw-r--r--src/app/system_windows.cpp27
-rw-r--r--src/app/system_windows.h5
-rw-r--r--src/common/README.txt1
-rw-r--r--src/common/config.h.cmake1
-rw-r--r--src/common/event.h21
-rw-r--r--src/common/global.h3
-rw-r--r--src/common/image.cpp33
-rw-r--r--src/common/image.h4
-rw-r--r--src/common/iman.cpp1
-rw-r--r--src/common/iman.h1
-rw-r--r--src/common/ioutils.h1
-rw-r--r--src/common/key.h1
-rw-r--r--src/common/logger.cpp32
-rw-r--r--src/common/logger.h10
-rw-r--r--src/common/misc.h1
-rw-r--r--src/common/profile.cpp83
-rw-r--r--src/common/profile.h183
-rw-r--r--src/common/restext.cpp9
-rw-r--r--src/common/restext.h5
-rw-r--r--src/common/singleton.h1
-rw-r--r--src/common/stringutils.cpp1
-rw-r--r--src/common/stringutils.h1
-rw-r--r--src/desktop/.gitignore1
-rw-r--r--src/desktop/CMakeLists.txt111
-rw-r--r--src/desktop/colobot.desktop.in1
-rw-r--r--src/desktop/colobot.ini1
-rw-r--r--src/desktop/colobot.pod1
-rw-r--r--src/desktop/colobot.svg1
-rwxr-xr-xsrc/desktop/create_desktop_file.sh8
-rw-r--r--src/desktop/po/colobot-desktop.pot1
-rw-r--r--src/desktop/po4a.cfg1
-rw-r--r--src/graphics/README.txt1
-rw-r--r--src/graphics/core/README.txt3
-rw-r--r--src/graphics/core/color.cpp1
-rw-r--r--src/graphics/core/color.h9
-rw-r--r--src/graphics/core/device.h3
-rw-r--r--src/graphics/core/light.h1
-rw-r--r--src/graphics/core/material.h1
-rw-r--r--src/graphics/core/texture.h6
-rw-r--r--src/graphics/core/vertex.h1
-rw-r--r--src/graphics/d3d/README.txt1
-rw-r--r--src/graphics/engine/README.txt1
-rw-r--r--src/graphics/engine/camera.cpp1
-rw-r--r--src/graphics/engine/camera.h4
-rw-r--r--src/graphics/engine/cloud.cpp1
-rw-r--r--src/graphics/engine/cloud.h1
-rw-r--r--src/graphics/engine/engine.cpp91
-rw-r--r--src/graphics/engine/engine.h59
-rw-r--r--src/graphics/engine/lightman.cpp1
-rw-r--r--src/graphics/engine/lightman.h1
-rw-r--r--src/graphics/engine/lightning.cpp1
-rw-r--r--src/graphics/engine/lightning.h1
-rw-r--r--src/graphics/engine/modelfile.cpp1
-rw-r--r--src/graphics/engine/modelfile.h1
-rw-r--r--src/graphics/engine/modelmanager.cpp1
-rw-r--r--src/graphics/engine/modelmanager.h7
-rw-r--r--src/graphics/engine/particle.cpp7
-rw-r--r--src/graphics/engine/particle.h1
-rw-r--r--src/graphics/engine/planet.cpp1
-rw-r--r--src/graphics/engine/planet.h1
-rw-r--r--src/graphics/engine/pyro.cpp15
-rw-r--r--src/graphics/engine/pyro.h1
-rw-r--r--src/graphics/engine/terrain.cpp1
-rw-r--r--src/graphics/engine/terrain.h1
-rw-r--r--src/graphics/engine/test/CMakeLists.txt1
-rw-r--r--src/graphics/engine/test/modelfile_test.cpp1
-rw-r--r--src/graphics/engine/text.cpp123
-rw-r--r--src/graphics/engine/text.h32
-rw-r--r--src/graphics/engine/water.cpp1
-rw-r--r--src/graphics/engine/water.h1
-rw-r--r--src/graphics/opengl/README.txt1
-rw-r--r--src/graphics/opengl/gldevice.cpp31
-rw-r--r--src/graphics/opengl/gldevice.h3
-rw-r--r--src/math/README.txt1
-rw-r--r--src/math/all.h1
-rw-r--r--src/math/const.h1
-rw-r--r--src/math/func.h7
-rw-r--r--src/math/geometry.h1
-rw-r--r--src/math/intpoint.h1
-rw-r--r--src/math/matrix.h9
-rw-r--r--src/math/point.h16
-rw-r--r--src/math/vector.h19
-rw-r--r--src/object/README.txt1
-rw-r--r--src/object/auto/auto.cpp6
-rw-r--r--src/object/auto/auto.h6
-rw-r--r--src/object/auto/autobase.cpp3
-rw-r--r--src/object/auto/autoderrick.cpp1
-rw-r--r--src/object/auto/autodestroyer.cpp191
-rw-r--r--src/object/auto/autodestroyer.h4
-rw-r--r--src/object/auto/autoenergy.cpp1
-rw-r--r--src/object/auto/autofactory.cpp106
-rw-r--r--src/object/auto/autofactory.h8
-rw-r--r--src/object/auto/autoflag.cpp1
-rw-r--r--src/object/auto/autoinfo.cpp5
-rw-r--r--src/object/auto/autojostle.cpp6
-rw-r--r--src/object/auto/autojostle.h4
-rw-r--r--src/object/auto/autokid.cpp1
-rw-r--r--src/object/auto/autolabo.cpp98
-rw-r--r--src/object/auto/autolabo.h3
-rw-r--r--src/object/auto/automush.cpp1
-rw-r--r--src/object/auto/autonest.cpp1
-rw-r--r--src/object/auto/autonuclear.cpp1
-rw-r--r--src/object/auto/autopara.cpp1
-rw-r--r--src/object/auto/autoradar.cpp1
-rw-r--r--src/object/auto/autorepair.cpp13
-rw-r--r--src/object/auto/autorepair.h1
-rw-r--r--src/object/auto/autoresearch.cpp176
-rw-r--r--src/object/auto/autoresearch.h4
-rw-r--r--src/object/auto/autoroot.cpp1
-rw-r--r--src/object/auto/autosafe.cpp4
-rw-r--r--src/object/auto/autostation.cpp11
-rw-r--r--src/object/auto/autotower.cpp3
-rw-r--r--src/object/brain.cpp36
-rw-r--r--src/object/brain.h3
-rw-r--r--src/object/mainmovie.cpp1
-rw-r--r--src/object/motion/motionant.cpp5
-rw-r--r--src/object/motion/motionbee.cpp5
-rw-r--r--src/object/motion/motiondummy.cpp85
-rw-r--r--src/object/motion/motiondummy.h34
-rw-r--r--src/object/motion/motionhuman.cpp15
-rw-r--r--src/object/motion/motionmother.cpp3
-rw-r--r--src/object/motion/motionspider.cpp5
-rw-r--r--src/object/motion/motiontoto.cpp3
-rw-r--r--src/object/motion/motionvehicle.cpp6
-rw-r--r--src/object/motion/motionworm.cpp5
-rw-r--r--src/object/object.cpp20
-rw-r--r--src/object/object.h1
-rw-r--r--src/object/objman.cpp3
-rw-r--r--src/object/objman.h3
-rw-r--r--src/object/robotmain.cpp561
-rw-r--r--src/object/robotmain.h21
-rw-r--r--src/object/task/task.cpp1
-rw-r--r--src/object/task/task.h4
-rw-r--r--src/object/task/taskadvance.cpp1
-rw-r--r--src/object/task/taskbuild.cpp2
-rw-r--r--src/object/task/taskgoto.cpp20
-rw-r--r--src/object/task/taskmanager.cpp1
-rw-r--r--src/object/task/tasksearch.cpp6
-rw-r--r--src/object/task/taskshield.cpp2
-rw-r--r--src/object/task/tasktake.cpp1
-rw-r--r--src/object/task/taskturn.cpp1
-rw-r--r--src/object/task/taskwait.cpp1
-rw-r--r--src/physics/README.txt1
-rw-r--r--src/physics/physics.cpp7
-rw-r--r--src/physics/physics.h1
-rw-r--r--src/po/CMakeLists.txt1
-rw-r--r--src/po/colobot.pot1
-rw-r--r--src/po/de.po1
-rw-r--r--src/po/fr.po1
-rw-r--r--src/po/pl.po1
-rw-r--r--src/script/cbottoken.cpp36
-rw-r--r--src/script/cbottoken.h1
-rw-r--r--src/script/cmdtoken.cpp3
-rw-r--r--src/script/dd.cpp1
-rw-r--r--src/script/script.cpp916
-rw-r--r--src/script/script.h42
-rw-r--r--src/sound/README.txt1
-rw-r--r--src/sound/oalsound/alsound.cpp462
-rw-r--r--src/sound/oalsound/alsound.h146
-rw-r--r--src/sound/oalsound/buffer.cpp69
-rw-r--r--src/sound/oalsound/buffer.h48
-rw-r--r--src/sound/oalsound/channel.cpp264
-rw-r--r--src/sound/oalsound/channel.h152
-rw-r--r--src/sound/oalsound/check.h1
-rw-r--r--src/sound/sound.cpp191
-rw-r--r--src/sound/sound.h97
-rw-r--r--src/tools/CMakeLists.txt1
-rw-r--r--src/tools/README.txt1
-rw-r--r--src/tools/convert_model.cpp1
-rw-r--r--src/ui/README.txt1
-rw-r--r--src/ui/button.cpp1
-rw-r--r--src/ui/button.h1
-rw-r--r--src/ui/check.cpp1
-rw-r--r--src/ui/color.cpp1
-rw-r--r--src/ui/color.h1
-rw-r--r--src/ui/compass.cpp1
-rw-r--r--src/ui/compass.h1
-rw-r--r--src/ui/control.cpp17
-rw-r--r--src/ui/control.h1
-rw-r--r--src/ui/displayinfo.cpp11
-rw-r--r--src/ui/displayinfo.h1
-rw-r--r--src/ui/displaytext.cpp1
-rw-r--r--src/ui/edit.cpp118
-rw-r--r--src/ui/edit.h3
-rw-r--r--src/ui/editvalue.cpp1
-rw-r--r--src/ui/editvalue.h1
-rw-r--r--src/ui/gauge.cpp1
-rw-r--r--src/ui/gauge.h23
-rw-r--r--src/ui/group.cpp1
-rw-r--r--src/ui/group.h1
-rw-r--r--src/ui/image.cpp1
-rw-r--r--src/ui/image.h1
-rw-r--r--src/ui/interface.cpp30
-rw-r--r--src/ui/interface.h83
-rw-r--r--src/ui/key.cpp1
-rw-r--r--src/ui/label.cpp4
-rw-r--r--src/ui/label.h13
-rw-r--r--src/ui/list.cpp178
-rw-r--r--src/ui/list.h10
-rw-r--r--src/ui/maindialog.cpp330
-rw-r--r--src/ui/maindialog.h2
-rw-r--r--src/ui/mainmap.cpp17
-rw-r--r--src/ui/mainmap.h62
-rw-r--r--src/ui/mainshort.h47
-rw-r--r--src/ui/map.cpp45
-rw-r--r--src/ui/map.h143
-rw-r--r--src/ui/scroll.cpp1
-rw-r--r--src/ui/scroll.h65
-rw-r--r--src/ui/shortcut.cpp3
-rw-r--r--src/ui/shortcut.h21
-rw-r--r--src/ui/slider.cpp1
-rw-r--r--src/ui/slider.h69
-rw-r--r--src/ui/studio.cpp36
-rw-r--r--src/ui/target.cpp1
-rw-r--r--src/ui/target.h19
-rw-r--r--src/ui/window.cpp5
-rw-r--r--src/ui/window.h3
-rw-r--r--test/unit/CMakeLists.txt5
-rw-r--r--test/unit/math/func_test.cpp55
-rw-r--r--test/unit/ui/edit_test.cpp2
-rw-r--r--test/unit/ui/stubs/app_stub.cpp6
-rw-r--r--test/unit/ui/stubs/robotmain_stub.cpp2
-rwxr-xr-xtools/fix-eof-eol.sh17
-rwxr-xr-xtools/git-grep-braces.sh4
259 files changed, 4792 insertions, 2537 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5f5f1f4..3cb7e70 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -246,11 +246,20 @@ endif()
# Installation paths defined before compiling sources
if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
- set(COLOBOT_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/ CACHE PATH "Colobot binary directory")
- set(COLOBOT_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/ CACHE PATH "Colobot libraries directory")
- set(COLOBOT_INSTALL_DATA_DIR ${CMAKE_INSTALL_PREFIX}/data CACHE PATH "Colobot shared data directory")
- set(COLOBOT_INSTALL_I18N_DIR ${CMAKE_INSTALL_PREFIX}/ CACHE PATH "Colobot translations directory")
- set(COLOBOT_INSTALL_DOC_DIR ${CMAKE_INSTALL_PREFIX}/doc CACHE PATH "Colobot documentation directory")
+ if (${MXE})
+ # We need to use STRING because PATH doesn't accept relative paths
+ set(COLOBOT_INSTALL_BIN_DIR ./ CACHE STRING "Colobot binary directory")
+ set(COLOBOT_INSTALL_LIB_DIR ./ CACHE STRING "Colobot libraries directory")
+ set(COLOBOT_INSTALL_DATA_DIR ./data CACHE STRING "Colobot shared data directory")
+ set(COLOBOT_INSTALL_I18N_DIR ./lang CACHE STRING "Colobot translations directory")
+ set(COLOBOT_INSTALL_DOC_DIR ./doc CACHE STRING "Colobot documentation directory")
+ else()
+ set(COLOBOT_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/ CACHE PATH "Colobot binary directory")
+ set(COLOBOT_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/ CACHE PATH "Colobot libraries directory")
+ set(COLOBOT_INSTALL_DATA_DIR ${CMAKE_INSTALL_PREFIX}/data CACHE PATH "Colobot shared data directory")
+ set(COLOBOT_INSTALL_I18N_DIR ${CMAKE_INSTALL_PREFIX}/ CACHE PATH "Colobot translations directory")
+ set(COLOBOT_INSTALL_DOC_DIR ${CMAKE_INSTALL_PREFIX}/doc CACHE PATH "Colobot documentation directory")
+ endif()
else()
set(COLOBOT_INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/games CACHE PATH "Colobot binary directory")
set(COLOBOT_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/colobot CACHE PATH "Colobot libraries directory")
diff --git a/data b/data
-Subproject 01900b30c0bdb51e800971e67e6e863fe4ac2a3
+Subproject 6d1ff8c3c48f8492824d27a621ecd8fb5879b18
diff --git a/debian/changelog b/debian/changelog
index c3db051..21873e3 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,5 +1,5 @@
-colobot (0.1.0~pre-alpha-git-dev~r296-g0ce02b2-1~OdyX0) UNRELEASED; urgency=low
+colobot (0.1.0~pre-alpha-git-dev~r376-gb22d852-1~OdyX0) UNRELEASED; urgency=low
* Initial release. (Closes: #695829)
- -- Didier Raboud <odyx@debian.org> Sun, 28 Apr 2013 11:27:27 +0200
+ -- Didier Raboud <odyx@debian.org> Sun, 09 Jun 2013 19:01:36 +0200
diff --git a/src/CBot/CBot.cpp b/src/CBot/CBot.cpp
index 4a16b6b..513b803 100644
--- a/src/CBot/CBot.cpp
+++ b/src/CBot/CBot.cpp
@@ -510,7 +510,7 @@ CBotInstr* CBotLeftExprVar::Compile(CBotToken* &p, CBotCStack* pStack)
return inst;
}
-// creates a variable and assigns the result to the stack
+// creates a variable and assigns the result to the stack
bool CBotLeftExprVar::Execute(CBotStack* &pj)
{
CBotVar* var1;
@@ -1073,7 +1073,7 @@ bool CBotInt::Execute(CBotStack* &pj)
if (pile->IfStep()) return false;
- if ( m_next2b &&
+ if ( m_next2b &&
!m_next2b->Execute(pile)) return false; // other(s) definition(s)
return pj->Return(pile); // forward below
@@ -1558,8 +1558,8 @@ CBotInstr* CBotExpression::Compile(CBotToken* &p, CBotCStack* pStack)
int OpType = p->GetType();
if ( pStack->IsOk() &&
- IsOfTypeList(p, ID_ASS, ID_ASSADD, ID_ASSSUB, ID_ASSMUL, ID_ASSDIV, ID_ASSMODULO,
- ID_ASSAND, ID_ASSXOR, ID_ASSOR,
+ IsOfTypeList(p, ID_ASS, ID_ASSADD, ID_ASSSUB, ID_ASSMUL, ID_ASSDIV, ID_ASSMODULO,
+ ID_ASSAND, ID_ASSXOR, ID_ASSOR,
ID_ASSSL , ID_ASSSR, ID_ASSASR, 0 ))
{
if (inst->m_leftop == NULL)
@@ -1655,7 +1655,7 @@ bool CBotExpression::Execute(CBotStack* &pj)
CBotStack* pile = pj->AddStack(this);
// CBotToken* pToken = m_leftop->GetToken();
-
+
CBotVar* pVar = NULL;
CBotStack* pile1 = pile;
@@ -1711,13 +1711,13 @@ bool CBotExpression::Execute(CBotStack* &pj)
pile2->SetVar(result);
break;
case ID_ASSDIV:
- if (IsInit &&
+ if (IsInit &&
result->Div(pile1->GetVar(), pile2->GetVar()))
pile2->SetError(TX_DIVZERO, &m_token);
pile2->SetVar(result);
break;
case ID_ASSMODULO:
- if (IsInit &&
+ if (IsInit &&
result->Modulo(pile1->GetVar(), pile2->GetVar()))
pile2->SetError(TX_DIVZERO, &m_token);
pile2->SetVar(result);
@@ -1776,7 +1776,7 @@ void CBotExpression::RestoreState(CBotStack* &pj, bool bMain)
if ( pile1->GetState()==0)
{
- m_leftop->RestoreStateVar(pile, true);
+ m_leftop->RestoreStateVar(pile, true);
return;
}
@@ -1969,7 +1969,7 @@ CBotInstr* CBotParExpr::Compile(CBotToken* &p, CBotCStack* pStack)
}
// is it a number or DefineNum?
- if (p->GetType() == TokenTypNum ||
+ if (p->GetType() == TokenTypNum ||
p->GetType() == TokenTypDef )
{
CBotInstr* inst = CBotExprNum::Compile(p, pStk);
@@ -2066,7 +2066,7 @@ bool CBotPostIncExpr::Execute(CBotStack* &pj)
pile1->SetState(1);
pile1->SetCopyVar(var1); // places the result (before incrementation);
- CBotStack* pile3 = pile2->AddStack(this);
+ CBotStack* pile3 = pile2->AddStack(this);
if (pile3->IfStep()) return false;
if (var1->GetInit() == IS_NAN)
@@ -2321,7 +2321,7 @@ bool CBotIndexExpr::ExecuteVar(CBotVar* &pVar, CBotStack* &pile, CBotToken* prev
pVar->Maj(pile->GetPUser(), true);
- if ( m_next3 != NULL &&
+ if ( m_next3 != NULL &&
!m_next3->ExecuteVar(pVar, pile, prevToken, bStep, bExtend) ) return false;
// does not release the stack
@@ -2340,7 +2340,7 @@ void CBotIndexExpr::RestoreStateVar(CBotStack* &pile, bool bMain)
return;
}
- if (m_next3)
+ if (m_next3)
m_next3->RestoreStateVar(pile, bMain);
}
@@ -2428,7 +2428,7 @@ bool CBotFieldExpr::ExecuteVar(CBotVar* &pVar, CBotStack* &pile, CBotToken* prev
// request the update of the element, if applicable
pVar->Maj(pile->GetPUser(), true);
- if ( m_next3 != NULL &&
+ if ( m_next3 != NULL &&
!m_next3->ExecuteVar(pVar, pile, &m_token, bStep, bExtend) ) return false;
// does not release the stack
@@ -2442,7 +2442,7 @@ void CBotFieldExpr::RestoreStateVar(CBotStack* &pj, bool bMain)
pj = pj->RestoreStack(this);
if (pj == NULL) return;
- if (m_next3 != NULL)
+ if (m_next3 != NULL)
m_next3->RestoreStateVar(pj, bMain);
}
@@ -2656,7 +2656,7 @@ bool CBotLeftExpr::ExecuteVar(CBotVar* &pVar, CBotStack* &pile, CBotToken* prevT
if (bStep && m_next3 == NULL && pile->IfStep()) return false;
- if ( m_next3 != NULL &&
+ if ( m_next3 != NULL &&
!m_next3->ExecuteVar(pVar, pile, &m_token, bStep, true) ) return false;
return true;
@@ -2667,7 +2667,7 @@ void CBotLeftExpr::RestoreStateVar(CBotStack* &pile, bool bMain)
pile = pile->RestoreStack(this);
if (pile == NULL) return;
- if (m_next3 != NULL)
+ if (m_next3 != NULL)
m_next3->RestoreStateVar(pile, bMain);
}
@@ -3095,7 +3095,7 @@ CBotInstr* CBotExprVar::Compile(CBotToken* &p, CBotCStack* pStack, int privat)
{
if (var->GetType() == CBotTypArrayPointer)
{
- if (IsOfType( p, ID_OPBRK )) // check if there is an aindex
+ if (IsOfType( p, ID_OPBRK )) // check if there is an aindex
{
CBotIndexExpr* i = new CBotIndexExpr();
i->m_expr = CBotExpression::Compile(p, pStk); // compile the formula
@@ -3412,7 +3412,7 @@ CBotInstr* CBotInstrMethode::Compile(CBotToken* &p, CBotCStack* pStack, CBotVar*
{
CBotClass* pClass = var->GetClass(); // pointer to the class
inst->m_ClassName = pClass->GetName(); // name of the class
- CBotTypResult r = pClass->CompileMethode(inst->m_NomMethod, var, ppVars,
+ CBotTypResult r = pClass->CompileMethode(inst->m_NomMethod, var, ppVars,
pStack, inst->m_MethodeIdent);
delete pStack->TokenStack(); // release parameters on the stack
inst->m_typRes = r;
@@ -3504,8 +3504,8 @@ bool CBotInstrMethode::ExecuteVar(CBotVar* &pVar, CBotStack* &pj, CBotToken* pre
}
CBotVar* pRes = pResult;
- if ( !pClass->ExecuteMethode(m_MethodeIdent, m_NomMethod,
- pThis, ppVars,
+ if ( !pClass->ExecuteMethode(m_MethodeIdent, m_NomMethod,
+ pThis, ppVars,
pResult, pile2, GetToken())) return false;
if (pRes != pResult) delete pRes;
@@ -3555,7 +3555,7 @@ void CBotInstrMethode::RestoreStateVar(CBotStack* &pile, bool bMain)
// CBotVar* pRes = pResult;
- pClass->RestoreMethode(m_MethodeIdent, m_NomMethod,
+ pClass->RestoreMethode(m_MethodeIdent, m_NomMethod,
pThis, ppVars, pile2);
}
@@ -3609,8 +3609,8 @@ bool CBotInstrMethode::Execute(CBotStack* &pj)
}
CBotVar* pRes = pResult;
- if ( !pClass->ExecuteMethode(m_MethodeIdent, m_NomMethod,
- pThis, ppVars,
+ if ( !pClass->ExecuteMethode(m_MethodeIdent, m_NomMethod,
+ pThis, ppVars,
pResult, pile2, GetToken())) return false; // interupted
// set the new value of this in place of the old variable
@@ -3625,7 +3625,7 @@ bool CBotInstrMethode::Execute(CBotStack* &pj)
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
-// compile an instruction "new"
+// compile an instruction "new"
CBotNew::CBotNew()
{
@@ -3770,8 +3770,8 @@ bool CBotNew::Execute(CBotStack* &pj)
// create a variable for the result
CBotVar* pResult = NULL; // constructos still void
- if ( !pClass->ExecuteMethode(m_nMethodeIdent, pClass->GetName(),
- pThis, ppVars,
+ if ( !pClass->ExecuteMethode(m_nMethodeIdent, pClass->GetName(),
+ pThis, ppVars,
pResult, pile2, GetToken())) return false; // interrupt
pThis->ConstructorSet(); // indicates that the constructor has been called
@@ -3857,13 +3857,13 @@ bool TypeCompatible(CBotTypResult& type1, CBotTypResult& type2, int op)
if (max >= CBotTypBoolean)
{
- if ( (op == ID_EQ || op == ID_NE) &&
+ if ( (op == ID_EQ || op == ID_NE) &&
(t1 == CBotTypPointer && t2 == CBotTypNullPointer)) return true;
- if ( (op == ID_EQ || op == ID_NE || op == ID_ASS) &&
+ if ( (op == ID_EQ || op == ID_NE || op == ID_ASS) &&
(t2 == CBotTypPointer && t1 == CBotTypNullPointer)) return true;
- if ( (op == ID_EQ || op == ID_NE) &&
+ if ( (op == ID_EQ || op == ID_NE) &&
(t1 == CBotTypArrayPointer && t2 == CBotTypNullPointer)) return true;
- if ( (op == ID_EQ || op == ID_NE || op == ID_ASS) &&
+ if ( (op == ID_EQ || op == ID_NE || op == ID_ASS) &&
(t2 == CBotTypArrayPointer && t1 == CBotTypNullPointer)) return true;
if (t2 != t1) return false;
if (t1 == CBotTypArrayPointer) return type1.Compare(type2);
diff --git a/src/CBot/CBot.h b/src/CBot/CBot.h
index f5d78c8..8313252 100644
--- a/src/CBot/CBot.h
+++ b/src/CBot/CBot.h
@@ -69,7 +69,7 @@ class CBotDefParam; // paramerer list of a function
// to use for routine CBotProgram :: Execute (CBotStack)
-/**\class CBotStack
+/**\class CBotStack
* \brief Management of the execution stack.
* \brief Actually the only thing it can do is to create an instance of a stack
* \brief to use for routine CBotProgram :: Execute(CBotStack)*/
@@ -210,14 +210,14 @@ public:
// in case of eventual break
bool IfContinue(int state, const char* name);
// or "continue"
-
+
bool IsOk();
bool SetState(int n, int lim = -10); // select a state
int GetState(); // in what state am I?
bool IncState(int lim = -10); // passes to the next state
bool IfStep(); // do step by step
- bool Execute();
+ bool Execute();
void SetVar( CBotVar* var );
void SetCopyVar( CBotVar* var );
@@ -259,7 +259,7 @@ private:
CBotStack* m_prev;
friend class CBotInstArray;
-#ifdef _DEBUG
+#ifdef _DEBUG
int m_index;
#endif
int m_state;
@@ -360,7 +360,7 @@ public:
CBotCStack* TokenStack(CBotToken* pToken = NULL, bool bBlock = false);
CBotInstr* Return(CBotInstr* p, CBotCStack* pParent); // transmits the result upper
CBotFunction* ReturnFunc(CBotFunction* p, CBotCStack* pParent); // transmits the result upper
-
+
void SetVar( CBotVar* var );
void SetCopyVar( CBotVar* var );
CBotVar* GetVar();
@@ -480,7 +480,7 @@ class CBotWhile : public CBotInstr
private:
CBotInstr* m_Condition; // condition
CBotInstr* m_Block; // instructions
- CBotString m_label; // a label if there is
+ CBotString m_label; // a label if there is
public:
CBotWhile();
@@ -496,7 +496,7 @@ class CBotDo : public CBotInstr
private:
CBotInstr* m_Block; // instruction
CBotInstr* m_Condition; // conditions
- CBotString m_label; // a label if there is
+ CBotString m_label; // a label if there is
public:
CBotDo();
@@ -514,7 +514,7 @@ private:
CBotInstr* m_Test; // test condition
CBotInstr* m_Incr; // instruction for increment
CBotInstr* m_Block; // instructions
- CBotString m_label; // a label if there is
+ CBotString m_label; // a label if there is
public:
CBotFor();
@@ -528,7 +528,7 @@ public:
class CBotBreak : public CBotInstr
{
private:
- CBotString m_label; // a label if there is
+ CBotString m_label; // a label if there is
public:
CBotBreak();
@@ -542,7 +542,7 @@ public:
class CBotReturn : public CBotInstr
{
private:
- CBotInstr* m_Instr; // paramter of return
+ CBotInstr* m_Instr; // paramter of return
public:
CBotReturn();
@@ -557,7 +557,7 @@ public:
class CBotSwitch : public CBotInstr
{
private:
- CBotInstr* m_Value; // value to seek
+ CBotInstr* m_Value; // value to seek
CBotInstr* m_Block; // instructions
public:
@@ -704,7 +704,7 @@ public:
};
-// definition of a assignment list for a table
+// definition of a assignment list for a table
// int [ ] a [ ] = ( ( 1, 2, 3 ) , ( 3, 2, 1 ) ) ;
class CBotListArray : public CBotInstr
@@ -1415,12 +1415,12 @@ public:
void IncrementUse(); // a reference to incrementation
void DecrementUse(); // a reference to decrementation
- CBotVarClass*
+ CBotVarClass*
GetPointer();
void SetItemList(CBotVar* pVar);
void SetIdent(long n);
-
+
static CBotVarClass* Find(long id);
@@ -1489,7 +1489,7 @@ public:
void SetPointer(CBotVar* p);
CBotVarClass*
GetPointer();
-
+
void Copy(CBotVar* pSrc, bool bName=true);
CBotVar* GetItem(int n, bool bGrow=false); // makes an element according to its numeric index
// enlarged the table if necessary if bExtend
@@ -1544,14 +1544,14 @@ private:
CBotCall* m_next;
public:
- CBotCall(const char* name,
- bool rExec (CBotVar* pVar, CBotVar* pResult, int& Exception, void* pUser),
+ CBotCall(const char* name,
+ bool rExec (CBotVar* pVar, CBotVar* pResult, int& Exception, void* pUser),
CBotTypResult rCompile (CBotVar* &pVar, void* pUser));
~CBotCall();
static
- bool AddFunction(const char* name,
- bool rExec (CBotVar* pVar, CBotVar* pResult, int& Exception, void* pUser),
+ bool AddFunction(const char* name,
+ bool rExec (CBotVar* pVar, CBotVar* pResult, int& Exception, void* pUser),
CBotTypResult rCompile (CBotVar* &pVar, void* pUser));
static
@@ -1572,7 +1572,7 @@ public:
CBotString GetName();
CBotCall* Next();
-
+
static void SetPUser(void* pUser);
static void Free();
};
@@ -1591,13 +1591,13 @@ private:
long m_nFuncIdent;
public:
- CBotCallMethode(const char* name,
- bool rExec (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception),
+ CBotCallMethode(const char* name,
+ bool rExec (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception),
CBotTypResult rCompile (CBotVar* pThis, CBotVar* &pVar));
~CBotCallMethode();
CBotTypResult
- CompileCall(const char* name, CBotVar* pThis,
+ CompileCall(const char* name, CBotVar* pThis,
CBotVar** ppVars, CBotCStack* pStack,
long& nIdent);
@@ -1606,7 +1606,7 @@ public:
CBotString GetName();
CBotCallMethode* Next();
void AddNext(CBotCallMethode* p);
-
+
};
// a list of parameters
@@ -1703,4 +1703,3 @@ public:
bool GetPosition(int& start, int& stop, CBotGet modestart, CBotGet modestop);
};
-
diff --git a/src/CBot/CBotAddExpr.cpp b/src/CBot/CBotAddExpr.cpp
index 231f008..ec007ae 100644
--- a/src/CBot/CBotAddExpr.cpp
+++ b/src/CBot/CBotAddExpr.cpp
@@ -84,7 +84,7 @@ CBotInstr* CBotAddExpr::Compile(CBotToken* &p, CBotStack* pStack)
return pStack->Return(NULL, pStk);
}
- // if we are not dealing with an operation + or -
+ // if we are not dealing with an operation + or -
// goes to that requested, the operand (left) found
// place the object "addition"
return pStack->Return(left, pStk);
@@ -141,4 +141,3 @@ bool CBotAddExpr::Execute(CBotStack* &pStack)
return pStack->Return(pStk1); // transmits the result
}
-
diff --git a/src/CBot/CBotClass.cpp b/src/CBot/CBotClass.cpp
index a1c3fd4..12765ba 100644
--- a/src/CBot/CBotClass.cpp
+++ b/src/CBot/CBotClass.cpp
@@ -54,7 +54,7 @@ CBotClass::CBotClass(const char* name, CBotClass* pPapa, bool bIntrinsic)
CBotClass::~CBotClass()
{
- // removes the list of class
+ // removes the list of class
if ( m_ExPrev ) m_ExPrev->m_ExNext = m_ExNext;
else m_ExClass = m_ExNext;
@@ -106,7 +106,7 @@ bool CBotClass::Lock(CBotProgram* p)
m_ProgInLock[0] = p;
return true;
}
- if ( p == m_ProgInLock[0] )
+ if ( p == m_ProgInLock[0] )
{
m_cptOne++;
m_cptLock--; // has already been counted
@@ -156,14 +156,14 @@ void CBotClass::FreeLock(CBotProgram* p)
while ( pClass != NULL )
{
- if ( p == pClass->m_ProgInLock[0] )
+ if ( p == pClass->m_ProgInLock[0] )
{
pClass->m_cptLock -= pClass->m_cptOne;
pClass->m_cptOne = 0;
}
for ( int j = 1; j < 5 ; j++ )
- if ( p == pClass->m_ProgInLock[j] )
+ if ( p == pClass->m_ProgInLock[j] )
pClass->m_cptLock--;
pClass = pClass->m_ExNext;
@@ -291,8 +291,8 @@ CBotClass* CBotClass::Find(const char* name)
return NULL;
}
-bool CBotClass::AddFunction(const char* name,
- bool rExec (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception),
+bool CBotClass::AddFunction(const char* name,
+ bool rExec (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception),
CBotTypResult rCompile (CBotVar* pThis, CBotVar* &pVar))
{
// stores pointers to the two functions
@@ -313,7 +313,7 @@ bool CBotClass::AddFunction(const char* name,
}
p = new CBotCallMethode(name, rExec, rCompile);
-
+
if (m_pCalls == NULL) m_pCalls = p;
else m_pCalls->AddNext(p); // added to the list
@@ -329,8 +329,8 @@ bool CBotClass::AddUpdateFunc( void rMaj ( CBotVar* pThis, void* pUser ) )
// compiles a method associated with an instance of class
// the method can be declared by the user or AddFunction
-CBotTypResult CBotClass::CompileMethode(const char* name,
- CBotVar* pThis, CBotVar** ppParams,
+CBotTypResult CBotClass::CompileMethode(const char* name,
+ CBotVar* pThis, CBotVar** ppParams,
CBotCStack* pStack, long& nIdent)
{
nIdent = 0; // forget the previous one if necessary
@@ -350,8 +350,8 @@ CBotTypResult CBotClass::CompileMethode(const char* name,
// executes a method
-bool CBotClass::ExecuteMethode(long& nIdent, const char* name,
- CBotVar* pThis, CBotVar** ppParams,
+bool CBotClass::ExecuteMethode(long& nIdent, const char* name,
+ CBotVar* pThis, CBotVar** ppParams,
CBotVar* &pResult, CBotStack* &pStack,
CBotToken* pToken)
{
@@ -437,7 +437,7 @@ bool CBotClass::RestoreStaticState(FILE* pf)
if (!ReadString( pf, VarName )) return false;
if ( pClass != NULL ) pVar = pClass->GetItem(VarName);
- if (!CBotVar::RestoreState(pf, pv)) return false; // the temp variable
+ if (!CBotVar::RestoreState(pf, pv)) return false; // the temp variable
if ( pVar != NULL ) pVar->Copy(pv);
delete pv;
@@ -514,7 +514,7 @@ CBotInstr* CBotClassInst::Compile(CBotToken* &p, CBotCStack* pStack, CBotClass*
delete inst; // is not type CBotInt
p = vartoken; // returns to the variable name
- // compiles declaration an array
+ // compiles declaration an array
inst = static_cast<CBotClassInst*>(CBotInstArray::Compile( p, pStk, type ));
@@ -595,7 +595,7 @@ CBotInstr* CBotClassInst::Compile(CBotToken* &p, CBotCStack* pStack, CBotClass*
goto error;
}
// if ( !bIntrinsic ) var->SetPointer(pStk->GetVar()->GetPointer());
- if ( !bIntrinsic )
+ if ( !bIntrinsic )
{
// does not use the result on the stack, to impose the class
CBotVar* pvar = CBotVar::Create("", pClass);
@@ -608,7 +608,7 @@ CBotInstr* CBotClassInst::Compile(CBotToken* &p, CBotCStack* pStack, CBotClass*
{
// creates the object on the "job" (\TODO "tas")
// with a pointer to the object
- if ( !bIntrinsic )
+ if ( !bIntrinsic )
{
CBotVar* pvar = CBotVar::Create("", pClass);
var->SetPointer( pvar ); // variable already declared instance pointer
@@ -617,14 +617,14 @@ CBotInstr* CBotClassInst::Compile(CBotToken* &p, CBotCStack* pStack, CBotClass*
var->SetInit(2); // marks the pointer as init
}
suite:
- if (IsOfType(p, ID_COMMA)) // several chained definitions
+ if (IsOfType(p, ID_COMMA)) // several chained definitions
{
if ( NULL != ( inst->m_next = CBotClassInst::Compile(p, pStk, pClass) )) // compiles the following
{
return pStack->Return(inst, pStk);
}
}
-
+
if (IsOfType(p, ID_SEP)) // complete instruction
{
return pStack->Return(inst, pStk);
@@ -684,7 +684,7 @@ bool CBotClassInst::Execute(CBotStack* &pj)
{
// evaluates the expression for the assignment
if (!m_expr->Execute(pile)) return false;
-
+
if ( bIntrincic )
{
CBotVar* pv = pile->GetVar();
@@ -750,8 +750,8 @@ bool CBotClassInst::Execute(CBotStack* &pj)
// creates a variable for the result
CBotVar* pResult = NULL; // constructor still void
- if ( !pClass->ExecuteMethode(m_nMethodeIdent, pClass->GetName(),
- pThis, ppVars,
+ if ( !pClass->ExecuteMethode(m_nMethodeIdent, pClass->GetName(),
+ pThis, ppVars,
pResult, pile2, GetToken())) return false; // interrupt
pThis->SetInit(true);
diff --git a/src/CBot/CBotCompExpr.cpp b/src/CBot/CBotCompExpr.cpp
index 2daf53f..c9a977c 100644
--- a/src/CBot/CBotCompExpr.cpp
+++ b/src/CBot/CBotCompExpr.cpp
@@ -83,7 +83,7 @@ CBotInstr* CBotCompExpr::Compile(CBotToken* &p, CBotCStack* pStack)
}
-// perform the operation
+// perform the operation
bool CBotCompExpr::Execute(CBotStack* &pStack)
{
diff --git a/src/CBot/CBotDll.h b/src/CBot/CBotDll.h
index b401528..8858559 100644
--- a/src/CBot/CBotDll.h
+++ b/src/CBot/CBotDll.h
@@ -93,22 +93,22 @@ public:
CBotTypResult(int type);
// for simple types (CBotTypInt à CBotTypString)
-
+
CBotTypResult(int type, const char* name);
// for pointer types and intrinsic classes
-
+
CBotTypResult(int type, CBotClass* pClass);
// for the instance of a class
-
+
CBotTypResult(int type, CBotTypResult elem);
// for arrays of variables
-
+
CBotTypResult(const CBotTypResult& typ);
// for assignments
-
+
CBotTypResult();
// for default
-
+
~CBotTypResult();
int GetType(int mode = 0) const;
@@ -147,7 +147,7 @@ private:
CBotClass* m_pClass; // for the derivatives of class
int m_limite; // limits of tables
friend class CBotVarClass;
- friend class CBotVarPointer;
+ friend class CBotVarPointer;
};
/*
@@ -246,7 +246,7 @@ private:
////////////////////////////////////////////////////////////////////////
-//
+//
// as part of MFC CString not used here.
//
// ( all functions are not implemented yet )
@@ -451,12 +451,12 @@ public:
static
void SetTimer(int n);
- // defines the number of steps (parts of instructions) to done
+ // defines the number of steps (parts of instructions) to done
// in Run() before rendering hand "false" \TODO avant de rendre la main "false"
static
- bool AddFunction(const char* name,
- bool rExec (CBotVar* pVar, CBotVar* pResult, int& Exception, void* pUser),
+ bool AddFunction(const char* name,
+ bool rExec (CBotVar* pVar, CBotVar* pResult, int& Exception, void* pUser),
CBotTypResult rCompile (CBotVar* &pVar, void* pUser));
// call this to add externally (**)
// a new function used by the program CBoT
@@ -472,8 +472,8 @@ public:
// restores the state of execution from file
// the compiled program must obviously be the same
- bool GetPosition(const char* name, int& start, int& stop,
- CBotGet modestart = GetPosExtern,
+ bool GetPosition(const char* name, int& start, int& stop,
+ CBotGet modestart = GetPosExtern,
CBotGet modestop = GetPosBloc);
// gives the position of a routine in the original text
// the user can select the item to find from the beginning to the end
@@ -513,7 +513,7 @@ int cMean(CBotVar* &pVar, CBotString& ClassName)
while ( pVar != NULL )
{
- if ( pVar->GetType() > CBotTypDouble ) return 6002; // this is not a number
+ if ( pVar->GetType() > CBotTypDouble ) return 6002; // this is not a number
pVar = pVar -> GetNext();
}
@@ -623,7 +623,7 @@ virtual ~CBotVar( ); // destructor
void SetName(const char* name); // changes the name of the variable
int GetType(int mode = 0); // returns the base type (int) of the variable
- // TODO check it
+ // TODO check it
////////////////////////////////////////////////////////////////////////////////////////
CBotTypResult GetTypResult(int mode = 0); // returns the complete type of the variable
@@ -654,7 +654,7 @@ virtual ~CBotVar( ); // destructor
CBotVar* GetItemRef(int nIdent); // idem à partir du n° ref
// TODO ditto from ref no.
virtual
- CBotVar* GetItem(int row, bool bGrow = false);
+ CBotVar* GetItem(int row, bool bGrow = false);
virtual
CBotVar* GetItemList(); // lists the elements
@@ -802,8 +802,8 @@ public:
~CBotClass( ); // destructor
- bool AddFunction(const char* name,
- bool rExec (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception),
+ bool AddFunction(const char* name,
+ bool rExec (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception),
CBotTypResult rCompile (CBotVar* pThis, CBotVar* &pVar));
// this call allows to add as external (**)
// new method used by the objects of this class
@@ -841,7 +841,7 @@ public:
CBotVar* GetItem(const char* name); // one of the variables according to its name
CBotVar* GetItemRef(int nIdent);
- CBotTypResult CompileMethode(const char* name, CBotVar* pThis, CBotVar** ppParams,
+ CBotTypResult CompileMethode(const char* name, CBotVar* pThis, CBotVar** ppParams,
CBotCStack* pStack, long& nIdent);
bool ExecuteMethode(long& nIdent, const char* name, CBotVar* pThis, CBotVar** ppParams, CBotVar* &pResult, CBotStack* &pStack, CBotToken* pToken);
@@ -854,7 +854,7 @@ public:
CBotClass* Compile1(CBotToken* &p, CBotCStack* pStack);
bool CompileDefItem(CBotToken* &p, CBotCStack* pStack, bool bSecond);
-
+
bool IsIntrinsic();
void Purge();
static
@@ -917,7 +917,7 @@ private:
int m_start; // position in the original text (program)
int m_end; // the same for the end of the token
-
+
/**
* \brief Check whether given parameter is a keyword
*/
@@ -979,11 +979,11 @@ public:
CBotToken* GetPrev();
/**
- * \brief transforms the entire program
+ * \brief transforms the entire program
*/
static
CBotToken* CompileTokens(const char* p, int& error);
-
+
/**
* \brief releases the list
*/
diff --git a/src/CBot/CBotFunction.cpp b/src/CBot/CBotFunction.cpp
index 28db24e..862554e 100644
--- a/src/CBot/CBotFunction.cpp
+++ b/src/CBot/CBotFunction.cpp
@@ -28,7 +28,7 @@ CBotFunction::CBotFunction()
m_Param = NULL; // empty parameter list
m_Block = NULL; // the instruction block
m_next = NULL; // functions can be chained
- m_bPublic = false; // function not public
+ m_bPublic = false; // function not public
m_bExtern = false; // function not extern
m_nextpublic = NULL;
m_prevpublic = NULL;
@@ -159,9 +159,9 @@ CBotTypResult TypeParam(CBotToken* &p, CBotCStack* pile)
if ( pClass != NULL)
{
p = p->GetNext();
- return ArrayType(p, pile,
- pClass->IsIntrinsic() ?
- CBotTypResult( CBotTypIntrinsic, pClass ) :
+ return ArrayType(p, pile,
+ pClass->IsIntrinsic() ?
+ CBotTypResult( CBotTypIntrinsic, pClass ) :
CBotTypResult( CBotTypPointer, pClass ) );
}
}
@@ -261,7 +261,7 @@ CBotFunction* CBotFunction::Compile(CBotToken* &p, CBotCStack* pStack, CBotFunct
}
}
- // and compiles the following instruction block
+ // and compiles the following instruction block
func->m_openblk = p;
func->m_Block = CBotBlock::Compile(p, pStk, false);
func->m_closeblk = p->GetPrev();
@@ -288,7 +288,7 @@ CBotFunction* CBotFunction::Compile1(CBotToken* &p, CBotCStack* pStack, CBotClas
{
CBotFunction* func = new CBotFunction();
func->m_nFuncIdent = CBotVar::NextUniqNum();
-
+
CBotCStack* pStk = pStack->TokenStack(p, true);
while (true)
@@ -334,7 +334,7 @@ CBotFunction* CBotFunction::Compile1(CBotToken* &p, CBotCStack* pStack, CBotClas
func->m_Param = CBotDefParam::Compile( p, pStk );
if (pStk->IsOk())
{
- // looks if the function exists elsewhere
+ // looks if the function exists elsewhere
if (( pClass != NULL || !pStack->CheckCall(pp, func->m_Param)) &&
( pClass == NULL || !pClass->CheckCall(pp, func->m_Param)) )
{
@@ -350,7 +350,7 @@ CBotFunction* CBotFunction::Compile1(CBotToken* &p, CBotCStack* pStack, CBotClas
if (type == ID_CLBLK) level--;
}
while (level > 0 && p != NULL);
-
+
return pStack->ReturnFunc(func, pStk);
}
pStk->SetError(TX_OPENBLK, p);
@@ -528,7 +528,7 @@ CBotFunction* CBotFunction::FindLocalOrPublic(long& nIdent, const char* name, CB
pv = pv->GetNext();
pw = ppVars[i++];
}
- if ( pw != NULL )
+ if ( pw != NULL )
{
if ( pFunc != NULL ) continue;
if ( TypeOrError.Eq(TX_LOWPARAM) ) TypeOrError.SetType(TX_NUMPARAM);
@@ -583,7 +583,7 @@ CBotFunction* CBotFunction::FindLocalOrPublic(long& nIdent, const char* name, CB
pv = pv->GetNext();
pw = ppVars[i++];
}
- if ( pw != NULL )
+ if ( pw != NULL )
{
if ( pFunc != NULL ) continue;
if ( TypeOrError.Eq(TX_LOWPARAM) ) TypeOrError.SetType(TX_NUMPARAM);
@@ -630,7 +630,7 @@ int CBotFunction::DoCall(long& nIdent, const char* name, CBotVar** ppVars, CBotS
{
CBotTypResult type;
CBotFunction* pt = NULL;
-
+
pt = FindLocalOrPublic(nIdent, name, ppVars, type);
if ( pt != NULL )
@@ -754,7 +754,7 @@ void CBotFunction::RestoreCall(long& nIdent, const char* name, CBotVar** ppVars,
-// makes call of a method
+// makes call of a method
// note: this is already on the stack, the pointer pThis is just to simplify
int CBotFunction::DoCall(long& nIdent, const char* name, CBotVar* pThis, CBotVar** ppVars, CBotStack* pStack, CBotToken* pToken, CBotClass* pClass)
@@ -951,7 +951,7 @@ CBotDefParam* CBotDefParam::Compile(CBotToken* &p, CBotCStack* pStack)
if (IsOfType(p, ID_OPENPAR))
{
CBotDefParam* list = NULL;
-
+
while (!IsOfType(p, ID_CLOSEPAR))
{
CBotDefParam* param = new CBotDefParam();
@@ -1090,7 +1090,7 @@ CBotDefParam* CBotDefParam::GetNext()
CBotString CBotDefParam::GetParamString()
{
CBotString param;
-
+
param = m_typename;
param += ' ';
@@ -1136,7 +1136,7 @@ CBotInstr* CBotReturn::Compile(CBotToken* &p, CBotCStack* pStack)
if ( pStack->IsOk() )
{
CBotTypResult retType = pStack->GetTypResult(2);
- if (TypeCompatible(retType, type, ID_ASS))
+ if (TypeCompatible(retType, type, ID_ASS))
{
if ( IsOfType( p, ID_SEP ) )
return inst;
@@ -1202,7 +1202,7 @@ CBotInstr* CBotInstrCall::Compile(CBotToken* &p, CBotCStack* pStack)
int i = 0;
- CBotToken* pp = p;
+ CBotToken* pp = p;
p = p->GetNext();
pStack->SetStartError(p->GetStart());
@@ -1367,7 +1367,7 @@ CBotClass* CBotClass::Compile1(CBotToken* &p, CBotCStack* pStack)
pStack->SetError(TX_NOPUBLIC, p);
return NULL;
}
-
+
if ( !IsOfType(p, ID_CLASS) ) return NULL;
CBotString name = p->GetString();
@@ -1443,7 +1443,7 @@ bool CBotClass::CompileDefItem(CBotToken* &p, CBotCStack* pStack, bool bSecond)
return false;
}
- while (pStack->IsOk())
+ while (pStack->IsOk())
{
CBotToken* pp = p;
IsOfType(p, ID_NOT); // skips ~ eventual (destructor)
@@ -1484,7 +1484,7 @@ bool CBotClass::CompileDefItem(CBotToken* &p, CBotCStack* pStack, bool bSecond)
if ( !bSecond )
{
p = pBase;
- CBotFunction* f =
+ CBotFunction* f =
CBotFunction::Compile1(p, pStack, this);
if ( f == NULL ) return false;
@@ -1497,7 +1497,7 @@ bool CBotClass::CompileDefItem(CBotToken* &p, CBotCStack* pStack, bool bSecond)
// return a method precompiled in pass 1
CBotFunction* pf = m_pMethod;
CBotFunction* prev = NULL;
- while ( pf != NULL )
+ while ( pf != NULL )
{
if (pf->GetName() == pp->GetString()) break;
prev = pf;
@@ -1541,7 +1541,7 @@ bool CBotClass::CompileDefItem(CBotToken* &p, CBotCStack* pStack, bool bSecond)
// compiles a method
p = pBase;
- CBotFunction* f =
+ CBotFunction* f =
CBotFunction::Compile(p, pile, NULL/*, false*/);
if ( f != NULL )
@@ -1646,3 +1646,4 @@ CBotClass* CBotClass::Compile(CBotToken* &p, CBotCStack* pStack)
pStack->SetError(TX_ENDOF, p);
return NULL;
}
+
diff --git a/src/CBot/CBotIf.cpp b/src/CBot/CBotIf.cpp
index a5d2693..bc58af1 100644
--- a/src/CBot/CBotIf.cpp
+++ b/src/CBot/CBotIf.cpp
@@ -109,7 +109,7 @@ bool CBotIf :: Execute(CBotStack* &pj)
// passes into the second state
if (!pile->SetState(1)) return false; // ready for further
}
-
+
// second state, evaluates the associated instructions
// the result of the condition is on the stack
@@ -143,7 +143,7 @@ void CBotIf :: RestoreState(CBotStack* &pj, bool bMain)
m_Condition->RestoreState(pile, bMain); // interrupted here!
return;
}
-
+
// second state, evaluates the associated instructions
// the result of the condition is on the stack
diff --git a/src/CBot/CBotProgram.cpp b/src/CBot/CBotProgram.cpp
index f4987a7..1944f92 100644
--- a/src/CBot/CBotProgram.cpp
+++ b/src/CBot/CBotProgram.cpp
@@ -97,7 +97,7 @@ bool CBotProgram::Compile( const char* program, CBotStringArray& ListFonctions,
{
if ( IsOfType(p, ID_SEP) ) continue; // semicolons lurking
- if ( p->GetType() == ID_CLASS ||
+ if ( p->GetType() == ID_CLASS ||
( p->GetType() == ID_PUBLIC && p->GetNext()->GetType() == ID_CLASS ))
{
CBotClass* nxt = CBotClass::Compile1(p, pStack);
@@ -113,7 +113,7 @@ bool CBotProgram::Compile( const char* program, CBotStringArray& ListFonctions,
}
if ( !pStack->IsOk() )
{
- m_ErrorCode = pStack->GetError(m_ErrorStart, m_ErrorEnd);
+ m_ErrorCode = pStack->GetError(m_ErrorStart, m_ErrorEnd);
delete m_Prog;
m_Prog = NULL;
delete pBaseToken;
@@ -129,7 +129,7 @@ bool CBotProgram::Compile( const char* program, CBotStringArray& ListFonctions,
{
if ( IsOfType(p, ID_SEP) ) continue; // semicolons lurking
- if ( p->GetType() == ID_CLASS ||
+ if ( p->GetType() == ID_CLASS ||
( p->GetType() == ID_PUBLIC && p->GetNext()->GetType() == ID_CLASS ))
{
m_bCompileClass = true;
@@ -150,7 +150,7 @@ bool CBotProgram::Compile( const char* program, CBotStringArray& ListFonctions,
if ( !pStack->IsOk() )
{
- m_ErrorCode = pStack->GetError(m_ErrorStart, m_ErrorEnd);
+ m_ErrorCode = pStack->GetError(m_ErrorStart, m_ErrorEnd);
delete m_Prog;
m_Prog = NULL;
}
@@ -228,7 +228,7 @@ bool CBotProgram::Run(void* pUser, int timer)
#if STACKRUN
// resumes execution on the top of the stack
ok = m_pStack->Execute();
- if ( ok )
+ if ( ok )
{
#ifdef _DEBUG
CBotVar* ppVar[3];
@@ -354,8 +354,8 @@ CBotFunction* CBotProgram::GetFunctions()
return m_Prog;
}
-bool CBotProgram::AddFunction(const char* name,
- bool rExec (CBotVar* pVar, CBotVar* pResult, int& Exception, void* pUser),
+bool CBotProgram::AddFunction(const char* name,
+ bool rExec (CBotVar* pVar, CBotVar* pResult, int& Exception, void* pUser),
CBotTypResult rCompile (CBotVar* &pVar, void* pUser))
{
// stores pointers to the two functions
@@ -369,7 +369,7 @@ bool WriteWord(FILE* pf, unsigned short w)
lg = fwrite(&w, sizeof( unsigned short ), 1, pf );
- return (lg == 1);
+ return (lg == 1);
}
bool ReadWord(FILE* pf, unsigned short& w)
@@ -387,7 +387,7 @@ bool WriteFloat(FILE* pf, float w)
lg = fwrite(&w, sizeof( float ), 1, pf );
- return (lg == 1);
+ return (lg == 1);
}
bool ReadFloat(FILE* pf, float& w)
@@ -405,7 +405,7 @@ bool WriteLong(FILE* pf, long w)
lg = fwrite(&w, sizeof( long ), 1, pf );
- return (lg == 1);
+ return (lg == 1);
}
bool ReadLong(FILE* pf, long& w)
@@ -425,7 +425,7 @@ bool WriteString(FILE* pf, CBotString s)
if (!WriteWord(pf, lg1)) return false;
lg2 = fwrite(s, 1, lg1, pf );
- return (lg1 == lg2);
+ return (lg1 == lg2);
}
bool ReadString(FILE* pf, CBotString& s)
@@ -510,7 +510,7 @@ bool CBotProgram::SaveState(FILE* pf)
if (!WriteString( pf, m_pRun->GetName() )) return false;
if (!m_pStack->SaveState(pf)) return false;
}
- else
+ else
{
if (!WriteWord( pf, 0)) return false;
}
@@ -560,9 +560,9 @@ int CBotProgram::GetVersion()
//////////////////////////////////////////////////////////////////////////////////////////////////////
CBotCall* CBotCall::m_ListCalls = NULL;
-
-CBotCall::CBotCall(const char* name,
- bool rExec (CBotVar* pVar, CBotVar* pResult, int& Exception, void* pUser),
+
+CBotCall::CBotCall(const char* name,
+ bool rExec (CBotVar* pVar, CBotVar* pResult, int& Exception, void* pUser),
CBotTypResult rCompile (CBotVar* &pVar, void* pUser))
{
m_name = name;
@@ -583,8 +583,8 @@ void CBotCall::Free()
delete CBotCall::m_ListCalls;
}
-bool CBotCall::AddFunction(const char* name,
- bool rExec (CBotVar* pVar, CBotVar* pResult, int& Exception, void* pUser),
+bool CBotCall::AddFunction(const char* name,
+ bool rExec (CBotVar* pVar, CBotVar* pResult, int& Exception, void* pUser),
CBotTypResult rCompile (CBotVar* &pVar, void* pUser))
{
CBotCall* p = m_ListCalls;
@@ -608,7 +608,7 @@ bool CBotCall::AddFunction(const char* name,
}
pp = new CBotCall(name, rExec, rCompile);
-
+
if (p) p->m_next = pp;
else m_ListCalls = pp;
@@ -658,7 +658,7 @@ CBotTypResult CBotCall::CompileCall(CBotToken* &p, CBotVar** ppVar, CBotCStack*
CBotVar* pVar2 = pVar;
CBotTypResult r = pt->m_rComp(pVar2, m_pUser);
int ret = r.GetType();
-
+
// if a class is returned, it is actually a pointer
if ( ret == CBotTypClass ) r.SetType( ret = CBotTypPointer );
@@ -859,8 +859,8 @@ bool CBotCall::Run(CBotStack* pStack)
///////////////////////////////////////////////////////////////////////////////////////
-CBotCallMethode::CBotCallMethode(const char* name,
- bool rExec (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception),
+CBotCallMethode::CBotCallMethode(const char* name,
+ bool rExec (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception),
CBotTypResult rCompile (CBotVar* pThis, CBotVar* &pVar))
{
m_name = name;
@@ -879,7 +879,7 @@ CBotCallMethode::~CBotCallMethode()
// is acceptable by a call procedure name
// and given parameters
-CBotTypResult CBotCallMethode::CompileCall(const char* name, CBotVar* pThis,
+CBotTypResult CBotCallMethode::CompileCall(const char* name, CBotVar* pThis,
CBotVar** ppVar, CBotCStack* pStack,
long& nIdent)
{
@@ -1008,7 +1008,7 @@ bool rSizeOf( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
while ( pVar != NULL )
{
- i++;
+ i++;
pVar = pVar->GetNext();
}
@@ -1107,7 +1107,7 @@ void CBotProgram::Init()
void CBotProgram::Free()
{
- CBotToken::Free() ;
+ CBotToken::Free() ;
CBotCall ::Free() ;
CBotClass::Free() ;
}
diff --git a/src/CBot/CBotStack.cpp b/src/CBot/CBotStack.cpp
index 67f2000..086442d 100644
--- a/src/CBot/CBotStack.cpp
+++ b/src/CBot/CBotStack.cpp
@@ -63,7 +63,7 @@ CBotStack* CBotStack::FirstStack()
pp->m_bOver = true;
pp ++;
}
-#ifdef _DEBUG
+#ifdef _DEBUG
int n = 1;
pp = p;
for ( i = 0 ; i< MAXSTACK+10 ; i++ )
@@ -120,7 +120,7 @@ void CBotStack::Delete()
m_index = n;
#endif
- if ( p == NULL )
+ if ( p == NULL )
free( this );
}
@@ -128,7 +128,7 @@ void CBotStack::Delete()
// routine improved
CBotStack* CBotStack::AddStack(CBotInstr* instr, bool bBlock)
{
- if (m_next != NULL)
+ if (m_next != NULL)
{
return m_next; // included in an existing stack
}
@@ -160,7 +160,7 @@ CBotStack* CBotStack::AddStack(CBotInstr* instr, bool bBlock)
CBotStack* CBotStack::AddStackEOX(CBotCall* instr, bool bBlock)
{
- if (m_next != NULL)
+ if (m_next != NULL)
{
if ( m_next == EOX )
{
@@ -177,7 +177,7 @@ CBotStack* CBotStack::AddStackEOX(CBotCall* instr, bool bBlock)
CBotStack* CBotStack::AddStack2(bool bBlock)
{
- if (m_next2 != NULL)
+ if (m_next2 != NULL)
{
m_next2->m_prog = m_prog; // special avoids RestoreStack2
return m_next2; // included in an existing stack
@@ -251,8 +251,8 @@ CBotStack::CBotStack(CBotStack* ppapa)
if (ppapa == NULL) m_timer = m_initimer; // sets the timer at the beginning
m_listVar = NULL;
- m_bDontDelete = false;
-
+ m_bDontDelete = false;
+
m_var = NULL;
m_prog = NULL;
m_instr = NULL;
@@ -275,7 +275,7 @@ CBotStack::~CBotStack()
// \TODO routine has/to optimize
CBotStack* CBotStack::AddStack(CBotInstr* instr, bool bBlock)
{
- if (m_next != NULL)
+ if (m_next != NULL)
{
return m_next; // included in an existing stack
}
@@ -290,7 +290,7 @@ CBotStack* CBotStack::AddStack(CBotInstr* instr, bool bBlock)
CBotStack* CBotStack::AddStackEOX(CBotCall* instr, bool bBlock)
{
- if (m_next != NULL)
+ if (m_next != NULL)
{
if ( m_next == EOX )
{
@@ -311,7 +311,7 @@ CBotStack* CBotStack::AddStackEOX(CBotCall* instr, bool bBlock)
CBotStack* CBotStack::AddStack2(bool bBlock)
{
- if (m_next2 != NULL)
+ if (m_next2 != NULL)
{
m_next2->m_prog = m_prog; // special avoids RestoreStack2
return m_next2; // included in an existing stack
@@ -362,7 +362,7 @@ void CBotStack::Reset(void* pUser)
CBotStack* CBotStack::RestoreStack(CBotInstr* instr)
{
- if (m_next != NULL)
+ if (m_next != NULL)
{
m_next->m_instr = instr; // reset (if recovery after )
m_next->m_prog = m_prog;
@@ -480,7 +480,7 @@ CBotVar* CBotStack::FindVar(CBotToken* &pToken, bool bUpdate, bool bModif)
{
if (pp->GetName() == name)
{
- if ( bUpdate )
+ if ( bUpdate )
pp->Maj(m_pUser, false);
return pp;
@@ -521,7 +521,7 @@ CBotVar* CBotStack::FindVar(long ident, bool bUpdate, bool bModif)
{
if (pp->GetUniqNum() == ident)
{
- if ( bUpdate )
+ if ( bUpdate )
pp->Maj(m_pUser, false);
return pp;
@@ -552,7 +552,7 @@ CBotVar* CBotStack::CopyVar(CBotToken& Token, bool bUpdate)
return pCopy;
}
-
+
bool CBotStack::SetState(int n, int limite)
{
m_state = n;
@@ -609,7 +609,7 @@ bool CBotStack::Execute()
while (p != NULL)
{
if ( p->m_next2 != NULL ) break;
- if ( p->m_call != NULL )
+ if ( p->m_call != NULL )
{
instr = p->m_call;
pile = p->m_prev ;
@@ -684,7 +684,7 @@ void CBotStack::AddVar(CBotVar* pVar)
while (p != NULL && p->m_bBlock == 0) p = p->m_prev;
if ( p == NULL ) return;
-
+
/// p->m_bDontDelete = bDontDelete;
CBotVar** pp = &p->m_listVar;
@@ -787,7 +787,7 @@ void CBotStack::GetRunPos(const char* &FunctionName, int &start, int &end)
{
if ( p->m_instr != NULL ) instr = p->m_instr;
if ( p->m_bFunc == 1 ) funct = p->m_instr;
- if ( p->m_next->m_prog != prog ) break ;
+ if ( p->m_next->m_prog != prog ) break ;
if (p->m_next2 && p->m_next2->m_state != 0) p = p->m_next2 ;
else p = p->m_next;
@@ -818,7 +818,7 @@ CBotVar* CBotStack::GetStackVars(const char* &FunctionName, int level)
while (p->m_next != NULL)
{
- if ( p->m_next->m_prog != prog ) break ;
+ if ( p->m_next->m_prog != prog ) break ;
if (p->m_next2 && p->m_next2->m_state != 0) p = p->m_next2 ;
else p = p->m_next;
@@ -848,7 +848,7 @@ CBotVar* CBotStack::GetStackVars(const char* &FunctionName, int level)
CBotToken* t = pp->m_instr->GetToken();
FunctionName = t->GetString();
-
+
return p->m_listVar;
}
@@ -872,8 +872,8 @@ bool CBotStack::SaveState(FILE* pf)
if (!WriteWord(pf, m_state)) return false; // in what state?
if (!WriteWord(pf, 0)) return false; // by compatibility m_bDontDelete
if (!WriteWord(pf, m_step)) return false; // in what state?
-
-
+
+
if (!SaveVar(pf, m_var)) return false; // current result
if (!SaveVar(pf, m_listVar)) return false; // local variables
@@ -921,7 +921,7 @@ bool CBotStack::RestoreState(FILE* pf, CBotStack* &pStack)
bool CBotVar::Save0State(FILE* pf)
-{
+{
if (!WriteWord(pf, 100+m_mPrivate))return false; // private variable?
if (!WriteWord(pf, m_bStatic))return false; // static variable?
if (!WriteWord(pf, m_type.GetType()))return false; // saves the type (always non-zero)
@@ -930,11 +930,11 @@ bool CBotVar::Save0State(FILE* pf)
}
bool CBotVarInt::Save0State(FILE* pf)
-{
+{
if ( !m_defnum.IsEmpty() )
{
if(!WriteWord(pf, 200 )) return false; // special marker
- if(!WriteString(pf, m_defnum)) return false; // name of the value
+ if(!WriteString(pf, m_defnum)) return false; // name of the value
}
return CBotVar::Save0State(pf);
@@ -1051,7 +1051,7 @@ bool CBotVar::RestoreState(FILE* pf, CBotVar* &pVar)
if ( p != NULL )
{
delete pNew;
- pNew = p; // resume known element
+ pNew = p; // resume known element
}
}
}
@@ -1167,7 +1167,7 @@ CBotCStack* CBotCStack::TokenStack(CBotToken* pToken, bool bBlock)
CBotInstr* CBotCStack::Return(CBotInstr* inst, CBotCStack* pfils)
-{
+{
if ( pfils == this ) return inst;
if (m_var != NULL) delete m_var; // value replaced?
@@ -1185,7 +1185,7 @@ CBotInstr* CBotCStack::Return(CBotInstr* inst, CBotCStack* pfils)
}
CBotFunction* CBotCStack::ReturnFunc(CBotFunction* inst, CBotCStack* pfils)
-{
+{
if (m_var != NULL) delete m_var; // value replaced?
m_var = pfils->m_var; // result transmitted
pfils->m_var = NULL; // not to destroy the variable
@@ -1292,7 +1292,7 @@ bool CBotCStack::IsOk()
return (m_error == 0);
}
-
+
void CBotCStack::SetStartError( int pos )
{
if ( m_error != 0) return; // does not change existing error
diff --git a/src/CBot/CBotString.cpp b/src/CBot/CBotString.cpp
index 51cae52..2929977 100644
--- a/src/CBot/CBotString.cpp
+++ b/src/CBot/CBotString.cpp
@@ -161,7 +161,7 @@ CBotString::CBotString(const CBotString& srcString)
int CBotString::GetLength()
{
if (m_ptr == NULL) return 0;
- return strlen( m_ptr );
+ return strlen( m_ptr );
}
@@ -336,7 +336,7 @@ const CBotString& CBotString::operator=(const CBotString& stringSrc)
delete[] m_ptr;
m_ptr = nullptr;
- m_lg = stringSrc.m_lg;
+ m_lg = stringSrc.m_lg;
if (m_lg > 0)
{
@@ -373,7 +373,7 @@ const CBotString& CBotString::operator=(const char ch)
{
delete[] m_ptr;
- m_lg = 1;
+ m_lg = 1;
m_ptr = new char[2];
m_ptr[0] = ch;
@@ -389,7 +389,7 @@ const CBotString& CBotString::operator=(const char* pString)
if (pString != nullptr)
{
- m_lg = strlen(pString);
+ m_lg = strlen(pString);
if (m_lg != 0)
{
@@ -520,7 +520,7 @@ int CBotString::Compare(const char * lpsz) const
char* p = m_ptr;
if (lpsz == NULL) lpsz = emptyString;
if (m_ptr == NULL) p = emptyString;
- return strcmp(p, lpsz); // wcscmp
+ return strcmp(p, lpsz); // wcscmp
}
const char * CBotString::MapIdToString(EID id)
diff --git a/src/CBot/CBotToken.cpp b/src/CBot/CBotToken.cpp
index f03ca91..48033a3 100644
--- a/src/CBot/CBotToken.cpp
+++ b/src/CBot/CBotToken.cpp
@@ -248,17 +248,15 @@ CBotToken* CBotToken::NextToken(char* &program, int& error, bool first)
{
while (c != 0 && !CharInList(c, nch))
{
- mot += c;
- c = *(program++); // next character
if ( c == '\\' )
{
c = *(program++); // next character
if ( c == 'n' ) c = '\n';
if ( c == 'r' ) c = '\r';
if ( c == 't' ) c = '\t';
- mot += c;
- c = *(program++); // next character
}
+ mot += c;
+ c = *(program++);
}
if ( c == '\"' )
{
@@ -474,7 +472,7 @@ void CBotToken::LoadKeyWords()
{
CBotString s;
int i, n = 0;
-
+
i = TokenKeyWord; //start with keywords of the language
while (s.LoadString(i))
{
diff --git a/src/CBot/CBotToken.h b/src/CBot/CBotToken.h
index 6f11bb2..a423375 100644
--- a/src/CBot/CBotToken.h
+++ b/src/CBot/CBotToken.h
@@ -36,3 +36,4 @@
extern bool IsOfType(CBotToken* &p, int type1, int type2 = -1);
extern bool IsOfTypeList(CBotToken* &p, int type1, ...);
+
diff --git a/src/CBot/CBotTwoOpExpr.cpp b/src/CBot/CBotTwoOpExpr.cpp
index dfaed9f..6a0d636 100644
--- a/src/CBot/CBotTwoOpExpr.cpp
+++ b/src/CBot/CBotTwoOpExpr.cpp
@@ -63,10 +63,10 @@ CBotLogicExpr::~CBotLogicExpr()
// acceptable type, operand
// zero ends level \TODO précéance
-static int ListOp[] =
+static int ListOp[] =
{
BOOLEEN, ID_LOGIC, 0,
- BOOLEEN, ID_TXT_OR,
+ BOOLEEN, ID_TXT_OR,
BOOLEEN, ID_LOG_OR, 0,
BOOLEEN, ID_TXT_AND,
BOOLEEN, ID_LOG_AND, 0,
@@ -76,7 +76,7 @@ static int ListOp[] =
BOOLEEN|ENTIER|FLOTANT
|CHAINE
|POINTER
- |INSTANCE,ID_EQ,
+ |INSTANCE,ID_EQ,
BOOLEEN|ENTIER|FLOTANT
|CHAINE
|POINTER
@@ -90,8 +90,8 @@ static int ListOp[] =
ENTIER, ID_ASR, 0,
ENTIER|FLOTANT|CHAINE, ID_ADD,
ENTIER|FLOTANT, ID_SUB, 0,
- ENTIER|FLOTANT, ID_MUL,
- ENTIER|FLOTANT, ID_DIV,
+ ENTIER|FLOTANT, ID_MUL,
+ ENTIER|FLOTANT, ID_DIV,
ENTIER|FLOTANT, ID_MODULO, 0,
ENTIER|FLOTANT, ID_POWER, 0,
0,
@@ -194,7 +194,7 @@ CBotInstr* CBotTwoOpExpr::Compile(CBotToken* &p, CBotCStack* pStack, int* pOpera
if ( NULL != (inst->m_rightop = CBotTwoOpExpr::Compile( p, pStk, pOp )) )
// expression (...) right
{
- // there is an second operand acceptable
+ // there is an second operand acceptable
type2 = pStk->GetTypResult(); // what kind of results?
@@ -327,7 +327,7 @@ bool CBotTwoOpExpr::Execute(CBotStack* &pStack)
}
- // requires a little more stack to avoid touching the result
+ // requires a little more stack to avoid touching the result
// of which is left on the stack, precisely
CBotStack* pStk2 = pStk1->AddStack(); // adds an item to the stack
@@ -566,3 +566,4 @@ void t(bool t)
t ? 0 : "test";
}
#endif
+
diff --git a/src/CBot/CBotVar.cpp b/src/CBot/CBotVar.cpp
index 7b0ce7b..ad3708d 100644
--- a/src/CBot/CBotVar.cpp
+++ b/src/CBot/CBotVar.cpp
@@ -134,8 +134,8 @@ void CBotVarClass::InitCBotVarClass( const CBotToken* name, CBotTypResult& type
m_LimExpr = NULL;
m_pVar = NULL;
m_type = type;
- if ( type.Eq(CBotTypArrayPointer) ) m_type.SetType( CBotTypArrayBody );
- else if ( !type.Eq(CBotTypArrayBody) ) m_type.SetType( CBotTypClass );
+ if ( type.Eq(CBotTypArrayPointer) ) m_type.SetType( CBotTypArrayBody );
+ else if ( !type.Eq(CBotTypArrayBody) ) m_type.SetType( CBotTypClass );
// officel type for this object
m_pClass = NULL;
@@ -394,7 +394,7 @@ CBotVar* CBotVar::Create( const char* n, CBotTypResult type)
CBotVarClass* instance = new CBotVarClass(&name, type);
CBotVarArray* array = new CBotVarArray(&name, type);
array->SetPointer( instance );
-
+
CBotVar* pv = array;
while (type.Eq(CBotTypArrayBody))
{
@@ -414,14 +414,14 @@ CBotVar* CBotVar::Create( const char* name, int type, CBotClass* pClass)
{
CBotToken token( name, "" );
CBotVar* pVar = Create( &token, type );
-
+
if ( type == CBotTypPointer && pClass == NULL ) // pointer "null" ?
return pVar;
if ( type == CBotTypClass || type == CBotTypPointer ||
type == CBotTypIntrinsic )
{
- if (pClass == NULL)
+ if (pClass == NULL)
{
delete pVar;
return NULL;
@@ -443,9 +443,9 @@ CBotTypResult CBotVar::GetTypResult(int mode)
{
CBotTypResult r = m_type;
- if ( mode == 1 && m_type.Eq(CBotTypClass) )
+ if ( mode == 1 && m_type.Eq(CBotTypClass) )
r.SetType(CBotTypPointer);
- if ( mode == 2 && m_type.Eq(CBotTypClass) )
+ if ( mode == 2 && m_type.Eq(CBotTypClass) )
r.SetType(CBotTypIntrinsic);
return r;
@@ -453,9 +453,9 @@ CBotTypResult CBotVar::GetTypResult(int mode)
int CBotVar::GetType(int mode)
{
- if ( mode == 1 && m_type.Eq(CBotTypClass) )
+ if ( mode == 1 && m_type.Eq(CBotTypClass) )
return CBotTypPointer;
- if ( mode == 2 && m_type.Eq(CBotTypClass) )
+ if ( mode == 2 && m_type.Eq(CBotTypClass) )
return CBotTypIntrinsic;
return m_type.GetType();
}
@@ -620,7 +620,7 @@ void CBotVar::SetVal(CBotVar* var)
ASM_TRAP();
}
- m_binit = var->m_binit; // copie l'état nan s'il y a
+ m_binit = var->m_binit; // copie l'état nan s'il y a
}
void CBotVar::SetStatic(bool bStatic)
@@ -1293,7 +1293,7 @@ void CBotVarBoolean::XOr(CBotVar* left, CBotVar* right)
void CBotVarBoolean::Not()
{
- m_val = m_val ? false : true ;
+ m_val = m_val ? false : true ;
}
bool CBotVarBoolean::Eq(CBotVar* left, CBotVar* right)
@@ -1468,7 +1468,7 @@ void CBotVarClass::SetClass(CBotClass* pClass)//, int &nIdent)
CBotInstr* p = pv->m_LimExpr; // the different formulas
if ( p != NULL )
{
- CBotStack* pile = CBotStack::FirstStack(); // an independent stack
+ CBotStack* pile = CBotStack::FirstStack(); // an independent stack
int n = 0;
int max[100];
@@ -1524,7 +1524,7 @@ CBotClass* CBotVarClass::GetClass()
void CBotVarClass::Maj(void* pUser, bool bContinu)
{
-/* if (!bContinu && m_pMyThis != NULL)
+/* if (!bContinu && m_pMyThis != NULL)
m_pMyThis->Maj(pUser, true);*/
// an update routine exist?
@@ -1671,7 +1671,7 @@ void CBotVarClass::IncrementUse()
void CBotVarClass::DecrementUse()
{
m_CptUse--;
- if ( m_CptUse == 0 )
+ if ( m_CptUse == 0 )
{
// if there is one, call the destructor
// but only if a constructor had been called.
@@ -2025,7 +2025,7 @@ bool CBotVarPointer::Save1State(FILE* pf)
if (!WriteLong(pf, GetIdent())) return false; // the unique reference
- // also saves the proceedings copies
+ // also saves the proceedings copies
return SaveVar(pf, GetPointer());
}
@@ -2082,7 +2082,7 @@ bool CBotVarPointer::Ne(CBotVar* left, CBotVar* right)
///////////////////////////////////////////////////////
-// management of results types
+// management of results types
CBotTypResult::CBotTypResult(int type)
@@ -2164,7 +2164,7 @@ int CBotTypResult::GetType(int mode) const
if ( m_pClass == NULL ) ASM_TRAP();
-
+
if ( m_type == CBotTypArrayPointer )
if ( m_pNext == NULL ) ASM_TRAP();
#endif
@@ -2245,4 +2245,3 @@ CBotTypResult&
return *this;
}
-
diff --git a/src/CBot/CBotWhile.cpp b/src/CBot/CBotWhile.cpp
index d24dc4b..73bcab9 100644
--- a/src/CBot/CBotWhile.cpp
+++ b/src/CBot/CBotWhile.cpp
@@ -112,16 +112,16 @@ bool CBotWhile :: Execute(CBotStack* &pj)
// the condition is true, pass in the second mode
if (!pile->SetState(1)) return false; // ready for further
-
+
case 1:
// evaluates the associated statement block
- if ( m_Block != NULL &&
+ if ( m_Block != NULL &&
!m_Block->Execute(pile) )
{
if (pile->IfContinue(0, m_label)) continue; // if continued, will return to test
return pj->BreakReturn(pile, m_label); // sends the results and releases the stack
}
-
+
// terminates if there is an error
if ( !pile->IsOk() )
{
@@ -130,7 +130,7 @@ bool CBotWhile :: Execute(CBotStack* &pj)
// returns to the test again
if (!pile->SetState(0, 0)) return false;
- continue;
+ continue;
}
}
@@ -140,18 +140,18 @@ void CBotWhile :: RestoreState(CBotStack* &pj, bool bMain)
CBotStack* pile = pj->RestoreStack(this); // adds an item to the stack
if ( pile == NULL ) return;
- switch( pile->GetState() )
+ switch( pile->GetState() )
{ // there are two possible states (depending on recovery)
case 0:
// evaluates the condition
- m_Condition->RestoreState(pile, bMain);
+ m_Condition->RestoreState(pile, bMain);
return;
-
+
case 1:
// evaluates the associated statement block
if ( m_Block != NULL ) m_Block->RestoreState(pile, bMain);
return;
- }
+ }
}
@@ -231,13 +231,13 @@ bool CBotDo :: Execute(CBotStack* &pj)
{ // there are two possible states (depending on recovery)
case 0:
// evaluates the associated statement block
- if ( m_Block != NULL &&
+ if ( m_Block != NULL &&
!m_Block->Execute(pile) )
{
if (pile->IfContinue(1, m_label)) continue; // if continued, will return to test
return pj->BreakReturn(pile, m_label); // sends the results and releases the stack
}
-
+
// terminates if there is an error
if ( !pile->IsOk() )
{
@@ -245,7 +245,7 @@ bool CBotDo :: Execute(CBotStack* &pj)
}
if (!pile->SetState(1)) return false; // ready for further
-
+
case 1:
// evaluates the condition
if ( !m_Condition->Execute(pile) ) return false; // interrupted here ?
@@ -260,7 +260,7 @@ bool CBotDo :: Execute(CBotStack* &pj)
// returns to instruction block to start
if (!pile->SetState(0, 0)) return false;
- continue;
+ continue;
}
}
@@ -277,7 +277,7 @@ void CBotDo :: RestoreState(CBotStack* &pj, bool bMain)
// restores the assosiated statement's block
if ( m_Block != NULL ) m_Block->RestoreState(pile, bMain);
return;
-
+
case 1:
// restores the condition
m_Condition->RestoreState(pile, bMain);
@@ -302,9 +302,9 @@ CBotFor::CBotFor()
CBotFor::~CBotFor()
{
- delete m_Init;
- delete m_Test;
- delete m_Incr;
+ delete m_Init;
+ delete m_Test;
+ delete m_Incr;
delete m_Block; // frees the instruction block
}
@@ -386,7 +386,7 @@ bool CBotFor :: Execute(CBotStack* &pj)
if ( m_Init != NULL &&
!m_Init->Execute(pile) ) return false; // interrupted here ?
if (!pile->SetState(1)) return false; // ready for further
-
+
case 1:
// evaluates the condition
if ( m_Test != NULL ) // no strings attached? -> True!
@@ -404,10 +404,10 @@ bool CBotFor :: Execute(CBotStack* &pj)
// la condition est vrai, passe à la suite
if (!pile->SetState(2)) return false; // ready for further
-
+
case 2:
// evaluates the associated statement block
- if ( m_Block != NULL &&
+ if ( m_Block != NULL &&
!m_Block->Execute(pile) )
{
if (pile->IfContinue(3, m_label)) continue; // if continued, going on to incrementation
@@ -429,7 +429,7 @@ bool CBotFor :: Execute(CBotStack* &pj)
// returns to the test again
if (!pile->SetState(1, 0)) return false; // returns to the test
- continue;
+ continue;
}
}
@@ -446,7 +446,7 @@ void CBotFor :: RestoreState(CBotStack* &pj, bool bMain)
// initialize
if ( m_Init != NULL ) m_Init->RestoreState(pile, true); // interrupted here !
return;
-
+
case 1:
if ( m_Init != NULL ) m_Init->RestoreState(pile, false); // variables definitions
@@ -543,7 +543,7 @@ void CBotListExpression::RestoreState(CBotStack* &pj, bool bMain)
{
CBotStack* pile = pj;
int state = 0x7000;
-
+
if ( bMain )
{
pile = pj->RestoreStack();
@@ -615,7 +615,7 @@ CBotInstr* CBotSwitch::Compile(CBotToken* &p, CBotCStack* pStack)
CBotInstr* i = CBotCase::Compile( p, pStk2 );
if (i == NULL)
{
- delete inst;
+ delete inst;
return pStack->Return(NULL, pStk2);
}
delete pStk2;
@@ -623,7 +623,7 @@ CBotInstr* CBotSwitch::Compile(CBotToken* &p, CBotCStack* pStack)
else inst->m_Block->AddNext(i);
continue;
}
-
+
if ( inst->m_Block == NULL )
{
pStk->SetError(TX_NOCASE, p->GetStart());
@@ -647,7 +647,7 @@ CBotInstr* CBotSwitch::Compile(CBotToken* &p, CBotCStack* pStack)
}
}
DecLvl();
-
+
if ( inst->m_Block == NULL )
{
pStk->SetError(TX_NOCASE, p->GetStart());
@@ -674,7 +674,7 @@ CBotInstr* CBotSwitch::Compile(CBotToken* &p, CBotCStack* pStack)
bool CBotSwitch :: Execute(CBotStack* &pj)
{
- CBotStack* pile1 = pj->AddStack(this); // adds an item to the stack
+ CBotStack* pile1 = pj->AddStack(this); // adds an item to the stack
// if ( pile1 == EOX ) return true;
CBotInstr* p = m_Block; // first expression
@@ -723,7 +723,7 @@ void CBotSwitch :: RestoreState(CBotStack* &pj, bool bMain)
{
if ( !bMain ) return;
- CBotStack* pile1 = pj->RestoreStack(this); // adds an item to the stack
+ CBotStack* pile1 = pj->RestoreStack(this); // adds an item to the stack
if ( pile1 == NULL ) return;
CBotInstr* p = m_Block; // first expression
@@ -912,7 +912,7 @@ CBotTry::~CBotTry()
delete m_ListCatch; // frees the list
delete m_Block; // frees the instruction block
delete m_FinalInst;
-}
+}
CBotInstr* CBotTry::Compile(CBotToken* &p, CBotCStack* pStack)
{
@@ -926,7 +926,7 @@ CBotInstr* CBotTry::Compile(CBotToken* &p, CBotCStack* pStack)
inst->m_Block = CBotBlock::CompileBlkOrInst( p, pStk );
CBotCatch** pn = &inst->m_ListCatch;
-
+
while (pStk->IsOk() && p->GetType() == ID_CATCH)
{
CBotCatch* i = CBotCatch::Compile(p, pStk);
@@ -1011,7 +1011,7 @@ bool CBotTry :: Execute(CBotStack* &pj)
if ( !pc->Execute(pile2) ) return false; // performs the operation
if ( m_FinalInst == NULL )
return pj->Return(pile2); // ends the try
-
+
pile1->SetState(-2); // passes final
break;
}
@@ -1019,13 +1019,13 @@ bool CBotTry :: Execute(CBotStack* &pj)
}
pc = pc->m_next;
}
- if ( m_FinalInst != NULL &&
+ if ( m_FinalInst != NULL &&
pile1->GetState() > 0 && val != 0 ) pile1->SetState(-1);// if stop then made the final
if (pile1->GetState() <= -1)
{
// pile0->SetState(1);
-
+
if (!m_FinalInst->Execute(pile2) && pile2->IsOk()) return false;
if (!pile2->IsOk()) return pj->Return(pile2); // keep this exception
pile2->SetError(pile1->GetState()==-1 ? val : 0); // gives the initial error
@@ -1176,7 +1176,7 @@ bool CBotCatch :: TestCatch(CBotStack* &pile, int val)
var->SetValInt( pile->GetVal() == val );
pile->SetVar(var); // calls on the stack
}
-
+
return true;
}
diff --git a/src/CBot/CMakeLists.txt b/src/CBot/CMakeLists.txt
index fecd18e..ecde61f 100644
--- a/src/CBot/CMakeLists.txt
+++ b/src/CBot/CMakeLists.txt
@@ -21,3 +21,4 @@ else()
ARCHIVE DESTINATION ${COLOBOT_INSTALL_LIB_DIR}
RUNTIME DESTINATION ${COLOBOT_INSTALL_BIN_DIR})
endif()
+
diff --git a/src/CBot/ClassFILE.cpp b/src/CBot/ClassFILE.cpp
index b0f7977..6906bd4 100644
--- a/src/CBot/ClassFILE.cpp
+++ b/src/CBot/ClassFILE.cpp
@@ -58,7 +58,7 @@ void PrepareFilename(CBotString &filename) //DD!
// gets the filename as a parameter
// execution
-bool rfconstruct (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception)
+bool rfconstruct (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception)
{
CBotString mode;
@@ -239,7 +239,7 @@ CBotTypResult cfopen (CBotVar* pThis, CBotVar* &pVar)
return CBotTypResult(CBotTypBoolean); //DR
}
-
+
// FILE :: close method
// execution
@@ -291,7 +291,7 @@ bool rfwrite (CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception)
if ( pVar->GetInit() != IS_DEF) { Exception = CBotErrNotOpen; return false; }
FILE* pFile= (FILE*)pVar->GetValInt();
-
+
int res = fputs(param+CBotString("\n"), pFile);
// on error throws an exception
diff --git a/src/CBot/StringFunctions.cpp b/src/CBot/StringFunctions.cpp
index d24c942..abdcc18 100644
--- a/src/CBot/StringFunctions.cpp
+++ b/src/CBot/StringFunctions.cpp
@@ -184,10 +184,10 @@ bool rStrMid( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
if ( pVar->GetNext() != NULL )
{
pVar = pVar->GetNext();
-
+
// which must be a number
if ( pVar->GetType() > CBotTypDouble ) { ex = TX_BADNUM ; return true; }
-
+
// retrieves this number
int l = pVar->GetValInt();
@@ -231,7 +231,7 @@ CBotTypResult cStrStrIntInt( CBotVar* &pVar, void* pUser )
// third parameter optional
if ( pVar->GetNext() != NULL )
{
-
+
pVar = pVar->GetNext();
// which must be a number
if ( pVar->GetType() > CBotTypDouble )
@@ -434,3 +434,4 @@ void InitStringFunctions()
CBotProgram::AddFunction("strupper", rStrUpper, cStrStr );
CBotProgram::AddFunction("strlower", rStrLower, cStrStr );
}
+
diff --git a/src/CBot/idees.txt b/src/CBot/idees.txt
index 3966ee1..3f335da 100644
--- a/src/CBot/idees.txt
+++ b/src/CBot/idees.txt
@@ -39,3 +39,4 @@ the object being created with CBotVar :: Create (name, pClasse)
not destroy the object when there imédiatement pointers
but marked as virtually destroyed
+
diff --git a/src/CBot/resource.h b/src/CBot/resource.h
index f0449b0..9c7e82e 100644
--- a/src/CBot/resource.h
+++ b/src/CBot/resource.h
@@ -176,3 +176,4 @@ enum EID
#define TX_ERRWRITE 6015
#define TX_MAX 6016
+
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 26c02bc..6318ef2 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -28,7 +28,7 @@ endif()
# Additional libraries per platform
if (${MXE}) # MXE requires special treatment
- set(PLATFORM_LIBS ${MXE_LIBS})
+ set(PLATFORM_LIBS ${MXE_LIBS})
elseif (${PLATFORM_WINDOWS})
# because it isn't included in standard linking libraries
set(PLATFORM_LIBS "-lintl")
@@ -120,6 +120,7 @@ object/mainmovie.cpp
object/motion/motion.cpp
object/motion/motionant.cpp
object/motion/motionbee.cpp
+object/motion/motiondummy.cpp
object/motion/motionhuman.cpp
object/motion/motionmother.cpp
object/motion/motionspider.cpp
@@ -154,6 +155,7 @@ physics/physics.cpp
script/cbottoken.cpp
script/cmdtoken.cpp
script/script.cpp
+sound/sound.cpp
ui/button.cpp
ui/check.cpp
ui/color.cpp
@@ -228,3 +230,4 @@ target_link_libraries(colobot ${LIBS})
install(TARGETS colobot RUNTIME DESTINATION ${COLOBOT_INSTALL_BIN_DIR})
set_target_properties(colobot PROPERTIES INSTALL_RPATH ${COLOBOT_INSTALL_LIB_DIR})
+
diff --git a/src/app/README.txt b/src/app/README.txt
index 92be8a6..57a2785 100644
--- a/src/app/README.txt
+++ b/src/app/README.txt
@@ -2,3 +2,4 @@
* \dir src/app
* Main class of the application and system functions
*/
+
diff --git a/src/app/app.cpp b/src/app/app.cpp
index 6231eb6..932e61e 100644
--- a/src/app/app.cpp
+++ b/src/app/app.cpp
@@ -146,23 +146,24 @@ CApplication::CApplication()
m_dataPath = COLOBOT_DEFAULT_DATADIR;
m_langPath = COLOBOT_I18N_DIR;
+ m_texPackPath = "";
m_language = LANGUAGE_ENV;
m_lowCPU = true;
for (int i = 0; i < DIR_MAX; ++i)
- m_dataDirs[i] = nullptr;
+ m_standardDataDirs[i] = nullptr;
- m_dataDirs[DIR_AI] = "ai";
- m_dataDirs[DIR_FONT] = "fonts";
- m_dataDirs[DIR_HELP] = "help";
- m_dataDirs[DIR_ICON] = "icons";
- m_dataDirs[DIR_LEVEL] = "levels";
- m_dataDirs[DIR_MODEL] = "models";
- m_dataDirs[DIR_MUSIC] = "music";
- m_dataDirs[DIR_SOUND] = "sounds";
- m_dataDirs[DIR_TEXTURE] = "textures";
+ m_standardDataDirs[DIR_AI] = "ai";
+ m_standardDataDirs[DIR_FONT] = "fonts";
+ m_standardDataDirs[DIR_HELP] = "help";
+ m_standardDataDirs[DIR_ICON] = "icons";
+ m_standardDataDirs[DIR_LEVEL] = "levels";
+ m_standardDataDirs[DIR_MODEL] = "models";
+ m_standardDataDirs[DIR_MUSIC] = "music";
+ m_standardDataDirs[DIR_SOUND] = "sounds";
+ m_standardDataDirs[DIR_TEXTURE] = "textures";
}
CApplication::~CApplication()
@@ -170,6 +171,9 @@ CApplication::~CApplication()
delete m_private;
m_private = nullptr;
+ delete m_objMan;
+ m_objMan = nullptr;
+
delete m_eventQueue;
m_eventQueue = nullptr;
@@ -216,7 +220,8 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
OPT_LOGLEVEL,
OPT_LANGUAGE,
OPT_LANGDIR,
- OPT_VBO
+ OPT_VBO,
+ OPT_TEXPACK
};
option options[] =
@@ -227,7 +232,9 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
{ "loglevel", required_argument, nullptr, OPT_LOGLEVEL },
{ "language", required_argument, nullptr, OPT_LANGUAGE },
{ "langdir", required_argument, nullptr, OPT_LANGDIR },
- { "vbo", required_argument, nullptr, OPT_VBO }
+ { "vbo", required_argument, nullptr, OPT_VBO },
+ { "texpack", required_argument, nullptr, OPT_TEXPACK },
+ { nullptr, 0, nullptr, 0}
};
opterr = 0;
@@ -264,6 +271,7 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
GetLogger()->Message(" -language lang set language (one of: en, de, fr, pl)\n");
GetLogger()->Message(" -langdir path set custom language directory path\n");
GetLogger()->Message(" -vbo mode set OpenGL VBO mode (one of: auto, enable, disable)\n");
+ GetLogger()->Message(" -texpack path set path to custom texture pack\n");
return PARSE_ARGS_HELP;
}
case OPT_DEBUG:
@@ -277,6 +285,18 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
GetLogger()->Info("Using custom data dir: '%s'\n", m_dataPath.c_str());
break;
}
+ case OPT_LANGDIR:
+ {
+ m_langPath = optarg;
+ GetLogger()->Info("Using custom language dir: '%s'\n", m_langPath.c_str());
+ break;
+ }
+ case OPT_TEXPACK:
+ {
+ m_texPackPath = optarg;
+ GetLogger()->Info("Using texturepack: '%s'\n", m_texPackPath.c_str());
+ break;
+ }
case OPT_LOGLEVEL:
{
LogLevel logLevel;
@@ -303,12 +323,6 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
m_language = language;
break;
}
- case OPT_LANGDIR:
- {
- m_langPath = optarg;
- GetLogger()->Info("Using custom language dir: '%s'\n", m_langPath.c_str());
- break;
- }
case OPT_VBO:
{
std::string vbo;
@@ -337,8 +351,22 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
bool CApplication::Create()
{
+ std::string path;
+ bool defaultValues = false;
+
GetLogger()->Info("Creating CApplication\n");
+ if (!GetProfile().InitCurrentDirectory())
+ {
+ GetLogger()->Warn("Config not found. Default values will be used!\n");
+ defaultValues = true;
+ }
+ else
+ {
+ if (GetProfile().GetLocalProfileString("Resources", "Data", path))
+ m_dataPath = path;
+ }
+
boost::filesystem::path dataPath(m_dataPath);
if (! (boost::filesystem::exists(dataPath) && boost::filesystem::is_directory(dataPath)) )
{
@@ -350,41 +378,47 @@ bool CApplication::Create()
return false;
}
+ GetProfile().SetLocalProfileString("Resources", "Data", m_dataPath);
+
SetLanguage(m_language);
//Create the sound instance.
- if (!GetProfile().InitCurrentDirectory())
+ #ifdef OPENAL_SOUND
+ m_sound = static_cast<CSoundInterface *>(new ALSound());
+ #else
+ GetLogger()->Info("No sound support.\n");
+ m_sound = new CSoundInterface();
+ #endif
+
+ m_sound->Create(true);
+
+ // Cache sound files
+ if (defaultValues)
{
- GetLogger()->Warn("Config not found. Default values will be used!\n");
- m_sound = new CSoundInterface();
+ GetProfile().SetLocalProfileString("Resources", "Sound", GetDataSubdirPath(DIR_SOUND));
+ GetProfile().SetLocalProfileString("Resources", "Music", GetDataSubdirPath(DIR_MUSIC));
+ }
+
+ if (GetProfile().GetLocalProfileString("Resources", "Sound", path))
+ {
+ m_sound->CacheAll(path);
}
else
{
- std::string path;
- if (GetProfile().GetLocalProfileString("Resources", "Data", path))
- m_dataPath = path;
-
- #ifdef OPENAL_SOUND
- m_sound = static_cast<CSoundInterface *>(new ALSound());
- #else
- GetLogger()->Info("No sound support.\n");
- m_sound = new CSoundInterface();
- #endif
-
- m_sound->Create(true);
- if (GetProfile().GetLocalProfileString("Resources", "Sound", path)) {
- m_sound->CacheAll(path);
- } else {
- m_sound->CacheAll(GetDataSubdirPath(DIR_SOUND));
- }
+ m_sound->CacheAll(GetDataSubdirPath(DIR_SOUND));
+ }
- if (GetProfile().GetLocalProfileString("Resources", "Music", path)) {
- m_sound->AddMusicFiles(path);
- } else {
- m_sound->AddMusicFiles(GetDataSubdirPath(DIR_MUSIC));
- }
+ if (GetProfile().GetLocalProfileString("Resources", "Music", path))
+ {
+ m_sound->AddMusicFiles(path);
+ }
+ else
+ {
+ m_sound->AddMusicFiles(GetDataSubdirPath(DIR_MUSIC));
}
+ GetLogger()->Info("CApplication created successfully\n");
+
std::string standardInfoMessage =
"\nPlease see the console output or log file\n"
"to get more information on the source of error";
@@ -479,11 +513,11 @@ bool CApplication::Create()
m_modelManager = new Gfx::CModelManager(m_engine);
// Create the robot application.
- m_robotMain = new CRobotMain(this);
+ m_robotMain = new CRobotMain(this, !defaultValues);
- m_robotMain->ChangePhase(PHASE_WELCOME1);
+ if (defaultValues) m_robotMain->CreateIni();
- GetLogger()->Info("CApplication created successfully\n");
+ m_robotMain->ChangePhase(PHASE_WELCOME1);
return true;
}
@@ -940,12 +974,12 @@ end:
return m_exitCode;
}
-int CApplication::GetExitCode()
+int CApplication::GetExitCode() const
{
return m_exitCode;
}
-const std::string& CApplication::GetErrorMessage()
+const std::string& CApplication::GetErrorMessage() const
{
return m_errorMessage;
}
@@ -1239,7 +1273,7 @@ void CApplication::ResumeSimulation()
GetLogger()->Info("Resume simulation\n");
}
-bool CApplication::GetSimulationSuspended()
+bool CApplication::GetSimulationSuspended() const
{
return m_simulationSuspended;
}
@@ -1297,48 +1331,48 @@ Event CApplication::CreateUpdateEvent()
return frameEvent;
}
-float CApplication::GetSimulationSpeed()
+float CApplication::GetSimulationSpeed() const
{
return m_simulationSpeed;
}
-float CApplication::GetAbsTime()
+float CApplication::GetAbsTime() const
{
return m_absTime;
}
-long long CApplication::GetExactAbsTime()
+long long CApplication::GetExactAbsTime() const
{
return m_exactAbsTime;
}
-long long CApplication::GetRealAbsTime()
+long long CApplication::GetRealAbsTime() const
{
return m_realAbsTime;
}
-float CApplication::GetRelTime()
+float CApplication::GetRelTime() const
{
return m_relTime;
}
-long long CApplication::GetExactRelTime()
+long long CApplication::GetExactRelTime() const
{
return m_exactRelTime;
}
-long long CApplication::GetRealRelTime()
+long long CApplication::GetRealRelTime() const
{
return m_realRelTime;
}
-Gfx::GLDeviceConfig CApplication::GetVideoConfig()
+Gfx::GLDeviceConfig CApplication::GetVideoConfig() const
{
return m_deviceConfig;
}
VideoQueryResult CApplication::GetVideoResolutionList(std::vector<Math::IntPoint> &resolutions,
- bool fullScreen, bool resizeable)
+ bool fullScreen, bool resizeable) const
{
resolutions.clear();
@@ -1385,27 +1419,27 @@ void CApplication::SetDebugMode(bool mode)
m_debugMode = mode;
}
-bool CApplication::GetDebugMode()
+bool CApplication::GetDebugMode() const
{
return m_debugMode;
}
-int CApplication::GetKmods()
+int CApplication::GetKmods() const
{
return m_kmodState;
}
-bool CApplication::GetKmodState(int kmod)
+bool CApplication::GetKmodState(int kmod) const
{
return (m_kmodState & kmod) != 0;
}
-bool CApplication::GetTrackedKeyState(TrackedKey key)
+bool CApplication::GetTrackedKeyState(TrackedKey key) const
{
return (m_trackedKeys & key) != 0;
}
-bool CApplication::GetMouseButtonState(int index)
+bool CApplication::GetMouseButtonState(int index) const
{
return (m_mouseButtonsState & (1<<index)) != 0;
}
@@ -1423,7 +1457,7 @@ void CApplication::SetGrabInput(bool grab)
SDL_WM_GrabInput(grab ? SDL_GRAB_ON : SDL_GRAB_OFF);
}
-bool CApplication::GetGrabInput()
+bool CApplication::GetGrabInput() const
{
int result = SDL_WM_GrabInput(SDL_GRAB_QUERY);
return result == SDL_GRAB_ON;
@@ -1438,12 +1472,12 @@ void CApplication::SetMouseMode(MouseMode mode)
SDL_ShowCursor(SDL_DISABLE);
}
-MouseMode CApplication::GetMouseMode()
+MouseMode CApplication::GetMouseMode() const
{
return m_mouseMode;
}
-Math::Point CApplication::GetMousePos()
+Math::Point CApplication::GetMousePos() const
{
return m_mousePos;
}
@@ -1456,7 +1490,7 @@ void CApplication::MoveMouse(Math::Point pos)
SDL_WarpMouse(windowPos.x, windowPos.y);
}
-std::vector<JoystickDevice> CApplication::GetJoystickList()
+std::vector<JoystickDevice> CApplication::GetJoystickList() const
{
std::vector<JoystickDevice> result;
@@ -1473,7 +1507,7 @@ std::vector<JoystickDevice> CApplication::GetJoystickList()
return result;
}
-JoystickDevice CApplication::GetJoystick()
+JoystickDevice CApplication::GetJoystick() const
{
return m_joystick;
}
@@ -1495,36 +1529,37 @@ void CApplication::SetJoystickEnabled(bool enable)
}
}
-bool CApplication::GetJoystickEnabled()
+bool CApplication::GetJoystickEnabled() const
{
return m_joystickEnabled;
}
-std::string CApplication::GetDataDirPath()
+std::string CApplication::GetDataDirPath() const
{
return m_dataPath;
}
-std::string CApplication::GetDataSubdirPath(DataDir stdDir)
+std::string CApplication::GetDataSubdirPath(DataDir stdDir) const
{
int index = static_cast<int>(stdDir);
assert(index >= 0 && index < DIR_MAX);
std::stringstream str;
str << m_dataPath;
str << "/";
- str << m_dataDirs[index];
+ str << m_standardDataDirs[index];
return str.str();
}
-std::string CApplication::GetDataFilePath(DataDir stdDir, const std::string& subpath)
+std::string CApplication::GetDataFilePath(DataDir stdDir, const std::string& subpath) const
{
int index = static_cast<int>(stdDir);
assert(index >= 0 && index < DIR_MAX);
std::stringstream str;
str << m_dataPath;
str << "/";
- str << m_dataDirs[index];
- if (stdDir == DIR_HELP) {
+ str << m_standardDataDirs[index];
+ if (stdDir == DIR_HELP)
+ {
str << "/";
str << GetLanguageChar();
}
@@ -1533,12 +1568,31 @@ std::string CApplication::GetDataFilePath(DataDir stdDir, const std::string& sub
return str.str();
}
-Language CApplication::GetLanguage()
+std::string CApplication::GetTexPackFilePath(const std::string& textureName) const
+{
+ std::stringstream str;
+
+ if (! m_texPackPath.empty())
+ {
+ str << m_texPackPath;
+ str << "/";
+ str << textureName;
+ if (! boost::filesystem::exists(str.str()))
+ {
+ GetLogger()->Trace("Texture '%s' not in texpack\n", textureName.c_str());
+ str.str("");
+ }
+ }
+
+ return str.str();
+}
+
+Language CApplication::GetLanguage() const
{
return m_language;
}
-char CApplication::GetLanguageChar()
+char CApplication::GetLanguageChar() const
{
char langChar = 'E';
switch (m_language)
@@ -1630,7 +1684,7 @@ void CApplication::SetLanguage(Language language)
}
if (envLang == NULL)
{
- GetLogger()->Error("Failed to get language from environment, setting default language");
+ GetLogger()->Error("Failed to get language from environment, setting default language\n");
m_language = LANGUAGE_ENGLISH;
}
else if (strncmp(envLang,"en",2) == 0)
@@ -1673,7 +1727,7 @@ void CApplication::SetLowCPU(bool low)
m_lowCPU = low;
}
-bool CApplication::GetLowCPU()
+bool CApplication::GetLowCPU() const
{
return m_lowCPU;
}
@@ -1688,7 +1742,7 @@ void CApplication::StopPerformanceCounter(PerformanceCounter counter)
GetSystemUtils()->GetCurrentTimeStamp(m_performanceCounters[counter][1]);
}
-float CApplication::GetPerformanceCounterData(PerformanceCounter counter)
+float CApplication::GetPerformanceCounterData(PerformanceCounter counter) const
{
return m_performanceCountersData[counter];
}
diff --git a/src/app/app.h b/src/app/app.h
index 07f1b90..34028c7 100644
--- a/src/app/app.h
+++ b/src/app/app.h
@@ -209,20 +209,20 @@ public:
//! Main event loop
int Run();
//! Returns the code to be returned at main() exit
- int GetExitCode();
+ int GetExitCode() const;
//! Returns the message of error (set to something if exit code is not 0)
- const std::string& GetErrorMessage();
+ const std::string& GetErrorMessage() const;
//! Cleans up before exit
void Destroy();
//! Returns a list of possible video modes
VideoQueryResult GetVideoResolutionList(std::vector<Math::IntPoint> &resolutions,
- bool fullScreen, bool resizeable);
+ bool fullScreen, bool resizeable) const;
//! Returns the current video mode
- Gfx::GLDeviceConfig GetVideoConfig();
+ Gfx::GLDeviceConfig GetVideoConfig() const;
//! Change the video mode to given mode
bool ChangeVideoConfig(const Gfx::GLDeviceConfig &newConfig);
@@ -232,35 +232,35 @@ public:
//! Resumes animation
void ResumeSimulation();
//! Returns whether simulation is suspended
- bool GetSimulationSuspended();
+ bool GetSimulationSuspended() const;
//@{
//! Management of simulation speed
void SetSimulationSpeed(float speed);
- float GetSimulationSpeed();
+ float GetSimulationSpeed() const;
//@}
//! Returns the absolute time counter [seconds]
- float GetAbsTime();
+ float GetAbsTime() const;
//! Returns the exact absolute time counter [nanoseconds]
- long long GetExactAbsTime();
+ long long GetExactAbsTime() const;
//! Returns the exact absolute time counter disregarding speed setting [nanoseconds]
- long long GetRealAbsTime();
+ long long GetRealAbsTime() const;
//! Returns the relative time since last update [seconds]
- float GetRelTime();
+ float GetRelTime() const;
//! Returns the exact realative time since last update [nanoseconds]
- long long GetExactRelTime();
+ long long GetExactRelTime() const;
//! Returns the exact relative time since last update disregarding speed setting [nanoseconds]
- long long GetRealRelTime();
+ long long GetRealRelTime() const;
//! Returns a list of available joystick devices
- std::vector<JoystickDevice> GetJoystickList();
+ std::vector<JoystickDevice> GetJoystickList() const;
//! Returns info about the current joystick
- JoystickDevice GetJoystick();
+ JoystickDevice GetJoystick() const;
//! Change the current joystick device
bool ChangeJoystick(const JoystickDevice &newJoystick);
@@ -268,7 +268,7 @@ public:
//! Management of joystick enable state
//@{
void SetJoystickEnabled(bool enable);
- bool GetJoystickEnabled();
+ bool GetJoystickEnabled() const;
//@}
//! Polls the state of joystick axes and buttons
@@ -278,15 +278,15 @@ public:
void UpdateMouse();
//! Returns the current key modifiers
- int GetKmods();
+ int GetKmods() const;
//! Returns whether the given kmod is active
- bool GetKmodState(int kmod);
+ bool GetKmodState(int kmod) const;
//! Returns whether the tracked key is pressed
- bool GetTrackedKeyState(TrackedKey key);
+ bool GetTrackedKeyState(TrackedKey key) const;
//! Returns whether the mouse button is pressed
- bool GetMouseButtonState(int index);
+ bool GetMouseButtonState(int index) const;
//! Resets tracked key states and modifiers
void ResetKeyStates();
@@ -294,17 +294,17 @@ public:
//! Management of the grab mode for input (keyboard & mouse)
//@{
void SetGrabInput(bool grab);
- bool GetGrabInput();
+ bool GetGrabInput() const;
//@}
//! Management of mouse mode
//@{
void SetMouseMode(MouseMode mode);
- MouseMode GetMouseMode();
+ MouseMode GetMouseMode() const;
//@}
//! Returns the position of mouse cursor (in interface coords)
- Math::Point GetMousePos();
+ Math::Point GetMousePos() const;
//! Moves (warps) the mouse cursor to the specified position (in interface coords)
void MoveMouse(Math::Point pos);
@@ -312,22 +312,25 @@ public:
//! Management of debug mode (prints more info in logger)
//@{
void SetDebugMode(bool mode);
- bool GetDebugMode();
+ bool GetDebugMode() const;
//@}
//! Returns the full path to data directory
- std::string GetDataDirPath();
+ std::string GetDataDirPath() const;
//! Returns the full path to a standard dir in data directory
- std::string GetDataSubdirPath(DataDir stdDir);
+ std::string GetDataSubdirPath(DataDir stdDir) const;
//! Returns the full path to a file in data directory given standard dir and subpath
- std::string GetDataFilePath(DataDir stdDir, const std::string &subpath);
+ std::string GetDataFilePath(DataDir stdDir, const std::string &subpath) const;
+
+ //! Returns the full path to a file in texture pack directory
+ std::string GetTexPackFilePath(const std::string& textureName) const;
//! Management of language
//@{
- Language GetLanguage();
- char GetLanguageChar();
+ Language GetLanguage() const;
+ char GetLanguageChar() const;
void SetLanguage(Language language);
static bool ParseLanguage(const std::string& str, Language& language);
//@}
@@ -335,14 +338,14 @@ public:
//! Management of sleep in main loop (lowers CPU usage)
//@{
void SetLowCPU(bool low);
- bool GetLowCPU();
+ bool GetLowCPU() const;
//@}
//! Management of performance counters
//@{
void StartPerformanceCounter(PerformanceCounter counter);
void StopPerformanceCounter(PerformanceCounter counter);
- float GetPerformanceCounterData(PerformanceCounter counter);
+ float GetPerformanceCounterData(PerformanceCounter counter) const;
//@}
protected:
@@ -462,7 +465,10 @@ protected:
//! Path to directory with language files
std::string m_langPath;
- const char* m_dataDirs[DIR_MAX];
+ //! Path to directory with user texture pack
+ std::string m_texPackPath;
+
+ const char* m_standardDataDirs[DIR_MAX];
//! Application language
Language m_language;
diff --git a/src/app/main.cpp b/src/app/main.cpp
index edb5828..4bd5daa 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -122,3 +122,4 @@ int SDL_MAIN_FUNC(int argc, char *argv[])
}
} // extern "C"
+
diff --git a/src/app/system.cpp b/src/app/system.cpp
index 743ed96..2eb68ba 100644
--- a/src/app/system.cpp
+++ b/src/app/system.cpp
@@ -188,12 +188,13 @@ float CSystemUtils::TimeStampDiff(SystemTimeStamp *before, SystemTimeStamp *afte
return result;
}
-std::string CSystemUtils::profileFileLocation()
+std::string CSystemUtils::GetProfileFileLocation()
{
- return std::string("colobot.ini");
+ return std::string("colobot.ini");
}
-std::string CSystemUtils::savegameDirectoryLocation()
+std::string CSystemUtils::GetSavegameDirectoryLocation()
{
- return std::string("savegame");
+ return std::string("savegame");
}
+
diff --git a/src/app/system.h b/src/app/system.h
index 6ae05d6..d22a519 100644
--- a/src/app/system.h
+++ b/src/app/system.h
@@ -131,10 +131,10 @@ public:
virtual long long TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after) = 0;
//! Returns the profile (colobot.ini) file location
- virtual std::string profileFileLocation();
+ virtual std::string GetProfileFileLocation();
//! Returns the savegame directory location
- virtual std::string savegameDirectoryLocation();
+ virtual std::string GetSavegameDirectoryLocation();
};
//! Global function to get CSystemUtils instance
@@ -142,3 +142,4 @@ inline CSystemUtils* GetSystemUtils()
{
return CSystemUtils::GetInstancePointer();
}
+
diff --git a/src/app/system_linux.cpp b/src/app/system_linux.cpp
index 01dd850..492af7d 100644
--- a/src/app/system_linux.cpp
+++ b/src/app/system_linux.cpp
@@ -95,9 +95,9 @@ long long CSystemUtilsLinux::TimeStampExactDiff(SystemTimeStamp *before, SystemT
(after->clockTime.tv_sec - before->clockTime.tv_sec) * 1000000000ll;
}
-std::string CSystemUtilsLinux::profileFileLocation()
+std::string CSystemUtilsLinux::GetProfileFileLocation()
{
- std::string m_profileFile;
+ std::string profileFile;
// Determine profileFile according to XDG Base Directory Specification
char* envXDG_CONFIG_HOME = getenv("XDG_CONFIG_HOME");
@@ -106,25 +106,25 @@ std::string CSystemUtilsLinux::profileFileLocation()
char *envHOME = getenv("HOME");
if (envHOME == NULL)
{
- m_profileFile = "colobot.ini";
+ profileFile = "colobot.ini";
}
else
{
- m_profileFile = std::string(envHOME) + "/.config/colobot.ini";
+ profileFile = std::string(envHOME) + "/.config/colobot.ini";
}
}
else
{
- m_profileFile = std::string(envXDG_CONFIG_HOME) + "/colobot.ini";
+ profileFile = std::string(envXDG_CONFIG_HOME) + "/colobot.ini";
}
- GetLogger()->Trace("Profile configuration is %s\n", m_profileFile.c_str());
+ GetLogger()->Trace("Profile configuration is %s\n", profileFile.c_str());
- return m_profileFile;
+ return profileFile;
}
-std::string CSystemUtilsLinux::savegameDirectoryLocation()
+std::string CSystemUtilsLinux::GetSavegameDirectoryLocation()
{
- std::string m_savegameDir;
+ std::string savegameDir;
// Determine savegame dir according to XDG Base Directory Specification
char *envXDG_DATA_HOME = getenv("XDG_CONFIG_DATA");
@@ -133,18 +133,19 @@ std::string CSystemUtilsLinux::savegameDirectoryLocation()
char *envHOME = getenv("HOME");
if (envHOME == NULL)
{
- m_savegameDir = "/tmp/colobot-savegame";
+ savegameDir = "/tmp/colobot-savegame";
}
else
- {
- m_savegameDir = std::string(envHOME) + "/.local/share/colobot";
+ {
+ savegameDir = std::string(envHOME) + "/.local/share/colobot";
}
}
else
{
- m_savegameDir = std::string(envXDG_DATA_HOME) + "/colobot";
+ savegameDir = std::string(envXDG_DATA_HOME) + "/colobot";
}
- GetLogger()->Trace("Saved game files are going to %s\n", m_savegameDir.c_str());
+ GetLogger()->Trace("Saved game files are going to %s\n", savegameDir.c_str());
- return m_savegameDir;
+ return savegameDir;
}
+
diff --git a/src/app/system_linux.h b/src/app/system_linux.h
index a9a5a52..212d840 100644
--- a/src/app/system_linux.h
+++ b/src/app/system_linux.h
@@ -46,9 +46,10 @@ public:
virtual long long GetTimeStampExactResolution() override;
virtual long long TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after) override;
- virtual std::string profileFileLocation() override;
- virtual std::string savegameDirectoryLocation() override;
+ virtual std::string GetProfileFileLocation() override;
+ virtual std::string GetSavegameDirectoryLocation() override;
private:
bool m_zenityAvailable;
};
+
diff --git a/src/app/system_other.cpp b/src/app/system_other.cpp
index 9fc1f95..da81a6d 100644
--- a/src/app/system_other.cpp
+++ b/src/app/system_other.cpp
@@ -37,3 +37,4 @@ long long int CSystemUtilsOther::TimeStampExactDiff(SystemTimeStamp* before, Sys
{
return (after->sdlTicks - before->sdlTicks) * 1000000ll;
}
+
diff --git a/src/app/system_other.h b/src/app/system_other.h
index bf16c80..b10a326 100644
--- a/src/app/system_other.h
+++ b/src/app/system_other.h
@@ -46,3 +46,4 @@ public:
virtual long long GetTimeStampExactResolution() override;
virtual long long TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after) override;
};
+
diff --git a/src/app/system_windows.cpp b/src/app/system_windows.cpp
index 870683f..f48d4e0 100644
--- a/src/app/system_windows.cpp
+++ b/src/app/system_windows.cpp
@@ -111,38 +111,39 @@ std::wstring CSystemUtilsWindows::UTF8_Decode(const std::string& str)
}
-std::string CSystemUtilsWindows::profileFileLocation()
+std::string CSystemUtilsWindows::GetProfileFileLocation()
{
- std::string m_profileFile;
+ std::string profileFile;
char* envUSERPROFILE = getenv("USERPROFILE");
if (envUSERPROFILE == NULL)
{
- m_profileFile = "colobot.ini";
+ profileFile = "colobot.ini";
}
else
{
- m_profileFile = std::string(envUSERPROFILE) + "\\colobot\\colobot.ini";
+ profileFile = std::string(envUSERPROFILE) + "\\colobot\\colobot.ini";
}
- GetLogger()->Trace("Profile configuration is %s\n", m_profileFile.c_str());
+ GetLogger()->Trace("Profile configuration is %s\n", profileFile.c_str());
- return m_profileFile;
+ return profileFile;
}
-std::string CSystemUtilsWindows::savegameDirectoryLocation()
+std::string CSystemUtilsWindows::GetSavegameDirectoryLocation()
{
- std::string m_savegameDir;
+ std::string savegameDir;
char* envUSERPROFILE = getenv("USERPROFILE");
if (envUSERPROFILE == NULL)
{
- m_savegameDir = "savegame";
+ savegameDir = "savegame";
}
else
{
- m_savegameDir = std::string(envUSERPROFILE) + "\\colobot\\savegame";
+ savegameDir = std::string(envUSERPROFILE) + "\\colobot\\savegame";
}
- GetLogger()->Trace("Saved game files are going to %s\n", m_savegameDir.c_str());
+ GetLogger()->Trace("Saved game files are going to %s\n", savegameDir.c_str());
+
+ return savegameDir;
+}
- return m_savegameDir;
-} \ No newline at end of file
diff --git a/src/app/system_windows.h b/src/app/system_windows.h
index 88e7507..fbc71a1 100644
--- a/src/app/system_windows.h
+++ b/src/app/system_windows.h
@@ -44,8 +44,8 @@ public:
virtual long long GetTimeStampExactResolution() override;
virtual long long TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after) override;
- virtual std::string profileFileLocation() override;
- virtual std::string savegameDirectoryLocation() override;
+ virtual std::string GetProfileFileLocation() override;
+ virtual std::string GetSavegameDirectoryLocation() override;
private:
std::string UTF8_Encode(const std::wstring &wstr);
@@ -54,3 +54,4 @@ private:
protected:
long long m_counterFrequency;
};
+
diff --git a/src/common/README.txt b/src/common/README.txt
index 25c9fbf..1fc21f1 100644
--- a/src/common/README.txt
+++ b/src/common/README.txt
@@ -2,3 +2,4 @@
* \dir src/common
* \brief Structs and utils shared throughout the application
*/
+
diff --git a/src/common/config.h.cmake b/src/common/config.h.cmake
index d5a03b4..76b37b5 100644
--- a/src/common/config.h.cmake
+++ b/src/common/config.h.cmake
@@ -23,3 +23,4 @@
#define COLOBOT_DEFAULT_DATADIR "@COLOBOT_INSTALL_DATA_DIR@"
#define COLOBOT_I18N_DIR "@COLOBOT_INSTALL_I18N_DIR@"
+
diff --git a/src/common/event.h b/src/common/event.h
index 153b732..8aef603 100644
--- a/src/common/event.h
+++ b/src/common/event.h
@@ -396,6 +396,7 @@ enum EventType
EVENT_OBJECT_MPOWER = 1024,
EVENT_OBJECT_BHELP = 1040,
EVENT_OBJECT_BTAKEOFF = 1041,
+ EVENT_OBJECT_BDESTROY = 1042,
EVENT_OBJECT_BDERRICK = 1050,
EVENT_OBJECT_BSTATION = 1051,
EVENT_OBJECT_BFACTORY = 1052,
@@ -729,16 +730,15 @@ struct Event
ActiveEventData active;
};
- Event(EventType type = EVENT_NULL)
- {
- this->type = type;
-
- systemEvent = false;
- rTime = 0.0f;
- mouseButtonsState = 0;
- trackedKeysState = 0;
- customParam = 0;
- }
+ explicit Event(EventType _type = EVENT_NULL)
+ : type(_type)
+ , systemEvent(false)
+ , rTime(0.0f)
+ , kmodState(0)
+ , trackedKeysState(0)
+ , mouseButtonsState(0)
+ , customParam(0)
+ {}
};
@@ -778,3 +778,4 @@ protected:
int m_tail;
int m_total;
};
+
diff --git a/src/common/global.h b/src/common/global.h
index db601df..a322057 100644
--- a/src/common/global.h
+++ b/src/common/global.h
@@ -106,6 +106,8 @@ enum Error
ERR_INFO_NULL = 390, //! < no information terminal
ERR_VEH_VIRUS = 400, //! < vehicle infected by a virus
ERR_BAT_VIRUS = 401, //! < building infected by a virus
+ ERR_DESTROY_NOTFOUND = 410, //! < not found anything to destroy
+ ERR_WRONG_OBJ = 420, //! < inappropriate vehicle
ERR_VEH_POWER = 500, //! < no battery
ERR_VEH_ENERGY = 501, //! < more energy
ERR_FLAG_FLY = 510, //! < impossible in flight
@@ -295,3 +297,4 @@ extern int g_build; // constructible buildings
extern int g_researchDone; // research done
extern long g_researchEnable; // research available
extern float g_unit; // conversion factor
+
diff --git a/src/common/image.cpp b/src/common/image.cpp
index db14797..a9587ef 100644
--- a/src/common/image.cpp
+++ b/src/common/image.cpp
@@ -17,6 +17,8 @@
#include "common/image.h"
+#include "math/func.h"
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -108,7 +110,8 @@ bool PNGSaveSurface(const char *filename, SDL_Surface *surf)
return false;
}
- if (setjmp(png_jmpbuf(png_ptr))) {
+ if (setjmp(png_jmpbuf(png_ptr)))
+ {
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
return false;
@@ -200,6 +203,33 @@ void CImage::Fill(Gfx::IntColor color)
}
/**
+ * Image must be valid.
+ *
+ * The dimensions are increased to nearest even power of two values.
+ * If image is already in power-of-two format, nothing is done.
+ */
+void CImage::PadToNearestPowerOfTwo()
+{
+ assert(m_data != nullptr);
+
+ if (Math::IsPowerOfTwo(m_data->surface->w) && Math::IsPowerOfTwo(m_data->surface->h))
+ return;
+
+ int w = Math::NextPowerOfTwo(m_data->surface->w);
+ int h = Math::NextPowerOfTwo(m_data->surface->h);
+
+ m_data->surface->flags &= (~SDL_SRCALPHA);
+ SDL_Surface* resizedSurface = SDL_CreateRGBSurface(0, w, h, 32, 0x00ff0000, 0x0000ff00,
+ 0x000000ff, 0xff000000);
+ assert(resizedSurface != NULL);
+ SDL_BlitSurface(m_data->surface, NULL, resizedSurface, NULL);
+
+ SDL_FreeSurface(m_data->surface);
+
+ m_data->surface = resizedSurface;
+}
+
+/**
* Image must be valid and pixel coords in valid range.
*
* \param pixel pixel coords (range x: 0..width-1 y: 0..height-1)
@@ -367,3 +397,4 @@ bool CImage::SavePNG(const std::string& fileName)
return true;
}
+
diff --git a/src/common/image.h b/src/common/image.h
index d9da75b..44aedf1 100644
--- a/src/common/image.h
+++ b/src/common/image.h
@@ -94,6 +94,9 @@ public:
//! Returns the precise color at given pixel
Gfx::IntColor GetPixelInt(Math::IntPoint pixel);
+ //! Pads the image to nearest power of 2 dimensions
+ void PadToNearestPowerOfTwo();
+
//! Loads an image from the specified file
bool Load(const std::string &fileName);
@@ -109,3 +112,4 @@ private:
//! Image data
ImageData* m_data;
};
+
diff --git a/src/common/iman.cpp b/src/common/iman.cpp
index e1400fd..88fbb9b 100644
--- a/src/common/iman.cpp
+++ b/src/common/iman.cpp
@@ -111,3 +111,4 @@ void CInstanceManager::Compress(ManagedClassType classType)
}
m_table[classType].usedCount = j;
}
+
diff --git a/src/common/iman.h b/src/common/iman.h
index faabd0c..bfa2204 100644
--- a/src/common/iman.h
+++ b/src/common/iman.h
@@ -93,4 +93,3 @@ protected:
ManagedClassInstances m_table[CLASS_MAX];
};
-
diff --git a/src/common/ioutils.h b/src/common/ioutils.h
index 9a94617..823b720 100644
--- a/src/common/ioutils.h
+++ b/src/common/ioutils.h
@@ -146,3 +146,4 @@ std::string ReadBinaryString(std::istream &istr)
}
}; // namespace IOUtils
+
diff --git a/src/common/key.h b/src/common/key.h
index 84ee618..82b3fbd 100644
--- a/src/common/key.h
+++ b/src/common/key.h
@@ -61,3 +61,4 @@ enum VirtualKmod
//! Special value for invalid key bindings
const unsigned int KEY_INVALID = SDLK_LAST + 1000;
+
diff --git a/src/common/logger.cpp b/src/common/logger.cpp
index 8bc4cef..a02854d 100644
--- a/src/common/logger.cpp
+++ b/src/common/logger.cpp
@@ -25,8 +25,8 @@ template<> CLogger* CSingleton<CLogger>::m_instance = nullptr;
CLogger::CLogger()
{
- mFile = NULL;
- mLogLevel = LOG_INFO;
+ m_file = NULL;
+ m_logLevel = LOG_INFO;
}
@@ -38,31 +38,31 @@ CLogger::~CLogger()
void CLogger::Log(LogLevel type, const char* str, va_list args)
{
- if (type < mLogLevel)
+ if (type < m_logLevel)
return;
switch (type)
{
case LOG_TRACE:
- fprintf(IsOpened() ? mFile : stderr, "[TRACE]: ");
+ fprintf(IsOpened() ? m_file : stderr, "[TRACE]: ");
break;
case LOG_DEBUG:
- fprintf(IsOpened() ? mFile : stderr, "[DEBUG]: ");
+ fprintf(IsOpened() ? m_file : stderr, "[DEBUG]: ");
break;
case LOG_WARN:
- fprintf(IsOpened() ? mFile : stderr, "[WARN]: ");
+ fprintf(IsOpened() ? m_file : stderr, "[WARN]: ");
break;
case LOG_INFO:
- fprintf(IsOpened() ? mFile : stderr, "[INFO]: ");
+ fprintf(IsOpened() ? m_file : stderr, "[INFO]: ");
break;
case LOG_ERROR:
- fprintf(IsOpened() ? mFile : stderr, "[ERROR]: ");
+ fprintf(IsOpened() ? m_file : stderr, "[ERROR]: ");
break;
default:
break;
}
- vfprintf(IsOpened() ? mFile : stderr, str, args);
+ vfprintf(IsOpened() ? m_file : stderr, str, args);
}
@@ -122,36 +122,36 @@ void CLogger::Message(const char* str, ...)
void CLogger::SetOutputFile(std::string filename)
{
- mFilename = filename;
+ m_filename = filename;
Open();
}
void CLogger::Open()
{
- mFile = fopen(mFilename.c_str(), "w");
+ m_file = fopen(m_filename.c_str(), "w");
- if (mFile == NULL)
- fprintf(stderr, "Could not create file %s\n", mFilename.c_str());
+ if (m_file == NULL)
+ fprintf(stderr, "Could not create file %s\n", m_filename.c_str());
}
void CLogger::Close()
{
if (IsOpened())
- fclose(mFile);
+ fclose(m_file);
}
bool CLogger::IsOpened()
{
- return mFile != NULL;
+ return m_file != NULL;
}
void CLogger::SetLogLevel(LogLevel type)
{
- mLogLevel = type;
+ m_logLevel = type;
}
diff --git a/src/common/logger.h b/src/common/logger.h
index 769f548..1a5f3b9 100644
--- a/src/common/logger.h
+++ b/src/common/logger.h
@@ -113,9 +113,9 @@ public:
static bool ParseLogLevel(const std::string& str, LogLevel& logLevel);
private:
- std::string mFilename;
- FILE *mFile;
- LogLevel mLogLevel;
+ std::string m_filename;
+ FILE *m_file;
+ LogLevel m_logLevel;
void Open();
void Close();
@@ -125,6 +125,8 @@ private:
//! Global function to get Logger instance
-inline CLogger* GetLogger() {
+inline CLogger* GetLogger()
+{
return CLogger::GetInstancePointer();
}
+
diff --git a/src/common/misc.h b/src/common/misc.h
index e2ddc44..bcebf76 100644
--- a/src/common/misc.h
+++ b/src/common/misc.h
@@ -31,3 +31,4 @@ extern void TimeToAscii(time_t time, char *buffer);
extern bool CopyFileListToTemp(char* filename, int* list, int total);
extern void AddExt(char* filename, const char* ext);
+
diff --git a/src/common/profile.cpp b/src/common/profile.cpp
index 654648d..c6af6cc 100644
--- a/src/common/profile.cpp
+++ b/src/common/profile.cpp
@@ -39,17 +39,7 @@ CProfile::CProfile() :
CProfile::~CProfile()
{
- if (m_profileNeedSave)
- {
- try
- {
- bp::ini_parser::write_ini(GetSystemUtils()->profileFileLocation(), m_propertyTree);
- }
- catch (std::exception & e)
- {
- GetLogger()->Info("Error on storing profile: %s\n", e.what());
- }
- }
+ SaveCurrentDirectory();
}
@@ -57,17 +47,41 @@ bool CProfile::InitCurrentDirectory()
{
try
{
- bp::ini_parser::read_ini(GetSystemUtils()->profileFileLocation(), m_propertyTree);
+ // TODO: NDEBUG should be replaced with something like BUILD_TYPE == "DEBUG"/"RELEASE"
+ #ifdef NDEBUG
+ bp::ini_parser::read_ini(GetSystemUtils()->GetProfileFileLocation(), m_propertyTree);
+ #else
+ bp::ini_parser::read_ini("colobot.ini", m_propertyTree);
+ #endif
}
catch (std::exception & e)
{
- GetLogger()->Info("Error on parsing profile: %s\n", e.what());
+ GetLogger()->Error("Error on parsing profile: %s\n", e.what());
return false;
}
return true;
}
-
+bool CProfile::SaveCurrentDirectory()
+{
+ if (m_profileNeedSave)
+ {
+ try
+ {
+ #ifdef NDEBUG
+ bp::ini_parser::write_ini(GetSystemUtils()->GetProfileFileLocation(), m_propertyTree);
+ #else
+ bp::ini_parser::write_ini("colobot.ini", m_propertyTree);
+ #endif
+ }
+ catch (std::exception & e)
+ {
+ GetLogger()->Error("Error on storing profile: %s\n", e.what());
+ return false;
+ }
+ }
+ return true;
+}
bool CProfile::SetLocalProfileString(std::string section, std::string key, std::string value)
{
@@ -78,7 +92,7 @@ bool CProfile::SetLocalProfileString(std::string section, std::string key, std::
}
catch (std::exception & e)
{
- GetLogger()->Info("Error on parsing profile: %s\n", e.what());
+ GetLogger()->Error("Error on parsing profile: %s\n", e.what());
return false;
}
return true;
@@ -93,7 +107,7 @@ bool CProfile::GetLocalProfileString(std::string section, std::string key, std::
}
catch (std::exception & e)
{
- GetLogger()->Info("Error on parsing profile: %s\n", e.what());
+ GetLogger()->Error("Error on parsing profile: %s\n", e.what());
return false;
}
return true;
@@ -109,7 +123,7 @@ bool CProfile::SetLocalProfileInt(std::string section, std::string key, int valu
}
catch (std::exception & e)
{
- GetLogger()->Info("Error on parsing profile: %s\n", e.what());
+ GetLogger()->Error("Error on parsing profile: %s\n", e.what());
return false;
}
return true;
@@ -124,7 +138,7 @@ bool CProfile::GetLocalProfileInt(std::string section, std::string key, int &val
}
catch (std::exception & e)
{
- GetLogger()->Info("Error on parsing profile: %s\n", e.what());
+ GetLogger()->Error("Error on parsing profile: %s\n", e.what());
return false;
}
return true;
@@ -140,7 +154,7 @@ bool CProfile::SetLocalProfileFloat(std::string section, std::string key, float
}
catch (std::exception & e)
{
- GetLogger()->Info("Error on parsing profile: %s\n", e.what());
+ GetLogger()->Error("Error on parsing profile: %s\n", e.what());
return false;
}
return true;
@@ -155,7 +169,7 @@ bool CProfile::GetLocalProfileFloat(std::string section, std::string key, float
}
catch (std::exception & e)
{
- GetLogger()->Info("Error on parsing profile: %s\n", e.what());
+ GetLogger()->Error("Error on parsing profile: %s\n", e.what());
return false;
}
return true;
@@ -179,7 +193,7 @@ std::vector< std::string > CProfile::GetLocalProfileSection(std::string section,
}
catch (std::exception & e)
{
- GetLogger()->Info("Error on parsing profile: %s\n", e.what());
+ GetLogger()->Error("Error on parsing profile: %s\n", e.what());
}
return ret_list;
@@ -196,34 +210,39 @@ std::string CProfile::GetUserBasedPath(std::string dir, std::string default_dir)
{
std::string path = dir;
boost::replace_all(path, "\\", "/");
- if (dir.find("/") == std::string::npos) {
+ if (dir.find("/") == std::string::npos)
+ {
path = default_dir + "/" + dir;
}
-
- if (m_userDirectory.length() > 0) {
+
+ if (m_userDirectory.length() > 0)
+ {
boost::replace_all(path, "%user%", m_userDirectory);
- } else {
+ }
+ else
+ {
boost::replace_all(path, "%user%", default_dir);
}
-
+
return fs::path(path).make_preferred().string();
}
-
-
+
+
bool CProfile::CopyFileToTemp(std::string filename)
{
std::string src, dst;
std::string tmp_user_dir = m_userDirectory;
-
+
src = GetUserBasedPath(filename, "textures");
SetUserDir("temp");
dst = GetUserBasedPath(filename, "textures");
SetUserDir(tmp_user_dir);
-
+
fs::create_directory(fs::path(dst).parent_path().make_preferred().string());
fs::copy_file(src, dst, fs::copy_option::overwrite_if_exists);
- if (fs::exists(dst)) {
- return true;
+ if (fs::exists(dst))
+ {
+ return true;
}
return false;
diff --git a/src/common/profile.h b/src/common/profile.h
index 7f99d81..8ea2aee 100644
--- a/src/common/profile.h
+++ b/src/common/profile.h
@@ -41,96 +41,103 @@ namespace fs = boost::filesystem;
*/
class CProfile : public CSingleton<CProfile>
{
- public:
- CProfile();
- ~CProfile();
-
- /** Loads colobot.ini from current directory
- * \return return true on success
- */
- bool InitCurrentDirectory();
-
- /** Sets string value in section under specified key
- * \param section
- * \param key
- * \param value
- * \return return true on success
- */
- bool SetLocalProfileString(std::string section, std::string key, std::string value);
-
- /** Gets string value in section under specified key
- * \param section
- * \param key
- * \param buffer
- * \return return true on success
- */
- bool GetLocalProfileString(std::string section, std::string key, std::string& buffer);
-
- /** Sets int value in section under specified key
- * \param section
- * \param key
- * \param value
- * \return return true on success
- */
- bool SetLocalProfileInt(std::string section, std::string key, int value);
-
- /** Gets int value in section under specified key
- * \param section
- * \param key
- * \param value
- * \return return true on success
- */
- bool GetLocalProfileInt(std::string section, std::string key, int &value);
-
- /** Sets float value in section under specified key
- * \param section
- * \param key
- * \param value
- * \return return true on success
- */
- bool SetLocalProfileFloat(std::string section, std::string key, float value);
-
- /** Gets float value in section under specified key
- * \param section
- * \param key
- * \param value
- * \return return true on success
- */
- bool GetLocalProfileFloat(std::string section, std::string key, float &value);
-
- /** Gets all values in section under specified key
- * \param section
- * \param key
- * \return vector of values
- */
- std::vector< std::string > GetLocalProfileSection(std::string section, std::string key);
-
- /** Sets current user directory
- * \param dir
- */
- void SetUserDir(std::string dir);
-
- /** Returns path based on current user. Replaces %user% in path with current user dir or
- * uses default_dir param if no user dir is specified
- * \param dir
- * \param default_dir
- * \return path
- */
- std::string GetUserBasedPath(std::string dir, std::string default_dir);
-
- /** opy a file into the temporary folder.
- * \param filename
- * \return true on success
- */
- bool CopyFileToTemp(std::string filename);
-
- private:
- boost::property_tree::ptree m_propertyTree;
- bool m_profileNeedSave;
- std::string m_userDirectory;
+public:
+ CProfile();
+ ~CProfile();
+
+ /** Loads colobot.ini from current directory
+ * \return return true on success
+ */
+ bool InitCurrentDirectory();
+
+ /** Saves colobot.ini to current directory
+ * \return return true on success
+ */
+ bool SaveCurrentDirectory();
+
+ /** Sets string value in section under specified key
+ * \param section
+ * \param key
+ * \param value
+ * \return return true on success
+ */
+ bool SetLocalProfileString(std::string section, std::string key, std::string value);
+
+ /** Gets string value in section under specified key
+ * \param section
+ * \param key
+ * \param buffer
+ * \return return true on success
+ */
+ bool GetLocalProfileString(std::string section, std::string key, std::string& buffer);
+
+ /** Sets int value in section under specified key
+ * \param section
+ * \param key
+ * \param value
+ * \return return true on success
+ */
+ bool SetLocalProfileInt(std::string section, std::string key, int value);
+
+ /** Gets int value in section under specified key
+ * \param section
+ * \param key
+ * \param value
+ * \return return true on success
+ */
+ bool GetLocalProfileInt(std::string section, std::string key, int &value);
+
+ /** Sets float value in section under specified key
+ * \param section
+ * \param key
+ * \param value
+ * \return return true on success
+ */
+ bool SetLocalProfileFloat(std::string section, std::string key, float value);
+
+ /** Gets float value in section under specified key
+ * \param section
+ * \param key
+ * \param value
+ * \return return true on success
+ */
+ bool GetLocalProfileFloat(std::string section, std::string key, float &value);
+
+ /** Gets all values in section under specified key
+ * \param section
+ * \param key
+ * \return vector of values
+ */
+ std::vector< std::string > GetLocalProfileSection(std::string section, std::string key);
+
+ /** Sets current user directory
+ * \param dir
+ */
+ void SetUserDir(std::string dir);
+
+ /** Returns path based on current user. Replaces %user% in path with current user dir or
+ * uses default_dir param if no user dir is specified
+ * \param dir
+ * \param default_dir
+ * \return path
+ */
+ std::string GetUserBasedPath(std::string dir, std::string default_dir);
+
+ /** opy a file into the temporary folder.
+ * \param filename
+ * \return true on success
+ */
+ bool CopyFileToTemp(std::string filename);
+
+private:
+ boost::property_tree::ptree m_propertyTree;
+ bool m_profileNeedSave;
+ std::string m_userDirectory;
};
//! Global function to get profile instance
-inline CProfile & GetProfile() {
+inline CProfile & GetProfile()
+{
return *CProfile::GetInstancePointer();
}
+
diff --git a/src/common/restext.cpp b/src/common/restext.cpp
index 9af73e4..ead8ef3 100644
--- a/src/common/restext.cpp
+++ b/src/common/restext.cpp
@@ -295,6 +295,7 @@ void InitializeRestext()
stringsEvent[EVENT_OBJECT_MPOWER] = "..power cell";
stringsEvent[EVENT_OBJECT_BHELP] = "Instructions for the mission (\\key help;)";
stringsEvent[EVENT_OBJECT_BTAKEOFF] = "Take off to finish the mission";
+ stringsEvent[EVENT_OBJECT_BDESTROY] = "Destroy";
stringsEvent[EVENT_OBJECT_BDERRICK] = "Build a derrick";
stringsEvent[EVENT_OBJECT_BSTATION] = "Build a power station";
stringsEvent[EVENT_OBJECT_BFACTORY] = "Build a bot factory";
@@ -539,6 +540,7 @@ void InitializeRestext()
+ stringsErr[ERR_GENERIC] = "Internal error - tell the developers";
stringsErr[ERR_CMD] = "Unknown command";
stringsErr[ERR_MANIP_VEH] = "Inappropriate bot";
stringsErr[ERR_MANIP_FLY] = "Impossible when flying";
@@ -622,6 +624,8 @@ void InitializeRestext()
stringsErr[ERR_FLAG_CREATE] = "Too many flags of this color (maximum 5)";
stringsErr[ERR_FLAG_PROXY] = "Too close to an existing flag";
stringsErr[ERR_FLAG_DELETE] = "No flag nearby";
+ stringsErr[ERR_DESTROY_NOTFOUND]= "Not found anything to destroy";
+ stringsErr[ERR_WRONG_OBJ] = "Inappropriate object";
stringsErr[ERR_MISSION_NOTERM] = "The mission is not accomplished yet (press \\key help; for more details)";
stringsErr[ERR_DELETEMOBILE] = "Bot destroyed";
stringsErr[ERR_DELETEBUILDING] = "Building destroyed";
@@ -731,9 +735,9 @@ void InitializeRestext()
static char g_gamerName[100];
-void SetGlobalGamerName(char *name)
+void SetGlobalGamerName(std::string name)
{
- strcpy(g_gamerName, name);
+ strcpy(g_gamerName, name.c_str());
}
@@ -916,3 +920,4 @@ bool GetResource(ResType type, int num, char* text)
PutKeyName(text, tmpl);
return true;
}
+
diff --git a/src/common/restext.h b/src/common/restext.h
index 8199f9f..e4659e2 100644
--- a/src/common/restext.h
+++ b/src/common/restext.h
@@ -24,6 +24,8 @@
#include "common/global.h"
+#include <string>
+
/**
* \enum ResType
@@ -153,6 +155,7 @@ enum ResTextType
void InitializeRestext();
-void SetGlobalGamerName(char *name);
+void SetGlobalGamerName(std::string name);
bool SearchKey(const char *cmd, InputSlot& slot);
bool GetResource(ResType type, int num, char* text);
+
diff --git a/src/common/singleton.h b/src/common/singleton.h
index 25e1648..841759d 100644
--- a/src/common/singleton.h
+++ b/src/common/singleton.h
@@ -74,3 +74,4 @@ private:
CSingleton& operator=(const CSingleton<T> &);
CSingleton(const CSingleton<T> &);
};
+
diff --git a/src/common/stringutils.cpp b/src/common/stringutils.cpp
index db486f0..953abba 100644
--- a/src/common/stringutils.cpp
+++ b/src/common/stringutils.cpp
@@ -142,3 +142,4 @@ size_t StrUtils::Utf8StringLength(const std::string &str)
}
return result;
}
+
diff --git a/src/common/stringutils.h b/src/common/stringutils.h
index 064351d..c60bfb0 100644
--- a/src/common/stringutils.h
+++ b/src/common/stringutils.h
@@ -78,3 +78,4 @@ int Utf8CharSizeAt(const std::string &str, unsigned int pos);
size_t Utf8StringLength(const std::string &str);
}; // namespace StrUtil
+
diff --git a/src/desktop/.gitignore b/src/desktop/.gitignore
index bade6f3..0e770f7 100644
--- a/src/desktop/.gitignore
+++ b/src/desktop/.gitignore
@@ -1 +1,2 @@
lang/
+
diff --git a/src/desktop/CMakeLists.txt b/src/desktop/CMakeLists.txt
index 9a00dd4..23f2280 100644
--- a/src/desktop/CMakeLists.txt
+++ b/src/desktop/CMakeLists.txt
@@ -3,72 +3,72 @@ cmake_minimum_required(VERSION 2.8)
# Install Desktop Entry file
set(COLOBOT_DESKTOP_FILE colobot.desktop)
add_custom_command(
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE}
- COMMAND ./create_desktop_file.sh > ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE}
- WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
- COMMENT "Build ${COLOBOT_DESKTOP_FILE}"
- )
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE}
+ COMMAND ./create_desktop_file.sh > ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE}
+ WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+ COMMENT "Build ${COLOBOT_DESKTOP_FILE}"
+ )
add_custom_target(desktopfile ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE})
install(
- FILES ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE}
+ FILES ${CMAKE_CURRENT_BINARY_DIR}/${COLOBOT_DESKTOP_FILE}
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications/
- )
+ )
# Install Icon
set(COLOBOT_ICON_FILE colobot.svg)
install(
- FILES ${CMAKE_CURRENT_SOURCE_DIR}/${COLOBOT_ICON_FILE}
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps/
- )
+ FILES ${CMAKE_CURRENT_SOURCE_DIR}/${COLOBOT_ICON_FILE}
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps/
+ )
# Render SVG icon in various sizes
find_program(RSVG_CONVERT rsvg-convert)
if(RSVG_CONVERT)
- foreach(PNGSIZE "48" "32" "16")
- file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE})
- add_custom_target(resize_icon_${PNGSIZE} ALL
- COMMAND ${RSVG_CONVERT} -w ${PNGSIZE} -h ${PNGSIZE} ${CMAKE_CURRENT_SOURCE_DIR}/${COLOBOT_ICON_FILE}
- > ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}/colobot.png
- )
- install(
- FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}/colobot.png
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/${PNGSIZE}x${PNGSIZE}/apps/
- )
- endforeach()
+ foreach(PNGSIZE "48" "32" "16")
+ file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE})
+ add_custom_target(resize_icon_${PNGSIZE} ALL
+ COMMAND ${RSVG_CONVERT} -w ${PNGSIZE} -h ${PNGSIZE} ${CMAKE_CURRENT_SOURCE_DIR}/${COLOBOT_ICON_FILE}
+ > ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}/colobot.png
+ )
+ install(
+ FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGSIZE}/colobot.png
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/${PNGSIZE}x${PNGSIZE}/apps/
+ )
+ endforeach()
endif()
# Create manpage from pod-formatted file
find_program(POD2MAN pod2man)
if(POD2MAN AND (NOT MSYS))
- set(COLOBOT_MANPAGE_SECTION 6)
+ set(COLOBOT_MANPAGE_SECTION 6)
macro(podman)
- cmake_parse_arguments(PM "" "PODFILE;LOCALE;" "" ${ARGN})
- if(PM_LOCALE)
- # This copes with the fact that english has no "/LANG" in the paths and filenames.
- set(SLASHLOCALE /${PM_LOCALE})
- endif()
- file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE})
- add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION}
+ cmake_parse_arguments(PM "" "PODFILE;LOCALE;" "" ${ARGN})
+ if(PM_LOCALE)
+ # This copes with the fact that english has no "/LANG" in the paths and filenames.
+ set(SLASHLOCALE /${PM_LOCALE})
+ endif()
+ file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE})
+ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PM_PODFILE}
COMMAND ${POD2MAN} ARGS --section=${COLOBOT_MANPAGE_SECTION}
--center="Colobot" --stderr --utf8
--release="${COLOBOT_VERSION_FULL}"
${CMAKE_CURRENT_SOURCE_DIR}/${PM_PODFILE}
${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION}
- COMMENT "Create ${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION} manpage"
+ COMMENT "Create ${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION} manpage"
)
- add_custom_target(man${PM_LOCALE} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION})
+ add_custom_target(man${PM_LOCALE} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION})
- install(
- FILES ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION}
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man${SLASHLOCALE}/man${COLOBOT_MANPAGE_SECTION}/ )
+ install(
+ FILES ${CMAKE_CURRENT_BINARY_DIR}${SLASHLOCALE}/colobot.${COLOBOT_MANPAGE_SECTION}
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man${SLASHLOCALE}/man${COLOBOT_MANPAGE_SECTION}/ )
- add_dependencies(man man${PM_LOCALE})
- endmacro()
+ add_dependencies(man man${PM_LOCALE})
+ endmacro()
- # Create the english manpage
- podman(PODFILE colobot.pod)
+ # Create the english manpage
+ podman(PODFILE colobot.pod)
endif()
@@ -76,22 +76,23 @@ endif()
find_program(PO4A po4a)
if(PO4A)
- add_custom_target(desktop_po4a
- COMMAND ${PO4A} po4a.cfg
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- )
- add_dependencies(desktopfile desktop_po4a)
+ add_custom_target(desktop_po4a
+ COMMAND ${PO4A} po4a.cfg
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ )
+ add_dependencies(desktopfile desktop_po4a)
- if(POD2MAN)
- add_custom_target(man_po4a
- COMMAND ${PO4A} po4a.cfg
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- )
- add_dependencies(man man_po4a)
- file(GLOB LINGUAS_PO RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/po/ ${CMAKE_CURRENT_SOURCE_DIR}/po/*.po)
- string(REGEX REPLACE ".po$" "" LINGUAS ${LINGUAS_PO})
- foreach(LOCALE ${LINGUAS})
- podman(PODFILE lang/${LOCALE}/colobot.pod LOCALE ${LOCALE})
- endforeach()
- endif()
+ if(POD2MAN)
+ add_custom_target(man_po4a
+ COMMAND ${PO4A} po4a.cfg
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ )
+ add_dependencies(man man_po4a)
+ file(GLOB LINGUAS_PO RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/po/ ${CMAKE_CURRENT_SOURCE_DIR}/po/*.po)
+ string(REGEX REPLACE ".po$" "" LINGUAS ${LINGUAS_PO})
+ foreach(LOCALE ${LINGUAS})
+ podman(PODFILE lang/${LOCALE}/colobot.pod LOCALE ${LOCALE})
+ endforeach()
+ endif()
endif()
+
diff --git a/src/desktop/colobot.desktop.in b/src/desktop/colobot.desktop.in
index 9b09803..9b48d87 100644
--- a/src/desktop/colobot.desktop.in
+++ b/src/desktop/colobot.desktop.in
@@ -4,3 +4,4 @@ Type=Application
Exec=colobot
Icon=colobot
Categories=Education;Robotics;Game;AdventureGame;StrategyGame;
+
diff --git a/src/desktop/colobot.ini b/src/desktop/colobot.ini
index 136e008..27193df 100644
--- a/src/desktop/colobot.ini
+++ b/src/desktop/colobot.ini
@@ -1,3 +1,4 @@
Name="Colobot"
GenericName="Game to learn programming"
Comment="Colonize with bots"
+
diff --git a/src/desktop/colobot.pod b/src/desktop/colobot.pod
index ae67e72..6a25f70 100644
--- a/src/desktop/colobot.pod
+++ b/src/desktop/colobot.pod
@@ -45,3 +45,4 @@ Set language. Note that you can also fill the B<LANG> environment variable.
=head1 AUTHOR
This manpage was written by Didier Raboud <S<odyx@debian.org>>.
+
diff --git a/src/desktop/colobot.svg b/src/desktop/colobot.svg
index 85a0545..ef5949f 100644
--- a/src/desktop/colobot.svg
+++ b/src/desktop/colobot.svg
@@ -236,3 +236,4 @@
</g>
</g>
</svg>
+
diff --git a/src/desktop/create_desktop_file.sh b/src/desktop/create_desktop_file.sh
index e0f120b..8f3d15b 100755
--- a/src/desktop/create_desktop_file.sh
+++ b/src/desktop/create_desktop_file.sh
@@ -11,8 +11,8 @@ cat colobot.desktop.in
linguas=$([ ! -d lang ] || ( cd lang ; ls));
for type in Name GenericName Comment; do
- egrep "^$type=" $fname | sed -e "s/^$type=\"\(.*\)\"$/$type=\1/g"
- for l in $linguas; do
- egrep "^$type=" lang/$l/$fname | sed -e "s/^$type=\"\(.*\)\"$/$type[$l]=\1/g"
- done
+ egrep "^$type=" $fname | sed -e "s/^$type=\"\(.*\)\"$/$type=\1/g"
+ for l in $linguas; do
+ egrep "^$type=" lang/$l/$fname | sed -e "s/^$type=\"\(.*\)\"$/$type[$l]=\1/g"
+ done
done
diff --git a/src/desktop/po/colobot-desktop.pot b/src/desktop/po/colobot-desktop.pot
index 94eb85a..ac6bbd2 100644
--- a/src/desktop/po/colobot-desktop.pot
+++ b/src/desktop/po/colobot-desktop.pot
@@ -132,3 +132,4 @@ msgstr ""
#: colobot.pod:47
msgid "This manpage was written by Didier Raboud <S<odyx@debian.org>>."
msgstr ""
+
diff --git a/src/desktop/po4a.cfg b/src/desktop/po4a.cfg
index c251959..881929d 100644
--- a/src/desktop/po4a.cfg
+++ b/src/desktop/po4a.cfg
@@ -2,3 +2,4 @@
[type:ini] colobot.ini $lang:lang/$lang/colobot.ini
[type:pod] colobot.pod $lang:lang/$lang/colobot.pod
+
diff --git a/src/graphics/README.txt b/src/graphics/README.txt
index 1cb91ba..f9ec2ae 100644
--- a/src/graphics/README.txt
+++ b/src/graphics/README.txt
@@ -10,3 +10,4 @@
* This namespace was created to avoid clashing with old code, but now it still serves,
* defining a border between pure graphics engine and other parts of application.
*/
+
diff --git a/src/graphics/core/README.txt b/src/graphics/core/README.txt
index ca3768c..056441d 100644
--- a/src/graphics/core/README.txt
+++ b/src/graphics/core/README.txt
@@ -4,4 +4,5 @@
*
* Core types, enums, structs and CDevice abstract class that define
* the abstract graphics device used in graphics engine
- */ \ No newline at end of file
+ */
+
diff --git a/src/graphics/core/color.cpp b/src/graphics/core/color.cpp
index 1f9d7a5..f0b74f8 100644
--- a/src/graphics/core/color.cpp
+++ b/src/graphics/core/color.cpp
@@ -106,3 +106,4 @@ Color HSV2RGB(ColorHSV color)
} // namespace Gfx
+
diff --git a/src/graphics/core/color.h b/src/graphics/core/color.h
index 5d059e5..87a50f4 100644
--- a/src/graphics/core/color.h
+++ b/src/graphics/core/color.h
@@ -139,10 +139,10 @@ struct ColorHSV
//! Returns a string "(h, s, v)"
inline std::string ToString() const
{
- std::stringstream s;
- s.precision(3);
- s << "(" << h << ", " << s << ", " << v << ")";
- return s.str();
+ std::stringstream str;
+ str.precision(3);
+ str << "(" << h << ", " << s << ", " << v << ")";
+ return str.str();
}
};
@@ -154,3 +154,4 @@ Color HSV2RGB(ColorHSV color);
} // namespace Gfx
+
diff --git a/src/graphics/core/device.h b/src/graphics/core/device.h
index 41d7796..38bc463 100644
--- a/src/graphics/core/device.h
+++ b/src/graphics/core/device.h
@@ -72,7 +72,7 @@ struct DeviceConfig
size = Math::IntPoint(800, 600);
bpp = 32;
fullScreen = false;
- resizeable = false;
+ resizeable = true;
doubleBuf = true;
noFrame = false;
}
@@ -401,3 +401,4 @@ public:
} // namespace Gfx
+
diff --git a/src/graphics/core/light.h b/src/graphics/core/light.h
index 28733c1..923d0e9 100644
--- a/src/graphics/core/light.h
+++ b/src/graphics/core/light.h
@@ -98,3 +98,4 @@ struct Light
} // namespace Gfx
+
diff --git a/src/graphics/core/material.h b/src/graphics/core/material.h
index 07782d5..e0bfaff 100644
--- a/src/graphics/core/material.h
+++ b/src/graphics/core/material.h
@@ -60,3 +60,4 @@ struct Material
} // namespace Gfx
+
diff --git a/src/graphics/core/texture.h b/src/graphics/core/texture.h
index 49b29f8..0702428 100644
--- a/src/graphics/core/texture.h
+++ b/src/graphics/core/texture.h
@@ -136,6 +136,8 @@ struct TextureCreateParams
TexMinFilter minFilter;
//! Magnification filter
TexMagFilter magFilter;
+ //! Pad the image to nearest power of 2 dimensions
+ bool padToNearestPowerOfTwo;
//! Constructor; calls LoadDefault()
TextureCreateParams()
@@ -146,6 +148,7 @@ struct TextureCreateParams
{
format = TEX_IMG_RGB;
mipmap = false;
+ padToNearestPowerOfTwo = false;
minFilter = TEX_MIN_FILTER_NEAREST;
magFilter = TEX_MAG_FILTER_NEAREST;
@@ -212,6 +215,8 @@ struct Texture
unsigned int id;
//! Size of texture
Math::IntPoint size;
+ //! Original size of texture (as loaded from image)
+ Math::IntPoint originalSize;
//! Whether the texture has alpha channel
bool alpha;
@@ -264,3 +269,4 @@ struct Texture
} // namespace Gfx
+
diff --git a/src/graphics/core/vertex.h b/src/graphics/core/vertex.h
index 66e1503..c3a657a 100644
--- a/src/graphics/core/vertex.h
+++ b/src/graphics/core/vertex.h
@@ -140,3 +140,4 @@ struct VertexTex2
} // namespace Gfx
+
diff --git a/src/graphics/d3d/README.txt b/src/graphics/d3d/README.txt
index 0fe7db6..4f96f27 100644
--- a/src/graphics/d3d/README.txt
+++ b/src/graphics/d3d/README.txt
@@ -1 +1,2 @@
Possible future DirectX implementation of graphics engine
+
diff --git a/src/graphics/engine/README.txt b/src/graphics/engine/README.txt
index 05d2d76..fbf45fd 100644
--- a/src/graphics/engine/README.txt
+++ b/src/graphics/engine/README.txt
@@ -7,3 +7,4 @@
*
* Graphics operations are done on abstract interface from src/graphics/core
*/
+
diff --git a/src/graphics/engine/camera.cpp b/src/graphics/engine/camera.cpp
index f65a59a..f0c379c 100644
--- a/src/graphics/engine/camera.cpp
+++ b/src/graphics/engine/camera.cpp
@@ -1676,3 +1676,4 @@ Math::Vector CCamera::ExcludeObject(Math::Vector eye, Math::Vector lookat,
}
+
diff --git a/src/graphics/engine/camera.h b/src/graphics/engine/camera.h
index 0ffc2c2..6d94dad 100644
--- a/src/graphics/engine/camera.h
+++ b/src/graphics/engine/camera.h
@@ -128,8 +128,7 @@ enum CameraOverEffect
... */
class CCamera {
-
- public:
+public:
CCamera();
~CCamera();
@@ -391,3 +390,4 @@ protected:
} // namespace Gfx
+
diff --git a/src/graphics/engine/cloud.cpp b/src/graphics/engine/cloud.cpp
index d9ebf5a..74083af 100644
--- a/src/graphics/engine/cloud.cpp
+++ b/src/graphics/engine/cloud.cpp
@@ -270,3 +270,4 @@ bool CCloud::GetEnabled()
} // namespace Gfx
+
diff --git a/src/graphics/engine/cloud.h b/src/graphics/engine/cloud.h
index 8f644f0..8e820c7 100644
--- a/src/graphics/engine/cloud.h
+++ b/src/graphics/engine/cloud.h
@@ -140,3 +140,4 @@ protected:
} // namespace Gfx
+
diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp
index 274e179..4d0687a 100644
--- a/src/graphics/engine/engine.cpp
+++ b/src/graphics/engine/engine.cpp
@@ -42,6 +42,8 @@
#include "ui/interface.h"
+#include <iomanip>
+
template<> Gfx::CEngine* CSingleton<Gfx::CEngine>::m_instance = nullptr;
// Graphics module namespace
@@ -94,7 +96,6 @@ CEngine::CEngine(CApplication *app)
m_backgroundCloudUp = Color();
m_backgroundCloudDown = Color();
m_backgroundFull = false;
- m_backgroundScale = Math::Point(1.0f, 1.0f);
m_overFront = true;
m_overColor = Color();
m_overMode = ENG_RSTATE_TCOLOR_BLACK;
@@ -237,7 +238,6 @@ void CEngine::SetTerrain(CTerrain* terrain)
m_terrain = terrain;
}
-
bool CEngine::Create()
{
m_size = m_app->GetVideoConfig().size;
@@ -317,7 +317,7 @@ void CEngine::ResetAfterDeviceChanged()
m_text->FlushCache();
- // TODO reload textures, reset device state, etc.
+ FlushTextureCache();
}
bool CEngine::ProcessEvent(const Event &event)
@@ -992,7 +992,8 @@ void CEngine::ChangeSecondTexture(int objRank, const std::string& tex2Name)
continue; // already new
EngineBaseObjTexTier& newP2 = AddLevel2(p1, p2.tex1Name, tex2Name);
- newP2.next.swap(p2.next);
+ newP2.next.insert(newP2.next.end(), p2.next.begin(), p2.next.end());
+ p2.next.clear();
}
}
@@ -2119,25 +2120,44 @@ Texture CEngine::CreateTexture(const std::string& texName, const TextureCreatePa
return Texture(); // invalid texture
Texture tex;
+ CImage img;
if (image == nullptr)
{
- CImage img;
- if (! img.Load(m_app->GetDataFilePath(DIR_TEXTURE, texName)))
+ bool loadedFromTexPack = false;
+
+ std::string texPackName = m_app->GetTexPackFilePath(texName);
+ if (! texPackName.empty())
{
- std::string error = img.GetError();
- GetLogger()->Error("Couldn't load texture '%s': %s, blacklisting\n", texName.c_str(), error.c_str());
- m_texBlacklist.insert(texName);
- return Texture(); // invalid texture
+ if (img.Load(texPackName))
+ {
+ loadedFromTexPack = true;
+ }
+ else
+ {
+ std::string error = img.GetError();
+ GetLogger()->Error("Couldn't load texture '%s' from texpack: %s, blacklisting the texpack path\n",
+ texName.c_str(), error.c_str());
+ m_texBlacklist.insert(texPackName);
+ }
}
- tex = m_device->CreateTexture(&img, params);
- }
- else
- {
- tex = m_device->CreateTexture(image, params);
+ if (!loadedFromTexPack)
+ {
+ if (! img.Load(m_app->GetDataFilePath(DIR_TEXTURE, texName)))
+ {
+ std::string error = img.GetError();
+ GetLogger()->Error("Couldn't load texture '%s': %s, blacklisting\n", texName.c_str(), error.c_str());
+ m_texBlacklist.insert(texName);
+ return Texture(); // invalid texture
+ }
+ }
+
+ image = &img;
}
+ tex = m_device->CreateTexture(&img, params);
+
if (! tex.Valid())
{
GetLogger()->Error("Couldn't load texture '%s', blacklisting\n", texName.c_str());
@@ -2171,8 +2191,7 @@ Texture CEngine::LoadTexture(const std::string& name, const TextureCreateParams&
if (it != m_texNameMap.end())
return (*it).second;
- Texture tex = CreateTexture(name, params);
- return tex;
+ return CreateTexture(name, params);
}
bool CEngine::LoadAllTextures()
@@ -2188,7 +2207,11 @@ bool CEngine::LoadAllTextures()
LoadTexture("map.png");
if (! m_backgroundName.empty())
- m_backgroundTex = LoadTexture(m_backgroundName);
+ {
+ TextureCreateParams params = m_defaultTexParams;
+ params.padToNearestPowerOfTwo = true;
+ m_backgroundTex = LoadTexture(m_backgroundName, params);
+ }
else
m_backgroundTex.SetInvalid();
@@ -2426,6 +2449,13 @@ void CEngine::DeleteTexture(const Texture& tex)
m_texNameMap.erase(it);
}
+void CEngine::FlushTextureCache()
+{
+ m_texNameMap.clear();
+ m_revTexNameMap.clear();
+ m_texBlacklist.clear();
+}
+
bool CEngine::SetTexture(const std::string& name, int stage)
{
auto it = m_texNameMap.find(name);
@@ -2609,8 +2639,7 @@ float CEngine::GetFogStart(int rank)
}
void CEngine::SetBackground(const std::string& name, Color up, Color down,
- Color cloudUp, Color cloudDown,
- bool full, Math::Point scale)
+ Color cloudUp, Color cloudDown, bool full)
{
if (m_backgroundTex.Valid())
{
@@ -2624,15 +2653,17 @@ void CEngine::SetBackground(const std::string& name, Color up, Color down,
m_backgroundCloudUp = cloudUp;
m_backgroundCloudDown = cloudDown;
m_backgroundFull = full;
- m_backgroundScale = scale;
if (! m_backgroundName.empty())
- m_backgroundTex = LoadTexture(m_backgroundName);
+ {
+ TextureCreateParams params = m_defaultTexParams;
+ params.padToNearestPowerOfTwo = true;
+ m_backgroundTex = LoadTexture(m_backgroundName, params);
+ }
}
void CEngine::GetBackground(std::string& name, Color& up, Color& down,
- Color& cloudUp, Color& cloudDown,
- bool &full, Math::Point& scale)
+ Color& cloudUp, Color& cloudDown, bool &full)
{
name = m_backgroundName;
up = m_backgroundColorUp;
@@ -2640,7 +2671,6 @@ void CEngine::GetBackground(std::string& name, Color& up, Color& down,
cloudUp = m_backgroundCloudUp;
cloudDown = m_backgroundCloudDown;
full = m_backgroundFull;
- scale = m_backgroundScale;
}
void CEngine::SetForegroundName(const std::string& name)
@@ -3651,7 +3681,7 @@ void CEngine::DrawShadow()
float lastIntensity = -1.0f;
for (int i = 0; i < static_cast<int>( m_shadows.size() ); i++)
{
- if (m_shadows[i].hide)
+ if (m_shadows[i].hide || !m_shadows[i].used)
continue;
Math::Vector pos = m_shadows[i].pos; // pos = center of the shadow on the ground
@@ -3900,8 +3930,12 @@ void CEngine::DrawBackgroundImage()
v2 = v1+h;
}
- u2 *= m_backgroundScale.x;
- v2 *= m_backgroundScale.y;
+ Math::Point backgroundScale;
+ backgroundScale.x = static_cast<float>(m_backgroundTex.originalSize.x) / static_cast<float>(m_backgroundTex.size.x);
+ backgroundScale.y = static_cast<float>(m_backgroundTex.originalSize.y) / static_cast<float>(m_backgroundTex.size.y);
+
+ u2 *= backgroundScale.x;
+ v2 *= backgroundScale.y;
SetTexture(m_backgroundTex);
SetState(ENG_RSTATE_OPAQUE_TEXTURE | ENG_RSTATE_WRAP);
@@ -4300,3 +4334,4 @@ void CEngine::DrawStats()
} // namespace Gfx
+
diff --git a/src/graphics/engine/engine.h b/src/graphics/engine/engine.h
index f9dfd45..27aa5dc 100644
--- a/src/graphics/engine/engine.h
+++ b/src/graphics/engine/engine.h
@@ -171,7 +171,7 @@ enum EngineObjectType
//! Fixed object
ENG_OBJTYPE_FIX = 2,
//! Moving object
- ENG_OBJTYPE_VEHICULE = 3,
+ ENG_OBJTYPE_VEHICLE = 3,
//! Part of a moving object
ENG_OBJTYPE_DESCENDANT = 4,
//! Fixed object type quartz
@@ -194,10 +194,15 @@ struct EngineBaseObjDataTier
unsigned int staticBufferId;
bool updateStaticBuffer;
- inline EngineBaseObjDataTier(EngineTriangleType type = ENG_TRIANGLE_TYPE_TRIANGLES,
- const Material& material = Material(),
- int state = ENG_RSTATE_NORMAL)
- : type(type), material(material), state(state), staticBufferId(0), updateStaticBuffer(false) {}
+ inline EngineBaseObjDataTier(EngineTriangleType _type = ENG_TRIANGLE_TYPE_TRIANGLES,
+ const Material& _material = Material(),
+ int _state = ENG_RSTATE_NORMAL)
+ : type(_type)
+ , material(_material)
+ , state(_state)
+ , staticBufferId(0)
+ , updateStaticBuffer(false)
+ {}
};
/**
@@ -209,8 +214,9 @@ struct EngineBaseObjLODTier
LODLevel lodLevel;
std::vector<EngineBaseObjDataTier> next;
- inline EngineBaseObjLODTier(LODLevel lodLevel = LOD_Constant)
- : lodLevel(lodLevel) {}
+ inline EngineBaseObjLODTier(LODLevel _lodLevel = LOD_Constant)
+ : lodLevel(_lodLevel)
+ {}
};
/**
@@ -225,8 +231,10 @@ struct EngineBaseObjTexTier
Texture tex2;
std::vector<EngineBaseObjLODTier> next;
- inline EngineBaseObjTexTier(const std::string& tex1Name = "", const std::string& tex2Name = "")
- : tex1Name(tex1Name), tex2Name(tex2Name) {}
+ inline EngineBaseObjTexTier(const std::string& _tex1Name = "", const std::string& _tex2Name = "")
+ : tex1Name(_tex1Name)
+ , tex2Name(_tex2Name)
+ {}
};
/**
@@ -556,18 +564,17 @@ struct EngineMouse
//! Hot point
Math::Point hotPoint;
- inline EngineMouse(int icon1 = -1, int icon2 = -1, int iconShadow = -1,
- EngineRenderState mode1 = ENG_RSTATE_NORMAL,
- EngineRenderState mode2 = ENG_RSTATE_NORMAL,
- Math::Point hotPoint = Math::Point())
- {
- this->icon1 = icon1;
- this->icon2 = icon2;
- this->iconShadow = iconShadow;
- this->mode1 = mode1;
- this->mode2 = mode2;
- this->hotPoint = hotPoint;
- }
+ inline EngineMouse(int _icon1 = -1, int _icon2 = -1, int _iconShadow = -1,
+ EngineRenderState _mode1 = ENG_RSTATE_NORMAL,
+ EngineRenderState _mode2 = ENG_RSTATE_NORMAL,
+ Math::Point _hotPoint = Math::Point())
+ : icon1(_icon1)
+ , icon2(_icon2)
+ , iconShadow(_iconShadow)
+ , mode1(_mode1)
+ , mode2(_mode2)
+ , hotPoint(_hotPoint)
+ {}
};
@@ -726,6 +733,7 @@ public:
//! Writes a screenshot containing the current frame
bool WriteScreenShot(const std::string& fileName, int width, int height);
+
//@{
//! Management of game pause mode
void SetPause(bool pause);
@@ -957,6 +965,9 @@ public:
//! Deletes the given texture, unloading it and removing from cache
void DeleteTexture(const Texture& tex);
+ //! Empties the texture cache
+ void FlushTextureCache();
+
//! Defines of the distance field of vision
void SetTerrainVision(float vision);
@@ -1050,10 +1061,10 @@ public:
//! Management of the background image to use
void SetBackground(const std::string& name, Color up = Color(), Color down = Color(),
Color cloudUp = Color(), Color cloudDown = Color(),
- bool full = false, Math::Point scale = Math::Point(1.0f, 1.0f));
+ bool full = false);
void GetBackground(std::string& name, Color& up, Color& down,
Color& cloudUp, Color& cloudDown,
- bool& full, Math::Point& scale);
+ bool& full);
//@}
//! Specifies the name of foreground texture
@@ -1346,7 +1357,6 @@ protected:
bool m_firstGroundSpot;
int m_secondTexNum;
bool m_backgroundFull;
- Math::Point m_backgroundScale;
std::string m_backgroundName;
Texture m_backgroundTex;
Color m_backgroundColorUp;
@@ -1428,3 +1438,4 @@ protected:
} // namespace Gfx
+
diff --git a/src/graphics/engine/lightman.cpp b/src/graphics/engine/lightman.cpp
index 16c84ea..cbb8509 100644
--- a/src/graphics/engine/lightman.cpp
+++ b/src/graphics/engine/lightman.cpp
@@ -465,3 +465,4 @@ bool CLightManager::LightsComparator::operator()(const DynamicLight& left, const
}
} // namespace Gfx
+
diff --git a/src/graphics/engine/lightman.h b/src/graphics/engine/lightman.h
index ab66524..171299c 100644
--- a/src/graphics/engine/lightman.h
+++ b/src/graphics/engine/lightman.h
@@ -216,3 +216,4 @@ protected:
};
}; // namespace Gfx
+
diff --git a/src/graphics/engine/lightning.cpp b/src/graphics/engine/lightning.cpp
index 5fdae51..4395eec 100644
--- a/src/graphics/engine/lightning.cpp
+++ b/src/graphics/engine/lightning.cpp
@@ -418,3 +418,4 @@ CObject* CLightning::SearchObject(Math::Vector pos)
} // namespace Gfx
+
diff --git a/src/graphics/engine/lightning.h b/src/graphics/engine/lightning.h
index 7809a6c..1b1d339 100644
--- a/src/graphics/engine/lightning.h
+++ b/src/graphics/engine/lightning.h
@@ -107,3 +107,4 @@ protected:
} // namespace Gfx
+
diff --git a/src/graphics/engine/modelfile.cpp b/src/graphics/engine/modelfile.cpp
index f6d7a7b..8383b15 100644
--- a/src/graphics/engine/modelfile.cpp
+++ b/src/graphics/engine/modelfile.cpp
@@ -1199,3 +1199,4 @@ int CModelFile::GetTriangleCount()
} // namespace Gfx
+
diff --git a/src/graphics/engine/modelfile.h b/src/graphics/engine/modelfile.h
index 3a702cb..9a01f78 100644
--- a/src/graphics/engine/modelfile.h
+++ b/src/graphics/engine/modelfile.h
@@ -150,3 +150,4 @@ protected:
};
}; // namespace Gfx
+
diff --git a/src/graphics/engine/modelmanager.cpp b/src/graphics/engine/modelmanager.cpp
index 238a7d9..8397e15 100644
--- a/src/graphics/engine/modelmanager.cpp
+++ b/src/graphics/engine/modelmanager.cpp
@@ -201,3 +201,4 @@ float CModelManager::GetHeight(std::vector<ModelTriangle>& triangles, Math::Vect
}
+
diff --git a/src/graphics/engine/modelmanager.h b/src/graphics/engine/modelmanager.h
index a7f9805..9d50b97 100644
--- a/src/graphics/engine/modelmanager.h
+++ b/src/graphics/engine/modelmanager.h
@@ -79,8 +79,10 @@ private:
std::string fileName;
bool mirrored;
- inline FileInfo(const std::string& fileName, bool mirrored)
- : fileName(fileName), mirrored(mirrored) {}
+ inline FileInfo(const std::string& _fileName, bool _mirrored)
+ : fileName(_fileName)
+ , mirrored(_mirrored)
+ {}
inline bool operator<(const FileInfo& other) const
{
@@ -99,3 +101,4 @@ private:
};
} // namespace Gfx
+
diff --git a/src/graphics/engine/particle.cpp b/src/graphics/engine/particle.cpp
index d15ee3b..abee2e2 100644
--- a/src/graphics/engine/particle.cpp
+++ b/src/graphics/engine/particle.cpp
@@ -3553,9 +3553,9 @@ void CParticle::DrawParticle(int sheet)
{
m_engine->SetTexture("text.png");
m_engine->SetState(ENG_RSTATE_TTEXTURE_WHITE);
- Math::Matrix mat;
- mat.LoadIdentity();
- m_device->SetTransform(TRANSFORM_WORLD, mat);
+ Math::Matrix matrix;
+ matrix.LoadIdentity();
+ m_device->SetTransform(TRANSFORM_WORLD, matrix);
for (int i = 0; i < m_wheelTraceTotal; i++)
DrawParticleWheel(i);
@@ -3917,3 +3917,4 @@ bool CParticle::WriteWheelTrace(const char *filename, int width, int height,
}
} // namespace Gfx
+
diff --git a/src/graphics/engine/particle.h b/src/graphics/engine/particle.h
index 708a04d..7fb24a1 100644
--- a/src/graphics/engine/particle.h
+++ b/src/graphics/engine/particle.h
@@ -395,3 +395,4 @@ protected:
} // namespace Gfx
+
diff --git a/src/graphics/engine/planet.cpp b/src/graphics/engine/planet.cpp
index 49bcb4c..0c96f63 100644
--- a/src/graphics/engine/planet.cpp
+++ b/src/graphics/engine/planet.cpp
@@ -185,3 +185,4 @@ int CPlanet::GetMode()
} // namespace Gfx
+
diff --git a/src/graphics/engine/planet.h b/src/graphics/engine/planet.h
index 3762e1d..58d3aeb 100644
--- a/src/graphics/engine/planet.h
+++ b/src/graphics/engine/planet.h
@@ -118,3 +118,4 @@ protected:
} // namespace Gfx
+
diff --git a/src/graphics/engine/pyro.cpp b/src/graphics/engine/pyro.cpp
index cab28b6..0a85beb 100644
--- a/src/graphics/engine/pyro.cpp
+++ b/src/graphics/engine/pyro.cpp
@@ -89,13 +89,15 @@ bool CPyro::Create(PyroType type, CObject* obj, float force)
DisplayError(type, obj); // displays eventual messages
- int i = 0;
- // Copies all spheres of the object.
- for (; i < 50; i++)
{
- if ( !obj->GetCrashSphere(i, m_crashSpherePos[i], m_crashSphereRadius[i]) ) break;
+ int i = 0;
+ // Copies all spheres of the object.
+ for (; i < 50; i++)
+ {
+ if ( !obj->GetCrashSphere(i, m_crashSpherePos[i], m_crashSphereRadius[i]) ) break;
+ }
+ m_crashSphereUsed = i;
}
- m_crashSphereUsed = i;
// Calculates the size of the effect.
if ( oType == OBJECT_ANT ||
@@ -1555,7 +1557,7 @@ void CPyro::ExploStart()
{
int objRank = m_object->GetObjectRank(i);
if ( objRank == -1 ) continue;
- m_engine->ChangeSecondTexture(objRank, "dirty04.tga");
+ m_engine->ChangeSecondTexture(objRank, "dirty04.png");
Math::Vector pos = m_object->GetPosition(i);
@@ -2399,3 +2401,4 @@ void CPyro::LightOperFrame(float rTime)
} // namespace Gfx
+
diff --git a/src/graphics/engine/pyro.h b/src/graphics/engine/pyro.h
index 9548a07..98b9a1b 100644
--- a/src/graphics/engine/pyro.h
+++ b/src/graphics/engine/pyro.h
@@ -219,3 +219,4 @@ protected:
} // namespace Gfx
+
diff --git a/src/graphics/engine/terrain.cpp b/src/graphics/engine/terrain.cpp
index c2a7855..4fe3057 100644
--- a/src/graphics/engine/terrain.cpp
+++ b/src/graphics/engine/terrain.cpp
@@ -1801,3 +1801,4 @@ float CTerrain::GetFlyingLimit(Math::Vector pos, bool noLimit)
} // namespace Gfx
+
diff --git a/src/graphics/engine/terrain.h b/src/graphics/engine/terrain.h
index 1fa8dec..e2317c4 100644
--- a/src/graphics/engine/terrain.h
+++ b/src/graphics/engine/terrain.h
@@ -418,3 +418,4 @@ protected:
} // namespace Gfx
+
diff --git a/src/graphics/engine/test/CMakeLists.txt b/src/graphics/engine/test/CMakeLists.txt
index afaa86a..134ed2a 100644
--- a/src/graphics/engine/test/CMakeLists.txt
+++ b/src/graphics/engine/test/CMakeLists.txt
@@ -25,3 +25,4 @@ add_executable(modelfile_test ${MODELFILE_TEST_SOURCES})
target_link_libraries(modelfile_test gtest)
add_test(modelfile_test modelfile_test)
+
diff --git a/src/graphics/engine/test/modelfile_test.cpp b/src/graphics/engine/test/modelfile_test.cpp
index e7078a9..1ca7f0a 100644
--- a/src/graphics/engine/test/modelfile_test.cpp
+++ b/src/graphics/engine/test/modelfile_test.cpp
@@ -260,3 +260,4 @@ int main(int argc, char **argv)
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
+
diff --git a/src/graphics/engine/text.cpp b/src/graphics/engine/text.cpp
index 308c813..610bfcf 100644
--- a/src/graphics/engine/text.cpp
+++ b/src/graphics/engine/text.cpp
@@ -56,6 +56,7 @@ CText::CText(CEngine* engine)
m_engine = engine;
m_defaultSize = 12.0f;
+ m_tabSize = 4;
m_lastFontType = FONT_COLOBOT;
m_lastFontSize = 0;
@@ -148,6 +149,16 @@ void CText::FlushCache()
m_lastCachedFont = nullptr;
}
+int CText::GetTabSize()
+{
+ return m_tabSize;
+}
+
+void CText::SetTabSize(int tabSize)
+{
+ m_tabSize = tabSize;
+}
+
void CText::DrawText(const std::string &text, std::vector<FontMetaChar>::iterator format,
std::vector<FontMetaChar>::iterator end,
float size, Math::Point pos, float width, TextAlign align,
@@ -309,11 +320,16 @@ float CText::GetStringWidth(const std::string &text,
return width;
}
-float CText::GetStringWidth(const std::string &text, FontType font, float size)
+float CText::GetStringWidth(std::string text, FontType font, float size)
{
assert(font != FONT_BUTTON);
- // TODO: special chars?
+ // Skip special chars
+ for (char& c : text)
+ {
+ if (c < 32)
+ c = ':';
+ }
CachedFont* cf = GetOrOpenFont(font, size);
assert(cf != nullptr);
@@ -328,8 +344,16 @@ float CText::GetCharWidth(UTF8Char ch, FontType font, float size, float offset)
// TODO: if (font == FONT_BUTTON)
if (font == FONT_BUTTON) return 0.0f;
- // TODO: special chars?
- // TODO: tab sizing
+ int width = 1;
+ if (ch.c1 < 32)
+ {
+ if (ch.c1 == '\t')
+ width = m_tabSize;
+
+ // TODO: tab sizing at intervals?
+
+ ch.c1 = ':';
+ }
CachedFont* cf = GetOrOpenFont(font, size);
assert(cf != nullptr);
@@ -341,7 +365,7 @@ float CText::GetCharWidth(UTF8Char ch, FontType font, float size, float offset)
else
tex = CreateCharTexture(ch, cf);
- return tex.charSize.x;
+ return tex.charSize.x * width;
}
@@ -505,6 +529,63 @@ int CText::Detect(const std::string &text, FontType font, float size, float offs
return index;
}
+UTF8Char CText::TranslateSpecialChar(int specialChar)
+{
+ UTF8Char ch;
+
+ switch (specialChar)
+ {
+ case CHAR_TAB:
+ ch.c1 = ':';
+ ch.c2 = 0;
+ ch.c3 = 0;
+ break;
+
+ case CHAR_NEWLINE:
+ // Unicode: U+21B2
+ ch.c1 = 0xE2;
+ ch.c2 = 0x86;
+ ch.c3 = 0xB2;
+ break;
+
+ case CHAR_DOT:
+ // Unicode: U+23C5
+ ch.c1 = 0xE2;
+ ch.c2 = 0x8F;
+ ch.c3 = 0x85;
+ break;
+
+ case CHAR_SQUARE:
+ // Unicode: U+25FD
+ ch.c1 = 0xE2;
+ ch.c2 = 0x97;
+ ch.c3 = 0xBD;
+ break;
+
+ case CHAR_SKIP_RIGHT:
+ // Unicode: U+25B6
+ ch.c1 = 0xE2;
+ ch.c2 = 0x96;
+ ch.c3 = 0xB6;
+ break;
+
+ case CHAR_SKIP_LEFT:
+ // Unicode: U+25C0
+ ch.c1 = 0xE2;
+ ch.c2 = 0x97;
+ ch.c3 = 0x80;
+ break;
+
+ default:
+ ch.c1 = '?';
+ ch.c2 = 0;
+ ch.c3 = 0;
+ break;
+ }
+
+ return ch;
+}
+
void CText::DrawString(const std::string &text, std::vector<FontMetaChar>::iterator format,
std::vector<FontMetaChar>::iterator end,
float size, Math::Point pos, float width, int eol, Color color)
@@ -532,7 +613,11 @@ void CText::DrawString(const std::string &text, std::vector<FontMetaChar>::itera
float cw = GetCharWidth(ch, font, size, offset);
if (offset + cw > width) // exceeds the maximum width?
{
- // TODO: special end-of-line char
+ ch = TranslateSpecialChar(CHAR_SKIP_RIGHT);
+ cw = GetCharWidth(ch, font, size, offset);
+ pos.x = start + width - cw;
+ color = Color(1.0f, 0.0f, 0.0f);
+ DrawCharAndAdjustPos(ch, font, size, pos, color);
break;
}
@@ -550,7 +635,13 @@ void CText::DrawString(const std::string &text, std::vector<FontMetaChar>::itera
fmtIndex++;
}
- // TODO: eol
+ if (eol != 0)
+ {
+ FontType font = FONT_COLOBOT;
+ UTF8Char ch = TranslateSpecialChar(eol);
+ color = Color(1.0f, 0.0f, 0.0f);
+ DrawCharAndAdjustPos(ch, font, size, pos, color);
+ }
}
void CText::StringToUTFCharList(const std::string &text, std::vector<UTF8Char> &chars)
@@ -675,23 +766,18 @@ void CText::DrawCharAndAdjustPos(UTF8Char ch, FontType font, float size, Math::P
// TODO: if (font == FONT_BUTTON)
if (font == FONT_BUTTON) return;
- // TODO: special chars?
-
CachedFont* cf = GetOrOpenFont(font, size);
if (cf == nullptr)
return;
int width = 1;
- if (ch.c1 > 0 && ch.c1 < 32) { // FIXME add support for chars with code 9 10 23
- if (ch.c1 == '\t') {
- ch.c1 = ':';
- width = 4;
- } else {
- ch.c1 = ' ';
- }
- ch.c2 = 0;
- ch.c3 = 0;
+ if (ch.c1 > 0 && ch.c1 < 32)
+ {
+ if (ch.c1 == '\t')
+ width = m_tabSize;
+
+ ch = TranslateSpecialChar(ch.c1);
}
auto it = cf->cache.find(ch);
@@ -827,3 +913,4 @@ CharTexture CText::CreateCharTexture(UTF8Char ch, CachedFont* font)
} // namespace Gfx
+
diff --git a/src/graphics/engine/text.h b/src/graphics/engine/text.h
index 6bcc59b..3abb8b7 100644
--- a/src/graphics/engine/text.h
+++ b/src/graphics/engine/text.h
@@ -206,6 +206,20 @@ struct MultisizeFont
};
/**
+ * \enum SpecialChar
+ * \brief Special codes for certain characters
+ */
+enum SpecialChar
+{
+ CHAR_TAB = '\t', //! Tab character - :
+ CHAR_NEWLINE = '\n', //! Newline character - arrow pointing down and left
+ CHAR_DOT = 1, //! Single dot in the middle
+ CHAR_SQUARE = 2, //! Square
+ CHAR_SKIP_RIGHT = 5, //! Filled triangle pointing right
+ CHAR_SKIP_LEFT = 6 //! Filled triangle pointing left
+};
+
+/**
* \class CText
* \brief Text rendering engine
*
@@ -240,6 +254,12 @@ public:
//! Flushes cached textures
void FlushCache();
+ //@{
+ //! Tab size management
+ void SetTabSize(int tabSize);
+ int GetTabSize();
+ //@}
+
//! Draws text (multi-format)
void DrawText(const std::string &text, std::vector<FontMetaChar>::iterator format,
std::vector<FontMetaChar>::iterator end,
@@ -268,11 +288,11 @@ public:
float GetHeight(FontType font, float size);
//! Returns width of string (multi-format)
- TEST_VIRTUAL float GetStringWidth(const std::string &text,
- std::vector<FontMetaChar>::iterator format,
- std::vector<FontMetaChar>::iterator end, float size);
+ TEST_VIRTUAL float GetStringWidth(const std::string& text,
+ std::vector<FontMetaChar>::iterator format,
+ std::vector<FontMetaChar>::iterator end, float size);
//! Returns width of string (single font)
- TEST_VIRTUAL float GetStringWidth(const std::string &text, FontType font, float size);
+ TEST_VIRTUAL float GetStringWidth(std::string text, FontType font, float size);
//! Returns width of single character
TEST_VIRTUAL float GetCharWidth(UTF8Char ch, FontType font, float size, float offset);
@@ -290,6 +310,8 @@ public:
//! Returns the most suitable position to a given offset (one font)
int Detect(const std::string &text, FontType font, float size, float offset);
+ UTF8Char TranslateSpecialChar(int specialChar);
+
protected:
CachedFont* GetOrOpenFont(FontType type, float size);
CharTexture CreateCharTexture(UTF8Char ch, CachedFont* font);
@@ -309,6 +331,7 @@ protected:
std::string m_error;
float m_defaultSize;
+ int m_tabSize;
std::map<FontType, MultisizeFont*> m_fonts;
@@ -319,3 +342,4 @@ protected:
} // namespace Gfx
+
diff --git a/src/graphics/engine/water.cpp b/src/graphics/engine/water.cpp
index d90652b..d1f8d29 100644
--- a/src/graphics/engine/water.cpp
+++ b/src/graphics/engine/water.cpp
@@ -628,3 +628,4 @@ void CWater::AdjustEye(Math::Vector &eye)
} // namespace Gfx
+
diff --git a/src/graphics/engine/water.h b/src/graphics/engine/water.h
index bb113e0..5e9f4b2 100644
--- a/src/graphics/engine/water.h
+++ b/src/graphics/engine/water.h
@@ -204,3 +204,4 @@ protected:
} // namespace Gfx
+
diff --git a/src/graphics/opengl/README.txt b/src/graphics/opengl/README.txt
index c62166b..1a6bedd 100644
--- a/src/graphics/opengl/README.txt
+++ b/src/graphics/opengl/README.txt
@@ -5,3 +5,4 @@
* Contains the concrete implementation using OpenGL of abstract CDevice class
* from src/graphics/core
*/
+
diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp
index df64e34..4bfc542 100644
--- a/src/graphics/opengl/gldevice.cpp
+++ b/src/graphics/opengl/gldevice.cpp
@@ -417,13 +417,21 @@ bool CGLDevice::GetLightEnabled(int index)
Texture CGLDevice::CreateTexture(CImage *image, const TextureCreateParams &params)
{
ImageData *data = image->GetData();
- if (data == NULL)
+ if (data == nullptr)
{
GetLogger()->Error("Invalid texture data\n");
return Texture(); // invalid texture
}
- return CreateTexture(data, params);
+ Math::IntPoint originalSize = image->GetSize();
+
+ if (params.padToNearestPowerOfTwo)
+ image->PadToNearestPowerOfTwo();
+
+ Texture tex = CreateTexture(data, params);
+ tex.originalSize = originalSize;
+
+ return tex;
}
Texture CGLDevice::CreateTexture(ImageData *data, const TextureCreateParams &params)
@@ -433,6 +441,11 @@ Texture CGLDevice::CreateTexture(ImageData *data, const TextureCreateParams &par
result.size.x = data->surface->w;
result.size.y = data->surface->h;
+ if (!Math::IsPowerOfTwo(result.size.x) || !Math::IsPowerOfTwo(result.size.y))
+ GetLogger()->Warn("Creating non-power-of-2 texture (%dx%d)!\n", result.size.x, result.size.y);
+
+ result.originalSize = result.size;
+
// Use & enable 1st texture stage
if (m_multitextureAvailable)
glActiveTexture(GL_TEXTURE0);
@@ -640,7 +653,7 @@ void CGLDevice::SetTexture(int index, const Texture &texture)
glBindTexture(GL_TEXTURE_2D, texture.id);
// Params need to be updated for the new bound texture
- SetTextureStageParams(index, m_textureStageParams[index]);
+ UpdateTextureParams(index);
}
void CGLDevice::SetTexture(int index, unsigned int textureId)
@@ -661,7 +674,7 @@ void CGLDevice::SetTexture(int index, unsigned int textureId)
glBindTexture(GL_TEXTURE_2D, textureId);
// Params need to be updated for the new bound texture
- SetTextureStageParams(index, m_textureStageParams[index]);
+ UpdateTextureParams(index);
}
/**
@@ -714,6 +727,13 @@ void CGLDevice::SetTextureStageParams(int index, const TextureStageParams &param
// Remember the settings
m_textureStageParams[index] = params;
+ UpdateTextureParams(index);
+}
+
+void CGLDevice::UpdateTextureParams(int index)
+{
+ assert(index >= 0 && index < static_cast<int>( m_currentTextures.size() ));
+
if (!m_multitextureAvailable && index != 0)
return;
@@ -721,6 +741,8 @@ void CGLDevice::SetTextureStageParams(int index, const TextureStageParams &param
if (! m_currentTextures[index].Valid())
return;
+ const TextureStageParams &params = m_textureStageParams[index];
+
if (m_multitextureAvailable)
glActiveTexture(GL_TEXTURE0 + index);
@@ -1667,3 +1689,4 @@ FillMode CGLDevice::GetFillMode()
} // namespace Gfx
+
diff --git a/src/graphics/opengl/gldevice.h b/src/graphics/opengl/gldevice.h
index fe3f2a1..004a18b 100644
--- a/src/graphics/opengl/gldevice.h
+++ b/src/graphics/opengl/gldevice.h
@@ -192,6 +192,8 @@ private:
void UpdateModelviewMatrix();
//! Updates position for given light based on transformation matrices
void UpdateLightPosition(int index);
+ //! Updates the texture params for given texture stage
+ void UpdateTextureParams(int index);
private:
//! Current config
@@ -255,3 +257,4 @@ private:
} // namespace Gfx
+
diff --git a/src/math/README.txt b/src/math/README.txt
index 26069aa..fcc204f 100644
--- a/src/math/README.txt
+++ b/src/math/README.txt
@@ -10,3 +10,4 @@
* This namespace was created to avoid clashing with old code, but now it still serves,
* defining a border between math and non-math-related code.
*/
+
diff --git a/src/math/all.h b/src/math/all.h
index 10c17a9..7d716c8 100644
--- a/src/math/all.h
+++ b/src/math/all.h
@@ -28,3 +28,4 @@
#include "math/vector.h"
#include "math/matrix.h"
#include "math/geometry.h"
+
diff --git a/src/math/const.h b/src/math/const.h
index 8318b7a..fee635e 100644
--- a/src/math/const.h
+++ b/src/math/const.h
@@ -53,3 +53,4 @@ const float LOG_2 = log(2.0f);
} // namespace Math
+
diff --git a/src/math/func.h b/src/math/func.h
index 413b5d9..98111c5 100644
--- a/src/math/func.h
+++ b/src/math/func.h
@@ -128,6 +128,12 @@ inline float Rand()
return static_cast<float>(rand()) / static_cast<float>(RAND_MAX);
}
+//! Returns whether \a x is an even power of 2
+inline bool IsPowerOfTwo(unsigned int x)
+{
+ return x && !(x & (x - 1));
+}
+
//! Returns the next nearest power of two to \a x
inline int NextPowerOfTwo(int x)
{
@@ -257,3 +263,4 @@ inline float Bounce(float progress, float middle = 0.3f, float bounce = 0.4f)
} // namespace Math
+
diff --git a/src/math/geometry.h b/src/math/geometry.h
index 23c149c..9dcb447 100644
--- a/src/math/geometry.h
+++ b/src/math/geometry.h
@@ -643,3 +643,4 @@ inline Math::Vector RotateView(Math::Vector center, float angleH, float angleV,
} // namespace Math
+
diff --git a/src/math/intpoint.h b/src/math/intpoint.h
index 010b0fb..872e614 100644
--- a/src/math/intpoint.h
+++ b/src/math/intpoint.h
@@ -59,3 +59,4 @@ struct IntPoint
} // namespace Math
+
diff --git a/src/math/matrix.h b/src/math/matrix.h
index e0cf492..a13f823 100644
--- a/src/math/matrix.h
+++ b/src/math/matrix.h
@@ -73,10 +73,10 @@ struct Matrix
//! Creates the matrix from 1D array
/** \a m matrix values in column-major order */
- inline explicit Matrix(const float (&m)[16])
+ inline explicit Matrix(const float (&_m)[16])
{
for (int i = 0; i < 16; ++i)
- this->m[i] = m[i];
+ m[i] = _m[i];
}
//! Creates the matrix from 2D array
@@ -84,13 +84,13 @@ struct Matrix
* The array's first index is row, second is column.
* \param m array with values
*/
- inline explicit Matrix(const float (&m)[4][4])
+ inline explicit Matrix(const float (&_m)[4][4])
{
for (int c = 0; c < 4; ++c)
{
for (int r = 0; r < 4; ++r)
{
- this->m[4*c+r] = m[r][c];
+ m[4*c+r] = _m[r][c];
}
}
}
@@ -462,3 +462,4 @@ inline Math::Vector MatrixVectorMultiply(const Math::Matrix &m, const Math::Vect
} // namespace Math
+
diff --git a/src/math/point.h b/src/math/point.h
index 456fe1e..edb902b 100644
--- a/src/math/point.h
+++ b/src/math/point.h
@@ -52,16 +52,15 @@ struct Point
//! Constructs a zero point: (0,0)
inline Point()
- {
- LoadZero();
- }
+ : x(0.0f)
+ , y(0.0f)
+ {}
//! Constructs a point from given coords: (x,y)
- inline explicit Point(float x, float y)
- {
- this->x = x;
- this->y = y;
- }
+ inline explicit Point(float _x, float _y)
+ : x(_x)
+ , y(_y)
+ {}
//! Sets the zero point: (0,0)
inline void LoadZero()
@@ -191,3 +190,4 @@ inline float Distance(const Point &a, const Point &b)
} // namespace Math
+
diff --git a/src/math/vector.h b/src/math/vector.h
index 73e8e44..6827785 100644
--- a/src/math/vector.h
+++ b/src/math/vector.h
@@ -57,17 +57,17 @@ struct Vector
//! Creates a zero vector (0, 0, 0)
inline Vector()
- {
- LoadZero();
- }
+ : x(0.0f)
+ , y(0.0f)
+ , z(0.0f)
+ {}
//! Creates a vector from given values
- inline explicit Vector(float x, float y, float z)
- {
- this->x = x;
- this->y = y;
- this->z = z;
- }
+ inline explicit Vector(float _x, float _y, float _z)
+ : x(_x)
+ , y(_y)
+ , z(_z)
+ {}
//! Loads the zero vector (0, 0, 0)
inline void LoadZero()
@@ -281,3 +281,4 @@ inline Vector Clamp(const Vector &vec, const Vector &min, const Vector &max)
} // namespace Math
+
diff --git a/src/object/README.txt b/src/object/README.txt
index fe946db..4e21620 100644
--- a/src/object/README.txt
+++ b/src/object/README.txt
@@ -5,3 +5,4 @@
* Contains the main class of game engine - CRobotMain and the various in-game objects:
* CObject and related auto, motion and task subclasses.
*/
+
diff --git a/src/object/auto/auto.cpp b/src/object/auto/auto.cpp
index 3d88012..8dc1d94 100644
--- a/src/object/auto/auto.cpp
+++ b/src/object/auto/auto.cpp
@@ -107,6 +107,12 @@ void CAuto::Start(int param)
{
}
+// Starts an action
+
+Error CAuto::StartAction(int param)
+{
+ return ERR_GENERIC;
+}
// Gete a type.
diff --git a/src/object/auto/auto.h b/src/object/auto/auto.h
index 53ccdf9..4a430ce 100644
--- a/src/object/auto/auto.h
+++ b/src/object/auto/auto.h
@@ -31,7 +31,7 @@ namespace Ui {
class CDisplayText;
class CInterface;
class CWindow;
-} /* Ui */
+} /* Ui */
namespace Gfx {
@@ -44,7 +44,7 @@ class CCloud;
class CCamera;
class CPlanet;
class CLightning;
-} /* Gfx */
+} /* Gfx */
class CAuto
@@ -61,6 +61,8 @@ public:
virtual Error IsEnded();
virtual bool Abort();
+ virtual Error StartAction(int param);
+
virtual bool SetType(ObjectType type);
virtual bool SetValue(int rank, float value);
virtual bool SetString(char *string);
diff --git a/src/object/auto/autobase.cpp b/src/object/auto/autobase.cpp
index cb7f04c..d0bd87b 100644
--- a/src/object/auto/autobase.cpp
+++ b/src/object/auto/autobase.cpp
@@ -1412,9 +1412,8 @@ void CAutoBase::BeginTransit()
m_engine->SetDeepView(2000.0f); // we see very far
m_engine->ApplyChange();
- Math::Point scale;
bool full;
- m_engine->GetBackground(m_bgName, m_bgUp, m_bgDown, m_bgCloudUp, m_bgCloudDown, full, scale);
+ m_engine->GetBackground(m_bgName, m_bgUp, m_bgDown, m_bgCloudUp, m_bgCloudDown, full);
m_engine->DeleteTexture(m_bgName);
m_engine->SetBackground(m_bgBack, Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
diff --git a/src/object/auto/autoderrick.cpp b/src/object/auto/autoderrick.cpp
index 260edcb..b613406 100644
--- a/src/object/auto/autoderrick.cpp
+++ b/src/object/auto/autoderrick.cpp
@@ -589,4 +589,3 @@ Error CAutoDerrick::GetError()
return ERR_OK;
}
-
diff --git a/src/object/auto/autodestroyer.cpp b/src/object/auto/autodestroyer.cpp
index b62a45a..fdaebc0 100644
--- a/src/object/auto/autodestroyer.cpp
+++ b/src/object/auto/autodestroyer.cpp
@@ -24,6 +24,7 @@
#include "ui/interface.h"
#include "ui/window.h"
+#include "ui/displaytext.h"
#include <stdio.h>
#include <string.h>
@@ -68,18 +69,65 @@ void CAutoDestroyer::Init()
}
+// Starts an action
+Error CAutoDestroyer::StartAction(int param)
+{
+ CObject* scrap;
+
+ if ( m_object->GetVirusMode() ) // contaminated by a virus?
+ {
+ return ERR_BAT_VIRUS;
+ }
+
+ scrap = SearchPlastic();
+ if ( scrap == nullptr )
+ return ERR_DESTROY_NOTFOUND;
+ else
+ {
+ if ( m_phase == ADEP_WAIT )
+ {
+ scrap->SetLock(true); // usable waste
+//? scrap->SetTruck(m_object); // usable waste
+
+ m_sound->Play(SOUND_PSHHH2, m_object->GetPosition(0), 1.0f, 1.0f);
+
+ m_phase = ADEP_DOWN;
+ m_progress = 0.0f;
+ m_speed = 1.0f/1.0f;
+ m_bExplo = false;
+ }
+ else
+ return ERR_GENERIC;
+ }
+ return ERR_OK;
+}
+
// Management of an event.
bool CAutoDestroyer::EventProcess(const Event &event)
{
- CObject* scrap;
- Gfx::CPyro* pyro;
+ CObject* scrap;
+ Gfx::CPyro* pyro;
Math::Vector pos, speed;
Math::Point dim;
+ Ui::CWindow* pw;
CAuto::EventProcess(event);
if ( m_engine->GetPause() ) return true;
+
+ if (m_main->GetSelect() == m_object)
+ {
+ if ( event.type == EVENT_OBJECT_BDESTROY )
+ {
+ Error err = StartAction(0);
+ if ( err != ERR_OK )
+ m_displayText->DisplayError(err, m_object);
+
+ return false;
+ }
+ }
+
if ( event.type != EVENT_FRAME ) return true;
m_progress += event.rTime*m_speed;
@@ -94,61 +142,21 @@ bool CAutoDestroyer::EventProcess(const Event &event)
return true;
}
+ pw = static_cast< Ui::CWindow* >(m_interface->SearchControl(EVENT_WINDOW0));
if ( m_phase == ADEP_WAIT )
{
if ( m_progress >= 1.0f )
{
- scrap = SearchPlastic();
- if ( scrap == 0 )
- {
- m_phase = ADEP_WAIT; // still waiting ...
- m_progress = 0.0f;
- m_speed = 1.0f/0.5f;
- }
- else
+ m_phase = ADEP_WAIT; // still waiting ...
+ m_progress = 0.0f;
+ m_speed = 1.0f/0.5f;
+ if (m_main->GetSelect() == m_object)
{
- scrap->SetLock(true); // usable waste
-//? scrap->SetTruck(m_object); // usable waste
-
- if ( SearchVehicle() )
- {
- if ( m_progress < 20.0f ) {
- m_phase = ADEP_WAIT; // still waiting ...
- //m_progress = 0.0f;
- m_speed = 1.0f/0.5f;
- } else {
- if ( m_object->GetLock() ) { // If still building...
- m_phase = ADEP_WAIT; // still waiting ...
- m_progress = 0.0f;
- m_speed = 1.0f/0.5f;
- } else {
- m_sound->Play(SOUND_PSHHH2, m_object->GetPosition(0), 1.0f, 1.0f);
-
- m_phase = ADEP_DOWN;
- m_progress = 0.0f;
- m_speed = 1.0f/1.0f;
- m_bExplo = false;
- }
- }
- }
- else
- {
- if ( m_object->GetLock() ) { // If still building...
- m_phase = ADEP_WAIT; // still waiting ...
- m_progress = 0.0f;
- m_speed = 1.0f/0.5f;
- } else {
- m_sound->Play(SOUND_PSHHH2, m_object->GetPosition(0), 1.0f, 1.0f);
-
- m_phase = ADEP_DOWN;
- m_progress = 0.0f;
- m_speed = 1.0f/1.0f;
- m_bExplo = false;
- }
- }
+ scrap = SearchPlastic();
+ if ( pw != 0 ) EnableInterface(pw, EVENT_OBJECT_BDESTROY, (scrap != 0));
}
}
- }
+ } else if ( pw != 0 ) EnableInterface(pw, EVENT_OBJECT_BDESTROY, false);
if ( m_phase == ADEP_DOWN )
{
@@ -224,6 +232,7 @@ bool CAutoDestroyer::CreateInterface(bool bSelect)
Ui::CWindow* pw;
Math::Point pos, ddim;
float ox, oy, sx, sy;
+ CObject* scrap;
CAuto::CreateInterface(bSelect);
@@ -243,6 +252,15 @@ bool CAutoDestroyer::CreateInterface(bool bSelect)
ddim.y = 66.0f/480.0f;
pw->CreateGroup(pos, ddim, 106, EVENT_OBJECT_TYPE);
+ pos.x = ox+sx*8.00f;
+ pos.y = oy+sy*0.25f;
+ ddim.x = (33.0f/640.0f)*1.5f;
+ ddim.y = (33.0f/480.0f)*1.5f;
+ pw->CreateButton(pos, ddim, 12, EVENT_OBJECT_BDESTROY);
+
+ scrap = SearchPlastic();
+ EnableInterface(pw, EVENT_OBJECT_BDESTROY, (scrap != 0));
+
return true;
}
@@ -323,68 +341,6 @@ CObject* CAutoDestroyer::SearchPlastic()
return nullptr;
}
-// Seeks if one vehicle is too close.
-
-bool CAutoDestroyer::SearchVehicle()
-{
- CObject* pObj;
- Math::Vector cPos, oPos;
- ObjectType type;
- float oRadius, dist;
- int i;
-
- cPos = m_object->GetPosition(0);
-
- for ( i=0 ; i<1000000 ; i++ )
- {
- pObj = static_cast< CObject* >(m_iMan->SearchInstance(CLASS_OBJECT, i));
- if ( pObj == nullptr ) break;
-
- type = pObj->GetType();
- if ( type != OBJECT_HUMAN &&
- type != OBJECT_MOBILEfa &&
- type != OBJECT_MOBILEta &&
- type != OBJECT_MOBILEwa &&
- type != OBJECT_MOBILEia &&
- type != OBJECT_MOBILEfc &&
- type != OBJECT_MOBILEtc &&
- type != OBJECT_MOBILEwc &&
- type != OBJECT_MOBILEic &&
- type != OBJECT_MOBILEfi &&
- type != OBJECT_MOBILEti &&
- type != OBJECT_MOBILEwi &&
- type != OBJECT_MOBILEii &&
- type != OBJECT_MOBILEfs &&
- type != OBJECT_MOBILEts &&
- type != OBJECT_MOBILEws &&
- type != OBJECT_MOBILEis &&
- type != OBJECT_MOBILErt &&
- type != OBJECT_MOBILErc &&
- type != OBJECT_MOBILErr &&
- type != OBJECT_MOBILErs &&
- type != OBJECT_MOBILEsa &&
- type != OBJECT_MOBILEtg &&
- type != OBJECT_MOBILEft &&
- type != OBJECT_MOBILEtt &&
- type != OBJECT_MOBILEwt &&
- type != OBJECT_MOBILEit &&
- type != OBJECT_MOBILEdr &&
- type != OBJECT_MOTHER &&
- type != OBJECT_ANT &&
- type != OBJECT_SPIDER &&
- type != OBJECT_BEE &&
- type != OBJECT_WORM ) continue;
-
- if ( !pObj->GetCrashSphere(0, oPos, oRadius) ) continue;
- dist = Math::Distance(oPos, cPos)-oRadius;
-
- if ( dist < 20.0f ) return true;
- }
-
- return false;
-}
-
-
// Returns an error due the state of the automation.
Error CAutoDestroyer::GetError()
@@ -440,4 +396,15 @@ bool CAutoDestroyer::Read(char *line)
return true;
}
+// Changes the state of a button interface.
+
+void CAutoDestroyer::EnableInterface(Ui::CWindow *pw, EventType event, bool bState)
+{
+ Ui::CControl* control;
+
+ control = pw->SearchControl(event);
+ if ( control == 0 ) return;
+
+ control->SetState(Ui::STATE_ENABLE, bState);
+}
diff --git a/src/object/auto/autodestroyer.h b/src/object/auto/autodestroyer.h
index 26981c3..ef3d5ae 100644
--- a/src/object/auto/autodestroyer.h
+++ b/src/object/auto/autodestroyer.h
@@ -46,6 +46,8 @@ public:
bool EventProcess(const Event &event);
Error GetError();
+ Error StartAction(int param);
+
bool CreateInterface(bool bSelect);
bool Write(char *line);
@@ -53,7 +55,7 @@ public:
protected:
CObject* SearchPlastic();
- bool SearchVehicle();
+ void EnableInterface(Ui::CWindow *pw, EventType event, bool bState);
protected:
AutoDestroyerPhase m_phase;
diff --git a/src/object/auto/autoenergy.cpp b/src/object/auto/autoenergy.cpp
index a0b4d85..6a8672b 100644
--- a/src/object/auto/autoenergy.cpp
+++ b/src/object/auto/autoenergy.cpp
@@ -649,3 +649,4 @@ bool CAutoEnergy::Read(char *line)
return true;
}
+
diff --git a/src/object/auto/autofactory.cpp b/src/object/auto/autofactory.cpp
index 82877c6..a648656 100644
--- a/src/object/auto/autofactory.cpp
+++ b/src/object/auto/autofactory.cpp
@@ -24,6 +24,7 @@
#include "math/geometry.h"
#include "object/robotmain.h"
+#include "object/brain.h"
#include "physics/physics.h"
@@ -103,21 +104,74 @@ void CAutoFactory::Init()
m_fretPos = m_object->GetPosition(0);
+ m_program = nullptr;
+
CAuto::Init();
}
+// Starts an action
+
+Error CAutoFactory::StartAction(int param)
+{
+ CObject* fret;
+ ObjectType type = static_cast<ObjectType>(param);
+
+ if ( type != OBJECT_NULL )
+ {
+ if ( m_phase != AFP_WAIT )
+ {
+ return ERR_OK;
+ }
+
+ m_type = type;
+
+ fret = SearchFret(); // transform metal?
+ if ( fret == 0 )
+ {
+ return ERR_FACTORY_NULL;
+ }
+ if ( NearestVehicle() )
+ {
+ return ERR_FACTORY_NEAR;
+ }
+
+ SetBusy(true);
+ InitProgressTotal(3.0f+2.0f+15.0f+2.0f+3.0f);
+ UpdateInterface();
+
+ fret->SetLock(true); // usable metal
+ SoundManip(3.0f, 1.0f, 0.5f);
+
+ m_phase = AFP_CLOSE_S;
+ m_progress = 0.0f;
+ m_speed = 1.0f/3.0f;
+ return ERR_OK;
+ }
+ return ERR_GENERIC;
+}
+
+
+// Sets program for created robot
+
+void CAutoFactory::SetProgram(const char* program)
+{
+ m_program = new char[strlen(program)+1];
+ strcpy(m_program, program);
+}
+
+
// Management of an event.
bool CAutoFactory::EventProcess(const Event &event)
{
+ ObjectType type;
CObject* fret;
CObject* vehicle;
Math::Matrix* mat;
CPhysics* physics;
Math::Vector pos, speed;
Math::Point dim;
- ObjectType type;
float zoom, angle, prog;
int i;
@@ -155,39 +209,12 @@ bool CAutoFactory::EventProcess(const Event &event)
if ( event.type == EVENT_OBJECT_FACTORYrs ) type = OBJECT_MOBILErs;
if ( event.type == EVENT_OBJECT_FACTORYsa ) type = OBJECT_MOBILEsa;
- if ( type != OBJECT_NULL )
- {
- m_type = type;
+ Error err = StartAction(type);
+ if( err != ERR_OK && err != ERR_GENERIC )
+ m_displayText->DisplayError(err, m_object);
- if ( m_phase != AFP_WAIT )
- {
- return false;
- }
-
- fret = SearchFret(); // transform metal?
- if ( fret == 0 )
- {
- m_displayText->DisplayError(ERR_FACTORY_NULL, m_object);
- return false;
- }
- if ( NearestVehicle() )
- {
- m_displayText->DisplayError(ERR_FACTORY_NEAR, m_object);
- return false;
- }
-
- SetBusy(true);
- InitProgressTotal(3.0f+2.0f+15.0f+2.0f+3.0f);
- UpdateInterface();
-
- fret->SetLock(true); // usable metal
- SoundManip(3.0f, 1.0f, 0.5f);
-
- m_phase = AFP_CLOSE_S;
- m_progress = 0.0f;
- m_speed = 1.0f/3.0f;
- return true;
- }
+ if( err != ERR_GENERIC )
+ return false;
}
if ( event.type != EVENT_FRAME ) return true;
@@ -362,7 +389,7 @@ bool CAutoFactory::EventProcess(const Event &event)
delete fret;
}
- vehicle = SearchVehicle();
+ m_vehicle = vehicle = SearchVehicle();
if ( vehicle != 0 )
{
physics = vehicle->GetPhysics();
@@ -461,6 +488,17 @@ bool CAutoFactory::EventProcess(const Event &event)
m_object->SetZoomZ(10+i, 0.30f);
}
+ if ( m_program != nullptr )
+ {
+ CBrain* brain = m_vehicle->GetBrain();
+ if ( brain != nullptr )
+ {
+ brain->SendProgram(0, const_cast<const char*>(m_program));
+ brain->SetScriptRun(0);
+ brain->RunProgram(0);
+ }
+ }
+
SetBusy(false);
UpdateInterface();
diff --git a/src/object/auto/autofactory.h b/src/object/auto/autofactory.h
index 7c5013d..d9350e6 100644
--- a/src/object/auto/autofactory.h
+++ b/src/object/auto/autofactory.h
@@ -48,6 +48,9 @@ public:
void Init();
bool EventProcess(const Event &event);
+ Error StartAction(int param);
+ void SetProgram(const char* program);
+
bool CreateInterface(bool bSelect);
bool Write(char *line);
@@ -69,7 +72,10 @@ protected:
float m_progress;
float m_speed;
float m_lastParticle;
- Math::Vector m_fretPos;
+ Math::Vector m_fretPos;
int m_channelSound;
+
+ CObject* m_vehicle;
+ char* m_program;
};
diff --git a/src/object/auto/autoflag.cpp b/src/object/auto/autoflag.cpp
index 936546d..cc00db0 100644
--- a/src/object/auto/autoflag.cpp
+++ b/src/object/auto/autoflag.cpp
@@ -159,4 +159,3 @@ Error CAutoFlag::GetError()
return ERR_OK;
}
-
diff --git a/src/object/auto/autoinfo.cpp b/src/object/auto/autoinfo.cpp
index 56c21d2..6d4a484 100644
--- a/src/object/auto/autoinfo.cpp
+++ b/src/object/auto/autoinfo.cpp
@@ -428,7 +428,7 @@ void CAutoInfo::UpdateList()
{
info = m_object->GetInfo(i);
sprintf(text, "%s = %.2f", info.name, info.value);
- pl->SetName(i, text);
+ pl->SetItemName(i, text);
}
}
@@ -466,7 +466,7 @@ void CAutoInfo::UpdateListVirus()
}
text[j] = 0;
- pl->SetName(i, text);
+ pl->SetItemName(i, text);
}
}
@@ -513,4 +513,3 @@ bool CAutoInfo::Read(char *line)
return true;
}
-
diff --git a/src/object/auto/autojostle.cpp b/src/object/auto/autojostle.cpp
index 11952c2..5ce01c2 100644
--- a/src/object/auto/autojostle.cpp
+++ b/src/object/auto/autojostle.cpp
@@ -77,6 +77,11 @@ void CAutoJostle::Start(int param, float force)
}
}
+// Should never be called
+void CAutoJostle::Start(int param)
+{
+}
+
// Management of an event.
@@ -137,4 +142,3 @@ Error CAutoJostle::IsEnded()
return m_error;
}
-
diff --git a/src/object/auto/autojostle.h b/src/object/auto/autojostle.h
index 7b700ad..3822421 100644
--- a/src/object/auto/autojostle.h
+++ b/src/object/auto/autojostle.h
@@ -37,7 +37,9 @@ public:
bool EventProcess(const Event &event);
Error IsEnded();
-protected:
+private:
+ // Overriden to avoid warning about hiding virtual function
+ virtual void Start(int param) override;
protected:
float m_force;
diff --git a/src/object/auto/autokid.cpp b/src/object/auto/autokid.cpp
index a9f86b0..7d61d64 100644
--- a/src/object/auto/autokid.cpp
+++ b/src/object/auto/autokid.cpp
@@ -197,4 +197,3 @@ Error CAutoKid::GetError()
return ERR_OK;
}
-
diff --git a/src/object/auto/autolabo.cpp b/src/object/auto/autolabo.cpp
index 6984fd6..172a618 100644
--- a/src/object/auto/autolabo.cpp
+++ b/src/object/auto/autolabo.cpp
@@ -42,7 +42,7 @@ const float LABO_DELAY = 20.0f; // duration of the analysis
// Object's constructor.
- CAutoLabo::CAutoLabo(CObject* object) : CAuto(object)
+CAutoLabo::CAutoLabo(CObject* object) : CAuto(object)
{
int i;
@@ -111,6 +111,48 @@ void CAutoLabo::Init()
}
+// Starts an action
+
+Error CAutoLabo::StartAction(int param)
+{
+ CObject* power;
+
+ if ( m_phase != ALAP_WAIT )
+ {
+ return ERR_GENERIC;
+ }
+
+ m_research = static_cast<ResearchType>(param);
+
+ if ( g_researchDone & m_research )
+ {
+ return ERR_LABO_ALREADY;
+ }
+
+ power = m_object->GetPower();
+ if ( power == 0 )
+ {
+ return ERR_LABO_NULL;
+ }
+ if ( power->GetType() != OBJECT_BULLET )
+ {
+ return ERR_LABO_BAD;
+ }
+
+ SetBusy(true);
+ InitProgressTotal(1.0f+1.5f+1.5f+LABO_DELAY+1.5f+1.5f+1.0f);
+ UpdateInterface();
+
+ power->SetLock(true); // ball longer usable
+
+ SoundManip(1.0f, 1.0f, 1.0f);
+ m_phase = ALAP_OPEN1;
+ m_progress = 0.0f;
+ m_speed = 1.0f/1.0f;
+ return ERR_OK;
+}
+
+
// Management of an event.
bool CAutoLabo::EventProcess(const Event &event)
@@ -130,46 +172,17 @@ bool CAutoLabo::EventProcess(const Event &event)
if ( m_object->GetSelect() ) CreateInterface(true);
}
- if ( m_object->GetSelect() && // center selected?
- (event.type == EVENT_OBJECT_RiPAW ||
- event.type == EVENT_OBJECT_RiGUN) )
+ if ( m_object->GetSelect() ) // center selected?
{
- if ( m_phase != ALAP_WAIT )
- {
- return false;
- }
+ Error err = ERR_GENERIC;
+ if ( event.type == EVENT_OBJECT_RiPAW ) err = StartAction(RESEARCH_iPAW);
+ if ( event.type == EVENT_OBJECT_RiGUN ) err = StartAction(RESEARCH_iGUN);
- m_research = event.type;
+ if( err != ERR_OK && err != ERR_GENERIC )
+ m_displayText->DisplayError(err, m_object);
- if ( TestResearch(m_research) )
- {
- m_displayText->DisplayError(ERR_LABO_ALREADY, m_object);
+ if( err != ERR_GENERIC )
return false;
- }
-
- power = m_object->GetPower();
- if ( power == 0 )
- {
- m_displayText->DisplayError(ERR_LABO_NULL, m_object);
- return false;
- }
- if ( power->GetType() != OBJECT_BULLET )
- {
- m_displayText->DisplayError(ERR_LABO_BAD, m_object);
- return false;
- }
-
- SetBusy(true);
- InitProgressTotal(1.0f+1.5f+1.5f+LABO_DELAY+1.5f+1.5f+1.0f);
- UpdateInterface();
-
- power->SetLock(true); // ball longer usable
-
- SoundManip(1.0f, 1.0f, 1.0f);
- m_phase = ALAP_OPEN1;
- m_progress = 0.0f;
- m_speed = 1.0f/1.0f;
- return true;
}
if ( event.type != EVENT_FRAME ) return true;
@@ -341,7 +354,13 @@ bool CAutoLabo::EventProcess(const Event &event)
}
else
{
- SetResearch(m_research); // research done
+ g_researchDone |= m_research; // research done
+
+ m_main->WriteFreeParam();
+
+ Event newEvent(EVENT_UPDINTERFACE);
+ m_eventQueue->AddEvent(newEvent);
+ UpdateInterface();
power = m_object->GetPower();
if ( power != 0 )
@@ -606,11 +625,10 @@ bool CAutoLabo::Read(char *line)
m_phase = static_cast< AutoLaboPhase >(OpInt(line, "aPhase", ALAP_WAIT));
m_progress = OpFloat(line, "aProgress", 0.0f);
m_speed = OpFloat(line, "aSpeed", 1.0f);
- m_research = static_cast< EventType >(OpInt(line, "aResearch", 0));
+ m_research = static_cast< ResearchType >(OpInt(line, "aResearch", 0));
m_lastParticle = 0.0f;
return true;
}
-
diff --git a/src/object/auto/autolabo.h b/src/object/auto/autolabo.h
index b61e8e3..b3b08bb 100644
--- a/src/object/auto/autolabo.h
+++ b/src/object/auto/autolabo.h
@@ -47,6 +47,7 @@ public:
void DeleteObject(bool bAll=false);
void Init();
+ Error StartAction(int param);
bool EventProcess(const Event &event);
Error GetError();
@@ -68,7 +69,7 @@ protected:
float m_speed;
float m_timeVirus;
float m_lastParticle;
- EventType m_research;
+ ResearchType m_research;
int m_partiRank[3];
int m_partiSphere;
int m_soundChannel;
diff --git a/src/object/auto/automush.cpp b/src/object/auto/automush.cpp
index e97e2a1..1e4796d 100644
--- a/src/object/auto/automush.cpp
+++ b/src/object/auto/automush.cpp
@@ -342,4 +342,3 @@ bool CAutoMush::Read(char *line)
return true;
}
-
diff --git a/src/object/auto/autonest.cpp b/src/object/auto/autonest.cpp
index 1cf13d6..8a2d644 100644
--- a/src/object/auto/autonest.cpp
+++ b/src/object/auto/autonest.cpp
@@ -273,4 +273,3 @@ bool CAutoNest::Read(char *line)
return true;
}
-
diff --git a/src/object/auto/autonuclear.cpp b/src/object/auto/autonuclear.cpp
index 75bfb45..224776d 100644
--- a/src/object/auto/autonuclear.cpp
+++ b/src/object/auto/autonuclear.cpp
@@ -484,4 +484,3 @@ bool CAutoNuclear::Read(char *line)
return true;
}
-
diff --git a/src/object/auto/autopara.cpp b/src/object/auto/autopara.cpp
index ad6517b..24bc119 100644
--- a/src/object/auto/autopara.cpp
+++ b/src/object/auto/autopara.cpp
@@ -327,4 +327,3 @@ bool CAutoPara::Read(char *line)
return true;
}
-
diff --git a/src/object/auto/autoradar.cpp b/src/object/auto/autoradar.cpp
index 1a10aa7..4afd3fe 100644
--- a/src/object/auto/autoradar.cpp
+++ b/src/object/auto/autoradar.cpp
@@ -305,4 +305,3 @@ bool CAutoRadar::SearchEnemy(Math::Vector &pos)
return true;
}
-
diff --git a/src/object/auto/autorepair.cpp b/src/object/auto/autorepair.cpp
index 95b6cc8..2f813f8 100644
--- a/src/object/auto/autorepair.cpp
+++ b/src/object/auto/autorepair.cpp
@@ -74,7 +74,7 @@ void CAutoRepair::Init()
bool CAutoRepair::EventProcess(const Event &event)
{
- CObject* vehicule;
+ CObject* vehicle;
Math::Vector pos, speed;
Math::Point dim;
float angle, shield;
@@ -137,16 +137,16 @@ bool CAutoRepair::EventProcess(const Event &event)
if ( m_phase == ARP_REPAIR )
{
- vehicule = SearchVehicle();
+ vehicle = SearchVehicle();
if ( m_progress < 1.0f ||
- (vehicule != 0 && vehicule->GetShield() < 1.0f) )
+ (vehicle != 0 && vehicle->GetShield() < 1.0f) )
{
- if ( vehicule != 0 )
+ if ( vehicle != 0 )
{
- shield = vehicule->GetShield();
+ shield = vehicle->GetShield();
shield += event.rTime*0.2f;
if ( shield > 1.0f ) shield = 1.0f;
- vehicule->SetShield(shield);
+ vehicle->SetShield(shield);
}
if ( m_lastParticle+m_engine->ParticleAdapt(0.05f) <= m_time )
@@ -340,4 +340,3 @@ bool CAutoRepair::Read(char *line)
return true;
}
-
diff --git a/src/object/auto/autorepair.h b/src/object/auto/autorepair.h
index 31a3c65..f522a55 100644
--- a/src/object/auto/autorepair.h
+++ b/src/object/auto/autorepair.h
@@ -63,4 +63,3 @@ protected:
float m_lastParticle;
};
-
diff --git a/src/object/auto/autoresearch.cpp b/src/object/auto/autoresearch.cpp
index 3c32307..8308ebe 100644
--- a/src/object/auto/autoresearch.cpp
+++ b/src/object/auto/autoresearch.cpp
@@ -92,6 +92,60 @@ void CAutoResearch::Init()
}
+// Starts an action
+
+Error CAutoResearch::StartAction(int param)
+{
+ CObject* power;
+ float time;
+
+ if ( m_phase != ALP_WAIT )
+ {
+ return ERR_GENERIC;
+ }
+
+ m_research = static_cast<ResearchType>(param);
+
+ if ( g_researchDone & m_research )
+ {
+ return ERR_RESEARCH_ALREADY;
+ }
+
+ power = m_object->GetPower();
+ if ( power == 0 )
+ {
+ return ERR_RESEARCH_POWER;
+ }
+ if ( power->GetCapacity() > 1.0f )
+ {
+ return ERR_RESEARCH_TYPE;
+ }
+ if ( power->GetEnergy() < 1.0f )
+ {
+ return ERR_RESEARCH_ENERGY;
+ }
+
+ time = SEARCH_TIME;
+ if ( m_research == RESEARCH_TANK ) time *= 0.3f;
+ if ( m_research == RESEARCH_FLY ) time *= 0.3f;
+ if ( m_research == RESEARCH_ATOMIC ) time *= 2.0f;
+
+ SetBusy(true);
+ InitProgressTotal(time);
+ UpdateInterface();
+
+ m_channelSound = m_sound->Play(SOUND_RESEARCH, m_object->GetPosition(0), 0.0f, 1.0f, true);
+ m_sound->AddEnvelope(m_channelSound, 1.0f, 1.0f, 2.0f, SOPER_CONTINUE);
+ m_sound->AddEnvelope(m_channelSound, 1.0f, 1.0f, time-4.0f, SOPER_CONTINUE);
+ m_sound->AddEnvelope(m_channelSound, 0.0f, 1.0f, 2.0f, SOPER_STOP);
+
+ m_phase = ALP_SEARCH;
+ m_progress = 0.0f;
+ m_speed = 1.0f/time;
+ return ERR_OK;
+}
+
+
// Management of an event.
bool CAutoResearch::EventProcess(const Event &event)
@@ -100,7 +154,7 @@ bool CAutoResearch::EventProcess(const Event &event)
Math::Vector pos, speed;
Error message;
Math::Point dim;
- float angle, time;
+ float angle;
CAuto::EventProcess(event);
@@ -111,64 +165,23 @@ bool CAutoResearch::EventProcess(const Event &event)
if ( m_object->GetSelect() ) CreateInterface(true);
}
- if ( m_object->GetSelect() && // center selected?
- (event.type == EVENT_OBJECT_RTANK ||
- event.type == EVENT_OBJECT_RFLY ||
- event.type == EVENT_OBJECT_RTHUMP ||
- event.type == EVENT_OBJECT_RCANON ||
- event.type == EVENT_OBJECT_RTOWER ||
- event.type == EVENT_OBJECT_RPHAZER ||
- event.type == EVENT_OBJECT_RSHIELD ||
- event.type == EVENT_OBJECT_RATOMIC ) )
+ if ( m_object->GetSelect() ) // center selected?
{
- if ( m_phase != ALP_WAIT )
- {
+ Error err = ERR_GENERIC;
+ if ( event.type == EVENT_OBJECT_RTANK ) err = StartAction(RESEARCH_TANK);
+ if ( event.type == EVENT_OBJECT_RFLY ) err = StartAction(RESEARCH_FLY);
+ if ( event.type == EVENT_OBJECT_RTHUMP ) err = StartAction(RESEARCH_THUMP);
+ if ( event.type == EVENT_OBJECT_RCANON ) err = StartAction(RESEARCH_CANON);
+ if ( event.type == EVENT_OBJECT_RTOWER ) err = StartAction(RESEARCH_TOWER);
+ if ( event.type == EVENT_OBJECT_RPHAZER ) err = StartAction(RESEARCH_PHAZER);
+ if ( event.type == EVENT_OBJECT_RSHIELD ) err = StartAction(RESEARCH_SHIELD);
+ if ( event.type == EVENT_OBJECT_RATOMIC ) err = StartAction(RESEARCH_ATOMIC);
+
+ if( err != ERR_OK && err != ERR_GENERIC )
+ m_displayText->DisplayError(err, m_object);
+
+ if( err != ERR_GENERIC )
return false;
- }
-
- m_research = event.type;
-
- if ( TestResearch(m_research) )
- {
- m_displayText->DisplayError(ERR_RESEARCH_ALREADY, m_object);
- return false;
- }
-
- power = m_object->GetPower();
- if ( power == 0 )
- {
- m_displayText->DisplayError(ERR_RESEARCH_POWER, m_object);
- return false;
- }
- if ( power->GetCapacity() > 1.0f )
- {
- m_displayText->DisplayError(ERR_RESEARCH_TYPE, m_object);
- return false;
- }
- if ( power->GetEnergy() < 1.0f )
- {
- m_displayText->DisplayError(ERR_RESEARCH_ENERGY, m_object);
- return false;
- }
-
- time = SEARCH_TIME;
- if ( event.type == EVENT_OBJECT_RTANK ) time *= 0.3f;
- if ( event.type == EVENT_OBJECT_RFLY ) time *= 0.3f;
- if ( event.type == EVENT_OBJECT_RATOMIC ) time *= 2.0f;
-
- SetBusy(true);
- InitProgressTotal(time);
- UpdateInterface();
-
- m_channelSound = m_sound->Play(SOUND_RESEARCH, m_object->GetPosition(0), 0.0f, 1.0f, true);
- m_sound->AddEnvelope(m_channelSound, 1.0f, 1.0f, 2.0f, SOPER_CONTINUE);
- m_sound->AddEnvelope(m_channelSound, 1.0f, 1.0f, time-4.0f, SOPER_CONTINUE);
- m_sound->AddEnvelope(m_channelSound, 0.0f, 1.0f, 2.0f, SOPER_STOP);
-
- m_phase = ALP_SEARCH;
- m_progress = 0.0f;
- m_speed = 1.0f/time;
- return true;
}
if ( event.type != EVENT_FRAME ) return true;
@@ -236,18 +249,25 @@ bool CAutoResearch::EventProcess(const Event &event)
}
else
{
- SetResearch(m_research); // research done
+ g_researchDone |= m_research; // research done
+
+ m_main->WriteFreeParam();
+
+ Event newEvent(EVENT_UPDINTERFACE);
+ m_eventQueue->AddEvent(newEvent);
+ UpdateInterface();
+
m_displayText->DisplayError(INFO_RESEARCH, m_object);
message = ERR_OK;
- if ( m_research == EVENT_OBJECT_RTANK ) message = INFO_RESEARCHTANK;
- if ( m_research == EVENT_OBJECT_RFLY ) message = INFO_RESEARCHFLY;
- if ( m_research == EVENT_OBJECT_RTHUMP ) message = INFO_RESEARCHTHUMP;
- if ( m_research == EVENT_OBJECT_RCANON ) message = INFO_RESEARCHCANON;
- if ( m_research == EVENT_OBJECT_RTOWER ) message = INFO_RESEARCHTOWER;
- if ( m_research == EVENT_OBJECT_RPHAZER ) message = INFO_RESEARCHPHAZER;
- if ( m_research == EVENT_OBJECT_RSHIELD ) message = INFO_RESEARCHSHIELD;
- if ( m_research == EVENT_OBJECT_RATOMIC ) message = INFO_RESEARCHATOMIC;
+ if ( m_research == RESEARCH_TANK ) message = INFO_RESEARCHTANK;
+ if ( m_research == RESEARCH_FLY ) message = INFO_RESEARCHFLY;
+ if ( m_research == RESEARCH_THUMP ) message = INFO_RESEARCHTHUMP;
+ if ( m_research == RESEARCH_CANON ) message = INFO_RESEARCHCANON;
+ if ( m_research == RESEARCH_TOWER ) message = INFO_RESEARCHTOWER;
+ if ( m_research == RESEARCH_PHAZER ) message = INFO_RESEARCHPHAZER;
+ if ( m_research == RESEARCH_SHIELD ) message = INFO_RESEARCHSHIELD;
+ if ( m_research == RESEARCH_ATOMIC ) message = INFO_RESEARCHATOMIC;
if ( message != ERR_OK )
{
m_displayText->DisplayError(message, m_object);
@@ -474,27 +494,6 @@ bool CAutoResearch::TestResearch(EventType event)
return false;
}
-// Indicates a search as made.
-
-void CAutoResearch::SetResearch(EventType event)
-{
-
- if ( event == EVENT_OBJECT_RTANK ) g_researchDone |= RESEARCH_TANK;
- if ( event == EVENT_OBJECT_RFLY ) g_researchDone |= RESEARCH_FLY;
- if ( event == EVENT_OBJECT_RTHUMP ) g_researchDone |= RESEARCH_THUMP;
- if ( event == EVENT_OBJECT_RCANON ) g_researchDone |= RESEARCH_CANON;
- if ( event == EVENT_OBJECT_RTOWER ) g_researchDone |= RESEARCH_TOWER;
- if ( event == EVENT_OBJECT_RPHAZER ) g_researchDone |= RESEARCH_PHAZER;
- if ( event == EVENT_OBJECT_RSHIELD ) g_researchDone |= RESEARCH_SHIELD;
- if ( event == EVENT_OBJECT_RATOMIC ) g_researchDone |= RESEARCH_ATOMIC;
-
- m_main->WriteFreeParam();
-
- Event newEvent(EVENT_UPDINTERFACE);
- m_eventQueue->AddEvent(newEvent);
- UpdateInterface();
-}
-
// Updates the stop lights.
@@ -600,7 +599,7 @@ bool CAutoResearch::Read(char *line)
m_phase = static_cast< AutoResearchPhase >(OpInt(line, "aPhase", ALP_WAIT));
m_progress = OpFloat(line, "aProgress", 0.0f);
m_speed = OpFloat(line, "aSpeed", 1.0f);
- m_research = static_cast< EventType >(OpInt(line, "aResearch", 0));
+ m_research = static_cast< ResearchType >(OpInt(line, "aResearch", 0));
m_lastUpdateTime = 0.0f;
m_lastParticle = 0.0f;
@@ -608,4 +607,3 @@ bool CAutoResearch::Read(char *line)
return true;
}
-
diff --git a/src/object/auto/autoresearch.h b/src/object/auto/autoresearch.h
index 6c804ef..dcb9f7b 100644
--- a/src/object/auto/autoresearch.h
+++ b/src/object/auto/autoresearch.h
@@ -41,6 +41,7 @@ public:
void DeleteObject(bool bAll=false);
void Init();
+ Error StartAction(int result);
bool EventProcess(const Event &event);
Error GetError();
@@ -54,7 +55,6 @@ protected:
void UpdateInterface(float rTime);
void OkayButton(Ui::CWindow *pw, EventType event);
bool TestResearch(EventType event);
- void SetResearch(EventType event);
void FireStopUpdate(float progress, bool bLightOn);
protected:
@@ -64,7 +64,7 @@ protected:
float m_timeVirus;
float m_lastUpdateTime;
float m_lastParticle;
- EventType m_research;
+ ResearchType m_research;
int m_partiStop[6];
int m_channelSound;
};
diff --git a/src/object/auto/autoroot.cpp b/src/object/auto/autoroot.cpp
index a390e90..7e5c5e7 100644
--- a/src/object/auto/autoroot.cpp
+++ b/src/object/auto/autoroot.cpp
@@ -115,4 +115,3 @@ Error CAutoRoot::GetError()
return ERR_OK;
}
-
diff --git a/src/object/auto/autosafe.cpp b/src/object/auto/autosafe.cpp
index fc83400..2871a70 100644
--- a/src/object/auto/autosafe.cpp
+++ b/src/object/auto/autosafe.cpp
@@ -400,7 +400,7 @@ int CAutoSafe::CountKeys()
Math::Vector cPos, oPos;
Math::Point rot;
ObjectType oType;
- float dist, angle, limit, cAngle, oAngle;
+ float dist, angle, limit = 0.0f, cAngle, oAngle = 0.0f;
int i, index;
cPos = m_object->GetPosition(0);
@@ -611,5 +611,3 @@ CObject* CAutoSafe::SearchVehicle()
return 0;
}
-
-
diff --git a/src/object/auto/autostation.cpp b/src/object/auto/autostation.cpp
index a2f5b6b..2c0aa02 100644
--- a/src/object/auto/autostation.cpp
+++ b/src/object/auto/autostation.cpp
@@ -82,7 +82,7 @@ bool CAutoStation::EventProcess(const Event &event)
Math::Matrix* mat;
Math::Vector pos, ppos, speed;
Math::Point dim;
- CObject* vehicule;
+ CObject* vehicle;
CObject* power;
Gfx::TerrainRes res;
float big, energy, used, add, freq;
@@ -133,10 +133,10 @@ bool CAutoStation::EventProcess(const Event &event)
freq = 1.0f;
if ( big > 0.0f )
{
- vehicule = SearchVehicle();
- if ( vehicule != 0 )
+ vehicle = SearchVehicle();
+ if ( vehicle != 0 )
{
- power = vehicule->GetPower();
+ power = vehicle->GetPower();
if ( power != 0 && power->GetCapacity() == 1.0f )
{
energy = power->GetEnergy();
@@ -149,7 +149,7 @@ bool CAutoStation::EventProcess(const Event &event)
big -= add/4.0f; // discharge the large battery
}
- power = vehicule->GetFret();
+ power = vehicle->GetFret();
if ( power != 0 && power->GetType() == OBJECT_POWER )
{
energy = power->GetEnergy();
@@ -368,4 +368,3 @@ void CAutoStation::UpdateInterface(float rTime)
}
}
-
diff --git a/src/object/auto/autotower.cpp b/src/object/auto/autotower.cpp
index e3b06cf..17a41f4 100644
--- a/src/object/auto/autotower.cpp
+++ b/src/object/auto/autotower.cpp
@@ -397,7 +397,7 @@ void CAutoTower::FireStopUpdate(float progress, bool bLightOn)
pos.y = 18.0f;
pos.z = listpos[i*2+1];
pos = Transform(*mat, pos);
-
+
m_partiStop[i] = m_particle->CreateParticle(pos, speed,
dim, Gfx::PARTISELR,
1.0f, 0.0f, 0.0f);
@@ -544,4 +544,3 @@ bool CAutoTower::Read(char *line)
return true;
}
-
diff --git a/src/object/brain.cpp b/src/object/brain.cpp
index f42ea7e..9e5149e 100644
--- a/src/object/brain.cpp
+++ b/src/object/brain.cpp
@@ -1309,9 +1309,11 @@ bool CBrain::CreateInterface(bool bSelect)
type == OBJECT_ANT ||
type == OBJECT_SPIDER ||
type == OBJECT_BEE ||
- type == OBJECT_WORM ) // vehicle?
+ type == OBJECT_WORM ||
+ type == OBJECT_CONTROLLER) // vehicle?
{
- if (!(m_main->GetRetroMode())) {
+ if (!(m_main->GetRetroMode()))
+ {
ddim.x = dim.x*5.1f;
ddim.y = dim.y*2.0f; // default => 2
pos.x = ox+sx*0.0f;
@@ -1334,7 +1336,8 @@ bool CBrain::CreateInterface(bool bSelect)
type == OBJECT_MOBILEfi ||
type == OBJECT_MOBILEfs ||
type == OBJECT_MOBILEft ||
- type == OBJECT_BEE ) // driving?
+ type == OBJECT_BEE ||
+ type == OBJECT_CONTROLLER) // driving?
{
pos.x = ox+sx*6.4f;
pos.y = oy+sy*0;
@@ -1346,8 +1349,9 @@ bool CBrain::CreateInterface(bool bSelect)
pb = pw->CreateButton(pos, dim, 28, EVENT_OBJECT_GASUP);
pb->SetImmediat(true);
- if ( type != OBJECT_HUMAN ||
- m_object->GetOption() != 2 )
+ if ( (type != OBJECT_HUMAN &&
+ type != OBJECT_CONTROLLER) ||
+ m_object->GetOption() != 2 )
{
pos.x = ox+sx*15.3f;
pos.y = oy+sy*0;
@@ -2305,7 +2309,8 @@ void CBrain::UpdateInterface()
type == OBJECT_ANT ||
type == OBJECT_SPIDER ||
type == OBJECT_BEE ||
- type == OBJECT_WORM ) // vehicle?
+ type == OBJECT_WORM ||
+ type == OBJECT_CONTROLLER) // vehicle?
{
bRun = false;
if ( m_script[m_selScript] != 0 )
@@ -2482,7 +2487,7 @@ void CBrain::UpdateScript(Ui::CWindow *pw)
}
}
- pl->SetName(i, name);
+ pl->SetItemName(i, name);
}
if ( !bSoluce )
@@ -2716,6 +2721,23 @@ bool CBrain::ReadSoluce(char* filename)
return true;
}
+// Load a script from text buffer.
+
+bool CBrain::SendProgram(int rank, const char* buffer)
+{
+ if ( m_script[rank] == 0 )
+ {
+ m_script[rank] = new CScript(m_object, &m_secondaryTask);
+ }
+
+ if ( m_script[rank]->SendScript(buffer) ) return true;
+
+ delete m_script[rank];
+ m_script[rank] = 0;
+
+ return false;
+}
+
// Load a script with a text file.
bool CBrain::ReadProgram(int rank, const char* filename)
diff --git a/src/object/brain.h b/src/object/brain.h
index eba8004..dcf07a4 100644
--- a/src/object/brain.h
+++ b/src/object/brain.h
@@ -52,7 +52,7 @@ class CTerrain;
class CWater;
class CCamera;
class CParticle;
-} /* Gfx */
+} /* Gfx */
const int BRAINMAXSCRIPT = 10;
@@ -114,6 +114,7 @@ public:
char* GetScriptName(int rank);
void SetSoluceName(char *name);
char* GetSoluceName();
+ bool SendProgram(int rank, const char* buffer);
bool ReadSoluce(char* filename);
bool ReadProgram(int rank, const char* filename);
diff --git a/src/object/mainmovie.cpp b/src/object/mainmovie.cpp
index 04c0d56..85abee2 100644
--- a/src/object/mainmovie.cpp
+++ b/src/object/mainmovie.cpp
@@ -228,4 +228,3 @@ MainMovieType CMainMovie::GetStopType()
return m_stopType;
}
-
diff --git a/src/object/motion/motionant.cpp b/src/object/motion/motionant.cpp
index 384d683..16e53aa 100644
--- a/src/object/motion/motionant.cpp
+++ b/src/object/motion/motionant.cpp
@@ -75,7 +75,7 @@ bool CMotionAnt::Create(Math::Vector pos, float angle, ObjectType type,
// Creates the main base.
rank = m_engine->CreateObject();
- m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICULE); // this is a moving object
+ m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICLE); // this is a moving object
m_object->SetObjectRank(0, rank);
modelManager->AddModelReference("ant1.mod", false, rank);
m_object->SetPosition(0, pos);
@@ -425,7 +425,7 @@ bool CMotionAnt::EventFrame(const Event &event)
{
Math::Vector dir, pos, speed;
Math::Point dim;
- float s, a, prog, time;
+ float s, a, prog = 0.0f, time;
float tSt[9], tNd[9];
int i, ii, st, nd, action;
bool bStop;
@@ -831,4 +831,3 @@ bool CMotionAnt::EventFrame(const Event &event)
return true;
}
-
diff --git a/src/object/motion/motionbee.cpp b/src/object/motion/motionbee.cpp
index 8f69945..2a052b2 100644
--- a/src/object/motion/motionbee.cpp
+++ b/src/object/motion/motionbee.cpp
@@ -73,7 +73,7 @@ bool CMotionBee::Create(Math::Vector pos, float angle, ObjectType type,
// Creates main base.
rank = m_engine->CreateObject();
- m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICULE); // this is a moving object
+ m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICLE); // this is a moving object
m_object->SetObjectRank(0, rank);
modelManager->AddModelReference("bee1.mod", false, rank);
m_object->SetPosition(0, pos);
@@ -406,7 +406,7 @@ bool CMotionBee::EventProcess(const Event &event)
bool CMotionBee::EventFrame(const Event &event)
{
Math::Vector dir;
- float s, a, prog;
+ float s, a, prog = 0.0f;
int action, i, st, nd;
bool bStop;
@@ -610,4 +610,3 @@ bool CMotionBee::EventFrame(const Event &event)
return true;
}
-
diff --git a/src/object/motion/motiondummy.cpp b/src/object/motion/motiondummy.cpp
new file mode 100644
index 0000000..86e389e
--- /dev/null
+++ b/src/object/motion/motiondummy.cpp
@@ -0,0 +1,85 @@
+// * This file is part of the COLOBOT source code
+// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
+// * Copyright (C) 2013 Polish Portal of Colobot (PPC)
+// *
+// * 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 3 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, see http://www.gnu.org/licenses/.
+
+
+#include "object/motion/motiondummy.h"
+#include "physics/physics.h"
+#include "graphics/engine/modelmanager.h"
+
+#include <stdio.h>
+#include <string.h>
+
+// Object's constructor.
+
+CMotionDummy::CMotionDummy(CObject* object) : CMotion(object)
+{
+}
+
+// Object's destructor.
+
+CMotionDummy::~CMotionDummy()
+{
+}
+
+
+// Removes an object.
+
+void CMotionDummy::DeleteObject(bool bAll)
+{
+}
+
+
+// Creates a Dummy traveling any lands on the ground.
+
+bool CMotionDummy::Create(Math::Vector pos, float angle, ObjectType type,
+ float power)
+{
+ m_object->SetType(type);
+
+ // Creates the main base.
+ int rank = m_engine->CreateObject();
+ m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICLE); // this is a moving object
+ m_object->SetObjectRank(0, rank);
+
+ // Movement
+ m_physics->SetType(TYPE_FLYING);
+
+ m_physics->SetLinMotionX(MO_ADVSPEED, 50.0f);
+ m_physics->SetLinMotionX(MO_RECSPEED, 50.0f);
+ m_physics->SetLinMotionX(MO_ADVACCEL, 20.0f);
+ m_physics->SetLinMotionX(MO_RECACCEL, 20.0f);
+ m_physics->SetLinMotionX(MO_STOACCEL, 20.0f);
+ m_physics->SetLinMotionX(MO_TERSLIDE, 0.0f);
+ m_physics->SetLinMotionZ(MO_TERSLIDE, 0.0f);
+ m_physics->SetLinMotionX(MO_TERFORCE, 0.0f);
+ m_physics->SetLinMotionZ(MO_TERFORCE, 0.0f);
+ m_physics->SetLinMotionZ(MO_MOTACCEL, 40.0f);
+ m_physics->SetLinMotionY(MO_ADVSPEED, 60.0f);
+ m_physics->SetLinMotionY(MO_RECSPEED, 60.0f);
+ m_physics->SetLinMotionY(MO_ADVACCEL, 20.0f);
+ m_physics->SetLinMotionY(MO_RECACCEL, 50.0f);
+ m_physics->SetLinMotionY(MO_STOACCEL, 50.0f);
+
+ m_physics->SetCirMotionY(MO_ADVSPEED, 0.4f*Math::PI);
+ m_physics->SetCirMotionY(MO_RECSPEED, 0.4f*Math::PI);
+ m_physics->SetCirMotionY(MO_ADVACCEL, 2.0f);
+ m_physics->SetCirMotionY(MO_RECACCEL, 2.0f);
+ m_physics->SetCirMotionY(MO_STOACCEL, 2.0f);
+
+ return true;
+}
+
diff --git a/src/object/motion/motiondummy.h b/src/object/motion/motiondummy.h
new file mode 100644
index 0000000..2cb3a88
--- /dev/null
+++ b/src/object/motion/motiondummy.h
@@ -0,0 +1,34 @@
+// * This file is part of the COLOBOT source code
+// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
+// * Copyright (C) 2013 Polish Portal of Colobot (PPC)
+// *
+// * 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 3 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, see http://www.gnu.org/licenses/.
+
+// motiondummy.h
+
+#pragma once
+
+
+#include "object/motion/motion.h"
+
+class CMotionDummy : public CMotion
+{
+public:
+ CMotionDummy(CObject* object);
+ ~CMotionDummy();
+
+ void DeleteObject(bool bAll=false);
+ bool Create(Math::Vector pos, float angle, ObjectType type, float power);
+};
+
diff --git a/src/object/motion/motionhuman.cpp b/src/object/motion/motionhuman.cpp
index dc5ff34..edee260 100644
--- a/src/object/motion/motionhuman.cpp
+++ b/src/object/motion/motionhuman.cpp
@@ -107,7 +107,7 @@ bool CMotionHuman::Create(Math::Vector pos, float angle, ObjectType type,
if ( m_main->GetGamerOnlyHead() )
{
rank = m_engine->CreateObject();
- m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICULE); // this is a moving object
+ m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICLE); // this is a moving object
m_object->SetObjectRank(0, rank);
face = m_main->GetGamerFace();
sprintf(filename, "human2h%d.mod", face+1);
@@ -134,7 +134,7 @@ bool CMotionHuman::Create(Math::Vector pos, float angle, ObjectType type,
// Creates the main base.
rank = m_engine->CreateObject();
- m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICULE); // this is a moving object
+ m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICLE); // this is a moving object
m_object->SetObjectRank(0, rank);
if (option == 0) // head in helmet?
@@ -677,7 +677,7 @@ bool CMotionHuman::EventFrame(const Event &event)
float s, a, prog, rTime[2], lTime[2], time, rot, hr, hl;
float al, ar, af;
float tSt[9], tNd[9];
- float aa, bb, shield, deadFactor, level;
+ float aa, bb, shield, deadFactor = 0.0f, level;
int i, ii, st, nd, action, legAction, armAction;
bool bOnBoard, bSwim;
@@ -1617,18 +1617,18 @@ bool CMotionHuman::EventFrame(const Event &event)
legAction == MH_MARCHTAKE )
{
Sound sound[2];
- float speed, synchro, volume[2], freq[2], hard, level;
+ float synchro, volume[2], freq[2], hard;
- speed = m_physics->GetLinMotionX(MO_REASPEED);
+ float speedX = m_physics->GetLinMotionX(MO_REASPEED);
if ( m_object->GetFret() == 0 )
{
- if ( speed > 0.0f ) synchro = 0.21f; // synchro forward
+ if ( speedX > 0.0f ) synchro = 0.21f; // synchro forward
else synchro = 0.29f; // synchro backward
}
else
{
- if ( speed > 0.0f ) synchro = 0.15f; // synchro forward
+ if ( speedX > 0.0f ) synchro = 0.15f; // synchro forward
else synchro = 0.35f; // synchro backward
}
time = rTime[1]+synchro;
@@ -1735,4 +1735,3 @@ void CMotionHuman::StopDisplayPerso()
m_bDisplayPerso = false;
}
-
diff --git a/src/object/motion/motionmother.cpp b/src/object/motion/motionmother.cpp
index 573a2e4..03e7c21 100644
--- a/src/object/motion/motionmother.cpp
+++ b/src/object/motion/motionmother.cpp
@@ -74,7 +74,7 @@ bool CMotionMother::Create(Math::Vector pos, float angle, ObjectType type,
// Creates main base.
rank = m_engine->CreateObject();
- m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICULE); // this is a moving object
+ m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICLE); // this is a moving object
m_object->SetObjectRank(0, rank);
modelManager->AddModelReference("mother1.mod", false, rank);
m_object->SetPosition(0, pos);
@@ -493,4 +493,3 @@ bool CMotionMother::EventFrame(const Event &event)
return true;
}
-
diff --git a/src/object/motion/motionspider.cpp b/src/object/motion/motionspider.cpp
index 59bc6e0..8d339b6 100644
--- a/src/object/motion/motionspider.cpp
+++ b/src/object/motion/motionspider.cpp
@@ -101,7 +101,7 @@ bool CMotionSpider::Create(Math::Vector pos, float angle, ObjectType type,
// Creates the main base.
rank = m_engine->CreateObject();
- m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICULE); // this is a moving object
+ m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICLE); // this is a moving object
m_object->SetObjectRank(0, rank);
// This is an "empty" object, without triangles
m_object->SetPosition(0, pos);
@@ -363,7 +363,7 @@ bool CMotionSpider::EventFrame(const Event &event)
{
Math::Vector dir, pos, speed;
Math::Point dim;
- float s, a, prog, time;
+ float s, a, prog = 0.0f, time;
float tSt[12], tNd[12];
int i, ii, st, nd, action;
bool bStop;
@@ -743,4 +743,3 @@ bool CMotionSpider::EventFrame(const Event &event)
return true;
}
-
diff --git a/src/object/motion/motiontoto.cpp b/src/object/motion/motiontoto.cpp
index ddb1867..b4ed89d 100644
--- a/src/object/motion/motiontoto.cpp
+++ b/src/object/motion/motiontoto.cpp
@@ -88,7 +88,7 @@ bool CMotionToto::Create(Math::Vector pos, float angle, ObjectType type,
// Creates the head.
rank = m_engine->CreateObject();
- m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICULE); // this is a moving object
+ m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICLE); // this is a moving object
m_object->SetObjectRank(0, rank);
modelManager->AddModelReference("toto1.mod", false, rank);
m_object->SetPosition(0, pos);
@@ -853,4 +853,3 @@ void CMotionToto::SetLinkType(ObjectType type)
m_type = type;
}
-
diff --git a/src/object/motion/motionvehicle.cpp b/src/object/motion/motionvehicle.cpp
index 44b8fdd..a67ae24 100644
--- a/src/object/motion/motionvehicle.cpp
+++ b/src/object/motion/motionvehicle.cpp
@@ -102,7 +102,7 @@ bool CMotionVehicle::Create(Math::Vector pos, float angle, ObjectType type,
// Creates the main base.
rank = m_engine->CreateObject();
- m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICULE); // this is a moving object
+ m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICLE); // this is a moving object
m_object->SetObjectRank(0, rank);
if (type == OBJECT_MOBILEfa ||
@@ -931,6 +931,7 @@ bool CMotionVehicle::Create(Math::Vector pos, float angle, ObjectType type,
rank = m_engine->CreateObject();
m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_FIX);
pPower->SetObjectRank(0, rank);
+ pPower->CreateShadowCircle(1.5f, 1.0f); //create a shadow for battary
if ( power <= 1.0f ) modelManager->AddModelCopy("power.mod", false, rank);
else modelManager->AddModelCopy("atomic.mod", false, rank);
@@ -1649,7 +1650,7 @@ bool CMotionVehicle::EventFrameFly(const Event &event)
bool CMotionVehicle::EventFrameInsect(const Event &event)
{
Math::Vector dir;
- float s, a, prog, time;
+ float s, a, prog = 0.0f, time;
int i, st, nd, action;
bool bStop, bOnBoard;
@@ -1943,4 +1944,3 @@ void CMotionVehicle::SetTraceWidth(float width)
m_traceWidth = width;
}
-
diff --git a/src/object/motion/motionworm.cpp b/src/object/motion/motionworm.cpp
index ee555a8..80bf7fc 100644
--- a/src/object/motion/motionworm.cpp
+++ b/src/object/motion/motionworm.cpp
@@ -89,9 +89,9 @@ bool CMotionWorm::Create(Math::Vector pos, float angle, ObjectType type,
// Creates the main base.
rank = m_engine->CreateObject();
- m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICULE); // this is a moving object
+ m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICLE); // this is a moving object
m_object->SetObjectRank(0, rank);
- // This is an "empty" object, without triangles
+ // This is an "empty" object, without triangles
m_object->SetPosition(0, pos);
m_object->SetAngleY(0, angle);
@@ -356,4 +356,3 @@ bool CMotionWorm::EventFrame(const Event &event)
return true;
}
-
diff --git a/src/object/object.cpp b/src/object/object.cpp
index b621ef2..4cf0688 100644
--- a/src/object/object.cpp
+++ b/src/object/object.cpp
@@ -64,6 +64,7 @@
#include "object/motion/motion.h"
#include "object/motion/motionant.h"
#include "object/motion/motionbee.h"
+#include "object/motion/motiondummy.h"
#include "object/motion/motionhuman.h"
#include "object/motion/motionmother.h"
#include "object/motion/motionspider.h"
@@ -342,7 +343,7 @@ CObject::CObject()
m_botVar = CBotVar::Create("", CBotTypResult(CBotTypClass, "object"));
m_botVar->SetUserPtr(this);
m_botVar->SetIdent(m_id);
-
+
CObjectManager::GetInstancePointer()->AddInstance(this);
}
@@ -2145,6 +2146,10 @@ bool CObject::CreateVehicle(Math::Vector pos, float angle, ObjectType type,
{
m_motion = new CMotionHuman(this);
}
+ else if ( type == OBJECT_CONTROLLER )
+ {
+ m_motion = new CMotionDummy(this); //dummy object
+ }
else
{
m_motion = new CMotionVehicle(this);
@@ -7322,7 +7327,7 @@ bool CObject::GetTraceDown()
CMotionVehicle* mv = dynamic_cast<CMotionVehicle*>(m_motion);
if (mv == nullptr)
{
- GetLogger()->Debug("GetTraceDown() invalid m_motion class!\n");
+ GetLogger()->Trace("GetTraceDown() invalid m_motion class!\n");
return false;
}
return mv->GetTraceDown();
@@ -7334,7 +7339,7 @@ void CObject::SetTraceDown(bool bDown)
CMotionVehicle* mv = dynamic_cast<CMotionVehicle*>(m_motion);
if (mv == nullptr)
{
- GetLogger()->Debug("SetTraceDown() invalid m_motion class!\n");
+ GetLogger()->Trace("SetTraceDown() invalid m_motion class!\n");
return;
}
mv->SetTraceDown(bDown);
@@ -7346,7 +7351,7 @@ int CObject::GetTraceColor()
CMotionVehicle* mv = dynamic_cast<CMotionVehicle*>(m_motion);
if (mv == nullptr)
{
- GetLogger()->Debug("GetTraceColor() invalid m_motion class!\n");
+ GetLogger()->Trace("GetTraceColor() invalid m_motion class!\n");
return 0;
}
return mv->GetTraceColor();
@@ -7358,7 +7363,7 @@ void CObject::SetTraceColor(int color)
CMotionVehicle* mv = dynamic_cast<CMotionVehicle*>(m_motion);
if (mv == nullptr)
{
- GetLogger()->Debug("SetTraceColor() invalid m_motion class!\n");
+ GetLogger()->Trace("SetTraceColor() invalid m_motion class!\n");
return;
}
mv->SetTraceColor(color);
@@ -7370,7 +7375,7 @@ float CObject::GetTraceWidth()
CMotionVehicle* mv = dynamic_cast<CMotionVehicle*>(m_motion);
if (mv == nullptr)
{
- GetLogger()->Debug("GetTraceWidth() invalid m_motion class!\n");
+ GetLogger()->Trace("GetTraceWidth() invalid m_motion class!\n");
return 0.0f;
}
return mv->GetTraceWidth();
@@ -7382,10 +7387,9 @@ void CObject::SetTraceWidth(float width)
CMotionVehicle* mv = dynamic_cast<CMotionVehicle*>(m_motion);
if (mv == nullptr)
{
- GetLogger()->Debug("SetTraceWidth() invalid m_motion class!\n");
+ GetLogger()->Trace("SetTraceWidth() invalid m_motion class!\n");
return;
}
mv->SetTraceWidth(width);
}
-
diff --git a/src/object/object.h b/src/object/object.h
index 4d8cc02..25ea708 100644
--- a/src/object/object.h
+++ b/src/object/object.h
@@ -156,6 +156,7 @@ enum ObjectType
OBJECT_MOBILEsa = 210, //! < submarine
OBJECT_MOBILEtg = 211, //! < training target
OBJECT_MOBILEdr = 212, //! < robot drawing
+ OBJECT_CONTROLLER = 213, //! < mission controller
OBJECT_WAYPOINT = 250, //! < waypoint
OBJECT_FLAGb = 260, //! < blue flag
OBJECT_FLAGr = 261, //! < red flag
diff --git a/src/object/objman.cpp b/src/object/objman.cpp
index 76ab9b0..e4102b8 100644
--- a/src/object/objman.cpp
+++ b/src/object/objman.cpp
@@ -385,4 +385,5 @@ CObject* CObjectManager::CreateObject(Math::Vector pos, float angle, float zoom,
}
return object;
-} \ No newline at end of file
+}
+
diff --git a/src/object/objman.h b/src/object/objman.h
index 3bdf1a2..3087383 100644
--- a/src/object/objman.h
+++ b/src/object/objman.h
@@ -15,7 +15,7 @@
// * along with this program. If not, see http://www.gnu.org/licenses/.
/**
- * \file common/objman.h
+ * \file object/objman.h
* \brief Instance manager for objects
*/
@@ -51,4 +51,3 @@ protected:
int usedCount;
};
-
diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp
index 6ba09a5..27492f3 100644
--- a/src/object/robotmain.cpp
+++ b/src/object/robotmain.cpp
@@ -79,6 +79,7 @@
#include "ui/slider.h"
#include "ui/window.h"
+#include <iomanip>
template<> CRobotMain* CSingleton<CRobotMain>::m_instance = nullptr;
@@ -602,11 +603,8 @@ bool rPoint(CBotVar* pThis, CBotVar* var, CBotVar* pResult, int& Exception)
return true; // no interruption
}
-
-
-
//! Constructor of robot application
-CRobotMain::CRobotMain(CApplication* app)
+CRobotMain::CRobotMain(CApplication* app, bool loadProfile)
{
m_app = app;
@@ -656,6 +654,7 @@ CRobotMain::CRobotMain(CApplication* app)
m_terrainCreate = false;
m_version = 1;
+ m_controller = nullptr;
m_retroStyle = false;
m_immediatSatCom = false;
m_beginSatCom = false;
@@ -705,27 +704,31 @@ CRobotMain::CRobotMain(CApplication* app)
m_windowPos = Math::Point(0.15f, 0.17f);
m_windowDim = Math::Point(0.70f, 0.66f);
- // TODO: profile
- // float fValue;
- // int iValue;
+ float fValue;
+ int iValue;
- // if (GetLocalProfileFloat("Edit", "FontSize", fValue)) m_fontSize = fValue;
- // if (GetLocalProfileFloat("Edit", "WindowPos.x", fValue)) m_windowPos.x = fValue;
- // if (GetLocalProfileFloat("Edit", "WindowPos.y", fValue)) m_windowPos.y = fValue;
- // if (GetLocalProfileFloat("Edit", "WindowDim.x", fValue)) m_windowDim.x = fValue;
- // if (GetLocalProfileFloat("Edit", "WindowDim.y", fValue)) m_windowDim.y = fValue;
+ if (loadProfile)
+ {
+ if (GetProfile().GetLocalProfileFloat("Edit", "FontSize", fValue)) m_fontSize = fValue;
+ if (GetProfile().GetLocalProfileFloat("Edit", "WindowPosX", fValue)) m_windowPos.x = fValue;
+ if (GetProfile().GetLocalProfileFloat("Edit", "WindowPosY", fValue)) m_windowPos.y = fValue;
+ if (GetProfile().GetLocalProfileFloat("Edit", "WindowDimX", fValue)) m_windowDim.x = fValue;
+ if (GetProfile().GetLocalProfileFloat("Edit", "WindowDimY", fValue)) m_windowDim.y = fValue;
+ }
m_IOPublic = false;
m_IODim = Math::Point(320.0f/640.0f, (121.0f+18.0f*8)/480.0f);
m_IOPos.x = (1.0f-m_IODim.x)/2.0f; // in the middle
m_IOPos.y = (1.0f-m_IODim.y)/2.0f;
- /* TODO: profile
- if (GetLocalProfileInt ("Edit", "IOPublic", iValue)) m_IOPublic = iValue;
- if (GetLocalProfileFloat("Edit", "IOPos.x", fValue)) m_IOPos.x = fValue;
- if (GetLocalProfileFloat("Edit", "IOPos.y", fValue)) m_IOPos.y = fValue;
- if (GetLocalProfileFloat("Edit", "IODim.x", fValue)) m_IODim.x = fValue;
- if (GetLocalProfileFloat("Edit", "IODim.y", fValue)) m_IODim.y = fValue; */
+ if (loadProfile)
+ {
+ if (GetProfile().GetLocalProfileInt ("Edit", "IOPublic", iValue)) m_IOPublic = iValue;
+ if (GetProfile().GetLocalProfileFloat("Edit", "IOPosX", fValue)) m_IOPos.x = fValue;
+ if (GetProfile().GetLocalProfileFloat("Edit", "IOPosY", fValue)) m_IOPos.y = fValue;
+ if (GetProfile().GetLocalProfileFloat("Edit", "IODimX", fValue)) m_IODim.x = fValue;
+ if (GetProfile().GetLocalProfileFloat("Edit", "IODimY", fValue)) m_IODim.y = fValue;
+ }
m_short->FlushShortcuts();
InitEye();
@@ -741,12 +744,11 @@ CRobotMain::CRobotMain(CApplication* app)
g_researchEnable = 0;
g_unit = UNIT;
- m_gamerName[0] = 0;
- /* TODO: profile
- GetLocalProfileString("Gamer", "LastName", m_gamerName, 100); */
+ m_gamerName = "";
+ if (loadProfile) GetProfile().GetLocalProfileString("Gamer", "LastName", m_gamerName);
SetGlobalGamerName(m_gamerName);
ReadFreeParam();
- m_dialog->SetupRecall();
+ if (loadProfile) m_dialog->SetupRecall();
for (int i = 0; i < MAXSHOWLIMIT; i++)
{
@@ -805,11 +807,48 @@ CRobotMain::CRobotMain(CApplication* app)
CBotProgram::DefineNum("FilterOnlyLanding", FILTER_ONLYLANDING);
CBotProgram::DefineNum("FilterOnlyFliying", FILTER_ONLYFLYING);
- CBotProgram::DefineNum("ExploNone", 0);
- CBotProgram::DefineNum("ExploBoum", EXPLO_BOUM);
- CBotProgram::DefineNum("ExploBurn", EXPLO_BURN);
+ CBotProgram::DefineNum("ExploNone", 0);
+ CBotProgram::DefineNum("ExploBoum", EXPLO_BOUM);
+ CBotProgram::DefineNum("ExploBurn", EXPLO_BURN);
CBotProgram::DefineNum("ExploWater", EXPLO_WATER);
+ CBotProgram::DefineNum("ResultNotEnded", ERR_MISSION_NOTERM);
+ CBotProgram::DefineNum("ResultLost", INFO_LOST);
+ CBotProgram::DefineNum("ResultLostQuick", INFO_LOSTq);
+ CBotProgram::DefineNum("ResultWin", ERR_OK);
+
+ CBotProgram::DefineNum("BuildBotFactory", BUILD_FACTORY);
+ CBotProgram::DefineNum("BuildDerrick", BUILD_DERRICK);
+ CBotProgram::DefineNum("BuildConverter", BUILD_CONVERT);
+ CBotProgram::DefineNum("BuildRadarStation", BUILD_RADAR);
+ CBotProgram::DefineNum("BuildPowerPlant", BUILD_ENERGY);
+ CBotProgram::DefineNum("BuildNuclearPlant", BUILD_NUCLEAR);
+ CBotProgram::DefineNum("BuildPowerStation", BUILD_STATION);
+ CBotProgram::DefineNum("BuildRepairCenter", BUILD_REPAIR);
+ CBotProgram::DefineNum("BuildDefenseTower", BUILD_TOWER);
+ CBotProgram::DefineNum("BuildResearchCenter", BUILD_RESEARCH);
+ CBotProgram::DefineNum("BuildAutoLab", BUILD_LABO);
+ CBotProgram::DefineNum("BuildPowerCaptor", BUILD_PARA);
+ CBotProgram::DefineNum("BuildExchangePost", BUILD_INFO);
+ CBotProgram::DefineNum("BuildDestroyer", BUILD_DESTROYER);
+ CBotProgram::DefineNum("FlatGround", BUILD_GFLAT);
+ CBotProgram::DefineNum("UseFlags", BUILD_FLAG);
+ CBotProgram::DefineNum("ResearchTracked", RESEARCH_TANK);
+ CBotProgram::DefineNum("ResearchWinged", RESEARCH_FLY);
+ CBotProgram::DefineNum("ResearchShooter", RESEARCH_CANON);
+ CBotProgram::DefineNum("ResearchDefenseTower", RESEARCH_TOWER);
+ CBotProgram::DefineNum("ResearchNuclearPlant", RESEARCH_ATOMIC);
+ CBotProgram::DefineNum("ResearchThumper", RESEARCH_THUMP);
+ CBotProgram::DefineNum("ResearchShielder", RESEARCH_SHIELD);
+ CBotProgram::DefineNum("ResearchPhazerShooter", RESEARCH_PHAZER);
+ CBotProgram::DefineNum("ResearchLegged", RESEARCH_iPAW);
+ CBotProgram::DefineNum("ResearchOrgaShooter", RESEARCH_iGUN);
+ CBotProgram::DefineNum("ResearchRecycler", RESEARCH_RECYCLER);
+ CBotProgram::DefineNum("ResearchSubber", RESEARCH_SUBM);
+ CBotProgram::DefineNum("ResearchSniffer", RESEARCH_SNIFFER);
+
+//? CBotProgram::
+
CBotProgram::DefineNum("PolskiPortalColobota", 1337);
CBotClass* bc;
@@ -837,6 +876,10 @@ CRobotMain::CRobotMain(CApplication* app)
bc->AddItem("energyCell", CBotTypResult(CBotTypPointer, "object"), PR_READ);
bc->AddItem("load", CBotTypResult(CBotTypPointer, "object"), PR_READ);
bc->AddItem("id", CBotTypResult(CBotTypInt), PR_READ);
+ bc->AddFunction("busy", CScript::rBusy, CScript::cBusy);
+ bc->AddFunction("factory", CScript::rFactory, CScript::cFactory);
+ bc->AddFunction("research", CScript::rResearch, CScript::cClassOneFloat);
+ bc->AddFunction("destroy", CScript::rDestroy, CScript::cClassNull);
// Initializes the class FILE.
InitClassFILE();
@@ -901,11 +944,20 @@ Ui::CDisplayText* CRobotMain::GetDisplayText()
//! Creates the file colobot.ini at the first time
void CRobotMain::CreateIni()
{
- /* TODO: profile
- int iValue;
- // colobot.ini doesn't exist?
- if (!GetLocalProfileInt("Setup", "TotoMode", iValue))
- m_dialog->SetupMemorize();*/
+ m_dialog->SetupMemorize();
+
+ GetProfile().SetLocalProfileFloat("Edit", "FontSize", m_fontSize);
+ GetProfile().SetLocalProfileFloat("Edit", "WindowPosX", m_windowPos.x);
+ GetProfile().SetLocalProfileFloat("Edit", "WindowPosY", m_windowPos.y);
+ GetProfile().SetLocalProfileFloat("Edit", "WindowDimX", m_windowDim.x);
+ GetProfile().SetLocalProfileFloat("Edit", "WindowDimY", m_windowDim.y);
+ GetProfile().SetLocalProfileInt("Edit", "IOPublic", m_IOPublic);
+ GetProfile().SetLocalProfileFloat("Edit", "IOPosX", m_IOPos.x);
+ GetProfile().SetLocalProfileFloat("Edit", "IOPosY", m_IOPos.y);
+ GetProfile().SetLocalProfileFloat("Edit", "IODimX", m_IODim.x);
+ GetProfile().SetLocalProfileFloat("Edit", "IODimY", m_IODim.y);
+
+ GetProfile().SaveCurrentDirectory();
}
void CRobotMain::SetDefaultInputBindings()
@@ -1232,7 +1284,7 @@ void CRobotMain::ChangePhase(Phase phase)
ddim.x = dim.x*2; ddim.y = dim.y*2;
m_interface->CreateButton(pos, ddim, 16, EVENT_BUTTON_OK);
m_displayText->DisplayError(INFO_LOST, Math::Vector(0.0f,0.0f,0.0f), 15.0f, 60.0f, 1000.0f);
-
+
StartMusic();
}
}
@@ -1481,9 +1533,8 @@ bool CRobotMain::EventProcess(Event &event)
ChangePhase(PHASE_WIN);
else if (m_lostDelay > 0.0f)
ChangePhase(PHASE_LOST);
- else if (!m_cmdEdit) {
+ else if (!m_cmdEdit)
m_dialog->StartAbort(); // do you want to leave?
- }
}
if (event.key.key == KEY(PAUSE))
{
@@ -1791,6 +1842,24 @@ void CRobotMain::ExecuteCmd(char *cmd)
return;
}
+ if (strcmp(cmd, "controller") == 0)
+ {
+ if (m_controller != nullptr)
+ {
+ // Don't use SelectObject because it checks if the object is selectable
+ if (m_camera->GetType() == Gfx::CAM_TYPE_VISIT)
+ StopDisplayVisit();
+
+ CObject* prev = DeselectAll();
+ if (prev != nullptr && prev != m_controller)
+ m_controller->AddDeselList(prev);
+
+ SelectOneObject(m_controller, true);
+ m_short->UpdateShortcuts();
+ }
+ return;
+ }
+
if (strcmp(cmd, "photo1") == 0)
{
m_freePhoto = !m_freePhoto;
@@ -1859,7 +1928,7 @@ void CRobotMain::ExecuteCmd(char *cmd)
object->SetRange(object->GetRange()*10.0f);
return;
}
-
+
if (strcmp(cmd, "\155\157\157") == 0)
{
// VGhpcyBpcyBlYXN0ZXItZWdnIGFuZCBzbyBpdCBzaG91bGQgYmUgb2JmdXNjYXRlZCEgRG8gbm90
@@ -2013,20 +2082,23 @@ void CRobotMain::ExecuteCmd(char *cmd)
return;
}
- if (strcmp(cmd, "speed4") == 0) {
+ if (strcmp(cmd, "speed4") == 0)
+ {
SetSpeed(4.0f);
UpdateSpeedLabel();
- return;
+ return;
}
- if (strcmp(cmd, "speed8") == 0) {
+ if (strcmp(cmd, "speed8") == 0)
+ {
SetSpeed(8.0f);
UpdateSpeedLabel();
- return;
+ return;
}
- if (strcmp(cmd, "crazy") == 0) {
+ if (strcmp(cmd, "crazy") == 0)
+ {
SetSpeed(1000.0f);
UpdateSpeedLabel();
- return;
+ return;
}
if (m_phase == PHASE_SIMUL)
@@ -2050,7 +2122,7 @@ void CRobotMain::FlushDisplayInfo()
m_infoFilename[i][0] = 0;
m_infoPos[i] = 0;
}
- strcpy(m_infoFilename[SATCOM_OBJECT], "help/") + m_app->GetLanguageChar() + std::string("/objects.txt");
+ strcpy(m_infoFilename[SATCOM_OBJECT], "objects.txt");
m_infoIndex = 0;
}
@@ -2123,7 +2195,7 @@ void CRobotMain::StartDisplayInfo(const char *filename, int index)
void CRobotMain::StopDisplayInfo()
{
if (m_cmdEdit) return;
-
+
if (m_movieInfoIndex != -1) // film to read the SatCom?
m_movie->Start(MM_SATCOMclose, 2.0f);
@@ -2212,8 +2284,7 @@ float CRobotMain::GetGameTime()
void CRobotMain::SetFontSize(float size)
{
m_fontSize = size;
- /* TODO: profile
- SetLocalProfileFloat("Edit", "FontSize", m_fontSize); */
+ GetProfile().SetLocalProfileFloat("Edit", "FontSize", m_fontSize);
}
float CRobotMain::GetFontSize()
@@ -2225,9 +2296,8 @@ float CRobotMain::GetFontSize()
void CRobotMain::SetWindowPos(Math::Point pos)
{
m_windowPos = pos;
- /* TODO: profile
- SetLocalProfileFloat("Edit", "WindowPos.x", m_windowPos.x);
- SetLocalProfileFloat("Edit", "WindowPos.y", m_windowPos.y); */
+ GetProfile().SetLocalProfileFloat("Edit", "WindowPosX", m_windowPos.x);
+ GetProfile().SetLocalProfileFloat("Edit", "WindowPosY", m_windowPos.y);
}
Math::Point CRobotMain::GetWindowPos()
@@ -2238,9 +2308,8 @@ Math::Point CRobotMain::GetWindowPos()
void CRobotMain::SetWindowDim(Math::Point dim)
{
m_windowDim = dim;
- /* TODO: profile
- SetLocalProfileFloat("Edit", "WindowDim.x", m_windowDim.x);
- SetLocalProfileFloat("Edit", "WindowDim.y", m_windowDim.y); */
+ GetProfile().SetLocalProfileFloat("Edit", "WindowDimX", m_windowDim.x);
+ GetProfile().SetLocalProfileFloat("Edit", "WindowDimY", m_windowDim.y);
}
Math::Point CRobotMain::GetWindowDim()
@@ -2253,8 +2322,7 @@ Math::Point CRobotMain::GetWindowDim()
void CRobotMain::SetIOPublic(bool mode)
{
m_IOPublic = mode;
- /* TODO: profile
- SetLocalProfileInt("Edit", "IOPublic", m_IOPublic); */
+ GetProfile().SetLocalProfileInt("Edit", "IOPublic", m_IOPublic);
}
bool CRobotMain::GetIOPublic()
@@ -2265,9 +2333,8 @@ bool CRobotMain::GetIOPublic()
void CRobotMain::SetIOPos(Math::Point pos)
{
m_IOPos = pos;
- /* TODO: profile
- SetLocalProfileFloat("Edit", "IOPos.x", m_IOPos.x);
- SetLocalProfileFloat("Edit", "IOPos.y", m_IOPos.y); */
+ GetProfile().SetLocalProfileFloat("Edit", "IOPosX", m_IOPos.x);
+ GetProfile().SetLocalProfileFloat("Edit", "IOPosY", m_IOPos.y);
}
Math::Point CRobotMain::GetIOPos()
@@ -2278,9 +2345,8 @@ Math::Point CRobotMain::GetIOPos()
void CRobotMain::SetIODim(Math::Point dim)
{
m_IODim = dim;
- /* TODO: profile
- SetLocalProfileFloat("Edit", "IODim.x", m_IODim.x);
- SetLocalProfileFloat("Edit", "IODim.y", m_IODim.y); */
+ GetProfile().SetLocalProfileFloat("Edit", "IODimX", m_IODim.x);
+ GetProfile().SetLocalProfileFloat("Edit", "IODimY", m_IODim.y);
}
Math::Point CRobotMain::GetIODim()
@@ -3830,6 +3896,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
m_audioChangeTotal = 0;
m_endTakeTotal = 0;
m_endTakeResearch = 0;
+ m_endTakeNever = false;
m_endTakeWinDelay = 2.0f;
m_endTakeLostDelay = 2.0f;
m_obligatoryTotal = 0;
@@ -3838,6 +3905,8 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
m_mapImage = false;
m_mapFilename[0] = 0;
+ m_controller = nullptr;
+
m_colorRefBot.r = 10.0f/256.0f;
m_colorRefBot.g = 166.0f/256.0f;
m_colorRefBot.b = 254.0f/256.0f; // blue
@@ -3875,6 +3944,8 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
m_version = 1;
m_retroStyle = false;
+
+ m_missionResult = ERR_MISSION_NOTERM;
}
char line[500];
@@ -3901,6 +3972,11 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
SetNumericLocale();
+ /*
+ * NOTE: Moving frequently used lines to the top
+ * may speed up loading
+ */
+
while (fgets(line, 500, file) != NULL)
{
lineNum++;
@@ -3920,18 +3996,34 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
// TODO: Fallback to an non-localized entry
sprintf(op, "Title.%c", m_app->GetLanguageChar());
if (Cmd(line, op) && !resetObject)
+ {
OpString(line, "text", m_title);
+ continue;
+ }
sprintf(op, "Resume.%c", m_app->GetLanguageChar());
if (Cmd(line, op) && !resetObject)
+ {
OpString(line, "text", m_resume);
+ continue;
+ }
sprintf(op, "ScriptName.%c", m_app->GetLanguageChar());
if (Cmd(line, op) && !resetObject)
+ {
OpString(line, "text", m_scriptName);
+ continue;
+ }
+
+ if (Cmd(line, "Title")) continue; // Ignore
+ if (Cmd(line, "Resume")) continue; // Ignore
+ if (Cmd(line, "ScriptName")) continue; // Ignore
if (Cmd(line, "ScriptFile") && !resetObject)
+ {
OpString(line, "name", m_scriptFile);
+ continue;
+ }
if (Cmd(line, "Instructions") && !resetObject)
{
@@ -3940,7 +4032,8 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
strcpy(m_infoFilename[SATCOM_HUSTON], path.c_str());
m_immediatSatCom = OpInt(line, "immediat", 0);
- if(m_version >= 2) m_beginSatCom = m_lockedSatCom = OpInt(line, "lock", 0);
+ if (m_version >= 2) m_beginSatCom = m_lockedSatCom = OpInt(line, "lock", 0);
+ continue;
}
if (Cmd(line, "Satellite") && !resetObject)
@@ -3948,6 +4041,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
OpString(line, "name", name);
std::string path = m_app->GetDataFilePath(DIR_HELP, name);
strcpy(m_infoFilename[SATCOM_SAT], path.c_str());
+ continue;
}
if (Cmd(line, "Loading") && !resetObject)
@@ -3955,6 +4049,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
OpString(line, "name", name);
std::string path = m_app->GetDataFilePath(DIR_HELP, name);
strcpy(m_infoFilename[SATCOM_LOADING], path.c_str());
+ continue;
}
if (Cmd(line, "HelpFile") && !resetObject)
@@ -3962,26 +4057,37 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
OpString(line, "name", name);
std::string path = m_app->GetDataFilePath(DIR_HELP, name);
strcpy(m_infoFilename[SATCOM_PROG], path.c_str());
+ continue;
}
if (Cmd(line, "SoluceFile") && !resetObject)
{
OpString(line, "name", name);
std::string path = m_app->GetDataFilePath(DIR_HELP, name);
strcpy(m_infoFilename[SATCOM_SOLUCE], path.c_str());
+ continue;
}
if (Cmd(line, "EndingFile") && !resetObject)
{
m_endingWinRank = OpInt(line, "win", 0);
m_endingLostRank = OpInt(line, "lost", 0);
+ continue;
}
if (Cmd(line, "MessageDelay") && !resetObject)
{
m_displayText->SetDelay(OpFloat(line, "factor", 1.0f));
+ continue;
}
-
- if (Cmd(line, "AudioChange") && !resetObject && m_version >= 2)
+
+ if (Cmd(line, "CacheAudio") && !resetObject && m_version >= 2)
+ {
+ OpString(line, "filename", filename);
+ m_sound->CacheMusic(filename);
+ continue;
+ }
+
+ if (Cmd(line, "AudioChange") && !resetObject && m_version >= 2 && m_controller == nullptr)
{
int i = m_audioChangeTotal;
if (i < 10)
@@ -4002,59 +4108,80 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
continue;
}
- if (Cmd(line, "Audio") && !resetObject)
+ if (Cmd(line, "Audio") && !resetObject && m_controller == nullptr)
{
- if(m_version < 2) {
+ if (m_version < 2)
+ {
int trackid = OpInt(line, "track", 0);
- if(trackid != 0) {
- std::stringstream filename;
- filename << "music" << std::setfill('0') << std::setw(3) << trackid << ".ogg";
- m_audioTrack = filename.str();
+ if (trackid != 0)
+ {
+ std::stringstream filenameStr;
+ filenameStr << "music" << std::setfill('0') << std::setw(3) << trackid << ".ogg";
+ m_audioTrack = filenameStr.str();
}
- } else {
+ }
+ else
+ {
char trackname[100];
OpString(line, "filename", trackname);
m_audioTrack = trackname;
}
m_audioRepeat = OpInt(line, "repeat", 1);
- if(m_audioTrack != "") m_sound->CacheMusic(m_audioTrack);
+ if (m_audioTrack != "") m_sound->CacheMusic(m_audioTrack);
+ continue;
}
if (Cmd(line, "AmbientColor") && !resetObject)
{
m_engine->SetAmbientColor(OpColor(line, "air", Gfx::Color(0.533f, 0.533f, 0.533f, 0.533f)), 0);
m_engine->SetAmbientColor(OpColor(line, "water", Gfx::Color(0.533f, 0.533f, 0.533f, 0.533f)), 1);
+ continue;
}
if (Cmd(line, "FogColor") && !resetObject)
{
m_engine->SetFogColor(OpColor(line, "air", Gfx::Color(0.533f, 0.533f, 0.533f, 0.533f)), 0);
m_engine->SetFogColor(OpColor(line, "water", Gfx::Color(0.533f, 0.533f, 0.533f, 0.533f)), 1);
+ continue;
}
if (Cmd(line, "VehicleColor") && !resetObject)
+ {
m_colorNewBot = OpColor(line, "color", Gfx::Color(0.533f, 0.533f, 0.533f, 0.533f));
+ continue;
+ }
if (Cmd(line, "InsectColor") && !resetObject)
+ {
m_colorNewAlien = OpColor(line, "color", Gfx::Color(0.533f, 0.533f, 0.533f, 0.533f));
+ continue;
+ }
if (Cmd(line, "GreeneryColor") && !resetObject)
+ {
m_colorNewGreen = OpColor(line, "color", Gfx::Color(0.533f, 0.533f, 0.533f, 0.533f));
+ continue;
+ }
if (Cmd(line, "DeepView") && !resetObject)
{
m_engine->SetDeepView(OpFloat(line, "air", 500.0f)*g_unit, 0, true);
m_engine->SetDeepView(OpFloat(line, "water", 100.0f)*g_unit, 1, true);
+ continue;
}
if (Cmd(line, "FogStart") && !resetObject)
{
m_engine->SetFogStart(OpFloat(line, "air", 0.5f), 0);
m_engine->SetFogStart(OpFloat(line, "water", 0.5f), 1);
+ continue;
}
if (Cmd(line, "SecondTexture") && !resetObject)
+ {
m_engine->SetSecondTexture(OpInt(line, "rank", 1));
+ continue;
+ }
if (Cmd(line, "Background") && !resetObject)
{
@@ -4065,6 +4192,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
OpColor(line, "cloudUp", Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f)),
OpColor(line, "cloudDown", Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f)),
OpInt(line, "full", 0));
+ continue;
}
if (Cmd(line, "Planet") && !resetObject)
@@ -4085,12 +4213,14 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
Math::Point(uv2.x, uv2.z),
strstr(name, "planet") != nullptr // TODO: add transparent op or modify textures
);
+ continue;
}
if (Cmd(line, "ForegroundName") && !resetObject)
{
OpString(line, "image", name);
m_engine->SetForegroundName(name);
+ continue;
}
if (((m_version == 1 && Cmd(line, "Global")) || (m_version >= 2 && Cmd(line, "Mission"))) && !resetObject)
@@ -4098,20 +4228,24 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
g_unit = OpFloat(line, "unitScale", 4.0f);
m_engine->SetTracePrecision(OpFloat(line, "traceQuality", 1.0f));
m_shortCut = OpInt(line, "shortcut", 1);
- if(m_version >= 2) {
+ if (m_version >= 2)
+ {
m_retroStyle = OpInt(line, "retro", 0);
- if(m_retroStyle) GetLogger()->Info("Retro mode enabled.\n");
+ if (m_retroStyle) GetLogger()->Info("Retro mode enabled.\n");
}
+ continue;
}
if (Cmd(line, "TerrainGenerate") && !resetObject)
{
- if(m_terrainCreate) {
+ if (m_terrainCreate)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainGenerate after TerrainCreate\n", filename, lineNum);
continue;
}
- if(m_terrainInit) {
+ if (m_terrainInit)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainGenerate after TerrainInit\n", filename, lineNum);
continue;
}
@@ -4124,67 +4258,81 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
OpFloat(line, "hard", 0.5f));
m_terrainGenerate = true;
+ continue;
}
- if (Cmd(line, "TerrainWind") && !resetObject) {
- if(m_terrainCreate) {
+ if (Cmd(line, "TerrainWind") && !resetObject)
+ {
+ if (m_terrainCreate)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainWind after TerrainCreate\n", filename, lineNum);
continue;
}
- if(m_terrainInit) {
+ if (m_terrainInit)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainWind after TerrainInit\n", filename, lineNum);
continue;
}
- if(!m_terrainGenerate) {
+ if (!m_terrainGenerate)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainWind before TerrainGenerate\n", filename, lineNum);
continue;
}
m_terrain->SetWind(OpPos(line, "speed"));
+ continue;
}
if (Cmd(line, "TerrainRelief") && !resetObject)
{
- if(m_terrainCreate) {
+ if (m_terrainCreate)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainRelief after TerrainCreate\n", filename, lineNum);
continue;
}
- if(m_terrainInit) {
+ if (m_terrainInit)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainRelief after TerrainInit\n", filename, lineNum);
continue;
}
- if(!m_terrainGenerate) {
+ if (!m_terrainGenerate)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainRelief before TerrainGenerate\n", filename, lineNum);
continue;
}
OpString(line, "image", name);
m_terrain->LoadRelief(name, OpFloat(line, "factor", 1.0f), OpInt(line, "border", 1));
+ continue;
}
if (Cmd(line, "TerrainResource") && !resetObject)
{
- if(m_terrainCreate) {
+ if (m_terrainCreate)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainResource after TerrainCreate\n", filename, lineNum);
continue;
}
- if(m_terrainInit) {
+ if (m_terrainInit)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainResource after TerrainInit\n", filename, lineNum);
continue;
}
- if(!m_terrainGenerate) {
+ if (!m_terrainGenerate)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainResource before TerrainGenerate\n", filename, lineNum);
continue;
}
OpString(line, "image", name);
m_terrain->LoadResources(name);
+ continue;
}
if (Cmd(line, "TerrainWater") && !resetObject)
@@ -4204,10 +4352,14 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
pos);
m_colorNewWater = OpColor(line, "color", m_colorRefWater);
m_colorShiftWater = OpFloat(line, "brightness", 0.0f);
+ continue;
}
if (Cmd(line, "TerrainLava") && !resetObject)
+ {
m_water->SetLava(OpInt(line, "mode", 0));
+ continue;
+ }
if (Cmd(line, "TerrainCloud") && !resetObject)
{
@@ -4216,6 +4368,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
OpColor(line, "diffuse", Gfx::Color(1.0f, 1.0f, 1.0f, 1.0f)),
OpColor(line, "ambient", Gfx::Color(1.0f, 1.0f, 1.0f, 1.0f)),
OpFloat(line, "level", 500.0f) * g_unit);
+ continue;
}
if (Cmd(line, "TerrainBlitz") && !resetObject)
@@ -4223,11 +4376,13 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
m_lightning->Create(OpFloat(line, "sleep", 0.0f),
OpFloat(line, "delay", 3.0f),
OpFloat(line, "magnetic", 50.0f) * g_unit);
+ continue;
}
if (Cmd(line, "TerrainInitTextures") && !resetObject)
{
- if(m_terrainInit) {
+ if (m_terrainInit)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainInitTextures and TerrainInit at same time\n", filename, lineNum);
continue;
}
@@ -4236,10 +4391,10 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
AddExt(name, ".png");
int dx = OpInt(line, "dx", 1);
int dy = OpInt(line, "dy", 1);
- char* op = SearchOp(line, "table");
+ char* opTable = SearchOp(line, "table");
int tt[100];
for (int i = 0; i < dx*dy; i++)
- tt[i] = GetInt(op, i, 0);
+ tt[i] = GetInt(opTable, i, 0);
if (strstr(name, "%user%") != 0)
CopyFileListToTemp(name, tt, dx*dy);
@@ -4250,36 +4405,43 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
continue;
}
- if (Cmd(line, "TerrainInit") && !resetObject) {
- if(m_terrainInitTextures) {
+ if (Cmd(line, "TerrainInit") && !resetObject)
+ {
+ if (m_terrainInitTextures)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainInit and TerrainInitTextures at same time\n", filename, lineNum);
continue;
}
m_terrain->InitMaterials(OpInt(line, "id", 1));
m_terrainInit = true;
+ continue;
}
if (Cmd(line, "TerrainMaterial") && !resetObject)
{
- if(m_terrainCreate) {
+ if (m_terrainCreate)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainMaterial after TerrainCreate\n", filename, lineNum);
continue;
}
- if(m_terrainInit) {
+ if (m_terrainInit)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainMaterial after TerrainInit\n", filename, lineNum);
continue;
}
- if(m_terrainInitTextures) {
+ if (m_terrainInitTextures)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainMaterial and TerrainInitTextures at same time\n", filename, lineNum);
continue;
}
OpString(line, "image", name);
AddExt(name, ".png");
- if (strstr(name, "%user%") != 0) {
+ if (strstr(name, "%user%") != 0)
+ {
GetProfile().CopyFileToTemp(std::string(name));
}
@@ -4292,36 +4454,41 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
OpInt(line, "down", 1),
OpInt(line, "left", 1),
OpFloat(line, "hard", 0.5f));
+ continue;
}
if (Cmd(line, "TerrainLevel") && !resetObject)
{
- if(m_terrainCreate) {
+ if (m_terrainCreate)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainLevel after TerrainCreate\n", filename, lineNum);
continue;
}
- if(!m_terrainInit) {
+ if (!m_terrainInit)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainLevel before TerrainInit\n", filename, lineNum);
continue;
}
- if(m_terrainInitTextures) {
+ if (m_terrainInitTextures)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainLevel and TerrainInitTextures at same time\n", filename, lineNum);
continue;
}
- if(!m_terrainGenerate) {
+ if (!m_terrainGenerate)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): TerrainLevel before TerrainGenerate\n", filename, lineNum);
continue;
}
- char* op = SearchOp(line, "id");
+ char* opId = SearchOp(line, "id");
int id[50];
int i = 0;
while (i < 50)
{
- id[i] = GetInt(op, i, 0);
+ id[i] = GetInt(opId, i, 0);
if (id[i++] == 0) break;
}
@@ -4332,11 +4499,14 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
OpFloat(line, "freq", 100.0f),
OpPos(line, "center")*g_unit,
OpFloat(line, "radius", 0.0f)*g_unit);
+ continue;
}
- if (Cmd(line, "TerrainCreate") && !resetObject) {
+ if (Cmd(line, "TerrainCreate") && !resetObject)
+ {
m_terrain->CreateObjects();
m_terrainCreate = true;
+ continue;
}
if (Cmd(line, "BeginObject"))
@@ -4348,11 +4518,35 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
sel = IOReadScene(read, stack);
m_beginObject = true;
+ continue;
+ }
+
+ if (Cmd(line, "MissionController") && read[0] == 0 && m_version >= 2)
+ {
+ /* TODO: ???
+ if (!m_beginObject)
+ {
+ GetLogger()->Error("Syntax error in file '%s' (line %d): MissionController before BeginObject\n", filename, lineNum);
+ continue;
+ }*/
+
+ m_controller = CreateObject(Math::Vector(0.0f, 0.0f, 0.0f), 0.0f, 1.0f, 0.0f, OBJECT_CONTROLLER, 100.0f, false, false, 0);
+ m_controller->SetMagnifyDamage(100.0f);
+ CBrain* brain = m_controller->GetBrain();
+ if (brain != nullptr)
+ {
+ OpString(line, "script", name);
+ if (name[0] != 0)
+ brain->SetScriptName(0, name);
+ brain->SetScriptRun(0);
+ }
+ continue;
}
if (Cmd(line, "CreateObject") && read[0] == 0)
{
- if (!m_beginObject) {
+ if (!m_beginObject)
+ {
GetLogger()->Error("Syntax error in file '%s' (line %d): CreateObject before BeginObject\n", filename, lineNum);
continue;
}
@@ -4394,9 +4588,9 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
}
Math::Vector pos = OpPos(line, "pos")*g_unit;
- float dir = OpFloat(line, "dir", 0.0f)*Math::PI;
+ float dirAngle = OpFloat(line, "dir", 0.0f)*Math::PI;
bool trainer = OpInt(line, "trainer", 0);
- CObject* obj = CreateObject(pos, dir,
+ CObject* obj = CreateObject(pos, dirAngle,
OpFloat(line, "z", 1.0f),
OpFloat(line, "h", 0.0f),
type,
@@ -4455,7 +4649,8 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
sel = obj;
}
- obj->SetSelectable(OpInt(line, "selectable", 1));
+ bool selectable = OpInt(line, "selectable", 1);
+ obj->SetSelectable(selectable);
obj->SetEnable(OpInt(line, "enable", 1));
obj->SetProxyActivate(OpInt(line, "proxyActivate", 0));
obj->SetProxyDistance(OpFloat(line, "proxyDistance", 15.0f)*g_unit);
@@ -4463,13 +4658,15 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
obj->SetShield(OpFloat(line, "shield", 1.0f));
obj->SetMagnifyDamage(OpFloat(line, "magnifyDamage", 1.0f));
obj->SetClip(OpInt(line, "clip", 1));
- obj->SetCheckToken(m_version >= 2 ? trainer : OpInt(line, "checkToken", 1));
+ obj->SetCheckToken(m_version >= 2 ? trainer || !selectable : OpInt(line, "checkToken", 1));
// SetManual will affect bot speed
- if (type == OBJECT_MOBILEdr) {
+ if (type == OBJECT_MOBILEdr)
+ {
obj->SetManual(m_version >= 2 ? !trainer : OpInt(line, "manual", 0));
}
- if(m_version >= 2) {
+ if (m_version >= 2)
+ {
Math::Vector zoom = OpDir(line, "zoom");
if (zoom.x != 0.0f || zoom.y != 0.0f || zoom.z != 0.0f)
obj->SetZoom(0, zoom);
@@ -4546,6 +4743,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
}
rankObj ++;
+ continue;
}
if (Cmd(line, "CreateFog") && !resetObject)
@@ -4561,6 +4759,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
dim.x = ddim;
dim.y = dim.x;
m_particle->CreateParticle(pos, Math::Vector(0.0f, 0.0f, 0.0f), dim, type, delay, 0.0f, 0.0f);
+ continue;
}
if (Cmd(line, "CreateLight") && !resetObject)
@@ -4582,6 +4781,8 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
if (type == Gfx::ENG_OBJTYPE_FIX)
m_lightMan->SetLightExcludeType(lightRank, Gfx::ENG_OBJTYPE_TERRAIN);
+
+ continue;
}
if (Cmd(line, "CreateSpot") && !resetObject)
{
@@ -4602,6 +4803,8 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
if (type == Gfx::ENG_OBJTYPE_FIX)
m_lightMan->SetLightExcludeType(rankLight, Gfx::ENG_OBJTYPE_TERRAIN);
+
+ continue;
}
if (Cmd(line, "GroundSpot") && !resetObject)
@@ -4616,10 +4819,14 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
m_engine->SetObjectGroundSpotMinMax(rank, OpFloat(line, "min", 0.0f)*g_unit,
OpFloat(line, "max", 0.0f)*g_unit);
}
+ continue;
}
if (Cmd(line, "WaterColor") && !resetObject)
+ {
m_engine->SetWaterAddColor(OpColor(line, "color", Gfx::Color(0.0f, 0.0f, 0.0f, 1.0f)));
+ continue;
+ }
if (Cmd(line, "MapColor") && !resetObject)
{
@@ -4640,23 +4847,29 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
OpInt(line, "mode", 0),
OpInt(line, "debug", 0));
}
+ continue;
}
+
if (Cmd(line, "MapZoom") && !resetObject)
{
m_map->ZoomMap(OpFloat(line, "factor", 2.0f));
m_map->MapEnable(OpInt(line, "enable", 1));
+ continue;
}
if (Cmd(line, "MaxFlyingHeight") && !resetObject)
{
m_terrain->SetFlyingMaxHeight(OpFloat(line, "max", 280.0f)*g_unit);
+ continue;
}
+
if (Cmd(line, "AddFlyingHeight") && !resetObject)
{
m_terrain->AddFlyingLimit(OpPos(line, "center")*g_unit,
OpFloat(line, "extRadius", 20.0f)*g_unit,
OpFloat(line, "intRadius", 10.0f)*g_unit,
OpFloat(line, "maxHeight", 200.0f));
+ continue;
}
if (Cmd(line, "Camera"))
@@ -4669,9 +4882,10 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
m_camera->StartOver(Gfx::CAM_OVER_EFFECT_FADEIN_WHITE, Math::Vector(0.0f, 0.0f, 0.0f), 1.0f);
m_camera->SetFixDirection(OpFloat(line, "fixDirection", 0.25f)*Math::PI);
+ continue;
}
- if (Cmd(line, "EndMissionTake") && !resetObject)
+ if (Cmd(line, "EndMissionTake") && !resetObject && m_controller == nullptr)
{
int i = m_endTakeTotal;
if (i < 10)
@@ -4681,27 +4895,38 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
m_endTake[i].type = OpTypeObject(line, "type", OBJECT_NULL);
m_endTake[i].min = OpInt(line, "min", 1);
m_endTake[i].max = OpInt(line, "max", 9999);
- if (m_version >= 2) {
- m_endTake[i].powermin = OpInt(line, "powermin", -1);
- m_endTake[i].powermax = OpInt(line, "powermax", 100);
- } else {
- m_endTake[i].powermin = -1;
- m_endTake[i].powermax = 100;
+ if (m_version >= 2)
+ {
+ m_endTake[i].powermin = OpInt(line, "powermin", -1);
+ m_endTake[i].powermax = OpInt(line, "powermax", 100);
+ }
+ else
+ {
+ m_endTake[i].powermin = -1;
+ m_endTake[i].powermax = 100;
}
m_endTake[i].lost = OpInt(line, "lost", -1);
m_endTake[i].immediat = OpInt(line, "immediat", 0);
OpString(line, "message", m_endTake[i].message);
m_endTakeTotal ++;
}
+ continue;
}
- if (Cmd(line, "EndMissionDelay") && !resetObject)
+ if (Cmd(line, "EndMissionDelay") && !resetObject && m_controller == nullptr)
{
m_endTakeWinDelay = OpFloat(line, "win", 2.0f);
m_endTakeLostDelay = OpFloat(line, "lost", 2.0f);
+ continue;
}
- if (Cmd(line, "EndMissionResearch") && !resetObject)
+ if (Cmd(line, "EndMissionResearch") && !resetObject && m_controller == nullptr)
{
m_endTakeResearch |= OpResearch(line, "type");
+ continue;
+ }
+ if (Cmd(line, "EndMissionNever") && !resetObject && m_controller == nullptr)
+ {
+ m_endTakeNever = true;
+ continue;
}
if (Cmd(line, "ObligatoryToken") && !resetObject)
@@ -4712,6 +4937,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
OpString(line, "text", m_obligatoryToken[i]);
m_obligatoryTotal ++;
}
+ continue;
}
if (Cmd(line, "ProhibitedToken") && !resetObject)
@@ -4722,22 +4948,39 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
OpString(line, "text", m_prohibitedToken[i]);
m_prohibitedTotal ++;
}
+ continue;
}
if (Cmd(line, "EnableBuild") && !resetObject)
+ {
g_build |= OpBuild(line, "type");
+ continue;
+ }
if (Cmd(line, "EnableResearch") && !resetObject)
+ {
g_researchEnable |= OpResearch(line, "type");
+ continue;
+ }
- if (Cmd(line, "DoneResearch") && read[0] == 0 && !resetObject) // not loading file?
+ if (Cmd(line, "DoneResearch") && read[0] == 0 && !resetObject) // not loading file?
+ {
g_researchDone |= OpResearch(line, "type");
+ continue;
+ }
if (Cmd(line, "NewScript") && !resetObject)
{
OpString(line, "name", name);
AddNewScriptName(OpTypeObject(line, "type", OBJECT_NULL), name);
+ continue;
}
+
+ if (line[0] == '\n') continue; // Ignore empty lines
+ if (line[0] == '\0') continue; // Ignore empty lines
+ if (read[0] != 0) continue; // Ignore when loading saved game
+
+ GetLogger()->Error("Syntax error in file '%s' (line %d): Unknown command: %s", filename, lineNum, line); // Don't add \n at the end of log message - it's included in line variable
}
fclose(file);
@@ -5129,7 +5372,8 @@ CObject* CRobotMain::CreateObject(Math::Vector pos, float angle, float zoom, flo
type == OBJECT_MOBILEwt ||
type == OBJECT_MOBILEit ||
type == OBJECT_MOBILEdr ||
- type == OBJECT_APOLLO2 )
+ type == OBJECT_APOLLO2 ||
+ type == OBJECT_CONTROLLER )
{
object = new CObject();
object->SetOption(option);
@@ -5822,7 +6066,7 @@ void CRobotMain::LoadOneScript(CObject *obj, int &nbError)
char filename[MAX_FNAME];
sprintf(filename, "%s/%s/%c%.3d%.3d%.1d.txt",
- GetSavegameDir(), m_gamerName, name[0], rank, objRank, i);
+ GetSavegameDir(), m_gamerName.c_str(), name[0], rank, objRank, i);
brain->ReadProgram(i, filename);
if (!brain->GetCompile(i)) nbError++;
}
@@ -5892,7 +6136,7 @@ void CRobotMain::SaveOneScript(CObject *obj)
{
char filename[MAX_FNAME];
sprintf(filename, "%s/%s/%c%.3d%.3d%.1d.txt",
- GetSavegameDir(), m_gamerName, name[0], rank, objRank, i);
+ GetSavegameDir(), m_gamerName.c_str(), name[0], rank, objRank, i);
brain->WriteProgram(i, filename);
}
}
@@ -6018,7 +6262,7 @@ bool CRobotMain::IsBusy()
void CRobotMain::IOWriteObject(FILE *file, CObject* obj, const char *cmd)
{
if (obj->GetType() == OBJECT_FIX) return;
-
+
SetNumericLocale();
char line[3000];
@@ -6107,7 +6351,7 @@ void CRobotMain::IOWriteObject(FILE *file, CObject* obj, const char *cmd)
strcat(line, "\n");
fputs(line, file);
-
+
RestoreNumericLocale();
}
@@ -6116,7 +6360,7 @@ bool CRobotMain::IOWriteScene(const char *filename, const char *filecbot, char *
{
FILE* file = fopen(filename, "w");
if (file == NULL) return false;
-
+
SetNumericLocale();
char line[500];
@@ -6180,7 +6424,7 @@ bool CRobotMain::IOWriteScene(const char *filename, const char *filecbot, char *
SaveFileScript(obj, filename, objRank++);
}
fclose(file);
-
+
RestoreNumericLocale();
#if CBOT_STACK
@@ -6228,7 +6472,7 @@ CObject* CRobotMain::IOReadObject(char *line, const char* filename, int objRank)
return nullptr;
SetNumericLocale();
-
+
int trainer = OpInt(line, "trainer", 0);
int toy = OpInt(line, "toy", 0);
int option = OpInt(line, "option", 0);
@@ -6295,7 +6539,7 @@ CObject* CRobotMain::IOReadObject(char *line, const char* filename, int objRank)
}
RestoreNumericLocale();
-
+
return obj;
}
@@ -6306,7 +6550,7 @@ CObject* CRobotMain::IOReadScene(const char *filename, const char *filecbot)
FILE* file = fopen(filename, "r");
if (file == NULL) return 0;
-
+
SetNumericLocale();
CObject* fret = nullptr;
@@ -6442,10 +6686,10 @@ void CRobotMain::WriteFreeParam()
m_freeResearch |= g_researchDone;
m_freeBuild |= g_build;
- if (m_gamerName[0] == 0) return;
+ if (m_gamerName == "") return;
char filename[MAX_FNAME];
- sprintf(filename, "%s/%s/research.gam", GetSavegameDir(), m_gamerName);
+ sprintf(filename, "%s/%s/research.gam", GetSavegameDir(), m_gamerName.c_str());
FILE* file = fopen(filename, "w");
if (file == NULL) return;
@@ -6461,10 +6705,10 @@ void CRobotMain::ReadFreeParam()
m_freeResearch = 0;
m_freeBuild = 0;
- if (m_gamerName[0] == 0) return;
+ if (m_gamerName == "") return;
char filename[MAX_FNAME];
- sprintf(filename, "%s/%s/research.gam", GetSavegameDir(), m_gamerName);
+ sprintf(filename, "%s/%s/research.gam", GetSavegameDir(), m_gamerName.c_str());
FILE* file = fopen(filename, "r");
if (file == NULL) return;
@@ -6622,7 +6866,7 @@ void CRobotMain::UpdateAudio(bool frame)
for (int t = 0; t < m_audioChangeTotal; t++)
{
- if(m_audioChange[t].changed) continue;
+ if (m_audioChange[t].changed) continue;
Math::Vector bPos = m_audioChange[t].pos;
bPos.y = 0.0f;
@@ -6654,7 +6898,8 @@ void CRobotMain::UpdateAudio(bool frame)
float energyLevel = -1;
CObject* power = obj->GetPower();
- if (power != nullptr) {
+ if (power != nullptr)
+ {
energyLevel = power->GetEnergy();
if (power->GetType() == OBJECT_ATOMIC) energyLevel *= 100;
}
@@ -6682,9 +6927,45 @@ void CRobotMain::UpdateAudio(bool frame)
}
}
+void CRobotMain::SetEndMission(Error result, float delay)
+{
+ if (m_controller != nullptr)
+ {
+ m_endTakeWinDelay = delay;
+ m_endTakeLostDelay = delay;
+ m_missionResult = result;
+ }
+}
+
//! Checks if the mission is over
Error CRobotMain::CheckEndMission(bool frame)
{
+ if (m_controller != nullptr)
+ {
+ if (m_missionResult == INFO_LOST) //mission lost?
+ {
+ m_displayText->DisplayError(INFO_LOST, Math::Vector(0.0f,0.0f,0.0f));
+ m_winDelay = 0.0f;
+ if (m_lostDelay == 0) m_lostDelay = m_endTakeLostDelay;
+ m_displayText->SetEnable(false);
+ }
+ if (m_missionResult == INFO_LOSTq) //mission lost?
+ {
+ m_winDelay = 0.0f;
+ if (m_lostDelay == 0) m_lostDelay = 0.1f;
+ m_displayText->SetEnable(false);
+ }
+ if (frame && m_base) return ERR_MISSION_NOTERM;
+ if (m_missionResult == ERR_OK) { //mission win?
+ m_displayText->DisplayError(INFO_WIN, Math::Vector(0.0f,0.0f,0.0f));
+ if (m_winDelay == 0) m_winDelay = m_endTakeWinDelay;
+ m_lostDelay = 0.0f;
+ m_displayText->SetEnable(false);
+ }
+ if (m_missionResult == ERR_MISSION_NOTERM) m_displayText->SetEnable(true);
+ return m_missionResult;
+ }
+
CInstanceManager* iMan = CInstanceManager::GetInstancePointer();
for (int t = 0; t < m_endTakeTotal; t++)
@@ -6721,7 +7002,8 @@ Error CRobotMain::CheckEndMission(bool frame)
float energyLevel = -1;
CObject* power = obj->GetPower();
- if (power != nullptr) {
+ if (power != nullptr)
+ {
energyLevel = power->GetEnergy();
if (power->GetType() == OBJECT_ATOMIC) energyLevel *= 100;
}
@@ -6763,7 +7045,8 @@ Error CRobotMain::CheckEndMission(bool frame)
}
}
if (nb < m_endTake[t].min ||
- nb > m_endTake[t].max)
+ nb > m_endTake[t].max ||
+ m_endTakeNever )
{
m_displayText->SetEnable(true);
return ERR_MISSION_NOTERM;
@@ -6978,15 +7261,15 @@ bool CRobotMain::GetRetroMode()
//! Change the player's name
void CRobotMain::SetGamerName(const char *name)
{
- strcpy(m_gamerName, name);
+ m_gamerName = std::string(name);
SetGlobalGamerName(m_gamerName);
ReadFreeParam();
}
-//! Getes the player's name
+//! Gets the player's name
char* CRobotMain::GetGamerName()
{
- return m_gamerName;
+ return const_cast<char*>(m_gamerName.c_str());
}
@@ -7195,7 +7478,7 @@ void CRobotMain::StartMusic()
{
m_sound->StopMusic();
m_sound->PlayMusic(m_audioTrack, m_audioRepeat);
- }
+ }
}
//! Removes hilite and tooltip
@@ -7218,4 +7501,4 @@ void CRobotMain::RestoreNumericLocale()
{
setlocale(LC_NUMERIC, m_oldLocale.c_str());
}
- \ No newline at end of file
+
diff --git a/src/object/robotmain.h b/src/object/robotmain.h
index 7ed84c5..a75509d 100644
--- a/src/object/robotmain.h
+++ b/src/object/robotmain.h
@@ -191,7 +191,7 @@ const int AXIS_INVALID = -1;
class CRobotMain : public CSingleton<CRobotMain>
{
public:
- CRobotMain(CApplication* app);
+ CRobotMain(CApplication* app, bool loadProfile);
~CRobotMain();
Gfx::CCamera* GetCamera();
@@ -265,6 +265,7 @@ public:
void ResetObject();
void ResetCreate();
void UpdateAudio(bool frame);
+ void SetEndMission(Error result, float delay);
Error CheckEndMission(bool frame);
void CheckEndMessage(const char* message);
int GetObligatoryToken();
@@ -369,10 +370,12 @@ public:
CObject* IOReadObject(char *line, const char* filename, int objRank);
int CreateSpot(Math::Vector pos, Gfx::Color color);
-
+
void SetNumericLocale();
void RestoreNumericLocale();
+ CObject* GetSelect();
+
protected:
bool EventFrame(const Event &event);
bool EventObject(const Event &event);
@@ -403,14 +406,13 @@ protected:
void DeleteAllObjects();
void UpdateInfoText();
CObject* SearchObject(ObjectType type);
- CObject* GetSelect();
void StartDisplayVisit(EventType event);
void FrameVisit(float rTime);
void StopDisplayVisit();
void ExecuteCmd(char *cmd);
bool TestGadgetQuantity(int rank);
void UpdateSpeedLabel();
-
+
protected:
CApplication* m_app;
@@ -469,6 +471,8 @@ protected:
int m_delayWriteMessage;
int m_movieInfoIndex;
+ CObject* m_controller;
+
//Level Checker flags
bool m_beginObject;
bool m_terrainGenerate;
@@ -537,9 +541,10 @@ protected:
int m_endTakeTotal;
EndTake m_endTake[10];
long m_endTakeResearch;
+ bool m_endTakeNever;
float m_endTakeWinDelay;
float m_endTakeLostDelay;
-
+
int m_audioChangeTotal;
AudioChange m_audioChange[10];
@@ -548,11 +553,13 @@ protected:
int m_prohibitedTotal;
char m_prohibitedToken[100][20];
- char m_gamerName[100];
+ std::string m_gamerName;
int m_freeBuild; // constructible buildings
int m_freeResearch; // researches possible
+ Error m_missionResult;
+
ShowLimit m_showLimit[MAXSHOWLIMIT];
Gfx::Color m_colorRefBot;
@@ -564,7 +571,7 @@ protected:
Gfx::Color m_colorRefWater;
Gfx::Color m_colorNewWater;
float m_colorShiftWater;
-
+
std::string m_oldLocale;
};
diff --git a/src/object/task/task.cpp b/src/object/task/task.cpp
index 39fdccf..5ec6f8a 100644
--- a/src/object/task/task.cpp
+++ b/src/object/task/task.cpp
@@ -81,4 +81,3 @@ bool CTask::Abort()
return true;
}
-
diff --git a/src/object/task/task.h b/src/object/task/task.h
index 12961ef..41b3d3b 100644
--- a/src/object/task/task.h
+++ b/src/object/task/task.h
@@ -34,7 +34,7 @@ class CSoundInterface;
namespace Ui {
class CDisplayText;
-} /* Ui */
+} /* Ui */
namespace Gfx {
class CEngine;
@@ -43,7 +43,7 @@ class CParticle;
class CTerrain;
class CWater;
class CCamera;
-} /* Gfx */
+} /* Gfx */
const float TAKE_DIST = 6.0f; // distance to an object to pick it
diff --git a/src/object/task/taskadvance.cpp b/src/object/task/taskadvance.cpp
index 58eb939..885e100 100644
--- a/src/object/task/taskadvance.cpp
+++ b/src/object/task/taskadvance.cpp
@@ -139,4 +139,3 @@ Error CTaskAdvance::IsEnded()
return ERR_CONTINUE;
}
-
diff --git a/src/object/task/taskbuild.cpp b/src/object/task/taskbuild.cpp
index b9af475..39479a6 100644
--- a/src/object/task/taskbuild.cpp
+++ b/src/object/task/taskbuild.cpp
@@ -557,7 +557,7 @@ Error CTaskBuild::FlatFloor()
ObjectType type;
Math::Vector center, pos, oPos, bPos;
Math::Point c, p;
- float radius, max, oRadius, bRadius, angle, dist;
+ float radius, max, oRadius, bRadius = 0.0f, angle, dist;
int i, j;
bool bLittleFlat, bBase;
diff --git a/src/object/task/taskgoto.cpp b/src/object/task/taskgoto.cpp
index 19d129d..01ff38b 100644
--- a/src/object/task/taskgoto.cpp
+++ b/src/object/task/taskgoto.cpp
@@ -90,7 +90,8 @@ bool CTaskGoto::EventProcess(const Event &event)
rot.x = m_leakPos.x-pos.x;
rot.y = m_leakPos.z-pos.z;
dist = Math::Point(rot.x, rot.y).Length();
- if (dist != 0) {
+ if (dist != 0)
+ {
rot.x /= dist;
rot.y /= dist;
}
@@ -756,7 +757,7 @@ Error CTaskGoto::Start(Math::Vector goal, float altitude,
Error CTaskGoto::IsEnded()
{
Math::Vector pos;
- float limit, angle, dist, h, level;
+ float limit, angle = 0.0f, dist, h, level;
if ( m_engine->GetPause() ) return ERR_CONTINUE;
if ( m_error != ERR_OK ) return m_error;
@@ -1310,16 +1311,6 @@ bool CTaskGoto::GetHotPoint(CObject *pObj, Math::Vector &pos,
return true;
}
- if ( type == OBJECT_DESTROYER )
- {
- mat = pObj->GetWorldMatrix(0);
- pos.x += 0.0f;
- if ( bTake && distance != 0.0f ) suppl = 4.0f;
- if ( bTake ) pos.x += TAKE_DIST+distance+suppl;
- pos = Transform(*mat, pos);
- return true;
- }
-
if ( type == OBJECT_PARA && m_physics->GetType() == TYPE_FLYING )
{
mat = pObj->GetWorldMatrix(0);
@@ -1338,7 +1329,7 @@ bool CTaskGoto::GetHotPoint(CObject *pObj, Math::Vector &pos,
bool CTaskGoto::LeakSearch(Math::Vector &pos, float &delay)
{
- CObject *pObj, *pObstacle;
+ CObject *pObj, *pObstacle = nullptr;
Math::Vector iPos, oPos, bPos;
float iRadius, oRadius, bRadius, dist, min, dir;
int i, j;
@@ -1455,7 +1446,7 @@ void CTaskGoto::ComputeRepulse(Math::Point &dir)
// The worm goes everywhere and through everything!
iType = m_object->GetType();
- if ( iType == OBJECT_WORM ) return;
+ if ( iType == OBJECT_WORM || iType == OBJECT_CONTROLLER ) return;
m_object->GetCrashSphere(0, iPos, iRadius);
gDist = Math::Distance(iPos, m_goal);
@@ -2241,4 +2232,3 @@ bool CTaskGoto::BitmapTestDot(int rank, int x, int y)
return m_bmArray[rank*m_bmLine*m_bmSize + m_bmLine*y + x/8] & (1<<x%8);
}
-
diff --git a/src/object/task/taskmanager.cpp b/src/object/task/taskmanager.cpp
index a2ce8b8..11fba6c 100644
--- a/src/object/task/taskmanager.cpp
+++ b/src/object/task/taskmanager.cpp
@@ -271,4 +271,3 @@ bool CTaskManager::Abort()
return m_task->Abort();
}
-
diff --git a/src/object/task/tasksearch.cpp b/src/object/task/tasksearch.cpp
index e2c2524..974a53d 100644
--- a/src/object/task/tasksearch.cpp
+++ b/src/object/task/tasksearch.cpp
@@ -220,10 +220,11 @@ bool CTaskSearch::Abort()
{
m_hand = TSH_UP;
InitAngle();
- for (int i = 0; i < 3; i++) {
+ for (int i = 0; i < 3; i++)
+ {
m_object->SetAngleZ(i+1, m_finalAngle[i]);
}
-
+
m_camera->StopCentering(m_object, 2.0f);
m_physics->SetFreeze(false); // is moving again
return true;
@@ -325,4 +326,3 @@ void CTaskSearch::DeleteMark(ObjectType type)
}
}
-
diff --git a/src/object/task/taskshield.cpp b/src/object/task/taskshield.cpp
index 929dd5c..fe6eaeb 100644
--- a/src/object/task/taskshield.cpp
+++ b/src/object/task/taskshield.cpp
@@ -552,5 +552,3 @@ float CTaskShield::GetRadius()
return RADIUS_SHIELD_MIN + (RADIUS_SHIELD_MAX-RADIUS_SHIELD_MIN)*m_object->GetParam();
}
-
-
diff --git a/src/object/task/tasktake.cpp b/src/object/task/tasktake.cpp
index 0037f85..c7f0530 100644
--- a/src/object/task/tasktake.cpp
+++ b/src/object/task/tasktake.cpp
@@ -598,4 +598,3 @@ bool CTaskTake::IsFreeDeposeObject(Math::Vector pos)
return true; // location free
}
-
diff --git a/src/object/task/taskturn.cpp b/src/object/task/taskturn.cpp
index 7a924cb..bf9d593 100644
--- a/src/object/task/taskturn.cpp
+++ b/src/object/task/taskturn.cpp
@@ -126,4 +126,3 @@ Error CTaskTurn::IsEnded()
return ERR_CONTINUE;
}
-
diff --git a/src/object/task/taskwait.cpp b/src/object/task/taskwait.cpp
index 3e201e0..5b9fdb3 100644
--- a/src/object/task/taskwait.cpp
+++ b/src/object/task/taskwait.cpp
@@ -64,4 +64,3 @@ Error CTaskWait::IsEnded()
return ERR_CONTINUE;
}
-
diff --git a/src/physics/README.txt b/src/physics/README.txt
index c068d4d..dd74709 100644
--- a/src/physics/README.txt
+++ b/src/physics/README.txt
@@ -2,3 +2,4 @@
* \dir src/physics
* \brief Physics engine
*/
+
diff --git a/src/physics/physics.cpp b/src/physics/physics.cpp
index 6311ecf..2c5f95e 100644
--- a/src/physics/physics.cpp
+++ b/src/physics/physics.cpp
@@ -794,7 +794,8 @@ void CPhysics::MotorUpdate(float aTime, float rTime)
type == OBJECT_BEE ||
type == OBJECT_WORM ||
type == OBJECT_APOLLO2 ||
- type == OBJECT_MOBILEdr )
+ type == OBJECT_MOBILEdr ||
+ type == OBJECT_CONTROLLER)
{
power = 0;
}
@@ -1916,7 +1917,7 @@ void CPhysics::SoundMotorFull(float rTime, ObjectType type)
if ( m_object->GetToy() )
{
- sound = SOUND_MOTORd;
+ sound = SOUND_NONE; //SOUND_MOTORd;
amplitude = 1.0f;
time = 0.1f;
}
@@ -2015,7 +2016,7 @@ void CPhysics::SoundMotorSlow(float rTime, ObjectType type)
if ( m_object->GetToy() )
{
- sound = SOUND_MOTORd;
+ sound = SOUND_NONE; // SOUND_MOTORd;
amplitude = 0.0f;
}
diff --git a/src/physics/physics.h b/src/physics/physics.h
index cce57f3..834d7b8 100644
--- a/src/physics/physics.h
+++ b/src/physics/physics.h
@@ -250,4 +250,3 @@ protected:
bool m_bLowLevel;
};
-
diff --git a/src/po/CMakeLists.txt b/src/po/CMakeLists.txt
index df667dd..85b401c 100644
--- a/src/po/CMakeLists.txt
+++ b/src/po/CMakeLists.txt
@@ -16,3 +16,4 @@ add_custom_target(update-pot DEPENDS ${_potFile})
file(GLOB _poFiles *.po)
gettext_create_translations(${_potFile} ALL ${_poFiles})
+
diff --git a/src/po/colobot.pot b/src/po/colobot.pot
index e1f9dc7..8ce386f 100644
--- a/src/po/colobot.pot
+++ b/src/po/colobot.pot
@@ -1816,3 +1816,4 @@ msgstr ""
msgid "%1"
msgstr ""
+
diff --git a/src/po/de.po b/src/po/de.po
index 2992cb1..d0943ab 100644
--- a/src/po/de.po
+++ b/src/po/de.po
@@ -2053,3 +2053,4 @@ msgstr "www.epsitec.com"
#~ msgid "Zoom"
#~ msgstr "Zoom"
+
diff --git a/src/po/fr.po b/src/po/fr.po
index 662fb93..343458d 100644
--- a/src/po/fr.po
+++ b/src/po/fr.po
@@ -2055,3 +2055,4 @@ msgstr "www.epsitec.com"
#~ msgid "Zoom"
#~ msgstr "Zoom"
+
diff --git a/src/po/pl.po b/src/po/pl.po
index 9bab529..4cbfe60 100644
--- a/src/po/pl.po
+++ b/src/po/pl.po
@@ -2063,3 +2063,4 @@ msgstr "www.epsitec.com"
#~ msgid "Zoom"
#~ msgstr "Powiększenie"
+
diff --git a/src/script/cbottoken.cpp b/src/script/cbottoken.cpp
index 0bd52da..505228e 100644
--- a/src/script/cbottoken.cpp
+++ b/src/script/cbottoken.cpp
@@ -249,7 +249,15 @@ std::string GetHelpFilename(const char *token)
if ( strcmp(token, "pow" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/expr.txt");
if ( strcmp(token, "rand" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/expr.txt");
if ( strcmp(token, "abs" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/expr.txt");
+ if ( strcmp(token, "getbuild" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/getbuild.txt");
+ if ( strcmp(token, "getresearchenable" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/getresen.txt");
+ if ( strcmp(token, "getresearchdone" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/getresdo.txt");
if ( strcmp(token, "retobject" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/retobj.txt");
+ if ( strcmp(token, "progfunc" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/factory.txt");
+ if ( strcmp(token, "busy" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/busy.txt");
+ if ( strcmp(token, "factory" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/factory.txt");
+ if ( strcmp(token, "research" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/research.txt");
+ if ( strcmp(token, "destroy" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/destroy.txt");
if ( strcmp(token, "search" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/search.txt");
if ( strcmp(token, "radar" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/radar.txt");
if ( strcmp(token, "direction" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/direct.txt");
@@ -262,6 +270,7 @@ std::string GetHelpFilename(const char *token)
if ( strcmp(token, "turn" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/turn.txt");
if ( strcmp(token, "goto" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/goto.txt");
if ( strcmp(token, "grab" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/grab.txt");
+ if ( strcmp(token, "canbuild" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/canbuild.txt");
if ( strcmp(token, "build" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/build.txt");
if ( strcmp(token, "drop" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/drop.txt");
if ( strcmp(token, "sniff" ) == 0 ) return std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + std::string("/cbot/sniff.txt");
@@ -366,7 +375,16 @@ bool IsFunction(const char *token)
if ( strcmp(token, "pow" ) == 0 ) return true;
if ( strcmp(token, "rand" ) == 0 ) return true;
if ( strcmp(token, "abs" ) == 0 ) return true;
+ if ( strcmp(token, "getbuild" ) == 0 ) return true;
+ if ( strcmp(token, "getresearchenable" ) == 0 ) return true;
+ if ( strcmp(token, "getresearchdone" ) == 0 ) return true;
+ if ( strcmp(token, "retobjectbyid") == 0 ) return true;
if ( strcmp(token, "retobject" ) == 0 ) return true;
+ if ( strcmp(token, "progfunc" ) == 0 ) return true;
+ if ( strcmp(token, "busy" ) == 0 ) return true;
+ if ( strcmp(token, "factory" ) == 0 ) return true;
+ if ( strcmp(token, "research" ) == 0 ) return true;
+ if ( strcmp(token, "destroy" ) == 0 ) return true;
if ( strcmp(token, "search" ) == 0 ) return true;
if ( strcmp(token, "radar" ) == 0 ) return true;
if ( strcmp(token, "detect" ) == 0 ) return true;
@@ -380,7 +398,8 @@ bool IsFunction(const char *token)
if ( strcmp(token, "turn" ) == 0 ) return true;
if ( strcmp(token, "goto" ) == 0 ) return true;
if ( strcmp(token, "grab" ) == 0 ) return true;
- if ( strcmp(token, "build" ) == 0 ) return true;
+ if ( strcmp(token, "canbuild" ) == 0 ) return true;
+ if ( strcmp(token, "build" ) == 0 ) return true;
if ( strcmp(token, "drop" ) == 0 ) return true;
if ( strcmp(token, "sniff" ) == 0 ) return true;
if ( strcmp(token, "receive" ) == 0 ) return true;
@@ -449,7 +468,16 @@ const char* GetHelpText(const char *token)
if ( strcmp(token, "pow" ) == 0 ) return "pow ( x, y );";
if ( strcmp(token, "rand" ) == 0 ) return "rand ( );";
if ( strcmp(token, "abs" ) == 0 ) return "abs ( value );";
- if ( strcmp(token, "retobject" ) == 0 ) return "retobject ( );";
+ if ( strcmp(token, "getbuild" ) == 0 ) return "getbuild ( );";
+ if ( strcmp(token, "getresearchenable" ) == 0 ) return "getresearchenable ( );";
+ if ( strcmp(token, "getresearchdone" ) == 0 ) return "getresearchdone ( );";
+ if ( strcmp(token, "retobject" ) == 0 ) return "retobject ( rank );";
+ if ( strcmp(token, "retobjectbyid") == 0 ) return "retobjectbyid ( rank );";
+ if ( strcmp(token, "progfunc" ) == 0 ) return "progfunc ( funcname );";
+ if ( strcmp(token, "busy" ) == 0 ) return "object.busy ( );";
+ if ( strcmp(token, "factory" ) == 0 ) return "object.factory ( cat, program );";
+ if ( strcmp(token, "research" ) == 0 ) return "object.research ( type );";
+ if ( strcmp(token, "destroy" ) == 0 ) return "object.destroy ( );";
if ( strcmp(token, "search" ) == 0 ) return "search ( );";
if ( strcmp(token, "radar" ) == 0 ) return "radar ( cat, angle, focus, min, max, sens );";
if ( strcmp(token, "detect" ) == 0 ) return "detect ( cat );";
@@ -463,7 +491,8 @@ const char* GetHelpText(const char *token)
if ( strcmp(token, "turn" ) == 0 ) return "turn ( angle );";
if ( strcmp(token, "goto" ) == 0 ) return "goto ( position, altitude );";
if ( strcmp(token, "grab" ) == 0 ) return "grab ( order );";
- if ( strcmp(token, "build" ) == 0 ) return "build ( category );";
+ if ( strcmp(token, "canbuild" ) == 0 ) return "canbuild ( category );";
+ if ( strcmp(token, "build" ) == 0 ) return "build ( category );";
if ( strcmp(token, "drop" ) == 0 ) return "drop ( order );";
if ( strcmp(token, "sniff" ) == 0 ) return "sniff ( );";
if ( strcmp(token, "receive" ) == 0 ) return "receive ( name, power );";
@@ -506,4 +535,3 @@ const char* GetHelpText(const char *token)
return "";
}
-
diff --git a/src/script/cbottoken.h b/src/script/cbottoken.h
index bc53f77..976d856 100644
--- a/src/script/cbottoken.h
+++ b/src/script/cbottoken.h
@@ -36,4 +36,3 @@ extern bool IsType(const char *token);
extern bool IsFunction(const char *token);
extern const char* GetHelpText(const char *token);
-
diff --git a/src/script/cmdtoken.cpp b/src/script/cmdtoken.cpp
index ab0528b..69df68b 100644
--- a/src/script/cmdtoken.cpp
+++ b/src/script/cmdtoken.cpp
@@ -401,6 +401,7 @@ ObjectType GetTypeObject(char *line, int rank, ObjectType def)
if ( Cmd(p, "ApolloAntenna" ) ) return OBJECT_APOLLO5;
if ( Cmd(p, "Me" ) ) return OBJECT_HUMAN;
if ( Cmd(p, "Tech" ) ) return OBJECT_TECH;
+ if ( Cmd(p, "MissionController" ) ) return OBJECT_CONTROLLER;
return def;
}
@@ -647,6 +648,7 @@ const char* GetTypeObject(ObjectType type)
if ( type == OBJECT_APOLLO5 ) return "ApolloAntenna";
if ( type == OBJECT_HUMAN ) return "Me";
if ( type == OBJECT_TECH ) return "Tech";
+ if ( type == OBJECT_CONTROLLER ) return "MissionController";
return "";
}
@@ -945,4 +947,3 @@ Gfx::Color OpColor(char *line, const char *op, Gfx::Color def)
return color;
}
-
diff --git a/src/script/dd.cpp b/src/script/dd.cpp
index 4110813..a7f5eb9 100644
--- a/src/script/dd.cpp
+++ b/src/script/dd.cpp
@@ -173,3 +173,4 @@ bool rSpace(CBotVar* var, CBotVar* result, int& exception, void* user)
}
return true;
}
+
diff --git a/src/script/script.cpp b/src/script/script.cpp
index c95cd4b..b03702c 100644
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -35,10 +35,15 @@
#include "object/task/taskmanager.h"
#include "object/objman.h"
+#include "object/auto/auto.h"
+#include "object/auto/autofactory.h"
+
#include "physics/physics.h"
#include "script/cbottoken.h"
+#include "sound/sound.h"
+
#include "ui/interface.h"
#include "ui/edit.h"
#include "ui/list.h"
@@ -65,6 +70,11 @@ CBotTypResult CScript::cNull(CBotVar* &var, void* user)
return CBotTypResult(CBotTypFloat);
}
+CBotTypResult CScript::cClassNull(CBotVar* thisclass, CBotVar* &var)
+{
+ return CScript::cNull(var, nullptr);
+}
+
// Compiling a procedure with a single real number.
CBotTypResult CScript::cOneFloat(CBotVar* &var, void* user)
@@ -76,6 +86,11 @@ CBotTypResult CScript::cOneFloat(CBotVar* &var, void* user)
return CBotTypResult(CBotTypFloat);
}
+CBotTypResult CScript::cClassOneFloat(CBotVar* thisclass, CBotVar* &var)
+{
+ return CScript::cOneFloat(var, nullptr);
+}
+
// Compiling a procedure with two real numbers.
CBotTypResult CScript::cTwoFloat(CBotVar* &var, void* user)
@@ -145,6 +160,18 @@ CBotTypResult CScript::cString(CBotVar* &var, void* user)
return CBotTypResult(CBotTypFloat);
}
+// Compiling a procedure with a single string, returning string.
+
+CBotTypResult CScript::cStringString(CBotVar* &var, void* user)
+{
+ if ( var == 0 ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() != CBotTypString &&
+ var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+ if ( var != 0 ) return CBotTypResult(CBotErrOverParam);
+ return CBotTypResult(CBotTypString);
+}
+
// Seeking value in an array of integers.
@@ -313,6 +340,127 @@ bool CScript::rAbs(CBotVar* var, CBotVar* result, int& exception, void* user)
return true;
}
+// Compilation of the instruction "endmission(result, delay)"
+
+CBotTypResult CScript::cEndMission(CBotVar* &var, void* user)
+{
+ if ( var == 0 ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+ if ( var == 0 ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+ if ( var != 0 ) return CBotTypResult(CBotErrOverParam);
+ return CBotTypResult(CBotTypFloat);
+}
+
+// Instruction "endmission(result, delay)"
+
+bool CScript::rEndMission(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ Error ended;
+ float delay;
+
+ ended = static_cast<Error>(var->GetValFloat());
+ var = var->GetNext();
+
+ delay = var->GetValFloat();
+
+ CRobotMain::GetInstancePointer()->SetEndMission(ended, delay);
+ return true;
+}
+
+// Compilation of the instruction "playmusic(filename, repeat)"
+
+CBotTypResult CScript::cPlayMusic(CBotVar* &var, void* user)
+{
+ if ( var == 0 ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() != CBotTypString ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+ if ( var == 0 ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+ if ( var != 0 ) return CBotTypResult(CBotErrOverParam);
+ return CBotTypResult(CBotTypFloat);
+}
+
+// Instruction "playmusic(filename, repeat)"
+
+bool CScript::rPlayMusic(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ std::string filename;
+ CBotString cbs;
+ bool repeat;
+
+ cbs = var->GetValString();
+ filename = std::string(cbs);
+ var = var->GetNext();
+
+ repeat = var->GetValInt();
+
+ CApplication::GetInstancePointer()->GetSound()->StopMusic();
+ CApplication::GetInstancePointer()->GetSound()->PlayMusic(filename, repeat);
+ return true;
+}
+
+// Instruction "stopmusic()"
+
+bool CScript::rStopMusic(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ CApplication::GetInstancePointer()->GetSound()->StopMusic();
+ return true;
+}
+
+// Instruction "getbuild()"
+
+bool CScript::rGetBuild(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ result->SetValInt(g_build);
+ return true;
+}
+
+// Instruction "getresearchenable()"
+
+bool CScript::rGetResearchEnable(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ result->SetValInt(g_researchEnable);
+ return true;
+}
+
+// Instruction "getresearchdone()"
+
+bool CScript::rGetResearchDone(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ result->SetValInt(g_researchDone);
+ return true;
+}
+
+// Instruction "setbuild()"
+
+bool CScript::rSetBuild(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ g_build = var->GetValInt();
+ CApplication::GetInstancePointer()->GetEventQueue()->AddEvent(Event(EVENT_UPDINTERFACE));
+ return true;
+}
+
+// Instruction "setresearchenable()"
+
+bool CScript::rSetResearchEnable(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ g_researchEnable = var->GetValInt();
+ CApplication::GetInstancePointer()->GetEventQueue()->AddEvent(Event(EVENT_UPDINTERFACE));
+ return true;
+}
+
+// Instruction "setresearchdone()"
+
+bool CScript::rSetResearchDone(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ g_researchDone = var->GetValInt();
+ CApplication::GetInstancePointer()->GetEventQueue()->AddEvent(Event(EVENT_UPDINTERFACE));
+ return true;
+}
// Compilation of the instruction "retobject(rank)".
@@ -326,6 +474,27 @@ CBotTypResult CScript::cGetObject(CBotVar* &var, void* user)
return CBotTypResult(CBotTypPointer, "object");
}
+// Instruction "retobjectbyid(rank)".
+
+bool CScript::rGetObjectById(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ CObject* pObj;
+ int rank;
+
+ rank = var->GetValInt();
+
+ pObj = static_cast<CObject*>(CObjectManager::GetInstancePointer()->SearchInstance(rank));
+ if ( pObj == 0 )
+ {
+ result->SetPointer(0);
+ }
+ else
+ {
+ result->SetPointer(pObj->GetBotVar());
+ }
+ return true;
+}
+
// Instruction "retobject(rank)".
bool CScript::rGetObject(CBotVar* var, CBotVar* result, int& exception, void* user)
@@ -335,7 +504,7 @@ bool CScript::rGetObject(CBotVar* var, CBotVar* result, int& exception, void* us
rank = var->GetValInt();
- pObj = static_cast<CObject*>(CObjectManager::GetInstancePointer()->SearchInstance(rank));
+ pObj = static_cast<CObject*>(CInstanceManager::GetInstancePointer()->SearchInstance(CLASS_OBJECT, rank));
if ( pObj == 0 )
{
result->SetPointer(0);
@@ -347,20 +516,406 @@ bool CScript::rGetObject(CBotVar* var, CBotVar* result, int& exception, void* us
return true;
}
-// Compilation of the instruction "destroy(rank[, exploType[, force]])".
-CBotTypResult CScript::cDestroy(CBotVar* &var, void* user)
+// Instruction "progfunc(funcname)".
+
+bool CScript::rProgFunc(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ CBotString cbs;
+ const char* funcname;
+ std::string program;
+
+ cbs = var->GetValString();
+ funcname = cbs;
+
+ //TODO: Translation :)
+ program = "extern void object::Auto()\n{\n\t\n\t//Automatically generated by progfunc(\"";
+ program += funcname;
+ program += "\");\n\t";
+ program += funcname;
+ program += "();\n\t\n}\n";
+
+ result->SetValString(program.c_str());
+
+ return true;
+}
+
+// Compilation of instruction "object.busy()"
+CBotTypResult CScript::cBusy(CBotVar* thisclass, CBotVar* &var)
+{
+ if ( var != 0 ) return CBotTypResult(CBotErrOverParam);
+ return CBotTypResult(CBotTypBoolean);
+}
+
+// Instruction "object.busy()"
+
+bool CScript::rBusy(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception)
+{
+ exception = 0;
+
+ CBotVar* classVars = thisclass->GetItemList(); // "category"
+ classVars = classVars->GetNext(); // "position"
+ classVars = classVars->GetNext(); // "orientation"
+ classVars = classVars->GetNext(); // "pitch"
+ classVars = classVars->GetNext(); // "roll"
+ classVars = classVars->GetNext(); // "energyLevel"
+ classVars = classVars->GetNext(); // "shieldLevel"
+ classVars = classVars->GetNext(); // "temperature"
+ classVars = classVars->GetNext(); // "altitude"
+ classVars = classVars->GetNext(); // "lifeTime"
+ classVars = classVars->GetNext(); // "material"
+ classVars = classVars->GetNext(); // "energyCell"
+ classVars = classVars->GetNext(); // "load"
+ classVars = classVars->GetNext(); // "id"
+ int rank = classVars->GetValInt();
+ CObject* obj = CObjectManager::GetInstancePointer()->SearchInstance(rank);
+ CAuto* automat = obj->GetAuto();
+
+ if ( automat != nullptr )
+ result->SetValInt(automat->GetBusy());
+ else
+ exception = ERR_WRONG_OBJ;
+
+ return true;
+}
+
+bool CScript::rDestroy(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception)
+{
+ exception = 0;
+ Error err;
+
+ CBotVar* classVars = thisclass->GetItemList(); // "category"
+ ObjectType thisType = static_cast<ObjectType>(classVars->GetValInt());
+ classVars = classVars->GetNext(); // "position"
+ classVars = classVars->GetNext(); // "orientation"
+ classVars = classVars->GetNext(); // "pitch"
+ classVars = classVars->GetNext(); // "roll"
+ classVars = classVars->GetNext(); // "energyLevel"
+ classVars = classVars->GetNext(); // "shieldLevel"
+ classVars = classVars->GetNext(); // "temperature"
+ classVars = classVars->GetNext(); // "altitude"
+ classVars = classVars->GetNext(); // "lifeTime"
+ classVars = classVars->GetNext(); // "material"
+ classVars = classVars->GetNext(); // "energyCell"
+ classVars = classVars->GetNext(); // "load"
+ classVars = classVars->GetNext(); // "id"
+ int rank = classVars->GetValInt();
+ CObject* obj = CObjectManager::GetInstancePointer()->SearchInstance(rank);
+ CAuto* automat = obj->GetAuto();
+
+ if ( thisType == OBJECT_DESTROYER )
+ {
+ err = automat->StartAction(0);
+ } else
+ err = ERR_WRONG_OBJ;
+
+ if ( err != ERR_OK )
+ {
+ result->SetValInt(err); // return error
+//TODO: if ( script->m_errMode == ERM_STOP )
+ if( true )
+ {
+ exception = err;
+ return false;
+ }
+ return true;
+ }
+
+ return true;
+}
+
+
+// Compilation of instruction "object.factory(cat, program)"
+
+CBotTypResult CScript::cFactory(CBotVar* thisclass, CBotVar* &var)
+{
+ if ( var == 0 ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+ if ( var != 0 )
+ {
+ if ( var->GetType() != CBotTypString ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+ if ( var != 0 ) return CBotTypResult(CBotErrOverParam);
+ }
+ return CBotTypResult(CBotTypFloat);
+}
+
+// Instruction "object.factory(cat, program)"
+
+bool CScript::rFactory(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception)
+{
+ Error err;
+
+ exception = 0;
+
+ ObjectType type = static_cast<ObjectType>(var->GetValInt());
+ var = var->GetNext();
+ CBotString cbs;
+ const char* program;
+ if ( var != 0 )
+ {
+ cbs = var->GetValString();
+ program = cbs;
+ }
+ else
+ program = "";
+
+ CBotVar* classVars = thisclass->GetItemList(); // "category"
+ ObjectType thisType = static_cast<ObjectType>(classVars->GetValInt());
+ classVars = classVars->GetNext(); // "position"
+ classVars = classVars->GetNext(); // "orientation"
+ classVars = classVars->GetNext(); // "pitch"
+ classVars = classVars->GetNext(); // "roll"
+ classVars = classVars->GetNext(); // "energyLevel"
+ classVars = classVars->GetNext(); // "shieldLevel"
+ classVars = classVars->GetNext(); // "temperature"
+ classVars = classVars->GetNext(); // "altitude"
+ classVars = classVars->GetNext(); // "lifeTime"
+ classVars = classVars->GetNext(); // "material"
+ classVars = classVars->GetNext(); // "energyCell"
+ classVars = classVars->GetNext(); // "load"
+ classVars = classVars->GetNext(); // "id"
+ int rank = classVars->GetValInt();
+ CObject* factory = CObjectManager::GetInstancePointer()->SearchInstance(rank);
+ CAutoFactory* automat = static_cast<CAutoFactory*>(factory->GetAuto());
+
+ if ( thisType == OBJECT_FACTORY )
+ {
+ bool bEnable = false;
+
+ if ( type == OBJECT_MOBILEwa )
+ {
+ bEnable = true;
+ }
+ if ( type == OBJECT_MOBILEta )
+ {
+ bEnable = g_researchDone&RESEARCH_TANK;
+ }
+ if ( type == OBJECT_MOBILEfa )
+ {
+ bEnable = g_researchDone&RESEARCH_FLY;
+ }
+ if ( type == OBJECT_MOBILEia )
+ {
+ bEnable = g_researchDone&RESEARCH_iPAW;
+ }
+
+ if ( type == OBJECT_MOBILEws )
+ {
+ bEnable = g_researchDone&RESEARCH_SNIFFER;
+ }
+ if ( type == OBJECT_MOBILEts )
+ {
+ bEnable = ( (g_researchDone&RESEARCH_SNIFFER) &&
+ (g_researchDone&RESEARCH_TANK) );
+ }
+ if ( type == OBJECT_MOBILEfs )
+ {
+ bEnable = ( (g_researchDone&RESEARCH_SNIFFER) &&
+ (g_researchDone&RESEARCH_FLY) );
+ }
+ if ( type == OBJECT_MOBILEis )
+ {
+ bEnable = ( (g_researchDone&RESEARCH_SNIFFER) &&
+ (g_researchDone&RESEARCH_iPAW) );
+ }
+
+ if ( type == OBJECT_MOBILEwc )
+ {
+ bEnable = g_researchDone&RESEARCH_CANON;
+ }
+ if ( type == OBJECT_MOBILEtc )
+ {
+ bEnable = ( (g_researchDone&RESEARCH_CANON) &&
+ (g_researchDone&RESEARCH_TANK) );
+ }
+ if ( type == OBJECT_MOBILEfc )
+ {
+ bEnable = ( (g_researchDone&RESEARCH_CANON) &&
+ (g_researchDone&RESEARCH_FLY) );
+ }
+ if ( type == OBJECT_MOBILEic )
+ {
+ bEnable = ( (g_researchDone&RESEARCH_CANON) &&
+ (g_researchDone&RESEARCH_iPAW) );
+ }
+
+ if ( type == OBJECT_MOBILEwi )
+ {
+ bEnable = g_researchDone&RESEARCH_iGUN;
+ }
+ if ( type == OBJECT_MOBILEti )
+ {
+ bEnable = ( (g_researchDone&RESEARCH_iGUN) &&
+ (g_researchDone&RESEARCH_TANK) );
+ }
+ if ( type == OBJECT_MOBILEfi )
+ {
+ bEnable = ( (g_researchDone&RESEARCH_iGUN) &&
+ (g_researchDone&RESEARCH_FLY) );
+ }
+ if ( type == OBJECT_MOBILEii )
+ {
+ bEnable = ( (g_researchDone&RESEARCH_iGUN) &&
+ (g_researchDone&RESEARCH_iPAW) );
+ }
+
+ if ( type == OBJECT_MOBILErt )
+ {
+ bEnable = ( (g_researchDone&RESEARCH_THUMP) &&
+ (g_researchDone&RESEARCH_TANK) );
+ }
+ if ( type == OBJECT_MOBILErc )
+ {
+ bEnable = ( (g_researchDone&RESEARCH_PHAZER) &&
+ (g_researchDone&RESEARCH_TANK) );
+ }
+ if ( type == OBJECT_MOBILErr )
+ {
+ bEnable = ( (g_researchDone&RESEARCH_RECYCLER) &&
+ (g_researchDone&RESEARCH_TANK) );
+ }
+ if ( type == OBJECT_MOBILErs )
+ {
+ bEnable = ( (g_researchDone&RESEARCH_SHIELD) &&
+ (g_researchDone&RESEARCH_TANK) );
+ }
+
+ if ( type == OBJECT_MOBILEsa )
+ {
+ bEnable = g_researchDone&RESEARCH_SUBM;
+ }
+
+ if ( bEnable )
+ {
+ if ( automat != nullptr )
+ {
+ err = automat->StartAction(type);
+ if ( err == ERR_OK ) automat->SetProgram(program);
+ }
+ else
+ err = ERR_GENERIC;
+ }
+ else
+ err = ERR_BUILD_DISABLED;
+ }
+ else
+ err = ERR_WRONG_OBJ;
+
+ if ( err != ERR_OK )
+ {
+ result->SetValInt(err); // return error
+//TODO: if ( script->m_errMode == ERM_STOP )
+ if( true )
+ {
+ exception = err;
+ return false;
+ }
+ return true;
+ }
+
+ return true;
+}
+
+// Instruction "object.research(type)"
+
+bool CScript::rResearch(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception)
+{
+ Error err;
+
+ exception = 0;
+
+ ResearchType type = static_cast<ResearchType>(var->GetValInt());
+
+ CBotVar* classVars = thisclass->GetItemList(); // "category"
+ ObjectType thisType = static_cast<ObjectType>(classVars->GetValInt());
+ classVars = classVars->GetNext(); // "position"
+ classVars = classVars->GetNext(); // "orientation"
+ classVars = classVars->GetNext(); // "pitch"
+ classVars = classVars->GetNext(); // "roll"
+ classVars = classVars->GetNext(); // "energyLevel"
+ classVars = classVars->GetNext(); // "shieldLevel"
+ classVars = classVars->GetNext(); // "temperature"
+ classVars = classVars->GetNext(); // "altitude"
+ classVars = classVars->GetNext(); // "lifeTime"
+ classVars = classVars->GetNext(); // "material"
+ classVars = classVars->GetNext(); // "energyCell"
+ classVars = classVars->GetNext(); // "load"
+ classVars = classVars->GetNext(); // "id"
+ int rank = classVars->GetValInt();
+ CObject* center = CObjectManager::GetInstancePointer()->SearchInstance(rank);
+ CAuto* automat = center->GetAuto();
+
+ if ( thisType == OBJECT_RESEARCH ||
+ thisType == OBJECT_LABO )
+ {
+ bool ok = false;
+ if ( type == RESEARCH_iPAW ||
+ type == RESEARCH_iGUN )
+ {
+ if ( thisType != OBJECT_LABO )
+ err = ERR_WRONG_OBJ;
+ else
+ ok = true;
+ }
+ else
+ {
+ if ( thisType != OBJECT_RESEARCH )
+ err = ERR_WRONG_OBJ;
+ else
+ ok = true;
+ }
+ if ( ok )
+ {
+ bool bEnable = ( g_researchEnable & type );
+ if ( bEnable )
+ {
+ if ( automat != nullptr )
+ {
+ err = automat->StartAction(type);
+ }
+ else
+ err = ERR_GENERIC;
+ }
+ else
+ err = ERR_BUILD_DISABLED;
+ }
+ }
+ else
+ err = ERR_WRONG_OBJ;
+
+ if ( err != ERR_OK )
+ {
+ result->SetValInt(err); // return error
+//TODO: if ( script->m_errMode == ERM_STOP )
+ if( true )
+ {
+ exception = err;
+ return false;
+ }
+ return true;
+ }
+
+ return true;
+}
+
+// Compilation of the instruction "delete(rank[, exploType[, force]])".
+
+CBotTypResult CScript::cDelete(CBotVar* &var, void* user)
{
if ( var == 0 ) return CBotTypResult(CBotErrLowParam);
if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
var = var->GetNext();
- if ( var != 0 ) {
+ if ( var != 0 )
+ {
if ( var->GetType() != CBotTypInt ) return CBotTypResult(CBotErrBadNum);
var = var->GetNext();
- if ( var != 0 ) {
+ if ( var != 0 )
+ {
if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
var = var->GetNext();
}
@@ -371,9 +926,9 @@ CBotTypResult CScript::cDestroy(CBotVar* &var, void* user)
return CBotTypResult(CBotTypFloat);
}
-// Instruction "destroy(rank[, exploType[, force]])".
+// Instruction "delete(rank[, exploType[, force]])".
-bool CScript::rDestroy(CBotVar* var, CBotVar* result, int& exception, void* user)
+bool CScript::rDelete(CBotVar* var, CBotVar* result, int& exception, void* user)
{
CObject* pObj;
int rank;
@@ -382,10 +937,12 @@ bool CScript::rDestroy(CBotVar* var, CBotVar* result, int& exception, void* user
rank = var->GetValInt();
var->GetNext();
- if ( var != 0 ) {
+ if ( var != 0 )
+ {
exploType = var->GetValInt();
var->GetNext();
- if ( var != 0 ) {
+ if ( var != 0 )
+ {
force = var->GetValFloat();
}
}
@@ -397,9 +954,12 @@ bool CScript::rDestroy(CBotVar* var, CBotVar* result, int& exception, void* user
}
else
{
- if ( exploType ) {
+ if ( exploType )
+ {
pObj->ExploObject(static_cast<ExploType>(exploType), force);
- } else {
+ }
+ else
+ {
pObj->DeleteObject(false);
}
}
@@ -588,9 +1148,10 @@ bool CScript::rRadar(CBotVar* var, CBotVar* result, int& exception, void* user)
RadarFilter filter;
float best, minDist, maxDist, sens, iAngle, angle, focus, d, a;
int type, oType, i;
- bool bArray;
+ bool bArray = false;
type = OBJECT_NULL;
+ array = 0;
angle = 0.0f;
focus = Math::PI*2.0f;
minDist = 0.0f*g_unit;
@@ -668,7 +1229,7 @@ bool CScript::rRadar(CBotVar* var, CBotVar* result, int& exception, void* user)
if ( pObj->GetProxyActivate() ) continue;
oType = pObj->GetType();
- if ( oType == OBJECT_TOTO ) continue;
+ if ( oType == OBJECT_TOTO || oType == OBJECT_CONTROLLER ) continue;
if ( oType == OBJECT_RUINmobilew2 ||
oType == OBJECT_RUINmobilet1 ||
@@ -807,7 +1368,7 @@ bool CScript::rDetect(CBotVar* var, CBotVar* result, int& exception, void* user)
RadarFilter filter;
float bGoal, best, minDist, maxDist, sens, iAngle, angle, focus, d, a;
int type, oType, i;
- bool bArray;
+ bool bArray = false;
Error err;
exception = 0;
@@ -815,6 +1376,7 @@ bool CScript::rDetect(CBotVar* var, CBotVar* result, int& exception, void* user)
if ( script->m_primaryTask == 0 ) // no task in progress?
{
type = OBJECT_NULL;
+ array = 0;
angle = 0.0f;
focus = 45.0f*Math::PI/180.0f;
minDist = 0.0f*g_unit;
@@ -1003,8 +1565,65 @@ bool CScript::rDirection(CBotVar* var, CBotVar* result, int& exception, void* us
return true;
}
+// compilation of instruction "canbuild ( category );"
+
+CBotTypResult CScript::cCanBuild(CBotVar* &var, void* user)
+{
+ if ( var == 0 ) return CBotTypResult(CBotErrLowParam);
+ if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
+ var = var->GetNext();
+ if ( var != 0 ) return CBotTypResult(CBotErrOverParam);
+ return CBotTypResult(CBotTypBoolean);
+}
+
+// Instruction "canbuid ( category );"
+// returns true if this building can be built
+
+bool CScript::rCanBuild(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+ ObjectType category = static_cast<ObjectType>(var->GetValInt()); //get category parameter
+ exception = 0;
+
+ bool can = false;
+
+ if ( (category == OBJECT_DERRICK && (g_build & BUILD_DERRICK)) ||
+ (category == OBJECT_FACTORY && (g_build & BUILD_FACTORY)) ||
+ (category == OBJECT_STATION && (g_build & BUILD_STATION)) ||
+ (category == OBJECT_CONVERT && (g_build & BUILD_CONVERT)) ||
+ (category == OBJECT_REPAIR && (g_build & BUILD_REPAIR)) ||
+ (category == OBJECT_TOWER && (g_build & BUILD_TOWER)) ||
+ (category == OBJECT_RESEARCH && (g_build & BUILD_RESEARCH)) ||
+ (category == OBJECT_RADAR && (g_build & BUILD_RADAR)) ||
+ (category == OBJECT_ENERGY && (g_build & BUILD_ENERGY)) ||
+ (category == OBJECT_LABO && (g_build & BUILD_LABO)) ||
+ (category == OBJECT_NUCLEAR && (g_build & BUILD_NUCLEAR)) ||
+ (category == OBJECT_INFO && (g_build & BUILD_INFO)) ||
+ (category == OBJECT_PARA && (g_build & BUILD_PARA)) ||
+ (category == OBJECT_DESTROYER && (g_build & BUILD_DESTROYER)))
+ {
+
+ //if we want to build not researched one
+ if ( (category == OBJECT_TOWER && !(g_researchDone & RESEARCH_TOWER)) ||
+ (category == OBJECT_NUCLEAR && !(g_researchDone & RESEARCH_ATOMIC))
+ )
+ {
+ can = false;
+ }
+ else
+ {
+ can = true;
+ }
+
+ }
+
+ result->SetValInt(can);
+
+
+ return true;
+}
+
// Instruction "build(type)"
-// draws error if can not build (wher errormode stop), otherwise 0 <- 1
+// draws error if can not build (wher errormode stop), otherwise 0 <- error
bool CScript::rBuild(CBotVar* var, CBotVar* result, int& exception, void* user)
{
@@ -1012,7 +1631,7 @@ bool CScript::rBuild(CBotVar* var, CBotVar* result, int& exception, void* user)
CObject* pThis = static_cast<CObject *>(user);
ObjectType oType;
ObjectType category;
- Error err;
+ Error err = ERR_BUILD_DISABLED;
exception = 0;
@@ -1027,9 +1646,7 @@ bool CScript::rBuild(CBotVar* var, CBotVar* result, int& exception, void* user)
}
else
{
- category = static_cast<ObjectType>(var->GetValInt()); //get category parameter
-
- //if we want to produce one of these buildings
+ category = static_cast<ObjectType>(var->GetValInt()); //get category parameter
if ( (category == OBJECT_DERRICK && (g_build & BUILD_DERRICK)) ||
(category == OBJECT_FACTORY && (g_build & BUILD_FACTORY)) ||
(category == OBJECT_STATION && (g_build & BUILD_STATION)) ||
@@ -1041,34 +1658,39 @@ bool CScript::rBuild(CBotVar* var, CBotVar* result, int& exception, void* user)
(category == OBJECT_ENERGY && (g_build & BUILD_ENERGY)) ||
(category == OBJECT_LABO && (g_build & BUILD_LABO)) ||
(category == OBJECT_NUCLEAR && (g_build & BUILD_NUCLEAR)) ||
- (category == OBJECT_INFO && (g_build & BUILD_INFO )) ||
- (category == OBJECT_PARA && (g_build & BUILD_PARA )))
+ (category == OBJECT_INFO && (g_build & BUILD_INFO)) ||
+ (category == OBJECT_PARA && (g_build & BUILD_PARA)) ||
+ (category == OBJECT_DESTROYER && (g_build & BUILD_DESTROYER)))
{
- //if we want to build not researched one
- if ( (category == OBJECT_TOWER && !(g_researchDone & RESEARCH_TOWER)) ||
+ //if we want to build not researched one
+ if ( (category == OBJECT_TOWER && !(g_researchDone & RESEARCH_TOWER)) ||
(category == OBJECT_NUCLEAR && !(g_researchDone & RESEARCH_ATOMIC))
)
{
err = ERR_BUILD_RESEARCH;
}
- else if (script->m_primaryTask == 0) //if we have no other tasks
+ else
{
- script->m_primaryTask = new CTaskManager(script->m_object);
- err = script->m_primaryTask->StartTaskBuild(category);
-
- if (err != ERR_OK)
- {
- delete script->m_primaryTask;
- script->m_primaryTask = 0;
- }
+ err = ERR_OK;
}
}
- else //if we can't build this object
+
+ if (err == ERR_OK && script->m_primaryTask == 0) //if we can build and no task is present
{
- err = ERR_BUILD_DISABLED;
+ script->m_primaryTask = new CTaskManager(script->m_object);
+ err = script->m_primaryTask->StartTaskBuild(category);
+
+ if (err != ERR_OK)
+ {
+ delete script->m_primaryTask;
+ script->m_primaryTask = 0;
+ }
}
+ //When script is waiting for finishing this task, it sets ERR_OK, and continues executing Process
+ //without creating new task. I think, there was a problem with previous version in release configuration
+ //It did not init error variable in this situation, and code tried to use variable with trash inside
}
if ( err != ERR_OK )
@@ -1095,13 +1717,17 @@ CBotTypResult CScript::cProduce(CBotVar* &var, void* user)
if ( var == 0 ) return CBotTypResult(CBotErrLowParam);
- if ( var->GetType() <= CBotTypDouble ) {
+ if ( var->GetType() <= CBotTypDouble )
+ {
var = var->GetNext();
- if( var != 0 ) {
+ if( var != 0 )
+ {
if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
var = var->GetNext();
}
- } else {
+ }
+ else
+ {
ret = cPoint(var, user);
if ( ret.GetType() != 0 ) return ret;
@@ -1113,11 +1739,13 @@ CBotTypResult CScript::cProduce(CBotVar* &var, void* user)
if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
var = var->GetNext();
- if ( var != 0 ) {
+ if ( var != 0 )
+ {
if ( var->GetType() != CBotTypString ) return CBotTypResult(CBotErrBadString);
var = var->GetNext();
- if ( var != 0 ) {
+ if ( var != 0 )
+ {
if ( var->GetType() > CBotTypDouble ) return CBotTypResult(CBotErrBadNum);
var = var->GetNext();
}
@@ -1144,7 +1772,8 @@ bool CScript::rProduce(CBotVar* var, CBotVar* result, int& exception, void* user
ObjectType type;
float power;
- if ( var->GetType() <= CBotTypDouble ) {
+ if ( var->GetType() <= CBotTypDouble )
+ {
type = static_cast<ObjectType>(var->GetValInt());
var = var->GetNext();
@@ -1159,7 +1788,9 @@ bool CScript::rProduce(CBotVar* var, CBotVar* result, int& exception, void* user
power = -1.0f;
name = "";
- } else {
+ }
+ else
+ {
if ( !GetPoint(var, exception, pos) ) return true;
angle = var->GetValFloat()*Math::PI/180.0f;
@@ -1168,16 +1799,22 @@ bool CScript::rProduce(CBotVar* var, CBotVar* result, int& exception, void* user
type = static_cast<ObjectType>(var->GetValInt());
var = var->GetNext();
- if ( var != 0 ) {
+ if ( var != 0 )
+ {
cbs = var->GetValString();
name = cbs;
var = var->GetNext();
- if ( var != 0 ) {
+ if ( var != 0 )
+ {
power = var->GetValFloat();
- } else {
+ }
+ else
+ {
power = -1.0f;
}
- } else {
+ }
+ else
+ {
name = "";
power = -1.0f;
}
@@ -1224,12 +1861,11 @@ bool CScript::rProduce(CBotVar* var, CBotVar* result, int& exception, void* user
}
object->SetActivity(false);
}
- else
- if ( type == OBJECT_MOTHER ||
- type == OBJECT_ANT ||
- type == OBJECT_SPIDER ||
- type == OBJECT_BEE ||
- type == OBJECT_WORM )
+ else if ( type == OBJECT_MOTHER ||
+ type == OBJECT_ANT ||
+ type == OBJECT_SPIDER ||
+ type == OBJECT_BEE ||
+ type == OBJECT_WORM )
{
CObject* egg;
@@ -1248,30 +1884,29 @@ bool CScript::rProduce(CBotVar* var, CBotVar* result, int& exception, void* user
}
object->SetActivity(false);
}
- else
- if ( type == OBJECT_PORTICO ||
- type == OBJECT_BASE ||
- type == OBJECT_DERRICK ||
- type == OBJECT_FACTORY ||
- type == OBJECT_STATION ||
- type == OBJECT_CONVERT ||
- type == OBJECT_REPAIR ||
- type == OBJECT_DESTROYER||
- type == OBJECT_TOWER ||
- type == OBJECT_NEST ||
- type == OBJECT_RESEARCH ||
- type == OBJECT_RADAR ||
- type == OBJECT_INFO ||
- type == OBJECT_ENERGY ||
- type == OBJECT_LABO ||
- type == OBJECT_NUCLEAR ||
- type == OBJECT_PARA ||
- type == OBJECT_SAFE ||
- type == OBJECT_HUSTON ||
- type == OBJECT_TARGET1 ||
- type == OBJECT_TARGET2 ||
- type == OBJECT_START ||
- type == OBJECT_END )
+ else if ( type == OBJECT_PORTICO ||
+ type == OBJECT_BASE ||
+ type == OBJECT_DERRICK ||
+ type == OBJECT_FACTORY ||
+ type == OBJECT_STATION ||
+ type == OBJECT_CONVERT ||
+ type == OBJECT_REPAIR ||
+ type == OBJECT_DESTROYER||
+ type == OBJECT_TOWER ||
+ type == OBJECT_NEST ||
+ type == OBJECT_RESEARCH ||
+ type == OBJECT_RADAR ||
+ type == OBJECT_INFO ||
+ type == OBJECT_ENERGY ||
+ type == OBJECT_LABO ||
+ type == OBJECT_NUCLEAR ||
+ type == OBJECT_PARA ||
+ type == OBJECT_SAFE ||
+ type == OBJECT_HUSTON ||
+ type == OBJECT_TARGET1 ||
+ type == OBJECT_TARGET2 ||
+ type == OBJECT_START ||
+ type == OBJECT_END )
{
object = new CObject();
if ( !object->CreateBuilding(pos, angle, 0, type) )
@@ -1283,12 +1918,11 @@ bool CScript::rProduce(CBotVar* var, CBotVar* result, int& exception, void* user
object->SetActivity(false);
script->m_main->CreateShortcuts();
}
- else
- if ( type == OBJECT_FLAGb ||
- type == OBJECT_FLAGr ||
- type == OBJECT_FLAGg ||
- type == OBJECT_FLAGy ||
- type == OBJECT_FLAGv )
+ else if ( type == OBJECT_FLAGb ||
+ type == OBJECT_FLAGr ||
+ type == OBJECT_FLAGg ||
+ type == OBJECT_FLAGy ||
+ type == OBJECT_FLAGv )
{
object = new CObject();
if ( !object->CreateFlag(pos, angle, type) )
@@ -1299,38 +1933,37 @@ bool CScript::rProduce(CBotVar* var, CBotVar* result, int& exception, void* user
}
object->SetActivity(false);
}
- else
- if ( type == OBJECT_HUMAN ||
- type == OBJECT_TECH ||
- type == OBJECT_TOTO ||
- type == OBJECT_MOBILEfa ||
- type == OBJECT_MOBILEta ||
- type == OBJECT_MOBILEwa ||
- type == OBJECT_MOBILEia ||
- type == OBJECT_MOBILEfc ||
- type == OBJECT_MOBILEtc ||
- type == OBJECT_MOBILEwc ||
- type == OBJECT_MOBILEic ||
- type == OBJECT_MOBILEfi ||
- type == OBJECT_MOBILEti ||
- type == OBJECT_MOBILEwi ||
- type == OBJECT_MOBILEii ||
- type == OBJECT_MOBILEfs ||
- type == OBJECT_MOBILEts ||
- type == OBJECT_MOBILEws ||
- type == OBJECT_MOBILEis ||
- type == OBJECT_MOBILErt ||
- type == OBJECT_MOBILErc ||
- type == OBJECT_MOBILErr ||
- type == OBJECT_MOBILErs ||
- type == OBJECT_MOBILEsa ||
- type == OBJECT_MOBILEtg ||
- type == OBJECT_MOBILEft ||
- type == OBJECT_MOBILEtt ||
- type == OBJECT_MOBILEwt ||
- type == OBJECT_MOBILEit ||
- type == OBJECT_MOBILEdr ||
- type == OBJECT_APOLLO2 )
+ else if ( type == OBJECT_HUMAN ||
+ type == OBJECT_TECH ||
+ type == OBJECT_TOTO ||
+ type == OBJECT_MOBILEfa ||
+ type == OBJECT_MOBILEta ||
+ type == OBJECT_MOBILEwa ||
+ type == OBJECT_MOBILEia ||
+ type == OBJECT_MOBILEfc ||
+ type == OBJECT_MOBILEtc ||
+ type == OBJECT_MOBILEwc ||
+ type == OBJECT_MOBILEic ||
+ type == OBJECT_MOBILEfi ||
+ type == OBJECT_MOBILEti ||
+ type == OBJECT_MOBILEwi ||
+ type == OBJECT_MOBILEii ||
+ type == OBJECT_MOBILEfs ||
+ type == OBJECT_MOBILEts ||
+ type == OBJECT_MOBILEws ||
+ type == OBJECT_MOBILEis ||
+ type == OBJECT_MOBILErt ||
+ type == OBJECT_MOBILErc ||
+ type == OBJECT_MOBILErr ||
+ type == OBJECT_MOBILErs ||
+ type == OBJECT_MOBILEsa ||
+ type == OBJECT_MOBILEtg ||
+ type == OBJECT_MOBILEft ||
+ type == OBJECT_MOBILEtt ||
+ type == OBJECT_MOBILEwt ||
+ type == OBJECT_MOBILEit ||
+ type == OBJECT_MOBILEdr ||
+ type == OBJECT_APOLLO2 )
{
object = new CObject();
if ( !object->CreateVehicle(pos, angle, type, power, false, false) )
@@ -1349,8 +1982,9 @@ bool CScript::rProduce(CBotVar* var, CBotVar* result, int& exception, void* user
}
object->SetLock(false); // vehicle useable
// SetManual will affect bot speed
- if (type == OBJECT_MOBILEdr) {
- object->SetManual(true);
+ if (type == OBJECT_MOBILEdr)
+ {
+ object->SetManual(true);
}
object->SetActivity(true);
script->m_main->CreateShortcuts();
@@ -1361,8 +1995,11 @@ bool CScript::rProduce(CBotVar* var, CBotVar* result, int& exception, void* user
return true;
}
- object->ReadProgram(0, static_cast<const char*>(name));
- object->RunProgram(0);
+ if (name[0] != 0)
+ {
+ object->ReadProgram(0, static_cast<const char*>(name));
+ object->RunProgram(0);
+ }
result->SetValInt(0); // no error
return true;
@@ -2391,8 +3028,8 @@ bool CScript::rAim(CBotVar* var, CBotVar* result, int& exception, void* user)
{
script->m_primaryTask = new CTaskManager(script->m_object);
x = var->GetValFloat();
- var = var->GetNext();
- var == 0 ? y=0.0f : y=var->GetValFloat();
+ var = var->GetNext();
+ var == 0 ? y=0.0f : y=var->GetValFloat();
err = script->m_primaryTask->StartTaskGunGoal(x*Math::PI/180.0f, y*Math::PI/180.0f);
if ( err != ERR_OK )
{
@@ -2897,8 +3534,21 @@ void CScript::InitFonctions()
CBotProgram::AddFunction("rand", rRand, CScript::cNull);
CBotProgram::AddFunction("abs", rAbs, CScript::cOneFloat);
+ CBotProgram::AddFunction("endmission",rEndMission,CScript::cEndMission);
+ CBotProgram::AddFunction("playmusic", rPlayMusic ,CScript::cPlayMusic);
+ CBotProgram::AddFunction("stopmusic", rStopMusic ,CScript::cNull);
+
+ CBotProgram::AddFunction("getbuild", rGetBuild, CScript::cNull);
+ CBotProgram::AddFunction("getresearchenable", rGetResearchEnable, CScript::cNull);
+ CBotProgram::AddFunction("getresearchdone", rGetResearchDone, CScript::cNull);
+ CBotProgram::AddFunction("setbuild", rSetBuild, CScript::cOneFloat);
+ CBotProgram::AddFunction("setresearchenable", rSetResearchEnable, CScript::cOneFloat);
+ CBotProgram::AddFunction("setresearchdone", rSetResearchDone, CScript::cOneFloat);
+
+ CBotProgram::AddFunction("progfunc", rProgFunc, CScript::cStringString);
CBotProgram::AddFunction("retobject", rGetObject, CScript::cGetObject);
- CBotProgram::AddFunction("destroy", rDestroy, CScript::cDestroy);
+ CBotProgram::AddFunction("retobjectbyid", rGetObjectById, CScript::cGetObject);
+ CBotProgram::AddFunction("delete", rDelete, CScript::cDelete);
CBotProgram::AddFunction("search", rSearch, CScript::cSearch);
CBotProgram::AddFunction("radar", rRadar, CScript::cRadar);
CBotProgram::AddFunction("detect", rDetect, CScript::cDetect);
@@ -2939,6 +3589,7 @@ void CScript::InitFonctions()
CBotProgram::AddFunction("pencolor", rPenColor, CScript::cOneFloat);
CBotProgram::AddFunction("penwidth", rPenWidth, CScript::cOneFloat);
+ CBotProgram::AddFunction("canbuild", rCanBuild, CScript::cCanBuild);
CBotProgram::AddFunction("build", rBuild, CScript::cOneFloat);
}
@@ -3131,7 +3782,7 @@ bool CScript::Compile()
{
if ( liste.GetSize() == 0 )
{
- strcpy(m_title, "<sans nom>");
+ strcpy(m_title, "<extern missing>");
}
else
{
@@ -3168,7 +3819,7 @@ bool CScript::Compile()
{
m_cursor1 = m_cursor2 = 0;
}
- strcpy(m_title, "<erreur>");
+ strcpy(m_title, "<error>");
return false;
}
}
@@ -3407,7 +4058,7 @@ void PutList(const char *baseName, bool bArray, CBotVar *var, Ui::CList *list, i
if ( var == 0 && baseName[0] != 0 )
{
sprintf(buffer, "%s = null;", baseName);
- list->SetName(rankList++, buffer);
+ list->SetItemName(rankList++, buffer);
return;
}
@@ -3449,7 +4100,7 @@ void PutList(const char *baseName, bool bArray, CBotVar *var, Ui::CList *list, i
value = pStatic->GetValString();
p = value;
sprintf(buffer, "%s = %s;", varName, p);
- list->SetName(rankList++, buffer);
+ list->SetItemName(rankList++, buffer);
}
else if ( type == CBotTypString )
{
@@ -3457,7 +4108,7 @@ void PutList(const char *baseName, bool bArray, CBotVar *var, Ui::CList *list, i
value = pStatic->GetValString();
p = value;
sprintf(buffer, "%s = \"%s\";", varName, p);
- list->SetName(rankList++, buffer);
+ list->SetItemName(rankList++, buffer);
}
else if ( type == CBotTypArrayPointer )
{
@@ -3473,7 +4124,7 @@ void PutList(const char *baseName, bool bArray, CBotVar *var, Ui::CList *list, i
else
{
sprintf(buffer, "%s = ?;", varName);
- list->SetName(rankList++, buffer);
+ list->SetItemName(rankList++, buffer);
}
index ++;
@@ -3832,13 +4483,20 @@ void CScript::New(Ui::CEdit* edit, const char* name)
// Provided a script for all parts.
-bool CScript::SendScript(char* text)
+bool CScript::SendScript(const char* text)
{
- m_len = strlen(text);
+ /*m_len = strlen(text);
m_script = new char[m_len+1];
strcpy(m_script, text);
if ( !CheckToken() ) return false;
- if ( !Compile() ) return false;
+ if ( !Compile() ) return false;*/
+
+ Ui::CEdit* edit = m_interface->CreateEdit(Math::Point(0.0f, 0.0f), Math::Point(0.0f, 0.0f), 0, EVENT_EDIT9);
+ edit->SetMaxChar(Ui::EDITSTUDIOMAX);
+ edit->SetAutoIndent(m_engine->GetEditIndentMode());
+ edit->SetText(text, true);
+ GetScript(edit);
+ m_interface->DeleteControl(EVENT_EDIT9);
return true;
}
diff --git a/src/script/script.h b/src/script/script.h
index 597486b..7a5d075 100644
--- a/src/script/script.h
+++ b/src/script/script.h
@@ -38,13 +38,13 @@ class CDisplayText;
class CEdit;
class CInterface;
class CList;
-} /* Ui */
+} /* Ui */
namespace Gfx {
class CEngine;
class CTerrain;
class CWater;
-} /* Gfx */
+} /* Gfx */
@@ -78,7 +78,7 @@ public:
void GetError(char* buffer);
void New(Ui::CEdit* edit, const char* name);
- bool SendScript(char* text);
+ bool SendScript(const char* text);
bool ReadScript(const char* filename);
bool WriteScript(const char* filename);
bool ReadStack(FILE *file);
@@ -94,17 +94,20 @@ protected:
bool Compile();
private:
-
static CBotTypResult cNull(CBotVar* &var, void* user);
static CBotTypResult cOneFloat(CBotVar* &var, void* user);
static CBotTypResult cTwoFloat(CBotVar* &var, void* user);
static CBotTypResult cString(CBotVar* &var, void* user);
+ static CBotTypResult cStringString(CBotVar* &var, void* user);
+ static CBotTypResult cEndMission(CBotVar* &var, void* user);
+ static CBotTypResult cPlayMusic(CBotVar* &var, void* user);
static CBotTypResult cGetObject(CBotVar* &var, void* user);
- static CBotTypResult cDestroy(CBotVar* &var, void* user);
+ static CBotTypResult cDelete(CBotVar* &var, void* user);
static CBotTypResult cSearch(CBotVar* &var, void* user);
static CBotTypResult cRadar(CBotVar* &var, void* user);
static CBotTypResult cDetect(CBotVar* &var, void* user);
- static CBotTypResult cDirection(CBotVar* &var, void* user);
+ static CBotTypResult cDirection(CBotVar* &var, void* user);
+ static CBotTypResult cCanBuild(CBotVar* &var, void* user);
static CBotTypResult cProduce(CBotVar* &var, void* user);
static CBotTypResult cDistance(CBotVar* &var, void* user);
static CBotTypResult cSpace(CBotVar* &var, void* user);
@@ -133,12 +136,24 @@ private:
static bool rPow(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rRand(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rAbs(CBotVar* var, CBotVar* result, int& exception, void* user);
+ static bool rEndMission(CBotVar* var, CBotVar* result, int& exception, void* user);
+ static bool rPlayMusic(CBotVar* var, CBotVar* result, int& exception, void* user);
+ static bool rStopMusic(CBotVar* var, CBotVar* result, int& exception, void* user);
+ static bool rGetBuild(CBotVar* var, CBotVar* result, int& exception, void* user);
+ static bool rGetResearchEnable(CBotVar* var, CBotVar* result, int& exception, void* user);
+ static bool rGetResearchDone(CBotVar* var, CBotVar* result, int& exception, void* user);
+ static bool rSetBuild(CBotVar* var, CBotVar* result, int& exception, void* user);
+ static bool rSetResearchEnable(CBotVar* var, CBotVar* result, int& exception, void* user);
+ static bool rSetResearchDone(CBotVar* var, CBotVar* result, int& exception, void* user);
+ static bool rGetObjectById(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rGetObject(CBotVar* var, CBotVar* result, int& exception, void* user);
- static bool rDestroy(CBotVar* var, CBotVar* result, int& exception, void* user);
+ static bool rProgFunc(CBotVar* var, CBotVar* result, int& exception, void* user);
+ static bool rDelete(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rSearch(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rRadar(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rDetect(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rDirection(CBotVar* var, CBotVar* result, int& exception, void* user);
+ static bool rCanBuild(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rBuild(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rProduce(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rDistance(CBotVar* var, CBotVar* result, int& exception, void* user);
@@ -177,6 +192,18 @@ private:
static bool rPenColor(CBotVar* var, CBotVar* result, int& exception, void* user);
static bool rPenWidth(CBotVar* var, CBotVar* result, int& exception, void* user);
+public:
+ static CBotTypResult cBusy(CBotVar* thisclass, CBotVar* &var);
+ static CBotTypResult cFactory(CBotVar* thisclass, CBotVar* &var);
+ static CBotTypResult cClassNull(CBotVar* thisclass, CBotVar* &var);
+ static CBotTypResult cClassOneFloat(CBotVar* thisclass, CBotVar* &var);
+
+ static bool rBusy(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception);
+ static bool rFactory(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception);
+ static bool rResearch(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception);
+ static bool rDestroy(CBotVar* thisclass, CBotVar* var, CBotVar* result, int& exception);
+
+private:
static bool Process(CScript* script, CBotVar* result, int &exception);
static CObject* SearchInfo(CScript* script, CObject* object, float power);
@@ -210,4 +237,3 @@ protected:
float m_returnValue;
};
-
diff --git a/src/sound/README.txt b/src/sound/README.txt
index fa2f531..f0ccb9e 100644
--- a/src/sound/README.txt
+++ b/src/sound/README.txt
@@ -2,3 +2,4 @@
* \dir src/sound
* \brief Sound module - playing sounds and music
*/
+
diff --git a/src/sound/oalsound/alsound.cpp b/src/sound/oalsound/alsound.cpp
index cfb0c70..992b8b2 100644
--- a/src/sound/oalsound/alsound.cpp
+++ b/src/sound/oalsound/alsound.cpp
@@ -16,19 +16,22 @@
// * along with this program. If not, see http://www.gnu.org/licenses/.
-#include "alsound.h"
+#include "sound/oalsound/alsound.h"
-#define MIN(a, b) (a > b ? b : a)
+#include <algorithm>
+#include <iomanip>
+
+#include <boost/filesystem.hpp>
ALSound::ALSound()
{
- mEnabled = false;
- m3D = false;
- mAudioVolume = 1.0f;
- mMusicVolume = 1.0f;
- mCurrentMusic = nullptr;
- mEye.LoadZero();
- mLookat.LoadZero();
+ m_enabled = false;
+ m_3D = false;
+ m_audioVolume = 1.0f;
+ m_musicVolume = 1.0f;
+ m_currentMusic = nullptr;
+ m_eye.LoadZero();
+ m_lookat.LoadZero();
}
@@ -40,31 +43,36 @@ ALSound::~ALSound()
void ALSound::CleanUp()
{
- if (mEnabled) {
+ if (m_enabled)
+ {
GetLogger()->Info("Unloading files and closing device...\n");
StopAll();
StopMusic();
- for (auto channel : mChannels) {
+ for (auto channel : m_channels)
+ {
delete channel.second;
}
- if (mCurrentMusic) {
- delete mCurrentMusic;
+ if (m_currentMusic)
+ {
+ delete m_currentMusic;
}
- for (auto item : mSounds) {
+ for (auto item : m_sounds)
+ {
delete item.second;
}
- for (auto item : mMusic) {
+ for (auto item : m_music)
+ {
delete item.second;
}
- mEnabled = false;
+ m_enabled = false;
- alcDestroyContext(mContext);
- alcCloseDevice(mDevice);
+ alcDestroyContext(m_context);
+ alcCloseDevice(m_device);
}
}
@@ -73,41 +81,43 @@ bool ALSound::Create(bool b3D)
{
CleanUp();
- if (mEnabled)
+ if (m_enabled)
return true;
GetLogger()->Info("Opening audio device...\n");
- mDevice = alcOpenDevice(NULL);
- if (!mDevice) {
+ m_device = alcOpenDevice(NULL);
+ if (!m_device)
+ {
GetLogger()->Error("Could not open audio device!\n");
return false;
}
- mContext = alcCreateContext(mDevice, NULL);
- if (!mContext) {
+ m_context = alcCreateContext(m_device, NULL);
+ if (!m_context)
+ {
GetLogger()->Error("Could not create audio context!\n");
return false;
}
- alcMakeContextCurrent(mContext);
- alListenerf(AL_GAIN, mAudioVolume);
+ alcMakeContextCurrent(m_context);
+ alListenerf(AL_GAIN, m_audioVolume);
alDistanceModel(AL_LINEAR_DISTANCE_CLAMPED);
- mCurrentMusic = new Channel();
+ m_currentMusic = new Channel();
GetLogger()->Info("Done.\n");
- mEnabled = true;
+ m_enabled = true;
return true;
}
void ALSound::SetSound3D(bool bMode)
{
- m3D = bMode;
+ m_3D = bMode;
}
bool ALSound::GetSound3D()
{
- return m3D;
+ return m_3D;
}
@@ -120,48 +130,50 @@ bool ALSound::GetSound3DCap()
bool ALSound::GetEnable()
{
- return mEnabled;
+ return m_enabled;
}
void ALSound::SetAudioVolume(int volume)
{
- mAudioVolume = static_cast<float>(volume) / MAXVOLUME;
+ m_audioVolume = static_cast<float>(volume) / MAXVOLUME;
}
int ALSound::GetAudioVolume()
{
- if ( !mEnabled )
+ if ( !m_enabled )
return 0;
- return mAudioVolume * MAXVOLUME;
+ return m_audioVolume * MAXVOLUME;
}
void ALSound::SetMusicVolume(int volume)
{
- mMusicVolume = static_cast<float>(volume) / MAXVOLUME;
- if (mCurrentMusic) {
- mCurrentMusic->SetVolume(mMusicVolume);
+ m_musicVolume = static_cast<float>(volume) / MAXVOLUME;
+ if (m_currentMusic)
+ {
+ m_currentMusic->SetVolume(m_musicVolume);
}
}
int ALSound::GetMusicVolume()
{
- if ( !mEnabled )
+ if ( !m_enabled )
return 0.0f;
- return mMusicVolume * MAXVOLUME;
+ return m_musicVolume * MAXVOLUME;
}
bool ALSound::Cache(Sound sound, std::string filename)
{
Buffer *buffer = new Buffer();
- if (buffer->LoadFromFile(filename, sound)) {
- mSounds[sound] = buffer;
+ if (buffer->LoadFromFile(filename, sound))
+ {
+ m_sounds[sound] = buffer;
return true;
}
return false;
@@ -169,17 +181,20 @@ bool ALSound::Cache(Sound sound, std::string filename)
bool ALSound::CacheMusic(std::string filename)
{
- Buffer *buffer = new Buffer();
- std::stringstream file;
- file << m_soundPath << "/" << filename;
- if (buffer->LoadFromFile(file.str(), static_cast<Sound>(-1))) {
- mMusic[filename] = buffer;
- return true;
+ if (m_music.find(filename) == m_music.end())
+ {
+ Buffer *buffer = new Buffer();
+ std::stringstream file;
+ file << m_soundPath << "/" << filename;
+ if (buffer->LoadFromFile(file.str(), static_cast<Sound>(-1)))
+ {
+ m_music[filename] = buffer;
+ return true;
+ }
}
return false;
}
-
int ALSound::GetPriority(Sound sound)
{
if ( sound == SOUND_FLYh ||
@@ -234,7 +249,8 @@ bool ALSound::SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded)
int priority = GetPriority(sound);
// Seeks a channel used which sound is stopped.
- for (auto it : mChannels) {
+ for (auto it : m_channels)
+ {
if (it.second->IsPlaying())
continue;
if (it.second->GetSoundType() != sound)
@@ -247,47 +263,55 @@ bool ALSound::SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded)
}
// just add a new channel if we dont have any
- if (mChannels.size() == 0) {
+ if (m_channels.size() == 0)
+ {
Channel *chn = new Channel();
// check if we channel ready to play music, if not report error
- if (chn->IsReady()) {
+ if (chn->IsReady())
+ {
chn->SetPriority(priority);
- mChannels[1] = chn;
+ m_channels[1] = chn;
channel = 1;
bAlreadyLoaded = false;
return true;
}
delete chn;
- GetLogger()->Error("Could not open channel to play sound!");
+ GetLogger()->Error("Could not open channel to play sound!\n");
return false;
}
// Seeks a channel completely free.
- if (mChannels.size() < 64) {
- auto it = mChannels.end();
+ if (m_channels.size() < 64)
+ {
+ auto it = m_channels.end();
it--;
int i = (*it).first;
- while (++i) {
- if (mChannels.find(i) == mChannels.end()) {
+ while (++i)
+ {
+ if (m_channels.find(i) == m_channels.end())
+ {
Channel *chn = new Channel();
// check if channel is ready to play music, if not destroy it and seek free one
- if (chn->IsReady()) {
+ if (chn->IsReady())
+ {
chn->SetPriority(priority);
- mChannels[++i] = chn;
+ m_channels[++i] = chn;
channel = i;
bAlreadyLoaded = false;
return true;
}
delete chn;
- GetLogger()->Warn("Could not open additional channel to play sound!");
+ GetLogger()->Warn("Could not open additional channel to play sound!\n");
}
}
}
int lowerOrEqual = -1;
- for (auto it : mChannels) {
- if (it.second->GetPriority() < priority) {
- GetLogger()->Debug("Sound channel with lower priority will be reused.");
+ for (auto it : m_channels)
+ {
+ if (it.second->GetPriority() < priority)
+ {
+ GetLogger()->Debug("Sound channel with lower priority will be reused.\n");
channel = it.first;
return true;
}
@@ -295,9 +319,10 @@ bool ALSound::SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded)
lowerOrEqual = it.first;
}
- if (lowerOrEqual != -1) {
+ if (lowerOrEqual != -1)
+ {
channel = lowerOrEqual;
- GetLogger()->Debug("Sound channel with lower or equal priority will be reused.");
+ GetLogger()->Debug("Sound channel with lower or equal priority will be reused.\n");
return true;
}
@@ -308,16 +333,18 @@ bool ALSound::SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded)
int ALSound::Play(Sound sound, float amplitude, float frequency, bool bLoop)
{
- return Play(sound, mEye, amplitude, frequency, bLoop);
+ return Play(sound, m_eye, amplitude, frequency, bLoop);
}
int ALSound::Play(Sound sound, Math::Vector pos, float amplitude, float frequency, bool bLoop)
{
- if (!mEnabled) {
+ if (!m_enabled)
+ {
return -1;
}
- if (mSounds.find(sound) == mSounds.end()) {
+ if (m_sounds.find(sound) == m_sounds.end())
+ {
GetLogger()->Warn("Sound %d was not loaded!\n", sound);
return -1;
}
@@ -327,29 +354,34 @@ int ALSound::Play(Sound sound, Math::Vector pos, float amplitude, float frequenc
if (!SearchFreeBuffer(sound, channel, bAlreadyLoaded))
return -1;
- if (!bAlreadyLoaded) {
- if (!mChannels[channel]->SetBuffer(mSounds[sound])) {
- mChannels[channel]->SetBuffer(nullptr);
+ if (!bAlreadyLoaded)
+ {
+ if (!m_channels[channel]->SetBuffer(m_sounds[sound]))
+ {
+ m_channels[channel]->SetBuffer(nullptr);
return -1;
}
}
Position(channel, pos);
- if (!m3D) {
+ if (!m_3D)
+ {
ComputeVolumePan2D(channel, pos);
- } else {
- mChannels[channel]->SetVolumeAtrib(1.0f);
+ }
+ else
+ {
+ m_channels[channel]->SetVolumeAtrib(1.0f);
}
// setting initial values
- mChannels[channel]->SetStartAmplitude(amplitude);
- mChannels[channel]->SetStartFrequency(frequency);
- mChannels[channel]->SetChangeFrequency(1.0f);
- mChannels[channel]->ResetOper();
- mChannels[channel]->SetFrequency(frequency);
- mChannels[channel]->SetVolume(powf(amplitude * mChannels[channel]->GetVolumeAtrib(), 0.2f) * mAudioVolume);
- mChannels[channel]->SetLoop(bLoop);
- mChannels[channel]->Play();
+ m_channels[channel]->SetStartAmplitude(amplitude);
+ m_channels[channel]->SetStartFrequency(frequency);
+ m_channels[channel]->SetChangeFrequency(1.0f);
+ m_channels[channel]->ResetOper();
+ m_channels[channel]->SetFrequency(frequency);
+ m_channels[channel]->SetVolume(powf(amplitude * m_channels[channel]->GetVolumeAtrib(), 0.2f) * m_audioVolume);
+ m_channels[channel]->SetLoop(bLoop);
+ m_channels[channel]->Play();
return channel;
}
@@ -357,31 +389,33 @@ int ALSound::Play(Sound sound, Math::Vector pos, float amplitude, float frequenc
bool ALSound::FlushEnvelope(int channel)
{
- if (mChannels.find(channel) == mChannels.end()) {
+ if (m_channels.find(channel) == m_channels.end())
+ {
return false;
}
- mChannels[channel]->ResetOper();
+ m_channels[channel]->ResetOper();
return true;
}
bool ALSound::AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper)
{
- if (!mEnabled)
+ if (!m_enabled)
return false;
- if (mChannels.find(channel) == mChannels.end()) {
+ if (m_channels.find(channel) == m_channels.end())
+ {
return false;
}
-
+
SoundOper op;
op.finalAmplitude = amplitude;
op.finalFrequency = frequency;
op.totalTime = time;
op.nextOper = oper;
op.currentTime = 0.0f;
- mChannels[channel]->AddOper(op);
+ m_channels[channel]->AddOper(op);
return true;
}
@@ -389,21 +423,26 @@ bool ALSound::AddEnvelope(int channel, float amplitude, float frequency, float t
bool ALSound::Position(int channel, Math::Vector pos)
{
- if (!mEnabled)
+ if (!m_enabled)
return false;
- if (mChannels.find(channel) == mChannels.end()) {
+ if (m_channels.find(channel) == m_channels.end())
+ {
return false;
}
- if (m3D) {
- mChannels[channel]->SetPan(pos);
- } else {
+ if (m_3D)
+ {
+ m_channels[channel]->SetPan(pos);
+ }
+ else
+ {
ComputeVolumePan2D(channel, pos);
-
- if (!mChannels[channel]->HasEnvelope()) {
- float volume = mChannels[channel]->GetStartAmplitude();
- mChannels[channel]->SetVolume(powf(volume * mChannels[channel]->GetVolumeAtrib(), 0.2f) * mAudioVolume);
+
+ if (!m_channels[channel]->HasEnvelope())
+ {
+ float volume = m_channels[channel]->GetStartAmplitude();
+ m_channels[channel]->SetVolume(powf(volume * m_channels[channel]->GetVolumeAtrib(), 0.2f) * m_audioVolume);
}
}
return true;
@@ -412,29 +451,31 @@ bool ALSound::Position(int channel, Math::Vector pos)
bool ALSound::Frequency(int channel, float frequency)
{
- if (!mEnabled)
+ if (!m_enabled)
return false;
- if (mChannels.find(channel) == mChannels.end()) {
+ if (m_channels.find(channel) == m_channels.end())
+ {
return false;
}
- mChannels[channel]->SetFrequency(frequency * mChannels[channel]->GetInitFrequency());
- mChannels[channel]->SetChangeFrequency(frequency);
+ m_channels[channel]->SetFrequency(frequency * m_channels[channel]->GetInitFrequency());
+ m_channels[channel]->SetChangeFrequency(frequency);
return true;
}
bool ALSound::Stop(int channel)
{
- if (!mEnabled)
+ if (!m_enabled)
return false;
- if (mChannels.find(channel) == mChannels.end()) {
+ if (m_channels.find(channel) == m_channels.end())
+ {
return false;
}
- mChannels[channel]->Stop();
- mChannels[channel]->ResetOper();
+ m_channels[channel]->Stop();
+ m_channels[channel]->ResetOper();
return true;
}
@@ -442,10 +483,11 @@ bool ALSound::Stop(int channel)
bool ALSound::StopAll()
{
- if (!mEnabled)
+ if (!m_enabled)
return false;
- for (auto channel : mChannels) {
+ for (auto channel : m_channels)
+ {
channel.second->Stop();
channel.second->ResetOper();
}
@@ -456,19 +498,24 @@ bool ALSound::StopAll()
bool ALSound::MuteAll(bool bMute)
{
- if (!mEnabled)
+ if (!m_enabled)
return false;
-
- for (auto it : mChannels) {
- if (it.second->IsPlaying()) {
+
+ for (auto it : m_channels)
+ {
+ if (it.second->IsPlaying())
+ {
it.second->Mute(bMute);
}
}
- if (bMute) {
- mCurrentMusic->SetVolume(0.0f);
- } else {
- mCurrentMusic->SetVolume(mMusicVolume);
+ if (bMute)
+ {
+ m_currentMusic->SetVolume(0.0f);
+ }
+ else
+ {
+ m_currentMusic->SetVolume(m_musicVolume);
}
return true;
}
@@ -476,17 +523,20 @@ bool ALSound::MuteAll(bool bMute)
void ALSound::FrameMove(float delta)
{
- if (!mEnabled)
+ if (!m_enabled)
return;
float progress;
float volume, frequency;
- for (auto it : mChannels) {
- if (!it.second->IsPlaying()) {
+ for (auto it : m_channels)
+ {
+ if (!it.second->IsPlaying())
+ {
continue;
}
-
- if (it.second->IsMuted()) {
+
+ if (it.second->IsMuted())
+ {
it.second->SetVolume(0.0f);
continue;
}
@@ -497,12 +547,12 @@ void ALSound::FrameMove(float delta)
SoundOper &oper = it.second->GetEnvelope();
oper.currentTime += delta;
progress = oper.currentTime / oper.totalTime;
- progress = MIN(progress, 1.0f);
-
+ progress = std::min(progress, 1.0f);
+
// setting volume
volume = progress * (oper.finalAmplitude - it.second->GetStartAmplitude());
volume = volume + it.second->GetStartAmplitude();
- it.second->SetVolume(powf(volume * it.second->GetVolumeAtrib(), 0.2f) * mAudioVolume);
+ it.second->SetVolume(powf(volume * it.second->GetVolumeAtrib(), 0.2f) * m_audioVolume);
// setting frequency
frequency = progress;
@@ -512,14 +562,19 @@ void ALSound::FrameMove(float delta)
frequency = (frequency * it.second->GetInitFrequency());
it.second->SetFrequency(frequency);
- if (oper.totalTime <= oper.currentTime) {
- if (oper.nextOper == SOPER_LOOP) {
+ if (oper.totalTime <= oper.currentTime)
+ {
+ if (oper.nextOper == SOPER_LOOP)
+ {
oper.currentTime = 0.0f;
it.second->Play();
- } else {
+ }
+ else
+ {
it.second->SetStartAmplitude(oper.finalAmplitude);
it.second->SetStartFrequency(oper.finalFrequency);
- if (oper.nextOper == SOPER_STOP) {
+ if (oper.nextOper == SOPER_STOP)
+ {
it.second->Stop();
}
@@ -532,26 +587,32 @@ void ALSound::FrameMove(float delta)
void ALSound::SetListener(Math::Vector eye, Math::Vector lookat)
{
- mEye = eye;
- mLookat = lookat;
- if (m3D) {
- float orientation[] = {lookat.x, lookat.y, lookat.z, 0.f, 1.f, 0.f};
- alListener3f(AL_POSITION, eye.x, eye.y, eye.z);
+ m_eye = eye;
+ m_lookat = lookat;
+ if (m_3D)
+ {
+ float orientation[] = {lookat.x, lookat.y, lookat.z, 0.f, 1.f, 0.f};
+ alListener3f(AL_POSITION, eye.x, eye.y, eye.z);
alListenerfv(AL_ORIENTATION, orientation);
- } else {
- float orientation[] = {0.0f, 0.0f, 0.0f, 0.f, 1.f, 0.f};
- alListener3f(AL_POSITION, 0.0f, 0.0f, 0.0f);
+ }
+ else
+ {
+ float orientation[] = {0.0f, 0.0f, 0.0f, 0.f, 1.f, 0.f};
+ alListener3f(AL_POSITION, 0.0f, 0.0f, 0.0f);
alListenerfv(AL_ORIENTATION, orientation);
-
+
// recalculate sound position
- for (auto it : mChannels) {
- if (it.second->IsPlaying()) {
+ for (auto it : m_channels)
+ {
+ if (it.second->IsPlaying())
+ {
Math::Vector pos = it.second->GetPosition();
ComputeVolumePan2D(it.first, pos);
-
- if (!it.second->HasEnvelope()) {
+
+ if (!it.second->HasEnvelope())
+ {
float volume = it.second->GetStartAmplitude();
- it.second->SetVolume(powf(volume * it.second->GetVolumeAtrib(), 0.2f) * mAudioVolume);
+ it.second->SetVolume(powf(volume * it.second->GetVolumeAtrib(), 0.2f) * m_audioVolume);
}
}
}
@@ -567,7 +628,8 @@ bool ALSound::PlayMusic(int rank, bool bRepeat)
bool ALSound::PlayMusic(std::string filename, bool bRepeat)
{
- if (!mEnabled) {
+ if (!m_enabled)
+ {
return false;
}
@@ -575,111 +637,135 @@ bool ALSound::PlayMusic(std::string filename, bool bRepeat)
file << m_soundPath << "/" << filename;
// check if we have music in cache
- if (mMusic.find(filename) == mMusic.end()) {
+ if (m_music.find(filename) == m_music.end())
+ {
GetLogger()->Warn("Music %s was not cached!\n", filename.c_str());
- if (!boost::filesystem::exists(file.str())) {
+ if (!boost::filesystem::exists(file.str()))
+ {
GetLogger()->Warn("Requested music %s was not found.\n", filename.c_str());
return false;
}
Buffer *buffer = new Buffer();
buffer->LoadFromFile(file.str(), static_cast<Sound>(-1));
- mCurrentMusic->SetBuffer(buffer);
- } else {
- GetLogger()->Debug("Music loaded from cache\n");
- mCurrentMusic->SetBuffer(mMusic[filename]);
- }
-
- mCurrentMusic->SetVolume(mMusicVolume);
- mCurrentMusic->SetLoop(bRepeat);
- mCurrentMusic->Play();
-
+ m_currentMusic->SetBuffer(buffer);
+ }
+ else
+ {
+ GetLogger()->Debug("Music loaded from cache\n");
+ m_currentMusic->SetBuffer(m_music[filename]);
+ }
+
+ m_currentMusic->SetVolume(m_musicVolume);
+ m_currentMusic->SetLoop(bRepeat);
+ m_currentMusic->Play();
+
return true;
}
bool ALSound::RestartMusic()
{
- if (!mEnabled || !mCurrentMusic) {
+ if (!m_enabled || !m_currentMusic)
+ {
return false;
}
- mCurrentMusic->Stop();
- mCurrentMusic->Play();
+ m_currentMusic->Stop();
+ m_currentMusic->Play();
return true;
}
void ALSound::StopMusic()
{
- if (!mEnabled || !mCurrentMusic) {
+ if (!m_enabled || !m_currentMusic)
+ {
return;
}
-
+
SuspendMusic();
}
bool ALSound::IsPlayingMusic()
{
- if (!mEnabled || !mCurrentMusic) {
+ if (!m_enabled || !m_currentMusic)
+ {
return false;
}
-
- return mCurrentMusic->IsPlaying();
+
+ return m_currentMusic->IsPlaying();
}
void ALSound::SuspendMusic()
{
- if (!mEnabled || !mCurrentMusic) {
+ if (!m_enabled || !m_currentMusic)
+ {
return;
}
-
- mCurrentMusic->Stop();
+
+ m_currentMusic->Stop();
}
void ALSound::ComputeVolumePan2D(int channel, Math::Vector &pos)
{
float dist, a, g;
- mChannels[channel]->SetPosition(pos);
+ m_channels[channel]->SetPosition(pos);
- if (VectorsEqual(pos, mEye)) {
- mChannels[channel]->SetVolumeAtrib(1.0f); // maximum volume
- mChannels[channel]->SetPan(Math::Vector()); // at the center
+ if (VectorsEqual(pos, m_eye))
+ {
+ m_channels[channel]->SetVolumeAtrib(1.0f); // maximum volume
+ m_channels[channel]->SetPan(Math::Vector()); // at the center
return;
}
- dist = Distance(pos, mEye);
- if ( dist >= 110.0f ) { // very far?
- mChannels[channel]->SetVolumeAtrib(0.0f); // silence
- mChannels[channel]->SetPan(Math::Vector()); // at the center
+ dist = Distance(pos, m_eye);
+ if ( dist >= 110.0f ) // very far?
+ {
+ m_channels[channel]->SetVolumeAtrib(0.0f); // silence
+ m_channels[channel]->SetPan(Math::Vector()); // at the center
return;
- } else if ( dist <= 10.0f ) { // very close?
- mChannels[channel]->SetVolumeAtrib(1.0f); // maximum volume
- mChannels[channel]->SetPan(Math::Vector()); // at the center
+ }
+ else if ( dist <= 10.0f ) // very close?
+ {
+ m_channels[channel]->SetVolumeAtrib(1.0f); // maximum volume
+ m_channels[channel]->SetPan(Math::Vector()); // at the center
return;
}
- mChannels[channel]->SetVolumeAtrib(1.0f - ((dist - 10.0f) / 100.0f));
+ m_channels[channel]->SetVolumeAtrib(1.0f - ((dist - 10.0f) / 100.0f));
- a = fmodf(Angle(mLookat, mEye), Math::PI * 2.0f);
- g = fmodf(Angle(pos, mEye), Math::PI * 2.0f);
-
- if ( a < 0.0f ) {
+ Math::Vector one = Math::Vector(1.0f, 0.0f, 0.0f);
+ float angle_a = Angle(Math::Vector(m_lookat.x - m_eye.x, m_lookat.z - m_eye.z, 0.0f), one);
+ float angle_g = Angle(Math::Vector(pos.x - m_eye.x, pos.z - m_eye.z, 0.0f), one);
+
+ a = fmodf(angle_a, Math::PI * 2.0f);
+ g = fmodf(angle_g, Math::PI * 2.0f);
+
+ if ( a < 0.0f )
+ {
a += Math::PI * 2.0f;
}
- if ( g < 0.0f ) {
+ if ( g < 0.0f )
+ {
g += Math::PI * 2.0f;
}
-
- if ( a < g ) {
- if (a + Math::PI * 2.0f - g < g - a ) {
+
+ if ( a < g )
+ {
+ if (a + Math::PI * 2.0f - g < g - a )
+ {
a += Math::PI * 2.0f;
}
- } else {
- if ( g + Math::PI * 2.0f - a < a - g ) {
+ }
+ else
+ {
+ if ( g + Math::PI * 2.0f - a < a - g )
+ {
g += Math::PI * 2.0f;
}
}
-
- mChannels[channel]->SetPan( Math::Vector(sinf(g - a), 0.0f, 0.0f) );
+
+ m_channels[channel]->SetPan( Math::Vector(0.0f, 0.0f, sinf(g - a)) );
}
+
diff --git a/src/sound/oalsound/alsound.h b/src/sound/oalsound/alsound.h
index b8afd4d..ad32204 100644
--- a/src/sound/oalsound/alsound.h
+++ b/src/sound/oalsound/alsound.h
@@ -15,86 +15,90 @@
// * You should have received a copy of the GNU General Public License
// * along with this program. If not, see http://www.gnu.org/licenses/.
-// alsound.h
+/**
+ * \file alsound.h
+ * \brief OpenAL implementation of sound system
+ */
#pragma once
+#include "common/logger.h"
+#include "sound/sound.h"
+
+#include "sound/oalsound/buffer.h"
+#include "sound/oalsound/channel.h"
+#include "sound/oalsound/check.h"
+
#include <map>
#include <string>
#include <AL/al.h>
-#include "common/logger.h"
-#include "sound/sound.h"
-
-#include "buffer.h"
-#include "channel.h"
-#include "check.h"
-
class ALSound : public CSoundInterface
{
- public:
- ALSound();
- ~ALSound();
-
- bool Create(bool b3D);
- bool Cache(Sound, std::string);
- bool CacheMusic(std::string);
-
- bool GetEnable();
-
- void SetSound3D(bool bMode);
- bool GetSound3D();
- bool GetSound3DCap();
-
- void SetAudioVolume(int volume);
- int GetAudioVolume();
- void SetMusicVolume(int volume);
- int GetMusicVolume();
-
- void SetListener(Math::Vector eye, Math::Vector lookat);
- void FrameMove(float rTime);
-
- int Play(Sound sound, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false);
- int Play(Sound sound, Math::Vector pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false);
- bool FlushEnvelope(int channel);
- bool AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper);
- bool Position(int channel, Math::Vector pos);
- bool Frequency(int channel, float frequency);
- bool Stop(int channel);
- bool StopAll();
- bool MuteAll(bool bMute);
-
- bool PlayMusic(int rank, bool bRepeat);
- bool PlayMusic(std::string filename, bool bRepeat);
- bool RestartMusic();
- void SuspendMusic();
- void StopMusic();
- bool IsPlayingMusic();
-
- // plugin interface
- std::string PluginName();
- int PluginVersion();
- void InstallPlugin();
- bool UninstallPlugin(std::string &);
-
- private:
- void CleanUp();
- int GetPriority(Sound);
- bool SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded);
- void ComputeVolumePan2D(int channel, Math::Vector &pos);
-
- bool mEnabled;
- bool m3D;
- float mAudioVolume;
- float mMusicVolume;
- ALCdevice* mDevice;
- ALCcontext* mContext;
- std::map<Sound, Buffer*> mSounds;
- std::map<std::string, Buffer*> mMusic;
- std::map<int, Channel*> mChannels;
- Channel *mCurrentMusic;
- Math::Vector mEye;
- Math::Vector mLookat;
+public:
+ ALSound();
+ ~ALSound();
+
+ bool Create(bool b3D);
+ bool Cache(Sound, std::string);
+ bool CacheMusic(std::string);
+
+ bool GetEnable();
+
+ void SetSound3D(bool bMode);
+ bool GetSound3D();
+ bool GetSound3DCap();
+
+ void SetAudioVolume(int volume);
+ int GetAudioVolume();
+ void SetMusicVolume(int volume);
+ int GetMusicVolume();
+
+ void SetListener(Math::Vector eye, Math::Vector lookat);
+ void FrameMove(float rTime);
+
+ int Play(Sound sound, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false);
+ int Play(Sound sound, Math::Vector pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false);
+ bool FlushEnvelope(int channel);
+ bool AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper);
+ bool Position(int channel, Math::Vector pos);
+ bool Frequency(int channel, float frequency);
+ bool Stop(int channel);
+ bool StopAll();
+ bool MuteAll(bool bMute);
+
+ bool PlayMusic(int rank, bool bRepeat);
+ bool PlayMusic(std::string filename, bool bRepeat);
+ bool RestartMusic();
+ void SuspendMusic();
+ void StopMusic();
+ bool IsPlayingMusic();
+
+ // plugin interface
+ std::string PluginName();
+ int PluginVersion();
+ void InstallPlugin();
+ bool UninstallPlugin(std::string &);
+
+private:
+ void CleanUp();
+ int GetPriority(Sound);
+ bool SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded);
+ void ComputeVolumePan2D(int channel, Math::Vector &pos);
+
+ bool m_enabled;
+ bool m_3D;
+ float m_audioVolume;
+ float m_musicVolume;
+ ALCdevice* m_device;
+ ALCcontext* m_context;
+ std::map<Sound, Buffer*> m_sounds;
+ std::map<std::string, Buffer*> m_music;
+ std::map<int, Channel*> m_channels;
+ Channel *m_currentMusic;
+ Math::Vector m_eye;
+ Math::Vector m_lookat;
};
+
diff --git a/src/sound/oalsound/buffer.cpp b/src/sound/oalsound/buffer.cpp
index edc3d74..0047f91 100644
--- a/src/sound/oalsound/buffer.cpp
+++ b/src/sound/oalsound/buffer.cpp
@@ -15,28 +15,35 @@
// * along with this program. If not, see http://www.gnu.org/licenses/.
-#include "buffer.h"
+#include "sound/oalsound/buffer.h"
-Buffer::Buffer() {
- mLoaded = false;
- mDuration = 0.0f;
+#include <cstring>
+
+Buffer::Buffer()
+{
+ m_loaded = false;
+ m_duration = 0.0f;
}
-Buffer::~Buffer() {
- if (mLoaded) {
- alDeleteBuffers(1, &mBuffer);
+Buffer::~Buffer()
+{
+ if (m_loaded)
+ {
+ alDeleteBuffers(1, &m_buffer);
if (alCheck())
GetLogger()->Warn("Failed to unload buffer. Code %d\n", alGetCode());
}
}
-bool Buffer::LoadFromFile(std::string filename, Sound sound) {
- mSound = sound;
+bool Buffer::LoadFromFile(std::string filename, Sound sound)
+{
+ m_sound = sound;
GetLogger()->Debug("Loading audio file: %s\n", filename.c_str());
SF_INFO fileInfo;
+ memset(&fileInfo, 0, sizeof(SF_INFO));
SNDFILE *file = sf_open(filename.c_str(), SFM_READ, &fileInfo);
GetLogger()->Trace(" channels %d\n", fileInfo.channels);
@@ -45,16 +52,18 @@ bool Buffer::LoadFromFile(std::string filename, Sound sound) {
GetLogger()->Trace(" samplerate %d\n", fileInfo.samplerate);
GetLogger()->Trace(" sections %d\n", fileInfo.sections);
- if (!file) {
+ if (!file)
+ {
GetLogger()->Warn("Could not load file. Reason: %s\n", sf_strerror(file));
- mLoaded = false;
+ m_loaded = false;
return false;
}
- alGenBuffers(1, &mBuffer);
- if (!mBuffer) {
+ alGenBuffers(1, &m_buffer);
+ if (!m_buffer)
+ {
GetLogger()->Warn("Could not create audio buffer\n");
- mLoaded = false;
+ m_loaded = false;
sf_close(file);
return false;
}
@@ -64,33 +73,39 @@ bool Buffer::LoadFromFile(std::string filename, Sound sound) {
std::array<int16_t, 4096> buffer;
data.reserve(fileInfo.frames);
size_t read = 0;
- while ((read = sf_read_short(file, buffer.data(), buffer.size())) != 0) {
+ while ((read = sf_read_short(file, buffer.data(), buffer.size())) != 0)
+ {
data.insert(data.end(), buffer.begin(), buffer.begin() + read);
}
- sf_close(file);
+ sf_close(file);
- alBufferData(mBuffer, fileInfo.channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, &data.front(), data.size() * sizeof(uint16_t), fileInfo.samplerate);
- mDuration = static_cast<float>(fileInfo.frames) / fileInfo.samplerate;
- mLoaded = true;
+ alBufferData(m_buffer, fileInfo.channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, &data.front(), data.size() * sizeof(uint16_t), fileInfo.samplerate);
+ m_duration = static_cast<float>(fileInfo.frames) / fileInfo.samplerate;
+ m_loaded = true;
return true;
}
-Sound Buffer::GetSoundType() {
- return mSound;
+Sound Buffer::GetSoundType()
+{
+ return m_sound;
}
-ALuint Buffer::GetBuffer() {
- return mBuffer;
+ALuint Buffer::GetBuffer()
+{
+ return m_buffer;
}
-bool Buffer::IsLoaded() {
- return mLoaded;
+bool Buffer::IsLoaded()
+{
+ return m_loaded;
}
-float Buffer::GetDuration() {
- return mDuration;
+float Buffer::GetDuration()
+{
+ return m_duration;
}
+
diff --git a/src/sound/oalsound/buffer.h b/src/sound/oalsound/buffer.h
index 7286deb..d847426 100644
--- a/src/sound/oalsound/buffer.h
+++ b/src/sound/oalsound/buffer.h
@@ -14,10 +14,18 @@
// * You should have received a copy of the GNU General Public License
// * along with this program. If not, see http://www.gnu.org/licenses/.
-// buffer.h
+/**
+ * \file buffer.h
+ * \brief OpenAL buffer
+ */
#pragma once
+#include "sound/sound.h"
+#include "common/logger.h"
+
+#include "sound/oalsound/check.h"
+
#include <string>
#include <vector>
#include <array>
@@ -25,27 +33,23 @@
#include <AL/al.h>
#include <sndfile.h>
-#include "sound/sound.h"
-#include "common/logger.h"
-
-#include "check.h"
-
class Buffer
{
- public:
- Buffer();
- ~Buffer();
-
- bool LoadFromFile(std::string, Sound);
- bool IsLoaded();
-
- Sound GetSoundType();
- ALuint GetBuffer();
- float GetDuration();
-
- private:
- ALuint mBuffer;
- Sound mSound;
- bool mLoaded;
- float mDuration;
+public:
+ Buffer();
+ ~Buffer();
+
+ bool LoadFromFile(std::string, Sound);
+ bool IsLoaded();
+
+ Sound GetSoundType();
+ ALuint GetBuffer();
+ float GetDuration();
+
+private:
+ ALuint m_buffer;
+ Sound m_sound;
+ bool m_loaded;
+ float m_duration;
};
+
diff --git a/src/sound/oalsound/channel.cpp b/src/sound/oalsound/channel.cpp
index c5b05fa..4d89df5 100644
--- a/src/sound/oalsound/channel.cpp
+++ b/src/sound/oalsound/channel.cpp
@@ -15,37 +15,41 @@
// * along with this program. If not, see http://www.gnu.org/licenses/.
-#include "channel.h"
+#include "sound/oalsound/channel.h"
Channel::Channel()
{
- alGenSources(1, &mSource);
+ alGenSources(1, &m_source);
- if (alCheck()) {
+ if (alCheck())
+ {
GetLogger()->Warn("Failed to create sound source. Code: %d\n", alGetCode());
- mReady = false;
- } else {
- mReady = true;
+ m_ready = false;
}
-
- mPriority = 0;
- mBuffer = nullptr;
- mLoop = false;
- mMute = false;
- mInitFrequency = 0.0f;
- mStartAmplitude = 0.0f;
- mStartFrequency = 0.0f;
- mChangeFrequency = 0.0f;
- mVolume = 0.0f;
+ else
+ {
+ m_ready = true;
+ }
+
+ m_priority = 0;
+ m_buffer = nullptr;
+ m_loop = false;
+ m_mute = false;
+ m_initFrequency = 0.0f;
+ m_startAmplitude = 0.0f;
+ m_startFrequency = 0.0f;
+ m_changeFrequency = 0.0f;
+ m_volume = 0.0f;
}
Channel::~Channel()
{
- if (mReady) {
- alSourceStop(mSource);
- alSourcei(mSource, AL_BUFFER, 0);
- alDeleteSources(1, &mSource);
+ if (m_ready)
+ {
+ alSourceStop(m_source);
+ alSourcei(m_source, AL_BUFFER, 0);
+ alDeleteSources(1, &m_source);
if (alCheck())
GetLogger()->Warn("Failed to delete sound source. Code: %d\n", alGetCode());
}
@@ -54,15 +58,17 @@ Channel::~Channel()
bool Channel::Play()
{
- if (!mReady || mBuffer == nullptr) {
+ if (!m_ready || m_buffer == nullptr)
+ {
return false;
}
- alSourcei(mSource, AL_LOOPING, static_cast<ALint>(mLoop));
- alSourcei(mSource, AL_REFERENCE_DISTANCE, 10.0f);
- alSourcei(mSource, AL_MAX_DISTANCE, 110.0f);
- alSourcePlay(mSource);
- if (alCheck()) {
+ alSourcei(m_source, AL_LOOPING, static_cast<ALint>(m_loop));
+ alSourcei(m_source, AL_REFERENCE_DISTANCE, 10.0f);
+ alSourcei(m_source, AL_MAX_DISTANCE, 110.0f);
+ alSourcePlay(m_source);
+ if (alCheck())
+ {
GetLogger()->Warn("Could not play audio sound source. Code: %d\n", alGetCode());
}
return true;
@@ -71,12 +77,14 @@ bool Channel::Play()
bool Channel::SetPan(Math::Vector pos)
{
- if (!mReady || mBuffer == nullptr) {
+ if (!m_ready || m_buffer == nullptr)
+ {
return false;
}
-
- alSource3f(mSource, AL_POSITION, pos.x, pos.y, pos.z);
- if (alCheck()) {
+
+ alSource3f(m_source, AL_POSITION, pos.x, pos.y, pos.z);
+ if (alCheck())
+ {
GetLogger()->Warn("Could not set sound position. Code: %d\n", alGetCode());
return false;
}
@@ -86,24 +94,26 @@ bool Channel::SetPan(Math::Vector pos)
void Channel::SetPosition(Math::Vector pos)
{
- mPosition = pos;
+ m_position = pos;
}
Math::Vector Channel::GetPosition()
{
- return mPosition;
+ return m_position;
}
bool Channel::SetFrequency(float freq)
{
- if (!mReady || mBuffer == nullptr) {
+ if (!m_ready || m_buffer == nullptr)
+ {
return false;
}
- alSourcef(mSource, AL_PITCH, freq);
- if (alCheck()) {
+ alSourcef(m_source, AL_PITCH, freq);
+ if (alCheck())
+ {
GetLogger()->Warn("Could not set sound pitch to '%f'. Code: %d\n", freq, alGetCode());
return false;
}
@@ -114,12 +124,14 @@ bool Channel::SetFrequency(float freq)
float Channel::GetFrequency()
{
ALfloat freq;
- if (!mReady || mBuffer == nullptr) {
+ if (!m_ready || m_buffer == nullptr)
+ {
return 0;
}
-
- alGetSourcef(mSource, AL_PITCH, &freq);
- if (alCheck()) {
+
+ alGetSourcef(m_source, AL_PITCH, &freq);
+ if (alCheck())
+ {
GetLogger()->Warn("Could not get sound pitch. Code: %d\n", alGetCode());
return 0;
}
@@ -130,12 +142,14 @@ float Channel::GetFrequency()
bool Channel::SetVolume(float vol)
{
- if (!mReady || vol < 0 || mBuffer == nullptr) {
+ if (!m_ready || vol < 0 || m_buffer == nullptr)
+ {
return false;
}
-
- alSourcef(mSource, AL_GAIN, vol);
- if (alCheck()) {
+
+ alSourcef(m_source, AL_GAIN, vol);
+ if (alCheck())
+ {
GetLogger()->Warn("Could not set sound volume to '%f'. Code: %d\n", vol, alGetCode());
return false;
}
@@ -146,12 +160,14 @@ bool Channel::SetVolume(float vol)
float Channel::GetVolume()
{
ALfloat vol;
- if (!mReady || mBuffer == nullptr) {
+ if (!m_ready || m_buffer == nullptr)
+ {
return 0;
}
-
- alGetSourcef(mSource, AL_GAIN, &vol);
- if (alCheck()) {
+
+ alGetSourcef(m_source, AL_GAIN, &vol);
+ if (alCheck())
+ {
GetLogger()->Warn("Could not get sound volume. Code: %d\n", alGetCode());
return 0;
}
@@ -162,134 +178,144 @@ float Channel::GetVolume()
void Channel::SetVolumeAtrib(float volume)
{
- mVolume = volume;
+ m_volume = volume;
}
float Channel::GetVolumeAtrib()
{
- return mVolume;
+ return m_volume;
}
int Channel::GetPriority()
{
- return mPriority;
+ return m_priority;
}
void Channel::SetPriority(int pri)
{
- mPriority = pri;
+ m_priority = pri;
}
void Channel::SetStartAmplitude(float gain)
{
- mStartAmplitude = gain;
+ m_startAmplitude = gain;
}
void Channel::SetStartFrequency(float freq)
{
- mStartFrequency = freq;
+ m_startFrequency = freq;
}
void Channel::SetChangeFrequency(float freq)
{
- mChangeFrequency = freq;
+ m_changeFrequency = freq;
}
float Channel::GetStartAmplitude()
{
- return mStartAmplitude;
+ return m_startAmplitude;
}
float Channel::GetStartFrequency()
{
- return mStartFrequency;
+ return m_startFrequency;
}
float Channel::GetChangeFrequency()
{
- return mChangeFrequency;
+ return m_changeFrequency;
}
float Channel::GetInitFrequency()
{
- return mInitFrequency;
+ return m_initFrequency;
}
void Channel::AddOper(SoundOper oper)
{
- mOper.push_back(oper);
+ m_oper.push_back(oper);
}
void Channel::ResetOper()
{
- mOper.clear();
+ m_oper.clear();
}
-Sound Channel::GetSoundType() {
- if (!mReady || mBuffer == nullptr) {
+Sound Channel::GetSoundType()
+{
+ if (!m_ready || m_buffer == nullptr)
+ {
return SOUND_NONE;
}
-
- return mBuffer->GetSoundType();
+
+ return m_buffer->GetSoundType();
}
-bool Channel::SetBuffer(Buffer *buffer) {
- if (!mReady)
+bool Channel::SetBuffer(Buffer *buffer)
+{
+ if (!m_ready)
return false;
- Stop();
- mBuffer = buffer;
- if (buffer == nullptr) {
- alSourcei(mSource, AL_BUFFER, 0);
+ Stop();
+ m_buffer = buffer;
+ if (buffer == nullptr)
+ {
+ alSourcei(m_source, AL_BUFFER, 0);
return true;
- }
-
- alSourcei(mSource, AL_BUFFER, buffer->GetBuffer());
- if (alCheck()) {
+ }
+
+ alSourcei(m_source, AL_BUFFER, buffer->GetBuffer());
+ if (alCheck())
+ {
GetLogger()->Warn("Could not set sound buffer. Code: %d\n", alGetCode());
return false;
}
- mInitFrequency = GetFrequency();
+ m_initFrequency = GetFrequency();
return true;
}
-bool Channel::FreeBuffer() {
- if (!mReady || !mBuffer) {
+bool Channel::FreeBuffer()
+{
+ if (!m_ready || !m_buffer)
+ {
return false;
}
- alSourceStop(mSource);
- alSourcei(mSource, AL_BUFFER, 0);
- delete mBuffer;
- mBuffer = nullptr;
+ alSourceStop(m_source);
+ alSourcei(m_source, AL_BUFFER, 0);
+ delete m_buffer;
+ m_buffer = nullptr;
return true;
}
-bool Channel::IsPlaying() {
+bool Channel::IsPlaying()
+{
ALint status;
- if (!mReady || mBuffer == nullptr) {
+ if (!m_ready || m_buffer == nullptr)
+ {
return false;
}
-
- alGetSourcei(mSource, AL_SOURCE_STATE, &status);
- if (alCheck()) {
+
+ alGetSourcei(m_source, AL_SOURCE_STATE, &status);
+ if (alCheck())
+ {
GetLogger()->Warn("Could not get sound status. Code: %d\n", alGetCode());
return false;
}
@@ -298,22 +324,27 @@ bool Channel::IsPlaying() {
}
-bool Channel::IsReady() {
- return mReady;
+bool Channel::IsReady()
+{
+ return m_ready;
}
-bool Channel::IsLoaded() {
- return mBuffer != nullptr;
+bool Channel::IsLoaded()
+{
+ return m_buffer != nullptr;
}
-bool Channel::Stop() {
- if (!mReady || mBuffer == nullptr) {
+bool Channel::Stop()
+{
+ if (!m_ready || m_buffer == nullptr)
+ {
return false;
}
-
- alSourceStop(mSource);
- if (alCheck()) {
+
+ alSourceStop(m_source);
+ if (alCheck())
+ {
GetLogger()->Warn("Could not stop sound. Code: %d\n", alGetCode());
return false;
}
@@ -323,13 +354,15 @@ bool Channel::Stop() {
float Channel::GetCurrentTime()
{
- if (!mReady || mBuffer == nullptr) {
+ if (!m_ready || m_buffer == nullptr)
+ {
return 0.0f;
}
-
+
ALfloat current;
- alGetSourcef(mSource, AL_SEC_OFFSET, &current);
- if (alCheck()) {
+ alGetSourcef(m_source, AL_SEC_OFFSET, &current);
+ if (alCheck())
+ {
GetLogger()->Warn("Could not get source current play time. Code: %d\n", alGetCode());
return 0.0f;
}
@@ -339,12 +372,14 @@ float Channel::GetCurrentTime()
void Channel::SetCurrentTime(float current)
{
- if (!mReady || mBuffer == nullptr) {
+ if (!m_ready || m_buffer == nullptr)
+ {
return;
}
-
- alSourcef(mSource, AL_SEC_OFFSET, current);
- if (alCheck()) {
+
+ alSourcef(m_source, AL_SEC_OFFSET, current);
+ if (alCheck())
+ {
GetLogger()->Warn("Could not get source current play time. Code: %d\n", alGetCode());
}
}
@@ -352,44 +387,47 @@ void Channel::SetCurrentTime(float current)
float Channel::GetDuration()
{
- if (!mReady || mBuffer == nullptr) {
+ if (!m_ready || m_buffer == nullptr)
+ {
return 0.0f;
}
-
- return mBuffer->GetDuration();
+
+ return m_buffer->GetDuration();
}
bool Channel::HasEnvelope()
{
- return mOper.size() > 0;
+ return m_oper.size() > 0;
}
SoundOper& Channel::GetEnvelope()
{
- return mOper.front();
+ return m_oper.front();
}
void Channel::PopEnvelope()
{
- mOper.pop_front();
+ m_oper.pop_front();
}
-void Channel::SetLoop(bool loop) {
- mLoop = loop;
+void Channel::SetLoop(bool loop)
+{
+ m_loop = loop;
}
void Channel::Mute(bool mute)
{
- mMute = mute;
+ m_mute = mute;
}
bool Channel::IsMuted()
{
- return mMute;
+ return m_mute;
}
+
diff --git a/src/sound/oalsound/channel.h b/src/sound/oalsound/channel.h
index 6717f03..a04b509 100644
--- a/src/sound/oalsound/channel.h
+++ b/src/sound/oalsound/channel.h
@@ -14,10 +14,18 @@
// * You should have received a copy of the GNU General Public License
// * along with this program. If not, see http://www.gnu.org/licenses/.
-// channel.h
+/**
+ * \file channel.h
+ * \brief OpenAL channel
+ */
#pragma once
+#include "sound/sound.h"
+
+#include "sound/oalsound/buffer.h"
+#include "sound/oalsound/check.h"
+
#include <string>
#include <deque>
#include <cassert>
@@ -25,11 +33,6 @@
#include <AL/al.h>
#include <AL/alc.h>
-#include "sound/sound.h"
-
-#include "buffer.h"
-#include "check.h"
-
struct SoundOper
{
float finalAmplitude;
@@ -42,72 +45,73 @@ struct SoundOper
class Channel
{
- public:
- Channel();
- ~Channel();
-
- bool Play();
- bool Stop();
-
- bool SetPan(Math::Vector);
- void SetPosition(Math::Vector);
- Math::Vector GetPosition();
-
- bool SetFrequency(float);
- float GetFrequency();
-
- float GetCurrentTime();
- void SetCurrentTime(float);
- float GetDuration();
-
- bool SetVolume(float);
- float GetVolume();
- void SetVolumeAtrib(float);
- float GetVolumeAtrib();
-
- bool IsPlaying();
- bool IsReady();
- bool IsLoaded();
-
- bool SetBuffer(Buffer *);
- bool FreeBuffer();
-
- bool HasEnvelope();
- SoundOper& GetEnvelope();
- void PopEnvelope();
-
- int GetPriority();
- void SetPriority(int);
-
- void SetStartAmplitude(float);
- void SetStartFrequency(float);
- void SetChangeFrequency(float);
-
- float GetStartAmplitude();
- float GetStartFrequency();
- float GetChangeFrequency();
- float GetInitFrequency();
-
- void AddOper(SoundOper);
- void ResetOper();
- Sound GetSoundType();
- void SetLoop(bool);
- void Mute(bool);
- bool IsMuted();
-
- private:
- Buffer *mBuffer;
- ALuint mSource;
-
- int mPriority;
- float mStartAmplitude;
- float mStartFrequency;
- float mChangeFrequency;
- float mInitFrequency;
- float mVolume;
- std::deque<SoundOper> mOper;
- bool mReady;
- bool mLoop;
- bool mMute;
- Math::Vector mPosition;
+public:
+ Channel();
+ ~Channel();
+
+ bool Play();
+ bool Stop();
+
+ bool SetPan(Math::Vector);
+ void SetPosition(Math::Vector);
+ Math::Vector GetPosition();
+
+ bool SetFrequency(float);
+ float GetFrequency();
+
+ float GetCurrentTime();
+ void SetCurrentTime(float);
+ float GetDuration();
+
+ bool SetVolume(float);
+ float GetVolume();
+ void SetVolumeAtrib(float);
+ float GetVolumeAtrib();
+
+ bool IsPlaying();
+ bool IsReady();
+ bool IsLoaded();
+
+ bool SetBuffer(Buffer *);
+ bool FreeBuffer();
+
+ bool HasEnvelope();
+ SoundOper& GetEnvelope();
+ void PopEnvelope();
+
+ int GetPriority();
+ void SetPriority(int);
+
+ void SetStartAmplitude(float);
+ void SetStartFrequency(float);
+ void SetChangeFrequency(float);
+
+ float GetStartAmplitude();
+ float GetStartFrequency();
+ float GetChangeFrequency();
+ float GetInitFrequency();
+
+ void AddOper(SoundOper);
+ void ResetOper();
+ Sound GetSoundType();
+ void SetLoop(bool);
+ void Mute(bool);
+ bool IsMuted();
+
+private:
+ Buffer *m_buffer;
+ ALuint m_source;
+
+ int m_priority;
+ float m_startAmplitude;
+ float m_startFrequency;
+ float m_changeFrequency;
+ float m_initFrequency;
+ float m_volume;
+ std::deque<SoundOper> m_oper;
+ bool m_ready;
+ bool m_loop;
+ bool m_mute;
+ Math::Vector m_position;
};
+
diff --git a/src/sound/oalsound/check.h b/src/sound/oalsound/check.h
index cf3e468..f677e17 100644
--- a/src/sound/oalsound/check.h
+++ b/src/sound/oalsound/check.h
@@ -37,3 +37,4 @@ inline ALenum alGetCode()
CODE = AL_NO_ERROR;
return ret;
}
+
diff --git a/src/sound/sound.cpp b/src/sound/sound.cpp
new file mode 100644
index 0000000..d392612
--- /dev/null
+++ b/src/sound/sound.cpp
@@ -0,0 +1,191 @@
+// * This file is part of the COLOBOT source code
+// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
+// * Copyright (C) 2012-2013, Polish Portal of Colobot (PPC)
+// *
+// * 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 3 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, see http://www.gnu.org/licenses/.
+
+#include "sound/sound.h"
+
+#include "math/vector.h"
+
+#include "common/logger.h"
+
+#include <iostream>
+#include <iomanip>
+#include <sstream>
+
+#include <boost/filesystem.hpp>
+
+
+CSoundInterface::CSoundInterface()
+{
+}
+
+CSoundInterface::~CSoundInterface()
+{
+}
+
+bool CSoundInterface::Create(bool b3D)
+{
+ return true;
+}
+
+void CSoundInterface::CacheAll(std::string path)
+{
+ for ( int i = 1; i < SOUND_MAX; i++ )
+ {
+ std::stringstream filename;
+ filename << path << "/sound" << std::setfill('0') << std::setw(3) << i << ".wav";
+ if ( !Cache(static_cast<Sound>(i), filename.str()) )
+ GetLogger()->Warn("Unable to load audio: %s\n", filename.str().c_str());
+ }
+}
+
+void CSoundInterface::AddMusicFiles(std::string path)
+{
+ m_soundPath = path;
+ CacheMusic("Intro1.ogg");
+ CacheMusic("Intro2.ogg");
+ CacheMusic("music010.ogg");
+ CacheMusic("music011.ogg");
+}
+
+bool CSoundInterface::Cache(Sound bSound, std::string bFile)
+{
+ return true;
+}
+
+bool CSoundInterface::CacheMusic(std::string bFile)
+{
+ return true;
+}
+
+bool CSoundInterface::GetEnable()
+{
+ return true;
+}
+
+void CSoundInterface::SetSound3D(bool bMode)
+{
+}
+
+bool CSoundInterface::GetSound3D()
+{
+ return true;
+}
+
+bool CSoundInterface::GetSound3DCap()
+{
+ return true;
+}
+
+void CSoundInterface::SetAudioVolume(int volume)
+{
+}
+
+int CSoundInterface::GetAudioVolume()
+{
+ return 0;
+}
+
+void CSoundInterface::SetMusicVolume(int volume)
+{
+}
+
+int CSoundInterface::GetMusicVolume()
+{
+ return 0;
+}
+
+void CSoundInterface::SetListener(Math::Vector eye, Math::Vector lookat)
+{
+}
+
+void CSoundInterface::FrameMove(float rTime)
+{
+}
+
+int CSoundInterface::Play(Sound sound, float amplitude, float frequency, bool bLoop)
+{
+ return 0;
+}
+
+int CSoundInterface::Play(Sound sound, Math::Vector pos, float amplitude, float frequency, bool bLoop)
+{
+ return 0;
+}
+
+bool CSoundInterface::FlushEnvelope(int channel)
+{
+ return true;
+}
+
+bool CSoundInterface::AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper)
+{
+ return true;
+}
+
+bool CSoundInterface::Position(int channel, Math::Vector pos)
+{
+ return true;
+}
+
+bool CSoundInterface::Frequency(int channel, float frequency)
+{
+ return true;
+}
+
+bool CSoundInterface::Stop(int channel)
+{
+ return true;
+}
+
+bool CSoundInterface::StopAll()
+{
+ return true;
+}
+
+bool CSoundInterface::MuteAll(bool bMute)
+{
+ return true;
+}
+
+bool CSoundInterface::PlayMusic(int rank, bool bRepeat)
+{
+ return true;
+}
+
+bool CSoundInterface::PlayMusic(std::string filename, bool bRepeat)
+{
+ return true;
+}
+
+bool CSoundInterface::RestartMusic()
+{
+ return true;
+}
+
+void CSoundInterface::SuspendMusic()
+{
+}
+
+void CSoundInterface::StopMusic()
+{
+}
+
+bool CSoundInterface::IsPlayingMusic()
+{
+ return true;
+}
+
diff --git a/src/sound/sound.h b/src/sound/sound.h
index a2302c4..9ccc1b6 100644
--- a/src/sound/sound.h
+++ b/src/sound/sound.h
@@ -22,23 +22,16 @@
#pragma once
-#include <boost/filesystem.hpp>
-
#include "math/vector.h"
#include "common/logger.h"
#include <string>
-#include <iostream>
-#include <iomanip>
-#include <sstream>
-#include <map>
-
/*!
* Maximum possible audio volume
*/
-#define MAXVOLUME 100.0f
+const float MAXVOLUME = 100.0f;
/**
@@ -48,7 +41,7 @@
**/
enum Sound
{
- SOUND_NONE = -1,
+ SOUND_NONE = -1,
SOUND_CLICK = 0,
SOUND_BOUM = 1,
SOUND_EXPLO = 2,
@@ -130,7 +123,8 @@ enum Sound
SOUND_FIREp = 78, /*!< shooting with phazer */
SOUND_EXPLOg1 = 79, /*!< impact gun 1 */
SOUND_EXPLOg2 = 80, /*!< impact gun 2 */
- SOUND_MOTORd = 81, /*!< engine friction */
+// SOUND_MOTORd = 81, /*!< engine friction */
+ SOUND_MAX /** number of items in enum */
};
@@ -154,99 +148,88 @@ enum SoundNext
*/
class CSoundInterface
{
- public:
- inline CSoundInterface() {}
- inline virtual ~CSoundInterface() {}
+public:
+ CSoundInterface();
+ virtual ~CSoundInterface();
/** Function to initialize sound device
* \param b3D - enable support for 3D sound
*/
- inline virtual bool Create(bool b3D) { return true; };
+ virtual bool Create(bool b3D);
/** Function called to cache all sound effect files.
* Function calls \link CSoundInterface::Cache() \endlink for each file
*/
- inline void CacheAll(std::string path) {
- for ( int i = 1; i <= 81; i++ ) {
- std::stringstream filename;
- filename << path << "/sound" << std::setfill('0') << std::setw(3) << i << ".wav";
- if ( !Cache(static_cast<Sound>(i), filename.str()) )
- GetLogger()->Warn("Unable to load audio: %s\n", filename.str().c_str());
- }
- };
+ void CacheAll(std::string path);
/** Function called to add all music files to list */
- inline void AddMusicFiles(std::string path) {
- m_soundPath = path;
- CacheMusic("music010.ogg");
- CacheMusic("music011.ogg");
- };
-
+ void AddMusicFiles(std::string path);
+
/** Function called to cache sound effect file.
* This function is called by plugin interface for each file.
* \param bSound - id of a file, will be used to identify sound files
* \param bFile - file to load
* \return return true on success
*/
- inline virtual bool Cache(Sound bSound, std::string bFile) { return true; };
+ virtual bool Cache(Sound bSound, std::string bFile);
/** Function called to cache music file.
* This function is called by CRobotMain for each file used in the mission.
* \param bFile - file to load
* \return return true on success
*/
- inline virtual bool CacheMusic(std::string bFile) { return true; };
+ virtual bool CacheMusic(std::string bFile);
/** Return if plugin is enabled
* \return return true if plugin is enabled
*/
- inline virtual bool GetEnable() {return true;};
+ virtual bool GetEnable();
/** Change sound mode to 2D/3D
* \param bMode - true to enable 3D sound
*/
- inline virtual void SetSound3D(bool bMode) {};
+ virtual void SetSound3D(bool bMode);
/** Return if we use 3D sound
* \return true if we have 3D sound enabled
*/
- inline virtual bool GetSound3D() {return true;};
+ virtual bool GetSound3D();
/** Return if we have 3D sound capable card
* \return true for 3D sound support
*/
- inline virtual bool GetSound3DCap() {return true;};
+ virtual bool GetSound3DCap();
/** Change global sound volume
* \param volume - range from 0 to MAXVOLUME
*/
- inline virtual void SetAudioVolume(int volume) {};
+ virtual void SetAudioVolume(int volume);
/** Return global sound volume
* \return global volume as int in range from 0 to MAXVOLUME
*/
- inline virtual int GetAudioVolume() {return 0;};
+ virtual int GetAudioVolume();
/** Set music volume
* \param volume - range from 0 to MAXVOLUME
*/
- inline virtual void SetMusicVolume(int volume) {};
+ virtual void SetMusicVolume(int volume);
/** Return music volume
* \return music volume as int in range from 0 to MAXVOLUME
*/
- inline virtual int GetMusicVolume() {return 0;};
+ virtual int GetMusicVolume();
/** Set listener position
* \param eye - position of listener
* \param lookat - direction listener is looking at
*/
- inline virtual void SetListener(Math::Vector eye, Math::Vector lookat) {};
+ virtual void SetListener(Math::Vector eye, Math::Vector lookat);
/** Update data each frame
* \param rTime - time since last update
*/
- inline virtual void FrameMove(float rTime) {};
+ virtual void FrameMove(float rTime);
/** Play specific sound
* \param sound - sound to play
@@ -255,7 +238,7 @@ class CSoundInterface
* \param bLoop - loop sound
* \return identifier of channel that sound will be played on
*/
- inline virtual int Play(Sound sound, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false) {return 0;};
+ virtual int Play(Sound sound, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false);
/** Play specific sound
* \param sound - sound to play
@@ -265,13 +248,13 @@ class CSoundInterface
* \param bLoop - loop sound
* \return identifier of channel that sound will be played on
*/
- inline virtual int Play(Sound sound, Math::Vector pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false) {return 0;};
+ virtual int Play(Sound sound, Math::Vector pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false);
/** Remove all operations that would be made on sound in channel.
* \param channel - channel to work on
* \return return true on success
*/
- inline virtual bool FlushEnvelope(int channel) {return true;};
+ virtual bool FlushEnvelope(int channel);
/** Add envelope to sound. Envelope is a operatino that will be performend on sound in future like changing frequency
* \param channel - channel to work on
@@ -281,74 +264,74 @@ class CSoundInterface
* \param oper - operation to perform
* \return return true on success
*/
- inline virtual bool AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper) {return true;};
+ virtual bool AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper);
/** Set sound position in space
* \param channel - channel to work on
* \param pos - new positino of a sound
* \return return true on success
*/
- inline virtual bool Position(int channel, Math::Vector pos) {return true;};
+ virtual bool Position(int channel, Math::Vector pos);
/** Set sound frequency
* \param channel - channel to work on
* \param frequency - change sound frequency
* \return return true on success
*/
- inline virtual bool Frequency(int channel, float frequency) {return true;};
+ virtual bool Frequency(int channel, float frequency);
/** Stop playing sound
* \param channel - channel to work on
* \return return true on success
*/
- inline virtual bool Stop(int channel) {return true;};
+ virtual bool Stop(int channel);
/** Stop playing all sounds
* \return return true on success
*/
- inline virtual bool StopAll() {return true;};
+ virtual bool StopAll();
/** Mute/unmute all sounds
* \param bMute
* \return return true on success
*/
- inline virtual bool MuteAll(bool bMute) {return true;};
+ virtual bool MuteAll(bool bMute);
/** Start playing music
* \param rank - track number
* \param bRepeat - repeat playing
* \return return true on success
*/
- inline virtual bool PlayMusic(int rank, bool bRepeat) {return true;};
+ virtual bool PlayMusic(int rank, bool bRepeat);
/** Start playing music
* \param filename - name of file to play
* \param bRepeat - repeat playing
* \return return true on success
*/
- inline virtual bool PlayMusic(std::string filename, bool bRepeat) {return true;};
+ virtual bool PlayMusic(std::string filename, bool bRepeat);
/** Restart music
* @return return true on success
*/
- inline virtual bool RestartMusic() {return true;};
+ virtual bool RestartMusic();
/** Susspend paying music
* \return return true on success
*/
- inline virtual void SuspendMusic() {};
+ virtual void SuspendMusic();
/** Stop playing music
* \return return true on success
*/
- inline virtual void StopMusic() {};
+ virtual void StopMusic();
/** Check if music if playing
* \return return true if music is playing
*/
- inline virtual bool IsPlayingMusic() {return true;};
+ virtual bool IsPlayingMusic();
- protected:
- std::string m_soundPath;
+protected:
+ std::string m_soundPath;
};
diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt
index 0be2bd5..da590d8 100644
--- a/src/tools/CMakeLists.txt
+++ b/src/tools/CMakeLists.txt
@@ -12,3 +12,4 @@ include_directories(SYSTEM ${SDL_INCLUDE_DIR})
add_definitions(-DMODELFILE_NO_ENGINE)
add_executable(convert_model ${CONVERT_MODEL_SOURCES})
+
diff --git a/src/tools/README.txt b/src/tools/README.txt
index de2f087..3de9e75 100644
--- a/src/tools/README.txt
+++ b/src/tools/README.txt
@@ -2,3 +2,4 @@
* \dir tools
* \brief Various tools (separate programs)
*/
+
diff --git a/src/tools/convert_model.cpp b/src/tools/convert_model.cpp
index 463b83a..57e8789 100644
--- a/src/tools/convert_model.cpp
+++ b/src/tools/convert_model.cpp
@@ -279,3 +279,4 @@ int main(int argc, char *argv[])
return 0;
}
+
diff --git a/src/ui/README.txt b/src/ui/README.txt
index a159ed5..05f72a1 100644
--- a/src/ui/README.txt
+++ b/src/ui/README.txt
@@ -2,3 +2,4 @@
* \dir src/ui
* \brief 2D user interface controls
*/
+
diff --git a/src/ui/button.cpp b/src/ui/button.cpp
index a68b34d..348382d 100644
--- a/src/ui/button.cpp
+++ b/src/ui/button.cpp
@@ -245,3 +245,4 @@ bool CButton::GetRepeat()
}
}
+
diff --git a/src/ui/button.h b/src/ui/button.h
index a9aa020..b71ef4a 100644
--- a/src/ui/button.h
+++ b/src/ui/button.h
@@ -51,3 +51,4 @@ protected:
};
}
+
diff --git a/src/ui/check.cpp b/src/ui/check.cpp
index 761264d..362c930 100644
--- a/src/ui/check.cpp
+++ b/src/ui/check.cpp
@@ -163,3 +163,4 @@ void CCheck::Draw()
}
}
+
diff --git a/src/ui/color.cpp b/src/ui/color.cpp
index fd05bd9..623ff89 100644
--- a/src/ui/color.cpp
+++ b/src/ui/color.cpp
@@ -223,3 +223,4 @@ Gfx::Color CColor::GetColor()
}
+
diff --git a/src/ui/color.h b/src/ui/color.h
index ec2c537..fe96b87 100644
--- a/src/ui/color.h
+++ b/src/ui/color.h
@@ -54,3 +54,4 @@ protected:
};
}
+
diff --git a/src/ui/compass.cpp b/src/ui/compass.cpp
index ac97cb8..d0fe96f 100644
--- a/src/ui/compass.cpp
+++ b/src/ui/compass.cpp
@@ -171,3 +171,4 @@ float CCompass::GetDirection()
}
+
diff --git a/src/ui/compass.h b/src/ui/compass.h
index 18546e5..956631a 100644
--- a/src/ui/compass.h
+++ b/src/ui/compass.h
@@ -49,3 +49,4 @@ protected:
}
+
diff --git a/src/ui/control.cpp b/src/ui/control.cpp
index 6dc92cd..7c77c95 100644
--- a/src/ui/control.cpp
+++ b/src/ui/control.cpp
@@ -75,10 +75,13 @@ bool CControl::Create(Math::Point pos, Math::Point dim, int icon, EventType even
GetResource(RES_EVENT, m_eventType, text);
str_text = std::string(text);
auto p = str_text.find("\\");
- if ( p == std::string::npos ) {
+ if ( p == std::string::npos )
+ {
if ( icon != -1 )
m_tooltip = str_text;
- } else {
+ }
+ else
+ {
m_tooltip = str_text.substr(p + 1);
}
@@ -174,15 +177,18 @@ int CControl::GetIcon()
void CControl::SetName(std::string name, bool bTooltip)
{
- if ( bTooltip ) {
+ if ( bTooltip )
+ {
auto p = name.find("\\");
if ( p == std::string::npos )
m_name = name;
- else {
+ else
+ {
m_tooltip = name.substr(p + 1);
m_name = name.substr(0, p);
}
- } else
+ }
+ else
m_name = name;
}
@@ -832,3 +838,4 @@ bool CControl::Detect(Math::Point pos)
}
}
+
diff --git a/src/ui/control.h b/src/ui/control.h
index 7f5077d..aee7d1c 100644
--- a/src/ui/control.h
+++ b/src/ui/control.h
@@ -141,3 +141,4 @@ protected:
};
} // namespace Ui
+
diff --git a/src/ui/displayinfo.cpp b/src/ui/displayinfo.cpp
index fcc77db..3aa3d73 100644
--- a/src/ui/displayinfo.cpp
+++ b/src/ui/displayinfo.cpp
@@ -154,28 +154,28 @@ bool CDisplayInfo::EventProcess(const Event &event)
{
m_main->SetFontSize(9.0f);
slider = static_cast<Ui::CSlider*>(pw->SearchControl(EVENT_STUDIO_SIZE));
- if ( slider != 0 ) slider->SetVisibleValue((m_main->GetFontSize()-9.0f)/6.0f);
+ if ( slider != 0 ) slider->SetVisibleValue((m_main->GetFontSize()-9.0f)/12.0f);
ViewDisplayInfo();
}
if ( event.type == EVENT_HYPER_SIZE2 ) // size 2?
{
m_main->SetFontSize(10.0f);
slider = static_cast<Ui::CSlider*>(pw->SearchControl(EVENT_STUDIO_SIZE));
- if ( slider != 0 ) slider->SetVisibleValue((m_main->GetFontSize()-9.0f)/6.0f);
+ if ( slider != 0 ) slider->SetVisibleValue((m_main->GetFontSize()-9.0f)/12.0f);
ViewDisplayInfo();
}
if ( event.type == EVENT_HYPER_SIZE3 ) // size 3?
{
m_main->SetFontSize(12.0f);
slider = static_cast<Ui::CSlider*>(pw->SearchControl(EVENT_STUDIO_SIZE));
- if ( slider != 0 ) slider->SetVisibleValue((m_main->GetFontSize()-9.0f)/6.0f);
+ if ( slider != 0 ) slider->SetVisibleValue((m_main->GetFontSize()-9.0f)/12.0f);
ViewDisplayInfo();
}
if ( event.type == EVENT_HYPER_SIZE4 ) // size 4?
{
m_main->SetFontSize(15.0f);
slider = static_cast<Ui::CSlider*>(pw->SearchControl(EVENT_STUDIO_SIZE));
- if ( slider != 0 ) slider->SetVisibleValue((m_main->GetFontSize()-9.0f)/6.0f);
+ if ( slider != 0 ) slider->SetVisibleValue((m_main->GetFontSize()-9.0f)/12.0f);
ViewDisplayInfo();
}
@@ -183,7 +183,7 @@ bool CDisplayInfo::EventProcess(const Event &event)
{
slider = static_cast<Ui::CSlider*>(pw->SearchControl(EVENT_STUDIO_SIZE));
if ( slider == 0 ) return false;
- m_main->SetFontSize(9.0f+slider->GetVisibleValue()*6.0f);
+ m_main->SetFontSize(9.0f+slider->GetVisibleValue()*12.0f);
ViewDisplayInfo();
}
@@ -1214,3 +1214,4 @@ void CDisplayInfo::CreateObjectsFile()
}
+
diff --git a/src/ui/displayinfo.h b/src/ui/displayinfo.h
index ab42d62..eea50b7 100644
--- a/src/ui/displayinfo.h
+++ b/src/ui/displayinfo.h
@@ -95,3 +95,4 @@ protected:
} // namespace Ui
+
diff --git a/src/ui/displaytext.cpp b/src/ui/displaytext.cpp
index 630b385..d88674a 100644
--- a/src/ui/displaytext.cpp
+++ b/src/ui/displaytext.cpp
@@ -606,3 +606,4 @@ CObject* CDisplayText::SearchToto()
}
}
+
diff --git a/src/ui/edit.cpp b/src/ui/edit.cpp
index 7e657c8..6fd1735 100644
--- a/src/ui/edit.cpp
+++ b/src/ui/edit.cpp
@@ -263,7 +263,7 @@ bool CEdit::EventProcess(const Event &event)
if ( event.type == EVENT_MOUSE_MOVE )
{
- if ( Detect(event.mousePos) &&
+ if ( Detect(event.mousePos) &&
event.mousePos.x < m_pos.x+m_dim.x-(m_bMulti?MARGX+SCROLL_WIDTH:0.0f) )
{
if ( m_bEdit )
@@ -688,7 +688,7 @@ void CEdit::MouseMove(Math::Point mouse)
int CEdit::MouseDetect(Math::Point mouse)
{
Math::Point pos;
- float indentLength, offset, size;
+ float indentLength = 0.0f, offset, size;
int i, len, c;
bool bTitle;
@@ -782,13 +782,16 @@ void CEdit::HyperJump(std::string name, std::string marker)
sMarker = marker;
//? sprintf(filename, "help\\%s.txt", name);
-
- if ( name[0] == '%' ) {
+
+ if ( name[0] == '%' )
+ {
filename = GetProfile().GetUserBasedPath(name, "") + ".txt";
- } else {
+ }
+ else
+ {
filename = std::string("help/") + CApplication::GetInstancePointer()->GetLanguageChar() + "/" + name + std::string(".txt");
}
-
+
if ( ReadText(filename) )
{
Justif();
@@ -886,7 +889,7 @@ bool CEdit::HyperGo(EventType event)
void CEdit::Draw()
{
Math::Point pos, ppos, dim, start, end;
- float size, indentLength;
+ float size = 0.0f, indentLength = 0.0f;
int i, j, beg, len, c1, c2, o1, o2, eol, iIndex, line;
if ( (m_state & STATE_VISIBLE) == 0 ) return;
@@ -1249,7 +1252,7 @@ void CEdit::SetText(const char *text, bool bNew)
{
int i, j, font;
bool bBOL;
-
+
if ( !bNew ) UndoMemorize(OPERUNDO_SPEC);
m_len = strlen(text);
@@ -1387,10 +1390,11 @@ int CEdit::GetTextLength()
std::string GetNameParam(std::string cmd, int rank)
{
- std::vector<std::string> results;
+ std::vector<std::string> results;
boost::split(results, cmd, boost::is_any_of(" ;"));
-
- if (results.size() > static_cast<unsigned int>(rank)) {
+
+ if (results.size() > static_cast<unsigned int>(rank))
+ {
return results.at(rank);
}
@@ -1402,11 +1406,12 @@ std::string GetNameParam(std::string cmd, int rank)
int GetValueParam(std::string cmd, int rank)
{
- std::vector<std::string> results;
+ std::vector<std::string> results;
boost::split(results, cmd, boost::is_any_of(" ;"));
int return_value = 0;
-
- if (results.size() > static_cast<unsigned int>(rank)) {
+
+ if (results.size() > static_cast<unsigned int>(rank))
+ {
return_value = atoi(results.at(rank).c_str());
}
@@ -1419,7 +1424,8 @@ void CEdit::FreeImage()
{
std::string filename;
- for (int i = 0 ; i < m_imageTotal; i++ ) {
+ for (int i = 0 ; i < m_imageTotal; i++ )
+ {
filename = GetProfile().GetUserBasedPath(m_image[i].name, "diagram") + ".png";
m_engine->DeleteTexture(filename);
}
@@ -1448,12 +1454,14 @@ bool CEdit::ReadText(std::string filename, int addSize)
bool bInSoluce, bBOL;
if ( filename[0] == 0 ) return false;
+
boost::replace_all(filename, "\\", "/");
-
+
/* This is ugly but doesn't require many changes in code. If file doesn't
exists it's posible filename is absolute not full path */
std::string path = filename;
- if (!fs::exists(path)) {
+ if (!fs::exists(path))
+ {
path = CApplication::GetInstancePointer()->GetDataDirPath() + "/" + filename;
}
@@ -1484,10 +1492,11 @@ bool CEdit::ReadText(std::string filename, int addSize)
m_format.clear();
m_format.reserve(m_maxChar+1);
- for (i = 0; i <= m_maxChar+1; i++) {
+ for (i = 0; i <= m_maxChar+1; i++)
+ {
m_format.push_back(0);
}
-
+
fclose(file);
bInSoluce = false;
@@ -1877,7 +1886,7 @@ bool CEdit::WriteText(std::string filename)
FILE* file;
char buffer[1000+20];
int i, j, k, n;
- float iDim;
+ float iDim = 0.0f;
if ( filename[0] == 0 ) return false;
file = fopen(filename.c_str(), "wb");
@@ -1951,7 +1960,8 @@ void CEdit::SetMaxChar(int max)
m_format.clear();
m_format.reserve(m_maxChar+1);
- for (int i = 0; i <= m_maxChar+1; i++) {
+ for (int i = 0; i <= m_maxChar+1; i++)
+ {
m_format.push_back(0);
}
@@ -2142,10 +2152,12 @@ bool CEdit::GetDisplaySpec()
void CEdit::SetMultiFont(bool bMulti)
{
m_format.clear();
-
- if (bMulti) {
+
+ if (bMulti)
+ {
m_format.reserve(m_maxChar+1);
- for (int i = 0; i <= m_maxChar+1; i++) {
+ for (int i = 0; i <= m_maxChar+1; i++)
+ {
m_format.push_back(0);
}
}
@@ -2397,7 +2409,7 @@ void CEdit::MoveChar(int move, bool bWord, bool bSelect)
void CEdit::MoveLine(int move, bool bWord, bool bSelect)
{
- float column, indentLength;
+ float column, indentLength = 0.0f;
int i, line, c;
if ( move == 0 ) return;
@@ -2522,26 +2534,33 @@ bool CEdit::Copy(bool memorize_cursor)
c1 = m_cursor1;
c2 = m_cursor2;
- if ( c1 > c2 ) {
+ if ( c1 > c2 )
+ {
Math::Swap(c1, c2); // always c1 <= c2
}
- if ( c1 == c2 ) {
- while ( c1 > 0 ) {
- if ( m_text[c1 - 1] == '\n' ) {
+ if ( c1 == c2 )
+ {
+ while ( c1 > 0 )
+ {
+ if ( m_text[c1 - 1] == '\n' )
+ {
break;
}
c1--;
}
- while ( c2 < m_len ) {
+ while ( c2 < m_len )
+ {
c2++;
- if ( m_text[c2 - 1] == '\n' ) {
+ if ( m_text[c2 - 1] == '\n' )
+ {
break;
}
}
}
- if ( c1 == c2 ) {
+ if ( c1 == c2 )
+ {
return false;
}
@@ -2553,8 +2572,9 @@ bool CEdit::Copy(bool memorize_cursor)
text[len] = 0;
widgetSetClipboardText(text);
delete []text;
-
- if (memorize_cursor) {
+
+ if (memorize_cursor)
+ {
m_cursor1 = c1;
m_cursor2 = c2;
}
@@ -2569,28 +2589,33 @@ bool CEdit::Paste()
char c;
char* text;
- if ( !m_bEdit ) {
+ if ( !m_bEdit )
+ {
return false;
}
text = widgetGetClipboardText();
-
- if ( text == nullptr ) {
+
+ if ( text == nullptr )
+ {
return false;
}
UndoMemorize(OPERUNDO_SPEC);
- for ( unsigned int i = 0; i < strlen(text); i++ ) {
+ for ( unsigned int i = 0; i < strlen(text); i++ )
+ {
c = text[i];
- if ( c == '\r' ) {
+ if ( c == '\r' )
+ {
continue;
}
- if ( c == '\t' && m_bAutoIndent ) {
+ if ( c == '\t' && m_bAutoIndent )
+ {
continue;
}
InsertOne(c);
}
-
+
free(text);
Justif();
ColumnFix();
@@ -2603,7 +2628,8 @@ bool CEdit::Paste()
bool CEdit::Undo()
{
- if ( !m_bEdit ) {
+ if ( !m_bEdit )
+ {
return false;
}
@@ -2617,7 +2643,8 @@ void CEdit::Insert(char character)
{
int i, level, tab;
- if ( !m_bEdit ) {
+ if ( !m_bEdit )
+ {
return;
}
@@ -2956,7 +2983,7 @@ bool CEdit::MinMaj(bool bMaj)
void CEdit::Justif()
{
- float width, size, indentLength;
+ float width, size, indentLength = 0.0f;
int i, j, line, indent;
bool bDual, bString, bRem;
@@ -3219,7 +3246,7 @@ bool CEdit::SetFormat(int cursor1, int cursor2, int format)
void CEdit::UpdateScroll()
{
float value;
-
+
if ( m_scroll != nullptr )
{
if ( m_lineTotal <= m_lineVisible )
@@ -3243,3 +3270,4 @@ void CEdit::UpdateScroll()
}
}
+
diff --git a/src/ui/edit.h b/src/ui/edit.h
index df4f143..acdf72c 100644
--- a/src/ui/edit.h
+++ b/src/ui/edit.h
@@ -239,7 +239,7 @@ protected:
void UndoFlush();
void UndoMemorize(OperUndo oper);
bool UndoRecall();
-
+
void UpdateScroll();
protected:
@@ -294,3 +294,4 @@ protected:
}
+
diff --git a/src/ui/editvalue.cpp b/src/ui/editvalue.cpp
index 6397a73..3fb9b79 100644
--- a/src/ui/editvalue.cpp
+++ b/src/ui/editvalue.cpp
@@ -369,3 +369,4 @@ float CEditValue::GetMaxValue()
}
}
+
diff --git a/src/ui/editvalue.h b/src/ui/editvalue.h
index 5d6e643..2734847 100644
--- a/src/ui/editvalue.h
+++ b/src/ui/editvalue.h
@@ -85,3 +85,4 @@ protected:
}
+
diff --git a/src/ui/gauge.cpp b/src/ui/gauge.cpp
index c98e3b6..a8ee41c 100644
--- a/src/ui/gauge.cpp
+++ b/src/ui/gauge.cpp
@@ -144,3 +144,4 @@ float CGauge::GetLevel()
}
+
diff --git a/src/ui/gauge.h b/src/ui/gauge.h
index a2b689a..3dbeef8 100644
--- a/src/ui/gauge.h
+++ b/src/ui/gauge.h
@@ -31,24 +31,23 @@ namespace Ui {
class CGauge : public CControl
{
- public:
- CGauge();
- virtual ~CGauge();
+public:
+ CGauge();
+ virtual ~CGauge();
- bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventType);
+ bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventType);
- bool EventProcess(const Event &event);
+ bool EventProcess(const Event &event);
- void Draw();
+ void Draw();
- void SetLevel(float level);
- float GetLevel();
+ void SetLevel(float level);
+ float GetLevel();
- protected:
-
- protected:
- float m_level;
+protected:
+ float m_level;
};
}
+
diff --git a/src/ui/group.cpp b/src/ui/group.cpp
index c3c7028..908ac19 100644
--- a/src/ui/group.cpp
+++ b/src/ui/group.cpp
@@ -639,3 +639,4 @@ void CGroup::Draw()
}
+
diff --git a/src/ui/group.h b/src/ui/group.h
index fd31716..89996cc 100644
--- a/src/ui/group.h
+++ b/src/ui/group.h
@@ -46,3 +46,4 @@ protected:
}
+
diff --git a/src/ui/image.cpp b/src/ui/image.cpp
index 94b9586..9a14789 100644
--- a/src/ui/image.cpp
+++ b/src/ui/image.cpp
@@ -151,3 +151,4 @@ void CImage::Draw()
}
+
diff --git a/src/ui/image.h b/src/ui/image.h
index c40828c..fd71e33 100644
--- a/src/ui/image.h
+++ b/src/ui/image.h
@@ -52,3 +52,4 @@ protected:
}
+
diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp
index 893cd05..845579e 100644
--- a/src/ui/interface.cpp
+++ b/src/ui/interface.cpp
@@ -47,8 +47,10 @@ CInterface::~CInterface()
void CInterface::Flush()
{
- for (int i = 0; i < MAXCONTROL; i++ ) {
- if ( m_table[i] != nullptr ) {
+ for (int i = 0; i < MAXCONTROL; i++ )
+ {
+ if ( m_table[i] != nullptr )
+ {
delete m_table[i];
m_table[i] = nullptr;
}
@@ -58,7 +60,8 @@ void CInterface::Flush()
int CInterface::GetNextFreeControl()
{
- for (int i = 10; i < MAXCONTROL-1; i++) {
+ for (int i = 10; i < MAXCONTROL-1; i++)
+ {
if (m_table[i] == nullptr)
return i;
}
@@ -92,7 +95,8 @@ CWindow* CInterface::CreateWindows(Math::Point pos, Math::Point dim, int icon, E
if (eventMsg == EVENT_NULL)
eventMsg = GetUniqueEventType();
- switch (eventMsg) {
+ switch (eventMsg)
+ {
case EVENT_WINDOW0: index = 0; break;
case EVENT_WINDOW1: index = 1; break;
case EVENT_WINDOW2: index = 2; break;
@@ -249,9 +253,12 @@ CMap* CInterface::CreateMap(Math::Point pos, Math::Point dim, int icon, EventTyp
bool CInterface::DeleteControl(EventType eventMsg)
{
- for (int i = 0; i < MAXCONTROL; i++) {
- if ( m_table[i] != nullptr ) {
- if (eventMsg == m_table[i]->GetEventType()) {
+ for (int i = 0; i < MAXCONTROL; i++)
+ {
+ if ( m_table[i] != nullptr )
+ {
+ if (eventMsg == m_table[i]->GetEventType())
+ {
delete m_table[i];
m_table[i] = nullptr;
return true;
@@ -265,8 +272,10 @@ bool CInterface::DeleteControl(EventType eventMsg)
CControl* CInterface::SearchControl(EventType eventMsg)
{
- for (int i = 0; i < MAXCONTROL; i++) {
- if (m_table[i] != nullptr) {
+ for (int i = 0; i < MAXCONTROL; i++)
+ {
+ if (m_table[i] != nullptr)
+ {
if (eventMsg == m_table[i]->GetEventType())
return m_table[i];
}
@@ -326,4 +335,5 @@ void CInterface::Draw()
}
}
-}
+} // namespace Ui
+
diff --git a/src/ui/interface.h b/src/ui/interface.h
index ebc80e7..d5734f0 100644
--- a/src/ui/interface.h
+++ b/src/ui/interface.h
@@ -55,48 +55,49 @@ const int MAXCONTROL = 100;
class CInterface
{
- public:
- CInterface();
- ~CInterface();
-
- bool EventProcess(const Event &event);
- bool GetTooltip(Math::Point pos, std::string &name);
-
- void Flush();
- CButton* CreateButton(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CColor* CreateColor(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CCheck* CreateCheck(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CKey* CreateKey(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CGroup* CreateGroup(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CImage* CreateImage(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CEdit* CreateEdit(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CEditValue* CreateEditValue(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CScroll* CreateScroll(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CSlider* CreateSlider(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CShortcut* CreateShortcut(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CCompass* CreateCompass(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CTarget* CreateTarget(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CMap* CreateMap(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
-
- CWindow* CreateWindows(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- CList* CreateList(Math::Point pos, Math::Point dim, int icon, EventType eventMsg, float expand=1.2f);
- CLabel* CreateLabel(Math::Point pos, Math::Point dim, int icon, EventType eventMsg, std::string name);
-
- bool DeleteControl(EventType eventMsg);
- CControl* SearchControl(EventType eventMsg);
-
- void Draw();
-
- protected:
- int GetNextFreeControl();
- template <typename T> inline T* CreateControl(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
-
- CEventQueue* m_event;
- Gfx::CEngine* m_engine;
- Gfx::CCamera* m_camera;
-
- CControl* m_table[MAXCONTROL];
+public:
+ CInterface();
+ ~CInterface();
+
+ bool EventProcess(const Event &event);
+ bool GetTooltip(Math::Point pos, std::string &name);
+
+ void Flush();
+ CButton* CreateButton(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CColor* CreateColor(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CCheck* CreateCheck(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CKey* CreateKey(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CGroup* CreateGroup(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CImage* CreateImage(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CEdit* CreateEdit(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CEditValue* CreateEditValue(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CScroll* CreateScroll(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CSlider* CreateSlider(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CShortcut* CreateShortcut(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CCompass* CreateCompass(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CTarget* CreateTarget(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CMap* CreateMap(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+
+ CWindow* CreateWindows(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ CList* CreateList(Math::Point pos, Math::Point dim, int icon, EventType eventMsg, float expand=1.2f);
+ CLabel* CreateLabel(Math::Point pos, Math::Point dim, int icon, EventType eventMsg, std::string name);
+
+ bool DeleteControl(EventType eventMsg);
+ CControl* SearchControl(EventType eventMsg);
+
+ void Draw();
+
+protected:
+ int GetNextFreeControl();
+ template <typename T> inline T* CreateControl(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+
+ CEventQueue* m_event;
+ Gfx::CEngine* m_engine;
+ Gfx::CCamera* m_camera;
+
+ CControl* m_table[MAXCONTROL];
};
}
+
diff --git a/src/ui/key.cpp b/src/ui/key.cpp
index b181f70..1f8cff5 100644
--- a/src/ui/key.cpp
+++ b/src/ui/key.cpp
@@ -214,3 +214,4 @@ InputBinding CKey::GetBinding()
} // namespace Ui
+
diff --git a/src/ui/label.cpp b/src/ui/label.cpp
index b5195b5..76a95f2 100644
--- a/src/ui/label.cpp
+++ b/src/ui/label.cpp
@@ -66,7 +66,8 @@ void CLabel::Draw()
pos.y = m_pos.y + m_dim.y / 2.0f;
- switch (m_textAlign) {
+ switch (m_textAlign)
+ {
case Gfx::TEXT_ALIGN_LEFT: pos.x = m_pos.x; break;
case Gfx::TEXT_ALIGN_CENTER: pos.x = m_pos.x + m_dim.x / 2.0f; break;
case Gfx::TEXT_ALIGN_RIGHT: pos.x = m_pos.x + m_dim.x; break;
@@ -76,3 +77,4 @@ void CLabel::Draw()
}
}
+
diff --git a/src/ui/label.h b/src/ui/label.h
index c9e1050..305aca2 100644
--- a/src/ui/label.h
+++ b/src/ui/label.h
@@ -29,15 +29,16 @@ namespace Ui {
class CLabel : public CControl
{
- public:
- CLabel();
- virtual ~CLabel();
+public:
+ CLabel();
+ virtual ~CLabel();
- bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- bool EventProcess(const Event &event);
+ bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ bool EventProcess(const Event &event);
- void Draw();
+ void Draw();
};
}
+
diff --git a/src/ui/list.cpp b/src/ui/list.cpp
index fae7af9..f6c3ed9 100644
--- a/src/ui/list.cpp
+++ b/src/ui/list.cpp
@@ -33,13 +33,15 @@ CList::CList() : CControl()
m_button[i] = nullptr;
m_scroll = nullptr;
- for (int i = 0; i < LISTMAXTOTAL; i++) {
+ for (int i = 0; i < LISTMAXTOTAL; i++)
+ {
m_text[i][0] = 0;
m_check[i] = false;
m_enable[i] = true;
}
- for (int i = 0; i < 10; i++) {
+ for (int i = 0; i < 10; i++)
+ {
m_tabs[i] = 0.0f;
m_justifs[i] = Gfx::TEXT_ALIGN_LEFT;
}
@@ -57,7 +59,8 @@ CList::CList() : CControl()
CList::~CList()
{
- for (int i = 0; i < LISTMAXDISPLAY; i++) {
+ for (int i = 0; i < LISTMAXDISPLAY; i++)
+ {
if (m_button[i] != nullptr)
delete m_button[i];
}
@@ -88,6 +91,14 @@ bool CList::Create(Math::Point pos, Math::Point dim, int icon, EventType eventMs
return MoveAdjust();
}
+// Should never be called
+bool CList::Create(Math::Point pos, Math::Point dim, int icon, EventType eventType)
+{
+ assert(false);
+ return false;
+}
+
+
// Adjusted after a change of dimensions.
bool CList::MoveAdjust()
@@ -95,8 +106,10 @@ bool CList::MoveAdjust()
Math::Point ipos, idim, ppos, ddim;
float marging, h;
- for (int i = 0; i < LISTMAXDISPLAY; i++) {
- if (m_button[i] != nullptr) {
+ for (int i = 0; i < LISTMAXDISPLAY; i++)
+ {
+ if (m_button[i] != nullptr)
+ {
delete m_button[i];
m_button[i] = nullptr;
}
@@ -134,7 +147,8 @@ bool CList::MoveAdjust()
ppos.y = ipos.y + idim.y - h;
ddim.x = idim.x - SCROLL_WIDTH;
ddim.y = h;
- for (int i = 0; i < m_displayLine; i++) {
+ for (int i = 0; i < m_displayLine; i++)
+ {
m_button[i] = new CButton();
m_button[i]->Create(ppos, ddim, -1, EVENT_NULL);
m_button[i]->SetTextAlign(Gfx::TEXT_ALIGN_LEFT);
@@ -146,7 +160,8 @@ bool CList::MoveAdjust()
m_eventButton[i] = m_button[i]->GetEventType();
}
- if ( m_scroll != nullptr ) {
+ if ( m_scroll != nullptr )
+ {
ppos.x = ipos.x + idim.x - SCROLL_WIDTH;
ppos.y = ipos.y;
ddim.x = SCROLL_WIDTH;
@@ -198,8 +213,10 @@ void CList::SetDim(Math::Point dim)
bool CList::SetState(int state, bool bState)
{
- if (state & STATE_ENABLE) {
- for (int i = 0; i < m_displayLine; i++) {
+ if (state & STATE_ENABLE)
+ {
+ for (int i = 0; i < m_displayLine; i++)
+ {
if (m_button[i] != nullptr)
m_button[i]->SetState(state, bState);
}
@@ -213,8 +230,10 @@ bool CList::SetState(int state, bool bState)
bool CList::SetState(int state)
{
- if (state & STATE_ENABLE) {
- for (int i = 0; i < m_displayLine; i++) {
+ if (state & STATE_ENABLE)
+ {
+ for (int i = 0; i < m_displayLine; i++)
+ {
if (m_button[i] != nullptr)
m_button[i]->SetState(state);
}
@@ -228,8 +247,10 @@ bool CList::SetState(int state)
bool CList::ClearState(int state)
{
- if (state & STATE_ENABLE) {
- for (int i = 0; i < m_displayLine; i++) {
+ if (state & STATE_ENABLE)
+ {
+ for (int i = 0; i < m_displayLine; i++)
+ {
if (m_button[i] != nullptr)
m_button[i]->ClearState(state);
}
@@ -246,15 +267,20 @@ bool CList::ClearState(int state)
bool CList::EventProcess(const Event &event)
{
int i;
- if (m_bBlink && event.type == EVENT_FRAME) {
+ if (m_bBlink && event.type == EVENT_FRAME)
+ {
i = m_selectLine-m_firstLine;
- if (i >= 0 && i < 4 && m_button[i] != nullptr) {
+ if (i >= 0 && i < 4 && m_button[i] != nullptr)
+ {
m_blinkTime += event.rTime;
- if (Math::Mod(m_blinkTime, 0.7f) < 0.3f) {
+ if (Math::Mod(m_blinkTime, 0.7f) < 0.3f)
+ {
m_button[i]->ClearState(STATE_ENABLE);
m_button[i]->ClearState(STATE_CHECK);
- } else {
+ }
+ else
+ {
m_button[i]->SetState(STATE_ENABLE);
m_button[i]->SetState(STATE_CHECK);
}
@@ -266,7 +292,8 @@ bool CList::EventProcess(const Event &event)
if ((m_state & STATE_ENABLE) == 0)
return true;
- if (event.type == EVENT_MOUSE_WHEEL && event.mouseWheel.dir == WHEEL_UP && Detect(event.mousePos)) {
+ if (event.type == EVENT_MOUSE_WHEEL && event.mouseWheel.dir == WHEEL_UP && Detect(event.mousePos))
+ {
if (m_firstLine > 0)
m_firstLine--;
UpdateScroll();
@@ -274,7 +301,8 @@ bool CList::EventProcess(const Event &event)
return true;
}
- if (event.type == EVENT_MOUSE_WHEEL && event.mouseWheel.dir == WHEEL_DOWN && Detect(event.mousePos)) {
+ if (event.type == EVENT_MOUSE_WHEEL && event.mouseWheel.dir == WHEEL_DOWN && Detect(event.mousePos))
+ {
if (m_firstLine < m_totalLine - m_displayLine)
m_firstLine++;
UpdateScroll();
@@ -284,9 +312,11 @@ bool CList::EventProcess(const Event &event)
CControl::EventProcess(event);
- if (event.type == EVENT_MOUSE_MOVE && Detect(event.mousePos)) {
+ if (event.type == EVENT_MOUSE_MOVE && Detect(event.mousePos))
+ {
m_engine->SetMouseType(Gfx::ENG_MOUSE_NORM);
- for (i = 0; i < m_displayLine; i++) {
+ for (i = 0; i < m_displayLine; i++)
+ {
if (i + m_firstLine >= m_totalLine)
break;
if (m_button[i] != nullptr)
@@ -294,16 +324,20 @@ bool CList::EventProcess(const Event &event)
}
}
- if (m_bSelectCap) {
- for (i = 0; i < m_displayLine; i++) {
+ if (m_bSelectCap)
+ {
+ for (i = 0; i < m_displayLine; i++)
+ {
if (i + m_firstLine >= m_totalLine)
break;
- if (m_button[i] != nullptr) {
+ if (m_button[i] != nullptr)
+ {
if (!m_button[i]->EventProcess(event))
return false;
- if (event.type == m_eventButton[i]) {
+ if (event.type == m_eventButton[i])
+ {
SetSelect(m_firstLine + i);
Event newEvent = event;
@@ -314,11 +348,13 @@ bool CList::EventProcess(const Event &event)
}
}
- if (m_scroll != nullptr) {
+ if (m_scroll != nullptr)
+ {
if (!m_scroll->EventProcess(event))
return false;
- if (event.type == m_eventScroll) {
+ if (event.type == m_eventScroll)
+ {
MoveScroll();
UpdateButton();
}
@@ -346,10 +382,12 @@ void CList::Draw()
dp = 0.5f / 256.0f;
- if (m_icon != -1) {
+ if (m_icon != -1)
+ {
dim = m_dim;
- if (m_icon == 0) {
+ if (m_icon == 0)
+ {
m_engine->SetTexture("button2.png");
m_engine->SetState(Gfx::ENG_RSTATE_NORMAL);
@@ -357,7 +395,9 @@ void CList::Draw()
uv1.y = 64.0f / 256.0f; // u-v texture
uv2.x = 160.0f / 256.0f;
uv2.y = 96.0f / 256.0f;
- } else {
+ }
+ else
+ {
m_engine->SetTexture("button2.png");
m_engine->SetState(Gfx::ENG_RSTATE_NORMAL);
@@ -366,7 +406,8 @@ void CList::Draw()
uv2.x = 156.0f / 256.0f;
uv2.y = 92.0f / 256.0f;
- if (m_button[0] != nullptr) {
+ if (m_button[0] != nullptr)
+ {
dim = m_button[0]->GetDim();
dim.y *= m_displayLine; // background sounds spot behind
}
@@ -382,9 +423,11 @@ void CList::Draw()
DrawIcon(m_pos, dim, uv1, uv2, corner, 8.0f / 256.0f);
}
- if ( m_totalLine < m_displayLine ) { // no buttons to the bottom?
+ if ( m_totalLine < m_displayLine ) // no buttons to the bottom?
+ {
i = m_totalLine;
- if ( m_button[i] != 0 ) {
+ if ( m_button[i] != 0 )
+ {
pos = m_button[i]->GetPos();
dim = m_button[i]->GetDim();
pos.y += dim.y * 1.1f;
@@ -405,11 +448,13 @@ void CList::Draw()
}
}
- for (i = 0; i < m_displayLine; i++) {
+ for (i = 0; i < m_displayLine; i++)
+ {
if ( i + m_firstLine >= m_totalLine )
break;
- if ( m_button[i] != nullptr ) {
+ if ( m_button[i] != nullptr )
+ {
if ( !m_bBlink && i + m_firstLine < m_totalLine )
m_button[i]->SetState(STATE_ENABLE, m_enable[i+m_firstLine] && (m_state & STATE_ENABLE) );
@@ -418,22 +463,27 @@ void CList::Draw()
// draws text in the box
pos = m_button[i]->GetPos();
dim = m_button[i]->GetDim();
- if ( m_tabs[0] == 0.0f ) {
+ if ( m_tabs[0] == 0.0f )
+ {
ppos.x = pos.x + dim.y * 0.5f;
ppos.y = pos.y + dim.y * 0.5f;
ppos.y -= m_engine->GetText()->GetHeight(m_fontType, m_fontSize) / 2.0f;
ddim.x = dim.x-dim.y;
DrawCase(m_text[i + m_firstLine], ppos, ddim.x, Gfx::TEXT_ALIGN_LEFT);
- } else {
+ }
+ else
+ {
ppos.x = pos.x + dim.y * 0.5f;
ppos.y = pos.y + dim.y * 0.5f;
ppos.y -= m_engine->GetText()->GetHeight(m_fontType, m_fontSize) / 2.0f;
pb = m_text[i + m_firstLine];
- for (int j = 0; j < 10; j++) {
+ for (int j = 0; j < 10; j++)
+ {
pe = strchr(pb, '\t');
if ( pe == 0 )
strcpy(text, pb);
- else {
+ else
+ {
strncpy(text, pb, pe - pb);
text[pe - pb] = 0;
}
@@ -446,7 +496,8 @@ void CList::Draw()
}
}
- if ( (m_state & STATE_EXTEND) && i < m_totalLine) {
+ if ( (m_state & STATE_EXTEND) && i < m_totalLine)
+ {
pos = m_button[i]->GetPos();
dim = m_button[i]->GetDim();
pos.x += dim.x - dim.y * 0.75f;
@@ -456,7 +507,8 @@ void CList::Draw()
dim.x -= 4.0f / 640.0f;
dim.y -= 4.0f / 480.0f;
- if ( m_check[i + m_firstLine] ) {
+ if ( m_check[i + m_firstLine] )
+ {
m_engine->SetTexture("button1.png");
m_engine->SetState(Gfx::ENG_RSTATE_NORMAL);
uv1.x = 64.0f / 256.0f;
@@ -479,15 +531,20 @@ void CList::Draw()
uv2.x -= dp;
uv2.y -= dp;
DrawIcon(pos, dim, uv1, uv2); // draws v
- } else {
+ }
+ else
+ {
m_engine->SetTexture("button1.png");
m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE); // was D3DSTATETTw
- if ( i + m_firstLine == m_selectLine ) {
+ if ( i + m_firstLine == m_selectLine )
+ {
uv1.x =224.0f / 256.0f; // <
uv1.y =192.0f / 256.0f;
uv2.x =256.0f / 256.0f;
uv2.y =224.0f / 256.0f;
- } else {
+ }
+ else
+ {
uv1.x = 96.0f / 256.0f; // x
uv1.y = 32.0f / 256.0f;
uv2.x =128.0f / 256.0f;
@@ -552,7 +609,8 @@ void CList::SetSelect(int i)
{
if ( m_bSelectCap )
m_selectLine = i;
- else {
+ else
+ {
m_firstLine = i;
UpdateScroll();
}
@@ -595,8 +653,10 @@ void CList::SetBlink(bool bEnable)
i = m_selectLine-m_firstLine;
- if (i >= 0 && i < 4 && m_button[i] != nullptr) {
- if ( !bEnable ) {
+ if (i >= 0 && i < 4 && m_button[i] != nullptr)
+ {
+ if ( !bEnable )
+ {
m_button[i]->SetState(STATE_CHECK);
m_button[i]->ClearState(STATE_ENABLE);
}
@@ -611,7 +671,7 @@ bool CList::GetBlink()
// Specifies the text of a line.
-void CList::SetName(int i, const char* name)
+void CList::SetItemName(int i, const char* name)
{
if ( i < 0 || i >= LISTMAXTOTAL )
return;
@@ -630,7 +690,7 @@ void CList::SetName(int i, const char* name)
// Returns the text of a line.
-char* CList::GetName(int i)
+char* CList::GetItemName(int i)
{
if ( i < 0 || i >= m_totalLine )
return 0;
@@ -736,17 +796,21 @@ void CList::UpdateButton()
state = CControl::GetState();
j = m_firstLine;
- for (i = 0; i < m_displayLine; i++) {
+ for (i = 0; i < m_displayLine; i++)
+ {
if (m_button[i] == nullptr)
continue;
m_button[i]->SetState(STATE_CHECK, (j == m_selectLine));
- if ( j < m_totalLine ) {
+ if ( j < m_totalLine )
+ {
//? m_button[i]->SetName(m_text[j]);
m_button[i]->SetName(" "); // blank button
m_button[i]->SetState(STATE_ENABLE, (state & STATE_ENABLE));
- } else {
+ }
+ else
+ {
m_button[i]->SetName(" "); // blank button
m_button[i]->ClearState(STATE_ENABLE);
}
@@ -763,11 +827,14 @@ void CList::UpdateScroll()
if (m_scroll == nullptr)
return;
- if (m_totalLine <= m_displayLine) {
+ if (m_totalLine <= m_displayLine)
+ {
ratio = 1.0f;
value = 0.0f;
step = 0.0f;
- } else {
+ }
+ else
+ {
ratio = static_cast<float>(m_displayLine) / m_totalLine;
if ( ratio > 1.0f ) ratio = 1.0f;
@@ -808,4 +875,5 @@ void CList::MoveScroll()
}
-}
+} // namespace Ui
+
diff --git a/src/ui/list.h b/src/ui/list.h
index 97bd48c..a2e033f 100644
--- a/src/ui/list.h
+++ b/src/ui/list.h
@@ -69,8 +69,8 @@ class CList : public CControl
void SetBlink(bool bEnable);
bool GetBlink();
- void SetName(int i, const char* name);
- char* GetName(int i);
+ void SetItemName(int i, const char* name);
+ char* GetItemName(int i);
void SetCheck(int i, bool bMode);
bool GetCheck(int i);
@@ -93,6 +93,10 @@ class CList : public CControl
void MoveScroll();
void DrawCase(char *text, Math::Point pos, float width, Gfx::TextAlign justif);
+ private:
+ // Overridden to avoid warning about hiding the virtual function
+ virtual bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventType) override;
+
protected:
CButton* m_button[LISTMAXDISPLAY];
CScroll* m_scroll;
@@ -117,5 +121,5 @@ class CList : public CControl
};
-}
+} // namespace Ui
diff --git a/src/ui/maindialog.cpp b/src/ui/maindialog.cpp
index 092903d..8f5b936 100644
--- a/src/ui/maindialog.cpp
+++ b/src/ui/maindialog.cpp
@@ -174,10 +174,18 @@ CMainDialog::CMainDialog()
m_sceneDir = "levels";
- m_savegameDir = GetSystemUtils()->savegameDirectoryLocation();
+
+ // TODO: replace NDEBUG with something like BUILD_TYPE == "DEBUG"/"RELEASE"
+ #ifdef NDEBUG
+ m_savegameDir = GetSystemUtils()->GetSavegameDirectoryLocation();
+ #else
+ m_savegameDir = "savegame";
+ #endif
m_publicDir = "program";
m_userDir = "user";
- m_filesDir = "files";
+ m_filesDir = m_savegameDir;
+
+ m_setupFull = m_app->GetVideoConfig().fullScreen;
m_bDialog = false;
}
@@ -193,7 +201,7 @@ CMainDialog::~CMainDialog()
void CMainDialog::ChangePhase(Phase phase)
{
- CWindow* pw;
+ CWindow* pw = nullptr;
CEdit* pe;
CEditValue* pv;
CLabel* pl;
@@ -383,7 +391,7 @@ pb->SetState(STATE_SHADOW);
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
- true, Math::Point(1.0f, 768.0f / 1024.0f));
+ true);
m_engine->SetBackForce(true);
}
@@ -503,7 +511,7 @@ pb->SetState(STATE_SHADOW);
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
- true, Math::Point(1.0f, 768.0f / 1024.0f));
+ true);
m_engine->SetBackForce(true);
}
@@ -738,6 +746,24 @@ pb->SetState(STATE_SHADOW);
CameraPerso();
}
+ if ( m_phase != PHASE_SIMUL &&
+ m_phase != PHASE_WIN &&
+ m_phase != PHASE_LOST &&
+ m_phase != PHASE_WRITE &&
+ m_phase != PHASE_READs &&
+ m_phase != PHASE_WRITEs &&
+ m_phase != PHASE_SETUPds &&
+ m_phase != PHASE_SETUPgs &&
+ m_phase != PHASE_SETUPps &&
+ m_phase != PHASE_SETUPcs &&
+ m_phase != PHASE_SETUPss )
+ {
+ if (!m_sound->IsPlayingMusic())
+ {
+ m_sound->PlayMusic("Intro1.ogg", false);
+ }
+ }
+
if ( m_phase == PHASE_TRAINER ||
m_phase == PHASE_DEFI ||
m_phase == PHASE_MISSION ||
@@ -746,10 +772,6 @@ pb->SetState(STATE_SHADOW);
m_phase == PHASE_USER ||
m_phase == PHASE_PROTO )
{
- if (!m_sound->IsPlayingMusic()) {
- m_sound->PlayMusic(11, true);
- }
-
if ( m_phase == PHASE_TRAINER ) m_index = 0;
if ( m_phase == PHASE_DEFI ) m_index = 1;
if ( m_phase == PHASE_MISSION ) m_index = 2;
@@ -959,7 +981,7 @@ pb->SetState(STATE_SHADOW);
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
- true, Math::Point(1.0f, 768.0f / 1024.0f));
+ true);
m_engine->SetBackForce(true);
}
@@ -1158,7 +1180,7 @@ pb->SetState(STATE_SHADOW);
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
- true, Math::Point(1.0f, 768.0f / 1024.0f));
+ true);
m_engine->SetBackForce(true);
}
}
@@ -1604,7 +1626,7 @@ pos.y -= 0.048f;
}
if ( m_phase == PHASE_READ ||
- m_phase == PHASE_READs )
+ m_phase == PHASE_READs )
{
pos.x = 0.10f;
pos.y = 0.10f;
@@ -1683,7 +1705,7 @@ pos.y -= 0.048f;
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
- true, Math::Point(1.0f, 768.0f / 1024.0f));
+ true);
m_engine->SetBackForce(true);
}
}
@@ -1733,7 +1755,7 @@ pos.y -= 0.048f;
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
- true, Math::Point(1.0f, 768.0f / 1024.0f));
+ true);
m_engine->SetBackForce(true);
m_loadingCounter = 1; // enough time to display!
@@ -1741,9 +1763,6 @@ pos.y -= 0.048f;
if ( m_phase == PHASE_WELCOME1 )
{
- m_sound->StopMusic();
- m_sound->PlayMusic(11, false);
-
pos.x = 0.0f;
pos.y = 0.0f;
ddim.x = 0.0f;
@@ -1758,7 +1777,7 @@ pos.y -= 0.048f;
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
- true, Math::Point(861.0f / 1024.0f, 646.0f / 1024.0f));
+ true);
m_engine->SetBackForce(true);
}
if ( m_phase == PHASE_WELCOME2 )
@@ -1777,7 +1796,7 @@ pos.y -= 0.048f;
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
- true, Math::Point(640.0f / 1024.0f, 480.0f / 512.0f));
+ true);
m_engine->SetBackForce(true);
}
if ( m_phase == PHASE_WELCOME3 )
@@ -1796,7 +1815,7 @@ pos.y -= 0.048f;
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
- true, Math::Point(640.0f / 1024.0f, 480.0f / 512.0f));
+ true);
m_engine->SetBackForce(true);
}
@@ -1932,7 +1951,7 @@ pos.y -= 0.048f;
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f),
- true, Math::Point(1.0f, 768.0f / 1024.0f));
+ true);
m_engine->SetBackForce(true);
}
@@ -2001,9 +2020,27 @@ bool CMainDialog::EventProcess(const Event &event)
//? else welcomeLength = WELCOME_LENGTH;
welcomeLength = WELCOME_LENGTH;
+ if ( m_phase != PHASE_SIMUL &&
+ m_phase != PHASE_WIN &&
+ m_phase != PHASE_LOST &&
+ m_phase != PHASE_WRITE &&
+ m_phase != PHASE_READs &&
+ m_phase != PHASE_WRITEs &&
+ m_phase != PHASE_SETUPds &&
+ m_phase != PHASE_SETUPgs &&
+ m_phase != PHASE_SETUPps &&
+ m_phase != PHASE_SETUPcs &&
+ m_phase != PHASE_SETUPss )
+ {
+ if (!m_sound->IsPlayingMusic())
+ {
+ m_sound->PlayMusic("Intro2.ogg", true);
+ }
+ }
+
if ( m_phase == PHASE_WELCOME1 ||
- m_phase == PHASE_WELCOME2 ||
- m_phase == PHASE_WELCOME3 )
+ m_phase == PHASE_WELCOME2 ||
+ m_phase == PHASE_WELCOME3 )
{
float intensity;
int mode = Gfx::ENG_RSTATE_TCOLOR_WHITE;
@@ -2277,7 +2314,7 @@ bool CMainDialog::EventProcess(const Event &event)
if ( pw == 0 ) break;
pl = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_NLIST));
if ( pl == 0 ) break;
- StartDeleteGame(pl->GetName(pl->GetSelect()));
+ StartDeleteGame(pl->GetItemName(pl->GetSelect()));
break;
default:
@@ -2594,15 +2631,18 @@ bool CMainDialog::EventProcess(const Event &event)
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
if ( pw == 0 ) break;
pc = static_cast<CCheck*>(pw->SearchControl(EVENT_INTERFACE_FULL));
- if ( pc == 0 ) break;
-
- if ( pc->TestState(STATE_CHECK) ) {
- m_setupFull = false;
- pc->ClearState(STATE_CHECK);
- } else {
- m_setupFull = true;
- pc->SetState(STATE_CHECK);
- }
+ if ( pc == 0 ) break;
+
+ if ( pc->TestState(STATE_CHECK) )
+ {
+ m_setupFull = false;
+ pc->ClearState(STATE_CHECK);
+ }
+ else
+ {
+ m_setupFull = true;
+ pc->SetState(STATE_CHECK);
+ }
UpdateApply();
break;
@@ -2614,7 +2654,7 @@ bool CMainDialog::EventProcess(const Event &event)
if ( pb == 0 ) break;
pb->ClearState(STATE_PRESS);
pb->ClearState(STATE_HILIGHT);
- // TODO: uncomment when changing display is implemented
+ // TODO: uncomment when changing display is implemented
//ChangeDisplay();
UpdateApply();
break;
@@ -3637,8 +3677,9 @@ void CMainDialog::ReadNameList()
{
fs::directory_iterator dirIt(m_savegameDir), dirEndIt;
- BOOST_FOREACH (const fs::path & p, std::make_pair(dirIt, dirEndIt))
+ for (; dirIt != dirEndIt; ++dirIt)
{
+ const fs::path& p = *dirIt;
if (fs::is_directory(p))
{
fileNames.push_back(p.leaf().string());
@@ -3655,7 +3696,7 @@ void CMainDialog::ReadNameList()
for (size_t i=0 ; i<fileNames.size() ; ++i )
{
- pl->SetName(i, fileNames.at(i).c_str());
+ pl->SetItemName(i, fileNames.at(i).c_str());
}
}
@@ -3731,7 +3772,7 @@ void CMainDialog::UpdateNameList()
for ( i=0 ; i<total ; i++ )
{
// TODO: stricmp?
- if ( strcmp(name, pl->GetName(i)) == 0 )
+ if ( strcmp(name, pl->GetItemName(i)) == 0 )
{
pl->SetSelect(i);
pl->ShowSelect(false);
@@ -3767,7 +3808,7 @@ void CMainDialog::UpdateNameEdit()
}
else
{
- name = pl->GetName(sel);
+ name = pl->GetItemName(sel);
pe->SetText(name);
pe->SetCursor(strlen(name), 0);
}
@@ -3791,7 +3832,7 @@ void CMainDialog::UpdateNameFace()
sel = pl->GetSelect();
if ( sel == -1 ) return;
- name = pl->GetName(sel);
+ name = pl->GetItemName(sel);
ReadGamerPerso(name);
}
@@ -3822,7 +3863,7 @@ void CMainDialog::NameSelect()
}
else
{
- m_main->SetGamerName(pl->GetName(sel));
+ m_main->SetGamerName(pl->GetItemName(sel));
m_main->ChangePhase(PHASE_INIT);
}
@@ -3949,7 +3990,7 @@ void CMainDialog::NameDelete()
m_sound->Play(SOUND_TZOING);
return;
}
- gamer = pl->GetName(sel);
+ gamer = pl->GetItemName(sel);
// Deletes all the contents of the file.
sprintf(dir, "%s/%s", m_savegameDir.c_str(), gamer);
@@ -4264,16 +4305,19 @@ void CMainDialog::DefPerso()
bool CMainDialog::IsIOReadScene()
{
fs::directory_iterator end_iter;
-
+
fs::path saveDir(m_savegameDir + "/" + m_main->GetGamerName());
- if (fs::exists(saveDir) && fs::is_directory(saveDir)) {
- for( fs::directory_iterator dir_iter(saveDir) ; dir_iter != end_iter ; ++dir_iter) {
- if ( fs::is_directory(dir_iter->status()) && fs::exists(dir_iter->path() / "data.sav") ) {
+ if (fs::exists(saveDir) && fs::is_directory(saveDir))
+ {
+ for( fs::directory_iterator dir_iter(saveDir) ; dir_iter != end_iter ; ++dir_iter)
+ {
+ if ( fs::is_directory(dir_iter->status()) && fs::exists(dir_iter->path() / "data.sav") )
+ {
return true;
}
}
}
-
+
return false;
}
@@ -4357,43 +4401,51 @@ void CMainDialog::IOReadList()
if ( pl == 0 ) return;
pl->Flush();
-
+
fs::path saveDir(m_savegameDir + "/" + m_main->GetGamerName());
m_saveList.clear();
-
- if (fs::exists(saveDir) && fs::is_directory(saveDir)) {
- for( fs::directory_iterator dir_iter(saveDir) ; dir_iter != end_iter ; ++dir_iter) {
- if ( fs::is_directory(dir_iter->status()) && fs::exists(dir_iter->path() / "data.sav") ) {
-
+
+ if (fs::exists(saveDir) && fs::is_directory(saveDir))
+ {
+ for( fs::directory_iterator dir_iter(saveDir) ; dir_iter != end_iter ; ++dir_iter)
+ {
+ if ( fs::is_directory(dir_iter->status()) && fs::exists(dir_iter->path() / "data.sav") )
+ {
+
file = fopen((dir_iter->path() / "data.sav").make_preferred().string().c_str(), "r");
if ( file == NULL ) continue;
- while ( fgets(line, 500, file) != NULL ) {
- for ( i=0 ; i<500 ; i++ ) {
+ while ( fgets(line, 500, file) != NULL )
+ {
+ for ( i=0 ; i<500 ; i++ )
+ {
if ( line[i] == '\t' ) line[i] = ' '; // replaces tab by space
- if ( line[i] == '/' && line[i+1] == '/' ) {
+ if ( line[i] == '/' && line[i+1] == '/' )
+ {
line[i] = 0;
break;
}
}
- if ( Cmd(line, "Title") ) {
+ if ( Cmd(line, "Title") )
+ {
OpString(line, "text", name);
break;
}
}
fclose(file);
- pl->SetName(m_saveList.size(), name);
+ pl->SetItemName(m_saveList.size(), name);
m_saveList.push_back(dir_iter->path());
}
}
}
-
- // zly indeks
- if ( m_phase == PHASE_WRITE || m_phase == PHASE_WRITEs ) {
+
+ // invalid index
+ if ( m_phase == PHASE_WRITE || m_phase == PHASE_WRITEs )
+ {
GetResource(RES_TEXT, RT_IO_NEW, name);
- pl->SetName(m_saveList.size(), name);
+ pl->SetItemName(m_saveList.size(), name);
}
pl->SetSelect(m_saveList.size());
@@ -4420,22 +4472,24 @@ void CMainDialog::IOUpdateList()
sel = pl->GetSelect();
max = pl->GetTotal();
- if (m_saveList.size() <= static_cast<unsigned int>(sel)) {
+ if (m_saveList.size() <= static_cast<unsigned int>(sel))
return;
- }
-
+
std::string filename = (m_saveList.at(sel) / "screen.png").make_preferred().string();
if ( m_phase == PHASE_WRITE || m_phase == PHASE_WRITEs )
{
- if ( sel < max-1 ) {
+ if ( sel < max-1 )
+ {
pi->SetFilenameImage(filename.c_str());
}
- else {
+ else
+ {
pi->SetFilenameImage("");
}
pb = static_cast<CButton*>(pw->SearchControl(EVENT_INTERFACE_IODELETE));
- if ( pb != nullptr ) {
+ if ( pb != nullptr )
+ {
pb->SetState(STATE_ENABLE, sel < max-1);
}
}
@@ -4467,12 +4521,14 @@ void CMainDialog::IODeleteScene()
try
{
- if (fs::exists(m_saveList.at(sel)) && fs::is_directory(m_saveList.at(sel))) {
+ if (fs::exists(m_saveList.at(sel)) && fs::is_directory(m_saveList.at(sel)))
+ {
fs::remove_all(m_saveList.at(sel));
}
}
- catch (std::exception & e) {
- GetLogger()->Error("Error removing save %s : %s\n", pl->GetName(sel), e.what());
+ catch (std::exception & e)
+ {
+ GetLogger()->Error("Error removing save %s : %s\n", pl->GetItemName(sel), e.what());
}
IOReadList();
@@ -4483,8 +4539,10 @@ std::string clearName(char *name)
{
std::string ret;
int len = strlen(name);
- for (int i = 0; i < len; i++) {
- if (isalnum(name[i])) {
+ for (int i = 0; i < len; i++)
+ {
+ if (isalnum(name[i]))
+ {
ret += name[i];
}
}
@@ -4509,19 +4567,24 @@ bool CMainDialog::IOWriteScene()
if ( pe == nullptr ) return false;
sel = pl->GetSelect();
- if ( sel == -1 ) {
+ if ( sel == -1 )
+ {
return false;
}
-
+
fs::path dir;
pe->GetText(info, 100);
- if (static_cast<unsigned int>(sel) >= m_saveList.size()) {
+ if (static_cast<unsigned int>(sel) >= m_saveList.size())
+ {
dir = fs::path(m_savegameDir) / m_main->GetGamerName() / ("save" + clearName(info));
- } else {
+ }
+ else
+ {
dir = m_saveList.at(sel);
- }
-
- if (!fs::exists(dir)) {
+ }
+
+ if (!fs::exists(dir))
+ {
fs::create_directories(dir);
}
@@ -4552,7 +4615,8 @@ bool CMainDialog::IOReadScene()
if ( pl == nullptr ) return false;
sel = pl->GetSelect();
- if ( sel == -1 || m_saveList.size() <= static_cast<unsigned int>(sel) ) {
+ if ( sel == -1 || m_saveList.size() <= static_cast<unsigned int>(sel) )
+ {
return false;
}
@@ -4560,33 +4624,42 @@ bool CMainDialog::IOReadScene()
std::string fileCbot = (m_saveList.at(sel) / "cbot.run").make_preferred().string();
file = fopen(fileName.c_str(), "r");
- if ( file == NULL ) {
+ if ( file == NULL )
+ {
return false;
}
- while ( fgets(line, 500, file) != NULL ) {
- for ( i=0 ; i<500 ; i++ ) {
+ while ( fgets(line, 500, file) != NULL )
+ {
+ for ( i=0 ; i<500 ; i++ )
+ {
if ( line[i] == '\t' ) line[i] = ' '; // replaces tab by space
- if ( line[i] == '/' && line[i+1] == '/' ) {
+ if ( line[i] == '/' && line[i+1] == '/' )
+ {
line[i] = 0;
break;
}
}
- if ( Cmd(line, "Mission") ) {
+ if ( Cmd(line, "Mission") )
+ {
OpString(line, "base", m_sceneName);
m_sceneRank = OpInt(line, "rank", 0);
- if ( strcmp(m_sceneName, "user") == 0 ) {
+ if ( strcmp(m_sceneName, "user") == 0 )
+ {
m_sceneRank = m_sceneRank%100;
OpString(line, "dir", dir);
- for ( i=0 ; i<m_userTotal ; i++ ) {
- if ( strcmp(m_userList[i].c_str(), dir) == 0 ) {
+ for ( i=0 ; i<m_userTotal ; i++ )
+ {
+ if ( strcmp(m_userList[i].c_str(), dir) == 0 )
+ {
m_sceneRank += (i+1)*100;
break;
}
}
- if ( m_sceneRank/100 == 0 ) {
+ if ( m_sceneRank/100 == 0 )
+ {
fclose(file);
return false;
}
@@ -4673,8 +4746,9 @@ void CMainDialog::UpdateSceneChap(int &chap)
fs::directory_iterator dirIt(m_savegameDir), dirEndIt;
m_userList.clear();
- BOOST_FOREACH (const fs::path & p, std::make_pair(dirIt, dirEndIt))
+ for (; dirIt != dirEndIt; ++dirIt)
{
+ const fs::path& p = *dirIt;
if (fs::is_directory(p))
{
m_userList.push_back(p.leaf().string());
@@ -4721,7 +4795,7 @@ void CMainDialog::UpdateSceneChap(int &chap)
fclose(file);
}
- pl->SetName(j, name);
+ pl->SetItemName(j, name);
pl->SetEnable(j, true);
}
}
@@ -4774,7 +4848,7 @@ void CMainDialog::UpdateSceneChap(int &chap)
bPassed = GetGamerInfoPassed((j+1)*100);
sprintf(line, "%d: %s", j+1, name);
- pl->SetName(j, line);
+ pl->SetItemName(j, line);
pl->SetCheck(j, bPassed);
pl->SetEnable(j, true);
@@ -4884,7 +4958,7 @@ void CMainDialog::UpdateSceneList(int chap, int &sel)
bPassed = GetGamerInfoPassed((chap+1)*100+(j+1));
sprintf(line, "%d: %s", j+1, name);
- pl->SetName(j, line);
+ pl->SetItemName(j, line);
pl->SetCheck(j, bPassed);
pl->SetEnable(j, true);
@@ -5013,6 +5087,9 @@ void CMainDialog::UpdateSceneResume(int rank)
{
for ( i=0 ; i<500 ; i++ )
{
+ if (line[i] == 0)
+ break;
+
if ( line[i] == '\t' ) line[i] = ' '; // replaces tab by space
if ( line[i] == '/' && line[i+1] == '/' )
{
@@ -5063,7 +5140,7 @@ void CMainDialog::UpdateDisplayDevice()
j = 0;
while ( bufDevices[i] != 0 )
{
- pl->SetName(j++, bufDevices+i);
+ pl->SetItemName(j++, bufDevices+i);
while ( bufDevices[i++] != 0 );
}
@@ -5090,10 +5167,11 @@ void CMainDialog::UpdateDisplayMode()
m_app->GetVideoResolutionList(modes, true, true);
int i = 0;
std::stringstream mode_text;
- for (Math::IntPoint mode : modes) {
- mode_text.str("");
- mode_text << mode.x << "x" << mode.y;
- pl->SetName(i++, mode_text.str().c_str());
+ for (Math::IntPoint mode : modes)
+ {
+ mode_text.str("");
+ mode_text << mode.x << "x" << mode.y;
+ pl->SetItemName(i++, mode_text.str().c_str());
}
pl->SetSelect(m_setupSelMode);
@@ -5117,12 +5195,12 @@ void CMainDialog::ChangeDisplay()
pl = static_cast<CList*>(pw->SearchControl(EVENT_LIST1));
if ( pl == 0 ) return;
m_setupSelDevice = pl->GetSelect();
- //device = pl->GetName(m_setupSelDevice);
+ //device = pl->GetItemName(m_setupSelDevice);
pl = static_cast<CList*>(pw->SearchControl(EVENT_LIST2));
if ( pl == 0 ) return;
m_setupSelMode = pl->GetSelect();
- //mode = pl->GetName(m_setupSelMode);
+ //mode = pl->GetItemName(m_setupSelMode);
pc = static_cast<CCheck*>(pw->SearchControl(EVENT_INTERFACE_FULL));
if ( pc == 0 ) return;
@@ -5478,6 +5556,7 @@ void CMainDialog::SetupMemorize()
GetProfile().SetLocalProfileInt("Setup", "HimselfDamage", m_bHimselfDamage);
GetProfile().SetLocalProfileInt("Setup", "CameraScroll", m_bCameraScroll);
GetProfile().SetLocalProfileInt("Setup", "CameraInvertX", m_bCameraInvertX);
+ GetProfile().SetLocalProfileInt("Setup", "CameraInvertY", m_bCameraInvertY);
GetProfile().SetLocalProfileInt("Setup", "InterfaceEffect", m_bEffect);
GetProfile().SetLocalProfileInt("Setup", "GroundShadow", m_engine->GetShadow());
GetProfile().SetLocalProfileInt("Setup", "GroundSpot", m_engine->GetGroundSpot());
@@ -5498,23 +5577,29 @@ void CMainDialog::SetupMemorize()
GetProfile().SetLocalProfileInt("Setup", "Sound3D", m_sound->GetSound3D());
GetProfile().SetLocalProfileInt("Setup", "EditIndentMode", m_engine->GetEditIndentMode());
GetProfile().SetLocalProfileInt("Setup", "EditIndentValue", m_engine->GetEditIndentValue());
-
+
/* screen setup */
if (m_setupFull)
- GetProfile().SetLocalProfileInt("Setup", "Fullscreen", 1);
+ GetProfile().SetLocalProfileInt("Setup", "Fullscreen", 1);
else
- GetProfile().SetLocalProfileInt("Setup", "Fullscreen", 0);
-
+ GetProfile().SetLocalProfileInt("Setup", "Fullscreen", 0);
+
CList *pl;
CWindow *pw;
pw = static_cast<CWindow *>(m_interface->SearchControl(EVENT_WINDOW5));
- if ( pw != 0 ) {
- pl = static_cast<CList *>(pw->SearchControl(EVENT_LIST2));
- if ( pl != 0 ) {
- GetProfile().SetLocalProfileInt("Setup", "Resolution", pl->GetSelect());
- }
+ if ( pw != 0 )
+ {
+ pl = static_cast<CList *>(pw->SearchControl(EVENT_LIST2));
+ if ( pl != 0 )
+ {
+ GetProfile().SetLocalProfileInt("Setup", "Resolution", pl->GetSelect());
+ }
}
-
+ else
+ {
+ // TODO: Default value
+ }
+
std::stringstream key;
for (int i = 0; i < INPUT_SLOT_MAX; i++)
{
@@ -5726,7 +5811,7 @@ void CMainDialog::SetupRecall()
{
m_sound->SetMusicVolume(iValue);
}
-
+
if ( GetProfile().GetLocalProfileInt("Setup", "Sound3D", iValue) )
{
m_sound->SetSound3D(iValue == 1);
@@ -5774,13 +5859,15 @@ void CMainDialog::SetupRecall()
{
m_bDeleteGamer = iValue;
}
-
- if ( GetProfile().GetLocalProfileInt("Setup", "Resolution", iValue) ) {
- m_setupSelMode = iValue;
+
+ if ( GetProfile().GetLocalProfileInt("Setup", "Resolution", iValue) )
+ {
+ m_setupSelMode = iValue;
}
-
- if ( GetProfile().GetLocalProfileInt("Setup", "Fullscreen", iValue) ) {
- m_setupFull = (iValue == 1);
+
+ if ( GetProfile().GetLocalProfileInt("Setup", "Fullscreen", iValue) )
+ {
+ m_setupFull = (iValue == 1);
}
}
@@ -6545,7 +6632,7 @@ void CMainDialog::WriteGamerPerso(char *gamer)
if ( file == NULL ) return;
m_main->SetNumericLocale();
-
+
sprintf(line, "Head face=%d glasses=%d hair=%.2f;%.2f;%.2f;%.2f\n",
m_perso.face, m_perso.glasses,
m_perso.colorHair.r, m_perso.colorHair.g, m_perso.colorHair.b, m_perso.colorHair.a);
@@ -6557,7 +6644,7 @@ void CMainDialog::WriteGamerPerso(char *gamer)
fputs(line, file);
fclose(file);
-
+
m_main->RestoreNumericLocale();
}
@@ -6576,7 +6663,7 @@ void CMainDialog::ReadGamerPerso(char *gamer)
sprintf(filename, "%s/%s/face.gam", m_savegameDir.c_str(), gamer);
file = fopen(filename, "r");
if ( file == NULL ) return;
-
+
m_main->SetNumericLocale();
while ( fgets(line, 100, file) != NULL )
@@ -6610,7 +6697,7 @@ void CMainDialog::ReadGamerPerso(char *gamer)
}
fclose(file);
-
+
m_main->RestoreNumericLocale();
}
@@ -6797,3 +6884,4 @@ bool CMainDialog::NextMission()
} // namespace Ui
+
diff --git a/src/ui/maindialog.h b/src/ui/maindialog.h
index afdf94f..96aff2a 100644
--- a/src/ui/maindialog.h
+++ b/src/ui/maindialog.h
@@ -262,7 +262,7 @@ protected:
Math::Point m_partiPos[10];
SceneInfo m_sceneInfo[MAXSCENE];
-
+
std::vector<fs::path> m_saveList;
};
diff --git a/src/ui/mainmap.cpp b/src/ui/mainmap.cpp
index 1143a77..8c81160 100644
--- a/src/ui/mainmap.cpp
+++ b/src/ui/mainmap.cpp
@@ -55,7 +55,8 @@ void CMainMap::CreateMap()
Math::Point pos, dim;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW1));
- if (pw == nullptr) {
+ if (pw == nullptr)
+ {
pos.x = 0.0f;
pos.y = 0.0f;
dim.x = 0.0f;
@@ -106,7 +107,8 @@ void CMainMap::FloorColorMap(Gfx::Color floor, Gfx::Color water)
return;
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
- if (pm != nullptr) {
+ if (pm != nullptr)
+ {
pm->SetFloorColor(floor);
pm->SetWaterColor(water);
}
@@ -124,9 +126,12 @@ void CMainMap::ShowMap(bool bShow)
if (pw == nullptr)
return;
- if (bShow) {
+ if (bShow)
+ {
DimMap();
- } else {
+ }
+ else
+ {
pm = static_cast<CMap*>(pw->SearchControl(EVENT_OBJECT_MAP));
if (pm != nullptr)
pm->ClearState(STATE_VISIBLE);
@@ -164,7 +169,8 @@ void CMainMap::DimMap()
pm->SetDim(dim);
ps = static_cast<CSlider*>(pw->SearchControl(EVENT_OBJECT_MAPZOOM));
- if (ps != nullptr) {
+ if (ps != nullptr)
+ {
ps->SetState(STATE_VISIBLE, (m_mapMode != 0));
dim.x = SCROLL_WIDTH;
@@ -392,3 +398,4 @@ void CMainMap::SetHighlight(CObject* pObj)
}
+
diff --git a/src/ui/mainmap.h b/src/ui/mainmap.h
index 9d0d72f..9b20548 100644
--- a/src/ui/mainmap.h
+++ b/src/ui/mainmap.h
@@ -34,37 +34,37 @@ namespace Ui {
class CMainMap
{
- public:
- CMainMap();
- ~CMainMap();
-
- void UpdateMap();
- void CreateMap();
- void SetFixImage(const char *filename);
- void FloorColorMap(Gfx::Color floor, Gfx::Color water);
- void ShowMap(bool bShow);
- void DimMap();
- float GetZoomMap();
- void ZoomMap(float zoom);
- void ZoomMap();
- void MapEnable(bool bEnable);
- bool GetShowMap();
- bool GetFixImage();
- CObject* DetectMap(Math::Point pos, bool &bInMap);
- void SetHighlight(CObject* pObj);
- void SetToy(bool bToy);
- void SetFixParam(float zoom, float ox, float oy, float angle, int mode, bool bDebug);
-
- protected:
- void CenterMap();
-
- protected:
- CEventQueue* m_event;
- Gfx::CEngine* m_engine;
- CInterface* m_interface;
-
- int m_mapMode;
- bool m_bFixImage;
+public:
+ CMainMap();
+ ~CMainMap();
+
+ void UpdateMap();
+ void CreateMap();
+ void SetFixImage(const char *filename);
+ void FloorColorMap(Gfx::Color floor, Gfx::Color water);
+ void ShowMap(bool bShow);
+ void DimMap();
+ float GetZoomMap();
+ void ZoomMap(float zoom);
+ void ZoomMap();
+ void MapEnable(bool bEnable);
+ bool GetShowMap();
+ bool GetFixImage();
+ CObject* DetectMap(Math::Point pos, bool &bInMap);
+ void SetHighlight(CObject* pObj);
+ void SetToy(bool bToy);
+ void SetFixParam(float zoom, float ox, float oy, float angle, int mode, bool bDebug);
+
+protected:
+ void CenterMap();
+
+protected:
+ CEventQueue* m_event;
+ Gfx::CEngine* m_engine;
+ CInterface* m_interface;
+
+ int m_mapMode;
+ bool m_bFixImage;
};
}
diff --git a/src/ui/mainshort.h b/src/ui/mainshort.h
index d679eb0..b185aed 100644
--- a/src/ui/mainshort.h
+++ b/src/ui/mainshort.h
@@ -34,29 +34,30 @@ namespace Ui {
class CMainShort
{
- public:
- CMainShort();
- ~CMainShort();
-
- void SetMode(bool bBuilding);
- void FlushShortcuts();
- bool CreateShortcuts();
- bool UpdateShortcuts();
- void SelectShortcut(EventType event);
- void SelectNext();
- CObject* DetectShort(Math::Point pos);
- void SetHighlight(CObject* pObj);
-
- protected:
-
- protected:
- CEventQueue* m_event;
- Gfx::CEngine* m_engine;
- CInterface* m_interface;
- CRobotMain* m_main;
-
- CObject* m_shortcuts[20];
- bool m_bBuilding;
+public:
+ CMainShort();
+ ~CMainShort();
+
+ void SetMode(bool bBuilding);
+ void FlushShortcuts();
+ bool CreateShortcuts();
+ bool UpdateShortcuts();
+ void SelectShortcut(EventType event);
+ void SelectNext();
+ CObject* DetectShort(Math::Point pos);
+ void SetHighlight(CObject* pObj);
+
+protected:
+
+protected:
+ CEventQueue* m_event;
+ Gfx::CEngine* m_engine;
+ CInterface* m_interface;
+ CRobotMain* m_main;
+
+ CObject* m_shortcuts[20];
+ bool m_bBuilding;
};
}
+
diff --git a/src/ui/map.cpp b/src/ui/map.cpp
index 33d0fb1..c5f0062 100644
--- a/src/ui/map.cpp
+++ b/src/ui/map.cpp
@@ -187,14 +187,17 @@ bool CMap::EventProcess(const Event &event)
if ( event.type == EVENT_FRAME )
m_time += event.rTime;
- if ( event.type == EVENT_MOUSE_MOVE && Detect(event.mousePos) ) {
+ if ( event.type == EVENT_MOUSE_MOVE && Detect(event.mousePos) )
+ {
m_engine->SetMouseType(Gfx::ENG_MOUSE_NORM);
if ( DetectObject(event.mousePos, bInMap) != 0 )
m_engine->SetMouseType(Gfx::ENG_MOUSE_HAND);
}
- if ( event.type == EVENT_MOUSE_BUTTON_DOWN && event.mouseButton.button == MOUSE_BUTTON_LEFT ) {
- if ( CControl::Detect(event.mousePos) ) {
+ if ( event.type == EVENT_MOUSE_BUTTON_DOWN && event.mouseButton.button == MOUSE_BUTTON_LEFT )
+ {
+ if ( CControl::Detect(event.mousePos) )
+ {
SelectObject(event.mousePos);
return false;
}
@@ -228,11 +231,13 @@ void CMap::SetHighlight(CObject* pObj)
if ( pObj == nullptr )
return;
- for (int i = 0; i < MAPMAXOBJECT; i++) {
+ for (int i = 0; i < MAPMAXOBJECT; i++)
+ {
if ( !m_map[i].bUsed )
continue;
- if ( m_map[i].object == pObj ) {
+ if ( m_map[i].object == pObj )
+ {
m_highlightRank = i;
break;
}
@@ -262,7 +267,8 @@ CObject* CMap::DetectObject(Math::Point pos, bool &bInMap)
min = 10000.0f;
best = -1;
- for (int i = MAPMAXOBJECT - 1; i >= 0; i--) {
+ for (int i = MAPMAXOBJECT - 1; i >= 0; i--)
+ {
if ( !m_map[i].bUsed )
continue;
if ( m_map[i].color == MAPCOLOR_BBOX && !m_bRadar )
@@ -273,7 +279,8 @@ CObject* CMap::DetectObject(Math::Point pos, bool &bInMap)
dist = Math::Point(m_map[i].pos.x - pos.x, m_map[i].pos.y - pos.y).Length();
if ( dist > m_half / m_zoom * 8.0f / 100.0f )
continue; // too far?
- if ( dist < min ) {
+ if ( dist < min )
+ {
min = dist;
best = i;
}
@@ -337,13 +344,15 @@ void CMap::Draw()
if ( m_map[i].bUsed ) // selection:
DrawFocus(m_map[i].pos, m_map[i].dir, m_map[i].type, m_map[i].color);
- for ( i=0 ; i<m_totalFix ; i++ ) { // fixed objects:
+ for ( i=0 ; i<m_totalFix ; i++ ) // fixed objects:
+ {
if ( i == m_highlightRank )
continue;
DrawObject(m_map[i].pos, m_map[i].dir, m_map[i].type, m_map[i].color, false, false);
}
- for ( i=MAPMAXOBJECT-2 ; i>m_totalMove ; i-- ) { // moving objects:
+ for ( i=MAPMAXOBJECT-2 ; i>m_totalMove ; i-- ) // moving objects:
+ {
if ( i == m_highlightRank )
continue;
DrawObject(m_map[i].pos, m_map[i].dir, m_map[i].type, m_map[i].color, false, false);
@@ -353,7 +362,8 @@ void CMap::Draw()
if ( m_map[i].bUsed && i != m_highlightRank ) // selection:
DrawObject(m_map[i].pos, m_map[i].dir, m_map[i].type, m_map[i].color, true, false);
- if ( m_highlightRank != -1 && m_map[m_highlightRank].bUsed ) {
+ if ( m_highlightRank != -1 && m_map[m_highlightRank].bUsed )
+ {
i = m_highlightRank;
DrawObject(m_map[i].pos, m_map[i].dir, m_map[i].type, m_map[i].color, false, true);
DrawHighlight(m_map[i].pos);
@@ -375,23 +385,27 @@ Math::Point CMap::MapInter(Math::Point pos, float dir)
p1.y -= pos.y;
limit = m_mapPos.x + m_mapDim.x - pos.x;
- if ( p1.x > limit ) { // exceeds the right?
+ if ( p1.x > limit ) // exceeds the right?
+ {
p1.y = limit*p1.y/p1.x;
p1.x = limit;
}
limit = m_mapPos.y * 0.75f + m_mapDim.y * 0.75f - pos.y;
- if ( p1.y > limit ) { // exceeds the top?
+ if ( p1.y > limit ) // exceeds the top?
+ {
p1.x = limit * p1.x / p1.y;
p1.y = limit;
}
limit = m_mapPos.x - pos.x;
- if ( p1.x < limit ) { // exceeds the left?
+ if ( p1.x < limit ) // exceeds the left?
+ {
p1.y = limit * p1.y / p1.x;
p1.x = limit;
}
limit = m_mapPos.y * 0.75f - pos.y;
- if ( p1.y < limit ) { // exceeds the bottom?
+ if ( p1.y < limit ) // exceeds the bottom?
+ {
p1.x = limit * p1.x / p1.y;
p1.y = limit;
}
@@ -1152,7 +1166,7 @@ void CMap::UpdateObject(CObject* pObj)
pos.z = ppos.y;
dir += m_angle;
}
-
+
color = MAPCOLOR_NULL;
if ( type == OBJECT_BASE )
{
@@ -1303,3 +1317,4 @@ void CMap::UpdateObject(CObject* pObj)
}
}
+
diff --git a/src/ui/map.h b/src/ui/map.h
index 258dcdf..4ebe688 100644
--- a/src/ui/map.h
+++ b/src/ui/map.h
@@ -69,78 +69,79 @@ struct MapObject
class CMap : public CControl
{
- public:
- CMap();
- ~CMap();
-
- bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- bool EventProcess(const Event &event);
- void Draw();
-
- void UpdateTerrain();
- void UpdateTerrain(int bx, int by, int ex, int ey);
-
- void SetFixImage(const char *filename);
- bool GetFixImage();
-
- void SetOffset(float ox, float oy);
- void SetAngle(float angle);
- void SetMode(int mode);
- void SetToy(bool bToy);
- void SetDebug(bool bDebug);
-
- void SetZoom(float value);
- float GetZoom();
-
- void SetEnable(bool bEnable);
- bool GetEnable();
-
- void SetFloorColor(Gfx::Color color);
- void SetWaterColor(Gfx::Color color);
-
- void FlushObject();
- void UpdateObject(CObject* pObj);
-
- CObject* DetectObject(Math::Point pos, bool &bInMap);
- void SetHighlight(CObject* pObj);
-
- protected:
- Math::Point AdjustOffset(Math::Point offset);
- void SelectObject(Math::Point pos);
- Math::Point MapInter(Math::Point pos, float dir);
- void DrawFocus(Math::Point pos, float dir, ObjectType type, MapColor color);
- void DrawObject(Math::Point pos, float dir, ObjectType type, MapColor color, bool bSelect, bool bHilite);
- void DrawObjectIcon(Math::Point pos, Math::Point dim, MapColor color, ObjectType type, bool bHilite);
- void DrawHighlight(Math::Point pos);
- void DrawTriangle(Math::Point p1, Math::Point p2, Math::Point p3, Math::Point uv1, Math::Point uv2);
- void DrawPenta(Math::Point p1, Math::Point p2, Math::Point p3, Math::Point p4, Math::Point p5, Math::Point uv1, Math::Point uv2);
- void DrawVertex(Math::Point uv1, Math::Point uv2, float zoom);
-
- protected:
- Gfx::CTerrain* m_terrain;
- Gfx::CWater* m_water;
- CRobotMain* m_main;
-
- bool m_bEnable;
- float m_time;
- float m_half;
- float m_zoom;
- Math::Point m_offset;
- float m_angle;
- Gfx::Color m_floorColor;
- Gfx::Color m_waterColor;
- MapObject m_map[MAPMAXOBJECT];
- int m_totalFix;
- int m_totalMove;
- int m_highlightRank;
- Math::Point m_mapPos;
- Math::Point m_mapDim;
- bool m_bRadar;
- char m_fixImage[100];
- int m_mode;
- bool m_bToy;
- bool m_bDebug;
+public:
+ CMap();
+ ~CMap();
+
+ bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ bool EventProcess(const Event &event);
+ void Draw();
+
+ void UpdateTerrain();
+ void UpdateTerrain(int bx, int by, int ex, int ey);
+
+ void SetFixImage(const char *filename);
+ bool GetFixImage();
+
+ void SetOffset(float ox, float oy);
+ void SetAngle(float angle);
+ void SetMode(int mode);
+ void SetToy(bool bToy);
+ void SetDebug(bool bDebug);
+
+ void SetZoom(float value);
+ float GetZoom();
+
+ void SetEnable(bool bEnable);
+ bool GetEnable();
+
+ void SetFloorColor(Gfx::Color color);
+ void SetWaterColor(Gfx::Color color);
+
+ void FlushObject();
+ void UpdateObject(CObject* pObj);
+
+ CObject* DetectObject(Math::Point pos, bool &bInMap);
+ void SetHighlight(CObject* pObj);
+
+protected:
+ Math::Point AdjustOffset(Math::Point offset);
+ void SelectObject(Math::Point pos);
+ Math::Point MapInter(Math::Point pos, float dir);
+ void DrawFocus(Math::Point pos, float dir, ObjectType type, MapColor color);
+ void DrawObject(Math::Point pos, float dir, ObjectType type, MapColor color, bool bSelect, bool bHilite);
+ void DrawObjectIcon(Math::Point pos, Math::Point dim, MapColor color, ObjectType type, bool bHilite);
+ void DrawHighlight(Math::Point pos);
+ void DrawTriangle(Math::Point p1, Math::Point p2, Math::Point p3, Math::Point uv1, Math::Point uv2);
+ void DrawPenta(Math::Point p1, Math::Point p2, Math::Point p3, Math::Point p4, Math::Point p5, Math::Point uv1, Math::Point uv2);
+ void DrawVertex(Math::Point uv1, Math::Point uv2, float zoom);
+
+protected:
+ Gfx::CTerrain* m_terrain;
+ Gfx::CWater* m_water;
+ CRobotMain* m_main;
+
+ bool m_bEnable;
+ float m_time;
+ float m_half;
+ float m_zoom;
+ Math::Point m_offset;
+ float m_angle;
+ Gfx::Color m_floorColor;
+ Gfx::Color m_waterColor;
+ MapObject m_map[MAPMAXOBJECT];
+ int m_totalFix;
+ int m_totalMove;
+ int m_highlightRank;
+ Math::Point m_mapPos;
+ Math::Point m_mapDim;
+ bool m_bRadar;
+ char m_fixImage[100];
+ int m_mode;
+ bool m_bToy;
+ bool m_bDebug;
};
}
+
diff --git a/src/ui/scroll.cpp b/src/ui/scroll.cpp
index ff7451d..b3422ec 100644
--- a/src/ui/scroll.cpp
+++ b/src/ui/scroll.cpp
@@ -467,3 +467,4 @@ float CScroll::GetArrowStep()
}
}
+
diff --git a/src/ui/scroll.h b/src/ui/scroll.h
index 57d6f8f..c115aa4 100644
--- a/src/ui/scroll.h
+++ b/src/ui/scroll.h
@@ -34,51 +34,52 @@ const float SCROLL_WIDTH = (15.0f/640.0f);
class CScroll : public CControl
{
- public:
- CScroll();
- ~CScroll();
+public:
+ CScroll();
+ ~CScroll();
- bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- void SetPos(Math::Point pos);
- void SetDim(Math::Point dim);
+ void SetPos(Math::Point pos);
+ void SetDim(Math::Point dim);
- bool SetState(int state, bool bState);
- bool SetState(int state);
- bool ClearState(int state);
+ bool SetState(int state, bool bState);
+ bool SetState(int state);
+ bool ClearState(int state);
- bool EventProcess(const Event &event);
- void Draw();
+ bool EventProcess(const Event &event);
+ void Draw();
- void SetVisibleValue(float value);
- float GetVisibleValue();
+ void SetVisibleValue(float value);
+ float GetVisibleValue();
- void SetVisibleRatio(float value);
- float GetVisibleRatio();
+ void SetVisibleRatio(float value);
+ float GetVisibleRatio();
- void SetArrowStep(float step);
- float GetArrowStep();
+ void SetArrowStep(float step);
+ float GetArrowStep();
- protected:
- void MoveAdjust();
- void AdjustGlint();
- void DrawVertex(Math::Point pos, Math::Point dim, int icon);
+protected:
+ void MoveAdjust();
+ void AdjustGlint();
+ void DrawVertex(Math::Point pos, Math::Point dim, int icon);
- protected:
- CButton* m_buttonUp;
- CButton* m_buttonDown;
+protected:
+ CButton* m_buttonUp;
+ CButton* m_buttonDown;
- float m_visibleValue;
- float m_visibleRatio;
- float m_step;
+ float m_visibleValue;
+ float m_visibleRatio;
+ float m_step;
- bool m_bCapture;
- Math::Point m_pressPos;
- float m_pressValue;
+ bool m_bCapture;
+ Math::Point m_pressPos;
+ float m_pressValue;
- EventType m_eventUp;
- EventType m_eventDown;
+ EventType m_eventUp;
+ EventType m_eventDown;
};
}
+
diff --git a/src/ui/shortcut.cpp b/src/ui/shortcut.cpp
index 4462140..a01864a 100644
--- a/src/ui/shortcut.cpp
+++ b/src/ui/shortcut.cpp
@@ -128,7 +128,7 @@ void CShortcut::Draw()
if ( m_state & STATE_FRAME )
{
Math::Point p1, p2, c, uv1, uv2;
- float zoom, dp;
+ float dp;
m_engine->SetTexture("button2.png");
m_engine->SetState(Gfx::ENG_RSTATE_TTEXTURE_WHITE);
@@ -237,3 +237,4 @@ void CShortcut::DrawVertex(int icon, float zoom)
}
}
+
diff --git a/src/ui/shortcut.h b/src/ui/shortcut.h
index 7e7899e..6495ba0 100644
--- a/src/ui/shortcut.h
+++ b/src/ui/shortcut.h
@@ -27,22 +27,23 @@ namespace Ui {
class CShortcut : public CControl
{
- public:
- CShortcut();
- ~CShortcut();
+public:
+ CShortcut();
+ ~CShortcut();
- bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventType);
+ bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventType);
- bool EventProcess(const Event &event);
+ bool EventProcess(const Event &event);
- void Draw();
+ void Draw();
- protected:
- void DrawVertex(int icon, float zoom);
+protected:
+ void DrawVertex(int icon, float zoom);
- protected:
- float m_time;
+protected:
+ float m_time;
};
}
+
diff --git a/src/ui/slider.cpp b/src/ui/slider.cpp
index f516e70..33293d1 100644
--- a/src/ui/slider.cpp
+++ b/src/ui/slider.cpp
@@ -581,3 +581,4 @@ float CSlider::GetArrowStep()
}
+
diff --git a/src/ui/slider.h b/src/ui/slider.h
index 4912453..bc38aec 100644
--- a/src/ui/slider.h
+++ b/src/ui/slider.h
@@ -29,54 +29,55 @@ class CButton;
class CSlider : public CControl
{
- public:
- CSlider();
- ~CSlider();
+public:
+ CSlider();
+ ~CSlider();
- bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- void SetPos(Math::Point pos);
- void SetDim(Math::Point dim);
+ void SetPos(Math::Point pos);
+ void SetDim(Math::Point dim);
- bool SetState(int state, bool bState);
- bool SetState(int state);
- bool ClearState(int state);
+ bool SetState(int state, bool bState);
+ bool SetState(int state);
+ bool ClearState(int state);
- bool EventProcess(const Event &event);
- void Draw();
+ bool EventProcess(const Event &event);
+ void Draw();
- void SetLimit(float min, float max);
+ void SetLimit(float min, float max);
- void SetVisibleValue(float value);
- float GetVisibleValue();
+ void SetVisibleValue(float value);
+ float GetVisibleValue();
- void SetArrowStep(float step);
- float GetArrowStep();
+ void SetArrowStep(float step);
+ float GetArrowStep();
- protected:
- void MoveAdjust();
- void AdjustGlint();
- void DrawVertex(Math::Point pos, Math::Point dim, int icon);
+protected:
+ void MoveAdjust();
+ void AdjustGlint();
+ void DrawVertex(Math::Point pos, Math::Point dim, int icon);
- protected:
- CButton* m_buttonLeft;
- CButton* m_buttonRight;
+protected:
+ CButton* m_buttonLeft;
+ CButton* m_buttonRight;
- float m_min;
- float m_max;
- float m_visibleValue;
- float m_step;
+ float m_min;
+ float m_max;
+ float m_visibleValue;
+ float m_step;
- bool m_bHoriz;
- float m_marginButton;
+ bool m_bHoriz;
+ float m_marginButton;
- bool m_bCapture;
- Math::Point m_pressPos;
- float m_pressValue;
+ bool m_bCapture;
+ Math::Point m_pressPos;
+ float m_pressValue;
- EventType m_eventUp;
- EventType m_eventDown;
+ EventType m_eventUp;
+ EventType m_eventDown;
};
}
+
diff --git a/src/ui/studio.cpp b/src/ui/studio.cpp
index 1cedabb..e44a465 100644
--- a/src/ui/studio.cpp
+++ b/src/ui/studio.cpp
@@ -167,7 +167,7 @@ bool CStudio::EventProcess(const Event &event)
{
slider = static_cast< CSlider* >(pw->SearchControl(EVENT_STUDIO_SIZE));
if ( slider == nullptr ) return false;
- m_main->SetFontSize(9.0f+slider->GetVisibleValue()*6.0f);
+ m_main->SetFontSize(9.0f+slider->GetVisibleValue()*12.0f);
ViewEditScript();
}
@@ -904,7 +904,7 @@ void CStudio::SetInfoText(std::string text, bool bClickable)
if ( list == 0 ) return;
list->Flush(); // just text
- list->SetName(0, text.c_str());
+ list->SetItemName(0, text.c_str());
if ( text[0] == 0 ) bClickable = false;
list->SetSelectCap(bClickable);
@@ -1397,7 +1397,7 @@ void CStudio::UpdateChangeList()
pe = static_cast< CEdit* >(pw->SearchControl(EVENT_DIALOG_EDIT));
if ( pe == nullptr ) return;
- strcpy(name, pl->GetName(pl->GetSelect()));
+ strcpy(name, pl->GetItemName(pl->GetSelect()));
name[pe->GetMaxChar()] = 0; // truncates according lg max editable
p = strchr(name, '\t'); // seeks first tab
if ( p != 0 ) *p = 0;
@@ -1511,7 +1511,7 @@ void CStudio::UpdateDialogList()
fs::path path;
int i = 0;
char time[100];
-
+
pw = static_cast< CWindow* >(m_interface->SearchControl(EVENT_WINDOW9));
if ( pw == nullptr ) return;
pl = static_cast< CList* >(pw->SearchControl(EVENT_DIALOG_LIST));
@@ -1520,13 +1520,16 @@ void CStudio::UpdateDialogList()
path = fs::path(SearchDirectory(false));
fs::directory_iterator end_iter;
- if ( fs::exists(path) && fs::is_directory(path) ) {
- for( fs::directory_iterator file(path); file != end_iter; file++) {
- if (fs::is_regular_file(file->status()) ) {
+ if ( fs::exists(path) && fs::is_directory(path) )
+ {
+ for( fs::directory_iterator file(path); file != end_iter; file++)
+ {
+ if (fs::is_regular_file(file->status()) )
+ {
std::ostringstream temp;
TimeToAscii(fs::last_write_time(file->path()), time);
- temp << file->path().filename().string() << '\t' << fs::file_size(file->path()) << " \t" << time;
- pl->SetName(i++, temp.str().c_str());
+ temp << file->path().filename().string() << '\t' << fs::file_size(file->path()) << " \t" << time;
+ pl->SetItemName(i++, temp.str().c_str());
}
}
}
@@ -1538,15 +1541,19 @@ void CStudio::UpdateDialogList()
std::string CStudio::SearchDirectory(bool bCreate)
{
char dir[MAX_FNAME];
- if ( m_main->GetIOPublic() ) {
+ if ( m_main->GetIOPublic() )
+ {
sprintf(dir, "%s/", m_main->GetPublicDir());
- } else {
+ }
+ else
+ {
sprintf(dir, "%s/%s/Program/", m_main->GetSavegameDir(), m_main->GetGamerName());
}
-
+
fs::path path = fs::path(dir);
-
- if ( bCreate ) {
+
+ if ( bCreate )
+ {
fs::create_directory(path);
}
@@ -1629,3 +1636,4 @@ bool CStudio::WriteProgram()
}
}
+
diff --git a/src/ui/target.cpp b/src/ui/target.cpp
index cc74750..455c530 100644
--- a/src/ui/target.cpp
+++ b/src/ui/target.cpp
@@ -272,3 +272,4 @@ CObject* CTarget::DetectFriendObject(Math::Point pos)
}
}
+
diff --git a/src/ui/target.h b/src/ui/target.h
index 054524b..2344e59 100644
--- a/src/ui/target.h
+++ b/src/ui/target.h
@@ -36,19 +36,20 @@ namespace Ui {
class CTarget : public CControl
{
- public:
- CTarget();
- ~CTarget();
+public:
+ CTarget();
+ ~CTarget();
- bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
+ bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventMsg);
- bool EventProcess(const Event &event);
- void Draw();
- bool GetTooltip(Math::Point pos, std::string &name);
+ bool EventProcess(const Event &event);
+ void Draw();
+ bool GetTooltip(Math::Point pos, std::string &name);
- protected:
- CObject* DetectFriendObject(Math::Point pos);
+protected:
+ CObject* DetectFriendObject(Math::Point pos);
};
}
+
diff --git a/src/ui/window.cpp b/src/ui/window.cpp
index 69ef857..8005939 100644
--- a/src/ui/window.cpp
+++ b/src/ui/window.cpp
@@ -576,12 +576,12 @@ bool CWindow::GetTooltip(Math::Point pos, std::string &name)
// Specifies the name for the title bar.
-void CWindow::SetName(std::string name)
+void CWindow::SetName(std::string name, bool tooltip)
{
CButton* pc;
bool bAdjust;
- CControl::SetName(name);
+ CControl::SetName(name, tooltip);
if ( m_buttonReduce != 0 )
{
@@ -1579,3 +1579,4 @@ void CWindow::DrawHach(Math::Point pos, Math::Point dim)
}
}
+
diff --git a/src/ui/window.h b/src/ui/window.h
index e39b8a9..87805e2 100644
--- a/src/ui/window.h
+++ b/src/ui/window.h
@@ -83,7 +83,7 @@ public:
EventType GetEventTypeFull();
EventType GetEventTypeClose();
- void SetName(std::string name);
+ virtual void SetName(std::string name, bool tooltip = true) override;
void SetTrashEvent(bool bTrash);
bool GetTrashEvent();
@@ -151,3 +151,4 @@ protected:
}
+
diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt
index fbe9e7c..3b983ca 100644
--- a/test/unit/CMakeLists.txt
+++ b/test/unit/CMakeLists.txt
@@ -89,6 +89,7 @@ ${SRC_DIR}/object/motion/motionspider.cpp
${SRC_DIR}/object/motion/motiontoto.cpp
${SRC_DIR}/object/motion/motionvehicle.cpp
${SRC_DIR}/object/motion/motionworm.cpp
+${SRC_DIR}/object/motion/motiondummy.cpp
${SRC_DIR}/object/object.cpp
${SRC_DIR}/object/objman.cpp
${SRC_DIR}/object/robotmain.cpp
@@ -117,6 +118,7 @@ ${SRC_DIR}/physics/physics.cpp
${SRC_DIR}/script/cbottoken.cpp
${SRC_DIR}/script/cmdtoken.cpp
${SRC_DIR}/script/script.cpp
+${SRC_DIR}/sound/sound.cpp
${SRC_DIR}/ui/button.cpp
${SRC_DIR}/ui/check.cpp
${SRC_DIR}/ui/color.cpp
@@ -176,6 +178,7 @@ set(UT_SOURCES
main.cpp
app/app_test.cpp
graphics/engine/lightman_test.cpp
+math/func_test.cpp
math/geometry_test.cpp
math/matrix_test.cpp
math/vector_test.cpp
@@ -227,7 +230,7 @@ ${LIBSNDFILE_LIBRARY}
add_executable(colobot_ut ${COLOBOT_SOURCES} ${UT_SOURCES} ${OPENAL_SOURCES})
target_link_libraries(colobot_ut ${LIBS})
-#add_test(colobot_ut ./colobot_ut)
+add_test(colobot_ut ./colobot_ut)
# TODO: change the unit cases to independent automated tests to be included in colobot_ut
add_subdirectory(common)
diff --git a/test/unit/math/func_test.cpp b/test/unit/math/func_test.cpp
new file mode 100644
index 0000000..00a564b
--- /dev/null
+++ b/test/unit/math/func_test.cpp
@@ -0,0 +1,55 @@
+// * This file is part of the COLOBOT source code
+// * Copyright (C) 2012, Polish Portal of Colobot (PPC)
+// *
+// * 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 3 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, see http://www.gnu.org/licenses/.
+
+/*
+ Unit tests for math functions.
+ */
+
+#include "math/func.h"
+
+#include "gtest/gtest.h"
+
+
+TEST(IsPowerOfTwo, TestDifferentValues)
+{
+ EXPECT_FALSE(Math::IsPowerOfTwo(0));
+ EXPECT_TRUE(Math::IsPowerOfTwo(1));
+ EXPECT_TRUE(Math::IsPowerOfTwo(2));
+ EXPECT_FALSE(Math::IsPowerOfTwo(3));
+ EXPECT_TRUE(Math::IsPowerOfTwo(4));
+
+ EXPECT_FALSE(Math::IsPowerOfTwo(31));
+ EXPECT_TRUE(Math::IsPowerOfTwo(32));
+ EXPECT_FALSE(Math::IsPowerOfTwo(33));
+
+ EXPECT_FALSE(Math::IsPowerOfTwo(1234));
+}
+
+TEST(NextPowerOfTwo, TestDifferentValues)
+{
+ EXPECT_EQ(2, Math::NextPowerOfTwo(2));
+ EXPECT_EQ(4, Math::NextPowerOfTwo(3));
+ EXPECT_EQ(4, Math::NextPowerOfTwo(4));
+ EXPECT_EQ(8, Math::NextPowerOfTwo(5));
+
+ EXPECT_EQ(8, Math::NextPowerOfTwo(7));
+ EXPECT_EQ(8, Math::NextPowerOfTwo(8));
+ EXPECT_EQ(16, Math::NextPowerOfTwo(9));
+
+ EXPECT_EQ(32, Math::NextPowerOfTwo(31));
+ EXPECT_EQ(32, Math::NextPowerOfTwo(32));
+ EXPECT_EQ(64, Math::NextPowerOfTwo(33));
+}
diff --git a/test/unit/ui/edit_test.cpp b/test/unit/ui/edit_test.cpp
index 428b66a..d4c36eb 100644
--- a/test/unit/ui/edit_test.cpp
+++ b/test/unit/ui/edit_test.cpp
@@ -17,7 +17,7 @@ public:
virtual void SetUp()
{
- m_robotMain = new CRobotMain(&m_app);
+ m_robotMain = new CRobotMain(&m_app, false);
m_engine = new Gfx::CEngine(nullptr);
diff --git a/test/unit/ui/stubs/app_stub.cpp b/test/unit/ui/stubs/app_stub.cpp
index 9b33e5e..960972f 100644
--- a/test/unit/ui/stubs/app_stub.cpp
+++ b/test/unit/ui/stubs/app_stub.cpp
@@ -21,7 +21,7 @@ CApplication::~CApplication()
{
}
-std::string CApplication::GetDataFilePath(DataDir /* dataDir */, const std::string& subpath)
+std::string CApplication::GetDataFilePath(DataDir /* dataDir */, const std::string& subpath) const
{
return subpath;
}
@@ -36,7 +36,7 @@ CEventQueue* CApplication::GetEventQueue()
return nullptr;
}
-std::string CApplication::GetDataDirPath()
+std::string CApplication::GetDataDirPath() const
{
return "";
}
@@ -46,7 +46,7 @@ Event CApplication::CreateUpdateEvent()
return Event(EVENT_NULL);
}
-char CApplication::GetLanguageChar()
+char CApplication::GetLanguageChar() const
{
return 'E';
}
diff --git a/test/unit/ui/stubs/robotmain_stub.cpp b/test/unit/ui/stubs/robotmain_stub.cpp
index 7988e9d..692f67f 100644
--- a/test/unit/ui/stubs/robotmain_stub.cpp
+++ b/test/unit/ui/stubs/robotmain_stub.cpp
@@ -3,7 +3,7 @@
template<> CRobotMain* CSingleton<CRobotMain>::m_instance = nullptr;
-CRobotMain::CRobotMain(CApplication* app)
+CRobotMain::CRobotMain(CApplication* app, bool loadProfile)
{
}
diff --git a/tools/fix-eof-eol.sh b/tools/fix-eof-eol.sh
new file mode 100755
index 0000000..a077c85
--- /dev/null
+++ b/tools/fix-eof-eol.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+# Formats files to have one newline at the end of file
+
+for file in $@; do
+awk '/^$/ { ws++; next; }
+
+{
+ for (i = 0; i < ws; ++i) { print ""; }
+ print $0;
+ ws = 0;
+}
+
+END {
+ print "";
+}' $file > ${file}.out && mv ${file}.out $file
+done
diff --git a/tools/git-grep-braces.sh b/tools/git-grep-braces.sh
new file mode 100755
index 0000000..85823ab
--- /dev/null
+++ b/tools/git-grep-braces.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+# Finds all "hanging" braces
+git grep -n -E '^( *[^ ]+)+[^@]\{\s*$' -- '*.cpp' '*.h'