SWIG/KConsole.i | 2 +- SWIG/KEventHandler.i | 2 +- SWIG/KWindow.i | 2 +- SWIG/KikiAction.i | 3 + SWIG/KikiBot.i | 8 +- SWIG/KikiController.i | 2 +- SWIG/KikiEvent.i | 2 +- SWIG/KikiGUI.i | 12 ++-- SWIG/KikiItems.i | 45 ++++++------- SWIG/KikiMutant.i | 2 +- SWIG/KikiObject.i | 4 +- SWIG/KikiPlayer.i | 6 +- SWIG/KikiPy_wrap.cpp | 6 +- SWIG/KikiPython.i | 4 +- SWIG/KikiSound.i | 2 +- SWIG/KikiText.i | 2 +- SWIG/KikiTypes.i | 4 +- SWIG/KikiWorld.i | 2 +- kodilib/linux/Makefile | 4 +- kodilib/src/handler/KEventHandler.cpp | 113 ++++++++++++-------------------- kodilib/src/handler/KPickable.h | 1 + kodilib/src/tools/KDisplayTools.cpp | 4 +- kodilib/src/tools/KDisplayTools.h | 2 +- kodilib/src/tools/KFileTools.cpp | 28 +++++--- kodilib/src/tools/KFileTools.h | 4 +- kodilib/src/tools/KIntrospection.h | 1 + kodilib/src/tools/KKeySymbols.h | 38 +++++----- kodilib/src/tools/KKeyTools.cpp | 6 +- kodilib/src/tools/KStringTools.cpp | 32 +++++----- kodilib/src/tools/KStringTools.h | 1 + kodilib/src/tools/KXMLTools.cpp | 21 +++--- kodilib/src/types/KKey.cpp | 4 +- kodilib/src/widgets/KButtonSymbols.h | 24 ++++---- kodilib/src/widgets/KFileNameField.cpp | 6 +- linux/Makefile | 19 +++--- py/config.py | 17 ++++-- py/kiki.cfg | 2 +- py/lang.py | 20 ++++-- py/lang/dutch.py | 18 +++-- py/lang/francaise.py | 77 ++++++++++++++++++++++ py/lang/russian.py | 81 +++++++++++++++++++++++ py/levelselection.py | 2 + py/setup.py | 2 +- py/world.py | 2 +- src/base/KikiAction.cpp | 16 ++++- src/base/KikiAction.h | 2 + src/base/KikiEvent.cpp | 9 +-- src/base/KikiPyAction.cpp | 19 ++++- src/bots/KikiPlayer.cpp | 11 +++ src/bots/KikiPlayer.h | 2 + src/gui/KikiCharacter.cpp | 79 ++++++++++++++++++++++- src/gui/KikiMenu.cpp | 20 +++++- src/gui/KikiMenu.h | 2 + src/gui/KikiScrollMenu.cpp | 11 +++ src/gui/KikiScrollMenu.h | 1 + src/gui/KikiText.cpp | 6 +- src/gui/KikiText.h | 3 +- src/gui/KikiTextLine.cpp | 2 +- src/main/KikiController.cpp | 5 +- src/main/KikiPython.cpp | 6 +- src/main/KikiPythonWidget.h | 1 + src/main/main.cpp | 9 +++ src/sound/KikiSound.cpp | 70 ++++++++++---------- src/world/KikiWorld.cpp | 1 + 64 files changed, 616 insertions(+), 298 deletions(-) diff --git a/SWIG/KConsole.i b/SWIG/KConsole.i index b7a5a2d..1a9aec3 100644 --- a/SWIG/KConsole.i +++ b/SWIG/KConsole.i @@ -1,6 +1,6 @@ // -------------------------------------------------------------------------------------------------------- -%nodefault; +%nodefault KConsole; class KConsole : public KWindow { diff --git a/SWIG/KEventHandler.i b/SWIG/KEventHandler.i index ed5c413..46b96f5 100644 --- a/SWIG/KEventHandler.i +++ b/SWIG/KEventHandler.i @@ -1,6 +1,6 @@ // -------------------------------------------------------------------------------------------------------- -%nodefault; +%nodefault KEventHandler; class KEventHandler { diff --git a/SWIG/KWindow.i b/SWIG/KWindow.i index 5a3bd94..1e6f355 100644 --- a/SWIG/KWindow.i +++ b/SWIG/KWindow.i @@ -1,6 +1,6 @@ // -------------------------------------------------------------------------------------------------------- -%nodefault; +%nodefault KWindow; class KWindow { diff --git a/SWIG/KikiAction.i b/SWIG/KikiAction.i index ac6a883..206f654 100644 --- a/SWIG/KikiAction.i +++ b/SWIG/KikiAction.i @@ -1,5 +1,8 @@ // -------------------------------------------------------------------------------------------------------- +%feature("pythonappend") KikiAction::KikiAction(KikiObject *) %{self.thisown = 0%} +%feature("pythonappend") KikiAction::KikiAction(KikiObject *, int id, const std::string &) %{self.thisown = 0%} + class KikiAction { public: // ........................................................................ PUBLIC diff --git a/SWIG/KikiBot.i b/SWIG/KikiBot.i index b6876be..4148251 100644 --- a/SWIG/KikiBot.i +++ b/SWIG/KikiBot.i @@ -1,6 +1,6 @@ // __________________________________________________________________________________________________ -%nodefault; +%nodefault KikiBotStatus; class KikiBotStatus { @@ -26,7 +26,7 @@ class KikiBotStatus }; // __________________________________________________________________________________________________ -%nodefault; +%nodefault KikiBotFume; class KikiBotFume : public KikiObject { @@ -36,7 +36,7 @@ class KikiBotFume : public KikiObject }; // __________________________________________________________________________________________________ -%nodefault; +%nodefault KikiBot; class KikiBot : public KikiObject { @@ -51,4 +51,4 @@ class KikiBot : public KikiObject void setMove ( bool ); KikiBotStatus * getStatus (); -}; \ No newline at end of file +}; diff --git a/SWIG/KikiController.i b/SWIG/KikiController.i index 3a7be2e..531a303 100644 --- a/SWIG/KikiController.i +++ b/SWIG/KikiController.i @@ -1,6 +1,6 @@ // __________________________________________________________________________________________________ -%nodefault; +%nodefault KikiController; class KikiController : public KEventHandler, public KikiActionObject { diff --git a/SWIG/KikiEvent.i b/SWIG/KikiEvent.i index 446cd96..b5d3a75 100644 --- a/SWIG/KikiEvent.i +++ b/SWIG/KikiEvent.i @@ -1,6 +1,6 @@ // -------------------------------------------------------------------------------------------------------- -%nodefault; +%feature("pythonappend") KikiEvent::KikiEvent(KikiObject *, const std::string &) %{self.thisown = 0%} class KikiEvent { diff --git a/SWIG/KikiGUI.i b/SWIG/KikiGUI.i index 1f0025c..69cb603 100644 --- a/SWIG/KikiGUI.i +++ b/SWIG/KikiGUI.i @@ -1,13 +1,13 @@ // __________________________________________________________________________________________________ -%nodefault; +%nodefault KikiGUI; class KikiGUI : public KWindow { }; // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiScreenText::KikiScreenText() %{self.thisown = 0%} class KikiScreenText : public KikiText, public KikiActionObject { @@ -21,7 +21,7 @@ class KikiScreenText : public KikiText, public KikiActionObject }; // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiMenu::KikiMenu() %{self.thisown = 0%} class KikiMenu : public KikiScreenText { @@ -35,7 +35,7 @@ class KikiMenu : public KikiScreenText }; // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiColumnMenu::KikiColumnMenu() %{self.thisown = 0%} class KikiColumnMenu : public KikiMenu { @@ -45,7 +45,7 @@ class KikiColumnMenu : public KikiMenu }; // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiScrollMenu::KikiScrollMenu() %{self.thisown = 0%} class KikiScrollMenu : public KikiColumnMenu { @@ -58,7 +58,7 @@ class KikiScrollMenu : public KikiColumnMenu }; // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiPageText::KikiPageText(const std::string &, bool) %{self.thisown = 0%} class KikiPageText : public KikiScreenText { diff --git a/SWIG/KikiItems.i b/SWIG/KikiItems.i index 399a156..a80de09 100644 --- a/SWIG/KikiItems.i +++ b/SWIG/KikiItems.i @@ -1,7 +1,4 @@ - // __________________________________________________________________________________________________ -%nodefault; - class KikiFace { public: // ........................................................................ PUBLIC @@ -10,7 +7,7 @@ class KikiFace }; // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiWire::KikiWire() %{self.thisown = 0%} class KikiWire : public KikiObject { @@ -33,7 +30,7 @@ class KikiWire : public KikiObject %} // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiGear::KikiGear() %{self.thisown = 0%} class KikiGear : public KikiObject, public KikiFace { @@ -55,7 +52,7 @@ class KikiGear : public KikiObject, public KikiFace %} // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiValve::KikiValve() %{self.thisown = 0%} class KikiValve : public KikiObject, public KikiFace { @@ -74,7 +71,7 @@ class KikiValve : public KikiObject, public KikiFace %} // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiMotorCylinder::KikiMotorCylinder() %{self.thisown = 0%} class KikiMotorCylinder : public KikiObject { @@ -85,7 +82,7 @@ class KikiMotorCylinder : public KikiObject }; // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiMotorGear::KikiMotorGear() %{self.thisown = 0%} class KikiMotorGear : public KikiGear { @@ -96,7 +93,7 @@ class KikiMotorGear : public KikiGear }; // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiGenerator::KikiGenerator() %{self.thisown = 0%} class KikiGenerator : public KikiGear { @@ -107,7 +104,7 @@ class KikiGenerator : public KikiGear }; // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiLight::KikiLight() %{self.thisown = 0%} class KikiLight : public KikiObject { @@ -126,7 +123,7 @@ class KikiLight : public KikiObject %} // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiCellText::KikiCellText(const std::string &) %{self.thisown = 0%} class KikiCellText : public KikiObject, public KikiText { @@ -146,7 +143,7 @@ class KikiCellText : public KikiObject, public KikiText %} // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiStone::KikiStone() %{self.thisown = 0%} class KikiStone : public KikiObject { @@ -164,7 +161,7 @@ class KikiStone : public KikiObject %} // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiWireStone::KikiWireStone() %{self.thisown = 0%} class KikiWireStone : public KikiStone { @@ -182,7 +179,7 @@ class KikiWireStone : public KikiStone %} // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiWall::KikiWall() %{self.thisown = 0%} class KikiWall : public KikiObject { @@ -200,7 +197,7 @@ class KikiWall : public KikiObject %} // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiBomb::KikiBomb() %{self.thisown = 0%} class KikiBomb : public KikiObject { @@ -218,7 +215,7 @@ class KikiBomb : public KikiObject %} // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiSwitch::KikiSwitch() %{self.thisown = 0%} class KikiSwitch : public KikiObject { @@ -240,7 +237,7 @@ class KikiSwitch : public KikiObject %} // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiGate::KikiGate() %{self.thisown = 0%} class KikiGate : public KikiSwitch { @@ -258,7 +255,7 @@ class KikiGate : public KikiSwitch %} // __________________________________________________________________________________________________ -%nodefault; +%nodefaultctor KikiAtom; class KikiAtom : public KikiObject { @@ -269,7 +266,7 @@ class KikiAtom : public KikiObject }; // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiMovesAtom::KikiMovesAtom() %{self.thisown = 0%} class KikiMovesAtom : public KikiAtom { @@ -279,7 +276,7 @@ class KikiMovesAtom : public KikiAtom // __________________________________________________________________________________________________ /* -%nodefault; +%feature("pythonappend") KikiHealthAtom::KikiHealthAtom() %{self.thisown = 0%} class KikiHealthAtom : public KikiAtom { @@ -297,7 +294,7 @@ class KikiHealthAtom : public KikiAtom %} // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiEnergyAtom::KikiEnergyAtom() %{self.thisown = 0%} class KikiEnergyAtom : public KikiAtom { @@ -315,6 +312,8 @@ class KikiEnergyAtom : public KikiAtom %} */ // __________________________________________________________________________________________________ +%feature("pythonappend") KikiValueAtom::KikiValueAtom() %{self.thisown = 0%} + class KikiValueAtom : public KikiAtom { public: // ........................................................................ PUBLIC @@ -325,7 +324,7 @@ class KikiValueAtom : public KikiAtom }; // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiSpikes::KikiSpikes() %{self.thisown = 0%} class KikiSpikes : public KikiObject { @@ -343,7 +342,7 @@ class KikiSpikes : public KikiObject %} // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiBullet::KikiBullet() %{self.thisown = 0%} class KikiBullet : public KikiObject { diff --git a/SWIG/KikiMutant.i b/SWIG/KikiMutant.i index 49e0915..8c06da2 100644 --- a/SWIG/KikiMutant.i +++ b/SWIG/KikiMutant.i @@ -1,6 +1,6 @@ // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiMutant::KikiMutant() %{self.thisown = 0%} class KikiMutant : public KikiBot { diff --git a/SWIG/KikiObject.i b/SWIG/KikiObject.i index 91ab2d4..14d02bf 100644 --- a/SWIG/KikiObject.i +++ b/SWIG/KikiObject.i @@ -1,6 +1,6 @@ // __________________________________________________________________________________________________ -%nodefault; +%nodefault KikiActionObject; class KikiActionObject { @@ -21,7 +21,7 @@ class KikiActionObject }; // __________________________________________________________________________________________________ -%nodefault; +%nodefault KikiObject; class KikiObject : public KikiActionObject { diff --git a/SWIG/KikiPlayer.i b/SWIG/KikiPlayer.i index b9af1de..140fd4c 100644 --- a/SWIG/KikiPlayer.i +++ b/SWIG/KikiPlayer.i @@ -1,6 +1,6 @@ // __________________________________________________________________________________________________ -%nodefault; +%nodefault KikiStatusDisplay; class KikiStatusDisplay { @@ -11,7 +11,7 @@ class KikiStatusDisplay }; // __________________________________________________________________________________________________ -%nodefault; +%nodefault KikiPlayback; class KikiPlayback { @@ -22,7 +22,7 @@ class KikiPlayback }; // __________________________________________________________________________________________________ -%nodefault; +%nodefault KikiPlayer; class KikiPlayer : public KikiBot { diff --git a/SWIG/KikiPy_wrap.cpp b/SWIG/KikiPy_wrap.cpp index 233d68d..0def2b4 100644 --- a/SWIG/KikiPy_wrap.cpp +++ b/SWIG/KikiPy_wrap.cpp @@ -1206,7 +1206,7 @@ type_error: obj = pyobj; if (PyCFunction_Check(obj)) { /* here we get the method pointer for callbacks */ - char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); + const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); c = doc ? strstr(doc, "swig_ptr: ") : 0; if (c) { c = ty ? SWIG_UnpackVoidPtr(c + 10, &vptr, ty->name) : 0; @@ -16309,11 +16309,11 @@ extern "C" { swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { - char *c = methods[i].ml_doc; + const char *c = methods[i].ml_doc; if (c && (c = strstr(c, "swig_ptr: "))) { int j; swig_const_info *ci = 0; - char *name = c + 10; + const char *name = c + 10; for (j = 0; const_table[j].type; ++j) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { diff --git a/SWIG/KikiPython.i b/SWIG/KikiPython.i index 9cfbaf6..5320523 100644 --- a/SWIG/KikiPython.i +++ b/SWIG/KikiPython.i @@ -1,6 +1,6 @@ // -------------------------------------------------------------------------------------------------------- -%nodefault; +%nodefault KikiPythonWidget; class KikiPythonWidget { @@ -20,7 +20,7 @@ class KikiPythonWidget }; // -------------------------------------------------------------------------------------------------------- -%nodefault; +%nodefault KikiPython; class KikiPython : public KWindow { diff --git a/SWIG/KikiSound.i b/SWIG/KikiSound.i index 68e2f98..17860b9 100644 --- a/SWIG/KikiSound.i +++ b/SWIG/KikiSound.i @@ -1,6 +1,6 @@ // __________________________________________________________________________________________________ -%nodefault; +%nodefault KikiSound; class KikiSound { diff --git a/SWIG/KikiText.i b/SWIG/KikiText.i index f6205ea..6f1e502 100644 --- a/SWIG/KikiText.i +++ b/SWIG/KikiText.i @@ -1,6 +1,6 @@ // __________________________________________________________________________________________________ -%nodefault; +%feature("pythonappend") KikiText::KikiText() %{self.thisown = 0%} class KikiText { diff --git a/SWIG/KikiTypes.i b/SWIG/KikiTypes.i index 785d7f4..c3c455a 100644 --- a/SWIG/KikiTypes.i +++ b/SWIG/KikiTypes.i @@ -149,7 +149,7 @@ class KColor }; // -------------------------------------------------------------------------------------------------------- -%nodefault; +%nodefault KProjection; class KProjection { @@ -163,7 +163,7 @@ class KProjection }; // -------------------------------------------------------------------------------------------------------- -%nodefault; +%nodefault KKey; struct KKey { diff --git a/SWIG/KikiWorld.i b/SWIG/KikiWorld.i index 0df1e8a..d762d5f 100644 --- a/SWIG/KikiWorld.i +++ b/SWIG/KikiWorld.i @@ -1,6 +1,6 @@ // __________________________________________________________________________________________________ -%nodefault; +%nodefault KikiWorld; class KikiWorld { diff --git a/kodilib/linux/Makefile b/kodilib/linux/Makefile index dae1949..d5b853a 100644 --- a/kodilib/linux/Makefile +++ b/kodilib/linux/Makefile @@ -21,7 +21,7 @@ KODI_INCLUDES = -I $(KODISRCDIR)/handler -I $(KODISRCDIR)/tools -I $(KODISRCDIR) INCLUDES = $(KODI_INCLUDES) $(X11_INCLUDES) $(SDL_INCLUDES) -CXXFLAGS = $(INCLUDES) $(SDL_CFLAGS) +CXXOPTS = $(INCLUDES) $(SDL_CFLAGS) $(CXXFLAGS) src = \ $(KODISRCDIR)/handler/KEventHandler.cpp \ @@ -95,4 +95,4 @@ clean: $(RM) -f $(obj) libkodi.a %.o: %.cpp - $(CXX) -c $(CXXFLAGS) -o $@ $< + $(CXX) -c $(CXXOPTS) -o $@ $< diff --git a/kodilib/src/handler/KEventHandler.cpp b/kodilib/src/handler/KEventHandler.cpp index 9b12529..9916611 100644 --- a/kodilib/src/handler/KEventHandler.cpp +++ b/kodilib/src/handler/KEventHandler.cpp @@ -226,86 +226,55 @@ KSize KEventHandler::getScreenSize () // -------------------------------------------------------------------------------------------------------- bool KEventHandler::setScreenSize ( int width, int height, bool fullscreen ) { - int flags = SDL_OPENGL; // | SDL_ANYFORMAT; - if (fullscreen) - { - flags |= SDL_FULLSCREEN; - } - else - { - flags |= SDL_RESIZABLE; - } - - if (SDL_VideoModeOK (width, height, 32, flags) == 0) // video mode not ok + // For fullscreen mode the requested resolution is ignore, we'll pick what + // SDL thinks is best. + + int baseFlags = SDL_OPENGL; + + if (fullscreen) { - if (fullscreen) + int flags = baseFlags | SDL_FULLSCREEN; + KSize fallbackSize = getScreenSize(); + + SDL_Rect ** modes = SDL_ListModes (NULL, flags); + + if (modes != 0 && modes != (SDL_Rect **)-1) { - switch (width) - { - case 1600: - KConsole::printf ("couldn't set video mode %dx%d:\ntrying to fallback to 1280x1024 mode", width, height); - return setScreenSize (1280, 1024, true); - case 1280: - KConsole::printf ("couldn't set video mode %dx%d:\ntrying to fallback to 1024x768 mode", width, height); - return setScreenSize (1024, 768, true); - case 1024: - KConsole::printf ("couldn't set video mode %dx%d:\ntrying to fallback to 800x600 mode", width, height); - return setScreenSize (800, 600, true); - default: - break; - } - - // fallback to window mode - KConsole::printf ("couldn't set video mode %dx%d (%s) test failed", - width, height, - fullscreen ? "fullscreen" : "window"); - KConsole::printf ("trying to fallback to window mode"); - return setScreenSize (width, height, false); + for (int i = 0; modes[i]; ++i) + { + if (SDL_SetVideoMode (modes[i]->w, modes[i]->h, 0, flags) != NULL) + { + // notify interested receivers that the resolution changed + notification_center.notifyReceiversType(KDL_NOTIFICATION_TYPE_VIDEO_MODE_CHANGED); + return true; + } + + KConsole::printf ("couldn't change vidoe mode %dx%d (fullscreen):\n%s", + modes[i]->w, modes[i]->h, SDL_GetError()); + } } else { - KConsole::printError( kStringPrintf("couldn't set video mode %dx%d (window test failed)", width, height)); - return false; + KConsole::printf ("SDL didn't give us a list of video modes"); } + + // fallback to window mode + KConsole::printf ("trying to fallback to window mode"); + width = fallbackSize.w; + height = fallbackSize.h; } - - if (SDL_SetVideoMode (width, height, 32, flags) == NULL) // paranoid + + int flags = baseFlags | SDL_RESIZABLE; + if (SDL_SetVideoMode (width, height, 0, flags) != NULL) { - if (fullscreen) - { - switch (width) - { - case 1600: - KConsole::printf ("couldn't init video mode %dx%d:\ntrying to fallback to 1280x1024 mode", width, height); - return setScreenSize (1280, 1024, true); - case 1280: - KConsole::printf ("couldn't init video mode %dx%d:\ntrying to fallback to 1024x768 mode", width, height); - return setScreenSize (1024, 768, true); - case 1024: - KConsole::printf ("couldn't init video mode %dx%d:\ntrying to fallback to 800x600 mode", width, height); - return setScreenSize (800, 600, true); - default: - break; - } - - // fallback to window mode - KConsole::printf ("couldn't change video mode %dx%d (fullscreen setting failed)", width, height); - KConsole::printf ("trying to fallback to window mode"); - return setScreenSize (width, height, false); - } - else - { - KConsole::printError(kStringPrintf("couldn't change video mode %dx%d (%s):\n%s\n", - width, height, - fullscreen ? "fullscreen" : "window", SDL_GetError()), true); - return false; - } + // notify interested receivers that the resolution changed + notification_center.notifyReceiversType(KDL_NOTIFICATION_TYPE_VIDEO_MODE_CHANGED); + return true; } - // notify interested receivers that the resolution changed - notification_center.notifyReceiversType(KDL_NOTIFICATION_TYPE_VIDEO_MODE_CHANGED); - - return true; + KConsole::printError(kStringPrintf("couldn't change video mode %dx%d (window):\n%s\n", + width, height, SDL_GetError()), true); + return false; } // -------------------------------------------------------------------------------------------------------- @@ -332,7 +301,7 @@ void KEventHandler::setFullscreen ( bool fullscreen ) return; } // check if resolution is restricted - if (modes != (SDL_Rect **)-1) + if (modes == (SDL_Rect **)-1) { // all resolutions available width = 1024; @@ -359,7 +328,7 @@ void KEventHandler::setFullscreen ( bool fullscreen ) return; } // check if resolution is restricted - if (modes != (SDL_Rect **)-1) + if (modes == (SDL_Rect **)-1) { // all resolutions available width = 1024; diff --git a/kodilib/src/handler/KPickable.h b/kodilib/src/handler/KPickable.h index 8b2d132..89f469c 100644 --- a/kodilib/src/handler/KPickable.h +++ b/kodilib/src/handler/KPickable.h @@ -8,6 +8,7 @@ #include "KIntrospection.h" #include +#include #define DEBUG_PICKING false diff --git a/kodilib/src/tools/KDisplayTools.cpp b/kodilib/src/tools/KDisplayTools.cpp index d3a4473..352cedf 100644 --- a/kodilib/src/tools/KDisplayTools.cpp +++ b/kodilib/src/tools/KDisplayTools.cpp @@ -38,7 +38,7 @@ SDL_PixelFormat KDL_PIXEL_FORMAT = { }; // -------------------------------------------------------------------------------------------------------- -int kDisplayXPMIcon ( char ** xpmData, const KPosition & pos ) +int kDisplayXPMIcon ( const char ** xpmData, const KPosition & pos ) { glPushAttrib(GL_PIXEL_MODE_BIT); @@ -49,7 +49,7 @@ int kDisplayXPMIcon ( char ** xpmData, const KPosition & pos ) glPixelTransferf(GL_GREEN_SCALE, color[1]); glPixelTransferf(GL_BLUE_SCALE, color[2]); - SDL_Surface * xpmSurface = IMG_ReadXPMFromArray (xpmData); + SDL_Surface * xpmSurface = IMG_ReadXPMFromArray (const_cast(xpmData)); if (xpmSurface == NULL) { KConsole::printError("kDisplayXPMIcon: IMG_ReadXPMFromArray failed"); diff --git a/kodilib/src/tools/KDisplayTools.h b/kodilib/src/tools/KDisplayTools.h index f4b87ed..d50a046 100644 --- a/kodilib/src/tools/KDisplayTools.h +++ b/kodilib/src/tools/KDisplayTools.h @@ -15,7 +15,7 @@ void kDisplayString ( const std::string &, const KPosition &, bool = true ); void kDisplayString ( const std::string &, const KVector &, void * ); -int kDisplayXPMIcon ( char ** xpmData, const KPosition & pos ); +int kDisplayXPMIcon ( const char ** xpmData, const KPosition & pos ); void kDisplayWireSphere ( float radius = 0.5, int subdivisions = 8); void kDisplaySolidSphere ( float radius = 0.5, int subdivisions = 8); void kDisplaySolidCube ( float sidelength = 1.0); diff --git a/kodilib/src/tools/KFileTools.cpp b/kodilib/src/tools/KFileTools.cpp index 60ddc7e..a8a1ee1 100644 --- a/kodilib/src/tools/KFileTools.cpp +++ b/kodilib/src/tools/KFileTools.cpp @@ -7,7 +7,9 @@ #include "KConsole.h" #include "KStringTools.h" +#ifdef WIN32 #pragma warning(disable:4786) +#endif #include // open #include // stat @@ -42,15 +44,21 @@ string kFileJoinPaths ( const string & path1, const string & path2 ) // -------------------------------------------------------------------------------------------------------- string kFileGetCurrentPath () { -#ifndef WIN32 +#ifdef _GNU_SOURCE + char * buffer = get_current_dir_name(); + string current_path(buffer); + free(buffer); + return current_path; +#else + #ifndef WIN32 char buffer[MAXPATHLEN+1]; getwd(buffer); -#else - char buffer[MAX_PATH+1]; - getcwd(buffer, MAX_PATH+1); -#endif - + #else + char buffer[MAX_PATH+1]; + getcwd(buffer, MAX_PATH+1); + #endif return string(buffer); +#endif } // -------------------------------------------------------------------------------------------------------- @@ -214,8 +222,8 @@ string kFileAbsPathName ( const string & path ) // -------------------------------------------------------------------------------------------------------- string kFileSuffix ( const string & path ) { - unsigned int lastDotPos = path.rfind("."); - unsigned int lastSlashPos = path.rfind(kPathSep); + std::string::size_type lastDotPos = path.rfind("."); + std::string::size_type lastSlashPos = path.rfind(kPathSep); if (lastDotPos < path.size() - 1 && (lastDotPos > lastSlashPos || lastSlashPos == string::npos)) { @@ -228,7 +236,7 @@ string kFileSuffix ( const string & path ) string kFileDirName ( const string & path ) { string native = kFileNativePath(path); - unsigned int lastSlashPos = native.rfind(kPathSep); + std::string::size_type lastSlashPos = native.rfind(kPathSep); if (lastSlashPos < native.size()) { return native.substr(0, lastSlashPos+1); @@ -241,7 +249,7 @@ string kFileBaseName ( const string & path, bool removeSuffix ) { string native = kFileNativePath(path); string baseName = native; - unsigned int lastSlashPos = native.rfind(kPathSep); + std::string::size_type lastSlashPos = native.rfind(kPathSep); if (lastSlashPos < native.size() - 1) { baseName = native.substr(lastSlashPos+1); diff --git a/kodilib/src/tools/KFileTools.h b/kodilib/src/tools/KFileTools.h index 37320e8..1993d45 100644 --- a/kodilib/src/tools/KFileTools.h +++ b/kodilib/src/tools/KFileTools.h @@ -6,7 +6,9 @@ #ifndef __KFileTools #define __KFileTools +#ifdef WIN32 #pragma warning(disable:4786) +#endif #include #include @@ -35,4 +37,4 @@ bool kFileWriteStringToFile ( const string &, const string & ); string kFileJoinPaths ( const string &, const string & ); string kFileNativePath ( const string & ); -#endif \ No newline at end of file +#endif diff --git a/kodilib/src/tools/KIntrospection.h b/kodilib/src/tools/KIntrospection.h index c2a4b64..5af673a 100644 --- a/kodilib/src/tools/KIntrospection.h +++ b/kodilib/src/tools/KIntrospection.h @@ -11,6 +11,7 @@ #endif #include +#include // -------------------------------------------------------------------------------------------------------- class KClassInfo diff --git a/kodilib/src/tools/KKeySymbols.h b/kodilib/src/tools/KKeySymbols.h index f85d23d..ae30b18 100644 --- a/kodilib/src/tools/KKeySymbols.h +++ b/kodilib/src/tools/KKeySymbols.h @@ -5,7 +5,7 @@ #ifndef __KKeySymbols #define __KKeySymbols -static char *KDL_KEY_ICON_META[] = +static const char *KDL_KEY_ICON_META[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -28,7 +28,7 @@ static char *KDL_KEY_ICON_META[] = ".###.....###.", }; -static char *KDL_KEY_ICON_ALT[] = +static const char *KDL_KEY_ICON_ALT[] = { // width height ncolors chars_per_pixel "17 13 2 1", @@ -51,7 +51,7 @@ static char *KDL_KEY_ICON_ALT[] = ".................", }; -static char *KDL_KEY_ICON_CTRL[] = +static const char *KDL_KEY_ICON_CTRL[] = { // width height ncolors chars_per_pixel "11 13 2 1", @@ -74,7 +74,7 @@ static char *KDL_KEY_ICON_CTRL[] = "...######..", }; -static char *KDL_KEY_ICON_SHIFT[] = +static const char *KDL_KEY_ICON_SHIFT[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -97,7 +97,7 @@ static char *KDL_KEY_ICON_SHIFT[] = "......#......", }; -static char *KDL_KEY_ICON_RETURN[] = +static const char *KDL_KEY_ICON_RETURN[] = { // width height ncolors chars_per_pixel "17 13 2 1", @@ -120,7 +120,7 @@ static char *KDL_KEY_ICON_RETURN[] = ".................", }; -static char *KDL_KEY_ICON_ENTER[] = +static const char *KDL_KEY_ICON_ENTER[] = { // width height ncolors chars_per_pixel "11 13 2 1", @@ -143,7 +143,7 @@ static char *KDL_KEY_ICON_ENTER[] = "...........", }; -static char *KDL_KEY_ICON_UP[] = +static const char *KDL_KEY_ICON_UP[] = { // width height ncolors chars_per_pixel "12 13 2 1", @@ -166,7 +166,7 @@ static char *KDL_KEY_ICON_UP[] = ".....##.....", }; -static char *KDL_KEY_ICON_DOWN[] = +static const char *KDL_KEY_ICON_DOWN[] = { // width height ncolors chars_per_pixel "12 13 2 1", @@ -189,7 +189,7 @@ static char *KDL_KEY_ICON_DOWN[] = ".....##.....", }; -static char *KDL_KEY_ICON_RIGHT[] = +static const char *KDL_KEY_ICON_RIGHT[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -212,7 +212,7 @@ static char *KDL_KEY_ICON_RIGHT[] = "......##.....", }; -static char *KDL_KEY_ICON_LEFT[] = +static const char *KDL_KEY_ICON_LEFT[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -235,7 +235,7 @@ static char *KDL_KEY_ICON_LEFT[] = ".....##......", }; -static char *KDL_KEY_ICON_HOME[] = +static const char *KDL_KEY_ICON_HOME[] = { // width height ncolors chars_per_pixel "11 13 2 1", @@ -258,7 +258,7 @@ static char *KDL_KEY_ICON_HOME[] = "...........", }; -static char *KDL_KEY_ICON_END[] = +static const char *KDL_KEY_ICON_END[] = { // width height ncolors chars_per_pixel "11 13 2 1", @@ -281,7 +281,7 @@ static char *KDL_KEY_ICON_END[] = "...........", }; -static char *KDL_KEY_ICON_PAGEUP[] = +static const char *KDL_KEY_ICON_PAGEUP[] = { // width height ncolors chars_per_pixel "12 13 2 1", @@ -304,7 +304,7 @@ static char *KDL_KEY_ICON_PAGEUP[] = ".....##.....", }; -static char *KDL_KEY_ICON_PAGEDOWN[] = +static const char *KDL_KEY_ICON_PAGEDOWN[] = { // width height ncolors chars_per_pixel "12 13 2 1", @@ -328,7 +328,7 @@ static char *KDL_KEY_ICON_PAGEDOWN[] = }; /* -static char *KDL_KEY_ICON_CAPSLOCK[] = +static const char *KDL_KEY_ICON_CAPSLOCK[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -352,7 +352,7 @@ static char *KDL_KEY_ICON_CAPSLOCK[] = }; */ -static char *KDL_KEY_ICON_BACKSPACE[] = +static const char *KDL_KEY_ICON_BACKSPACE[] = { // width height ncolors chars_per_pixel "19 13 2 1", @@ -375,7 +375,7 @@ static char *KDL_KEY_ICON_BACKSPACE[] = ".....##############", }; -static char *KDL_KEY_ICON_DELETE[] = +static const char *KDL_KEY_ICON_DELETE[] = { // width height ncolors chars_per_pixel "19 13 2 1", @@ -398,7 +398,7 @@ static char *KDL_KEY_ICON_DELETE[] = "##############.....", }; -static char *KDL_KEY_ICON_TAB[] = +static const char *KDL_KEY_ICON_TAB[] = { // width height ncolors chars_per_pixel "17 13 2 1", @@ -421,7 +421,7 @@ static char *KDL_KEY_ICON_TAB[] = "........##.....##", }; -static char *KDL_KEY_ICON_KP[] = +static const char *KDL_KEY_ICON_KP[] = { // width height ncolors chars_per_pixel "4 13 2 1", diff --git a/kodilib/src/tools/KKeyTools.cpp b/kodilib/src/tools/KKeyTools.cpp index b4a866d..cb9a3f6 100644 --- a/kodilib/src/tools/KKeyTools.cpp +++ b/kodilib/src/tools/KKeyTools.cpp @@ -170,7 +170,7 @@ int kKeyGetDisplayWidthForModifier ( const std::string & modName ) // -------------------------------------------------------------------------------------------------------- int kKeyGetDisplayWidthForKey ( const std::string & keyName ) { - unsigned int keyPos = keyName.find('_', 0); + std::string::size_type keyPos = keyName.find('_', 0); if (keyPos == std::string::npos) { return kKeyGetDisplayWidthForPureKey(keyName) + KDL_MOD_KEY_SPACING; @@ -313,7 +313,7 @@ int kKeyDisplayPureKey ( const std::string & keyName, const KPosition & pos ) int kKeyDisplayKey ( const std::string & keyName, const KPosition & pos ) { KPosition start = pos; - unsigned int keyPos = keyName.find('_', 0); + std::string::size_type keyPos = keyName.find('_', 0); if (keyPos == std::string::npos) { return start.x + kKeyDisplayPureKey(keyName, start) + KDL_MOD_KEY_SPACING; @@ -380,7 +380,7 @@ SDLMod kKeyGetModForModName ( const std::string & modName ) // -------------------------------------------------------------------------------------------------------- SDL_keysym kKeyGetKeysymForKeyName ( const std::string & keyName ) { - unsigned int pos = keyName.find('_'); + std::string::size_type pos = keyName.find('_'); std::string modString; std::string symString = keyName; diff --git a/kodilib/src/tools/KStringTools.cpp b/kodilib/src/tools/KStringTools.cpp index 6d4d51b..88d8c81 100644 --- a/kodilib/src/tools/KStringTools.cpp +++ b/kodilib/src/tools/KStringTools.cpp @@ -6,14 +6,14 @@ #include "KStringTools.h" #include "KVector.h" -#include // INT_MAX +#include // INT_MAX #include // -------------------------------------------------------------------------------------------------------- void kStringInsertStringBehindTags ( std::string & str, const std::string & insertString, const std::string & tag ) { - unsigned int oldPos = 0; + std::string::size_type oldPos = 0; while ((oldPos = str.find(tag, oldPos)) != std::string::npos) { oldPos += tag.size(); @@ -34,8 +34,8 @@ std::vector kStringGetComponents ( const std::string & str, const s { std::vector components; - unsigned int dividerLength = divider.size(); - unsigned int oldpos = 0, pos; + std::string::size_type dividerLength = divider.size(); + std::string::size_type oldpos = 0, pos; while ((pos = str.find(divider, oldpos)) != std::string::npos) { @@ -50,7 +50,7 @@ std::vector kStringGetComponents ( const std::string & str, const s // -------------------------------------------------------------------------------------------------------- void kStringReplace ( std::string & str, const std::string & toReplace, const std::string & replacement ) { - unsigned int pos = 0, chars = toReplace.size(); + std::string::size_type pos = 0, chars = toReplace.size(); while ((pos = str.find(toReplace, pos)) != std::string::npos) { str.replace(pos, chars, replacement); @@ -60,11 +60,11 @@ void kStringReplace ( std::string & str, const std::string & toReplace, const st // -------------------------------------------------------------------------------------------------------- void kStringReplaceTabs ( std::string & str, unsigned int tabWidth ) { - unsigned int tabPos; + std::string::size_type tabPos; while ((tabPos = str.find('\t')) != std::string::npos) { - unsigned int lastNewlinePos = str.rfind('\n', tabPos-1); - unsigned int relPos = (lastNewlinePos == std::string::npos) ? tabPos : tabPos - lastNewlinePos; + std::string::size_type lastNewlinePos = str.rfind('\n', tabPos-1); + std::string::size_type relPos = (lastNewlinePos == std::string::npos) ? tabPos : tabPos - lastNewlinePos; str.replace(tabPos, 1, std::string(tabWidth-(relPos % tabWidth), ' ')); } } @@ -114,7 +114,7 @@ unsigned int kStringCountChars ( const std::string & str, char c ) // -------------------------------------------------------------------------------------------------------- unsigned int kStringNthCharPos ( const std::string & str, unsigned int n, char c ) { - unsigned int loc = n, oloc = 0; + std::string::size_type loc = n, oloc = 0; while (n > 0 && (loc = str.find(c, oloc)) != std::string::npos) { n--; @@ -138,7 +138,7 @@ void kStringCropRows ( std::string & str, unsigned int rows ) // -------------------------------------------------------------------------------------------------------- void kStringCropCols ( std::string & str, unsigned int columns ) { - unsigned int oloc = 0, nloc = 0; + std::string::size_type oloc = 0, nloc = 0; while ((nloc = str.find('\n', oloc)) != std::string::npos) { if ((nloc - oloc) > columns) @@ -160,10 +160,10 @@ void kStringCropCols ( std::string & str, unsigned int columns ) unsigned int kStringCols ( const std::string & str ) { if (str.size() == 0) return 0; - int oloc = 0, nloc; + long oloc = 0, nloc; std::string substring; int maxlength = 0, length; - while ((nloc = str.find('\n', oloc)) != (int)std::string::npos) + while ((nloc = str.find('\n', oloc)) != (long)std::string::npos) { substring = str.substr(oloc, nloc - oloc); length = substring.size(); @@ -181,7 +181,7 @@ unsigned int kStringCols ( const std::string & str ) unsigned int kStringRows ( const std::string & str ) { if (str.size() == 0) return 1; - unsigned int loc = 0, lines = 0; + std::string::size_type loc = 0, lines = 0; while ((loc = str.find('\n', loc)) != std::string::npos) { lines++; loc++; } if (str[str.size()-1] == '\n') return lines; return lines+1; @@ -204,8 +204,8 @@ std::string kStringPrintf ( const std::string & fmt, va_list * argList ) { static char str[256]; std::string format(fmt), subformat, text; - unsigned int oloc = 0; - unsigned int nloc = 0; + std::string::size_type oloc = 0; + std::string::size_type nloc = 0; kStringReplaceTabs(format); @@ -260,7 +260,7 @@ std::string kStringPrintf ( const char * fmt ...) // -------------------------------------------------------------------------------------------------------- bool kStringHasSuffix ( const std::string & str, const std::string & suffix ) { - unsigned int result = str.rfind(suffix); + std::string::size_type result = str.rfind(suffix); if (result == std::string::npos) return false; return (result == str.size()-suffix.size()); } diff --git a/kodilib/src/tools/KStringTools.h b/kodilib/src/tools/KStringTools.h index 7c9f48b..22ad513 100644 --- a/kodilib/src/tools/KStringTools.h +++ b/kodilib/src/tools/KStringTools.h @@ -9,6 +9,7 @@ #include #include #include +#include // -------------------------------------------------------------------------------------------------------- diff --git a/kodilib/src/tools/KXMLTools.cpp b/kodilib/src/tools/KXMLTools.cpp index 832177a..d05975f 100644 --- a/kodilib/src/tools/KXMLTools.cpp +++ b/kodilib/src/tools/KXMLTools.cpp @@ -7,6 +7,7 @@ #include "KConsole.h" #include "KSeparatedMatrix.h" #include +#include // -------------------------------------------------------------------------------------------------------- std::string kXMLTag ( const std::string & name, const std::string & attributes, int depth ) @@ -58,11 +59,11 @@ std::string kXMLPrintf ( int depth, const char * fmt ...) std::string kXMLParseToTagsInVector ( std::string & xml, const std::vector & tags ) { std::string open("<"); - unsigned int minLoc = std::string::npos; + std::string::size_type minLoc = std::string::npos; std::vector::const_iterator iter = tags.begin(); while (iter != tags.end()) { - unsigned int loc = xml.find(open+(*iter)); + std::string::size_type loc = xml.find(open+(*iter)); if (loc < minLoc) minLoc = loc; iter++; } @@ -77,7 +78,7 @@ std::string kXMLReadNamedAttribute ( const std::string & xml, const std::string std::string value; std::string nameStr(name); nameStr += "='"; - unsigned int loc = xml.find(nameStr); + std::string::size_type loc = xml.find(nameStr); if (loc != std::string::npos) { loc += nameStr.size(); @@ -90,7 +91,7 @@ std::string kXMLReadNamedAttribute ( const std::string & xml, const std::string // -------------------------------------------------------------------------------------------------------- bool kXMLParseNamedCloseTag ( std::string & xml, const std::string & name, bool printError ) { - unsigned int loc = xml.find('<'); + std::string::size_type loc = xml.find('<'); if (loc == std::string::npos) { if (printError) KConsole::printError(kStringPrintf("invalid XML:\nmissing close tag '%s'", @@ -117,7 +118,7 @@ bool kXMLParseNamedCloseTag ( std::string & xml, const std::string & name, bool // -------------------------------------------------------------------------------------------------------- bool kXMLReadNamedOpenTag ( const std::string & xml, const std::string & name, std::string * attributes ) { - unsigned int loc = xml.find('<'), endloc; + std::string::size_type loc = xml.find('<'), endloc; if (loc == std::string::npos || xml[loc+1] == '/') return false; @@ -140,7 +141,7 @@ bool kXMLReadNamedOpenTag ( const std::string & xml, const std::string & name, s // -------------------------------------------------------------------------------------------------------- std::string kXMLParseNamedOpenTag ( std::string & xml, const std::string & name, std::string * attributes, bool printError ) { - unsigned int loc = xml.find('<'); + std::string::size_type loc = xml.find('<'); if (loc == std::string::npos || xml[loc+1] == '/') { if (printError) KConsole::printError(kStringPrintf("invalid XML:\nmissing tag '%s'", name.c_str())); @@ -191,7 +192,7 @@ std::string kXMLParseNamedOpenTag ( std::string & xml, const std::string & name, // -------------------------------------------------------------------------------------------------------- bool kXMLParseOpenTag ( std::string & xml, std::string & name, std::string * attributes, bool printError ) { - unsigned int loc = xml.find('<'); + std::string::size_type loc = xml.find('<'); if (loc == std::string::npos || xml[loc+1] == '/') { if (printError) KConsole::printError("invalid XML:\nmissing open tag"); @@ -295,7 +296,7 @@ std::string kXMLValue( const std::string & name, int type, const void * value, i // -------------------------------------------------------------------------------------------------------- bool kXMLParseValue( std::string & xml, const std::string & name, int type, void * value, bool printError ) { - unsigned int loc = xml.find('<'); + std::string::size_type loc = xml.find('<'); if (loc == std::string::npos || xml[loc+1] == '/') { if (printError) KConsole::printError(kStringPrintf("invalid XML:\nmissing value '%s'", name.c_str())); @@ -379,8 +380,8 @@ bool kXMLParseValue( std::string & xml, const std::string & name, int type, void } else if (typeString == "string") { - unsigned int first = substring.find("\"")+1; - unsigned int last = substring.rfind("\"", std::string::npos); + std::string::size_type first = substring.find("\"")+1; + std::string::size_type last = substring.rfind("\"", std::string::npos); *((std::string*)value) = substring.substr(first, last-first); } diff --git a/kodilib/src/types/KKey.cpp b/kodilib/src/types/KKey.cpp index 8a6dec5..b94a11e 100644 --- a/kodilib/src/types/KKey.cpp +++ b/kodilib/src/types/KKey.cpp @@ -31,7 +31,7 @@ KKey::KKey ( std::string keyName ) // -------------------------------------------------------------------------------------------------------- std::string KKey::getUnmodifiedName () const { - unsigned int keyPos = name.find('_', 0); + std::string::size_type keyPos = name.find('_', 0); if (keyPos == std::string::npos) { return name; @@ -42,7 +42,7 @@ std::string KKey::getUnmodifiedName () const // -------------------------------------------------------------------------------------------------------- std::string KKey::getModifierName () const { - unsigned int keyPos = name.find('_', 0); + std::string::size_type keyPos = name.find('_', 0); if (keyPos == std::string::npos) { return ""; diff --git a/kodilib/src/widgets/KButtonSymbols.h b/kodilib/src/widgets/KButtonSymbols.h index 34a32e8..0773e76 100644 --- a/kodilib/src/widgets/KButtonSymbols.h +++ b/kodilib/src/widgets/KButtonSymbols.h @@ -6,7 +6,7 @@ #ifndef __KButtonSymbols #define __KButtonSymbols -static char *KDS_BUTTONICON_CLEAR[] = +static const char *KDS_BUTTONICON_CLEAR[] = { // width height ncolors chars_per_pixel "13 13 1 1", @@ -28,7 +28,7 @@ static char *KDS_BUTTONICON_CLEAR[] = ".............", }; -static char *KDS_BUTTONICON_CROSS[] = +static const char *KDS_BUTTONICON_CROSS[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -51,7 +51,7 @@ static char *KDS_BUTTONICON_CROSS[] = "#...........#", }; -static char *KDS_BUTTONICON_UP[] = +static const char *KDS_BUTTONICON_UP[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -74,7 +74,7 @@ static char *KDS_BUTTONICON_UP[] = ".............", }; -static char *KDS_BUTTONICON_DOWN[] = +static const char *KDS_BUTTONICON_DOWN[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -97,7 +97,7 @@ static char *KDS_BUTTONICON_DOWN[] = ".............", }; -static char *KDS_BUTTONICON_ARROW_RIGHT[] = +static const char *KDS_BUTTONICON_ARROW_RIGHT[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -120,7 +120,7 @@ static char *KDS_BUTTONICON_ARROW_RIGHT[] = ".............", }; -static char *KDS_BUTTONICON_ARROW_LEFT[] = +static const char *KDS_BUTTONICON_ARROW_LEFT[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -143,7 +143,7 @@ static char *KDS_BUTTONICON_ARROW_LEFT[] = ".............", }; -static char *KDS_BUTTONICON_ARROW_UP[] = +static const char *KDS_BUTTONICON_ARROW_UP[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -166,7 +166,7 @@ static char *KDS_BUTTONICON_ARROW_UP[] = ".............", }; -static char *KDS_BUTTONICON_ARROW_DOWN[] = +static const char *KDS_BUTTONICON_ARROW_DOWN[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -189,7 +189,7 @@ static char *KDS_BUTTONICON_ARROW_DOWN[] = ".............", }; -static char *KDS_BUTTONICON_TOP[] = +static const char *KDS_BUTTONICON_TOP[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -212,7 +212,7 @@ static char *KDS_BUTTONICON_TOP[] = ".............", }; -static char *KDS_BUTTONICON_BOTTOM[] = +static const char *KDS_BUTTONICON_BOTTOM[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -235,7 +235,7 @@ static char *KDS_BUTTONICON_BOTTOM[] = ".............", }; -static char *KDS_BUTTONICON_DOUBLE_UP[] = +static const char *KDS_BUTTONICON_DOUBLE_UP[] = { // width height ncolors chars_per_pixel "13 13 2 1", @@ -258,7 +258,7 @@ static char *KDS_BUTTONICON_DOUBLE_UP[] = ".............", }; -static char *KDS_BUTTONICON_DOUBLE_DOWN[] = +static const char *KDS_BUTTONICON_DOUBLE_DOWN[] = { // width height ncolors chars_per_pixel "13 13 2 1", diff --git a/kodilib/src/widgets/KFileNameField.cpp b/kodilib/src/widgets/KFileNameField.cpp index 81074e5..4cd425c 100644 --- a/kodilib/src/widgets/KFileNameField.cpp +++ b/kodilib/src/widgets/KFileNameField.cpp @@ -41,7 +41,7 @@ bool KFileNameField::handleKey ( const KKey & key ) std::string restPath; // path behind cursor // map cropped path to current directory and rest path to file prefix - unsigned int lastSlashPos = croppedPath.rfind("/"); + std::string::size_type lastSlashPos = croppedPath.rfind("/"); if (lastSlashPos < croppedPath.size()-1) { restPath = croppedPath.substr(lastSlashPos+1); @@ -88,7 +88,7 @@ bool KFileNameField::handleKey ( const KKey & key ) } // ............................collect list of entries in searchDir that match prefix restPath - unsigned int restLength = restPath.size(); + std::string::size_type restLength = restPath.size(); std::vector matchingEntries; std::vector::iterator iter = dir_entries.begin(); while (iter != dir_entries.end()) @@ -223,7 +223,7 @@ bool KFileNameField::handleKey ( const KKey & key ) // -------------------------------------------------------------------------------------------------------- void KFileNameField::selectLastPathComponent () { - unsigned int lastSlashPos = text.rfind("/"); + std::string::size_type lastSlashPos = text.rfind("/"); if (lastSlashPos == text.size()-1) lastSlashPos = text.rfind("/", lastSlashPos-1); if (lastSlashPos < text.size()) cursor_pos = lastSlashPos+1; else cursor_pos = 0; diff --git a/linux/Makefile b/linux/Makefile index dabdd8a..fe1d756 100644 --- a/linux/Makefile +++ b/linux/Makefile @@ -6,7 +6,7 @@ # X11_INCLUDES = -I /usr/X11/include/ -PYTHON_VERSION=2.3 +PYTHON_VERSION=2.5 PYTHON_INCLUDES = -I /usr/include/python$(PYTHON_VERSION) SDLCFLAGS = $(shell sdl-config --cflags) @@ -14,11 +14,8 @@ SDLLIBS = $(shell sdl-config --libs) -lSDL_image -lSDL_mixer GLLIBS = -lglut -lGLU -lGL -PYTHONHOME = /usr/lib/python$(PYTHON_VERSION)/ -PYTHONLIBS = $(PYTHONHOME)/config/libpython$(PYTHON_VERSION).a -lutil \ - $(PYTHONHOME)/lib-dynload/math.so \ - $(PYTHONHOME)/lib-dynload/time.so \ - $(PYTHONHOME)/lib-dynload/_random.so +PYTHONHOME = /usr/lib/python$(PYTHON_VERSION) +PYTHONLIBS = -lpython$(PYTHON_VERSION) -lutil # change this, if the kodilib directory isn't parallel to the kiki directory @@ -46,7 +43,7 @@ KIKI_INCLUDES = -I ../SWIG $(KODILIBINC) \ INCLUDES = $(KIKI_INCLUDES) $(X11_INCLUDES) $(PYTHON_INCLUDES) -CXXFLAGS = $(INCLUDES) $(SDLCFLAGS) +CXXOPTS = $(INCLUDES) $(SDLCFLAGS) $(CXXFLAGS) src = \ $(KIKISRC)/base/KikiAction.cpp \ @@ -105,8 +102,10 @@ src = \ obj = $(src:.cpp=.o) kiki: $(KIKISRC)/../SWIG/KikiPy_wrap.cpp $(obj) - -(cd ../SWIG; swig -c++ -python -globals kiki -o KikiPy_wrap.cpp KikiPy.i; cp kiki.py ../py) - $(CXX) $(obj) $(KODILIB) -o kiki $(GLLIBS) $(SDLLIBS) $(PYTHONLIBS) + $(CXX) $(CXXOPTS) $(obj) $(KODILIB) -o kiki $(GLLIBS) $(SDLLIBS) $(PYTHONLIBS) + +$(KIKISRC)/../SWIG/KikiPy_wrap.cpp: $(wildcard ../SWIG/*.i) + -(cd ../SWIG && swig -c++ -python -globals kiki -o KikiPy_wrap.cpp KikiPy.i && cp kiki.py ../py) obj-clean: $(RM) -f $(obj) @@ -115,5 +114,5 @@ clean: $(RM) -f $(obj) kiki %.o: %.cpp - $(CXX) -c $(CXXFLAGS) -o $@ $< + $(CXX) -c $(CXXOPTS) -o $@ $< diff --git a/py/config.py b/py/config.py index ad8f6e4..4b6d247 100644 --- a/py/config.py +++ b/py/config.py @@ -46,11 +46,14 @@ class KikiConfig (ConfigParser): Controller.setGamma(int(value)) elif option == "fullscreen": fullscreen = self.getboolean(section, option) - if fullscreen <> Controller.getFullscreen(): - screen_size = self.get (section, fullscreen and "fullscreen size" or "window size") - screen_size = tuple (map (int, screen_size.split("x"))) - Controller.changeScreenSize (screen_size[0], screen_size[1], self.getboolean(section, option)) - self.set (section, "fullscreen size", "%dx%d" % Controller.getScreenSize()) + if fullscreen: + # remember window size before switching to fullscreen + if not Controller.getFullscreen(): + self.set (section, "window size", "%dx%d" % Controller.getScreenSize()) + Controller.changeScreenSize (0, 0, true) + else: + window_size = map (int, self.get (section, "window size").split("x")) + Controller.changeScreenSize (window_size[0], window_size[1], false) elif section == "keyboard": player = Controller.getPlayer() player.setKeyForAction (value, option.replace("_", " ")) @@ -70,6 +73,10 @@ class KikiConfig (ConfigParser): def save (self): """save the configuration""" + # Save the window size. We need to do this here as the resize + # notifications don't get transfered to the Python code (AFAICS). + if not Controller.getFullscreen(): + self.set ("display", "window size", "%dx%d" % Controller.getScreenSize()) try: cfg_file = file (self.config_file_path, "w+") self.write (cfg_file) diff --git a/py/kiki.cfg b/py/kiki.cfg index 4648c47..5ceb76f 100644 --- a/py/kiki.cfg +++ b/py/kiki.cfg @@ -9,7 +9,7 @@ speed = 7 fov = 90 window_size = 800x600 fullscreen_size = 1600x1280 -fullscreen = off +fullscreen = on language = english gamma = 5 diff --git a/py/lang.py b/py/lang.py index 85b567f..85ff249 100644 --- a/py/lang.py +++ b/py/lang.py @@ -1,16 +1,26 @@ # -*- encoding: utf-8 -*- - +import locale + +locale=locale.getdefaultlocale()[0] +if locale: language=locale[0:2] +else: language="en" + if Controller.isDebugVersion(): print "[lang.py]" + +lang_dict = { "nl":"dutch", "en":"english", "eu":"euskara", "fr":"francaise", "de":"german", "pt":"portuguese", "ru":"russian", "es":"spanish", "sv":"swedish", } -Controller.language = "english" - -lang_list = [ "dutch", "english", "euskara", "german", "portuguese", "spanish", "swedish", ] +if language in lang_dict: + Controller.language = lang_dict[language] +else: + Controller.language = "english" + +lang_list = [ "dutch", "english", "euskara", "francaise", "german", "portuguese", "russian", "spanish", "swedish", ] lang = {} for langName in lang_list: execfile (kikipy_path + os.path.sep + "lang" + os.path.sep + langName + ".py") def getLocalizedString(text): - if lang[Controller.language].has_key(text): + if text in lang[Controller.language]: return lang[Controller.language][text] else: return text diff --git a/py/lang/dutch.py b/py/lang/dutch.py index 00b1aa5..d13d9f8 100644 --- a/py/lang/dutch.py +++ b/py/lang/dutch.py @@ -1,16 +1,18 @@ -# -*- encoding: utf-8 -*- +# -*- encoding: utf-8 -*- # Dutch (Nederlands) versions of kiki texts # translation by Arthur Langereis - + lang['dutch'] = { # game title - + "kiki the nano bot": "kiki de nano bot", # menu "new game": "nieuw spel", +"continue": "verdergaan", +"statistics": "statistieken", "load level": "laad spel", "next level": "volgend niveau", "restart": "begin opnieuw", @@ -37,10 +39,10 @@ lang['dutch'] = { "STORY_PAGE_1": "Er leefden eens\nwat kleine robotjes\nin de nano wereld.\n\nze hadden een gelukkig\nkunstmatig leven en\nverzamelden druk materialen\nvoor de maker,\ndie meer en meer\nkleine robotjes maakte.", "STORY_PAGE_2": "maar op een dag,\nvernietigde een parasiet\nhet controle programma\nvan de maker.\n\nvanaf dat moment werkt\nde maker slecht en\nproduceert hij slechts\nluie domme kleine robotjes\ndie op elkaar schieten\nen de nano wereld stuk maken.", "STORY_PAGE_3": "het is jouw taak om kiki,\nde laatste gezonde bot,\nte helpen om de maker\nte repareren.\n\nveel geluk!", - -# statistics - -"STATISTICS_TEXT": "$scale(1.5)statistics\n\nyou solved %d of %d levels\n\nyour current score is %d\n\n$scale(2.0)%d", + +# statistics + +"STATISTICS_TEXT": "$scale(1.5)statistieken\n\nje loste %d van %d niveaus op\n\nje huidige score is\n\n$scale(2.0)%d", # setup @@ -72,7 +74,7 @@ lang['dutch'] = { "press the new key": "druk op de nieuwe toets", "action without key": "geen toets ingesteld", -"back to setup": "terug naar configuratie" +"back to setup": "terug naar configuratie" } diff --git a/py/lang/francaise.py b/py/lang/francaise.py new file mode 100644 index 0000000..46ed08e --- /dev/null +++ b/py/lang/francaise.py @@ -0,0 +1,77 @@ +# -*- encoding: utf-8 -*- +# Versions Francaise de kiki texts +# translation by philrich123.free.fr + +lang['francaise'] = { + +# game title + +"kiki the nano bot": "kiki le nano robot", + +# menu + +"new game": "nouvelle Partie", +"load level": "charger le niveau", +"next level": "niveau suivant", +"restart": "redemarrer", +"setup": "configuration", +"story": "histoire", +"demo": "demonstration", +"about": "a propos", +"help": "aide", +"quit": "quitter", +"back": "retour", + +# about + +"version": "version", +"programmed by": "programmation de", +"sounds from": "les sons sont de", +"thanks": "remerciements", +"visit": "visiter", +"for more games": "pour plus de jeux", +"main menu": "menu principal", + +# story + +"STORY_PAGE_1": "Il etait une fois,\ndes tout petis robots\nvivants dans un tout\npetit monde.\n\nIls vivaient une vie\ntres agitee, collectant\nles ressources necessaires\na la fabrication d'autres robots\nminuscules.", +"STORY_PAGE_2": "Mais un jour,\nun virus detruisit le programme\nde l'appareil a fabriquer les nouveaux\nrobots.\n\nDepuis lors il \nfonctionne mal\net ne produit plus\nque des affreux petits robots\nstupides qui ne pense qu'a\ntout detruire.", +"STORY_PAGE_3": "Votre tache est d'aider kiki,\nle seul robot sain qui reste,\na depanner le programme.\n\nbonne chance!", + +# statistics + +"STATISTICS_TEXT": "$scale(1.5)statistiques\n\nvous avez resolu %d des %d niveaux\n\nvotre score actuel est\n\n$scale(2.0)%d", + +# setup + +"language": "langue", +"off": "non", +"on": "oui", +"sound": "son", +"volume": "volume", +"fullscreen": "plein ecran", +"fov": "fov", +"speed": "vitesse", +"keyboard setup": "configuration du clavier", +"save": "sauver", + +# keyboard setup + +"$no_itemkeyboard setup": "$no_itemconfiguration du clavier", # don't translate $no_item +"$no_item": "$no_item", # don't change this + +"move forward": "aller en avant", +"move backward": "aller en arriere", +"turn left": "tourner a gauche", +"turn right": "tourner a droite", +"jump": "sauter", +"push": "pousser", +"shoot": "tirer", +"change view": "changer de vue", +"look up": "regarder vers le haut", +"look down": "regarder vers le bas", + +"press the new key": "appuyer sur la nouvelle touche", +"action without key": "action sans touche", +"back to setup": "retour a la configuration", +} diff --git a/py/lang/russian.py b/py/lang/russian.py new file mode 100644 index 0000000..a76efb5 --- /dev/null +++ b/py/lang/russian.py @@ -0,0 +1,81 @@ +# -*- encoding: koi8-r -*- +# Localized versions of kiki texts + +lang['russian'] = { + +# game title + +"kiki the nano bot": " -", + +# menu + +"new game": " ", +"continue": "", +"statistics": "", +"load level": " ", +"next level": " ", +"restart": " ", +"setup": "", +"story": "", +"demo": "", +"about": " ", +"help": "", +"quit": "", +"back": "", + +# about + +"version": "", +"programmed by": "programmed by", +"sounds from": " ", +"thanks": "", +"visit": "", +"for more games": " ", +"main menu": " ", + +# story + +"STORY_PAGE_1": "once upon a time,\nthere were some\ntiny little robots\nliving in the nano world.\n\nthey lived a happy artificial life\nbusily collecting resources\nfor the maker\nwho made more and more\ntiny little robots.", +"STORY_PAGE_2": "but one day,\na parasitic capacity\ndestroyed the maker's\nmaster control program.\n\nsince then he is\nmalfunctioning\nand only producing\nlazy stupid little robots\nwhich shoot each other\nand destroy the nano world.", +"STORY_PAGE_3": "your task is to help kiki,\nthe only sane bot left over,\nto repair the maker.\n\ngood luck!", + +# statistics + +"STATISTICS_TEXT": "$scale(1.5):\n\n %d %d \n\n \n\n$scale(2.0)%d", + +# setup + +"language": "", +"off": "", +"on": "", +"sound": "", +"volume": "", +"fullscreen": " ", +"fov": "", +"keyboard setup": " ", +"gamma": "", +"speed": "", +"keyboard setup": "", +"save": "", + +# keyboard setup + +"$no_itemkeyboard setup": "$no_itemkeyboard setup", # don't translate $no_item +"$no_item": "$no_item", # don't change this + +"move forward": "", +"move backward": "", +"turn left": " ", +"turn right": " ", +"jump": "", +"push": "", +"shoot": "", +"change view": " ", +"look up": " ", +"look down": " ", + +"press the new key": " ", +"action without key": " ", +"back to setup": " ", +} + \ No newline at end of file diff --git a/py/levelselection.py b/py/levelselection.py index d787fac..d55fede 100644 --- a/py/levelselection.py +++ b/py/levelselection.py @@ -25,6 +25,8 @@ def levelSelection (level_index=-1, escapeAction=0): # ............................................................................................................ last_level = highscore.getLastAvailableLevel() + if last_level < 0: + last_level = 0 current_level = (level_index >= 0) and level_index or last_level world.max_level_index = last_level diff --git a/py/setup.py b/py/setup.py index d03d3b7..6efd524 100644 --- a/py/setup.py +++ b/py/setup.py @@ -132,7 +132,7 @@ def quickSetup (itemIndex = 0, escapeAction=0): menu.addItem (Controller.getLocalizedString ("volume") + ": |%d" % (int (sound.getSoundVolume()/(128/9)),), setupOption ("volume"), True) menu.addItem (Controller.getLocalizedString ("fullscreen") + ": |" + (Controller.getFullscreen() and Controller.getLocalizedString ("on") or Controller.getLocalizedString ("off")), setupOption ("fullscreen"), True) menu.addItem (Controller.getLocalizedString ("fov") + ": |%d" % (int (Controller.world.getProjection().getFov()),), setupOption ("fov"), True) - menu.addItem ("gamma: |%d" % (int (Controller.getGamma()),), setupOption ("gamma"), True) + menu.addItem (Controller.getLocalizedString("gamma") + "|%d" % (int (Controller.getGamma()),), setupOption ("gamma"), True) menu.addItem (Controller.getLocalizedString ("speed") + ": |%d" % (Controller.getSpeed(),), setupOption ("speed"), True) if escapeAction: diff --git a/py/world.py b/py/world.py index e86bafe..80a73fa 100644 --- a/py/world.py +++ b/py/world.py @@ -153,7 +153,7 @@ class KikiPyWorld (KikiPyActionObject): if "intro" in self.dict: if not self.preview: intro_text = KikiScreenText () - intro_text.addText (self.dict["intro"]) + intro_text.addText (Controller.getLocalizedString(self.dict["intro"])) intro_text.show () world.setName (self.dict["intro"]) else: diff --git a/src/base/KikiAction.cpp b/src/base/KikiAction.cpp index a57c685..ee09259 100644 --- a/src/base/KikiAction.cpp +++ b/src/base/KikiAction.cpp @@ -19,6 +19,8 @@ KikiAction::KikiAction ( KikiActionObject * o, int i, const std::string & n, int mode = m; duration = d; event = NULL; + + delete_flag_ptr = NULL; reset(); } @@ -32,6 +34,8 @@ KikiAction::KikiAction ( KikiActionObject * o, int d, int m ) duration = d; event = NULL; + delete_flag_ptr = NULL; + reset(); } @@ -40,6 +44,7 @@ KikiAction::~KikiAction () { if (event) event->removeAction(this); if (action_object) action_object->removeAction(this); + if (delete_flag_ptr) *delete_flag_ptr = true; } // -------------------------------------------------------------------------------------------------------- @@ -50,9 +55,18 @@ void KikiAction::perform () { action_object->performAction (this); } void KikiAction::finish () { action_object->finishAction (this); } // -------------------------------------------------------------------------------------------------------- void KikiAction::finished () -{ +{ + bool delete_flag = false; + delete_flag_ptr = &delete_flag; + action_object->actionFinished(this); + if (delete_flag) + { + return; + } + delete_flag_ptr = NULL; + if (current == getDuration()) // if keepRest wasn't called -> reset start and current values { reset(); diff --git a/src/base/KikiAction.h b/src/base/KikiAction.h index 1462fcb..e2fd870 100644 --- a/src/base/KikiAction.h +++ b/src/base/KikiAction.h @@ -68,6 +68,8 @@ class KikiAction int duration; int mode; KikiEvent * event; + + bool * delete_flag_ptr; }; // __________________________________________________________________________________________________ diff --git a/src/base/KikiEvent.cpp b/src/base/KikiEvent.cpp index 5603c2d..9df74fc 100644 --- a/src/base/KikiEvent.cpp +++ b/src/base/KikiEvent.cpp @@ -20,10 +20,7 @@ KikiEvent::KikiEvent ( KikiActionObject * o, const std::string & name ) // -------------------------------------------------------------------------------------------------------- KikiEvent::~KikiEvent () { - while (actions.empty() == false) - { - actions.pop_back(); - } + actions.clear(); } // -------------------------------------------------------------------------------------------------------- @@ -127,7 +124,7 @@ void KikiEvent::triggerActions () { KikiAction * action = save_actions.back(); action->performWithEvent (*this); - if (save_actions.back() == action) + if (save_actions.empty() == false && save_actions.back() == action) { save_actions.pop_back(); } @@ -153,7 +150,7 @@ void KikiEvent::finishActions () KikiAction * action = finished_actions.back(); //KConsole::print(this->getName() + " finishActions " + action->getName()); action->finished(); - if (finished_actions.back() == action) + if (finished_actions.empty() == false && finished_actions.back() == action) { //KConsole::print(this->getName() + " finishActions -- " + action->getName()); finished_actions.pop_back(); diff --git a/src/base/KikiPyAction.cpp b/src/base/KikiPyAction.cpp index 2574fd0..853dcfd 100644 --- a/src/base/KikiPyAction.cpp +++ b/src/base/KikiPyAction.cpp @@ -44,8 +44,9 @@ void KikiPyAction::perform () } else if (PyInstance_Check(python_object)) { - result = PyObject_CallMethod (python_object, "performAction", "sf", action_name.c_str(), - getRelativeTime()); + result = PyObject_CallMethod (python_object, const_cast("performAction"), + const_cast("sf"), + action_name.c_str(), getRelativeTime()); } if (result) { @@ -63,7 +64,12 @@ void KikiPyAction::finish () { if (PyObject_TypeCheck(python_object, &PyInstance_Type)) { - if (PyObject_CallMethod(python_object, "finishAction", "s", action_name.c_str()) == NULL) + PyObject * result = PyObject_CallMethod(python_object, const_cast("finishAction"), const_cast("s"), action_name.c_str()); + if (result) + { + Py_DECREF(result); + } + else { KConsole::printError("KikiPyAction::finish failed"); } @@ -75,7 +81,12 @@ void KikiPyAction::finished () { if (PyObject_TypeCheck(python_object, &PyInstance_Type)) { - if (PyObject_CallMethod(python_object, "actionFinished", "s", action_name.c_str()) == NULL) + PyObject * result = PyObject_CallMethod(python_object, const_cast("actionFinished"), const_cast("s"), action_name.c_str()); + if (result) + { + Py_DECREF(result); + } + else { KConsole::printError("KikiPyAction::finished failed"); } diff --git a/src/bots/KikiPlayer.cpp b/src/bots/KikiPlayer.cpp index 97620d3..92512ab 100644 --- a/src/bots/KikiPlayer.cpp +++ b/src/bots/KikiPlayer.cpp @@ -474,6 +474,7 @@ void KikiPlayer::finishAction ( KikiAction * action ) if (rotate) { rotate_action = getActionWithId (rotate); + rotate_action->reset(); Controller.timer_event->addAction (rotate_action); } } @@ -606,6 +607,7 @@ bool KikiPlayer::handleKey ( const KKey & key ) if (!look_action) { look_action = getActionWithId ((key.name == look_up_key) ? ACTION_LOOK_UP : ACTION_LOOK_DOWN); + look_action->reset(); Controller.timer_event->addAction (look_action); } @@ -741,3 +743,12 @@ const KColor & KikiPlayer::getTireColor () return colors[KikiPlayer_tire_color]; } +// __________________________________________________________________________________________________ +void KikiPlayer::finishRotateAction () +{ + if (rotate_action) + { + rotate = false; + finishAction(rotate_action); + } +} diff --git a/src/bots/KikiPlayer.h b/src/bots/KikiPlayer.h index 8321d16..537a658 100644 --- a/src/bots/KikiPlayer.h +++ b/src/bots/KikiPlayer.h @@ -40,6 +40,8 @@ class KikiPlayer : public KikiBot, public KKeyHandler void performAction ( KikiAction * action ); void finishAction ( KikiAction * action ); + void finishRotateAction (); + // ........................................................................ display void display (); void die (); diff --git a/src/gui/KikiCharacter.cpp b/src/gui/KikiCharacter.cpp index 3e4a8fb..e1c2bf0 100644 --- a/src/gui/KikiCharacter.cpp +++ b/src/gui/KikiCharacter.cpp @@ -153,7 +153,49 @@ static KikiCharCoords KikiCharacterData[][3][30] = { {{ {2,0}, {3,-1}, {2,-2}, {3,-2}, {4,-1}, {3,-0}, {-1}}, // tail for {{-1}}, {{-1}}}, {{ {1,9}, {5,9}, {5,12}, {1,12}, {-1}}, // circle for - {{2,10}, {2,11}, {4, 11}, {4,10}, {-1}}, {{-1}}}, + {{2,10}, {2,11}, {4, 11}, {4,10}, {-1}}, {{-1}}}, + {{ {0,0}, {4,0}, {6,1}, {6,4}, {5,5}, {2,5}, {2,6}, {6,6}, {6,8}, {0,8}, // cyrillic b + {-1}}, {{2,2}, {2,3}, {4,3}, {4,2}, {-1}}, {{-1}}}, + {{ {0,0}, {2,0}, {2,6}, {6,6}, {6,8}, {0,8}, {-1}}, {{-1}}, {{-1}}}, // cyrillic g + {{ {0,0}, {2,2.5}, {2,0}, {3.5,0}, {3.5,2}, {6,0}, {6,2}, {4,4}, {6,6}, // cyrillic zh + {6,8}, {3.5,6}, {3.5,8}, {2.5,8}, {2.5,6}, {0,8}, {0,6}, {2,4}, {0,2}, + {-1}}, {{-1}}, {{-1}}}, + {{ {0,0}, {5,0}, {6,1}, {6,3}, {5,4}, {6,5}, {6,7}, {5,8}, {0,8}, {0,6}, // cyrillic z + {4,6}, {4,5}, {2,5}, {2,3}, {4,3}, {4,2}, {0,2}, {-1}}, {{-1}}, {{-1}}}, + {{ {0,0}, {2,0}, {4,3}, {4,0}, {6,0}, {6,8}, {4,8}, {4,6}, {2,3}, {2,8}, // cyrillic i + {0,8}, {-1}}, {{-1}}, {{-1}}}, + {{ {0,0}, {2,0}, {4,4}, {4,0}, {6,0}, {6,8}, {4,8}, {-1}}, // cyrillic l + {{-1}},{{-1}}}, + {{ {0,0}, {2,0}, {2,6}, {4,6}, {4,0}, {6,0}, {6,8}, {0,8}, // cyrillic p + {-1}}, {{-1}},{{-1}}}, + {{ {0,1}, {1,0}, {5,0}, {6,1}, {6,8}, {4,8}, {4,4}, {2,5}, {2,8}, {0,8}, // cyrillic u + {0,4}, {4,2}, {1,2}, {0,3}, {-1}}, {{-1}}, {{-1}}}, + {{ {2,0}, {4,0}, {4,2}, {5,2}, {6,3}, {6,6}, {5,7}, {4,7}, {4,8}, {2,8}, // cyrillic f + {2,7}, {1,7}, {0,6}, {0,3}, {1,2}, {2,2}, {-1}}, + {{2,3}, {2,6}, {1,5}, {1,4}, {-1}}, + {{4,3}, {5,4}, {5,5}, {4,6}, {-1}}}, + {{ {0,1}, {3,1}, {3,0}, {6,0}, {6,2}, {5,2}, {5,8}, {3.5,8}, {3.5,3}, // cyrillic c + {1.5,3}, {1.5,8}, {0,8}, {-1}}, {{-1}}, {{-1}}}, + {{ {4,0}, {6,0}, {6,8}, {4,8}, {4,5}, {2,5}, {2,8}, {0,8}, {0,4}, {1,3}, // cyrillic ch + {4,3}, {-1}}, {{-1}}, {{-1}}}, + {{ {0,0}, {6,0}, {6,8}, {5,8}, {5,2}, {3.5,2}, {3.5,8}, {2.5,8}, // cyrillic sh + {2.5,2}, {1,2}, {1,8}, {0,8}, {-1}}, {{-1}},{{-1}}}, + {{ {0,1}, {4,1}, {4,0}, {6,2}, {5,2}, {5,8}, {4,8}, {4,2}, {3,2}, {3,8}, // cyrillic sch + {2,8}, {2,2}, {1,2}, {1,8}, {0,8}, {-1}}, {{-1}},{{-1}}}, + {{ {1,0}, {4,0}, {6,1}, {6,4}, {5,5}, {3,5}, {3,8}, {0,8}, // cyrillic hard sign + {0,6}, {1,6}, {-1}}, {{2,2}, {2,3}, {4,3}, {4,2}, {-1}}, {{-1}}}, + {{ {0,0}, {3,0}, {4,1}, {4,0}, {6,0}, {6,8}, {4,8}, {4,4}, // cyrillic hard i + {3,5}, {2,5}, {2,8}, {0,8}, {-1}}, + {{2,1.5}, {3,2}, {3,3}, {2,3.5}, {-1}}, {{-1}}}, + {{ {0,0}, {4,0}, {6,1}, {6,4}, {5,5}, {2,5}, {2,8}, {0,8}, // cyrillic soft sign + {-1}}, {{2,2}, {2,3}, {4,3}, {4,2}, {-1}}, {{-1}}}, + {{ {0,0}, {5,0}, {6,1}, {6,7}, {5,8}, {0,8}, {0,6}, {3,6}, {4,5}, // cyrillic hard e + {1,5}, {1,3}, {4,3}, {3,2}, {0,2}, {-1}}, {{-1}}, {{-1}}}, + {{ {0,0}, {1,0}, {1,3}, {2,3}, {2,1}, {3,0}, {5,0}, {6,1}, {6,7}, {5,8}, // cyrillic yu + {3,8}, {2,7}, {2,5}, {1,5}, {1,8}, {0,8}, {-1}}, + {{4,1}, {5,2}, {5,6}, {4,7}, {3,6}, {3,2}, {-1}}, {{-1}}}, // cyrillic ya + {{ {0,0}, {2,0}, {4,2}, {4,0}, {6,0}, {6,8}, {1,8}, {0,7}, {0,5}, {1,4}, + {3,4}, {0,1}, {-1}}, {{2,5.5}, {4,5.5}, {4,6.5}, {2,6.5}, {-1}}, {{-1}}}, }; // __________________________________________________________________________________________________ @@ -183,6 +225,41 @@ KikiCharacter::KikiCharacter ( char c ) case -93: character = 32; addon = 5; break; // case -95: character = 32; addon = 2; break; // case -96: character = 32; addon = 3; break; // + case -63: character = 32; break; // + case -18: character = 32; break; // + case -15: character = 32; break; // + case -62: character = 65; break; // + case -41: character = 33; break; // + case -57: character = 66; break; // + case -60: character = 35; break; // + case -59: character = 36; break; // + case -42: character = 67; break; // + case -38: character = 68; break; // + case -55: character = 69; break; // + case -54: character = 69; addon = 2; break; // + case -53: character = 42; break; // + case -52: character = 70; break; // + case -51: character = 44; break; // + case -50: character = 39; break; // + case -49: character = 46; break; // + case -48: character = 71; break; // + case -46: character = 47; break; // + case -45: character = 34; break; // + case -44: character = 51; break; // + case -43: character = 72; break; // + case -58: character = 73; break; // + case -56: character = 55; break; // + case -61: character = 74; break; // + case -34: character = 75; break; // + case -37: character = 76; break; // + case -35: character = 77; break; // + case -33: character = 78; break; // + case -39: character = 79; break; // + case -40: character = 80; break; // + case -36: character = 81; break; // + case -64: character = 82; break; // + case -47: character = 83; break; // + case -90: character = 40; break; //ibelorussian default: KConsole::printf ("KikiCharacter::KikiCharacter unknown character %c (%d)", c, c); diff --git a/src/gui/KikiMenu.cpp b/src/gui/KikiMenu.cpp index 5798194..21f4597 100644 --- a/src/gui/KikiMenu.cpp +++ b/src/gui/KikiMenu.cpp @@ -43,6 +43,16 @@ KikiMenu::KikiMenu ( int selectedItem ) : KikiScreenText () } // __________________________________________________________________________________________________ +KikiMenu::~KikiMenu () +{ + while (menu_items.empty() == false) + { + delete menu_items.back(); + menu_items.pop_back(); + } +} + +// __________________________________________________________________________________________________ void KikiMenu::setCurrentIndex (int index) { @@ -54,7 +64,7 @@ KikiMenuItem * KikiMenu::newItem ( const std::string & itemText, KikiAction * it { std::string item_text (itemText); std::string event_name (itemText); - unsigned int pos; + std::string::size_type pos; float scale_factor = 1.0; KikiMenuItem * menu_item = new KikiMenuItem (); @@ -402,6 +412,14 @@ KikiMenuItem::KikiMenuItem () } // __________________________________________________________________________________________________ +KikiMenuItem::~KikiMenuItem () +{ + delete item_text; + delete value_text; + delete extra_text; +} + +// __________________________________________________________________________________________________ float KikiMenuItem::getWidth () const { float width = 0.0; diff --git a/src/gui/KikiMenu.h b/src/gui/KikiMenu.h index 1a77219..bbe4a51 100644 --- a/src/gui/KikiMenu.h +++ b/src/gui/KikiMenu.h @@ -15,6 +15,7 @@ class KikiMenuItem public: KikiMenuItem (); + ~KikiMenuItem (); bool ignore; bool option; @@ -34,6 +35,7 @@ class KikiMenu : public KikiScreenText // ........................................................................ (con|de)struction KikiMenu ( int selectedItem = -1 ); + virtual ~KikiMenu (); // ........................................................................ menu items virtual void addItem ( const std::string & itemText, KikiAction * action = 0, bool option = false); diff --git a/src/gui/KikiScrollMenu.cpp b/src/gui/KikiScrollMenu.cpp index 9b99185..fce1887 100644 --- a/src/gui/KikiScrollMenu.cpp +++ b/src/gui/KikiScrollMenu.cpp @@ -16,6 +16,17 @@ KikiScrollMenu::KikiScrollMenu ( int rows, int columns, int activeItem ) : KikiC } // __________________________________________________________________________________________________ +KikiScrollMenu::~KikiScrollMenu () +{ + menu_items.clear(); + while (all_menu_items.empty() == false) + { + delete all_menu_items.back(); + all_menu_items.pop_back(); + } +} + +// __________________________________________________________________________________________________ void KikiScrollMenu::addItem ( const std::string & itemText, KikiAction * itemAction, bool option ) { all_menu_items.push_back (newItem (itemText, itemAction)); diff --git a/src/gui/KikiScrollMenu.h b/src/gui/KikiScrollMenu.h index 0876df2..6c97151 100644 --- a/src/gui/KikiScrollMenu.h +++ b/src/gui/KikiScrollMenu.h @@ -15,6 +15,7 @@ class KikiScrollMenu : public KikiColumnMenu // ........................................................................ (con|de)struction KikiScrollMenu ( int rows = 5, int columns = 4, int selectedItem = -1 ); + virtual ~KikiScrollMenu (); // ........................................................................ menu items virtual void addItem ( const std::string & itemText, KikiAction * action = 0, bool option = false ); diff --git a/src/gui/KikiText.cpp b/src/gui/KikiText.cpp index 9e8172f..c85fdfe 100644 --- a/src/gui/KikiText.cpp +++ b/src/gui/KikiText.cpp @@ -13,7 +13,7 @@ #include // __________________________________________________________________________________________________ -unsigned int KikiText::display_lists[3][58]; +unsigned int KikiText::display_lists[3][CHAR_COUNT]; std::vector KikiText::colors(3); const char * KikiText::color_names[] = { "base", "bright", "dark" }; int KikiText::list_color = -1; @@ -83,7 +83,7 @@ std::string KikiText::getText () const // __________________________________________________________________________________________________ void KikiText::invalidateLists ( int index ) { - for (int c = 0; c < 58; c++) + for (int c = 0; c < CHAR_COUNT; c++) { if (display_lists[index][c]) { @@ -104,7 +104,7 @@ void KikiText::init () { for (int i = 0; i < 3; i++) { - for (int c = 0; c < 58; c++) + for (int c = 0; c < CHAR_COUNT; c++) { display_lists[i][c] = 0; } diff --git a/src/gui/KikiText.h b/src/gui/KikiText.h index dc43f23..13875c8 100644 --- a/src/gui/KikiText.h +++ b/src/gui/KikiText.h @@ -5,6 +5,7 @@ #ifndef __KikiText #define __KikiText +#define CHAR_COUNT 85 #include @@ -64,7 +65,7 @@ class KikiText KColor color; // ........................................................................ display lists - static unsigned int display_lists[3][58]; + static unsigned int display_lists[3][CHAR_COUNT]; static int list_color; // ........................................................................ depth static float bevel_depth; diff --git a/src/gui/KikiTextLine.cpp b/src/gui/KikiTextLine.cpp index a7caaaf..e5e1ccb 100644 --- a/src/gui/KikiTextLine.cpp +++ b/src/gui/KikiTextLine.cpp @@ -46,7 +46,7 @@ void KikiTextLine::addCharacter ( char c ) void KikiTextLine::setText ( const std::string & str ) { text = str; - unsigned int pos; + std::string::size_type pos; if ((pos = text.find ("$scale(")) != std::string::npos) { diff --git a/src/main/KikiController.cpp b/src/main/KikiController.cpp index edc433e..ddafc71 100644 --- a/src/main/KikiController.cpp +++ b/src/main/KikiController.cpp @@ -62,10 +62,7 @@ KikiController::KikiController () : KEventHandler (), KKeyHandler (), KikiAction } else { - KConsole::printf("WARNING :: environment variable KIKI_HOME not set ..."); - KConsole::printf(" ... assuming resources in current directory"); - - kiki_home = kFileGetCurrentPath(); + kiki_home = "/usr/share/games/kiki-the-nano-bot"; } #ifndef WIN32 kiki_home += "/"; diff --git a/src/main/KikiPython.cpp b/src/main/KikiPython.cpp index 356eeb3..4fbfc2a 100644 --- a/src/main/KikiPython.cpp +++ b/src/main/KikiPython.cpp @@ -106,9 +106,9 @@ KikiPython::KikiPython () : KWindow () void KikiPython::initPython () { #if defined(__APPLE__) && defined(__MACH__) - //putenv ("PYTHONDEBUG=1"); - //putenv ("PYTHONVERBOSE=1"); - putenv ("PYTHONPATH=./py:../Frameworks/Python.framework/Versions/A/lib/python2.2"); + putenv ("PYTHONDEBUG=1"); + putenv ("PYTHONVERBOSE=1"); + putenv ("PYTHONPATH=./py"); // :../Frameworks/Python.framework/Versions/A/lib/python2.2"); #elif defined(WIN32) putenv ("PYTHONDEBUG=1"); putenv ("PYTHONVERBOSE=1"); diff --git a/src/main/KikiPythonWidget.h b/src/main/KikiPythonWidget.h index db46d01..979ae6e 100644 --- a/src/main/KikiPythonWidget.h +++ b/src/main/KikiPythonWidget.h @@ -7,6 +7,7 @@ #define __KikiPythonWidget #include "KikiPos.h" +#include "KikiPython.h" #include class KikiPythonWidget : public KTextField diff --git a/src/main/main.cpp b/src/main/main.cpp index 868c1d7..b81f7fa 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -9,6 +9,10 @@ #include #include + +#define K_INCLUDE_GLUT +#include "KIncludeTools.h" + #include "KikiController.h" // __________________________________________________________________________________________________ @@ -19,6 +23,11 @@ int main (int argc, char * argv[]) int width, height; SDL_Surface * screen; +#if defined(__APPLE__) && defined(__MACH__) +#else + glutInit(&argc,argv); +#endif + // initialize SDL if ( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_VIDEO) < 0 ) // SDL_INIT_TIMER { diff --git a/src/sound/KikiSound.cpp b/src/sound/KikiSound.cpp index 6602599..2b0a25e 100644 --- a/src/sound/KikiSound.cpp +++ b/src/sound/KikiSound.cpp @@ -30,39 +30,39 @@ typedef struct _KikiSound // __________________________________________________________________________________________________ static KikiSoundData KikiSounds[] = { - { KikiSound::BOT_MOVE, "bot_move.wav", 0.2 }, - { KikiSound::BOT_JUMP, "bot_jump.wav", 0.7 }, - { KikiSound::BOT_LAND, "bot_land.wav", 0.7 }, - { KikiSound::BOT_SPIKED, "bot_move.wav", 1.0 }, - { KikiSound::BOT_HEALTH_ALERT, "bot_health_alert.wav", 1.0 }, - { KikiSound::BOT_DEATH, "bot_death.wav", 1.0 }, - { KikiSound::BOT_NO_ENERGY, "bot_no_energy.wav", 1.0 }, - { KikiSound::BULLET_SHOT, "bullet_shot.wav", 1.0 }, - { KikiSound::BULLET_HIT_WALL, "bullet_hit_wall.wav", 1.0 }, - { KikiSound::BULLET_HIT_OBJECT, "bullet_hit_object.wav", 1.0 }, - { KikiSound::BULLET_HIT_PLAYER, "bullet_hit_player.wav", 1.0 }, - { KikiSound::BULLET_HIT_MUTANT, "bullet_hit_mutant.wav", 1.0 }, - { KikiSound::STONE_MOVE, "stone_move.wav", 1.0 }, - { KikiSound::STONE_LAND, "stone_land.wav", 1.0 }, - { KikiSound::SWITCH_ON, "switch_on.wav", 1.0 }, - { KikiSound::SWITCH_OFF, "switch_on.wav", 0.5 }, - { KikiSound::ATOM_BIRTH, "atom_digest.wav", 1.0 }, - { KikiSound::ATOM_DIGEST, "atom_digest.wav", 1.0 }, - { KikiSound::SPIKES_START, "bot_move.wav", 1.0 }, - { KikiSound::MENU_FADE, "menu_fade.wav", 1.0 }, - { KikiSound::MENU_ITEM, "menu_item.wav", 1.0 }, - { KikiSound::MENU_SELECT, "menu_select.wav", 1.0 }, - { KikiSound::MENU_ABORT, "menu_abort.wav", 1.0 }, - { KikiSound::GATE_OPEN, "gate_open.wav", 1.0 }, - { KikiSound::GATE_CLOSE, "gate_close.wav", 1.0 }, - { KikiSound::GATE_WARP, "gate_warp.wav", 1.0 }, - { KikiSound::BOMB_EXPLODE, "bomb_explode.wav", 1.0 }, - { KikiSound::BOMB_SPLITTER, "bomb_splitter.wav", 1.0 }, - { KikiSound::GEAR_ON, "gear_on.wav", 1.0 }, - { KikiSound::GEAR_OFF, "gear_off.wav", 1.0 }, - { KikiSound::GENERATOR_ON, "generator_on.wav", 1.0 }, - { KikiSound::GENERATOR_OFF, "generator_off.wav", 1.0 }, - { KikiSound::MOTOR, "bomb_splitter.wav", 1.0 }, + { KikiSound::BOT_MOVE, "bot_move.ogg", 0.2 }, + { KikiSound::BOT_JUMP, "bot_jump.ogg", 0.7 }, + { KikiSound::BOT_LAND, "bot_land.ogg", 0.7 }, + { KikiSound::BOT_SPIKED, "bot_move.ogg", 1.0 }, + { KikiSound::BOT_HEALTH_ALERT, "bot_health_alert.ogg", 1.0 }, + { KikiSound::BOT_DEATH, "bot_death.ogg", 1.0 }, + { KikiSound::BOT_NO_ENERGY, "bot_no_energy.ogg", 1.0 }, + { KikiSound::BULLET_SHOT, "bullet_shot.ogg", 1.0 }, + { KikiSound::BULLET_HIT_WALL, "bullet_hit_wall.ogg", 1.0 }, + { KikiSound::BULLET_HIT_OBJECT, "bullet_hit_object.ogg", 1.0 }, + { KikiSound::BULLET_HIT_PLAYER, "bullet_hit_player.ogg", 1.0 }, + { KikiSound::BULLET_HIT_MUTANT, "bullet_hit_mutant.ogg", 1.0 }, + { KikiSound::STONE_MOVE, "stone_move.ogg", 1.0 }, + { KikiSound::STONE_LAND, "stone_land.ogg", 1.0 }, + { KikiSound::SWITCH_ON, "switch_on.ogg", 1.0 }, + { KikiSound::SWITCH_OFF, "switch_on.ogg", 0.5 }, + { KikiSound::ATOM_BIRTH, "atom_digest.ogg", 1.0 }, + { KikiSound::ATOM_DIGEST, "atom_digest.ogg", 1.0 }, + { KikiSound::SPIKES_START, "bot_move.ogg", 1.0 }, + { KikiSound::MENU_FADE, "menu_fade.ogg", 1.0 }, + { KikiSound::MENU_ITEM, "menu_item.ogg", 1.0 }, + { KikiSound::MENU_SELECT, "menu_select.ogg", 1.0 }, + { KikiSound::MENU_ABORT, "menu_abort.ogg", 1.0 }, + { KikiSound::GATE_OPEN, "gate_open.ogg", 1.0 }, + { KikiSound::GATE_CLOSE, "gate_close.ogg", 1.0 }, + { KikiSound::GATE_WARP, "gate_warp.ogg", 1.0 }, + { KikiSound::BOMB_EXPLODE, "bomb_explode.ogg", 1.0 }, + { KikiSound::BOMB_SPLITTER, "bomb_splitter.ogg", 1.0 }, + { KikiSound::GEAR_ON, "gear_on.ogg", 1.0 }, + { KikiSound::GEAR_OFF, "gear_off.ogg", 1.0 }, + { KikiSound::GENERATOR_ON, "generator_on.ogg", 1.0 }, + { KikiSound::GENERATOR_OFF, "generator_off.ogg", 1.0 }, + { KikiSound::MOTOR, "bomb_splitter.ogg", 1.0 }, }; // __________________________________________________________________________________________________ @@ -88,7 +88,7 @@ KikiSound::KikiSound () Mix_Volume (-1, sound_volume); // set the start volume // title song -#ifndef _WINDOWS +/* #ifndef _WINDOWS std::string song_path = kFileNativePath(Controller.getKikiHome() + "/sound/" + "title_song.mp3"); Mix_Music * music = Mix_LoadMUS(song_path.c_str()); if(!music) @@ -103,7 +103,7 @@ KikiSound::KikiSound () } } #endif - + */ int soundIndex = 0; while (soundIndex < KikiSound::END) { diff --git a/src/world/KikiWorld.cpp b/src/world/KikiWorld.cpp index bf253ae..43eea0f 100644 --- a/src/world/KikiWorld.cpp +++ b/src/world/KikiWorld.cpp @@ -287,6 +287,7 @@ void KikiWorld::deleteAllObjects () if (Controller.player) { + Controller.player->finishRotateAction(); removeObject (Controller.player); // remove the player first, to keep it's state Controller.timer_event->removeAllActions (); Controller.removeKeyHandler (Controller.player); // prevent keyboard input while building world