From fea5b04a7798ec2e409a306ad8f36264c0da6038 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Thu, 31 Oct 2013 23:48:19 +0100 Subject: [PATCH 01/45] Fixed compilation on Windows. --- JGE/include/JRenderer.h | 2 +- JGE/include/JSoundSystem.h | 5 ++--- JGE/include/JTypes.h | 32 ++++++++++++++++---------------- JGE/src/Qtconsole.cpp | 14 +++++++++----- JGE/src/pc/JGfx.cpp | 2 +- projects/mtg/include/config.h | 2 +- projects/mtg/wagic-qt.pro | 2 ++ 7 files changed, 32 insertions(+), 27 deletions(-) diff --git a/JGE/include/JRenderer.h b/JGE/include/JRenderer.h index ebbc66a3a..0a7b264e3 100644 --- a/JGE/include/JRenderer.h +++ b/JGE/include/JRenderer.h @@ -578,7 +578,7 @@ private: #if (!defined PSP) GLuint mCurrentTex; -#if (defined GL_ES_VERSION_2_0) || (defined GL_VERSION_2_0) || (defined WIN32) +#if ((defined GL_ES_VERSION_2_0) || (defined GL_VERSION_2_0) || (defined WIN32)) && (!defined CONSOLE_CONFIG) // MVP matrix ESMatrix theMvpMatrix; diff --git a/JGE/include/JSoundSystem.h b/JGE/include/JSoundSystem.h index a1a88e271..93fe4f1e3 100644 --- a/JGE/include/JSoundSystem.h +++ b/JGE/include/JSoundSystem.h @@ -25,8 +25,7 @@ #elif defined USE_PHONON #include #include -#else -#ifdef WIN32 +#elif defined WIN32 #include #define WITH_FMOD #elif defined (PSP) @@ -43,10 +42,10 @@ #include "JAudio.h" #include "JMP3.h" #endif + #ifdef WITH_FMOD #include "../Dependencies/include/fmod.h" #endif -#endif //------------------------------------------------------------------------------------------------ using namespace std; diff --git a/JGE/include/JTypes.h b/JGE/include/JTypes.h index 231161c22..9a2c9c594 100644 --- a/JGE/include/JTypes.h +++ b/JGE/include/JTypes.h @@ -75,16 +75,7 @@ enum { #define SCREEN_HEIGHT_F 272.0f -#ifdef WIN32 -// #define DEFAULT_BLEND BLEND_DEFAULT -// #define BLEND_OPTION_ADD BLEND_COLORADD -// #define BLEND_OPTION_BLEND (BLEND_COLORADD | BLEND_ALPHABLEND | BLEND_NOZWRITE) -#else -#ifndef CONSOLE_CONFIG -#define DEFAULT_BLEND GU_TFX_MODULATE -#define BLEND_OPTION_ADD GU_TFX_ADD -#define BLEND_OPTION_BLEND GU_TFX_BLEND -#else +#ifdef CONSOLE_CONFIG #define DEFAULT_BLEND 0 #define BLEND_OPTION_ADD 0 #define BLEND_OPTION_BLEND 0 @@ -100,9 +91,17 @@ enum { #define BLEND_ONE_MINUS_DST_COLOR 0 #define BLEND_SRC_ALPHA_SATURATE 0 #define GU_PSM_5551 0 - -#endif // CONSOLE_CONFIG +#else +#ifdef WIN32 +// #define DEFAULT_BLEND BLEND_DEFAULT +// #define BLEND_OPTION_ADD BLEND_COLORADD +// #define BLEND_OPTION_BLEND (BLEND_COLORADD | BLEND_ALPHABLEND | BLEND_NOZWRITE) +#else +#define DEFAULT_BLEND GU_TFX_MODULATE +#define BLEND_OPTION_ADD GU_TFX_ADD +#define BLEND_OPTION_BLEND GU_TFX_BLEND #endif +#endif // CONSOLE_CONFIG #if (defined WIN32) && (!defined LINUX) #include @@ -111,6 +110,10 @@ enum { typedef uint8_t byte; typedef uint32_t DWORD; typedef uint8_t BYTE; +#ifndef IOS +typedef bool BOOL; +#endif +#endif typedef int8_t s8; typedef int16_t s16; @@ -122,10 +125,6 @@ typedef uint32_t u32; #define ARGB(a, r, g, b) ((PIXEL_TYPE)((a) << 24) | ((r) << 16) | ((g) << 8) | (b)) #define RGBA(r, g, b, a) ((PIXEL_TYPE)((a) << 24) | ((b) << 16) | ((g) << 8) | (r)) #define TEXTURE_FORMAT 0 -#ifndef IOS -typedef bool BOOL; -#endif -#endif @@ -267,6 +266,7 @@ typedef struct #endif #else typedef uint32_t GLuint; +typedef float GLfloat; #endif //CONSOLE_CONFIG //------------------------------------------------------------------------------------------------ diff --git a/JGE/src/Qtconsole.cpp b/JGE/src/Qtconsole.cpp index b93af3cf2..96b0c9efb 100644 --- a/JGE/src/Qtconsole.cpp +++ b/JGE/src/Qtconsole.cpp @@ -9,9 +9,8 @@ #include "GameOptions.h" #include "MTGDeck.h" #include "DebugRoutines.h" - -#include #include +#include class WagicWrapper { @@ -19,17 +18,21 @@ public: WagicWrapper(); virtual ~WagicWrapper(); +public: + // used mainly to mesure the delta between 2 updates + static QElapsedTimer g_startTimer; + private: JGE* m_engine; JApp* m_app; JGameLauncher* m_launcher; }; +QElapsedTimer WagicWrapper::g_startTimer; + int JGEGetTime() { - struct timeval tv; - gettimeofday(&tv, NULL); - return tv.tv_sec * 1000 + tv.tv_usec / 1000; + return (int)WagicWrapper::g_startTimer.elapsed(); } bool JGEToggleFullscreen() @@ -57,6 +60,7 @@ WagicWrapper::WagicWrapper() m_app->Create(); m_engine->SetApp(m_app); JRenderer::GetInstance()->Enable2D(); + g_startTimer.restart(); } WagicWrapper::~WagicWrapper() diff --git a/JGE/src/pc/JGfx.cpp b/JGE/src/pc/JGfx.cpp index 9c8ba2d2b..6050eeeab 100644 --- a/JGE/src/pc/JGfx.cpp +++ b/JGE/src/pc/JGfx.cpp @@ -823,7 +823,7 @@ void JRenderer::BeginScene() esMatrixLoadIdentity(&theMvpMatrix); esOrtho(&theMvpMatrix, 0.0f, SCREEN_WIDTH_F, 0.0f, SCREEN_HEIGHT_F-1.0f,-1.0f, 1.0f); #endif //(!defined GL_ES_VERSION_2_0) && (!defined GL_VERSION_2_0) -#if (defined WIN32) || ((defined GL_VERSION_ES_CM_1_1) && (!defined IOS)) +#if (defined WIN32 && !defined GL_ES_VERSION_2_0) || ((defined GL_VERSION_ES_CM_1_1) && (!defined IOS)) float scaleH = mActualHeight/SCREEN_HEIGHT_F; float scaleW = mActualWidth/SCREEN_WIDTH_F; if (scaleH != 1.0f || scaleW != 1.0f) diff --git a/projects/mtg/include/config.h b/projects/mtg/include/config.h index e25b8e557..ada8c7add 100644 --- a/projects/mtg/include/config.h +++ b/projects/mtg/include/config.h @@ -1,7 +1,7 @@ #ifndef _DEBUG_H_ #define _DEBUG_H_ -#if ((defined WIN32) || (defined WP8)) && (!defined QT_CONFIG) +#if ((defined WIN32) || (defined WP8)) #define snprintf sprintf_s #endif diff --git a/projects/mtg/wagic-qt.pro b/projects/mtg/wagic-qt.pro index 5b9f9a3ac..5f9544b9b 100644 --- a/projects/mtg/wagic-qt.pro +++ b/projects/mtg/wagic-qt.pro @@ -68,6 +68,8 @@ INCLUDEPATH += include #!symbian:DESTDIR = bin unix:!symbian:LIBS += -lz +win32:LIBS += ../../JGE/Dependencies/lib/fmodvc.lib +win32:LIBS += ../../JGE/Dependencies/lib/zlibd.lib PRECOMPILED_HEADER = include/PrecompiledHeader.h #DEFINES += TRACK_OBJECT_USAGE From 6bf2147d94ab0cd21c60529c59e928f1eac5e2ef Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Wed, 6 Nov 2013 12:55:31 +0400 Subject: [PATCH 02/45] From the Vault: Twenty // imported accidental commit from svn repo --- projects/mtg/bin/Res/sets/V13/_cards.dat | 106 +++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 projects/mtg/bin/Res/sets/V13/_cards.dat diff --git a/projects/mtg/bin/Res/sets/V13/_cards.dat b/projects/mtg/bin/Res/sets/V13/_cards.dat new file mode 100644 index 000000000..2ef715464 --- /dev/null +++ b/projects/mtg/bin/Res/sets/V13/_cards.dat @@ -0,0 +1,106 @@ +[meta] +author=Wagic Team +name=From the Vault: Twenty +block=Vault +year=2013 +[/meta] +[card] +primitive=Akroma's Vengeance +id=373328 +rarity=M +[/card] +[card] +primitive=Chainer's Edict +id=373317 +rarity=M +[/card] +[card] +primitive=Chameleon Colossus +id=373321 +rarity=M +[/card] +[card] +primitive=Char +id=373332 +rarity=M +[/card] +[card] +primitive=Cruel Ultimatum +id=373318 +rarity=M +[/card] +[card] +primitive=Dark Ritual +id=373329 +rarity=M +[/card] +[card] +primitive=Fact or Fiction +id=373325 +rarity=M +[/card] +[card] +primitive=Fyndhorn Elves +id=373320 +rarity=M +[/card] +[card] +primitive=Gilded Lotus +id=373335 +rarity=M +[/card] +[card] +primitive=Green Sun's Zenith +id=373333 +rarity=M +[/card] +[card] +primitive=Hymn to Tourach +id=373324 +rarity=M +[/card] +[card] +primitive=Impulse +id=373330 +rarity=M +[/card] +[card] +primitive=Ink-Eyes, Servant of Oni +id=373327 +rarity=M +[/card] +[card] +primitive=Jace, the Mind Sculptor +id=373316 +rarity=M +[/card] +[card] +primitive=Kessig Wolf Run +id=373323 +rarity=M +[/card] +[card] +primitive=Swords to Plowshares +id=373334 +rarity=M +[/card] +[card] +primitive=Tangle Wire +id=373322 +rarity=M +[/card] +[card] +primitive=Thran Dynamo +id=373331 +rarity=M +[/card] +[card] +primitive=Venser, Shaper Savant +id=373326 +rarity=M +[/card] +[card] +primitive=Wall of Blossoms +id=373319 +rarity=M +[/card] From 14c2d522c203aafbc24dd5ae413ebb67f82e653a Mon Sep 17 00:00:00 2001 From: Rolzad73 Date: Thu, 7 Nov 2013 15:04:37 -0500 Subject: [PATCH 03/45] removed Android gen dir --- projects/mtg/Android/gen/R.java.d | 10 ------- .../gen/net/wagic/app/BuildConfig.java | 6 ----- projects/mtg/Android/gen/net/wagic/app/R.java | 27 ------------------- 3 files changed, 43 deletions(-) delete mode 100644 projects/mtg/Android/gen/R.java.d delete mode 100644 projects/mtg/Android/gen/net/wagic/app/BuildConfig.java delete mode 100644 projects/mtg/Android/gen/net/wagic/app/R.java diff --git a/projects/mtg/Android/gen/R.java.d b/projects/mtg/Android/gen/R.java.d deleted file mode 100644 index 3b5cb5410..000000000 --- a/projects/mtg/Android/gen/R.java.d +++ /dev/null @@ -1,10 +0,0 @@ -/Volumes/data/home/mnguyen/Projects/eclipse-workspace/wagic/projects/mtg/Android/gen/net/wagic/app/R.java \ - : /Volumes/data/home/mnguyen/Projects/eclipse-workspace/wagic/projects/mtg/Android/res/drawable-hdpi/icon.png \ -/Volumes/data/home/mnguyen/Projects/eclipse-workspace/wagic/projects/mtg/Android/res/drawable-ldpi/icon.png \ -/Volumes/data/home/mnguyen/Projects/eclipse-workspace/wagic/projects/mtg/Android/res/drawable-mdpi/icon.png \ -/Volumes/data/home/mnguyen/Projects/eclipse-workspace/wagic/projects/mtg/Android/res/layout/main.xml \ -/Volumes/data/home/mnguyen/Projects/eclipse-workspace/wagic/projects/mtg/Android/res/values/strings.xml \ -/Volumes/data/home/mnguyen/Projects/eclipse-workspace/wagic/projects/mtg/Android/bin/res/drawable-hdpi/icon.png \ -/Volumes/data/home/mnguyen/Projects/eclipse-workspace/wagic/projects/mtg/Android/bin/res/drawable-ldpi/icon.png \ -/Volumes/data/home/mnguyen/Projects/eclipse-workspace/wagic/projects/mtg/Android/bin/res/drawable-mdpi/icon.png \ -/Volumes/data/home/mnguyen/Projects/eclipse-workspace/wagic/projects/mtg/Android/bin/AndroidManifest.xml \ diff --git a/projects/mtg/Android/gen/net/wagic/app/BuildConfig.java b/projects/mtg/Android/gen/net/wagic/app/BuildConfig.java deleted file mode 100644 index c70b441e9..000000000 --- a/projects/mtg/Android/gen/net/wagic/app/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package net.wagic.app; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/projects/mtg/Android/gen/net/wagic/app/R.java b/projects/mtg/Android/gen/net/wagic/app/R.java deleted file mode 100644 index ec5e38a14..000000000 --- a/projects/mtg/Android/gen/net/wagic/app/R.java +++ /dev/null @@ -1,27 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ - -package net.wagic.app; - -public final class R { - public static final class attr { - } - public static final class drawable { - public static final int icon=0x7f020000; - } - public static final class id { - public static final int mainLayout=0x7f050000; - } - public static final class layout { - public static final int main=0x7f030000; - } - public static final class string { - public static final int app_name=0x7f040000; - public static final int app_version=0x7f040001; - public static final int info_text=0x7f040002; - } -} From 7a57de66087fb771562eb36172a9532a48095e12 Mon Sep 17 00:00:00 2001 From: Rolzad73 Date: Thu, 7 Nov 2013 15:49:53 -0500 Subject: [PATCH 04/45] removed ads on Android version --- .../Android/libs/GoogleAdMobAdsSdk-4.1.1.jar | Bin 55722 -> 0 bytes .../src/org/libsdl/app/SDLActivity.java | 36 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) delete mode 100644 projects/mtg/Android/libs/GoogleAdMobAdsSdk-4.1.1.jar diff --git a/projects/mtg/Android/libs/GoogleAdMobAdsSdk-4.1.1.jar b/projects/mtg/Android/libs/GoogleAdMobAdsSdk-4.1.1.jar deleted file mode 100644 index 7177b0fe4a23b82b69251729d1e2ecb68a143e4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55722 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 E1qNLYfdBvi diff --git a/projects/mtg/Android/src/org/libsdl/app/SDLActivity.java b/projects/mtg/Android/src/org/libsdl/app/SDLActivity.java index 6142ae386..4d7eda727 100644 --- a/projects/mtg/Android/src/org/libsdl/app/SDLActivity.java +++ b/projects/mtg/Android/src/org/libsdl/app/SDLActivity.java @@ -54,9 +54,9 @@ import android.view.View.OnKeyListener; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; -import com.google.ads.AdRequest; -import com.google.ads.AdSize; -import com.google.ads.AdView; +//import com.google.ads.AdRequest; +//import com.google.ads.AdSize; +//import com.google.ads.AdView; /** * SDL Activity @@ -68,7 +68,7 @@ public class SDLActivity extends Activity implements OnKeyListener public static String TAG = Activity.class.getCanonicalName(); // Main components - private static AdView mAdView; + //private static AdView mAdView; private static SDLActivity mSingleton; private static SDLSurface mSurface; @@ -423,24 +423,24 @@ public class SDLActivity extends Activity implements OnKeyListener holder.setType(SurfaceHolder.SURFACE_TYPE_GPU); // Create the adView - mAdView = new AdView(this, AdSize.BANNER, "a14e9009f88864f"); // "a14dc0ab7b27413" <-- for the alpha); + //mAdView = new AdView(this, AdSize.BANNER, "a14e9009f88864f"); // "a14dc0ab7b27413" <-- for the alpha); _videoLayout.addView(mSurface, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); - _videoLayout.addView(mAdView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.BOTTOM + Gravity.CENTER_HORIZONTAL)); + //_videoLayout.addView(mAdView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.BOTTOM + Gravity.CENTER_HORIZONTAL)); // mGLView.setFocusableInTouchMode(true); // mGLView.setFocusable(true); // adView.requestFreshAd(); setContentView(_videoLayout, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); mSurface.requestFocus(); - AdRequest request = new AdRequest(); + //AdRequest request = new AdRequest(); - request.addTestDevice(AdRequest.TEST_EMULATOR); - request.addTestDevice("1DA1E070BC7D4ABE8BA77EB73C2CB0AA"); // wololo's phone - request.addTestDevice("C386F3830A9789C649098A817BF54C04"); // xawotihs's tablet + //request.addTestDevice(AdRequest.TEST_EMULATOR); + //request.addTestDevice("1DA1E070BC7D4ABE8BA77EB73C2CB0AA"); // wololo's phone + //request.addTestDevice("C386F3830A9789C649098A817BF54C04"); // xawotihs's tablet // Initiate a generic request to load it with an ad - mAdView.loadAd(request); + //mAdView.loadAd(request); } // Setup @@ -513,13 +513,13 @@ public class SDLActivity extends Activity implements OnKeyListener return; } - if ((command.compareTo("entergamestate:menu") == 0) || (command.compareTo("enterduelphase:end") == 0)) - { - mAdView.setVisibility(View.VISIBLE); - } else if (command.compareTo("leavegamestate:menu") == 0) - { - mAdView.setVisibility(View.INVISIBLE); - } + //if ((command.compareTo("entergamestate:menu") == 0) || (command.compareTo("enterduelphase:end") == 0)) + //{ + // mAdView.setVisibility(View.VISIBLE); + //} else if (command.compareTo("leavegamestate:menu") == 0) + //{ + // mAdView.setVisibility(View.INVISIBLE); + //} } // Messages from the SDLMain thread From f95094a42912c5b19fd4c3dcef791ff9f6587622 Mon Sep 17 00:00:00 2001 From: Rolzad73 Date: Thu, 7 Nov 2013 15:56:43 -0500 Subject: [PATCH 05/45] removing commented lines I had intended to delete outright --- .../src/org/libsdl/app/SDLActivity.java | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/projects/mtg/Android/src/org/libsdl/app/SDLActivity.java b/projects/mtg/Android/src/org/libsdl/app/SDLActivity.java index 4d7eda727..0891808c8 100644 --- a/projects/mtg/Android/src/org/libsdl/app/SDLActivity.java +++ b/projects/mtg/Android/src/org/libsdl/app/SDLActivity.java @@ -54,10 +54,6 @@ import android.view.View.OnKeyListener; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; -//import com.google.ads.AdRequest; -//import com.google.ads.AdSize; -//import com.google.ads.AdView; - /** * SDL Activity */ @@ -68,7 +64,6 @@ public class SDLActivity extends Activity implements OnKeyListener public static String TAG = Activity.class.getCanonicalName(); // Main components - //private static AdView mAdView; private static SDLActivity mSingleton; private static SDLSurface mSurface; @@ -422,25 +417,12 @@ public class SDLActivity extends Activity implements OnKeyListener SurfaceHolder holder = mSurface.getHolder(); holder.setType(SurfaceHolder.SURFACE_TYPE_GPU); - // Create the adView - //mAdView = new AdView(this, AdSize.BANNER, "a14e9009f88864f"); // "a14dc0ab7b27413" <-- for the alpha); - _videoLayout.addView(mSurface, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); - //_videoLayout.addView(mAdView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.BOTTOM + Gravity.CENTER_HORIZONTAL)); // mGLView.setFocusableInTouchMode(true); // mGLView.setFocusable(true); // adView.requestFreshAd(); setContentView(_videoLayout, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); mSurface.requestFocus(); - - //AdRequest request = new AdRequest(); - - //request.addTestDevice(AdRequest.TEST_EMULATOR); - //request.addTestDevice("1DA1E070BC7D4ABE8BA77EB73C2CB0AA"); // wololo's phone - //request.addTestDevice("C386F3830A9789C649098A817BF54C04"); // xawotihs's tablet - - // Initiate a generic request to load it with an ad - //mAdView.loadAd(request); } // Setup @@ -512,14 +494,6 @@ public class SDLActivity extends Activity implements OnKeyListener { return; } - - //if ((command.compareTo("entergamestate:menu") == 0) || (command.compareTo("enterduelphase:end") == 0)) - //{ - // mAdView.setVisibility(View.VISIBLE); - //} else if (command.compareTo("leavegamestate:menu") == 0) - //{ - // mAdView.setVisibility(View.INVISIBLE); - //} } // Messages from the SDLMain thread From 90652fa73d321b963c6a2c758b203377b4d267a2 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Sat, 9 Nov 2013 19:40:01 +0100 Subject: [PATCH 06/45] Fixed PSP build and integrates it with Travis CI --- .travis.yml | 9 ++++++++- JGE/include/JTypes.h | 3 ++- JGE/src/JFileSystem.cpp | 2 ++ projects/mtg/Makefile | 31 ++++++++++++++++++++++++++++++- travis-script.sh | 17 +++++++++++++++++ 5 files changed, 59 insertions(+), 3 deletions(-) create mode 100755 travis-script.sh diff --git a/.travis.yml b/.travis.yml index 1ff1dbd72..17facf046 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,2 +1,9 @@ language: cpp -script: "qmake projects/mtg/wagic-qt.pro CONFIG+=console CONFIG+=debug && make -j 8 && ./wagic" +before_install: + - export PSPDEV="$TRAVIS_BUILD_DIR/opt/pspsdk" + - export PSPSDK="$PSPDEV/psp/sdk" + - export PATH="$PATH:$PSPDEV/bin:$PSPSDK/bin" +install: + - wget -O sdk.lzma http://sourceforge.net/projects/minpspw/files/SDK%20%2B%20devpak/pspsdk%200.11.2/minpspw_0.11.2-amd64.tar.lzma/download + - tar -x --xz -f sdk.lzma6 +script: "./travis-script.sh" diff --git a/JGE/include/JTypes.h b/JGE/include/JTypes.h index 9a2c9c594..7376303a8 100644 --- a/JGE/include/JTypes.h +++ b/JGE/include/JTypes.h @@ -124,7 +124,9 @@ typedef uint32_t u32; #define PIXEL_TYPE DWORD #define ARGB(a, r, g, b) ((PIXEL_TYPE)((a) << 24) | ((r) << 16) | ((g) << 8) | (b)) #define RGBA(r, g, b, a) ((PIXEL_TYPE)((a) << 24) | ((b) << 16) | ((g) << 8) | (r)) +#ifndef PSP #define TEXTURE_FORMAT 0 +#endif //PSP @@ -164,7 +166,6 @@ typedef uint32_t u32; #if defined (ABGR8888) -#define PIXEL_TYPE u32 #ifndef ARGB #define ARGB(a, r, g, b) (PIXEL_TYPE)((a << 24) | (b << 16) | (g << 8) | r) // macro to assemble pixels in correct format #endif diff --git a/JGE/src/JFileSystem.cpp b/JGE/src/JFileSystem.cpp index 3948dc4cc..cb377aa49 100644 --- a/JGE/src/JFileSystem.cpp +++ b/JGE/src/JFileSystem.cpp @@ -16,7 +16,9 @@ User folder is the only one that is really needed to guarantee both read and wri The content that users should not be touching. */ +#ifndef PSP #include "PrecompiledHeader.h" +#endif //PSP #ifdef WIN32 #pragma warning(disable : 4786) diff --git a/projects/mtg/Makefile b/projects/mtg/Makefile index 2866c86a1..9485d7d1b 100644 --- a/projects/mtg/Makefile +++ b/projects/mtg/Makefile @@ -1,4 +1,33 @@ -OBJS = objs/InteractiveButton.o objs/AbilityParser.o objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIHints.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIPlayerBaka.o objs/AIStats.o objs/AllAbilities.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardPrimitive.o objs/CardSelector.o objs/CardSelectorSingleton.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DeckDataWrapper.o objs/DeckEditorMenu.o objs/DeckMenu.o objs/DeckMenuItem.o objs/DeckMetaData.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateAwards.o objs/GameStateDeckViewer.o objs/GameStateDuel.o objs/DeckManager.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GameStateStory.o objs/GameStateTransitions.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/IconButton.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/ModRules.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGPack.o objs/MTGRules.o objs/Navigator.o objs/ObjectAnalytics.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/PlayRestrictions.o objs/Pos.o objs/PrecompiledHeader.o objs/PriceList.o objs/ReplacementEffects.o objs/Rules.o objs/SimpleMenu.o objs/SimpleButton.o objs/SimpleMenuItem.o objs/SimplePad.o objs/SimplePopup.o objs/StoryFlow.o objs/StyleManager.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/ThisDescriptor.o objs/Token.o objs/Translate.o objs/TranslateKeys.o objs/Trash.o objs/utils.o objs/WEvent.o objs/WResourceManager.o objs/WCachedResource.o objs/WDataSrc.o objs/WGui.o objs/WFilter.o objs/Tasks.o objs/WFont.o +OBJS = objs/InteractiveButton.o objs/AbilityParser.o objs/ActionElement.o\ + objs/ActionLayer.o objs/ActionStack.o objs/AIHints.o objs/AIMomirPlayer.o\ + objs/AIPlayer.o objs/AIPlayerBaka.o objs/AIStats.o objs/AllAbilities.o\ + objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o\ + objs/CardPrimitive.o objs/CardSelector.o objs/CardSelectorSingleton.o\ + objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o\ + objs/DeckDataWrapper.o objs/DeckEditorMenu.o objs/DeckMenu.o\ + objs/DeckMenuItem.o objs/DeckMetaData.o objs/DeckStats.o objs/DuelLayers.o\ + objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o\ + objs/GameObserver.o objs/GameOptions.o objs/GameState.o\ + objs/GameStateAwards.o objs/GameStateDeckViewer.o objs/GameStateDuel.o\ + objs/DeckManager.o objs/GameStateMenu.o objs/GameStateOptions.o\ + objs/GameStateShop.o objs/GameStateStory.o objs/GameStateTransitions.o\ + objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o\ + objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o\ + objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o\ + objs/IconButton.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o\ + objs/ModRules.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o\ + objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o\ + objs/MTGPack.o objs/MTGRules.o objs/Navigator.o objs/ObjectAnalytics.o\ + objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o\ + objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/PlayRestrictions.o\ + objs/Pos.o objs/PrecompiledHeader.o objs/PriceList.o objs/ReplacementEffects.o\ + objs/Rules.o objs/SimpleMenu.o objs/SimpleButton.o objs/SimpleMenuItem.o\ + objs/SimplePad.o objs/SimplePopup.o objs/StoryFlow.o objs/StyleManager.o\ + objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o\ + objs/ThisDescriptor.o objs/Token.o objs/Translate.o objs/TranslateKeys.o\ + objs/Trash.o objs/utils.o objs/WEvent.o objs/WResourceManager.o\ + objs/WCachedResource.o objs/WDataSrc.o objs/WGui.o objs/WFilter.o objs/Tasks.o\ + objs/WFont.o DEPS = $(patsubst objs/%.o, deps/%.d, $(OBJS)) RESULT = $(shell psp-config --psp-prefix 2> Makefile.cache) diff --git a/travis-script.sh b/travis-script.sh new file mode 100755 index 000000000..f01edd15b --- /dev/null +++ b/travis-script.sh @@ -0,0 +1,17 @@ +#!/bin/sh -ex + +# we're building a PSP binary here +cd JGE +make -j 8 +cd .. +cd projects/mtg +mkdir objs +make -j 8 + +# let's try an Intel linux binary +cd ../.. +qmake projects/mtg/wagic-qt.pro CONFIG+=console CONFIG+=debug +make -j 8 + +# and finish by running the testsuite +./wagic From 82de6f28404a37a9e8002984a6d29090842ca4e0 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Sat, 9 Nov 2013 19:51:47 +0100 Subject: [PATCH 07/45] Fixes stupid typo. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 17facf046..2b6cf9e36 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,5 +5,5 @@ before_install: - export PATH="$PATH:$PSPDEV/bin:$PSPSDK/bin" install: - wget -O sdk.lzma http://sourceforge.net/projects/minpspw/files/SDK%20%2B%20devpak/pspsdk%200.11.2/minpspw_0.11.2-amd64.tar.lzma/download - - tar -x --xz -f sdk.lzma6 + - tar -x --xz -f sdk.lzma script: "./travis-script.sh" From 0a765b702b31f5200ad7ec371dba3b7e56b605aa Mon Sep 17 00:00:00 2001 From: xawotihs Date: Sat, 9 Nov 2013 20:01:57 +0100 Subject: [PATCH 08/45] Introducing an error to check if Travis reports correctly a compile error with the script. --- JGE/include/JTypes.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/JGE/include/JTypes.h b/JGE/include/JTypes.h index 7376303a8..5025829f0 100644 --- a/JGE/include/JTypes.h +++ b/JGE/include/JTypes.h @@ -129,7 +129,6 @@ typedef uint32_t u32; #endif //PSP - #ifndef CONSOLE_CONFIG #ifndef QT_CONFIG #if defined (IOS) @@ -145,7 +144,7 @@ typedef uint32_t u32; #include #endif #else -# include +#include #endif #if (defined FORCE_GLES) @@ -159,7 +158,7 @@ typedef uint32_t u32; #endif #if defined (PSP) - +#error just to test that Travis stops correctly. #ifndef ABGR8888 #define ABGR8888 #endif From 9f16b2208d4f2d160dd382c191c2cbcb2a64f0bc Mon Sep 17 00:00:00 2001 From: xawotihs Date: Sat, 9 Nov 2013 20:15:00 +0100 Subject: [PATCH 09/45] Removes the error, it was perfectly detected by Travis CI. --- JGE/include/JTypes.h | 1 - 1 file changed, 1 deletion(-) diff --git a/JGE/include/JTypes.h b/JGE/include/JTypes.h index 5025829f0..0a7a23766 100644 --- a/JGE/include/JTypes.h +++ b/JGE/include/JTypes.h @@ -158,7 +158,6 @@ typedef uint32_t u32; #endif #if defined (PSP) -#error just to test that Travis stops correctly. #ifndef ABGR8888 #define ABGR8888 #endif From 6294bb1eede2aa52beb748c56c22cc0d5b9e9aa6 Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Sat, 16 Nov 2013 23:54:37 +0400 Subject: [PATCH 10/45] Added Master of Waves --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index bf8f0e792..a1dec7f26 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -54155,6 +54155,18 @@ power=2 toughness=2 [/card] [card] +name=Master of Waves +abilities=protection from red +auto=lord(Elemental|mybattlefield) 1/1 +auto=token(Elemental,Creature Elemental,1/0)*type:manaU +text=Protection from red. -- Elemental creatures you control get +1/+1. -- When Master of Waves enters the battlefield, put a number of 1/0 blue Elemental creature tokens onto the battlefield equal to your devotion to blue. (Each {U} in the mana costs of permanents you control counts toward your devotion to blue.) +mana={3}{U} +type=Creature +subtype=Merfolk Wizard +power=2 +toughness=1 +[/card] +[card] name=Master Splicer auto=token(Golem,Artifact Creature Golem,3/3) auto=lord(golem|mybattlefield) 1/1 From afc903e31b237cdff5707c4c04f384c7b9e19774 Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Sun, 17 Nov 2013 00:42:34 +0400 Subject: [PATCH 11/45] Added different names for attach and equip + moved implementation of AEquip to .cpp --- projects/mtg/include/AllAbilities.h | 115 ++++------------------------ projects/mtg/src/AllAbilities.cpp | 108 ++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 102 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index e1b65ab04..64e14ee8f 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -2794,113 +2794,24 @@ public: //equipment class AEquip: public TargetAbility { -public: +private: + bool isAttach; vector currentAbilities; - AEquip(GameObserver* observer, int _id, MTGCardInstance * _source, ManaCost * _cost = NULL, int restrictions = - ActivatedAbility::AS_SORCERY) : - TargetAbility(observer, _id, _source, NULL, _cost, restrictions) - { - aType = MTGAbility::STANDARD_EQUIP; - } + +public: + AEquip(GameObserver* observer, int _id, MTGCardInstance * _source, ManaCost * _cost = NULL, + int restrictions = ActivatedAbility::AS_SORCERY); - int unequip() - { - if (source->target) - { - source->target->equipment -= 1; - source->parentCards.clear(); - for(unsigned int w = 0;w < source->target->childrenCards.size();w++) - { - MTGCardInstance * child = source->target->childrenCards[w]; - if(child == source) - source->target->childrenCards.erase(source->target->childrenCards.begin() + w); - } - } - source->target = NULL; - for (size_t i = 0; i < currentAbilities.size(); ++i) - { - MTGAbility * a = currentAbilities[i]; - if (dynamic_cast (a) || dynamic_cast (a) || dynamic_cast (a) || (a->aType == MTGAbility::STANDARD_TOKENCREATOR && a->oneShot)) - { - SAFE_DELETE(a); - continue; - } - game->removeObserver(currentAbilities[i]); - } - currentAbilities.clear(); - return 1; - } + int unequip(); + int equip(MTGCardInstance * equipped); - int equip(MTGCardInstance * equipped) - { - source->target = equipped; - source->target->equipment += 1; - source->parentCards.push_back(equipped); - source->target->childrenCards.push_back((MTGCardInstance*)source); - AbilityFactory af(game); - af.getAbilities(¤tAbilities, NULL, source); - for (size_t i = 0; i < currentAbilities.size(); ++i) - { - MTGAbility * a = currentAbilities[i]; - if (dynamic_cast (a)) continue; - if (dynamic_cast (a)) continue; - if (dynamic_cast (a)) continue; - if (a->aType == MTGAbility::STANDARD_TOKENCREATOR && a->oneShot) - { - a->forceDestroy = 1; - continue; - } - if (dynamic_cast (af.getCoreAbility(a))) - { - a->forceDestroy = 1; - continue; - } - //we generally dont want to pass oneShot tokencreators to the cards - //we equip... - a->addToGame(); - } - return 1; + int resolve(); + const char * getMenuText(); - } - - int resolve() - { - MTGCardInstance * mTarget = tc->getNextCardTarget(); - if (!mTarget) return 0; - if (mTarget == source) return 0; - unequip(); - equip(mTarget); - return 1; - } - - const char * getMenuText() - { - return "Equip"; - } - - int testDestroy() - { - if (source->target && !game->isInPlay(source->target)) - unequip(); - if(!game->connectRule) - { - if (source->target && TargetAbility::tc && !TargetAbility::tc->canTarget((Targetable *)source->target,true)) - unequip(); - } - return TargetAbility::testDestroy(); - } - - int destroy() - { - unequip(); - return TargetAbility::destroy(); - } - - AEquip * clone() const - { - return NEW AEquip(*this); - } + int testDestroy(); + int destroy(); + AEquip * clone() const; }; class ATokenCreator: public ActivatedAbility diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 00cf88989..ce639bad0 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5291,6 +5291,114 @@ AAConnect * AAConnect::clone() const return NEW AAConnect(*this); } +AEquip::AEquip(GameObserver* observer, int _id, MTGCardInstance * _source, ManaCost * _cost, int restrictions) : + TargetAbility(observer, _id, _source, NULL, _cost, restrictions) +{ + aType = MTGAbility::STANDARD_EQUIP; + isAttach = restrictions != ActivatedAbility::AS_SORCERY; +} + +int AEquip::unequip() +{ + if (source->target) + { + source->target->equipment -= 1; + source->parentCards.clear(); + for (unsigned int w = 0; w < source->target->childrenCards.size(); w++) + { + MTGCardInstance * child = source->target->childrenCards[w]; + if (child == source) + source->target->childrenCards.erase(source->target->childrenCards.begin() + w); + } + } + source->target = NULL; + for (size_t i = 0; i < currentAbilities.size(); ++i) + { + MTGAbility * a = currentAbilities[i]; + if (dynamic_cast (a) || dynamic_cast (a) || dynamic_cast (a) + || (a->aType == MTGAbility::STANDARD_TOKENCREATOR && a->oneShot)) + { + SAFE_DELETE(a); + continue; + } + game->removeObserver(currentAbilities[i]); + } + currentAbilities.clear(); + return 1; +} + +int AEquip::equip(MTGCardInstance * equipped) +{ + source->target = equipped; + source->target->equipment += 1; + source->parentCards.push_back(equipped); + source->target->childrenCards.push_back((MTGCardInstance*)source); + AbilityFactory af(game); + af.getAbilities(¤tAbilities, NULL, source); + for (size_t i = 0; i < currentAbilities.size(); ++i) + { + MTGAbility * a = currentAbilities[i]; + if (dynamic_cast (a)) continue; + if (dynamic_cast (a)) continue; + if (dynamic_cast (a)) continue; + if (a->aType == MTGAbility::STANDARD_TOKENCREATOR && a->oneShot) + { + a->forceDestroy = 1; + continue; + } + if (dynamic_cast (af.getCoreAbility(a))) + { + a->forceDestroy = 1; + continue; + } + //we generally dont want to pass oneShot tokencreators to the cards + //we equip... + a->addToGame(); + } + return 1; +} + +int AEquip::resolve() +{ + MTGCardInstance * mTarget = tc->getNextCardTarget(); + if (!mTarget) return 0; + if (mTarget == source) return 0; + unequip(); + equip(mTarget); + return 1; +} + +const char * AEquip::getMenuText() +{ + if (isAttach) + return "Attach"; + else + return "Equip"; +} + +int AEquip::testDestroy() +{ + if (source->target && !game->isInPlay(source->target)) + unequip(); + if (!game->connectRule) + { + if (source->target && TargetAbility::tc && !TargetAbility::tc->canTarget((Targetable *)source->target,true)) + unequip(); + } + return TargetAbility::testDestroy(); +} + +int AEquip::destroy() +{ + unequip(); + return TargetAbility::destroy(); +} + +AEquip * AEquip::clone() const +{ + return NEW AEquip(*this); +} + // casting a card for free, or casting a copy of a card. AACastCard::AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool _restricted,bool _copied,bool asNormal,string _namedCard,string _name,bool _noEvent) : MTGAbility(observer, _id, _source),restricted(_restricted),asCopy(_copied),normal(asNormal),cardNamed(_namedCard),nameThis(_name),noEvent(_noEvent) From 2835bdf76726ceab9e3f1e4b673f29c3a2ba0a7a Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Sun, 17 Nov 2013 01:49:51 +0400 Subject: [PATCH 12/45] Fixed issue with Cranial Plating. Issue attach then equip: plating will give bonus to both creatures Fix Changed "attach" to "retarget target(creature|mybattlefield)" as this doesnot admit this bug Attach should become deprecated in future --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 10 +++++----- projects/mtg/src/AllAbilities.cpp | 1 + projects/mtg/src/MTGAbility.cpp | 1 + 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index a1dec7f26..6d356044e 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -17432,7 +17432,7 @@ toughness=4 [card] name=Cranial Plating auto=foreach(artifact|mybattlefield) 1/0 -auto={B}{B}:attach +auto={B}{B}:name(attach) retarget target(creature|mybattlefield) auto={1}:equip text=Equipped creature gets +1/+0 for each artifact you control. -- {B}{B}: Attach Cranial Plating to target creature you control. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) mana={2} @@ -39826,7 +39826,7 @@ name=Healer's Headdress auto={1}:equip auto=0/2 auto=teach(creature) {T}:prevent:1 target(creature,player) -auto={W}{W}:attach +auto={W}{W}:name(attach) retarget target(creature|mybattlefield) text=Equipped creature gets +0/+2 and has "{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn." -- {W}{W}: Attach Healer's Headdress to target creature you control. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) mana={2} type=Artifact @@ -41596,7 +41596,7 @@ toughness=2 name=Horned Helm auto=1/1 auto=trample -auto={G}{G}:attach +auto={G}{G}:name(attach) retarget target(creature|mybattlefield) auto={1}:equip text=Equipped creature gets +1/+1 and has trample. -- {G}{G}: Attach Horned Helm to target creature you control. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) mana={2} @@ -59983,7 +59983,7 @@ toughness=2 [card] name=Neurok Stealthsuit auto=teach(creature) shroud -auto={U}{U}:attach +auto={U}{U}:name(attach) retarget target(creature|mybattlefield) auto={1}:equip text=Equipped creature has shroud. (It can't be the target of spells or abilities.) -- {U}{U}: Attach Neurok Stealthsuit to target creature you control. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) mana={2} @@ -83437,7 +83437,7 @@ toughness=3 [card] name=Sparring Collar auto=first strike -auto={R}{R}:attach +auto={R}{R}:name(attach) retarget target(creature|mybattlefield) auto={1}:equip text=Equipped creature has first strike. -- {R}{R}: Attach Sparring Collar to target creature you control. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) mana={2} diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index ce639bad0..8cbe9742d 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5341,6 +5341,7 @@ int AEquip::equip(MTGCardInstance * equipped) if (dynamic_cast (a)) continue; if (dynamic_cast (a)) continue; if (dynamic_cast (a)) continue; + if (dynamic_cast (af.getCoreAbility(a))) continue; if (a->aType == MTGAbility::STANDARD_TOKENCREATOR && a->oneShot) { a->forceDestroy = 1; diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 4535f1d13..ff52b934a 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2163,6 +2163,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return NEW AEquip(observer, id, card); } + // TODO: deprecate this ability in favor of retarget //Equipment (attach) found = s.find("attach"); if (found != string::npos) From c6dc51c7d3bf84ca9fe48f0fff5dbba069af610e Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 15:34:23 +0100 Subject: [PATCH 13/45] Simplify Damage::resolve a bit --- projects/mtg/src/Damage.cpp | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index aff70bd6b..d571aed0f 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -59,24 +59,12 @@ int Damage::resolve() //reserved for culmulitive absorb ability coding //prevent next damage----------------------------- - if ((target)->preventable >= 1) - { - int preventing = (target)->preventable; - for (int k = preventing; k > 0; k--) - { - //the following keeps preventable from ADDING toughness/life if damage was less then preventable amount. - for (int i = damage; i >= 1; i--) - { - (target)->preventable -= 1; - damage -= 1; - break;//does the redux of damage 1 time, breaks the loop to deincrement preventing and start the loop over. - } - } - } - - //set prevent next damage back to 0 if it is equal to less then 0 - if ((target)->preventable < 0) + if ((target)->preventable > 0) { + int preventing = MIN(target->preventable, damage); + damage -= preventing; + target->preventable -= preventing; + }else{ (target)->preventable = 0; } From 146872797bf83a118d6f70b02e5f33d1bb946507 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 16:08:29 +0100 Subject: [PATCH 14/45] ActionElement.h: Replace defines, remove superfluous ";" Defines do not follow scope rules, but enums do. Enum classes even utilize strong type checking (but i am not sure about compiler support for c++11 on all target platforms). --- projects/mtg/include/ActionElement.h | 25 +++++++++---------------- projects/mtg/src/ActionElement.cpp | 10 ++-------- projects/mtg/src/MTGGamePhase.cpp | 8 ++++---- 3 files changed, 15 insertions(+), 28 deletions(-) diff --git a/projects/mtg/include/ActionElement.h b/projects/mtg/include/ActionElement.h index 7be2a33b8..bdd7007fe 100644 --- a/projects/mtg/include/ActionElement.h +++ b/projects/mtg/include/ActionElement.h @@ -9,10 +9,6 @@ #include #include "MTGDefinitions.h" -#define INACTIVE 0 -#define ACTION_REQUESTED 1 -#define ACTIVE 2 - class MTGCardInstance; class ManaCost; class Targetable; @@ -22,31 +18,33 @@ class WEvent; class ActionElement: public JGuiObject { protected: - int activeState; + enum Activity{ + Inactive, + ActionRequested, + Active + }; + + Activity activity; TargetChooser * tc; public: GamePhase currentPhase; GamePhase newPhase; int modal; int waitingForAnswer; - int getActivity(); - virtual void Update(float){}; - virtual void Render(){}; + virtual void Update(float){} + virtual void Render(){} virtual int testDestroy() { return 0; } - ; virtual int destroy() { return 0; } - ; virtual bool CheckUserInput(JButton) { return false; } - ; ActionElement(int id); ActionElement(const ActionElement& copyFromMe); TargetChooser * getActionTc(){return tc;} @@ -62,27 +60,22 @@ public: { return 0; } - ; virtual int stillInUse(MTGCardInstance *) { return 0; } - ; virtual int receiveEvent(WEvent *) { return 0; } - ; virtual int reactToClick(MTGCardInstance *) { return 0; } - ; virtual const char * getMenuText() { return "Ability"; } - ; virtual ActionElement * clone() const = 0; }; diff --git a/projects/mtg/src/ActionElement.cpp b/projects/mtg/src/ActionElement.cpp index abf685513..f5956fe2e 100644 --- a/projects/mtg/src/ActionElement.cpp +++ b/projects/mtg/src/ActionElement.cpp @@ -8,7 +8,7 @@ ActionElement::ActionElement(int id) : JGuiObject(id) { - activeState = INACTIVE; + activity = Inactive; modal = 0; waitingForAnswer = 0; currentPhase = MTG_PHASE_INVALID; @@ -18,7 +18,7 @@ ActionElement::ActionElement(int id) : ActionElement::ActionElement(const ActionElement& a): JGuiObject(a) { - activeState = a.activeState; + activity = a.activity; tc = a.tc ? a.tc->clone() : NULL; currentPhase = a.currentPhase; newPhase = a.newPhase; @@ -31,12 +31,6 @@ ActionElement::~ActionElement() SAFE_DELETE(tc); } -int ActionElement::getActivity() -{ - - return activeState; -} - int ActionElement::isReactingToTargetClick(Targetable * object) { if (MTGCardInstance * cObject = dynamic_cast(object)) diff --git a/projects/mtg/src/MTGGamePhase.cpp b/projects/mtg/src/MTGGamePhase.cpp index 4c93439e3..e88ae621d 100644 --- a/projects/mtg/src/MTGGamePhase.cpp +++ b/projects/mtg/src/MTGGamePhase.cpp @@ -17,7 +17,7 @@ void MTGGamePhase::Update(float) int newState = observer->getCurrentGamePhase(); if (newState != currentState) { - activeState = ACTIVE; + activity = Active; animation = 4; currentState = newState; } @@ -28,18 +28,18 @@ void MTGGamePhase::Update(float) } else { - activeState = INACTIVE; + activity = Inactive; animation = 0; } } bool MTGGamePhase::NextGamePhase() { - if (activeState == INACTIVE) + if (activity == Inactive) { if (observer->currentActionPlayer == observer->currentlyActing()) { - activeState = ACTIVE; + activity = Active; observer->userRequestNextGamePhase(); return true; } From 3ca2f1c1edefe1db78d4e16a31c812fadba3d943 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 17:12:58 +0100 Subject: [PATCH 15/45] Replace defines in Damage.h with enums. --- projects/mtg/include/AllAbilities.h | 10 +++--- projects/mtg/include/Damage.h | 38 +++++++++++++---------- projects/mtg/include/ReplacementEffects.h | 5 +-- projects/mtg/src/AIStats.cpp | 2 +- projects/mtg/src/ActionStack.cpp | 4 +-- projects/mtg/src/AllAbilities.cpp | 10 +++--- projects/mtg/src/Damage.cpp | 18 +++++------ projects/mtg/src/DamagerDamaged.cpp | 2 +- projects/mtg/src/GuiCombat.cpp | 2 +- projects/mtg/src/MTGAbility.cpp | 2 +- projects/mtg/src/MTGRules.cpp | 2 +- projects/mtg/src/ReplacementEffects.cpp | 4 +-- 12 files changed, 53 insertions(+), 46 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 64e14ee8f..6ff6c7521 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -873,8 +873,8 @@ public: return 0; if (!tc->canTarget(e->damage->target)) return 0; if (fromTc && !fromTc->canTarget(e->damage->source)) return 0; - if (type == 1 && e->damage->typeOfDamage != DAMAGE_COMBAT) return 0; - if (type == 2 && e->damage->typeOfDamage == DAMAGE_COMBAT) return 0; + if (type == 1 && e->damage->typeOfDamage != Damage::DAMAGE_COMBAT) return 0; + if (type == 2 && e->damage->typeOfDamage == Damage::DAMAGE_COMBAT) return 0; e->damage->target->thatmuch = e->damage->damage; e->damage->source->thatmuch = e->damage->damage; this->source->thatmuch = e->damage->damage; @@ -2577,7 +2577,7 @@ public: } else { - if (d->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (d->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { a->source = (MTGCardInstance *) d; } @@ -2725,7 +2725,7 @@ public: } else { - if (d->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (d->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { a->source = (MTGCardInstance *) d; } @@ -5549,7 +5549,7 @@ public: { WEventDamage * e = (WEventDamage *) event; Damage * d = e->damage; - if (combatonly && e->damage->typeOfDamage != DAMAGE_COMBAT) + if (combatonly && e->damage->typeOfDamage != Damage::DAMAGE_COMBAT) return 0; MTGCardInstance * card = d->source; if (d->damage > 0 && card && (card == source || card == source->target)) diff --git a/projects/mtg/include/Damage.h b/projects/mtg/include/Damage.h index 0074fa002..8789dd4d0 100644 --- a/projects/mtg/include/Damage.h +++ b/projects/mtg/include/Damage.h @@ -11,17 +11,15 @@ class JGuiObject; class MTGCardInstance; class GameObserver; -#define DAMAGEABLE_MTGCARDINSTANCE 0 -#define DAMAGEABLE_PLAYER 1 - -#define DAMAGE_ALL_TYPES 0 -#define DAMAGE_COMBAT 1 -#define DAMAGE_OTHER 2 - class Damageable:public Targetable { protected: public: + enum DamageableType{ + DAMAGEABLE_MTGCARDINSTANCE = 0, + DAMAGEABLE_PLAYER + }; + int life; int handsize; int poisonCount; @@ -29,12 +27,14 @@ public: int preventable; int thatmuch; int lifeLostThisTurn; - int type_as_damageable; + DamageableType type_as_damageable; Damageable(GameObserver* observer, int _life) - : Targetable(observer) - {life=_life;lifeLostThisTurn = 0;}; - int getLife(){return life;}; - virtual int dealDamage(int damage){life-=damage;return life;}; + : Targetable(observer), life(_life), handsize(0), + poisonCount(0), damageCount(0), preventable(0), thatmuch(0), + lifeLostThisTurn(0), type_as_damageable(DAMAGEABLE_MTGCARDINSTANCE) + {} + int getLife(){return life;} + virtual int dealDamage(int damage){life-=damage;return life;} virtual int afterDamage(){return 0;} virtual int poisoned(){return 0;} virtual int prevented(){return 0;} @@ -47,17 +47,23 @@ public: class Damage: public Interruptible { - protected: - void init(MTGCardInstance * source, Damageable * target, int damage, int typeOfDamage); public: + enum DamageType{ + DAMAGE_ALL_TYPES = 0, + DAMAGE_COMBAT, + DAMAGE_OTHER + }; + Damageable * target; - int typeOfDamage; + DamageType typeOfDamage; int damage; void Render(); Damage(GameObserver* observer, MTGCardInstance* source, Damageable * target); - Damage(GameObserver* observer, MTGCardInstance* source, Damageable * target, int damage, int typeOfDamage = DAMAGE_OTHER); + Damage(GameObserver* observer, MTGCardInstance* source, Damageable * target, int damage, DamageType typeOfDamage = DAMAGE_OTHER); int resolve(); virtual ostream& toString(ostream& out) const; + protected: + void init(MTGCardInstance * source, Damageable * target, int damage, DamageType typeOfDamage); }; class DamageStack : public GuiLayer, public Interruptible diff --git a/projects/mtg/include/ReplacementEffects.h b/projects/mtg/include/ReplacementEffects.h index 58219923c..1c2550fdc 100644 --- a/projects/mtg/include/ReplacementEffects.h +++ b/projects/mtg/include/ReplacementEffects.h @@ -29,9 +29,10 @@ protected: TargetChooser * tcTarget; int damage; bool oneShot; - int typeOfDamage; + Damage::DamageType typeOfDamage; public: - REDamagePrevention(MTGAbility * _source, TargetChooser *_tcSource = NULL, TargetChooser *_tcTarget = NULL, int _damage = -1, bool _oneShot = true, int typeOfDamage = DAMAGE_ALL_TYPES); + REDamagePrevention(MTGAbility * _source, TargetChooser *_tcSource = NULL, TargetChooser *_tcTarget = NULL, + int _damage = -1, bool _oneShot = true, Damage::DamageType typeOfDamage = Damage::DAMAGE_ALL_TYPES); WEvent * replace(WEvent *e); ~REDamagePrevention(); }; diff --git a/projects/mtg/src/AIStats.cpp b/projects/mtg/src/AIStats.cpp index 3e9a59664..e0d281e69 100644 --- a/projects/mtg/src/AIStats.cpp +++ b/projects/mtg/src/AIStats.cpp @@ -47,7 +47,7 @@ void AIStats::updateStatsCard(MTGCardInstance * cardInstance, Damage * damage, f { stat->value += static_cast(multiplier * STATS_PLAYER_MULTIPLIER * damage->damage); } - else if (damage->target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + else if (damage->target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { MTGCardInstance * target = (MTGCardInstance *) damage->target; if (target->controller() == player && !target->isInPlay(player->getObserver())) diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 69a32202e..6509bc217 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -161,7 +161,7 @@ void StackAbility::Render() if (target) { quad = target->getIcon(); - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { alt2 = ((MTGCardInstance *) target)->name; } @@ -400,7 +400,7 @@ void Spell::Render() if (target) { quad = target->getIcon(); - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { alt2 = ((MTGCardInstance *) target)->name; } diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 8cbe9742d..d0f2cad43 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2351,7 +2351,7 @@ int AALifer::resolve() return 0; WParsedInt life(life_s, NULL, source); - if (_target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (_target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { _target = ((MTGCardInstance *) _target)->controller(); } @@ -4380,7 +4380,7 @@ int AAExchangeLife::resolve() int oldlife = player->getLife(); int targetOldLife = _target->getLife(); int modifier = oldlife > targetOldLife? oldlife - targetOldLife:targetOldLife - oldlife; - if (_target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (_target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { int increaser = 0; MTGCardInstance * card = ((MTGCardInstance*)_target); @@ -4597,15 +4597,15 @@ int APreventDamageTypes::addToGame() fromTc->targetter = NULL; if (type != 1 && type != 2) {//not adding this creates a memory leak. - re = NEW REDamagePrevention(this, fromTc, toTc, -1, false, DAMAGE_COMBAT); + re = NEW REDamagePrevention(this, fromTc, toTc, -1, false, Damage::DAMAGE_COMBAT); } else if (type == 1) { - re = NEW REDamagePrevention(this, fromTc, toTc, -1, false, DAMAGE_ALL_TYPES); + re = NEW REDamagePrevention(this, fromTc, toTc, -1, false, Damage::DAMAGE_ALL_TYPES); } else if (type == 2) { - re = NEW REDamagePrevention(this, fromTc, toTc, -1, false, DAMAGE_OTHER); + re = NEW REDamagePrevention(this, fromTc, toTc, -1, false, Damage::DAMAGE_OTHER); } game->replacementEffects->add(re); return MTGAbility::addToGame(); diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index d571aed0f..f868be9c2 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -14,13 +14,13 @@ Damage::Damage(GameObserver* observer, MTGCardInstance * source, Damageable * ta init(source, target, source->getPower(), DAMAGE_OTHER); } -Damage::Damage(GameObserver* observer, MTGCardInstance * source, Damageable * target, int damage, int _typeOfDamage) +Damage::Damage(GameObserver* observer, MTGCardInstance * source, Damageable * target, int damage, DamageType _typeOfDamage) : Interruptible(observer) { init(source, target, damage, _typeOfDamage); } -void Damage::init(MTGCardInstance * _source, Damageable * _target, int _damage, int _typeOfDamage) +void Damage::init(MTGCardInstance * _source, Damageable * _target, int _damage, DamageType _typeOfDamage) { typeOfDamage = _typeOfDamage; target = _target; @@ -69,7 +69,7 @@ int Damage::resolve() } //------------------------------------------------- - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { MTGCardInstance * _target = (MTGCardInstance *) target; if ((_target)->protectedAgainst(source)) @@ -122,7 +122,7 @@ int Damage::resolve() int a = damage; - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE && (source->has(Constants::WITHER) || source->has( + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE && (source->has(Constants::WITHER) || source->has( Constants::INFECT))) { // Damage for WITHER or poison on creatures. This should probably go in replacement effects @@ -134,7 +134,7 @@ int Damage::resolve() if(_target->toughness <= 0 && _target->has(Constants::INDESTRUCTIBLE)) _target->controller()->game->putInGraveyard(_target); } - else if (target->type_as_damageable == DAMAGEABLE_PLAYER && (source->has(Constants::INFECT)||source->has(Constants::POISONDAMAGER))) + else if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER && (source->has(Constants::INFECT)||source->has(Constants::POISONDAMAGER))) { // Poison on player Player * _target = (Player *) target; @@ -151,7 +151,7 @@ int Damage::resolve() } } } - else if (target->type_as_damageable == DAMAGEABLE_PLAYER && (source->has(Constants::POISONTOXIC) || + else if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER && (source->has(Constants::POISONTOXIC) || source->has(Constants::POISONTWOTOXIC) || source->has(Constants::POISONTHREETOXIC))) { //Damage + 1, 2, or 3 poison counters on player @@ -190,9 +190,9 @@ int Damage::resolve() //return the left over amount after effects have been applied to them. a = target->dealDamage(damage); target->damageCount += damage;//the amount must be the actual damage so i changed this from 1 to damage, this fixes pdcount and odcount - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) ((MTGCardInstance*)target)->wasDealtDamage = true; - if (target->type_as_damageable == DAMAGEABLE_PLAYER) + if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) { if(target == source->controller()) { @@ -248,7 +248,7 @@ void Damage::Render() } else { - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) mFont->DrawString(_(((MTGCardInstance *) target)->getName()).c_str(), x + 120, y); } diff --git a/projects/mtg/src/DamagerDamaged.cpp b/projects/mtg/src/DamagerDamaged.cpp index 158a8d3dd..5f2be1383 100644 --- a/projects/mtg/src/DamagerDamaged.cpp +++ b/projects/mtg/src/DamagerDamaged.cpp @@ -43,7 +43,7 @@ void DamagerDamaged::addDamage(int damage, DamagerDamaged* source) return; } if (0 < damage) - damages.push_back(Damage(card->getObserver(), source->card, card, damage, DAMAGE_COMBAT)); + damages.push_back(Damage(card->getObserver(), source->card, card, damage, Damage::DAMAGE_COMBAT)); return; } diff --git a/projects/mtg/src/GuiCombat.cpp b/projects/mtg/src/GuiCombat.cpp index 46265e209..29888cac1 100644 --- a/projects/mtg/src/GuiCombat.cpp +++ b/projects/mtg/src/GuiCombat.cpp @@ -526,7 +526,7 @@ int GuiCombat::resolve() // Returns the number of damage objects dealt this turn } if (dmg > 0 && ((!attacker->isBlocked()) || attacker->has(Constants::TRAMPLE))) - stack->Add(NEW Damage(observer, (*it)->card, (Damageable*)attacker->isAttacking?(Damageable*)attacker->isAttacking:observer->opponent(), dmg, DAMAGE_COMBAT)); + stack->Add(NEW Damage(observer, (*it)->card, (Damageable*)attacker->isAttacking?(Damageable*)attacker->isAttacking:observer->opponent(), dmg, Damage::DAMAGE_COMBAT)); for (vector::iterator d = (*it)->damages.begin(); d != (*it)->damages.end(); ++d) stack->Add(NEW Damage(*d)); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index ff52b934a..cebf7e5ac 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -4477,7 +4477,7 @@ Player * MTGAbility::getPlayerFromDamageable(Damageable * target) if (!target) return NULL; - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) return ((MTGCardInstance *) target)->controller(); return (Player *) target; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index b8da4451c..03101b281 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -2700,7 +2700,7 @@ int MTGDeathtouchRule::receiveEvent(WEvent * event) if (!card) return 0; - if (d->target->type_as_damageable != DAMAGEABLE_MTGCARDINSTANCE) + if (d->target->type_as_damageable != Damageable::DAMAGEABLE_MTGCARDINSTANCE) return 0; MTGCardInstance * _target = (MTGCardInstance *) (d->target); diff --git a/projects/mtg/src/ReplacementEffects.cpp b/projects/mtg/src/ReplacementEffects.cpp index e330eee5f..b155043d0 100644 --- a/projects/mtg/src/ReplacementEffects.cpp +++ b/projects/mtg/src/ReplacementEffects.cpp @@ -6,7 +6,7 @@ #include "AllAbilities.h" REDamagePrevention::REDamagePrevention(MTGAbility * source, TargetChooser *tcSource, TargetChooser *tcTarget, int damage, - bool oneShot, int typeOfDamage) : + bool oneShot, Damage::DamageType typeOfDamage) : source(source), tcSource(tcSource), tcTarget(tcTarget), damage(damage), oneShot(oneShot), typeOfDamage(typeOfDamage) { } @@ -18,7 +18,7 @@ WEvent * REDamagePrevention::replace(WEvent *event) WEventDamage * e = dynamic_cast (event); if (!e) return event; Damage *d = e->damage; - if (d->typeOfDamage != typeOfDamage && typeOfDamage != DAMAGE_ALL_TYPES) return event; + if (d->typeOfDamage != typeOfDamage && typeOfDamage != Damage::DAMAGE_ALL_TYPES) return event; if ((!tcSource || tcSource->canTarget(d->source)) && (!tcTarget || tcTarget->canTarget(d->target))) { if (damage == -1) From 7a48c5e087488278a487df4a24029ecd649f50a8 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 19:36:24 +0100 Subject: [PATCH 16/45] Fix some cppcheck warnings (mostly style and postfix vs prefix iteration) --- projects/mtg/src/AIHints.cpp | 11 +++++----- projects/mtg/src/AIMomirPlayer.cpp | 7 ++----- projects/mtg/src/AIPlayer.cpp | 4 ++-- projects/mtg/src/AIPlayerBaka.cpp | 32 ++++++++++-------------------- projects/mtg/src/AIStats.cpp | 8 ++++---- projects/mtg/src/ActionLayer.cpp | 9 +++------ 6 files changed, 26 insertions(+), 45 deletions(-) diff --git a/projects/mtg/src/AIHints.cpp b/projects/mtg/src/AIHints.cpp index f61686598..c090c86be 100644 --- a/projects/mtg/src/AIHints.cpp +++ b/projects/mtg/src/AIHints.cpp @@ -307,14 +307,13 @@ bool AIHints::canWeCombo(GameObserver* observer,MTGCardInstance * card,AIPlayerB TargetChooserFactory tfc(observer); TargetChooser * hintTc = NULL; bool gotCombo = false; - int comboPartsHold = 0; - int comboPartsUntil = 0; - int comboPartsRestriction = 0; + for(unsigned int i = 0; i < hints.size();i++) { - comboPartsHold = 0; - comboPartsUntil = 0; - comboPartsRestriction = 0; + int comboPartsHold = 0; + int comboPartsUntil = 0; + int comboPartsRestriction = 0; + if(gotCombo) return gotCombo;//because more then one might be possible at any time. if (hints[i]->hold.size()) diff --git a/projects/mtg/src/AIMomirPlayer.cpp b/projects/mtg/src/AIMomirPlayer.cpp index 0d7e741a5..c67a11b55 100644 --- a/projects/mtg/src/AIMomirPlayer.cpp +++ b/projects/mtg/src/AIMomirPlayer.cpp @@ -90,13 +90,13 @@ int AIMomirPlayer::computeActions() } else if (p == this && observer->mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0) { //standard actions - CardDescriptor cd; - MTGCardInstance * card = NULL; switch (currentGamePhase) { case MTG_PHASE_FIRSTMAIN: { + CardDescriptor cd; + MTGCardInstance * card = NULL; ManaCost * potentialMana = getPotentialMana(); int converted = potentialMana->getConvertedCost(); SAFE_DELETE(potentialMana); @@ -118,15 +118,12 @@ int AIMomirPlayer::computeActions() } momir(); return 1; - break; } case MTG_PHASE_SECONDMAIN: selectAbility(); return 1; - break; default: return AIPlayerBaka::computeActions(); - break; } } return AIPlayerBaka::computeActions(); diff --git a/projects/mtg/src/AIPlayer.cpp b/projects/mtg/src/AIPlayer.cpp index 1c911af9d..fdb1e23bf 100644 --- a/projects/mtg/src/AIPlayer.cpp +++ b/projects/mtg/src/AIPlayer.cpp @@ -97,7 +97,7 @@ int AIAction::clickMultiAct(vector& actionTargets) ite = actionTargets.erase(ite); continue; } - ite++; + ++ite; } //shuffle to make it less predictable, otherwise ai will always seem to target from right to left. making it very obvious. @@ -167,7 +167,7 @@ int AIPlayer::clickMultiTarget(TargetChooser * tc, vector& potentia ite = potentialTargets.erase(ite); continue; } - ite++; + ++ite; } randomGenerator.random_shuffle(potentialTargets.begin(), potentialTargets.end()); diff --git a/projects/mtg/src/AIPlayerBaka.cpp b/projects/mtg/src/AIPlayerBaka.cpp index 2c1039562..3368812d0 100644 --- a/projects/mtg/src/AIPlayerBaka.cpp +++ b/projects/mtg/src/AIPlayerBaka.cpp @@ -134,10 +134,9 @@ int OrderedAIAction::getEfficiency() if (!target) break; - bool NeedPreventing; - NeedPreventing = false; if (currentPhase == MTG_PHASE_COMBATBLOCKERS) { + bool NeedPreventing = false; MTGCardInstance * nextOpponent = target->getNextOpponent(); if(!nextOpponent) break; @@ -152,12 +151,10 @@ int OrderedAIAction::getEfficiency() //small bonus added for the poor 1/1s, if we can save them, we will unless something else took precidence. //note is the target is being blocked or blocking a creature with wither or deathtouch, it is not even considered for preventing as it is a waste. //if its combat blockers, it is being blocked or blocking, and has less prevents the the amount of damage it will be taking, the effeincy is increased slightly and totalled by the danger rank multiplier for final result. - int calculateAfterDamage = 0; - int damages = 0; if((target->defenser || target->blockers.size()) && target->controller() == p) { - damages = nextOpponent->power; - calculateAfterDamage = int(target->toughness - damages); + int damages = nextOpponent->power; + int calculateAfterDamage = target->toughness - damages; if((calculateAfterDamage + target->preventable) > 0) { efficiency = 0; @@ -588,8 +585,7 @@ int OrderedAIAction::getEfficiency() efficiency = 80; if(atc->name.length() && atc->sabilities.length() && atc->types.size() && p->game->inPlay->findByName(atc->name)) { - list::iterator it; - for (it = atc->types.begin(); it != atc->types.end(); it++) + for (list::const_iterator it = atc->types.begin(); it != atc->types.end(); ++it) { if(*it == Subtypes::TYPE_LEGENDARY)//ai please stop killing voja!!! :P efficiency = 0; @@ -978,11 +974,10 @@ vector AIPlayerBaka::canPayMana(MTGCardInstance * target,ManaCost * } } ManaCostHybrid * hybridCost; - int hyb; - hyb = 0; hybridCost = cost->getHybridCost(0); if(hybridCost) { + int hyb = 0; while ((hybridCost = cost->getHybridCost(hyb)) != NULL) { //here we try to find one of the colors in the hybrid cost, it is done 1 at a time unfortunately @@ -1046,7 +1041,6 @@ vector AIPlayerBaka::canPayMana(MTGCardInstance * target,ManaCost * { ManaCost * withKickerCost= NEW ManaCost(cost->getKicker()); - int canKick = 0; vectorkickerPayment; bool keepLooking = true; while(keepLooking) @@ -1061,7 +1055,6 @@ vector AIPlayerBaka::canPayMana(MTGCardInstance * target,ManaCost * payments.push_back(kickerPayment[w]); } } - canKick += 1; keepLooking = cost->getKicker()->isMulti; } else @@ -1297,12 +1290,10 @@ int AIPlayerBaka::createAbilityTargets(MTGAbility * a, MTGCardInstance * c, Rank TargetChooser * AIPlayerBaka::GetComboTc( GameObserver * observer,TargetChooser * tc) { - TargetChooser * gathertc = NULL; TargetChooserFactory tcf(observer); - map::iterator it = comboHint->cardTargets.begin(); - for(map::iterator it = comboHint->cardTargets.begin();it != comboHint->cardTargets.end();it++) + for(map::iterator it = comboHint->cardTargets.begin();it != comboHint->cardTargets.end();++it) { - gathertc = tcf.createTargetChooser(it->first.c_str(),tc->source); + TargetChooser *gathertc = tcf.createTargetChooser(it->first.c_str(),tc->source); gathertc->setAllZones(); if(gathertc->canTarget(tc->source)) { @@ -1402,7 +1393,6 @@ int AIPlayerBaka::selectAbility() MTGCardInstance * card = game->inPlay->cards[j]; if(a->getCost() && !a->isReactingToClick(card, totalPotentialMana))//for performance reason only look for specific mana if the payment couldnt be made with potential. { - abilityPayment = vector(); abilityPayment = canPayMana(card,a->getCost()); } if (a->isReactingToClick(card, totalPotentialMana) || abilityPayment.size()) @@ -1410,10 +1400,9 @@ int AIPlayerBaka::selectAbility() if(a->getCost() && a->getCost()->hasX() && totalPotentialMana->getConvertedCost() < a->getCost()->getConvertedCost()+1) continue; //don't even bother to play an ability with {x} if you can't even afford x=1. - ManaCost * fullPayment = NULL; if (abilityPayment.size()) { - fullPayment = NEW ManaCost(); + ManaCost *fullPayment = NEW ManaCost(); for(int ch = 0; ch < int(abilityPayment.size());ch++) { AManaProducer * ampp = dynamic_cast (abilityPayment[ch]); @@ -1525,7 +1514,7 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard } //Make sure we own the decision to choose the targets assert(tc->Owner == observer->currentlyActing()); - if (tc && tc->Owner != observer->currentlyActing()) + if (tc->Owner != observer->currentlyActing()) { observer->currentActionPlayer = tc->Owner; //this is a hack, but if we hit this condition we are locked in a infinate loop @@ -1905,12 +1894,11 @@ MTGCardInstance * AIPlayerBaka::activateCombo() { if(!comboHint) return NULL; - TargetChooser * hintTc = NULL; TargetChooserFactory tfc(observer); ManaCost * totalCost = ManaCost::parseManaCost(comboHint->manaNeeded); for(unsigned int k = 0;k < comboHint->casting.size(); k++) { - hintTc = tfc.createTargetChooser(comboHint->casting[k],nextCardToPlay); + TargetChooser *hintTc = tfc.createTargetChooser(comboHint->casting[k],nextCardToPlay); int combohand = game->hand->cards.size(); for(int j = 0; j < combohand;j++) { diff --git a/projects/mtg/src/AIStats.cpp b/projects/mtg/src/AIStats.cpp index e0d281e69..b181e238b 100644 --- a/projects/mtg/src/AIStats.cpp +++ b/projects/mtg/src/AIStats.cpp @@ -24,7 +24,7 @@ AIStats::AIStats(Player * _player, char * _filename) AIStats::~AIStats() { list::iterator it; - for (it = stats.begin(); it != stats.end(); it++) + for (it = stats.begin(); it != stats.end(); ++it) { AIStat * stat = *it; delete stat; @@ -115,7 +115,7 @@ bool AIStats::isInTop(MTGCardInstance * card, unsigned int max, bool tooSmallCou MTGCard * source = card->model; int id = source->getMTGId(); list::iterator it; - for (it = stats.begin(); it != stats.end(); it++) + for (it = stats.begin(); it != stats.end(); ++it) { if (n >= max) return false; @@ -135,7 +135,7 @@ AIStat * AIStats::find(MTGCard * source) { int id = source->getMTGId(); list::iterator it; - for (it = stats.begin(); it != stats.end(); it++) + for (it = stats.begin(); it != stats.end(); ++it) { AIStat * stat = *it; if (stat->source == id) @@ -174,7 +174,7 @@ void AIStats::save() { char writer[128]; list::iterator it; - for (it = stats.begin(); it != stats.end(); it++) + for (it = stats.begin(); it != stats.end(); ++it) { AIStat * stat = *it; if (stat->value > 0) diff --git a/projects/mtg/src/ActionLayer.cpp b/projects/mtg/src/ActionLayer.cpp index 4ea73402e..ccdc9b2a4 100644 --- a/projects/mtg/src/ActionLayer.cpp +++ b/projects/mtg/src/ActionLayer.cpp @@ -165,8 +165,6 @@ void ActionLayer::Update(float dt) if (cantCancel) { ActionElement * ae = isWaitingForAnswer(); - int countTargets = 0; - int maxTargets = 0; if(ae && ae->getActionTc()) { if (!ae->getActionTc()->validTargetsExist()) @@ -175,8 +173,8 @@ void ActionLayer::Update(float dt) cancelCurrentAction(); return; } - countTargets = ae->getActionTc()->countValidTargets(); - maxTargets = ae->getActionTc()->maxtargets; + int countTargets = ae->getActionTc()->countValidTargets(); + int maxTargets = ae->getActionTc()->maxtargets; if (countTargets < maxTargets) { /* @@ -440,10 +438,9 @@ void ActionLayer::setCustomMenuObject(Targetable * object, bool must,vectorisMultipleChoice = true; - ActionElement * currentAction = NULL; for(int w = 0; w < int(abilities.size());w++) { - currentAction = (ActionElement*)abilities[w]; + ActionElement *currentAction = (ActionElement*)abilities[w]; currentActionCard = (MTGCardInstance*)abilities[0]->target; abilitiesMenu->Add(mObjects.size()-1, currentAction->getMenuText(),"",false); } From 446ed2075808eb3f7f6332d360f581300a0ef7e3 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 19:38:14 +0100 Subject: [PATCH 17/45] Fix typo ActionLayer::receiveEventPlus(...) This method is rarely used, however it returned 0 after adding stuff. It now returns the sum. --- projects/mtg/src/ActionLayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/ActionLayer.cpp b/projects/mtg/src/ActionLayer.cpp index ccdc9b2a4..5d21cf6c2 100644 --- a/projects/mtg/src/ActionLayer.cpp +++ b/projects/mtg/src/ActionLayer.cpp @@ -264,7 +264,7 @@ int ActionLayer::receiveEventPlus(WEvent * event) ActionElement * currentAction = (ActionElement *) mObjects[i]; result += currentAction->receiveEvent(event); } - return 0; + return result; } int ActionLayer::isReactingToTargetClick(Targetable * card) From e1213d1c1fdc2cba292a9738eb4a21a157b9606b Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 19:50:17 +0100 Subject: [PATCH 18/45] Remove variables flagged for removal (via conditional TODO comment) x and y is provided by PlayGuiObject::Pos. --- projects/mtg/include/ActionStack.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/projects/mtg/include/ActionStack.h b/projects/mtg/include/ActionStack.h index 2f831245e..48715c3d3 100644 --- a/projects/mtg/include/ActionStack.h +++ b/projects/mtg/include/ActionStack.h @@ -48,9 +48,6 @@ class TargetChooser; class Interruptible: public PlayGuiObject, public Targetable { public: - //TODO : remove these when they are back in PlayGuiObject - float x, y; - int state, display; MTGCardInstance * source; virtual void Entering() From 5419d87e4ed7ddfff1db32680a664fbd9dffe2d7 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 20:22:03 +0100 Subject: [PATCH 19/45] Get rid of two more define groups. --- projects/mtg/include/ActionStack.h | 11 ++++++----- projects/mtg/include/CardDescriptor.h | 10 ++++++---- projects/mtg/src/AIHints.cpp | 3 +-- projects/mtg/src/AIMomirPlayer.cpp | 3 +-- projects/mtg/src/TargetChooser.cpp | 12 ++++++------ 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/projects/mtg/include/ActionStack.h b/projects/mtg/include/ActionStack.h index 48715c3d3..06e7f2afe 100644 --- a/projects/mtg/include/ActionStack.h +++ b/projects/mtg/include/ActionStack.h @@ -41,10 +41,6 @@ class DamageStack; class ManaCost; class TargetChooser; - -#define ACTIONSTACK_STANDARD 0 -#define ACTIONSTACK_TARGET 1 - class Interruptible: public PlayGuiObject, public Targetable { public: @@ -183,6 +179,11 @@ public: class ActionStack :public GuiLayer { public: + enum ActionStackMode{ + ACTIONSTACK_STANDARD = 0, + ACTIONSTACK_TARGET = 1 + }; + typedef enum { NOT_DECIDED = 0, @@ -204,7 +205,7 @@ protected: InterruptDecision interruptDecision[2]; float timer; int currentState; - int mode; + ActionStackMode mode; int checked; ATutorialMessage* currentTutorial; int interruptBtnXOffset, noBtnXOffset, noToAllBtnXOffset, interruptDialogWidth; diff --git a/projects/mtg/include/CardDescriptor.h b/projects/mtg/include/CardDescriptor.h index 32cbbb11c..704e3d55f 100644 --- a/projects/mtg/include/CardDescriptor.h +++ b/projects/mtg/include/CardDescriptor.h @@ -9,9 +9,6 @@ #include "MTGGameZones.h" #include "Counters.h" -#define CD_OR 1 -#define CD_AND 2 - enum ENUM_COMPARISON_MODES { COMPARISON_NONE = 0, // Needs to remain 0 for quick if(comparison_mode) checks @@ -31,7 +28,12 @@ class CardDescriptor: public MTGCardInstance MTGCardInstance * match_not(MTGCardInstance * card); bool valueInRange(int comparisonMode, int value, int criterion); public: - int mode; + enum Operator{ + CD_OR = 1, + CD_AND = 2 + }; + + Operator mode; int powerComparisonMode; int toughnessComparisonMode; int manacostComparisonMode; diff --git a/projects/mtg/src/AIHints.cpp b/projects/mtg/src/AIHints.cpp index c090c86be..c8dae463f 100644 --- a/projects/mtg/src/AIHints.cpp +++ b/projects/mtg/src/AIHints.cpp @@ -74,8 +74,7 @@ AIHint::AIHint(string _line) if(action.find( "combo ") != string::npos) { - string Combo = ""; - Combo = action.c_str() + 6; + string Combo = action.c_str() + 6; combos.push_back(Combo); } diff --git a/projects/mtg/src/AIMomirPlayer.cpp b/projects/mtg/src/AIMomirPlayer.cpp index c67a11b55..5daaa55b3 100644 --- a/projects/mtg/src/AIMomirPlayer.cpp +++ b/projects/mtg/src/AIMomirPlayer.cpp @@ -96,7 +96,6 @@ int AIMomirPlayer::computeActions() case MTG_PHASE_FIRSTMAIN: { CardDescriptor cd; - MTGCardInstance * card = NULL; ManaCost * potentialMana = getPotentialMana(); int converted = potentialMana->getConvertedCost(); SAFE_DELETE(potentialMana); @@ -106,7 +105,7 @@ int AIMomirPlayer::computeActions() //Attempt to put land into play cd.init(); cd.setColor(Constants::MTG_COLOR_LAND); - card = cd.match(game->hand); + MTGCardInstance *card = cd.match(game->hand); int canPutLandsIntoPlay = game->playRestrictions->canPutIntoZone(card, game->inPlay); if (card && (canPutLandsIntoPlay == PlayRestriction::CAN_PLAY)) { diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 4db161dc0..2e73f23e4 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -294,13 +294,13 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta string attribute; if (found2 != string::npos) { - cd->mode = CD_OR; + cd->mode = CardDescriptor::CD_OR; attribute = attributes.substr(0, found2); attributes = attributes.substr(found2 + 1); } else if (foundAnd != string::npos) { - cd->mode = CD_AND; + cd->mode = CardDescriptor::CD_AND; attribute = attributes.substr(0, foundAnd); attributes = attributes.substr(foundAnd + 1); } @@ -550,7 +550,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta else cd->colors = card->colors; - cd->mode = CD_OR; + cd->mode = CardDescriptor::CD_OR; } else if( CDtype.find("types") != string::npos ) { @@ -572,7 +572,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta cd->removeType("creature"); cd->removeType("planeswalker"); cd->removeType("tribal"); - cd->mode = CD_OR; + cd->mode = CardDescriptor::CD_OR; } } else if (attribute.find("counter") != string::npos) @@ -629,7 +629,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta { cd->SetExclusionColor(cid); } - cd->mode = CD_OR; + cd->mode = CardDescriptor::CD_OR; } if (attribute.find("chosencolor") != string::npos) @@ -685,7 +685,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta } } if (nbminuses) - cd->mode = CD_AND; + cd->mode = CardDescriptor::CD_AND; typeName = typeName.substr(0, found); } if (cd) From 94c3ac9ad9c5d77fa612f2f51404d230d8122014 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 21:02:08 +0100 Subject: [PATCH 20/45] Fix FTBFS --- projects/mtg/src/CardGui.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 0874f8291..0c414ae94 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -1013,7 +1013,7 @@ bool CardGui::FilterCard(MTGCard * _card,string filter) CardDescriptor cd; MTGCardInstance * card = (MTGCardInstance*) _card->data; cd.init(); - cd.mode = CD_OR; + cd.mode = CardDescriptor::CD_OR; while (filter.size()) { @@ -1033,13 +1033,13 @@ bool CardGui::FilterCard(MTGCard * _card,string filter) string attribute; if (found2 != string::npos) { - cd.mode = CD_OR; + cd.mode = CardDescriptor::CD_OR; attribute = attributes.substr(0, found2); attributes = attributes.substr(found2 + 1); } else if (foundAnd != string::npos) { - cd.mode = CD_AND; + cd.mode = CardDescriptor::CD_AND; attribute = attributes.substr(0, foundAnd); attributes = attributes.substr(foundAnd + 1); } @@ -1302,7 +1302,7 @@ bool CardGui::FilterCard(MTGCard * _card,string filter) } } if (nbminuses) - cd.mode = CD_AND; + cd.mode = CardDescriptor::CD_AND; filter = filter.substr(0, found); } else @@ -1312,7 +1312,7 @@ bool CardGui::FilterCard(MTGCard * _card,string filter) if (found != string::npos) { - cd.mode = CD_OR; + cd.mode = CardDescriptor::CD_OR; typeName = filter.substr(0, found); filter = filter.substr(found + 1); } From f2314ca673c7781601e299567011363a08f0b041 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 21:05:07 +0100 Subject: [PATCH 21/45] Use proposed coding style --- projects/mtg/src/Damage.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index d571aed0f..20f4b67fb 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -59,13 +59,15 @@ int Damage::resolve() //reserved for culmulitive absorb ability coding //prevent next damage----------------------------- - if ((target)->preventable > 0) + if (target->preventable > 0) { int preventing = MIN(target->preventable, damage); damage -= preventing; target->preventable -= preventing; - }else{ - (target)->preventable = 0; + } + else + { + target->preventable = 0; } //------------------------------------------------- From 6c41e5c92c7a38bf21be3debaf70828df138e34d Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Tue, 19 Nov 2013 02:41:30 +0400 Subject: [PATCH 22/45] Added option (#define CAPTURE_STDERR) if set then the DebugTrace calls only for failing tests are shown --- JGE/include/DebugRoutines.h | 15 ++++++++++++++- JGE/include/OutputCapturer.h | 28 ++++++++++++++++++++++++++++ JGE/src/OutputCapturer.cpp | 3 +++ JGE/src/Qtconsole.cpp | 3 +++ projects/mtg/src/TestSuiteAI.cpp | 12 ++++++++++++ projects/mtg/wagic-qt.pro | 2 ++ travis-script.sh | 2 +- 7 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 JGE/include/OutputCapturer.h create mode 100644 JGE/src/OutputCapturer.cpp diff --git a/JGE/include/DebugRoutines.h b/JGE/include/DebugRoutines.h index 944d4e7a1..1ce188214 100644 --- a/JGE/include/DebugRoutines.h +++ b/JGE/include/DebugRoutines.h @@ -4,6 +4,8 @@ // dirty, but I get OS header includes this way #include "JGE.h" +#include "OutputCapturer.h" + #include #include #include @@ -29,12 +31,23 @@ std::string ToHex(T* pointer) #if defined (WIN32) || defined (LINUX) #ifdef QT_CONFIG + +#ifdef CAPTURE_STDERR #define DebugTrace(inString) \ { \ std::ostringstream stream; \ stream << inString; \ - qDebug("%s", stream.str().c_str()); \ + OutputCapturer::add(stream.str()); \ } +#else // CAPTURE_STDERR +#define DebugTrace(inString) \ +{ \ + std::ostringstream stream; \ + stream << inString; \ + qDebug("%s", stream.str().c_str()); \ +} +#endif // CAPTURE_STDERR + #elif defined (ANDROID) #include #define DebugTrace(inString) \ diff --git a/JGE/include/OutputCapturer.h b/JGE/include/OutputCapturer.h new file mode 100644 index 000000000..9e2f3d924 --- /dev/null +++ b/JGE/include/OutputCapturer.h @@ -0,0 +1,28 @@ +#ifndef OUTPUTCAPTURER_H +#define OUTPUTCAPTURER_H + +#if defined(QT_CONFIG) +#include +#include +#include + +class OutputCapturer +{ +private: + static std::ostringstream stream; +public: + static void add(const std::string& s) { + stream << s << "\n"; + } + static void debugAndClear() { + stream.flush(); + qDebug("%s", stream.str().c_str()); + stream.str(""); + } + static void clear() { + stream.str(""); + } +}; +#endif + +#endif // OUTPUTCAPTURER_H diff --git a/JGE/src/OutputCapturer.cpp b/JGE/src/OutputCapturer.cpp new file mode 100644 index 000000000..3c31da724 --- /dev/null +++ b/JGE/src/OutputCapturer.cpp @@ -0,0 +1,3 @@ +#include "../include/OutputCapturer.h" + +std::ostringstream OutputCapturer::stream; diff --git a/JGE/src/Qtconsole.cpp b/JGE/src/Qtconsole.cpp index 96b0c9efb..9f3078393 100644 --- a/JGE/src/Qtconsole.cpp +++ b/JGE/src/Qtconsole.cpp @@ -98,5 +98,8 @@ int main(int argc, char* argv[]) result = testSuite.run(); delete wagicCore; DebugTrace("TestSuite done: failed test: " << result); +#ifdef CAPTURE_STDERR + OutputCapturer::debugAndClear(); +#endif return result; } diff --git a/projects/mtg/src/TestSuiteAI.cpp b/projects/mtg/src/TestSuiteAI.cpp index 80c930ef8..eeb279fd2 100644 --- a/projects/mtg/src/TestSuiteAI.cpp +++ b/projects/mtg/src/TestSuiteAI.cpp @@ -433,6 +433,15 @@ void TestSuiteGame::assertGame() Log("==Test Succesful !=="); else Log("==Test Failed !=="); +#ifdef CAPTURE_STDERR + if (error) + { + OutputCapturer::debugAndClear(); + } else + { + OutputCapturer::clear(); + } +#endif mMutex.unlock(); } @@ -585,6 +594,9 @@ void TestSuite::ThreadProc(void* inParam) { LOG("Entering TestSuite::ThreadProc"); TestSuite* instance = reinterpret_cast(inParam); +#ifdef CAPTURE_STDERR + OutputCapturer::debugAndClear(); +#endif if (instance) { string filename; diff --git a/projects/mtg/wagic-qt.pro b/projects/mtg/wagic-qt.pro index 5f9544b9b..715823a8a 100644 --- a/projects/mtg/wagic-qt.pro +++ b/projects/mtg/wagic-qt.pro @@ -327,6 +327,7 @@ SOURCES += \ ../../JGE/src/pc/JSocket.cpp\ ../../JGE/src/pc/JSfx.cpp\ ../../JGE/src/JSprite.cpp\ + ../../JGE/src/OutputCapturer.cpp\ ../../JGE/src/Vector2D.cpp\ ../../JGE/src/tinyxml/tinystr.cpp\ ../../JGE/src/tinyxml/tinyxml.cpp\ @@ -393,6 +394,7 @@ HEADERS += \ ../../JGE/include/JSpline.h\ ../../JGE/include/JSprite.h\ ../../JGE/include/JTypes.h\ + ../../JGE/include/OutputCapturer.h\ ../../JGE/include/Vector2D.h\ ../../JGE/include/Vector3D.h\ ../../JGE/include/vram.h\ diff --git a/travis-script.sh b/travis-script.sh index f01edd15b..b9461e8a9 100755 --- a/travis-script.sh +++ b/travis-script.sh @@ -10,7 +10,7 @@ make -j 8 # let's try an Intel linux binary cd ../.. -qmake projects/mtg/wagic-qt.pro CONFIG+=console CONFIG+=debug +qmake projects/mtg/wagic-qt.pro CONFIG+=console CONFIG+=debug DEFINES+=CAPTURE_STDERR make -j 8 # and finish by running the testsuite From 331e126787489353ec704298f8b42d1bcb3ecfd1 Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Tue, 19 Nov 2013 02:57:42 +0400 Subject: [PATCH 23/45] Added info about total number of tests --- JGE/src/Qtconsole.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/JGE/src/Qtconsole.cpp b/JGE/src/Qtconsole.cpp index 9f3078393..a09f5ba25 100644 --- a/JGE/src/Qtconsole.cpp +++ b/JGE/src/Qtconsole.cpp @@ -96,8 +96,9 @@ int main(int argc, char* argv[]) options.reloadProfile(); TestSuite testSuite("test/_tests.txt"); result = testSuite.run(); + int totalTests = testSuite.nbTests + testSuite.nbAITests; delete wagicCore; - DebugTrace("TestSuite done: failed test: " << result); + DebugTrace("TestSuite done: failed test: " << result << " out of " << totalTests << " total"); #ifdef CAPTURE_STDERR OutputCapturer::debugAndClear(); #endif From f370899a8abd137376e3dd7887bf705ae4d397a1 Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Tue, 19 Nov 2013 03:58:43 +0400 Subject: [PATCH 24/45] Thread-safe version of OutputCapturer --- JGE/include/OutputCapturer.h | 4 ++++ JGE/include/Threading.h | 1 - JGE/src/OutputCapturer.cpp | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/JGE/include/OutputCapturer.h b/JGE/include/OutputCapturer.h index 9e2f3d924..fe23f1e89 100644 --- a/JGE/include/OutputCapturer.h +++ b/JGE/include/OutputCapturer.h @@ -5,13 +5,17 @@ #include #include #include +#include "Threading.h" class OutputCapturer { private: static std::ostringstream stream; + static boost::mutex mMutex; + public: static void add(const std::string& s) { + boost::mutex::scoped_lock lock(mMutex); stream << s << "\n"; } static void debugAndClear() { diff --git a/JGE/include/Threading.h b/JGE/include/Threading.h index fe3c79068..2c0667ce7 100644 --- a/JGE/include/Threading.h +++ b/JGE/include/Threading.h @@ -315,7 +315,6 @@ namespace boost #include #include -#include "../include/DebugRoutines.h" #include "../include/JLogger.h" namespace boost diff --git a/JGE/src/OutputCapturer.cpp b/JGE/src/OutputCapturer.cpp index 3c31da724..41dc4fb81 100644 --- a/JGE/src/OutputCapturer.cpp +++ b/JGE/src/OutputCapturer.cpp @@ -1,3 +1,4 @@ #include "../include/OutputCapturer.h" std::ostringstream OutputCapturer::stream; +boost::mutex mMutex; From 071a487100ea300a8b72aba178ee797d8feb6883 Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Tue, 19 Nov 2013 11:06:31 +0400 Subject: [PATCH 25/45] Fixed compilation error --- JGE/include/OutputCapturer.h | 15 +++------------ JGE/src/OutputCapturer.cpp | 20 +++++++++++++++++++- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/JGE/include/OutputCapturer.h b/JGE/include/OutputCapturer.h index fe23f1e89..4b32e301a 100644 --- a/JGE/include/OutputCapturer.h +++ b/JGE/include/OutputCapturer.h @@ -14,18 +14,9 @@ private: static boost::mutex mMutex; public: - static void add(const std::string& s) { - boost::mutex::scoped_lock lock(mMutex); - stream << s << "\n"; - } - static void debugAndClear() { - stream.flush(); - qDebug("%s", stream.str().c_str()); - stream.str(""); - } - static void clear() { - stream.str(""); - } + static void add(const std::string& s); + static void debugAndClear(); + static void clear(); }; #endif diff --git a/JGE/src/OutputCapturer.cpp b/JGE/src/OutputCapturer.cpp index 41dc4fb81..902dc10e8 100644 --- a/JGE/src/OutputCapturer.cpp +++ b/JGE/src/OutputCapturer.cpp @@ -1,4 +1,22 @@ #include "../include/OutputCapturer.h" std::ostringstream OutputCapturer::stream; -boost::mutex mMutex; +boost::mutex OutputCapturer::mMutex; + +void OutputCapturer::add(const std::string& s) +{ + boost::mutex::scoped_lock lock(mMutex); + stream << s << "\n"; +} + +void OutputCapturer::debugAndClear() +{ + stream.flush(); + qDebug("%s", stream.str().c_str()); + stream.str(""); +} + +void OutputCapturer::clear() +{ + stream.str(""); +} From 35697a65b4d6f0052375e7c9c8e59b366d7875e0 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Wed, 20 Nov 2013 11:13:35 +0100 Subject: [PATCH 26/45] Use style guide --- projects/mtg/src/ActionLayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/ActionLayer.cpp b/projects/mtg/src/ActionLayer.cpp index 5d21cf6c2..5efec2e67 100644 --- a/projects/mtg/src/ActionLayer.cpp +++ b/projects/mtg/src/ActionLayer.cpp @@ -440,7 +440,7 @@ void ActionLayer::setCustomMenuObject(Targetable * object, bool must,vectorisMultipleChoice = true; for(int w = 0; w < int(abilities.size());w++) { - ActionElement *currentAction = (ActionElement*)abilities[w]; + ActionElement* currentAction = (ActionElement*)abilities[w]; currentActionCard = (MTGCardInstance*)abilities[0]->target; abilitiesMenu->Add(mObjects.size()-1, currentAction->getMenuText(),"",false); } From bbc310dec7fe66adf2ad16fe7e452e1b1a0daeb0 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 21:55:16 +0100 Subject: [PATCH 27/45] Remove some dead code --- projects/mtg/include/CardEffect.h | 21 --------------------- projects/mtg/include/GameApp.h | 2 -- projects/mtg/include/OSD.h | 11 ----------- projects/mtg/src/CardEffect.cpp | 20 -------------------- projects/mtg/src/GameStateDeckViewer.cpp | 16 ---------------- projects/mtg/template.vcxproj | 2 -- projects/mtg/template.vcxproj.filters | 6 ------ projects/mtg/wagic-qt.pro | 3 --- 8 files changed, 81 deletions(-) delete mode 100644 projects/mtg/include/CardEffect.h delete mode 100644 projects/mtg/include/OSD.h delete mode 100644 projects/mtg/src/CardEffect.cpp diff --git a/projects/mtg/include/CardEffect.h b/projects/mtg/include/CardEffect.h deleted file mode 100644 index ef2ea3b09..000000000 --- a/projects/mtg/include/CardEffect.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _CARDEFFECT_H_ -#define _CARDEFFECT_H_ - -#include -#include "Effects.h" - -struct CardGui; - -class CardEffect: public Effect -{ -public: - CardEffect(CardGui* target); - ~CardEffect(); -private: - CardGui* target; - -public: - virtual void Render(); -}; - -#endif // _CARDEFFECT_H_ diff --git a/projects/mtg/include/GameApp.h b/projects/mtg/include/GameApp.h index 7c0c996d7..eeb1c8141 100644 --- a/projects/mtg/include/GameApp.h +++ b/projects/mtg/include/GameApp.h @@ -20,7 +20,6 @@ #include "MTGCard.h" #include "MTGGameZones.h" -#include "CardEffect.h" #ifdef NETWORK_SUPPORT #include "JNetwork.h" #endif //NETWORK_SUPPORT @@ -49,7 +48,6 @@ public: GameType gameType; Rules * rules; - CardEffect *effect; #ifdef NETWORK_SUPPORT string mServerAddress; JNetwork* mpNetwork; diff --git a/projects/mtg/include/OSD.h b/projects/mtg/include/OSD.h deleted file mode 100644 index f6733ebd3..000000000 --- a/projects/mtg/include/OSD.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _OSD_H_ -#define _OSD_H_ - -class OSDLayer: public PlayGuiObjectController -{ - virtual void Update(float dt); - virtual bool CheckUserInput(JButton key); - virtual void Render(); -}; - -#endif diff --git a/projects/mtg/src/CardEffect.cpp b/projects/mtg/src/CardEffect.cpp deleted file mode 100644 index 12afd8bb2..000000000 --- a/projects/mtg/src/CardEffect.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "../include/GameApp.h" -#include "../include/MTGCard.h" -#include "../include/GameOptions.h" -#include "../include/CardEffect.h" - -CardEffect::CardEffect(CardGui* target) : - target(target) -{ - -} - -CardEffect::~CardEffect() -{ - -} - -void CardEffect::Render() -{ - // std::cout << "Rendering effect" << std::endl; -} diff --git a/projects/mtg/src/GameStateDeckViewer.cpp b/projects/mtg/src/GameStateDeckViewer.cpp index 41a8a2f37..24e51f910 100644 --- a/projects/mtg/src/GameStateDeckViewer.cpp +++ b/projects/mtg/src/GameStateDeckViewer.cpp @@ -23,22 +23,6 @@ #include "AIPlayer.h" - -//!! helper function; this is probably handled somewhere in the code already. -// If not, should be placed in general library -void StringExplode(string str, string separator, vector* results) -{ - size_t found; - found = str.find_first_of(separator); - while (found != string::npos) - { - if (found > 0) results->push_back(str.substr(0, found)); - str = str.substr(found + 1); - found = str.find_first_of(separator); - } - if (str.length() > 0) results->push_back(str); -} - GameStateDeckViewer::GameStateDeckViewer(GameApp* parent) : GameState(parent, "deckeditor") { diff --git a/projects/mtg/template.vcxproj b/projects/mtg/template.vcxproj index 7109ebd09..96f355a51 100644 --- a/projects/mtg/template.vcxproj +++ b/projects/mtg/template.vcxproj @@ -455,7 +455,6 @@ - @@ -517,7 +516,6 @@ - diff --git a/projects/mtg/template.vcxproj.filters b/projects/mtg/template.vcxproj.filters index 32cd0ca8b..0d874bf5b 100644 --- a/projects/mtg/template.vcxproj.filters +++ b/projects/mtg/template.vcxproj.filters @@ -363,9 +363,6 @@ inc - - inc - inc @@ -528,9 +525,6 @@ inc - - inc - inc diff --git a/projects/mtg/wagic-qt.pro b/projects/mtg/wagic-qt.pro index 715823a8a..d9b1171fe 100644 --- a/projects/mtg/wagic-qt.pro +++ b/projects/mtg/wagic-qt.pro @@ -89,7 +89,6 @@ SOURCES += \ src/AllAbilities.cpp\ src/CardDescriptor.cpp\ src/CardDisplay.cpp\ - src/CardEffect.cpp\ src/CardGui.cpp\ src/CardPrimitive.cpp\ src/CardSelector.cpp\ @@ -243,7 +242,6 @@ HEADERS += \ include/GameStateShop.h\ include/MTGPack.h\ include/TextScroller.h\ - include/CardEffect.h\ include/GameStateStory.h\ include/MTGRules.h\ include/ThisDescriptor.h\ @@ -254,7 +252,6 @@ HEADERS += \ include/Token.h\ include/CardPrimitive.h\ include/GuiAvatars.h\ - include/OSD.h\ include/Translate.h\ include/CardSelector.h\ include/GuiBackground.h\ From 9c282aeb56b2540765aab1381872dac8fff53089 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Wed, 20 Nov 2013 12:02:33 +0100 Subject: [PATCH 28/45] Remove CardEffect.o from Makefile --- projects/mtg/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/Makefile b/projects/mtg/Makefile index 9485d7d1b..dc4f2b7fe 100644 --- a/projects/mtg/Makefile +++ b/projects/mtg/Makefile @@ -1,7 +1,7 @@ OBJS = objs/InteractiveButton.o objs/AbilityParser.o objs/ActionElement.o\ objs/ActionLayer.o objs/ActionStack.o objs/AIHints.o objs/AIMomirPlayer.o\ objs/AIPlayer.o objs/AIPlayerBaka.o objs/AIStats.o objs/AllAbilities.o\ - objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o\ + objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o\ objs/CardPrimitive.o objs/CardSelector.o objs/CardSelectorSingleton.o\ objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o\ objs/DeckDataWrapper.o objs/DeckEditorMenu.o objs/DeckMenu.o\ From e76c57d74775a654ffb2cec60a03f5196d90eff1 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Wed, 20 Nov 2013 12:56:33 +0100 Subject: [PATCH 29/45] Fix some valgrind memcheck warnings. However there remains one... ... within the threaded texture cache. Once it is resized, some textures in GetQuad(...) (WCachedResource.cpp:102/103) have uninitialized widths/heights. --- projects/mtg/src/GameOptions.cpp | 7 ++++--- projects/mtg/src/GameStateMenu.cpp | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/projects/mtg/src/GameOptions.cpp b/projects/mtg/src/GameOptions.cpp index 18e395760..b82265623 100644 --- a/projects/mtg/src/GameOptions.cpp +++ b/projects/mtg/src/GameOptions.cpp @@ -1188,10 +1188,11 @@ bool GameOptionKeyBindings::read(string input) iss.get(*(s.rdbuf()), ','); iss.get(); - LocalKeySym local; - char sep; - u32 button; + LocalKeySym local = 0; + char sep = 0; + u32 button = 0; s >> local >> sep >> button; + if (':' != sep) return false; assoc.push_back(make_pair(local, u32_to_button(button))); diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp index 11327ce83..b6df5f2f8 100644 --- a/projects/mtg/src/GameStateMenu.cpp +++ b/projects/mtg/src/GameStateMenu.cpp @@ -65,6 +65,7 @@ GameStateMenu::GameStateMenu(GameApp* parent) : scroller = NULL; langChoices = false; primitivesLoadCounter = -1; + bgTexture = NULL; } GameStateMenu::~GameStateMenu() From 8209716fc9f15e589ad727f676881220f9589d49 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Wed, 20 Nov 2013 13:53:15 +0100 Subject: [PATCH 30/45] Remove unused file --- projects/mtg/src/MTGSpellStack.cpp | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 projects/mtg/src/MTGSpellStack.cpp diff --git a/projects/mtg/src/MTGSpellStack.cpp b/projects/mtg/src/MTGSpellStack.cpp deleted file mode 100644 index 0b8fac351..000000000 --- a/projects/mtg/src/MTGSpellStack.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "MTGSpellStack.h" - -MTGSpellStack::MTGSpellStack() -{ - cursor = -1; -} - -void MTGSpellStack::addSpell(Ability * ability) -{ - cursor++; - spellStack[cursor] ability; -} - -int MTGSpellStack::resolve() -{ - if (cursor < 0) - return 0; - int result = cursor; - cursor--; - (spellStack[cursor + 1])->resolve(); - return (result + 1); -} From 3cee80e3bcec6d902777d160fa63624602788106 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Wed, 20 Nov 2013 14:01:59 +0100 Subject: [PATCH 31/45] Delete another unused file (GuiMessageBox.cpp) --- projects/mtg/src/GuiMessageBox.cpp | 56 ------------------------------ 1 file changed, 56 deletions(-) delete mode 100644 projects/mtg/src/GuiMessageBox.cpp diff --git a/projects/mtg/src/GuiMessageBox.cpp b/projects/mtg/src/GuiMessageBox.cpp deleted file mode 100644 index 94b22ac0c..000000000 --- a/projects/mtg/src/GuiMessageBox.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "GuiMessageBox.h" - -bool GuiMessageBox::CheckUserInput(JButton key) -{ - if (mActionButton == key) - { - if (mObjects[mCurr] != NULL && mObjects[mCurr]->ButtonPressed()) - { - if (mListener != NULL) - { - mListener->ButtonPressed(mId, mObjects[mCurr]->GetId()); - return true; - } - } - } - - if ((PSP_CTRL_LEFT == key) || (PSP_CTRL_UP == key)) // || mEngine->GetAnalogY()<64) - { - int n = mCurr; - n--; - if (n < 0) - { - if ((mStyle & JGUI_STYLE_WRAPPING)) - n = mCount - 1; - else - n = 0; - } - - if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(PSP_CTRL_UP)) - { - mCurr = n; - mObjects[mCurr]->Entering(); - } - return true; - } - else if ((PSP_CTRL_RIGHT == key) || (PSP_CTRL_DOWN == key)) // || mEngine->GetAnalogY()>192) - { - int n = mCurr; - n++; - if (n > mCount - 1) - { - if ((mStyle & JGUI_STYLE_WRAPPING)) - n = 0; - else - n = mCount - 1; - } - - if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(PSP_CTRL_DOWN)) - { - mCurr = n; - mObjects[mCurr]->Entering(); - } - return true; - } - return false; -} From ffbb228d2d67f85ef13ef2155b08f4463dee097f Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Thu, 21 Nov 2013 14:25:01 +0400 Subject: [PATCH 32/45] Fixed wrong activation cost in dragon hatchling --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 6d356044e..038e29d22 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -23286,7 +23286,7 @@ type=Sorcery [/card] [card] name=Dragon Hatchling -auto={1}{R}:1/0 +auto={R}:1/0 abilities=flying text=Flying -- {R}: Dragon Hatchling gets +1/+0 until end of turn. mana={1}{R} From 73c2d1708015938966d598d73631d73668f2ef9e Mon Sep 17 00:00:00 2001 From: citiral Date: Thu, 21 Nov 2013 20:38:41 +0100 Subject: [PATCH 33/45] Updated deckmenu.cpp to properly render deck description and summary Deck description and statistics were being drawn as black text, this made it invisible as it was rendered over a black background. I made it change the color to white before drawing, so its shown as its suposed to be.(Did the default text color change?) --- projects/mtg/src/DeckMenu.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projects/mtg/src/DeckMenu.cpp b/projects/mtg/src/DeckMenu.cpp index 6c589a67a..3d205b539 100644 --- a/projects/mtg/src/DeckMenu.cpp +++ b/projects/mtg/src/DeckMenu.cpp @@ -293,6 +293,7 @@ void DeckMenu::Render() // fill in the description part of the screen string text = wordWrap(_(currentMenuItem->getDescription()), descWidth, descriptionFont->mFontID ); + descriptionFont->SetColor(ARGB(255,255,255,255)); descriptionFont->DrawString(text.c_str(), descX, descY); // fill in the statistical portion @@ -301,6 +302,7 @@ void DeckMenu::Render() ostringstream oss; oss << _("Deck: ") << currentMenuItem->getDeckName() << endl; oss << currentMenuItem->getDeckStatsSummary(); + descriptionFont->SetColor(ARGB(255,255,255,255)); descriptionFont->DrawString(oss.str(), statsX, statsY); } From 052e3abdb8ff92b42882039fda4809278bd9471e Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Fri, 22 Nov 2013 01:03:07 +0400 Subject: [PATCH 34/45] Small fix in match_and ( [-color1; -color2] was handled incorrectly ) --- projects/mtg/bin/Res/test/_tests.txt | 1 + .../mtg/bin/Res/test/consign_to_dream.txt | 25 +++++++++++++++++++ projects/mtg/src/CardDescriptor.cpp | 3 ++- 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 projects/mtg/bin/Res/test/consign_to_dream.txt diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 32841bb5a..7a5448816 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -226,6 +226,7 @@ colossus_of_sardia1.txt colossus_of_sardia2.txt composite_golem.txt conservator.txt +consign_to_dream.txt Contagion_Clasp.txt control_magic.txt control_magic2.txt diff --git a/projects/mtg/bin/Res/test/consign_to_dream.txt b/projects/mtg/bin/Res/test/consign_to_dream.txt new file mode 100644 index 000000000..599770868 --- /dev/null +++ b/projects/mtg/bin/Res/test/consign_to_dream.txt @@ -0,0 +1,25 @@ +# Test TargetChooser based on negation of two colors +# Grizzly bear should be put on top of library + +# name=Consign to Dream +# Return target permanent to its owner's hand. +# If that permanent is red or green, put it on top of its owner's library + +[INIT] +FIRSTMAIN +[PLAYER1] +hand:Consign to Dream +manapool:{2}{U} +inplay:grizzly bears +[PLAYER2] +[DO] +Consign to Dream +grizzly bears +endinterruption +[ASSERT] +FIRSTMAIN +[PLAYER1] +graveyard:Consign to Dream +library:grizzly bears +[PLAYER2] +[END] \ No newline at end of file diff --git a/projects/mtg/src/CardDescriptor.cpp b/projects/mtg/src/CardDescriptor.cpp index 995ff79b4..f304e356d 100644 --- a/projects/mtg/src/CardDescriptor.cpp +++ b/projects/mtg/src/CardDescriptor.cpp @@ -160,7 +160,8 @@ MTGCardInstance * CardDescriptor::match_and(MTGCardInstance * card) if (mColorExclusions) { - if ((mColorExclusions & card->colors) == mColorExclusions) + // if any of forbidden colors intersect with card colors + if ((mColorExclusions & card->colors) != 0) match = NULL; } From 352e3c2daae235ff4198f1084232be199114c235 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sat, 23 Nov 2013 16:03:04 +0100 Subject: [PATCH 35/45] Remove makros and add undefs to avoid clashing names FRAND and Clamp were not used and Clamp collided when doing unit builds. SQUARE(x) is longer than x*x and if x is an expression it gets evaluated twice. --- JGE/include/JGE.h | 11 +++++++++++ JGE/include/Vector3D.h | 11 +---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/JGE/include/JGE.h b/JGE/include/JGE.h index 8168821f3..80a2e3717 100644 --- a/JGE/include/JGE.h +++ b/JGE/include/JGE.h @@ -44,6 +44,17 @@ typedef WPARAM LocalKeySym; #include typedef KeySym LocalKeySym; #define LOCAL_KEY_NONE XK_VoidSymbol +#undef Status +#undef Bool +#undef None +#undef CursorShape +#undef KeyPress +#undef KeyRelease +#undef FocusIn +#undef FocusOut +#undef FontChange +#undef Unsorted +#undef GrayScale #elif defined(ANDROID) // This is temporary until we understand how to send real key events from Java typedef long unsigned int LocalKeySym; diff --git a/JGE/include/Vector3D.h b/JGE/include/Vector3D.h index 573af33ca..aa207353b 100644 --- a/JGE/include/Vector3D.h +++ b/JGE/include/Vector3D.h @@ -3,15 +3,6 @@ #include - -/*************************** Macros and constants ***************************/ -// returns a number ranging from -1.0 to 1.0 -#define FRAND (((float)rand()-(float)rand())/RAND_MAX) -#define Clamp(x, min, max) x = (x Date: Sat, 23 Nov 2013 16:09:11 +0100 Subject: [PATCH 36/45] Add/fix broken include guards --- projects/mtg/include/DeckManager.h | 5 +++++ projects/mtg/include/MTGPack.h | 2 +- projects/mtg/include/StyleManager.h | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/projects/mtg/include/DeckManager.h b/projects/mtg/include/DeckManager.h index 1c324c667..02b9435f4 100644 --- a/projects/mtg/include/DeckManager.h +++ b/projects/mtg/include/DeckManager.h @@ -1,3 +1,6 @@ +#ifndef _DECK_MANAGER_H +#define _DECK_MANAGER_H + #include #include @@ -43,3 +46,5 @@ public: ~DeckManager(); }; + +#endif //_DECK_MANAGER_H diff --git a/projects/mtg/include/MTGPack.h b/projects/mtg/include/MTGPack.h index 84db2c957..a34faf48e 100644 --- a/projects/mtg/include/MTGPack.h +++ b/projects/mtg/include/MTGPack.h @@ -1,4 +1,4 @@ -#ifndef _MTGPACCK_H_ +#ifndef _MTGPACK_H_ #define _MTGPACK_H_ class ShopBooster; diff --git a/projects/mtg/include/StyleManager.h b/projects/mtg/include/StyleManager.h index dd929eb50..c08d40ab5 100644 --- a/projects/mtg/include/StyleManager.h +++ b/projects/mtg/include/StyleManager.h @@ -1,3 +1,6 @@ +#ifndef _STYLE_MANAGER_H_ +#define _STYLE_MANAGER_H_ + class WStyle { public: @@ -34,3 +37,5 @@ protected: string activeStyle; map styles; }; + +#endif //_STYLE_MANAGER_H_ From 9f0b70d1c9a2ab70fd3c71079e336dd8a24a242a Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sat, 23 Nov 2013 16:18:45 +0100 Subject: [PATCH 37/45] Put constans into extra namespace as kBackToMainMenuID... collides with itself. GameStateAwards::kBackToMainMenuID and GameStateOptions::kBackToMainMenuID define those with different values. --- projects/mtg/src/GameStateAwards.cpp | 10 +++++----- projects/mtg/src/GameStateOptions.cpp | 17 ++++++++--------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/projects/mtg/src/GameStateAwards.cpp b/projects/mtg/src/GameStateAwards.cpp index 69c62d13e..de0a39447 100644 --- a/projects/mtg/src/GameStateAwards.cpp +++ b/projects/mtg/src/GameStateAwards.cpp @@ -21,7 +21,7 @@ enum ENUM_AWARDS_STATE }; -namespace +namespace GameStateAwardsConstants { const int kBackToTrophiesID = 2; const int kBackToMainMenuID = 1; @@ -186,8 +186,8 @@ void GameStateAwards::Update(float dt) SAFE_DELETE(menu); menu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), EXIT_AWARDS_MENU, this, Fonts::MENU_FONT, 50, 170); if (mState == STATE_DETAILS) - menu->Add(kBackToTrophiesID, "Back to Trophies"); - menu->Add(kBackToMainMenuID, "Back to Main Menu"); + menu->Add(GameStateAwardsConstants::kBackToTrophiesID, "Back to Trophies"); + menu->Add(GameStateAwardsConstants::kBackToMainMenuID, "Back to Main Menu"); menu->Add(kCancelMenuID, "Cancel"); break; case JGE_BTN_PREV: @@ -359,11 +359,11 @@ void GameStateAwards::ButtonPressed(int controllerId, int controlId) if (controllerId == EXIT_AWARDS_MENU) switch (controlId) { - case kBackToMainMenuID: + case GameStateAwardsConstants::kBackToMainMenuID: mParent->DoTransition(TRANSITION_FADE, GAME_STATE_MENU); showMenu = false; break; - case kBackToTrophiesID: + case GameStateAwardsConstants::kBackToTrophiesID: mState = STATE_LISTVIEW; SAFE_DELETE(detailview); showMenu = false; diff --git a/projects/mtg/src/GameStateOptions.cpp b/projects/mtg/src/GameStateOptions.cpp index 883568fc0..e9f142d1d 100644 --- a/projects/mtg/src/GameStateOptions.cpp +++ b/projects/mtg/src/GameStateOptions.cpp @@ -7,13 +7,12 @@ #include "SimplePad.h" #include "Translate.h" -namespace +namespace GameStateOptionsConstants { const int kSaveAndBackToMainMenuID = 1; const int kBackToMainMenuID = 2; const int kNewProfileID = 4; const int kReloadID = 5; - } GameStateOptions::GameStateOptions(GameApp* parent) : @@ -78,7 +77,7 @@ void GameStateOptions::Start() optionsList->Add(NEW WGuiSplit(cPrf, cThm)); optionsList->Add(cStyle); - optionsList->Add(NEW WGuiButton(NEW WGuiHeader("New Profile"), -102, kNewProfileID, this)); + optionsList->Add(NEW WGuiButton(NEW WGuiHeader("New Profile"), -102, GameStateOptionsConstants::kNewProfileID, this)); optionsList->Add(NEW WDecoCheat(NEW OptionInteger(Options::CHEATMODE, "Enable Cheat Mode"))); optionsList->Add(NEW WDecoCheat(NEW OptionInteger(Options::OPTIMIZE_HAND, "Optimize Starting Hand"))); @@ -118,8 +117,8 @@ void GameStateOptions::Start() optionsTabs->Add(optionsList); optionsMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), -102, this, Fonts::MAIN_FONT, 50, 170); - optionsMenu->Add(kBackToMainMenuID, "Back to Main Menu"); - optionsMenu->Add(kSaveAndBackToMainMenuID, "Save And Exit"); + optionsMenu->Add(GameStateOptionsConstants::kBackToMainMenuID, "Back to Main Menu"); + optionsMenu->Add(GameStateOptionsConstants::kSaveAndBackToMainMenuID, "Save And Exit"); optionsMenu->Add(kCancelMenuID, "Cancel"); optionsTabs->Entering(JGE_BTN_NONE); @@ -285,21 +284,21 @@ void GameStateOptions::ButtonPressed(int controllerId, int controlId) if (controllerId == -102) switch (controlId) { - case kSaveAndBackToMainMenuID: + case GameStateOptionsConstants::kSaveAndBackToMainMenuID: mState = SAVE; break; //Set Audio volume - case kBackToMainMenuID: + case GameStateOptionsConstants::kBackToMainMenuID: mParent->DoTransition(TRANSITION_FADE, GAME_STATE_MENU); break; case kCancelMenuID: mState = SHOW_OPTIONS; break; - case kNewProfileID: + case GameStateOptionsConstants::kNewProfileID: options.keypadStart("", &newProfile); options.keypadTitle("New Profile"); break; - case kReloadID: + case GameStateOptionsConstants::kReloadID: mReload = true; break; } From 3e94de985f0b8a8154e204664f2ce168f2608c2e Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sat, 23 Nov 2013 16:25:14 +0100 Subject: [PATCH 38/45] Add more include guards --- projects/mtg/include/CacheEngine.h | 5 +++++ projects/mtg/include/DeckEditorMenu.h | 3 +++ projects/mtg/include/GuiMana.h | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/projects/mtg/include/CacheEngine.h b/projects/mtg/include/CacheEngine.h index 5203e3511..2a2b0ab0d 100644 --- a/projects/mtg/include/CacheEngine.h +++ b/projects/mtg/include/CacheEngine.h @@ -1,3 +1,6 @@ +#ifndef _CACHE_ENGINE_H_ +#define _CACHE_ENGINE_H_ + #include "PrecompiledHeader.h" #include "Threading.h" @@ -208,3 +211,5 @@ public: CardRetrieverBase* CacheEngine::sInstance = NULL; bool CacheEngine::sIsThreaded = false; + +#endif //_CACHE_ENGINE_H_ diff --git a/projects/mtg/include/DeckEditorMenu.h b/projects/mtg/include/DeckEditorMenu.h index a3c71e690..d252785ec 100644 --- a/projects/mtg/include/DeckEditorMenu.h +++ b/projects/mtg/include/DeckEditorMenu.h @@ -1,3 +1,5 @@ +#ifndef _DECK_EDITOR_MENU_H +#define _DECK_EDITOR_MENU_H #pragma once #include "DeckMenu.h" #include "DeckDataWrapper.h" @@ -19,3 +21,4 @@ public: void Render(); virtual ~DeckEditorMenu(); }; +#endif //_DECK_EDITOR_MENU_H diff --git a/projects/mtg/include/GuiMana.h b/projects/mtg/include/GuiMana.h index 289422175..d18655bc9 100644 --- a/projects/mtg/include/GuiMana.h +++ b/projects/mtg/include/GuiMana.h @@ -1,3 +1,6 @@ +#ifndef _GUI_MANA_H +#define _GUI_MANA_H + #include "string.h" #include #include @@ -51,3 +54,5 @@ public: virtual int receiveEventPlus(WEvent * e); virtual int receiveEventMinus(WEvent * e); }; + +#endif //_GUI_MANA_H From e0428ac7b0ecb474a7d149cd4ad6fe0e9aae9f7d Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sat, 23 Nov 2013 17:04:24 +0100 Subject: [PATCH 39/45] Avoid more conflicts. We could now do unit builds... and make the linker put every data element and function into its own section. On linktime, we can output every discarded section and get a list of dead code (for that build). --- projects/mtg/src/CardSelector.cpp | 26 ++++++------ projects/mtg/src/DeckMenu.cpp | 36 ++++++++--------- projects/mtg/src/GameStateAwards.cpp | 10 ++--- projects/mtg/src/GameStateOptions.cpp | 16 ++++---- projects/mtg/src/GuiCombat.cpp | 16 ++++---- projects/mtg/src/SimpleMenu.cpp | 58 +++++++++++++-------------- 6 files changed, 81 insertions(+), 81 deletions(-) diff --git a/projects/mtg/src/CardSelector.cpp b/projects/mtg/src/CardSelector.cpp index f6e017516..cae1bee14 100644 --- a/projects/mtg/src/CardSelector.cpp +++ b/projects/mtg/src/CardSelector.cpp @@ -7,42 +7,42 @@ #include "Closest.cpp" #include "GameObserver.h" -struct Left: public Exp +struct CardSelectorLeft: public Exp { static inline bool test(CardSelector::Target* ref, CardSelector::Target* test) { return ref->x - test->x > fabs(ref->y - test->y); } }; -struct Right: public Exp +struct CardSelectorRight: public Exp { static inline bool test(CardSelector::Target* ref, CardSelector::Target* test) { return test->x - ref->x > fabs(ref->y - test->y); } }; -struct Up: public Exp +struct CardSelectorUp: public Exp { static inline bool test(CardSelector::Target* ref, CardSelector::Target* test) { return ref->y - test->y > fabs(ref->x - test->x); } }; -struct Down: public Exp +struct CardSelectorDown: public Exp { static inline bool test(CardSelector::Target* ref, CardSelector::Target* test) { return test->y - ref->y > fabs(ref->x - test->x); } }; -struct Diff: public Exp +struct CardSelectorDiff: public Exp { static inline bool test(CardSelector::Target* ref, CardSelector::Target* test) { return ref != test; } }; -struct True: public Exp +struct CardSelectorTrue: public Exp { static inline bool test(CardSelector::Target*, CardSelector::Target*) { @@ -94,7 +94,7 @@ void CardSelector::Remove(CardSelector::Target* card) CardView* c = dynamic_cast (active); if (c) c->zoom = 1.0f; - active = closest (cards, limitor, active); + active = closest (cards, limitor, active); c = dynamic_cast (active); if (c) c->zoom = 1.4f; @@ -120,7 +120,7 @@ CardSelector::Target* CardSelector::fetchMemory(SelectorMemory& memory) } // We come here if the card is not in the selector any more, or if // it is there but it is now refused by the limitor. - return closest (cards, limitor, memory.x, memory.y); + return closest (cards, limitor, memory.x, memory.y); } void CardSelector::Push() @@ -182,7 +182,7 @@ bool CardSelector::CheckUserInput(JButton key) if(!jge) return false; if(jge->GetLeftClickCoordinates(x, y)) { - active = closest (cards, limitor, static_cast (x), static_cast (y)); + active = closest (cards, limitor, static_cast (x), static_cast (y)); } switch (key) @@ -196,16 +196,16 @@ bool CardSelector::CheckUserInput(JButton key) goto switch_active; break; case JGE_BTN_LEFT: - active = closest (cards, limitor, active); + active = closest (cards, limitor, active); break; case JGE_BTN_RIGHT: - active = closest (cards, limitor, active); + active = closest (cards, limitor, active); break; case JGE_BTN_UP: - active = closest (cards, limitor, active); + active = closest (cards, limitor, active); break; case JGE_BTN_DOWN: - active = closest (cards, limitor, active); + active = closest (cards, limitor, active); break; case JGE_BTN_CANCEL: mDrawMode = (mDrawMode + 1) % DrawMode::kNumDrawModes; diff --git a/projects/mtg/src/DeckMenu.cpp b/projects/mtg/src/DeckMenu.cpp index 6c589a67a..19b8ffed3 100644 --- a/projects/mtg/src/DeckMenu.cpp +++ b/projects/mtg/src/DeckMenu.cpp @@ -13,16 +13,16 @@ #include -namespace +namespace DeckMenuConst { const float kVerticalMargin = 16; const float kHorizontalMargin = 20; const float kLineHeight = 25; - const float kDescriptionVerticalBoxPadding = -5; + const float kDescriptionVerticalBoxPadding = -5; const float kDescriptionHorizontalBoxPadding = 5; const float kDefaultFontScale = 1.0f; - const float kVerticalScrollSpeed = 7.0f; + const float kVerticalScrollSpeed = 7.0f; const int DETAILED_INFO_THRESHOLD = 20; const int kDetailedInfoButtonId = 10000; @@ -52,8 +52,8 @@ JGuiController(JGE::GetInstance(), id, listener), fontId(fontId), mShowDetailsSc titleY = 15; titleWidth = 180; // width of inner box of title - descX = 260 + kDescriptionHorizontalBoxPadding; - descY = 100 + kDescriptionVerticalBoxPadding; + descX = 260 + DeckMenuConst::kDescriptionHorizontalBoxPadding; + descY = 100 + DeckMenuConst::kDescriptionVerticalBoxPadding; descHeight = 145; descWidth = 195; @@ -73,11 +73,11 @@ JGuiController(JGE::GetInstance(), id, listener), fontId(fontId), mShowDetailsSc float scrollerWidth = 200.0f; float scrollerHeight = 28.0f; - mScroller = NEW VerticalTextScroller(Fonts::MAIN_FONT, 14, 235, scrollerWidth, scrollerHeight, kVerticalScrollSpeed); + mScroller = NEW VerticalTextScroller(Fonts::MAIN_FONT, 14, 235, scrollerWidth, scrollerHeight, DeckMenuConst::kVerticalScrollSpeed); mAutoTranslate = true; maxItems = 6; - mHeight = 2 * kVerticalMargin + (maxItems * kLineHeight); + mHeight = 2 * DeckMenuConst::kVerticalMargin + (maxItems * DeckMenuConst::kLineHeight); // we want to cap the deck titles to 15 characters to avoid overflowing deck names title = _(_title); @@ -94,7 +94,7 @@ JGuiController(JGE::GetInstance(), id, listener), fontId(fontId), mShowDetailsSc else titleFontScale = SCALE_NORMAL; - mSelectionTargetY = selectionY = kVerticalMargin; + mSelectionTargetY = selectionY = DeckMenuConst::kVerticalMargin; if (NULL == stars) stars = NEW hgeParticleSystem(WResourceManager::Instance()->RetrievePSI("stars.psi", WResourceManager::Instance()->GetQuad("stars").get())); @@ -106,7 +106,7 @@ JGuiController(JGE::GetInstance(), id, listener), fontId(fontId), mShowDetailsSc float stringWidth = descriptionFont->GetStringWidth(detailedInfoString.c_str()); float boxStartX = detailedInfoBoxX - stringWidth / 2 + 20; - dismissButton = NEW InteractiveButton( this, kDetailedInfoButtonId, Fonts::MAIN_FONT, detailedInfoString, boxStartX, detailedInfoBoxY, JGE_BTN_CANCEL); + dismissButton = NEW InteractiveButton( this, DeckMenuConst::kDetailedInfoButtonId, Fonts::MAIN_FONT, detailedInfoString, boxStartX, detailedInfoBoxY, JGE_BTN_CANCEL); JGuiController::Add(dismissButton, true); updateScroller(); @@ -181,7 +181,7 @@ bool DeckMenu::showDetailsScreen() if (currentMenuItem) { if (mAlwaysShowDetailsButton) return true; - if (mShowDetailsScreen && currentMenuItem->getVictories() > DETAILED_INFO_THRESHOLD) return true; + if (mShowDetailsScreen && currentMenuItem->getVictories() > DeckMenuConst::DETAILED_INFO_THRESHOLD) return true; } return false; @@ -189,10 +189,10 @@ bool DeckMenu::showDetailsScreen() void DeckMenu::initMenuItems() { - float sY = mY + kVerticalMargin; + float sY = mY + DeckMenuConst::kVerticalMargin; for (int i = startId; i < mCount; ++i) { - float y = mY + kVerticalMargin + i * kLineHeight; + float y = mY + DeckMenuConst::kVerticalMargin + i * DeckMenuConst::kLineHeight; DeckMenuItem * currentMenuItem = static_cast (mObjects[i]); currentMenuItem->Relocate(mX, y); if (currentMenuItem->hasFocus()) sY = y; @@ -248,7 +248,7 @@ void DeckMenu::Render() { if (i > mCount - 1) break; DeckMenuItem *currentMenuItem = static_cast (mObjects[i]); - if (currentMenuItem->getY() - kLineHeight * startId < mY + height - kLineHeight + 7) + if (currentMenuItem->getY() - DeckMenuConst::kLineHeight * startId < mY + height - DeckMenuConst::kLineHeight + 7) { // only load stats for visible items in the list DeckMetaData* metaData = currentMenuItem->getMetaData(); @@ -309,7 +309,7 @@ void DeckMenu::Render() } else // reset the font color to be slightly muted mFont->SetColor(ARGB(150,255,255,255)); - currentMenuItem->RenderWithOffset(-kLineHeight * startId); + currentMenuItem->RenderWithOffset(-DeckMenuConst::kLineHeight * startId); } } @@ -342,8 +342,8 @@ void DeckMenu::Update(float dt) selectionT += 3 * dt; selectionY += (mSelectionTargetY - selectionY) * 8 * dt; - float starsX = starsOffsetX + ((mWidth - 2 * kHorizontalMargin) * (1 + cos(selectionT)) / 2); - float starsY = selectionY + 5 * cos(selectionT * 2.35f) + kLineHeight / 2 - kLineHeight * startId; + float starsX = starsOffsetX + ((mWidth - 2 * DeckMenuConst::kHorizontalMargin) * (1 + cos(selectionT)) / 2); + float starsY = selectionY + 5 * cos(selectionT * 2.35f) + DeckMenuConst::kLineHeight / 2 - DeckMenuConst::kLineHeight * startId; stars->MoveTo(starsX, starsY); // @@ -371,7 +371,7 @@ void DeckMenu::Update(float dt) void DeckMenu::Add(int id, const char * text, string desc, bool forceFocus, DeckMetaData * deckMetaData) { DeckMenuItem * menuItem = NEW DeckMenuItem(this, id, fontId, text, 0, - mY + kVerticalMargin + mCount * kLineHeight, (mCount == 0), mAutoTranslate, deckMetaData); + mY + DeckMenuConst::kVerticalMargin + mCount * DeckMenuConst::kLineHeight, (mCount == 0), mAutoTranslate, deckMetaData); Translator * t = Translator::GetInstance(); map::iterator it = t->deckValues.find(text); string deckDescription = ""; @@ -384,7 +384,7 @@ void DeckMenu::Add(int id, const char * text, string desc, bool forceFocus, Deck menuItem->setDescription(deckDescription); JGuiController::Add(menuItem); - if (mCount <= maxItems) mHeight += kLineHeight; + if (mCount <= maxItems) mHeight += DeckMenuConst::kLineHeight; if (forceFocus) { diff --git a/projects/mtg/src/GameStateAwards.cpp b/projects/mtg/src/GameStateAwards.cpp index de0a39447..8012f6825 100644 --- a/projects/mtg/src/GameStateAwards.cpp +++ b/projects/mtg/src/GameStateAwards.cpp @@ -21,7 +21,7 @@ enum ENUM_AWARDS_STATE }; -namespace GameStateAwardsConstants +namespace GameStateAwardsConst { const int kBackToTrophiesID = 2; const int kBackToMainMenuID = 1; @@ -186,8 +186,8 @@ void GameStateAwards::Update(float dt) SAFE_DELETE(menu); menu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), EXIT_AWARDS_MENU, this, Fonts::MENU_FONT, 50, 170); if (mState == STATE_DETAILS) - menu->Add(GameStateAwardsConstants::kBackToTrophiesID, "Back to Trophies"); - menu->Add(GameStateAwardsConstants::kBackToMainMenuID, "Back to Main Menu"); + menu->Add(GameStateAwardsConst::kBackToTrophiesID, "Back to Trophies"); + menu->Add(GameStateAwardsConst::kBackToMainMenuID, "Back to Main Menu"); menu->Add(kCancelMenuID, "Cancel"); break; case JGE_BTN_PREV: @@ -359,11 +359,11 @@ void GameStateAwards::ButtonPressed(int controllerId, int controlId) if (controllerId == EXIT_AWARDS_MENU) switch (controlId) { - case GameStateAwardsConstants::kBackToMainMenuID: + case GameStateAwardsConst::kBackToMainMenuID: mParent->DoTransition(TRANSITION_FADE, GAME_STATE_MENU); showMenu = false; break; - case GameStateAwardsConstants::kBackToTrophiesID: + case GameStateAwardsConst::kBackToTrophiesID: mState = STATE_LISTVIEW; SAFE_DELETE(detailview); showMenu = false; diff --git a/projects/mtg/src/GameStateOptions.cpp b/projects/mtg/src/GameStateOptions.cpp index e9f142d1d..981eee505 100644 --- a/projects/mtg/src/GameStateOptions.cpp +++ b/projects/mtg/src/GameStateOptions.cpp @@ -7,7 +7,7 @@ #include "SimplePad.h" #include "Translate.h" -namespace GameStateOptionsConstants +namespace GameStateOptionsConst { const int kSaveAndBackToMainMenuID = 1; const int kBackToMainMenuID = 2; @@ -77,7 +77,7 @@ void GameStateOptions::Start() optionsList->Add(NEW WGuiSplit(cPrf, cThm)); optionsList->Add(cStyle); - optionsList->Add(NEW WGuiButton(NEW WGuiHeader("New Profile"), -102, GameStateOptionsConstants::kNewProfileID, this)); + optionsList->Add(NEW WGuiButton(NEW WGuiHeader("New Profile"), -102, GameStateOptionsConst::kNewProfileID, this)); optionsList->Add(NEW WDecoCheat(NEW OptionInteger(Options::CHEATMODE, "Enable Cheat Mode"))); optionsList->Add(NEW WDecoCheat(NEW OptionInteger(Options::OPTIMIZE_HAND, "Optimize Starting Hand"))); @@ -117,8 +117,8 @@ void GameStateOptions::Start() optionsTabs->Add(optionsList); optionsMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), -102, this, Fonts::MAIN_FONT, 50, 170); - optionsMenu->Add(GameStateOptionsConstants::kBackToMainMenuID, "Back to Main Menu"); - optionsMenu->Add(GameStateOptionsConstants::kSaveAndBackToMainMenuID, "Save And Exit"); + optionsMenu->Add(GameStateOptionsConst::kBackToMainMenuID, "Back to Main Menu"); + optionsMenu->Add(GameStateOptionsConst::kSaveAndBackToMainMenuID, "Save And Exit"); optionsMenu->Add(kCancelMenuID, "Cancel"); optionsTabs->Entering(JGE_BTN_NONE); @@ -284,21 +284,21 @@ void GameStateOptions::ButtonPressed(int controllerId, int controlId) if (controllerId == -102) switch (controlId) { - case GameStateOptionsConstants::kSaveAndBackToMainMenuID: + case GameStateOptionsConst::kSaveAndBackToMainMenuID: mState = SAVE; break; //Set Audio volume - case GameStateOptionsConstants::kBackToMainMenuID: + case GameStateOptionsConst::kBackToMainMenuID: mParent->DoTransition(TRANSITION_FADE, GAME_STATE_MENU); break; case kCancelMenuID: mState = SHOW_OPTIONS; break; - case GameStateOptionsConstants::kNewProfileID: + case GameStateOptionsConst::kNewProfileID: options.keypadStart("", &newProfile); options.keypadTitle("New Profile"); break; - case GameStateOptionsConstants::kReloadID: + case GameStateOptionsConst::kReloadID: mReload = true; break; } diff --git a/projects/mtg/src/GuiCombat.cpp b/projects/mtg/src/GuiCombat.cpp index 29888cac1..129352d59 100644 --- a/projects/mtg/src/GuiCombat.cpp +++ b/projects/mtg/src/GuiCombat.cpp @@ -16,21 +16,21 @@ const float kZoom_level1 = 1.4f; const float kZoom_level2 = 2.2f; const float kZoom_level3 = 2.7f; -struct True: public Exp +struct GuiCombatTrue: public Exp { static inline bool test(DamagerDamaged*, DamagerDamaged*) { return true; } }; -struct Left: public Exp +struct GuiCombatLeft: public Exp { static inline bool test(DamagerDamaged* ref, DamagerDamaged* test) { return ref->y == test->y && ref->x > test->x && test->show; } }; -struct Right: public Exp +struct GuiCombatRight: public Exp { static inline bool test(DamagerDamaged* ref, DamagerDamaged* test) { @@ -217,7 +217,7 @@ void GuiCombat::shiftLeft() case ATK: { DamagerDamaged* old = active; - active = closest (attackers, NULL, static_cast (active)); + active = closest (attackers, NULL, static_cast (active)); activeAtk = static_cast (active); if (old != active) { @@ -231,7 +231,7 @@ void GuiCombat::shiftLeft() case BLK: { DamagerDamaged* old = active; - active = closest (activeAtk->blockers, NULL, static_cast (active)); + active = closest (activeAtk->blockers, NULL, static_cast (active)); if (old != active) { if (old) @@ -255,7 +255,7 @@ void GuiCombat::shiftRight( DamagerDamaged* oldActive ) case BLK: { DamagerDamaged* old = active; - active = closest (activeAtk->blockers, NULL, static_cast (active)); + active = closest (activeAtk->blockers, NULL, static_cast (active)); if (old != active) { if (old) @@ -268,7 +268,7 @@ void GuiCombat::shiftRight( DamagerDamaged* oldActive ) case ATK: { DamagerDamaged* old = active; - active = closest (attackers, NULL, static_cast (active)); + active = closest (attackers, NULL, static_cast (active)); if (active == oldActive) { active = activeAtk = NULL; @@ -321,7 +321,7 @@ bool GuiCombat::CheckUserInput(JButton key) // position selected card if (BLK == cursor_pos) { - DamagerDamaged* selectedCard = closest (activeAtk->blockers, NULL, static_cast (x), static_cast (y)); + DamagerDamaged* selectedCard = closest (activeAtk->blockers, NULL, static_cast (x), static_cast (y)); // find the index into the vector where the current selected card is. int c1 = 0, c2 = 0; int i = 0; diff --git a/projects/mtg/src/SimpleMenu.cpp b/projects/mtg/src/SimpleMenu.cpp index 5cf6ec947..3aaa15ad0 100644 --- a/projects/mtg/src/SimpleMenu.cpp +++ b/projects/mtg/src/SimpleMenu.cpp @@ -6,7 +6,7 @@ #include "GameApp.h" #include "Translate.h" -namespace +namespace SimpleMenuConst { const float kPoleWidth = 7; const float kVerticalMargin = 20; @@ -38,7 +38,7 @@ SimpleMenu::SimpleMenu(JGE* jge, WResourceManager* resourceManager, int id, JGui { autoTranslate = true; isMultipleChoice = false; - mHeight = 2 * kVerticalMargin; + mHeight = 2 * SimpleMenuConst::kVerticalMargin; mWidth = 0; mX = x; mY = y; @@ -48,7 +48,7 @@ SimpleMenu::SimpleMenu(JGE* jge, WResourceManager* resourceManager, int id, JGui selectionT = 0; timeOpen = 0; mClosed = false; - selectionTargetY = selectionY = y + kVerticalMargin; + selectionTargetY = selectionY = y + SimpleMenuConst::kVerticalMargin; if(resourceManager) { @@ -61,7 +61,7 @@ SimpleMenu::SimpleMenu(JGE* jge, WResourceManager* resourceManager, int id, JGui spadeL = resourceManager->RetrieveQuad("spade_ul.png", 0, 0, 0, 0, "spade_ul", RETRIEVE_MANAGE); spadeR = resourceManager->RetrieveQuad("spade_ur.png", 0, 0, 0, 0, "spade_ur", RETRIEVE_MANAGE); jewel.reset(NEW JQuad(jewelTex, 1, 1, 3, 3)); - side = resourceManager->RetrieveQuad("menuside.png", 1, 1, 1, kPoleWidth, "menuside", RETRIEVE_MANAGE); + side = resourceManager->RetrieveQuad("menuside.png", 1, 1, 1, SimpleMenuConst::kPoleWidth, "menuside", RETRIEVE_MANAGE); stars = NEW hgeParticleSystem(resourceManager->RetrievePSI("stars.psi", resourceManager->GetQuad("stars").get())); @@ -78,16 +78,16 @@ void SimpleMenu::drawHorzPole(float x, float y, float width) { JRenderer* renderer = JRenderer::GetInstance(); - float leftXOffset = (spadeR->mWidth - kPoleWidth) / 2; + float leftXOffset = (spadeR->mWidth - SimpleMenuConst::kPoleWidth) / 2; float rightXOffset = leftXOffset; float yOffset = leftXOffset; if (spadeR->mWidth != spadeR->mHeight) { //We have a weird case to deal with in the "Classic" theme, the spades graphics need to be aligned specifically, // While the ones in the "Final Saga" theme need to be centered - leftXOffset = kSpadeWidthOffset; - yOffset = kSpadeHeightOffset; - rightXOffset = kSpadeRightBottomOffset; + leftXOffset = SimpleMenuConst::kSpadeWidthOffset; + yOffset = SimpleMenuConst::kSpadeHeightOffset; + rightXOffset = SimpleMenuConst::kSpadeRightBottomOffset; } renderer->RenderQuad(side.get(), x, y, 0, width); @@ -104,23 +104,23 @@ void SimpleMenu::drawVertPole(float x, float y, float height) { JRenderer* renderer = JRenderer::GetInstance(); - float xOffset = (spadeR->mWidth - kPoleWidth) / 2; + float xOffset = (spadeR->mWidth - SimpleMenuConst::kPoleWidth) / 2; float topYOffset = xOffset; float bottomYOffset = xOffset; if (spadeR->mWidth != spadeR->mHeight) { //We have a weird case to deal with in the "Classic" theme, the spades graphics need to be aligned specifically, // While the ones in the "Final Saga" theme need to be centered - xOffset = kSpadeHeightOffset; - topYOffset = kSpadeWidthOffset; - bottomYOffset = kSpadeRightBottomOffset; + xOffset = SimpleMenuConst::kSpadeHeightOffset; + topYOffset = SimpleMenuConst::kSpadeWidthOffset; + bottomYOffset = SimpleMenuConst::kSpadeRightBottomOffset; } - renderer->RenderQuad(side.get(), x + kPoleWidth, y, M_PI / 2, height); + renderer->RenderQuad(side.get(), x + SimpleMenuConst::kPoleWidth, y, M_PI / 2, height); spadeR->SetHFlip(true); spadeL->SetHFlip(false); - renderer->RenderQuad(spadeR.get(), x + kPoleWidth + xOffset, y - topYOffset, M_PI / 2); - renderer->RenderQuad(spadeL.get(), x + kPoleWidth + xOffset, y + height - bottomYOffset, M_PI / 2); + renderer->RenderQuad(spadeR.get(), x + SimpleMenuConst::kPoleWidth + xOffset, y - topYOffset, M_PI / 2); + renderer->RenderQuad(spadeL.get(), x + SimpleMenuConst::kPoleWidth + xOffset, y + height - bottomYOffset, M_PI / 2); renderer->RenderQuad(jewel.get(), x - 1, y - 1); renderer->RenderQuad(jewel.get(), x - 1, y + height - 1); @@ -133,7 +133,7 @@ void SimpleMenu::Render() WFont * mFont = WResourceManager::Instance()->GetWFont(fontId); if (0 == mWidth) { - float sY = mY + kVerticalMargin; + float sY = mY + SimpleMenuConst::kVerticalMargin; for (int i = 0; i < mCount; ++i) { @@ -146,7 +146,7 @@ void SimpleMenu::Render() if ((!title.empty()) && (mWidth < titleFont->GetStringWidth(title.c_str()))) mWidth = titleFont->GetStringWidth(title.c_str()); titleFont->SetScale(scaleFactor); - mWidth += 2 * kHorizontalMargin; + mWidth += 2 * SimpleMenuConst::kHorizontalMargin; if (mCenterHorizontal) mX = (SCREEN_WIDTH_F - mWidth) / 2; @@ -156,7 +156,7 @@ void SimpleMenu::Render() for (int i = 0; i < mCount; ++i) { - float y = mY + kVerticalMargin + i * kLineHeight; + float y = mY + SimpleMenuConst::kVerticalMargin + i * SimpleMenuConst::kLineHeight; SimpleMenuItem * smi = static_cast (mObjects[i]); smi->Relocate(mX + mWidth / 2, y); if (smi->hasFocus()) sY = y; @@ -171,7 +171,7 @@ void SimpleMenu::Render() float height = mHeight; if (timeOpen < 1) height *= timeOpen > 0 ? timeOpen : -timeOpen; - float heightPadding = kLineHeight/2; // this to reduce the bottom padding of the menu + float heightPadding = SimpleMenuConst::kLineHeight/2; // this to reduce the bottom padding of the menu renderer->FillRect(mX, mY, mWidth, height - heightPadding, ARGB(180,0,0,0)); renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); @@ -200,8 +200,8 @@ void SimpleMenu::Render() { if (i > mCount - 1) break; SimpleMenuItem *currentMenuItem = static_cast(mObjects[i]); - float currentY = currentMenuItem->getY() - kLineHeight * startId; - float menuBottomEdge = mY + height - kLineHeight + 7; + float currentY = currentMenuItem->getY() - SimpleMenuConst::kLineHeight * startId; + float menuBottomEdge = mY + height - SimpleMenuConst::kLineHeight + 7; if (currentY < menuBottomEdge) { if (currentMenuItem->hasFocus()) @@ -214,7 +214,7 @@ void SimpleMenu::Render() { mFont->SetColor(ARGB(150,255,255,255)); } - (static_cast (mObjects[i]))->RenderWithOffset(-kLineHeight * startId); + (static_cast (mObjects[i]))->RenderWithOffset(-SimpleMenuConst::kLineHeight * startId); } mFont->SetScale(SCALE_NORMAL); } @@ -244,8 +244,8 @@ bool SimpleMenu::CheckUserInput(JButton key) if (mObjects.size()) { float top, left; - float menuTopEdge = mY + kLineHeight; - float menuBottomEdge = mY + mHeight - (kLineHeight/2); + float menuTopEdge = mY + SimpleMenuConst::kLineHeight; + float menuBottomEdge = mY + mHeight - (SimpleMenuConst::kLineHeight/2); if (y < menuTopEdge) n = (mCurr - 1) > 0 ? mCurr -1 : 0; @@ -257,7 +257,7 @@ bool SimpleMenu::CheckUserInput(JButton key) { if (mObjects[i]->getTopLeft(top, left)) { - if ( (y > top) && (y <= (top + kLineHeight)) ) + if ( (y > top) && (y <= (top + SimpleMenuConst::kLineHeight)) ) n = i; } } @@ -308,8 +308,8 @@ void SimpleMenu::Update(float dt) selectionT += 3 * dt; selectionY += (selectionTargetY - selectionY) * 8 * dt; if(stars) - stars->MoveTo(mX + kHorizontalMargin + ((mWidth - 2 * kHorizontalMargin) * (1 + cos(selectionT)) / 2), selectionY + 5 * cos( - selectionT * 2.35f) + kLineHeight / 2 - kLineHeight * startId); + stars->MoveTo(mX + SimpleMenuConst::kHorizontalMargin + ((mWidth - 2 * SimpleMenuConst::kHorizontalMargin) * (1 + cos(selectionT)) / 2), selectionY + 5 * cos( + selectionT * 2.35f) + SimpleMenuConst::kLineHeight / 2 - SimpleMenuConst::kLineHeight * startId); if (timeOpen < 0) { timeOpen += dt * 10; @@ -330,12 +330,12 @@ void SimpleMenu::Update(float dt) void SimpleMenu::Add(int id, const char * text, string desc, bool forceFocus) { - SimpleMenuItem * smi = NEW SimpleMenuItem(this, id, fontId, text, 0, mY + kVerticalMargin + mCount * kLineHeight, + SimpleMenuItem * smi = NEW SimpleMenuItem(this, id, fontId, text, 0, mY + SimpleMenuConst::kVerticalMargin + mCount * SimpleMenuConst::kLineHeight, (mCount == 0), autoTranslate); smi->setDescription(desc); JGuiController::Add(smi); - if (mCount <= maxItems) mHeight += kLineHeight; + if (mCount <= maxItems) mHeight += SimpleMenuConst::kLineHeight; if (forceFocus) { mObjects[mCurr]->Leaving(JGE_BTN_DOWN); From 0bb211a5817fd4f2c31f202bb6c4568b48f4606b Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 24 Nov 2013 09:18:34 +0100 Subject: [PATCH 40/45] Remove unused global variables from DeckStats.cpp and add proper... member variable initialization. --- projects/mtg/src/DeckStats.cpp | 35 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/projects/mtg/src/DeckStats.cpp b/projects/mtg/src/DeckStats.cpp index c18d66cd3..5cb4c4dff 100644 --- a/projects/mtg/src/DeckStats.cpp +++ b/projects/mtg/src/DeckStats.cpp @@ -271,22 +271,6 @@ void DeckStats::EndInstance() // StatsWrapper - - float noLandsProbInTurn[Constants::STATS_FOR_TURNS] = {0.0f}; - float noCreaturesProbInTurn[Constants::STATS_FOR_TURNS] = {0.0f}; - - int countCardsPerCostAndColor[Constants::STATS_MAX_MANA_COST + 1][Constants::MTG_NB_COLORS + 1] = {{0,0}}; - int countCreaturesPerCostAndColor[Constants::STATS_MAX_MANA_COST + 1][Constants::MTG_NB_COLORS + 1] = {{0,0}}; - int countSpellsPerCostAndColor[Constants::STATS_MAX_MANA_COST + 1][Constants::MTG_NB_COLORS + 1] = {{0,0}}; - - int countCardsPerCost[Constants::STATS_MAX_MANA_COST + 1] = {0}; - int countCreaturesPerCost[Constants::STATS_MAX_MANA_COST + 1] = {0}; - int countSpellsPerCost[Constants::STATS_MAX_MANA_COST + 1] = {0}; - int countLandsPerColor[Constants::MTG_NB_COLORS + 1] = {0}; - int countBasicLandsPerColor[Constants::MTG_NB_COLORS + 1] = {0}; - int countNonLandProducersPerColor[Constants::MTG_NB_COLORS + 1] = {0}; - int totalCostPerColor[Constants::MTG_NB_COLORS + 1] = {0}; - void StatsWrapper::initValues() { // initilize all member values to 0 @@ -301,7 +285,24 @@ void StatsWrapper::initValues() avgManaCost = avgCreatureCost = avgSpellCost = 0.0f; countCreatures = countSpells = countInstants = countEnchantments = countSorceries = countArtifacts = 0; - + + //this works only with 0.0f on floats + memset(noLandsProbInTurn, 0.0f, sizeof(float) * Constants::STATS_FOR_TURNS); + memset(noCreaturesProbInTurn, 0.0f, sizeof(float) * Constants::STATS_FOR_TURNS); + + memset(countCardsPerCost, 0, sizeof(int) * (Constants::STATS_MAX_MANA_COST + 1)); + memset(countCreaturesPerCost, 0, sizeof(int) * (Constants::STATS_MAX_MANA_COST + 1)); + memset(countSpellsPerCost, 0, sizeof(int) * (Constants::STATS_MAX_MANA_COST + 1)); + + memset(countCardsPerCostAndColor, 0, sizeof(int) * (Constants::STATS_MAX_MANA_COST + 1)*(Constants::MTG_NB_COLORS + 1)); + memset(countCreaturesPerCostAndColor, 0, sizeof(int) * (Constants::STATS_MAX_MANA_COST + 1)*(Constants::MTG_NB_COLORS + 1)); + memset(countSpellsPerCostAndColor, 0, sizeof(int) * (Constants::STATS_MAX_MANA_COST + 1)*(Constants::MTG_NB_COLORS + 1)); + + memset(countLandsPerColor, 0, sizeof(int) * (Constants::MTG_NB_COLORS + 1)); + memset(countBasicLandsPerColor, 0, sizeof(int) * (Constants::MTG_NB_COLORS + 1)); + memset(countNonLandProducersPerColor, 0, sizeof(int) * (Constants::MTG_NB_COLORS + 1)); + memset(totalCostPerColor, 0, sizeof(int) * (Constants::MTG_NB_COLORS + 1)); + } StatsWrapper::StatsWrapper(int deckId) From 73f9319b923f5f1f119b368f6b08e181c7cf3e7c Mon Sep 17 00:00:00 2001 From: xawotihs Date: Mon, 25 Nov 2013 05:27:31 +0100 Subject: [PATCH 41/45] Activates Android build from Travis --- .travis.yml | 6 ++++++ travis-script.sh | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2b6cf9e36..2e4b93d3a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,13 @@ before_install: - export PSPDEV="$TRAVIS_BUILD_DIR/opt/pspsdk" - export PSPSDK="$PSPDEV/psp/sdk" - export PATH="$PATH:$PSPDEV/bin:$PSPSDK/bin" + - export ANDROID="android-sdk-linux/tools/android" install: - wget -O sdk.lzma http://sourceforge.net/projects/minpspw/files/SDK%20%2B%20devpak/pspsdk%200.11.2/minpspw_0.11.2-amd64.tar.lzma/download - tar -x --xz -f sdk.lzma + - wget http://dl.google.com/android/ndk/android-ndk-r9-linux-x86_64.tar.bz2 -nv + - wget http://dl.google.com/android/android-sdk_r22-linux.tgz -nv + - tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 + - tar -zxf android-sdk_r22-linux.tgz + - $ANDROID update sdk --filter 1,2,3,8 --no-ui --force > log.txt script: "./travis-script.sh" diff --git a/travis-script.sh b/travis-script.sh index b9461e8a9..6927f0dc8 100755 --- a/travis-script.sh +++ b/travis-script.sh @@ -7,9 +7,15 @@ cd .. cd projects/mtg mkdir objs make -j 8 +cd ../.. + +# we're building an Android binary here +android-ndk-r9/ndk-build -C projects/mtg/Android -j8 +$ANDROID list targets +$ANDROID update project -t 1 -p projects/mtg/Android +ant debug -f projects/mtg/Android/build.xml # let's try an Intel linux binary -cd ../.. qmake projects/mtg/wagic-qt.pro CONFIG+=console CONFIG+=debug DEFINES+=CAPTURE_STDERR make -j 8 From 9889186eab09450ba069f18c6dd8991845930b60 Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Mon, 25 Nov 2013 13:41:29 +0400 Subject: [PATCH 42/45] Added missing "echo" statement --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2e4b93d3a..5fee256d5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,5 +11,5 @@ install: - wget http://dl.google.com/android/android-sdk_r22-linux.tgz -nv - tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 - tar -zxf android-sdk_r22-linux.tgz - - $ANDROID update sdk --filter 1,2,3,8 --no-ui --force > log.txt + - echo yes | $ANDROID update sdk --filter 1,2,3,8 --no-ui --force > log.txt script: "./travis-script.sh" From fac44c4b48361b8f63f21e8fcb8f3dfa57d41106 Mon Sep 17 00:00:00 2001 From: Rolzad73 Date: Mon, 25 Nov 2013 11:53:34 -0500 Subject: [PATCH 43/45] - updated AndroidManifest.xml to match desired API values. - removed CardEffect.cpp reference from Android.mk build file. - added sdk.buildtools=18.1.1 line to default.properties and project.properties - updated .gitignore --- projects/mtg/Android/.gitignore | 1 + projects/mtg/Android/AndroidManifest.xml | 2 +- projects/mtg/Android/default.properties | 4 ++++ projects/mtg/Android/jni/Android.mk | 1 - projects/mtg/Android/project.properties | 4 ++++ 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/projects/mtg/Android/.gitignore b/projects/mtg/Android/.gitignore index b2b2f4c62..5a9b113aa 100644 --- a/projects/mtg/Android/.gitignore +++ b/projects/mtg/Android/.gitignore @@ -1,2 +1,3 @@ /gen +/bin diff --git a/projects/mtg/Android/AndroidManifest.xml b/projects/mtg/Android/AndroidManifest.xml index 0ed014758..8fd0e2815 100644 --- a/projects/mtg/Android/AndroidManifest.xml +++ b/projects/mtg/Android/AndroidManifest.xml @@ -14,5 +14,5 @@ - + diff --git a/projects/mtg/Android/default.properties b/projects/mtg/Android/default.properties index 8010039f3..3f05ff78e 100644 --- a/projects/mtg/Android/default.properties +++ b/projects/mtg/Android/default.properties @@ -9,3 +9,7 @@ # Project target. target=android-10 + +# Project build tools version +sdk.buildtools=18.1.1 + diff --git a/projects/mtg/Android/jni/Android.mk b/projects/mtg/Android/jni/Android.mk index da01c8a6d..faa1067b3 100644 --- a/projects/mtg/Android/jni/Android.mk +++ b/projects/mtg/Android/jni/Android.mk @@ -41,7 +41,6 @@ LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.cpp \ $(MTG_PATH)/src/AllAbilities.cpp \ $(MTG_PATH)/src/CardDescriptor.cpp \ $(MTG_PATH)/src/CardDisplay.cpp \ - $(MTG_PATH)/src/CardEffect.cpp \ $(MTG_PATH)/src/CardGui.cpp \ $(MTG_PATH)/src/CardPrimitive.cpp \ $(MTG_PATH)/src/CardSelector.cpp \ diff --git a/projects/mtg/Android/project.properties b/projects/mtg/Android/project.properties index b7c2081d5..15f4d07e4 100644 --- a/projects/mtg/Android/project.properties +++ b/projects/mtg/Android/project.properties @@ -12,3 +12,7 @@ # Project target. target=android-10 + +# Build tools version +sdk.buildtools=18.1.1 + From 8aa0b8cea0aba2622ba1ef8c73a698071295b5ee Mon Sep 17 00:00:00 2001 From: Rolzad73 Date: Mon, 25 Nov 2013 13:41:07 -0500 Subject: [PATCH 44/45] reverting sdk.buildtools change --- projects/mtg/Android/default.properties | 4 ---- projects/mtg/Android/project.properties | 4 ---- 2 files changed, 8 deletions(-) diff --git a/projects/mtg/Android/default.properties b/projects/mtg/Android/default.properties index 3f05ff78e..8010039f3 100644 --- a/projects/mtg/Android/default.properties +++ b/projects/mtg/Android/default.properties @@ -9,7 +9,3 @@ # Project target. target=android-10 - -# Project build tools version -sdk.buildtools=18.1.1 - diff --git a/projects/mtg/Android/project.properties b/projects/mtg/Android/project.properties index 15f4d07e4..b7c2081d5 100644 --- a/projects/mtg/Android/project.properties +++ b/projects/mtg/Android/project.properties @@ -12,7 +12,3 @@ # Project target. target=android-10 - -# Build tools version -sdk.buildtools=18.1.1 - From 47685f4892d3411966a09f53e86999f887c56179 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Mon, 25 Nov 2013 22:42:09 +0100 Subject: [PATCH 45/45] Added installation of 32 bits libs to make Android SDK work. --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 5fee256d5..9430365de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,8 @@ before_install: - export PATH="$PATH:$PSPDEV/bin:$PSPSDK/bin" - export ANDROID="android-sdk-linux/tools/android" install: + - sudo apt-get update -qq + - if [ `uname -m` = x86_64 ]; then sudo apt-get install -qq --force-yes libgd2-xpm ia32-libs ia32-libs-multiarch; fi - wget -O sdk.lzma http://sourceforge.net/projects/minpspw/files/SDK%20%2B%20devpak/pspsdk%200.11.2/minpspw_0.11.2-amd64.tar.lzma/download - tar -x --xz -f sdk.lzma - wget http://dl.google.com/android/ndk/android-ndk-r9-linux-x86_64.tar.bz2 -nv